pax_global_header00006660000000000000000000000064141635314740014522gustar00rootroot0000000000000052 comment=e81f0a5921cf20b9ed2c979cf4117edaa98ade3c vokoscreenNG-3.1.0/000077500000000000000000000000001416353147400141265ustar00rootroot00000000000000vokoscreenNG-3.1.0/.gitignore000066400000000000000000000004751416353147400161240ustar00rootroot00000000000000# 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 moc_*.h qrc_*.cpp Makefile *build* ui_*.h *.qm # Linux/Unixes .* !.tx !.gitignore *~ vokoscreenNG-3.1.0/.tx/000077500000000000000000000000001416353147400146375ustar00rootroot00000000000000vokoscreenNG-3.1.0/.tx/config000066400000000000000000000005051416353147400160270ustar00rootroot00000000000000[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.1.0/CHANGELOG.md000066400000000000000000000001331416353147400157340ustar00rootroot00000000000000 The changelog found here: https://linuxecke.volkoh.de/vokoscreen/vokoscreen-changes.html vokoscreenNG-3.1.0/COPYING000066400000000000000000000431001416353147400151570ustar00rootroot00000000000000 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.1.0/INSTALL000066400000000000000000000000161416353147400151540ustar00rootroot00000000000000See README.md vokoscreenNG-3.1.0/README.md000066400000000000000000000136341416353147400154140ustar00rootroot00000000000000# vokoscreenNG (New Generation) * For **Windows** and **Linux(X11, Experimental Wayland support since 3.1.0 pre alpha)** * vokoscreenNG is based of Qt and GStreamer. ## Download * Windows https://linuxecke.volkoh.de/vokoscreen/vokoscreen-download.html ## 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/ ## Installer Windows and Linux installation routines are not provided, because each platform, installer and package manager has its own special features. That means make-install, metadata, desktop files, icons, manpage, logo must be create and provided itself. All the images and logos that come with vokoscreenNG are free. You can be change in size itself be used for your own installer or package manager. ## Code Contributions If you want to contribute code, please ask beforehand whether your idea finds harmony. 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 64-bit ### BuildRequires - Required from version 3.1.0 The Qt installer needs the 32 bit version of vc_redist.x86.exe https://aka.ms/vs/16/release/vc_redist.x86.exe Qt Online Installer https://www.qt.io/download-thank-you?os=windows - Qt 5.15.2 [+] MinGW 8.1.0 64-bit [+] Qt Network Authorization (Not sure if this is needed) - Developer and Designer Tools [+] Qt Creator 5.0.1 CDB Debugger Support [+] Debugging Tools for Windows [+] MinGW 8.1.0 64-bit - openSSL 1.1.1 Toolkit [+] openssl 64-bit binaries https://gstreamer.freedesktop.org/data/pkg/windows/1.18.5/mingw/gstreamer-1.0-mingw-x86_64-1.18.5.msi https://gstreamer.freedesktop.org/data/pkg/windows/1.18.5/mingw/gstreamer-1.0-devel-mingw-x86_64-1.18.5.msi ### Environment * No additional entries ## Windows 10 32-bit ### Requirements * The integrated vokoscreenNG Player needs a codec pack. ### BuildRequires * Required from version 3.0.5 to 3.0.9 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.16.1/gstreamer-1.0-devel-mingw-x86-1.16.1.msi https://gstreamer.freedesktop.org/pkg/windows/1.16.1/gstreamer-1.0-mingw-x86-1.16.1.msi * Required from version 3.0.0 to 3.0.4 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_64-1.14.4.msi https://gstreamer.freedesktop.org/pkg/windows/1.14.4/gstreamer-1.0-devel-x86_64-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 ### Run-time requirements * Qt5 >= 5.9.4 * Qt5 >= 5.14 (vokoscreenNG >= 3.1.0 pre alpha) * pulseaudio * libwayland-client0 (since vokoscreenNG 3.0.9) * gstreamer >= 1.12.5 * gstreamer-plugins-base - Audio: vorbis, opus * gstreamer-plugins-good - Format: mkv, avi, webm, mp4, mov - Video: vp8 - Audio: flac * gstreamer-plugins-bad - Video: camera - Audio: **AAC only supported in vokoscreenNG 3.0.5 - 3.0.8** * gstreamer-plugins-bad-orig-addon (openSUSE Packman) - Video: openh264 * gstreamer-plugins-ugly - Video: x264 - Audio: mp3 * gstreamer-plugins-ugly-orig-addon (openSUSE Packman) - Video: x264 * gstreamer-plugins-libav - Player: x264 * #### Wayland (vokoscreenNG >= 3.1.0) * pipewire >= 0.3 * gstreamer-plugin-pipewire(openSUSE) gstreamer1.0-pipewire(Debian) >= 0.3.24 * xdg-desktop-portal >= 1.7.0 * xdg-desktop-portal-(kde, gtk, ...) >= 1.7.0 #### VAAPI only supported in vokoscreenNG 3.0.0 - 3.0.8 * gstreamer-plugins-vaapi - Intel Hardwareenconding H.264 and MPEG2 * intel-vaapi-driver - Intel Hardwareenconding H.264 and MPEG2 * ### Build requirements * pkgconfig * libqt5-devel >= 5.14 (vokoscreenNG >= 3.1.0 pre alpha) * libqt5-linguist >= 5.14 (vokoscreenNG >= 3.1.0 pre alpha) * libX11-devel * gstreamer-devel * libpulse-devel (vokoscreenNG >= 3.0.7) * wayland-devel (vokoscreenNG >= 3.0.9) On Ubuntu these requirements can be satisfied by running `sudo apt install libgstreamer1.0-dev qt5-default qttools5-dev-tools libqt5x11extras5-dev qtmultimedia5-dev libqt5multimedia5-plugins libpulse-dev` ### Build instructions 1. Download the source / clone the repo and `cd` into its directory 2. `cd src` 3. `qmake` 4. `make` ## Install packages * [Debian](https://tracker.debian.org/pkg/vokoscreen-ng): `sudo apt install vokoscreen-ng` * [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` * [Ubuntu](https://launchpad.net/ubuntu/+source/vokoscreen-ng): `sudo apt install vokoscreen-ng` * [Arch linux](https://www.archlinux.org/packages/community/x86_64/vokoscreen/): `sudo pacman -S vokoscreen` * [NixOS](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/video/vokoscreen-ng/default.nix): `nix-env -iA nixos.vokoscreen-ng` ![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.1.0/Third-Party-License/000077500000000000000000000000001416353147400176555ustar00rootroot00000000000000vokoscreenNG-3.1.0/Third-Party-License/LGPL-2.1000066400000000000000000000636421416353147400206470ustar00rootroot00000000000000 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.1.0/Third-Party-License/LGPL-3.0000066400000000000000000000167271416353147400206510ustar00rootroot00000000000000 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.1.0/Third-Party-License/MIT-License000066400000000000000000000020511416353147400216070ustar00rootroot00000000000000Copyright (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.1.0/Third-Party-License/Third-Party-License000066400000000000000000000012141416353147400233250ustar00rootroot000000000000003rd 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/ QGlobalShortcut: Licence --> LGPL File --> LGPL URL --> https://github.com/Legotckoi/QGlobalShortcut Icons: Licence --> Public Domain URL --> http://tango.freedesktop.org PulseAudio: Licence --> LGPL File --> LGPL URL --> https://www.freedesktop.org/wiki/Software/PulseAudio/ Wayland: Licence --> "Expat" Mit File --> Wayland-licence URL --> https://gitlab.freedesktop.org/wayland/wayland vokoscreenNG-3.1.0/Third-Party-License/Wayland-licence000066400000000000000000000025011416353147400225750ustar00rootroot00000000000000Copyright © 2008-2012 Kristian Høgsberg Copyright © 2010-2012 Intel Corporation Copyright © 2011 Benjamin Franzke Copyright © 2012 Collabora, Ltd. 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 (including the next paragraph) 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. --- The above is the version of the MIT "Expat" License used by X.org: http://cgit.freedesktop.org/xorg/xserver/tree/COPYING vokoscreenNG-3.1.0/ToDo.txt000066400000000000000000000000001416353147400155220ustar00rootroot00000000000000vokoscreenNG-3.1.0/place-to-keep/000077500000000000000000000000001416353147400165545ustar00rootroot00000000000000vokoscreenNG-3.1.0/place-to-keep/Graphic-processing.txt000066400000000000000000000002031416353147400230370ustar00rootroot00000000000000 1. export GST_DEBUG_DUMP_DOT_DIR=. 2. gst-launch-1.0 pipeline 3. dot -Grankdir=BTRL -Tpdf *.PLAYING_PAUSED.dot > pipeline.pdf vokoscreenNG-3.1.0/place-to-keep/Testing-language.txt000066400000000000000000000003541416353147400225150ustar00rootroot00000000000000 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.1.0/place-to-keep/Videos-to-test-the-player/000077500000000000000000000000001416353147400234525ustar00rootroot00000000000000vokoscreenNG-3.1.0/place-to-keep/Videos-to-test-the-player/scaled-450x800-to-1280x720.mkv000066400000000000000000006361311416353147400300150ustar00rootroot00000000000000Eߣ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 #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.1.0/place-to-keep/hardware-acceleration.txt000066400000000000000000000001001416353147400235300ustar00rootroot00000000000000 vaapih264enc --> linux only msdkh264enc --> linux and windows vokoscreenNG-3.1.0/place-to-keep/lineCounter.sh000077500000000000000000000005501416353147400214020ustar00rootroot00000000000000#!/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.1.0/place-to-keep/statistik.sh000077500000000000000000000010021416353147400211230ustar00rootroot00000000000000#!/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.1.0/preparing.sh000077500000000000000000000066571416353147400164720ustar00rootroot00000000000000#!/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 completed 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 ####### # Sound ####### array=""$( find ./sound/* -name *.wav | cut -c 3- )"" echo $array | sed "s/ /<\/file>\n/g" >> screencast.qrc ############################### # cisco openh264 binary license ############################### array=""$( find ./ciscoOpenh264/* -name *.txt | cut -c 3- )"" echo $array | sed "s/ /<\/file>\n/g" >> screencast.qrc ############################### # spezialCheckBox ############################### array=""$( find ./spezialCheckBox/* -name *.png | cut -c 3- )"" echo $array | sed "s/ /<\/file>\n/g" >> screencast.qrc array=""$( find ./spezialCheckBox/* -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.1.0/src/000077500000000000000000000000001416353147400147155ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/QGlobalShortcut/000077500000000000000000000000001416353147400177725ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/QGlobalShortcut/AUTHORS000066400000000000000000000000331416353147400210360ustar00rootroot00000000000000Authors: Evgenii Legotckoi vokoscreenNG-3.1.0/src/QGlobalShortcut/LICENSE000066400000000000000000000635351416353147400210130ustar00rootroot00000000000000 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.1.0/src/QGlobalShortcut/README.md000066400000000000000000000004711416353147400212530ustar00rootroot00000000000000# 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.1.0/src/QGlobalShortcut/qglobalshortcut.h000066400000000000000000000014031416353147400233560ustar00rootroot00000000000000#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.1.0/src/QGlobalShortcut/qglobalshortcut.pri000066400000000000000000000005501416353147400237230ustar00rootroot00000000000000 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.1.0/src/QGlobalShortcut/win/000077500000000000000000000000001416353147400205675ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/QGlobalShortcut/win/qglobalshortcut.cpp000066400000000000000000000124501416353147400245120ustar00rootroot00000000000000#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.1.0/src/QGlobalShortcut/x11/000077500000000000000000000000001416353147400204035ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/QGlobalShortcut/x11/qglobalshortcut.cpp000066400000000000000000000146361416353147400243360ustar00rootroot00000000000000#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.1.0/src/QvkGlobalShortcut/000077500000000000000000000000001416353147400203335ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/QvkGlobalShortcut/QvkGlobalShortcut.cpp000066400000000000000000000725511416353147400244670ustar00rootroot00000000000000/* 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 "global.h" #include #include #include QvkGlobalShortcut::QvkGlobalShortcut(QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow ) { Q_UNUSED(mainWindow); ui = ui_mainwindow; shortcutStart = new QGlobalShortcut( this ); connect( shortcutStart, SIGNAL( activated() ), this, SLOT( slot_startStop() ) ); connect( ui->checkBox_shortcut_start_strg, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_start_clicked( bool ) ) ); connect( ui->checkBox_shortcut_start_shift, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_start_clicked( bool ) ) ); connect( ui->checkBox_shortcut_start_alt, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_start_clicked( bool ) ) ); connect( ui->checkBox_shortcut_start_meta, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_start_clicked( bool ) ) ); connect( ui->comboBox_shortcut_start, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_checkbox_shortcut_start_currentIndexChanged( int ) ) ); connect( ui->toolButton_shortcut_reset_start, SIGNAL( clicked() ), this, SLOT( slot_toolButton_shortcut_start_reset() ) ); shortcutPause = new QGlobalShortcut( this ); connect( shortcutPause, SIGNAL( activated() ), this, SLOT( slot_pauseContinue() ) ); connect( ui->checkBox_shortcut_pause_strg, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_pause_clicked( bool ) ) ); connect( ui->checkBox_shortcut_pause_shift, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_pause_clicked( bool ) ) ); connect( ui->checkBox_shortcut_pause_alt, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_pause_clicked( bool ) ) ); connect( ui->checkBox_shortcut_pause_meta, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_pause_clicked( bool ) ) ); connect( ui->comboBox_shortcut_pause, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_checkbox_shortcut_pause_currentIndexChanged( int ) ) ); connect( ui->toolButton_shortcut_reset_pause, SIGNAL( clicked() ), this, SLOT( slot_toolButton_shortcut_pause_reset() ) ); shortcutMagnification = new QGlobalShortcut( this ); connect( shortcutMagnification, SIGNAL( activated() ), ui->checkBoxMagnifier, SLOT( click() ) ); connect( ui->checkBox_shortcut_magnification_strg, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_magnification_clicked( bool ) ) ); connect( ui->checkBox_shortcut_magnification_shift, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_magnification_clicked( bool ) ) ); connect( ui->checkBox_shortcut_magnification_alt, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_magnification_clicked( bool ) ) ); connect( ui->checkBox_shortcut_magnification_meta, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_magnification_clicked( bool ) ) ); connect( ui->comboBox_shortcut_magnification, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_checkbox_shortcut_magnification_currentIndexChanged( int ) ) ); connect( ui->toolButton_shortcut_reset_magnification, SIGNAL( clicked() ), this, SLOT( slot_toolButton_shortcut_magnification_reset() ) ); shortcutCamera = new QGlobalShortcut( this ); connect( shortcutCamera, SIGNAL( activated() ), ui->checkBoxCameraOnOff, SLOT( click() ) ); connect( ui->checkBox_shortcut_camera_strg, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_camera_clicked( bool ) ) ); connect( ui->checkBox_shortcut_camera_shift, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_camera_clicked( bool ) ) ); connect( ui->checkBox_shortcut_camera_alt, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_camera_clicked( bool ) ) ); connect( ui->checkBox_shortcut_camera_meta, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_camera_clicked( bool ) ) ); connect( ui->comboBox_shortcut_camera, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_checkbox_shortcut_camera_currentIndexChanged( int ) ) ); connect( ui->toolButton_shortcut_reset_camera, SIGNAL( clicked() ), this, SLOT( slot_toolButton_shortcut_camera_reset() ) ); QList listSpezialCheckboxShowclick = ui->centralWidget->findChildren(); for ( int i = 0; i < listSpezialCheckboxShowclick.count(); i++ ){ if ( listSpezialCheckboxShowclick.at(i)->objectName() == "spezialCheckboxShowclick" ){ spezialCheckboxShowclick = listSpezialCheckboxShowclick.at(i); } } shortcutShowclick = new QGlobalShortcut( this ); connect( shortcutShowclick, SIGNAL( activated() ), spezialCheckboxShowclick, SLOT( slot_click() ) ); connect( ui->checkBox_shortcut_showclick_strg, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_showclick_clicked( bool ) ) ); connect( ui->checkBox_shortcut_showclick_shift, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_showclick_clicked( bool ) ) ); connect( ui->checkBox_shortcut_showclick_alt, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_showclick_clicked( bool ) ) ); connect( ui->checkBox_shortcut_showclick_meta, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_showclick_clicked( bool ) ) ); connect( ui->comboBox_shortcut_showclick, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_checkbox_shortcut_showclick_currentIndexChanged( int ) ) ); connect( ui->toolButton_shortcut_reset_showclick, SIGNAL( clicked() ), this, SLOT( slot_toolButton_shortcut_showclick_reset() ) ); QList listSpezialCheckboxHalo = ui->centralWidget->findChildren(); for ( int i = 0; i < listSpezialCheckboxHalo.count(); i++ ){ if ( listSpezialCheckboxHalo.at(i)->objectName() == "spezialCheckboxHalo" ){ spezialCheckboxHalo = listSpezialCheckboxHalo.at(i); } } shortcutHalo = new QGlobalShortcut( this ); connect( shortcutHalo, SIGNAL( activated() ), spezialCheckboxHalo, SLOT( slot_click() ) ); connect( ui->checkBox_shortcut_halo_strg, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_halo_clicked( bool ) ) ); connect( ui->checkBox_shortcut_halo_shift, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_halo_clicked( bool ) ) ); connect( ui->checkBox_shortcut_halo_alt, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_halo_clicked( bool ) ) ); connect( ui->checkBox_shortcut_halo_meta, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkbox_shortcut_halo_clicked( bool ) ) ); connect( ui->comboBox_shortcut_halo, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_checkbox_shortcut_halo_currentIndexChanged( int ) ) ); connect( ui->toolButton_shortcut_reset_halo, SIGNAL( clicked() ), this, SLOT( slot_toolButton_shortcut_halo_reset() ) ); connect( ui->checkBoxStartTime, SIGNAL( clicked( bool ) ), this, SLOT( slot_setOrUnsetShortcut( bool ) ) ); } QvkGlobalShortcut::~QvkGlobalShortcut() { } QString QvkGlobalShortcut::boolToString( bool bo ) { int i = QVariant( bo ).toUInt(); return QString::number( i ); } bool QvkGlobalShortcut::isBusy( QString check ) { // Beispiel: // 1010F QString start;; QString pause; QString magnification; QString camera; QString showclick; QString halo; start.append( boolToString( ui->checkBox_shortcut_start_strg->isChecked() ) ); start.append( boolToString( ui->checkBox_shortcut_start_shift->isChecked() ) ); start.append( boolToString( ui->checkBox_shortcut_start_alt->isChecked() ) ); start.append( boolToString( ui->checkBox_shortcut_start_meta->isChecked() ) ); start.append( ui->comboBox_shortcut_start->currentText() ); pause.append( boolToString( ui->checkBox_shortcut_pause_strg->isChecked() ) ); pause.append( boolToString( ui->checkBox_shortcut_pause_shift->isChecked() ) ); pause.append( boolToString( ui->checkBox_shortcut_pause_alt->isChecked() ) ); pause.append( boolToString( ui->checkBox_shortcut_pause_meta->isChecked() ) ); pause.append( ui->comboBox_shortcut_pause->currentText() ); magnification.append( boolToString( ui->checkBox_shortcut_magnification_strg->isChecked() ) ); magnification.append( boolToString( ui->checkBox_shortcut_magnification_shift->isChecked() ) ); magnification.append( boolToString( ui->checkBox_shortcut_magnification_alt->isChecked() ) ); magnification.append( boolToString( ui->checkBox_shortcut_magnification_meta->isChecked() ) ); magnification.append( ui->comboBox_shortcut_magnification->currentText() ); camera.append( boolToString( ui->checkBox_shortcut_camera_strg->isChecked() ) ); camera.append( boolToString( ui->checkBox_shortcut_camera_shift->isChecked() ) ); camera.append( boolToString( ui->checkBox_shortcut_camera_alt->isChecked() ) ); camera.append( boolToString( ui->checkBox_shortcut_camera_meta->isChecked() ) ); camera.append( ui->comboBox_shortcut_camera->currentText() ); showclick.append( boolToString( ui->checkBox_shortcut_showclick_strg->isChecked() ) ); showclick.append( boolToString( ui->checkBox_shortcut_showclick_shift->isChecked() ) ); showclick.append( boolToString( ui->checkBox_shortcut_showclick_alt->isChecked() ) ); showclick.append( boolToString( ui->checkBox_shortcut_showclick_meta->isChecked() ) ); showclick.append( ui->comboBox_shortcut_showclick->currentText() ); halo.append( boolToString( ui->checkBox_shortcut_halo_strg->isChecked() ) ); halo.append( boolToString( ui->checkBox_shortcut_halo_shift->isChecked() ) ); halo.append( boolToString( ui->checkBox_shortcut_halo_alt->isChecked() ) ); halo.append( boolToString( ui->checkBox_shortcut_halo_meta->isChecked() ) ); halo.append( ui->comboBox_shortcut_halo->currentText() ); if ( check == "start" ) { if ( ( start == pause ) or ( start == magnification ) or ( start == camera ) or ( start == showclick ) or ( start == halo ) ) return true; } if ( check == "pause" ) { if ( ( pause == start ) or ( pause == magnification) or ( pause == camera ) or ( pause == showclick ) or ( pause == halo ) ) return true; } if ( check == "magnification" ) { if ( ( magnification == start ) or ( magnification == pause ) or ( magnification == camera ) or ( magnification == showclick ) or ( magnification == halo ) ) return true; } if ( check == "camera" ) { if ( ( camera == start ) or ( camera == pause ) or ( camera == magnification ) or ( camera == showclick ) or ( camera == halo ) ) return true; } if ( check == "showclick" ) { if ( ( showclick == start ) or ( showclick == pause ) or ( showclick == magnification ) or ( showclick == camera ) or ( showclick == halo ) ) return true; } if ( check == "halo" ) { if ( ( halo == start ) or ( halo == pause ) or ( halo == magnification ) or ( halo == camera ) or ( halo == showclick ) ) return true; } return false; } // Start void QvkGlobalShortcut::slot_checkbox_shortcut_start_clicked( bool value ) { Q_UNUSED(value) if ( ( ui->checkBox_shortcut_start_strg->isChecked() | ui->checkBox_shortcut_start_shift->isChecked() | ui->checkBox_shortcut_start_alt->isChecked() | ui->checkBox_shortcut_start_meta->isChecked() ) and !isBusy( "start" ) ) { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_start->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On ) ); QString shortcut; if ( ui->checkBox_shortcut_start_strg->isChecked() ) { shortcut.append( "+STRG" ); } if ( ui->checkBox_shortcut_start_shift->isChecked() ) { shortcut.append( "+SHIFT" ); } if ( ui->checkBox_shortcut_start_alt->isChecked() ) { shortcut.append( "+ALT" ); } if ( ui->checkBox_shortcut_start_meta->isChecked() ) { shortcut.append( "+META" ); } shortcut.append( "+" + ui->comboBox_shortcut_start->currentText() ); if ( shortcut.startsWith( "+" ) == true ) { shortcut.remove( 0, 1 ); } shortcutStart->unsetShortcut(); shortcutStart->setShortcut( QKeySequence( shortcut ) ); ui->pushButtonStart->setToolTip( shortcut ); ui->pushButtonStop->setToolTip( shortcut ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Start:" << shortcut; } else { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_start->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); shortcutStart->unsetShortcut(); ui->pushButtonStart->setToolTip( "None" ); ui->pushButtonStop->setToolTip( "None" ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Start: None"; } } void QvkGlobalShortcut::slot_checkbox_shortcut_start_currentIndexChanged( int value ) { Q_UNUSED(value) slot_checkbox_shortcut_start_clicked( true ); } // Pause void QvkGlobalShortcut::slot_checkbox_shortcut_pause_clicked( bool value ) { Q_UNUSED(value) if ( ( ui->checkBox_shortcut_pause_strg->isChecked() | ui->checkBox_shortcut_pause_shift->isChecked() | ui->checkBox_shortcut_pause_alt->isChecked() | ui->checkBox_shortcut_pause_meta->isChecked() ) and !isBusy( "pause" ) ) { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_pause->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); QString shortcut; if ( ui->checkBox_shortcut_pause_strg->isChecked() ) { shortcut.append( "+STRG" ); } if ( ui->checkBox_shortcut_pause_shift->isChecked() ) { shortcut.append( "+SHIFT" ); } if ( ui->checkBox_shortcut_pause_alt->isChecked() ) { shortcut.append( "+ALT" ); } if ( ui->checkBox_shortcut_pause_meta->isChecked() ) { shortcut.append( "+META" ); } shortcut.append( "+" + ui->comboBox_shortcut_pause->currentText() ); if ( shortcut.startsWith( "+" ) == true ) { shortcut.remove( 0, 1 ); } shortcutPause->unsetShortcut(); shortcutPause->setShortcut( QKeySequence( shortcut ) ); ui->pushButtonPause->setToolTip( shortcut ); ui->pushButtonContinue->setToolTip( shortcut ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Pause:" << shortcut; } else { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_pause->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); shortcutPause->unsetShortcut(); ui->pushButtonPause->setToolTip( "None" ); ui->pushButtonContinue->setToolTip( "None" ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Pause: None"; } } void QvkGlobalShortcut::slot_checkbox_shortcut_pause_currentIndexChanged( int value ) { Q_UNUSED(value) slot_checkbox_shortcut_pause_clicked( true ); } // Magnifier void QvkGlobalShortcut::slot_checkbox_shortcut_magnification_clicked( bool value ) { Q_UNUSED(value) if ( ( ui->checkBox_shortcut_magnification_strg->isChecked() | ui->checkBox_shortcut_magnification_shift->isChecked() | ui->checkBox_shortcut_magnification_alt->isChecked() | ui->checkBox_shortcut_magnification_meta->isChecked() ) and !isBusy( "magnification" ) ) { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_magnification->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); QString shortcut; if ( ui->checkBox_shortcut_magnification_strg->isChecked() ) { shortcut.append( "+STRG" ); } if ( ui->checkBox_shortcut_magnification_shift->isChecked() ) { shortcut.append( "+SHIFT" ); } if ( ui->checkBox_shortcut_magnification_alt->isChecked() ) { shortcut.append( "+ALT" ); } if ( ui->checkBox_shortcut_magnification_meta->isChecked() ) { shortcut.append( "+META" ); } shortcut.append( "+" + ui->comboBox_shortcut_magnification->currentText() ); if ( shortcut.startsWith( "+" ) == true ) { shortcut.remove( 0, 1 ); } shortcutMagnification->unsetShortcut(); shortcutMagnification->setShortcut( QKeySequence( shortcut ) ); ui->checkBoxMagnifier->setToolTip( shortcut ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Magnification:" << shortcut; } else { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_magnification->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); shortcutMagnification->unsetShortcut(); ui->checkBoxMagnifier->setToolTip( "None" ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Magnification: None"; } } void QvkGlobalShortcut::slot_checkbox_shortcut_magnification_currentIndexChanged( int value ) { Q_UNUSED(value) slot_checkbox_shortcut_magnification_clicked( true ); } // Camera void QvkGlobalShortcut::slot_checkbox_shortcut_camera_clicked( bool value ) { Q_UNUSED(value) if ( ( ui->checkBox_shortcut_camera_strg->isChecked() | ui->checkBox_shortcut_camera_shift->isChecked() | ui->checkBox_shortcut_camera_alt->isChecked() | ui->checkBox_shortcut_camera_meta->isChecked() ) and !isBusy( "camera" ) ) { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_camera->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); QString shortcut; if ( ui->checkBox_shortcut_camera_strg->isChecked() ) { shortcut.append( "+STRG" ); } if ( ui->checkBox_shortcut_camera_shift->isChecked() ) { shortcut.append( "+SHIFT" ); } if ( ui->checkBox_shortcut_camera_alt->isChecked() ) { shortcut.append( "+ALT" ); } if ( ui->checkBox_shortcut_camera_meta->isChecked() ) { shortcut.append( "+META" ); } shortcut.append( "+" + ui->comboBox_shortcut_camera->currentText() ); if ( shortcut.startsWith( "+" ) == true ) { shortcut.remove( 0, 1 ); } shortcutCamera->unsetShortcut(); shortcutCamera->setShortcut( QKeySequence( shortcut ) ); ui->checkBoxCameraOnOff->setToolTip( shortcut ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Camera:" << shortcut; } else { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_camera->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); shortcutCamera->unsetShortcut(); ui->checkBoxCameraOnOff->setToolTip( "None" ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Camera: None"; } } void QvkGlobalShortcut::slot_checkbox_shortcut_camera_currentIndexChanged( int value ) { Q_UNUSED(value) slot_checkbox_shortcut_camera_clicked( true ); } // Showclick void QvkGlobalShortcut::slot_checkbox_shortcut_showclick_clicked( bool value ) { Q_UNUSED(value) if ( ( ui->checkBox_shortcut_showclick_strg->isChecked() | ui->checkBox_shortcut_showclick_shift->isChecked() | ui->checkBox_shortcut_showclick_alt->isChecked() | ui->checkBox_shortcut_showclick_meta->isChecked() ) and !isBusy( "showclick" ) ) { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_showclick->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); QString shortcut; if ( ui->checkBox_shortcut_showclick_strg->isChecked() ) { shortcut.append( "+STRG" ); } if ( ui->checkBox_shortcut_showclick_shift->isChecked() ) { shortcut.append( "+SHIFT" ); } if ( ui->checkBox_shortcut_showclick_alt->isChecked() ) { shortcut.append( "+ALT" ); } if ( ui->checkBox_shortcut_showclick_meta->isChecked() ) { shortcut.append( "+META" ); } shortcut.append( "+" + ui->comboBox_shortcut_showclick->currentText() ); if ( shortcut.startsWith( "+" ) == true ) { shortcut.remove( 0, 1 ); } shortcutShowclick->unsetShortcut(); shortcutShowclick->setShortcut( QKeySequence( shortcut ) ); spezialCheckboxShowclick->setToolTip( shortcut ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Showclick:" << shortcut; } else { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_showclick->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); shortcutShowclick->unsetShortcut(); spezialCheckboxShowclick->setToolTip( "None" ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Showclick: None"; } } void QvkGlobalShortcut::slot_checkbox_shortcut_showclick_currentIndexChanged( int value ) { Q_UNUSED(value) slot_checkbox_shortcut_showclick_clicked( true ); } // Halo void QvkGlobalShortcut::slot_checkbox_shortcut_halo_clicked( bool value ) { Q_UNUSED(value) if ( ( ui->checkBox_shortcut_halo_strg->isChecked() | ui->checkBox_shortcut_halo_shift->isChecked() | ui->checkBox_shortcut_halo_alt->isChecked() | ui->checkBox_shortcut_halo_meta->isChecked() ) and !isBusy( "halo" ) ) { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_halo->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); QString shortcut; if ( ui->checkBox_shortcut_halo_strg->isChecked() ) { shortcut.append( "+STRG" ); } if ( ui->checkBox_shortcut_halo_shift->isChecked() ) { shortcut.append( "+SHIFT" ); } if ( ui->checkBox_shortcut_halo_alt->isChecked() ) { shortcut.append( "+ALT" ); } if ( ui->checkBox_shortcut_halo_meta->isChecked() ) { shortcut.append( "+META" ); } shortcut.append( "+" + ui->comboBox_shortcut_halo->currentText() ); if ( shortcut.startsWith( "+" ) == true ) { shortcut.remove( 0, 1 ); } shortcutHalo->unsetShortcut(); shortcutHalo->setShortcut( QKeySequence( shortcut ) ); spezialCheckboxHalo->setToolTip( shortcut ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Halo:" << shortcut; } else { QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->label_shortcut_picture_halo->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); shortcutHalo->unsetShortcut(); spezialCheckboxHalo->setToolTip( "None" ); qDebug().noquote() << global::nameOutput << "Set global shortcut for Halo: None"; } } void QvkGlobalShortcut::slot_checkbox_shortcut_halo_currentIndexChanged( int value ) { Q_UNUSED(value) slot_checkbox_shortcut_halo_clicked( true ); } void QvkGlobalShortcut::slot_startStop() { if ( ui->pushButtonStart->isEnabled() == true ) { ui->pushButtonStart->click(); } else { ui->pushButtonStop->click(); } } 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 ); } } void QvkGlobalShortcut::slot_toolButton_shortcut_start_reset() { if ( ui->checkBox_shortcut_start_strg->isChecked() == false ) ui->checkBox_shortcut_start_strg->click(); if ( ui->checkBox_shortcut_start_shift->isChecked() == false ) ui->checkBox_shortcut_start_shift->click(); if ( ui->checkBox_shortcut_start_alt->isChecked() == true ) ui->checkBox_shortcut_start_alt->click(); if ( ui->checkBox_shortcut_start_meta->isChecked() == true ) ui->checkBox_shortcut_start_meta->click(); ui->comboBox_shortcut_start->setCurrentText( "F10" ); } void QvkGlobalShortcut::slot_toolButton_shortcut_pause_reset() { if ( ui->checkBox_shortcut_pause_strg->isChecked() == false ) ui->checkBox_shortcut_pause_strg->click(); if ( ui->checkBox_shortcut_pause_shift->isChecked() == false ) ui->checkBox_shortcut_pause_shift->click(); if ( ui->checkBox_shortcut_pause_alt->isChecked() == true ) ui->checkBox_shortcut_pause_alt->click(); if ( ui->checkBox_shortcut_pause_meta->isChecked() == true ) ui->checkBox_shortcut_pause_meta->click(); ui->comboBox_shortcut_pause->setCurrentText( "F12" ); } void QvkGlobalShortcut::slot_toolButton_shortcut_magnification_reset() { if ( ui->checkBox_shortcut_magnification_strg->isChecked() == false ) ui->checkBox_shortcut_magnification_strg->click(); if ( ui->checkBox_shortcut_magnification_shift->isChecked() == false ) ui->checkBox_shortcut_magnification_shift->click(); if ( ui->checkBox_shortcut_magnification_alt->isChecked() == true ) ui->checkBox_shortcut_magnification_alt->click(); if ( ui->checkBox_shortcut_magnification_meta->isChecked() == true ) ui->checkBox_shortcut_magnification_meta->click(); ui->comboBox_shortcut_magnification->setCurrentText( "F9" ); } void QvkGlobalShortcut::slot_toolButton_shortcut_camera_reset() { if ( ui->checkBox_shortcut_camera_strg->isChecked() == false ) ui->checkBox_shortcut_camera_strg->click(); if ( ui->checkBox_shortcut_camera_shift->isChecked() == false ) ui->checkBox_shortcut_camera_shift->click(); if ( ui->checkBox_shortcut_camera_alt->isChecked() == true ) ui->checkBox_shortcut_camera_alt->click(); if ( ui->checkBox_shortcut_camera_meta->isChecked() == true ) ui->checkBox_shortcut_camera_meta->click(); ui->comboBox_shortcut_camera->setCurrentText( "F8" ); } void QvkGlobalShortcut::slot_toolButton_shortcut_showclick_reset() { if ( ui->checkBox_shortcut_showclick_strg->isChecked() == false ) ui->checkBox_shortcut_showclick_strg->click(); if ( ui->checkBox_shortcut_showclick_shift->isChecked() == false ) ui->checkBox_shortcut_showclick_shift->click(); if ( ui->checkBox_shortcut_showclick_alt->isChecked() == true ) ui->checkBox_shortcut_showclick_alt->click(); if ( ui->checkBox_shortcut_showclick_meta->isChecked() == true ) ui->checkBox_shortcut_showclick_meta->click(); ui->comboBox_shortcut_showclick->setCurrentText( "F7" ); } void QvkGlobalShortcut::slot_toolButton_shortcut_halo_reset() { if ( ui->checkBox_shortcut_halo_strg->isChecked() == false ) ui->checkBox_shortcut_halo_strg->click(); if ( ui->checkBox_shortcut_halo_shift->isChecked() == false ) ui->checkBox_shortcut_halo_shift->click(); if ( ui->checkBox_shortcut_halo_alt->isChecked() == true ) ui->checkBox_shortcut_halo_alt->click(); if ( ui->checkBox_shortcut_halo_meta->isChecked() == true ) ui->checkBox_shortcut_halo_meta->click(); ui->comboBox_shortcut_halo->setCurrentText( "F6" ); } vokoscreenNG-3.1.0/src/QvkGlobalShortcut/QvkGlobalShortcut.h000066400000000000000000000056561416353147400241360ustar00rootroot00000000000000/* 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 "QvkSpezialCheckbox.h" #include #include #include #include class QvkGlobalShortcut: public QObject { Q_OBJECT public: QvkGlobalShortcut( QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow ); virtual ~QvkGlobalShortcut(); public slots: void slot_startStop(); void slot_checkbox_shortcut_start_clicked( bool value ); void slot_checkbox_shortcut_start_currentIndexChanged( int value ); void slot_toolButton_shortcut_start_reset(); void slot_checkbox_shortcut_pause_clicked( bool value ); void slot_checkbox_shortcut_pause_currentIndexChanged( int value ); void slot_toolButton_shortcut_pause_reset(); void slot_checkbox_shortcut_magnification_clicked( bool value ); void slot_checkbox_shortcut_magnification_currentIndexChanged( int value ); void slot_toolButton_shortcut_magnification_reset(); void slot_checkbox_shortcut_camera_clicked( bool value ); void slot_checkbox_shortcut_camera_currentIndexChanged( int value ); void slot_toolButton_shortcut_camera_reset(); void slot_checkbox_shortcut_showclick_clicked( bool value ); void slot_checkbox_shortcut_showclick_currentIndexChanged( int value ); void slot_toolButton_shortcut_showclick_reset(); void slot_checkbox_shortcut_halo_clicked( bool value ); void slot_checkbox_shortcut_halo_currentIndexChanged( int value ); void slot_toolButton_shortcut_halo_reset(); private: Ui_formMainWindow *ui; bool isBusy(QString check); QString boolToString( bool bo ); QGlobalShortcut *shortcutStart; QGlobalShortcut *shortcutPause; QGlobalShortcut *shortcutMagnification; QGlobalShortcut *shortcutCamera; QGlobalShortcut *shortcutShowclick; QGlobalShortcut *shortcutHalo; QvkSpezialCheckbox *spezialCheckboxShowclick; QvkSpezialCheckbox *spezialCheckboxHalo; private slots: void slot_pauseContinue(); void slot_setOrUnsetShortcut( bool value ); protected: signals: }; #endif vokoscreenNG-3.1.0/src/QvkGlobalShortcut/QvkGlobalShortcut.pri000066400000000000000000000002161416353147400244640ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkGlobalShortcut.h SOURCES += $$PWD/QvkGlobalShortcut.cpp vokoscreenNG-3.1.0/src/applications/000077500000000000000000000000001416353147400174035ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/applications/INFO000066400000000000000000000000461416353147400200610ustar00rootroot00000000000000vokoscreenNG.desktop vokoscreenNG.png vokoscreenNG-3.1.0/src/applications/vokoscreenNG.desktop000066400000000000000000000005561416353147400234070ustar00rootroot00000000000000[Desktop Entry] Name=vokoscreenNG GenericName=Screencast Creator GenericName[de]=Screencast-Erstellung Comment=Easy to use desktop recorder Comment[de]=Einfach zu bedienender Desktop-Recorder Exec=/usr/bin/vokoscreenNG Icon=vokoscreenNG Terminal=false Type=Application Categories=AudioVideo;Player;Recorder; Keywords=Player;Capture;Audio;Video;Screencast;GStreamer; vokoscreenNG-3.1.0/src/applications/vokoscreenNG.png000066400000000000000000002161601416353147400225220ustar00rootroot00000000000000PNG  IHDR\rfgAMA a cHRMz&u0`:pQ<bKGD pHYs B(xtIME.kIDATxy&y̬㽾뻧{n̉ E(JL꠬#d)7vc#,XKtش(ʖ")R$Mt.wwwUYUoV}o@'g~̬|䓄;4M4Mvwkz/po2 70`cfu "<x[-ߟnn9ᜋիW7ϖK"3k"e=" `|0ruvyp1~~+n~`-J;\$x>(fΨ%KuX"Zr;]J$4K*"?3%>aR^R[:R f !Fιs͈]nn/%؊ߙʕ+\""fCEv.Us.ckef""rcNKD93(AJ\NDŅ t9.[vys΍S yܮ(9^j;\\en:qh?3;EH"@ &!HoEQy/@b+KYGLd)F1*m"4/2CxhK`+? .8fΉ3"0&Νߩw"wsonwAsn4͎9Bz"Z"Э[/^Y3& 8V.bXq %tQ,YJ !$D$JA!vg D„8y_͒4EPXr 0ָ1y J-b0N&)@Q[$I?}|I[* p MW2?ٻ߽R1eu yۛ7o}Wf}w(!Xj)Z)}OH^] eY#II0DpLG *(? ACҘluuWR(&*%Y)J VJT C $@Xs  |¿ƿmZDНtcVQRք&ʿOPnc]k؊Tx I.o8/b V|`fll$E(ө$I0+1@`A%l0B0A+'^"˥l IF)W_Y u'dz)NB!#Gőpq$Rő8.])dAR R,)QqIoύw\rT""}DBÂIs;efS0qffRR{3ø}B3M@& #'Iy$IRJZVW'өPLSIc(,q0aX6Xfc /;O Gx"+b@0Jm bA)OƊh4h8'~Ď`Ig&QlX8bdӘl'!DI$mcrI$lM#D4.RNIJGJr$+?K)y*0,ùBaz9EQ/\0QAD9gTO><DosM#90ϲ,Kt5@߉I*XpaYaa11l#k:2a:Xq7X2;X`+[_ K:AL$H$/ X'LCM5bWY RXIkGRpJ%l4McݘL DD#RH=CqR*@TB{EØιbOɖ͏tQ{Sx<FB>{`.L 18(="Cf޷?svp'4[.p?@ txꜫ,۝\;{}* ~Tx~P*uFyP2%JRE܃unj :se9iQ2!7f6ȵC-:+SVS?]ޥQ" XRעr,p+ '$RMem'b^ĦcnqH VR5kk T_,;QHmܙ+|xơm7k0EJe_uiFP( .d|@D|`*FolD6O?%T@2e{sNkqs%\K8q &&r찿?B7T orr~a.%Ax-xB,^ EJ0*U_TD^i[e0Q F̠r˄c6qxBB;mXBZs0aKϮZ>J%9D[G@RH A`Af)bl"٦D]`3lE6ȥT%ݘ\'"+TM*+@B$Wx B ~.9SHfհ|'g,BٔHJv.S[2&”5C)|ܹs/=7&2F + Ù*{9‰L(Lq8"Uj\Ir}sZo2 F`Ka0jfӬ+.`:e٢T8բx]9~R Wc^8ZfFarmDž.C+ W>łICW w7;ۛ/1X H7C.p2rUl1L7lz1 aDb Df@BD Q>BTNS^{ELbHÓJ gv.\o~m:+Evvvfι* ps])9OTy@K]I1})X..zW﹖5A먵-Zc13 c U7]5\IHQe ԫBP=sT3 v_ ¼ȍ<7rV ,7<F#˭롭Po&+kI ]$x`SXR,5 A̩tąNbg1)뵔u/VJRE>Ի7IHB*C[TLevTTxbo̰Ο?sM~R1T< s) cMB9BE s !"렔l0Y"9<3-B( 0״C Q]#Ӄ[ TmjQ;yADžVQ=\" ^,~$hm1/ fY1yny8+E1C %elF=TYƁHٮrݏ\1b-uzD)X)dJ)rB()+uZeUO Aaw],U2 \ #ByOn?PyRftCk s )e'&?" J[ CmAE-%j#h3`hkʵ,Ͷ"ԂXcaCT3j>oXQ AntywʿًV"~%M\<^ v)'V-X 4A!">88(fYvmǎv20Iyny6^ <ӈ1F(jiHxt)C5=No޲CI- @ϋDEHP&i0eK(Xm}4׼he%̠&z *.8_j]p!5^N$9' ,Xs`IvM#61l7&dz#"%8VTgDTXP碌r>|GK* v oݺULl=B<dIIk>k[t"PuC"&/#ފ!8AXh#&6j=aW \6Bsf.u R])iMK9t̔pjC?׌EK yVrX!L`SM Le.-"L֦QnŦl0l ǂlK (v\uIr:o~t%<Y.o0d2ɖt=Ʌ]0lCJ?Z[h-EU_6%ϫڠD͢b6,(WL-¯SUYwx*B;d j&-ԸG8Kw{u ¤` ¿MC/LiQ5p]8J= &QY:-! g@f9"^_5s/;qb+6i(љHWxDZ+@ߏXT RnF:);@ 6әSDǓ," *a&-+kh_[!hn]hW/tCV~ZBm c@Ӛ6!'}OpӼl;l±טEh2CT! ZӂV/`\,2eD.U9\S14Carp"oɢ(CD$O?tq } (pƍ1 z[]׼I:>%BoR ~,jve<Xh/4І^QKr%&N)hA LU 2Q v"#r7DS / /ǫ̡/)Flj&NoQ;;Lbq[+QO~i 1Kr,c%F:۟(-5jߗIoT K.M{zȮL#f$”A-ˤa!4k-FA{ѴK`a>5fB^r_π5̏jvQ:"eD@-S `LkCxV|pKuh FDLn0 ༰lYu0*(DuL'M}Gf /¸ԺEn}-)xpcO9`C^rP*e 2/\!`!A7HxFlfVC5->oB mՁ^bI$q=_d*H 1*\cE^Ʌ ֿ^6q{_dtIիWG067Sҁu"k2a]M'$L+C`jBk %p,' hf $m1jOHdPJ2Rڸ jA1 XϷL[$.5?*.!fBK4ٵ4Ug8|-v}C:0y~]hE%a\XEB#LKc 5  h+ЖAYA]_o/(3$n:pVucjTPTevL-=b'mjQ6{ *ebG]A1;"[l 8 0"J TV?-(a@ V 4Yu>8!#P[i&}0+|u] @P90c.pͻ@8mpݶьyf*RNeк k}L0=g1~'KTMh!;8MS71OXDpNGZ ng&9AWFXdmKwBӮp7ro ! hgA%g(Ŕ(P,4)h.'krΠpZi5tQP5 ,JW8 p鱊;,cWXVN| ~@|@[IyACB*QK,M7  .:$xA-6ZLMFf662W<5l\%ur$).LcȬ !=)^GVL@)EW^={a5cGҜ9V6Jk ) R56Tjp()@R%-K;\fFBFRK[(7_;N8Nw&=ܺ~l Xc`A q_A7mnlB%Bdh7/ˍgxmt]g7be"9>˒oa.c[b*~O+%jJ !Jbb.hX0ڜ*pMP ,BcYc/vD\cP0Ԛ*'fm{2v@03GQD/rIn:yW#qݪ#_H+"cya1HG[/VLsBT`2[@86:E~]+7v?( d1n\/{7b6"Ok5ʄ~"i`⮻~hw߸8vl}_hzR;FaCJm],X=- )hdܞWeZo Ap &>QE&aj߰[hi^Ts`ޟd:τ֚['wNe `z[EJ/ɳ{J I$flr%vj_Ƽ0т o6،}AOi1 Il誰Hđ䳧O`cs3|dc2K_l<R((Ag5"Q"J"H%E IvMl=m8m֕qs]; z %ZX 0Ц3xi0,$C@\@-DfU.SO-/6WRc6̄v?kgBH&lyYppOzj 3 ]qɩSE末 G?}NX`~J(O&. \ t:]]=#۟Á H khMB=pI"ٶۮFpEn>/tp51ݿLFgX[v `*~#?skkX pd{k++grBLD'(|߸y.뼜O["Vˬ9$1H8:Фuu +B8l3 "ΰ Z&P{.ZQ 3`Z*xbb 9k{Z1&$L|B)/p1 <$3Ƹp8[[[YIf+ A3Fs>2*⯍ύT%ag*}c u/cvʗޭKk'!KHb`ss ??>>mg9 Gn "k- 12sYa'}IgϜG'S?SZvM'KPnUqG'7(Ch괸?DRj> vGۦGhauԌh:B=\j-ކu`ޙ(r2RISPQ9w <hҾURA!vwwwٳD4CH;S;2(7U%^ctUsѣHr*T쬦k/H҈ =Sy||OW^?nj,[(s0V8Ƿ 0y|5Mbq1LP%WU9텄.<( m u s9<ڰ%W(ew/))%E@s>`Ռ vv0ECm60w[?hqm)64``!&S͓yQ♙RUo&Y;4cT~8p;KfA!;;;Y.q$FWBT%6K'YfMcRp P."sf{ =%z.?|=t=w?yC\~|w~ Nl?)ER`uc>ѭ >$Ph qX{BRw\kc>?+3 8`Mm Fk;.':<|PXW&M92 `ˀȊ 9_=yhUL t-1AkhTS|0ލ٪z]%y`{L1/=} |wAnKϵ]k !nޚB@&/ 65%^!T-n 8N(*/~?{@!~Ռi܇Ǟy ?<=8ss{' {2ܼy W^Ko~ -ces{~1Y<8!|F9W|B"+ yO}S|jQ)JE]g=g܍`hL$!LNuTz\ܺ.}pC "PŗJ9o]`h_nyo[0BguH]Ddd2ȵmZmSб{( ޘ(DUG].wbf.;8\GQi#"){@ PˣIi*Rk &ܢRiFVEc/Dpb"IS})$iWe|xIԭQzKRl?G{>{cxM@c4 t,|#c|_wc\v @8 B%:J@m=88pu\>6~9(cSc,ޠfI(y 8e<{)%g5m^"fP N 9(𒲻eY6cJl=Éݛu8Gaǖ  @[* Xy[ȯWq4#[l/}c'?nHpBRJ x1O?> "MeX+r֝m8ebX1@>6hR 0:Ҋ5\n#4mj&hnqa8Ej} 30<2u@D__xh<'5iil 2n :mC2^dV6݃9kLx'pk>@a4gͳ69>8Li. DgpSeι``:aBA|ICEů± $)UgSz?>|?#?,FEZc( 4,ó=$Ad${e]UNv~/XzwiUYCmE uͰ/-@/7h>vW1 ` '&s At(pD]0cύ*tA9Rr|- ඞvv2h^~ pc5ґV#:eO:Xܕ`BktEHe&:5Al7K|/ 1tc3)O)@Ç{Bun Ϳp !88X9W_W1jn c0O?MaL_]|#?oBYCmJJ^2R4 $aT(J^\_1Fvз@]|n>P-^U4\fhecH|O%1q(ӃUf>!oI _V8 bfֺ9G\(B^ux:/x}ChIvpM)B`Xǘ(DJ$Gή4He=t/ރ8vyGS?c3sO"Mc(PhN`wow쟃0XYXa.x'px(Q !D@եF oe?3BW0%W2 3t"Nkvs;>3 eC^i…?>/i74o^jwL 2H9VAEuXw"hK4Cey!LL J&ҖaQ!tSV(S&sa&̲77Z+9c,7gfidk/.|(kgAB4܏܃g|+>RȊqaw/󿀔iP.@F)Q|> :xQ2~ eR2.~Z!#\; >)w̧p5(Bl>g^?GB#>M? ڠֲiu!VnĭkǸ51-oԏ& i sRY!1"j… ߉r'PdB'fu XHSbL>X0P@ jNo U05X(Ibe'k} 9BpC?yQ:cz+3}܊m7-@@TAmSzxl@%řt`tڮloc:d)YR c(5U֢~˛1;"7M&3Lʋ$ҭb,ӬM27ko CDl']V)cLfegS|)N:ݍRe,p8q$>;`E?@t9.^&QE@R >z?K` e*^Gl!N Nېjk_x챇$«oLXH!67~ z.*nܼ<ϰ|J̌g~1ڿ'rvk0*WXޞ/JuRׯKq&$C1Ɍh:%* b`C^Uց-*M,[Cup]\cg={<~4"LIX,3xkC+ 3RQEQPTtu/3%3H @D|ppPLDZ룧͵]>j֠L8P聻VFThܠ{#|Fw4 d .~}R6':i׿m"I:`@XD*O9`U%9pI<3z5C `%wvOOCJ )%^x0 ڗ|2Aۃ _:N}X8u 8v=__ 9 Gꮲ3.,ĵ+BFB޼)EތRYC)=wϕ\0xS(yأ߶j2!jQf1M3͓f.5C ( `14b ZЙQ$qĪtuBFEQc 8Mcsݖff</ H X\Cg5PCcH,&)2ҋqrC8L9}WWU>-T*Bܳ`{m NǯCIS:iE]\(O #AD##.7c>vIYl9gZׂH'`8xΫM.f 1Է/pjCDPa4_v /q 7.?" GnwiQp f/Hvwp&].*H `{[[=>d4ǟ/Gnq0L0zZc~Tf/Ute쀜3( ZS/vr w*FW۸'C<9 kr8g`YñckS'uK-P-&baTveC8bT'@`]1Ԍ$G^'c$B4 :/̧ gT03Z΁˼ eE^TIA*b'ю̈́pkUOowIc,=/"pW܋(C$$4Ogp76j`~)~q;b04(CO?+|,B^h28q N"N6>Hcbk{I#ojqk@*W_zۿ(J sƣ!n\b>A<@R'xƛ'xGS<B0Ɛ~Yo|I}QYhX[xW-Ȧ15٘l3 YQIDHzR>JJnv&9K+LeޏvZנ:">8R)cOLD='|p,Lk*M5Xt'Yl-n|jc@5!~18ծ k-'3|בφ9@o$!D½}+cM'W__B6ϑvzP  T=HFlYW5h'efƟxN^5tsş  z\"7JbD0/`orf >0&ík701H=Fq|}ַDHs N/HMZ<'sEa]$CdmksXSZ krnʼ#pGv}XsM",d--tAdy47;97=IYwh}# Fȸ,+iU-ő@w*ɋB v5+3oDk|6͵DwSeH( Ξ9~BkRKY/|[H;]$IA?rB }‹2, ywȌb:u=<?\qrU/I)  .1&)s7wgxsxk'+LߐtkR$/~Knv88ⲗ*ar8 JDրd)+Br,t=+b5+xp A\hKY\Zz^xB,O0jKӈg*I,ީ%0C $R]}''m`L|b!Wxǭ7 A8^sl;PQT܃RVQ%L4[oS**FڌCSkOle\ E0D = sZ"X_waK >໊was-nI)ǒ$_ޗ1k迳d(oT*\̶hggKqNlǙ%=Üfƺʮs}ହ4&tcld:C6a.'] OXS@\_5L1#0f簱b{Utn'x!H:Rt]lSQMt\] /y2p}8>D"07ю}-TgN9@Gf Rֺ$RHÖ4y])oh~W k @)7nȚyꀓGLH?R&2aEۇ&. `}̳=8ppY0;cQX_H$"0`gĵq!b {Փ[k(?dm7YIM2Yo:30f c'QpS (^~%X!XcmȨ R(|B\y~!q3h=.z|o!Dψ:-՜͵i7F4z8^4l6PuH Z'¤eIIù'\Ŧ ;"MDU`hu8R^e X HdQvz '[%bi8OaͫHYluLgȲiW^(I0A"gS@*ZAQ| ?H!*>8WA@y1믾^o Q7R}b1F!&1i킙aq܅$|y:rqHP1[Al/ {=gՑ,dT;@-"25; &Pc4L kB0iH`4SԬmSf-<%w:-) ~[h| WSJ/= (l*{{HƢ$=wG[ Liӂg2 “x ޮ* K2c``}A%Ċn+Ha#xS x3v "\$I=8RѬ L3׃`zh21v):`.!ˮBz-|OGm˜RwvDk-'DtRtqca ,!>zAx8݀X3J8Wdb86|[:IKBB 31uX8KTh1qͨ[t"!e 4XcxSU&|.o$F&ߐ/0ii^FQuxj?~ 6<[˺65K=Xs^BA( ɭh2tFK()lHVd N :~@FuuY^xw? )hZ*l !S$Q>v?zY51aM; ^ /kׯc:CInlbscAJ`8M(GQ@>s {tb\r^y#R3$PVTA9IiGU Xc$!..dg`Tˈ<4d]h)؁sTǙv/drBZY`$$_Y܏yP@Z0*ߗpx}`=8zKEIλSdY.p ι{fdtKĉacOc2"b)vmFrXLp9h c  OR1Sx{8BAk )$Bx`I!Mt "%AH!dP `m @Ptd N C/M@B#Q@,s&v"ꭲHܶm)بr- 0ֱq 1DH$Cnu:wO^[P@74մe*ТoN8Ӑ;cYS#@֝' .駟vh}iy; Aj55wQW^ !1COu':: ˓5Bk czke}ucH%D( &loY(oNp`^}]M繗XtR|O}Z{]I4tHI%H*1f0,zY-X[ 2h-*̦ۢsJA1ws74R) yݎ-eH`F&jḬmq-spֱ}Ȯ0K}H mlA7s6]ŸxzORc@ WV`dF(:WYI(o\#Zna\8k}YLVI!` )ÙGR9DD(r8:k NڂRଅvTf 1=LJZL*W+-)wSZ"IbtRO>n\~[[[HI Mt{z ~[A;7/cobޕr*XCȮǽؕ_~S'ʮ^]2DBuA*S%ǀ" fa/Ɖ#DPD][fF @ eE`r@&&JRf (ViFL*tAEr0?SO";V@'`)ho 2?鬲rrz‘ |IG$9X|RT-^;@H]c~?ow:Ȳ JJZZ$bX ¯CvkDc2!Mq^ ?]\y8'N߅7~1ovD1 l43>=Y) Ơ߃%˸r v3\AGGaAӁuA"PK D j-kނ9fkqkzQy*7/0OD`j~x \h1{Z@yޅo 3G Zi,bX'tcGޔ\K1Dg߱v@;Mtjy-L'b!;_4 ڛ+#6G~k`-a $[XShF()aR8Xʚ9%(& Jʵx7ہ]ܼvBHX(K_?'w#.́Hň>6q}} B";qO|׮_ŋ1Mps%<އ0 Xӗ,,,v뚼fQNfW;mul-tH~sO i\kz\G8DUu:wQ_UHR.Yˌ~Jk4;c`ӵ[pFdKk`T}|*`,_Mp8,lkkά^)%J2cpsoB`5)m(KdH. Fâ(6*S{pPlrq *"d1ItJ|_ޭ9J)\:3x)8N @KLU[>s\:kaKD*ɻp{+c5+}\W/_֏dI:(W5bDL>8D[nW7ynn5APc`^B Bke!PCE((l_{ : & 4ARԒչ_'WJ.0Mn4q0l2YUHHI#"hc-oѶ+%~١ze6/eÖ]! /낕Xg)oHR'5%ʈr.+ A%ZBU!xm` Uu?g!AA"X<wBNDŅ.J)@Q+ޱ] `aeEJI{{{ck.w"ғ`lcϷ0θ׉q\}u:0&GX]D6Gwujha9q}o{pS^ ll-t VVV.B "_o@7%5H%ύ1ʼn'1X .61R唄hU!W_&$Ǯf$DHq) HDR@l ` pEelZΈQے &Wj}+P& C3>xper =SeohDJZI~EL8vF( *ǂWZ̢4bF ',bFψMr>RUgea Zܜ32}E!Ձ e6B z¸Rx;X_ ":#1v=KHǤ4A`Fq`x璄U1qιjCsα/_cMYˢ:uyo-IF7"xl-qu@Y6|>>ۙ\àL^T.!d$$1$F)12 SO],pSonl80C?'ԳQ9<uw0k9nKW%wb)@+yꀞ MA83Pn@ROIrQ|LMEguy+-pcL8<4@T `ۇid8tO{-S  XIi՛mn7`#j8ʔpw,o;l0L\e`^GD#~d"E5x=}%ڭ F s DN-`<cR]U N@{\`z+ Qya4`ggǏs :`fI$֏??_}+xŹsOcks]*1pk&nݸtcDHQd0#(w0:Јd~XZMk()Ŝ 0 Q\Q-j*5; P_& uc i mB #C "ДXsi"ڏzj^! δ+yͬ";uRз~.U"\vm"%Ud,>%V{n;X\m`w*KSnlau}׮\s:=<.$YB>xc\_+Cv`+Cwױ$=w F>F cH3 #|ױ7@xא:U 8;F}83Eu uE)`^o77q1m9$QdlSbC D1S0ɨ=/Y 5q%̕l]- Q c>"qK5dnKJ$@D;cLPj&57k𭕷渃vx҆>P&Dȵ|dxqF&PYʈ J{9~ vo`]z@ޓlR2NCAcssS?u8voC6] (r_@z#)^x>u|h8׿U8WH 힄5s3ClºZ!2*^95cŃkkdC掳`];5 x'[z-0"*ռ(3(?wD귶Ju'"% ,@'X>睨s.b෩+ ޛd:˥1 ReS… N,n 9GDsE8$*(+`xlv vEz7_!,:k'80bNAy'," +@294H!ex ^qu,{?A(,00vhx70"1& q hA oB>L1^)w D A @B߃ w:?zAЂw&R2)#**hzj{(S@5PȐco~ςv8-I!Li &'`qf"8Rl!aE &wpbwVQb\"p+RLDY1R#t̼FD;'q'dz23sv<WVVi&Jҕ-Y^(',PʬDJqn{M2kNn#+߂\P*XvAR.\H;ې:qGvN$0v8Gu RxߓCILÚ4W3O'/!TĔ$@)HT5bBPE街 `l,H[b`F"-I &p8RVpnsKjH ʳheB$HW=T$asO LJWxaX"ùY!B&@y8+1]XSGaSMGݒsEQhΫ[rByn2lC~Q ̸'{ '`,.~]DQ}W鬅??"sW`zǙgIbvvޓ֕+cR)8ǐJZY$ˆ=fCau(v,uv-lq);W!D!;([ 9g n~jhǕ=6"N|OIEaT՞4$D1_Af3V./"v~7ڽJ.t۱ 8LC+р:ڴ}赩% H p}H.$"ʷf#=״\vvv&Lɫ=.dX .Oxs.eJu1ξY}!~ӕkqӘL&X]]p{p鍋>^!\c:xGgq,D._,fNyܹf;;;k'? IW=4:^ .0ލNŗ)D*pn؇VAB Y≧P19mzm( {ޱhexI]yߩ. 6HG)?[ǧU[5JB_J;ę4ߣk_Ku{]1tV DrЅd6t:d:|>d2ְH)wv:t2b8D !UMߣ{]U|Q~k|^m9$ .(붖vW$O$ E(IJ":~Rg|۠Fvo ^ hdrα(|J+O@%7W#FM` cdz7jo2lo b>Om=!uq0auu O=,>߃19: @rܟ? YDq^xvvwtzƫh w]}vQ+af &tO֬xMqQtWV!U4!vv] OƘNg Y =FRD(RibeeX_:.tQH}lm]oo|Q|c 3xdɽ{c(ZFBw &Rq.DT1{}b^Qsh[0:21q,]5:LfESTon;Jk|=מ]it,+W܏=ee \vO>Enn_PU9+ #<(RLxe dˠo?8>no`xS^6W*,~AVT#qʫ+ <xW!e (BP?' pdkg`<:Dt7/|KcG!`Vy|oV3;/)qE} t;3|{k88xlk%.s, yx ={{/Ϳ/H;׾t0+nLdi,x7^kň#8_) Dԅ64~<0F` OKky.ܽϞA> M;Ї?G{z SOm /"߂vr!OİK.^{*#N֛P`n\Sghd%6 2 L D0{7p1yo^0\px.]f}U;t!i Sdmwl R|1lLg2ć>^q ISTZ_mL&c3fsfS 8~NAc;c'Oa>coo.\Kpe9D0gƃ>#;H'kiiMB~<Dp8( Rw8gG|r悷rF1ƆϹa!qj'Z\-J"E8jM;kBعQ.^8y9u@\x#Óy WQU?#]\q{3la/| {l@Wey@2+`^xn_§sHBQX.%1]RlM&~>lcr_}e"GU_o1@-#۠вm1ňD_o(|q4"_Mb<c6b6رcg>G%ٚ IHqbccpI8s <.^{5<FȲ 7#{A`6C{C\~O?˕ӻcQycfFAJ['`4+eU䓄6@:!D7׫F֚C-"@viX\Kw/`H*>ц_?A8Mi4cc_}K!>3?n`1o^F^Uk{%9d\qA(>Gs cڽVHѸ3|_ ,Jv@́=a/_Tчt6GEM;gq >^l17!,[D-CQb7]@W&*Շ<'v:0o|:pxxb?>)|n!\7޸[1_VeS;W]yTJvp1 N>NԩS8u>O+_ 1e!GQLǣ>4M{0?q'G :I.ɼ.7 :{h3$ϴFfwO2aIDg%gEe? y'<{x>{0ƅ`<Ǎ[.lxY x/?QnUCHA$!D !;K. |;/? ]LKs`  9٤@o?H/Ig9;lt z\%GGXuz4-=+;4^HD_8g|UQ$fxgpEOOckk yc2bww~.]db: )  ȍ,+#ҫcksIWW?x/7d2FY(ya>>Ik??!l^of24BDy!˲KjcPlfD$=8RJI)`>U/kԘ'4l=EǶ֛]8PFNmHip.X! J#E̦ Yc{s#GkέWBEvq A$aSy/C ZgSMPc̦8ryܼ=ZRFHd<7.o~ ?sxp}E/CDͯC+0FR=TEJ:NO|$IO|Gs*mpbOE#8wuf{1|s?~86Kݽ]k%-]/ `HrV$Dqm nݺo`Ơ{;;G1qMEY߷NUDD",n_z#jYѴN_ߕCv軿;sE?`pJA E5g~?@V 3;^&916E㭝X*30TDYl:N7)ozqB>O`p*p 0s ((Q  \rP3 ī/|Q;tv0`c{Bu88vgq5,f$IiO.inb9fR,۠6gяWd6ωL6WSyR1/^5cooE'?-ܸq{Ng.3NR/2!0-yZ^? |p =ƳOˤwލIN cy.*W!)l~X=^Vu֚pf:ǎkM aAwϼf:dl4Cm.`wES P^|>l:nO'7b׿՟A)e P 9\K@ti~E<Ѓv&s`f3 by^˷'{OFH;=N=t*qۀ>dlAt7 u>5F|C'lB'p$oܹs,//⩧Ro&̳~cץ%>$\;&bS#۔tx2ŷ=⩏};;;?"ctV14<; t¿W#Z1Vh"lŰKhJADཀྵL"'$ (~XZAAYUx޾Ǫ3 wH($kxȊ5zmQ,0[fJ]yA!H?FmMAW._Ÿ=o0ϐ=QA@VjJD:Q!r/}U\~[u ro-@g3ĵ~pn|2Nۣ+w:=ll{[mT{y~Lwq :~GC!/^e~gds75\v@:XB"Xjc=orߗm+M$K0x㍋=zgP9 .^#/rDqLG~vI䗾)JyuK7;"%Dㅈ&BEI9 "ַmx{`Z9E5L7,输&g%z|.މ h`oCYc1nZk䠀v*Iv%ETK-@\k@Iԁ]J(dY:lc} `?QCٜ{!ͭ$Ɛ6Lw`E [;,O<ܧ^<¯71M{:0PJԶi }Gf+ϗU(!%ï/ao<ƠG%e=6WiY6|2B'<nO|8"RQ6(8{Kמ_@+@wX=轔')_۷0b< >O__RXg^'j$bK',u0 e0s؆Z@gٟI>s _pxxsAJ\xip8Dґa7/CG P]xdP/6 YA7TeN3($#] QZvzS˲87HPoU]t0p視j?ޖ/[5y+cig{Ҕ]$><8NN4ǟc'w{<(` od<`"ϱX!U'iM/呓g$5ƍF'8q~~/]W1/,Tj9 _}ܳ~*0e,95eZ~z @_ƳϾsگw~w0!۷]EJskoCT9[K,N*a ͑H2z[Vr[2J"Vm:w`!ˢ(8n&XJav*y4'{a6rwP""Z0-w\n`& T'NcQ'cd1ᇐ i b^):ijMLi4Mqõ ~?w7nJC 1ܾW1e8PPXdk/\CKJ0l۸68Ġ73d Aؽo<<>3}݋ٟ#NvwobsscG"NRR瘇wI[@$0 {Sgy&uAr?G'[$^^{|b;ZGߤv!Y| n\'d%fͦ3ܾiGqBJG!a@vh6LỈNnv?/^dz/޸4*Jd)tU`MiN:uf-&'"P*B룳CgP;u`/Y~cDRbfS;w{L&f'?|w۷k1XXRtm)K+0_e܄+xJ Af up1 X֊Wːbr Y(JIx 8q>㳟,^yȲp z=$IBiptpCTB O̓~K8uld[&:y,}f>sɧzjGǏB_& -@׮]y^K"(%ԑ(7tQ.Y9{ki{xoY3awTQ|BF-fSY!dAFQXIDid%0Bd`(QsLf0ps`|@U3'iހd`c(b:/~񋈢؅`G' c0$)=k;Hĺ,(H1&MxSKq!w}w[r"0*OE5[$Rc:+5iZbߵꀖHc-}gPMEOIsE(, *K_) Ӹ>I qBvYv,DjrȺ, PHXTr@gcCČIYx2{&2?hP/ ::.∥TtU\z ;;;x'kknbcy݇<}KVXҮI b1_`1=Χ(gctU@_e!p͋p"{| _7 L&$IF[Hqr2 ɀXo0 Xa6+qQ§ %!eQ@U0͛7=F( ( &I6|Gµw%͵h`ql, w5d>#Yf'U ]d*[V Z>KJ "H-3 DbcۈSd$IDLBJR$>&K^6+uf_sT>eQ6M݅TU•W0"lO~8rnܸ_| e?(C-=Ii !lMЕ!~)"$MHN+( ën_D5?%%b)/*> C|?g Ec>`R)Ʒ^jak m9NDGy!4NWby~(_uSFQWBߜxU,CɼhEZୱg8E8u݄D ѬFڌLdqJbSKHH@ELR*%)!!c5#< bGi"i3Ͽ7 nf"Q()1Lp%, fsloo'@Y8Lgs(W| XˏrG!)\tCԔ˴V_d3 ;qcN< uS<@kȯ}e'p\koࡇG?Q_F4x8Dq똟3 Ez׾uEaL&u{*$?Uc;)`pQiJM_ׯWZBm'n߅} *88vz!<.yH|,ϠDrÆ\UCs߮~H"j2TYDt2»Tח'ZЛpi/>wzA| %m`\ke0s+6&{^<7Wz85![>R̘e[cbhADBENnJ9EeX5 } jqיG; x<V-)4xT &yeܣxkn,z!"]i"%8ѣGa>oc:A)6~oR'A`HƷ*sʬERu8dhEnTt=l lAvG1,kA][zMFUХ`}}cF`pe<#8}4o*E<ˬQ*."ھ7M!t4f{6v#Tq撃x:i'g0?N@m4X;wdjXnE$OdZ<iR‹X"wzJZ~W7 됉/-» 9+D=C`f ^7`NzY0FWDml1hdiVU~cǎpʵځy@,w=3?=!Udr}$c6s`mp l%PW;|5eoڕ z뾗˿T)D`nj|S!&~P?:EyA1&ϑeЫ f>Xjx~wu x ?Etd\8ƭcvO$= (ϟo.ȧ1K+w@RH1a?FvUBfYb{^o]U(6Hp9뢹O -iTaCNJUEZ N ̰oo|xx8aI,f_u\8Y@n?6:joٗcV `D{hs k'.HZ@kBAyso"T_A% `8tU`8CUUȲ Ei(&?ɓ8?׾)Qه} I,*RJHtc3G1CŶMYVfFө=y!jnY zR!:<#9,Kp{g|bM_1lY@8MOIm!׷њ(Zr4vtBțF& nk8̽Hp ǟj!? WN\`9P6)l˸y^W IdS.Њ>_hMd^jO*N?d|vٳʕ /0R,Q9.+obV ՃSQ栃#=(P.63aX بk51W`+u֚D.Q'QU$S.7E#6CP:wq@Cl!G`nܸ1jU  U9ߩ҆dz<5YZ?`ۊ q>ljm@S5(<+-n!&p:,^#4\iLаgZ}YahGu-[`0X%|CVǾyQ`_), tW7o\Y71KPqJ#MSyݛWq`6b0%d3z`'DqpU6GDeYB)m  !ui-~)ڢcCc$ AgYNeYWi@u}<[n崦[UƊ2c`A-@jSCkc 34 KMg DB1 6X^Y" @VT%/RߍdD616+Z,M-y\|Y~5SH?!(.} 2d~. <L??>8FQX%Хfc`0 Oh$N闠Oy0~ϑv5{!oF~8< R=T.as,ޡ'L)RJ|Ad$p6q?&"'Xoi}C>_@ۅRPJʲB߯9mS1-6W&Qimi$) YVH|m};WWXIBbEފ 9Pe/KΎBZ6Ԕݶ26C֘Կ#XUwm(h"A 32U^FAm`YuR/z>V i}dd>> ?EL% O~F)e݅[w8+~lZWR"rwA\7'8IJJa}[aK(F NCfEA&s_sޱٚ,ln@:+׿֑:5av<`cf]whBn5̬`H"t[uP$eY<rP&R8pk>Afb6-#߅ۃwd|Q ڃMp?m\MM`olim6˅'!4m5%b MmPzDYiPjfr*By[aI IaUS Bt;@߆:d:sH$ GoHZ-ܼyYCy-n03j˲DWjqIt01wn?|:AR PU%8G'cPQd[XdƿK/btlmIoz,rMlPsyiUf^l0 C^A ^,z>W+@D#aKV. ya y K (߽n(!>s/4Sg o#e (B'I'qe.1zየSt:NWG;`UifFccJ @@]!:M &_ۧT\'W݄4ei&Bk]-8 %`60K  kC$p=; 3 x.D`1}N8Qh }w8iZzRLK/ ֿy NDķ80 EeB58FZc6 0xp*N )(h zf udP^~tzm?GV<8y yIlmoDӅ֖ !PU$|W$?&O.Q!#eenIL.YPVBÒ/łʲ@NP{THqxh& Zt:ͫZ&:eR GcEYxsNu?v?~1x-,:Vi 3p Ņ`mCb:rE.$F" $vhBކ\f?O"ok}YBN],"O/ɳP2µ ם/ӣQ c> 'ޅ KpAE8F|$F+"ˬ{&"ѺT$7{2w+\$F@sRiv*g?Ͽ#^#) 6!3ZtZhM@ 'wBJ_Pitm@yJ%XnBhT%hih~kC@C1B[IY oC\(5(d '/APtw8/ ʲJe'*!wr3 L`t"ͣg@V#޼k_kDk8q=Aڷ.Px>Noic@ll4MISb:%i}lS$jz{6g[G$)) p]F.|}p%X, 4MUUMZtj'#!3J/5G6l h(Z%-B` t =Dk u$Pq!v`jY qmpedi NgNqH,A28H:"\ 㫯?=/gx_ĩ#tg~O}3X,ǮE3_o ģlP:)'Ϝ Ln]G!O@y$Ո."tqKȲlٯ]PU6.@=Vש'<ˋ윁$+\܈3wx/u7Zk3LʪV&3a/Q;`ԜjړTcU BJB ~0 Vco50p w Qס`P2=6BTnk(KWvc.A$\.^GU A$p(W97nٳw{~D ll={q *gH)){?(}1d eQO<ƹku6{?>'qriJl _&35{쒭f5g ʲŋKD+PnP@T D#GI8**(6Ah mY0N,˲^&*r4sX75y!ePR3OHe &PAH״mx':A ;p"G˾ Z\{kވwXa15, !$q3q|OᮻBӱzM$I:-\9=ƖR+"n8ػrNƉgЉc"Ez]$LuӍckzۖ].3g 9Dey$,&I _tDIUg\poڈao=W8lHrQ!`}dqD ts.jK};8~-9LD97d3ܰ#'F>xvP 3~qBE^D:ZN'^o!v)l$9pi^!p'l6LǛ*_@kr_'z^}U!`cz>ƿ'#"ČY];IrO-gMU#R n2rɟ s?q,1I?_?ß;on[!MdS٤9+xK!8 &Id%!JwAE`зxA>0$)@t!]աKN{hEI:腼ߍFtк``k`Z2!him fz7{aLg%W՛?zG pZd 0Zf:]sV->p9!eij&BR?3ƬpJ`1#·_F,Kekq8qGN19vQd,C(Ke +᷈W*۪hT# ֥E*-!@Ơ*m|Ci()0L/ى<1:-3t 0L65s0fT%jyݒGo0@Y u<狒RUńmBSFo?Ekej)fi-VC* N!Rjo7P2+fw }HEA R0͑$):^n\,Pt^Cշn[k~Qүqq+%TU0F° x_tWe0*XT6Y(ROXk!uDUo et^0Z6oa iq)AC0i)fiCE a$1sd,㪬YQ Mh籽?!ll矊kQ@)A(ҥc Y<Dn|YH- R{٨FE r " /_Zt:=!Pd<';=߭ d=%gvkϠPQ8X:f0N2s˶}8O1n޼9Y`pt3._*;S YƆdp?\ݠ~Qk[7@b7#<Ӳl  7E ־xIsmU]fŞ9 6t:]]{'Aڐ`[}B.Cm ',X>xn_U1s#k*)`tcDĵ/} eYHNAVAbpJLk8^- @ӂ6Z7z1ʒi4Q,}"|+`} PJ͛݊$})FƬQp2C ۶/Ha'ܣA9Hr& D29ыAXUG~Ӆᵆnb?j"ƨ nni"Ib|_EJGOt\^o,D^HM[ ⃔ K@Br Af9~i\xIbZGgÝ,C-'w⃦VoFRmc)?@KH!iTz$l,9 Y |_Ǘ%£=elt0csp?v<冃؊>*4*F<OJU0x0bs0S^h3"bl 4Og[E5&!SyPmk05Mw6v%ͅkdi!?3DZ:{@ Dt\nPǽ_C>ט$d5M'=[*k6!.<đ^w D C׹`JT 9 fˀ/|^7!XOGТۏ|AK0p eH#5DY 9%ɲAA$tD:{܀8u4￷?g ~ \H֥વa;4(|!hy [ih'(KԮP:n_wvi ?Gb6|6p-&}/3cs8ލI`PN Ow0B{K [^|r>?(Uy'K8:49 OSo[?ϖV s'q, gdxs]?.XwpDQ/BE u<)jps ]pS#"K3RO+{XGmlB__O=Y{e\w(ϖ%ҌZ =:4Α1dT~EGy1b1 MllXa$X,]>& 8k4QNi|6%7b6Kyl/OLb ]arx 7< Fooꯜol 1nB <08rv>{'0V"`,׾ 9D~B@oq ?RH"8Yd\Y:N@"@ ᡵ֡)P/6 H͸$RO` Aؽ=Un@8e)" `'D0{!9ZuuΡfuC A~^i4U ![;EېD1gRPa6 pӣ~!X{{x"/GEFOrdO-kOVIzzSҹ;DclBf<ƘOnTxW/W\ACv]v (e gsγMpĔѓMw6*sa%DKa"Ik}}?DZX8BB:$"uu~\ ^Apm p؊G)rL\m!MgyD`RRͽ9 㽌 |$PW+kBs]b,k@a 7^{lP6-bɽ{eeV-lji F"˾)(ܭo?0NKCu"(o|o>O'~'pilmvQR3Dg#]5k!h]QU| ]fȳm/xkxgoycccnݮ{Obl>lJ3ё =4㋷ 1ti bJhK./$N{FkV<H)I,>ųy.ʲ 5EQdyN~~cWDž4W8@=1F,Vaۍ&te,Ȱ6P">E y)i 4X4_uo &(pTA^HBhh,[jZGͮ6阘 n.|n N&|K_³>O}Sx'q :h]AZ2)X6(aBCM 6j]ek+Ms\z< ^zeLS$Imt:6g1D'M`>![9[hnV؆t` CM﮽ $l4*)b 0#~{ } B!Ѩ RЉ83 H o,x{3%[wSk01K{#[??lȀujkoˆMDh"4A(+,2h _r4:u_~]0+xDH{=WoO)sV(r|O>$y9s[[[.& R#}^c@|=\x/"^{5y4M1n"Mv{6GQ oŴ%v -f|x8©GYIXthX֬ohADHbEJНFOZ <o>sM?n6JMg"PUG)$N$a;`?'f|tKV!ԢLNb;n!q-$ؔuZx|Xn{F f J (}LHn|納<+#i%}`'֜v;8EHl$I2~qY8q[[[p8 J#sL&`ww7oĥKpUH)t$I$zt;=$i /ȲlFYcT(_ʀ)Ԅ$Ds/W&{5)r5Y  = j@fIvШ"7Ac&hk z0Eu3D m"rn Oc}IS6|Hߒ.] oȪʑv$ u;)8B|>ba+ -.\E.b0 Ib&(ƘFx f # $Ivtfe* ysg4K><ǍS! T b@H@̼8i̱ YGJ=ܛ mY,V$>ȩJrA_m7Xn;f4ZS B+ڟAXTʩ>h6;rk+rxY;jU$Z39o^@"afY(tf _'c˵ƣOa{[i|ټMio"NRQnbׯ@(~eifYt7n8`'K:0nZ3iNڱeʉ`y*4]0hh,K!#P!NO $"@QD\GIax)4p0m_ 8X L[{y|TYClj4l\@VSx:YJ8 "w"ѓch:+t,#Y q܉_w~g*dh>y.qkjuY=i$&"I$MPUP"5Ur3kWepqHJܛ|ll埲,Q– .W" ݯ$A2b$cH$UQ xZ`(hAwڤ~L6GC InאQsCbH^/<\@v=nugb}V@+\y(3Uz/ˋ.1Pi4z( `Rf`cCV}#@nF?Р+z ?[&@Xj.mWX⃵x"-gnWv@ Ly.޻͛_WI1FR*XETu,QGg>ۏGJ)uHs0U(Q@Q=Aeu3P#CUxsVGJfkJ:L س>?> Z s8` ;"":l Ta`TZc2͹鑩=x^NQ?lR",} _A0ȩ 0{33yK?CwpK_'>Y-7)G)E2J\1HI8Biclo1<6EPUV\UEEV(cL"#TT $S2D|xOK0 ]\z{S-1'Di9o25_N2ئ5uJ2tbih9"mZ:Z)8NbxHُ*hW4 @ СVa}APs´m~l^v` yB3bG̳a$hȶ`Nh#.iH'|xoJ^eRI(T )HJ ep\bQx?+-Ǡ5tUAWV(ʂfY`%WH TeE]@vT )C$S@2e1ƩM;_x]slGgNlP7Uľ`V"=-&@4Or}N]ѣx`@n8ynyض 67")&0iO0֓pMcŲvRPi-XSt"X!g΅CMdfԕ,04E-w`_wum ~\GZXCs9e縙oHG"=HoJef$]~@!% !N@+d"6hhٰfYų\s,RPd_D=p.ePE"I)16p3.)e7v|p0gN ԱkCusoucE^uW>32@ ~ j0v1:p7,FT&՜a鼄\s+U_~5'I{m8cq@,r ^GEm;$5|#l⢪,ö5fzկL/657r,-jsMɖ65VrvWDu_-cIj_`ȠQgk|'@c{ gղ{ (B?G( 6\cܝaMwa:͆&%׏>棆*)՘A&' `!T6 @"JuT^V2aLD yUHw Ŀz:@d^O qlDY& uu(4QPZQK|b=ѧz?~q2XFЃ1FK))ۛQDR7f%B',r(N9%){YCiXz:5fE$@|a?85AGX~'B6 j: hS|; @"2#JTjN g` plJT1"DB$c&RSx+׋BNG\2fq eB HIV-/NF*H%\SΘ~/([d jSx ˺xeZkEQ+ UjD&v7{Oձ@KQW 6w-D PB~m>gA@W>ȉM`5gq'Acjm< Pd \͉˜\\uA Mʈ-[HP26$"LA"dD 0R q rέ HF Lѝ>6!`c 5ѻGW/c>il% ,("MӤ!%Dv,%P{?W+\[KРnDBB ؼ>+f_ PdhcCղ #{'WRtx`O%0c .UN\-˜ UT` $@ 3)"XUu~P 1y3 itFV \o9V`"#QUiܼ58.8:~/fmZ06 cM^̑~) jXp XϲfFI$ * "+fEjuE12SjY&#r O<AE^Tƺz8nm_ޮ\"̆Y[`Yb6˜'BsugIڂʲ"d  QB)LN@iCwP +!x͔g^pN."qlGCxl|Z'lU^}c?`X+M 8eifٺ”lmD  hmx6/k. CJa@O./7(;d[:coM|Ьb\b h?vkC04. UXW 봯n|!ٻ% )1EB({Ϋ]lءxۦk?DW`Ls}|؟)$st)H0Xj׉h>PeY:>(l8&pٺ1X,xB8 /fK[p7+H`%?.h+Y<@J[1q ,'1r}[;~wuZbͧ 9o"WL@Rzfm02J2]50mN ;군^dxo۞x61%Qh[S8ylǎDTU*1ػ]ЭE\7.5aG`8o l-3lR@IFT))e2 ,{ZB݆Vk#/Z@ޫ@KK3ʺ>#-h[ ֲo9kiɧ9n_^$§xRD.1*1l\1OvքMuXv%¯hGȵGCpm3z&׬ y/N}rO1UI^䢪o`\V,>O֚q҂5r0즤gsP5[0LWHѱ#hʶP+aX!BD|b ,l"m~y<9""3Zo_a9*GnS;Y48϶S=>[z=W' 2ڿ=5߻#XQtRU1#>,>/čqBF,"Mӎ|glJW.&K.J͑rZ/jo0A@*>*/@455!y}jf<,ш $qgG{*02dc7K6~{hM6P˵il`m_Ty7׷ ]έFkJ6߿cP3ںF:O`qth #IQ%\e)&2P_ Ea)%O&( tzf0~E,׉Z Y0KOڕo>, FB`p"A# p!$՜CRJ]:*Wr;|swF}G GC@99@,@F!؜K74G\P ~Y0 yfc,txW0H dQ{H9Z1}CeP Rv@"⃃Wyڷ.!U W?7Ȇ-j~A8XW*5Vbx@$ƣ 3{ETU6MRʏ@8G/ GQ@@#(,VL Bp`M|#KC${|q;X {`%dWQT@Pm"  9xAf ihbF^V\bZx+F hHb4}N5X5M8ckT: /D.-NxuzYo/U*GDL`P"3RB"2g}ߖ6;S >H@.,d $ABp81,td^ /ǯA@Ef껱!CEb(⥰ +%X;6S ؝{bVάP-nÞjA.d)du}'&z4je}jN`0faMw3.p]ᨇN^ `I`)A0$# R|cNf#y}*>Zj0G֚5@ڀO9b +)PE ~u5@M9S D4X`oqq/yYfrqeYKEy׿fUJZ@P}YX)dօ{"c#dFAXDpdLAl "@D`I #$X RfKVJ`%$#-K$TRJ>Q,FT]EVJ -63rTu_*1F)Escָ_ߦ53LHpp8Q2 wZij a# dhql |rۥpj,rvU LZ߆m\ԊڈQlD`MaC,RK*B\jjf6K6< H Z,`X?/JK X`i鲍Q @Zm,В:I,Rđ$Rؾ$ $, HR@ pTM]BV[nLH"W:V A,owEwP7IA!],m =J=$a`84'-͠Pi[tS9M JcHk2TiUŨJ[*mB m641ЮְA0n7 *tJ `EiI[Y%' +Ė`_^ۮ"KbY4J(&`%QL$GM$#AZ)XG :8,$ #ߎoB@IVDLf&"Yq=' .ʞ6E<\Sz(6ô0hߗJ%P2=X9B~f4UEQq78'%7gX1\z.3[,u2h+20AY(`OtR:u!2r[g,K=]!SQj,nNbJUaP l0d$L$a"$HĒ9lb)HB  p`bKp$ :Q-P4xuγ) QDI!}M܂ bJg 35+/a!Rn?nnoumVഀ$E%_wϕM]ͿvGX_Zc Fd0j;* :{"]>S *g~"(D#P+K`3g4W胏i8! Œ~B?2 TLB@I!"$@(b%5% RXH2N~Hes#a"'#*IY`(l);VԠCGIDATD+a"EL$cE)aTHh%+,")I%eZA6lN;{zf,*eмeۈKXYPۛІ胏l?o^dV&Ke)RĊG8D8"VJ0J jZUp$#HZ˒rHQbҙyسLRS#&}D]D }E\>w`tDx =8yc>x*D f~ڛg%Sg0X54Iyh4UeYV5V\*p+wj6 a!lӍ2a] Pa֦G!ewuyH<~0Y2瑙s"zoCh X{cLQ@*e:c3r9djWv DKa8Ƿ?=ADY*f~DVQlNS H*e,bP ry҉]$Vw@m]?ʣt$C(-yx}yYwGQtDePdefe 7֘fnݾ}M.5|$_4!p*bYK;P Xox]=nb{:i׆۰Ԯh PgmJkҾMUUFkmʲDď>@͓\oOl6ˎ;@wXFB+dtE%m?JumX]20ffmݧ2hf6 G`LUUֺX-kgY.RWUeYLUUw{N=\֭7wܹm!= 1l6+'I@e_-f&G޲wB]v+phcLa L KG{ʨM{OUUl᪪JE2eY;]oGsr|p !(D"{;w} lW@5,KLuփ=1|ppVEib0\ozE0@ \)DJ_/.3^U²[]5!es@z5?Ʋ`D~N \i'CV?qDDRJH)o1 .PK1|[QP@IDʵm<{n`B 0yk//_"駟9Oà 6Ƙ(xoooQUvAAXB IzVͲܱcW8`2UUeYy8ee(( >GIZk]孕;XYlǚB5G|3`Xs3{V۟3smkۭ5ub8:Wv{m FNo$".ʲ*U(ʲUUEQHKǦ(,<|-jXZ,z6<[ jVJwk㠰֗ۻ93=;kk`k )z+B ^H\;r BdNABB!()AL]?tW՗CW̮q?5==m?!t0Ff!F-O>=v=`MA-΢Xm~l_th0d2g5]i8`NR3}(wvvΎzDDL8DG9gcM0Rn?\1?[ X-$p02U hɢՌ<XbJnm]|ׂW|uop&AEQQq$ѥK'˲%վY]R3e~&ȨSDʳ.uPu̴4'!(FA*e%]X2$dE߮vq- HN Ϙ-:{#L`6ywkefmRn+|~5SJ 7,+8n;'Zk2&i _^8}Ss @ooo>ܯ:4͂:,.;s‹ + naB Pni[fXR9A"Mnrζ]sgZk!ZkTV-R/o+bQǸqn,1?kOV'H7AŮ8\JP)‹msKZv WJ1)%iq\Jɜ֚+i|s㜻9dvs.cqz7j ܐE E }nIOP 3++23J~oϝ;oD$5ZR5ٍp,;l Bym/VAzS=?}v|:|'8277v:DZtZIa}3Ƥy;mU nNnB06>+@k>{5p}=kkk<4 gAQIl89K4Vݞ E:4!3J٦> 7y.pQ:w!ny1ƊQ 64|ۀ;$O?M?wvv~_&gd}@)3_iP&p,c0ͅvk{AA77޸f'ykbDt`069FxEp7>{:[:;N ` ntY{ Ο?y֯Y/-0ԯ$&4VQu^C)ʍCG}Zm7AmA{.1voejBϴM֐?4{^vv1`uR:&RQ́pRJZ99`6Q2]T*e^qlKM&E#ÇhYKnTǃVAcTXf&\: yoz]Dj 9 ZD*kR 7+Ǩ2S;m!h滺sz]pyp0 5'44cE%^e?8$:n`ڥBI*pRo A#((0 ]-[kW[URp>' 0)А&E#!ĝqw8"y)4bI?M;cf# O뾿 C# V;0 WV:S;0ͽ0 'O꾿 C#vcl>V5O{b>%1Q2QMglP"f cx{ܠ>4`A =$0}%7;B۾ԶEt Fp{p 9s[ݠ4` @ppaaa5I͕K\B}c2k#nR4` AD ZmƄ%sl*m;X;,>m9KCK/TnP0q+sqˎ&n$woi_J+j?wuWA hlDw-//ǝN,+̳b3H>}@C`iiȁn[ ]v+1F뫯ȑ#WnP0cnnU`jo1v}Vl@+X__ 30Iۇ(Xmqw{fmWK;hsɅM^H=miZ}yQĖ/`QJ՗_~gGguHw]xwUc9sI^EBWa,ˊJ 6RIJISk^D2oܐC#0nBܮDwcc DdZ&1Ғh{ݶLٱ11 c|7ɓ' 0"k.@1`IQcRJ!2KhKDKPrHiUw,g9cct~ϽǏٳupycccs0deֆT"vnON?W{뒶N Wԯ4'8u)ywO ~/,˴CβI^]^JRJ]Uf<6Ջ@ Ar@)[[[^$o9sfɓ6Q mJX`W?^y啿>zhטjKZKf# k;8*];YK)m\`LX%s>*bB_!By^c1v ỳ6lѦYb 0ry Vq캝Ph p[B{Z6澵 {w}iBwb0T5fsclƺ;׮P1m%ޕR\ 4?裏wީ/uC`nnN߬ !2'Wjg ",g̶071p=ι0m>˙aDrRisD җL;v1` Jp+w/fL0nxpɀő2Ɗs%a~vfq|UyhEv[+4)6Ҡ#n|g'(n(;8^Mpv$I7Iv$I0s"MS.^mllõ`{{;K4ͲL,˲,ML) 2FC (TȅE9YSzk۬Gub>ZkNDLkku@DܝPJ1"rImF3TΈhhZki%I4ǤZ9&%wɼ|PFEcǎᅬ3g\p }D[D"VJ(nͲPeA-IJQ14MBi*z=nnn`0i4MRaeʘVj2o*,@^13d#8xF<p3 5(nҐ efjpKk `1c c;gvzl!]*-6~`  *3_hא$H$I“$8x>I$I8>E]~!\Rf> 62"MSeβLfY&4&>2}I)Ō_̕R\k͌y\M)c>Kp8ZDlM:2ceZKJu{i׵}CkkJ!F{Rʔ2`ғZw5̯ *P&l>ʊ8p/^o3%tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքIENDB`vokoscreenNG-3.1.0/src/audio/000077500000000000000000000000001416353147400160165ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/audio/linux/000077500000000000000000000000001416353147400171555ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/audio/linux/QvkAudioController.cpp000066400000000000000000000117111416353147400234510ustar00rootroot00000000000000/* 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 #include #include "QvkAudioController.h" #include "QvkPulseAudioWatcher.h" #include "QvkPulseAudioServer.h" #include "QvkPulseAudioDevices.h" #include "global.h" QvkAudioController::QvkAudioController( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; } QvkAudioController::~QvkAudioController() { } void QvkAudioController::init() { connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->labelAudioCodec, SLOT( setEnabled( bool ) ) ); connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->comboBoxAudioCodec, SLOT( setEnabled( bool ) ) ); getAllDevices(); QvkPulseAudioWatcher *vkPulseAudioWatcher = new QvkPulseAudioWatcher( ui ); vkPulseAudioWatcher->start_monitor(); } void QvkAudioController::getAllDevices() { QStringList list; if ( QvkPulseAudioServer::isAvailable() ) { list << QvkPulseAudioDevices::getAllDevices(); } 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 << "[Audio] 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 ); } else { QLabel *label = new QLabel(); label->setText( "PulseAudio\n" ); label->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( label ); QLabel *labelText = new QLabel(); labelText->setText( "No device found for audio recording." ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( labelText ); } slot_audioDeviceSelected(); } void QvkAudioController::slot_audioDeviceSelected() { audioIconOnOff( isAudioDeviceSelected() ); } bool QvkAudioController::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 QvkAudioController::audioIconOnOff( bool state ) { QIcon myIcon( ":/pictures/screencast/microphone.png" ); if ( state == false ) { 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(); int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, workPixmap ); emit signal_haveAudioDeviceSelected( false ); } else { int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, myIcon ); emit signal_haveAudioDeviceSelected( true ); } } vokoscreenNG-3.1.0/src/audio/linux/QvkAudioController.h000066400000000000000000000025671416353147400231270ustar00rootroot00000000000000 /* 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 QVKAUDIOCONTROLLER_H #define QVKAUDIOCONTROLLER_H #include #include "ui_formMainWindow.h" class QvkAudioController: public QObject { Q_OBJECT public: QvkAudioController( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkAudioController(); void init(); public slots: private: Ui_formMainWindow *ui; void getAllDevices(); bool isAudioDeviceSelected(); void audioIconOnOff( bool state ); private slots: void slot_audioDeviceSelected(); protected: signals: void signal_haveAudioDeviceSelected( bool ); }; #endif vokoscreenNG-3.1.0/src/audio/linux/QvkDevices.c000066400000000000000000000170211416353147400213660ustar00rootroot00000000000000 #include #include #include #include "QvkDevices.h" // The code is from here // https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/Samples/AsyncDeviceList/ // Field list is here: http://0pointer.de/lennart/projects/pulseaudio/doxygen/structpa__sink__info.html typedef struct pa_devicelist { uint8_t initialized; char name[512]; uint32_t index; char description[256]; } pa_devicelist_t; // This callback gets called when our context changes state. We really only // care about when it's ready or if it has failed void pa_state_cb(pa_context *c, void *userdata) { pa_context_state_t state; int *pa_ready = userdata; state = pa_context_get_state(c); switch (state) { // There are just here for reference case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: default: break; case PA_CONTEXT_FAILED: case PA_CONTEXT_TERMINATED: *pa_ready = 2; break; case PA_CONTEXT_READY: *pa_ready = 1; break; } } // pa_mainloop will call this function when it's ready to tell us about a sink. // Since we're not threading, there's no need for mutexes on the devicelist // structure void pa_sinklist_cb(pa_context *c, const pa_sink_info *l, int eol, void *userdata) { (void)c; pa_devicelist_t *pa_devicelist = userdata; int ctr = 0; // If eol is set to a positive number, you're at the end of the list if (eol > 0) { return; } // We know we've allocated 16 slots to hold devices. Loop through our // structure and find the first one that's "uninitialized." Copy the // contents into it and we're done. If we receive more than 16 devices, // they're going to get dropped. You could make this dynamically allocate // space for the device list, but this is a simple example. for (ctr = 0; ctr < 16; ctr++) { if (! pa_devicelist[ctr].initialized) { strncpy(pa_devicelist[ctr].name, l->name, 511); strncpy(pa_devicelist[ctr].description, l->description, 255); pa_devicelist[ctr].index = l->index; pa_devicelist[ctr].initialized = 1; break; } } } // See above. This callback is pretty much identical to the previous void pa_sourcelist_cb(pa_context *c, const pa_source_info *l, int eol, void *userdata) { (void)c; pa_devicelist_t *pa_devicelist = userdata; int ctr = 0; if (eol > 0) { return; } for (ctr = 0; ctr < 16; ctr++) { if (! pa_devicelist[ctr].initialized) { strncpy(pa_devicelist[ctr].name, l->name, 511); strncpy(pa_devicelist[ctr].description, l->description, 255); pa_devicelist[ctr].index = l->index; pa_devicelist[ctr].initialized = 1; break; } } } int pa_get_devicelist(pa_devicelist_t *input, pa_devicelist_t *output) { // Define our pulse audio loop and connection variables pa_mainloop *pa_ml; pa_mainloop_api *pa_mlapi; pa_operation *pa_op; pa_context *pa_ctx; // We'll need these state variables to keep track of our requests int state = 0; int pa_ready = 0; // Initialize our device lists memset(input, 0, sizeof(pa_devicelist_t) * 16); memset(output, 0, sizeof(pa_devicelist_t) * 16); // Create a mainloop API and connection to the default server pa_ml = pa_mainloop_new(); pa_mlapi = pa_mainloop_get_api(pa_ml); pa_ctx = pa_context_new(pa_mlapi, "test"); // This function connects to the pulse server pa_context_connect(pa_ctx, NULL, 0, NULL); // This function defines a callback so the server will tell us it's state. // Our callback will wait for the state to be ready. The callback will // modify the variable to 1 so we know when we have a connection and it's // ready. // If there's an error, the callback will set pa_ready to 2 pa_context_set_state_callback(pa_ctx, pa_state_cb, &pa_ready); // Now we'll enter into an infinite loop until we get the data we receive // or if there's an error for (;;) { // We can't do anything until PA is ready, so just iterate the mainloop // and continue if ( pa_ready == 0 ) { pa_mainloop_iterate(pa_ml, 1, NULL); continue; } // We couldn't get a connection to the server, so exit out if ( pa_ready == 2 ) { pa_context_disconnect(pa_ctx); pa_context_unref(pa_ctx); pa_mainloop_free(pa_ml); return -1; } // At this point, we're connected to the server and ready to make // requests switch ( state ) { // State 0: we haven't done anything yet case 0: // This sends an operation to the server. pa_sinklist_info is // our callback function and a pointer to our devicelist will // be passed to the callback The operation ID is stored in the // pa_op variable pa_op = pa_context_get_sink_info_list( pa_ctx, pa_sinklist_cb, output ); // Update state for next iteration through the loop state++; break; case 1: // Now we wait for our operation to complete. When it's // complete our pa_output_devicelist is filled out, and we move // along to the next state if ( pa_operation_get_state( pa_op ) == PA_OPERATION_DONE ) { pa_operation_unref( pa_op ); // Now we perform another operation to get the source // (input device) list just like before. This time we pass // a pointer to our input structure pa_op = pa_context_get_source_info_list( pa_ctx, pa_sourcelist_cb, input ); // Update the state so we know what to do next state++; } break; case 2: if ( pa_operation_get_state( pa_op ) == PA_OPERATION_DONE ) { // Now we're done, clean up and disconnect and return pa_operation_unref(pa_op); pa_context_disconnect(pa_ctx); pa_context_unref(pa_ctx); pa_mainloop_free(pa_ml); return 0; } break; default: // We should never see this state fprintf(stderr, "in state %d\n", state); return -1; } // Iterate the main loop and go again. The second argument is whether // or not the iteration should block until something is ready to be // done. Set it to zero for non-blocking. pa_mainloop_iterate(pa_ml, 1, NULL); } // end for } const char *get_all_audio_devices() { // This is where we'll store the input device list pa_devicelist_t pa_input_devicelist[16]; // This is where we'll store the output device list pa_devicelist_t pa_output_devicelist[16]; static char s[4096]; for(int i = 0; i < 4096; ++i) s[i] = 0; if ( pa_get_devicelist(pa_input_devicelist, pa_output_devicelist) < 0 ) { fprintf(stderr, "failed to get device list\n"); return s; } for ( int ctr = 0; ctr < 16; ctr++) { if ( ! pa_input_devicelist[ctr].initialized ) { break; } strcat( s, pa_input_devicelist[ctr].name); strcat( s, ":::" ); strcat( s, pa_input_devicelist[ctr].description); strcat( s, "---" ); } return s; } vokoscreenNG-3.1.0/src/audio/linux/QvkDevices.h000066400000000000000000000001531416353147400213710ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif const char *get_all_audio_devices(); #ifdef __cplusplus } #endif vokoscreenNG-3.1.0/src/audio/linux/QvkPulseAudioDevices.cpp000066400000000000000000000025521416353147400237240ustar00rootroot00000000000000 /* 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 "QvkDevices.h" #include "QvkPulseAudioDevices.h" #include "QvkPulseAudioServer.h" QvkPulseAudioDevices::QvkPulseAudioDevices() { } QvkPulseAudioDevices::~QvkPulseAudioDevices() { } QStringList QvkPulseAudioDevices::getAllDevices() { QStringList list; if ( QvkPulseAudioServer::isAvailable() ) { const char *ss = get_all_audio_devices(); QString s1 = QString::fromUtf8( ss ); QString s2 = s1.left( QString::fromUtf8( ss ).count() - 3 ); list = s2.split( "---" ); } return list; } vokoscreenNG-3.1.0/src/audio/linux/QvkPulseAudioDevices.h000066400000000000000000000022031416353147400233620ustar00rootroot00000000000000/* 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 QVKPULSEAUDIODEVICES_H #define QVKPULSEAUDIODEVICES_H #include class QvkPulseAudioDevices: public QObject { Q_OBJECT public: QvkPulseAudioDevices(); virtual ~QvkPulseAudioDevices(); static QStringList getAllDevices(); public slots: private: private slots: protected: signals: }; #endif vokoscreenNG-3.1.0/src/audio/linux/QvkPulseAudioServer.cpp000066400000000000000000000037751416353147400236200ustar00rootroot00000000000000/* 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 "QvkPulseAudioServer.h" QvkPulseAudioServer::QvkPulseAudioServer() { } QvkPulseAudioServer::~QvkPulseAudioServer() { } bool QvkPulseAudioServer::isAvailable() { // pulseaudio connection pa_simple *paConnection = NULL; // format specifier static pa_sample_spec sspec; sspec.channels = 2; sspec.format = PA_SAMPLE_S16LE; sspec.rate = 44100; int error = 0; paConnection = pa_simple_new( NULL, // default PA server "Test libpulse", // app name PA_STREAM_RECORD, // stream direction NULL, // default device "record", // stream name &sspec, // format spec NULL, // default channel map NULL, // may be NULL for defaults, but we want tweak! &error ); bool value; if( ! paConnection ) { //fprintf( stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror( error ) ); value = false; } else { pa_simple_free( paConnection ); //printf( "Connected to PulseAudio server ok.\n" ); value = true; } return value; } vokoscreenNG-3.1.0/src/audio/linux/QvkPulseAudioServer.h000066400000000000000000000021641416353147400232540ustar00rootroot00000000000000 /* 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 QVKPULSEAUDIOSERVER_H #define QVKPULSEAUDIOSERVER_H #include class QvkPulseAudioServer: public QObject { Q_OBJECT public: QvkPulseAudioServer(); virtual ~QvkPulseAudioServer(); static bool isAvailable(); public slots: private: private slots: protected: signals: }; #endif vokoscreenNG-3.1.0/src/audio/linux/QvkPulseAudioWatcher.cpp000066400000000000000000000170221416353147400237350ustar00rootroot00000000000000/* 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 "QvkPulseAudioWatcher.h" #include "QvkPulseAudioDevices.h" #include "global.h" #include #include #include #include #include /* * QvkWatcherPlug monitoring only new or removed Audiodevices. */ QvkPulseAudioWatcher::QvkPulseAudioWatcher( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; timer = new QTimer( this ); timer->setTimerType( Qt::PreciseTimer ); timer->setInterval( 3000 ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_update() ) ); connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->labelAudioCodec, SLOT( setEnabled( bool ) ) ); connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->comboBoxAudioCodec, SLOT( setEnabled( bool ) ) ); } QvkPulseAudioWatcher::~QvkPulseAudioWatcher() {} void QvkPulseAudioWatcher::start_monitor() { timer->start(); } void QvkPulseAudioWatcher::slot_update() { ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignLeft ); QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); QStringList list = QvkPulseAudioDevices::getAllDevices(); QStringList stringListCheckBox; for ( int i = 0; i < listCheckBox.count(); i++ ) { stringListCheckBox.append( listCheckBox.at(i)->accessibleName() ); } QStringList stringListAudio_Device; for ( int i = 0; i < list.count(); i++ ) { stringListAudio_Device.append( list.at(i).section( ":::", 0, 0 ) ); } QList deleteLabel = ui->scrollAreaAudioDevice->findChildren(); for ( int x = 0; x < deleteLabel.count(); x ++ ) { delete deleteLabel.at(x); } // Add new Device if ( list.count() > listCheckBox.count() ) { // Remove SpacerItem for (int i = 0; i < ui->verticalLayoutAudioDevices->count(); ++i) { QLayoutItem *layoutItem = ui->verticalLayoutAudioDevices->itemAt(i); if ( layoutItem->spacerItem() ) { ui->verticalLayoutAudioDevices->removeItem( layoutItem ); delete layoutItem; --i; } } for ( int i = 0; i < stringListAudio_Device.count(); i++ ) { if ( stringListCheckBox.contains( stringListAudio_Device.at(i) ) == false ) { QString name = list.at(i).section( ":::", 1, 1 ); QString device = list.at(i).section( ":::", 0, 0 ); qDebug().noquote() << global::nameOutput << "[PulseAudio] Added:" << name << "Device:" << device; 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->addWidget( checkboxAudioDevice ); } } QSpacerItem *verticalSpacerAudioDevices = new QSpacerItem( 20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding ); ui->verticalLayoutAudioDevices->addSpacerItem( verticalSpacerAudioDevices ); slot_audioDeviceSelected(); } // Remove device if ( list.count() < listCheckBox.count() ) { for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( stringListAudio_Device.contains( listCheckBox.at(i)->accessibleName() ) == false ) { qDebug().noquote() << global::nameOutput << "[PulseAudio] Removed:" << listCheckBox.at(i)->text() << "Device:" << listCheckBox.at(i)->accessibleName(); delete listCheckBox.at(i); } } slot_audioDeviceSelected(); } if ( list.empty() ) { // Remove SpacerItem for (int i = 0; i < ui->verticalLayoutAudioDevices->count(); ++i) { QLayoutItem *layoutItem = ui->verticalLayoutAudioDevices->itemAt(i); if ( layoutItem->spacerItem() ) { ui->verticalLayoutAudioDevices->removeItem( layoutItem ); delete layoutItem; --i; } } QList deleteLabel = ui->verticalLayoutAudioDevices->findChildren(); for ( int x = 0; x < deleteLabel.count(); x ++ ) { delete deleteLabel.at(x); } QLabel *label = new QLabel(); label->setText( "PulseAudio\n" ); label->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( label ); QLabel *labelText = new QLabel(); labelText->setText( "No device found for audio recording." ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( labelText ); slot_audioDeviceSelected(); } } void QvkPulseAudioWatcher::slot_audioDeviceSelected() { audioIconOnOff( isAudioDeviceSelected() ); } bool QvkPulseAudioWatcher::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 QvkPulseAudioWatcher::audioIconOnOff( bool state ) { QIcon myIcon( ":/pictures/screencast/microphone.png" ); if ( state == false ) { 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(); int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, workPixmap ); emit signal_haveAudioDeviceSelected( false ); } else { int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, myIcon ); emit signal_haveAudioDeviceSelected( true ); } } vokoscreenNG-3.1.0/src/audio/linux/QvkPulseAudioWatcher.h000066400000000000000000000026541416353147400234070ustar00rootroot00000000000000/* 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 QVKPULSEAUDIOWATCHER_H #define QVKPULSEAUDIOWATCHER_H #include "ui_formMainWindow.h" #include #include class QvkPulseAudioWatcher: public QObject { Q_OBJECT public: QvkPulseAudioWatcher( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkPulseAudioWatcher(); void start_monitor(); public slots: private: Ui_formMainWindow *ui; QTimer *timer; bool isAudioDeviceSelected(); void audioIconOnOff(bool state); private slots: void slot_update(); void slot_audioDeviceSelected(); protected: signals: void signal_haveAudioDeviceSelected( bool ); }; #endif vokoscreenNG-3.1.0/src/audio/linux/audioLinux.pri000066400000000000000000000007641416353147400220210ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkAudioController.h \ $$PWD/QvkPulseAudioWatcher.h \ $$PWD/QvkPulseAudioServer.h \ $$PWD/QvkPulseAudioDevices.h \ $$PWD/QvkDevices.h SOURCES += $$PWD/QvkAudioController.cpp \ $$PWD/QvkPulseAudioWatcher.cpp \ $$PWD/QvkPulseAudioServer.cpp \ $$PWD/QvkPulseAudioDevices.cpp \ $$PWD/QvkDevices.c vokoscreenNG-3.1.0/src/audio/windows/000077500000000000000000000000001416353147400175105ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/audio/windows/DirectSound/000077500000000000000000000000001416353147400217335ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/audio/windows/DirectSound/QvkDirectSoundController.cpp000066400000000000000000000155041416353147400274150ustar00rootroot00000000000000/* 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 "QvkDirectSoundController.h" #include #include #include #include QvkDirectSoundController::QvkDirectSoundController( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; } QvkDirectSoundController::~QvkDirectSoundController() { } /* * Set a new icon with a red cross */ void QvkDirectSoundController::slot_audioIconOnOff( bool state ) { QIcon myIcon( ":/pictures/screencast/microphone.png" ); if ( state == false ) { 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(); int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, workPixmap ); } else { int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, myIcon ); } } void QvkDirectSoundController::init() { vkDirectSoundWatcher = new QvkDirectSoundWatcher( ui ); vkDirectSoundWatcher->start_monitor(); connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->labelAudioCodec, SLOT( setEnabled( bool ) ) ); connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->comboBoxAudioCodec, SLOT( setEnabled( bool ) ) ); connect( vkDirectSoundWatcher->lineEditDiretSoundAudioPlug, SIGNAL( textChanged( QString ) ), this, SLOT( slot_pluggedInOutDevice( QString ) ) ); } void QvkDirectSoundController::getAllDevices() { int count = ui->verticalLayoutAudioDevices->count(); for ( int i = 0; i < count; ++i ) { QLayoutItem *layoutItem = ui->verticalLayoutAudioDevices->itemAt(i); if ( layoutItem->spacerItem() ) { ui->verticalLayoutAudioDevices->removeItem( layoutItem ); delete layoutItem; } } QList list = QAudioDeviceInfo::availableDevices( QAudio::AudioInput ); if ( !list.empty() ) { for ( int i = 0; i < list.count(); i++ ) { QCheckBox *checkboxAudioDevice = new QCheckBox(); 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 DirectSound] found device:" << list.at(i).deviceName(); connect( checkboxAudioDevice, SIGNAL(clicked(bool)),this,SLOT(slot_audioDeviceSelected() ) ); } qDebug(); QSpacerItem *verticalSpacerAudioDevices = new QSpacerItem( 20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding ); ui->verticalLayoutAudioDevices->addSpacerItem( verticalSpacerAudioDevices ); } else { QList listLabel = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listLabel.count(); i++ ) { ui->verticalLayoutAudioDevices->removeWidget( listLabel.at(i) ); delete listLabel.at(i); } QLabel *label = new QLabel(); label->setText( "DirectSound\n" ); label->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( label ); QLabel *labelText = new QLabel(); labelText->setText( "No device found for audio recording." ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( labelText ); emit signal_haveAudioDeviceSelected( false ); } } void QvkDirectSoundController::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; } } slot_audioIconOnOff( value ); emit signal_haveAudioDeviceSelected( value ); } void QvkDirectSoundController::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.1.0/src/audio/windows/DirectSound/QvkDirectSoundController.h000066400000000000000000000030231416353147400270530ustar00rootroot00000000000000/* 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 QVKDIRECTSOUNDCONTROLLER_H #define QVKDIRECTSOUNDCONTROLLER_H #include "ui_formMainwindow.h" #include #include "QvkDirectSoundWatcher.h" class QvkDirectSoundController: public QObject { Q_OBJECT public: QvkDirectSoundController( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkDirectSoundController(); void init(); void getAllDevices(); QvkDirectSoundWatcher *vkDirectSoundWatcher; public slots: void slot_audioDeviceSelected(); private: Ui_formMainWindow *ui; private slots: void slot_pluggedInOutDevice( QString string ); void slot_audioIconOnOff( bool state ); protected: signals: void signal_haveAudioDeviceSelected( bool ); }; #endif vokoscreenNG-3.1.0/src/audio/windows/DirectSound/QvkDirectSoundWatcher.cpp000066400000000000000000000075631416353147400266750ustar00rootroot00000000000000/* 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 "QvkDirectSoundWatcher.h" #include "global.h" #include #include /* * QvkWatcherPlug monitoring only new or removed Audiodevices. */ QvkDirectSoundWatcher::QvkDirectSoundWatcher( Ui_formMainWindow *ui_mainwindow ) { lineEditDiretSoundAudioPlug = new QLineEdit; ui = ui_mainwindow; timer = new QTimer( this ); timer->setTimerType( Qt::PreciseTimer ); timer->setInterval( 3000 ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_update() ) ); } QvkDirectSoundWatcher::~QvkDirectSoundWatcher() {} void QvkDirectSoundWatcher::start_monitor() { timer->start(); } void QvkDirectSoundWatcher::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 DirectSound] Added:" << name << "Device:" << device; QString audioDevicePlug = ""; audioDevicePlug.append( "[Audio-device-added]" ); audioDevicePlug.append( ":"); audioDevicePlug.append( name ); audioDevicePlug.append( ":"); audioDevicePlug.append( device ); lineEditDiretSoundAudioPlug->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 DirectSound] Removed:" << name << "Device:" << device; QString audioDevicePlug = ""; audioDevicePlug.append( "[Audio-device-removed]" ); audioDevicePlug.append( ":"); audioDevicePlug.append( name ); audioDevicePlug.append( ":"); audioDevicePlug.append( device ); lineEditDiretSoundAudioPlug->setText( audioDevicePlug ); } } } } vokoscreenNG-3.1.0/src/audio/windows/DirectSound/QvkDirectSoundWatcher.h000066400000000000000000000025211416353147400263270ustar00rootroot00000000000000/* 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 QVKDIRECTSOUNDWATCHER_H #define QVKDIRECTSOUNDWATCHER_H #include "ui_formMainWindow.h" #include #include class QvkDirectSoundWatcher: public QObject { Q_OBJECT public: QvkDirectSoundWatcher( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkDirectSoundWatcher(); void start_monitor(); QLineEdit *lineEditDiretSoundAudioPlug; QTimer *timer; public slots: private: Ui_formMainWindow *ui; int counter; private slots: void slot_update(); protected: signals: }; #endif vokoscreenNG-3.1.0/src/audio/windows/QvkAudioController.cpp000066400000000000000000000071641416353147400240130ustar00rootroot00000000000000/* 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 "QvkAudioController.h" #include QvkAudioController::QvkAudioController( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; radioButtonDirectSound = new QRadioButton(); radioButtonDirectSound->setObjectName( "radioButtonDirectSound" ); radioButtonDirectSound->setText( "DirectSound" ); radioButtonWASAPI = new QRadioButton(); radioButtonWASAPI->setObjectName( "radioButtonWASAPI" ); radioButtonWASAPI->setText( "WASAPI" ); QHBoxLayout *hBoxLayout = new QHBoxLayout; ui->verticalLayout_4->insertLayout( 0, hBoxLayout ); hBoxLayout->addWidget( radioButtonDirectSound ); hBoxLayout->addWidget( radioButtonWASAPI ); QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); hBoxLayout->addSpacerItem( spacer ); vkWASAPIController = new QvkWASAPIController( ui ); vkDirectSoundController = new QvkDirectSoundController( ui ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), radioButtonDirectSound, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), radioButtonWASAPI, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), radioButtonDirectSound, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), radioButtonWASAPI, SLOT( setDisabled( bool ) ) ); connect( radioButtonWASAPI, SIGNAL( toggled( bool ) ), this, SLOT( slot_WASAPI( bool ) ) ); connect( radioButtonDirectSound, SIGNAL( toggled( bool ) ), this, SLOT( slot_DirectSound( bool ) ) ); vkWASAPIController->init(); vkDirectSoundController->init(); } QvkAudioController::~QvkAudioController() { } void QvkAudioController::slot_WASAPI( bool value ) { Q_UNUSED(value); vkDirectSoundController->vkDirectSoundWatcher->timer->stop(); QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { ui->verticalLayoutAudioDevices->removeWidget( listCheckBox.at(i) ); delete listCheckBox.at(i); } vkWASAPIController->getAllDevices(); vkWASAPIController->slot_audioDeviceSelected(); vkWASAPIController->vkWASAPIWatcher->timer->start(); } void QvkAudioController::slot_DirectSound( bool value ) { Q_UNUSED(value); vkWASAPIController->vkWASAPIWatcher->timer->stop(); QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { ui->verticalLayoutAudioDevices->removeWidget( listCheckBox.at(i) ); delete listCheckBox.at(i); } vkDirectSoundController->getAllDevices(); vkDirectSoundController->slot_audioDeviceSelected(); vkDirectSoundController->vkDirectSoundWatcher->timer->start(); } vokoscreenNG-3.1.0/src/audio/windows/QvkAudioController.h000066400000000000000000000030071416353147400234500ustar00rootroot00000000000000/* 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 QVKAUDIOCONTROLLER_H #define QVKAUDIOCONTROLLER_H #include "ui_formMainWindow.h" #include "WASAPI/QvkWASAPIController.h" #include "DirectSound/QvkDirectSoundController.h" #include class QvkAudioController: public QObject { Q_OBJECT public: QvkAudioController( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkAudioController(); Ui_formMainWindow *ui; QRadioButton *radioButtonWASAPI; QRadioButton *radioButtonDirectSound; QvkWASAPIController *vkWASAPIController; QvkDirectSoundController *vkDirectSoundController; public slots: private: private slots: void slot_WASAPI( bool value ); void slot_DirectSound( bool value ); protected: signals: }; #endif vokoscreenNG-3.1.0/src/audio/windows/WASAPI/000077500000000000000000000000001416353147400204745ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/audio/windows/WASAPI/QvkWASAPIController.cpp000066400000000000000000000173141416353147400247200ustar00rootroot00000000000000/* 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 "QvkWASAPIController.h" #include "global.h" #include #include #include QvkWASAPIController::QvkWASAPIController(Ui_formMainWindow *ui_mainwindow) { ui = ui_mainwindow; } QvkWASAPIController::~QvkWASAPIController() { } /* * Set a new icon with a red cross */ void QvkWASAPIController::slot_audioIconOnOff( bool state ) { QIcon myIcon( ":/pictures/screencast/microphone.png" ); if ( state == false ) { 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(); int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, workPixmap ); } else { int index = ui->tabWidgetScreencast->indexOf( ui->tabAudio ); ui->tabWidgetScreencast->setTabIcon( index, myIcon ); } } void QvkWASAPIController::init() { vkWASAPIWatcher = new QvkWASAPIWatcher( ui ); connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->labelAudioCodec, SLOT( setEnabled( bool ) ) ); connect( this, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), ui->comboBoxAudioCodec, SLOT( setEnabled( bool ) ) ); connect( vkWASAPIWatcher->lineEditWASAPIAudioPlug, SIGNAL( textChanged( QString ) ), this, SLOT( slot_pluggedInOutDevice( QString ) ) ); } void QvkWASAPIController::getAllDevices() { int count = ui->verticalLayoutAudioDevices->count(); for ( int i = 0; i < count; ++i ) { QLayoutItem *layoutItem = ui->verticalLayoutAudioDevices->itemAt(i); if ( layoutItem->spacerItem() ) { ui->verticalLayoutAudioDevices->removeItem( layoutItem ); delete layoutItem; } } QvkWASAPIGstreamer vkWASAPIGstreamer; QStringList list; list << vkWASAPIGstreamer.get_all_Audio_Source_devices(); list << vkWASAPIGstreamer.get_all_Audio_Playback_devices(); if ( !list.empty() ) { for ( int i = 0; i < list.count(); i++ ) { QCheckBox *checkboxAudioDevice = new QCheckBox(); checkboxAudioDevice->setText( QString( list.at(i) ).section( ":::", 1, 1 ) ); QString device = QString( list.at(i).section( ":::", 0, 0 ) ); device.append( ":::" ); device.append( QString( list.at(i).section( ":::", 2, 2 ) ) ); checkboxAudioDevice->setAccessibleName( device ); checkboxAudioDevice->setObjectName( "checkboxAudioDevice-" + QString::number( i ) ); ui->verticalLayoutAudioDevices->addWidget( checkboxAudioDevice ); qDebug().noquote() << global::nameOutput << "[Audio WASAPI] Found:" << QString( list.at(i) ).section( ":::", 1, 1 ) << "Device:" << QString( list.at(i) ).section( ":::", 0, 0 ) << "Input/Output:" << QString( list.at(i) ).section( ":::", 2, 2 ); connect( checkboxAudioDevice, SIGNAL( clicked( bool ) ), this, SLOT( slot_audioDeviceSelected() ) ); connect( checkboxAudioDevice, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkBox( bool ) ) ); } qDebug().noquote(); QSpacerItem *verticalSpacerAudioDevices = new QSpacerItem( 20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding ); ui->verticalLayoutAudioDevices->addSpacerItem( verticalSpacerAudioDevices ); } else { QList listLabel = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listLabel.count(); i++ ) { ui->verticalLayoutAudioDevices->removeWidget( listLabel.at(i) ); delete listLabel.at(i); } QLabel *label = new QLabel(); label->setText( "WASAPI\n" ); label->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( label ); QLabel *labelText = new QLabel(); labelText->setText( "No device found for audio recording." ); ui->verticalLayoutAudioDevices->setAlignment( Qt::AlignCenter ); ui->verticalLayoutAudioDevices->addWidget( labelText ); } } void QvkWASAPIController::slot_checkBox( bool value ) { QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( listCheckBox.at(i)->underMouse() ) { for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( listCheckBox.at(i)->isChecked() ) { listCheckBox.at(i)->setChecked( false ); } } listCheckBox.at(i)->setChecked( value ); } } } void QvkWASAPIController::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; } } slot_audioIconOnOff( value ); emit signal_haveAudioDeviceSelected( value ); } void QvkWASAPIController::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() ) ); connect( checkboxAudioDevice, SIGNAL( clicked( bool ) ), this, SLOT( slot_checkBox( bool ) ) ); checkboxAudioDevice->setText( name ); checkboxAudioDevice->setAccessibleName( device ); QList listAudioDevices = ui->scrollAreaAudioDevice->findChildren(); checkboxAudioDevice->setObjectName( "checkboxAudioDevice-" + QString::number( listAudioDevices.count() ) ); 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.1.0/src/audio/windows/WASAPI/QvkWASAPIController.h000066400000000000000000000030231416353147400243550ustar00rootroot00000000000000/* 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 QVKWASAPICONTROLLER_H #define QVKWASAPICONTROLLER_H #include "ui_formMainWindow.h" #include "QvkWASAPIGstreamer.h" #include "QvkWASAPIWatcher.h" #include class QvkWASAPIController: public QObject { Q_OBJECT public: QvkWASAPIController(Ui_formMainWindow *ui_mainwindow); virtual ~QvkWASAPIController(); void init(); void getAllDevices(); QvkWASAPIWatcher *vkWASAPIWatcher; public slots: void slot_audioDeviceSelected(); void slot_checkBox(bool); private: Ui_formMainWindow *ui; private slots: void slot_pluggedInOutDevice( QString string ); void slot_audioIconOnOff( bool state ); protected: signals: void signal_haveAudioDeviceSelected( bool ); }; #endif vokoscreenNG-3.1.0/src/audio/windows/WASAPI/QvkWASAPIGstreamer.cpp000066400000000000000000000126121416353147400245220ustar00rootroot00000000000000/* 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 "QvkWASAPIGstreamer.h" #include QvkWASAPIGstreamer::QvkWASAPIGstreamer() { } QvkWASAPIGstreamer::~QvkWASAPIGstreamer() { } QString QvkWASAPIGstreamer::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 QvkWASAPIGstreamer::get_all_Audio_Source_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 ).append( ":::" ).append( "Source" ); if ( stringDevice.contains( ".") ) { stringList.append( stringDevice ); } } if ( isMonitorStart == true ) { gst_device_monitor_stop( monitor ); } return stringList; } QStringList QvkWASAPIGstreamer::get_all_Audio_Playback_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/Sink", 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 ).append( ":::" ).append( "Playback" ); if ( stringDevice.contains( ".") ) { stringList.append( stringDevice ); } } if ( isMonitorStart == true ) { gst_device_monitor_stop( monitor ); } return stringList; } vokoscreenNG-3.1.0/src/audio/windows/WASAPI/QvkWASAPIGstreamer.h000066400000000000000000000024131416353147400241650ustar00rootroot00000000000000/* 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 QVKWASAPIGSTREAMER_H #define QVKWASAPIGSTREAMER_H #include #include class QvkWASAPIGstreamer: public QObject { Q_OBJECT public: QvkWASAPIGstreamer(); virtual ~QvkWASAPIGstreamer(); QString get_AudioDeviceString( GstDevice *device ); public slots: QStringList get_all_Audio_Source_devices(); QStringList get_all_Audio_Playback_devices(); private: private slots: protected: signals: }; #endif vokoscreenNG-3.1.0/src/audio/windows/WASAPI/QvkWASAPIWatcher.cpp000066400000000000000000000103311416353147400241620ustar00rootroot00000000000000/* 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 "QvkWASAPIWatcher.h" #include "QvkWASAPIGstreamer.h" #include "global.h" #include #include #include QvkWASAPIWatcher::QvkWASAPIWatcher( Ui_formMainWindow *ui_mainwindow ) { lineEditWASAPIAudioPlug = new QLineEdit; ui = ui_mainwindow; timer = new QTimer( this ); timer->setTimerType( Qt::PreciseTimer ); timer->setInterval( 3000 ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_update() ) ); } QvkWASAPIWatcher::~QvkWASAPIWatcher() {} void QvkWASAPIWatcher::slot_update() { QvkWASAPIGstreamer vkWASAPIGstreamer; QStringList listDevices; listDevices << vkWASAPIGstreamer.get_all_Audio_Source_devices(); listDevices << vkWASAPIGstreamer.get_all_Audio_Playback_devices(); QList listCheckBox = ui->scrollAreaWidgetContentsAudioDevices->findChildren(); QStringList stringListCheckBox; for ( int i = 0; i < listCheckBox.count(); i++ ) { stringListCheckBox << listCheckBox.at(i)->accessibleName(); } // Add new Device if ( listDevices.count() > listCheckBox.count() ) { for ( int i = 0; i < listDevices.count(); i++ ) { QString device = QString( listDevices.at(i) ).section( ":::", 0, 0 ) + ":::" + QString( listDevices.at(i) ).section( ":::", 2, 2 ) ; if ( stringListCheckBox.contains( device ) == false ) { QString name = QString( listDevices.at(i) ).section( ":::", 1, 1 ); qDebug().noquote() << global::nameOutput << "[Audio WASAPI] Added:" << name << "Device:" << device; QString audioDevicePlug = ""; audioDevicePlug.append( "[Audio-device-added]" ); audioDevicePlug.append( "---"); audioDevicePlug.append( name ); audioDevicePlug.append( "---"); audioDevicePlug.append( device ); lineEditWASAPIAudioPlug->setText( audioDevicePlug ); } } } // listDevices --> Device ::: Name ::: Typ // listDeviceTyp --> Device ::: Typ // listCheckbox --> Device ::: Typ QStringList listDeviceTyp; for ( int i = 0; i < listDevices.count(); i++ ) { listDeviceTyp << QString( listDevices.at(i) ).section( ":::", 0, 0 ) + ":::" + QString( listDevices.at(i) ).section( ":::", 2, 2 ); } // Remove device if ( listDevices.count() < listCheckBox.count() ) { for ( int i = 0; i < listCheckBox.count(); i++ ) { QString string = QString( listCheckBox.at(i)->accessibleName() ); if ( listDeviceTyp.contains( string ) == false ) { QString name = listCheckBox.at(i)->text(); QString device = listCheckBox.at(i)->accessibleName(); qDebug().noquote() << global::nameOutput << "[Audio WASAPI] Removed:" << name << "Device:" << device; qDebug().noquote(); QString audioDevicePlug = ""; audioDevicePlug.append( "[Audio-device-removed]" ); audioDevicePlug.append( "---"); audioDevicePlug.append( name ); audioDevicePlug.append( "---"); audioDevicePlug.append( device ); lineEditWASAPIAudioPlug->setText( audioDevicePlug ); } } } } vokoscreenNG-3.1.0/src/audio/windows/WASAPI/QvkWASAPIWatcher.h000066400000000000000000000024371416353147400236370ustar00rootroot00000000000000/* 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 QVKWASAPIWATCHER_H #define QVKWASAPIWATCHER_H #include #include "ui_formMainWindow.h" #include #include class QvkWASAPIWatcher: public QObject { Q_OBJECT public: QvkWASAPIWatcher(Ui_formMainWindow *ui_mainwindow); virtual ~QvkWASAPIWatcher(); QTimer *timer; QLineEdit *lineEditWASAPIAudioPlug; public slots: private: Ui_formMainWindow *ui; private slots: void slot_update(); protected: signals: }; #endif vokoscreenNG-3.1.0/src/audio/windows/audioWindows.pri000066400000000000000000000013001416353147400226720ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkAudioController.h \ $$PWD/DirectSound/QvkDirectSoundController.h \ $$PWD/DirectSound/QvkDirectSoundWatcher.h \ $$PWD/WASAPI/QvkWASAPIController.h \ $$PWD/WASAPI/QvkWASAPIGstreamer.h \ $$PWD/WASAPI/QvkWASAPIWatcher.h SOURCES += $$PWD/QvkAudioController.cpp \ $$PWD/DirectSound/QvkDirectSoundController.cpp \ $$PWD/DirectSound/QvkDirectSoundWatcher.cpp \ $$PWD/WASAPI/QvkWASAPIController.cpp \ $$PWD/WASAPI/QvkWASAPIGstreamer.cpp \ $$PWD/WASAPI/QvkWASAPIWatcher.cpp vokoscreenNG-3.1.0/src/camera/000077500000000000000000000000001416353147400161455ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/camera/QvkCameraController.cpp000066400000000000000000000335331416353147400225760ustar00rootroot00000000000000/* 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 "QvkCameraResolution.h" #include "global.h" #include "camerasettingsdialog.h" #include QvkCameraController::QvkCameraController( Ui_formMainWindow *ui_surface ):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 ); vkCameraSettingsDialog = new cameraSettingsDialog; QvkCameraResolution *vkCameraResolution = new QvkCameraResolution( ui_formMainWindow, vkCameraSettingsDialog ); connect( ui_formMainWindow->comboBoxCamera, SIGNAL( currentIndexChanged( int ) ), vkCameraResolution, SLOT( slot_resolution( int ) ) ); connect( ui_formMainWindow->comboBoxCameraResolution, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_resolutionChanged() ) ); getAllDevices(); cameraWindow = new QvkCameraWindow( ui_surface, sliderCameraWindowSize, vkCameraSettingsDialog ); 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 ); QvkCameraWatcher *cameraWatcher = new QvkCameraWatcher( ui_formMainWindow ); connect( cameraWatcher, SIGNAL( signal_addedCamera( QString, QString ) ), this, SLOT( slot_addedCamera( QString, QString ) ) ); connect( cameraWatcher, SIGNAL( signal_removedCamera( QString ) ), this, SLOT( slot_removedCamera( QString ) ) ); connect( ui_formMainWindow->checkBoxCameraOnOff, SIGNAL( toggled( bool ) ), ui_formMainWindow->comboBoxCamera, SLOT( setDisabled( bool ) ) ); 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_resolutionChanged() { if ( ui_formMainWindow->checkBoxCameraOnOff->checkState() == Qt::Checked ) { ui_formMainWindow->checkBoxCameraOnOff->click(); ui_formMainWindow->checkBoxCameraOnOff->click(); if ( vkCameraSettingsDialog->isVisible() == true ) { vkCameraSettingsDialog->close(); vkCameraSettingsDialog->show(); } } } void QvkCameraController::getAllDevices() { QList camerasInfoList = QCameraInfo::availableCameras(); if ( !camerasInfoList.empty() ) { for ( int i = 0; i < camerasInfoList.count(); i++ ) { if ( ( camerasInfoList.at(i).description() > "" ) and ( !camerasInfoList.at(i).description().contains( "@device:pnp" ) ) ) { qDebug().noquote() << global::nameOutput << "[Camera] Found:" << camerasInfoList.at(i).description() << camerasInfoList.at(i).deviceName(); slot_addedCamera( camerasInfoList.at(i).description(), camerasInfoList.at(i).deviceName() ); } } } } void QvkCameraController::slot_frameOnOff( bool value ) { if ( cameraWindow->isVisible() == true ) { Qt::WindowFlags flags; #ifdef Q_OS_WIN if ( value == true ) { flags = Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint; cameraWindow->setWindowFlags( flags ); } if ( value == false ) { flags = Qt::WindowStaysOnTopHint; cameraWindow->setWindowFlags( flags ); } #endif #ifdef Q_OS_LINUX if ( value == true ) { vkCameraSettingsDialog->ui->pushButtonSwitchToFullscreen->setDisabled( true ); cameraWindow->setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint ); ui_formMainWindow->checkBoxCameraOnOff->click(); ui_formMainWindow->checkBoxCameraOnOff->click(); } if ( value == false ) { vkCameraSettingsDialog->ui->pushButtonSwitchToFullscreen->setDisabled( false ); flags = Qt::WindowStaysOnTopHint; cameraWindow->setWindowFlags( flags ); } #endif 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::SmoothTransformation); 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->comboBoxCameraResolution->setEnabled( true ); ui_formMainWindow->comboBoxCamera->addItem( description, device.toLatin1() ); 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().toString() == device ) ) { 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->comboBoxCameraResolution->clear(); ui_formMainWindow->comboBoxCameraResolution->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 ) ) ); connect( camera, QOverload::of( &QCamera::error ), this, [=]( QCamera::Error value ){ slot_error( value ); }); int frameWidth = ui_formMainWindow->comboBoxCameraResolution->currentText().section( "x", 0, 0 ).toInt(); int frameHeight = ui_formMainWindow->comboBoxCameraResolution->currentText().section( "x", 1, 1 ).toInt(); QCameraViewfinderSettings viewfinderSettings; viewfinderSettings.setResolution( frameWidth, frameHeight ); viewfinderSettings.setMinimumFrameRate( 0.0 ); viewfinderSettings.setMaximumFrameRate( 0.0 ); camera->setViewfinderSettings( viewfinderSettings ); slot_sliderMoved( sliderCameraWindowSize->value() ); camera->setViewfinder( videoSurface ); cameraWindow->setStyleSheet( "background-color:black;" ); 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().noquote() << global::nameOutput << "General Camera error"; cameraWindow->clear(); cameraWindow->setStyleSheet( "background-color:white;" ); cameraWindow->setText( "Camera is busy " ); break; } case QCamera::InvalidRequestError: { qDebug().noquote() << global::nameOutput << "Camera invalid request error"; break; } case QCamera::ServiceMissingError: { qDebug().noquote() << global::nameOutput << "Camera service missing error"; break; } case QCamera::NotSupportedFeatureError : { qDebug().noquote() << global::nameOutput << "Camera not supported error"; break; } } } vokoscreenNG-3.1.0/src/camera/QvkCameraController.h000066400000000000000000000041311416353147400222330ustar00rootroot00000000000000/* 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" #include "QvkCameraWatcher.h" #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; void getAllDevices(); cameraSettingsDialog *vkCameraSettingsDialog; Ui_cameraSettingsDialog *uiCameraSettingsDialog; 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 ); void slot_resolutionChanged(); private: Ui_formMainWindow *ui_formMainWindow; QCamera *camera = nullptr; QvkCameraWatcher *cameraWatcher; QvkVideoSurface *videoSurface; QvkSpezialSlider *sliderCameraWindowSize; protected: signals: }; #endif vokoscreenNG-3.1.0/src/camera/QvkCameraResolution.cpp000066400000000000000000000116051416353147400226120ustar00rootroot00000000000000/* 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 "QvkCameraResolution.h" #include "global.h" #include #include QvkCameraResolution::QvkCameraResolution( Ui_formMainWindow *ui, cameraSettingsDialog *settingsDialog ) { ui_formMainWindow = ui; vkCameraSettingsDialog = settingsDialog; } QvkCameraResolution::~QvkCameraResolution() { } void QvkCameraResolution::slot_resolution( int value ) { Q_UNUSED(value); QByteArray device = ui_formMainWindow->comboBoxCamera->currentData().toByteArray(); delete camera; camera = new QCamera( device ); connect( camera, SIGNAL( statusChanged( QCamera::Status ) ), this, SLOT( slot_statusChanged( QCamera::Status ) ) ); connect( camera, SIGNAL( stateChanged( QCamera::State ) ), this, SLOT( slot_stateChanged( QCamera::State ) ) ); camera->load(); } void QvkCameraResolution::slot_statusChanged( QCamera::Status status ) { switch ( status ) { case QCamera::UnavailableStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 0 case QCamera::UnloadedStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 1 case QCamera::LoadingStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 2 case QCamera::UnloadingStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 3 case QCamera::LoadedStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; ui_formMainWindow->comboBoxCameraResolution->clear(); vkCameraSettingsDialog->ui->comboBoxCameraResolution->clear(); QCameraViewfinderSettings cameraViewfinderSettings; QList resolution = camera->supportedViewfinderResolutions( cameraViewfinderSettings ); for ( int x = 0; x < resolution.count(); x++ ) { QString width = QString::number( resolution.at(x).width() ); QString height = QString::number( resolution.at(x).height() ); ui_formMainWindow->comboBoxCameraResolution->addItem( width + "x" + height ); vkCameraSettingsDialog->ui->comboBoxCameraResolution->addItem( width + "x" + height ); } qDebug().noquote() << global::nameOutput << "Camera resolutions for:" << ui_formMainWindow->comboBoxCamera->currentText() << ui_formMainWindow->comboBoxCamera->currentData().toByteArray(); qDebug() << resolution; camera->unload(); disconnect( camera, nullptr, nullptr, nullptr ); QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); QString valueText = settings.value( "comboBoxCameraResolution", "640x480" ).toString(); int index = ui_formMainWindow->comboBoxCameraResolution->findText( valueText ); if ( index == -1 ) { index = 0; } ui_formMainWindow->comboBoxCameraResolution->setCurrentIndex( index ); vkCameraSettingsDialog->ui->comboBoxCameraResolution->setCurrentIndex( index ); break; }// 4 case QCamera::StandbyStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 5 case QCamera::StartingStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 6 case QCamera::StoppingStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 7 case QCamera::ActiveStatus : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << status; break; }// 8 } } void QvkCameraResolution::slot_stateChanged( QCamera::State state ) { switch ( state ) { case QCamera::UnloadedState : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << state; break; }// 0 case QCamera::LoadedState : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << state; break; }// 1 case QCamera::ActiveState : { qDebug().noquote() << global::nameOutput << "QvkCameraResolution" << state; break; }// 2 } } vokoscreenNG-3.1.0/src/camera/QvkCameraResolution.h000066400000000000000000000030211416353147400222500ustar00rootroot00000000000000/* 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 QVKCAMERARESOLUTION_H #define QVKCAMERARESOLUTION_H #include "ui_formMainWindow.h" #include "camerasettingsdialog.h" #include "ui_camerasettingsdialog.h" #include #include class QvkCameraResolution : public QObject { Q_OBJECT public: QvkCameraResolution( Ui_formMainWindow *ui, cameraSettingsDialog *settingsDialog ); virtual ~QvkCameraResolution(); cameraSettingsDialog *vkCameraSettingsDialog; public slots: void slot_resolution( int value ); private slots: void slot_statusChanged( QCamera::Status status ); void slot_stateChanged( QCamera::State state ); private: Ui_formMainWindow *ui_formMainWindow; QCamera *camera = nullptr; protected: signals: }; #endif vokoscreenNG-3.1.0/src/camera/QvkCameraWatcher.cpp000066400000000000000000000061041416353147400220420ustar00rootroot00000000000000/* 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 "QvkCameraWatcher.h" #include "global.h" #include #include #include /* * QvkWatcherPlug monitoring only new or removed Audiodevices. */ QvkCameraWatcher::QvkCameraWatcher() { } QvkCameraWatcher::~QvkCameraWatcher() { } QvkCameraWatcher::QvkCameraWatcher( Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; timer = new QTimer( this ); timer->setTimerType( Qt::PreciseTimer ); timer->setInterval( 3000 ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_update() ) ); timer->start(); } void QvkCameraWatcher::slot_update() { QList camerasInfoList = QCameraInfo::availableCameras(); // Add new Device if ( camerasInfoList.count() > ui->comboBoxCamera->count() ) { for ( int i = 0; i < camerasInfoList.count(); i++ ) { if ( ui->comboBoxCamera->findData( camerasInfoList.at(i).deviceName() ) == -1 ) { if ( ( camerasInfoList.at(i).description() > "" ) and ( !camerasInfoList.at(i).description().contains( "@device:pnp" ) ) ) { qDebug().noquote() << global::nameOutput << "[Camera] Added:" << camerasInfoList.at(i).description() << "Device:" << camerasInfoList.at(i).deviceName(); emit signal_addedCamera( camerasInfoList.at(i).description(), camerasInfoList.at(i).deviceName() ); } } } return; } QStringList cameraInfoStringList; for ( int i = 0; i < camerasInfoList.count(); i++ ) { cameraInfoStringList << camerasInfoList.at(i).deviceName(); } int cameraCountCombobox = ui->comboBoxCamera->count(); // Remove device if ( camerasInfoList.count() < cameraCountCombobox ) { for ( int i = 1; i <= cameraCountCombobox; i++ ) { if ( cameraInfoStringList.contains( QString( ui->comboBoxCamera->itemData(i-1).toString() ) ) == false ) { qDebug().noquote() << global::nameOutput << "[Camera] Removed:" << ui->comboBoxCamera->itemText(i-1) << "Device:" << ui->comboBoxCamera->itemData(i-1).toString(); emit signal_removedCamera( ui->comboBoxCamera->itemData(i-1).toString() ); break; } } } } vokoscreenNG-3.1.0/src/camera/QvkCameraWatcher.h000066400000000000000000000025441416353147400215130ustar00rootroot00000000000000/* 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 "ui_formMainWindow.h" #include #include class QvkCameraWatcher: public QObject { Q_OBJECT public: QvkCameraWatcher(); QvkCameraWatcher( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkCameraWatcher(); public slots: private: Ui_formMainWindow *ui; QTimer *timer; int counter; private slots: void slot_update(); protected: signals: void signal_addedCamera( QString, QString ); void signal_removedCamera( QString ); }; #endif vokoscreenNG-3.1.0/src/camera/QvkCameraWindow.cpp000066400000000000000000000156721416353147400217260ustar00rootroot00000000000000/* 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, cameraSettingsDialog *settingsDialog ) { ui_formMainWindow = ui_surface; vkCameraSettingsDialog = settingsDialog; setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint ); setMinimumSize( QSize( 160, 120 ) ); setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); setMouseTracking( true ); // No function, why? 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( ui_formMainWindow->comboBoxCameraResolution, SIGNAL( currentIndexChanged( int ) ), vkCameraSettingsDialog->ui->comboBoxCameraResolution, SLOT( setCurrentIndex( 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->comboBoxCameraResolution, SIGNAL( currentIndexChanged( int ) ), ui_formMainWindow->comboBoxCameraResolution, SLOT( setCurrentIndex( 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->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.1.0/src/camera/QvkCameraWindow.h000066400000000000000000000034421416353147400213630ustar00rootroot00000000000000/* 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, cameraSettingsDialog *settingsDialog); 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.1.0/src/camera/QvkVideoSurface.h000066400000000000000000000045101416353147400213570ustar00rootroot00000000000000/* 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.1.0/src/camera/camera.pri000066400000000000000000000010511416353147400201060ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkCameraController.h \ $$PWD/QvkCameraWatcher.h \ $$PWD/QvkCameraWindow.h \ $$PWD/QvkVideoSurface.h \ $$PWD/QvkCameraResolution.h SOURCES += $$PWD/QvkCameraController.cpp \ $$PWD/QvkCameraWatcher.cpp \ $$PWD/QvkCameraWindow.cpp \ $$PWD/QvkCameraResolution.cpp FORMS += \ $$PWD/camerasettingsdialog.ui HEADERS += \ $$PWD/camerasettingsdialog.h SOURCES += \ $$PWD/camerasettingsdialog.cpp vokoscreenNG-3.1.0/src/camera/camerasettingsdialog.cpp000066400000000000000000000035411416353147400230450ustar00rootroot00000000000000/* 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) { setModal( true ); 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( ":/pictures/camera/camera.png" ) ); setWindowIcon( QIcon( ":/pictures/logo/logo.png" ) ); setWindowTitle( tr( "Camera settings" ) ); } cameraSettingsDialog::~cameraSettingsDialog() { delete ui; } vokoscreenNG-3.1.0/src/camera/camerasettingsdialog.h000066400000000000000000000023751416353147400225160ustar00rootroot00000000000000/* 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.1.0/src/camera/camerasettingsdialog.ui000066400000000000000000000130451416353147400227000ustar00rootroot00000000000000 cameraSettingsDialog 0 0 278 344 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 QDialogButtonBox::Ok vokoscreenNG-3.1.0/src/ciscoOpenh264/000077500000000000000000000000001416353147400172435ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/ciscoOpenh264/BINARY_LICENSE.txt000066400000000000000000000110051416353147400221270ustar00rootroot00000000000000------------------------------------------------------- About The Cisco-Provided Binary of OpenH264 Video Codec ------------------------------------------------------- Cisco provides this program under the terms of the BSD license. Additionally, this binary is licensed under Cisco’s AVC/H.264 Patent Portfolio License from MPEG LA, at no cost to you, provided that the requirements and conditions shown below in the AVC/H.264 Patent Portfolio sections are met. As with all AVC/H.264 codecs, you may also obtain your own patent license from MPEG LA or from the individual patent owners, or proceed at your own risk. Your rights from Cisco under the BSD license are not affected by this choice. For more information on the OpenH264 binary licensing, please see the OpenH264 FAQ found at http://www.openh264.org/faq.html#binary A corresponding source code to this binary program is available under the same BSD terms, which can be found at http://www.openh264.org ----------- BSD License ----------- Copyright © 2014 Cisco Systems, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------- AVC/H.264 Patent Portfolio License Notice ----------------------------------------- The binary form of this Software is distributed by Cisco under the AVC/H.264 Patent Portfolio License from MPEG LA, and is subject to the following requirements, which may or may not be applicable to your use of this software: THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL USE OF A CONSUMER OR OTHER USES IN WHICH IT DOES NOT RECEIVE REMUNERATION TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD (“AVC VIDEO”) AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM Accordingly, please be advised that content providers and broadcasters using AVC/H.264 in their service may be required to obtain a separate use license from MPEG LA, referred to as "(b) sublicenses" in the SUMMARY OF AVC/H.264 LICENSE TERMS from MPEG LA found at http://www.openh264.org/mpegla --------------------------------------------- AVC/H.264 Patent Portfolio License Conditions --------------------------------------------- In addition, the Cisco-provided binary of this Software is licensed under Cisco's license from MPEG LA only if the following conditions are met: 1. The Cisco-provided binary is separately downloaded to an end user’s device, and not integrated into or combined with third party software prior to being downloaded to the end user’s device; 2. The end user must have the ability to control (e.g., to enable, disable, or re-enable) the use of the Cisco-provided binary; 3. Third party software, in the location where end users can control the use of the Cisco-provided binary, must display the following text: "OpenH264 Video Codec provided by Cisco Systems, Inc." 4. Any third-party software that makes use of the Cisco-provided binary must reproduce all of the above text, as well as this last condition, in the EULA and/or in another location where licensing information is to be presented to the end user. v1.0 vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkBz2Decode.cpp000066400000000000000000000101021416353147400221640ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 "QvkBz2Decode.h" #include "global.h" #include QvkBz2Decode::QvkBz2Decode() { } QvkBz2Decode::~QvkBz2Decode() {} gboolean QvkBz2Decode::func( GstBus *bus, GstMessage *msg, gpointer data ) { Q_UNUSED(bus) GMainLoop *loop = (GMainLoop *) data; switch ( GST_MESSAGE_TYPE( msg ) ) { case GST_MESSAGE_EOS: qDebug().noquote() << global::nameOutput << "[QvkBz2Decode::func]" << "End of stream"; g_main_loop_quit (loop); break; case GST_MESSAGE_ERROR: { gchar *debug; GError *error; gst_message_parse_error( msg, &error, &debug ); g_free( debug ); g_printerr( "Error: %s\n", error->message ); g_error_free( error ); g_main_loop_quit( loop ); break; } default: break; } return true; } void QvkBz2Decode::start_encoding( QString inputFile, QString outpuFile ) { QByteArray byteArrayInputFile = inputFile.toUtf8(); const gchar *inFile = byteArrayInputFile.constData(); QByteArray byteArrayOutputFile = outpuFile.toUtf8(); const gchar *outFile = byteArrayOutputFile.constData(); GMainLoop *loop; GstElement *pipeline, *source, *decoder, *sink; GstBus *bus; guint bus_watch_id; loop = g_main_loop_new (NULL, FALSE); // Create gstreamer elements pipeline = gst_pipeline_new ("audio-player"); source = gst_element_factory_make( "filesrc", "file-source" ); decoder = gst_element_factory_make( "bz2dec", "bz2-decoder" ); sink = gst_element_factory_make( "filesink", "file-out" ); if ( !pipeline || !source || !decoder || !sink ) { qDebug().noquote() << global::nameOutput << "[QvkBz2Decode::start_encoding]" << "One element could not be created. Exiting."; return; } // we set the input filename to the source element g_object_set( G_OBJECT( source ), "location", inFile, NULL ); // we set the output filename to the sink element g_object_set( G_OBJECT( sink ), "location", outFile, NULL ); // we add a message handler bus = gst_pipeline_get_bus( GST_PIPELINE( pipeline ) ); bus_watch_id = gst_bus_add_watch( bus, QvkBz2Decode::func, loop ); gst_object_unref( bus ); // we add all elements into the pipeline gst_bin_add_many( GST_BIN (pipeline), source, decoder, sink, NULL ); // we link the elements together gst_element_link_many( source, decoder, sink, NULL ); // Set the pipeline to "playing" state qDebug().noquote() << global::nameOutput << "[QvkBz2Decode::start_encoding]" << "Now decode file:" << inFile;; gst_element_set_state( pipeline, GST_STATE_PLAYING ); // Start loop qDebug().noquote() << global::nameOutput << "[QvkBz2Decode::start_encoding]" << "Running loop"; g_main_loop_run( loop ); // Out of the main loop, clean up nicely qDebug().noquote() << global::nameOutput << "[QvkBz2Decode::start_encoding]" << "Returned from loop, Gstreamer go in state GST_STATE_NULL"; gst_element_set_state( pipeline, GST_STATE_NULL ); qDebug().noquote() << global::nameOutput << "[QvkBz2Decode::start_encoding]" << "Deleting pipeline"; gst_object_unref( GST_OBJECT ( pipeline ) ); g_source_remove( bus_watch_id ); g_main_loop_unref( loop ); emit signal_file_is_unzipped(); } vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkBz2Decode.h000066400000000000000000000023761416353147400216470ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 QVKBZ2DECODE_H #define QVKBZ2DECODE_H #include #include class QvkBz2Decode: public QObject { Q_OBJECT public: QvkBz2Decode(); virtual ~QvkBz2Decode(); static gboolean func( GstBus *bus, GstMessage *msg, gpointer data ); void start_encoding(QString inputFile , QString outpuFile); public slots: private: private slots: protected: signals: void signal_file_is_unzipped(); }; #endif vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoFinishDialog.cpp000066400000000000000000000007061416353147400237550ustar00rootroot00000000000000#include "QvkCiscoFinishDialog.h" #include "ui_QvkCiscoFinishDialog.h" QvkCiscoFinishDialog::QvkCiscoFinishDialog(QWidget *parent) : QWidget(parent), ui(new Ui::QvkCiscoFinishDialog) { ui->setupUi(this); connect( ui->buttonBox, SIGNAL( accepted() ), this, SLOT( slot_closeAllWindows() ) ); } QvkCiscoFinishDialog::~QvkCiscoFinishDialog() { delete ui; } void QvkCiscoFinishDialog::slot_closeAllWindows() { qApp->closeAllWindows(); } vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoFinishDialog.h000066400000000000000000000006451416353147400234240ustar00rootroot00000000000000#ifndef QVKCISCOFINISHDIALOG_H #define QVKCISCOFINISHDIALOG_H #include namespace Ui { class QvkCiscoFinishDialog; } class QvkCiscoFinishDialog : public QWidget { Q_OBJECT public: explicit QvkCiscoFinishDialog(QWidget *parent = nullptr); ~QvkCiscoFinishDialog(); private: Ui::QvkCiscoFinishDialog *ui; private slots: void slot_closeAllWindows(); }; #endif // QVKCISCOFINISHDIALOG_H vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoFinishDialog.ui000066400000000000000000000144151416353147400236120ustar00rootroot00000000000000 QvkCiscoFinishDialog 0 0 610 399 Qt::Vertical 20 40 Qt::Horizontal 40 20 :/pictures/logo/logo.png Qt::Horizontal 40 20 Qt::Vertical 20 40 64 64 :/pictures/screencast/accept.png true Qt::Vertical 20 40 The setup was successful. Close this window and start vokoscreenNG again. Qt::Vertical 20 40 Have fun with vokoscreenNG Qt::Vertical 20 40 Qt::Horizontal 40 20 Qt::Vertical 20 40 Qt::Horizontal 40 20 QDialogButtonBox::Ok vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoOpenh264Controller.cpp000066400000000000000000000145201416353147400247650ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 #include "QvkCiscoOpenh264Controller.h" #include "QvkCiscoOpenh264Downloader.h" #include "QvkBz2Decode.h" #include "global.h" #include "QvkCiscoFinishDialog.h" #include QvkCiscoOpenh264Controller::QvkCiscoOpenh264Controller( QString vk_pathWithSettingsFilename, Ui_formMainWindow *ui_mainwindow ) { ui = ui_mainwindow; pathWithSettingsFilename = vk_pathWithSettingsFilename; #ifdef Q_OS_WIN libopenh264_filename = "libopenh264-6.dll"; downloadFile = "http://ciscobinary.openh264.org/openh264-2.1.1-win64.dll.bz2"; #endif #ifdef Q_OS_LINUX libopenh264_filename = "libopenh264.so"; downloadFile = "http://ciscobinary.openh264.org/libopenh264-2.1.1-linux64.6.so.bz2"; #endif } QvkCiscoOpenh264Controller::~QvkCiscoOpenh264Controller() { } void QvkCiscoOpenh264Controller::showWaitDialog() { QFileInfo fileInfo( pathWithSettingsFilename ); QFileInfo fileInfo_libopenh264( fileInfo.path() + "/" + libopenh264_filename ); if ( !fileInfo_libopenh264.exists() ) { ui->tabWidgetSideBar->hide(); ui->widgetSidbar->hide(); vkCiscoWaitDialog = new QvkCiscoWaitDialog; ui->horizontalLayout_49->insertWidget( 0, vkCiscoWaitDialog ); vkCiscoWaitDialog->show(); } } void QvkCiscoOpenh264Controller::init() { connect( ui->pushButtonCiscoLicense, SIGNAL( clicked( bool ) ), this, SLOT( slot_pushButtonCiscoLicense() ) ); connect( ui->radioButton_cisco_on, SIGNAL( clicked( bool ) ), this, SLOT( slot_cisco_on( bool ) ) ); connect( ui->radioButton_cisco_off, SIGNAL( clicked( bool ) ), this, SLOT( slot_cisco_off( bool ) ) ); QFileInfo fileInfo( pathWithSettingsFilename ); QFileInfo fileInfo_libopenh264( fileInfo.path() + "/" + libopenh264_filename ); if ( !fileInfo_libopenh264.exists() ) { QvkCiscoOpenh264Downloader *vkCiscoOpenh264Downloader = new QvkCiscoOpenh264Downloader( fileInfo.path() ); connect( vkCiscoOpenh264Downloader, SIGNAL( signal_failedDownload() ), this, SLOT( slot_closeWaitDialog() ) ); connect( vkCiscoOpenh264Downloader, SIGNAL( signal_fileDownloaded( QString ) ), this, SLOT( slot_deCompress( QString ) ) ); connect( vkCiscoOpenh264Downloader, SIGNAL( signal_downloadProgress( qint64, qint64) ), this, SLOT( slot_downloadProgress( qint64, qint64 ) ) ); vkCiscoOpenh264Downloader->doDownload( downloadFile ); } } void QvkCiscoOpenh264Controller::slot_downloadProgress( qint64 downloadedSize, qint64 fileSize ) { vkCiscoWaitDialog->progress( downloadedSize, fileSize ); } // Wird nur aufgerufen wenn der Download fehlgeschlagen ist. void QvkCiscoOpenh264Controller::slot_closeWaitDialog() { vkCiscoWaitDialog->close(); ui->tabWidgetSideBar->show(); ui->tabWidgetSideBar->repaint(); ui->tabWidgetSideBar->update(); } void QvkCiscoOpenh264Controller::slot_cisco_on( bool ) { int index = ui->comboBoxVideoCodec->findText( "H.264" ); if ( index == -1 ) { QFileInfo fileInfo( pathWithSettingsFilename ); QFileInfo file_libopenh264( fileInfo.path() + "/" + libopenh264_filename ); if ( file_libopenh264.exists( ) ) { ui->comboBoxVideoCodec->insertItem( 0, "H.264", "openh264enc" ); } } } void QvkCiscoOpenh264Controller::slot_cisco_off( bool ) { int index = ui->comboBoxVideoCodec->findText( "H.264" ); if ( index > -1 ) { ui->comboBoxVideoCodec->removeItem( index ); } } void QvkCiscoOpenh264Controller::slot_deCompress( QString pathWithDownloadedFile ) { QFileInfo fileInfoDownloadedFile( pathWithDownloadedFile ); QvkBz2Decode *vkBz2Decode = new QvkBz2Decode; connect( vkBz2Decode, SIGNAL( signal_file_is_unzipped() ), this, SLOT( slot_showCiscoFinishDialog() ) ); QString inputFile = pathWithDownloadedFile; QString outputFile = fileInfoDownloadedFile.path() + "/" + libopenh264_filename;; vkBz2Decode->start_encoding( inputFile, outputFile ); } void QvkCiscoOpenh264Controller::slot_showCiscoFinishDialog() { // Dieser Hack wird benötigt damit statt einem grauen Fenster der Waitdialog erscheint. for ( int i = 0; i < 30; i++ ) { QCoreApplication::processEvents(); QThread::msleep( 100 ); } vkCiscoWaitDialog->close(); QvkCiscoFinishDialog *vkCiscoFinishDialog = new QvkCiscoFinishDialog; ui->tabWidgetSideBar->hide(); ui->horizontalLayout_49->insertWidget( 0, vkCiscoFinishDialog ); isShowCiscoFinishDialog = true; } void QvkCiscoOpenh264Controller::slot_pushButtonCiscoLicense() { QFile file( ":/ciscoOpenh264/BINARY_LICENSE.txt" ); file.open( QIODevice::ReadOnly ); QTextStream textStream( &file ); textStream.setCodec( "UTF-8" ); QDialog *dialog = new QDialog(); dialog->setWindowFlag( Qt::WindowContextHelpButtonHint, false ); dialog->resize( 600, 600 ); dialog->setWindowTitle( "Cisco licence" ); QBoxLayout *boxLayout = new QBoxLayout( QBoxLayout::TopToBottom ); dialog->setLayout( boxLayout ); QTextBrowser *textBrowser = new QTextBrowser( dialog ); textBrowser->setContextMenuPolicy( Qt::NoContextMenu ); textBrowser->setTextInteractionFlags( Qt::NoTextInteraction ); textBrowser->append( textStream.readAll() ); textBrowser->moveCursor( QTextCursor::Start ); textBrowser->show(); boxLayout->addWidget( textBrowser ); QDialogButtonBox buttonBox( QDialogButtonBox::Close ); connect( &buttonBox, &QDialogButtonBox::clicked, dialog, &QDialog::accept ); boxLayout->addWidget( &buttonBox ); dialog->exec(); } vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoOpenh264Controller.h000066400000000000000000000035231416353147400244330ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 QVKCISCOOPENH264CONTROLLER_H #define QVKCISCOOPENH264CONTROLLER_H #include #include "ui_formMainWindow.h" #include "QvkCiscoWaitDialog.h" class QvkCiscoOpenh264Controller: public QObject { Q_OBJECT public: QvkCiscoOpenh264Controller( QString pathWithSettingsFilename , Ui_formMainWindow *ui_mainwindow ); virtual ~QvkCiscoOpenh264Controller(); void init(); bool isShowCiscoFinishDialog = false; void showWaitDialog(); public slots: private: Ui_formMainWindow *ui; QString libopenh264_filename; QString pathWithSettingsFilename; QvkCiscoWaitDialog *vkCiscoWaitDialog; QString downloadFile; private slots: void slot_deCompress( QString string ); void slot_showCiscoFinishDialog(); void slot_pushButtonCiscoLicense(); void slot_cisco_on( bool ); void slot_cisco_off( bool ); void slot_closeWaitDialog(); void slot_downloadProgress( qint64 downloadedSize, qint64 fileSize ); protected: signals: void signal_ciscofile_now_downloded( bool ); }; #endif vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoOpenh264Downloader.cpp000066400000000000000000000062331416353147400247420ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 "QvkCiscoOpenh264Downloader.h" #include "global.h" QvkCiscoOpenh264Downloader::QvkCiscoOpenh264Downloader( QString vk_pathLocal , QObject *parent ) : QObject(parent) { connect( &networkAccessManager, SIGNAL( finished( QNetworkReply* ) ), SLOT( slot_downloadFinished( QNetworkReply* ) ) ); pathLocal = vk_pathLocal; } void QvkCiscoOpenh264Downloader::doDownload( const QUrl &url ) { QNetworkRequest request; request.setSslConfiguration(QSslConfiguration::defaultConfiguration()); request.setUrl( url ); QNetworkReply *reply = networkAccessManager.get( request ); connect( reply, SIGNAL( downloadProgress( qint64, qint64 ) ), SLOT( slot_downloadProgress( qint64, qint64 ) ) ); listDownloads.append( reply ); } void QvkCiscoOpenh264Downloader::slot_downloadProgress( qint64 downloadedSize, qint64 fileSize ) { emit signal_downloadProgress( downloadedSize, fileSize ); } bool QvkCiscoOpenh264Downloader::saveLocal( const QString &filename, QIODevice *data ) { QString fileInTempPath = pathLocal + "/" + filename; QFile file( fileInTempPath ); if ( !file.open( QIODevice::WriteOnly ) ) { return false; } file.write( data->readAll() ); file.close(); return true; } void QvkCiscoOpenh264Downloader::slot_downloadFinished( QNetworkReply *reply ) { QString filename = QFileInfo( reply->url().path() ).fileName(); bool downloadOK = false; if ( reply->error() ) { qDebug().noquote() << global::nameOutput << "[h264] Download of" << reply->url().toString() << "failed:" << reply->errorString(); downloadOK = false; } else { if ( saveLocal( filename, reply ) == true ) { qDebug().noquote() << global::nameOutput << "[h264] Download of" << reply->url().toString() << "succeeded (saved to" << pathLocal + "/" + filename + ")"; downloadOK = true; } else { qDebug().noquote() << global::nameOutput << "[h264] Download of" << reply->url().toString() << "can not save" << pathLocal + "/" + filename + ")"; downloadOK = false; } } listDownloads.removeAll( reply ); reply->deleteLater(); if ( downloadOK == true ) { emit signal_fileDownloaded( pathLocal + "/" + filename ); } if ( downloadOK == false ) { emit signal_failedDownload(); } } vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoOpenh264Downloader.h000066400000000000000000000035641416353147400244130ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 QVKCISCOOPEN264DOWNLOADER_H #define QVKCISCOOPEN264DOWNLOADER_H #include #include #include #include #include #include #include #include #include #include #include class QvkCiscoOpenh264Downloader : public QObject { Q_OBJECT QNetworkAccessManager networkAccessManager; QVector listDownloads; public: explicit QvkCiscoOpenh264Downloader( QString vk_pathLocal, QObject *parent = nullptr); void doDownload( const QUrl &url ); private: QString pathLocal; bool saveLocal(const QString &filename, QIODevice *data ); void execute(); signals: void signal_fileDownloaded( QString ); void signal_failedDownload(); void signal_downloadProgress( qint64 downloadedSize, qint64 fileSize ); public slots: void slot_downloadFinished( QNetworkReply *reply ); void slot_downloadProgress( qint64 downloadedSize, qint64 fileSize ); private slots: }; #endif // QvkDownloader_H vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoWaitDialog.cpp000066400000000000000000000007731416353147400234450ustar00rootroot00000000000000#include "QvkCiscoWaitDialog.h" #include "ui_QvkCiscoWaitDialog.h" QvkCiscoWaitDialog::QvkCiscoWaitDialog(QWidget *parent) : QWidget(parent), ui(new Ui::QvkCiscoWaitDialog) { ui->setupUi(this); } QvkCiscoWaitDialog::~QvkCiscoWaitDialog() { delete ui; } void QvkCiscoWaitDialog::progress( qint64 downloadedSize, qint64 fileSize ) { ui->progressBar->setMinimum( 0 ); ui->progressBar->setMaximum( fileSize ); ui->progressBar->setValue( downloadedSize ); update(); repaint(); } vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoWaitDialog.h000066400000000000000000000006311416353147400231030ustar00rootroot00000000000000#ifndef QVKCISCOWAITDIALOG_H #define QVKCISCOWAITDIALOG_H #include namespace Ui { class QvkCiscoWaitDialog; } class QvkCiscoWaitDialog : public QWidget { Q_OBJECT public: explicit QvkCiscoWaitDialog(QWidget *parent = nullptr); ~QvkCiscoWaitDialog(); void progress(qint64 downloadedSize, qint64 fileSize ); private: Ui::QvkCiscoWaitDialog *ui; private slots: }; #endif vokoscreenNG-3.1.0/src/ciscoOpenh264/QvkCiscoWaitDialog.ui000066400000000000000000000063361416353147400233010ustar00rootroot00000000000000 QvkCiscoWaitDialog 0 0 610 399 Qt::Horizontal 40 20 :/pictures/logo/logo.png Qt::Horizontal 40 20 0 Qt::Vertical 20 40 Download opensource openh264 Qt::Vertical 20 40 Qt::Vertical 20 40 vokoscreenNG-3.1.0/src/ciscoOpenh264/ciscoOpenh264.pri000066400000000000000000000011571416353147400223110ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkCiscoOpenh264Controller.h \ $$PWD/QvkCiscoOpenh264Downloader.h \ $$PWD/QvkBz2Decode.h \ $$PWD/QvkCiscoFinishDialog.h \ $$PWD/QvkCiscoWaitDialog.h SOURCES += $$PWD/QvkCiscoOpenh264Controller.cpp \ $$PWD/QvkCiscoOpenh264Downloader.cpp \ $$PWD/QvkBz2Decode.cpp \ $$PWD/QvkCiscoFinishDialog.cpp \ $$PWD/QvkCiscoWaitDialog.cpp FORMS += $$PWD/QvkCiscoFinishDialog.ui \ $$PWD/QvkCiscoWaitDialog.ui vokoscreenNG-3.1.0/src/countdown/000077500000000000000000000000001416353147400167355ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/countdown/QvkCountdown.cpp000066400000000000000000000056641416353147400221160ustar00rootroot00000000000000/* 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 #include #include QvkCountdown::QvkCountdown() { } QvkCountdown::~QvkCountdown() { } void QvkCountdown::init() { createCountdownWindow(); 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::createCountdownWindow() { vkCountdownWindow = new QvkCountdownWindow( this ); vkCountdownWindow->setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::ToolTip ); //With tooltip, no entry in Taskbar connect( vkCountdownWindow, SIGNAL( signal_countDownCancel( bool ) ), this, SLOT( slot_cancel( bool ) ) ); x = 0; y = 0; Width = 300; Height = 300;; vkCountdownWindow->x = 0; vkCountdownWindow->y = 0; vkCountdownWindow->Width = 300; vkCountdownWindow->Height = 300;; } void QvkCountdown::startCountdown( int value ) { vkCountdownWindow->setGeometry( x, y, Width, Height ); vkCountdownWindow->show(); vkCountdownWindow->countValue = value; vkCountdownWindow->gradValue = 0; timer->start( 1000 ); animationTimer->start( 25 ); emit signal_countdownBegin( true ); } void QvkCountdown::slot_updateTimer() { vkCountdownWindow->gradValue = 0; vkCountdownWindow->countValue--; if ( vkCountdownWindow->countValue == 0 ) { vkCountdownWindow->setGeometry( x, y, 1, 1 ); vkCountdownWindow->hide(); timer->stop(); animationTimer->stop(); emit signal_countDownfinish( true ); } } void QvkCountdown::slot_updateAnimationTimer() { vkCountdownWindow->gradValue = vkCountdownWindow->gradValue - 20; vkCountdownWindow->update(); } void QvkCountdown::slot_cancel( bool value ) { timer->stop(); animationTimer->stop(); emit signal_countDownCancel( value); } vokoscreenNG-3.1.0/src/countdown/QvkCountdown.h000066400000000000000000000031031416353147400215450ustar00rootroot00000000000000/* 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 #include "QvkCountdownWindow.h" class QvkCountdown: public QWidget { Q_OBJECT public: QvkCountdown(); virtual ~QvkCountdown(); void init(); void startCountdown(int value ); int x; int y; int Width; int Height; public slots: private: QvkCountdownWindow *vkCountdownWindow; void createCountdownWindow(); QTimer *timer; QTimer *animationTimer; private slots: void slot_updateTimer(); void slot_updateAnimationTimer(); void slot_cancel( bool value ); protected: signals: void signal_countDownfinish( bool value ); void signal_countdownBegin( bool value ); void signal_countDownCancel( bool value); }; #endif vokoscreenNG-3.1.0/src/countdown/QvkCountdownWindow.cpp000066400000000000000000000106741416353147400233030ustar00rootroot00000000000000/* 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 "QvkCountdownWindow.h" #include #include #include #ifdef Q_OS_LINUX #include #endif QvkCountdownWindow::QvkCountdownWindow( QWidget *parent ) { setParent( parent ); #ifdef Q_OS_LINUX if ( QX11Info::isCompositingManagerRunning() == true ) { setAttribute( Qt::WA_TranslucentBackground, true ); } else { setAttribute( Qt::WA_TranslucentBackground, false ); } #endif #ifdef Q_OS_WIN setAttribute( Qt::WA_TranslucentBackground, true ); #endif // Is needed only for the translated text QDialogButtonBox *buttonBox = new QDialogButtonBox( QDialogButtonBox::Abort, this); buttonBox->hide(); QList list = this->findChildren(); cancelText = list.at(0)->text(); show(); } QvkCountdownWindow::~QvkCountdownWindow() { } void QvkCountdownWindow::paintEvent( QPaintEvent *event ) { (void)event; QPixmap pixmap( 300 * devicePixelRatioF(), 300 * devicePixelRatioF() ); pixmap.fill( Qt::transparent ); pixmap.setDevicePixelRatio( devicePixelRatioF() ); QPainter painterPixmap; painterPixmap.begin( &pixmap ); painterPixmap.setRenderHints( QPainter::Antialiasing, true ); painterPixmap.setRenderHints( QPainter::Antialiasing, true ); QPen pen; QBrush brush; brush.setColor( Qt::darkGray ); brush.setStyle( Qt::SolidPattern ); pen.setWidth( 0 ); pen.setColor( Qt::darkGray ); painterPixmap.setBrush( brush ); painterPixmap.setPen( pen ); painterPixmap.setOpacity( 0.3 ); painterPixmap.drawPie( 0, 0, 300, 300, 90*16, gradValue*16 ); painterPixmap.setOpacity( 1.0 ); pen.setColor( Qt::darkGray ); pen.setWidth( 6 ); painterPixmap.setPen( pen ); brush.setStyle( Qt::NoBrush ); painterPixmap.setBrush( brush ); painterPixmap.drawEllipse( QPoint( width()/2, height()/2), 125-3, 125-3 ); painterPixmap.drawEllipse( QPoint( width()/2, height()/2), 100, 100 ); painterPixmap.drawLine( 0, height()/2, width(), height()/2 ); painterPixmap.drawLine( width()/2, 0, width()/2, height() ); int fontSize = 110; QFont font; font.setPointSize( fontSize ); painterPixmap.setFont( font ); painterPixmap.setPen( Qt::red ); QFontMetrics fontMetrics( font ); int fontWidth = fontMetrics.horizontalAdvance( QString::number( countValue ) ); painterPixmap.drawText( width()/2-fontWidth/2, height()/2+fontSize/2, QString::number( countValue ) ); //--------------------- Cancel button ------------------------------- fontSize = 14; font.setPointSize( fontSize ); font.setBold( true); QFontMetrics fontMetrics_1( font ); fontWidth = fontMetrics_1.horizontalAdvance( cancelText ); qreal x = width()/2 - (fontWidth+30)/2; qreal y = 220; qreal width = fontWidth + 30; qreal height = 30; brush.setColor( Qt::red ); brush.setStyle( Qt::SolidPattern ); painterPixmap.setBrush( brush ); pen.setWidth( 2 ); pen.setColor( Qt::black ); painterPixmap.setPen( pen ); rectCancel.setRect( x, y, width, height ); painterPixmap.drawRoundedRect( rectCancel, 10, 10 ); painterPixmap.setPen( Qt::white ); painterPixmap.setFont( font ); painterPixmap.drawText( rectCancel, Qt::AlignCenter, cancelText ); painterPixmap.end(); QPainter painter; painter.begin( this ); painter.drawPixmap( QPointF( 0, 0 ), pixmap ); painter.end(); setMask( pixmap.mask() ); } void QvkCountdownWindow::mousePressEvent( QMouseEvent *event ) { if ( rectCancel.contains( event->pos() ) ) { hide(); emit signal_countDownCancel( true ); } } vokoscreenNG-3.1.0/src/countdown/QvkCountdownWindow.h000066400000000000000000000026751416353147400227520ustar00rootroot00000000000000/* 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 QVKCOUNTDOWNWINDOW_H #define QVKCOUNTDOWNWINDOW_H #include #include #include class QvkCountdownWindow: public QWidget { Q_OBJECT public: QvkCountdownWindow( QWidget *parent ); virtual ~QvkCountdownWindow(); int x; int y; int Width; int Height; int countValue; int gradValue; public slots: private: int oldCountValue; QString cancelText = "Cancel"; QRectF rectCancel; private slots: protected: void paintEvent( QPaintEvent *event ); void mousePressEvent(QMouseEvent *event); signals: void signal_countDownCancel( bool ); }; #endif vokoscreenNG-3.1.0/src/countdown/countdown.pri000066400000000000000000000003611416353147400214710ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkCountdown.h \ $$PWD/QvkCountdownWindow.h SOURCES += $$PWD/QvkCountdown.cpp \ $$PWD/QvkCountdownWindow.cpp vokoscreenNG-3.1.0/src/dirDialog/000077500000000000000000000000001416353147400166135ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/dirDialog/QvkDirDialog.cpp000066400000000000000000000033231416353147400216400ustar00rootroot00000000000000 #include "QvkDirDialog.h" #include #include #include #include #include #include #include QvkDirDialog::QvkDirDialog( QWidget *parent ) { Q_UNUSED(parent) setModal( true ); setFileMode( QFileDialog::Directory ); setOption( QFileDialog::ShowDirsOnly, true ); setOption( QFileDialog::DontUseNativeDialog, true ); setOption( QFileDialog::DontUseCustomDirectoryIcons, true ); setDirectory( QStandardPaths::writableLocation( QStandardPaths::HomeLocation ) ); setWindowFlag( Qt::WindowContextHelpButtonHint, false ); // Remove image in QDialogButtonBox QList list = findChildren(); if ( !list.empty() ) { QList listButtons = list.at(0)->buttons(); if ( !listButtons.empty() ) { for ( int x = 0; x < listButtons.count(); x++ ) { listButtons.at(x)->setIcon( QIcon( "" ) ); } } } // Wird benötigt für weitere tests /* QList listWidgets = findChildren(); if ( !listWidgets.empty() ) { listWidgets.at(0)->installEventFilter( this ); } QList listWidgets = findChildren( "listView" ); if ( !listWidgets.empty() ) { for (int x = 0; x < listWidgets.count(); x++) { listWidgets.at(x)->installEventFilter( this ); qDebug() << listWidgets.at(x); } } */ } bool QvkDirDialog::eventFilter(QObject *object, QEvent *event) { qDebug() << event->type(); return QObject::eventFilter( object, event ); } vokoscreenNG-3.1.0/src/dirDialog/QvkDirDialog.h000066400000000000000000000004711416353147400213060ustar00rootroot00000000000000 #ifndef QvkDirDialog_H #define QvkDirDialog_H #include #include class QvkDirDialog : public QFileDialog { Q_OBJECT public: QvkDirDialog(QWidget *parent = 0); public slots: protected: bool eventFilter(QObject *o, QEvent *event); private: signals: }; #endif vokoscreenNG-3.1.0/src/dirDialog/dirDialog.pri000066400000000000000000000002241416353147400212230ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkDirDialog.h SOURCES += $$PWD/QvkDirDialog.cpp vokoscreenNG-3.1.0/src/fileDialog/000077500000000000000000000000001416353147400167545ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/fileDialog/QvkFileDialog.cpp000066400000000000000000000022441416353147400221430ustar00rootroot00000000000000 #include "QvkFileDialog.h" #include #include #include #include #include #include #include QvkFileDialog::QvkFileDialog( QWidget *parent ) { Q_UNUSED(parent) setModal( true ); setFileMode( QFileDialog::ExistingFile ); setOption( QFileDialog::DontUseNativeDialog, true ); setOption( QFileDialog::DontUseCustomDirectoryIcons, true ); setWindowFlag( Qt::WindowContextHelpButtonHint, false ); // Remove image in QDialogButtonBox QList list = findChildren(); if ( !list.empty() ) { QList listButtons = list.at(0)->buttons(); if ( !listButtons.empty() ) { for ( int x = 0; x < listButtons.count(); x++ ) { listButtons.at(x)->setIcon( QIcon( "" ) ); } } } } void QvkFileDialog::setVideoPath( QString videoPath ) { setDirectory( videoPath ); } bool QvkFileDialog::eventFilter(QObject *object, QEvent *event) { qDebug() << event->type(); return QObject::eventFilter( object, event ); } vokoscreenNG-3.1.0/src/fileDialog/QvkFileDialog.h000066400000000000000000000005501416353147400216060ustar00rootroot00000000000000 #ifndef QVKFILEDIALOG_H #define QVKFILEDIALOG_H #include #include class QvkFileDialog : public QFileDialog { Q_OBJECT public: QvkFileDialog(QWidget *parent = 0); void setVideoPath(QString videoPath ); public slots: protected: bool eventFilter(QObject *o, QEvent *event); private: signals: }; #endif vokoscreenNG-3.1.0/src/fileDialog/fileDialog.pri000066400000000000000000000002261416353147400215270ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkFileDialog.h SOURCES += $$PWD/QvkFileDialog.cpp vokoscreenNG-3.1.0/src/formMainWindow.ui000066400000000000000000006543101416353147400202250ustar00rootroot00000000000000 formMainWindow 0 0 702 490 0 0 0 0 0 0 0 0 0 0 110 78 :/pictures/screencast/monitor.png:/pictures/screencast/monitor.png 68 68 true true true 110 78 :/pictures/camera/camera.png:/pictures/camera/camera.png 72 72 true true true 110 78 :/pictures/showClick/vokoShowClick-sidebar.png:/pictures/showClick/vokoShowClick-sidebar.png 72 72 true true true 110 78 :/pictures/screencast/shortcut.png:/pictures/screencast/shortcut.png 62 62 true true true 110 78 :/pictures/player/player.png:/pictures/player/player.png 72 72 true true true 110 78 :/pictures/log/log.png:/pictures/log/log.png 72 72 true true true Qt::Vertical 20 40 0 0 false QTabWidget::West 0 0 0 :/pictures/screencast/monitor-sidebar.png:/pictures/screencast/monitor-sidebar.png Screencast 0 0 0 0 0 0 0 3 48 48 false :/pictures/screencast/monitor.png:/pictures/screencast/monitor.png Fulls&creen Help Reset :/pictures/screencast/undo.png:/pictures/screencast/undo.png Help 0 0 QComboBox::AdjustToContents QComboBox::AdjustToContents Wi&ndow Help Area Qt::Horizontal 40 20 Qt::Vertical 20 40 0 Help Help Qt::Horizontal QSizePolicy::Minimum 40 20 Countdown Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter CTRL+SHIFT+F9 Magnification Qt::Vertical 20 40 Help Qt::Vertical 20 40 Reset all settings at the next start Qt::Vertical 20 40 Qt::Vertical 10 0 TextLabel true 10 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Frames Free disk space: Video size: Qt::Vertical 20 40 Audiocodec Videocodec 40 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter KB Format MB Qt::Horizontal Record Time: 00:00:00 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Vertical 20 40 Information :/pictures/screencast/microphone.png:/pictures/screencast/microphone.png 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 17 QFrame::NoFrame true Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 0 486 231 0 0 0 0 0 Help Help Qt::Vertical 20 40 false Audiocodec false QComboBox::AdjustToContents Qt::Horizontal 40 20 Help Qt::Vertical QSizePolicy::Minimum 20 40 Qt::Vertical QSizePolicy::Minimum 20 40 :/pictures/screencast/format-codec.png:/pictures/screencast/format-codec.png Help QFrame::NoFrame QFrame::Raised 0 0 0 0 0 QFrame::NoFrame QFrame::Raised 6 0 6 0 superfast 1 QComboBox::AdjustToContents ultrafast superfast veryfast faster fast medium baseline QComboBox::AdjustToContents baseline high-4:4:4 Quality Reset :/pictures/screencast/undo.png:/pictures/screencast/undo.png QFrame::NoFrame QFrame::Raised 0 0 Quality Reset :/pictures/screencast/undo.png:/pictures/screencast/undo.png QFrame::NoFrame QFrame::Raised 0 0 Quality :/pictures/screencast/undo.png:/pictures/screencast/undo.png QComboBox::AdjustToContents 14 Qt::Horizontal 40 20 Frames Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Help Help Help 6 Videocodec QComboBox::AdjustToContents QFrame::NoFrame QFrame::Raised 6 0 0 0 Reset :/pictures/screencast/undo.png:/pictures/screencast/undo.png Do not record mouse cursor Qt::Horizontal 40 20 Help Qt::Vertical 20 40 Format Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter :/pictures/screencast/preferences-system.png:/pictures/screencast/preferences-system.png 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 Minimized when recording starts QFrame::NoFrame QFrame::Raised 0 0 0 Videopath true Help Starts minimized Help QFrame::NoFrame QFrame::Raised 0 0 0 Limit of free disk space Megabyte Help Help Help Help Look for updates TextLabel true Qt::Horizontal 40 20 Reset :/pictures/screencast/undo.png:/pictures/screencast/undo.png Second wait before recording Qt::Vertical 20 40 ... :/pictures/screencast/timer.png:/pictures/screencast/timer.png 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 Qt::Horizontal 40 20 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 :/pictures/screencast/supported-formats.png:/pictures/screencast/supported-formats.png 0 75 true Format 75 true Video 75 true Audio 0 100 true 0 0 312 354 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 :/pictures/screencast/help-about.png:/pictures/screencast/help-about.png Qt::Vertical 20 40 100 100 :/pictures/screencast/author.png true Qt::AlignCenter Sourcecode Qt::AlignCenter true Website Qt::AlignCenter true Translation Qt::AlignCenter true Donate Qt::AlignCenter true Qt::Vertical 20 40 Qt::Horizontal Qt::Vertical 20 40 Qt::Horizontal 40 20 Online-Help Automatically QComboBox::AdjustToContents Automatically Qt::Horizontal 40 20 Copyright and license from pictures Qt::Horizontal 40 20 Qt::Vertical 20 40 Qt::Horizontal 40 20 Create images of tabs Qt::Horizontal 40 20 Qt::Vertical 20 40 Qt::Horizontal QFrame::StyledPanel QFrame::Raised 0 0 QFrame::NoFrame QFrame::Sunken 75 true OpenH264 Video Codec provided by Cisco Systems, Inc. License information <html><head/><body><p><a href="https://www.openh264.org"><span style=" text-decoration: underline; color:#2980b9;">https://www.openh264.org</span></a></p></body></html> true Qt::Horizontal 40 20 ON OFF Qt::Horizontal 40 20 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 :/pictures/camera/camera-sidebar.png:/pictures/camera/camera-sidebar.png Camera 0 0 0 0 0 0 48 48 :/pictures/camera/camera.png:/pictures/camera/camera.png false 0 0 QComboBox::AdjustToContents false QComboBox::AdjustToContents false CTRL+SHIFT+F8 Camera 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 :/pictures/showClick/vokoShowClick-sidebar.png:/pictures/showClick/vokoShowClick-sidebar.png ShowClick :/pictures/screencast/undo.png:/pictures/screencast/undo.png 0 0 0 100 0 1 0 0 0 :/pictures/screencast/undo.png:/pictures/screencast/undo.png 0 0 34 13 :/pictures/showClick/cursor.png true Qt::Horizontal 0 0 34 13 :/pictures/showClick/transparenz.png true :/pictures/screencast/undo.png:/pictures/screencast/undo.png Qt::Horizontal 40 20 Qt::Horizontal 40 20 0 0 34 13 :/pictures/showClick/transparenz.png true Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Horizontal 0 0 34 0 34 34 :/pictures/showClick/sandglass.png true :/pictures/screencast/undo.png:/pictures/screencast/undo.png 14 Halo 34 13 :/pictures/showClick/halo.png true 0 0 0 100 QFrame::NoFrame 0 1 0 0 0 :/pictures/screencast/undo.png:/pictures/screencast/undo.png 0 0 34 13 :/pictures/showClick/cursor.png true Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 0 Qt::Vertical :/pictures/screencast/undo.png:/pictures/screencast/undo.png Qt::Vertical 20 40 14 Showclick :/pictures/screencast/undo.png:/pictures/screencast/undo.png :/pictures/screencast/undo.png:/pictures/screencast/undo.png Shortcut 0 0 0 0 0 0 48 48 :/pictures/screencast/shortcut.png:/pictures/screencast/shortcut.png QFrame::NoFrame 0 0 0 0 Qt::Horizontal 40 20 14 Global keyboard shortcuts Qt::Horizontal 40 20 Qt::Horizontal 40 20 0 Picture Qt::AlignCenter A 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 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 SHIFT :/pictures/screencast/undo.png:/pictures/screencast/undo.png Picture Camera Qt::Horizontal QSizePolicy::Ignored 40 20 Magnification Qt::Horizontal QSizePolicy::Ignored 40 20 ShowClick Halo Qt::Horizontal QSizePolicy::Fixed 40 20 A 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 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 A 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 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Picture 0 0 Picture Qt::AlignCenter :/pictures/screencast/undo.png:/pictures/screencast/undo.png :/pictures/screencast/undo.png:/pictures/screencast/undo.png Picture A 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 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 0 Pause / Continue Qt::Horizontal QSizePolicy::Ignored 40 20 ALT 0 Start Qt::AlignCenter / Qt::AlignCenter Stop Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Qt::Horizontal QSizePolicy::Ignored 40 20 Picture Qt::AlignCenter STRG A 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 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 :/pictures/screencast/undo.png:/pictures/screencast/undo.png :/pictures/screencast/undo.png:/pictures/screencast/undo.png A 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 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 META :/pictures/screencast/undo.png:/pictures/screencast/undo.png Qt::Vertical 20 40 16 16 :/pictures/screencast/accept.png true Assigned shortcut keys. true Qt::TextSelectableByMouse 16 16 :/pictures/screencast/missing.png true Keyboard shortcut not assigned or assigned more than once. Qt::TextSelectableByMouse Qt::Vertical 20 40 75 true If it shows assigned but does not work, it is being used by another program. Qt::TextSelectableByMouse Qt::Vertical 20 40 :/pictures/player/player-sidebar.png:/pictures/player/player-sidebar.png Player 9 0 0 0 0 :/pictures/log/log-sidebar.png:/pictures/log/log-sidebar.png Log 0 0 0 0 0 48 48 :/pictures/log/log.png:/pictures/log/log.png <!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 tabWidgetScreencast radioButtonScreencastFullscreen comboBoxScreencastScreen help_screencast_fullscreen radioButtonScreencastWindow help_screencast_window radioButtonScreencastArea help_screencast_area pushButtonStart pushButtonStop pushButtonPause pushButtonContinue pushButtonPlay pushButtonScreencastOpenfolder help_screencast_execute help_screencast_audio scrollAreaAudioDevice help_screencast_videocodec checkBoxStartTime help_screencast_starttimer checkBoxStopRecordingAfter help_screencast_stoptimer lineEditVideoPath checkBoxMinimizedWhenRecordingStarts checkBoxStartsMinimized scrollAreaAvailable help_screencast_avalaible tabWidgetCamera checkBoxCameraOnOff comboBoxCamera tabWidgetLog textBrowserLog pushButtonSendReport help_log_sendreport vokoscreenNG-3.1.0/src/global.cpp000066400000000000000000000021131416353147400166560ustar00rootroot00000000000000/* 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 namespace global { QString name = "vokoscreenNG"; QString nameOutput = "[" + name + "]"; int showclickCounter = 0; #ifdef Q_OS_LINUX QString version = "3.1.0"; #endif #ifdef Q_OS_WIN QString version = "3.1.0"; #endif } vokoscreenNG-3.1.0/src/global.h000066400000000000000000000017201416353147400163260ustar00rootroot00000000000000/* 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 namespace global { extern QString name; extern QString nameOutput; extern QString version; extern int showclickCounter; } vokoscreenNG-3.1.0/src/halo/000077500000000000000000000000001416353147400156405ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/halo/QvkHalo.cpp000066400000000000000000000162151416353147400177160ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkHalo.h" #include "QvkPushButton.h" #include "global.h" QvkHalo::QvkHalo() { } QvkHalo::~QvkHalo() { } void QvkHalo::init( Ui_formMainWindow *ui_formMainWindow ) { ui = ui_formMainWindow; createHaloPreviewWidget(); createHaloWindow(); createSpezialSlider(); createColorButtons(); createSpezialCheckBox(); setToolButtonDefaultValues(); } void QvkHalo::createHaloPreviewWidget() { vkHaloPreviewWidget = new QvkHaloPreviewWidget( ); ui->horizontalLayout_61->insertWidget( 0, vkHaloPreviewWidget ); vkHaloPreviewWidget->setObjectName( "widgetHaloPreview" ); vkHaloPreviewWidget->show(); } void QvkHalo::createHaloWindow() { vkHaloWindow = new QvkHaloWindow( this ); vkHaloWindow->setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::ToolTip ); //With tooltip, no entry in Taskbar } void QvkHalo::createSpezialSlider() { vkSpezialSliderHole = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayoutHaloHole->insertWidget( 0, vkSpezialSliderHole ); vkSpezialSliderHole->setObjectName( "sliderhaloHole" ); vkSpezialSliderHole->setTracking( true ); vkSpezialSliderHole->setMinimum( 5 ); vkSpezialSliderHole->setMaximum( 40 ); vkSpezialSliderHole->setValue( 30 ); // This value must be greater than the holeDefault in order to be changed after the connect vkSpezialSliderHole->setShowValue( false ); vkSpezialSliderHole->show(); connect( vkSpezialSliderHole, SIGNAL( valueChanged( int ) ), this, SLOT( slot_valueChanged_SpezialSlider_Hole( int ) ) ); vkSpezialSliderHole->setValue( holeDefault ); vkSpezialSliderDiameter = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayoutDiameter->insertWidget( 0, vkSpezialSliderDiameter ); vkSpezialSliderDiameter->setObjectName( "sliderhaloDiameter" ); vkSpezialSliderDiameter->setTracking( true ); vkSpezialSliderDiameter->setMinimum( 50 ); vkSpezialSliderDiameter->setMaximum( 90 ); vkSpezialSliderDiameter->setValue( 0 ); vkSpezialSliderDiameter->setShowValue( false ); vkSpezialSliderDiameter->show(); connect( vkSpezialSliderDiameter, SIGNAL( valueChanged( int ) ), this, SLOT( slot_valueChanged_SpezialSlider_Diameter( int ) ) ); vkSpezialSliderDiameter->setValue( diameterDefault ); vkSpezialSliderOpacity = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayoutHaloOpacity->insertWidget( 0, vkSpezialSliderOpacity ); vkSpezialSliderOpacity->setObjectName( "sliderhaloOpacity" ); vkSpezialSliderOpacity->setTracking( true ); vkSpezialSliderOpacity->setMinimum( 1 ); vkSpezialSliderOpacity->setMaximum( 100 ); vkSpezialSliderOpacity->setValue( 0 ); vkSpezialSliderOpacity->setShowValue( false ); vkSpezialSliderOpacity->show(); connect( vkSpezialSliderOpacity, SIGNAL( valueChanged( int ) ), this, SLOT( slot_valueChanged_SpezialSlider_Opacity( int ) ) ); vkSpezialSliderOpacity->setValue( opacityDefault ); } void QvkHalo::slot_valueChanged_SpezialSlider_Diameter( int value ) { vkHaloPreviewWidget->setDiameter( value ); vkHaloWindow->setDiameter( value ); vkSpezialSliderHole->setMaximum( vkSpezialSliderDiameter->value()/2 ); } void QvkHalo::slot_valueChanged_SpezialSlider_Hole( int value ) { vkHaloWindow->setHoleRadius( value ); vkHaloWindow->repaint(); vkHaloPreviewWidget->setHole( value ); vkHaloPreviewWidget->repaint(); } void QvkHalo::slot_valueChanged_SpezialSlider_Opacity( int value ) { vkHaloPreviewWidget->setOpacity( (qreal)value / 100 ); vkHaloWindow->setOpacity( (qreal)value / 100 ); } void QvkHalo::createColorButtons() { QList listLayaout = ui->gridLayout_halo_color_pushButton->findChildren(); for ( int i = 0; i < listLayaout.count(); i++ ) { for ( int x = 0; x < 20; x++ ) { if ( listLayaout.at(i)->objectName().section( "_", 2, 2 ) == QVariant::fromValue( Qt::GlobalColor(x) ).toString() ) { QvkPushButton *vkPushButton = new QvkPushButton( Qt::GlobalColor(x) ); vkPushButton->setObjectName( "PushButton_Halo_color_" + QVariant::fromValue( Qt::GlobalColor(x) ).toString() ); vkPushButton->setMaximumHeight( 23 ); listLayaout.at(i)->addWidget( vkPushButton ); connect( vkPushButton, &QPushButton::clicked, this, [=]() { vkHaloPreviewWidget->setColor( Qt::GlobalColor(x) ); vkHaloWindow->setColor( Qt::GlobalColor(x) ); } ); break; } } } } void QvkHalo::createSpezialCheckBox() { vkSpezialCheckbox = new QvkSpezialCheckbox(); vkSpezialCheckbox->setObjectName( "spezialCheckboxHalo" ); ui->horizontalLayout_48->insertWidget( 1, vkSpezialCheckbox ); connect( vkSpezialCheckbox, SIGNAL( signal_clicked( bool ) ), this, SLOT( slot_haloOnOff( bool ) ) ); } void QvkHalo::slot_haloOnOff( bool value ) { if ( value == true ) { timerID = startTimer( 10, Qt::PreciseTimer ); vkHaloWindow->show(); } if ( value == false ) { killTimer( timerID ); vkHaloWindow->hide(); } } /* * Move the halo window and brings the window on the top */ void QvkHalo::timerEvent( QTimerEvent *event ) { Q_UNUSED(event); if ( global::showclickCounter == 0 ) { vkHaloWindow->raise(); } vkHaloWindow->move( QCursor::pos().x() - vkHaloWindow->diameter/2, QCursor::pos().y() - vkHaloWindow->diameter/2 ); } void QvkHalo::setToolButtonDefaultValues() { connect( ui->toolButtonHaloColorDefault, &QToolButton::clicked, this, [=]() { vkHaloPreviewWidget->setColor( colorDefault ); vkHaloWindow->setColor( colorDefault ); } ); connect( ui->toolButtonHaloDiameterDefault, &QToolButton::clicked, this, [=]() { vkSpezialSliderDiameter->setValue( diameterDefault ); } ); connect( ui->toolButtonHaloOpacityDefault, &QToolButton::clicked, this, [=]() { vkSpezialSliderOpacity->setValue( opacityDefault ); } ); connect( ui->toolButtonHaloHoleDefault, &QToolButton::clicked, this, [=]() { vkSpezialSliderHole->setValue( holeDefault); } ); } vokoscreenNG-3.1.0/src/halo/QvkHalo.h000066400000000000000000000041401416353147400173550ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKHALO_H #define QVKHALO_H #include #include "QvkSpezialSlider.h" #include "QvkHaloPreviewWidget.h" #include "QvkSpezialCheckbox.h" #include "QvkHaloWindow.h" #include "ui_formMainWindow.h" class QvkHalo: public QWidget { Q_OBJECT public: QvkHalo(); virtual ~QvkHalo(); void init( Ui_formMainWindow *ui_formMainWindow ); QvkSpezialSlider *vkSpezialSliderDiameter; QvkSpezialSlider *vkSpezialSliderOpacity; QvkSpezialSlider *vkSpezialSliderHole; QvkHaloPreviewWidget *vkHaloPreviewWidget; QvkHaloWindow *vkHaloWindow; QColor colorDefault = Qt::green; public slots: private: Ui_formMainWindow *ui; QvkSpezialCheckbox *vkSpezialCheckbox; int diameterDefault = 70; int opacityDefault = 60; int holeDefault = 5; int timerID; void createHaloWindow(); void createHaloPreviewWidget(); void createSpezialSlider(); void createColorButtons(); void createSpezialCheckBox(); void setToolButtonDefaultValues(); private slots: void slot_valueChanged_SpezialSlider_Diameter( int value ); void slot_valueChanged_SpezialSlider_Opacity( int value ); void slot_valueChanged_SpezialSlider_Hole( int value ); void slot_haloOnOff( bool value ); protected: void timerEvent(QTimerEvent *event) override; }; #endif // QvkHalo vokoscreenNG-3.1.0/src/halo/QvkHaloPreviewWidget.cpp000066400000000000000000000037201416353147400224210ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkHaloPreviewWidget.h" QvkHaloPreviewWidget::QvkHaloPreviewWidget() { } QvkHaloPreviewWidget::~QvkHaloPreviewWidget() { } void QvkHaloPreviewWidget::paintEvent( QPaintEvent *event ) { Q_UNUSED(event); QPainter painter; painter.begin( this ); painter.setRenderHints( QPainter::Antialiasing, true ); qreal penWidth = diameter/2 - holeRadius; QPen pen; pen.setWidthF( penWidth ); pen.setColor( color ); painter.setPen( pen ); painter.setOpacity( opacity ); painter.drawEllipse( QPointF( width()/2, height()/2 ), holeRadius + penWidth/2, holeRadius + penWidth/2); painter.end(); } void QvkHaloPreviewWidget::setColor( QColor value ) { color = value; repaint(); } QColor QvkHaloPreviewWidget::getColor() { return color; } void QvkHaloPreviewWidget::setDiameter( int value ) { diameter = value; repaint(); } int QvkHaloPreviewWidget::getDiameter() { return diameter; } void QvkHaloPreviewWidget::setOpacity( qreal value ) { opacity = value; repaint(); } qreal QvkHaloPreviewWidget::getOpacity() { return opacity; } void QvkHaloPreviewWidget::setHole( int value ) { holeRadius = value; } vokoscreenNG-3.1.0/src/halo/QvkHaloPreviewWidget.h000066400000000000000000000027111416353147400220650ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKHALOPREVIEWWIDGET_H #define QVKHALOPREVIEWWIDGET_H #include #include #include class QvkHaloPreviewWidget: public QWidget { Q_OBJECT public: virtual ~QvkHaloPreviewWidget(); QvkHaloPreviewWidget(); void setColor( QColor value ); void setDiameter( int value ); void setOpacity( qreal value ); void setHole( int value ); QColor getColor(); public slots: private: QColor color; int diameter; qreal opacity; int holeRadius; int getDiameter(); qreal getOpacity(); private slots: protected: void paintEvent( QPaintEvent *event ); signals: }; #endif // QvkCircleWidget_H vokoscreenNG-3.1.0/src/halo/QvkHaloWindow.cpp000066400000000000000000000051241416353147400211030ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkHaloWindow.h" #include #include #include #ifdef Q_OS_LINUX #include #endif QvkHaloWindow::QvkHaloWindow( QWidget *parent ) { setParent( parent ); setCursor( Qt::BlankCursor ); #ifdef Q_OS_LINUX if ( QX11Info::isCompositingManagerRunning() == true ) { setAttribute( Qt::WA_TranslucentBackground, true ); } else { setAttribute( Qt::WA_TranslucentBackground, false ); } #endif #ifdef Q_OS_WIN setAttribute( Qt::WA_TranslucentBackground, true ); #endif show(); } QvkHaloWindow::~QvkHaloWindow() { } void QvkHaloWindow::paintEvent( QPaintEvent *event ) { Q_UNUSED(event); QPixmap pixmap( 100 * devicePixelRatioF(), 100 * devicePixelRatioF() ); pixmap.fill( Qt::transparent ); pixmap.setDevicePixelRatio( devicePixelRatioF() ); QPainter painterPixmap; painterPixmap.begin( &pixmap ); painterPixmap.setRenderHints( QPainter::Antialiasing, true ); qreal penWidth = diameter/2 - holeRadius; QPen pen; pen.setWidthF( penWidth ); pen.setColor( color ); painterPixmap.setPen( pen ); painterPixmap.setOpacity( opacity ); painterPixmap.drawEllipse( QPointF( diameter/2, diameter/2 ), holeRadius + penWidth/2, holeRadius + penWidth/2); painterPixmap.end(); QPainter painter; painter.begin( this ); painter.drawPixmap( QPointF( 0, 0 ), pixmap ); painter.end(); setMask( pixmap.mask() ); } void QvkHaloWindow::setDiameter( int value ) { diameter = value; resize( diameter, diameter ); } void QvkHaloWindow::setHoleRadius( int value ) { holeRadius = value; repaint(); } void QvkHaloWindow::setOpacity( qreal value ) { opacity = value; repaint(); } void QvkHaloWindow::setColor( QColor value ) { color = value; repaint(); } vokoscreenNG-3.1.0/src/halo/QvkHaloWindow.h000066400000000000000000000025141416353147400205500ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKHALOWINDOW_H #define QVKHALOWINDOW_H #include class QvkHaloWindow: public QWidget { Q_OBJECT public: QvkHaloWindow( QWidget *parent ); virtual ~QvkHaloWindow(); qreal holeRadius; qreal diameter; public: void setDiameter( int value ); void setHoleRadius( int value ); void setOpacity( qreal value ); void setColor( QColor value ); public slots: private: qreal opacity; QColor color; private slots: protected: void paintEvent(QPaintEvent *event); }; #endif // QVKHALOWINDOW_H vokoscreenNG-3.1.0/src/halo/halo.pri000066400000000000000000000004161416353147400173000ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD SOURCES += $$PWD/QvkHalo.cpp \ $$PWD/QvkHaloWindow.cpp \ $$PWD/QvkHaloPreviewWidget.cpp HEADERS += $$PWD/QvkHalo.h \ $$PWD/QvkHaloWindow.h \ $$PWD/QvkHaloPreviewWidget.h vokoscreenNG-3.1.0/src/help/000077500000000000000000000000001416353147400156455ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/help/QvkDownloader.cpp000066400000000000000000000046621416353147400211410ustar00rootroot00000000000000/* 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.1.0/src/help/QvkDownloader.h000066400000000000000000000032071416353147400206000ustar00rootroot00000000000000/* 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.1.0/src/help/QvkHelp.cpp000066400000000000000000000254141416353147400177310ustar00rootroot00000000000000/* 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( Ui_formMainWindow *ui_mainwindow ) : uiHelp(new(Ui::help)) { ui = ui_mainwindow; uiHelp->setupUi( this ); connect(uiHelp->buttonBox, SIGNAL( clicked( QAbstractButton * ) ), this, SLOT( close() ) ); 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( ":/pictures/help/information.png" ); 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 ); } } } if ( accessible == QNetworkAccessManager::Accessible ) { ui->comboBoxOnlineHelp->setEnabled( true ); } if ( accessible == QNetworkAccessManager::NotAccessible ) { ui->comboBoxOnlineHelp->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 ) ) { qDebug().noquote() << global::nameOutput << "QvkHelp::getCountFileToDownload" << tempPathFileName << file.errorString(); //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 ) ) { qDebug().noquote() << global::nameOutput << "QvkHelp::slot_showHelp" << tempPathFileName << file.errorString(); //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.1.0/src/help/QvkHelp.h000066400000000000000000000041201416353147400173650ustar00rootroot00000000000000/* 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( Ui_formMainWindow *ui_mainwindow ); virtual ~QvkHelp() override; public slots: void slot_cleanUp(); 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; private slots: void slot_parseHTML( QString tempPathFileName ); void slot_showHelp( QString tempPathFileName ); void slot_NetworkAccessibility( QNetworkAccessManager::NetworkAccessibility accessible ); void slot_parse_locale( QStringList list ); protected: bool eventFilter(QObject *object, QEvent *ev) override; signals: }; #endif vokoscreenNG-3.1.0/src/help/QvkLocale.cpp000066400000000000000000000033221416353147400202320ustar00rootroot00000000000000/* 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.1.0/src/help/QvkLocale.h000066400000000000000000000024641416353147400177050ustar00rootroot00000000000000/* 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.1.0/src/help/help.pri000066400000000000000000000004411416353147400173100ustar00rootroot00000000000000INCLUDEPATH += $$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.1.0/src/help/help.ui000066400000000000000000000025571416353147400171450ustar00rootroot00000000000000 help 0 0 400 300 Form true TextLabel Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse QDialogButtonBox::Close vokoscreenNG-3.1.0/src/imageFromTabs/000077500000000000000000000000001416353147400174355ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/imageFromTabs/QvkImageFromTabs.cpp000066400000000000000000000105101416353147400233000ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 "QvkImageFromTabs.h" #include #include #include #include #include #include #include #include QvkImageFromTabs::QvkImageFromTabs( QvkMainWindow *parent ) { vokoscreenGuiWithoutMargins = parent; setTitle( "vokoscreenNG Referenz Window" ); resize( 400, 300 ); } void QvkImageFromTabs::init( Ui_formMainWindow *vk_ui ) { ui = vk_ui; connect( ui->pushButtonImages, SIGNAL( clicked() ), this, SLOT( slot_make_picture_from_tabs() ) ); } QvkImageFromTabs::~QvkImageFromTabs() {} void QvkImageFromTabs::slot_make_picture_from_tabs() { ui->pushButtonImages->setEnabled( false ); counterFile = 0; show(); for ( int y = 0; y < 30; y++ ) { QCoreApplication::processEvents(); QThread::msleep( 100 ); } left = frameMargins().left(); top = frameMargins().top(); right = frameMargins().right(); bottom = frameMargins().bottom(); close(); for ( int i = 0; i < ui->tabWidgetScreencast->tabBar()->count(); i++ ) { ui->tabWidgetScreencast->setCurrentIndex( i ); for ( int y = 0; y < 30; y++ ) { QCoreApplication::processEvents(); QThread::msleep( 20 ); } slot_make_picture_from_tab(); } QList listToolButton = ui->widgetSidbar->findChildren(); for ( int i = 1; i < listToolButton.count(); i++ ) { listToolButton.at(i)->click(); for ( int y = 0; y < 30; y++ ) { QCoreApplication::processEvents(); QThread::msleep( 20 ); } slot_make_picture_from_tab(); } listToolButton.at(0)->click(); if ( QDesktopServices::openUrl( QUrl( "file:///" + QStandardPaths::writableLocation( QStandardPaths::PicturesLocation ), QUrl::TolerantMode ) ) == false ) { QMessageBox msgBox; msgBox.setText( tr( "No filemanager found." ) + "\n" + tr( "Please install a filemanager." ) ); msgBox.setWindowTitle( global::name + " " + global::version ); msgBox.setIcon( QMessageBox::Information ); msgBox.exec(); } ui->pushButtonImages->setEnabled( true ); } void QvkImageFromTabs::slot_make_picture_from_tab() { QList screenList = QGuiApplication::screens(); int sumScreenWidth = 0; QMap map; for ( int i = 0; i < screenList.count(); i++ ) { sumScreenWidth = sumScreenWidth + screenList.at(i)->size().width(); map.insert( screenList.at(i)->size().height(), QString::number( screenList.at(i)->size().height() ) ); } QPixmap pixmapScreen( screenList.at(0)->grabWindow( 0, 0, 0, sumScreenWidth, map.values().last().toInt() ) ); QPixmap windowPixmap = pixmapScreen.copy( vokoscreenGuiWithoutMargins->mapToGlobal( QPoint(0,0) ).x() - left, vokoscreenGuiWithoutMargins->mapToGlobal( QPoint(0,0) ).y() - top, vokoscreenGuiWithoutMargins->size().width() + left + right, vokoscreenGuiWithoutMargins->size().height() + top + bottom ); windowPixmap.save( QStandardPaths::writableLocation( QStandardPaths::PicturesLocation ) + "/" + "vokoscreenNG-" + QString::number( counterFile++ ) + ".png" ); ui->label_save_image_path->setAlignment( Qt::AlignHCenter ); ui->label_save_image_path->setText( "Images saved in: " + QStandardPaths::writableLocation( QStandardPaths::PicturesLocation ) ); } vokoscreenNG-3.1.0/src/imageFromTabs/QvkImageFromTabs.h000066400000000000000000000027331416353147400227550ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 QVKIMAGEFROMTABS_H #define QVKIMAGEFROMTABS_H #include "ui_formMainWindow.h" #include #include class QvkImageFromTabs : public QWindow { Q_OBJECT public: QvkImageFromTabs( QvkMainWindow *parent = 0 ); virtual ~QvkImageFromTabs(); void init( Ui_formMainWindow *vk_ui ); public slots: private slots: void slot_make_picture_from_tab(); void slot_make_picture_from_tabs(); signals: protected: private: Ui_formMainWindow *ui = Q_NULLPTR; QvkMainWindow *vokoscreenGuiWithoutMargins = Q_NULLPTR; int left = 0; int top = 0; int right = 0; int bottom = 0; int counterFile = 0; }; #endif vokoscreenNG-3.1.0/src/imageFromTabs/imageFromTabs.pri000066400000000000000000000001761416353147400226750ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkImageFromTabs.h SOURCES += $$PWD/QvkImageFromTabs.cpp vokoscreenNG-3.1.0/src/information/000077500000000000000000000000001416353147400172425ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/information/QvkInformation.cpp000066400000000000000000000165051416353147400227240ustar00rootroot00000000000000/* 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( QvkMainWindow *vkMainWindow, Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *slider_count_down, QvkSpezialSlider *slider_Second_Wait_Before_Recording ) { mainWindow = vkMainWindow; 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 QElapsedTimer(); 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() ) ); // Update ui->label_Upate_tab_1->clear(); ui->label_Upate_tab_4->clear(); connect( &version, SIGNAL( signal_newVersionAvailable( QString ) ), this, SLOT( slot_newVersionAvailable( QString ) ) ); connect( ui->checkBoxLookForUpdates, SIGNAL( toggled( bool ) ), &version, SLOT( slot_doDownload( bool ) ) ); // Frames, Format, Codecs connect( ui->comboBoxFormat, SIGNAL( currentTextChanged( QString ) ), this, SLOT( slot_Format( QString ) ) ); connect( ui->comboBoxVideoCodec, SIGNAL( currentTextChanged( QString ) ), this, SLOT( slot_Videocodec( QString ) ) ); connect( ui->comboBoxAudioCodec, SIGNAL( currentTextChanged( QString ) ), this, SLOT( slot_Audiocodec( QString ) ) ); connect( mainWindow->sliderFrames, SIGNAL( valueChanged( int ) ), this, SLOT( slot_Frames( int ) ) ); } QvkInformation::~QvkInformation() { } void QvkInformation::slot_Format( QString value ) { ui->labelInfoFormat->setText( value ); ui->labelInfoFrames->setText( QString::number( mainWindow->sliderFrames->value() ) ); } void QvkInformation::slot_Videocodec( QString value ) { ui->labelInfoVideocodec->setText( value ); } void QvkInformation::slot_Audiocodec( QString value ) { bool bo = false; QList listCheckBox = ui->scrollAreaAudioDevice->findChildren(); for ( int i = 0; i < listCheckBox.count(); i++ ) { if ( listCheckBox.at(i)->checkState() == Qt::Checked ) { bo = true; break; } } if ( bo == false ) { ui->labelInfoAudiocodec->setText( "------" ); } else { ui->labelInfoAudiocodec->setText( value ); } } void QvkInformation::slot_Frames( int value ) { ui->labelInfoFrames->setText( QString::number( value ) ); } void QvkInformation::slot_newVersionAvailable( QString update ) { if ( ui->checkBoxLookForUpdates->isChecked() == true ) { if ( global::version < update ) { QString string = "New Version available: " + update; ui->label_Upate_tab_1->setText( "" + string + "" ); ui->label_Upate_tab_4->setText( "" + string + "" ); } else { ui->label_Upate_tab_4->setText( "No update available" ); } } else { ui->label_Upate_tab_1->clear(); ui->label_Upate_tab_4->clear(); } } 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.1.0/src/information/QvkInformation.h000066400000000000000000000041401416353147400223610ustar00rootroot00000000000000/* 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 "QvkVersion.h" #include "mainwindow.h" #include #include class QvkInformation: public QWidget { Q_OBJECT public: QvkInformation(QvkMainWindow *vkMainWindow, Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *slider_count_down, QvkSpezialSlider *slider_Second_Wait_Before_Recording ); virtual ~QvkInformation(); QvkMainWindow *mainWindow; 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(); void slot_newVersionAvailable( QString update ); void slot_Format( QString value ); void slot_Videocodec( QString value ); void slot_Audiocodec( QString value ); void slot_Frames( int value ); signals: protected: private: Ui_formMainWindow *ui; QString newVideoFilename = ""; QTimer *timerStorageInfo; QTimer *timerRecord; QElapsedTimer *elapsedTime; int int_summed = 0; QvkSpezialSlider *sliderCountDown; QvkSpezialSlider *sliderSecondWaitBeforeRecording; QvkVersion version; QString fileName = ""; }; #endif vokoscreenNG-3.1.0/src/information/information.pri000066400000000000000000000002141416353147400223000ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkInformation.h SOURCES += $$PWD/QvkInformation.cpp vokoscreenNG-3.1.0/src/language/000077500000000000000000000000001416353147400165005ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/language/ar.ts000066400000000000000000000365401416353147400174620ustar00rootroot00000000000000 QvkAudioController Select one or more devices اِختر جهازاً أو أكثر QvkCameraController Camera الكاميرا QvkCameraWindow Switch to Window أظهر النافذة Switch to Fullscreen تغيير لملء الشاشة QvkDirectSoundController Select one or more devices اِختر جهازاً أو أكثر QvkHelp Help مساعده QvkImageFromTabs No filemanager found. لايمكن ايجاد اداراه الملفات Please install a filemanager.  الرجاء تنصيب اداره الملفات 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.  الرجاء تنصيب اداره الملفات Sourcecode الملف المصدري Homepage صفحة البرنامج Translations الترجمات Donate تبرع QvkPulseAudioWatcher Select one or more devices اِختر جهازاً أو أكثر QvkRegionChoise Area منطقة QvkSystray Start اِبدأ Stop أوقِف Pause ألبِث Continue واصل Exit اُخرج Camera الكاميرا Magnification المكبّرة 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 جوده 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.1.0/src/language/ca.ts000066400000000000000000000352131416353147400174370ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Seleccioneu un o més dispositius QvkHelp Help Ajuda QvkImageFromTabs No filemanager found. No s’ha trobat cap gestor de fitxers. Please install a filemanager. Instal·leu un gestor de fitxers. 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. Sourcecode Codi font Homepage Lloc web Translations Traduccions Donate Feu una donació QvkPulseAudioWatcher Select one or more devices Seleccioneu un o més dispositius QvkRegionChoise Area Àrea QvkSystray Start Inicia Stop Atura Pause Pausa Continue Continua Exit Surt Camera Càmera Magnification Ampliació 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 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 ajustaments en el proper 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.1.0/src/language/cs_CZ.ts000066400000000000000000000351061416353147400200560ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Vyberte jedno nebo více zařízení QvkHelp Help Nápověda QvkImageFromTabs No filemanager found. Nebyl nalezen žádný správce souborů. Please install a filemanager. Prosím o instalaci správce souborů. 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ů. Sourcecode Zdrojový kód Homepage Domovská stránka Translations Překlad Donate Podpořit QvkPulseAudioWatcher Select one or more devices Vyberte jedno nebo více zařízení QvkRegionChoise Area Výřez QvkSystray Start Start Stop Stop Pause Pauza Continue Pokračovat Exit Odejít Camera Kamera Magnification Zvětšení 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 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.1.0/src/language/da_DK.ts000066400000000000000000000344121416353147400200160ustar00rootroot00000000000000 QvkAudioController Select one or more devices Vælg en eller flere enheder QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Skift til vindue Switch to Fullscreen Skift til fuld skærm QvkDirectSoundController Select one or more devices Vælg en eller flere enheder QvkHelp Help Hjælp QvkImageFromTabs No filemanager found. Der blev ikke fundet en filemanager. Please install a filemanager. Installer venligst en filemanager. QvkLimitDiskFreeSpace Warning Advarsel The recording is not started, not enough free disk space. Optagelsen er ikke startet, ikke nok disk plads. The free disk space limit is reached. Grænsenfor fri disk plads er nået. Limit of free disk space Grænse for ledig diskplads Megabyte Megabyte The recording was stopped, not enough free disk space. Optagelsen blev stoppet, ikke nok fri disk plads. QvkMainWindow Fullscreen Fuldskærm Window Vindue No filemanager found. Der blev ikke fundet en filemanager. Please install a filemanager. Installer venligst en filemanager. Sourcecode Kildekode Homepage Hjemmeside Translations Oversættelser Donate Donér QvkPulseAudioWatcher Select one or more devices Vælg en eller flere enheder QvkRegionChoise Area Område QvkSystray Start Start Stop Stop Pause Pause Continue Fortsæt Exit Afslut Camera Kamera Magnification Forstørrelse QvkSystrayAlternative Start Start Stop Stop Pause Pause Continue Fortsæt Exit Afslut cameraSettingsDialog Dialog Dialog Flip horizontal Vend horisontalt Flip vertical Vend vertikalt Invert Negativ Gray Grå Black-and-white Sort hvid Remove window frame Fjern vinduesramme 160x120 160x120 320x240 320x240 Camera settings Kamera indstillinger 640x480 640x480 formMainWindow Area Område Reset Nulstil Magnification Forstørrelse Countdown Nedtælling Video size: Videostørrelse: Free disk space: Ledig diskplads: Information Information Record Time: Optagelsestid: Audio Lyd Frames Billeder Videocodec Video-codec Format Format Audiocodec Lyd-codec Quality Kvalitet Do not record mouse cursor Optag ikke musemarkør Hour Timer Minute Minutter Start the timer Start timeren Stop recording after Stop optagelse efter Hours Timer Minutes Minutter Seconds Sekunder Videopath Videosti Limit of free disk space Grænse for ledig diskplads Show in systray Vis i systembakke Second wait before recording Sekunder der skal ventes inden optagelse Look for updates Led efter opdateringer Help Hjælp Video Video Available Tilgængelig Not available Ikke tilgængelig Start Start Stop Stop Pause Pause Continue Fortsæt Play Afspil Folder Mappe Camera Kamera Invert Negativ 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 Afspil seneste optagelse Open folder Åbn mappe CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimeret når optagelse starter Starts minimized Starter minimeret Flip horizontal Vend horisontalt Flip vertical Vend vertikalt Black-and-white Sort hvid Remove window frame Fjern vinduesramme Donate Donér Reset all settings at the next start Nulstil alle indstillinger ves næste start Copyright and license from pictures Ophavsret og licens fra billeder Megabyte Megabyte Screencast Skærmudsending Player Afspiller Log Log license Copyright and license from pictures Ophavsret og licens fra billeder player Play Afspil Pause Pause Stop Stop Open File Åben fil Fullscreen Fuldskærm Previous frame Forrige ramme Next frame Næste ramme Mute Tavs Move menu Flyt menu vokoscreenNG-3.1.0/src/language/de_AT.ts000066400000000000000000000346131416353147400200330ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Ein oder mehrere Geräte auswählen QvkHelp Help Hilfe QvkImageFromTabs No filemanager found. Kein Dateimanager gefunden Please install a filemanager. Bitte installiere einen Dateimanager 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 Sourcecode Quellcode Homepage Webseite Translations Übersetzungen Donate Spende QvkPulseAudioWatcher Select one or more devices Ein oder mehrere Geräte auswählen QvkRegionChoise Area Bereich QvkSystray Start Start Stop Stop Pause Pause Continue Weiter Exit Verlassen Camera Kamera Magnification Lupe 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 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.1.0/src/language/de_CH.ts000066400000000000000000000346351416353147400200250ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Ein oder mehrere Geräte auswählen QvkHelp Help Hilfe QvkImageFromTabs No filemanager found. Kein Dateimanager gefunden. Please install a filemanager. Bitte installieren Sie einen Dateimanager. 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. Sourcecode Quellcode Homepage Webseite Translations Übersetzungen Donate Spende QvkPulseAudioWatcher Select one or more devices Ein oder mehrere Geräte auswählen QvkRegionChoise Area Bereich QvkSystray Start Start Stop Stop Pause Pause Continue Weiter Exit Verlassen Camera Kamera Magnification Lupe 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 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.1.0/src/language/de_DE.ts000066400000000000000000000347041416353147400200200ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Ein oder mehrere Geräte auswählen QvkHelp Help Hilfe QvkImageFromTabs No filemanager found. Kein Dateimanager gefunden. Please install a filemanager. Bitte installieren Sie einen Dateimanager. 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. Sourcecode Quellcode Homepage Webseite Translations Übersetzungen Donate Spenden QvkPulseAudioWatcher Select one or more devices Ein oder mehrere Geräte auswählen QvkRegionChoise Area Bereich QvkSystray Start Start Stop Stop Pause Pause Continue Weiter Exit Beenden Camera Kamera Magnification Lupe 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 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.1.0/src/language/el_GR.ts000066400000000000000000000404611416353147400200450ustar00rootroot00000000000000 QvkAudioController Select one or more devices Επιλογή μιας ή περισσότερων συσκευών QvkCameraController Camera Κάμερα QvkCameraWindow Switch to Window Εναλλαγή σε Παράθυρο Switch to Fullscreen Εναλλαγή σε Πλήρη οθόνη QvkDirectSoundController Select one or more devices Επιλογή μιας ή περισσότερων συσκευών QvkHelp Help Βοήθεια QvkImageFromTabs No filemanager found. Δε βρέθηκε διαχειριστής αρχείων. Please install a filemanager. Παρακαλώ εγκαταστήστε ένα διαχειριστή αρχείων. 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. Παρακαλώ εγκαταστήστε ένα διαχειριστή αρχείων. Sourcecode Πηγαίος κώδικας Homepage Αρχική Translations Μεταφράσεις Donate Δωρεά QvkPulseAudioWatcher Select one or more devices Επιλογή μιας ή περισσότερων συσκευών QvkRegionChoise Area Περιοχή QvkSystray Start Έναρξη Stop Διακοπή Pause Παύση Continue Συνέχιση Exit Έξοδος Camera Κάμερα Magnification Μεγένθυση 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 Ποιότητα 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.1.0/src/language/eo.ts000066400000000000000000000350341416353147400174600ustar00rootroot00000000000000 QvkAudioController Select one or more devices Elekti unu aŭ pliajn aparatojn QvkCameraController Camera Kamerao QvkCameraWindow Switch to Window Ŝanĝi al fenestro Switch to Fullscreen Eniri plenekranan reĝimon QvkDirectSoundController Select one or more devices Elektu unu aŭ pliajn aparatojn QvkHelp Help Helpo QvkImageFromTabs No filemanager found. Ne eblis trovi dosieradministrilon. Please install a filemanager. Instalu dosieradministrilon. QvkLimitDiskFreeSpace Warning Averto The recording is not started, not enough free disk space. La ekranregistrado ne startis: mankas libera diskospaco. The free disk space limit is reached. Atingis la limon de libera diskospaco. Limit of free disk space Limo de libera diskospaco Megabyte Megabajto The recording was stopped, not enough free disk space. La ekranregistrado ĉesis: mankas libera diskospaco. QvkMainWindow Fullscreen Plenekrane Window Fenestro No filemanager found. Ne eblis trovi dosieradministrilon. Please install a filemanager. Instalu dosieradministrilon. Sourcecode Fontkodo Homepage Ĉefpaĝo Translations Tradukoj Donate Donacu QvkPulseAudioWatcher Select one or more devices Elektu unu aŭ pliajn aparatojn QvkRegionChoise Area Ekranregiono QvkSystray Start Komenci Stop Haltigi Pause Paŭzigi Continue Daŭrigi Exit Eliri Camera Kamerao Magnification Ekranopligrandigo QvkSystrayAlternative Start Komenci Stop Haltigi Pause Paŭzigi Continue Daŭrigi Exit Eliri cameraSettingsDialog Dialog Dialogo Flip horizontal Inversigi horizontale Flip vertical Inversigi kapo-suben Invert Inversigi kolorojn Gray Grize Black-and-white Nigre-blanke Remove window frame Forigi kadron de fenestro 160x120 160×120 320x240 320×240 Camera settings Agordoj de kamerao 640x480 640×480 formMainWindow Area Ekranregiono Reset Restarigi Magnification Ekranopligrandigo Countdown Ĝisnombrado Video size: Grando de la video: Free disk space: Libera diskospaco: Information Informoj Record Time: Tempo de registrado: Audio Aŭdaĵoj Frames Filmeroj Videocodec Filmkodeko Format Aŭdviduja formo Audiocodec Sonkodeko Quality Kvalito Do not record mouse cursor Ne ekranregistri musmontrilon Hour Horo Minute Minuto Start the timer Lanĉi tempumilon Stop recording after Ĉesi registradon post Hours Horoj Minutes Minutoj Seconds Sekundoj Videopath Dosierindiko de filmregistraĵo Limit of free disk space Limo de libera diskospaco Show in systray Montri je taskopleto Second wait before recording Sekundoj da atendado antaŭ ekregistri Look for updates Serĉi ĝisdatigojn Help Helpo Video Filmetformo Available Disponebla Not available Ne disponebla Start Komenci Stop Haltigi Pause Paŭzigi Continue Daŭrigi Play Ludi Folder Dosierujo Camera Kamerao Invert Inversigi kolorojn Gray Grize Send Report Sendi prikolapsan raporton CTRL+SHIFT+F10 Ctrl + Shift + F10 CTRL+SHIFT+F11 Ctrl + Shift + F11 CTRL+SHIFT+F12 Ctrl + Shift + F12 Play last record Ludi lastan registron Open folder Malfermi dosierujon CTRL+SHIFT+F8 Ctrl + Shift + F8 Minimized when recording starts Minimumigi kiam registrado startos Starts minimized Starti minimumigite Flip horizontal Inversigi horizontale Flip vertical Inversigi kapo-suben Black-and-white Nigre-blanke Remove window frame Forigi kadron de fenestro Donate Donacu Reset all settings at the next start Restarigi ĉiujn agordojn dum proksima starto Copyright and license from pictures Aŭtorrajtoj kaj kopirajtaj permesiloj de la bildoj Megabyte Megabajto Screencast Ekranregistrado Player Ludilo Log Protokolo license Copyright and license from pictures Aŭtorrajtoj kaj kopirajtaj permesiloj de la bildoj player Play Ludi Pause Paŭzigi Stop Haltigi Open File Malfermi dosieron Fullscreen Plenekrane Previous frame Antaŭa filmero Next frame Sekva filmero Mute Silentigi Move menu Movi menuon vokoscreenNG-3.1.0/src/language/es.ts000066400000000000000000000352231416353147400174640ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Seleccione uno o más dispositivos QvkHelp Help Ayuda QvkImageFromTabs No filemanager found. No se encontró ningún gestor de archivos. Please install a filemanager. Instale un gestor de archivos. 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. Sourcecode Código fuente Homepage Sitio web Translations Traducciones Donate Donar QvkPulseAudioWatcher Select one or more devices Seleccione uno o más dispositivos QvkRegionChoise Area Área QvkSystray Start Iniciar Stop Detener Pause Pausar Continue Continuar Exit Salir Camera Cámara Magnification Ampliación 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 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.1.0/src/language/es_419.ts000066400000000000000000000350571416353147400200660ustar00rootroot00000000000000 QvkAudioController Select one or more devices Seleccione uno o más dispositivos QvkCameraController Camera Cámara QvkCameraWindow Switch to Window Cambiar a modo ventana Switch to Fullscreen Cambiar a modo pantalla completa QvkDirectSoundController Select one or more devices Seleccione uno o más dispositivos QvkHelp Help Ayuda QvkImageFromTabs No filemanager found. No se encontró administrador de archivos Please install a filemanager. Por favor instalar un administrador de archivos QvkLimitDiskFreeSpace Warning Cuidado The recording is not started, not enough free disk space. Grabación no iniciada, no tiene espacio en el disco duro The free disk space limit is reached. Se alcanzó el límite de 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. La grabación fue detenida, no tiene espacio libre en el disco QvkMainWindow Fullscreen Pantalla completa Window Ventana No filemanager found. No se encontró administrador de archivos Please install a filemanager. Por favor instalar un administrador de archivos Sourcecode Código fuente Homepage Página de inicio Translations Traducciones Donate Donar QvkPulseAudioWatcher Select one or more devices Seleccione uno o más dispositivos QvkRegionChoise Area Área QvkSystray Start Iniciar Stop Detener Pause Pausar Continue Continuar Exit Salir Camera Cámara Magnification Ampliación QvkSystrayAlternative Start Iniciar Stop Detener Pause Pausar Continue Continuar Exit Salir cameraSettingsDialog Dialog Dialogo Flip horizontal Giro Horizontal Flip vertical Gira Vertical Invert Invertir Gray Gris Black-and-white Blanco y negro Remove window frame Remover marco de ventana 160x120 160x120 320x240 320x240 Camera settings Ajustes de camara 640x480 640x480 formMainWindow Area Área Reset Reiniciar Magnification Ampliación Countdown Conteo regresivo Video size: Tamaño video: Free disk space: Espacio de disco libre: Information Información Record Time: Tiempo de grabación: Audio Audio Frames Cuadros Videocodec Codec de video Format Formato Audiocodec Codec de audio Quality Calidad Do not record mouse cursor No grabar puntero del ratón Hour Hora Minute Minuto Start the timer Iniciar temporizador Stop recording after Detener grabación después de Hours Horas Minutes Minutos Seconds Segundos Videopath Videopath 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 Revisar actualizaciones Help Ayuda Video Video Available Disponible Not available No disponible Start Iniciar Stop Detener Pause Pausar Continue Continuar Play Play Folder Carpeta Camera Cámara Invert Invertir Gray Gris Send Report Enviar reporte CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Reproducir la última grabación Open folder Abrir folder CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimizar cuando la grabación comience Starts minimized Iniciar minimizado Flip horizontal Giro Horizontal Flip vertical Gira Vertical Black-and-white Blanco y negro Remove window frame Remover marco de ventana Donate Donar Reset all settings at the next start Resetear todas las configuraciones en el próximo inicio Copyright and license from pictures Derechos de autor y licencias de imágenes Megabyte Megabyte Screencast Grabaciones Player Reproductor Log Registro license Copyright and license from pictures Derechos de autor y licencias de imágenes player Play Play Pause Pausar Stop Detener Open File Abrir archivo Fullscreen Pantalla completa Previous frame Cuadro anterior Next frame Cuadro siguiente Mute Silenciar Move menu Mover menú vokoscreenNG-3.1.0/src/language/es_AR.ts000066400000000000000000000350711416353147400200470ustar00rootroot00000000000000 QvkAudioController Select one or more devices Seleccione uno o más dispositivos QvkCameraController Camera Camara QvkCameraWindow Switch to Window Cambiar a modo ventana Switch to Fullscreen Cambiar a pantalla completa QvkDirectSoundController Select one or more devices Seleccione uno o más dispositivos QvkHelp Help Ayuda QvkImageFromTabs No filemanager found. Administrador de archivos no valido Please install a filemanager. Por favor, instale un administrador de archivos. QvkLimitDiskFreeSpace Warning Advertencia The recording is not started, not enough free disk space. La grabación no ha empezado, no hay suficiente espacio en disco The free disk space limit is reached. Se alcanzó el limite de espacio libre en disco Limit of free disk space Limite de espacio libre en el disco Megabyte Megabyte The recording was stopped, not enough free disk space. La grabación ha parado, no hay suficiente espacio en disco QvkMainWindow Fullscreen Pantalla completa Window Ventana No filemanager found. Administrador de archivos no valido Please install a filemanager. Por favor, instale un administrador de archivos. Sourcecode Código fuente Homepage Sitio web Translations Traducciones Donate Donar QvkPulseAudioWatcher Select one or more devices Seleccione uno o más dispositivos QvkRegionChoise Area Área QvkSystray Start Iniciar Stop Detener Pause Pausar Continue Continuar Exit Salir Camera Camara Magnification Ampliación QvkSystrayAlternative Start Iniciar Stop Detener Pause Pausar Continue Continuar Exit Salir cameraSettingsDialog Dialog Dialogo Flip horizontal Giro horizontal Flip vertical Giro vertical Invert Invertir Gray Gris Black-and-white Negro-y-blanco Remove window frame Quitar el marco de la ventana 160x120 160x120 320x240 320x240 Camera settings Opciones de Camara 640x480 640x480 formMainWindow Area Área Reset Reiniciar Magnification Ampliación Countdown Cuenta regresiva Video size: Tamaño de video: Free disk space: Espacio libre en el disco: Information Informacón Record Time: Tiempo de grabación Audio Audio Frames Fotogramas Videocodec Códec de video Format Formato Audiocodec Códec de audio Quality Calidad Do not record mouse cursor No grabar el puntero del ratón Hour Hora Minute Minuto Start the timer Iniciar el cronometro Stop recording after Detener la grabacion después Hours Horas Minutes Minutos Seconds Segundos Videopath Ruta del vídeo Limit of free disk space Limite de espacio libre en el disco Show in systray Mostrar en bandeja del sistema Second wait before recording Segundo de espera antes de la grabación Look for updates Buscar actualizaciones Help Ayuda Video Video Available Disponible Not available No disponible Start Iniciar Stop Detener Pause Pausar Continue Continuar Play Reproducir Folder Carpeta Camera Camara Invert Invertir Gray Gris Send Report Enviar reporte CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Reproducir la ultima grabación Open folder Abrir archivo CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimizar cuando comience la grabación Starts minimized Comienza minimizado Flip horizontal Flip horizontal Flip vertical Giro vertical Black-and-white Negro-y-blanco Remove window frame Quitar el marco de la ventana Donate Donar Reset all settings at the next start Restablecer todas las configuraciones en el próximo inicio Copyright and license from pictures Copyright y licencia de imágenes Megabyte Megabyte Screencast Grabación Player Reproductor Log Log license Copyright and license from pictures Copyright y licencia de imágenes player Play Reproducir Pause Pausar Stop Detener Open File Abrir archivo Fullscreen Pantalla completa Previous frame Frame anterior Next frame Siguiente frame Mute Silenciar Move menu Mover menu vokoscreenNG-3.1.0/src/language/es_MX.ts000066400000000000000000000353361416353147400200750ustar00rootroot00000000000000 QvkAudioController Select one or more devices Elige uno o más dispositivos QvkCameraController Camera Cámara QvkCameraWindow Switch to Window Pasa a la Ventana Switch to Fullscreen Pasa a Pantalla Completa QvkDirectSoundController Select one or more devices Elige uno o más dispositivos QvkHelp Help Ayuda QvkImageFromTabs No filemanager found. No se encontró el manejador de archivos. Please install a filemanager. Por favor, instale un manejador de archivos. QvkLimitDiskFreeSpace Warning Advertencia The recording is not started, not enough free disk space. La grabación no ha comenzado porque no hay suficiente espacio libre en el disco. The free disk space limit is reached. El espacio libre del disco se agotó. Limit of free disk space Espacio libre del disco Megabyte Megabyte The recording was stopped, not enough free disk space. La grabación se detuvo porque no hay espacio libre en el disco. QvkMainWindow Fullscreen Pantalla Completa Window Ventana No filemanager found. No se encontró el manejador de archivos. Please install a filemanager. Por favor, instale un manejador de archivos. Sourcecode Código fuente Homepage Página de inicio Translations Traducciones Donate Donar QvkPulseAudioWatcher Select one or more devices Elige uno o más dispositivos QvkRegionChoise Area Área QvkSystray Start Comenzar Stop Detener Pause Pausar Continue Continuar Exit Salir Camera Cámara Magnification Ampliación QvkSystrayAlternative Start Comenzar Stop Detener Pause Pausar Continue Continuar Exit Salir cameraSettingsDialog Dialog Diálogo Flip horizontal Distribuir en dos ventanas horizontales Flip vertical Distribuir en dos ventanas verticales Invert Invertir Gray Tonos de Gris Black-and-white Blanco y Negro Remove window frame Remover el marco de la ventana 160x120 160x120 320x240 320x240 Camera settings Configuración de la cámara 640x480 640x480 formMainWindow Area Área Reset Redefinir Magnification Ampliación Countdown Cuenta regresiva Video size: Tamaño del video: Free disk space: Espacio libre del disco: Information Información Record Time: Tiempo de grabación: Audio Audio Frames Cuadros Videocodec Codec de video Format Formato Audiocodec Codec de audio Quality Calidad Do not record mouse cursor No grabar el cursor del ratón Hour Hora Minute Minuto Start the timer Iniciar el cronómetro Stop recording after Detener la grabación después de Hours Horas Minutes Minutos Seconds Segundos Videopath Ruta al video Limit of free disk space Espacio libre del disco Show in systray Mostrar en systray Second wait before recording Segundos a esperar antes de la grabación Look for updates Buscar actualizaciones Help Ayuda Video Video Available Disponible Not available No disponible Start Comenzar Stop Detener Pause Pausar Continue Continuar Play Reproducir Folder Carpeta Camera Cámara Invert Invertir Gray Tonos de Gris Send Report Enviar el Reporte CTRL+SHIFT+F10 CTRL+MAYUS+F10 CTRL+SHIFT+F11 CTRL+MAYUS+F11 CTRL+SHIFT+F12 CTRL+MAYUS+F12 Play last record Reproducir la última grabación Open folder Abrir carpeta CTRL+SHIFT+F8 CTRL+MAYUS+F8 Minimized when recording starts Minimizada cuando comience la grabación Starts minimized Comienza minimizada Flip horizontal Distribuir en dos ventanas horizontales Flip vertical Distribuir en dos ventanas verticales Black-and-white Blanco y Negro Remove window frame Remover el marco de la ventana Donate Donar Reset all settings at the next start Redefinir la configuración en la siguiente grabación Copyright and license from pictures Derechos de autor y licencia sobre la grabación Megabyte Megabyte Screencast Pantalla de grabación Player Reproductor Log Bitácora license Copyright and license from pictures Derechos de autor y licencia sobre la grabación player Play Reproducir Pause Pausar Stop Detener Open File Abrir Archivo Fullscreen Pantalla Completa Previous frame Cuadro anterior Next frame Siguiente cuadro Mute Apagar el micrófono Move menu Mover el menú vokoscreenNG-3.1.0/src/language/eu_ES.ts000066400000000000000000000347731416353147400200660ustar00rootroot00000000000000 QvkAudioController Select one or more devices Hautatu gailu bat edo gehiago QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Aldatu leihora Switch to Fullscreen Aldatu pantaila osora QvkDirectSoundController Select one or more devices Hautatu gailu bat edo gehiago QvkHelp Help Laguntza QvkImageFromTabs No filemanager found. Ez da fitxategi arakatzailerik aurkitu Please install a filemanager. Instalatu fitxategi arakatzaile bat. QvkLimitDiskFreeSpace Warning Abisua The recording is not started, not enough free disk space. Grabazioa ez da hasi, ez dago nahikoa tokirik diskoan. The free disk space limit is reached. Diskoaren espazio librea bukatu da. Limit of free disk space Diskoaren espazio librearen muga Megabyte Megabyte The recording was stopped, not enough free disk space. Grabazioa gelditu da, ez dago espazio libre nahikorik. QvkMainWindow Fullscreen Pantaila osoa Window Leihoa No filemanager found. Ez da fitxategi arakatzailerik aurkitu Please install a filemanager. Instalatu fitxategi arakatzaile bat. Sourcecode Iturburu-kodea Homepage Hasiera-orria Translations Itzulpenak Donate Eman dirua QvkPulseAudioWatcher Select one or more devices Hautatu gailu bat edo gehiago QvkRegionChoise Area Eremua QvkSystray Start Hasi Stop Gelditu Pause Pausatu Continue Jarraitu Exit irten Camera Kamera Magnification Lupa QvkSystrayAlternative Start Hasi Stop Gelditu Pause Pausatu Continue Jarraitu Exit Irten cameraSettingsDialog Dialog Elkarrizketa Flip horizontal Irauli horizontalean Flip vertical Irauli bertikalean Invert Alderantzizkatu Gray Grisa Black-and-white Zuri-beltza Remove window frame Kendu leihoaren markoa 160x120 160x120 320x240 320x240 Camera settings Kameraren ezarpenak 640x480 640x480 formMainWindow Area Eremua Reset Berrezarri Magnification Lupa Countdown Atzera-kontua Video size: Bideoaren tamaina: Free disk space: Diskoko leku librea: Information Informazioa Record Time: Grabazio denbora: Audio Audioa Frames Fotogramak Videocodec Bideo-kodeka Format Formatua Audiocodec Audio-kodeka Quality Kalitatea Do not record mouse cursor Ez grabatu saguaren erakuslea Hour Ordu Minute Minutu Start the timer Abiatu tenporizadorea Stop recording after Gelditu grabazioa denbora honen ondoren Hours Ordu Minutes Minutu Seconds Segundo Videopath Bideoaren bidea Limit of free disk space Diskoaren espazio librearen muga Show in systray Erakutsi erretiluan Second wait before recording Segundo hauen ondoren hasi grabatzen Look for updates Begiratu eguneraketak Help Laguntza Video Bideoa Available Eskuragarria Not available Ez eskuragarria Start Hasi Stop Gelditu Pause Pausatu Continue Jarraitu Play Erreproduzitu Folder Karpeta Camera Kamera Invert Alderantzizkatu Gray Grisa Send Report Bidali txostena CTRL+SHIFT+F10 CTRL+MAIUS+F10 CTRL+SHIFT+F11 CTRL+MAIUS+F11 CTRL+SHIFT+F12 CTRL+MAIUS+F12 Play last record Erreproduzitu grabatutako azkena Open folder Ireki karpeta CTRL+SHIFT+F8 CTRL+MAIUS+F8 Minimized when recording starts Minimizatu grabazioa hastean Starts minimized Abiatu minimizatuta Flip horizontal Irauli horizontalean Flip vertical Irauli bertikalean Black-and-white Zuri-beltza Remove window frame Kendu leihoaren markoa Donate Eman dirua Reset all settings at the next start Leheneratu ezarpen guztiak abiatzen den hurrengoan Copyright and license from pictures Irudien gaineko copyrighta eta lizentzia Megabyte Megabyte Screencast Pantaila-grabazioa Player Erreproduzigailua Log Erregistroa license Copyright and license from pictures Irudien gaineko copyrighta eta lizentzia player Play Erreproduzitu Pause Pausatu Stop Gelditu Open File Ireki fitxategia Fullscreen Pantaila osoa Previous frame Aurreko fotograma Next frame Hurrengo fotograma Mute Mutu Move menu Mugitu menua vokoscreenNG-3.1.0/src/language/fa_IR.ts000066400000000000000000000363121416353147400200350ustar00rootroot00000000000000 QvkAudioController Select one or more devices انتخاب یک یا چند دستگاه QvkCameraController Camera دوربین QvkCameraWindow Switch to Window تغییر به حالت پنجره Switch to Fullscreen تغییر به حالت تمام صفحه QvkDirectSoundController Select one or more devices انتخاب یک یا چند دستگاه QvkHelp Help راهنما QvkImageFromTabs No filemanager found. برنامه مدیریت فایل پیدا نشد. Please install a filemanager. لطفا برنامه یک برنامه مدیریت فایل نصب کنید. 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. لطفا برنامه یک برنامه مدیریت فایل نصب کنید. Sourcecode کد منبع Homepage صفحه اصلی Translations ترجمه ها Donate حمایت QvkPulseAudioWatcher Select one or more devices انتخاب یک یا چند دستگاه QvkRegionChoise Area محیط QvkSystray Start شروع Stop پایان Pause وقفه Continue ادامه Exit خروج Camera دوربین Magnification بزرگنمایی 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 کیفیت 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 نمایش در 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.1.0/src/language/fi_FI.ts000066400000000000000000000346541416353147400200400ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Valitse yksi tai useampi laite QvkHelp Help Ohje QvkImageFromTabs No filemanager found. Tiedostonhallintaa ei löytynyt. Please install a filemanager. Asenna tiedostonhallinta. 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. Tiedostonhallintaa ei löytynyt. Please install a filemanager. Asenna tiedostonhallinta. Sourcecode Lähdekoodi Homepage Kotisivu Translations Käännökset Donate Lahjoita QvkPulseAudioWatcher Select one or more devices Valitse yksi tai useampi laite QvkRegionChoise Area Alue QvkSystray Start Aloita Stop Lopeta Pause Tauko Continue Jatka Exit Poistu Camera Kamera Magnification Suurennus 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 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äytön tallennin 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.1.0/src/language/fr_FR.ts000066400000000000000000000357141416353147400200600ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Sélectionnez un ou plusieurs fichiers QvkHelp Help Aide QvkImageFromTabs No filemanager found. Aucun gestionnaire de fichiers trouvé. Please install a filemanager. Veuillez installer un gestionnaire de fichiers. 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. Sourcecode Code source Homepage Page d'accueil Translations Traductions Donate Faire un don QvkPulseAudioWatcher Select one or more devices Sélectionnez un ou plusieurs fichiers QvkRegionChoise Area Zone QvkSystray Start Démarrer Stop Arrêter Pause Pause Continue Continuer Exit Sortir Camera Caméra Magnification Agrandissement 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é 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.1.0/src/language/hu.ts000066400000000000000000000353241416353147400174730ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Válasszon ki egy vagy több eszközt QvkHelp Help Súgó QvkImageFromTabs No filemanager found. Nem található fájlkezelő. Please install a filemanager. Telepítsen egy fájlkezelőt. 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. Sourcecode Forráskód Homepage Honlap Translations Fordítások Donate Adományozás QvkPulseAudioWatcher Select one or more devices Válasszon ki egy vagy több eszközt 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 Camera Kamera Magnification Nagyítá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 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.1.0/src/language/id.ts000066400000000000000000000346311416353147400174530ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Pilih satu atau lebih perangkat QvkHelp Help Bantuan QvkImageFromTabs No filemanager found. Manajer erkas tidak ditemukan Please install a filemanager. Mohon pasang sebuah manajer berkas 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 Sourcecode Kode sumber Homepage Halaman muka Translations Terjemahan Donate Donasi QvkPulseAudioWatcher Select one or more devices Pilih satu atau lebih perangkat QvkRegionChoise Area Daerah QvkSystray Start Mulai Stop Berhenti Pause Tangguhkan Continue Lanjut Exit Keluar Camera Kamera Magnification Pembesaran 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 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.1.0/src/language/it_IT.ts000066400000000000000000000350261416353147400200660ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Seleziona uno o più dispositivi QvkHelp Help Aiuto QvkImageFromTabs No filemanager found. Filemanager non trovato Please install a filemanager. Si prega di installare un filemanager 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 Sourcecode Codice sorgente Homepage Pagina iniziale Translations Traduzioni Donate Fai una donazione QvkPulseAudioWatcher Select one or more devices Seleziona uno o più dispositivi QvkRegionChoise Area Area QvkSystray Start Avvia Stop Ferma Pause Pausa Continue Continua Exit Esci Camera Webcam Magnification Ingrandimento 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à 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.1.0/src/language/ja_JP.ts000066400000000000000000000354371416353147400200470ustar00rootroot00000000000000 QvkAudioController Select one or more devices 一つ以上のデバイスを選択 QvkCameraController Camera カメラ QvkCameraWindow Switch to Window ウィンドウ表示 Switch to Fullscreen 全画面表示 QvkDirectSoundController Select one or more devices 一つ以上のデバイスを選択 QvkHelp Help ヘルプ QvkImageFromTabs No filemanager found. ファイルマネージャーが見つかりません Please install a filemanager. ファイルマネージャーをインストールしてください 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. ファイルマネージャーをインストールしてください Sourcecode ソースコード Homepage ホームページ Translations 翻訳 Donate 寄付 QvkPulseAudioWatcher Select one or more devices 一つ以上のデバイスを選択 QvkRegionChoise Area 範囲 QvkSystray Start 開始 Stop 停止 Pause 一時停止 Continue 持続する Exit 終了する Camera カメラ Magnification 拡大 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 品質 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.1.0/src/language/lt.ts000066400000000000000000000351071416353147400174750ustar00rootroot00000000000000 QvkAudioController 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ą QvkDirectSoundController Select one or more devices Pasirinkite vieną ar daugiau įrenginių QvkHelp Help Žinynas QvkImageFromTabs No filemanager found. Nerasta jokios failų tvarkytuvės. Please install a filemanager. Įdiekite failų tvarkytuvę. 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ę. Sourcecode Pirminis kodas Homepage Svetainė Translations Vertimai Donate Paaukoti QvkPulseAudioWatcher Select one or more devices Pasirinkite vieną ar daugiau įrenginių QvkRegionChoise Area Sritis QvkSystray Start Pradėti Stop Stabdyti Pause Pristabdyti Continue Tęsti Exit Išeiti Camera Kamera Magnification Didinimas 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ė 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.1.0/src/language/nl_NL.ts000066400000000000000000000346551416353147400200670ustar00rootroot00000000000000 QvkAudioController Select one or more devices Selecteer één of meer apparaten QvkCameraController Camera Camera QvkCameraWindow Switch to Window Vensterweergave Switch to Fullscreen Beeldvullende weergave QvkDirectSoundController Select one or more devices Selecteer één of meer apparaten QvkHelp Help Hulp QvkImageFromTabs No filemanager found. Er is geen bestandsbeheerder aangetroffen. Please install a filemanager. Installeer een bestandsbeheerder. QvkLimitDiskFreeSpace Warning Waarschuwing The recording is not started, not enough free disk space. De opname kan niet worden gestart omdat er onvoldoende vrije schijfruimte is. The free disk space limit is reached. Het 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 onvoldoende vrije schijfruimte is. QvkMainWindow Fullscreen Beeldvullend Window Venster No filemanager found. Er is geen bestandsbeheerder aangetroffen. Please install a filemanager. Installeer een bestandsbeheerder. Sourcecode Broncode Homepage Website Translations Vertalingen Donate Doneren QvkPulseAudioWatcher Select one or more devices Selecteer één of meer apparaten QvkRegionChoise Area Gebied QvkSystray Start Starten Stop Stoppen Pause Onderbreken Continue Hervatten Exit Afsluiten Camera Camera Magnification Vergroting QvkSystrayAlternative Start Starten Stop Stoppen Pause Onderbreken Continue Hervatten Exit Afsluiten cameraSettingsDialog Dialog Dialoogvenster Flip horizontal Horizontaal spiegelen Flip vertical Verticaal spiegelen Invert Omkeren Gray Grijs Black-and-white Zwart-wit Remove window frame Vensterrand verwijderen 160x120 160x120 320x240 320x240 Camera settings Camera-instellingen 640x480 640x480 formMainWindow Area Gebied Reset Standaardwaarden Magnification Vergroting Countdown Aftellen 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 Do not record mouse cursor Cursor verbergen Hour Uur Minute Minuut Start the timer Tijdklok starten Stop recording after Opname stoppen na Hours Uur Minutes Minuten Seconds Seconden Videopath Videomap Limit of free disk space Vrijeschijfruimtelimiet Show in systray Tonen in systeemvak Second wait before recording Aantal seconden voordat opname start Look for updates Controleren op updates Help Hulp Video Video Available Beschikbaar Not available Niet beschikbaar Start Starten Stop Stoppen Pause Onderbreken Continue Hervatten Play Afspelen Folder Map Camera Camera Invert Omkeren Gray Grijs Send Report Rapportage versturen CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Recentste opname afspelen Open folder Map openen CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimaliseren als opname start Starts minimized Geminimaliseerd starten Flip horizontal Horizontaal spiegelen Flip vertical Verticaal spiegelen Black-and-white Zwart-wit Remove window frame Vensterrand verwijderen 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 Logboek license Copyright and license from pictures Copyright en licentie uit beelden player Play Afspelen Pause Pauzeren Stop Stoppen Open File Bestand openen Fullscreen Beeldvullend Previous frame Vorig frame Next frame Volgend frame Mute Dempen Move menu Menu verplaatsen vokoscreenNG-3.1.0/src/language/no.ts000066400000000000000000000343351416353147400174740ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Velg én til flere enheter QvkHelp Help Hjelp QvkImageFromTabs No filemanager found. Ingen filutforsker funnet. Please install a filemanager. Vennligst installere en filutforsker. 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. Sourcecode Kildekode Homepage Hjemmeside Translations Oversettelser Donate Donere QvkPulseAudioWatcher Select one or more devices Velg én til flere enheter QvkRegionChoise Area Område QvkSystray Start Start Stop Stoppe Pause Pause Continue Forsett Exit Avslutt Camera Kamera Magnification Forstørrelse 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 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.1.0/src/language/pl_PL.ts000066400000000000000000000345331416353147400200660ustar00rootroot00000000000000 QvkAudioController Select one or more devices Wybierz jedno lub wiele urządzeń QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Tryb okna Switch to Fullscreen Tryb pełnoekranowy QvkDirectSoundController Select one or more devices Wybierz jedno lub wiele urządzeń QvkHelp Help Pomoc QvkImageFromTabs No filemanager found. Brak menedżera plików. Please install a filemanager. Zainstaluj menedżer plików. QvkLimitDiskFreeSpace Warning Uwaga The recording is not started, not enough free disk space. Za mało miejsca na dysku, nagrywanie nie zostało rozpoczęte. The free disk space limit is reached. Osiągnięgo limit miejsca na dysku. Limit of free disk space Limit miejsca na dysku Megabyte Megabajt The recording was stopped, not enough free disk space. Nagrywanie zatrzymane, za mało miejsca na dysku. QvkMainWindow Fullscreen Pełny ekran Window Okno No filemanager found. Brak menedżera plików. Please install a filemanager. Zainstaluj menedżer plików. Sourcecode Kod źródłowy Homepage Strona domowa Translations Tłumaczenia Donate Darowizna QvkPulseAudioWatcher Select one or more devices Wybierz jedno lub wiele urządzeń QvkRegionChoise Area Obszar QvkSystray Start Start Stop Stop Pause Pauza Continue Kontynuuj Exit Zakończ Camera Kamera Magnification Powiększenie QvkSystrayAlternative Start Start Stop Stop Pause Pauza Continue Kontynuuj Exit Zakończ cameraSettingsDialog Dialog Dialog Flip horizontal Przerzuć horyzontalnie Flip vertical Przerzuć pionowo Invert Odwróć Gray Szary Black-and-white Czarno-białe Remove window frame Usuń ramkę okna 160x120 160x120 320x240 320x240 Camera settings Ustawienia kamery 640x480 640x480 formMainWindow Area Obszar Reset Reset Magnification Powiększenie Countdown Odliczanie Video size: Rozmiar wideo: Free disk space: Wolne miejsce na dysku: Information Informacje Record Time: Czas nagrania: Audio Dźwięk Frames Klatki Videocodec Kodek wideo Format Format Audiocodec Kodek audio Quality Jakość Do not record mouse cursor Nie nagrywaj kursora myszy Hour Godzina Minute Minuta Start the timer Włącz odliczanie Stop recording after Zakończ nagrywanie po Hours Godzin Minutes Minut Seconds Sekund Videopath Zapisz nagranie w Limit of free disk space Limit miejsca na dysku Show in systray Pokazuj w panelu systemowym Second wait before recording Sekund do nagrania Look for updates Sprawdź aktualizacje Help Pomoc Video Wideo Available Dostępne Not available Niedostępne Start Start Stop Stop Pause Pauza Continue Kontynuuj Play Odtwórz Folder Folder Camera Kamera Invert Odwróć Gray Szary Send Report Wyślij raport CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Odtwórz ostatnie nagranie Open folder Otwórz folder CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Zminimalizuj po rozpoczęniu nagrania Starts minimized Startuje zminimalizowany Flip horizontal Przerzuć horyzontalnie Flip vertical Przerzuć pionowo Black-and-white Czarno-białe Remove window frame Usuń ramkę okna Donate Darowizna Reset all settings at the next start Zresetuj ustawienia przy następnym uruchomieniu Copyright and license from pictures Prawa autorskie i licencja z obrazu Megabyte Megabajt Screencast Przesyłanie ekranu Player Odtwarzacz Log Log license Copyright and license from pictures Prawa autorskie i licencja z obrazu player Play Odtwórz Pause Pauza Stop Stop Open File Otwórz plik Fullscreen Pełny ekran Previous frame Poprzednia klatka Next frame Następna klatka Mute Wycisz Move menu Przesuń menu vokoscreenNG-3.1.0/src/language/pt.ts000066400000000000000000000351151416353147400175000ustar00rootroot00000000000000 QvkAudioController Select one or more devices Seleccione um ou mais dispositivos QvkCameraController Camera Camera QvkCameraWindow Switch to Window Mudar para janela Switch to Fullscreen Mudar para ecrã inteiro QvkDirectSoundController Select one or more devices Seleccione um ou mais dispositivos QvkHelp Help Ajuda QvkImageFromTabs No filemanager found. Não foi encontrado nenhum gestor de ficheiros. Please install a filemanager. Por favor instale um gestor de ficheiros. 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. Foi alcançado o limite de espaço em disco. Limit of free disk space Limite de espaço livre em disco 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. Sourcecode Código-fonte Homepage Página inicial Translations Traduções Donate Doar QvkPulseAudioWatcher Select one or more devices Seleccione um ou mais dispositivos QvkRegionChoise Area Área QvkSystray Start Começar Stop Parar Pause Pausa Continue Continuar Exit Sair Camera Camera Magnification Ampliação 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 a 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 decrescente 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 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 Esperar em segundos antes de iniciar a gravar Look for updates Procurar por atualizações Help Ajuda Video Vídeo Available Disponível Not available Indisponível Start Iniciar 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 Minimizar quando a gravação Iniciar Starts minimized Iniciar minimizado Flip horizontal Girar horizontal Flip vertical Girar vertical Black-and-white Preto e branco Remove window frame Remover a 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.1.0/src/language/pt_BR.ts000066400000000000000000000351021416353147400200570ustar00rootroot00000000000000 QvkAudioController 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 tela cheia QvkDirectSoundController Select one or more devices Selecione um ou mais dispositivos QvkHelp Help Ajuda QvkImageFromTabs No filemanager found. Nenhum gerenciador de arquivos encontrado. Please install a filemanager. Por favor instale um gerenciador de arquivos. QvkLimitDiskFreeSpace Warning Aviso The recording is not started, not enough free disk space. A gravação não foi iniciada, não há espaço suficiente no disco. The free disk space limit is reached. O limite de espaço livre em disco foi atingido. Limit of free disk space Limite de espaço livre no disco Megabyte Megabyte The recording was stopped, not enough free disk space. A gravação foi interrompida, não há espaço livre em disco. QvkMainWindow Fullscreen Tela cheia Window Janela No filemanager found. Nenhum gerenciador de arquivos encontrado. Please install a filemanager. Por favor instale um gerenciador de arquivos. Sourcecode Código-Fonte Homepage Homepage Translations Traduções Donate Doações QvkPulseAudioWatcher Select one or more devices Selecione um ou mais dispositivos QvkRegionChoise Area Área QvkSystray Start Iniciar Stop Parar Pause Pausar Continue Continuar Exit Sair Camera Câmera Magnification Zoom QvkSystrayAlternative Start Iniciar Stop Parar Pause Pausar Continue Continuar Exit Sair cameraSettingsDialog Dialog Diálogo Flip horizontal Girar na horizontal Flip vertical Girar na 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âmera 640x480 640x480 formMainWindow Area Área Reset Reiniciar Magnification Zoom Countdown Contagem Regressiva Video size: Tamanho do vídeo: Free disk space: Espaço disponível no disco Information Informação Record Time: Tempo de gravação: Audio Áudio Frames Frames Videocodec Codec de vídeo Format Formato Audiocodec Codec de áudio Quality Qualidade Do not record mouse cursor Não gravar o cursor do mouse Hour Hora Minute Minuto Start the timer Iniciar o cronômetro Stop recording after Para gravação após Hours Horas Minutes Minutos Seconds Segundos Videopath Diretório do vídeo Limit of free disk space Limite de espaço livre no disco Show in systray Mostrar na área de notificação Second wait before recording Espera em segundos antes de começar gravando Look for updates Buscar atualizações Help Ajuda Video Vídeo Available Disponível Not available Não disponível Start Iniciar Stop Parar Pause Pausar Continue Continuar Play Reproduzir Folder Pasta Camera Câmera 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 última gravação Open folder Abrir pasta CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimizar ao iniciar a gravação Starts minimized Iniciar minimizado Flip horizontal Girar na horizontal Flip vertical Girar na vertical Black-and-white Preto e branco Remove window frame Remover moldura da janela Donate Doações Reset all settings at the next start Redefinir todas as configurações na próxima inicialização Copyright and license from pictures Direitos autorais e licença das imagens Megabyte Megabyte Screencast Captura de Tela Player Reprodutor Log Log license Copyright and license from pictures Direitos autorais e licença das imagens player Play Reproduzir Pause Pausar Stop Parar Open File Abrir Arquivo Fullscreen Tela cheia Previous frame Quadro anterior Next frame Próximo quadro Mute Mudo Move menu Mover o menu vokoscreenNG-3.1.0/src/language/pt_PT.ts000066400000000000000000000352221416353147400201020ustar00rootroot00000000000000 QvkAudioController Select one or more devices Selecione um ou mais dispositivos QvkCameraController Camera Câmara QvkCameraWindow Switch to Window Mudar para janela Switch to Fullscreen Mudar para ecrã inteiro QvkDirectSoundController Select one or more devices Selecione um ou mais dispositivos QvkHelp Help Ajuda QvkImageFromTabs No filemanager found. Não foi encontrado nenhum gestor de ficheiros. Please install a filemanager. Por favor, instale um gestor de ficheiros. QvkLimitDiskFreeSpace Warning Aviso The recording is not started, not enough free disk space. A gravação não é iniciada, sem espaço suficiente em disco. The free disk space limit is reached. Foi atingido o limite de espaço em disco. Limit of free disk space Limite de espaço livre em disco Megabyte Megabyte The recording was stopped, not enough free disk space. A gravação foi parada, sem espaço suficiente em disco. 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. Sourcecode Código-fonte Homepage Site Translations Traduções Donate Faz uma doação QvkPulseAudioWatcher Select one or more devices Selecione um ou mais dispositivos QvkRegionChoise Area Área QvkSystray Start Começar Stop Parar Pause Pausa Continue Continuar Exit Sair Camera Câmara Magnification Ampliação QvkSystrayAlternative Start Começar Stop Parar Pause Pausa Continue Continuar Exit Sair cameraSettingsDialog Dialog Diálogo Flip horizontal Virar horizontalmente Flip vertical Virar verticalmente Invert Inverter Gray Cinza Black-and-white Preto e branco Remove window frame Eliminar a borda da janela 160x120 160x120 320x240 320x240 Camera settings Configurações da câmara 640x480 640x480 formMainWindow Area Área Reset Reinicializar Magnification Ampliação Countdown Contagem regressiva Video size: Tamanho do vídeo: Free disk space: Espaço livre em disco: Information Informação Record Time: Duração da gravação: Audio Áudio Frames Quadros de vídeo Videocodec Codificador de vídeo Format Formato Audiocodec Codificador de áudio Quality Qualidade Do not record mouse cursor Não gravar o cursor do rato Hour Hora Minute Minuto Start the timer Iniciar o temporizador Stop recording after Parar a gravação depois de Hours Horas Minutes Minutos Seconds Segundos Videopath Caminho para ficheiro de vídeo Limit of free disk space Limite de espaço livre em disco Show in systray Mostrar no tabuleiro do sistema Second wait before recording Segundos para esperar antes de gravar Look for updates Verificar actualizações Help Ajuda Video Vídeo: Available Disponível Not available Não disponível Start Iniciar Stop Terminar Pause Pausar Continue Continuar Play Executar Folder Pasta Camera Câmara Invert Inverter Gray Cinza 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 Executar a última gravação Open folder Abrir pasta CTRL+SHIFT+F8 Ctrl+Shift+F8 Minimized when recording starts Minimizado no início da gravação Starts minimized Inicia minimizado Flip horizontal Virar horizontalmente Flip vertical Virar verticalmente Black-and-white Preto e branco Remove window frame Eliminar a borda da janela Donate Faz uma doação Reset all settings at the next start Reinicializar 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 Transmissão de ecrã Player Reprodutor Log Registo license Copyright and license from pictures Direitos de autor e licença das imagens player Play Executar Pause Pausar Stop Terminar Open File Abrir ficheiro Fullscreen Ecrã completo Previous frame Quadro anterior Next frame Quadro seguinte Mute Silenciar Move menu Deslocar o menu vokoscreenNG-3.1.0/src/language/ru.ts000066400000000000000000000402021416353147400174740ustar00rootroot00000000000000 QvkAudioController Select one or more devices Выберите одно или несколько устройств QvkCameraController Camera Камера QvkCameraWindow Switch to Window Переключиться в режим окна Switch to Fullscreen Переключиться в полноэкранный режим QvkDirectSoundController Select one or more devices Выберите одно или несколько устройств QvkHelp Help Справка QvkImageFromTabs No filemanager found. Файлового менеджера не найдено. Please install a filemanager. Пожалуйста установите файловый менеджер. 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. Пожалуйста установите файловый менеджер. Sourcecode Исходный код Homepage Веб-сайт Translations Переводы Donate Пожертвовать QvkPulseAudioWatcher Select one or more devices Выберите одно или несколько устройств QvkRegionChoise Area Область экрана QvkSystray Start Начать Stop Остановить Pause Приостановить Continue Продолжить Exit Выход Camera Камера Magnification Лупа 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 Качество 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.1.0/src/language/sk_SK.ts000066400000000000000000000353661416353147400200770ustar00rootroot00000000000000 QvkAudioController Select one or more devices Vyberte jedno alebo viac zariadení QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Zobraziť v okne Switch to Fullscreen Zobraziť na celú obrazovku QvkDirectSoundController Select one or more devices Vyberte jedno alebo viac zariadení QvkHelp Help Pomocník QvkImageFromTabs No filemanager found. Nenašiel sa žiadny súborový manažér. Please install a filemanager. Inštalujte súborový manažér. QvkLimitDiskFreeSpace Warning Upozornenie The recording is not started, not enough free disk space. Nahrávanie sa nezačalo, nemáte dostatok voľného miesta na disku. The free disk space limit is reached. Dosiahli ste hraničnú veľkosť pre pridelené vám miesto na disku. Limit of free disk space Horná hranica pre voľné miesto na disku Megabyte Megabajt The recording was stopped, not enough free disk space. Nahrávanie je zastavené, nie je dosť miesta na disku. QvkMainWindow Fullscreen Celá obrazovka Window Okno No filemanager found. Nenašiel sa žiadny súborový manažér. Please install a filemanager. Inštalujte súborový manažér. Sourcecode Zdrojový kód Homepage Domovská stránka Translations Preklady Donate Podporiť QvkPulseAudioWatcher Select one or more devices Vyberte jedno alebo viac zariadení QvkRegionChoise Area Oblasť QvkSystray Start Štart Stop Stop Pause Pauza Continue Pokračovať Exit Odísť Camera Kamera Magnification Zväčšenie QvkSystrayAlternative Start Štart Stop Stop Pause Pauza Continue Pokračovať Exit Odísť cameraSettingsDialog Dialog Dialóg Flip horizontal Prevrátiť horizontálne Flip vertical Prevrátiť vertikálne Invert Invertovať Gray Stupne sivej Black-and-white Dvojfarebné, čierna a biela Remove window frame Odstrániť orámovanie okna 160x120 160x120 320x240 320x240 Camera settings Nastavenia kamery 640x480 640x480 formMainWindow Area Oblasť Reset Resetovanie Magnification Zväčšenie Countdown Odpočítavanie Video size: Veľkosť videa: Free disk space: Voľné miesto na disku: Information Informácia Record Time: Čas nahrávania: Audio Zvuk Frames Snímky Videocodec Kódek video Format Formát Audiocodec Zvukový kódek Quality Kvalita Do not record mouse cursor Nenahrávať kurzor myši Hour Hodina Minute Minúta Start the timer Spustiť stopky Stop recording after Zastaviť nahrávanie po Hours Hodiny Minutes Minúty Seconds Sekundy Videopath Cesta k videu Limit of free disk space Horná hranica pre voľné miesto na disku Show in systray Zobraziť v systémovom paneli Second wait before recording Čakanie v sekundách pred nahrávaním Look for updates Kontrola aktualizácií Help Pomocník Video Video Available Je k dispozícii Not available Nie je k dispozícii Start Štart Stop Stop Pause Pauza Continue Pokračovať Play Prehrať Folder Priečinok - adresár Camera Kamera Invert Invertovať Gray Stupne sivej Send Report Odoslať hlásenie CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Prehrať poslednú nahrávku Open folder Otvoriť adresár - priečinok CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Minimalizovať pri štarte nahrávania Starts minimized Spustiť minimalizované Flip horizontal Prevrátiť horizontálne Flip vertical Prevrátiť vertikálne Black-and-white Dvojfarebné, čierna a biela Remove window frame Odstrániť orámovanie okna Donate Podporiť Reset all settings at the next start Resetovať všetky nastavenia pri nasledujúcom štarte Copyright and license from pictures Copyright a licencie obrázkov Megabyte Megabajt Screencast Nahrávanie obrazovky Player Prehrávač Log Záznam o činnosti license Copyright and license from pictures Copyright a licencie obrázkov player Play Prehrať Pause Pauza Stop Stop Open File Otvoriť súbor Fullscreen Celá obrazovka Previous frame Predchádzajúce políčko Next frame Nasledujúce políčko Mute Stíšiť Move menu Premiestniť menu vokoscreenNG-3.1.0/src/language/sl.ts000066400000000000000000000346051416353147400174760ustar00rootroot00000000000000 QvkAudioController Select one or more devices Izbor ene ali več naprav QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Preklopi na okno Switch to Fullscreen Preklopi na celozaslonski način QvkDirectSoundController Select one or more devices Izbor ene ali več naprav QvkHelp Help Pomoč QvkImageFromTabs No filemanager found. Ni najdenega upravljalnika datotek. Please install a filemanager. Program za urejanje datotek je treba namestiti. QvkLimitDiskFreeSpace Warning Opozorilo The recording is not started, not enough free disk space. Snemanje ni začeto, ker ni dovolj prostora na disku. The free disk space limit is reached. Dosežena je omejitev prostora na disku. Limit of free disk space Omejitev prostora na disku Megabyte Megabajt The recording was stopped, not enough free disk space. Snemanje je zaustavljeno, ker ni dovolj prostora na disku. QvkMainWindow Fullscreen Celozaslonski način Window Okno No filemanager found. Ni najdenega upravljalnika datotek. Please install a filemanager. Program za urejanje datotek je treba namestiti. Sourcecode Izvorna koda Homepage Spletna stran Translations Prevodi Donate Doniraj QvkPulseAudioWatcher Select one or more devices Izbor ene ali več naprav QvkRegionChoise Area Območje QvkSystray Start Začni Stop Zaustavi Pause Premor Continue Nadaljuj Exit Končaj Camera Kamera Magnification Povečava QvkSystrayAlternative Start Začni Stop Zaustavi Pause Premor Continue Nadaljuj Exit Končaj cameraSettingsDialog Dialog Pogovorno okno Flip horizontal Zrcali vodoravno Flip vertical Zrcali navpično Invert Obrni Gray Sivo Black-and-white Črnobelo Remove window frame Odstrani okvir okna 160x120 160x120 320x240 320x240 Camera settings Nastavitve kamere 640x480 640x480 formMainWindow Area Območje Reset Ponastavi Magnification Povečava Countdown Odštevalnik Video size: Velikost videa: Free disk space: Prostor na disku: Information Podrobnosti Record Time: Čas snemanja Audio Zvok Frames Sličice Videocodec Video kodek Format Zapis Audiocodec Zvokovni kodek Quality Kakovost Do not record mouse cursor Ne snemaj kazalke miške Hour Ura Minute Minuta Start the timer Začni časomer Stop recording after Zaustavi snemanje po Hours H Minutes M Seconds S Videopath Pot do videa Limit of free disk space Omejitev prostora na disku Show in systray Pokaži v sistemski vrstici Second wait before recording Čas čakanja pred začetkom snemanja Look for updates Poišči posodobitve Help Pomoč Video Video Available Na voljo Not available Ni na voljo Start Začni Stop Zaustavi Pause Premor Continue Nadaljuj Play Predvajaj Folder Mapa Camera Kamera Invert Obrni Gray Sivo Send Report Pošlji poročilo CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Predvajaj zadnji posnetek Open folder Odpri mapo CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Pomanjšaj, ko se snemanje začne Starts minimized Začni pomanjšano Flip horizontal Zrcali vodoravno Flip vertical Zrcali navpično Black-and-white Črnobelo Remove window frame Odstrani okvir okna Donate Doniraj Reset all settings at the next start Ponastavi nastavitve ob naslednjem zagonu Copyright and license from pictures Avtorske pravice in dovoljenja slik Megabyte Megabajt Screencast Zaslonski posnetek Player Predvajalnik Log Dnevnik license Copyright and license from pictures Avtorske pravice in dovoljenja slik player Play Predvajaj Pause Premor Stop Zaustavi Open File Odpri datoteko Fullscreen Celozaslonski način Previous frame Predhodna sličica Next frame Naslednja sličica Mute Utišaj Move menu Premakni meni vokoscreenNG-3.1.0/src/language/sr.ts000066400000000000000000000373541416353147400175100ustar00rootroot00000000000000 QvkAudioController Select one or more devices Означи један или више уређаја QvkCameraController Camera Kamera QvkCameraWindow Switch to Window Промени на прозор Switch to Fullscreen Промени на цео екран QvkDirectSoundController Select one or more devices Означи један или више уређаја QvkHelp Help Помоћ QvkImageFromTabs No filemanager found. Претраживач датотека није пронађен Please install a filemanager. Молим вас инсталирајте претраживач датотека QvkLimitDiskFreeSpace Warning Upozorenje The recording is not started, not enough free disk space. Снимање није почело, нема довољно слободног места на диску. The free disk space limit is reached. Досегнуто је ограничење слободног простора на диску. Limit of free disk space Граница слободног места на диску Megabyte Megabajt The recording was stopped, not enough free disk space. Снимање је заустављено, нема довољно слободног места на диску. QvkMainWindow Fullscreen Пун екран Window Прозор No filemanager found. Претраживач датотека није пронађен Please install a filemanager. Молим вас инсталирајте претраживач датотека Sourcecode Изворни код Homepage Почетна Translations Преводи Donate Донирај QvkPulseAudioWatcher Select one or more devices Означи један или више уређаја QvkRegionChoise Area Подручје QvkSystray Start Старт Stop Стоп Pause Пауза Continue Настави Exit Излаз Camera Kamera Magnification Увеличавање 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 Квалитет 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 Прикажи у ''systray'' Second wait before recording Одлагање снимања у секундама Look for updates Потражи исправке Help Помоћ Video Снимак Available Доступно Not available Није доступно Start Старт Stop Стоп Pause Пауза Continue Настави Play Почни Folder Фасцикла Camera Kamera 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 Vokoscreen минимизиран кад снимање почне 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 Megabajt 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.1.0/src/language/sv_SE.ts000066400000000000000000000346321416353147400200770ustar00rootroot00000000000000 QvkAudioController 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 QvkDirectSoundController Select one or more devices Välj en eller flera enheter QvkHelp Help Hjälp QvkImageFromTabs No filemanager found. Ingen filhanterare hittades. Please install a filemanager. Installera en filhanterare. 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 diskutrymme 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. Sourcecode Källkod Homepage Hemsida Translations Översättningar Donate Donera QvkPulseAudioWatcher Select one or more devices Välj en eller flera enheter QvkRegionChoise Area Område QvkSystray Start Starta Stop Stoppa Pause Pausa Continue Fortsätt Exit Avsluta Camera Kamera Magnification Förstoringsglas 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 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.1.0/src/language/th_TH.ts000066400000000000000000000377301416353147400200700ustar00rootroot00000000000000 QvkAudioController Select one or more devices เลือกอุปกรณ์ QvkCameraController Camera กล้อง QvkCameraWindow Switch to Window สลับหน้าต่าง Switch to Fullscreen สลับหน้าจอ QvkDirectSoundController Select one or more devices เลือกอุปกรณ์ QvkHelp Help ช่วยเหลือ QvkImageFromTabs No filemanager found. ไม่พบ filemanager Please install a filemanager. โปรดติดตั้ง filemanager 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. ไม่พบ filemanager Please install a filemanager. โปรดติดตั้ง filemanager Sourcecode รหัสต้นฉบับ Homepage โฮมเพจ Translations การแปล Donate บริจาค QvkPulseAudioWatcher Select one or more devices เลือกอุปกรณ์ QvkRegionChoise Area พื้นที่ QvkSystray Start เริ่ม Stop หยุด Pause หยุดชั่วคราว Continue ต่อ Exit ออก Camera กล้อง Magnification เกาะติด 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 คุณภาพ 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 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 Copyright and license from pictures Megabyte เมกะไบต์ Screencast แชร์หน้าจอ Player เครื่องเล่น Log ล็อค license Copyright and license from pictures Copyright and license from pictures player Play เล่น Pause หยุดชั่วคราว Stop หยุด Open File เปิดไฟล์ Fullscreen เต็มจอ Previous frame เฟรมก่อนหน้า Next frame เฟรมต่อไป Mute ปิดเสียง Move menu ย้ายเมนู vokoscreenNG-3.1.0/src/language/tr_TR.ts000066400000000000000000000345511416353147400201120ustar00rootroot00000000000000 QvkAudioController 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ç QvkDirectSoundController Select one or more devices Bir veya daha fazla aygıt seç QvkHelp Help Yardım QvkImageFromTabs No filemanager found. Dosya yöneticisi bulunamadı Please install a filemanager. Lütfen bir dosya yöneticisi yükleyin. 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. Sourcecode Kaynak kodu Homepage Ana Sayfa Translations Çeviriler Donate Bağış QvkPulseAudioWatcher Select one or more devices Bir veya daha fazla aygıt seç QvkRegionChoise Area Bölge QvkSystray Start Başlat Stop Durdur Pause Duraklat Continue Devam Exit Çıkış Camera Kamera Magnification Büyüt 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 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.1.0/src/language/uk_UA.ts000066400000000000000000000401261416353147400200570ustar00rootroot00000000000000 QvkAudioController Select one or more devices Виберіть один або декілька пристроїв QvkCameraController Camera Камера QvkCameraWindow Switch to Window Перемикнутися на режим вікна Switch to Fullscreen Перемикнутися на повний екран QvkDirectSoundController Select one or more devices Виберіть один або декілька пристроїв QvkHelp Help Допомога QvkImageFromTabs No filemanager found. Файлового менеджера не знайдено. Please install a filemanager. Будь ласка встановіть файловий менеджер. 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. Будь ласка встановіть файловий менеджер. Sourcecode Джерельний код Homepage Веб-сайт Translations Переклади Donate Зробити внесок QvkPulseAudioWatcher Select one or more devices Виберіть один або декілька пристроїв QvkRegionChoise Area Довільна область QvkSystray Start Почати Stop Зупинити Pause Призупинити Continue Продовжити Exit Вийти Camera Камера Magnification Збільшення 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 Якість 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.1.0/src/language/vi.ts000066400000000000000000000354751416353147400175040ustar00rootroot00000000000000 QvkAudioController Select one or more devices Chọn một hoặc nhiều thiết bị QvkCameraController Camera Camera QvkCameraWindow Switch to Window Đổi sang cửa sổ nhỏ Switch to Fullscreen Đổi sang toàn màn hình QvkDirectSoundController Select one or more devices Chọn một hoặc nhiều thiết bị QvkHelp Help Hỗ trợ QvkImageFromTabs No filemanager found. Không tìm được filemanager Please install a filemanager. Xin cài đặt filemanager QvkLimitDiskFreeSpace Warning Cảnh báo The recording is not started, not enough free disk space. Ghi hình chưa bắt đầu, không đủ dung lượng ổ đĩa trống The free disk space limit is reached. Dung lượng ổ đĩa trống đã đạt giới hạn Limit of free disk space Giới hạn ổ đĩa trống Megabyte Megabyte The recording was stopped, not enough free disk space. Ghi hình đã kết thúc, không đủ dung lượng ổ đĩa trống QvkMainWindow Fullscreen Toàn màn hình Window Cửa sổ No filemanager found. Không tìm được filemanager Please install a filemanager. Xin cài đặt filemanager Sourcecode Mã nguồn Homepage Trang chủ Translations Chuyển ngữ Donate Ủng hộ tài chính QvkPulseAudioWatcher Select one or more devices Chọn một hoặc nhiều thiết bị QvkRegionChoise Area Khu vực QvkSystray Start Bắt đầu Stop Dừng lại Pause Tạm dừng Continue Tiếp tục Exit Thoát Camera Camera Magnification Phóng to QvkSystrayAlternative Start Bắt đầu Stop Dừng lại Pause Tạm dừng Continue Tiếp tục Exit Thoát cameraSettingsDialog Dialog Hộp thoại Flip horizontal Đổi sang chiều ngang Flip vertical Đổi sang chiều dọc Invert Đổi ngược lại Gray Xám Black-and-white Trắng Đen Remove window frame Xóa khung hình 160x120 160x120 320x240 320x240 Camera settings Cài đặt Camera 640x480 640x480 formMainWindow Area Khu vực Reset Khởi động lại Magnification Phóng to Countdown Đếm ngược Video size: Kích cỡ Video Free disk space: Dung lượng đĩa trống Information Thông tin Record Time: Thời gian ghi hình Audio Audio Frames Khung ảnh Videocodec Videocodec Format Định dạng Audiocodec Audiocodec Quality Chất lượng Do not record mouse cursor Không ghi hình phần hiển thị của chuột Hour Giờ Minute Phút Start the timer Bắt đầu đếm giờ Stop recording after Dừng ghi hình sau Hours Giờ Minutes Phút Seconds Giây Videopath Đường dẫn video Limit of free disk space Giới hạn ổ đĩa trống Show in systray Hiển thị trong systray Second wait before recording Số giây đợi trước khi ghi hình Look for updates Tìm cập nhật Help Hỗ trợ Video Video Available Có sẵn Not available Không có sẵn Start Bắt đầu Stop Dừng lại Pause Tạm dừng Continue Tiếp tục Play Phát Folder Thư mục Camera Camera Invert Đổi ngược lại Gray Xám Send Report Gửi báo cáo CTRL+SHIFT+F10 CTRL+SHIFT+F10 CTRL+SHIFT+F11 CTRL+SHIFT+F11 CTRL+SHIFT+F12 CTRL+SHIFT+F12 Play last record Phát đoạn ghi hình gần nhất Open folder Mở thư mục CTRL+SHIFT+F8 CTRL+SHIFT+F8 Minimized when recording starts Ẩn màn hình khi bắt đầu ghi hình Starts minimized Bắt đầu ẩn màn hình Flip horizontal Đổi sang chiều ngang Flip vertical Đổi sang chiều dọc Black-and-white Trắng Đen Remove window frame Xóa khung hình Donate Ủng hộ tài chính Reset all settings at the next start Reset tất cả cài đặt ở lần chay tới Copyright and license from pictures Quyền sở hữu và giấy phép sử dụng bức tranh Megabyte Megabyte Screencast Quay màn hình Player Trình phát Log Nhật ký license Copyright and license from pictures Quyền sở hữu và giấy phép sử dụng bức tranh player Play Phát Pause Tạm dừng Stop Dừng lại Open File Mở File Fullscreen Toàn màn hình Previous frame Khung hình trước Next frame Khung hình sau Mute Tắt tiếng Move menu Dời menu vokoscreenNG-3.1.0/src/language/zh_CN.ts000066400000000000000000000342011416353147400200510ustar00rootroot00000000000000 QvkAudioController Select one or more devices 选取一个或多个设备 QvkCameraController Camera 摄像头 QvkCameraWindow Switch to Window 切换至窗口模式 Switch to Fullscreen 切换至全屏 QvkDirectSoundController Select one or more devices 选取一个或多个设备 QvkHelp Help 帮助 QvkImageFromTabs No filemanager found. 未发现文件管理器。 Please install a filemanager. 请安装一个文件管理器。 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. 请安装一个文件管理器。 Sourcecode 源代码 Homepage 网站 Translations 翻译 Donate 捐赠 QvkPulseAudioWatcher Select one or more devices 选取一个或多个设备 QvkRegionChoise Area 区域 QvkSystray Start 开始 Stop 停止 Pause 暂停 Continue 继续 Exit 退出 Camera 摄像头 Magnification 放大 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 质量 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.1.0/src/language/zh_TW.ts000066400000000000000000000342561416353147400201150ustar00rootroot00000000000000 QvkAudioController Select one or more devices 選取一個或多個裝置 QvkCameraController Camera 攝影機 QvkCameraWindow Switch to Window 切換至視窗 Switch to Fullscreen 切換至全螢幕 QvkDirectSoundController Select one or more devices 選取一個或多個裝置 QvkHelp Help 求助 QvkImageFromTabs No filemanager found. 找不到檔案管理員程式 Please install a filemanager. 請安裝檔案管理員程式 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. 請安裝檔案管理員程式 Sourcecode 來源程式碼 Homepage 官方網頁 Translations 軟體介面翻譯 Donate 捐款支持 QvkPulseAudioWatcher Select one or more devices 選取一個或多個裝置 QvkRegionChoise Area 區域 QvkSystray Start 開始 Stop 停止 Pause 暫停 Continue 繼續 Exit 結束 Camera 攝影機 Magnification 縮放 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 品質 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.1.0/src/licenses/000077500000000000000000000000001416353147400165225ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/licenses/QvkLicenses.cpp000066400000000000000000000070411416353147400214570ustar00rootroot00000000000000/* 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 #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() ) ); connect(ui->buttonBox, SIGNAL( clicked( QAbstractButton * ) ), this, SLOT( close() ) ); ui->label_dummy_1->hide(); ui->label_dummy_2->hide(); ui->label_dummy_3->hide(); ui->label_dummy_4->hide(); int row = readLicences( ":/pictures/", 0 ); readLicences( ":/spezialCheckBox/", row ); } QvkLicenses::~QvkLicenses(){} int QvkLicenses::readLicences( QString path, int row ) { QDirIterator dirIterator( path, 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(); } } return row; } vokoscreenNG-3.1.0/src/licenses/QvkLicenses.h000066400000000000000000000023321416353147400211220ustar00rootroot00000000000000/* 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(); public slots: private slots: signals: protected: private: Ui_license *ui; int readLicences(QString path , int row); }; #endif vokoscreenNG-3.1.0/src/licenses/licenses.pri000066400000000000000000000002261416353147400210430ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLicenses.h SOURCES += $$PWD/QvkLicenses.cpp FORMS += \ $$PWD/licenses.ui vokoscreenNG-3.1.0/src/licenses/licenses.ui000066400000000000000000000050321416353147400206660ustar00rootroot00000000000000 license 0 0 800 600 Copyright and license from pictures true 0 0 784 544 Qt::Horizontal 40 20 TextLabel TextLabel TextLabel TextLabel QDialogButtonBox::Close vokoscreenNG-3.1.0/src/limitDiskFreeSpace/000077500000000000000000000000001416353147400204245ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/limitDiskFreeSpace/QvkLimitDiskFreeSpace.cpp000066400000000000000000000106441416353147400252660ustar00rootroot00000000000000/* 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( ":/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( ":/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.1.0/src/limitDiskFreeSpace/QvkLimitDiskFreeSpace.h000066400000000000000000000026421416353147400247320ustar00rootroot00000000000000/* 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.1.0/src/limitDiskFreeSpace/limitDiskFreeSpace.pri000066400000000000000000000002321416353147400246440ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLimitDiskFreeSpace.h SOURCES += $$PWD/QvkLimitDiskFreeSpace.cpp vokoscreenNG-3.1.0/src/loadExtensions/000077500000000000000000000000001416353147400177145ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/loadExtensions/QvkLoadExtension.cpp000066400000000000000000000050631416353147400236620ustar00rootroot00000000000000/* 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.1.0/src/loadExtensions/QvkLoadExtension.h000066400000000000000000000024011416353147400233200ustar00rootroot00000000000000/* 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.1.0/src/loadExtensions/loadExtensions.pri000066400000000000000000000002201416353147400234210ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLoadExtension.h SOURCES += $$PWD/QvkLoadExtension.cpp vokoscreenNG-3.1.0/src/log/000077500000000000000000000000001416353147400154765ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/log/QvkLog.cpp000066400000000000000000000051661416353147400174150ustar00rootroot00000000000000/* 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() { 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" ); } QvkLog::~QvkLog() { } void QvkLog::outputMessage( QtMsgType type, const QMessageLogContext &context, const QString &msg ) { // Output terminal QByteArray localMsg = msg.toLocal8Bit(); switch (type) { case QtDebugMsg: fprintf( stderr, "%s\n", localMsg.constData() ); break; case QtInfoMsg: fprintf( stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); break; case QtWarningMsg: fprintf( stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); break; case QtCriticalMsg: fprintf( stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); break; case QtFatalMsg: fprintf( stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function ); abort(); } // Output Logfile #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( msg.toUtf8() ); logFile.write( eol.toUtf8() ); logFile.close(); // Output GUI emit signal_newLogText( msg ); } vokoscreenNG-3.1.0/src/log/QvkLog.h000066400000000000000000000023251416353147400170540ustar00rootroot00000000000000/* 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 #include class QvkLog : public QObject { Q_OBJECT public: QvkLog(); 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: private: protected: }; #endif vokoscreenNG-3.1.0/src/log/QvkLogController.cpp000066400000000000000000000030411416353147400214470ustar00rootroot00000000000000/* 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() { vklog = new QvkLog(); connect( vklog, SIGNAL( signal_newLogText( QString) ), this, SLOT( slot_addTextToGuiLog( QString ) ) ); qInstallMessageHandler( myMessageOutput ); } QvkLogController::~QvkLogController() { } void QvkLogController::slot_addTextToGuiLog( QString value ) { emit signal_newLogText( value ); } QString QvkLogController::get_logPath() { return vklog->logFile.fileName(); } vokoscreenNG-3.1.0/src/log/QvkLogController.h000066400000000000000000000022771416353147400211260ustar00rootroot00000000000000/* 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 class QvkLogController : public QObject { Q_OBJECT public: QvkLogController(); virtual ~QvkLogController(); QString get_logPath(); public slots: signals: void signal_newLogText( QString value ); private slots: void slot_addTextToGuiLog( QString value ); private: protected: }; #endif vokoscreenNG-3.1.0/src/log/log.pri000066400000000000000000000003361416353147400167750ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkLog.h \ $$PWD/QvkLogController.h SOURCES += $$PWD/QvkLog.cpp \ $$PWD/QvkLogController.cpp vokoscreenNG-3.1.0/src/magnifier/000077500000000000000000000000001416353147400166565ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/magnifier/QvkMagnifier.cpp000066400000000000000000000277241416353147400217610ustar00rootroot00000000000000/* 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 #include QvkMagnifier::QvkMagnifier() { QList screen = QGuiApplication::screens(); rectVirtualScreen = screen.at(0)->availableVirtualGeometry(); 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; int newDistanceX = ( ( rectVirtualScreen.width() / 2 ) - cursor.pos().x() ) * ( distanceX + ( width() / 2 ) ) / ( rectVirtualScreen.width() / 2 - distanceX ) - ( width() / 2 ); return newDistanceX; } int QvkMagnifier::NewDistanceXRight() { QCursor cursor; int newDistanX = ( ( rectVirtualScreen.width() / 2 ) - cursor.pos().x() ) * ( -distanceX - ( width() / 2 ) ) / ( rectVirtualScreen.width() / 2 - distanceX ) - ( width() / 2 ); return newDistanX; } void QvkMagnifier::setMagnifier() { QCursor cursor; // 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() > ( rectVirtualScreen.width() - distanceX ) ) and ( cursor.pos().y() < distanceY ) ) { move( rectVirtualScreen.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() < rectVirtualScreen.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() > rectVirtualScreen.width() / 2 ) ) { move( cursor.pos().x() - NewDistanceXRight() - width(), 2 * distanceY ); return; } // Lupe an untere rechte Ecke setzen if ( ( cursor.pos().x() > rectVirtualScreen.width() - distanceX ) and ( cursor.pos().y() > rectVirtualScreen.height() - distanceY ) ) { move( rectVirtualScreen.width() - ( 2 * distanceX + width() ), rectVirtualScreen.height() - ( 2 * distanceY + height() ) ); return; } // Lupe am rechten Rand setzen // Obere Hälfte am rechten Rand if ( ( cursor.pos().x() > rectVirtualScreen.width() - distanceX ) and ( cursor.pos().y() < rectVirtualScreen.height() / 10 * 8 ) )// div 2 { move( rectVirtualScreen.width() - ( 2 * distanceX + width() ), cursor.pos().y() + 1 * distanceY ); return; } // untere Hälfte am rechten Rand if ( ( cursor.pos().x() > rectVirtualScreen.width() - distanceX ) and ( cursor.pos().y() > rectVirtualScreen.height() / 10 * 8 ) ) { move( rectVirtualScreen.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() > rectVirtualScreen.height() - distanceY ) ) { move( 2 * distanceX, rectVirtualScreen.height() - 2 * distanceY - height() ); return; } // Lupe am unteren Rand setzen // Linke Hälfte unterer Rand if ( ( cursor.pos().x() < rectVirtualScreen.width() / 2 ) and ( cursor.pos().y() > rectVirtualScreen.height() - distanceY ) ) { move( cursor.pos().x() + NewDistanceXLeft(), rectVirtualScreen.height() - ( 2 * distanceY + height() ) ); return; } // Rechte Hälfte unterer Rand if ( ( cursor.pos().x() > rectVirtualScreen.width() / 2 ) and ( cursor.pos().y() > rectVirtualScreen.height() - distanceY ) ) { move( cursor.pos().x() - NewDistanceXRight() - width(), rectVirtualScreen.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() < rectVirtualScreen.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() > rectVirtualScreen.height() / 10 * 8 ) ) { move( 2 * distanceX, cursor.pos().y() - distanceY - height() ); return; } // Linke obere Hälfte if ( ( cursor.pos().x() < rectVirtualScreen.width() / 2 ) and ( cursor.pos().y() < rectVirtualScreen.height() / 10 * 8 ) ) move( cursor.pos().x() + NewDistanceXLeft(), cursor.pos().y() + distanceY ); // Rechte obere Hälfte if ( ( cursor.pos().x() > rectVirtualScreen.width() / 2 ) and ( cursor.pos().y() < rectVirtualScreen.height() / 10 * 8 ) ) move( cursor.pos().x() - NewDistanceXRight() - width(), cursor.pos().y() + distanceY ); // Linke untere Hälfte if ( ( cursor.pos().x() < rectVirtualScreen.width() / 2 ) and ( cursor.pos().y() > rectVirtualScreen.height() / 10 * 8 ) ) move( cursor.pos().x() + NewDistanceXLeft(), cursor.pos().y() - distanceY - height() ); // Rechte untere Hälfte if ( ( cursor.pos().x() > rectVirtualScreen.width() / 2 ) and ( cursor.pos().y() > rectVirtualScreen.height() / 10 * 8 ) ) move( cursor.pos().x() - NewDistanceXRight() -width(), cursor.pos().y() - distanceY - height() ); } void QvkMagnifier::slot_mytimer() { QCursor cursor; QPixmap originalPixmap = QPixmap(); QList screen = QGuiApplication::screens(); setMagnifier(); // Obere linke Ecke if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() < distanceY ) ) { originalPixmap = screen.at(0)->grabWindow( 0, 0, 0, 2 * distanceX, 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Obere rechte Ecke if ( ( cursor.pos().x() > ( rectVirtualScreen.width() - distanceX ) ) and ( cursor.pos().y() < distanceY ) ) { originalPixmap = screen.at(0)->grabWindow( 0, rectVirtualScreen.width() - 2 * distanceX, 0, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Linke untere Ecke if ( ( cursor.pos().x() < distanceX ) and ( cursor.pos().y() > rectVirtualScreen.height() - distanceY ) ) { originalPixmap = screen.at(0)->grabWindow( 0, 0, rectVirtualScreen.height() - 2 * distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Rechte untere Ecke if ( ( cursor.pos().x() > rectVirtualScreen.width() - distanceX ) and ( cursor.pos().y() > rectVirtualScreen.height() - distanceY ) ) { originalPixmap = screen.at(0)->grabWindow( 0, rectVirtualScreen.width() - 2 * distanceX, rectVirtualScreen.height() - 2 * distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Unterer Rand if ( cursor.pos().y() > rectVirtualScreen.height() - distanceY ) { originalPixmap = screen.at(0)->grabWindow( 0, cursor.pos().x() - distanceX, rectVirtualScreen.height() - 2 * distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Oberen Rand if ( cursor.pos().y() < distanceY ) { originalPixmap = screen.at(0)->grabWindow( 0, cursor.pos().x() - distanceX, 0, 2 * distanceX, 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Rechter Rand if ( cursor.pos().x() > rectVirtualScreen.width() - distanceX ) { originalPixmap = screen.at(0)->grabWindow( 0, rectVirtualScreen.width() - 2 * distanceX, cursor.pos().y() - distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Linker Rand if ( cursor.pos().x() < distanceX ) { originalPixmap = screen.at(0)->grabWindow( 0, 0, cursor.pos().y() - distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); return; } // Fläche originalPixmap = screen.at(0)->grabWindow( 0, cursor.pos().x() - distanceX, cursor.pos().y() - distanceY, 2 * distanceX , 2 * distanceY ); label->setPixmap( originalPixmap ); } vokoscreenNG-3.1.0/src/magnifier/QvkMagnifier.h000066400000000000000000000027761416353147400214260ustar00rootroot00000000000000/* 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; QRect rectVirtualScreen; }; #endif vokoscreenNG-3.1.0/src/magnifier/QvkMagnifierController.cpp000066400000000000000000000037261416353147400240210ustar00rootroot00000000000000/* 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.1.0/src/magnifier/QvkMagnifierController.h000066400000000000000000000023621416353147400234610ustar00rootroot00000000000000/* 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.1.0/src/magnifier/magnifier.pri000066400000000000000000000003521416353147400213330ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkMagnifierController.h \ $$PWD/QvkMagnifier.h SOURCES += $$PWD/QvkMagnifierController.cpp \ $$PWD/QvkMagnifier.cpp vokoscreenNG-3.1.0/src/main.cpp000066400000000000000000000134601416353147400163510ustar00rootroot00000000000000/* 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" #ifdef Q_OS_LINUX #include "mainWindow_wl.h" #include "QvkWaylandRoutines.h" #endif #ifdef Q_OS_WIN #include "QvkSettings.h" #endif #include #include #include #include #include int main(int argc, char *argv[]) { QLoggingCategory::defaultCategory()->setEnabled( QtDebugMsg, true ); QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication::setStyle( QStyleFactory::create( "Fusion" ) ); QApplication app(argc, argv); QString help; help.append( "\n" ); help.append( "Usage: " + global::name + " [Option] [File or URL]" + "\n" ); help.append( "\n" ); help.append( "Options: \n" ); help.append( " -h or --help Print this message\n" ); help.append( " -v or --version Print version \n" ); help.append( "\n" ); help.append( "File or Url:\n" ); help.append( " Play a video\n" ); help.append( " Example file:\n" ); help.append( " vokoscreenNG /path/video\n" ); help.append( "\n" ); help.append( " Example URL:\n"); help.append( " vokoscreenNG http://www.rapconverter.com/SampleDownload/Sample320.mp4\n"); help.append( " vokoscreenNG http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4" ); help.append( "\n" ); 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().resetFormat().noquote() << help; 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 or remote 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"; qDebug().resetFormat().noquote() << help; qDebug( " " ); return 1; } } // Initialize GStreamer // https://developer.gnome.org/gstreamer/stable/gst-running.html #ifdef Q_OS_LINUX QString separator = ":"; #endif #ifdef Q_OS_WIN QString separator = ";"; #endif // qmake options example: // DEFINES+=FOR_MY_LINUX_INSTALLER #if defined( Q_OS_WIN ) || defined( FOR_MY_LINUX_INSTALLER ) QvkSettings vkSettings; QFileInfo dirPathProfile( vkSettings.getFileName() ); QString pathProfile = dirPathProfile.absolutePath(); QString programPath = QDir::currentPath(); QByteArray pluginPathByteArray; pluginPathByteArray.append( programPath ); pluginPathByteArray.append( separator ); pluginPathByteArray.append( pathProfile ); qputenv( "GST_PLUGIN_PATH_1_0", pluginPathByteArray ); QByteArray pathPathByteArray; pathPathByteArray.append( programPath ); pathPathByteArray.append( separator ); pathPathByteArray.append( pathProfile ); qputenv( "PATH", pathPathByteArray ); QByteArray pathRegistryByteArray; pathRegistryByteArray.append( pathProfile ); pathRegistryByteArray.append( "/gstreamer.registry" ); qputenv( "GST_REGISTRY_1_0", pathRegistryByteArray ); /* //Environment variables for debugging qputenv( "GST_DEBUG", "4"); QByteArray envPathProfile; envPathProfile.append( pathProfile.path() + "/GST_Error.txt" ); qputenv( "GST_DEBUG_FILE", envPathProfile ); */ #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 ); #ifdef Q_OS_LINUX if ( QvkWaylandRoutines::is_Wayland_Display_Available() == false ) { QvkMainWindow *w = new QvkMainWindow; w->show(); } else { QvkMainWindow_wl *wl = new QvkMainWindow_wl; wl->show(); } #endif #ifdef Q_OS_WIN QvkMainWindow *w = new QvkMainWindow; w->show(); #endif return app.exec(); } vokoscreenNG-3.1.0/src/mainwindow.cpp000066400000000000000000002625221416353147400176060ustar00rootroot00000000000000/* 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 "QvkLogController.h" #include "global.h" #include "QvkScreenManager.h" #include "QvkLicenses.h" #include "QvkImageFromTabs.h" #include "QvkDirDialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_LINUX #include #include #endif QvkMainWindow::QvkMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::formMainWindow), vkWinInfo(new QvkWinInfo) { ui->setupUi(this); #ifdef Q_OS_WIN // Only for Windows WASAPI soundEffect = new QSoundEffect(); #endif 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_33->insertWidget( 0, 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_26->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( 1 ); // we need minimum 1, with 0 we get wrong colors. sliderOpenh264->setMaximum( 51 ); sliderOpenh264->setValue( 23 ); sliderOpenh264->show(); sliderVp8 = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_vp8->insertWidget( 1, sliderVp8 ); sliderVp8->setObjectName( "sliderVp8" ); sliderVp8->setTracking( true ); sliderVp8->setMinimum( 0 ); sliderVp8->setMaximum( 63 ); sliderVp8->setValue( 20 ); sliderVp8->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(); ui->comboBox_shortcut_start->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); ui->comboBox_shortcut_pause->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); ui->comboBox_shortcut_magnification->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); QvkLogController *vklogController = new QvkLogController(); connect( vklogController, SIGNAL( signal_newLogText( QString ) ), this, SLOT( slot_textToGuiLog( QString ) ) ); #ifdef Q_OS_LINUX ui->pushButtonSendReport->setHidden( true ); ui->help_log_sendreport->setHidden( true ); #endif setWindowTitle( global::name + " " + global::version ); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); setWindowIcon( icon ); vkMagnifierController = new QvkMagnifierController(ui); Q_UNUSED(vkMagnifierController); vkPlayer = new QvkPlayer( this, ui ); QvkHelp *vkHelp = new QvkHelp( ui ); QvkLicenses *vkLicenses = new QvkLicenses( ui ); vkRegionChoise = new QvkRegionChoise( ui ); vkCountdown = new QvkCountdown(); vkCountdown->init(); 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(); #ifdef Q_OS_LINUX qDebug().noquote() << global::nameOutput << "PulseAudio library version:" << pa_get_library_version(); #endif qDebug().noquote() << global::nameOutput << "Operating system:" << QSysInfo::prettyProductName(); qDebug().noquote() << global::nameOutput << "KernelVersion:" << QSysInfo::kernelVersion(); qDebug().noquote() << global::nameOutput << "CPU Architecture:" << QSysInfo::currentCpuArchitecture(); qDebug().noquote() << global::nameOutput << "Count CPU:" << QThread::idealThreadCount(); 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(); qDebug().noquote() << global::nameOutput << "Default Videopath:" << QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ); qDebug().noquote() << global::nameOutput << "User Videopath:" << vkSettings.getVideoPath(); #ifdef Q_OS_LINUX qDebug().noquote() << global::nameOutput << "CompositingManager running:" << QX11Info::isCompositingManagerRunning(); #endif qDebug(); #ifdef Q_OS_WIN QByteArray GSTREAMER_1_0_ROOT_X86 = qgetenv( "GSTREAMER_1_0_ROOT_X86" ); qDebug().noquote() << global::nameOutput << "GSTREAMER_1_0_ROOT_X86:"<< GSTREAMER_1_0_ROOT_X86; QByteArray GST_PLUGIN_PATH_1_0 = qgetenv( "GST_PLUGIN_PATH_1_0" ); qDebug().noquote() << global::nameOutput << "GST_PLUGIN_PATH_1_0:"<< GST_PLUGIN_PATH_1_0; QByteArray PATH = qgetenv( "PATH" ); qDebug().noquote() << global::nameOutput << "PATH:"<< PATH; QByteArray GST_REGISTRY_1_0 = qgetenv( "GST_REGISTRY_1_0" ); qDebug().noquote() << global::nameOutput << "GST_REGISTRY_1_0:"<< GST_REGISTRY_1_0; qDebug(); #endif vk_setCornerWidget( ui->tabWidgetScreencast ); // Sidebar connect( ui->toolButtonScreencast, &QToolButton::clicked, this, [=]() { ui->tabWidgetSideBar->setCurrentIndex(0); } ); connect( ui->toolButtonCamera, &QToolButton::clicked, this, [=]() { ui->tabWidgetSideBar->setCurrentIndex(1); } ); connect( ui->toolButtonShowclick, &QToolButton::clicked, this, [=]() { ui->tabWidgetSideBar->setCurrentIndex(2); } ); connect( ui->toolButtonShortcut, &QToolButton::clicked, this, [=]() { ui->tabWidgetSideBar->setCurrentIndex(3); } ); connect( ui->toolButtonPlayer, &QToolButton::clicked, this, [=]() { ui->tabWidgetSideBar->setCurrentIndex(4); } ); connect( ui->toolButtonLog, &QToolButton::clicked, this, [=]() { ui->tabWidgetSideBar->setCurrentIndex(5); } ); ui->tabWidgetSideBar->tabBar()->hide(); ui->toolButtonScreencast->click(); // 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 ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_comboBoxScreencastScreenCountdown( 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 ) ), ui->frameFrames, 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->frameVideoCodecOpenh264, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->frameVideoCodecVp8, 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 ) ), ui->checkBoxShowInSystray, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_preStart() ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->comboBoxScreencastScreenArea, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->toolButtonScreencastAreaReset, SLOT( setEnabled( bool ) ) ); 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 ) ), ui->frameFrames, 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->frameVideoCodecOpenh264, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->frameVideoCodecVp8, 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 ) ), ui->checkBoxShowInSystray, 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->pushButtonStop, SIGNAL( clicked( bool ) ), ui->comboBoxScreencastScreenArea, SLOT( setDisabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->toolButtonScreencastAreaReset, SLOT( setDisabled( bool ) ) ); 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->comboBoxScreencastScreenArea, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastWindow, SIGNAL( toggled( bool ) ), ui->comboBoxScreencastScreen, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastWindow, SIGNAL( toggled( bool ) ), ui->comboBoxScreencastScreenArea, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastWindow, SIGNAL( toggled( bool ) ), ui->toolButtonScreencastAreaReset, SLOT( setDisabled( bool ) ) ); connect( this, SIGNAL( signal_close() ), vkRegionChoise, SLOT( close() ) ); connect( ui->radioButtonScreencastArea, SIGNAL( toggled( bool ) ), vkRegionChoise, SLOT( slot_init() ) ); 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->comboBoxScreencastScreenArea, SLOT( setEnabled( bool ) ) ); connect( ui->toolButtonScreencastAreaReset, SIGNAL( clicked( bool ) ), vkRegionChoise, SLOT( slot_areaReset() ) ); connect( ui->comboBoxScreencastScreen, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_setMaxFPS( int ) ) ); // Tab 2 Audio and Videocodec #ifdef Q_OS_WIN vkAudioController = new QvkAudioController( ui ); connect( vkAudioController->vkDirectSoundController, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), this, SLOT( slot_haveAudioDeviceSelected( bool ) ) ); connect( vkAudioController->vkWASAPIController, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), this, SLOT( slot_haveAudioDeviceSelected( bool ) ) ); #endif #ifdef Q_OS_LINUX vkAudioController = new QvkAudioController( ui ); connect( vkAudioController, SIGNAL( signal_haveAudioDeviceSelected( bool ) ), this, SLOT( slot_haveAudioDeviceSelected( bool ) ) ); vkAudioController->init(); #endif connect( ui->toolButtonFramesReset, SIGNAL( clicked( bool ) ), this, SLOT( slot_framesReset() ) ); 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() ) ); connect( ui->toolButtonVP8Reset, SIGNAL( clicked( bool ) ), this, SLOT( slot_vp8Reset() ) ); // 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 ) ); // ***************** Begin showClick ***************************** vkShowClick = new QvkShowClick(); vkShowClick->init( ui ); // ***************** End showClick vkHalo = new QvkHalo(); vkHalo->init( ui ); vkSystrayAlternative = new QvkSystrayAlternative( this, ui, sliderShowInSystrayAlternative ); if ( QSystemTrayIcon::isSystemTrayAvailable() == true ) { connect( ui->checkBoxShowInSystray, SIGNAL( clicked( bool ) ), this, SLOT( slot_setVisibleSystray( bool ) ) ); ui->frameShowInSystrayAlternative->hide(); ui->toolButtonShowInSystrayAlternativeReset->hide(); } else { connect( ui->checkBoxShowInSystrayAlternative, SIGNAL( clicked( bool ) ), vkSystrayAlternative, SLOT( setVisible( bool ) ) ); ui->frameShowInSystray->hide(); } // Tab 5 Available muxer, encoder etc. QIcon iconAvailable( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); QSize size = iconAvailable.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); ui->labelAvalible->setPixmap( iconAvailable.pixmap( size, QIcon::Normal, QIcon::On )); QIcon iconNotAvailable( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); ui->labelNotAvailable->setPixmap( iconNotAvailable.pixmap( size, QIcon::Normal, QIcon::On )); // End Tabs // Tab 6 About 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( slot_cleanUp() ) ); 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(); slot_gst_formatVideoAudoicodec_available(); VK_gst_Elements_available(); QvkScreenManager *screenManager = new QvkScreenManager(); // Fullscreen 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 ) ) ); // Area connect( screenManager, SIGNAL( signal_clear_widget() ), ui->comboBoxScreencastScreenArea, SLOT( clear() ) ); connect( screenManager, SIGNAL( signal_screen_count_changed( QString, QString) ), this, SLOT( slot_screenCountChangedArea( QString, QString ) ) ); connect( ui->comboBoxScreencastScreenArea, SIGNAL( currentIndexChanged( int) ), vkRegionChoise, SLOT( slot_init() ) ); screenManager->init(); // *****************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 *********************************** /* 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 ) { vkGlobalShortcut = new QvkGlobalShortcut( this, ui ); Q_UNUSED(vkGlobalShortcut); } #endif #ifdef Q_OS_WIN vkGlobalShortcut = new QvkGlobalShortcut( this, ui ); Q_UNUSED(vkGlobalShortcut); #endif vk_setCornerWidget( ui->tabWidgetShortcut ); #ifdef Q_OS_WIN vkCiscoOpenh264Controller = new QvkCiscoOpenh264Controller( vkSettings.getFileName(), ui ); vkCiscoOpenh264Controller->showWaitDialog(); vkCiscoOpenh264Controller->init(); #endif #ifdef Q_OS_LINUX ui->line_cisco->hide(); ui->frame_cisco->hide(); #endif vkSettings.readAll( ui, this ); vkSettings.readAreaScreencast( vkRegionChoise ); vkSettings.readCamera( vkCameraController ); vkSettings.readSystrayAlternative( vkSystrayAlternative ); vkSettings.readPlayerPathOpenFile( vkPlayer ); vkSettings.readHaloColor( vkHalo ); vkSettings.readShowclickColor( vkShowClick ); vkGlobalShortcut->slot_checkbox_shortcut_start_clicked( true ); vkGlobalShortcut->slot_checkbox_shortcut_pause_clicked( true ); vkGlobalShortcut->slot_checkbox_shortcut_magnification_clicked( true ); vkGlobalShortcut->slot_checkbox_shortcut_camera_clicked( true ); vkGlobalShortcut->slot_checkbox_shortcut_showclick_clicked( true ); vkGlobalShortcut->slot_checkbox_shortcut_halo_clicked( true ); // 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 ) ); } QvkImageFromTabs *vkImageFromTabs = new QvkImageFromTabs( this ); vkImageFromTabs->init( ui ); } QvkMainWindow::~QvkMainWindow() { delete ui; } void QvkMainWindow::slot_haveAudioDeviceSelected( bool bo ) { if ( bo == false ) { ui->labelInfoAudiocodec->setText( "------" ); } else { ui->labelInfoAudiocodec->setText( ui->comboBoxAudioCodec->currentText() ); } } void QvkMainWindow::slot_textToGuiLog( QString value ) { ui->textBrowserLog->append( value ); } void QvkMainWindow::slot_setMaxFPS( int index ) { if ( index > -1 ) { QList screen = QGuiApplication::screens(); sliderFrames->setMaximum( screen.at( index )->refreshRate() ); } } void QvkMainWindow::closeEvent( QCloseEvent *event ) { Q_UNUSED(event); #ifdef Q_OS_WIN if ( vkCiscoOpenh264Controller->isShowCiscoFinishDialog == false ) { #endif 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->vkSystrayAlternativeWindow->x(), vkSystrayAlternative->vkSystrayAlternativeWindow->y() ); vkSettings.savePlayerPathOpenFile( vkPlayer->pathOpenFile ); vkSettings.saveHaloColor( vkHalo->vkHaloPreviewWidget->getColor() ); vkSettings.saveShowclickColor( vkShowClick->vkPreviewWidget->getColor() ); #ifdef Q_OS_WIN } #endif if ( vkShowClick->vkSpezialCheckbox->isChecked() == true ) { emit vkShowClick->vkSpezialCheckbox->signal_clicked( false ); } emit signal_close(); emit signal_close( false ); } void QvkMainWindow::slot_vokoPlayer() { vkPlayer->show(); } /* * CountDown */ void QvkMainWindow::slot_comboBoxScreencastScreenCountdown( bool ) { if ( ui->radioButtonScreencastFullscreen->isChecked() == true ) { int index = ui->comboBoxScreencastScreen->currentIndex(); QList screen = QGuiApplication::screens(); int left = static_cast( screen.at( index )->geometry().left() * screen.at( index )->devicePixelRatio() ); int top = static_cast( screen.at( index )->geometry().top() * screen.at( index )->devicePixelRatio() ); vkCountdown->x = left + screen.at( index )->geometry().width() / 2 - ( vkCountdown->Width / 2 ); vkCountdown->y = top + screen.at( index )->geometry().height() / 2 - ( vkCountdown->Height / 2 ); } if ( ui->radioButtonScreencastWindow->isChecked() == true ) { QScreen *screen = QGuiApplication::primaryScreen(); vkCountdown->x = ( screen->geometry().width() / 2 ) - ( vkCountdown->Width / 2 ); vkCountdown->y = ( screen->geometry().height() / 2 ) - ( vkCountdown->Height / 2 ); } if ( ui->radioButtonScreencastArea->isChecked() == true ) { int index = ui->comboBoxScreencastScreenArea->currentIndex(); QList screen = QGuiApplication::screens(); int left = static_cast( screen.at( index )->geometry().left() * screen.at( index )->devicePixelRatio() ); int top = static_cast( screen.at( index )->geometry().top() * screen.at( index )->devicePixelRatio() ); vkCountdown->x = left + screen.at( index )->geometry().width() / 2 - ( vkCountdown->Width / 2 ); vkCountdown->y = top + screen.at( index )->geometry().height() / 2 - ( vkCountdown->Height / 2 ); } } void QvkMainWindow::slot_framesReset() { sliderFrames->setValue( 25 ); } void QvkMainWindow::slot_x264Reset() { ui->comboBoxx264Preset->setCurrentIndex( 1 ); sliderX264->setValue( 17 ); ui->comboBoxx264Profile->setCurrentIndex( 0 ); } void QvkMainWindow::slot_openh264Reset() { sliderOpenh264->setValue( 23 ); } void QvkMainWindow::slot_vp8Reset() { sliderVp8->setValue( 20 ); } void QvkMainWindow::slot_videoCodecChanged( QString codec ) { ui->frameVideoCodecx264->setVisible( false ); ui->frameVideoCodecOpenh264->setVisible( false ); ui->frameVideoCodecVp8->setVisible( false ); if ( codec == "x264" ) { ui->frameVideoCodecx264->setVisible( true ); } if ( codec == "H.264" ) // openh264 { ui->frameVideoCodecOpenh264->setVisible( true ); } if ( codec == "VP8" ) { ui->frameVideoCodecVp8->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_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() { QApplication::setDesktopSettingsAware( false ); QvkDirDialog vkDirDialog( this ); if ( vkDirDialog.exec() == QDialog::Accepted ) { if ( !vkDirDialog.selectedFiles().empty() ) { ui->lineEditVideoPath->setText( vkDirDialog.selectedFiles().at(0) ); } } QApplication::setDesktopSettingsAware( true ); } 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); } 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; } #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 ) { QStringList stringList; stringList << "ximagesrc" << "display-name=" + qgetenv( "DISPLAY" ) << "use-damage=false" << "show-pointer=" + showPointer << "startx=" + QString::number( vkRegionChoise->x() + vkRegionChoise->getXRecordArea() ) << "starty=" + QString::number( vkRegionChoise->y() + vkRegionChoise->getYRecordArea() ) << "endx=" + QString::number( vkRegionChoise->x() + vkRegionChoise->getXRecordArea() + vkRegionChoise->getWidth() - 1 ) << "endy=" + QString::number( vkRegionChoise->y() + vkRegionChoise->getYRecordArea() + 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 ) { int screenNumber = ( ui->comboBoxScreencastScreen->currentText().section( ":", 0, 0 ).trimmed().right(1) ).toInt() - 1; QStringList stringList; stringList << "gdiscreencapsrc" << "monitor=" + QString::number( screenNumber ) << "cursor=" + showPointer; value = stringList.join( " " ); } if ( ui->radioButtonScreencastArea->isChecked() == true ) { int screenNumber = ( ui->comboBoxScreencastScreenArea->currentText().section( ":", 0, 0 ).trimmed().right(1) ).toInt() - 1; QStringList stringList; stringList << "gdiscreencapsrc" << "monitor=" + QString::number( screenNumber ) << "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( "" ) ); } /* * For my better understanding is this comment in german. * * Einige encoder, wie z.b x264, benötigen zum encodieren gerade Werte. * Laut Dokumentation wird videoscale nur angewandt wenn sich die Quellauflösung zur Zielauflösung unterscheidet. * Wird ein Bereich oder ein Fenster aufgenommen das ungerade Werte enthält wird diese mittels videoscale korrigiert. * Für das Aufnehmen in einer Virtuellen Maschine die in einem Fenster läuft, wird die Vollbildaufnahme ebenfalls korrigiert. */ QString QvkMainWindow::VK_scale() { QString value = ""; int modulo = 2; 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"; list << "wasapisrc"; list << "directsoundsrc"; list << "bz2dec"; #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 << "audiomixer"; 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::slot_gst_formatVideoAudoicodec_available() { // Delete all QLabel QList listLabel = ui->scrollAreaWidgetContentsAvailable->findChildren(); for( int i = 0; i < listLabel.count(); i++ ) { delete listLabel.at( i ); } // Delete spacerItem for ( int i = 0; i < ui->gridLayoutAvailable->count(); ++i ) { QLayoutItem *layoutItem = ui->gridLayoutAvailable->itemAt(i); if ( layoutItem->spacerItem() ) { ui->gridLayoutAvailable->removeItem(layoutItem); delete layoutItem; --i; } } // Delete line QList listFrame = ui->scrollAreaWidgetContentsAvailable->findChildren(); for( int i = 0; i < listFrame.count(); i++ ) { delete listFrame.at( i ); } // Adding all informations int rowCount = 0; for ( int i = 0; i < videoFormatsList.count(); i++ ) { int rowMuxer = 1; int rowVideo = 1; int rowAudio = 1; QStringList listElements = QString( videoFormatsList.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; } if ( QString( listElements.at( x ) ).section( ":", 0, 0 ) == "muxer" ) { QLabel *labelPicture = new QLabel(); QIcon icon; if ( available == true ) { QIcon picture( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); icon = picture; } else { QIcon picture( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); icon = picture; } 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 element available then check video codec if ( available == true ) { GstElement *source = gst_element_factory_create( factory, "source" ); if ( !source ) { QIcon picture( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); icon = picture; } else { QIcon picture( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); icon = picture; gst_object_unref( source ); gst_object_unref( factory ); } } else { QIcon picture( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); icon = picture; } 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 ) { QIcon picture( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); icon = picture; } else { QIcon picture( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); icon = picture; } 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:openh264enc:H.264" #ifdef Q_OS_LINUX << "videocodec:x264enc:x264" #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:openh264enc:H.264" #ifdef Q_OS_LINUX << "videocodec:x264enc:x264" #endif << "videocodec:vp8enc:VP8" << "audiocodec:lamemp3enc:mp3" ); QStringList MP4_QStringList = ( QStringList() << "muxer:mp4mux:mp4" << "videomimetype:video/mp4" << "audiomimetype:audio/mpeg" << "videocodec:openh264enc:H.264" #ifdef Q_OS_LINUX << "videocodec:x264enc:x264" #endif << "audiocodec:lamemp3enc:mp3" << "audiocodec:opusenc:opus" ); // https://de.wikipedia.org/wiki/QuickTime QStringList MOV_QStringList = ( QStringList() << "muxer:qtmux:mov" << "videomimetype:video/mp4" << "audiomimetype:audio/mpeg" << "videocodec:openh264enc:H.264" #ifdef Q_OS_LINUX << "videocodec:x264enc:x264" #endif << "videocodec:vp8enc:VP8" << "audiocodec:lamemp3enc:mp3" ); 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( ",") ); } 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 = QIcon::fromTheme( mimetype.iconName(), QIcon( ":/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 ); #ifdef Q_OS_WIN if ( ui->radioButton_cisco_off->isChecked() and ( encoder == "openh264enc" ) ) { continue; } #endif 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 { QString message = global::nameOutput + " + " + encoder; GstElement *source = gst_element_factory_create( factory, "source" ); if ( !source ) { message = global::nameOutput + " - " + encoder + " available but codec is missing"; } else { ui->comboBoxVideoCodec->addItem( name, encoder ); gst_object_unref( source ); } qDebug().noquote() << message; 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 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=" + QString::number( QThread::idealThreadCount() ); list.removeAll( "" ); value = list.join( " " ); value.append( " ! video/x-h264, profile=" + ui->comboBoxx264Profile->currentText() ); } 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=camera"; // We need camera not screen. With screen and a fast sequence of images the video jerks. list << "complexity=low"; list << "multi-thread=" + QString::number( QThread::idealThreadCount() ); list << "slice-mode=auto"; // Number of slices equal to number of threads value = list.join( " " ); value.append( " ! h264parse" ); } if ( encoder == "vp8enc" ) { QStringList list; list << "vp8enc"; list << "min_quantizer=" + QString::number( sliderVp8->value() ); list << "max_quantizer=" + QString::number( sliderVp8->value() ); list << "cpu-used=" + QString::number( QThread::idealThreadCount() ); list << "deadline=1000000"; list << "threads=" + QString::number( QThread::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() ); connect( vkCountdown, SIGNAL( signal_countDownCancel( bool ) ), this, SLOT( slot_cancel( bool ) ) ); 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(); connect( vkCountdown, SIGNAL( signal_countDownCancel( bool ) ), this, SLOT( slot_cancel( bool ) ) ); 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() ); connect( vkCountdown, SIGNAL( signal_countDownCancel( bool ) ), this, SLOT( slot_cancel( bool ) ) ); return; } if ( ui->radioButtonScreencastArea->isChecked() == true ) { vkRegionChoise->recordMode( true ); vkRegionChoise->repaint(); vkRegionChoise->update(); slot_Start(); return; } } void QvkMainWindow::slot_cancel( bool value ) { Q_UNUSED(value) cancel = true; disconnect( vkCountdown, nullptr, nullptr, nullptr ); ui->pushButtonStop->setEnabled( true ); ui->pushButtonStop->click(); } 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 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; QString nl; #ifdef Q_OS_LINUX nl = "\\"; string = pipeline.prepend( "gst-launch-1.0 -e " + nl + "\n " ); #endif #ifdef Q_OS_WIN nl = "^"; string = pipeline.prepend( "gst-launch-1.0.exe -e " + nl + "\n " ); #endif string = pipeline.replace( "mux.", "mux. " + nl + "\n " ); string = pipeline.replace( "mix.", "mix. " + nl + "\n " ); string = pipeline.replace( "!", nl + "\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 << "queue max-size-bytes=1073741824 max-size-time=10000000000 max-size-buffers=1000"; 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 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) ); VK_PipelineList << "audio/x-raw, channels=2"; VK_PipelineList << "audioconvert"; VK_PipelineList << "audiorate"; VK_PipelineList << "queue max-size-bytes=1000000 max-size-time=10000000000 max-size-buffers=1000"; VK_PipelineList << ui->comboBoxAudioCodec->currentData().toString(); VK_PipelineList << "queue"; VK_PipelineList << "mux."; #endif #ifdef Q_OS_WIN if ( vkAudioController->radioButtonWASAPI->isChecked() ) { if ( VK_getSelectedAudioDevice().at(0).section( ":::", 1, 1 ) == "Playback" ) { soundEffect->setSource( QUrl::fromLocalFile( ":/sound/wasapi.wav" ) ); soundEffect->setLoopCount( QSoundEffect::Infinite ); soundEffect->setVolume( 0.0 ); soundEffect->play(); VK_PipelineList << QString( "wasapisrc loopback=true low-latency=true role=multimedia device=" ).append( VK_getSelectedAudioDevice().at(0).section( ":::", 0, 0 ) ); } else { VK_PipelineList << QString( "wasapisrc low-latency=true role=multimedia device=" ).append( VK_getSelectedAudioDevice().at(0).section( ":::", 0, 0 ) ); } VK_PipelineList << "audioconvert"; VK_PipelineList << "audiorate"; VK_PipelineList << "queue max-size-bytes=1000000 max-size-time=10000000000 max-size-buffers=1000"; VK_PipelineList << ui->comboBoxAudioCodec->currentData().toString(); VK_PipelineList << "queue"; VK_PipelineList << "mux."; } if ( vkAudioController->radioButtonDirectSound->isChecked() ) { VK_PipelineList << QString( "directsoundsrc device-name=" ).append( "'" + VK_getSelectedAudioDevice().at(0) + "'" ); VK_PipelineList << "audio/x-raw, channels=2"; VK_PipelineList << "audioconvert"; VK_PipelineList << "audiorate"; VK_PipelineList << "queue max-size-bytes=1000000 max-size-time=10000000000 max-size-buffers=1000"; VK_PipelineList << ui->comboBoxAudioCodec->currentData().toString(); VK_PipelineList << "queue"; VK_PipelineList << "mux."; } #endif } // 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 if ( vkAudioController->radioButtonDirectSound->isCheckable() ) { VK_PipelineList << QString( "directsoundsrc device-name=" ).append( "'" + VK_getSelectedAudioDevice().at(x) + "'" ); VK_PipelineList << "audio/x-raw, channels=2"; VK_PipelineList << "queue"; VK_PipelineList << "mix."; } #endif } VK_PipelineList << "audiomixer name=mix"; VK_PipelineList << "audioconvert"; VK_PipelineList << "audiorate"; VK_PipelineList << "queue"; 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( " " ); qDebug().noquote() << global::nameOutput << "Free disk space at the beginning of the recording:" << ui->labelFreeSize->text() << "MB"; qDebug( " " ); 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 ); } } void QvkMainWindow::slot_Stop() { if ( vkLimitDiskFreeSpace->isStorageOK() == false ) { ui->checkBoxShowInSystray->click(); ui->checkBoxShowInSystray->click(); } if ( cancel == true ) { cancel = false; goto Cancel; } 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 ); Q_UNUSED(ret); ret = gst_element_set_state( pipeline, GST_STATE_READY ); Q_UNUSED(ret); ret = gst_element_set_state( pipeline, GST_STATE_NULL ); Q_UNUSED(ret); gst_object_unref( pipeline ); qDebug().noquote() << global::nameOutput << "Stop record"; } Cancel: #ifdef Q_OS_WIN soundEffect->stop(); #endif wantRecording = true; qDebug().noquote() << global::nameOutput << "Free disk space at the end of the recording:" << ui->labelFreeSize->text() << "MB"; if ( ui->radioButtonScreencastArea->isChecked() == true ) { // We wait one second and then show the button inside the frame. QThread::msleep( 1000 ); vkRegionChoise->recordMode( false ); vkRegionChoise->repaint(); vkRegionChoise->update(); } if ( ui->checkBoxMinimizedWhenRecordingStarts->isChecked() == true ) { showNormal(); } } 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 ); 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->toolButtonPlayer->click(); 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( "file:///" + 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(); } void QvkMainWindow::slot_screenCountChangedArea( QString stringText, QString stringData ) { ui->comboBoxScreencastScreenArea->addItem( stringText, stringData ); } vokoscreenNG-3.1.0/src/mainwindow.h000066400000000000000000000132361416353147400172470ustar00rootroot00000000000000/* 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 "QvkLimitDiskFreeSpace.h" #include "QvkSpezialSlider.h" #include "QvkSystrayAlternative.h" #include "QvkAudioController.h" #include "QvkShowClick.h" #include "QvkHalo.h" #include "QvkGlobalShortcut.h" #ifdef Q_OS_WIN #include "QvkCiscoOpenh264Controller.h" #endif #include #include #include #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; QvkAudioController *vkAudioController; QvkSpezialSlider *sliderFrames; QvkMagnifierController *vkMagnifierController; QvkGlobalShortcut *vkGlobalShortcut; private: QvkShowClick *vkShowClick; QvkSpezialSlider *sliderScreencastCountDown; QvkSpezialSlider *sliderX264; QvkSpezialSlider *sliderOpenh264; QvkSpezialSlider *sliderVp8; QvkSpezialSlider *sliderLimitOfFreeDiskSpace; QvkSpezialSlider *sliderShowInSystrayAlternative; QvkSpezialSlider *sliderHour; QvkSpezialSlider *sliderMinute; QvkSpezialSlider *sliderSecondWaitBeforeRecording; QvkSpezialSlider *sliderStopRecordingAfterHouers; QvkSpezialSlider *sliderStopRecordingAfterMinutes; QvkSpezialSlider *sliderStopRecordingAfterSeconds; QvkSettings vkSettings; 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; 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_Elements_available(); QTimer *timerStartTimer; QTimer *timerStopRecordingAfter = new QTimer( this ); void vk_setCornerWidget( QTabWidget *tabWidget ); QvkPlayer *vkPlayer; QvkHalo *vkHalo; QvkCameraController *vkCameraController; QvkSystrayAlternative *vkSystrayAlternative; QvkLimitDiskFreeSpace *vkLimitDiskFreeSpace; bool wantRecording = true; void checkVideoPath(); bool isAudioDeviceSelected(); QString Pipeline_structured_output( QString pipeline ); QSoundEffect *soundEffect; bool cancel = false; #ifdef Q_OS_WIN QvkCiscoOpenh264Controller *vkCiscoOpenh264Controller; #endif private slots: void slot_textToGuiLog( QString value ); 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_screenCountChangedArea( QString stringText, QString stringData ); void slot_newVideoPath(); void slot_videoFileSystemWatcherSetButtons(); void slot_videoFileSystemWatcherSetNewPath(); void slot_startCounter( bool value ); void slot_comboBoxScreencastScreenCountdown( bool ); 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_framesReset(); void slot_x264Reset(); void slot_openh264Reset(); void slot_vp8Reset(); void slot_StartTimer( bool value ); void slot_startTime(); void slot_areaSetResolution( QString value ); void slot_IfStartAudioCodecWidgetsSetEnabled(); void slot_IfStopAudioCodecWidgetsSetDisabled(); void slot_setVisibleSystray( bool value ); void slot_sendReport(); void slot_vokoPlayer(); void slot_setMaxFPS( int ); void slot_gst_formatVideoAudoicodec_available(); void slot_cancel( bool value ); void slot_haveAudioDeviceSelected( bool bo ); 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 ); }; #endif // MAINWINDOW_H vokoscreenNG-3.1.0/src/pictures/000077500000000000000000000000001416353147400165535ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/camera/000077500000000000000000000000001416353147400200035ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/camera/camera-sidebar.png000066400000000000000000000544321416353147400233600ustar00rootroot00000000000000PNG  IHDR{`iCCPicc(JPT":U!kE3T T)MR,&1$)7Ma:o (8`/9i iV^7t{ק|b5^sv\¼:;*7,~;b;JH$ގȰdx۬ŹK[p͈)*:8쫺S&4Sq#*r(t:SHy;Ry<~}՛<n-HamgXnZ&tPybKGDB2_ pHYs B(xtIME/C̪bzTXtRaw profile type icc8Rm0 Ao%GzRFbZH"25g5;]ĕu-A~j /L!AA*#5SVv3|31u٨Nv0N.}<` (P[Dm'(!fY)jqYv*y! dJ/6EMI"i-}yX #/r$}=639Uu540uկ5"?VCS> AdR([/OV4EZ= h$txG8qlwB4˻qޝfY,_N^u 6xIDATxyGys^݇uXe˲Xu G0Gp ,$@XH !ksBC-Y-K,{svW軻zz1Y]]SO=SOA}G}G}G}G}G}GO[wj}@ZG:4tEZ~nD2@s+A#]3Z `Pufh?"@4J?ZOe}9G nF V<h r`gG;Ѥ ϓ_=י}hZ uhW:}ɺE&H7{e"Pt+Gf}\ZJVɈ,4!Q"3%Ĵ1)O|ynM3柼p^@k8&uqv1;YȊ&EZHټnEM֪V{ c>>>E.\sR3o/s{n+$K\-.cHG~y tcP#ď{v͠5@뗈CB mqx!hb7EQ qh_K]$Yh`I5ረrKK6k YS/Fe1#_~509WYn".!*ngz]jx׮^f'Ź⹼s[Mu_Lop u@7m[&,$+"hrudor[[{]>^x9 Jמ y.4$A䏖 Np+3n0r 1f@n[z\#`c: }EC`op/eYF@,߻3z{^Λ5U UaA~rlJF{] S^=Ͽ?gyv<WUIB~9fm iw~tr[l[n ]}wCMzW5##$ֶr7Tw |{>"s5itsW?;s&{ۙ~?|2pCSAMhqߌ{f-|xL^?7vy^maMf:=MޣaffGw /={;WfjtJdĻK{zB*ܹNY,^ *؈V좙"|9@h=fG\-93eε<9Uz`'<.blw BT c)qk]tRȷ+ ؟n~ēʃ ~9|b3UjY3#~WmRm!ϗ$TQOqd@#u08Qf.u;xӮϵ'/25ԑ(qQ( j辀?b/_JgOkzZ}|g1E8(@4K5R|/H^r /=zs+ |Uě:VLFu>0@ >knٟ^r[gݺw1"weV4!k|o-g|aˏ4;G^+R:h= DTP (?g.;f#gо/ S~*f} vb7ξqCvF*o=8!8B1/a H'LXI!gP1Xh}m\z+ GQT/ @CRF1-&N=MYϒ>9r +eA#fM|hSi~Y~']Y]H ^P (QL"~3Ȑ!K< 2Ȍ @ͭ⭭G?]M|0_EkM]dE*ԨyX%rӭRe iB!F#eA}ח]'o6ygpꝑwB~PJ`O]Pfy*Nb$Ra"(kC`QNGߘԕGڮ̏y3S/?MĎӀY(zԻv\qYZrIPOldU om]stS]bPzў)tr`X G6ˋߞ}eȝ?MYqL=I4hO<t61F _."6Ry.vw\8;ep&-ɌcX@"ѝPRN1R ^AFԜ&4H tjȐa>b-~\f"%jYDG%4I&:F|9hv!pkjN$8g3*B[cň1H3"s͏N%,0I Y ȁ`GC{E|$ڮE s˽uV4NRRJ ȓkCm@ $y,(Sla-z ,(l5Vˀ/nD~P) fB Y`%+ȒdS1s%d[q((@Cry8eraVJ0djëDãI/Y:VvɊ"'1Fxy Cr>c>)=6*Ϝ;>{``ըD*'y?X.֒߈Al.E 9qRΝ-M@Pf)e_hEQr6yj4 A%=js~F$[:*>J e:;h, 0w'B E\gM  Ž[e^Y/3cTf{9E:R 7_q|p30Z5f(  Ka厡((%AcGi a]Hrl*sRsSPP{_W7_=bAI$ %k$1=laWT͋`xbu0fe \;YJj,T fK~ *l GSIʝ.e7sATWR Kռfrw֯& |v3z GUܫ0@%G"s!D]ZySկD~Ub+CbxJ}w\!ijJy@ؒ¬55 klCS+ꌾǕ C \ BG;RBqٻ^5S=`rӽ3hUMoE(̭_e&d3:Jkxݔ5vpzs:4U˻R nنe֤%jl ?+,X7hr%=}6͡ sI_*G]`#  pxB̈"]e=+ *T"Fc+Dނw_~{! kxepS_`CD6kȻ (Jv!1XY'a6' j(RN4=0la2 .L&5$'7l7W] 6ZiU$"#"h4H|sg*/_ N 1xGDq6'R!VGLim3W.3@2F̣%ҬlBS:YLZJ[_uʔ89#Gq kjV:y꧰\#wrfy{c8/gy1@-N;uo/%YH,+\" R 19df_>k0;9 \ 0PϞ_?p`trBT|#dYVfG=m@Pd fȰU =]߮f31v O$SZm2ɰ_C1t~occ y @ՙ&,{QO5O&)1* N$~C> MQY)`jC$o:6ʰk?!j Uco~ LD~'CDۭmT]bZB 55E3/EG#p?<#Q!U7ĠRbڎr+X;~E kbS PJw!b &=ʅLrıSƶY$OR&D7 ޥKK PIt;^e%0K K3c|,P/CG}ZxKgSĥqr[GWrfŧ1騯[`1 7XH$N!&CڧrG(Z9^3&}QNAShq<^9u7TRdU\Zdh1FEȐeDeS4(09D&Ms͎) zWVEJ v]3yb~Dbi,ߡBb4ehf4OO1Yqi1GKmF !u\ղCF_z M@vEeȕxf`t昢F5eeir%G<[})iԍHj4lP4 5ߜbbJ$))0Ü]^Fs;xySg+$DuIkHZY]\tNCHXKdIlL݂H3DNaL[Bdx/P|Fy EnI$? X#X)9G﨣^m06fINkB CcǨ$ -tX CsaQwY<DXqh2L<+HOPMh2(Y  $_#E4KKCɒACS!GFxaEdSl9L#TAgwo}`Vd;+x#Se8T+wN_b3dȓ%eDKK(xS-' iŠc ߘ 2CAw(.u4IeO;Hgık.u2HYr O!Fe1ea.Ig^{8O RIXKM+:3@rP󨁵^'S#CޱgO,*{'EiFe1FfQ.d+ˤSTeXOzA~ÁOʼI{[Tyu HT,!ƑX5sԫy O2up-a)̲Y^"ɐ褎oK $NQe,%ߗhd> ç#7uk2A#1ȓgW{Џ)' C v1eO #5&sgde^('H}U4qĽ5 t teȲIO[lp\Fc*/ D4+l5lH~ d A&y+$Gam&"Z5\2X)VOH ,rQ@* *fUlJy5j A*eJ[i~ gf^/"cVy"$%k4a2S({;<`4@~I7! X`VxdJd:pTph &3"Jb@Uct*#`%G^"`.ZKh[=G%yoRxsd#"Rd01W "~ lݩl-t\HMxV4GZXyTcňz8Hث$>%PL!]6*S}D XHCe + ;@2ʩZ gDHH#'NWkhHh|"L3Ȱ"/G{7-T H];RCerdkJ ̱+X(+!GUͮ`,S&j'1CSϲPOL9n& Cw#;%d5Bz<@ aBgi)X@O3cFZN/Re]hroW8hR1hpCH&hG} ̳0! L!,?3]l]iyAwd*-N<7*.k I lG}0@2k(-Rb9#&IYrc-XDt=', ϭJ^kZ:Up;p};]r $u_G 9ƀEtۼ0'um ZfAD2dG|{s|1T+k^X yBxZ$N9AJAH`%Ntp72HҬ'yp 1W <&/ZFa;(9Ú{SB5GǰEh 0@G|TnQާGJJ{sj]5W*Ep6sE $#ojj`Rx?fɌP|??S+#)M*8E$\GܠD2Lc3cifT7{?;oח1?{SXZ0Lx8EV$w2G*fC5>2_M0RK$$Cp6y" u<֘e"iguLυY7>=) Tz iTY`EⵏN3cXK~òA5uGv5q4̵R tɇRciN2 h@cI+zk5a(:W.B\|<\Q#9F1V2Z@N48$DGEʈG%i@0H5!QT)4 lb Ǚ`3@P5R!"s+ZI.|_p:yn{4C̶Y 3tvAV3959E! $$Ds%UyouG+9d m!H-`rIa;UNl7)3!e$v X[cQ }uW,0рèPc /I p [a`Z*1Xd2 Ծ[-e } /hGZf4y=~8fM@#OaEot+vZG×dJ(I=M'2aI_Iv%XcZD@c3)ˠ ܕzMWtcRCg i7J F $˷^c_#t^+_dmrQ, 4/Bf6?#aˎn it5;ҿ p/0@< :s\Y( q[B["&*l>_u(8z{^];b;3(eK<H|f4!&ޤ pP֦*깁 r Jwƞ2jO,2QRz__0C<tݽB|ݏւP#b5[*kk+؄)HW~vLo5Ɂ1ي)U,"k-=$%JqE{특n^27=>w:3ofx%@!L+Es/_dGs:>n7:;93  D|4מyi[;x@z˩/5^ vОN;tVCIt|J/xF+_G~ް̵-M#j!wO䪙'+OL ae[OĹp[p`Í9dȐ>)'|xJD" A&7la7`1r־y;OmgjmO(W-t{voX3wQs'Z ę;ofN彻 p3ox7]:|zCЫ?yQFfod;/[Mn^N h0pX>w.oWHs%?ճ1W(凜^"i/*\$V7{;^(Zr{W|]qG } Qw$w5[_;pyArT\w$_v%侫u$>k\n= ڛ I#~u{pEkB ]⺕m/?NL0ͧ}ɏ^RU|mwvm{c; ʿ}`B Ea]?";@X)5N1@f??1q_y[ |/uL`gw&o\&IeMYWP!~޻ W' V)@^e](Qe-eS֜˧ίvyץorybPkiVonw_^]wy5k7R6h/w]^=_ބ udY}/k:'T9ʽ|g,;egz:^\C~x`q5W=]aa??wwCvI3Gϖ}e/C]|O/Ӧy|@{$xk˕Glglپ(Jcq'ĉ}pn/!.N]Ka39v~u(?vh2+2Z^g9G9$1Y*TFM@E%Ǿ5`Sw BaňCd;kY#ְyU)S3)&8MG;y /y ,^Bkܞ1(keݴV`R{%]s]oe0/y I{>ZG28ț$=}4A xe:} 2QqeGef@8Ͻ,vp>~Ќ8S|_O34-x:9E 3k\=@~}n|"G/ xŀHgoufh?"]r{)飏>裏>裏>裏>裏>裏>裏>)peXIfII*nt|(1 2##GIMP 2.10.122021:06:19 08:47:06 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+u asgvoKvcj^]{Dծt ۽!˝`PEPEPEPEPEPEPEPEPEPEPEPEPEPEP^K^ڵ[@kxCS,XգWmȭ':3C-A ;1Lk\48^@!Gjboi.tvy %xplrzw|<y-"Ia I]H#|WT}_HGA,֌O ǩBxV?C yQ@Q@z/zjגWW}m{ i-f?֒RD*R iM5SMG,~O<v6x[O&/es*ާnRpzv8rUo!o_ \RZH\IW x'4B?.VdRC  QE[^I^K^ڴ6_eZK@-Jԫ@*H[6رU((hXsVfb7?x=ii T*57*. zEJZqO_9G]QRJ_𩑮@0Β6ÔJ(j+Xhf]ߧ[ HV8 FM>kެgONّ%D8ѫF0K~DPa;!=JhiiE(ý̊0@I%_Mq|4)j ݨʀA, '|EP^K^ڵ[@eZKY_"ԫQ-J e 9]6 F8Rii3@}8Z/@1Q7vQS֙OZ{8ryOaSsNڟx |ď}Z>}6+#]4 i}܈c<裹)Ѩ_4Z. tY.X|ӟ{ȽaClJ0WlXyu[xRM?R}3P~9X4sD~h0#R+ c?}dq02[sIJFU㷸 SZYoƦ-@ jIf"K,+?*vt 9~4{²hdž޺Rk>3=JI&M)4hZG r$ƷM,I$r~ aX 8⹪'MTsW-g9>n16WW}my%z/zj?֒mi-H TkR PJ( P3IRPtY)kR9▚y4#I 5l(iP3ⰾ/\=LǜRZ>s<_M\, NrZ= g?0=ǥ|=E{ů5ƽ[4T^kx&ُ\ +]ɂŏ3ylxsZ% g9d{wվϋuR[yT^ѧ,xcÖСm>id2zz _&[@M UFv~6z$-L-M-Q 6rpMrmv:4M i'1k|1* HM4(zU?Ao޿xu[^I^K^ڴ6_eZK@-Jԫ@:eOru ձ&ZXEX9Gc^VԸ1K#;[(l  dѴvq@k&\?WWiea[-i +((*BQ8$i vH]'==-! *H"ǽOz֝Fgj]S\-\nOiڄ@?_4[.'OjfM4nj9 'TԼHU I;_oxlQd7YF{ ' *yu_o w;J.QISqaGNYWW}my%z/zj?֒mi-H*KR,2;UR=dtnh(-Mץ:ܰDc,uU H9kJ\:h hef3(qPހ (9l=<@h!NXSIP08Իmԛ-Z@W )==&y姓rGϳ77 z\ t6Vi ,hڀF Fi4כ|i :lnu7C9mR22ٯ&Jfh?4{H$Kp*v%Sp8ivqpRԯuJ}CP{|R`88 /uGP$fPyv0Aw1b?mkkG[IW .}1G$-x ]oxWŨ1JI<s `h x$IbCE=P0ҝEBCƛ;vj\Z?S qgњ4f3@f4-/i^ }Z+XFzl:tu-Jm ǢN?8/|c™[{el+=IwU~zk("cw <2I$TQEQEWW}my%z/zj?֒mi-H~2~׬$#\$SvH4GӼ-cwakqk"1$8w$䜯9[y^Yb#ff'$z{KS5) F.mJz~ QEQE7Fr6ݤ|G-Nk>'!tEXtexif:DateTime2021:06:19 08:47:06mutEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1[9tEXticc:descriptionGIMP built-in D65 Grayscale with sRGB TRCFtEXticc:manufacturerGIMPL%tEXticc:modelD65 Grayscale with sRGB TRCyt]IENDB`vokoscreenNG-3.1.0/src/pictures/camera/camera.license000066400000000000000000000001311416353147400225720ustar00rootroot00000000000000[license] author= url=https://openclipart.org/detail/170690/webcam license=Public Domain vokoscreenNG-3.1.0/src/pictures/camera/camera.png000066400000000000000000000341211416353147400217420ustar00rootroot00000000000000PNG  IHDR{`bKGD= pHYs B(xtIME6X~zTXtRaw profile type icc8S[! 99N4R HXBݔ]6E]k5L  *i3 iPA)r"]2ܾ`{Ҭdd pUF~h盲F fHC'/GXF58/U=ᛐ#U̼*|ƿ9UCm` `^p޸89\MMVDvr{!p$dhT\XCc3C+Hg!Y ,BQiW~0Ǔx`xkJrDJ0B{+ao&~;UZ@{tFGT>2E.=cM+LŦߎGs@H'6i1)3BfpEwaIm yr KNw{o}$zb (5"IDATxy%GYg}Ld&d왙d/ALbD"Y%xqQQ/B\T*EE4^ $3!6Yɬ̼{]}N>y3}T󫧞z*``````@pTiR*!ϖ[zuaH1BQUYaA縜<㹧Z C c:ʲ$\*.p>m9F>~y/?Z]ֶ6n'2e"["_*A{ciNyGa^<7,g9qf_uvǸK~~q~w6xYNry9)DWܗwrK -XeW_}保{_" _/` S5yLwuTc|?qߥ 0,Wu+lYh:J#wtgFčl`(lsF5d{o˩;,o@3ɷJgO";}uP៹ug[UUGV~Y\pIʶ'iB)Ƈ/^*#OnFd[[/ٵ{~ƪ"[5⏛njdM~A g]~+~Vt3bw|e X>(~dgySp:\dU#[!K[Oѹ͏_gYr#w<0R&+%lL;񴂄:at\dG,į1uWVݳ\{OKԻ2 _j_RL o?$ڱ"kR5^6J/IH6Q1aYMBTQnd~@U>彖[=̵XgP4z&x#"-lL Emyk|YF)񑌰DwPoypT+fj-Q>F،;gih; yRCDt<%9Ng wK%#T7pי~+E \ D7~,pՕ Iu>M3v_5; AOC*Ui &h$wk؄7`{"נ}dF8͌Pqbzqsr,z8qĩMFGyb08gr:%k޼j>4)n$SQE,A o^zf.T^R[RQd9R6s:j,qkd9 U"qhT)|1xRQ.'+8/fJM4D[_e,\&o\['p%Gs^Cٓq/`< G{.}Tf3Sz,xK$ = INyagqېGPMY䅜Oѹ~74U7yc(ZӤUNosF$g߉6Jg'yP52 u[b~RB>{"'t$R%dh}AOa>5XËQ&@(q8TQ|/8 k@rx{L 0}>xăL?guUCIN15spg&@n[Șy>~K l6K}~j{OG]YZHѪq1ºdY 2mr}Zo#A8+ wڵ*+4ZkER/*dHf=Wڼ1ǣI@"jܽkFkmD+cNqTͰ$#{L/몤҉BicH^yz[f==켉iySn,qNb hv?>px-?PaCǘ)56pIPAo_TG/|P]ios,z(GR|x\K// Sq$Hm#zN~PfFکlc넂L2 #Lv6cɁAauTN&*>k-_U0h:ݹ9A$ +zF '}ِ4a 54Gb;$[Z7!oal7'}TL4x ¿JS٘Is柤s'89Ifcz e%3R:qC5  62Ó_!$=hRh:x~a2yQ2/^`i0?kc=XH~ TFBVuKZ#Pf`bE;$APFF? |?ngQP@-mD鹿vqc V2FhrY\"+Ǽ-R@q3=%+)8iA"M2:Pe\"p96p Χ[l%Q *tE^@zEz TZgM3z.*ː޵ӾKԨB¡DZ:5MQNTdDSA7˱ O2N~{/Q 7o?Gƙt6 4a1!8}BQ)6ڝ-l'_{$X gY {|=9R/yf6Gjc٣ 61ԳR@Sl) [ݓj#lL%>{'\F Ut$cVޞBtoE 3L<-, ;Vd 'X2!%2va'Jp"֛ٚtTD p) ^,"LaP5-& 3)K<_}f ͊SgQ&Yfq>zZa9)<bY6i/Hi 4:=H=_ߙ*l)dNUpc>`aOQv`bPјf!%_[x 1e-hТAs<0!.$ :Dbl Y{~yBM1FO|.deɁUͽL*䝭#|UvX-Ƙga Ak==:iaN0yO#YETF) Za(,~9,RvUlL֘˹ F(StoФ`m s6;Xav1ފWjm+dı9.qؖvh?pH4V;}%d{YUr.eqƙdI&c)Q96f9 C궆,cUC wmL!ARMOLY~{&ԨSAÚkjXK\$\#>LՖfd9m(r& TgEPPw`R܃tF xIz/ҾE . Q_5GmLҚ[g_{6<#9 l:V:-TYd9Yde* DT]WI"n w!Nu֥7$ 4fN .Sf=uz%'Tþ;gCZvsί6թSe%5:x/-}$)ᵀXjHkHTL0) KFOo@g ;!z7,Rl;852zttgʷAͲCTXfeLբAďǸ̲5PKut5@Zɤ 7kbнEiL_߾Ep)Q j<<1]9kA*˖XvZ $f{SD(t@|G>D)C.R@%nPc &IߠR",AIXt@į<$_x ᨇDHyPSY&B \+ N0_xuHnNE K,Zh7kwjmpӴ;iĘRZ|)~!{lS^iK(]X.*Jȿ!M,; "Vn4@?uԵR%hCm8=`( e#]\hah HWP 0{̕*"V!H҈? Qvn.Oqr!hB6~|!)!iZc~;4  >S@,t5Ld_lv1rjdt_~d#r+MGkz ؉V -DZ͆`^*,Ssb~l ] B im=Эq<M$ V5}9&<`jY:ޡ`dc\GI 32U˂7kTh-Q1hA#-U:&.(ќ{UJGWd#?)- 焎AQ6- cT)HL}=,l$DG*4yF@050uޔ\0E$ވ$Iقh $K`?U$vi9y*yo);*rtB8N Uʺo/mO3NK޻R묜 30߅džAO&~A xFT{y+->wyPC41l9u͢}pbrZY46:mHn /)턬;D+ *na O*f7}ӱ4Imq#Lza+8)O$~ԒArL[iw5@ hzP M Q8x4~?W. I&Z `yKLB2J}n? I #J &E <Ӻ%Et9~KJ}2]'%HE>s?f`j#iQ]@ 3@d#Pz>é1k)LZ͊{y7+ I1dZ=2 b hI~S%_# a$PdY݄`7_嵱I Q?CC杖A1}򞴃)߇HP-h}XaPD-20Lw'6G>aw.M<29ZVA<k3 zv){LɀTÜ& " xʷOp2;-i]jMrt?5fY-Q`?L3KPf-3]P:Oq3%4$e97) ;R:R-'R3FXX9>G3Ћjuk(b 6s#p'8N:%l`+PFYO1jA^2,r)7:EuDu%Œu'ןRԨHSgefg zfiaEI'L (0?\qAu,V Q4GX*Oh10Xle_mY0H<-s"wNyDH`:q@Vop玧3A&_/|lh CfrOĹ @:M=ہP GeS]4YdpH;G䗲[&н,SG0[?G93 9I+_i{sx34 Ȍy?W[HxZLk:4du>3$Z« rl $CO}T{y)i;\P *ھ!Sf.(h%3@0g:+DDIK'k@9eFRf}2y7+ "So%Eț\y\};/T% 9f]|jؔh)d9Khtae)T!c I:Np=V & < C8~ @g֊nrrߟ{3qb2r5)qWGqL= q1A,|C|Ꞵ=0h<`M@ U!hkTb·9j@Dl w?%k Ĩ_yMn8.py&=^[1,4zT8ٜ,zef ~[۽{O23I LY>gG^wEXa e^ᛡeL}pYCC@kL`(AZB`%Z]U >lT'v{_qs|@c1ǚv#iJL}:O3v!BVYb~wK;wneL?OJ֮}~#85x'LxIi~zWf*L^yj{ ء`ìޝg#X_ X r5xվ}Bg5]}Z ktVthZ ߫4%\3>/$3yTͷw0}"[78̀Ztwk$:UfC ^M+ ؕ_=6{/0>ŝ]6jT/ 20 9hҠEa63ߠbV5+kD[]q{iDhRF#YJ"JVa:"i7ѲV(bB7PNgeTw1z+m؂DeT PbcZ9[(:UZg M4Rm5n+2"];jN7 t4=S:MA-$E)!J/ hPEPb%F(5ZέAշByJH_;?җw&;n|K8F=ӢT \#I- gM[bֆuZ0L<%OZGը6r>+(bpƸk/4=ո@&w%@o^86_O&+K?-Te^9ީ/jrA Eޱ֬mtGpWrhEacn;5jMH8+:'Yߋ͍O5l}/ܺ-HVx8m^.Eׂ$@Pf7EfŧwrJ&+>zcc(;H0yλW[$̮TQ>o/%a5kznUMA&uTXi]ء2vy` aՈy\_ѧ>b AWV/*wWoyA=}BJcűgYq3rgN>s^XwtgVWuC_ߝxE?sWw[3g]xv>\ W;EϦ=N0z~N3s䛰= e Y;7}onJ\`*= W7{g_漟 6yXh 1MgZO_bJ*g)$F(#=co?d\SgWí}D0pk7lhѷ~bSEY$y({'ďoߟ\}7:@L>Ý-m R˹1RG2X͞Ԯ|l[t1uZ,"r1F-+4Ŋgr5$NݑW6+LΐnXEv^uw&>O'yRZ{8KH4(%ěprxb#4i:AV$  UD#o9J|Jql̚4WM(D@|vKX~Eٕ R3v+JHEcY(џ=5;ao40h˞"A"y_Tq׳_,VY^ڻ[+J{ol޿ ڣ_/4ixc dxmuOѶr6kȦx44s^h.k+D $5_-֞)# Aޙ`&;<#H>%޺-F˪gxp8Gm:N2"8&*cyK+apwx(3ޫf! %?ܼQGxP~g3RsK\x9=@#]+y4^'jEW7}C<<[ߦ߳ ޛup {tmiE[J鞝l93փoY# x[#yax9*k2ReD/LTS؜`q&XJn[*)ݍȀ8lX N:> 4=׋[{mqR/M$5{.(/^rWy#jKoO@*ܽ[1}BC^{yefRvĥw$}8W_5+&{eK|O+#Ƀ4ޫ_U8;{/h;8~޸k[kX5W]P~K;~#]`6EyqX<,nՒs]qF-y~7O NjvuLޚ#~ؼ7!i4n6bjuL-sWA_)}ȍN WK_zÊlb?@yaѲ=@ [Ơ?a [As<1 s<1 s}m`Pȥ -TW  0 0 0 0 0 0@o&4h6=%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/cursor/000077500000000000000000000000001416353147400200705ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/cursor/size_all.license000066400000000000000000000001511416353147400232330ustar00rootroot00000000000000[license] author=Ken Vermette url=https://invent.kde.org/plasma/breeze license=LGPL vokoscreenNG-3.1.0/src/pictures/cursor/size_all.png000066400000000000000000000315431416353147400224060ustar00rootroot00000000000000PNG  IHDR00W{iCCPicc(}=H@_S"+8dNDE:jP! :\MGbYWWAqssRtZxp܏wwQa5hm 1[CA 2$)u_b<ܟO[ ij0m MOa%Y%>'7ď\W<~\tY3'V:Lx8j: YU[J_+\9$ "PF6bXH~?%r)*cUh]?*LMzI8@hhq'@j^ok#nkp =)RP(gM9`]zkPW+Rϻ{:{Lr} cHRMz&u0`:pQ<bKGD pHYs..*' tIME%tk9zTXtRaw profile type icc8S[0)g|K{ ,6vgE (ߵ_00 jٽqۭqr&^"B;`=$dlm4Ci..u1dl3C+Hg)h,BQiŸ`+dC&`ה> 2C刔va2LV%ju&=R`ԏVMfͽ͑hOmbRf ۋh' q`)\"q}$zbP IDAThZ}PSsrȗLBP m-;]2S8]W{t;rwg [.mNmtХuDdm( I! | mgLB}={\H7@DX,!ܹ16?/[kjjZ TUMNN>AD1`w5yv7KD^TU^ti Y&(㫯_~&''6 z rU;FV+W}֖m L_]] EQqݴaz襗^"Yidd)))|txnvze#GL#cf!%%U h^0W 655mll\ |>Șb3Fø\.8numm-VbxxIIINb[@fۦ*HP>Sڷomݺڵk455E,S8xȑ%tJ?c𹹹F 8^MHb*B!Ru^Y 4?p^<Ǖof]e EQ( 0 //C=dlmm '&&"Eؾ3tNN(E;E|p,rrrUUUe---Nt:c^'EΝy뭷 GMEN+%%%b5`L&SL az)2(2E"RU***,mmm2O>!MIDq>4} )SSSD޿rJC L;hZNr0EQډv;=zjjjHE pi9%"vNt3R?'"ytϟ/&Ippz):u(?::=bfv;v%%%̲쒱1]]]|$ 1"v;RRR~+[t/6 `7~dRkkߗ|pqpt[j!Y/ϿZTTq8뽥F:CMM_tS:n{ݿ?!28Caa!`ِM('|@_$-,Tul^ގ|"eYAtvvYYY V5+55u(Y>`ss3&Z(u,Bmm-Ah%l({+z]zE4MJo͆d8N,\B'( m6l6G6IT#[`|>>|8e<, `m 7?d\.zYggtmmmy~ޜN.Zho6V\ FEQnY@$X#($#  Jp:HIId`}Ya2P^^'N`˖-,˶zFg.##cǎ]ްaSEEEOZjիWql6yx<lٲP,BUUlH[\n( Ӆo~rap8Xn2331>>abB(:;00e˖2.kp444_}KV \e? ݎk׮[n^<$IRũf㪿2!i1TIPK)ihoo%`,]tÏ3gcǎ8p>h4+MMM{>~ hILz&eSXp8SGDM( 9o~7UUUpϮ]_*tS"d:::~`~D( A:x  pzKKodt)>$fgcfࣃx_a}޸q QVI{,1x';;;]xN8Aϟ`MOOψwoGGsJDD@ܗ_~@6+I%Pt"-1`p ax"}K.M|@ @CCCFq<V+z=rϞ=yHN8oii YTUKXĞY^x0quZ">#tww#-- ZnCCCX~=V7!!!@$.mc(j9M4|h(|4FkF /~?DD_Soo/ɲ|<1:}bbDXb1$AhN---|2 2F#Q\\7h4{{{]r#ݘ~O]hml{9hڙIHNj/$I3;K}l]p_z=v }3 p8;wBgϞ0 |;2N|WT=~VL~? "\?۷/@B499I*٬[ Hdl޼ eeeų9\B3w\'|2<993@Q<30 /k4-gx b`JDS---zjڴim߾H͖/>EөEEEpjYY IJJJ΋Fs(0 cаQUUjnnx< [Kкk0QtF1 6n裏"v7aM]o-ZdˌD"6L70M*$FtǙSvSN0i4czk1T,q{iGb6MQxZlNSm2r/\cG !4eXIfII*00nt|(1 2vvGIMP 2.10.122021:07:02 23:37:28 " JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((>x+M犮R{`]UEܬ1=+|A-sƨ +oK^aդ"&20Uh?(Gon24Aɐs;@QEQEQEQEQEQEQEQEQEQEQEQEQE(5v;h8bKgK{tXS?ƽ@P/uHXvFj4ɬ^I2 e~R}Gn׊t~>I;~o\g<_ip +DV'9#{Pk4`YA*Nߗȯh;<}c$a\kk/ӗs6x[xL]e*(((((((((((((_En|GxvoHI0_I|k`wmA6$`y* _Ʒ"@9#-& "FF2Np`=([iLҠ9 5zͰdEFD >x7zܫsr}k} ?ZjAr]@ܣ>YIux.mN=Ye(,T鱷鬿@[EPEPEPEPEPEPEPEPEPEPEPIj^j_ 4-FfQV "=$8pXV$Ov"GR1{(r{(pF3ɠ .R%qLXPlD*G&]pcu9Ztτ vޥDPU/D G5K `s5nFiyYvJ6="AS@QEQEQEQEQEQEQEQEQEji֥M m!؃{WvD$%c_M+<1see$F)30'%vP8ZW߇uXFYNݗif\|9ʚ*2$s\oi:#;g!nl諴;Jټm!%YS#p8y袊(((P7 ҰЮhdT69 ݤvBĖk> K_ﯮ/#=APDqysVij6%œ#BPAұ{KP`)Eczk-I-Vd.yVQc|~~mZ]7M)r̫2>U'9aھqXχ,nldPaw#wQj߀hg$KfBK)샟Wwqp T7\S9+7dG;SP ?Ƹ{no*+ƼgbakUŔb(:Zt֒=3ŷrmHSyUVW( `Z>CWƭKZY|>ռeɨQCۀ Oa^?:.Z Hk{x'M=oܴNJ죎wGWSܴjPFed ߘ ?zJ׮fd(D؏J봿6mbAryGPXCoz|Cuk{in,{!.[ׂxUX˂A@Ooc^ РԵ+ a`Uٷf܀c { H] >c_c|B𥇌4F[g nʭ+>`xt6}-΀>a. 2$e#(_ hj]ޛ \5-ԎX*Fa8\}?8?ҵ;UbCٽ댼=[5`r8OQ1hYF85l Z(2F\]u}'D Vvg01V3GlwFOZzU:| 'n-T<6Sm8xVjHHם/?&8o#DLJ(Dq2+gF )RFc!o1=}"TbVTȩMU$eՎ-WVR?{ AYekfF~jLE~^ '_$!_<װs#ӽyė?[Eހ8Z("1Q]W<_sM2  95Plf,1} |Bu;{eB ޺}J̑}/hxgeDH> 񖣨hK,66u߆/l807{?t[߆u /lI#)#؎~Q]?4QX |Np||#XMl%ـָm[ᶰJ ͇O5i>+h(B*s[[y+)p1׾}hKKIYh$ҳd\z}sᶏdKs|H3}۠$1KP7e89k>kV'u1pD@gxU? q]gXnHD^}ͦaV;~NzvP͕j v_ֹ> yW$ Gٻ`%+*{\8/)WwA=կh}\/A>ՊTWե*rө Gybx 8h,Hr=t[m>e2ːNpzY~_*y|iÖ; 0$yq5KJaqjΜsڬr$aCA>6;Gf0~2ʷ`k ̟ڻNMygfhʐ{V74Z)gVXǕPP=˨ ]KmnKe1`{@2m^5uBHM{\[Ő^2t f"tPhbe'wA9@t{縸ݑ(l Һ5KQyk|sYhI/̍3WƯzPAe2!x';vzPIANDCg/CM+Ⱦ"x Rc(bXnT+n푴0\P54wPh ( ( (p(#ph'&>ozZ:d&HֽL lu'־+еۯ_=ݤpA#؎x|K۴X,x'8Ҁ>."B9Vg&hNF0|zW7gBi6 UU|k[]*$oSsv-4VY.y/9\ߋ>-h:ZjJx;޼F.I#qpp(Wڌ:-7*'$܏J7~7//zz7MQ46;k޼IҴ`.K;(Hձ?r_J.B5-Q(egqUd۶3hKH3G>3d_j+ۇ_zt'YsMǷW$|U -3R{w-73[:4F0#f'$Jvcˑ\|WxRI#Г _^_ߌ"5XKehHNw0|~/CM=!xŚ\Gv bxrB@F rhv r)PEPEPEPEPEPEPEP95b]kYmdJ@>ZoxMMR mQYF1=+ |I_ɨiE.#Em+vcW v j7Vv&K \#n /faE}1Gռ=oݫ! cc׈kEƑz;F##+@JJm'8#׏G6!O$}(@zTҹA޷Yuu$){/<=wj\I#BPؓ{SWcDoS[ -cqWcƧx GGI $zPEQEQEQEQEQEQEQEQEQEQEU["R:dMAe=.0qL((((((((((((̱AxԠ>lu rxX[3|cr_zru"8>$k{;k14nF xGA5^vuh/ cI a0Ǖ/|kuOXGqEpmѕW0ƹITDW@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{%tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:07:02 23:37:28߲PtEXtexif:ImageLength48qtEXtexif:ImageWidth48HΉtEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/cursor/size_bdiag.license000066400000000000000000000001511416353147400235310ustar00rootroot00000000000000[license] author=Ken Vermette url=https://invent.kde.org/plasma/breeze license=LGPL vokoscreenNG-3.1.0/src/pictures/cursor/size_bdiag.png000066400000000000000000000213021416353147400226740ustar00rootroot00000000000000PNG  IHDR00W|iCCPicc(}=H@_S"+8d,8jP! :\!4iHR\ׂUg]\AIEJ_Rhq?{ܽziV鶙N&lnE "aPf1+I){zY=jb@@$aiOm}+*9I$~όqX,ƬdjēQU)_zr⬕yOp^_^:a$EH a#NN4'|C_"B 0ṛ Zq/):_c|;N>Wz_ӟZZ.[\Olʮ) }SWޚ8}2U88bE^ywW{oiTr> cHRMz&u0`:pQ<bKGD pHYs..*' tIME&) NzTXtRaw profile type icc8S[! 99N4R HXjє]6E]k5L  *i3 iPA)r"]nQQ}-I;&Wa3o*F2.!yc`h]R3lgvcc G{WoBD7T1|T Ş}.Ղ{y[p5[7YU |?'!F:RwCƶW\ @;|>LAKf"̞Hxx<' 7Y*G#2V`3ϵJLT'ڣ3:z$)r6nZcB,6v5.{#ў<̋@ )݅N'(ZRʹ*D.;a];7ExU.^-IDAThmlS!"Z mkAUEIJ@'*ѦѩJT*4C+S+ T&La"h,))&vCؾ} .nN#9yy)La SPwm8ɝ&mHk"͛߹@IiD @`6e*Z#"lذA. PahHDt@߹sgmq]WDDR/J;1dWJ!">@wwYf8 2 cCOO<䓘D{T*+u;DdHDT*%{쑭[Hkk@)7=|2h"{wD)ҶmΟ?Ϯ]b QJ yWXxi.={H$ 7>|SH*耯?[ljD"̜9k f̘ {I$ޭ^0g@XBWJhtݼyn:<~jkk/b(p1q(t%4f, ɰzjl>y ecD (nۗ.]kFr x,-[\otj PР""y68{?͛ٳgq^{s^fyWp.L… u@?x`3(B[رcK/8⺮ݻW6m$=$I< ) wK5@߷olua"yu[ɥsϑ+Wȑ#Gdraq]W٬rʕiܢ WEGEp|X~w@nJ[o^sĉrUbH$˟83SOEKџ- X勫A^z<o6M/Xc ,=a4A8ѣD#iv655=j K (0L^L&P(OR OmY~a?R@.L\) 뇸;P٣ah]C}ASĕRd2@lm5JjΝ;曵Q¦A򅱁 銻2pȉdK䷉:kD"?JGkjjM$<.fE=KWFSju\h4v)7}U}---!۶ߓ"|ommd2ȁDD°#b~YPeX짯=}`>3gD$"_|!XLɤN\tzb;i](n sk-8uӦM[PqRIWWmmm̙3Xn: Hr4)rT 1fa\z{ ۶ӧ[-lWjjj@$.1}q>|m۶t[UnǓB:~LӜgJobhR1 ye[Pȗq;*ZxݻDz,X|9O<ga,:յ2w;ؾ}|>288(fy뭷$H計ضpŸ[[[WirPM:&-pС|?w99uT2Yw?K;vyM?O2mL&X,fsBl^6aBI?U"an޼No˖-%'u}G*y+J%ޥ,LuL$/Q#=) Pkn^&*{M1SQn4eXIfII*00nt|(1 2vvGIMP 2.10.122021:07:02 23:38:41 !JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((rjIX2_ 4?xRSmE]#lNrǿy߂xYK紆xTe\ 9qֻgKCg> ߑ@?lUѸpz-|CxjF[`dglIұ/ {/ [I&Wt^. &8 i A9 ( ( ( ( ( ( ( ( ( ( (Þ..$]e(l3 ԼwMsk~&_ _Gl'Sty )v'[Xø$M%ս$$B0IzWI jrpϽy/2KO^@z׏f-U@Ȋ#ZVʡ9?֠"m[8&TE4?dF떬,c1K+{C;9&Շ$y=^cUB c.eY 9h(((((((((x4߄ xVT.(gmdERw#J1_K~'**u m<{jIހ=|6;8jͤ ]HydJpr99C 429 C1=W\;\0󤖒Z/!R E`"' t}yPH=zW\ "d3P2Ұe#4\1ֺ? ھ%ʮ2{R$d )>gh>)@bE#wakI ees5ǹ3cYhh((((((((jC$ -t7u/YOi1`+p쭸§0Ag WkmGL NE䟴L'g-|_7ԼK{;-#.PaF!wckʃ@ EPEPEPEPEPEPEPEPEP~ψ_ǷcAruWR">|;@\6*~~ZƧh²+ e#q֡fAS\eW?h (Ώ7 )!]۽y ߛɮ&rֽKտ?WG߹9\g5grIcP~{V^AWʹWz&AE2){!\ '&(((((((|72iz\CWNrѼjvo46!B_=,aA?k#-8˓"s;@qa,V@A$qκJx11Ӿ=+ ~-ImaDX ƬC(OtQ$~R(Ek22`G ǥnkDqY7 6xk|yWNX ;5;6̸X aGjC6.BH| _9P8fC/<1i(rd 1;H}kȼa[xW%4DD{+@ ((((((((( iZm֟1N`eշVڄc ;r3־ Y|~N$(hz d$!@1{@ Lq.嗅o(Lnf8HӾ yPXG,-(*\@kaYy =] Ý^(Zĝ]ڥb,X7LYz՜8㄂`ڀ6o#}k/ s@ 21uP{]=7#Xq^%xSP"hVU<`QEQEQEQEQEQEQEQEQEQEQEEgjs e=}묺{D o_3|>;-&Շ(_ڴjW/$ZQ^ZIa;K)RvYV!$g?ƼƟGNw{cr0UgxD4p@('<#*];[s|EŽ"H9'ZP2h#$S)!q2 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?~%tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:07:02 23:38:41W_tEXtexif:ImageLength48qtEXtexif:ImageWidth48HΉtEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/cursor/size_fdiag.license000066400000000000000000000001511416353147400235350ustar00rootroot00000000000000[license] author=Ken Vermette url=https://invent.kde.org/plasma/breeze license=LGPL vokoscreenNG-3.1.0/src/pictures/cursor/size_fdiag.png000066400000000000000000000217721416353147400227130ustar00rootroot00000000000000PNG  IHDR00W{iCCPicc(}=H@_S"+8d,Hq*BZu0 GbYWWAqssRtZxp܏wwQe5hmfRI1_CA bH2f%) u_<ܟO-X 30muMOaeY%>'3ď\W<~\rY3#V:Mx8j: 9U[j_.K\9 "PA6X~?%r)䪀c ~?ݭUHxI$8@hhq'@0IzEm⺭){0dȦJAB7偁[w뭵 K]oC V5wtV?(r% cHRMz&u0`:pQ<bKGD pHYs..*' tIME'8rWzTXtRaw profile type icc8S[0)g|K{ ,6vgE (ߵ_002E.=cn㦕?&bo|9esos$ړGuyH!380ډ6C`\k\IDAThX{LT{=ꠌ#X"&M1(YMHt61[1ڤZ!6inX5d#XI3 03 ;̝se@Vpyh~ܙs;}~\`s&)Ic,yyy^gc o,a >P MBBy ۷oϓ$BEeoxx=zdSIpab666.Q._L400@14 P<88óg&)**b9q},. 16na`ۑM6@D(~z<_ݿ_ &d h{zz~JJJ7n܀d(`ؾ};l6F#Ad4xM; IӧO)(((YGyy9v؁Ç}b'c{L)))qB$deehafh4޽|Ybb"ҠjK.a߾}x1BXDQ YF#KO>]UPP467q Vղ[nڵk<[srrga@[pVDzC|F}o-[i&"rSd^mƏٙk0Hu@cZ^0t6555p.|R;;tǠ{ bF#I)ݛ@zQe!_[ׯ_/v8w5:'AlԾjz@"8[%IRscT)$EQ ϟ wU5LKG'`KD@% cA"0D$GPyuGY /T|СC+W0RL(3313zU6 WJ=uE9r7-~W&;A_sMM UTTPmm-UVVQkk+Sff&vjoo'"zjZ7Q>X| @_]F,SUUS~~>᠓'OE^Oc4.vjSop1 '"r]ۃ VZ͛7#55u^ܻw(fgg5 @kn({r@dBVV+F, a4sJJJV넉PQ=o+4g;;rYpQQQf< Vs7nO0"Fgt_/4cT$TϏoX2c m_k] 1zh07̥&|eXIfII*00nt|(1 2vvGIMP 2.10.122021:07:02 23:39:07 iJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((((((((((((((((((( W6')5x+6mSKa+eՋVڌ1i-sϦjo,0l +n 1_I|:ŗ=qK M9kVm{P>(1/ rE$ Bۈc)OaI5V j2M1' n[pqy· e5vE@*S*d#pzg(((((((((((((; &!$=>no##Fx?$k-m݅qGbnp1ݏ1f;H~S@־)EpƯ-wCz+8|Bգb- o?ڠVm¼_xvyEv ȭ;d'mHTY dI4{F}kWCVIÃw֗IҠ-Ztg2!;@-<3{{}"d'$1kw8(I5Ŗia~r ۀ#<|ƾ;EUNd#)9.㲏J( ( ( ( ( ( ( ( ( ( (=Ƴo%tk'&Hr=+ kVޛ%ͲJȐrZFqݽͲDc"@H #Ҿ HQt0@ǗOs4'A{sp=+I`3k,ikUfz?MjgˌϵG,e{_gU4PqBt{{VBFNrvi_4;Vt@Gz¯bUOޮ O4L,!cjހ>|EAT6Z[R{kut Ip>o>>\=ώ]‚4]e+(((((((((((DұU gxJn>K4-8ktV]Uq0*k╢b84K+Jq(=֙!PDx$G*ISicx98Ͻy'īv3Ǣz(/ T)4>]WP"HnϦ33L$cjڹ/xV=vr%fOL--^7_4FNO'9RUe]c v'ֹ/ʱkP殎MI[1װg.ՑɑX=((7xK'ZXt\sҽ??j>`ۥsQ}nB?S@(((((((()BIJ'W)&(QCuxHUV9 sכ|橯 4,@bF"Hv>-y >_?ɠ!>l~?ٮEއf2B zWD`];В~\?#{}+6Qο*}C} qm2CY2˩0EUrA^Zyi7 Nݻѵ |ާSa^X/LQߟx>gfD`cTEw*VpUOtQʮ.# ;ܓO[0EyE[j,D Em5q)mxKn%ـx'jx{2M6W_LbP(](95~Ess5:#6P0u>..#%%t|uiFB OUJuKwE@J((((((((( βU皯E1~Z72-@Uqtl0zptkWP:e^#k;5tL@yxwOO)Y K|O{+uEX Z'PxPRue1.`c#9bI :bT!ʏ/kS=Ţ*ꚤK] ,+4q\O1͛CxلW5+tH ɤ ( ( ( ( ( ( ( ( ( ( (=ox%dk@##=)[:\*P;T'־.ui[H dH $zWпYw+$|8qke'W3/gXm DWTH(@9 Gc }b-Ϝ`sc4N5s;VΛA[4]j qѿ*u[RJk|-ĚΧ%Ŗ8!w}c]kp5py`FNuk`G<5}tL qӵuvf}9cgFլyEe0p}h=B rH=Wo|[a!f]woje=GM"mYp:1dz{W_RgYX."0=ހ6KGD4PVY]^̱G0QxOzJz&=F-!2NJG{EήͰzW?uu? 鑡9e=()Y‰|g8?_/vQDT1ϙ/PQEQEQEQEQEQEQEQEQEQEQEW?WEE_7Wm:߂tt6Og3\ۊmp1uF@G?15qiv< f0’+ݗ t}*+R-'Hc"W`reV_.O#I'-EJ05mK'b_^v22&GRs;( c_\}+lX]@Μw"SC_ _xnQӮKĈ˴~T9Q޼ ( ( ( ( ( ( ( ( ( ( (Sh"Ņtn˴9ʚ,@VwՑ#!2ZY<ΪPPpb}k\/^!y3F M3W4f -)2E!9jU`۾~0GrX4R.['!tEXtexif:DateTime2021:07:02 23:39:07XtEXtexif:ImageLength48qtEXtexif:ImageWidth48HΉtEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/cursor/size_hor.license000066400000000000000000000001511416353147400232530ustar00rootroot00000000000000[license] author=Ken Vermette url=https://invent.kde.org/plasma/breeze license=LGPL vokoscreenNG-3.1.0/src/pictures/cursor/size_hor.png000066400000000000000000000217241416353147400224260ustar00rootroot00000000000000PNG  IHDR00W|iCCPicc(}=H@_S"+8dXq*BZu0ChҐ8 ?.κ: "ƃ~{Ӭ1@m3zE0YƬ$%;]gst9xMN jٽqۭqr&^"B;`=$dlm4Ci..u1dl3C+Hg)h,BQiŸ`+dC&`ה> 2C刔va2LV%ju&=R`ԏVMfͽ͑hOmbRf ۋh' q`)\"q}$zbϡ rIDAThWml=ovM6 K&EVv Q))H"$P[*JhSJ~Q i.-Jh"-KfjQ0!aK`";ğ3y?֓:._}w=;r!r!r!{IK[2֮]+ aeBevn[wi6MhhhåYӴ E,lbºu ߈?2JJJc&"'Nݽ{wU2lS" M(LݼyssYY … O>k4z,mnn6md?U4q'''w n%! [f`TEbD400@*޽{6o(9Y}h&MDDhlT*usvv֯iuvvٳgihh8DDb؏/_$"ՉNsh-IXOOjjj~m6Dtww# B4ȑ#իzƍN,~'AQ 0İ[j0::J8236򍍍b[['J_!|`={ & <@,C( *I] 1 `Z#~8/ftfc$@(0f3TUE ݻq1!x-[+"^gg=kqF;w x<Eq^, ZZZ`Z lt Ob:L pڎ_ 2sN|>fWDQ455aƍ(//#Iv1D\LW~?PRR<hUUaZ PPPUAT "8`azzz$hoo8,w3]v3UUnرEEE4mn7`ِ)nas|)!E,Ea2@DuPe/PZZ'O̙3xyj,뮨XY]]֭[QRR>pαeTTTb1xdd 9Y '@G+Pxn>ģGb xϼ^Ϗ,kUgwMj2(P|ҥ=ds"Jq`0HD"1;;;}]ki4J$8uVkZZZޙ<9tUғp8(`× ے{!’qaE&Ȫ۷o?33֭[G(v:nPrQ.H@%V>Ϝ;wns&fZ y llYD`f ~mۜsׯ_O꺞c"0e s1&dIohhx-7@e,wߧUzق-01 RB&I7:i9,"C?qOYguYBƲgU(߸R ;cl .lBgFK1lsJIb/r!r!/켜i2eXIfII*00nt|(1 2vvGIMP 2.10.122021:07:02 23:39:34 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((r(c[Nm}jW#  :c˧61MrC*SXWe  ho5^ɡ|?| |q{4mnB#jPwa.A >>Gm{z4:w nk#*͓c{WkMw6@m ',|e4F[g nʭ#>`x%4- m`řp6޴EQVm)bI5? h><֩]P۪ȊB#dF9˞tW>T8?ZPU6;ˆB-q4jV,q o uZO!8>Znu[4G +9r\s;@  ho5G3?%}-X.1*W|->sn pOUbh\+ItxJQӮ/%K䀭ë.ATw%S$o}Q@Q@Q@Q@P4ե F1@F$vנ|=i@QӮl";Ď*6~U#a޽K\ᅲB/[Gv|-c\i|%NZᕛqD^q> -=WJdh `G,䲞=+t / ۳4Fb1;j#Hr1dkƛv‘2apIH}B;IJ'o>Ҵ˥k{f@)ڸ WN-[X#Cr:5KxVT)'>uWW 0TԴɮVH0}ơ9ܣ޺mBKkDT ~`}M|l#;)Qnl͸;F0sˬ[*/D~!x;O&I],B=ῃ^t麧-cP}WV7o,BTW'99mGy%Vb~q+K`皯wO<.9'+ʴf=[OyWYJ= DKmf9TgO[4_C9~ ")Z@|g<{--#0@Yy.rsӶ=(+0N>R¨KDXq+ܾ1xJom5:YH :1Ts0·dAzEPEPm@m-$$K6vE}T[3mQGx7xbր+O $W (a^:4X/"joCLamPV#XojK YW`:'ր7KU Vm[`NRp 5[PxQRue9.`c#9bI :bT!ʏ/kS=Ţ*ꚤykip5~8d']rBl+翕ɺkcxe||o2<9uk/WM֏1? טz|Kՠ<9oon+ڹ268Oy͔M%XwgºJiw $o1}g]bh'Um˂rס92̀A/~kѡ5K6h%[u[Y1VlȣCҸ:yV?-|@Q@wu_s_4IlЁS܎>S^||fa e!`{W/3J6u#>lw?"+9 <7y^ż*,a9=ƟZe*%H9QҴoꗖo$` ރzuO:sbAp8w?)h:M;##\|ZfgUvPsӸ[Ə],+*Iր>}u3K]/e6;InGDD`{u(idF)ݬfd r1;Ҳ< c,L即/F>{V,"I$g " ƀ I &.59 ץg@@X?-jN D[v\s;j"O Og_zα[6 *6Ps;zu#I1>a1JQcRS@9gMҠ-Y^E`~ByU6;S72=ں.SMo&`7th\xVf]9cJץo'Pfw_хW߼c?CV"Ulg'VANU~pSZyE̥|\a?43öLڠI9:`=k*i^9@꟔?xia,˸@ eC0$gU95hJmÜZׅCiw-FApxפ [{'D O2'b9-+ᾰL͏?G5> tiYB1ںvMt,OXݔls=}~XI"JAm(^ޫ垧$ba?) ȄrXh/#ľ%VPG,p@H\OryQ崈I#!I V nȨ;PƪPEPEPKSh>%=S(-{k4)l5c!oZJ=J؋ gk_|6ȑ9׌xW7IbK !-&sP|sؼhJWF0?Al2 _\O>.b =NYdL Q,9SU|eNGX,nkھ]x^8RDX0ry]a}*++(nc'2 ó~a\Yw_Ιܸ$sO7rP~_4֭<\*+"EPs{_hƇx6Fc"PH #һ=+/V˓$Rǥ}eA6od3_3Ax/T|wD4p@('O ktv:! `Zkv#⼳IR4DD{+xRSdhL`Gd{h/ h;w- +%Y'W[¹ :$|ޣzֹ~Vb1U]:he-9=ϵp)STy 1E,ûC^?ڌ :BmHd8#7~%#H@B Orye*8284+9394QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE /%tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:07:02 23:39:34/ZtEXtexif:ImageLength48qtEXtexif:ImageWidth48HΉtEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/cursor/size_ver.license000066400000000000000000000001511416353147400232570ustar00rootroot00000000000000[license] author=Ken Vermette url=https://invent.kde.org/plasma/breeze license=LGPL vokoscreenNG-3.1.0/src/pictures/cursor/size_ver.png000066400000000000000000000216251416353147400224320ustar00rootroot00000000000000PNG  IHDR00W|iCCPicc(}=H@_S"+8dX*U(BP+`rФ!Iqq\ ~,V\uup77'E)IExwqeY〦f:1cqYƬ$;]gsyxMNv |R?Iл \\4e ٔ])HS(3w tz5qd pp){]{r?ʇ cHRMz&u0`:pQ<bKGD pHYs..*' tIME( rzTXtRaw profile type icc8S[0)g|K{ ,6vgE (ߵ_002E.=cn㦕?&bo|9esos$ړGuyH!380ډ6C`\ZeJHU[hEU& @ )VD !$$8l`Ll71?,?{ι3[@D_*2ppDP( ]Rc===sAsDŋ1H$HeD"MR~v\N!,hgD:t544ݻҥK)LNj9Ь ?H$BaPdB϶o߾e˖ɖ͟_@oixbjDuuu.yyv=#ۅ/XZ~~UVm¢EPQQr( .|xP(Pgf TUwww$%(//njq "C~\YYYz-04-%%%dY>g}1\H"8TsWXoULSSSlxxx&n+ RgeT#ePXT+{4XB]0ۡ! 9uH#O l[DĐ+1V2pb^d_GƛI$Ia7=VHƛe\v'̈36t=;6 "`J%u+%">}zUQp賘J?34H )(ɓ+ "Gj!XVVP;]u(ɶz^%kϙDa8If~<^/8$Iо^eB!*'V@<|p?)P__|>D":;::tjE.ebe+bŷo߆톪@UU.\8uƍu7o,^Xˉ(pEEE-F0AQfD*Jߟ9s9ÇE"➞twwcttxg""swU>e6mDΝ#0kBxԔb\ .sEA(P(ronkk:'σIjfԿHͺzt'O<{~JUU &n(#%pX:қ7C`Bx\ՅGZx0wE}g 7e]6ԟ}Q~YHeXIfII*00nt|(1 2vvGIMP 2.10.122021:07:02 23:40:12 6JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((Iop*,Es;G4B;{wLJȢq7~*[$fuf ]jv((((((((((((((Y AaeI 6E@|ؽK[բ3QN$l̟Rl}?XcjDTo(ǘdv2\ 5`2*s]]I0m/|+m;lB# p/^@gЯ人 AJ_n%9_ b{׃Mtj; G8LIU/OK+)m/Rff9`y|_ ^xSQX$HDĮH?)[(V)Y‡ z>=Yc(f*t<(h(((((((((((t_="Fe&b@ vWҟ|1{]n= L`<zl:`U]9 .f2r sm;@iVVUNv}5J^.-EE!rOb}k߈nm{T[pcRvOpQ} * ,cՊ( xU%VXK-n[Ԓ6@`|W$ݏ޽v#,0m/L@ 睫QDXq(V(,+`8QEQEQEQEQEQEQEQEQEQEQEցi$7TqVu{n\zs{KQ o/twzTiEe]!cq@*M7eo99Rr.@n潳SOlzD?WxJ.L$vQ@FQ¯EiA-<tiXsFAibԋI1ǵv:&kY=:4Bd `=(]O>4!+ŸfvUj_3xZtR{In]Beܪs=+??|}KMio[f]9ʎg|kxYT xVTfl9sҀ9( ( ( ( ( ( ( ( ( ( ( K}QW͵_|Aw>#ɑI9eX_6T;~P3Ztk \Vtv驷1eUNzwL2e(@xN'MU)m!UƳ6@T@?O} j]5p@5?Co,OQhozѡ0A=4u4a O^o41vQFtw $a jh(((((((((((SC_Ҽm[7RukgUmpw):xANvAY!s?OI|2I\>lB) WSMw*VpUOtQʮ.# ;##ߕFakqqC7o0x _S8)|IuöVW61ʗk)3;;)>(=N; 9%00;K9M}ktݔ9\_>^!֡Ib'P0udgH5]>IIVR8'־+˟޽ݢBR}s8?^+5"PHyUD\V]q101ڽ&*2,>sez8 Q t[:nl++0wͨ+Yڞ淅t%IB rrIjEgiyYv{VG?P(&Sos=}qUY94;9+ ( ( ( ( ( ( ( ( ( ( (-(?ׯhݷ ;B8L  lGt<|ƾv7)[$fuf ]jv (((((((((((|3+MORcYa.KQ@Q|Dҧ?0jtK68=u6m* fhÂJ.%`Xf%T68#ּ{>!Ui6y#@C,Aڝ+l$ttLր=֏Iqq$, @#$zVgkjIKuo }$|ߍ,c\h(((((((((((((r+^#{oq1;_?ơҺ-Y#y ̬NH>Q@h{k^wXi01V*;jI?hȸ:~'!tEXtexif:DateTime2021:07:02 23:40:12;tEXtexif:ImageLength48qtEXtexif:ImageWidth48HΉtEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/help/000077500000000000000000000000001416353147400175035ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/help/information.license000066400000000000000000000001611416353147400233720ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/picture/help/information.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/help/information.odg000066400000000000000000000231461416353147400225310ustar00rootroot00000000000000PKP.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKPS%Thumbnails/thumbnail.pngPNG  IHDRzAtIDATx7ap)!-҂J )!-l 2d,gH^yDz3Q7>X(>BP }@(>BP }@(>BP }@(>BP }@V??~~_} Yݵ#fv} /撆r>xw*ٿe/١=I>&_43}I>ўB$}87֤3yYJ&8"v/W0L}\.cUOzUkM>aRƓ$~lY<6NqHǣMĽSҕqMĺS#oMIL"}*éAiqQJĴFwӯO:88<֔CqL!v}1?Dpxϵk"^}s`ԇb%#ĥ=7B OĢm%}$:].~#8+x#~~|)&J$AlQ#W}q$VF͖!9m:/1}y !kuq1lsΏ%wt-c^Ї蹻 G?еD,1},A<'QK">Y!vNװX #xɼI'2v\[b057c7|b BPH}q춘rKV'gO~,>|\~m^1>?b~@(A}| }@(>vw}~+>8u0}@(>2#@אQH07}plã͏1#dyn7?0Vsnla4!a9FȗJ,N-cfYne-#D^|~/aM#!ã,qJ"Z??H]{pۦ1ãQ8dlŧ!I0وX%ێWy)f$k(}xx.$A{yi3>eT; 8N}w+2,ڧÌf2 ljym8,eTQ9\eTw?N2fq]URQݴ)t>>BP }@(>BP }@(>BP }@(>BP }@(>BP }@(>BP }@(>BP }@(>BP }@(>BP }@(>BP }@(>BP }@(> xJ#6IENDB`PKPEEmeta.xml 2020-07-26T21:34:362020-07-26T23:05:58PT1H31M22S23OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-9788PKP settings.xmlZ[s6~0}hņL6c/;FA\I__@%qۙ@,}9GG:c8.r8EĻ Mn|XvKS\Nxy.2R#^&,2 /+.Gdۑ5Fdy[jiUD GOS"<5%s䝋}R*ZU,iWG\.5ҡ~ eolυQshƑ.+t-.v{Rns3%W>uV:$aի}f2 i?@>DD/[~s ^ЮG8B&=|"o+Q3s/}\"5t*~5AW'Cnq?C@rs9L`#[O@`SŒ!|x E0%zBfHe `r0CkmYTwuIE!obM WPcˣ؝:F>"@.ślOr@.^KZkreExW)gnҕWiECM!YءU[;-'J6M1bȾӒ Ǣ/(3C,/M*n-^A*FCU עw44Au--2|\ȻYtW ㇴ޾ر_F1#;TUC;a>?y[t{LJ] &-oȐtBtdN"i$AYp QR?$=Z<Md3jTgPL)㌘3xxO?Cq~Kl;(fHo pj@$rN/A'NgXe À"YϫЄ2 k$#H&sb!i"> BK H:yx@8 Hz;>BFL ;]kHUJfo<$gE9rqsD^~t"Jz&r]LψCwjF 60[;(UNIRZ \ @6ᕂdW2m;$cdZT״Rtv;W6`7;PT7&_d8Tbw,.>vQ:Eiy QlZ( *#T/&QDǖT4֥Tw*f+3U^VyㄾkA+Q]Kc"ճ٢|ιnaDA7O` N .8/ pOBȉa }io`9gTUF`'L+6 ;::Ba+$hͅ_JlktTe1t"B v?3|scniZg)Oi=}GЮdRStpM שe:wx = |R\L|q~v^h$v^VG^7q+Lw_zh:5\H?]c_#o3,2nװm*r tW֤K& %5mh Xsr]Xq 0˜5]Dg9%,uJԁC 2+^0HV^ st{+Akr,?!GqL /: _oa9*?<$J@CHX/pKoND?F$V;Jk;$Thtw]%)(ma[ztcR'u77at ӝC#W':72ߑb g|-Ul6oOZWaQG?!,|;Q_]4a JzOx0^+plL,0FY՚ ,&~PKʪ/PKP 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֞1PKPConfigurations2/toolpanel/PKPConfigurations2/progressbar/PKPConfigurations2/images/Bitmaps/PKP'Configurations2/accelerator/current.xmlPKPKPConfigurations2/floater/PKPConfigurations2/toolbar/PKPConfigurations2/menubar/PKPConfigurations2/statusbar/PKPConfigurations2/popupmenu/PKPMETA-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 sF֚7 ):yCz zy}ZNqz B؜UiieOEoeO7۳)}ln-[XoOO;;QYꗤ,IRP"(쯱 )n[67r+IQJǣՖu/J\}y)B*wpPJ.z Df_eZU_K94%\TMZy0󨛦TMQTt!Qas凿 B .Ӌh:4$]Tf)ٚGAM]i(5gqcl)5\bOі0 JG\( ;I$C]b~n8v;Zz" Tl:ucqb 94%( m-h&6ЋPzDƄ>hAi )TQRYY'}t _M3PR=\i+\]`NI-%97YUL!hznqߥPJ=Ծ8mg|6G-194^K64^KT>49Cc<@k uQ6=gPα 姩 ==48=-Ulr&Ҍ'V98vb;,nzJɟj=糝nFWÆ= t-ҋfsGvΈχgF o(2MQWdsiQ fSWQGϫU) FzNXl(6Npk%oo6 쭶D*(UTBj-MQ-Wz1 K51WZP)m͗|e~EoO-88f H.jhz]{ Ϯ^E]:6CB@'66-pk%p\~| =SɌYeM~-@4ұ \yj;D@ ׬-4N z3%=A U)tk慣>Ya(u@1Iiw77]Ar28A#ki1p_I:yӡzP k˟CBPK -xmBꍰ5(]} JUA}0б"TU))$E/oNT`?r^oϞRȤT{S m]^CW=rOnʴ|O8+V+%5!Wi?uB>|)d85ފ B@Ѭ+KX7AYi='Jy 0qGQ >H}v`  c4v LYNPJhX닫o;ȤO|2w^R^Uq6Gu펴gVIMybv& PUd;%HPr'UOڿ4-;g>YNtldcV[ )MC_$bojB-ϟ'7YU =X~U[/s#kLٙ3 h6;S"Ckn|m]/ge<_;v:쯵fo%si>ooj>?Q6=|lEv:؜6"KvUab tnPkz 6FC9N[е$*2?IY+z bԍE[E؝e\ХZ+oGp[%7LIyZ~Rz\ Elǭ"¥52lvᢀd1:~ 5+{f=u~Dp;]{љ06 E!r==UCt߸iԂz]BltAtUYdL Jz3M޵i8^Y349PǠ^+yU?}Q߻NnBBzۀ>zl%rb5N g-?$BO7S< ;'B @صZ\4#!F㌬@G聣ezASK\so;-f<dr_?dB ;5n`\31Meѷ~X|Ǹq5[hAo L&e*,V}SIUJJ.a1 )7{;9"m0í0;T178\fik~E֣zERӸ.{u?IidfT9Y+NZ&' L;amVk6YŚWseU;pœT[cGtgz-cf= B" 8/pC_T?lr&X\ rMJp'*XN\8K3(u u c!O[VW9u%aLMiSMI8Nלxmny8-eeFBeGywo+37r0 ֽP6(eZ5iP&:0 wT>:>Td`g{-Z̨}5in}Wz(h+-W=-Zo_T?ܪ|mUa7w14&dKə*6"KɆg4oI -87Rҋ1oߧSt8_מWKPKțwUGw!mܿlmFs7Q'/mgALקԭYs85@e(َJOnf٘lկAGҼ‡w{n2 @~V[oSl{ aY=[a^_}'}RMU#뎏*M"П4 Q](O"C 555B)#V. hl[m--eV5}1r{ [6/.8%a}ȊWTDz њ;o+jzJ)5mEh4%& n1:-B k6؆+[_lek -7Q8j"{JO'Ig=ua{:A(Tdݲkt&CBc}n Z}z Զ;ҩugŞhqz1C9d-`yěT¦Nb?WFn0U>姩 '^u{/}ljIUCtGy4X ^_d44Co_uh$) <>gwMQ3FF{C5CPba2/"Ќ}t磊ܷ97*S\u= "VWU<憦kzKM*ɘ[Iiec촁1Xz ]z=/}>nd?xڜ{[ z8y#VH+ ;t$ޯ^훛ۅ.0VW7l+7GxW>${\Y=KO!'x>V`'&'ıQ}RHdK6Xm;38| :=T72&JB8qGk嘷ze(ٞ{o'C@ gijۦű1ֵjװL,p׵/4Nha|tw!@=drkb_PZ!ɜvxvj5. /7_4J'hg״Åu6G?̽d@Z\M="ϬO:\QZy&x?Z:в;dz!iZdsBN:_ggϬn>tCFS Ks+ϽwL}WB>2_`Cc֩,;8NV6%./zkiӛvU?TR#"CXYllvIjsB7VE 43س?76= Ϥ)ꖈ(/z]e:+DS%/y+!ז2럨`=C <=rV f(UVP:?>CcՃ~Z?퉸+Ȗ6#),7{~52Vy3ts+{aWB(o~7^K)4qzvόGgy~nϞZb`v'ϼCK+/˾Y)q @' ^.Z89/r>8iwi"XN @/n} d2ً>1j4փuAo̻ U/U[m9 *kLMslC7VOaId31އŗ -?~̾?h ogW BjÌ ^)ZjvG{Z}ur=DaR=|tMkfT}ECsp.1X W BO{{SU׿S*OhK~=|N-; Z?z8Yu[`Ah3B=Eg>wWwU&+'*y)y1_66DsO=6[nu80P6=,xq ;oV\挪O^(bWB:ˢm-+#g%X5Zwi]}C_5whEAT鲅|5E)lf>Zw !j)@[5iU=Lzp5 p=mg#HW.0L}FY @C?md.Yy0smqg7{永q% :Lcx:Zx(Dz𡧯'%p@X՛~6hd]:c>% nFU4-fiY#gRxQ*뛀&bkDTP]s1Wl(2Nux:ixvl >>wU V挐M3:;Ιۀ'lo-Q#%aOer8z697Q=lv_ꊎu|Vޕ?[V Eam׭%|ղg/`e==q#[O#:hý'HU @ {L߉1Ϲ q:<wLcnlc_lNtwR7PDu{MꓠtM&g5+7۳b >YqraĘlN<=-Nf׼WǪDsONӒ&\=AChU=9b>İW/MeZtgڏg?g?Z"2t:UʟQJ8==Fk$rKLx >txvL$@k37WrE0g+;>BOɵoݾJ^$1[I@d$1jvÇ`c1Pkr>zpz7Pl^On *p dުeM <g g' ϫ ZnO^4%hП(\~] C.YeO|ggfPS!uowQ࡭½ #g% +-u%7;Yu5]⦅՘~t{RtJ)oA3i1̸q.z[vm:{fɹ1pw ȈS_- Etl x|2 9qzl Z ws\ac{kl5xNOPd2lDfq˂VzއNbCҔϟ72+_޾?:lMgSmjb >;[W euxB 8ʂϔm4"@mva ԰Z)!0G!zu!ݭ7Z aTm1)zy8BO8y>elh' ҟff/@;QJؙCStl7a7fKԆd߮ <.:Tv~ {8B|{,= ev +zdˌ-e^4hx=z|,Cw7gKߪelx:PFukW#6Bor< >Ұ7.OeZ%w-NV6Нՙ&K#I(ĩPÉVi}]1Vn&ݐ}}]T؞;f.BW0St S0C |Vgp'hŽ݇Am^"g`m+I6|}c;{g]>FhC{ m7~6FL@uLӇ~ m.zxؓs8YI!|B9omig~x_#S+e konngKwy35=CwB~Ta?C6HU"D!ͭ={cV(f'?fvµC%*m {X^Zʞ,.Ǿky.OrqZԄeh}5֡b8V_`ydm,^-꒺&ɮߛ'نn޵0Bf\c3sx; T=~Wh]$Y0sQ쁧yT}t}|(;nkXL]ٗ7vpnYp"{j,>F*Z!T7PUbdlwc(Ѻ?/\f Bti3?j`NG}r793(@S]^C^4=L;tnMP[ =6g(3$]q@!oZv83 t"i??n`Ol<@'ն;/^\vKcJ.aK.OxsuR"7Y}ߑ.t-eΦw&7I!P{amQicKH>%z~1ob<@ ~p)鱊Z|•Iisdt+ٌ|l+];XoV-kI:na]u`R8vhU_V*ʡsPUwj)}U<.:q՟gȥg4Ǩ =ᵇS"PYzMzXqRf?thӁʐk/н|Y̎=z̀#w|Tі vKs:6ߏ-le˿}@eIezό\\%Gj߁;}cAkzD罹Hx/ұGJE+w>N4_O*)y1l2’1 =hsH@e|(=nѽ_fmҊT[o2BGly|\M jgkECV -aG2,a,B6\-,#!fT>$UBn^7ܢ^߾2 MnN%ƚи*)[Wգ@[t/{:$*n:?&n=6,0Ms<1=YrarkD,:6[[l}jG!=ӽ ~TR]{QO})ogyy>nGۄCh7tz ISZ; (d՞i-g`, z?>Tמ9,De9BO/n){V_`sֶuaSYQCX, dvN4^ulXWapBx;޺onxXDzxwg=Іo^%Ycx}h ʤD/Tr vj//*77ۧ|CxzmbĀ\{:BOU:^V_1h{ X| DfrƠ􍗳X^nCuaL_3غb6..' |AzyQ3=㤸oU=ar϶Y\qb=~ũlP*fjmbu߻*Z‹Z*48I+e* t\\8RB=WS+ITRƼ z_dGb/l3/ ωմ9YuK [ED !ͭ|OO'V .K( 60Ih:VSfOtҏ:T4;.4u^$Yqrꥩ Yӈuxx LsA;j7+~:ӞbU"ݪb{QzB`GyԢUw"4z?Y+'. s BJhWl:SW'\nl;eX/GJbcY!QcA;5h]Q@u}_4;M|L*~a0фkn+3=wqB,>QZyЂ'Ζ\iZK=Adr&=y#bsE P3ra޹qJ%,?U52lvEfaf@P@u/Xe8P}񘄥IZyBO哪S@_4 U[XފƊ k8QP!/Q.LD:=B־#7Α6 #8{q(f+]lkz!eV@Oۏ x-eVBY0.'†7f3,I+c*9 |.:MMR$llogKzoX~ jBϣ_<{g[N ʮuv>iv(B ܨNSY*bq%>c+j֞^f+ω7;]m Tny ҆Xn܂xDH}7Tա=<*7)G-4QKPYz4% !L*aCqwPVU{3Ufͤ @Y ܭ=a4k7l* 7@ZSKFd^$0vm[y*}( e;L:zMTGyJWuvaz'졇Vc]lCK7{H@o9I$¢ǡ*XkuT`u R{e'ȅuQl. йMTG29}{䭻8h k(js"UmOr\4Uu7$zjqu3LySxuYu,TgX4P6LUFLY#9 ,Fƀ s\9:'tnx@u].k1S6yYGDi^^p.ZS7hY&GxBukڅeXĂ2_Hw\,z^YpC%~Jd^ xs-Bg.C!W:l3e >IBԡpYY.i\4Wղóѹ8CTQ]AhHl}C;isf7%H'DZ^9d*i|bvό.#+kn)j{ĖGQ5vf0d'ȅ+쯱L1un ij(L@h#ҧOaQwk ZLJƪD:zj 23^ά"iLmi4:h@,'1z@D8m` [0.-Zxz|lĎ<(eCߔkN((nE+DGJj~+h <) l"}K6De u' =ⵍ|G)́CLѭ>Ǟ\-T=YA:dV`CRXB"I0)*P8wF/$l@ e;Ib!܄77f195lHnd.*c$Њ=ϛ Ee fQ/e nB-"Ɏro+"CsYU--<@3z?aPV*9Du33?ֵ)9rU%zhC0.Ko  Uo_}R *OߥD5c7}zh={da@4:}R֠3k-͗Җ׌GD'̟0$߷3ү)59~OU%UzၨEu*)(sZ^f}6P '&iD/i̡JvG `%$+NζM`E=&??زe&{J^
Fu#u '=Fl{h[|kOE+JەJXYHBl7NCzT!1KzomP@#TM2?gj;jJ=)f{M4oyߋ>b:.w8v߬8A^bX}鶖<Ͻ pXlPd'VPDvIZvdRZϢSr. ȶ9;6-' k- @Օc Ɖtz>"XTX :[u[[:df ,~A !4n a3ưb81Њ&fqsmm0)5/$^zN)B /]`/m5l2jp5؅N)eJA*$o)>zB.-'z<8;}=v'?U>).Zwʱzv)zl`ԝ|,ԅ} iSmV`0himZl z  Xd}$skifK՝]|LYdwe! =h=O 'm` K`"@QvF"+nr%Vͥ6V ̈U촁܅)BTw_1qC}hb8i1 [% +Z4ɓ#xdeY`3TBqb =HHB-s f̏U fNfc،N>ՕcaAաT6affO0l,zzOۙ'aZ,1! 78:t.}s3)6Ʃ)/=| 1, ӺT}!mpyfi9 9jNm绋((dn 9+4Nn_u եT4:( ݾb8I=wC.(iQ*Q:V'Ig%(͑QɡZ% Sn}e=߭=SqYy0/U/oZXn5Oo̡\A4[zbRː ~ZfkwY)\1> &Wc iR~:XH/> ) D4#׎A*aAꃩzE=M_crb+'xpڱ3ݚeNɛJ]h˭nud@erL*pvCXoeEde C/ߡwk2:6;*雨9=*:POwG@hPWCOF2(]uP)˚ʚ*Z}})&= 9&[_"8eIM nYOڟ6 i5B]K78zA|H9PktjO~&-;Ǘ8j˰?kR6,C)l4Xkp 1ĩL|DXy!K?f&)X^L;Xgg;+#y?qrk3lG?d,7Y!7K^-P;,'Iܞ{ѯ/_3heާ?I!ȠM2f&z3ݜtmҬA1졯;: JU]am.V`u-lHKeߡgSIU^?)Ccf!OVBRǭL):*Wz8&г4 <ﭱgZSTXUMVp$?Lo8`su5Lg}qon)۟BfJ/JcW٥C[L `X <ΥwWYʴsϡw;=\dIZB0:}uiɡ 3ynϡ1cr.9-q~%|].1n)1;; =;ͣx~CR;{vs?Zyzl5ס쬰9XSa{V:xf63-p>FKCϱ;a^nIHYޯ@xQ~[z =6Gu:~T4s{l,wLBj4r=\Oxޯy=egT_͎NCIə=iDujI]_MBMbh[}tCqg_e(o E'cX7Q]Lur%Sm: TJuqc{ =4ssk 'g*=MV[VHDžt{|0B=LJ{ˌs\ὕ Jâ<Cu' =אַIXnBrBpy=Ƃzk~'Joݼש無uKϠTpU7z:m{K }QzRn6q{|%BQV8\h խL8J[)id F4mٞ= UU[)k`'qup$Gu35z*[\wm%ieL[7Wi?}-T8\XO\ýYiAkk9בqhsғ>CutU#w雀es^GWڏ=' ƶ[ُjڝGGʚ,#VΆe(i1llI @dqzZh1ܺv+ ޴V{nM+ir4J +mvD͊y`6b=Ehmjb^;"a2e(kH*Yec,mzpO٫ Y*\=ol29x>и)*F@O,adw,o`6+ gT].C(F!a )k1=3E=5m d,zb7ܴywC!ʆ:.B{Cu4Qdk `l춏x@eCeD@W@@rht&bL$-߲]H<ݡ2Z}{7 MweyG@VWkGAʊ( WK=wzDKhִ De`\,S:o T[4QƒM̨S0{KOyx56+-?2^v=I弮n1ojq|ZRmC!&GK2m7 OD;j#F/E{il{TEFM90y jՒ;\֢ "ˁ:;{jp/ MW(強Г* TgS1hH:lwLhsx/@_Zj9=V(zā:[nszRX-G1܏g-Czn&Dzx_G)Cup|zuV(((p{jh'=A3VW,"> $qz 8p?{ B `s,@:" Xz$db`s>G)y>@ @ .OZx>@lV%5|h;u\!8x>@@ OYG'q?ي V'czx :==A =zY]zzz5VE9&Jp5pj2ӔuRj6cF+ 㺚g4qK{+.FֆzcdB.6Gbvxy60g Z8BOg տuoQ{@k6{+-V^PW,E/oBONވWzc|GY--=i:QԢ{ k5m|7P~⽥ 뺺:5V^/'8<,FxcY1=>{KHmN]xezj^KV"zڢEu*Q }5(P5L,3^QM_ =}j܆e+ =<pIW9$(* =Խ6:Id-=ىr-=/QYvT{7L[77?YYzT雠`KlxW'x"9IBO^H*anq۔BzQwe!<\b(k9õ8qJ̔q =Z{x=,@ $+K:3 EUa3S' =6:ar)v[m1=TNz y/F7aQFnY-=Խ{S!B@ðN[zT2r{d;\jGՏl9*RknPm o`g WvU>sKUB愡г  P9Dž}dh:ezImKyFsl*Ћu1eA2]wo JS}׎JMRsP`F95!eV0&aGu +H'F!tzlvCO-,{= TlTߘ~lnn7܊Ku0F)P_ezWC"aI-p+:^U-=1Y[nWkg7f{ 0IZyOиCb ;$l> .JB̳q9-'~gL?Ͷe[.M-"Ѻ"l+L[}[p=fBգKvG_ggM&KbQP:^J4!˯C+3ٹ47F+BRjKQJ~2!OУUJY~iVb? ?Q2df2·tzNnZy2)%KHY |䆣vW!@,0V'+mvR <*L2BA*("HPT@uukY (RD^ @H{KI;=}I=s)d,i[ і&u17MzzmN 3ZM7] z5{-Jp^"B!j#9>%IYTLvzKcԚlrgP2鹫jGcRTIְB}S۬fpv.r$'@N%Y_C}D|O+%K"C+ި5hTlTsop#!+d%犌2 itfrη󂞋dڥjL~E)2h@VsԬߓ:jPBǭ~xR\I9R|ܘH'|,WXW[h7XlvIf1\c UB6*!}[lz_kN.1=KYq`O6gvu;8ڔuͫ4Aa2"$jMu`)uy3U/"Bq!:PZ1ZUՉ+|)= $4iJKDc~Vg5qB.Q#Zk)IOVm~bC*|1ox?K)WqJC;ti,a1ZPP'WS%s_.j3N%BIz6ӱbK}(R, C;8-靪ڕ.xԘ³^b]4WIvDϰ/&]!SZ-,!X^#@3laCvTwiC&}7M;Ylv}{CטB hSp-?R s5Bs?WosSPnˤL>_(I-M3'<(^ZrW|o%=)TP!2eod ú=9( r! L(Iu{ȚJ唛&$FuviswgZ V;{Jp4ᣘFM((gR]IM_/I^^(_sJÞDcv3&. ;2!c,{7 B(pڎd rB,e6t@i! .OzRaF9B}v^fY$_<5 8( ~P 複L>MEYRn`[9aBBkL$ W&>B'lq5{ O.aBB9 ZhhζzM0\ݟJGP_HO`ܖ%Gc)B5n{ƓG1bPn -򨤇<{O_-{bKr3hWXT*r1KH$" ny8ZV!s|PnHl}9(Og{1K.sΔjˉ&Oz˃p#| VXZd*Ґ~SO\#F7Wb3Yy}C9[/E{{b9QN.uelSL,a]Qv;2#2t ('複𵷧}Ull_T-=\&v A_̑ځoS؛ɒ$HX̻yJ6v?Ġfhz:+nvYPO73ɒF˸uaaxQLPO7'r7'P/MS#MC[Kti`\_}P7N*!Ȼ:좮V;7|&tsC M!)~*!~}ъ&]殟6F f4lO306kM:-UB%)꤇о,Z8eZT3t_tsyoбh6~x (PqjsqL3o̝{l: Pk^/gkTPw$;6;sɴ f$_n4<d9p@Fl=R^(1(1G6QXߦ|ζ~-OOνY<}P8Hp5s܅:(E>5 m"˥χ2Mң <E94;TTcڙT=pO%8:.4G161Tv9*@Zt(Gۥ>_ObU;@RDJ5N-#C)?+QhX.WD/)|yOtձʑ4 pέEfTʖ F؍b1~1Z/Ԋ+K|o|pVz3qZϞHzb(P,2!h͚UÅZY>Y:+}x%rD^_CkJyZ'b\hzV!LXh-؍>s~ϟ>U?mZF ӡesĵvƤ,slC~Pܳs+^2fi1:-b81r)Ch`8[j/}jQ&}h-gk } lg+՗p&Lm=BֿuB=A'=ٗch3jU%l/o(g ENsg%JȺ3Q/*XM1ztChܿF}w| Uۢdow:S|{W {2F=P] 8ѷG\/tk) $P& _Hû2ս|ϭ-s$q+]cI5l Q<8zmީ]k~PWۢq}huЪSbȇ}P8A2ղ>lP.gO.Rk-JzHr=w_:hTEl(A.V>Φ|?8qeDe -L-BbG|J6gOUxzK橱WOxu>-|%9#¹2pεb6)zʽ񨤇{5><{.k9Shb//fKD24HGPOVb!i2p=<$fk pb'ȤDHI<|5BZ|R6dXw͈f]mUፚJ^lIgfS (RL{䑃FӄŋOpB8wGqؑ\ۑ>XX5 z;Ҋ62nAZ8Cm'J?O|sFؕ]fL|kg BNCAK;q>Yŵ՞ )LM1#?yj#Ml6,6s +b?hH D>CLz7ļk)kwϯ+6&}v2~pm,A1b/_Q8뷌{~-aܘm4h6j'-7|<>q6k?;dQ9JcKҿE{Ӕhu S hJHz.2@ZL796;HCK}?>M>]=SϵKmJOw^i[_^롇m"jb4oa_k{=i/;#yN4@koǞ p=lׅlXPCm^G zC[W%=4oդwq-kn7Ev4 @i!DHz< ֢f]Ka/pfu8ҢA׾z#)z6Hz4}DV]X O-zΆ:>ΰ攆MYYzYZBN|(R,)֊<_'5V)=W0wp {nmMb3S*xO%\l|}BOxjOe\kc܅U-uZiYHOhY}z_:񓋴릦 όzkZ‘X[BvsIwP!$>jyxyӬ_6X ϵ衭Yù+hեlqMωXcXG1ϛ~#>UWx=ZzLpCkߕ}PXIϿ1t}eyJSXT7E5V"v*Ƿa(N#IzВVm=?g+bdgLl"WдtmHzLcZ3%y8 lέ0%xJS {` nnZcpM$r)QlFs]*I/R{==# c:p+}sX]qhS%>4Sb4m$=764eͽbw˻ɾn.kJYF]5h+*؂}nN?+S?2q$=uҷj;-4vq24+蓪ڹ3SH9G#,X]*u66bQ㎶LJ)vQ GS/c|w”=-σx,}?>FHq#e#KXv΁zWo }b8yq@;g ;T1ZP`tM)C&/aSseC,q$= VUXo9[Z^' "| Ϊ:%ħ-(f#iӓ(sm-Emw슑}p B LeZ+{byIqwӥ!Qi2nAw}VnZHi>[<&uJ5 j ТD1 wISI7NOxZX ^Xž쵍h[$> $MHz\".XmVjq>ԢF,0. =m<ܹ7$E)QLGR)_ǙjkQ#F`T\ r &,qY|M|heApED1Vw΅SZԘ _{o0"lv>^[iYE=PUz~dܬ:M O-jTg?Q}i\?}%>4Xb$=MwjکÆ~vqlԄZFJn򸆽e1k( iR㔤þ6(䄧56O*a20\+?S[wZzmCPXZk'FQ2m9u?onj|^2y~\c[M^s͔k6ycP ʰAkE>̶'Kӓz|庩z_Pξ=V@=b~kwSciL>i^hج5eu׮ Jk` Hzx* d8Z\Fߡbʂ|S8YZ4hcxUVZKyYlOE :alp?Thו/s-ZcJiFfm͞iJ# BuPw$;2wLZi65I QQνDm2Fl<=lR&ro}5§Zk!B%)8VZF#|Tes.l\nJ2 l 7йC˝3r/0zu9$.oѢj"IGʼVl5n|aQCoSr=;K0ݻˢu얙cHz< Uj4/klmWo-j>X-lKk?TrwpôA!~ $=*֙wXphIaaS^yxFZʪumYŢ3nLJ_?WEIG-A@d9O,7W@[*W;0@@hcjlUjcݚF֗c5$=^ YYirR!G/* ֳzY DMR\EwRmG-A0{4i#c ! L/׳CHқ+~/5xhm1 kCqŴ#_qo7\s);|ֳ91ݖcs44r3ΚS:s$C$rw#SGj˨-Hz:m+~}ey+EREQ?ec;s}1 WeTf Q"y{آIJcyPcMCո~vuއV##;mEA5԰ĮA,j]U4;!o/b㞝/bj zhҢ^Q{ҵI>;ƠFkUl\`9Jq'FoI4=<^L2󬵞gMQߗwB d֥ 3랤!=NM"B~5I4=D<ͥV%w]ϘN*6WKFJ }wTdZ4ڂN+qHڃ&6Tr7[킝2REʨ@ [rH͆c3HLub9eoNtk`. 7顕~ c诲WTcv)4E=]h:a?԰{[)^Aܪg!d*n+wu8Z8ڄ ۂ*&HZ=[A B.Dٱ:ZrM/!Bìn^M:h+gOdCoc21E e_f'f&r^-w4**@Z܀mϤ{u}m*zfg" v$i.R>ye {W1{k {a3xr{`5+iWKg MA-\w"f{a@{oyU"6!wXv@73+EC-F=?wTr5Pz^s ,ԆP[rR }>wIx8zȟæA^А6sEC%Tv\sK` 뛪dw!l]hL-Sr+ +ʉ(e$=Et=Fc}~ʓr]P7FAnW[%בH˺')$^^?\Գb n)[ڔWt}4vaл=6XyeΏ+G42|,zkbSnK-#dsqYK rl}=|8ܯKL4 3 M1̏#9gIQHz5''=Ճ-ϝ[aJHOۿJ 7AzXzJдCrn12n<4=ڸ#;o䦔5p+#ׅބ] "Ęҫ- !y'L|{(I@Z޶o^236([՜3K s:r.VnV2)sdt̻kᳫ2K 7w&W\U)|,F}sH̫r%Hz衸gv Y6iG/:k)OTFޢYAvZ 6JRYZ%JY3G2c߰Pm#WTA 2339998~m{G#7ZBhO1GM!^y%HzΨ8bZJ`65<I}YPjR1 Ԍiob"HJdYG 4VQ/Υ 3+ոw] lb[gP[]jL޿I*fyeJ@P1O#;zim_-{SWfI(g`N+b1Vs$H!`P?7>q8~y1XʕkY}QLN$eϷ TښQ4a/Y()@Fɂ%N3|fkwnw%mgPEbt|Sw$B):^sLÔRSH}B$FՍ~G4`3ƭs5ٹ,z%D;h>^QuuLhst\5 :&*tI85.oxل)|Dm@]jbuIdf/Az/Wc^4k_Y+J'h!:{RG`çz^@Wc1S $=K8=|ga~w~-zLc C0pC6T/Γÿ(@G3wG~Dg|m^)MצU}'Q7ؽ8gs#?PkP+I5^ʹ"潵{J'{L/Z I-H[xcY{/Y*I j O?sOG/xu3SO F7#*#)#CcHkBePIxjܖNh6Qo%oI~h1?њ&;F*2qIxNyd=$=ϫGI(`)<ڂJa ZSE!fc%/1 O>8O̤~@!_S; u i"> [b_E*֒YE5(!sEVP狍-i#*5Hh -uwSz:;|ިg􋜳`O<}:_V(8Ƞn6U✐k{L.1.FƔVwckFsxzD|>oZx wUg3"f6p㌾s ؆Iܝ %@xbUKf|=7B-t)`& p#jt玎>{H+4_l4 `i^^9/Ƞ"(f@p/b2ս.Dp.oJ gWcqs:W;+lAT.@38Q_l=e.\io1prݱ6]ݡe#& [hzl Hz \%)Y_`u/zX?zc h;T5P_.<1x5B~6 jv1wttJ|hO|\sio1 U8WQW=SLH[L %>(y@!Q4=t 뛃xf9gEH1$=`*i+p㺆~!I1quIxCOw@,$){h/J~֝z첮;VE 3[%z]5]:Jth,F`B+gӊTtfs5: g(+VO] hi`4^%%(L>.ۛ@+0gRQJ J -B$ɀ6 -p>b#[$=nGo+v:/2Pώ껶Wul0.wTRzub($=BiletПˌIrI{K·r]rʌQRvLLyssÝiJH@U(N;w}Wtzxޘ|,l'h 2JI\~T;Z.ȐvBm6rNpmb,T~MZ?nQȠոQBHz(vWڿd(ԘYlL*1p42SRA) QсBڣ-5B"R~EmI$=P3th !ZHRW*M4Js37Z5;>Xz%&HV(-]hr5 I!!ϢFGkU4R%V.Q["wUzkP\ӯgJtR9X) VJ*ĕA*}I mIWIJdy~r5? ,rSGIENDB`vokoscreenNG-3.1.0/src/pictures/linux.license000066400000000000000000000003471416353147400212620ustar00rootroot00000000000000[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.1.0/src/pictures/linux.png000066400000000000000000000313171416353147400204250ustar00rootroot00000000000000PNG  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?3FWD8pWw@(2uZl0Al@ 3hs&{c@D*P  Pht3!OWP8S#VյHgÅp$˒ TŇ- 3UQ[U:PV3jW԰Ell @ 1B@5@D$ۡoAƿ*D JHN@fCADTU"U+ W NA o[mDZXآDUQsr[pe00 *@øۋxQxw-| nm6-B{zd7O TU1B?OD&ۏ*s;6";|#wWXb:A=_(`lbfn1 H;RJPhSw \DGv msf}fn .rȤ@5^$oS c |L_9xy?քpEo;U2l`u%lY(KK̏h<8xy39P|# 6(J cyzrE58bca cq'! xEPhT~wD  aAPUax c {6\ ߂`,@؏xIT9xٓ?j!|~ W`-JL%V'8u_gK+ Q!]ZOQEs2  #C鹜e }@bcs} [hsD$?}d}#O Qp@^Ps 3ayt[w_УZj :DPzh`}>APH<iC tLkNA`b031(,cdj>=E5خ/qu\?4O]81F??U?ˏf|0~6¸ _ҿ{b+ TUJ]rt:ՠD9R&2t}0c\D#6` X7~3ph<1ÄXcyz" B  o*W/E_] 0Ƣk{}9>+EPQAzlvw=m ]|EcusPg0n>%02pYԅA]F110lk<}\=4֏cA= EM@?]_Ѽ+T#Kw*UĆqtt_~Gxʻދaq|\Q*q,^Ŧ'_lvADџ `"e"qV"kuY^6`4#% " AD{ElvV1 QEPb f۰}w;h7^aNOWt ?^APN(~-1LUUDo{ _|5}S)ZEI;邬w]ڶrúu qOJIё<*rS^P9iFꏄ aVϡ!<[U>I`^ 1C(%pP45eY3jJ# LD5@@0$}ߺyu?W|G(G?H߀귊Ȍ+җ_}ʻ/g !A?no^z/rѕǝ7鞒=SmTA R3oT ogSDl;8Ay0Y( EQbq|jqA~M,n.)@"?y w= |'ߡ0qrvwv)Dڇmj.4] % r&eMKב-$b1OY{2?3Hi AD~D(U 0`QYjYp6>n lAd4;;@w3T)IPbY335\jg. Π Kd!ã;f48>D^6m@E0 /#J(X,C]0a0>`mg'[#^_gLJ/_"W|G 7*BbwW՝߻狣l zrDD%)3iC!)R(%yY;,fp 9}C;+!oՐ!Gd1)3˄1 ( a u !|pDqN*T̄Y`gxmO? &hyHH"z~wKww(ZVKs{ܛ .랮wz !XS 3<> 19Ǩ CjhQբEJ.?Lؓb H&(…3 Ƭ4 `)`-qd f"BPEIN0N 8xߥDAB1~'V|G~@G=~o跉ʇDrĝwby+Umz_7͓]Q9{ʯ9ƀd}HD:JXBYƲlY;Ǖ=?̪.* YL[M${{-)a`fBѣ0tᰜ/ BPp^XԴ9g8&0֢Z3vmGd@p 6/'~tv*?D௚Tw";kiZݻ /^|;>;-ċ]랬f{@ŒKiz/4Z0ZF]^Μ s(Ѽy0D?erAg1Liۿ4ǀjndTQҠtkhdBINEY->v" $V mO|k[xU& BYkhzO{ŗwqoh{\'׻^T%⠔Dq' j.)5emڝ/+9S ȟ yn$% iAY0x>C߀vS frve5 q+l[qǰEv@(!GOG>}}jD~G;M_"_ODsq‹/_|=>=EevOֻz;Jʱ! y(4c㍊o Q /jk=YfQ;.,19Xr@jf}hO4bthtUd,=>( G 0)(:xCB@wg7pJϼC[/'p0_{v_CkT!ZP^y׻_͖Z+P`nd۶&qZ3O?%A^ 1%bf0¬|qN[& ˪˙5 *GBCğenRy1 ћoP4$u\&hPƼd8Mq/9:0&~ d, XWCC HO!}^?l+L#?Dm%ꈉ J[MDJ%1Jy'E*ʂi9+xQ\9CD\;x^/Ո/T8z1lI/B Cb4Dpq0@*_cg+gc{1{Uk4 "X _ ɗ|E%o[cU]\UJQ9f9NJƈaJ_Vu_^}YbSm}nz &u:d\c97=ȇQ!ʬ4+1&jǭ5: ?҉LӁ:X=@}4bxN.B!+lJ`Ҟ8E ! DD.0u jl0VB{볇G~oA}"X_>\ rY\Zͻo)g~{ UT>[Z~oy܀*{Uw\񓹲y|op.eY¹EYl>JV+,+],:ϵ*ւ( #Y\ճs^U}nU^793)wU%@|6V{8 A2pi B"?BѺO`-}eGD<0 ^?=NEhʂp)B"Hނ\s&1+FQXX/8"Bxo` OKl~Yd3Ea3_0O_?y 7٬`v!Ⱥiˢ0Pg?1;rYGKFZkfSL B]UV' gp-uvtt׳:TUʪ(ZN:1 0>]lwC/"i׀Xɗ7ט {W":`&vz1/m$3w2_h}&'^n04CL:g$+13 46H}rg_ke\8Y8;-]]G~?7~>;-T[JK{Z,s( {z@. "\|w]Ϳ;>HE=RsG/X0SKde]}wH7?h)DxDX".Y_n?} p jEUAU-9,uVzt|n߹ܽ޽W#o q """nj ^h{η]ݶnׇ6H,t`yKΠ$q͎w1F'f* CX"$ i*6g5A᧑~?qg1a)7fuY `rљ "xaq- xiD띇a`Yf`rYwvm~߁CbT͏RWگ۷9 Bs5B'4 Lj勵D̬_!- )sKG~wW]xчq^Lur)Pೀ~soĬA vLU9 }nK/uwU_R:4:$PC>xQ **"AEzQ"AJ*^DB!R1TD~M? Y2F*Jx8L 2T9z˒x ÇdAt?;0Rx Sj{ (@ =Nؔ !?#wgͪ5sx $Gb,TW⃪x}1z"WDcߞ\|[<=V1Z­;w^_ye f !$ "}w}v}Z^!D7B|8kc;,\??Y$_ ;9 ( vb(]U\f(s~p|ۭ#eF71$EIxPC0 &Ҵ!b3m'-_Z, ;@۝9Ħf=(}_M?V+x߰bZ4cX=l I"|5!"$U~f:K?OF48ˀΓ" ]g{9.Q] b!-"+UL_yŗ^nОu= :$m׭tt}u]EyvΤuΈ|tp1 ~F*N4::*(!Pnq )ăY"- sa1ݗ>CsPffL4CaY 7_b> P04< h0$b1W0Ln"MpZ6pU菎vM<H)qb qm_}웗ꛭ_K*]Y- \N1AׅZDjU#{SVDE`mEt 9ܾ9qzσ/0֚ CPx/qe%lnEõejһw_}ſvfD$Ҷow_nmC/Jo&^SGw:-n"%=ʍ3t0l9b_co)Q f!o:~{gC*πCo2 @ l(oTZӃ~it!NKN.j1K-B @|G~_ןտ9jTnWX.p|(6qB2A&`V2 E{/‡ŧЮo3|1+׷NOWo!79Ljܾ=Y=!mPM%Q nEPױ{4O vhB*=FU9p~>j0P `* xZ X$"Y /^};ƒ^UUj$x}>Hl;hz轴"*-s:A#Y&5iքg>EۆOv*ճ3d3pXtY, c>ATc&q'A@:44x Ώ; 7ݤLhKUA8?*b>,@0.NY1vs<c{P@-@/ ^?@?`o{?_>AS(P,i|QD.7&M,XA$ 6 K:c |xbn.¾3[m>/q oaf"k e9|VARnߙch@& Ajż89q~^auT "I6n-^ =A5;k>+|vvRXCʤN]ۦyz4ݥW J;vF/cgc9uF@W#K/ ǥ nZӍ)lKT#8 8&SXTnrQr˲cSZCe8f6ZrfD•K$ABG˹8"79οjF/ѷϯ{ H/UR/zLrΎ xG 0pt(qr.v퓟o@xx틡oX.U"<q KptTC5$WEN^U‚ap gg `L\/˘lM +vjU`X, #> -a&0+% wK//'g@Jxsxo@" PC:͙ƈ4%Aa ']lw &hHꃀ  Xawr76J5wx//d &!->*ZQGvJ%,jf>Gw} ] "w?fn^|ekDv,NV8urf`SZ|v0r-=Ra[rX(|Y O!*pRo߆Gи{߰$>V0o@s M2ӓd&XJk.`b jQ8-um/޷xx?C+O=| @UU]嗀SXg:dzVfK!lJ -`1FT=(0TJ1';eq`.+As 1 fׂWWm[WXf5nݾwĄ$֗\CbgKܯq5@B1jc”30ʙ^BkKEciVE/2C"R8Xc:Zd.T(-aG7 }!h;Sp+T[D_^ zP78;=n6bQ{xNNNPV%Bhn n{1, '@C4<0Ty eK~(#3ISw33uaW, K\C 6MDUSՁ ghD4^ mע̃2Tda<;"w o$^N v=Ly70)`m@XK8Z84rSa_b밷XK1>3=P]Xj现Xy}EqcS~[@UP'X_E]K﯆[*lgP b]ZF-> >myPfx;^; FpqqW5 `b/(4(`賶+8k"0Q,٪pfVX9õ5TFa,̩#2MxNB ]ׇ A*g'u\ ҇vA6Hv~Mh6LQ9Ώ݄!F#KYzMM 1pB#&{J/ZewLahfѴ!6E^v]0SX-.0 s__P{˿`RĥDt%AUjfs$MWeT-,/bV?s] +{(<=QWXk۟okuO..=sUpvzw,u h-5v8@@@P CixJ$z At:MLWG_C AYZSTKkjk2 !"jܩCh6m :+f(a~냴Dðg-zH̳^~SށR0|j/cBm3PYePH TCuabg(g+r@ V gH3[78=BK|#(2]*(N='~ xjXDUo~Yu]@8S..Z<~m Y[q=,sXk!m`Fw@*JD _0#>bQ6, ʃb>UUK"Tj&Ee Y[C6)(ࣩ#%ԝK"t^mKyi>;3⬮qhu~mZz3!qWLP?̌'4vQ5.y?!!Fs/L'4O/{ٯPT yb^;\m</M11 cfcGؼaG"|X,GY}RQY kqbLwh("I+b f3ֲ")rd d L0U E0b>_/aM@  KbNNNn?|߾u7fwXkωx[EvFE]JUd)ag3,sEwnz E;7Db?f(@~X`hڀ뀫3PUu 9HH;nY'c]ZyS1KA*{mߗUUЂ5kYðT*Bp Bm5`TZ/hH/A@#^JI`]iklԎOitUCۮZ,* 'uN˜. h/db7s djRn`4UЁ9(7';Q4 Y?JЍ%+*g 1ƽfsY$\Jx>0/xWKGGG[,wνH1W* BU0֥3A*;oيA7PAD0ƦAj B!5T"X|uExx`Lzn9GYWY*H@nk7 y΀UT HbjD,KCp*">XcYU&0na~STUim^Rҧ=187Qa5ui g2rU (\%Jcx>фmJd 20\?^#2Ǔ' ?ڦVH[qmElM1Fnk7e&ǫ\ H@ 2__n|>`Qef'}%{e)58~y; W@U h!r|@d/OdwTd1B2y=᳡kAcArBx |<u'8==s*_=|C<{xM]סm }GW8)MQҲg"a"U@@l l]0ٖ[א)bl[aT)fکr}<;N E88U,93U" *#L`%͍4?=e'rх@{@؏gh{{A9^>u/&I=3 &1S% aBUT`+>~o`+,BQ8jW. = :U`oow?X,92>@;PsD!` CaK!vJQ&*?:]I WаC 0>t 's ?ޢ<2rrazi< !MnCwڧ%kQ" ")xCLj7mzfmYWTgBBgĹt BI0@4*+ grꊾu~naqvONGD.T xvSGp %Rv]4 j1l^[HeZ81z׻~SDu,QUl@]!`2i0(&Ohbӵ"o~,(A¤v #j`ټƬ*؝طż:bgvX7l6\o6Q; * CDX1ֺ(ʶr/g/bMYwT;QD2 G@h1AHVŗXJaҬ0p+Hzk{ F.F2N.gh^:VojBs10&Y}#?6;o<kL}wiJ c02QLRpD2ZE5GQo", EAtx7X$pΝCeYxQ5qvvcf3X[iȍ i8~q(Or1L\c7'fbؑFJ{zE:g0_T8>Z*+0Y(y]CnbO~k0{B# `TI{|FQ(:m 9N8&Grj5fbEbÇq=a>GN0ZJp,CԂsOryޏ\]50T[~-VBG>n"nخ7PQ=KEBlN{2b>/0\U˦|uE7/t[ՋDD+5O%8!fs8a(+#aT0L+ͮ r1|C1yQv $3PsT0Im7u<@ecj?t>$7> iZp090m2xoO#5\QL# XN/WUnk+ fǸ>߿lk$1qLǞk{oV޸}+OT#h\'7V'iZ\[ yXc\.\.aGu0(,D](Pɭ3g|ni1eytv:}iQ(J_֘"@g} lRLEC9 UJ?T-:@ "!V&@T@JR<%Kd kxQ״PE|uׇK[hK{d@~ הTMq>|OUx0iUeLdáƤtq(4M#H|.  EY*!H\a\>&RDP%pcZ gLD#ܻDp:ݐCcB4&"؄ͶzVc1_abÂ!|;)ʢ[gkcaR0pt|>+,P8kcR+31*ҏ۸f=BQC:N! T)CH I(z1}㉀,`1]_Rlj۞rh EAW u>D(K1 0)b xgx_!~oRJ >Q`$H}Ky4 D dH!ٹ"H$M)HJc!3\0k @~'vAՉWFS~|@X"pk=vx`N+/e (kh;̂Q0}(^?{k|4l\â *'o8 kjaEUUX,b(ཟ JV.=cP*sƘrl]yћٕݘ2lA5`{+kN]ۣi|-DʲC\2h4"_-"òNEv.7 @$)D#M&$PrP Д!&e:cŒM6w]wְW^4dr?ŝsTM{Yd0 2D?cr)[af% qZg ưqBq}Pk8<`Ć)!1uY —0Xc*1gB; SC ?|~y#c{z{?dR1GZt.|:R1\üǢa̔ Q IY(KG-A@=2b( 0I`|@d M>Uc|,i'ktW@J`$`~BW?JI(n:x b?u=7>d49~4ac`8$XPMQA;7lPe3DDzkS}%]nap9v3?gTu=B"ݗg˅7\Pdx9ޯPs,Ƹ;[D9tct02 y"gKtH4+Ra"M?IPV3Qi8Z, `eё;Yű`B=ʭxЃ! /ݼ=4WT\.4j Mpmɑ&HczO]Kf<x^׾Y̟9|~H_rI?_y*!D_$PFPR:p9]Kjò5C,1B@F\WDLznCaLHwĩ}/[ bҔ"ڊRL $2>r1aReua\YŠ1p!FGzY<hF5ݓu: z9}\3l ߲eQ<὇~@ocR'o͘9Vh4q|Tqח{RZy!0GR [FF'p S(zfNtG@7Q@E5B!Pe0,/$0v tiR b$'/Օcg ~q=*Z;Rf$&_>M>WkW|Ͼrazt8l`y?ӳ4#ͤ;p(orڨjGzm] f\<fl+#RSD@Ih'b;$mkE{ǘy".i踦)p(~0+Pu0s*8vEs(LUGXOD ]<@,Z‰Y :& NK4KɃ 6\`S=q^xOj=gGF '{]*޾kGO_w >F{KY[4lMj{ok9l!h0D@u @!xﯬڥئinѶ-ڶ}nwwM5gŐQU}D$ uӶg$2hw[E7&0ȝ]cɆiΪP iSfky&:D<4$# OZFc؄ z>@h~ bHMU30{&ťyӎ]A"MIAv)).ASn@[jQ&pŢ!fyUd@%8xY깧Vnc=.HOd MG{l*P-hә>7& "uQ٦t4oU߲vm۶-5kr.Ns.iz 2 b".]5M45yK5?##pAUQ΍?D.'3(l`bBM"x?&Y0`;N+@%h.!ևSE{u/řCo|aAl"I2T%iG0$!Γ`^pBID%h/Jh{)i0>E۳أNΌn<20͎χOQo.qx`e-Rf\=f3WWW˲TUUmi7=UUa)A&q-bS< iD'Wy DxP~Kӈfp M?FQdifh8]_{k],VKgX,xc40*b(40#ĝ?hjȠsLCFIU((ĤJu_ 3+G @- ,Lqt|*5LNd>)(IђdO0`Mdƾ|nV-ǏBQY.Z.{D f})=cvm(84-岆.e d$P@GՐ3ٙ ]GPvY=(u" 0v+u(X%^ӝF$Ic}z?£7{v۠-V t\7}/Qtֈ'F0{kA#]R&ݘ$brq'4E:!7,T W@{Y YHQ b*iР8s ZOxf@V nLZ 時yzy#† k8L>֐dh`iA=`GF 9B2h4&]a6h,dbCUA=ffuvȄvX;Lαv-izt|ueoggכn}n XGsK񗉟;̭Pfg\3M5EF&A .@HD>D,r99I&M2!?L}D8b'2zIE넒 hF|DsQs?V!@(!m݂rJwCm2+pKzIo߾]V[\23F۶f{0F#'qJN#xM]t"{f geU~0f~c@}@1JOI+ZTEA`Tn7Ls3i!TF1+g5Eh\A;)wtBjZ^>~|y~mk^fN62yC}Y1YLN)N9wE %f&H-; hh@y\Q",AR*#OU S'½P~'@^2QOz{O}3O2x}`f+5y|8D&2#c'x~| A!Eca!q OڶA6C$>%З<}1[q]eRO)!(ƽ 4A{ܠ @DLt]w]Xcq*Р{/lBmLDl}UPe(B]Q) ak@"!Ď?yݧX XqmT!c"6T֚Ps3L@HDZCJ[)J{ޏGpK㼟Ajd0ax#cV 8 0(!5P Cu*Ч P2xOVf[.,2q6M }J?bm@1p.)QLG.*wrcut g;~ n2.csn6 42? cprzwzMCH LZu?^W^奟b.x}|r>>;+ ``^zoz/'k";?A/;ס*CTeyaѶMf 1+N(Bׇ-ΰq ܛ+%^6/8y91j#c_sLsPvH K;߉e6BW hw f)xOٗ3?3m6#vҌ#0c]g_8/ =K C°CWC\]A,g'g`ef59_?OFUaMV׸NƸ-bɲ5%DZhJʼn^zͺ%>Ul+t"-1$خ딣بFD}诛拶,`fbf(i6۔R4LST h۶'gPVu>h{};آE*-35NxqM0=J|N'hpoVN ?['(q xxH3 LSh5v&&.ڏ[V^|fOԟ|{rEnc#h4܎i)GuG}aDFހ p1V ")$E= e1PUM?\1*<>'{?4r= 7-Ds "x)n4!7zXk &dN[lͱ}l7vVͶU=u)j[AP U_$KL$z K{kwk-u]P3.·VQw[4EvN5&%%'T㙴 mIIAQ\EyW SjR29o3n7?YP6}@ۏ5m]ZJ; Svsfs?M\E?: *E aM7須$'*@ N>r"|X+|U$0AQ ĎqFLb`cZ"ZT(^zjZcvPEPVE("ͮ9kv*afDGq̖U4OJt:Y C\ )EvҢ] ">xDov>27eC~7Ž @h: p&nM:.1L$ /O|TfEQ2 ¨j `%v׍c{BoY:tmyx7Z!s1_]d1] -TW ڠ"nסihU9KXSabQsUulZ늫,(X** =9,Ι(cll5dujT6iCč!BF{ >y$#A+U~׌ƖeXCv:V) :DD["c<}擧3ki W'.K6i& Fs~`캠Jk`<+6MmĹSpi@,竪UU-scPgaQ\CMW(@y\]my\_GϧͽT5a1qT,bڅX=]%aVuόb6,CbƋ6F}[ ڧ>ox ot}B"y"z|mvMQiG]58-e!#sy,Lw|@L}o[!_47PgUDFEz/;נQUSabt;R$}z%3Of,b>3-2ZwfiaLF:#f-(b^X_o("&ޤL=x c<\O*+Ŭ%Oe[0X[Å>baR UsjFjEI8=::}qYO겾xm]AD<9ccaM0LLd2 !1U7il|VA/Zk^xݾhY-sXkX,]]\mtM笙4GFfDv4,9SVbmzC,``s S72 z*2%gRD>P+"Da ҡ qWX__{2R-)|%o&=;=;Xx- ])MrC܈TF Abon3=i$}vz#Ja" x3Z8>>=,j,]@G31RcG 5b#`Ψ۫"JEUlu >< TDXCKcZ(TcBQHˎ@8%+;l $K=1q)I9L#3><0M2seF>"/8OOa zhZ:N*X XN)3$x.p}g?.#>O5^u=v7jD.)zg0c:CZ4[a}mAk[l}42Iq}Hl^i^瀲PXG)g>VG'xǫ!l`"}>rY65>Q'Mϒc>DPT="* }]oUBÐ\%"@IP!"G#" 4FtmI֎닺./`vƘ]\!"TUU,>{^>nm1Iu TxQhTiOvH˳4RGF۰ -?w8b{wG{Yf XpuR3tԵ>%?%=J>}$"o0="*#F4l6J; * Ң ڶj4ub1 k]48C/kU %!Xbk8>zms5sILkv>c%iuŰ0Eᔍ#8[4F EClG0[2kS<3V"*A@f 9#˄‘3y>2`1κS}-OL<3 Ō)>p^7) q]65mĽJ׻>u p2/p(AHfװx$]ŽO!_ [nm3!HBx#:3( 8E Lt@ E{l"xoc9Ǡk{v=DEwMġ"l`k}o{ϩz|[@{0_kʊEzǧ)H bQH¡ڰCѿz`I>!;;w6g H5+(Z4Ջ0sM旙 %igY_*Z-T:e="f 8hLtD1D09.~}hNbR8y.z.`89H!E>G;yTT͑3D!2f]uِhE -U_;梪JQ2~h"xAbC Akx*ybhi -ha 'PF fPM˲gr)ND;z-sUWb+y.K+ {( Jh;FZ)^GĪXO W܃ZPNzO% ZS3(Sj:p݂Er'p.5`IKM̊pQ2eWL6;;ٹ^/]V><'S::ݠW f8ס|j~3",Kx1[Kcp:!R3]T4 tUEZ DbQ;Ȳ.}8mV1 sVE\5T@zNu$3ĆTŠ˨MmDׁ@r+27`y-/0c]a54 $ApqyjF0$t:Ͽ?P ( 1)F Np||Ux+'sBR2$Ye~L̪\A0EdUSHTIe+)[-{f3-7/ IDATvjl7<4_,a6X^Z}䥷d9b>)l^hR;/~SZ,XcP^1?*5EU *qJl?TIx$k@s5NU90~RG\'9v4^D0ZlFL(`;09C>ۏEP_ {bQNҽl 1089 6:-( (Aco61ͰX0DȲ$2 W* /,0>d+pp81IY%{oo!=ѝ,kYf$ ؁l t:$i ,%g;Ľ{O&PX*60akYhcOWtu0[Xc 5Pd 0X,),5 U2/PMw&4fw|M:cc=Qu3GgfYuLʁ^?ʢUUh\% QVQs=iQ`/ 痋;.{ۻ^tM|ڛf<i|reqTR%I; ,o"/D!1d9D\C_m  0TګC@uCZT{kRU=sѢ=^Lr̖%EP">ޣ}l:e!Lgx-ܾuڡqy/=c7x[{DngYrlUU,]!MME`6[GG`KE2 U)89`IwY&P 㼫<5@J"5וpƈfI4ۂ{zqKDdȚh/BPŔJ8Lc d@xnlip)9ee,gqt3]KT/AHhUwEAZZDXJ<8UL @DRK %ePY QY_$L4$8řQ'݈"w';)<2xG88<\__>NdSkDtZ2nU̻yt%f|.\nI"E>By{a%y^bq U.Pr&}3`f^Nswo_~>^m 3w&ȘD|4\/8IgYw$yH# &\u=Km0ՏjKp4hiܪY&]EZFㄌfa7@JD3"8F{DG2_aj0? 5@D*YmnUˬD`cUuWx̏>el bxOG'D|׆CVUrAe,NN'༈NK'>/]Z:wХW)jE#yO_!k%QE ƶbQd]%y(zzob9}>1{ۅwswsc/akAQz/#*K 'f7#@IcJԆJ4z2F\t4GU4҈ ǫQp"+;Mo%5"v9g82{|r9zaf  E<#1oc3kRT QP*¦PL(CET jS(: @۹bQHWupjIg4\R^DkPΨ_O~S<(8+ C941HhjHaCaE@?qUjx/P^z^RgQԣIѰ+t8"@'1taO7v$&44w71C%Ȧ k~So'eY_>$1[̴MD)D4f"bs^KX*\3"ȃP[t@g)@칪?OM37Uf i{OwnI'ܾu??X^pE;R-=y?Յ U-I JZ8/sWs$Rab"W D 06@(U}U!2 juy~_&0 '6iKУc)%1 zLa6t^Tצ)/ L&\. :99h8^Nik1 AվR2ODu.%%TKU-Z@vEN$/,}AI꣟\ubUNPy32X3 ͯU+ #p_t`%”4SU '7 c Kk5b0g UC."Ep* /EC鄼*گVhcC5H*J^2;taOۣ.Rd:{{ؽ{]0Nnx\`V$֟o?[gcKZ.Qj7_&1f|GRXIhӍu={,_|I|!w96 ˃:(T  aM2&_"2)D煻;Y7ey8j01Jq8r劺[!cP;pX4PuEY/_ZAMg"f]!|d&Uǚ)1üDp^i/ƬYU+_VUr^tB[Ms̐:) 1&kwWq3 ~O~'wtFܸq L_9'@A^sA*)t]+r]PU@aa< :ܻz]z}F#lomaccNY!KS$ErXav0 r7wKzi^"L2u&:@Jƽ:֢0VNRjWa;j' t(˲.0-A?: Fv:$4I`ZdA&v2JRYC3 ty 8:!]a-hJxq(PTeTU:5"&-54OTTr"~+cEJFƵhJp,܈x(bZD"; Yҕ3C٧~ǂƓ9nܼ7a|x>!_!韻V\xMy?} #U2]OÏ2CD*Dv8*v nz0 T1DW(Lz%b [$!7Tį cEX%B_αFDv"7kչՉL=V5lȸ9(P+T1D$GRjTC.E, YBlʙ!]Ұ0Y V3(G))UeB%z9SUt0mU:EQ$U֚PefNiuۧtJ'4ON#$iÉ4+F cwҊHj REAVvYk]|fK =[,q{g_ݻ71;>@b  _e*䭺&v=Uavpt|B{lnpƂeSAW– F(W9nMIO`2<3QF BL]NJj{*_Ӆ*>HduOTuJW]IUiV-Dhyf؇΍&( ]!_z?0c<3~ULa!Q<= EY1ŷEށͿ7VMґ!˲>:>eRF#U}PIz8fyqtSQՊϏz)QO}ZuU?o4Q!~hW~@5w(*.rc\=>H3tdӸ5X$|vg<726O)M,('z_}K ~= <+'~gSg2r[[x٧+~CanQ%D=< eM,%tD(wµv8"xզSׅ w;j #/D1oߘW8<̿:P?5O}ӗD䨗##z  yB)DhLgSO>^7xᙧ+>(Zt]D:EQt:zҴk$ (^T0u+#TWDV,> LYCQt5P$+#4B}Ъ'z"v>|nd.ni(Id=v^~܂/@U"R": +~Og~񓻕h _~ tNђW kNc* MY[X3HBJ҉/R\9U}UhT,X ^JP&ZZN i>ʑB| Qp7O~]r.9pag }}7G.A:ĆiœO<&G(LQ i~QO<ވ Wd-9' FUE ;ȲIX"dfe >+[M'~(:t{ͪ^ۃbO5d #*%SGxnZZĊ7P)JH5D:5̜[+Cй5sfNj ,K wvvqx߆89?Om@޵x-{ L A L&Ҫ&Iھe2t"/ jOxD+L @Ă2za:zP 6;!!BӬ7 UBN(<5_\\7߱d5+ \~ < D~1o)O~-#] =(`]DzeYt:%u]iGMCMnh*USUJ?ǓW>HAFk~r`)p*X9S]AopJ{ HnHM̉1߱9 }C{y{},3 ̖wk7nW_W_=j+ha;߹N1~uz<Gʄ{D>O8>e^bssK:Z XY~/4,w\t"U@ün_4|9uz: n'yUlԡf5ܬ_+Ow^B0S0 kZ %0 a2/xW O"6"Np~|~A???86lH7/ LpeINtZC N2waD0LUp}7t^@a >* PJܳM\az/L,&p7왵O.o 항95NB8'x5~5ܿsQCi@D3<3g?N3~u3G>s"%]!`("X,ۣtHFÁCqc8wA7֦ТnYx/qͼ> ĩsRR0bRDbѱnA`Tw%TOP_p^Z65H=za=|f`G]f 'a-/޸sO=,s{*&GQƛA 7ySO>Z=/?>?2%m%ݢ(x2`\M2Ue")d҄Ę.l&MM,̡2/$Bvڈj:4,?WP%UcL/fMz/5gzf?O/oYIRgK\}^y%{&#b b3{":$9ϝShRJ0]&",HۥCdYAN[i/Mzz?vR1LyAD '}MZ9𸉸q׻ONW7A^]{U+a"ص^fo G.nd_O$îe 'a x }-<՗gL!|7%go|ǿ? ]0-@6):tɘf{9>5H2YI'14]k٦mjMIl͒,&6hI%J^%*"!2A^nDxw13qbdi84YevkMέuf?O.ľz;!bB'7p5ڹy@|L C"k'/b̳'~o[MJśK6}JQ⅍1v+W.Q˖ 99yu^{Q)ŢplYg+Kfˢ\ΫWU%2|\P$MrUUC`&άԘnfmQ7Nbp$aJ,`8 =;qvn^],9e2_BVspONǿ{ohoY%w/g#2?^r `0@,M(DՐp*yy^—,{u^+O}J;J@ ZL侍Y6Yc;֘NfMkͨA'a'PUs"wNbtܾuvot q1= s?wl:LTo@f)zGCؤK.C}tF4IH0,P'ETGTHE ' G" NAZ6LA ˜$̙1XLDd&S[ݹZ(q)عv޽;trte#s+(*<0|7wͩDZ_O) V5}ǹX C=>\0ze$Y4I$!2Qly)U /R:]TTš̏@a30[CXCd:S΅[YXw<:w0Q cs;P<7'~}hAZ3!UKg$M sڹ{O_x,up?{l9#t3c-p)иCDl8&^@hZ$Jǻ  sRcpov9/KEEC#Ips8D9@o@qH^Uo򉿾E _pI۪&"=TLh .\Οs[gucmtR$)Ēc 6ʢaǺ@XA|<$^yx߼9Ee^`:_xǓ1NhvrL @%lX8tD?9u^[zF-.qj*ޣ}ڤڢq9<$IԆ:Yȏ6?JEE',:4I`%&j8U""QUNzQxQg9fͧ3̦N&4i>c\LJeaX.RB>  (WmONE!]+"=^T~Hk?J0v=dY4MfCNbbJ?T"=S9ecX`6c> `6l6t M0UT]QNDsUQ7sxW?w7F-)d*zS+:G<£D(3? a Ti6Yc ذ60)B/|z)$j=BDBt=yy` 9 q mW  RzL3cNZ|Oae}?xE# 0j&")VU( ~ZW$PW(uDT ' pP~Q_yCw??i4ŷ .@,x?4L}n<#K@g$B74n @濫~`Lj}n3p@ncOx%(@pPC10BKv $ =y=ۊ/B*U Rt(k*xWWShk-V ̧r&5EB PU?w}E-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢE-ZhѢEQBeXIfII*nt|(1 2##GIMP 2.10.122021:06:19 08:47:55 sJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((((((((((((((((((((((((((((((((((((((((w:Ȃޑڜ8L𭅈 pVqƩFh,v*˂:+[}O{m׫Xx^x,"@p01[0:$71ZFd:Nӂ({||Y@'`>=kׇsJokUddxeǁ>fb,Q?~{6?u8Oֲ+y&T]cn&ȴM |;vBֻ-E<SRlZ#!1&:t6r\>_ds;8:L7WOoB2%Q,`~.[>*YR凡Ƨ/PKZ?yXCml3%qS3YJ/<> 6٪VZIN Q7NVS%;ʸE:qӓǽyiJz)+=Hm@t 6ʇI\,y|NRDdqX`|5jq ZpsIG-ҋHِ(=qOjt \sn;pyޓW4nt砛 |EZ-_%½rDtH@5yqsV ]*2sH/W$ a]PZbFrH1UFBNO&-}15+dlCokz܊6tVUwcH[hI7*{i1RbQpT 2+d ^*'t&8ؤL1I曯Vk5Fx+4. }kJ0mOC]wUa~J*#HAr3Ҽ^;DZOi~U,g8ʦ}̫VvWG'EVEQ@Io \\$*p\4[I&@B=7w((ry'ep; i"QG Gz:pr 6{6$PI漷GN͗{[x:+"dܜu~BV8»VxnSXCŒ<+sm胛"^=)뎢. $Hp7ny 'LpzQV*m\tjڌdgR7F])hNexz\dnÌ?z7ZFk-d`IщTetxhR^$kK{Rk&*[h8#p**|% }+= ii<Z5dK;ɹٶ+Mqipyڣ@!yEO/|'"c"Eח|*C9&4JCӺ(m3y{T̟v\bjH u'X?;]RLi-^eQܹT]x][&Gu Pn7-a@nR2+|,S#Y<<3p,|m*ǘ]72=TO_ 6&`5hwIЌW^yb[)č{6f3xlS7ckO t&?j.X;L Q@QnJL#cV/Ka*- #_)J>*1ZEgvAߚr;ղ4iM0Ӎ4LiZ ݶ#716kw~]2lR١ q& qm![z%gEks{0i]ODW[nH;k:[(C%Q,.QtZ;y[ysݢ]NAՀ_}Vu'twZfO^Aj6W+<+ `Uzכ5fh5긐5n{mzV,Sچg\%Sɓ%t{JҜ@!u V'Wn36'kxZ#v$:W['۹'"5o |1OqZRb\pi܁0hc)RA99E\{@NUUѡ[) -,P2vHrhjVљ*5'?'%N<-͵ղl\)Np WyY=bi8/s5d;XWL&`Ii4yZ yaV]ֹZ-#+=iN7dNVE [nK۟zWz/uH9e+nd@û:qxγ5Ƣy%7mX>NҔl;4?6ܡ@?5EtQ@Q@:&6&?c -2aŽhNkͩ4$uII 3)JuH:)Y,А8WEO]kiY]3JʹsVΧhzCןCh:wqi1YnT{d{^񭦧nlm L{W/o49-8m+p\| `v'"լKGՑX x9֊QkĴO^Y"Te&59]\ncP&OshU5=swĻ+;_+q9Xcn-X2M2\J&zc9Q։VaQ3SY&jlVjXdw/@PUZƺj0;M?7GϳT.t{4ѝ#ģ,kDüV1?@V"]FOyMtHfzV4q?:g֪:LHkhzu{0;Z*MErӃg5p_}1>4<۔_'>p~q]/5thxvXmk`>޻R9PF3:k+My>˶{ӯ=86u+NP(BA\ТuL\2B(S.rF{4QYQEQEQEQEQEQEQEQEQEl"XE2ٙw#d\^ل6p<9 %Gh]ʲ}ERcm7Fh1v̿6߽|a}R\ .;r?ϵ]SU\V>8|o8?U''gB=ek5ӵsڇ}VJڏ׉xkx9<%R4O4[9;-9O:Iu:J8P&WƂ[que\*U=J䥚[LHH]ؒLrliig4$՝'4(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEA%tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:19 08:47:55ȊtEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-IENDB`vokoscreenNG-3.1.0/src/pictures/log/log.license000066400000000000000000000001371416353147400214620ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/log/log.png000066400000000000000000001501111416353147400206220ustar00rootroot00000000000000PNG  IHDR\rf}iCCPicc(}=H@ߦjE*qP,8jP! :\#4iHR\ׂ?Ug]\AIEJ.)ޗVb6 hmq1]C@}2f%) ub<˿ѭ,Df6:Ԧmp'tAG+q.,̈NGB +-̊F bO> jٽqۭqr-훬*z>BIȸѨƐg$W|' CгFY'>`'dC&`ה> 2C刔va2V& Lvm:Ug茎 |d\z0ǼVMfͽ͑hOmbRf ۋh' q`)\"q߮"H*ϙD_IDATxidu~{sޔsք#HE EYh[KKk-N,-WP-S5rI2Eݽղ-5Pʪ眽9/H̉z6^Fܸq#^} ۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹۹a_}D{DZ(P!e@J LPFWJ< ;R8Ur>zn_ gJ&`bOAvm@{t3Vxs8G ,{=/GoHR@I@P#.={`hD PiI uJ!|(C%b@K(%x4FJ=qpE.?iOb/馃[@ 6227A~W?u.|۹2zߏT*0@NǠx ǕqD8T-4h,?>z6p )xJ U#5+b^[a9efx *Rj@-P( n4޺>o("J")]pWKP75O?s<xHk `DW)FViWE X0[03 )NqL7rT Tn*!xH E09 >p'{YliC!7x*WjD&0%.PI;>[PQF;( j(ku,a C f1'3(qK |h7-AӬnh+lK' "3@ pt3Vn~L_@!y%?[73dFЙC |#VeLݵK--a cm\ETU@5BY Z)4t}, T49`F^`L :y?#/G_BT'5] Wp1D UB(Q.cs.Fƣ1FDY0f3&SLOIcyH F ,tZAdUhHi@mڴXX.WX瘟b~tˣn N@Mn+1:g[~pn_;Y3%о?LcK[Pw0ٽEg{Lf'%ҠK"1R Ft`Љ cn\0`qr;޵pk[BTEN7>-~gyzEl|XEN4/@_!@T@FQbs ;{{ldP-`l0)T2' 1J)WHc@!S0D]`` %01 _  TS\ګ!{ Gsܻwwow %,DoC  sn?Y`@Sկ^ ؖESVF;\t2f{@ bUH)xA!"@T s6À50t @`a8:a.`NUÓ%ý;zqm7P0-@(?amϚG_ S? jO(@@UEbrӃk8x M&j)`EaQ,6и ش8/AϴkJ3t+d$h ` PXFi5,.-ƕŤ`*1P`T11fV7h۷Wnk78؄_\6@/O =kv|~/[ߖ=»WU* 'a ;ױ*vf, Hv w>: X| )P=8P;Jkҍ1* FTʠ a`-0cepMy"f Zo)`x oC caς;C)?[ }? V?_h!"alrz 8/b:kزBa-,9ꭋ|Xn{װ{q\$vv0* $AڸeB K{}Oha/2;tJ+t&¨W؛؟JLҠ2  Fx铟ī7?`1?B^!x*]%LoCi˟ GcCS߂-D~{( %\6\XƳe @Eu0_;i ~qFP52py漓#TC)2":ǒٙp:8ZnXuH/ K\کqaoL谂*^`8z*n9/O{8H|,i_@:(5.Q<{/39OA@KDQMQO0.>6\ٸFU !. XnK;>+b<)]U}7(U!8X3F5KO7cz` TjW+y>JG^(kuaP `Pؾd]C=7"WUxQ4^uq1=Y6FC 0@M9}F]ZM*\vjUk~i7o=IKXy YS%1(g_n|= =]'J Lzzv;'qv`&\|~ #& +x  ݆ p :!^օmui#PjQy Ah]@z(ÌQmw\* JkQ"h(ZI8*f DTW*tJ 6_#9_3sY},Z hA9'qpp eU bqh1_p|DSBFcZLFŴ6 Fa{T]Oh*PHPm3cHGyCQt|x]5 "h6[GBG5ݸWO\1bwZk._+ҧ^ħ?,&%`z -"Xxn;jIcd 4o\Dxp1( <(Z'X51ǿ7olS]{?lt:{;q퉯.¤=zk-4PX5(}LqESO\AIqmbWiO/wz~ “A4#v5-tW9h |˔&bq8Znqui.c` 0+\D5xbiLiױsοKdGYD~|a1{pp͸W`rڥ#0: 8Z:.4%+¬w+\)1Ywuf҂TNHQvsz{l_0aӫ4^Ѭ]m"nbi}E д{5 toͳo)I<~RwG|lk{>§t0R<:. f3آf&# ""0?wկ{܏G~[wX7(c{ߜwYS,mZIC;uwb< ;$eNܽ3@݂[z?c)B7< qk+icP*`Խn<>t @Ui0ai]JrA=)Tiqj2GӨT}ز½Cȁkv7 jyy0ٹH/QSطҷx;5&;W͸W`o Dfߺ/],=6j36W+\P¬66o>hCF\Sy~~C.;=҆"b5 "4 j7?(tH  Qf0bnRqp.9NP'?e_~v|w}P"%\{;q副t2tAFpt3>?U5^7] $2M?chDJp=u8zxSjmt.wO/S|UqJ/s[/m8+F}:!XCd bEQ=e;w0?9N#`ܶ|7n>7HaDĶޯԪ K=\xWXr"ǿX>}0;|Zs^g׏o}e.rn2G|A0}&Fx=RPahg\EjO"ÄDCҀNd,a6P<~omЬ@ETi|1Wo{#?+ NDEa h}-.=ۻ*bOM<;"KK؛\ٯJE4<}S!e<|P-{~0T0?tۇóR`(7h\T%-eBnqUqۉcu¢4ˋ1GY 5J(}oSG|H;Ko۠`cL_Kc4*aL\OWG ڡqv N 엸_Nqeso -~}2 j\hsT7=WX0N!%RErd}TDJHMzQ/bz*ËD0.-E1(GX7<Sr7l*H;{׷\PCU&*c>lc8R,7[]ױ'( …"ط?&xwn>s'1vNzva1gq8\DrRB:Ղ6e U@l>.zC<ȑƩ٨qiDTq]hb,uPe l=.>,{1}?8s7(v/=KOb4 b(9% 앸WbwlP|JkݸD}'箾Ý2~s;y]uk&U^hTZlZ.Uʣ:dATkG򽊬!suo.o~sc-Ȑ 3n\Dn9ؐZ*Jv*l vw&`(^}E.!O]tM͇G.x4#Pz"*B%e.<F5T LMbeJLFE"X!y@];{'o7޽ -#[ ŒөѾwP:VU+PIeiSY4TG4cep0Jki:4*-F ]ǞxGwn]/ƀ|p z#٣.' B.\{.\+r ҡqu~E]1"g ]Qc\{ma4 BnF& 8ݧ&Wf / _;r9RWDqmqס (gfC DXxc+3 0N_ 0~CG<9BAc̞ߦ DŽtT ~G2 xl5\ykw‚e>Az՝"\-qĥB# _\^swʋu$ If6U2ۀ!Qf-bQ,ҁISLHDtqHmJR,jiEҲ0b4@TpmZ,9Coo-\_2{"Ha\U\Q.czIg;z7.`—>y;Wb4U[H: 兼<`um/6ܒu@ Q<`ˎ[;En" 賃->HUkbO DcPD5H"b>QMR9ySкu8Zn­ׅiEt>?f]lZ: Dd*ds'wKe CAV?Ob(Wh]0&?jh"z#S{ E⬃¢q^(HI"YA$P̀ 7-a ޘ'PWhVKx#'QOߢLG+DF"ૠ& `sx'p^j֣uQX`R3.؛Y"OOoOxOE }d@9a?\t p/r0:RUID8L@h80(6[l|cUIQet0Ku2;xh(z_-?1gp̦&_c0Fvaz8jdcOqwU{(vPOSOim%= Vgx_:Qwl\\c+;Q.d!zD_^ ӱAd( YI $TlHX>|"XfzFeIl6kOEz | +x @*H8";|@!` ]Sv}ow SUrä$ UbR@`~0Z'tЕc\ 0SOa^6-= }UzU}☱sp,IC}]M5-Zc+\e["Ht.Hwy6_)P%Ss}ڟSd!/3(Vѫap@( B~e/Է9nD;459:uFi H3 4R)pϐ*{$F}pht6ju7?~ 1>*%4 n*!<G PآD9xrHAi$N9 ` jbRx<90oG-{v}[}Dt5t0rOpKQ۹} ۩3R?1ְ L ЙA$A[/Xpwٸ٨d\ܯqvq *Nz;O}7]DWf[bs KQC@Pdpv!tѻ8cgdP;t A.+y6'Qs&D$~_I:H#RǾE̝zu|q&xn3ut J9f+3!Hqaw_зs5 tb!?@ #|"H B|0ˆĒD+ PHAE9źŦզ֪4TYK/^{w/k$5R++S} jx+T E9h<èY| X7Q; qv+?ٶ+X4\ni<;q]8 5Yw;? H:p=QހM%M5A#5 :Ҏ5H9~H s0JJX:w.6awR 42Nf:MYc"zot_L;xZxUYZҀV_/3GQIhneÆB׭w=Y kVwN?xfAX_ضF f '"t-D( @8zD.6ag\QSf* 0iw@&{hs U ukW:آa>/u7p4.H?w,_.NGM`9z[ϧ' %.v3IrB@8 Po1( '&4.( EKppEUf#33Vd P"IU^hj<[RSE y5fBU" G;{7a9eND "[<@v;}?S\Zr*ޣ '4掽Tveǩk?e]!.̎+qbUt8EF R!%_ `LKeU^7 ZBa-vkƐ.D?I8IO(splPfS0(@4q4QQ6[r hC#E[;cTur6NNzP0(3vw8堶C1,[y{Пnt gԬJ<| YH!HҸPN %/0UR0$@HTuAVutD k1ȐCQ5ԇ6DGև9N^L{Ω|5-={*H%kErV{bri!x^4V}@YU"a gwF֥!S0O#Z-)M}v&u XbkJeQD/T4>$j(̠iz~-,m-AL.$b:%9=A?NRJCpFj+Kz>?!H"WJ-'d) cs BPYn\X}c}&( Lg;:̰@DKgr7@`_}ZfFQQT#w#Q>Rm{kGLߤPJURnj \ʵ )i?ԡhί@?cPR}2Nz3 GuNB?tO]C e 7G95K0D >@ bk\+gMk`6( r b6P':NzTx=Y5ոo!;eBV{7xdJS8CbB~ϳEf_7M*QR9Hix"$E3PHRm{:36LrC*iCD4;nc0t2莍@bnN9;@u I LYV#0nD)oA`HOuZ_{Ve,m[bm ꇊ$@ -h]7ur)Sd} 1@:4KŅCC߁ !9*BNccpP9 $^BhS0'p8So@(zu ET~9<5 ;-jIiPS uRpLN)9RbfG4 dv*4΋@c &N&cc^0s/ L9bPvAnT1(OAZ [kB_b`} Of%ut jp8ݢIz;HOv ;菍g? /2Q^ԃM:|`"J!Pi[qM-P7X6@Αܿ>T@z-V"V" hl4`d ;}L1f @cc 1 cam׉znUSjܜrzawE\HXpxοJzyO ^A ak>`?zBJ>sA]3Od5 z?&LyS s` 9Z6dQW%3@A4&1/ӗ3ag(3T-@,6=ڧ*%)w/͉kc+-M_zŖSn $u2/9 f?Qt+^/k+1 B}Up߮"P %ݙ)1픠 SRN0 LjDrOiVFdcUGAEL(8w3JEO=v @KD8#3MFPt@%JEATH9Bur{*`o׿h&~AOaJ.\rmԆR4Fvg=UHS;MMZQ 9)e!;t`enKPT PXkrS (I"3bgDY*Z13 >N;}LA[ꂨwA(K "a݄񭨨>%E %/!aqA#bQ)c I4O y&Պ#|l-~J@ 0" ;&!KPW0Y [ߏ߿<p{:uxѓ:[G&^T W6H|h@ڱHw4NrQs9+ J| Rz edِ͋-(|ٚ (0ܥ(} Hn}:wJ>h- NH/3 68gW8N޽?n)W u6·VD1 xfI!+t $>@V ~JdpN3ƳH@Z2,gp#op;SbSvȘNG}n n@7;ZÜz1V CVShs*e&]w6wK=8ʏ7t*+ 2@S^W8 Aܢ e6AUP)4H" "< y0EQ2HۍAId<3)wor md%'Q!r L"n\& fXBt`;,O{@dp:*o#UO!l}ϩك2CHu9~<-#1 U6kl6K)H CΞ?ftuZVodQ,38m<m 9L9_xO}a%R~^[N2X6A굧٨)=CA,]ȱ}U: z}tц}m>(uۏ~o=e5]nb ZHp ''B/i Ҁ.$`%"P S=һr߮‘v2   q(DC7#=ؓ눡.Ve+lk{0s.{5N/Z͏a9;{W'H-$K"P }_,0dRTWB|냯@֤tf:g{~':DDlqax RN? (HHuy:]XeΡ|+Nvt~lrԹ`s7 H4L^) eb q_%Y`fg# pGqlDѬ6xvcCJwSs~ {~6Y<](֗U3h⸰0$*:m#s~<9d4vwAhčA| *DL*PQe՘n (rka1al .GG>:T}xB,nE36Y?cwz 2. " !a~ WM$VM7kƿYlϜdBs$N &Ҳ) 33 Alm6 >o. mgH)j%of !z` D+ʚv4"X{oy6*.{bhG^7li ,ukfi" 9|agl8$nM"}yOp>#mfqu6mhD$N$dE?^fp<Xeɓ?}UPfk zz t*d_ ;pNhr] `a5U8UM OaQI1!$KS.*șDN ( AGVW"Q Ez݄eS[!,iO\ $ql@)ſT$v|tBd~P@!٘f%kl (ϏRR1L:dcP"lV*S?QSˆ)_z(jVE@0MeKkѾN?d$+%<-|74~ j$`LQhZiDU ޤQ@̃a]PI)/iK+aPR㧜 q4+Na'VV(EJeN¤OS ]!"JcR ^]zz yVL:- `W$ffb cPZGMLV.7>XC2,aҌ(+lj>M }Ѡ$Á1MGa ~v>u\}zX.K ɺuQg$D~êK{-I;xT!('z$#yV8q]ڑGP0cҘ!xZ\)"r%rٙ3X@H46%o3iU AD5 ^sJ,Fx*fg\Dzb!u 頛W#A! H'N!teF vIc*=`/? Yy" 5T\b ra<ՍځH H8 M>&9101I](2 !/{*!gΤ Mm=|ׂ 0. @|j~^\@=6 Ad3k]Xt_i 5)s\i!D$D?⁃Չ b/katWnTնu޸h\h5"ԑK"*b]х#ba#/0w!ؓw% PGXHQO qm4q89ℂ`Vx HU3fg^m2$!YѬרF5*Z$=#w3$CnU cԅD^l 3.*'a;|'ۮO 9N; ϩA @œs=ر#^.iWUA8$e좨7`5# ]bQ!c7b $}7eD%13I)6d d0G$"PPhR٢.liR(q. Z-WY!+xlz^bH@Y/`Z0yV9| snT7mkhM\J8.ЭN9t~`&c0STmEU19`5(TAI5yYl$;iĪG:D0 "|Цua4.H.'AΟXTĸv]on ٷ%v{iA dDUC"34G1-JIv4]/*2IUdiRո%3qP@diul-n@qbTyL:~wW C74/c < TP#E @j̤.imʌ,S^ 'jO̓yCa Gk]ʀ/Y)HTi4K#"mq*DPR?#Sgfa]&耥yr\[Uyq2[u'upiT ;FKd4!(F, ͪFDD`t\ ,k&uQ&eӆjA$?TĒHn<xc? 諉:9rKWTQFU*]+{ѰLGz3?@Z%W ֠0qŠ\ Ɛf4Ӻ0,_a P2m4 !w݄:,2)G7rT8HUBTB*I}A4;W  V%mVJrOjٸ~b:Umbo}8t[HUk…@kBW$81ܬsxcFckqtM+CKa5JCuiKl  - 0N[bfhoTąдίV_4.,%RANz5oH@fvuhJE|#AW()ݲ ƒ0%Ƅfu<߻M{{;{{d2Aa-9i #6t"Q)"";%msIcʥ[ Sh];ow#rŒ[?5=?ٗegsSHu^aݬ cڒ $EW .-;E%֫'X yp噭!C:EܵixaBa*  ^U .TH4"J7PhT۠~>`P1!ʂڦqPMkq]?;-wvf`1!D3|?"=Ծ4Mr370H%bĀ5dF.,[ñn¯z]RhnY]YwLK> AUDڦ\Tma1Ak BNy/k7'=f6 b?TWb3 W k4:i_., VJ p"p! B^! (!$}?R8gӚxS~Mh7fu7A7 h.gJĝa͍3g%nr SYgPQq*B %= .gua9ΤNEkc!FF`Hk˨Q] XƋ4U'6VU]tUc6-5pTx!\ Ղ-7Y:T1fɅbggąfrjq* hi;A ڍF:zpHiٛٸf#\pttck+cPig9/KD fxMTUAl T%{AhGUؾDcM1dz0G* 水FLĴ0֘RDt/qm7'޹yۺy±XxalkA,ZNryDEӬ ߮fR0Fe7M&;hRuawbHWdGsD^Gz 1$FpGHLENvƈ%5V썫.g:n;>c48k(~> Y;``|Do"Xb4`^5FlTr$zJ72{ؑa'~}R]"Ή7oNuQ]ƒߊ q^eBk Ḧ́ 3Ɔud KSB6 iAӦ+)M(}Ρ[ 2%k|!hl:M3ǹ/@SO?wmN!U\ ^kd/Y%KӪAhśeRNtCD)C] "۴~ӴtN`搋hqaia9xt(̈HR켃1lA"H+4pި+L:ӆq"cPD5ETghZJƚkjE94M\p΅rmDG#N'm=.=UkeΤL؁IU}-+F JCuaڳJU@tXƍ|땛h̼!'|T> prj1Sl.*lط nzve2ioR1Ѫ &s`ФyNQ8 Zz3BJA/7n^\J;8R43߅ uQMqgM#x{|>gf15f< KDlO9"z̐y2_̏Q5i:QQZZK;@)4Sk;nB90WE=Aݎ?XlGDbuiҚX(QZ;xќԅfٙ2{uQLLL jc%%&""40ǷeFm QQokWd~on\YbZU{{dT ݬ[j*5& Sɗ$oTU$#b\8j_.ǵOqigeA X,[|U}饗0?S%p$g 3)v %?+CpXO\U].IĢb׮AU" I|w`ѺAtmĦD|Uq[ĭ@eajk%ou˕ 7QS0Ҡ. MKЮaڱ򨰦6vNspB@۶ll64ͦiۍKn)>sa|awV*ڴ^lEÆ3Ÿ&@q(ktkKPʪlj$J^T&\ۛ\=Z%sr|#Z-DTq~ZdU?m Uzx7*fCw_EYi=qUZFU; ߸N+>e(І AٺށAs{'ELAbV>F 0˜QU0lIRנ(xT^ah<-Y+#kBmK&6d" 2i Ƭ{߶5M4fӬ֛fzDo^v_;xiwV9$:3xrԸp"J׳^d# zd V:4(tx|-bf3*W;{¤*BXUܹ/ߺu0l"§~ؙ?)?wW+Xx6q׶;˻{h4RBa,NjLꂺ m -MGaSUrK#LA\eKU]r"F\)2ʃnmlIm!A*0f5J U5iRN*HQhz#jTi(:Ѹ G[4"z,|B  ͓b{*Id9UUNK'UcDU+>0]U^QpeX޾s'|/4M+ 8|/=R~wG^D4Pȵjû|j k.gTX4TVmz} K`l~.DʼnK۶r gM=bLiyT^!ǑL@$"@*gc& i$h{'eƓdC$PI:|Ԫ"7ۊʋz@ ~pQ@4@$o)Qerr0/Kz\//"sEr!ii{c1 lk'z4xҗtT/ { ij}]GAMAzj񷬐~ӆy]*xB@LZv4eV_e6i) V12a"%AֈSss-*OR ▌ ,T(Wl K3cx\@؄;=QF] yt.Od)g5娆^[kQa6dBӏ~^0MӀE~˟G|!(~a ˻Vg{V"1/\JCR-hRY`zUUrAxQZJ;^m7.H7oXK{D2DI,w8YY%Ӡ](8/KQR|Tl-ӌ1'Xo\;"& %%Qk?w?:I$?I HQA|S$!;`R_U6#Vn O7o(ƚנ5{0tQxE@ߩ'4's>nCp[u)`#ui̅Ѩò)I]o8.I%ɚY. /F&)J$hQeyI!J 5grpV)rg %AI 1 9en(BCBHTa [8q!k|8T0w[vMG<]#TDU$ATa4IulQi2%E8>g|#d@Q` +ijot{6_ާ@k.b$u UEQZ+EYM״sUŘkENt8DUCY.TD6El\8Y'`a&{n>" q~' "7Źןcr7C.Rz8ui wBT"tEhP~_{x]߼JDW\+!TʢT[XXk, $ּ>KnEuj_Z6hD$Aq!,EЊj ωQ ( Q_#7Hʼy&8[qu-a"hl#κ$,KWX` B\(^κ u9zޫ]TԔ?*!LlU7)'Udi6yգ‹s'_z M@ DIkw쳿O` "s9UdHXjkLaZ)fF\2QB kL]23DZm}е(8M3-z&%C!;&N!sbʑGL=8*wk3YTUG勅 Ly;wmuw]k JTFqU .LQ6炸$ }"9ba15uaƖDB1Th7N& Ct> lX8Jf *+R R\XYY,cySU ܸps;pA+J&:t 4Afui;걽Ixƀ rx83z{yq&VJ/zfY{ӏ@g}?B=Ao~P~=a_ ޓs-We[XR10:1<إ9'iQ eąc\((hjqp.b:ݺ eÝV ⵱`y2"!w32) [Xs')=PΛ6h\8\n'?!LCvg6[F}54& _?Oa\6*~/js;d=g}xz'Xbz k.`d*u=fV&FY& Μԁ0H8Eb+ ,(( ݉EPm";}~qLaii\ʼx)hr,Y HDXnkD#@Q6Q)GǑ$dt$$?|M,t*v_ ?s:3y t \ޛ=yߒRYV0U[3Sg1N}F;EPX6&jU>FU@;DNSthj/uadSmLD1a;ؚ*^ﺠ,JE?M`*4f2듪|,VX rNx/ %ȕ\.a. k-S"0/Y QBFGtD2RZ$X3m7ԘfKL1_P}@'*R 8l,BcND 1}gtlLN?8EULxqifRWs=7nb"@z?_s:=Qzg>~'Z{ =yTRUJa,,  rm%. 0cA Y`&f66誈U/J 5osgR$U9D Eq߇j  t#;^lT8"Yg:BsjȻu4vgROL ,=O|Rcѿu\>ϯÙs:3A:q53]Vղi0eCHӔN 2e#0u;>wyuv, Re(3dHr/DQ@'^t`NCSO) an3#- ,溊Alb]yՠt OLI+ D2!zqJ`$hilZWo[ c[KuY |饗^|H5"@on7/?bg >O!mj湤*{+"A!dc@AT(qAǰУiQ H%J)B@ވepG?(c}&0]"~Ia~عCAugo 9%&Dtfb3h2֢,64.HFGA Rx PJ!@H%  %|^ق&"D*sꐶl%"lӬ'm] ޏ$ѱaYJUg?R qTU' Sڀ'>ߥW_}53&'w Oyxހ;ɀ7DDW͝^.a"0U]),/ 7QWzN) #U*R|~plM"ץ*D% zS{C&$,@,Q 6qL۶e罺{.p<-\!YG *Z[Xc<3L%3h4+/17maBDRZ8_=݀5@Dm.k[ګv2;;d2ְ) l(Jcu"QHIF*\*2"ج̠'.謭ǜzM b*R{rr*qfV6FnͤmA(ѹ@D;GGf5U ̆Լn8Hǭz޺<;+GD֪j)J%0f+ST ~>ȁF! k jKƨy^MZN(0U&Q-sb3'fDKfT0[cC4<"wܡ‡k푪~@T//gii!'X>"MbPYm) &. hfHew;nI#nӢk*5""2⠣s c^kcՌXG6J8$F5ҦmjUP ,qrgڗ^ H Q@AVV5Bp?H*|v|O~ǖ? yw kɹ筊3<.D#(s#& >N¹AJ'c^Jbd 42W;?|]jiƵVӪ(5*.BIbx}iBl"˰. im U"EJ?_;k*A}{6F9"ɀ"m҆^sچvSvSyߖ eu\I, X5 %?uȉ,ib>yֵۨʊiLa=8RMS+$4 e%A%(VUoibwl b:'C@!"911D']?l:f '&{qцiըiQ٨0K8eYZ iGa),׶|tx8]3׶ƵEΫlL]*5ub~_Sz'DT gA὇izDH+|v|\TdC(U:lf(QE"yju8JX&V·qpވx٬c6fRN/*kig 0?M;630&mhX,޻8G3IUعL&ik,{@( M"$Z+J]9ڹ˜RʇRJ"4Z2qO c<(lV2P;XED< Np7ݖY<ҵR] m|>. l@ld4*qlrM LԆa"*qQ8:T(Ц 9ڹ"AQ={y[T0قl[ Э3*1PTݬJw jڦxgc[fP_ȝ9JQC'^f@HVY,r11(l/jwa^eP fvs ):ELAtlhDE {Mۢu-J*q#w;UU|l6l6C@ĥ岲X2DzL?Ȉ؈ZU^TUEJfS6U֤wnXSjé<+51$XV{wjY5MicU'"mYVu`':JM:( FL4&4Mf@B--btrn;/ ͉( X.WX.'f(*Wc̫Aj³-ZZQ!x)@h19GiSdtqeiB fbШe=:O~n6:Q07hYUSG ebh,j>1Ld1Sf`%l6S?*nQav08&"Bjb$׶ k QY0l1;h۷VU$@}i2lB.sAdb@Ȑ@LT2ь f br@,5F_9ڹBXNv 5aCpQ\V"pQ:kh*vp!G!"PO\Be&WV#*UI=8S5 PU& @` +rƕãKm b<^ۢX X5d 1qp <? sakfL 8Kxbv޷h H>@lwd45;U&4@ 8P" e˸H0ذ1wޙܻw|;w_cQŧe"jC8֫30qYNEжf弊&=|''hNRU"PEƸ=ڶeUQ)tbQJPt\S% !hED"ެ׶:lV߶nU,")Q4!QE)A6ȓ [g?i`AʼnAHPm$E""{6vw\k}nˤXU sn^5so|_ !1LtQՆ;pR)"@|?,8/%fd!M!G>͆^댉#0S!i HyI q^Yã#Z !с0z"O>ߛW20Ơ\,drӉJ4e`%O{/A0;Vw|bN$ viMB`=y砪,4op4-Q;~DGp?n:RX@ 1`|d !JA'i'd΃V)+:A $R^SR^p늧)E'U ~F#5{xLFR:͇#*CIL*DgsskDpf8[o>OZy8c!H&J' ^"ul2 R1֠(S)dߊy1̖ cm0eiJ$H 1<Ø B $$ !ibAD)4ؼpɲ%=Iʔ(g{ԍ3ٌr1PJAQh4~G#?-#XkQ k7R"-RaIM;=uM3B:eEzdJCܶ~Fr{/z& *v$ un)8{[Tem \ #%Y&"7B "G2^$@$RR*Mi|ؤY.JmK!M!@UesYV!B8Ӌ=^!Ė6;:<@^r>jxT=c81央fFz:W^Sۂ 6'؜)$tªiyA,J !|#E)FU 2J"ֆj޴"$pp`j%s)5cVSdHTĠ /[MńJ,ͷ/εqճĆ ΝTU5I)k"D#u}.SV&rd4=TR'R6R.3&8tIWo;$vO+$QЉx"/0IDAT,JkFD)Hxo oGBl%+amAZ~R@Kd9o9e͌LIPtyB|+Yi|]+,˒ݻ/߿OMSCJYuo0P^ ! sQe #ʪ;oH|0AACۣ!::99a%@f̰%W ZW+ F)$5D y$ Ρ0K v$BDU~PJT;Ko1uDTASm@,n`ͮ |BF59 BBB!H(%!D|͢(0A4p41pfn0”JfQ3ȥPnG ʻp[trrJ$IĠ@ |p@4$:&tH?|p?Mč#h "[A.tvS%R$!!HƑ["IIJAh2 H!B5$ie'!oȘ50 He w:60):8`"/ރI఍7t:ؕlmo!%NEChD !@.h}J IdY(GXX(" ]o%JSw `zZteF!H`0(hX`aCU k |{'}aIdzw*mo^c%(nݒߗZR"q~;!E0?"GR+}fbb``(R<%6 0_L1[]Kջqn&.H Yj8!4j;NAL3LNg0bz%A0| :I4Mmд"8k$޼|gbP ) ,63}__x AA pH:$,@Eb]TkH!!X08.,K1YW580,p4`C)c5Q66Fȟ*$[H$ 3(D#R(H&I (5xtY6̀1.;>$bE_';_x0l*M&4u-F! RZA(&D Jv->#KQB R$o\å+(R -vz/X `8@1̱go\ŵk9 KQ^X>'A:#MQQ;: Z9>9=to|#|;/7nReY !b' ?o{>3^Ο?5(L]vž30*?AJ )Ht"T\J,VhdY,ϰ9¥#();ͿvN@">G"27x<ҺS," ̠dGzI4@dR 0,+[o^~T!|@;w>S^g>qd_ny_) 3SLg3H%),NtCI4PCJ*Bq7B+01gYv_˺cRHJ+gR~BhhŞl#$;Pj!a$!u޺{EܹsO5!JzO='5_UWvJTcDJ)XD s[[[thI>x0|8VI" ;})C= (-[3#[.B$( PRAJjPr!{" iprG7o޽b1(I4ȡ&p7㋾d)~l BcUj|HڒB&$k ~ػ7c(vwwEA1D Ik`] 6 Xxo#ph-vzԊm/.;Ų!Hd )3(A Jf"i K*BDa^~Uܺu<Sx(Iⱂ30}|?9Oz 3癛!aRBH4 ZF]>~Y0 ,%F{< a}k[ù.X8gED[iD&"|h ごBhH@RjHBZg2=foPUUUbݻxWqCL r.t3ٗ@_鯂[~3p,17[>Ɍ1(jM# D/-fžp9Gce*Eh}x yUnj N'ܚ` H)c2<|xA͍66Fb4a0 ($ZC()$ւ#ph _cИ-NVd2|Q wpΡ1 L:D8""1*PU3LyFm@SBػ} }8_ĕpB֌ G y.ģ1yԵbQc dY#7FIz  rofC{xa1 FUWX+L&3tbZ.blB@ @)Ry0(9h11cp=s͘ihits@:F0F#(3 1<7/qrRi_xAżFS[OdLb'auPJ$4cVB{8`uk5 @PYꡕ8<|E߽pZ"y@U%-sHsTatB24Ma&cc#FөAU98l14EY66_gݝEpJ`}G(IHw| K! )ORbxyEY2p2A fwoxPK獋4@)BBR*nLkl`Q6(K+~t3dk%ֲ]@%%!0)@1NF],JŢwkZgZS@~__ݿїK"|C" pra44tI(8i)8Csufˆb ss!IN9N.LXy.ZaTdN5:V89V^|Mo@dEUk1]X%|keXf.5[7gOw9t;TaPhFȥ: BjDT) g7qAxdDÕK62f Z҅@|t>=pm;|Oe^~{ Ac"z^ %vw PA=c19 $`ͱ $ӒM8L cE-t"Cs10 Щc kaWi7lH0kHq kx.uŻ7Ԧ|/m11iP7  YŢ\$$DZ`6]x_h_D>#zA Ama%Y^wEfLyg[Og&[3Pk=f*PE$v)x80LC\cP$8P'su |({o4}?9Bk) 0Ě"\v,qK.`z.`nZ 瞧BK*֢ bQb6 McCi%DA+y `MfJ@Vsh1~t 63s$$HD5V-V;){И Ɯ I"}W`P9dTμ`_n} pޣ*c/>_`>/QQ<ָGwU{Ls0{Nqnx $9"xf,m gGU$+E5{cR!I!eS0Aw9B[QMcPU5 UYj%;}jh-U|(#ADr',قR<à0PJw@Rq9Uk,wxBtN:q۳f[pa<4قyK1\9 H"߮J3ceŢ|-&N!" R" qw4#=ChYZ h JE'kͧC>g|+߳ܗ,6 tzZB)@RQF7Sp cNV*(]@0ױt8+8 -QnZ^Jy^\첝 lnǷ;m5G ,#Cp,|r$?zSϙ2@ AqY.@sgv-E;v; J#DTj}$t{ߒohA\]RJFE,i{qo'C޿k{+g܇Ue`mlӊK3\><L|c3McEA R TCQ,V`2ABHH@Bg-ᝇ޻v `!iT4&!"k 1xNcƢʲ;O}x 08}-I  CtZFuAx1)B X =D,uYۉ=-SN,k݃9ZǚDwB>`˯pjJXa҅Ơ(J ![̸~?0{D#r^F5)!E4$ARAZPj%s(4\f f;Om vݕ^+ BPjo |gF )Yk2-&RF{zO}x -o ;;c|xvvVJ+ $zs5p>A˾?ƟkZ)vyX Kvܻ"XV $StZ1 ό|lvas/~R>f@*lm p]ҥyA*@HE(E]g#xB9M[AV#߯{x[^XZ-'vߚ F8U@1PЉs;Qˌe&!J}!!x?>n<3p(@T`RZQϢȟi΂!e p;;j,ӊr tَ~]#9 a:fjT#mUr!0ux_ S_E̛̿BE ;)66dv)2(5Fl@@]zsO//zx% :e1s6B E Ci [[#RH/ٞ p3so&?όO"%ػ4@Y0T Fjj{@ DqãYrVz]Pآ ԵlVa2Y,#eXJ Gi$J@P-PJbs\ xn"GZ 9Ꮙ-k$Ӣ!@ f~R llfL#ֳm[\BzENVdc=]~O4h0Ei`002hQyCFas3v*$> 8G9_ kh ! y'ex[Ç>4β[[Wg} c60αWq'Z+ =fXr@Pp|~ ϐgW[2abɣyu=@"@fQ޻Bh8)RH7yD+P+~i1;<8Ƽlpr9?8 93&k8ux8-H!Xo1HU pn"RC$<)wU7R_X4A] uѲ7Hؒzᒭ&N,6ƄH"8Jf8SqQY@䣒PmAq5%zV/w/(N*j'htaYxK.oUca2diN7}\}0O7>ʕgzp.h)GrawܒJ4$@ *ZQȵg않rwF#+QF6VQV{mZ@[o zD,Tdp{FU[%\5f9NN&X,x\pλhz93^+M~k}> S+<|5ϟTJ|])fUy*AYz-%sSE4͑,CHRitz"N g5dēq\&mSaֺ,,s1TAY"F]7/JL'suJ:1~ώݼy_-kݸ(|/Q_,lZ+(-TY"+Rlo3Wh,#FK\RuD=Qܓh!;a1ژ7u]icaLYj uQ.v#Eư\>gN,>JD!b̭.!$,F61( dy#%ZMe-@H $c!0xmkauSg8[4hjas/F}Q\އԵ;GK}o>l`s3WW ~{;h'Z)gpۙU֩Uխ㮆$bһlh}5(4::r'ݹ;J!˝{8;by0k{|\[}_>bw7߻qcs%)Q"%e2S+˭6_ k??{93O?->={` aa53oY^;9oV.>| Nqi4Js5Ky?z^)tCND+.;gǙu#л3xBYZݛumOΦ櫧u/}_2,s\gׄ.FD4d.mv ~ϓ~OXc Fg'@?aCBxGŢy7.q}KKej*S2PkQ(>u9!P0;Z s4B#F@huBkѱBCH$@@q"x4ղ\rrrl6g&}M^g?kcTK\ f!Ȳ J ?⏈>!vm{[-mKoz07޼9^}>0zQ$B L\|UbggW\x)63/MX,>l?Huf_aY 뺵Fw1nYw??9O=6J􆔲 VUU{iBku3eP%f)Y7L&۷E.=~r}1`0x>kR]"]'W](Z)UFUUa>c:b6*8$`upp^z鿾Ϥ_ }xET)J)K9rβ I@k}&81$ a(r۠a1oL&|O/vww_ ײ,K։RB{ou]7݋~=zѣG=zѣG=zѣG=zѣG=zѣG=zѣG=VZHu.ɘeXIfII*nt|(1 2##GIMP 2.10.122021:06:04 00:09:22 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((wn7yh[\Vx_YFȜȢO\Ok|a6x9 gODeOEv_K U߂. 5\qFsڎV9J+]/;Y(ĊOMPZOFT+ EPEPEPEPEPEPEPEPEPEPEY"x "~WbA@{ڀ3!n #<jARr(-erɨ("(OZ9)QXwKkvmq]It* F14nDWyx N(?/CBzTN68$򾕬+ĘTqv溾M!}rACy\E ѦKOBs ʌ?^?t $rF###]J0.?xgtGfI60t'>&Z[?Zq zގ*( ( ( ( ( (;ok׼86!s^CM_ z/p uަ5*mI0,k.D]]\5TUerR2C[gGO|OF.ŴnZQ6DS;Iq'OCQEfPQEQEQEQEQEwH# 0G K*-0m^a$s0]Um6 vX3g;T<x K跱ZP` M`4-oE}g(# $,݇")jbma;Uhْ:̰S_Rq}OZvvjǒsٝ*OBj6ӏ9^w*+XIðԻ?'ao}BroʀZ_2q "1E(-^G6V-ҫ_vZ\ކS@WUwRNS[bl*Z7xsAc:j{kX`kTU% *EG;֦rFڳY>],nܑjIS$bI!@$N:kwĺI#N›$g9sW=XIQR0((((((EU1hH3 1;aN^kiCun<.&rQGWQfteIvhF}d-Bv+ulFr*\j9z/%`pkXk=.H J'k]q5fEX ǝ$ONH#گɊi`mJ`}ְKGEEyėpyȯD&P3^!ljb02mq$x!B5JUܷv]r7N=Z,(((((((((֩=QZEiKN,[ 3>~M[p^ M<=aNc|S$=jN-sgVn$#9Y mt !Z AhUnwt}n!)i SJKc-$X9:WWOMG ݓBu<:Қ4+jQH<ӥ0.dW?=6Y/$ZKj:K{T{9maɓJTvynzߕ57]\G?q\O~!4AҞ)г˞54:eU9^+Kd`CA `5O6y*` =@++.of-SΑvY9? ; [A$S*QEQEQEQEQEQEQEQEQEOd+$o^Es=+~9*sJ!idH.Knp3xHQK" /֑v_1:c[79^3' wYXՆ tr}}g]7dkT'Yt]ְnnX"(W9/ /V RBiEfz3ߑY:p#*޹Y W5k%IusR6;\F{לLIqјֵ}l X{iAjCaEV ( ( ( ( ( ( ( ( ( (%kv- tԥk{ 2-S]IgrFp1I=VMtGF|5Gwk :?νRd$*}{+}Ms:҅TM[ufsОkvy袎H ωu `X-dmjIW/#cԗW2]ܼҡI-(`QEQEQEQEQEQEQEQEQEQEQEQEKֲoFFn@ HGrq\M˩B$3]IO#;z(((((((b][%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:04 00:09:22;] tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/logo/000077500000000000000000000000001416353147400175135ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/logo/logo.license000066400000000000000000000001451416353147400220170ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/logo.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/logo/logo.png000066400000000000000000002043051416353147400211650ustar00rootroot00000000000000PNG  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.1.0/src/pictures/player/000077500000000000000000000000001416353147400200475ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/player/audio-volume-high.license000066400000000000000000000001361416353147400247360ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/audio-volume-high.png000066400000000000000000000024641416353147400241060ustar00rootroot00000000000000PNG  IHDRj gAMA a cHRMz&u0`:pQ<1PLTE`b^__]\^Z5g3f``\Y[X4e5e[]Yegb.h4d2dVXTWYUUWS\^Zjli3d4d4e4f+Urtp3f4e} bKGDHtIME õ9KIDATc` 021ceama399[۸ n$Q^v0?XDXDDTL,,! %-+0(*10(ttO 1k0hj10hwuM5i: z  F`iӺO>S؄Ԍ,@@ A]!l r#"OHܶ= MNIQiY9;v恅 @daQ|qvIiIY LήɮG.LkϨhljFB&bOV%tEXtdate:create2020-08-10T22:21:29+02:00ɳ%tEXtdate:modify2020-08-10T22:21:29+02:00!tEXtSoftwarewww.inkscape.org<IENDB`vokoscreenNG-3.1.0/src/pictures/player/audio-volume-muted.license000066400000000000000000000001361416353147400251350ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/audio-volume-muted.png000066400000000000000000000022311416353147400242750ustar00rootroot00000000000000PNG  IHDRj gAMA a cHRMz&u0`:pQ<PLTE`b^__]\^Z``\Y[X[]YegbVXTWYUUWS\^ZjlirtpUWSUWSUWSY[WUWSturYZWXZVY[VZ[WqspXZW@@@333---)))UWSlmiXZVXZTWYU222XZV\^ZY[Wӊ֎UWS]_[ȍY[WŒ¿ƿNjˤ++졡%%JJ33 YY$$11(LtRNSk n{cg    { bKGDHtIME õ9'IDATc` 021ceaa"ǁ)&&$*,(*,+*&⟊&&_PXT\" *& RAeAU2 5u r w+)*55(3wtvuUT54zZ'L4yT& 3fNP3Hxʂ`aS =;=W7wEX: G+xyW\%tEXtdate:create2020-08-10T22:21:29+02:00ɳ%tEXtdate:modify2020-08-10T22:21:29+02:00!tEXtSoftwarewww.inkscape.org<IENDB`vokoscreenNG-3.1.0/src/pictures/player/document-open.license000066400000000000000000000001361416353147400241700ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/document-open.png000066400000000000000000000425011416353147400233340ustar00rootroot00000000000000PNG  IHDR>a}iCCPicc(}=H@_ST E0Cu *U(BP+`rФ!Iqq\ ~,V\uup'G'E)IExwqeY]cf:1 B2YIJwqܟW[ 30muMOa%Y%>'5ď\W<~\tY3#6VژLx8j: YU[r5_K\9$ "T2liIDKRȵFyTAv[01%@| ]QscigJo+u`ZK}uKS`ɐMٕ4Bx?o@h뭹 C]nC`Hkl3~4~r cHRMz&u0`:pQ<bKGD pHYs.#.#x?vtIME  zzTXtRaw profile type icc8SmD! `|>a!b)%c{lYJ覆a-JZi@Z46dcDCd}@lrШddQ@ W*a2_ޯ*F: E\0Cx:t9H|BtL<=| kXsq:-?;|r'bI# 7Cjui;gX-87n5}~EEOܞG|9 ծ49tIL U gQffO_n_κI)%"d3Rٺ8[ [M0Kc2g񊁶m&)rjQ;k\˄l{<]66{=yT!H4eY.F;d#Px KSJyUw~zvQ P قIDATx]i%G}Uy37`lcd#B))$D7EK($"lⒹD $l[wwfvw}UCuիߨ5:Ν{/$Z=E\# D# EZ[I7Q7OP.ʠ|w}4t1>?U1,&a|҇jqB֛6+D{"QAIc/\GOs@&m]>'>\.a1 qtᴢw:|ӟʹy|;w)ow]R bq|*jZ=@&e:Cx;!(R* E^3 Z ~`ԺK%~!N6# B5`Շ!MR ,`]T:=oґ$ U"Xi3pܹ{c$@4R qv~VLp=0TUi3Ν;w 8iA#$@Z栤g !Q7>gDH XY^njf'!ЬY*uWW]č0. CرcpI0Mb@M~ >,x;߉zx]>?r]  p@Q!):ng [[[ I `F*5[1VbR /U~;^׌{FӴTowcWF) p s?N#[Sp3L@QdF)d!J)3(a8y$J`h? B},MBȂJu65%쥗^w}2tb…e&8JM7݄ /G[4i7MOE b}&\\%1#E3Le|21vR%o<wZ@V^׾w]WzaIzz=4 a1SHy z$|۝J+x"nZ P8Dl&exl6vD9v.`fYՒ`M"ʹQ] gϞF Ȑ{ƍVṠ`uܶ@<`Rt:i]ol1Ll}dl@c;dqq˲8N}ǥ.\ R2{ 81???r;nvhjZeYS@^XZZ8u}!|G~O@j<8זa`Cfuq#સPhA^Ne+sa7ā&a.( a'Æ]|Y{bmY5.;}4vvv9[u,..\a1mpE0 X@0@|B. &nl >mmm8J=,iຮ3N @c=s"c( ce,ܓpʟmۑ8T g|LLb !D*~ce495k~_%6t)åKp/W^Kl HJ/,7_(q٢Q(Rx׻%=>QFV0(hZK=8 wi6+!W!`0RFbGyښE)vmR_[[Kl:hJ4Ҧïkq#LHK m WUwn+B{]-֖/00 *%2ƤBS^* cc#R;wV3&y2u;n*߿{loP"^zlNв,ox/F7۶ZAiμ m[ulB=iUv- *[wgZJP_D8g-\|YJRc=Ħ. hBI \1o0lrĵY.u@UiYe9hH8Ndx6\^'Soy[p…X珮ke,T*,B~% @0<z^HjZ N4+}Ob>$ Ͻ x`PþAҥK>E~lr' K}ey$M ??ىO]k:B^,V%XXXmہaW+ep)R|H>4w}^~O@(mꚴ7-L?x[ `gr_{Ebrc1t{ɰXY3Dk íۧN>Ù0je|^CU cz2{Y,,,\.bFgNOw\w-|rafSþ"| Q\O pͥ/^V>fMK۶eO$BG2@;c8H#LWa\-D{KKKVjg/ͮa&TUebބ0,#tr1NGzl!$v$5zŭgIl̛I$7Oqq)~UPt* x9)i_׽20\ Ylw*\od6hu讟v+Y( ^˲cӧOqg3x> 91oOw-a8WA)CpC)'y_AP.vBmò,yT*imoVe߰<ۙ`,xlH{R䛣g{` X(``B}cа "j_wvvb}ހЋ@t/m{‡;s}ǃGyBc\X+$3@677qĉ N2Y,7TT:}/Tz'zԫ F@)Cє@h۸'xAer",2WR Nmľz%S WB#tXQ:UiΔuTmx~1 DX>^ i3g@4jPNsP|>+%@O = J@C f)ڶ-k|q-*(cg2  igC=U9ԗ OITnmnnbeen /s0u>2X'kZ33$3u)W$f ---ayyN'qZSQ{Xc;}x>v2U.N7d.힋ZC aRG16mL&#y ۶;L&E~y!/?NQNp?bBށ=Lrt0cLn8 B`w I @^Ua"DώGp`%8r >ǔj1(zi|y;a@Hۥ" cC',b;~R1DQaa'OqTYZ(rRXauDLJVE%@.c,&!;uiٶV%''Rn;t(zKMPg@X`?(*\&}.Ykޒ/]RvCǏG>2kYhtxDw:.M5-(v_<@] yt]߀i<9BXaP з<- ( яM.B ca =?0IJ,Ei+e_;NfDž1! W!%x#?kht wRh% "Fb ^(ڽ²P̅$@BM~k&-7$HWys#p8"۶f{`yyYne14!ώM) dr U=̳oW F(P-WVj>}eK5Ja8!MB.K U 8"c h4r9H$2w/Ιd {Jk<GcF:il4G88øUp pb\.'#JT 2?e[%!*yiZnpLƕ##}̐3uiJZڠwg20Tz<`|ҙH܌jՔ iOÄ)#4zJ\N>3HٝRt:; |b>grPO)kbg&1t`ee%0Kh2@m NA bT4$(큂}14}Pa'1@]Vjˠ<X*- ^Uώ+ ՠ ѿ/ѿ)84nJ/{ɡe%2\a+yq1L*Ե2j~Q M۶;BDQJ1??/2P7-㫋>х*9,9U.6c>zvf 3J}igrdRo[Z5X3/Ϙe!#VUZg z2V;t0O?tRD_a.cJEf&c*):phHb3;r!r]ͩUnN>Д%#PJNZutn%o?r7{Sh4-8.osuYf0V%M2`~+ˋf3AI>tl̨ ]Xg^#)joX |6pM7MOF*|jdmz| /~#av$&n˝n]@ WwзYڞ¯OTR9 Ƙl~mvL޻XX,w\`a{s;=ſgٕt|U1h?,J"`_r)rq]x_o $ U\2qSӆ #/>xMA]9W5nteZ bN1>1ZZ;>u5|?#$tnF׿[\2KePb`Tcc@FSy0#뀁FQٝw"aЕaSsUǎhjˏc)#.M @_0{c$&R*aB(RՀC؃<. ~1A4H GTKe Vɐ|j'I I`-Rq-_m"# FƧq ; ƃ 0 ^^n>+/&"U.FM|>1N8gGrhɠ7?<U8xĿ U4/<Uٮn|o1N2qS^_+ad|u"CZAg((|)@ϨH$l=+C|+uaյ{;7ge'O?@Ώ>ƏFtȯ5??K C?T__hgG?^ B?Th_*<>A-.xmvȹk~N?d xVtC ֋.@"}C3ܬP@ѺWTںW(w 7 ]S{ں(7Q^woq]W{虥ȯ:8G= \3^uoq]W{Wkj_[Uz-_گ(տ8@Ey= ?o'PQPE!1z;Ï ]]mJCk_6Eo(($%6DugZl9zN-iH W/wXkP-Mnnۻ=?Ht(Mq±?6!g7~ ?!ooF?/#g~^6?!o7~ lCנ H(Mq±?4!g-7~ _H+?Kנ HmECooFO?zLWḿJ?7s4[}.}VF~"\m`zn Wϟ?mJ߈<3 _>xym0\r<<;EPi7q>N6Q^C1 s_9k 7Q6zz9xTkw4}/rz*<=?`D!A>M{d'c݁Zx-g(>r;?goԖ$g =?}BP7h'jz(ڼ ECKo~2:?OZ{4}ߡ nz_~Z{4{=? ?:Zhi~kWW(ܽjߡ6 en^OuV->kWW(ܽk}ߡ dn^_uVm9 ;9րJ|SWU!F|muk,~W_76Ͼ۵Fp`n59J(? Ƚk} e|sξM(Q$Y0x1`6`}(RPmfj_JQKkW?Wֹʰ[Gnsl4M7Z֣ [lȧT󯜃UK(͝6=GCT|'yfgR\p[E͓tf:?_Z֠6O~z_=O'wQ'_/l^=A4OGْzh̓GiI@d?$'_rwP'?Ɨ.__'i@ /?ƏNOj?֠._~jlwc4HWwGXZ\fՀ.i}+a-s1Yfyv>;k(?lj/#V ^~5{~f 3fOP8R1UOGҀ+W+űXd:b*VsHU,χ<lssOOtjm>OEjr͟n/\+dG@+Q)Xm.ʶwSDԫpDs7م )J{#IEǩ?%OK#5/y? ҿl`۹c}z㢫NWeOtQۏJ9P]~q=?IۏE>TeOQۏFhAvXmEm٢TeOtR}z㢫G* ۮ?:(uEW4r,}z㢏OtUj(]>q=?UI9W`,z㢑d ̮~Ps3vNréǽxΡ}]6\n8' u/A n?Ҁ=TXiVKLVƿ'vL~V^(ck{io[k񤛯aOnB]L N "(撊+c 4PњJ(f(RQ@ Fi)3@ E%PEIQXBHTroONsZzJ|9~KH:/;m?vc?m?Zyڧ:GUGW_kCۿ9Zz{ خ##=Gz? Ƚkyg{o elp1W9>3-߬n+oĚ4N9B|!P5+{A@nBILPkxXJo$zqVm ֮}kj15?2S Z3IIZ)(PEIE.i)3EJ3@h'>xXw*:(Vŀ==i-4oQy75e?᧝8Hn.-dk`ek̫-c ?/Z3^y]nF2ß1px1睇α?z MiN$Ws*¶Ů=~ހ;lT7Ry6'?Ycxxz|֪撉2vg(_I'1&=+ql_ V&6yE\Rf-f I(h%fBSLIE)$`QEKnQU.6i1Zd37s*.c9BJ'ry{ӟv6*zw?_}Q[O/oٳONW5W߇-4'_\u gW1\|,!GM ښ7xnQLSLv+gW!ˡmߡS\Qo MG6}7syWNoJpos .]@$MKk=o7z~{j_̎?cS_?GOW[OѿKt7RԿ/ _Bz+-G%o(Կ/ _Bz+-G%o(Կ/ _Bz+-G%o(Կ/ _Bz+-G%o(Կ/ _Bz+-G%o(Կ/ _Bz+-G%o(Կ/ _Bz+-G%o(Կ/ _Bz+-G%o(Կ/ _Bz+-G%o)j_̃wjvȹ`\֩$IypTc'!tEXtexif:DateTime2020:08:10 08:32:15GtEXtexif:ImageLength128AtõtEXtexif:ImageWidth1288tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/player/fullscreen.license000066400000000000000000000001631416353147400235550ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/player/fullscreen.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/fullscreen.odg000066400000000000000000000221231416353147400227040ustar00rootroot00000000000000PKiu7N.++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.1.0/src/pictures/player/fullscreen.png000066400000000000000000000155251416353147400227270ustar00rootroot00000000000000PNG  IHDR~~/ӹwgAMA a cHRMz&u0`:pQ<bKGD̿ pHYs+tIME õ9HIDATxy\u #Jb+!zgV^ȡ]V۶niWegyx"**&8Zgu-bR ܴM̤DTD.6ۮ5b&Wδ񯠮GDDN>cWH]I8y5_ElO]Ilkˉ՟"!$θ۶;帥%mP%t~mw.-*+d. A!UԵ_q}JE]h~; 7L{k_]?ˊx>+lQr?CW: PN]8_w_1B+ȡ -2ȼD) ѻGR[;ɏuj,0dU I~,%+h)3lzt~W3Vn ub@WHcY}n\^_{{?eB]~EH=JGA!UR^Wi54H]CWҢX)U{?t~u!6WEjԵ{7t~}5Jz+2ro՝W Dd紆;ia{3t~8I{7t~YUV,FJ1x/t~Y-zbXx3t~9519,CݨGe{gp8Qx/_F<VGp =B:w[eQ;&-3VxH:L|CKx,d>&x:L֏}̦#G~<3%L{diQc>{FS/t~W\b@_A=.o/e>cSsDj{K :?w>c;C=2os'87L{83Bߪ␠Ryt~%}ƪ|3G]hۊCtv1zt~>}J3f5zJwb=8>:z#%2z??ܔ̕~rſL&WYgdz t~NvNUbM91ɦD]G~NN/cW/{z.lZ{xA~~Cwtg |`-f[8bW Q9~:Z%Aݐ269Fסh)"blt uBw'OGOA]Dv u 1s?>5.3SנN< #W´%A%7PWQïl ,B}]9ggkP#t~u&3W# \렮Bm]~gEMékP*vzôG'k֑^@]K=֡MMAm%`𧮢6gURW&g<`_ɟ.B]KcFAM~Irhq~wGaT;8&-Y?sMkJeώbΚU_o4K<7Xv]WQScB5ӧpbQr?u-P ENSjiF:!Ҡ3m{ow6g҃JkY\zi%cG]yp+S:W?ijI;MEΚo&/:сpljɋ Y"+DžϗOj{q3%͞WNYYo)2w.5@R^GD)$Ysظyհ38^0w΅ʯ]6eE)}SHkGK4Y8#&{/~gSu_n34qin?'zBm悜h ȉ@o̹'S+JO7pg[/hSo;mi>+.tǭ1_O`ӿِF|{odjZ"njlmpHqb%-t=&Pj!kHj _U5+'f"fX}`m7J#Es-_O Cݦ,5Z̽ ͕fS\I -;!K͎ȧ ܪ?ov4N& =DS ՇB{葉E5ߌѵ PsM?*OWvKqo_%u I]Z\( k>&)?GJ2y .<Ʈk+q呒L^)?7q2g͡&Weg nPUȣ'?9 ;&yQ+vb[]w Q SP 䎷$x>{ϞcKS nYC߬4 \_C1jdSSR:8Ys նQzܺD}v)5)#||FR\N,ƕ2P̕-Ʒ^_%޺?p)KqF x)KwO^\8{ˑ%Ss XX9VÒ]H}48{^~Ħ7iԃQi7m1{^.ޝU#͞fѴ0{ީv>2l۞;b\2azxTq[+v*,=-3nJ)R5>qefܡn|p\,Ʒ^ .8གKzb\1~^K|_}0QkJoV_* {|P:nTssmsHhzr  6ݥ'"mĺO+mJYoQjBzV}Ǯa Ec7+6!U֢Gg #7-!=!ݕؒJ>E=9`2u'B_S+~kpw <پa_5d\)ⷥIn5,SE,i5LW:$d cv ^gX?x }cf,gS [sN!-1#lk*Ni+]w7Xo:@Y%3ecU}rG;=nou-j'X u% vjHOtj~ (ჼ-Cׇy㱯 ͋|ჀrZ*nqٺadaXF] Xm9dqR+V=PWq`dWB+1^b=Yu- Uk,;cI+<>?~jx"JB}j+;?c0gnA7݂aϦu ͣs?ci#6n.Qiv"7Q--J5^KVCF|5i|h2kph:͈{).)T~Kt^gio))1ǯ#].OA-TjP3eqRHMAM~KsiEA[(e s~ mϋV.DAە&j/Vk/*9*_ok'?CdB ]gGɟ.B]Kq&/nS+Pt~.75X+M@6~U :DM/? u ї_'k֑^@]K ކKwzqS:L{\`י̥AUТp AwΞF]í!ҡ4(F*jUMeU:KJ_=) En*vv]i:Ȏ1zόA])֓ Rt~U-UYQWN.󯘸Ʀ.A]ܨtVn}{ FlD]z;-v]XD]=!n3"sӹVFK/Ś_ʩǯfnjuOi<~5t~eGޣ;-.Q#B98I}`Avkl}$طzjρ_唥ʮ1>w:?y~B=fC"`66rω;NvNUbM91ω֡}ܒ!|`;rSh2Wɽ3m\w@&l:2i :?Gu?(:NΡ@ۡ]C]>??Wr_VOME[UTJ=>oϙ7,/}~z;aÝSwv<K=2oϝ)O}eP`^ms : ǯ}e"gnTD>:,bz巴A}9 2ṃTX|Mx#t~VM]gII ,J@WHIHGί{壳Ե_1Y|+WP}.IAN`ڣ 6l3"~z+HW+ZQeuԿb (Q ,_+ _aq؎ǩ :2'}@+nڿJôGq~&sY *-i BW_3ň n㖶9C]h ==lyKD_y?wnq L{H8y5_ElO]Ihi~UO:?kcɕ3m48aUkk,CiɎ|V/Έ%tEXtdate:create2020-08-10T22:21:29+02:00ɳ%tEXtdate:modify2020-08-10T22:21:29+02:00!IENDB`vokoscreenNG-3.1.0/src/pictures/player/go-next.license000066400000000000000000000001361416353147400227740ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/go-next.png000066400000000000000000000513741416353147400221500ustar00rootroot00000000000000PNG  IHDR>a|iCCPicc(}=H@_[T !Cu ZQP Vh/hbHR\ׂUg]\AIEJ_Rhq?{ܽS͞q@,#N Š|Ea!L}V3_.9@`/dC&`ה> 2C㈔~^eLW/0[s65g^2:HH#SrӸi 1|t4lvQf^M2)dUn/ *(RJ]"%;f"H* Q3^IDATxy}?3=, ")IQEV'q\JQ\娒rJ]8XK,۲cKV$lI⾉kX,o߾cf\={ , hۿ{fglsw# L4a+wS{wމ9m$ L?wsk @ہ 2p, @{d#@'~ y` @2RݘB [YwKShTْb;MJtζ$)޽@@i>ZN$eZތ%P aUށYɵ h{c|8_6J@<=G ;|E AQ4mçF h@kyl^OW >*🁿ynA?#Cc#> xK=l=ܼk6 eQT2Rɝy:^ {;.A^ 5{ٹilDi}*6]4])4pXEP}mޤњT䳟O cGYpZ? q}W et/;7UѾl&R+8V DZeVbС*{pQRPz\lI| U}vl͆hvi]6kTdW09)Ԩ+R1Sv%{:PAɟpS EwsiN].Ã<|Oe1gdD O~B TL];h Rw?̏şbw5J{# ~\h>/4x`T=ش'PhYsx|ZaKSƶl:cC3%mzft͉C _YzʮJcAh!@ iMn.\FYvjƾҊӓS- ؠ_7Fl͎MY? Y9<(|xO4)%ckXsͫ``8O@4P~ZZրVOAiWgNr7o營1>|@(OFWGC>0`nvnXl"(2嶯t&JilXeLZex`9k-gQ``"?hz)1!09HѸ֊1Q/ Aswbw\1,]\Ĺ늓$A`BtZElXE~CCkŮ)+8#y+8F ~ ds˫RaEqdD6@p0h4\{[ؚ1>G W)Oj?O4e,z]BvsrsJ7 htfivfqU'v i{J8NZJ:qBm@0x pόx*}ßf88 <$K̵'- 6̓ϲnrzZ<67N*.~aҪ%EXXy"3">qRZ38N' C ~yM}09Gfx3%e/?;JF4I`-0df _RJ;ǵ3jk)e:3*uSMcl/5[x^,Ibӻ%VP#꺜H&T`yHı&-;Rfbu1RdW[3ƣ{4*nf# #dt>cW-%D"3G*O&Ũ\5{UqHnҊH3@F)iHo)+9| b#ZML~Jmd]f>tط{J8v 5p1#Kw~yE$(hvL̞C ;7606eTLBDA MD|r" qmKH,6m^VmVTKm\܁U@J<WCxx-n-" < E,{H(3@2EF 0”Щ\;(6 JwQDžWu[y>. 2HahHЏ$FӋG2=ӒB!5/HV\,pUDZkΝ-mt?CQ޾R<,[W K@=c0n8Ӷj#.9WH"Ӌ(Hm-ĕ_d* O@ )L`Txr T@@? 1ҫoz(}"Cb[u@>ZN+tLZN"ƜBH KkY.b[*N]¶֎$`l`PtgW`: `hsy) bb$U#ZkX|Ӌ0± q6StJdJ "A$sA$آmq,zF\$Z^%--1J6Ji~@A^ &Q#@%7׆tHkC)m7_!,Xe**Ox˲Nw? PBsBeP0;bɴ* hvj\uGsQAHcԋTBbgH(tˍ@/03j OK"0h8)}IGsNp(w/c艸fVdWB9:6A  -St.r}w|_1H$RXecI ),kih{zi]b]T%^|!$zD ~yJh,VEuO6%0oE">yFjXb<_~-^S],i!ٴ 6@'}ZFЙY$@ҊfgqF,ao߸-dbA=\?"D4Q'6˷௴b\| Df9$zX%R*)DaL*$@gcJυ6|SEAğ+E>~o ~yiT_>-`'nji+tiza Tc$ "eLyPl{f6mYJq ޾7x ,?   qji4x=`Dj 81Ap`L*T0Lԃhi9WM fHLO908Rײig&V<.^{geli@| {SK  8LbNa _4BL?)62dtHi%ZQ@,E1ȋJ"Fl|?ƚ*q1].5?W[#ٿ*I 34 k59>_9g`ۄQGL@)R䊏'2?#iϸ֢My'&"Wxcc?699šoqwϿ\ͽZH:ƴ]*Z> c6NӜps_l;Z+}Y˪{~ENeyj F COY#-S?Ң=eF+T OEH]ŠďIP bMՐ-ire&f W:w8zg'_ñl;M7韬-:7sd^0AOYn,9s/pȊC#?<9FVdZ陴DBn[ bF7S}2#i Ba>Z0% `>ɛ'qvV: |{\MT&Z8nlc6o-O$b:'&SD|sPmB &bMQ $^zFD\(|ݡbmQ)UR>.^ܘ=R`QBx׽q@Rh:idBJAlVi)/^X2EQysԋ%kӫ鐯qznȌǀZ(4#9 VPJn>9ʼn't- pk_akF/ixsgnS9곤XE $ȌуTamB.\S%=W82 E쾉h?-ڸOp"Š#g!vWtn?UʶDh9a'^M$Je'[-@ 6@c9j̝QBj1u :Q[jZ!A. %c>֑FH;\2ΫǿK3Ljy)&.Z:?1E} +PsH>P6w *cg/RyB=R䑙/BˢmaS=%ҕxq6/!x. :^Rp,%\G( ett )hQ`֕jrȟ= 5Cz@P 9- J+\2oq96ZsN53_Se Grz2D|8@v(`F^ā@͋TljD1%0Lv7Xʊ8P|V.R+uOah#t|8}.5ʎ}k_qZ}k=++ v_};o.2I:myy.$QEȁQd06v h`a(@Z+Kyr'STN7:ivQ/t߹A/vSwQ~@ 1/)|QWɪ"GF*gmȏc4.Jw3N,ԴmHFpESIVz)*klHu*.SSӜ>wW`3Gq:.9EMӖeJ^/{$@R$Hg ITg`Fi-,H!LI՗ i4k'yy\$10nп@܁s]U{ VH.33s9qWPsJmWZ37~IHYzhrX˚5qz) ދ<}mt|@#7\m XE:E,ֆm^ ˼HBQdydSJj[9ƫ\>oPz=nT$-i@#0A5 43 6D P1G/e" $}NjwLqODOu~jt=yxR˗ukr傼/}k2mlbJΏ3v-R4D9Pt,}n$)W*ኦx&/kшOx {05{/[b.h Nק8~'b[` {wMN: aai?^ Ppb4CJ{\L\|߯ P Au4сjFcYvBᆪ1/}m`Ӛ͉)N''e`BА-9 Rt.SSyW0u#X3Nj7|z3EI/ltXXg(zׄms\ؚزuw=˘ӹ!<%=CcnJ ByW\7_fqZIf._<~uU=b|ú*z92_lHRoy=nĵ(ξ;2脎JµPYhG@uey]ac} emY4M.]Ʊǹ1{)Ab_sǿ$ktͨϖ ,gOYj©oZ BKG\Y|Q\_ѵ4 Sސ-"8Jki)'Jh0Z~m4SGh7|e#'r*}o^St@ |~:w%d(:V_t6^D+dyz@(x5FDZ^Ǘ#SLds>?BE#((Z{5$vX%\.טpѠSg͠R~Q.h/"V|N? wE,:VtJRJqD(Ĝ EQg+k+qXq1N^8Lm*6ht}I2J(Y@&F+6{l;Jh,²bH4wRJg1oD )}]O]A)E9q8/ H E剗@ݾ@ٲGrRTOdP,SV,'-zW4zg"SB ))/Jc1pi[jq`+^Иor5^x]l)>5x!hr+([D^*&fAgE^eg+q[DZʣU!xiD b6׷T2&g\cX6ZqT_8ys%A)iENJ$@/ " xT&W~/Ћ/ i_B-ǿfjtV>#VLMs9z"&7: pMLFlzԷ1YhPE$'~edE}T$eKI>ћP ޙF6nl=hy%+xMΜ٘bYeZУ%FXS~0RZ6]Gȹhv\c9#pej/_J Te>ʥ^ "<\v1ouA ǟH#Da{/?Kծ#(3;q<@ձQzqSOGjQ[%$[ȂO>"= |$0m_AQ6?cԜ(>qCrq$]o@;K '% @EZeT KS'Gt̔/Qc!QV?moXk)]l(= Gv]n\g9|, ,a'tqVα/š,2@Wde R+o9Q]9 -YUl#(%|OId}q3RZ| q8tWϾP$ym~J}T0o pwF]/p7 +dI`/y$)ă@o^>$VMl}Z}{U.Ob*XmOftF؇Bz{9D׏ EeE,Krs0.2h RԭuTmZlsGm._]_9u5h'{mSK?YKQG{~^ȍH.^Vfcu'5g! \zW:XMXrw[@]Hr +"Hre\t/?sMGIώ)YeRʥ+\u f:5uYXuw?p2,'teхn\>e@g!J&5 ^GrafP VK0{]}P @#B?K~a^ e,7S׳XlQ[WRWhK밅M ֳ,.8s"GNc)[:羦X9@ey+!zc!CvDgOY="%*hZuͅE^K8%$E_zAHQBf/E~ VU{d.ؿ PTg/</@/ѧmfT w_A=[X) V #)7 R._t~/_ZHTWiYN~׏Di! ïMޣ~/*i>i`?ĻQ&[W-"q HL(X-)q.q&f1RZT]~{?7m 6W&GUKMXWd YuЋ~^"|tX)NЩWٸhkN]~}'yg;S8|իwERX(ר祼)Q˺׽6ڼ78s([ mVgݖu(3=޲1Ww:h@"R֚kܹ=huo|SI|N_T[e`%F; dSQgemlRȐV ¥t&7.lߦ/` ?7e:&yEJ0ovAf*4 aع `Ku_ *5:{J%ȞE~O>2ҚxN<چdEaDxOMlթKXS5km">ޫ i_$f^;LH7 *;Z[?l6{Bwj۰ފ-kO= /Ej@Zh6fym`q_o5;a?ueXIfII*nt|(1 2vvGIMP 2.10.122020:08:10 08:27:29 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((ff3/_јMZ|o$g#^Cu~мa^:RKgLUG;orp7` fүtMCgڢ6goF3סvNlc9kbU/SGN(P((((((((((((@-?@- Kf5=?^TC<+pj7uCA)S1A%&7t3ګCynNlerFpsڽWK~'\)0Ï{}k)SwD8tĻۍǹ h |mH{W hrixc'@N>1jkoΚUoʢ+(((((((((((+<7 _k<7 _k1!!s"DCyGOMUJ?1l$Qmۯ_>l $=?jpMY=yg6p`];d+ص0>zWj{r`{zGUc9IW zsYU؉Gid s5W'xet|Ӧ>vS3zUzH娢΀((((U*T=+9 k-f2ӑGYOQ_v bPM]c<??<^c?~ʐrD/G"ZǗOԏ#?ʐrD/K<#?/zʟ>H_<GQ_UڑʏHG8OxrQ2U?ҝU;Ě cYy4f.f8BsIL69__^t}^؆'>zV5nPkgܧ[Sm%QFyϣq>G<>^ygoZqCޅ69lZ}LmQ,~0мU+|>oLv7'p+ QJjUm+:B(((P+T=+9Sg6'mUl:L1K34r1qGҊ`>SisE\ 84Qp LIJfii4Wھ3zVzW1i|֏mJ.ب3״ ߁kD-JH7)zWxóinRQ Fڣ5Myq=gO\}z9\޳/n|[=sc-Tzt6W:k;t*+qz)QEWuꇥyY6#> ~V*mTOt[q2†f4{f4EntQ?""-+H[E _޳-g:z |]4[נ+m-M__%osu&c-;~Mۨqj~k.2`ey#jwIF#_.@8we*?F񠷐b@AM􎀢(F*|7 k13 ?/ Q+s¿5bj8қxدᣒȀT1O6b^.n/dq&Pu[ Tz%^EWYQEQEW{#\wBF3/_1@N Bj64lv?\E%Xp=I_yLѭNxz/i{?\%GG%GSHV؏8h{?\o&GK QR,h1{?Oߧ^L?&+XУק ?~z3??4?^ʗ`bGUtķpo\ɮLqOv:JTHF6v92)R^2zDSHZ[ڽԛPdwM>_Z> qu5{B-a=:}xpGz=GY.6j+a4؂̍}1^bT飡+$xsE鞝\2Lۤlelvy.&im7S=:0h^g]:j(4 ( ( ( m_YGϱAOFF2VOsWM[~+*aKW.H5#տ!Q ? ?²RU${(VYtQ)*=OH_kGC_(}Ƨ$z5 rVv .??²j[*N$ =dMz?q}EyO*kOWT8%CO^v9HKkfo֖Ot螾lY^pgSޖư6ju;@y=!,(>ڢ%0v>9}+ua}CczЌ/g+Xz|^\|z޸yL=N1Q^ b{ ˈDSҼOA5CnΥxٜ ]-C#{s=ynMYcңyk6S/3zW =a&;yAEiN˒%F.Nȓ\Pm.z>CЎ{$h4cJ<;!dQEjPQEQEQEQEQEQEQEQEQEQEQEU8f1F BOA54g}GOȏRjzڝM1U5EIxM^{ھ~%VJ8bzlj|2 A1.z=;RQ^*PX ((((((((gm%tEXtdate:create2020-08-10T22:21:29+02:00ɳ%tEXtdate:modify2020-08-10T22:21:29+02:00!tEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2020:08:10 08:27:29Q-tEXtexif:ImageLength128AtõtEXtexif:ImageWidth1288tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/player/go-previous.license000066400000000000000000000001361416353147400236720ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/go-previous.png000066400000000000000000000510071416353147400230370ustar00rootroot00000000000000PNG  IHDR>a|iCCPicc(}=H@_STD ␡:Yq*BZu0 4$).kŪ "%/)=B4ktL%b&*^D=nj,cN8]gu>Us|",3Lxxz68GXQVωL #8\xfL#b6fES#"NBcg\e{s2i#E,AUP:)Rrrȱ 4Ȯ~wk''p~q 4j}8 \-|^ki#onip >)gMY`y5q pp({û{\2rҲz cHRMz&u0`:pQ<bKGD pHYs.#.#x?vtIME .cY?zTXtRaw profile type icc8SY\! 9 ǡ!zHXB2˦k aaX@6#`6 $Iv2@)hT22( Wa3o*F E0Cx9t;H|Bp&c\xz ?_fQȻxgaP5Զtp yɪ nO#ξWPKcZw$w|' ] WYVfO}|__ɆM)%"|d+RՇ<[ {0[so:UgR9Ũ71!f~Ks9esos$:GuyHKfPetA6y1\vKNwgo}$zb %?2IDATxy}ݪz뽁F7 BH)iٖeؚX-vΜx23dؙ$g3d;hb;{IbQR(Jĝ bi4֪{珪Wukyݯ74ޫ[nݺo[(y7[u<ÝusOzw.#i~eZ{7{ogɀ?(p? ` (v[K ׁk*VNjc$8I㭷{7Z>/. <,p2>ڀRP~-CsBڌiCA50PGoRk\A?=+>"<Mg070?i׮PrrK8 !? mAiZ wcw<+%ӟ+i 0vp)'JP;ϱcl3@l=K(w&9}C}}ܾ mnyre&݇w};hGn)=l#E OLR'9s,#ydz=EqI 1zf|d-Ĉ ;P9?1A~N  mGZ~ m\{δGJ:WAmqG}alp;L@r}.:ÂwHy!nG> |9sn*fWXO_ARֱjzO6FЉġچ?h3_E}ސՅ ]K >̾SrYFFinR_+8'/LLxo09|X<(;G_ R} q3+: \j' < NZ{ѻOP)WPʡ٪1W|;[(8_2wZ>0x1<06zkuf.^PBMw$b]B0?jLwMၓp m|famkoPk/*bЭ+ @~x C;C?ƁR*6KP8än:^'/DZǁ_Ey;#ݹr4^bcnFEw0b!*5ΣOz<8绹C}WhM|*:\)z[o# 5`p@c?}w=#1Z:י]+|:/ ޑ/gVݏshat"fε .! BK RցHӻ'AE'ă؋Z\dfKk&@!)I7;>­c9wUG>rOo9OI;vZm̮֚^a~PҟlٟPgj/ݓHyhN!!]{?C<8ʡ巩׸rU }H|I%5hw\yM'^Bl tƇw "˯ڜ@R}ACGdғ[^Vi(4Y1=?x3>q1ưPeV[sƏe`rwLu i߀z*oK',ø aMha>k.@>EfW/ܘAQ ޘ)p J m4[2!.FTPɣk<ĶTBD m#}:t?G1ݦ\Kh!o1vNm(@.}.RvSlnVET3'|6A L}ǹc<| a6+,D3Y!\i<0%v@G6"E F2HI/6):c,8D¾}ɕgG·WRۏgzxG9},C8,5f]L_6Ŧi7H{2as09C@Y21Ng1m{1CX5V°̿W2q/-#@Auq3'#:rm;A@ïܘcvKi)%ST`_ bdƋB CFFSmSȄy2c3ec1}]q&|F[B'|'" <N9˶~avoPk/Hx,s[kFcF`4hi`LOvL& x%DO-%#?Nk|̘)>rxQCA6kM잭gѴ'-0>kEfV.DC>Ub2'}$@I"IS> Q-QJQ-&I@t{ac|GF\*s+4ՎH`MjFZR6i6yZ~=)LZuf ci!6A=:W8ymRnafw+vU7ɊSO|m8[Ֆ`8ǚ)X's Νx{|?ZW:LfnDP 3)I"#uRl@"Xvad`#r.CUni !8BDDAm1hZP# pr]> ,G@k d.Lm}y-dL-[F7oHK]s߉9(r?mM]cnuk_KG $/-z #6'3>EwcLc;=ٲ%Im:] i*1vhvK3v!*P XbѶ$GĠHvMZ;;DΧIg>us ݗB<G1 MZ pO9x}bi;3-xwb^D\gz W1Y?K–)ds'+^fvJ!hk49Ɏ;U+T#V'ʭ~艿;RFXef +&rKk*<—q,yVYF( XI$[Z6&rʼɖzj RoPU _4'w޻g﷨5.g~m4Jܜ'\\"KM?H* &> DRmr>MA1Y(RM7D qs9,{ D|:|}aܬR "}/;OOfEY->M$B0:Хz4ILADq3ʦ P[k5;ョcv\uJc /ښC Hvg:];ݣΤgq }&6ci R'?>e QF"+2ZbIkPǀOR8wzG2mGˍy\d~G9ڷjY5YìoƘ-KD>3̱y;A`h-s\]yٵ xL7,wIZ #cB>i Dر8!6`[DLq`g_HGya~m˯ܼJfm~GURd/&GȨq;3|[*IAێ'c(wa̶o5e]ys%1FOt8>˱'چBkk˗khRX[Y/̨<)nMb:ZHIw瘎wpM щjh"M`r>J7[ ݄ڴoki1}dlxri,f^~lP .bR Xgmd/L %9ή 섊ʟpX YRm~V[V4<9i 01t;~{pxG`v ߡ鯀(++xL;7۶-Vi1X-`If>} r$H6!K`&@u;RU{C_Jc=>p!-_su=Ys$`Tq^{YwR//@Sȶf3U1edLy POچ=Щױ,i+Ѳ“KKL șؒ_Lq)'w##ݸJK= b>O/KI L-#@?þnk'Os9;(Aט[fjj9)G^&S˘%/"m$ !{"a|F={C  hj}&Zkp:No*yhJ3V?>>$T?MQsgCZA).+zf%pB 0$Uu @L,݊;k-M` tȒ>B!J(r%n 2R2`?Aph :1@],?Ox!G4ZIl|[Q}%&(~ЪnɈ=} 'k4: F_hiZN1:qYblXg;Ue\))Wbbؤݜ0o}Gϲw>* Xq}kok8-Sv[$19:IvJFP+|Hm|~_4h |$-|uS8ɟ\K2<35`Px(\D\#x8zg>p30 |7ahhmc#T+}:fBmeg(^6-I]ڧ3)ڟ~2<R/0A}ZA(u?OS#"AIR>b37xeq#%hьA$4( 0[K%E [չ+xGūRrʔ m-dž;}-X%2(3_oȘNj50> jk M=&SI/;d:kc4!%qRG2 m]evUS6~d׭$ws Uv|u֎rxNO OGc۱D݋-~c%;$۬Xk/Ri:m(@9s"|8/VTu_|I$(HU?ݢ4|]mLQ7pg'{0'8?ڕ3Ohv{S-/{e+(e(4v@cg̥f!*F!``|ZEo 4:-]4>d82))rD3, :[اMB/'>`ߤeu+<Չr6qF_zuxpÓGpI=OY!%B٫RʸpUޮ 3Io:G0![:-]#0-ǘVꠞh&_D# };%\?YHyBi9߳<_E^H3OO~xgJ^ Q\Կ%q>?4t| ܷj_JmQ/ p7x2rq\DR"*a6>MhDa[xf6.A=cKݤal IH#,1+sT]BBq_h"?K ۔O ԚxUklO{aH}Z< oع|JI/$I-UI֗|Y*VNdXqI@Ƈ {ț22#8ȕ/g(@O/LܡW=cvs`}}x[,4 3_[ZG'=d@W͚LģI?7NژDoR -]Iyx*M?ԭڼ1hן_~خOƩ09p/#PnOς$ǧGJˈgӭȑM$$m%Yj&-7L nց^{"6}>:X15Dٕ)^x^~UffQ%stF>H۴Ѥ-GVHI!XN"ѺhTDƸ^㏛d&LakWddp>_s"-ݣs_?۟q#?]-y/_ ~s=@19i1xM p·zK)bǝߪekʺ\y'xY?[o!Tu74DQ}aFNUg0 73+ fs7S.)&x$enT6®ٗLuEQ}܋I\g{Zq}>*e<ϣ앨ҋN)'|&5mG&]3/紦vhnh2m8KX$Y&hg$C}øC;/4Q׮|M?v;ǣ3۝=:]Csq2߻v˪(uҘ 19¶1\aD$pefG)K Ғe>iIlGrhl qP^.g4k!L*#VT4h٫N-)\;r8(=?_jqh婗?4;82qG l{P%fQ"ٿ~lSvdǑk5\Mhł`H`zSК>0i llAjm4j"12<鲝i*Q-43?a=MҥQkr}x@eCۏ3QoD&*Mdt6 WdAFznޤ:d}lU.b,nZbX漳'>[iH!O*BcU/*qs/g_S޸|@7Jnc?r7%C3kluwt"s@Xim8?.ΛUm􄝓9f>=Y].%YQg 7X]qcddPa^EYoe= k,+gG WF0M/uO1< J46v[ >Zkʃx2\ `+J1"NOF%>O}8tc/Dp~iPv+{ݱʩ)vhPr+bWh;yKHdt}1L1OpDL[AM"_zCO{rK.ޘ;R;CT 4J)f_PA(`:oy(q)}'dɶDazL9Scr: &~*[]0ꋷ3Z.W 3^jpS+xΡx?_g-ntn8CsAA3cfRRngr!UeL:OAդ&ؔz5 X79siyI"hQ57/=gWw^~ZjŶN9ٹ?g C 1t[lX/ń8%).]T-"HzS XqIovgIi|(A!$?CS6OEdW |,:y|Z'WxR@+qq2כ `OF/-TSee0D^ _S}>ur&_or^z*.H:3M18o bRdǢtABS8 `+fi+S)U@)s֘U_~Q*8rAFծom dשBP*f6}_0YBdϫjM 㩿oD[@UH;h.) Q5i.!% fY&^&)V $SW,^Nw9>EcQ FI.7_ZxͬD(͒(ٷJnm7n;zMzh/MkË^⥌O^VnWC>,o{4uzw Y2m NE {/=a +Rվ쪾gfZ;w@)Q Ug"1QN0TCf:&`WZc|1^4f²A_/3hu-`wYrVy丈mk,4X[iJ Jˆw+5545*jg1K͒iwun4 ("~7` N=hi Ac_g-)@Zs 0_Ws=JLE kz0##x'p.EZcyhZPeQ2ܨ6s=%dͩg'ψv\6Ǒmm"۪W)K8À7D;`ag D>7嫗Y\67,VQ@/ z37B2}M gͷw)$RWxq #Ca0FHi{JtX13Y ;fs >u[3ݿ]^q<%4 4kW02: %USrʨ4W1Yn`/$fM7*x=вN^QzKˤ`S@a.uf:ݥ}kb ksс A]#AGx}1e꾨ܬli vw~oX$";R;hZkT)o 7v < V22xwhY&zN.ٽZLE7U_s]쟙z.= 'ưDX|q+wl$釯;٥SW0uQռmt={#`gS#JeXIfII*nt|(1 2vvGIMP 2.10.122020:08:10 08:18:46 7JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((4&mV/8;r8qV4}X䑦Qqݻ{tM//~7|:s\8di_J:-ɭX M.p'9Rӣp2Ƥ׌r>$I?/x1 }yiyYqT]DvRIFQ]ơEPEPEPEPEPEPEPEPEPEPEP[z.ڒҿ3=+?L"<`E`6Fdpq.ƭN]mm ls8zR\LF2~A%C,5>zT^l3?LБוNJIɑx_±.'<;C\Oxհ?ʵ*āڼ_?ZvE%#_^l!\5w:/e ᫻7#dQEvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@msIR9f>~|1<9é\H3?6AvZ@@#\rN2s޼f-A:q­K{rZ[ہ #,~P[{q8Jxj >ּ4}xɐk/^OkF(1׿E#nzD梹`hJ16Z[uktGוxBJ?N KBju_BWvoGE-(4 ( ( ( ( ( ( ( ( ( t]Y%D|:Qq#s8|ןFcǘEsS__nq/˝ksIrѻh'4ҜiҰdzW>^*תi_זxBZSQk Կ+FM&}};3iל VLM*pjOaR)jO?u}v~ k+Eu_A3eGh7ù]W!*? Q0rWUg?ʏC? T}v~ =;OR^[;بK`+R((( i5 ;#f )i|/¶.w#f )~דVA3(W##NѴi*5c88=+t*G Sϩ>F>ctmEwZeCT)ڼZEnXhD)4&M`@MjRi`ni_2=jr>#M& qMYo1.OO*lx.?G׳b"?3ƾq`+1ggxO3qQ w4{w}`Ci hg}!g\+^~] KTyԺ1J郁UUꃥy]vekQ^QEQEi^lY|ˍyRsDWl(::I^N/MjzD+WCnEs}ǥ?@&֦zpz;K}&" c>rѣKcӴmF~}OW;axZjUri5i4RRZJWnad~SM+ Ҙd~jn қ?JCM&B_ߥ4'JJa4S,)Y?RafG7sگxEe~?ʴ|_" k$\vguꃥy]wekaQ^QEz,v5ůxt 7?Od^]{Vq^6/xCnjDd;.0,1vKL&mt<Gl1ְF3oK h=Zʻ{_J_ҫ檥[DI3LW$~ii4IE 4NҸaip#4RaqM4L4M4SIOdӢȹ?CZͲkK.Oֺh|40+J>6 (Ck˅+g 3hZY]=uǒdޫx3_]]y8Lԝ%Z2ke6:zT𼷲Wb }КH46(;s׮ZTԌp4p6r{_'Q\=nCU*h J䙣4 erIA0p4\f4Cp JZC&%4^xJ&sNHiU 迯Zk5"F[}(2/5FWޫӅҷ^)>dJM4oӸt_5'kYv':/o5?#Hl1+J2ϵMB(P:٫##Zޝ{8:s^a{k+ۑ1~J3u:3Z|Ǣg iF?S]+x =Wi?8/NeR.KX[JkY6LGj.M"Znj gG+\~?jqBb-NEӼ9\*t9QZ-؜LiQ:Yoy#ӊsXʺ[hK~NK\AQc*d961cI#4HE4c#"EJE0`DE1JE0:qJ&u=h"ERm nwj=0>sZwaȽ?CZ06mM9Q Dp^K^XN?P+:B Ht8QFof$sh/һ糺h.##8qדV'"yK=T[mryO<^v'odR{gHN-,?S 5 6+/y#!I g{Wqu98MR+OllcB,b!ݛڹKY-dּ7uDTE + RN)T@(;7m&)*R)DSȪC#""aL"LEFER.!k?/Oְt#[)zaͩ3v^)5闚hڞ?y<6+c'i ^g^YNI}{hyQ^QEQEKmq-msq麭l?:r;m%fȹ=޹8eYyԦy'pqSWcsiϿ>j #XS^N:{Wuyc=8޼v_Ml䴐L Q#CϯZ),!_Zt["r3!@@*X.)R␆b)i!022)Ta"423QQ*C#"5!"HLdaȽ?CZLa#[)zͩ!'.?? k˿Q]EPEPEPJj0m~N;z J8tl28|F5g8)#ܼ='Js :OS^nt}~+ݐLv=: ɥC;}}kƔeQ8#Ny__u`ԭ>e?Q\b0v0-+(M^ dS(qPހjYiqcz՟d?J?繮S[eō@}=اJces:*]4uoy4]{Miv,Nitá! A4?|'^t$?ac?3?OL&% N1]0]r{M'&OCHYUPxc5k~"{wlc<P}=CKC'.?? k˿Q]EPEPEPEP] -q+B5i8)-OmutLbzyKP==+]_󈶺8[I8D%'>ǹp)rLiٝޫ-twt[>ein}lsΝE1N\t{Wukt5)׷ᣪ? <ķVOqJ۟cBrU ᨸvƜZ-_ ?-_ hcx&(eI |M>k(({(v:_L&o|4K>5G({(v6u/Kۘ?-p}=+hS5h"QEc ( ( ( ( ( ? kp?qש=rVUƬydL⤬fѵt$gmz֛G>zW͚76>JtZm.q,'zZ*R=9Eٞ4|cx#W-_S=*O޼Vלj45)קi'5(l?cu K"G\%?YCЇ‚( ( ( ( ( ( ( ( ( ( ( ( 4=xXvӌAާ<ҍXșEIYjsi|^w6o[dJCEyߜ?zdk%n-<{޼:F\\QDozWukt ~^^'䬉{Ijƫ'ʯ~wCAEVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@win4w_߱lǝ~ נHXb(jn8+3ldn ?0?,w/oQ$x\˦C7tݾog 3tFQu =;_sQv'!tEXtexif:DateTime2020:08:10 08:18:46@tEXtexif:ImageLength128AtõtEXtexif:ImageWidth1288tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/player/move.license000066400000000000000000000001471416353147400223630ustar00rootroot00000000000000[license] author= url=https://openclipart.org/detail/310138/cursor-cross-arrows license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/move.png000066400000000000000000000064561416353147400215360ustar00rootroot00000000000000PNG  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.1.0/src/pictures/player/pause.license000066400000000000000000000001121416353147400225220ustar00rootroot00000000000000[license] author=KDE url=https://github.com/KDE/breeze-icons license=LGPL vokoscreenNG-3.1.0/src/pictures/player/pause.png000066400000000000000000000066431416353147400217030ustar00rootroot00000000000000PNG  IHDR@@M}iCCPicc(}=H@_[E*,"␡:Y\ EjVL.& IZpc⬫ ~9)HK -b<8ǻ{wQa5e ![!~D0#1S<=||,s^%o2'2ݰ76->q$xԠ ?r]vsa?ό*u#E^xwϴr! cHRMz&u0`:pQ< PLTE#&) >tRNS@fbKGDf |d pHYs B(xtIME+hzTXtRaw profile type icc8S[! 99N4R HXB2˦HkMaaxV%mF4!mz 1"!ENK}2w%JF?XQ@#lwf?MYHP3$o áAj#q,\|shwܞMe*f^>O8vZpv/8ovk&J%^"B;`=r2^m4Ci.4u1dl|ŝ! 3,Ql(쉴+?K1#!LKFqbchhvQf^<- eR N.v"8@:/RU!wna/DBL؛ [DIDAT8c`^ ``.ojA7eXIfII*@@nt|(1 2##GIMP 2.10.122021:08:08 00:16:16 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((((((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢(((((($(((樢(($(((樢((((((((((((((((((((((((((((((((((((((((((((((((((C%tEXtdate:create2021-08-08T00:26:48+02:00)h%tEXtdate:modify2021-08-08T00:16:16+02:00ٸjtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:08:08 00:16:16BtEXtexif:ImageLength64GtEXtexif:ImageWidth64s tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/player/player-sidebar.png000066400000000000000000001135411416353147400234650ustar00rootroot00000000000000PNG  IHDR\rfgAMA a cHRMz&u0`:pQ<bKGD pHYs  tIME0%~FuIDATxY\Y~g/=*3HV5d&r06F3IzИ06&F22Ff3F43bɪ"][fW+H=X=|9pι~#Ͽ~?P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ |A(M{g;I)=.!J)RʍwyG>/@Lj>ijI)9[JiI)mBE8<e5Uu S3n[B(.^H0)%R2J)r)%B0)Eq !"4mW!%PBȏ(FOb P_׌( JoE>`z|}w|(A/K)qJ xZ: !;>(#mBRz67wJ W2 %=^pw S؁_+FAƏ5}@.!Ęބ0H&裶O+û-J)2@J)!0B%!nq,,'~$IIQRVWF}mVg%J`)&<'v z|P b9~/)!HiBB-woq\ǽ ;>SDZ+0.G?60 07z@Uv"<7ZGHPF8sϙ%=@uc B6H}? !c$I!Y>Uax$.]Dxs)M)!҂:su C=~U;/9_$gW]{w&]y9`lJ)!q#"))~kqn D>Ar LP>c[q L#|fe%$)j5ΙRP#cOihh3}df[&>PPrhAwq 3f(ӄ3P=Z:*٬Ԙ1 4ɭЙ[صBOr^mKa I/S)G*wr3'{_u]B)%RJ[a1,LPOʲFml;P&{vb)aG fa}tN P.CSJ)]R.H)}آ= PLPBԔfZM~~YyDž^WwF8'㩭|oP]m6oq!'dhiL)ӁLeYtHD\Ϫt P>uܜCmXzK=ۯczl6A%H׏[]a޳sD˗x q{" `kki4M45={VSe [+=6B^"*̛W=׼;GsUMz{bFdM4л^ W+XoZ'!?$AÍ7~oAFc=XMh#7pf#温Wk)!5\sBW=8_RNdzPo&gΜrkk? ?/9!RBY&FH5BH\gFNFyBH褛Y5&mc'|^(B*[tQB3EMwZ⿋h%q #Fc#Q=2G[jy!έFY^)Ԕ>* =F({ZuR?sR~cb} I)SB z=qB `qv]8V{G:yμ+8]u0'-P/p:xvRucHq#c4eYp=ؔ14}IJb>v?X__'ںWv}dZzE0,}ژ0(pPvlv}cMT$$ lF<,x*Ktg}F^uHI$S`8meem"9 +R19NWbu.p@'#I 9xxH) 4'&Z )4 MXHLmRO)zVa6aI!;9/7qQ QJa6R m3J׉{oI9g~5{FߡI@Y m^<}F@gq0 ڷuXavnsssp]W֭[u@qC! !$!0J.2\cI_+V0 >4 =nFȓ8V$IA4M+#uv'2ٷ$MǶ뾾ć9GRNǾvZUk5ZQ(=W4 a.4~~-fԱCE_PHuՅ!"ObݫN:{o>{WH\\cm1DQN/r˺ݻ/9BV뺅@1):ILLuGfW 3?SJƸC6z)@ z]z} 0DFHIb$IE!0TVI#IbKE !$$>$q P%'\z|$ide\.1V'*@ jͬhx2'<LD3_<'Tye|2P2?!P!"MjEH ̾ Ana0 D1$BJ (ej%v RHZ-\v JrY#ì"%! 'Q #i:|ֲ=VY5;J e 5bqJT{pK.,ۅ VQZ)FA)۶csBث$!0Z(cRdc 'frh%Ô 8 céذmcXݸnԲ@-TQ6nݺ׾D*r?2BC߇VgϞvҥNN8H=^v>a^˯4tH>^rqy4"qL+^RxC3# AffzZl6&1YoXXJ@ 0az'(a)M:\UV5<J)4 :,(=J#\<h&(Jp}|8z:eCRH2D` §Arl\0g!CE> u Yb}c&2?*T |>/iteqQ^I$ 0`G nw؃ZS&"!կ b#5 kq߷wt@H kR]'a#Cz=m#I%VW)L5И^ZZZZT.s nbK$ l XR@P%gFO[xyi+K7_o2औDe%8GIPJ$9$+=^`Χr$zJ3+HHY=s~)쵿GMmJh7a 0~G8:~j/N:BZմ &&~ؓFhYkM%(XYkQ(J j:jjԪU*T+ԵP{sQ E;1A'RHR$}G$@I S` P)J4bDB"@ m XR""6^zx M|E,.-B5}BHuݧ,"qgME"wQ#t:s F.lJGzKx惶2_ƥ2`)Nb].ua=Km:DsK WjW>je}SBJS|d,*30H5p%8qmnJ9ސ[ GJ-HjCr)m Z@$hEHF$p' &6<r$pdaVz_'X\Z9~18);je]JM$ ڈt'V>m77}hH SB:g g)q=J=, ڮR2d6 h 9h,|üo< fcFh FQ/}ǣ L#Saq{:- v`\t,DWj 0ˆel(RhH_EWZEI0sD\[ #ύ\i6-N,12,,,`yeR`KUz!;O#)JOz޴uGZӥa W]ʷ]IE%xdW}6Ŕ0&hBGucϬOlׁ*EswwA 9T ~Us(gc[R с4FP1n1Xs8l˂k|v=0\0=0w0S'$tP3cEKm3:;ö꜏j4SbJ !j"Bf9"t$@) ,u`\TT*U+ R n T˰][H򓻱v9H Sv?E)Ћa HEQ"A"Tu B Dy7JFj &^k~㦮MǶ17?kWB6^d|G\edh1s>2# h$G^7nvށG4Wf!+I"Uh 1-MO [p]#&m{Bd>aV2sR34j^g9kcmDfI),J0W"U0AR\XbS2,G&-wrJ B "lmoaqlR(I)]=t+0 tjc{k <@0żBADg#\nl}u}RJʕ+:4T>obffF\.Ds,GF^SS`C)|x$iFǙ^Eo{/Ӌa; N&d`,}I-̭|}rΟ8uԝ>oMsf%zi$ ƍ?@@)rB}j )j5ԪUv] {|߇m ( oa>+n\4I/bzF%~ W.#(QKGwo@*@`sJLH>YJ9]ꮾ=]R&c }K$ looƍ|2>< {@v )fj(ka<TVg{ TG|mR`Xs+ӸLp (SIFQYNXJ,(K*+6ӭ3e=}ut"߫( ^ݍ$ VWW_"cjϞ>} TF`a Oƙ3g0;3aL!5S.UҀ= *3j`T.k%|GTR$(j!J#Ǡ8!6?'B2}E>f ,-0VX__&0??ٹ9LORvؖ8*  T RlCr 8 1Rj08.LHX9 ]8 )OXee& c }}yI)|߇N1< YLMVJ;2#uHA0T0 L))0 r|& (MVRIh׿#GiY 9HW 1 @HdS8!圩J #Ǩ.\?7y=CeݲR ۶1;;=H[p²E?uܹ}ss8{ VNV!o0LRc%8ed&`+a8I [z\B !=BȳE?!mi|BAR0eq44(|8Jw|?r0p ^ׅ@WO+ι"eG |ڠ"e!#|¹sxW7L٨clMIBFP0Q2.Q<BqJs^L=75sJjf9V`aB @)YAc f=/1DBߺu 3p hLu\pKg 8d-RE*#ռB`XjfT+ @XLͯ#rt։@J2#z,D0@'`L W#S=H)LX3g|?g 0RVȔRLOOcgg=.E0Heq#\0$*340P I -:9 1$w_Jee 1Fwb0pBR4aJ)* e1= uA (k9ȈO527LFz $i,,EUne-`濐YJPmNǮ,˲H=Rm`0i==و&=FY,..baq)ZnY)j(ʔ dNz>zz>:UdvbJ@UTV/P' KOqqKD ()z?*]p΅7Tm6 V 0$IyK/ԩShqgHz)av:D y|xYanvv{V ^7KOq8Raq˂JMHA0@z[30eJ!-BHXTN,k+IB^$V$٠NLU`z̊wRzH+_O+`g7bR]HO8ί%(˲PQV17lb{{ [[[Q#vB K0 | ,2z~^JU$4wMqθ,cm1;vP*By;n|~yFjLpq]3%0DEhW^ヒ .^"7bMyhLMmA^AsyqaS:)<|[ؕV1:$4dDWx4;FT ȩa"PtŠmY-rPJcJi@xg´KuY@GMlu]g!v3wxΝ\V͘DݍoGQ4MQ)kr(3?Hvј@!K%0B^c}}fQ2 (b (D*纘Lu !1UPAs.x==t1twa_믿W_}gϞ4(jk sZ/SSSV vLZdzi̶8.\݁^7bF`DDǫ() -(Tk@qk NpȚd̂W?y%UIp?o`~~W>& [^2<ۖf& .3QSLoq#Rfy[o!c^IdtN z4\uɸ(ysJd*=5:WF`LpŶo}};wJEktbnU?r&5֐\sT qUoo8XVN{~*Pe` (z|TUzRl2i |qk'c1?i*r$l;4i3Cy^Vg1e^8{J#Nٶ ڤ4ߤkq$M(mYpl;S&0nM7Ǖ^qjl6!R>l AHE  Ft "UtQ1JP*D*uwՕ1\BUUxg!z^rQ+d>;pF8^z%? @(s' ~ReT*WVn(J q|{NB8m"ԁͣմ"ZPRTQeC @HX )]!z h$zj nvG$fɆت8 (=JixOTxϻK TUSRAVB1==~l1)%6z-h4*kϟ~߰inYq=9'hX+jjv0hsӎfwLAd!3"- 9,%!kYVxuXYY\6A6S<6 Nyt=$ fgg+_LzOr(`0 did 2qlphq`R`0Z m=DVGgeÏr-Aa@<jJ8'Oͧd ,] UuÖSR -#-( !1h!A77%ͮ D^x2`(EZ.`눢([7i .ٳh4{Âf:{Ξ=UI#)Im):gG?18F^̌"3(Kg΄2BT բ݀`hh0"3@)T8Nțᘙmڞ'cܰ4CZuãVBëiXH"}c v3ٳg077iLOOTu6 d5E3 0 Ax$D`Ws:6ٶXӀx&4"F{9 qPVƺOM̙3(܃b+Wޯ~h7֧6]t90ӄ D\T4I0{}W_{ {xwPXbN0 Qq?1֭۸u68XZZӧpS Ұ&!6 Mo]`2LfF!z.J$pKY QLϏ}nB 3. d ժmۨh6m$I۶qiLOO{pRl6K_|vjg/jH@tfk<ʥKa A^w1؎ po{=;oNi}Y!iMwݻwW7%ʬC (\}tPҩDa~uaL4ː)/z8s̍>cf"JIµZ V+ RArΡZ:Qc cܼgg0Jt):IfXґ۶frZͦ"UG?ԩSYqA0I)_ZZ ˫W3j|1*&>|%T-.!Nb=d BEh2B(BN8mu=PJS@v)ϏR!D Y+@:0BQ *i+$2\EV;<{cCVjZBEGJٍыRŌ=K0@)8NSH)<Нϗj5%2kՀ|}"8}4ߤ6I4ʼM)VװMf'Q"`fffฮ`"}t p,,,dC~nR:_k581b!DF/įt! L{(l"IM =ܹs AIWU:}\sZ-|1JUkV^ڄHkk[>;i*p S@SA)adcd2pz)*PA@")nwWXzL@)4p3":W*[a;q*i5?N^})z.n޼BͲUߜl>.;~!MS,ϣR@k[{pmuj6<5Ee a.9wH2WWu*b8v*E8eSܜoȓXʴwv^ un.6,v!ϗ`YV !u!Kc9i ;j PF(r">ru`H+`Wvb'Eef&( Ug6<=T>5S8wHv*Eۆe}E dP:U8SIm E `+Nq?JQ RR, jCa8A%wrAL+~qjf :/qc,ss뷛CQJD.`~&`Ase߇IBmŠo* בznSҘ(;ǣ q\=ܻc`\`vvN{a0q~_KRmiYX#0d4 'm#gb,FypAE|'ǝ=sbp, FTTklJ $In`(a' <8 H0H4std U`VÖK)2ϸtO^3@3E1?B_W7nV¬mna R 333cABE*CG*R!Pm! m}lKK5d1x\3RK*mR+T) z^JlΆrq$<`s{qYg<qFV*"Iq@(E I=`{{ Qp&ßZ-*0 mx~!@իUY\V~Qgۜ):;;ذŅn"<|Ϙa"M!(lrZYk+8 UĨ B %ےVRIXĺqu-:7=۶8));lD6Ƕ!g{|W.f #ЕJSSS{ ae̬o)j NjEf]inާݽW^{ Z uu(զ9NA")Wck^l]`qLuX`krL*83m&(nYJQ][AlۖSJE"qM\ It&O@Xk}tNhWpP.AJQ%='2>L ce HHDqv333ʽ1|p9l$MA:F6G:.h560JæS8[!R~H#)7Aa:.`QS?@7N@cta7&Q.@IBO8NBJDUZ\LЄ[u$`H'&@ل8(> vlzQF2"&H9'e5-[ R2mNQ/.BoPHPͽ0 q`03?#D/)E#a3%D56 U*t-% 3NQu8J6ŌCj<qN::#E@,q$+lK)Oh4b?]F)!%bݲRPdBvt^A4M $ 8m'Ҫ\BNU^]?KËey4`GJT =+v&(t݄9):jq7Ap I"$) 8=8C6a2g Sǔ҈J>-Ȧ @Vi2 Jk놠c D*.\ T*#677AVI8Objj \VWW31i4MakGᩅk`,U $"sO`BBq,c x~%s^nWuEHaQ:`Rf)TPTlkP8 (< YD"!A ?MRڧ-zyq/("u]gA9۶QV8Ρ!a1 C00 IiV a<8"n~uS^%IOd|]L(0=3qGC'f[2r@!@Sp!`DtPBDtbs-89)@[NA!CX=Ĕgs\׽a"WՑ^T cRj5y!0vh`^[[[u\>{wEӕ&XFNȂrdx4C`(iT* ^[[[KORޥv3Vy=ct:+&2|F \*;PրST BTMA0  ֔RƘ|+rV+u?357䧗`ccXMնmJx@@zhۮg჋VcWs :ǃ"9w(G!FRAEqgx X-fnfیBMv>DggP2bDa*lNqPcuv?D%THb%u]XDMqҮ3`bT~)1'ڀ.JϷ(Jŋ&qCKRֹ8M>$DRAÇ?uGz !z{ĊcX!j:\Cʢ̙X\^V?I2L(IL{Shj?w%#)@}Tuc/]b5fA+X[[;Թ "eRáHr܍ 1 J[,Xth=kp X'@JeIEQ8lV}O)mUVz|,8RI9ܲhM!\& bggkkk 33CͪW=)%VVV07; ,Iuj2 Csه9Z&g?6xd9124ASwL>qkun KV淿7-E o^9X__͛7PEWQ" Cf .~,i?'%OnVf3\V*@%A-FYV&%`;2&c]!ı<P*8uJGCn.hyVxPJ1lbnaWi롥d8Fb uѲm?o}:ӻƑ/<\FÿR"A{qۛ?>|iogsuMܼu 0}&0V3Z]=I0N (*}ZZ9,$ˎ)!r(Y"1]皦693<y*m)D#8\\8Pc8߿ӧNeU>x0@dD taj7~%0m#[>яw 1K$XN: Cʟw ˝mF۷qU4dYG(75hE)STE2 QP& n:D,w|8V ծT2s޳mXXX۷o)mV]ӎ>vvvjRq5,D:H7okR@8t7MtJ)Μ=0 ln㓏?V`:&>V|TG;?;8⋠]iU>\^QmWݻ;L v?4`U[/gO9݊ ;Le ʶBpǫ$TEL͈z>V)RBrc/HÕDB]tBkSq G`uQ1uUIgϞ4IqU }pF8/I5uS ^T9@ñB8ˠ16'p8S Gk}2Sh)v%Zk@&8.]FXDaBR"IqZ"%$)ժ](c3Q@)cjH6-f0QØ&X\\DRy䐪ʸ!Y}neY8}4G?˟@SӣQ !'|(Upk6wλba~aW~-Bʕ#NgAMrw!Г A 7"-p HTS ( $!( BzR|@\f&T\W>(|?y I/_W_{ )T=1Ih}f"1^~ׯ]k_͛(U(WT1R7Da^0c~qq9/,d#c\v ~)첌V%p?O o T ĩ \F0mP 9yZ* h5&` v[5yEѐiJJq8B[>V<3HTz=$&I#3TN(cJ33MqYp++˘EZE]+Ɏܽ{| ._vw%TZln8==J?H” dp9ˉHwy a ,X1j,M860vD't61}'_J)'I;[rL55( ^㗿f177M :a&33 66654Tir0`8㪡4gf07;E}m|i?1}z-0 E2TLu=PS')"!*Pq ztdUAvE+OSpH =|uDQ΅!Qv֭?B|B)]2843C6nF/>j~{Ћ0ϙq\ppt:lomja`mR)Z^B\VYKmK Gomm?zޑW2aQՈèjv9AAf2RXHB)^BsQGj,P 8HRu\~ |ts,:ZYp>HHM뺊JصZ|kkk|2fggqXM&>՗ɍ53aME4NIv _$6OjɃ1vW'zGJMBiOHvKT;(uHB %A N"ART-Z&XP=pMRp~e˶i6?BB`)\JiZ~իWmTIZ@3V*R2>>#SNq]q8Fp*B-yc)N{= _ 7oo~|ȱ~I({F`13 "l $zQ|>P pE=%T- " U8(˟?9߽6`B`Y6lq!h4x @f:n u]4UJ}o,..fs]ykʐgYucz)u8GU~<{=5qM\oo~c[  p]Ug1O v~o(jݮk*3\`Ruk` hZG 8"\xQ+++CFCVRN`0Ç>W£H/@FvR(dΐ\S5c@ ,:(1/aP\pBt`Aj8Vcְt;]4Mܻkkkvpl s1eW_rZ*Wml\!L:$o{&I8!"eH͈To~T$q啕vbx\H)vq޽?^v}2[[[/{ŋpɿqR(WJq)U$*)= AK,:S AJ8T*uGTr?$HVIUOCڭ:.>nhnoncggfa0,<=QCa0x{éSPV/JٳgN} (4=1*\ץPQ.Eё+0&>CDaNǢh&;R SFVp`sk [[0ØRJ<|_|~gת~1 ΐS(3~ dB(%Ը2b4C\*1e 7(!wTqB(jj*> @w}{spˁ#eݽ^eK/~aTJ/'D!J)o4=旬 H_J,`0O~z=;8}L6~S\.cei ݮ2eɃf.]OSܸ~=[iIN|N\ѐX^Wq!͉3:liT M%<DK$jHS~+UY*->@s'I$Iq]|Wv>cܼqjX]}9TjΟ^{ gΜ٩j?-vOiU˲{I#JRFmaPXW—_~wbzz:KEvjo0 2Egg׾? J)' &)PE2`87;CMݢe Y*81 5 B { `@M#O" a(Y,!嗸z*>j Dͨ^4M!;;fh6joڵktvtihh^g X+uݰR)GR)m'`9wcwBro[,8qdozv&677je{lnn)_*pycffR n<3j* y7n+W'd#{>| zΎ moΝ;Ǻ= TSJjSSS}5mIO7)cemX9ѵkIz ؠRčF#=K{bS;wzxiz}N}zzt6>|gj x4Rk/lz 8aR$ܸ3Y w?RIMD{z$8ӂij9qy^l´˲:e8ӵm{.c추nin߭T*JXTBiy896DIc۰- }-L/(,Ǎ|1M8+8/G{$R̀c]J!7Ѻ"p_*R)1N$4]7+Jgzzn({D)BH( q]ʂJhbRB~RJGƉu:b8h4EbvvSSSYSOR$u .oroPJK)o%gYVVu:FGy"vNRFR;I,EQd[z&RlHBD1@1,PV+`yyKKKdM>?, c*kBw !˲y RqǎZ&Ϝ9#8iڜt(ooB$t.qhf˲PT O"i_T2ល4zTɷK8JJ]B*tRiYVuݦmoqη}o.//@JA @/IӚ LWksN&58e4 LMMeӡ㘢YVRڶ0BHWGc-˲Zuݦy]׽9g^xaX'N0ƄKk"M4g, ˲PW`EUQ8z&S;5MVZ&\וeIXSJ-jYն,kDz8kmQݳ,kgyy9Ob"N.SJiz>M#SS03w7F'M60j Y}ff&[.<gumٶ=mkY֖y_YuRz(A9VմR$z=<~myO\Rm!D(90N=fCbͳ(\vڔcmۑ뺱8ίs*c!FEz^Ӳ,8N8Ndvy^IT8ov|[6gHMJu~," |sjIBQ498aXɺ,USh4Mx7B !V|="\)&>ZF\OӬ22JR}ԻnHK(5u<Rq5]w%+++$"I)k}pbH) ]H N)8cHoJҳ}1>FL!Ô4[T|ͼ8N֩o0ƶcۜmqvٰm{նVz$miTJㅅRZDUA8 CB0:c~t:yۺ?D߃ Ptc3gp鑶USg:یn71s雖em1ƶ !mJisA)}`-MM!DZ =g/|#qW8< lΝyg ϥ'IcnnΝV g)1yB yjv˶eYX1gc)c[gffKKK]fĉVovpH)Osbee$ UzMiZ1TRjjhhA۶31&cmۉ뺉뺉m²вe]p-MB z/..E`QqF /bVh4l6-8IsN52*)fg5޶m yҶm9O9MuJ闄R[eu<Jm˲n7ztqT*AA7&rEh`yyGZ=_ i )NBanƴϭ䩮_g&םmҖ]u]bfqhzz:=s("$NxË/^J).T*jP4cϭ7E5e\ǁnÖ́LNMC}BBCXs޳,8tKiR,//' O'Vg\x"'In۸w8fW^_|V5ǬJΤ֌ bJQDfm3ƚcivquqqBK)K)r9~饗!H8Q8\t89h4!kR;w!_cjHc42ﻗe3楔2BDqX7moyw\s~^Vwύ/^!!?Gi`0ȂtjAJ񽛩/ԷeY}˲Z{mo{s~fAĮ릾 \ ENs7PJ333/{FmXM_ղ!3Ƥ&2:|G3p_6c;j~T*fgg^!EBBa$8aA`EQ4Mc!4c]~ \%l)J-q333Z{m,Pys~>C/M2^!0a8;inw]ݪjkZyELϙ cmԝz@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ 0xoM+1I>!n x4RXP"YFAAaڑn~Т =<¹ۧ_W 9aӅ>\Qo?]i|UͲK,us ӱee=);F'md|:Bw%>,-Žj?7Z$dpi/3*d{w9J:"TTtP? >GO@veEiqδG:zxkJ( =2+T3(".NNrIjS݀)EߥZ>ʃTԔ]?S4ݣW' 56Mm#jHAe W[Q̹WM73یyIg3s4 +$ldb3K4NĊ˓rױ|KrI(<#,1Ӓ{X݈_Z4RM[UEacxzF*Z(8D_ʌ u%4R3ΣZ>C5E>>(~w& Xe ZJoُUi+6=UwEV?Zi1\)=J}W%)SxJk_nfcET[gdz]=:5xVjx Xw $t*<[ߍx'IKMN:~ofUjԉC`sWdϲcٮ<],⁞,oiye8Z%c|U/ /^SUA^;Ofl@ƨQ>.56B1RA=2;69qy5zo+R5yrS^O_ڿqo*k8<@PQ@kb?ǰKI??xkyKŌsNsX,e`J jLK+?yz*(tqIH|͏~u׶ -gITQ- rGzjNNuZņnpG@jB3tZ"jfZ"jiNjjm]as/'7V{u jΠ_Yh}VFʳڍ+leYFj9gg=R6Uln@ds!߇`zK$db?>EnâξgZO,y#$#PY]H,'pNa>#7"[(6<d${cJ(ZTX5\yqq+9;|uc}\Bvqw mR&#S+I40H8jP}T !U) zP[Kcg{pNy%\cžV {tg 7K- +hF0 Úb_jv$"Qυnn]BpNzVQ4HIP#ϥdiv29:Hhj5_CrK`#ӱ:'VE*yڴ<6|Kb#5oBm!?#@{u[M[]GjSTWB^>:}A>6U\R lQ)6T(EÔe!N*6Qp><̀"1o*3WCIiT?5츟𯚨6ϰiy#|l<{%1܏ՅROWq78q11]ZǛH \#K"F.{`fmhg \jUZx{IPl"p:vށKsUI8Ñ-,e(kj X-`bGj 5hM>Df 뛃RH:j W2[Ȝ]yu-z'vc 8Ί$,"ͭ'N?QZG&rQԜ@=8{+)^U%=V6Q|}l(EÔڍce(r{RSgzAݜDvZ->>^QnwW<(dHT~3IVc0I   oώq}Z*(Q@}qPQ?dXŊ[7%[ r{cJO.l/?{+bX+4B070W$3@!avs Ҽv"V\q<9_z ir?n6zƽ]!f^ \}Zt`\Wi8ppz^UWRy]<7#7 08(ټZ>\ϸ'hqњRGD̖҉"l0kfǨcT乵`IAͳֶ+_B2]JDَ:~ʘ\GO\6 [:( ( O!%kYmnǖ@n9Wq=||1~tiwo"uߊ2@r~Rx8Qgk?|5ީٵK!unbm,sDIeu<pA񅿑U ?.h$A^}`j-7Pf5o?͖*Pɩ^L ;2K_iOes0[żHd0508G>.4creWmT*+"C]\/Jsa !訿ץz.$zZCde}ڦcCWű'*鳹ab2 ^+HOj0ʐjtЮ~b=7KrzjK =gJ;*֟Xlpk2:oRdW3:&c,Z5\L\ZGeOHn9VH5?ƨZgv#JW%y'Uߍډ\hY,LI*0͞AzGEQEQEoëoXEeVac e+ͼiKKcn3XO|'l{1)G8-zwX>袊KLLd'灏^F$eJV77.޻ V 'TGߐ5su\^F;IRO8sb|W֩[kOl=KZw;U]+6!i&ʅpxڪQrL1@Gx\L}@|gw=w,>r޾-{Zs,$U2A 0 ~56m7S'3FTylP-@&<1\ '~7$oh?€8 Xݵ;Kk^.\FUyiLjW2D$rцj輚][N3x֑q6_P3Kki'C3z(k(ZV$}'xYCc@E$zlxX2뻱E/7J[qypFt?g(4Ԫʰ9d$ur2:~%x-n#Dp۪@ zg=s5ķ4y$39$$󚎊(((((((+W{5Y%ݤ4Q^Ihi;"hڼN~f>۞7m9jȓ 1ؼv>6I-יg(I#^zW@y_ecmncw_;cx>źO>z}θ<{A<#==stP[y^YbI#gbrI'IL((((((((((((((((((((((((((((((((((((((((((@Yx%tEXtdate:create2021-06-21T00:40:56+02:00܈ %tEXtdate:modify2021-06-21T00:40:56+02:000tEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:19 08:48:37vtEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-IENDB`vokoscreenNG-3.1.0/src/pictures/player/player.license000066400000000000000000000001451416353147400227070ustar00rootroot00000000000000[license] author= url=https://openclipart.org/detail/185065/mp3-player-vector license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/player.png000066400000000000000000001207211416353147400220540ustar00rootroot00000000000000PNG  IHDR\rf|iCCPicc(}=H@_[8dNDE EjVL.4$).kŪ "%/)=ZiV鶙JLvE !,cV_.Ƴ9zԜŀH< &^'ڴ +*9I$~A)@,ZXiaV45I⨪xr⬕*qOHN_^:!$EH `#FN}_"B 0ṛ Zq/)_c|;N=Wz_ӟWZ.\Olʮ3,w tz5q pp({ݝ{r|6F cHRMz&u0`:pQ<bKGD pHYs  tIME!zTXtRaw profile type icc8S[! 99N4R HXB2 HkMaaxV%mF4!mz 1"!ENKۗ_cIgֽ`7۝-~SV1(q  5xf{x;~V`MpG ~;nO&4'T1~T ř.gm?s2)IVDvr{o!p$dLm2E.=cN㦕?&bo첹?s$ڝGuyhH!380ډ6C`\XJ9WHܥ~췱s_^r !57YdzIDATxIdG&}6{/+l $2dfR[{]=-#&EN6Hx"eF(Cٺ'{Ȟʬ̬DWb@=| lϞGx{03g{SL1SL1SL1SL1SL1SL1SL1SL1SL1SL1SL1SLq@7?'gϞ|wH) !|)eBiY*"qT2ƄRz'k !c)SO )%۶_&|s~sȲ) )4,+z::.CBm۶2˲2BHJR8NBq_N0,q}g( !@K3B$(:!MsB@-!!!$ R'>4ҔRBzM)QJҾmq\NJRfYr۶y1&C8N1xIERjSJ널 ^R^! eBHhZtHR$zBHR,RJ)<)RFңji3$X0"Ji(K){@@雇"&grYBmےR*-˒jUbLL$|ᇄLJI)煔s%B~^ғTO~U<|i¶m@v݃HB, 1ض ˲׊,F ؑR6 !MBȎyC)m2v,Zi;E,LR14&R*Ǒ7H)%!Ҳ,x)iLߕ(c RKuC RzRSJ)!fQ'aDƹ­[՗_by\6J),frlWBQ133zrmCJ =ц201ضT1&cҲRI)0ZZ6-˲Zeu -ˊ5IRʈPJc۶j&}=x裏?RF)!W)!g)c3:UJ!`9޹DQF)?oEDG%<P-P[q.<σ8BBBJ5F8Q.؎Z $,ۆmpu]XB$;dRB J2}BH1ֳ,8N8NhvhYV@)pvv63 É'>`~*#BJYX5!P1"\~V `1 >BFmf`Vv_ !$8Ȳ I#",S 1Xq8CP}۲ % 4cPB́RXp^rGömE<0,-aعڡ%\E $F&XoD=]M]m#&c,t]7s'226m۱q\upP BK1ؖ ?jB C$I)D9>Qzk? @ezRm&y$Ȳ gQ-a0X ˲a\ׁ*)#%(%,8D\Z/`6!xRP;D2!M"'.J94,+$3"X-ˊ$$#lC"mm(i>j !X*8r j|vv6;np" /G.SB`;,GMX@[9G %)Dc[ BTcc&6Y"Ibt]p!8?5ae1s=J%2lG2WXApT*\.\.J̲,REGU BHݜ-?3jY)})eOJفrv !]fOZ㤎$W^O'{= !W?RV%u]Rߤ܄8,KB;\$q,M!!H B (yΤ$=>@R r@R{R"Y,BHEnoc| /Ѥ~H U6JJl;CB6^*åj$h!p]&0 yo/_c&}RJxÂ|±m۽vI@Vps3(Em{L]׃ kdܹzFQP" H!& ,EYp[RJ fhi,؎ vz.岶MXZPdA6d{KRò,c'8BV b۶w?[+W=qBps?=J0= RJJ.:!cإRYak!x UkpdY8I),CȲ i!BDQ(Tq!BA#a0n! s`{.l G )/4h:#Essl))sY .D@{Ad h+aQ\%e@,˂c;p\/RV}XKI83ΝYxƍwIĉ!x Zg+~tqz: &!#sL[s?7,`H!Tx )$J a)CQ#q8 $AeHSM*i4MTlgl4m!h;h!_Gkϔ!ӐIѶ1BWBE!20 k<ضY\|:x[J)_/.\0 <N Bol3a|Xz-2v R]qk/_O ^v:,RJP]ߓ5A".8\@HBoB@hI q# Da0 5qB%9E" #Q$) i!xι~d\(co!HF% [ھx4a! !m8 ȊiLAg>?w /ٳgofRޞ>'*RYF_x"@h)WUlو#K\n[7^8a~&I1a#OIu+)D/ *o(˾&BB0DsBBK0qR 2Da~~Gutnwlnakc;W ^ Y`OɯXC-HzI>ZKH2%*;`YXM2E%dgIx6o,J4HXU" EJ= JIDm(DC u{uzt{=;ZMl<[j>|χ8F) D&X Zb)EE<Fcv:Z={pb@{?|abٶ0 z!H gUzG7{քDPFp٢$j  ZsU^MF, aE.(ұ^/AaT3In$dH]m\"K' 4E$HY)f6xg8UcԌq#"$I^G$ʶq$I8}Xr-2<}ܺu R׿[*~5= 81@ -yy~;b`:'@6jDž|2R*qW8HXQ28,!,x ܆|f˜܋/ԟ+d+a@fPEP 0g%&@@ #2WC(gkuc-Džxc{ $FQ>db <ːqEn;;;&z2aYv~zo[߫&I^w SN q:3$!rZa<1ʝfF@bB^@RH`bx4Iy\'^qVxHG]|@ $)L '6!S`"j(3OJTc&F< `Ģ"f 9y ~0BP=K, ORĭΡ)16p}} V,+C:eʕ)q߯''~$|A*d ~v1Ȅm i!bq z@`qr+P2b`06Raj&RUĠ'7%}6%p(C%<&PM L6QK$lV$Đ2,\`H],..׿7&._WQr5xo,CLT䦜袠 *І)` I<&L9lDQ FpQbaD '2t@ &'$ DG>51h;#QE D&MeNF0aM$"aS4*A@`}g,0;; ׯulPrWf\ynnnIJ9G~:Wdrp0Hm;WF1ti pP-)Xvj~qd FjD*"@ Ȑhp(QFʂ`Q*ؚP:XƘIGf K eao$IV9B666/V8`JI#@^&z:3*pbj?QQ,M@cYcdS]U0Q` e ApI|C~Qr(QYƱd3x,h4}7!:VWPTneYs~l^ٳ*' 'bPH=@X֮,=Bοg;) 4#p<($J(LKD!57BBPJĀD@@b=cJ 1(^"*42??7|v !:.(efy$֭CJ*m8me2!le򣔂.$A`#52I!aA"+A )9lƅ p^ a R8~s}''Q)Cץels\G3ulU'`+xЧm"C[H$:2KӴ~{p@צBy p艧~J)<ׅZ*YJ+GBPR()bA!)JZDss;;;g8~B'MJIV (`+y*`fC9UKkAraĜ"T5 oo6(rQ-mooO 8Q^BH5;(W0a2Wa\(8=%8q $0ڐb]ShK)˽Dȧq(A a;:}Hl+ cV*p®ϷZ-mKJ(K)O}LpFJPw'w6F"r)C*_GȲ )Lŀ#qsU?B]zgϞZ-"ቲu=K8nc:7Q>D( v3 z`D#%$!I%210 2Ξ򿳳^g8eÇv=p@7@ 8$ 0 R+q VeA Np\rL|p!sP(Z cQc~nwDTJ$I}gggJ{`  }Z9p\w^tpԄi,a \"y$)"aT߆j뻭V aOLә8q (@^|ZAZ )f2fu%/c@ig T|,R"{^Qw?~Jp CQmn1p!R]n \R %߇\W!9Y!iQf LgAH'\KU_+ZU!e1\nGDq\./ NNB8@%Y'm[˨V*<i !jPe [SpDU2?H @Bb j{뭡}t:Z-H)/XuFJ9U$@Q0 L񦌁i @ʁ%d/R!%v-RISАR!eԘD(RH)@)Lm׮]>ReRv4GPBh0wQ@(Ԥ'DVs36PF)TD1-ʠʊ%.4wo㥗^ڵ^~O8痒$Y\^^vܞG8xw8Bq#Ut[)BHmD|fR"1\YĹ"\xq׾ @;iN%8q!ਊÞGl r p` )u Bt{Lq&g2,6JI\ ǶQwgO~Ԃ <HR*@a[ƓU @Ů8&| ta}?˲ʃ#\x] @ R!((`'%t˲lSEt:vHt1vn ؍J* D{rhb m.Fb`aq :8K1%(U\A"q93 pB~ y^h!\u*pR CI*)Ha&e۹[ф3˂*Cr2Z.,)DO$\R,`  mW^AP&`{{nB% *#80'`L,]pql!\n2K0gOU'a&O QġX}\{eB#c!i^ޞGp t 8tL>/yYpS׶tA dFO@/c8R1tgΜU"L#Mj۝#8Ѓ"e8*Pً ?!GY.l?D@7Nn C.3gb,&8Xu~gg,FjiHRV8aSJ8N^-XR'(nY\t q 3  $t4QFZx !CMKfeٔ4N$G?2F4$Rm#D*anK. b7Lf(_kF.oGuq١"BܺuKvr޽y? jKp.Q~?O(=eqs)$SQ^*b!@3g0[(4YȲAqΧqb jPG2$JN \ IdYc%@oZlOH(w^;8FJp&6`J W#PsiZ |N@0`DC$z=cy&!6i7W(b;.8DNANn..0E'  B>Hr15(BỴ̄^N!N2H(;@6r8XqEc C8ib831)HA)E$ mtt= ! '0?"8nJC wl$q4PĪN@LP*3X&.J٥4MZ-! d &&Ò@n,Z+c I V^``&z"Zqn0@޹=&kPJT*4]5766tDZ/eٔ4N2H!dƵGe&Ԩ_݌)WP򼡺a# CPJ_ `LR_i!v9"@Q4M`Sq(@U!S&Xg*0og@+!Xw5 ihZp_Id`?ElHӴ!$S'ZЈP6iDaA0'J!%A&INwY Bto"N8Rܿ~NBPE}!ԕo߾}1 `JSQ, p<>]$ȒuƠ#UN!˅D'˸s bI 1ƦqfiTsI?a:nxе†x e`C FiG!.CS).Q&Љ3sr H(H.CZ zD߇\e{'!}(Oy}d@1PƆ mۆcZPM K4BUd\[qr4!0@/U!,Po InHBQ d=\ljOP*@@b6ei0\ׅy*ȴ4M.CE{N0p]? A˲h4pU}[[[X[[Baؘ9p`L @!6Þ\0FPSF/Mb$QMQH A&%qfđHDYR 9,B^ŋQ  ! ȲEQceeT T`{9yBR$I0aSr(`ղGYAE'AVӺ@Jȵ+1r3g縳)%8ȲO-N<l~}t))x!\g\U%T? X.lzlw7؉2{wr@hlz<10$iǹ᩵xW "TEI) u %ȸ@$Y &K BUEi&tsQIMu/J]vץ[֔N*,c6Q0 CN%} IS$QגNQ8c'Lq JR%U*]BA19v'!"@8ox 6`8<4n ^еNU808C'RIP݂8(h4C^ٕDQ!D#INg*pCN? D2RPBeaЇo\tGщ"&Ajcfgg1??K. >+%nܸ, qp‘afY7t(@(Ҍ#PEC\QʱO=?,o 0$9jH)nM +MӲy8)H2@EL'DIY`!Xp &?VŒa"B<6D RJ.*ؼ$I$iq˧[$@߼8FyVIFmq]0kwg}-L c;*YR]P0n4BS80@ A;0(pG- RȲ AM0SaD;f`O7bՈKt2e 00333F6:KӴ.x1ISL DP`8`R)%\ET,zJ9GE*5&ZHXR8& L 0??nA^!f4N0)#0R) y|߇X\n)N&J$KpƎg$9X)%& ~?%.&"=3? 1Uϼ.(xty p(%GH)ю8anq,_&*Ĺsv Uql<saNv/L QCzр0@x!̍!DFYS*M7 ``;/ dbuRm]vDIR.OeI! k2b5/!%B "H%kp` LSQvӶ<#KE$IRr粔M&( F8| -ޅB=p='? 0S4cUVl2RՀGtni$e)啇֏5&lö 7FDl &pA @$xrR BX<+!D׉{,d2@ #oL$2z6dj?{,V vp+knDdA>0$0PcQ< :9X_]-FZHAӛR vO/9POuQ@'PiĔ@%7*."D{S"a1F '`b!`D1Q6pMz0(ǀ2Adkfn )+v HC@r`&XF20QîF3 w+ܘEӉgMEMT1r|R*cѢD*S FaߔHzR'9P"XnHETaF@CNgEQbp b,R8џu¢M lJ`1aBlM-~_;;;@8SI"#P")*&& HѥeE&#Uuia;T%2X?cj6QEYucq\sA.3"؊Ķ)@BTo㠒O2MpHA<ː,Ci6_Y4vZ-|7/~"W:!,Cǎ8RJJ9 F("4ح77a}Xw|MB_73tStEԊnG Y]DWX?3e.m@&8#f'AZQ`f;$y @BHj$ U%ٸP38'8A'I#I818zl$QBpe);;;XYY^{!z=kj0 <~Bs/g93Tl*[T @ 5AD& M/2HTMS<` )mB@L2ɹAMEds4Kdzzjs^ ,jRfrIaGf+4xvjBnmmNlC.A0e\X861m#_N\YǙP["b\ 8L?s5y_3 #So;= C$[{o:K{ⱟt:K\!ąV}201 H !;q*kz ddA !d.,X% oqw"BBBB .@5%pbcq(S!en{FLC u~k:;N~tcsv%&! &FbM}2ȃ!0I{926v' !t!Z]4dɓ D0DE'}666B0 OUN2#*QU)v*|j_梻29F^R{R1Ue,ԥlH`L B""t  aq')'u~Yauu}HGuDQ4MKeͭ~[$94R;yԟqâcwcsse)Z&vj^{Ri>y!q׳;#? @`TTbmqԓ*~p=1)0A]X\\,I)8KdlF#F@SF@ PJb%Mܿ`$x?lll MS `BLI>F*-x8y0= e۶BMBЉfcc{{rs`)e)įc@eqDU7?u+p20 a{{Y|Dq|^ ÇHB7I??[O2&$-ay꽐POL*]E|rGL`&O"c)Ȳߵ'/!865;sٞ >HYyYu/M4&B|?a x^y > [[[{~a333K%J%<8L^$Q:|v:xaG1hlP\[[[q<;!DRgkL"l'xE:˪sjdX Q}Cη[\믿saffrR u!B MQ0vwAC9\kggn433s>(fN &ܖR%Ä:+0'ZF^'YK|j W\spYu]cZ&HvowGa<V j@D~R''E#8|yp RP@ؾoHqv4MO+Wb~~>/Rbbє mp]F x7q//s"p]:$&m~¤H&8oK9iPق/ŋXZZB^y5s?:Ƣ`w)Mri18˲PTPqy[o?DZnNu9ι\^ic@ 8GU(P]Hjŗd* j33m4Po4(U; yEuTK*Np۶PQ<$AE, z8{k5cii >(PBt eRDa@J))*PrP ֓d9gq9jqHGZ~q!D>YϜV C%'iaY.Ξ;_z W7aDI0)$(~ {ュ"piI^onʢ]^]׮ava%]d\Ɲĕr/]!+KKKU.buc5/k/7nקaN^U*%|b>(|0d:ks T}&?!p"Ϝyc<$s]:v8*K̢l6ZwwXw]mz= $I.1%&p#`n(lW1*^oX:{N1̹@daL,KeRZI)%\E\, !6`bnno2 в,lnn C `1Is0tR $2\7J1htqizrJ)1So⥋X<jbFu=FHz=t`=6Rk(ywg r8,lFzB/NS:41 Bz*zCtlByn^y T*e\"Μ9Duu τsԪU>4}D CʼnnHiHqKg!c|# 5.$<8 !&0@B _*t2K%IԄ<WO~Xǭۊ 54N;m?X$b"8q?'Fo? OYͺ;EB'jt͋SF bH,٥?! Be\pP[Ous1q-aDď *̾Qm۸zㇿFV;T( 뺳y)NO&c }PPXHaF|,ých@A0o@bb0F'^%3 !PV/# C,//֭[(%{tP,aXƄt1݄>o@3,.\.8"0T3iMF߮6HA&Hq=JچfggꫯOOpM$IRp6^vN!Ăbiuusb0`T[v:&2 o_+̙3cll)&2F?#yDJM@P^o˲wyΝ*,˂8O<&TzRV,[ڪ|Zx F@ V-Pm.|3;79]ڏz Lt.,.<{}(d2H/^|Ea}>8N>T0XI ;cV¤Î[埧wj΢\>(߼~Aanq#BA^-yׅzT+(., 6^~?O1VWh4zb$^~ߌ |DҨHt sJVhy\ `fgjquu e6ݿtt-@MlXVYs8wΞJ`QMxqc j~O4f7Lvκ4&ҁ%CL*) 20qg\/=[)fߙ34:~>20DƳ!1_ 1J%+/{o&|<%x]Kp|@.|vh4sҳA(vL*Zn)PH@.DZ*Pa >||'orgu5 1ӷGs7翽?/s.ZPF4fT^e H6775ܽ{wn#\x eA8|`nn/_ƛo_;Cn^Ni !ί_}Uku1@0PLA*am݀ }\}82(Rtv~N^ .C\/_B'_%0@V/@GEiX:{/__WH >K0PH 9 *NJ>1E,J!FaGFӂMI]/T]q2Hyᅬo 666P(c<.]jFu8t_c}$Z 7X\H,)=\zRp|gh5 . ~TtRT*=wr9<' PJT*/QP+'I/@GjA>q;c; XڞA? %{߻/J ,/ba`ckoBmghBJ bBm՗*HTB9~۲q]B?ŧ|G,c A "a4Mi0H@ #i0!:RdWԟ;(Zݍao7u+|<P,..P1nܹ} A?Pf(|7瞦i';t::=Nʲ +W/ӅJk1g\IT\Kd⊃L,@y4`.Z#E%+ ~ &ݻwqu>գ1tFc4۷ vuc*Pe>,BZL~a@D,MӋaݻ7QsfNf'U4` LQJ|燵Grͣ鴱O?%GTBV=ZÇH u(d CEhA6)%ޝ;u&>|8u11O AY(}_5ϻ7aYZ8FeHMӴ=Q݂&]vؔ`2ȬQ.QL}TeQwyE߿5\8N>(*(%]߬0xHõܻwkkBMq0?7EX!"<KKK8+We*d<~&kmmL~$IB8v>JLQ01F(P J A1~[7ob}}/x WB#cl_ j"@"PĠv`Z Clacs^fgga[;;ȒD]ܟF) Jxe !ɏ(ˍF 0Alc{YHu`)%(!,BG,7 @ ?Dmu&C5vH~ʐRx_J+UDq-ZMԪUԪUa~~t:*RQTr#`+T*x3@EȒR^ץ+ƽ|1C'; 5\(cl,O=J`D=QYwqcgkznޜO$Wj{ ?'u)vvi^}8\}/8WJt%S0IKrEsTى$P@@Qlh>w!u3;u1vvvzpl]GK6~^C!5y M})R²,$Ivn8NeT*qmh6t:y۶ Ƕa;J|Djfn ι9Eʊ)fff`[,7ՓT64 @Lvz'+d[ ]*f&{RPcPr$I$I!V(sn=T1@(r$a`\~e.M@?~8\Rc(>fggh4y,yZ>+=, ɳSAuQ1h7Ƅ`yGeD o~$ 6\Jy^11U'VBȐ RE:&*4׬` ;B@pZFT-f3gq]$I !$ UO&CH(l#e̠;0!e߇X4C^;;;X\\8^RZ 8  #J"dPJ\uZP !Ю5@@plj5CK0bqqZQAJ(5j?[',H@oӟs9}tO}\Ge47>5i4hZF:ioy  T!vCJ ~&nW%\Jloo}jq^ͨJ>%E},CE@JWŋ1;7 @m9NaD#V>#3rݐ1r9uFhQ,CK+~^y9ٹ"_HX,5`v0Tqg!3P'N4&&PJw%`Pҫ*婃rloekR"ܷoݷZ-Wh8wΝ;EE\QQ!vOq&`ănzgΠZjף=EI*11O~D9`_ݧcBJ)#h@+FN Ȳ nƍ7'BZ-lnm嫽ϲzH{҇)knM8/ý|tP 2t\É' 1q%$tC7* _}U򻼼]q""Ybnn^~?ښvzy"kI`xBdi.^z  %0ѣ@nN'<J)M@dYֈc` P+ ܅v8pplXӞ׶(l6q@Jaee;;C=^dg'?^tx!8&{1㜣ŋQ.Ȳth%]Ejc645'}]I1*pP#p&.+j"PeB)p۶:u\y9s PJ╗f0@ޅYM1c ƿ_# n~l\_,4n߾}'zxRBȎr@K``o H9(}H ;ۊlEMlnnbD^$S}`(xw$xoHCwO^Bv`ťm(aL@(ˤkOE,gYv-CO& U`( #t'_NGdibcc[hyl @qR@c0k|`6=.]'Ek(/"%BP ?{B8v|sVWWJ&9imm z.OE888%ƽ>l͛7l "< ʁWdRx˗1^I[[[ +x17(9 ;8j2#6!$RtWa&VE֮Bbss<6sb0ދl9 !>[8w<~7u%Hxe1}gϟOS\r5]h4.4j~J^s] Rʙ0 BNt'J *7Q6fc2G)ÇD\R V | 2rפ~=9H>qwywW_~7omR/X:{._/.cV^B}$q]vv=|[Xȥ9I^8FL<I)3FLdPd4Zf DJxQy#../2wGzI̩VJ%xUK(6z> Uu"uQ><׃(yPRuh~wDp ?~lAA)͓cR 0o&uSRfCqDa”@`Vkkkl.$7ku] =D= EZZ)Uٰs"cp\{ `/=I~BVWq=8s(80Qل777fN<: !y O# ,ac2tD^OV[~T8(ߜdٰ+**a߿75L D2RÇsܿCAQ dRʗ8p-+ @ 7Yfc"M7e{vvv`OD 2JsJj *n+ .t@S8IbPtmCƅ$I2?x(?mf!Neׂ  /h:u|}6~w{LiXgYEpln+3f$T.cgg_\FFҬr=`^mmn3`mjjGׯceyZ_Te: ԉBHHrPB( f<<)4GGƃjrq7/<'1 >.f/Qy6^T;ԪUixg'7>7?#ܿ(kE $I!|<8M`$GSt,K3X:8u<2nmo/,ZmWQ~y\^τ%zJ 뺰BJ.sc~_#MS8ڥ4` `$IR,~)@Q0#J1@!!h6nB)JĿanV--8ܽs1ի(jʆ=i8`\mcffF*wv BA_}R8Ĝ4aN"q{Ϸ̉3%8˩H(B J~hQ}gg*Tzض !޹^|%?]g(4m sΩߒʒnY* GJe|Go~#{ÁI%緶8SAz펔2|TQkLqz2[9~b{{[U=*纪o8 ի``9:&@YϣT*! U,El[W6&mܹs <騍~:(p>+O^*?ak77J&R$q =y_|ry_6+taUluћ$_~ u9k~LTy(oeB!Ӷ,WQk<\ׅG~/~Pcr1t]7oVV˜ ~q*=BȐ0qEX:03"DaVxUN qBzRbcsAHIH\婾B7b6 @ƹs9LqjJ? ͋V.~D0J)2αVKK`W(KG͛7akVvOgϞ[ 1:k$Y~s% (݈ۼ2}XYY'o!㺻1=mX(vMr-I pjc4ؐH"WLXڊNB0(ȲLeeܹ??Ï~#˘tqRbDeHfHbbQy$ ܾO>~̬g {E: (K)RJFy?W85 0y`W0:rB^U7HQPJf&ܿsUz)&sp}m /z ׮]WH8r ln[^Ms\v})_Rgds݂ @O1*!c9!$R t &-v!0Dy>(L$!c Qbss7oTFQqo"וq^|E~sƪj±G tuf__}S y1# CAJRp6 3s@akZ Í&e q!.~b}}{C)v:k|{˗177r;: } (cm7_~Ǎ]hp/%= N pSJ!G s3:Z2Αf*VEYynf}cmmocuulK:N?2?իW^j<]à"qcU|$[[u\~~ 0lsIeqד4@0<$0E-md$I,BE*&MAa`sc(=cF lnlhҥK⋘GVC\FT݇!bơ.Gn6;w`mui\~(2t]dj%/1N `XW+e`@ ͼ\uEȴ!cT)%6CaZL]Nn~-fffgb~~zɃȃ+Oeu<|;;;:$>H<\Xt~e'.!Ji*c#R¶mX=$MH!Dv>G#`w=<P$$It {JT>\ǁ8C]$$I?:.ڭVoрG]Y[l^9/N |[8h@[٥JkG W17Rz@)8OF)`n0p <:l" C!H;o-崡eYn<rRX9;;63 UՀ-XO~О)N#t}AsСE)|a^gin1-ehX[]){MIwl6\ER fffP133؄<|Yz΢\.òo|:P$u &Zv,-.u]loo;=6Ru0RYZ'yQ,%s,Μ9R?cIqJ){fM.#6 008,W*aks͝HNX__߳J<Yh&Fl& 63^ط8NNJ_H)>y<8UwҨ=Bݬ~`қ O Ȳ `scyT20#ثHކL$ !>h4PQPT8D7Džrc<^G r]e~_I)O2Bd.!Sp`±m4"ߟ1sX__Ǎ7ՕAoSEo#]Pnn3bhu6ʾ_>04RTJٖRvywos8i8e9Om6*n ( - m~T4=S[Qw&^ ru|%}rr9׹)! E&$(9KJRP>NQrR'nhh1;'b*\θm&U"*$ќKM/Z}EiI6(c㺊8>\M tX!M9oGJ 6!SJRuntQz~q FV6`#*@1Jdø9yhC梾y62J$yPzUJO ml-PuY,Mh?ݜ$BPCJ闄/܅;=$ `^! p/ 6'f[F?g7Yd/邝E{Mq5B ]@KOdu:o\p&4EHD2i*ȠȿEYp7wM{5N#p&?@EQ߬mgE4M$ ,-&Z;0bVya8$_eY9Q xK Ӯ9Fi<:Nqe"]lr1v jߑRޗR~#d )|w p @@yh)i7F@q$b/N8EF_ߋ"(*ѦTezsMIbܽBQ) zR)u)D!*TIq @b00{z&YJ{Y]m835ąMQQ}hDs"t]zBWq×`i},KSpCTZb9.\BܑR5oJ)۶#RƧQN#oiUd`I`Gc7v 6Јf]of->wSazuQnVv&r._L5CA?BSJ !_'Iuϧ>q % ) 8wi:aT*hȲP>DžɚQ|9LSTr[joRyO)U.Oۆ_*(iKq0W=JY4t ʉK)S!ĦmۢT*y 7zP@ B\])(>z}a<Ξ=uloob4͓afgg177\7}~nmgV[ - c R Z j3**hQ %=pi*R<(GKT w/_MN#4M%!O)5qJ!ÔҫdRf>Q)</_FɛJv18yXXX077J\.cDyS׎RVShv} ) ] 0Mea_noo{)eB)e1av+j;'~ފ$IYH Y q]ͩޅh4kq|7y{颭L$۶~nDxӊk4vu0BPS]M0n=cvSe"ϹkC`V48j =3}#LJn !mnTZ]ZZ˗/?q֭[9^*a6::6779e̙3, j[[[zc9&~]kL4ShE>*mۆ336vO#ee\EQwmP ˲RNZZ+hI17%(˲!DHu)N1&F>!w${SBpGՔVZ(E )B0PV)v4R-۶m˲mrٳg)vTJ@ 3J)(RJb*z=)W* e;q$107F_" L*,s!D@)RjYVdYֲ8 _Nqrpj Jo9?s]B$G:@׶U6[!hht?.޾uY .8}.!̲eY̶۶W^o{즘 ZÇdqqQ>x?I_5ͶAgeۨh?mY8D%.6.2-2HHcRS˲FoXM18⢙ֶ:bYgBIvQ8zׅ""&.XBL;1"9h:m!e/Aг,P\*)&V{^x!_?km?h aV5yy]Ʉ*P`51v_ߤiM˲l˲8ۥR :=S>j7nIiͲ)a0ޟy!9O̲,f9Nb[rT/?sb )_|;ݮq\'3ѭB)%m۶?VٳӼ){L `O祔!d1v'/SL1SL1SL1SL1SL1SL1SL1SL1SL1SL1SL1SL1'Ӂ.!jeXIfII*nt|(1 2GIMP 2.10.122021:06:04 00:17:02 W JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((|?}3I"f8rs5?Av"Qmbn2ʘ>UNp?<Ί7.WټRe'ej`1!80m'[g|at(Y>fS8V]&C v1Vo~$jZ>%}RI?6؎g9"<Š9㕸8tapVX# }@پ(Ɛqm9DoR֡k-Xm̈́LS Y-g e1o(|&=ow}jAm8dNຳsגzAK²aڸoFNAQo99cbO wȣB+: WZ/2.3Lſ0h)?>{F(r@-ޕVΩbmR[ۋg8<|$>mo4B?.VdRC =(Q@Q@Q@Q@Q@Q@}3ų?zK2ILEelsx"=yAb1->hގ1KnWjG^0\@Ր~uV>kVOikUc_YAQGˈe)UAMta*Ҳf, OVQGTNa+)$tA]t: XJ{&lҏPҹ>3.Jp.w0nN2+J*7Hu&y?YfkD UDd;R% s^om;[rq(s];e=x~5YǢ鄢{Dde bs'88OH( ( ( ( ( ( %^E\uoVӼ}g7}1vW\ېe?-CkgS#hxmj?~?&tq/(C4OH?Jd}2'QXJVJnhJ*tK ֬%WNa+)İa*UIRǠi3+]#[Ҵ4'|hޓ:0h=+?_5XmΉ ͞9b Ōix3$jWm0һ[ ϲ}a l"ngw8ڃ9xʊ((((((# !prUUusC Umڭ#;[MDӟʼ{Ŋ>l@uߦܯmSV_LH.WBԧxnJGjWn\6ߺE)Ud)Wc<J*tK ֬%WNa+)İa85])yV~+;]W#2ӳvji&hV-jն8 ƊKZ\ǝ~~'RC?3]? ᜖1wyf@ZFUY'nQq)RvZ k'xc޻sװ53铹U[MGo泸F #ҩ0(((((V2X7۳Ix kQ%3H% S®[N~Λ}T/6!`<^Utgp1ˊQ[Kls*_t}*׃[nc=$ӊP<8?{yT/33ڤ%Ne: e: İ:T SdXNa*u YH%SW.֮x \iNQosΩT$e)Tq\c߳^ c.¥Ne?jz>zX|2{>̉:ՄE_ʦm#R&shX .;xҩ9Z̹XmTai$0rwJ^C,kgVU`VRީGo?u;?Ƭ{Nkz_̎XjίdupU xrk.W 1oj"]־&x24zOzn:mh/2\s*^q׍WО4.|M<.vo~Y "{Š((((((`;cXP"0ee<W2΍-u|8UA>Pʹ_Mzi}厥}m.0G,a%unlxKx^n~Y[h@ Mm~Du*6m/*Bd?;]dΖ<*Mp7^+fVI704̝oV=u;U__7f?ֽ?Z\ni5R&m<2C>ѐ8)'_15_4*s ~T@Rmm}Ameb /ȯa:g#k.S˞ ) e8#q^B9ˋ)ٕb2#5>3ex\@<֠ :( ( ( ( ( (>CwÛsI,RǿxL9Z%^E\ug0} O\vEtΜנḠ\KOLVod- mjmmvyXR ~= kqs"A{ N彼aQeA aBp*;ʠE]*h V4s:T:Tڄ0㍥jv:oy ~Yo}oѰ9ļko />[}}J<2Oq@+mƾ 뎑 uzz+@E;x".e4/.>]q=r$k=r>d#Jt }Mh0[{[9])۵br9zEQEQEQEQEQEJO{ׄ HTݤ!B#|tON`yq@k'ĉFj'E<vիѷm{h6h@鶿j"9owJ37I]|bX|y[[A܋bysWjwCNѯ/O6cgmN 'eayk9$uht$v[w)늩s#r :IO0zz$5Sgw 'lO3_Gkz$Z (< k7͋I Z@;P𒣾q_+_ۋmR0#րIkVW/q^B$Ծ<4sE;7+32 O %Wܬz}R9U%K &uihf"@3 6EQEQEQEQEQEA>5ӟ48Q_/$X$*̒*fJz}(J] >)wF{@-՛V\62mѲ6|*I+%GiT{ xƅ= nw#zLır}[$b!KgqWENOWdnUV/kR-m'f恘^CHdt׿x^k_[* \ѥ׵-I0yX +Q$H0GP&Hnfw ұ8׷|jDt󿠯Cz"Nu>JP= MGZBγ權.s}`w}|$qhIczᐓ},Q43h5|#r}^'&jQu QV}6vqp"AbhX_%6Q{kwĺV>XPcd[kouogwo OoY7@ﰟc Z,j0kc,{rH<wS>W^M]7T༱ypƫT2[w'sfAl`5QEQEQEQEQE5^[>ˋyXe9_cÃ_W֞O<1aYq`n}~r@;1ʃKIH}:/cۭJ;2+kZ-_fo&J7* _1ɔg@;) ,j[k/应cð+pCy?^}@!-xkwJ%{Apr?H,58]G =? zTw:2PM$2MBշIO'z uK`5buK3@_)_r[^CmR>uj؜گXG+׉jF^-eJ2+|\^_Yf^ɫjʧGR(sPi8m%p{ V^8Cݛ'kxѮ( AzRA[9>Һk4@m#&z_Agۃ9+ҍ影 䪮 0UQjki}Bo%ےp '@寂;1+V r8 *fF ʒNqX!I<(Ksrk<-Bw4lɴt [4?"yo%=袀 ( ( ( ( ?/xGѧF|V4a>Vrr8sF 8o9dc16=ӴhkMI ΍#9ݴrOpU; $@q͹V]dZj*c@:Łt>^ Z/W4y~5JbYO0 K"͗-KՉҽ^$G oan{s%Dl>^ѳrGqc$8X1i#f{_dbnrG|SCdG mJ3{좏 QGønRUGPYTU pzgPla&1>^FIǡ>kͥ& %e*1(U^w+'׀SD%L֋*ʶЉqqКY]Jz$(>#WHf 5b?.o  1UtPAN?+Cׇ@ WʇkЯ^!E{41c*hcBT?]x_hBT?]x}?'_hBT?Uxm?*CSGʿQU4PH?ک#eOj(>"|\i_a_#1yPEPEPT 9%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:04 00:17:02< tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/player/restore.license000066400000000000000000000001601416353147400230730ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/player/restore.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/player/restore.odg000066400000000000000000000224021416353147400222250ustar00rootroot00000000000000PK!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.1.0/src/pictures/player/restore.png000066400000000000000000000126041416353147400222430ustar00rootroot00000000000000PNG  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.1.0/src/pictures/player/start.license000066400000000000000000000001121416353147400225420ustar00rootroot00000000000000[license] author=KDE url=https://github.com/KDE/breeze-icons license=LGPL vokoscreenNG-3.1.0/src/pictures/player/start.png000066400000000000000000000025661416353147400217230ustar00rootroot00000000000000PNG  IHDR@@XGl}iCCPicc(}=H@_[EqPĂVBЪɥ_Ф!Iqq\ ~,V\uup77'E)IExwqL5;UT".dB!яJD1 u_b<ܟ[ə ijL7, MKOaEI!>'3ď\]~\p3#F:5O! m,1+*qTQ5g\V8oqVUּ'a8,sXDQE eXѪb"Eq%FTBr[3?9&@m ]QcngJk+u`ZKuK`I ɑ4<~Fߔn5>N4ue{;ۿgTrÿt cHRMz&u0`:pQ<PLTE#&)#&*#&)#&)q:8`tRNSB).bKGDo pHYs B(xtIME%_YzTXtRaw profile type icc8S[! 99N4R HXB2 Sߵ_#0|@VA4+p ݫEyݕ07e#B̐b`h ] R3lgvcjmD{xz ߂D/R1~34j5{/ ۾'~ɪ>N-.>\W47zB}h2bϰ"w P0 =aE(0;!|x|7ِ*IiWA(sme*ogs[IT]'ft Q)r顨5nZ#!y;朏fhwci) ۋ"hImqsc)\Kwo}11r XeIDATH1 Ej@ MHΗ3%DI$DI$DI$DI$DI\KjZwk`4rZ)V؞_kg5if%tEXtdate:create2021-08-08T00:27:10+02:00U%tEXtdate:modify2021-08-08T00:15:37+02:00&tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/player/stop.license000066400000000000000000000001121416353147400223720ustar00rootroot00000000000000[license] author=KDE url=https://github.com/KDE/breeze-icons license=LGPL vokoscreenNG-3.1.0/src/pictures/player/stop.png000066400000000000000000000024341416353147400215450ustar00rootroot00000000000000PNG  IHDR@@M|iCCPicc(}=H@_[E* P,8jP! :\MGbYWWAqssRtZxp܏wwTcP5H%B&*_BŰL}N_.Ƴ9@ xRf>Iг \\4ytɐ)@ӟgMYZs{kHSW-PǻC{>rCAtG cHRMz&u0`:pQ< PLTE#&) >tRNS@fbKGDf |d pHYs B(xtIMEzTXtRaw profile type icc8S[! 99N4R HXBݔ]6E]k5L  *i3 iPA)r"]×d忹'JF?XQ@#lwf?MYHP3$o áAj#q,\|shwܞMf*f^>ߜOvZpv/8ovk&~K&^"B;`=r2nm4Ci.4u1dlkř! 3,Ql(쉴+?Ia|iCCPicc(}=H@_[UZ ␡:Y-U(BP+`r4iHR\ׂUg]\AIEJ_Rhq?{ܽ*S͞ @,#J |E} L}N_.γ9"JdO eaoOoZ:}(+K 9A$~~5y(PbYP1E(ߟsYYYႶu#HaK!@FTa!NF '=Î_$L 9P nԤN/1 wVömu+5O-v lM.w']2$G }S8}U88JPwoirqR cHRMz&u0`:pQ<bKGD pHYs.#.#x?vtIME 5;OzTXtRaw profile type icc8S[! 99N4R HXB2 HkMaaxV%mF4!mz 1"!EN}*XIgֽ`7۝-~SV1(q  5xf{x;~V`MpG ~;nO&H>W7Ӡj-δp'87ni>~OiO%"x ]K$dLmbf"̞H<ē Û]SJD, #RՇ<[ {+0ۙV%ju&2:z$)rs71!~;枏f#<̋E@ )݅N'(ZRʹ*D.;f"H* ,-Z%HIDATxydGux[fVf־t- !06*Iccl`c#=^glB0aJ2hA[V/k=ʪάʭnNzō޸qF?OօX,6և@n pҲ@,{1G@f|`[#5C  Bp8^@ D;u%-{ x'p-[h3K}ӃeQ-.)ع6| x^ TkCcppC#~Ï躁j($W:Xe[$i3M*!ML7TGaٷ%U>. Kplgw|ݬjvFPVQ|G8q-R4hɩ)'gF_ xxH8rrBXп3*|mB- fK\\"B(BAwb:6$c8#/j28`Ɩ,KaE @^1i&饷 C \8Q2nK14Ws=ӄ/{J]) U_K,7IyM,0'lbE @Nj=l]5=4:(Y5ݖ)'F҉r1ĢP&05&tib(F9r)k0xk+I#!pCܰһц_ k馉iwyd~%LHm#5c(~l7Cʙ&eEGJ/ 6_Ge#,vܘ{eצtwРP(!fO2m.KiҺk-(BőI{cxt׎b:5\9`U;0䲥{aY#OkMWoڊ"T,7C!j,[aF ]1 gQ=޻6^{A)wWoUпh{]P?wqB=V G<X2MRf<vE{6o YTgCrBKI,yɮW~- 7Lأ\&(6B~\uZv<_5mdžu=8!,Gv Bt^?}̍vνoǍu_Sd`^uꑈړQӠA7GQy:vEa\E;NhE9pj}}h$i'[7D37},Zĝ)~0X50MmGG}-SQold;6o̿:Qyw6.a&j=q7Mg^Q65*vwESS}0oX _gbb:B!!ljj`]ܫ(NYclY..L_`{!'@wgVmYO~7˳Q6]aӼfit|usE͍C8wv.}{.U1:ӦzY-r?ueuM.jyfㇱOSO',E(Bcɦ5s|xi,Lc0o۽I .sgŸQ+27\ؑGT'4Rt74߸ pZ2{αoS#bǴ2O.OMs,V_m b{N(`So~DY Q( x6+6UysJkB?W3}(cG'+ɷޮv ؼ+|I/ yƏ=_ . #EŪs7҇y%%J3|-"]r }_|C+-t埧x];22չpР6U@bD (7P|JSH tzLG\7_؅tǵ ̾+yҸ*z|kb%3<9l*ޮ>OB(X8j;cURo#FFĝ5"7;\xB"78G%oSij¡@h_|iܥ7ƴz,ժUtkoH< {Mw*^@,7/- \oyqYSK?{u6 RӼ[k͛9M5kؓin {wM8[隷Z5RN'd}!>oбqqVS*|Е '&^n{%(ghT6r]讚?c'J3? %HIk:rSe1w5k*>f 3XKc|Dā_ZP\]w(\WhB[Z6z.ыV\!ޚ er0y.* IkQ_Eq UT"7olsl.6l& g@aQ_Q-$♂* ԓY(ȏ! TzyƧPjXHG’ ]Lh-t73<-y/@ZRpb!toyC>I)HYd<+ 0>Ұ-^KEUCхN7<9F)t]$Q/uM/kfoŗ<Ӊ?,r$1o_ jgv:̙_頣gyGG1 RP%8SN`E(IgqS%ШuWܪs1QZT"(MEzCeDws^jeR8:ϐˊOPi{i>KHI!MUQPrE3^J4%@_Zqq\|Wܻu\wL?U(\ \f-͜ zRz7nveP@SXn+au1D'gYf qYR8:̏⿏qS;$vcM5[߉D*ڣ{rxO>OVbcRt̜+eβŠ)wt6M`Ї*TҮU|1Ò mH3Gx4a-x 5ӱ*@>2;zsq8<*b j!j!vФA *$c 2n2{ĭ4g]J֥Z M' k~=_Ey(Z뻒8m>9YK:ֶTs/TvrI9x-b.M*z^$ӳ6* a)P&ΐs4tL,'}-wf3;uNrjKb+3TzVߩ! 5g7n.6.ŏzG4k];t_[x,Q4w7VWN[-'J &E?jBy *X`:3S 9f>*:7_PRw3 H}/#tS79ž}ȚA@"ʑXT+^$- AuKVj2G[mLüx U4{r*M38Ʌ2pI {ؖK$?rC%~:Vx*Kϔu 0VުyGȔrKp $w,O=]UړSEeR!ݾ.H֩OLF=?3E(4( g6:e5 %ֲ̞NrUpf* ;< O-:cA%oLZt0%R&&VR8#i0e4 q'7Mt]ƶ&n64AX|QEutI'ԟp9~F9{'>B{ҕ>H:c{9Oq>u[\Jm&pxxma;v~׋Ѕ[_UaI$ߏ|'/j8p$?6/Tu48m4)bYRI:}[iZf 7 \d"tctŗHfojګp9^K?xXbhG@ABd*=3 |*Gr7#xCТ`C9xi+Ō%ڑ6&nO3>mXXYG&]JCFI;GCڑa\etpj7ivnYPZ+Y2ɤuɼE$v+W_e^|S^^6gJN/ܼIkɈ׳ A СH rjFPq bOql<h ND$蛏;4_'G?37,С8Ɲ'XUSߋ^^C[EnH>DyhsxGrr8fƛj[UJZBrw'?%/s  -Yo'O^}U۹Ͽ 6z-zrߒԫ'9e}kI\ ӿ' G҉UH<ϑWBka#{g&O^}Ws54|8Q^qtg#TT3ĝ 鉩'ja@"] ~"ˋPӑ>x:űCDAaosECCKDU=x֒ MGێeh:?kBM;Nj=I(G*!=^6S:V7S#-^Gs@Aeo |cQ?j~;~K5n jۯp8{˜djv߽j ]BvG XIԞ|/'Ŵb~!7И$"K xC>8`P{fک_ikMi:.BؙD"i:QT' Bۮ\ (7fje9< .$r||#V ?t;AF`cŒ1Iٞ>BJ3Sdv/?xV6_b8Xc> 3f'0֠  omW]A0 ip<ʹ3VK4<6}YeHUĒ !jv5<d<ϴ{y-hRgxSϿ R+O?`=>T_VWܒ{g;6qw He7H4FznBLǶ81ȥ˳Ɉ~>Z4, MT@nTȮPM\i+]ͳRub$ܩ%HjTR|$ Mc$fpvF+_?3ob EvUK?eUcWl\Gssì&$ ;b6sJrӌfvluOsۏ}}Ҽ0хE;w _> Fדkֳum/MM Җ6SN {28MmYmD_d:ȩaNO4%%LT>04"DP Thvl3d26c;O+)=~ΛT乗M^k /ʘ?ݿnئ?S"TV0Qʔ!%m2Ē6q%-\ܼ<{*444tqXdc1oP2yoj%skB/G84@7wBa@VښCC>,Y? u$x8" G/ٔdD>qY㏸e0Va @Z` @ ø} nq }n"4ap0@81 mNAӴI-b4D (b*e뼜ah(ٓ6]㺘IƲH&]:̸<s_9%(eu.p_SֵWvbT)dJ3<1y=|ݳL۩[wYusz87="ܵCYkO*ADvy)qCFJHҮ#v )#f{nu92LppL^ʂW8,T&K.tJŜ_Y"] Asir,, TX1T|~+w)M0%iDz(eXIfII*nt|(1 2,,GIMP 2.10.122020:08:09 15:53:49 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((*{;;B-mc&|\ O&W`݈(O A>L;ckg{ŝ;[cSןW3 #?/򹄱[jyUΣpyEb{ iχFO*ú"/ԇ6 [}jiZO܂KF_X; /Q /WGU<$0:x*<'E_E_v>EPIb>IvI٨3A*>s;^Ue^Y\iOku2crddr8k9*s`5exP90}w/+EMyieD W\^Yt8re %쥙О_8=EOygqݽ~\ɍːq㡨+M5tt'p)QEQEQEQEQEQETvWZLڹ8<: Sf8˅?ˀvdqNH^Z<DdG0+ⵗo1YCEQqL}@վGۥc~qOsKp|zuҺ@ڦȆHׇVZՖrc}_FVQY.ؗ?C$'[j Vm%QH(((((rk CE4AŻ8alWhIc]0{z,rE6 Fܫ?9VZ2n|W؎F!R OֽNMؼny?oL=kQqm^M6+2B((((()ȍ#Q= _D0U&-|?#Ӿp jijYĢ{\))V;)կ#:=~[֦̳?Ez1Ҏ_q4k!v8rs5#9wL~v̽jښ[uTњzF{W=mu7=ҽ-i=k+o`Dcz\*M;FDg%AyK;>nLn\G A^})L5q߿1Z&%b))wRSDs1(޹ N-_"<ށET((((PE.(%^, ?Uh {$cһKTbNka=ڍ.ww2E RE})#0U,R;j>a6џ}~v18Ѓ5vS{7~T)hRUf-NNJ)h%Pp̧j[__(? kcDn5~a.'W}G̘ܹ:fRqbs\}\L+>Aiuu${a6Aݴm^S^9WŊL0))uWϜJ)qF(RJ)hJ)h'=]#^}8( ŽSL?x{8up}. ay|LO])8J+l,QsMp:ڍ=8Z^#<6}~v~_7{I{l;[-tQ^mlr#j*r+"rv"S^UAkRK=һ8Xc :Spꬽ~g%WX(<_5{wM!qkdi9f,W㾯Orkr.U!+O4((*Hxj:(MP1^#) Ţ#ktZ/L6yjy=ieoֳKT'9ݗMWkv7i/V5~_dxW9዁Oc knLw~|il4b|G3SWjX>cYZޜ:  uZ%ϧ&J?[*jIs4jQun4+Ef&@kx1.qӓ\7hw2OGдck_~㿽kQEoFiASȸEB*(('&Gy1#>SIIGtw g(Zu:ݞe̷GeVugS$4o}:Jܼzjп 袊2; Zjߙ:|=~, 9r}}붯q>hWS (¹j~T_d;VXڴk&id9fkƟ#WrQ_&yEPEPEPEPEPZ ٥vdӵak'٢?"WE(ufʹF&/ˈm'tJKˍB&|nl u~5ק{tǗ c9V0}5eogOKy~_was=QEEPEPxO[We}0|c9-Lars{8,.4˙320xWb{U袸g9NNRwlŶQE QEQEQEQEb;:u吝TյSzڝ;a Cs^inMV\͟-`x k:-QO'@VPob-!ŒB7z~ZV`;hZ[<m:=q]ݚ(6On+C.}kּOe$ݮ1wgł5^7Y4t9׻ܽ.}L(9k2{ˍB&|nl AE;QE(((((ai3u;A}3vn[>:>K/hjJU5~s{0E_Q[%~|ķES >1uOU=}⼊ME7B#Z] w{+sMkg3 s]nP5\ZjC_sBNظ)bW3V.s{G, ߱Ż? o]v /hqOؠխ_?#̇oMym\Jo|sCk_2g+q]4U'A^ebzlj-_7+sfhM/}=y]cOU9r{ٌS=}+ѣzvY9|Nu,-y+bZo+JA%chUJ+ءCZtBaQEhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEٞbY%tEXtdate:create2020-08-10T22:21:29+02:00ɳ%tEXtdate:modify2020-08-10T22:21:29+02:00!tEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2020:08:09 15:53:49bj(tEXtexif:ImageLength128AtõtEXtexif:ImageWidth1288tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/author.png000066400000000000000000007654671416353147400227460ustar00rootroot00000000000000PNG  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.1.0/src/pictures/screencast/format-codec.license000066400000000000000000000001371416353147400246150ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/format-codec.png000066400000000000000000001261261416353147400237660ustar00rootroot00000000000000PNG  IHDR\rf|iCCPicc(}=H@_S";8N8jP! :\!4iHR\ׂUg]\AIEJ_Rhq?{ܽziV8鶙N&lnE ADǰ,cVR_.Ƴ9zռŀH< &^'ڴ VUs1.Hu7E139XlcYԈ'SXY+WYἾuCHb BA(FV iO]D.\`Gd q/):_c|;N>Wz_ӟZZ.[\Olʮ) }SzVޚ8}2U88F=FrQ G cHRMz&u0`:pQ<bKGD pHYs B(xtIME3;IgzTXtRaw profile type icc8S[! 99N4R HXB2˦HkMaaxV%mF4!mz 1"!ENKۗ_웃HIgֽ`7۝-~SV1(q Cpr`<=| ?(&c8#'|r|$bW7Ӡj-δp '~ɪXnO#.WP Mݡ~i :_qgHBp%w `0=aE(0{"CO6 ovM) 3THiWF(le2og{[ՙ:O GgtHH#S҃Q?kܴDŽXl{>]66G=yTO!H2Sn/ Nj3P8Ƶ΋sU]w~{v#ѫo#IDATxw$u >|uWU1HӋZD}zD A`HJՓj%.)c@`ޔJ>}܈Ȉr]>WUYވsܦtnmM6ݦtnmM6ݦtnmM6ݦtnmM6ݦtnmM6ݦtnmMV"rM;O~귪Wj 4 5BH0(@89 r2:SsI]inmpw>qLqI: 41~(Hx_ heA <z㡇?|tn C?e.)3dPL&!¿e (`hhhh&~V,lCQ6n }O>I՗1N0S9`0ǺCjNckd2]_}ݿ@op->ģ %ȃ#ANp&`F9877@7)!rƺb;!&鉏?F8ᄪr(ux;8;L|Cg_Qu$<a~N&p9#G*m8!;spAJ$ JPJ(D<8Xxpf q8Xq cA< o$`?r W|_xw2vAO<㌲0 `Y%"\dȒ`nYatÀP5,CeȒ E!I$T($O@x9Gy.=~y><σp @"08ɿPU\%_a4-I=$%:Ol's)dZIa #]סt]*PU@VKjPP̗ɀ`c3s0&r02z qn,lہmYp=A 4 ְpK^K>m }c4Clu^rwI*4MCȅ0`r5 J|Sm22?Ap=7\ׅ6,ۆemA' KySq @^&?m Gs8'=?څeYi1eK%ry9Bf~? 4eñ,X;lۆeYm 릴mҷ$ e+!}Oƈͅ/aI8n( @X* < ݀,qߖN8X5Mt:t:8 ۶`;6Lӄۼ"9#+sgÞ }>;'>,'p'L`( 1J*"FPP*/ rlǶy)7x7ѵ$++O'~o{7.c-V Vf-u`YV,7D+{efm-'{=9c#J C,$?#1 !Xܿ#%)G@`dJFH(z.Hωx?0fFcNĎFf€[/aڥz>;V|C8~q#;Y%wYY/P)Q)WPQ(i!η&tmy:c`!0&YDzFO*lR^{B@ d|Bh((yC  saYll4n8<σy[i'/ǗmASc"?u\ G1Br1ԪUJ% 1<wJq\/ ZX t%`3HTk0t JR) I H$ThR$'dH jn fPIsp>Oҷ}GGɱtym?C@~M&%jrFsX$?9G: m3fwH*rT2 "$IʶH(un B4FlPitl5`u_'(_PoW'nAӿSp2{p)rٙYR)naAs~GcX\X lۉ &wUBTUEVǠNpIG%<ɒH6h|e:Z:66&8"'o|zow'{Kӷx$8YQo?@3pa?1r9(у(d8#ǦX^Z :lۆ븩M \A( U` %Lcd|X(+%LBH,$IDH25<3?Ԗ:VVVQ@Aہeh`t>ZO֤o[?z!{:&qu]HmSEPn袐̈Zħql+jDa !tkkkoF Xl?'%5 ]PVQZbtl85x3 "s' ׹gؖ!hll`uu Vma!ku0$zbm'>;-2]è'011J|.{Ⳗ=&=B{(|GA}}׮]G}?쇑 ęCB011(K( b= :IF K(kvFk.ڭ6&Pߨf; 98!?ƿ>\??m#o?F@UI9OL`zzc0r-m(">b,f \8KK]n r_+KWHrWa%ȑ?;;wB.۶,Pd5t\RpavX[[GẮv$N8 N=ȯ\0}G?ج~ CB{**033ɩIm|~]'Cqp \x|n/@: :9˜k* aAcN> s]pԾ$!J(dY([F88L :uxަ>}z_?G-OG̽XjJ@Ɖi8MvN S󮻠ڡ HTZ{,dt:m/^_GB%* @T"WuD'}=g{~T(֭( FFFqqLNNT*AQD,<^BBo/qpVQF}_fix 1?7x0"8SOB_I\,P$ VVElqA}1 _:4ݒc⽜?㜁\N8fr9chLЉ]/=!vν!ICW+ ӡcO!S^3 DZǠ(;5W!YI(h^ 2z ,ϣjafp>[J<% _ bY͢RnR绰],`; B`6ξ*_sp }=ȡײ?W|[ ;8AGo}&&&cp8(TE ݋fElXX\m[̺{A%=K=,Ǚ3gpIKa[y.Lc,/Wd5}O~[(M38!g p?Ўyl7066{$@Bair,[deaz@Ɥ+? xC6;ч>r93sݘI]۸$kr*\%愼SO>}MO? {ǃ\ oG_t}y*TU=,pS?yB)۶~s{%GS%%O|W{#UR;q)Tk!v;@?kQJh4p%4,?7?_:j3O>=.Zn"叨) #@'I$(B ?!4g@H?S4{~EGZ~T|c$;1;+}YRuz  X\\r(1=􁇿qkzO_|p7# g,@V 2Ld =RwR ] qpx+Ľr;q'L>?s9qg 1E͡P̃LT<ĵzPfK0MspW:8~>|K|o=Q)(Z*‘&@HA'9!ZYV ˲y.|(x3䓟Aӑ@@J)&'&qםwafvm26lnjqn(8w }w BXtBHiɡX*c ~ Yύ0 =\W 'L 02>̭) Huw${.(i (1}l FO܎}QsRyL++,+)r}>[/|GQ&guw`,C&9kZ(B86l6!єt<n~_1^x YI20 *b\bpNn>#<ģw`gر8uǀ X)5-~::y1vfzB\# NF9g (98C_@%oO $ ukGQ5miQȞVaZ&8Y0rC pW!0>[N|$87'QJqqy]O|nNiZ]xfmBj9(_CY5&HToWׁ![R& 6y#c(o He _7<|vK*x ~ B033܍#u]XV7v+6A՗.^]9_s{Ϛ$ 0&~{1p4L)m[r}ÞnG $@~pdMOO;HMv9\ǁX^\%l ɝ${$I) (c̖RT9mہG{tV9#Y]B<&&c9^~=ЇoD&$(h2Nccc$<|pܐY'`6(h+|.9Y)N E!39B*oo*)'o"qys=v<߅eEu Ӊ y,| c}5LUN;?/J,O: ' 'S" @V7۽hO(Ҵg$tQ] GP$T*!<ׅhRJ]Z \<#EN<̔Ӏ蚝Ca~29P,oh6E%ȲQܚBtJq^FBgb~ HƤg{HzڒUԇǵAF>U*e1xK ۶z͑'{c_CzjtmJj7bnN:#78ij3Nuhp7vaƂ !@Hkۥ8D{ɒ$)-$vqPu-r:\' sȊUQ n֝۵ 3kI,RR˗P!~?*ģx/xFbMMO䩓( q&h'rHD! +r܍w'linvVA{dLi $Y㸢6-bEsu]Zm4 t&lۆc;9 98J?J)dE ||R!7IΘ\%DhTBbtlu=\v#x?ů"#x͂p_^HSPU8n@H7tHT }Wߠ,'PnyDꁋy?nA9Z nFNfׄiYL /@{" MӠ:raCT {>n& 8!]7¤ 1001>q`G?yf^Ӂ_=bk?Bĸc*㎻0;; Cm;VcΌqjpz7hnVT /$* gae6@i "*Ql^o,`$P}"vvwy'b(I:6XZ\eYLiEVtMۼ=4P]vXuhPH< Q0Hïe Wcyy%n-ryn{IB$H!Bmۨo`aav<pq_ntb,jbINJ)4U;C7[~t@0W_qd.~瓿 @?L}@q{}x Tщ*X]]CI/Q A L?B5tpwv-@jO~'I7ߛJ#DA};6cǏm*"Uyiq _H0<G8)%KiBy km6-| D*u-5R Br݁$I0 a%3YxVMiu3|l465 SO>stZG; l99sB>H"jôGqr94-[L=dv ܱi ,w會Jwsju},..^eY)(.0{5+I@utD̟\゚ @ywwڝ-.Wy#] Mf0X3{O@ɲ,`cǠ7,-.o6mYQD^ιӗݱ?hɉI%x?ތHm9k7/~'E__[rJBDHHTN aumOɅz8\|@Ҫ#?`;qwh9蚇#ϣlmF|=8vv,g 5~3\.{rih c KKxWBYAPD> B4syҸ%2-\EX"@@E-7~U~o{='y<Nl6 JE04Hi, hqc?<3-s?? ` @{PҩX֑N J) @AQBbͪq&wA`_{06>9HxW_CӅa\>B.rpeYaT 8 Ԩp[(P*Dl?3Cso{[^ܧ?g P_vMRZPoUUyl*;'|Hv{.x>(?3g07w"wxQ$Yeo=g]k s3~t!hKk5 `8uN L)EƅE *IE.jam4hBUT I:ֽ_kRh|^6_"`4co{3{ǟɿp] 3G)\.BW&T%݉:Fo6cӟ=TDi\Dc(04d t]Xh|>M!I, x#!ۿ-k/?|w>I͕4M @R"!*Z dYAX]]IV&;~3鶧kA$-c{177 fvHdyVk@»Mٔa qe!lu\8ptB^]C0X;byi ^}-lǝ9#|x,'y|.3zVV^ǩbLӦEq7_zǿw> DZ *IKw HZ9:6tLQzC 39 J?$5\ (}8r cހ#3!Iβ_)D;n=@1%ߍb13o@7[r*@!$T!06g|d yQoPMsW>_@UUERE>";9oyG߱0N?3P,4#MKBU5^~A6 տ}~j۞ ~ i`z{'Nȉ,po?I,:6(Na=z, H =?. x|wq1 vdqa.] k pfp'l >JaրyEAr¯\.CUTtM5LsG7wz4圿 \qPJ16>,4+>G@&Lԓ;Ԉ   >xdž}I"a.;q_Mq2 G` 0g Nx c7-|߇,ɸ̝8qbriREAPz93~_A% &QB s1#" 4MC(xL;LF!ovEٓ9#GC!@{gBROhjZ Pmceeo#'8{gm}ޅDy8u4N:ou{BTX"ql2d]t |.NL ,l&uVф )z)WD> .E}:3xj##8qr33(e `qq׮^ =D|>]{z|(B{GepNH}/9dqf!HSW !o2-H9ES&$'!Ia// "Ey+˱%$ gqpH7@@ʽ8Ǧ pzξ0s#z Ɠ0S Rэ8A%躎P,pYQl4a۽w!g% `J"ffg0}Lm!llہ&KۺT3~vh{0 qcȡTb=/0TEz}e 3A$}^ Y_R5Т}:N׆ihJt;)S0!Uz@1R@釀<3uWĭlFvm6mA86x, YMa0r9rQB\Ǿn12qU[3(t.Mݥ.u3177EU=J)666P؀,b6{u<3⏍g@Z[[A>D S(~:ݮи6j+D'mcuuJ9Udf(zcsƵk.9?[Y|쉏~.fffP, Rg֖ia}}u4MMm# ʮihIP(PVPUQ⤦a ,˘9qƵX[[m%Wq LNN@tmRFe ދi?o2:sB 8Q1*Lz}j319yX\ZrpXcg]T*ysz>~"ʋ )j##(KaCo|?<}}M ec Fw: 7XEeYبo`}V}< X=?h"^;v%膎RZɲf)uSSj,+˫X__F ! SBƼ]J :FGFQVJ BvnwOydYi)\lo* (ʥ2I/^a@T ۟@1cmeesJH2EQS5l5㢦}6cC^O /B~ܚ; +:66hӘ!!<66Q6 4M4-BC~S 1X%:F rj|Ab|>00>1۲vt5MX ׶^.&4M0r J]ت!Nf$ Eg$I'l$/ Ua9&VV!KiSvl7ꘚV$`UT*PJV5pTDG!p]f R9kUQ099+W/Cܿ]<7M7%Gp7}x1r}߃#:4Mbaa!ɗ$i הtQ Q.pFFGQ,c~mbRIM, 1MضvyAkەh BI윔mXk0tB|4"X6$[8f]1ZE݂9G@Zj[(Fj D6M0A|*N3<謔,j"LL.|ځWH |A״Pβ;<ضWkp]mL?J(Q9vxs(nĩ9LOO087BsP;"TgbB"4-efg`ЈXIkpQ5!!0~| ctd NRQ1=5-m]j bh4R?d~혙״m+] CGVz}=e2#ݔ eJZ,!r}Frg+| \W<;&caDs:d5~x׶R Ucr7p]wرT]бe="gVe~#(s<ߋn/Ovlg[ǹHVkh4M:q-c;jcC>,$*am}Y dY:c;3Jc;6J^ ##rD>" n-Ba $1;V %h6Zx9466yަ@=YEMX[_C!4YV$帎=*WM&[h3:wt;]Y8uJ⑃9} _38z{BFSxFё<"!)2̓g_t" cfB05I$x iw^2~i,6R쥅%},VWW8+zM2 *** 4]FM0tR"'*kSLLCp?ea<νz++{T)G>m&Iu ☈GREGeYBPBXh,hwXFUULNL`jj,xl]w0/3P*`9]gLb}TPd%ٽA [gD̳K/aey5Y6bz)W "!BkdztMˑCa:}$\m <X\F^wE7󈠬5 KIoaPlݾ I:%J(K )@zBׅZj5gvltNi:X 䋩kbYcsV̇ܣp~oh&o'1G <\4n?ZgaccgϾ6jb"$*TʒDmN;BQR#CK f!TCcqaBe+ej3z—Co&&@2tuʥ24M41Ʈ E]1>>d AyO$|(ːe46 1T+U($@\[xV{O$J| ;uL^J(=4,IB ᬲ8 6:^|%tj$QݨF|bܭLlqHh5#}غΦ[c !Ґ Y9GI J+%i }`|bB쨑-k[807-tݡ$TEA:"(E jaNdafv .BiTuPf_x?PAs(1~_Dp'[2X*F2>,ۺGӆ%ڥ rEU @}DD5H-%J"g]ύRm;;?>%"9CY/]L09j9GX@P=σeY{lC 0t#o7^@~t]C\$YNF` ZeD064iwq ,++;! VR^jGEpd|2e멪xh4~BXߐlVXCP'[2~4+Z&CaQ3P)2JT]4cc^C]r[ `) ĜDFX02!- 73j|lduI& G0Bsa PTPmmB\E١?öc9$T5w "?G2r'Et~00& ] NDK8Ei&ng2FPÜA-X(,W>$ Z%n7q3@sJHmJ0avX?0G?R)lD29p7 !pef"FGGa,Hl"TU W~8DjToB&ee-b}}=-(xcB„:|1>B F䕇2~#ˑy>n\?Z(Q066j Q8;M8i'^߷O DRP%CQƴ́",`0r9LNOn"5+F K sH65> .GkܯGť>aӝSt*"aFJҌ|B$5d D)R-..rÏ*1QV195)ҡ2/-B5#:}䛤? -RBcP K*Ap20x ,S$͏PZ ccJn,#EDm]th>*j: IL.\` ~sp@٦"C9\Acq䋄8t cqwBXjh<^y8.^A ~a~?}]$19%p{ @²f@֪v+xv,D߉UR!$% pA!J{7g|d2> d=< 75 PU13{|Y8vB]1& 8 mg 4SMGG<R "˿&sQΎ MvQPJ3 .vJQ眬co+`uJI݆D䏓 U*D$N:rz:A cጏqA0 NY0;wVU& !Ġ9xճV@5#N<4[%t? b+ ^-߁z0ObE@s躎cǧ195<fkka IOldd98gئCF6Rũ'$:U'A~C/IAq=I ly?@JNNVmF0rN3<Ãg,7|yzEHof2Dg`DZ@HRbe 3j/h @7uJ+瑡BQ3skvP.WP8x?fl!g#.f:R&Eq ̝j.N1Iv,e*1.{1x~E5t@3#&K,㑌;3q(]aRtvv$_gV V BRbQ q>z{Yl5ؽ|@f)p;1{bv)]a ~G\X"柕M7o0$U{6"ODMc[:z)76{Ga4C~n+Kr2n^!Q)vF?IIO/W0h9xs=膎0{bDMs6q# &0!6 %gi ,%$&Pk@L6د,CTHվ0t^p6w \~O#wBقiZm ƀ*) W_%ȒEUa:tM!_#CӴT$ǩ1("z$å 1??dh=+J),I:6SND@-$󼁂5p+"0gB,'?׾KQgpy. 抡!p}fb؋ .pȉ_]F Ql{@ȼ< c}n `)_$u7b.qDߡj*J, N{_čk7j Lc0d( 8vC.b >+쟞aA- d$R!h4ZBFB۶X_[Ǽ6#CXDVEVhNO@ފfgg091Nuh& 8; J%TeTGCPP5f3/eYu0}:5&H<4@Dڍ7~8@%ʕ2WRYcAu=(kiX{P| U <'ǯI-w%m!|;-P$&(|F}:6 4tMӲp\rgcnn|.u_}Bрq#j.ITH2UMifJ4`{MC",yu Ƿ+.<TBB PYSBcX_M1Qvq< %)E{V0o{jʬ7sT7WT,t,--LDZv , YQ@$]@  /oQ49]ŅEԩPlA5Ԍـ18{),}~@qv%~#xG7H^_P^h HTjcǰ UAf&t}w`w]C ;F #s#スMO|n.:3;;tw$ ڕkqcn7olaa O qp"C$“ؾyp<۶۶;ŹW^N>cSgΤz @۲ͯs~лc,S*GKJ1,8U+Eccct XN:{#˶ Cv?ꛞGbnH0H4͡czF.a݊%ȲĠ}J+lTU 1LueƎ,a;.\vNs'  :uPz 0ƚqǸkyiWՁj*dEt A熻ePms KW45t s/Q)-Bn \w>IWayi9HOy g:TMj"X|?pNE:r\"Ad6jBxA.@.St6,˂iW`_`0.c8~8 ·&ƭ{"s:\7N@z;+v-l1TUotq+6vH2ăI(Ї\9aTmr9*o߆v;P.q|@fX]YWfGkU B)aɶl?ŷ >w|:V-ܞW!dxW_9g=1sS PG #X;F}-v-7GNMk4짢(X[_Tt)qMpSq4[M8MJ0Q1q7Tq7=NfaSV98H.vSOB3ưo}[v͡!w\jdY cF&zu b+~=xѢvaE>ٙYT+c& dy{-}"0ts$"s|/8W;QJ?w|j-Iܢ^UԴf9qfk8砒 ;lzx)nGgPq;~l@zξ* 8*˥2PT!ILL<{3c0=5SNTAWQd,.,_Jŷ:aYBVVVaZi$+$|a8Jh9q=Ti&-"'p$Y_9q(J2@0MV36Ll8NӶ5br`ó}c5:^Ǜmh蚢LCTw =F}.^FV$Vadd9#M2~B_g07\.cvvN߾L(23?kW[ A  * !ӄуnW.BnaqV^6pNuettwyB!!}) EB? B@ c;ܴP"VmcgI(Y&6̮V3b;8ёn.._z4 rJFԉ|R9wKd?ݬ(rW*UOZ<`KW,u,~Q/DЂzdAu@=,+repChaR` 1v)j4̺jUSZ=bif3ѱyc[&pA 8\bmuMyH\@e!"MDI]2^g1UU16^/C̲,\~##\BUr1ߒHkno!Q?::kWr+Vs{ԻDA!_,BF}qh+S :Azm3HU/^gH:IC7`LE.|{7VWp546p\'ܬ:0Ƀ±WU`*8CkcX^^ a _noKC?_?C7P.( 119\>wߴ$K2JG8^y(M=CwzAoA 츅LOCXIP (JW=`dt##X]]k7r@is'PV@M#kaj9‘ۄx?q>c cch6{ImXQU/\2u#t۸vG݂2HYPVD;"^YTUg_}3-6`9躑JނRl,/cqq eM+JFYy##5LNMbl| nF-RV9 TEAP捘m8{mtM;kplsQJIqx~!ajV5an /Y*j̕ PcVc)WH9\W H)E1˲j4h6nt~/pluMPQ*QQ*"PӴTfD%\_[Ow X*PdtaÊs.<:DJ)&.FF4M~1C"eș`@*s?2h!-]Wc Ae.]N<:GayvwhD sf 9 r #lK4tlG ̺"X^q$E=%Ie(茣jZ6"FP#ؾJf/,˛ƾdIMˊR2%HNuos^ SO +|I<9@o.|0qēe z*&'&rٽ3^!! ?i >|oRfQȲ"҉URK'̀ݏ7FccVBQ{9|}rqc:$YN%FQJivrC2 Rfn7Bzc@91PIi4 .in$nA䜃(%(( u"uDžm9@s8xOڥm/>ܛæ `րSRnׄc; 1^M7P.Urqy4ZZ  @ ]3']bFn$ v:6$J{鶜CdT+]wيRBf'^Ph ^:8v\a)I"*pEzUtefME,RM O۶_ [d C9,c@)o'Ju9z̽)ʲοW.H**j0v{I4l%v[dmYW_|H_z/b0zKQwnB#ܙ4{@I@.kp 5EgvKKa~;╣TB!_BP>_7K1ض}&vwMrc|@3/X^]x: 틶`H†υ\][/!IBc!-߱g=̣r\@8t%7n\Å ZeR5<|G~<KPvl7i(:icqi^rmڛb(~_.V2/l i!mHI~I/8@m9  ye/ _1" =rzCBmFYQfnu:Gp]v W]g_F(u8}!V eńą^KK˿|~K +f{s}P pvr U;JptzUU1??_z 5cxRvgз L2C~G#b!ܘ׮36(k 8 +Rd!?&@0sq$88`m"~r+Y2ΐ3k4t=_󨯯gvb(,ڃ~s=c,e)*\O.^{'p3!Db` ,.g/@QFqTx1G;mX][6,tN`hC"}V僨MJc RAմ7n\K/8049 @x[D8Aȁ /@`"gPJ_zkkk=U0Uǎ}DE'&=B [q%\q K+ݡcfF}$z,FTy>TEE\C%Tf_5́`}qa cf{* uGӴbP1\v/lNJ@C@X9^%x9gԓEnbeuׯ_KqE%ɱpH_$!a t(5E~&p(+(J!l8ޘg_2ymmj\.[=Ib&W''u|\H\NL$ض^~ 8s{%#|սÃmEX̜ea2PN? Djz}k+o\hxQ` nwj>r9!1Ɛ+Rr"P՞ꕫ AO]ב3r`w4qW~ [DiIeV >,VV3+)HjD)E|ۉVbTaPԪxo|]| f63Mv h0A8<4C?GPF2"S~jpEٓ=l/&YQ*^&F+}rc~$Bu]rBh˝ _<~~|~@$ X\ܺd !P5|~(m㥳/\,Tϥ(ɇ3`&Z6Z&ڝdA*GVFՆW9JG\X(BOt{/ CTE:EU@>(XY^3{e֯J!Ns[cq_'A"*8R-t ̺mB(\~ tD] f lU01:%Xy$InܘO!` Ez}=n&@G.(H:$%{{!m؎ v_DZ^ll儌8̮ ˲:.Ǎ[B(J1lnBerƾoʅ  mS(:ܗBm;G8u{@<bRVсl(A/# o}roxwebFjhc$"])4EC#r&_4M (uMc K2$IR#C; IA? p'\σ:m mö-hrJ ֶA3i-;NMg!_!B| J f Hv^Ξ} ;4#B(fp,wUѐ2O?RS'O8`x-ĭFRTkUSVubj8K%YsUU Q)d/`!* ,K9<'bO0Ϡ}lA݁eC59J!Z "VkUbE,«^s$n R|, 'n7xMs॰7>J^{lF>/((i}Fǟo1bBVחo M0MU15=+rQ~\dS0M~m[xC \X ݮv\k `rr|ycET>h蚁tZ:I|>Ο \$IBXȲ0e~@kOntSy's{UmM I_H f |$IBP]SO}׮_l? TM4J 5DNe=rJ ѝ2-l7UZ8;?DxXd"TPEZ{z_#@: Iը/ 8,v\.ʢf1,/w@") }o܍МT|.@d+c, bJU TU 3a|R 09jJѩ(Gm]Nilq6b7EXHmλ؞3 K2F(y%/๯>$g.CPeYX^^κ97~n ~@]QBl6Dsm8k `5BIUU9A(; af $Jl7G]%:} {m8GÝ)ꉸ<%|BC/;Xg9%DZ`~119^ $YxzD$8k׮_}W]I%D̯HNlg7rtɒEh=x۶fTu;*οQQ0T qȲ:7k>tI7X[IׁpΡ2YAiqHaYxY±'`>nA "HO঄O/WʘprhN ]5P-ZQÏ 7d/} ~@!P(B&rUبd'ݴ7C/r4Ћ1j6o7[T~RUKKK/7Ob6NjUQ:aBIp}pt*8bPߘGٌ"_D#Ĺg #8_2iH2?aiԪTE͐?UxϘqWϝŗE4 z(CU5'h60p^ȫ{=~_C]!z6YV I4ܱ\x! K:qy؎uEA.bf ł0, mm^ iя }%<>Y{L1(J6ĝwn7]WuhyMӰQ H|!YaYVfی077h9fP,p}\.=2sFS(=>eN淾v=̯X, @{mEvKY c?|oL<)A#o[ DlUeB"zv75-'q@BUHT;tP$IR؆`(+hq).cl|7#D]$I J"r\}V9+jZBYS}$Kxo|v;|HꚚX, f1s=(g?넑wV`1݉U=EAȅ9غCZ.':4538f*( p=Nw82jnEwb6Q`drN:(|?9=rje9#Z SWV?yxT۶7gpk>W}r2c0 cNjy\ WϾ PJMA~yY3TM,'^Rj)v+aX,B3SA ;)qZ s!:WUUWT 1jryQYU83{pHeLLñtڝAi$R T!BxUo/˅B8q*JF{*ͧHJ D!h+.!ieYDJ1bѯ]j51%DZB(FFG 2<ۤBTT*eT*w"Ww;?y\Q> qIh[N9@8"ald㣢gd8!z} O=Y= ̰zjp-8<4N˰2<KOʮ/d~۶h4D^8R*E)AՂy}^rZo}V:BRfQHU R ]7v4BRz$(8>s B/]J)00@***<_TgZ|8 l^wdI`9KE (T5 jl;oM9ga~]Q*VD>aBP ŗ^qy/jzh4j|J981cy73(cǎcllFlL }ӽĪw݅ǏϠR@ 0Ղ( 8فiv`&Jd0% :k\MJ==0k @A RسPJD8aS}-JSG-t n1)7sy#2_y,-.BUc5a@Fz0=._B@ Ng~s (ſe 1zl!G."sࢦZ*}(/+`uMogC\k 8-ʵ"&:\Ls'ƑX^^A; HQeȲ|95|-((dE,ˠ~`s5ɸBBS8>s,oi&$@tE 87'SLD^ /~}Y{^Rk眣h`р)g@~mF{ge T"Q%턄VU A^"$ p%,--X,P,}N2(ʐ% Dw(nttJ`o#ۧR IµT{?B%%J)UAX }c8sȋ(`68Fa,k,sgE))r8.^8g g?:[Ѿ{˫<Ȋ|@QU$ѸB-+}XeK.aemJ f\0 |P>8Emqa+,#]3 ["cӨUFkQSSJ>.^?s΂s e|9X g_DA굫0lZN?` }k_yHŝM|筷->!xj~ެ$& Yn: bS8UɲhqV.ViDXE9!R EQP*095ZDZaY6 B!b֨@0N: ǏOT*BVM;,P*/blt#ڎl  qU|_y:|gAVdeFn)(HVWW:"='J %f;6Vcۛ)6Eeal[m pu7t:8~lss E% EV`\υذmՅqAb?R3q]FVnW"  ߨ!XMSQ(P*Q,2DYy\hq;-q.S6`qe_K,L^3QnTmO 9t:XYY@qaiߞ_O/D >3Ơ*;]MPܬ P N̝8ʥrܣ0z<cM؎V޹@ {>Z6]emX-=|'-$Ie $CQdhU Cx y9VTŀ )<!ZT8*EV +"*hF/X6$>#Kҁy~=?wy ?>0BPTqɛ*Fö,tɸ^z\ׅآmdnСT+81w( $zsa$w#@N?駀:HAXL܏BWk1J2'bL*ǟ,Bبױ:nիW`6TUamB nܸH&2EL=UQdD"R"_B8% yJh"k2(_>/1Fɧ~sט$Jp9q$h +`\DZcqwbz* ]E){DQ8~/A:6s=zE3"5]w2 2I$+{0$uaY&6z2^9{v+FEPJ"bqa Z]&)pdAaAcQDLDcA! 2^M,2`+_ʡ4?w!Cn1*Nq'rFnl(<ѵֶF$y} }=;jufNHc8c%I=B5 ^j&VVWp 0M+YHV 4-,..^_$ 4UQ@% Y!+ 𚊢?}Q)aH[N H8!\m=lM_3SkLdsݿ?9R5 OF>wGA4MfwǍ(pN:ɉ)ֳK_q^{7n܈F%k BJSlnu0нB#fbvvt;hl4V_E}Fc8#rNkO?/_{A&/K[>uL. ⁄΄ 8:|ߏ;l7UrMP0953EPiBj`yEK<'vU$ "FƅZI\EDہ›OWDKRS)vV}J s- K7X[_*nK@6Mtop?}v_a5˿y y#055Jg-.!`Lݮ+W.T*P(@ԊsYP,PVQar(jV(u#3gV a66h40Nl-X 9eL$Qb֋tYnWL3tܲy6c$j,fPȲjQEINJʋQ`=5pzz1Kr9#USÝQ>2aPυ븰mmEڵehX[[zqĮ'ˢ BM q]ؖN#NqrKw^D#-~XiZljDZI$$0YӴ9e%N%th5hwZ0M f v*] ThuX$e |;/| _5ϓ?h&XB9sE7/qWQ,15=R 5%g&8t@VFGFQ*ˉzMUGn̢$5P@(:2TP DpGob}}++h6 GLKC::E,M˲jфٵyzϞ`dɿ0*]b1,|*X,0X8DB$z ! QB@(E"Wa$* 8}ЅgGB{#./<0UUp;`vcfRxj&195hF*9+ϡ\`b!lnBٷ_ہE9"Av;mm76`&XRpAnؖf,i鵉֧v'qF$IT*0>>RH RIB0sx"vEƐv o#𞑨}_5K1p7?1HtnwiwW! d110(}{M*07;bI%Aol…xp+hw5=Јw}Oeen~ݿ0_%+(Yh6ɩK`æQ"`yy96a(F<ĉ:wLajf0nvs}?>ӄipl'nbyn&AAPe d(%*X{8˲l6q%|o<J$ T"k*_Wv|o{y[8?.8@wtdb}}=^qnj0Mn1n;k=`ij*?[ߋT,<-/h5;h5[hh:t,Ă{;n'L|PZarh;X][&hkv@ } &ItMC FGFqi|1:-\|j Fpw;Ñ羶}o \? Sv:@%T/-KEy(vqR* ڝ|O@p S m_G*SIfaHtjujhiu`|?B&3bl=,OUx$I, haV3NA<aёctdD CIv~Zc'=}?rgO Enmh E(zj" K{qEnDZhn,xvZPC<5EBzݮ vXދ8jhv2԰+NW\h@sE'߄@ L3g077\> .$H9@_N{d|<67Ӓ%rdi$nヶ$nMASu$mm(Pǎ m ҺuGiR[9ȥ(]5;{ovvwuKμy;7{_/L;hBOmWMnT24YF5vlSQ!X\s5 BB879R6]Rzp/ ,RQ~褜ƮJswZr΀dڜ*4󢊬,:X,222‰wN&Gl=QoS*pߖ==iKGv )pB?@ww[\KOOOGxZAJ4ǎš۲IR]ߒ:ŘB"G* * xtLv鸿7&Yן[`X1.Lr ,[WWX(,IJ2)vb˖-cqMaྯA0:RX%nk׭j*d"D69ضM2dӦlٲr:/y%!t RQuэXm('^& :kVkZP8~Tqt0Ru]J4sA,ޜբ5!Km|sZEh)/F!߼`5V&ښDf 8OP\.199:OdW82#O>hpɮjsyC<NzM͛7eɤ~+cg{^b9ؼ ZaP"B3Kg.bװv#|` 2eѤ׵oׅ)rsTUsH~42CC/qmCq5fbafzr44 ƍyNzzzt1O OR!?gz"R1h}nxF\ߋ.vkrޥF8gl#%Zh }Xvj}0#pq[ƞB0>2;;KT"J~,L&Ν;qj.LQ*U_V)WZ LSTTBmIYܧR4V-󥼿;Ŭ娅muS ̦Y (SYϳgV2^9?4twH ⨎-_j9e]L Ni&nl۶ _LNLn(7/PunP)݈:x:> d.1R{+]+U[Koxc`o7F84h ƩyLN^`bb<]md]U/ ):vߝwF`--rDOa64Uctuuƚ =l߾=laGcnν7 ;P( JEMb:j8UW%{Axo~oKm7-@S . ,B?ˁ%`W:W/JD<lop1Yu' xC7pWWvb׮]x8~qڢPS\o-!W4-7  r3l,lT9Rvuaؤ4isCW͉Eղ^S =}>H~77vdɬ͐ѤfN݈j軌^,paI'&\*'jF-h2lHZ U8LغKmre-P`5=CB7So.gΜ᭷4^?Ռ]cOM{Q8JIi03q: ̤U^v:"fM\na>!4֤۶mxU*2||^9W I|zϣp\r4+7%hh]vx,jMo&iX [/x;4n- 4X,FRɓhRَiǡUjɷV0/k\$Ӂp|U H?[ǁ{Q7zsq bsa=Hٟ'tO xYxnk>2B sՊ`՞ {ή J؍ I@SIq̣lh[s{6"N֪UFFFx0X-eS5#2VO<7Kǐb7ZJ5/x8G'+[`XA%y(v類dT$ɏ"OekZs\չ׎kL.r =4 MRB_i,KPjpioscߣt!E :$?%UJnAr&@m!_ R)~|SvlO  Ň@~ !> rRax'KO H-²ǔ&L6`_`܃PRA ~X,ƅI`vC$.13^ ݇-PY(ӵ5⓵[.Mp[Ï?drxYG=}_iͨמžjYdT2M" H*5e k(jX:g$F:E 9,0ޤEr?>}rb}[~,J] !vuu۳5iէҔ.,ؤ + N>ÆFe"W5@4P{t&xꅍt, mۯo/( @Ӭ hBL MQ.nĠ4 ӂiZё=kzB ^{K_YvadDO; en;ЇƖə2W?8 8Ӛ0,VD?{M k7 3/^܈QI]PBQ ;pOV. 8B9y >v)aDd潔5t潊g܉Zb!E~ҋ:}ip*Lli#"BQIQ*0qGF2EwlhAְ??yOM{zGEIDbZ΅w0+ /s `o @b1q{Csw>f9|Gv7-Pr!0{Y4F߱Ϯ?xh{ r&{u|:b \3]C/Z0_iaSg3u,*R2cFz39X|~4|܁na(@SKw»s&*71yhA%B(Vۂo=[v>wmot%(Ig6P/ɚ:t|S Nތ\H~ Ʉw?Z%;0" @b9 txϊ6._ ו0m`|gӏD_ȏO݃zic'[mH=[Mv, 鑯q`ܥ?hЭL贐਱>tyAeٚ;ī1o@Zאs^j{-JaXY.1Ќ3T*]l /wMR6>|;j詃ͳn<~p#gb}y7xնD˄/mbX$A0ql8H{DhZ!wz\o OЖ~e}t{c@cKJL z5-|3~1=H$"lWiAB XavuPhDDNHL.(ܤC8fZ>8qKs?agW"qmG{iAhq~c8jҨKr>/\E4Mu;xC(YO12 O(5, ǎӎk.< (ds @X]'4ג0R7: <M-mW'y4qSq -J/)!t]C6kboEofА5}g>ى:_^MϜiaGGqG"0 /o~fEiv:<2 ޶9cKn} |K@%B KVn/u z 2&0jTkK ?re ̽`2?u ;j< ̿i{ \:h ǎO{ޖiV 8QR`:+1jhm7Mx W5>Dۓ [1~3EWD2[>|ބA54By|h߱y'3:@k `߃'AA'9C.׿KxuMν]r\/ hkBH_Р<E^s3s1xGcXCm~+HH&u|/Ge}msF4>o=ﳀ?q>k"B=o3K62dmU /5/$ Gy|@>3s?~55 E|""L\޺rm!g9sis+1}~F_Ϳz]I]S28O/1~>W1|kN  OsK% (jog-Ą;qW 䂗}S 3:n]ү 9p -miA;v̲S|a,\DL=FDTJy"/ :pqZ=}9 y9zAO[#+1z(×AdB/<0L8e8h9fј>Ç1:)T~*d:H)}ߒWW\9,;['8l@SKۧVR|tL~1^5</b^Z3>*atypiWS*@i8Vɦiapm>?mƠO~-x;_*g}g@BSKۧ&sp GcBЛ1ퟵ㞇 k[nu"p !spy|~m)[nj._pyE /kv'Qt ~r\zV@&gbq6xXuD &gO`OvvYIqgZN*DBǣϾs!|,2,'8Xgzax?=ya #yP|w \5lٍ_C+1yD.8zZB_ /Xg <3(Ϫ5,KNߘ{ʍu'Fgw9 /R{12(3}#Z'2QnEaY:߹| . ?AQr^9Oer./?sq%e~]Ғjk1)PeZ+_&ȧӕ9bц1C)&ONѝt!N9{ !xɥE]L.- a!f>nP=ۛ/>xLM?y؂DМ~|B<3s|. bvV"!"!@2 A1-& 7\TR8qxu|-4ooP pnW=˘w]ww >7/ )PLz7Q3*!y~A.`a4$UO Aڧ=pQS* /@:`e7<%_{:XթL6󿿄O K6]_3R@b|^`J^K8Y)@,NlNga@?P SGz8U></,Dk!(  P鉲P 4dsY'u]7Oց&D0~`>S L..RM ^t-W˖VJZ3UAks2`3\ɐ,7ޚb-uޫ'XCW:T ӀM-mLL'>e z3Xr*˘4]ETopHZ-mUFq4W7ڽ7v?3L0-@!k{'h~Ay_aA^g.AwU@',X8?l T/;3|c^JN"M +Vն-|.Bf[pխBJ}m NK`cfQ0=Sz r} N;(@ CŭCKA;/ RA@YEwsfq`=1>s I~"(9zA@+hjv%a~`A@gMU'X357c4ý*J;" YzyWO U 93vX+4{7-†!k,G&DopH 斶e,èʷ7k7o7:3`Wn]o*10+ 2|hYb_3P/x'D6>5) j5C $v%rj M-m+%C&r|ZL5)3qiG.Vw' = fb3#| 2A@Ltd Z9|{Da4`ߝ}goAY^ H?'9C ըL౅H/ܵw/D_R(+4^AD+SJ3'fЙp߀Xٱ 4U($VF45<Λ`\l3`"/pQv臗Z*m Z#NJB6&@X'`a_/^iMùfʼn 蚆fmx?[p oѭd* ;RPW< `w7wT!"邘_fh x"}mSRL"€Dvtl_m,`Ɲз Ef~oU묹X*W }]άg_\`QC6+a 0Yt6/ l_;@܏`S{hX__fq^IE\ r )b*U˝%އ cOgp}觧[d]=]!ٷ *XaS'cY՗v[tjF `jnQ3.1I|ll[1#>࢕& D O|H[i B_r4Pٻc~PBeQ\rx(y"PR204.Ub&ھxiApݭR<@/r\pZݛŻ'?(%s ~'BA 4 R㦍)#J$@>gKY,xe-ގi $w =LWG yᐛo5 RE/x@ElG{k:"AM-m-OSB[͙8'3AVY`>?ۤN9j4Ι9 vHF)HTH%PN hy@\͙3Л5З57R^[?޼[~y_^A Xw%zBCz0kZxy.^}_#ءB1uvD4EAG0'5|PFLmyTW(jAnn=wxs~}>es_ >?,۰p┑&4 D:t|U)쁪i)V%t8h!nD)R;֐m_ϬҵۑNǤLF@%}vNY>!Y8zpo""{VsWOZ.YDMƈU#/.[5cp KfrɬG@*fMTT$q1i(j+Lh`gC-ՕIV%N&FBrrwS̫rGTB$*I i7c`ρ !UI|e:zx~cA8Dމ0'`Gcyn=젝(czPBA(@ 3zފW؈㦍UJ%0XS՗0F1ay;HSbЪYw}\5i\("':>ǃ29@PN Ji ׁo7_T ŷJ&<CW2DBC]U uihBmU ]0e,0`$8t ,J)Lӄi-o1f!V@w,T3B:,Y*ںtW- k"R8)7I ކg0 F֥ k-r]V?B/3O0\L2f0>rbtD'ױ|nP@N"a3'0w@ +,rtEZs }4Eӈ:4U" @6E__2 r{ߣJ4Wr9dYq:uݦia31e`&e,) d|{8Kd:ټa<"(|'CTѪwP|QLۓ1q/cA Ʉ؇&QJs pV` @B *TqkPnYrzzz8/ `~q~>\b0 r9r9.6ͣ!CP:!e3qIM0L] (;C TB×~z285O]YպoW8c G NWlt]ݿYS%B1&۳9S]t ~vl}|'|P4MLajvUz>W>,=*Xl6\gC13Ls|3>r4,'/fLt[ ;VvA4$?=\**}.8L;T~@Q6#2c@ B͇Ĵv 2/}ꕵ&$w5S3# V0!AA7UG0[Ӳ,OPWu Ğ<~8?bFE>䄼;G(K(ܗ5/^."uNL76 㤗4'316dBOjҺ~~pT@b3` ظCBp*5󄜮4Y5zX-l=- A;x"q<>*/}YCȳ7n 斶c ,B5͆io_1{_%^QϙJ m`EDgn~PՌGH(ljis&xSFc'E@T ,\!p ;sq)2~͗H(TLKԉc5 ]30N2?8U28DL-" Bc}lqZM:},+-53ӷPNp3+iYjJHl#2@[nk*U/j˪'M?jwnbM?qnbz@a UZ kpsa΂({ Hx;C`pA /:kj@Nz׉w^]WN) nQQxSO04fSP!m Jq3^=n.>e" 2 *kt:i/X?`IB 5~W؄}]aһ+,JKg z-J %.h3ƑLvkg?PYjaI]ieOB%D=+B(9Y9y(FG_ X_DdBpAG9"ӅuH*2z ԩQLjX&1yX`bp;*nN>rW{#@aq1f;_j!vnӋ;{_O~H-0U;> u]ĄQu2~h\5 ]A YlNd&f$ ֕P \㛑 0-!]MӠcMbJ1x´11,L-\``!At&1eP\~AA M3-Ygm`O_ڟDӲ<:|9_#} -A\@ DaP,뺎d2d2D"1}~0`*TBñCdn~ <HBdQpjYso}Ѫ; Z8Tt.0-.?~N,|,\֥|_~"ᦿ8Kq߁ .D/'\XDiD"d2T*d2)-H!^ [ `pFlôpġB!.E~U|*$Q11R_|qXw%;z&5 ({ ii }s.Ừ9Qf Juhf ٜ Ӵ`Xq]k't Ʉt5?vKިw}Gr9$Ik b:dL Ikw08G}?_'/yWB3t#ʨw@cŠQ}k8fo}'OJ8PNdhֱiY9- T$qed@>bAD`!L"N#Hp3L zغ[aӎs}r A5$tSjz ۋ[a>l=2tCjaQ/b$ӝS$ $ S[b^zk,XŹMCF>|qvqsI,J{Ĵ#'0.t]/D}eR> GxwBhx|1|b@|OW\D4R)!&Eo>7kRk]A4zr՛ޮ,z XΉ5I @eE IDbw#PNxs I`tYbPPg0}}X^*k @[B NJSE PW^]iÜe Zl9g$̢{P,K-&|`( I0 ,97WAI}|p kIEq5XY4#t]G:A)5L9A_^wxݽ9tdf.,\z3HjtݹKY)iQd S1 ta b/o-IBuص5y!P=cNxs=UCf%W ēkkӸrhiqPL 29#Ͼծܼ \#$$RIͣ!U~W{Lj„8%\޵@ x$ p)юcðp)OsU[j[е@jZŴM&N=?kxuH&`gpr u*G Lәr\ D#6躎*iw]ز?BޅxLra >7ɥa}eeayP]Q,x\w^`+պc9OӀ*O㱮 ;Md*$*dBK:C ͽŕ܆K-J0WL;Ӛ!!)i/݊:jEc/.2<;h,^7[X`s .f.ș~v:iQhķ(aB~tqM(ޮ U`Hu6,l$5f;\Gl(D6Va2}eAs\ }fUF/Y{[iO4BOU ![%lP2a!ӕ[;<#xgMUndʚٚ@Okg)Ae=V50nMdr8wQ̇2dBn6W>CHcEðs'jjiӅ1bڞG7Ì$4^]:@:x lȕSY aF(fuz2ޅޜ4]G_o-Ö=Ɨ?F\nja4,[n,Br4h]9T0Bl},sx׊ft /^/ΧiY8~z3( 662BK'aร7I]{4e}JiVZF \}QQڊ@g 2YD_WO: ԙغ CчAӐ.u{v[/@浗4}@(Ƚ"%7Uh+L B1%x БϘ6S4 5X,6(Pp쌑h /,ۀcjJ ;eaA<%`erB!Z9ԗ3=p,6F6gBg_]6wnu^~Dg᝙a- Y*T˃]Fڀ"`你0w e86VXjKa|6 IG4| Rr[-0xs-X"Q|vϔe2[N sK0)0?EM'X^ח[Q[kg'r^W IJKR LߺMӲM@_~&d# hE(I%t7b0-\yd9HQ4ڸ- Ĕiᤣޛ+7W. q̸D@_Φ YA1% jᎿ!o߅L)]^{Krs"QE)Ga|"֍:]/ vGum-"kյ<\+ 2L-p>@` C/ϣBh(!L;6w:ou@); SA2LC{X0)m Wntf~]}.A$%aiR1kPnX6'i6g=q81 _6!r_|l,v^ gaذCT'=:88c )GCX_P[!'0>s3 Eq?S+l0 U&I)I˔gaM|@\^ik{"{qkP_cWVb5}>pgFigWpTҌR ^VBLHrAyŎ%J)،88z0@P\.21.iBORR< *@ 7+ T8mMϭs/Cx"s g@@3(Μ>ƻ_ 8ތ B)[[ BAa !?4yec!5ы#(՛]0Bb Io6\rRs,Т <K{3B?be8pYyd0T(h?NFrv`̰Z景A\ʠk@YX۞*eK3NxLб a0&~ f[,X kT0;^ 00,"->, 3Ƌeㅭe@/]Dnu/w>WF%Z~6eZoc[C88b|0Xpֱ`YY1A*hcX@-;")OJs`޻ssDX |q Rf@q45YTuZp,@\按xsޜT+hr^Cģ ]*#2,L(ۗJg4hx}g*#כ3 @B#?AXK=أ7kRز;ķ`D!JJv38+=yBuM%(/ Nӌ^! 6 Al KO$)͚vAZU7_a JT P0)h@f,aP37gMiՕvR 8 k΂^/xn8»i\*"KeV^+HT颕[y+6"  N*[ !%IYH^{a(5'-kŠ<\A"k NJXi=?AZN#wA":oUւk6ڸ&"Qh4Up^ YAEUs>d#?#  3> sqQ-d(*+}W|ր\P$f"H;pB2&"gJpq1y`oU3nM#Xz}KCѲD($_^"lYˍ A0BEzP]}@ެ[+-+Lw lDQX^ߊÆxEc ywt!`&:u[i/՚[ L:َ$ܸ5 }xUA?^p3*&`4>Y "5j =[xq|!H8Rdz{l2lhT `x!* ?y[SIӕ-JqԄaPۚQL@rT*a}}9h?$BvpԒ7#hjMHp88R. ӔnDAsFxnMk ' Hpn8H1{i@m{J,Aز4V0 q PS~ lt :Q*<@ؿǠ\&*BlvI+xHb> AIs?Mϙ! ?c4b(}' iEoh9w/,9-$z fܷq+ڭ6oA i(H v`,ϓ/68/$Ukz$L=Up O{ Q1M~6e\@pDCQ]AOH Mfs&yy:)'`_3 Uxb?A97he{ES1¶4irs,AP5L&͟D7l;yl r3$ewLSXTXLj ^sBM@񮊲(En}_DfVp{Rb@"t %ql/Z .vLW sNi!UGasQ 5f~=oR{==x$uͧ 9̸<d1Q!:b,JC 0 *$|#L6E).9a}~7a0 #vިӁ<:ߎlՍ_o=^_q P DP>7@'>R#j* IBe ?.} b=0{+D, 6\\AӆcҘzPj2Yԏ +++ۄ)~ NdW7EdgD pqWqkOVR( *^ (\gdR~}݉VYfʨ[S 1ZJ RQ-v!khpa(`ؠWJ4aR;ݯߺ n 3K'ϲi,+YYxPUʅ(2N4( n8P[>y/u'x83ʺ/!Uk5^9'@~?*!LJrr7P믰cRm h1?@Y"L7ł쀟؟R mqvzKC(PjDChW@CB 1@O9drM,ΐH;iҠ^8 B̯+#b{t~A00*8KA/iiWQtӕmxzf{(ӷ.ӲLhI.םL?Dۿ2v*Oz_6SI @w2P7=-eHA"47oE @5lWKk px= kZƐA5TE`9lcJԅ>{yQJ'Eй4MW1qmw:.Nav^-ѵ˄wAIdin~6+;6\EAׅs#Ƶ(h~%i & šGT6Sht[|@:^qD{0S&L&@qLRș?[$.]}esM=u{ ',K{b3H_'Ę a%I)w$PB`D޸!zаj6 0Y( qLB h8phl q=\3_]G)ŎN9_Zkb'.yܦ=*Y4DIeTzq `owibq~1]55#bpڔ'`1 L,!c$_vi0; !5)/VSg27_:1i:u}upCe,T38#"/iHHX*€~*jrFeQ [h_&;Q At,w #BIظh + ^[tIc{LY]{t|T_:t:ۓs.vW6`\(} [icTVCʵ(E Ӌz,ÏZ$av4@ שmlV (;5PJՇ+ .K &GLv& +| >_ Jvà|9~Г5A`JoL Q*HB%13:'X".L*@ȖBq,& n[e|Hz'\˚I 2@f^~WIb1IV 2b/A BYDZuW")7gʳSfJ7aDAVX!~!Y,JqF\CYK+]Vn5L $j2 8.V6T+Y(tJېB}(n?LzܕDA }YHho=}OKǵ%bKu;m^W vub ol)mH%a(i3KAZ9ԹKB+5zPZC)JH ueYN;}=QWfdFW*:5lDA`k:ҩ+ u#}],mS5̔4 R ҃DP$n6 c2iEL`-1 07!ɁMI Q-Gu]4౗]%qѣ '-$Y8lxhf@o(Ν9 DNJ_[pS *_p[U$P3r"|Oc6H;eޫ(R MyzNj<}g'c__6i""]8KĶi` @)pcuԠHHJLbVI[*] 6B0Ëa^oK/=J.qP DAiVMQ9v҈5!`g(%/,1]lFutAdBĨ#J J(7P܁uo)g!x):Y![{$Xq+& Ksg !}VWwƦYVzu0uhoCHTu>"{0v40/bijd_+ \`pA*CFd-/UӷeӸ`Z(bb*$&<Hl<-gP,_4}|BA8TU"7?vFA`R# B2A!w=q9 N0>;c{ @`]D "T> m*#3 🥛4X_Ӧ▍iگaQNX|N9`ti1uXieUepfӦ'ȆJq—.EbN*|#4[c_3xTVaZ8FndT5W : >,yM-m}I*|!5)+;w߻CX]K4^ڏZjE)s߃QAޗɘԾ[u[ H`l"ЈXphb4,%"QLYMQnzBǟ^s⭿wh.*|k/Vv|@8wڈbU`j`a (lZve` 1Aa,8!"Duʤa׸ڰ 7 d+x6Z 37 q:dż; j+*O4MѯR8\a(DQYT P? D3-|x'gxiZRx#c!dhir{R'^Z{:Ӧbk@N< ?R q b~TYUhYطwww޼n^%pwBbh+B JG.W>!߄W-н_w+/peb_n&5kϛŲHrg4 F}>6\be,~ wV! $0˓%aOmDA);{MyXΛ` i1mT^ϴ,}$=Ԅ;W\ `BE&2a#vDVRLنiC v%qPɘ8}fs[])oEc!$`9o@4Ǿ)Q]L.D؁Q3Bxb]bN.~OւVO2/B)@Fc]MGNFo0%uńWD6/3L|ILǂ℀ F :Ȃ\v/ xpq `I#ak?'b1QwMm@(J\rt֥VmW{Y tJ(&Ԃ'{.6J);j<6w^ʇZSގrGiuK*/ӂ\ 'wKQU_pǻGPWzTq̻Ư-J&:ڿ2MzbilI|KKT`>T"_ qECMB>y)S!g |rX2|jrOaܢ`a (C/jߨ2K@״kO < م޽/F*@)]P`iO/mwFiQ\t$&T jS;RE-׫''QUKS39yat3 HϵCjk>:19}gY3[ u`N&?d,PRAL pcR_ӏQWƍl4v`L8# ")>qg|wYLw'^ pt!Pj.'4 gSuq{s~@ɜD F%kbu[cB,\Bq,_? yJ kFc |Og&DM_:UOR,t-XVA_2U9͆Eqe3bkabيThBAi-Y" 󪄁 n7+ i@0}7*3G'|M 'D'1?*); Z1>ՊWmx].$J)Yi(:N1}ۦX3Jɧ}Z*W`W@OӆW$p8PN+Oͮs E\楅B%V6/AA*1J-ؒ 7:;z$\ij r:P[fw)REA`6\8=XBei<+2l?ުPcţ?xR~w d̓.SS-]Go`Ճ[y(܃ϜÒy.]1HZ ߒw%D_y(X?]בH$H$禕/ Ûl`'Awiw,HeF9,X^폝JpƮ=]ǫ7<~ m5{ڗƏtPJq‘pTP2ņ#l7w&)O)߄IMٮ:uh]C)!>^:X]*v%,!/ AΝKt8_@-^_M8NU UՉ b@ Uoeᛟ<B |"F {y$BЋ mgցۜtGϹAgƳ"iH~d;LK8(}/ꙃW󫙃w˛ZںxjXf+gl|9>mE8;cގegny'|#^n? Կ:!uѷlQU,jn@)p ȷB7L/:u ~6v Wқi !obHbp`xy|ĵ OǤqxغג˺* 1}*?^vl@Xi4'~!j|?r9&:s-D!3>F BGFna;zZwyG{,DLɖeHK 8yx\n]pcÎ.]*=rQwўɫQiS7!0V |ܰj|s$!Jb\tQPl9b}x7uu5(􊄆c ziY6 0L K`ʈ;:)g Z'7r>p%:h%N=2y2N.Yӄp@_H3gckҘ{YEzr8ƿ)1 {c<xn 4BSNfg4p /Z!jr w2[p 'RdyH`'gV : sq.|! o\0jΧRNQ225Míq$p2 f Iڈ• .*LYhr|4^Shm{qGb/!ٺs=ȋ*K$ip? <=H5cpb訳 ,\F H䁮H^0t CL\J!ּ5e!mOQE턮 MřF0Pt%E€ {ibٺ ;? +Ʃ:i˜!srVl/$w_^!J8]#-U3t(.X {<<邵 xNKc L<*:€Aà*̘4O,i8|cD<# xwȸ0IAXG*WgU}1jk$G:I)Z?r &i(>hH+OuJ.,d@4JhxGQ;'x бy7J0 |ĵgtsma>4fF@2ErA~*>g|Wk0*y]Ʋ` 7TWꍻqbK:ΈҶdE /:TF:E(Mq/FeR0d"pe8> ļB{-ZPa PO6Ϥ e| |W$(hn41a2NݣzuPDT< Nt(kuǚ4G7 &zf|9)45Sd5[k&tse;_Eb>>r>3 X:l!F{?w?uz^ R b~hT?$ {V? |< [ ;K~+`Pm%;/.ۈ/*7`qr]eRL,.{.у؀'rJ eJ4@]u ԙ6:ڻCO|YVиj9) KXZ?aNm۾9i6E_TX-@SE~LdMWgʲE~ıjb^y `$xWD( }'n)<_9cY!ոSg2!4_袠/zkI*+1~~hW^߈qk1m#  Ac%*Gp=gn?8Lj#G/''_=]|G{{#Wx Ҷ p1=kX-xظb3~i>" xκP .e@ exP1C~FcSt9ǹNڵ)#ىo<^=&AT(ZC.(I0AJhS˂.oaSGW_>T `(GaQg7<qE>LOFWYK .\>`] ^wtߏcrFa< ?3&G[Lt\I*G8-hji `.EGzٜ؅λ` ޓ- (VG(Wj}5<>,@i 0?~P 9;+ `qmFpa!#\٘}ִ _國Wn7_ Hy~Dn)0"s!<+MB$p8UY[[p, ~|ӠJ+g) xU0G4P'"E'ODCu O.یzgP2/=BKWK @߬,`P>>h>1Xv?r\{ǃ ؜FA߻}XV~bu YR#*4 "/(hӀ+ΜͻqG"rOT{p)N17A# Q~RYgCưpL`|4!ޡg\|ts;{W?~.^H#x 8u3y= ]30fX ּ=;H  3`xCb wW3~P(~s 9߃XEue 5W=m[/ncV\ؕ V1Zhyʇc[M%z넮= R)4 VWyxN>J>@!yB$T>ϖ7 y?cz'J)aIB:ćϝc'BMe2b葂`|h[H$~"ۀR@SK\bWS¤#A"aE<uiy\l^7# ]t8$/d((L@GcqԄ0L&t]óys t^/ `x hni(]Y׼k&zyL?Ɯb]#Ț,\WoŒ=Hsɯʯ "2=@aXicqⴑ8sF#Vm$Ď^ƐAַ]6lm-iݣ)-'PtJar㰒@8u]aRr,B{FiA#A"c-oƿ^Y1yKǝM-m_M|; ~L38 !%1(n؁_?_Yq|2{~o(Ay@SK.˗+c6[gIPJd12BəXa>x#ڱ +2><:k(ByZSֽ`REILC2Qr@d e{p)3cZ{d~'ByE5^04J~BN8 mc*wr'mՅ4yi%{~Mtux'`{@zM{(e,LQ\z2>~ $tR^wBgi(RWz9o1tIjz~;: c0嶙#P\ZEDgOΞ]8)0o5 }9g9<OL)=[nK6.w94:4M'w()^v-kNnySgN0L+upu,6ڸ^\ϿX}x ,Ѐ[߱ ym47l29;sgN9s2?v"OLӊuΡءF5txcV,yC`&,ïu@x9|![U`Yz S'`11cׁZ c@Fuw7n߇7lƣ=}_io*VEG{OޖPM@5|}TCœ'㔣FcJPT*}Myꗲ}IDATw+:w7uҚx·-+8rymp$x,J3-lPc`WbcD ?meLX-مEt_B>/W+v-O G"}Ro=>;Enዀߺ\9j&bm˪el_ҦT*x)ΏueaX`mbhQEQEQEQEQEQEQEQEQRo5Ԣ8#gs{ЕnEW-4 'ۅeḐo5.@Sһx+ZA~/=OAxK.j#[A\-<5 d5ԆS*}O]t}2Y e~f>AMieY+sx@y9$A][0UtN?2}Il36=Fz{r?]=m9bWN!6 +b꾶4Xx#_$3LG˂Zῄb.oRRֲu?pZ_: ri5V_XK?ė2?Ev@ЃT_iayWMx"<YGksY=`p?qWQZUu?YŜN f#;wd%d1a}=7P<G4N0ȡ5 MOts6prv7I=О=CZE*UTϔ.%4'EN=uj{'kqjx0+ &̈́M$zKjNb5Վb{ye1#uޢ6ѝ;QH((((+CKҥ% _uP別%vGc\j ;t]Ƒŧ鶯4YϩV|1{&@Pe/M}_iWͺu{45~ %Gy캹-WNzץijUS+[q.pe!^d^9άcMhjN]CG&2"_C=+5^tS=߷Ꮹ8ĖbI''x61"DKɥ饽%lƹ߈^%gۣqN[d-8-uƅ8YV6OʇdvJd8Vw P0m8uVAăcuhI-6:+?$dD VԌ7]>a T4⾲6]mBFSi`I1|?'ǥj@`H`rk~"jQXoI~xٻ9ڹj` #H9] B+|[Iy=M8ӧZ4_3(HQzVsBs-46cQj|hiM*kAƸ}CLtDdxCN]t]) ?}~//|=|~>7G*9biOEhTU-n*t?ί>pp|:%%tQEHŠ((*[x$H"w8t >`څȌr; f_ԡҴTP2G$fI#ig*?+OxVš:\27'z^Xyzח-{><̒7ޕ֢Ǟ<<Gܥ}}OoN8BUdtJQ> ä4,y:'ս1^Iuusu%4?on H:TMY3-8-8-H `ZpZ-8- # K N@mmKm&ڟm&.ijrҴK[ 3t8#WG; P7Y:$Ƿѽq^NVVJ5£JCoc}A9DݙOqǟimEc{z-ysHR''ׇ)AC+/ʇ4&7=־m|WR( 68$?usY߹b5H:^./_:f=j=&eTt ݞ]mQ[QORG?jGπ^V _Mz=FOz3UBZA.n3J_)zokh֗jwcȯ<[M k}~lֹ+9|$q}'#= RFS,2?߅k [HXurҵx[m=я_qZ l&YEٕ ՂZJkӫ[2\Bv2~;}kJӭgC0da؏YզFӛUyŏ H,I\\~!_U_A]χu VaT8?؊tI#hPVƼNT~tF# ݠ'ױÃÞ$fAA6x?C+ɵCe{$<=~tbjٙPh:B)ȍ#"f8w4xj˵{e;WG¾MfxeTA"5Q͞ᇥxwtY. %"$r'n{u5]ZEo$?@w~ΔiKߨK^-^:la|ؓO?zuqz#̍1< f|3brK},;6-pY?=?^_99k|=gA"b@;8P ӳSG^zrieu9 &6a|O|[C%wJc;_pzsuu][Ko:T(z2?*Oz,z(̐N <t*O*E3ͨ:4nUk ۛV鎙T+w1\;CZЏ5H:l_Zg<^׎e8oGo~*zq_|nE?aPqrWFZ|YԱ}n$OUj+xo }!N̠'8+ w;~@zj-&4>8S=r蠟5ˆikk:'] <{t> n^LHZ Wh3j6ZQT*&eD˜W|.sH1[/^xºݛO Rp>{d-g^v%[{QVK\bt 91c@= -ecν$QS(T)"E1EL(ST) rHHU W46}FE=v.tD1ݘQ^iisR}OaV5M˟rj'4yy򓓻;RIY4JM#2ě6YV.9'ZsP: KFGǭmx_kk[f?aa^*{ush*&eBºL *eB¨Ev>"i9sA&B {j}\gHRO^; ؗ g-/7HWGJGS~>)O\t^)O\^/Mᠮ٫٨]oi|߇Sz,HWRFA|+$!ɊIQrɅv/VU?z4BCAVU^uPac EWZ/usε%QSZC%QS(TR*eE&1*ef1%Q3RƎZji#/$!5XM^-i3^T&EYX~h74o5% ,mBy<k5o၊'sIp-Tq{¹BKj6Q]B¬0WQ]B§aQ0]Bj鈁WIRd-SiQ,݄,2\Ƅ{J#|?՘D_Eֺ\_I?^d܇ דGZGS~~)O\t^)O\^/Mᠭ JVxv:'XUFA[݆m~.ZeUWGo#mT\{:,קׄ"g;0uծ.6û?YOݝp&;`5s^SMv/& _8Z.jiUɒZ*u *eVZ@N2+S-Hɖ[8)$#85Yje#\nf 3i1У״>2=?H58hǏ*QIr{Q-G֥S5<X_MVhl]H\qT`u,G(p\ Vc ll䀰mfvFV9e{@¡j$jb jfZD-[7^-;$!|?ZjiQeAr/Y֗-6iI^h 76bI%iE*`Pd Y@@Ч\xHު:qӥbn4 $%.;_W9){ZPִ 11+WU`pA ѕ4?pĘ%z'ҧ R 9]*uSwS-@2'SS-@SIXU5r[Ub5A is5I?I ͒OPf?;H3_?7v5c^>y5 {Y$LjX,iX.jDAf 54z&d#[5~ѿuw*B?V,Tׇwkm-(IGIwyI,(dOʿAre`i6.5) \z1Ktl{8~ʪJWߨsN#f9$4((}9b!N2^9K]C~m$\ymGz9||OpO?} 4J[3EdEt`e9z״xkHVa7?=GE6˛b?k+p)۱dFϗkshhC^ j[iXśzʃۻޣJ5RFH8;jMhAaML)ԌXoU5<IF 3jZhy?G\V~5 `}?X?y΄;;4x/ S?G`cu7Xƥ|o凉۰60S-]VL㓻lLiY&5dcQ11i ;kt/,Tw45~ lQ)AǭEZn]89Ce Tn=3EfcWXh&srϨ:Y۹)(Fğ~-#]19oڼQu8 kwķV 4;t^{/[-)dexQ\gHQETLќ:iMX$&1ORa{[)^QmK0mĞPk-3Pm>Iw+Ҽ-{QTӤY:ʝCLT?=hKɟQW?yMWK(w|=i}c&T$gFՇkWe*R:%'ϊje5(DZN 蒟Z[i^'d8dq+ҧV5:nQjU5YMJVAeZ U@ԆX O USR}Ի ԻB5!j0jM\$4¢^ŧ5U:G~EJ.ޅ?G1z3_AӹA  io&qcHݕGyҔc|]_ hw.׹|#O"hֵ%S<].Ǡ{ O|AMj2EDEיw]>az 3ZD7WS^ܽ#cI `CE7wvu (Š((VM>PK[׮=ǿ6M"e%fzdžMvܬCG}z)vP}gj#3"?ӥpi~#Z]t#ӯNH"+FVSG)tDe+< i1^ V*׽Vv隰?l9bhXuO O ]ÕO#9? ¹fj[d_Һ#ZfC585>M7PwMau,?`֊b6,nu@$#5r-7PwCcu",G(v[ԇ}4mx;\+A 7Jc:cFP'8?SJo$;Ix+Q t |轿~5KTG<9O5\7M_hҴ[.+BcFw`%ּſ4%롹<ğOӧ^!:SYJ0Zg|]Rͻ20!?{3|Rp "_@?5kRK4)EdKi?BQsNtɤ;,JXjAwlB0 n?8Jx.[Ÿcv_UJ9,sU)uBee7UDcz}R[ȥJ v˻c,rM6+#@(((((,%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:03 22:17:00 P tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/microphone.license000066400000000000000000000001371416353147400244150ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/microphone.png000066400000000000000000000446551416353147400235740ustar00rootroot00000000000000PNG  IHDR{`bKGD̿ pHYs B(xtIME zTXtRaw profile type icc8S[! 99R HXBݔ]6EZ5L  ڔӄil(ƈ ` /??4+cQ@'wf?]YHP3$o áAj#q,Q`K>9pG ~;nO&H~3A3 oΧAP{i;gX-87n5N7}}MEOܞG\|9 6ա4C2?̐J`0=aE(0{"ƃ $l(R"gAfhk̽&~y~DDY|bWtF |d\`t6ncB,6vo>]66G=yT@ Aۋh'J} yRWH|INw{o}$zb /F~IDATxyu̺nq AI%kd[!YΌ/\w,2)ٖHy<|ՌزekdKPo"% A@\QU]WfyUeU7/T5^;̊ŋ.uK]Rԥ.uK]Rԥ.uK]Rv&x+Na 5G Pe߱DĔ]^gS^F.%x~:j;vtt%k[Y5FQ[ axԞYosm;Ƈ1eu~SQxLΈ]VOq6!q!QF4o 8 bE~a">.N~ڗ Bz%K1XT)R"P fMqL<.O充ٴ[>f')b~H>ll,,VcY)Shq<(Y o k|jEqip: lb,`\ӁĦ jW w풿!~QmKLFI C [H,ll 9)RH /|J"'Ŵ=uGXySlfIj}9oQgj)0<)BZE_wajb|)eWe8',, ,E ("A""Oqsg>ku ;)I-\8 ;ݨX3JPiF  ,2Yq?Ҝ5yEȣcZ!>}ܬ?.ghP^uh ۥ ]`#g%ɳL 0pQϊ|f? H:>5l)$_¦0/O:G ĦJK,Q}a6|ۭ3%Ikp(1Z9m˖{Б*#898aCzu˳vxO r%þήiA!oxW+}a*e(%E^yj4 =pGxܝ?RQ.g'Q9-ju3rcsfn cx./t5*Tb률7-DH<+ݔ=pX n%> b/9Զb_5퉆5@(QJfEQzʒs6xm; nkf;T]\OШX Fq 磆Il'3ksoo=^,D&cr&)"W=*Q`)""/]ߎӺT}3Ӕo6vF2 s=dw _EkPZG{l![>kZ>k]l{]>ȭuP4yG_5vfm T] l߅}'ۨ_}J a~M@$lVZ X)c2%+۰);&Y}mׇ_v}(czM.yP6mZT f;$oZE,}4zo;"wqZ::,Ym`U* EekqAvc#1ڤxpcH <)& ?5[kwG(Q@ ɷ!é5_' gdAg|~js.z]J;Gl"ZPeK?܆m6]dV~ JFpP# #Qb\ԋB>~-(1Q^MLڿ,]bM8 Rz Q$YLld#[I'F}{qbU@5{L(6fe?i;;rq5Y*Pb1Qgla7r;H'F)-5_}PSNXQ\ooqS#`P~aF#Kʼķt]dGװ@VW! Vk?>wѳu4$$=`R`]oI$ۨR9fFnn&H^j'aWKΝ^P^@QXXPm$Q|p!J$~i.C5܅"ن`Gsq_4?LX/vljt>x&"y"$ \QO-ǜEA1Exbq෯dTm2\ anedcX~#\l=18rwIpc錼 h`16AP4/]>7 `PY~%M# b"'k Q1[N yH>Ig ثwq=?Ees87q)n`z}(eE&D6nQ'd/~;w,UK@Xܷ=,I yE ]_L Jv3F~62 Ds!H:V4=ujGjVVzN6G?@{V'"цxg|g}/>ձ=Du6&?7f*%^ .c3c6rӂ{oIq.\of@K[ѭUXZ|&d)` 0C1dP?H qQ' > LDV $}XL4H L"01Xbc$ɐ_'a@g#L Uó6Hq.ulj`b!A/ 2'VDiLr,;6x{9UfNem9<,sDI&Mlg$LRϋhH*\](J^$}6T54a6Mѥ^4yn⑀Ae7?1;P]49%>qۺ# ̓) JܫNw$-U7?N¥cbQOöS=槩q/Qn oJ0p04j, 縜D\6ǿf g.~Sw$ĵjf1F\9ԫT4WDHa-b}jF4_Ai)2 t$ekУt[ ;,.~[w aqZwbB 1~-pUnB9v#Tq"i@@}r21)bu$6D\X!nWxCUlŗE0,@1PG91>L <͵ "+  kl$vgZ7;=<~_]/lb8M ^"3m,Rs%}QRb*,bƮӂkx$P Ag^np'l&jLr & DeGVߧIJ} ӧO,py tN_+ 9ZyVq 7p%D}n4p6뱹 L S1P7|5;iqW6d|f`'m3ʜrYg+&zt{$?#O5n:c \½0#\ǫ<DzHr$p–@^cQ5D`3+40q ~ƽ]e\ͼ ĈaGux4?o#&䔛=f^Z|j]jK0sCغtͭeN2&n߁} 10>e'qbn8gx7:H$1ndT`ا )Qp[6U0{ !GqQJs.6PX%œCg_z\."cGpᙝ[I,+(#v;C (%0I_Ԋr{T jVYg4;vG- p;W q==4 \tZHN,`?PݎЈ0Yܓ5H.~x5 =s-{JqqfzE {y}²g8c?۠w]̥}Đ&ͻ:2ۤqnfUdŝ5I5]\.#Aq\AVWIk0^zP )TÖhAQ~e 郠JWEI1,KVr$vB $c*E{θ(lGA 3DqR$]Wʵ`ֳgIUyd/)~DA¢JO~8ӃAL}>p]*< qc}A]nPJ,1lkEI$QKf#la)z^<ۜ"K0M|g8wP_d\˿ hv4 y^(( A5}J`qm(A;,FHc06#)T(qG8dF?Izdֲy}1C ~&9!^FeI; `22F\t&OKgpeQ˔f R B'6v3Fcf6R#TA YZGy2H`?0$nPϫ)g/i  eGY8n _y1R9M>M 4 sdȕ)p$,IbuKXlDbb꧕Yqц`u v顇f(Qyx&ߠ NUwW _\SsEô&!8j/mD9&8y*Ĉ x99N-zp<3 lەbH)ySfL*Aǰz/28-WƔE$evBi.pjD}KG'xQ.ѥn> ~E;H9 ]^$YvP<'9΋98jDp 7Qȫ< @#s GeW<6^%d]usC+lb/L]@\ ~H-3|2g8͝";yZoN#Cd}No "DHC;9H'qQx+SE!l~?)S r>4>9vG30Neq.ePg۷wRrSZ5)zݪx t!kH^leKl25Trl23V6/x~x1b (]B/IZ){kRSGqJ+C gf0r:B4܈Sx$fu?*G8f~F66aW^^8q8YW&)[=&hP5.QWBe-pa abRSQ6qd *)P%M{8J>w Xpɻ۪P߸;1kڒUQeE`/\iS>|Ϸ|S/": 0i10FFzO6X(ǙZGs58qmFDyW0\6tX3z6<<r߮5*6%8F$Cld1H'G W2_r!7[F9.l Vx2UҌMl$H׸8 S׈>un|<3f^G D0BG;SC69'*=ǘa"tOSpgNlH!b/%S|2lvvoM` [6xC$OY+  v y}Z_(Q樄d:b$1zH,"\7Yw#{B;ޡ@dmZ=0cUs sW9i`M`31IBSߑTbgYzʿJ2QLjjPMUT,Xhg;)wHҺ -]"b#X,,q<..!btaG>l&I I]?]85x][D#ˬ4:iD6 v4r[C`1?2xQcݯ\?w I2.8k:2[Š Px)/22NGP`f>%ȐB"O_Ah1Y~2ٍqB;|\V V5[>) /\E?Y|@jB; P SWK9bwp$^ 6W6S;~=@`[ QDS>QH" }4mwQN0$H2"{š~Hwaì`t94X_ HRd b+° Y9)xt k ^PJ1*̑'}I8 %66Q633p/xT qYr0[_eaV{yP,efu,EdH՚e)x?>BZ=#kKm%dIB1 FRXa3c1D{M'_8`fl]X,s` F2U%Xc=?۞6Nz$I0X>gAUʜ4 fR-կ¼y)$#\"g8Hr '"Li}zx-}-ޜQ}) Rl$g)9|S8"NOgy.uS.u4$JH1^, L2Y?H"l%),n4t;ڻӎӇM,r8+ѽu}c F??1(_Q(04]o540 DYQQp`* 1ucFAaRU6Ü<d!բZEԹU۱)pLa;!ZbQO!ɱKKa'x?ᜍEE9WEe7 \B -%xe^#`P}tw&&G8?b;fzr%5*Ȯw4#Ʋ.DBw p2t> ǧUgP|.C{ZA 9zN016.a3)kg^ֆ4?g8/]PT͠W*ez>ɑ@I s)\0/}o v=lc;"'9 1Oq{Y[ DI%KC#};*3x- D9ywyG TlNv"(rIXb% z1xLefX C* OWSJf*OayGVbEYd69?y JLC1^]ЄbEg ZN׉ǂ!a^}gșL62A9Yb%:/X9PMO`5H]':g+oՄg9Ž7 ;A ɳB.xAkW~MrJdTkTufoZw<@`C5T% b7DuAiXךSsV4xRRY@V(S-A8+n =[ vPӼJ[V5n7~Ism%Zz+ T* TQ_TZ hvpgv(Qt @+[3 f"ZTj1Š^<Ip32NfS,-opֿ7`8B12@HIj7;.:tJ xnW?IZM&j@Ay2tXGkZU V)ec}$E@6t~7|o6ϯ~Օ8=$|Z5$u~&۝NҚa#9믿c=L7;--tq A n Air~tuH# B`+Z6$9msHJl |=<#'VZS%3A  ^xZ~+M]Q ~_c!-a'_'BJ{GZ[֢z}_[Cv9C9%sڍXudu-@XZnF!ߵyN|ٻi'Xrz-&󯕄Wke%p*5F~-j67g4wFN}Bʃ|y^eϽ+FOLtn}# .8+ Qr:GZXk醙w9@SN oG0t)ZiD?IjUІAV~~Cm $G9m諳IkaͺSXW]POw_#\y Ci=py_VFGֵ,.>)a-#b6^A% W:PB9 9fpMN,BDtz ^{Q## cP4Ͼd|3i^fWο~$6wߣ@Pbb@s|xWY+HG?YRĈ_eRWC,>H۹:hXfj_`R<QAqcTq$tO5\C`9 5.` ##O 009X@ G$FTqa 3%@pETe 8@N<6#7k,ay7cq9ό.SuycF@0nH^T۬hSLU}֯o7k=_1Ss YeDi@O|nI]!븜l N* ߓ$E)u[Ut=:! AqDi3?sQW0`=Wg6{UG&;#I T FBX@ tY:JaP:+D%J 58ͼ_اg7DZ1.^/}4yq%Mh v +$@5#DI`S @N`E(pZj@*A?f% NR$t\"RaA81z7CrtαYEA9.0T#r7B@ d%YU50Gq8T+1 -fre'ɛݭBeVX8TZ^ϵP%gtq"z= M_ݡF9Yfs䏶 KZ^jEV"Y"B&:[@%X@QqIc~UAcΆv O[*_xq?r>kMۊ:c#J11'A(QgV5:;PN壗7(t7KbdgKwgYoMKb f TTFB $(jp?)ϑMEr.xd vG6>/<&ڑ_:zy#j!Pz)q9I̓ٿYZw#Ǝ],cP` R.xgE԰ mxeY^>n<VM{+' *`Nn|cZxfG%أwk@(cQE0J,ĨLΣObS  ܂āAqqN&ar7BsgO{rQk+q2^lc:_bqVo:\ R$yWĐX h eZ@e}Ж]U%IBHXwe wMH ._i4{)0<d<Yrk(VAк2CFet]A:5>NF;4;FCvyLbPhQdEXe6X7B(pr*dA0Yf"UʔU F> 1AS ['I?1 E? ^#W|~{hKͅ{\tZW'_Ym+ SX@Z۬R;6 5h0u~s?.;mWo8|{OX#сZȳt #osږ%i@s}m_YYv62(0AλZ=znt7ȳߖucxcG˼毝-d#>^cpȄP¬^Xa,{[꾣Z3JM-i3Sn>7٥d?7:ޝ\U%CT+"yѥ =c"ԘLDe'B2e)ܑZ{v/p$F<Ǚc)Oa;/0J%abz{bŞ7&b+Z'=m|t$9zY[ڭ;|îjePC+ TXf3JWyI&6Vx~&6igrEˉ3OW|#y:kuOFIӜwǔhnchw$1 fPpDF.WPPf/KMn8=lcE&X@pT)3ylu$J/620 VWq`izpG!Ei696޵+T0N'ee*L/ک"^ؿ_|CflwA `iY`h0(@I pJ 2U-)! &8v1A,}D)Qc#>DZpϼCmKvSl=2k,B"y tj^)8 ĉH ((?e-:'K5lqޝFفC+cڠPz^o/}^u*%Y"UPme]1"O$b8FڍQTJ)&ݔ6bjkM1T9V;URU`ߍ^#:Rz--ҍN1WK EYbeD"ĈwscÅF@q)λwm33H y3umO w8 \AZ+{B6k CsU*XbiݝO)i )k ]/ Wn6s aڝc &AR"J\/?pm'dG*m\) 5wR`(ؔXAesa1+2 :* ǿEaT1XfKPcN;ZNnT+Z5 u=Hb0pyMyL"el " m Xa)f\ Xl`RF"ؠ'*X$A ^6t4&5mKv@l:Q3FY~ *T#DuZ=$6[D] Q/ZdM/O܎&`AnӖ)S_3LxLzt^#J4en#5zJ*yfi=FK-;$WpT0IJwK$Ǒa[XyCι RD+X,uoSc˵b%wi$FaMRa3X`>7;YO]#P_nG#w2P~O tr/77_|gdd]+#UI+>D۰`Py0Ȉ*ȸȠf۽,RQx@3i [D9?Ȇ-~}`Yh8+SbhkjLZuc֮a;/i}rܠ x 97tT|= d: ʢzɓ́V¤i3 e!:o6@7rCI0fɛh :|*OFwJbi 8F-\X]LC׃5,y{_=! V䇈` lr:AL-,L^'~$ # tDLzrĉpġS:r4 ,(/Zwv=Zs sG4'Bş?&l?(ı L2)bT5`ߚ0f5꧈fSA=%Si+?tڷp|r~51Hʕ\P^_uur \]$CN@F4%A>q``N|\ 9=Bh-"Z6h |}D5K揌`:l+T d|d^je;}D!E/ڛ>!n5?yr;v]DuC :EuHV X+XLxɐk3E5okmW.|O\Piyb$٦HA蘝?k0%/M:y^9' H3p8k = G*PisD$t'UpRIҫL:?i,K^K>v:X4^yfpT&^9ZXjxA3dF`?w.E.@_:wo%H^1WԚb1Bf #t)Nq?ɿ~tswkދ׀a62 daQrC2!aMpĭ;H+0y&~Wowzwl?/;Ra!zZ|ܚNi}N hGrL]Fq0$sai* ud#pq/ʯ<e}̿*vHMy/ 4PaHjeYJn0M)96:w+Xu5 V+WXfYlt4 .~pR~}|̗ e1!C,}$U^R *J,2uxC~M|8|k:g_-5U\Rf U (Ci2Du05@k$%9T)SdYW+6Ɇ,//q䁎}uM{qy9ԵF#IL@q:Z11TbbNW d o|N%ZͷmZw$!>Oe)Nzp:iTh/T✟-JWФ?ep_m:pa$WfՕ^֫%4__ωB4o,fP^Îb^Oέo[cX1Ju`i0e$]mzq #o#&y'y@2Xfdm i`w+.o^/gsي6!l$B˚*G !9@RFDAND8e bY{R*Nܿ@ $ۻԥ.uK]Rԥ.uK]Rԥ.uK],c^D%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/missing.license000066400000000000000000000001371416353147400237230ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/missing.png000066400000000000000000000535731416353147400231010ustar00rootroot00000000000000PNG  IHDR>a|iCCPicc(}=H@_[UZ ␡:YU(BP+`r4iHR\ׂUg]\AIEJ_Rhq?{ܽ*S͞ @,#J |E} L}N_.γ9"JdO eaolZ:}(+K 9A$~~5y(PbYPcQ?yZ= me4G" B:*BVOzH.\0r,ݚũI7)z_lcmv<WZ_kO-v lM.w']2$G }S8}U88JPwoiHrYZ cHRMz&u0`:pQ<bKGD pHYs.#.#x?vtIME 8$/=<zTXtRaw profile type icc8S[! 99N4R HXBݔ]6E]k5L  *i3 iPA)r"]WhSҬddY@+u: 4vgCK?<ߔU4 e\0C8f>!x9|5 9xz ߄o&bU<34j=m,\gmjﷴo%"]K$dhTĿP?4m83$!;w|0X0"E= |x<' 7Y*G#2V`3o[ՙ:O GgtHH#S҃Q?mܴDŽXl|44lmD{n3/C2)d^tF;fpkK)tvGW!? ,-OIDATxw|u3;IXTHQrXDJd˴$ڎeDZ8_⪼8~/~v8{V\dB9%QL %v 6 lr3;;vIg=s=\IIIIIII_H(zLf,'ݕ.Y$ IHBB#4M ;`-xp ך '+@b߬YwxV9<ӹr9nƦ-A W=˗(o7]kƳ@x pUWp{^V#A8]..l\.t]Qmh4J0 P-.{?ZX n>2oƌ:MNgATCgT).[XÝ,)JO( `P_>]tM#24Ԣ Qϝ{+/3AII!LJѬYVV[\d* Cw˗4((O&!z8pm=.xLv:oVUQ:o55rsS3 "BHi@H.˅"{p$*P @oK ]'Ojm&4?xr2]OX'Hrn7%Q1gy /Zw7zOw5"}Ǣ@..F.+QR\Z#?} `YzADsJ0}~N `?=7}E;rsX)gxQNVD8 %/lǣǃ J$Bt8`U״j(k [q@!ۿ|ҥ UuMcwRP\NQPϝC9qlk iTfFmJv-@\.\=岮 \صKMq]34=\Iۖ-$U79ڷuf#G4&F :cDnK9'!h?}֝;ql/xZ@xAgʸq: JJn" :q&}$ $A:M\\[qY q~6Cñ%Kv??og``:UO=kicc&!݇{nj5 " kL B0( F" ) AEWptrt␤a Rh9?U8NZcGYRx\$|{7 UH7sյs܉ ,|I$H!Z ( JhiA!DX,I#ٗ APDjnYʔ9Jt(gςg OEA%=w'p o}o\.fweuCgϚu6킏h] Z\r8z‮ojI5:ٽcG W_N̕+z$k$˵˵\hr=,MVBb, XC\s]pAv^z ^c 7|TU5Pj޽ EqK.7>%S_G$BhnXaLaM=/J9'M|Ιe_>hhhsǑ}oq>mpݑ֥7tR5\UEw"@g'glA7A33~?H`Bp_ҷ{vHN'3￟Ҫ*$D(D71c.ѨUi 1=k6A]l=if̈́#/64ԵoGMM]]5.^/(Q#n,&hի'!7A TdY˽.~3Q 0>8X$1濫ƨ/z5GQ= WmBtEF0hK" !@ |ps"{zV$ z?_}`=m2mrfSik[}_Lx5SVʚ5B=f^ôÍh.X*'1 AK7gJ V_p$IRK{o}kcoá`]a|K{Pϟ'x8 27u6<OhQ,[orwN5W Tݻol7k(UgT̘a:$kW"kA0`pQ 3$i5k~z𨳼"@Xi;Ձy,c-6P ssj zpz ]$Ixqm֗:p 06zC9@/:ua'?YKI/\e?G]UUgAk0h1L"&oe,_`lC(+ȝ?no@w5 \v)6-'žFC#vvUtt4qcQ6&IΘ{UUuBQKwy=Wl>=q H R4%ɓh ngf(+ES|ȲX#،֕Yp!B\۷b~1`3S^ $ t4@IEHIJ?߳gˆw{tM t4Hdi.-3钒1$I̸#̯<9s8 Nřc8--衐o,*׬)4fkGFQ7,+ҿ{wݠ h\>%K~ EcwHHͻ7Ы()@pP2_yG?Z?2 ܇$Ir7@QԿ?5?_ǩw޽sAW& 6.O;7wi p]y +N̟c0Ơ5fo x EEѭjWbXp(=Yosm(1M000zL5sLzexGHHDڵKz:P(_Q#mm27P4w֭1Vϑ_BskuЮ˗7h8M q[Xlժm#M0u+ʟ-L#ru(:&24T|'Ve e5B̓lRQ+*+{| pa ;#%%+W^7́$IxH?wP9wΚi\`v.e.s'i1Bԋ.CrM]w=^ ..V]D06䖕-)ge578K3S\l32@= t׺̒%y ڦgpLPSޓ'+ @8[% AWQ[5'p!"^ḛ1{A39"S-m#ĦBy&yŋ{N 4A2- Ƹ2A~ee]ׅ&<'P 1c1kza.’Lޙr**N 6Q&ECpH׮]c˻{[*èc붱9UUuK^sM>]Uw ēj9iᖖe3#8++ M|(CÚfvE?'mm{]$d5Bă@(˫k DDYu7B3 T zz$R+3@k6iP<R9Qt6]>ٹ A?][h*M%š܅ &Zã$>9 ֮]2Z;сQO]*W+We>ӳA?qi􉟐a7 $3|5ACokFbyJhM"Ni}{DFđBM+`Y˃;b~D !iC-߅l6$Yjk +t"M?$MJf+S cEmkCpo|-G:~pc#S=r"Whd=o>Į`R".0%g/Ν꼃MX3Sj$ULkeZ@C?ӭ&h="--wa&v׺lUm{zNs2Xq w Nc9L9 `:8hha&4AVoCB- c~I9@̻) 3g2J*z >{֪(mPb (]P&h2AA 'QB/E;ch@ ΟGS|uMcМ8 _6*5kp9n7;@M@{8̴͒ABFxP!(vc$N(3g%%ʐ$)55 55!6o_$gJggaYPim%LqBD::8o "2;Z~0'$Q7ɐ$ƉM}ci+CCN>I |^|9v G5wG?&>Յ҂fZ._FF: quv:CG0p=DrmBgJ*_3?ϊزK6@&;A[s K MKN|/$.s4)`1*s.Ts>w"INb]:aVdj mc]Rx /Z,ˉ $ a) \H&Bhm{y˔߱& F9/YX.- 1ߵU%y v{ ܲ%+WS0 ?EOV8)\Wq1AoGX^g>:^ 1sK/O9g_EN'91I2J% A0hhH9 ~.E+WRn0l);dcso9S[Sj,| `xs蠧la˄Yɸ4A{(Xfl΢^ 4*kvT^n%zTx2>-hD]VI*r(=p-}63=yhhΣ]x^ ``,v8ȉ0v- +MMd?~xvG.lۆ]찶6.R%!#]kC&X] K-dъvM LM۞%7o`5zԍc1lFӖsk2̴XSP b,`M50,dBOb-M EAn.ONϹ>c!hon&KMpLi\..%W^@HeeqJ-\+W0WlA J'HЂvȒĢ+|9%v?3 cai2pg<< :@).9c91͵>9xd5ad`QM`'seeîZPJS' Q6Ogp8l8+a69<ܸ_]Y(ӄ 9D Ձ$߿Ç m>שׂ#mUaNd9BWӸ_._A#d@e{D @<:JIR Io'?ĮK[NHf$ .^4@˯MOWTLqcZ_wFdA@X 0XL 3MI6nez_Y_bh.\sɒQAP1%%( .Eb(_w%vr f4ojgMgܸ)k]/a D| pE%Y{JJR  <uPȲՌ !3pPv3(Fo~OTKO +V,36kc|cpHۯx GW1Sb1_x[W}& ƄWOW][nxvqREȺadmF @b CU:Eҥ_102ź/n4j<%;~Ӂ4=T훲cNj]y3nǸTq:zXag$A=-PbE < <lf6%c$n  != E/9ɟ,zIkmBNi»Wpq9Gen4Q%_YIpL#Za"醀1¼%39z蝸X^YfEӉF҉( M#6yL.=ɟ4zIx&#J| s˖YB ]@~ K$]VƦW:" '0b1_0TnUaZ31|ߌFEe. OA}Z p4M|UKhB.+P4j\n7ÁejS D2!-`n?A|fY:A543WsU 'RO6q?{%sqGYs>n&dY tw3x m⺌IIFצ#xXt_q]K޲eɳ0z4Pcy"!'n>JOme]Pz]?ic).#˩]rʘN$}Ӧ3FTXwjrjkq%$mkTCoiݫ7PɄ>ұD`[p.P0zRl[t:f~;jni!t7ވ g:qFNW^ouu\twvrn~:^y~<<'𓃆b4!1 1$N&{p=yGe3/YBYUհ. io'|c/e6OD$jjp/Xgt<^0#lh7MGOuO`j{Q0>w h7\IՌxԚtupGrS =QWcUU8 qZAPB!ښg}0oI@1og 8ˈ K>+H`)߰Zʪ1JJ yuT՘WYt8n$4r } mN>;5#HS`mq Q+lC";⦛(7 DIouty4;w&?2{O ? /Ǣ#6 _5bn;s`—3>3fPPY7/_n.nӉ0=utEA4TUE  bfNӝ5ص;8_z& ;ƣ3F3"ai,t$ Țb4!^x18!cۣ#QoD§a |p EJFB+ahpy8dڍ埩8؁;U@cRc a*bB:d#@ҍ>yHC :^+'9=HLi71#SR6Y$ONT`(pDIe"t=&}b?GXj?YY-dMz2oTO #cB ZS*Af"LT~M@XLɞu*}#˗H4h'i&i&i&i&i&i&i&i9_;@_{$eXIfII*nt|(1 2,,GIMP 2.10.122020:08:09 15:56:36 p#JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((((4MGzNoyqoTݵKX8kcB ~x!xn>2hTs7@2ǠnGRɑ,ԚGlpqvN]n{+ewuϰAw|^{K#cQxMy1}1׸?JյmK=[yֱ>U#ڹ=4ܗ%h6.5kKHHK^䑿jwJKY9vSK)qHΨ2]wI[1EP:QAq~4鵞/8_tJ=K~9)'m]7O[vťyS ÒP=6jaϥQy?)}sӹ?Z{Pjd;s?Y <_zǽmZk֡N=+D:3q?vh*?8x3Yu|UY3ך|Cд/Pѓ֗$Kvq]4sh<\f~eQZxQEQEQEQEWYD|E?lO8r7Cn̕~Uosұݞ"ȑ.\U ϔzh>P7W=:Z2l9h?ibmzC[.Nt ivW;)2f=g\BqN|rW#WTho*멿sbi8lF㶳?o:?©WXBofzޣ3^3V?WUN7y{3*@r0H>z䨧xye"Ld>K+ `jm -sGd6~V;#jڴ4MoQ} \R R7W')(e$YTt?vz19sn:$T]^kH$oeFzg⹪Qq*FSn峔I`TISXjOI/#[]vɣ\9=+eƪB#;Smdeud[qR1eyi{,^ѴkCDo&P1XEXėIn\-}mam/[U|0|/#ڼk ^=ًۣ$ſr+}N1{W]9-w< f^%QZaEPEPEbկnN z&ʄxLo|ln{4հ73 H}H}%8~R./ԯ=8UPR d҈Sw~ՋmӊPȚUkNWԓL ={ ״7V%N?Z+wKb g#+J\<>hxlkAEƣǘ_TrH AיW~_\$ה?l-}fƹY@ kzu9}F/kG~QEt(QEQEWY?^SHVsYnT%vgNSSot|Eդ\n1vx&6ZzCl.1=ʞ~`9V+xZkK}sBE"]pnҹ+R{u7oLk =x8uB)<~ٞJqٝGt,#2'O|;j}g9t4v4HS_=_nCh?RkVmXB0 ֒ӨYg *̛"8zVNmQ>Ů3F?xs9N?QkF9'c벴xkkNJӶ/ V(]n 2䩣{v.gyֈcRM^A9{W%NrM@+sLgtmV!}+ΫYX mIHo;Z,8]>l2*uO``n|&oc#d.x .ᶧ5[ 7}6y(ʁ^+_Hhg)g+g(~}vQw=ζEVQEZ`[uܭ5'K?.V<9"$\\\#d>p{Uޥw{_M ɫ:f+ +Nӊ(޿0{ u+[fEz~t`Ec5чZ'E[vp+)2o u'8^ezƼ :=W%ZVl}_sjGt}?]j5ez1)&3S {  qnC˞䚇5j3{e}Z?LlnFssנ~Ҿ!kug=:5^&Dg=F~Ar{15Nߏ+B((&ng^N}߰1NpHQoUUɹb0NxϹˈZd&c`dž5jޗ'DFbV59"buEx @u[2y?H={"ݟmxw`MR;q6|F*Һ;M熌rTQEt(QE׶x q!Z{]ڸgf}^E_>[y:[i^ZSMp]YcZ.'Wܧo`1j+7sUa~|zʿ6QEt(QEc2-.G:=ҽ.2c=^]Nmrwz{ Jڭh:??^p#O.Wڧ?Jn$=[c顆rW:^A9aX(a's'91Of-n-I Og-|TyM-7s+~ޙtIיZo34#WEܞ<|/Ua׽w^QEv4QE~R β_guO_Ж#|Y\_8((UR~fہ׵@&f ҿ%{{,xю|⪭W|LL}J3*Uj,&zc+(W%fϮ.jq~H-nۻ635ot.}?qrJcv3pѣ㸆 7~(>l((u/b{u=S?yo麗1 ÌW#oz;WfMQwM&o?C֝p5c#%%tuzbԞxWlWzg9'Y& ^1kt?:'>'vG:o5-7s+^%ޙtIךjZo34#W]ܞ>0˕tuu]ןQ]}5],XҾuֵ4iaR2=+onM$?EV߻ciQϠKd.QG|*?7U{| %>nl[O Z/9mQFx>0h\<[(vtʮk = % Oi1h<(kYrݷ }%}3Bku7M cRx[Bwdy؜3/l<ׯr6fHwn۞qxˌ-sת&y|iQ&tm<WEAso&ݧ~sҼץ @F.wǯM&܍ tҲZ $]r{wM-[9T+.UͷnquZKy"~23nnLԣ 1~m~ ((+WDY#fþ6usYTx%F\t8EHs>^5{~[3sX7X1qcX ӎ*&Þ w@>} 'r ݱ=,K!zW(FQfyЬv:xPJ:v=ÙX{'5ҝqހ}k*;`3*ZolPw!>~5.W^Mւ^O+QExAEPEPEP}{{8tx u/b{u= Fv>(ܚY'SMQƮV>RWG]xŭ|ԞV דm #ae {J?4q6州*٩n%L*l.s*k&ByccWiԵDF\Ĺs8+ibg}>iɢiFYt'ּ_6;g{WDcugV]Ϳv'5GS]On9튆PGcONQEhrQ@Q@:5Gk<שx_Xl׊WMޙ d2}8\u?hkO7[?zȐ¿ou5f x-r<:: A>)!sۧ=Mqԇډ8,K] ,˵"0̹FힽViE";эD8KM>f~AͮkVMӗd`K%doΆ'~=r.ufI"ڃؤMiQE ( (vu«6͑JRQWfԫ.Zju/b{u={|ȵa*~8<-yUݏˣ$;/Hi 0:R=5xGDDe~^[}+.f-A=A mNjGķ[O&tqXuזk7]-Eh߭|7^\uЇ<ٮ)PZoW?QEv2QEQEQEx%F\t82'vhtUݼ10x\Aj`q?&O<9yWQ$mCOBvLF3+7Ml}N lU:Ͽ/B|1%F;ރ5x;[j'd!;c\Ҥ=S~j mc^zA{_ZTz~FsHGJtݷ8g[٤e U)*aaRV3 g5<z '?SL6qζXktL,Mhr?h4hc7k$} h~VC#\ oi o%6?ή%`zۻ=xXS\YvZly>)4T77uJY_dWB'-8;#V;{'>dQ}S#Ͷzy5i%.:U憽 oڈ!\) :瑤}q@8Aj~Q3LwM=+{sۜpR]^18Xz=,lk?֬z+'F,]5hΉu{SkY_tstVUسOe?:Ok?^t|+{fk`ZK\e_b`Thkdqu7ŘmVm(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEp5%tEXtdate:create2020-08-10T22:21:29+02:00ɳ%tEXtdate:modify2020-08-10T22:21:29+02:00!tEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2020:08:09 15:56:36JStEXtexif:ImageLength128AtõtEXtexif:ImageWidth1288tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/monitor-sidebar.png000066400000000000000000001140001416353147400245050ustar00rootroot00000000000000PNG  IHDR\rfgAMA a cHRMz&u0`:pQ<bKGD pHYs GtIME,tgvIDATxy-Y2s{K$6 I`h/1;&lbD@ ƖX, 2w9kU7dfUz{k:n:def/- mhCІ6 mhCІ6 mhCІ6 mhCІ6 mhCІ6 mhCІ6|": <~h0lApA#2""hxk^'] m m~G~dWYD*""/0$" olH8$Ccvט9MDc"3! a\paU_UPБ c _ |&mH 2{ c;w>D00Ł{Jz &_5_N7tg<Oe7W@yo-^mCS5qg%:9 8Ш</ Lh4~G|A7_01tIw =v;8)"!X&pn $S"Xef !k^ mBJ:d R xR@DК)YUk>՝:.Rյ6%ҊKx_lej&01#))3O?V,zxӛo545Ξw߅ /b4Ai:Ck T Z)$ZC*QHB$I@k\L <@xG$s4_`foJDs l-͘yf'}NJ9OK_c=#Dvqcww/z'{3 Fanp5Ru lk FJpqLP+% T I4b *>Pw,n,Mmw-h ,ܿ¹⟻'.XXИ[p`33k͉h|8N^Wc=&|&_'{yfF(\r ɟx;[ 3c.vcc<+9WcX\] 0|w)S0Q]ch(r(sS*PIHRVy@NZq(;[rn-Ox}5yx] NNyۉ3+c\r韆AAI?NgUZ˟LdU+@=ZkSJ۝1avU(edUR* 9u=X E`m/9oyGW-y{."םSJakk ċ_"aQ:3L^= mhW_fgRaze% .1Yd@k$1:*"[F;/{˞>/we~GyfN% E[}(GPݝ{m?}ᇟN@k(tgϞŕ+Wm٬A`VX,s(؏(,/șMu0D `ddHcDAls]`ARJZZ%R)ŗ$VB8I8F'Ʋ4J 8 [8PKFߓ-Q]f~??ĩ&!{`1z!9svO׮]0!pz{0 %0H@žH9!ޓ myi|`Nu`E?"J}89ׁ5(8m8qDHb{l-R{v|G>?}eXW_B`ggQd\Lg&xpMlm@DfsmX-κi`{hq) *vfuRK))U.qj&b))8PR"V$W^dz>}(eٯʯwiEf&pJiL&3zݭKE2kݛ9X倥*d6Fh|η`$Hإ A V:H%XҊ ȃL%#Fq2i 2P!.]|G?|K]{ZfF sJbhJ|xI-rTxgQY8fG7ރR5z䒞sA 9i`gg=?8sm=_ #fFtU怡K73b ]?8A!^Cd$.|kA)oC2]9m“ef }ի6WU, !`r3}4 d7dZJu;6ճ\qZy $CUu9d: xկs4D*maTrc )%1mA׼5Ot X2K̼XuCR M$ ck" DFP`+ "Wfnˀd$ᥖH}zMD7w6/+ذoP5s=[BZ] d ez23AT]d{t QMKHWowC[;"I!@(PI# RA  00TÀ1 a(1%P"Hbx燑 ?py5s\־| &mgpUeB$;$!#Qe9B7iG@nX$Z$}.{wTtmm Ph\3MP$ R !* H2Q2"B0c o2@ L w B0)J6dd:`aػW"zKw"X|!j p6NtQi\J6#kɇL `)BcbQC`SM1Ak , ;& βs:a!  O0JƮFL D `NgԐR# TH2SQ P-舜- *͕I <#?s .uSۜVҏhw!\E;q!#ZChls'L5ań Jb&,0!0 1K& (!Xdo  D6U*@d - $aÀ1@ P@J !a F(@ )iJ.aXP1#=N-r8:l/4ѩ:ʔEfABؖ gZ;=әf V /@X@1,0`v B0:% -*%>VTŗJ|IEBaB R` Ca 0,IFR`&@" )5H0H)#@ )D &_ HiF@  2?y6V; QN3SUΧHti-\С( Y^d@& #}!g`b $FdG s B-h"h>XఀqB -[+!>8S%]uwԀ@@Vp_q98;0 ( `"adQhH -HgEJ@0\B 2OYg('k{TS5(HQ ȼ*.kcvs3k;ekhl-!. ^#Ew@3 PJ#(6@!e+Ms  ("h2YiMDžcD`>{[(VG/Pv0]\ Hb@%Z`1"$BiUܽ@tL)ϼ6 |ۺZ(C.K{mrtiH2#E&Ӏ)']Ni(4sxLN?VĀg ( %@ĀT+v́DGAhb6Z]2?/0J3Xֻj!Iˍ_ѝc Li/yv(S:/Hm9-d@%CAX{ Z&]F P-DA oT@BC"a M2lS 3d~ Lr&Q΂@sy?p r>g`ipt=zjElRS!Œ},ܩ^8s*e8b9`g`2xa"C  X h87ܬ9rC"Y 1CYQX)ОQjYZ`1;6`PbC<Ha<&:uP&WN{OOXGXITeJ8{1FS4h9'T-(}[Է)PI6Y <;|[TOPqD  ؀"tx~$;N+$`HO^;BY2@A$ytH]>j_4Ref*ρq8ԥ bтe~}iU03Uz |14 BBDw@, yk@s3!_-9]K ˦ ̯{uj%h Qovw{ -_:6Sii59ݴջ 6)#[zzA]0R[h}kEʺǔ*^^f|ہ@ ח2H}FhQ t ;)56Uկ>v]hEK!|o%B'PG+n|;E96y7;6 ANo=6~Oͳl\{;ra-ΕPMYWtoѿT,m'`܎/Lөf| c*:p*ˁOƾDV46iȱvhjIK̙htkq$9%:2ww: *Ku1r&]h9- 43_ %+HY$WvG|VYD靜3dVI][A`"0BN(R৆adl(Ez"Wmɩy%P L 7"wS8Ŕ\j|g=|o7]n/{c#m>-GA}zYOPEY-{r_޲@ZZҚ5 Mns\i5Y{˅N.Tr%4&ٟr5i^٠Iw@Vѵ_ڍ|j>BՉ&z/眒ɂbo?z6spY2~K{)ȞB*nY"-CնWY$۬]Uˀ\*P\z|]P@_Dg|sgZC~JNYѩʴd=wS"ɘr(_uдĚ齔NnmLN*(.'Wov@ׁtF{(^;gYwԚm227U9vmyn@ki0{ Ւ]M-7)ut$f銽l/Ģ uhFCiv.\Qb*@Lo4,"R~fĦZZ,((О2iΓNh;*mdSq Aٺ4x|AZZ;do%K]$e3 j %Rʷ%nΪYz \,U\y]q9Ǡ:ω[Ҿ;NPL̿9_jƚ{ v) 8D]*lp>ߥDEmRi^nRF* Wu3Mrt$7jGVPcϊ>FR NԖ͂MVkEK@n)y+u"NBRPkPkS]7{P݂y_ v+I \$ rJ%@V(/ǧabmpMQ9̵Y!'1F &mf5jY}Sb$U;WSq'`m+aILXe˘:hWKŝYח{Z"@FKfn 85)C!;;1r=[y)PܬnJ0xf.:v)e`/JE˭1ѝ#1~oox3gw D4 pNg~?|o^Y4K8@[݁bbuUՈI w&)Iɇ&lú29@MGZvmf9GrJ}r#P.n+Q wַ?gƊ?Gk%R3, }>{cgt׎78V=^\ѥיW˒:Ub]@H@/uA4zp4_E?<+*5t":/~=z?AϽi0zLU~б/GϜ{#A G=!a%0|ٳ?ڔdCo+zزa6@yyP Wc>uBтFř?s^.c\p.]aRfF.hLg3L$IˆbGd~ïu Ww,q_"kq R=ǐ[:YMɹ{9ΚߜMaϖ6{u΢c//;nמ;w_f]wߍ+Wh2K1]'z pT:;|G-hP),i~C(D6Ҏ zS8nXA<ٹ6H2y׺˼ 9\=3^)8wHAb/e/{~f*J5 <x+^K.Hdy=+go|w^jSrFQ׿ш{X(`}yO Ey3.gQ!p-{._n׌]{i(9)|3N*P1^N1x*rH|b<_7ά!"ǽSTiw`,,a/͗j88+(L5[_K@uCE!UUZJHT WDG b+>)kˋ8ƃ>/" V:pb?V$Bw@vLR!)s1iБ{Vprw<Vi/+$I>hkRʕ+)֐RbwgΝh8+D`Vwu.DgIL+_W\k}@Jr>ˬǺ Yݙ,%,^/B$eelwN5DR/z{a{Aܿ -L6 qA~Z%n owA풪f+tK z0:Fj~hK~w|2I |J^' \|J!kDF᷽SikCD .ʕ+RRK?|䑿^H~+٥k}~fIȋ-005bR0QR.eфuxB\n-b-aC1i0(BDYz%cٱziB̙38s 04xfe.]p( xs“qFj Z6T_|}E YΩ30 0٭Z:M6R)\-񋉞SLz*o ysTVGko_b_!looKHTq7h _p8LC.kЬj%!:R3ޗ|ɗ0 ^L%l:~5|#(ZzLynꞥ߰i-k( 90M_d v;×{ |*ҔH00V ;wފuqIJ)loo+ I)/{ً?_`?p؃993%cO6) :*0t?1]0.^^ee,9v*,9LisВ'ukz FA) ƅnm̙3H!_`PEef(J:&bD^@R+[uo zQ_GG Vu݊^ 01`np19Ii>pu+>J^rEL> c15 Z+8[|?OD ]!ŋ1 R㸳BP)h00eE O~o&"8@XR(n3mZr50AiBa4eZda72-kU57JCWqZ򹳟I# 3aH(]vp *0 "V.]VH;z6tFoђ֥2:NW2zr)e^.h ^*2cʕj^](io@1FpK(A~k~w2|8\fLpX0! A" ZwbgΜh1,>ce/3mNgF\ጱ؟*,`j+/b\%Tkgv|h͘bTZ|' !8]"h4shqI_Ě(p9loo!P@]jku{P+i 1nKmUy5魖J>*ewلL,:Nr 4g;'% [֋0;}`4"IGDr 0oVc\4 ("w {o܀Y%53I XgF^NiC]^C`tUoO Zԗs% /'T7,0B4o22<_X'T ch/Rbgg7lm^OߛKb<;~@}df-fL!QAy {9'[w'Xz#EwX^uT"<@ev,`0ٳgs N$Pݿ=JTk$UC&a̭c|BͿs"wyy{փQaDty *,~ RmZ;ZzJi/s%$< Rص=B\p׹Iʿ::$IsE{8uY֖ܺh<H`3/-8vr>r;y" T jfHY-#2˺^/`Z FCkabk{s/]؈@973Ck ֎)j:cZilpEal$NZ>yU"/T97jYiƗb\#Q`L3kCHE,64';iў֖Jgj* @/n]mI` nG,n AAy00}٦Hr3S$`h/Wv7Gw7V֥!}]:1#i[tZY 璉VɕLjQ,T~֕wU`!ԯ) y@RjdC?<Ȭrծ3XyJgb I'zwJgp54J: q4NQ4Pu.:?o'o ?+F}MPM]l.YZuPo%7݇_F%# ={a[8S}B?u;Kv"'dOKnWPt I1+5/^ TW_Q+ƶ T cq9SZKl[{D:{!DjJ!Zyaܹ qd}JUha<ͥ˽[WV O3J`NH%2C6ϲW9TILO_qRoy=sU_W-dR1ىij֊lF[޾ނ e-o^mURPPV2 BwKP/!CA0J>=x84I('@G0Q}&SFAP/SعVC]D˗/a4/>!LF[MoYf4eNC^La/ \خ["/U^1/_e&?g4W:Aͺ%9xA@~'QSJ >~_wW6MgS\yϟǙ3ȕsur%5g&Zco`s H71Y)o;R~m<y5k?W!_8V++̨JY2!0N@'l˚q-|Ch8Zԑu ֵ\",ƭqR.ײ7[ЧA7DaVA[A`}eD`Dgβx+dd= "}0 gf<@z!n޼k׮fNu zju`Y6 ,L};y]mq6D`B#hp`(gIdDj5nE&<2bz;Co]kmma84my+5zNHw^h%I*Q[b/3xA8Oy^|np'`@|O._̃U?i n?F-I)ǵk_/Ξ=;rWW^'7' "ԫ ΂vvϭAu"Qd}>H#b؋U\st/?u4F{/\|8IGu/l[β~pʈ6G%kMz ʭl\BZ^H#b(0Sk]W.^c6Bhv4=(Vr&"`&BlE˅QW'1 *yNn,/W8T*) ;T\.ʶOJYJ:j&4Ѩ0dzF˿/|Vv $56;pUW2;0H%18kT<|uiz|W(|n@0=;22i {܄hr5+t~ 3nܼb۷om< 8RL_[Z*Zd[T ܜ$/T/mDC*r}m/gEhPUZO!@Zu^cuȀ3c)e*rQ:6龗//z$0T֑ G1#v{n/gUJ2#0f1`0P|>Cwf͋Ω-/)U `e& [AuPSq] X"2;GCKDKOqH凴^v׮3< plAkQV7L\F\ֶ(nZ-cnDb ;nt|JD6!AA-ۺ`ݕ4&TѬ|9҉~h1>< 8IZp {L|$PHc7mx:cȮ2e9)Z,ercFv_L)dn'՚K:҈R#1Z|TA'Õ\pg/|>^`2%V5ݭdrqԒIȧB׳f80:%^{@tuպ? >y)][~ҝQGԂgT^٘ȲM8㈄] 5)}v\ !^X+P{".3Hy MU=sTⶄeM}*v6[/gƦNF tLyTLÄR $Af**đ!p8g[|՘Z[Z ŌiKX vp9As[ sH_ 'W뽂Dffeٔ($I6 co&7^kS4 6>%SBD#V-J)MM̞^> 򛘘@bgs7Pw^٢'/?m Q$I.Xv8"qze?B;vT)\AޥV!I\g)k*GV^.jqtN"jIV3_P֎o\Db:,'I8^T#XiUPQ8T'XDz *zսSc`kMbĊKW^na_SO/RT/VJR%Nd_@j#aw$Ji,.RyލK]J^ʒsʲ76fRqfk4kOLj_Puw࡫Ƌ&VxGXFEǾ/+ hUR af$RZto9ҵ5:f|DH%Ѷjz~'ޑUn.[ 6UZ/LĞAw:  I9S dbVjxHzKrxwkݵꝽKיiҔ 7JwTmVei2%?1s^[i[J0X5jX y3RF&8VcVoxk<|<զ@ծ@ Kӏ)YoևB8߇]~? !nC+j͌A@ igpJmWY3Rt[ƯMo:nMFLB[)[:̇(;ZC+CkblZ,Hu2ЙN}ksd)AʖH ;[mn91ڍB[J9&?YKE=^r"@zigw}Zc6b:-y# 3KQѲؽ9HNW=׵M+N _Me0p?DZƭjvVj')` 7&=w[':v$~SB If3 ? {KSq!$ E];(*NJ֜Om) D<Ѹ5#` PW nMݲE)~I `>K$bd2:Ncfq~} @ $FeҾ훛}W|c~|c3%^'\r38ۋy"KzӅIR- x-fŬtǝhJ,Ozx)AA& Hۭ³qcoZ]5(;HFuu1TveZW"B7Y~\lSJküWt@@r'_Ū.Zc2[4Xю҇TD% X/D\ hd Ȏ{$ŵm7v0d\*#UJ{OXV1 s &"ֈJ23rߒ!+B8@:=`smY&m1V 9,]wŭLGnFM߂hReǞ'x O*mB yL *ZG)A`"$qxbQ, ݪq -V.[j-D ̮DRA$*A(TTr۠'ҊN~1TB+Rs Y?`94~(M6wQORuy)Mu}פrj:'i2>5ں! . g ف2ƭ[q !,]R`4fUoʖO[rs\͛7FJ#Ib,#~YʒSu*oš Ak;lDwݝ9E]VGg?{zL }rJJpkx1 JT/zl131;/D )$GP`l8mr K|=Sg@mY8ևV{#(513c6a4P81w\۷1LJfZ󁩎׉QsB=`T]q}asuDo^jr@ 8t.0<\]e{}\ p=aA@9X2گ0| z}g׬}i{ùiג%1?U8[{5Sg!mީRK@>=Q&[aX,?hϮ/p>(wf1/GZmE`oJt3²mySR@͍UEVӊKKu%~Y ``2Kd] ,ygǶStO}t1)VJa#N~7J)L'S#^\>y#,>׮]l62 1VJ=(*v}=E9 y}iyu2{4rbWpT4 `0sLg7ӛB s,¢CF7i,@o_PEDQC:q5 ,s6`|l VsZcׯ@Gj`DoJTUPpR^[fjSQ)7|hw1u IS (; _gWJwrJ@GbZy\Ò9 ͦ3P;[3fJ%ɇn]ZW* C`s-Z[j!a7$֢T /:Um/q 4}Rtu0 ??J_\1bZپov& 9P 2̸q&] *f>$oq2wb3M32' hd`Pкzs쫭O2NgT#Hu6~+ϴw%"ċ7nH5f\ԄwR {z9LӼ3'Ib;f| ǴV+LGӿ \J`L,Z A4fͩ`Lz^Rsa!=XͤKu? x=7L~Kk'uOpڵb "$Ja6a2`:o.6c<3q)ϮmTZ?;ߙ{ʑ׊idzg1T=MjzSS0K7f,RVZ>koWylul?1sDd=8NJCnRv'开B$N'L&gPZUM 1H}9G (ObC}v.q.0ow,*~ vNMs۝֭{p6u@),F^ 9 iKFA;*.MVr7=?uwK/>4nݼEWk]Z#Y' _] ͪJ޿?o~~-?{I 5|j{am̎xm<ր#*5I}o.g..==%gɿ],[!>ڵfć/?zIPFI|d:ep_~k ЅwItue,u%^VON}=,h翿 1 Zq@n˰5T7)wѿHfzExcO'x<|Ͻ-ə1LO=T$Jo$~{MVĊ*ɸ~}3.îfڙ0*U "(8%':s ܅Ql` q Pb*)coDEQn|I̦&8fx'?ܸq2ǿxg~M?W{X;j# ,S{}J*U .mҹ+b8ѹNŚN%Qo\&VJ ޖ~?W~P.\~5q簵]DQf6<OT8ֈ!o"$bL_sO_}h﮵&{ytZenK\Ytفb_ֺ~fV 233*R[HYw/^?BDUF֩샗5.NEfi_K6,Ylv-b+\'3&sL"Be_n3{gրndg΢TUfX#VD KT̃z$Ǐni_Zˤ9Mtu5E D\=wUn^]]̨aU۾i:#0m8J'r|kAU}L㓍i$[D,|JDv0;S0ژIj$zIN*ʏTwkVNGEz;.?װP3pt`."@-$ @Dy/'fՌ.-ϫ`o" \w6GR7׷Ioner"pXgE AuTxWc@I.šNǙtc6V؛*@fso~FV+R?|tfDZk;].αg ~#* I5nϴL㩍8fJ#NݎC[ (ppx>R7qf_?o69sjח 6cުա]ecbO%0. IҸ6gݭ>26JA[k(fhfO;4غ6k4$  & iqGf"BG;t'S޾(cW]uv͗AJEYky⁐;>ckd> @"C4aZp; XحJ0?:   I$LАHH "E bZTݾYr>/ENo[*5x kYZMﭱ, ݢ]sMd'.DKwvmioL;o 4K1f^@ b&w aĐ`Hy`Xy& A  VfJ޶hVө }~mڸx"0Y0467'rp~-2̢nlͲĂ$, `Zv^'q#1bl HCI$KO~x4@ôރ  D*Vp16wg7it_#]~vtJF3k7 ĚD af 9, L[5yη`2P8K `Hl a֐@   lV (0 0$aA(0 %FDxIT1I 4@%ۻۥf+nSI3acZ:hˤ5lk8c^snX,1%RmP.MiĈ4Ic@!0ǹR#DaA$؉b 4FV Q$1 $AG( 0 Á( YMүy5(}iEZ-u-RF<Ϋ}2J̢ MXh#, 3{},N"F B$9a<%Ii#%1 F& ;`Ha'؍H` 1H"A`+HL߾[p.U_^׊'f8Rc扝IY`3-0WkX05K,\ ̵gZ`̺xO&1H*l1v0A33vDh 1B"a`k J JRAJ6ۖ1dݷ]\ܣVW`=q,;"ܾzRs 1Htsl:ӻ✘ Gi݀u$4ĸ)\(\b\b4v#`+f= lE!-˸(7B~+;d;Wf^p*vs>XΥ @}2m =KB%ת2 P@ >1Ҹ;\0ƹHllG]ǚh`hSP`k` qϷ..иRnΫϥDf4Iׄ>$֌1&)Fvw!4&rCNd)p'P(+~  Xh$-" ĸFΝ; eIbO|x̙($ ߺgH)!a8881Ld271 q$I>*q@jkV f@ \ZlM۞*FyJ:vpoT<5=WXW]!\ݝw9!n\gx X,p 0K8{qg "å4+!Z뜦=DH>uz (6a`/'7A e)/ ՗!7|6ݩ,ro>y> Kc V|&YTa6Ds:|d̵0 xx13}PyJ*TQ!̟;vIP Z%_wwU8AU.m4fgOrsyaJ;!(d LK@" ClKֱ*$t@(1s眮@,hX^"Q5w X*.;WV[q> 8. !R@ RƘKuOgJ,aZ,7ɉ r)nKmr9ܑ_vޔ]iMXb\Ogkcata  = I &J`^ޙA mT-B wb?: w8$i &f= IRIik!AoQSo8nB`t $43HX pR7`ٽlo\S1 RF%  "'2I1a}CⒹt:t:C($yL*2QBu} b ,!7g"S0MQnoI_0] s"AdzdrgfDeWSh+7,Pa3O???œO>hT>8u`;.pDDNN'PZYx !5 `2Ȋug!nDM#chϘ@Ib#3ʒǩG}4 |㸽[lyk{ |>7^B@ a컙6Cg1ęX(i QUTeFKLZnYYVP7IU3aR%IĞ Ibxa7DzF#kZ@}u^> '^aN("78!c~ PZۙ6NFsB6}{~Zd֪tL+wF_ːc"J{s1Ԟ0儈=S"p8}ߘ( i}Wx/ Q[jQ!cX,ȘZy<# 3OLXa My,0󘈦B{V)5IdG*vG}r"_ Zi k"0wl]w_z-`sl&D4eJ{BDc;2DJ9v66PG}t|,h n67mu2;^YA=8DƘ C{,Ap}hYuC6PKox x% DCd˜y'0?mRj؏O66Ђ?Pk}Ak ` Ƥs\r%~_6 mhCІ6 mhCІ6 mhCІ6 mhCІ6 mhCІ6 mhCІ6zA eXIfII*nt|(1 2##GIMP 2.10.122021:06:19 08:23:44 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((м/xDm<8'@qf!YTRpPQ]E%QeZeh> ^?zw"8j+ uq4{$+3TQ]?+/&" ,D̥ 8JOFj_ G#Z5/ *[k9 %eB222=(((((((((Oh1X$<=䌎3׸_QUD#>^VSD/?il݋UK񨶸363Z72뼅S`I蒏hiqL,ր'i+zp3;]?M> odTVe\il; oSGKȏ t~|KQp9xO)z+ROʜ.߸Z.|/eH)ڢ˱?C>O֋ÝS^S~4W}wO֜.׺.74U/<؄Sh6ȡf|`㞝+>֞Gc=sQp<04룷? &:?1/^dnu~jUxVB) ry;8u??ͦmL:fmT\盽OW?Ѥ⻙y0zg8sWӇBҟ]S>ưXgX98R8 ƙ^oN6&X4DO ?(((Wſ^s^bgSV'Z?԰4EyG3Imb+y_?uqk/n2]Tqq}̳f~[Hi/"WXn]ޣG/KmbG ][Ĩr5QzT:Ϫ_r"$/QK&jA WQWXG/پym>x_nGiu"Ȅ3?w*t#?5:Aۜ ҹ?[7X"m?ʕ/?})RQ S֤e_u/uE-3_u_YKLpFW q]W8Of?E;f'uu my]djQEu> Ѣ/e:HQz$+׭"\ux?Oe9^Z[460c^3V%Ѣu܄`޵Xע}g@p:Ι+\eI=+𶒺>ϔɀq1Iƒתkk\#XrT>'A_?/)ޫN_ !^[{ר{GKp?91{GԬzS Hj3[Fii:6ձYA'j&а)˜)±fp h PJ):ԍ zb)VE i~ւ '֔?TEKѝЍix@ȧ#Z^+8G3J3:ON5 _[fc 'j |Yzgq5|>8?塁gxz'~ J|۲u^?aM 0֭b= gj@TzUz?L_?ա?BџBRE cUX1m*A0'߽y#sZ^ay\ֻp;?8{GԁR51ddDiO4ƪDa F13R50 Kݭ!X!ElL'7~VU#֜V)8V8Sx{V]_UF-S`/=O~ƚ|?ޭ)%/ֲǝէ7:kӅy#sZo?RL4L5Hj3Tj3Ra"3ҘjCQ Hi:l]m C`è9+5Uͩ=,N)˜)°6DY!CVw?_#2gCE7jmW/ xoNUuWgM/>? myz^aPXQEWw"Yj=9nܟQ@eM Jm  1M5%ʤ) ^oyhmITSn/.ʛ+ҰWZץt cH:=ӭ_{Q_=p:/v0ookӾ/tѿӯ1,(((+uR_=p:޾ǥի7WzgZL k5nyG./ha Fkc63M1LjcS1C Fi:3,_ΩBOdKVFG1ʮ:5˜eBx9*G_O:9+MRQ#QK݁X}JctBA }k&/iO#OK-^[.c8=_kP_A?T5_b__RW̄[?j~ZMJ龘RxC_!qH;BNIRA #O<>4Zt$z'֍47uG@29Y7 Khh2_az)@OVN@͍*Ui쌗c^ژqRovP lSG[ޜ mٰ8ZO2 E5#zh 6v8U5Z;)^i`d=Aij b@E^bjmW/֩x@?.::NҨ(((NMF2˽l<7d4]UmR;F(`чۼО{Tw~e .ͰnAhu->E)}U0xH fD-L ?bQѦodED4\7J: TSt2~"Y ":|,X /ko) F~!ޟa;qm!Epgڙ@D:[uy`=J,+50*6fъ,˓Sv,>#[q-q?Ƌb9e}&A]bjό4Hq2ۈ2'u{KD)m5>Ű?ƼR4xhԳl$houm}Q'[ÚZ 34hs$ q ]CED_|>\ljCkjVlW?Pi-;ɭLv:|v<ח0z g\j`RM&-=Mq$yyevy3bz{mQEQEQEQEji 4Vak"hRqD5pik;Wml6%b\tϽUrPR>6U Tlq"eA*({= MCqrIJ+@5E_+}4ۺo!Ƴ 'kkdV#cےj:(((((((ǚ%tEXtdate:create2021-06-21T00:40:56+02:00܈ %tEXtdate:modify2021-06-21T00:40:56+02:000tEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:19 08:23:44tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-IENDB`vokoscreenNG-3.1.0/src/pictures/screencast/monitor.license000066400000000000000000000001361416353147400237400ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/monitor.png000066400000000000000000001176651416353147400231220ustar00rootroot00000000000000PNG  IHDR\rf}iCCPicc(}=H@_jEZ:AD$Cu *U(BP+`rФ!Iqq\ ~,V\uup77'E)IExwqeY1@m3L܊|E7`YƬ$q|׻8|V|" 3Lxxj68GYIVωGM #8]xf̤爣b6f%S#$NBcg\e{i",BUl qZuR,i??%r)#<* ~?ݭUB q>.Ш94N3p:0IzŎ6pqҔ=r2dSv%?MPr@-лR7!0Ri3~r iy[ cHRMz&u0`:pQ<bKGD pHYs GtIME #Z֎zTXtRaw profile type icc8S[! 99N4R HXB2˦HkMaaxV%mF4!mz 1"!ENKW'JF?XQ@#lwf?MYHP3$o áAj#q,\|shwܞMe*f^>O8vZpv/8ovk&J%^"B;`=r2^m4Ci.4u1dl|ŝ! 3,Ql(쉴+?K1#!LKFqbchhvQf^<- eR N.v"8@:/RU!wna/DBLw goyIDATx{5Y{~{߹_HBbH(Ȍƻ!DEa)AY8ZfTkָXY &Ќ#AG@Q!DB.woUQ]U}{U<`6 l`6 l`6 l`6 l`6 l`6 O=cDtUk@^+03g:`})΢(˲= }~ÿ_  }M~էus}̻8WX?οnyf~mo{~'?ɿ/x>5Xauv]4R{d &Oe\>s/n~_fKݮ%ڸ~>ȨF[[[~oݺ[kGh_B `ָ~*&mDQ!2^6yݍߍX _y,E$_/Ɓ~ /Ukf3e f9ܹ_|ɤ.^z>wv}aSO=sgfq~>x;;;F Ѐ6 @nKjZ桢_]:t͇+m QZa6֭;'>|時;r !oo]2s*_ RJ<x+^1%@;WL2 //}\| yh]aߗe|iu"…}n!ә//a<kx^{8<u?4Cׯ_ &5r /p|9s >>O!IHfgO<<<ܫOJZCke^gvο}+f\<61tV¯qW,ǎ/ ʵ.=o&;m4*T|ۖ_,*\f)W\.,}hk*)rXP3.0iJ)x\gF[vha菆 k%i RUL#Si\H#گ?KmRBa&D~_6Gߥ5 ].=á=i23*Qw<V[B Sf(e>lˌ?usCG~vu!i-F;[ 8P=3/U딳g},.AYXvj}w-)k ZAbJR1O2H!f 9{G,{[)KWA|^&y9ry7F B/wysk"( )%8 e(]Z\XS HXo !DWHceߗH0D룰̄8ؒVoj$D1xNAdTIڐ jƕ-ɫ=.Y9ou!6#"::&ˁd}DQ&Za ,"s!Ocz01cڀK2}> 3XL _}0śIĆl<CQL;Nȯ!L@I b Ȏƀ!*im]n@~sz=c]ŽMaKnqgXE338 q\y>@C hDFq''0t-4 鈐(ӟ;5ǜzDn~'\zy ahTq,pS_؁Pr [*4pXQyDx(!d4yBS}eF yq1tϓXP|`L%`tiu$ $b'GsIe#l\CQR[pJJͨnc0y~qbN0qD%wDϧ@~˒u[;cbKNwO`k\c1r `I]ܝ#S$@4CZ+df]$AD&H8\5<ѹT줛N@@kFh ^ p6'M.Xd#UsZ <0VF~Ru16HIZkUBݧ{9:3ȟxK dnpV7wI"888@'sHEB1fX:]W:yUn ")EQlMF ;P3cR# SDWIQ"lj;s\Q^o*,סo[ܢoρFxE%27+,ZEcoˎxfIcjÖXIH!!1#!fS1fBsR wí[w& 8xxlq\ cBRP Gofzڮ8fS]YBt~4xyy\lيsBtԩsjzI6OĂ)pjKx ZӼ'EN~?*%lecy3cqM%r IŚoGU+ЀR ,<::st:$Ho e. sZ734ty"p0EHu2,S~\5*H䰨Dᓢ}rX뤔/.Di2jO6W Oin5M^XU g*<*?f LShTR$cz@!ua R YM \C׎ Ɵ^XZ0-zX~[n qɞ9# aZ'H޽cZ3@Аl8DSk4e{{mL3h)X[t_F]ru4\W*6P(pPof2zĈDQr0b!ᆵ \";ߏ=uWyEꊲfGa,2Sŀ]+@tIK{*fUEb^5+3W: A2cX$Yc7;p|25Ld\F P㒍|C8@~{(zJ@FDU28 5ԯ Mfr4ADof+:w+ma/R9ߵ6 >pQ!"BT3i5[µ1d,S(BK)* "s#!԰WbB4,S4ݻ +_a%FH͍iM=| AqW=͛E.P/Jɍ4lEh%,u1a Q.,4!՘ooo{t@T >;/7( r~9xS:DFmD˜AHӒ84oouDotJe`ʼxU>4j*aRR?j)PPSB~F (FцT1J!J:Q{ HTK\ϯU9Y#DKL!ysvnԖUa}OBվB2˶Xc<ԹFqFus`uu=;Pr}ALW6|11Y~K?q_OPXfV@Hg AS \eȇUmy~ylCek#;< DӬ, K<:dvZ9}# KO@Le!ѮO4QkݻgpKNXú_̝,t9Tm߾N})]b7Ơ0d0B?P =SˇJ&@ ˘0}.#wVŭ6{-.DN`]>ή{ { #z$^W8֗L)s7p2AqiJD r":.Գ#f^[V 0vO0 idUnR^ mPD:[飍m%\(]}.CV_棣{63s!ø8~-f57H^x&;3ckk W ۸K·Qם<ʣk#9U$%2>ؗ'iFD RP7 {#ʿcxz~xpPH&Ӯ5& w#Ɓ|o!3y<A*8^}iA)y4Kl5eτ>* @@H icaMĬTh2dv7t* ܇Ze$Bc]**]B`aXR?p׌'w۱32pEE 2%i7O#3qpp$Io6|  Q!1n@HMa:B9}'Ҧy-=,TMffU>g :CyJ|#irWiٗ%k48J/]A`{{dBH#񉑂 %߁PR(`OY02 dZb eB'a6w-;W|ۆ@06߸ -誏9i&֠vzJZNE>?t>G"JGRId*/!{$s @L3 :N!.]RR8dg@ЍKhCJ*fIAN PV43"DEj%j!ڕv ]Ӌ0>?#א}_X9ϩFlʯߢRɿ3ڟ(oGuQN3X]f6'HTvAm&j>s@ \% `Q  S1OKm$ )q*W:g}+H9Z^+G\յS.CW>c o}_'`ՕwGR%!-}Qe蛭2wslUaFdbd)$PIMmv]#]|0T[0оUN3Y*[+!jl`vD'wWI7^ Ú eO֭9^ybLWpw.7 QbY m~ٞ#AN=rXٴ`dnkwfpl@seyBP I8G?e+tG[2ϴ "}p_onj{Œzln=Uy 5X)],hr#soH 6@~((,fkC&`4|~411PEo"lhLPAFmcKo긧RUGWq %bƈRqGs&OK_VV┧7hWscfiDYRI[?I-[JW_&DY0jp>9"0s0%* Sp 0>mP6FqYTnVBYޜ>zרϺ~?[ (;Oa(JUTAGXOᎥ:/aD! $deʻZkf f ,S}Y (1ňbi҆5;rZaPHꅐeT̐dJ^G>W_P5pO7!i DD(6t_m>&5oGuڢsY}{Cc."( G L<<<91vv&?HBHC0@RauKd6ـ (굫SU8ag.D"y=wgܯ2܊nېpڣfGDpt#$g Ey(#+P YZyTSC /oAxGwbH qc]*isbO \xR- $ތ>jrE-ʋhmJ:_^яpmsil@@Y5.\tKV58Kb7q:k{jT*o;n c5)=DȈZk$ ӅOuv8U`g-Rdp3y ('n/]wbT_r}uCvz'wV=(r}N?Xg%nN%+X:M!w9>FU/7գİiq87l4QȔC 7[Tt2[5!q՗]TŚT!Z{Fk~ P,dZ$A0Ba\rם# uSv,]Ͷ!iWMBl9-*xyN$Qا{(0H,Fpp40Ok DAh:Z]rQһoM[ʕ#(Ҩڱ;>lZf@5OBT*V2X2%1MnmSםTn 'WgB%{ )8 PJlmJC'zY͛%גWEBmGkL c3ᶇsyYbJi(@e4azXqԹ;X;VS*er^.'ySL,kb]Ȱ5yP<ޢ5pИ.R ljB!y.z Pۻ+7B)p)ɭfMHb"Zoa:a<燡[8p 8&`?#?E' r|RPB$t.wV =1CFӚzᚆӴ.U[GP lI[S?~%R [ F{0JyEf%@HΖ݊j)j+js( 0%ӛ0͐e!6UX[_REUJރ`ҁ%)S wճaV5"xNjj`/۞Qg@V+s6pBh8x_ #\r"ј%fiY0 0>];1Ampg7TfR/-8::1E8$$/f iaps?+EE5NZU>k_ؕZbYi6^߾ނΩ!3OL;')S$!kZX pNpm̸paJeb,c&GUh#R6o3 s| $†&i8vN9Mb R) ck\j>CqvQEPV_t_xNu= 6@\wcqgO%Ѵ>/RY[ /4SQg'.QseSVy媠:8VoF=RI_p `gũI R 2n"?`IfE`SDHQyŞaU>҇I}=l]x}J\@n"<:g2qs61-,>Lz:EȫY.,\P+x/v Thӿ|Vz2jъmm'HX/J.nZtȔݩݓEg-&ۋ~3#*v8oc(P'4J@p89B\N8S<|SpDe>aMqO\}sUd@3sYaQ'qHAQiTcb̫"8_"T/rqLTEFӯ<nVg$9Jm>PBPTˌmZG=Oٻlm,l9 GԽʢ"BE!\.-`N$EiƝY_zizHco`(UC4N8J B `dS@FK!\L4OZ OQĠf @@S3o'0)uLCc[_j&,225]^Aj @+@]NFv| 38ZCD8:>[wqxt @`kkx8&uD}6Rʆ@0sC!àm",E]@ìD,EΪ>[mmi#oRM@OWhk~ ~).242rg% FFSZ3qoqoZܪޱ >m}40gB&AIkW!ĝ;eƧՒ}AHj (-91k 4A>Ȍ4DjT;d JdR μJu1\!/dwף:ޤMX,4QM6@^KS~f~C.F"Ƙ1aPK4`f\], T@nLJ8r;bmAI)q NZ,|bD*L$q&bq?Xk}OC_:-\UK|ܩ) [`F2!E8Yh8^(Ӝ>JQ.B'k~ V @ #UϾ(v0+frGmqBl4UшD *s^N(#ZӁ@\pЗ{ut#hR˱ j`zo*(иhCQu֮;cbqX" 3ib HRwYp.._ܮ[׿:6+dsh'"0R*ϐ%*otKY ` ,RTj.sh%E@l܀PrNC9A˓%T埣tiц)խa &S8I2-Q0 ~vv:Isw`"(6A[`w%cwoROH "gOQd'h--0r7`+x~#F&`&eMcw50"8YhܙflrMv'=}I޴É}~&@+~Ȝ yD 38L{{BVB58접 HB4vˆM'PA>-1.zA7HSX2Jn!pyYfUH0On(,LH;V!'zT Y;C%Q Ė00KpTSɕ=Z+FDrHZEJ)ES*C$HR[K^t g {?Q9{Rl0.C_s4p; NR0D}(ZxRB`m֒>c b|t(`Hb>OC1P ZtZf%Ja !zzz5M.[~Fe(9K*N~.*2ŬL Jk5ndH3 &Q;Tq?I컯ufkjdRNsU4:3P_dc%X6@$].hi$H Pz(TYxs"V~Of6芳/fxi7bΫyʸ{hAt}3pߓ~k6EPMf}&VXkͻ ,wTឧ&'0eQM r.D8&њ oȦ0Ktw8ѹy"wpd v*\Nc[;$kٕk:AEcO=sBgAn}noJQS${=T9<BDĠFPVfbd l\s Se=-aI9]ϱ~R Lu #qA#Fi8L E3U2EzkH @J7$S @ʸ\ Ymyԃjj 7,m㣐3'sc?U6:kO=jǷ@m?VP8|"1= @'Z<ًpY+@kMm83IډYr^;`xnw;r0Eݾ4>,2S`!^.;=ތw.BBx0Ë|vByE=ɻwqg#2{GK..X@mf<@&BEZWb]7m.X^ tˁ_ Q+m&'_jܛ*:/0u^v[R|*\@!C4F~58P tW' @j^UZ流/>$g׸>,`t\D3f3"*Ne_}NiW{=y5Qu fAJZ1"^ Es>@Hc̢ WM<*w{+:V%gZ{sB@Dx ="T_V?,]Bmp'UzuΌ )q5h9C(HB=e'5@wp#SE:-Rcן& 5Ў&eA"6Q?.aP=Zs'q %e țj6DMW`` TRQЁD(!Kpva <{sLpjm:J&h`c٬R7R R3:ؔJ|RCR`̮}l=zLѶT(GQR.v b2ᚁYa<}2]W;3+}1j,r'ħ2lK O5Uʹg;ծ99xvMqW8P-w^Z f`pwflzC07럊:ǒw?ΛԈ@IS| $DQ4qEp0M!7P5S;;W"+3Ѥ a1(N?i( ^2RtaNLh1KtՆE d8y\;tY-j19sg0Vׯ}0ހˬ5"B%׊ pڝILIUQʙ|ٌ8 |0{ P2hs۱,c6i}1rw̨9 /momrY79gZbQK^ R ,^#φةX 4&*%LTňAд+/uAnv>BDbWr9DW WJekfJ$\!QgYA :)?/Uu]Pr9w%#{eM=jCՔh$ R+Dr;d,uPڞM]:+a0~L;w #zN6z֭VF!P "QмUòS,b_O#"V`s0YTb_Z`Uؖ *o P(+,]^vzNm1:-U&֏i&2,Cyȿn+Nc=Lh]>;M:1vt$E_KB 9('2)7"jـBL-REj.#yz[(YtV)«joHW>K_JSC G Q /IWVee S[Dwg/-> }{m`` Eq`^qhAGQ$E֕X1$xRdATGEdW(3wbϗFƠū dM"07uWWg~wUӦk4:GTNա2IV61&(B$eKfjZn:P6+&L#U @lʂ @wCZ1†LUe7Kuېjέ]jb{JG("t}}R>F;?;m PsLŢh{g'5*}( Zi*"hDB4b^Q [oq2מVhq[Sb;{["~gEf pϫwr6ŘGx{2o/>Ke)qw~ͷ Yg+Q'Xj2a@-0 ;)JDĹ`S[:.UlW%$ ~X4Tc5ct26*RB.B2dUΞ[ڸ#Ԯ`1/_Ag}G)8W%rqwģܽ>j9[t:g{}NJOZVa#x[Eo}b,R}t`4}O=)bmU7d$KF8MZOyدtn0`+ـBmeNؘk8v|ꢹաI<@fȘ1MyK>!DT* ׵gĝ$v8ƪ}@g@(eT Ȣ}ԕ2,h7DUwT 5T(3] Bvϳ/ bgju6#f%Xwy3Pn2d,q3'K#qKUcFPG9#ɽhdս\Gf To6yƘ@ LjL3!g u yR֊{"uHCpV'u9\,p1n,d]cل|Z\ \ĵIPl#v %B hw(ϖ S5^2d]g9?mq^I"2]""v" ooLDT8yϗ`]}U|kjB`U\Rfl7%l?e9mې`GM?QFgtT_sۦgdM?7 5؛3]5ʦ׳S1~wعgV85+PMSU8Yf Vv.Aٌ˘s!چs5kLun9אgþ E.} 瀲~0KtC=3=" $,&DTI 8T3I3yF`t`VVp_7y)f,2sgLК 垙g[Sc;H}2}fo=ZM<}*~ԟ+KTFpKKyZযcf7 h Q"t&SNJ+\shr^j֌L(.2=՗?}̍wzGuTޓ!:nIxq٫xs% u~cѥR+_ٯ ^()ÏXd IfNIQa9DSl\v5* D^X^vE-~2k{vݍ}$uY}RWLjU *BDgn~ׂAAѰLISdv՚4hG!ՀW)h )fy"޿bmirWat*uZ*#$ T|=kEßb``kـZ2z AiO9ǫ$,X%n63)A_kb]Lys nIbN&y>yIA +hg"ː4̩i* d4`7btGN %bebc{nyh}M_gk>D܌azKj(t{^8㚅"+Pq;[37#03BA `($J ȅ6[ʩEYHQ8^G=0s]'uUn-}'/-J^,8Qo&b§3Kq\)E34H6aQgɥJ!UfRH@qmPVS -qRo9UAMN}}=FG]WPDz.ʄQQ _)?w, (ZדA`j5]jM 涺8Fh,C0D>Uϳ>dO/[Q0dޚj9EPz{c$ji)953coR3S 沲>f"*Y~}}'If2B~bqo ϳfJˮFwۤ<4ߝs6 ߞj*P>-AEdXm&dCW,tgCuE(JSUKbbUܗЦ*a.ʑpKnOU8FU*vzg,%>ߤ:-."^_7NӗFu` +' ViA p0:uqJ8GGL ttY_=_}D(s;yQ觔mC:нFYhF r]3wH㘥4G9X3k K6gi=kffF&!2J@]3}RҮB$Zև]5cOrVCj3"NKӤTmNN>\d@-&a6WNe܂= uH c_j3 (%s-<'7+T4b=<φ g$ ֥I2'57"{@7T1J@C:gO{@aI X'Dtf@qҁռ4\ @ـ0xJKEI&<#҅CS_۠RM47D|s{bcVm~* e[}"6Capg^;QX:9沬R S!Dnḥ&zΝq^ ͔9Qn>l9Q*dy]¤C`9~G8H#5>ler v#DQ1=g Μ;%t$[n`e,%&moww܄84MeBPY|s,'Be芴lqmM!/I+Hz2>c_ GnӔVgW$oz0\јWt1uxbs"Y520 A" l>nmub}m?D.2=T(po??`2D<:qU.r\V ˵}amQL#U%n"8wWԔEi{}3?ݼ|Op"Wv/Z7Uwh}5ue鿱$ iIwÐz1K__u#X3ddE6< Q?_qbY['WO_@'pz)@sVΛև\H @HʃE;Bk3*E X)dNBME$ hwڏK4جc]9hEL_+nS %hV\皩$Jn@L@#<%5c /?*45cߐ@rڶvm?eJ4}65 -r^2+)ƖM_aX\/#l }W@%6ȈAZ1u݋15;^b,7 i0magV_"@dN *eE`@ /Ǹv1sڟ:@:WXObP!E"!_u~3/?)%rJ`y睖}=^_됍֪!o:}AQ549)㹆6^J 0lc5n޼x f 3 F1,r2㱟` CCAZ )Dz6>)MƔaL&_EǍO|}%._omN:L@~”R^y@Pa|//gp7"[=(1,f^ǓO>O~3p5|㿉x Y?; }, kA%|c]Lz)0k)mbDT2wP'Ti@з}H);_7 #< }xC }Z+lmZ㡇~ :6ΣumV`WE5:Zfm{g6XfzYp"*"O=UVoAVTX}<moBH|N3G;w WRF+Y>:*]okS91:'K޸q# `X,P"&S߆V]5𱺟Hkcq&T{ DR^݅}u_R`5 5ҥk׮ֳXa/`El|[ȏ?.o;::p{p_),X-WYJi3(ZJtxJsZY ¯FXچ'!~* ͞L9w-_8g[([Kvrh ]/x !.ym'=]eY1 M2 TξL>/[ |F9XKYrͿ79'YJcBJx*u] PR0kUZZϯ\~'}-)XsERuWCZ2:pP aNQAUԃr3ce~*ëS!Jkܾs//^#?ww23X6!F7nt:+ױh8 k:foQ>BF}|~<Gu2F?ʐlY`gԸ4PX7q4%XLPZa1>gя~ ɤ6+?ѵ!X 2;|%jDeH.\C=]lm@$AfSK><=r%V$ukfѧsbR]]νӳkbq7{7nGb֞ϲ>KEhCquJcދ̻s_3wc l 5t5f)޽<,4d(~3]zG$D=ym~/iB]qTm}-sO_emǭ/[m7tL}ww=\B \'|R i!Rf3H)sx;߹wAJ*/yͼ}1 v?|ws2ӂj2V| תfDtBX;»z BptKG=@zg}guW}Sн&8)(uſ7yh!x `6Dm2+ކ֧yRR޻۷@=@3#U_L/|h{ e*iss{}7=n901̜Q UJo*w9Jⶱ6l;ILI@DE==DT<5 __%y/њ_'].4?Ck\vvv SoLe}6nxQ; G$?4?_o~u}L܉{%m{=z|(|6׾Oӏm}7}/^rf2)cR0P'Tk\v/%E@ 3ՋJ;?g#?b357~ßC?/|?e_?G/Q $Zt J)(e._G~;;SQi/h4 v*~n,O?; 4Æ. Q#)$]b. gH ;;;6'ۈRrf3t: $Ab8˲O)?|? !_}۷d'>@}qGI?1lcggVGf+˔V">`0")5ق&bǘNNX,E;\Ne/?OXܧy†oq/](_NDQ-Ik L}_K&-*@Hp=L+8 0.^,R  fP*C$\?޿8888᥼d}dg@.Lqc<cgwW\իW0EFQF*1+X \>sMY!Iܽ{n9,ާ^(>6[,~`$ue$| ;WGQ•+Wpub4ckk\w 0X]ƀ{{۫=p ܺuԳ H`<c4l%"d2.vww0 b1/*|Bolm]~_ȯ  0Ͻ˗k2|/\G}O>8xch[]@DPZ#IRGHѨ-w HFȲ X#gh4_xOW\g_n!=oomMf2Α33r >?} />+iZH5>BF]W0cg{/^h)+5ʰ׼x䑇 @J)/m_ox`c K׿ioϹmq{ z0GdiV~kǴŕ#(F/rmRH\pJ)AV R'gŧyֆ h k7 ƵW<(vH }$J)Dē;qlx ȽGQJrTȢ2ZbH-$(25hWU8<<8E9\@4b/;l8گ#OQE}[[[ev!x*DD!.vRH䮩AWDd_zw 6@ \ @ՊCQ4µk*|$7 -r>`BPL:;%h]ZG]^xE1D@z+l@ LF)UIwqEDC sb?t B0f:mMF5;8TjP!'ݳy h)D]tYa2 Fg@,Ba= K@D#C)]: .}dz6 qIr4g/l@ p_2*N ݬVZM\JnErN)rJWe9TN), +3/4א$ƴkي)8dkU"@ pdq4Ifi%Kg1pXGHFBzUDpYl6Y$\0Ixj`XmZ`CZ 98Qdfy{fy'IYz?cģYI1^>Eƒ2y̸ptf6ICI^5ӳ+}fj4^N!-0wd44/p`:c5n,8N!red2AE&"D##$1?Z)NX#*2JG$(BňGJΖ)H sf33(Օ |613Yy hgXqxʲ 7n},pF&.8\ڂ2Y"w@ӌx8 '$18F c.P;'h&sLSfSs]LCƋ7n ˲3/={sa 7/?\D$t6D$Z qJa$ԜQ86)-w~d3І͎X2@` y"C2D,#cL&L&g82w@Yb6''9gM.u,_GMg`~$i7oO?H4;̏=u7fy †`~<t1hO`f\b|w+RcLOpm\r\d<,Y_#kYp Z<jj2%ϑ]bqA" =Qzi&%]fsLZ iwxlAnp=Ʒ? )ģ4C=kWė-j҇ lmm˸t .]daNOپC:kq*!N8;ƽqU DY#qp`>a>_xX&, n޸^xΛ_@)4}{o6J[{{;*8>>!&-FUA4Mqpxwn֭H h4B \PChj]p+~(lS)~tt۷og?۷oiI`tOS8ְ>Uk@:l61{899)4!)Dy&n޼7ywlʅ _7_+[(j@Wi!Pj֥4Qnm\/coo;;;`}r;`Y6w!3c>C`:=ln4udDR5훸}64 &He靛7d1}?wrp x;'/^R],y&׮""d733tN( GsqhmloOSJ|kk86>u /˲ib6d''X$ g‰)Mp#ϼe(Fexpr|b4Iy,s~|pwnp6K6\z~,_ƣ'qmģSD:n2BIFP_xrIakk :x139  !"H)rb`Lw2*KJs"R2e AZ9)󹅐 !Es?\ ?Hk†WIw~}qK%iloC  #h󮗟W Eޜ#6D5T8 r%;J̚1b>gy[;E|!k_e,Q4w !FuO 2,vvvG+G^=mKB=MSPp%'kdE.40=9yڅ w>t4~7765 W2}?4DxG%kHʯCq18*LHkנ4uw,0buc ib>7!&UIוɇQkY&$UK!~/~O'zӜ0P`T3iZ2㟟g9?^ TaC̛GۯZ  ڪW6Tk}oM@?-=|G /Mr+o7C~dk0CZG;h;FBqƽ8g989|G~? SWa6% ozH8F$..ɿMw)":Ô9&X )>ѬY=f}'Iӛҷ$==<~b}9$p&4.,Ru HbT~ƿȍ_½6 l`6 l`6 l`6 l`6 l`6 l` c1~K &eXIfII*nt|(1 2##GIMP 2.10.122021:06:13 06:35:28 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(ccs^gg Mq3mD^Aܓ|t,qT~aqQ^ g' g'^ g' g'^ g' g'^ g' g'^ g' g'^ k'›ItWœItœItWIt;y};?;y?;9y9'*?g@gEzg*?gI )Q^ VQaϔy{Cp9pw}䶗pS]ހ ((Ծe/Pȡ!B$9-@8L; {-òNW}Ⱦ??B4]+)z}?ӽfOsx)HRހV/'^PRz-"%RM#OM;o7k3Y? ?:s'eOM;o7k7Z?N|?Ah >[eKM;o7k7G|Q Ah& >[e_ifEtYYomM}^?4}fDYM G7Q Ah& ^·?4?}gDtYhgbG&ZcǿcW_?mO^GL?=gc/%'"—kO]CK!j%/""eS_?kECm i fAH3h4{*iOCto V*MN/Զ!nX #y\T1ɤjԓ+IfM᫾cxtyw(?J]+Ch$޽Ư73H4eOk 7~HFu}?R?GtOGtZ[7T{z?_qM}OGtѭ-ԛz}o#oo<5uޯ?=/_q<4=7inG+3)*G٤>ӿfRn}w#w4֎7Q/aKWf?qH|?IVw}o#d?Z[7So{*G !-ԙW3/5[K;Xy9xOIFYRn0RF)Y e}8Π}*ԑU2ƙE 㞙>9t?|<6ѷ~r?*-|$i\c;vc(Q@g:`5#t؇J?A^!gPF{mE<tGw¹=?Ӡ ~$> zT5Z|pWruOg4fóILRfLf4q٤74.;4fLӰf4q٤&i3@f40 KoBηK8::0`6u`l_qhn\ZHX[ML S-!הz&~:58f=< {/0u=?j@xQL(<ktHMHFIcϩbkخx ]@ZcL>m~8?lOo5Q][ O<_&i3M&k[&JJ\ѓIL+&i3L.;4q٤&La&iC;-֚bm"j9&H]zɛRLjs%j>nj˫DFϩU95+:\VD9#r}E("2}*mWMiR>¶{n}8 oA+( ?Qы?)P +׍QZmyZo+|YWɹV)\ .YO@5_yxf'&xQL(< ih9Rtq 5gQ\&7kv]Ek5\~Z: )մ*<ס%jדT~CILV&sFi4њ,h4wT] v C5p:9ax#rNOk}Sb{eS}LSF+Tɶ\SKb1O1?tCSb{UI5xz&VDsW`l"zCvR?Gka, Fs*զz4E#Zɳ׍x'dסݣUTdT^e°Wxm;yƲF4QE0 (Zegcyi!ߌgvo]ָ {#һJL-Kc?K5cƐGTuV*æVpC~4f65QILӰ;4&h\vi3Lg 2t͕Tr\X"|Y6\mlc1K~6QmbSKP6W F8wvVZkpOΟݺok j"~fބ= 6g+7n3pX=[/䎬2{S>oBxcZTt40_/k>0j_/j0 o ύM$|ʌx ¹_onϤk뤸\kJ좺 =1jfp&%=4_A^e^KGI_IMgUjM*#ɧmTf(?b3QqihOpm?bQbQ~)vp1OKXcT?k1uYϽ_>%?K>u9Ͻ_^%?K>1uv!AdTJK {\!Xm8FyGןG0fq?~%?K>1u~MPZ#>a_Ŀ^zL>c_/E}צތT_2/E}b|bsFhH?T_3/}_K?aEA֣=G!נEsׯ*6hƒi=~ݡݘ*X:\lIS(UКJ!2dَNs}qB Wg6ZcT0I* {3׌$'}Ni6׋;BOi:Ķ%ݔ$r(<zZc%Glr)4"xG{<[x=+cȽ'Ƚ-oN-sk<_&<ߝU}ސ}ޕ^&/~uO_zC_z,"xG{<[ϻO- MoΏ"y7T?<woz,"y7G{<Omm"y7G{`5|:O"yβ`ϫt}_lov.*IT|y:G$YWhT%dYe+5RvUI8X׿_iωhiB(2F +Q@s. n,q* nv`8r@$I]W,}u]y5~>O.NPiהQ@ 3Fk]!k?(Կei~J?O*xcj#|{6G'G G emi?9X`qʐz\Yf#jM{p}+l%o<ZC>ygPϷe<32+ZV V y 9(5ga Kqk7̒T`3`t'ʓ\cp8p_4^ Q KUK!1\=r}NF8Z. ?`i_{|/^qE0=#>Tҿ_*ފXW W7'h4ݫXi?VB#3SVM~@q4xJH )Hž 5>4E =Ԏz+mjG31ڵMq5`(^̷:rL&QL((((((('HeV< rOLs>mNGE7du9VS4%?<]z}+rSR*|cvb+ꤒ y\O5,K~TRmQsxP=x5t1椱Ey\:ȣd9I7N(Vu}Tm%Ol^N'/fk'EC6&{a }QdNO##7b=i&9$>n|Ks>V%X _Vc ?9j:^b ֤K1f=kS$^-C[s~I}vHϠ?Y񧘯 CDlrUqV/xī֖7uuOY&I噎I>TEPEPEPEPEPEPEPEPEPEPukIHd.)iseǽk[xSDKo,GԱZW3i/k:"{B?q4R|F ӣd'S3v:'!tEXtexif:DateTime2021:06:13 06:35:28|tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/preferences-system.license000066400000000000000000000001371416353147400260750ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/preferences-system.png000066400000000000000000001254741416353147400252530ustar00rootroot00000000000000PNG  IHDR\rf|iCCPicc(}=H@_S";uP,8jP! :\!4iHR\ׂUg]\AIEJ_Rhq?{ܽziV鶙N&lnE AD0,cVR_.γ9zռŀH< &^'ڴ VUsQ.Hu7E139XlcYԈ'cSXY+WYἾuCHb BA(FV iO\D.\`Gd ^R8t805>v |R?Iз \\4eOlʮ) }SzVޚ8}2U88F=4~r{"X cHRMz&u0`:pQ<bKGD pHYs B(xtIME:,zTXtRaw profile type icc8S[! 99N4R HXB.clw05L0 OЪ&M/cCA6F9ȉvpIgֽ`7۝-~SV1(q Cpr`<=| ?(&c8#'|r|$bLP̫xgiP5p 'oio%"'!ckQJs;/!c[W\ @;|> Abf"̞Hx~<ē Û]SJD, #RՇ2V`3o[ՙ:O GgtHH#S҃Q?6nZcB,6vo>]66G=yTO!H2Sn/ Nj3P8Ƶ΋sU]w~[;7ExU‹ $*IDATxw`y;Sn bɖeK,Y$@q/fw'8dK,'^[")ʖlm)/ɦ'.-*Y*+ަ3; AIxK3s=3sVX2e,cX2e,cX2e,cX2e,cX2e,cX2e,c&{?9U{m!W؈alE d)jHY,q) 1&GK/}sK} >u/ _.8_S~ځWxQJ]Ƚ#K=e`߃-u *OLsܷ_ ~ gY`xQ /%_X&0ϩ߽{V[kATpiĢ1.r6oJss]7,Ķm àR)S*(Er\,r !J3I|d=  iæ3G?˳K}:$Ċܮ~!nۃ-"s٥o`m$),< C)mlۦT*d0;;lfl6Cͨک{!eGY."#ɯ~c>-pχ{|uE:/ib bpU1TK^–-ۈbXֹkk~m˲ҦT*119(dj d?U wyEkY~=aÏ\ \p2> @`of)_]_/~RJ6ȕo|htQ?WWH$BSnZ[[Q۶j =<1R;nɥ+:rRq~)%:~/F׻_~O.x]~>ck.`!4!h6rJ#m{@ihF,V Ĩ0Msg⺁7}7||.pgOb^Ji~)%A,Zbv}܊d[~{cwy{olςh3arrv$`6j4, ۶=CF )DZH$B\Z.D+@܆PٿǗs .ޟjIFߚլYvyQ۳[3~[tAIuE.hGA\ )BXZZZij 7 ka`&aPըj)Ǟ (BsS3ݘA.[hiBܪ(|nrˏ}{Y86pcTMc-tinj"e*nee{K<'}PU9N"=TEA4l۞p}G =ND"0A0eC F 6)?1hK.QQUR$t3v|'EW֟k/HȫU}BLBz( 6wiin!Jf(ak+v?148d*=dT:ͥWD2JBb8,d`ց7[_nkuίJ)7X8QU?ds 4˲P%.TUEUU$MM y<URܿkdzÏ-{ ~C #nlF4=v'@Dhh'Q9\6+R{?󍃏c|~= >64߿[0\.ݍG"eY }m3" Ԉ$Ir,b1THJv|o豃W3ԮO{q=e:}WvzvFu5ֶv R)YQ5BvGP-)6r|AR. d2 ]Dy$x>~wIp:pÆ]p5 X,N*frjV ;%H2C}ՊO=]ijJ~{zuNsK3mS,ÞX}|~||eG;w"p}df)CU]uL<.aض}ZDSM@{^1}|2 ~0AJe[ttvn57$T U(K(w[e`𱃹' Dy$ dffrDSd2]۟) ڀm &y@4OhcxǫK={q߃eӳr%׮EU'Du$S8:\Y(?~KhtB048y;D*&p rI*2Dd2~-.)Kyl9ORrCCyvQǀZYo_kVnjBzFh}υ4M#HE0 Rv"տ2?/|;7D $rD"A2Z7 (J<`zzr$:G_嵈v[)۶bYMo_dtB_)%@,4 JŢS/YFк9t+tޞeX'Lքn3\éBTbK,j,i!C.x^xsζow^RIV]ê>h?O}a^{p4Xh,8.%>zPgI Ŗm[H55ͩ4.m EUhko0j !D?B>𳇆dz*_LgdžO Bl $RQLdrjrLw׊SjzSu?nLMӤP,P(d.ӆ=4w !)%H޾UlڲH$Y,[z!)m"RN!?O w祩 <ǃ K/oJ%<"U5#?LeQVC jFOJ:;f Y[ ;|@p" $HaF6lބjH\ p]^TE | H\ٞ{^!ܳa!Ar{ǎR*3Y>̈*hVZ[$!evk?>)%۶MsK3[/B^Ĝsϙض: bBAffl&Tvįkp%9Woy×lMQK"SSSZŌ m9c JE&''6M>"d?>gM~!$w05W=7W\ʕ=Ģ\(mIʹ. 1_E9Oяx.LjDBSp W I @Nhmm1JěNFצz?UNd_C^;S[k _~D"-`Y6yz@:H_ G}8 b\J\/ʘ,0>֤TM4B ]*=iD9X=$9w9BL>V @ZukiimT|ԅr$%Rw5s-8瞹}%A0cjbr-|YEY&E~/==n1P0dW -uJ,#nP!o0{:p@hh4ʪU=^9]li٘ _Ja<)y+si i 烿<cL Ah%Wè^'aZ'h4JSS\@D ô.d2A^z{{IskiY0kp>U6O#mgB!{tHAԝRΑB!J5,<>XcL?]N4d@.AHt*thׄ(FHJZXv5=VF-aH,˦f-<so|G~w"\w~ EP)`vv6LM!9 $\\&G'[ !0jF]WB8G,Z6gŪT`[gds-˦R3,;I'bnz27<Z95-b, )Qkc=ww `؇wuk0;MTȆᚧ\|5a~HD"ѐ޿k^*7nJ**e5K)1-J%Mލ ެ潻al8q)fY_$brbb/Rw>u!noD~ n/Dc̀j +J} O4dxʪBjQ5G8[Oڱ}(mI0Ԝz)ΰsq'si eA)_`jbB!47/͈Ѻ0k?S{\Ͽ`TSjN}UUED‹I埔v+;U|]K%AZÖ6p_^~{N-ۖcg{Fi0>6F& "߷tk#w p`'W zOb>pQ_43NxϕMHՂ.@xIRB5ۖs,ou2PKP3jqjnE8 F~$B(dZH~PhG-*n;BvKG:. %@3ϖC,XABØ5Npq>?n?G>;H23NP ɯKV;op^ݢ" Bhqw{ثz]*U ZslAlCPn^@!Si:p z_퐶7}ũ{_HTUa8Z`l|bHȧ@w:o{P >' ܮg>OV&]BP4aRJ[.Ee k5ʽ s37/oQ7> $ǖ6c'G)a=|ߟ]:/F9&eR¬ 1طL?bFu(p ~?#;@ϗs*R9/F-;/% ~` k33df3f-8(wi `߃C go@Td굼Mo&N' ?u߶ 5 S(E)lpm[Xu;;_8 p֛6Pۈ\J8+#9~$1MUP?8R$jͿs=|ykĢ;6!ŧph4T*qf-\ַ\KkkkX|DϩؿW_8W;j `epN/D[.8'1 3TBf N)F5>{F?{ -vseϳEkaҵI8)ᓓSGcC_Z4P1 U}r7rB^Z[شq3׼:::4)`ߍr@^)}!y{40vep`JaZXTͯ $3}( 45u@ coǻ.BBm]XAffٙB[.l7zq W7cڵ-׷U0MX,MocEwBw"}ylmSVА]pWmS.X۷!WppjoƮ=2uOkTDzϜCҶl S0AA*qc\ַ5tau]gӦ\kYW^vL ̽7JUZ@eR*ˆ% zDۗ O۲D=+@kNUT M=$㗟]Z8;σmlz)VBSKXmܸ Uɓ#uU@fZ_Ȟ߾hx+l)k)G"nƵ׾X,}oEHrO 2M\>7@,ahY]ez}oHe05 JDS{jLl6TjU)'->$hy^6n؈k|{cXcGlEŏutxxGʶ b"`m\w c?`&3b$,-1/H"o`j._W -,"Fum^,m晞4]&UO+KFȋ MbV .G\XŚ\{u[w@s]–?R#~ۅ?Ns ߄9xa*<C`RJj*| @ʧ%އI913K9=/˲^5Fϊml޴%4uJ'B_+:_JIKK+oy[y۵5/( ߽w6Qa`b3(TuQJ\h|_d>BH?ElKީy1m i:!Xl^3˲HRʫF|{My2L%H"s>|#7m B8)kl'xfW{z>pSoE"X@~5\uմz*~Q*T*޲ p_%?x;^sS$Zױ E}?a wKSkiooCUgd(*ض9EW{ ]mʹimNќJN&H&bc"]GTTEA P xqEN4b9L8&{?Rb5Y@4E,bH,#&YY#n߾u*|ne?+`ĄDN !ǰ iۓ=wu}SfG]RJIͨqu7i&RTr!2pO@bKI4nM/(WklIIvC9ns6¢[,@(} LOz _ zx2 ȓ [`ffz6Z=/v%3N^zgzz;*N8n4lJ(")%( (R#l$ m:o:VYK42ò,OW /׼nT*%*%@ަ#뷛 >ȯK>v>emJVtwjgVs"$1|wwJ,>7qbc-4 &fTCoH|Wz<ðh 9#θJ EQ4ay>A*Vq'~Il^i{suWxUoau9W]+fDX<4hF9 'Kcg[u8yM@-&׷+:ghڟP9$4-leXi9={-zϮS?}_:GO^\F/\>Kkk+7i\%H$ۇPzI=LRFQ3*qp}]\yśXvRJLӤZ6~z1߮i:mm[C&azj*5ɞrPx}yLJ\t$gK xARٰamOP*{:Mͬw$(R]Fn~Իfr&:m-M4(Tq˶)LOg^ q^MmE}b)L`)֤bkk -);: kץ̀ Bh,F4C49v?A{a֨T+T5M$P+:Mx﹒ #X,Ɩ۰,?feDʏ|ttԓ'?h(TYʕD3qW:3._d|rE6ӜNsa-Tfh7e\W"D)3Hr RhG>Weu}w;0׃4M֮Y5׼ήer2 f&juXHH]K™[x$KVO=ɳ=Cj{F|y2 `ß@|,O+[]J˹BJssEqccm,Gf (IBdtE4fWx߫.LzO#ϻ[n6Zw8$p*AKS:*?zBJ+`u_kViЧ˲勜89@g{+-sZUX[T*5 ѭ!h1n|_oM EٿéE- 58Z[[b 7SUճ* 4Ŀ9S\Zq y \6CӴz*lhZw88yZ/S8c26OkSί%z!08t1q\N, tuuZǟ%w&o$ۻdln~i<uv'D6 w|ihz=a5N6s {8;7 s?9@ֹn%^) &2XHv)E';l/RP(H75N,rqΆNG8\On_k\PᏟ\$ 4l#<<<]gcgfv.z:ٴaSbl(BFG[gtRRLLprlr! }^l"1'КRBgg<ß?al{bO~2kZS%tp_4 ˲ .(@P;wchp3ʞ<##c`m;z{ظM?s1S3!l-fXO3:>ZMJf[jy!AvAnKQb@4x)βd}A,k&b|>OP\.cxE Q&LMNKV `rIg1ſݶ%лzDtX%Q[Barj)@cNaXM261a[R RxjK7p1s NrmYl_ۅpB|+333NeYWx$^OplĠ*Dt*MHܹ{v{7J'۝bu{XzD qgM8?[Jz:hkAsɱ FFܛ1>.]}y'8-0׺X,FZ1OOE"ù4B!34 +XF@*\*e$vx>z󾇾pow5}+Xd2tl~f&Ȩ#ݝtri5ǁjXWe-N7xɕVw֘zP| tq~W s4`L[4OA{z8%ےd|@\"!~Ӯ?j_^~wU֯vjחd;m被mNk5i;YwTݻe\z``G¿fԘdU*o݈cD" S*.Bwyi5)Y`uѠBlz`+;*E5a299ˡ'²f]}YO BC_ \MNrL6aeJbx.&8INg( ;Nkk+$ 8h^nM@V#. 4Ni#$,* r =6{Oވ">SHuhK6D nS`&+;Y]VGKܵ />&9!'xW+.:>|333+}b. 'A%ܒ\gT*/5x$XEZ-unmD":BR\D@n;|r''"rHy7?sb%#vQ@W!趑#dsYH} BbTU{ ^.HNsF"t]R4ZU B$:td"I&[Xf^u}4_rGTo%ݝqӲ9t8#TO"0bI c;vA@W!i1j+]NXH}By9&r]cccfS\Bx)jqaspUSOaˁX4a<< <5äoe7ܔ7 !(J>6BRa]*:u}vrl9 s3[|!?spa9;w;\+ e6295 hkkSgCaz'y'я~ÇC42b1Qx۶jqaCM m4MTU:2Jkuig89>"F]bX*s 2V-aZ9v#c~?sŒ] P(8.BowJffgP N{WRbL|CpxgyOԄWCprrx4NRE\.395AϏzg{iz;MP(0==E"9pvܗ_û?b! -)\q)x#zptJ[[ؼq -M_ʕ 'N15r ;IZ (?b+| /bboEKeaZ&je/k֬D"A2 FD0jԪU**Rl.4##'=IVESQVkc떭bF).mӅT*)> jmm%LzEfggj KHV1Ͽt˲})Mho<(+M0=oe7+Wt9?ɑ#ՠG`L +(CT#bχn??5 /$-t[ijf8ꣳ֖ҩ4hMUQF{mVT.S(f3LNM2>6J.C]PUtB?lpW9׾mlz2 TUHi@P 6cMRoô,O(]hnJq}+:]R83,zY0T*5FF'8|$r#:rTyo v¿ }~<_U{nw SQ5X,E m+*|jUEU|gA,oW#0k%.E[ )&'')ˡ@4=#M-3n7-~rCO`m\щe~WXŪn*'Ns(<W?߶, pm< ރIzzE(I+HƑ,ŵo]}R 4DTU:::ٶݚ~xC;5&t:|~M ެZ3x9zbl8H)iJ'ٰU+Lky+*GƘdYŪ uj&'F8r|RH}&,#?طaW' B@#, <*m/}3'[8R0 Z[`m j>4RTJ%2gTk<#>6چ=Jq}/+;r}+W8à+Nrևq!;n{jpO)ہwKۙ:$8mW )BpVߟh|nS@1F:5eL$~S?[l=c0M %l6C6WC'xЉl-%dWrEW´,=N6g;QPz|G֌`1!޾2 K:)VHy%urqCX Tl!y=n&0k6m'{?z]osH)m5:$%˱~Mm-HjU''xȉ8.? 8^O=pb)RU(ILs}HrUH!m*{ba_ LOOz<64Ue&G?~zFi [hok7#mfrl\GKsSW+'Nё 46,~ޏ{7ϲ-;ٸa#~f$Pռbª0 I"?xYx/O_ZQ='ff3_GkSW*5FNNpFC%vE8FGGijje8ݭ@Y à\3/s0 '%oL{kl&]t.R Ryc6d\U1)r1񡡃_]{z2\~lxv ҿO4,lx,N[[+ h ^xb{7fPjOYAwG{Ț #''862FRAG7ڶ$Jof˦u$q*2|աY{Z2\$l 3! 333$IZ[ZCÆ$Nbl[6XM2cú^z&~j ._z ~)Q7\F.ٲX,F2B4ʕ2B߂ ]{S_Wm paxp8Rȵ|5M#311N:L[k+ ^>z h XM"eU[r#L$\6'/$ɨ\2rrǝn))5o+.\w:AOd ])׳.-S&kt]9~;n|,cѱL ;wl#UU)ˌ5 =]W (:rð%ڒWn˷`3$d۶CR,)@T#/yMa.R п; FEY/<ʕHҞM{ŗyf~UuV&i!?9=ɱIVu/|^7nmR南pe[rRJbtBQ(+@ڄ2֎|ak ˑK7Uj2i)r}\uj7R1kFOkUg^`kGUl۲ޞĶm3=ц 3cY{t>tmI@*?wUO>_ mZVXPg9=ui\2:1/mXZ8 MFtɤWh4ؔ%,g\.Os0;;Fy]Z,F׻?O[S p{,@޼Φ=)iJ&)U$R)TpnYU=聈BwI1rI֯饵iA?96 h4µoFOwB+'g.Tb\.+-?K6 #ByGv,.V֍lH2OG+Ub@s"e9n[ kX۷ q6d8>2ƺ ?bt'q[.1ضm,B ?˩aЎeN}F_:z˶G޾L{i)jE:5l0WL _tQ[sR ׬byCO2:>ZÅ;|$w9]'wLHe҆eY9jj=;n@q:,pLk޹]}^,PHJ/_l*Mɴ(EӢjeKOҀ"EbӒPI'TLLV+LN05pR(NaZ*,$s 1M!E_Բ,[46F"mI.w sR ~CÏ.~5bpZY5օcKIմ)6Fo[]i8D"Z3(ˌ9>1QjS|[W+&J}D)$cSd9Zhm CRNhmT*ʪ] KUY2 Fj2%+|{/a =#F\wk3ކmS4lNKs -EQYTTE(4,j5r ? Ti6tѱ%Ԁ m:-CcNxokK3mv]|;'R-m[7ҷjAj~#Dͻ{LT)~sGF5mJ'mut8۝,`C<6tI \Z[Ze āK5] R?; ,t`;'8eg]lbݺ^Z[$BLl"BgsdWJbd"*0mIjjNTf\&%b4$ ?96K1;mSF:܄Œz {06a~a6QT* q ա_gb2ŠoB=@)%捫h~)![/NP|Ť=5ٰJUQ.̱Y嚷7-R$PDsy)!ikN/摀2#ehM4'oLו튢뺧ʻ7)qU` &_F(֖VPU)"qHgou>\Z ଐ7 _⤣zB5%ֳ /Lf5LW5XD9 ם~E''rhR/$h񈊫 D贷JKr!TM⺠I[C6MN ½Psj yq]&pҌjTRp9v[|tuoX&3ĺ[m>~-lIKӳ=R iLg+{JULRC0:SϏɜ3Ow-6I4Dd=%ITXras!S j/LgGWgw? FlgB,"t뇪RitMR)S %nśw2/fN oA?mͫ]A,fx'f:Wl 3g)U-&f LʌLy ?9:É5g~W7-Ifӧ hNkSRD\ϔmҠ3]&ikw%o_Z 4 qs3#rRR_[KC_{jܶO~|\{۾H+aےTzXd2FQ0S/?LUsU&2eFK)+RRݿ 0-4Uo?N@s*AP\1<7P@ؐKtffI%S455ҫ 0GPoà79 N"HX,I 9<44L 0߹WH>" D:ؼi-tsؖP6k #=Mհ­Ω$50mTt]=0 %U;"l.:%|l.K:"njZz+и?UÖqo zx<$Pjf#߿[ ,ذv8 >^]gf)$)+_]+|Ѝް`0'5} ,D.hh4Te*$w|}xk2n" oLMUXٙf>zV95-% Ūm7KO6 !5ũ,##Дnyx.?A n_HRNQUEUT*۩ `;?:EHuV!4f ,*J>k`XG5rR6k* tTl!"3Yw تg\ xωb4--y&}\ #/?o 8m5p B6 !6] %6!(+395Akk;Tj. /4ӟN - v I'J{i/QD m3MsE |-^6)EQXٙ⒭LJTҧ3ODT]w>DuX1U&c3%'8KnFVPT"kBP5tmI,ђN#d ϼ4|կ<^탪-DZR055AkK&%`p،}:XpKEM aZeS( '_S$#>p ]SYّ播XHD#$[=C +uW<_SeљiQ)LS:e859¯ MX}#B2"3TsA@uIEaᆐ=X߱ \JH$ ƨ0I@0x!x^9ϏyֿsNV6YID5mz::]?Vt?_rs8m ]%5g/`:SflBXĶ sSU}ˀnd]=59GQ'w-?yixT84xpvsjq\|rL"$LI^7wLXHp 3 E!1 jBV\8-/SPo}wriܿ/|':z;زy-hV5rjFW@W;oNYuᇉe <8mօ_'(sM ֦8]8/E^>zj Lՙفw< WsfYj*xd2j = T\8h p:28pj~U[U5Kogkn9an6m\C{{m=*.r S!)s#Gw~@36]bdLƶ-O9+ڜ0RiY$: }oY'+y'tlъ0 q.VIR3qӏSd'-Z)B" G0-ra0 $M]m˧fIXs7+v@clZ V$خ "SR(^NOqB$P"* SN( TcT]!Pm ~>/BkuP߶IF5ڛcۖLMMsظG >d?>{lxhl]E=8.B$eV+$IO6/dpĩBÎ/*BH8E,ˤR$bmOW#SM7$֯d^ZZ[ ܩ6*ŊQD>5?Z_G\k'1-,ph4Q)QʌP-:"'+^Q7=.ht,$yc^GVd_ʾ*lu7m6S7$T$S)  =x:i0 ːHuMô,*JxBu%+v?_U$!5L aG[ȸ&6oXźu4|Rt#:߯ڻ~~˲9:煑,(S>N3 ~p@q'n ?H$|" W,//C;nb 3 v>T*єn&/@,7\炰e@R$h]0M;TC}n!$_LEh:x7=* 9"-H rVp*@X!RQ5H$G4i˰> ;l7X{% OHz@[grwn\oJ[{V%DLtsiϰ4 U:<͑p|X•md>TM֜zaGuM#>kzjk FTqgxR0}Zl~7Oϩ i%wmFOq$b5CSqϹb豃xeraLjpU`a/tyA+4T2azLfXdCrUAo9ں馏 u\q%W\PNOٰ곾W볾m?g{XD%xI>`T5ª JV.v,!c5+ePkÃ2B$շGNы->pFWtu JA}W}|u @W">Ubi˳Ĭ)ΎR+a`. _<^[ V 8 -FF8>:Mհ~x?>K}/] 񔀆".  Ox;bÊM .AL7f hDDc1t* i5^ wc_Qb"Ѵ=qn\,D< okikkEl9WI)UMj g {c^]לu_QN+Uy 4*`Vf߉kt+Aö9WTE'5E*K'G9zr˒aπx??ٵq1 âfXN蜺[sDTC"{no8CZW2GB|=߾+Ri8-"9/r1L &Oǒ>;,̋CK}kcOVG@>ǴLRh,0s@pVC0Xu8M ~N5$և^rKFoޗn-_q{mc#iKs\m#mؖ=-m; =i(~/qGS)ȣQ]%Ӑ(OU*I*'Dך<^nf~MК'R#cqBޑjE7/3nz ):p^*mr9,$LDy1.ǻ?I8 .MsEFHdn9`&rKK:;:X\p `G6؄<WӅa"VuK7y:b}AN;lςY{~7_$"ģ*-y tCy*Qǭ wi s/qJÄqUJ%xU(;=_x;V?x < fz2"Jk3 k.p #?#CJ9xI7"<3443R GY db]Lm߱)Us@[$IbXC!2i a/vAVA(J\ T땆 A~׏k>wX{S 껅I]H'+غu=h˴g~ð,Ƿ:u'{: >aZ_i)2)Okg~Et$hN ~U+zc95Z=a }iϳaYl :ᡃ3;ozhqNbYdX;[P_w?}eKJ$ET-yBZm<'\'m%p`m{ՖKnhV߫Hq.E;utwnMWκ+y>~ j>ш+* <©ڣV%?E~Bu*zM=\w^WksyQ&g 黪%/~B=$Cgv"Jl6|˶'yD" Rs*Nop_0 r HhI7J%j^&:D"?sҫr,Nx$DEkTQf u7T_C \H ۾mZJ]@T2 b8xr$\pxmBb$`GrhW/Ę/*lx׾DAo7C:3i$eݺUM#cNmL)㕨D" >_"*1|_Bɕ n?n[@}鼊"K}l],eΌm,|?)u#r?P1,ݣʦWDP(rnRfӨ{T- ovmjPV9r, ,GEJqѯ~ .|ˏw| E _y14)XI4%HS5MЅ Bp~-˚W HT 4DuRY3Blѿᡃ5`Ӯb7Y}7 }Q#aZMʹI&bZcnXt,8rvqbHh^_4JD-ώ-h>+J~bfZUj&IIDAT׷+|/9)Qjw=@Q(/|.6 ,y7b 0 ʕ2mFC5E, TA@e.=\m%O$-UQV*+e?A !㖁;s&߹MB{?^MƔf6]ANZD,ĢW}*ԛnjJ]G5bO?MSZJ]TKy3NO~y}޵7ْD󄟺'@V2>:)̐~_FȽGxyW/F >^u !zATBڲ/,4T k z:H0TBjAUUE$W 5E#.ŖmC|9[KR_wuqm7ݝmRĢQl U1^]LƬ'#~߾y|5_%ױ$<~(?:AMqۅeTOV~T!OUT~/Gu:[Dt'Ϲs?9>ёI:7GxϷ5`7-m_ذ'qcsY" j`S, 0B 4p_咅j6ipgAZT.T`΁ܿcC驝˛ ~}5JƝj5T2ƪ6cÙ:3Gk $ʨ9) U:49?) |bC%S~mfN6$ (J+^|1x~- `5&8vrR #x֨bW#>|] [],;v):$-^ƋN~ 2t4Lw}~_0\.S*(J58:(RAXlb1)Wʔe'˔f){u^7"mPtXmtwwGiєT)(c@8s}m.G+ *2qb27<LY^bejnђ xe5m[L-VJw?b/yrk}_9VajrY&G1BZ-?>"@AWǖ]]ʕ]\xӲi faZ B29;Q ykieZr9Qc _0mg(L0Wˇt^_hKh*nZ/QD3;>l&ǐ#_y_+,І2|$D9!Xh$:oXCgI&abbBgܥJ0J04RfmЪ)"xEq[a/>w;ͬASҲ,t"ʪb(՚ބ#"HuWLWĿW|n=?*WM~rt?z|9LG044(u@H" .ag!|)jZ l T*呀{7[6b|>H.vN6_B0tw_{릾p{?7$.6'1;;SH)imkku]Ir9Ϻv%PUf4r\o2\5kpIJU5[hkkcll^U!X*gOV54mZI ytMeӺXh*^9mG TjYV}PFVߦI4Pa򃟌ǃ/Q.VJjRaso5ʹiJ||~wq yFmMqbm[űc#Lbvߵ{cI z5)f+v6m ?.B_r%W_}5\#GO3555Od2q*7 i4QRQq>^lrD sx1-4]]펰޺˒DuA"{yǼ=s&nιBWE4F W_Ͼ2ltU PMPȌg kWg!k-,(7%Q5 "HWcWѱ^[eI덼0 &&)ņ#ي-193{{_Uut&)K骚=7.IJzG[bke |?`ia+Xhg]M ]hP P~ӡcw0tC7zV(*H($8~;lr=˛˖-[b/ D{,.i{th(\HQ얕 Xir/ԟ/gMսJl2P#N׍D9r8ޓ-\{dz|;op觋3#*JfF$tf _$#YhبT86ԛ]yxjK?=4gH iSS,,bmwDB4P(MD5(n9TWΝ;O[^e>9%l\6/}.>[uHUI;\67\M0ua.kj]b'jg3F.cYY+${Λ(B`aWc~v\{Z#4k+xN[ࣩžh’_э &C*l68|lvp騐#3/@_LLLi%<lS7 XZZbumؖeQ,*ٱ3NT:{,ˢP( ?Q`b87kbtX RlOO @P*dq畱zٌ?r[]g3z\z_>cPșhϿ?Wc~tlӫ?G˸&Kd`_ZgMFKJ6݄Ffrj=`ĵ`!4ú)&,v5 &zeGM8LӤX,Bgj N Bo \v;FAh& $Wo/kA4SRƣh7#C`$n>2Atޞ3É6^ı35]U{O"᧡dUrX]ӻ4Mj3?j1H 'c ?Go>j5:j%.Hg@r.OoZ!GL I2&Clz~$,|.qW_T_o{Xao6 eU>d }UߗrroxmՖOʖ28  vJ\;v9~@ 4]},O4z/x3wa G>:yc 2|^JI`jz%jqv Mn Lӌۚ|I>1;;S' : n—f9> *蓒?r1_3ƝnCO20u&ț1[qəZH~)%Rȟ(Ѣ}E8R), LA}:'cN0qهu~ocO= яku]֭[1MfF`K6$%v 6R[Аk4!]/".l#b]CvetY._i09[᧓xzRF /5QYu:j.<]6DPP"&c %wiFRe2VssDX0#L ƥ8;&v?pb>='ĉR D,"ƍGЍ D}r]B /Qg`j燮!e\$Rqp]}I*:Bpdh7sEScRV1I ӭRJ\MD7Ju{忪?r~F[ A]糸j !c:M%ٰwĉ'zw@dk$kk*+dR9DQ yXE\V7Un&B@\ | +t:mtGm##: hl:48 2ulG>?8'j\[`rT J ̹ <ڵ|+R=]o b>C`% zTOKknhy`̾+vc>_( RqgW>ZM)!EFLw `'JEk*1LORoc~~_fp] |50{~ l%yDW#WV֙]UJmٓ'9r0Ws\/obhp> /qBE.}֫ %oR*bk7ht+l쉢F=MeRg0hJ:v8v|f_MJ1|LZໄY(_T= F7+ˌGӊ2[n 3;wGB7wB`Ώ޴_ X+vlV@CDo봰xN0B!hjoG0zVok\kA)c'bO& F>|}}O q@Ƞw:0 2tfciZ[,r#zT*~g8|m޹%r޽ , 瀕G]lmWi4Z1%@J C3ɚN`H+:tح 4݈+bp?P.Zd2> V^_.c7)-{%W5ffYZ^ѬTL `YL&6gR2~-Z4b 8Vy)! 2zN`jUWn#%%k6bpGNQEz.B7u#4 /W~MӸrk06@g3='ȯV?W8xwǒlۦl&0t]?s:?{̜ƶA%}{;u6=>zӮ_DNFtbtlF笰 4 ]rS[E)8iTp=s=-`K`|4O> F+mSY^Y {0<:D:q]1qժMՠ#@T(D^K@kJ -'y[.5$D<5A  ;Hh\sն0Z&h9_t8ٛ珔~%vRKL`X^jfB=G%@qEQ).>xۏ(aK><>NjBmԇ]I FȢH9>P3==űGXXX M:R_֞q~D~+0R 4;Hh6[L1wj ?R {߼7*ťO>!$!MʊD@+e9!x:joMݢj8Qd!Vi XyqAD ĭiZ=9Op`:2_Jۂ36R)vv&~NG~TcE>LVU!%ϑ}R\:'e!}H ٶMacnal@-"Z}@_@/zމ8 T'UF?|1,W-b!d> Iō6g#TViw{i{À K0bBNxDF_ uh4ZO!ċ{ft8tP㓟GArBɎG} C2.3#QxKpU7*˫>XE/Ook]CɏHN >G4-xf_r c7F fZ9q5rr,iFVR:/]O) qz#%[g4OO~e4F & tJʩS⌯ &ϔ⽉C^:kwukB2'D9r4@-M!~{^~xL_{@ێenر%2jMG@Bݪٍp_3L~Հ\1^$c&_'Gbs|9̾?rB$\W/:@ ȟIx}~xlKWK]an/_1\#jzIdٝ7(%8 \'4-o E*S]_gfj?G/KSO|~%{5xEEMM";`}~@|M-CǸ杌o-j>Fz(L n KG>km4G2➂4x1f痡 #ǟwu)R\j\p `*?uP.`; Cc6NMT k J){q?z+kKhb!uhުeOO=ƥH1 3Y0sRDzjޚl_EBh '= Swg";Z(0=K 4Z}?#F/MKbX(@C7K$dS KVg|%Fy)_\2 :A8fŵJHgel a*+K,,q͓Y?|t_ .=XyכBmcJΎh?7uMqLz?@0b,H!3ni-{@?̼o2ޫ)njG͌ݴk(6ZlR0B[FdHv:|e '%RFdaJ/3V2^ΒnIgg3=9Zz;z?OV:~nT% p: !#t;2>V>H1H~BxR I81 t]3_L3wj k3}2ݣ).R a} :9A`g1i>tlW@wvkpƠ 9I8+v\uF^jذM_X6i~5Rxl"T$GoGZ~U9CkmhɄG#]d/?c*Aha5HF K8 EɫB\{"E%5/zc|PZ<@B:" G3*/Vs=h?$/[uVY8J?#xGW~o_\˔"%%7ɗ;y;ЃwB VFNs\#@JM)v'ijVh .FˋK/Ph+ 4#ߥ>)޷AOY,j~^# $R>˖rR0h*@~ykޠRkq?@GBNpr_).3 {)!$ `Spu-})R\j @%gOF8]BZ ;ޟN|~7Eˁp]:B c큖ڭU U`U/ߚ~~.Hq7I\'qɛE o@HȡH_Hj'%IqDsi)RH"E)RH"E)RH"E)RH"E)RH"E)RH"E?hI1.!%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/sandglass.license000066400000000000000000000001441416353147400242270ustar00rootroot00000000000000[license] author=Anonymous url=https://openclipart.org/detail/23920/sandglass license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/sandglass.png000066400000000000000000000354271416353147400234050ustar00rootroot00000000000000PNG  IHDRBsBIT|d pHYsuuxHtEXtSoftwarewww.inkscape.org<tEXtTitleSandglass#+LtEXtAuthorAnonymous!tFtEXtDescriptionHourglass icon by Frédéric Moser. From old OCAL website.!*!tEXtCreation Time2009-04-03T16:07:06HtEXtSourcehttps://openclipart.org/detail/23920/sandglass-by-anonymous-23920>XtEXtCopyrightCC0 Public Domain Dedication http://creativecommons.org/publicdomain/zero/1.0/9&IDATxtUdž(U;*`齃RA@@@:"!@ !$!^HAW?>YܙIvsݙ{>W$, .H (Fٞm^ x666~$tdfY6~ў03کD;f gr;Ԏ}?̪ 6Vk˾FfXߎ!Zo>n;&FfGSΈKbsl19t%bKb"o-aKsgق|jׂ#m4gs޶1-Λ٬7Yo4c3،DS6uNlѯ)JքMkcrΫMؤWI+لFl<ѫGD4dz6dc_1 gDltw՗ٕӥ>\T ':cÈue>ii[ !aA%ƷkIW;ر ۱ N|хm̶.e>g^gӼN짹`M 0332X73LOOf"ş'ƵcƶY9'FqGK kb85Ɨpp .Ro\m,//">\/=λ\x.w\l.|\xb z~\x.׸D_.| ڛ O…OOecKE. 6=PflNw.:ѭ!+E':7`#;՗#hE' !1$CbH !1$ĐCbH !1$CbH !1$ĐCbH !1ĐCbH !1$ĐCbH $ĐCbH !1$ĐCbH 1$ĐCbH !1$ĐCbH !1$ĐCbH KVfZ<2fk}&h+SmLFnhXvQ=H{"e];Q{֕6Z8Rkgk3nQ5ukR OcF<.NUgOA{ @!ӻwo5:JMm=*-- BM6j(q35O8a={AfPfM5'9J\MMbS?-͕+W))SFM%.&M$$$\(Ŀ^@#f|;wXZW9xu]%yaoݺpa͚5j1J/9r)ƍZ$7_E4^~»ᆱ& wVzQ׮]M%ϏF`GwVzQM4 p|ֈ6AКŋڵkhtPbbbDf{!At'q-۷ϔXVbCF2i$5N8k.hxPz&qyJ/8q)DĴ΍D7J+|hZk7oD%<+`ޥK,+1= Xrč$~`ځ۷oXk]V 5Ó VvahԨ%&13h|$OWk\S#F (믿yn'"q֭)_… ܹshk^u5osJB ̳F&+W&/`֥EhՊ&4D ;vtZ<Ǿ<;pe4D ҽS}SQȡtJ4^?HkYf}!+VvD [l酧hxYbb"jna'(zZom~֮], cڇׯar 2)))Zj"IE/H+SGDDz|dn_RozhW'PdC`ы"*զ6٘c_QraTıQ탚u  ๸A9цo59OO^8_-EYP)+77 vߟ.]ZD˜$q5?>W_}eEqOILkh%*YF )mڇ'YRR@hxCǒvQtB(v1o~A;Aa2tPQ39H>#վ}ǶnjEcXYrܮoN+ǃze}znHKK3ҖE+2eʈ#%ī"_h_`z>c Bd#(&bCKQ^޽{Mо!uj׬YSTbhTT\WrO?ig8&REK79%{"_W6_8CⱔԳgOQ)d8(egϞ](7t† ܿQR1jj{|/n/\Ld NcQaY#,6(K9Β"XJbKKcitV:>{\-٤}:eejxTbȗ|J3Gf`~dmaYX.eFkWα]\d_n\¹nݺqݺyݾuݹ}ݹs?SScS"M?iɱ,9!Jn3C,w?#уvVNge LIJ K,v|]l ]ARL0p&]g٥s6g\aW.沫d~|V~0?W/aqQh"7|">.ɜ䘻Pz$LG!F8FOs|̌dϗS;u=Ģ#pvm_;ر[Yf9p:ְvr'U E0R1 *-ry2h%&R "C~6?qGZN㔗q[bL2IF#{g)q/rf MbZ 5BǔzLfz ط$C ]c6A"$tX޽|MRbbȅj{q.%KWDgrT4;[)_CiD*aAED.J 9>i77ٛ.KeATE 0^{ԯ! l9D.T ؑ#G e8Ph"ǟ< Y`w'0G_R g9`S$((YSadiK|.7?`8)[8 W(pK !+p+W. rR 9Ì~v!|cx%`ZV͛7G}TWOE/SO=BBB'"RF3n~xv4S3ىȾՐ$nS+=-Ԃc腤5 oFvV =ݤ-lv"Gp&@^9Yn׀(ySPU9T`1<9uό@kyL873֔ oqA3tvFc#T>Z [T)z7)9ᤡweֳhƾ}TJSP!JRΏg.\X0&3bnγ1lfs'uN`k8@K}"or "?[Si؛dLuQ'~,;`ʍ0a|:6Pѻx@ݻwOe/P)5AfZrk4Rj\>Fwobb"{IM(h3 -7^z9 MÍ<<[N4RCS.$O(]W\$G~tz,-74wJaj\e y *,T k8ΟנTD-NF!X&G(Q&3L^m y?`=tNCTAg!Q]TT_02TO3JYcj}W8oGcN֛[vrYLdׅh7;]?yc<WxgyX#4lp$Ԁ2S^ΰeY^,An+x =ϙ3G1|ǭ#IHRL":RzP]SO^mR4y^}U=Hd`xL'sWt=u|_ɼɫ$OO3Ab1Ҝ8長o߮+$E|fiܳ9I.W؜R{[ xYU(4WQL|EiN I鈞gll\GUN![nU3ӓ"]K*!?k,BwGOp˖-rYbh/xɉ!?tBCtV;5ewY-:*m:{ɑ#GjA3 MdFua=2+WT)WrTxM"GگiFO{Z (Kdd 1D.,rNo =gܹ=zMe|b\lYy577WW`G&2RgcԩS`}5M)(A۶m˂{e'w Mv _ZrWIj> }Nu!$[FFO4`\=ˡ۵Z ,?%D ~ݠz7VK5B8>lGWjnp-Z(prQ3ZjaS+'# Qyg #Bo<ٮW>}2i JϿt >SyNu<%AAћs^̭[f s8Aу ll|zgLF2WIi&VWpjKQ$LPɱG uQrBoӦMw;hn39V`^9+#Uգ|P`w UjFmaz0o5A'-^XqxMukOmTٕbro|`';lذA EM8zz}=Ncה i̙j)dgy( xEtr4=rپ})΍=qPcRNiwZgoq^BBJ4LKQ ,\AzJt9fa9eرZG#ih6_{*s~<%yƒv!{3Nczcg?*;!VIӺr*U<Fk<' pcȡ<>H5J_rсsVȴQqɓLo) svkR}`mr5FGn+Yh _-m(1FҰE뭋-R^KvzG,.YZJ\ze$:n;EkVZU8$u=&u:-ĉ_K&V'(Ν;E$FQxxGRIb:]QR+}.1an$⣏>QM6r@ L%*$޾}p\bPܒXjUٳGDbG LJ6hGb:uR<@\@NqHI{877WXqVI1c(N׮][M%yAT\RQ={Iˌ@=(JUr|%w޼yp%F5=۷ODh-۷ogUT#2邦(x3_mܐ{F)dҒ(Wdb@SBEx)rŊDa =h"=vLPQHQ=`hQweՠҳ&P/]TGzE&2$ۚ:aJP/1U+W-_\J3х5+59F^ȼSMad(/.#Ν;d/l'66zgpKHDx$[_zb͚5͛u *0A|Ib>7Up KRCq.1b|ʂOChQΕ6*C*TFx KRs6۳`}aBKKg3#>Q pvm\O>ސKKHJb/쎭[Gx9f^<~JjGf46RNe(w+6r.KR$}zK.5d#$q]ϠAY9 $ۑ# މ5J]M,QJ>|u^9PvGKFmN^vmyû /]v-WZ5o;Gl29w.];>}GkAJDzz|XB8gKõ0CO fS;Nh".HǤL:U 2sɒ-Vb*U+3Nnݺ'NڨYd/Xj?.Pf7jA-YDFL^B3ڐU;w-nOcҫ*'Vq m<4U*#0+XZ=l0kU-$MD{ť# +ApM:ZnLZ=FtYu @FFYXF[ӧkyCq I  4:TZ㊣]%+V"s]2%s;'s΋|1cŰصkWQ/r*w|^zy]ȝz`_:r①ȇbPgh6,NC~Zq&**UZUTV$P:ƚpv 1 !o^YhLf-[&SǬ&'"_n^_H_IpY%]d[u}%Jv.{TϺU$Q8Z۰J%JE  }>>-*t_j_fĉ^.|嗢/|Y`JNR4p3zřh$v_~YDbڂW%/VIlj,€͖+WND A>e9͞|*0fA sD:O,0օ0}.]D$.E*u|^]JaeP1 :@@ž""ۼys67rré^W]nݺXLN% RaÆ""-jUTYFArpǶmD7H-*??Uh_Z@ݻ$^ xs|qwjg-Jt5???/t|G!b"K糜|!]cW/iҹ,R%VǫIz~pTyh-sAoHoaڶm<ݞ}ٷF^\n N`g٧3:pqy ;w8Ļ$^jı'ŇGw[NK8 =*3[Z?D*U_ ө'-!1 P4A8u!yWEtӺ?9!JKb Mh@8':t vp9:)yRXllӇ%/j f'!hчk׊H,o| yJ_Ic DsrHKhxS5#&2Hò~ < @^L:U7nFYMh;'%/Ν[LH)%1ydzɱ_ J0B5,7ǹ8dϞ=EzzFJY-O8I*vezh4LcH}ɏu։HzG4B`IRii"%m'hxYf1-V`'z4@` <"qu-7LOV h%% 0fkbȾj_RGyޜrL+jJ7߈< ڷo*P"%NCx̋<&"q(zNOOwzmt$24<`$''ʗ/&ԭ[s葥wң-'1ͦ#ήC;"TǫI-lN2zbɭ$:tE$4mRy~k-9E6fjDhV]#-`<ȆV[%۩G\ڣCɇf'i̭$PtÜ Y5у@fW jժ&b%*N:No#|ꡝXVbU( /$ޥboC[δSڥp/vxĈj)I|Rĸ#-+q hxKަ\%^lTҋ̙a;,+C5#=(c;K~i9,.IJ\b`N-p۹ B5`+n~yt70pީ5jPx;QzQҥ QZ+KL:ѸFtAM$"ep^#֗bS=qJKS!vxҋZj&0KpJF $O$w'OJ/իӛ&~aYiR_Z$|iJu&[W⬔H4:`<{/PZ`KIc:gkņe%͌E׶mD֊KJs: M8źIFOw.&/"qUWo*`.)%طNZ*"7u=@^~sܨp}8VT8J v7}@߇p4R/Y$GH(q 59bI1}htpW+U&ǎ7RFH`ᭈ^F /LhMG"q\!KKLht0$nܸS%&1.r'|GE~O$Ofe:qle$N?F e8M*^wĴMpUj?(ssܾnߺq[7DSIKZ-KRhO<˾,= %Zpno`sl.3 l61EތocFlkMtoS6фM}ƔޜWɯ4f_n&1%NFlb#6x|C6ѐnn g]DlTg>Ƨ9Dzlx;sܺ$ĐH !1$ĐCbH !1$Đ@bH !1$ĐCbH !1$CbH !1$ĐCbH !1$CbH !1$ĐCbH !1ĐCbH !1$ĐCbH !1$ĐCbH !1$.ٞm^ xq r9\pg&с083ک)b2q'Y53Hkþ r\8(."1/_"ÞcKXI+C8\Et-mpIrA >R\|KIpQCp)Bec֛ @.%EzSi9\ԩk\H/Ir){s! .ꄗ .d>zq^"q=/y.'уItrvb]]l\E":c:u6>ii[ !ԑe3ZYL@5$@b$|1F1IENDB`vokoscreenNG-3.1.0/src/pictures/screencast/shortcut.license000066400000000000000000000001371416353147400241250ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/shortcut.png000066400000000000000000001013241416353147400232670ustar00rootroot00000000000000PNG  IHDR\rf}iCCPicc(}=H@_SR*qP,8jP! :\!4iHR\ׂUg]\AIEJ_Zhq?{ܽjiV鶙tfE "nC2YIJs|׻(>T|" 3Lxxj68YAVωGM #ו:qλ,̰J| +- FNuN#.647zB}2>cϰ"w r}(0"EH xO1 ovO)!34k̵&~yDM*>)+: B*"+]Ǽ6HfގGw@ ړGX- eT.6Tp[K)uUKw~voՈq URIDATx}w^Us>Ϥd PH/2ѥZ!ߺ UV.W(E (dBz2L{=}睹f=s{.Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|J ^WAgWO|~fnSi&ywYb GZ{]~ }ONT!>D7L"7xҾ;c0g_ ^@pEߪre8 gz2ߧBF|ckLTA]=g#Gu^7ڇ8{M92+;1._~3 > D;{O :z.=NJ+o ` ":foC pUKOF]=_5!'v?7L2+V.}WRlpѲ @/C-[zIyzO#(^0(  =m#WRS[71 uq1{466"a0;'2⃈J;PoJjQ4TG&5aشi#٬!b첥}۰%:@0PJj&YD"P8>ȅ~QJ5o)0#NR=윋CYv@bEPm8PG ыv^{>LƳrX ˖^SAճR&6^/07[uUزK B81w<0Y砼'{U"G/ R*IHI>"@I{%=^FXp͛/X߷^XreK)ȫP%+/X:aԳkqo"q|q![nI=+VA6< ㌏}fE<y祿l u™$嘉cneJp  cy:;zꑛ0;påa6'@sf K1 5}ğ ]D+Z1OA[[۸:|SKA5 {M.EnqO@ >3gTEl-˛ P'6ooda^LrOGQBf[N&[nsb b֬4a IàlJc^^s[#0q+L.kAжS0lvѼ-O-^~f 0<&?ABpAsq0 Q(.@nyVz& d $5G#QV`l|$vqF>JAn[/CYn9a U噄/1 YG_!bR%PeD A hxu+bzpuX|峑aA 7YPښZYܟxB7b,㊻"@)&bYQWg,Ux_Z 9iN)!AgV K"~ƽW}EA8FU *TW(1Z}ˣbྦྷfO:SY^}}jkPSSJD @}}ZZԂ)NcC >m]} kؙlP55TX[WBc!zsF'xg0 ;O0'bZBkOH$jTUU#M)Cl475!& YJHAd7B @430s,456#7p8VtMCG4V='6ێbQ2,1'S)dYX5jk OđN@i~-\LE ;jð6- F"DFb76 ۶mȝF;"<%bHhk@[k;""vG:Ca466H@}fL&02:=C-Bb*456M vn)jWȽm[Ja?6' hnFt ##l6/ŪHL%A @0\~ Bd2d3CFD# LđL%d,dhLUQ(R:،p8p8];5յ1}jЀزu3ҙ4jk،#J```7wcp BERd1_kf0:6ah``t v# rph `L:' RIƘ yhl x"ɠNR)R)a} Gs47{˅@-ͭhjlƮDhjlF,Za aξ @yJ9[Tqs+YTYTŪ@ {,#HNO&H$yZX! Ss0 D:i6m|. PPva`0'1wRPQ?}9/ٸD"#k ɂX:C&:9c#fH$f}{DRd2i)L24FFc6  JyZ%P3Lve-gēq-OOܑR/gkU/9ơ3wE$f`:,Zbmb$IdYmoglm#@ k%@ۃ}\S ¡pXۏ#H$?PN ka?HA=dcQ^O|gN(7&q((Q=%2H$`0`0L&mF/e<{r;*K"3=h_p+׳NL^\ʤ0CMU4 !9} >QL pk9'(&S UC)T(p:] fbhlk$M  [?وdE9$R [3_J%X~)JA1@+455(DYM1|?rT!cQj$#e:zOT:ɩJI꣺H{8v_,X#] Nf hq*hL`0{P)4jJQf3WZSqck"6IvKW3rGm=$Ԋ Y&vVsS86p3aecٓ`kDeM4i9| 磔P'9+2/V P&g64r|iҠpx"_AR:~P0yP}BB`Ce?׭[Z^`-yeW?P(2gF(S(.\ġ_Aqˆ MLh`6WU4&|l>.>>g.57L6ʦ,a.;MthtRaRy%uQP!u AX2;/<2.:>ȱDNc?/TʳqMTyМ܄w\&'.^mϻkJ{! g' %!06,eT+}S}RSw0܎fLse7fq5wV2h~sUPpĝ&fҸOń(!jm@E ` ,kM:8cqL5Gv¾,kH^N@Q41qSMD$PS vH̀Q.LAf0W[*MEp8ǖ1tM7f>*m@%F5S52f[T{WH}ҠX`b0@R5Fg&t ZfnM7]a,r|EIYU0 v1kX8ѧӢ'Ikjad>ʛ0ֽ*i%(c[Yqs\󗼖GlEVkju59 nAdݸxSҪI0v,1}^fDUΧ Qr+1BQe"yOe<vν뭜  *IR&wF_>Bx\&0;wMҌٳgɢ,L5fj?D+޹S杓d2^ݚ63fq7^ցӧc4Ux%LՔ}I|贎}ۅdPM7DP0/~غu热d_D~7r.?av'./yEí":NR>ҋ/ګD$|H3}}N09m@7ZcsÝ߿S|oxjkkc5RGf02 H9h FUNXR sh&y~a+Xq)pI'J@"`^%05.O}"C!=m+Mi &.R;/믑o^ރ=CQ꧞{ފ.L@_/Q҈j~fgLNTk撟|a~yoW03i \*g}3B 0*eԲ{<<%d 4E Bp'yCw܁hp-L@Do0+t@٩$xƖW ?{ /Ŗ[7Z *ĪbSE?ɫ A ҵ8AD{Pmo ߡ}r[ghO^ SƔgyVj 'OUїJ!S`!/}lU~Lkkjoj|]?g\ܷ־wwnŜ9a6;g3֩F5ʜvZTd{QH WWU]פvʫ*#5(\>~`_H.h!`WU~杭/ΏHhBܼ_ݎ5fݧ3iŹǩ=E6뙀ūL$Pf [j3}&{b+' _qW]رsyǗC@꧹4ƒ-(!F3cIyp`*f[ެ]OZUn ̓aߵ _Ǜ }Vtsc2+1č@ֲ h}I\:saX6D% | Qc&'g!g8n;^z j`6L}M(\Db2 Li:dw ܍ߢŋ훹jݼ|~p oGōYY=kxP֍@tbW C"xЛ}R I2DߢE M$w?Ayy͚װe.q'j|-׽s>)Z߃Vk;ӅU^ Pr 'cK/s:_{+ sߚޓfT}iRDx"J ;CYw%)p$\}yX߷)XGg1k>`I7+WT< @4/ c~lblgP]w{psܲ-. A%H{ʾ+FnŠ&);&f& /yԇu|U&ٿwϹxg}-%j;I (rj9CUkqǖHc+GzM7:uMٜZAGW PF 9J N*YB@q#~ahUD6C47eK?B:  /addĊsq! T'- b>e? rSuq,Y0uJ'N[۷+E0Z)lrQF zߑ_Z,ץJ'|+UG|S׬y o}˚5p/|+_i¾MBkfes_?JbKY_9~Iqc YW|7ɏjLZ^{@:ߎ `FPZBj NL:Rf||͏?gk ۇ}hG}(4QUj 7$C.1jH5|+rg2нjKQU01Y `M+"JᮻgȤȉsb)h[9: Ʈ2tc_jSR᫗~`*/l81wE* 8q @;´ "—ȃĚ5euƋ/hpuy?'JB#kM<<]Zw}L>{сp B߽{x/O_$sgKmye\`(j&',،?8nSO=/|baD){U4dͮP[1T.>ry8ԓyG>}7{UOL*0;wg$,5~mٳq/r{W&>K( )kŕ?TDW$~lYdtt _w2 눘̚aM͸fm[ᖕ"NkMUaIי@"3P$|-q3 |BX `Ok~*iW@)zD";ѱV&?Oл+;oǼ}+9#g>ť ZPH|Õ9SwHҦܦ_{Htc_o^M.)PaB˥Z|˰v[[%i)&kkH)@-! <D"%_Rqǰ)j檁>Rq%Z Jݼy3JkUUU;cB||GJ 7bltԱ]J.c[σqvq#'ΙA7 #s ?u. 0Ԣާ p31?Ak٦Յ߳pc%whȔ.ppSԴC%bݿ7}_XpayNpXXc͙42C &)gh>ȹ^E%<`r@Ɏ" #Я5'py 7 /3g a떭{]h!/TtUYLD*\K7SQ2$]:FT8O*p&*^Bzɥp qhmkeT@'[p5@Y7Ɛµ(K͏HT6D1Lzt%m w6G^4ƬՊfyv'뵶GA-v$T!%'J&n@?}{@!9hY\:ڟR3\GҤ>\L**JkN:Bi]??=G,9l᠔d} sElqq ^= dBK׊(̸$ޯ0L J R|8wNy#.R JkQaR)M-M믽ѱ1,\x8va?>&NEi&I(#SaT$.Y!!ݲ(H^} e:Uaݫƕ-޾e!RD f>65 IapPL`~(J_~-?Yι辺ۖjI&Nbcd3t!raU*$3wCb[L{Wa$uH/.m4⍎kL {`ٌt0BcCbË{H݋apk%xI<h 55R5CT2vK],Zh$5WUREDГ֧4?(nl[@C8g~mradu)< PD5QuO{a(҅d^STբJަ 9D%c0 Sf~47 r>zq9ΌC}m 8`o}:"ҁD2d*l6W+0/^!&8VW* m2Ylٺte/qM6K Jz]J%iF`{#v /? è hjlFUU56nڀ]H& @)X| [nŽ6^ځ@ [7c>G?ef3(-zIbUhlh)ص/Ԃ5(5L%0< [mv^ $L*hkow1-!L(GKs+Rx9O:R*ս&d"K+IÛ4@cCpݛa 2f%5K@"Wz­ ^Wor@,CScY2' ҙ2V\_߀Z峽mjx[Zye@ D{~$~0UJC4EKSCn0 W%hx[۵[]!Lh%WWM;h&t_icބ2~YHD&F*ᕈDhaol /5 ch͍-qݞl% lͫu u62ڐW^) :N]m}AƟ$< K͜8˻F\gaF/]N6cj05Y(H-)ŋO?IDdW&Q,S0yy^_nL"BȤ0b@BNJzM(Uk&ĀK k+6,a٬tEeT X+ޥ>iQwF%q2R) +\bb{d^+; @ o*&18VW) `qFI4%~ߟ$*$qczl߾]:=p9Yo;zӜ|H( !ʱ}nx:$6m$E4T )XJ)#R< ڷTZzN|M}x4O1*&z;9o>t[DGHikvX|W^y:!w6ŞpfooG{) ÀajŞ=b0pC1O8P]6 $wpQ  nsk^wa")R[g/)X]m LgQ:JNmN}ɸӐ+/Z> BkՂm昚bUҫ>ld26uxcqd)i#в/۷W' ۷oV?ZMI)m6}@r;Vc] ≿ÍˊJRv'> "ܖlڴ uuuطئ2R^u -<>'̱=LkGu,&"e߿S %Xly+9UR}s҂jGai a붭[e=`\}Uwe{jA@k,bN=淡"b[0] O((>-W\hB k( dd;j@^j'vv|OnRWܲ(P`׽(ȕK.3ﴛA>u|zo*5q[^^\l5-5ή1>*JgnҒ?4Pv}|X2arEn g˾q?3^7·+< zkK߾zJ1@;t4)Nަ:(é4^c75!R~[|e1Pq?9hy}Vؗ5LV|x_|c}ﲲ57kE#OB~:v?ZL'Z!_EN,}zxwAUebl@ޙt's|x?="ޥ~uY@gWim o^>|L0Ys\K @?wNz'帬1ή <% UygWnt}u^tBY6qwv}L-D_gWϱE=ԫN79C_uvU3K\F_UZp|E+@1떲6=|zqIm u.mP< fס1!cf lÛFƎBşAqU{0m2I@gWO3r{]# ɝ8yhoW>?"`<;o[$ҍ]=.j8I$a<F>lN1  cv\|n;;rnsxkkzbwZn Wv۵" nd&\|1iwN;nx2(W\ *nɯ%1 z\11+?!T\4W᪋?kSsQgWϢrVe<ϾS J`4˧e$I(phL:_ā/%ŝ.2pz5^fPwB"G*U7}#hhhD*D*B}oj-yF]vdv}|˅Mή="(ؾ}+OY3砾?6G mhs?FE#!}f[Vu|\[Ν A4CC}#M3f8գ܊L&`0aKnvu3n.yrܿk$vLl.YJQ].`xdl޺hmiC8A$A~ӾI0¡0،fbUn #ÈFWWs}f=g. ߋ9(n@@PMmHRhofD#a}AUU)[A d*adYb7 00 wc``71PJInt_^;e'ԕdkw?4RZ0c>Ff3CxR (:P_߀t:~ ARI6ս7ˊz&^ =HSHS11_F74 `ll10C{#/pk/~MA1:6H}L&t:;ctl|`%o{h ̜T* p E]="u=͞ՙ_Rd*L63az \:J@(bc5qUF> v#( |go y]oO@UU5dm)Ic`?2 ; UڀD@$剟@q[0QUPS)ՅPsȊ0}yAP_[~B> }ﭟrݡ-}@KnP{2&)̠v D֘($>G^AȲ&LnS9RS5pkm4?VX.Q. S A0DuɆ2QFG" ؓ P]U-cFNt̀p10!w+w?i?h~VLɃ)K+aQ[aLIԤ'pk\G<;X&jwWuWS LOLWz߁ܘJHŊF?5(t0;:O}IHA(8lg׊'} kpr&|XD|'r;D vތ2'AgFJ-, @!~sOE5q݁*!br ;|#qH) $ܪN /? <(d۳~tx2_@+W/pMA0 Jpd@7X_eLaJ09@;" _tϿCR_ S3PяS/ m$9U=#jMzsfL8sE0w__.UNKuA~CXqW5\ 't:5:+ayPTfКm@xz4 Lu X=V+SP{wq 3x``0k J}GFFnxǏ~NDbzw2̀ғzOe_B e 2;C+g T2t'x ?%.8w fMGd2HRع6nO{~)J'`EJZaqXN;Tc+e~6i䈚m@s:P!.ו) HSui<\9e>߸80c 2M}ӧOA-F?wk z̥ 6W}DEԙ!Lf@yNr&hE3Vv@p29kC>uKJ:x1Fp^@{{;8c8 \_bQ.15A7JsP}i  k1s[7݈vL}}=s,Dzf!URʯrQmx&J9m@c tt/>_Rryo8 әjDwTʇgT_'bJX;؍9=cb>0||@@x؂if|g?KjFWN000D" uuv<8CL'5L 0'-@@ėcR˯/Rc\Ŀu~mIva{#;39Ǻ7D;s:,@6ŚW੧ƽ܇wyM&=C% S@"*(`T3:J:kX-\$gx]6ر߹USOʤ+/02:]-ZK*)w|&k&d*כ׉x |l\g;8׽#ي95kOA`>[2lAⷫGyhL'v<JsD3:43$MiB;־q'z[?=,9lIi_xEnQ8A/Vn R*jW"~&b 0 pBVwjzNRc@|_NTN@^yeܹLNDx_[u$$u,z0/$3ͫσ?:Lq0w\ ǚ5kDM4Bn=PUtGC OASt 7_=( 9Dtj!gMՙhm*kցDz؉,:GqٵdBQk3B`MNs^&N:$~5*OpbN`&O:Qn\ }bbSoIJv\5By'0Wn&2 (/*(X7p/Ocp{&2bOoGho, >()_y+FkU`7pN L(l8 0޹; ,kjuHy3ŇkT `=q`,ᙈEowǎ翌5k^[?OxuUu57D&lW(; k8D"`Mu2TϜMFŠL'nNonw){_{?Tjcq<'qX,dX@uV$|[wK#9uk.RiEYPOEb2&O|_q*t_u q߽ĺuoctt@ZOBf3ُ_x?pi^}^;W ,9lTGسg]zt ##N ҟ3~tWՕq^]]G<zPa\r%Ƣuwk--͘;o͛aƍظqֿ^_gŝIK*ſ'.--H$x衇p-+&%D~Kϝd_eqQ<~CBuLksPPW=%1E$Ɨ%|\sعc2]vc׮x犫Xh!ο<{}\6șIP|&7øC;L&mI6d O_42=ss'ӃVp'?o\q{SVqC^cJ+zel7Bd"Ny]n-6We8>S@f(_'>y{ydʱ`0s6?| pblF:u? ~x?zGh˛spF4yϪ~$r5ipFw4Q\cB ogc0a<9pNО=տ { O # h hjjDsK3t00 '߹0YTUW--D6C Cx(COOJ֮{MM͈FҳH8H8u}T(~-$gUT*^~lBغm z])3il޲ (0}Vu^WiJsZZNyF֡h@݅d2;#Icύ6$S)(3:Ddd## 0{+(`YqciQ]e-IAG4l޲lO9x!hjl)34hÇx<1 wCGtlݶX$<47}' ߇cQex,CKs՛rA464) {!>*tiοNbhjh0 D\-7aioF};·#A!h@0u5Q@\$4Q_R$zzG ti{͞%*`.v(q8 ""H ?/5Sk6(`0AڧRI{M(T  cc^6wnd藁V]M;z^PنsFl/Ţ1r_8F(B<@?GѠ ,p-n3}VM&J} *R&;_=i}1.0\| \׻l&~` wu}`/vU0!G{lm~'@ cY|x~귽L%aήkr!r/}t|gwvM)0vzgWO ,0t^w)4rl<=u|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>ʉpNT*FeXIfII*nt|(1 2,,GIMP 2.10.122021:10:19 00:26:16 4)JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((A9q}OA[if( ݀#k 5*kDB;/E![?^ꕻ~D{z}vףo|_z>[ޟs/E![?^Vho|_z?ףꕻ~A9+[?^E!nߐ{z}v׬*T ӑ֩䊍XI2QX^4kQr1: ^42S"69ϡv~]ǧYqE8uv]2t–YhMN<~?*ڐȇ BuH?Z_Y$4#z[/ ǥW M8M@s6o? z[z?M2AK֤#WLL2=y!:Tu 6D8\8|O½4&p?Ja_hb4feܐ.2Jzcsp2p=45aP̢M9 ,5흤xP4C$(D˖-VY۬0u=>1Ov_pRxFt]Gch}#~\EeB)E4F x?_?*{YvH=9?rq1;#SCW'oGj~FSxhN>3?_?*W'oGg٪5O?O; <x?_?*|cj罒o)c ; <3 o$,2RqY U25G$Mks]QQwQR@KwQOHm88PV"vh1k,I%zx׍sE{&~7SA݀#9?ciRR❊v( %"g0H ^y_~$֖hR1I7W_ 66n46͞@FOIbu '[Xm,8;G]?:GN2bT0dr"^~?3z߅Q?5l>YEj|ls/kv?2Ρo\!X X_Dnj_Qj&/-$YM@Y!)pg~O~ 񆲥+QK}Mzb!ߍDEOGoƘޙ~7SAgw׍G=OWn˧ev/˧ev] 4 ?-lzO?=sc&LJm*Nyg"jpfo -(~L'CU Exñ'2j~pXs#kX,9FZW6No5?;ko_@?5?;ko[Ή:6k?|_Dnj_Q0?? GI74(Ic74ӬP)P)Pp)f<@Ut$vt|5>?1Ƶ/Gp8_R}`y䍵wy~l.lF^ݘvǵq>8sc=NbN6>?=/㷿>ݗQ[^ /["D?MX7@~7SAgw׍G=OWn˧ev/˧ev] 4 ?-lzO?=sc[?` _C6+"E?*īxIQҐ֔S㑲 4!*1Jpϥ0[`{'ڼ;o> eukd zg'G]?-sx]?-s/]ᠯDY1ocםע|,띛BȻp_KG".GzvnjaQ®Bp0)gH㑣%N7!ROm<%?ƹK1'撕u O{o/5E?'G$_kOm<%?ƏI焿rQp:KBMFĬ?V}aق~oL|r*w&^P3/kv?2?5?;ko[Ή*6k?|_H4"x!V]y^ts-3OB=kE|OlGTnʵr8k:I?&SCk&SChyOV.U 5G$rQp:kLq ]^kq坱XdW~Z.2~7SAZD:zAد{tEtx?t?z6Մj& H9 $n"pTZ6> vet ݻ&Y'$@+\ƮjM^(Ttl6+ǿ)3G%6jWIfx%6hxU=6(͇Jm M>WCS{l?QO?4}V򇶧h-#rr1E-FIT<^1 McKy4}Z򇶇s&VrJ[™#;G@3Ik4E3Wg-3])Ox[FI8ܶ8Ma-O ZSVv"U-\|!;WM8/P0_3ħ}+Y%Y\;۟Ÿ^j*l9)tއѷ mpMxqUi?K} _k춟У춟Я=7Z>-/(-/+(_ּ~i?K} >i?K} ?~#_B[ku`.P.+*(_ּ5Z%suHR`]ϠץxN}.\^y ;gҪK2NX,޷FfS*$oHKh3qknndy#{p0E^eiJHH5Gx=sPS=Ĺ;BL(yIrų~80.}IZu)kDh[_JLEsN+='JcӴ(98.{Mzu $TFg/\~Ch7_׵>,lUPM'5쎏C? .?!5?o>>/\~Ch7_״i_Ώ7kAhw<["G!"E?ƽMtaAhw<"Ct{aq}V}}'4[X#S#Њ^$ `%g߁Ȯ>+ھV1G]}j}#ɐx;fu/+{1yS6ynuk\LNMifw.w3lONWdm䁜[ںrܵ0*J7Z_j3*)f!T NSFCc s?BiJ;v]9*(%m(]W;]WFc_lt/4C7?^ _z*0gٚOQ D|WΑ@_Ě&꺝`J70^RK 5JJw$ =y ZAIq'ك#yN1ڋ/G8ɵ u:FмVoxKS=2:r6%x]K 3>NX/G6 ;u4b|WxbIMJʊX xAܒO}&iK8YKOs@8PFMG4/:7 S4һ.ӌsw@Rß.tѴdSHH@M""E #xYZE]Ӈ@bK!ט|P??W!ט|P??Wf⪬ڕ>e`PrAj w@W]K.T(SWlۿL+_?1ұ(ʕ%QL#h* ( -/-/0_Cgc_z*] F 7{mVه<.ԇ+GSkio6sNy{v+kh%6umf0ҩCÿ(ּ(?iݑnwyR^h<-[»cQP=xH[5ǜ,{12}=k~x?z?}"EJE0@DE4aȫ`_3W̿7חP??WO!?u?kOOف)#<]5BWg *^(:B((/ fv/ f'ƿ_0i+ާ*] F 7{U'WB&x]5+OUSFq糤o]zɰǐ<xs=+kB4iRm beuldZaT IUWS-/>r>P7Ǐ EԦs >+ofLk;SK oݓqt^kVJM~b(8Q0L#4{ 麔e;W>P?<>]-jle]@׭2,` +"[\#nY)phhφiWhc)7bM}麧Z]yMqgIE*"0+矆^{k+:K{}6$ힹ`2s@ȩMFi Fj?~֨Tc8 9ۏ ]/#Zת6P {^_CFTm]b>u\!\evz??2E,/B(#((+?jk?j] k #_qbRp3^_~6Xɭ&X]mFl_`0Qn_ Ԥ,cɬu—CH'+t—KJ'+i_?/=OWE?~G(?~G+ji?'=OWEҿ O'z|:.cXo?_ vn_ CZ+&rf](QpE}}>(֟ͫ45Fu\!\evz??2E,/B(#((+.w2@O쮚;*yhϒ"yvw-g{otE܃_Ciڅc s>WͶQ^[жT>kz}nNTAק*U}ilb?ْ}?ZOOAC~ch??&S7;3?%~fKk>?Pߘ>Só=2_GdOּPߘ?>?;;3?%~fKk>?Pߘ>Só=2_GdOּPߘ?>?;;3?%~fKk>?Pߘ>Só=2_GdOּPߘ?>?;;3?%~fKk>?Pߘ>Só=2_JtAzOOAC~ch??&T0txOqnq@u?5WQN`e#P332b@$]Xl+1[Y Gs#*z?Ҹu]/&0B翩_f&RcafQEsQ@Q@Q@,,d8ܧZ_Q$Ib+XWh9Rh)?֣sȿjhn>Ÿc/ZJ")?֣sȿjhuA):/J"/Z(n{ }sȿj?)?֮v>[Ÿc/ZJ")?֣sȿjhuA):/J"/Z(n{ }sȿj?)?֮v>[Ÿc/ZkUd_8QxV*4t(M(((>%tEXtdate:create2021-10-25T11:46:23+02:00,%tEXtdate:modify2021-10-25T11:46:23+02:00q"DtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:10:19 00:26:16<$=tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/strip.license000066400000000000000000000001341416353147400234100ustar00rootroot00000000000000[license] author= url=https://openclipart.org/detail/20354/film-strip license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/strip.png000066400000000000000000000132321416353147400225550ustar00rootroot00000000000000PNG  IHDR,JKbKGD̿ pHYsי {tIME#/A&:+IDATxy\U?ի^*ӝuY DLGS0x<*5=xgQ#Ё0Q2% $HY;kg}揪~{iyI>uz߷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.1.0/src/pictures/screencast/supported-formats.license000066400000000000000000000001361416353147400257470ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/supported-formats.png000066400000000000000000000246211416353147400251160ustar00rootroot00000000000000PNG  IHDR\rf|iCCPicc(}=H@_S"A8dNDE EjVL.4$).kŪ "%/)=B4m tL%b&"^с zя,cV_.Ƴ9՜ŀH< &^'ڴ VUsQ.Hu71ө9XhaYԈ'SXY+UX᜾uCH` BA(FV )ڏ]D.\`Gd^R880U>v |\?I6г \\75e ٔ])HS3,w tz5q pp({ݝ{rvW- cHRMz&u0`:pQ<bKGD pHYs B(xtIMEqszTXtRaw profile type icc8SY! 9)@l޼H/)cl+L  ZӀel(ƈ 9. /?oIgֽj0h쇖~x), cHO.O6^gvccxz ߄D73bU<3T =m,\gmjﷴo%"/'!qkѨ\hC1dlk3! 3AzYlYi+?I1>;τT>2E.}2ǸV 㛏fͽH'6isRF M)MNj#Px kK)0wna/DBL{􇩗$IDATxk$uV?w3R"MR)ˇE[-Ŷ䈉 F"l! F\N@ YV@HdKR$rw;;3;Ϟ~T|wwUuW[LUw[{              lϋ=Ŵa1f+f_KF "&RyS?xj˷}nNLπ9 }4A DEVb~Ao8|e_Ok=~4Aeag^qQ-?JՑ <%%Wx?9"îAqx8sk[^9{&I131BuO$<=U\X4gwq#WT H% Б l.TNE+ \,=Z/_ՓD.bo0[[?Cx胷`&!/FsϾ/tQ'nzR9wDGLIg~ b.v5 HeN#Jѧyg#` b| lib7/_>zAK3i_~++xGgN.dɭ˯^]J[a߿(؝-Js0h ˲V& aĈE~˟XMO2n^ԣ7wO~]8s }]J!Vc"B6m݆y{ .F."x<Ç[nA$"ZLj"/'W_AѴ5T휥3 z #83_ćpM/^_~r`_bxM綶ò,(z03VWWH$pСaW@ǎ|,L7iz|OӲ3,QY 0 +`ss[[+++(JD"-a0MkkkoXB8HM$q zV/C?,e1J:.)X˲3W!RM4́0@BHģXVTzk“@2 e8_'vyBp!Bܿk=Y L)a|3@-D0`, ¨cYb ::;3amsN}r]kƷV@AcP•[@6ey1iql X%Rk̅9d2㓓x,0ln^}--@6sGޏ{gm߳o>{クtLӓ/2 ;f ( =|Cob1߿KKKî"!0w/]ۘV-OW3j{R GѣGaY݁2Z^Q7.w O}{ ڂ "$T 7b:įؿ8aJ+&o?~x<|F@ L ɷNҕ<qhӚ J8*:}Ͻx ?>s qބUM&jD '_?_.T38Rb e&~*,Bv"\nW[v=f XԀY*ᵳWp6ĩM"J}Y" E0" UepWhtBD2Q%# P CA5 2 93#KX&RemD: #vCF d а4, =îAiRHf)ӋHeL[d/ޱfFzhIm'Ә?p+֮]ڵrR H\YZg0,D$Gvz{c`B@2e'S{ R(Wn#^!C!F*$,T$*KG"(2SG* TDa|-M<3ZjiM*oJ xQ PJՂHm\ |A9_ޡyjCAzAZsme?A4ڦ@UD*@z39Į P4` X[l9.Bgh'038T='q m>q6wvP(aCѡ<T@4G,D$~iM4@SRJTk @D(vqBfɔ @d+d: auij4O=v67 Tz 3cY <"J2{$K V+:0 "nm /76@ʝCg_W`@D(ܸR(#XG4G2'h;fD/Fa7&Q,L5Hzr+ݛydBnsx\v)2*1J`XB>3u:~>{a'Z"+8w+x/B!c awgb _Qpla|DTBPlҞ$|w[Zqf6{yƉ|ho<&xd@Jsoj_㜿X&̒ٴQ-">@~Zl;Q*sO^^T5;ɐ&m VidB fI/Zcݱġ)0ʲ^K6A*[?e}XR5tg/QyoKx1;Zaf fuuPJ̐`S>dS $SgF>_KB3N'Gx>g\_#b\n^ʹgU?1#J,sݻd N~tuȧ _,as{HD\ɛʣXtam\ɑ`hK|U7@FM[ 0Ff]s# (M.ڏv9 BZm͑ C*6DPpXKzG*@un }RPq9 էImݺ0ʎ@ Z4V Mh?Ƀ Mn>zк @@Zq{zLjPxnЖ~̯D@9I%@GzEV0oՍIAZwϺ&{طw1JFOc]3Ђh0*l"~`@{[h*`#ppЁen-]8U$b:-6UokS>|Dmu!m؟5%^nLáeH4mj{ݧ%7&|FUĶ6j?4J(~=59hu&ǽOp7X  u*=q4PkPbAKW <&{grCNM{v*>*>g)[狲IUDcTNF > |îN|뫫P*bD hF4h4H4Zn7.XhjHn -6@GDvay"ՙL,C&F&A:3 t)v N:q$7d2!PND0R k+kfaDBBZc@߾J>!"(C2M\ Q8jB˾lGYQ 8ZՈbXط{ew.uRN[kZY,t" Qi!"ܸ~SH.7<9EGl` p)W_HMĆ].X7 S8mfvm{Yue@f^WN0=QX05Ig=GݏOgppBA5ؔ67B'@:mBis1ᾟ_{ '4Myp׀z+=5K`増Bgf3}v,oz5-8ׁXަ~ĵm2.g"!5شB3 pOP=zwĬkG;C*p:0`Ō{gqhi-i)KÐeb[qɜzcZmq )9' v2޼.JrpӴ؋'-^( AA_ h`d! 43'4%7RV'h nM4*8 @PuA@WsH#SR<DfL0)= 4'g70*⯋pd{qc@=h@)ZdtTT:n@c>Ur)+pua[KcW-K4Yo8^?F!/w|U0<al[?GFj> [{A$jX5q\.hsG4s0Nh<T&,ʍ4O-;%g8h`Z 6O@T($Qg MTz1j_ m@m|&Oe' fo01'?7'`?i9 |륋Ww,a:/k#"Kx ^ Z/=|TxRjq 9r!;=5TAEw>{89{! D2Ďb1_1&<`/?Anws$ui"iZmwc(f&05dC3òxO7@zMu 0FuCeYW0 lmS,8L;\D`oF +ñ{u tQ\H/A_Gт@.SPKw5u6c\UۖۺwY( ?enHh0oɏe 'G&iQmιA]x cCm.gt v L0P$6*x/:5ECw#\g)0!1 ;7F4B ?czڍpƜNHu.وM<5Ua2` eCUs.;Ae klv1Wj?Q1$Դj;@R2q"  'cFz `sXsE,No $W`;g&F*]]ݷZbRAH#`PuQ7@\Kc0Sֽ^إJvZpzt!j;}hvnvjLj:ii8 )tM|Ҕy=ZV|w?ih:m K=/+]bBhqp`;}6EX gdJ#ak;'`Kc2 ( `UMrnFưdG-hgjn4&xi 4}/D Kh7(RM79]2 ,hZغ0΋.͒H?݁]N- /^2@*\'zä `X#PPTN5+;F*z{Bap'?!'P0iȮ#C=幸yiXqP_0ـ4T:20~̵5@;>TOKy@ G{97&?n6# 0ԅ ¸6a|\D %*<\lHе`wv@Bc" h>Qְ CI>Jau}/Ydnd|mWmR> ddUK7sS웟}R6(ll S05OđL&+NB!h%jyEb,åWTfb ϟc Y1 3ce-?}o\XL̘_""/Awc_ÞImԬ*94tB0l֪T GVy)$#λއ+`۴zZLa´w~V1AP^-4{dކHD]8rd?90-hjA`S,s# P #ٷزT%cGJ D.[V"Xr\hJ ζe{^3 < \|kXAPDhQbH² P.Wabܓ BT[,zkJ0AzcPaߦxL:AWٵ΁" EI CڦZ= {yAQ @PE+^֛֠E!HLmNgHz\FO]%aO@A Iohel "Am4Oye@_@eBzABY|iʒ6e @vv' B/4 z۹ڏ(gl\UD (#CU Li3^qdN U@dNQ=3X̬{$Ĉ[eYmoL dQlJ9A"Ja:, {z(eǪLD \\^AXl{R= Kfy'1=0!b"..`{{spW\DCx+XTۛcž-I (RL]a< |' 99b"ky{H B'~vsy&Rɖ ^˳ ZT/$ξldyK^_v("lquK&5xst.wq %?7D"`y=_=nYaILg^&DhӅBn{=4qJ gQ;o޹p }i\]a،ۊ`ed˞3 yފq>T2RP$! b,llp{8陳p1='O]={n; ބiaXVBbbHѰ!BE@TB>C ģQ23}=^/|/>D`},/vu浓OߞB.gG[=0[>ysFV/r*C?& r'^0||o{1mO`</ ae_^|򊖫.EG|Y`BDE7\'Mx=_#+XŘ(f n!`<5             0,?2oP%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/timer.license000066400000000000000000000001721416353147400233710ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=https://commons.wikimedia.org/wiki/File:Appointment.svg license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/timer.png000066400000000000000000000747241416353147400225510ustar00rootroot00000000000000PNG  IHDR\rf}iCCPicc(}=H@_S";8d.Z q*BZu0 4$).kŪ "%/)=B4m tLĢb**^?z1qYƜ$r|׻j}ѭf,DYf6mp'tAG+qι,̐L\+MF bO> jٽqۭqr-훬*z>BIȸѨƐg$W|' CгFY'>`'dC&`ה> 2C刔va2V& Lvm:Ug茎 |d\z0ǼVMfͽ͑hOmbRf ۋh' q`)\"q߮"H*& @oitIDATxwř7;;jW9 h0IN H8a$|>{u |w6dmBB(8y?zBݕfTOeQFeQFeQFeQFeQFeQFeQFeQFeQFeQFeQFeQ2(^ܷ3-H+ 0 pC~"/" }`  }hxb7&>˰ep]}\ x}K <,0d` 1a~A8`WG'{02ϻ$ \ ~x /0mW|½k6J-&O6)ey;&3e(3IO+z;s4="yӖNOvgެ(3 5f}n cQ F"pyBCs௬c RX\ z#H81ŧLD#Q ahpcAh<BQ(tcT6o. %A،k/zT@)CmCىƖ&|P2 ^"MPfߡ`,&09iiAtRL!H`x`=e1F+`>$= e`n]ԟ}7d30{c ɄU%Z[0},At>ϲDnfbߵ !k?y@P`NFFd{E6mH? eP[O @2 %%Է4ctY0UJHRRu'(M; Jl"eCUHބQS ҄܌Bі c t>3g1:80X4.~t#{'_ (3pȗ5S_&zz̚?.$IzܓLQebL%ēIHRXPphHhR-"S*ɶQea Nnn n>n BeB4sP 4B'%dcΜ'1:4, ^!ݴW'8?Qfp-[ԗ$ @%fΛ%˖.7ğ*MB2D"@,F d; se|2uAyˑJ7TWWBt8p:u1wJ%:zgOBhl`f@NxϦRB741ʾ`MO:+.]&Hd8ЌSB xH}!gV7wu;jfmB+U#占Eum ૨9FZ&6B!ݿC}7ʞ"Gn<(3X/>.n%W\A_D"H(Sga@ $'!2igp;w``A$**֌ NKJ"c>qp,#-1v9c;q8EFهa.b_8dR>gdFx<: JDAzVcTmlPЀf8]Nvq*RH# ۏظYFCBHЖBhn y!(ťW_m 1_1M% >݃=DX8ov;j`Ws]WJ&QY]ip\)UiA?Lm+qh M֒bfjPf){D `Ez2TTAkk3(9h>9(gǏ@qf ȥj (m> IIף S#]iF G N'?㍇ ~Y. ksaҏo:Z IT1xc#ط(b6E1U`)@_fPta13f PUAnF @p(^Gd+Źf|g%I8Ѩc N R,Y0|fI$Qѓ &`#9/w&f ҝciD)0mz'Dѡh)c#8n$bl޺q y7-wx8_/ŕW]*[(Q (ŋOWh%)op2荅HCBpi8tXVr/LnC 7wN>PS_|\n4k|)& %ػp&*U<Tm N HpFGABIb IB"NS00P*>9ҀSs,ぎh}y BجG+gaoE>-\ \ǙW~rCfٯ cl, Igg٧<\vs-Ҩi~E+H&ym?q|[&T nUoYR'oQCr5%m^qL RxB _L^[9FR3#%$!{d`sAK3$ 2<pև3 δ3po~O& {@$Pl0b@iMu"q(jCi:P c '$;e ɤݻ`t$dS8.Z G]~yva]P `]u|Fu,[+Db*@$潞aw\. ٳ #r3rIV!3gFUclv%1uJ=vM-:1Zv|:2#AOOJ"Ԍ`8t JLCaiLTEjN#n\oMW `ݝ`{w1uwr_=j\I@ګCajjjpoὴ `066b ׇ$)?h~H$%fjfQĬƏLc+!lں 711wA2 ohREvG(Udg}L>{<溚:̟ZvL&qĩLJ5H9_nG)Aq‘0Z[ l @(֍!K`0`x`ʪVg>"md8~Oע_ܵţ> 'aTT1cf\-e[oe]jo])>g5;vHQQ>zH[{LVαD~?f̘r*՟Ǎ7_x,_ c8r ?ǃ˗޹O4Xf t5$\zU3{,E3KIAz g.GXWR3; k#y ˇtޢ? B zfP 4V455d_w=.GapavoEf/^d('S].ӖSJx ,(~)~0YW?H>2ϳ3߈+W^fT3 I*|K#L>k۞|>/:;t NV} :7kϗ ȩ@s15맬0%m:t<c9-K^J.g|=9OWc xoGVx 7tvcYIba@Fch3v;qd_K`vMIkw}qW$Xf\O65wܜ]ѧ333?ߨ'Q鮗L&|2\#|3[OST A@:YYTR@6n7^@n5ؿk?028:7PSH8X8;}^עS=8UBۋ[ukZO^}u$J5>+1;K$n̙3Beb|T Bt}&Lj]˅8(iֈ;p̴{@%8sx|^ӿzߝZdI15_זKI[.k$L;z_=10Fr3<9N=BuuNo͎iE5U5L? ; 4771PWV$@p7 %yK H{~B2 Xf\-O&Q[[-(f"8x脼  N}zzv-4oT^HԛUa)"9TgB{qnθ K#{Qܮ.Pκ T]%K*! EQ%cIBя{ÙὪB@?~81̜9]& ,vZ][8c ^_{,3:ڧ&5a.Cgt:X|6v|h}co_])³%L@I=j겋e1TAxG1L/)Xb.%JcŪf\cM Mhin3{?vxd&9n e *P~P=gNCck+j B>xZ@L:XfORzŗ6&I2U=S @2#~I|y.ȐJ>chB̞9pv,Z۱t?;ER1 v\.'jt\.'>Bd#Za ѢlT`@\J&q;oFS=kӱ#+x;++"̼$Wb֬YƮbbڭqb>1TWUXٽhRյX ME'J/Q7Rb^8i,H `d5 : !Uu=s%]޲k)j\f}`>zݕ_1 "գ*A P̹vR(*k?PU?pc@*Q*c\{@S[;<H',1&EϴB-I ۟۟]S)3?_3ưhB̛7W͕vJz!#߉tM` t Ϯ{ ǎtm2h8 W TPSy6ŗK8^IA?.Y3c b ǿ!'5k&,?!ğ fJ_K;QYs8J&0ot,Z$$Hr6q=6gD/|8pn͆D%WD*_vn`gaׯGWv于;%N#K}*T*|~ 8y w0mvJ2`90 }G[&Iz9#8~lqJ}(C}k3UW]9!PW f۳Vs2GkN\N1;rHg$b^W߾쾻/+0 `7M" DGRλ3 _~"$n.rYl䟕~NDx ǭۋ1u}'I O-(#ON{>v K*xt7‘zQ!ȅU87|-q>XğBfbгk/!P f5!UU~\%(*>s&w\kڰr Ą1#Ph +I5~D"GO# ٰNڸ+Bm)DJeXkn,UTxUe,_(B^Deq Y ҄%pL,m9tXQIsNR^J&P뤃̘1TKI$MvkNAۭDy'q 15j@ /X{׆,9wd1Kt7ű *?T%gPeR\VCd/ NE 3Zlvc9p:[ͬ99S[oNc^EV01YWJ2}sD)c욷ȉ5ɓg'T`:&PUЉg%aƌYسgOfd )ϳ&C$JNc]EL4A#כ S%d P-VTYq:uVeGgEԈnK.)n3gV\ǖ7C0Db&RrUg{pt~WiNp}XZ]Ty0:FL@)FFzY?+t/ʺul{2|'5W zNgvLZm/> K᪔v/ܥ1woШ-+ڤ?}nҨ<-`/D;фQ_AyW_} pvVJ(DQP; RU҇c0Fm;p֖J/y+X}8 Ljp`E;7^O-U jk1fWt]1.KHIN/*>"0RR gf 2sPvQFGg{z8 P9N0bUUٟ1K/T+-x/ǬYp),[L%^c<fW8A?Ŏכ @ߪKC\cQ ـ$U%R4@>+_r8trԺ ] .VWW "PK[WWg3w/}.~#n((m7t7KZ o{=c~^{@S(lg7Aw!Qļ`ƞDgmfZg T7-W$Ĕ۶m>u֮keW1 WLm@bEm}J#v͆vߋ Q1kES`^M2x{]ز 8/g?aryD,U@X $Ix\UΦ;q w[O_!v l/]ѥ+=^('zƲCU@Qy釓L&q-7r-j044l};1Q\u""9KF,lnfpI7a#le֬oЬ-nϗ tH఼R2|E ¢E G-Hse-c!wBZj+ABp~N ,y2|W`Bh!B>dz&]Y';~Vx}K ̟mۖ G`ecLs2!_hB%M whlo \_*L{{|A[&:1C{ߠ"+ʴ=mnGGGAn?;@+|0߃n{-\& J%&Hw^_*3;]n"<`1k6,w-ӦR`0:x J3@e%te',.Iyd#~RtLkm 00PʠψL41ưo^\wݵu.\_W X{O$r G[0}N̷aTfԅ[[#G[F3ew3r@%Q1ٳgr:3z}ի;WLZ ]ceX)&bqLJxMe|9)Ed08_]*g.| 'p80mmЂg:xG:$?V`GU B_4ѨQ3KN9m{Ё"Q40E[[3u*ϱ#'3LeS29V3ftr7ZȎU>ͦwAǗ;Xr).TE2)[CqM 3q} :I}.Pn,n{g"=T.1-+;B I:;O)_>"Xjik^˿%]A;U;]HH&J)V^o&V|>اe(YOYePcT.{1'n3loժKXx~UJJ GL&TqNDl ߠgOו9.oK[A(>.X[^UWIՃZ] ˥^9W*Wb~23<{/>CŒ$0N&%SԧV2xF4mj 0ԧW p{IC;;,澊b>2@77/>ҏ0P%@+1Q/ՠJ)/?fw="洒&P'>"Q8.;MsT@hhC4+7vu rО.0T[DA}C{[ &G9]ꬫvÅ$`ROgX?x]]][CS%h*֯OH$TqCc]&*0F4ҕ76lJ_`;Կ)NՁP%uGE~] t) P @mA@ߧC;f~EB-SJ2T'k(hooGj|ho_Wp "ѫV%uLqwDK BND>]jICsOޚX~BktqM73vkᩲ1ȑ#x/رcp8p\" L@i`1.IrlXAH0)Px|>4+,#ãj@/$;Ύ`Yoo}pl/c8~{|BSS 㦛nƍ7ބK̙~<𤖡WH\ˎv\SNvRLKܯsq1`@ S+x|lweC~5N@ 0)hn>3D֥{/`x͏ߞA=;W?xÆwwŷw=x꧕ዹ]DN: n|>D1E7R@w4bR9-3w:x=JcU܌14bH2;P(3'W}31Kc@O=Ν $bxxյǏ75v_X!ک& HR2B"2^-hp^J͆:Apܹ#S{hA|>Tog@nkk+Ξ=O~8v옕ؿ?efj巕R_'-LnI]CyAݗZ ~'rl*nR m 4=L :]qQp@ EGOo0+*xWUUa||]]Ks\chuãn2}4"IdA(A7V$I0Saܢ"X4+v=uA >j&4h!N $dȾL IZQI(T<2t(8{}Dt@sS U xLY] xo|>`痲FG?BWWC0^x| MX3[֒܏ӎ@xp"H&``.[nJmW:[obOQ᭨PvPgu,3֠}e#Sĝ2a,21 #W1<_5wIGq ,+ q;C"'?whllՏR_-oy eN]O; ]@_4k+A)őFT5IñxQ e>2{\oӷ uen_ײ`Y @,%nR2xҁ@d/C@ !Þ}CyX,;^D04nخ2屉R%_~z3go}̞(kC -\H)1T"c݈Ţy5c gOS':)?u;ш8nka{$D1lTn,6t݀j@`0G.ް `;TyۊW)O>TRD(1*ۇӧOXJc_7g-B16IexơUʄ\~=QA,!Dvid" P,]pHwY"4DQĮ7vf+ >Oqˏ?Q{ AEEҥth=!Μ*hYxz݆@V3so_RH \K Y(1]਷Zk]YBNza` _j$p:bR @m@ pu-fƽBD!B`X U O)CuUuc!:y Z`f; &u11T%s0mʔRt5PJTϊ `"1n|xC;vMENѴEi?ZLm(? * >0JjKJj1dR-y0~at3ǝgCt*B}{8XNp`_+Vx?1@5 aQ^a2!!+ȪDֵX 3H/ cX`: ̟{3̚O }M\,7"??= Z IR̚>t}B"OI;O#u0b^ aA`JRR=lD_Wq JC \)@B8,^eE!`E*bj|-?z-BsqEOә{6KSAy[$)6.t2{ep#T"ww(g!XD! @Bd tވDT WPyq^/V.[ ND%Tjjť*q_.L@ePY_bŊu]@Vn67IH:4)Yܘ3s>>%(*948x+wjB@P_ĐL$@iFZ!Ģĉi@ޠ*Acɢ.5ttGSC3Vv]s7nVPKs(Xz|QENB |_(%%~; mpѼ%mCtr#PYfb9ݓSij\|<^}x,f EP׭`!^@H'IEd<{/$2n$l?_J)ft΂@U0bY~;^k*$ _җ؈}CC=?w}WovJeB  M YQW^6<Ϫʩ5PpgLNE,jB$~E!OdU,( T'.ʋA4cLן T^7H[X<ǧ?i|D$1X|9p~_0#?֌ڶxN3H)r@Hz#:@ SNZ]uPIIΠyG<+B{1ȧ\z%b{1466?)p82/Dr"^|G{{;:%| zFFyfu9?_{Ճ{O99$ @ s Y\LS#U@DAYki,˴B"/YTA$OI׮]իdH;wE{Yr(HJubá8t),s>>H(h|ac[7ZfEen$!cZ"H1@B0҉E$|Ğ+AE"^m۶a۶m9(q?|<Šs׷g?Q%~p8_- @E#aE@,'ɰ'LģQdߟu*@90nr+PrM @'[ϜLNpX[LHj2ʀ6% * @b|0V4!hmmT,V.DLa1ƈwM-0:>r0*ß= υB%nT4E(!`+IxP0uYW`$ۭ,v/d#~~}Rim-ga׮8y$^|E! B|>+W\D"JiFv-dy!/+{3VqZ{7pȁ~C84:V'; Q`FP7A<M$EUU-̈DX.BhooW\RJ_D0Rwp\fR뚚t珏 ;rP n )C4i, S (3 M'HMVЏU)nm3X֯@Kk1]2>MO8A$E>?-h 028P! d"pD&pgjY0SE)9% 3 ̮mcF)`Lċ /X"vxE*1QҀ]B)~3t(5ޜ,0 pt/PF b~W R?,Cu ٽr1sgFTAv 8`mWn P۞L! a͏c9sfY*i W&Yxy{{p9riQ~6c=y][ =Y&PSW-Co( As1KubcOynH.|Vk'U|O/^*m$_%@2x?ز #` Ӗ10:4r08d dp(@׈go&B;,vou"2ӿsjMN42r{(&ymccPF6T B*?`0,^bk/%CM7RtttXg3cVRxf1|,=b+&_ܥ,~ ?UB^Ǣ4@Ee%f<~:;P8δl`<}U,Ur;jX?Qꂙߌ1xj\/5ںo|7P_O6şވ f<|WfJ&̙5RΞvzSA7kfݻwrY^:V,(%W+++)ORg*DD f"10 c_J *F@tg4W%xøᆛ,w܎VKUSp>1TU 8ſ3?n ,ܼu>!  dn?K-V T1 =gUu e:f_ ;D~@(3g<}[4 bk/c,$5'N5/4s@ϙEn⿡yF11JT˃*Cj k92[."W_}cٵkn+|L_!yxzN4~r(i;yqHdJO0 -mٛWVFFC!P_cff04d]kjY( aĥ,<ϵFgˣOFpK: At"H"@o(T˙Z~T 8ΝRDx DvKn|oo:v3},V:$I'$@w,u-Ga Y& 9qf~d ;rX11-P@)2Ӊu>hܾdfK9˛=/[{4VAGVTg];Pkh (e?׭r0& ;\nղaGCuGMC(*L&ugNñ'Sm(TkzOc&` شZp0ᡁ8z2B^Q044X{_PBDbc5nUU~_ַb@1uKI: :"}~wz,ҋܚ v 6[M2J*TS"8vH r454"N!sA-~ˌ_(3*V73VΙ,PURZ?K`˦r }cp\{i7m{k{ #[h4@"WZ #eúQ1v޹xYdpWc޼Y͌y) zRu??:_3L19?|66iJ">1*=NW?r2s݃]eÌv,-͞=Tݺ:lDIZj@fxk*ECCطT>?\H3fڈbp89 7 1]~(F3DdhjP nvW2SĞ2A a%_ S0W cŪԙ,i6U*+_[c[9@'pfxb a(fL,a;E#nkkե ?6;[QBr[mON?gOWCt9}<^}J0%ւDЭ !2^02x4'ahlmP9(`D<ދ WC+|o.tןbcL^OO" "ATWWgf)ֳX l]u(OUnC%˸>q*Up6^!\gv4EcBk8~z/ r؆{WֱK Jif*S6btbnT"~-ZZTkRW?I):/[QGGv{y@f~G؈M :X6ΞD10 g&P_}1[ǭd1j]ǿs)SJ1c^&@n<a;&GBa;ȬK1@jPSALXD{NCFGs' )ūk-(i; re9S=3+l_kQoQl޲q uIzzu`h阮~0>;Pܣ^<;s&1L*Pɐ,ХZ;wOo,N%Y-rv>, p %a2H))W{D xki&!I4զv,Y*u`U+MLmmzoNE})b UVQ>L&␒|/!X-_PlHaLTBߙAo UO3;gRDŖO49C!Y-K$-^JߞקN ~d !Wc9 3fpuɩc>^. AN=i0Ҁ~ S4E`r@Mx,fq+gJ2M[7vLGT9}%` /w{%F ˹7ԑ\)sl,I#d"PJYvΙ,`` \n4pZ ޣ/?K1{ /'0sn;`}/X|sߋE.AT> DJk?p,Y!$ bc"2b"X9.ۏg[~_) 셋nEI«3|Unڶ$?ZLD,qF}k+nwVfq^jI 毟lD#BTcc UbsuN?<y"ALAR"VJj!@l?pcb&?Bp3Y$I fYF)gN3zL`!+/E_Pw`0S1 |uUHi:u|I >E (Ü%KX8Dߙn<L&+It?D<;z> H/LaH?B~gTQU"vY疒!"\f:t{߿Ao>Uڦ x?A er))z)14(S!0BQ!OLoO+q7;J(_FMM./{vgk4 -ܾ۳5`B܀ZzXע˛<&@84:NEOEbbѨkBskf|={PR m&#1=q}GˆD1<2^8.x=޼cwNWa>z}0ߓ'>e8]k,񋢀]k!4>8cd+5&/kC(:PQY>5ST'ECc jT@!aJO1<} }3kɇLruu5yf_J&p5ssưWQo IQ4>bIC~09*@ʥ'!ү!p$J+O>D/g<ѭ[9H)C2I/_?TGB04ŴW8r>͌G1ǭ+1ߏN]QOirV4&~*%'J)^{/1WF"͘4 v}qkm Ɔܢ{yAD 1#sugFJffRK F/}O9Gاh(\״Rg"E[UUƂxUASFk-'o9g\~K D۴u;d 1lڲ#~NDA匯nBpxLV׬:@.[fR`xdV?$NRKr2&ڦ72<[/ gX'\p.'!gApdH遼1|"1 w(ƆsW'ojFM]@N1vn.a~Ň6Vtb%q062ohW&EWbRU4bknc!46\icC*=Q{a5,30SL#aeau&7N/ZJaQN|suxG՟Esge⧔oo_2Ûn\'SBHc֍7 _M#s.d[3O',-QtdA)EBtm!(룙{)q6\"|WトƶjCLM:7BJ`lĔbI-g X/+au&`+onTA(C !DFrܪ ?|߾_GIdBNX~[3BphnFǹ\Ov'b? Ʈ}G] wK$B166Bچ9^6ZD?.δ @6 #Rfđni+p:5<><-{8ьDo0iK/՗SǎQ06m/f}"1Ҿ. c1$qD 6 ;:Z"z3ZX  VJ%(&ڨPVkeTԠc:ю㮛?&q'2,S@o U- &nSS{_cע/KC4*kjtʒ@{jBk3; cJ pNy&U`hh([#z3u(5kw{QY 'uqưPm@QÛnij'S/>ѵ{詜əUZAƶ6;݅UQMtvcK2:rvq8!PbN+Pp8 &Tk)_[[NO(w_Oe!g>QU'H0W'j`n]^P|8/V]~܈ "u@C+ &!{wdU"mX5?ӞmcH&KyKQ8w㣖z|Yޮ: n3f2zN \naOp/ijsoև55pw}f!aÛY-W 8s{{Q( v*VD(䆦ځB !DX`Fz 햚QScL&%|s³; : 'sHq`@E+Q*#ǫ* ~>uK88ܷUHPYS󍓫 FE~JI _:ZؔS eXb 3ưk|_Ϋڊ] <<Џ7^~U}ভ.hP' uM ^A%;r{H&${pJdbttt܇.gQQ6MC)Џ) Z<~s~U5ȁi/:Ɠ;b"ݙV]jl"Pa} u$륾BAD6&zz^jcq|8sYpсUoן]aYElByq2w͆9P$ K.he@Ϡq[$I _'2K!dcc#̓BG}ss *+yH$X?u c OHUaģ6WC>%p^3w߷8sa+1i$qJq$1| Bk[SN x<HE$y8!3F8  ѧ) -)SJm8q3Xf}%w9ӌ'P_dB=z.tiL =H`llqVifa:P,;444t;ݧⳟp3e59;n溜H(~@1zAD\ >p׃܊5a*0¡ak8/c ]+.׽ .>؈!0 !Q`4~S:$ ~ONCo͗epڦygñ}{PI&޶Ggd\0 >|BBOh3DX2Mjԑ9窌_A}V.Tśbju!qD"܋v+*6p/Ap͛]V^}MٜaD"i? -O\P uk6;WsPjx{^y$}ո#k0sv*!|6t ̿91ixi{<{'zNFeHϸyw<<6e}(9X(f/\@m}NiC9&tnY8,[7v ::[A)!!Xwz 1~2ˋeW]A4^|)8nx Ve޿y#? \ G׋V\`$ [AhScEn-- +q+AD9F;O;|onCQ$b و> \s=^c KY_߅sN:4Ė=2 *IXysv@x<7߬Sٛ|a<)@k|HtzJ\|\OvډH8ނD0FGG%'˟DJw3q R_B_>(_Vs:^k=y|.Q. rc2 _̔M8w/Fg+3:>ͨL= a+rbDܪchBO8[љ 8qN"_uDw}\ o:ƺ~c  m>wՃTw,N:hAD<28g7;^E$8*dlcR o }Pf)ܳzO x|u$)É3a:c DǏIpe.`%M5?McsXj0gx|>h*raܽ1٭gBR/BZQx^ efW IIA@S4t̞c>!`"H N= ĜEqWfX81!OyZϛa:\YƱ P2K``ؼ_&A`]2#`셋Mdd Ⱦ=}$¤ a6N :& e| D?@aJ%$ TT9 -tw ۜ "~Pga9"󢦱g!X/H@J&!Q H1ƃEBÈr2Yaв(偷׏*~!teN1KA g31><oENդ"/3`X9͌2(\_X9O%$Qx|>Tգ*PJm9)IƷzD$Y9vAEģQt8㱢ۧ+FȆ[>l[$(3"pϺBe`߶WfI$ 77F06fC߹s@$8.݅=|6mxb|E؄k䔚q8=TVנ5VTfx<^ clhQN'nQM`Xƀ:Ɇ@2%!TUVeM4!rT#b0F062(Ep9pEY^ڼu~0 Xfc!7Ke$ R"IJ㯀냷B*yr{S,K3 i I !!! # #4>h8 $8.8ib@uW 8 ~*e0Uخv_PJA$$A$ttr@r`C=gcB\IH$DV=rX3O>02M[72(2(2(2(2(2(2(2(2(2(2(2(I(\x%tEXtdate:create2021-06-13T06:45:18+02:00_%tEXtdate:modify2021-06-13T06:45:18+02:00/EtEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/screencast/undo.license000066400000000000000000000001371416353147400232170ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/screencast/undo.png000066400000000000000000000430211416353147400223600ustar00rootroot00000000000000PNG  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.1.0/src/pictures/showClick/000077500000000000000000000000001416353147400205015ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/showClick/created.txt000066400000000000000000000002251416353147400226500ustar00rootroot00000000000000 1. Created with openoffice 2. Export in openoffice to svg 3. With Gimp export the svg to png Windows: convert vokoShowClick.png vokoShowClick.ico vokoscreenNG-3.1.0/src/pictures/showClick/cursor.license000066400000000000000000000001621416353147400233610ustar00rootroot00000000000000[license] author=Volker Kohaupt url=/src/pictures/showclick/cursor.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/showClick/cursor.png000066400000000000000000000020541416353147400225250ustar00rootroot00000000000000PNG  IHDR+sb9gAMA a cHRMz&u0`:pQ<_PLTE@@@?@AAI@A@@??;7A?@>@@@@>@@@7?@@3?@D=@@@>?@@A?>?@@>D>@f??@?@@?@@<@?A?AA3>E<A?F@?@??A@@?@A@???C??@*@BC???????>BAG#$ttRNST3 ˽~ ɘȠ$%Ŀ,ʯ =4-6{15‰—ǬbʤtKC>" E l'n8F&I9v!>7bKGDtmm pHYs+tIME ,AW5IDAT(c``dbfaecP\l<|@ +d`2@8eU5q4L^FC@J:P1=}!`55FHK#51e`0(̑9 *$i>d6@7hÅnu@VTl"5ݑ&aeP /o_=P[BeCBx½q!&)r@\|C"LiRJ'z4` t 3#l\)&1G9#25ɳs/ *qj@928}Y1%tEXtdate:create2021-05-30T21:57:15+02:00L%tEXtdate:modify2021-03-14T09:17:44+01:00V8>IENDB`vokoscreenNG-3.1.0/src/pictures/showClick/halo.odg000066400000000000000000000215031416353147400221200ustar00rootroot00000000000000PK=9S.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK=9SEEThumbnails/thumbnail.pngPNG  IHDRzA IDATxYjA@|WjM Dk;`?.X/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}PAE}PAE/^mqurBď '&qi *Y7L8nZ] hm>z:a{szG"+&}H}I0}m|?=xfUQ䞡4FW>)&?'kwUfm\t=\~w9ın>6<ŏ9R0}Ę_=UAE}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}PAE}PAE}PAE}PAE}P>1\IENDB`PK=9ST*@@meta.xml 2021-09-25T20:06:582021-09-25T20:41:58PT5M4S2OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-9788PK=9S settings.xmlZ]s0h&!3c6|KYr%9@}%׎N Ė9G:G;bܧ䡠 W{(8}ǿ| n "9BWr:BH Vh~Zpt%&^Yc, !JZnQu0А!._Fx8֥d{lGΧ~VKv[_ʥ^4W0j'k7CVggZQ)\ J}Ι?׾@eeCAV}BҼ_ }f24,oM(oDog?" Z/kG>Dqgo"[$׍a\'*EMx!"_QB%R=TB<Ck.'J^ܕQF9- *}妉RMah<4KXþBxȦۣQ}x1W6e^Qr!;8g =tO *th\}g_<ϝyQ8:^ϊ}Zz&LIgdg>9=ʤq' $ۯ#B1|hZW4QfQá`JiJK4'\ C*pyG9ζN3/YEʼr!AӇŹ+g̡;yuLcQ~WIZZ orrȧf.o7фZV6GL OG5 ]Fo:\DG":&~Co?ڢ7֌`(İa==ozuFem:nWO-at4>=3h,.{4~gZOo67AiQ`)g1ԝ O8#6v 0 Nm dHd-;0yZIrr:jm:frKk !';> KJSw`W;F {eg%ešEmiz*c‘jNi#u^7AtV;fU< 6:sgtc1v1ғNzC{n755k[γiCZ7Fr$}۟3ڀcHIji=9tR er URZ;ء}ϖeMHXJ ^@vmtgy3&pIX$1Ig&:V{+x-f+-EMA.~) E5367vƠezY!}Q!ՄP4A rzlIObMJձ|&|vi7֜4ǕƜw#3gS>]|>SUtU-8L'W_r^;(Ui=1[TeB{]o P{mwgN< Op芳EIZ^"Yf"CmXt?H`>ئU#puLSb 0-l+H _!Njƅ(?`O bhy :>v>Qrf }cF#cV^nD)%E4+ԄSY-\Henu2Y~`Az*'~v^h$vVZVap+,3̮qN,4Ԝ@~\F MO1O]]c.(iНa;^}KsP [ZHD #4krodhƫXE2vظ9HPR(2w)[Z]y?#̄XA2!#j=ph 1)}2~TxYw?E0V&+,)e_(2\ޑ?C{mL.*_ʋ>&/e± enb2+w|2mh2n (UuYy[>n v_4923K_E7N9!¶\ە4b PH!{''ŹeEk4Ji5,^vV,7s@]raU߬kYD仌/h W#‘a!aE vf8 a%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=9SConfigurations2/popupmenu/PK=9SConfigurations2/statusbar/PK=9SConfigurations2/menubar/PK=9SConfigurations2/toolbar/PK=9SConfigurations2/floater/PK=9S'Configurations2/accelerator/current.xmlPKPK=9SConfigurations2/toolpanel/PK=9SConfigurations2/progressbar/PK=9SConfigurations2/images/Bitmaps/PK=9SMETA-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 sŢEoCnEeW$' /D}q823Q^Ob֬/~50ŁGpsޔЅO?} b/*Uیh oBmИ ##0gc;/bVzǾe xb=zPܿ0c?^}mLVɓ?˥Nw8NI'-\~֙n NmB08[3mZq:/}`Aֽy6v~.\E9?07 VQSs3aÆ]wȥ 䣺vgrzq')iVkbijZ5jO[ /%;<9?.IIC) QΉv eB!.,?nw ryz裿aϞa$P{<2(]peSҟ = Cڛ_.s h\=sn NQ \YYGbp0z!KF0Ǘ_?g\NslL 7ri> e#z{K=2p10g9={Z1MK<DZZ B!sZO=7 =y}r3ml&,X@ hř3ߟA>ױc?OקH4J8}xp0>{+S5{!)Nrc>z&a  KA9vː~6~`@q 4R`/qq7O߂W^Iӏ}>x\n =9 fΧ0>D{k'0m,vT#' hMI;<oNm? nccryKq7lG"#19nź47_^j-ZJ97<ԎXRف!NVֶq|^)lWuiXKAZZl5Bn訒r.#&3:[P7|lNFmZ8L[AqƏrlo g۶;xh\BSy4Fndd4h?4!# cPph(^yeG,!{"GDhk[£0R<eX.QQ(hFHEәLUyxUHOobwx `0d\n⍐Ha[&RV'Pø|`0PLjGI1B;e1~)) ` Y R?xbfsm?:Ruy裋5b)DLU((8%Qt!M kZOBW؂hoWm0ݠwuu7PFB\ gBP\n>_") 4#X\nn>NnwJ(ć1:+Fi^ hص' 4) xH8~Q ]zihLCEnj|"<^]ݞK"9v(MKkpP)|8k)}QZ_F࣏A}=U] ?=n!7Ù^:Bzz3 q/Zm5::J-e}yz{zp݌dd=Z 㑲)xV[McH6ر)~$::U 99gc?M# M(74Mu9+ ױG2?8hk[J[m6?Fq7XU\{ꯘ7SK(3Ng0Z[WZwwysRr\}꫟#,TjV{ Xĉa6SVIص9.h%MB"'rc"''Җe+N!9ks߹Dd1Fry7Qt3\z!|OS={כ #, AooT*nx,<?u=+_ĺu{6? |,\6퇔^haCXgx8R|;G] C38yhl##0#= g_ pC?K ތim]p8`4.ꊓ0͛rRS۱y4Fӌ$KԴ&|v'bGN. )z.e@=Az!0: K p~ԡQ8B<==t6Ćs0+hؘ@V+nwD qQh`x8995ɀ˥T7?2}#+:ah̯PtBiAGAU՛~^)Bn$$~p&tø꫟@t Yxv gV3_!zz.'aΜ"ޏ?7ne}>-: ̊ ۑwf8*,\ptFRxbZA ɕ L\CMILH2XtQ~!ƥkɗą cy΀^#^ <ΚuUUNwUUAq8p'L/ÑΪR\Nkkoduv`.P/ x{qwbM3ja2UfȞ=\ mE h4.'’%o`ٲm3u:X ,[*AZ[1Ocaέ# ^o2 J-FX¾٤AH%'Iݓss@&A>jj6jj60d~ (,,gR:rB !"N!UϏq1B!.<ل>8 * hnh$% !;Nر#!a /Ka@iLf%S\ªUC"`XlGIsN +IhTڏy4h4nde!`Oq}PO:91>_"\qm\B"χZ V|{O㍣ H6խhk[š%9> =yBg|\q (DB܏ f+`HH`TǐWRs8A@*#RLfgN[>ߋZ$&ToA-{/-{.\Ey[]]Zif>%jHOor188 /eh\jOs>$tCJbAS*tu͝^P z{KF E'N|MMWPy7?''Vk1n)B W]?ҽ'Dӛ `lLF[q өTmHIϗN5-Zʕ/J 5Մ`YZ)0 [J/Vl(- :a1xY캛#q Je;X,%xphm]|pe_꫟D~ѱ};45] Q\#HOo7|'ؒBH#'1qMq nρ'Š/O&,_2&&HR,<;reDZxۤ=uQR_h4ͰZ 84wt$O2ABB|>K"l*R]"E(,D+9yju 02J[)]@RI Сᦛ~sp'`h(k"Y`FH$6)XJX"rs)zaXaGI?T8{v= !5ry~aa|Z&x<|i'] x< T6>ڛ0F. gfӱ뙙 @‘#0NL֋,lDpGyI}܌q".k()B( KM5A.'Rnf?;B~~5w﯑jZ Hd$8b)!472/+;w 8 Uދ{?ө-ZX,%HLAOOᠷXע7uHLDb@b)A8|d { 0wSNl}uطo 4VAc|<2 iiHK3@iAy'j-fLK 4/K鍬 ^B ٵ=p~̝!02>`T;'@(I5>%RZ +`6ϡyDB?7y"MsP[)R1:$.YJp5T`ߟy6 ldd\Ѹ##VKu6tԴ۶®]ϒ}3ak׳׿>Fsj!3{z`蔾gS q YD$[ZFVV-V46^wvQ"14 Ǧc>a/#Ê ۍNSm`Μv>L+ q}OB*`XId~5˙Ť$:?\ %U27oDET> "Wط_BPzQPp==[oJ3/53}vBX`6W@KVOܹ"=\:ap8hNwt)%|<Y~ A0ȟ 0\?4fV\ "1qz!ddx62R7ʦļUƼ(+%\nFZZ3 2v׿֭_F,߿=ֈ{ل%KMsֶ8jlŔO3-ÿ1mn2U咓ezz#*+j:E҅ W^md D//@&74:;()FNYJ;ᕑMLN3?wn^ye1,9PKDSC^\nIIvH$HI\=ˇRq2- 쮦F2vUHrkr1bpSp}\R/p^x /Jq));Q\L64KK"F01b5 %ѰZK(UOOcˆ\0+ M3#~Xg[&'M2u,-bs>-`XOYWTf Ec$=z{KںCC͢%Z +MxdIDATaد 3x꩚\'" [ZJOFF#)"f" &!n fLL>}eh)@zz+>_"W+&,`S.|/XipBS> Je-h>dPEu!ڬccҽXP*; iiB5F @~!$>FOY+pĝƍwӦMzz=Ѵ 92YNj`P@kэlq()ala'o®]12FRҩ p4|I† g&2NQ՞풒vb4Ld睷M ?>'5&i fzG U97my%k'iG&S/&NL [ʕb#=x`Æ_Ң\ѕ0o~ bzQKAs~#3b~?'7C(tQ .5a@NE(es1?\qi¤'䌛F"#f4`Ӧʹ^FFƍSRSSMx䑥dLdɿ+)ƫ@fdXi㑈ćaR濼3bz/Gѽ}ks8: QRR+|JXE`}V,\l6=Twj  +}^90 cc) 0klr rskhcfdgA-㎐Lg@t!aѢӟnrxPdgJ$s}b;x<XWXWVjj;ނݞ S=q͈g#\J$&`Oq7+6bhƖRN3v\M ee^,NJe'c9  EeN-ՇMM]plhiP<.˗oڵOMYx1hn^;idFd`ggbÆ_tH^[/PR557o"{(fF`Cjj;)yyz?QYcmJ/uز{0a߾Q[{#~! f`R=<{j kѱoٳ%NϗsK+V<EEAmؿ *U[*@abժ1{3i; eـY]$c޼P[QY  3'"A557&e2 *+w"+{hz%<)F[b45A_bDB(IV{c/@M뛅ӧoL/1oh4ͨyn\Db|< L˥@bnbd2 T*#23~ SM# J$$1>J8÷R{ 18# ~x˻!~mʧ`u ph06&P+Ebd^T&\?g~H IENDB`vokoscreenNG-3.1.0/src/pictures/showClick/sandglass.license000066400000000000000000000001441416353147400240230ustar00rootroot00000000000000[license] author=Anonymous url=https://openclipart.org/detail/13168/sandglass license=Public Domain vokoscreenNG-3.1.0/src/pictures/showClick/sandglass.png000066400000000000000000001200111416353147400231610ustar00rootroot00000000000000PNG  IHDR\rf|iCCPicc(}=HPOS";dNDE EjVL^MGbYWWAqssRtK -b|pys>@funD\dW+B裚ư,cN]_.ƳzԜŀH< & ޴ VUs1$~ό7e[{͛[@fe}nirQ9 cHRMz&u0`:pQ<bKGD pHYs  tIME7+,zTXtRaw profile type icc8S[! 99N4R HXjє]6E]k5L  *i3 iPA)r"]n9VRf%#\{(o;ZbQ(7 5 xf{8~Q`M>9pG ~;nO&H~3A3 oΧAP[i;gX-87n5NW}}UE/ܞG\s2nm4Ci.4u1dlkř! 3DQl(쉴_~0Ǔx`xkJrDJ0B{+ao&~;\۪DDY|b=:GB*"1o㦕?&bo\첹9ɣͼxZ A r{]DpR!0u,B$R۵~s_^5 ) }IDATxw%ufysND ̙DJdQ(?+DYlY''ɦ@Y)Q rXى7vwyTUw;w6 l]oNS@9rȑ#G9rȑ#G9rȑ#G9rȑ#G9rȑ#G9V!h/}(DR@2B$A$b]s}\@H¨bL K!5H" (HAR 0 AA 4Y345333kifVcfDh)bMyVi}R3ufjjFDMDJ3D358ZC5c֍Z€vύW[ Gcpx ~A'QIHB)H!b i"J!A&BT (Q$@ BIB V! # A%ߩnK`6֌D1+F`5[0'Z6k50qǢDjEz&yF+4sKknjjNDtk+@Ng@ @A@<&@C2C" r, @D(1bPJ*H  $Ad5w.md, z?3/= e:C/$ĒҀҌ(aı)D 38ѓHM<=9 N>~|^xZ1@ @/jDNˣ`ʷ]7:2 % CXhR &*ETD( bA@ DF6ct(lE~@:݆e3Z;k4oV&#$4Ck Q ZڐG)zd*y:h[K3jQ^K֑@~ہ]SYn8U.ʋJ!m/4V x(E PD !D0` <P*]BK!"Rq\YZn.Ot#l:-c’#]5=b"FV[ڱ>ъy:f[=b.S@jqA@ 嗏WK UKb[1a(J@`mmF:fv 漴 -ɷiy":=W͝^aL={W߫ gOvmOd&QVю5Xډ5dϾs:zl<c:\p`w\5p@_pH5d?6P[*%1,%\0v9 53@u#g tl_Pl5/*Գ_Wйg+;sq}zO ]oXQAoa(a"ob#94[S_?* `+pm[&wTrg$p!恰^nhd2ƩW-%nz׋vz4Nq*+|6tf=.#K ԁ[}dгmq0)|R!k@Y_Cs\kFKM.6KNŇf)šZ%[!Jo7 ߾npY,*EY% "NFݽ;:TrJ`9%d]RX6./s.p?]wz=ޑGС:6NkpƩKt >XyL,9,g J@X7ںYkZ ۧ}< k>+%7l/Pv\|#:9tʒu9mf}g;;/<Ʋ;zevw~Tum]v-fu\}%S`KbhLO<|xj3~kk72olj _%u y+˾KIfϛdziLUn}S=G,*`}Yr̀,jA5af1g;_xp_erjvW a2z hO2Wvq n{g4 y> q_A]e|lS}ֆn!<--8Y,3G6 k n|d3_*@\ |]7VJ!ї.u\R3lמ﷡4tr<L[G~E h=g$aקTS g6O+6%u^ծ7`xj&T&@BD;-U庨R_Ao"]ޤKcGV[ {| zWr/lqeխl;6o,̋֝N1ZV{;D:{qn A&e ,k2mzb;ڠs_?;c 6_{:{ K1eϟe q) v@Ȉѝwv;i@uMr0(lDpt=BW  71%{9疜/mbt{0܌e  x@#=svS6/K3'2$|.NDA|S%SlY@v|{{<]a[) VqCD2Q)z t`[-!K=R0/ݶ!{$-x5QQxyв%,OKN{x|t;ՏOiZ\2e TŪե vm:w{7{5)5ʎc :~jK]{wz5){5&e6:}]l5q:Cǫ.;]̝:مNF |*^r_+eq, kD (C}-,_"7KQsa"tmu*~N-eZWaI`@}؞<6%77S f" kJ<OH|xfO9F|"_yG~sq;d7m׽sB˛y7cRݿ2|Rp?u,sskXuȚwFuIDR[łg\Ѫ">;F\` at Rښy XjZu/rK_N:R6qwawj}qnҔd9#G(:}ѝoo?u m mO^mzzqymgg~2:nWL?/se,{{E-6]S'S/Ν5"flbOc{~)B5M%۝XU8rRt넑 +vx߫F)1N2 %<:fm5N啈!!С.ޅ:[ ҞyIONZ.u3S;4}Tv[KzfN\װ rZw ]rۯfjMooۈB)UG)[.8>7g/"(`hB(Q $2ѥjOv h={fϧ'ǮӶ'ܚ]X:RQ(.̋Ћ\^ZM0tNSConaN+M8[=(ܧ7;NE(h\QlT"ymiC?3JXCc<zaR1@_9@!l_P3{3ۯK;6 u=z@<'ݐg[S @{X6˂wB3S/m\K)w:wusY+ 4 (mعo$AUW)ՇUK NA[%62j9,6ZSHW)\4Ux 4a&t~=F . ^ڮv3,Hm';D;|O<@F9^NUGͧj{OAdFq3&8 lJ03J1ZF0 Ce\embt" t͠Jȫі( T+ nH0ShbQL?aFhNN%xSp<4_;2si`˩ЍZBדB/>6=(hqw^g .QÞ4 {LQ Z3Zmz+APL~ueTŖue )e:r K D([F-ZqF@%(aJRT P)J*ulU2j_JN{9x+둆;0n{͙=rѭLPRI@Y̼wlG7=nu2zoy8v^{:_}]f$ Y 3Xю5юERR P 0R02X@PT(4$ގußuGo$1@*#}'X] 1)W>Y[uBE Ni\ь%BM5ZJJ2Cb(P,X́>{Ftq>?(gd  tz*>{Rj szN3MZ3Iik#fl)cF!*#CE WCFCMdt䔨W/-]DLb{fsxON +sn\e e )HF Z@M5 ZPo* 쟀Ի(ZڝrQ/,/a Եzj,F(1#J4"sGf^fli[^`_lY_HC %AI C A&JxB<)S[^HO_s8gXU{vRy/zn?'1 "3`GﲙmW׎ ņF 5fQohD@m JM0Rm" ! !IV]ve ig &X2;÷M+6,kC>c J/f`3;+jEZ 0`t0@C}%"~_6ëڧ~BoN,̈́aUŮ/~p/]X@nS ,6l+b3U 4cؘf(e %9z7s`·ALK.MO!yf3.yS.I$*eJ@(Q.J0(@_tv!5|V3㯿?hsHE#XY񲜭V!Df~S{ \:MF!gA'Ff2FS0/*:|gYvi7Hs\Wٯs_4MҌZ3it~ɋM'^BX{'Q7};֋6Kdb.UK@ ݋Z`RHZN$96"5#.B-o{?X?^|h?~xV[ÿ~xÕ**bOU,>4R=4\ů*a_3lp*VQB0( 3yeF-6jsbt|G?yPjBc| lhڭ֜\ [{:0>~j~\* (b E eNxQN,5sHIB?2!FKh qhEh'GZ{kxC=T,e=7"W\Y\H .{;?K.cbf&:J'nQ;ͩku4^7#E@B27PJsGb[_?+)4\GbZzņB+ҋhgɞp' YL|DXZ'< 1쾳D?7goظE@h6DY3b@+8IڬI;:t8;xR(Z['>K( WJIZ@_9D!愍\ %Hجz B3   sP slQ̏"b]EmՌvl6i~XҙC~߬KZB#|_ LvUd4{ @k &BbB3C1`eUssGéJ 3X>RVLB!]'hv}L+zL {E̖ rޛ _:=CB$#0,l`k+n#H@$431 `$&hjpqrPann_o81<[ VB;JCvZnU*vP*IJ\P\`Q,R%lTq6/\*Wo\᮱F?ZtY6CLBf#܎-ڱVVX6'j,& S3ŧGf1/,> |{ 1xgڽ kZP OKRbLO߭`)]1CY-i&IęZJ$DH 1HXJ$ju`Zc5Zh.fDIhl5Jva.i qD=_̀u+(*(8(,IX2Rh!S 5 R0I$JVJZkbb($vq\osTk艗cmۺ3_sNugϺ Vb^+\lO\u}qTJ0M,<@PZC HJ"n=4ELA_%aC  $B"AjbTo1*Xsn$Z5"ZJג&%q^j6nE@4ڌp ,`4RNLiU'+zxf/ąJ>?G?tomJi `gSV}9H3#DNI4C$2@$FA iCkM(f}@!)YCW*УGR(x'r{m゚5׼ŖGZ@u9aR)(? "?6ؒOȜ%2U,hFԴfm$1C:IW|T~Fa/d%j~ժ,p1%u:ֹ}@y "]y^!w}?qq%3&fwAtzEXǁo"q|e)!*.`M8' ѱcϼ̥ (^769 0q=spf%<m=M_ױVhV.J0%˶Yl4[Gw?W7:=J_J#'Ny$Iryʱ,DPI}l+ZL bIDf^ۻL|2킬w{nGNulԮ̙#zr\w |kkB x_Pp!<[}3_MVzW>&*0Һ#MPVDRg'8 ~[Dr;W f KBkڳ$1 Dچ@J *L$uV <=|jOWB\̗ܵ뎺Ae `GNԓ`i8c P*00<a_^9ip7=)u붢P(ٓ}OR']|!v{gqc:#Q!`! IZr8=wL &J_>؟qbbgP([S;#n/=19n_6z;4\^@sZѣϟZFN|򯎏_~Į Qw!@K=Swº&o#z=4;!C/ .ghmmOK-`LOS 'ǡcǞ;9<ڑAPll/۶ 6}M%=S;-[^J4)r憔 `X\? x߾.p3o#rxh4?JeMJ\W^ v: 'DçO];=ÑPz\"$#JŘa-=Zg^&zWoRT6<݂ޓvw yD@'tG4Sۃ5a %cpf 7ox(*Md uu;T~olgmђo[awBpdF6$ሤX Lr1m~_h78Yڱ(j_~a_`,Pn=DR@mIKطNUߩ։BсA`֕f]-Ak| \Rkx5Ec<^jttxYAܱ@t}ھ't9"ϜHZBt/! _A7 a* x !jɣG\݆ @h_: tm6yt떔?֙Bd3# >t51^`+\ rxuP;v'Jel؎y`I2S 3v?.wG;'YKi>C N8IQip_+c!XJso}U#r?D^ɧ?GHՆNK| h۹iL czB2 P{A8P?jM $%fs>ާ+fz Αym0sq}?UW=pYu;g^dD+e4ZD~/mџl-T*F Bf1e (B(!D"X(!!I  LT`! vi[_:*>vժ+7OoavEPR& Vcp#D I۶;̃< N OK8g4C>UGN+O?x7К`F#Z2+?D~ᅯ i 'lo\頥li&6=1 KOzepcqwIk @-~n)۝ kVNr~~/=_\b(%f rM^'Hk&"&ʯMi@ޘc^ݽ_)ǰ1 [_k6-{3)y782y7-9H3 !wjt@^_,]G l-lmF?->o"^+<C7ߴ~e̔ ‘B$A "-@ AZ bAwYHWNet3qtmKĀH@2S !c,b@ ɀ%~s0¿B Ӛ۟c=?G_Gv<:" V緃A,65QZEۗ9Mcp?FY@RT0w&~ 7{x(~El:24ЈFGf.cؕdclbDS9 Ѐ e $ ?0T J s^  GO}3/qBoK!5Chb0  $T 8;v vl2$cfDbixf4r?ok/{\y{}}n8:>2 UvIAB3YC),I'_@@$>KUow+Pst"'~[}5|@+&01 h;OYyy^A3 @Y>'F?}w>;< OWiX{:|obicG7-KL63<"0 -!p ȄG$dD$c"kC(FrOGݿ:yǜ+%rX[\[o+H=abR)761 [{ z/D̐ AL$c t?փO~w=/'9漀VfmYo=adZo  c&i#¤2i`"b1` b$4PY~pTmdsswٕ~p9GN >|\sj'j֝*c`bfaJTVX0C(C*)"&@$Hy I!!L?m` _[]փW_}a`jXS#'U09\*\s &M͌a< fAäM.QzYh@6|2!TS$'!HH(>X=}Ϋ+w1Z `J?GN*N4;/}/TkBir| P Rfi&Ɓ'4@ ,I^ޒ{ b3fօ'jo牏܎ׇV;0j>9Nlڸi aȆu'v )`SV4AhP B[S@1(aE$H*2ŸX>I$rg'~sb׻ɏ@뽓ǟi]*DUV/&'[HyÆ 7GGF/Ol||pUٶ $9/P`""HHN#|>q^+@rrXxٜxtR89X KǦBMI E" P&@!A֪o_5ȋzJPxӦM74J#3##6؄t@l3&@1Th IUȖw|㿀E!'~ӓO3y*DNk G>:61qՖ!|ȉ\n7 "eڍ 4#d`4c"#|3Vxy `ܼ{}6,elLdxIRA& HD7m#X_{?+}9^>rX;h73#o{!XB#qijX*MPf46@TIPǟ}qw|RJ?_E'? ^sm1X=bĨ 5 if"HS eJٌ2<3bX'8wفMj0d5wMUȧZ3 ` "Iz}/~ ɶTXtx~yi@,7($HJS:DJ>J_s(j#{z=0!@K_Lp A8k}8 9~;|v-ǹCNk==<6?CZclwtNov'<~9rXp#Z(Xk#Dl}DkDLƞ=9$A"<7z67"' 'ⱪf:!f`hFFgQT㛎 Ah h "?~RQ9m4⸩TXQxgHy0dVE|F&'Q9mD'Np(kB{V .BoEc}RM5-D>ZDNkLB2 NIǃVd@fP J.0BNk, [BRSS IF+OB(3X)@0xچaR* Z0lIlfkC$۷__/4@k mKi2RHʱbcb5jc]wQ.C敾9motݜ;^-|erjҬV_B_|GM+}39=rX CbUohmZ@-#Ok xNBf`f1U+}C9=rXccW]~eܰTgNp~ahʍ`N^XC`JTs.vozR ʪ, O_<GWr[F10p/~Dzwa,P  Mk^gw> lY{qEotݞRa؋,2!?st%Rf3\4#Pn0ǹANkv>(k;?uo!u:m@)-薷l~k>KVsZxs$D  t $1R-["+}9^9A~~< J{T j x~]! )_?Zzb+}9^r `m12)A @S̩O.U fp`‚QT;W_ЕU\X;ؽuݿ$sz9E|RHM b ޹Ï^`29 #7{ðXo*K˅s쵁dwgƮb[kkpÏ\rM|AR: ݖ'ڑYíGcW!8{Ƌ.z͗_@d|p6v?Z@+8LRRtÓm+ r=r `uc`Ӧwۼҷfi t|5RA`&޿rۦ^|;cX `]wѧ Szte C0K CC 6xցrϼEfs=iV r `z{w|yPŸ@V H ~^ 'I6D8&B3AwCqf `uq}{c-{w84=imRym;m{|1(Ȃ VːP* 0I&C~X9NV DP* ߽{v?.sHq{;`w J IbHBJpZb@͛~ ]:9rX5ЯooJJLﯻ{ީcOk ݄Y( f4頢dj5c(e.i .['cyNՁno~[B1"Hϻ;ķc̿3." 18S0'I?ɟ"8[̭C̱p;A)$v8ojY{@8p `+YPȜ.m6@JɓKGaH`bd w{g!N%Oq^?|XGZϗ`8GI c}1Q<04G'r8kM*іW+v?{t >Iq9P0ԙ&X/,^0Z`J?r8E7 .{;n֭r:IXݽ <|BV5~ܫ#Rfd&PpmEf0paL(ay$i3Kv~{gqX[-kx'3kddD!yn']&0< inOd.@Nmvϻ{Z utU|풀\ϙwقiA$1B d^~* ,SAn6MBЯ:3ǯpJ?9O۶w{?;|wP*-ܑ:ܧ[$H~|с K$10Mpj֏}}?a q߻ncͫ~(2=?Q+#D\zoW *g>& 6윀?3o8DnrXyLq{n7=Q' /,z ?Uq6#%(ICX4 ,,՗u C`7W JNYߺ{;>ƷO% r;+nX/v=?7„ sMpÏu&@Vo9A$ x6}zt9=͢{'d6j<7g* σ+ӟ~꿏(+`FVG[57vOmnu 3-= pu ;p%4}8mf_7P0&@Vp|\n-#'7u_Ōͯ@ft< i@g~?d @w.{\#iTQ*[-pdJ9R"OU{^nBxՐ>.% 1LM*Y~]6>`M? w~*xxBRЮGfI$fYc ,, 0~ϩ S0!"r Ճp 7{_vةΎ~s)O|v7W~ Ib' MܿX̒Upf1O#~#^0 ᆏ{7h³*=@Go9#TwmugRns}g)+ .X ϛ~`꽿)'Q39Fn |?n"3|C{w?c%i9lP(# ):B :I:} !`f ȣ 0.^+X5smw?s|ɱ'k5. AN+lΛ176o0T]\o>10ZAW\8w(0x=ߗ;p@HDr;9L~01K񑖸ll<18 f3Iuf(/L /#xkHT($[~G_D" B]R~q0b7`|Ø9^rxe C-o[oh9:# ۇCN휇~[n֝BfpOr}#ݼRf;Ls0\c_ExJ_jDN/cb{ߖ#/M2^Hwos=; ܧL?ʯO?5d4EB__~<={j4?Õ~ˢCܸڐЮy[S;>bVW۟b=0g]:vwYD ocA )Ժ{bt0a w/}B׮Ŭ&p[wo韟ov4JImڮ_珻5)/~. 4oXW@/,A,nZ Y- PٶwtӇGcWl r:U/AdKcnOK6@9H ;74uX \,$=og(f'y y봠W~ v=W]_8~;ߝfzmldh'=kN;`gN s5[п{H}W # 2/'q,TxL+}1+r83l}m塩)#c,<xSn9witw~K&p6пfxT( M399VBSh0] y?{Sw_qdaDVXB}~ŞE=|GA < zd׆usIA"4$(ٕ^$cpfF 97ׯlV~i:kY2sxՁ; {c!E[hGeBO/EG$D`A̚f"2{&$r}n[ :+/mzTCtҡTp0deF2~܊H~&nB2!,(38%`6du*m0M`v/|AN>;cvXp*EDŽ!@gx4^;od'$ r`f&"m ( .{~<$$>2 sϏvTC/@`אߴ"0`/ɡ{n{]&%i2:L JuBI^`.g0 D4r+[_|tb\?W<[zihYеfq>n  -a>t ogԎ<;jwҥ ʳ` "H\d>D 0Dշ=?U0 Ƌ/~mƍ$I$)8v^9vv }Z,7IRRqi _"̓ ܦm}vWu׵5bOx'|J3TH3n|꺡ŷA.י3F֜@6-=ȮA߀J4􁳝*|%q3pR ܶ|!bMѱʋD8vmvDsPBz]42<{!W24kr<DlO K)9 "J@"}pLy+ĤZB'o{^{٣KJxi~/U7݆ q:c_%C D(ّLNY7mk??YkR6F`b44@%0bk`zŁy*u5hP…LGݷ{ۧa(:[Ly;^j{u 4y ($-'ό\yw:8g$k+i clt N@.aX z/CS4W> `y\PGx短9{~NF'x9`,r{ge&5w G_W*nfLf1J;0tGϰ)#cmi>I(M||WG`& p!@7'!2 ywȫȀm^:?:;_z߼vhp0o!⪀NL:du.@ie-`J_̫ ڏ^w?X`|a%(:2= uD l~j60hх`MO>V媫}t; HddcOTr"i d&ԅtB!FnˮF<6>/j_6)`=ĺY *`/Y,m^*dE8]k\ُn lnq:p8xGIÕ&3AL@& ) J@"RBH(!dU"؉@ #v3_ \@j}kj61$9`3R\JPA`}`I_RC(|;_x3-/Dwouˍ6H 3&GQ/@485Wvl.|7]6 &fWCVO1w`֊4֤@"Q( yb~_|O?}0v|m xk42pA{:zL1:a <%6gzؽ{oF5 g/"%!,QV$nbp.nFYRaa[؄<#V DV&@i ;vǐ0`509qX`خ) (HOdٿ#k'45j+~qN6J3PrICu)2$#m 2<݋cG0;[ChU SUJ?VYf'nxtֳL=&:wɓIi 7@x^֛G'JBO#5?cP*.*EM + (%%rQ p3f7)P06m04:f L𭐻֋p2Olq 0ZڮچE! uځI`63fێ!88vx G6?cPhk4ZͶB+R^>L[lÉS&m}O݆I=,ş|sP+e ;6n|q׮kBE>x4ǧ?Dev11U־J=A1 R ӛgjK78$RQl۹?P6)w!\oNd {|Atλ[4l[ J׷m:I gJa@D$;98z榧k!)QƴכjbVzh}0S039|? e]|=տ/ޡ=/|j}{qq:yphu.y]_Y RHA Ȧ[{6$'زcP(0(Tͷ. Τi!y^י{tohũo4K: /C $qf'0y0N;fc"1bZᓉlG̋ U[l&M}OLͷʣu ga <^ k*z]OT&G7W[5nJ&*%U$4GqZfT훱q: T!I^]֗Vp=Rw^=o|ϒt[xl?گmxe3 =3"jE:0yE Y6pR@Pk%q5#Ǡ8j/?M]AUl[WpX(Q,/ TDzW+YU 14>-ab(!lڍzMOlG 9D{ rur4."S m˭/FhpH4m5J[&Ds3:rUV "(M#$w]51RXlɓ#G/=|o ^|D|[h膝.lݴ;O NTB_uaM]7JA`Ft}pz?^ۖ[|3MNSmvvCřyŶ( F69b~`?i7&ۆ$$2ZIk4ڌك_}ba<ӗ|Ǫ%mE:0voxnZWzc,6W+k1 HkdS Z5uh7002 ;.Q P !7êms%A ua]mO>U;Zf[7ΤGyVg3UO@<k2J֜E l v&bD$Lx24uQt/>"$1=׿ҟCAC6QSU"\Vor^wƇ-l!I4k 97Y]Jo-_GP0~JKQ,$4؋{_JK=֝-<>},B!M8M2id"/$Lơ ĉaD=@mi%@2 ɾMž.;?ojLyj 3;_2pw(W @QHzi:A{̘6m(o`[vmGRv`!k^tIq?<?ɰܱx%ӥv/9Qvg&h;@RxVmVCB3O% _| 3Su%wBC$Qhu##~q 7޼BDN!U6 שdxёK$<'*su7?Ot޶{z:2 h jVPZCivcoS#jg $YѭwP͌b(hDyM/5VV`ˆU;?\.=F3SmW ^:i %Ύa~c&Obp" 8FQ,H $D2$ L3(s 拾>3^B}&@J@ϖC]XLkg?~*N1X#Iĉ!F}a>=h,B0 !Kt: 4cd006hީf[ɽ?uh9w. ҁ/l]WJs|OlmԦ4;h?׍=(9X%I *'e( ׏R_J>*%BB 4YC  ):$Rwꤡ4  +!:c%.'= {^vq w'PQ8NG *шF)h.̢QA{ik@FEX%@η!Z}Dz#"_3b7TȨB ADR+4 4݆5@3aAaAXa2 A@B @@J>eJ>L6(lnelA$b_ٞGZ >1OJihL^khT@%:QHbDih$ mFM$Q*!b MbJlT!(" lny^ݗ˓>X1&gb9el)YI "A ..Éh%1V'ToD8v@vl(br& uRARK]%5u d`^T@LŶN)v ḿ9q NĎA5߅ @BB\ '"ȦD! a˜$$w23g9fԞKЬA4'vb Pͺ i ` @T, thgx=t xW|zO)g +WBDNf9IQELNt`Uݜ_l9ZD1L*0"Fkᩗ 8Tp/::$l; LۺW$mL_wr1[C5hNYN)XnTCVal!LBo\3p]NocW u]~뇍 ',&.`hRiDD7,míR!\=QUE<֯Xiss( #˟lg*8t6#TBi})\ld/r{|=0WF`ne!;NǑY;L<zBu}e鳉e6tvdS:R!Nݭco?w3_iYO#1 F;b\TMŌĥ[+/)p"0_0:\ ⩽d}*#~HXƋ *CH+H5euC!G[84H ( %bhDdQ:Y؋]Anɍ%p/K:y(7v>%Du!=~ȦLq#DagK3[wͳ-]=k}L$|-zS?J ƼJtD1o`h4yiN򁫊'8F(ggg<^WiZ-Oda)uJ um5jY`d0`>ٲ始T8OwŒ-ȜDt҄4D{~? 1wY%YûWGyo3wui BG}#71}!(s6#B (dSzipt ܱa=&Jxh"^ Xu`Pjq:6s}}2^pxm3ս|R*. 5Xl(:ؾ~AӖHg.|' $yj:r@!魻 =N\3/z:tʾs[i-KRdХ)d<9te^y2pb.L1cl]WBHP)%Kk׾Yc%$ @82Ɓ&n~}01\B MaĬ<0Fw\bO %lX"Be Y2J‘aj.F;֘ q4 u;2Δ)$l!SQߖ..Htwatc Y{fb;lFB u. 8^&!JG)lKXh2-F#"+ T$.VHU" XGfS#3EZ!Mڸr`6]x( $B)~yeЬa^C%*bV(&=\(@@#ؙ ^r$UA 1>`Ā)*ь4x+bE2/ ;/@(0/`AqvIaT=QCW` SF`epx# 3Gbi-lBPnjX-!ndwB %cd~-A $L ͳN#w!J&*0^p"F8pص$,+JTfXňJs Fļ`"C饝@bfŁ5P@9O= },E \u#fF-bBG/9 PJB63'(:7l}IF < ! D6T,"J hHHZa.# xĊnyUHXW}X7ZD!0%KEivd2޸4 '9_@+0k$쿕g/2D@ aѼ0MۄfjHԒD!0/t1$ TxZWN<.a%LAM w KGzzlxd44KMZZkp#Oȱ8!7sv_s9oЈcLjT+!B11\D90 ;DdR:ކR )nǫ+` ܡi["KՀ(Qh vLe(BSLe00tiw=.) f*ӓݖMmkBzkyuNzt%w }PTgjQbz81Sjb /bt%HWBT+fy<~9*o'gi'Οd#Vg{\ӊu9S5 V24Q@bu "Z1hZ@i˝g2eR(HC@<OV=ɩԧmT𤅼<-i}ƭw&B`F6P jEZP W(D`'o 3jsAֽ=:R#Tt>vm̼L;fDqn&ۙo.':ʟ kvDU%]!#fҨJ ! %EbQ* #%Kc* A~&4^?7ߴ>e1-|푩g~~+;*%[/֍#wdϯ-rLE2'oגϴݗ=e)ð&pm^Rg>Qwz?#?70os?_>rү9V5x}ӿjyh R/˹8ڟ1S ֙CosrOX0+wucvV˴~"! x;Bf9Y0Ə(F;a$&];YfgK )su< @|];\׍ ţmOlVh׹> R7Db235>xlyT빩c?W5tg}[ OgDݫwB&nTMoINl;KtQłX_+%!J L%y,!m `$afa(f,,6ZlnԉzS훯/<{S0>{P}E*_ EA M~!i"%7V JJ]FY`t/#:Al&H#I`sZsԊtm/&SsD;R'-u}79 u>"'Pee8RЀ p+ҺB@#ŐBI 0NbH(-A؀@@;ߛ5vf,,)+1Rħ2?Wi"(a$ #V:bkzT+ urL'Ji :l='>q:Acww)QpY,(RR_JF1Q*:bH#a!0(UI0b hɢbAEPEPEPEPEPSAk5hO8O=*| x/ʲSȸGVx{KL Y~azo fEeP+m Qk=iJݝУi (Q*p+Sf(@)œ1Y9Pݔ:x"FZ#`E.VudW" |!"VAȈ t*bE4Z*BRJqM5!&u+,(єUM5fqF%φb3E^Uwg$)$ֹ=GZ(~n}2r=覘H$ 쥊 GOk5ĈG8'=*~ i[MmrK:\vl~qUѩ pYK+>3QG]P{>̠=)}uOUj%o~֛9dVRc3?ik?Hb}B+yk^ף_S*a*yyxh~Ox랷) S L+䢝.i;⺄ΘZ9;,EqV ?֚9dqec`y0\fW}E$_T [ }xOQ;n]am>͖Id ޕ$IGTQݎ+!Z-g70+Dчw0I'hU|_p5k#~8J^I]'m;y#LaP$3cҕ*1GZjsrAEWIQEQEQEQE$m2uAwچqG1+F} jV-T}hz\} m@jZsM1QCg+J_5h:?bﭗ(qOddFFŜ`F܃r:-ZEKxb3 sbxB*n*s%Ts+8)"%_ZՇPnS#5|ac ]!̅W d?Y#i,Y2.в|NRybW|ןU'2Gɿ(N+hVQ]P9Kk5/0jћpa,j00U'8mEm s9bjΫ[YDK۩*vĜ .vd :6IONQ]bcՅQT ((((((;W,5iG nF@`NHH-s댩d?#WDM\tMy<}yZV.TCpNv^ 2_G 手Vi4](C 1Hia+^l+&Pw[d3vNsw;7<=I?v[0>wu(Ni5]ddI$b'w5_+ΗgtQ\ ( ( ( ( ( ( ( ( ( ( סxbiz?,W ^yEkF˚"jӊ<¡wo9H<5\ #?W>wog@BN#=}{++ /x2טSån{? T'i1-7Dw,T|"#Uvw"0RbFwM?++l` Xm=E?lz cqIP+ڼ'e{ʾ㓻e-Fc$Uq'$?p)nSoP΍ŝ $ j2AH׷(:in.|)L@K먤 fɉH<(9^;0UJmdT"ͫs*1qotQEpQEQEQEQEQEQEQEQEQEQEzYǽ۫=M;D5L A c2JG#z Uޑ&Rxz>D<̳˟ng4HB0Vy4;UiXX*ʽ F k.󱳃?b71K"fe$NgUӳXǩ<9ỿ_`a\#^ۥiV5Y5{>|?M@=CMiuȣ$ )F* 'RUSQ-tAs&$ !̍QާӴ^o.!Os&DI`F}F4h4ҐeY{8䞤9,$\S.o&;5ݍdHXm| QMc=^7Ϧ<_^WB# k0{Kiϴ1Tڡ6.pzVO^Xto.c+o#5jb~Lr)~Dw+4WDQL((((((((]\#_~w={YWxJNiVkYe0r 3ӆ Vm:='Jtj/,;w&dVIoVOY/3L7mo+ٖmT*It67zRg5SOFmBz]>TFi5J.0=C*c5Spp7zY6w:mF# vWķ lkrO{g!Fʊ08zR{ĸ/r>[czxhW2E *buEGgG)6z]T0&8 IaJnQ^W.2 &!sn?wd\ = D㣰1bx]4>EO|Cqز@\w1HytR@l6J+xOOevگ&,ny=O5Ki+*F9VasEC(A~c~T~?uQJ@1]їR]-Eh^h׶! ܹlrF #<wKʌX`ROff[)((((+SFե1ӻ?,z d8`T)Gi>dXќVVbW O`X=k} *!2#gI2`p2+ÕYKV,]&4\N0vP\H c?ƕowiY>CVMȻ&z팊W0+҉o~d`VF_>Ras=h[˅]Nz^\hktW_P/?᧍kQq}z-yAu/V=on4ԟ`>gf@!kSio,ƭI=bkd ʸִ B'$ȭc&w:mgX.dXLa_n~'1M,'\Rݣjd$tWe = ׷OF7w`H_5NOVll漓04;z/:5LEKFty|ySmpǨ@fG}tt{ZJgVd/M2M?Q^,GK8?ةt]( ױ\s][@1QSh:"o8O?SL >AM iH)c!\pxKU}NZNpb!Ɇ2iu[9$s,`LzN4"3sݎY&r;$h$(((%tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:07:17 09:55:43_GtEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/showClick/transparenz.license000066400000000000000000000001671416353147400244200ustar00rootroot00000000000000[license] author=Volker Kohaupt url=/src/pictures/showclick/transparenz.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/showClick/transparenz.png000066400000000000000000000051161416353147400235610ustar00rootroot00000000000000PNG  IHDRN# gAMA a cHRMz&u0`:pQ<bKGD pHYsGl PIDATXí}Pٷ{;WpéQ*h&BR54i&N$M$3mTIi^&tI[ML/1FHD8^nuvoowqQ޿޳g>PepxЭ4MdRTQAeͶ_0,$~Pv@)51+v6,֒1K[,H;T"1mn}UP\5VƦܤ"&(1<gNt-M^bԣ&J=&PO%`2ݸ`gdN]njjz',NGɠCjcRJ,]O7n7\iyt < SPK0EeEAI~އJ i td`dR@K J BOwQ+y7;yoN:5 uS5&F5o>t̪Y#ZGlP gY +BhmyEžMߜ |Gb[2?-w^6f1Aq睘]1Թ _(bIͺo @s e٪;pkd>cSѰH#tYu%Y Lь'~4ZSO Ϛx8kmUnӯ{yPdh;=0YoSve[+jo7b^zP!v =#F]o?vc?~;Z[[ =:X_)q"6PDlp'匌f Ih3uJr TK܇z&kP"fڀ$#ou>wZ٦~!VDb>~htL> Iho!|B]B, dʰuL>@`[;vBDX8Ey7.46ܱ-OvRP?[*Mӹ/\"yWHMȋTL `' 8&ߨLnC ']MɣDϞ\m9V1qGo)aXq:׼gP(KP2f|B$ ޷ݡ3>;WԄV#DPXreADYH;щf瓀bSP ~bb>,2\R3WB kyQ\]VoG1&g#\א9<"v{DBQM(" #J`n%P yE朄PD+% Fy%$ Kز!Q+/NajqDVA$Ù0;#M!)m"%)ղ4e"LaP,"˱촱i˛utxmzz5I6Oks ΥYΜJB59zxIr&YRh(g%RPdHfvթI2ff%ᑢkrp:uܿ|&㑜~s6lxjWh-ix+:JcrI''z.{|S-nU.mT{N^63ߪA0ZnԥKE=TFUUճGdXOPio( !W菆fl(jZbl]棅 B2\1 ǷWUU=k(&Pe# K G<6auuu36v b*F?h 95~en:犊~Mj:{ކ( 1^?|m۶#U_u{0FsI͛_[nݿn[Y&cg((+nx>"WMwd U|rzSoiΡ1\v@qHJd TOjjjv8vӟz'WJ>LL}"Đ[g2D粺<'4~wU P˳j6AdIeengʧD).;-y|3*ѹ *dGGSt0i~J92FqWTTtxco>p8KG'(IENDB`vokoscreenNG-3.1.0/src/pictures/showClick/vokoShowClick-sidebar.png000066400000000000000000000665271416353147400254230ustar00rootroot00000000000000PNG  IHDR\rfgAMA a cHRMz&u0`:pQ<bKGD pHYs GtIME%DqZA^IDATxy|e9'm}}-I l.W 49P H9I+ zE/"MNRJYdR(B7$9g?jmKsfI2>9|y ))))))))))))))))))))))))))))))))))))))))))))))) {),hVE3% A`~=ooAU(PՒSVqJ|N`qURfKQBERmELe"2,߿?jFa);?Eu KEe9\EgK#8޸Qs>콰{_dg-0Z0o?_@ X,Z o뢼.~2eä A|?2IԂLv,,f¥)R`1`|:Gf5'bH @4:v9I1oH[<) }1nNa)xx{ n¸'9I @ p"-?s6b| }flk=ĆtՇz ssKon3_}ԡhXw݁Z8`o`۸pyd4սĆ"W8a=A @.|1|ܓJ $ܖΉ*!ݖqk. <[}Bu.悛{!`HW(p&1`l AbWWKAV8>Zrk✥R;u|Ʃ5~3p07c{2a3 @+~?l^_ < <a&i+=J wI2/5IUU=8 ^pse<+x,L)QĽ~|S Zv?xu1~H]1m0ex/P8sgCH EaA,BXP'k4:'3 nN+tXI bt(W`{oivՈÀC@vǜ_wÈop\bv*׭D.sxJgɊ[-]1)<sm}kZw@>n9>[r '467wNr00 &6b*3T劦7lϹCPR(y><>m"l u@.Ffyb\wp h5/_nkh,v`o$ї.~-M5ֶp g@Mg໮[;ֵ ?_8ŸUxnXiQھ;Le%(ʴǚ:E|xmm-~y#߱tk,W?;!CG~\^h{,235m(ӦXSo/L}5k%=7`A^ƊJTZ9c~S^Q + _܁y&d,3fŶ^3 SG__nc{^Ga5!]8U<哘 =.;e;?~EDɞ*Ͳ3:6MX zj _KR SWc4jM)k Kv([Bs𖦚ž|E]Xm|Gc o~uM^3WÕ&PBGG70e1UXDn cAe78kj+~ZչJ״>E# a4p ?.k7,ՠDyA* r*ReDɢ݈i)fy^q1m5'S3M< sЂ[WS*zHMcHzv}&S&Qx^׎1:Gx=D$?Ĩ&6_sP!ZLQSTdUK};hǦ佮 'a^:CKS.pfYKKQs\ks00AUX~dLNM7&TxAX5֪E|-dJ4DfTAD2΢V߶)[8Wa ^1]7.8g{\5`km~]^h/Q}a$ u0[xMk<<}OJL |b E1ՎPHi;Wo{>\|QHEG@Oo-ɽG$@T`|/ʙܰF\|2gZ|R v. k@Q:1G?8 ‘Q\ATfyűϐN4|~%nIfOoyE==\`rxQjl `PD('*!k_|96 WkH?}zEb+@,E;Y 1!trsTy=PNF |uX+Oh,aXw1au.]( ){L?9Y=?Q.tn#cڇWLKӡ ݖoT W15B-8^ Eq5`t#AkTkjlu鏹nf ѯž{С)$&xgn+9 sQN߰. 5hBsmw{Z&V' Ts@3UG19uЅPYP;k(|ֽzMs/!(ǞyC3Uo>W_tT\f7UHr*ȭMMuQw kIHn( PA5y]HsV1[?|PX_̮HЁ<},p,*ȹDb{;Yد/8?,`6^● k ~h@࡛:'Kp&>pzʁG) .4GuKQ ܺ! ->/ Sf^Dିp1]l~5Vzb7'J5O \jN5+(g/t@9 %7 /v7LOōKtfqJd=H.TE#!3'BӋ&0 a{HUj1ʾX*klL6gŝ,e~ ܂qv|˷e0 lܖ݈ŷ>5Oim3^[WkC1V`(y mҍ5T,X({-sOb 4l,3SZ,}@%-7'K-pDCCH 1Yg#lR| a9 {o~:z2aiM%FX u[c )4#sg.L R!/awfn|'3]ɧ?uзP `_lKA+Gl:WOpwJ3u='?65,n!nNȨͶ 0Gk vip>a:ZB ).5@(S xql` -[_!ynG\ѯaal>p |/D+fM6)d([n{_C؉I,v8ߘR-#ᔱx q2k=x v.N `5_Ag Xjd_*Nī3vKW0?N8̊HƀNGܜfD| > ;B 0*7Y;Qa n @1`[o}4SX&4rdݍ׀ѣ{j7g<U ˂;b{{ ^%` 0NY]IF8G7͛ 4Uɪ+/aZo% 064X0hq-DE&}lzFdUئ;@p &Q)䷿ 撷|G%qG>/f 'oFT%"`;ՄL֙3a~ȟ`ӛ[JVN%݉&,"2p?|>;pE4CV1ǀ0Ea& P6 ,`TlGhTПlaXsF8h w QI#1p%B 5: *X4*l=zGGqlnE&`D֣5κ*Qx}k2(%Q`U9|-5_UU!QH%vyѫVUP0 6U$[ *r(NyIh*TU۾3p/@UnK1"l \{-"?GpJ2-v_bJ(j0:qʶp8DLwZL۱hа.(o;c0z} ߔqWװE0AZ۵ #CCNy9@Z|dITm);((;6W )>"hÀ H`gy y:(ZQ}le eAG`CM!_7ᴁ #%DU+4pwnjН[g=k 1.7TV@]|^h`'f.S* yWdTt9(l !;lڃ`_I ywE`-qx{ w" ᄏJoƑ*{Y b{v-v77x#D>aaРpe`\?,O69 $ gۋ#K8|(Ft'& u`*v_P:e_8'|}Pe`'1gkӗ+*#bccp8W4ɒ`ADwxXsp@7;UFcϩ$c`SՓ#0l08d&=O-GYo6^WLV0Q0E I 81N35 =_jBx>qcpc^i ǩ!vSO Ἒ~?|*`R}an7l>{x>iE*p8faCLэ:hQ5 L^/@(܏ڑ.0F!&uC.d4p|GZ&栱g4i]3;匜L|+$"߃ @Q :> (=RO`t`/"P[ #׮#T%G#j&\0%BGCm38> XЍ0k6T6yi$}yv aX2n kmIʼnbg̜7lS`1Ȭ az?&&FV \;]sE< D7h;[k"p# 2FUo$Mc^?B3ێ&ʱZxVNE`W;z^g Ӷ Hd:U E*b'᧟\̟?Q8mnLh ;$l |7y:p/vsU k `Ө ozV| L}д8C}`T#a=E A8 yj#d 2ǏuЊIiV܋{fU*m^dF7wW1gk%[|匙]uOwங3l+ozPvkQwWECMe5Ԯ:&$GU0WF0*R}`-QZ-Eu E=Y/p[76 ζ)4,ʓܐj>Q(*ϽJ+w`vQ_ -oh%-J3T}XRq%kcsDͶ_y2AC/Ws}7fK7e'ʿyz9pSʌA8%,G嘳h_,*XM.:OM轿`*nqN*7'_F4kh n^YmI8.O.+$]yw'Dw/P+ us7{B}xghZW)gADC>t%L|tv(\حgg-R<_ڻ';>_jiU\4cF{qp;: < ;4r'O6LNV`Fn('  ECrZSRڊ;f܁$PӚ]kcpP-5LN=g+*6hӧO);>e$Flo}u*VZQK'xreW~/V 'Xh0(.U!m_F+iQ@#2{ѣ^o,p$Pr:9 (*s#QrʈcAZPnIL3\:VyX4cpQp%vYA<پyoѼ7kS|cs1hdSS *0Qef!^*"?fGnDס#8s>.NaFA [#\3L&Pw(V*/|O㺹.ocH|VN~ & \Ѵ& <䂦8}s ǃ\SaVkP~7D4#{E+KYgrq\AU\4!^߮U>F@WM%Pl\# λ}mܚU*zD.yWЁRo1X vS탘|uZJ{{~9¹RpsW(GEE okW Kps7am7A ʶ]VG l~4EnK/Da E[vo-vT_1[H*os {ni66wUg"lQ֐%D[ ?n38ؠvڔU\ʍW@UB +]7'eNomMHIE."}"5wRYş?{@56VJO@.NѠ뺹Ъ֣x7 {dWB j;cR#j׽+ P k\XZ ܴ񬳦t;NMU XӮU9T~/>_ss \}VTolFn\cѐ1|Է 44L*YsaZk` QJB 7S$p6wbvcHw,~X Ω 1|Kw :y}XC c"ݾmkY&,R\䍠NϯD)rX!XbS]=*hd \Cɚs.t v }sz&~'>x {cBQ7UyQTo;: = 5Z֟ޱ4 28gr/͘R?O#͕ V"g*=1rKyӷ/ȒE]FJ~ցvǪ#ùSJL<cK4p~4t,u%wr2?Kwvχ ?"\椣F?+}GKoi?enb=6H斨pԶ<Whh66}nn!])v F2pg6y8WbzyB"vК-7eUW ­)usv.Qo+l⍵ |<] .N%[1|u%s`6u^]pka А[4 Ty;XUmW}–7i Vɷ>}uCpO)[b!Q7X+i` 5Bz^TS_·=9DN:`&cBr)\amU.ݵ!^{QQ. $)6Nb ss_Ąl{x^ `JLvT&%y]:3Q SK )'o=_sB_aL]Zpsw R%B51`]^[:x^_s@f")`S9~|_ljYxEӆslqxϷv;Um׹71U}QBڂYs 5sAG4^~lp(הN-j:Z[Q*UMp9PDWȞ!c1GjL>T-Wll[})t*\Y\#ԍF\X) +,+ڽll~<;_lQK n.qT4yk/>Oъ* |tG'1:Aqo:D_N(%`!/K`<m'@J>B֐mH{ţ+!^\+3,1OdGvU.&߀ n'1p6I+~1L3p# nݲ'b:`^Tᄸ 7_qOdS$i0rMkYܒi^qP[u@$)hdxw$~#p '/@n/ƮS6M+n|h@3p ~6ߤU ׁĒ1bbqOf8ƄuY |eKSId64~fx)i\E~x\^psR߹ 8Gѡuh#E2 @+n |a"Q)gJW5 B`zsn%ǹ8&9,i{ Bf18 Ag^箠b2qg^ wvzIÆ[pFt"r Q0ڄ7ܠ34R|s1! eKGegAGӌ;׉0iIY1Qi8i f@ +rsYc0Fs 1ԩ'-|ѓ12:>w m$q 3z aBIf-F4q(5p[:PS9PLGZaTlm ߆Z x糙 < A(5NeXȜ1$` p׈x _)"Է){*E$'mxs;&`^.ү aQZa~jÜ%0O/dk B}ю_5 m@=c'$3r)x.e-" | 02QAW> +|Gmkj[_ƪxQvxwƤNd>k+n.L il.;).< 1}E}gTtEdmOUOgHm[;b$վC5hQ2 |ݭ#(g˸oX,;Ś*T Y086SS0r@ YX1At) +1; 0ي~߿]з=WƉ [Dٶ1Q$/;/(2msqCƐ6 ~S<2Ey_#/˕F}KlLf]qO6Gnl.;\ l|RJOÕm yqO& TMe SZrOp&L"LI.eLeԷ5 8,.r} 9Q.9USbg(Wz:skoai$`dq'%^iި38Dz=#Y(OJtr(g??sj-cqO nξyTZq)B(eMgV# $3fvIT^龓2t(赢r[-MA`= cE 0_iVU2lRO%`y$/b*hxX_Gꭶ3& ۳H &{]Eֿ).JI>ܩ!ʰml(B9:{N)&*/ܚUqO(`h||$"p(s 7f hl;2 #:rp,Ob(6R<8+a$Sv(ƿOGy9u{A>܉!V`9ט{RCL`xOr`߸5Hyxq//=Dj,U;0 {< R^)G7/YZ>ǁ9* 0rf @g;[??)=[&51wc#våqYrO=FjbmEEOHio$'9 8bsOY$3HyANC C}$01kO/fs_2 ĴUzBH @)pW=E#ٱ%fGsݏb2O"U۟;3ۄAƩxU [BѭDm@oQfhW}m{ZEJk1`K̟DE,U_.r`YͥADjgt,eE5#Y͂dGP@/U@|5-jYEJ*U(λ[SRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"s'*$eXIfII*nt|(1 2##GIMP 2.10.122021:06:04 00:00:36 )JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((()-Ğ\1ڐi- 'atQS(FzI.)xZ#s [DhXu<\}!\Lj|kI,Ɩwy'r9*>:Lj+[)SЂrkQqvgji) ((((( [ŏUb ӭӧ*H5vec7[lA1_AA^k4.H[K0[I=I'zU+եB4֛eZҨ((j:H3cz6i_bڧ4z] 1-'p?(9:s7qmv[.͸o4t㶧Dp{{mTt2̫d5WWwίyu=(´ z z{D`V} mׅqE22p:bffBC7AF}Exi%$dwoIQs"bKnH1s}h} *i&[ Q2@ʞFpz])vхQ@nuQ8#>'=ZuՉ'r~`;`}ӊJ+*cUjkJ@VdtQՔwvtS9ZG +2Š((+[׈il$S?Hq5|ხj?iV q# qs^PZ@Z0H(أIR*WRW (2 dEoK4h2ܚ$`9#nI_FK`ي[OOry8*#OMٽ*䎣?j,)-ۤRQWONx $yyevyfc$5xoQ%AcI$"zdy=LҾh6,`3¸]3Є#MriR(G`2X24]Dlo9Ȑ(ϮzXUՕ|wcw"BMBGn Wmaׄ&}h0?3#>wҼJ䕆¬Y7{$G e؁ׁWz/<%=얪]?1@F7u 0n=AF)Z7";36+ɤHܯSjIIJ ~<$¾ #ELbG9_cקNz jp[;&9pȡчFkWG]^$}Q]1kzLIq q {׋W9H$V+iKA0<Sh 樢;*Kx$,2 {isuuZEo $8P0RWEE4&Š*E7)F@8 gީؒ<.[6cGs#tfST#v:nqV6i"H2IHJ9,%Ik~-ֵ)FB f#sTii=RDǻcNOWh+t,%_ɺ2cb8GzbRQWc6uhhK١]s8 #ju9c+ sӿJeIyس'$4"Om I5=Y #8$Bg_D?!U#ZuҜ]YVWYF27"*д|c=Ƒ7E+!$kd ֽfx@w?QS JrKmyԌd]zGƭj=NPUR<>LI$Wq=s^A w"P2֒9 ޣ |NGxY#fGRYN#xT{50Ж3+>|GWJդeCѹO#9KJS2<مQ{-sMYA(H#r0Wi=)T|=ZΙtr?'=GPkâ_)(UqI؞xlm>^}}Nc9*IqJhxeIbvIVSt 5KWթ}EQ("PafLn3F}z1;0S5?Ip,̽>};#ecu2`ʦq狈')#:*K$e,NQ Tuwu`fl;+O\z¨;4 1bpsjWvM+<68JGuRyW akļuhxZ;|[*ݿx[l\i۹Ӆ_WѓBݕ@ė )0qu Y.W&NnL"pG +"ú BJ;T\<.rr0xf idIvY$kkx"lXf鞠/ˑָϚE+χŷ`J_:*?~ ?:?_Ra4=WpQE|cdHee8 CᯊľCupjVcg d'Vkw/geq,;Yɷ~ )9'k燙Q^u*[ѮˠL7$T =WɳC-C4oGԆVz__:FC`$E|+OoTH#–ޡōGnZ uG2^iNO9^:pI.MV;`p;}m潶KjQEtNjYxwO(Gr:uVϾc/^V[2 y9>cׯo<yj4zeM0HQ1cכפ|(갿_Bq?gQEXW׷O}qw",rq7)g]]HN qZ޸1Gv|.Wf mnބ'>s⽮s7W_WчSd8byeu4RpY)8<'T2Hlݕ|,O++;ws$4(((_:_:>Si+3?B3?B— ?3+珫 (>oMBeA5j7/sI2dQlGU@]u{wg%i4sz+ޫ~6g`ђVyƪ*JUM|_DiBM O Jp/Fų,QEpo_ad7H0mWד+H+>_ ?/lz0_@ EWyemB.۫i b,ux+kW Z&+Е88w`a]דi^^7W>O{%{ao<ݥSWPl,'qWM(((_:_:>Si+3?B3?B— ?3+珫 (>YVO\G=vm4 0AĄeۦnl+~6g`ђWWm$q6j"Xֶ!H_ʯ<  uMc_5=QEpo_ad7H0mWד+H+Nwے8Np1|ÿ^y]Gb(39F=*Ƨ.Z]^=(`BKZw.XBX۾q^^mGKs%L.Wyq;:pKw9݋/r鼮N>)| [Ic`pTE}#j]ys'w FBE(>w6n[%DyS dVE{'j"pD ͑˕_=z 7jÒV-QY= +okN<= +okN菔~ ?:.8sKN 8j(tG_׬ W!pؽY('Y_<2!7ljNsF9pN֍?i4ϒGE@Wο/ew vZE1 P.JKYnn$ $sT  3TmOWmu;P,ű6VلlxNm-3 ~^^mKq%"QG# [ay=& Sr1RKv (Nc~*έw[w$r9b#{o\xsTlǖAR\Kiu X\Hpz2xE2 + KÑۻf{,BÏn?&!%8#ǜyd¨dZƑsa)̘ T#8 gU)%6󌑼2R$JR:;/Z]rkLB&07=o0?J<[먘cGbx1]s[KmC v#om:1-s\NJ;Zr}*yrs׎eK׭h?һ=It[V–c'9?]IYsw*;㵶f(dv$U%r5xrKtl\^?T\r"%xķwR̎,NIޢd(.kvAk01[A۟Oo= ]oDHBNX9=rw}qbtQEw$sA/ѫFR:?~A4dBh$ =q++^#эL%ocӧ^z|E/i7GE cw] ѵ)&yk##(FT{,#*~L;{^OŭYAR=Ϟ?=y>U#ѫ0qEuQEr^>ݦ_0YB$*C9œ Fsk"}>܏^Ol+Ĥh+޾oOR;$ZRcڤF38&OOcچb@ 2j(C ( ׻S&+Z)I#qGPA=lpGN޼6FH&]FzN<3il=dcA#\JOg Fj>GOendտ[:i@3"&ljWWCj%;{vP`I$ G\{W=\+`~^i_\IK8#`~ל` HfKG8#8=UNwfu #+v|'Uw &̓db9,1ggjkvhn+maluc2k`VUW)9;I%dQE!Q@Q@zSktRW[hI+ ?ziWEVv.QEU=GIh|HPR.q{U(i=ӶǛj \ϥ_ R\6s n< ?{}Ƥ Ϳv}~W4嶇DqU;]Y]#n 4e 5}!Un V(0h=+#UjŭYp2 e֚m3Y[[c Jj!b;`=֍%洩J񷍖dҴsgSTwu(&ITzp (((((]76Y]vK\>U't&VgfE,i|vmls\|qKo ܉aD n<`v⻩:L㩄hSGjaROswV&EPEPEPEPEP| %tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:04 00:00:36X#tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-IENDB`vokoscreenNG-3.1.0/src/pictures/showClick/vokoShowClick.license000066400000000000000000000001731416353147400246330ustar00rootroot00000000000000 [license] author=Volker Kohaupt url=/src/pictures/showClick/vokoShowClick.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/showClick/vokoShowClick.odg000066400000000000000000000241471416353147400237710ustar00rootroot00000000000000PKbR.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKbRNZ7CCThumbnails/thumbnail.pngPNG  IHDRzA IDATxaH@᎔&gi4A2ۍ1UX6`;MYդ~}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}؇}\@b9WS78a=gc΍-}ţ }p(8& oP8P,"}DcRyr>1+3HrYD9IkM>c=ԃ$_&8:=v#i"2VID2|p&.:IǾq|r'oﲻчF.Q"77ߔH"9(e0Gwտ(I4Bsy(TR)}ČUJ$tqVƣlH>z?B#Nݎcὓ{"2AyX#Ͳ_e*Εcʄ5~Y}{>ҿbW}wz߿w}щ{IBX.Y[qsvd׭ %* ͎Djq\b$Cd#nUfu\d#/㺗GH4e.$ /N\K4}D[؟D>!G.>ʋGj߮(}{aV_ #{gE>6-Q/+ x %rdJ>S\b=/,vnxt}܎^N^HӽY>ʾ0b##25W%Gc2H:yGDcٔHw̟~#xsx}xۘ:ᴂ ha!ÉܵK$ãEc#dbWI>Ї+'zP>h"S[FBAR;cz yt~H>sص{%ϗex,}NңJ |q-;]SnmOd׋g \ãc̣+$]d} ^=i-]mט7\3+q}L5#hyh~={-ukͫecpԈE$eʘ#bqb}̧AR/Y>fDŽR8Y>fr&nclq19 ~ҹV!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"!b"`8[cIENDB`PKbR*CCmeta.xml 2021-01-17T12:42:372021-05-30T21:35:05PT54M58S10OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-9788PKbR settings.xmlZ[s6~0}h`CLNcn~9#ladɕ bm<"owҮn_R|Q6q.=%t"~ɢ9"J8񐹗ѡ&s&8d~Bg1x ~s7Y$%Epa P $  y@שLC6Jǘ Y`AX2vŇ*nO5Ԑ{p!hI p]M%dҰh O`%>>`,}W..qHr_s|Js6ѹ4M**~޽sbO-di U)*_Kq*MkjnoɘAiKnLطhFش wl"qBGɢ l'W4Ys7GtU% Ϟpkw8&"vA6:d ӊ\ ~\F$alۄ[s!a|]~rOnD cQV(״؇u? .jɑeTCR >GbU,3p;dQ%/ijXiU%z 38xF`6[4??Ӄ *)qa)co<% !ȲMbdU2ZV/{3i ʳѵ!ev2*`ĜNBN8!₶ 5W%=]&7op;#gIGH<;!ya}ZHʄLKP~q̈́(BiP^޽:"^iQ$uC5x+㞾7^<5sm"mڸ]/#y 64-tX2(.`$f#Z~)/r] "r8pH9׷۪40 ӳ]uFsR/_kZ$f h-iwuaY=>Q\dss5VŮCob#+;gh3Yb!CNu*(dj GQlKR/̕q6 lʖ:L5+*\b9w]*A>X8nuŪcIA2FlCJU:]n"|Èl.3Tf::4y , %Lq֬<>e+\=<H)'ѢLĞ,&0aLhDU0iKgN@9bb=yaN S\h\t\Gb"%+v)3"J)z X[:7.PTY-Xy]C@a;hj0AKl:KvdYonbNR9b۹X L3A07:pckCrY!QUДђ"4!ePD=f0"9Y$y{AJ^Mk5&Ãc,FUPh.Rt8eBVsBZfّjhʨsM DtWjCĊLͿǛJ~0 I( ׊rOGj|yEy,I/0shD(#ߨ,w=_\b71Z2VsJYZ)OArLS[O{ Bޚ@{ЮՒ $9lr!+KPAjw M87,+g|/|p0՝PKZdPKbR styles.xml[r۶Shi HNl5rm=&@$( ZV^}ޝ79Or?@DS3s ` >g;"*ʋNoB'X/߽A޷_iJcHx\礐[F (0^-I񂗤hBP`cյ-ɽd;x5ZNތUVC)G1K,K/\fnfS.~xuuknkpʕ`Z*}ˆzYods"XkRQ+"FC%>R D]ru:u]w q2KƇ,qus,oyW".%ہ*v9筩J$67 oQ񍠒G<>*c4 }@N|wNhAv HpAGCdBU(=)- oڒɜ mD"IzEQj/ti}HE BJƛY"Y:vJB["&wNC@UX(K/(C PY|;`%%(U; DIZ oўܤ#dKAb٨qY)֪p"suE!QZI\_P'$5ۀbF>R Iaې%XZpkɫ+hBṴ̆gʺeK**~ EV`X:apT́<@rհR[Z$D%Q!zbVoWxՊ++`ߐ /9㰰JQ'&6ȿ:Z3Tgiuj%]jEzjwe􋷋N6沩?*, wMLqC]oTq6 ԏ-C*jQ[:R|yJ3DIN&n(GL/S%> UXVx}JK0&'{)%ON|vOv.?_'Onwwd$T'- cy>?)KS4'pJ}s|Nv>bu M1In޲3>;i1N+[4Q8IJӁu4͉g=RYl$?ќ"_Og9g]mSҡ>v]2&vpү7#s$=YYiFWa@b SNjIʃ"io#5@K<@խ\ gb;U+.*>x2r\IݕPpJT~4^7>;{ȘH5,C ΎH 0XgƝYzw ]:Q3=0? ?PKܗK2PKbRConfigurations2/popupmenu/PKbRConfigurations2/statusbar/PKbRConfigurations2/menubar/PKbRConfigurations2/toolbar/PKbRConfigurations2/floater/PKbR'Configurations2/accelerator/current.xmlPKPKbRConfigurations2/images/Bitmaps/PKbRConfigurations2/toolpanel/PKbRConfigurations2/progressbar/PKbRMETA-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 s9|y ))))))))))))))))))))))))))))))))))))))))))))))) {),hVE3% A`~=ooAU(PՒSVqJ|N`qURfKQBERmELe"2,߿?jFa);?Eu KEe9\EgK#8޸Qs>콰{_dg-0Z0o?_@ X,Z o뢼.~2eä A|?2IԂLv,,f¥)R`1`|:Gf5'bH @4:v9I1oH[<) }1nNa)xx{ n¸'9I @ p"-?s6b| }flk=ĆtՇz ssKon3_}ԡhXw݁Z8`o`۸pyd4սĆ"W8a=A @.|1|ܓJ $ܖΉ*!ݖqk. <[}Bu.悛{!`HW(p&1`l AbWWKAV8>Zrk✥R;u|Ʃ5~3p07c{2a3 @+~?l^_ < <a&i+=J wI2/5IUU=8 ^pse<+x,L)QĽ~|S Zv?xu1~H]1m0ex/P8sgCH EaA,BXP'k4:'3 nN+tXI bt(W`{oivՈÀC@vǜ_wÈop\bv*׭D.sxJgɊ[-]1)<sm}kZw@>n9>[r '467wNr00 &6b*3T劦7lϹCPR(y><>m"l u@.Ffyb\wp h5/_nkh,v`o$ї.~-M5ֶp g@Mg໮[;ֵ ?_8ŸUxnXiQھ;Le%(ʴǚ:E|xmm-~y#߱tk,W?;!CG~\^h{,235m(ӦXSo/L}5k%=7`A^ƊJTZ9c~S^Q + _܁y&d,3fŶ^3 SG__nc{^Ga5!]8U<哘 =.;e;?~EDɞ*Ͳ3:6MX zj _KR SWc4jM)k Kv([Bs𖦚ž|E]Xm|Gc o~uM^3WÕ&PBGG70e1UXDn cAe78kj+~ZչJ״>E# a4p ?.k7,ՠDyA* r*ReDɢ݈i)fy^q1m5'S3M< sЂ[WS*zHMcHzv}&S&Qx^׎1:Gx=D$?Ĩ&6_sP!ZLQSTdUK};hǦ佮 'a^:CKS.pfYKKQs\ks00AUX~dLNM7&TxAX5֪E|-dJ4DfTAD2΢V߶)[8Wa ^1]7.8g{\5`km~]^h/Q}a$ u0[xMk<<}OJL |b E1ՎPHi;Wo{>\|QHEG@Oo-ɽG$@T`|/ʙܰF\|2gZ|R v. k@Q:1G?8 ‘Q\ATfyűϐN4|~%nIfOoyE==\`rxQjl `PD('*!k_|96 WkH?}zEb+@,E;Y 1!trsTy=PNF |uX+Oh,aXw1au.]( ){L?9Y=?Q.tn#cڇWLKӡ ݖoT W15B-8^ Eq5`t#AkTkjlu鏹nf ѯž{С)$&xgn+9 sQN߰. 5hBsmw{Z&V' Ts@3UG19uЅPYP;k(|ֽzMs/!(ǞyC3Uo>W_tT\f7UHr*ȭMMuQw kIHn( PA5y]HsV1[?|PX_̮HЁ<},p,*ȹDb{;Yد/8?,`6^● k ~h@࡛:'Kp&>pzʁG) .4GuKQ ܺ! ->/ Sf^Dିp1]l~5Vzb7'J5O \jN5+(g/t@9 %7 /v7LOōKtfqJd=H.TE#!3'BӋ&0 a{HUj1ʾX*klL6gŝ,e~ ܂qv|˷e0 lܖ݈ŷ>5Oim3^[WkC1V`(y mҍ5T,X({-sOb 4l,3SZ,}@%-7'K-pDCCH 1Yg#lR| a9 {o~:z2aiM%FX u[c )4#sg.L R!/awfn|'3]ɧ?uзP `_lKA+Gl:WOpwJ3u='?65,n!nNȨͶ 0Gk vip>a:ZB ).5@(S xql` -[_!ynG\ѯaal>p |/D+fM6)d([n{_C؉I,v8ߘR-#ᔱx q2k=x v.N `5_Ag Xjd_*Nī3vKW0?N8̊HƀNGܜfD| > ;B 0*7Y;Qa n @1`[o}4SX&4rdݍ׀ѣ{j7g<U ˂;b{{ ^%` 0NY]IF8G7͛ 4Uɪ+/aZo% 064X0hq-DE&}lzFdUئ;@p &Q)䷿ 撷|G%qG>/f 'oFT%"`;ՄL֙3a~ȟ`ӛ[JVN%݉&,"2p?|>;pE4CV1ǀ0Ea& P6 ,`TlGhTПlaXsF8h w QI#1p%B 5: *X4*l=zGGqlnE&`D֣5κ*Qx}k2(%Q`U9|-5_UU!QH%vyѫVUP0 6U$[ *r(NyIh*TU۾3p/@UnK1"l \{-"?GpJ2-v_bJ(j0:qʶp8DLwZL۱hа.(o;c0z} ߔqWװE0AZ۵ #CCNy9@Z|dITm);((;6W )>"hÀ H`gy y:(ZQ}le eAG`CM!_7ᴁ #%DU+4pwnjН[g=k 1.7TV@]|^h`'f.S* yWdTt9(l !;lڃ`_I ywE`-qx{ w" ᄏJoƑ*{Y b{v-v77x#D>aaРpe`\?,O69 $ gۋ#K8|(Ft'& u`*v_P:e_8'|}Pe`'1gkӗ+*#bccp8W4ɒ`ADwxXsp@7;UFcϩ$c`SՓ#0l08d&=O-GYo6^WLV0Q0E I 81N35 =_jBx>qcpc^i ǩ!vSO Ἒ~?|*`R}an7l>{x>iE*p8faCLэ:hQ5 L^/@(܏ڑ.0F!&uC.d4p|GZ&栱g4i]3;匜L|+$"߃ @Q :> (=RO`t`/"P[ #׮#T%G#j&\0%BGCm38> XЍ0k6T6yi$}yv aX2n kmIʼnbg̜7lS`1Ȭ az?&&FV \;]sE< D7h;[k"p# 2FUo$Mc^?B3ێ&ʱZxVNE`W;z^g Ӷ Hd:U E*b'᧟\̟?Q8mnLh ;$l |7y:p/vsU k `Ө ozV| L}д8C}`T#a=E A8 yj#d 2ǏuЊIiV܋{fU*m^dF7wW1gk%[|匙]uOwங3l+ozPvkQwWECMe5Ԯ:&$GU0WF0*R}`-QZ-Eu E=Y/p[76 ζ)4,ʓܐj>Q(*ϽJ+w`vQ_ -oh%-J3T}XRq%kcsDͶ_y2AC/Ws}7fK7e'ʿyz9pSʌA8%,G嘳h_,*XM.:OM轿`*nqN*7'_F4kh n^YmI8.O.+$]yw'Dw/P+ us7{B}xghZW)gADC>t%L|tv(\حgg-R<_ڻ';>_jiU\4cF{qp;: < ;4r'O6LNV`Fn('  ECrZSRڊ;f܁$PӚ]kcpP-5LN=g+*6hӧO);>e$Flo}u*VZQK'xreW~/V 'Xh0(.U!m_F+iQ@#2{ѣ^o,p$Pr:9 (*s#QrʈcAZPnIL3\:VyX4cpQp%vYA<پyoѼ7kS|cs1hdSS *0Qef!^*"?fGnDס#8s>.NaFA [#\3L&Pw(V*/|O㺹.ocH|VN~ & \Ѵ& <䂦8}s ǃ\SaVkP~7D4#{E+KYgrq\AU\4!^߮U>F@WM%Pl\# λ}mܚU*zD.yWЁRo1X vS탘|uZJ{{~9¹RpsW(GEE okW Kps7am7A ʶ]VG l~4EnK/Da E[vo-vT_1[H*os {ni66wUg"lQ֐%D[ ?n38ؠvڔU\ʍW@UB +]7'eNomMHIE."}"5wRYş?{@56VJO@.NѠ뺹Ъ֣x7 {dWB j;cR#j׽+ P k\XZ ܴ񬳦t;NMU XӮU9T~/>_ss \}VTolFn\cѐ1|Է 44L*YsaZk` QJB 7S$p6wbvcHw,~X Ω 1|Kw :y}XC c"ݾmkY&,R\䍠NϯD)rX!XbS]=*hd \Cɚs.t v }sz&~'>x {cBQ7UyQTo;: = 5Z֟ޱ4 28gr/͘R?O#͕ V"g*=1rKyӷ/ȒE]FJ~ցvǪ#ùSJL<cK4p~4t,u%wr2?Kwvχ ?"\椣F?+}GKoi?enb=6H斨pԶ<Whh66}nn!])v F2pg6y8WbzyB"vК-7eUW ­)usv.Qo+l⍵ |<] .N%[1|u%s`6u^]pka А[4 Ty;XUmW}–7i Vɷ>}uCpO)[b!Q7X+i` 5Bz^TS_·=9DN:`&cBr)\amU.ݵ!^{QQ. $)6Nb ss_Ąl{x^ `JLvT&%y]:3Q SK )'o=_sB_aL]Zpsw R%B51`]^[:x^_s@f")`S9~|_ljYxEӆslqxϷv;Um׹71U}QBڂYs 5sAG4^~lp(הN-j:Z[Q*UMp9PDWȞ!c1GjL>T-Wll[})t*\Y\#ԍF\X) +,+ڽll~<;_lQK n.qT4yk/>Oъ* |tG'1:Aqo:D_N(%`!/K`<m'@J>B֐mH{ţ+!^\+3,1OdGvU.&߀ n'1p6I+~1L3p# nݲ'b:`^Tᄸ 7_qOdS$i0rMkYܒi^qP[u@$)hdxw$~#p '/@n/ƮS6M+n|h@3p ~6ߤU ׁĒ1bbqOf8ƄuY |eKSId64~fx)i\E~x\^psR߹ 8Gѡuh#E2 @+n |a"Q)gJW5 B`zsn%ǹ8&9,i{ Bf18 Ag^箠b2qg^ wvzIÆ[pFt"r Q0ڄ7ܠ34R|s1! eKGegAGӌ;׉0iIY1Qi8i f@ +rsYc0Fs 1ԩ'-|ѓ12:>w m$q 3z aBIf-F4q(5p[:PS9PLGZaTlm ߆Z x糙 < A(5NeXȜ1$` p׈x _)"Է){*E$'mxs;&`^.ү aQZa~jÜ%0O/dk B}ю_5 m@=c'$3r)x.e-" | 02QAW> +|Gmkj[_ƪxQvxwƤNd>k+n.L il.;).< 1}E}gTtEdmOUOgHm[;b$վC5hQ2 |ݭ#(g˸oX,;Ś*T Y086SS0r@ YX1At) +1; 0ي~߿]з=WƉ [Dٶ1Q$/;/(2msqCƐ6 ~S<2Ey_#/˕F}KlLf]qO6Gnl.;\ l|RJOÕm yqO& TMe SZrOp&L"LI.eLeԷ5 8,.r} 9Q.9USbg(Wz:skoai$`dq'%^iި38Dz=#Y(OJtr(g??sj-cqO nξyTZq)B(eMgV# $3fvIT^龓2t(赢r[-MA`= cE 0_iVU2lRO%`y$/b*hxX_Gꭶ3& ۳H &{]Eֿ).JI>ܩ!ʰml(B9:{N)&*/ܚUqO(`h||$"p(s 7f hl;2 #:rp,Ob(6R<8+a$Sv(ƿOGy9u{A>܉!V`9ט{RCL`xOr`߸5Hyxq//=Dj,U;0 {< R^)G7/YZ>ǁ9* 0rf @g;[??)=[&51wc#våqYrO=FjbmEEOHio$'9 8bsOY$3HyANC C}$01kO/fs_2 ĴUzBH @)pW=E#ٱ%fGsݏb2O"U۟;3ۄAƩxU [BѭDm@oQfhW}m{ZEJk1`K̟DE,U_.r`YͥADjgt,eE5#Y͂dGP@/U@|5-jYEJ*U(λ[SRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"s'*$eXIfII*nt|(1 2##GIMP 2.10.122021:06:04 00:00:36 )JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((()-Ğ\1ڐi- 'atQS(FzI.)xZ#s [DhXu<\}!\Lj|kI,Ɩwy'r9*>:Lj+[)SЂrkQqvgji) ((((( [ŏUb ӭӧ*H5vec7[lA1_AA^k4.H[K0[I=I'zU+եB4֛eZҨ((j:H3cz6i_bڧ4z] 1-'p?(9:s7qmv[.͸o4t㶧Dp{{mTt2̫d5WWwίyu=(´ z z{D`V} mׅqE22p:bffBC7AF}Exi%$dwoIQs"bKnH1s}h} *i&[ Q2@ʞFpz])vхQ@nuQ8#>'=ZuՉ'r~`;`}ӊJ+*cUjkJ@VdtQՔwvtS9ZG +2Š((+[׈il$S?Hq5|ხj?iV q# qs^PZ@Z0H(أIR*WRW (2 dEoK4h2ܚ$`9#nI_FK`ي[OOry8*#OMٽ*䎣?j,)-ۤRQWONx $yyevyfc$5xoQ%AcI$"zdy=LҾh6,`3¸]3Є#MriR(G`2X24]Dlo9Ȑ(ϮzXUՕ|wcw"BMBGn Wmaׄ&}h0?3#>wҼJ䕆¬Y7{$G e؁ׁWz/<%=얪]?1@F7u 0n=AF)Z7";36+ɤHܯSjIIJ ~<$¾ #ELbG9_cקNz jp[;&9pȡчFkWG]^$}Q]1kzLIq q {׋W9H$V+iKA0<Sh 樢;*Kx$,2 {isuuZEo $8P0RWEE4&Š*E7)F@8 gީؒ<.[6cGs#tfST#v:nqV6i"H2IHJ9,%Ik~-ֵ)FB f#sTii=RDǻcNOWh+t,%_ɺ2cb8GzbRQWc6uhhK١]s8 #ju9c+ sӿJeIyس'$4"Om I5=Y #8$Bg_D?!U#ZuҜ]YVWYF27"*д|c=Ƒ7E+!$kd ֽfx@w?QS JrKmyԌd]zGƭj=NPUR<>LI$Wq=s^A w"P2֒9 ޣ |NGxY#fGRYN#xT{50Ж3+>|GWJդeCѹO#9KJS2<مQ{-sMYA(H#r0Wi=)T|=ZΙtr?'=GPkâ_)(UqI؞xlm>^}}Nc9*IqJhxeIbvIVSt 5KWթ}EQ("PafLn3F}z1;0S5?Ip,̽>};#ecu2`ʦq狈')#:*K$e,NQ Tuwu`fl;+O\z¨;4 1bpsjWvM+<68JGuRyW akļuhxZ;|[*ݿx[l\i۹Ӆ_WѓBݕ@ė )0qu Y.W&NnL"pG +"ú BJ;T\<.rr0xf idIvY$kkx"lXf鞠/ˑָϚE+χŷ`J_:*?~ ?:?_Ra4=WpQE|cdHee8 CᯊľCupjVcg d'Vkw/geq,;Yɷ~ )9'k燙Q^u*[ѮˠL7$T =WɳC-C4oGԆVz__:FC`$E|+OoTH#–ޡōGnZ uG2^iNO9^:pI.MV;`p;}m潶KjQEtNjYxwO(Gr:uVϾc/^V[2 y9>cׯo<yj4zeM0HQ1cכפ|(갿_Bq?gQEXW׷O}qw",rq7)g]]HN qZ޸1Gv|.Wf mnބ'>s⽮s7W_WчSd8byeu4RpY)8<'T2Hlݕ|,O++;ws$4(((_:_:>Si+3?B3?B— ?3+珫 (>oMBeA5j7/sI2dQlGU@]u{wg%i4sz+ޫ~6g`ђVyƪ*JUM|_DiBM O Jp/Fų,QEpo_ad7H0mWד+H+>_ ?/lz0_@ EWyemB.۫i b,ux+kW Z&+Е88w`a]דi^^7W>O{%{ao<ݥSWPl,'qWM(((_:_:>Si+3?B3?B— ?3+珫 (>YVO\G=vm4 0AĄeۦnl+~6g`ђWWm$q6j"Xֶ!H_ʯ<  uMc_5=QEpo_ad7H0mWד+H+Nwے8Np1|ÿ^y]Gb(39F=*Ƨ.Z]^=(`BKZw.XBX۾q^^mGKs%L.Wyq;:pKw9݋/r鼮N>)| [Ic`pTE}#j]ys'w FBE(>w6n[%DyS dVE{'j"pD ͑˕_=z 7jÒV-QY= +okN<= +okN菔~ ?:.8sKN 8j(tG_׬ W!pؽY('Y_<2!7ljNsF9pN֍?i4ϒGE@Wο/ew vZE1 P.JKYnn$ $sT  3TmOWmu;P,ű6VلlxNm-3 ~^^mKq%"QG# [ay=& Sr1RKv (Nc~*έw[w$r9b#{o\xsTlǖAR\Kiu X\Hpz2xE2 + KÑۻf{,BÏn?&!%8#ǜyd¨dZƑsa)̘ T#8 gU)%6󌑼2R$JR:;/Z]rkLB&07=o0?J<[먘cGbx1]s[KmC v#om:1-s\NJ;Zr}*yrs׎eK׭h?һ=It[V–c'9?]IYsw*;㵶f(dv$U%r5xrKtl\^?T\r"%xķwR̎,NIޢd(.kvAk01[A۟Oo= ]oDHBNX9=rw}qbtQEw$sA/ѫFR:?~A4dBh$ =q++^#эL%ocӧ^z|E/i7GE cw] ѵ)&yk##(FT{,#*~L;{^OŭYAR=Ϟ?=y>U#ѫ0qEuQEr^>ݦ_0YB$*C9œ Fsk"}>܏^Ol+Ĥh+޾oOR;$ZRcڤF38&OOcچb@ 2j(C ( ׻S&+Z)I#qGPA=lpGN޼6FH&]FzN<3il=dcA#\JOg Fj>GOendտ[:i@3"&ljWWCj%;{vP`I$ G\{W=\+`~^i_\IK8#`~ל` HfKG8#8=UNwfu #+v|'Uw &̓db9,1ggjkvhn+maluc2k`VUW)9;I%dQE!Q@Q@zSktRW[hI+ ?ziWEVv.QEU=GIh|HPR.q{U(i=ӶǛj \ϥ_ R\6s n< ?{}Ƥ Ϳv}~W4嶇DqU;]Y]#n 4e 5}!Un V(0h=+#UjŭYp2 e֚m3Y[[c Jj!b;`=֍%洩J񷍖dҴsgSTwu(&ITzp (((((]76Y]vK\>U't&VgfE,i|vmls\|qKo ܉aD n<`v⻩:L㩄hSGjaROswV&EPEPEPEPEP| %tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքtEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:06:04 00:00:36X#tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-IENDB`vokoscreenNG-3.1.0/src/pictures/showClick/vokoShowClick.svg000066400000000000000000000160751416353147400240200ustar00rootroot00000000000000 vokoscreenNG-3.1.0/src/pictures/space.png000066400000000000000000000002711416353147400203540ustar00rootroot00000000000000PNG  IHDR2K^kbKGD pHYs  tIME ,5"t5iTXtCommentCreated with GIMPd.eIDATX1 Om /:IENDB`vokoscreenNG-3.1.0/src/pictures/systray/000077500000000000000000000000001416353147400202715ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/pictures/systray/camera.png000066400000000000000000000173611416353147400222370ustar00rootroot00000000000000PNG  IHDR@@`UzTXtRaw profile type exifxڭi8sq'>KfFtTFUH`0qsRS|/|MϫϿ\>\ cuCyopWb80g2?4~ɣ[=МDzE\wm{n/z?P|;Ϗ;\*^x.ps*O^1>essi+/!7p;M]?96dflb$`~wߐve`"X x.$]/aNJ:+!\_2!x6gc}eGC5-tcx@_)RʩZ9SιdT/ĒJ.Jƚjjoh,]-jkwcg΅GqGu'qguٗ_aAʫmN;nv‰'|ʩ׫zwkkqk\.c ':I"h/9n>\!$*<v>/.K'4jea[)'F#m!w~J85x9׏'s'==k/=~zd+ո cϘҝNcug15(_3,.QZnVS{_cG 9p:m~"aҾRU[å]؀!2kqoJ41'fm10 "؀ JrGcA"b56*m[+ ,hE8-]T&zy1hf9%@sM<"IW#F9 `ej \*t9qȾ| 2Y0=APڜ{+\@@ 㡈d,[bYc!@~|x:N a ˺e}ExBE0JR|.3VrhMa#)Fb L1 a)J円9) j@ 3551QQl Y-ikUg%XE@'PP(LQ2" hRd \>2o̹" b2,(,EܐkcnHTa̹3S|Y 12P }r䴡4b>MYHTCj2N".9+@Lʩ!̂I}eP/ҙGWȈ 7$IhgWџq$"M "̄+IG6 |@ '$Gƙ's4H]jFj,@4erOHFQq y!ZcRp#|Ԗb !Љp_bTUhx=Vϣ0%nI@:+qhTT!L 9TP_dEwR@T:8 ղj%YqJh-*FiR0S} ˈE h7Mj{t4Id:e6fT7HȢ_DR4u#V@`Tܡ$$cTrACPv)Ѱp:!eDmaJ#Òjd86AԴ Gh{E*J1>ަl) U(!l[jeB Ʃڀh)P`s5gþY@őF[]LlmM-)H V(P[ 0=Fvw~I2/2^ 0ti6Z' QQ2ou$%$XL 'ey9QAtgC\bhAE)2#/[KL9ub]ʴj&ץ*n5Ʌ ( 5> y=A7ڀFh]%W<)ms&44Y]HxOAS U\76 4642 PWO& -ZM dȅ"^JNpGt~UDUzRQuS@!Ue% 6%~.Z PR=FR$I+P*K35ޫp,DmC-̈́Bj8)6EYCR}9uKYZ,jnU"{bIZ(d!^7&,*JtP,smJ )p6JA$q*YDV`d-'4lڠb_~uϘVH1g4e\I)ݜ4\e=.{DaW2zB/``x@zi) $v?~!* |:jl5h#Ogq*مin0yDnԤhb:wfTOѧ25X%;ԔQ5Ǿ)u3oQew`tW%(T&$+޺nqxʀ_ESP⿨[>eFE2^!VUDiς6rc#)/m%sE~QOY ?[Wyy4EՈK]弄t8ܪ`<w mP 7֖NXUW֞PTS ?z3R)GvP):gg[G婈lv.{ױ\Qg>_j`|ܘq?|,eA܌eЁHDnвz.hֲ6e5$_s M0'gh!GVE[m€D:Fa0n*d& %':hֿq8>#WNij+,{ 5-&T|km@2_Yp<ϟ'UkYp ɫ) NEk׮F׮fl*µvZq`{m<^YM,Fg((eC:,bBx:-}}5%}$gDvFhR1Q p$'؟8> (q52o5]%3k k~z9?1YP5"']I>Q+;՟煠Vop&e)6HAyTɐks)[_՜G>g8\ O3sbP[yRwvRe1|Vn"0#g8XN!a 6QICЭf;{P30\-V¡CQoY\'꫌q ;8Y!"E9zY,m([Y ;znnE"8 `;DAJ۠nQa?f_f\%m_q#x,c.b42ij'HU=80FaYX!e0ca d6i@Ҫ襋^z7,\.[ N1b.J(T񑄹P#dYEH=\~*6X`0JPۦXD4P$I&0>1c =x|dX /z 1q0(!*00'LCL2x|8(DUnd,P%]k*Q81z.J88Ep0@3Hn,&R= ug CR *Q~*U6 GX20$3` _$AX[NP8YSL&XG7y$PঘPʲE[4w4bѫix B8alxYm.ZZ.OtLAD ldQ$U4:eɤLE#4b%x4ZrJIȸ`Jyजi|EM?&[4!l2ns+ p:YsL6EYj59O M@e+Ca1&qb5%DO4s2O:D"d2Dj4 `.9SLZk30ז'd(JQF\ĶW"Bf$8m&d2N/y`\..bF3G!3}ZB^avB"+kH/ElFFèzBRt)ƽ!$#rHJ"U{ޫ%rob8#/%gnz:TSp+hM0&1 cH kHiK,P*:K4 vsLӲ儐eJl,)XPz FH~(f(g5/g͖"K&T]@a=AȳI엇hv= "PtV=Թg9Ra O$HlhrQM@Y5hJhw#rE%Gy)XJ^-EL0zaPT0=rHyLP^uߡ<=f8@sE @;F13Cpu`OZs[+(&?颴/IDT]vr_PXAIENDB`vokoscreenNG-3.1.0/src/pictures/systray/exit.license000066400000000000000000000001361416353147400226060ustar00rootroot00000000000000[license] author=tango.freedesktop.org url=http://tango.freedesktop.org license=Public Domain vokoscreenNG-3.1.0/src/pictures/systray/exit.png000066400000000000000000000072111416353147400217510ustar00rootroot00000000000000PNG  IHDR@@iq{iCCPicc(}=H@߶JT ␡:Yp*BZu04$).kŪ "%~Zxq}w@Qa5hm 1[ïS,cNR_.γjb@@$eioOo}bdxԤ ?r]s LzX t0+$qLtf=V9oq*5ֺ'a4,sX$PPC؈Ӯb!M ȥ FTAvVabK&»@8ǎ<BW';붦;!+h )=k^Z8}2ԫ pp){ݑξ[^r\ cHRMz&u0`:pQ<bKGD pHYs B(xtIME] izTXtRaw profile type icc8S[#1)g8ݖJ'dEj\(anAV#`V= $w$hT22( W*a3_ޯ*F: E\0Cx:t9H|BtL<=| kXsq: 9ofRȫx{ЩjgYV nD_7YT |?'!}kQJs;/!c]s\ @;/]Уb"̞H[ŋ\OE)%"|d3Rٺ8[ [M0[_W%e$*m3:LH-S&vmܴۄlxT4lmD{n#/fC4i ܞt7v"TG2.07)tvo#ѳ7 F IDATx}lU?ܗzRl]hqaDc ӆHpj4hHpnnΗ% $P bG0DNkaTl }yǽ9Br{9>{鹅`+X VKd`ރi-0ن&X%'@B1iO`f\Uh(2[aUG53fpڵ[ni}U"p/͋X]5#|CWӖ/)hjXW>R z(6nlh`Ֆ< %W4RJ(a1;Pyr˦8Og~nٯ,͆M0%@ t4 BafRb֬mhmWJ)Vᩡ![ZH=-O?/fD%[{> 2펓%)8rm]3~.xSfjCF S-(}!`Y`YeYXVZ]#d\9XzB|nST`# ^,xo5()##X= \%Kh$*ﺋSh{U'~` 8qY׈;`{{o]|HȂO\`i)SC k֤;:pB 8"WWVuAf\etK`9F{5)]w#qf^=: 7ÃJ1>$q qR,Xm!3d "M"we}4PpaH&xBȻfMWp!PZJ}(Z,k"MUYJ!v+%z G[ :m{nFHN8Jlt伒rL5{QRXRb+pՄ>#{hdCCuaQ# J\KٔvC~-~&ǡNNEqUuVK*+-Pwi Dz7*)yK4 Pɋhd4J*'52Hۆ`;&PRop}qOoX=W5Òe? ؋ `sm$N_ɾ>RB$ aL(c2c 8 3cɝ;gIEYG9jdDo/_,\h#YIVi&`}xP##ȁD,LPf*qubG?b,g 1Vpq$ABʶl#*J$IT<-e6uTeF!}eeBym-]DO'vpRß\% @) GFHkxhg\-Q0ӮϹn,vBŰ2 @qLӦ|<p[poYL?Is;}t ?gnr t/8n6IEt}Sp%K(>;wѣb}1ZKeEYܹ--tú_(pq<"kժ@|۠cDx<^hjj44084 Xob\&yٹ48t.UU|9gǮ]b(< ;^Dhε/ ~1^*Gqh^5iyug~V:ahuMA 8;?*y9+p^w!%%ʼnx| ,{ 9.]Xkl^hD<?\x$\tX"$K oB`+X V2ކ`FM%tEXtdate:create2021-08-08T10:21:26+02:00[I%tEXtdate:modify2021-08-08T10:21:26+02:00tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/systray/magnification.png000066400000000000000000000340001416353147400236040ustar00rootroot00000000000000PNG  IHDR@@iqozTXtRaw profile type exifxڭYv$;rDcZB`@5G*~-&2#g?UJ-_;__?o^\y=@|_S? WНlPu>|Ycz?~^;uup cڕ6?0wYec?yݥ?^߷;;Zŭ;gs}硾ž9},7}ߍkG;Osrt-F=O|*o~ ;<*x.ދ6ݏUWzbϟ/o9 sm+5lCӿ\C4}scLfw%Frb+Û.ve}D;]H.x_ÎtvC$إ!dSgk}eG$R:Ί1LUB?)RʩZ9SιdT/ĒJ.Jƚjjo`,=-jkwncgađFeFό3<ˬ; xV^eVnJ;.!N8O9ӿ^sk5oux%$gxGNj<@@{.F/go !yv1<o_?#x~xxmu`RbS2~\k::WRS8ƞg2(zceݫk,etv['W˙óDal-=Ҋ?E̿є&Ǘ{\} 0199 >2ƞ.}=znzeWܦ7W; {+eA|:ֱ=6s0n`c޸uUznH9Ofٞ%l~z=3`tbqWR2UxRkڻ<'X".'fܐx9³8-G!w %H 98:#lE¸!K bR-*'nץSgeECª}Ó"U;̞ Ej6s|`ͩ{g2h&M{VFdΌeE.9[.hfuS,xְ"@̄gNh ^D'IB \j_7"I, [|jldCOw{C&D'^Ƃ6RWz,gB4t {{c&'h {jf61r`Yn8\F{\!:>;u b܍\κ[ zEq9k*ٱ{~2E^r"v^ Ee!u>؃ F$)\)rA dGeٍrI,T Ʉ1 ,pR?jDЎCk:L4[OdkG_~ 9%X8lAB*Rb;) &U/l}(u~7 l=! $Ż?xXG>p6]6 xSD`lS&"$ mBnN-gR:PQ,Gai<"! Ǔbc ф@GFH:>u8 7x=k=Y?ƎJ򯫀X)tH8/L,RF#V`$5DbVB4˵͸vE4ȈKt~͞ʇ2$َO34 5VGOoF %vN=-f#j>f485^1x"Gpmo% mBZW)S(rb4y*.V%FX|ĆDDr;OkX' zVa-pLH)",}*H;`.ܖ &ŶAzR#r -qf)ߔ_MBE3+֗RY-鵎=έ]ۋԠHQGG2rķ !2'GE/9g5\K@u[sރ6D<0'xZvО^_rʶ2!ϕ~+!AoΈ'ju->+|SA%9,zx/ o9LΫ2H_0 }R1L}qQm^8 qzX_YcٽmL$Rd]"J`rRRat"y'cD,޷P! ZHB.Ά`!#8`R$+qL tWASwzRT7# 0jʃ"El'A|M 1i l. 61iA"" ^mȝIvÂ6Rn)$LeIH #!vI7+EW#_$ :_2_QTHmĊLԝUJ܏p RjemMPWRCܓ^9Eτ 3e 2>qljóD̏mR$!=yQ!C$͇|jq${',A Gzzi9mm,U_X{LDd#F ,!NJN\Cx,P^0_|oO1HP!s%uF;!W-C"8#ls b|,sgsHTA+QwKD-Dǂ~9A mAa ۴4}# t*o !O-B]0Yt3=)ª M/]Š:SQYOVɽ"6 _UiB~v5|īQT놷c. nS#NxpZJVpTI NOqڋ ͡*mɗx-1 ԉA(Y$:(5?`xɎ*>C_!+²p.94H)ԨSϴ:t c &U_-fK)qr4@~$sxz) @ pzɷQhwdΊ|&>x5Q=EF 8LUAo啣|oJ9 Rbe3ظmA yێ$"?wD.d֪*nԼehV Vݒ s mC|<( J(լaBXrkx^V*K&Z jPH $X#x/Қς kg[nX0Dc@OSL([ g1+35IiՐX6JEG[M>g 9&oL&sP6p&-O`7ojR%rA5 N΂EАB~t)=q?q1F "rAX mk9nA&[U~q*ʬz;mi6F>?NyhÃQ_ȗ\;}wްlxүܢ:KtDO0F6 Di-RQ5^AK啞~f_ ޹t0EnsOs=៦ִp_t1@g5Ŧ5 ʠQƮi)Ѹ;ɇ);V( M*^=o׽Tf3LLp O+*xW~'Af;G`/ZښJ:H F=pTF:Aw_HQSzHrwj$vIeQLKfZQū2㕬v-LښUXŔ8@=~eJ"gQ%Dd`Lԛ{ ,=*/'mؿfцj"4"LN1򏾽}6V#]!dȌA ;E#74uQ-\f6Y{HXQ̩GwzE=kig=aSM7ԢF>N~zMPO:{+6 R 2 i:l =0:Ў!&{܏/۔V7Q} +'ſu0kn )dFb` 37@2ej~UڪQkarij{tf]։*N ΣH )Ҿ[W ɚ,a+vFKܘkiqL9b?R:ϟ0ChYw,.#bSgIg%/԰Y#&Vo5g8/~6;#ʢE"UGL 7d  C(9`j ^3T #=CzLqW1jO:a2_]Y9ӿu(1d{t{ :X$IK7i撄 {0Ѱ6k65GP֔ŊӠ *d1YZZOln #|E`FDE33l~D'*hsHMSeDsD'RN\PRC0bQ2S.- dȧL:،Y?Lf5ű8~0%X*,p| ks"ҚU; FE-hǺfLPjVzhMgXz(7;É`=lX8'xMdG+?y@XxFJ"%P|neAe*w[.>,hoKs\]t K?}ã١zNGG({uFh [|~zuأ][(,4L\+P.jHmb#g9itUΓhi/e6uHQ 2;ۀ\Go5L.V`L).Rݐ1ܟ=^!)Bװ(G=G_gRMÁBΊ+J+F3|K0@?IǶoXǦF%:ւ@Ki{SIBʨiU;*WwQ6y";<>gۣuXZ畾T7b4OS| 1>}Ы>dcbr6^w6dgvYVj i8Y4=zU#3/a$2关`pVDI,*.תѱe__kYa`櫟 d?"JV^%֟I!Wgԟ͑igKSBos3yJM# o3Z>EohW_ Y'T`٬{D{"bPS P }?au^СuCdP4W R)6Y@gN;@R\:.?r9'@~O |RVH|Hps|_o~ꪸﮊyf[ ~:GtSJlk t*e8A*< As ͂o[tL=!wJ*5(Z0| j?`ȝbKGD pHYs.#.#x?vtIME .-MIDATx՚kW2+]O-KSؖ`ƖF@0a6f cbkv@1ag=1y,e=eI-0jlK-[RwUw׻*P۲z`3v޼wϹs/ {u tp0"i xE)U4 _W:7mA"O#(B===HRD"0 ZP(`ffAxP({ĉx衇C0 #elڴ ===0M}/3H)066!,..яY=}Q0NmY֦[o[leYj~_Ǫ?o޽{ ~S(.^ZBSS H8bow\:tuLMwBB*A +H#+N_\\X~o0OڀP(03~㥗^?4mJJ5jQg>T*isS<0vJgI+tdWWNX3ؗJ«S .^c@9_ٳ[7t0 B)ÇԩS G/~={nߏ/^chtӰl+{ͶuG$w-[q+n !@ iNHzRNbcw$yҭXN'gbkz;èH$,Ż|Wڵm27|3P.qzlAo&va/^6M%5{"s+4&ޔٺ^t˝)R{ys m! !$I$ ={6;߿4U[RJdY5f^*|@Pm-'.:Hؾ" ]k֬3u]>O@&aǔdJ1K8P}<  ~Ch M,x<Id9+p]J)$I8wH$4%$ٸ! PJd3J)_1!=f܂3π/b HE"v44wbA hne޽W@TZX,oKsDlhtPsHF|ŭ>3RaN5\aKxn&G#  X"h @Be[t]o& dcRMJ!HOXC6 I Ԃ7z/.Ԧ^>x%IxR)ENjC+LFԤ B BXkT = XA2 Q3e jo~P> =ߊ@kc @J)J}RJ f`u#DUOzzPچ (ɠ yYQ fHjB`f5=447 -x+Rԛ)R>TUJu]0/\h}Ty2 ()8fy#0 ꎡ(Qȗ;bG,dDlCӛ=14 `Bľle)Dd,?ժ^Yi4 J)dY a%4 /70s#!uqcl.ߗLF'@#'†ꎇchC#@]JU*׃ũb= -I´Լ9-f^?!g'l]Q!GGZڕ AmJ%|p['5׫BXXb/1%e%f &@qcS71CQkpW _hګN\b<Ocqqi²,ܰ%f6'&oF- `Y@`@Xg7eE33A?Pћv0 066 AR/1|o,_>s=n s˾ q#5mZ^j*Ay$2Mdo6ǁR jNB+@Ӵߟ={bm#"3Ó.RBIx&LBL0%4@NO!zmk`AZӧQ.])_=+zT*GGGy:;; |1=?6%_  ޢ -53ҵz:#!ttt@J|>Ǐ#}n7|sŲBT a Kdl?bA[Ftj%ĩ= zLnܞMdHlǏp?OTVcp]wp]~T*wBpHٵ)M%,"vNmXQϟux-F"D>~@)%=3m|4+2{S\cxhDAcMw[СS ciKE-ІP?y1Ws;zC4⠻jBL&[|8O gΜY9Þ={<4;;-J!#JA)׭s_^W⦡l;Teczt"ҊJϹO&Mt}^b1tuu^#qhE099Z?驏#<D";vrl5NjC#(%[>#cMۖi•RV|=!gom tvv"R`nnH 8vr\#]z58x N1ǏmSX7z7Db[nAWW:::|cȗ8=Sx||t غ*7uવ)! 㠣cqqlPP'N@P@XDTyذapdz>;;D{1(s8zHHӰm?RI _1\7@ ] bB: ]H "4Ͷ㩧ߏE0MjR bz6lG;~gWnP<C=C"{֭ذaA2eY "^Q B^#ϣ\.cdd?яP*o|80MZ Vaݺu0Mǎùs ^y痝[v]ׯw(?77sjjǔJ[H$: @TB.C>8ۇK) !>, #lH6lyl6I!񁁁\Wp5GeYq hՄtV+.qI@JKԟOf2޽crr aYse f) H$t:D"۶ۉ 0??)B)(0۲ep9{ )tݻwqLMMA)p81T*X CCC8qODDD?xgV@׾-ԍAR , RB)URSJ"<:@D-wn0s 3d={ cjj RJض ۶!|n$Ikxz[yˏ/PJA)Z&Ri+O^3>;~FoJ033ښjbLő#G@D`;y+ .\zlٱcGq ݳg2 fggQkmT Lccc8|0Jc~3/6q)/p4ǎ;s̶UVRšPB"|G ĭ <3::ćx5u.IV}~~O;;;7vuuE>7(6>=22rK nn޼ G";[aBu]VKR}zz:::Z?rꫯe`6nt]G>_ (mB3'%zzBKڵKt:Dm È!BDd4)t [jRTˏ,=zӟ_;Ou]]wE7oFP@.kC0 : `ƍD"8}4v=.eRK[>̖-[ĪH$&m{mm,k0 7M4͌a)0aD [eE"PGGnYVpiΝ;f͚ϟqj*|>fnGk/ … 菖 N~G(P(d !l" CD!DTBt!t]_e]׻D 3(z8ʃ~?ٿ+ Z je!N{y KMV_qݚ@ǎtQaJ) 8lYofUE!DXa TAj/TWUĉutliСCCPѣy^h:;;[[n3UwY֭˦X,ڶ혦i"")y^Pr\+ l6[+ _z%^.^Ν;_뺱;v`ժUbXM077cK&_t903ȑ#ޑ#G ի.#m뺮kJ)}+* 2ؘ G}aǎ{~_/;ov$ j۶<f޷4җ thN~) lndK%`)0>vؿرW_}Ǟmڴ X RSO=9zB%]x7.rw% 8d2sP*p!9sfA)o@O \\ExkGAh;@]Lz匐ߥFK=Mm&¿W+~ϤNLӸ"/U\dIENDB`vokoscreenNG-3.1.0/src/pictures/systray/pause.licence000066400000000000000000000001461416353147400227330ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/pause.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/systray/pause.png000066400000000000000000000137371416353147400221270ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs͒tIME,lIDATx{m^וֳ_vl'Nb'nR&iZ4R?S2BB @t~HABAhCh Hiv8Z8罾 i}}s~z됈ҕ+W޾}Ϝ9 5~{N?! QxcDez-ffRU93󪚉HP*03jۦׯ Ey[eV1gf"@;;;c3k]@GHy5Z"D0 oꭶ ;|;׮]ۛeUU<53"%"=܃&`жm,:51uk LPvdγe{x=duO=& `52`#tnyKD]vmBD!!˲Te*RY܃&?fFmۮƘB[׾* OdOa,K(89Ǫ`)rN{2d4}l 6XaZ1j"jc$Ÿ4@{f6˗/Z㽋EQUUyF-aO){/EQ"BYc 2}dS21 0o:T)-`52ǕqOEqi7'qlڭ0#s'drae 9y(\%ܬ|o{{vKBg1Ξ={N)12жqkiyKyy{nkCsrjaOE1(7A]bhktyK4X0xfɜ[0I {̑f=X 2̝T92'+=UÂ$3Ss, ўH׉H,˦kGD cڭJìp@`` S1DaXFLk;°j~Ze$ Re$C*IQ"F%A2,8#^c6pPjf4P ؁Z@lP1 ϛ9& @A0Y}TP@O`$߭k2Q2QH'vl𱋣N眨*ȘD$JF 0 Oȹ(~&_]k0beG34)cue1D 91AP wVK!9os9vvvӔR*1F12p[n/yfoo.9|S/…0ZS^-qm Ć 1wށ`Zu?};7BHf3K՞2Ze1ƘhDty\qZb8̩nƾz- !_}_[ տWvb^>C۶xORgQ,`ܳBvgI! AT1FݙwBgi3+XYYt>0&4;yLÁYRaɀ:3QX&կk2Uym/=_B7/Wq>ڗ }>Mr=\^, pӜv5$dP%&UElڶ6iE s>O^8SXY/  3Y_^W{b%@za=+Tzg @ 1uӈm>"sҴڐolzo~`mm u]U2*`!eE [0:x<{}mAf}u?0CA۶|rjZ_]T{2o| >sώ8kO?%FlGb27N?IGnb{e=dfҡem3U1͗ǙeŘ Yсy*}̀eyO=Jt\^IJ~lgŭMkmtl_,,--i5QJ2sdC;OI2&7PG/w۳.$RT0ɱ0& 3qOh!`<C,A"1^͔O>b;[fKm]f{;i.:;v5kFf 2ۛ+ٝ?Ӷ=)s.j˰umW(vw 6\=rΦrb67@A$;課XyЊMD"@`FJD3ڹ3Ϲ7^8)ُo2vg?j@Z`G7C&ZU3vnaa:Tud*ۨ!j_0ղ=?|G/?IrJt2Ub$$zv68¢p(ԥ2Wf}9W6h "Μr|. ZiO҇_P x]h_}cIңټ<@Y]]ժf9mN&d'N>ܑb3nyni/ЩoܤWJ }Zyl:IۇʔDS޵f(1K1xAz r…X`0M<Pxf46*#i-R.LEO-$R`Վa]G,*JefSDU+C!'6d2/%-~ wR ;R{' UצY2M ѩwҶa*)+KY B r0eT\V~ǯL'dȜ͝Hj0w1@U"S}̲Bhy'V#m#IOSB _t'#ZrzU4S;;7,{RŔ<5ML)Igvr{uRD73ZnjiۻGJK"TAIu<,!~Y։-j~}D3:*[@4{:ԏ.cF߲vLaIؼƳEu>b&-asB4)"'BD76偏&JJnguw}@\Ln2|K-,#&HzJ]X' C٘9YI+1J Jұi_,%AQ82fJ]fE0L)W5SsZfU}O0T<&YԨ}G2AD[Y(C?FglaIțVB|>NvyPXNY]G* x) bU% 82>ZYbYb&!\YD,BUM9qΥTeQlئ:}K!APXB=çOaUKc ぷ7Uy"ϻw bYs5M=i>tnĘRm[@@H0F;:'y*uhJIF}{`xp,Y5{ !LCt*Mݗ;\~PźCz:>+ض4tc|zZ2c@FO?T6jz QAb>q8̎zaS@ ;f " !{UYY[cB] b b>էY:Ry2omw*1KaF-wkԶ ޼(%#WLxgcn{%W66fSe)4Kj~\Μ{GS6]t:}C=\~cKeGTE ~_ Iۦx*fA1@RJjfMJKK/ΝU"hPdgϜcl  joԝ>l'@DE1M;mɰRwo_1@T5b$3S3Kb m]Po}[/7ڤ$tpgg(-j"2VV)oQ3US>3 ZY4FDͬ{U}Tuaq,rIei0N~kxO,˒,h2\QխbQU%ۭ-Y/{IENDB`vokoscreenNG-3.1.0/src/pictures/systray/record.license000066400000000000000000000001471416353147400231150ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/record.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/systray/record.odg000066400000000000000000002401241416353147400222450ustar00rootroot00000000000000PKVGR.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKVGRM,~Thumbnails/thumbnail.pngPNG  IHDRzAIDATx \U[j_{O::"1J ` FpdAT\Ga&3,sQ$%H:K'Nz|ު:I:կ^~{oL'jP? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P? T~@*P?cӦM\.HM<ϣ1 4X, |>!u[Ԟ7o&!ȃtvvHF0aɘ`jRaCU=GGGΝ;\-ˢ3O2;J$sۢvE۱=LfsI{hk UxG G2d ;S /sh82V0- $`[s`ns! Ƽ=wH[@WL):T MP0󃊇W'B77˻aN2,⋎L;cێ;R9'Jm3V5룾ޖ@Go^Η.8ق2MPzYI0٫^Q{~0QUFhL֊&B9tf}:x4|h\:ˈٙ!y粒^рɰ uaN dSmo3 Ecf2-LTq־8rߓw~dU?dE 엷KЎ|DJɲ~yc~0pEm] &xE]OKPjVi|>*dd6͵Kr[Z绎eosۼ!ƓF#LCt677O˛5쇄GPF<"*f&t" \2~kp_\̃Ж3בk#4eG>d$䣆^-O9sn>W0OP[kӉ zMC/3jz2-ք7,60|Qͧ5G[[[?/CCCMMMùrK']+Qwm;뙾SymS5+oM ~TX,D*,_P!JM\I&bq_\,n:s/?qd(=&l>ŶP(4/za?~M\*̓:$*۠]ڧw]ٿ}tÏYՋdOh2jZLQ=Hj&.5.a§L=H)4-)J7 OZ+v^t+/C^pGUrdoG<:,=O3dQD{0{#]>~<_}5>̖-+yga\[cm_>{b@L&c$aVHe.GD;M!sn}]]2~nݢWp1= ki|#OmLS8H$~9bF9Գ-sU36&i+/xɶɦs󖜰~ ,|}o>;R7hoz& AU U9wיh!;"hif͚cYV6;u_uk>}WlBk{Ϲ;G#3q/FW;q?|D&f9gX<2o?pk?K⛟b9D>܅Ձ6Eo2slB* u2r<[ͮ vy;l:6#:-Xj&&J#w^k.1\/W4~G;SJ>3El|w](+ktض;޷|$y?,Kv@C9r!R^Va ڞrolfv}7_r?xb.+'F}魵ּp8էlQPB@˓Sdq\7+wު_]ls qͧ?:+"X{Wp<lh T*壓0Cn.$-(5ڋZ~$\.'um9"l#d K\VkO~9@0e am8;4wblxU,(L3RqV#=u,5Vo*:֦0{zhjjʀ |'iڄirg bGkTU.fxk#h x,nhlT7uu Aw3^z+S#'gU5ׇ2Y;15B|w|WС lF%ff3"+zzi#Z§zy,gsgT__D~_\fGZrh,Z>U"Vn-7_t鲡C߷<%SgLD|j/j* 1㚺Q\v+grz[r%>qAc' )_oݺ_ܹ{B5yxvlǍ7\ 'Gܮ̭@9õ𣚼 cݠq늜C k75 "`Vi?ԇްV3zasgCC_עҥ1gg뙛%!&XV7gԄBm|YK-lM)z}:QLDD]r2:ܦm|o~_(~',U$Yıё[kšh8n;G)XYH<(Iy7?sIM%?6L#F]⦋QI5\9Xh"筈z箖[YFʻ<;*6ó]IOƵhӂhHEt:ۦKκ|ު ~bxeMO?{:>lURT)#Wa"Wr [Tn2Nqt_q9V.EO u';@.sr:uAP2۴)i`_f^oMނ ~466ڵݻ>uQJnuմrb"Dk<]p'Sɻ4^y!Bk}^Ŭ'*Pqc ?HCOKmw˫?zgU+fL4aȏ@ @cE+gN\dE-9br [,E[^vKj9+|nVk)!EZxȈG|0Z52 ljT簙!~ȵ@(qoaQ}efDþpx4RODWLw.#ן9 2021-05-23T10:58:44OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-9788PT1M52S1PKVGR settings.xmlZ[s6~0}hCIr3 s \_2FA\I__p n;Sv֮2(yLZ x]Iߧ@cKЇD9BWr:THxpr4d=-9:-1"D f5e^F7 #]  His6iJ;e9zs>h5aiX$|"oWV׿~*~AΡgW+#-NQ g5wK&LB*C'_c ~D)c9<(%kM@`SŒ |x?"Xx&zA!w giR%cL !7 ,_C-5|xyG@# `EyAnƤi1JbV2mH3'ii=RLP j FI,`)v+Đ}q㫽Y&T9L>:16rG(pGPnVd%%,bLm8eD ry6F.M,:ۿ·17wm!6nPUCýqjp"93O$1*"à lȲi*HrAވ G uY.1$cGG)U &qVT TCJW8E󞋛=CWm8wB%i]AY pl_@BjXX/*?J2|9c5 dE6j ڒeTǶ̉GZ|Ӎ BҶZBeJE)m ߑ3dfH-kܨx)ɴ7 &q8`wWRĔ'Fy̦W}třoC?GʨofC? PKsZT$PKVGR content.xmlWn6) - @%Yr6k qآ{J-hﶷXgSvUQ$sr8qxblõZGY2fLQ]rU?/?;ɔV3VMjΪB7"56LVE.ZqG1܃Ckn1bGd3}eKKS A +=Јuig^Wh)t'Emf*a: *iŚ4KJTvrG.j,kEbN(륞̮J<1Ut,VeJz|8ʩk!v*jkWѠ=|>Iq޿ [ M8%.Kp0?߄ةT,=& YY3CW3ajɋ*.H7p8P@b"x q֣R0ԒزS :8QM~ee`nJTp,9F; 85!cR ɭն7$. 2V!:Sh!x;Q%6y2Q9RsN: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`PKVGR 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֞1PKVGRConfigurations2/popupmenu/PKVGRConfigurations2/statusbar/PKVGRConfigurations2/toolbar/PKVGRConfigurations2/menubar/PKVGRConfigurations2/floater/PKVGR'Configurations2/accelerator/current.xmlPKPKVGRConfigurations2/toolpanel/PKVGRConfigurations2/progressbar/PKVGRConfigurations2/images/Bitmaps/PKVGRMETA-INF/manifest.xmlTn0 UM4U$vށ}@%RDViCl'{d:X!Db3>erƶboۗTx6+NFKbItv*Y@*ٺH`I65@Ňm2IVhǚ)KfwZ&{I &nC[ق^}GMtRy} DW$HaVoU+JMULrbD:R6ݦ0Lw,T t B(i*y^xwwgoi Cr}Ip cHRMz&u0`:pQ<bKGD pHYs+tIME EɧzTXtRaw profile type icc8S[! 99N4R HXjє]6E]k5L  *i3 iPA)r"]nZFIgq/W^u0h쇖~x)iʸ`䍁q8t9H|Br>kXs1_ 9>LP̫xgiP5{YV nDoidUKDh,' YhT\dCc3C+Hg!Y ,BQi¿`'dC&`ה> 2C刔va2V& Lv湶UZ@{tFGT>2E.=cM+LŦߎ9esos$ړGuyH!380ډ6C`\gw(iraaRu`0@wɳY sf zHtF'K_ceq1fYhl%n%xK2cy,^m_DkaoGoo|F"Nb5)%qc:YD4A1=`v1AZH\T""cfۖkG("utVk&ƫ}G鯕"9CwMA+FYcg/}!-ܫ$)>w뭸o|J o~JڔH@>_[ (콫0QdĀ," [!&d@13YP8NZkySD`--vX3+D$ǵɓpGo% 1ؿT>4TZxD+N.zS#ҀD9C8ݽܝ"iD"`B֍bEd$;A4^,ԨzuGvҠ?b0V>ݨ,(H7 u5 咇wNVjV288 uʕR<_+YYوߊ@H?o+q塽'>=:\.0?}pM@r_k ~[6 Ԝ#A|;>6W:SY02H.{A%Uoq$)8|(b8ɲlXQ{/)%qbd#Jp1iZU9O܊z J#cCQ Ibs;0?K &T x{=;?ﵾ3)Xtrd$ʥ v#)S!zG쪕qjU${#_~9;RXk# ٩\cqya1E{eަZ'F T=K;֊,e%8.~f1 0DD$DYk3I2YnwJ}ƺaIN:Xk k_~Xë/>{coY~]J.ޅj:˲cT*VJ"unicu/yFT^od2>B{.ƴ@#*oBW=ߓX#%Vcf==QqQr8yk"㥸gPL>d0_{ nصw/NkbuDj >ɪHjdm+Vju=u18p`{RZG8^ztC2FWxq\  ;1{L'g-W@eZr=0Wp-$!]e|\Y)e1A_͛/,uqp۟5o~ 8Qa>t0\8"\˲lh[nf>$IՊ2fͧɔMV9y/}6)V<$رc0w}wp['M–CZ0s:pns>8X-":Pf-{R koþ^65œ- >7q<ΜU;0ljW ԭ8E I\yС;/(Fkȍ1"`dIB%0HQ"ByzZ[U! KJ98|l>90:kgmԛKn43Z;swl<<jZ QJy-`eqy`L<{;-[v7nclyhBep YnpWxL),ľT&%`׮] j9"h)ze<82s JX?oaom סp v_v1ݻvykE໚NTA8ޖ*JZ`<1Y\~lo~ _~x {c.{)>YK!OŨ,bb.` #~4M&!lҞ\H7DRI{ckm\xyڋָK9|cѼ 1!Ξ=f4gv".yX](@k-mQUqeV'w1{'UJYQJƘW\8|g"W?|2}͓?o޵CW_'Nĉx5!p] JZ_4ydkyq?*3>><xnn.SJYTnikE#u7NK(趯61ܭUxs?_ۭ_џBbH~-˯xc`i> o{<]׍/Ҁgς2+Lem41̈́7@ODMZ1sm3&AJA Cж;p xv83W>< " a aJr6߆WVs\-PDKKKj8ZGDT+:E! mΩR?/ pІfk쿻_9S_M3ӎ~ ' F ƙ29ϔ r0xHF1PG+qxش[?R`ٹVn\NKJD c̥]D({0,k)! :fO}^gjꥸ,pWh;q;PNUVnAt:5|O(t:ؑRngd - M97]MDXk\oVv^NTݳ׼q@}NogX9ۿ?~IZ{iXXZLޞ}@ֹƘZq%v]M.~iMKU٢IH#dl'NYf O}15=r [Gp#`fhˢsuB\?34X HC he5yАޖ1fֹR*]*yA7kRUl]sbM ب 8\Kveov=<ޮ38Zu]eYn$;?p`3ML TX(49,9Y__ߖGR*w~ R 25$46ܷ^ڔ:f;{k%DV+6_K642Es:8kQec8mUE  la,ԩ,JF+T-{tDTLNNbaa!/ry,HXd MfeWT'kq1֌sÉ8c1>RYǫ֡e*s7Q seU<׮,InK@3'E4O)"8op{V'z1[;-L X쟊: 7||"E;%Z QnXIB 6EDPe{%`vv}Z֙:ZKKKNgZGD޹7Y}W>ӧ7 ?-=VXx}?IJ%"ZZMk-8ƹsp!]w53J-s `\β;ZkLOOcffgdnj'WV1:: [+=f"Jlzzp#7[^!"HQ.)"ZkEDJk >!ԋ%J)8iq q8o8(qy~ w}i _wvGR0 /)) X]]U^.eɲ̴ZSJeblVq,v\1N Xu]w:3wPc``]V,ÐKu]C~/yy>l!HeXIfII*@@nt|(1 2&&GIMP 2.10.122021:05:23 11:03:02 6 JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+i|}궜xQ\NY@ szMS=֠ J+--1ZeR%5?fݻ~u? Ue~2ɻ@C ɏƻX.<.1@QEQEQEQEQEQEQEQEQEH6⡴;w*zPv/^f1{{~7ߟc}j/7ݾRo;k8J-Kv:U~5r-61M?YR|Z:{έ5-1Z9ָaZowK/h_9⤯?^^?;פ{_#(\:l3jG/ v;K{W$ysz5]?/KKNn6g}?+ .4S._Kz vɩl  O&ow,<7nxx?_s|W??ҶmsuϷ.ciVݬ^^sv:!;oٷ,;½ɷyc% yg>_^b3~־/C֣+3Z(sB oml-2vjIP$ͳo|</یϥPsgp<ç?iZ/ֶ{wՇ? ڼw3ڱ~O_?v+1]Y߹'5?`W~?6:ķn|򿳹|Kx61ՊѱE7~nx}o;69W}ki~;l۷Z-stF(J{&b=Q_(~QEQEQEy((֝ݚ&pS\دc/qc֬7g9,+GJ8m+gY1r[O@ yc!w;VS`g8O59]VE ?۶z׬ilxq^/_Üׯ[7q^V66}GRZ:uwn\I.X bNEFչ(v3Z~z8óiqŎW}3՝oߏ1uM#ZE__֫|3?uN?9שt;|wیgX +2[cZd?F~hmvyX.1Zog6"Ew\crƵWx|q1'u"_c{g9VskW׌wUVϟnZ8qY/3z۾gsX|lh|Jt<1ֻS8y%>1ֽ &jۣ*1OON66h|61^{ ^ s>#ϳ~?OzQX2÷fg篒f?QĩIۣ{jNNT%d(((((]\y>]|WN gkįZwE((wr#;`|qٮBuCnwn=]vkDgg͌yܮY] +)j@jb];$sQvh%@i`$;54mk^͌{Wu||=q⻰qG&!jO ?՝n߭Us g+olW*F+xw]VN~|ڼngVgo|c'NtnExo_i'z񷗟?yv1MROWg>!Onkgmg9e?Ҽ; :J3͌cv¸h[VǑݻ^78SGJN)5/7wl֍5owKY6o9zoy.{ֽO8q^V1~U=( 3uk?>J:WWuk>ݹ]4fv*vԌ_l涮c6fdyΏ&;coZ<7u϶Y-H]~?=֣KT3Hvk$Zu˿?֧"F8?vȟj? _֧Kh#\~k_U~fs{V8=뮊厧-UwEei֜g"4ձZzp-Oq2P&\w9ק c%V4f2}j?I__eR_e\NvuVKo􎿿?9C Tb_S KYnqS%*?[b/Un~cTeX԰wwX/<|.?Wx3UNG7c|n⼫ng^n6+T;83x&:( .fsW\q'۷=@ƺ%9+Wϯ_c?Ǩ>OV^?Bo,ZϸQRHq/^3ޝe{IwT"x^[Ov3ǩ ?=Kh[cJxVq=֦i{J,kz61?=֨VԆom7|vjCiR6g(wc Ѻ?wmhUNk[cMڂV/TL}o3ڐˎ߭9t^.o;֓a]H?`xw֟~_ֵA/?^.cV(lVH-?[zޢ0NmFߛvsQ@~Һheo =ǥyԾf1 F? Pp|Zޔ'Nfgi,)D/Ҁ; l퍟5u:'6m۟}|WY@z>~vc>ֵ( ( ( ( ( ( ( ( ( ( (!6E3ׯ[fl۟s./yYDZ0Sҿ^z?i?#5]qĻ#4ο_VSÝҿ^$Oƪ?3ƀ:t_ש@^~[ěj{Dϙ4}Dݻ/g%vtWa軷cZcڵSk֠G_Fnv3?jբ}j1@((((((((qZU@yq'!tEXtexif:DateTime2021:05:23 11:03:02 qGtEXtexif:ImageLength64GtEXtexif:ImageWidth64s tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/systray/showclick.png000066400000000000000000000265471416353147400230030ustar00rootroot00000000000000PNG  IHDR@@iq|iCCPicc(}=HPOSR*V鐡:Yq*BZu0y41$).kŪ "%ޗZ>{p}Ш2463˯W@Hf1+Ii{~Y\jb@@$aiOm}(+*9I ?r]segFlf8J,:X`V65I⸪/.Ь;4O3p `z[}u[S`ɐMٕTB7[ ͭu KJH|9+ r-> cHRMz&u0`:pQ<bKGD pHYs GtIME  $WzTXtRaw profile type icc8S[! 99R HXj(clwk05L0 +hSnLҮ #R" %JFgnvy(o;ZbQ(7 5 xf{8^(%c8#?'|r|$bLP̫xgiP5gYV nD߷7T |?'!ckQJsa;/!c_3 IN ASEGY'k<<ē Û]SJD, #Ry #y2^o5_9O "!Lcn㦍?&bo;esos$ړGuyZ A T.v"gp[K)uUėtvo#ѫ| }O\ IDATxVU? Qe wfZL(*B0wud̬1Läv5QI+WE2" %"&Mv8}ysw]‰y<9υ8k`}]ON'1@}Rm?lqj`6pit]?+l; T4o@, " P#@_;X9 =lp>ӆX46}ޯ8* \M"~bq(}Tt *a :`%c1rp:02*8[{1V|K({#jќ\NBw١2] <P'ߟ1,c+T|%cN@{jP_bop 0 V;" Ya7:YwSq,G-fVc*O ^Xh_*Mx%֑tf1/>%J T07L0Z Q2åJ >(󅔐A$e^ g` UQ,@E#-םԱ-f /{GGX<1^/t 2;e-̻2VY"}\d칉,6,諩ҒQgqmmJESy: سz`tkUNإ$ķwB@OP-e( VHDRRfZK$mv$־`+1F. !m1빒0 xTEzz=c pSSu`/ש. #'9.ĸAu7E,N ,#]Inv?,P ֨F{N=i(Xc9w7\̔ŜbC.BY8HO.pCr]514=%HVj9e$n<J>/k1"B>-uc|ؖWYfʦ=T %","xR|u0p6JuYu+V65V9qay}P6.m[{Nœlѧ3,u[lt_[.{1hJb'˫ۈ, 룔8S/1oTE?# wy!!->W04H}4w . t0lKK WXny5SEgxy,Np4TTT |Rr 5b&R6*}#^+~BsEp/ث}I0%M+౳DR-Q~ƾ>p/!}-KyW`flFRϣ,uvSelp/FأIpT(1v>XX4~"i\'1v%UOuq|7U,6cmtihTn`_{pDEpـ#(;Y2t*tG5)gR3< Tg-~цӂna''wuXm7L`MIEWs(Iz v\B=ؗA g镔vkڌ O X|Rv/Ǿ#mo: 7u >?@J ූz_<1ǭpP146?$2stX(KVA:{d'R~"ZO#R~&h(^&c []KAf}&Au~#LP&M}H ^?Hߠ's<}Fz BEcbx=X,\Ex8kPH0]Ju5qx" #QLU'.QHYfLշ`.*;K5/S0|է^Z0`U6'KypL xL$gK9(E$BH,x(]H\Pb3޾`23痙%ZpOwP 8@D)I̟6?MY(mA =mNj`q˞qrW`4SHQQQQ^ߐ}fsHQQQQ^ߐ}fsHQQ 1^ߐevwH_o~ѳYl۷w+X=㎦+u'?F>l[6sJ(c9I݅QTHQEQEQEW7 OO߳}߻vqIELeQevw*=>㲞+e?:+go~ѿYl۷o+)s2S\(((((+'_oپϳYoݻwj7ɔUxO7g,ݻcQ^*uQEQEQ^o _5W7OO/}߻va4tҼ]4۳++w5 +( +'F>l6sJ?k& 8m^NXieQEtEP^' 1OߴٷnsWQYV=iUt}x}7?h,m۷~ב(>Ynz (((<)OIo[n1Zre%v$kM7-n{eWF<]GvQEjdW71O/ٷncW g-wݷc\D)u7BSt _yu%mN/ٶnhcŸJu%ZM!|'Q_OW_2(w,w~ͿXݻoCw*SpcNE??nVPQ&"x~/?W/M^:&`3~ co^=/}^͛9ҳ:.ȵ:UWOş} ?h-vmۻ~g$kB7]nvRBS BQEW}7?h,m۷~VUsZU]7t|Et~+#dMO7-v9ߥsJ..c%%tQEHŠ(~ciFen?{7'_oپϳYoݻwk+Kqb}B(+g?'~ѿZ۷o+_''پϿZݻok E_g )UקŸJux?};f,wݻ׻ JJGQEHQEW|\D+Vm: M?[?y߿w#`i\\[IcEWpQ@6gk?凗fs:ï|wOBeϵٳoG9W{hWeOş g-wݻcWOş} ?h-vmۻ~ه!OZ-(o~f>evw+Y?F>o[6sJRizZaC+ (=~ciFen?{+܌T,vû~?/ʏf )զ5vN Y/N1?/ʻoڗ ?w&-x>+<+:~+?&_l_,<6sߥqcbR[# $ObgH?_~ѳZ۷w++L$DbbQ]'1Wd8H0mWד+M6 ?/lzz?=_렱?gQEXW|\;kz^^_c?jWUP:EV>`+4 (=6(>8(*(d(:( ߎ^^;` W Tx}!_7ρ_#|gQ] mJz%yy8a#G^o^bg Ut OQEzǖ}}!_7;c?jWW|ڕT?QE(M(M+鏎 (<ʊ(>(K+C&_l_,<7sߥv4Q^bcJNN+~;?{xoҬ_S\7Q|_HW>|gQEw'WG+>+#⿊ ?=yz?“cх*MEWyA^' 1OߴٷnsWWWG+=ӆSs"m@Wvmvd~}?\i6z (I<SjNcnݿҹC}۶1ZS䖋B (QE}1E>O<7w1}jg8<غtRJ0Wg EW͟\Q^'ckJPQ""{Q^xoүb+;CՅ<'?Io[n1Z?=zEV)SR[bdQ]'1mJz?d8#Wt=L?QEO g-wݻcW)hxҋ (R0mW?'}gٷnN~^O*ZGN~ǻE^'/}ٷn~^EgRv>`?GS0 Ӕ>"zmQ_F|pW1s1s͌_ٗG3Q?1lSGNa3'?53~ co_IQEzhJs̫UwaEVG߶}^͛9Ҿm~;?%c'-1k(̛yS{\jzEQ^W71O/ٷncTJ [;#袊d(<'F>l6sJ~,_f>kvw_ߡŊ:J(g'o~ѿYl۷o++g''oپϿYoݻok E/i *rKWc?jWW%l@/ٶmndcˇzMEQ]$Q@< gؿӾm~xE}?_0W&)4'? >/fw_6ux(ܞɤQEz'QEW߶}^͛9ҏ~glw~mrb1w:PxSŸ7g,ݻcO}7?h,mۻ~Vz^HSZ=(OŞ,_f>kvwHg?'~ѿZ۷o+W'wai((+_~ѳZ۷w+2p|R>O~,c_iFkn?{l^eU]nyUi:n(Y?Io[n1ZxOͻvҽ®.ӯ(Yt<@oP(QQԫKs}?Ey.aI _7VޟrP+?,~Ϳ[oݻo#w^kSv] H+~xv>!_-goٻ)PE)lgZ.PiIQ^; ts']z?Z8>WU\^=^ _+?Wj747? O߳}g߻vqפxO}7?h,mۻ~Q]g¥yNQEQExYV+iRu+_$dB7]msQ^D**(Q@Q@tg#kBO6]v9ߥstUFN;(+3 +'F>l6sJUUVŠ(L(7QQ_?'o~ѿYl۷o+(ia)h38w}s}}G߀}s~$kM7-nt?5zEpҴٔ3n@+ ( (g?''پϿZݻok*Օ%w*Nx}۶ }ֹ("Rs|#dQEIAEPEPEPEP]g?K _ _y}j>K _ _y}j>KQEnQEQEQEQEQEɚb%tEXtdate:create2021-10-28T12:22:03+02:00+%tEXtdate:modify2021-10-28T12:21:36+02:00 tEXtexif:BitsPerSample8, 8, 8>'!tEXtexif:DateTime2021:10:28 12:21:36tEXtexif:ImageLength64GtEXtexif:ImageWidth64s tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/pictures/systray/systray.license000066400000000000000000000001451416353147400233530ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/logo.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/systray/systray.png000066400000000000000000000174151416353147400225250ustar00rootroot00000000000000PNG  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.1.0/src/pictures/template.license000066400000000000000000000000411416353147400217250ustar00rootroot00000000000000[license] author= url= license= vokoscreenNG-3.1.0/src/pictures/wayland.licence000066400000000000000000000001641416353147400215370ustar00rootroot00000000000000[license] author=Kristian Høgsberg url=https://commons.wikimedia.org/wiki/File:Wayland_Logo.svg license=Expat/MIT vokoscreenNG-3.1.0/src/pictures/wayland.png000066400000000000000000000322521416353147400207240ustar00rootroot00000000000000PNG  IHDR\rf|iCCPicc(}=H@_S~T ␡:Yq*BZu0 4$).kŪ "%/)=B4ctL%b&*^B7EPf1'II{zY}jb@@$eioOo}+*9I$~ό!/K!W  @wV~rK ǁB@8ǎ8W'鵖=떦;!+i <~Fߔn5>N4ue4rh0gW cHRMz&u0`:pQ<bKGD pHYs B(xtIME (.;^zTXtRaw profile type icc8S[! 99N4R HXB.clw05L0 OЪ&M/cCA6F9ȉvOSPҬddY@+u: 4vgCK?ߔU4 e\0C8f>!x9|5 9xz ߄7T1~T ?m,\gmj[ڛ*z>B`; [P Mݡ~i ΐJ` Z(6PaDǃ $l(R"gAfҮ>P濕ɰy~۪DDY|b=:GB*"1qbc~첹9ɣͼxZ A r{]DpR!0u^,B$Ra/DBL R1S/IDATxy|UsoVB 슂 ЊpuAZkͥok]նZo~]պUWW(lo HȞ{${gΜ{sޯW^@93y3s<G.!ZzD2"LQjh\hB)Tض;<HblrHgQF"`ӷ'/曀~$l$&lmb&" >ȅ&8`p8p8QHٶ h_"rB|`Bm:BJ(p.pbm{l8!N9$튃`%!a)lmT RʋMBmbXFH}Lmeba:uw|mal| HLzٶy;bU nH)ӀCm:&L<\>-uH/͛3_8)#1v !ٶ+qg8$u<$/k30U 7V],xƦmqidr&+&1ucyqr:} xƶ]~ݯ_BkӮ2C\ \z/RBJnB-f3}!{lib`l,;qgB|O"Ї8~?]wF"1 y<)G"4ctgF"-M㿡o8!1>_ /۹|Ƞa{>Cp i,9#s^DI L( MqB]lrJ>=z(D#Xom#c)`ݴۄCme " \ ,g?xo~P&w2?ngȅm١C+vQ!_oX1ӈL.hw%ÙZZy+p{32(y\ou'6#c< F?Lm>+ό'r>A@㵶V0U'hc)~%WK^ f"ۆ71F68X8#@@cT~my2锪BǶQFl[nB6AAx0 e>|m `(эgT` *!/TY*7`ԟl[\4+B֧fi!p-?.d ٚ/@[FjۂH6Tblv3( 6|lyjPʄAB83'Nz؇o@RȦh,7t%Y> ՗{k02c%ٽ&E#;"]A`O`S$`*MCPWcڶ_{䋄sHN. B%0oAV~'EÞm[O9/yiyJj;oCB(7T-MF_?)ly\+ÀS, p mIs9 %S!=E 7;U=f>trJԖ` ҡY/GH@pߑRAJJl5U%jK*oNIRKϵmIjwViaG)CB0ÃAĘ w}9%s }&7gL7Q_[[E !}Ӣ 8ڊUn0*%zў j4L= f@pޖZl 0kk? S2V[CsO4B|$;:zcd3i, 7oRޓ!GxLB!V!׀r(XFV~ _#Po8cemu@8l]$@?ؘq/CCXՏB9<@.! MYnJlweR~ ;`_`ۣ !AZV:IYT.9_C9܉6"ǯU})(ySixˠn6*+򞘆"Q[G)D |jzotS'R JΛ?zEyWzX{ݾ@2(wLz⯌jcG Y)(ɻి۠.ʀ/45+o=esHs(x;9)$Z:@Ix;J"U Ԗ▿TRTJmdW~աTr!k=vMzh|h#eC_=uISh=|] ^0Hu"3_|aWNq4~0m͝(i#x~bXy7~u|nsofP9LX:;p'CzxGZoUX'ի<"#) UXD+/LoK(C.V/t1@:;Vp '덧ENڦuAZVj%zj H;vazۋ6;GpK/w'ŇLfIkoK]Oz8rJ W6joޮ_Mhn~mzSk ][|'}pp=cLiu%s:C6:shq[o:lV\gےxѽXes=;4=dk[3jVKzPm+%@ݯ&rǘ1 sfuF|\6l2SA0;}BKM\v@rLj|0 M ؟WqaJkk^Pn,:Z!-S6<A`>mEÎd%Y Gf'6 mۂ~d]=/ySgk|hkwr6#om?yw=+ެFI(ΆVPw>I!H39an@WoWv lv#? E؞|̥wR\)LgZ#]3M*Řǔ(E2Q՗jh,{κŦu&@:?FxC.R-$ #P *rwn*'twhLYcVr67ʋi,2;B`f=^z;5  =iZo eC5 0?z S#۹n#BgXtL߿RH1N0}@sl/sO~sˈUdM&ݤU's]i8i.[SlO}|+9c̋ 8v3=?uSm,oj\o(Vlu!?aH/8H=Ii;ƛ'8uN@H&78@,ʧOa0ZY~$o_xU2$s:ߛQ?Lz7V_ 9;9W$6UzWT.L5~M?~'o ɭ RtsCMBRF1'&HBЇf $V"Rk;CD#30.CO*;+3m" 3??P6GUlL?u[鯐ۼ7N@)@([5J\OoBY[.o!Ķ '{=b_;fܟ{JF:v%uoyZxdb#ZcJ3C_[r 0~T%#oWB53)%פ%S͵١Oc~ j{צ=kיp4"&1!ޓrR"،}Gm5I"Ot;/f~hN8uL*Y& 96Dj>A9o@g}OWӀ4|f(N =ʬJÝtM|S*`V5KZ" }<35GBB#;Z# 9hcu#˼۾tG9J{WB. 9@.! \cg-#S [{>0=诞֙A` *90"5N"4?۩GZ:zX%aֆ<_T1)o9ɽבQk0{ Fm~[7YPql!Td5O׌s%i[mt?2+yiFkO4Gf`'bWXdI1US:&LcWIY= @,DzПA1r_w8cT *ie ݥLLjekw{)<y=4vk34M_1H•>; g{1C& @@:/a^0M #_=twH)vQ(duMwQ=Yd>w"kMIS7ftu dZOۣ(y(tWN`z'lav!plp%G5_lQvsB[l,nmwh(PIq ^ud_6ՁU 0*/▐:74NJm◠~gMd&qK1D?[(g$j9fJt sjGcaW; bB8/:UҐ;^_[/olnP2+6v;t{`{ Pg T"kS,[ L%'&E']"6޹u\^5Ff-аE\ 8@M-Ŗz)'5}Otc#$!tGBOYM|VR\e5fwFcg|8Mw]wpugD#z[x봌-5L-zW;$Wx;q|:s Mq/C{tg?eàKӴcj7Woݸ= OQGrN< P3t9# ;ʿ-舐!$:tЬh+)TӽϾR]wQWS'l55p.{_~ӗ;⩦;Ahɶ~TϾBiyL_C>N^R_zUPSx1}!z3 $Owvo;]0SjOժ VS 7*>i`z ?;X_/V}M3ڻ0J8;]0S:jJQ0/ќ*U>#o8vxCrr: "T=}NvxS c}q̎T CVj&R!9R]_#DgQ35W=韝5뼻<^l?@azvߞ/0trW@+jO\[w77zܟ'CmsJwE@cx-G =]OķSMvAƻDZN@uIftL(gpzoAc*g.ٞd%NMD1_&[~9۪צm Ų*?7h 'js`s0Oj@adbFت9#$P:N}Q:˼ONt>jZo*r3E5*lvlYt6uԎ(z7w4 uքsܷ vG#7uX=M`J?=h L*="Us ܠ3rMzv J,Eɬnn*m=.Yc4C|}լzmp>I']NM1ڶv)t[Ew~S-&J/D߫nFu7o (ՠx0R&vl @l@:+Q6,߮֫EtW煡 NxH1*;w$0EWPkGzN}fJ?:{\} ;L֑ uSEO-KV/0c1O ,u$W_VIɢ2t;^P;Sw}UQ ihQܶv0Je݃1]L%%_zG7w{p9 ʆCי_k_:+Bu`nU"z{vFST~b^vOdo7$?@67's.dpGc7O=kƮ Bp͏d.Mx;0EȶROA 0|Gܬ" UɈuJSI))xbm2P6W;ZEL%ZL\kߌG'Sٍ@v՛TVAo! 8f9y}e'{H"@4 @CB~f׳ުո34|/ub;>ƅ5L~i?]$[X(""U;9ɵS |f{]Rog >uVN&5oO\O$smK?UuLdmگ[-S5G۶c+4*dH(?z4sߝt?-(qԊDPLynݯ'pPǿ ǮQt~jkhCoKK(<QzC5S:;uJ W+a;*V_ ٔeܒ =VtE5񿚏dXG qаKym[2Z߇1ˈ@"n*v#̶#-Nu^ =q;QHǻt-+@_-6MO}9 S djtڶB~ec|y~fl[Z6'$Hz1Z .Y2Vyaȏ%oؾz}É8 -O-@L#~԰S= |ajlu,?ƽ Qpr|}5ڶ&…hBdv=m(~y_n(G G Yü *Ҡ1Bm&~CmP,h<@ϱ]w>eۺi*)ʀ 59jWJ޴}UT'ZvIf۪X7~[R(|8-hjۖg)puN  ^ ;c;H%3>%+·Nu>$Y';"$y(˶5([OS Xκ* HRq]R>DԺǖa a]=g`%Ϻ(#btFBq0d $tU[p׳XLIdsOt =$Q>_q%cPR u̖ -舻iGQn5~9:vZ(m6#=>Vm jRFZ~zmg%sc,F\ц]-pϞʹ;^2aMJꁱ1%v7$;0mg&PFߌ'K'vza^'lBWcIr Xr*k{/X7R+1Bڶ9{ J-9LCFLzz~c&#hY zm crf |#(ҰQj?!׻7i|( ydFga@{(yjw]QDcuVm+ qNFn eV1ٔ\vmAԮE`p*} pMvͶsx 6}^uMBpltNg-pOjUyȏTK'ۗUu}:3TV|>D.f`U,nR<) x3B>;%RߧUfE;B Jm,N,So#BzN4 -DGJk~ E?~.Nj;-W*kUe_d9!2 W=fyM򼍎Qիď6bJI.Xg ̕:D!G="-TmAH]\yTLĖi?9+Id_U9c瓪P Jgk"D!l`)TRҷ/Qsu)ўUL##ނ@;Mog؍1wlfZ_X 7QUf8I(Sx٪ _ϼK +"{aG,*|@{wgGh=T~]ߛ$SyͶ-ITllmQ%-*RT{T)R[\ʹӶ'eؔ+.z-T T«rlbۣ툵4qiyrb"U#)L~ Jqk!-D9]gU_]i܃!Fl3lJeLpC3t|K@9vU&Xto l!Zo6)Z=XH$?SS;1a. vT墼TpMWkUx¯u:19XMoɣXS:GۣDr޺S(!IkF&XnXOlr`(?!j@C|YZ<4`5#dV_ k3W["P KE6MwY{$mSl%tUnmh~ЌP!p䣚3g)fћ i:"ljHfuYolEڻ?n{D!.[OW$3؈d X~sd/ᶿX'r-1ӹN<\*ܘy @m c_1|zQ'c LA_jk*Z(I )"I۶5p laT&Ѱ &$v+a*``ɱPlKPжQ:+z륾@l\* +$3c]Ne;nm(C9pO#ib!q-pql Cof hH9z NpwN姰[˥oDrFH6s<۶!w< 9d 9jﺟgyɐh=wG?>p(rCI9 p0a^E2ֶ-17AFmeSN1ys'^t8ߕ#PDj`}]X mu~( *o~H),$wi hE(^ 9߈yb=VzB cOJF-S  hKV^sNi7?x>q/+P6{J'gl_69s<ض%W|\\ېSXiB#l j(cRwF9#m ]$WBRK͑ M?WףP!a۞nFA" Wayland logo vokoscreenNG-3.1.0/src/pictures/windows.license000066400000000000000000000001501416353147400216050ustar00rootroot00000000000000[license] author=Volker Kohaupt vkohaupt@freenet.de url=/src/pictures/windows.png license=Public Domain vokoscreenNG-3.1.0/src/pictures/windows.png000066400000000000000000000432031416353147400207550ustar00rootroot00000000000000PNG  IHDR\rf}iCCPicc(}=H@_?E* vqP,VBЪɥB$Qp-8XupqU?@]%1ݽ;_/3 fdBV+Aϊb >y?G7gnXēy8JB|N cO *ٽqۥqr$"Br{o!pIȘ(TWwMƾg\@;\ V2d3 Efxx<' 7YM5Pdx<׾2Qo3PsqE@*"+]ǜM Ŧߎ;es/sڝGuqZ4AʼH!3r{]@Pϋ!0nm,ԕ!_Ҿna/@BLf 1Z"IDATxs\usoHp8f<M$5HIʮUI'˖kXxlEJTqيbKv{F#Gt^X{y{ !gnOUf~~}w`1c1c1pBoaҚ)-ceeWW_˟mBjfcj{61]L|ձG??(ET6j:*ӟfNXU<9҅88Y8(D~ڧ?(ګ9p0HTLܸ5,jYzy?չ493 _}b7qbTbk#@ ZnL0CD޷WGfSJ9جVG/w3Vv{Gh ;At́ r エ8߆s5vDo\_+ʂ[AzH[Lv3Ac6(/*q t! *Ȃr{tf6w'~Y%ɅR]]Q3xO>{fl*q~JwO]I@@}^t> K3m@r#9oӥ_Z*ƛ+\:gDoSo9^!Np`Qrh7 M܏.~ۼ[q6{y*z\k AZ/#[$O'X(邖hr<жܹ]͑_W"*X^~cnJu|nTPo'28rT;v2]tU7 ڲA[6z}Jw N`AfD_X~||t~TԍR);t21IЖ% $wtVciyZ3XxbyZZj+X_ݯ|S L9)@9I !P N!{R# q`FDP~vZm|{u9/6V[aGSv,Xq0aEӏc(v| @y"`/oGXVcs}kM`J}˵굍z\جҿMnTd ydH:w^w` T/,UW47 =2CW*-WW6xc5u,ĩ"ģuq"Z܇X#//Jڪ-@7^VGXO)K 5b/*8uf T uޮ4.`4^- W_.;kboSk!>jw~DB{7 3'G@%AM]8y֑oM!7ء߾97lnmKXo|k]S:lE?d@/٩; ,0y޼mt;B͎I \rXRv4o9[=;30V//6׮^t<}lfwG͍̜Υ@)^$q_x#D5Mt;o//L6KV%?_ nT3nkS8$ 2;hmu썂sGgp@U^Pzdu|S[Hfӿ'虶HB&Kwid"%F09a=l D ؙ+^G5QP`ce"d3q M߬|pTyZ]nJ꓿I[Ge((YO(?3 LH=A~;oHk8ٳ-Ԯ7ZqOӣ'%ѻTpƷό7ʢ,el+?}`V~,D~g|zj k%-m;Tfn9RYTd͗ [gC߭=~&󥯽zD7)<' m5n?{n޼(ʒ5ّ_svvEvp6s߻\88 lT"Z{sxmBTk78lWod+rrmy.XOgVCxr;Ǻ^v"*݆xȁ:5*1*HWa+hj9DDso@"r_^sVqyX^HՒO޸=vغNr,+‹0'AyE#iAb/ nA!D|0\%X)(by&VʥFu1-p/l)tkD @h?q]c' Tykʿʞyt[-+N| hH@9v;ۺkKao4SmݝTȺ{9ۅ |I n=;c ;>vc;%麡J4DhϟGH{pH)Цϝ-ql`0q# Jl F:^Zi ECīaiF`4RJkġ9;80@J` 0`뀎c&1WC8DR1`$"!!oG5뀰~01@O8La'4!c!Ė#n93ܰ.N0C><#cY?p mݎ0LsBRJ9&ImEq8<c!Ob5< ׺`R\ Ob -!ObdB M3chq "` , 7C@d{:66X?q "B*lǖO  ҍc35:0f 0# r*n d0P(݁1: 5ql0f@"2R9;8>@(!q ;<AdU 0$ ~ 0xwЛ ͬa@/L`0063B06?F`8":fO #meط{ږdYĝЌH?v7AHX!Jo "Bs@1Oo;X1G>;| [6=@%LZV$t VB/(,Bhǖs(@Ѝ۹|+Jtڭ4ܳp u;i}_'vznnhޯśP:^dY}$vZJFR߻F&1ڶ]_,ںVlx//}W0bo8Qm#@:i%776M(lom%bSxa@kmݯ0Faa;|WkmM|눸_\c1c1c18݀AD#<NS ˈ~sN@?GCoO?4@Ŏ/TATnpߣmAO? q,g /#"U;;B8 ?%xG =_3=5b/x%@_DwN&*//# .|g)oԪ.&cէY6M!НMO%/nSۂlH; +c'^ZK$'̆1ql:$$x^D,~9582q\@܊lV!T*u!8V= E " \`0PEH7vb0иvXLZs;!OyB4*@ju3H Ƀb2 [ CZ9J!p}dS}Ob'30p={`቏Oc2?~f*. %^DtArN 'M0Hh0Vc@'N  ovhв8 ; ] d9{21Aו7'#{m>Ȧ lH;a k9@@bIB`械6L ]8S݄fvXq3~4l#SO_>a'y24l5l `* hayqؐ<䲤,ڬ/DIlU`k v@xf‚kf I@ C;1sC -@n@hc}=Mϓء Mɦ-Btxx. "g03S hбv,l~Lf p7<0dl4oCb &ȒFC&>`tGQZd7ڙ  M r@pmRڶ03݀D#BD(k8,D#B/<ˀ.l2fuMжg`vXBirdo a *@\!"Rrphhl74s{X )?Dh3L m WA> 4d]f *B (1>N$:ʆ Mo) @ 1,^dK>#cs z؀wr&DF"aRv-GpQ$xcF`B@‍H&^  -%/&ܲϛ1dfB( qdd8n/j Q- "6R.!@Q@DZ;~*0C+@̈w*A߃1# 4^}$cǀ^6H4o<\@kmd8 If =ɲݰq3)nY_HSFD^f0.i# ,ў_$3=|Z)fHۋm,'7k[ Ҏ'[v"Ii) ccán@?_?^/Ra;7yj|:BZXW['6P'pT:m{w2 Á`YE= 0LК{ވ??{sda43sodNR#B&Zmx,^ `iDͼz8jDwi>1Jg9$Yٍz;]dHdf#3g5'[`85cKJFfľ"b:P<97^+-,xegֹ~}#]սܘܨo_H~6,8-?lBזP}'d1ty@w3vř7dwsjVM>\xvkzpjc-QD^&WfW6X`C/-A ;u<]j7Ÿn^Cc?w*˫+zjjZXHle[dZ󋹦_ -Np`lP863БR(o{mX/qKՕkjJTe jYNrm[mUw<=ui\=KI)kcKKK++˥Յ خ% ULFd1hN~<=kg5ak "[UPAvX:c+KW.-Ws)Q_]RMHR+(&W麓;M%!F(,B8[ ұ:lc$ ;Bc%j+˗n^,?x!+t厌elSfƴ@HKBj-,JL31P 6|EDAu٩vD*SgřV1=n `ZHerHH7J3\[rﱋJ奅3Xc3d~܉LfuH\X nX:VGz~d&}x 3Tw~z!_=vQ\^5;TZ׋N%Z A"?ZvVc:ytHx8t|-DG.NtЉ=;Ty&pcŅ[7˥|T'v~մ+vhO5ZWLo(۵D-w}l`=@QbˁXH@km,rAp{,."Js3#ӏ,>='WέxFo)t;nvөM;H(zw @6aӛ?{""wjz$ƒũ}v]k4ktRv؉tLg 7t3i-@Оʓ3߂ ]h<ȿOss3^yq6(9>Pk?R^n\l6/׷nwtvv7^.tX q2'b11llyk2'~$ cӵŵk鵍 ܒH巢d7|f+v| uDtp Sgh"w6 L}u:++Fi^dVQWLa3N`+(jNa;/;Z)3K>qv4qI"ʕKՕjjm˩z]looSb7T~!FǷl½o^/Qs7 ;>q{""XZZX^._4Z[ =捜ЩQjd)L:# XЛk@z5Wzљ7.WǪ+] MWI7%U;7jƕ "B(ޡ|0qA{'ܣ~SA2'ҐhTAܑLPXVTZXb!m}=vlԧfgίTy;g//u<?Yq5:] jiزe(lWYwdM2ٹ鍇x˜ Ӟ|&+nv\'8/dtd"/]/BmH:#}/P'd9رx",DTc1{Q̏fN+.]ZJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R_^9G)//?I|C{'m!нr>@%’BN?vQ K ;o+(R_^9G)//?I|C{'m!нr>@%’BN?vQ K ;o+(R_^9G)//?I|C{'m!нrrj|S$/}n&rBG @,@^`Ojɟ!нrR_^9_R!.|Ǐ znzvBoA,r9L~s׃T'"U#O)//?vWWm KxIgGU3 v$vϭr3 (TC0I6`AG U02w_!нrДY4Um$<̜,2Eq{4#>k*pp8ORiI$(X7c0gEm -q%5.nT#׊HcVT>~O־0DNYWO(jea,״O]D[mB ́V$ 8:~(eP ;Ϙg>6JͣքQE>(($sUQX1Fp\Q`f:1FQ l98;'"F G=F#߽Z)lVݝM?5'[ư!rv<`~=9mnc71G QBW#998J#F%v{oc܀IzO=fkQmyq56|q$ǒ9 p\%4JĞTك^3Ԫod n#HI v,>I}oG8?5rR<{غ9xdfd`V 0rG89`rxSuhm`R|p.I\+G/ݞx&O [d5(zeHUs^]H!҃ȿb啐.qxx# sQFV[Ɉ0QZEP ((~2ͦ?n':F#>`5y|O[K (VB-ĖRNđlaGxݯlםۗc8H?ʦZm&T̪H dJ>6v4BYIܳ -#08p09=I55%%:I<4$a1M6ѫ7?(U(-T``{QEfAEPLDOMOO-QxD?1+'習իotƬ[f?ׁ$OF5Q_@|QEQEQEQEQEQE_iӿ?|5j?tU>7}m/QPh}[iP5U5CiP5U5}$>|OQT@QEQEQES&Q'SKfT~$u7O?jp?hxD?1U?:0ĉKј4QE}EPEPEPEPEPEPee:D#mF^w_9S~}QEնs_ST6s_SWCGߨQEDQ@Q@Q@2o>7??ʔeGG]otƪ/QݻQ=Z7cT>/ʷ8A GQQE'ʅQ@Q@Q@Q@Q@Q@F?O%yz??d~7}mQPh}[iP5U5CiP5U5}$>|OQT@QEQEQES&Q'SKfT~$u7O?jkr'MҬ 4!*Qps肊(Om?ʦm?ʦP* ( ( ( d$t*}2o)lʏĎ&GэY9}KZ~7O?j4_K_;CGb??FcEgɅQ@Q@Q@Q@Q@Q@G(? ⳏ? Iz(͏m?ʦKn$ӷCy2Ht]|4O|׵eM9C4pO}G5 ga_1yjC/J*-O5Q;+K%ձX< !8x[j}v~ ?2hoF/[oO"ؿ7hg?_fQZ?Z_o.<O?b/̡LDZ?FE gccRx-|_&Mq9j_䵹:]'3nLT|Yj"k(-/p]ܞ:5AZ.P]N^#? kWQRdx?7>Ւsߣq$QEfj};wŢoCѾ5o}@_&/A?պii*MOeVqIhԸΪm䗲~0U?O|OBUg#RecЧch)E[,hYL\ RT^N07r(ϧڕ/L?ls['fsB܀ 8U|CIGj -C iJB ,)ph? ipXgxA_X$ڍɿ1 ?9G&6{|+o}G[1?9G&0ύb?n3c㔟E>7r(> ԭ~?tE>7r.7r)Bwv_/&ύrL#?sTQ }A[?0^7?OL)+So/Όc?OL|\}FA[3>;_ڞ8x騘`Y)Oy}zO??d֊Gs=QEUOC*2І ՚WCjJ*?Ï>SYz(((((|7 kcLՙɪσ4{F'Hz_\ z +z]B4lg!mu}/z%[aEUQ@Q@Q@րGG!?zR?4 VVْvƏ6sQE}aEPEPEPEPEPEPcFI^y^G _OJŗX_QXXE>PjJ:>J%Š(3 ( ( ( Z(5x0m'VŨhIV|"Ҧojd=Y">sQE}EPEPEPEPEPEP|bSCz_8׊o^}_=_gaDQEdn}_oRVx[Rk/{uٕ_.y9 ˌg9=1eզj Hda }<O cP((((((ό?8^Iyz$Оzeϫ (6>("uV_FFd"hs `#xb͹4˱vT*i 1N;ʯ2 p\s[SM➌Qqp m_6ۇSHBDX*!=q';WuEkEX&a,% oy̖W\Zl*2"<8瞝O>$rHcӴ6}pAk*)]7󭣎[AtyʌZSq?k5Xy)2,aр6pF8rBg-'L`F돘xƫ0vʕ~4좱'!tEXtexif:DateTime2020:08:16 06:39:07̄K1tEXtexif:ImageLength256,tEXtexif:ImageWidth2568֡tEXtexif:SoftwareGIMP 2.10.123-tEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`vokoscreenNG-3.1.0/src/player/000077500000000000000000000000001416353147400162115ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/player/QvkPlayer.cpp000066400000000000000000000736741416353147400206540ustar00rootroot00000000000000/* 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 "QvkFileDialog.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 (":/pictures/player/start.png" ) ); ui->pushButtonPause->setIcon(QIcon( ":/pictures/player/pause.png" ) ); ui->pushButtonStop->setIcon( QIcon( ":/pictures/player/stop.png" ) ); ui->toolButtonFrameBackward->setIcon( QIcon( ":/pictures/player/go-previous.png" ) ); ui->toolButtonFrameForward->setIcon( QIcon( ":/pictures/player/go-next.png" ) ); ui->toolButtonOpenFile->setIcon( QIcon( ":/pictures/player/document-open.png" ) ); ui->toolButtonMute->setIcon( QIcon( ":/pictures/player/audio-volume-high.png" ) ); ui->toolButtonFullscreen->setIcon( 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), this, [=](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(); } 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() { QApplication::setDesktopSettingsAware( false ); QString file; QvkFileDialog vkFileDialog( this ); vkFileDialog.setVideoPath( uiMainWindow->lineEditVideoPath->text() ); if ( vkFileDialog.exec() == QDialog::Accepted ) { if ( !vkFileDialog.selectedFiles().empty() ) { file = vkFileDialog.selectedFiles().at(0); } } if ( !file.isEmpty() ) { setMediaFile( file ); slot_play(); pathOpenFile = QDir( file ).absolutePath(); } QApplication::setDesktopSettingsAware( true ); } 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().request().url().toString() + " - " + 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( ":/pictures/player/audio-volume-muted.png" ) ); sliderVolume->setEnabled( false ); ui->toolButtonMute->setEnabled( true ); return; } if ( muted == false ) { ui->toolButtonMute->setIcon( QIcon( ":/pictures/player/audio-volume-high.png" ) ); 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->widgetSidbar->hide(); uiMainWindow->horizontalLayout_49->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( ":/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->widgetSidbar->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( ":/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.1.0/src/player/QvkPlayer.h000066400000000000000000000056141416353147400203060ustar00rootroot00000000000000/* 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.1.0/src/player/QvkPlayerVideoSurface.h000066400000000000000000000042061416353147400226020ustar00rootroot00000000000000/* 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.1.0/src/player/player.pri000066400000000000000000000003001416353147400202120ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkPlayerVideoSurface.h \ $$PWD/QvkPlayer.h SOURCES += $$PWD/QvkPlayer.cpp FORMS += $$PWD/player.ui vokoscreenNG-3.1.0/src/player/player.ui000066400000000000000000000261751416353147400200570ustar00rootroot00000000000000 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 true Help vokoscreenNG-3.1.0/src/region/000077500000000000000000000000001416353147400162005ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/region/QvkRegionButtonArrow.cpp000066400000000000000000000065571416353147400230350ustar00rootroot00000000000000/* 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" #include 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( colorSelected ); 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.1.0/src/region/QvkRegionButtonArrow.h000066400000000000000000000030361416353147400224670ustar00rootroot00000000000000/* 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.1.0/src/region/QvkRegionChoise.cpp000066400000000000000000001636031416353147400217550ustar00rootroot00000000000000/* 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( Ui_formMainWindow *ui_formMainWindow ):handlePressed(NoHandle), handleUnderMouse(NoHandle), HandleColorBackground( Qt::lightGray ), HandleColorBackgroundSize( Qt::lightGray ), HandleColorByMousePressed( Qt::lightGray ), colorSelectedArrow( Qt::green ), 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 ui = ui_formMainWindow; 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 ); // With Qt::ToolTip no keyboard; setAttribute( Qt::WA_TranslucentBackground, true); setMouseTracking( true ); setFrameColor( Qt::darkGreen ); hide(); } void QvkRegionChoise::slot_init() { if ( ui->comboBoxScreencastScreenArea->currentIndex() > -1 ) { int index = ui->comboBoxScreencastScreenArea->currentIndex(); QList screenList = QGuiApplication::screens(); screen = screenList.at( index ); resize( screen->size().width(), screen->size().height() ); screenWidth = screen->size().width(); screenHeight = screen->size().height(); move( screen->geometry().x(), screen->geometry().y() ); } } 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() ) ) { QPixmap pixmap( ":/pictures/cursor/size_fdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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() ) ) { QPixmap pixmap( ":/pictures/cursor/size_ver.png" ); QCursor cursor( pixmap ); setCursor( cursor ); handleUnderMouse = TopMiddle; return; } QRect regionTopRight( frame_X + frame_Width - radius - 1, frame_Y - radius - 1, diameter + 2, diameter + 2 ); if ( regionTopRight.contains( event->pos() ) ) { QPixmap pixmap( ":/pictures/cursor/size_bdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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() ) ) { QPixmap pixmap( ":/pictures/cursor/size_hor.png" ); QCursor cursor( pixmap ); setCursor( cursor ); handleUnderMouse = RightMiddle; 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() ) ) { QPixmap pixmap( ":/pictures/cursor/size_all.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_fdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_ver.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_bdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_hor.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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.horizontalAdvance( 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.horizontalAdvance( 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.horizontalAdvance( 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.horizontalAdvance( 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.horizontalAdvance( 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.horizontalAdvance( 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.horizontalAdvance( 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.horizontalAdvance( 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.horizontalAdvance( 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.1.0/src/region/QvkRegionChoise.h000066400000000000000000000077671416353147400214320ustar00rootroot00000000000000/* 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 "ui_formMainWindow.h" #include "QvkRegionButtonArrow.h" #include #include class QvkRegionChoise : public QWidget { Q_OBJECT public: QvkRegionChoise( Ui_formMainWindow *ui ); 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(); void slot_init(); 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: Ui_formMainWindow *ui; 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.1.0/src/region/regionselection.pri000066400000000000000000000003561416353147400221110ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkRegionChoise.h \ $$PWD/QvkRegionButtonArrow.h SOURCES += $$PWD/QvkRegionChoise.cpp \ $$PWD/QvkRegionButtonArrow.cpp vokoscreenNG-3.1.0/src/screenManager/000077500000000000000000000000001416353147400174675ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/screenManager/QvkScreenManager.cpp000066400000000000000000000106151416353147400233720ustar00rootroot00000000000000/* 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() ) ); } void QvkScreenManager::init() { slot_screen_count_changed(); } QvkScreenManager::~QvkScreenManager() {} void QvkScreenManager::slot_screen_count_changed() { QList screen = QGuiApplication::screens(); if ( !screen.empty() ) { emit signal_clear_widget(); for ( int i = 0; i < screen.size(); i++ ) { if ( screen.at(i)->name() == QGuiApplication::primaryScreen()->name() ) { qDebug().noquote() << global::nameOutput << "This screen is the primary screen: " << QGuiApplication::primaryScreen()->name(); } 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.1.0/src/screenManager/QvkScreenManager.h000066400000000000000000000024411416353147400230350ustar00rootroot00000000000000/* 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(); void init(); 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.1.0/src/screenManager/screenManager.pri000066400000000000000000000001761416353147400227610ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkScreenManager.h SOURCES += $$PWD/QvkScreenManager.cpp vokoscreenNG-3.1.0/src/screencast.qrc000066400000000000000000000135451416353147400175660ustar00rootroot00000000000000 pictures/camera/camera-sidebar.png pictures/camera/camera.png pictures/cursor/size_hor.png pictures/cursor/size_ver.png pictures/cursor/size_all.png pictures/cursor/size_bdiag.png pictures/cursor/size_fdiag.png pictures/help/information.png pictures/linux.png pictures/log/log-sidebar.png pictures/log/log.png pictures/logo/logo.png pictures/player/move.png pictures/player/player.png pictures/player/go-next.png pictures/player/stop.png pictures/player/start.png pictures/player/fullscreen.png pictures/player/audio-volume-muted.png pictures/player/go-previous.png pictures/player/audio-volume-high.png pictures/player/restore.png pictures/player/pause.png pictures/player/player-sidebar.png pictures/player/document-open.png pictures/screencast/supported-formats.png pictures/screencast/sandglass.png pictures/screencast/preferences-system.png pictures/screencast/format-codec.png pictures/screencast/microphone.png pictures/screencast/shortcut.png pictures/screencast/monitor.png pictures/screencast/timer.png pictures/screencast/strip.png pictures/screencast/help-about.png pictures/screencast/monitor-sidebar.png pictures/screencast/missing.png pictures/screencast/accept.png pictures/screencast/undo.png pictures/screencast/author.png pictures/showClick/sandglass.png pictures/showClick/cursor.png pictures/showClick/halo.png pictures/showClick/vokoShowClick.png pictures/showClick/transparenz.png pictures/showClick/vokoShowClick-sidebar.png pictures/space.png pictures/systray/magnification.png pictures/systray/camera.png pictures/systray/exit.png pictures/systray/systray.png pictures/systray/record.png pictures/systray/pause.png pictures/systray/showclick.png pictures/wayland.png pictures/windows.png pictures/camera/camera.license pictures/cursor/size_all.license pictures/cursor/size_ver.license pictures/cursor/size_bdiag.license pictures/cursor/size_fdiag.license pictures/cursor/size_hor.license pictures/help/information.license pictures/linux.license pictures/log/log.license pictures/logo/logo.license pictures/player/move.license pictures/player/fullscreen.license pictures/player/go-next.license pictures/player/restore.license pictures/player/audio-volume-high.license pictures/player/stop.license pictures/player/player.license pictures/player/pause.license pictures/player/start.license pictures/player/document-open.license pictures/player/audio-volume-muted.license pictures/player/go-previous.license pictures/screencast/monitor.license pictures/screencast/accept.license pictures/screencast/preferences-system.license pictures/screencast/format-codec.license pictures/screencast/microphone.license pictures/screencast/shortcut.license pictures/screencast/undo.license pictures/screencast/sandglass.license pictures/screencast/supported-formats.license pictures/screencast/timer.license pictures/screencast/strip.license pictures/screencast/missing.license pictures/screencast/help-about.license pictures/showClick/cursor.license pictures/showClick/transparenz.license pictures/showClick/vokoShowClick.license pictures/showClick/sandglass.license pictures/systray/systray.license pictures/systray/exit.license pictures/systray/record.license pictures/template.license pictures/windows.license sound/wasapi.wav ciscoOpenh264/BINARY_LICENSE.txt spezialCheckBox/off.png spezialCheckBox/on.png spezialCheckBox/off.license spezialCheckBox/on.license language/ar.qm language/ca.qm language/cs_CZ.qm language/da_DK.qm language/de_AT.qm language/de_CH.qm language/de_DE.qm language/el_GR.qm language/eo.qm language/es_419.qm language/es_AR.qm language/es_MX.qm language/es.qm language/eu_ES.qm language/fa_IR.qm language/fi_FI.qm language/fr_FR.qm language/hu.qm language/id.qm language/it_IT.qm language/ja_JP.qm language/lt.qm language/nl_NL.qm language/no.qm language/pl_PL.qm language/pt_BR.qm language/pt_PT.qm language/pt.qm language/ru.qm language/sk_SK.qm language/sl.qm language/sr.qm language/sv_SE.qm language/th_TH.qm language/tr_TR.qm language/uk_UA.qm language/vi.qm language/zh_CN.qm language/zh_TW.qm vokoscreenNG-3.1.0/src/settings/000077500000000000000000000000001416353147400165555ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/settings/QvkSettings.cpp000066400000000000000000000614301416353147400215470ustar00rootroot00000000000000/* 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 "QvkSpezialCheckbox.h" #include #include #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(); } } // We want block the signals for shortcut ComboBox signals and set the default value QList listComboBoxShortcut = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listComboBoxShortcut.count(); i++ ) { if ( listComboBoxShortcut.at(i)->objectName().contains( "comboBox_shortcut", Qt::CaseInsensitive ) == true ) { listComboBoxShortcut.at(i)->blockSignals( true ); if ( listComboBoxShortcut.at(i)->objectName() == "comboBox_shortcut_start" ) { QString valueText = settings.value( listComboBoxShortcut.at(i)->objectName(), "F10" ).toString(); listComboBoxShortcut.at(i)->setCurrentText( valueText ); } if ( listComboBoxShortcut.at(i)->objectName() == "comboBox_shortcut_pause" ) { QString valueText = settings.value( listComboBoxShortcut.at(i)->objectName(), "F12" ).toString(); listComboBoxShortcut.at(i)->setCurrentText( valueText ); } if ( listComboBoxShortcut.at(i)->objectName() == "comboBox_shortcut_magnification" ) { QString valueText = settings.value( listComboBoxShortcut.at(i)->objectName(), "F9" ).toString(); listComboBoxShortcut.at(i)->setCurrentText( valueText ); } if ( listComboBoxShortcut.at(i)->objectName() == "comboBox_shortcut_camera" ) { QString valueText = settings.value( listComboBoxShortcut.at(i)->objectName(), "F8" ).toString(); listComboBoxShortcut.at(i)->setCurrentText( valueText ); } if ( listComboBoxShortcut.at(i)->objectName() == "comboBox_shortcut_showclick" ) { QString valueText = settings.value( listComboBoxShortcut.at(i)->objectName(), "F7" ).toString(); listComboBoxShortcut.at(i)->setCurrentText( valueText ); } if ( listComboBoxShortcut.at(i)->objectName() == "comboBox_shortcut_halo" ) { QString valueText = settings.value( listComboBoxShortcut.at(i)->objectName(), "F6" ).toString(); listComboBoxShortcut.at(i)->setCurrentText( valueText ); } } } // Then we set the values for all ComboBoxes 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 ); } } // After set all comboBox values we set the shortcut ComboBox signals for ( int i = 0; i < listComboBoxShortcut.count(); i++ ) { if ( listComboBoxShortcut.at(i)->objectName().contains( "comboBox_shortcut", Qt::CaseInsensitive ) == true ) { listComboBoxShortcut.at(i)->blockSignals( false ); } } // These settings must be set in this order: Format, Videocodec, Audiocodec // 1. Format QList listComboBoxFormat = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listComboBoxFormat.count(); i++ ) { if ( listComboBoxFormat.at(i)->objectName() == "comboBoxFormat" ) { QString valueText = settings.value( listComboBoxFormat.at(i)->objectName(), "" ).toString(); int valueInt = listComboBoxFormat.at(i)->findText( valueText ); if ( valueInt > -1 ) { listComboBoxFormat.at(i)->setCurrentIndex( valueInt ); } } } // 2. Videocodec QList listComboBoxVideo = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listComboBoxVideo.count(); i++ ) { if ( listComboBoxVideo.at(i)->objectName() == "comboBoxVideoCodec" ) { QString valueText = settings.value( listComboBoxVideo.at(i)->objectName(), "" ).toString(); int valueInt = listComboBoxVideo.at(i)->findText( valueText ); if ( valueInt > -1 ) { listComboBoxVideo.at(i)->setCurrentIndex( valueInt ); } } } // 3. Audiocodec QList listComboBoxAudio = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listComboBoxAudio.count(); i++ ) { if ( listComboBoxAudio.at(i)->objectName() == "comboBoxAudioCodec" ) { QString valueText = settings.value( listComboBoxAudio.at(i)->objectName(), "" ).toString(); int valueInt = listComboBoxAudio.at(i)->findText( valueText ); if ( valueInt > -1 ) { listComboBoxAudio.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 default. if ( ( listRadiobuttons.at(i)->objectName() == "radioButtonScreencastFullscreen" ) and ( settings.value( listRadiobuttons.at(i)->objectName(), true ).toBool() == true ) ) { listRadiobuttons.at(i)->click(); continue; } // We set WASAPI as default if ( ( listRadiobuttons.at(i)->objectName() == "radioButtonDirectSound" ) and ( settings.value( listRadiobuttons.at(i)->objectName(), false ).toBool() == false ) ) { listRadiobuttons.at(i)->click(); continue; } if ( ( listRadiobuttons.at(i)->objectName() == "radioButton_cisco_on" ) 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 default. 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( "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; } 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( "checkBox_shortcut" ) and ( settings.value( listCheckBox.at(i)->objectName(), false ).toBool() == true ) ) { listCheckBox.at(i)->setChecked( true ); continue; } // Start/Stop if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_start_strg" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_start_shift" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } // Pause/Continue if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_pause_strg" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_pause_shift" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } // Magnification if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_magnification_strg" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_magnification_shift" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } // Camera if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_camera_strg" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_camera_shift" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } // Showclick if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_showclick_strg" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_showclick_shift" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } // Halo if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_halo_strg" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); continue; } } if ( listCheckBox.at(i)->objectName() == "checkBox_shortcut_halo_shift" ) { if ( settings.value( listCheckBox.at(i)->objectName(), true ).toBool() == true ) { listCheckBox.at(i)->setChecked( true ); 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; } } } QList listSpezialCheckbox = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listSpezialCheckbox.count(); i++ ) { if ( settings.value( listSpezialCheckbox.at(i)->objectName(), false ).toBool() == true ) { emit listSpezialCheckbox.at(i)->signal_clicked( true ); } } } /* * */ 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() << global::nameOutput << 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() << global::nameOutput << 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() << global::nameOutput << 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() << global::nameOutput << 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() << global::nameOutput << 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" ) ) { if ( listToolButton.at(i)->isChecked() == true ) { settings.setValue( listToolButton.at(i)->objectName(), "audio-volume-muted" ); } else { settings.setValue( listToolButton.at(i)->objectName(), "audio-volume-high" ); } } } QList listSpezialCheckbox = ui_mainwindow->centralWidget->findChildren(); for ( int i = 0; i < listSpezialCheckbox.count(); i++ ) { settings.setValue( listSpezialCheckbox.at(i)->objectName(), listSpezialCheckbox.at(i)->isChecked() ); } } QString QvkSettings::getFileName() { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); return settings.fileName(); } QString QvkSettings::getVideoPath() { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); return settings.value( "lineEditVideoPath" ).toString(); } 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->vkSystrayAlternativeWindow->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(); } void QvkSettings::saveHaloColor( QColor value ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "Halo" ); settings.setValue( "Color", value ); settings.endGroup(); } void QvkSettings::readHaloColor( QvkHalo *vkHalo ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "Halo" ); QColor color = settings.value( "Color", vkHalo->colorDefault ).value(); vkHalo->vkHaloPreviewWidget->setColor( color ); vkHalo->vkHaloWindow->setColor( color ); settings.endGroup(); } void QvkSettings::saveShowclickColor( QColor color ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "ShowClick" ); settings.setValue( "Color", color ); settings.endGroup(); } void QvkSettings::readShowclickColor( QvkShowClick *vkShowClick ) { QSettings settings( QSettings::IniFormat, QSettings::UserScope, global::name, global::name, Q_NULLPTR ); settings.beginGroup( "ShowClick" ); QColor color = settings.value( "Color", vkShowClick->colorDefault ).value(); vkShowClick->vkPreviewWidget->setColor( color ); settings.endGroup(); } vokoscreenNG-3.1.0/src/settings/QvkSettings.h000066400000000000000000000042151416353147400212120ustar00rootroot00000000000000/* 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 "QvkRegionChoise.h" #include "QvkCameraController.h" #include "QvkSystrayAlternative.h" #include "QvkPlayer.h" #include "QvkHalo.h" #include "QvkShowClick.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 ); void saveHaloColor( QColor color ); void readHaloColor( QvkHalo *vkHalo ); void saveShowclickColor( QColor color ); void readShowclickColor( QvkShowClick *vkShowClick ); QString getFileName(); QString getVideoPath(); public slots: private slots: signals: protected: private: }; #endif vokoscreenNG-3.1.0/src/settings/settings.pri000066400000000000000000000001641416353147400211320ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSettings.h SOURCES += $$PWD/QvkSettings.cpp vokoscreenNG-3.1.0/src/showClick/000077500000000000000000000000001416353147400166435ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/showClick/QvkAnimateWindow.cpp000066400000000000000000000102521416353147400225770ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkAnimateWindow.h" #include "global.h" #include #include #include #include #ifdef Q_OS_LINUX #include #endif QvkAnimateWindow::QvkAnimateWindow( QWidget *parent, qreal x, qreal y, int showTime, QString button, qreal valueDiameter, qreal valueOpacity, QColor valueColor ) { setParent( parent ); setAttribute( Qt::WA_DeleteOnClose, true ) ; #ifdef Q_OS_LINUX if ( QX11Info::isCompositingManagerRunning() == true ) { setAttribute( Qt::WA_TranslucentBackground, true ); } else { setAttribute( Qt::WA_TranslucentBackground, false ); } #endif #ifdef Q_OS_WIN setAttribute( Qt::WA_TranslucentBackground, true ); #endif resize( valueDiameter + 10, valueDiameter + 10 ); move( x / devicePixelRatioF() - ( width() / 2 ), y / devicePixelRatioF() - ( height() / 2 ) ); mouseButton = button; diameter = valueDiameter; opacity = valueOpacity / 100; color = valueColor; QTimer::singleShot( showTime, this, SLOT( close() ) ); global::showclickCounter++; show(); } QvkAnimateWindow::~QvkAnimateWindow() { } void QvkAnimateWindow::closeEvent( QCloseEvent *event ) { Q_UNUSED(event); global::showclickCounter--; } void QvkAnimateWindow::paintEvent( QPaintEvent *event ) { Q_UNUSED(event); QPixmap pixmap( height() * devicePixelRatioF(), width() * devicePixelRatioF() ); pixmap.fill( Qt::transparent ); pixmap.setDevicePixelRatio( devicePixelRatioF() ); QPainter painterPixmap; painterPixmap.begin( &pixmap ); painterPixmap.setRenderHints( QPainter::Antialiasing, true ); qreal penWith = 5.0; QPen pen; pen.setWidthF( penWith ); pen.setColor( color ); pen.setStyle( Qt::SolidLine ); painterPixmap.setPen( pen ); painterPixmap.setBrush( Qt::NoBrush ); painterPixmap.setOpacity( opacity ); painterPixmap.drawEllipse( width()/2-diameter/2, height()/2-diameter/2, diameter, diameter ); // Paint pressed Button pen.setStyle( Qt::SolidLine ); pen.setWidthF( 3.0 ); painterPixmap.setPen( pen ); painterPixmap.setOpacity( opacity ); if ( mouseButton == "LeftButton" ) { QRectF rectF( width()/2 - diameter/2 + 1.5*penWith, height()/2 - diameter/2 + 1.5*penWith, diameter-3*penWith, diameter-3*penWith ); qreal startAngle = 90 * 16; qreal spanAngle = 180 * 16; painterPixmap.drawArc( rectF, startAngle, spanAngle ); } if ( mouseButton == "RightButton" ) { QRectF rectF( width()/2 - diameter/2 + 1.5*penWith, height()/2 - diameter/2 + 1.5*penWith, diameter-3*penWith, diameter-3*penWith ); qreal startAngle = -90 * 16; qreal spanAngle = 180 * 16; painterPixmap.drawArc( rectF, startAngle, spanAngle ); } if ( mouseButton == "MiddleButton" ) { QLineF line( width()/2, height()/2 - diameter/2 + 1.5*penWith , width()/2, height()/2 + diameter/2 - 1.5*penWith ); painterPixmap.drawLine( line ); } painterPixmap.end(); QPainter painter; painter.begin( this ); painter.drawPixmap( QPointF( 0, 0 ), pixmap ); painter.end(); setMask( pixmap.mask() ); } vokoscreenNG-3.1.0/src/showClick/QvkAnimateWindow.h000066400000000000000000000032071416353147400222460ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKANIMATEWINDOW_H #define QVKANIMATEWINDOW_H #include class QvkAnimateWindow: public QWidget { Q_OBJECT public: QvkAnimateWindow( QWidget *parent, qreal x, qreal y, int showTime, QString button, qreal valueDiameter, qreal valueOpacity, QColor valueColor ); virtual ~QvkAnimateWindow(); public slots: private: qreal diameter; qreal opacity; QColor color; QString mouseButton; private slots: protected: void paintEvent( QPaintEvent *event ); void closeEvent( QCloseEvent *event ); signals: }; #endif // QVKANIMATEWINDOW_H vokoscreenNG-3.1.0/src/showClick/QvkGlobalMouse.cpp000066400000000000000000000072551416353147400222530ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkGlobalMouse.h" #include #ifdef Q_OS_WIN #include #include #endif #ifdef Q_OS_LINUX #include #include #endif QvkGlobalMouse::QvkGlobalMouse() { timer = new QTimer; timer->setTimerType( Qt::PreciseTimer ); timer->setInterval( 10 ); connect( timer, SIGNAL( timeout() ), this, SLOT( slot_mousePressed() ) ); } QvkGlobalMouse::~QvkGlobalMouse() { } void QvkGlobalMouse::slot_on( bool value ) { if ( value == true ) { timer->start(); } if ( value == false ) { timer->stop(); } } #ifdef Q_OS_LINUX void QvkGlobalMouse::slot_mousePressed() { Display* display; Window root; display = XOpenDisplay( NULL ); root = DefaultRootWindow( display); Window root_return, child_return; int x, y; int win_x, win_y; unsigned int mask; XQueryPointer( display, root, &root_return, &child_return, &x, &y, &win_x, &win_y, &mask ); if ( ( mask & Button1Mask) | ( mask & Button2Mask ) | ( mask & Button3Mask ) ) { if ( pressed == 0 ) { QString mouseButton; if ( mask & Button1Mask ) { mouseButton = "LeftButton"; } if ( mask & Button2Mask ) { mouseButton = "MiddleButton"; } if ( mask & Button3Mask ) { mouseButton = "RightButton"; } pressed = 1; emit signal_mousePressed( win_x, win_y, mouseButton ); } } else { pressed = 0; } fflush(stdout); XCloseDisplay( display ); } #endif #ifdef Q_OS_WIN HHOOK hHook = NULL; QString Mouse_Button; int Mouse_X; int Mouse_Y; int pressed = 0; LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam ) { (void)lParam; (void)nCode; QPoint point = QCursor::pos(); switch( wParam ) { case WM_LBUTTONDOWN: { Mouse_Button = "LeftButton"; Mouse_X = point.x(); Mouse_Y = point.y(); pressed = 1; break; } case WM_RBUTTONDOWN: { Mouse_Button = "RightButton"; Mouse_X = point.x(); Mouse_Y = point.y(); pressed = 1; break; } case WM_MBUTTONUP: { Mouse_Button = "MiddleButton"; Mouse_X = point.x(); Mouse_Y = point.y(); pressed = 1; break; } } return CallNextHookEx( hHook, nCode, wParam, lParam ); } void QvkGlobalMouse::slot_mousePressed() { if ( once == false ) { hHook = SetWindowsHookEx( WH_MOUSE_LL, MouseProc, NULL, 0 ); once = true; } if ( hHook == NULL ) { qDebug() << "Hook failed"; } if ( pressed == 1 ) { //bool bol = UnhookWindowsHookEx( hHook ); pressed = 0; emit signal_mousePressed( Mouse_X, Mouse_Y, Mouse_Button ); } } #endif vokoscreenNG-3.1.0/src/showClick/QvkGlobalMouse.h000066400000000000000000000025071416353147400217130ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKGLOBALMOUSE_H #define QVKGLOBALMOUSE_H #include #include class QvkGlobalMouse: public QObject { Q_OBJECT public: QvkGlobalMouse(); virtual ~QvkGlobalMouse(); QTimer *timer; public slots: void slot_mousePressed(); void slot_on( bool value ); private: #ifdef Q_OS_LINUX int pressed = 0; #endif #ifdef Q_OS_WIN bool once = false; #endif private slots: protected: signals: void signal_mousePressed( int win_x, int win_y, QString mouseButton ); }; #endif // QVKGLOBALMOUSE_H vokoscreenNG-3.1.0/src/showClick/QvkPreviewWidget.cpp000066400000000000000000000045701416353147400226240ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkPreviewWidget.h" QvkPreviewWidget::QvkPreviewWidget( QWidget *parent ) : QWidget( parent ) { parentWidget = parent; color = Qt::red; diameter = 50; opacity = 0.7; } QvkPreviewWidget::~QvkPreviewWidget() { } void QvkPreviewWidget::paintEvent( QPaintEvent *event ) { Q_UNUSED(event); QPainter painter; painter.begin( this ); painter.setRenderHints( QPainter::Antialiasing, true ); qreal penWith = 5.0; QPen pen; pen.setWidthF( penWith ); pen.setColor( color ); pen.setStyle( Qt::SolidLine ); painter.setPen( pen ); painter.setBrush( Qt::NoBrush ); painter.setOpacity( opacity ); resize( parentWidget->width(), parentWidget->height()); painter.drawEllipse( parentWidget->width()/2-diameter/2, parentWidget->height()/2-diameter/2, diameter, diameter ); pen.setWidthF( 3.0 ); painter.setPen( pen ); QRectF rectF( width()/2 - diameter/2 + 1.5*penWith, height()/2 - diameter/2 + 1.5*penWith, diameter-3*penWith, diameter-3*penWith ); int startAngle = 90 * 16; int spanAngle = 180 * 16; painter.drawArc( rectF, startAngle, spanAngle ); painter.end(); } void QvkPreviewWidget::setColor( QColor value ) { color = value; repaint(); } QColor QvkPreviewWidget::getColor() { return color; } void QvkPreviewWidget::setDiameter( int value ) { diameter = value; repaint(); } int QvkPreviewWidget::getDiameter() { return diameter; } void QvkPreviewWidget::setOpacity( double value ) { opacity = value;; repaint(); } double QvkPreviewWidget::getOpacity() { return opacity; } vokoscreenNG-3.1.0/src/showClick/QvkPreviewWidget.h000066400000000000000000000026621416353147400222710ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKPREVIEWWIDGET_H #define QVKPREVIEWWIDGET_H #include #include #include class QvkPreviewWidget: public QWidget { Q_OBJECT public: virtual ~QvkPreviewWidget(); QvkPreviewWidget( QWidget *parent ); QWidget *parentWidget; void setColor( QColor color ); void setDiameter( int value ); void setOpacity( double value ); QColor getColor(); public slots: private: QColor color; int diameter; double opacity; int getDiameter(); double getOpacity(); private slots: protected: void paintEvent( QPaintEvent *event ); signals: }; #endif // QVKPREVIEWWIDGET_H vokoscreenNG-3.1.0/src/showClick/QvkPushButton.cpp000066400000000000000000000100231416353147400221400ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkPushButton.h" #include #include #include #include #include QvkPushButton::QvkPushButton( QColor valueColor) { color = valueColor; } QvkPushButton::~QvkPushButton() { } void QvkPushButton::paintEvent( QPaintEvent *event ) { Q_UNUSED(event); qreal penWidthFrame = 2; if ( mouseHover == false ) { QPainter painter; painter.begin( this ); painter.setRenderHints( QPainter::Antialiasing, true ); // Area painter.fillRect( 0, 0, width(), height(), color ); // Frame QPen penFrame; penFrame.setWidthF( 1.0 ); penFrame.setColor( Qt::lightGray ); penFrame.setStyle( Qt::SolidLine ); penFrame.setCapStyle( Qt::FlatCap ); penFrame.setJoinStyle( Qt::MiterJoin ); painter.setPen( penFrame ); painter.setBrush( Qt::NoBrush ); painter.drawRect( penWidthFrame/2, penWidthFrame/2, width() - penWidthFrame, height() - penWidthFrame ); painter.end(); } if ( mouseHover == true ) { QPainter painter; painter.begin( this ); painter.setRenderHints( QPainter::Antialiasing, true ); // Area QBrush brush( color ); painter.setBrush( brush ); painter.setPen( Qt::NoPen ); painter.drawRect( 0, 0, width(), height() ); // Frame QPen penFrame; penFrame.setWidthF( penWidthFrame ); penFrame.setColor( Qt::cyan ); penFrame.setStyle( Qt::SolidLine ); penFrame.setCapStyle( Qt::FlatCap ); penFrame.setJoinStyle( Qt::MiterJoin ); painter.setPen( penFrame ); painter.drawRect( penWidthFrame/2, penWidthFrame/2, width() - penWidthFrame, height() - penWidthFrame ); painter.end(); } if ( mousePressed == true ) { QPainter painter; painter.begin( this ); painter.setRenderHints( QPainter::Antialiasing, true ); // Area QBrush brush( color ); painter.setBrush( brush ); painter.setPen( Qt::NoPen ); painter.drawRect( 1, 1, width(), height() ); // Frame QPen penFrame; penFrame.setWidthF( penWidthFrame ); penFrame.setColor( Qt::cyan ); penFrame.setStyle( Qt::SolidLine ); penFrame.setCapStyle( Qt::FlatCap ); penFrame.setJoinStyle( Qt::MiterJoin ); painter.setPen( penFrame ); painter.drawRect( penWidthFrame/2 + 1, penWidthFrame/2 + 1, width() - penWidthFrame, height() - penWidthFrame ); painter.end(); } } void QvkPushButton::enterEvent( QEvent *event ) { Q_UNUSED(event); mouseHover = true; } void QvkPushButton::leaveEvent( QEvent *event ) { Q_UNUSED(event); mouseHover = false; } void QvkPushButton::mousePressEvent( QMouseEvent *event ) { mousePressed = true; QPushButton::mousePressEvent( event ); } void QvkPushButton::mouseReleaseEvent( QMouseEvent *event ) { mousePressed = false; QPushButton::mouseReleaseEvent( event ); } vokoscreenNG-3.1.0/src/showClick/QvkPushButton.h000066400000000000000000000026341416353147400216160ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKPUSHBUTTON_H #define QVKPUSHBUTTON_H #include #include class QvkPushButton: public QPushButton { Q_OBJECT public: QvkPushButton( QColor color ); virtual ~QvkPushButton(); public: public slots: private slots: private: QColor color; bool mouseHover = false; bool mousePressed = false; protected: void paintEvent( QPaintEvent *event ) override; void enterEvent( QEvent *event ) override; void leaveEvent( QEvent *event ) override; void mousePressEvent( QMouseEvent *event ) override; void mouseReleaseEvent( QMouseEvent *event ) override; }; #endif vokoscreenNG-3.1.0/src/showClick/QvkShowClick.cpp000066400000000000000000000146141416353147400217250ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 "QvkShowClick.h" #include "QvkPushButton.h" #include "QvkAnimateWindow.h" #include #include QvkShowClick::QvkShowClick() { } void QvkShowClick::init( Ui_formMainWindow *ui_formMainWindow ) { ui = ui_formMainWindow; setColorButtons(); setGlobalMouse(); setSpezialSlider(); setSpezialCheckBox(); setToolButtonDefaultValues(); setPreviewWidget(); } void QvkShowClick::setColorButtons() { QList listLayaout = ui->gridLayout_showclick_color_pushButton->findChildren(); for ( int i = 0; i < listLayaout.count(); i++ ) { for ( int x = 0; x < 20; x++ ) { if ( listLayaout.at(i)->objectName().section( "_", 2, 2 ) == QVariant::fromValue( Qt::GlobalColor(x) ).toString() ) { QvkPushButton *vkPushButton = new QvkPushButton( Qt::GlobalColor(x) ); vkPushButton->setObjectName( "PushButton_ShowClick_color_" + QVariant::fromValue( Qt::GlobalColor(x) ).toString() ); vkPushButton->setMaximumHeight( 23 ); listLayaout.at(i)->addWidget( vkPushButton ); connect( vkPushButton, &QPushButton::clicked, this, [=]() { vkPreviewWidget->setColor( Qt::GlobalColor(x) ); } ); break; } } } } void QvkShowClick::setSpezialSlider() { vkSpezialSliderDiameter = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayoutCircle->insertWidget( 0, vkSpezialSliderDiameter ); vkSpezialSliderDiameter->setObjectName( "sliderShowClickCircle" ); vkSpezialSliderDiameter->setTracking( true ); vkSpezialSliderDiameter->setMinimum( 40 ); vkSpezialSliderDiameter->setMaximum( 80 ); vkSpezialSliderDiameter->setValue( 50 ); vkSpezialSliderDiameter->setShowValue( false ); vkSpezialSliderDiameter->show(); connect( vkSpezialSliderDiameter, &QSlider::valueChanged, this, [=]( int value ) { vkPreviewWidget->setDiameter( value ); } ); vkSpezialSliderOpacity = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayoutOpacity->insertWidget( 0, vkSpezialSliderOpacity ); vkSpezialSliderOpacity->setObjectName( "sliderShowClickOpacity" ); vkSpezialSliderOpacity->setTracking( true ); vkSpezialSliderOpacity->setMinimum( 1 ); vkSpezialSliderOpacity->setMaximum( 100 ); vkSpezialSliderOpacity->setValue( 70 ); vkSpezialSliderOpacity->setShowValue( false ); vkSpezialSliderOpacity->show(); connect( vkSpezialSliderOpacity, &QSlider::valueChanged, this, [=]( int value ) { vkPreviewWidget->setOpacity( (double)value / 100 ); } ); vkSpezialSliderShowtime = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayoutShowtime->insertWidget( 0, vkSpezialSliderShowtime ); vkSpezialSliderShowtime->setObjectName( "sliderShowClickShowtime" ); vkSpezialSliderShowtime->setTracking( true ); vkSpezialSliderShowtime->setMinimum( 1 ); vkSpezialSliderShowtime->setMaximum( 20 ); vkSpezialSliderShowtime->setValue( 10 ); vkSpezialSliderShowtime->setShowValue( false ); vkSpezialSliderShowtime->show(); } void QvkShowClick::setSpezialCheckBox() { vkSpezialCheckbox = new QvkSpezialCheckbox(); vkSpezialCheckbox->setObjectName( "spezialCheckboxShowclick" ); ui->horizontalLayout_15->insertWidget( 1, vkSpezialCheckbox ); connect( vkSpezialCheckbox, SIGNAL( signal_clicked( bool ) ), vkGlobalMouse, SLOT( slot_on( bool ) ) ); } void QvkShowClick::setToolButtonDefaultValues() { connect( ui->toolButtonShowclickColorDefault, &QPushButton::clicked, this, [=]() { vkPreviewWidget->setColor( colorDefault ); } ); connect( ui->toolButtonShowclickDiameterDefault, &QPushButton::clicked, this, [=]() { vkSpezialSliderDiameter->setValue( diameterDefault ); } ); connect( ui->toolButtonShowclickOpacityDefault, &QPushButton::clicked, this, [=]() { vkSpezialSliderOpacity->setValue( opacityDefault ); } ); connect( ui->toolButtonShowclickTimeDefault, &QPushButton::clicked, this, [=]() { vkSpezialSliderShowtime->setValue( timeDefault ); } ); } void QvkShowClick::setGlobalMouse() { vkGlobalMouse = new QvkGlobalMouse(); connect( vkGlobalMouse, SIGNAL( signal_mousePressed( int, int, QString ) ), this, SLOT( slot_mousePressed( int, int, QString ) ) ); } void QvkShowClick::slot_mousePressed( int x, int y, QString mouseButton ) { QColor color; QList listPushButton = ui->centralWidget->findChildren(); for ( int i = 0; i < listPushButton.count(); i++ ) { if ( ( listPushButton.at(i)->underMouse() == true ) and ( listPushButton.at(i)->objectName().contains( "ShowClick_color" ) ) ) { QString objectNameColor = listPushButton.at(i)->objectName().section( "_", 3, 3); for ( int x = 0; x < 20; x++ ) { if ( QVariant::fromValue( Qt::GlobalColor(x) ).toString().contains( objectNameColor ) ) { color = Qt::GlobalColor(x); break; } } break; } else { color = vkPreviewWidget->getColor(); } } QvkAnimateWindow *vkAnimateWindow = new QvkAnimateWindow( this, x, y, vkSpezialSliderShowtime->value() * 100, mouseButton, vkSpezialSliderDiameter->value(), vkSpezialSliderOpacity->value(), color ); vkAnimateWindow->setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::ToolTip ); vkAnimateWindow->show(); } void QvkShowClick::setPreviewWidget() { vkPreviewWidget = new QvkPreviewWidget( ui->frame_3 ); vkPreviewWidget->setObjectName( "widgetCircle_1" ); vkPreviewWidget->show(); } vokoscreenNG-3.1.0/src/showClick/QvkShowClick.h000066400000000000000000000035011416353147400213630ustar00rootroot00000000000000/* vokoscreenNG * Copyright (C) 2017-2021 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 QVKSHOWCLICK_H #define QVKSHOWCLICK_H #include #include "ui_formMainWindow.h" #include "QvkPreviewWidget.h" #include "QvkSpezialSlider.h" #include "QvkSpezialCheckbox.h" #include "QvkGlobalMouse.h" class QvkShowClick : public QWidget { Q_OBJECT public: QvkShowClick(); void init( Ui_formMainWindow *ui_formMainWindow ); QvkSpezialCheckbox *vkSpezialCheckbox; QvkPreviewWidget *vkPreviewWidget; QColor colorDefault = Qt::red; public slots: void slot_mousePressed( int, int, QString ); protected: private: Ui_formMainWindow *ui; QvkSpezialSlider *vkSpezialSliderDiameter; QvkSpezialSlider *vkSpezialSliderOpacity; QvkSpezialSlider *vkSpezialSliderShowtime; void setColorButtons(); void setSpezialSlider(); void setSpezialCheckBox(); void setToolButtonDefaultValues(); void setPreviewWidget(); void setGlobalMouse(); QvkGlobalMouse *vkGlobalMouse; int diameterDefault = 50; int opacityDefault = 70; int timeDefault = 10; signals: }; #endif vokoscreenNG-3.1.0/src/showClick/showClick.pri000066400000000000000000000006601416353147400213070ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD SOURCES += $$PWD/QvkShowClick.cpp \ $$PWD/QvkPushButton.cpp \ $$PWD/QvkGlobalMouse.cpp \ $$PWD/QvkAnimateWindow.cpp \ $$PWD/QvkPreviewWidget.cpp HEADERS += $$PWD/QvkShowClick.h \ $$PWD/QvkPushButton.h \ $$PWD/QvkGlobalMouse.h \ $$PWD/QvkAnimateWindow.h \ $$PWD/QvkPreviewWidget.h vokoscreenNG-3.1.0/src/sound/000077500000000000000000000000001416353147400160455ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/sound/wasapi.wav000066400000000000000000003100701416353147400200510ustar00rootroot00000000000000RIFF0WAVEfmt DDdataLISTINFOvokoscreenNG-3.1.0/src/spezialCheckBox/000077500000000000000000000000001416353147400177735ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/spezialCheckBox/QvkSpezialCheckbox.cpp000066400000000000000000000130161416353147400242400ustar00rootroot00000000000000 #include "QvkSpezialCheckbox.h" #include #include QvkSpezialCheckbox::QvkSpezialCheckbox( QWidget *parent ) : QWidget( parent ) { setObjectName( "spezialCheckBox" ); setMinimumWidth( 100 ); setMinimumHeight( 34 ); setMaximumWidth( 100 ); connect( this, SIGNAL( signal_clicked( bool ) ), this, SLOT( slot_setChecked( bool ) ) ); } bool QvkSpezialCheckbox::isChecked() { return checked; } void QvkSpezialCheckbox::slot_setChecked( bool value ) { checked = value; repaint(); } void QvkSpezialCheckbox::slot_click() { if ( checked == true ) { checked = false; } else { checked = true; } repaint(); emit signal_clicked( checked ); } void QvkSpezialCheckbox::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); if ( checked == true ) { checked = false; } else { checked = true; } repaint(); emit signal_clicked( checked ); } void QvkSpezialCheckbox::paintEvent( QPaintEvent *event ) { Q_UNUSED( event ); QPainter painter( this ); painter.setRenderHints( QPainter::Antialiasing, true ); button_x = 2; button_y = 2; button_width = width() - 2 * button_x; button_height = height() - 2 * button_y; penWidth = 1; radius = 11; margin = 3; if ( isChecked() == false ) { paintUnChecked( painter ); } if ( isChecked() == true ) { paintChecked( painter ); } } void QvkSpezialCheckbox::paintChecked( QPainter &painter ) { QPen pen; pen.setColor( Qt::black ); pen.setWidthF( penWidth ); painter.setPen( pen ); QBrush brushButton( Qt::darkGreen ); painter.setBrush( brushButton ); QRectF rectButton( button_x, button_y, button_width, button_height ); painter.setBrush( brushButton ); QPainterPath painterPathButton; painterPathButton.addRoundedRect( rectButton, radius, radius, Qt::AbsoluteSize ); painter.drawPath( painterPathButton ); QPen penSlider; penSlider.setColor( Qt::black ); painter.setPen( penSlider ); qreal slider_x = ( button_width / 3 ) + margin; qreal slider_y = button_y + margin; qreal slider_width = ( button_width / 3 * 2 ) - ( 2 * margin ); qreal slider_height = button_height - ( 2 * margin ); QRectF rectSlider( slider_x, slider_y, slider_width, slider_height ); QBrush brushSlider( Qt::lightGray ); painter.setBrush( brushSlider ); QPainterPath painterPathSlider; painterPathSlider.addRoundedRect( rectSlider, radius - margin, radius - margin, Qt::AbsoluteSize ); painter.drawPath( painterPathSlider ); painter.setPen( Qt::NoPen ); QBrush brushRibs( Qt::darkGray ); painter.setBrush( brushRibs ); int step = 5; for ( int x = 0; x < 10; x++ ) { int value = step * x; painter.drawRect( slider_x + radius/2 + value, slider_y + margin, 3, slider_height - 2 * margin); } QPixmap pixmap( ":/spezialCheckBox/on.png" ); pixmap.setDevicePixelRatio( devicePixelRatioF() ); pixmap = pixmap.scaled( slider_height / 5 * 3 * devicePixelRatioF(), slider_height / 5 * 3 * devicePixelRatioF(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); painter.drawPixmap( button_x + margin + ( ( slider_x - button_x - margin ) / 2 ) - ( pixmap.width() / 2 / devicePixelRatioF() ), button_y + margin + ( slider_height / 5 ), pixmap ); } void QvkSpezialCheckbox::paintUnChecked( QPainter &painter ) { QPen pen; pen.setWidthF( penWidth ); pen.setColor( Qt::black ); painter.setPen( pen ); QBrush brushButton( Qt::darkRed ); painter.setBrush( brushButton ); QRectF rectButton( button_x, button_y, button_width, button_height ); painter.setBrush( brushButton ); QPainterPath painterPathButton; painterPathButton.addRoundedRect( rectButton, radius, radius, Qt::AbsoluteSize ); painter.drawPath( painterPathButton ); QPen penSlider; penSlider.setColor( Qt::black ); painter.setPen( penSlider ); qreal slider_x = button_x + margin; qreal slider_y = button_y + margin; qreal slider_width = ( button_width / 3 * 2 ) - ( 2 * margin ); qreal slider_height = button_height - ( 2 * margin ); QRectF rectSlider( slider_x, slider_y, slider_width, slider_height ); QBrush brushSlider( Qt::lightGray ); painter.setBrush( brushSlider ); QPainterPath painterPathSlider; painterPathSlider.addRoundedRect( rectSlider, radius - margin, radius - margin, Qt::AbsoluteSize ); painter.drawPath( painterPathSlider ); painter.setPen( Qt::NoPen ); QBrush brushRibs( Qt::darkGray ); painter.setBrush( brushRibs ); int step = 5; for ( int x = 0; x < 10; x++ ) { int value = step * x; painter.drawRect( slider_x + radius/2 + value, slider_y + margin, 3, slider_height - 2 * margin); } QPixmap pixmap( ":/spezialCheckBox/off.png" ); pixmap.setDevicePixelRatio( devicePixelRatioF() ); pixmap = pixmap.scaled( slider_height / 5 * 3 * devicePixelRatioF(), slider_height / 5 * 3 * devicePixelRatioF(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); painter.drawPixmap( slider_x+slider_width + ( button_width - slider_x - slider_width) / 2 - pixmap.width() / 2 / devicePixelRatioF(), button_y + margin + ( slider_height / 5 ), pixmap ); } vokoscreenNG-3.1.0/src/spezialCheckBox/QvkSpezialCheckbox.h000066400000000000000000000014241416353147400237050ustar00rootroot00000000000000 #ifndef QVKSPEZIALCHECKBOX_H #define QVKSPEZIALCHECKBOX_H #include #include class QvkSpezialCheckbox : public QWidget { Q_OBJECT public: QvkSpezialCheckbox(QWidget *parent = 0); bool isChecked(); public slots: void slot_setChecked( bool value ); void slot_click(); protected: void paintEvent(QPaintEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; private: int step; qreal button_x; qreal button_y; qreal button_width; qreal button_height; qreal penWidth; qreal radius; qreal margin; bool checked = false; void paintChecked( QPainter &painter ); void paintUnChecked( QPainter &painter ); signals: void signal_clicked( bool ); }; #endif vokoscreenNG-3.1.0/src/spezialCheckBox/created.txt000066400000000000000000000001371416353147400221440ustar00rootroot00000000000000 1. Created with openoffice 2. Export in openoffice to svg 3. With Gimp export the svg to png vokoscreenNG-3.1.0/src/spezialCheckBox/off.license000066400000000000000000000001541416353147400221110ustar00rootroot00000000000000 [license] author=Volker Kohaupt vkohaupt@volkoh.de url=/src/spezialCheckBox/off.png license=Public Domain vokoscreenNG-3.1.0/src/spezialCheckBox/off.odg000066400000000000000000000217011416353147400212410ustar00rootroot00000000000000PK(R.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK(R GYYThumbnails/thumbnail.pngPNG  IHDRzA IDATxn8@Qr`:ZOA^,l-? 郢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(l/??yOf|~GxBpXWNq}8+M[q3テϚӜ>>ȴ8>'cqFq` YGr|aMdlKp{"˚DZ-- cMc]8}k"GDvcm:/X;Hd8f}un}c6c=67czT"ڸu}"oڻue"XIdHK:79q,}DFűM?ݿa嬿O%uId>|}H";qsٶ|#zD6!8KO㽢٧>+M8hFVvId|j"}\}m~"8 ODݙ= >g4gjFu"SzOKdjr D^zsYqNWLh*2[\}\5W\>~PGNp}<ڤE}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}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAЌ}{kIENDB`PK(RBBmeta.xml 2021-01-08T18:17:302021-01-08T19:52:41PT16M10S3OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-9788PK(R settings.xmlZms6_aN\1`@/7FA\I__ GLvֻ5Xq˙>wWOl2>*B!R )qSQ\ݾŜX)(J"D7ˊ۳ jdA0RF|~>_}`<țe哻GBA|mZ NEY^*^R,`"T.=gadol(Osh֎쐃srrB~?6%(>u:aWo[`6GcQnsS.#uS6O@?&r/ykZ1}׷5^ W!.1h.߮dPD?a2x _VZ+SA]΢iX 2Cծ.*,v!8HbdI H[Ka-W[ޏ'Tot{]RBe>]:YZ*DJ_3/JPMfKYl`aoE<ݘ ݄_Gw3q|n:WH\`q2  gZH)<4@.[\ޟC0Dw:epWVۑj#$t t7uX4>ߞHn3>|L_޲>,YUUTa^WN4 =C>6a]jPDc?^u=ubW ?FЎ^Wh4hXv$Tφ\9R\-|TKѠdl/, {B{p+hZ5_ߵv:ne\:Lg?,DjtTy`cZu7Zz˄ uнu x4<;ki+#gvϝ^szÁa\h;n,}GlBϴL"t|Ltǖ@3FPRX =FHYu 9xοEGoPKϦ ke$PK(R content.xmlWM8﯈3򱛠$sӴ4J{u!6NHTp;4r2zʵ9DYF 0U:D-F_UY BK3X]1y=DaCtGtٖ\2b4eم\2b!Ts7#RAZ.!:[t]tDdݎOy\{ҡ F丘!Y[sK0R]j铪 ]4漉B΃lw]23ճ}VY*BnMyB-yz+]] bZ٣CRʧti&s>wZX8Ψdh b~EC0%lɩ}yMX42r 0-ml+ h4d7DVi*_lk90:B+]B!v$ }nύ{gLGq.1 .ǎCZ`DǵAPm{fp/xa?@/V,v}uߋoLm %aV<"J?Q+M۳`pK5F'NسRH ܸsm7 hӰVŃ^匶HKS T%E8ٹw(7+RT`-`RA |d$!Kf.EuB $ Ǔ #uxH8zy]2!pR? f<]1ђ}Y\9 ̹zP@C't"Fgr&B>XAs.INwҤW!0Nҿ#d'w-Vg%.1,Lq3CLX[{ދJ$'PK2 " PK(R 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֞1PK(RConfigurations2/toolpanel/PK(RConfigurations2/progressbar/PK(RConfigurations2/images/Bitmaps/PK(R'Configurations2/accelerator/current.xmlPKPK(RConfigurations2/floater/PK(RConfigurations2/toolbar/PK(RConfigurations2/menubar/PK(RConfigurations2/statusbar/PK(RConfigurations2/popupmenu/PK(RMETA-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/progressbar/PK(RxConfigurations2/images/Bitmaps/PK(R'Configurations2/accelerator/current.xmlPK(R Configurations2/floater/PK(RBConfigurations2/toolbar/PK(RxConfigurations2/menubar/PK(RConfigurations2/statusbar/PK(RConfigurations2/popupmenu/PK(RӷMETA-INF/manifest.xmlPK6uvokoscreenNG-3.1.0/src/spezialCheckBox/off.png000066400000000000000000000047231416353147400212610ustar00rootroot00000000000000PNG  IHDR@hgAMA a cHRMz&u0`:pQ<PLTEwyj+PG"_\ 9/T8}KBY g(!^HA? Fh30WS c`% x-~LQ i)OE' ӸtRNS 4Vmws_B%Kj{u? Ok)ݠW;dnEFyP!R\'i+ޡ6= G갺EibKGDH pHYs+tIMEliIDATxWI] ,nTшH'hPTDVE%7{gpH&~U?ןf=U/ڲukk𮚚[Z6lf;vFD]]c7={gMMo7ddk5tX>w8W}GCG:~TN~d4 ejթ4F9XЙNkz%/ s7-ryzJ13ܸu5f}/kaBƤ$É7 ÅDÊ)Kh/6}f*|JV^YK5G/؝H)QbcVrw##\c.6f='Gl?J0L;Bs<1 %q!Q^slYB(93ۈ <s6iUl)6.OoŲIM%60fہl/6ԺAlپCli38ЉІƌ"60Pq&0ȽIlJϽ0cJ^rkn{cc R;wf4yҰ0$܌'~6aÌ'6ozfI6#\3Pw)38scifDq~_3͘*K4K43K3SeiĒTb9f:1fJqV,L-7Ӌb^3%3̃b3Ì)!7ĴfbJ1Y,ILc%0K76K54K32K?y!,]o/6 5'ʩXٱXٹX@,L"eo# 2Ř B̤bfb3 f6YLbF3(f2Yb3,@Ll!.ޗDLh#&3 EIfqbfbfbfb'e,vd-vb.v`/F7{ F6{!j 7&T].;煮g_p{oBߜG}V[+oEu_V[éoV{B4boi|O[%3 k|/_ и?xGoW7}{ۡQ>v[շ폭ot}{;@߹N'w'0}g;P9Nwfy-x8~1Q/4Kә利̒4fYb 4{bD|1-,Rs^^̣̝Єq&#s O=a'1~_R1؊gfLloobk3 vokoscreenNG-3.1.0/src/spezialCheckBox/on.license000066400000000000000000000001531416353147400217520ustar00rootroot00000000000000 [license] author=Volker Kohaupt vkohaupt@volkoh.de url=/src/spezialCheckBox/on.png license=Public Domain vokoscreenNG-3.1.0/src/spezialCheckBox/on.odg000066400000000000000000000220301416353147400210770ustar00rootroot00000000000000PKN(R.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKN(R8XXThumbnails/thumbnail.pngPNG  IHDRzAIDATxj#GE/e" oI.iS/>85}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAE}PAzO}}ϒ>8?:E"8Jq'>x>(xˌ胦Wx>N?~>^z1xq}Y}%O}͉c|Ǔ]Zz8]gr8x>f}<寥w8y}<"'ˍ>u}q}<Ț1+qU/]ZzL_퓳='#eO5DV>Yn+/sE EOdt\2~o%}lq,]8ٵL.'}|WU=JDYy~"]KVctЬ,<-N%XĒ}@OȦ1Sfkݪ}Awե☥G$rvYm>GD_,h>m8f>?OD٬"ߵ[DVٲy\"11/ڶ[Lvc~11?Jd8Fr|H7_Od}|^q> .E";1xDGgq>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢>(胢?dK6IENDB`PKN(R:zAAmeta.xml 2021-01-08T19:23:12OpenOffice/4.1.4$Unix OpenOffice.org_project/414m5$Build-97882021-01-08T19:50:29PT7M52S2PKN(R settings.xmlZms6_aN\\1`@/7FA\I__#Lv| ,=jZEH^ۜȝ!3ipzw?}b Q2?I3m.ȀHADQE!YVܞ]LV# 672*A޴,+L8 DlNpp,jzWbø̯!&r> #%|c+@qx,JTevd0;[oKrwٸݧ1WαD6/Ϳz[nߺo9rr)燰D/7'1}ׅӥ!La\><9-BQʗHu#\BN;úXc~A&t ~3k@4K--I#(C3e bi1I4- a9XfuE58Z,=ik}qɼ2Rx͕,U]_|M'KKH +<2El8 l2#쵈;ĿpPn2M \+4uQ:Nf^a2C @f?&!(O V h!LܕUvw2 )gdv-S9| /3zSzJi$𪪊}!#J8yЌCād|pTeIY8l4Օ`GEA>b,|{#rޞ[MV1Or4("ˮ@$xd_R)iW躏oT~%V&ȋu 8*a8PU$/P7auKSZP&e{jt 9aJN41#f᪐6(SZ o H?!iVL}OxA4 Jeq8 hz4ݷ}Y؎mO;ʁZؽÎ(ӯYjiF!7 {}lZfՠ%~!!z l/>~X=/JhаHŸ _rZ-b? PkgAcٴ_X߻W2VF J0;qlNv^YTj0廅xAO h0EZ@9=e,>fH ܍*Tz(ȁa8~ tPK?Kyqb$PKN(R content.xmlWˎ8WDȣTIz%3lc Fc"hjs|_۷k)ggP.y0S]_MmǛsx)v*yeC* 3`W&mफTQ#LZђԲTռYN_튱79ހ}W;{n>;2X(OT0WPV_)BEB{؛p|Ig}y ha%Q\UY@w aF ilѭyyI`{p(*ciu)Vbtt4a+yu ʧ_%q5:R0Bg٧PgA`0 ς_0lF( ȿ ^9A;~"8hW2~X-*Qai@ pTzOӻÓ`_5-ГUe6|.8r R{5-x@Ʃ~Gj|h–8ads!e;a sm73W^D1q71%B_rC0~kp '/bd}{ýwV*.0J @]jŤ`tT:X 8+WP _B<,0o9IܢaZ=X( INϧBi+w |c}~Qvn)&J-k+>]}5l F˝'L,,Zn~޶Q@X58.6|K7Fƻ`ɶ $Z&NVape7~7,N)ltr\c[S ď \۔ MN6)n/s\ku,Ev\BA¯eUH(N@d_PKT PKN(R 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֞1PKN(RConfigurations2/toolpanel/PKN(RConfigurations2/progressbar/PKN(RConfigurations2/images/Bitmaps/PKN(R'Configurations2/accelerator/current.xmlPKPKN(RConfigurations2/floater/PKN(RConfigurations2/toolbar/PKN(RConfigurations2/menubar/PKN(RConfigurations2/statusbar/PKN(RConfigurations2/popupmenu/PKN(RMETA-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 snI:}MR 2W/[V`3e;H?cz Fkb#^Eh{ypv]ߪmtRNS&KctwlZ=-} iD uGN.ݢC7fm E@ydJ~!ރ%T (þY0ԍ,x]P$Ɓb4|gڛ8kBsp>An:62_/Sᇿ+X V\QłaLHjy&!}`G L;z 4(6)8'Q3 Sgs)rƠ3x;V9ϘavRw9U%N3f;FF:_N ]h#MƄ"wQ}vd]\?3Y%'t+r¿RMvhE\fџ;Jl [l3[ !&gعoٟaWBdbX $ ;&;$,CXgU0վ?ή+! Wi9@p%ПN;HΌH\#̞7MTӹ_);?yPe=өB+&z t^OPdAT`gv~:A-dǧS]W4Mm_!;?A-&{.T`xP?fǧ鯸M' cs_v~6, MP79)M- x+;?۠e9o9_tV@'t>AVf x;?>PlI%SSv~:Y [D[M{]{Dzq/hB*ъtl_r;>+ 榽N*qob)hf`-;?gc+8XK% T ~O^*(;?@*9sְKv|:k`gS؍:J鬇Nl? I%#t{&4Mt#tc8_C?6i&O -t@dv~6ѭ $;?B6L*&OJ%FA'`FJ%Ť;`R,DϔN;?P{ `RtŴDT9 C-K{-]Tv~:Tb;>1'P*1 :CDWi%/y :_fǧoi( 1TJ e3:_aǧs/J. PT"Ja$߫iK0(t>OuP*qJOJ rfy /JT`R eR]}&v}٩t;W%}JDKURj uJ]D3 ]RRfeR5IXcFTb}ݡڤibI%S֩J@?fI%>fI%znjB?njB}OT"}7D̷tJ%nA oĠ^I%A4fJ%> k(J .c̨J cJC;DwJݘ TmyOĞ" ^I@H%6.Q'c& R]4Q>YPC ?f#xW7S@8V1L4(:fK% 4fQ*ucFT"3RJFט&pZ1-e.Cbʌ]R YA1S9 -pИoɍ _X*%ctxa;.3@T-ƌ&{6ˌC]R b+L0R +Z3.*eחDfT&cXvwTf̌8PH*QT®mL|?t|B3+$ 4]P*ћZk(ce`/;kC\f\/J?f2Cn=ޑhFn%-ỳR 52;3`Df16%ˠCf@/TB L*]Q &QٚdĠWޥA z̔hL*U#Sp31-R QV_ކTE*! <xr?% 4Î_G˰Br`Ri&>A13 (Eh\}TB1|݃="cf̘Xy9K%d30wPkWKBcƒ/̘c ͋pȘ'6f&߹#9M߸1~r~ג?fƱ߲0>2R Y|3߯<7ߥw>5R Q|3x8T+u_tp.{3~KiP%0Nv 0dKMǞ Yy?UyU :$;C{%tEXtdate:create2021-08-07T22:15:04+02:00?n8%tEXtdate:modify2021-08-07T22:15:04+02:00fbքIENDB`vokoscreenNG-3.1.0/src/spezialCheckBox/on.svg000066400000000000000000000014631416353147400211340ustar00rootroot00000000000000 vokoscreenNG-3.1.0/src/spezialCheckBox/spezialCheckBox.pri000066400000000000000000000002401416353147400235610ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSpezialCheckbox.h SOURCES += $$PWD/QvkSpezialCheckbox.cpp vokoscreenNG-3.1.0/src/spezialSlider/000077500000000000000000000000001416353147400175275ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/spezialSlider/QvkSpezialSlider.cpp000066400000000000000000000136571416353147400235030ustar00rootroot00000000000000#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.horizontalAdvance( "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.1.0/src/spezialSlider/QvkSpezialSlider.h000066400000000000000000000014521416353147400231360ustar00rootroot00000000000000#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.1.0/src/spezialSlider/spezialSlider.pri000066400000000000000000000002061416353147400230530ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSpezialSlider.h SOURCES += $$PWD/QvkSpezialSlider.cpp FORMS += vokoscreenNG-3.1.0/src/systray/000077500000000000000000000000001416353147400164335ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/systray/QvkSystray.cpp000066400000000000000000000235251416353147400213060ustar00rootroot00000000000000/* 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 "QvkSpezialCheckbox.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 + " " + global::version ); titleAction->setEnabled( false ); startAction = new QAction( this ); startAction->setIcon( QIcon( ":pictures/player/start.png" ) ); startAction->setText( tr( "Start" ) ); startAction->setData( "Start" ); stopAction = new QAction( this ); stopAction->setIcon( QIcon( ":pictures/player/stop.png" ) ); stopAction->setText( tr( "Stop" ) ); stopAction->setData( "Stop" ); stopAction->setEnabled( false ); pauseAction = new QAction( this ); pauseAction->setIcon( QIcon( ":pictures/player/pause.png" ) ); pauseAction->setText( tr( "Pause" ) ); pauseAction->setData( "Pause" ); pauseAction->setEnabled( false ); continueAction = new QAction( this ); continueAction->setIcon( QIcon( ":pictures/player/start.png" ) ); continueAction->setText( tr( "Continue" ) ); continueAction->setData( "Continue" ); continueAction->setEnabled( false ); cameraAction = new QAction( this ); cameraAction->setIcon( QIcon( ":pictures/systray/camera.png" ) ); cameraAction->setText( tr( "Camera" ) ); cameraAction->setData( "Camera" ); cameraAction->setCheckable( true ); cameraAction->setEnabled( true ); magnifierAction = new QAction( this ); magnifierAction->setIcon( QIcon( ":pictures/systray/magnification.png" ) ); magnifierAction->setText( tr( "Magnification" ) ); magnifierAction->setData( "Magnification" ); magnifierAction->setCheckable( true ); showclickAction = new QAction( this ); showclickAction->setIcon( QIcon( ":pictures/systray/showclick.png" ) ); showclickAction->setText( "ShowClick" ); showclickAction->setData( "ShowClick" ); showclickAction->setCheckable( true ); haloAction = new QAction( this ); haloAction->setIcon( QIcon( ":pictures/systray/showclick.png" ) ); haloAction->setText( "Halo" ); haloAction->setData( "Halo" ); haloAction->setCheckable( true ); exitAction = new QAction( this ); exitAction->setIcon( QIcon( ":pictures/systray/exit.png" ) ); 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( ui->checkBoxCameraOnOff, SIGNAL( toggled( bool ) ), cameraAction, SLOT( setChecked( bool ) ) ); connect( cameraAction, SIGNAL( triggered( bool ) ), ui->checkBoxCameraOnOff, SLOT( setChecked( bool ) ) ); connect( ui->comboBoxCamera, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slot_currentIndexChanged( int ) ) ); connect( ui->checkBoxMagnifier, SIGNAL( toggled( bool ) ), magnifierAction, SLOT( setChecked( bool ) ) ); connect( magnifierAction, SIGNAL( triggered( bool ) ), ui->checkBoxMagnifier, SLOT( click() ) ); QList listSpezialCheckbox = ui->centralWidget->findChildren(); for ( int i = 0; i < listSpezialCheckbox.count(); i++ ) { if ( listSpezialCheckbox.at(i)->objectName() == "spezialCheckboxShowclick" ) { connect( listSpezialCheckbox.at(i), SIGNAL( signal_clicked( bool ) ), showclickAction, SLOT( setChecked( bool ) ) ); connect( showclickAction, SIGNAL( triggered( bool ) ), listSpezialCheckbox.at(i), SLOT( slot_click() ) ); } if ( listSpezialCheckbox.at(i)->objectName() == "spezialCheckboxHalo" ) { connect( listSpezialCheckbox.at(i), SIGNAL( signal_clicked( bool ) ), haloAction, SLOT( setChecked( bool ) ) ); connect( haloAction, SIGNAL( triggered( bool ) ), listSpezialCheckbox.at(i), SLOT( 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( cameraAction ); menu->addAction( magnifierAction ); menu->addAction( showclickAction ); menu->addAction( haloAction ); 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() ) ); connect( &version, SIGNAL( signal_newVersionAvailable( QString ) ), this, SLOT( slot_newVersionAvailable( QString ) ) ); connect( ui->checkBoxLookForUpdates, SIGNAL( toggled( bool ) ), &version, SLOT( slot_doDownload( bool ) ) ); if ( ui->checkBoxCameraOnOff->isEnabled() == false ){ cameraAction->setEnabled( false ); } } void QvkSystray::slot_newVersionAvailable( QString update ) { if ( ui->checkBoxLookForUpdates->isChecked() == true ) { if ( global::version < update ) { if ( QSystemTrayIcon::supportsMessages() == true ) { connect( this, SIGNAL( messageClicked() ), this, SLOT( slot_showHomepage() ) ); showMessage( global::name, "New Version available: " + update, QSystemTrayIcon::Information, 5000 ); } } } } void QvkSystray::slot_showHomepage() { QDesktopServices::openUrl(QUrl("https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html", QUrl::TolerantMode)); } // 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 ) { setIcon( QIcon( ":/pictures/systray/record.png" ) ); } void QvkSystray::slot_setSystrayIcon( bool ) { setIcon( QIcon( ":/pictures/systray/systray.png" ) ); } void QvkSystray::slot_setPauseIcon( bool ) { setIcon( QIcon( ":/pictures/systray/pause.png" ) ); } void QvkSystray::slot_currentIndexChanged( int index ) { if ( index > -1 ) cameraAction->setEnabled( true ); else cameraAction->setEnabled( false ); } vokoscreenNG-3.1.0/src/systray/QvkSystray.h000066400000000000000000000035561416353147400207550ustar00rootroot00000000000000/* 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 "QvkVersion.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; QvkVersion version; QAction *cameraAction; QAction *magnifierAction; QAction *showclickAction; QAction *haloAction; private slots: void slot_hide(); void slot_setRecordIcon( bool ); void slot_setSystrayIcon( bool ); void slot_setPauseIcon( bool ); void slot_newVersionAvailable( QString update ); void slot_showHomepage(); void slot_currentIndexChanged( int index ); protected: signals: void signal_SystemtrayIsClose(); }; #endif vokoscreenNG-3.1.0/src/systray/systray.pri000066400000000000000000000002041416353147400206610ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSystray.h SOURCES += $$PWD/QvkSystray.cpp vokoscreenNG-3.1.0/src/systrayAlternative/000077500000000000000000000000001416353147400206325ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/systrayAlternative/QvkSystrayAlternative.cpp000066400000000000000000000157731416353147400257120ustar00rootroot00000000000000#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() ); vkSystrayAlternativeWindow = new QvkSystrayAlternativeWindow( this ); vkSystrayAlternativeWindow->setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::ToolTip ); slot_setSystrayIcon( true ); QAction *titleAction = new QAction( this ); titleAction->setIcon( QIcon( ":pictures/systray/systray.png" ) ); titleAction->setText( global::name + " " + global::version ); titleAction->setEnabled( false ); startAction = new QAction( this ); startAction->setIcon( QIcon( ":/pictures/player/start.png" ) ); startAction->setText( tr( "Start" ) ); startAction->setData( "Start" ); stopAction = new QAction( this ); stopAction->setIcon( QIcon( ":/pictures/player/stop.png" ) ); stopAction->setText( tr( "Stop" ) ); stopAction->setData( "Stop" ); stopAction->setEnabled( false ); pauseAction = new QAction( this ); pauseAction->setIcon( QIcon( ":/pictures/player/pause.png" ) ); pauseAction->setText( tr( "Pause" ) ); pauseAction->setData( "Pause" ); pauseAction->setEnabled( false ); continueAction = new QAction( this ); continueAction->setIcon( QIcon( ":/pictures/player/start.png" )); continueAction->setText( tr( "Continue" ) ); continueAction->setData( "Continue" ); continueAction->setEnabled( false ); exitAction = new QAction( this ); exitAction->setIcon( QIcon( ":/pictures/systray/exit.png" ) ); 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 ); vkSystrayAlternativeWindow->set_Menu( menu ); } QvkSystrayAlternative::~QvkSystrayAlternative() { } void QvkSystrayAlternative::setVisible( bool value ) { vkSystrayAlternativeWindow->setVisible( value ); } void QvkSystrayAlternative::slot_resizeWindow( int value ) { size = QSize( 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::slot_setRecordIcon( bool ) { QPixmap pixmap( ":/pictures/systray/record.png" ); pixmap = pixmap.scaled( size , Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); vkSystrayAlternativeWindow->set_Size( size, pixmap ); } void QvkSystrayAlternative::slot_setSystrayIcon( bool ) { QPixmap pixmap( ":/pictures/systray/systray.png" ); pixmap = pixmap.scaled( size , Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); vkSystrayAlternativeWindow->set_Size( size, pixmap ); } void QvkSystrayAlternative::slot_setPauseIcon( bool ) { QPixmap pixmap( ":/pictures/systray/pause.png" ); pixmap = pixmap.scaled( size , Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); vkSystrayAlternativeWindow->set_Size( size, pixmap ); } void QvkSystrayAlternative::slot_ShowInSystrayAlternativeReset( bool ) { vkSystrayAlternativeWindow->move( 0, 0 ); sliderShowInSystrayAlternative->setValue( 48 ); } vokoscreenNG-3.1.0/src/systrayAlternative/QvkSystrayAlternative.h000066400000000000000000000021621416353147400253430ustar00rootroot00000000000000#ifndef SYSTRAYALTERNATIVE_H #define SYSTRAYALTERNATIVE_H #include "ui_formMainWindow.h" #include "QvkSpezialSlider.h" #include "QvkSystrayAlternativeWindow.h" #include #include #include class QvkSystrayAlternative : public QWidget { Q_OBJECT public: explicit QvkSystrayAlternative( QMainWindow *mainWindow, Ui_formMainWindow *ui_mainwindow, QvkSpezialSlider *gui_sliderShowInSystrayAlternative ); ~QvkSystrayAlternative(); QvkSystrayAlternativeWindow *vkSystrayAlternativeWindow; void setVisible( bool ) override; 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: }; #endif // SYSTRAYALTERNATIVE_H vokoscreenNG-3.1.0/src/systrayAlternative/QvkSystrayAlternativeWindow.cpp000066400000000000000000000034511416353147400270700ustar00rootroot00000000000000#include "QvkSystrayAlternativeWindow.h" #include #include #ifdef Q_OS_LINUX #include #endif QvkSystrayAlternativeWindow::QvkSystrayAlternativeWindow( QWidget *parent ) { Q_UNUSED(parent) #ifdef Q_OS_LINUX if ( QX11Info::isCompositingManagerRunning() == true ) { setAttribute( Qt::WA_TranslucentBackground, true ); } else { setAttribute( Qt::WA_TranslucentBackground, false ); } #endif #ifdef Q_OS_WIN setAttribute( Qt::WA_TranslucentBackground, true ); #endif } QvkSystrayAlternativeWindow::~QvkSystrayAlternativeWindow() { } void QvkSystrayAlternativeWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPixmap pixmap( size.width() * devicePixelRatioF(), size.height() * devicePixelRatioF() ); pixmap.fill( Qt::transparent ); pixmap.setDevicePixelRatio( devicePixelRatioF() ); QPainter painterPixmap; painterPixmap.begin( &pixmap ); painterPixmap.setRenderHints( QPainter::Antialiasing, true ); painterPixmap.drawPixmap( 0, 0, picture ); painterPixmap.end(); QPainter painter; painter.begin( this ); painter.drawPixmap( QPointF( 0, 0 ), pixmap ); painter.end(); setMask( pixmap.mask() ); } void QvkSystrayAlternativeWindow::set_Size( QSize m_size, QPixmap m_picture ) { resize(m_size); size = m_size; picture = m_picture; repaint(); } void QvkSystrayAlternativeWindow::set_Menu( QMenu *m_menu ) { menu = m_menu; } void QvkSystrayAlternativeWindow::mouseMoveEvent( QMouseEvent *event ) { move( event->globalPos() - point ); } void QvkSystrayAlternativeWindow::mousePressEvent( QMouseEvent *event ) { point = event->pos(); } void QvkSystrayAlternativeWindow::contextMenuEvent( QContextMenuEvent *event ) { menu->exec( event->globalPos() ); } vokoscreenNG-3.1.0/src/systrayAlternative/QvkSystrayAlternativeWindow.h000066400000000000000000000014541416353147400265360ustar00rootroot00000000000000#ifndef SYSTRAYALTERNATIVEWINDOW_H #define SYSTRAYALTERNATIVEWINDOW_H #include #include #include #include #include #include class QvkSystrayAlternativeWindow : public QWidget { Q_OBJECT public: explicit QvkSystrayAlternativeWindow( QWidget *parent ); ~QvkSystrayAlternativeWindow(); void set_Size( QSize m_size, QPixmap m_picture ); void set_Menu( QMenu *m_menu ); private: QSize size; QPixmap picture; QPoint point; QMenu *menu; private slots: protected: void paintEvent(QPaintEvent *event); void mouseMoveEvent( QMouseEvent *event ); void mousePressEvent( QMouseEvent *event ); void contextMenuEvent( QContextMenuEvent *event ); }; #endif // SYSTRAYALTERNATIVEWINDOW_H vokoscreenNG-3.1.0/src/systrayAlternative/systrayAlternative.pri000066400000000000000000000003631416353147400252650ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkSystrayAlternative.h \ $$PWD/QvkSystrayAlternativeWindow.h SOURCES += $$PWD/QvkSystrayAlternative.cpp \ $$PWD/QvkSystrayAlternativeWindow.cpp vokoscreenNG-3.1.0/src/version/000077500000000000000000000000001416353147400164025ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/version/QvkVersion.cpp000066400000000000000000000025311416353147400212160ustar00rootroot00000000000000#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.1.0/src/version/QvkVersion.h000066400000000000000000000011471416353147400206650ustar00rootroot00000000000000#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 // VERSION_H vokoscreenNG-3.1.0/src/version/version.pri000066400000000000000000000002041416353147400205770ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkVersion.h SOURCES += $$PWD/QvkVersion.cpp vokoscreenNG-3.1.0/src/vokoscreen-version-3.ts000066400000000000000000000354551416353147400213020ustar00rootroot00000000000000 QvkAudioController Select one or more devices QvkCameraController Camera QvkCameraWindow Switch to Window Switch to Fullscreen QvkDirectSoundController Select one or more devices QvkHelp Help QvkImageFromTabs No filemanager found. Please install a filemanager. 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. Sourcecode Homepage Translations Donate QvkPulseAudioWatcher Select one or more devices QvkRegionChoise Area QvkSystray Start Stop Pause Continue Exit Camera Magnification 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 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.1.0/src/vokoscreenNG.ico000066400000000000000000000535561416353147400200320ustar00rootroot00000000000000 h6  @@ (BF(   CmmmVVVJJJJ555) qqqd񖖖OOO:ppp8III@!!!sv!!!  绠¬տϻ̹ƸyvǚʠΦn2VSF y37 * 'mj!~pǛʟΥҫAiS hde~yyC1&[8bO/|ʟΤҫױ˗Mucacľ]F^E\'+-ExˢѩرݸשY'\QIqc\tjckN=WLJ]TMkNy` rbɟ|zp|vqeuf`Ő:jil]^cjO}Oqe{f}{|r9Ύ} m\wJ|x‘yoĻ+|Tl,*mYZ(xÖЮsb`3%%ˆ4~0|/r0]"> O$~Ěˣťzlܹ?w/p/g.\.L*'6ę”ÓzĔtƚyȢbc췑r緖۷]``M¿xcO:'?( @  -\\\~wwwkkkbbb]]]VVVMMMDDDm999W***D9⺺ګԗфrrrVVVsNNN0MMMNNNXXXLLLXXX]]]bbbfffkkkqqqMMM LLLMMMM"""''',,,111777999U}}}}xwwwrllllbbbgPPPb<<<]...](((_###a f---A888.777)999&999 ;;;===AAADDD AAA YįϿ̻ȷij~sP%:::fĵ˗Q?p]t]x_|ac鱃e沆h㮁`}[߮cܯjٱrײzմӵѷθ̺ɽþɰ/cccy԰vd×ƙȝʟˢͤYSUTSPLIE?93 -'} w x و:ueۼwÖŘȜɞ̡ͤΥŒcY]\[YUm8P) g/ >>70/OBUOh?_GŚŘȜʟ̢ΤЧѪ̟p`ddcWC:2037:<>++-5*$h. 8P3dP_PjbD B\@ǛǛɟ̢ΥѨҫԬխ}g ml_!47;zyMLLK91nJkNeNbP|Fʴ]=ǛɝˡΤШӫծױشqtt:86xv¼½ҽGGG~[HnNhN\FL¨dBǜʟͤЧҫծرٴܸ}|m(Y[]wjzoԽϸE<8sOjNU=%666\ķʱrPȝ̡ϥҪխױڴܷ߽ȋ#Ƅp=PQRgI{ePMN<>>../rMmNZBև-^^^oӼgɟ̣ЧҬְٳ۷޺ῃЗ/ˋ|FNLLYGB<:KFFKLLrXwNrO ɞˠo ~wwwl)iڟԖ'wzqtzppqvRn-NxN`9̢CfEȜϢcVJ'gURżI61j[T~LŠϒˋǃvmh cZ~OwNfE|%PƸͰrVǛɢeSK ɼqΓ͐LJyqiaXh2wOsXZ,XWWeӹlƚ˦rRHxmjqmŽ,!î-v'̒0ć(ymf_WPwQn35}}}zxg”Řɞzq3('+aTN@2/{gZU)Y.)/Æ/0y,g[SK`5 7jYÖÖŘ}οU2-B74%squly6Ȍ/u20/|/v/q0b"OI@ 8_O•ˣΫu6$&5+*:0.ҷȑF///{/v/r/l/g0Y$D;Җ9ǬWHƜʣͦáK=9lfbڷܹǑP|/z/y/u/q/l/h/b/]0IG'o=ϻSFƞȠˤͧЩӳɫϬڵ׳صŒZu/t/r/o/l/h/c/^/X/S/]FM#G´̣bZ˜śǞɠ̣ͧϩѫӯձֲ״ǖhl,l,h*e(b*d3h?mLsY|i߶()LKKZճ|ukc][_e췍l巑r߷yڻֽԾԯԙчp\1wvvpҖ_]kfޣzr٬ԵнֵԤю{hS@(Ϧѓςq^H2?(@ @  7gʲ֝ۏЃyyyqqqmmmgggbbb[[[SSSJJJAAAw999`///J&&&9(  )>>>SSS]]]ZZZJJJ;;;???DDDIIIKKKMMMMMMMMMKKKKKKJJJKKKLLLvLLLmLLLiJJJhEEEf>>>c666`,,,]!!!ZTġғˆyyylllaaaXXXPPPJJJDDDAAA???@@@AAAJJJMMMtMMM^MMMMMMM:MMM+MMM#LLLLLLIII KKK(((乹ٟ߬ӊNNNrrrdddтEEEeeefffgggjjjlllnnnqqqsssvvvyyy{{{///IGGGIIIKKKNNNPPPSSSUUUWWWZZZ\\\___aaacccddd#---***,,,...000333666777:::===>>>BBBDDDGGGGGG@ 222SSSLLLMMMLLLLLL LLLLLL| y}!!!###%%%(((***+++I, ?333dIII`HHH^KKK_LLL_NNN_NNN^NNN\NNNZNNNWFFF`>>>`888a333b...d)))f$$$h jmosuyQpppMMMMMM1 @,,,f|w{{{tqqqmhhhi\\\dOOO^GGG]FFF\EEE\CCCZBBBZBBBZEEE[FFFZHHH]GGGaIIIbIIIaJJJ^KKK\LLLYLLLULLLOLLLILLLDLLL@LLL9LLL3LLL/MMM*MMM$LLLMMMNNNNNN OOOLLL5E222kɭ௯޸̾ɻǸIJ~z~~~utttokkkk]]]eRRRbOOOcNNNcMMMdMMMfLLLgKKKgJJJcJJJ_III[HHHWGGGQGGGKEEE@AAA&7JAAArȽοҾƱկֹҾѿѿϿϿοʼȹŵò7OQQQz¸ʋC3TCYG^JcNfQߜkUݞr]ڣzfإnթvԫѮбδ˷ʹɼȾͿӾ׾־־־־վԾӾҿппϿοοƷĿ̫7Sfffťwlٌ:%yxvtrngc]|XzSxOuJsGtGNPQSSUVV X$[)_0a6d=hCkJpRsYޣw`ݤ|hڦoاv֩~ԫҭЯα̴ʶȹǼſʿˆ"6###X^NO:”ÖėƘƚǛȝȝɟʠˡˢϨZSSSSSSRRPOMLIHFCA>;8530-+(%}"{xwvc+9'''\ڽF0cM”ÖėŘƚțȝɞɟʠˡ̢ͣϦg+VVWWWWUUTRPMLKJHDC@=:841.+'~$|"y4.~:7<3=)))aٽ5t_”–ėŘƚȜȝɞʟˠ̢ͣͤΤϦt8YZZZZZYXWVTHw<k6 m6 z;BDC@=:741-*%+OEZSLI8 @(((e-p–ÖƘƚȜȝʞʠ̢ͤ͢ΤϦϦШE]^__^^]]\YYVGO-6".3 K#o2 =?>:64/-H6_QYNMDolξ8D,,,hȇ. ••ÖŘƚȜɝʟʡ̢ͣΤϦϦШѩѩ‹R`bbbcbaa_]pF G>8=?CABEBBCCBE>>@/-/(Ef- 8<:3C'`KaO^NZN@3ͤ6I???qƵϋ5ǝ–Řƚțɝʟʠͣ͢ϥϦЧѩѪҫӫǖ_bfffffed[JA;DDG*((#""9::@AA899#""/..EDE3..P& i/ y3?_BiPdNaN_N]O5&̃5Neeeën٘K)ŚėƙǛȝʟʠ̢ͤΥϦѨѩҫӫԬխϢld jkkjji^EDG877%%%ȷǹtuu###>==<9;=W1mNkNiNfNcNaNaQ<-\"5 ShQ_?ėƘǛȜɟʟ̢ͤϥϦѩѩӫӬԭծ֮ԬzgmnnnmiJHH210FGGƱӼü¼777988@<=sNpNmNjNgNeNbNbQL?:,7 WվS4rUėƚțȝʟˡͣΥϦѨѩӫӭծְ֮ױױ~nqqrrshQ5@?@???wsŰԽľľ½ֽ223CAB^H=sOnNkNhNeNcN]Ie[49ZοD﹄iƘǚȝʟˠͣΤϥШѩӫԬծ֯ױزسٳwuvvvmKLQh\YvjiսľľվθȲ CCFkJpNmNjNhNdNS=};5<\ŏ:“zƚțɞʟ̢ΤϦЧѪӫӬծ֯رسٴڴ۷!yzzz~]0>=>tuub[Ytl~ӼľֿϹǰQSS?>?qSBrOnNkNhNfNJ3̧ 6 @***d¹Ɛ9 ǛƛȜʟˡͣΤϦѩҫӬծ֯ױٳڴڵ۶ݹƈ*}~~ǀ`VKo]PƬf\[vjiľϸĮ%$$YMGtNpNlNiNhPH0}6CJJJq̘DǛǜɝʟ̢ΤϦШҪӫխ֯ױسڴڶܷݹ޻˒5ÁÁÂɄWYa***}}XfVL_VUϪ~110788655¯RLKrMqNnNkNiPL5W5Hhhh~v֠V/ǜȜɟʠ̢ϥϦѩӫӬ֮ױزڴڶܷݸ޺߼ϛ@ńDžƅcem766kgegFpZF_UT_WQPIIIeeeDDDndbxxɨ{omNKKpLrNnNlNiNZD2 4NpVߪiFǜȝʟˡͣϥШѪӬծְزشڵܷݸ޺߼གդMdžɉɉlmv655eaaB;:oKUNNv_WQPllluuuLLLd\[wid~uPMMrLrNoNlNgJl[)5QZ8zZǜȞʟ̢ͤϦѩҫԬծױسڴ۷ݸ޺߼ྀ῁٭Yʊˌˍю prz-,,mjj=65RF@vbWaXVwjf]\\qqrKJIuk[]TSl\RjYSQtMtNqNmN`A{;/7UվGjțɝʠ͢ΤϦѩҫխ֯ױڵ޷຀ߺ߻ݻ~ط{޴e̍ϑϐԓyi765}||3-+?87LDBWMLf[Xsfcka^wkf|i^^TTQIGʏP^LA'&&fYQyNtNqNnNV5̔58ZѾ>‘vȜɞˠͣΥѧѪҬծٱ˫vqouа~j˭roϑєҕҔ}@qprTUUE@?:43@:8JB@TJI\RPaVT_URg[VfTmK[LA_[ZQQQKJKbMyNuNqNoON+j886E=65! gfiuJxNuNrNqQP0C 8 ?@@@jº̘Fʡȝɞ̢ͣϥѩҫǨ}1%"&(cUTvqduJÍל؝֛ךT988pnn2,*710932<65@97@98?87=75932}{z///dcd}fT~NyNuNrNrR[A6DWWWtůtסX1ʠȝʟ̢ͤϥҩ̩5,(,-.PA=rva\ Ӛڠ؞֛͒utsCDDwvv<860*)4.-60/60/4.-C>=|{z222XVVwpnL|NyNvNrNlIr`4IwwwånSiGȜȝʟ̢ͤѧq`XQ*6-rd&s_==ca`tfaON|NzNwNsNS*͎05RۼBlǛȝɟ̢ϦfXId_[%%xo÷>+(5 0M<7rOe՛֚ԗГΏʊ{.qb(`[y@N|NyNvNuQP)e86U8Ö}ƛȜʞ̢qA92(#!',:"!Ƽĺµ-7!3'og՘Ҕϑ͎ʊdžƂyol%hhjea]bP|NyNuNuRW7?89W˿Ǐ:Ȟƛȝʞϣ{lC95 '02vjd|eVOjYQfWNqav/yГϒ͏ˋȈƄÁ}yupmid`\UxE{NxNuNpLhP$7<+++`Ÿ͖G"ȜǚǛɝÝyoa^ID2**\PNwtĽy ɿötBˆɎ͎ˌɉdžă{xspkhd`[W]!}QwNuNh@qο5 @SSSoŮx֠W7ĘƙȜɝg_S|YQui[;88 #ŹwɿT՜*ј)ϕ%̏ȉń}zvrnjfb^ZVQtEwNtN_6Ͳ5CzzzkUiMÖƘƛȝĨldXOEý{oaý<(%<'%1  QӚ-Қ/,ϕ0̓/ɏ-ň%vsqmhea]YUQ[&xPtOW0̈'4H־P5{cÖŘƛȜʬts90-2D.+Ľ+6..ǾxNj0X*]>t'ː/ȍ/Ƌ/ň0„-y njgc`\XTPJrIsPV2^15 JϿ<lw•ĘƙȜʧ^+"Ծ -/+ƾf\X1.J>;nI?s?0P/D# kA&.Ƌ/Ĉ/Æ///}/oeb^ZVROKY*sO[;745L6•ÖƘƛƙz\=1\S ,A.,qnB*'żƺ*#vjc{8$|-l,i8-p:3p/NJ/†///~/{/y0s,c[XTQMIBoKhQ 56 QʿúŌ6”ÖĘƚƙ}|oW&!NII"bSP7%#1[IGĺ |iOi!Ɏ/È/\4`5n3ć////{/y/v/s/q0c USNKHDN#p68777_ʑ?%•×ƙȝЬH2*DIED~tn%,(KȊ0Ĉ/Ĉ/NJ/ć/…///~/{/z/v/t/q/m/l0a&PMJEB;͞6vvv|žgZݣcQ×ˣͥͧϨ(zt_ZYMHEYSPzuںܻФi,////~/|/z/y/v/t/r/o/l/j/f/d/b/W&DB>AK%5AJ;ufɠɢˤͦͧЪtD71#B24ϲܸ۸ܹөt{+}/}/|/{/{/y/w/u/s/r/o/l/j/g/d/b/_/]0L?<R7"-4E־4%~rƜȟɡˢͤͦΨҪ[QE4,&!3,%UI=v_Юٷٶڶ۷խv){/z/z/x/x/v/t/s/p/o/l/j/h/e/b/`/]/Z/W0?9jW 24Jֽ$|–ƝǟȠʢˣͥͧΧϩЪѶDzȨ۷ִشصضٶֲr(w/w/v/u/t/r/r/p/n/k/j/h/e/b/`/^/[/W/U/L'3 ͯ85QöĿ€#śŜƝȟȠʢˤͥͧΧϩЪҬծװկԯհֱղֳֳֳִr-t/r/r/r/p/p/n/l/k/i/g/e/b/`/^/[/Y/U/T/P01 ͗ 86***Y˅/%ØśŜƞȟɠʢˣͥͧΧϨЪЫҭӮԮԮհհհղֲղt5p/p/o/n/m/l/k/j/h/e/d/b/`/]/[.V,R*O(J&K+E)q78GGGcƦ}zՐD<——ęŚƜǟȠɠʢˤͥͧΧϨЪЪѬҭӮӮԮհֱ׳ضw>l/l/l/k/j.h,f*c(a)d1h:mFtR{`⫅oݭױе˺H5;jjjsŖ[ZޜZT—ØĚśƝȟȠʢˣ̥ΧϪΩͥˡȜ|Ŗs‘iaXNyEs;o7o8tC{P鮃]㰋mݲ~׵ѷ˺ĿͿϿϿϿ̶"5>98rp~u{ku`nWhLcE`?\8Y0Y/^3d;oJ{Z㬇kݰ}״ѹ˻ƾͿӽԾҾп̾˺̢̯̊u]N8" *4 B߻y64615.9/=/D5O>^Nn^p۪հж̻ǿѾֽԽҾп̸̰̦̘̀iP>.24EпЬϳ˹ǿ̿ԽӽҾоͿ̶̛̪̋rYC-! +5GȹͿͿ̶̣̐|eP8$  JҰ˖̄r]I3 ???????vokoscreenNG-3.1.0/src/vokoscreenNG.pro000066400000000000000000000103121416353147400200370ustar00rootroot00000000000000#------------------------------------------------- # # Project created by QtCreator 2017-09-12T21:33:03 # #------------------------------------------------- unix: QT += x11extras dbus 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 libpulse wayland-client unix:LIBS += -lpulse-simple unix:LIBS += -lX11 win32:contains(QMAKE_HOST.arch, x86_64) { message("[vokoscreenNG] Create x86_64 build") RC_ICONS = vokoscreenNG.ico GStreamerDir=$$(GSTREAMER_1_0_ROOT_MINGW_X86_64) INCLUDEPATH += $${GStreamerDir}\include\gstreamer-1.0 INCLUDEPATH += $${GStreamerDir}\include\glib-2.0 INCLUDEPATH += $${GStreamerDir}\lib\glib-2.0\include INCLUDEPATH += $${GStreamerDir}\include LIBS += -L$${GStreamerDir}\bin LIBS += -L$${GStreamerDir}\lib\gstreamer-1.0 LIBS += -llibgstreamer-1.0-0 LIBS += -llibglib-2.0-0 LIBS += -llibgobject-2.0-0 LIBS += -llibbz2 } # settings include(settings/settings.pri) # region include(region/regionselection.pri) # winInfo include(winInfo/winInfo.pri) # countdown include(countdown/countdown.pri) # webcam include(camera/camera.pri) # pulse unix:include(audio/linux/audioLinux.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) # 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) # systrayAlternative include(systrayAlternative/systrayAlternative.pri) # ciscoOpenh264 win32:include(ciscoOpenh264/ciscoOpenh264.pri) # wayland unix:include(wayland/wayland.pri) unix:include(waylandRoutines/waylandRoutines.pri) # showClick include(showClick/showClick.pri) # halo include(halo/halo.pri) # spezialCheckBox include(spezialCheckBox/spezialCheckBox.pri) # ImageFromTabs include(imageFromTabs/imageFromTabs.pri) # Folder Dialog include(dirDialog/dirDialog.pri) # File Dialog include(fileDialog/fileDialog.pri) vokoscreenNG-3.1.0/src/wayland/000077500000000000000000000000001416353147400163545ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/wayland/container/000077500000000000000000000000001416353147400203365ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/wayland/container/QvkContainer.cpp000066400000000000000000000116221416353147400234500ustar00rootroot00000000000000#include "QvkContainer.h" #include /*! * Hint: * Constructor for any format. * QString muxer = "matroskamux". * QString suffix = "mkv" */ Container::Container( QString muxer, QString suffix ) { Container::muxer = muxer; Container::suffix = suffix; } QString Container::get_Muxer() { return muxer; } QString Container::get_Suffix() { return suffix; } bool Container::get_Available() { return available; } /*! * Set the muxer to available or unavailable. */ void Container::set_MuxerAvailable( bool available ) { Container::available = available; } void Container::add_VideoCodec( QString encoder, QString name ) { #ifdef Q_OS_WIN if ( encoder != "x264enc" ) #endif { VideoCodec videoCodec; videoCodec.encoder = encoder; videoCodec.name = name; VideoCodecs.append( videoCodec ); } } void Container::add_AudioCodec( QString encoder, QString name ) { AudioCodec audioCodec; audioCodec.encoder = encoder; audioCodec.name = name; AudioCodecs.append( audioCodec ); } void Container::set_VideoCodecAvailable( QString encoder, bool available ) { for ( int i = 0; i < VideoCodecs.count(); i++ ) { if ( VideoCodecs.at(i).encoder == encoder ) { VideoCodec videoCodec = VideoCodecs.at(i); videoCodec.available = available; VideoCodecs.replace( i, videoCodec ); } } } void Container::set_AudioCodecAvailable( QString encoder, bool available ) { for ( int i = 0; i < AudioCodecs.count(); i++ ) { if ( AudioCodecs.at(i).encoder == encoder ) { AudioCodec audioCodec = AudioCodecs.at(i); audioCodec.available = available; AudioCodecs.replace( i, audioCodec ); } } } // --------------------------------------------------------- /* * This is the base for supported container, audio and video codec */ QvkContainer::QvkContainer(QObject *parent) : QObject(parent) { Container *MKV = new Container( "matroskamux", "mkv" ); MKV->add_VideoCodec( "openh264enc", "H.264" ); MKV->add_VideoCodec( "vp8enc", "VP8"); MKV->add_VideoCodec( "x264enc", "x264"); MKV->add_AudioCodec( "vorbisenc", "vorbis" ); MKV->add_AudioCodec( "flacenc", "flac" ); MKV->add_AudioCodec( "opusenc", "opus" ); MKV->add_AudioCodec( "lamemp3enc", "mp3" ); Container *WEBM = new Container( "webmmux", "webm" ); WEBM->add_VideoCodec( "vp8enc", "VP8" ); WEBM->add_AudioCodec( "vorbisenc", "vorbis" ); WEBM->add_AudioCodec( "opusenc", "opus" ); Container *AVI = new Container( "avimux", "avi" ); AVI->add_VideoCodec( "openh264enc", "H.264" ); AVI->add_VideoCodec( "x264enc", "x264" ); AVI->add_VideoCodec( "vp8enc", "VP8" ); AVI->add_AudioCodec( "lamemp3enc", "mp3" ); Container *MP4 = new Container( "mp4mux", "mp4" ); MP4->add_VideoCodec( "openh264enc", "H.264" ); MP4->add_VideoCodec( "x264enc", "x264" ); MP4->add_AudioCodec( "lamemp3enc", "mp3" ); MP4->add_AudioCodec( "opusenc", "opus" ); Container *MOV = new Container( "qtmux", "mov" ); MOV->add_VideoCodec( "openh264enc", "H.264" ); MOV->add_VideoCodec( "x264enc", "x264" ); MOV->add_VideoCodec( "vp8enc", "VP8" ); MOV->add_AudioCodec( "lamemp3enc", "mp3" ); Containers = new QList; Containers->append( MKV ); Containers->append( WEBM ); Containers->append( AVI ); Containers->append( MP4 ); Containers->append( MOV ); } /*! * Return all supported container like mkv, avi, ... as QList. */ QList QvkContainer::get_Containers() { return *Containers; } /*! * Input: * QString value = "mkv" or "webm" or ... * * Return: * All supported video encoder like vp8enc, avienc, ... as QList */ QList QvkContainer::get_VideoCodecs( QString suffix ) { QList list; for ( int i = 0; i < Containers->count(); i++ ) { if ( Containers->at(i)->get_Suffix() == suffix ) { list << Containers->at(i)->VideoCodecs; } } return list; } /*! * Input: * QString value = "mkv" or "webm" or ... * * Return: * All supported audio encoder like vorbisenc, opusenc, ... as QList */ QList QvkContainer::get_AudioCodecs( QString suffix ) { QList list; for ( int i = 0; i < Containers->count(); i++ ) { if ( Containers->at(i)->get_Suffix() == suffix ) { list << Containers->at(i)->AudioCodecs; } } return list; } /*! * Input: * Set the container to available or unavailable. * QString muxer = "matroskamux". */ void QvkContainer::set_ContainerAvailable( QString muxer, bool available ) { for ( int i = 0; i < Containers->count(); i++ ) { if ( Containers->at(i)->get_Muxer() == muxer ) { Containers->at(i)->set_MuxerAvailable( available ); } } } vokoscreenNG-3.1.0/src/wayland/container/QvkContainer.h000066400000000000000000000025661416353147400231240ustar00rootroot00000000000000#ifndef QVKCONTAINER_H #define QVKCONTAINER_H #include class Container { public: class VideoCodec { public: QString encoder = ""; QString name = ""; bool available = false; }; class AudioCodec { public: QString encoder = ""; QString name = ""; bool available = false; }; Container( QString muxer, QString suffix ); QString get_Muxer(); QString get_Suffix(); bool get_Available(); void set_MuxerAvailable( bool available ); void add_VideoCodec( QString encoder, QString name ); void add_AudioCodec( QString encoder, QString name ); void set_VideoCodecAvailable( QString encoder, bool available ); void set_AudioCodecAvailable( QString encoder, bool available ); QList VideoCodecs; QList AudioCodecs; private: QString muxer = ""; QString suffix = ""; bool available = false; }; class QvkContainer : public QObject { Q_OBJECT public: explicit QvkContainer(QObject *parent = nullptr); QList get_Containers(); QList get_VideoCodecs( QString suffix ); QList get_AudioCodecs( QString suffix ); void set_ContainerAvailable( QString muxer, bool available ); private: QList *Containers; signals: }; #endif // QVKCONTAINER_H vokoscreenNG-3.1.0/src/wayland/container/QvkContainerController.cpp000066400000000000000000000230561416353147400255200ustar00rootroot00000000000000#include "QvkContainerController.h" #include #include #include QvkContainerController::QvkContainerController(QObject *parent, Ui::formMainWindow_wl *Ui ) { Q_UNUSED(parent) ui = Ui; vkContainer = new QvkContainer; set_muxer_to_available_or_unavailable(); set_videoencoder_to_available_or_unavailable(); set_audioencoder_to_available_or_unavailable(); // GUI connect( ui->comboBoxFormat, SIGNAL( currentTextChanged( const QString ) ), this, SLOT( slot_set_available_VideoCodecs_in_Combobox( const QString ) ) ); connect( ui->comboBoxFormat, SIGNAL( currentTextChanged( const QString ) ), this, SLOT( slot_set_available_AudioCodecs_in_Combobox( const QString ) ) ); set_available_muxer_in_ComboBox(); set_available_formatVideoAudoicodec_in_tab(); } void QvkContainerController::set_muxer_to_available_or_unavailable() { for ( int i = 0; i < vkContainer->get_Containers().count(); i++ ) { QString muxer = vkContainer->get_Containers().at(i)->get_Muxer(); GstElementFactory *factory = gst_element_factory_find( muxer.toLatin1() ); if ( !factory ) { vkContainer->set_ContainerAvailable( muxer, false ); } else { vkContainer->set_ContainerAvailable( muxer, true ); gst_object_unref( factory ); } } } void QvkContainerController::set_videoencoder_to_available_or_unavailable() { for ( int i = 0; i < vkContainer->get_Containers().count(); i++ ) { QString suffix = vkContainer->get_Containers().at(i)->get_Suffix(); QList list = vkContainer->get_VideoCodecs( suffix ); if ( !list.empty() ) { for ( int x = 0; x < list.count(); x++ ) { QString encoder = list.at(x).encoder; GstElementFactory *factory = gst_element_factory_find( encoder.toLatin1() ); if ( !factory ) { vkContainer->get_Containers().at(i)->set_VideoCodecAvailable( encoder, false ); } else { vkContainer->get_Containers().at(i)->set_VideoCodecAvailable( encoder, true ); gst_object_unref( factory ); } } } } } void QvkContainerController::set_audioencoder_to_available_or_unavailable() { for ( int i = 0; i < vkContainer->get_Containers().count(); i++ ) { QString suffix = vkContainer->get_Containers().at(i)->get_Suffix(); QList list = vkContainer->get_AudioCodecs( suffix ); if ( !list.empty() ) { for ( int x = 0; x < list.count(); x++ ) { QString encoder = list.at(x).encoder; GstElementFactory *factory = gst_element_factory_find( encoder.toLatin1() ); if ( !factory ) { vkContainer->get_Containers().at(i)->set_AudioCodecAvailable( encoder, false ); } else { vkContainer->get_Containers().at(i)->set_AudioCodecAvailable( encoder, true ); gst_object_unref( factory ); } } } } } void QvkContainerController::set_available_muxer_in_ComboBox() { for ( int i = 0; i < vkContainer->get_Containers().count(); i++ ) { if ( vkContainer->get_Containers().at(i)->get_Available() == true ) { ui->comboBoxFormat->addItem( vkContainer->get_Containers().at(i)->get_Suffix(), vkContainer->get_Containers().at(i)->get_Muxer() ); } } } /* * Insert Video encoder and Video name from container in Videocodec-Combobox */ void QvkContainerController::slot_set_available_VideoCodecs_in_Combobox( const QString suffix ) { ui->comboBoxVideoCodec->clear(); QList list = vkContainer->get_VideoCodecs( suffix ); if ( !list.empty() ) { for ( int i = 0; i < list.count(); i++ ) { if ( list.at(i).available == true ) { ui->comboBoxVideoCodec->addItem( list.at(i).name, list.at(i).encoder ); } } } } /* * Insert audio-encoder and video-name from container in audiocodec Combobox */ void QvkContainerController::slot_set_available_AudioCodecs_in_Combobox( const QString suffix ) { ui->comboBoxAudioCodec->clear(); QList list = vkContainer->get_AudioCodecs( suffix ); if ( !list.empty() ) { for ( int i = 0; i < list.count(); i++ ) { if ( list.at(i).available == true ) { ui->comboBoxAudioCodec->addItem( list.at(i).name, list.at(i).encoder ); } } } } // Check format, video and audoicodec on tab availability void QvkContainerController::set_available_formatVideoAudoicodec_in_tab() { // Delete all QLabel QList listLabel = ui->scrollAreaWidgetContentsAvailable->findChildren(); for( int i = 0; i < listLabel.count(); i++ ) { delete listLabel.at( i ); } // Delete spacerItem for ( int i = 0; i < ui->gridLayoutAvailable->count(); ++i ) { QLayoutItem *layoutItem = ui->gridLayoutAvailable->itemAt(i); if ( layoutItem->spacerItem() ) { ui->gridLayoutAvailable->removeItem(layoutItem); delete layoutItem; --i; } } // Delete line QList listFrame = ui->scrollAreaWidgetContentsAvailable->findChildren(); for( int i = 0; i < listFrame.count(); i++ ) { delete listFrame.at( i ); } // Adding all informations int rowCount = 0; for ( int i = 0; i < vkContainer->get_Containers().count(); i++ ) { int rowMuxer = 1; int rowVideo = 1; int rowAudio = 1; QIcon icon( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); if ( vkContainer->get_Containers().at(i)->get_Available() == false ) { icon.addFile( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); } QSize size = icon.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); QLabel *labelPicture = new QLabel(); 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( vkContainer->get_Containers().at(i)->get_Suffix() ) ), rowCount + rowMuxer, 1 ); rowMuxer++; QList list_VideoCodecs = vkContainer->get_VideoCodecs( vkContainer->get_Containers().at(i)->get_Suffix() ); if ( !list_VideoCodecs.empty() ) { for ( int i = 0; i < list_VideoCodecs.count(); i++ ) { QIcon icon( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); if ( list_VideoCodecs.at(i).available == false ) { icon.addFile( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); } QSize size = icon.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); QLabel *labelPicture = new QLabel(); 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( list_VideoCodecs.at(i).name ) ), rowCount + rowVideo, 3 ); rowVideo++; } } QList list_AudioCodecs = vkContainer->get_AudioCodecs( vkContainer->get_Containers().at(i)->get_Suffix() ); if ( !list_AudioCodecs.empty() ) { for ( int i = 0; i < list_AudioCodecs.count(); i++ ) { QIcon icon( QString::fromUtf8( ":/pictures/screencast/accept.png" ) ); if ( list_AudioCodecs.at(i).available == false ) { icon.addFile( QString::fromUtf8( ":/pictures/screencast/missing.png" ) ); } QSize size = icon.actualSize( QSize( 16, 16 ), QIcon::Normal, QIcon::On ); QLabel *labelPicture = new QLabel(); 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( list_AudioCodecs.at(i).name ) ), 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 ); } vokoscreenNG-3.1.0/src/wayland/container/QvkContainerController.h000066400000000000000000000015601416353147400251610ustar00rootroot00000000000000#ifndef QVKCONTAINERCONTROLLER_H #define QVKCONTAINERCONTROLLER_H #include #include "ui_formMainWindow_wl.h" #include "QvkContainer.h" class QvkContainerController : public QObject { Q_OBJECT public: QvkContainerController( QObject *parent, Ui::formMainWindow_wl *Ui ); private: // Ui_MainWindow *ui; Ui::formMainWindow_wl *ui; QvkContainer *vkContainer; void set_muxer_to_available_or_unavailable(); void set_available_muxer_in_ComboBox(); void set_videoencoder_to_available_or_unavailable(); void set_audioencoder_to_available_or_unavailable(); void set_available_formatVideoAudoicodec_in_tab(); private slots: void slot_set_available_VideoCodecs_in_Combobox( const QString suffix ); void slot_set_available_AudioCodecs_in_Combobox( const QString suffix ); signals: }; #endif // QVKCONTAINERCONTROLLER_H vokoscreenNG-3.1.0/src/wayland/container/container.pri000066400000000000000000000003521416353147400230340ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkContainerController.h \ $$PWD/QvkContainer.h SOURCES += $$PWD/QvkContainerController.cpp \ $$PWD/QvkContainer.cpp vokoscreenNG-3.1.0/src/wayland/formMainWindow_wl.ui000066400000000000000000001270761416353147400223720ustar00rootroot00000000000000 formMainWindow_wl 0 0 767 510 vokoscreenNG 0 0 0 0 0 QTabWidget::West 0 72 72 :/pictures/screencast/monitor-sidebar.png:/pictures/screencast/monitor-sidebar.png 0 0 0 0 0 48 48 :/pictures/screencast/monitor.png:/pictures/screencast/monitor.png 0 Area buttonGroup Qt::Horizontal 40 20 Desktop Panel 0 false Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QAbstractSpinBox::NoButtons Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QAbstractSpinBox::NoButtons :/pictures/screencast/undo.png:/pictures/screencast/undo.png Qt::Horizontal openSUSE Tumbelweed KDE Fedora 34 KDE / Gnome Fullscreen false buttonGroup QFrame::NoFrame QFrame::Raised false Video true false Audio Qt::Horizontal 40 20 Window buttonGroup Kubuntu 21.04 75 true This experimental Wayland support is continuously developed, tested with QFrame::StyledPanel QFrame::Raised 10 0 TextLabel true Qt::Vertical 20 40 3 Record Time: 00:00:00 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter KB Video size: 40 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter MB Free disk space: Qt::Horizontal Information Qt::Horizontal 75 true For full feature support please logout and start a X11 Desktop session. Qt::Vertical 20 40 Qt::Vertical Qt::Vertical 20 40 :/pictures/screencast/microphone.png:/pictures/screencast/microphone.png 50 250 131 32 170 50 221 18 Audio recording not implemented :/pictures/screencast/format-codec.png:/pictures/screencast/format-codec.png Qt::Horizontal 40 20 Videocodec :/pictures/screencast/undo.png:/pictures/screencast/undo.png Frames Format Qt::Vertical 20 40 Do not record mouse cursor. Qt::Horizontal 40 20 false Help :/pictures/screencast/preferences-system.png:/pictures/screencast/preferences-system.png :/pictures/screencast/supported-formats.png:/pictures/screencast/supported-formats.png 0 75 true Format 75 true Video 75 true Audio 0 100 true 0 0 447 374 0 0 16 16 :/pictures/screencast/accept.png true Available Qt::Horizontal QSizePolicy::Expanding 40 20 16 16 :/pictures/screencast/missing.png true Not available Qt::Horizontal 40 20 Qt::Vertical 20 40 false Help 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 :/pictures/log/log-sidebar.png:/pictures/log/log-sidebar.png 6 0 0 0 0 48 48 :/pictures/log/log.png:/pictures/log/log.png vokoscreenNG-3.1.0/src/wayland/mainWindow_wl.cpp000066400000000000000000000406301416353147400217010ustar00rootroot00000000000000#include "mainWindow_wl.h" #include "global.h" #include "QvkScreenManager.h" #include #include #include #include #include #include #include #include #include #include QvkMainWindow_wl::QvkMainWindow_wl( QWidget *parent, Qt::WindowFlags f ) : QMainWindow(parent, f) , ui(new Ui::formMainWindow_wl) { ui->setupUi( this ); set_LogController(); set_WindowTitle(); ui->tabWidgetScreencast->setCurrentIndex( 0 ); ui->tabWidgetSideBar->setCurrentIndex( 0 ); set_CornerWidget(); set_system_info(); set_SpezialSliders(); set_Connects(); set_check_all_Elements_available(); vkContainerController = new QvkContainerController( this, ui ); set_RegionChoice(); set_test_available_geometry(); ui->frame_information->hide(); ui->pushButtonPause->hide(); ui->pushButtonContinue->hide(); ui->pushButtonPlay->hide(); ui->pushButtonScreencastOpenfolder->hide(); ui->frame_video_audio_on_off->hide(); ui->comboBoxAudioCodec->hide(); ui->radioButtonScreencastFullscreen->click(); } QvkMainWindow_wl::~QvkMainWindow_wl() { } void QvkMainWindow_wl::closeEvent( QCloseEvent *event ) { Q_UNUSED(event); ui->pushButtonStop->click(); vkRegionChoise->close(); } void QvkMainWindow_wl::set_LogController() { vklogController = new QvkLogController(); connect( vklogController, SIGNAL( signal_newLogText( QString ) ), ui->textBrowserLog, SLOT( append( QString ) ) ); } void QvkMainWindow_wl::set_WindowTitle() { setWindowTitle( global::name + " " + global::version ); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); setWindowIcon( icon ); } void QvkMainWindow_wl::set_system_info() { 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 << "PulseAudio library version:" << pa_get_library_version(); qDebug().noquote() << global::nameOutput << "Operating system:" << QSysInfo::prettyProductName(); qDebug().noquote() << global::nameOutput << "CPU Architecture:" << QSysInfo::currentCpuArchitecture(); qDebug().noquote() << global::nameOutput << "Count CPU:" << QThread::idealThreadCount(); qDebug().noquote() << global::nameOutput << global::name << "running as:" << QGuiApplication::platformName() << "client"; qDebug().noquote() << global::nameOutput << global::name << "running on:" << qgetenv( "XDG_SESSION_TYPE" ).toLower(); 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(); qDebug().noquote() << global::nameOutput << "Default Videopath:" << QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ); // qDebug().noquote() << global::nameOutput << "User Videopath:" << vkSettings.getVideoPath(); qDebug().noquote(); } void QvkMainWindow_wl::set_CornerWidget() { QList list; list << ui->tabWidgetScreencast; list << ui->tabWidgetLog; QPixmap pixmap( ":/pictures/wayland.png" ); pixmap = pixmap.scaled( QSize( 48, 48 ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); for ( int i = 0; i < list.count(); i++ ) { QLabel *label = new QLabel(); label->setPixmap( pixmap ); label->setEnabled( false ); list.at( i )->setCornerWidget( label, Qt::TopRightCorner ); } } void QvkMainWindow_wl::set_Connects() { connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), this, SLOT( slot_start() ) ); connect( ui->pushButtonStart, SIGNAL( clicked( bool ) ), ui->pushButtonStart, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), this, SLOT( slot_stop() ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->pushButtonStop, SLOT( setEnabled( bool ) ) ); connect( ui->pushButtonStop, SIGNAL( clicked( bool ) ), ui->pushButtonStart, SLOT( setDisabled( bool ) ) ); connect( portal_wl, SIGNAL( signal_portal_fd_path( QString, QString ) ), this, SLOT( slot_start_gst( QString, QString ) ) ); connect( portal_wl, SIGNAL( signal_portal_cancel( uint ) ), this, SLOT( slot_portal_cancel( uint ) ) ); connect( ui->toolButtonFramesReset, SIGNAL( clicked( bool ) ), this, SLOT( slot_frames_Reset() ) ); connect( ui->radioButtonScreencastFullscreen, SIGNAL( toggled( bool ) ), ui->widget_Desktop_spinboxes, SLOT( setDisabled( bool ) ) ); connect( ui->radioButtonScreencastWindow, SIGNAL( toggled( bool ) ), ui->widget_Desktop_spinboxes, SLOT( setDisabled( bool ) ) ); } QString QvkMainWindow_wl::get_Videocodec_Encoder() { QString value; QString encoder = ui->comboBoxVideoCodec->currentData().toString(); if ( encoder == "openh264enc" ) { QStringList list; list << encoder; list << "qp-min=23"; // + QString::number( sliderOpenh264->value() ); list << "qp-max=23"; // + QString::number( sliderOpenh264->value() ); list << "usage-type=camera"; // We need camera not screen. With screen and a fast sequence of images the video jerks. list << "complexity=low"; list << "multi-thread=" + QString::number( QThread::idealThreadCount() ); list << "slice-mode=auto"; // Number of slices equal to number of threads value = list.join( " " ); value.append( " ! h264parse" ); } if ( encoder == "x264enc" ) { QStringList list; list << encoder; list << "qp-min=17"; // + QString::number( sliderOpenh264->value() ); list << "qp-max=17"; // + QString::number( sliderOpenh264->value() ); list << "speed-preset=superfast"; list << "threads=" + QString::number( QThread::idealThreadCount() ); value = list.join( " " ); value.append( " ! video/x-h264, profile=baseline" ); } if ( encoder == "vp8enc" ) { QStringList list; list << encoder; list << "min_quantizer=20"; // + QString::number( sliderVp8->value() ); list << "max_quantizer=20"; // + QString::number( sliderVp8->value() ); list << "cpu-used=" + QString::number( QThread::idealThreadCount() ); list << "deadline=1000000"; list << "threads=" + QString::number( QThread::idealThreadCount() ); value = list.join( " " ); } return value; } QString QvkMainWindow_wl::get_Muxer() { 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; } void QvkMainWindow_wl::slot_start() { // https://flatpak.github.io/xdg-desktop-portal/portal-docs.html#gdbus-property-org-freedesktop-portal-ScreenCast.AvailableSourceTypes // Value 1 = MONITOR // Value 2 = WINDOW int sourceType = 1; if ( ui->radioButtonScreencastFullscreen->isChecked() ) { qDebug().noquote() << global::nameOutput << "Start portal fullscreen"; sourceType = 1; } if ( ui->radioButtonScreencastWindow->isChecked() ) { qDebug().noquote() << global::nameOutput << "Start portal window"; sourceType = 2; } if ( ui->radioButtonScreencastArea->isChecked() ) { qDebug().noquote() << global::nameOutput << "Start portal area"; sourceType = 1; } // https://flatpak.github.io/xdg-desktop-portal/portal-docs.html#gdbus-property-org-freedesktop-portal-ScreenCast.AvailableCursorModes // Value 1 = hidden cursor // Value 2 = record cursor int mousecursorONOff = 1; if ( ui->checkBoxMouseCursorOnOff->isChecked() == true ) { qDebug().noquote() << global::nameOutput << "Mouse cursor is not recording"; mousecursorONOff = 1; } if ( ui->checkBoxMouseCursorOnOff->isChecked() == false ) { qDebug().noquote() << global::nameOutput << "Mouse cursor is recording"; mousecursorONOff = 2; } portal_wl->requestScreenSharing( sourceType, mousecursorONOff ); } QString QvkMainWindow_wl::get_Area_Videocrop() { QString videocrop = ""; vkRegionChoise->recordMode( true ); QScreen *Screen = screen(); int screenWidth = Screen->size().width(); int screenHeight = Screen->size().height(); QString top = QString::number( vkRegionChoise->getYRecordArea() + ui->spinBox_top->value() ); QString right = QString::number( screenWidth - ( ui->spinBox_left->value() + vkRegionChoise->getXRecordArea() + vkRegionChoise->getWidthRecordArea() ) ); QString bottom = QString::number( screenHeight - ( ui->spinBox_top->value() + vkRegionChoise->getYRecordArea() + vkRegionChoise->getHeightRecordArea() ) ); QString left = QString::number( vkRegionChoise->getXRecordArea() + ui->spinBox_left->value() ); videocrop = "videocrop top=" + top + " " + "right=" + right + " " + "bottom=" + bottom + " " + "left=" + left; qDebug().noquote() << global::nameOutput << "Area crop from the screen" << Screen->name() + "," << Screen->manufacturer() + "," << Screen->model() + "," << QString::number( Screen->size().width() ) + "/" + QString::number( Screen->size().height() ); return videocrop; } void QvkMainWindow_wl::slot_start_gst( QString vk_fd, QString vk_path ) { ui->pushButtonStop->setEnabled( true ); QStringList stringList; stringList << QString( "pipewiresrc fd=" ).append( vk_fd ).append( " path=" ).append( vk_path ).append( " do-timestamp=true" ); stringList << "videoconvert"; stringList << "videorate"; if ( ui->radioButtonScreencastArea->isChecked() ) { stringList << get_Area_Videocrop(); } stringList << "video/x-raw, framerate=" + QString::number( sliderFrames->value() ) + "/1"; stringList << get_Videocodec_Encoder(); stringList << get_Muxer(); QString newVideoFilename = global::name + "-" + QDateTime::currentDateTime().toString( "yyyy-MM-dd_hh-mm-ss" ) + "." + ui->comboBoxFormat->currentText(); stringList << "filesink location=\"" + QStandardPaths::writableLocation( QStandardPaths::MoviesLocation ) + "/" + newVideoFilename + "\""; QString launch = stringList.join( " ! " ); qDebug().noquote() << global::nameOutput << launch; pipeline = gst_parse_launch( launch.toUtf8(), nullptr ); gst_element_set_state( pipeline, GST_STATE_PLAYING ); } void QvkMainWindow_wl::slot_stop() { // send EOS to pipeline gst_element_send_event( pipeline, gst_event_new_eos() ); // wait for the EOS to traverse the pipeline and is reported to the bus GstBus *bus = gst_element_get_bus( pipeline ); gst_bus_timed_pop_filtered( bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_EOS ); gst_object_unref( bus ); gst_element_set_state( pipeline, GST_STATE_NULL ); gst_object_unref ( pipeline ); qDebug().noquote() << global::nameOutput << "Stop record"; if ( ui->radioButtonScreencastArea->isChecked() ) { vkRegionChoise->recordMode( false ); } } void QvkMainWindow_wl::slot_portal_cancel( uint value ) { Q_UNUSED(value) ui->pushButtonStart->setEnabled( true ); ui->pushButtonStop->setEnabled( false ); } void QvkMainWindow_wl::set_SpezialSliders() { sliderFrames = new QvkSpezialSlider( Qt::Horizontal ); ui->horizontalLayout_slider_frames->insertWidget( 0, sliderFrames ); sliderFrames->setObjectName( "sliderFrames" ); sliderFrames->setTracking( true ); sliderFrames->setMinimum( 10 ); sliderFrames->setMaximum( 144 ); sliderFrames->setValue( 25 ); sliderFrames->show(); } void QvkMainWindow_wl::slot_frames_Reset() { sliderFrames->setValue( 25 ); } void QvkMainWindow_wl::messageBox( QString value ) { QMessageBox *messageBox = new QMessageBox(); QIcon icon( QString::fromUtf8( ":/pictures/logo/logo.png" ) ); messageBox->setWindowIcon( icon ); messageBox->setWindowTitle( global::name + " " + global::version ); messageBox->setIcon( QMessageBox::Critical ); messageBox->setText( ( "Wayland desktop session detected" ) ); messageBox->setInformativeText( ( "Please install the package\n" + value ) ); messageBox->exec(); exit(0); } void QvkMainWindow_wl::set_check_all_Elements_available() { QStringList list; list << "pipewiresrc"; list << "pulsesrc"; list << "queue"; list << "capsfilter"; list << "videoconvert"; list << "videorate"; list << "audioconvert"; list << "audiorate"; list << "filesink"; list << "videoscale"; list << "h264parse"; list << "audiomixer"; list << "videocrop"; qDebug().noquote() << global::nameOutput << "--- GStreamer elements ---"; 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); if ( list.at(i) == "pipewiresrc" ) { messageBox( "gstreamer-plugin-pipewire" ); } } else { qDebug().noquote() << global::nameOutput << "+" << list.at(i); gst_object_unref( factory ); } } qDebug(); } void QvkMainWindow_wl::set_RegionChoice() { vkRegionChoise = new QvkRegionChoise_wl(); connect( ui->radioButtonScreencastArea, SIGNAL( toggled( bool ) ), vkRegionChoise, SLOT( slot_show( bool ) ) ); connect( ui->toolButtonScreencastAreaReset, SIGNAL( clicked( bool ) ), vkRegionChoise, SLOT( slot_areaReset() ) ); connect( ui->spinBox_top, QOverload::of(&QSpinBox::valueChanged), this, [=](int i){ ui->spinBox_bottom->setValue( ui->spinBox_top->maximum() - i ); } ); connect( ui->spinBox_left, QOverload::of(&QSpinBox::valueChanged), this, [=](int i){ ui->spinBox_right->setValue( ui->spinBox_left->maximum() - i ); } ); } void QvkMainWindow_wl::set_test_available_geometry() { testWidget = new QWidget; testWidget->setWindowFlags( Qt::FramelessWindowHint ); testWidget->setAttribute( Qt::WA_TranslucentBackground, true ); testWidget->showMaximized(); QTimer::singleShot( 1000, Qt::PreciseTimer, this, SLOT( slot_set_panel_values_in_spinboxes() ) ); } void QvkMainWindow_wl::slot_set_panel_values_in_spinboxes() { QScreen *Screen = screen(); ui->spinBox_top->setMaximum( Screen->size().height() - testWidget->size().height() ); ui->spinBox_top->setValue( Screen->size().height() - testWidget->size().height() ); // If no desktop panel, then spinbox disabled if ( ui->spinBox_top->value() == 0 ){ ui->spinBox_top->setEnabled( false ); } else { ui->spinBox_top->setEnabled( true ); } ui->spinBox_left->setMaximum( Screen->size().width() - testWidget->size().width() ); ui->spinBox_left->setValue( Screen->size().width() - testWidget->size().width() ); // If no desktop panel, then spinbox disabled if ( ui->spinBox_left->value() == 0 ){ ui->spinBox_left->setEnabled( false ); } else { ui->spinBox_left->setEnabled( true ); } testWidget->close(); } vokoscreenNG-3.1.0/src/wayland/mainWindow_wl.h000066400000000000000000000031021416353147400213370ustar00rootroot00000000000000#ifndef MAINWINDOW_WL_H #define MAINWINDOW_WL_H #include "ui_formMainWindow_wl.h" #include "portal_wl.h" #include "QvkSpezialSlider.h" #include "QvkRegionChoise_wl.h" #include "QvkContainerController.h" #include "QvkLogController.h" #include #include namespace Ui { class QvkMainWindow_wl; } class QvkMainWindow_wl : public QMainWindow { Q_OBJECT public: QvkMainWindow_wl( QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags() ); ~QvkMainWindow_wl(); Ui::formMainWindow_wl *ui; Portal_wl *portal_wl = new Portal_wl(); private: QvkLogController *vklogController; GstElement *pipeline = nullptr; QStringList videoFormatsList; QvkSpezialSlider *sliderFrames; QvkRegionChoise_wl *vkRegionChoise; QWidget *testWidget; void set_LogController(); void set_WindowTitle(); void set_CornerWidget(); void set_system_info(); void set_SpezialSliders(); void set_Connects(); void set_check_all_Elements_available(); QvkContainerController *vkContainerController; void set_RegionChoice(); void set_test_available_geometry(); void messageBox( QString value ); QString get_Videocodec_Encoder(); QString get_Area_Videocrop(); QString get_Muxer(); public Q_SLOTS: private Q_SLOTS: void slot_start(); void slot_stop(); void slot_start_gst( QString vk_fd, QString vk_path ); void slot_frames_Reset(); void slot_portal_cancel( uint ); void slot_set_panel_values_in_spinboxes(); protected: void closeEvent( QCloseEvent *event ); }; #endif vokoscreenNG-3.1.0/src/wayland/portal_wl.cpp000066400000000000000000000417021416353147400210670ustar00rootroot00000000000000/* * Copyright © 2016 Red Hat, Inc * * This program 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 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, see . * * Authors: * Jan Grulich */ #include "portal_wl.h" #include "global.h" #include #include #include #include #include #include #include #include #include #include #include #include Q_DECLARE_METATYPE(Portal_wl::Stream); Q_DECLARE_METATYPE(Portal_wl::Streams); const QDBusArgument &operator >> (const QDBusArgument &arg, Portal_wl::Stream &stream) { arg.beginStructure(); arg >> stream.node_id; arg.beginMap(); while (!arg.atEnd()) { QString key; QVariant map; arg.beginMapEntry(); arg >> key >> map; arg.endMapEntry(); stream.map.insert(key, map); } arg.endMap(); arg.endStructure(); return arg; } Portal_wl::Portal_wl() : m_sessionTokenCounter(0), m_requestTokenCounter(0) { } Portal_wl::~Portal_wl() { } void Portal_wl::requestScreenSharing( int value, int mouseOnOff ) { Selection_Screen_Window_Area = value; record_mouse_onOff = mouseOnOff; QDBusMessage message = QDBusMessage::createMethodCall( QLatin1String( "org.freedesktop.portal.Desktop" ), QLatin1String( "/org/freedesktop/portal/desktop" ), QLatin1String( "org.freedesktop.portal.ScreenCast" ), QLatin1String( "CreateSession" ) ); message << QVariantMap { { QLatin1String("session_handle_token"), getSessionToken() }, { QLatin1String( "handle_token" ), getRequestToken() } }; QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall( message ); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher( pendingCall); connect( watcher, &QDBusPendingCallWatcher::finished, [this] (QDBusPendingCallWatcher *watcher ) { QDBusPendingReply reply = *watcher; if ( reply.isError() ) { qWarning() << "Couldn't get reply"; qWarning() << "Error: " << reply.error().message(); } else { qDebug().noquote() << global::nameOutput << "Begin create portal session"; bool bo = QDBusConnection::sessionBus().connect( QString(), reply.value().path(), QLatin1String( "org.freedesktop.portal.Request" ), QLatin1String( "Response" ), this, SLOT( slot_gotCreateSessionResponse( uint, QVariantMap ) ) ); qDebug().noquote() << global::nameOutput << "QDBusConnection::sessionBus().connect: " << bo; } }); } void Portal_wl::slot_gotCreateSessionResponse( uint response, const QVariantMap &results ) { qDebug().noquote() << global::nameOutput << "Got response from portal CreateSession"; if ( response != 0 ) { qWarning() << "Failed to create session: " << response; return; } QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("org.freedesktop.portal.ScreenCast"), QLatin1String("SelectSources")); m_session = results.value(QLatin1String("session_handle")).toString(); message << QVariant::fromValue(QDBusObjectPath(m_session)) << QVariantMap { { QLatin1String("multiple"), false}, { QLatin1String("types"), (uint)Selection_Screen_Window_Area }, { QLatin1String("cursor_mode"), (uint)record_mouse_onOff }, { QLatin1String("handle_token"), getRequestToken() } }; QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall); connect(watcher, &QDBusPendingCallWatcher::finished, [this] (QDBusPendingCallWatcher *watcher) { QDBusPendingReply reply = *watcher; if (reply.isError()) { qWarning() << "Couldn't get reply"; qWarning() << "Error: " << reply.error().message(); } else { QDBusConnection::sessionBus().connect(QString(), reply.value().path(), QLatin1String("org.freedesktop.portal.Request"), QLatin1String("Response"), this, SLOT( slot_gotSelectSourcesResponse(uint,QVariantMap))); } }); } void Portal_wl::slot_gotSelectSourcesResponse(uint response, const QVariantMap &results) { Q_UNUSED(results); qDebug().noquote() << global::nameOutput << "Got response from portal SelectSources"; if (response != 0) { qWarning() << "Failed to select sources: " << response; return; } QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("org.freedesktop.portal.ScreenCast"), QLatin1String("Start")); message << QVariant::fromValue(QDBusObjectPath(m_session)) << QString() // parent_window << QVariantMap { { QLatin1String("handle_token"), getRequestToken() } }; QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall); connect(watcher, &QDBusPendingCallWatcher::finished, [this] (QDBusPendingCallWatcher *watcher) { QDBusPendingReply reply = *watcher; if (reply.isError()) { qWarning() << "Couldn't get reply"; qWarning() << "Error: " << reply.error().message(); } else { QDBusConnection::sessionBus().connect(QString(), reply.value().path(), QLatin1String("org.freedesktop.portal.Request"), QLatin1String("Response"), this, SLOT(slot_gotStartResponse(uint,QVariantMap))); } }); } void Portal_wl::slot_gotStartResponse(uint response, const QVariantMap &results) { Q_UNUSED(results); qDebug().noquote() << global::nameOutput << "Got response from portal Start"; if ( response != 0 ) { // The system Desktop dialog was canceled qDebug().noquote() << global::nameOutput << "Failed to start or cancel dialog: " << response; emit signal_portal_cancel( response ); return; } Streams streams = qdbus_cast(results.value(QLatin1String("streams"))); Stream stream = streams.last(); QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("org.freedesktop.portal.ScreenCast"), QLatin1String("OpenPipeWireRemote")); message << QVariant::fromValue(QDBusObjectPath(m_session)) << QVariantMap(); QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); pendingCall.waitForFinished(); QDBusPendingReply reply = pendingCall.reply(); if ( reply.isError() ) { qWarning() << "Failed to get fd for node_id"; } QString vk_fd = QString::number( reply.value().fileDescriptor() ); QString vk_path = QString::number( stream.node_id ); emit signal_portal_fd_path( vk_fd, vk_path ); } QString Portal_wl::getSessionToken() { m_sessionTokenCounter += 1; return QString("u%1").arg(m_sessionTokenCounter); } QString Portal_wl::getRequestToken() { m_requestTokenCounter += 1; return QString("u%1").arg(m_requestTokenCounter); } // Ab hier alt ****************************************************************************************** /* void Portal_wl::requestScreenSharing( int value ) { Selection_Screen_Window_Area = value; QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("org.freedesktop.portal.ScreenCast"), QLatin1String("CreateSession")); message << QVariantMap { { QLatin1String("session_handle_token"), getSessionToken() }, { QLatin1String("handle_token"), getRequestToken() } }; QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall); connect(watcher, &QDBusPendingCallWatcher::finished, [this] (QDBusPendingCallWatcher *watcher) { QDBusPendingReply reply = *watcher; if (reply.isError()) { qDebug().noquote() << global::nameOutput << "Couldn't get reply"; qDebug().noquote() << global::nameOutput << "Error: " << reply.error().message(); } else { qDebug().noquote() << global::nameOutput << "Begin create portal session"; QDBusConnection::sessionBus().connect(QString(), reply.value().path(), QLatin1String("org.freedesktop.portal.Request"), QLatin1String("Response"), this, SLOT( slot_gotCreateSessionResponse(uint,QVariantMap))); } }); } void Portal_wl::slot_gotCreateSessionResponse(uint response, const QVariantMap &results) { if ( response != 0 ) { qDebug().noquote() << global::nameOutput << "Failed to create portal session"; return; } qDebug().noquote() << global::nameOutput << "Portal session was created successfully "; QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("org.freedesktop.portal.ScreenCast"), QLatin1String("SelectSources")); m_session = results.value(QLatin1String("session_handle")).toString(); message << QVariant::fromValue(QDBusObjectPath(m_session)) << QVariantMap { { QLatin1String("multiple"), true}, { QLatin1String("types"), (uint)Selection_Screen_Window_Area }, // { QLatin1String("cursor_mode"), (uint)2 }, { QLatin1String("handle_token"), getRequestToken() } }; QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall); connect(watcher, &QDBusPendingCallWatcher::finished, [this] (QDBusPendingCallWatcher *watcher) { QDBusPendingReply reply = *watcher; if (reply.isError()) { qDebug().noquote() << global::nameOutput << "Couldn't get reply"; qDebug().noquote() << global::nameOutput << "Error: " << reply.error().message(); } else { QDBusConnection::sessionBus().connect(QString(), reply.value().path(), QLatin1String("org.freedesktop.portal.Request"), QLatin1String("Response"), this, SLOT( slot_gotSelectSourcesResponse(uint,QVariantMap))); } }); } void Portal_wl::slot_gotSelectSourcesResponse( uint response, const QVariantMap &results ) { Q_UNUSED(results); if ( response != 0 ) { qDebug().noquote() << global::nameOutput << "Failed to select sources: " << response; return; } QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("org.freedesktop.portal.ScreenCast"), QLatin1String("Start")); message << QVariant::fromValue(QDBusObjectPath(m_session)) << QString() // parent_window << QVariantMap { { QLatin1String("handle_token"), getRequestToken() } }; QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall); connect(watcher, &QDBusPendingCallWatcher::finished, [this] (QDBusPendingCallWatcher *watcher) { QDBusPendingReply reply = *watcher; if (reply.isError()) { qDebug().noquote() << global::nameOutput << "Couldn't get reply"; qDebug().noquote() << global::nameOutput << "Error: " << reply.error().message(); } else { QDBusConnection::sessionBus().connect(QString(), reply.value().path(), QLatin1String("org.freedesktop.portal.Request"), QLatin1String("Response"), this, SLOT( slot_gotStartResponse(uint,QVariantMap))); } }); } void Portal_wl::slot_gotStartResponse( uint response, const QVariantMap &results ) { if ( response != 0 ) { // The system Desktop dialog was canceled qDebug().noquote() << global::nameOutput << "Failed to start: " << response; emit signal_portal_cancel(); return; } Streams streams = qdbus_cast( results.value( QLatin1String( "streams" ) ) ); Stream stream = streams.at( vk_startCounter ); vk_startCounter++; QDBusMessage message = QDBusMessage::createMethodCall( QLatin1String( "org.freedesktop.portal.Desktop" ), QLatin1String( "/org/freedesktop/portal/desktop" ), QLatin1String( "org.freedesktop.portal.ScreenCast" ), QLatin1String( "OpenPipeWireRemote" ) ); message << QVariant::fromValue(QDBusObjectPath(m_session)) << QVariantMap(); QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall( message ); pendingCall.waitForFinished(); QDBusPendingReply reply = pendingCall.reply(); if ( reply.isError() ) { qDebug().noquote() << global::nameOutput << "Failed to get fd for node_id " << stream.node_id; } vk_fd = QString::number( reply.value().fileDescriptor() ); vk_path = QString::number( stream.node_id ); emit signal_portal_fd_path( vk_fd, vk_path ); } QString Portal_wl::getSessionToken() { m_sessionTokenCounter += 1; return QString("u%1").arg(m_sessionTokenCounter); } QString Portal_wl::getRequestToken() { m_requestTokenCounter += 1; return QString("u%1").arg(m_requestTokenCounter); } */ vokoscreenNG-3.1.0/src/wayland/portal_wl.h000066400000000000000000000034371416353147400205370ustar00rootroot00000000000000/* * Copyright © 2016 Red Hat, Inc * * This program 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 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, see . * * Authors: * Jan Grulich */ #ifndef PORTAL_WL_H #define PORTAL_WL_H #include #include #include #include class Portal_wl : public QObject { Q_OBJECT public: typedef struct { uint node_id; QVariantMap map; } Stream; typedef QList Streams; Portal_wl(); ~Portal_wl(); void requestScreenSharing( int value, int mouseOnOff ); public Q_SLOTS: void slot_gotCreateSessionResponse(uint response, const QVariantMap &results); void slot_gotSelectSourcesResponse(uint response, const QVariantMap &results); void slot_gotStartResponse(uint response, const QVariantMap &results); private slots: private: QString getSessionToken(); QString getRequestToken(); QString m_session; uint m_sessionTokenCounter; uint m_requestTokenCounter; int Selection_Screen_Window_Area = 1; int record_mouse_onOff; protected: signals: void signal_portal_fd_path( QString, QString ); void signal_portal_cancel( uint ); }; #endif // PORTAL_WL_H vokoscreenNG-3.1.0/src/wayland/region/000077500000000000000000000000001416353147400176375ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/wayland/region/QvkRegionButtonArrow_wl.cpp000066400000000000000000000066121416353147400251660ustar00rootroot00000000000000/* 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_wl.h" #include QvkRegionButtonArrow_wl::QvkRegionButtonArrow_wl() { } QvkRegionButtonArrow_wl::~QvkRegionButtonArrow_wl() { } QPixmap QvkRegionButtonArrow_wl::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_wl::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( colorSelected ); 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_wl::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_wl::getWithHalf() { return ( diameter + penWidth ) / 2; } vokoscreenNG-3.1.0/src/wayland/region/QvkRegionButtonArrow_wl.h000066400000000000000000000030551416353147400246310ustar00rootroot00000000000000/* 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_WL_H #define REGIONBUTTONARROW_WL_H #include class QvkRegionButtonArrow_wl : public QObject { Q_OBJECT public: QvkRegionButtonArrow_wl(); virtual ~QvkRegionButtonArrow_wl(); 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.1.0/src/wayland/region/QvkRegionChoise_wl.cpp000066400000000000000000001645761416353147400241300ustar00rootroot00000000000000/* 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_wl.h" #include "QvkRegionButtonArrow_wl.h" #include "global.h" #include #include #include #include #include #include QvkRegionChoise_wl::QvkRegionChoise_wl():handlePressed(NoHandle), handleUnderMouse(NoHandle), HandleColorBackground( Qt::lightGray ), HandleColorBackgroundSize( Qt::lightGray ), HandleColorByMousePressed( Qt::lightGray ), colorSelectedArrow( Qt::green ), 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) { // setWindowTitle( QString( tr( "Area") ) ); setWindowTitle( QString( ( "Area") ) ); QIcon icon; icon.addFile( QString::fromUtf8( ":/pictures/logo/logo.png" ), QSize(), QIcon::Normal, QIcon::Off ); setWindowIcon( icon ); setWindowFlags( Qt::FramelessWindowHint ); setAttribute( Qt::WA_TranslucentBackground, true ); setMouseTracking( true ); setFrameColor( Qt::darkGreen ); hide(); } /* * bool value = true radiobutton was selected * bool value = false radio button was deselected */ void QvkRegionChoise_wl::slot_show( bool value ) { // Hinweis: // Die Bereichsanzeige ist ein Fenster und wird immmer am beginn des verfügbaren Bereichs auf dem Desktop gesetzt. // Ist das Desktop-Panel oben am Bildschirm wird das Fenster z.b bei 0,44 gesetzt. // Ist das Panel unten am Bildschirm wird das Fenster bei 0,0 gesetzt. // Die Frage ist, wie erkennt man ob das Desktop-Panel oben oder unten gesetzt ist? // Gelöst wird das bis jetzt in dem der User in der GUI angeben muß wo das Panel plaziert ist // Das Fenster wird dort plaziert wo sich die GUI befindet, dies wird vom compositer geregelt. // Damit die Fenstergröße ermittelt werden kann ist unter KDE folgender ablauf zwingend notwendig // Gnome wurde getestet und funktioniert. if ( value == true ) { // "Screen" wird im weiteren Verlauf noch gebraucht für pixelratio Screen = screen(); // Das Fenster wird per "show()" in einer von Qt vorgegebenen größe angezeigt // Anschließend wird das Fenster per "singelshot()" maximiert show(); update(); QTimer::singleShot( 1000, Qt::PreciseTimer, this, SLOT( showMaximized() ) ); update(); } else { // Beim ausblenden muß das Fenster erst per "shownormal()" dargestellt werden // und anschließend per "hide()" versteckt werden showNormal(); update(); QTimer::singleShot( 1000, Qt::PreciseTimer, this, SLOT( hide() ) ); update(); } } QvkRegionChoise_wl::~QvkRegionChoise_wl() { } // Ermitteln der größten Fensterhöhe und breite zwischen den Panels void QvkRegionChoise_wl::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); windowWidth = size().width(); windowHeight = size().height(); } /* * Panel is the desktop panel that contain the Taskbar, Systray and other things. */ int QvkRegionChoise_wl::get_sum_all_panels_height() { return ( Screen->size().height() - size().height() ); } void QvkRegionChoise_wl::setHandleColorBackground( QColor color ) { HandleColorBackground = color; } void QvkRegionChoise_wl::setHandleColorByMousePressed( QColor color ) { HandleColorByMousePressed = color; } void QvkRegionChoise_wl::setHandleColorBackgroundSize( QColor color ) { HandleColorBackgroundSize = color; } /* * x, y is middle from blue frame */ void QvkRegionChoise_wl::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_wl::paintEvent( QPaintEvent *event ) { (void)event; QPixmap pixmap( windowWidth, windowHeight ); 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_wl::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; clearMask(); update(); } void QvkRegionChoise_wl::mouseReleaseEvent( QMouseEvent * event ) { if( event->button() != Qt::LeftButton) { return; } handlePressed = NoHandle; update(); } void QvkRegionChoise_wl::leaveEvent(QEvent *event) { Q_UNUSED(event); unsetCursor(); } void QvkRegionChoise_wl::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 ) > windowWidth ) { 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 ) > windowWidth ) { 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 > windowHeight ) { 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 > windowWidth ) { 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 > windowHeight ) { 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 > windowHeight ) { 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 > windowWidth ) { 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 > windowHeight ) { frame_Y = frame_Y - 1; } break; } } } repaint(); update(); } void QvkRegionChoise_wl::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 ) > windowWidth ) { frame_Width = windowWidth + 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 ) > windowWidth ) { frame_Width = windowWidth + 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 ) > windowWidth ) { frame_Width = windowWidth + framePenHalf - frame_X; } if( ( frame_Y + frame_height - framePenHalf ) > windowHeight ) { frame_height = windowHeight + 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 ) > windowHeight ) { frame_height = windowHeight + 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 ) > windowHeight ) { frame_height = windowHeight + 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 ) > windowWidth ) { frame_X = windowWidth - frame_Width + framePenHalf; } // Limit Bottom if( ( frame_Y + frame_height - framePenHalf ) > windowHeight ) { frame_Y = windowHeight - frame_height + framePenHalf; } break; } } // end switch if ( handlePressed != NoHandle ) { clearMask(); update(); } if ( handlePressed != NoHandle ) return; QRect regionTopLeft( frame_X - radius - 1, frame_Y - radius - 1, diameter + 2, diameter + 2 ); if ( regionTopLeft.contains( event->pos() ) ) { QPixmap pixmap( ":/pictures/cursor/size_fdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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() ) ) { QPixmap pixmap( ":/pictures/cursor/size_ver.png" ); QCursor cursor( pixmap ); setCursor( cursor ); handleUnderMouse = TopMiddle; return; } QRect regionTopRight( frame_X + frame_Width - radius - 1, frame_Y - radius - 1, diameter + 2, diameter + 2 ); if ( regionTopRight.contains( event->pos() ) ) { QPixmap pixmap( ":/pictures/cursor/size_bdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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() ) ) { QPixmap pixmap( ":/pictures/cursor/size_hor.png" ); QCursor cursor( pixmap ); setCursor( cursor ); handleUnderMouse = RightMiddle; 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() ) ) { QPixmap pixmap( ":/pictures/cursor/size_all.png" ); QCursor cursor( pixmap ); setCursor( cursor ); handleUnderMouse = Middle; return; } QvkRegionButtonArrow_wl 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_fdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_ver.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_bdiag.png" ); QCursor cursor( pixmap ); setCursor( cursor ); 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()) ) { QPixmap pixmap( ":/pictures/cursor/size_hor.png" ); QCursor cursor( pixmap ); setCursor( cursor ); handleUnderMouse = LeftMiddle; return; } unsetCursor(); handleUnderMouse = NoHandle; } void QvkRegionChoise_wl::printSize( QPainter &painter ) { QString widthHeigtSize = QString::number( static_cast( getWidthRecordArea()/Screen->devicePixelRatio() ) ) + " x " + QString::number( static_cast( getHeightRecordArea()/Screen->devicePixelRatio() ) ); QFont font; font.setPointSize( 14 ); painter.setFont( font ); QFontMetrics fontMetrics( font ); pixelWidth = fontMetrics.horizontalAdvance( 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_wl::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_wl::setFrameColor( Qt::GlobalColor color ) { frameColor = color; } Qt::GlobalColor QvkRegionChoise_wl::getFrameColor() { return frameColor; } void QvkRegionChoise_wl::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_wl::HandleTopLeft( QPainter &painter ) { QvkRegionButtonArrow_wl 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_wl::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.horizontalAdvance( 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_wl::HandleTopMiddle( QPainter &painter) { QvkRegionButtonArrow_wl 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_wl::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.horizontalAdvance( 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_wl::HandleTopRight(QPainter &painter) { QvkRegionButtonArrow_wl 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_wl::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.horizontalAdvance( 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_wl::HandleRightMiddle( QPainter &painter ) { QvkRegionButtonArrow_wl 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_wl::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.horizontalAdvance( 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_wl::HandleBottomRight( QPainter &painter ) { QvkRegionButtonArrow_wl 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_wl::HandleBottomRightSize( QPainter &painter ) { QvkRegionButtonArrow_wl 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.horizontalAdvance( 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_wl::HandleBottomMiddle( QPainter &painter ) { QvkRegionButtonArrow_wl 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_wl::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.horizontalAdvance( 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_wl::HandleBottomLeft( QPainter &painter ) { QvkRegionButtonArrow_wl 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_wl::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.horizontalAdvance( 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_wl::HandleLeftMiddle( QPainter &painter ) { QvkRegionButtonArrow_wl 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_wl::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.horizontalAdvance( 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_wl::HandleMiddle( QPainter &painter ) { QvkRegionButtonArrow_wl 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_wl::recordMode( bool value ) { if ( value == true ) { recordemode = true; repaint(); update(); } else { recordemode = false; repaint(); update(); } } /** * Return x from window */ int QvkRegionChoise_wl::getX() { return frame_X; } /** * Return y from window */ int QvkRegionChoise_wl::getY() { return frame_Y; } /** * Return x from record area */ qreal QvkRegionChoise_wl::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_wl::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_wl::getHeightRecordArea() { 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() ); } return xReal; } /** * Return width from record Area */ qreal QvkRegionChoise_wl::getWidthRecordArea() { 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() ); } return xReal; } void QvkRegionChoise_wl::slot_areaReset() { frame_X = 200 - framePenHalf; frame_Y = 200 - framePenHalf; frame_Width = frame_min_width; frame_height = frame_min_height; repaint(); update(); } void QvkRegionChoise_wl::setX( int x ) { frame_X = x - framePenHalf; repaint(); update(); } void QvkRegionChoise_wl::setY( int y ) { frame_Y = y - framePenHalf; repaint(); update(); } void QvkRegionChoise_wl::setWidth( int width ) { frame_Width = width + framePenWidth; repaint(); update(); } void QvkRegionChoise_wl::setHeight( int height ) { frame_height = height + framePenWidth; repaint(); update(); } vokoscreenNG-3.1.0/src/wayland/region/QvkRegionChoise_wl.h000066400000000000000000000100231416353147400235460ustar00rootroot00000000000000/* 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_wl_H #define REGIONCHOISE_wl_H #include "QvkRegionButtonArrow_wl.h" #include #include class QvkRegionChoise_wl : public QWidget { Q_OBJECT public: QvkRegionChoise_wl(); virtual ~QvkRegionChoise_wl(); int getX(); int getY(); qreal getHeightRecordArea(); qreal getWidthRecordArea(); 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 windowWidth = 400; int windowHeight = 400; int get_availables_window_height(); int get_sum_all_panels_height(); public slots: void slot_areaReset(); void slot_show( bool value ); 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 ); void resizeEvent(QResizeEvent *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 ); bool recordemode = false; Qt::GlobalColor getFrameColor(); Qt::GlobalColor frameColor; int availables_window_height = 0; int availables_window_width = 0; }; #endif vokoscreenNG-3.1.0/src/wayland/region/regionselection_wl.pri000066400000000000000000000003721416353147400242500ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkRegionChoise_wl.h \ $$PWD/QvkRegionButtonArrow_wl.h SOURCES += $$PWD/QvkRegionChoise_wl.cpp \ $$PWD/QvkRegionButtonArrow_wl.cpp vokoscreenNG-3.1.0/src/wayland/wayland.pri000066400000000000000000000005021416353147400205240ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/mainWindow_wl.h \ $$PWD/portal_wl.h SOURCES += $$PWD/mainWindow_wl.cpp \ $$PWD/portal_wl.cpp FORMS += $$PWD/formMainWindow_wl.ui include(region/regionselection_wl.pri) # container include(container/container.pri) vokoscreenNG-3.1.0/src/wayland/xdg-portal-test-kde-as-reference.tar.gz000066400000000000000000000434651416353147400256530ustar00rootroot00000000000000A`}z8rh~;&3RGn'j[vk۷_>J%)RCRvk'}'';u@"YV{'AY3?aO*әsIw%B 8ƀvu27q;p9Wnpo`e8H"7@F/Hd0@h.-i0`0@MiWJѣA7` 9H'čYd$+64ӻJca恲_Q3o?0d<`ga?=֥05Юji={& >7#fk Md\Qs=-$,&ͶD(GҋOC0G@>hHcrNS!ĭ:}ڃHt\(3*y%-(jmTP.bkJmC6BaVSiDW^HD'*^*RaՐ!ū6U .e&n:KZLYzle6-DV+ Ǵz\3$# @ױB 3EڹhfXfAƸ Y1n-A' XԄ @. >Ʉ̍q0D#%V򯮅9'M K1Z#0@:V^ ?iZVdm'7t#\VEVl;ydg¢ lƣ3 z= B lND5?ĩ6 ZjZGVH`o SgL6&(DEN|;nU.7<*e( L/!02F^:}4\E/PlzҊ iAo\@%BAduv F+)M3o` uAm{09ԚGw;1Rd5Dnm]㽣رA5RC$4Gl%bkM|u$ aQ罕?¥`Xc&KˠP>* qah> JF5g p+HxqYNcuy)"A¶YDGRkCn\"e"ֆ2Uf#bmvY[LM:v'g~mY$ڀ,ѷm뎸 N4SP&Az&7ڮe8!ݙr+A1վEqZHX+T]%תu~EnuHvoyfHk,]lVhu5 H7qerBzgg?D1 %7J9Satu&mK-i*Il`(JqN^tQ,[}MCL۰t4W y[ܦq#rrVI)wo5C$nR Xgj<` ¹:|ʬspWTB"ӷ)D{꡻f@}ׁ!yfóV₮uRiڄ5zDkvNc_ٹ,uHgpFr~c(5ll-@ӘٍID(w"_)Ɨ=vɄ2*~_&N%ζT(s*DG<-1Sþ$ݦIw1p@`IN4Qڅ"'SڴXCF2 ÀF/t:J+l zɃDP)0OBX$ۈZ/l]MquvP 3o2v{Zϭ:Q;țSJn PxSܔ5H> (4 `Q8ET<ٓTAX,Mw1e# 2?S qV,O!+Xn/VnBvCaتY gq<8y'Y.1U#Z^\-'jW㼌X7"6y=OD9KXTNZ )(ޢBzl{5U:Bify% m9nw8XJIPosBFg&40 _);?^5 ׆,ɘ5в(>=GNiVWt`TR8[J !wTB}VH%^0bT cp%A K2*k# h8o xJ9 C”%r'9GjnLDCbq[P'܄(el1\1 CP%\ ZnTL,dD*IZ>UB@- Vc$ӈ$ PWkX$!fyePDЮeJia݃.; e{iajX'" yʟ@:S` sD2N*?^7dcSLZU1ɂm-cumk[nr0: DIgheC41ǣs% 7Eiv KjbP>aMhkL#=(- (b8Fcyc72VLHH@ 9i,'FA zYrn8>pt _q,x/^֔҆5k>UKqCb w p0_0K-r05% AImb4HCw*GPܢ:PRE>Yz)e%=,+q昔;f2vtHJ#WCML\VLxWq[`_ =!bIwTK:r Ɗ6(Bwi1:,SahԌ95hI Kce{^mCY7OL֓Hċ<偱6ky.„l++u'@F aU]4nAϰxڌ)Ѐj;e|^0:A)sDer'uܡ<;s80ٴy_xVpFOb2H` NPs<[@ӧ0٘<,Cư+ìZZS:iˀԱ{޳s9nۺYkOHoPZdRnF0!ј|FyG%h8%.OznՁܢUa}B "^Țw52gk͚r01С0p>X[٘`je xJjD~H4 :"0pK>'Sʈvb:\n? c*h(3*Td Q;v oz3G fJ8* mQ%5V6dkO!HZ~e\_+}]w)?:N&Rs4faDez.'L~ ZS&u3UG썥-jt06F@Nd׾|, ]!ɨ|"4$i9?dxW&E<Dd) Bo^bS*dMB^ ,?Xb!W. ?cXq ]`t{ oQ<uIuILf3Qւ ڧSkuRM01EVo@8HGwfN&YP.2CQ Vn)e byf^6!W*cx$E$R"Qnѣ ,I6!̚MlaNq& FMf4sN$%k~kce:(5'C@njGr]{gޭ*wJzrET9vd>1+; 1rINe/p2F%R}2FX"5[:Ba^qn:t$'s~ b#=E=FfXP~ƻdaTytL녌4k<5#ʺ <#`pU ѕZ^pa3TEؾSWkE+&\] )U77SP2ܜ'WF?2C Lmd T JXM+(V'!V7m%sZ7JNYIʡЋ&TMsK)ޕPvKC( pɌϨZ{x|!@!L@QD:O8ET5$JTy㫶5Y{*B!fhie%1t+}~I= oL9aW3~ҥݽ]28n~@Y)DCL-I*MWRȲ$od;eT*Chǫjp˝|o ԇXQaz$7[^celPCGNpSZc>)'D |t9C̖m\Gb* zQ}p2Mĺt(aUrSU:t30`xG䀈GD2k3jRfsDbJ2#`fwM(.tzyÅz(XI=nJnT&x+Na@*/87KCSr2Na1*)J:. r%:&#ghb@̈Tjd>Tu|xBf)"sLc.Y? q 9 X^dREJE^ֆ$7:xQN4T5ⶂ92 ,<sBay:=Z_!|_P"4WNf~f=RėTկ>]ZIX)LW<[5 }W9cTZ"+KcZY,p5d >P=Rt]qm Ll$ m2|(:5JOi04&| gi(X~YʣNtv)CykJ JAf$?qɬЅ#QOl(`T 3a34 Z8cJi zRX98 )q[0Tķ)?S{Iʏ^Xz[d\ OvqLhtYۡym5;}S ;F^Zg][uzPu690 ܄ z8=B01h=#8Om@iu܂!a{ C q_:M w ` /#@.q8ݧuB(ugydjas VZ0t AⴹWf>s kʸdPg&@Kt8i5;ЪLMtΛ-Zxl@u"!/-viV,g%HCv6A kBk<|vj_aka \fk fn~B<;E[Ә |(.va45:t:a½xׄfZx <yfK_V zudC ]Rgḑ`|%G-׵>i.>X*BЮ\+NL7:H9)WfT!/ Ǥ%y5fn!rht=Z7ʒ_Pm}5>j\6/tGὪokNAjXU1Tu3G2 {nPF*N ɇګ 6:K&[>T[NXHL։t֌F9vdmTT]Óè(rE_WF]teG;]#P6D܎9w!57sSt{XV97K9%㌪PQ4ՓhkWx]=V+LAe8VM(it$7*gQDp|ci4>V T`Й8PF͡$ԙǘG~h<rZRznP o'H/UئCP9$ph}c 0h.NN(]PӃwSz @bNL/԰#ghѿa A^Z)ln4/>s.5AuiCAZN&=RU}Y:8ž`}l~>;lt[-K(~DjlG%A&xEQ% Kg axvp1nTc?+'xw^˭ϟcȊ`q`ȎjlGQO!QL76noo몯z ; C NSjlEսjV+@I8Q1=3mګf9 du 3Ruȣ1g4DJ:bjXظM6pЮ>)J\dK)j-F0YҥRNPO_hI`[NgS׃p}8ړ&1qFnDrfR9@44ewQ~5Q("܏WQ&4%g% \1PDMۛm%}/^xtc է17_'?el{fۚ[|0)Epǵsv^ =G}7Ή@^ݒ&kO\/ZxFkWؕ5ɑz(1!KF vmn|QLF{o^D?-h~>7tz2Hn 쮗Rn`Zςz^1 6`5"3}nF3CЖ*}faa޾]cݞug>Z/yi&l `{m{$3.]{dcwm\2v#LY - u D"lm--5#m Zi]/Ky cZcytCZ z"!()V6wH(ƥn0Tg9U~] j "2ƯB@j#~w7x,XWs)>\D~d^Ox }~YR/e hOGt/Vt[u Mav݋uQ"%G/^.a`W:y?XM4_a6΋{جƫZ~3Jd~fH^iRHGDnO2j-=9GwpaW?;iO{po  =xHy(eq돺v1JN:-ʃ@m!qC%j4zEaDR_VXsHQPbTq߻ m'9?Jm/voV\7Z~{Q5iQ,[wZ C}oLcL&CEZm.`fcu`^\I{5Kw6fcc&K=n`Z 8b[eG8I!a,15WɊ﹎;TlYCdmV&k`_ ue8|4.õh+|h,U{z 75糂`Wip7ֳ4.U]D YlS1jQ>ɿ\р]/@Rr"W6Zb~}~ǽ hNOkM6?O<p_pzQtFm,Q2S{:rG缑6CqWay \&iYAdWthoףG]\YXH,Պ,$Iub2>^/ PGP^WXhUW}Q`j2yKpaOE>h*>xe}ù@gl?^hFM=kk"NL,ZA@E U&-ިt`347*ɼGɤ Tw/{Y.tM2YD xwޔ|<+?ۂ,_?mc"[^."rJf,ZiQO csM>W!Z5wL}O>IK) #v=lH=p=P!pTrcfQHr-&@bnLXCO& X|WxTQ~69Uq[نI_Wfqњ|]f_v?bYF4H^ža ^B@ q,zg7S>gg |y|zwKGWY)jeMF̫c%hVf?/Nȼ~<>;:º%XDw߮dV,xy܇ԼPw07xz<o0xīiXw6`Iн^b9Xtͳ,XB:շ̫ H=?T,]>=w_տ吨C&no3K@\#y\ۊD 7I/|ځy!7N2 }X(},?/<{wˍd' _2p@+~qSp, TbǘWchi8b%9YWK?o}Q+|VcPZmZl(_qrd+' ͿT 6Zm0`Df/θ+S|ceǒ;`Z`I߷/[0uuKTԘj9`&lyijwe)om.mG+vS|{/%,,e.|Y4ZTKJ(-o)-hTIO΋^!/ew6R y7&>PZѸ%K|牄Wc鰸m\߹XmJJTiǼ9$DQnPMz9(>?Op`"A+)A?_U*Sm_{c䨒S3KLE*)1֩;V{=Ot*yl9eP~}`$o߂XπJ{n~b/^2ۤ{q`jnzHv>f RoxJId&tU[vlFꯚPQm!>q'{x9XƆ͏x=Zzb]ӣ;(YHb"?Gҧ Ƿ0p:*Io=돷zfןL r(v / Ku$8u--<K a4 t{NAӪzW1)!QS+ kYv"d-Q]κ\пAU8gV}QESd6|XEv\OBD6πF.X6b2QpS||23+rn};.׭c%trFC/膸eg]w!hoKTm.{fy7}nI k5vи\DŽe{.:K,尒ΤD͆A%m?|K%U`:^Oӊ&Y;$ocڼV ro9BfmKm6GHo1Ows6 _O~AV5^#D>ˮPfooyzk0\̣ZV )h,7mH}T&G3scPrT+IMT_G0Y K 񟯵bPI8:2"A5O()]Qm^J`7,*淑'7@{v~Qpyթv;>P=,Б+arnߖK}F 1{ LtEZ3qj=)%Pb?Qxu0yY5Ax5u\r 2Wxڪ=-[X1Va+}9>VJ} 5ܖ^ӡ l!4uE^|:=fO]>]nZ,ԃeT4Zo-Q :,6⹨O^J<_?Jk"9Z)Wl\}""!*z%S Y=d|phR[$`{T"* @if<ᖮUH-Θܜӻ˔uqebj4|.?EE$ e&kTsH]QN9v5/+}\h V~q8]̑ˢn\;؀ΰ*Wgw1潖wT|+@wOJ?C X_O9qbUo9Bs`Wg])ۜΖ@]O#z` p:fhT./[EcUvdw5wZ&:E7˜]كsoīϴ D\g;4>h"!S 9it7]ic0JQԉ /eU}t\ly8Yt`,L 4Rg@ٖKU2.}o-{^3e&أ׿dLϪ,*ޘң8l*{TCΙiiA1;R;5.g? kPz~&=Yl}R2ĐRe{lcMw6w> ֏9'y|àwuwN(7Q"ұw {}ǻ9&eU^/8 $}P6&£lȲ??ˈw:DHMi浏`ZT9zY4X0l'_?˼Y{3]iA'X bAG̓q;=}$ 5j>ə'9C4SfifsbLn4+,wN>):xXk/qHcԪ}6G^J>/ ]fy60ORށbEPSѹ Ul{'I'>~6c_>#q) u'ٓY'n,tv*p5cA3w/oIS4?ɸ''d}emCᠥL_au8֭^U>*Mxyxn6ߋ zQ ,; G-2dD,xM'/XA,sgSK% ~V?[KP")0%%={gv9Es576:q:ݑ]dM؝NVV5(s2V`ß_nxת|V~\eps6Y-lIӗTET; ֊$W?u3i~~:ڂ`&:Nm^7>N*8E/r,:i'iSZKQqbjM#ZXy˭U".'RwVe$zagHDE4H?4Bth&aڠM1>1`gXf0e@Tl.؎AWwŦh&D dq{{[:z| `5(/@GC߁:aaA >Į},zzf),5 iD.jx?fu' 7&Jr.Y4to ns6sNv&аԇ,̣E:|$GO?7c!_~"om>I?px%`"_vvD'x䍭4b+:yrGI0fw'&x@n[}` 7/ώZGn0U=ְZo<{~\%K@~by)|P!ޱ;Qe}*M](PV z.O/ϻ<BgDcG-N z'۷}z[1Оe[|[?FUUP˭%wK_kr ֛h" * * 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 "QvkWaylandRoutines.h" #include "global.h" #include #include QvkWaylandRoutines::QvkWaylandRoutines( QWidget *parent ) { Q_UNUSED(parent) } QvkWaylandRoutines::~QvkWaylandRoutines() {} bool QvkWaylandRoutines::is_Wayland_Display_Available() { wl_display *display = wl_display_connect( Q_NULLPTR ); if ( display == Q_NULLPTR ) { qDebug().noquote() << global::nameOutput << "Desktop session is a X11 session"; return false; } qDebug().noquote() << global::nameOutput << "Desktop session is a Wayland session"; wl_display_disconnect( display ); return true; } vokoscreenNG-3.1.0/src/waylandRoutines/QvkWaylandRoutines.h000066400000000000000000000022621416353147400240720ustar00rootroot00000000000000/* vokoscreenNG - A desktop recorder * Copyright (C) 2017-2021 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 QVKWAYLANDROUTINES_H #define QVKWAYLANDROUTINES_H #include namespace Ui { class QvkWaylandRoutines; } class QvkWaylandRoutines : public QObject { Q_OBJECT public: QvkWaylandRoutines( QWidget *parent = Q_NULLPTR ); ~QvkWaylandRoutines(); static bool is_Wayland_Display_Available(); private: private slots: signals: protected: }; #endif vokoscreenNG-3.1.0/src/waylandRoutines/waylandRoutines.pri000066400000000000000000000002041416353147400240050ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkWaylandRoutines.h SOURCES += $$PWD/QvkWaylandRoutines.cpp vokoscreenNG-3.1.0/src/winInfo/000077500000000000000000000000001416353147400163265ustar00rootroot00000000000000vokoscreenNG-3.1.0/src/winInfo/QvkWinInfo.cpp000066400000000000000000000107171416353147400210730ustar00rootroot00000000000000/* 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 #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(); mouseTimer = new QTimer( this ); connect( mouseTimer, SIGNAL( timeout() ), this, SLOT( slot_mousePosition() ) ); mouseTimer->start( 10 ); vkGlobalMouse = new QvkGlobalMouse; vkGlobalMouse->slot_on( true ); connect( vkGlobalMouse, SIGNAL( signal_mousePressed( int, int, QString ) ), this, SLOT( slot_selectWindow() ) ); 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, 15 ); painter.drawLine( 50/2, 50/2+10, 50/2, 50 ); painter.drawLine( 0, 50/2, 50/2-10, 50/2 ); painter.drawLine( 50/2+10, 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 ) { mouseTimer->stop(); vkGlobalMouse->slot_on( false ); // 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.1.0/src/winInfo/QvkWinInfo.h000066400000000000000000000031221416353147400205300ustar00rootroot00000000000000/* 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 #include "QvkGlobalMouse.h" class QvkWinInfo: public QWidget { Q_OBJECT public: QvkWinInfo(); virtual ~QvkWinInfo(); WId getWinID(); static WId activeWindow(); QRectF windowGeometryWithoutFrame( WId child); QvkGlobalMouse *vkGlobalMouse; 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 *mouseTimer; WId lastWinID; WId newWinID; }; #endif // QVKWININFO_H vokoscreenNG-3.1.0/src/winInfo/winInfo.pri000066400000000000000000000002041416353147400204470ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/QvkWinInfo.h SOURCES += $$PWD/QvkWinInfo.cpp vokoscreenNG-3.1.0/wayland-helper.txt000066400000000000000000000001361416353147400176030ustar00rootroot00000000000000 Terminal programms: dbus-monitor busctl systemctl status GUI programms: qdbusviewer-qt5