pax_global_header00006660000000000000000000000064141427170440014516gustar00rootroot0000000000000052 comment=a503e7ecce9e50e4917ab9707592b3cd3e40c248 adwaita-qt-1.4.1/000077500000000000000000000000001414271704400135555ustar00rootroot00000000000000adwaita-qt-1.4.1/.clang-format000066400000000000000000000054131414271704400161330ustar00rootroot00000000000000# SPDX-License-Identifier: MIT # # Copyright (C) 2019 Christoph Cullmann # Copyright (C) 2019 Gernot Gebhard # # 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. # Style for C++ Language: Cpp # base is WebKit coding style: http://www.webkit.org/coding/coding-style.html # below are only things set that diverge from this style! BasedOnStyle: WebKit # enforce C++11 (e.g. for std::vector> Standard: Cpp11 # 4 spaces indent TabWidth: 4 # 3 * 80 wide lines ColumnLimit: 240 # sort includes inside line separated groups SortIncludes: true # break before braces on function, namespace and class definitions. BreakBeforeBraces: Linux # CrlInstruction *a; PointerAlignment: Right # horizontally aligns arguments after an open bracket. AlignAfterOpenBracket: Align # align trailing comments AlignTrailingComments: true # don't move all parameters to new line AllowAllParametersOfDeclarationOnNextLine: false # no single line functions AllowShortFunctionsOnASingleLine: None # always break before you encounter multi line strings AlwaysBreakBeforeMultilineStrings: true # don't move arguments to own lines if they are not all on the same BinPackArguments: false # don't move parameters to own lines if they are not all on the same BinPackParameters: false # don't break binary ops BreakBeforeBinaryOperators: None # format C++11 braced lists like function calls Cpp11BracedListStyle: true # remove empty lines KeepEmptyLinesAtTheStartOfBlocks: false # no namespace indentation to keep indent level low NamespaceIndentation: None # we use template< without space. SpaceAfterTemplateKeyword: false # macros for which the opening brace stays attached. ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCHMARK, QBENCHMARK_ONCE ] adwaita-qt-1.4.1/.github/000077500000000000000000000000001414271704400151155ustar00rootroot00000000000000adwaita-qt-1.4.1/.github/workflows/000077500000000000000000000000001414271704400171525ustar00rootroot00000000000000adwaita-qt-1.4.1/.github/workflows/build.yml000066400000000000000000000043671414271704400210060ustar00rootroot00000000000000name: Automatic build on: push: branches: - '**' pull_request: branches: - '**' release: types: [ created ] env: BUILD_TYPE: Release jobs: Linux_Qt5: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install dependencies run: | sudo apt update sudo apt install cmake make pkg-config libx11-dev xcb libx11-xcb-dev libxkbcommon-dev sassc - name: Install Qt uses: jurplel/install-qt-action@v2 with: version: 5.15.2 - name: Create Build Environment run: cmake -E make_directory ${{runner.workspace}}/build - name: Configure CMake shell: bash working-directory: ${{runner.workspace}}/build run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_EXAMPLE=true -DUSE_QT6=OFF - name: Build working-directory: ${{runner.workspace}}/build shell: bash run: make -j2 Linux_Qt6: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install dependencies run: | sudo apt update sudo apt install cmake make pkg-config libx11-dev xcb libx11-xcb-dev libxkbcommon-dev sassc - name: Install Qt uses: jurplel/install-qt-action@v2 with: version: 6.2.0 - name: Create Build Environment run: cmake -E make_directory ${{runner.workspace}}/build - name: Configure CMake shell: bash working-directory: ${{runner.workspace}}/build run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_EXAMPLE=true -DUSE_QT6=ON - name: Build working-directory: ${{runner.workspace}}/build shell: bash run: make -j2 Windows: runs-on: windows-latest steps: - uses: actions/checkout@v1 with: fetch-depth: 1 - name: Install Qt uses: jurplel/install-qt-action@v2 with: cached: ${{ steps.cache-qt.outputs.cache-hit }} arch: 'win64_mingw81' version: '5.15.2' - name: Build shell: bash if: ${{ !steps.cache-qt.outputs.cache-hit }} run: | mkdir build cd build cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="$Qt5_Dir" -DBUILD_SHARED_LIBS=ON .. mingw32-make -j2 VERBOSE=1 adwaita-qt-1.4.1/.gitignore000066400000000000000000000000441414271704400155430ustar00rootroot00000000000000*.kdev4 build CMakeLists.txt.user* adwaita-qt-1.4.1/AUTHORS000066400000000000000000000004251414271704400146260ustar00rootroot00000000000000Cursors: Ken Vermette KStyle (original Breeze): Hugo Pereira Da Costa - Developer Andrew Lake - Designer KStyle (adwaita modifications) Martin Bříza Jan Grulich adwaita-qt-1.4.1/CMakeLists.txt000066400000000000000000000027601414271704400163220ustar00rootroot00000000000000project(Adwaita) cmake_minimum_required(VERSION 3.17) set(ADWAITAQT_VERSION_MAJOR 1) set(ADWAITAQT_VERSION "1.4.1") option(USE_QT6 "Use Qt6 instead of Qt5" OFF) if (USE_QT6) set(QT_MIN_VERSION "6.2.0") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(ADWAITAQT_SUFFIX "6") else() set(QT_MIN_VERSION "5.15.2") set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(ADWAITAQT_SUFFIX "") endif() set(CMAKE_AUTOMOC ON) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH}) include(GNUInstallDirs) if (USE_QT6) find_package(QT NAMES Qt6 COMPONENTS Core DBus Gui Widgets REQUIRED) else() find_package(QT NAMES Qt5 COMPONENTS Core DBus Gui Widgets REQUIRED) endif() find_package(Qt${QT_VERSION_MAJOR} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Core DBus Gui Widgets ) if (NOT APPLE AND NOT WIN32 AND NOT USE_QT6) find_package(XCB 1.10 COMPONENTS XCB) set(ADWAITA_HAVE_X11 ${XCB_FOUND}) find_package(Qt${QT_VERSION_MAJOR} ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS X11Extras ) endif() if (NOT USE_QT6) get_target_property(REAL_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) if (NOT QT_PLUGINS_DIR) execute_process(COMMAND "${REAL_QMAKE_EXECUTABLE}" -query QT_INSTALL_PLUGINS OUTPUT_VARIABLE QT_PLUGINS_DIR ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) endif() endif() add_subdirectory(src) adwaita-qt-1.4.1/COPYING000066400000000000000000000435411414271704400146170ustar00rootroot00000000000000NOTE! The GPL below is copyrighted by the Free Software Foundation, but the instance of code that it refers to (the kde programs) are copyrighted by the authors who actually wrote it. --------------------------------------------------------------------------- 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. adwaita-qt-1.4.1/LICENSE.GPL2000066400000000000000000000431031414271704400152660ustar00rootroot00000000000000 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 Lesser 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 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) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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 Lesser General Public License instead of this License. adwaita-qt-1.4.1/LICENSE.LGPL2000066400000000000000000000635061414271704400154130ustar00rootroot00000000000000 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 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! adwaita-qt-1.4.1/README.md000066400000000000000000000016421414271704400150370ustar00rootroot00000000000000adwaita-qt ========== A native style to bend Qt5/Qt6 applications to look like they belong into GNOME Shell. This style provides all four variants of GTK Adwaita theme: * Adwaita ![Widget Factory](data/screenshots/widgets-adwaita.png) * Adwaita-dark ![Widget Factory](data/screenshots/widgets-adwaita-dark.png) * HighContrast ![Widget Factory](data/screenshots/widgets-highcontrast.png) * HighContrastInverse ![Widget Factory](data/screenshots/widgets-highcontrastinverse.png) ## How to compile The project uses the standard CMake buildsystem. So for example, the whole compilation process could look like this: ``` mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr [-DUSE_QT6] .. make make install ``` ## Usage After install, you'll be able to either set the theme as your default via your DE's tools (like `systemsettings` or `qt-config`) or start your qt applications with the `-style adwaita` parameter. adwaita-qt-1.4.1/cmake/000077500000000000000000000000001414271704400146355ustar00rootroot00000000000000adwaita-qt-1.4.1/cmake/FindXCB.cmake000066400000000000000000000027401414271704400170570ustar00rootroot00000000000000# Try to find XCB on a Unix system # # This will define: # # XCB_FOUND - True if xcb is available # XCB_LIBRARIES - Link these to use xcb # XCB_INCLUDE_DIR - Include directory for xcb # XCB_DEFINITIONS - Compiler flags for using xcb # # In addition the following more fine grained variables will be defined: # # XCB_XCB_FOUND XCB_XCB_INCLUDE_DIR XCB_XCB_LIBRARIES # # Copyright (c) 2012 Fredrik Höglund # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. if (XCB_INCLUDE_DIR AND XCB_LIBRARIES) # In the cache already set(XCB_FIND_QUIETLY TRUE) endif (XCB_INCLUDE_DIR AND XCB_LIBRARIES) # Use pkg-config to get the directories and then use these values # in the FIND_PATH() and FIND_LIBRARY() calls find_package(PkgConfig) pkg_check_modules(PKG_XCB QUIET xcb) set(XCB_DEFINITIONS ${PKG_XCB_CFLAGS}) find_path(XCB_XCB_INCLUDE_DIR NAMES xcb/xcb.h HINTS ${PKG_XCB_INCLUDE_DIRS}) find_library(XCB_XCB_LIBRARIES NAMES xcb HINTS ${PKG_XCB_LIBRARY_DIRS}) set(XCB_INCLUDE_DIR ${XCB_XCB_INCLUDE_DIR}) set(XCB_LIBRARIES ${XCB_XCB_LIBRARIES}) list(REMOVE_DUPLICATES XCB_INCLUDE_DIR) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(XCB FOUND_VAR XCB_FOUND REQUIRED_VARS XCB_LIBRARIES XCB_INCLUDE_DIR ) mark_as_advanced(XCB_INCLUDE_DIR XCB_LIBRARIES) adwaita-qt-1.4.1/data/000077500000000000000000000000001414271704400144665ustar00rootroot00000000000000adwaita-qt-1.4.1/data/screenshots/000077500000000000000000000000001414271704400170265ustar00rootroot00000000000000adwaita-qt-1.4.1/data/screenshots/widgets-adwaita-dark.png000066400000000000000000013141361414271704400235420ustar00rootroot00000000000000PNG  IHDR DȑsBIT|dtEXtSoftwaregnome-screenshot> IDATxw\TWa(RAlW4inݴtS&bI76}tKD$ s Wf`^cι{{cxg #***r 0Ia'>\NH:,i$l ۗ&ɬΌ u\K0V=xb~IzyygϞΫS d~0n1 n8_nlv0a+\ ,SrJKKKKNgaiiiiifo߾Sk922rW hp8l6ANr\.y04Ș_{ 񬏏O7 a^^^>>>M$5q\W-4@UVoly{{7! l0 p8>tABўav3dpg'Cm EW DGFF>[^nWWA8f+Eͫ-90g |q2t:;V"***TTooo8 Ov_ҫ'ϒ*].aD@ |}} Èp\ԦM~~~-NS\\ĉLgϞ=6I*))0 ?w3 IIIdSYvas<fvI7H2lQQQar8zqPkF֭[\dzaPsiiP;|V}6 0 {6Ia';s$ 0+ LM߹^&s8]4Z4Z4Z4Z4Z4Z^/L<]uˬ~O?%&&+Tvvf|_u;nj>j{;\ju몑#ԩS'5m$///{xb͟9`@ƞ ۷ڱ۷ԥK_'NPNN=Kid\.IңUOk]?eСC͛7-[j̘e٭ݻw7g3a85 oM-Z[UVkΜwE]dS_$)>>^soںu{x?n߾zYx3"fSv1:z4KufBkW9x?UpDE]$0ܶEFR\\.7ԪU:t^hٲUu֝wޡ>}fUQFwӬY_w^:uHڵѠA~XáɓSN<͜i&aaJLL>>>kiӶ@ї*..j?/ВԽ{75kGT.233j,Y8ppcK/_~r:49͝\㜑#SOphz΋P4huҷE7i:Czk/} ޽՞2eV\Uw裂 Zs(((H؆3NS'OQJJJk͚5n;x7lP0$uQsq䜝իW}Xqpuɓ;c5>.<Ũ_~ z?N EYIvbsgYp DU۶m5ax5mԭ?;;GUDD+5ir*1cPfffjA ڕ׭ifUW]zJU'Nȑ#9*44T6MZ|oa .KUVPPP}]2d6MS3fC?T}u(,uUXXX͝nժ.]eVqTVMzȤ*a!Cj|4x`?~\3f㼨ryWuMEEEEUg,9N9Ie EWCKeE?Η_ $ VO<70tVVN}U/pwM7n4;=ú~Q@K.nO۵ј1}o>λXia*..n*,g:Z_nѭ/Ч~V?&%$zjۗQcٳG{U6m~U Dw}V DۭjթMfkA3akgYvv&Mz-)) r4is> @4 2X] ${޽{裏uVe%IǟUVn+y111*))$mС:77W֭wu[u۔y_TZZ|>>O]OKLLRz%zg6lp DWkV"<޽[8> oҤO?7yoV4d`ȑ#Վ$**RVPPۧ 6j޽JHnSV2fiAiڶm֯Pv>KZzu|:Ym۶Uf͔*auV=\edd觟AIj"\VXXs9rT6lԎ;<=t2IR˖-ճgIҶm~(""B11V;33SvzO\%KU QՅ+o'>(ɹB @Fԭ=g\aroK4toРAOtʜ?N;K_Vk. )))됐{.))Ѵiӫ Cm-[Ԅ 㭊RǍVx]yVcnۇ.0$}bcI4`@+mZswܩ\IRzm;v[os;nף_iV:v]=F6T ,РA#IT6lƌ0X~6mGaÆ]I:t^ %'=q뭷릛nU"v-Ic}x CKe_|宽1 ah\].WԳg҈ë\I ĉC5_÷ޚQF=Ԇ  6=zXsss4bdM爆akah j`jMTjZmߞnO!!!.],YjvvAv5iҳ5ڶmi&pk驧Ç=C*??_|=777W7S;vzV{MVZ͛V;**J"}˺?+ iժ՚0%''g-Zh؎;J* w?ݻwK*r*;TgpĈR=sJM-)))z'ݾжm[{<,sϽ7nzm=JNNr;704j(ݫש]aj_j$?NQ5m6?N#G&Վ uXx Pǎq@IϪ įƎ}TT&M1:tP߯_?ƍav-EEھ}[_ddY zjI lWw͘V.\ʪVdgg+-m:u* І*.[v˖-V@699Y]ww^w[+k=nmۺl[e\GDv޽p|ђVuGnn-ZTm۶W֭.uMA RA;,l}q{ovH}Q5oj>|Xii>NRٗ#zH*WWtQse_~J}޽~VhIZ`/=-(CWȲ_3ee}6[Y(ZM>ˬh5ڳgڵkgg7onm%)2OٳttϞ=U*E.]צi꧟܃[no{nӦbbÇuw͙>Uݻk9>;I3g֭[[}7xRRvh3 {RzCiL.Suk_9v/%Ν;m6yر4STTYSrig$m& F6lt D_uUUPP#Gh̘+/[0|nXficLݻmyYըuǞZAA}vO&???IeUǎ}Dii{ W_u@[STXXXc9rԭ~VVOgeeimՎȨмMvjSRR}{;vb4hР*s*W^o,Aֲsg\.GrO$͙3 D;]|(ھn:egg־~ ,Wj2p]`NZ]j CW|Ej?RQQ K/ eT-**gc|}}̋묐mv."k>d˖?:ӂe3p86mڬC[mnNOOÇOkݺu:vUƔOgyڵ3<{㿿5kY=S.na贴4vzŗ[o{x٬Im`~~}$1͚*66jjUۓkW_-N// u SO=YkzdM/Al6=ԓnK%&&hwOI=zВ%K> -`߿߭nQF*,,LmڴBïׯwyWچaK.ч[=?=Rp0a~ ϿМ9sڷO?yְiF6lҷhb;vJi7o^tR9N^x^CQ>#SNuS4x [?:uqnJJ6ob4mTǻݺuu-I;URRbcbb4`@k.u?z(r^e˖V͛+11TN}YÆ U``5|0=Cn n~όnVBBw]|(M4''sD}iٲVm6Ç7Uf Ifn!fS_u \.-XǎSO/`?,,L\rqks\:q~wjS=7Ymg%%%)%e>Cܸq[Oe˖W+=sÆ 2d[sgZ5ΝinA5hjjL8wA#~mn u?V׮]uտn+Ga W^_:ֺ~߿_? p[nvu IDAT}ir/E P}p}jr裏)69Z̝5k֪yfJK#υҤIuhҥ˫ѣtiڵ5o{B}rssaS?uZ׷w^vzڰa ),,͛5mt]{u7o~mHiii>n{{{'Pxx=vQQmַejϞ=5\li;77Wwq[tj˖-;Q{e˵{%%%n^7t~qT*K˭ݺ3!mݺMVբEx.@L*t8v옾-Zڹ2Ucڱ#UnN8%KTyjzʂ ,-I?3q}7[z:-Z޾=EiiUh.K;.ԝMZqlVDDK)55-@eה)ջwoMfϞS]ҕnUwq&o:tÇ]%%ę[^Nsv:9N}gjժ$TCCM*!JKKg^۷c(>>NyJOO?+ƪuJMݡk͛ϻkSNtt[*++K6mjiʔ:Te7ߜ>A‘w@" ֭[5W^V$UuxX18}E}+/n/fsNr˟P5kTV7Jej(W: paoZ:v`NOO' +7s滒-[L9NiZ#FЦij֬/2 ]wݵVZ֮]G@p޹ߜ%<ѴiSEGGn+66q .W_, m$9sJ46[U=)--՜9sSІ (9shLD[?rssu饗C a:p S5k֬Y{_]h]j_^.@cbDFFsd; E @E @E @E @E @E @U4s7*DhDhDhDhDhDhDhDhDhlNEi(t4>z1P'i0 cMs8 L<`AsǏt1M3022vu2 #ff^ ԗiE^aH*DhaJmds tyUhSh0\v-Pwh[m|E @E @E @E @E @E @E @E @E @udUa8uxbgk8׸zɯd>}vVbo>q7u)c;.oc77{:kPp]8+l W+FHzNӺ% 5ǹZG`VԤ+eӛ-xzfZ]0;KFҭJ 5nHD[Hp󸒟E*a EuWf29*mQx٦;e*< ^-} کjIӧݠSk~&έq^}F(oy]kRu m=t_T6e#Y:^bW! SNxM' ͍JKzU:v>'./(ں`_u{h:^c`qHWj:${y9p8j(IC^6q R[b A*={G7ðpaWa*/*_4g$mѽ/U(F]z ȫ҈!VA l*1O~FzajO2FӋ4 Y'߰-o~#y\yut^kJ׀U%uXsզ&R=uD͕4al~gؒc{am>G=xJgk%Ѝ?;j  0R uXQ-ڱXə۷k[kW):ۇh I^ !͞ C+RƢJT' T\.jߦB|ds(@[ RM#12PFiqK!_j3gX5{+Ðox.MšH'(}r-rHE^Gj(W]\T¹xKzFj؈`f9nkHRwRiBt꜌u *OǪ4]kT=IKŶ 0Uttt? Ȧ\wm JP>'~޴R+Ta6F-NV.~c6| IGst)7#UytgȧYzvQL8JtHv_M{rU !jlyUM2i+[diQոWw<~.J^Ffiv~W/cv{H}]/?_ -Q}OC"[aW3oq-ium{]&+O}늄0yWZYtHkg^#ugyt欹]=Ő$%sVWx hdT^])PJ8^=eO".__VQͼ!}bPi=0L.[&ձUO[b hWγsп<.utzϵi/6||gJdWo߷䰈ԋ+3Ӥv`wޫ?J e,HNB슻YM5Ιn嫊G0_nEPaюN CRɎZ|F@[uJ^٩Z~v=c'J?>L.}PS:R!m5g4U;oKu8D[({vշUD߮߭%=D:(jz|_hW~3nU ߫Ջk#* QC4G+a^n6YM])hjŜ:6 I4׻Z$@bGP!ӹCsVE=8kTArh%v g{NUx65r|3W*fݕ.j^h>&:'_NEv}oҸ'WjWv-wߵVǁ1H۹DRr+T.Qjf}h;&?uh"jײEZu> kGÆ+jmzeS=ژ_&T#4kޕ%3 SH 3 4ד_XcsAFE\JK>\fF}4N_Wяj|Пtmesd!O뭕GPQ$]&TCÚ4+U`F=9M Q+TnA҉_ىڬ >֬яk1^ݶd.?)]v+wT?-Mv,I8% ] 7%kz/F۵~ ]:OztwT`}%QQXHW%ҲuC]ːES)}> Rdv*!m:su` ςޤR}<^OͲs>;\=TXKזFcl$rC~amf*`WE3, }l?YmTv聛w;[6_N')?+]/TxZ>wa8 6SM\:U1mײm-ҞziLpQl\zsَJ{֫zBZ=BMVL+ВTzH3O7ZwSb][j'ݠѭ҉ z6k׻Ar@\U%h.8Fʯ j6OVJ&$iHKdk͜:ZkTSU20AMɱHeb-Ȑk}a:L eۜ~s(.1N뵥P-[z51~oy]뭼w_=X)+%I%\f 7>{R_7q{}n*OoX) ]6`gA/uW7EL>تe'TH?O+%IE{+W7~6-Ehj'>;3mӎLdSht5n MΪ;PvzLIf[1[N;MSp{ UA6L^29Zh MC>qٻ~y(%y~. nJR_FP!ǖkܺWT֦ ]*!ݔ]~mj٭Z\:qݤ<Ӧ6ռ|^-HJMU^GLӥS;Kܾh`vWfIOiY3_kf/_UqaS锳U}lSːyt[S8SK+T2{lcbo<~ZWɔMz)ar Z!ZN$Cr82lMR4D. &Qz5l^I2*PY]QM,/mUƁjJ(X!_?_:Uh *GjQmMT,7\- u@)7]:_~O^2#F !/IڂzkFm:R=\FF'nkE#կ}Oylݕ&І RL1WmmG `{d[E9 !ݤ[{7fFL3wH2lPzR~-IEoC\ZnĮj:뀎uQb'TA.^X9l֗C<.zc]2684-v|B6Wk})]W~4jHsbm4LaC.yUi97%oCߗU߸:M!F26l!SJgF1Zͻ'([]0K~/0c.)!6iRF@35ffsJdK*YP0B)&\ԬylL1eobwQrwW;ڢU[fYrd6 v%|PC L `0`m`c[WZim;3ǝeFz>;s{;}]I$I:EG &=qAD_H)F@a+<|jt<ϮaoX(/ Hw?AK"u Zf^{ dGsutX-z.w.l$aْskBG@l\͟˅uoa]'[M@5?ߒ = ͚ ~3٣~$ͬ&e=zl$I$I$I$I$-:{7[A1&:ɶ^zi"B)t}B=Tsv 2 \Ч"1NÂ?擷_!L ދ]:.OWC!)R#fpkÇ`&CX}l<&Dw-7D!S?EI:F9V-~ B| $wb^:6.^O>b9Nf܃,f Lp3ߤ`/~ c^?JT{g>;WAp2mlB5 3jI{q ~DOeMSq|r4~M?OԀ^Ann|腼obf*Bi~tߦOg$I$I$I$I$,0 um2}S>y̶t@1c9,I$Ylo(";yjfB-^Es6E`z=]O𺛦TOn#?u$Yf -*k9~ SՒC7R`Ӄ S @ 7u|t_\ʞ+Yy6.^ƞ>u;-)?1 adO~&pu*Ϧƻ{-ߔoX}moiS)=-,WwZoNxDFTOD3=-:w^=k` ȶx'i>jߛӋ5 ?N3$I$I$I$I$Eƍ8v!U7)Y;$=tf2nƭ{G_rgMg\m{ׯfKÞՌ:cJtef6mn dSfÄ*f6XLnGuHP3~'2F>I&6nJk+Yp۷j=/cD53QV~N+%I$I$I$I$I:0hђW=c$I$I$I$I$ C=I$I$I$I$I$I:YDK$I$I$I$I$I*[DK$I$I$I$I$I*[$}lz?5) ;_3H$I$I$I$IT,Asoҡ$I$I$I$I$I/:$I$I$I$I$IeA$I$I$I$I$IeA$I$I$I$I$IeA$I$I$I$I$IeA$I$I$I$I$IeA$I$I$I$I$IeA$I$I$I$I$IeA$I$I$I$I$I/=I {x.$I$I$I$I$LPQQg%I$I$I$I$I$} VI|xކǽy<[$I$I$I$It&1!Z$I$I$I$I$IRٲ Z$I$I$I$I$IRٲ Z$I$I$I$I$IRٲ Z$I$I$I$I$IRٲ Z$I$I$I$I$IRٲ Z$I$I$I$I$IRٲ Z$I$I$I$I$IRٲ Z$I$I$I$I$IRي$I$I$Iҙ+N6% p$I$I$8Tjb؉;@c$I$I$IgL&C&aH$I$I*\\.GGGtt:}Z-I$I$I]kk+]]]D"RTS]$I$I$='D,$I$It8D"2 |X-I$I$IM{{;TbhI$I$I'%JƂhI$I$Io,/+$I$I$d19ђ$I$I$r9bD$I$IR9+c,s< %I$I$I$I$I$- %I$I$I$I$I$- %I$I$I$I$I$- %I$I$I$I$I$w :WOޢ- h:䫧? :<|ݛlߏs<ލv{׆̺A$I$I$I$I$IɄhI$I$I$I$I$Iek$ԛ=n}lbn]1y7DB,zrϲi=NyJ*ZLǛ~5h3Iǧtx~#?x _.h [nRxfvn~TEdQy"pvZ||}onO$<_ 9I$I$I$I$I$ML$I$I$I$I$IT-!:&>(;Y]  PfPJ?O>YA8> O>S*01]ʭ+PSb&y7z!F@ss3UU:}N8L$I$I$n\?:`??}ߗH$I$IgA/$I$I$IT1 ;)PF$I$I4^\JpŒBP|}|΅|(& RbrN @(y3Sj/]LJ.{+$FP Wo@:^OD؟ ݝ  B68yf$I$I$I$I$IgP@$I$I$I$I$IN֠'D }]{ fɹ7"LF}<ܽ'L3B.b"KǛoR_sSץ~K8taD%dbBt4@oo/?<_JޗdNq 祤튊D->(\$I$I$I$I$Ig %I$I$IE$ŨYTUȶaͬ]"wp且uS.dk!ogwZ?p'󗏧PapTj- qhgXXCy-V8ao>ffWG r~1Y](鑓`! cUGHN}9/E>]$Gⲫ/fB ^7ym|w%ђ$I$I*^ݛ/%Dgeu;bXGo?l;sk y&rpsەǟ|i$!ѻ]2]1X%ܠ7JAKRt>oj;Zw@$I$ItL.cн_ bSCWO?F\}>]@[\N ]2W_=uz#w0kpH:5@$u!W^ǿOqPSy̬c';z`s/dĎc57>y7~]̯k_;ӳtI$I$Dz$I$I$I/ʈcHE Yt@z@13F_fnǧo14Y6뱽#WPw`sŏ.=L14@@אęz1h0a+ D M?}bh^ZV>Ǫ݇(d-xR7gcG$I$IT>=!:W蛡09p+n'@őH?wWw+*j G/\uu*^w02=6bBt4 2ߏhRB0۶d[sZ$I$Itػ| rq e/?T$G Ó,+=_xxVi* 38I t} ;xߒ9ܠXx,ȭ?\y: G[g/kW#h2:+ $I$I̠DK$I$I$<3by>ƣO=Kbn9SD舍o˃sN .%g-:vE^gl`r$#sd7Ť#s&z뉥Qw/ Ǒ$I$ID~>>60u-L]x o#w&?~?x@rtaQ_~<%HEw/8:>sAޮJwo!*UK4qo"wu"d 5Q ]9==GN(CI$I$-I$I$IL@ےѷ\e0kr=?e 7g?g~as7϶G-k?rpI~7K[c4\;sfKp'XYy/G~H} $I$It4^+{iK>@Oq;{¤⿿bli.P&+\1,e x])wvDhv}wG.L$I$I$,ʚ'a̼n5}'>iJk{#M.f{-/`X2kz 2L`ѱoIfΙET sY6gLY$I$I1 ~Bt184|"Heth3^ B+s}WWJͩ覕a2 /jx̾S̍(.S~!_L~ig5M{P2|raRtgr|Cٗ㚋V 7+Yq=zo az0 =YyI$I$I,s/>{xgh S_ۮ%;?}9'QFe!FǼ7]7h6zY:.7';qH5L6!hob=%iGx㪣Phc˪md*OUDeƵ4w$I$IR1!Z$I$I$8QnęK:1+LAеח"SZ~ Zϕᅢz.$EGH5?qdf@ƛkWq`tP8߀ևWf \v|INbj.oz Iv]e+|Kog!;F^ApW>8(nI$I$ zBtx{0ހܶovs0cÃT@[]jETM{%?PLJ.%N'7KT-?ݥ78gιD" @UA-q;Y ̵.`KqkL Sn C67\Spqlk\-Ʒ@U9=I$I$I:#%GWeljfOgxz4SϿi#D ,7x }186?U~&VFMTDvz䩻5 x׿}̍&sӇU+;eXf̜BC3o:$I$I7ђ$I$I$I'/OXt\4}$#aV:>ý߸o>.,~zBMf6@o&]#ƺ.Xtl=3.>,_"wof!>,{֛۟2z 揜{QN3I$I$Eƍ8v ;  ϟp}ky3>QRBrφɼhn k,aY~WC`n (&[G"Ⲙ\|ˆ{w[dP4&OxY>kB$|uUcH _G.<l;͝a2toG1yDx˼"|4a2  %E$I$I$I)/Z__?}E?~ #M'wcZnC.i6)#hcg&6nIc4Μ5 lYÊ;H3g0!Me]YfG$I$ITv @cca755m%I$I$IR*tyu O\UӴ˷Ӵl'&ieòg08I$I$Ieg #a *++\!w]]]a|q;b>VOW]J>!?RB"O} rn9^@YndZ=-} `)tׅ?<o}s fD2<%I$I$I$I$IG؛H$I$I$I$I$IiNjDRnf*y_X&S >-`7&_gw8"f"&>ry(t^ e>u]+h޼4Qb tPL%I$I$I$IbX IDAT$IvvWJ$I$I$I$I$I*k/&*%IA!LMMAҒWĪPܮЧC-+Bi^l J ٘v؛LO*>z;xY8(YI3{6._x 3Ik6ǿ-I$I$I$I$IL$I$I$I$I$IT,H$˲vplO(.pRJ>vda$I$I$I$I$IY$I$I$I$I$I0 :9g{"s8yA$I$I$I:ir]]]d2RT긾$I$Itv*BgY t:}\Z-I$I$I]]]xL&Cww7C=$I$I$Ie"Nw14X-I$I$IH:v,\n$I$I$4IRTWW,$I$I$I&QSS3Ð$I$It$I$I$I$I$I$dY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lY-I$I$I$I$I$lŇz$I$I$I$IN_;F4C$IgQ;;}M$I$I$I$ItTR$I4=!:ϓdP(w$IH<'JQ]]M,оC=̙j!q|Hiwk~)޳gϾb芊 R.$ID]]UUUE<L&͆RT+< $I$I$I)Dy:;;%I$Il׮]C=AJhhhL&CUU)l>'DCW~y#I$I$I=2̾M$IW*ڗ~H>F$I$I$I H$H$IYl6{m()II$I$I$S.. TTT`$I$I-HNR6%@y#I$I$Iv%~A-I$I$I$I$I$i[A$I$I$I$I$I$ P@$I4A (OI$I$I$Iј-I$I$I$I$I$l-I$I$IG$FEp+D =tf2tgGbTW-tޖ;}bTՏ (B/I$IAgA$I$I$INZ$=i#G.358qa9㩯 G\G(xmL/fضb /npX4_2akyrQ' I$IӖђ$I$I$I:yh A xz.f'1:E̯ O?ϖ9KkM-$4m/X|H5fM&`O$INM$NU)(\ m.rGùHb󯾀Yē)K$Ybʥ3v_Z^g⃏t6 Z$I$I$I.dҥl8׻,#89HD^ZsK7R#3o4+F1{d}G0iQd#eHK$>nΜʤ#8vZ6ajlkt.VR7z4cb7 $N( _˵SwwܽfC/sW@ӓk>33lh쯸&_XO({HgȒ$I$I$I* y3{s/*Rɸs ˖nfo2 k-W$k0u[ڙԈ#;q@V1K>kRc8w;Xz Z$I$:lB$I:5F\s)hy:7nvve%Nj8#Feı$d!ZǬySX::w*g=߽~@%,$I$I$IR?RQ3 #QPЕֽt珴Oa𑦅v[$&IWDh N F6zKEgWhɳ&QM;o`oI$u%̬9:uO>ȓk8 V4gc!O 9@0.MUEyz:h۽t;aE-ƌf{к%wu2Q[[C,ֿY|={#U3ztuÇQtwuiAsKɞHIuڙHc3nd U=غ8[rM<|2HS[_GMu%$dx4 Mg{vwtV%K-[rc6%@ $W $B $$/%!!!$@Tc1."Y͖Jھ;$dY:xgޝPKdPL_Y=Uyq@B!B!F!wqĆAFS8 Kw੓!axu[*W&l1F0YH,_@fPhXcya2i;WjGuuu*/_FVV&))#lÇ+yUՍ7áe'2َTS>Ytxm!Z51i{BmO F5v;K4ff1|4DQ#u,x%~a`;qԄ~7̤s/!%q=+7131, Gen˚Mr>,XB!B!Nʋ)df,Vm!'Oϋ7a؎RƐe]oc?ɹħe^:)_Lu,$MD5HSa5rțARt&RKRj:zB!h$% $)\Ui!V9.U'-c ;˘Džs[y}SMϜ%[hlvH ^=43pN=IǁPe] @JJ*UUU8!AFFuuԞ04qSY*hnë0Gr0xA6[߹[-i(mS'rS0֤Y$- [c=]38ili9,LbmGZX&sggqhmСS2 /b;'G1yɅw޴zͽldLD|G4y?_:~3iI8m&&<8Zyud7W XF9 3htpp*>(v: D !B!BU#quKBl E{ciǍM{;:Rj)T{ݸ:lD5غqaxp4U&"S Uq& KT24)BqQjjC>=[&3DlN6\W5}jfw]UUcKΐuKS30Z =mJ' MMIH8nxB!8DD;S`)[6ZĚw6s9&KvDV:ѓf3y_-m ЈS WG]ZW0%SWrli0 wG~/ \λ|&D)>[!ms(E;)Yt|fj*h؟Z89/gIn8i3sHTp(傕?`OeOgǗݳ5]`+ֽ68-yi#ѩFh4uW3cVX#; )?\4)7BҴ+~햑xsQ_:Ul]q7{9ϞVB!B`q:?ToWsف%9Xg ͙ ZNj&YH309B!g _=eɘf'Ep]7pe6cvz4DJ`J$ 0Tn:/ 1y 8'/IS2\[B!ij$sh:91(ݲH (al詢jJ {\{ PZ4r0nw6u < '؏Qd'|DhTEO8!d(:""'P__Ѐ=tkŬ7IFJ71AqM=ah塪M5ؚ=t+ˇk=F9G3\h9 f1=WĞ5ﲵ-1Y4 Dk$^ /|gfJ?^W;MTUQ{;wri1>s&QoFrD\ fͲkB(zx}vDm!Jb l+m=EљS9+B!B4V PՏV1$+?g_[Wd]%z4̈́jj ŊILBys.w =ll߸s==曛xG_A-\'$wuHB!Nh,ذ{.Cfc!޽ϰiD+`|b-4C{qQ=4m9tZ*B!N`p1l1ˣىO[_GU]߆ wu5F)GVub0Y6!kՄ}V5+NB\>iah@K$`15AWsX)\N^}0c6$?ujQm|T\%QhjfpRr'AJB vU46QLe ۍW Z=\'p*zV<2F XtN#a"Lz}3^pܫz<0`m&OfFu\;s9m!N!MSMX,,Bka$&139o'ҭXw~+hKÑpڊNT\s%\5 W'Rz_!B!JZ?xao$%_)xŌf=* AO0@3a2[~uW{#a t4Gnq' ButLzqB֮h DjC.y];hff͞N8LZ49ED`E8p"#xm!BCrQDGԉBulN`2pqcpIvPtOF@黫 8D+aN!]EȲjpx/t/[”D1 h+NWA E(Y ?y][㚝gv{q l'{% -2M `/xV7c &1-isY|Ű IDAT2xd~{yDf]~Oӱ#ML'{ ~l sHq?>Y_:EE !B!ĩC95 |a)?~ۜk#3gهK[c3nJ eV>)gk+}GrB89u܆BDl1aC*+Rn[G&aIY Ɓ-' \8 sd1L;hn YNN" Hl :ihuوMIL+W^h4{UV.1p¢bXɏ%:D[1 М\BB@Ȫ7Ov78躎n?ޯBtlt1w6DAbB%m!&z 4 ҌcXW-$OD%@caQeuf`}ӿœB!ĉghj&@T$u4SO8.~kJu=_ lgV8輼=)ah赯zѴ89F4H9ӕ13"rUPb7+Y C]Mֵ욛֢Ҙu1 }gC1AԴ7>F Ft.t&ꉳV>ZSQx6*}&}.~pTr/M7acjb***ZHawxp˘[xvԅB!8iX,1mQ]]3m/X~Z\;9&4@fܴ l(m-)P`IeZnw V""k.ϛE^F<6 wog{{ιhnre2مK%'e;ٰC[1dˁUS~$&dd%oU-Ld[!l bfOa چR0,"ζ&cѫ 塹`trƑf {,ُ\KKWAсWIzN!+1|~' $Njv'Mc-Ur;.V &_KD 'B}t *dB1L;;;iW]LjiHlجqV짥5%0 a-nN#?ݎѺ}>K<> 4avLFgn/^\[B! _ajٌ  E[1,2 Cw<\,i`A'"󦑓CrRWFs.CI0D+(o- Dn+غa+eљL5qGNJ)ܶ}uQPYb'0o<&l#6~uۇtޮ//!:knn7v=)$;]GiyS-IYĚTob<%Gc544R]_a8,qLL@Ck:Hi !B1n;l1icI[DrXXu8hm.7=._4?<SտM/P}jt2M~m'":yJ[մ8)R~᳿#sS{WP^G6|9;s.0~n'}˴8.u>4䤡I~2Noj SO$1\';y+?ЧҎ3)O] z?چq~/wtx{h'{<}W[>?^폮ᗣطB!Dž̔*+ok^2)Ih|ԗV0rQYRMμ,"1{q41̜Meuøȡǐ[EjdA@KmF2 ijZ|FJIB!bx<[2*F Y] g<F򤙌d[Ɔ6BrƅQZ;53nq} ijh| =]=!}}pE0.'x>Yah_QG'5O!8 vi${^ 5" 4pTe ɩ l<6 UBO@^!1ώ+b9cw.4ce.02/c5[O`\ D(';,+͌rfe?[}7"ʲ DЫ_,=w\uܘ8om=_cQZ FG =x7_7 -#(K*ƁOoS>baL2z[G(Z?m<->r. <kb'/>×nyátSÿ ;W|{ ,5n1FDuo Q% -B!N{1 EwKJJƨwQ܎Va]1RFw]l|쯤e` &)3)3g1dm_)r6F7ɜ9dDs/K㍎>X0܍ֶ82%䚀` fo +YQż y8}N}+*Zϊ3p"c6jvs*o30^_Q\'I|-<Ą[!BCFN|Q<.ܾf (` E:˼QDddqR.-%:M*q)~Gk,f&3e4̥uMC ͒B!;Pu!#{7,_xiCERF퇻h)/i\'4+3ӹADjJu+C%5I;3%1s<~"H~>~(o=~)Pi'- r'#d4[& /G׶Wn%:yyS ZFŘE(AI2&G ى:1iDqYDTBL?e jK)sLbzl'B]5!ylr'N"/&{mx6|y9N(CηȽ ;ʝz"gF/z?{+̊gϕzUJffđ pM4Yoc!@1S)>-N>ų!^c~cK~FƗ@T|tv=rq+zw%2p/t 7coB!妥"&70:()ne4fNL#EBrԑ6<͇)*,ǁZXc=5/ndY`?{GMAzSdu]8PB!hxD,Cׄf!&k ľʱ-{sdzܑB=ٗ\tfn5Sk;e ˶+/y)V&Ma&P; -Z4p1vRG޹%L4njg%mv& 6 w<{IarMrm}4L)aIWPHrB4)RLDwv̺S;hr hlaQEb7u}zcawn(yX\z.»w2W]3);7-u26-h{ۺ&lL\~8ڇ7+8R@O9_n[*fl&r.m;^k717k+owV}[*q?pӳd_}1IKgw;r)teSqYpޔh/ n11.w&.E禟HAF~OW@J 3HΫďxŤݔ߯멗[dB!IVRRƒ>ZnfGS.X04*V=,3 ⢄tq /r5߷B!ljjЎMBIxŊ٤<8.V~Zd]~bc ?V.&}hn+v*v|@Mq,qvGGk+m B1MZdLN>f})b{4̶'qZiI1Zٳf Kkẍ́5,,:(^Շ>ĆU1-]HNTut!Sc4NEG1-(F"O!iXTui!V)<9U[Xss9!1aI&#d,cwnhF[1kWYywߔGh9Zɺ3҉MĞ`λ4Qr噘5O[Ł=ȳ[(B'e~x0?_ C_W6`7s69'Q{Y9D/|zPz > u"5s=r0t~){D U3h *@ϰ 5FoͨӸEG2cx{#ʶ?w0B!>qS\\c==zgt{Nyf_p33?<˟_|oL0Z7B!Wm<ќυ˲8ZijV:<mk˻o2B}=5$}6NKP(42rur\v!8FXz6l܅ IAulkB;Ѷc6\fZ;=!TbsH]m5UU56>0t7SS]Mum7PUYEmwS-P]$ah!B1t卵;)m7XV-eaolt^uDp֗mR;ārWuZB3X1Nּ&Ͼ*bּkvd>hbIlp!B!'Fw(z8{BÔǼ@;7_7֌Q!kn`yFV7oe۞Cz8<.\q$CLn Ħ-k{^g mB>/W'y0Oՙ -T4 PA k(WWfa|_f}+B!B!I4pccc5i>vZ[p9qpkC|\4v 8q47m SU!xc"[Lh&-a *U_6 ss+w8# (E`h4<>/<0ЩS>/*\;yO$!ʎIq9ih 7mn487FF7ع;Mvb∎ j#q=HXxԎxoHs7_(Mww BNˆcjr3A.Kyp)3-1dgǣowA*jfӠC. 0=/(].SoBTd4Q D2A/f2X:u+R>_ʔ ]ԍ)|/s͜xv7r'B!N EKtOsD)-uTcAAOŌJ^{An6WM'! /ẛā?jic ޾R]W:Ǽ6fI͞93@B%ã#47߷|ə1ֽRsOnyZ!B%T(Zg!EgcL`x10< xPtq:^ݷWτ9|yQL]|y7kyC ot`'Ñ@vNӀ">ܺS4HYfzVjN{{SR[^E'SQ(48۽}op58[H`7#K) մ .bˡilZZqGyX408X+h!B!B!B!Z!Ng%: +W1ESi Ly̜]!Ј>&mzR&i6 z]XnjiciMSWKĿo= cXtŤ \}\Yw` >~hQ$[Bl\;+ ۬OpP'k?^{&~sd4 <}ϊƊJ\I3"E1ep+Ӹ}=КL.#LBI!B!N50Jձuktb/JA{xx-}oRu; Wkzt "4W_ނW!B!B!B!lah31w%j5(r4}K_Ȭ4;`6qַοUg1z~zuݩi{6~hA3:W(3fo2Ò/[ϱf|ݹ 1G{{UǓ'ٻj_VҖ|{0 Rt KD eMb_0s.\D(-?rvh_![;.fiz6%;%Y7]% "Ưhyyy| E wj% ^kd-9ݯ(uv|L.#X?䗯Du !B!͊U׺j9*o5I\+,**@{ Rk^ ''^GfgnNGAK+wx01OԬhlzzz[64fvil,֮ m*7;K[ph|)^x?M#%\Ŋe.& kT歏ԭw|[Av +8pO^\Ac݃7?f{sb ]L0:i'`P6<)3[!B!B!B!_ <77 SK<!TegͣpEiL>^{*pNNNMyX QQƿ_HLgyٹ}I3cRu}m:7\1ᘛWԯ_fүeb aN[!6gr%?ںff<2T{>,Wr_>T|'_=idLg|\}/O| C4/{Co~ȥ9\v3\R?LW'"1IV-zo-Pû~7.O ?[!B!N8'_eل(瑜{ˣȡs!kTnc,L&.u"S'n@AֿWfj$("whlvֿ6 ;cCb{| "ҧ0޺mj :~-_S `4+@<2 .e^8c0[440Nl᩻~/~,- !gt?|/?lod צB!B!B!r{S shP)wogڍֺC.|D^@^bu7y$ZB{%dGg3쮇m'O</7mOqǝ|D]J> 7ۮc2 ^mUxNlM X'5:e Y{=[>1x x5HIcnRޑǕMkx lww{ͽG8 !B!vQ4=/'/#0\4*b3p|╁ Z^3I#6&sEKakh 7˿Qѐ^+_<7:,nfe'c3p֕@5A?+&O@Qс2!N}mY=}Vs[5pW+vnji]Oz (uE[;n/0U\ŞQ|-LJ!B!B!B!B@OIdoDDDDDDDDd %} =<(?`WNK4=p B4%v&""2\mL]JW= "nocM~#""""""""SrП 1x(Úl2 1'$ol{:1C[5Z:"""3UG,L2<X,F$QhY&HׇeYAvUi XE(R(ZDk~#""""""""S43tՑUdl,?A{r+C`ykxP2$0<blۘʰZė9zw oW,wDx_;S</ !Ja9l`_:˱׬`0磧G7ߊb~#""""""""5~V{פL)oy0dh7D`Ί5-`:pc0l~3naM]ǤEj#>?==Yڵd\LKXf ka ٔ){-vݬrbY]ܷg~~k{7cQe^Z o=>科`/~M. !>پ"V? 0?u$r{ ZDDDDDDDDDDDDDDDDDdoqONg^~w7Q(YQ; 0#پٷ#r7K+?̟Y7X|_*Wmwn~\|f<c/tgYX;o~5iNE"""""""""""""""""2{1l ױ:xcvgzh"NsRɱR axٶm'͏__[)C]s&x; ?2/|oLsr}O}>ȧ9E#8 e9}t:@S ZDDDDDDDDDDDDDDDDDfܩSF"y^?p|{ܬi~ovMzrzsn٧^5ذJMb|\={8+XiVE srR{ؼa9u>nZŎC]Ħ:-Uog* \ NHk瓝2۫lL=Q0$iB914x+0tBtsK g dN&3H3-%7pǭS"1pC;^ }<+tjV0Ž7f I3pwEEDDDDDDDDDDDDDDDDdgU%_z>{yK/}xm?o V">m}ɕ~=,RǟOo.:|3{8Vϻ5~ޢ~O]ϧlvad>|n_ l_Kr~/6?>0+ccHqI<m?_1Yd g}-#?ml5 qFşsL~zM ?>9'DgL`gOw\p,@^YҚ>'_zjJ}|[xS< F MV{eb2˘ l3іkpOm,{`+mZL\ AVO8UF]w}>|H>qyf zS~?ݜdYӟy.|a?MgG;rcoc} HbSν3'}5wb}~o%ȟ|p>#M/?{[K^,.nŶf>o(,2""""""""""""r0v<& 3]'@a-cx0LR;CcWRJЙ!K8qEDDDZX6wU+qxšG>R߹?yܽ.m /`OtŲnpL'Cɖlذy#+;e mѬؙw߃ '~qdk/_2~x-?&_WjD89c?W?SM3;>?wH V%Yͽ4_w?2+ {yG82G̖bWՓ@\1\w,$h>Ίc̀8.f9xyR =ű͜Xr Kk8Na}ᜋzB'عw' """"7 DwuwEUxg/w04V-wwgm;HKL ʴUquxEt3{U;4/}u*ut?Sݻ ?Hg*)^y96~qd+f<]|omkʱ]X#ݽ:ROlsv:VS2NCX]gE?04@gg-^- 92[S ZDDDDDDDDDDDD1lE)XSࠨa=-*iJE GI;*qkavmPYQ&5α^22gխ,~^hro"!ӿw/xh|YZ~,*MAv>{12m;Cx]Gg".4^}$M_z 91ͫ.zS_2وD6B7:?>x‹o3c uGGԿ{|ι+cJd?ុ,zۻY_*V:7sQAӍ\t?"=pƎƎzsj8oGZVj=s3ߝqcF>+鋈4~ CL#@|[^ڲqCtuy8i +Hؼn 9p:ƾJ1U3+"ef9N7Hڊhظ׮f훹}a!&KNqW{=+IXe $_z X"GeFɷԞӳm.[/i,RMB8s̀{ob cӚU|,Mβr/>ޏר ro >uge2.>˗?5os_+/HBt&!ǵ`$"""""r\.^/v{~~f" V%7f:ow["Oah#\]^Nag ΂jZB'嬞Ϯ [)%2lI%2[;5TbiX|b*]i3>:>O<R^na]sԞ;ݟ|?[}7_=,9mc8K_ίx~` 'D?o|[+/OFzSA\NJj]J b㓿{?#p3Ng()76X1Nm4/`%z8ؗ;/2O_a?n`Qڅמ?Jڳ<$߀E$ S[[PSSS}5 Mt:x<8)yB!JJn'I$ bev)((kCCCq1x<\.״Ut\(_Eb}+>} 2k;5lXt[`0MJSx|N-ʎia׋ϱoZ[qXQN~#ˌ hش`;8ޟ{9:w};y;†P}yiiUssWv׋dxxxV]-`IQS\M֘EDDDnfN&aٱbou,Ѽ{7LPBGHD-r&9wח* -"""""28FFF& t2 Hc"rεxE~*\f`aM[ GɶAр! `+9L2K7O KcwqX[nHyNSk.jƺN%BccI\ϩzU'v_ms""""""2C9<0ZJxI~Q(ZdXhifO S5FAQvbD/3'C!,)+5m+ԉ!/('KSLx `L:dʆ͖+-""""7"g${ Ŵ~dFHEk{.W;NDDDDDDf9E4%Jm\nKDn>|n4ꧤ;{"g?:hu^z##V΁E)Kc'᪬kJq QcmN>[$ 2\^vn<ĉ/ \N1L( -|%w&"2X&}DDD$N0oK:^GDDDDDDf/}[:}ocM~#"""WVkY<3zbo-f9SE?g [?! PTg4O'\zLe/0DZr2 V uNׯM^S.ُ,\CRi~g<{jbXZ7㉈\EDDDDDDDDDDDdw((+ NT4C|'8=B͞rV,"xX㇎sfһCo-KaurTa:Ա►5ERDDDDf0A{hErgB8M -A3h3|Q ZDDDDDDDDDDDD5Dݴb p;]8DñI$80$#q:Ip/݉)L9}e:(.  0S(EDDDdr\EDDDDDDDDDDD*eHDHDTp,WCI{8s'[$G9;r v """""""""""""""""""""rKhKhKhKhKh{"""""""2oȂ`NvƺcYE [RlyӼtks??dSģazhknD0aNeTZ8:WԂ)^߶"A+M*gd(3hj:M(~Zm>J p&P"ׁw8um#"""""""""""""E(Œr8/^ZX."""""ryl6v{dݎ_XF¥,;gwLذd{`p)g.x`9߶j[g9&Yx6֖bHhq""""""oQm7?U饰+9(\tw7B@O'g9/NUu̩,HF9NP.<^8I 19<ح;ɰBSO+XF@jHLv'Wdeث'h~ҞJ[֗cىRḽƮu.dh?{hֱ˹uLh<{ZGd=I. 2^m|+ ?_ڏ)Zo[A˾=? 7?ȭe̽AN<1ɮwFr(""""7F%=nlldz.uKLqy1VV{$3؜%TTWQtb`_8.{rYrNBv_uk(tλ|CW2h;EsPh0==9M D`1sT3)[8CfEBJRxiZ&D ˸x G>™Py),bm(=Ǔw[H&DH&XV~wf3t:|t:ھl6s&-y~ wEp%XRAmmjKl=K cot7C ;:+W iʾphvs}#t77s6vn᱔e[`plU'&, 9-+W"F{XT[B݄veu̯/[-[d~ Kq9+X~V91VNuCq|U([~}Y`pVյiw8Pf}c{Iu_.y4ʷ\6l^J3Gmpʖ%8Hw^loƖ줉G8n Q7.% ٸ=g8^ ܸY{z&k=N@3Hz*Wyidt/¥wq ^:z ]#n%ho<ȼ%Jz inRuhYb<{jGa3x73D;)bzԍv>?r,t~,E/wBez]e,[Vű9c @`¯+yKY ;9ڗυv[*ْ=YZt1k(sgdP Yi5bs7h6S|y]vN܊TByAOdYDD" %%%^DDDf6.l$;2ϿU@U1LneBlzwp!lZVRMz,?J  o_Uڭ8Cz9w-xw^,Z>]'e}^*k xvNgzݻEl\F UTĪ2'Ɗкi^n-d2DQz{{줯D"Auuu^aŊ @s/vqJ =t>l,X>k{N_pEKpV.cIy)F8{04@*tg櫓p ਨ̞Z'ؽq:XP hk IߑHv,6׎~?! =S̈Nl {It坬q ivzI;+YW/CXNPRt60nYgRt<cyUkoV}<;.^RbguZ>Xhg[ s dG3#&O0h:L*yBJ" Lkf/wsWgךj|H%Gŀ&=y k(\ ;XvNE/Mפּs2qOc 7Mw3︇ {{'@d(eQDb]4{~~o1~ī.]۶qK Iadz8yB=ѹqRz՚ %IBw c Pd2|"""riWRi|%Ÿ ' IDAT'lE+N_oX/a"C;+  b'AZ+f(V$IG54r-g[^^;ALKQNC3z{SiPTt^X"b8DeOCЁdgXb|dyq+[5.`ca4X =>w#xB;ɺml/cɦ2L8ÑBt: ؜ߒJH\] 5t Kot^Ջ0` % E+ =e]<6?[#}-C}] Օq([Ji"S{q꡵me+؊0'&C7j"z.q=iY-P^^~P^^Ngg繱ȕ[tdM^ǭxq|i>7S=#me9Ϯ*V,>4sYXq΋K!*7Nq9ko$ z $x ϞDh&<B CB箉6s8(z^HO+G{Z9 `QZ3%kVM nt_[4-8A_ Μ8kak N27tH&G+3z6""""WfFc(x1|^;ԗET qqv>gEֺc>.U|>OyA dN^'|h7^o̲"VpBnBkthluas(9mFœldM|i<ո$M-F.""""L E CFVD I+;'Es;]t#~ϝu*t_~yc}cY)I i*ExrMu;E*w:E(5[af;IEU)6J?=钵 urfM*5ŖMy̭,ﴈ{9s4Ú)+6`_'}IJְȯm 9<;olv~>rG׾EsXQq̀@E/ĈUE^JM'/oc^k(@\NʫdlT a0t=+(,|&kV\Iˀ` [*J,wԖ1OE%E6ߟ-=lpWPdЗ QFE ]g Ml\XQZK].BϝE*ͭ!~ًo]t#ZyPg@XM,WWX0ld 18dAJ\M݈j ye'FIX2l3*Έl7{)uCÖ8W\dD p#6|k/,YL&KĴjصa'՝Br&?gxs\4&vEakśd 39/P?`3l,n }(M \=>p=H  #˿m+d&{pb#nKb UG,#nc\=l 9nFW 4v%c,܆hmk ܰokf0g|"6+v6 IIond(NLMĢaG{l֭[z!+g s۝;3 :9\<}\>:U nugZv,v(ޱ[آ3tW0=rN~$r2#+F'q<bO)ihkJEӭL2Ĩf͛LӇ)mj$y掊q k`f̛u6縹 DMi{4M># GTh5{o|%C`5cLb#^ eU7aIR>e]Jr"]#_Nj{/s.Υoē48'M,]W VV2z\4x6rٷ?e*:ݼ)g1gX,c9U3HLK#ڢ,+$z{!Y81t? !d0j,fuhsh@K)kW+@'XvSS?w:^_˧=+yoUg'cg^4JbCBb1NBhM.,?Q"3[~UCeEl`ߢ"""""u|rs":%0MYt9 ȋ0km% IK *&ٵls/Y!? uT)\9Lɉؖ{_O0hi¥, M`!%a3*ȻL0 D0N״ZDL'!CUb5l,i@qh9((;Ype y;xvC]Y~|7p/2sppǀ{HDDDDd@ W^n4vBr\4TP^rn"V] IL\7n3짹j/HV%kkүОeܲYUc\N+)I&5)__MYy~ ` >eTm_ۏF|}Uuś&)%#裡Z_Aض""""""""""r21kYfBǿ: G`Ǹ,'W^ü7~{dLؖBdǸ2m#fp326$e\c]Tw̥.RGMc'Fckl&VB ƈK9&F9 NO^OGw*NJ;LCn6\A~Q 8>)q#0(1'>{)ڰt)HdĔLIr@}%{e]:L_c5 (l5pdʴ fcP_UABnH!Fd < 333x(/oƜt){3&hNVGCmUGyņ;!XN{@S=U4O_.M|j ,#4wKpLB7~ʎ')8vGCuuο|lJ 9)h#@mM ޮnA9?/iコ_J""""rҨNɧu;v97""""""""rdesZ47;Z^疟CQAAK3f[Z QFi?pL??Υ&/o?65 dtYDcգWs*,Gsķ.3wکvM|\TI(6;8_r77~Cd]7ssl_"di39#_K]-k69m,%l**QId=F 1% j+: $GbUPvBR//1. 5xۄGUa 3s.O{=ǣXHx}Gհ^\N}lYyuhR?\! `Qek!A2>`crJ(in,_S'{B`&Kfxx>"i(y0t˺4_ DKShI|x&ݢi_>K' """""""""""""""rQEg .' qPˇÉvrOF w%-.mW`wV{eui:I3 է~<|2GXƢþMlid c a)ټh]̘ 6_ve#wtR^.,!Vj^WjZ9,XG%V8@Sm9DDDDDDDDDDDDDDDDDOX8ʆV @BE4 sMhS!~++6( RzK7B)dSX 4QDEEZgp޹1mpv1M% =8դmY b߼6o#<* ېa у(fbVS Zb-)dk_wCDDDDDDDDDDDDDDDd,D!lF"6jD#Jzk5b51#e5[6b0Ս8NM[fMf&3%1+Lj\ dbfk338XFN}T`KKB\˾<-ҋU ;wPcr-)+u\F ]kŘ->`1/kdrÄeբavgms;:ے.G3HYp3w]2jXTЮ?)?ǾHj٭0C`GN9$upvϰt0̖5Lh( Q__#Jh"""r\v;.lJ~gMh>!)6eğ (8? fcϖUﭠivTMv6JI%BTI,m5T]Nv!sOcij]^`pڹkoSa D;ji$)5".U?f:*X1jWh9̾X^Rc`JKKz}ݝɲ>ğo%r.\9KEVj}5:wHiPkaQ0`˙ȄzńQ 7h_ D_ Y-3R4] +ӆA]n.acqEZhh;BXNHfg+a 1XwmGjpt2U@ijj0 <QQQm(""W MMM466z $&&uDp\|>gI-<ǒwqzb'_Vyr3So+G80,?xŕҲ 4Xeđg@c䐽TOC{q. ҃!v._`k*_0Eح̳LԬ\ʺN ?9rVJsn1_s7@*D|13FiOd-?~$&'b f\uVjvn?eQqq?ybmaNw)d`5~ɪ.G 1Lt璯⭇WPg>RhԄf#))XEDDn'66$l6MMM-|'~= 3aǕ IDAT}q~tDRە3k~? .swo}4 .>LO'@ wpwELJuE ɋkF^n=;wN{?m>eU/^eŒ̵tF'9OhHy*/&Nv0&~Kr=ON_^όG [E. c\x]\2:M67#Ѵ/Y\.t{_!h/ǐMi=Wa[]B^0HHHp}&9a TUUzx37uQ㓧׃swOylXȾ4rF";߮5G-rx< C뉏.Hnr.U\ yR:&XAjw䍿>_J]gaTe{}Ofdb\L M^W 0ix:'ڔ W}ē?!;3aS8mXk3!-᯿-/*ǡ[\nRι*.Y8DG8TVm_5U@}oIy&#0 ӓr*^,7<˭7} 5T&4HWy7/aqozv]t-]y&3wJZQe˶zg < 333x(// ))%"""""TUU:?jjG"r4=u(`n* RQQn'--R,܃N+i7//iXbYyyyF~=ʲ,1 #GI=(dBo }3=9v8 L_euwg$ EҐ J#1ځ\OME ۷1^[ Ǒ+@Eq!|mS3&7;o%{ '#]`I>IĹWWmhVG>\tio%%%@EDDDDDDDDDDDD`%0ɭ[zDTTT`_d5޴ݛ' 7uM)[#'RGծMT Si%%ZEs6+TOum7d豫@@_"""""""" hnn&V aEsauwq1{_uWinl6[_wEDDDDS]]g}kDO CDDDDDDPm=hmMzxED5f,7_,CͫO&pXDDDDD àF1 |ϒn_as\@Kh ~?NmڦH[=y錮uHou-DnopeYڵ,:!? ڵ ˲HJJp׺nDDDDDD B+ī[7 nOD>;zx#""gie CEDDDJNN&66GQQ%%%455aYV/˲,())Gll,=,Lv|nl\ cYlni&F뉉nisq-##IUU唗2 99Yah#wcccainnpv:ϰP(粒˲p\$]фB!|>^ۍTRd㍈H腊s},T#ZDDDDd⨮@ U pxHLLTJDDXidijj zy~'{%Gcc# 455<7I8刈߉/a\_w[ͥ!__w㤠}pLL|>0l8Nzjv؈' ڲDt7mnuKDDzgXl./LhCׁF0Mz4 -|bbbEDDDDDdk=9Ql6} Y 5b""""""""2r""""""""""""""""""""""(-""""""""""""""""""""""""""""""""""""""""""o)-""""""""""""""""""""""""""""""""""""""""""o)-""""""""""""""""""""""""""""""""""""""""""o)-""""""""""""""""""""""""""""""""""""""""""o)-""""""""""""""""""""""""""""""""""""""""""o)-""""""""""""""""""""""""""""""""""""""""""o)-""""""""""""""""""""""""""""""""""""""""""o{P(D}}=>`0͋Inrft)2㍈/=zxޞlRDDDDDDNb``0HCCrt)"'x#""""""""""""Oijj0 \..KzDDDDDD>B>χ% أh=߄ 6 0zt"r,P(D0㍈ lNM e a2}$8q^#hKSSiޣEDDDDD$ex<8NijjnXM0p8#Hcv4 =~̠*:!,o<ԅ<$Ir4DDDDP(0 EDDDDD(NLL ^׋[Z7E 4q8;ވ@fG} +#g Oѳץ-+X| }Tc[vҝu(-""=֮r) -"""""2v\.p\;Zh+"4̓סzx#""""""""WUC}ȍ'fsbzR00[2=c`bzRp%fxCn'xEDD>{}G-""""""Wabwʯ"I뱡'7""""""""20,;0 F.ČI:A3cR @44M4&::8*)""N` j9tnzmD䳧jQX3c2|[L*ΌX""""O򈈈Ȁny3y4XV<I>Ma[eYIII@Kh u`[%hۈnWoV[ ORuKu-EDDCߤ"""""""""""""""""2=n;UKu;| s,="vrrr~?8T9: \z"1k(كvX4{+ػs7!ѧbUOß7ʙ79>/}?gpsHegP>a;nf =G7cv-D䵗? aKbٽ] \D8[b0$ |a^q2v 5QQ-k&~)#7[NbLd D2L"/³׽9&f0&MTa; DCxy1y?o?'/U8] UnmpJk }J&%0+Hei)UM&yȜ&}<=NE ! 8"6qbᥗwe'UYDQ ZDDDDDDDDDDDDDDDDDoQy".?wQ8;^t W̾HzFdip\v|,&&l6jG  X&mat:q:4#n7unpF{o??,G97rחr8p-7obӦbv򳣈Mүn& $p9"Upatq숟5C|+hJqɵ,H3!s;x51.ˉb0^9̸,Fgak)޺e'q4fMMVj? qKMJG4`. 5ό'{`b5 z%mz3m*rcW[ƮYi }V9ͪOd^GgRq )MȈ$bAlYu8o30e ~jjc2~S!5> ׳rVʚ#I̙9!.RvJib7lqCv IR}+>Di'}8,Mddv:In`U{5l.m3$'Ӧ2~x&IQuT|G~oI1'4mgG#*Nat~v~7p",rx[ӹ5nQ[;$w> [w/tv{K].jцa:tc<.ÀPVs?%*~98s#Y[p]`_zK\s1IJ0bfsS3孻.G 3ɗMWΰXgVmxxoB͕Tx-2!@=󯿉k!n /}W6EZs]_cvvav nޗEĿz߽m\ pE5۴b)+ln8RI֙?~1m{kyyvMax*߹络7i0W Qoy7Y2̴ٖ+KNtB 3Ԫfg{|~o{?|{͏o-R K+B,oM'3Ëmvfr"~ʒ]#6lSM ̾eKb7SN&2,df*g~?͎v|i19}xRλ,30O[Xq&C-*"mL]#u1]x8RF29HXxX;ˣ7!O(*Ljyg1kx.G}^B(R3F"0gLwYi18rgd6ݸkZN\7_Aw+m[JDļf3,u_A׷Cɛj+~J2jB3r\LHcyHo.ն ðh*%Kٶ;I̜5ȡn{wǿu۹]Wehx?²lIC:R]Q ZDDDDDk08+Ff:i@}C% Z.yrʴ[.=""""""""""2u^Ux$2=~̟8~aբ TFdFlZsZӵV|P[+Bw6gp2Mj`ȡ,o[85׎smaf5y3Xwx蘡ݗ\A9{Ӭ[!Xlłb'LE|} [mRNxmG/8| >m$0wqhԬw7yU^ F\ʏkPfPkc*}ozE%fV:-Q9rߟC-'>M̿~09+减?'&3o~/"9}_}F4m55?tn}n]o=ͦ6.ر?>MwN#u7jR~q$8h-Cߌ”\H^m}\w+:.GbuDDDDDDDDDDDDDDDDDDI|s.#)oc 88qܜm7C\rꛃ-G Ĕ$L)?UAYEb&1b<! *|wXf"s>-8',,xOhz+ˮJf߿ahpZ~Wט9o|oՀu:,r'?xǿ=a(~?^.lrzfE0,EÖy 4c' fȅ*?oOZy῰ˆeΗ/e E/ah|䓼QƌIp4Į<̯5z XLV;xWhnO>a{x|5X2B^gW7c3oLJ\~DM7NҬ2>|cufۛfDg/`vRީm;)g'̈́wyޯ{sLtm*KcL #VJp|EnfGeM&s2n,!K>`w';\;6L#ՄpR.yc7yQSwJ,b˶i_hZUs7wSqahK lfZL T6oFEڷx\˴p,YI895lټ)HCw$|[q\o?M`[,*q;P(D  &tbq:87DDDDDDDD$&U<d&y:%3w?b,KPh9"V @ buE;"99$Vyhs1 R;l"ɹ#H4 IDAT sGv64,$5= Ez +K;n7#F܌8s!i5ciY`$`xm%bp~ӳ؆bDVsng[ 9!R3H5bKس -c„cu!-X.bsrH6W֌gs9S82A&q`M&`kp m;8,6v15Ƿ bvj}- D3-b:s|+-rX@8|< _ !ҋk!"ҿYEcc#N47jٰn<q 7=DDDDDDDDO~o}}e W>Z,,?Ʋ> Z+;w͔׬:~Ck':Օ5-H$5Nɤ&J"lr+H}ӑ"\E1b?{E6p;'@(Х7PTDlFGEĆP@DEQ*i$$!e#Bz~Y9;3wf>zmFsA#(+%'|:'o|\@S]Nũ&صOXR 䑕cDE D3թ;%\*Z=q|<wO7Jn9*HZYêeptCA=vH)7 ueי;z"ej:1|GN!'+ 4^xYĺW/Թ 1Iv|dbU{>8r"[/v nZ9vl+ oKdd[{[:/&962vMq[q I֞mGdV;נDFm  BeV,l[۠ѼrNkiHU\uӟ3|LOs>%ތ])}:-1\cE|"(C#L&YYY磪*\ Zggg|}}GUUdjAAAAzO^Qc?ó]|5ڞ?6hH c÷`/Ztf.ba6l@ACP[i?V: %7w6PTɊ!SIۊ.]GbɎ|IGBIKJ*?ͺɽ{PJb\ja3ه6=G+T@v}V4n$CB,ims- O"BvlO|%P28qBi\lJvL, mA ؎j{vI8y~E@G(gDl *{?6I/:(;ǘ>4  0ėݻӣ{w|#//;kזV\ʕYFDٶ}+۶oukcZ (,,j{Fx[~į`1EEEa41kkkEa$zwlQ@vKx i0ewtH߱) I5I?nkג[o C')do_Zћ|ڈ*;{poԌj.ۖAECH^u'T$Hju_(޽Ȏݸ6_60ٰ= G1$ <&6j.E%;bx51䈻/ 2$c%ń*qimkg_k7Q@}ǘ3{[!ëQrא<0u滭IcGP@ȌG_16 4~ Ͻs7.AAAP 9DRRIIĝ8x9Q@ҵ^4ҬԊ}.$&u|u,d RA[&܋Y??٢sssEhAAAAUYEK٢K&`;E%jꝒsבjP]:<+ip  $#_1kY,:(1v# {Wt?LiH7.af|~6Wjh'OM}~qjw {#D+gֲxu"zUoT@.mdk i{Q$;?=g:s)m]Lt/M$B,9 }$ΝCfhq ʽ/œ+hZEŃ_İ3~˸7댣R|t^jJf4Y 5vEk$Nw,ԁ1B" ~wfYV58wg؝˸n5pjԑPY1u^ݐC~TI-L#dZ~'p2!  BCo(--%uq<VD0O=4!ͪd)mKz!;]'M ;2gDhR ̿!_7{4'gcXl\< eT%s1ݽ^s![[oAAAA#iym-o>ځG2D%6v̺0d^^u=ܨizPٵ5:sk2,)OS?gt^EB]DC(Il\ãZ3`:OhUk!S>qc]8ˆq..\J͗Цx9h x.ŢVd(Y^xRJ94ya&6H*BD`_dL߰zL:4@p's,G#Cp.;/J=u`JH}Hx$5Skq?$@w;4x}H9]ab27iM6}0;hR+5z~s}O=ŹRk<#h͏Tٶi_3H:>Ƽ}S酘] nNX'ݳ{݉:ZN$ {}d$}m>2&/eqR3'K~4tAp&&q5::к#[lT˹SGw *o5=*mINmh팭ZBN)?DtzuXU_[t+ߵ +mCƻ ݺRq& wXGZRyqftщ~.ؚ9w{9_kH1AAc$5 F\psXwOWś=x1/^@g-J7}K>o ^62LU(1^]y2#s4_E)w's׽%W܅6s^m!e3 !3G TOOmw1m.&q頋[yA~f;gHSn52/T.`_I/տMK eժbYq+cr/x,X%Qk֭pbz=,Zsss2m    hk/3=|w 'NqߌŰQ#_ъ6F6n$Q^2'έ^w7Ri2Nb8xY˳D}s$5*ΰ~s>8FA'OB;xziP˲۵v~.(0R_{:{@U(HGs#MX2a3'c t h]'& em=Yژ+Lןf`_P ?+RܾJLO!)}**#J y҆"N,{ӫ3q{Gٹ7b+k͝w߬;[ @Ph9mѼ76{=tꉔ 3cap{˨㓱%%頉?m) b*.!d[,z y\Y+zf k}t襼.i^Fo+S)MdUBk@&cw@mבW.[&9tㅏ&r˅Hcc7<N](J7WԀj _Y4 9SNm2N`{Eva<}_թ-vi1mW*|b}ʬ"LMgY8M1+'18VzP"̕Xr$יx7/?ei;X}sU: 톏ᕑ} v/okB~z5|Q^y^Ֆ '|9?v5=*HUs@rޗ_[tE0j%zb-ZGBɵk帎}cS?4GKQ Lz8e?"e>w=fO_K:dSO|ٲvۘ  4;;;lm4#8~|4jaz99YUڞSBCw5$1`{d%nv;Mf >Ai۩aAW53 Ї`"lu?Xy[rl7g.&/ڬhַ'M5 ǎ[~PzTJ⎿8Yi'MI*Q:7?ҔV򣷲dP D4*A ]d(; {SS:[q؅y \  F9\s]I~~>h7;AAAAхWbBjxu{-RUbY[YYyBVVy? 9g/ Bӧe콬x߅P]ө 8ǩsE\o~ SV205Uoߡ,Md3^nA4 XBAv:)II!C%qKUwJ1.bF޸j0qѐ/c_8l';9 *@˩?ei#V(lr`[JmZn勋#YOfh莍ēL)ܞ~z"u ]QKs8MيC>À׬,=˱ ES/\PJHN .9~75#wvC_8Sy/ErW>F!.6m;Jj=O83ma^ڔv׶]HX$>+י0ɯCe]v '.9.MГmh1h<͜to*v;G7x yAл;cRyrή+ڦ5G`S8 EaNsP$}9wً>3s.!-߄O+z I;XWrZO罱=B#lvB$[f }7HݚC9<Y)&ufJ"OrYkC߅&.'U$OMM$[sҮw?"}]it^Jo-bƈ`ⶳ`"YFGWsWcZJ/,I⦩ `޸[p46'1W¥iGړfY5rAAhz EdN_Uh^ YeL/d{-̨!x`rr?<Ă^ck|#+g0ˈ6_jJZk<0QC[b3>eet7j{^ϡ#+3k3f<պ\$9Ř MF;'c&$-f9C^Ĕ41vdξbs+CUUrrrPU{{{lmml۶STTDnn.HRCt    $zUZd[3UE$;/S$<@.IcS)NzE IDATޤ.H-K9LK]CP3?A|RKjsPJ29AL6nl n-5S/M-a eE%]wK¡3MIK S.M/EW:*,&!MMf_)uݪL}3Jޑ6}Gr(֙f)TRoP)s0ž{2i q/l1-{cQ+&2d_7p|2Ao̯ t}3S<,|Mf{{%?!AXc wxd\e?żYэ^¡qVAmo܃_2f N^ZU3Вa"y:#,4CS)^L)j/<<ň,|l:pW֓,쥀ouGt҆xeT$3n:R.nbKV&Я$|gX)$fMlЁg`x7/,'G0S_ꁗ@ڙLZJ +ky=?MJjz]ִ5G퐔LwH]{_G=΄x8#GiK.y>ޓu*-]ϋ2ǼG->{?p1Y?r[2+aG糯D7Y%gߧ6'/f^{cR@t1AAhhv噡#.dd(.. 77r\J$V?Bݑ0BBz[X=w|cٹ3RDJBu(;Y8}eğjt[hrtt5c}Re}ߏ}O@k$Ҩ+ɬ>N?1/N}} Q\\`@a)..޾    _`+7١NIF)>;,u5tm2Egff\|dcc f-AnJ?gIz!KC %{Hn4~5L+Nd΃3>b]AXEb̨`h$>r/!: %{+ Zzu '1'HQF5*0V,J dv˧\ܓg&2N!(EZul, נ"Z>¡җZZ BK %-R0t^fu$GtAV8\ yH4u`Y!~9^ 1~Ⱥ پp-f؍r6/bbbE麟]ի"IZ5O+CGX8FUB^U)9ڎ!im%BJ' __])\5_jc  ̦ӼC. W?v f;IEâp/Z}J^Nygm ¦kP)޷͙ 'DF@ҸITE^bPTT$;sװ&xExɠfsfgWRvt$lw{[:JK˟.N ڐdY9B    P\t%H!3 (<H~, QHq  TM%aem)7B (ًn=[;W-U$4xnTkn'縚;ҳ=&R^Β}9 *c.|z?;>j!k'wtlBޞ 4!=ؕ׏AWwZ D6=zC6 $؋v% "m{zwqDVMO,O.07B"C29*5?*9kӕ2(l]v ǝEc cĸY7knԛ7 g' Ps-Ϟs(TVrI`nL&L&,7ԠZY/GAAAAꃛ ֡ Gl RsS< 92AUqД⦵QAA*)srQT@r]OEV8ʀi0@@5Ì \p5j rɺ<23/71*9!;8h6N݀Qr&z鲕pPɾVϳGN Hh*Nڅ᚝\Ԗc1Qv.h$PUe䕠7Q䍏h4ؤGo)*;]y;)/\~s5#Z>ŵ -ᲲX[[Uw[pvEdG:<<UXFB,yMϡptr,(%3#+y9_qtv@"E4_cʏ ԋZbsExWk6& ̙4h -[<9-#z!e#}8yǣKRaLϟk[XL;١I]Ծm[bAx?NvQITjB{[oԈh|^2"scʪ(--%//NAdYF bAA)Xm4cǐ!#޷*`h^PAj.J:9+B[g1oAxۡkk5i{' pRR(  Bi qԔkD j5$#]1:IP B] p!g/}GlC&*3d'2gj X,w&^@&}`YKNd%;\e7d+̐KnV2nȤYW Ylr0)y")+xˀ!|*vQCv'ZƑޚf- u_.C*xxy#cveo"( Dprjʯ%p?Uw5<@k끇9Fv],j{-{oc Ξ9 Ch@DD[z"s\\<89;V>h!Цuy-[7@Jrj}P"JTjh$;QT5jy.g\N_O:t@>p@i,VK))J1**n._JƣY(.LJų|0/_KP7 MHں.!1\Ҷc8Z bn ohIt @ bAA$#V] AAj֐(֧`RA4Q=^pYֹ]7"־jFOcgwOƿ?{k[«Rc-T@mTy%PREkh}bn&:ǞM(RA8QjUqƳ[3m~K#{v0KA5Tz۳Qq?{g(*hbhIdPK9}? x"pu`*2>!$T)v֌:nբcPw7s.=dHH=EiݼEBvU$\FvcC י?>Ml>mD=r8uq\z ۳P}CY5=!j'16ĺP sѠi󫠶%};0֑w3$\; Tdvf5kOn|c4Iv1+5Kd;L:7ޙ?SR_*}i ']5?~SF+I)&~[L* KWrQ$[Z>Wɇf'KK_AG?%W%Oq,ٹs;;.^ F*g_&.Y;s#wUwX_VA zskV~¼0%jۂ{q7@(+g04օ2M OAAAAAQ4\ZS? M)ehOǧstgS9]jㄻ^N| %uj7g"w5 NF]&c@X`xw4×@%oB|Ɯq3 \\ib/Mr"g+72ݑs Hj QΑ`Hvh(c˃akz՞BټwY7c'ɓI-#y\=`^MtӿC%1\}$š!\oc Ԋ@:v@PPO 壷`(#yfRS^Iʜg[8ݪ+ޭ#?I迈,k:u{ҳ}~-ע1&e'|4 b2s.أ{/;qU04Y~6xt//,~][*9>c5Hz\ޘ̡-8c|c2~L ww?;*Ťş,e[JYKY#j;?xig>k⎃YIsM޴*_ JiE_'fa.O%m &Z'DǾA_~h%Gʀ|s sMQ|<;_\o1[f3-[WsOS NbND&ژ(H؉Mvˢku0y'ْBαyoϼw2`ge-Zj\OzRQ,BA '2D P,_*    4G|Ts_{f`\;nn5D/y|[X~|GPSĉԷk/cɌ+ &M#9\/gh8BTΘIJ|i;v{n1K9LǓ~iq>ǘH:Nu̙]W\u w^^۶ [:NݽLfp}j[[[;v>T@DH$f9~8iRYYy Q]]eQ^^."""2$ϳƌJDDDl; Xzk˚V|.3X ,`֭C2>O,kZu7݇f'5;G|j; /\j9eh>THJvx; 8.x#{65g<7+8۶՟%jl=W[EV[_F۹B|/߳:Їpp8fd2||d,DHN9&-eypĩ}~Mg?FJLԞ'Ysp]EDDDtXvuz9 ]v=.)@ 0mض "t:fb1rRCwW˕EDDDDDDDDDDDFE䂙V*nöRP1u.W4:o\W+""""""rn^/dN ie ѹEDDDDDDDDDDDF#E٭{|1,[}Ƿ<}X}0 EDDD./ bi(**fn~-"""""""""""2)-",;!4v*'UP7RwX.RDDDDDD<Aaa!MMMDQ|>>oDDQ à0Fd^Lh lߝBDDDDDDD$//vZ[[4aӲ,Z[[Gw""""""""""""bxWqDDDDDDDDDF)ߏƲ,, C DDDDDDDDDDDD. D0 1 X,FKK e ig L  ުkq o hd)rvd"""A_}5Z2t1""""""2uE1C""u7Sȹs8B!lۦt:DDDt:M8ƶmB$ a3X=B|VaNH۹4ML$ """2 :}5Z2$ lO z(:td,kȥöϡ)IDDDB!|>lV"DDDr,Dhmm%F!mi6஘jg⮘}pJH$Bgg'`P*d2:;;sIt:4}]ret2T$ SXX$FF.IDDDNPgޑ>.3Ho%ns2?5waa!x7/;īz_z$r +KX~;yuUT͘P Zb@\.@sz@<:gmG9rԤyz~!>y+itqvg={v續A3BW{ìͯ"mny-'[ \9EDDDDDDDDDDDDDDDD2vqMEֳvn>~-w@SfxK`\Tre4e捼VA[^ʦL ƃjNKpf=lziLP!zQ/?ǘV ~0)0_&Y\hqcv0A`4 ؝;F 1i2Wk+k_a[WMXz4*$ZulfcƸ< {f/aTM⭵[ pd|̜LeY>~EiawGXV(6V~tWdϷ~ +|-_dU9Flnu2.GW5% }NwFp&w}3| S36vzo`}t0o* ۼc?n06^~/[ռexzMeq}$o=pş<ʄ/꽽}C}Է}5ӊ=yMa|~zq77m_uNy3=af8{a%Gh| []A~}Azn_\ɵեO4-YβfN^=Kw}}#װ~QZʦ]0|ɇ@7pO~+_}Jfg]6e7-f|pw~+?i9tƞcb@װg90s佳V ôLz97ì7}WgK6>!o2/nⵧY\{bƇfp=c~ͷ9I6;NW7Ȝ2|^>|oi.f>Znc<,eLYY|ާ?%lR>kٺv9BSR5/fb|ӟ'?yC)]~Ws2sJ Ă)o3[LJ|i58xJ6O+vv'y+Ǹ28^tZ?i2cMNoaN+9=ӏa5'#_偿d_]3gu'_=^RZ@ G>%նN܃_㶱|uմfxfa )X:y,8FyW,GEvOWo;gL?ܾ.ˡU?q҇l?agܾb,}I KDDDDDDDDDDDDDDDDDDrk!cG.Sw׿e/1?Wڟg>ƽO7S|'アjcͿO&$p2ֿb2AaIa/ZnӰ?xWMQlz+ f5w{J 6&ExWn#K܅t TEǺۏ3?=m-2=Xl5ӯNގqp=DY˩7b^Z~^#s3y1W}ߤbڦ5_x; AX11pHYM_CдInyGmO-0EDDDDDDDDDDDDDDDD5@m!٭ j-gwOh/cU+y߾%7|Z?>L6`ELYpm`QQS-֝%d nǀA/>6Tpv L&N `}$ɡr*xZl}- m(6`7 v(Ph }f^u{ibc|WǍgBncdna8"?4>.q\s41N^~y(-"""""""""""""""""_VQpjh{~eyDzs燘Uj6}ﵮOQpT-0yrQhN>2mNvîpK ;8=0~. By! 6PôuMH(?AJ̝tiO(vm]_] Gv{v p /Nƾ|s0R1ZiMfNKŕ 9 ~e;yR[YmodjZ/E{R ZDDDDDDDDDDDDDDDDD.c[U|}W|XnyHeyԷĆPϬYN,YʴƎS6S!kqlWBSDu5^Θ}ۜ,,D+b` 0ab]Ab۲szy:MGm+—>w g; mE%y ^M r1S ZDDDDDDDDDDDDDDDDD._gH%7w֍\-"'Eew'XvZl::kad`xL(u0}=&v,+$h@7hn]@(Ȁ,*ۺ#&/#^*?eSmC;^ck[Yrk~#?FbmPdbwj -"""""""""rveL&FBKK DQ.!""""""""rs%)h;'s$ط0Y1*oƪG਺\rJӠk۴8Hc}l`?w>ȁwNbs;e'җ]/3ewRux g:wʄ98 䎗۶I؀YXLaqwc)HwɽpM嶏aEx5(}R ZDDDDDDDD  |\.L IwvvfgPDDDDDDDDmK.SNE*.ÄA v?yZz*VC~{!bPx?~wv_7?72էӖ}47w^b m[?/°:߳#=,O6xϽz~e:_=CSO8ˁ{Hf-)_3]#feI*i.yx9~jDzN8Z9n7>cxf$Ly Ӊ! @l&Űm4znL}ʟщDL&C8& tEU__97 WѦhg?o}-/q% PXQŔIM l:6~9?~+_ IDATuG}ZZcs35q?_?BYsXİYu??@N'7gʸeٲv 2ȅaoǝMs/mUeEzBc96C)7, ibV@#O?kW.fCFbRDDDDDD.blxxbʪrKuvَ<Nj]#4:_5, #'WG-.oFeee=رc+3PGGd0z:hGDDDDDҖf{:ڶ!//oHq:ȥr*磰pDN&D"Ё@u A:&bYa xuyi,eMH$.@p{0|l[;R"4O, XǡCGiM OڵK.i,Hx]x+rrz:;amYVOv E^^XT*E$tNDDDDDDDd,)ہh}ى F;xt qvΑ7+IkNZk.pf#DȽ,WjyJV5T9rTMV;_00˲b0et 1 `eY""ңB h"\mҡɀƶ>^>3 @vK8Q˥(Kdޕq9H}L+?'S}?|)( 5r,* -"""""rs:x^8X`08:;;p C)nT*Egg'2O" `u?O&!N{""""""""2< \q:~MpLVt. ѹE.Yw&MZ҅ŘvמYK䈜9u;A/%r"L+_~vs]\ `NNr݃.FDDDDDDF7M<9Wd23H_݁fF:Ja ݗi"hT 3Ik&Hf-ުF,mZIԼM+P]EsY;ۊrrPZFo~'wt}^o[vs9.M.DwߖT3""""""}n}8L`DB"2t7tW lre\w$!??0Fl~M+FvҙؾUJg*c?-D;!M :9C;0忿S+USzIzL-G5٣<M&NW~SǠt ZDDDDDDDDRd2Lt:M"x """"""""1Z3Y]w P芞Cvx>>?2<2y6U ̶Տ-uEKh^R^7'ݙ I D ;"g'!G&m;cf\nb,.B]zȫy',"Q6Iȥ˲j𥍝͐unО쭋I}.J+[ ( ɜvL2Ng[ ǎ`׮C$ P\m9N{r: rA&LcD'aG" #:4Ų,\.^wDFI ?c9w-.ʒMHģD476PwXB%)a;j/`8SfDiup.d+-oc69gq Oecqg3{\ L!6"g?%WǦիrlNn|U,}uT1v> s<&@?ۍ\/G8&LvGSs:&JaPhĻSFC&@4N?H~q9&dU Z`]HyDZh5Tq>;k^DDDDd4H׬S0fblIX[.0EÆ?`Pt R1e6fW Kh52@N(yyy^mYh@ DDDDDDDDDDDD.'썜apy)*`B8}^,▊1lzv-ZD"/L5%Y1Gh WGSn! Rn%TqTXgMMt^t=u;q9cJ LL"J{qꏵ1i \rƏ+Nhoxv6V0$ FXR|.Hu>^Gmc'ڐ8d}QPEx{+i0}ET8&l=Ѻ⧿Ч1\AJ*P6&559}1iuPocS2nc x,f УWPH0xrAߛ_BiHk;Z7M,:;0'1k\$G湚N n%m<}>.eu7qBFsۤjU{[|7*&nlfռx0rs3>I~^'* _{_?hT+6m9,dda!4oOԍ}+s8B!"TL&C r th4eY=ahq EDDDDDDDDDDDǥ ׶ppLOʘךY4)u#a7o'_WFԑ?.fz~д Vh6(y=KVRw]/Ķa|T^y.{@H46S%Ny\qyV=^d~#qOqqA6<} /Wq* O[Idˋ:@1w1])%xO[N~d/͞,v.l8Z01LY+K0᪕La4{O2Ev8̒= ?ύ)7)~ +AKAo'0]^%Kۅi@'2V+wҙ,gqxJ}r:īrNhR&`sYέχ.vQ5!\h6iY@Iy!|^Y4Q4w,eπL' s%)rT1ucNEw3Vt:D"i"ߏaضM4%Jr@h HSg0|c(4o>RW/cFNwP_smQRYOb\S&ұ{xsWP +Yp~X͹EX9N$ X2IU%JgqXOh|vIXqx&d:QSsp4 <ʫ&1Y׿)9uaS \7%IXc k[Y.˫4n7PGxh{ Sb8k&2U2q|\sc'6طj ,ԷIڸ%4)\ ??Î>E+n؅a%i=ZCmc; ˉIȯ!/y3Sn(R6SX{_̸ULYz3Sco{!&721{Aam-"""""ÇӰNkĂd'1ջ6l/wJ)3mr1ms%Tzʘ3g,p!7H(ԫ(bTcFv4 e7Wq4PS*)cmm?s l"e^ּʺwf6 {Ռ؉:6K'+3%d@-O>͎~tNT^MGi \&3{=h ȆJײz} ўv}"V4\(_%1pU YWjzjoAՒ\?5q3y z_UCi,nm$׷cRnv2&&l$~OsѼ@|=^[`vx`SpQj^~u{NY@޶+pYp,jWdKU˨.vA-ϭa{SWf;v7,`L,;cNv6 f~W0/~^0r 2@$ 2 q+W0QUkhLEĆ*G' `hoLN^;8N69!|c+)2ki?Ak?~{s^爣b6sʜ@ kgeٽ%ƎYtMasn χL&C,#a&irp:=,tL&C6ŶO̪+i?ᖉNv |>/g/XԶ9%wئ04o`놽DlpO;pv~^; 5~~ wac4s% sgQl^x04VW^a)y'`Ҭ*dwk]yhrmƺS67l.ǔp2s*p6=/b04h`-pLcZpNtQy>a.-Iu)c f;sh+H5 T\DDDDD.I+۸۸۹㮷Kpv(!:f1'^ڽ,-X <鬕IJ`ҕ?鳫Z~.fR2~HeH̉v\p?P[:B 4,L&C<'F[[HD"A&mL WZDDDDDDDDDDDd\lD^q.od2 8*XڃimՂOA ;̓#`1xvlgܴjfh67in6Mmm۸4;Gl<  gl/Z]+[&fFinVšd:9R C2zeP1%;ө]rm+١KnPS=$CfUbnU{Ūoa-@Ds^rul nklW{:54y5ww:w:ý ƽIR*16+*KrNR :u'̭L.תmu+=xϥ~x*;{hw+Cr:jT[ejO߉d-''I,KbВt:rp8rd3?فhh l[VPE+UܒSٵ J&sgX,Hp4$ϐT.Y%}~-jkdJN.V$ɨÖd ,InUdH*ǢXNhJvK`F(umVILRf'#ȿl _P+j$V>|u80pSuXsT4tz;[ ٥gHx۴NZ?Y~Thcsۣ(eے멼Y8ft hpV6;ZPxvfy< 󪕚(qk8;W W\qGA93|V"L! IDATpmiʚ[*5tC/{|툨튈NLsp#w0voT/ҥW-:JNdqVSF HR.?0XksJu_h\67Z>g@+ߦeo<~9UގVTɬU[?_#2r1|C}<6Ѧ‘lVx{_ף[5I ֨債jYt>ޛ^4+i)}uu2*\tuN uCƘ^'Jjgյ}e.Ĕ̶qҸ~>.ث) k9qro+G[F}Toiu3x` ӎ54rw)t^޽WK3ȜZn=jcm:Q!ECD۲ṈO.\rwW6kI2eh IVNٱZIhMZ4?A9׭ñ >N)v`bvJLO\U֨S(HŪwJv]lzU]Z<85\_7}{%V.?׹r29SNl7F.6y.V'`jf^;gh uءD޾W67#)SqCC>FgT(ْ!-URm]LM`VJokԝw6h;j]) K*{E$SnWTUCZFZ}ƻYX'o^-)헵NfYWR?b;tgx4Td- piW6 u|QlnWƖ wjT*$CQ_0$U;nT]cdԤnTmHvQXQE dZ?5{쁘EIW QCNleQmIfZܿX`hE-FKJĒGoPk͌=#Lofy*lbִi&ȧ:4)_EZυu'FFKJ$njUC^/lbH1-pGo<%,IX87jB دã\S0i_WaUW r:-IO[ry^VBa-#ϸ+Ɔڴ_iCZ-T!م>UaʖUZZ=xD$]LM΍-[笾}oIGV]Ȅا޲$G.ZR1t05`KgW;tAiu-.;sAf@g\ y]+蚛/UY JKu57pUZ4$; ݗ'!P(ܠ^[q IeE}-E;(eKFhU#Y5ZF9r\}qKC-V9vFӲe;o*vґ-"k6꺥5-U7_VR^C 0i4 F6py VE-PSpm.ȝ#+Cu)=!FjE6%De)UyIeZSOI aZz8Ciե׮Vrӫ O_+e:xʫ%~}λRsMZw277dN5=]C/mrE -UW]lԼZkv;XQm{inX` m`g síyZ|A[hѧOzyݼ"W ~% 6A]%Mym{nlvjrGkځMz+3YDW]ݦn9Xu5-iSɔ.[[›Ѳ[sz7U3XHܙ=z.YppUkުZ*1EJJ^UEʔrgbgTrYT'K'\>^\{U[;zt$)Pvu2UWEV-/Pϑ>%X)[#h}zmh6ܰR y-sr xJ!ǯpX~ rjnA69SrI!R{6Mh /}xiͫeJE*)/pnS*s/ܻF](ȅS7lQ-oZ5Ay+1rw;=?k8ъߩG3PUScXrmmi#EW̑ynyϚ G/ծG0d_?!{zE 6QA,eۢآ ډ}FkEi/٭8wXZrɄj۵pNt٢5jRS/nzBW=F;䛏^k^8_M!N9LI2eYW}x6ngxdg:U+I->}zY |/}۶T.˦LsX;'U瓏ԑ:X@MÍ0pH_}IMZ<yJ25բkv>/<vtFduեK8JC/XyyIϾخi|+z^-_ZΏWU֪_[::eؒ^{L.kV˂SOk%m⅝JxLŖ5˵!`YvI:йG'n%_+qd֮X*jM93ty˴5`ܣ[> \][O \:W |.G}S:z QԦыuɥRnusWK~©c;;%ӭPM~|^Ll2Vw8u;+fE'2w:|^'z3QcJ>|2?}{j z^vol\?Kx6HCB>R^DzуГ0l`vIRKKKWT[[;ΖӋ*(+!Sz Xny 6,FNӫBF}}JN@'3\k rR)Q?D0~G*O:U] NWŧ/FuU x2  %OiTժ& ˔]*(N*P4^5CPDp@^GYzpbq[WW$k03 HZZZ?7>\.7d`n}`wuuf@.fͨ{x2+QbZbs9OvQr6C[^u ƾ ^u%Og_ǜt0m0m0m0m0m0m0m0m0m0m9GrY\NBArYrYeILӔ`v" Qm+NG3l6`t adDf=۶fL&Άavp^*T.U(fU(T(N F9@ 0J%qEIV0ӳtt2TXT"P:V8QΎ3 p8 p8&&45Mq2NSRIe43>Ų,I"d b1Y%0T[[@ 0`0`0t:X,b>4`4x0 gb(4|@%C  l6>Y%׫ C(U>Oe)*NBJ8%I\NR LOrY\Nx`P`q4HݡC0QBAx\ T__?O0MSHDPHǕ'cim[TP4BRIdRm+p1p( iL&#i087fRX,&i$0I?a DžoR]y<Yd2B5rYlVdRe ?Ih2BGͧir9Y5i0}X\.t:-˲0m+˲,y^Ԝsʲ,qٶ} sTUUL&t:l6l6;YL@`RCᰜNɤ ¤ C8mlVbQa(':סCT,fʿ`@$~y^e2 D p8vp8yB~R<f!)ǣ`0xVolm+LJjkkeSbjkkFL&IfI DKud09UWWOu`K*r ~_*d2SRDS(IҔ50 CPHdDfrB 03s a**SV$3Pwh+00z pfS]p>y[WQ%u0y?xy<eYe2Y5ipLu) C3L_vc5f˲0Df{P mOq%&79LTf:lJOC4i@4`Ƴ]!IRTJr,Xhj+PL"=,k+96 c+0`pe }P40x%I|~ $“Lb^T0k9|ҜCLu&IVP ~_@`@4`zW.m2 cJm[\n&6^-sf~4y6">3}:eM,@ 09n i)#N˶m\.9)le(֯^y-*W=zgHkʕZLjo*1W4t( NSlɸMlgNU,dy(9ͪX,p0/M>w6ݪj\7ݡ;/x>JHիGz/壝*3fRdRdr2 DTRTR:V(R(:fW>W2TTR8sP(%Kj/ÁSb 97f7%:*pmۊFm[.K>ﬞNѶRcZqhEmRQdJ\@-Ul{uuZG}؏[h}=YKm(мDskSG@B%çU~|y-c z`Z砟58MJ :L*4MA9xκǖnR)eY9Q;̓N"<97M `}3ٺ$I---S\ >0 a))H,rLT8;4مxvKyL9k2Ը)c߾TK<:kVnqڬ׍ST>}geZ_ZCņa9F.%O~%HE0qr\.+L0 =ө`08܁!h4:%<"GbTr6o>NSS*5f҃ʶm+H #s W{PPv2հluuR*~ͻP_N.?uif.-Rz#Y+F+j}O:E0˜ס  f)ǣ\.T*^B!:x 400Pq&q00;naqR)J%4I9eYFrP`Z7$J8pݖ:?yN;㥓^E{7/ZXv.۠z6?{=Б;V|z*{׭Z^uWv$q!244`0xNkƤҸM `,}`|D"2MS\N]]]d2m~2d8 C3%YԦ:9\[$+U:lJԜfG~+G$;~甶%G*܎w-K <L244;uNkƤҸM `,}`vs݊D"*FV(:%IK <]Ѫ?;ܪj-Ur:~O¤mh\4Jxz,VY=rZKgw|jnpHGw" WaT$Q2T*RLT q;هB!]JX9'޶٦G];5P)y<OjmuXT#0 ~r8 I!UO:rHˣI)mK2z`! PUUe|>)dH$$IS9eS^ْlٖB_}#ВS7|\5$ٲ ǔɗvtV~90OlPPqd=!<4h8M=bK@@mk``@XLㆢ٬$045ݛCI99'6jAާ{~=)8hF,KTJhTx<FsY*ZpF-z?r䭌Pngi> J~_FU(NڦP( ip~0$SRi6 b9. t&YKKTs{檮mfSCCRI}}},K>0 مL*|2kjUcJiM\ ;.WАdOA`ƣC4A IDATp8,+˲ӣRRY%׫p8,0\"eݾ[[rC"W"_lC4cÊF* :rnV[M?wuYm^Bj[yZE*;tg3h`"Tk/OޱNk2IUاnJ evIRKKKKT[[;eԋb~?47o9i:tM `<}R6-WQTvP0u3SzP.jL20?7>0Kt0)|C/tNu`18]L[L[L[Ω.ñXj}=S}_T HQ5^ǾKKZ.\eO8S]taTת/ū(̨c4^/rh t{h)r^]w~PkYԼoPːN*e2#WiThKt 4,~_mEF.pBTs `ߠZRCO<6ؠ[Nute)&fW~|yl>u ;e]U 0rJޭϿq0J׵';ӫ7^ {k 5F-doPGvu].Ҫ5˵)Tv8TiyTxV.H.[^󆶾ީ1wt,krU,uxR hߤejFcFV /T-e{j__^4+КM YԖgho f浵*<7$C,[zgoՂ%MEE;cY_%-5Xzp<պBttg5Һ$C6ͭ6|{!0A>]j՛JJ>pk/Tsu羮εO苯>~]ֱҶ>ѷ7Tu>?uB或)OqW'7og>-q7#Ғ$#Do?7.U׶աgo}ږ<;߳Nk=2Nm+~oǯUiz<Ϥ/뮻cL@Y>kaqk=_[g_6_[?֮>%̗HW5@mo|Qw?=@mGֻu>x?#_jЇ^K2#?n?'WN_x%jp=Sz__mRyw?:G[)vME{8DW˰Kڹ)${`{!+nmuw1fאk;ߨe}zW/+WM]"Ϩ_g'DZ]ѯSTQ}۟[(Z uU|~:}'5_ތ\y3Z_%~4}o )^t~% 5+MU翧#gצ.աXJEïytٕk5$_|NU\&{뮻'%=nooM@٠>sp\yTPg ;5PVij-]r>|r/z[tQy%dnPWp/;~op.sޫt%-rX҃[thD#igN:SeݩP׀/%콏Rҷ薶;*?SmdJN=W PZ0diGoMk)~ͪ]pnXsAͻFr>?AwC]h;ޱR޽UfB?ohSߦo?yV:Oj|R s._җm0t+WqCޭ/}Z=5uo}^'=\| oozGsC~gt8I P?2Wn[/՟|oޥ+?y]-p/}Wҏ=ule/Իu-m/&u.iܮztdYK vܧMxnbݳcagFWv¦αf4蚍+5l^ݤg批]q~5NВT~; YJ[k&[#q†⮟[?$_׬o؅Ӗh n˰ԿyBZlevLZP덷jvys[WFW;ռJoyZ sibw*hZ:'%Ɋj_I,{zQ嬷|N_ꞇzeTx-Q+wV) -Iz7TM]ևNe6n[/˰sz:8kmSg:1:mXac+ax=C=٥L_}V{z2[Uaܯ$QsľZaGQp+~FZCqۣz`B Z/_NCv=lBV1t䙧,Z1̷}%[s淚S"?g{nu+]ܨl( {^(JӊSww>Ç[}}}J*O ӃeYfP"P,S__ŔH$400l6+bi!u5})3v=OE zu;u%:[-ɾJ fEأjhVCz㖴Q mu?z*]Z^W'QoE+܆gu1q&SK6\NCv=%yB7=;~WBzbQ;H2)mmzsRa(y2$O{[*ۭ}%[ޏx.iChu7*2aV-[rXtӊ܍t 4N~!Ð$C!)7bz EJahb۶r џQ.ClVrz 2 p>m[lVBAbqF~|^TJ.Kn[>i6Td¦d&zh [9tb RρC-O]vx[>-vNۻ 1uߦy{DkzG\eM$]`R/Z吭sݷ'ZкW(CU*ekˎ4$cPVҘhKT<)\!1w>:Nr2;ZST_lYcJlIO-˔cz< TBф`z &a|rxL&st:rp8dLsqeɲ,eEJ%EEeYy<>g7A TuF$õLe-*b0 ',P;df9|C:pi~-z?wvv_r66RyQCxӈ$▱ڨk/L 56 2OajcfHt#{O\996h-?ѷ!OّS_U^׌t5V(04$)jR&~(T#STΆr\.':izr8ST&T*)w v cvzv:r:_0Y:LX,*H(N+1T* p6p8p8rze۶ r岒ɤ٬´9t=NoӯIVcgqj=y}Li{su[W?vQzjM[7_Lҥ/Wn5\mx\Ft- +65ڄ֩w&'J*/ɖS*t_R]z-vڼͯ@[ ըAR(04T CKRT&c R) - vr SP&P((ɲ, P0T0T:V,SXT__OQ,50005 kaP((J ꫫr&t`BA REQeYEQa|grgNW.S2$\.Q;BOV8V*  z:+gΝ$ù\ jJzMY壋҆I5[ӓqKfz-6OFO4jfV{ _O<ww{ԟN=%mz6.xGQe_ӳdd˩E7ݦUBFzUdҡO͂-ýRwZUMx Ţ$ɬUuykze zVؽ{MB0B04D $gggveY"۸`L1 bB\BKO@ʑ܅$$!.#BH#!Llɖ,ےV>3?d KdKZNhVߙ|F---J$#| M* C~ Cw3 O:(|Ȅ қКڴWXZ&t$޷CX+zzن_\}r=^U*ʳc8Jo{VovO6C*;4vǝze侄MoRuQoιdeGG֏)#Z4"IV}h#@wř:s[Vճϫn(ob[jurOŇ_'qXLTJaY0{]uuuJRbcНDO7P(4f B=DOh`L@$ŵo3U'>Z:M% SwpmzA=^m[:mzGkw_X#J y2$c?:/ǯTH1=R %gpm; CJw}} ݢ8Џu܅Ghf~PN^lR]+rb +*Bf)7`JDX:O޳V+l)RRGNUUP[ꦡƄ8D"|\1[R~~Dsʽ L?JPYU]o']2 CadXLx.#,HHn Xav+J)H%c@tƸ5_VXj^[]Wd2ĕJ$qL$I|bJ&GX*uIǓJjHRh@SIiW]RQ5ؤoQ04Yf9`0LjbYV+|lΓif9˶m)''P4F茱Uʃ7e&˲(˲UPP0a]#;r2\IW pXHDTJW|D0 ݻWRW𸠠@8綄a.Fx DK]pXmmmJjmmUvv` i||2IKveYUwhI,Kb<ۖe]vKwh*>u`0MS2MSDBMMM*&;S ڶmE"ٶ-ǣ\E``E\.b1ddRgR2 fpgSɌ 0G8D"=aly<[>0\#֒C`D>mLn;>!56\lgF{SE ijnnV<W}}d!-qb.0t~sQaKKB<aΩT'nrrrC FupX`PJ$J#x5n[>OPhXy~0e;nTzUXXR)577( ) 908Ѩ:::z<OEmȬע]tZ2MS~_^wXs2T<CVvv6e #iieO2&=3r*,,T,S$"zr\=t:-۶L&{H:_ Çi#4M*HSeShTn[GirrIlۖm۲,KTJtuv\ʒuA{(0 FFJņ ǣ`08[a)++N+J ,n[~_~h80,Yx_Oh`<" z@ƨ"˥@ }Ƽ6`E E E E E E E E E E E t ˲ѡD"t:rIv) 4a8gbrm[hTdReec4My^@DD2]0%iiuvv*+i>)0vwKgghAe))) *+++%` =Ŵ(0 a͛7/%֭[{tZyyyN8;N1+H0 ~y^SeYJ&F,Kٙ. )$(vP>/%SB^^{@-@f0No8Kgg\.BnSi x w^E"2NbP)&۶Feah=nB":;;r2]2oIR8%!>eq d6N1DQI' -/}.SD"$B WLmc{L8)0 6N1$IIp%ƣ}CS)"NK<O+1=&{c\,˒$JG}.&,&,w r'%8)01N&,&,&,&,&,&,&,&,w ̘1c *T0銊FLut0a!Ikt~xAh1 =}r/W()KYZ&'{wW^~oAߍJs Uʳ5]{;OǯT 1vu.h\uW xX?5U_B+9{6}k`,ZtqwֳzyG<A #P{f/>l#­F7~8Fu:ݢG ݾΰz~[zm.~r;sL80ռ{ʝ ת.ң?~|1^>t)qQEO ިqg ShLh˴4dIo=wY5fg0`yU159=5FOLh< IF5DbCުg%k+m?{ZYfʉ_NnUm٢͕uj'x 'uڵkWףZ_{Z}M9X+kі[TY۬d U<(ugI_ee6qG/YӔt)ި7h[շ鬡P< fwl_[Y۱V)Gy VN|-׵՞jMo4cF<.3J~.s|Tԓu3urSzqgu]Z^XW tK3J4ofvW9s5$W~+^׺W<Ԇ_ŋVh2\5W:\!_~ZHs)INU^ӛ;#bWq#!>X'LQM:NhVAWʞL',?B%~9W}J(2yu΃,Zb;MYF\ nΕJ[JXNQ5ۛrgS9\s iUͶZURyK+4+]Uсt++?WASJu5jIffjz^H^#X{vWK`qLWYi)١uڵ "xf3-־}`+/e+mWzmKh kzaY~y\N5UV%Hn+-!wd/H&eD#-3OK}:"5O\Vwuk׷ 3mM̖Wݫ :?Iz]w|[zғA0/~J|#}"Э>"gtĒ%:b=zG묓 5?me_=K+5w꫟:CGuTAu˯J,͗"OETym!2=.?{r}[f;NLukn6щ0NGHEM0d Hj3}]?DtQݻiZwXݺGo\-qutw)t. ^pGNg}=!>#x}/x#y>k_).J*(ːմ؊uVRN׼9am}+тGMgӗ,ԷlV Oj]mgac39ǟtVtF=ܾSÃzB|e4ķi[cwhq'hyEoRێ7Mڗ8`E_xN^Z[h$Q7_xAo xYY!]}WFxpͷȲFf uʕsJURMת'b+X@'}W;#(}_?IV}Zk7U?M N\/oeo_tj^z^ުSKʫtiGjOMwwIP1NG/O!C#;Qp7K<ލjԜu 7̓-ȐgtūЪѺG^WucL:cTU~ڷ뺧+#tV-/iՆ'kw84lU;,c|!K ۻC:UJhVOsn̼EZBENvVVs4-3X3ׂSOWGۣz]h#'iad)Vջ=)3ҙgԩeS܅tYu"[W͝Ir+qԢ ;杵ڵMqۭ`~Ιꜰ_?i*RV -٥j&erT6TR}Y2}DPYYoeDBa8hdWcs?N?zV^S뾩+W\u_G;lK5JwLV5z9+uF_ULJO.koݦX2+>~zL:}6hKB~?袋+!Izg9u6=;L| *4kH}}.T}`\k_o(wNTc o;N%Bytm^[L|ehEyX.zb>%w6͹'SU4heC9ejzKOyMun+NѢ߭< l6Ku֪5=HtJCS,[^ЃTcm~}9L-)(zr)'ݡo|뇵 /R]|2e>|~0$9wޫڴ]Hۺunf%oH$tM7OyEk^jcj sc):(ڬ5OCbjιjy!'^s}]w2Fh.hi7SL)FHs*-)Z;{UHFVLvgNNLy^klU%e~U^yGUUna}iH$t뭷jq8Qj]vJ-9rC)=[scP/)S>gkJGcսX-2$k~mz=]A*=D 9/葵nXZs͌Ot~]_L?}%3u7+G}~D2|i!MkS}EׯMՐԶ-]UTB x=1)0TF\U߶K}߲T="GfW3BKo 57ȖddwJ MIU߬qR[kmڻMPά2$'C;jcGmN}l`57ٖQn69Lݝ{<34v! *%9 9MPI tTt᭩&I={.q>7zZyfԋOU35kfWgWUbMۦV.z!ɥ34$'Z@۪ڦNB9*ЯJeJ>9c U*HfRP1N#J>^7CdfdSuͻ;Y)G3mjqn[K2ڡ#y]>$:1N1TP^|wi[ݻkԲxe7ӧ]5BE#%Xɤ,Iᖻ\eb&Rh}hkЭl$9)V(k2IBY.]tU/WYqrA<\=] LI3ɡ;}_04hdKy92$#t_<>JC5הo+S;tVB+L9m/uݖ} ް}$Gm/ˉ !Hd?M66eH2ҧ|Pf땡m` ]tN[!VtG?,ե߸^9n}ux, Iv"Mu#.?Row7v=1N1T17[EwTkwI4-U~We lB/G5\z:}^|$O oN'O9Aѩf'cSO)lA=Lw.s)\~>B9?MpR+nAy WHPBф)1ߍ;ѷSA>;J oI'T>ǜϚUPmq\nnh5.$9JW?^=϶n! =J~;Կ/9W~Fnm_d:8g@#L] IDAT8d.쬮UL?}愶<ps]@2 L۴~[㨣3$#gN=B9n[u*5GJsθ ӆIiP4ahd_Q"ClLݡ-ݧ#D 1: qz=懵p"BUlRpjSkԑ d +_yřmtuv(# X6{DҒ# ݫ̏8x|}:jv)Ժ_nRbMjLcMڈԌ՗iC۵wW*HFXG3_*C9G/׼H]CvqI%P>rԺ1/_|ܧ;rR~y Fެ֔$ïi)֛VsclI1'B]-8gZ8C4"ȘtzzgZX#'ީNˑPvw1UUU~Bx^ϛ@7!mFbz-J9Kn~:z֌-/f[rM~&3W3Kf9.%:Fلw2q:N^Aդe%.IO? [.!WzB c09NE%V.oabr0S$E5[(ѡٶKIG2b^5ڣ\ʟP;e2T0͎kk`I2kC?~߲,9 Z<-X4Sd`j-X_?" #ex3}{ hHo>K_kVffUW?KC&Ym;-j{.ВBtƄQYYIx?:mx=zqH'mrki%^{5?4O֘xCw⎡S?aвKzVI!?UqdgFXGtj9~@wȑK|`]z?vGF2}{(k0\}¨"ɑQIG2YD8ńgdH$yjKoθ#Y]Q/)9T n+FxN9ezJcK}D-d(|ĩZbrC6wN>irz$Kp'SVjY9B璘6oެ-[d `$ɜS]Q/О=͊^eMWQTGf.YفYSZ?U:<#OEG&RrL3 v5orQdiΩhnmIH [-\|` %2,{/n;_?i"M\3cKZ mRR7GqI]>ANWn#aHrEh`9j_k}]qe:efX'/^we=`Ewǯԧ{g.)3Jrn÷ܪ֜H֚~E;6|H{Z>P Uwp-ڶ%fq Ɖ.OV9ԪkWn?}B<lPȟ㵋uGh|;}:zktÞtKT>#_aG!9e*vujڎ!ڻ}G,PTf*6B5#~N:\<͘՞7󯧵*;m==G%**$X15کvIѫ?+B *,SyaSNY^ҺʀNXxep4cƌLS__/I*++p%1+3U헑ujwhw[.cعs$iƌ}~>1a0*w*Jrڵ{fUj8M`eZ` C.wh˖Z&GHK+4oVrDTmSKT2e~Yԏro_~V:%hbrihh$dI (@9AdGWh7WAntRΈZ[KvcʟS¼,y [655*fR %IEEE}}~Ύ;ǨH$2px*huϻ#ź.8 IWt^Ͽ5C4R .R[i*E˴4$p_?&%2].pGmuqf;F;ﳩfm~n7jsPR,w>@@Es*4H9A\vB:UWVkO"!# 015TLW CE E E tβ,utt(H(Ng0Nn|>B!rh`D"D".LtZtZ Ù. `bt q Sb1gᆪ(ϷgfHr$Z15tB-z !/$! $$& tW{-YUWJڝYd&Y}}`kggz{ pwY"""A|><UUUnꈍmDDDDڔ"""""""""""""`وtwI"""9!!!{/-"""5 ~n7a( -"""tan~{$"""f*++WZDDD$<<BDDDx@HT[[ @hhh;W""""Y{""""#OvΕs1"ST/6 @q^^+DDDDGuuu8vDDDD: -DDDDG D \.\ȉl8'y*1<Z:Op;hΕHGڠ[Nj'*++&i'>J`9٘ST;y*Ǘ0jjjԹDD}(}°lDFFbY%%% qc^b,"222-u/"ߡr|1M0,ˢRhov,p>O$RWWGQQ|.K(//:BCClvy"ǞSpS9rn<~vxώ:DtVlP3#rCY>`Bd$x!E& rӑw6c iĤ͐j}'Cd4Aq}a7*HXpXĞ}Q> nq`–# πW@DHӇÚW w ƜV}+> )v ,_ NQX'ݲZ lM OmAʥ}6:ǂŰPXr`m9ѐtPDB%c(wTg`#5F g1l * .0a0[l`W:Q!Pvmm%/ <R*mKv4v<>D]v̇j/gB> F=  hhLDDDDDDDDDDDD@̖ ]w `N!=@!t6!AH|X$lyE*VO`c 2pi[X6fO,_w Do3N=a貏CmàQ0N9WC o3yEDDDDDDDCMV,0{C|rOՇ}aGֿ4 yik6H;6w ;{ikHX9Îͅ`1 t8{ cf ˎ>Jر+c5?@0!iG6c$AR7L钯 )'>s&""""""""""""rP ZDDDDDD丶kO6j`i~{!:*YBuʫʭT mcX7&ۄ & ] ѣw+ޖL[u)/54ngHGdE9FH{RثY#+:ČG~|6x=ַG&>?J1O E~v r}fG[h\DC;? qbf`M4ϴrIŔڂagNs#ZMڃ#كsصF$<5sw@I}<8 " `NNvxz ft뀜NCDDDDDDDZV1V:d{;DǏ4!4 6ꎼ7l6(1/P>4!4cQH1Lî/x2/zqzi=_|߽8kŦ6" ΂oa"XTaf@VM*UC$8 "Zq%V vpׁXv q$ZDDDDDDDDDU9n~ʶյw9".PnaYx !""];!"""""""zy*: Gy>/ X䩐a¦:2jCoOr=*> Cl3Z_vEDDDDDDDDD&Pζ5Yzy4tT^7e5l,1""r8!ZDDDDDDDg>y C`3PZ}u2P$l߹a`E`3vlt5 (B ^ů[R.o m`wNۃwlvo_zCX_Ђ@ CoBYmp!dÂʯ`ga+Ix >hB-X`1k =4R6AiDب-/d명,XGU َ֕qJO$j 7.fU6ZMcѿ;N;Vl8əוOٶMCAjE3lw#`2]1$u5nJ ز~ri\E~݈ VS#tz'axA IDATٜ[j\ys$>'{:D EOz~԰@a+]ՇGuc,H!.2\55͎u碃،l Cׄh\JJ6t6lÔ.]7Ĥg@u~VRrP ZDDDDDDDOb`0I(<+ l'З (/gwHS7aݰs?BG?Bz DDB? ? ?ʱ ç+`oa=;v^=;=&O] !t$L#@L"@JXЇ"""""""""2"29;^DMfX; 4r=hq#rY?]#=00F(u*/f 9mM$#ҤɖyWd~&۹֟_ȠN^ૼ:B2Go0ů];>[K݇%׈Mh/sx+~Z\>]Tr@ǹwǵ?J# r=+@(n(9k<GLwǯ/+}f2z<4k]bo 7NFH_}^ۈcq%Ip4Y_}MgG2 *b Ƥ̏@fOy[Q!f,C/;.G|-?&<b&SIa;y1TD?>yb&q=r5__E`Ͼ:=Ø}.?\h%[zHc8++k:O9\t~ I:Vm ̳oͣ!6|_Oa|}ywn"""""""r+a0τяBQ !eD7|gA"XG(, n۰Ѐ@H $ܳ +Z}{$H0@|`[ !uǁ3h9 v K!! G4z>USh}A\³f[(7b5&wJ]mj2r$X6VaK'jO0L_3s~:* `i'ѷT"nw7ݎ+Xy NQ9Wa[!e?z%כּy!uny <{ 91V67e[vSc#cDN֕=ǸY3?=5-sdyD8@HU7ªf5>OÎ o7F¬H0urXGo^L/To|0} aPW efǴZDxe/ٟ-hA 3B :v@m}DDDDDDDDD .N 1ㅻxm"O>q^n9Wrϥ /]m{dà]ξ{~g^?Ll=E}1wr@XFI(5nl<+$m$Q.!)8 =r &paԼCz:݆f{sY7t=w=_~S{s1Wozǫfɜ;>3P ?F״h[hl&k?ݾtns\Ǐny<:u yw:?:y3d o- ︜Ax涧o㝏g|t &y "^gǶ~˝/ͤpT'2pӝgRGpe3aT!^?wQk/x|HFg-oG8Ǭ},^/oy$| fbʲ16aCWcP<ПXX(6S/ygʵ37UƂ„s:)[+/.-*d|fAFȟ ;AЍ*x!V C+ j@cn9 -"""""""""cn؍>kY?9XXe8y|,˻?F04E% <_ P7u)g {2P1ןo04@;MےtI*_kZYTe;dͶ>:Vf{O|w|AQ'lԾi&l3~(<0 f]+ΖFT˽:B7xuMüzw:0csvXv9~kUk|m&r7!8q`b[])m;PȌi pA:<9VkA|Fr>m48F<aQoUR3a3$)&XY4[ϳn5&--sQAݛ6Tc߻&XZƙ}RIXIbJ6D(ܑG\UM՞6MZTUVo!$6lzv5ė\Vȴ4ͅ @`,Y3̬(F y|?s>.c0A{@>; ZU]k&뫢p`P{h7'4葞宣٩ha.{SgN7lo6lcu^&qO3˶lr)0Oʌτ39sHt#96iyL&`EDi4fsўAߞv ,l7;Gna, I&9ƀplE:EDDDDDD:"uAdT$`y(kiUNt/AUe5&ѱ1伻26 .`z 0Z xA:֯oYVj[EEYy3KyY.@.vqoV9sE o-5uy#2O<91 ,?2J=xLJlj.:c jIWrIS'!.cx"RÆsif__kɞrPrwCך ~vu(^;braChl]GLɃSvjUDDDDDDDDDDDDDD 5M`" XAEV*>wl?H,[77ۉ3&p.xN;!9Y ׍x}ǜO>x;_Gqʹ̓=V`ϱ48h2KÄ#0 _Vʁ k)ZY W<}F&3ELYx+@۾0LBB;n.&PNI ;D t؈O;;teYcƐof<&`++Pbdm9;yr,̉V-K(/~SIt\4&E yK) @7[ݱr"H D\ b#O!'֠l|$6s< *\G_D1{N揯_F`Zhğ>w\X˧Fӯ֫";ɅpuosWaN"օA#30-WEE.ϢźHdQ@6> A3! ͭ8EuI` $b@=mX,7$7m ª-fx~eQ t\>Pp y 7pSnz}66sE\ؐyD~ fk/|+7^~1o,+0pLHaDwh2"L,nV!pO17UN\qtѣn@bޛe>W榱$71q=J+Xz%~p!5mtr&7:f8ݲG2Slg5+Bhv67A Mj\$@5Yp9߰I\Z){~ӣ=\5KC+b vnf8.ڎ2eٳ+I188ܕKX;b3pGMz, 1"]bp YXVj5Y'#g(ٽaWYKYb͔oЫG  ;(~!5e;ِ_T9etAić*ΚY꠿؎z1]C)gwN *|-l:HHI$.*P#.h.vW;" 1)428#r௦:8$[]A| k3{x,1aфߜbHH0ڊbL\GD]$QSUFQ. Ѯ߈3PC͆".!Fj)5Z>./m %:&S^JDDbXj*Q访ڭYvRCD++(]DIeX޴ͥc&sfg U {PGk}'y!fVvdH=[@uqb#L6+gYD02rrNJKDDDDDDDDDDDD[O.z\B^f=q>~YͶG]'x{FVFGϬ,cV-ۦ=sa[9Sxq<{HMw.`׆5l+q]NR÷xDlSJGͯO-a]:(pg Θ  ok3sQT^CMj,A9 Pn*ONuXo؇I< >8?y䯜S>_~V; 8QDqaWČ,=H?u4Gmfo$幇8W:?Lz+kn{h4I=zѳ[ !E5]?/?Zw&jռUu-W.O:]7G3j xmr5oɫL8LJaPǚ7HF$n&K+R᣸;iG/y'NC[ډ6râ6.o={JR=uwgl4 ~ ~ӛ{_ o 幺7_OsqwU[^奷aU3Sx3}coxW-eiH}9wr>Y v=E;Lǵ(Y1-f:p\#dn}:|xκ{.JcHXs?eY -"xLb%2e8zG;q.z/-OMݢ)\R?.~s^W剿-mϷ#eu!gw@ g3c.j9+COJ(.j)]̜1I4z8-kzN:QV7}Ga#@5X>*y)lB6Hl>`["z&El1!{ IDAT$g<"'#s%0N]?,N瞿q9z|@y}[r4F1$_}I^qHH:-j3bUO@[T: O[Ա{|Ӽ 2S&pj êc'j-v>_]5 RwH"f}\NJFX5Y>u_u{\+YZ[DDDDDDDDDDD3[(Z=7^:> }~r=ZJۯ>\EQ5a rqjV]2%sVC9̚9;wOu>ѩ|߯8mD2BK?w;N'KuQMxsyfx~'$eV˧oi‹\цm5u+HK8dVox) 4;B-<ͻq=0*Xj Y_|؇hIjV]Q2BN֏QFP[}$n羫N&-*a{}g#g aN؛]RI0dɑ^P"1e ڢpr鑘EvWU[;1x`CF!YD$p6p0V*;66y/O2XjwRiC8i =d^A/|F8n{nNMC] kg~Ǽ E:3dƟwu]7Lh y+Ɋj; gʭǒ6d2BS\J-"w|3Q`Բm޿~Nod%N"⺐7";ܻ›1IUYi'EZka47qYN,jC7~<:?]|7Dv0I>n^cS??%?f:o@Թ)ܼw4{#HލXñ)MyT]{yosGm)ov~W}7ŕ?z|xSxZt|Md`^JcUn5`湗9oМwIϤox"]~KvqFؠU_ƤbC;ƇI`p0v]""gYǹ$ GXVM);7eC~U}k9˹hyݛ[MFj< oU9Ey[ٲ>-*;$3@jo ˊt>G!ڿy+.G\b}V[zY"J?!ә5,|뗱H:-|M{|}t6>}3;g7pJ<x}o\/>8d(a]NV4x־o+K-8]>8>vW^K?TbYe,"u լ5,33傺pw|un@!!((],g9zw< z<~^Ί"HI!$WHo 4xw>.ϒ׹燔90(E꧗d{M;{|?0W\UmTv%HBBy{v3b@SR?py70Av6~=y ?<-HpHzo VtTlbme!1[4:X"f"4P҂T'kQz$E` `Nv>ipcY~m᳢0^[< ^/T G^tK!w"UQW-* +Z\7&t'$e.'M!DoG K-vqq@JVjeRZT |I F"B E{soTG3ͽP t:F-I!B!B!BLToYG}} EOSk,CCFF[QwP2lamX\֖WMka:: Qp {;5bMqL AWif́hldur^L6 "MM䫸(i*Y̬vGAy&5xLPya©}K?bٳ3獇$#Еw04jg'(̞Ch?LЕs<džzq53%s8yvg<ǝ"< EӦ58 C؛˨:6s"oԯI8Pb^+v'  e0( `oX? g.7M+~/xO˻ʛo)OtEwǼDuRv04*&_8M;#w7PYjP;E?).C fC]OsnAimn${1h42pkɤyn\[-3Lz]yDcHIEGU5}UД#N(7'e5Uq?S~\WS`l~(da?^ˮK>ޘVqA}_SNO4R}o4Q 4@5r])+p3j^,/⸎x:Hqo/ͣ僗`itꤳSwնb\q:޻7\<^6rB!B!B!0zHYq[[/>!.Ħ4<ӲǚY0.6o9;0 21?a!gMChQ4P$d%X_TRܠ7J7zV4љi* L&@]<ΜcLmtڮ G~:QX4P2J\QԗҪR %S< nh(:M`.zG8 Ժb#}uK.Gw4ô瀲QϚo>e[äZKNOGFKs *Mtjo9 wUb>J.^\67TvzppuPvճGKPIFGk {O7]6veܽ0jP͂j̘84L0dtu-}!V=}]pC}WFw_VT==TW)?|~X>NJ]U)Tߟ0r[^҉faiN#'Yr`yӘC~if7b;p샇00K @w~xHE!B!]zKB!B Z !Ebs93ҏĬtN`VAM5@Ys.sXR-|c2YSД.a@E: 2,c'sauP5>ܱ/ F3y-Z(h)W*ƬtOt:/Q'?>(n\#xurz2>gxZk֜y /

%"m_~mDv>ؤav3O3n{{t ^zِ?#^!B!B!BWB! Dc#?{ IFB3bU9}qĦJ OKRIzF65?hgkŪ]#08VA:K464a?0 Wil{[hAծwso=9:*Xi>} 0ƜX|,"frU XǏDj~L|4Eg~nxڮkZd"8$P- jlq!ǚ(gP]\JJG &,X❯٩kAF5CCzq4PpP=!pBuY4 퉆\ o/0NWB!B!B!B!d +iӳJ6AW[wP r6hgLczV:MȮ{]QIXvBBZim:@sL/$}Fj_=j(ekQ/ qz1MK5_՛{ hxL`0w7EiBAŖ9M> (tB҈pudS>`9N+x&" Øykz]}5?B=jzBCH@Y)/$gjrEԼr4KX::iiqZ5k{á = 7 w7zZ)\׫T~i&S1(젲=1K71FG9%uJKt|\i^X4 !B!B!B!BO[M5SisO%l6[ƾ-v{; ܜöWVMp8': *IXxYcŽ{LsK\0/yPQX'BGhT]Vxk;9k &ýʆ/P~ :qu I 9-F(T7 h++0őd58ÃEqYomy#&䀽_ޚR*$&Rue48S8S#vFos5j4VQݥ@c b̀VSdCSzmh }5 I{9+B|5PT Ca&) AafEkn6@epk-Y~(7go/ !hb^`"E"#2 Pر@B!B!B!B!EljDd|494 L1Llgo{DR-n0&pΒk92r`Нqsq _So{y8zR¤.?_6NP|u@{I=հ'sɃ;Q\͝05IJgWoy):il 'aFa/gp:*ٺ͊B'jE6sб-GrퟮdOxGG@t͜3X&3.AW4j=5[zQ fax;s.kfc쫸8LYi eL%l9 x^J+:QhLʹxO4 JqUElڂ ߤ9zfNfoB2$F%WݴdJfbP?c"8bF4743ᐹ@RW@c$hon@cr?c}7vbt rpв-M I=Sbprp7qS&u7Q|X5ǜįN8ֳzpmFw|߃H=4xE#3X?~pܾB!٩-KGJNT1Z)k[!B!B!BQ'p룏[8!jlz1-i~ wirXz(o|e3zM1.ζ)?@ uک5GsH/!)sR4Zh벡LxxŤa4o"d'H}6c C*VJPm]͚I!((No̓0ooߞܘ`&>IR]˖ߵ 9]qz"u,L%[-kK~,h\o-^'&!0괷Va*^^̞Yb;N<p45Iĥ".m |RhLJ tw6"IuI}Y/=$o_g`P_7UqUsҴpBW.~Oʪ^#t>r)5D@9($zX Ƽ+EǶ|eaq[͎v af4RڒBf`sI;ڌvJV~JKm:Yi"0‹AkGMUTT>rSS'⏷ҕ4iqyS6o`ca=jCדkҧ(LH*:.H&,֗/=4l4cQNUHAx8u[{ E9Tʰ_ǰ(k>(;5[ս $ְ/kop]xϾܭƓIh3B|CuՏD,>>zA~饗Jgڴ5!heqS%bwUW{OOABC;bvw!B{1 pw@tȩ<1%=}1(+٢ ݟhZ* [#|IS]PI 2Lz ?WTv=?Ow;m,xG׀ Gkɒ[ҥ9{PSSS !Pnp5E3T4E\ ٵwP[Cxa6?=%lj,V*rP1E̾Zo[it@0ikV꥽і1ֺjZGuI>+jxϿ]'&,? Z*){x!muSHFi8ve`tr^AO0!xV锛[Bh!B!B!BJEH#:j(RO/[i1zZ- ht_Y2;-PoΆ26N P&LŃnKJut $f312_7; l]#9mhCtߜwT(lMmD"B 8Gysmc[E=6^!1df`FSvj;^&o&B!B!B!B!B)_%[ V*߽+AE=ȍ'sۃMIi.e8~|Ωӂ0 F[=wd]p3K.C(ϹX{X w"wUmşOQpg>C_teO2w'Eq/R2-qia>=;Xƣ,}n ;zWqsmx~\g\}[5B=O\M_wr$L=o?ypW͋a0}kxh}"'T yv)O2o1\G׶Ck;|v,W>n<> r}a+5:Aɇpaύn[wg=~mi[#[[wm ga0;/vlBs&{[)Z-7Wd|JܑW(\4ֱ ^b23'հJv2hmp  _=D|C0z;h)p[5mH zv-efW( !B!B!B!NܙK{ۭY˴$O` îS`p#S+ /k|RBpMwv vK]QOJGX<ُBgpg ֔flO\t-{/y~X%r5"O[nGz+ӹ{9gR:LV_*e|u<łQE|#,-D4r24:Νu⿯'#7%rw9,]ՎR-c 931Y}{*͒ԱѫbF=Utǟ. >μcv%Ž|7(aa%7hz߳lUO^euqϙ3Wq?13gѽMn?Xkѽ˯͏qQI{bV\4[Z;LzEkK3h5gqw?#$$Ι l)ps\ x[x&kxWE3?rd/hY3WK\}]Fij\T09J>G艣kyvHZtil:V~%~)-_| C !~l-Tmp[]B!B!B!Bqɹ)' TJT%=c>`yahE[s<zW"NOuhG ae«SLYaDz[IA[i,ι`:>AKY[h3I,)'sRڀG;_æ`1'E3gyfp?~oЃ9#ܽs~gc,UOwjV8 CvOu?yY{ ksXtB&Aah|w+FEKy C[=9DfS=Y09hX:# )w0"ZiiU3u\݆W۔#/>Dl}zQ[aӂ8tT,ǏT ͦ[iXRHu:FʨO~dpvW!ehOsK;}OгϾ(a7_6gbug|ݗ2e9ڵעT9ːl-b߀@G Z4pbAl{)_|uB'n\Fw|EZoj7$d!;B!B!B!B!H#4i~:BrH2E'箁Na~%LԉJŝ"vQ[I+执ԥ*  /oWv}66Q,j4@) 8!ztB#0Q16s"&PXM1p.z6^hjw_ּ㘳$94yn/f2 _?_t<.@TlH&`l+d𱭘6TxuikyENMu(?'-T,%5_tO§qg]…G7"~w | |6F?_LsAf-YeaQRR eWs8pK?h^VuUb׵J4sP0: y/4Bq5o:$;ZyFZF 0GA,&mlGaR{-G}=¾LB!B!B!B!BOQ4Rg̚?"Jh^e&Gfʶb]3ؑ5/kCif2/Q4PofNetv |jl2l/f6 Y3M_qN:hnx;?͋ 8FGzP:*Q4b1IV)xEOj:\]K h42^>h-J4TfgyΓYS:DX7p|W7rM?H\ D !B!B!B!B!ƕkt4/=i1=p%ǦkLk{Z-.WDt;Ko>>{u_̒ߟLܸ$0`5@G*lNz'by@@!B!B!B!B1=Ɲ˳q)L*ndGKHC>۵gߓyfu z[7Sku'49L }|-㙪51ŜsZMѶRjƃ)dF⭃3z綿ل̸^^mմЍߠH16?gT bf. c98^kCKyO>17//gr;= Ȅ0P) HTԻ}N [I]tϞx%ۨlbyHuE8]׏ʣ87>| vԿw mtLB!B!B!B!B|+WK?Xk7rM{P\BzDžzH8};atױgۿ?:=_o$dv1Ί?nMlud7~n޺+eñaD$2eFuyXomΗje7qgE1/`|,nhnA]U,7d/OÄ2$  [k9V}ϗ_\ ;n]NƄq5iT ]d?Rf(;ȇtodT3={o7 'Q}/q珤}1l|pMXkOJp\y+> (>>Rq\w,~;Sh~'7T ?;<{wSOe3gj]ul^)C" 0 /,dfL(ICITOV/Vcނsyt̟1P?N-U{:6o kkko6~wՖo9<O `#< ĸCx)Z˪[iAtzozSSe9l7AdRW$I饪dW屩ڿ1pƦѫgW\Z*K7QφzvnGܽq;,ټa k6S*Ļb8Խ/]c ,/FCpeзw*lԕo$o *v=*}҈0ݼeKҚD-/=ń4_ů![g4g5cb \7G՗vҽPך9ړ^ĸl)+ZO^^m هtӍlu`Æ """""""""""""""""T`~ϠY dc>+ė շM+"/+ ×6m+YYd"}E`3_~([V|:@ML|4=MD,_ oG7RD:""""""""""""" /C.1 Α'gS3{#EDDDD#V˾eݎ)!oQ y:%"'Q ZDDڅnli%l~=D=4EDDDDD`|{}|V)Ic{JgגV>-y[UņjտP ZDDڅQWWGXXXG7GDZ:[pr|"ұ~Hz QP f5dv<1?.WۍO^ jh xFEDn#$$$(UeEcn x~e"{-ߏ`BDDDDDDڛ_|cFRD95Rх>#5[Cia,`yj?$zDmjEteLD*JؐkRteiӕHl%fRWQe󙿤]6\t7SwԖllŁ"""""""є6vaو*nB"{J,"""󙦉墶Vo烈tO)%U 0\@YF\xDOm7v8W3yחxz{o}sx;V lD1k$9w<7XʿffVvhN8tɟT~rk kr΍Ws8ޖuQ+>|i c(i"""&""Gmm-8NNSMg/#rڟ. O}}=.Bl @ @HH."""""""-%m l?U^͔ NGHF縫/N2$؛lx)]1sW̃':+="+EYi3WˍcSpROY̜39Б~$W=x7~{ȅΉN÷|Dz8Q']]Bs)-""*&&Nee%!"GhpOr) -"""""W/j%Toh*~;'pzj;oྫFi'YTO9,FMӦp#)!Lm#2-?Ҡfl !"fpIfY?ya />JBɔBaوf4M:"""""""".{6ɲ_LS9˛ɏN%#=$%Gߡ 7_i˨kຕ|M'C\ٛ~fPLpM_&넵#{6o2la#&`1)s`ϪS3h'\|0IS+^o{E-Isu_ڏ&c_;i Q0|axt.[wv,[Vǟ3wgid3؃Я{݄:LL0혀mм@oO_񧥓pMb[v^ Q17NxA:I9&뗻1Odgw!2`^vb' f4;4;mb6p J6E>ݵ6R8m+.#*L5ҁڠŌ[#p4~ uKl.V(Hrx6dEaft(EDDDClnɷ/w Aba}5S{џlݏ3=`Y~*(o@bT& /߸7qD%㐓qI`jټb.ӿ}߃Q&QQűױq-;ҽ5SYFNR2*(-"" ӆvto]f' s_"A1\ppL?g3Jjj4ɞ}.S';מ}-AgqI8-_13z tmS &wf2n|{z) t$EDDDDDDDDDDDD[ 6,X硇8Wc~1s?[DpM 1sό%5Nd$<7~=>wf4?vEB8h:n5ۮ-(e,g)oA¦c;;4Q&KDD }Nᜃ>"6| y7寂UO]y9~wp2/WHSa#}p6q&rO#o_\ EDDDDDDDDDDDDvy%7&WWmUV,P)΢gjgb#B1}Քey,isBfJ$F면:CzB}Z8kAhbF@D7FfrEExvɽmǝsI>})߶>5BIA-ZM^q+љȐz˪(R36]Ɇ,yp&ou۬t 8zDuȡĺTmd/i&<ѹgvli-n$n6U[: Sf=)ϛ/k*Z뷕#1gܡuԔ eSPmsL׈cLj w_6"rWrgHfظiؼtz$aԗZ+m1\$vO'.AF\sէ/XMwkwm9L“z3p@&qDk19 .b]OkWb722Hp3}:, PnZBd7(-"""""""""""""[Y'KNrY=[}u{O.|Wg##83,lgc-7^68{꽌reA 1#dҥ= WIY V~ =9ySp~ͤS"暻Bʚ8/-҈eystri' |ƺfWض3G26Ek#O4$,V> rr'/ƶXK|˪=˟|qIc s7 .dTRHs>z0ihwv.;<}keQ^gǶl)o/%&N|Y21FwGeUf֝ySTy䙳)Øiq~ k&_sӣq0 ,kx ylt;q2<OJ3:X@Ηox 8?ڼ%&F2b+ ~o raaafh#f ]AgӘ? ܙa. l\.;$)L+υU峅GKgo_va_bN̽.2ܙtE*_쏬bzN7'}][U;Nd+qbV-֏3 =fT2\|77uSF8qfO[HѶv sha 9;a4遍,nŦޝAHqOSTKHBF:lZ{5omu;Աq|3'o8GsĨ2gVs-hc5m%Sarr~O (:Iyڟ1159z ^3G sirg~9+3D%;!#wnߪ/`Su&c 2o62P֖@)Kltk+7oQ6y6K;!>tR6Ocie\r`,UμgoWΛ#Ǒb@;5Z̈ʩaP6n̛K+,|?{:'s3%lmc|+b_l IDATF»n$[Fg <wrdl>}nM V[n;a)v|χQ`h`Y?~̭9㨮 :F}9+- @xdF73Q%^V=B"I$"""""""""""""Jt%&ǞΑ `QY[maLeИ#wpSL!ٴ&Y /.2CǎcC8oa2V~\?n>!٢"0:ȃ尃G1|@7ül^6?n5־>r3~R;e6"""`U0wX0㼓,uq^25wdAi*·Y΄yko⫷Q3f قu{7~)la39 P!NLHox;fWrpܦWyUţ{񠍅u;(cl^&vR0׶MF8;GabQ'5Q[5;|?''f6nbSmy3j8g;[x7|V(f3}iLϫX}\y=KSFlK?wTN7u ߃7?Adcez*@~jvISC#Ig#C1|n i2QWO_ό7;3xImZV,gK=k\rk;3iڏyzBO:>Ĵ<|i|Y!eeJۯVcafՔZ$aWSH:ї^.!$%ai[-ٲ Z{~ڹ_}qc%gY.>q$$h.gd3 ê/acIM}Ǻ$mủcELRG&n(g5b,t Yd"X=X2EޑI+;PefH떄9#"4""""""""""" 6rvh/6oܬ۸%"V/bUO쥢0¼-kXַ"5~u;%O )n8]17|DQo ,FņM\aVn`w+﷭#/%Վ_;wO핍D(b;iTig~|_0Bzqʹd)@Mu &li=Hr`3>$",)j V[v)m۹`NB ,kEVצ:ڏ߿m?'4A"""""""""""""""""LF)J`6dQv502m]ljz6G4uvkdW~3L:u6vݱo w6;s`e,Do߾݅juӿfisycְiUT[ILk._ϚuF oT8~Jj.[{m:,X;AO+M.4 2:RaTp""""""""""""""""",6} }3]>L"\e%4zl~$}>MaҜ润!۶sf2s(gNA Jh1;Oa5q@[QQфPt6[TQ k>` Bn:BF@DZoTyTyx-ހ׿]apÏa3^DDDDDDDDDDDDDDDvC2yeo?xe؏ydZ*Hd&#ϲ7^ ϻ>#=>ge26zgd1W♼}2=޿6}w=;i$NV20M˻i9iC } 8ûxYl%$=#KbǍ֮ZE~a)U^NiЋ \'odzߞq dv?ocW7kV|/@ѓKbW V.f&ٙ~"҇ -њ\׿9G&z?xub-ZG-~JՂv' lct>;~ :DNi6DՆڦo2P0 .P m[D5|v=N6&oP>pNvm,|*: {4R渙F4L,ky(.?.nr^LZdCI۶MS_'8=ؗޯY7W]+'O8#g%ƅU܅3ͷ"/[6mXƂٙ.I&`Qp-hw=Ӧ\ʚypOhNU?Ȍ/g鷎JYL wR,Y~kO?ϧ˫ܟV9?H+׳,ijX1|]i㎠%}- aY [04)XXx#g˺ \:sPӱ=-m~1,JVnH Z͞P0 \=a;a0\>` mTT0fDxMc83 Ϟ@hAMNUPvi6a3$ٵcQ7pɩ,?_~ܚhr{H.Z>|[JfHZO4ϕۉOH@7,BRXmAdo *IXQaq[7Z-e&!GtfQVWA} tw5Ƌ>$aEL=zJV-bѪ8"? O<"/3Dэƾ8DFUޭ lqB2߰**D4j5>;΄ea ڹͰ8³NfŧTndCM)Z$""""""""""""""""bQ^da-a闯3b)y tt#d/o@t}`kAv#,6Xm]>@ȮlR 2aw}S4N2z{UⴅuH""""""""""""""""3~޿ #[O$vbRy=9VQX*˲?\iQAC9"3@^sApי/;d"6zrwX_y~6U+3T0eǰ9۬a^>j!iOބm=8  +ė uK cnNzg@o +1!,>[_WqQKƴYx eME4w??t8l`"_{8?3?,Idz[yxy7|HQA٩18М}Fq9_)XW\Ì%Ee. wyGb RU_E׎ъ͆htI pz'Y~R;#GHatN8Ia:{oryZ @]x:ϒb\|p{o O@U{8Sa0sx7*'C3xLzM86 ήé⺐wg۞w4t,'M+_K[pC/E`3_=r= dm#&&%G{K&M"""""""""""""""""" ~ :a:ÀDLF9w_EZoT{m{Ld1AF3oNipi(aکZ-UOy: \sj͛{ybb\3Ut J23`ʓ\6(G22>.V"ZDDDDDDDDDDDDDD ~g񏋆[6`p.Lk$^_bo-ouZ= D599.͠Ǚrz{2tL9; {|^U~.1rpdźOi.y`}eL:'f<==VYa4+D8̝%w<:mz?>m1\MߌĸL<l^ʅŻM"R3bX&)1N|E/Kqug~dtQU hmc;Կ;]#q)+.acb,-O{LW'c%kY]T+mǰ3({W𧹬jtOaUa:mITJO#_UUXNgJ,i1v W{&,G3T=#o@2 PE%&ʈB. ֭@՚\U^; s wnhTx>k 7} [T|[PyR^~)֏Q.I={aPȠGtπ~HM$PZDz X^iw@֛XVf%b2HV!:9IX ܇(\V-eE,MLB~e%`O#^D~PXitKtaԗfu`F3ΌKi[ߜJv/2f@$bvU_RԃCjD /%kVSTka39[}9saUf1R8m%9ѷ+nKIR *[_̰m@l2v}IxroEv[wQide`ZeYϖ''$@v_ݘ@tk׵yk94c3=Gm1-#N F[G 8 {XuNчd%ġ\+5cHgFOkhp59rﳢ~2{2~sd/eղ7y \q1_>%sy ׉ry 3ZS&lU6~4r!ϬKSyl>{Ooq'pb@5_ͩ֕bM>{]?s6ksCWriڮ#-/ŋ>_̌ ;&&C^ԛF 9- mʻu;S>]8}s+_粬Jk@4) (kو9 oȸɸ;S[ r=C5M%|M\qtO"͆E,|.m}fJvbf >K[/=?s Ϻxzc|""""""""""""""ґQ\5 1uPu`>NW^WikD7 sġ$Dž||m!5!C<8F7c oOYl9DEm/㯬."!{ GbRtgF3{8X6/܊ uhF#aqz.{dgl.N V4Kױ$0ӗQ3s$w)HkoS>>n˷dl7qwJv IDAT NO&>4lt:`"o>.?E?<Ť?%7##zWL̐bMKR8t¨&¸ʻ+Pi%*Yw#jQ_3=8iD3T̛ŷ?,aC^rA425Sl][1ڊ:ШΟhjz kzmm1wK{ BeU۷Ýƀطb¥lOHt=G2o<=]}\ut/#QWO;cKvN.%pddm?OY#/aղ~w|Zʉ۰C88+WP(n=Vܸza,[eKws>?J b$l,r>\"yU9bx L ۲beQ=0d$ gH&n#kᄮϗsVRXe}c *W>b}/XU?ԕlm+\wهجJ7";gwrt'V&6hܣ2/Wq}TT$DžND{nբ 80ݓ"={ΆJn~io&)]U'bgyBv73\S.=[ a: 9ߘ܃ˮ._Kw˻˪滼L3jmf{BH@ PAATlE{ (*6+GQTTPCz!.348]W>hf֬5fr3?Jq3}rpǝO]O ؎la»W?fr |cp 5:3?đffc`ϳ8~LxE̔\ ӖS8'-o-[JAS`+Ppv]=rƴyKXm=^~Pm\D.h)=_Qnm*Xl6K䠀n!mh]q]!<+gm\oWp~;S/ H _v#h7Q}s\ lxi^-9%,9f9[x]< Q:&\|7 0I@+f˂ٞPusjL#3fP [}85M[{WN]ےos߽c^aMq$}3?I_s|}4>>jį.oB!B!B!BaR:zEINw7YMpwp@'3ŒD Ow7D@t4:r^,z<`旻);V-ùfdhmטmF*j: A\sM?]-4+sٵFll_=Ne':}5k aq^4CT%[_1/@!`\䧢hy,{u~Lj"g0y/jŃ)Ѹl/}@/c_8%I [/|ʐ157/c<o·u~Kޔ8\e}~a}Bg؎s[ x8{>-GMu}n؉a_Ոw(1OKek,X~^Ȧ͵[Ko8d_VeQx):ox{a04V|8V\q`NygyΉ/`դ~7~C0߼&33ϘԆt3G-ۅKXHct1~ɕĹ(~֣h̹`\5kmbtj104 Yv0ntol/ B!B!B!B4ψgXqn2O8ო^MAZGOq;# YێGhWPJV@q/2;.H'h-c 1!&<7;3~o ;!(N&ٰOOG.F EG)8IԴPH)A @miYٶ?ʖp'z`Z(ȡlRētS~7Cq WG]J5MtsMl(MX7nFlUg&k>r+ZsS}7"/GB!qnRNL8F^}B<zuàSBvIU,M4=A4'SֶHPOǤҋn. \O^d㪺; E+%' 8& Jl&4G½[>W10*.H>v7,[!2 W9$ƞqꭀ^̆,֬JnR10؀_*DT{.!F~T̍B'zk_Gٴ /CIk/|0t+u 3d;3I&8{Yq@/w3B73' 9 `H dZ+˗^ g o׹UtZ1wmBWk]^JrR>0BpSStŵ?L(W1JvXϑ&D)z0 XJ^l㎸ pu(#w5FmM z'bވ|.(9߲B5A1ǯ`Ef9?2." \4<+pH;Hrjz*5B!B!B!B!ZIḅxprM+y'2,>IBcܓ7xɍQ˨Xvj(W̘͡:ixɫi gb%x9*e8S=0c9˟'Uh&M}.{Fh51^YYxbD`x wU9aM],m_MA?r{UVON-1›j«WM27[?y[ϚwݵQ7#W3(S㪣Ufx뻄1xwÃF/M!1_cPJPh0vӰ8o΅e2ts5rVҮml:uזI@Vڟ~c{A GՍ#/fܨ8FvݽՈ .n ?O5bMO!ݢoߖvYݜNbZ)d. NO]GŖaI/;g[y1"}MgpЍ@ )f$)'P 4Pf_>B >,B!B!B!B?E u2~ ܋Ԓw][6=7$Lgߚ]Tb ñuV=.=802}ĸ(hYlOvcɰ.'^c{UϳCujh5{q-vWSnG;3VwVSTm̘Ի47<:3\=]؊ )ٙPFwQl7=cq\ WsZJ(k6ѫSVZ 9+\\>QR{RP0@u]jϹLN tK%ػ6ܺ^0-Guke]_ &þ {W{a”;*?> /=ۛˊK_n,7x`P@mԖPRVVw;PU W>VNIy Q[Fi Ц7nfŔt0*r׿uֻ;h,\t0;W\%%e-DSZR'+MU-[xEQ׏B!B!B!BΤm\\N1TwxssBIU7L{47c`a֊NC@ N t)^Ov5oM畟3NXEwL^Ŧ_yC/ e'*(>\.5|NNO~IcKLUzI+X ]q"gggR[ \:D=9`8ú5Ii-+)'][%Zu鱾tQӱՖ%<7E)` dC0ʳ`* )nZƯNɓtz۝q]q=<*' -7_i'iU=vmhޮК6@P";5i$/(#w\B!B!B!B!:n>7>c+yn!y,hЩʿoj5^k*ЊwߐaL{*ށ+`f[~ɩNgMo* `9̟gu~60뮏Iѩ 3o*sر'jL@;*:6LJRN֙V8b.# 7M"¤h-í " P|ahE}`$xO]1v: }B?c'bEFxCz%| CfBOZf>}b+9` a v&qyo;{މW^s`>ۯ~n!r!Nous?NbviЧtiUU|kKSQ\bEGL/?Ϗlxp"rNCco0*^'^Ǻ-^889t ,T׫ɀGݜSRz!B!B!B!;t,{"=W A|4fɍb ,~y/U,gI[˺ T? :)+)ŦP.5?~N&!SőЈw$ýTJXr*PRZwyĶ[9iu 812úwIQA+ZOKD+18A늱ӭ_ܦ9-J4T\hWqMMUWpCЎ7=U|=``#*j{n(4 8^9&َjڭYΖMZӄO߾6uvAAǜF!B!B!B!&)'Hx-c/[݈wHL ͵P[YE; tEEfʼn0?DJs'^BJR>.{1EiN=8ep n)yen "ġ+⠀ + 1uD [y6p7+ο*0tĸ M^UT+n T7n\k ٶ) ~ݍ<#&qa z56h\*B!B!B!⿘FeE;+n* RFT=pxT+ѱ뿴 w"O$bDnCRϬﳁCI̘}rZ-ť.'|Z[íx\ud!:Nxf3P`HAR~0M+VTz$۪hU<2;z)ETIOuÀB1uڸ֬ ]2v-uxJZ)%-K)3nhTTb67?W鴮bGR\qsUQЩ)-i.hA _[ې`.4Gis6o= j5fw.kMr3 3kyoQP#\Csa2~]8^zo|b^6KdO2G |=cb_;æȣ>^~BxQ%z0◱QAV6sKÙ3G_˘smn_Nx候s3{u~>oe}CpffiTteV3}6\N/c?9t2ឣlJf/foBI]/9gÃC-#漝PhEcڧ @J_˓I.9vu݆9}k?sji?xDF},+я$Tțgy+5kgLd Mӣ_z !xW2 ^ uw9͉mA?`pg.mНu&,%҈'gn2k> t[>OZlߖ}"p9Mfކc* ![cЛ۲4+NU7fZ?h0'8[,M8d <}(<kr)OU!B!B!B!ۼ&_&WQPYxOp򘉎9+^i7= ~/<#xh8J#! vroM;)mr$ \n]*x.ɘ{2k8v'qX%撈&M׿)}y?Ȟ=Z]KW1³]&z£ʙtr(S< חPw#n&gۼk~2FpÛ_rCK?~;-,ssrZ}u,џ^Ac}y,>JfECb.#-%/&,;^MŅhbp]?> `hƞꀣ]L[y[euٗF^r]7@sG Zf;VRKVujEzg: 5``wrXtu />U/ ^FqYzVJQ #v޾49gNvUy\2ZvN$|5g.ϴ2l7èѣ` \0gl: k+_{GUCd03ѣ+7-p&7][ZzI.Z <|ƌxKض6̔l4/J{f85,znn,121fXoV>?w66]z߿yv/'9b} 㷷xbZ[ۚx>{zC% F& AmrX:G_U~D / \i,} pK@.i% бasU.GG%`Wԡ__㹏ג]cp ayc?<ptw:ҵRML;p˸ ]ɾog3MĖ9?WZj;A#/s7`-Nbylqa*P.Vs/-l{&=;e8kN\oì#-t@/c{әJvePnkrT{vS:ѭP}A!wzt$KZ!B!B!B!N* WOfBd ^ḷ'd;V/YCJB]cC`NaRG4Pќ3ȥn4KcګrT5Ȏu^[^0sV%*hIh:,zӽp%%ׅU2Ƚ G P<= =3ۨo<%YPpKַUUR;lFvJlI$Wh8H_:R2sQWũ]1ϭ]__|-f%hjHɭמ1D;5@*DQKlT|FQS2shbfozbVSʑ r17VzVY _?t_^NyfG#G*J䑙KqM!\,>z+ /W * AAe࢕sgܖT`G xݯ_zݳZJ3HHίY6 ylBqPSDvrft kR Gv;ʹa90shy1!W{'s1s95k9\ ip3`)mTYwp7;?Nc]?_?_n+H͏}zCɤW=}jJR?#O/{9W&#!y7^ʼm9`+dϷsEz5%HNͧwvN6w޺-G+ G8HBviݧ?{ -]Tٸ 6.<نZ:ՙ?} {;2Og#֊"rS*nu=Iڷ\!B!B!B!y5fƩ@دgwJ]|BtLzu6jkWp{1}a,U_&dU֕y7O&jHZrG (W5bl6z3 n9ӥnQe:8*nx)$x:]o'ƃDWkj|5i5sP'0泿UutfRwؗ K2iWƑhFmiyZuB͢#MQ RiWNzjvj]&=f&}[O#ϕ7c~V2#CjsǤQښ m-7n*h$leڴ)q cY1W0wmE'Zw 5d߶QoبOa Yw8 9,&cZV\͚[ؕb>\LlZU׳uoZaΠS]Ž kX&v$, ]}[Xz5k6!XPMkYf[>:agA3SZޡ?괕h <,:tmuЫ Hٹ5V]$C=[Xz5+ al%d5^]-;^Ka9eCV:ݺ?Weö-B!B!B!Bt%Rp)>zI%-+u Z{ Rlp%};rvp)0~:w$U'&rY|=wfϾs|4}%}<[#7L#ij)S]7ՉħL)x^>|ߟu=ۘ=~kf f{99uV%'aQs]xT0WwGћ99I|j 7,k-\ Ŗ^1kLsf&L Ce=csh| ^qpy Ft$5fؼߌ34~qE{Gì19׿Umi(N1 g/F_;W20*A.$ܥ8fz|"ı*SqןB\݀f?hcG]ۉl-Gl)CSx ] ItS3 (ZaJm4uTmb.J;֗ܺWSf͙#T%.1r GUP \FSU+B!B!B!By7,r!woau gt$~rv)mm\۹a yfŦ]̽y?vdt]g<8ҏ|S8TjGh^xHp'v n|g>'Vfy5) P=^ňb[nW{8BJaJ]CV/>cUq _o8~ x=?}ݫ,a[{B2N1le-UX?B&bA~v˥AHX8P+7\ ˌyx "'+{ދ7_^b 'p]}qt/ٔ)ntE_[vMxE玚bSREz)~nг7.&Tqvmo>4o|/܃s^P_Y ]x}_B9R's]0*ҝaF塽lpl}ϘCp eVͪyOLmv= ",f(a1~Pg_|O%=ZzAGF 26kƭmlx`\O [? |mLXFD{kY6;W`[.AVd7gp/=ңv"R6nd9||:y캄^ƶ`c<:9s5Ufo)Ϋt T;HZ<\!ƌ 053V1oλz.KqPuxTSPjC. EkUEdC-ϱ?.ٮM8pS3X(ji5֒,,v+wW^PB!B!'d_z"Byyywuu$ȑ#8::>t{"B]GNjKHL"v 8w.vh5d]_˵Q}"pRKR|2Zs4<苗n:e䦧usLE!Cm!YH;Z{3܂+?w' *JII˥rJ޽'t4` 94w:y캈5]Uʑf)ޗGdawWj(Fng(;#Ԝ-sz'6"QAVs4S(-*WLQ<#Pܡfkh5XӱI]΂/h_LU;Pa6k-܂QP(&tK  KY.Zy>V0bXlB!B!B!B!:FDN<8Z GRp$+eoKf6Wudryջ? hGWS CC{}ө-Lg׆SlF$vJjZz6oO86*2l"sZ?-,e؞ˁmҜliKݍtwIt=s6Vm rƾ71!8Yp|Vae՗  GWKڸ}5|b׼p ZJOye*taׄo&h!B!B@R5 IDAT!B!B!d3?vKP>C@b"bbvW:Mb Zo۰=~=r0V=`ǩcZ꿊sP6`30!B!B!B!B!cm1my ;ݽ0꙼ۼyxINt3!B!B!B!B!BQz&`*+6JҦuNu9\-u՞aVTP`ɓ!È D}UEڑDnsms:"qO8{:D7ؾUgcF1*. _lv]ܺ|"K@/,VjJsIڸ~?mgpxuNS#GrO! D !B!B!z.ϔ7-NN-Sq|&&B!c&+檶:Эu~7Ǝ/ ~z ;{wһ9k`U/yX׿U׌~nIY֚2t.}t:7 ıP-%t*u<,87Sb>F#nga5{{ VN:>ngO-V_կvRm31L3}qQ۷`<*6GG1Gs=p}qS_apwQÌ4) iMoe103!jI`-͝:צ԰'fpDvcWxy,,{gߺQ4Jye_uڵ9m+k\= Crldg0MTt:f0ְ)Sg}`cuYXZŏMis;>ùq4f7yfqׇGq伩r9x;UVOOxil?s@Oho;>'W=!HB!B!B!04fP< Y ,5,B!ș0): Yb EhNE1bd AF OOU,Y:~Qc8c\4kOvz e c8{7[[{0zY2}ٷ/p ?.&`O>-i{i_#.sc 6 6S{016ΜS?~FNxEf¨ޘ]dqӴ(ttgA M%l]ieX- 9 a yrBΛGBc&J ~Xxށ5Es^.Z=y`,OiރFrzs.k~^ LA+dZ+ITzZ˓U$7égoH<}//-;0v_x9NNUZȥŅ sfB&03zdߕר^=Uvr w01gKV9-.A :e<=tL.~.rWoSzr"h˗m$&w }Ix><_zK:KX9SLɔ!6.rAi"m_ޑKy#~F0BO9A<|;l;PBt&h!B!B!V+ !B!'Q a?=|,{%媮x0i!gx`rJڳ 71#gw

f]Sԩ-Xs7}| q=,CP\Xc=$Kyh, KO㭋wT>ޑcN|{gkür/䴟|{Ky Cp~BI~41[HTѫ7,c/8?".{+M}$^Nź[7?͜[pt=Ӯmr`/dw̡Ai,|m.KUS7BC<>6_/7 &pw~,8)q:?9úa>X+Pl39suz9Ӏ39x9/MYWp4  W^/ И-_GG;ЋO^ahr ~Hs`MNTixc@+c習e)wC`y  s9 Qz6"wCǯ/r E }@3Ԭm9_wCYZj V,tRFE7s04^Oʗ/Ά:tDKbo.aEEoIe wCiݽgGT\:1N0NtxӞVʢWf0s^g VQ!$x?:Q\ pGEljvٙ`Ky6GbŔA+y߿[Z9~os6_5PJ7S@.i/~FL0n'!B!B!B!B!B(RAdkbˆ(Xm!mvGm%뗅lkA `llדVlh"QN?vz+;~_jid6FŪY_k#0ڜAJu8#UA]OKzj~ZZS ŀN_XZl+Sھ8 vUA+察VSeZ K\ӶN o/{@9?KVw̢VP DdV²_SsݞӞ :TC.@39HeU#: yㆦ#⪂5?~݉ͥoJboخCQ ;F|?S/ZAqj_qX.B!B!B!B!B ߈pTЛSغfd&CpoBjHe+FL&@ch޽p N Qh:uuuP@~c}-u⌳bz UZ= :h>:PpvbVq& КH\wVSipr wR`E^JvR*vwoH#)[cBl砫_P\UЛHL{!ɴN`ɝ0/ԍ%6fs.E)wp-]Ih^zJ:ok&-ۧԃuSsR`Pz][=^]ߗQrƹٟge^-I/k}H*~}euIv@k%Rpo^Ήަt/LgH Z!B!B!B!BуT@+!=њuO^UAdfiEG76 {1(ƌNsfYv2ʇĊRVj3E6V{uEl7nn$uWVw8Ca=!Ifҥlڴfٴi3K.qZfJKK+i !jZZZڿL&Sbb`0/B!B!B!B!TkRN0Fe \;cfVlcfΘ,=3 /9hޒ:̬dZMε}8 'GjY\r*Vq ZVep9?bvHIIplٵeΘ)g; :/) $ऀV)vSWKΊn Și]q8FNxuS}k=y-).yDES/f `M*Cg['?;! zS _}Wu}5SWθӂ:k#1v5n_AWpr3O1 y8{\aBj78ȭYd4`̋b+ΦShhj {)Qݛ x_ǓӚ3.)fJAZu!p|[-G)uq7x%c1Ӛc0]4*fƕqP6%˧Oк[❯3iU&MŻ&|L<Jbvv̟&=1nd-ĉ;DPYY(ン3ڳkMhhhBijj"44G⟤"jjjPUOOO<==qvvn wnhhn!B!B!B!BT,{'J?ܤD2k:z'~n諟g/;lNYoc]W>HҶ]9/!f F]< *UcM+/2 x&gĕٞQ-|{׬a _%D̏sŦdVG8G@|_q> 3ٚ9_藙vz QilߙCExl,=(z9K?vYXwKe9~D] .ӰZkmdj׮c3W;/m7M|?*h[xҕnv4ssyX>5+V 4ycSԄ׀3a9XANj*YԶ1 .?gꝟ?&o+_ěr(onǂsiW!NG/sk]Bgһ[c4'"Mf[ؕJnY0 AŚ!롳=!8Pɉ~a6{QUWWW\]]&55J?j wURRBQQ/ptt$44///f0 899aXjwXB!B!B!B!Nz;S./ᔾƎ$4vuX6vl"YtSo˜Pg@Nh%l^o2eeZs?Lڳg0n:}9_̟Kh=`oypZ9>x !z]k`Շ̙E&`-dw;6^9~>:_[w'ow;NHSb+D5\4n1;PPL]ujCwr70yH! SKVOoyOX{mP~LH" ' E0:hus v$EH|{,L㘝eK?<u<cg\h!d+:G0ATo?<hU䤓SAA&m!B!B!B!B!B{@x8:r -gv)tKfZj|G8(**`0cFعs'EEEt;"妑틼[Da0)T쯷x9W!B!B!B!B!$uR0g1qpWl[imYSQ{;哔^FmPTT@HH1LHHҧO#8ϤYw{lYi(-?Vr;+#ۊ8C\JA+*` r3wi"~+!=az9;󡉮n'B!B!B!B!Bt&hq3~c8m)v舟1Ϗ"jjjl6w`&as˜kG;9dL8Лpﱾo cU<7T[VȶB!B!B!B!B!:@CSB$v uVݳBzz:w>@^,~y~)s O1ϔt'+1/=Bsd 4v5 fsÝ3q7Gl>$?v5y1>y=CUj٧Rl0NGoL-UaItS/csl]75˙a7C#M/y^ZC `x?5wOcr󆳺ݿܶ/lx]uHB;-B+Ĥ(L UA{p4~c)YAqq9sb0YЭդ-~l{fSn};'Mx}ol8'T_θ7F| 7;((Οz7מy`"eb2 F;Մ`ncL>JfV9[v:[_=v+\aO\߅s-#復X 6Ix㞹wK)fO(у3w.?,>#nG&lde\3\傢7Om͡ ‡g\?Qev;Ni71rL$F@LfW{Aoc/?S<bЊ& : NKGT'<ĜO)Xf3Q O3we.OgS&~[Baga:!{F9wǎB!B!B!B!BqI z?*!qi ywU\Cױ?T9{\.>;732O)Lt-u)`[j3|/wv}ɂ/#."r SMl+nz `ݽiu&#cݕNOMg3߫m'/i;'<}/?I=ϝ#&}ڝଙkwG{;,׿c~P0{ ő#P_٧/%{}.[Bv-E{C&[={>h#Ξ'ҷ&ҹ^3of|:/:!{ >cť1c_2zzv}6Wiƒg9{<RV{|?e4kqۘ0߼$U+^!Qtqɦio4QNί_OnS _j߹}Q£+3ユgKf9$5n _NxWwsxԗ\Zm'T-B!B!B!B!Du]?_Gi\SCfs`@c|l9~7z|ԏA]{WⅢW͗:tSdwЄ3%ɯBYWpplahR6b+ؑAe]cS+L{~mzMU)}1pb_NTU ~fj@z'"f]9oW G`8nho.GfO߿+0\psxc,ΊNk/|1|*lh"׷FtՏQ{(S|9SRtZR+vCJџo1 < T6 _Íu芉I2^oc.{C>Oeüھ?z~=pN<LޒƗ/g04@kjO[AqgAӴk/RSf%B!B!B!B!'3SQV@d7S؝t`k6b{^FjkhB zJ~^]iN$[A $ˈQhMowC0W ܜs/vQ{XvR/_Ţu5%$} EP"vRJ΢EhAgPlRjAaߏc3:9/CEGe "4Tz֡ѳbch EoeoKȱ՚Yct!{'C䪀忬y=:( խ45QW﫾MAqg8=q>'AW aHtZv.fq؍=ÆmIJ?ɷA-zt\tɷB!B!B!B;BM`Ĩ CT7Nv*/+^e+! cx{y/]T}p̛7ͳJ8q)xrsʫO_J]s˯2os\=SUž w(M9I6kEI@u逊* ;'";gI hC(4Jv&R6%˟ =QvgpsEZA*i5l$=% rh3bR@%59{MT4@ V-]&&Z[[1O2}oghtG*RXl(@u#bٜuJaɤ*m XE5 {JNvjiH%Ep W wnHM":X;B=Q6>p.t>>ݿ ~zWt#^̺Ax2h$`wZ>5C1`-Uv?|RW[N tS&B!B!B!B!P\t9s zY0לJĕӷ߳$}̫M||0I$Y8†MD Yi,=\CQ0'6ĴRzw$=A6S_8'YVgƉӗAJ0`7gb"| 5wpx?mx ZORQx4TP^6l7Q7܌1 Dm{þ G 186Kg<xer\A]TSIeu#-ֶ?@U' ʚIS5UangQcUvUTYu0*X̨om(!eӘڵDɭW,a6,XWVV䍹NUe,>|?+|bL!B!B!B![t+&٬)zinN˅3鼹/Jln -UTti{K~*N8;zU%Uxۓ VURwX,TTTPUUqCUUU\Tx{νcX}8TTmb"ab7Ow Xz:S\wbp'QUYN/p۬@S|VaoGn^C?A*^xutM3$-UT녁Blg xx=sֽ^!B!B!B!ѤX3uwU|\KK5ٛnL;_lBXpGi,3щN8=qlj\hn{0:hq% FR>!^PPz#[HJo\oG<ǸvxmH㛧gcd>s_EvmԀ SH*1oBm Ѩ; TFx/ݱ5랷ɊrPfWgըLؾW':;tAmڮVGxjڮmx~*3cbzxahАf)'e CGU +7 լy9ϬjpmTbLQ5 %I,Mh)y\nx9+Oc|W7t ZWĮ/g)<6yT/F>e: h|v0ŧ)H|+sgtjĵֵ <;j4G{<>ͼSܡuԟ`+X3sg{]WMcYq8E1,ؙz!#xKTRʏ2۽;FpϤ{nuklIOCIrb>[m5y؇pjt>H4 g||=@5޽_5~dz`('̵,|v>76,cfu"1t=SC̛7`<56W౛{ne֨§ ;\ϴ'om)O7szsmg>?N_P̈́1Yw+RmI ~ >1W}ö܆J0wgXd ~o=SZ|^6Q|[*R;o:¥zb՟ݕݘL1YywO>)=?I>{5/p=66OiVYCG)<:f݇DQA+ķNk;ٴ]t~ex gd'R?dtʚ[Vº:B]ZĮ£)Qő22T4W/c^<==)--%33V%byC]ôN\ -/| N~>JGL4w44klJX/u A>1yJ*3,#XWF OpW=h,]nMnC}ۙ~O.}cwm\΀m߂z]qm͟=FrSA3gǷ)hxѲٺ%;a+w=ȂuG?P) `A@1%ZaӞaWƱdU6]3-N#ϯXqu4z0zT?3 eGõ<\T_!B!B!B!DCtT3V^BCA# V\R&qc|L!;^ȨRZ̎j0X_bow/#5?$#;Tv5 ?ImALKv-!0ڡ)B#GN ƀSU@Ew;b_0C'2jR/#>̿YvIeXl] Lޝs=} p؄]ŋ&Bu.;W.gSb>fS݆ GP(&Jt&w Cmyy<ю*Z]!7a ULtއx;<8t9=+X=bŕv1$ևc0?)I|)qOpV~-ױ+%Z[tM1O޸P+R O:i\M <#ԨxwY/{!>tMȬ$QRƆ?WP)z%S_ekETg 9߻CW#%jOڙ[4hM'G4 >q q:?Wplßm*|G51޾NR9\Pw !8(>准&լy>?A9p0*&o&†t.^{y<8mi{c L/]bgrS0VX懖NJϗ26*<rq $*DOZ[C:ȟKH͌΂#KwP׊j|u_no敏F' bN(?-ؔwttd2QZZʑ#G:/=r555L&1]ŋ38G^axrxt$& }Z5¬6]K^,nWyvL$.t1'vt~sY1n&LfC(tHEoڲC0n7jXs,^ި iK?cO1+K~}$Vc%25|ě"L+ZU7m'W?GWY0יs<",خl^D7ч^+!1;HbS@+dz?ay/B!B!B!d aVMԦ6i}K*6LT+5DҜ5̽%6(|;_H'z^w9}A3l!Еיo6'-=jJ{{rFԨg|IM=oMz/ 뭷Y}RW%Ǚ<EDqc[95\;}& tl`zq*Z߼7)?Q-|g0j\"ܵ.^Vq|wű?5 9}?lm1ܖ4qTnGz^9x_s9vi+}r.A.Nʗ)5MaEGIsDQm㙖/<3?􍾐h3xZ¦guwdc?qҰBvtrT0ˏ'&-֗_>p*vv!C?KYBV/gOXTYD@ 2HMlMe|#L~GfTfС Ћ.}q I F{٫c_j[p!9 w}1)[ֱ7+| R~,.Fih|>vq 9#2Buf>f^r<5Gԁ+]п_:AʯR2N:GO_UDYA7`0oG )g_>֋27Qkr<>;@VVhvN +>{^ϵJt)*>#o`WhYfI/9u.1 p࢙<K-\B4^ogN,e Ob360⬣0ޚƣםj hڊBfoԽϩ֫o`S= [EzP{2UyV†7;%ˉuWOjvh'}gSߩ gol*26}gAIC !B!B!B!ąᆪZ!G>yV&xkMQ'UT)`Nd\9KSN}||,[ C$V\%wY Ch__%P ߗf_J־ܥWdo5HFt&1c%( `){~CJ0c3u;-GW9}|z, BWS9UXk- Pê.deչ'4*n۝o^(34 `)?ĶV&v㢌(Zޟ͢ahj2u,/>\r ܎_fsbdK/Z Cr6lbõ+ Wɜ_ ~ )®Gw_ mecZ3\3JUGeWQA+sk>Kb,D ZH߼j8R,%Ӣ`;.'Iر\ib)`y,+۝hRwf5oa]UVxQQ.N}ǯ!k"fm0"pqRUL^F I i.+W<+NӬ0_?|9_jeoЎ /\t+($5-ªo ZA~}kJPvREjR 南W[OէBƾM{+g`v3:On!n(=U~p?)5h@+T-ww:L+6~ʳԞwLF3$'sנ9dgg$%%N;'2$''c6,[8 F/iŬzzVˈ%ՋѪJ>Hbvy///Ov9 ?cڡ=nh9?HFi/7]kd+L-"儭VIQNiOtucti0_hܰO/Ɍ>բ>ۡQCl烫2V*Z<:Ӵ_d{B!B!B!Bl6(Z 2q`"hw,%[OAA}Z`o(*Btq3Z2Sl-(`Y~f)aX͈Zǯ;SOa=UOaT0]T4]mjP/bcPw7 Ze֋,Oyt^z DAZŎ0_5'*x: BVJgN3O,]c5l`\_m^t_Ɗr@Oh`ԋ*XrYtVH.+Ƚ݇Gzo4J1k`؋ߓZHՇ=СQe+7#^ sxk$'VDX Im[˯J,u;mg[ɴ,[u*a7?ޢ9mJڪV<ޗa<; m^kRqmho=[Ik^T&- ƬݛHoNZT򢺺Bh׮]f3IIIꊗW\rVHiN5f.#v2v6jw! dv_TB!B!B6멫p#B*z}ńZ@>1⊪3G1jpOb"v5akPQUTuID :c-+O *Ɖ^-K7jfɮZKհ qyO^ [fǮ}$VUxtQF F=ѡW@;djT$XKJhhpt,p(ĺ9"peq57~΄CX1܆FmQ;o6Ah'mUn[)l=M>SGt (;z?EEp+&L* UE4?-cڶlg[8ѐVQF)YhV=<<'//۪ //EQ8JUU8|0$$$・{f-gX';;ٌ+gܞB!B!BoHyy9ڶ[RBoQ[[Kyy9P(OM&ҋ -A$L!38 'ݷjn5ݺhg syf؇A}56N8ۺӾU3˾GlXZ _7pb)0/{L3 Gg}JMKOx8RĮfؗY~Ҹ>̢yc%%%֞~G!BkRRRB~~>f;;;L&H.~:R IDAT˙0ԣA%U9uEcykT޽j;*$Usp7֕kzx6̔efWiQ؅-}M%O=1!2 >NN͌wx*զ0m|A4ɳg7]6g>VuWl  4WXg,eNWb x}$=9ݘ8֩I5)X]p \;c;:ui^Ky YGE]2kPqڝvmRU#?)" (bN9&P`%)䴁T6/~'^^ ;5r0Ōhܚ 9NAD-WXP0:7(Vp 恊o/*PV¹`)p"%!3!::zmhEZxo;G󣩳oќ6}LPPF\kC4( ,JYYyyyQ\\LqqiUɄy~͎B!B!B^Oii)eee]. !d2]04uCV^2.Sܜ1"<q9ܥ䜮$lM pw3+,"[NkaL^,z-Mj5Tk+*M]>#ix „=EE5N^Ѩ޳ F9e N.N4QY6CM Q?`U ϳhe5dδFyY:@mjkj4P+Pxqt1X/[`{zx,dd+{fp}N̤@v1p~8Əv~#f *6eyqV{1h4F,e< ױ! t##538ldm`m+JWRhOUXՒuc+<7>Jh<zBG_Ams7*2s`ߩ+kQhc$W>@FMM-vPd\B{}_L*V 8tk;BM}7җ?4\6@mz~p-sNDFFhDQ9 EQ0xxx)ah!ڐ#DGG+FTUEUUF#Dtt4B!B!B!Ʉ7 d!BSzazZ^5TX|m0n7TG庩 Gزʖȷ̠ ujQN^xl8X =ىW3d%DhKe2SK1W?E GchunqxE z48s:cAo\nR6`0=rp1Vf<Cm̨ǦqUŒ$aRDRRT{_e.X}cC̚u;}luv]O=6Ώդf@i< d- b`LV>nWOYC1v离ѰjBg0@SϷ$ߢ`_ލо\=#-~Chb}@:22xgV}omO5 W~WT=2. 6zsX𬫶{3KK[=dzzoƤjhڶ׏$LZ& gMO?A1cB{$nLTx68e)qO`OOq=ҟ=T1fse@k%|bO׻gpOB/icWߏϩj~ُUB@₋˅B!B!BpvvB!ho1ez3@g>VSAVA^>x9Q@"=0-ɀ϶0br/;ļs~xй;#kb7it@\{ )LJ' 3~c ?MpW\ʝU'$U@YG0ѝeBU.\`o8s;2b$䛱's(.dlA0 S5U%zqٸJXu'kW (Z%-uױ80n=0ya11[4Ъ빫xaM-Q z7Y]Mv~3ˆ͗(ۙNKǡ,x+OS;YXu5o- VnY/s}pQ3uf `!Ǹ]ԥg+.^yOmw::v-e:Z8Wp|f|΋wv-6^*GrNf wB-{ǡYgNK>ΛMLƆrɓN.Dx\ּ>E*&80w|GZ#P?h8>ڄ/>]SoQ(믱&>v2' K [ޜ©L.#<oPjsEL{[n^CqCoPP4 rU$~;{;cxQj8]5jjo9W{ ѵ unޛeX\$AN (Ik8<ٯ3:6K`[ur9{?{a@;gbztlhʳvnSj C3h۷`#?<{`%ʀc)IZWo͢-4C`Z+f0 ޞy8V[HҦ:ҊX9_yせAAԨ-wKI͚ٱ-vx6|BP_Cmo3r =3(I3[øma7 _Gzշ]f—Um-T`ô辌o\ğ ^㍥<2&,#ULyk{xߘ)MYW`m3\q]<-h6oє {;#B!B!g*--=/+zEJ ?I !BSff}U???μ!Ո[`;Bpu0UQt$t <4y1W#ZU!U޲zGvw¬T3)mn'[W|=qswɨQ]OFriGΰjQ:G" uh)ȡ'QuFGa\ӗZЙפRYx{ɫjp-x9ۡURZáT2jZ )C ^Guq6)9Tb-{*:|É KU1I$RsT{o":bZ]Bnz<%V(6DFaN,?$rbLGF-ep`kR O7W\L6+MO$P鯟bwND;c+!3a/YX02%<3؆e̿~t$Ϡ|fCДtQWGin<8Eѱ65dz7Ώig+((?_,@B!B! HpE$-B!Z✱BS4- DP!B!B!B!B!B!.V !B!B!BcNl*رҧ#UB!B!Ĺ&B!B!B!B!B!XR!Z!B!B! ՟&B!_6ehнBN-?:̇㩽HB!B!B!B!BWB3c!s,z!?z; B!B!B!B!B!gJB!B!B!B!B!B, D !B!B!B!B!B!B!B!B!B!B!8A<8V-x̭lA%'yxZ^<9BB!B!B!B!mL16heKa:*&7m[p}lj T&r^tӇ|pT+)Ȉg$[kCkH8 5$Tbl[/څy`U‘fwoz9`)#}fhuNtCDn&[Ժr 'g6TYwXz#2]u1Yacrǝ3} H Z!B!B!BXaa!(vvv -!B\jkkRpuu=}wFbRF\ˋo]` ?ʍXVqbÏrv8Ii",[ȫo.#tty6Ǹ`2 0!FsX35SXb'GȑK{lCމMwyiJɫZNs<]7<4-v7 s lL11?ר9&='GcmCFc3:r>TV~4\9c5Sugꌻk`5,e,yi餺1tU9!&kyv5tϼy>ӛ)]W]9ehb62AGU XmqAk_q?;c7T4s K ~%ɏOyp7?=̇FjwL*}9?5_Ҫs6 w롧VWnu(}qz' w_h}]G}'$[Z7XV< fNvI|,>VLL} H Z!B!B!BTii)t:\]]]B!E`0`0=`^?-Yjvdקp"GhdA8šϙ-Q-dl^+5!>t3.LyK 9߻CW#%jOڙVDU8UEO-yWD9;aog6xNUzd~x*kWMbNs ;#W==xLyW< #Gk9Dʼn>2sVF⚟YJPI6 {ڏI/S;,t2 eL$~$mu#/ϾX<cgtnv̰8z7txMU8o"q*Tsr6%c6mpz2lyLg;Sj5`v ]w)ɬ_Jl:oH#ɧI/RZT hw㳌A]:[ 1bP$F˺–VL!t쇡 KQ?ӯ2ǡ{[Sa>>#`eʯYы!}4swr6 C7BU.֬Fbv Պ/Q]dXVs?đ8FuCgbۯ[9`Zr)ir~oOG>.^xV|958wf>z1ٻ(㟙MI6B ((~-{**VQlkgAE(b/^C:H!9?B !}ޯWНr̙3gyygÁo h9p$h!B!B!B!CJ4M0B!SYY'&ۑ^ĻsRW+y/4|N܄\(䯙vpt6_^$3oN·ߵ*ny/iuOKݻgƊ*j 脙?obBs>fyI4kni[Y_#w#ȶ0?mv0sfa䤙LC=cGeyrϫ.E?yg?‹ '̻XRypQdƃ/FyG` }J>`_z%XL\4&uTZޙ9Ƹ_`_:VKkDQc)[.w<:fb}V{sE|9sQ=>I't+3]Dqs"?eu|4j֬Í6g? x \?061,OyYž3{T^2賸tl6Rܶe2tw{<&M|w% pAuXF>192?/Nj Q29puq7Y]1xL~aƄwbэoܬ5G~ c!B!B!B!0B!Z ///`wf%gEb J/3hDP5{WU4 1^ O3*Y3oz0/IhLs6f$v IDAT C`'El bzCcƧL; Ԍ]+,(0нrޘ.^x4Ces7*4K,;hQl<P.og͒ ͣ75Bϸ"LPwzg04do]r#pʱK2 _ř:˷ӟvh(e5%>qwrGS5~wsR胆@8ґ8ro<a7~ҁ5?ʫ+a8 u!8'TY2V8 M>XUCvJ6TxUo3efA$~hy拎xR8 C4d}U]98?z}}xʾϞYIcB sx.lBo9PaD^rK}?K}I/Wc\pPVVƎ;"55M6i&RSSbǎp#B!B!B!hr[c!B|xc;^:E9)΂|FJt$N<ƧWOfͻ?{);lgU+EAG9e ]9d:+s P?bh&b,{jo?3U:U",@'t j4/f|~s验NiIdq={cqvLI렪V0]b)/@#aNU?W=7%;t"yȚjg5/dAsIo-yvv>[;~"LRҪ1 ç>4:Ph&BG^mm~}YlSTY6D;ΑkԺQXC(Щwލ`:B ?BEUUTUUk~/Kh7x{ B!B!B8)cXB!k{Knq| >d&luŗ;3V|}Sd4P 5fѨsosOY5P!9sVh5NPz@St"Z:V+:th(M%Uflc0w&ҪsWzƘPT"1vԗIOPB4um-bB.:6lbWK7Yط%VjA;40<ܣnS;rꫫhTfACdT=)[q5SyU9&ӯi|KS1$߆EGv'Yu:}iPܚS改jCcw̰sPd0k+ײnC25wt>,4]Nd6ݱEG"h9P΁hV,iwJ-g־O?(ejJh(L>ou&:{"h!Z|*++uZX,(566Hmm-QYYIee%60X!B!B!B!BCаU[F!*奔i_o4 ZFTQ"6|V"RPNyDincЂu wwܝUqu42SN:nFy󪺻R^V4/ Ք' ~- oɎpߛdm*k;uתvJ]ٰ[^JUY)U <46gD:u:씪\nSV աEhτiOru??L(堾ZMGl % L6T4oue9AZ}uRTx_O#+W4 Pv*s6|ojD 6C\K UpG5i9PծZ7,x;x߇<4t4 o9PnDahcѽpգAX{z< kskMoqA~!Ν;)++d2ѹsgBBBtju:SPP;ϧj!B!B!B!B2(/m"j䭁+#N%e) aDEUJCGuVJR~uҶ#z@0r)A耲SZ5RZe@]%uGk,€ `trZ4)-s0UNW԰rJZ)x?joPjꤸ"0ЊFLiAYqyC9qzcM Ec`m9Q͊Yǀ xk.B4q,&KAGqk^zRv7:Gun(S+C%&`:Cn ++2݉#,,Me] #..wwwJKK4B!B!B!B!' h*3(3@3_-i 0 ̬8@#'u t#\>FMM 999m!B!B!B!BU5(@EVqb21;K3YsEIxh`/eQZ+j ׬ejf?"z(_0 ?W*G; D*y, :K׭翋1 =sD8ynTm_jޜ}xK);/eǞ*c+2s׌9FX@UT+0Eń3Zۖ,e4nw,Np?t *V,b}]{6 PhxOog'=sG)sZѫpij׷y 4*@w4]91GZأc EMd݌yVWQWa#.}ً>}ЧW64y  9 5BO~:,]:q0G[GMi#g 8{dB)ծ?&={]PPp[!B!B!B!G܌, #Gr؜eټM* 7'<͙?ʕ-hF>Mh*9ɶ+N,g $: \~5X|vtl\m#B`5q4T}YJuAƲk߬ݺO/.xQ.0WV]) G!F4<}gF~3ŕ-n;l^p֯B~;]Ih _gwk{gJ[ }sr}])ٖWBUWP4}zbա.ߞONK.'0pl=K v pd|-}#쎫v)rׯ%8 KGb^}vp|'OAzBNoBiD!!{N_1 XbP9dt DFFbZ;|VHˣk׮mؚFYx&024TRuKPb;GEDB4wB%Nn:c UJQ[QB-{!?Ji=ġF퇮پ)2.'B!B!B!Rw&=HɄKKTf f`65㧧0nTz`?T4l^㭯7S֦?גCW~;n<1 ӴB͙Όk]nA-xV!@BzNy<;}Nyk\osM\z5\82q lUY_On?+v0{s]̘Z{KeԟɿwftQu˘KZQ4a-oeU3ᜡw.$zvg~Ȏ_Gvs*a_DNtBfu^S/Y}aPX01Cdsv]bGpKor}/'q;[KoJg}p[OGNq1/.t9!B!ǯC~nَRKѰ-eG%#u6}rs΅!D+okK_<,+)iyTk׋΁V'39v939/`WpW iuCl<`k2ʎ@BL"lHmE1y۷_y33xg8d|JghOzFg,/#8wfݺ5</le? ͟.=a*#+=]iJ1yWP=>xxONTgyN*[ݻ71!"SZڶ[CK;󪏿7j S0~++ٙNvQQ?x/̹̙x#o&a!JS,7WE+޽?3WFal+wT8uΑJJJ6GɃhTĞ܎D4QidffRXX؆@t3m|t>݂wP4}GEczo¸I-!=ξ>$6zB} lGXN!+[#|B!B!B!BѾ$"'PB%dv}UOQZ2 uq3 EͮTVJmJrSגۓj(el=]ű9])ڕM5a)m^Fm QVAҝdVgzYU?-Gvs?kp8Buu*&mT dǎfa,^b11 TvTJ:z7ؖVW'gpro|W$B!B!B!B![,J~$Aҫ"}oթ(p'i6yWآ0tPSy{e6`go@]ة*!mj6 f&пo7:`1)+*&&&QӊBft B *u~t4=5SźHw_gݢ*rwRm:=,*ywGdf4kz"pzƒdUҽe9>Џ؈@l5ydl\\=D3†`gz.U-c}UVV]׏Au|}})--??S#~Ϛ1jSش ʜ Z- qt lYh:ޑ8iP/"Bm\ͻ8 J []]SxDbUlcu\y,^MBbf3CdplU9ߛ% P+ZC Y*@!G8NѳMٍd_/@BNxi*!'mk6nDi'*&/, jf :?=}05+)j!B!B!B!B }rx|: ZD'OMǨ0<܎2l]_3tP w3[풓7Qjv~;ovxt cSxkV7RrӞjBͫn艟y=+UKΒټlp(x-p ūxvGKS^=/d20P*y.O?$,r#"=3uKK>ɋ_p`R=3J^1~tv\VOP\2sܕLb4޻wf~!|a ƴhk^۰/l;㲓БKwI3Xj+?Duc#TVVRᅣJ(R`<=e>pÃ72o8.7&Uț`Y=ћߛ(^73 =tr?čl9a;sn uŦ08I=^z'#c0Pu0&sfǮAŋ7FI=c IDAT׿f;h^C{lٽ9 ϿĄfk3?)\ۂ&NֽӖСH q;`VW8i#śYfu]犺/p{;C!B!B!B!Bao<(k#ĉU֪z8kPsڔ;.m crP̚6o=Kl ݟN2hpw[qn_7PlDΰ^ pۋ80Ӭ$r3S'+Z7˓wRNpAzJ"]a>L> jx]O^Noo e/%cVPڠE%`σß.:!7ă`kRF:~ bE'Dzmˆ**7cor{'s͏味pǠr2~_j =O= J)3itQ c466ZV١ø GeU|yG7si:%Zn~x2CcLjgs2tf)̤ы6 }xYe5>"MՒZrt*#Cw7G2HoMq= T]q'+@qD gkm 0- = 48sRkwާ_sCәxRWι' onObp+F_74sZIs(id_C޹#~' 'X.:ͿW4!B!B!B!_apqS[ȷu; UƖXC{~mOx bgTNny_XUΪ_QYz/kL]h_{04&m/~zD1E~5Ct4#g>$ HqZҜHic8!zk_wnj^=>yoWcyBsg鈲G f13Ѡ4qNoWGԺБM&Jcc6kK6t ɜw3̸>,`¼T),]$ @=|ԡi @S4K4 C`'yV=)yc#1k?╅;CՒ˼Y9|*mʥϾϬY^'Ao7Ŵ㏉. [C5f0 C؋q; ψpqSos oI\b{B!B!B!B!Bhב?C*c񗿐ךt=?~KsZ=Zf^`f"$,Yt>dx1?,-sq$ŋHuf#̐ch`O6Դ'"=yWrmdlP5lߝ*UDDSk4~ eAiZ;.dS=pzH ]xa*OUsyj;=vFN@(|zl eASv+۝fVլi-*~K()w|U?J^.bA}m5~j1͍?g4 A'@W#i@$&mkb%/䗭vL @"NA#^ZS[!B!B!B!B!Q 81~Pduy邏!)N|r]$ U5 z]G`zv`b(0l`"&ʄAd ZYU'yh[7)_[ڢ6rɨtdiq)4QӺ6v4Sx4 T;qU[o0 Z'<:7=pVeXnc2d0JYU<4 Cg2fDq"âkM XM7o JvqSĞqRHzkĞNV"Hڮ/ TC)+iצq*f_:G-<-L>!tx:W/ 1aLd 0(HMeSRS+Q1GFiI*r]>|R]UyG!B!B!B!B!D耒Sc֦U7Ȭ5.z:6?4RJjZ}G .jo5yY}Lh)j477;psQrǪJKJ]xs ~\ ^EEy`6ҠѼmxiQAi!"F9 0yA큇Ԛpsk۵Z-{¾&w=qsa|LxicYx?L(堾:MKm!_|w@G%e'GnʛwARP`ְxSQ[@߳yj@l_YFU͏ n6lnM䲲C?\MnqǔVC˨6_L`WJ]SoNkS87އhС}_ufD?0>` lOooc҆~ r7;SS\ٳcU)3y9a͋A7>U ~hՙ,wT؛wW'8՞3q<{eM:뻯-a]hƚ 2nl$HQ9Z c1 B!B!B!B^$&F`-X78F]q'$$R[o2VH NNQ{BD"[Tu/.j]R< Ѡ(%wUevfƢo&H򍥔T*  B'U_TU NƤn?u:n>kK[uV$@ ҪfjJ~jX=NVU^FAfput@a//xy7c(--c҆m0u7  KM*[8 tYx|'S/&l8 _ί8;6ޠEgAÞȭʦ5`_jJa(讯Ot<<=8*ϐ4SVM?8y8n ksU^!B!B!B!8̉0Sqo'y_h!BLL1i}K)0s}N:Sq 8=;ـB??]s'ˊ0ܢ?Yvև>!.ڭ,ݑEvþTM5u1K41]W7ӎvs֒9YlSYqa ٙZP`4 D àM:6 4}%(Dĸ9ԃ䦁QB3I>NNJ#w8r"Gw$⬭3qDY wA} ͇:@Ѭtfb8v?vKsl'3ێB'(.0W;5w#7md!B!B!B!A֗q3%ŬF?=w:G:lF!%N=/@i "zqe2Y) =LH2Z8Ҷ0w6A^;%3"b˸z3sԙM^;;ȱ+0E#fːh>-\v=Kՠ u';ۯ'GOoeٲ& ooo àQ)--0 1\ۅ*gl+4k"\w|Ʀn#z1]=]w9l9+N;gh^ cOY4w:WK7>?V$yC7Q&@ѐBf2lufz&ɱ"pv Ѫj݆!&-Y4c9/i?|Fظd5'Hw!B!B!B!gQ$99-[i8 F[SHNBƮ6B!hK-a |qç"}_ͿEdtl ~B};Z{ߜɳtӸyu^OUߟ5'؄r潺`wXQ|q&rOroE5`8 ߳40~1iwz#T>1+Lt`wo{ٹwKPnr|9//<*׳g氡twJT1i|:Î%$88JrssC׏sa G=[,9)62N|#(Ta*}B}~XC6M͚ xSE ,*Xr1Qaw6a !ɳiNn̏Y}E:=u/gDE3W1!Ju#֣ ny|v,kA҃44<Ń0t3LuʴQ;6/dHΞl`}V '= К/%T!}2/$*hwևSȩ6KHkf1O]5߳p.)o1F9p E77a?Rf3n7P~ݷlTVVRTTDHHQoQQ l6>V>rbvW 7͜5s eTvջ%2wQq-}~u!'߾g~}vo"$;®߿c]s 7 ;{Gx,6oAOqDT;K ]y7p s>Eo=k؎A}#əS")=z܃#ϒm(W]l g㢧xB݁Y9dG\jޝ1'.OPnyݲza *3fH^!B!8lzKTOTxg;+g{BURC CH}3?R @h~f[f;U#՜s)Lw3,ξn& Q][Īf[?QdXZ&ը`MMb~=g0i|Wœ7 v'^=6KLlc]g3ϿCY^se{Fn|.Na֮>\߸^o?{$v Ӡ&MU|kI~JKˆT57x:^ 7djM&?)hR|뻛f.emk*쯷rf@uos͵{؁ݹfhS6E?Ko&$fe z KO;U8|=/7W,MIxptpc6vv/惧zk!w\su7},9#ަZkKD@Im.gp˦>ĞHܻݢ"k noGyf2k-l_~ W^4~ tI}î.dӏ?`"jo\-q)DGvod}=lYP؛—ᡚ܎ 1CnvF>xx97KNi8|JLY]!lo >S@ YyK紾I 0,-{?gk')ItM׺®a7fчCll,޽ |}}x];c53Lͱw #)8#>;G=oM/%qU!G&Ug߯7:{Oڋ!n`)^/r(߶-j+JڊE̜:o/Ǻv&s?:v-k3O֡3JX&19+2m J1lӓSG m`zq[^S!%.rkUp  /F>ȍOΧzm#!!! >>Rk C>1}mQ= GXq+ = *&w6(Ww؁ф9VWPm;)lQ >a$w@|x~eٺi 9?Ew{BgmaƬrܵ+m"qT}z爽tJ 06ׂDCVV>>>tqTzQSSCll1HR_4u$!ԍ]Ujv ]$cgeFv%-$SgDkWRYxQ`hוΉQA4o/n@nR#ѥC,aNj ؙm Btf"WLhu됛 ~ DEE9>癈ɮ5>W[swd2eB(&6y<{Lݲ_#;{]X[Io^"mo>΄X+g/."&"'6Ts#Q1P7~֕kg{jYl&v_DGߘT=eEzpŎ%5ށwGXWl|(ܞy.y䪇UgW*W7~FqpoJ!d>`lGw;Pó/vL⿽LFm,)fw};]s/_Ew_B {xsyѾjܡp+xOp};~W߯_=!ӳo;F4OQO]y_&ɃfX0KՒ/ɩןDu}o4~dM mÈ$o) umȯOAApğQvC+V1--/=$vU4y?aRΊVPx(ޙƲiڮ)dۚlkY`d*sYsS?'u<o_kR"::j ٴi:thPeӦMv…ሮB-5edD+Y8Ρͬ?&%""""""""""""""csOՖSv:>`!N>>6ظ7Pj11]|gcEE<-#oQV߽H04MyLyg oߔBg3,hX`kSo$d3N ~u*8h? 2=7S;/)_HR0.<#>Q 6c1f¥MVlzڿϟA`%DW IV.>~ahQDąջx^.Z_ld՗s7FC/-IGj 7pNj߾{{,/.㭗2 OЩL-طcNT,_gi~ÙUgxePoiE_SɰDD]rtݩRS 8WSi\Z+-˖?夥QYYmۭSYYIZZpWDDDDDDDDDDDDDDDN0V/-k ׳ 8W͌fȰn MOW4nIauXsr~Q3l!̠^tILKok_4ϲ Z4ScdxV7[~s՚  4]LQ =G#'[==&6Yؐe 6.BjVf,o"HnW9#/@zfA㴘Ev&J-0c 1mˈAA_ͦ^Bʕ|C!}bxjד1ɴOpNaSd*3w7S.bќT}'9 V!:·jڑmN\ h(JHVsc{6Ƀ&M"̥mE 48ڑ wqޥ}/u. ,dZAfY!Ca[l6[Ni aBՕ̛M rldWA3wHL?J;DzGTQ&6ϑwl_R>]iIN0w8 zَؔ;>~|7xl!&ԀlX["">(*r|66ÏY(ڪ(j!@--ښ!:0GTnKjKAԦcP\T3( Z:O`u!T)*,&30}YO:ӋbE`[-fWikBxki6jca4UZ<ͯ kjhn;9FA`*ۍ8s$~L#dߺ٪Z,0H 0qԏPaWqװ{IDDCjWR cam OfYEj8[?>]Tsgqt5awXZx/3(GB ,73O׵ _֖Br &ڷPU>yXV)%%·So"%00@^/x\?AAAp8EDDDDDDDD~233O||1Zh<թ gG ;lhQ"[芣 D|®M5vE{Ǐlh*JN ,6o0wO@Ԡ"mobՋxs5ۛG9;3-lm2]J~ǻӨ'7v6'fZP(=2v!AT%aլo" =STv=L&v__惽im/QD17n-"' Ahh({*""""""""""""""""ub~C L>~䴠 9Xwez+3)9̰#)̔ EČ9&X,a egl@EqzjL_Na#~˸xJV[c .p8q/OTU˙1/1w9gg m?GȦƃfXa&7\vS 2iE, jWNo8-7#2g3[m]D~ٚHDDDDDDDDDDDN"iMQQQ-i}6߽if(CoX׸sok*}$rhF0b9z"w>&V66n.ȾL^7 $ȴX)ٯet66Y>`Fmq=pAz8suaMίyVP6} hԽAPr _ d_O~Ӵ,[,*0p>Q$`νA& lͺ^6@ ή|m5:0 n*lSۼ gğpY] mTMمΏ{/Vr[[fW^3b^Vu*D p Sb|q竌zvPPmD.d~ X<=;F'{y7ױy}:;˱\ŵC8}LoieW>?V.gCN  =׳.([KO v| M=Yxk؀7\l1<mHϨnkJ1`dEeAt5\ʟw̼%<)09W?IXG>Xxbr=2qù!\s7gQR7$IA5߭i?|6y?pahFM[!()=H aGEn-|G}>Ж&m#-me8BN@P|M DHh9xwǓ+g!&:n{ \V5H${v1ض d</ZbWp!f'"@2M/`lQ93k{[_^zMD.fs8od "t0 0\zzmV7?^bIu*l*ر?wz!3Xr" )$^{Mi+~Ίfͦdu\4Jم NQo/e+q\kXo ^aO;ڽn^ޒM|9^-6߅n'qYCh֖!m;FO6.[ZkKD~yL=99p{PP1 [o8_9F3ICnn.~~~WTT1쓙YW0>>8DDDDNv~UUU2dѶK'"3=fs&˭tԉmcs.(g[젠0 xoLlckmXom)9[ֱnGi!1@'|vnLcKaAK"!:`MelNBvydfGӾs{#CeI>oe[V):6.@G-9ذa+{Yqߡ##pԔr9%%"QAApğQv*DIή)dl9wcɎuG0x5y8.Z0UyXy(LI3_"9՗IbѶ#즶 p8D<9\ DIKh9i9DDDDDDDDDDDDDDDDDDN V6y (Z_}#"""""""""""""""""""""-c~Ty~=å@"""""""""""""""""""""rR ZDDDDDDDDDDDDDDDDDDDDDNZ DIKh9i9DDDDDDDDDDDDDDDDDDN<^ ן1Ru]BwgK^{ ]c8[m fۆՒm""@2sݛRp`?wpV9@+3<~zzuΉ/ {'ga G8SR,%;hMFH2RR[jHԛ>MvbB&vcvNep2ca>uk0+xlށϿFKf#\j90OW:^0^xgnA"w,t]p;fp?Pz&EB=V Ee'u?X\5YGƌ턋j-B<lFix)~\\X9L&Vo{+eQB Լ+1#I * UE88jA~e'5L0"UKo5>u6"rhAIljv <޺\i2j t0QDDDDDDDDDDDDDDD8dNw*!gPD},c8J3zپx-iiY2f+΃пK!jwgӂl(43X]4mHfY˲Mΰ6t ܸAvGЮC ~XΒ&pԣ?}%QYDU,^2HNҼ-[m%zćvS!zSv%6`99ᮺQcԭ;{SHkכ}:[FAf+/' mX [3ȮS1>͏/ H>Kx/fm96f2gW5=f9ni{lix8:0vl'\Tô^89hK&@9l[%k2)oAU?nѣ}<~U%e m 2ᰮG&m0tp7Ԗfe,ZMՁ&mBIiƕ,]]h0:HN DⰪ('k&֯IcG`rk@r?k\`" kF+a[XUx @N/ՖJ9_e"O\ ]C]? D;rB$5(g)X/=?fl6@~$L[4+a[.O>1 q7nj&ΗɮnWR 8{_3gӅ< 5m\ŠC aO[ܾ4\j,9# Bfҍrd727.lѮ=xw‚/X^;3{'l\WxoRo)cn3X| FvØNJR IDATGqu˘6EL[XL  %墛e(wۢdt^{%f4wD⛹a 0σ% ɇ?71'=u!Ȭ׋]Co2OY_p:w^:NnFΦjb>xI]VDo1^=Hg3mN>*^YPZ5SCq o0L~/ Wh[ϧ "BHr|ɮt`pa66a8#:`[^jٽ2O9 b("""""""""""""""VO[ε)MU52SCLf1cm ~ Drs9&;w|_ytX\t=%6IQ9FP[U?!}{E^ܡ t7=r<Pu&:z|(=A8=;lXžXRឃhF4-d dx бq<~>[;{uz,.æ2s9`SVo{3Ƈ5]uf1'IM wlAL#-!M;4e!?`mCپb+Ӷ+ӟ6=9u@ qͼ~vu#PysUB&("v]пgx"'V DXr|0~?aTdL#M5^Y{DariY Niwwܿ>ܗÿ/)>`i~LڇɄxaď]ɔ+ o/fWu.Yw_OKvRѰ^̈́{yDKzŕ5GYK!o9ĎKWډ{g1{ t砎AYwp$|lne*~Џ|:?Ϣ?dd|]X\TG iP HoG/ak]go?~s6zp{_w|KqAuTi΁]ҏ@bS `O}ʖZpw=;MO3oVܹ/ܪיm?ɋVK+=6 }{6i2 ]wx륩dZ)#ZoƆ`b|y#lf[_rk@t ֮pn>x<+V7L=PobU f,4oPڂ]off6ֶX HV.Y󘾤p'u1 ^Ό'CYˈAA_ͦ&T $Unkד1ɴOeWQT\AD k8qjEj i.cX DLnоF`8ܭ>pn×(&%""""""""""""""""53{.NƸAxAdPp'62,ien U ojoqmH-bN[D1w}IMW1NrӗWבԙ~ؕXwFs OP`#ʄ#ҡS*D7##hpJDŽ;1)w$2|fB`&7P*f4߿:83F WDb‚uƞ` ?a z|+}OMԑĘ>kO!auz ]|Z0vnf &ڒF}0<1>eѢ]]Zm(fWPZq0ԋy+RBq`^K(,?Wp >prʜʹUWҭ_ NO`Ϟ?b+޵ٸ?6  ZWh[CM4ď)w[ (ŲÏ νru& /KtZ͚gfCI_96~`2]؇%i9L'OJtL4ڊ`pqcY[呴m=>A;kJ/hοkUO\ oQ '.]]K# i?mT[.?CPT41~6l#hb" J]4qHnU,nrkZΙβ4=߯7 5d`&lWK6fc̽B-Qsq=n靈 dpL3\g'c'emǦ6c:o|тYN04?]]vy XUB;p(` qeP(OgꫯwQR[I+^;a+V.s-~CvƵLrveU}o4t猰]/=;mjmٛ-kO?Lxs$>/sG/&sZS53 W~#sJzNhSH7'[N̦HC'E ]l07 ]-#yeZpg&ǟIX⏝ v-Ilj3C]l0ږ~ SVSz.[-Y% ONer^JQ~5jʩ!&v:J|UO E0h_Xj0u)̂p;s1t] B݇ g´YdF'`BN6E C)n?UiJ[9s`Q_E2u|η%r Zb_4! :Ak`eÔﰴ^fP(!WyncWX{^ ;w\E ?g_sb.@z~#~n'\6s߽!~<{P~7#f"r yUub{c~ q|^o^u$gҖ4S#8ܗaz͡]_Log-ৌ P: B}.gPt>6~^JK()STHa3~ʩ3Ma^T哗GaQ,STmi,5<;IJD1aS4az!_4S蹑_V^Tsš۟=.۳2PƄ<:saصl]]ʌixla$}}1 NG^SU-gƼ|,Lb]YV'9XWmc+|" 6e؀Jkhb,p?+GG]M 0o*o:wվ$K7wy|\uי}&Lɾ/ҦmlE *OQQATEī^pat6]f>If)mN4Mڢ9!3˾{!?xa~Cـ񻬯BY~ۭZm l )6}Vg>IDEjLC]Bp֦΀AEwAg Ktͼ<9 йS!D'g2}V>s0;/iiDXs &GgQ8lRC!bFC gF<7L%<RX0$1N𢤳8pFEEDG4)Ō$"ǚ/Ȩ(aG9ITT!882א" v80bӲɛOalffiefs\9C13Gэ=/0̨q]ӣǡP*/` ,)LrgΦpbzfQcaLaqdΤ٤ƌc wBh&%k: )̟i;{ 섆Q1"*IOx'Cΰ3u?m.-D$7ktZXJ3BN:K$Ig0-ىu B!B!B!Bxطa=ᄏmZ > ]|S1䏼J(9|oGk ^} e ɷǷIfhw; jz|KFӆw8ܯ ]m3 jNl>;vt(!|XAt3/?'/ˡֿγd@ӑWWn?3頳1sm|ד2)I eU%]·V:{^8ڇd=?7~F@e b]*\~mK^p?Jp̆Σ~% 35z;Ʌ_bЇ)%\1O3?vdXFOXn^7pq3P~ 7:j%$kDӂ̜.q/]1˙A9p4eG)ġ 1.X&snv4߸~=%-gm7gUDusd4J|<% |tlͽ몳2gm>w!6o=k0F5w>QXF~k>ks1ZF3(XP݀l;c>ӹlE! Vh=M Y_6԰jnxOXy4j;IsK*7ԈŪ.Jt.f4JՆqמ7,Á}'ػ 5=g~p ziz~`ka B6&.=.s7,NT6uH^i 3AA11*-Y6i1aPkg :G+%uRd9Gi:O !cF)[k$gB#Fso9R`ڏ?⺠ewQU-⚹Q(Ŭ}u*`LdՋI|B%kq7׹)O7<5<|!>+cwQ9&X(n׽I}.g>S^M4MDg&/Ɏ^QqG~uߛ'M0^9`y;#srWO>ͻIYjfsJTڶe{mC<ۘw|1+xEz,(22Hqφ#Ry"'|kU"3n. T/F5JfzNm[yqs>sjb99 H~DͽG_5tLhd<҈P|oo߱Lm1*{ ÉO&+1 mǏYS[^LmzkIawcƍ8X :[YrFEI#3;ԔRNOGHT*3fgcՁ}!!.!$b1[ Ӝ) IDATX߼~^O0lOh^sZ쭙*vҗ^tf:hz  [Gl!qJ2mTQڍW3O!9JHb!ui61grGQ~:joHZj4a)\jf4>clVIIK{}- mx &D؂C6bY6F w^6n+ T,I_O4tx 65P:`Ⅺ*1i$DXL i3:&zc&Jf:(jb!"!rUu>V%d'z@34 '3ގXH]hnڝ4%\85Uu hRғMd;k Eg1Wd&biEπ52Ԥai,\\ҿ!B!B!B!~=IśYˌ@CpR枤{Kx{t7}Ve h*ކ婧x~k CumNz_APٸޱ7czsp&0y7kzkf^?6 ճi>kʹ9L2>V'+-o`DQT s˫mywq;dD8mH _W5{oa;UEi46|rRRd!CO~Fb☄9Krs;d/ٺmuXp/|/? e:HY6xmFYAMX3.g3Oם|CA9y+Glsɍ$mB҆԰T/-_7ݣdpt( ё=gv-^0l[|fhE{?Zȕs/?O Cu aWz^ F|oczFܩ(0"ԇ1rnY4X9Eٶ=!IXp5+Z:{%eu\fo7nhKљNJUĚ47%d:nNI3[_3.vg >if]ݲ7J³b~ vl[7"zz[Z8F -ylpl(VdžT/䦳V6gT~o oZ^^ym\y6%@w6̱\"|{ys] CsNiw(3GmW >]nnɻWfJc"Ul9XtuMsc1u=3CErd?M =hǴ%Z^y-oYMKay:VG[Fna`hE\$@y++;=%k>0Jh=sa>jv˶!H*ì(Z[ڇl?t:9~C֘3a sGnnZ6#C*?r ѡӯ憑;eܺ<}/mj{Sl~!&16?HӐ:[2 \ʴ0=mojo=>8ױ-l<ЈCH2]UflB!Bб/U)wzZͯ/HT?Ck7Ya?x<DGG_1HHH#B!dW ;{a O%;I9@_{ehNUCM^v~:9V҈}P9Ug!#;PLth)Xvbq$gKUOMgK=O{5 $dN#=IQcEkC5Uխ1daFvP_VLi{əsd*Y8zڛs`^=!I!nBvRSNiMǐ|(h癑LOƮRMIIAx#)X"I&NYE]E)m'.vQTsF qZ_;;x_3/e0/^;j1##k<Ȗ}gV4_7-gti,*%cqHb(YJh^l;# scChf[(f$îÉ*W̓b!.91&mck;9_'v$>fɦ()r^$ҧbS@)cx8'ƘJ&/0tb.&:{zLv꿍61̊e.9FFmh*x%dːuU;ZFVeO|,+2m󑚒ȝ O>v Ch?q`Q.i ' k.XJOq)g`R 퇆ԾZ,%\,IL hwc mX@]UĉIGsjB!B!B!B!&Ϊ"vW]i5BpҨ}-lGW1({J0oido 5y&g4۫(U5Kxx癏쨞ȶގ::&{PB\PS6tsKmh~!\^i֨mWUM(;>$ h^j+U7JWiֈ aPxiGR2h}ՍלbMFkQADR',%} etSs*G1P^$t ੥~IfB WZhTXz@{2Zf9ۉOpvyZ ✌6wWʛ{qz±:i90u kpgb?D>:8:'T3'> 9?!EGA-&i}tuqd9Kb'>> S|QёMAxǺ<:u^C0c`?H"B!B!B!B!⢙@_/) 1z(nј}_˚5=!l NKPkm1р'C#C@xZQ^tV6 1؛)ɉ@Gl`w\A]E{&vWZz :0-`} ЅۂWN[F|X1Z S˨(h>/>jΐ c uS{ĚE2NLdJ&)DGb1aНN/+: ͘NUօ:N>G?GԎv:Te 6GFt}~WZ1:3%XgohWc̚GRJ>+#l^QǸnkDe!\~H+03==w`F10\T!B!B!B!B!ĄLi `߉V>ӍuCOP-=EhSH3ỸTDZX bj #ǵ+^AolPg|`tLrxp۸Z7xW1]B xo`Yg \N`-L1N?D/m D/mu2jĪ*3D K+lYÎ )_S4._X h ׇ^ݢEaXgyph'(48@4̦kfh^'& >4WM5Y34y3+hr΄I~9y&Xzg{/B!B!B!B!3hǓ/d%j# x'Xh'p\*G QSѽ*4Dv9˙ۻ} vGFxW/ )Crv׈6abT!1{e{-L=ilX&!=o?=-Ѕ+` [68gc-~U?tL Vs]~D=\'g -(ex&zj]5tDZ'$=?\s4풿!B!B!B!B!8?$=%-|g̿j @1 [xT@NjJ9_g@-ĆBτ@G6I w*ֳ)VU6`Q=9S;pԍֹ$5`kbfӃk bf2pAFwF?&=lܰ8mGMcuן˔8kCNј@F ͇6Do5`?: 1ٰ0* 6& HkjcpVDPWdک=~~TQ>Uq[bE!j'K"Z!B!B!B!B!qj?ײfoǙ/~P]Ds5.xW5_;7gO]AֲU,Nu(hCF0tAאךo`0G^ 1h隱cxi=tDDz܊=P|F? F4u@o^;q}ym45ۄ6h :NQm? af1d}*PB榭Z;]& AB!B!B!B!B1!<=%-|Y'x๶_VT]TwkD_=5U},gsnql/M JX'[egu/>X~mtNe;хO#;t+vӣ: Vfb5!o7lfmi9$[52SM"ŠW4B45v̶~>WW I4^^b?vU1+S=k=A 1#tI|5`.ߌ|e[f5։lbeҳuAuQ@1Nh>da4w=KHAah=tuq1A%,Cۚozo;CCFNЉKr.vRB!B!B!B!B!'.Z  ^-z/?dϠ(>TM,|!#Ò Dr3̼SƁN(N[yiă !Ddi y[}.`rJeFp$MW|ۻl&Je9E+.aQFذyۓt&Qzм+h9Lǰ'r1=4PRIu` ۮctXSXp,b%ZMD.aI Oʺ/qAQx06vv̿Sxcg.7U%4ܼ/%Ls &IA@7PGEQ)9qؒYtiuaq8 3k7~W)ƨnSqw؍0NVNE*{m$}AfgW~0&=hb"mj9Zcgƴ=Z~8Uф,ຘlSMEe,1.빎[xXf'2wL~Bxt |';zG"yMkw^jnbqtQ522B˜v$r1"p:=* avnTZNT">F|hPo}N 4+fmKbimϏE3|B!B!B!Bqnt [Oo?$o5 )/0y%GKe|hV};|0UmFDaq̀:j+jqH@j\KffbEoZZGǢQ{=+,7X.F'͕,dfriv5x6-ٰEaɂlbV"Y맽l'l8n3k:z@C(ގ%YcNa.IBznP#qePǢOTo^`lg$X 'X_fq[q7c"Sbƨ=qȺ,*L'N|y |l;qcRm-}sB5W#9p9@tTKEi =ܹzkٽa'ڒ9dD99T<-ٱ0ɫ=۽ͽ3I%"ԊɠG:e`0v3{n>YqvBc =uh>Opp_5ݓ~B!B!B!B1[9d!+H2)07_`dͦ`b/hX]yTJ@uR]TEE|u.i<&؜l 4Ϸ/V`pk*( SpahM=5[bGtذh~;hUnϕg_7G3Gl3@{>֗I#QA{(.e-;# 0(*:;qFnҰes1yh;3=uNDEA[{/gvD?Xp3 ͈.५Lwn c]MëfG;SwMuG8D0U|^:\LZBJfx+7c;Eo}i~T?~ jŒzTo\[y,H,z4ّxX}^7+IՈs{`z/;az63ihN_աzY#ξP]'2YESk;*m4vMlΖ:'wPshtO`t5:*ޮV.AMh΁^/P`z3ꀛph˥wݴ7i?N:阬A H4I; IDAT/Ï);ȉ{:h%B!Bq444MBBO:vS<!BJfo>.-}* $8Q2B6ihO _G%uT| 1 >ܭxN%|RV]x+7$&_!B!B!B!BP9~ Wd7Qߋ̣BMZ i߄cx:[du=.j_;i鿠J@MC΁^t$^!B!B1TT~B!㦳?s1gmiue;)9ؕ5'hՂ63Epq!q,.NgǮ| aI9$кk)t ! Yz(įH(X’iDYTm5ݽnԉ9󙝕nA墩GVYZ!$q sI fT{{hoiQ6  bOV6.o}P-ed"-*= ڼN>sdnaz5m> hE '+5C}I-]4)$uh&ƚsd%9o.ӓvXQ<4UfZ#z="CQPrg0c`Ho m+XL' *ч1w|'Gb \q;|-gcpGSj5F ހZD B!B!B!B!,]x^>V0n ~vmb̷Yda7v߈w3I0Ԧ߰g9V0?qHTO'O'|&>0q;91"4. #?ïNG5n;yE*!i*O^@P>gCŸÏOdڇܝ'˯v3} Vv~t^ ?O.},hic]Os#p#99e vW>$]~Wy߬;='`,O7|S1X.|R5N<%~XA:2!J~^a_{{L\~׃|BIm_{\ rR6'Ao>ef׿oO#x@l{\%$56ÈYWGZz2>0X"LX~zlx7|NE,9sc kt\ctbCtgԏeK㹯s~9ψmswzuf`{__4;=G}7yKy_~Ő$_,yo3_>_Ze9Q"D5k 6 3ih^` VzuTk+Ma#K!&$%c禿fqQ,h@y^4oz&4u&nobڥB!B!B!B!)Bz|$ NNlyGX㘱J&aPf?}nvfn<@u8R Xj)_~ΦqdBfǾ7v|/[A~|8|o7|l;8:16~moalGYS7Pg<̝JЃW"XGWD(߶jqlb1sN!!/Ǘ[rg+YCQ],b>ɡ9T?Xy5vfY11,҃Yv'89ǝԮ @ӯ/%ƃl|^G2˯dQZωh h|5ڒz^z}o~HFm)ǣ`>m$fI>[_R[`ݏsNZgZ0R]Nb|;~Y[WRÀFTL,OZB>n~w|̟#0Jغ8 at%l_|ܚcCwQm;3U+gNLp[Tڏk|9>M]AQ0W4޶4(mqL^(\ADđ-9VVKkw?X#Ie̿0q]Ogu1 a cYvzV7EN~uy%>ƊfjvŮ&@w=na72`7N%!B!B!B!B13psxov23 ?XsMr_}&vEe[ԾWr_e3qU\ۼc^<]Xëϸ-'5qb\40fW Ecd uїse.=fӢkYβwy'xd|~f3os:O |?⺄De<h-Ӛr!}^JGr70$a|]/}kvϛxϧb!>Pwn=I-}{z ].W'L߸cgXpռ|c¯?ã7$\;xqPm83GΟdqWlM̿,wZOܴ~nͱA>yXϐ'>KA-| ҸlK\k <\Y%+yj R["G$<~s>7¾+ŹWLt~sK;}^,్b{_>i\՟Ra7_᡿pRqÿۗE(ۓ잪ₙ1/Y^̺@Я|8_ `prc"ah!&'Gnx!}DCf f'4@rHݤ$ -B!B!B(& ӘY8 Fbt)d2~?8O< fNr'!BL.%t17N@{)~54 ~?k&l50nQP7󛟿=$ =WOF:ǓSXQ9< ӫ>qpQ+8.&X2vl F>"ɦ4" .~/VQw5.1ѳj37O_K+2-!<Yr1=ͣS@Szsr`#dϳ<Ґ04@u^K |dL<>..S Lj!ąW4&|!B!B!Bo[>Ǯ[Jӄ2,ww7S~0_~#E2s,$BIc[Ȝ*XbּSG>un!&]2s cСҵuv|]+@؉Cmk-9qJfcC8./vsSQގGTHglE kQ=hm}AGEYYY6H[u:X N┮ Z|Ѣ6Cl7FQ0Nj5]$p֔{66քP.q^hbbdQ;J(iR'.> =(=NO#јBFڃ[~׭8Бlim3mFӖMߕOA, V4֞O0_x ]j):]L>ͽ6M} Pņug[4+h ˾ui 2 e)>DS48viͥ8wgB!B!B!b)G9!( D[w?% gL a!q,#{o$!BBtuQFyK_аZo'wV ~Ŧ-_r6PGcphi~ⴾ85r蓳ɴ*yPcq p'ZST,=AhCS\CK0S@](hnzb3ֵ9o%Dᰙ0t'T G(楪ap̬d궐ZbF9TI4 Hcmtuʻ3H 'l@S?dgwv|FH&dk"|@ &Mep%BPH^UuXPm>(jˁ#o;fgjz*hrb%O ^gzK0ົg-Vl1F]D 8=o5jY۳]!6 ȡTq?]t.jj{B!B!B!8)>8eR*:_W$欣0m)_-+TB!D'hޘrk]N{&AO Bnz=< ?bĤİ!ćxbLbeØ6{:6q*Y7]ė1 OʐH|=pY 7z^YE1Tʴ[ϗgaUٟ6/wE9xutUwie\5,c%>w:k̃DZs|CQSk;h ApMΛ_FZA-s7 M?B!h!B!B!B!qxb- Ml]Vl&P<I #}*j7-*6*d,` fИ1$Ņ4RUκUɪDjKqqAx(՗SLa~DذhTdӚMtoOt|(^J3941jpG`pTSk#~ϠcB!DrOeZo0&h/h _J5SZCJhD(*{PC=x 9y xGe¬1go)9`(ݺ/. @Tθf%{\R^pxtaW=zt9USbl7| E`' પR⧝DV#O}5 mRm~:oת)tcGKݽU8k46Uf<TwO${qNKt0'Tփ?!B!B!B!X쫴`400 DMdvR0Vu_UbD M_u=?_ýN%ڲE)H!IbW&U0=:Ģ»F ]lKoD1bQv!Ո<"u.j7𿷶[~q,dқI_9l{DRRckל/Z}:6j_tןdj>:ˊ 4n#-«Rx'%ްі `DA,3putQ@ls!I3tf;dl5i Kw'\vABY '2€FΖ4jvLB ,=)uBߦ'qa߭v$} !B!B!B!h7E.IFkoh\w<g_אWxewsVv2GNDo?mezЭ yy!8.<v@[y ,[_}ʇ~ˤSKщB!~cej(ΜUǙ`kYp5vML.?1mj.?޼iҢ=WՈSR #mό1 JL$1?rE+%ߩ!d7 ASNgR@7Dr4TBOS;P:P|隣kclng2OvÈq8oELqq :u(4/ IG$se8a@ϧaJ݁ITݶ=p&'_ LI13D^u&zB!B!B!8ey]: ċygS0,@kOdh z wmW^σ/͇;/>oz :@N?}CjO{y[|xe=s@z'{2 q !gV6ޓﱮu0A^푃kBfU?Qft}ﭣ~(c=Kz28y_EB!EΗOZ2.W'37n[!a >(jV}3R=Y'z>N!gH^GAQ?asyҞeυL$ri3܌ +mV !qB*47g[(Ɲs Sι{Qr)nD31`(}1Q>\c{sE+apְs oY[_g$ f lԯyO˸xtxrn8?z1C'r(2q "2>@O 4z2륌ByOɹ. pc+"yT9_7gG>I xot~·&sNLS~ײ!l LLA?s9ОlG#ߝ3!OqǴ>$}| 2+C3yC߸p|*;Ig_EbDn}s7\4&=|.=zVsDߑ\G[OF ~$ Ï|~w:#ϟFHgvPtzNthd'FqC0*} ;ˠ0<W\~ rtuWu !0:ɀr;=4o:WXZRZ֜!ONp_ ?K47\ Z`elb!vhFJ6ͼuߣ7,߲Qՙ,m^xP Ea@.8_6])˙ oxyOī0ѩ^ƹW^Y̘-qQ[UK}m)3''ѿO С78svqW2}͔m/<mC7]=7q@BO`F"f/hǮ%ge߅3L`_@Go crVWֿ:.$ %ϊѤn3p0&'#ss\ޱH\DSS۝B!B!BvA?l==籹PODwy}|(--j {x ֍x30?$0hh2IPʕpo6ȿw`."E^Lk~Ü?$7^hf`׼N˹g[TNgwԴ~` xi}abdL=,vPj)\q^ -;oɞ%3xkb{/uB#F~C6WTBqm466FlSi(a[ZwИqÿ^/a߼k?Υg<L@>r33)kl/FoB" ' lvfPsB7~.jscGl b04=]eM=X%TdL3 5fSd7׸8F'㚏r A}Ii$+N/Udo\Av'Z} ;7DxgĊT{^ZOm}Z VSpt8"Dv^!h!B!B!B!{:uxf9A*~#2ȴ5GDyMa'Sg<[΃ޗvQ|ϫilZiB!8ͥXpVwsI:?c7<9,}N!z\ӎNB!B!B!Bn`&RXQR`_0XR[Amգj#k}q>1y0sDM: zz;B! jt*?07`L *<7Aax Zf>xs2]c[ݯpМN*85$h!B!B!B!^ uOEe]oGXQ_|vSAC|gհi]6A=Ǹ͵T+;e!4%(v$%B,ҋGȸ?)^3z]s,A!1BiG' D !B!B!BqS|cYDFa#nb,?,(0?>ӊԉ4G<4䖵jK!pl(pЭt!m>ȽMU);~0?lߏzn x)?ҞB!s\'"1 .@O' %o#Q*{V̲_U*WqU !B!B!B!z6./s9ߢZˆT&)7Z^odU]tߘmiqWGt䢁_=ݯLw=?ѵ V#"ۊfj*($Ђ&_$&Cc*w=6zߗذZuy :77*E!88???<<>>X,L&Fˆ餹&jjj_MfjB!B!B!B!BwtwVG i I]... Ltt4]EjbZĶX,R)Z())LXX>>>vyٌlˋ4MfnFHHHOB!B!B!B!z@bL{3 _tS"Eéz1pD CbB6T]B5.x?ng<ݶ=> | mb!dF 'ꤩ\vmeGaUz1hD #*4֔SVYѼw!_eCPlDL$ѢveDɟ~)ֿ&)Ŷ-ɫq`)# %d5X:v4C1;^V%8`bvep۞73d[ąbQKp<&\WԨA~(xE'ψ^[@FnNF1J!@Î|0fՇHlt کbk _']4XL$!E&on캑c8a"8rٲ|)krj[ Cw0zԗk2o.@AC1 ƓzJvco[)k9_GAQOcɪqw=R, H"y`<}B|4j{`FlȦ0Ops>*D$ b Ш+elk}]S@zHcn7^G* $ K 6"W}%EYf3]E巧Bt;-O ɣՈ\OMy1YlI˦!{[%%%(a<==f׮]l q44|PU0Kyy9EEED>} V !B!B!B!bv=>9-(6.xiIO!Φr@jAר57xw Qw.gfZœgÏ5Zd/q &-en= E-&y }ӵΎ!ȍN ƫ#뇸iuXM\k\byԺb\ {_H 2ޜn+o>ĩs^Ɯ]3γoػ '[+mD^O.;x\qss^:zWþLĬyuV7Sypq3``EOl?\?ů4qu;gl#dӽgrwAXc(/-cx0OA~b$-Y*6?>ڌ] `_ 2y?O',8ŭs'5sUWo_s `ǰ ;kw^4}o䙧hmEa?)ʭ'j-ҍէb'8{xx7YŦOals^a/|U]E叞)M*}t1r6)~܌Vˢw/a-Gwp%p{EB}<8|].++Cu{4 'AAARVVFDDDAidffR__l&66N( AAAx{{Mee%MMMK(Z!B!B!B!8hE[æ1.Ί^˳hc j6TC|dz7+ Җx j\x%2>u#N>8Bg)ɻ9^K~cSV)f[IIIivΎ!箩a,]]EhDƘC4:XwE` Z!kɔrWȪE4x4D׹ܘ}&r]#.R>.nzҿxXNID~:M[&%udN< FΞM? 83?f7!eS@<zGO@Ϲ޷XU:ڙFx~i< @_w24iJ}Ӄ|k+x љ|uϝ|ߔsOsvlSoxd+߸`ax3f>:wMg2gYݡs@̄IT|kxO7nOy<1/x߱R/_$Ι.K?+1;ƶʶO= 9|wV:0OP785 =]}< uʺ[]>ߔ8f3t6B!B!B!Bq$s)x>S½Z:zs`8SwY NP â+o +s+5o /wP<uo1!K.;X/|Q)_mTln$㣪;7݄{fgw{IOz04nقSW0O)i5yɯ[3~@RWϼ" SsXۄ0|=ZW#wbahr-=G$Ff::O`3@-:5ɏwme^7RU݈BI$wǑi:Za{uqqYT9ve/n:2,MYd6t2wL2WblojngWF1 ư>G\fϑ:1fut* 2"ylvr<69tP5:mMt7毩u0GC6r\!׮}>*4c_Oۦm5l (zkr~TC:۲5Pćww^MU!'j 8:&(~`pc9 `BB-hZa^ :n1ۂ4;WַzC]xPTT@XXXTu ,, Dk N!m9]l^Eyq>YV؂Ck@7 FB RZ} ?F9inj^YFa.v]w_BKXz6lJcWI}wLl+=tHtB#Rzt&bzԁ܋FI~nΠS,0Bں=g^Y†3T'$6"_O3FUeO]WQls>Dok7W @cdJDlfvjWa4RXZ[[~ZT 'fZ*dLKeQAߪݞ7W4fԱH #NJٰo\A1 ί s88BLJCYv줠2/$-v*'2=d  ܱݎl&00ǶHYYvZ;ޘb0܆} F#f/w`: GF!Q}4p;G:ib0X۹8B!B!B!BKT|P43nxX,G{̵y` w_¸_&~l.G* ~ϿaYvW:;^*>~>PAy7:On?EDb"1BF̼t'[Y{r!;;Ԩ`uk{.r8H=hm KYJQ:Div8ڝ7zF"Sw cODQOuUMN4P KQ1VюS7^CEApjP0|Ri[Lq#76!yg^DLdR{c~LQ(_3jnyDme5e M85<@U{k3iI8{CvP VO,5_v)8SZZ ç( aaaRZZڹ@>z-#þQ5`@b <~7a7z+SlTp5TuMv1BA5<1d*_B!B!B!Bc־^o?XDޟ:B ScĄ1$ ʠwvtMێ -z2y+~ĈI;"aCČˆ1mt^m_e9: HC~ą{jY{ -.JV}̫cuF遡bdv.'ZS]T,>"Ό_ey\1 I'˩LәmEӦi>p'p->uYT,rsr9kY$&Lˈ$ G͓)\0h{-k#8\.jkkQU߾R[[`^CMM/J s]=Y#B0Bן GXh Um^7܍PUYFanjbT KDQ,돬QB!B!B!Bq,Ө,B#d'/_MnP[[S=zIJ2~߾)3H `ǒU:;^h`@Y7w˞y9/wP&:Cxh~&nHkCUKkhWTVo]@HPЊ䩹MHkyUWQGP{ C $8Pt*qSs~y; Y3I3+w!}4$N62Ït7W} 3\`?OJ蠱e\tb >C.,2^$PL^դljb*Ԉo6fp"њ*:L6BÃb6h8k(/*&_(a!zYPf멭*\T_w5TQY^V"hCuX[IQ~퍗ɛ_T݁&}S`3+M5^ X ڢ Жm[^F͊٨PKEI! >X|Q&j8:y.t%ݎlzeTUۛv;~~~ݴ%]$mTBEۧCPX0>^XF{%EEw@JdD>Vz[g׀۝S(Lc]E9;斓A@@b'Yi)C/~^&WU{{>{sSj9qTV:9۰U4G5ETޅ` ⢡fP= #fAq5Q[YrljB!B!B!⨵?TJuwTF1)cϴ=?+*PfXE^Ƣ:߼B =5`PXIΎNŎtJd˷}Ag C=6{k Y18Ao)qz4㇯ [~Ě pjzuBͱS<cOUtpTyf9$~yIVN'aZ8PÇ1,D\dgd]st~+3{4Xd'M D՝d m }UA,K5`(C3\kx|m;Ap0ICP29qh$b%|HFݗL͎}Q&:ecrC@)Ȓe(o*b Q$!(-\FIS;œ<:~!V] y;0S &NN[YR BOjYyJ5h0'NU+`ŗmDTN4М/~2xz0' jN|[H?]f(Z/Ng #3c|$g6܈sv^Og  ɄIƖGR&/k]X&1؈1p|GPeKE Rueḿ$CR?m(ԛ(ߵkvQ%z'VC3&mp,.e;Fngk)SFG}"5ԓHjV~c,xG&1fT^mtNnVbsaC[ØFԱ= k5ϝ5x%%-B!B!B!SW[~*Pf),9lL\|m]puO+%ߩm%%9OrJ[v4t&t,|TZBc'_Og˹W~;b<{ ^&[u`U|iUtWEehĢFRY,7zmID؜*?yt=u(nCMN$5oqʾ>ڊBEp > DUc7^]hFNJ u#588lvx֯g:L&lL$_+[w9&9VtKEcl)?#[1c2ɌSѝi%6ut? Ts$tZť̀ F GP׎GR5ś'qbr4&mXf koaGN N#^Z>Nd_%زw]ր ^}3yd$wZHI~AxDe~[֯5H,^3=Ӈjj)xf%!ĊAk"oؘݕ(xYHR'ªS;?/HQcxD2j(b(ޕ5kYe'ftV˘GYkZqÕ@z#kV6m]j#hI'˳MpɔdFCo死{ .t*Lt '"@w]%ma244$O^ȕ4[[X&NLXZy0gڲzzUPY݊(O\VLf=;زy+;pxJD5xEyspnv(cm;~ q,\VJnu562nX> o Lc?|%YQ}+o|#z,~k' Sɼ}˗npA }*``rz_Fi OwdpD 8rM Ȋ 9uM}wͭ)&-ٞ4*E}4,pWe3 2b o"'Vώujuɧ8%]Ɨ6f%I^>Ll[8`-_|nUr#ܺa"¯K= Yy|Ť כ'bv]GH\Ν$+ge{GwyA!uSFFQM]̂Xlhۻ׷MGF0w82<7cSMωsv"kU,/#&wy[tșiIN57)k.]|E)E,,9s[Ob%3HqX}z8FLHABbc оo=m><܍]hbK{H{t'D^:G^,Sq-HEv{]#N%X8YfsWklye|7幋bI68~줖,bzWYWubx+fgN *¾M-sns`F1|!r^_}M{(+Ȃ+.arozpw1L줵5^VOAYRYCt|Ehz;׿iVN+ 4n>NXt)"f)soLC*:ƛI\<V~*lkV֥uu,w?9ODr6r'78 N<}-}6]>n1 CX@7|3OpH8Lbm{_a/_S z(G&ũ8@vr$l tQ4 {:9 `ߵdؓHOuDH,$'Qi)aAr6yix `n0omQd.cT\opzECiedL[DW SwsӘُ#iJ\{J ߸ e3m*SR*n/c!c!Sþv1M*bF]pfW%;tIP[7ܸA:+73'EYLIfkӐ}kĒWCr5$ IOf6e ]@d/6,04Ŷ(IBT7p8ܒ~L;Q w"; ,6֟ޱe[]YD\Q]w04Eo.O4IZF2sw#.+vX1w*9qD9>4O'oኒ42Yt 짩l=k|-׾i/Ȍ$ \B`C|L0 Ѹ5O9SI-(%`aˤFϫU9[^V/eTwK )YDNɐwS:Y㻸xY)xNlNIQFٚ쎙KQf% -rѴ%1:9p|2&Qd`aְggs#{sH40,(VZ~`~0yV֝cÖAv ݾ=g c_6nLZ*u>o8G{_6||f.Ixa:ŃO5_DpE#ŷ_o⚛3f[cjg_㡁{k5eY3Z){zմ^ssvX9pdVܰLEǮynGm/ݻwc&3ffdN (++f1cƌQ`3u7O猯 Soph"rmIfFjʼn }ĶaҸ驓3~{b]lm9g/e+O1|ΜK\\տR IDATyC"|a8"{زS;&Kɱp?>miW)={y- ?[Me yD^9)6B xXy-l7+gxr\l!6>ͫýw6n̆wDDDDDDD>q;Nx3ϭyt*ݡ}KMM䄺YYYE{1|1p'MbJD⣱nkW8-FnJ,v+{9|&L 5)P'M5Tv`m,zى͜4=.L_'M5iL^Wl&d@TƵݛMѴ|2]:l?a pRPԉIOӡrʫ:Nt H~Ḵ' 1-/=HwS5UޘN$1eB2^w*TЃ` O \b/c@ 6[쉰pIʦt6ә | aRTJ.[?b0]x`' .>G0B~ * .k(w{3, \n79@/5XeqR̛qMt\>8'Gc>Og: """"""""""""""""rsR4P {5Z/= 8>@Eok?Cf*B&s2ƖvO v O!kyN Dvw,=/5j$+觻 [_$xL`uk>)${RfGAm[)n?ABJ-M 7}ۨ.c>_G11t*h {~z.]ΜDn5kq<#*h7QcZO:$hnp$-`(#;Ӟ׈&&z&\~8arNBt83I1hܱ]O9rb]\!F8cm]@Ft p#򨂿.';vL_.;nDFc}^De\Edq{kd238wNLEfYF ZBAtF Z6Yͦ}Xx `$;nÓJjpuHIt T 7Qao'1~5=cϴr#9n#$%-qmxH5΋H׋a`_i`Pv0YuALjγ%Bt^,9{LJH$577!""""""""2ldM/&ug[tTL+>T70q!8*oU`ȿdK[2$=ǖ0)N𑓚Z=]t-0uDO*$'j؄$n7E6G|^;QNr^TH 0;8|xtݎ4㝚SWWixϸ"Om~:LAqqډf\uDM(p SHY6bɛ2a9ofbQpcؓ25`mt_WF!y Z8iή@trFZƈ+`Jm+0řozyV?u[ L 5|igQqH(=Y`OƲJȌ=5,iJȦ H業J w%\>/Wx#,^8!}; PοEtG S6]yPֽ]lr]3 ⊖(?u{&2@G(?x&yg :wwax\awHS[^A Ft .-!D%,)``_΋%=(55!]ǞeY444TX3hhO]VZ93gvRFL,-%zب=t`x Y\#ҥt.,l`Ϟf3c椏"G< 2=eh 7 gT4C1%g_M \[=,S:11p2''?4y,\6Tl#ؒɟgdY,P)KP4 *}&.!sHJMMCDDDDDDDDd[䋅f#ot3gt$$uc-9H5{9 s]{'ϦETl v}'{>=7s" )XI4v $&'c jGRCՆW .&.XeX੧6>)K%~,w,vS[؈O&%E~'e fdcSٕCq|K0M xfsYjź-g^3ZZ ؈IL#5΅Eu6;|xc 9g[E ŹjR;M͝(RH![=Ç~m̸FfiP5`k}::*vQ5Rc|ud5Hrg5;2(%|gZWYCҴ˹a2c7/,c/Aj歼ʹqxRHOak`4a%""""""""""""""""""w>MݯB4f*bbl4qau/Q_¬dŐIqP?mGS{SVO5oCY(HDfLҐh?RK3ݸ5\ZD,e NZVv9D̘Ei-=G(߸]uaCSH&1ckU͇IZz8gF42q ayh߷z3gvcIɊXl X;~j~"Aww7 x<t>w;tffu.SX:ɍ'MXj'cRg/g]tMaGҺu^e<Ȝ0x(Gc6 P|nphKa9iojVow--B?4r u$}l|-%sOrIL2I6Iv.?7šLI'a6c@NV̹fxe=t-\:sJ)ڵ ˲())0 sek. à$#8=I$cu|46qI$4|tvvAEBrhdzgWP  --mL-KbjqQvVzw\MbJqN@/ͭt ,҅79X7+sU8NL!9. 'z;ZhW9INaJ|n;uww=qT<:NXu @t?u?]%55uk:ϕ.+m^uOVlD$߽V~uS1r16FdKea$w>9k;u'"r>"!r|Or˖ЈVzZ#40wP2|t4٢F"J}(,䧳/:4~?:tCb`` . {i;AB7=REQ~DFً`;G.DDDDDDDDDDDDDDUĬY٘1%1sV)O_ƿ=Rf9ib9 xnٵI+ɬbGzz"}2 |W?FvvNDbg@:Attcs+dggC__#sd|>Cvvvhز{О)))B||<111zDhii0 RRRunf#??#GNee%$''c+в,Z[[ihh4MfW9q/ʝoiZV~;&1;]y ͑;4`6CcG@k]DD.4!''gB}}}`Y\qWfcĉn Fd6M. ##,_DDDDDDDDDDDDDDD.:(o`Y Gtw4⨯l68n7cc#  tuuӃi޲z$**|$ D瓗t-|ou4ΣNX3o|oy 8}Ҽf!^x< <]/NΪrδwӹ2.Ƈn:Nmi\ut#<=ZvR0ޝswY:X?'|z{ogGV!-[>o]Nv{ctxǾ3;==*XQ'Hx ;E'&&Bww7XVd>z1 ˅%%%E<P(Dww7yzz\ݰeޯ m˖E+xOI|z,>w ԝçmnrl]K[MZBV\>eY|󏱽7\ vu)f^FES/\o?>ռN#+4i}LH+_{}ÄQl xNVNfO@L.43ҏ+_iݨSn;Aװ7l ƛI^,epOO}LR. jxDH/|[@o!l0*x?wݶO>ZiY}䞯'o͌۾Gb0f+|繚u>;oK|ǹÛW97yS!-yOG:5/?]aBΤ| 82\>ۙ15΃_/՝X'~4? /#wGJqu|;yίwQi67~͏iK)7h}W_U}l=㿛ç.L)_ w>Ix/i~Χ7 CXoaM+_G'a3;x߿sJw‡ +W1?:|@9„.0i_?[)u^,I3?fK‹?:Ŵ[Γ[O 6¾F,ذhݶ=a;dC ᏍVMuamrpz=sl$gf6 TÄ|M<|꞊,n<6O C[CAp]{YOԑ;OIDd(EDDDDDDDDDDDDDDDDcvOGx XM=t)m Ϭ&j [¬B/Rm k7@g:x홷6?EF^5[枰C=t|tt0HY#3y\Rm`具¾P<306 IDAT3$d}BOeqNi6U;5Yk-Ҭ茍bm`+); } ϤIIض4a&T_K]\6VoF4#54]q-7'5lش;9w5##4 x`.Ažy9Hڸ4n:?6ɚmNTӔAm`OÝC`#5# ;5yO""P ZDDDDDDDDDDDDDDDDD.8IG TNpAœ`쓮{L6\nt%6.ibV|Nt[ :^m bލྟDI{͇{͇ } >˟}^6 ,|֚tvtb#w1f(_|cX:پeS6R4XݮWr~9"""""""""""""""""r1 3`,ҩʗ*O|:=W>i;f3\afeZc%'V?ehn)3gwB)W>]#w_ DbB/~p=gg\1dѹ o.X҅(-)aZnQ ̿]^^}.xavڱezx7SaCcT}?LhI$P>BlKJ!X]wp!O&])x hTtw^8Bl|Pҕc\Hf>kXէi:u4;iaJ-aNrjҰݡ택òEqکXo49|Ywy ϞI{k&9؜ݔ?g^u$"ru+ÿ&i>c:XCTVbO!^y=#0RZ=y%.@B /U j,"1Cߛc9͖Lz0[\ä&{bSpσb[¬"ݢ6puYG s<#nu, W.w5+aXwgc籘7^oag'nR=j-KnpI,dny.Q X?86D\LGDФzjC`.ƫ2ÆעJSÌaRs>l̙fs^]E}sMg5~/=q qÆ{_euue٭PuX!k4p(;Q ZDDDDDDDDDDDDDDDDD.8۹KHw95wMf#/#؟1`z7V9=k`Ɗ[W#g4)*V[s<Ϋ゚Lvb=l~/b`[SLZkcOˇV"XY>d U>݅i0dNk k@aI;-6(!;uܳ2<^?t/_ vfWo/eC31hNM.d{8'8KNm0qJ$i]e?9sG>3BDDDDDDDDDDDDDDDDD.<q;Nx3ϭyt*ݡ}?^PWW@VVyDDDD.v^1t Ά;|26ۏfHcN'2%7h;!/MG8t1"ɞ:ܴx解{{!Oc̈́Ts[Z9|wU ]@3> Ƈy򋳱<]`fS4-x+Oc߹&L 5)P'M5Tv00i^w$N$->[Fj`|'!ZDDDDDDDDDDDDDDDDD.pÔ}Q=;@gm9j#\)B)̑1&,|퇩l?|6+gc,}GF/gP{,mUzj\g$"vw>EDDDDDDDDDDDDDDDDDDDDD¤@\| """"""""""""""""""2Ȣ{ɏ^_EM|#""EDDDDDDDDDDDDDDDDD;g*DDbb;"""""""""""""""""""""rR ZDDDDDDDDDDDDDDDDDDDDD.Zxsp0`ڰ"<l&g(?.D$ Mww7@tx^^/vҢsCss3===XVkhoo0 <x<,WDDDDDDDDDDDDDDDDDDD"6퍦s 3e*۟͟H>>#i-ZE][#ݣu+)--@jE]/fz<==EQ nAAAAAAAAAovECEHMx9[*Z x;γA1SCQ[[,bِ$ڑeoooR qAAAAAAAAp?'fFHTO~yD^z`>}*^>uF&a¤ )|s,*>Λ6g,L 64qgΏtxǯ'Q7ank^5čgća1dߧOZrbr#} ]v=gr^ -]ժGt~qg5 }lEGGE.UzL-gc( 粒^Odd$gԦ$Ia6),,6E(ZAAAAAAA.~?{IE,cჷf7kI;<3r~m3`M!-QpNzǓ_Ǚ%'N_AְsZn:vϛNrj*G+h$8_'m7fɀJr]]]3sKm}_Vk(YJ2c"@%ct}݁LG gl&4)4?4=EJZ*J;+(d; q7 P[ )OT5yt>QtTء9g}C܌d"** bcc)((Ço       p~d :3 gy it _`Y0CϸcJ:-WPۮmT9u. VC,K9#5CFC^hVd-&;)]6 TkDxMc%_߷@tA {xW)//^a4 QQQ۷ v#       Np 7]~Q idp%1߰(^UȩD;;D6p??ʝ -e 9mL >Z\SoImQ ,: Jxɝl\ 'oc$WȾ Je;vR~|)9) [82B(U9r^\jiiY0QH(--jqN.sI$ ԠRMۺf"2k$^r`?AAAAAAAQ΃Ä5aOǹD(eTWv r:w)ǾS֏MP_3j~WqįxjS(]e/&h^N2@N`Ghz=pjq3yo[1iPiv]JKK <+d)..3hM4x"e{9UhCW@Y9Ғ E$.k'OJ3ޱsj*))'@%-ImVwAAAAAAA5Y8e>.T~&*E$3֨43Zk(IiĆk@v4Q}8]7 Ħe#H *U䗵o[MtJDO ۹-{ݜGOt)ۭ&j**).]4paآ 8R!  u=.gH2YDzcI8Z./po6*'no &f}ivs%i?v'2 SM3(By~z@2Aljl0vr(y`ZSPنl !up#1LyV>/FC9[J!3-?/ Fضa+ygzNmً̒ڢ7%x0aZ^l%,!#~ݍ[H|fC"6kh+@&6 %[X̾ZQJC kv$s9< P(ؾ5Ji=xp҉jpT]̾غTqL&,R}װZ $+5@O4uaӦl7qqH G #9*•ߐfDTk9+i71YĆ`3{Qh`>wr®,-OXęP7w{hrkll^f;klTVV@cc#fd4˰FEቷطf.Uz#4:F7A$jV[,i<. >YAܾn'       8lwMQF))K_a[vg>̫s"QsAW ?ms{V'헼3_>+.I Y)Quֳwo(8fW?u_<^s-s^!0eb2=z:,q)z*u&l  L~(KOr?5 c=~u+yqIx.O Mk,4D_$qR|f_GDe<Ҿe_& MQWWB7Es@;OXpmKm5^is$w2ǭM굿'ev_ y㯯0ӐyRo'+e3;MFTG-;> g 5.I~fazwR}뮓3"q={4agd) y%3qc*M5"sGTW\ÉӻTҷOQ3 ja͔]#/`,<&+qaXte1#&3)Π9onP}%Op'>2}ϫi 'c£|糄=]s@xOCRe[Wބ7cC1 PɌh6]n8|}8]y1;Xb3yI, b?Jt:illDeVY߿jEeq:h43kPuPO}%85Tqn232huvaJڪ#@P[SIIa' +P!80c{ϯ$     i IDAT  o/Ǧ2ٌ\4Ϸg.xز=~VD\ 3r}*^޷bEc W_Lcm+XtNzt7~Bf%vŗl~dW&,,_ë>{?q[_| 򁍩|Rnzre!^ԝļZò?7gM>e܄'*{˟oy5 =HF$+\އ"ƌzkϟw,6\$0q2+ˎV%[t+/Sb|qʹS[aJBDsG<пT_/3~m+>V/zIx_7&Ѵ_`]A}+e,{~E _>$N榻dR2l%Wv),=[ 2b7{umnjZy~ꏶ?o.& L!M+A/]%^ cVOɝ\Ɩh Hb 8}Sf__-~V჈BzFi$ ůq~ 5!:d0\_ Fo)$tfcHNK'=u 1;jEEU_e3+<%V~~6z=xd~rGk9ۄ۹ܱ>Q%9GGzamhkxm/{9_$fxY}AAAAAAAU~DvlMWE(99" @z7?0Ǥmahx}8$-cFvoAI)f_t2w3{6.ۃ Hcݺrc%rn9 ?+P$=843њUe, )^澤RE04Ë>fi { ?Z04JS'| U28}S:uSgsI_<1 t{zYc>>2qeOt04R7/$73Rɷ NlAmШ&44{|xlJǞx.ah2|W90Ue\3 X>r7uѤ K#:l)fwS%0vB:Fhf*[I|cA۰l5]Io_'`TYR].1Q: C82'Fs4)&0.Si=7%1lH4eӺm5LQ϶#XGC:QVz9ZhiWA+!t$h:=BA݊UVm: k6gBDhں3i)f՚ <1t?, FFt?ʺMgGyAHڴ1kٿ3vG92sY<3 !sHBNDrS/";|lN?9E8<{tlXΒI_]j"w3wQ_ȯWM       7ho}3f1W\j-KPEaK?${S &Bd;#${lk>OVkS X˘ ,9>6ae*%fX&2 X}ZK˙ru )I3-⇦[ѱ[Jm]+*flHɦsY>uFXL^aLr0DHOdPFѡ2jQ5}i6AHDL4RPQOj+(0?#!Wkc~41y :$CEũ7LXx+e>Yu)L8?J+ՇR\YOSBo/( o3&Ő] L!L3_JM,[eR%kBfR\^DDd1=KawM=6Bi*#IC'[9у)СBdNջ\`, Ac0_5Ўh_ƈHXmoIIM݂Z iu(h<,o7fuN:sd$|$FGq\QDj=V{8!C?]'uDtHj 8PVG+G-f8S-,͡tBђ'aa64ZIe>H8o- FJKh 6o4QL JKEjr5% S\z3IB6p F`"B}0X#>E[@AAAAAAAL [Sae$s~2+7evv +_W5D^q#}y? ϯ>"y3r%LB\D V#z!+i4jAPCŮM#Uj%(qSijD.{8 6Z$T4>m_5ѡ#o Nrm> G ̈u {?ЎhgAԦF$#F $\/ZΞn@w!C%f#Wػw *{R #RFt #K /gj p"5{oU*n@v/YA g֕+Xq+v_<0Z ˒N; ݕŤΙCWIXF2,sWlaM:+>Dԑ+65fNMcBSdQ;xBZ³FૃR.[IverܓĄɩ3<_m8޾>ѝahaOuf>@Ʉpr5{ְtGLP{9/cWٻr4^hpR%v He҄$lP2Rd.s=NT|j'e`Xcb8.2Om/cײ7\}^1<< SxT~M'+ʌL;Îrڏ^Ɯ]D`ʨ(dUjOAM6S{VCI@ )L*evw_N4M}d=VI@m죋=+ф!*ȌF! ]죯HhQòQzns6e41V ÆRRBW$1:rlk -Nv0}T8FAćfS^x-      𣢔/?_\M" &.(>׽rO$3ǹ!꤭ڏeᆒrt˚b5?Ko9OG,yFUiʖ6 Ȳ6}MlUU;/){/>Ga8iNg /od@3}x&{~0rG$*!jC7Wi+@f췏.XHGCGCB}5L^#kG(younrPA$4Ɩ.V$*>Ϊ,Bp0tj_XQi9]tP{[/aD8sr)Ir9I.w䤹l9;w>o$c K&{.aNJA6ۇ}jyםrMd4oh{`o277N7.j0fjjrN=[;0UX_5nïg|-,i$G %=5!qxy/8;YѹKE4%P[)(T|ԖjT2f cWh^2;nJSQUv*W@2fC(U-;5|#h_Ø.8/t:h9F [*<>`[ j (wYV6?dA3A^H5=ƂpJz sٴ~'%5ǷRUՈ 'GLk$x̧@mh!7i@a2"*uwv8N\ h$4 n>7 +'͊&GEk+1'\j=U>tfOp$       )QkWG=7r'F>&{`ԟrٲޙ1Ymcۿ/K\B)(1v0,BWySnBG5U #s<)fFE2>^Ƨd5Ys~Ό8 =?_1 SAo̿0/~>ocIA61W#tqQɹy{]d/|ϏpK54*+oOrd}PSUB8EMM)5Ԫ- yN#ϦwDنMT:TjI_|%(v}e_?::vZ'*Zd?6] ?ଣo@muUYZlP 0{YPtp8ufM 6hmU] #55 y"6w2שN.rLSpr;O98/=,p}ed:3%G>9:t*R cAv?'3htgoU K!yE9r$#ߑpFs0I쵶-lD|Js@mku]ŶUZ:ے g ѷzuYt;B8w~ D+UlsܹOrZrZ@Ҹ) p^?S.et"(47ȇ$To'j۱qSzs.h?@ԶVZ;o,S MTdŲ]T9AD3tA(zV3N%w' ޾{.c1AAAAAAA״oI3kRYtfdT2\-Yzv:kY:Hxˢ.N{ |\i\?uLchRA~ s^h4e7vh{ލa'&1 3 bIU7NmZ9TTiH: cc%\TU䪃&\{isKewhT@}97N1;m#{~8@-}-nMy+67%Y*0 H!c rc|\/#^'vgb$#Yp={ a֥h%]kPw4pZ 253W:P IDAT_.`̟e{,;:NN~-yt@I}GsRWDQHx{>˜#      pR)[󋜠 !1mc:65*տx.l~?GUWb"*d/ϙM a6-n`CߧEmBA&xM\c:ws ;2WY6嶡ތwq n'[|,lx@u39aa`"/2(uI39 k<0#p`q;u4(2q DM3;[rt|tHsp]暝潻)pH\NJov؛!?}G C:O*5Kbnv3˸揗#*acu&1\>mc/eNQ=03a3;24|:V[teDw kld0y,Sٯ:V|%*x|\BeA(T-nR\*o_"k#ϕa$Pѥ g`M-#v;-3](~mdxJm{tZNp߮6W#teI=zo&?G^6{]4I=UԶ{.OIgue/$ O=006ZZ@g-E{ri8yJK F +Wk^N #؇qѬ Oڞannz HZ9c;ptwKZgiقYCd@OJk+g^X,P__9C}} G~QpR\~#`#LH8)۾{]>2`Zq[#a4"M_QԶVz-.       [蝕xhBHռ?o7~56"wQ/Y 'c9Lc:v܍L{8^ cؾe7IlCWVK㎻jfݼO}3^C?cꖭrb !5% oh^d2vǑ=MdzD$3?&ܜONAd<ˆO_̼;xk~΄k~CCi{󋨨kE{<8p/t(T7?[R\6_=91%w|»'^9]8L&_{oKƍڏ=T|.㱩v/ fbC4i OJ#!Ѓƭ:J=+9 OC{[{FZADz!hOTּ̃;9^EҊoQ1Z-A[$9wF,mKBt.͙71x<,li7gc7%MzcSH 5|̓/]mع\8@l#&=_ޏ捍M'挔*4!2+:7ï8 I :YSs#f]:]7>VpμwS:}ĩ}c!{mY DTZiRhl[pPm>sih>RKUB˨>AvT{8L$+ԋ1ѬYʺn*v{JT6?+2PeٖR x$hu~ /_BJu_SjuN`vPWS9X,$IEQFQ$i`рj7;0&€5fѹKt$k`jMC@qⁿeZ?Ө\SKj$bӑwAӜ$&cg'UgQ;p1%uxy{Iﺋ}xOK MKg^K'%Ky%̹$X2ciG Wr`hW6pFDKfPlWUuYſxwKz˅(| 38*xgsc?Oa? Na\pJKUdo#I];J^Wl} s.IO$##lQwMkV>WO}s-2%NPP@i<{ V~BND5)slW~Ν=ץ?_^r~^bz9v>ǚ{LFMM<JS!?d]xQOVs (YI$r`K dg꥙5* bN%=Bѫm\}2#dbd=_|yX4j"#J#~`nJ(|[*{LwfQپw!W$Dd~۽1z, AGr>]Q>)sq7bTNq;f2&\rU_@ a3yIfW߰ΙVPP@CCx{{vBTT)n2*.l7efLOGVi= 7$K._jcp#l$ReQqҰHi̲Iċ6~ɒ=]woc@5ItnPr4R|5|`3Zϑ>h3&bQ/;^_8R2% W媢%kS/17x 90YcR4 .Mu; swm?;@I]-Ye[ke&K4I4ܦi&tڦKfڦmӦi3uک8^-%˖mH( gJ( $Hz=;_?@=[e5jO%OZKZ"R饖ֽ߬r#Po^gQٖuZ̾wgO0& M{\Vi_z%7/IrnF/|SXVV65aLg煶|9,vد?F,6ťWkUYPr༚R4%\+֭RmSf,jo#=WիjyUڛu_,pi)mI*ߥ3ͧGc󪢮V%E*.ȓ5=`WZtj)<+ve O؉ e?a;!gI֮WǪ`ZO6}蚢czr5T(n*uv.ǞC%ZNnYRQ=jokS@bb-[Zu%n)ܭ{UtV֖Lk8Э-_4Z^ۨ*E`NOViTeGz5еΐFUe*.)TT|_4l_l4u,H}.euY5޾T5Δ^\]rV$}YfE\{ʷ6Ij 1)lSimWt@hH/vNԦv3AMXQY}\f_C:JhGcnGVzyp] ީ/3cVonmJ񖁉ЉnuTSeS[u -o&F9JrkՒ6<7%.Wf ԮS^nߠώgѡ;sWLEUKϾ[eee BVAA dia>dM:ھR8m\:1eF?lTj;hzvX*L]]q\'Z4XVڱc@/kθV]Rriu_ 7^Y+thVm* ukʝd.q԰Wi2][/! p3Am.+~9{An}ʬS?`Pic+Q*?ܥp̖3>sLkʴ<ϫ;w*> Ĵ *6mrRfE&dXҡ;СcLWMoi;A:yچ1A9T5;zZO'Ė{Nꭞ]S3zgyI: 8cψxMGh~u%%5vDڮmt輎q~V7d{t'Wd*<\`$v~vȭ;7U]Qw?JC}}N*cu[XbS}:s/[NUG.tmz`M h(iuȕBVCaz:?/ZVPe;ާ%Kr}**)ұg>2amEݭ;/ՓKj.ʝruzQW(fH!yME'h̑fXOVJZ*(QiCɮ:fj培Sjڂ|-2Ln~I?zWX.wD{[ب{޿L '-,!C'vǫz ߯yn|>^lS) mPRkז̛=Je:yK ۪,Y{Uowi巫1/_oP#)'ۙ-Öb廬2S1 Sw\[Ewe&#k(bJJTL**klr$% o0,>U.RIW.EDT@bS(~7X\??KO>OV5Ǖ\q\b'- WWKBTXsT!??_CCC}sTFx^E"E"\.9\d2HB*t1673 a&R1=c5t-ʫ^͛kqWl*_QZq+DxtJ.UZ*X)5uExu ykhyCf)9ň{HqAyyy˜+X6i-#,*eڸy}mZ$Esv- %*ϥ,VU*,,u)`Zu'ynus}}c*))ujS(R0TQQh0cDB`Pi ZS ~4Zo~\C>kOg\6}O+Yƻk\@4kJF߯OGpXx\gt:zeZ:h`Z*((u %lhhhhhhhhhhhhhhٮulf:%Ȃt:p8x\/_s ZJJJ1 FK%PHP(e*f lS_bJJD:> `qL0T4ar:r:j@ n/`Kӊ BJR***uY7\+e< BFX,zF jP8V4fzh`1eKptZPHa&a&+0 Ns]`2h`aI$L2G6MNS>/ L x\Fwa׫}ܑ}^cL TJdZs\ >>/1_& `" `" `" `" `" `" `" `" `" `" `" `" `" `" `" `" `Ѳc#/_yr9lR4K8\ GKT/?O% 뼺qer] } ڱ=Ker StRztY';JcaSqy*++TQQRm2F(>B0SeKU[[ښJEfJVx>կD. ]_'`J>-":M UZm;vzݲMo2y*[-w>bǎDWB[ݣ[J|3ln{?Q~}=X(,. lKt&0'ªKPc U;o|]Y6megw!`,ї0kUswBS]ޒjVx'GCUc˰jIU d){@/j{M4#>}}Z͑ˇЯU~ Y{ԇՒx|NIcY7~N{Vffվ7]ޕ1/wo]gRf|PQP hIf\)MYe^. aTIzn=ZOPGn}!mt\,4*Y}V¥7UNy-MSPQV=PU}?69ˮLD)LXC]P%{0$RmxR_ӓ^nóNoxtɬx/VKƯjWuoy}}o7k)ײ]^? cj:<RwnT trT~.`XZRw7>3޶i DNÊ O5 ToW6rJT^y#Brlmcq<ݭ[. 4PʩBkJ۫}O 1wX\+yaKV;w{Qmxb0/gx|/iΆ8j)K&m+j&g*Rѓ:ޭ`(ᐯQoՊyeȻyQ>zb48תΘW5*ܼ[\`FL C}MҮkא!C+jkl煡7k[c z-uVxӿyU WbTjVfXIZ_=*ܬ $ٿ{Zyp] G|߅šzmuj'`F9x!f&zt'~E'wݕ$gCX4fRyUdd2ݴpbgԤ_)~.$kry)ŋ۵x2fX@7 i7TH(շJ7ҹK08Z։]fPS@eYUQY$QI-z䓟M1LQJz^?e0|7WѺspkӞ*~G:w#6n3f߽ٯ$Gn}M׍ڢ~ILƯwiem Yէ?|.2CeF>WN u6}uWZ.CG9ue8VCvEÐ46GCz[15KT?FF#h0$[kpJZB#wjhB/8wܬ55YT|J29hý莥cYfLk,lzdQ僿>x̨=\LC+0dwjXd:t.S\ 0=i 65>fqkZFsLػp Y_R< 5:nsJr.ViAR|O&f &-g),SCǦ-9]G7W&;z?, u'Mm-\ݯo*m2n,Ûїߪ%Є:5t:{v{ܹ\Mh>yPm-+gгd>P?;Ϝ0J, 4&?C^_u3A/3 Li@W ٫7iw j0ߐf|Schß?C5 i.|G:yɹ\K랍Љ_SYT.lp&.=z@k\U`qѦ`kH$4LJ{]1WJmgۤ0jZ.uK UPC}ck'lfHʰ63oN^*Xꊹܢ>]ò^n$yB}L*pW4%e__ON C) ֡S]gdʢ wi4?&F6r^.to8tN3I2f32}c:}{.j m8VjR}j` fT}w7&`9 N D sDo=㠚bOѥzbo⣷Y--O4EQTRzc4|*&h"LEOcJ):lEކ]z *s%ک7~ZotĦ^ zIOqfmnQc>/sDc l۴}@tZ>U;B KdT.Ww ?aJ#e*ԗ=d5НrBm+@dHz-l\e7>gFtg\UT5Ui.5ijK۰N7ژť֪l.izZU;H5,/#tR]%xfQaU=xG|ֱ[C-zG?ձL [Y9#Nhv+yOSOSGu>Y ƩyH/W#tJTHJұ8 X*O3:f={ ]{:vW+ݯT^ߴLK6Į:d?~ s d&Jj\C\#O5w*)I<-m6M"2}M:{n*Guy $*m\M J2:}v4hpӯ_9 =CJ-]JkׯVT啞B [CҥZdtl3֧>MQĕϵ|޿Q *ߴK߫=UzxX1Sr=ucAf_iw;kd:/e3oӛoD־__V_<{i{uC{/ٙ?ë۾OTzi;'r[єLGK7jף'-w ;LR +?LRT:F3ө_E .01>}Fg3Jdͯъ4;A ZRŪ;6WV|wyV?E%AYjzGGm#m Vܟ;[D-CLSLuߟ~D#/aU.fƆ4$]Sd*ݨ_r+P{oIlQw8#G^*T_NԬVW/n?NK,j4yzU +.XnUk:tnP)gmCǝToF;W#T ~tN֋μYcZV&{̍[([nMh|+Zl*J[͑+vMvФr~yU5]旈 d:OfGtE/>5hٲF-Th9d_ַG VowܪuUn%~R_?y'.9|FO녁IO|oꜞ_?w!\+wש3}Y1d.63:o^}c8+>)}ѝu0jcXWÌwiC2yi E,$)-[Oɟ5rc3`z{u.:v* zA{YqCHBLZ:'\/tNf9 G9ëQt*5d7z,a-)S)555T]]]5:;;URRݪrȰ{UZYB]FrXABɬϭlǪZJnY3 "!t|B,Cl^UT@,JQG[z" ~IRuuu+0W*,,՚$jӣ[Tr2qH9Tp= }yF}c;Ta O3;/W{j NOm#%յ/wvvvIwEHdXacgN#t^]ƅQ%e6pkFP:C} _ͳRߪ/PO9eߨ_wm3ݮoB:Hi9=ʮ,VfM zB=|g|SGs4 ewLVCi*Ey}L@t9TNݺkݯH\SyEZXR4LEN#3<Պ_ѷ3 +i~n} l /fZ0si=zWh5j-SaCF:pGN;G4uR5T!=W,N,Wai2>g_nVd 2^mڭMYTw|Yӷ'0OiK` u)Ţ ee2>9^MVa! +efL?oۧ|6sPReE>y\,R&pxPwMX\wȥL~蹊ڰyVU8#MJ" ;tTiU0-]՛7jU]SPOѻ'{jKL@ zNJzvWm.7 r)HO?%{%K*=ZoD˵y=iMɳXQ CkM ܀,.pӺ=wN C`.ݺ!I$Ur֬Y5֨6ϘZX DaК4 xlU̡j\R"ܘKQ3р:v(͌樨TER__L$N8\[ \`X],h^|i2|kGe˗&u%2˔G u| @%aVl/=N1l.G+>q3S4iȜ2pc\yƐJDӣP(rps{ө6IG6,}LFذaӗ& ,EkBF}o;Ӆ}* d8 Bf>Ow]]:S$3!!1`6 KdK\Um Tu]T{{>+B^=8:ù[|ҥnOw29Rdll,cccd,YRXܖJi_ܞ jDeN+ĮWP>(5k؛#Ku pgpp0immM\YEZ͵&ͥ$>2]'dFi*j_yc`Vǿ~k}ZۖB4@|R՗zQ Yzߓm)ےB4@݌?˿>;LJ*0slqVj0`a˩/ᅱΕjiG5Sif2$@Uylsgʓ9{WIxj -Y|]l?w-oNFO_G#-Yv<}KV,pwSZ)w|=='uWpQ c9{pΞwTӴ|msgʵs#'}=r`<kߗ?~>?}>ՍIZՖ`[A$\SvwypMT#.3Oxk)'}7;M-*O 55wo̺hɉT$Eoܘ$OߩMM r 5v˖w5վ(E5#s<}'SwH6VmqҲY߹3jE7g݆ERtIOj*}65暢5_}*O};ZkgZyݜKJ`L^3̆yOxOst c>ܶ2?Ƕ_\d2IRyt9nh9eQ^Oyۘ%ۚ򳟿SX@jHmUڦ K׿{Wedd"rsZZH_T;$iȲ]SW3tnP![QӝmVHz4P9;{NW>q(7=m(C6`-IӺl\8}B4B4\Qe˗dqqٵDΞTc6>,K`)-۔˴NBZ$ծ*j9{ü}r$:$+uq^m(_]ple#Y[etΤs<ȶ2o>vD](D!3/v_yp^p*L_o WX@u5;g+Hjc9ty5'z=5_y"$z^X`9z"% :WQSNΞ;l|xG9lJ4KXՋ ZSKJejBt֖4NąE۝ٰR-'P )dr<թkkdsIѺ!֔/Q10>} O-##Bֶ 깜&KKISws6 yŚ,o-V+z`1!k?w6i\"]EjNMҢc,o-_X=َ  5UOjsil*L؇3X&D0;9jx~ηIjijK?K{oJ-աy2p4J \[m {_}>{?q}8yhN11坝İh>hN}<T \aqܿ;gQ=v0�+M`B4ӊyOgۊ]on_uw/˺[sK߼{:uK [Ԑ477_)޿ze+ڳ8L+{*w5I*9ʯ>Ey(+JI}ӿ89l});] }Q+~ukٻ9:3$`(9MMMijjJCS+jgOwlPʪ3}殍i[5we.dB4җj]NRΊUS~T ?\rtJ~Z^ӹ|d͢eY L-w0$I+ؠ6(vFvvw~939kgbzECڜN@ 0'싏婵7?iqz[it~U4|DϱL^ǏgڝS#R$bLB4T}ܳn/9"̊ѵT&&?Yte8<L*EJ+ӽ>WNn]Eť5MKfON  ;o>{*;1C2 sR%Şz9TB40o5;s@m(~4ނϪʹ- sEdvWW*T3;^DBR==/.{>#h6STsғ]/-,抢#wܽ5[ogMs{ > Xrٸfiڛj<>̾cRV=("6<-0:_x%.?e?mlJWg˦(wn_}{$c?C>dpC sEm$}GoiR.՟H_YP\O÷ޞ -+p_qMڦ~ٸb{}WNO'3$ $)m]ݿͿhƦ||x_>|ogeSiZu IjOnHcՇXillb}-AſgǦ2|75,|;% s^-K/KY=Wt skdX |#j3tzu#_οp ٘_~:hA!`8>er>tۺ:-i[.۞|2ۖ\z[;?a#Ϡ62EKZ[WoO^O)qR'5|rTz+_̝SOuUy~S07k ͹J$kִ$gz"'uiAޮg3(\ńh`P>:>qskk#9KG]܌ʆܱeS:7$:Ij9Cq@  0ʧ/?VMbl4YS}=ºjkJQPO}/;=iKKy_<F!`^ewoQ`(;eB4Srw72>ؗ{dVt0(D!λK,˪;u_۟ZҺ~Gܙ"I>[|3,@z`Jё{eit<)I220-[s=[sd][1Y`P#͹,hϦӔvpU/\/-ɲ%0yB0G,ș;|,gFךVβR`FSK9ͳ愆z\bQ9ϯP-E=|<)!91^pjiM"-m)e8cB4Q=r`‹G745^sr2Hc,L sDPN5XL\xrHftR^&Oy9_Kʫ}+.N}V*JbKzQVZ.>6ţrԯ5K]YҩhwTџ_@:Jjժ@91Suժ,5ɯBq7>6sde5׹[L!`gzHimkͅZs-|ox@M5J5I9IƦ$ l\K)G-ioTEVk3 .gB4UZ,ܕ kWfiGK;ݓ˾#wH6Vh.ԚKYܽ.]:3EMS[2_d薥i޺p|ypFf3 B4+8Ueltl\NCxZyV]y旕7=Չn(S$ {qlݲ!V-MGkSʵɌH能920Y PsƦVsm(熪Is)I5=zLPo%kIjJuS Z%=VϾU(pR,<]VJiN<80]lnhlg4qT=q";I!`U3xnp;UI9$)gk¢uY)Dz|-:ў TaEv|;~eg<ܱ+?,;HٌLij[,U2yuXzMѺ&[7Lsq{jj*?f{/ P̗lЕ뚖nʎ7e5?M￰=cZUtlȎ9] Wz2zkuH/Q?k0sms>mK!NF>z)D̨,|mI!nFs_ߝCz9EK6?+5U _KY#)xzj3X}op<3ݽ+{x<,^.[ݟ7''䣑,csؾ%+])-ٔV:(Dձ=y8gO;e*ip3ڹO\̾c9@5ˉ?ξC$EGVjKqr0~ h;<&MI{k'z{SIRZ5_ꔓLƦqMR7f]ԋL`DI"7nRTFhnz;eֻrj_Ƣs9>é;$p+Ҷ}z^iܙkn"J}q:'LOLMA sMњ>ҝUu-Ɋ5e{-X]&煝3\KZlGSW'221+X`YVzQ97y5)\6ޟ}/?6$ES-Hq87/`vvoΖz-jL19;Jȕ+cSfh9hiIҩȁ%];GR]<YԲ(E ̠='oS pb*RЩJ*BP 0G&&2$rI&iMkjE5#CJ*x՚Yޕ"Eq|澜7p(Dᡜ&ͥLG)<ж"] %3 ̐Rܞ^ [!١ 0GTl5YZJJ]%=/5W;a>8ěGۖ%z'k+;S{rl\{g]9 ̄bY=z24sB4\Q;#Grܘ{N׍΢ ˇGg'mem E}'{W~!EjWvre=az>9Z Cӊ8n6.82葬-2kgҹnk|d[hω7sNfpX@ڙyt8n8jL 7g+ , E:ry3ڕw$?w:cʚ#w~6%YP%,Dt-c%I25!HckKWOf|lXkeb҈ƆI29Ե[BhݐMk(Z  SSJk[Bt\V;O9{ӼbM{j 5; 4._"I?'zƦIiܱ~]/ml`R?5蹴tC6vI&s]i 5r>i~rSONw߁vuB%HUQ:3Fv3wqdlEmdD4 $8''#'$$_gwdw<_:D298M2m+䉹yλ2kq{ʾzDQ2%6!fGe3{JWU Dթ9̴"Iåw9μ0/VȜ4%bh9̧P}^|nNji¼Wؠ4441M#NȤg;omHڛZҒagT{d`R7WTg]O sd^za,%:i01#j&L'w0\7aZ Яiw~J(Yg2|LF7F}nc7ݝ1{ַ#?<^n_EO{{ ;茼 y TwF1$Ç <Š )]/\uW浮ڶYӹqD] jJ` SkVgkw̹9gƈT3\664[xm6\Dum>̚ iO]}]<kRn.Jdž]EK򲜶o6ŠAipK]]T >2ݝ])ՙvUّ\_ sٯ)Smu!1vʶaЅ9uJks_qޕ^յ=sЈM!rMVyZ/7T2xl-DHSiLÈ2e;Iڲi3-DwroȠ ^cկWiO}JnI-^nqyŔgQC^WCsr%W]TlCsOO*.ށe<2;Ot D 嚹ҫr3'˵OϏFl ڪG_:7=*ݽz~nܿ/ulЙ5˗eY]L{[gk..maoBFmNsM=hXZ;zl`P΂f%;ZYY   _tqgswqQTusT/h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`,h`.:YQ_(?bQE{e_,!K K K K K K K K K zT+wan(^:/7~U _ xK 筨}]{.G\Y}z`؉oG/oMsſ}=.)7Q~|8o;iN 4Мtg̠}7ݐ[]Zs߼!8=>]k{f ޳l8 Emy<ELz]6Ɵ5ϭetULyr{OMko}s?sZ> u0ay'/| t `QI*xa$)#s[>79>9c0}<ݧ;@,7min:zPiR_s~o+Չ9-Niz^cҼk:ulڨLao~ȠuY׋Csу!LRd!瀆MkmʺZŸ'(3vah~ڥKֳY4d}s8bxF}d.Gr^.[lKe>2hs瓹?-_w{,[,CS}/_ . fAƕj*CIb)􎺾.g5gV|Ym\N >(}khˬ=+wf@W9:#7.;ӕ>$}[y猆IR[˿ܴ3I+ )Tgj2דze7纻S>Ф֚pwJԔ ݏC'ImAfp6=g梜yTꅏW~zYQ{rEnH%i&فyH1丼ţ{:iϙչ+Mij6n}!I7szN?SygZǿ!o=}bIO<&, eZ2;7sY$=9+kvnq]Ee| CoPeYΛ=yMV_8;3ꋤs\UylQz&ou=iO.z+3$eVrc^~fRLfz@4@Q;.gpw7|s~FghcO>F/xOpTCOZZ4g2Q=_}ܣ̚GO(\`ם$)&g$+;zrFsO3}>|LEre|O{[W{<(FfH}y he_?BN%#G W+Q̮tv]STYv-hz2W|y+vGE!\WQu=!2g;@4T}m'>/߼BjYle|dQGeru+O΋P[eP#$u}]=~?mYL%ysOduwi,37+kfTH7oq.?j\ 'knf?j@/jr|/u=:),?//Y$Es9+iļWAբ2ܜ[[e@uSko롬ۘm.Ri*)hIc7 C'=wYXr3 OU8-v` I,@ӦKu|}#<{署3b@o4 ]5Yj]jIRC.|ͧgJKb3>y_]o|rNtCi3eIJ5w_sn2z@4@_h<&O#\{?O9=_'/'M $IJx^>=O6;??%gyb>5G J}.>56mЋ@ݴrڪ+H-E|g Co2oo$w‚ҕO6?R`3.`Sd~2$e:[WI12/ԌmٝYtYVw)V/+j_!U2f,xxN$Ssആll][{|?˃K֭_v:8{uN䌩MVgځRy2bF~$ItȢfY {I@A-=2Wܐ c,_>+7o ݽ:oEc]ޛ$E\ ;b^e9LsN‹brssjpϝy۷-%3iVvg%CLч1_y )Nvh^Wmu[OWj&M~r*HSs3t}nLscݛ?޲,RјH(Av 3z]-\ѹH1ʫ7%~3?ѕ2u9gz˶/2s~դ\tIX$ c9 怺.QuСL!C y>XjU͖tڵk$F7 lkjز_sY9gD%)FeƩgt]Y)GIIK;.MGf¾ ޞL΢?^/jN֮J{ };ng}WN|_`33l]\HnvX:4[~~^[\b~2>?ܷ"EY}綥!n{$hP/eG^UVNG"S[ 2-g#9M[4Լ ۼJ]Ɲ||]_8gXޚ>) 哹ޝgśyx3 _Λ9$}]o9+o{áT$ɯ|asew,R7u>ɺٿOoZ=+7q ;}̲뾚?բv">9GI}3_tm KW2ᤓ3$myxt\en4}\[ =K;" /EFsurDM932f|Vڶ;;_]_G+W˾L~H26ÚR}.-ʶ~{:;:7\4~S|gUwiu@Ny;sFoّrAt.ӶàtAyctΙ9IҔ}+՞-^$^ {vnչHapFöC'ȍ^ŵ$IG4]k#/``:ʏ>r&Iّk)SdӵwY]XTu}]Ri9Ss܌it᳄7*27y@wuasݝ$ӯv%h2:g2n;e-KX۵YLa@Q}mNC j[.IǕ#D1thcG˴=|擗ʅwޖ镤/|nnN| ̠JRrtN:!߼_Aww@Ғ C1 fvu?6sz<\Duʴ| ?oǻS{qr>+ј2(7>KՕիW, 2$jKzs_{M؜ʎ,PqCL ! OT̰`Ar\{2xg엺T2tThCB[.eY9C ^"~Wpٻ~GJZ%yE!P.nkmm_%Џa_leȐ!A:Ie\Wd/ah1h~{tIC /9fS'$ez}]@K˗/J`VWW <8j)8aL ]Wʸ WIVvo9u@^)9W%{WׇjKt zw JE!=҉'JKALY[糹󁯽-՗Yy~4<'֋r5ǟg~qosT֫=9/wo ]tpz>Ɯe:WkEFJ$eI;SaR[*K;.|#˃Cr_|8_o|ZLE[֡+4YѺgQɈ#SMݵ0 Ւ{@k0#i]أDs99}])䂴֒q"ɕ2ԦO%EClyjyo`S蟺ͼ=릜'W]W]ŵU暹ݽU&{8ئr]/SÊ$45*yKW8*ɩ/8#]Kf櫟Uo70 ;@4V{osohڪ]':dH1IR$IֹٕeʲQ3zS{ړ>վ~{'[t$ESF"OŬ$ o4ط~.|l⿾/vԺI9'd$)6zJѐƆgLwYz]}tK" M )h@4@Q}3fygơW~"oEfjcc=蔵ԞKƻEj$ذQdb *i44ÆJSC]E5Y|yVw? C3v :$CJC:v,~,\SF (SIȨEhTtuTƌl5vtR ;s3ejݝY׶:˗.΃dUW/92r츌?.ƍ˸q3.bB{*-c~S3yL4>#y eWV/=w3~#]Y}_ǿck{n+@N ZeX$c_^Ѻ1\9r؆U5SO:){hnJS߆Te.vHQIZ}@jR֥9i͟~wMxU2 ꣆==QjE{sN)2x9}s>ҫfed~RK}}}iLCc ϘQ"şO@:.Guz u2rK;V=ؙE $)sm^m}t2ycHo?>ySN_4lcY*l ^接}]{asZ/n]H~*yG:H>̇~kٙYcjKr5Wh uʓ>l%DmѬjౕ$EN}B޾lm KKV1{)OVY }X:7]R&f[T/&ؓC_m;+ʒŋxUKoUi/2l9Eda2vƌLgSe/kmͯ03|Sn# d-[[k}Hd:~6/,VPLկ]~/,r\dn'{%nT=!J}w{uP&8-wdFo+ 0>ǿya$)3j9eԶ?5⃶FM!#=6/y9zhsdvlCmuV:[ duMa$)FgoE!~.o|&yP˳|4ʬef1 ;Jw^wM?G%/yl aC!,>H6In'Oti{ot+i&i JHJH6fe[ք^UOyyE$CkGi/ʽn}SqDo<y_b:9QG Ƹ8{ ͼ^9ܺ.Ֆ'9=XJYd1 I-ivfRoHϒ,޽p{ԼumJRfWLW`@#])<ۡM[#~]z*]Ee[ $cZ%dk57j餾,ӫM/c(\Ȣ+Yfvj紳;]lk/0DEQ=2'po6L6{ 5/9:0$]_-ЂSv}@KO=l%_ku'k2l*YT%ҁ%d$kM w~Rm|k DpƂ:Q^-oVx͒Y34uRҔb,wH7gQZvVNUiyng(ՙynYEMS$mqf(9C s4j+#͐FvyP]wĖ6Qo[޹H 5ɺ#_-@ zG$4P@6=eb~aԠ:ݵih7`J22~JwFVlo lC 9g7s_n\lI{֭цS;cĻӔM>5իP*[OجW CTPZB2eQ+$itWW  !$dj1c,CV?###zlmاj=u~p_@?e\2StA5nN7{̪WhRv @Smv!kNeg٥zoJÙ!]Ao#S뙭utTD 7(dV|`ratmZm~*˜jV?G<6mZ#_vz_JyN=e姩[5w"K6$uhFեF sW$YR4q2*E*+B-TZ-]ܲ!6{T K3ג1[W-wkHkҔ 4c9Sۚ8g,VY~r_6i#ҷ94mzvަQ7j"w_brݺTI.ʛDy?Z5٨]uG+!){#WsLV uJ5[O0TY |U/7dNI'zztͺBYOKF6}zb9Zt_yJ?S-F7ܴ\/~I{YJ߮KݫG3 ӖIs;u5ّ_3!vrx0<RZi**wmXKumRr 4.-a|\nHٽAТ3*QCc&m^ˋz[9*}tړVfjBwX/3 %NHW^Q#RK誒#zQ>Ƥl}a .A k(T1MS?Se~֛ʞ2[dȔ)c> sY*yA 2gݨgػUN%ף/JmU|Wҁ}t-${J8';`= ʜDO]ۻ %UcMVvHW`]Uq691lhc X_Pg:t_8p@}=U5 _KfRSTWg[6[wޟ>Ul,S!x]~}=f>١ kCj]3ԩoߧ6DQXX蒤#rIX06455I F>z%$$71|*=-iQ3V UFr57ԩՐub}yJmɐ6?'5 q,d)%1A3߫v 5xl"0 X$j򌩚$u4^<0f}^} +C\Ǫq4yx'FǪW-U +'#]iJM(mSN5UT5 ߿{j.c=2Ƣhs.Vl+ ]mj8֦n`8U2gsjH,%3¨B-j&(q!AT9 ,yظNuSzʒ6G*{\3xL&tT{A;8ʆhSݑJ9{# bW+tR{LǎuݧšqXZ4L|[;9/)7ܫO~qwئ.[r4ݦ<7g+1@4cš2e Ȕ;zyCYa8/!Ú sieC2OSvR,C yu|^sV?ĒO i1h=7WI{b\sYD0'?i3Wt*9.E uvBM v53bC!B5zqS4{LM0NYirؤ] 5إvVsWc hS~Oի*֥ocI=n=hp 'QSSS%,* `,7=}3Ie:mZt:ew y<)):=o8; [T Pgg<GT Ε>|2MSIIIr:Q۟f`pn;%΢ˈJ Z233exzz5p9Ψ{p @555źh2N6|>qfp(55Nm >?I.@r:x<.l2$ժho p 蝭w|@|ĺ)hq@4E @" nD[-hq@4E @ܲ|rjcY)&D[nIENDB`adwaita-qt-1.4.1/data/screenshots/widgets-adwaita.png000066400000000000000000013276051414271704400226300ustar00rootroot00000000000000PNG  IHDR DȑsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|U^ BO%@]ݵ!Ăkwuյ]׶k/(V\*E$N !$7i/9s̙31<Ƣc#)XR$OIGo T.$J*9Y9CRGI%y2IHr4uRS$ux$8/'۫jm9ťe%%EE$%-,,!)MUUԔ@tS\n9nGEξ}~1O>=KihNChQy{ʀ WYV\0t:K&}cW}ZPP_.Iza;y7.11gY,Z0eX#;첋Gddfm޼ySawc<_z\W nxyz;fLM<>z&81*Sڷޒijd<$jR jaV6.*WNJ@46@46@46@46^hU1B46h}l՜2gN8Ub[qE);;G+$)(0PCfk-M]-~l*)9ڰinlWT(<4T]Ĩ_xu\Ki^P{͂Bnۮ-[)+rr0o|ou2hggӺ:GGkh ޳W؞=կO|eea|U:+;N4lc:~};_%f;quvluʮqzp>5nۮu7 ?y@ٹys'+_ٻ5Wwfn]@CN)$(XAM\DEj6 %64YQQ~>[U:;m(M:Y[ثך#څCDD1y~|}*hpbuUWWZbV$mp|}Νt& fӦ D7yW.6:wc{LnHFf~./pv:z7u8'twEB=~h߰ CK7sҋO-p&mKiI}sT_~Vrq:zfmvn99..á [OP4hMy萞|سѱ uugu7gXmoZkWx:''WIݾCy%:ܴJ;Sp`Ӫ]% {qZXs DNZ^Xgܾ.ahIZtrŲ]_!;N-_lEa uשCDC?Ͻd&Յۊ+jy}IKӚ)$ágg̔zCы.׳3fy`ʚ)ړ;7@4F<=i]{tQl**.֦:lnCO>gDۻӆ-[Ͷh;wviޱs}:Uۅ[ S~~>m;wԀj߾$)(0Pё]fCn~~ ٟmժ{oE;vw n]4FlYf%{*7/OAA.6/(Ԯ{Pn~9l$)>.VWOD:kkxrV:]cW}˘V7,nt:k%n+$(-f hU8ѧ.aݺSZ!⍛6W^347g{Ƹ# 7}5m޺ͥݽ{Ws|aQ{90 ~ETg_eeڵ{v80tŗޱ=w]۵{~xbc<:hN2vڣ[u7G@]}ě?{:k[97v?o7_smt㩹 G{~o_t>6T^tIZ(((FTР~[n}{ߏ<nSeeySIiUXP2PVY8((P.ۓ>IIaf{μu8'lO?V7\WY,婸^M=,;;G l_5z~!\[RS]хEEZ%˖sҷnF󳿟u$UVV*FupOOO RRZݻPAAء u斔h=**.VXh:tsrTQ^u}۷o7Tu/gdfb(Cթ}(+K9.}EȔ$l65yp(''W99/(PHpTO^~H~ QdX, JRYYvݫ|c pDDDUҲ2N6Wri_<xwhzO̾(w6nڬGzΜ{PBf;77O;5CǮЗ~onS'*[y6nezŗْ͊4qΟV7>5f:M:ln&èڟnӨC咤{)## VTThjң nd(??_rt׸0Ezm{.p"?0 -.stM|Җ7_zN|O?f}P=ws{ 5?_;f0IuCϾ]]ڽk|we+%ihz+hzsֻڸuٗзbzK4wv~&?f[K3~KҀ*+++߮5 CE }aLƬ:sKahwX[NZO]>%GBOmZ/[nmK6z}nRչZ-ͿzBo7 [Ru]5z oz]׸=tS]mܼT-\%wЈ1#sym'{CQ;ͶbQPP`j3M)l޵: ~0e[Ȏ.r *(sj?¥Qt<ݎO??suN:RJB:eܘ1j0Ksn L/0dJЀ)&RjuN7j-C\/ Y2dK PYyystЭ)3 s\HP  CKW6ڬw'>N!-_VMOrb4~(mٶCRճ12+*[{4aHO0Csr]¢bWTb[mr az9uKP` vө^{K={tzuGX}wfߊk4F0@AؽlOx,U%Ag_)plX,'mZ" %f8VڇnZ0 9yxxH<<<ԩcQɶDo냏?`n{ٱ$թ&y9>v^~Аvee7ܳ'5o.?_z ֶd*vxxX'^DoMݮ 6{G/G._")yslޱ jؒTTTY|d|u7+w -zWvv;tj݆zWTRZ#3|;Uө"-[Rgy~eaS+5ā KկO";vV~3fj푊)7+3:t$}1sɔ t֙+0uX{퓯oWj$s̄ct) _O5HEr'7{~1QxxEo'^QQۣ_u]1d_Xd; Ml.r:]B>+=?cʪ ^^^X,luBvM#jVs8˼"]K{Mz}7'|ݻuw:֦H6ojuQ%ICkN *--URJu0uؐ&מ.Ձ-*ͦ}zkx=۵g ε4 AF w;TXm'Ri8P,EGuEUUt:yku5_~,>v:?,^B͘Y$S͘KWWV]||TTR"*!ȯN~$Lte 𗗧W{Hw#ڵǥ۳˸@lZl:.cnNQϸzƟy)2$ѧfG_|n]X,q+-+Se5vwv6D?Xmnkur9faO8)>\KOpѭk[m4mvU#st.}5*KٗVw߀Hyo\ߠ:srr%Cڷo?N$[uM[o#|ii6&&??1^^2h,X(I*СCYQgѝ"n蓒S4xedҖm;qͿek;?;˪5TO0ΪP$15YjH_UW|رkTU-//mS9gM2Í~ޖ@bQ]\tvi'۠"I }շMaQKϷ;ŵU}'48إ_Pn>~'IҢe.V!A߻Y4VUx$l;YC4(q@K zg_j`Bl6yzz[oֳ/jl7lIՆ-.LV uiժt|x{{v߱C&xy]*ǏQ|\7-M}Y9AA.9-@yzxBv\~AK;cG4хEڱs{ GpŗӼ>o w0tn[kHÆ$*$(lؽGXee$~9}448H$Uj:}n=:cV.~o4gUVVt7}izwPqաrȡt߷Fiֱ#;V ^zM1G1ͭUFw.*.y>[;ퟑÇVUμ:^r\G ׍\SƎѐāѭyۻ/[a> ilݳ޾k2B+vXH"ڷk]ё7ѺM[aCM~[p[n^^xFcF ӭ7^R,tW_Wn3 YO4[W]~K>?.ІMu0#ScGn3֩[;ĹbXeee5В[#YӨ4_mfzWTS'_}kإɗ_+wKgn.c> }r8*u߮՘#e6sbbݾǴmk'ю{[imudd}U14mIݦ_0|CuVn'>Nffw֦?.}9\;sKL'?:붫}5}TxcO>{|^Z#ǟݏ?kt$]vau I!Z\Եsڅ߿Okg1{Qڼ5U?-܆[oK3={%INpWZV-JW]ihMzuUTT(+;G+Mbk#~e]i6:stnj;*+/7k7nڬGs{=<ЯOkW_gxXL:]G*O?UOWH%I;nZk&?ZrmZX[{p ԇP!@E @E @e7? 8Tff٫? 8Tfffffُ~0Zsp  ͲKrJR"@SiT.iȚ^ 4U?I*ڔЦT>q^ 4zIevI$EvܵMO^ B2Ih Ie#\ 4S$ DgB@te+.RD@C @E @E @E @E @E @E @E @E @e?Qrh:[rC N!^'?ݯR=^?r`ܦEy6^x>&Xۜ4=ڟz<7g%p]8!o YkѺ4; А1jghL'T_J~!wn1ni|t?L&#oRRRT`֟* IM[~~dXT޴Mz#3P6(9& ~;e:m79W$j/:Pb;zw9UJ zjRPXλo-:t{bKu-z[Kڧ|d PN1%JB|aTQ-Ku+k4oO=u"*/\~>(gk܅J/s& =C'7C UT4>$?놿߮GOkz gʏ^'gSz<& F =}Crw :8_WLqXy{n}ŗ9[;7R1LkO :gzcC-ɗ[#1y#5WNY2tWQ%@Q|e ?Uw>tzeSH~l55ĐWX5xxL3WdXC4'^sQ%NPW,|KϱRiDvՙgTcnH6t[:xN9slGw|XGWc Tx8^Po+pz0+/EA//Ď4_^{pAv?u~]oڙ-i2AIВ5J˭gp1> ZteIc(^ލ^ Zk)-+_e6?E+Գ'EO=]ڨ4&]_ wfykUjHStV/sQx@[VUVpw~ۍtQ, >Ciڗ%0JqQjvTd-^Y{^kTip^v#ڙKe$Cevj㦊Φ^#ҬJZ^ӳUPᡀ(N1۴'!zu"[[W.ӪTp#ԗvҧޤ76׀f_^~zT9k޷(|%z}Y369uыxU_VzWӾR<(ݺwJ|UZ6]Y˓ ;Vc;Q[KUcSYmMZ2廧usf=pWҏ~L1C'iD\|K*yJJњY./ꂭwɯ]Ua\~Iz}z:K?zSɹů]SjޚZ}>~hL%-}/%a>JΟ CXMеYٺ7gVaBMJUUNPن$/;CcjYfOd ]mZA'?sMf}d SDh2kuCc K!_? k-"Ovlwm=HQ1SWrW}/{B>{]K<Qn*ϪqѝcvͿjS莿l#rCřm`5GzY.r Ohb)8Q?.N_.;xKI;>ӓ{ivhٱ}V&}_vd}zza%>.p,Z6}8KٕdUXfU%8^cַK]ξYWJOE[usB?'e۔;ts0$Yt}ŋkUyPE#Sj%3MԬ_?QZNVx3R7+%߁5Ng/u96m:=ab0,Lh:H}=;Mū :KǃNagUxz0(VE*^M4Hnd%v=Sg>TR^9w;rkCFyTp3g| ?E(wҼ"iahI]ޤ[W՝??кwnw8ͳXkZ-5XZaI~qttK)7ZqEi=fR5FZoZ˯olԿS?-7jgOJ^sdUWGj V\ʩ][_\[60EaݻUo-u߃z+%Wd yګBJ-*+kU5![}=Y9(èQkVҪwrƕ.GB.Kȥ]H ;r\:9.11ʖ%[\j厭_Ï|?F}oGP8q*ł,Ş} I:ї7ЗO'9R"2/l@p,~lH$I$I$I$IǺ!1Er m|;W;]x-|^_x$Nh޺g]/WQU֐`<aG&syhIa/e ZsP6y*crҒvck*S?iJeM[^I2n2X7VQIeͩ4lM 4Y\EW_Imm)_Kcc) ȭ8%I$I$I$I$I:J2A>~.;Z{p-B'} =*w$ HQ?k6k:Ręo>,ۣLB?+//n:G~9up3{n3Vi#h獝䒀/3kB0NR7 =,g(F>h[*K:͘CNRGf:=y89@y=il>a _YK'3t4#=V$I$I$I$I$IY{DϺL-&vp˃ki?q lik~6i~ܳ2y闝NI +5]sv7ɟ&.VэtP|\Ts urFp*btВN6.m NqH._?˺NLfڐ(dك0{~Imtyr6miNusWhOadW sZ(IË}FMT^A>0 'o߸o 7.?~>l>qkxbK bLӹTщsi)B<y2hϩʙ6ma;˖!I@餩={YukY`ֱq鸞 ߾xt61_G/$ŋU0zT-1Bg}KI AѱAǮAKiɭo\N0j g~N9|.ʟC t| | ,701 .&c[ײ|F'BrFw,\:̾k FUl_ü-ݿ~˪k$I$I$I$I$z,77o|NᲿ3Wl#_(+/-o&#eAo)Va֓kҫ?]|_}ԁX|ngo~dŶy~[sse98NJ؀rx6Bb reWqwba$3m}RssFNeZYBN\և ⽡η~KWk/,7Fn<`5ͻIvA$"gA\qw-,}y K_ ȯs˦H.|snjYmi::(x|S|jӡ%I$I$I$I$I:8`3znXjwS8TM ,]u *4zcMV6XʍM舑_\NVK1YpV/Xš]%=~,Cz{'-clIN~11r h't{7L7pBUkR/@sG8e$I$I$I$I$@Qqt赆hI5I$I$I$I$I]2 fJ$I$I$I$I$IZ6DK$I$I$I$I$IZ6DK$I$I$I$I$IZ}]$xrqGI b&Ru=$I$I$I$I$e8`3I$I$I$I$I$I:,E%b}]$I$I$I$I$I$)%I$I$I$I$I$e-%I$I$I$I$I$e-%I$I$I$I$I$e-%I$I$I$I$I$e-%I$I$I$I$I$e-%I$I$I$I$I$e-%I$I$I$I$I$e-^ܗuD$I$IR6cs<%I$I$I$I$I$e-%I$I$I$I$I$e-%I$I$I$I$I$eޞ0 ꝳxj)=:/5m_ 2$F(`2[c+{XI$I$I$I$I ђ$I$I$I$I$IV%DgoKHDɺvsǹ aב?љ vYvhyus'EYWDIa:Xʫ@uǯ]I Vկ|ʺE+Lv,$]W{tp.x=^s6l+it})/P sU벽e9Qs]N;B>tѥ,]iqW3"I$I$I$I$It1!Z$I$I$I$I$IR굄F|:RQs*v.LG;wt$XIhh&_@YM99]) XwN mg3aWRh9џ{&I1F Ǻy8Zl' A\tU͆V/}'f<>E>yIth%HWw1I$I$I$I$I$HL$I$I$I$I$Iz-!gF>[F ɶ(qQmL to2J- @,7k"FtXFwlcq2g.t&lZ58~?/0֦(مˣDSGPZV@UE5$Z"~j6f>OpQ|/O%I$I$I$I$It1!Z$I$I$I$I$IR굄tq~^ԋ}#ד3IŻ7E6wMlI<>kl  _@2Wc ^-Zkj ׽bh¡5QڂhE&98( 8y\uiH~TG%TTTP^^@nnPY/).WwO_^]̋?o<L2#o6GBqW~8_ ЁQB'0p*ʢ$肂hL#ϓD_&_mMz0g Oz G0cZhI$I$IR7HO_. {Ǘ&H$I$ ђ$I$I$I.6,KvH$I$I{%5g(i7J^s3JHDdq:SWR2Эۏj.,@in![xbbu-u\DžѸ5UVK8$I$I$I$I$IN8R$I$I$I$I$I ѝQBnuU+X%wj d1(wmb4dt,>ܼ晳;y.#7[-\%DO4t2u_%IܙDׂ̃"Aob敥kٴmPV3Sq5`,\BSS$ٺE5;bWo:s9w17o'+p@73gxi&ZST9;19Q$I$ILFId\kEɹ7[LR+x[@[[?՝kd2}< ҙ .9ţxtDo nZs|"/}=yxmmꈖa 0"Z$I$IGW?/js&˯ا)}#6Ӿ׾A~κsۻg8u3?zUwCG͔w> u_~Dkh΍؝(V4D\Wş6w2k+:'7&5 Vz|&H$I$}.I$I$I]vowKc:)ZXU^|i;w%iZ޵N>fd8\r>0Ċ/;>[n={SM,zU6r4&4Kh{>]vgx|v*FœR+!;~^iMVq 9wPj Rl^g0sz6_7xH3y3a\{>w\=⽆ [g_!9uĻǕ ,KC/w<;2m>/.{L 3$I$IMwN$I$I$q&Cz& O34@A ٣wBѩ| @>#E>}a9T# `紋 tµ|}c ;X3NbsܼfhH;oS06w~4CĩXٹp4C䏸_я)fEj$I$IG'D'S; FIy-W\&7]58̻s C? syzkaK{fԴqQ"Oh n L;99{%Ca::?˜L'YjZyNMG$I$I$I'rrH}GQ0p+3G{P|;r2cJοdOuM:$I$I$Z|{I|lhfٌY6n~L@r^fޫhщmlCOS3Q;m=y懟XLk bSU]IA^N4WVon%I#)Miޕ򨪩 N)ߋ$I$I҉„hI$I$Ie*~6?O'yǏ$_W]l>heօBە%I$I MW?sdiH/vs(ɗeݲT8,]v[2YftvF'rݪ(xâ۵|LN%9QRw0q?NJSG0uV-㰲3x,mo:3M0+h(!7pc$I$I$ēWŸfWѼY/~~nsƥeī.AS=9$cϤ%S?9$z4}yԔ`KH1S%I$I$I$I$Iq!b$\}}Ae/-Vf8)6:੍ݐ$$&P ,hsGsIQ/Q%I$I$ z?!:l]xAtY^{|&we*ݹ ShTO䎇HMA]~%=M{Cϭo{ 7a+ek2$V:q+cR5XT0h\]p\{sIFH$I$)zBt@t#akaF;W=@S(=.4F] J'%gu>{9y%tqQ/`{hh~oOqގTEi?{f`|_ @"@,ՂDuذcSzutסI$I$Iq}gFc:Hlb+sYژ 2=so~2X{uxN]Iشf9Kn-]1k1&<7ȭ8T䲳~ dCyc뿱h0~F]oG1L? kYx /d$I$IRhI$I$I#crxqf6/{X(r6W}ӛF޵S/3Xu%gs*Fp y#cM|?wr-f&?7,zG9/㦟 bnΦa 3^eιw$I$It8\];wɉL:e2%yi]kMsҗ@g,%vo/FPtg{ނѼDΟ ?|GWw0+'AK/76ӏ;hkْ#(yzт8ʏvǚۣ 6PTP.LFHDعQz<7z}E?xiQ[կpox%I$I$)K,zeu^ϕڵ5k7дm b6*?۫V/[ 舑_\AA=űʺtc3m9%:SF`0 ]qj2zЄ$I$I1pi]_F IDATT\2L$I$I$IY*VTˈq8rK|i > Sʐg3dN*FM9Q3$I$Iuz!:?! 2@aa!$ttt'ؽ{w4n:I39]S01#sQv&}-2 :(7_ |jR^^yV8uRSEw[ofHt[~َr hiSɉ~x=$I$I$I$I$IGR$I$I$I$I$Iz=!zTIڍ_>76prc!.`ݽ;Qu}QkkzRy>53&DW&~0wG399yC`}oYI$I$I$I$Ic ђ$I$I$I$I$IVͶqldtsyDͩaz^ɽ*դ!]f*-)ycC$9ylo\@~~~)#7xxπ ђ$I$I$I$I$I{3!Z$I$I$I$I$IR];wPM5{.̛w=.z-yA7̛#SױQ9x2V^O+A,:_UN:JNrɉyyytvFIyLyqjcwQw]]?^֭Y S<]Qo\y%I$I$I$I$Iԕ ђ$I$I$I$I$IV'Dp {GvLoIi)ee]:VF/EAc/;:>O{˜.u^O+I$4F $EtttLF[*n{~yJ͝ SO>[69.H$I$I$I$I$+,%I$I$I$I$I$e--)鲬)kITP%v22ue3w{Iǣ%^D$I$IR6c ђ$I$I$uKCW"I$I$)e1r[%I$I$IRG4l;I$I$IYh4l@TVr{%I$I$IRSӯ?ajb%I$I$!v`ղńaHu'$I$I$I'殮%Υ_AT =fF&tI$I$I$enNӼ~CJ$IRVKv$^WXTİYxM ("Tc&ilD 9¢" %{7ESʋ[NnP& !} +g+/B5tC-ЪزS kh淂.Q#!CnB!B!B!GYEE(D% [8R0TW{rc6{p߉/5kjKmA>nљ9ؾB!mZs>Z20tC( :ld[$kF:*IBnR!Z!B!B!B5zZt@ !6AxA\Nz$璕 tkoYkYL3 !Bq_R?Lh"$!IĆc}U>*Aod=L\CNTGP/8,B NB!B1)sKB! gS5e8:%{h1QLcڎ2,JXX 6ZqP;lkK8֞Um9 P8z@mF ]B!F/ m 'sbfF ,edOa(?ꪫmhEDPpq$%D0q6쥤V54Աi?{)jm`qDFRP_Ɪh>XmvcHw{t`<,bD߹h46yXqT/B!B!fChr,B)vy/HQM&B#X^@ʶmߏkIm?:.PlϮBP  NzOJZ 3>KH{bpYgJ[C6i&6\ J`y2-HSΗﬤ7;{)ʵ4xӪA8}Zڵk#NFwn(&VϪU8 Ķq @B!B!HZ#SVu"7i43PDH{ joͅie߮46Oa~^ѽ*f3&|πid&fUаVHu}5ܜ$UI|A L͊c5ʄB!!VRkT23Dz(j6| aµr.瞑KtT1ﯡsUobΞpD9LC˩:v9gIbb!f8 :V'y4 í{aƩ?OVD;@Z?fURN%ШDҳ2H>-Bq$47ۧHC!=U+l(vpt]u\xbAcG&{Qg#5zpSi"q`(w!CN InAoGflDDGfSv4Ԏgڣ4N{EKZT36?F'[ i;cL1mN 71%uUmDN͂>g+R LPƸEcj()PP=Nܚ(;sP0fͅ7H򭻨ϘElGƍK"y_E=}4|G?%n!;7@ah5gqZV$q<9B!B!8tz9o>˪λ_px/D !B%( KX2S>HSq9hTTԞz_WPt Oe^j.5WDfRWVmG'V¢cRW M8OCF !B<~u íkڇ^u%}Bȉ,>{c]kV⎞twm`gyL W]+0s:%_Ί|'F)ڰcO ~\p޹TVVNHhhڨ<mBuԥ#e2duQW/u6:4{,8e2Iv=|o%PI{ COeVz>Ĭ5䱾(& 3IqD؟F'EG{z*=8ˋ VlY 6W<`$38)=-(v؞ 6mNsfГ1 fY~k/5[6Qu];7? m X8>ToqO(5t'㇮f`[ᙛ&W+g|CKkvu'q'A!B!ạ߻@FXtsf9w֡?qTʦRٮCjB/zˮE *(&+!ħM`E\pL8\o=y{iBlz.i /iENb!M!B|cX0&tW#1͘]74lh(,![)QJLG ٕWIa'm|'yV4+cˁB!AѴ)X,CS[\B s ![sD&',a{W(.mepz\~q04Jȸ9M/BgoPo)~q#&S)'6vЀs/;fqHWd%svOFibEH;ҙ=vuqO%13XJ`(ۼqs3 ͋ǫѨ{:|MԷ챙 `#[yQɜ09Il,?F;=,_e1%~8NiJ0Sݽ6\UxHOxȈs~ahk SO;yvH Z}9BI eL:Sg`[NΕ|Tv,祾==W;x aD߹ڬ&Wl ZY _:BH  ݇Xqv\WIM|Hr_~Y12%y8 0Y젵;Y='+7\҉aRz_!B!(]/}QOx_oEɲ#i _6߀:Ho6} IDAT? 3~'Zۦi)fӊwhl3w?E?ne~S~ 0hAH9U'8 TK1 {瘷BHh*N4r4hmmsa7p#ow#ZP"Y54>MQA{;p ?r[!Pp8(1uZ[ѱ\fpt́#@#J 57`r;qAa>bw@onӅTW,НN}N"q bSo4L~NTnLaD| yAaj'ߣsL~8 sAt}pQ_^L6#wnXT3f2E D2ssar/ZCB]U 㓏$?ɕ7p3nk&  wmO>᫒Vj6oX;ླSdB!qqk䛹?xƎW3e9,nAV6)xvNڄ4 F6^ )wr!=i'.b^\|޺xw?1XCJwYAQޖ(C.'mw,r8n񍢚LGwiilz,_CZGA]a}sT4Ú%P+j9$F׬"hơ/sJ׮6cHJ" 7QPzwHe`?0aC6ix$߹i[!K8kJd7ƱVJø}'` {Y}m4}o}~ɂm9y ߻Zvw>;+Xvm$'KH]!BQQgtA6QmS&^cՄ)q 7VX޲%'@o<LDe2HdOC N k43LQ5vQRLJT\23sK&-ܵl+6&*99'"#|uFQPU -d (𹩪lDW-KcubƑraOq.IGC}IUUUt>_Arf"kKuuuEEjڂMZDUc-0;ԐAᢦZ7I پm`^\B!FJK~ygWugG J#45j48f"oեTtXO} sF0)-1fPP  +]t *sKB!š<k %~6Ȓ ʴd8[iBF[+=U ;v3_[+jkP|q$TۮЈFWq=Tb' =PQ9**u [NgO%/)\郤`бj,3>LU.G!pZwn6c3Ȣ]uݿ k?Cu gM>BsnK'+{Tc:WrNG֬NQu3N% ͝MnBp2=ԺAFlkغjTӦs1(_k9[7n%VALΞđPy Y:vV445'N=2Ͻ?'~4Ca ő1t6*iAhJ6"۷^lf͖|JkZ!Dƒ>9SS>@T AL]!B!=l QiK&XqCudT1ZhjxkSo(<,XGyh˳/^T+FGA@yCK xRdВ WWPPC2Xz|J# ~ 0@5>)b,IRl5>XbLVjר+uSNJKjQ#=c@( <ůrˇk !BeE (ت` 2>\z@3g0-pqͬ)n}f>-":Žm-kI)~ƐLKr`GKz>R7iM!slwRq0>3u^]jZbl*|}}Rc3Ȉ<|)D>LE!11᰽YNwgg{op?P, i.c׎`Vʨ1q&Y;xI͖RQAjyj/ V>L LgsS'u1f$;^ל4+pw>*"8E;M<}=ZOڽoNʾZٜqk qdYsJ,oZް5&:[yK^j'mbΜ5`S;޼0M {^Vs /MVOM}Ҷ^W$3?Nﻫb6lɳ=&( w>v϶հ=]֏Fzgs9dD4W<,H<),Z2V}LuгSF/ƶ6EI0?7NkM } ;5^eWSn.$S+B!P]fDHUj4@1s?=dj3^ ];^o% (wP^0HEeDκ>t)SW%mwoMl -TU9{fhnZK|/^ORs0{q*:>㴟qJygYפ?<̏r_O~>aˏ9s,{QbV!0QvՁ忀-"bBĹcka%-VjZFlRCJLxNӕ?{Oiu!MߺГ_R+Dͻ?"z._\(+wه ODc6{5J#oЌ5<~f`_/~eXnjs{Q &ɛO&AnB!G,~s]T)Z*CrV>@1s1'R:js& ǡnUunẋz"7w SC tM0E:n)?]"_qfL x~eSsS^S~%2t /`mo5t5oEϖ7xu Cq0gwqY4aX87n/y_gMt֑[!BD gvǃWS0pj3 /\X?SN6Cb a "9w*i$ 5a c܌d5ħIMB!F%f KObg+ZHEu|΁OJE,Qd`[<};;9셋9!a`Ze%>־W_u 6NBhLrW/%_ޡ3P}bgF[J =,[ٳ@bC%̛u~oVSK|u, pG6a04@߄dis~DNyoOpj>d'7O6(|V(9\}KR~}j.L@YrN;jCM;wEفa%v &=s}+D1ȥY3Ұ(}},}}{33a,T㩩9~W 66;6`Ct :"Io1GClbӼx]l| Z2G ꠄcq7Zr"ϲpn]Ǝ9ѿoB!#(ǁP2Ot6oͧs`S1?Ig0%54I}k);6)vk&;c>s ߠ0t7sd6S}3[˨T+aDiFiSSg%b+&gZY6[~ܓٶmDĄSرlݴ]u5$Tƍ@x ׈sj;z2ge(\ z6 LJH(Zw@4֠ǽgjֵ&p?BMokҼUy^`?a `%+{B*>R"MB]]D}q 4b;Mb͚R4B˙ w+Dbf`xx^˪v1ʯ !B5=PtoZ*CC B|E13/$gtj9's椿/ Kߟˢs=} SStGMħ%a fGܺ {;d-̹5:?yyxOMȵTIzIiY-`Kv/ ݻOeBn6AJNw9%La4B!B!Gb#6c&eDvLk f`2[ rzc ж(;uBT̡;_?OB!0T(Z6s  ||> Ğ ~mValK/_'e~._PWA|<]糊jdy_x}?$=z榢tM^z*?Av([!B!B!B!Wq K<Ɠ>vctA]YntxUF;_h>$a`zlvugt r.ly=(+O㇓O㇀'r^~o=o<_O7Olp1t BP]o^@ ~«;8N/5 ^:u xiYWG‰,TJ? !B!B!B17ٹe+k59=[TpS6PK5T] bƕ g1O@yv HBT@qR#6X TNçZkCu[d&&kk*k~uSB'sOrӼhgvչB!8zB6[i} ahAHF'EE7j IDAT:>NjϧŐM^-{kdTubn;V ZZ9ө/*iΫ*!7PLTT@+ʶsmS^Ԑ 2K5B!B!B!B.,|wjtPL9 lțdQ(ۺA[l.;RQ_5Qxe^Wp8]Zid s2(oXnߡTgqqb^j4)B!'';;~q wz 9ٙGhmaz$ƥ [i7.}:%p[Cyz\x\.</#P05F>g}U^"mL< 7 w>owuJIIs{8 -hQwI5*h}K7>d~;e?B!B!B!Bh_kr+`JX ?귈e,QAoӗgog7jIe!X*J}'MB WfɹX@ksC7{?{k~&嚁b[><ر8Tk7>PPhckP(íD` (ųTR-<w[;w_͝%ОB!fbN6v7Ѡ&1i]۲=_دeC.>d|B!B!B!8h=R|t47PН54<+a5|l*(On~3\)[>c. '5,_w{0P]]Y5j|.1*[qޓR9n͇ԡtW%_[yf7Sz6þO* ?ky <44iGMC>QŒh:e>sC烖B这t ߩEQӯWt^=|#r󹙄 W [WiRNM94SٮW[:B!Bf/nr͚Lv\bvT}*?y1 x埬x&#;=&O ^ނWq`Gt+ R~rET;u'8 ;E4L?=q9}̮o•9LIQM=RYz9m9/iT,D7]wDܗJ~\>z; cq-ݕǞF.13^{f~E b,fS&mi- Zw =mNMƦ8WOa/(Ӈ&LFB!h30pw$oPk=5Bԋ瞫 i<9ϷPU^U0Gsw~M'LC(,"Ț23mΙ$8ο1:>)}__-qWy?rwϽgWyO <{)6P's/;Jj50_r#DnSd<$%|p/S2,q9>&՟45:|7"G5 r}<~YAIK k? Ul$]~%/R '\ǟʊ:<@QI]S{4?&/F b9%)mٓ3o)̟s2/yǽq kl)eR@Aư~͝K[x[0%=%3yTuE执2=vOFFXtx,F~R_>~׻KrqD3B!B1,J4nc ͇eܹӹfvA0 S],~VX6<|mTv|fLH!D6es+_qυIDwj=A[̔q9j> PZ;&_䂪|Tة4n2|?5נs t=%?%?x~Nڷwh^>>/JX.߹9.]; l@8n"c1c{xQطB!B!B!B|(|Ύ/]60cՑQk8`"әDȨ;ߞOy EJDrBF"*;MfMfbct+^2yTxD2qJixgtjVbȚ@T!Bi*r:=9l gʌsڟ* L@1aX0}ņb3j`k>|>y}*j%j"`hW` 260 CꃦU1YMZ34|^/fV hdl2( Jo3WT3&kugق`+6¾=΍!B!B1qGsmG7`|&d{' ?\Aewzb %m M:o8' `sN<>.4iڼkvKVg%(miBB MJ-](hK %dqlg%wkviF!ٖ/ȶ3=9wΙ9|es'̳zh4 Q3#c#!iL&H3d9G`d;0Fgӻfde9%Ň .eJI-XμLDX1q8ZfD,B"6d%̑qK/g`ߊL3!&>x\_ts{1a]L Dg9Lsba`&if=d|#""""""""SW҄O$0 sq:d'ӄH4F@_ֵr=1ή.~ӧ[^XX{\.JKJ&nP"""6@f#Ѫ@_hNUpcs8D""0NWָK&7""""""""2u}g]+aQU#e \N;eE^nj2{C/ p5_DDjҳsmNDDDDDD&ph'ac}Aph(#E7""""""""25ps/M>?YN;<77w\W-""rcwhӉn[OcbRTRJ""""""SH84DKS=iRXRwR:hiWVvF+"DoDDDDDDDDdjzy5{cMw [FƒI}c)""r#w lZ~bt6_@QI9o~&iD#a{zwb&o>E%e룰H$@_ 'R+&ӅaGDoW|#""""""""SOcw##wL #cw&cϜ&{1M'S͋L^XwpUegez),)pbEt6:uCCD&>߈O mNPeNv4D.LU+8ʿ~oge·ߕ(W$ot;=1,VeI_|o؅1Q$z(󅟰/6O,v7z\+}חOC Gff Ute1}|NDŽQTRF04@Tu57""""""""2LT|~M;"ņ>C I&5C0&?ީd{eŸ/ 7t j`xn3wr0TpyぅQ(I ;w7cĀ{v3KY525ep:ynVDDDDDD8-Kt)""""""""""6Bm5N7 s}lfKPe[%~=@$:F.Udҿ-mSaWL/#ԏ`3=~ƿ~.s#'E&Fk!y,a;,̱}p[Ĝ2$߰}1K`M<ܶ*Zn0 >41,}<{YZ9smſ:@<2'D0ܥZ0rV0WۯD Dd|<*/eY X3?_ O|"z9| 2u)~6 nZz_ݽl~5V O8s p hbd]f{ӗ>ħ;Wi t KDzxf)b՚VXkfsܬ"q=K82,z7%:̓5ޞ7<Ѣ4h3DSt!t&3`֭]%sQ)TJpJ~*s߽.2Q)+] HJ˃xVd? OڗͭQgKl>)M6̟a> _SWycOZI΢yWϞ f=|Kϱ/1oXozTC7y 5j,`xW<^u̸hB$r?ޥԕd8ߤ!pKVLv/k!E:4~;d$|쿼IK9ܻR7I=C9/6'Fg2{?d{%LGX9p+6/1S͠/HWO~EEDDDDDDDDDDDa $-9˙D7I"$N7l?~Ǿ ר-\B77=;sG7vMbW 귾{c'?ʢI4 Oh#řd0KEW޲acc_G -|7MU_돍 CXKy#-NSnvLbd"Ohd2yjwF$*qzmcL0lYyƂ"ڏoESs##6ok qF8u};[KS~N8u͌^Or]iEL]!n5ދj`ޛvݿyS]L Unƍ/&n&㼵8p>E3j 4q5 rn&*dٴM*LNX_iiLDDDD&?Z(7}ذ(_wѶ^8bLQ&8mhRpUa}}̶ϲjuΰPR= W99 $C M &N5(fϚKݠ5rcP%̛S:L%星 >/W IDAT]G'S/Lbxvc ,^rXgၹv =7H5`gGAE"N/KEn-sܓ0hPP^:W͎#}#ц=Ea`k"cvwf̡6{B5 \L;]J9Z8.jyPmV&ss!㳛`Kon:[6]tn`um _1}lE&5U Hm;H(bw륰 W[&}Ky9< zH L`vc!@(0H<>Y8 2LdӹؓEDDDdT3ʑ_X(7} ٍC<md_$27w~"C'oG> epj{O\\j^owf`^|'(*$ŢlE# DE L$PDDk\,cf}hk|<(u;I8 WYi?, i {Q Evڻ(cj+2&K]5=YDDDDF\fsA{nʾ`y?Γ/qKDH`/۵[68;.e^KsxGol[:κrz޹8= Gi|jT;/˩- & ḽȹ liH IÎv6~dg>u]l?\9&䛿^.qE*QDDDDDDDD$E>E>_g-$[@IY9K(`Fh9Wwf8jcՆ"fjf e '8V^߽on$E̝[0í<',e^]1jW3I} (7_25=ed#'jcM{ŝ^ $;x ej,{?^jmɖ_CލnF1'O!oS |U_ ~'h0 _Ɂݧ>%cV>?lhdɜWEc HjHDDDDDFe6,}bhB x S%6D}9CahOahkgYH" :IlC{#v=1Җ$y&$m\I<ӗ~C'[n=M$x:fZ8zsp /]ϑ71n&zȪ\S>.>}Geԋ]au,~t=1 ; )e xnzc d'oMCo%PbaNF),{H)⏾oib?_^gLech?B,jgVD+6@?wIDDDDDg&XX_@|^_羚ׯu57"""r ge)`ThĖ]47]@ᙉÂ̟I.$ 6*糼r>&axDq6aAU6&ַٺ!x|j;^Bw,cGZ*Wρpow9SbJ."Ͽ@C B7b(~^WyO!f1cO#='xbdzޮo ow̿xu9}2̾} cz{`ss).h?-0 }z8"+۝vw ŷf+U]&UPʙ܊jh2Ew!2f/Gg ?9''Nwbq-ƬPɴm:WcxlwJPa_yخңKEDDDDD0 Ӆܼf/Yk=Ea kF$Ÿ ah_q""""""SӕEYE%=~bظیEc0&|jE$5_.,r-3Ms? '7gx*` n,&auyAe3c=$e̯+>Vd0H4pz8) WEDDDds`7 zd,"""Ό;뇑 ۜLRNW>Ldg `&>E<>ߤU(Z*B"Wm5W(+{LQPAC< $G1k˚~1us)Up/i&X6daW& S#w` Nb1CجO]rYCrrrUZDDDDDdz& B Tz302d|xb*n֣LKOsih"h]41z{46S=ߘ{" 4`8((q9ƒ?UYtb` I2P 8p9. L^5EN>sOkKA~>?E1zz{1MϬ-yDDD$qWN$x |Ln+iG8Ӧh<߈8$;7u&_fFh;73ά!olpS5loa0qb}>JKn J/#F 3ג;O[ݭ>J{pP8v#!}r5x2%rr]3Y)60Ә5M{k?d'zi8ROQ8qbV f5r>@9} .""2n DcdQPR@w?pXx \Rjf1ԍ5mCvΊ=Jdsmp[8 5sX/ W9 L9(]9Ⱦ#]9)u3KjsREDDDd1,ѥ>~-hOdf|ՠB=!QDD$Swcw0$ hXt#ep`-]3>8ANjmr 6'N*/*REVzN8tZDDDDnL5ENUz"""(-""""""""""""dPDSN<]&w1-du[1N@ l9>s3,TgƇnkuٓ""""""$HHH' F uqA^+gND2A"jix:;a+"yA[9C ôQQQL#~3K0 oEDDDDDDDDDDDD&I6ct3P l,9yQeM]2G[s]A"q \ *enhPzzZhg(nRYSIy ih3IbRVUMr+Wi8Ao0[RIuǥ&1:iig0LܰOiE9E9v.d:[R]YBech?ǃ{1f{)L7a 1pRgIl˙V~]p|1Dc{/#KɴJcOgYDޞQJv\;$]4n7r?P?C ./FD`sSPflAog&r9jB&uϽB}5➪TW&xz{'feusp%jQX3c3 wWvHǼU6+qnsdqbsna>8e?ü>)b٣psc[ZxZY|pf [~w՞e;C$9gƭ+X 2>nz=}Pfh[6w\VZt$ood0|7aѽxwN⣛zMwtsy@fIwUZNt/'H_>YV~a(l;oEDDDDDDDD 4NBCCc)(,l=DDD2eWN2j81!4 0&up8΂*fՔH2.mxV=t/sROV^!73gQ$d3}noފKoC~l*}9=q&ˊt}/sKA5 jJs$t5qPA^Jjl4Mr/.3DOIN ydy(Jsc;v3"f.m%:M[FkbYU+h&yCH^'Ew|ڨa3ȩt8VULVi tp.q }p-7R'Xo}NjR%@y/kg O_d؞ETqBjtrN"?,+J~Due,""""q&QzK3|#%Ă`=CaՆ}a\)L{8YKx}7Q8d邃{f;-.lcʊ41&H@`-fH}<30,*Ao'S6VWVV0+ofb_>oIspsqKE7/l}`;*R}g}+"""""""""阦Ic4:$ 2鳨1X)k̑–$S.VEΘF3OK/*#o]uu%0?Fc|8ő(`bL2T NDDDD&3].W0o y~F߰g͋#knNÕ5\9駡%b&S 8s?v&c-;|au6ђt744!rV2w7Ӗz=VDDDDDDDDD.x]deŲON'ahBNuUdejoԱ%""2L@t!,/sJ6Nw% 3fSٳ) {I5U _1kz^j42N7;i੝Eʧbh | AӨDiZ&nϩĕf̩CƮ`KLf)9*f1=3BKslhѝ,HshVvlLV0}Ov50hˬR(PgsFv5*)W4\Ud`3 f̢8mmvuT9 iIcpU26;$0fN7K0fIA-}fT3fןO̶RO"7c!'C+J8ik+?s?(؇y;YT"}o`G{;}1z[LQ|E&G@L[+4q `ޢzW\y+C7pni?'GЬ ~1o ~ '>`pjWy= F$G:@!fW5sk? n{fD'G /(""""73o|ۄ)/Гx>+\7`Xl8rqNF ͯmt7p0lkr~`Z_,{Uҙ,_zAff ׻Dk=[}; [ q3B[)LRY3㪆xV= 'iigW} """7I,/? EVEf Y#yd$B k?Xi5aVL[ N+}\\L""R""GpeeD00t/=Še >oM5~ήehL ,[KRT6 $8x"uh58ܲ1E_FŜx8G XV8vDK>J'XDDDD&B COnO9gWΜ>UP ;8BK{Ct78G+ɺ:^ D" z͍xT4Gd @Iy5CIy%N3"OiIJqBŃt 9jg^%%jA7T6sgr?Gػ3>N5pc!E#0ڴGzWZ.efN}FQmfWZjUmI+` .`%o*!@ I(RI!0ޫd[mޥ]iglٖܴ,t)yvy&IaFan!-2Ɏ5EOh, fh7;!q錋Kg@G UlX*՛`U95XF\ebbpuyv:,8{QΧfZ,e7?\UkK !VCײj3AA@t4sV f+-&ZhjYj rq`4|Bsk][Wp{m=[.fk<bhin";Gksm;RBיN7 Vձab]0} 8ݴ1d%#QI,IsA.;'#=-E^{(Pz(9pavjj19?YL^wa &il.|{Fro=2 X_iD1!UnI@q~iGj)d+yY{&1~\Kʸn?Y坘uǑfUh#yCzm{|Ɉ^v[O1 s6QDl̥lѤ@.ӭT;7mÙDZө-6`6 7n}lXB;`&7뷱cmM7SfBj{Y'KvjϚ̑BF2sF&6֝Kt}-nbG0258[79v9#0hx`b:"kc.""""ǻ1G1&g@!#99 m+Y\شOn}r|t <=;@~F qq􅂅FKk?-4U#w[V 3z,)<l#&y8Xy,^U kdO%|ں|bi|n簳"&:]Rպ꞊br8!Ņ`[ݯ}M;nƍOVIdd$))) t9_R&˞o_}Z@n!G0*3a. xb{[#\s-W/,)U~|-W^{;s7DxfQ_Kd:@jFi19 |MEzY'89 CXOJ'4׬烏8}xCU2W"'+nki-O" =a{{ܰO4`a1~ųş&UY ;19cI+`ųuIޒ|49SR<u->0 0^`7h!9 kZ8q ^(k{Xf牦9}L%Rj+wmnO֏h^{̚>kK]y!yLʈ:oo}JMY5m&`'2keص="-|lNL$6ĎBR9uz p۹Kx6}Γ'br,fe Tw])8]VDsjFbbqZ&؇1}>ֲ`+qdƕʌg`,XJnb*l'cάDˊf5"9e4VSX6W'3mB1rfw DF(2Bz~Peshl! 6T󣀰d̘ xeuoK2>Xee5>!r[8UkӁALD/_ʭ4זRPgS9aT&$ xȐaC,yX}/ja տ{k&2\$;[>1/rcX^)հ~ Fh.{qnuw2|맜7W{_{IژȁBG& NO8bֳtF ۨ+Eݞ a oČ9 ֲxF 뚨DE\$eOdڤL^Z%[(-l#)<9 wO{F֬q/cZ)*{KSOAbaθhXN>nvhںyԓg1!_&:7`WC.%pǞ%,_M4VX}:K!--ÿY~t5%Exp0<;c=U$""""2؆1;W0CDerڅLvFn\=EGe1,04Jk[;APX$p{˙z)z=bi/;bF5UQ^HkA`h ]OWL9ČY#'bAAq8Qzc=>D`Q V=;7m`] OR\\B AM&wiBF4-Yz5͘H2u8R¾ `y/7KM,[Pa}qOOblB]+pM>mvBݩL8e:SB>kW.o'eMxpN 'q(7֐r)+sljKʘɜrB:7u>(sٻoD"9S˲ekUEcXg1yhb9Jt޷kinZt4l@fXUuH&*h0.B#qGuUTշ0pᎍ&$82ۨB;%bzBs<젹ʺ:lFwZKUU=M,[ADDEMWV`er$Mo9nmݼ8Gǟ퐞9O &:߈=mϿ_~b*&OSÄ#478 :h_o.S?^YTu3_{sq1E +9Ţ:z9xowcnc \};x"ap㏪j;_׿QKw/=j|*??BA<up=44Ow{vtPۗXZo OvZ{=%nӷqc7Y-ϼK]kb` J+wvӟm{ɮ#?8$t: pI s|v"I m.R:yK"OHH;p9 (jǧr6o bD6 C JKY\a6ffae bffR,lvjZ.C#^Doi>0N>o*ûi1 z6 Es-=2? Ԙ0=ˍe;nQzAYsTa}YMkyO0̾)18ZYǬ,e?Is l^rc'6qY)ćT~ns0퀍nR=\qǔv@@h<{ci)^. sJ|{N #{|W۰@It/aۺ%,\QLQeۡ9B4-2!{99q."""""""""""""""2tu8-rp۷Ql2slg<[)al8u8Kٳ9'c/+ˏ>ZCEGy wO%+fI1 o/aڿIG=ZȨ1?}ûpw=tK[W]mAW!m)'Gܰq.7 Kw'_W'PmÏ~Bi|'Q{<|]poqMxs 8*TοTkZ͑ q\bRm%K/c'ߒgMd~PfQ]YhcUΨY]I*/ol2Bz[g 3Ήa%TYWOw$8[,N.7Ql$]XQn7_O?04AؘK{Xl]c/E_^O nR`.v_}֑ [Xi8}@s]Oऑ DߩCqŢvzVtF𰉜1% ?ADDDDDDDDDDDDDDD丣24Xx=,#F !or/#|Iq*ϻ/Һ V!USw8[LΛc78{4Y+ԄaGF"mޱvY;a8|.94k*AeT\JZض3v>o]Eg+E+6bGMcfasϰP G3(kyIi=ÉZZ-cck4Ji`[TT8)0B jT5fO;Egpf Iwd`#qhܽmɌmK5;SÏa8!RS Zb.CDDDDDDDDDDDDDDDDD :& V-v|Ϫ3@kDilDd9(B ho0v8بlfma6쉛-4aAtL.s>O Et`bmlDEE؝zwDGGbP@?; w;hw"@H2A vZٲi+Fl5y0p$߲6 iS=|]۰c7`$ھʖ;=@nwΗH{7fl IDAT}cBco9P6{m fm,3= 476z,aNpbq:$G̓ovTرpyW" >/泼ة 믠-H;*4!ԬEsUM`$`c̓8)_Vر`>yWef[Bi#bx9Du4t":5>*1KGeE `DFf 6*v2-W Zy&VU^J~&j*x< C ˲x~ =lZjO'{D&kPJtbm#&ٌ~p^5&.\ʒޒ"~"""""""""""""CH|0 w\10 9,J]M5ՕT񴒔1Х|rL2|8rAM-?v/J f=zg#M煿wM'Rr G3DDDDDDDDDDDDDHUPW3EFhq+ -""2@ LBR2YqhRElIqyx{P?r5^Dz1|Hy%ҙ7p`yY櫬h1\k:Ẅfy򏻹BZ}-5[ڷM2= 3lX#6U{P?t5_7"i ņIѼ?B^>ݧv}įn~/㥛a_>%0b^^m +m|Bi5Ox%_`̻-6[ص EvSh!PUQa$ (xa"""2INA~&+ʈQQgb36yOxM'ܤ%dX:`ʵ˒r޿m{?` p%S-360_ 9Y_t'/o[~Eω#c7`<*=F@odAԟ̣.n_'O"*)1TRV#یYg-˿ۓ'1@si.+SK \͒?Oᅵ7?ǚxq $Rh15]qtPL񯸽gzA^qY pPN-֚q2}N"GnDDDDDDDDDDDDD0VW`YEDDSASUQFmuÒ$$s5MwMb9b|J87¨F$GK;/}]U4xtXF/ι:,|~./5mJͮS(Np@pf_YTR͖/>` a#$es.s{ 섫x/)w?Kٹ3vv}j &u7'WrFJqt#Ư%gYWUŬS38-'\ah;8i Pu 9cW u@G]!=sT7""""CE~F<#G@񪭵m[6"#{@sK' ˸+V`~H-`e2_a6f9o@jgyk)Jay 6$"31fe6Jj[0ÉOaLjė$ ضf/6Wdf1^_#6m 6{(q)ٌG,*!vᱤ͈Z'mZRM}cIfdlsƕӟTOv!AEDDDDDDDDDDDD @+h+]z/`Zhin"4,|@jhinS ]3q'>n+9-8S8>8Fl.cq@{㦑ܧcLUutlAgM$>k`ːo&BBB5 B>5a`Yee<r7^0}>aRwY6aaa֡'lv;a8Ǹ:][O;&Kv=f@j(/ٵ9z}Ĕ""""""eձXP?7W,aah*^}X>u]t Fю|(ڑaHJI?2s :84 F:\ ^u_BB /ztIEl0Z[Y3n4,4ijl`{FV-֖fe 5}tAcC5ՕDDEp8iz|#""""""""C[a/gvTyIG Ȭp<=Tw_*/@W陣 ǰ""""""r3 RӉrRu uu8KS֮M͎+8"Cn'n'ᠭL x߿_tw>ml/ocgxv"?9w6>Ue0Jz(r7h}lzSahbw> 󍈈 ]};VbPCt:0T,x۩mh)!PH:@mue0J\BeQ[]7@Edv3oxyjq:Gbl$@ \c#UwΧxO *]׆]׊}1DO 9Z 6wvH9F}BU] wr,_x)&!!!ttt爙HshfGUZvaބ&""z|GDDDDDDDDDDDDDDDDD޾",+r%Kv.sw.&L`@FFvkr,ջ),KrzaQy1O|.:9Gr\}fVo|nᡯ/r&7?mrCs)5HNJm˞'Ϯ=p2?~%99r}"""""""""""""""""2dW12'e~^f?-I+_|~./Z>yL҄\rdL,_5[WbE{uamnY͊ &)08 ˚T.||5}bG4qSfqE_ars@ oVVZ/6F8V śVyj@WsD|5Yj`72(-"""""""""""""""""CW?$8;y{nWv]z)]F@mm-[nƌ@hhh?U<T/ =U5>,壡V5o;gk^hO[+ 5el_9{e.q~1;"^ DȐeh\GZi̹\s4FDYmmzTS{|(kN疿<ՖTџ#$iϭ饱Uܷ6PݲOkKh?0Ό 9X̀9cx}u3c~>tDqF&O ݮ~GªG{V [x\3! Dqq'2s%T.|_˳KŶHDĒ #TӺ3L~5--kxeVlu9)-"""""""""""""""""C5;/3.3szaqߛ=#gx[8?? ]@q/sV}{9{0wig=Ԝl]g7"'r7i^N+vRFj4J/8b5,>E4XvRGv1RʆeY[PFMWd<cObڄXSf'\̴EPoe[U|T <61SNfRzġÚ*6|e[˨ow2i3yۺ뗱|Z"6N9i4 A=s1dR_oC@x<'Ng\Y!% aG5m$8#߰+ײ6LGL2qAt_R/[κmTXEʘɎqj>QmTApHFbŬ^JIpZNhz'ON 9mxToѽ͢r`]G0O jZģW?ga;<8P#`ֲsgҰy.7s3dL(4M\-Vs3-oMް:JXԯwW{Y[λA:s.;?jfo%?=+~ =5}n6$^ã| {o}_6n Ws/לsqo|=EC {9ȃ?;=?s*}G., Dthp˜hi=N0(=G>{Zd|ۗl$͜e3c6`aWrBwO9fOH!&(]'rYbv|kͤ&MS8oFd0r>z~<873Oaxҍo>е4>$g=ڪh[D7ض~󛛱"ɞ9Sqz(>\G:뙼_ֳe.7V7Zҙql^[ک!>q'<63fO&;>~'+?}]Pg`81kYON%'R5c>PE?pc)ܴڢyK( 9ߝ'M{VSڟ7ϱe5bu19̜2QDy|+gGMYퟨ/Ki ObId%ak(o >_KIq =>҇uvmM-`m'1Z=@ Ցa{6w>0#"2$߶}8_$͘>""""""""""2XʯM4񈦷zH^3+s39-߾_ϲ}EOΌ 9(Κ~a=!;Ún׮];}{Nѥ(Y4oF .rfJd; vJoc/9xLB\ΙCϑ_1oI\.c37O6ܳ~gRC;o^[g8\8b?l9V߲?=2}2i>7_gI'[G!$n|a.-}x3">;oK/oi'OM_q%?ϟ¼хd\xO:nCpٕ7p,|qޚ((m9o|Eg cW_΢GwRyS*s1'GuM]~{W_u=hDLmbN IDAT_ᤓ8vuq/S?y'vO}XJ;|~q =p`6`V}Znۮ|: EEDDDDDDDDDDDDDDDDd3%W0;#Ds{ʸ t{߬<`9{`Q]Yhc=t'MY]Ilĝ{g͹Yf F{vYN?.Ѵtܷ_=6#w}}KCe)%$w|^\j-G\{A>K߶G՘(μ°!/徫NE;ݚ{VƫX٭|uq\u%n5?^bYW 3o lMKy坝N`[[LrXY׭hd;H]A ^ƉSOE`M'Ym,0IiN^zZ!q6NTdA>/0F|þ710k7Y >5As6ԝXQ(ncZC8sC8cPl1щH&ӲQpx 4Fps#{CWmZ1=q54ɝ]MHPWu =Oك!wmSGǿbs7^DD    B3*˩(,98`g:]w"    Mg4vqk  TTL P k٠umGxegUyu.4Q>l[=P!'y H6]_-' PJL+D[%!{D0쎱??|)٩We- ݔA@#-hA-#11 uL`ɝIurʛ/WACUjF%@RK$!(NUǠ,N t`VIQR"95U ۲?7Gqx %TgY5PbhS) t⪮vV6^{3> F|'!%AAA0r8vaW v(U^P5@ZZ*m Zq/AlRKiI1eMSZZ|{{G]pjpvAAAA`'IσKs4ȅ]Δ| 74x֦M\fgk ^ֶvT\-> Ow4L48|O%+5IxZ۔48;Q}>"jk{n!cU\"ɦ+7kwU  XFR_m<&Ȁv K_D[_sAJyUĵcm6t&S=ZLQ+2`>oRO (%f{PYGo6Zmg_g֎[=m7wG$*Qά _L}E1U$ v.x8`ڰ85A*P V5eߛ{k^"oт    4ɦ/c{Dy^_Id*N[l舽C@EyeeUVa2(-)|ۆXAAAA..K} o-d ^lӛTfOňCK94 ?_&a؉,4c)f@&= 0?StxNcB jL9\ܰLɱw<2~՞Ћ(s#H'yl*+ZHɣFMUk;d.gae6+_/$@Z/s/\N!Vyv?U-e3,¹m3<8;mZėp'SR TckME8ts] y$$Ԉl焛Wyaom($omA /ŷ|˘I.L[;ɐ*G`#\Z]y3ɐ_ (Ⱦϟǯj  \6lZQ7@qq! 1%r:w@Nx{{_b a>WS?`cy/$Yg7m:ѻFzasiJYZIvB<] h*^~c)5@Bup˯-]WJ!צBNeQjqoJIL&R+0o[*9d( ZOo_=XjqF\r(/#1}X!    4BTԍ.j`7kyDKo߾3D o>_NNN-PMk=9fo#ND\0O߭PAKpnKikGpF~ωcͺSquH%2rrPg<Q$[~mf`!LauF$<19LJڳu)'`_L 1PC  ͢MF&S}y)߹bɼ|ާ7ɄdĠ/ cѬ]-2Zree[2kjJ[,`[ d{0$ē({z1>~mC[ǯ #鍢(de|*Њ{     X^D_-_)!h_p52-K6] Pԇ1}gߋQ}1aG qȨ"g) w|ePMGgoe{>v"fR\ʌ3=DDV]D6UCVfS9p8b&32(u}#KвJde,Lxo{uCSOWA[7+[I!P:_ص"]a*Eٻg'+؝\ [W?CC F\J̚%x_WJɌ1_2q<P;}6V]굫(--E[B+y/ yor :kT=;piGbi27y | 8 þpxee: EmkPBiux"‚,     \ޝ%9gbBDC_Wƍcܸqsʢj'r# A)`.J.b dC0ܫ6q0nbuQ֬?Q8\}#h;-R̖s$w?t;tj>@uRo/wSبsZ&րR֤Y z8#d5z!K~M26vZ9y--piSX [ }a@g߰ls窟`:ucJc1ڎpqz2RQWOw[Ս(d&Lт    YcbK o-d/yd7rڨعk(ӦLNB)'dl f IU^= :ma ӂͺaed?} I#׀!u s Vِim;xx+2 i+-g VR8L&-ɒaJy/e?I1Y6犬|˹+Jy f+UJn{87xȨ1tEgS-i|ZA9:?ĕ8 y3( pOOSeH"dP ٴd)E5H֮Ϙ<{=9XmNb8S^]׀0-/],#e*Cgg{׍ֹ{OΝoCr$K`uI8uߥ.   Ct^8ʪGju߸'_ܠ! kL+4}jb碔".MW j)ٔ2.9X~-f,L'9ƕm=3JEIK$-r7oCrB?p#(Wmq {H% !{2$bk0Qv 6{Z|)IN- ն :#iR)JO$ޮ;`?l S9F5 '!8xUyI8x< '% ?+=F< riQUԤ`hwOB\?[V!])@QAIulm    -kw nEʹY q2e ӦMYwZ%JH,y%~*fk?!2`O'4R?NAA1^ه_z=XzeƮW#SqƜжwQ5ko3/,`V>_K{?\m*rH9yrrS *~XA$B̒3AY]HD#)섇7a==FA*>NJUܑudgTя^ֿ2|p{cIϯ@rpǟWsU;W O|nSjɛȫףn:kp"RUwhG$g.lN/ U I:J^Jqu{C5#ұw0%>PنN=;zkf }w`LJ{W&]Kj0 jbSк~5uƻאVoc  _?o4(* X&L^=,ݥZOxwSG"_QTXz.I8t&mJ |1rO1' t ;;j1~=+| %m \G:!;nAgۗoݩ3K<\Pc %dgL_}vȺ_1}{͢o҇<\Ӣfl:UVJH):U)lm~O7靏^j*͡ VG@V^@`K)/+%?' _*    4 *Tx{m!Ŕq2(= o:Hfy 9$E֗[{ ##ek ùDU i8l8$ОS|9EZb!uAFWei I[e2&t6fs zqw0}j[mT&ivd\nb) }_Lµc, ~%?n%7;S՘EsU\7pui 7>e͜:sal5Ndh/8 >cI,Jd}//!g KNt>v?-' I:Ig8``PZ<쿙_h9WF@|~?]w_tw4$&ϼF;:Щ˚9|}e/:5pz}o9+xI::/k`"}O4}`?z֫αPr7ƣ=}1uZNO>L3Sٳmz;ՀdUx'ڶ ?ؚnթ-;w0F:'OSl{K-i\|~4aƲflp WODY49FRc]ХN<s7xk_<;ElaC+DndRI2F̬)j0uLd `ԐyveܔLJ`|Sϡjj9'W4PK||Ey%׸y$fMMGkȟ 6Tgë'ropBw\ 0`QgPTT@AA^g4^,\zWG,]'W2Rr3R#bP1;9 ꁝ ŘGH/OaxOel`SvM9Hh޵$~D:AjC`k#V-ԾhNSUmTc]Z;7μ8TC`W4޳iB ;;q~b*]%ztڡh1PN+-    PV#a2U}1>seimݻw`޼y,XZV'emӏ3д )+2m:_#0 IDAT0˞߶{;︽K.э0޵ky'3/%{<̢J.ݦ:d|}w4pvɝaog[VB1٘Is,!r3;'} zLο?>C:Au^"/\Nۀ~<2^DIR1՛6!;c)Am㨉\Pf7gNhRZú5z{rכ6fqH)D cg"&|C iC`JM$Ԁlop:x~v&:u'4m>] !pD^'&/P ⺁ N8+{vu*̲D2"ܸf;H"|-#\MJab 7lcJ|P4i^Y|k#t)8u[_Ŝ'(Ƈ7H⟯2qv2M`pop_'Ԣ^ώC4}"埳6:ZvO̗GPdİCqS8kb28Igй8(9s2WfCe:[6/=_/cӘ,qMN-q${iXpn{-1t|roӛ7JA^֯ \Iۘ  %`&z i|i2jA4Q%'z 7X6VVV;q7Ns39l#sglcH#K՟HiA:q{dhw+#~t3GKf{"n-eH=G{˩,Qq>GnϜ꥿UC;uvF3f(/Z}$[]gh[TU%tᅳqvuÓ<2N'Q I*   Jl9UhBb'h4%I6z ^\jz 6uoP&,+؅~MYZ| ʗf$;;b`-&;ѹq N\Ѭ4Ms\W@@J٩U$[:E^_Ւ(ޛ%*yqk鼯N  ۷T4ϛum^ܢ_ʇQ)na[cS!RpQJjB "OsIYBvp r6'9;6OLU~OQOO?Khy5%^ ?$~$ ,7\{{VLϬ k^KUr ϲ? W^mGjfuZ VRZ,WTexyy[\nDu_ 9Zm -Bd|҈}kڽe%r4A\d_/Z%n|yVi~ QKEyZ6A}m)-)¼\ܭ\AAAA©JJpss$e(-zC~nXh+QQQW^e P Rì~M k.ԕKYmc^l| WZ7/<+18EϙШlWNTd2gB@NIfN#+H6ጟDF^|v4lە)XG0sjhwׂZ}@Jk~Dr̘R3@ƭc~3JYO|Ԙ H] mwAF!o4΋+ܻ0`h&GR2ٺ%{]3V3@v#wK'`Y&+UdAL:F0t^+ ϷRȴm {W尿GÍ8>j `ޚZ;C^x[dF[n9TSx߯Hx<3DŽԾ>HD*qBR '-ox.{|`hɥ'VR1eSg4~|`2(1H{-1sb*QWF0t1sR?\.UAAhec+xxٯ1񙙼9JUBv{B3N`NaϞL\җ>VȢk6$4688A+KHTfcۖs?^LX0ZOKN[1JKAs :}4Z-^>"    }j$J1Z%z^FҲr^ +3^_)bks R@)Am۸còסb{SfS\9 whQ-{JQ4nnltvNƌm%r>;q&w!`JtqA2Sm_Hiz*-։ZG h8b =-&1zZ.}v%`ֱaY[]H8\3ޖ":m쀎L d!1Y$w"#w"7!B:ֆ2|DgG'"ev'HOF+ %=2Qq?2#7m=ƣw0F퉣uĠe8IT! bQ$-ƌo)z0ɘC>DϡxbOCno1;o7PTG ݄F4 N2^:%Ő}R3ՆuN"ŐMZ Tls%JQQIp;au.0Ue4KARIY@vv! I]b -B\S$A=q#roOT|){I;rm.tHD;_'poYFEOAiv\^\TNf6e;a*۷tKQ+IKG4X[K tR.zc&u+4FEEGn^ ^dgQYQvAAAA& a,\N^~\dTU{h*zqyWADW@@֦S5`0\P'Q ލ&EʩT3Lص79ԫ ;ѽG|fJT쌗}ҥ+r\S$L۶nV eB Uh^l *.DDY r#FfWdtʼ7B78;+SmIW*(TBⶬQ8BFA LiلH%EV% A /9$ (T7jf=.v<$k+)'2dgca8U쐳vrTr t@U&,<48jj9Dm[ y.l XDbB>JoFw%GВmDohq*VFs%5̌}84=xۘ  B뒰i# 7$d-N^ؘ%Hc䓏S7+ 11EBq]d/ V$t:G;Y6>x`Le]7o唖UK=ϼ:RNI'Zn:Ff V.Qllh5L&LFZCAAAA@|fb tZmDzdrTUO)Ӥ3% Y+TY^%. ;RVRLVzv< p ήnGL  WYO'?ePZZFiiڥH<3[酧J>|ux8ɐo&7;}5_0"Zvs]\#X Wr5:ww,&4EEGbS6dՏ͌,lLau/'>dH@r*eX ftG& L1w2;ew/<$(PM}5*O#;RK1AAڇ`еk7Xt  ǻC>=#M7ڮ*w ۪2LZiOV!co Wba4ӹ(4|GƍЫ23%/.aOyq(.3Y yEٔm9"dJYq)f,=N2 gGQTcm E>~%*j9~, C !ޗ̙ $PdƂ  \O   \ Bmy㎠K] AAe-#H`NsϚZ\ Uhӥ  voj$lF1YÔ7|_NU6uh"pA`!*`;ôH(d<@6g$l )YSݱmZԑeC%}?1*!4bm*b8ed:tp{-ф)L䃇ɳ@#OmLAᲣ!W̜ 9s'_(Ce^-jA V}Pgߎ5l@BD' V`HbHv8h$@OIi==uQZ\jK&g74~iϥJ.VG"ܵ\EEpv*ξ*KљAAAAAA+$ wOd J[dɑ o t NbfjgsfOM-niw5z"a)?'4L"-̤OJS@㪁}I8IZD~ЋAPH[3[j1eOU$]{^߈ g-.EgYW)-l(mə7UV16w%_,|CHJ1[~і8QQX%&5P udP 5X)7T _Ǡ,s%'oFRίڹƞKALDDgL&&;wcL&#&[έcos]ٶom>z>z={wgnFŨ>l8Ç 77wZZ`pY= *|=TE7I?3?l@za=7LX1xXQBaQѹo"$!Cp}%eBwK%w'GE4uΊt3 dPݶc$Bں!R|p HĕYOf5_9R"3jdw[a       \) y YwVB)'=?TՓ{|y1a]rcZ:CvHJ[ߙ+)>/HQ_j*sdxy5o &Mi@wcEF-?GgݡU qlq#g{eF=h?IIfñ2%Sm!Oж7y_ H{ LXs\rc^'mf+Kؗ_[_-!YL# q{HcECɾDVnZZAFv}Ann&P{$%s&1$QU#E{A:vI#׀!us V`1{87xȨ1tEgS7HY4>2ZiP vAR) SAF͂W$rΫ|o@;qekD&`}Q ,.RkV-$dzAAȴq {`dG3{'~&N_ݸsH`f"S0e6,E0sK~Ucm+탉#?ѧșg^ɗWk2Jv Gi(wsBRZŜ>e޼<\1hl|=~\c$ΒJY̘w&rcﳩNB)ዙsτ~$7nxh<ڂ)m_㉗ΧYl kᖠ=`#>켸ΔAkxV      IYJHyE:;bSزU6m t@("'+W[`% IDAT"=JksܛHL7d9O;ǝ"[CKnePW){\˔`;y*_gr|"Ar?{'W]ul5B  @i Xp)(PAEADAtB IHodN/fMecf9gΜ>/jY^~C=# I'v4"| rȚ7>⦹sOs`۰ֱWdӲe&1(di!sWG' ?ƥO_}w\}\:MpU “Zqm?Mh.v;/n ,Ip1+wra-^ 3n7x_KlDƗ"S˺U4czޕh)"w~Kpwˣ<GP{35R$> 0˷qkZV1ǔCleݒ%oaNF{ w__c}|8c\e_Tbο;۽TWW?_dBu$W2,'s;hٰ a=tz>g{XR:'׳pu-j>o>2֬ =Bqa/";c'1ē8q{0ts 8;~QfHi=5u,̗Mf9{vkVnj=#f@-grO\<|fx4,$ݳjƕ{#,}U|\ʣ9+3krހuݖNGp @v;l D,VF'"""""""*P Bx'xYuZZ7m{aw3n\xɥ\xL շZx##yi!Mߴzۼ<7# Y8N5?;TW-Q:ň78NULJ1'xOYU%bˡ򐩜~7)qAz}KeC%Ԯ۞aX\z3gñ9{ r<9'zg]AKR>Y)V*p3p}}k9_/MxUͫݮ?t1 Xb{u<|Qީnfor_/2zgCwsUp~>K6m`}};aȯŸ_fr֊ΏD&Z|xA69e,$O#We? 5홑>/~NNiaMu3 Ə*& %xKň.]s2_289+6&Ƞt8K3{Bö[;sjEfkhEDD{T!"""""""2d@2ʥ2mFUaZױnS#(,r *;n8΁ V6XMM`AvAcƏ4sM&kaj F0~l%fn^Dz5x1م ?d"Uv?V5"V27i,Ů{R_$ |5ma<*MdBY18{..O[t<$bj$mid2|(*ݎ~隞 6v:j|D)|(Ff]n٧P?HY ^B wh&R~|A%fUjsa[ebY^ fsx<N<l`ݚkXF/J`[}h<&6Oto*T "otMwXu+aZ6Xg$ N~ ~#"""GNMq%""";>=~4\2 ;?9c=EDDd]|_N<;Q0r2#'Ԇ#GLgϼ98a{AZX.; 5 .sȁ!%ǖ0q3&vc,L9b7Ug(aG}<.J'C鄾0vVxL$LJ+F( -""""""""""" hmnoBry='Jx,b¢^"""""""""{(7m$ PGSCVt\ \餹¡ `d"u,Wz#p:,L-""""""""""""=S ZDDDDDDDDd/8NBG(  \jreMn~a R""""""""""""/EDDDDDDDDa qE CA ѝ]T-"""Cai1KDDd?f&N+}TD'~f5^ \90@Hrd䦺^9"p4Wz^D!eK҄߾Vo{xd}caugreX}>u't%]""ϣDDDD\FV6H3V% D쯼2R\А4{EmA;wvN4! :4#K_p8:3 9uG璮d"DulP$=/0 <͍'""? x1 w~q~Z,ja1\Ҝ0 Hs)-eteWd"""CLY679uG璮X,DulP$=p:)(*4M6m\P~& izL$ӑz#lg=ZHAAqЃ>r3Ha9x;TXj>}zjW}DCHe)*)'4W:a""""""\DSC-i{盡@vݎEh!'HňE#rj KͣD',\ap8_YuK_"Tk[j}ow~3kh dHh$sȁCDDDD餸2eL<톰Tֽu#ٳxꩧϮ!$ &sůTWԟ<@kG KZ&V˒D7z{$:s7E6uJOe$izο3b={%LΛyiye k|ķ;8293Kq֡>$MC$<{`„ =.NLƉF=F i[Ϣ/Kk9!_mIҧ٭fn}`XpQjic3^+]!o`sCz DɂŬ.Ƥ8jdNA3Dú 4!d c idɼy|E~8=MfVT{;;DONC !^ObZ8_ގã=>1In|/!E^6I%^6]MUk#CF%}_0S>gxwW4Jʏj6I+ɑ3Ntz!^Ê5*6"4|sΗ$=Igp^iZXϦF/"F2G"EYVrW kh=e=@ YCe[LiۻH]$nqU?ɟ[}P^^ݟկ馛xi\sK\Hf5Hw͎U<{++ho'tt%wUaF*Ze0OևS~0d['4-+߹5|?3kWUl)~y1fsvbwLrqkiOzXL:sqy ۴gmpy/7__S?6bf\sx\;A\ss_bHd2pM0&m:~Gj iV6+n-m[:?þ[y/㙜zsW堣@<f0clGT:ꉖl`ΜKdܹK &\2S8;"4/z̞&uWXbIOe|q:yk>y[)'}E QSRq)L9xxdy%aO猣GkzXћe/oմ};Ӿn;":l&޴ޜFJ~/ _da qBwXȼc䦣vDwx/0J 8cHr-MXWw:o> }JGV#j)sߝyx/|op.]_;){|0twYimnX{_j9T;vN$:{.ZwkιmKD;,gO3_gڎYc'W} w- '?g_Oz_CKgs핿c9c!XzLQ 'LžC",y.]qOY#mo|K<1Ǐoql{W~xX-o ~boyqwޤCrRht{y!@vh(_|]:P328].f"J(#iFi\=W_gzQ_g}R8Nr% e3OaԷO9ǜũ=Uu0~X4m>xD#[ 'NG[qOD~Ipڬi(K g^p[&ޏx7套sn~>`Z14r!sD$_Dy IDAT Knn$,SsUGsIokb4׃a%/㚑mbx 9ר ő]@ӆ ͛[IR1kd62_u(ǧXʫXN{_Z DȐel%f;5cG9q.^,4P %QrGXjӺq9K?_+kT_ ˗嬨oȲϗtjjv&};Q`ds.빖mLŭwDÖ}(@{_cSO'L)alWg_\A4p>rbHyhq}ҹbkx ØlNu*JYzEDDDDDDDDB4~s FBVL )d3ҊJ IjH$:47RX,XZq^-n?TWW5I0(NR9/H߷dj2X7^d`66}{wWkeqǯ_-e$wW\ׯ.a~`M_XAҷ?|r~۬٭e<՜w=^XTH7Lfm_£k,}#epņ?癚sv[66k0;7Q cz_[qSq jޟê4.8>+u%6X4P @<Salv\dath$BG4b'2qpbӤFLbu瑝10ӞCfVǢڽxZCVoĝ_@;oBDDDDDDDD^{moZSI| \u)~x7C߾76۸;i<3:Uf}$qW]A7{Owr =tP;͍4GHbJҷ(F|6n]~-Uˊ?f;rpr[m1LsoRy, ̝1G 7a…D1 vO~}OU5_eS9jTXh)~;s Ṅjk28:mYm]L$F{u瓛_0 s4ԠM!4M"H3m J((.b-MuC!ss)(*@6"r4zimi"SP\67ѳ/ Â==16$νW c>*75&Vo Ù!3fpY'Q``xdI<ꇬn Ӻi-=˰7t.R.<g!|οP4A{mV5w^ G$ξnaS,LO91ye[0d⌫nK'{}&} ?аl.\Κ3x7]}PV:O)?5b:&qCP x`ヾ PK'+798EDDDDDdЙI4$#+~f>0&=+##&")F ;0M\ʇ~?-M$IlVedff~j'X, J꟱EDDDDDDDc|ZVF\xdXE*dB:lV"[i &e.`a&}{'?3{bL0-X@KZ7|,~jVdC]:ɇ t3gso?Nq@·eQK_ɄCQuVe%d`QdK9UH|׳/m32O~;WL9hәk7isN-Smv;yEE8 B Uv<\65zq8)Nѝ;Yٹ`_,CSC>/-M8)ZDDDDDDDd /p1L,nOM_X,n)+rMfɃ6c',274 FN`>nOk& ̚]Ur^-=fPUYӒTZ=h o Cah!ʙ梴 VhcF#Z0 CahtWTaxF"7iTG2$3;~ CwZmWC24!@3Etg'`1@d o=Pv<1@t~kW,#f5rf>S Ɇy<YS_BH3OmYE@r3>4[<$-yK9T~DܥbDDDDDDK[k @ 6V =Kwtҳ2dX,J #JQYujh4nק""""""""eD(𴶑vZ(:ֆi\wf 2H_%Nady7q(-"G|g,&]z7d+9x ;KYDDDDDd:7m9Wh4 ݡ0F}l4in4d撑s\^)>(7]ƚ,jCFF:m6=agB,' 1MsqYe<{7W(`#8֦i`ŒȐunu1Xo lSX\J0A$%;=5 xhƕtt 6ugqYeX73ϟ2d*qQeK!Sξ)C[b_DDDDDDDDdryXAjΣ`0@ó˸pj>idJ["{3j0ɉrf1 :P@H7psrrimn"fD;/2DDDdXR]"H$Zma;Z$qX9C]ii)i.6UOu)"""6R\T""""""""2$C-4W+?j=hiOu""""""""C:Dll:DoawjDDDdW<-MT!"""""""2dCSu]cx+ٿ)-""""""""""""""""""""",EDDDDDDDDHKK CmW""""""""""""-4P̬ ƢxZRZfOu """"""""C:Dl!:JDDDdlv JJS]Ȑ"""""""""[8#p+Ȗ@t8)""""""""""" -""""""""fjHĉb)#H$Zm C"""""""""8\RVC{wK-i)ADDDDDDDDDDD@@; |Ȼ'5AT#3𶵒H$}D"A{[vHl. 5LV;SEBU|0gtFM?y{U)a{ 6("""""d ucņa`X82+|pFcMQۋg/ڷپ[7cŊ =32F,%1@'0WNYޞ %[zyC㕃XVN.~pzK+uz849:ȁbgX7 N\dQX\ư결IL]#QIl KCfzGj\_H8ޞO'0ܹ(<2lG6E٩b#""""2d2l kVZ&en(Q Yd=9 1-iz`$JC_0B<+Xo=HԴ馤g_H[^Bv@L$k'kZ|I`#=' sِ` Hl6x뵑-=#0Ok[\vtC`[3->8Az<2mv\丬mWAAqu5UtE%%):OXGBAqY/"""""""""""r;ѻaf䱧ƫy+ Z/OB8J[Ct;NhcsS+PipCAQYz'@]s@hR7i{=&1_75a8-dxI6^LF6QN ôWBey!#L"Toja82+́ݙ>9um~tw>YvH:;C[, J{ADDDDDDDDDDDDztpP:hnxU$޵k;mߤu;h*sato8糪9ӅN6n׉e{d3-8=]7eUrL)s R[Hh>U43aT־\Lߴ/=ӣW1Q=ā 0oe3VpesIPӞI4|+o#bd楧3[o3?{%y}gvf{H(N5FrbErb˱ˎ-ɲ#ql%qbɖؖE)VP),N?. ,ޯs3}<||G?iWz7*fIE :_{0< ȯ^ŭΆY%S}~9=s͛4ϸ5<˴fOc~̼0c(&IeE`Cv.I$ Ng>BtI^~ےAEh*0!N116L_O ueGme,^^CEa zIspۋ wt3bj <>AKYY:J~a&j PZBY^@AbVc$+XR5}PUv<.!D mZLcEAjcM}j.lKKd"AG[+e53fvw2:<@Aa!5 CK$I$I$]bX\ľㄉ h;Et? Grr,_JCe ѐLr;H2No"Jek+)/'JnZ30ƶG%wssleYw>޶~"U\xޣh%ѳy],׌r }ke,yXHuI&G8rݼK-;T8A˳QrD)_%GS u`+<gN_&9F>÷)obmS e!8tC<"*w 9a?L(uKYTKY~@j#Z?ozX}}iHh(a:ﺙEpgvw^++Xj9Mz}[%xeYqײlC]yT.]IcѴH * I$-L8#S7%M,8`TzMrn 3fyzNH[uyULՇ.C8Ϛ-3߈ dR 3A%0{#BI:VWYȧa&GxyԮțga:nZ4®.!k(^CW2$װ[X?mn Z}m xW㦺&is38XƦfcdh1**(+ /vnt:Ãd3 BUu-e $I$I$IRSȽf IDATWCt8p4ҚwT^ [ 7Vΰc`7|Ƙ ۬ Yr,7[hYl0I$骕՗?u7jn1 (`"rfyQGI_%zny%?X'Z ͇9`ᰖէyՙWRڵkXs;ym`ȣͬ;h ˷\OwߋNNpd-.~l5W+(*)d{{F/(©_&'$SN&f_2T~A! 1L-I$I$I-ddxh7$Hu12@|1K+f驔WBUQ䀊3E|ZHwmr*5u0 ̽U!dnO$i}Vow RŠog]I@jg+k-{7O COmL۹sU|EOʫali:zN9Ŏ$Àuwsiahnz"Ǟ[aRaPȊ;;- =%^ԓG{iKZk;N COm\ǖ{n_$I5%ӻ[ԓO͇Cd MP4G ?9sWDSLE,'LBhXlO]fzi=|sϷCݽ$B ^NJ%9p| CY (fV@(fRХ)/+x~ $̤ILLJL=:d!v4ft 2 "  a`t}їll5gb(*)R$I$I$I9 :g2(,=;]P{:NWhdm/m{Ty%6gy静szoo=@pSPPDd;0GnG1 ʩ!900Iέ6 's$I 3P|=M_~}8d21ձl/e9)N#$0sCyTi6b+(;ᙻGK$IZ"5,[p֛`RPT 쥧qI;[leM{c=*YXāqr#tJMD'g)'Ӷ$I$I$Itp :G_oT蠘siA kk;‘ctvw=8Afr}/vp?y,90≭D(Yrwܴ%Ħ/dfZxoYI_I"\%g0WsrMyzv5:Yr,?bъi] R[TCX!6v'WJ$I|N<~Y`<3ӣ}dEEԭӈ9(0 ]w~k (*>;1$P<C&Wc\$I䑗@6G29ۼ25sPh%7W|eӓ֖/$<>7N #zO*e%9L!uR^QL1Bnjflwʨ8%I$I$I$j>9]zvPj .2)dx=) Lv1p"22X;={%I$I$I$-@tncWUܶZO+.0ȑ;FٛHi%4;WNu:đ=I>pb5c;ˊ==CZ5lQѿ3q`w~ԮdUE$-Fyeʗ>tc{;u%K:Q^;0:Bz{{.4m0d<Z$I|hl(%BH}/'N fFҗ\^y ,#Gі!SUU|ɺCg3II&O$e> mS7?WZSnHh(p(;v19m8%-t)>GZMdg;q* Iv`A2-cpKlk;&D۟Cwfm=c-I$I$I$ .o|ȑL08lt!zi9xѩHbn}m,3gVE~e5Ũc~9 VK}Չ3'Rzgzb4xͭ[9S;YGՉU/=s;+MM7w3ڿG M4#b R}뭬,l-^oddS|;z;ݴKazYwˑuд&i$/[[!=Hx"¡,vp= yhkI$IV@,mƑ1?]UTE&F SW%u`Ӷ5ťTPGM264@Hֳ\o=o9zv<ɿ8iQFXW񆻼5+΋)}oWPS^@$=VnXBθeݤzķDn&RMƊ˗QղD'/=A (Kny;-@P@ ȁ1l{}UԔI7L" D iq }$I$I$IpsɧjFu#M緘dAjj*J(Eȥ" A[XUv+7Nvs{"U@rQj7]OWi=Sޠٻo~ (es(9ܸo=Aj(? ]|[ml/hà eeKyu7rnR7c-]{XXMq$PwݣYJWm`qZ5W[&x_Eiu-5%eT[p[w;<}h]Oۨ(NMplHz o;iz#9T8~:sڐ{{?jbvv]J$I27n$. eb BaJnyϱkM:%1>L)GhZSr 1 JiY3j g~UPĊ[n%v^m#=6HKzF;g=˷p {w;T/I$I$I\ b$I$IWsÂsŋQ\ZEKsP\Z:ϕH  plҲrorAaUTհ~JKf3=|ᡁ9X$I$I4DW$'sQ$I$*4H08OUT]*RT(iH%S]maHM]+ͻ*ˣyZjjÐζV&ƽK$I$I.D1**! lo3-I$Iנd6Cʫbx~>5uSCђ0@OaR]@%I SI C6ش 'qRjj ÐcGN%/J$I$Iҵ5N8z0}]$a8$I$]0$GN(.-r3BM}#ediz;: 2-]ҩvtI)q˒t ÐdJihZrɏдr mǃؒ$I$I3gkX`~蛫]K$IpAP^]3a/]A<.FcHzA@M}ahIlxpd"A45.}>9iJd"ԓ%I$I$IsbU532<8LN$I@A@,/FAq1eUbKvF+a|tT*|SA@| 7Cqq|Bqq)C ͤIs RZ^A,R$I$IIv$I$If`ZZX*3s%PX4UC.5FZ(r,C]$I$I5@$I$I4r"J /6UC.uFZHr| I$Itʛ$I$I$I*򧂊Ѽa8D9Ó$I$I4-I$I$I$I$I$e Z$I$I %dy2"|(uTVs5$I$It$I$I$i+)+`|t\.7ourYGѥet!*2~3ͮ;c>ίJK$I%I$I$I ^,#TSgrERkUH7>O %%tÚS*L)זNѴnvu$I$I@$I$I$P^Qdby  IDATDaH_Z$r sih ,`> $I$I:OsN% 0>:B*" qI$I[A).-xuVA;nZgIz#i᪨D~+/L$ȋC$]xߢqlC9+ů! H؜ɯ^FQ$I$-0sEiI$IW0 I&$ QS@M}9m{-σ.f׵<Β.FD_DV:ڎPZVA$zybwl#64D.q%iFAEKh^:Z|5n7/ _=Lzȿ6qXqj[E$I$I҅@tÌ MTQPXD -I$IW0 LL0COW;ݝ$ /]qσjdT񕥭}=/$xul\{[83D&57pˍ˨ue2E_aw^U_W搱eJfiy<dz;;f)r;[_$I$II ! YzE%s[I$I, ˩^FwR;Kx~+VSXT|r46-:nq4ݥ̵=;_`-\.?K,i^Aˁ}qM=mԼF"W]_[O-fIY 9rC),֗_`Px ?O7U1Ehw 1O O7O_mfi *o*MEK$It͹@t*  CK$I|: =]WT?=A+VQXTdҩ) PXTDUܻkq;_\덤kO,OS E<!=! % `lx8'~N"iv6[NSM)838+BYO1eYNo}ClEᄈNђ$I$]c.:=C76$I Pװc Ph)5RPXLWצbjjqΗ,i6s}tm**)qI3muL&Xܼh4:'ek=AiߡK =^ʥK8dqowˏOW_Gy' H,w?ƷSi׫}#<q?ڹK$IE=>:@UmE#I$IWs7vbTQ]sYk|9Βd.7]U,]h4Ewxp}v06:B4)%Rпk}Yo@윶|˽3"7.GB&wl 5R;A~G$crwJ$Itѩԣ .I$IRR7vb_PxYk|9Βd.7mE%%,_$ ڏItLy9x\,I/w~V6p ?q_Y 8>Y:eH͝<^+Ze'y5CGw/zT$I$]E.3`$I$tbsb3ٝiΗ,Lz#Ix>Wn;F= CWS۰H296A@aF#YOy^’]y}t14"1_l&FEX0D#J$IthI$I$I5/~cG "Q+iME /<ԒtYEy?Ν@$B~QuM+X\MA|w_Gi H*@0G&wug i3'I$Iҵ@$I$I$IUVאe젳H3n362Lgt勔|Q?}d[_;mu-w|ϼs>ʱ-axr;Id9 Խ|Cܿ04b8kfI$Iti$I$I$4':=ǎ$11$&9va.GEu-RIo9:ygCL m'4I$Itț$I$If-].#?aQlAZҼr SId-esUVҰi\bc$ 0[2[ǯ>hFI$I!Z$I$IA%()-'rARdf))-gQ2kUׯ%@f?񧏶j8~o{S^+%I$I%chI$I$Ifv cc޿ 0 )*)aqr~q5|+}koee0ɞ8:gݏ|&^I$I$I wY$ͯH$B5]$]nkwӽ9 -[~|W*I$I(ђ$I$I$I҂Pg/p>8ƻؗnC{X6Һf֭]FU|={q>7Ƒ&~O'fs}yW$I$IZ DK$I$I$I1*7rg|!I$I5%I$|Wpmp%I$I$I$Ig$I$I$I$I$I$B$I$I$I$I$It2-I$I$I$I$I$e Z$I+]v?_ՏsC]$I$I$I$]AI$Ia?m ʒC_m(҄@05I$I$I$I(j_w5$I|^%NJO#lOwU$I$I$I1}/%Gs~j$I$Is+ǑǾëHIe\S|{|&I$I$I$I: ђ$ItBfk^~0w?)FGc8<}\~$I$I$I$ț$I$Io,DÃ͏;~d&ypCIBQJVCW{v1Rx&VGREѣy] (g卷s ϴ 5N^qt0Pg2wʁFSy.ẛna3YNһ'/9ıa *Xnݼ i;d*5,ijZ<$I$I$IN*)smhb`,KAE=+ohda附U͇d7;nŃ] ^-P8GGk_cgYUK>@: cԮXCcQ@wv0i fk eiiCP X@I$I4ȓtֽQ]vnm<9o={kG_7m <әֻ6 R/gyKpnZQg6^)5_\(߾Ϋ5X :{Ȝa7ǯ~Gj߾IrohPx+ԧ7UH_09O}rN%I$I$I$ Dy+98;AКSƹ#g~j Xß?ᩎK_>@Ɂ Ǟ~l=)2GvgaVG l?ś t)r2|tuk߇X>Jqj'oA]J$IN<Ϸ h@P~;CGˑXqƄoHW ~XS[Hw7<ֱ, KćV63;dQ~~jb㴾4~_ՙ 7r8ȍofM}1#$fK|'+g]q%TŒtGx֧_ϱd:G;gټ~9KjJ&;[;?i_܆0tEذn-'$}" a9N$I$I$Iz'_~园$Srz"wGbG?'δ<|#ofS=ϑ}o* O ]{?G,wJӴFTXZ+;Il[6T0Ky^)-4|t6u3/ t w&CK$IҜ ow6.ַMwcӂ?o/}6~};?ɛBFgd(fo7Qv"|';o>˙8Fp{R?~gzA+ơ&~CוN}x/yIQI?uU7?듟o+{6W_/j?%I$I$It9\%~VR[Iw?> W/~{r]Y?7ş`c˾ѿ>0K:@]FRO|oplt-y}^rj<_[Yzz>ggdI% B %\Kr\H %TLhlpXmj+iF%Y%xN쬾;L]5aFO<>#vy-CWESj3OmV6bdҲuAZ=XuOm/^6 |$3mnCВs>zOj{Wh\բuxAm!%I.ͺtͺVYGy:{>stfGs~Yf.Вd(eu tf#z-9M~?}+~-/+uM1/\:Eijj oo~ITѵw%Z1U8G筃KL?K_' CKZ}<_cGВ䘫>QnRGb},V+ N2͞0c6`TgĶl#Ug\r|ZK/(C_zx$J^ZgҼEsd571cVf#"pK/Qcm(U_vn:R]ZdK{_ܨ1[f9Li}bs)YzsWlT5o ٱUVtӢ 5k^f-X0G4QU5{Ugۦm{۶m޳K5{oU4It8FXTݝjijPc]Ui_.ڥ}UjVKS;;E].0)r89=lIeJb>׼u~UYդ6:iaoCɧ] sK`<ԤHSҒD|TN_-BS?Uآg__mEҞ'ז-3l})^"Ve̖y.]~Xd^|Tx[g]x<+N=)rR$R0lK:bKFU@]mk(\A j:%A~I ռ9^aHvZ:p[Zzy6/e?m+%u+@ZuX?)`0XN: 9_$Q$kMJV/K&dOfeS=nE¡!ZѨzJnWiJu$3іZwUoIۣO]Cۧ,57(ѦKbiOj\ 114w~!f÷J0GUyJ5W}Rs,٪V*f*jm`LEiӵTAu]KVw蕧63!=DXZi:R@ ee s)#ɐ͢JIM<ꖿ+.[Rz~[с Gd+i1=]}u%2q4$}j׶F L# EɶmuuAh`44%trIbѨ 7ХPO`m--(T/Kwړm+RMX6 TrJIJQ,S,S8TO}=Cj!_v%^gLS m)K١1e Baً(?PA%#Ei)G됐>x\UшFªޣp0(I&%+'@YY2op8QRSӕ_(ˊݯf}jV{[JJrdFp#/3[Cvv;r=JNNQfv.uܨΒI` g>sJvr)OIc炫%{FO<>4yN= ['^$4cwOUblGwhߖ {70}RWK%fM}q鮙, E%Ou*Փj:m 2 .߼Ak;?K1 &  CKнCg DO'%ɊTVN^hz Pqi|Y9^i:̜Uf DmM.^|ScM=JH)ӱqK֘`(ktQ)%=l|Tomst9"`XWsOiSȖe*.W]|JRvn |GO:iڇf ZMZi ` coփI]!dh ['t-۾zn[s-Zs0 Wҹ $ }Tiȶm5Vg֏ оlIá’R2e۶ښ lhM@\|.auzP𝚑TCݥQSy$RNӵɴCz'V*f*j`lY5ZvEmCy9G?5N93%E|S}cURsGujw߀gܯM~F .5?\&a{tӏ6[+ؤwc>S.ېbY63 IDAT?]WȀe*=|廑SE xDh$=aV[^bRal˶mۣh$܂ƒ:Ţ10ca<9_LkvfSwI*N:{rg|U UJ'UܭR$\]yIb֓c _pJFrjL8}l9=KVwݰMV5p>#Z|l۬^Axa=~<[O߭ZgoU,9rDzo=Xr̻A\Pkڢnц=|K vZxuy'&۶U[GxLi*(.mV8R Х=*XSͶ +WJJr }9DQscJJ%^gL!ߪ/M?Y kAQV^+)^o G/z@>ѬIW)};mjW=G\+JN0:eKJ2dG]8*3W;mV8TWg|-R$a/*a*(*ʝC 1"hIJ҂뿧[GgڷUuxLR gc%y_w}Wg{mG%g4#o2 5=Ca* )&$%%)5-C~78]03NSŧ_]`ZE#[X,t)aL.NK$INgq*.} T_Y%2Di,ߌe' 0n$U0Lٓ裔A zqI19~q{*.+WuU¡UP4[I=0&QhyNQ$Vݲ,+%" t\t8$Ix,C۷GmW.fUt[u"%=^c))))YEel@4ӄy2:T_W=)`Wpp0J@;U4) oF<$.i:WS}MK$$Ii dz%IW~ 92 ~()a򷶨!XV\@tZzzBkSS$I}}=,+auXNIk&h4.$65ßZ;eYIr cr:]r{-K=] Kmt%<2|JeJ-M mZ$I0wNXݶ޿T`bw 0 I_htq9@ m6Zg Lwťr\ l˶5SWGB.|9VzOSPHR8Rzo·y+p 25@…}$sc΃¡<ޤ.mR Bo~0<tgrgZ pLȶx\ $I2Mn\9^ TfvښXT9&ujn$sd:`7R)ordq'%-u%Ldii,70ddfɓ$۶UWgB1p[ޤde}3]ZZlVs}턽Mxs<0;'0Tޞ G-M2 CG<~L`JJp8RKC╖Zp8U\Z&0& TY2i7ܤ $^g$qr d۶V$ `Jʝm[yr{G3+:;]e(--;Mcl`j0 Clgdߦv} tw)5ux˒/;g1 CiJMMSwWz{j ׫tgd:`! gr󔕛X4@w:-,KVܒe0e2󔖞.˝1Ri*#3KYŢ Ip8a_%t%nhD.2sE/3;g*xp:]J}هS`1NoKKSz04OnGa$4ĶmE"a:;WG{"Ѱ ]&3H[s;;xUZ>OI).  g˗=`rl8q L~^:m rUXT"7)%H0x/PZFkݦ,:EtgH8& %%'KF]0#$%'BwnI,=Ca8&SL/HT~0C8MRaQjQW_r]. D zȶmʛ"NtEMJQNnZ[oQCg8&SL/]m[Y9MRff:ծD2]&Fo[6@"1NɁq L~ÍSL/^IRϗJLF \gH$"ItUDG<8&)0 7N1bQIIp%&džcf.3mے$0\ 0@S`r`p ]0e0e0e0e0e0e0e9]&dAhShS3`bv+p4S`c&wy,:qTboW6o8W,:D0 , `ʢC4w>'٤5m FZ;u*DLsm՚^=)]CTo>p~9&ײt55Xku}O^tŚ5h>'?d{wKytgi_w7IeW_nPycy U7=dhWpL˯w{MBr3K& RaZ>-9X=QѨ=|WKQ6^n;wfL5`J*/(pK5Y_z;?Q xk-vzueܖF}}-3;eriIMzwVCk-z+n{5Cr8MPά2-9e-jZixWonYXi~zkǶvk%N,SjFv6$Xz>"w\VWs eq˧.DcLVLhTQ; xMmCnЍם4 J˔ݶb}g8$EUả:c悖j6<-Ek3E7R$Tw{l{EHD)w<}k=&& ;WՇjh*l`!)-Mcp.ӧn.>Gݖ€LWfZ:/j_ >_JW**|:SϯVLi*IO!0&o'VZ[~{܊:4w2 T09ښ`cw +ܻWOUl.Ɍ@3]_=N9R]\UqV/zɗԹ1GwS2WiúGF,-Z<8jq::8`<85*ќi p9:{[}}OOV?.s4{x ِz95X]k{S1dlFܭ^zC;;txrrrGp azjJ-Չ+)%Ct5[Ji*8[%esyӱRWswR=_Y\`J{"25,[ASg՛ڸij;2S Tq:{iUceڢR hom}eI;IYE u٧"㰨եj~:@Ûyss98Loޭ]dfL|NJ+ע䡖C1ɕdUsm{JNUYmpWk[NQVl 5DjSSGBq2˖ja>d(oV } _iLmMjhPwoH!7E9*.Q&&~qC guhC?}֡}" Sn5՟i˯n-zߟeŗ.\|>?7;b[Kz~]k>3Hk\L9==wS(46?{}5cYr._k}IWd֡7,@>YI;/ݺNΕoTP~_dYߐg7kvsb8]K>F?|W:`ɚouurNj8#lRЖק>[\y=#yحw~^:,S>o޶T|Ulsԯ!q^ԋ ]o~{^_-?~>`yOyS LS\QUU-sUe*9B%ioQ h4 IgN)kYz7/?d6Ýū.YeSݪzym|UC>Y's[jڰq* "mT٪uغ |tުTp)v<ޮS[olδ-[Jg% 0%tztw3z똬  h+ IDAT$բgs\[]r.<}iڡިO76(o{$*\~yMk77v֙j}-٣OV۫3.Ҳ]pU} 뷮ׁ ƨIE-O~M۞ڠ}[]/.K uR D/G+[RҬStE+4gcztU0Xf5=[Bç\s*)Ԥms[7ן1Vhw}^ ;<:DYwnS ?׍ ]?D{tj ؒ i:;o.K|.9}r\ۺQ^z;ڊlA>:ʵS5?7Izq&UTO|CO4ܳuUW) =AqP]BIy 1ʧ8Ōծl9_Q.![ڷ;UXra)޾MVҜREk )-<,miKOiCe@J/Ӽl8"lܧݵ[e^D-=ZF שk3z-**tJ|Jv=tVh!Mmԫ5Pfa s3CQv4z_ڴ~\Jx~c>^H K ާ{Qׅ7Gw]UsO|~?i>2ӡy[͊%-u7ݬ\.j{DϾxN.a:wzfFxP֪:'뙪Ԯ %zn&ȥ/b5?-CYA?:;8?>vӏqP鞰$w>tu˙:ۏߢ5IqC^^woSKv}CЛzKfxEGZȖ ,?A[j]vYFV|{+:>[ nxR[|#З?SmyWq>f]nZ'75(|.Iqo_j¶*(Ur{mReۉ:=w:T*i֩7Ê۵Tiն:CN5,]@NU `IﲥΚjrNe)Ԟ_;mQ;K_r l}/~[O=ٺ|tK:r_vj^[7*҅|dr }7y\! ȑ8o*`utaahI23OuJw#ۏڮ3 t]w=Gzt]w̘𖑾R!3^u+Z/*97^eϯЀ0tWϯT/'*+ahI2toGJ`|#z9,3StaahI2UL5kѫc`DT&56jUF=t-VmUr>wŬэQNOu,CI'}J_? -Ir(/֫ G^3mnCВs>:W,Y{)3PUe\*T1YXTCYG;Gל9sMs8%+Uo%o|:Lӣl;Vtu> }{ڢ6ˣY/hE1zj߬M P`5xu1s߀u~`cۥyǥܨc\TH]UQIC/ti~yL[+UTbeeɔd3o8Ҩָ$U(sгtJQeG<l%:aIFr~9)ϔpCc*!꒿stbr:)ztDr}`ȐdEq&ɏZ?S(vރ}j]\~SQk_8^O=[QKW)xnqўpϜ2|Iԡu[XjWK2i졺@*^0Oi.uvS\gTP7^aHvZsl0N!3s.JQZmwDcN*\mj*dFyRR6H<`ؖs@A0N1Yjߒ/9f*g\en}KPޫ tPG>SCR܎)huu3.HQnNҐf3+G)0Ms de;c1ۺdI2]1WUw]>z:ZXAޫRucڻd y۲V8 ŁP=ΈC`B%Ɏ,c( 1R# qk.LUjUj}u\fYݖ}(B$CCLWV`-Hϔo+!04@-W\xz_׏d!E:aP_S$[Pv7wܤoT_?;sTvo$HUpmFiJK6pk3v,NqSLkf%KRJxkMr"KX7wXp }\4’dxiHG DylC /@:w"x\ҁc%XudFݧmɢA2P4ah$ h$́pTy}ԶφsŨ "%I/XSmտ`;6Tg `/A+>\2,cuy<YR"w>a$wb"P,d]+ mOVe]@<'E+iܕR]RăwCvg@c@}cyoe7vKNfFHBJ>&L݋tt(IŔ@=NnG0Dk텢 CK$I$I$R7P4v #ԙvٮo& I:mqZO=MГ9ml;]ƘQZY;Tt0yY^aA~¦YZX0 -I$I$If vm׷2dNB̼nEv4x>~omkk7vt7ֲ#{c[<+-&?9 },Qnj'5;-Nsf1l ;uѼ0?5$۫a :d&Y<7ig|o{<݉m?fDj@04籃8b"$Yتm 7阺:wYd@XCemkOo]qw橴=!uQ D1?rψQI Y2nJ1 Ii;`[kݬ;l}R̙UB.?accV2xq$s׮3 -I$I$Ing Z+LPf%Wlﶊ$+OoՒm-X9__l.~ء0'evY6<7cvw=O ?$N9$I";Z!l^n9ϖG`K?,%zSdI*_%|jLd|x "q3G ~s,ٰDqo={?8+|rK>}L/"$Y?Bt\)΍/&D5o\-REnnL(Fhy=&% N}TEJi"׼X I g:vŮKgؤQ^^@e LK+sk GL'JH/%T&+l%yT8Bab@-eXx/?=S 2a$I$I$IRgZuS2;K 4f5=B? UaL:z"9שy7wh )z>#>\RW r_?_+V?r0#rf,(ἂ˴bEQ~:IP~ Z9%YָG[ %"Y&ŅfZ4USQUGSkHp ;k$][,yoߟyt])(œ&9mVN$I$I$I]`D,? |xr̟K=SϽf/f]C }'/;w*V~gįoNJqV BDs I/,uî\C2 ̛,?,vdngnܛDQJyKYGS{z[bNkAT™٧/k s\z1;!}?.yS7wϟy#sE#A'|~}<M!3k~ʏ>!ч^i-$inijX+-: D{3bhNΥywyC'֔JO(-BUK` 5?$ziEz1qz׬d,^Z Cn~7(-l(]… Yb3S9sJR}$I$I$I$i/ 4oxkQL&|X7W=!_Mtr 2xPż̞IS1O@ĺwnI5M) =qv9-5+;oZ= Q"^whz60|@ с䀝$ϧ/~\󕃼z/-`Ը\^HEi l zUCZiz!h*ٽ%3e{X]FiU=dI$I$I$I$iDI$I$I$I$I$I]v>]rJ=T$I$I$I$I)-I$I$I$I$I$ie Z$I$I$I$I$I>+ $I$I$IcxRjI$a%I&bY9/C,-%I$%I$I$I|ZK$I!xxrzO.K$$I$I$IzK& [P@,- 4IÄaH"DMe%_K<Ȁû4I.e Z$I$I$IׯXZ#=#K$I=XgлzSr٦k)S$IڏEI$I$I$IJ㔗#В$igd2`0 txK$I2%I$I$I0 )(mZ$L {!U]$IR1}0 ynm9Oy*|ۛڿ+i{} Iuts%$i_D}]]7W"IuRXxSirJ=S_ Υz[ ð˒A@jJ*YY+ 55K$I$I:lCK$DP49.Cv8Oy*I{Wj,>PݕH$I$I$Izђ$I$I$I$I:tɑ]$IvEI$I$I$I$I$I]v$I$I$i?0;\gܤ){(-ZS 5+$I$Iҁђ$I$I$I$I$IYv$I$IxV* IDAT$i?`gmv~$I$IROahI$I$I$I$I$I,ђ$I$I$I$I$IY%I$I$I$I$I$ DK$I$I$I$I$Ig$I$I$I$I$I2-I$I$I$I$I$ie Z$I$I$I$I$I>@$I$I$I$I$I}VJw ISJoEEKKKw I$I$I$IڏB$I$I$I$ICߚ%HиISx ђnǩ(D"A]A@,#+}źt{͉Օo' YYڵ$I$IcZ$d%I{]3专ƍvs%6 ÐxH|}Ў1b$I$I$IfsglO!Z$I}Tؘ`nY E'6. #Q@ <d2zX6'M%cj)oby}H3hwkmZ%BaAGNfbN_ WBs;FV4@4;([ BB 73oe#mƸܐ% Z VVjdv)A,1RئAwK 3mMƐXF*Cfr4׺3I$I$I$io'p{?S%I$IG5//{kfqn5.(‡Hћn|ͻc{sL&ѻ#IO[eekGsvy aM_~%٢*ݲ~WMY;Zy\7/${@޸ mۦ%K**gSbyRؗ^ ;2nx![J(s)lL$I$I$I?$I$ilſ-֋sieɢZ^šSrkV|v5 >4O wg߶ x!)DLS<*j}|:i>|yY{de.IWgOm:oX ȧwY=,Jra +6d.|5dsP^=w+6p+(p?(vs&I$I$I$ DK$I 4p5)ң˹fW𩂝>)bVnYdfrUrPN.?y-L:?Kws#[s{c.Iל[@vşpKǢt?/gƶ] Y]ͷXK :}W &ۣ9fvN$I$I$I\$I$I"`1m r x_&^_޺ѦFry3N<=~zAzc@?.o 5Oכ3!ln 4v\iAJ:W|Mznh>C# I$I$I$Iђ$I$Ϣi1%vErҙ@RRA8w֚ rJ~W67^1ƤL;$8A%YXn+%yuƀslhm41$۸[OiJI$I$I$I ђ$I$ǂ -O^6q]5_j/I/~ تn3!åFHVY vdE!P:HɃ6[,k'ϙ$I$I$It 1-I$I,N`Sp70Ytv%Tˇ;# Q$3 W1<&[jvV70;ea(6Rn=}$I$I$0/\gnj@!U/+K;~I\vU\gXߓ;I DK$Iqp'削NLvOr&l*y9$K63$I$I%)}Kc9 ]!l`ѬL9e/$Q3g2UuSϜɌ=CvOkb̙-ٰg!u2}Lf,,'_@Gh.Y3>-VME.?w$I$Iە7_\я k7kxsN%ZP-AJ EmD64쭳))fմl7]ZBDRfے$I$IR&[H$$[4?k?eW^?y Vm_^u=ͷS\)]$I$IbŹ䊀߭oeĥ}:Y*\°YtF9Ia @V;oOYKaŴaHq}uYdX{i[I}W%I$I$ n.IrY7šVNKߺFgnys} ]b|7p<-7.)̥?sWκIn9M`mW=u? >΀[{gm|_6!~>;e'9D>F~ۙm.>>_\ kϧ6/GmlSo37L"nTn{v%mJ~k3V0or}3(knүruM38ug{9oK[y-\+n|L/a}|x~꺱Ǐ]D鏾/_>p;ޭ$ǿ{9?d'o_>y\y͓n&|3,Bߏ~uNW7~feڂh.{X/|;O_O|3/G^5nhl;[6o1v8xv/%I$I. 23H*~;YEA|uTt|\<_%@Fa6~/~''ڿU1X(ן;x,k.Ds<-4B4'ss{a9|y-Զ mW5{>㗏Тf/D" ϵgs'%I$Iswԓd2Sa +X4i}KWVr/.f|-WC/K"9C7d26|N}_A:9"ԯ}zy {WP_pɘW~r&pS^P5zy˞̈/~bҀlK湧j6'~f>Cgy99c7ƆUyWY\:_iu7] 19!gEif̞݊>Eia.##2}ͥ x#ڿP!@X+~kYF#fpv3̓c;x|5vk)O~Gs4zyu$097%œ97!࢝,"]Yi.qOb>dFW0ybC~h.>r3B}q: L{M[{e80yٔ ?T ":hI$IzC3_ן?);eGb\ű\tX^u||~iѼ䲋GpaUJTsT{b4`><4+Y\JK,2+ F]2lg,>{^Qɩ1>|;~tY}se|4S°Ґ ϙ$I$I_3wyޜ| f^i>׸iT-){oSy>xݽrިIt\{~T^YHt|kncA\Ӈyߑ}lW|}+59~.=fp7dFUHċqTQxgc7q^b?o'Ncs|W9Qxv6-YLtnCy]H$I$ids^=9c( FJó9\ΜMa+Czq톡%I$I$m־XIKgݲKmɸ oKGd ='^kh 6˿v@|M{7oΗn)BN)@\ۄ O'?-:l5g|+ۄ7Jw2 DBZV?V޲ֵ2cgې+@$#o:pF\ M ut)AH5l8 |q[^}9dL-iݥMg>_'#_匁[eOsPs<г%!2#tM2@C/统OZR?O<]v,&Y<2K|~04i ?\}B.d9O*Bڗ!Z$IhWww ,u\w I$I$u[S! |^1җS?r4xij;Qbۍg > CꠞQ'r?h:fZMrЭ:Pdq*'ShHO!'qm z1fL_"YFլKBn%8kL{o?{Kjywh>}|r#]^xng~l(_ ·>4m+P4jEL֒@q;ASFedjD)%Z`VN}I>smGt}ox6:7AHѧ!S~L{Sk:u)F*#}8#赛==zq'|&LOdʗ.:PB&I$I$I$Iڏm LފɐdA$h3 A$οdl'SiMbC%MM˷ڗ>;傷_ٗYs=%Ma8}暣);O`Ӻ{nkAdӾL*-ؙٙcϟ]cp&Qc8 _S̐69ɢ]'~h/EeIsv|D 9$pR豿J̙ìηZZ6f'Uo Rwh`ѼUԅ_mykXHdx;v] +kB{X Y[ҫyW,MԖQJEqAf. jXn=h*<vOҥ Y~iy 1_VINgwGMZ+kil Hʥ ?p%+wE[#=MH$I$Iԕ 7v2ni,.d$@]mRPPO$s8sv Z|BXOYy=!W@694t2t2a?ßヌϯe_~oOzMY|$ lqX7b"E h=Doڷ O~U*J˛`C@@j~>;#ʱw.'{CRA]Cn:;[1~_B s"P€=7)pΝnּ/o[TH;%ckO32$|y3GT'y;uU(n>߳kl1zL3l`ѓw;M]Y(d3s5}Q~ sx˫9C)Gr" I$I$IOP‰#{/3uI$I$I$aʒ,[|;'!pId!u?{msy{7ra$#/8NN_ ˫ ֱbM?vC2uz봴P{ I fwg?` _q33g̜ٝ~o=IHOr3GEwxqM˕#K>FCwĞU=vnˮU ~GTq''^y>vJ<ءx]B֗(Ny჌ζɀ4F*R~/XLXG6YFTo~;ZX>FOtFR<} ެbfg%{zk(Fk@bǏߐVi3Tm.]_ǿrZe,ZKq 5P~Xv+4Ym2zk`4^=]R(WNjc|mLeoEwcR95`+dla˞jTua:gZ jHm5bp'2r)kƠq'(Iz}ꢮJT v8s 1axY^c9i;-lQIM!^Jc#;3؝_FUC+]8 &v&`yѨ06]x4]u{ٴ%:-VPjUǨLI R*)n(7 O-$Vg,_a{ƆzU)ĆEvʸBI\g_LC}ROHYE9G!Zt\x-{ qW ߇r7]<8we{ Y9n"Ij=-FD.>[eCuΧ%,[t ?Z 2^a]~Kk3h)7[DŽIc r4PA:sr>Y;0,(b*xr kƄj%*Ȭ=#Gv$ a6'&tur1X#;Ȝѽ(d.4~wrUbNνwճwRDfMO _x5LŖ YDCrBŽUGͤ1#5)o[n߇:糿nbYkHğS-ׄ08_jG!~NSO%l=jo G̘=TWg1K38+/TfEF'e92߄/wEe#kB˜muA&* iUAr c\{%vm'_?oc(       `X~'[ͫ,.`6rD%/eܷYMy6-~Ɨd'd_em<^,'BoܷfN;# ƙSX^@}>VX* s3 s$9,zu#&RHv.c7V9=dy-G~%[(\Gy& ɸG}Y9>^5EUT.$d&{#t:q6 v8ጓ9_BؖMQM.TUhlvsYzw ٺkN{'C b37/ uCvLysOSV&żg)| ۺ2W6P^N &IqB HJ"XEQM&i H^v* 34]kItL*s[fL'Xp J&XUy..ԯ登J0v 퇣V'4^ޱ }Ar eq3H dSc K-ggrKüwL|d@r%vRUUvI: %g213+1 9S pABP 4/5HSOi6ؒK]AAAAAAnd/|x//l 鐜 "at&xnz/A|1wN#ށEF2ʛNyf= ̨+gp/ky-Ǵ6/yxِec&ʦ{&pg$˯༏%`=FpsO?q=},V .]$^ypɔ`rOZ ] & y퍛Ht1 (ur/Sзk9Ksl/?IWFX*l]BEx Ԭ׺Nqs72"`{եx_^z)~cJ~-W>w;O5z-qsm|r]˜qLF{Z8vuPe^r s vDr 9X4vք2ETv=zƧX /M#?I 7c N<_HVSbQ7m֛[X3BH+S9dӓmTgn"Έ*9>87ncvtVe~W jk['{E1uZ[)m0!3qj<ÚvPYn#zM?}HYؔJ_rU3錓IrLml.j%Tqp"0j,bsubTA$.Ȳ#*. -(L4DAF[U@ǫ[o}# AAAAAAY7B&pw$IýKr7f acfIoc[}:}oDԄCV`&RHv\^ahL{ q#_(lTt.Ywahe W\6AKYi5*q96,3ӦC0EjWY&j} ը):(}WLDׯFj}y=d||hVahe9{ޡN۶ǥߌh{C=?<*Րpqu 9,A.ֺˆ/;\xW1Gt_w8AAAAAAoFMcG̫|-@ˉ)T:vg|̒3'dB=(UA#%)xpQض3.rLQrsW *h9(zhqUϦ1.@=<1' GI3+=]WIr u5tv 2x`.)hk=-'ʘ~ah@dkϵwg[;%QZPnM0܉_a8ǎ&\k6\0m8$Pb)jͭCNN犌J{ci CjS;K)5aqNUJJhT@u IDATr #.Ա߶=Gkh82j*#5TU jO$bq@5TRZG[X4AV?4#S eU88: JsC:$d'8dN;ict8`n7~TinUPkB{h];A`n'v,V0 AAAY;?AI{    G?w֬e uïd4d7dG)͎.OdR+Nx~UFiz&UJ Jcf:f=3ȮK)(5Fbk=h4oWߴBui*ȮJIEE!瑩"S! HY6v%hﬦQZ[I:i6~h .΄Y1)x8(&ؑ]@iM#mfEmƤjj]+}sf@&0~4h'0f;rsi!%f? Z5!(+ vax7CF^&j8 Mvva2*=3gޑD{aG}EL upNQ~%]?^4onDCAmҌYZFd~;8ƅ:_BN;P]Gi Jn>$:46 8GPA_((@r/C"yOᆧ8-@'˳Мo<"dPEr^΁+0'ߏ]rƑuA8z@f IFPo#       p;{9(ADLvE%i(!ѪL}|2+XFF<=;ٙM*ᘐ̸V`jS$<<=le=eTZۻCn TW Dw5Ц*> lp| -w~_I[Xfx;VuJ=ZģKshQI/o/^)ilWgj==8r O/O$(4Jb]OH MgWAzUgOLBYN1iYAT:K)1" vGb?@5)-uf8:]Xsq%* ]t%8Ê@uB;ꆝЗ/@I@h$c<Ȑ}s VsBǕcU;^JEw3q% vo hYA{߂ $LP0rV/FY6   ǺĔ&"f   8lPMAi0ޝ/+Kˤ@vRhIJ"X%qZfangLG6TIɽHҁ`J@a;>N5+9W0o?0^: əsuٔIlki)Ovr,x1.lhQn+<4=-c,4t:Ҫ:ޛ I ̪3,]o ׈(k(*''@3H!Dr wq=%|G>*Y$}KHndY ]gyM}y UTVWS؁4sq s"]{S50դĘO/Wt>@q+Gwq7G  vϞwGwؤ&DUߥ&C # /8][X\>ˇ       'K  #Bg\X~Hgv:;'PQ"{W}HNC^@F>:2HW@'enA;;O\$RQ@TꩭPASSU*YO*[ D{*^E ąڶi˜zFSϸ0Ru+惯RQϟ`NRǚhQ$3O)0652jB}m= A6T@rUہcÔFx; !0xfY ::fJLP*%]T=WUO~ (FK89ɀ/~h@.Jv@h]ptt8p>val,@ɱe'|F3*23RB4Cf39LHL$N>Z:?/$Pk5aNA_]=E#WX';"vTl|mu?h]l}2        ##phڶؾ N L?A'2_Y6#m( $2!V?+4Eh0S+;lڔk}%ƑШ`%0PТߤBDtP唷gr*.^8Iv-j@raQ,A'a00ZPMQo/? mˎM攙1Hj#Lwd44GG`'j( }i 3 E=$ Ux9KB[>Զ8f        ψeDdx&ʠԳedtvt IƤ&l`R%\Sʎ|:#;IŐaL; 5qRIi%ߐCR>@ɓ'OUS{ 9⪑@0ĭ}*%;E VTdɪW/i3㱗3X }ˊ $GfMЖB\Ďz+Q[#kl%ktWeW wXvaoß_](%P+"db|MdpOؕYz}< CfX֍bj'Y4[[\Ovv%F@rEeOU uX+^EYg?Ƅ6z,[VXdW|yBekxa[lm"<2HJ%?4_kؗ}Ƨ,zy-zEBr:W5(%d'#Rbx-غ6\ty2wR+mVƪ&" : Ƽl+jGE;2mX&BJsz~ZHCW[.ɺM9*m}x{9#YNƾ`LcRZ-W45iz3H'>ܼ@i)&pdžrˤgEu{ֳ ^qc _شzkys+E{+VױScT#oPЌԐ}G$]˾cgGTkrdwf:ca@Zp@(fw~[I1 A/+AAAAAAA-pYV'ҶWonvz3nn}m#_/GRïu7-h #bBD\_]IU%%9wZr#9%]ݯ9D1a+InSuRrߔDzBCNRAԹﵜo[+9V;K.  $YBRUUBʂXԗJ2rd6K]D}O4_Ϫ3: ?W-FK +kS?ˡzD>a Mir!kh$.{>{sg~!2 ;"̡C(. Bqf%#4WkJq>ZڪHYH#!yI ۾\MO3:[v#/r9ߌG{I[Mg7?t-N}8sf7֮/xF%/S>6 0Dr:vwpӚhk%İVv1 QxMc=ƗH[-3m% Z^wy;dhmDJYEN"ah_LԴ62$"\q@#~3V|[䍿j'j:@gtf":fG{Y9,HHĝ?cEr! /|ƚ:6N NỌ՟f_ _%Ե88}._~&* pv,qo|H\ԫvaL>SNwfO"Ea9̂*]0}͸3מFv][)eтz=eha̘xI3O>%+l]M$2j:7ܱ/ШUnC7>bYZ6Sk18:\Ǎ^i£//cgƝ3[wvtcx;$bgsi3k3i44RQسLkPSǣWv N7'(,RdZ("\dnD:Lvʧv-85P܆#{SؕOim#F=ϋ3Fuwuzʋ5N:'1y0c)'᜹z f@¬d6s NwbݶJ:p FO`|q ' }m մ5TZnL\DR"=ta3Ѱw%$-@]Wڨ-/]Vvey4?+q i,n<0o$ ¡]4Ud UO!y0k ?o?>_?Z뫩k37/\x] sOej:^Y|xhّ j4w;sHJAmr_IUrԺ3с΃ja^܁d[uZ(ϣVAD2Ψt6SRY&"c9Xͭ" nT4c"}q:,*udURjD#46HAfeSX׆c9yDmz:MHZ'ܽ}q?st6olè iqrq'Es} mLhqtvajk?*Օsc J'uیHxtx9gV45AGY]1qD;H:J}||#C;d.~]{W@;Te|4{K: dGc N~G'}5y<{ޅK9J=-OL9ٻ;MElߴXB$b4f&hlwe>.^RO}m2 ǖ9/7|흞G'‘PW]9rp8P]37GOA]PEAaxleD%Ջy$ѵqӹ"m9=.MK0?w'2U ^a5ʁBm)#Fh|G1t,PJKyeB,*vQWKE8Fd2E ZzdV ;{:FBQ!97n\Ư¨J8'g]qt?p !+dָVh<™zZ)-uT7awqs SzZAAAAAAA$|KeHn!M8 Cp,c.rQq ?72ԓ6ωSp3TOf2(pl3$ϑxF&:e#Д  {7_F3UAAAAAA]۶3v';18ە MMEoZ \|27cK*Y54]5 Zi۶YXՌ? 6>AT<\_sMdf锜rg%mMtj\2qD+ףmyy }a;- ˮą&Ki]uT:舊 XfT'a!K&X=6L+f2* mYH&g"<9о1MtPu4q gYL uvPW@M'8D뀹-붰N;Q̞1@'q0U;{ؗz r+iU%Y¨uSڈ ̙ϊ*-nd"jZU"H1\;kͫ'Qa r+i6ISqKY=Wwnjl'a '.as4#; Lk] {3)h0JZO[gAAAAAAAAA*s[>}g?]Kagq%'8Y.Plx}O{ɣ&'Mx^րvp<(lь)W> 7M»oTi`'O(c t^Y0s&R??>+xĜͼXgy!/ pYhL͛M7눱8FCJ^uQu`؍ߟwVyeM~FV[nh?΅э^'fYK*TW sХ|tIIͯsCr>]NͳR:z+{4|q_~SBv n#$n捇:Le.Z3޿:Y;J_/ %ogF}}HN嵗xo>(7O7f|wBtxs,b8c݁ԭd /nಷ0e{qo SY87c*9jBx2E<}^r%K@ֽ,}9\%ٙ9IB}z{|8X(>g[l(pћ|o?I IDAT9)G\ųY.кGq%p%)z&         +<*2L 6 SOYN6fRQdsB xDu5R_~Ϣ: wP(5| {<&E`^NZ@Njx8S^;;"dP!Y;TYmb 7n6'M']rk~]CVr^嚸>!/.瞇ov~ZYbSjE{֧ܶmRT$p8 8߶}\W$?8 Hn>\.cݯԨDΜKETNdD1wzC9a|(>vʊlTKPɶ6ܢ25i4A޸hMTc hU[Ry鎅| /?q`,aJ[0Y 4@^6޻NɃ<|X[~HGΞ>736\}v)?UNǸNav|N*6_>%1 OMyY݆$n N @վr'E-卼:Rs=%.w<͊ "㑤 hٟϩwSOiu͝&${W| hwR6!qSmk         E_?Γ++1L%yY(l˕,­*_gw'żxsa]v/<=޼QV҂+18\,Һ -y?M]ƾ3n&~ ֜hQdzW4cU(I]^L _szU|ǽ,ٛ~Ŝ$R>ϗ8.w]2̚8λ{!smSywHmPqN4EkbCZJ~׎OYnHӮqӪ jL.\|M9*Ր9xb^ .CGH8_s]̜~Īgo91N03| \,;J6|;w}NL-8]ƛT=XcayY>1o䡏CwIe$\*{2M\Ajj~dګHq0Y^axyUnq^} w'~Cj^x%m5_|kƹYЯƋ>aG :eSNJ0 v^D       ǐ|$6UuҿyJ5ɡw**jC㡻-2n }׻mԨ}9EߧtWMsi;-㚫(R@r q+R [& ,d;-LX04=]gxe&R)BŊ-޻bWʫ> ( 5T{3@$Mzff{s-q>P[JQwC,2W=x8>6z04~Ğqw nig̤{xAadH-ah|2ь3 g=.$ X.wC0 cSicڸN7`CrEWa蝵;vUc 2|~}T3 `"%o2>f^a蝵G?nN -"""""""""""""""""U2_,0~᩵vp]y+qVkcbO;NLߌuށƝz`gh4F lExvɳZV/82c?! le}W%* 3S pN֟ærRR\20촣h/AXlޘA@u|(хOm䴓mAp8j8LY*,|-;D:Ֆ!7;#ҌLk+`y N>%Zte=ZXΙ&9s62^>`'x}dHkH 7QdA޵Hkٶ6$&uFx"ۛlmVN^8b:ѡ F֧' 'm"8+s =F> t-nec,0~ηrr0WjPYY+KwsqYEe w6A4r>*7|wĜjl0':CiN:`Y5CaL=qv3݃:4Jra-4MWi8︊Qb1gEZNk?Opn-<]`ϰysҀka|}w-ng],}l|Zw|?&19T(-"""""""""""""""""^dZnZl2=z%/-c OAEςܦ4wG9CdE~IΈ yDry= +4'p.Hot۳u:^\˜Xd9 ,0[s Dtk-7b-6%Ga2zUf404DUKx6[2 8$ ^kV"e%+nEIFmToƼ;z(v^>n%)a⩼X3|b4i-`{ymqPqM@ +^M>mvaևOs [uG,9Ks*k1wl,>XΪۦ,u:&it\AItsU0yԼ^OӰ:*?/Ea79/mfz>|ģ|ƺ[c_^@e".:Y# o8&TĭwN9TX6VE~|[xua7-x]aۇX*3Y$~x6Jŧ?R\Wٝ۷\åW]͕͡HE䕇EDDDDDDDDDDDDDDDDDDb9d ްXJosٟ9mCpTi-ka|Fב~s ]מITM$o+c'^w&ܛZO1gMtOFǨP /m5KVSjo~Q+|v,ȭ~JLBOG@ylܐJV 9n|8DLfw0jp_]A7ƥO'tf*~x+zvM/nd}ZA97f'Fs?Qob:|1 e&ιߎ廬|3C϶Tld ʢ1Lxdrל5wO&{8sQ_ۑO+YIr#>^V[%bKG\v=Mˑbdl) cy't67Rq'I_̕eIjt{ )}+= 4iwxrįe ʪvۀFZ#|^LYWDd _]G#nͼq}Gy~Z /vnrFyIqcv'&< r.e֥ODOy7TEq<35-Mpsg X_r&ftً|LƯ+"MW?+8 6$b+Mc-a_E`Ez bЗ[_y35l)Um现fDCnv~GiLHSa-Q{I^ߣkwՆn\Qs4c=7g_ZF~auG=)6m@v5il%72IhT{.>SKedUbюαt wr eC Kؾas)uѺ}⺶&[kWcJVmͣ@vEzi(MXr VKJsunaŪTK<J^݈lL"س/7~GWuŴ+ٱq'vzѻSh kklr]Hu)# kxgL=8 oӁnj _?= -"""""""""""""""""MApL"G$qN»帮MRT 'akccx|C !:4)0?Mx_TNh빓OX;%':pYr3Eo1mrmN:Nj%wDDDDDDDDDDDDDDDDDDDfd<6[n䍔*l3g &`-"MIEDDDDDDDDDDDDDDDDDDWIíۗ.muz(Bʒelwat8nn E]f^cZDOO.-GtEceg~ v:nFxEDDDD_w&|f6.ņE5g%qh": D^%?70BJqi#8i(J#99Fyll˳X&J_nt9""""OaeЮ“&[ٖSizfP\ %CI=:EHKQ ZDDaضm>‹_x~?7DDDDDDĻlˍ+ l6Z/˘AqD"""""F8FIo"_q-]Rft:w H*+p:=WuU7z<iYU6M'1G,> gzSMIV!"o|nqi>k1BiEDDDDDD;/"""u  GN W""ް^ iXAA6z,iy] _c:ҹSu׀a\2&\ߛ OCbϞJH~S)"""""""^"",#[SKNV:Q IaGixaSPGHVxJi aa-]4_z:GMJavSl^K#gwvR>-*, "IjO] ֦P{(SYm. Ud:tN]pY*blͦ¯Uk&Αb>P۪ c|~[RN:Xo=9)-""GT$uZP(Zo*uZl&M;~FtM^nh׾B"SY noDDDDDDGb@  י"#Sn[N&+( N 1UȲ^``:?~{m Y٫T0ƠTd򷟙ܓޛN4=EDY/,3K`Qmy5 [ wz"t """""""knN6t׋Fh_{1{?~յl>79 e w7yR>%Ա IDATˤ)0c9yEۨcHۨ60'xpTWj~-{)W p!] jWls8p֣pױ=:},x~JLȡdxKtvvIDT4~~*r3 ??"$a"Z96Hu0 ӏH:wWZDDDDDoEɎl2v +Kcf2嶁oSԘ}~h#k CGSo#1lw}Krȶpk C8hյ kU-29+ `1Uk1e_U%lz:A3֚ah3tRZDDDDDDP"""~~e!$mӅEDDDDDDDܛ΋MȎpݗ3`a#nMT}1B ke@Y5)suP0ך_5GWNՇ:v:~̦'g` V2qrOk;دw6?-"""+ό6Gv/?=366b XKQy5ۇ`|^}V9vS\5vPӋqA-P4Msg6gRV6c8qF{AHDDDDDDDDDDDDDZރagmkDNًXa;%T,,޵ݍŔ/ӝC;T~~ Sec9Gݸ| _'Ek~bچNPA!'k:abFFhuv6Oz\f2\f~};G,y|n2;,^Nj̵XҢSR,# [KcVK7O{Hq\z?†zmO-e+vVX -,_b_N̬sم,\e7Lz+qөyK88®󰿗 UA暵KgLiQ DHpOGDDDDDDDE$pӤ \l!͚$EDDDDDDDDDDDD Dny3ĵL{nG'cXxH]Cz)ԧFpb{s6|)tkA2Y+Xj#%dÇk~eʌyK󌻛RAIu`:#_,f<."""`S#ޚ='h p^R p{9'e ej-""puݑLsmgKEʜlȮjK|l~d}mnЃ.N#yI2kd[\DTx@vu~XVsbB k3珵l+љsLאsbS>;5ݏ8A}Zo_7[w~N*b˪ڕ3wϩ]ATB`83X|oʤIЋ8#)*d˚;cHowI;(E|؁^#7`5l˯ iKa9O[)#cr]>؈Qjr7o cWWm~}kl*wglȣKht'][?XϺ Y~;+8jEqӓέv}.::eiWPF@E~O*bmնnj~QtoKZ 27lfGM؀]+ 9JkݘGS eYl wPTILl"GُN!{[۔gmdS&+m*g#)) Ntj"Ahc%gPɟ$3~;C7N'`}l٦Ovu\q|z eDy/~ΚA$|)|#}|S𐈈4X`˸<2y{∀!|f^7K\[ڝ۷7E>&`?xmؽSRcw[-T1zWO)<73C^kj1x%p5:|>8Nb[}zT:g>gebA\t=oHNO 51i}cHZ5y,^gvF_5``t?<=CbOݯ&>O8TK=ϵ?Ydx+^Js!~>xz&2ZTg4xq{h{|$<)l.za`uf Imӱ\?\]C8ə<3ki Dȟ|Ed̘6ft"=#MRu5q79˃O$hEټz|(k?T|&aa'mV^*Tm&O%'Ag M ٫Gm7^16vw#8x|JٶbcG<+ZhL Ex{`MO ' >tV7f-ʍ酼h등k$CT6d ZGŹl\%U\ ogyivv)#'wH/[`yl |z[poXW>q;oW&47MqL[#MNުa~'~7To$!{ۨ *t=3leĉ>QI1n&\5U6Q]7$4(CV"""""""""""""Ҍvv%: ڏ5SEg0e/,X_BXx9 Cѥ/Z4OcY[AO8=O^A{6~hK3k&?̚7]K8sXv⬇味zcQ_~sIwṯ2~d;bUDDV bX?i bb1`' +ٳV}M.z;kø>6 J(q92S`?6yuyu700CG/# l;5&y˖XiL|>%AaW {ͽoa3By6~3pW8 yU !ci}7qs(s9ySnC _1Q}澗ݰJlB"ЩKڇ9gN%^kSbݙ=ɳߌH=Q_pmf.e9S)Q%9b9lOL9DגNփ8_ҳЫz8;Q;A0IBR}7C%oamߣ+`k*&V1 .=Kiՙ~GwnEDD~p;+[`}k*d,_FfA ]m 0J(5kT{#(xgW5^O!~@MEy6~u?(Mt[5ʪzo%mَ:%xyfp~Jv]cӨ6 Hv3&v2S?s0`N88*躇w5׽`mawSrVf[\AsM[n7`P\TZ'rR ZDDDDDDDDDDDDDDDDDn:[ɼ}Ͻ ?4ց8;#L2 &>8jl+-wc`;m$(8 Gs?aW.+U~ľЌh+NS1UU``|8^Iji ©Ch>\r Sxq/Tn{|9Y؀aNt>&Ҝtr+]HsQ ZDDDDDDDDDD@ݟ󳈈4])0#)&-`Ը#[٥{A^_R }\>/[o.ޘF^oS ՅDB \`ifbϹښkY4 | ϓ^llc{ f[iS{Jc銂pC{ VS]^6ֶZ 1)Y?:9x8HYʚo:p`a53 0vQPPFClܘQz|7z^)NFfH"Kfֺ5ZӾ"@4\s `Uq?0ґ e,ZKR_`:q]Ln^m_nld?'iEw2m߹K{ (o WւMѶUHYIT&H?j ￳B^mE {ܸkd` ."AlGGb;ՋQZK|AEaor@^^o N2ܲ(gX\&|1(*(B})-"""""""""""""""""-iq^κ>qt L~n2j& ],t?aޭMIQ&X̜8%{0]d;v`3se00*]9ȫ=e/“'9kYZf7Y::mgXl!n~G6{X,a? [vo㝟VUoՓwZ 69 pag ^ qE/o,6f ۴BPbvLzm95V?=aum=.߾5TQ xkc޺2]=]>N Lte4\IŜ5[WFzA5nrw:ԗ6>wr|B'$g,DDDDDDDDDDDDDDD 8|'h՗$k).zΜF>]iem*6;uUr"?{>>\tL{w Wu"gr=+7x7(4f22s`ezJ<Η; LZOPma;)<B|R#qJHe -ݯ?ur:}5 tIH .&`MTR%x. :ֈ8DLfw0jp_]AzņLs #wY[fчm5E cyZ;{h|{z^05'~ӳI\ԗv$S@%dVzĥV}8^߾Ɗy9჏<1ys.p^D[6L)fz=]cyG5wTBnQx!/6_󙿱 8uG5;r\\qA\yB5o"""""""""""""""7e1j.ĸx+ogLzԢTLU?\̘ϙS1 IDATˏOf6f&}؏~א_ҖsqZdxCւɶ 0$G';^yo nQ3A#>CѯV9w6'5aS9gi1xk?>ur)mSgg8̇_fʺ"V/$k5`"?rqn:^-6`D0l<SR}?o_s3gM؏^~5ߟƼT2 qU؆w(/+,n%AdXA9}kzC6TU((.# ۶9o/^AhZYœS 0'4/>&>nۢ墸ҲJ,{_KOS[ίŮEDDDDDDDנ }aT4njӮ*!uZ"Zh/kV, ODDDD-(S6Y7#=$.*bmZ *1#н'1[:.z5V 9wzoк`~ gn9X`3d3STRNVn1)'F1qo/B!B!B!B!.{oC |\9D] k*9|qfP=ѫ n6u,rah{Lw0Ђ&S؛:h)-vq/(8gpXs7N t$xom䍣h$8EQx\sLuZBU4$FU<3* 4GU<ݜ@l$!B!B!B!B`'ζrNRa7IXmF^K翣UEνrӽ#A-ٖ|9E'` 9%|9Y^TaҸv'cgg$7Օݛ| +銋iy,)"-gh'/B!B!B!B!碑&0ntՀ(}I)Ƣ+8vg璩?)F{ohtw >ý:T[:<}:qv'CGJZ.ytEV !B!B!B!Bz)xt"u)kKב0u tuQT=w#?̿^%4[ :%}N;T[}gb3䃪ͼAUU|HLfYL4̷y"B!B!B!B!e Ko*##)Tb1:LxpZJe@!f_IUַ;*ϹmP*v´/b1y¡_m%73wbP|>+NG+Y2jP[jP &)5E+F@:E/φB7AElV1uMkCiB!B!B!B!3zn38fTLƒIr4Z^"{Ccԃ-`7>6$Tkbw^ok>۷|ONfN!b؛N/Osj9`Vy)WFNGL2:hQG`sݗQ\2dħqKGST̷JBTdC>n(ȿ̝k9S{VZy:sUWg+uE,oFE_o72d}y0綹թY(Ifﺟ'+!5nj}%UFM{:>m[.]1Wr ˾, ;KW{uB!B!B!B!Bq.uMAWܶ74ES!+5&* .N`hPw7kRݜw7FR>]P- WjB^ iF>ùs"}0'X~\q ..Qt pK> CX}23 :EW>WV!B!B!B!xc?щȻl.,ʛLbħX{eh9p_MfZ+?„f4CREԫk9uoE3|;ǑUDꂗ/uOV4!oO&> {<Σi at1)n j4 RH-1x! q$%ݫT(Naä䖡ӡ[?.*rqBtPFiav:Hbf!eڧ'N緪ЊC"xkLLNfZ r4"݀WH'ZZo)72t{wIB$Dq0Ӌ9qj )џvd4d89p> 1O#Ą/=5O[S)Ą Ju;|ۆ`ʏgN-I\/sMB!B!B!B!ZV={(sdEY7p@ źhBϿn%>fLnH|h<Ȯ=Uz^H|4œpDGbu@#$z?^׼kÎT@}i;ƞ={rI]qP J6וjtٽgvkE*Cmmr^Ȏsl%Zaeo7T9'B٣}9bƧ w/sgD04_{W!|ՙxftSv|5-?~ͥnV\&/Í! uJ|ϬǶ .3+Me|}֞8ϔw0dtf[͓Skˬr*c3{ +^b_0)>u0-{=}ϩY٠<Bg6R^#;]cX뺉Ɋ2͘1o6Z¦KNWݜ1ݝY9MgGJJ+Wڂh?7u(+L@wf')6 N-NCmn}o&Eՙ#,yu>Zs"|`$rCt5^7}-ScQOy}w̴e&}}s 2jeV}ɧO-O^y]YyG\.ZsZn㥃K>vdogH[ NI<>K(F/d0>Eڵ',mhUm Y[g?q@x1Y Y0cۋ>zwF)LfkّʺgPtYY\3Ǝײ9ŷ h_1^h_ LpR/`O2ci2 v1yt ?B5$%o`yr2 ]u=\P.g__mJcnK#z^''$fN مN!x9,HMl<ő__cr=>7 :\- c˸_G[۾` k 7e:.CS d{瓰}-kephJєrZ&6 ^ti|˖+ Dy?O;mWI}.' Fp{nfҶxd6_8\5wǖcyD]RB!B!B!B!@|t^nIv''c(nxc3WbX%K TshJwj VřmXgWVGxmi)yf.DkhQ4|k30L3yubjkZ v'(X{X6˂8{dL]J߱r|n Y?ߜG=Ǹ(۸熯:u1{+_\ʗ: %;yp x| nT;j"~2cUpl+Lyk#f':]7^Jx9t>sqwږ\b>y N]?C+yys'[1IO`eBnt|ȼeTbGU֓83ogyb7 hme_M -(:kT Vz4*nzmPQfa UxLQbG]쬸wyӻOkw|.n$kbȓjFu6k1LqxhO[?5X>}n58Rqٔxugmsӷ؇)sۛv#L:IlkU7K3ōEaZ?UҰ3 .rne⵷N7s&<KSRw{Y6ZFԭYp/|m0ozrMu{!B!B!B!Q=inŭ !;̻Z//* ѢZB>m:ڹVfEl+TQ\e~Y煥yW>o c tU]N ;j`TO+d(cK%̯-uyh'Y+ q3oĊl3t~25t5x;9[ 7VO㙯P}Gթ{vvu\Pr?φ 7?m#yвY:r4Pیfah1-aɡkڭԴВL-3(ԾWk pow!T[Of$'.]04o O `3_HeVM]<V@q\f/}{`q;g !B!B!B!EDnb'Kqv tZJ/ XA;wWWs<'(%bsW&-F@/'#8YFzY1[X:Uv;vvE H:Jn+4`aر'r(6G@NE퐍V΁;ٗA^GwZ 2d[l'Ԍ8z:.Drmѿ76ũJ. ܔSrk )Na~4_misc'),7cpUH.;!n ;9,;ٟp2'Cܻ'>gꊬ3+P\ŤI! nm"he%S]w ,\<|iFQz4.q$1SkRL)H>LJBjS;f#Za R F]1;S =΁Qu28]Y_XI޷I+Gq?ѽe#恊8vnK|Z.E&;BܧjﳶfvTr<>rV0eԗ-U#$r8y;3(4EA}) ZBAaʕ]]-Uh<6o)xvU5̖<T/.JUؖWDXTNDL۩MI4먾n/ ACz{'̠h#hYltZaTV.ɼOPe߆S26YSq#N\}6^HΝD~֜׋p:.Vi7*qlߑKX2M N}S~h}ՑV)ӔW(DDH$'1=SKbv ]1=rZIWL%72m:ݥ: ?VOUF˻RT- e!'GjTQ^iFӫȊ]?|+}Z`Lsپ3 ѣjǃS|g!~no E1a[`:&RIΙk/B!B!B!\V{1BTҎ$YⱯsos$( o8!*dX[s><䧀w3gqBXqϼ ,2 vt1]d=Mn^/  `Q 5ZAu b+}΂hB} E EţUL~)Z)X/X/G>ծ'.fSQd7+^ZwtWhN5>g|9pe12u8OU~UP]B|s<{Kgm%m_/֓X(W4GuP ?b(]v.Xѧȥ.kjo؝mQ삹ox[ó 1uM*eyv Q X7{9se[Yr?Agys OQHFtO*;ĺ[U+Ϩ{x Dky@/9’7_ȫ5(3C/eR IDAT&;Q[i9}"b,M]Ĵ+8VV NW2}3\׮v!}y Y|-Fy˕W=!޷k}uiU5@AuMϾʴal=ݡN)f=l8YyֵQ]:p͔%wYhdYi#=ss3FzrVĖ5wkJ8N}'ztIQ1(.(Fyy9z !@u Ꮥd:UzY&d,vB`SnOF1ŗ˫AJjpm~;)"1'T.Mlc L"JՍ!Sp:Rّq2UQyBw#1 ECUlߓEfZy6mz,2כz-YsWA`W/ ۰ev?>bM PJ('?m^;NtSHlL52R(@qsGEZbL$&RƄ宐c)莕|Wl^)S2S 򺈓TOX|luچwԸ<,'I`%F֞63P^^NM^e"B!B!B!y)nD\v7$a^tGIO5}T>]1="<-78ʤ|w]q `^N=Ui$Ɔ]'Iͮ8Z&k<3˒Iw[Cq˙3$=5Še;Yl~8 z^(uҲ/w>n.]_N~ٞEmEkҦFI9J2e;֏~#hv_$V-zc޿%nȒƯ=1 mz1lH/:VMv2,j:)O+1Ç!<*)9I¡lWLiőludKOvS!a-cI^ ^ExmjҡN9M[8FA#J/ɢGåFOcpP|+8;L:Y;>L[YH[1IK7Sҗ1hf!VVm y/?CQglil]Ep빲O;<,9;f&g󯡍iU2j9a Tedm$%0pa ;VǞbխFPwLYGذy.-ZT]w$U2lUMgJ"QXPT~tƧWW`^U΄jVF+$zՙ%y5oAB r0Ӱ5#+@q}3P=< Ow@׊)*LŔ(x[C5oбQS͛2ZX*Lf F@&w'mX ӏ1>=ձT>?MyfW<^˧>}ի'ŀ'N6e^PY^\D1ꎗ{=O'Qhbt@qī'8 OU9t|?QżC'WƗsnZfVULaeu:Ԝb' yh%EYvחWO_W{B!B!B!B4ES#KمLaVsfq=.‡h-F8~{e6PF?gGrvE}Ė|;ɟd@.:/]{ɢǦ命?[||OٺdO,MSw&6R"lf.w~nhnMڙ=!럚Ȧ7I1F^j6C:z5'3ci2;/fݨ~VH^btL8ylޘңl2x製doxc5V$ W/ǫ$>?hZ0oxt›l/>gҴM`9^:~9i\{=c'ps+|*ٯ)xeE~%ҨUufGYnuߵ·z*:kesQ0]ÏU&Ymi> GD_rouỬͯu6z)[ߟ{ Н;2Ʌ|tk}O__~η_~ʂlT 1Nws#gr:{ ]G׫ª4]hoJ\s.IlnrKK;DŽkfqE!B!B!B!(]xे|;>ސyK̪Pp %a 2/?IYX+T za3B_15rNfP!/Z81حy_~|^gp4V2SE+š=~o/R+yO CBdR P5.6Rv>hOOL_5Fgg?_ 9 C=ԯ+A *KoM.ňk\qLZvM)8DO`YahAWMaFKuS9Q!ŕ{f@V̦d#_ʓ/yV <0ܘ=Kp'ruX-gM?$$?zێW2~q6Ɩ{SX]Hb΅T:U]Y/"U=2};˭7z;5yYMf^KQ*),ؘݠpC.ɭmĻd+Xl5\hU=z,-ɯMx XE zz'ydzI9m(sMj SX"(*'e'^.s]nvn=Ǵ_]eÓ !B!B!B!_`j iJU 7ln۩ML JKuP Ĥ,)[X}I/At{OH;ܪb׳!WՋ]M&(Nxy:Ov֓[S>/M Ĕdt _}|#ܥ~=:Pj*}:]B\;Ŏ49to\?Ճk`'9a;2%g톱'sG-# u;Cv !d$cz5uWVWH9Oįzkl"W DTQ)+Fz4~Or%-w])+Ψ08ҵQmo,go<˿_冀ղS9YOtg+C(CI>'ѺZG4vS/5,K<1st bqupo| bC͝θ8& Jѱ2'e;QUÙEVnvP:3Ȋ=I-PkoN @  :"yB!B!B!BXєs+#!:khߝ މFv\<(\/qEu̴,,EE\꾍|xXw/>=7m?^eKYe/)*ʬif3PTX\#CwB zF׭ruPW.%={> epхNēPJ)UN ZNdں)T) 蹜4QӼNq#8~T\\rʪ_J8vt%Sd--Juj)PSVÅȬu"`Ql=-L^+8Gsu׺a\3 /@>K"-_ρA]]-B%xp|v{ <z?+ )NOVQ6B ؎^\Üye]*͝BU|旃n>/KsĨ:+I+qw9b0UF$ve\_v[ʺ<[3scUa:Ymas^.PBp{ýj?,IGkϠ1n*\pr\]mUYt>Gs]:Օ^[ߒrt]g@+n-k'y-6I|Y _}^joh晀ډYqUk~aݕZ&~LAsER]Ȇ%su]~\ Ԡ~ Ԕ\8f+-}xgКm Ph}\=N5tˉH.*P_S۩}~*~2g+4P>wV !B!B!B!QqquiZC+"D'?^uojg***DT< 󋟲d~&~|W;z ͷeh;f,x'|Uչ7o/0JNSYt :8k+ "\?S˙KRؾs/#m2k+R[1ľ )_f[`A,+xm|H' r찯'D|x5^UTOmMKL%[NP\(g\D/HGGf <O0\f0ܼƩUQ{CVo$UU7Aۖ&PUtʒ kRQl|ۆ^!2?dݽi\iv AWo43#d4n w;d!oh=y1*,XB!B!B!BѲAVQNGGt UtpBϙTo۾FKݼl?f}ϥ"8[~m-eԬwxydPpUÙo>Ì}~^%{z[POQ5z<\H37W˶?ױi;H|f)E'1ySߙmϽ4=䯨y]Ck(;^#;5J.N?FݩkhPl/vQQQN}5Xq3k6_{/.wܵ833.XO{c̝ô9!QtpPY@Zbq'POgT3Ȍ$aoّ` SHHLJv7]w=?ԧ_$:?>@`,w4Vhj@A\>m!y~Y"Mez<F.W1'?λ?tgod9Bf^2}jMt?_'1{#Db&/N^)_zft:ʲ\5`4u}8^$g<|J"FDV~bSK M|Ҏ. weJJpws=gexuUyW׾Vh.|goV_3 JcR NǬڡ8f}>%cܽz脟1H"hu3pбyMr˺0uCxl, 5AC>{f>Z1L]Jk__,{nwBD#8t4R!*ӎH&ݙ8^z\*B!B!B!B!RQOh-ȴrʛ0T(23iۊ}PIB3=45vD K YIe>`6#5io,O6?GXjXMCJL ukx%6 Ùv\zm;.B}?|NlE 6tj8?l*(뀫>(呞UE$U|;0[ ifvKvm7L&(x6VU)' ۷FNVT5-M)xeEwͯʚ}+|<Fy`4kְz.,>(a}WJ>/v5=>6~PMܞ-z5ʮi*t0 w $֍gw` = rЩȎgƵZM{m 6^#Nz.ޝƴv_;s+xhPe ;}JVm9LF%8DŽ1}>^~,|PGžq;Otz4c= LzmV8tf& Ekv86v6ǐPgv {O;k4[t?{O_폢@Aa1&S/>0L(ǾDUWάERu+YOf WTDԝsx}Jzo?u)Me AoLAxv_1+`dp y EQsu^\yd}1sǴCS;^A]_퇳qrz=+ z5s}:L&_ ny;G[YfeP!nc;s3\B!B!B!BQqs~3sQ^FαRtp,-_ӑ1lKoU" PA7`kn; $o?7}o^˵a7tPe'(@u{u~}$[*0[w4\\\P0CɒG1'o-'cς;a@"h?o%Wշ^>wFlp7AARTi;as m, +'(gL44'G)|(_:o枌x'FnD8~qȯ@quXAM]$ŕ1|}$tmߠEޏcŁsk y}:{gIԱZk+ wf}4ρ?6cW_6|;Wkq}F2n̮)ٶbHtbfv#~eJ1LFiƯU+>VҖZS%*xF]sG00SWcE/8:$0pHƎØwp'0Gq1vP%F3 ]DL8zƏ9} C > y,qk;8ƎG0N`^ q ƌdx}$FrJv8Nr qYV."7:S0ith^d3>pcq#+ ʘp쐞ЭOy̱;f(+ }c1=~ЇWh7 qǍ ~P"L౗PX/ge]wVy Q nt%Drn!iFNӣp3,y7>3 Zl[4Aխ;\sP-s3*#}ɗ}j߮żJ0pE\x îfk1;~5d}~s7.Ȑv&v NYYח/j SXÌsc4,}6ke{_U^箙ٲ!|vm0f+$"""""""""""""""G ~þgoŬyZNӓUl'erQyI,zstr3[3x \rwLm|8gfPA[o_YޭyGzs;u9lNIaKE)997u\|ʔ>cB:M lܐFvY 5|7|c%`_wlXئ?/M_=H[UYմx8ee BFOIy\B2^f3EdnJ!%s]rr/v[ L<'s[Eӻ+v ֭ac/'}iu>g钐@l`>xxmк:+*qs\4"M9RyqE}J'?^_N(--òlN̳#t+[ZDDDDDDDDDDDDDDDxʙ3xvN:-P.~_>p ^xW7eSPQKXӬxO8W dK 0im7q#ǭ2PYQNz}`U"m!?'kC;Q%r(93mH $?/k\6Ine2JDDDHWԟۧݢ"+U;G;_UEul^@I5x #2.0o2Φ dTcy.11Dy4*Hߺ܂Bj1#!:Yx yv>׾tO]s`uob-VZxt g"ZtQ}=k7gSX^Hxtݻ7|v*` dI tiΓ.$=3BJ ˆ'f{jؼf rqyҵG/< u%[YNNqN/IAEk)޺u(t#(3bn)gF\Xz#.|B"IOס!v4A巹򌵬ܘEQщkOS6{Iy7ZC4cCِ[7+/. uN'WTb6'i5) -R eL2yc^^xyy01ea,Nkw|~|R{#<#v=w!&X{8Q[6]g LgIBp$ - AiD{pT+A`TCZ0?6hIawL%3?".H:TahI ܒg*6 xĆOWPV^њK4a0yL(y$ E0"}C-䏍TUUSUU߱nbtT0b[MPi-˗I.dFD`Բjr*]UFTЪh26 y~O nu O!DTzgx/|)WYTKN:۹F F&rtw?<DDDDDDDDDDDDDDDD7c ݡED'?qVDΝ""=MNێ;ܥH3; ay4}HDDDDDDDDDDDDDDDDDDDDDX DKh9b)-"""""""""""""""""""""G,EDDDDDDDDDDDDDDDDDDDD䈥@?RK^WNfҋrϓLfyuUtzk'Mf5{E [|5Ljn8 ַ2䮫&3{q 3}o\~dxrڸ43]iY\gPO]ƲEXF 1}b>=mʶ!5?^axڀ*`òdӡuvUɔ{q&+eKV[D(Ǣ_INf% [8`~5,IFuwBȡEDDDDDDDDDDDDDDDDDD\]+L4׼Ģ] Yq\ ԽW_9rC?7*W[eNy3qD;4`Fpʝ/1&ʷx|VQeӱ`FN,fdV`y%{uEX0wk3 r s@F AXӷYp2 AMnbˠ`k+aլWN|lϹK45:<ˆ9a}}Jvk)#δ3nXļHϯ> TPlR֬&ϊBB߽Dij:tmdەl[:7[/4>F00ʯgyȮ-$uBo#߀P:EǒԻ{|,;:D'FآMRK l!:>»Ъ"so]Fn ]3l$Z~Tgl^@i;¢9h@Ӧ2{#vtٹG@hiI/V}ː6:gTY#<֯[4;RÏ.g7Eo>}o%(Ãg1ɌluzvnCnir| k4O?۝7([;L鹙[x6>C&Y`g+{5Ư[^OVqT,⽜dyf~̚zx'o`tXoxާtu!=nø+ns{hb=O|ϦJkuԙ7 ]y@0A<d}3Q9+eޮ%줉<[+Dv'=bavmdy|W +[5i.s.>xty>xOFÌzEYLkJwJ}.},&z3twy5ws{w䣻%o'}}'D>EDDDDDDDDDE CT<5߃czDݟͩ󳈈k;_M~Ȣ6l,Y]ļOҨ$ v$'K_OkY>7_#PvBn?g '/5k~:K66T%DUE?=q;OŽFwqLi%9kp=H[?g3=Mnhoߏ.P2o~LY'9#>-9uu\[iǏLlM|ݯM:oMӅL<-#=Fҝu~N9^+|/{ y~*JGf`r%ӘgO kO5O\և]\~!?u)7}C3|Qw0b'r;Sd)ڣ^ѕ{3cA0k~K}UEӯaƜRߛ3CᶣlleɃONe1~`vr~#7}g!g󙷩 G1\{9th49zt5Do<x.Όfڗu%lRODc9#>Mj /r-})`یfM jX\{b3 7ߴG+lE/FP.=;lV,au]Sj2fC{ts]vs$LaײYQ}:.6~?J- .>y04[QLL`/xۤ7qA[uVMf|;g왢5|7-%9Meu IDAT+ؾ #Hj@nM.{_dDy37C! VڮXfM `/^8IS/"-@U23}Rqc.յ8;T5ՍSNVoYfHN×N;BnI0.&&0"N5z}xb= $xx7&%؞]:_HPhΙDžcbS eZY,XCOf|DcMڏ>~?ڕYTnٞ& ',U[ŋ3a:. <„FOs*ĹdE6pƜ2v2;3kO>켖}\ &`R33`?6Ui+`xz61jr?5#~CiȔoeo7p]ތ?GFۗAkIG`-D[%W7<2fU[S>j DH2̝K%K0w -}6w701v)DcWӲp:nbsrcpywh|[6mƎ=eߛxbk}Z5*Ϻ]ʂ$XÆ J%+vwL{AݭNVή}鲚탽-D9%0阤0HS<=X}hו2|%m+wx?̟S 66޵/ȫ B ,M3 và1sj"c}f%{UVdH[%Z#*Xo V.[O]Yۗmb5ƋHLe9+UXB _7:9b +VQpx5 mK 3Xߦhy2\ٞM(t'qGWa`b9MudEDFy%"uvVԁdNA>+lV%v#I}YeM-$ej*Zҝ~7o{\糠/ By'D0ǎAà dر!]]UEN6J ƶ[0L!C$^ޭ:墤 jOO=" (P%YVooNJQWק}0z?\FWg ?5u6{,njlcA#6U/Os x48w.$h(x<`0x,YFM|D&'4dgԥ{ь sylq otz>`1U6G0:eq4?* K,iIu-)ҳuPdS,̴1 8n~U\D ;Mt'7;`3ˉ lW&KH[oo39rLGג\^Yȸ[FݽNedlicw{C9Hnnnt t tVm4V.]@v6*[= cJ3r2Ӱm}%B5z9ecjr(-)˅墪Ғ"rؘe 撺f%Ņ|99oXLMpWݰxUTȘ *o{%:euw/ 1sf_ ´kIyNf|}kЭϰyoQ' M~|Qג9ny5: .87>MŒgyd՟j _;6r9mxb= pQX̤Irraew޺zݛ],}Cey*Dž`0AXLჟ(u6r?eZ|xdWs,OWR{|/zx52GkyN۰((z*][B00lFN`1x>5}ƲU^箙Js/_{\:KE'EZKm1u5yAdnwׯޟheQYQNmdo&cf*ʉMHh_"OlMHIQAhB OOjkj (.̧0뷯DDDDDDDDDDDDDDDo d4u/$e&!=Q]DR2J0G)'bW3i"3gc _ =o-9Y mx3s Aרʉɪ`c:_}>ٛ~!8JYl=y56[NssXY}MA X6b_!aX9ӹc͵C&kgMcOMU+TTmx۹-!8WYUk߹5qat33.aӍtNXxL}% (q\d1VйK7:Evië Ï>$/~K+i8ESpѐF`GM'C)=5}0ywoͬ pt/>i}GRR?'u!=9HH[N1kN2)i[?{^_Yl]>>DG.`N̠WxͯX-Ź> ȑ{(:7 `8@eEo3QuU+.lyHЍ)+-&y, )t5ɟ֭L w\Zsx .ʷgl k1 {`<$(mkQZ/#=H*IYEXHuĴJYEJFnD&GGߖutvu:6gSexԡI;¦:o#gRPV{0[2}jQ]Izf.TxOLw;&gVI#̅O$%u#շB-[׳ns.^~w[Lg,rx(>~#;Ddmö-"tk04@:Gǰm&r5i,(+-ۇ?9MӤst A!aN^H~^655UtOP?1<ڇ]IQG'"q o:$ED%ETA* w OM#I$pҀ[`rW 0*>J ZSخw""y:JK У: ]?M@`0e%V DWWWZSخw""MܶܜݽlIۇl2mi5DDDDDDDDDDDDDDDDDDD䟭Ѷml)[lڻjiKK_cj,ws)jNdlلFR$ p#c&*Z9 ?&O0yY:m%""""""""""""""""""v X|u!Q`Ҍ5,[^} um6ؔecc~-u&)6:akFuO׸lLYMzF'=l>s^`ؕs)c~em ;0kްek-:w= 7w/|څ٭G: &rm`"k.5q=ODDDDDDDDDDDDDDDDDD!Eb'3z Lyj.Mmy%ŅC.mn.xyPRT@IqAe[NSKmueE9l^/~.jk84~ꨫ,K^y ^< 79du7p^gI'""""""""""""""""""Ґ:DdelklwLa&]cnU2ٙ[  :I1{杜qgeW-e,: gw}l 7=E*ϐ.8: 6 c1{Y.e)sxqn(-t(+)t8 뇆w\렴˅ c;A#KҠ5K_IU*>fg\wBăЮ =4vn=4jQӮ䱥._ rfD"""""""""""""""""""M DU͚ɬޜEAWڇGҽ__7-KpE[! ~WHUl*$DvxhN6`l-%(,]{3(#( YXxt!.ܛFcu.;=GѽeWd>:ß 6ZEd8;ӽ?`o'ekiu;a.#8XbRq^\^,ʊXOi$ȀaRfPj;_laCN%G16L aelKYz/՞.d7缘P_fAq} nTmy9۪g35n? :׽ Ӿ1;?I^W%<3wܽ|{0ʷr\7]Qq&g<¬A6O󅰊X:heɯ/qӝya4ڥ<鼟Z@E{ 9ϫIm/ᱧ.AZUor-op "a&FiQ%YIN&n<ϴGjSySm$j÷.aai}O8݂1JYedRj?tkrK8TwiUIg[3tj0i3qG"ҷ?r̝S2)nNl5:pTW6 6{ڵUvBlln0]e+3q3Q vPSߘ:aJO?M}Ni #̭+~oqCmbռ[xc]%CQ24v٬a(Mi7n0w^ N J$su 7<v)n[WK2;0_l@ h% n >n8==ܾ_~ד=qn;zP.~x^@u灜4$~(M&IiV""""""""""""""""""" D"ӇxpN6up<4i( ZXѠ]s9WvLv|?>i_dӇ|{PP]m1??_OLt._6U7}o =wy?%^{#'h蓜ƐwQT}ǿ3^7@w `CĊ("zbox(V& CBB $! $y^]HB(\/dggΜ9{S*xٗF`>@tbOsZ:LYK3x>>Z܋}5{,\Cz}57.iy:]5A/11R~w}ڋ6~nޛ6NC/%]TB{+.ֶ ?<`yiy#t`*         phdUTv]d /;j5`d-=Ogs UزKe8e Pd-̪ ͬ:`E g\ǁ vUn }3_305+W)E^2g?IAK)еͳWW' Uk{):HU^w ~c)vaah Nx}L0JEovT 捅kIW}>my- cL \7+$ͯO1Tw^ ;IFFXdfdkK++N Ѽ6N3n}6kUKgQ%o}w CH6?8g"zƁ ;9SpC\oاxz| Ң/X`n>7Rɼ-f_)ڐB~T9Oo?t K+(RHe%znύ!M^;v5lR1lӔ) Yx-z05[9/&%kmw+N7_Ȟx%)L?NqI9cd kP¼o?8wR Z-]Jc! mSR܊z!FC G8VvݲJ7X3n^*D"0T=c6x$z{b*!3/Y1+:5SKcYaPA4Xkqv¬vk}I6E:0.kH--@v25Ф@JiI)* YkqL7ɎNhe{PihlZ6p dyf36C1Ѫ7])յ_$NZ$ PJ(1:̱05uUc       WE~}1;3uc+<\l*/,K9iߏϒ)=ivUh,3/N>_'7%x]E;Y4i!j\y8k<2M穬!L?\?cCkpuD \NUUZeH3CGgUm P.=Сkb9\>\^B|hPU'%˪T'yٮT/.79aiePQ^ iCeyVkj_- #>XOy gc mu+rK-ßȘA9 *$ I6rv ę^a^jm@Xfݹd?A9_C}|#7'$]X+I*VqI|G       Ny~7ĖH>qu.Ŝ͟~):J*т` f?fN ك{fMrt wX~k5"8)7kqrqB& Ce*^oU#.NfHԀEOSbsg\$SEy@0{>C|t/~nW\ "D:'(g|ƩeyU62Z'd220%?\j+";6Q=ZC^ݩ&ȒLO*+Oes-NsQ2-rAAAAAAAkG-Ǣˈ+WlLnt1we${\^,p ǵEZthK ֿi @.pI9b]ۼaYfg&, ~ϫ&H$I5i敕l2|k歗\[=/;XcV 2nأ1 ,.$b#j1*h&Ӧkv썪rNDDJyq1I֭d%:G4iۦo.ȲLA~.? Ȳy }7blXe{RrɨVAnEDx+Z4qEFs㤐 N*>W2nH50'9C"GW2#۩pȭ thz daeݝ6ZzQ1&$ʪeͅ.[-1iZӮR82Z$ĕ aզ-mdAAAAAAA_.SAeDбm+GW:yܒ* Kl]nDavlfDWHbL$GO&jpp!Szbi,Ost FKPjbw32% 6.Gz9 $ɮR$bc$ Hn"Iɢ̀֝=;Q,)5Hބ;aVp&r';OSε5]1#T"g)Sj(H9Q:`RK9Or+H8G-$,\ gsH<W֠q+ =:g߸Td{G2ȫPvtGk»u!mkYT[!:pMϞJsh7O*H(VZ<ӳg~ v)H:Rv8؉}snmB8%9Jg :N*cDFA)ՊVvδnMH¼:gR9^@#>' 7 3I+R~O9IF察Z<%k<fad+QI8ɜ.\/cmE.1D]q{vr01b.~aדƲ-9ڦrxR.5`v'pҴD ,x +q"zYwm!n{#}n݁=o6;wy6UFyt6n!o 1UkY.|ԤJTɌ[z]RLWL"M|ƶvn^b:=ߓXq)jD[X`.J)zVW)ڳj8IܸQ^?d{(jFd>ⲎsdL"RAEvYUJgSh@q Q1=A5tÙM~S3[;$T),QɮőT_GJRsU@SnJ       7(k'WA7S v34,Z&i g2:@#9 <P)z&EGfp9`իarߧ<>{':Y~RߞWّmz#£ $c?_xBt--wkk",zd9/3MLA G}bk&ůsp>uI;eۼLw%o?Gq3l]4[ޢ;PR/o1??BcZ̀#˘pO^ҧZlۚ!Mg y_> 54v?0_z}x 5.l>%I͓ZU)OXWSTB gLdTʓw?gut~t/Arq<'zcxؔHq4N39/ թxo·/hDɊqmyf~7<w0et\Od?:,oǮw_)1\)V1I˜RoJ>hx%zTw=̨d|˶ {?<ڒet7omktm[;Ւg-bmR׆G`"-'u'qrSV0co:ud(I9ȦGɝ5}7ύI?"yLk"ҕ^-;ѩ-΃|_Įf0_})C{ӑZC쎽E w>_lytwxk;f$ ^m3 ͇o/x͘a.]g`Od5ƆN1#Tsv2d?o OQ߶f7ٍNrd,3yosӹZJo yk}& p7/O? IIJbkLQR.4 Ŝ#Hw -0جb.aퟠo5n! ɑ R236,1!^C>y#IjS?ȭl"%ܝw&o46.z=GɛJ T_p: Vl#]I] ўϗǒ( eZVnPHGs0^?@ lZ}~uۦkvw<q 7p2P>A"a{os_AAAAAAAnC(ޜJt.ށ8h. vyGC'_Ycۅd\#R9mNJ1dC´)]͖y/4UD A<7m {6/>fBjY _kS u\0 r?D-$Y὜O{_'dMVJg?(ƈɕHn_*OpT9A)/glj(NJO_HZ—nPYx9lDJt]ia\U@hvlF&Jչ-WyP Xzum犦$boZ2>Ljwrw*e1ٗqTA2s&@n J$;؃ٟNVyZ/Ēc( ~onh|ͦL|8+ԷXuFAmM[% Nx+tGNyCz{OT O⯿vTPKٖe!t pJIWBC"} SDӗƐ/0Tq6$'3Jz D93XO~؍ m-}IJ9KNE}yL'w٘ʆw'7@y^:'OW#dɐ鋰)p3t ?+p6V/xUTFLTBmys~e2C\}[qzWRrw1lm i ?Sm+-ۃ?ꭻ=)-oM`L#2]ȊI0kvacy$^yy~&B;m''(eT ;/״5uɅ|ΞIŧuu93TUV䂣dh|v EnIT@vb|]       R)ON"C$KBC[ؕ>XI^p<emdoe1xd; Pd-_{4lRb05GX:5809#5ewctӲ±<+YǿFju"]4c1 Spxe:ܝ^|8[fd"[&`M!yݐN`ȌxKDO?ćS}B4_.\%0X}ܟaTH>95{"@ri]3[ɩC0Jr&iwp}JDs/FCVo1C~gزp23ץqhR&]UH]66gdžЇ.;UY%+/mNÕ4o~ $nLM?a4kޘ[[9|>XrW-χ[qǴp]l76UM̒|sUnm}ʂuȸxWAg9߫e{g];1O`N,sm/#J~~;۝1i|h|D';,Y0AՔ[yaea=WJ*9 >^6Pɨy3og)izs>#iRȡ][kvG'[HP~ttme׸1xX|:JM5VLxgs"ƓU V^xbgtu'`(:=lu*wO狷gv-}/Ӄ/-V=z$h[,7m*cvֽD)GlEQçf776A$&P^Vz͏W^VJJbmu}Vv@F]{+Y| JJ8}6mcR]d'qe?E {t4`Sغ !6ϖ/r-MdOh`59c+w!Ȁs(L~ůF$s['v厇'K?< /°vHj ٱc7sl >y{ČHg莃rnw|5v;$#3+3زe;{gQ5~}F3<,Ђ       7J~n>pkyS{605/dgUY;n< 'u1쫖sl1 n]1w $كn: CH؇eƣzw"dvRF;^^I#b,DRJٽreqGC*2#gf04ܝɳFdֲ:Dcٍ{^z%<6?2Dq8FEkY #ah= (E{UuhU K ]kzuTof:j+UJ|v6+gLjS"*gY?](_,U9o CXփp5d?;M*rT^,&CRu$۔E 7q.%ܮbLi2ZjMRQ^v--Cg0<[hMa7azdD@DZU826toFkiӱ7mZQWot;Z?Ufu]zx(Zu \a]ir2$K\: +@:     \TWWJ<OAUVhg_Em Nա]ʖJ [׳D8Mfa)O#V 5(TZL@c~,wo!{ѣkg5䶠ش̔_yn~Dֹ=m*zrc7zv%]HyE|*5%` 6$oy i$Ihܓ+ YXR|O֞4m9HB 4 Dk1Zr$;{$@ZM{9rJt5ʅ%ť(p|O&SdBʶ]͚'j))٨YpL1'}R&i$#XSH1"ձC eSR)S@lKD霔uh{4/&TJwwd${-Z'GOvKwDDHMi@C`7`Lx ر^yxNePTFQύq S\7_m6PɉP/|v|\JۖFLf`R]̨ [jM}̅pemچP]]IqQQvҾKOl[deF{GGڴ m     ¿չF7GAQڷLq$]HP_C Ɣ.UT!$I.lԦ%-ԁAz)Zyzcm]7JiIi$wOzlA_%k4LJbyYDE!x#*( gϤPmڅ6{     oҊ< spprF7IA1U IN. [׎} <彤*IO00O-c'29i2wyСBq<8.4}yՌ͖8t$Uk%׳,~w*r۬qoCQD#13QŴ2:OVs!V$P]La𶻤j]ϯ"rݢ*. VIBl;V?E1Y5X gX\VX};T|.ڭju8 m_$1Ğʧ|sgggܕ nprCJ ^* }c nMWV ~6\a+7$G.SZso_OxL$a^PtiIc"QUXYG Bc !XڒLRBih'M~ 3IIJ_@|aAAAAA/ KK\[yIڈP  VUYATU s[mz@j9T0-Ϻ-9(%ݞy٣T5PtRnGƘy$̊߰6o]ɫ].CCnц[FL aǽd70蓑x4?S8:܎4+C|r1~`%?< 9mjL] T=bXfldCUysbRD~tq*l2Up_&g =\r7:Ur(S]pu!W!l >-P%ZE T[r.K)9*2ƪ:;!G/:šְt*"ٴ n$0wNTe|rLpesSp@RQɹbMd VȞ0wS6S))rZ"G!VWt-Ԣ%[qvkEeE9Qw|e%$կ( e%$8F]TV o6-~,A7C8:PUYA|l{m"A2(*̧CM *+)*'3=#ٳmQTUVB.=EZAAAAA'Z-jRNs6J& R]UI RNA넛oE'FFC|97RmG9Cz :B):Zc+F3 @%2޷ ß[{cڠA268]#tF *thN#ǨRԜHl>T8s,$@eSMVyq ]&=uZF>wŧ&E$ E t 4kkh(2gᢖ쇦<"/2`H&W^.`s,,P;| n7[P25'4Jat@nE۶W k3j*qdPJb8x. $ i1 (#i&² 6*%E& yI6k8HpUc9ajNpaD4i=n\ۮhj[0Eﻒ$dؤptgR9ܒ0q\xX\&#}' 8CIQy9Yd],uvGuh      ;x`aI~Ny]  $IƄ0'|D567XOLxL,X%{k=?U^pԼ4de*FXptE)C 5MIXZHB̍,Ԉ0ZUHQeԨG[jao' ŅcngJ*a9g"w5&Yc@_IQq5`<܈=ago(Eed $ ԪUDzyB3/|R?3y:_Z F牆~}_HraV>OSN k]TK{`w'ikz}|0㪫O?լ)b/9~|Tw+Q՗AXZ,CR|e_م[cqQYu. 5$VkZ#q򣇉@7zT8Վq*1S]~IfO(Q02eDKv =p [$D[ۮj[0E+DC):t텇/6HRIۗ]{ ЂBws GG'mh4h4mptt݋OpxGAAAAAkݓva8aii%.& Q$aiio`\{hk)Ds-ϯW6Y&.4'˦F_v'U-KY\7*'{ߗ_"͓/敏V7HS~fsjtJ%2RِoWEy¬lbƟP;d7,槓la +|$[Œv{J&?6 {ƺd'!Pg5k 64 a;Ԁr5;+ g?#mHTJTNU3ji 魬'#yMp5jA}U[BQM}O7 e!*xye/n.~KUcb`Z iw?sBVu$|;6R.s*ec«.b\Rw_u'káuUDmj>TV89sWqF5_S]ۮj|4`\Vښ ZAkL7AAAAAA׳F7CA $=_> NYl[b/>.6HfgU\5m|iL̼Lr&'9Ȅ'"#9C } _ی#/8yv@cF,2o#Z~/ы<>r-e+ #k) )1R=Ew^~h$ُFd= #k1CF6.Hhs$)Y3a4Hȸ5S;c?'oW&et=ԑ^}7r4*塚Q$\MUy˳#W:=m=T@Bz1rc>8?3'F zbEQ,EDPQPذ! ;@HHH⦅!'Rh\뚙ٳg=;*܁eqӸPݸqdL$My _uK+$>@vbŕP)QF`>XiYqq(J&.YYJr?=.IdK8BQѻTlAw3W=套ؖ*S;Yա;Ɏcx ,;r?/ه4tmkhfoaRB!B!B!B!u*nEXB_ $ȉsg{_=l`۾C2-&DxA+{ϸ f|ehC>0N 7-iqu*9;็{,q :m#*5M$D9Jƫ <:v48>3)ӾfCZ.V[(xbK XȐ6,yen?_jug=p09C,\Ά}Q]+ '&wX3l#5攱ПocsW9Uu* ,ٯFniU5:PSo(N`n}ϊm9UHyuR0J IDATm<ڐUgTfKAnVdF_`ӽ}Q|-s-bUl}:sE^tǡOε?K||/ ;YpPA>f {{ 2|a'<,IzV[N_p!`2⦩ w869֦k{n1wtQv5fہL2"{_n9Q)8ٮ̘9'~F2{)E[fYM5IcCJmV}xb$[ϝ4|(Nbӕg=9dDgyTm n|%^-|WoULg|%uF֎Ckyq ύbS4xmk8G0t dB!B!~n+zE^yhIr_7$㤟d6(I!B\@XǮX6!xdWZje/Aql|hV+ v_,(V.cװ5Ť'!=;܂jlqiKH/TRͣB`ܭY5(c1Gb8V@"=>KcuT\ˬUsOjW?:idDb(@3ś9[S(Ss1*Ӱr&}ε.$dWRjg B۸Є۠e5>9A+ 6:24K<ۄѾc+Uy$đSD7Ckf,&y~2 (WqnGDgkR+&)9!B!B!B!B!ęf߅qT|{ ^B\ !B!B!B!B!B!h, D !B!B!B!B!B!.YB!B!B!B!B!B\$-B!B!B!B!Bkx<2z46_G3UdjE!h !B!B!B!B!FH4qYU(~tvBwI@uqQfvr{$.02ݻm"DoD ũؕZ՗fI/HdwB>D@\M&B!B!B!B![2!W^uh=k.twϪ)F摧BF˃TB!B!B!B!B!D#M^Yb녗hB\ B!B!B!PUYI~nETUU:k!B\E[{]=]B\lu!@B!B!B!tr2$-B3uJ*+ 7Oߏbr9[]eFG}| 6xۢtFiZ[PF5.^t݃^֘.3/ki$h拃Q9W'A]3V'QԐ^É]T;|CҠDqe lݟB~%>؛p׆;-8]HVtӝ%`:%9x(TfGqnRP0zkjweO,3 RpqwǷ]gzuŶ 2cyw D !B!B!BqKMNEQpu K+-BKTUVPG^nٙTV?zgz˥}C뮹,xxI/wdޟ)N~ L18xٛ 9l5r,O.Ǭ~{Βb5c9- U{x?uϣ{1+{ xq1 8쑓X]m-"uN0i 7|Y߱H9\-Wxӂ?`uT\ˬ>k?kwQ}D}f2XHޏ9S!kɚ[`Ғӽ!ϙu}<ҙV%|=,?{#'?NU|#SS,}K6/䁵UL}=vog\u&~QN\:+\ɡw,ܼw؊GQ|j#=qKT=ڤM3 }0wNz:9׌yk3L$)MżRk'=Ft'd5ˎB!B!B!HdSTP%be}_߅B!SK+k<|ZLjrgtchwwnAXwŽ7 DNű ^ɼR4>r]\n^ɟ҉Z&nezff>2lhcUʮZ?RNWqCܬ \4]oױcf*{Ot7&ShD~:cJUzf is"8ۗ6 v”z!hzZ:w穏3)7u2cE*5q,>c;=zSdGcMV}k& 9C_qW[TGO3d͞Ų>0DjQΒmmwLDӑ᭑;{1[{sSs`[HƇ^~s,1.>bgM; %y|ƿY>9{Nj9l^[Dۛ_gK߈io_X9qLPSUEv<Ԙw%OCqa'`䕧&aoxz# ~ǹh|A:)=EM.sqD9!3Uk&|k FC=?2By2u !1|쾿GמxSpƗ I:Fsg} .W9 !B!B!BqBu\\=$ -BF]ͺ1I/ZϷKU\}Wnmsraņ&2^ŋTVOc=b:e5h acʣuy T"WEA?̼q RJh&3ɌP=t3WЫ=Ŋ.NdDS*Z厗d^ŏF?`ql1fړ'$`Uac]Lmd4R} ]mŝf" `{xOڻ!~ tŖ^'P)c`ϐ qs C?{큓mog h!ccaTB04K'y垶Z#+sLJS1!/05514@eGx04@3Kٽ#A=N )v}z@^QU9oRS=}nHkx޳wzKbF[o%Mg_rߵmp9u\pL"UP{lM!-5  *]V&ϡ]~wE[oLO$mSOg^,jneimFu7ZPYDڔ6o%Sš_ez 1jOV,J|&vuMT œ 2H7B^u3=O[moo]Ɇ] ξyN8ӾC$$RwƭէOnǜ7\QhjzttIkb doy gӚ8ϡƺ 7pK v=ne|ZMT_ѳv3g} ._t*ykr=]WQ'!*\W5n-t _RXGzJ2Ņh'2)BLGUU\j凣B!B!B!DSUUU`a"_-BcUU'hd&D2&s"4dgu! yh=%Édk=Qw<qj@oSXY(9`9J38U[PʜU̪}%-D#Oa~.aaiekFUTUVPVZBnv&yP+m#B!B!B\tOJsM!)Ǟ%=[\\t 3T'ڐo1ck]=Nzq!E#.gZ:d@ JڲsE=MG?ζn~{= څЪ%;7񌟝v|@GR _0wu;Fu齚ysl5@cvS߮ z Lf| 0Nv4ykF))6:?_;-e]슌`f)EGv/}uzXkgYHĺk~Vr&EQv G9~.$f\tq[˅hF# `0mP(>~mr`w/Ҏ&`,)QQZJ۠zB!B!B!B!Rpv"ZSCv.#lZn9Tgrՠ\^MVy='UAUj+)/+7TpQ _<пiȋMަP̝q?:;WV}ވy.]qsT![#3- ߆UVqq2P1'l MSEp9S)sϐf)O/!+sӻsgWUl KBS,LcblAës7[ m7-< )>?˾o799RyQN-Eqf ).*Ʌ}bkglmӵ@\(.*$`l-B!B!B!B- SPO*ͪ9;okOtJ`r??syk~,W?I6jߋ]xX(^DN_578Zv 2ۭ6lNۊ=v W YZH4{E/&&I+aSP#XAa'_k5[ :9vYZ\//8~<8#Wsss "h#B!B!B!B! N-y ?NTϪEt\^|o=u|YD>?Pwӹ1ʼnJ[3-W^}WՉs:m-AQЯofhDJI4q^Z@dZOXkzx.*z.f_2&?~?7[9eَ6Ыر'veU49qx^[DEW[>'RGuuj .Wю6(Z.˫ƐZEYm^:]Տp+-o?kKPtY3`Q*b?SpUzޞ!JuP_욵K-} N::ʪ+ oIn#z1Maڊ4ła1ȡa5U?6/yRyȦ{7KSRYi )a0ѵW17C^ڲÇpqqڶy.Zƃ||c" p:@eXq^ҺPB!B!B!B!.6ngh,LLf{M5`ff@As,y f&E?ͫRY4!ڡ5ZʯFW,i{D i-;<´2H׼Ž{~{P<͊8w{ӪNzmչZPi7Qnm<2X26v$ˊxQvOޕGGsZPobiy "2kF> #" G lSK9(՟blo` uc/1@fnl]ԝ.ڱr ,v=3&t-m3Vd|`QՐyg mBBqB$;}{b(*_KqWƖ|,7b07C A\j ^?Mҵ=-(ITJ50I?/).i;WȞ=T['hv)`~DSm.:)ϩ;_"0o~ ɉ ξgkgO۠PcHJ'4sZ% 9 XZ;ӖkraJ8P J2ewoh)X13s+lkNA700\[%0|4ʼn\E6t?!B!B!B!N`n}ϊm9UHyuR]ࡡ7M]GfDZyMэ qXѱOLؼx6P(t^{Ԇ/AL=9,+$#f+1b[:e$k[H|?51$eC:J+s{DsA_֩,Xgcw|UT@ Z#rOU#ߺ7ɿY{EźU?#Etr>y ܐPu̝ҧ\C[ 2\ÔOZy,X8d߮Xw0]Ov\{Nɚcp 1c۳z7C΢lTI$eRI ;?9[C LbAgW^]k3'$36rj:o1$&ģZ~Mx6+sf5HqAt.FTj. HYƫ <:v4۝\Yqsy,Z#9UVQYۛati]מ4e1k=w dy,߾CnwQ\gz2PVZ) @XVMU? ae&sT[_ɌeIְe]<{̛qiK^M9԰k<8 C2.yۍ =_4mPQ^Fh8:97%_g{W2d hzU{^`qncOח5<7t?!B!3nw>O=à θgSODK!`,n'<7' -!.{wֱB!.u\Q kfIb'!rgvD`\pN7i`;xcmNjYpgzQD'R ^" ie'9*̱vtU/blz\Y 9g(Fiz{㎐WmO|mgWSL8Ss(Vu£Uz4fWGrNeF | ,Q+ 6:24K<ۄѾcO?;K%€OИLu> Qgع6<@%2Kr~ ]|ߨި5H"/,rr(Prt?0w~k=WF y kpq?s}Fw#ڢdG}8r3EߡYKw kzi(6vA*D 񟓞RmC[@UU.2R'3hXEqN{w+WooIwEzpËsRcڦۧ:5U%gݲX;؟n;}Z.aB!B!B!Bc?'-| W +Vu犠uC$'!Mk"bFF47;I :9xËYώw8}tO@[:N"ׅsШ5Hŏ^nXAT<ѴqAV^^khiR/\|T P5@QA5F#f&ƀs}h_'6?R^+qAJt,pk17g2ſ0yB!B!B!B!B\PU۾2Cq5n!}2޹tr5\#Kg]Vp]oOR~f؛~<:u*rٵcyWcKXtiЀH=P[*^ q_CQGu~KPpmC5&׼R6x(TdƝO)hO`gMWC!B!B!B!B'Xsܯl}ހUvR:= 3Ϭ6E'S%b{۾\O +Xd{opCc:%?1y'lѰ7n/ckYs1S>e#xg8X{;^L^;{Hr)i(c_|+[1mJf - gYk~Xn@ee7,ݛJqor(Bn+O_O@}Tp3wn] g -oan=sX4:Y/ٳX!Sa7姮'Q:e.V`ޘi?J_S ay1o%l>[< i_`^UC/>vdVF+XgDZ?\"eU$t+X_sӞ֧ŰB!B!B!B!f Raoոzf gc sjP1xik2}:sEz٣V[O6y+sx%GsxǿݟKL/^_x 7~Wyp+"iƦ2kct9)HS+Ǝ̙>懫FQv1;6-1҆6i>J\Τ[ 472s0a[J kOHwkESͷsd6&EpM߶Cf sLXD%*}v`lɌc3ǤRn6j\h)ڝ`}U-{ya<_/CSmy%WumO5A3y"%9oKhcʍk[K :|ow)܎d47=NS!87h?&}tF/5`iAYZ4kWm$>m MxW偧kI_cBownFmtռ ..B!B!B!1憧^$\}Ӿf ZٙztZ_zqc/]L]e5 퓃J[~:FykMrDSjG`*#Wbٚ꧌›>øe)d?nj g +n Yۿgܸug\؏G?.Ko.G_ƾ1;mOYTɉKGC> -}'ƚt?3Cu}vD-|e;W0nx{^噏wR%ӿg#0U)$EjUgoÎ2P];^z6細 g©w*Hh1rs4t?-/ޙSI6 |u&Ǭq6qi9_^F=o1n_xtƿ$&B!B!B!;]o=7q řkq!Z%&?=ZsQۖ4I]2]L04jGN 6`T'z . zu;t17X:1lCeٻ(ʽ㿙l*C$HX@@QQyT{WTD޻GQ""RNB 3 Z @O^3s3Nϕ?}ςvmN)9َCt O*f;r vqԵOm ϛޗ t伻epk:o_Mݾ{?<~jb }bx\MILZX ͅfG rmeþ~fb_t7J+ ;^;#(G{CM3n?|0fZ{Ex+_&͢2hIoaͺe!' ?}7 ǰX$T6XF>s$%;.Zy>ZP@pﳸy1qa$^]|5ჹsrU<~ؖwyx04/X',OJ6hm{9[=? m08S=V/g'N>%OqS3+ &n,% ¹Fj9x`"i9L85]'o㮏WQՁF&j? }8dρJ#t0gEn,yɵ8_&B@"=(7)5o'ucS_&t Ixf soIgS f+EXQl#(LYlIL-qNښ|鿛wT>8 N: mJX7'~QUgaxªRl>ݙц!~w^q]eu@, -0s-zD:;Bm#kzˣw_e©'̝9g3ᵻ)w&i݀IdB;fZc+Ľ9 7{ӍVowg`WUQmC2|DhbeL IDAT/i().~ !Է7 WGۭUBapoI㭩*pڴ'u)Sir "Cf2J+lk 2քc@B ]VJ{ޜpyyySE%5TzMM5Bhg<7NqWoyϖ/x+<08x<]cŸm0 > ܶv]iYŵvV.+ lMp}W AmJ˰7}&30 ؾM96m܋ï '\&_?5[G9%ԖQR-APpX奔z<Ǽp55sjHXlzO{>3YoYor˩M_CMYL}f<_mi3nW!)$(""o-n$ܙS檉yzR z<@lM͂^VBnF7s{ζmNc;Oc_9mL"l `e5?4uc9"c~kߡA11 fzAr޵0Ԁ@eE9e U|g8|ny#λ)[8NjXخ`βb׏b䰞Dv6Zlzxov͓}̣FdGw?mo Ѭ"^N`XY\Oּy7=O3#k?OaM""""""""""""""Eٖ,NĬD_]ҍEXFc 9.@RR~a7+TMVRN,?doVC{-s3C0  d\rJl;D)W3`'a@~{ڀ|<,7&! +9vE|Ԏ}ϦVa>6Dx^J~~ BZ58掰$CS "؀b܂zhlϭr ,+(VGH :0(, r񰌡 /gXC^'>\~~l([q7gE8#5}NsƢM}[hA3.'@o* ܆`*#ςmhE lT3LL܍XTUV*^APkQWEFunU b_EDDDDDDDDDDDDDDw5z5^xjړ5DDDZ<&f3kYT';>wpoX‚Kb KX_~]g{P8fM:ߍ ӳ_VjV42n+2p8b]~]BQI#קx}~gMY!XJV-_O]#YY+Xkb4_C`hiRX>un7yI`HA˕p!W nix7l()|ؕlؘx t|aղ#]cX\Ŗ֫_UXb':DDDDDDDDDDDDDD pGbVYGóB"""MGn"g0Nr`ؕW:ʮeuI6kh,Ƞ`;G5UkG"qe2e<25p0]OòfI$cw+k&i; <&(laVI>[XdMYEVdדI1b2*=NVXn7y9Y,,A!8vKϡ]O>_;.^`QPifmlQ)cIu~vn^ mDž`0k/ufm0#eh)[S܀+>ݚqSPOrr=SvaU_v.s#e34dn=#M\dgP8gE2RoeLz?daavHxġMIQiShrAfYiSh}HtƝfu'L750ûj2~̙=l= frEg/Hǟgo{(.0 0wg+Hz1QQzS{asjLʒB w}϶UKEL G$_4*DGr1xczJg+q6+TOqYYgb⸳S]y5"\9~{Ϲgy%* O\j?.1/̤2pF'1,TfgC^ ]v E۔oYKZa=F$t iWy,f-Hn4Mo2Y 9%ԚӡsF[ǢHZ@iã~Ա ^j#.wFϚϪMT;[ѹ/CIyL 2JUBƚUhM2|5.||Nm!,`Lp}WKY< k6RRY'0, KF-J0cj kpnK;lU-SZt-anXlX0?Ve_m> ">ع{p-%wu}V.dMWa.N$bpd&Dnhm1ر,e l)' 1 ?&j)ܰIkٜWB#]0p&lW[""M#AۘpM>%poNHs5lM[Ǻ-G3C<VOz˦E\.D+0+i[)q]E 7%󾧙)O:#!o7[F^m;.},k 9\ݔb06>7y/s_!7]c/+Ws{+ɞ"Wv%YFƪʪ%s;fM:^0RY|=GQZEl\؆7GgF6y_ɻnϭGI9s㘒]{և YME\w~~1mapj.)___8 w9>X 8ʼpHJI|[oCfPF=x5}X!&\q&fUsM<~~|_=z =nm=/>DDPW>KD?=/}wNb6Ϧ;Gd1+%)^1ubțNeafXkp!t4&bߓay'Sʢ][{wz@TG8 Oz_2{vO^}SxY&Y/Oݱv:/g-ƽ+ Y4hM̓HQc >A_˒ul+6w[]0"?7'1;# rXm0}SceQi)WQ^FZcj_{jJt3|͋ ic^&[ 姲p+]v#7۝,l&N@ڴGqiF`yn ocj)9)I 'a.dWy]hg Yg.gݖjlܻnz^Kt࿯N令l6h#zйxe;j:|9"KkE/P*X%{NlʗȊ2 B'p\h|,JsXp7d]{.Y G ⇞^ uՐv.S]ArÖb^}&f7dJ䴑C|2~: y;{ n@ՑGx" َc< ª_[zFV=8C9!rJ~i&2]zM0j1AnseC>0`?r Yt!K6UR06s "f=w;Ѷ);` c|]ECCUp.Ys淂6q:}ZSOzi2>1oy>ɤOfNe99~q /w#1zjۮ'8%,gfo\cGUϟf7Y\MLK%:5.ܴ̚> [} D7XRdctbICo}N㧅̛x/=cg_|n4PYQ>4mt n{22t$? )ZOJz.E嵘>L|t0śSYCQ?AmE;kH[Jf~UtҙBl*sֱr\EvG|>^=@]1ikI˯JD¼t>(SH,ƁH]Ѧ _ݖdo׏~ՄWd4C]]-K͢:>A駹\֭^j `%߄4P[kTPA\b<ѭ[ywkב[BGt[Hܐ]C5$o.?tG f=(7>:ˆOl""""""o9Y\6D_(wst^3(ff soJ^@^HDDDH o,]Maa81/=Bv*^FIO>ETlIY6f8.J#gRKޚe@EХ;5&pUV X!&LbFU8ѝ_ûin7^|f GiQ5=i[/Rn#y8A?3pXI9'>{B;/۴;i>}p{]oDMX@b= {p5y_ڱs"Ma޵8oX.3j04WIg!ٛ? M 7&p%pC7Xp9{7|ƦY|C\q[(؝͖l z 9C`API9AF7  E Yr-wnah2OX[9[ } ` T-_̪ ь]Nr /{OÞq3g'}, ξ{=&͍w?cs-: Bwƙɚ2o27[a{̛sy3=_[MG9p-m+*+*8.@o Db$Ъu %Ņ$͛EEyY]Q^ƒy().U` 1]X"""""""""""""""`c %oHm,k+3Pk) E̙l1Cqlgn؉pU=HYu#MJYj4Cʼpc}z.Plu0`װ|LxMg7`$=[r m!xӯQ[6 j*v}ޔºJ ̜0y69[ɱ dcPKٸ%Z-mk:(@zl LqrX*2&ЂH[""bWa^xb/GAa!,][[GaQmsIaD0ȑt827>e6@XHF,v"m} UDuLNq"""""""""""""""r$3q54AOauޚ+-m ؀;'S6wЩAPP>vA5Vi 6k8jK)}T6  ҝEkd|C<] Y˙r~GDzyF47jth1hSi3\F斈H37 #5_@~~~x94MgC]}=WTb6n'pG" :Ʀ2 spB.׶|PSSMUE9y9a#081q]݂ ]N泺I{lç [=3lc]ќ>=t3~%XrdWη/]Mw0^2m7i߂/Gҿ`)U;t%:AmkGt9~ssAW>?Po_KsKDZ4mĵ (+%00n>9|1",$CIq![6SZ\H~n64MBˆhM`P!#yhBE\,:4JHX:Iw<{ۮ /prx`B܂}죛Bl &hL;qeUE9L]ޛFɊ< |M}31ȮMqjL,nR*3,=q-^*-! % 68斈Mh o9}pnsVzO?0q\18Pi)A!PvSROIQ!UP[3{ۏ/pxC yE~֫!S4i. y$""""㌣GW_Uxؤ/ݺ}5u1ME٪eS\z KS1 #aGӱ=Dma5rىQXKedZikY t_t%p히oEsˮf݆|jl8m]DT^DDDDDDDDDDo[~iI1]#"""" BO}0"f<}|n[x:e?~QpEx7? *XD{/ a#|RƮBf) \%}]mJˀd~r>:0iwabX[j|ܰ7KާS`8Swi~~ǃߙPEAB^OKq!23 ?[3xՍq,JXJZ~%n96 +$>N#Y1(BVV'`SK/&OU gg.0=z$vmUEdoZϺ"-4DoH98 gK]ܵ;F=zuG&{;ߜE4;!C8qTpvg/ذ#3kh_;fã<ij Nϵϧ'vs>5s7kЪϵv4o_/"cl2v,58BnN޽ pr$83Xp+'Λ/b@h#;f:M_C~ dhV1aߣcv~Ga3|,Uqնq9pqy<1F0Ç09ndɜWP i#bp춵斈qsXDDDDDDDDDam#HP8}.yG!L:RS ktI8c]W$ЭW<9ҵ}E6|[d\-ɮ-d㚵dRv:q] 0e-HޘEaOm;960_ۺykx7͠ 1v5yW:=*gk";gt=z[Ϫu[((ëu8fo 3'*,ߙH̪!5e=o`8; s-EikX!Rv"11|{/#3u-S^gDiN-9=`Ph9:HEPtFޥ?'ti~M. ?N Ajwp7a%_[y.c0$O6lEnЭ9kn~R ZDDDDDDDDDDDDDDDDDDDDDX Dy """""""""""""""""rD0#8{,a{<"""(-"""""""""""""""""4F0=K=ٍy """""""""""""""""""""\ DKh9b)-"""""""""""""""""""""G,EDDDDDDDDDDDDDDDDDDDD䈥@#""""""""""""""""""{q{7pKs(D<^uﮬoL+?Q7pͯ1wn24.,XNs_J&.|nk_[e}ŨK^fi6Iw2త,J2V$q`lwKX\׊#+k,)R/vۀq{&+e)WYD'cѰ羖ٔm^ZVQp(icGp;N֜W냜7n&?q dž})"D-"""""""""""""""""-ζꩭSM/SX\-,6<ڝc52CY\;v:GV>Xښ~q6:G~<u`RDT!ZDDDDDDDDDDDDDDDDD3Ve`[X5Yw*SoLJ>"wvpߦx82i]VLɂ*{je$ؿDJ]Dޔ_LJs :-axJtnDZZYr欭`KQ-9n{L^m}! @+o=88mx._~gS|W[5ܘ3b*Dcѩ{ߌaÙqk2_HiYwq{NYly*gpN,I DAhˆ~-nm1y|:O anDMY[_A]8-ZIr 窡!XDDDDDDDDDDDDDDDt=m {5 ~bZkj,2-I sjhB%,]Uy8mOBc8*> FJ2XQc6)L]Elʯ~`:x WW@9,HΤޛv]9z$鬘LJmjմpS}a:)[ʱ:25OͦnDzx}V.dMWa.N$`lֱh2RPZEhu,c`%c*[WeTmlRV"ovNGs{\KeOZʀo컯-`cj]3[ܹKYj3Bw}_,_,K ЅGEH߽}py? ?c߯)Wyϩ?CNFϾoz <*XpӲ),wԖG3wPѪbEXJPDt~ЬlEIf]Mza mw0C{G೯A,e l)' 1 ?h]u+?0+*X+}-lL~Z^a뇗I_QmJ^5j^AhfZUÓs0Átl+n7njjjjR̔rpml"""""""""""""""OY=aҥL{VXHN=?ӠUgrbo=cn`xŪyp;IScyif7c=6^׌*h<Ű1wu2g=7dž#LٰܩPՓ;>+.'k{LxSfo}`ړw j4@g)Lzi^=qcF7_V6?7I# .swqAW?qFw>?|>IZ#N>gwChyz#_%Sj5hxF죗#`ϑYƽ?jO\=v,ꡊo0YW>^Q\ٻgHKjگ App0.T^^NZKQQ?-/#m?x 6{>/LötҪU>>>NӁùN۶k˙;N g԰0iBDDDDDDDDDDDDDDD)W}yj6ų0r_h]Ҩ$0n#!:YLm 9K>7S擜HDʝ˔GbqbhBdZ g1+iC3/丮i,oz/"bG8G\?A𴢕˴) u}7QO"|6$%+|(*s:B.Y G ⇞^ uՐv.S]ArÖb^}&<0se?3kCFxoF m\5 !ڸ5ro<>뜙Ifg2IH!HHPjwmnUoիVVm,eH ! I>Yg&#,!|<9=~ YT,V*`z D^Œ9 @t/wQe}DL$''joW;[y`vmR]5k/BU㉍vUwEQX,X\.]~F/O5iZ !B!B!B!ΧrKz}z'& 7mGkx*DsKs->y|re??ߙ2.DlAbtV}ip>k~O>;'~=7|2j67NOѹ+{:VrORju;rڇpצդ:94M> ~jz~#eKk`y {QLJ,9^'<7&7Liǿ}n YkNHO?ʯ9Ѯ3gW}󞗾GW7hvń{q!NRI˿/,k\ySwvӴ<}z_5:ϊGz}K&~?1q~eAԜ-WnZg/mMO\y=Xдʿ-ݙ7+3˘fퟙǎ|gJ/ܯOĘk9w>ɬBkJ$obtDVAؘ[*d"66@PBym /`4`K;0 Ŗj`4.><~-bB!B!B!B!{'kغ +5dqsMZ[ Ԭ7C$0@!ъl Lc*i7 Ct}{0O-;+TtYB1AkV]Gz+nOGMX̽˓Mw Qy;_1 q k?(QќG˖hj2k}O@!|fa&@9GFÖyrboah}?Mk"x04t Lx?0{̉R@kСJ6SYsBP8NƆ [)<$Ç`çVrXÉ-;i蛢 g XWnbi|qg.4Ȍ'/\5f[Q HCj*:j*޼"9Lm>Uf4ݧ w=Ȧ0RIf9X"Bmd$o=LJ2Sfa!B;-hȏDqn740L`Ӄ ɫX5^}gU5'dE"Όܽ0dt:*뚇}Bg IDATtTL z^(Br9&/[ҏ5m=6"Ǯn}VB_kdT5w񨪊՚Ov1yL4[mqB!B!B!B=k#/aOdy[' eprjjS T >VPFme5^W8 C:Y$뜙)0l=I*KdĊ{wgT4V yIӅ/?ւ(XJUU)[x[ k /2SV9NW!p9we¤wSqd?; &g+$S!B!B!B!3\&o/w>.R5y9-MsEHJ]% k  ::qj7j%>fh֫IVn ZN b#ň[x7SbZ>%]4h`Y}3nOhԫ989:c^/HĮNZ;zBCIc3vڜ==k{BK A:|bLJZ Qw5P`0tH{g3OkR}& 1H71io@t_ ?Q2)x<+aaΞuL !^ Et4r[zߝn{O>*(Q$'ۈ6*Me;.]#nܢGwPg8P$d`نxS Daw-5[gCK(7{8!.|=2&Zq]ߎ6sd&&.Ԍl&{;i-M4t+&Ztl>ݬPT#?)lXF;b&)- KvB!B!B!B!T&ݽiŇui*7rW!(5*ԞP`V  .Fe.KW9p>L)Fl@AjcѻҴj\>c#70 ~t2!ahk5 d o?xf'j9;_W'!.>)޿v&MQxoʇsƺ{9/ Ϫ!T}"6J 54.{-<\@X@n:K'P10fx8?@xtclh@a[?ݯXEQ䢫W:ɶ^џ?;'Fh@;"=.0#+o>h(o枉Ot[J]( xąv(wHlО2.B Qz>-Nz;JԶm#6&bx6 `2e%LYc0 {q;i)li+c(MٶxVs%| u;!B!B!B!o|u7=͎! f jR2 k4$fLOZk v2B IdJ!בg+>¬Qt 4{/&۰*ЮH޳DlV# ~0OdA->0v| u;єh}|͙!r.A:TA3R!y&%`ܷ$ah!kJ2*Lܟ0`YQDDCC;Aʷo[G͸XIoC<0%|=Aof? ~ q[lRLnӲ$-!DX AK _Ϸޔ̪|  AQH7*·ޔc2 Ҙq=}S5k-ozσqe,Kxv݁eەX&-lbmA]ћobfb@k/Ct߁$B!B!B! 5'J{ ! `cEE2•SORԨr'BbN5wrTA0>CIvq6N2-Zٽ0N]!zFgORűCg UvX(>w^UΈILϏBA\Zs-:c1#=tD=lMRqJ¡T}f@%tYss TldC;]gAjL9:ӧ09l ~|0>SY_D:-Ĩ d$FUN2c,)8tх(5>>5S, 5S,|n}⠡hٌ(ė]DIˌgnz?fM^l5$i6Y%&lMeB 㭫$B!B!B!B ɫ>ŏO~[oaRBe84m~vqO/qί&rYM9^|\c]12qRr"R'qT[[=J,YIZYqJ* [oEGJ̈Vн'x#tܲHB\|, uJ27E /M=1EzPSpOp9.Y^jggy=-| C swEbsXu (C3( J[I/G׈& [O`4=h>Y21th.|Nk9sNj(:SʅzZC]BQGٹ;~g.PHڋ>U8]ZI}wz*Οĉ-*\jrpiNZZZhn,47rObhN--4;훎NsρN[V斫:C.x;i@"8ũ j 4toWXW\=Nheqf 1QsA܀(Btt4R>IkqKvX]S;~E9[^Ksb?T6 3ZS\*;ɢ;Y̙Z]O'g/-ON{ -t pW3ۜ]oK] ]VW38v3h3Ѕ2BsKWn,'ةi{B!B!B!BXYvw_9L_\v.:u7pէ/q)"aKYySA;QHG|hF ~~yoK)={܈@jTT:9{ 4WiA ^gO~>:#3fdݺuܽnB&C10NὟH|e5A7o0#UU= 3wD)8~ )Y _Ίi;"l=_,Ə)o:Ͳ766Gŗ>.LJ}C:F)RuSw( qWHd{ގ ef򩤆˙Z90'.qWL$f`i sc2kb&=cvCt4֬N } z8}?Q ^=m V[b֐ƞ yϲq=h:֝.z[ Rk?؂%␶{1׿n:}]0!퉁l[K4o~rsa:d# lMԶ_fs4e.0c BL~ǯwrdqʚYZ6i+L"9ܕ2^\#&c:mIK"#8Q֧}@5:i.Oz3:&u!Xϱ{b򚷱b\qu\yX z\!>4trxj^FNl‰ާ`Ńc96Z4':W+1>1;3ߗ`]-h㘺^8h}ֹ11ū8[B!B!B!B*O~)M/3uTb}4]8ZA]%<$Gƙo;{8y̟dEx)n ϳ6:OWSWqsd ՀJʍ,vqO}iN׿Ώ>vWIcHpwPs*{7AY?3X >= CއyO!gjxрJK=Мq"}q?U/yW=i9ǙiHYM;Ma֎æwwqY>̝?LS8oǟ㙗Goe'ircSoyBZ५U4:Qʧn?eգ-|E؏{/:c1xک8˝K}Nj3,UMl0UϹbQ睤?@٭l%'?IVt-U9un ̓y'`--+ݒ\L#KI5I-w#NCI0 𰯬 }ʉ0>{ )qQ(]mM^np֬{=nbsYQ_ͥnOh-lV?u\i X A\Lg 9l{.}OmG1>T lRt|ݝ4REbȡNW1^{_!.{c 1ktO wsKƤO'xYSD*^e09@Ws%54&K5bPvv Btrǧ`pPqɎ^I~B+̅QRs30𻰶Ђ枲((-GmF }5kMt}469Zldg٨8hmم [}X1~n.|+hMabGWS5ymXRFzwpGWL$$̺**.N6NP̩%DeD@yMcL{-56!zh]4}rN T 8Zq\e{h8+2L&gHqQy Og%w[Hwc!B!B!B!Ŀh=~{~yR#g6r<~G? ϞCl=%X._"^dW;MIaXމM_=şv`)fMqM gaU<4-?O;)~+m±f.”eXq-Xf֣\j*¨j2_?Oy[%'WB4EKWr #Ed=8>W*쨺Ҽ9?3ᚈ9,9oWd&JR׫nZ3})V¾E8f~'<_]\:uKw&6s+) zY>o׿4+g{eH̦~/w^c}+3V`VQֵRy {Z3{#x0ni2!n-Xr&?Z @ffF^ʼ?~ۺբ+X21tu_g; u}}/):%&.cݼq:oWpC_?lH$Z]=k L /[}JgI I6yiձ;9QcDZpR-=LwlJj\>W^-f.|Q va?ơH }u@Ng5̲*Wtvֺэi,n0A+D(~ȋl)u/mw{Po~^UK78yu:Ɠly?,M;Gzsa^U->0[SHW&GG@ @ss Q#8v?܈ژ&fxq5q??SoPPMXQqԻdQ +M\ÆYBl_I^T2z3 ]oG A+g;єrg^!~?vn eFkču(~zЇN X^uQBt׹ogRv_"`ϪwdbtCNwRn2ͽ)n 9`bY+/Q0:m%dbƝ{j(r?[u˂B!Bٛ|ݖ7?=tz"F UHĻV{3&O}וP0cmB!"w؈+2|WRRB@5IV4Yp fNfFAf|ѝHnEja’؜\r3Cd'"GGM u1HNbbn6Q{",r.qUcHä i{FΟ9OMl%+̸ ߁"3:*J.TA3If0>7qQCq֗QRHӇjN"}dXe۵|Wp s! ks 3m}kL`\.tjo % νH.*]¥҅|aQ3xȎҖ<:ͅS\5 F 5Rv0\YK%ЄP'3o59usQSmgazy(DtLeG%>w!ya_|-BC2aKoCM]¼GۅR.O[JveSx ĎgLɈ}ť^VJOC 3ξ! fs|^-SًNO ynƴ! ;sh`';6bB!B!B!BDZfd­:JlF2FRRcɟNm9zIX=="d#kz5f P8zEf Sr8w,`A۷΢H0e#ȷM!": IDATcT&Kfd F}:5޷8rp=n^l֭b!p ULMfD[ȁU))wj8\D gB\vǚh6Ц1>]Em 6&% vq.Wt0$0iML< hC^n)%cTxqӦcSjA@!9w2!WJɌ9m.褮-?= eb$~lbfl8Ժ;:~f_#A@ڤ\B(&'b)a&u4uPbE+ļm֮:o4P{M0]  j1N]Uwp 0M&/cLohk{Zb[ N !%`K1y9xaIB!B!B!B!B6u~c xtP|J4'Ьz²Ni$sa'j DHz- @tb.?\j/˔jQVcFN:7uNo楓ms57kɵ4ȺlmI9$Ů\Kt :GmZB!B!B!B!B!O@/Z\nrzX,.^ ʬE40$SPHpB| 1 t븜.tGTRj H]gwo'|ch!.u=EƊrz%f x4W*pOL䣽ci~,/~ ֶuÚ)ëC sҼa=,fU@Ֆ3/ql>{U>SvɅ٫XbxtBdj͖yw̃0+;E@'zn`vѭCOEehWv55BQ^CNIš:&hhd+wjk!B!B!B!B!qbbWE-w|33"MMaB|Ms0~i șxq2rNVnn܌IҜ8`^e.kv_NQNiPIuC1]5>翵N!}aDEz2CΔ(@QYʥOCI-&5ܷC|ʢI躎3pNv(uW;y]Y<)Ѿə1' o\i0u/3S{abFkB]+t'k ;u1.FCuI]RZڀP1:6qTRz7$nih"T<^Hi]b2w: ms.CdQq!B!B!B!B!onfjѾ/vu84ژ6g ϱci\}Ò:ގZ]l )%!*ǫGh4U`&[rf1f P߀T-ڋ!X1)vv]u:Km)9yo Ga\P_|Q{G. 8V&cR@sTSR݁7duE3- {NpCՇd{(LgJ%V{ E?{W nANPir}WγAӯxx52(:YWD;.V%Zz%p|t17, W];T6iy$;.wm{9ZYXޘ4L]jq:)?mAP;e57n?N:\;*LϹstfΥH4;[h9iNՅk'/g:(UUQP_[c;CLVoc:Oŋو jmˇBm*+<Էdr,wEllԶx㦎vX>%œ?fd\]s+U'/QMcL.c?Öka#Lck7Zl63;9SecLVjffՇx<)Ī^:iv- |JQH,Xkr`/.YIOMĬ{hknݣ&-fY^\ЯƩ@33a*fFGrL&N 4lF:[r;IQ=tޒMAi.T(3y$+.j, ͠}g1MZ%;4ڝuP[> F^!B!B!B!ĭ]7xdrc_^]8GQilR'm[&*hrӍ`wŬ+aΞCitik @Ɩa{:|i_hh  A]v޸39^JM:'WK5{")}o_'eN]1GRpt9PcJ=UϳbʧS C9UMKW09$jg¶l$u6FcQvO;uU=/bȘ3M;Ϥewr#g/anz8`1q|LI< $2?0s͒uQՋ^>f\NJf/ܥ&ZA4@մ^!nQ鳸{cENRळ5Z18n $'!Wi!B!B!B!9WTD9uXKR~x2:B> sI.t~{3/7Qv4%ܙXol_;pEuX2 (̴ȓo #X"4AtY_s3ahz_nΚنÉD1KL&%/ m]siVI`=eƀDc'Fk _C1Fa'9)1)6'v{]n/~@tLYZp/_X6ۺp X⭤a-QϞϽca-$Ұt0yb38fہqX7n:V]x Qxdbx"6FQ~F4qw*?Bk[6::ߢ4MMTDd S6no&w;DZ7OvJ'b`M!%.26^M–'͡NgⰦH%o{KBCƴem9q4h VɖAh%{W8H*iyC!B!B!B!"EO/kZœ;)z)FF,ә/F&#`"ζl0nOi'L=jdˡRK!3.%B sB*cRG$GSC`KaH`&)=w&0'ugu*">FyOv֎՚P0t ى|t-GbŖM`:fHu/5LFz9 #1 ƏI1JF)!z8MOH'!RHT, (HEcQ**(JZz!ݝy^`$PΞ9s#B!LbUhݾz"+\Q!B8G/xZ7XWysO7ҡ켃$X[2BqUrTqYbcӠR9] q5Qz_#LL(#+;OƺY&0tfLE B!B!B!B Ѵ\-^A-/@Q!nu͓)))[ՓdAᱨQYOl\ /PRZBQasG;W狝MVB!B!BI?&B!Hݻu{,а)mvS/ uX3TdŰqNQnt?=eS||- !tSkFqiLxSwz);ױnOi5XM=\H*s9c+'UX`ClAFI>6<@|z>ŕ:6.x4!(mBpF*Ɏ;B}Z!ǶcSt*#֫+a3ی̚mH)0cՌv{֑߱ VIq!E nO1$=&.U|XC"ocD2 iK:yTx@ H:>ӛ(>4BqhB8BtbGV4:/(ʚHȭvQhyRNfnv%&{4 oOAU^!H:ź AiPuws(5rQC'Ϫ'Y<0۷HZ&xвthzVPRQe#\t*2 buL4vo̞cW{ Z:3yٻ}8WL4jBXtsiuL//X]g߱ dYp'aLqN/E"8*iIL*D7آ ٱY-Jl=iu]TYu~n/FwlH=osX\U,eshyyyy[(d"//]yW#2Rۨx1v,BJJJqqq:Nyy9EEŘfF32B!B!B!Bem񓙷3~D?i^z mڠ=LdgH8 vMn)?WVVbg X%hf#x~q_cx?~|s_R~${g ? 0E2s.ƟAsR.$Mÿ)ѬKQq˯3n>- }vObW[9^y!CJtn^Oˬ%55#=0aôs|?ǿIA;'UhMV0c'/boƽwtFRX[|<k_}jsA_,&j8>g3dܱ3uƮ{3 ¶b>=խ'eSyX⫟FжXcJǛ ry+(;cMǧ1sp9l;7$Tu я^, |_/d"rsprrflRt]_ ѻw$ĵOQ^paڒL*&//EQш[M4 Lyyμڿ!}k[&!B!B!B!B\|q );-zD8o_ ^LiKyZ f "M)zn#An:XZYNT#kQY#?xZNAؔsJv뱌o<=p SW|b*Q;DX#W쨠0;wuo%U|(-A7ѼG/ ɀ$㉇ٳcGK08leƈiH[ο{ 1,?f_ |fR aؗ%mJdd|W;}$Η`"~XfpkO qF/HbXE㆒^34(6DyIuk Տo&-|ZVË_n!%[NK_[rfnc#1}89YNZf`YmpW ۶U٤oQ3~|whBz6bh!Ax7V+!3~VmX&z ˜<ײ_g}TzEЫsM p=9>zv* bJЍnMցxVpF-GOx65O>{ f+Ws \{7(+6ll8?:џWk9ѮO|r)u>:h9l&C i<PCҁͬxJ>yO, IDATeX )_ Kv|@/X}ܑ! .x`ZMu4r;Qp,OcHeי3p :m,嬊%q42oH(i ZUŜ9P\\RhPxnFJBZs_;|ҟGJj].P^^NyJ83]C꡷B!B!B!B!rUi,t>c;6O}qOm'orO頯z9>)`ӷ9(-.&vC` gӹ&S1 jam. cVBR|nHbVLf,OWe}/yɹ+ʜ()Of0㳏'F85_[oŽNsZv}o-6M*o(+g̒$}8߻ǝ UphŃ[Qj,K`1qר1rљs I[6Yz< zMf_imP^7宩 yjO?w_[>ՍNJ#Mo7#qntp+̋9ĂOڜֲټfMWpvnZc{XSyaThR%= ?eǑE5v44co8gr _ǫ>4_kqj1g`Y l*۸} |7o_3Bӟ|95c;Ji;p N-O 1O\b#NKU^ԛ:o/f r'SFB-kt0/0u[g|pcFGmqSpSK#vrGmBs>/ah!B!B!jWz=;qNƑY@ow~ / cܽB!Y{ @=2j@۰ximf-:k/FҿJ[[x}D<.$zsc;4EK.vd\͒^BZZ  &JTu06{7CՉ`?jS}+gݜPNˡyJ@q{1SwѦtzv_/"lW C`ƗG3WE+$qocZ% }M>Uǜ6UW@`L04N'na޳߯ҴKoahգ3Ͻt'Nٮl̫L,GV䠩8zYahGy멶c&ql.vWDI[CtJD\Z>ʘG0&]OEL堺5|%C 8^( 1sF c*ah/J]l;Vr\+!ˆ7^NorwE!B!B!u<6SvF@K6mxG.75Ƴg^LWB!rfk`[aom#n%sQ:ilq nzЭۭp[/O='8EdXqR5$w7{ڶmrlW͇X2oj}jINV )N6oa!Hn)J[QP\䔤AúY>`B4H;08oW~)XSN:bì~FS6lt 9 n5+YdTpZ6Rٚh&-5 `ZF!ɔȑD xZ2i~s"uk9fQ{qOOw0MGQжIv-b*-pScI4tC/+$+#tnJ'-_yh!B\-42(@iFBf*-pQW)ħX#͚[ k`LX3K @j8zeZՖ7wosl q]G:հߓ["6(t ӹC;ڷ⒳48PO73N@^NiEu,xKb,KuPQ3nulk34dL36! EI- !,9*jck@qY4Jy]5;cK$sⷍfPPX͵8ܼI52Jek ]"$*R3L>60$Md_Ͽak13(08v݌I\H~VIU_?%yo~*N'*B+ l\MM}.v@NYi:vՄBB!B!B!B\b6͙v" :qԇH/_Iɺ5YC*c !b;n7\+J(6适K땝P6Ύjƪr}kEe ⋓غd[H&~y&"ɓymݕMvjYw(u==]תrbk[q*lT[=pbRuϗz璧ZOaG>D3D1ӟyhV{D~y61 f,*5TΗzeD5FKf󏖦|T=A|߮3z5ıVbwR1@ڏa7 Y0;iYc)ȋuUcgv;q\&u< D !B!B!Bq$#BŎ6Qcm|s81B0j*i'&Xքp*r2œU  Lo̮ckx4 s^D,eQ>4<ʡ}lsB* NxҮs[{TS:̔K6x5 Qw-wR t> / !ʴ,*6d&W9-ջ8.Z' m@3 xPտçn"5{3^ݍoO><ܪzE6[_kL!|զj8gZ9u_ VuC _k>)hhuJˮ?+B!B!B!i+L&tk\/^B:y*XkMsF0q &llUڴD~ž;`/X^Y ]LddOb]Չ秼A*W$L*_#DgѲW3m,Z| H-'j# }xi(naυBkWH2P%}Y MIMxZ۳x)۶$JRKΖ+)Rgſ=w<׊`WqEtW.΋=nع+}prW/3 哛c5jpB݇ pQ9_TDwdpYC|FQXZ" cxXڱ؆04á:ha,7%!.2T 'FAHJ5cY떸ZJ>@}d/9)0W7K9z4 ڴk3Q!B!B!BQ-Q bK9t*~W?eSyQϐm t?OwZI/e^t173I w:zYw>E0;p}pF}c_o TFL_AwGO =Cp3@YJ{/f|BkMd{gkɱre5:C?2gymh96]iu"j1cP\|uQ̕vdG/5߬6$%m 4VĊojϡ#oBE#_M(N.8+^@nAђ'o*2W4Uy ѳEVVU=r在}cp=u*o^o%3.'.:*`grU-ZY/Տ/0fnMsfI]5b4qyH Z!B!B!BkENΨEcc#oOvY}WMOCo>c竗V̤Y]f=x?~7̐Ǟd9|=^)`-t"Bw"qP4rVyɯrۡ`w3Up5#PlOƸE[I(4& w!%'h[)k?ÄMVDm/3 9ae34P݈ ZG#g<>xy5-[EqH6v(z9۾wflH5g~3Pыw㘷3s3wt߿?Y[ Mb9?l!b}[,zc.c>Bv V-#a[`|G U^ՋW@%E />xEVb+ޜ/4FE#o,ɣbn Mi%p/(O^ۣ>`Sqmֽk@[ hksJ)ɯeozC_&.aB!B!B!ʤzoh2*21πP"t W_m%Yu?HK3wd9ܽt$I3S~hF=_o#G_ ZϾ=FѴK ۶jzsA |gˀr%؜v!?@cyyLِ͖p6tá,{H(v#IOjڼ1ǦI7Y/taMJ}D쟗0ރaaylS=/>kzi~3i(9Vrh/{1}(Ovu㩹N|Q}=,ܽL|dߵiID't3<|k^ߨ3qZ/{0ٍ|߂_\m5 H:zR,qS3GO ,7#[0/'F@-wg?q/?@K[Suo*%{ʸ{CǸo.Ntr4Gb-<@ge|ƋL+so2@Og br9|,J Cyi=.";5L F?zCMND=-}m|^v@CG x4- k@%'~?195e%:&><:~wnRׁJB!B!B!B^Q\/buN.¬5 Y7̊cKǎ7W6HdX>r ́2}X˦T Nssjz~:@e?z=7ZT";-x:X=D!Ħ)N'Sy}d'bE.@=12tXU^9/. ĦSat?78zG'-xкWOږn#:5[evg;T؅ۮO`8r5PF1x(\科P=;r]H-W|qljؓ8 (WZ =88ZQpm4sD`| Iؐ&\'^yVtOq1Kšl +*1`4YMhc=70gtJVli^^; B؞?lGgi45~/ʫweO /~_6M9[ʖLmգy޽;oYGgoR6'=S(j1a{&L^b7M,НFcࢎ]5QdcQpVd℧ Y5Ok|5M;PZR2E!B!BqH?^>'>|?VO=\ Gbjxs3h^}@/AfҎq b޳G(t@AoѿJxشc&w^B:y*XKk2q &llU-0%BР,j1轢os/rz?1ٵ*XK Ŋ'=5IZL;xW5O'16 eIY;7o~ j?죳kZhYCY4+0$⿪.+Tw " gM ֔i,ߦ|[yi(M%15\ ] iNy"ғI%' Of4J}v1밁67=_*;pcXhъvZU+HQ2 Wo7 "˥}% -d=,ʌ hIVV%y>Aņ>M~%IK'Ԃw&P7"Fs8-r3 ˆ iH}w+8^Nh$P#n~eZ&fwŹ`ck[r5 t{myƄNƆr!e +NdW\U?!ZftkJnMq:E["C5 a6{< ی.4 QХWӲw=ނݏE[wEq9Pu!OځB{Ƕ7kKf?HDgpU[]t\Px快5M D !B!B!BܴM!7XmѦ\E:bߎn)aٯ]>zՄIUhiUTwڸ_ZiB!cYVƍmbw+1dj v-ng@Ĥ.=;8`ÃVBz%kI>B!B!B!(jmҕhYdO0XUOVұTWX+j#+t~M+dׯ1r"3l9f[<Q:q}%Bq$.12կZZG=l;N"p{{msqknTRB\dM:ɹ̑) IDATB!B!B!Bc9vVlmOUG'@/ @vsG,O@m@!Ә9-n8^ܳ Zڢ}'=!B\zgE~b~-VO{uzs?`H k`kkA!Țvu? !B!B!Bq-mD ?{}U{+C U~+ر'GϪ7p޽!řVNC 4g~|`DWFTN8o@Qܯ|fP*G !c!|c&&.R*,F<|iAhC=/zFҫ̅ⲓ|!B!B!B!qzrzaL_ő[qvg3˘A}x܎(z;|’Ċ* mgh EJ}G."BCcMdػkI79(Z.kfa?RNE!||B!Bi$zpϝG$ -w"}ɍ.BgHh!B!B!B!tsW.ʅkクc9aHBv)PD=ػ  GCd &r0yT;NlG7mFXK) 06 cIe2?K`XE 4t6b.'#))k >wPB!B!Ő@B!B!B!8Cye{V¶GI/)"=.)F\r1xX)If1讍Ca]l6:2$0S%OS;P0jl}_cy ޜP 6tM}bf/B!B!(@7Ғ /B!B!BTvFy_iTO=}}Hzꉸo? W3 @z8-f.Zn_ ke$E~Q_`0A>60,v4 ycGKˡؤb䊷_A8Y !WچSK!m.9 BB!B!B!-axվ 7BU28/bBqЈ^t7Fŧ1rJ ~y] Yn-e'cNþ/3fo u޵@B!B!B!B!%Pf%?{c{IQzRP+R~ ٵB{pU<Ӣ(F+"dz;.Mq#MWBXeĒZШ~W̻v]תg8% DLAnV+=4NBb '*1*;qu 'B!B!B!BkC^20{?}Fv}1+;+qĵa><+~jҪ@%%P!3QVVJYj)i4o_@SEB\\S(*CӬ_eQ 4p?nc!B!B!B!B!04@qW~!M!|=X%z@=MnV&4?Qպ]U4MdRHIH E QK%$ /`/>8:9ckgTVSZRLNV9Yf'Bptr#B!B!B!B!Qp Z(.MhrwC\: D%%m:.?849% 5ޝfeOK_!U $f!x4B5X`G'\=i$BvF:Gc)a^Mؿi=B!B!B!B!.7(91wqbDuj [5r첇Zi:۶78|L6Mp*zIZf} @Ds^ٲ(EThF=h8VD9s ^xi߶}GS.qpo -;'F$ĤTxx H:>(>4Ǝ:\ʮdc1E"[GjS8~4rp !4ݛ6X:ȀTdHF9/A^Ym$r$f@Qe#\t*2PTZ@tSkFqiLxSwZ;69:" D lc) bhhevKűfZA nhBDvfn%9[@D@f.UNY>o iޱ=b_3PyJSعn#2)ѝ DhXeaȖ l>HN tu= M!bdfc$gSbRwkHt[3/:\;Nʢ€gc]G|KI޹u{,7HQt 8{])H!)_Cq%4cnM 6Muqfxq9kdfQPf_P :wnKKݯ'>OTfݲ&cN&fRPjBu˗pDi+|/: D(< }6nD-IKJ˻!fBr2304 Ͽi |GZrGbII8FyI Bë V !B!B!B!bCGA~ڡ*bKZ;VrPCڠڏ= ֒9z^XL+ɀZ.aCބӭY3;U ˘EvŞþfޠfude{3-gP 4o ߍ $W|ѴYC0OhBպW 0E27ƟAsRߴ~_+xkf7rr6q- "%r?(Ny?7| t`cx>~y;nm30^dܱ3hތ}ƇOcɅgւ˦=W?m!*1XGMmΌIUdel:>5@a1'Y&W~0~yx9ua~:)?;ǾҸS jÓӦlgA=95 ~˄7]^OfׅT'_5NHKjl7_#w)cst?9/v䜱)~${NxG JL]nsn.c\A_<'_)mqyTZW)C3X]Zj疍uKcǼ)LrVW$T~|d<=/I^\: Dg'M5 n4 "95>q,bwSTX#TU&A{zk+Yǩ(#<B!B!B!BC ۖ=XwnT%tHP`Ŕ{"ҰUnM`Ͳ5<)ϦR4CBgy/YCq K򡁭Fya&Iٶ#JZ񲤱ts<ؤ{v jy.)a^Rs1M Qwޅwv~ݚEۮIu3~׾!ON5rŎ S9zp'[Qb5x!tʣ?ůrL]:SzeUZ̽w%p`jkxOFTņ>r;ҴS_:yc_aCWײkH+iۉhcy;W`GZ.δ1S 9ocG7-gUl.˦1&0yCBi&_2Ļ䡐wx!?& xsOeUi:֍1egH} j÷mѬC#nVBf>֭±M9sye-֬^y~אګ-&Ǭ㏕>LѧӸ;zT/k -{C OlJSٹz%;X7Gw*~}n=l,ƒYչnbɺ|4r Smq%\m h((;֮a{J?|s<ȥOi$#>NnW#RʴmL\bu.Ͽ1?KeW1AdTrrv}DFA~.Gb oYg !B!B!B!dcnfͬ?VI:5R„%T3IwQǶY9|OT њ+ X-/|1OY]HSZ/v4~ĔpŃhՊvDnE媱,ݚ]pݿ.PCitnՔsdQH b x(#tZwQ]w_Nь4*3uTQ{5l\cΦ8eSo7dMqigwɦqic\0@HB>f$MCFBI@y>aϽ{=wJ֭غw8W}/|yݾGq>8/qCüw~|vŷO7tҷP|e\8 ~>z'{?VMZP}UWü=ωԣ:O?íϕ·GɩmG3t.e$/O12>/)~ċ<𽷒~U:@oڟb&-_> OO]o%?;-|l3ϥ㋿2\<G?9aSrPvR{6FdƈuzwlfWb.Më+X>5n)Jq>?|\|*&Lt4< 5{/ad> Λ٤qjXkin\e Cg2)_5WW;-͍އB!B!B!B!nbT_, :EŸ654\-u0,cM( K:ELZdZ˿_^]|S#C- r4^Z[=h(,ZMy04)y&Gs9|QבʔP||zX@IX63GCtzߝPA`Մ5|_nXHνq{ Z-ɼ닟P.ZbAÜ8tI-~ő֨ahձ}~U6MtjW@VCNZ_,booy(S5{?\zQy߯%^Hs;EVU$:cd 1dS֥Wx5룄0$ͽW+!'i]%kE CH*( xPnN]zϏe: f-J%7Usc–-l>x+'w1/\6%aL&3s.`0r4~uѺ9%^2{\8e^2N'8B!B!B!B!M"||:40s e;Sz窠Sq,?hOĠ@n^910-Ύn T;uwʰוbŞdAAk6LřV0/{r&Zazj(ܿ!ez ش$J]YTS XGJgRhR@拉}((.u( SS!CI^C9+J]%tTtp&j.4>udױ:| V6Rp[XhV@kcϞ5Քܳ,%(00ntmd}Ԏh[k}ѕXߵԫcKS`O}]ؓЃTTw( MAKJ6hoWy}'On_Ŝ@#vKw73 uglRwM uϿt^;F^sd!֖DJFE%d]3AO< HA[N3|gj9Ո)&DG YE;Nկ逛vw]uvB!B!B!B!htҭbs|3m[(FGk''8:**a/ydulX% 3 Ik/x4P̥,cN36'}s5=%ֳvb/(8-vλBjLnl!tJ53ن*B+fEMԂ1 щ@E%-'.o!+jG!.>n*_^ f^?tN~x]Mn4\OSH59{sTk47˶1d0c[<6e!lϿm-T=\ խ5^±{&Ento#;[vWРvmpP1U1ic>i^WZ{nu-,`fKF"gC4Ol^턷qb%3;olS=n<^oL׈D"QþzRsYwt1GD" zi?S˱e۰)H!G:*ٲAC.ߵ|w;!B!B!B!KtzhwWc@ xCYM/-njw=Kgy=EzI*vJl21<`[IY?0p}}# 3f}3+ii8ۍ%Q/d4a5-{Q_:((V>ը`6GY ̦(/l56wA" 29I\Ut]g]xu4:u$lî"4lA(11GZ=7Qܻ6_PߺKU:u;Y?@ܧPI5xk F @g .?htp53x$J+&D΄xi;{RTu~کJ~a)'*ho9sm ڙsZJ9B>7'vsr.ۙpW(\u'a0&Mݏ#!|.j9%:{<~&7uB!B!B!BSwo /V0 ' 'lc۞C:RIU}7zkBU[5Z̈ce{ 服|S%$/xo'wc1p-9vWpG[V~~l~a2?NVtc6BLH~O/@JZƴL@6a0h֟,$%"IrKN+@p'z([|=g 69uSψ9rIzn l9MY,B!B!B!b(84w,xe t(h|+$MJ>H9Y8:˖o +k>k/ӁJ#@mR`'i^ /U}\ɶ'MkYH@ȅ"-۹aӘ*WTEa찫}bD}E:jƽ|fE׃;2cTMcWW\t"n'JkqSwnfWj6%9y+nG IDAT޹#fWMatC!QJ.knݣXJ܌ޅ^@v|I~j?㛿Yoye\$==<@W[`3#d땂:Aw+M-./A5L2QӃ}芅Dg<1x-L&O Mp^s ):HNIH**!Ha$|Ђ}twxUR32H <4tQqfve\hhk @-]TLXeeg'xrkk# ax Z#XIʈM@`as;z>W/;c$lg9?= i̱$:JK2ڍ2;@H7fMss 1xG9YNB!B!B!B)\=240gƁ?mUr8Л57=nQzwV>igW]kRZKYVFZ twwǿj8ƬZ;5j >{!of>zU =@*8T AVhr>OV)n580^t#ϝ r 0cNj:#PnwԐSLU~5oKH1Za*u@Ą\dGӿwr< M1Rz&FuZqk&1fQiݕnpJƜYX][9%ϙ@t4cs P/$LR-ܿ43Fi8]']\یlX;sQDb\֬,'=&[,t+ǿBl{>I-gí9ŞRwY9zcy Vvv UKWg(z\ana{s[yϚl @[OszO5P=l?y[fݸ{Dz]t?U{y 1^ Ol9;w OZw7,9%m(30Z5+a:X_f8HMGhũ18 sB)#.?͘թORfw$rQo{@j!pk⸖_%D1b2^v_r`#f6[%u.t,y` i*jf7h>#9E ?|=y8. O0;Ng+X;⧏o`׋hmtxmiz/[V޺DIE !B!B!B!(!3VYsG3qZǦO 6zW#iN ԣER*)yĩ;s)‚~q gmۆ9{z=DV)V=H wʾ3{\ N\M[G1$[6[W0(vӣ:3Oo E_bmlymoxXG1n͌)h㞥?`^|Z!vj(9ܳ)?JU=Ѓ˫Ccqg8p5TB 2x Hs_Nnf^h1ŧS8{>˖-eO#W ʶni̞;Eʘg KKQO /ZŠ ;385[^:D[h#l>"gl=htyC4l9˸dF)ΰ{>2 Yt K3#2Gr'jH{[E%K*S:Oaj,8xTgb̚K2I^Ͷ-97ƯkH0 66^zP? {A!Vi'buS8bR+cfjF-f7w5wGWxn .u&s.ayN ~WzJp"ze!Ĭb/^Es(Nat慭p ^\DŒBdvȐHvq1%C_4K]i^2nwq ێ⍠Z̜eK,G`Y*&(Oh Կxc3)=E 0+ǁEAO=}s+B!B!B!ozfbSA;50G$_O8q~>]^pbPm 4HˎoAWxi_Hm,NRk/cm:ӿ?_><|gXPLY^"i^&'=0˰h>a 6d)7H,Z]+rw9ek]f!cSi'&|-Lpx3E!\ߡTF5ܵ5 $NĤ3df%|ÂkvyOަ v"l`w}?&Rm`̩wӦ?r70KYWx=gmcˡ6GY} Gy%B7@HS8Jr&¬e)DsMIx fFc:vkb@Sr9vCϰQY03ړ0)}a& ܮ&|ZCz(%B!B!B!B)vܟ_6_TF˳^5w?ǿO̒Yd9%|4@5~?M}6flrnXSq(O=# ~f~,31N#ԸBj< ?FTik/>'ϐ;x ^ZNY/s=s.1SO)yJ`2OLZucGy%%f:u:rv"z>*g6;~\y/0on>ǩ1POr_̽ﭔzoo;41 ۾"ʫ|ak{~)ˬt :h9>+p )=tn寽\¢DkxQzϻH\h}LtƔ~g/C?o+fF\SGl'Y}bk +bc+Ϻ9yPlQCj}<|?0󲉏pUmw >oO浟~7).I3 ~TsXP).>, ^g2 rX'a[de+DFkD!l+` 3"n/n:”.~i8CW,,[{YzY-q_K%W{xJWav'` ֙ZockU'Ad-ZϭsR;h$m*9/טDE} ]TdҴ4F:( Ŭ^{Y\!&}>klpG5'Y&v-LP| <桾''}YWܴ5VSy0&(~d$ْBnhI*^¦vx9bYڰVrKJ|2VJXUGjXM s*=Ǯ=Np|59іїѨK/a9fO֜%!X|e m/U X9Q͘:ul(;̡0m."Y!B!B!B!x3?''hupd[)yے?i^젥z?-PT+sV~=,b| >Ə#njP ESkQTX[ :j}زW## Z8_y.*~V4{\|֭,ĺog߾Vf}:O*殿k馾r7ׂ;yY):(~_ȡ˦O+=_z}C:-ƉSb(~̟۩NNt("ܻ!~׆g}u8'q=ֳ>2;g?.qR\16.kO3T=sn.}nNfwG?}ND:A70z+Q̜:%BGc`9[%6Ѫ*rH9A[4t/g\DYByzT8EN{4$Prkf&\9 hL JC9JFMDhvE{AiQWJ-ZZh! ] ⪌Ugb|&7tP[]| YW0ZX@Ř\lu'DtJ3zGPYŁ6]9уFohѵt"x;8y2rF+9A EGxEOr[ _yb[ up&Pz•$B!B!B!B1m)Rw- 8߷O5 -$82-( -_ad?U/s!>W=ǏssI9Ġ3{G짒u'@utzCV;E/+6Nj|`̍&:_癙1ZCu};=!TKiE9=&[2>|*vV<8+҉O@BNa1)։c4gv3㪃.Ͽ,ǎ cJf2bFW>[/ncbc[8Rp_F;nĒ>'|O}}C#a#codZycn>6*٣0OGP U{oz Sdy^~zNP}#EYG;]J={5şyßǦY ﱟq?hu#> KbMJ`'o ~WĖWCzwvpxjfY$#NJ-($}M@ ɤLpj =90@g0Fs?:z 4Ho}~h}D@3tݞliL =EG8s ֭gqu\A]5>稡S#$hn<n@LISL2 -n>w't-L-sL ~P05,W*IAi13lc\lzZj[01/Ttumh]t=wI,׈jwPР3T_Fg vv-GVYMf=w1ﲧ=:La^`Ý+ɵ^XGydM@3ۏŭ32IHrf3DdpB!B!B!B@!&+ [Hjl )OZˀ-e: &<*G6%lJ`XWÐ0y+f0:Ŭ+9XX!~ UZ<nj=>k|Otc9]g!K^\I*$)ACAMd%vEUQ ʹP%c {4iqz\]E"aPZG ]&wO)XbB`AӅ!%kAZł2hBCa4kaL1 Mc`Ѫ%] jAr!SedmNoïmp{+[1VFs唵 F_7H]'c\,&* `hhD& 1J\(X' %= GJ<6&*tձLݸ_ 2ֽNbG #0prq}ZרB!B!B!B!J!g܈ ! {.Tu}pS3Y\ X_L]ӸUg!ef;ƾ,g(Z;4xS&)zvnKN -b$ړ̖/EcHHɲIlOHYK%݅h>,Zܼ4/ T>ϳ{s57{Ʌ 2&g˥1p%iݠvڕV>l !B!B!B!B3ـ es חVpl 9Wh}tEX K+*ʹꃄ)n`Q U:&?^ИTkyqtJLJ2f^1twu N[^FËU9t%*[ic czVآ?NL:t辡 q˜b,>,ѷ^|: UDXWrnM^lgcÃ,X u^:=G:WB!B!B!B!BFMB/P:)E9l()IgLBmrEBU$T;)'|[qN«)c {ݜշ&6f(ZӫmA:;AEMg4r5cdzaw(LgGZNj:{Yd'݅wH.TU%Ҿ Y,ȩa[cOQj6Rv.{ԔZC{g@`?wCOOFnjGcU:j=u)6E2A(81W͋74H`ZbdR !wQbߊz!T=vJ$ѳZm!thw`Q+^ !B!BLG+M܅0fP{r\NHB!B!ěĆQOPg#<]=+$j"TU-dg`4O-cȘDٺMγF)jZN{Kj|kZQƭkQSEW>̨Tg6ٱ OH7'N[6΃5Թ:0$<%{htuD7Kd¬z t|)Vs7USׯFs2`T\!B!B!B!B!MBéN@8n{yXR'nx]WD) ,eǀN_N^@o(J<8<@GQvaxdk|8CʽgdwK4#iHx&n)L pz˼v=1xwm"gس(P,)_6fi=%{|W%4jX!aǤDu` x! +i$U5(͡4fCɘ@CI4Oi4 U Iʙ>UG)sbP鯫v`\*qNR+~bTFǐ[^L z)v쪡gx6Wzx[C 33+n  zݽʞ(fH5_/pZ xbcƌ$TtMevF?J5)y*D+m?s6~N1m^ۄ_5y7 B!B!תl+b2B!B!Sxp.cnzT'&NOs*i^הYBqB#U>jEAUUJ6iW!ee #:RRě#x; `vfݲ\,=7$d<ݴ672#`Zmmn$hO&1>-}^}sUcTS=7=-\Uf3vCanU5=Q[6l9@8IFF2qjOg;ledXV ;qU$btvI+YSl=pd92VwxgYy8%Y:^^ɩ8 z'lcQծ9URuU~w\A5(b}w\v,K֣txNI#9@Ek%kaB!B!B!B!Bq@fRn-', +JbԂSn2*9Xu>m>oc& -5wH;Rvݴx/בK1Khnˑ 6bHfl{pL /t`˙R)m!lsvfzūeI6јʒ7[ymxA‘cb 2@#2ƑQ f|y~&_HUo7 ''gOB~4U/Ҿ.7T%$vve6l#MnZ0b,gy$6ljԖ1UqWޡ df<G|rp%b߱F\Z. V'3.aii*.`0YO"53Bfďu`am+Qv;Պ6[2Ct FUӆǻsǝ T8̉<ъR,G^¤ߥB!B!B!B!B܀`;Zڿk{PUuRw4Mc+ϣ(*KWuB=C[D䇡GPfqؓǑ~u cwر:9yt=t;HMaOn^ohL{n\}>5Nx ZcYb-&Ԥ 1#o&YySDa/]x(F+ dm+.G ن#Ib$}.zA1bII1zƄ-)$ n?lTz4+'vo!B!ěmϝi41nooT4DL%YoY$;S/ݮ2!E>&qщC(.#B!n2~W o7=4JJ|3O>YI8f1·X(%'λ}e͹^|r>gx.ɖo}4cN!;kg[ X!by'LVW0ɡ`%iKKB Y )݊=- jLd&2g Ii3Ā%)7֠&EVvWW;*Sp餇*ppah334bH1Yj&!%&XGSvcu{ J!B!B!B!rgQC+ 3P6}#[G=\p<4#,%Օh;y4rf zv$->kF2S4kcN!nvv/Ot `;Z'ɫvcB-D<*;?im{9gwMZB!B!B!B!B4VGGKϝArB1&BtZF6-m'5#-lS==} qR JP{WW;{w_TJfv:%4MړD"8S/.p{B!B!B!B![c/o ĥ.)V}Gt\Ӥi!Dxrl7[uh@M//RzG!Ĥ@j%+;gꩮ<Ĭy-禺j~[ ,%.;yML`ϾH$>f7B!B!B!B!G!69{ojy'7å`vImszqy!bRMZ  3'N*dFni&:it6s]INI%+;R"+;ISCnNTUVp$5FL9P(H0.HD{2XlB!B!B!BqCqkBtQ1^hӈMf5,+HGI'UÁ}Gm/l"!%K(u?ut 6”t_+w6!3>}m\m=}UnwW8 | ӭL,93rA,Ju͇vH=6g.Vfq-zg sKɎR9éi/@C\B"7zYCrIh,,;_ێ'l&9g+,(`O#'[Md7l؁:j;c_;z?gOggo^0sӭ=@쭪fbsKife2#2tw#::WTrIyn4_4 ʗb l\YbLj ZQ KimL͍in<=]үJVnY(M!n8{hoi݃WgUU$0Z!B!B!B!Bܜ"gQOOQ'%AH(S|sPhe߁{ɏgP3E%͂FZ#l/gë?gnnz/$%zE,Ulk_+b+յ PDBz'f~Br/H(?39sfr3Gzգ8{۹x%W> 7&{<^aZrc 7 =ke|^Nӈ=99?ߦ2'ŝ!ӉP۶Ƭ3ڜ+ɮ=7_sѻ7ctzBwEQ!8$"L5մڟ|DDhx$]ھ3?@j0`imb1cpuu~Aa08xK!B!B!B!hݣ>B 8ktUdl_>7A`S"/z7;eSDj,c=Wl'TRo(oGRִ=>s$a^hy4+ϫ7;yogIY5*<%Os]a or%ޘʢ;_<Ϙ %$ZIZ?\#>:]ں|࿤=|83&67W+ͩ 4:=ηڠaY3틵b7k~YɏOEX/nלKw=EW4gLfDL(f%)fK'ǧp]UY~qS9sM#{h!#GΚ¦'2/`H y㦛y/ĆOةzvV~ 3߻a^C.,g~m :3xb#̎8XkwR4t4n1kb\;nZFVW'Ǧk|L흫Y<1dzQJASu<.  w~Ϸ;l1#s֓B%w!B!B!B!B!Gcʜ;V;{-{35V&ǦMg'UgZ}*IB (m-7Qg̝qqUAڝyfB0{g b NQЩܲĚNwLdnLjTNsx<9o{LJA{V7XwbU>{plg?*hel-x:!I!%!B!B!B!B!8 }C8zɵ]`ph!3;zO;K ( Ք[Rѯ3y4j'!I5ac`< l5[6:XzF8탷-4t6ȳJy=m:SƎbxzv}MrtF') usq$+DMnci̜8Ç[5*3@quôsg:۶ @|Ovzʨ'`= !D;B!B!B!B!Bt՟@_1J/6R`eIJNc1hWXISԀ(;o]$@^ݻOh't( Wga\U7n bw=-㸯'!hGB!B!B!B!Bk54EAUSu9pV {)aMGu@A9^> (]$_ϺM`]b );*o(%p+`wo:ִVj ï浯cUژLTvVZ%شyu:;'E}^CDi cNq_OBq^(B!B!B!B!Ы q(Y(~K~`̼R B@?*`kA@QgJ @%0 DcĹ}8NCQ*~/o}OLBŽuսI!'CiuhU=vDZi6Cdc qS7eֺ\W.a{_\U򅋘9 ʳJ>Շ..mj^zBv"B!B!B!B!8rٺK=)A1%6f)]37* G -'nK!= DʀOλ9tZvf銶=efpUB4S uNN=/l110a]zէ,툊a՝VV 4Pt[]ڝI!%h!B!B!B!B!Gof?(wڲ/¦+ 1c⦠uS?*hu|)EBL"ILut9BÃ1mغ$W3io.洍ޑxUl%r$I6#YXx+ˠYE>e}y=z(Ni !ğ@B!B!B!B!⤣(`N{_\K-|Ў1mR#r1)E??_솎[m|,!hCTtޗRڶmK>?>3-㮼aGOw ٧xoEeD>v;V5\UPfxW6U 4}M::d"|TeOf*>xG@Q<3awƖR~Rx bh# FoY^Q% `~5-+E(H~_k&Lz,ɶwo_Y+-TyH!B!B!B!Bq:qg{` 덿VMFr2tŃW<ۅg=vxv??FDyc6R'̜=,Gxh<]ܕVCvj*9Vtō>s=O6Ӗ۟x=ޱNce;Y\ϹDv̹>=;Y0aQ*3HLɦm+)+>Yhu:~dZF|_lxr_I8b{eV_FmdV v>gIڅ!s/ El\ͳ\ ƙO/iyjnyy#/;^x`<讣y#;Fgm^OzB6$-B!B!B!B!8A>ӟna}(1uP|R~bFk̦ 2+8D8g*=~^w15K3 IDAT~+3^\swpEC8BJ COeXJM@njU†uwąΏ:|5oYL_;mȀ+K'xM1哼6PP9GXpySwdKf9Y)gXQυoƳbp; }׽yY#f]QR܃K_دYg,M-dJva >}6cü$)Du'x,B!B!BSTUya? ?N#ԗ;HDw{uU}1ҷ0pȈ<!B{E6<h֔PPRAUu Vw &ģ+Zk4b{v)W2(ׅsg}B9O9$8CB!B!B!B!B!BSB!B!B!B!B!, D !B!B!B!B!B!NY.'zB!B!B!B!B!^*#CoÉBSB!B!B!B!B4-fYj텇'F꠲VfyuE%Y|y8JMec@5FPH(^޸lbnrj+ DB!B!B!B!B!N]~cER0h苻,Km_h%} TIQ>9{xҧ_!=<]/ hv;UeT[͎j"zWdxB!B!B!B!B!8tY ʢ߫PP]U͛+;ܟ׿2n'7;r gdoTU=v =# ɞ|vSCkS}9 V !B!B!B!Bt;?W:=O_ԇܯ(1=gzd.c9kӺd=Ώ8Ͷ#|c.\-L:xi+}v'ny$w\ڶS;?U-uu> >y3Ÿzmw,N6[^#4 ҝk4e3jlvooh˓&>^_sÎ8hv;ӶPoÓc96UU%":R6SUYB\p E !B!B!B! obPCy`m$x 7S|Q]ktV45!ކ$Z&ڕvVȂe%X6n01Ew[;yٖBѝ:sϓ-U{}m|D: qUKeBm.K Pn&kk IVv}s=*{׈r [I4Ÿz䐒3.>]Nckn-OSq͞.kú&<<}i~{Eqx4ԛ$~F.kۇ㧐S] yY7B!B!B!B!MlX,hotqbXjC;! `Qsm\;%@77qkجV,ADKGl8kl,`a?xcF4=^ϝ&׈ghO3֔0ol=,]Xĕw!+)ʧ|_e Cg4?b PUY"{wy?B!B!B!B!8w~;FuNvb2 n:~'KbR c0 Bb8hq?xyɿx+#~eĉ=hcmIjP#,wN~8N=lݰm9Y\D4YVG(=NK II, /`zE#~ N留$-NqYބ:=ovj0VIǭߞ).T[?oLװþv[#Fj+LEܤ3uDDp9nf5XKYai6sݐB|U>6C46N~tv;!B!B!B!&WrUsQɷN mz7KL.L|ޘ%Ы|z[Jsn㩻fHL>F>smO%w\b~~q^_FiޢlHY,ӔWnұBsע\{ke|^Ngݶ^JqO,{m*M|'x<4'I ~lf'Ũ[]A .ˤO-77/ |Dgo๭Λ5\  nb5Լy :<ϪW4g]2|\p=/-?c[ͺ{W#/>ȹ.S ^&NWu~Fh_ky/1;-q'z?mz:^$k>Y&VR޹;5u0݁\گ[+ɮow]+*~Gfvgcwp˒Z\=ϏGcqR56(0'y:ZZb~ya6ס!dž->\CAsJ舋gMyлnJe֦Cֻ7ϽgM?w-cᓯmZ TfͿ/aY>9#C=~vJ׾C~Nr@1Fr囟s7xuBCU_LXUU#}G e%>h 3iݎȮZu&C\[-!'Ә.74@NQkԗc:6S(jׅV<}7^QngLN&ˀL%%؄k_}D/gype-[>M<3#c.LeKn>1nX1=rPM?H,痗Ny7/qXǼ}py>ubj37|MuyKy(>;>9wCzyc_PXw猀#?ͻ>;$VG̈́S-lK1?T>͇M%n(]߶psF~J.Cwfҹ#ݷDxr~{V3HT?̟x5k%덩,eay \B$%z&bjOKD :NLuI7{pfNMln*!{W2ShjINBFlv; ZTph8.u5v\ j>~}?=[Xg0pDIKO}~:BHWȆR+c%h!B!B!B!w 7\¿WfL; 9d̸H:Y]7>AT~jyӽ?Y"+~_OmCv".0p֝so{^B!9 a/=;t Ǹ4λ]BmTv9*~5h? ՚(3"J O־,R^Ixd>"L!/3x/sgNUOO+B.s7lĔ)wSg. 3u&1իd|f\qdٝd^{-ku_y-W,y]M<>٧sni9wdyr6.~&w(ڮQyy1[Я7nMlt QǴu]V /\"~y-'ɦCzķyqyO9|71;+³1tp9Lm7bW]_߿FWx~8^|p ElPFqkᚁ^U%'~/'gx}ypx-I!#ӱ7c7rsI+[_B\]0/kuEN'W>$[(bGj [RHّNF[s] ;SILJ&yGt [s5EnKaK6Rsc2FKrv̖؝M~yާb*sZ UEYlߚ̖TgQu6RUYIE '贚r- TUVQۢhUQhvl4/)$&ocۮjZ8 {窪ZJ*4M#0(G`0ij'P]\t)+"m6ؒJZV=C:S)YLwiۻkwMcm ?s'[SIܺET4>EkSU%[5HZF4S7SuWIEm3ncjJrعc)MNiQ[RMAfI$nKcwa5͝ !B!B!B!82ӯ! Z "'3_8E+wu1a>A@g߹X\t+Yג54t?04+!08{#eZy e6\0yb㨥ETߞqnb.szvo1+kO&1Acgq ghu-i;dz6ah\Ƭ zJʃCw C(x%FVғpDSQ-Hn{C3懪U׫Tv'G4h*.|ۅܶosv;œpa̡-(^\}|TT榠ߩ\^c׵ C`׬ j,oTjF\w CϓWMiJ/ӜYUC C($\ n(Z9kيx1M(>pg~l%UNր'oq"z{P9x'/A} <#ǵBtz3$WÑ=Id[tS5M5-lL+`M1=O5] xG g8{RM$gW0#~QC.>)ChZ~YIdREv}gpH [i1et:װnU*f]kIS `xZEsZ ;,1II֝XU/?/'OgzGd唑mhI 챎W{"ưm2JJ5wzC2,芑!ϡl9 tq\SOb]9|p!fyXR6n>d@(T?̙Fr}#l*pq3(pV7ygRZn ygu8Y n)@U$ ci|vT:?/ף;n 7໚ Ekd5yh'0]QlהST\ACCjz+E[~#+]1Sfm/N\_WVmEWMT_< vɯT3g=v?Y-Xv*,:GD⋇AlbO%u8)`h*JdŚTY0kJ,VZȆ{(n"_o"=PZMϣكNXP<{7ҿ͢Vp[)++waC- ѡ5 ɯl7`9{NnbnDq#}}[Z[#[ hPhnG0Q=E@ui!MTen`ܩ}:>7a4aGoFZ// x;+V"hoU mUVtň_> ]o$ܲF*37s}+OF {=5D?" TJ֞4՛^}{rQp7un!g-?ϧQ#>1{5T[HMC1)+qYLK1w=˳D0:-%je*|gjB!B!B!Bc諯fgYWw3zܲGMc?d&eRZ@~κ݆( &u)mr 6PP^Kي6:zt%dQ9tNj9g6^;i"gNǘ10 ד+ :[.|VHE 0#MoƮ=Tշ`i֬f 4pU 8x/+^a ^>{Zk -GRaٖCz o{!VЌQ tg۝QE>ٶTAT`c 3'<o[hnS^KEₜV6HQaG^KE՗ $R٘Q[xЇ~(KHs7W gtᦔb. YGУ__ȳJy=m:SƎbxzvO%Sqy]>my\1·WW`Tvc}^#FMQxn1Vq|!J#v\&>Ͱ!mZƊzv5,xWA+yבVmpFϜCJ'0|~]Қ]zlR–5{ЪW$cgLbpPg4WU>@XNJ4hF&3kLǹO)-QdXrC $}l(jtfvEMT>5/ts E6ތ7vrEI˨Æ9w|tg؀,_"6m$8Hz-tuO'W\۾-.IyLJztx2Oq c˗.s6T(ƇzśRؐۀCgrְЃ!$g\J5S*+I ;!AiX\Jk6gpg_N옛ihS_[h #{x9<^]%AcC&gOĀ렏n7eas9t?xlC vژHS)2L+!g0kDO<Lpu4eV@XIkB!B!B!BRsQ.߽wƥNSyx+b7{=iU}nb7 = h؛L0P\ހ &5H`pΩ\ST?,TQ(AĎ/ex'a΍aW\ԟw&0â'֬WX]fA BCCN`@#0w7=☗PŏÔWU P;x謠)Fzut@x+ТcנCjT۫ {Zxk,dO@q7bϚb ßP-=4^0 :m*=G0ctdǪGPg(Xŝ{5VVftŝSڅ23eX l.ǔIDt곶ըCܤ  xw|J==[WrGf<5r:3BI<BNdhp~]8a$KS`dWFDŽ/VM̧IwF + cJB)KR"rc{8,Tk;Y'.꺷 D :JwQP3B)eDA kK(,blhu7+f LڮOXƗ"ᗑòYG1LjH*u%j2)D^e/߲aGb24:ѩLĢ!!P7!_vaj-$-DLcs1ic2pg5VKB!B!)}{ʟn3pȈ0qݩ!BS+.3~x5)|&f/sȺWZUg %oY]ɥogu 4*=ǂ/v@#./LBC3)9ػ(;ٕVZuiW $$@Hfcclj8ž;+ɥ]%\~)ҝ8q;`b@T%j B~>~<`FwfG|c|èS?};wo [غٿ {7ٿ g ub!n^6p7FƯ!v]A޽8Fl6K3YFs c.]G= ۩s5X~X/v&r [LC,~S)~ɼٿ|0ѓmb1HC)~b˯qk%U{9죫~g{[9slј'hqNJ{>lftܱF4N^,N,ǏaRBŴm2HVJf4QwC+_+9L.tgPb gf? P@A>(/#A| 'j":H' dϘE~#FYTyP_߁ C}ҧaL9>; [}?}3A(`'loqPTVBt_іzL//#,ֆcyL|,ABb%br23u͉NL7AhJțŬjyM靟;y31#+-H F F{Υ,b}Yt7ofB ĥ?wtw|oM/>.F浟ởXPG{B w ZMZ0) _.X{+z嗿]뷹!ܗ@?[<koP۰C$>^?~ UOdm^] w͎%3;vJ/ppkyGsa1qec3΂(8r h7=4{M(}F[i& [Vvi9r?Cs/1;X5(k0 +;LrzZi5!=[<-XdeϘ[Qx?^޳|I;(RŘ˻N$>]iNĭ`wQ;]c6 Hđhpӟeڼ]}Eڏ79"j_eՉo<XV^F?8rYt5\:9[[  YG1;2a'H1_t.Dh..GR^B Δdg蓝G-͌ 1٬ Ci@H:u-$dAJdv')]#l796辠GNB`!/gܹdh2ttbuyXrM,+_B&lCE F6YٱW Nv]?c^[A}cvaΆ~ZÕhD}=sicȔW; @R2Il7$ވ)"`$L0q&7e10Bȡ`` z`Yv7bADxgC-x1e;{kt)F κ4$d$! ?"C>dHr-%[b*Xf!v0yW3A(Du˭P(5ǨțJ2kI+{kh#T-;Z3ͦ&Mo8 UEQH$aQ<1;dOg[bw6X}e}?4x H/ `4{k^G2nٰG:t2$ ߮mUNp?}|O}M @_d[o+#+otD?O5oΎÔ0zRavү` Qr ,K 'bkou&놾mߤy-\O7la$qA:[Гu fE@WQj+FotޱSU}l93e\q.a.֧{U]Ƽ$ o-C/i[`BKJ;+zƭoElKH"#&]wڴ\4ۺʦ#;w~Vu-\7''ɡKNͧWȎ-[V)6Dމ85;BLP6 Q]j vp,\6<ޞ=l-~Ql˟< ^~F-LzVlsҰarɟǃg|k{Z~s1v^uζ|!^>1?kǺb۟x[Oc{ͣ{>?QD\ЇVa3ٿ픯\N 'Ϸ6 s1klRc ίT; _95O9k?= S0L//ϧh?'jlK6_aGsaJ?~#vD^mOϺ2X[``?ʗ(z'_{[z0FcY;(K40//mm}2_z5ws{ia@p/_*:Ųpn wجտ=]YU?u4~`i#| 3)sSnDZ1QV~.$/`;4?|&αq:@'D|1ڰiLgS:g.r;II2bd- G.M+/=/#rur伿^;a¶'Q0"8jEBI6 `}5ْqMu-3Eks#f Jƥoks_-9ñwa -?n8XNkXU㘱^?KoX} h 7s!;"A>,k䤑be$L䲓䡃ݑ'tCS# 1s5␝H|}tl1)-NIn3_+%.>xOkt},ǔ -GvC8*>xm=}P7b_+o{i${4n[yq<=?gic֭bQ1vDȟvĻz% :C<̟[J~Z";M9xiPca1Zo|S^>Mn%x_R198 c4u'[A҂~VEKΝq%Of6v5rû|Co~ xϣ(5DTuly/dIwyn0ez9};!,ɜ'|M_/ky+co̅;0 s_Y#9W񞵿dSçl}ևyWw3sȀfg#OJ+*(CâwVkB,P~}gn;̦mבǥ,_'߼8o$m~37|WjZ*\[?&*bwic`9g/0˽w,٠Zɽ?e?]K'a's5Op5񝩿/UrCW0DĂp^s{_gOUqjb%7rϧw̍Vz6^@>)S /s?lzTuZسsM;xїÆ:Y{Ǖ:Z]zq^oȘ#4TSo)jQ[VLB#/Wɔe#+p|#|E䜞Iln|L9\aPl6 fĆH}jEbvs?^*zʶ(F\z2 N͵`f]$LYλ/?fӏ"iU窒sx4EHXv%e|F>Wr2,?[̽m(<$?G6(Zq7V>zd+MVrcy&-=pMm.""""""y\߿J|]!tU"IñCygYǼ&9mJ,\:Εd늁c8SRRHENg!;$f3wa)0{]FrEs3e&qn6t7ey8/+}87 =Y᫉tx6=DRqMNEYlM&jv=`'},+&cZ=Gص^B͡$cPts{ HJ"oj)eHi;cE{}ji `&$SHɌg;F?rp>j<酔/;$D;JWNZ"OlѮ:9L}WW1s?G˛MT=LC{/fRsW9:ꩭom3`˴rf:(*7 \5JJj*P3_:ï׾^N:"qÞd* Qβyzw;]^9^RJxphJfS!=gbod'@xZe9$ :y<=+o<wquDk"klѹU6fa'hq6EKbgyvP ^`**2O4u;xy Bt5H&h']˾\^E9GpKt~9ui*W-y}Y Κ\I¢it{9v܂)lcs*4Mc^0uژlӖ3Ӫy&HϜ4#MnAsO]T-b?J/M$J旓Ulؘ9y1niعB0Bf5vTЦ TEp0uH6 K,+J Oavl̚_z: `QT6;RfeIpQ6A9eȶ/JO!=cfx\@{*׮bdLTKk[`˘Ţgd!""""""""""""""=Eˋi+0v`Oxr\0#33>ULB:3R8c< 6R 粼pgAeWvGIB:Es.h}Rua1Hr`Ɋq:./]Mlp=}+_(b(g-~^6s)bK>r,Mv%'Ձ-Ë+QYeqrKay^=M Au]˚9L[,fG'hW@a#AS fgw[6R)[Tަtjyo-shl3cU쬏,3qJ59hl6 R+]zE\g_i'O?r<7(>o3-]!L y\}y }'̬2]t{idl>Hj{v=&ۄdJ&xmFvmf$p 7G((tB3u Kz}- jq hv5WSX"(i30m9g%+=ϳX7}/PM$[Zi.Qf;+;ڜ=]Sl]_ᐯ< W"z ;Kdv<#i)^ً݆ 6.`=T.[wcS/7Wp&Oa B.r)1Hpp-o}Դl>AL"O-SdVmz6݉8ɳ-7yyٜ%JJyqϳ.34._3Mq#6k^+`؝Zr7UXG- wJZVgC5&THN_p4 D-NΜk9m7[xg-=|E ZKf:;?:IL^v/U%5m8 tzb.ѻNuN/"X` 5'@ڔ\|Ǟe#'p 7&mecn7Ӏ`#%W^Lv:*V%˯gm.4%b6z_[n̠r7\wm$YÑ%9Ys i.4ޅԌdǷa0HLs1u$̞LV~;YyMbjq)Ok{*_gC|wn C⾘ANr ɉWQg9ȝHO@JN!%"G&!%” V5\Uw!/m]h"1}l32hr|=qMh#=3s6Iq D`K(װzIܵj<::L>6-r󫜨=i#4MNr:CϞ-nSP,q'/׺,1 Ea۱,^b+q̶-2vfΞGQLƗhn8A48h%W!P\:) -""""""""""2a`Y8W""""k""""oD c׹9n/)8)$&$@,G"|XM28oHajq)99njݕqǙFRR2GP`0׃6o+f:3E2iDDDDDDDDDDD&5A0$ rDDDd y#k f[DY~+?yKO_<7S׸\lMdĜi̞Ύ6h҄?kqS0uYcPL$6ұ+XWQ~sHHH$ \&+5=`ζ6LrDDDdlk 5=}+pݿ?Lo|>2bG49W[1fuf Q>79=S{I 5o5GoǮH +>-> Q70WϽ:H4Jw2G~q?l|\nY|ԶDGAIN"++Rki.QN$^2r!桳PO($ }w:I8dfqaח """""""oZYtwvgfSU2Zp}2\8'JTě7wA!F"p]y{=y[&ٙ2%$m0 ]]3;jYYIWb2oZ\#M ( wmɴ=4Y8Su{9H/fAy.AFr=sn+ܲdLcVPVszXQ/vT-Na9L"Cl$;nPdMm%D`1`Ǖ;~) ǝ7e#uw2t\98)O9e II hmn1NP [KcX;G`1Rq`6_$Glƾ3$G\W>CDDDD&Ѿ^@43#'È]m]ĉOKB""""=9#i˘0FT]/deY``vw^¸nC33c?~ <)1ޥ*7:%)zYDDDD&3˲{ikmFA?S^zK!"""""cHWGINϚMJjx$""""2azYDDDD&;0p2d:\GR#q-""""2ٌ-5yA<-MpYt,""""o4)iL504 ǻ$ c4,"`"""""gW0˲hw9"""""J.rrƹG""""Fu=ΕL<^V ZDDDDd B!)\ģey:y ]#EDDDDhy@, 0ƹG""""Fu5eEDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&-EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&-EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&-EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&-EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&-EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&-EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&-EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD&.@D4p._/Pe$-#$ݿ! m뤻GO0 $e'/Á1HL>?AtulD)dd)(άO U8Vw׭A`E G"p8DM[S-{c-a6+UL/{:;8YQ|XA6oO~,(ޔh ۇ` ͿfmR&%PND]d,'^V """""""""""""""""""}Gvξfގf̺#=XEm/fc<ހhH2hzyP`2ʝ vwAwo`(H(4$&9I!7Mc8 B`G'D%*JaV6"uLJǝ`#NZZvG1pe;-qПٳ'5g? Ϳ c$fQs8U<3<644^Z't IDAT,f+{&y7;fr:+p<[kk24w b$En4fϠ u8]_i aOe܅̟ ⩫=|`0RQ6# "ݍ>DM42S5n= a6}L$Ϳ?Z.: X DN֬ޞTn6üyJ!l/)5Xw`+{7obGm'n$=V_ɑW֝Qh%w\;4TWVsfuEsXl>i#oIZ7Kri+ijo"#\o^VV=[OC+L} v ~_0X}+w{6qF2+†|ZO?ԳƊvd_M舜[a8)\r$wgF0f`@rÑFz枈D& DÀ3~&ѓ<3L(|0*@y#ȍksv4ʎ_>7Xhi?ui gSXX Y[[ګYVyB1ABˊ92 T~- bw#G1_oz/$|sm,? OÇf$="dGc mfT+""""""jzK5nN@͜q("""""2F^ 'nR;7M 5uVH&.6G:\9i8 ؈il;:f Ehz]Q83IOMif+gQ$Pvctdؾ~Y7/8v ͿzOps澳(Joe`oYϖAVm?Sr1k: d&hi;=+ Ǎs_ǎ6 SOꥱ>_6l-Z,m?E_i#}"袹v/61| +KHb|G#q+!Jr\#6uDӸ=W1ML4C~zzz@*pߟj3Y}H;&&6?N4՜?pg\̿.DkF=ETw 0} \9#-Vx2;Jel.&Kgvq`YΖάd*SIǃ/xfLޖ=s:7}|fI)1>,~~_ṓ ^㪫n_k5|a-n-fdZx?%V.#n|a)EN."""""""""""""""""2=@ޜrO&r^r8f$L8bbbNAn]S!=NR3zB0ȬaT{z _ZOG,huS[9#gsa3rH&XMzD/n/NƗR5c$QJ&aoD&OrՌ$ʯFZ˗ \"E0M |Hc]cש.ёG!@u'5=aheunv~o#?_?Jx3>^[>ž=}5YQnmŔB++D+HrsU%A DY='63ahCgNcJϽ)I.վ]6m$'pN'p -NګkTTZ(ŝ䃨}*I$U!ByީuMɉkZԉ pњ+/Vڸle4ξ+6'.\+31x@&櫖ά2tya=}ucY_k?E^zgWvɉZ+qNFG2|_ϱsA3ܻ&G[ޛm/+|@v<^)Nd s/s4u.5z&dž208-L ~.omL*xwXHSl<'e~9|eLNN悽\&WiIkS Zԉ_:}Mc0Gmho^x輰kіU<\:/;~YgEevoc띁eYO7:2zᾕ\ccGڋ sʩ ]GM |훋,|ܖ?w7=SS9=_'^~se?*KrWM+_f[yԓ' n/獃}p&U0܆"-˶ f)* ijiKǢt4[/oxq%Yֳ J2>Ze-ӵˍvg|8iyd}?+;HCg<y!ڢyI<ʻr"˷~ccڞ kw?5Z;ͼyp GgQ*9z64zMnOU_,j,3S,ßpұFzTs.s}?gn2YGGrA>hˊսQrQ"8e`=>ȧ;>JպVzGδ-39p"S 6fwYy/槯}.X'Ttgf=m8/ dU_Y^ݕgd~c˚3FޏWe}C^15ʌ;*Mɦ2LJە+ )G7{ݡ.8`e;B+1!ihhLC9`ɕc9yq$,ڐ;sDL?Skt4LfٱTLіV䍣ro}胼JW, Wfj/ɇo7tL4kx.v'fse6wgͪEZFkW?tt57rE{֫?UimIsL'O2e}Zv"oIuyv~|.<|Y4Oc]m*]yKvq?WOeuΛ?k}Ͽr4o5|W|đ«G-3zpܖJY(M>TBWfz|l 8'IYAalmy)o?mͦ"'O$)R<,77a>9.9//?aEӂ,HN]K?;"]O혹PRNi~?̺ ɱ?|0Y~9hߛ/zj,Ҷ7-|p5̹p-Ge^m~$wXĉ8=Eё"g:ZUoӏ.fAS{~GGrɂ6pip$-k=sALgɡJkK[vΣKמސ+4Dz#]|Jgsi/S#?|0}<Fe2EEw7\h9_&Ҹsu]slYxE˪|oGy/Z<_ [rUٳ7ջM.eZa袒#o}-`Tsrxv|^sAt DEіޞ3M̨v"]IjzJ,qјε7HV^"J{:ypòt5ZTڙeWI`̺׹jQђk\z*YryHt y7}CMh34647 74Y;F;2t6XIoweFNdĩNL^T؜ ӹ=M>ٸ-̦rb0w);|Ƭioլ(W 33(?xƴgiV,N{ 6Gg`TN gtL-]=YrYz[$HlYz?L_=Iѕ<}}'S_ȿ~镆+_x:yI|`|)InhhK|#9i\!/ ЕGFMRtdժk4/E2T4/ʺe=@ٟ7~>d4]2oşhܶ,ݷ+iYm=?oeVmK5]q s~4vm3_zS؞oͧC)RmƵ__[{*+ky7ӱdyV,^mM'3rx~i'H{:濾3EXɿe=VgiW[j8;o8U˹<~·3\{84pj6?ˎg M67+m=VÕ_sie񛥜:*4-'_~|]nYa?fQY]ׯ2HoG%QyKls@ WMsKc*VLTeݫzˊg15b8JcTʣ޹+{fd2iZНi\@$(ޓU{jKd1*i]{- WԞw5N}{|5i+C}é')G6KX;Pe `F9_y0Yzt*Iјvݻhykk9B `(壣SW0{g*I`eV/1CܙЉ<9t+V.MWKS2XOR,HIRNԩ[]. ]z䡋y_Φ"{%&ʔ2\KTx366zZu8QioO[1xi?h_˪329}QCzv[X)sD{eV̈́Lg^)Ej_:oYw"h4>&mER۝u}.ətCC-+&w@ٓwlWr9K;?i&//t옩9N9|&0]Ik[MTfwy|tx(gV)Vf޼ޜ')Y @4\Q;͟eϙx'q?p==-HS/WT#K5jvNRTl^Mn ;Jǚ.f 65y+$łߴ"MI2ÇDyp Dg]ur~-+WeZ.S V/=OjRTOvi ]kmܷMY9EĩHQ pẘJg{:WZWHQTܖYֻ0M-?S3(o<͵|rKY^$I^n,h̺{˺ٮ`̣" Wo.PSZ9sfZMh[vv amڃV;sQ\cxF'rp߾:ڟL֒,U~4vmLK2=Bι>}3)CpkD̊2ϴ[6"IʉZ^|{NLwPz7ٔGz8E7CE]i)eL˟ڞgZ}Ѹ2CywrtzfS+ݝ( 7 D ܈֦'v acC]Zp^ñ2I5K^sWGzl׉L_e&?ʋ?>ѯ-xū|4V&/nNse挥·?ysV{Wee묔 rgvl(ԔYԳ4MM]?(W宍)Lx#/|p09䱼Y񽇲jְ8i%9IƲO2Z^/( pcίT^m[=GƖg:0E~ߚj}^=.ۖ@4,iYXmtN|R^3k2p3D̚|Γ[:5V# eM>#S3Oya&,]f IҘJ)hnO`M:={бtYIS˂t,͚U &*3:2̳}ż_;=;M纇[t٣|aJܓڱ_&>+:4lg7sݟ+՜޳퍍t sD>O'vVz~<:o} pE{RL6?t^61Em"ӹ^ꢞ,$tf^/ҾMhn8)!Sw]+ }Fc__xϦtStU/^&36:˄SduYP$:OLloM"hnmٖ/=`֔/ʊ󃧺r*rpeݪK|Q wj/O\Y{yi-HgYiL 7sD@k3OGHyqEcg?LF8%TS4pS4tϓYϞ78զwwɊ[*=-v6uj! 0Gc?8{M.JX+:R96zLOL17f@CʲL:EkWVP$4w(戢!$$Rc1EZZeʩc960щnDљu"戢-mE2Y&pˤs9֟}];LhKoo@4p9n^~mGr|5K [C `,LG591Oxzc׹>z clW 9\؛%]3mk}ص,懷^f(Od C0D0W b™ 9 ]m-J{<\_|k8o>eU5vQ{l82Iq2GOYxɰ,\!).rt465BW9fMLݐ˱Osx K jhr,#u|.nOoʮ.}Q0twZ MV:S6MgvYC, YRmtV$ejӵI[Z'\H `N*3zl_>>9wףA464\tnh(lW>/Hh^9>ܘɓrЩK;IWZҽ;7@4/h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`-h`jQd׫W*_X0 Dݳ;{ojYTo;PۗNddHK{g٘ Ksӌ2}>L<Dz9 @4gM̟pwߛgto^MpN2]ުUfrto^Og;y/epW" @Zv]smhO~+74sClʒe%ʌ|+/|0z#Yv |r88se:ڝ_9x8˛ozepUsEђ+.BkLǒYya zz+nc?/]4{ݹwf4|M;_[_ݞENGEѓG嗲Aڞ+d.hiIr"cWl\IǦ#W7Wõ0*zS(f֯.'g ?ˎ.ݓNh3(; ԓO /ّ?ɟ~4ڭ,.C4|в2^g%.IVnLd:G~+5N5J_c0惢-ߚEבrnZzO]xkn/,Yz6<}tWvFJG>\u'ߟ[Wص%|ik:g>JzWJgkKZ[Z\8õd~H{G{ L=C ;Lt-ΣoY:^5ckF&S:ʜ%Y:.2ZN|RM[[K$)Վ~0::zlmY#h W\<ER߳)/;>(H&bMMM&p~ gϮٲys6nڑ}#;SF=͋;wj\se.Z43cc5ٽy]љm$pPŌ5l=ȡsy`R 0Ug圢moS#q:IRȪ %IR]9P"h23^wiz΅@m,?޿'{mk0-rii\rFM6gEgU7ݚ+6'ǣ(8&Rp) QΊ+JWΕ.R4vkμ,왙bR;+eyQ{y}yљEҗm*ʬlt_,:5E6ˌՒTi$F7uzI9‘6Lغ5;_C%M9'ʪ3&ֶeڕf۳o<]th&@4@Ch}|Z%m-IRw#YԶ-_rټ<6puhX4p.=+mEoʤ:s^SWvxgx:6~2+s\hڮ|ȋej_|Ү$C 2v/(3R}`zOq8*fIKyiL2}/>oSkZ+;p^֗𑌜'I߾)z@uv.T~ m97g%7km2' 0ʌ D6k'Ci_ySayNVk"_~$GCj)hh}(+.y99<8Zє֎3oqV^]%L:h(F'=W:3HF$,Y7:d\es*[ORIggG*g|WI{\ѳ2W48HsԴze$I,_})elyYā&]3:#=ʆ;^5]$n|!{FO û^$Mwӡg^]_&K悅sgw߳=d,ӕ2ٻsSֿ3e%3_WdTr7eM(RH53f~̴x~sL *gŬg=IRԍؖgޖgN-~ܳ}}.}GsgWyxG~om}c^V_y}_ӓֳ8@#sɕaR6Vؓz{;3fxh;v67/>6-h,}kfΝr(ۿ!}F7ۑ# Ւݘ\xMI#LLNkܙ9go IDAT8_Uf_}div>`z(,^6k9yÆl?7_mCٷ{k~Kn۲u t[ynn2m=Z1#ui[N4Y嫖-Oͳy%_ v{ʞ$;3"MF7TlhJ\a9Y{тToΣI-IuŹ|iķ#?i8DpJ#gE^mnK9c{IҜ9s*eFGF8N;;;7o}980鞻 W]=^P#GRW߿3;]S͈ɮGB'I}pԓy"MAbUSM9W^ݕ#|0};gҽ~i9Ъ7<&7\we<\˶Mǧ?W9ȱ͓:h)e82\qUYfct_xsn\і̡MNѲ {DU80U =c6]wvMw_y2{ˤ-uYB_Fˤٕ\m?9wwuŽï}pfV\usntAڋ$)ұ|lSIp 0EjO*R&@4QwHFʤg̣]ϻW4s/S]ˬ,[=]硱ѱWE:MGtLMY{YsQ~2O~?9K$SF7T"-GЕjYSfth(Ǫ||%'Y[RSĈ2Zʣ3{Nwk::%ܑm{9`NH[{[g>gp`h ҙErLF^+Ӟ*V`r )5ϘicLRtg~OxP:~|aѕYn@4T鞕Y_&i xuMVgYZµ>$Ej);Ҽx|^ұ,7rq$Z13\wK.x,|pynˮ;<#̥^Lh~pEk殾:ѝp4ʄhNV;/[_ɞG2\+13s,E\ 润ht0N cy})O>r@vm>][7g <`J`Ⱥ/ֱ2I}Yn<ܵl]a9o`nY|{^yqݺׅOR?~;w 7.*n ddd4###>)|9Ӻ,_<#Cl߱'hx[\5a >c!{Sؾw6͕9Eڳ'H-۶gM%l7[ @4Vfs/>PgŪE8ߗ3N8Ay$}N]M׊|,C]_o@p2h)Czss˼=q׷~8ή~`$f1z%Y2#m33oյ㚅i:VQ'1hTq5WqSy57ޒ5~@F7V DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m DӖ@40m55[fhjIZ=jPG/nh;zlxԈn*L-h`-h`-h`-h`-h`-h`-h`-h`-h`F7ڶ|eYչwdU,|LaSEٗ =uCUEXoȪLeF7V DӖ@4oYYn\S`\?OM%Iuaٟs*v/<Q5Rxl7t.͕̚K:Mޫx!_Wsߓ/Tgeɚk~8w2I% 0U]Y~Y{?gњsբ#4?՜"~c?G{.HGOeݞڱG}`_>uOOmSmyy$IF79=9 $e`§W'ϣT>9 @8H_[Pfxx@B3~3N}LYۓoO'drdKڳ:7MDL-#<⾓c/ǯe2yrie7ͣ'{vڋdLRf0y:#|sw#+fg!޷#;N;75@n]zveEZWܕ_՟ȵsz?tSK<5^窥fp DLե+;yfh؜{?;E:WdvLw90x.ÿ_貣wM܋G'HW\;hm-=)j_=` 0 WƋ[>]5i9Mo+ ЕyKOګu,?4):.ΕOuq幠zrd B1;wgiә"E:.@>ryۤT*ǃ$EWfudY>tפNjXS^ {DEͯ~a(Hw=Y\}7Pvc,\iڔ&ԏ%477Snt,򻫾w۲`MxUxǝ]WgQk9SIvדWO-?6.:IM&@4RdƊ?S~ѭo+E,Qd2)gӖ)/96_g>o~-^Sɂh&G 0Te貖-O~?7x$/>>G&DXs/Ąh)~hK{s7Tc\~]୫2Ә \)f}"?{@I %[Hc\ $` >> ];GeNQ3__>қz?}KK?"ܚ׼K#yOy+qV{7& 0U{O0C_xi~t-jͮ̆2i˪oQ Rt.̚ )BG CC+8G\$+s[]y$u S SDy>Hu\rfj)Sfpl]5՞\ޙbsHzI kvg˻0#qzm,sW9?:)Sؓ=ɚj%fwR;ՆW[=sf>~Mui>[WfC~/2)f䚟osr;&@44gnfɫeҴ\?$̽!y I[|lpw8G;Vҳ&K?6L%.yO޻|6F7QWt94c9tuwWCCCkI8Xӄ$zi/==)Lh|'Jڦr֑E"IR&eP6oٛ|AkkK#:j;s_}3NNq5Y|tRߵ)i SF-m|,#k2-_Ok}ٟ#IRe<KG^K%r8jEڗܐs4]2qE窬Y<~M5"7L_?Y74>Eg{Om_8y]'z]S}WD?̛[I<}I1'C"Յng[;fu=YMsޤgxhd|-[LcEu^ek9pbR=ƣϾ5E*lR֞?W2΁"3&ezׯW>G6j ijt,;>,{ϋ(:sv-0k/NsȜK2x)2c[ss?yI2#{GC7-ʥ6,Lh(7~Gsc״\|`@gfV_瞽2PIi\,&G 0E]ܵ"-Dzeʑ]g}'TfߒyLڑyG [?#EZ;3se .`S,'S/{H3MYt?\&@4@C3|pǎ tu <#9T.p҆g//VޖOw?ۗ N|_zZ>|W2ڝw2+e$hˤh?[/LQ{vftzovw^I߯Z:p)ږrÏ<>TJf4-1{AV<7zc\M&@4@^^O*w߾ 9_?C|᏿+Ea4e֪wëޑ78A zy{IRseG7kʋJZ;3gvW:L[+S{ܷ~d)ńhIWo=Y|iڊ$c;]Țt>qpN tm _Gk#ٶ7UGk>ffnSLsgC~䠧88GtwLL-rLR]Yj$exs9-˻b0%#?ɟ|q IDATɟ΍3e {#e$ݏ?իhsώI#/g4xrO?/[Ʋ緟Z׿z/z #-zr/Okr5W7_eտfO]_Z;_KeR˦Sgp6yK\n)` +< IuMyߕ]3.{8MEڞٿߔ$-+ޓ^1=}OyA !t3-KP40%9ܓY?T}vK J={|2jIҖ_/388$ Y' (Ō\;vv#)=}Cw>Ag6ftvՓH[{뱀J1ΦF7p^+:r$uۏgʾMo;*mY kn>-)G^_g~,w\0$)3z`[g8>9 _/& Y' 0T;+F70+Ul2Iʌz4tlK1z$S;"MVfy5IFJq9gߘRŷeM\ȁ}kI"y|p*]Yb {w}{sf׮h 1;cl%^bgO4N&Mn67M۴im|'M8ǎqmY*V#~C3yxiw~󝣟Й8X}a-OdpjέeRݗ6jU2 k#b)|R:#ժo+dڕ%˴ᆛiao_'^=翰#t?Ý}B޳DiMѷ7yP^9$S~œjJ4֫vl>U\^7_[د=NYLg}spJݸyӆw6LNWfܪ@4$˯c?agt]w~o+_O%+V!IUrQu[ƻ`[ J{"aAz*~{R]K J\.w+n QX۷bdRKe*58?z{jja]0j:WՍj(lZxf t}TdE yJ58D?ݐgY?rTګ˲i ǯs,Kyrgɋڎh5dM5 s7h\ A]oЦ Ͷl.O5ɒ?nc6eY zܤ:YLr ]4Y)Wu>ʫ$& LӔ9*"c/ *x sxvx`0Wp%u]' F ː"hTQK1X+pZooٷ2H~:=).pŻ$-{@%0 \n˓}u=QHF -3K6'&Mj1T1VGq^vN{;P-S K|eg 5k2K_r\5,VULL6Q}tYgT5Q=3ɮd-SOw-Ȅ` CbW/l6`VVy]ߡ͐}΍ںfC%IK'Y|+EY9EZyˇ:{t7OG{gm`V! H*¾m8uRỵ<4 e(kyG-kUݾ.Y]::ruF -WV.IVXx[ O?Wk.mՆ$OkC[C]] d 6c:XaԖRuZl *o47ja(gMz |׈fpy<,aYl$y9Wol#WҍWkkHRrj@4$m?66+Z4C~á4̛9NB gNv|Tg kz$C t6 9xkhHpFRo)w9rsaZLKj՛k5>GKKReuɒN=?rS[ )1j4*m4%|e:1^E[ ʠC4d-ӭ۷mI))+ϊ֓ X#=k>U@Wh͖-ІO|E__CSրLWVl=lՒ rD)*>}v] q0RYG^ۡWWE}2rUlݽ][SEh$ duW\5ZՉwvk~APU d=1߻ =kSOhixD@:/7 =5wb+@4$Euz!k)\q@HD . lѹІC?O>Qũ5x]?+:aju:*q+D@BULSoEjĹ*C-Cm?K+\}ߧo>X% W2īhH!}[n,IF}E3McM:HmPɳ"Dц ikCޥK5Vs[.hHjm(}ڐ6Hͭÿҏdɐs]kަ,&͒5 ZNKQ# [3oV@Xժl71bRy&aHh^:H$ta4?-{wРUlLS?"ӆҋ(vBu1 4Ժ`aFŠ tZ3l0S4:X4&Kg8]r|c.n"=U(U2p')5=CinS"~u#?˗tL! °e,2;eISf:o,uR`T98X)LBM=V N +ګ5kmWWp^5nݿ&˩_Xg[USU73wC)B-ZJ+3G (쓇oaVrF Jtt˦%f13igY[۪'#v.7ߩZ4 l))JX[3ϑ2Vj.I18K.M=9X,6a 5)MUuH|V岓j>^*0:ꀎ!i pʊRGެѹ}KIKVLht@H$`[m U*ۿK?F̣z`q %ltcଘzOgOk;j}{D -;W96#& s?k > =u?٥ğhz⟣Szwc2 w:.;K^\Y鈩^}t+d͇'Iʗ`5^KWOU hj7 \br+w) A|ZaSE)RG b nkU=y¹ C.osv4|KVIGJi틔La;5S>O)UQ]/olL,ԂfmDtNGUUSkyWl\BZJNːdłj9 ]go/nUObmڸ^[<^95,u:SZg0{nأ-u@4$ G6ddYa;#"-_Ц=;kjȳlV/sW1ϜyCΰ1uzCWఝiRmp$ uwCݽa!Q]Nw2tdB mhWw0*;M*t˦m xӔx3N554ӯ@$&VRjrwɱɻ6e}{TIS43SjB%_Jm˰kNj \/iޑ _w>ʊUwl)X_nЊ^uj𫧷W=AE S3S0O(?e2']W'=-G Vʹ[!ԩ=2`$穤 u܎z.Pe}:zS=G/UIv:;cU,%歼U,HQE{B]ZҤ~dҊҒ=PypwCuFK2 J#g5\R Ϋ?l]6$3z?QMI'+oݰn|u 5l:Tթ % ʈZ[K4zJ3ШRl`6gFrmܸRESoLɐs[cbo-oKR54 7QE4S .ͽ>q<hL).M_Hzb㜨pztCzC78i}oo_?a}s?=>O_pRFWp#Y|2߬"%\zkU2r}*LɲNq+3}x%C,^yHqio#u#ڿ,~A?}6֩F?p)`ܽiRW~Xw~C!mÖ58SFg=^K,]?L_DS.,Np_,E]j*oW}d S*4plJ_M|adY c+`gĮU~Gu45rןj3Z='Xg 7hK;uk QCe(y`LZtiDmiÜ$$źobt8vK]sx5Y ܭ[JR/v RR{Ui2]qgvQΖk(@bN5.Ɋ^s\{:ykY^O*i~bsR?'cS҉}Gq6yVAQacxu>ʔ]RyOݜM5zV c?+}Go<^K%uyxzҝG ah\>oيs(w $9Z0z|ѠE KfWzfm]63تʊ3:W۠z#uѕpHCMW-uwtjD`#Is.V̟\YUFƙ8֮mkuj9jS[XrOX:w1}7u)4" zXda8Xw)fubo,?7T[M \5OIKWi{Ǚ<\ו!~/?^fcV6ybpKm~[^[Wh׹?W^({4C-ZVk4׫Vx!1YFlmx#g(ehD ᳆ ƺU= ,xrHɈuӞ֙aaW#YoӶ $æt{+uGd)p%}Dɮ@2e[=#)3vte8kRwl}"ͧy5~u-M}[?o:tK^G^#jdo~Wz`@4#/ 6\d{}uA-֬ûGQmd*ߗ*&Ro9tDGo=n5S46Șbc>485qWW\f鬿psv:IZr\z(Җߩeːd K)Y/*ւ ?\ճO C]ɐ* v8GUx.VD0L7V$1y:oIS[*:ޡ Q+@4|Z] wCs{75NCT"zS_;:a!ZÝ5۶i]{M1MOrػqdz=_a:TJkCbMaU:"4lTwiHe(O*.tlީyyk(-蔩Ig01Lۣ<#YsQ%T<~wTPRN2 _\HOTu.6r:0RCԅʝ(}gMYUzu_겧׍ߤ%|v9E>|=ZdXZRZe{&\^evfGvs?g,phHYꩬUEK]R9 IDATlRcK)\h+%;SX:U^ yw]{WL~Y:MOWhZb ˈZW;/t 2d# 4ٳ<-Z*;PIQZaLCV`q )k>IL57γ{#*e(CMK,; e-[Cز7+mR^`zkϨ}m$ɮyDGr-3 ⱥZ3QuZ-!I YC[d~oU=LuVW98p*M=>8B7~@|߉VDw?/|^%EI)RK}ηv-T/W76)FC=KĉLg֮шƷ弪ȖD/yԙVwl)Qx9Mgm٤ϨFOlЊ[iMg]VGQm}èX##c>x_F4^j;wL搜so{7e^ty?f8ix 3-7Fm/ݟ޷4M;,V{9PCegTXbІM ֟=vũL]U.>9RK 2֖:Zc˦-z0PeO\C1t.cځhۭ|Ys;0u\eɗ/599n< ԥBuut͟\yeL<pYY`WmMjjeYJ*'`f`|xL.w.cFђ4w^\z65V355pE켂 CW.t9r-k&& BjomROw,˚i0 \n˛˱Lf''@ٗ9Ե4֫>e".W.#9%f2rD]Lhhhhhhhhhhhh!iKC4YDoBbIENDB`adwaita-qt-1.4.1/data/screenshots/widgets-highcontrast.png000066400000000000000000013405741414271704400237130ustar00rootroot00000000000000PNG  IHDR DȑsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|TekJz/JB/!EEņkuu*A wZ&s?L2뇏6666flς<ݞie·G$dk&I]nj>z]۶L&*N3L֖Zk$OKJu5U t:|ۻ\pz!IǒUv0f̘=[-|j:dȐ%o*7?(׷K<{e@srvxIͥ@$A Z@>Ke(I>*_ߖ^Z%Hgd4\UP^^a^%KG+ jL*M&7 4vfK7Ghhbܬ̒h +,,,,kK:C4&Zhx;wiނn]"57(_bڹ,΄ݎݓ'j5fJ( X&%=#CvkWHj߮zDGu~7k񲕎5W_Us%ޣv+%-UUhHBCB=D;/ZTiiuMDցăZqc{Ν#:͝Ŏm[>u:eU'N:qj߮˹6mQZߥs'SV=ڲ}c/.N~C)-#S4ze55!I3_VkzĨCvgnW T`ddf)=3Cme6p5C 5sTlW:!t͸1jZo^quXP 0'3+KsfQaQQ6BOE]:ukzæ*Wf /%';t͸ h0ǟKڴng{NJ1gc\XX2m(5=ñ ěƻJݮg^zM7mjսOҐTfUzeGQ D'NWă]t6l٪u:wXayb:;nSf3a>q$٫N֬C Y2cl0s^awuyq CKҒtju~l۵jzǸsv QHJӼ-št:3+K}-ǸWLw]}xo,IlzuTI4t*:eߴY}6g*Pܓ'_U#N;k;)Iؕ)}Yz⅗sO)ysuڶscl٪<"{O=W+t`uhVBCڽolbvR$Ihia:t1vwsSwzz}7lW-[tͱd:ڷq;b6;:yMrTYَ}%IQ]5quOjѬtkjlvgDx:Ӝ(x>h+ ECKjUP@+ @ѐUh>[0tuպ\xx{.9'鱇̼# ʊߵiܱc{\=kNa辽b4ڿ+"ucjZcqۄ ЕwYO>\_vzwwmڵ=g4WޓW+Jyy{_X\mD4oM.oپCw4rɨ u y\LsuS~^lh=t?t3 Wg~n}^+t>6T^bI2') Q\#:DRR1uc'yP.QS[[+>~E*/?_YYqZw"%8 _N7}.By,Pjzc|D9VPPZl!T{P tAeff)_-['JرdIRhhrs8=|eff9>>ɥ*էUgt|(SJ9BT&Uk:{x _[?1~թc^mCT1S%R0t5kc~ 69c{v+׬?4V&w~GRVڙl+..}v;t 7ЕLi"Lm[9{p괻u}4l wt>x谣$T=8XozZ@aɭrS}Tam~A>KGڕGh٩xC{o'f,ahIZrt4X};vqJޫT]jj}y}W$mۙ{xkx?~I4o{Kx vձCھ 2skðWn\OWesM&]W>|<%UE.”5snqaȤcNZj4.,,ԧ_NcSm}NV-Iǒ5;5sOyS]KCTYǠ폎+ вUk{TdβZ-ي%IkmԈԒ9Dvq>]WjѲN<=TN+^]vi=G)*9۱mZ&4HtGinRrIw\Ln{ɤfBէw/Ǹ:{zx뮑$ON!e^QrKzGt 7F_z"[ˤϧUڍ奝ؿ?zPXצL|_ îצL>u.//I* +ffd)LYw3$IwSSRs|QHOtwi^#GM]0\9;vj]aQɼJ_tp>[ǶIڵs f2-@e^2 [-jY4_-}$iҺs_SljtZqyzz:-U\d͝:tp}mˏ5Jrjcǝ67si2Yg_t٨ +Qڼu6oݦ)JJNA;==C2C8DL%פzkG`rN4C}{jŒ¢"8aaѺ|}\7WVէW{e33+Ke4O00J%hI2CYʈ%+K;>ݿ_}Jjm}6os//7JR\L:2 Lɤ9o&ia6G;&4#PM퍾dv% ^2U 4xڔU.4]q=hIڲu֖ Dr Pڸu$iu ( Љ2xI8+kSҜƆa8صּ>Fsv}3cV4ÕUe'80i]?__]0l,Md*|õڼ+yPGuqԌ0l}wN$}5M @bc_}zb ڶ3}z7mq#Zm,T'JYٚ5w~Uu:_}X,}-:Z/(oL3?,oRGd.N:o`@tfV~csl6!NrZ/OOqtNJlѢ>S>s.z!*__<|XMšqjZz/w77I4cܓڻos#Vc\quZ7O깒ƯϪ0tscE5}=OBIuϝu480@ccREE 2gǸWf];9<ǙBW{tz%iAY.(,t/NN]^LZUKn׭0[J~_eDNܓyK4]xNڙ^gJFfSzؠst ~Nڻ\ּxՎ{*݃E:wr?CG8),,Қ 㐠@5oV]ҩ"ZtgΙ-;v:s c_mYz C_9٩YnᆵZ48D&xӶף< jێxK>sj~ܕ+t-\n uIH CKR2̲_{vw ԏ>cěuYr\-䴮[HI=xZlv'IJ<|T>_Dw5ULqz+lijOS6oj>Q=O7l6zT֍Y5(4$X lG~^O~oV&"\׍J_|cV,Iڰi :)wwJﯧ}P|~YFumWPP`݇ IDATa24ڳ$%;;z',4šq7wMDSVڷPP{\=taC)~W~[?efeimU||}w뭩h_AIRݮ:/(΄(4~jNu)%-]Q[ɤ;'ݢ^|թGUMD}c:Qosttss=O+o~'"b ЁрjQ؊]P/?n5Of^%>WfM陙j޺ο55*4 #W׍R[:Z-کne>򚮺tTsez6sjfSffS'ޢWR@:K.xXO>ZjUq듯yZKYzcTV3~}+߮M 0*kmZumtě7~>up9lHx15s`T{mS궛We)mDk]?*5oi{pP^})]t0yzx8j̬]SO?:o"uפ[t߮t͗ՈsɿLWqIj^]:9m<nղV-tפ[PhHpsyC p?t|}}*2j&FaվMD CKI IڛcYUnn0 }?cPOz6M)2󕗗W̔Y *+;KAAAL;x{W;=Xܓ'!oo/4cl}Uiggy@Q<:v,Iֆ.@#_Qɤ\#G S@5% 8^xyMaʘL&W{n}L poˮ= 9EbZ",V7 qLCx~{2>5 XEQQ~c]:ss) D X?Z?ܰiu>d1[xƔ1ݣ,Ţ'̟UPX($Ʌ#4a[nWjzc|ydXLTzK@#aٴzF*w5ԩCX/ 9@hjDII/(tno:гX[ұcZqcܹC;o4%VM}%۰Q;vґc*KǎjA+$8t"%UW^rc=*Ԙ$ v,kZF:v,9u6sCuMhM 4Y4Y4YV+:C4&@4&Zh* " " " " ɲ~a4dPtdY%%i )J*w ] TIkJƴФ5w.jj.Zuҭ!YRNCWucT +Z(T`>5HoJ%t : JJ XVT&@4&@4&@4&@4&@4&@4&@4&@4&@4&zNdOա]>~j^$l7W*׭&r4tEp(ީO~0uA2gO֜}.|@Ϗ KCgu8h{v/6$*f87Y"R猸PT:< qc2<^jO__%^зzP3hr6C*ܢR5neӃjw{7GWRjW9ߥy:=^ yލS-?]sÇJ(vӠGfсU[)9R~k_Z+/g9sqj5j2m_am:s6j#wSriqWhK˔Fj,rWEղP٫5c~5Z~ՑBi԰Fm m*,"g&ь''['kh@bu*u2춒E57\9#ezv@SCƏy)2iEykvoޫ,cIמ5nїN_]EK2ONS\ɳY&d| }@9D{SM.nu=Ng.Oؤ„99F]Pʢ,ېu{j/\{CթGŜPլcw5;ۧ_>=鿕yjڐ|+NlLԦuRUfۿz4HmHY2,j!SRkѪxL/Gp;Ş;B;Ԇ6kױaoǶgWPi{6jź:x"Cf_FD uvgV /U)X֢TXDvRZ[wUa(nxs :GK~$d'R`-OҰ)Fk~Aeٌ kLEOrur[?X7)_WP7V/鍉7R݇Gt̤wRwTm\ןxu}6YJ5yE7ohle[+IdȪN\eE5ស6X.xCWg聛>SMl_6lW'u Th5 -x2=}z{N>ӏw5z4;a/嶪y[1'i蕭vq~GOYU Rifb3GELѺ|T Y:Sߠt uVOӄ[캡k)2 /_5%ss۱V57 ;GdbG! sс 4{tϿ)V"-XmR@0:tMtWӉF/O}#W5P]a1ꞯ4ڿMMOvJAu/jBϲ͚|Gw& =0}ZmkE@oq['\g~O)s?ӿqt=RK۬Ez zh@ahI:\%=InWMpMVuq_& -I&8<.VV!۱=={}0$YZқ.QYת=evڕ4C}wX{_9+IP?Gl?yTE"C+gk1Ѽ5]2hey=w( nZmlj]]NkȖؓf~~Bڼf W4tE"UY]:IK\2e)R]LIej4Rd&&J䒚5tdy oY-57ut:[%`fr\l-7%sP]1,?|jW-=uC@]֭Yѥ`kߚuJ>]-Aק.:SPcj]dܫc{0jB&7^~:.mӠϫMIku]Vs?-^6C;,yfqzZ%{&U˟_L}t.j̲]bqufrw;86TXXʲLVvjr ]g(~OڸҲWT,FMvI e* 7Zm+ |}K:Pm|)P<:ю62ɧ̜YiP؞xR&)7٥+j8Jw] {Du>UD?)jqޥS5룾af9d H5 *6)_7S,-_WӚv~}]N skw-АLaRppn&)R7 xd޻2~t=?+ž]/-RF&M_zg} d3 X!Ar2HzT\JZ^it*4i[eSL:ݚ0ʄ ӕSN-zW,e uYڼRyu_U] ~֊dШz˳6ǭkdTHWoP >QI4L~5 ʪ7k]vׯbK48tY%a^s{*$5]cdPjz Ifg`BytI`UYAA2K2Y̶K>R5miQ}ڒa]JǪ{hG-.Ww֥ާGƪ][] ]IϷR9W}L-f5? z}dԜYuGt<5wF(]޽xu5Ply Ѧ5xZm5dW}Li+}Zflvֆ5w\ulI)JiHh`ÆzR,6lXx( ҔN4{odS̜qfB6dK&y=}̜sm3}Oe2B ?}&FSk$w`p0Q]') !5|}=9U U14Ai. I$I$I$I$It-&|l3oj&n07"d?^N"ː=?܎#[Kte_)yA*Dڏএ_ËZ"MpݘfOf}q#6s*IFrt{A5F B3i=-J L(@.C+:M֔W2c>lHYXLmVHJV@$SߊmJ,"TAnW#t7d;Ihso/!DҼВ$I$I$I$I$f"Mhd[<[=ĶlHB  h}xk[ӿW6MD} 1⽗2 <;eo"+i0khǻ5Ў1=s:3fo -bЮǔg $VbY. ֙Z؃ #2ozޞ2FJ-npNEL7OJ,ƴ{ 6gc,c5$Xt˭aH$I$I$I$IjF4|&w?Sl+CNHQ\Zy#g\?H!cNA+7/m`{C Lz<D~ [%SSkE%%q"y0_;49P<yDR^?E8r4Iyb^{B걄IJޫ#ɾ/ʶM14;5ʦ ȋ$\² 7 US AVeV'J!:qױn6]5ٸߤHSdEHl;w},w/S?H^h!={$F?ӋwPqEG;/ԕHĊ=GV73?pwf)GX=|΅k'2xh?5(gycekc*''{'/_3KB>i8;ٺvOf[^Cen͟M|WK_2"+H.U~tiΉH ٟɷ^< y*Ry WnbWE@r d]p|s#3EDvYz N\;yه$I$I$I$I$IgZn?{>ʟxKص6sP$Bv }%VVk%JC߼]Թ h{-qcmM$Z?!=o:M0b%=g~k\;!M?@(!YU\k)1,C-C?X! )|db ^f?['Kv`+bO=qJǺ¯w<ϿfTU&IF"O!9dw}?J׋~σ|뷱t6< B$ޣ0Kh{ ZAn{h{wyh4$Ұvם>E-K$I$I$I$Itv#&d=Wg뎽T$sk҄mBDa+K/aݎDѡg_z?3 ٰl+7*Jlߙn]ZoUc5,[GפSuXj ;lj5(uuHbww5n^(۲yKֳ*fz0O;$I$I$I$I$I:X,kYA$G+1I$I$I$I$IYfJ$I$I$I$I$IXDK$I$I$I$I$IXDK$I$I$I$I$IXY=I:/>DZ_H^#I$I$I$I$IR#z$I$I$I$I$I$X,k@"I$I$I$I$I$IʂhI$I$I$I$I$I˂hI$I$I$I$I$I˂hI$I$I$I$I$I˂hI$I$I$I$I$I˂hI$I$I$I$I$I˂hI$I$I$I$I$I˂hI$I$I$I$I$I++%K8t zV\z-[$I$I$I$It6ݻ-I$I$I$I$I$)cED|J=E$I$I$I$I$INJ,5 L$I$I$I$I$I,$I$I$I$I$I,$I$I$I$I$I,$I$I$I$I$I,$I$I$I$I$I,$I$I$I$I$I,$I$I$I$I$I,$I$I$I$I$I{$I$I$쵳93fRv,%H${H$I$I0X͊ܭiawu~ Hħ%I$I$Iҹ'L2m+LEВ$I$INZ4cq{9HbYhI$I$ITÒ$=('2t%`(E-Z{x$I$I0Dm,7&1u˔lE`B$I$I$IaS' /Ӭ91ZPC$I$I!n{% F^r1M'DGlt$I$I$鬷_#Z -I$I$]kݶ1"('ҒcA$I$I$I1sfN!H$2bВ$I$INI2b A"SNxђ$I$I$ƬY~ H$I$Id{kW-;DK$I$Ikg)E-ZH$I$I$e=Ɲ;JNxђ$I$I$XG"I$I$)19ђ$I$I$I$I$I2ђ$I$I$I$I$I2ђ$I$I$I$I$I2VV]wI|x:欯.}bhVeֲL_\ ջXqq=пK3.`X$I$I$I$I$I9ɄhI$I$I$I$I$Iw!L]p&7g#pLUa{Ux"Ym[V3G;ÓW-x fL'u^$`ЬeZk*/I= +\n˩?y|1mZ6۷ 6/I$I$I$I$It1!Z$I$I$I$I$IRƪo~;IǗ]x'7*ΎȊ{K(^V. xm8 TRjY4kpG$MmIש©O0xa~a9,ξ0[A^ڴ`漉{vo @01zб|q,{]C֧eLD$I$I$I$I$cB$I$I$I$I$IUg n\@U&9AqTsUU%OLJ'+tp9X)Earrpo_Ժ$< }n*-2 0:k/IED@:uSLӏԔyhsƥtj>bk&аa?0uRmuh2Lb̅xk fOGQg&Y -I$I$IZ~ͷik2$I$I u^-I$I$IZƅo1{u}ϲI$I$ :8[:9f:Az|rD[UUMI'&$*A+HgOiWPФZg9P&>ݽ/ @hڤyyD*&lDk0;b!n{~+w|[-{ &-;kpnαvc2ѦtۑƑ8˧3y֔셦Fӡ{VQM5[˨SԲ%d?wVleޤIZAC:ehv앑$I$I2MDaoj9r39ars/<@qI'9)׾:xGx̳3x1=H]uk@vNx:''X+Y>|JwdT{a{aAUey-I$I$I'|??EH8w[#׼JaFr0ֻh}z|yG~ɦ_d|#ԟq'P*~-l~z6-c$VO{'Sydg7u>ZUt@قp~*khAOnϹs|s$I$ItV>$I$I$I,fDc丱 ֚9 ˶nf\̾Gd$ΌtmIx +g 33_?s)5vxҎ Nn,scݹCݪ捗fRt#GE$I$I|u~*NoBljTRoQ6|xW.KNeua{UwʚhIuKd^ (-@ㆭXq/KݤN%='LNܑn9$z>J^!:/o;ܮ uВ$I$ItLyg7$@D#*myTN7}Wޙ$_`DCbo>un|olwnG[q=̭Mu?Ǘ_/i~ t#ҩsxuJk߿'53{Ik=o~nw V}>+_z‹>c? (x0}c[ip$I$ILrP$I$I$I:ClLyb gLC4hCN3 ?bbhr{˚ yoSzhs C :J14@oMVoLdmp9Di޻(-hn{G)ȡeak~z/kXbhܮkZ#YHk$I$IRxsހBV0|d)^GE2BvȌ2f`f~5Gұ_EQv΍fui|AۘB*uuHމv$~ [m9:Yor&XK$I$I %I$I$IN]#bTik>=2b_|C48Zq|%WT$B~|=>1F3v9w`+Kh{UlO>3^ڭ;['H2qso&Յ^]MbKW'H w}Ң: A~9c$I$I2HD'MVd +S 7p+ɩNee%//Ϙ  {-Dkx&u#0 bԢ {R떈7:v2Ń?cT,¤ ߹5JNz''COE+Уh sCII$I$I9"=|[{&mO|S@f]r5xzHrtJзL5wM89Py㠄?<_{l1 %Q ;U [w' %GhEع?iޢE!'8Hj]_)I$Is ђ$I$I$)Dh6ra'E5gPa/-f7|ˀڏ>>WwQybD$I$Ity-7mps`wASڷx*:MK$…ܰf LNW~Z]6(NpIsx tZ).&B:#ةE̚ u_rrӉoA =iF G^enu_UK)I$I$Iҹ'>\OKj*fw~_yx/|qr )*BEH|CW Jw£|PkO99-Da{I4$I$I Mk$I$I$Igf]uݽ* A\f.K;z0W6MĻl<ĺqz4=jJ |)N8gMgY4ڒ$I$IuJ6@=cDmG=N=|d/L| w{_L~3+7/ { @a3'H=RL&|Y8wJMM;Ԑ!-I^ ߚCz  ˥穳|{UN3zv`=]p INL$I$Ia[SAD { W/_c"9D;hĹ/𿶝gfj8S&{??/mSw 7=lX$\x؇I;.fMܷ#+,^-HC=iY)I$IcB$I$I$I q.}tK+]W<iԗ y#]9n HP«,w>GT/')߾W|?_+ulx7e> ._ }LӪPtg v,cwp(˷2繿͜<~[ᦛޠ숴}Lmp0[nfnKiiFH$I$)yBt.`EUxlawymP=.@ux'9H%%ts'<@,;hjYYՎWXshs(۲,< y:wXSլq>uϟ(@_^6/+2VY}شwkj [p%xk>$I$I$,UM <wV7n}lxޛxW]8oZd߿-klʃmCzc>MC"ܕXo="[Ng9=իx[7ү{rAN5س}K`[E>sYL$I$I|u^-I$I$ItꢴrcŒ[ٺM.?dw$JA|_?JagZ<ƐoU̞nօ/k;dON_$[bOyũ>;wm9GNvWp3f%L۶Q6$I$INF HħfGW v\ɔ{@"NHepwxT$/}{3FU&=3.vUD*:}.NPSСhV2L:dH$I$I$_=X}%mgl+)e b漞:ܓ͆eKY=UQ5U.tҊqKa,۸X>-;V4<9!YQʪEKYW\D-* IDATӣww$I$IR_kcQ`B$I$I$IPtݒ.@Vc:J:I-t$I$ISё#djаaCUTUUWpTn"uZ0;}B#Q# iqEM?}13 3֢5_~}bz=:k' ^^?{5w.09YޠTt,~)ٺ$I$I$I$I$IR$I$I$I$I$Io.blu|[xеkEYYu++I$I$I$I$ItF3!Z$I$I$I$I$IRƪ={T{=,Y8JrNa"on+l>(|>Xr/ӹʱFS:.8nq Ւx<@VNJ6[oc(+ Ǒ&ǙSoc , mUjNN'GWTQ^Fy)Jm`2F  @:s/|0!Z$I$I$I$I$p&DK$I$I$I$I$IX7o>]5ons?ƙjc:鸇M#=3%!:ya23x}h,]8K$,Ūmuy'A:Q$h4ۃtw-xn&{:I_$I$I$I$I$IRu&DK$I$I$I$I$IX_1 2 [ 4iҤڸYYKѪCO4n @UUPt*=tsz4h@Æ ˫y0;/5׼yspȑG$I$I$I$I$IYe)I$I$I$I$I$)czoAAAm֭kˌNuNN>\z\d]zoI999;IXcv]{Q!I$I$I$I$I3!Z$I$I$I$I$IRƪh :3Ԝ~7$I$I$I$I$IjNI$I$I$I$I$I˂hI$I$ITcDG"I$I$)19ђ$I$I$4mV@iz$I$ILج Z$I$I$՘zpެz$I$ILx^מ'<ւhI$I$ITc^4h,iغyC}G$I$IRںi=M"1hبoA$I$I$I1͊3|8A{ĢhI$I$Ix? G'<'H$Sj{$I$I$L&yGYh>h!#hE,I$I$I:$ Jp,fOD2ᛉD"&KM|eӬ91ZP#JL~#I$I$I=vY@X =Z -I$<~Zmϵ7J$eYZrګ_#r Һmz?S?~#I$I$IvѳN$LB$…CFĘ$I$)%O62b A"SN{̜BH0dZPΜ~$I$I$IRf;KЭG%I$w֮ZvmYZt|$I$I$IRf;0pŧ=I$IRf+j ;JN];K)II$I$I$e.$:$I$I-$Vtt|$I$I$IRfP$$I$I$I$I$I$XA$I$I$I$I$I$5 %I$I$I$I$I$e$I$I$ItP2΁e>PE2C^LO]Nk@fMh;9qSV%y+%I$IT,$I$I$I)K-K) \$cƝO1k㔭[k)ٟ yl Zw^;2Vϝł JOkBCx^cUرi^ʞƽVǟ$I$IXDK$I$I$4$ AGE$>$Ύ%S$DѴI#b{ٵ=[0m.FË+4w*s̸֗h1cC:U`"yΥ{{ 7 DL)hݬ!ďB!B!B!_H8^&e4;FaL8Psۃ*QLSWqdt8S0WS+c,Lr*{fElYX,}B!zc!Y惍 Wy(I87044M|jGŋ4Њٴ!s6t4MCXA3d'G!B!B!B3FsUn@%lHPKIR ߿ė_ ;6䴋ҝ9!*} ~kA!BV/ GCg`7P4eo`[~EQ0aXxS&B!B!B!1,V@b:El '6Bnwe5z1gEiY0:NT(Iij[ Q2;B!8O^c}4q#IHTf8(=E8Io8>Ul[MT@xXSXxEʠtK5 D !B!b ,ٞB!B(4l/oe`2['*2?SW45 jY%84f aXVq6Pl@`[h}r'QY)ʽTB!FQ! m %uB楆u ,dcm7wX !>..;;VMIQ)؜nP-O|Tkjpa>fͮ().fb?Cv/q2T0Fڢ| jir)XÉL\P[̜ T2Y}ymuTWVSЌp|~GT C 4k+/!XѱUwz%8aC|#h49 $` %WQheGblx7ǔ{ uEkg63Am*@B!B!^|;*&X8Ztn\OFXwE ՗11ְïK2nTؚbï ^_?_T@7l4 JtY2SRKnm&MuN.14jYG4B!Ġpuw/b~j(]:4z{]MY=j*o$#OgDx [VasNūP eLү`f%Kp\h0΂ACjrٸz= kpxFZvLﰃqrh&jŜ;Y͞J'Z5_j<ͫW: 楅aj>Ⱥ`#g?pr<^;&g#+2ǒ6y&328uEqckގYǁ+Ϝ)C;ܸ\Ff|pMbLzU+2*bñ:(hDD5:+`mwnk<2cWB!y0°JHS2 CwQº>g}kXnd%c萊rWO f?(E=98u,YB~AEE}j'!!Ccoz )%|#du hSGM,ْCH/Yr1뾡Ebl=E-U ?>Cpw0\nkq^#4ٻl :~<ƯT" _,bL q`>Zѡq{Zs);W|Dq3gA}g;*/]w q&gaqҒ@B!B!^HZc6سZB{F>5<8cj\4me}nsSOz쬪v9n_%$e:s,ؾ U_cSHAr 8)ݹ"ǐ c+ejq)V#IH%)XЄB!F>Ę^39})dOoCUXu Wp.p8<Ȫ/:MD6WQZՄI %bEE>¿/CINN$(0),#N}]F^iáy^ǎ Mꇏn9H-5CǠ~7|! LjZ%ⴛYvqEO xtn|_|3rY,HO_B lB!B!NzRӉL[xPlXg= ]S1{d>*6!?~CE5DUv`=4艜s3j,UtF0r5w8}bah02A2#Nz>AYEOffyGꆋu/s\']K7LNRv_fs;A!B!Ġqo;n'(f?B9z2_ĹS=FlhhF)4Mw{+Įh/>cɊ_`(CS0 .TR+` 3ѣ❻9h3K'37B!qƑ:,J* B|0[mtwÏ1w7! ^˾my4LZHBT]mh2:m.}QpS{`$2B!%en ftslN $uC![4fOʣÕ r3n|QG^nN?Z0픶04JLlsyTL!?hWn EǨQB GllQ CtH<5G:574N]tMάIh ;dRVT7w=+C'#.]a'J Gdh..7 M? *tFt[؇Is2F~  dgmE!0u&Fdf$h6k0h frkx)zk ;vX}΃ӻظA>|Zk0tŜB!DC1Qf*~~V1غak⋿_O 󶱷F'`xi-{nZAj|[-}KI%!g Eۇ3#B!ZTh?vkth}sC;SOL"R-ЩUJ4BqWRQ)&NՄ-$$bڷ>4RQa݋#YЪ˩p{F%ddZ`W5N]4oILahR @£.\kxtm-acvkfqxК(޷ݹWPosw_İcwM5ɁPD+Ƶˆ`Uն^Q] *w~˗{;<@c\TVԢjn3U;o-bJɝ CkXu855PS^D |-^si IDATxX8nc0  EX GЩBHh3>4NCl*!A RL^`}}qL -pQi{%KRŦ0ЏtF 0d2<(ǀ{ㆍϘ{}5n׏8~}zD%$e2$ -~dN@!x\7Q^ͫj쮪a'Oqڵ\.1`:LV:.{#eݵunz~ucOz!B!sRu;8ðaQ;)q?y`uߤvnV1-} !B>P LC3h:P@GL~/, BkN9=sJNOP={HH?&ah OQfv z֓0)cQ 0n{,8ؿjy0O@qYU@?ȞGhcL:nNn§B]lGOg'tjw,峠9k\dďƉV,%e{HY^BmJ$u?sVduX;ˮ<ɝ}ަBZ;FNJ`IứԨڟKհ,";`9s)l2@ۣ+vІ)| cǴZQ0plhQFYenI!/,Hp"v7frVzPσKeڪÿ2wAǢFc= >X@x$h2 Cg x?C C z:5Uh$ve'F%:k#w-e_hT(~w19\mqӸhx"<>gBJ}VTFu輶5ӇIu=TUeg9z 93+ {'7@rWg< y.ti,[)Y#<. 32&{zFɾ;h+8J[&$P9W7{v4sQI):x~Pj5 H[h1Zn1g$ IDQKuROGm Ƿ3̀Ѵ}ȣS@Q u?>{Q^t궽{E(ԠT߃OqiqG8y th=S m\WWǍɿxOo~Jn]ee+Zgϑ\yCmde+i=3ӼV%p =]:j+GBƍokmB!^–0'%).`IxI]q6۶ib%>u8j( KM&j? l)4jrY v`Ca<ǎt1GDPUqb{C|[W>HQIT !B#`>e_.bְ@y]ȳNbF? VcBQ Њo&5sEjSݮd1EebovQ<,{3-ClF #6zpC* FkF4AS6O ~aUqchV>F]Q 2v'UP_-R^oaJ;ypףzǽg 8O/VSF򅺘eANk9}͌W5%0ѫs-5?{)%>} zqok>zh)CUj ?/>û+pvڬ Sr鰞J4xo+ߗ>)ah!BqԍPt[ztfN]: '--XW/?|Ya %uiJt wS {ٲn={ZB or>f)N%=Gv {x޻O~5/#|`Jb\V$WH;.Ê%(3|1L&FylM"mxkR dxj"k 8tF_& 1ȁMXs]R/%g(, %@w4>tYSHOƢڒޖąLVqFO!mǧXR>f+P{ch9Ҩ^ʽMJ+TRCw;Ie5Uػgq/OcQ=^xH>s?Yg㣯[׺mfW.a32Bbum!w,p*G[haƌgq ]{=ބ0d"MNU]9m(f{j^yJ2}=3unGl60i&$b"n+\aBRe"3;u<b 7>߰lK);+jWཻ#S_TZ40ܵ|rɜx͏igO.^+d"ˠaꆗڠD1Tfe !ʪSW5Cv!%=äQIj2?N^|RPB!Bw}Oڑ0 N+dŊ4@Bжcޞ2n^.FWC9y'& s z0DŽO7 ~sXݰ7ZeMa62mzgԗ绻pC7qYz7-t)=˕_nKU& ]Xp# ; j*LJi A~}}lCBĩ(0jvCe[Y~V {ǂgvKH'3If0+z5|q6?}(vj(&^{Ix0'0qB"Vyeq$D/=7wݷrCo(i53l'm][>~aD;7SUU]k}úns0fsQGpYN\}G^[!U>+bH(ZN@4ҳ1]f׀z;0<O\0Wq٫qk"k:ܐ儙F>&xv7]6!XTC'?bڌd:8p3^FWĞ~C/?{*u\Fڡ+os5b{,R|ѥdY*lk00gNV:)߱؞\2y_!BqϏO2hgᅭ ,b^\jmOsfb2 C[5?tj, 0Rpٯ*7n GhW.?3Nc 3kyYy?{ox>Cۣ^~o?;Cϣuwk6|\7\" !B %S0gS= N'.MG`H>= +"FNf,ꪫ0LVB ȊKRDO#, )ZnJPxC%B1Q8V~>37u!?5߬7wx*plxG5qgNg_>o!_^wRμf}=9u84Xq&3z[jRBȜ:ݟn8Kɯo]ˤL 7} &y.G͡7c3oz1=կ\L~%@E)z9?Ť.f~J|I~_Ĵ\ehTUVUdԯ p* 󇵯uF d;osLH]hNudwKe104nᇢ;{qƾ%p7?30t KxS>ʣFJz\t|2j?y^GOct^^͚~~MΌ_ջ% -B!z0'3Ro332'<~믻[%zE=4 vbbnۭB놄T~vaٗ4:n躎ihE͂(5uu=ƌK)vu'bV w峭ո}K=7Cmhr:f5EkhE4Y\|F,& l~`]oۓG!K@(Q1'$1$9BzdGRr2 1D" `eȐ!$[{ HH0B! Ma?HՎj%,aO=3j0).3&12{eSLP\*3κ g&eGPObxzqf&GLd(>,"NN!&}yJptqL14 l'K4=s2CC:U|#Ә{L}̘MԔ}Ꝋ%0!iw$a[/ƣ;RۑcYh"z~)s9T8:N рZ8|ɄsJ6qƅ ]q慳xjծavuB2eB%EaLo0Fg&̡"'cQ=NӋX* 0[TbǬ'V(~)VfӉӠwtF/c7;p3"~19B>~&$e<=B!h ERgZ( =¨9?ۯb~Z՚{4TeM|SXp M!0Tb&b /X(m4; z;r33%グu W7|K։}?tFYd^n"mL:=u<0V!B!BcD%*e2 R&ɆS߀C0ww^L؈,1 WS Uu4ڝ` $420sLA$Gj*mՂ_`aÚkz -乿䆹=\ɧ1rUu4;ut8pFί9n^go^uAceZďj?!BqI(Z'*߱?TPL>D&2"}I> 12gylb7DA$m|r.,KyiCQZOVzwD|<%Wj>[,~WmFu :X RfSWC)mB!B!8Ts ᱁s@8q}o bjD>aщ} !$D˨1T""ZuFx7wV"S@K(X,V&$η̋  P!Dc1+:juW %"U[BG8PhG-5:`&2f׎y@ `MIZ!B EK4sϛx 53߾˶`鷫YawRc`׊Ǽם>XE M:WzPT,!둛"p\oh*I; !B!B!B[pgn\2rxTUm}ن}XijMe4Si\||Z6}5>??lhPG(Ja:YH'l;w01ld^[Wslb(o= !Bq }}_)a蓁~4MCv*(uݦ屎ر>g˅!F38/mrv '6 tÂ[ J+<_zk]nflGJxeD*˩ӠƖRDuqAJ? !B!B!Bѥ7ݼOjdVkl4SVQFMjZK+o ]2aկ4jjzȵ:z + pF ?[2kJfԄvhmZӻ鳝fDˊVΝ3#Qm{xkx2VB!yKj .jjMdgusi) IDAT-w;RQd̻G_Sٰ+)/h⋟HZ _Eu*sjj뱪 kܘAMlflh[ J!-=U#B!B!B!`9Igll{Y>*A11tyL==j*lE7j,B;߮ P?6 lR@i#}Pؿy+U]̷5شhM_Ԯzף;)dZPЩXg{D H}Ơ:ryΫE]L !Bdf~18ۮnvHy#㙺h1t ]wint]Xₕv4w}eyՠьz<ː14mYv6xmxW2)`4SSk/lښ4˨;a&0y8,זU:c}2'B!B!B!'c ]Ϊ/n(_ⱈ9k.sTkY'z :֛k`t/ bbQ*o6^oׇɬc( o~V{;(\? 42Koay*ÆV^F=?w ^3JsM'Hmے='Ọ',{殏 B!BWFgf2:3XwC jfeoJqzР)3T^Z">?tQa4k|YƘvw8*+<~8?ǍW>J+i?H5Xx*Ak;y޻w֑7decNhL~4j86ǝ%+ӝϱ@+f$_!B!B!B!zmRGJ*Mh`;7f_Ȇ)r}.N 0;_||Nlj1ʟ1€QcG3&Jesq-K_z ж^>^s~ٯn{ywdw(D__ڍKQ-Hd:nv4R]vXg|93 7OԊe,f’}W+:nJ߽a 7Bq[yv{ w6l^-5/a~ _{|\g^7x}XB!B1TF\k|TRw\cɌV]4G-টk;ZM|?YǏ #e(1aؽ-P{#מTuɋdw/3Q<3f`6vNNesьKħQ%םÚ?kɜ}t]7~EL&3&0O=E `b1gZG~-0cR@rcKө 5}mwfvOTϖM{)w(>qvjK"Z!B!B!B:")Q w93bDa>ƒ;_d7sT&F^žMɩqa(V^0|Jj3yeof \iE򿽽n^ \߼Ξxe$R¡:w#kvèӈƪ=vDw21,~:.Tr/ǰԮ}.cjQk;U>d&_yi5OsW&!B!D's<`hhLugpm_I#čbp?P]pM#㑗wWQYۀ'dJ" :gٔm65.Dd= Z):>rC^m:F~\X{PeS Oe|Mr~Aig_ξc7 s3sOn2<*=q BLF ŇmסضB!B!B!B(LMsK6~3׫MpNrJkOXHd$4AvoM~ /Ѥ'b'0l®5}BIJKfB?Bo˦Ή%,̱n0 G;PPQGf!(*Q飈< *B!~%@yCO[O~vڞ  C UQQ: ]1&s e=ӊ0t/A}.ˡUTTU=B 0ZSGQ[^Ku]@Ťւt]6 Dw'0 4$7P7B!B!{g?qrޑɓvq{"@x#!szvw-8+DS0YI:OǑ9=zŏ  ʺ !B!B!B!JB!B1$8d{ !B!B!%3#XwAx8x_d%t߷v+J ~kf~gݷfCDDDn DȈ@X7{""""""f6)""""""""""""""ShKhKh+f@DDDDDDDDDDDDDDDDDf+m:S0~ `8>4#틈fa DajNDDDDDDDDDDDDDDDDDdM<&!:usG_ _[E+A C LJΝb܄ɃoNDDDDDDF@ jt[` @ D󍈈^Ab1`qm6iGK{'Ml}5gjy3Coh೟W,w\__t6t A#tspEDDDDDBsjj 15in1nODn/<߈OYw-1D:mC֗aacLJ є4` cyfeƐ+""2 :]0y:G˹3'iki&>1)Fo"}Ot[y'XɣXA'"poDDDDDDDDdt*m kLNg0}tF5& N< {+C䄵dlsYɡ};1&+8,V+w޵`͚ʁPWS"^Z?`M[d"6L^Z7L{-""r{tdf=6w̹ANDDDDDDFJw w/$נLLv1rvnW~˪>Eژ0VDF8߈购h[l0p|:UZDDnGDG(9{6vo;61Y7a2a9yt?v 2qܽ侰qh#w-pl\Xְ#"8߈SaK}w酱 ?]6}c`&Nh^DDDDDdDg>w0v111ܽ~^r_Xo5 G>$n}]fƺ/"#PoDDDDDDDDd.ׅ6D<{KmX*C{(gʦ+Oo-Kdt|+54}X$d2.E%^K~f=FGw =zCȽ>"Q,?wwa>ʼ݋/T_abO 1|_$!5$=Kp?!GDn}C}iOų?J[wpzl_~BΓ_``;(;r}V,`m6;K?ᷫ7 'LX>QVMwy+o9F<>r09}8ƶ\#Sϛ.Y]7{!""""""""""!HD"ʲ8:OѺVNTPe[[MoOkULo l ΄4]Q]m455`ˁK?7w;'EF[F!yHwNq9)銱%;ߍ9Tee ru1N{FV w-ك%L܇_/G&-y}}ls/,}/m:O:͋h+? /FTc,ÿFbEJbm r P ZDDDDDDDDDDDDDDDDD$ J:e1)P'^' 'OC@oIy ~B·O~;h] ><÷n#z ?yI\i%?2!>+> LdƘax%| DȨuj6/pE|rde^_iSyh=ueUY5n-I;kp?I mvSs^J/`B޶gjhF={ϧ Ke󎣔6vaĤ3E,Awc08c'V3~|hZ n;=8~9 ܧ.hUs 'wEmdgh,zͻNRÑq}6>m8]ƌJc%,9ga[)9QNi%1[ EDDDDDDDDDDDDDDDDd(<;7go{vƹ"ʲ?&{߿y P0ɮ5oQ4&pbOe{7T'2Cs7_7(]7*o%v";+Ƅ ow`Os 1ظ#a>x+}yuY|&Xs?0/}/T1kO<-D=>M>o(!O33yoQb%rK&vx̎m,#2(-"""""""""""""""""Gœk'N]7rHN:d7o!c-- 3WOE<(Mqdz?4Yؤo!>vӢcRq_0&El|`?vgC 'fsSz`#/c}UHI3TI{ #x"#H9-l+bS.w=˧<`O[q,+p1φL18h/G+ڹ4aOʍpR;|ww#n2˖]{DDDD6veRyNE]+87u˭t^(VN&z&?XL:`%XkmD[Ɋ:sukisp\)KBwO]p/-{_Cぽ gŋ`-~}g C`#ou;c:_X:ԑp2ilh$`dS޲'7;?ޏ 'cXU77g -2A0 ׭vgM^Os;l/jga"!> kv5EʬEw1.(Kա,`Kez~*o=NQzp'ؗ1'#D| ιgi3c0[I""""Z9VY q5pZoJ;Wpݟ*@z^;҃iIJ`_wRjZˮaI@-D_uE2;zjs)mcLb\=\NQu<}#<3¹&=TÎ> խ ke>Eq5uOMcvUQ,$' d\Zz2.=/&ue% kQN:t#e]X'0#o$V1?uja6+#5[if&=GYz 0ÒLkx0fG]oZpw,@͛9Ȉ """""""""""")gb9K"ŕ@%tuƑ;P7S\T4Hʣ0'sʍqȌlƴ'ăke]} ~m~s>7ZO2q^}1K䖡H C ?E_S K[FDcCJ̞6*æ=HqKM=> YL=̉ؾw?{vlbTNJ5wd0mJJ""""2 7Z6QԆoZ1S{N"R֭9Bi1~w@bz%ֲ=tk,F˟z@™>@#~<ˍaƦ|=ܿqbM'Og~W O'_ `$_8 m~[h7@/ E[y鯟Ka_D'췾r~*Jtom۔b!6.&O!SS]QFG{+`XJ0盋~ CM݃v2y^iD]1dV9⣫Y2!r-$xq.bv%KM?a>'9v2'q4X CTy#H9,'@bN. ΕɄ‰dũz\۞^u_Z36|PF-:֞c6ݿ$j.-MWh޺m Y24?a>Cl>2sN&-{9R%cǹkll K(;y//<$)3LWFw UԴz{aHdBD$l昦ɮ8{B""""""@0fN8´YqT 4Mñ{|#"""t56̺'ݔvi:WLc\7 ,J7\_X Hșœ`q8Rޅ%i*3r10<}t ޕB|Sih{ uhaϬS'Oh;9WSdJˡ5oP1+2}C%N+"9%-,2J1qXi%. "#taz[!py&G9$zt&%wT{L,IL㼐} qDƞMyc՞q~DDDDd$q9(nNRY.&]ě=[ʼnkt\쑈{0g}r17 =kEDDDDDF4x08zp/mnc`"rPop8m -)2x 2*%GMӼp+`!6>w*A[@c ڎ 8o0lvsT#g& Ӱۍ4_YObx."""r[<9wg'M cgЁGs, 9SҘ2c`SS 2c"rpo2a4Eٗ+-2̒#MDEt0=9x `vPErLB ='鱑V8} ŝ;NG"""",I#j좧7|>ܝ]DX >T߃ ƠPQrq -"""""2r+VuE٥6ED f I̾{/"WQHݥ,JZ̕h#f,YIE47h*))o:~3Xb;M0gc~ E)ƚ4Q\t``&@ BtyLAƪPȕ+gijn!)16,}hni4M@9.7 B )w z0""""""2'&::[hSDpoDDDd5޾{T6{h:G1p1q sF y2(f ܁Kk9Ǿ#xL3)ЁN=ۈgŒ|iKN!J=}6kmb8]*-"""2|mef%hhl0NCc~g%3wEDDnC}eY9nJDDDDDDF6-}m󍈈 Ă-2( IDa#i\̎$Tؖ>9yle{PwWb4V_;MMnzL0)L=183&1әx5äs,M :Db:L)IѥȨ`1S0߬~#_y =E≈ fU(Ǹho VO*dbF gN[#,F}Mۥ6"]L9맔ͮ2j"bTB?Θw339|-NR&ؐm=Y xfeIŭul/jы?`Aq|vi9.GXQH`Ō'HOg;]^==HbsFXذ<~+L{ :>;- }$kƦq|IDƑIYd|OP0`~DytPuG2=f.xgv*QLY)f ppvNm]˞FH(6xDDDDDDDDDDDDDF,EF'EDDDDD#[B?B$뢥cOR66%.7yc!cX:Oq7SS|Cb]|| 97Ru(-""""""r 2$$& ;':qy.6J4?NŌ%n@ "*+bL8WFUMN"""""""""""""@ȈP^^ kN쬰)CŴR$7ֆ6<Ȅt5kIXRR^UOK 2&tғMmYUMxMQ)dfSu"pxƠ.L\JF{ ":W)qN$:homZ{5ĻjXMJUߏ&:z0mNbL#1qnl[LCtlEDDDDDDDDDDDDF6}UVQN$ELLc3pE ࠧ*: Qqdd= tGJb$KsE)ut qw1@g}9UyDD%Gf2ifwOoUl2_o:**h3"IfLXRcl\w f*K+kgq Wf7` Y;K1>dqڃY{K">vpKwNaYM.i߷1BT;Nvm#t_1K),Y>7{g;{4x,MDz{&|Zng"W6NL&-cnfT`9?`kƱLߺ-L](i W[}d'NW-`_>,oo@UוԖH2f.c8,`vc˫Rc22f+T8m|RgYy|3I(e81SVš""""r:e %}1 =uʔ0NIOuGݜuaZ$#7=h`O7VV#hB @Q8|ZK2ycq)9WAc&6Jz?%eK.x{ =[kN=WQd73kJUf8Ff- 2nvQU!a >d}9iqƶSlۓKҜ>UʁL#%br0so]x`"bAZ+*fwu -k6qC[yi`0وǢ{R-U{ظ?Mlr֠cW]NUOslEDDDDDDDDjo}JM~q22FD?8|燸R81}6#"+#CVp[EY\01:ɓȈ˛ 5s) UN+@Z(ĺ\8 0{ܴw4;i?`%u\WKY@m9=&2a00w *~[R 人v4=s"c 0Ts)AeܝqbVvĻLK}? COmdTWP~᧲qwz#> i`z( (|M+zBEpl <|s-cX'X]$o>Zݘ5)š/Js@+qlEDDDDDDDD:6 SOa;+'2^_Mc}ݰ-""r; Lagnlc2BmC 5 i YhFUZ yj1G|T ;Ѕ\R]Z VzL Eaf[jI9ݴtaf D;P֒D ~--ta<Ζ.]H欻z뎥,0ll,xR8P>q ҧŮ ;v䊿vٙ˔(Ο줪, :N7 vdrCgEDDDd~ #WD4z Xl8bIr%XAצꤳ%h\yL:)q~`Zyӻ|՝-pX#yIz뽰oIA0VDDDDDDDDd۾y@0EY9y,^[ZxODDDn#"}a"zJ!z"5h8lWZ.=/,Z ^^8 2z&9{ `؜D^#/n8Ax\v:ט` i5{)وgSnXlN:W9~~H[}kw f#,, !ZNsa:S{=8n%nj k,qc8)w̡3&? זQ\ZIeM mt;i(=NCiNN[f9Ėn'TFY,nDqrҼNPrCOFE'0w›6:q즍ADDv02 uL{ 7X!ļDZ>@/Hq&ן`5/oj7{.7g0goTN u5J!ә:{*2&\{x%eGYSI$%E%t`Mdu E+ = 5n4׹v &=wPQ̱(t|?Œj_tFvLN._\v ]wh {WI uvtlqHpij-qpƆ6DDEEb~7n}[FFi@wCggš]z'K8:fMBHF@UjkZmZm͐ d{~@$ I!C~ȉ\m[V5e5\V9eں{7]5eUAsmRʬ븻7 ڢ(ƫ)+Lwݦi\Ξ \p &ܷB6'ӣA] M \0|4v':"ջپ p[\o|\DDDDL\ SQQM75W䁝< N`b'bvxndR#=(&G̤^5Euv&HBp䐙8<硿nlQ} wbA^%P7N{aSNvm4]\u{6>Vpv5TV.,肫 EUEe3,6ߺ| jْGaAG/[;ؔR{d5i^}]JRAuaz1hW\LlG&Va209'}|M.I(36{⬲~=5i6x`3\ A2~6fm!N.S9'1x#˞ukYSC"-RR̐3j6l&x.] XBJyS Uy9 $:ʷ:\ձ(߳]M=J$m.`F~rjҝ(O R6ylݼNtpӇQ-{쩰"** ٞҨL|b3W&L苏iQy <6Czun$u˭%>>԰?q+W,ݛ{&/""""^~߯_{!!22=Y\p' ZMA5l{ 8Z ofw!]|  Gu%e򧌒RlKhtod o$IUÖ粱(o8ovҷm%鰳NP'i؞[d gH;vrcod*WN ؽ營DFFw9)+_K瑙ٞ_ 6O#{׷]02?"K5+fYTp!|#x/3[9YoɴK/}Ŋbj1q #WOÃq5co5q+(ix#SY;d0`xO,#?hcADz䠲`;r܈rh9( 'pZ'Gݣ*r6/`, <{ &޿?RssPREΦ,YDoXIU^Q=5$-˺<;tԟf`p>AMd@p$kbU'^,V[Cf5@nv>? I59}⻱!7|j ӆif8~w&]bmYe),,Ei&_60<3nYsْ_D#mCaEdfQV ^rŋTpYn|o7J- .fnj2ã},kس~1w&̞ʬQtFۆx:Y6yȉhL^)߿o>܊.z`+)%&K l]pmcޕ/*3gh.|;2b0\']1YXdžWqD|-j,.{)ۿ>قOPA>8SKe 8P[W&jaj}XOރ=l]bm{-DDDDDsf0^JJsQ`>&#0[4ߍEfPVn?17L+޾vgL}=MܤsY8UETgV|%'HFL`| cb%QpZG*4rݰBTTZ^+ =3 \5;(+H'Qp fQ 1KDDDDDDDDD: dIϓ*Z³ { ^5sn Bn?Y f*Ys}ͥg<78={g?z;GIGtBI& .9+6bf*)L \|ˆoQN?K׳lR uk9y7KkkU$""""ҩ]p-LhN}xEOFeSTN5.x/ᶁMLÙǀE(邇?AA>5u;h37sϟڢ&i| oo+! rr;@Ew !#֑G>#g1&2p㌩qqB7b 75XNx|J5t˸aZ0t}NS$&r6x9=TE$%/ QLlr{(}{r`.)uRMrZ=lK*ڶev_ݏ 5H!lgGU{瞦 ~3 Ze]]n;$c31TsZ6H%3*\ $f(Fzu#kV&i9%5ocqS>Bp|e?:H^ʜZ8Bn1 OB"'lt̔.'Z g7{zQ87j0QYkMPH ^pDN'&~p[Wn4I[X.9Kk.㗈I*a,ŹVR3t ƥl5IWaԡ5+]z̋}pCߣoDž75*9Q^@n^1*kLgܽ }w<pc?,?/EG4q\DDDDD: '<txED.!tiB0 ԪJDDDDDDDDDDN|9k5غ_m=rG٣K(-Z?2xGYT]7Z^^S4?v/l=E{z՟e 9=>>ۜOmWON{GoGεl˯ǥ}|ü:J:0gx6>|Gxyf2Jчp&xoxܵqI_:<+2am,7>e;={ }zp?#h34}[b`s̹ALiU,]'_ wP"ۤe֝*tŷK]ZR@ ~v ,2?uۨ"qG |{]EDDDDDDDDDDDDDDDDDw`y08s˵6`8~2C] QvT]w儤]}(KB3=2꾋߯'r׸R/S4==gծv(pkΙ}p*NaXyn'ӯYVF^ |CW2g.eY֤板PħqI0m+7EW5 u|Ҷ,c{n͏`;Awp#sɬxL@p7od رo q``L8x? oOvWb Y#cw(]`>Vh?4E:EבTb ]H""""""""""""""""5k[uÆx"âlN9Ý; dѿ;jڽTP=|bv.#Ї s>ɮbQͤ|ˬ(p` OoMoo5|<27?Kcǣ#=O`Í~=[%U; ;?Ε +xx+%A҅$f&ם10a۹{˻5UV|r%#oix8ɧY qw1ʿ.r}-~>||1@~ytL\((.~e??  YTdl`S?4G/0u98߹+Vh|,j |bODDDDDDDDDDDDDDDDD:&<`%Cdr0&6TVboX/ kw.y~ 2|\򬶫4<x?& na&ְ:h0OD<|],NV ;/$vv~!KJ.a9u_Ew8 ެ4Z4 o-(awcbjXW 3bJ(A.sڪxq3pwa_f=}kٚDL$/u5Kt-O렋gӱPpqOxi{-IKWs}aR I1WiU DRlčeBas/PoZG""""""""""""""""". ]]ejj~E٪ mb2dz&܂Ƞ2kkJ Q]̮06 GKԐ'>z>+"5Zu0mRcU[LauݤkؕjL#IB??yԦ&N+ٵc?k0YN>EN)>beH+2 f@U@vn-߳=5jkyJ(*q`_G50o*/|3 IDATh%n:G[X׎<ph%0q%0(7gzU*{u)&S*@ p8)(:xClsT(iS={f.!^dgW*M"18MTeM̺ yYu #v6ћps ) `?+brm^{v"Si&Sn6uUN8|XwG<-CS ZDDDDDDDDDDDD*cN0~DDDU6~DaȱwI"҆l}F0"=Rs.Xiq3gQgVWX`P*hjgà{ni25kQC:Z+SHF$%N-8Gp2w2J&1.*qgiLn̈́k.8?L:aP#;, |c^DDDDDDDDDDDDDXŲkϲnb ri'֭\;>˲n"rZpʥEbɟ֜<_] \:9at-fZq'gCAsՕa6j,0{Ac(lؓ?_?+v}DZqNZ,l&Ul]& 6l`_sQ%80pC=N\^,8ADZDEDDDDDDDDDDDD: ˲#qi2| #0 6[|9Hgf&q,_̲+0ZSך5k6lX;Wr:q52)<{=^wهώj,Õʹ 7;/vgdo5WM,eׄqDݕ\x[ ..I u;Lkog滜B~~ގ|[h lQsG/#5 .`'?Gtg|;?dGY`Ɲ%GFxQwC'n>y&&MaW^EO_$_k9H܄`r7gNpEDDډf#$43\ĵ܍`;7|.MDڈ|<~1ݝ +y7jNI^:y2U?Mq6ϩg ] M䛏μa_~&!^&cZl~6zWg,{_fe˵wH2鿥x-/9$U7\Ъ"wBf>q=SߧV^h1qo|T֠teKdؤ7paϧ=Ja'͛<Np˹! £}m3"/+d8H>?F-e]9[zEQhN0?a&^y-ڻ$'4^y-+#.aA]tb V '<qc_(>{>!Ne"-p"t5mߔXM؜0[[Ûef_9O,hk\=ul6gl&<}+ 0'ټ|+32wT6K"p c҃ƾ=h7><0i}{ӍDy`TNfQ 0ѧؓ_MpB>`'J3Xa7tcY>G2 1uǿِ߹|8`0񡮔ꭙ;Ɵ#<1c?2}A&>J1D:SSEm$8Hw o,av-b8k,\37__saTÏGsֲ}o.%UZTc$gl!vWVMu -t7_~7D5̫+̰,n^nzMG̯'27؞_I=O1raGtn y;=.ضG&^'pǃq Ν>os /"Uӓ?M%<:^ǻ?)w?g/uѥ&( -QN ~: c҅ޥl6v{m-6QkkE:׈Xn|;H,'nbqLe:n9r1?ϿC~cq}$mEzAv7_¢wZmJRw3- 7oC"7@צbΌ}|!?Ef^5 q+o};&nf"*m^t!OM̀gs+g'[v{g`cxqGG߆Cl >3Wo0}b1MV.Ya(/""""""""""""r*** 0K;W""""GS +9IvVRCvVANp G(z$w%Gy?".d2@P{7 cln!}ҷ:1;1C i2hy ,ؗFȨ'""""""a4[n4q88vLS1Dּ4]۷PUUfsȯnwH򢴺5wsuB#tM9;?]Q9JEDDNmu~wKۉO '++pkVX@L|v_DDt'Fnn$%nlq1""""""ұⱼ})"R_k^o0ȩeS mahJf_"RUUɮ[ڻ MfcѼؗrߛ̢y?aw֔>ŁnѽؗL$""""""מ»uo0H}yi"-9.]BY$vDDDD:.L>"3~޿_ppy-""r:jq ߀p!m仈HgEIl-/@L$qzs[B9]FD:1;C7fY]w2pr>"c^쵵>{%/'ACG2KZ}.ΦGھWcY}mDDDDDDf,CF1}|?x֮`?<!Ck덈t^apw0;<9͂9?`m>fcꅗ1K0C"""ŁhQ"}o*eزa [6[Tk-"""""rr8g67Dz,z!aVc䓖'_Ljȩd\oDgrzV""""""08K:b &)q yVf܅;k Aj"""jZ%m_}#+cWR"e/5}ɭ1H2_lN:40d CFb `sټ.Wu:n\jHVכQUU٦sKR=ڻ1n2Dw """"BA!]7׶w"""rZ% R?غi-RPUQ~L׏_c"w,I[7?E86ODN='zXھEhSĀ.\p/(xm\PJ7.EDڀcw""""""""V1z$7N׏c&w"҉0t.CDs&SiHt_@PΧMd_oDDDDDDDDDDDDci@eY,_8顴H')ˡ / k1j$FO80ZuoɺވH*h˲#qi2|8.l֘BDDDDDDN1vln\͚X`6y9Y\x嵭Rl|oQ=b4VCDN}BRرmK\oDDDDDDDDDRs0EKH˫nN6A3=ȵUZ%|v$n?0n1l6!L,_4կ7""""""""y9,x ^!j{+ٓ]KrsJwXхyX<4BûqUޛdy% ?0EcֿTZD3z~E]oDDDDDDDDrX0m[_a{㉫3dU5_T?`gVoShj _ΰBû1lxv;W-mxu}+ -" 7]oDDDDDDDDz [_=쇛k뇡 \ g\n}!/t2-; ~  HݳcoFiX"rCMr)5Wfgbpss:)s9-,}S& $*]E )SM1EDhq| Z'/|}<+*eZN-[O;E_uUxzzP[[ S#f"""mNOEDDDDDDDDDDDDDDDDI˫եusEDDDN>#"""""""""""""""""Np_hZDveuj1ǯ_K[Yr%ӧO?8u ={ ,, =z-RZUE$gPVcLd{Bel^N#r<{UtZ_O!TډTS|a}<~~x[5Z =~NS=l_VVOEW8h&wۥ$T7'&q7q̈́HۯL,{;׭eM]T}k6;w~NMgQ ӆ/!H1K.?aaTEu֬]=%8RVcMA٨S=7֮#B];<EDDDDDDDDDDDDDDDDj^twN`x+o^H̨nɎ󫯾 NLL ڵ t ˫* |;`8yF 2طn\?}W^n]DzR]](}PUe9%޴>+cN,@tZvw6x\_.? dwmiNXy|g|7_:^~|V%g3Wh})?< Ni\{<,SD[>~nڹ2GO߷:lZEI Dk/eWʨ=y/.WUU@XXwgbb"CfS_*Z³ { ^yc_p#lE<?t31 }Pl߯=f>9 #]/ܫ/FOb|ԭ\uY;-r R ZDDDDDDDDDDDDDDDDD:ukv؏?|N&ź7ZURYН70}w3Lk){Ĥ\Άo2gx GQ[c~DGcԒsWn'%rocؕE6ivFHJ&{`}"RRb#(c {Y[WbÞ JkHFw5evץW0-7q;EV,MnEeNVl`Gz%tNaͪ\6/YȪUϘ+um VjK*YXt3# soz#!{V0Rp q9( ,^ 95J'_z34[/aWRٛn4b$ ߞ 6Zņ]+sL( Jl˱n*ܹ*CWt-Y]ոkҵ\븶S ZDDDDDDDDDDDDDDDDD:C\l_9թUGwNiW~.!%>c>{JG\ ѿ}/MCTg?NlO;/vAJc~~g\ DEDDDDDDDDDDDDDDDDDt5l_Bm OfRVVa:.g#w0oq12yPeKmM wlϰ&5\4C,<~ :J\0Fif0ĤY<~~J76XaU<˟ ɏ3'3a`AUd&-I7/wbXPmwv;`az`y݇,a.#Ԑ_dւ{ס=i1a^XEi=lOFL^qi6SpPwbWe\2]DՓh2׍EٺWrs%JaWƝS 4aQ5QDŽ%FU>Hqn(uΡKD=oʠ26gofe>ֳxSG[-=ur˛Lvۺ2aĄzCgGp:2I @rL9O||}6d8Nm3G\\tqtѶ """"""""""5k[uÆ&R!pd~ rŬNi-KX{ jyqn1ӌm*##㸖۷o8 IDAT 7 @tt4NNEٮs;{5JmG6jNRSIhUKCG<}e_g.O%;s.߮ac܎v~ZL<3|:`T0<\ޫAX֛Vw1sz^>^'5ZC򗟳Åa?me??<H~;i[ށ4o-lt.v8?\K28o¤w3 ȴ벧׃77r=s{ggz+\vDU|S.s9+ 1fOi|s8T%vV,=~O[Zn~`ŀzvo(6#l|~{x3Ys_ gАx)??eP'qW?'aę_o%/\g5] D(:."""""""""""""""""ϰ(qRA^6,LeݙwDQj-#E^nv 0r\2 9segoj!.]΁&F?쵃ʔ sOA+ZǻYE$ʿFah3`Vqes˸Qwe9y8PӢ6K>\Zp=D7z^ vpd2^" ΂̘2ٻ(=ߙMR!tDK. X"z`DAzINB{/ݝ$@Bv!u9;wz_.|ѫels _ajkNAA.UPP?6@ӻ\|AS|k$T1biٻ'[K!/uT/AAAAUsM+]!\#R?Uq3IUxa""#U8p`~Rt۶m 33~ٹWS)*,*KX[TڡdeI V5=73&:˾ ҊBOo3{3z1Ĺݴ4`5lk_NT@Ї:`kb8]M`h׸յ+LΪIYe#IAyؗ^g {vsI"ý\0eeXa~oFts2:gS??΃Y(mGMws_R 9IƸ833iiڂ2%c6д"|L i|)"P^S;Uٕ~cQUWi٫, A)"-    աdggCB\ q1$^ë! nH}888    LgPyL^`GtZ;팉REq`R-BDupUKQQFf~4YPƻ:.;;#ݮ8sǞtܕRU7p)hUh--VvppWͭvI@=5Ĕ=.n(ilqyRv˰qhwG7$~%Tٛ Y~!pEX; #-ԚVY32b("~~ZaՌɤ/wz^+fPCf3RjPARVPrvpvqB 7|J6GHZ),JXbaKJj}- \N,pvC$]}_t *H+G\mX@\CVZ7*&e BE@    UijUNh..zi)Il#W7+kJЍ$\!?/D\ z \բ    l_nm}8nWxVkk%)ܵ$)'P@ }ZT(xq.H5H-/KNyj3[<Ӿ2t\U²P6={][{mkKhh~(|̈́ ,?Æz!]KhxxfCyqX3n!]V%Jj͌LQ[<^!uSw4} oNRi5}Kf<8ծ9o&hy.1Z^)nn $Q@@BAj WH![?7 K??<{Qj8L[zxK$XѴGBȑ}ߵ ^#m;v!MGV"Gg)Jff:Op!cgKodd|AAAAn2nu S{;0բ?ޙEd[Vq;wn]!je萐vzj"\ߢ D'oJ6gkA[&T2ű$KZuj\J:nkr(\dfH;R*uhߖ 2(:{ p;uO~cbN~^ @v X'iTu';ABGQJ2*3+$8/"A^GPJZR*0ZWHIG̜]qaGɒ>d#Ftk~&LDLĚW/Ըryz.O2r&OƤ`_:v“?ө=Pȍ=KpH 0]%3BB>~ԚzT@#qCs6|yԌBBB8v2iw»E*VPTmaC9MtغK!-CB8^  wUŠӡHWDa~)q;`ڲ$9ӫEU YnNGQa\>s?秿͏ayrfży~|K%7f_ w+/ڗʏ_-gϟhվϢqtv1.Gprv8UZ^md    娷W~4Rrn~gzɿ4K !FhC:VHuІWQAyT/gݑym[9Ss3'Td 6qj ܱe˱<Y5 ~zgo 9R;4m_8<)q8d4 "A%cqP! M}MxzMq)hhb U=iDV9n䞌{xʀe~T/Դ,uk{Q}QY葱r׿ p0i%ƨ}~S U I&2vrh5  p{DD^&"2$!K^^xyzAVVnbM$$&@^ի aЀ!(ۿ}eflLnn9(-_% ӏӏ|̙ПV$U˕=+xw}Lt 3Z~/-G|tKޜ΄MqAy|GH8n'΁O>͠cee]iZY0'9zvDE;{[.    THG#Y–F'gɎLʤoåQF1j(իGzn9#G8rH7?ɜVc J:;7aWRٳh/J~AՍ+[n|4`!gؼ% *{(9J0k9A~fHJ;W}˙:%9G 0PJ2>}RBՊdVjiҳPæX;B2;7H]eF6,#_m [fgr}zj蒅%fVdd*{p,h|5Hj|I_ѵ_iwQ Z%gL~ck>FOܰm=l^6ky\>I^;y);~%{n O|cO9    + iMC4nڒC'ptr@-Ҷmz]G25jԘvyd[33 #4{ݝ<~*J)Vɿ9s~*mCEF g_aMpc:/`,=T[i d:߅v3f.9H"a~ c;\ɲGKZˠdcg^:.c[[I:0ki']/`UV d]wOhnfz;}ųVq:WE bOɥ|܉&Nyj^_<$lݰF]$l<Ƴ!  px0}ztȨ3x^}kܤB]-4{0zmJF \{5w)UO[t1D;uT8~1g4 +Vz(АNGZф[Ps,ґFEaВuz2bH*PpnHcw+T"dP$YWsWIJN&_0{0Rl2 iWH+>v7]Ւz,GUbi{kjIBZXbQKV0EU#:]1'~R󱲶ǀz$~OEAAAAFh:Ɔwfq9n+bm]q9s&f@U_ .NU$\yx}N pVIRL&E* m:KYMd? iɊ 'ɸpTsY|R*S>8H/xvZ[Ѽ  $P-:1wmnⵦTa%UvVX~ڇOʛۮp#Zf%-. b*h?Ǹӕ9q4C^wÇOq)!|Ϧ҉V6U._~H =繒ŗ=ϾG$JEF%$[_O}g:WbTVe/L|)x G΂ .QoTZï^FЪ79TzDVL_~[0D>rfUx+fw1rjlLҌr/RbټM~ыYT[G U7dW"#}ӹgSAAAA[)TX-Rvp+f4xu~jq?߭\'HKd.]D2ٿ#A8hAA) l`"5O~o?lٷl:HĞ>$٦'} SDK;2%Ƶq/1o%+IM" Y~ xwVY|}0{=H2=U}ML±T5_/[Α}}'K =tӗ[ކ6}cxOtt~1J(ߚN/p{,|wr93;"JƳ«8^{oS3hr~j-}=;/d~"}.cݞ]PVjnt'YEt*h|b0o*ZHc^Ll{#oy*y7;KDJ8eHX+>atri<`Wt4{x֢_E67rre /^^9-fŷShS7۳7 Ɠn؍ų]m %O> Y3ļnRZvx}[WOޫ5u!|2a Ƭsy WׅƑ0woXT~u;xeenjxlYngUKXw ԒƉgayE3kE6i^ΓXh onfohn_x6n_M`-%*ll_d eۯps[a /[}m^ď]Uj7TmPsβ|%,冖ki5E~y8ln)'m,MAͿ}v &AMg1kM0' IDAT2;x+h% [/}KyJqbspzA';;kUOaa 0^|2Ht; <`VfE,? {w{p3,(T-q:kE7+R/qIb"RyFUf#q(>N5w&ש/pt_(i%:tk}Is@W=O#g߽toPjbfԿ>^Q65'TpU׮Mn $._- 6mSIOMfέ V6U1VQVֶXž[k[ڝ    FBoPTcxR5RڴiEXd IIIe,SʲA7&ݍy diߜf^vS+?o?R%a<>ҟ!0L5wx_?΅EYbf'ٲr2\rfВ 2:)GFª/ Xѐ>Y{uϷ01,(7c-nNKLY؝Iy\ Htr6Ẕqp_x9`RͶ&z&,e3p623G<,9PBJ/@vQz䛮vO '.sI"[;[T:Q0U֝PwE p0@Chy+ss&MS9 +-z{k-"8sd/^!!wLWę}ҧR.]eZ}{ҾI=l#%*p&&2MVO="?$;B~O@5DZqd҆}tfx4t0vm3qv,|1rp ٛ.:Ӱ7ƣt;~Ǧ3o{|H87w%1{fa%<\[nP)=/|um&a 9x Om}1Zpvh쁋mz 毓[? xM*]7~ Y"NvI!aG޾Xi9يo&N*!l߶ ᥘ1$c^=B,ߺ't ܸ޺sa;1U3)X !A@N4C͌&x]>'>k=ݪCWU}PsOls8"u Ù4.֐xNبt|>AIf[w!{K/l ޵cqiei ՗ cq7ҁORG<3f sysʲ=g|ұA+=;gf_i'}6`uK,p?kיI_=gF&/biSc p ſR;T^/Pj5xFn)?\С"aӲ\jZCj|soFh3酲]DϭޚBsD`tz|*O}ktX{eCxwSxVt~;.iQ%k:~LsO=3K؝_0u/,[׭P'{;{Gzqg/_$>&iߩmo    A@.'íGy{޾n][b֭ȑ#`fvDA]RIMIŠ+j]K6&(rC{]#W 굼n7_j9z)^A]+&,E5F`/R僜fN4k{g+HU& `R Ǐq,9OW#ahhlvFRؽWZ&1t@v3OBB-:>sz:N}yiΰRa蒥n47_zS8_>J"{CP@vČychjg۩Jl5Vy-X49eyk񐧌{6UއJ>fU0D2ax$[Z!E\U|ՔmcJ$-f>1/ޘx2dȠpL'w ?r0GEzTuGb7ꪏ  2_ykz%L{")P%d6L ŕQ>SiӃnF5m&l%fؔLP)H<_w7<;?o Ӥ* ٶe@7wK '8]`lZ5nʈݽ]kj m;v)n }    F"7/ZIܔN#7/3^oA.xGFdERػ,E*Ÿf\!i |== n"梢1s8ĀehbX8TO؁$?獡DɜvCc2C@;LrRWY Mf4>+qH1mV*5/$l;_=cN HCTi|)"P_f Ҳl඄ڂ2%cx(QNs6zS^©z9og]Z;3;Q?Cꀭ0K_Մ_J x v&^E}c<"vz¦/$sBc\%V}* {d=4;Km#+{թ h0pP 7fA= w)xop_uS3@K\)J"6AK%JE`@¾p)nc>dAA: IſBd7 $|||ˌ^j!="i؟qF٣Neώ XGxh^atԖ-i[˸yy9,ficE FgFIxC+} Cزv-eżh^ ?)j11ASmL hF?, N4ߍG5n SUch:kF68{I1%%]AAAAj%íg쌅)XT#=#UUy~>n5ZJB4cƌ)OAAh sKjZ]Ԁ2\&,€W{S`oE:fX5ɢO_p. Ӷ}>TGs1xleѺrh*KD0va#geeD)ȧ@mLD A|M% 49tI(4}23~!S߷02=h*XްL',l t W(i2t.i6x{ P˿^Mw`_见rh ŕ,,< & ^HqQXXʅ|$klhj$g#Q\ 9IWM5Ҫ($^$GɲME&5m2|9 GK]qr LTD3 ЪbY.6&4-'nAA]%&ιiW G,fH/\闎ǥdDw o,|VfxdҜzfgC|4l#c}GN 8[P#;uZ[B9Y`emQ=r''gm!'' {:i    ¿݋O,`?akk ff5eA^O~~>yy.8Ыg$ =wE z5=L27wJض@dһj- d\+1,* t:gWg$RQ6z˛TkR[jv97 Hθ9ˀCv&9 Td#H~nj7UO3XAI`肫 tY ehA1^K,LvZ*t'xorSG{ckF%#-PαvޛP-BmoC+i͑5s9Rq4̠PUT2QSiy@vvY.fgfQ&j,0g\RI')G]REfaNN/ Wc P|}@&dWT}ǟ=_c? ~K_Ḅ}zSHցo/c؅>ͩsaO6K۸{TjэGX|tmp| J璄,׹{5۪̒D}DGg&\][AA%KK+٥"  T,g'&Gnn^L#/^,. Bh{x4v>C[SJ5(Jr |ޤ0V4ܠ6$URKҵAyLYU ƹH YMEpuQ+~Y#\-tTWQ}WҪzDq9 Ys.)f+1AA;,iovPXp,pk֙:3P2|~rܶ;̳A3}2I(j)*x]꡴r@BjDVA%#tS%?=<gq磮%=qKû!d@  B..=)  BC]YwBJբ7l^L#fI@&(L" 5.D&>s$ws@ZΖ[(CBR|2*0 Khj L϶-̚Xv;<[7;)i$$juW v2h &=b=Iůuvf삋J:I:0sTRHL5..Ws*;ĆI$K:NyxNkrk>]$H0$`0򁄛 2(:{ ? dW~V}$K*"IQ1$lqvIPk+&lZ7}LAꂿ?ǂ@V૯Vгs/'믝5.0ÏgoqN}]jiIZ![ccGű:BQ% g̋ySs\JP:8UHKP0JDZBB%73Å*W2uCK;[3USKʽfMi c$,|d @7&Oj72?| Gs3$O Ԋևqd6 irΫbQ3ZKq*$ Su q9Wu5/*ϐML 'xߑ(BNW|_ MSZ#s&fb=¡hcʸCUwGsj¶7 l8Ce*C&S/ WT}(!M y"@YS-EuK4M7C@S ji4>& pxS\<J C,ұd놻mQAo+5([d'ƟOF-rCB%YŠL2[vc@F#dm)Ɲe*|Q4Ѐ=˦QFK}~4 i% -U%18]ϣJ(Dd_      PƜVc2]%soqU%7Wf@bu3=v^Co|%Z!S3,XG-Q3&T豊:22 ۾K7ѫϯ<#1 Hӻ F\"־IZa{/}CB!vZvMTq8Sݳ:FQ2$ K,$@"9Mz=_kx-%슣_v%]jr ̐,v358}ѠiDVpP 0o}?=eP2M\1ֱqQ TxOV%o _Y\\ ꨏ B lA`` z=z~zzG2bHuNٻo{a鲏YcXQ''g133A;T{7 #?Tg Fӟ_xl.$\ٵi H4S̼FbE\Wp ShSz\ ~.U?%ԱsMK?_e2E'gӴƯ=H4uAF%럝lE5HG$Uߖ2kRBXW,>]e       -h\;`)dt<Υp^Ւ7_{%J[sǵoid{T^pBja",z~/\mPRhyW ]'Mw7'.J;϶µX2NAOI9s|vvH ^ vH5An{G2kҜCY?BSs %u'_^IpZ:`j6羟ͬ_c1 $̒|(٣%J;V~IpHT:ضH*>%t "}+|V*y09:RbH}_zm1ϵ|+CI&zy1AA;π.>0yySvg ?af dyWR,_Gӟ㹕2vV zN}5'Ogs4A*Yw?Ҥ~,D;{$UK0q뼱h szqY9<S~AR=/==F3 }]e\=^мo?$c|d=Dpgs əSc%ˌ{a,eWyjl(]þKB9WCb1`g}AAAAAA7#%VbŌ׾&$=̮V4𡁛 RA)qg㣨?f7 ^D@DQDгlSOTgDAiRJP{#R#| |̢j&`-x%[_~;⻤]|˙8&NiN ۶ :>1G8Gߛ]Uv]T1{H1^mOgSx@< v6%fR=/?y[q_9i}ѳ+iX) ;XKwґmgsy,6r~jL /-#w;\7;%UC5Zʹ:o8[1%n.\A tt"{ښKmhn>'NlIԅ^~ݷnb_wd>s`!ǵx:DDDظ֍""""""""r4{mߝ̏>`Kٚ_E~j"2>ˮ)Cpm٭>ۯʲu $n{)=usToGg |nvf;vfyO;'ѼŊ R."Q'F^Cڻ'>w5[Ss)Z%wL:ə_A1x7iny+ؖ^DQwp4OFiw⯞_2,6-'m% a}F2fD>4}ٛxil&7eSs>xC-E/|LhWyßٚe%( o}ԗ1 4\b7A>x;gyysظx6?."GɳO]M 0ZiaN/CFWrmvQ;Q]`0Q`+''=" K*Y= S(ލ`7>熣<.f|sWY;];3.;-mٕ'&5)j ^!w p̸x3J2ʣ̈́oXnl,mI\ps>];R.Epvnřطr:͜ZNDV<9ٹ5>e[0f[r"v=zUuU, k1ܼ .3j3ٵy)T\[|7½Nd"E)lٺ2ꜼL|\~j`RLt tPYj(صͩTY HntpoDž"뷲=^wj#\Z>&>Ͱp 2KbdUbwr'0]bwm,vlAJN 8LDL,>w;tsN{% /!ufvfQ]HtӈfKJ2c˞BCώy1&""rpY#  nw>Q/>q~_zl8"r㷀oTR\;|7wyY0t`STUVpO:DDDps:9|h=cGdZj5hDDD3#ݏ{}L8:DFPLobK @N69Egh4}k-8ĵRUmɅ3z38⸰xsh=pccRl&s` ȣW ܂bf=AVtЁ?e;`!PIsNXϡ5@ocLDDDDDN}>>xxzSQ^JqQ! v O/~O\[ mm[XxTXTkOm={`{]GL $ʖ k:rCز~ ᑎR-"""""""""""rPBQDN-zؓ}䁥mk}cv5tkOiu1ݺc+V-Aqsh*+Xzy}-]OOi] D ug2֥o`aچ3,ĽĮnPDDD}""rbΖkHKe9tsfRVZLxd4g ަstmL&J$yg9Tۜ #G/Bݱ8HdXɕ|?ٴn]&sLuqrrf+0,9EȶycXDDDDDD-pi&sgθ{꜕̛5Ǝ' (U9]ŌH#ADtgJe׀٪_";Ym""""""""""""8EDDDDDDDDaX,t.l۸FUeESYQ3>cۦ8;01 9])-"""""""" M|_(®--6-|?']_@P/"""""""""""89Y^}O}I|;QOƬ`3ټn bw""""""""""""'Bh bY-{ XH5;;EDDDDDAKv.i޴X,f'"ĝP.)aUtrDDD ׯSl+i&.~X[a{㉫scP]SKaI9Ekv۳*yXEDD(N%;4\o6{,94)IDDD|&U刈H#SYl1Ctt9k3am!.NF쇛kˇz7Wg‚ ىO-?H;@t.شneS[õaKt.iܝcܠNI""""?0giW*-""r ngYaDFܜ 0 dwnwTVV;@;Evsɢ\pe#-P. rHܲQDDDDNQ׳y|k,y&9Yl6G&"".l6r2XL>}5 ՗auti‡ z &mL'u6fV;@ÝK/?f⟮CxdK&""""""=Lak%^o.[3FG@`p T+"\-ۢ0 .Z-ſrBV.YDDDX }Fa.]X_OLI^Q۶K/СCVȉjv $"qz>y_ 6^}jm)DDDDDD$cfӺZno%^okz$);>~X,#9EvJ ٝ-[|#"""Ҟѣw֮X]aWh6gZSlXJ^5.-:! s[;rɂZDDDDDDNչmֳm_DN=$"""r3bG!"""0u}MGZZwc M@ddA7,1u?חQԛ[u#]QKSLjyALt#rjۛt'HVKt)"$""""""""YhiWdu'_ZCVgw<}ԭνO q ̏^ի)qv y<_|´*NN^=)_ƄA-ߓ\DDDDDDZ7EDDDDDDDDDUDtNNSNW^yFSeꨩ9< P]MeYy;X>~ g-q2)^ = 3O 7P:y`T_@iVz5?N_Ӈo nRvdc oK#&RrwoYlΟ.$$D;]!TN{[xe&s(/4A},kصv1?~1Įɔ DL9McK;C7PgVbщ'vðgso3F<26>A3jh|A;eX|=;30 JaIhblҴ$axGУsNbv.[owWe7'#Ah5`VRlhDym 6cZ3 Xj%v6˶W37_wlXud/ϐ<7^};˟y ;,hX]ng%#xaL=u|jMF_;r}.Y,SNO¤y8t:NnaO_x癑Xa ^{׼8GGan Ө:`*|u^;RUyl5:O$1\É[v#tu;N[?3Og [sv4px&<4:|_6K?´t#~x/·Pe{՛lb?0c iGhCx[y NntOS=n&7Yo{c:}XFDs5~cH5nN+⽏cWceӸәa)C:{#,#t?(a?._жs9˲퀕ȳ13mwrOcܠ'qO^p>|Fz6;NxB2pE.{YJrf>{)b{?˫-t9kgƇ^s6+E<¿%nx:3z?%j Ϟ?$~ 7Lu"ldnXΖB7bŀ^]^NN:=`cIpmjoqzNo'X~g_jtj4{֚XBQ~ݎ~g)9e\E4pq-o6">'>Ffu<ƏYZ93V ={vw$'tǘG|,A5 |/sKo7rro23(}/Sm30{6}m(MdxOQ&;n{ݡWͺwM嘖P]^uM\Ƀy'>Ww7v/17.u{\w[/Y'SV}}ul>w @@#i`zV3ɏ甘uxWwYxsb0P':Ox/Eë]|,=FO'rY:|"ʌ3b|#aʕ|lX4~CȄcFunyn1uq=% 7/<,kon ༿pH p3Ҋ˰P*ke1!+v֬di$/7 ti,|#,oR3-gIka^f _MgIyY:pp~מ剁|ny04?[.u+XT~g&R}ny;bKXH^c CXp'i1\ 4}~;v>,e7sɲ2(&E eNù;.Nh4t./u6w[KSOyo憎҇pqq9 V jjfVg2N70<Ygb å cΡ?WV<8 IDATn~ jMZ87l wn'31[ٙȷmƇm#_ƴ0ssfX mfoj(,qgTiVWOrubf{r)3mlMpǝSw.ԛ^}P˦߳:KG69]Ng DHTh0 r_Ǹt|:L&"r=a:2/b8!g8]Ufc1J7mlےmL"eo49mv;f}tqMl؏p7maؒcO"Jؙ7/P<ܔyGySX-?14N"""""""""T^VJjN֮\ʼዏ拏f߰vRRwR^V2EDDDDDDDDe&>=뾤;=bĥ,=bOb9~L #wx>ݾBHnZM`RjvK9cwN֬/ic'cz2M0=v zOJv) lzC|O_:(IoŜo~n>hvKAxdپe=i)fSUi)dDDEӭG(""""""""Rɇ&e9xSYF]äd i \z$/g!q}k3W;pmLH+S#9vmM4p LuIlI/ęDxF:p]?Ὠ׹gRuiᾧ&fޣ_fY5+4,;0iVHw=~V3 \ř { lm,vu1{L_1c?ZUie%c 햞zP\X_bBSՍ(zĨs/d71u7(\]ݨ =5K2gVEDDDDDDDM1(/#/oWnNI3ǸF0 > `j̃Wuհ_Qzxoc{E~ǟAr[66UpmG]#_ß[7\u5隻yoc##` O<\ ūy+lΫ9jr.ggUǏ?6틇aRr*WL⻧{j0- JÀ K ɬ=$} >KaZ˜xx:K:ѽO\ 9J=YWO>ěj06H[8y0Rkb =g88\fPR\ĶMؓBiIvZ򋈈, >~GF߫/޾~:_a~kW,!y6 c>,V+~tҝC/ !u֍kYb6[^Cl\w}]ۗN]Hܲ,fo:'>ጶyXDDDDDDDDڽٳg  %ucy<:Ў_ύ_پvb\ ONC|B_bH$ZּLÃ?C< B埭擤,9X6o[Ú%pП44`e#cT<,q ^S<~u_|=f<[/aH;b(.glc%N\>\tٵm޽+ QWW'F%SLgwͣ''gKظ[DDDDDDDLxy۾?H&5L"QaQR2pAEȩ”mlٕI~yV7o:DҵK4AYW#e.׹ȫUq {y=%Z 7oC"L1,l%nά"*? =: t3xco/2l%lܰ;QGmc Iذ3:g|:Ыg,?֋ynE5#fο/&XS6t?V3:D_1rİ""""""rX3`H:w΢y? k3`ẖl\7ϟO&($ESj% (#׋&qz-%E1]c:WYy9gE`zjMt%1H{fc;_qՙSr9QDo۴N>iC٧vm5{+`u E A!a:cv+<[7Avf 1i0dٸ{x֍|""""""""ݍBqWPSSRV^]Ϟw_zoG~nx1D4;(r {^ћy-zn]4T'n=] 3R=VmtDpnؽ+U/.*`튥 9U:C͝#vR Z}NS+iR]]i&_յb&FtwQy3aE*x7I4!DcadGe y'a869)4Y}iI 495\5{c6{,94 Z|l?c%bZ|DuK\v&na邟w^i-g{V%?-$7/OO<<i5uwX YjyADDDDDDDʳF9 9-""""""""WyY)U:}|qquR!"""""""""""r*PhC8 !#-RDDD(<9stRDDDDDDDD%u+oo :(+PG """Ǩ% 8 vKEDDDDDDDDϩD9>7GlxW#"""GnrJ]H"""""""""{7t qp%\_CEy+9)-""""""""""""""""""""",EDDDDDDDD  /'@~n} DDDDDDDDDDDDDDDDDDDDDN!dPMخ%?7 "֭ZZDDD<]H"""""""""{5tFvlG """˛3G2DDDDDDDD-u+po :?'@^n} SY'EDDDDDDDDDDD@EDDDDDDDD݃*JVGiI15U{x( -"""""""""""r DKma:S"""""""rRvXȯ2h篩b t[48I,Y=8gD T_6o{zoV$&{.' Ftv?\=fC% &ʥū?U&/cKO8vj(/)$7+])VTi `,}L eJl8{F;'=k&Npůɏ,nDDDDDN?>>} !?[Mz;ȊHwu$'7/||h_"sͅ+HKxҺ 5yٙۯ^za<>8HaxFy䖘`PZXJiWYa{e1u`uϣLj)Z;X.yxD;NGVA^F9E?;ڜ;Evgk!EveU8D;U%E՚8KuWRg8닻Feq1<5b*lfVo?WYFEA6YŔWbZ] CM:*Vڷ0><4w$0dĘ]]U'yg"NN u.TDDDDDDDDDDDXp%vxܙuJY.!!XX,A=V4dPRYMi/BC q($='*jlN^1cc vfSPV_(:eSDye>aDE4uUMQE-t UrUSTY9RjL+Ax;"iWawr'#<>Y[JvZ:YT֘8y!>ǴHO$jWO_B#" w;XNI!=*w:Ev?6 )-)SYCցa"""""/o/ 1 e~챹yE o}.ӳc%j رf%SK59|{og򍤕^ٟ./FGpEtKf&Ļٌ獡fWg]}R51W2pv,me4잲|VO;γ9gzt͌Fu{b[`d %l6f l~,)L6.dXQ9HʌH~]׹sH>>,#Gٲ~:r >3`R.gec_Y3+:_zF&Ko,+e1jl!֮|0]9(cK$I$I$,n@4 Xp+( R`8}Q궿/6o?6S2 YjvWQ'ECsNDUuo>FM[/ eX02e0 6}׷UqZkI.β{1~إlqFi9sg)L_zK&d"M_+wUy\Cyww%ta"y£2'/PKg#fZj~3b|DnL}mY u]g~IXtRaךygoē5n>w/CM:+9{ڟIf0B~'¾7aMb:9z`e3R[$Iҵ&FOO%`;9qu ,Ɉtb]ӡB IDAT4R[UMcO/36jjC瓕G44ZRbZƥiJiAI^[_ b&7QvXcK> t$fJK"FgH%Dv{E֊Tv Q)J&LcT4qt[4w,EW~nu>cO&'7+^7^~ q˒HHL<dط",0$I$I$I%A@Bƥgg+2E=eyMv6E 2]<4Qzhh*#1 p*{>x73pϛ^bm6dFϽmi- 6cKNgM5r=AmǏK+diLWC/R}O[zt̥v G:883.n5 `ڬy7MMU%[6fˆ$&&7d擓7jj*w/`]##3{ޒ$I$I$I DC|jIbtw|ӍB/ɘz*ťsVӟ%S9vscOᎥOu+w*i=fzrvqxjz!;(fؙP:oe/8;K:/ob~f%q]\AW0{O CH["GH-gRbæ/3Ar-ͱ_lz+g$Ѻ]l ˱Ced&I$Iuz+Wxw޾UWT9cIkDbJ73nⰋ4?CdfgH[Q`P8ik(Vq`"Ҙ8T^( tĀƏ dPQ)-iq's>s¦tqV=zin =/0!rFod`̭[(bʌL1kjy';w8iCY$I$I$I DF8 Dž/sT N:Ρ*'U1E($?;Rƾ9\VM}s" @]@AFyI뛉7kO6R;Lh-LkCmj1i #' ͽ)J HXOcu Y=Vimn%J&azi$ zۿkm$[#@衡#wM$ oܒ$IpD[ OJ%#+ B+Hg\}tԗRR_J ɸP:@6 >G7Nb œ;{uZٻe?cFƵ\7Mwnމ$pb"MWws_ՠIMK'5-Qcu)$I$I$I7:Fg 9%A$~in MѸ̘=3GiڿV죡XSH 8wmMmtbD@RZ9%@{ή u~c]nYACo/'sͱN:ľs$.!&'k?u8Fg{_."XQ}Ag=&c]w}цV-/cDz#@< %%3po便nnK$I7PZ>ƍ8E)HTW*kjih+AC~sh"WHr="}D)kJF"vۑ$I$I$Ia7p :JMUm_ K1{*5qX9TַQϱ8oNLwc:ְW죡'Dy~TFFf!^8g`8FlO^.iszMcػÿ;y%0cAw&>K@8.ޡ69L"=?6c發=/I$&wEX>DseQLdH ٿ{7i<]>) !1bX1x7}aXOչ7H D[Xg1H`AO %{$I$I$I w{$`dEnԆ;tSvp6좬oc{@ U=O-`T?~c]t3 ĺikx&$_P 9:bQR3{#|6Zc j[^1"LŔIIQg3~֬]sH#mtcs>$InbAѡY:J9P&wة8ӓ j" i/6'!zoI8q## [ 7z}eH((b],I$I$I$1mWxqS @(}3Xqii$Qx[vNh[y@j; ;9c?QG2n㋘\B@}p ELEYOePa64|"BЦmTY<8-K鼨dCfbGQFzOnv_j<>Ć~]WВ$IBJa0B*2| wRhNVm=HEsw?^p=A"99W;tN:O>::hmv^c1 Lĉ8BRfz[3wivH& FWA6t_|:ȜD4~GZNH9V5֡,&O)dk%I$I$I$eM Qz:io?}j*K9XrP(=q>vՖ 3m(RΈQGZ8(GA>޶7Kڈ&glw~3j-=ey5w-eVQA(uػr먓/9S>ݼF63vJ׿]5<6W\_ι8GƊSOLH cf-4ynI<}=B)Kb:t(w:sGfNJyQ^Swٍ&/+āewR^8´!$I++ ctZy\Sv4R_FO(fNlggI٫-$fNJbAֆZjT4W(U[_᙭zqd[ig]Λcl(~J^(&73PO uGә0c,U;ކ v;BSh8 !rǓsh;el|MA 0o{E#C$3f-ԶeS e$tP[@G0jޭLͼ[$I$I$I/e㯞b^J$xKfTm&sG ;ƓGnV) !"UVP 21R'eƶr6rSs$EILuy% ]aϝEm9W éڽg#ɈR]FyC;Eu'syT4fGٔ94btTWGC[QPpx\|]Xɳ+i9V\RC]4VQ!} F`EM5!iR\kV~aLn}:OYK<2SEhoiHPBfzxʔ;n 5U9PPDaF"ѶZJ+`vW |kL>-5G,[/ &bzyG$It=H,b mpC7HΛ̭ t;94H/`lA 5Mt5Pp FMɜ#HWXxR-`ԸKWA*o[J(m־©\q% @jmî49qi! c2w,gמ#5C47Ʃ wIm y|Ȏմ5VrWHb培 瑤5~j:8vS9w)w/H`Ov]|aׄ8rg=obT\]Js)/ I/KɌL:P}yg>7Q[FiH!oX'%@6?GUl=Bs+s&r]K(~K݀hx v^"Q(뮥$It gge ˭bVc-GJFgd;A;:!ē:4K~_[q z~ 2gߜqt9L^m 5InN ,Y1X2\x-ϼՔÄw3~N; uu '2,􄁃Ѓ0$I$I$I D".ei:z I!/+<#t4TSUJW4LRZ&yóIv'E;hRON tXO+u5u4u!L|b*òJO<H;u54wCB:LXSSDKgPʂEwDxPu߬$I$I$.; 0{)DsS#/'l\` /I$IEjظv%/'4752v$fͿmαxL>}{5kD\oJ7H$B}m5~g>͍ L1$]b(>:7q2wMD IDAT=?]< ho㙧O,$I$II` w 7e}zvnέchI$Iu  1{̚A ڸAkVڷ^gǦwرA_'x}#s* B|' ؕ=gOs*ٹm#3reO*I$I$I7A DC&7q*{wn(-MDt!I$I7P(DzF&#Fa9gd^AǴYټnG]F(&+;'3dfuIS==Z o|Νxʪ7^aꌹ_K$I$Iҍl' %{XI$IM.+'{|tː$Iױ-V"Κw?m<6~rn\ÂEw^$I$I$F$I$I$Il n'~ bmwD-$I$Ig Z$I$Itknjx̜;duL1x*ˎ8duH$I$Iҍ@$I$I$wpNO">> #>!1'p`+%I$I$&7H$I$Iע[{K4O̤x9fP18o[7uˑ48u&YC]$I$IMђ$I$IR? CK7QC\ 諡k+4X:ٿgP!I$It2-I$I$0tcI uoڰ!jJ$ .MK$I$ .@$I$I+-5!:5m֒r"mxR$I$I%I$I$I$I$I$] DK$I$InxmZ[h;QCBbW"I$I$I7ђ$I$IR? 3I-C>NL0-HA$I$i$I$I񭏍1-@Zc}+ˎ!}T !1JeIWQbb2$I$InZqC]$I$It-Z41uߘ>eH$[ַ G(;vkHk,\[ i-$I$It#C$I$I$7~ *{&L Iב5g'?;ZKYgҿ"2K$I%I$I$I7aIey){wle[=;CA(҇eI nVQ~EML#1-1}<=L?oi6,I$I!Vq^F$Ik[(&3+q0df^7:rbݬ,Hq]kVRSUm6{U=훩 }X&s,疤ӄ'|xINKXSm?; _~mWLʟQ$I$`-XU־Ғ$I+Hjkٲa5'ν{.u.>ϒ_\|'t7s垏  G$I$ݨ%x~ľ]B!nYz3BN^>pK$IE"jعu=֬d Gr׆gd 3MOtT{//FK^1u\6q6o\Ɋ-79K`47$I$IV J z͊WٷkY9<)1j0$I"3`w?(fٟ_ƚ{\̼],Yҩ`ۯ!_ q%/A(#O}[9~=_?у%$G>Apغ|y.̀͘UQ"4F!_[+WhQI*Z§5>sk|7n>Y9 <ysnVEo,F,%ijΡ1`N;-I$Iђ$I$I$]Pe?LfV> ^{$$$1e :~ώͼ1g+Y$]PܙA(Lbj'28/}}uĀpb*Y% X;5khEļrH@! 89:F4viK$I뗁hI$I$INp ]|E^z$$&PriG7|pK_§bǁJZ" +iI{7n6Ox=d~ v~$I$I76ђ$I$I$IAsx$I$I7ђ$Itbㆸ$I$`zEug0,zgi$I$I$I$Ia Z$I.YGvj/ 1/yz?63tkZzH$I$I$I7H$I4ԺȋG#/MkhY<χuPYr.H)ļDbʕ_AK4QY6&eSE#XjGj 8) \SCְͫy9=L<:#EΚ}_}eu4w3lhf޺ I՞lصcHg,^8,i;vή=VRb"G1%I$I$ImH[9;׭cr[$f0am,3z^:(9@uLbD۠.9L,sؠ6rx1j66qtv%&ON@w-K odFtU䭷6p!w|aFr3eD l1pc<)<$IA_27OnC,ֺg~]c-KskWtvvxIII|k_$I$I$I\_h=~7|7F BdL/CKOmg|ﶵuA6c-+'g#O>n>äDk^kO~MB~{Oqﮥęc|?&3gIY$?<#|52&P$ItXj}hϜ!2owdƋMle0кo?x9'C25?ZpRVlz?0 [ݷ)DўڷJ5|6bqL^v/f%7xm~F´SW*vD-3&0&o Vmgk8POO{ 3/S׼ӧ}uPB'3O$I$I$I]?h%g3G$YwrZ/-ggOSxػsn$B!@ a-8kh՟ڪu[m]m:boe(SN!$$d'da$}(眛9Py3{JwkJ,'#ӏO_6<:jM3*iܐ,VC QDc₾*tʝ*k{*{Zh _6[)k޻XϪ_ s(Œa@fZe+s}[`쫩ׇ O&V9:X H?qSh-A÷V/XG}Yw>;ҹ+RT!_}x&|}gɋ%\aKw٩kV7NLJum굳gB)hkW@/ߣYKH/mx?vS)k/Fg?&_qןj_oR닆ѐ E򩧯j=PI ұ_3 g,JK̺ޘ?mo>Ҩ[]N\:OGG+]~5oiCn}f{OVي'`Cntӓj> :_N>3Ag;oԌΟ/ I?g9°ZY!^4#\XXZ`mC>LԸVߟHzZGGhv=c.60\r9ahI4S|͟W-:grV}2,C??$݄_驍[t9/9gO=#ՅiLYf&wWt9D=/6epDޮV$G͸-:bV?:Xέ:T+mxk)Z@bۮyL\;e6y*[SǷ(m"mxxF_ܙ qfz[lʎ(\=}~gmַd}E:^ :VKOxvJ5x)UҡUu–jf > 6ǩjsmШ*έS'*SvHՋ95StMBgб11'ա=JNJTaA u O(*C{( {(+ý8O%<[ÿ́ ZU,P]ɩ +th7EOA=>T35/۴<[}g~_ Sa".i~0RXEyj-Σu̖0v=:FRJ/=Zu鬠* ,V$9%:tҫ"Ie!Ud*5LtPY \UP ,UmZrےo]X4"5 EWCrm߼NwmSZjTnv$)nvXZiarswq߷S)+D /Wt`6}J!-[Sn-[f|beD\2-T_ݲEJ!RZJ,6ֱ ^\"D2F(r}K} mHI7ޣ3Wv M_FpaU;4oI26jV[G vhU?]-<=3Q}_q:Hm3c|I2xzP!]4m߷\lIEzE[љTZZ&[>Y%/끗*ؖdAtiHSNetFrBфq-K{vlڕKUjh77wEvVj6B~$,85[tZJR&*`R)-FNPdLѐضC{}󆳳@;nj^-[Sh0Ņ***TteSJQeePV ۵]}QT.04@Y첽.9JKJ!jl1w)5xuO;_sPŞzI 7cҴW\M <,_Lśhi aZ Pْu._4xdK!Sȴh]zFSm{z X;?S/-TbCߧ'aSԊ. IDATү􋑿ҋX],MT=I Džxz׷*C]ցUZzK]T`P*CMdi~&'N%'ȒW=CK wnS*DP9-04Ϊ* }9q* }9aؿkDө.t-wib PTto%?xGgܮR娉ăqZr,R4ryx^.0 EuZbR|>f";wkQ[S-ccڔvS\2הκmkPؙ.ĔX jK-(4.T\.*Vem]S)hS-uք*MV:ia 4%g2QZ^>9>4f U(~ާ\XsT-jXR50nz{K_۠\f I e[U,Sv@/Z'ؘzgs(6 kTg;raʼ}4?р!#e9Z4%9\kIKM9Oc'θ0te^;ibzeYZrҏjhɭDM&ӊ[_$+WYy䰋9MOQ#j+h#ZplCnݮN>54^#LJTT[-4͐z/PX)ƿ<6mgFa)yίKu[(U;SϾ>10=UZ9}랲GXuur:5`8MibNCFr:5wɮߍm fY^}5p(f_2MS }6z,ȫ~(rя6,==_:y:\7$vg r.TW?^ E{׍]*۷R+Y#JgUZ_!pSǪ Ԥ!2e){BɫsN^Y`8uꖩǿzAs } pƄ\m[}|S/L]?OM?yLxY=u5b4_5O>P薎2t-{6MczfkLP'lҼ﫸P]5z´:siع 5w{Zlm[/PIIڶCFyT*))֪e dqe(hʴoz`8]w,=z{nјkGk} sr!ct09TLW{?t*?ut[֩ۆ<{OZ2m_LIN襉^扱LVd׼Y~I}?@S~YZ;2gF*6&^v [yv ++5ZxFS}MzQjSOzϯ-^skm:(M~4H{vlVT7-0e۪fnnڳswCw(~33dFR'3C4MT_ٙ:.'}zk4۳A|a(H;MCZXVL c5r`Wn,JyTaj7F suA݊۽]4hFn !Iڷk[\>'Iޣk^gP}%I4o4T(˿i^%ón<\]QK:[4l}F}殴d纬d2N..Sh9n<“.͏ hJX$(uG21ځ:ض+h5/?~ONSаQIrVU`^fjiIڶk/77w6|䰎%VtloT>GKw+T5?_DH;7)8M2\scI.I?*Ijٺ+Zn+IJ9.3Dz|R/ ded F>LHdebuC&%uIR<W$ sq%RN]gfhŢ9;a=<\]8.c*bȍe\}*;[#PDV%'4<9S.$@WI ]\)9ٙZ2,K4~gkh@r,hA-?,eu@t$>s?UqQڴSfe# @[%/oۣf˶-I[Zj$׏@tm95rtW"%>Iug9  @2,\3=]u ߠ2m^FiɵQTZQm^Fá_*1T0&kƵb?Nmo90LSnG>:r(^W]yeJ: o_MU_%QOReÚ:sˆ5JM>*//o?UayǠP 1NeiE(@y~ ۲4d8`A ?Ǵ.j *uqEPvLC6}K –eiyڶ[vkT? P#*4ov}nU߭[}4M?U~p9jc%CG]i߻S{ :R=\ar8өt6_#۲ݣT>o5@yTv ۵E[7VSgRoIgܮEs>ѶM*;|ke%EZJ: oWDNn\mjZrڮln<<=kee%ZbR4M 3Aamke0$ $bլȶm_\JY+@}3 1NCG][=W>:yPeeTe.??o5~pF]opu?}o=Unղ>>lzW*a͝ eOU1=0ƒeiZ6￲,K>~=],-5Ek/PIIL԰Qթk+~m[n2Y%//o?04@30卸n2M&ck{'pgdejۦ:r(^9ٙ4xáPuV"8FG ̄:akۮ﷚j@opeD7/ܜ,͛ҏJZk-=<.keeۻC6~㒤6~۽ q zegfHBZ{Ͼ9Znr>+'zC[jpu4?MmYڳs~T$77wuꢶ#N$,PA~ҏSD%:rI@ ];vb{♦Q7l֡}ڱy OH7hV*ekyOTTtRŅEHӉ&Y!IWC554#@]@[4ճ5ޣvlY})-%YPZGO} Q PXEFE+~.%St%9#/kٹcz%4,|b@3CFj*ڱyJKUZVI<=>sXpq\77꧘^Tx@ǒk+%I^^*++$yxxk>1jס|O4DY-a**q )]8Eb۶vnݤ6)˲lݩwA@fŶmߊ߻Si5ftW4y+kn2eH UE{)S8Eb۶֬X 2 C=WT4.@=,ru(aܦ[6(7;K#dԟ+~NYɘ u;~je8S4-;nRДЀ!#Ғ04̘CA!-5`HMPںե Ldej7_0MMnnNMꩵnNn[ij7_)'+SchmShZr{&MVH0WiMaڵ;庺$fbۦN :Ramhzna8t,S6eh 1Ni.5NѴ!˲ۻahidYpu9p1D8IRl.hΌ#/xq 4 S8EӒ$IJ4Dg ǒ\\ \@t3%Iؙ̪1ycSa` )\IR`P+96庸fr:%Iŕۙ1xfLV8)]li,Kdw\̱̱hhhhhhh @}]]Kb h(!@E @Pl)1N =ve~4ZY?J1C4FhP0C4F8+]A2WT&Wcd<zҏzD}kr}Gr?K<8@5\3y{i?fDTOzig=~қ>4u}~섌N7էƫum~:Ϟ:܆o@}2c% =VFz"h0HXJ!My}b'Խ+UßBv2v˼Lvyv%)vW1x4JTd՜bJo&;һm[*[+l_C}x6o)gPR*Jޭ[| ,yȮT֭\6yVM ԣ Mjծz^3ZoՍ^Kh˖dUReEJٻU*\"ϸp`F:R0j F-$WH2Ԣ upŏR妧*АҕMhԱ=Ӈ IDAT Y2[r^I2J]?NCmG?2d7,DF\6m-]8f 4g'-[~Wë\ґ LǵYV!8ܜ?NWҒ"gjGֳZ:Vӏ_zs͛$;KtwvBRRxf@4}>@?sƇ;G€ Tp@3Wjks&hѢ8SA--r1??s3O!P+]f;='Uul?wSϟԡƕ WxØ[9 JsJ_[i^eW7髎ݥ~-8^\ i-UC*eyh>yB? YF߭ӊ˿Kaݫ߽[~H3|jqv}VUz7dGSi|yAߔA}zݢg?QWt.8EUC:iKf.bׯoH֡T?T_Vv9RA3uCcZb,fxǨ6ʿc3O}5{O?G˷]?]7uSMvx񙃼6eho1e+(ƌ b)sWZ2 +-|_h ~ kYZzrCaF꺡1tdnZJ{}<%9iŻTGi4Yuj}mzF,ޮtKQNRV.ɻE*%[:#6F/=\΄zRu SӮKul2VZk9AS{{"s*鋧W*Ӓ]IKCdjHFW9]MfABR؉۫SkRi=tUsӛB+BѣiT (Z|~|,WRZR$C@Wҙ3mT5qhWt/xԭR+Uzc=Q7 R0oѪX_a2-CC?ߺC>g~zǧzlZtO߫ρ3J~="Tgߣopj&EG5=JA^*xfz.#Qa7j/ؖ uG5[J_\%Bzn=׏y]=6^jP9uh|zHuz_Cw~6Gl֝$yORWtM&qpJm-\QPDHد¬!.6}nwnWa`{|AJOhqxɑM&!_j:A)λl)HuqJ|/v]rJ4s=bco_$///WMxFt&i]*;s+uo.݃[Uhr0ChW1jWeȻO]В$ZxTk uNZ<;Ԭ)arR-:IhhVOQ$v]ԩR׽mElac$GPv![S]`IuXhGcT CKLt]}/0 WUZjˡBن{^V}4v`d)7n jߩ0$>4hXwRyj/`4d=bc߽J@t3cuS{N$G'MO>,et4%+MSEU}_Fmvn?aؘS3[䢽^z9y} gjȔ 3-._MEm[J\H;$u}ksWwjD9eo4M8sVciYKwӦzɳm eѮ*-ZZ*lc4sd>j3zzIVmpxShK[q@T]7qʩ6yf VeX^j7^4Ϩz]jemNنL6FUuxQ:U!5.nƥuNeP|Swsh΁2e%W#oUeB[˔d䫠pi+$9Ժ[WUynhGhEj%r(ے HFV7=!NfJvqdVw'j SCܚ= әk~On^ N%(˒ OY-[t,Rǫřs/.[9x_U>-W5zh^-+`SCn9hth3%nѡo}n 0]?INIo,궷"Ie!Ud*5L}0dj34<ܽv& [2խ3./:./C*UTjKWs@0NYʈ?LK2;(3&jٵwnQf)U.Ϊ|fYw|unzo@hjE @QYO={WԳwE!""K^雝6!My=}< w}g+?WUP|$#Xk7G(!yC]yK9Y$Yچ6$Y*,rks+wmWڸ=S*p˽L[[UV Eu(i}@.x Rdm8|@{.¶e UO(04@4:e WNP_k@wh4H]!.[d*~d x9?=VM;,S;IjKԗa A[0j4>}kcK!guu~:  ȘbCN-/P땤mkGuBTH.Ux풫3;OOYzᝳ4W3bL)жRQF {c)צM*mΝu4pXd e(JbRD-#eKdO$KrD*~@5O0K9)pIFH7ix8./U[5Oh6_S1ޔl*]ົp1ܖ͗mZuߟ־vpH8O)|@xwʐ[VRN-S7=^=iJv-[[Q˂*nj4x'NyY$yZ?~cdnm }ۮKM*ТIf~w-̯qAxA 1$Y)p7ط3O*LM6$3R }:),$D"ճwWu;=u|;Gg?I%iSݬc(G:8%U%T;'szfqb^=xuѸrnߤmVF%9j 'CHtx{6-Zfb6~!ZZQ&Qmޓ88IOcE6/SNڛ+R֝Oh֚h+m֓퍵r\7@YOwV)$ 4}d.gXݺZkUC+~xK>6irs>[&SVDk%Б᦬E5٩)dmzQFbRշ}kHkk[1aų󕒜!$3:^ vNPCMr_=*F*Ѷr"吭T7ڥknSbdeւ Q/3(}uп29]ZwzG qzl]C_|5CsRqW嗯:馳|U3X1NKoWj|=yj'9D.{zs56.H*кEihmW7]}xu 4v] Eq3>T~Sa5xT=<]=||Jlɐӧc~U^}FU)U \n39J~ΩN=)Ȑ-ZᐒQa'ԣ{+ϔ4G[R6evӐ :m\w4 SߎᾒX7)5%E)i-@eFbӈRs>55cTQ&%];T`D'kʈm2! Ic%ZЄ&IҭU̼"VX2  SdD} ̭ҼLer?8\1"xgo+U.BSz:T ?~30U6T)<0O毮y%$4\*UDTJB½\ @ˑ$EŴr%%,J-tڈ }$IkV-dsK9(u}1Oqk7)7nVy ^S;yeа )8h{SXDL.VX[yJKYd۶a]@sS.`/04嬩7{ϙ9?O?|VGs$?QaX)Sk䱶o,I}iھuKVM:oN̄Κs}:JMo)Rԏ3gjʕiĉr:7L pXH_Vz.fX %Ia<﫞˻ \IAJénޮ̙ZxWɓu9f@-,[p8\ P=,Kd֠z.Wm4-#Oih" @3S@?;TtKgFeU.{rʪm8գ [ӚZ UPW_Jؖ-C`szMn-WnȨ%U()ݥ f}Tb^o./dWX5~6l-WvflI*qs8W};hݕZP +Ԗow OyEE~vDBu*pGuf_ݮ3-P_^{(Vwt50LuW.j NZZ?.$Oݦ<<(ޞٮ2{ONӿi\t ]r<5zݸRZ15Lv/ږ˟ɬdu<:ATYTHO?k<9VA}mmsn4Kz$)0:TWUѾ։@4]_>Kg\=aT*59_36=iO?͘=pF]C ƜCN Rx}_UT{^ۥ9>92B;9ek޲\U_ _ÇȌ љc mJ;-aA?@53>2ir* _92Tq5Q;"k7[o֙i[rj0 4U]K 6Pym_SOMhZ1b>^s.ʷ:׏Stټr\/N ӥQ]o>ޠ[SώS#:\Pz8WO{W໭޿l8_gHwvKΎQEgb&}\JG{M4dUӛtō(\x]SB3؈u5d85v>Hvi^}nXPr ]zUuqBW]]# -Ivq]Qu(irҜp :$gx;7Fͪo.(x5spdڞ%[ŝ_i/5.),L_;q>:sq0)[;Ru kJV-S$Q:3s7Q[ufm2lj h+DЊGyJT-O\I*ݙkݨ[oK: 9?{/$wNR+aM*WJ-P@ԶrL? )2L<=f!84K?ڒ3PW]Y## {ANE1\DpUxض*Whm|J廪KdTZO]=fL^z^_Yj [@j0 2$ٕ)`+˴&oYե۶.fOږUM5d첵sC6[jܥZ-KR@$ !tuPDwoԟA>F_zqFEXSF2V>[R9z?ْm?TkpDCU?R+=vdX/;$!C]\:цC!dS\ۃ|t RMOu{|X,}mK#*C W5h`p-bk(^azeZ^JSٕ=tM7A4dkͺc?O^[M d銱{u0u\S$[6}s;T'-msPl 3_-=CzH}[&LQW_m#_Qn>xz\T[u'yʶ%g(];̇3:Y*ھJT|cFj@lkvv*\ K=.ٮew(嫄{t =ԷcP,ج勗k.,'D1]zjQ1ֱXex6g Vt>1vFnV۷ȒJnXA50չoEEf ս zySz%MeW=tneucvFwY\E)Q!3SCyO;Z;,`++D+2+һ2vŵ?zz>VɐأrJ2B4u.П_ 9Urv7W/S2BuJ~=]K 4I=X#Lgk ے.Qzh]cRT`}pDhCށ<ڠnHo0|ouhE{w z^=3c,Z S!G߯_8M1ŗ/ӗܮ*]{,;zE} rǓ@CX9ZÚT:4|aٺszjZ3*Yfx]X@Am'V"{O7SkkoT{kk f*7]~s~S?-ݢk3wMzSXqȳhQ};b5{5GCuy:|zbͪDߑk:= fk=Z^MU񺣷A] @]Y:}E/*W[CuY]t]_ϝ:K>ҒB֦h$t8={FZZDKxK!ϭ-ۖ\E:5+&˥J[ܶ ׳ژVØz$;vjc W^W,e)n:PЪ=r+*cU[ekUN6qtt͜vnriDu sh*/JZ]Mozr`|YJ (o78?W|@Jh)kP`2Vj %o^qQMl@Q/}^׼>O[C5맢-4ߴ>c^Z^}[7s4lَp>xM태riuZhJTiKu2ԏ}i:GnY?j-|V=Ys}+U}9#SԹ?59C[/}teo54]]s Z˖CNqreW\ *uC\IOt%[5uf\|5;C{f)PD#5aH7Ekunq6/ASKd׹†{s ӴxVi!׽"*ݪ5 +ҕ4]ZO[f 7vƤ,m4&tϋz ꩫnh*aC|n:KGݦ} ^>^g> uW=Cߝ:>[W.͞\viPӉqky {^F^T]yL{jk~M ;ke# ױW/+ǾC[ڲ!_M.[_|Ywg豩Wl}Z[7&u\u9Z`:CZCj.[.uZ?K^!K*t?=N{~]+q;37=ƹZuxc:Yp\~8zNN֢GМ]&{SAncfp]W5}mޠeכˏahI2#G.TOTs}r̰sj%ɩNՉѦdh[zΟv[0$ t./vi͢UkCc8tѴjtʍjL+}vVڒa$Aiu׈+a4V#*IF0]r`9 [U4=vaǕ:ٔ%Z޽u*_>J*mFҔahI2B/@ZH[~T%9]Q3,IG\.Kaxɇhmi6AJiI:n0$_gܥkȰvYIhmoЧ[R {%I~۽pVf|rh_dtzro` C]Ш*V"K2c5oG+SьmKnjܷ#!ߡS4%cA'yS2 ׎iIaK>$~'>12r&uRӷjUr7Z>HҖu:{GNWWn*W/KCuj'3zRm;+]nc~U:p8q'댡/k UPϓNPi`O;]^KҼ4*nphdf #B;ɜ ʳ*DۢfPm(xtJZ7afRɪZYqhDh,m.K2zk`_O*򕖖#kd#4Ծg@,eKV%~_HmI%JQUtY7m}\P#H:;ǩǔ`6IWS}|zi@o_Ta2dJāe9ՑxX1L3WKFPpU_uO%*-)-]a.ƴ Y|z%MшP~eߨ}:4m%3Tr6"5ymRz+6ca;9 +_kf}gӲu3P.K]JY|nm2UkֻdPpWm7אKӵ#ǒ:reJ&4Ct*/-Pdmf͈(EUAB#\KV^N,IvE>|zf|Ыd׷ִ|}=t~Qa`(<"֐䫈`*;InēʹA$KYI?냤 3xv:kloi_c:nڵ Whɖ!H֚5Yn Q]d+*F#Fpk% ژc 9l'u ݤmKX"zݮڞW.YnY TbyrחtxQfJ+8iyzw?+5T|^Zϰ+5õ1Әۛ?iri8qu.<)8aO2[UaװI#յ_hLswZӶk&JeɮNtԒ5jOV: vF|{$ډ:צ8ivt8Z.XfΞKk+Қio_swf-uW5YKua˽{2eg=6؆ lHsC/-ΕGgx.8D}jdK)3^MaP yCBv85,UM8Q4@]KuRReZB~yrK+R*}Ԯ@u eղ5V;d:zw*++K.'8ZB̮RwjGvKyArݒoG];v᣾Mshg(#-EiP瞽=d9Ng|*ie)TI!pEE9\m h 'N9m^d("neI2wR-?wV2ݒdېDDFY :|֚h-9`++D$gD"[~0h,7C>O*Pիwo5eл7኎pȐKYʷv7KY_HCʵrR-k_d'2R!rp(/ffmi?gup߰H#TT)2:lNcxQ-Y/ikhfBeKNGD{!jZ]$X?lY_翡 `v:O?QkMf+_hIz{`uwn:h%i|CjYpuPc5&1+H(s+jyL_Dݒ+ nM$Ss wԉ$TjRGlٟZ%[Y[}/FP T5(SKl{xϪX@C*w)/H"_v֯wQT3){BzBB(O,꽖k^۵bCTDz4B !!^7ݙM&$$q93sfw}99&al$3ywX2AAkxMK/沋W*F46[uEbE'7Q↕JpOL5έGh9{톃agS=PAAAAAAXLwF6~#0ܕWPAs&sF&v ")MOgŸr{GZb7W@dAWؔvG3?!2`$=!3o6fs y&P句fޑ-3滰g;$J,cCm#I7H5Paw {@qNҪ-ju]fP)esOɅYa/1rp{j; Mאָ"{~  iFv"hL bSAr/'jr/o?^~~%Ѭj>a[}+e,aG?'a26o'YA`kKY ;HM(hAAAAAAӆECi!SDU֓axl$7畭1vx? UgM =c(n||4Е1Kz-%GtM-&^? jV?g8Gwﵝ4+׳pb5z;8OV* ;36gEi[˕SMj|ZWD\g8!m$ U#Ҟ>5j?!9q΍Wf!ԮGR]@Lwq\<8߉{{ Hdv2(EY.w^c9b{3jlr9sQ;}-Rg ʎ3X<Ɂ*` ]$*}jSܿz\Yf6/TC_ՋJKiF${?W]G4>:ܬQU@}#v=\ Zi` j?34dk2J8?:Y3H+l=pLlUdTӁϰP뤋Tv%gQ\Hl$qt;.j)++U0RWAm+'KϻUGVRP܁QQaČ&8hwՓBZvtb?0y[#/V|l%:پ=C th9+&js(yYԴwgTtcqgj[${q6 R {¤et ZlIͧC=$n1W {7MeV6fuN~+MTUPB{UO_?=]6f3nϫΦ hpu5blv:M2VvNxl=:[i5ꩪ22N85qU)-U t.xag14mCg3Ս4ttPZ$46N[ؿEɽO(N}] ][7-T MWRj@˟@n2ZUJIU=]Zup #Yø!OT*XT4Wew MW7ѐ9l؟%B7cy)X7y~v-=ku+Ik#' |      prd%|2NVyq3oϳ%gy*6][Jgbԑ7dEOeYRyCu-e!zkK9OEr2O{\: hw;vR({auI:q'v,iǂKUYf6Xj56^?/&]]ILl ~v]TeZ܂I^5oȾl^e$VU恉?Z[;h817^|uzrRIʬ1guEʢW^쎇Xge[DiolգW$9w{9WN㧷Әם6J'sg3@t㦗(~٪c+_׷b狅~~(5kx|1r;?=lbX gMshRZ=/?1Fo(^ϋ/ی&L=pI91'xyn,zlBYWL(O_+Y:_'Ugdʹ:T`7ځ#k4Ml2'%Dַxe$U̾&BCJ ?>oz6~% cglߣCJͯ[}7n_рvc>8'Z&޸חbWRJIظe:|&8_t}/KG`E~5ָGL )?> Tx,f/9R5ۨbyͶ];H8TMG1H8M䬙wQzV-YYs-=fRg5vl#1}߉.[9"p/=}*SX&#/Pkf{H؍g _E#쭶]T7qe-bS q8zrsعq[sʥ\6#H)O{ˮa]ߑx{- l^re,;V$]"\Һ3Ƈksɩ{q      Ǡ>3߼dVgk[ z?]5`}|?|ZIinJCm79s.b,} ~LXG dgU<];wH4 9%ڲLve*u㜫恛Ŀ}wBȿXHEn*9IZV:'=4^s~v)4u3$z>< s~{"b#^l. mGiHLl Fo8 g H7{{ >=)jЅ. G^O^c>5>ˍ|<<}&]9;K^Sˏx-QEQ(=.WgY)U*H?&b 1 3-3qWTS3#0B~V&nPl'0%fevM}097.vXiT6(+`0GYҴ7L rӦf9lU#m)0^]aQ(+ף^|wH&R4RVކ&*      2^|ȁkƝ7,eQAne#JL/L4ܻj//}'#WoBCw:oN:翖#X4"9^{) fOlG_΋Tӡu;,qm]z1ϼ{1[(/,Z;\}C/oI/ [B2>Ĺ;'1y{y&b -x'3X=5p>g%ee[`4#<@̱֬eQ\C^/1xZ#w<_x^S)8A, IDATJeV_ZAfZ&H:W"0׮{5鷚o~2dyw4Sr(Z 2ֶNx]T#rp#{iUdg cWxMX\>%6=)[ԔDrj'"}ѮJX#ֶTfwPHL^[@o}m _f~^͗6Qc!؛oUmI$5,4;޸E?mdK<7IraM1f97KhTsNІ]χXۣ#=\J!Ր=},1o}.;fO˙rkPRMM_w9>J*{q#FZ[#Wzna30 YܫL"s]OLlpgVzœ_=!B;.[n&v{.';6 l삙ul\zЩ%YYCh'4=^ЎwZ LDK\B&p b'A<9 doz}2ZIHFr!2Ÿ̰XaFB*mW= edf噯v^d8;pŔCbr B&2_EEO\#Mv9OݽNZ~$i1xܸZ4pt_?by lNjw1ױ[|ܷk/ma̋qJQm Ig0L-!t M~6J؏Yc 7r޼š ̈́DΊ/Ѭ Yf3wCwz' i6lUE{S .\\%nq&_=*|{ dKę3{,=0aXNy{:OT嗰jx h}fssOY̡Td\z}9*uIkGtΘ' }x9+vTИuI btلM4f 3`YL-]edl-FI&Gp>+`%tSʊZɋ'VTڛ[1DcÄXO}_;e6Iesnw3HL0%XjُI *] q8qk;jǾUD2o~ `ϋ}nSضqKO$Gra9mHdw]YC2/pv!LMF'0ddpR[K͎]KcnR݅nsQ7'ȡ  8ML.b+L1h֑jB#tpHDpYʣRmUpw@.==bCpNO%x|{߻*h<uqMU W@ "*wǙa :+(U2{m.$;BF0\RirI8Ggvh --jC%E, +2`l*&f  YJP(|q;):ȁZ:YxO_Q=Fs H6p;4v$hW[ii N-,Z}bjg]*؜O   v^~/~A{NHAAAA8J>s;'4h 84 7%!1Hcρ.e"u8_ViLI dXGr(Br M+"}}Cn t ۇ_ZN+<gyG!9FT$lMlXl@)jRJRӒI矅ךTm&55½lYI@uگ,_=r(lUo@Q鮊1ilUYJ:B# +1Ѹ{vDάXK}GUO{G9361;8s,-ob`89,JmI⹪tWD',&FBM;٥L䷨F~v)];^4P[ݯCwrjF P:hi'#G;8uӭ')rEO}C;Ұ۟lZ<\;&PpGC .%__E_Dp>^x،q\r+ә0c,޺WS/ |Byq|( Ոxx[X_r8 #JU@F3 IFsC1!;        i^PNg#wL"[&2LcP&ܢgULUlJ$i&SЍg` v5ӨW'#b*C (~T xMA[s"a?^z^_G~k{Vž՟3Ͽ #iaReҢ#.n.,4݁zJ*1bB/M$b_ ֮f:!QWg$PZi>A% !Iǧ{ Ff1qTH*-Ґ͎ك8IFWJSIZ֡:t$,bZv-ن36{)lSWI]Q&IFO`8cE|r+Gn{-8D~ս m7\G(iyh+ tA{߂ $ˇLvTM|)X"  p&*?  iN;\bFT  nF& ~#4B"_jSQ4M_.QlHϞ}z.q {- J)](,caq ]uf$scm4ĺG$GeKYybvo̶R ~|o/k_Cʵ -*Te҂3{8?^I/rέR5{rlqT3{Ƚ0hF;ҍ)S⍓uϟ*umR]?}H؇TIIg Tss4d@(룛ɠ39mU%=F>*zt'Up۟l?b*X/>wM$5Q^YIU};ƎJ2($||ٟ6c$9df&ƪ$?<$[FBǕ6ݫc;]էz Ǻ]pK9IU17x.Fu >CSeC_AAAAAə]S=AA8 F(hqXBǁ$M*EvbR\xw\Ev'.>MR $TLD,qSgq:sVwO74ah(]I}Eі.Щ"MbFBǨKq̀T6wڝyrs!6E"x?}a.@9vLVբ}6Q]U .8_Z頽c8)UBV^+*Z|Y*=% "PREYv-ثudԡ aNUFV.u!$&SD鬑N['3Fڻ۟djmm 9֎:po,/ ّۛHpB FʤYZ#h,rAj#|)Wt/zѸ.тpm찕6Tmv0cak;        Ÿ%$cJٝFЍgȓ2AqؕDo4!"a0u?u`Ն++5? ]ّρIޕFaDBl2,֪(CjwʿA#-]lSTjDEC̦Hߛn=`"CH(TR_^ؘEҾ$,B# 1d[;l$@i8d^aϷOmkvxykcXƊrTL94( Qm,ppAJNDP]BxsKظkwTS#~gI MLTWTcgRWIAWWc5DOc$P;+);]&OW`*4{( 6$ RθJBs]CoP[ӫiS^AAAAAAAA8qF,#"{Ldr J-;>NDюgRw:QgѩƌYcT:S!s)`#9?|Ǟ~k"- }YxzF%f͝ Ɯoygm c@ms61vVV`95U ++s1XI`/͆U6~R$fOЖ}OBJ*T_visBatqp?`J ٹ5eӬJ xic9RJ\̲@So[([ T=i2e> 7y%;{tgj#=E94) Y3zZ;P@O Yi셿wϹ(; ;!]ɍ(H1N Vd7|B*J'QVJ؝        I5rE4AOtGhV4MW>jSY1C%ǡ}/X"kKzT(|?OFƂ;%CgyQEb"}[,{dY;ao I{ERXxlyGU5x[B!JthO)g_Pi&1iM0 a916UCmB<* n/I)狃=e.}]:EBp1kRJ̜`IVvR v6$<KKyZ/shLD‡;$곶+ װ0G3% *MiG.fJ*sik&C K:\]mP(:HfM֗cJuW-=w44ph֚@B rm? 7,%P9@pǝܐBy`~'i݆ؒqZ٦Po3[ 0sM-eSx>5VE?Lf&l掵BRH[-ZRk~,U@v䌹3p<=_A/, Ԏ(F##{B       /SJY|3/~%}B ;y֛x??cG~\:arJ(Uܭ\-M~L@A/zLDbJ'qJL@u_k5L4} 2C+]|?0WKBF5_.+X\E_ ?wWrI$} >Ee$UAQ%4gЃA|gH`m( _y%Uv+[w* s8TT^Q̿b*fn1m?4 42`1GW.Fj[W A uR&T+`uw_J3?:ly{x)>nZZ+HNͣQ\rC$>]KO+m?_XLZ/N ۊ +hW@v?^XBMdO. HM@LCX)h褥ö=z6Wz'7~$>z%6=[s\j~! /i4]bE/m$+gB&       pZgЧD4!r+1I *x,ًv+UA #>%$S~ME^T 똉9ff8GzX0]k; #$És?΄L<МvHv~JG'S: d+=p(MNnEU"S[9 Sߪ`E)L z)dS[Ԍ 4QFED70wQI4)I8FPVVF`>?45n%;FWaF1M砨~+wUцjNXw*E7NE Ͷ=Զ$LUQ @, rKkhl7u/$Sc5NmlݛGeG0ϘQvh}]\;+0+LMyڲ赎x2qx_Gс89<C崩Dc+ad=4br/23q?VR¤mlO+U# g"~-*:W?}u S9TVKs<`^v?G+DGx qՒ[g@rOoD->  7`O,LT?)zdo0AAAAAAAA2հY&ZnƎk^AcGԇ)lJkU<ݜ79i$%}iY_y1KԣI¤^;'7@4ѓ<6}G q?aij#J2p߳rEd?!\/떭xl:ѐ7]=F.a7kyUb%}/7=Kfu$TEx?4гd=s ͍8\Ur\j|Hu7?.ycB{WqxS\ =2u픐8gx w򟇟=+N]$d0s=|z`KDK^ {]AVK{/dn}yvT߰=nG-Morcd0q<EY˓^!}Õ%pϋ?`#aOA3bD ΅y$n ;6 S8,9D         `*LJr ̎#Y_GI^mOVٺt16=2av,캨OөL{o,ᩏ_Q#Pj>۫w +qòH*'xk޹ĻGTUKcfF3J]Y>{H.h]s@uO+ cؙh5gӚMdd⩛Ki,'9eș]GQ+v`}vT{?5^Q88D{ܾMTd flB<kݳe=}n2 3ze\5*-?J&yLb318*~|.6lk9lLբ|~*/JeO^ӘE+vZ#M$mDBI>k^| Y%W︗Oq&j\狮ְˇXR~X'ҖKEC4s/E{Yf+9U{x;11R0>b'X68:2DA "{R+-m+L[6ͦ4˴]f9Rq *F6.TPXG9{>{ Q=}/oLN-?v9Ho[G~03:+ҴtnT21l^+}4D 91gʖ4l7_Bts:Tt"f_m{AGh]Vjmf1+5NL*TCWBͪ\~6][@JFFTQau/"ED fxUyǎN྇>cż1zm'N|l͌xW%T~f4v݃H:w2sZ)Io3mt'HIҮH2OKZ%IYύ㍛O 1Ca5{+:1`<_^M7)qrUP:5mǪDrM3!0Ow`0//d߬y[+^\粁#px[á\oZ{QK>\ega*\W~K.<{jv:C*v2'fDbD~b̈́|g&xq;\ƹo}L>Aa9Z wt;0{g;GBiaXEw :i4g<iOœs6Agsxt,Hk|OT?GBF 7}O=0>n C>^Ѣv^)[Ǎ&:d+;3f Q:F< +_[ʟ1k\mcHkו\TahpnXS""""""""""""""r X)kH |><;P `zסCx_a nbahxFx6i_͆k0+9݄{vg*Vi@':'@ 78*yWYX&5nkgL<6.A>OEB=iP5|04mg5/@erEÝ潯v~r6 1H>Hr@~ڿYi#^׆oS ݨŞE ٕkcV] VTv%MJ^mrsNep-bw%B(MjRJB+4oFA9uCoq ={8l/xK|-Y˯gAVF:6K%[D#ӧ>I* g-Q8;PAA(Lr㈎F1LKDq!$,(@rok$ `WP0gN)IZPGA6_퓡c,GƗqswT>٢&1> 7 qYY÷EBJ w̢yvQ!13(цo>2câll0= RYO܎mS'.,gp<ɀYs-G?DR1JI"نhk"xxcaSѣi^19VqINlg6o7]ègn:sq`i9Ou/Z0ǣ9ٜ+od} \ˣ}~qP=KahK"""""""""""""""""BKL 47 JP\P@[^qN'MluZqJƿ>m&W]v}T d/VMo )UhecԸ;jRr1X݉MFZFC瓳gfv0`k lOJ$>љǺ6&H6r`Ag?VƑ#؀_t [%ĤR@&' m jy0#E Daw'zHi-+""""""""""""""""".dFUҕIѬV{`>b9^p\NdZӞ yiak:mFaT1_+R }/|p;)ɰ[MC=0^7{<':[,wY-v;wFp &e>-0ˇ"8UbŭcuT~`[ K˶5I+V7e kQ뒹[s1Rb5>Z.Z,1~SvzJ+`t"#HE{pn_#%?݉6._@[Nɟ.kCvX5 K6ٔccеS͂HYjUkmg.5kaXs6f\ذE/(sCD|rQJßν;cBK.>8 IL*xGGMj@.V&55op;#5Saev7&X1f-G;q1_9@Q2y9#g_̉E`YN]\ݻ\X zpuļ2~G%1PlRʫii`g IhiposNe߰ {Ƚ8#(-"""""""""""""""""Fik =21gh$Z3דyK/B}w+n>Ȫg[Dx_k:_[P(= ̬?-8A@a iVÊcCfJdgO[zVv6+Cġf :v x=ΗK'~͏j^[!%+\r:_?U;~pE7zqZ&ծ)?X3lsm +OZï+/ wi[1 0 lq7:wW??W<筙[HܿWQf7`{p˭oOѼ1mG"#7斗GDoxչ y:1[g|0iL:?pE*A4t30Rl^>IpL;z vL]檷 <6q`[{(ll$'WmE .p:sr-""/ m\? ]Þ-JUͣ #<5"oSS>:v=*u3E y9&eRf=UUkgrx6EƑF97Y. !Nop2Q?u*\X?=۴C)e+ףIx0I;7 w1mp=v&wlddUjp֮@Q:k"E^NO/>\]&1jUjR?6K=H_Q_,vp!ZDDDDDDDDDDDDDDDDDJhWPs:HQ3<o@Au.[yj6jC<F*5hC%xBv)y_=Zu碚 `R֮b勰]Ŭkȶ 4iEGqv.ՉH c """""""""""""""""""riX۟Jޖyo>͸YfWؕ\k)I-"""""""""""""""""""DV~2qRYs׫B\dv&`5'<"""""""""""""rQ䮟c}Ǯ-ۈM 9=Ly* !<6]ED0,Ӊ(rDN'p..4, rbz~e'"""""rdggl2Iao<ed䪛hRue*R/BD䒢@\~$&!*UVH19bSޗ ,x"R[ʕHTìVzw|Fw1jW䋛q>tKZvEQ78MVr%" ':A =VZؽcKw^^v)W"""""""2 `[XPEJuiv}EDDDDDD)-""_@E_q%K{TlˢCW,x+Ҥe[֭ZsԽB"P.m4m ]WE*7 NO#@'ox#%>pQ>y:{3٤_Ϋ yY5yMg ތ7.glb |2)mT k;/パqe]_`L|K""rt܃ñl߼ޥuN4nֆ8.uװgK ͥk$Ѡq3:t1lGRBahAA)k5S' 2yKzFoã/c靟ct~p'O5;V'_܏vP<7 `p|GT)-""/"ݮ[e%|_\֥ɧ|65:3/ OGF1=$ ,0f 8'UXƅk#7\t[ر+p6^GuM(sM}Fn!.EDDD.Q!<|3yk<BYY^0Fͼ>*I4w9MF]o0Ryl2r])4& ~:zBrXZ<gwliYN,׿"7^w%a`7ۮV[deݶ2rXͶ3 0RH)\ ڭ!WWw˳^]m[ҲY(5}X[`xxq3ttb1؃XEZ`TQb&B)on#""""'X~(׼ 7S.}xӴqi)YVT3j=z`"ad_N+O{Ia8΀;fll(t vƱcurS=RE ݋2+^vVN2jD@)]Zu_ӳw8inx?˹-HFeuHR ZDDDDJm[~qkr_]qf&u ߍ{WGCH/w 8l;e? 8m0 e*WDZs N'BAjʳ>}+1:~Y;pU۸T>նIO|B +#x&%X 9ڤ9|5P ZDD\ϏN_{W@!';;'V:v?v)G,ջAy`xXru/ m6*EDDDDDDDDDDDD e|ռ7OG{1~~zm.oWDGgMg@fu1nKM>K5,} #ְzvqp|&og fh^rMuHw"Q/q|s5γ]DDD &s/ch)ݼU{k{^*ԟȟӉS`9Hi1gTZx))pkE-p gMS?Dh0y3~c?O4̉˙10NÓ"$1> aФ\V\{O+9q ?1!yUW@L"rӤp!_L 70qiN~Q"""Cúlϯ}ŀht fh2H2rA7nK*7&ːKE|\6Tڧ4t/"""""""""""""g;uOK"j$fǭUq *͚V?lEz]B1g0RioבysM6#_0 0k؟%+Sӽt4 C[X5-=/mk7nDDD5ih{> vsnf|JBl?Q +Nv*FkS!\ 579ֲuo4q)8}YmѤW߇XIQlڗmRQ-9m][ؗue|̉Mux5cbL6ڼ &e&y5$"7m`93ٱYPJ+ybGyý1$nGn|e!+urG )qY5%q,ZtL.ͪR4!.z(AypYٵǻ6Z֥]ɋ\&6V,_8R)_6m;к﹃l]5q(%Yo@IF=9.*gڴyo@*4_pJ"r>[7y;m1ioP k9}7Gs Gi`f0Ź޳`q4zVofׁ#$(@Fm߂>g[ۤ`g.e؀M֡ߐa."@h9P$d5ъ2X8&ᏩLۙVv8mWquo;|ˇ~fYމN?~[ ?z@9<8>LD)NLwc4y_ N~iu|tLOry||Kvb<?GJOI_>ƛO!8kXwXDv٫_}7"#Pci;|098Wq8紝Y&څC6;#7yrsjᛧfll|+%8N3k yXSiYjimUelQ/u>y*[4amG+ [|?oou>%AWnaۯMğQaNbZy8~KV!g Z tO5w>:gߘ؁w16nC yggݜd;w^U.-p]-|DZT9k&2gf<ŸӔཐz5N a`zay_8O^_?A)N㧼zr;Kx{~,R2.$̚-Y1MLbOPZ=ey_8usɎ[ >toQ )⫥8ޘ^ytۧ0Cgtsf3gqՉs6/[O7y*sON\ϼ0 .DDD4f%z)& Nwµ=KUS1mV ed%gˊ._bQOu cZL^֗Q.#U ~cet<+?+ASm t q[`Sص7o'r<^'oo@2[2Ɍ\ϫbMպ/sӞʨ?pIVWqe!eߺY4М (\NZ3eK/]ӹY*g/ ǠI|#>qI {b [Lt֖+igr;7G|] G3-ãWxV0}~fu:iO<7J̳3n"#XY }.u2 hRřo({&3j-N'Z\=o\cvjBV1H4?;6*n)M/`c"Thؕ}OfӸ?^MS ޔ;mW3VmSL&v#br*ufPh&Oqa紒>SΝhZ4 V !MDl&yFy>4)>xONrbG: 7ή_g!zoM}NMCw~ɐayFjw؞2'Z6ci ᩹ǧ*ˆwZ(2;y?˔-i׎p_yOfq/ŇǛqV#۲L|8- dq|NodS?t ӫ_U5г$ʒBc R}5߮PWmtpя0!<1#&kt/o&5n;pB6&^1lxEJ';%&f}O1`RWD I{{,~5%[So{7~ ]GFtњz$EaBfϜ3eѺuqG4yU<3Eh1mܲ*e4lgvbܩڴwG g^[Lۚfg1sA yEDD\4+c`q_ k*ï .' @nɰ^V l. 7~-pk3 hpT0NW]^z6af<=AB1.½z CWǓpVe,":DTm"o+WYczycٺ~+Q ^lЈս}~l/a=Fl8w:;lG\Bi>k03jm<-ۢIv|@UQσOK9d/7!6Ţl4 & 9H8C}eзlzsnz>~s2hܨ:]ٵD^#iYLCB4"8z]I|n in/brIIŁ  ˶XDM!XQ'1yjTN kpƻ eg|A{pujږÀ,+,<й?\jّGPB< f 䂵P4l03L4vnYqDfs,&AkQe bv}Ѧ[7:whCMhP)|ź{Y=#3xhgNf`QV3:_}︚F~].q/dnzE1؀azOӥ+ZPgYDDDD΃w猧'rKKG|*;?ͩ'hcmR,ŌR ĺ吝sl/bKa-n > p?{(Gحo0,[;XFJT&fΏ0w|0Eq绸J^fQL.{S6-0ˇ"8V:VGt܎uN)"""""""""""""""""ry{mX$. bRnmMp`Ed>J~7.ndjxxav2#$,´1oقk>칵S#2/b5k&9j7l`}\P&fv*>$^UU%'O(烏XI'#IP-eӊդS3j&.M/ 滸[vFQ|4/B X ^x]F_g;=BRb9̜Ge$eY8B982kؐxX=wxUnzo@ *E)>b+F+"*XQ_AHoBJidݙn!r=Μ93poa΃5G@hRJ@w9[c7O[0D^qCEYm:s9wSիQy psV'HV86)$LDdTUB!B!B!B!čJ!<:>ܗ㴑?`u^j3XT:9n 1}AEO%d4>ϝ+)-+b JY64/d~Nfx$mw2~c{T讀sAt Pjs3ʓs ߴ|"J`T"/.ШKWzՍ:F e3)KUT7j'Gb`S_Q~X1Y`̷9nםIN~D¾-$'Z=[o>ErkK+j+s,(|S:;v: >r}BGvU?gs=w1l-:`Bإl6k]N4Ƅ(z큋êg'͜E) ]җOבPt0>7?C+ޞ8;9dT1 @[m6|̙df,țWբQ-WB!B!ĿK記R??q*j ,/Nn$Тm[xl U&q;^`-B!č"+CU7Ḩػ(BlވV!-;w>-Ј&4剼Oa; -+6C=_{*[a g4sƖXH;yHͲbp¿F &јM=ÉDRRΓDXxCUsGR!=#{BԨߌpKyP%﵏GR W4hIOՍ)6adsݣ P?Zv1&ZyӓAzyp*!1&ƒxwpmW#]OVcƒtT N''nNzi:R3XwCf=kTB!B!B!B!2xҢs(-x{0 {طO[AkA n\ȊbEPozahgj7SfW׀PVJvtgqu߅*m+b,(Ӿ[xE7N*Uat%s(BH?F*?WW#!(KΫ_/7_oxTE!8ȇ厊:eS_/wԮNp 2.oq4;bpr2R?.=݅gϳhG->NUR !B!B!B!Bq8C<-iը6=X Γflk &l?2qWdxFg?q7!*Gۣx7EᘮØN#6 wWgBk`0T\`ىz!A:ʎ,?GP6!B!B!B!BQ*B6sfK0 *`$3cI=Ұ C|3VT=qqh9m"?T}ܚ!B!B!B!Bzܰ  UxlBG3x/9Z%m|llj=iWa:;0:&ʾ[Qt2NPRW("9xDYoxkQ<8;;U&1%am Fq;%9E5CӴ]WCHkdjO :\ DKl߫Ys>B  j7cw{+!c)~oYږB!B!B!B!B!\%$y7\p SR7e菉חl7HY6`A3F#ޞe^'H uwADSy+)+ۓ,0H½ʽ͊b·95c7?rߔޣ>,d赿1yn As^Isw].w]rB!B!B!B!B!Dq}h7'lTW50wc?,SSQ`$Pҗu2(<՛S|њjsg3wӵfm@gӘw5/23 GFR,+f{I>Ƃ i^g x5'ϥMխv>Bf %n1ϸ]TκI!B!B!B!B!:!įdn[UWΆ+$:et$UQpCF´{k' ]mδ{1R(l9zCL(ץ]Jf'RjhNFnv?˳L^Fn~啇ֲβ'jœH0mM@+}ح޸<>5h[M>̶-1Olq»Z(MwM]2|fCĝK' B7Y|~ D\:pr`z8|kEоkG"+^6n4p P"CQ= R8b-f%pp^.6L9^i(r kz')w2\hԺ⠯4I2| kr-BZsLUԒOuEȕKZ8dofpUQpww!3+mw5Ϳ Իg >ae7IkM?ɮ8x,)\lN4E4 v+CPY##n{MB AtmQlaphlٲLd+קUv4 vZ 7ѳG$3a&p&AE֨wFxo%8fR?<wL8pԓL3sr^v9s&,5VrXR9c+;!9#' jGS99gK*Ǐ%Sw"n5=SqmNR+-];7&짿B!B!B!BJNsNnkӡ/snZxs¼nKH{S$EŮF}lq ҙ⟖rlXGSײGp0{4Bdc^qǵl+б$fتŬo6vۄ0Hg[\S7ȳݽ~>o3'R+ [2[['I͂-x<~>Y+m};?͇0= ޛ9o|ˊAXaL(|}_'R>xc~IR`(ub2NY(:gs3٘b0|NpS'/9̹ϔ|)=BRysGcoX0^^gV9 {v iG/=fIeZn6JܷZⲋuLgZ21#}e-;hhw.Tu2.VvnݯzwpYĦ8df`F%@y+ggsY ZO]ϻ?ם0[Kbq6n;J6[NWˎjۧ%x۫\جĄgoGH׊?7FM"+n;YiL^BX#)<Zhe=c=ozKb;xc|\ƈ,a_~AiJO0}>[,e y5Fv*qߡ%/g_3K9v8Wp ͫνu= B!B!B!⟤Sb FGč&g {iηކSzE:q*lEat/y>e 2?.0FAѕrk_v4ϒWgCңkk"jzrP 6"L*v#yֽ $Smj&v*VM&aG4aeen=9kewz\ʆ X.~ӞӠ }nkImO c$fW3X0s9_0ѩ߿eje~D;nB[*Mn I' >T3g6k4S7yig8ջ topr YS[gI[R)U,ώDr>gbQ|/ Mv۹]]ˢϲ7xyq"Sn\K`T4]q-)a:`mlj-:}3!E6a?g2-{/}G'" HzB`fk9rz>;ӿ`mAhۈ_:o M^6׺#-cKVr.B!B!B! WOH29zߏM&(A2g{MtoکV>XV)u5N8ϒzY/JbGanWuϼֳ>9 o_Ow-yn or)L;t ~;R4*f44˸zm&F >hgB]t>b/Lokݩqt0ٯٗJ9bg]>*QbzA:ר Z?*ԥuTem9:(4jۂⅸU6x!;Q|H<5؅1tjW⫘nҺhud3ysi|&lυ/זݪsGco,t:='|q1yf/'e͚ӧ\!B!B!B!i{5SBh,n)GYk&Ztll? gՙ<9+K_&,]Q|0Vjɩathh%+ED?r]͢>$ξ)6j߬e,'Ύa!B!B!B!eOÜ*n)קk|(djVcGOnjT#pIy^#\гްGbw~G'fSu~uRX'7 Q[wqT2|'|Q=!G8dc:˾(b|o 7-B*Kޭl}3F<~S6kNd-Jݿv@8i#SO9i.HhܷE D4F|Ȍ;)ۊ#EҾC+jq紬쉊"R4|^#&(An'梸$~ݢ>yWH#9TnCH4`S] Vp$Zzf<cS/zLJ)iq8e1&2xWj;R'2oJ-z)ۆU';GJKD%|ժդ^v{yCDmp| fkӴ}G-=YK %Kw&^5=SaV6au㦆m9 !KHؽۏop i.tlصnێ$`S;+Dlv$ٳa-QGbI. r7JdP}{OKnZP-&R35J'6Zva]j=n+2֣wH]5MUY9 صk9nQu羮.*l3ba+ZAKdݚXt06m셡F)3qIyε;C&} 6sg)؍{;ڥ&nQ[K_Kݼ {-ߧ?fߟs9,6%\B)-\1/gWqSAW e&ej֠׽`z֠μ/MQߗOvnn8YnM:uj?FLEٴ% .-ѿO蠕ÛH~<--Am{O i#O&2Ϟ%]B!B!B!BQFZ Ny7m>5nPI;3?:8%~ψ:WhX41s!CdbYUtLZ9ˏccNBQ1`y[a}21 3KfÏNc҃Y T5[e{go35k'4e5,=鯼Â&l+͟CV|]3dnaꏹGAj`GY{ƆO'gGSy,%UAO:.$iKf5w53Ig븎Đl.ϠϏ4{% &޾Xwϲd+s_cMIv8S(-˞ˈbtLJb{Cւ]yZ+㚳{of(ISSNGn%DqdhT)}ǩճyl-W~M3'hn,R= }#<uԉڷxVαӒbc3W?s0} DznA-N^h"O/ b3q<6l('}kiP {:>H(^o3⃭kNz׌3֞ɻب{;xzpdb9$OUB9 `[,Qٲ5y{rg-ݫfs7Pթ!il"F&u1,݉5>\hluv*To"vx5M*k:~<"(^|BLlR.68f+5}7=$mւtp ʬGrRL\+7s ۯ۬hb6a.x(Չlx8E4&I!>jڮq 24P\"hq?7nJ_7{}m14ax0ڲqpb>`.kW}SGp''9gTj6$Qǫ4A=5'l D{ةxzy`B.E!B!B!B!S/6jeҝ$ԿaXz%^hw6O}cZՖ5*J7E1@їzҵENy$wqbՇ ;cbμhyincg#~߹ !6Rmd#ɤ EZ焴+ϳa{>һ]]|_Ʋ/ ><"b 6fUw'/q/̉C8ex-{pO=1:W]I'd+Y4:xVYOOW.oy<͛;(S筼UYJ:iG<ʙ~3W fL|HϘǔn%y_ͧ(\} sPt~Y,`a&.+pU1g<1&3:˼G a~SZ/a\ |LI?R2*~(e1۽x8x Zx\u=B!B!B!B!O!1iC$I^frR `#v<"a縵ZB -?NcFI1鮰b䜍awVjg~kSYLXpaQ_ɬ?!/:c/,:mVlշMHG3Cv].nyXV-2`$e~FpaX1u$#j笾-z^V&Z L,xi|b2zX,F>ѿʡ<06x߾@+ϒ*Xb*qvrc zn*oyo3_ۑ|o8mVQJb:ϊi,f`x3"}O>8FbyW~{Ea Y4{S>}W4Ö$)v!_B;K8=m㽁u/CQ t'Ikc/Μd_o?>LsK-|=dUa)ٙcًJKE,O~O7E kEEc%2s5/31T3mW^IyV?Ovnw*De}yih_yoV0))JcJzC}Q,~87=Jݮv. uIU/ewh(*OE_pyZ.0&\^X򭗵(\} mycf}Ʈߧb{gtyt |s̎uY7.ZE0A;OeV .V=JFWP ; gqvz~j.u]a. P),B!B!B!ťOMnJ5g}% n5[qsKUE3(̚M[B{^ o!FJYru0uK]Y `k{W[[^)^c_ʹs/S2 zѱum*=z&4J3)a c*ʛC˟8bQ{;#JDtlA2vي4՟_V, d0o> W-Z mc ޾, `O@,vF'\WԽ|S|O6wA̬;BO-}.ɻc@#%zG.fzMv̏}C.Ws|c\$tYokl}ҽW^Ї+9RKz9ҫ0`DAz4G^Ms A*qlbъW3St @9/ՉenRHvalKw`(Ksx)vR}-s)6@d R,8Ϣ+=&I;;\rF^oqk̰WQAK]y4{ H¦L-u|ݠHK_^p8g$}箂_o\LRRIoBW|)|^U)۰9trSSJ٦Tt uB!B!B!Bsvy~DqdZlDP2p{f9 u{ok<,ރa*h l>]QŨ-n#g;ti^z6/7լM@#wZU)< ?7tVj zwyrY[Yлg`E4b׬UG ;xAm=hf-=m Uq'ZӜZ^mvey2Yͥ.:9y86_-ȇ7Ƭ0qr,zhSA EIwC$]1ki8`LZxر']BǴs'lZ>囯$W7\ꁧy2ѱs#gqh)P մ˲. QR-ւ:6j=]h(oH= D !B!B!B!@zv)WgCV-J4&EӾ%v6ΡϡQ zg3L>؃^]V4k7=-d醝=KJz6y6 /֬V@!d.a8w& ƴmVvver͝Qco$}6ڱm[5# 2֥alqG8EV3#hYO*`M!f;śPGEUwkRTsESa E X2riZɧطisY) C-?֋ZΝä)n„jުd.1ˢ8FY!1n#;b'\Tjh( IDATLowKBQEZ#ꇶ @1r4pM 3DV>{'fCrb{x$C/9a ؓ,7TFbVb9yCxg ;04iՄ dש lW#=7]s]ysf&^W|Yn33ɷZ؛N^״2sT%ک977oCM&r%.vL&ZW܅GڵpͰOw-kۈjF3'wogw|5|)Wp:`⾑c;ZT}#k%ıp65jAd+Gs,A=`|cJ@7}['QɈ ‡wC^r^=mǞĵL{/?4kI`g5Ph[%UB!B!B!Bc/{9-;#T(%&pN2W!0h^4}ʹN4v?@~qVbGi>^ѫl v_c`щ|tC8gŐFvZi )- & VJ^-҃ro]nw8`|2Ջf79YL\T0Юpj9d\P5 RTA I\롇 -3~쪊JRFW~D P| AP ڪ%9 Y#91\Eթ!՘Y;f'-}̏3w/Fk:'b6?sVKzuÂo~ѹ$rh:Z'KW'jL<55 AvO8֣ Z:A^*eĜ w"߼uJ{ƭ/|6;y?nkB~ѫsYÅs[]l\>R&͜gi{cү +|L(JRAhT4,4@%d݋z 6S,[W?{^Eq?PB 4z&F`?6=#X^ ** I H{y?P @:`fZ̬ O0W[O0屾Ezi4z⚙6觯XCOCC'g#Q̟?.g;87xo0Bk0LܼhӗccQUwʤW'1&UBfb~y>gJ^g8F?C΋7攎a4s7q|*P0~=o=Ƕ}.J"kKWZDDDDDDDDDDDDD161(=vdoD^]f`qM;=봿#m1&!q`Ucҽ4TZ׀H^|'G YRowƫFl.H֢pv8GT$gVnaՊD-˯1탗8SIR}ϵR`rq% 2'q#HYĢ솺?&cOeeBa5ɮ5 dX`FyCL[l=e5 E՜Lgun껬4b3;ZJl]pW-FAy~MOaCZ&eFt$]G,=V:δf[^cӌ˞m)l؜A^/m 'سyC ۳ (vҊ1isXW> 9VMA }䁣ǎ3.HfMvTЪ#]ZqԲqհ;=p׭gs^!DvBw %{Br}XTz CP!=h(#Fi3 -""""""""""""""MF̠ϼJ?G~"?poYu GV9˾Ki-|{Q[\ 'sgfk}REl_,KW66(OMo;Je_}Cv~gCnbw1o+*}/KkWC7|(j'י(U/ʷǹol؛ϢiQ2ʎ8AA̚@iuD?yoʻWUl=cÍ욊a@7Ȩ$/}YXf^=ֿq\r\:5֣l1~?Uҗ?+u(N73ʱ4Xj_6.e_Q~ 5m+߯|P Y_dbe畳"901׊ rrPa;қg/kSψ"""""""""""""""*ngsּt˾]$K!7Ò׿d[m'7#}q?f>pbb3<ͫ\ҐAo<'g0.F}يNbh̕LҒ6˝}9]9\"ɍg@ĴēR sv)%Xn}yo4.X~ˇ/x"2yb/ ejR˰L_z];A_o3>a\vtI9= &`OgO aK[agm&iΨ=_{i +X>{^YUZ vs_YAΒי0C":wc.eyLMb|Op]9o5|p՝?-/нk;mXǦ\L^Lǂ#׭ {ݷy>6VA9ٗ5,vG4WvᵹOf(p1W"u/LxuܴuZOL03}QӨM\+w_rBfDuKxQLOɠ\^,kAѓ7̉La; y_NcX"1+ԝ9Cc5~\::?uwf|9I9XqW?Ν}Nقs|%yԵ=aJf銍qe[|Yuj.M a剛[`_Q1.6qCBtm7Gqۙbrh狷w˖ {q:-ȳ4%LyGf[ٻ#?vx-el}Nrq{7?)*nv ӬpQ\,"?|$,IÆANCwDГ+^؏yfu&;/f0L/ºfspIg2d\$gq<߶;yD$$}.܇~jQw= {xڼsW=²rT8n̜ ٱy;V?LYǘÇn׾G11Kg˪l9tħU 8ٸ}T^)4>yc.awk0Dr֍xn5Ftv;^ХB$'ygQ;Wgj0wq.+ 8lL!M./ ov aM?e2y , \\\h烧F іeQRRJA>v;CZDDDDDD_ .>lGlt88g[26g[dK`h:D%سϮ߻Y+(фz4?c'Xl`{sw'{w'a.OT8F&=X_#LyV~?l.;D:"%|:\|ŅnhANqq1,,Ej03B9?*ߓ 0 <uU};׳|v1N.-C"5HE6:^^Ւ0i0 DHz:+_=JGDDDDDDDDo]gmC.m8ڝN4hE^at ;u(-"""""""""6w!.;*dbTȿ389L~ *wߘZp{#W"""""'g..]M;)rB:El[[XxeQPj'5=76*GXݙDZ÷5qqqo,XRZ3ATNK؞#== pom[Cj.,7B"imP~[IJF!z^4s65ii|V)hFspx־ u%s+hwQbkFx\_ yNeR3)6< @}E:ْmX_KBJtx96ǽUy՛]l÷yO[ՁQhhWuG\-fUvv0= UێtO7ڻ-{w VM:!::̫Y5d:jޞnӷOm;Ҭd.^MJzhK޿L⌍l!::;!""""""""""yuDΉ.CȆcDDDDDDoȑ͟3+ IDAT_ټϹ?Wa{Y3%o=7G2u ?_ ?2k'na~zzR<4/q唗wP0޵Lm'22iL"g<2YV:¸ٌHx;_[DFy ^;xKss1cW+<s S^ͫNnyOb?V>a&]эfU&FI zRh=;}*Ww=<5Hga<6<3asΔ'{/TqWRs\bn⋏b'}<,(;b/x!/Y4+O^*m$]#73iUi` y֬W$}x+>~!/Qy;k^ؗ#<<*8_2r2~{{򬊣a5k{GX5q|C eTAd#cyn;ttd-b0sya?].{F|X6sO2mzrG8ӛa#c_kwctog]CYwBD*S ZDDDDDDDDDDj04@^ɫP49u~rx]TX^mzsD,eG*XT_c+ߟQIC}Zq<:e,aߘ݂ޣϡGEl)Ld}6Jȳ+LN0t{rٺ/FCE|RNc[p޴0}@.) Xc\5#k NBo[w0[~d{?W<< ;s!tjA5n>);-L8-NȎ|-Grz\ؑGX_ƶU?[j1fn_OޤY:7>=VMuo /_[N2y,{xG6&]+f0wP-{rĶjUFaN6%`BVno}+}j>Z 9""""""""""R+UkrLDDDDDDMl` )^c0aGo+KR Z6IQLa ;r̵ͺߙ2SUu"g~i=?}NM^ y-o˄7_>: <,V>߹/gʍFXUљ͂xq]&[?}9Qy?Tu\M\ 'Nҏ4f=:yN >ƋL>w|u<nYK 0l}Z2~&^qcy[pf_k-gFU[iSGsdu#Y"H-ls&wõk0C9 CxNIvz.>~Xaâx2֕Wwnah3Ӯ>HXH7G#V CuXN7e+ҩM.[/2wdW Cޖ1˨`˙W#P^E{- S*p16jdV6IY0yL04MUr{ OgaQu>l|6 n\-^B[89pT9I 7>mУ\uxqC5m92 ~|>.܁Ƞ"Z38,m/~{+`0W{@۱^ :" `wc'-8S * k1A_+^,s  ܺǘH*O6:e'y{wt~^?7ڰ]:]INnr3.1roMeʁ'}#s O&U[«)Kjlv~%?QgpC]Y "[$<.?3ZQBʆM60Յ(3 琞Y"'@i@y8+` `p@p 8p ^G_ 7WܪY8avsa뱬jN<0ܪY08xUyB'`p{P 6(/ L(WuԢ  0 )0 Ia~!՟\j+! (V5lyտs pwvcG͈xy'693Y΍l~"'eG})-""""""""""""""""" 0$4%d[мfQA3 @yΩi&3boàGvN2kQ> F cBT}'d88`p8V}ٻru]9spҦ5d=8݃߸Om~t~{-pj~ yE5jh27T" ސ?!A.T{g\~MZ[׮,]54"""""""""""""""""ҀLB#+Y,6GTTs#}%+3,FTLT :l<pbu^uw7Paہ`Hb\0peu eՖ&;v$˞Ċjַ_M %\,mlkOL N2WfGuٓY'Q1D1}1:skkۋ;ǶdžEIr֕dܗ%LnA;ɫQTx9HYĢ:"'38{憻}{3huCtNn̟GufgpTgl6BיAN'8E/"PZRBRbבCa~>{h?vBL|<<=Op"""""""""""""""wgEό"kJw S|~וAGFlX6sWX6MuyOb6J).OS8܎8˱%'&3AC:l%e+>s9v6} KNvOxw> _ztd>`)%Z o_| (v[*{!:3VR f/zqEϳ ǿNݘ |}}p!߂VU}z -cc3N&v©! p>8#own'uK,=m^KdEr~c1#& ~^v$m%na&]`AEŅQ#G2jF];D[ŏ|ɔG_璕ahAVf:)Ǐ|e#"rɉsF-ԹO&?גQzt6ϑ>YM1]Q ͣc肧$wS=3JYY~w\ds?i{Y>cKkN5~U\r\1W iXŻ3^%a2Ld#o-B[bsi8vvgbdf3ډ!-"Ǵk#R6Սn=ҝ-if[P@AA>YH\u$O i}1]8Khٺ͉9a N{i7g1,y >$sg:R$6lەYJ.]LxOؑ_ѹGgZ;i%aƏO !~7lW^3ѣC0^LVi=( ԵlewF2kC)޹e3(vЛ۟5F^ ~qA\N ӆ K^{z¿eV[^t#9q-)1 ~ȿCk_壘le:nӪD~@w/-♩3K 3H?#}7M?;`⡙309^&|0ihq83qCrof0okuazfMLt{+֚szqSyzO$e%CwKXϰg0͛?wI۳),+nKz{-<*-ŶUQӛrsz[ת)1B%ز;r,ˤ^ `At?m݋ngaӓО[MvL̔Oאus \;qqWǟιO&L}k&in``;xJˆ"r$pgLy>,&7j*;m''a=:-t}UEE9/݃Qc.bḸi>Ew_~JYY)=ҫWE:ClJ)߲Ƿܽ*Ƥ7Эwþfbp{$yf3\s38؛LLrazёvA3HXNDgSXj;1;k( y&px4#]"k*!c6C?mbʛZ=IG!I̧/ZF9M(,J6.%.6z埾OdKnrr((5p !c =k!f} xhOQ4V(g϶d6l Ȏ×6tjK?S(6@h p0MhӶO;sgy&AdSQQ/>MZ&Bswڲutqqe𳈎ě<ϪeU(ZDDDDDDDDDDDDDD_ˆoxNi_qnFvgPduRy7A OV #K?»ca<ͣOt!GP8A'נm0 "r oPCMYkNٰ r,}Mȝ<^0te-[s>#i轷,EDDDDDDDDDDDDDDDDDDDjѹYmPSswDN /&(9&މOÄwªeo| wk@PSҔJʄrM3Xiow2֪o}ʉk9\wsㄡ[݃|ήߎ#w>odʯ{8qs'i4w-^qnf劕{y 'Xb.#h b$ga%9n:/>Ʋ,FЖ}Ж5"h~zd0G9tݻ[Gѹλ`Nve[Jg0O/CKHZuNѰ'aovB3;HXiJa=j>SDDDDDDDDDDDDDDDDDDDș$}p_!0zMۘHrZC0xx;`pBHJ\˦ r)//?꿲b s3HMX3џ3ݗGe_W3X8/EŊ\;:u<#Cȿos`9d뺸2 =u1qӦpap7+>֑[ʧC׹]|hn(-/RZRƔ ѭW&_k>|<-6&'RZRg&4 hAvRt77q (.ZG_oޖN IDATқc/t\'nDv"ADxO.-`7=P"ZDDDDDDDDDDDDDDDDDDN. Dhk.cMj:9EN<",N{v-ؚׅ[KP:Đnaxwe-^MJz.5sj߬M+sU2[3 (<6Q=8[k|wB}8-DyaT}" ;ȫp'U4}'eGKx\Ud l/[@8m0kN9ǎXE$[G֡ ܂ 58/Qd%X-R>ُ>1WsH^e'" ~F}BJJLa׭' ͍NOXErZX+9Byv$&Q`XŦlc͊5$mENa)WBt[߾t zޭ?ߜ" 0:Ȑn-9vܻuCt)K_ ļ"0,)̋zŗm9x]r{;3P9,`X6#bi[u9IULT0 ϖ ;V,d[:*m;ó#Ȩy璲b +wWf@T<wr%}4- *rYRO GHӿ"""""""""""""""""""R DWő⷟ɷ瓶Ϲ?WaݥO=<3 F/6p"/N>U }I|Su"yW6Lo"NIWÿEc/lʏ,=E.kWuK,̶v SUܴ(N3vόg~}niiVu  |F'T~ 9gsU}GUmBB B "QQQ(`AD[TQQ  @s ݐP?.߸ggfLkE'iLކP8SftY&R2j!|8s<=jLLfagѓowCYT(\gq~ tK!a 0wY*jV&*դC|9k6AfA=>OC漛rs_$kD#?)1l9j&8~4yǯ;̙/ҧTwD2¼Z=#>dw g%啅Q^׭ۇ?| /?#_"4.|]6Cǖ?25+vFKhLj3sJNf%gu| Zq}.a^}1         tQ3 >M*aQ9:5ū rN7/r9n%|%dz\O鄟Þ wɦ)iVSOLT#;:uSZ8sw;FJeʷi~_V #>:Ӯ;Φ:"p0Ǯ$&dd{+OYu>p|ohjU{vS9s'n`Wo.ez++Ƶ9p#_\BvnDˆ5vƨݝM5CAƶnGzwmUN7FDT{<Q+)IDU@BccM9V8{|':hwm5} #dFeg+\@ŔbBFݾ>U3~f/mx05N`ip&l{g٢j2GeǙh.lɬu|+Rn\a١ ݋LJ+N2EAr$OB'Ѻo+jB⃽M7h}İ{т/=zuՔ[A~+7ۣ|9s:#j,u,VoKukGR`NZ.MJ/-         cM^թKۇ){q\;}%w/u*epr0vOiz\cC̟^*TlmpccWwZZ#%͛8dwF/-5chٺ&ŷ[4sg?vfZӢՑU|'ۢbI߱޹`ٌ %?H.ayH&\33@-fUIR,㕭m+LH%/`OdHqӺ"jC:՟=S-tF^  :%o}-X cяheg_eƇly_Ҷዩyf *\(mm[S*#].V$g2U cPD$Yo@6zQgTƵ6G*|]Vضf }Hc‡U)w@M?Ī7Ъ2='104dϫ3yǕk8i1U~Ӈ3^䕷ӑå9z踺i5G$3HQL<PRHtzے0k8 Chk CəS!O%         @tQyA9@W[<}VeGo\ePDG )8@VEv T#q #Pq*0qpy* bX3 W3UnQGc%f xVRrv6(D;Uħ~Pٻ?MV5£HDsXeւP.þ0`| ی%im]!놌BBX8)꽇\Ci9諵/YӶoW\*pTrz l.ԓ 6ە4YZamu?+s4jq3(Q=~&C7OzFj =zEE1z]ߡ%פ2 ѤzAAAAAAA*H!;1'8t0GN#$"l}^y}HX &mO1W|]T6o ͤ?dzJxz$[#ymo\,B81#yu:Z!d/)]F7M>q@RJ3&RAS*+;k($W@HTl`p.Pָ*sWϳbbVJBgԂʱLy>mN}:hENxXVlF8y*6+_]XHr¢5Z =q1NKôZ0{G؋KUO;T.¦|tu(7DiQ)=t u"U1X"*J(OګD9M@ nœ&<K%-% heS*!6EJRЅocmeonn*Hd+1Ne 0U%R04l<42Ȁv[˧8m'RN[G{СKO_RE#fcgG|\ ii8U-*=0m[ h#_p'쫢I#X-Μǒgvv,GLM?ǒ&dt*H3[-0\MTJt}kHMO%@lj DQ,q(%.; SQ)=X} ?rV>_ћSjTK'-WdJyc"hD7O%`bbI.       PI;+Sȁ܂$cfW' 4q/̶ʗh.T2g*ofxd+5։!KeNR J0|m,r)Z9ק3֤W̓ m"$]` ad%0S د/CLL*'n3]Cъ~;%wJ|o.KH0%)I2ppp >6^Od q1;:Ur3;j6~b(~ _󾤝,ZXWdT ~=woD-;"![+K2+%*NRӲjz%wJa\E`KH-Bcnt ZMie{ց/(6F       qGƼ ɸ*-ӢR~*ag_mo8a!d"-M`CI6Դঐ]7Wg:{A5%k"YTO܅j <'@tٱĤUv89!t:9Mp!A!6:d _ |y2?q< xTp( '"/N)l[1,U~< u{ d1X_I$6QH;P[}:~n!8,޾ ]'>^I{!t^lN2zMO_GJR* xLNKR N !kWf%[ LG@b%[m $Ē_Y NC3ԀJVf㩢lb :Qn5눏KB^w8       O~/|dˈo~KѲ/oS?1}Wk_<=8{\)#zIXzPMi @]2N>޸ʧRyc,jBq,jV-G&C⩓j[;+Y絯c6e~X.b3n.%:zƭq.0텧齇dK+,$@I%)E{=3Fh4&M,uz5$L(֭:˙Qߣ ޾ q9y<Ȉ/SWe3J%rr 򥋻\dW5tU"9s.Yo ZS:I\ tg_8Emy2UA$N{Ru*grMUk[J'6`If}%V據C>L^;OmT.u:0BJ#60J#YteFA̳>ɂ       O߱9ZAmh& CGS18Іi" RD9茭qQ-[_+d8SŤblnKu<ث*ƓĥS9{qd3qs#_jU0Q̕Ӝ NLRb[&F|# UoMl\br *Q N5iЦ#=Tbp5q*wE}p-9hO$0, S;<MX뽏*o]"*fEsyD c:xW3 8µ[ fiX:R×dFsI"1SΙ.k o<L)[ {"Pp}ta\/W L*Ob/+D%e3õ?mZ7uY$]=3M#Wcc*Tۄ֍j`u_9B=uǃJdk]iIWҏ 5 '8t[IQ0rjo)dklӒN|b4֝E@$r+fz5\zT1tX<]:C@U"cS̗0ww34,>+ѤT˗PO_6[sUd}9۔tObo}==+ctaۃְ<\ 9Ϲӧh޺c?)kL!ݿS,6 M0%Խqe$^wJcUoSz-<݋%U|WӋWs|}b-A+b|n1m:KO%+:V#oƵN@eLG*{>=E7iɬKyJ遁K1o T.ƸW~+rK=F@֙;o '’"[զ9z6%pl|razK 84q}3V*<ܽ^뿰 Vl Y>lA>f+ГT2We}`y7Ҏ+Ug]m8PlmBZ#ii0]~/=m|> և޷^5`FwײfDY\0I_Zf@YL\N?`\L{,rxJ"'gt?;gKL;c ~:.GC,a֎ѳg1\%-N[́[oʓSr\m_m;xglr|vë==0袌|xu3l`;qV{|6k8m]ґvܯdx5nn&SV֐MlHjt),ĝ-l<Ɏo=f ?fS5ysVT IDAT|r.1)ٴccSlj:u<;[äK%hU+*{X.u݇?ϊC?s%qs'Q4wS]:53pC:drx:ťl߲[bdx[kl߲{=>^`L?`W*dkMxUFvY&0:]Kb[4s=IvdGR*nmuY%ݧ*OrQ 8+{Fiع#ׯmD/[ \̨q 9ӡ q6UH ‰Cz55߿K.dȖEu'#;~:f3z2+hX.$ 7$Z։f.ؘI'2<'N^$3+X:"7La$*`^%{JrIvlX+ǹbFhWwgkLLϱ1Efф (?„%tΥyk"[סct!?fˬ񤴶2Xxl{Qvbo%[3fqf~D >]pKgjQN ]4sWh0[ ;;nr~G [է% #r-\X}+<ͳ^fh뎣BF|$.^#>#V K2 ȍgg-dlƾOepgpN}"'W7E=GpΜHl&1gg~w1>nw+-\U7)-gٱ|ôh=vKx$ fHL!Aqi2c8Ne n+~MaG峜q*c*'w?V}^}_s9 V6n+#['GI Ьnf9];K WĨQtEof G Fx=?iܛ*FDKg_?ٝXށ:c3./4s\KGLo&sjCYzO6M>+&*LܦsMqԻf]h1~=X_tɱ3/=[Y5hMH}^53o4Xg0#ņd\DLZ%ÃTlp~-Ǔ$Fޫ>bl6wrili'3Dz .mK'>^.m#>,.e prn,gU>s) ־7Gʯ R,fOs7wf l&Lm ?} fZF0u7f>?@:Xr3_{!y ^< c%փOẈ_{߄=z?ǏQ18,p루}o?/`Tc;==| z)*NѨY[HFDavm}96nփJq ~g %dqAݶmq28aoLbƭs^ΜZfq9o'ĺWS]]h|r},D|VSK5c}. =ƶ-[`019`V=o}].8XP8Cnko8_zڥ6o{cVw\#//|R0륯tc#ٶ g"3PM]h9t&.{v4t>_@$m^OlG_L-m^$I<7G_QUmQ')Zc',+ ]j8'vme]Ca|ɠh/ `Jޡz9?}%Sn6|P2 [բMSϥ=  :VJ0E3)vQ(ZĻ4%FAkOL ?55 nD8̜K|6VHjH1%FEVk:1P̕z6Eƪ"Y❙C waDӜ2v8Ƀ!d`mH.H[U,Y79{=n}#a'oAJhtZ4FON;cB#YunGr1<\ds;\jû#efewF~^coI,6)\ !9Kxz'2hDPn$3ٍQͪsi7s/3K#>XC(ܑ_mŘ˜t|SǍ.{]&,6Z3gz-(mhl˥KD&g#;Ro7?Dp~tim[;xL |2QߗZ=ea hi<62/JdC5ݰ6 9G`їyk{ D&%. hXǾN~!hX) ֤9tz2yI/NʅQ$ƙZ޾x:g6O}@F4 4AAAAAGKhPt:t:]%|% W:(xoH&<dk$\ 'EmZv2^fT yq7G"{8܄6+(S{9W }LٖNP I~QrxH$* ;վ|_JQ'h|8 H6myB]{ƅmG}2qp_0y*5k-;w Ȯ<3z+jc;HK=|:4$l0 v ųv1JǎCºMz-+Sk/8¶'7Ի%n_u8ɉoM. hgw^41ɏ}.[2{XlxC*mC\l4ժ׬f%.6'窕Ԣk7ZTR{a{ں7г%SG<G`2>uѴ=?`CFQCLtgOg 5JEgfd⇅$%&дESW.>L#x5We 8 5fŎ!Qū9Uً 3z4w"    H;ORBN\d2r(Z0W䫠jHP)Q@Aok|k\r/dbJj?l5tmHBlT, %Ѳ;5 Ldede?!Q5#[6YB£IL"WPPZ@"-5{^!6 H>4/^OV}fyk(51 1ΉMxk@p*2՚4*5H!6, H^{.gO=S KBi邌]^=ƞ ~֛]mѣ}KZ4kf md>CC@E}Ѱ-ɮSlݰ}\OJF.ZU-\ |H#58 " q=_ NdO5<}v}O^2l ͷ`P4 >6S+r9u0^>~OA/$$59kWXnj>.s[,_%I F"IOO     Ӧg} K'=AAB8+`I8:;@&cJQYD~8NI`f뀣&B~Z Q)/R&b/H6UHꐽFB6s~n^"uI0-$,#[Vr|JوN^ڗ3ũ$r L^}td-lqtrX.&s36- N3l%[e ?tPa*)I)(šz7x @J&, .KUfջ')'t',dLAsI6с*I n JSIKN-[8dTd餦+lW 0utZrSIRc=ݠdaC)ee{G0zj:*.Jo~vrJʡ \90C.CQrt^9* chgv8=ZnlYSK읱25B5 d:tE5t 3{, .q {90p|=A>RC̷`Ph߹;Giڢ 5kWVerz8F}oA266aSX'Ξ:WΤi۱+FFy{Vϑ{zrsshڢ / qAAAAAlG`QN?w&VDA?bnr!d=ƞ%ԥ|]6/FP38p*?$ZgDԲ3FDʒ2LZWqN $b$)9 \</X9=w,ysñ={9t gIzi.9ö;l!/{\B?"l$&ԉխ76zM :ja0\%F8;0YqʻSdS=y ZzXB2eM$)wW|g] ֶ)XI.O^^(VMX3(U-}LBAMv+MGd.˾=KPX9)a-D˘l5/IwCKtJ?b5L79\ۍi]/?w7ş}~+J/BQJ>6FAoJ D;UJ^}f~Y=B7##u"Eg89W}, cc^1jnl߲M~y`6mEt۷l 9)Iy|NTAAAAA wtunݿׯD(ZA2~CUt~;ڿ^+Z9BD}}.yͻI4 V46N3ťa50@MұYt9B])Kofg(46uh?tGo/,tYQ;VIN)K89; oM/?7["Q5SFx) 2cIUqʱOd;4HK'AQ%3! tζ2+EǣR/a_XYOm %V4#>y)aܽKq:&?>&8Zɐ/( '*,#>PEarqueh瓅oBOiɤKgD>y ^ qJ\-T5֟y? 1>>_W}:mo<,VK~5_}:85mI+/A_'IzeǟPן~_iE 9~x?aW.KnN99$v2gL{ ~_}'tGAAAAA!/߆$%۲oؿs+1 N#>6;۲oHIJ˯m:x1m€j@Ɨ=WƊHn Ҹ rL*sOJ}Mg ̡B bT=Q4NT%e}}pAͿᓷ+zohgVx5XX% Rm|hWҕsׂOA0>?R+o*qʫ}bFȀ.,Ɇ^qWAK¨.^&H($:Nheԫ  \x:@v2sSU%-'oO#$tDd`*Ԕ0pȖX[H':^%B@[(W Jƹ3\;DswGhC 4ЍE`PGlgۣZ%=| T$IU͍۷v^]hg=zKAxܪۓr9tא{Qc      $Cq.C=% Ц3 ii0lS,-o[SɸS IDATyȼ3c++K&HF|R`^JҔ 6dheMR PtZNL05I (T/EÊeY/{GRAV0m܉vEV5ųuֲZWBGLZ#A~)irZ %5T\clj$Db Wq&g]˩٩r-kևzͿY76]hfvQ{:jGlmCW5DG?#.FYѼˬ]sl4n] 2*Zw*NSg=?/ewruӟ65ǽVUdnys´%Y鼁H .)dKUzt=K\ƣcj- Zw5\soMvIHZU^բ~miQKkjJ[R+ZKI$HB$"{[pCdzQw̙3gνV~^u}GU}q+Vʎ(KV)ӭg/LNz;Zz=5a]Yeq+܇@o=hEY+{Tx7FjF~Ku`#| Z.3SYf/q@0:c?0ؑt<7ul+ WSPW8B {W:;ӊn4:A~=NoaY:N^T^nh埩Rd\'y߷ Vƹ=ykVN^cs()Bv4].!|8&CFJf㏫8b* .euz?=kЊYw/i:2k=?=:eCf?łXq&7L_*= #"_vG{h>ۙZ c0nb4q*Vq3*?¸*]kMz=bu5/,,-iҢ5MZ]B!B!B! !B`mmw`oF<|M_YXPHMN$)UK}=*O̴ /ҎUSs6b>/?Q˲3GN~=e]ˍcokGy[ 3Iρùb9bR#V3g fY8O-'lTΥhT7{_[]LEmK>~1VjI Nǰ7aIkʼ-Lf豥!mycr84"4ŊSj&4y).Mx?Lzf3S&P?b(87/NOv< _K N;ñ$fC9̟/ŮsMӖ_5]$jۇu7 6ez\Dgdx?k.{Gv7mS/lK2 K|l[s%?h Ne) b/i1_ۨnvfpX42?ޘrepRй)Lx_>l߄f g/B ĝ~@f~ 1gq,$N*9):ʙBO.Cr ^WQޠ?5Αa;[$>]늊I{Yj~̚vڔ$pj!Ζ qW:Δ"bb`Do݂q|"SYsZ;}am$r<M}19w$!kė^!½ } -C)" .ۜ/'Kjظq:>'#?qj܊fu(Ia#5oOj,=ƕTy׶͏FU[ Z!B!B!B!B_åX{Atz IOb_0+q>6w#3gäq`²䕹,p&'ˉK방Ռ/q(Cs`'|*cl:vqW=5|0pHs3dk|,3 !B;/;jgt7w#dXZ?z8W<4%M\F>^~ eCzZN~6jyI 2HA)N$!--s;SղUC/0uç2)Zǟ`ߚXޠ5onf3t5Cvp*[ɋ~YTu8Y -83QM,srO}<o*~(H=Jxd)y,jxРQukl]R91DO&=u} D%nU2Cn1GI`Qz4k_Za:ǣbO"`Km||f&!*cəcka{& )'LZ:مp]_?-C8t,&x4&5z Y7#om(2䞎&<:l=h J,W*"#6ǒ)1͛Aq*JP9IӜ-2ùnMnq*8?nNUm7/*J7R!Z!B!B!B!Bq,p;jr';A <|nX8yU#^xUh&o:,ӼCj=ʝAŗV=hSB3}rڝG f^mo^[wEX _zA󨮹cw3:W.aLϪ]o ΏS-.2B!B!B!B!B!BqTB!B!B!__}=yWڮkoUsOB!B!TB!B!B!B!B!BܵBB!B!BqVB!BY>͸ LTwS>5 =1.$_}B!B!B!B!Bq3ӎ^!*Fg'yw/B!B!B!B!B!BTB!B!B!B!B!w- D !B!B!B!B!B!ZB!B!B!B!B!Lye / Ţ# rlɻy /dʻ(br; B!B!B!B!hdGp8lhTbƓۘvʹ3>;9ZZP9w*н (E(ޛ;8Pi}&B!B!B!B!ȀHw><G2?vwG4` }_ˮ! R!Z!B!B!B!B!Ok!RUqH Z!B!B!B4Ήc1dMG5nwBq;8Qǟm:`|$)XvC_'h!B!B!B!`sBmB!K5HK!#- :?(ZINq, Ns( )`M5WL\ABB9Ib{kM#w+9MlF mm9bf_vAޝN=Ck-Y\LѽDrz\]ݠmxbSVsZɇvcs1XL՗O>IGRVn4p5dlʞ#Id8y:k9aR?w+-?GS)Tp!=O%7ahr.:Wts /lF^㌱K #D"iLmql@m4r12ӣw."OfRb@m!NŊAN$p&;j%IuM/"Q gYG$Y=\y^mc}#F!8;`\&5poЌ;6.sM> D !B!B!Bq4p;Ը%N.e*Be0HOM!*9XraL6MϦҍf⺯yֵe}||Ńç2`hz>:_$Sx`ӮxU?o B߄Tt}OӺ܅5rf4,"];0ټPhl5|,=Nv>:t:^lB@Q&V!pk„Qs'8*lxv~eOMcLgh P=7. N bE WFאʶOJϩOp ~GP`/o (oz-ռ?} d\3(z{Gxy>9X3˺=?}z{OW| 2e,"4kS/^F55Aﱵ‡{=%f(˗yu ϯ̧^K1e919yZ `*82y#h!B!B!B!P;lpT8N<ڧ/nowBqjvn@ݺ~x>f_ǖcy\>.uhrJvs^W:kNV8X4D߸ @jY;6l'YSôq M,χT6N¨U( HGj#nFVoow:GG1pfJV z56hnZöy˜9Ozb185ӇbU*nͺX:8貈 ƈT^13 Х79ʖ59Y?ԣ5aS363yNvd֤ ] v luo56tg5t6eIvm`v|&}S>I`s SD6̸˝ Ǡa8:\%L,hI箌gf;-NG?gLN믵l;ƚC82F*#Qtto0} 5(<?wr"'_Ǎƽ|^_11 F|G4&>bצxY+oV?NB>N输;ҹuSh0$vZ>YԼقޗH\F~<ѡ!vcnƭeg:W+G˰P!Xx4kԪVHv)F%@6 Ŭ.z?knĠEYF׻bxߺ}NNѣWgs.a?n]|a5]Y#o} IB!B!B!t6=mPt: C !⦹y>}YlD`ps]*R c̄pێƈn4Vȁ'Md.&]OR偼}}[~V`_9SVko6>Ā򸵄h`<\i1 5}3I3|zOeخx*U:l*#Wij哏lzI-jYޛf΄j]v:t0>I^+to-(0v)K~ΔwHޜт7fpAw^aʖ4B[ҥsC9 BjXcKq0~aHX9Ov\USw6ޏOeui9;1[h:쩼`sձHO[?5IJp,B2TV <^yc3ac2?M^k#=0pl [/1^K﷥g*GM#tGu&vRp v~7~&&O&z:Yj: ڴ}ec8o7滰׼@M/h4AG츍.hþԵT̾eˈ)}[4v`ӎ\ec^ۘ*$z#7\y~ ć2%-9\j L.+Nf FU>* !B!B!Bqڿ{;@$ -B qMP ~cSpzx{ջ2Xw"oAъ8l-1FLc75?o$UU0 J0vwӵsZ63 e>wewz]tס ax FSI+9iiE;\ue_}Aj3I:.VIZ-K `ݒ>z04=wأSSYo5{i C?eE>40õa*S]w1?G)ִ>AWyzM#:45?HZ砳Ȩ_04CzDJھ=5>!q&)L~=*gTm*tio$ IDAT ˰v(jl½Wh*]U5-(]RkKbb&* .-;l$ `܀Njhߺ1ć~ CgѕqcMQrb9J/UF^@ܳBt\j! -&BJ edWlN'[tvsu= WA~>QDFFvf&Yga=4 ?( =$B!B!B:q,-osOBq7 jܒ[;~vwŨ}N;zwXONt:2w5[_[XiOﮮF+Dj١{M1c=6Rliă=/owd*&4 3[5['ƑPć=s N'`ZyKz=i<6Ν54#PhltBM]oUFXTq侮-ܴ511z%8t 6\Q51b@n~2UjKŒ~+6'&րfMiLZ.Ϡ& .kCS`&N Yh3 | 50bA@C2ځL+ı,7dLs_'h!*\Ç"055#IsA֨@NVYY$&`1QDGP0> =o!B!B!w5pſzW!wwl4@r4(spAw>䛝۵XaSFnH$@W'$^qRjF:fkDvc}AzsL~)ZVqh98b_f^KC tfyNf~|s<* ȟ+6T7sa&gTgWղV#כVN*a*]NPZ.bCف`t8+v5vha{ssf`@QXp 3*J"l!*^sRKkm;6Qs񄬘OȊ`Մݟ )r[77,׹ppAB0UF^@ܻ4=k]2k2135 KjW).ZΚL|ݓx{W{i~kW,C4\S4i SS?t]-pvI~x?EEEuÇ"xo<(JU?!B!B!B!B{bHQӮSUEt2bv:) RBδ۟N7Sl]e3׭B^J*Fj 7冣w*MQ. J:.el5נbrV0޸\ťMcۧcfOF2ࡦԵ7-uU|,O=\WF Śg`vnm/ sɎʯf:~)/\'^םwXֆ˓u*}{VR !EQtwP,,Ltw$d*s:Cu!Eqq![H> &&7@-vi7kXʚ?'t"XfZ!B!B!B!U N竈䥐AWCR :Wy8 diISTR.9s*mP"Jǧ&C{ka).`_t1:\}\ʠkU-&vַ: }v{/Bi'Q}|9v n}7ڌ;o_beOߣ]zB!B!B!B!m 6g,#2`ܙ\tfϫH0+_vޣ]*PKغ]ؠP?'6jo.;8(!r>r!~wK[..Q9+~;Q|QI-z&dmNr\O#&5"]ch0sԡ'CF1?m1G#>zA+b_{Ad3ae0u,ǀ> +8ukMQ46NߣȸFAJʨV (Y:& ٿr1^N+"Ѽ):i#g뜆b@ߗ;a[}߱=n:0Cz~2y(jnTV]Q {;G}Ehl"թ3<ݏW]֐F҃ZL9 -)uY8~>_?HR_C.-bLӰTܤ? (b/;9[;jƺ //]GA!dz0:T(Z%}ϗt٪uܼ~w)jU^.1\l*(1oٯose[)U%S'Yb ~zY0x|]fxԪJw4C ??:^8\AaYQh=]W!B!B!B!w }]w bY6uzLL(p{K֎j :02n)A ~4k\5#8vM1I|лV+@Z4̴!87{Z I6qXGgi{ ӌl$+X6;nI#DD%ҕ= #u1S y;W03PBܑĦbM8Kϧ2ҿdE7EL[2~\vI^)ZϯfעuFuHW&#WkCH2_/ oyS֔$p|sݪnfIgϲ~MdO̡)d>t񼰟΅GO`;r4?a&4k>+}1j(&<8CU}̼y_tX{2\*olDS_gLΝ&:0%uyzckHɃ4"o:Ӻ=fRo9iQgL+X5e;g#i٪, 8s4T]gЃ_vQ!YIX͜+ew@>5S9rISWKqz}Md~C?Л~t |nfZOGz})Ӟo-Z͌܄893v3Թo)jUW!8ʅ N޳v林̾UE#'!B[/\-v /A47'y^}Xx!-fޮDk*gssQ<Z+T=EhP tβ&XۻP7v]O8WCZf,e`PiZ2~w;!B!B!B!w˦ \^]8q&"4MGqI)i?P3p&vn𡂙s#6#iRO+sX0 Vq돜?yMZYKlAqx_ND?3$)2H@1ťY_>:M| ÜX)l?Pj=v-AW?5̾盥[w4"J4"!3{1e (:,kwd ib4Ȯw ws6'tҭcMN]ٳ~k|,3<}'fNuBs+:玌- f}—I9ʦcwS÷ Gd@;<= &N`֦8rN$GO@E<>F )6M;Ћ7X\;gi|]cnxf,!b/4jG~k[2oTE ʼn>@]DJXؿ +=pjhseefŞ&|,oy^R.,DbC*WXL4 -PǤ3zɗߛͪ8vqmQ̨ƾ?nuvn ik;9~'0-=nt"CkҶl0-?I=IWe*%(=;9܍-v#1Q̛N.2[rܒbT5lI%yM a_ϔLxT_.er!,Nݕ|l?xۇO#Tg*[1Ba<3fIG窿)6)0{O~Bm'B!εc_XGr>,gEǯfФe+@h^{I\{#5!BwE6tjWxC6 QQK$+<|hX ۪'4Gq"-ԭa{5,xZ)GF.ָӤ70&s4()b Sۺ>+Ť6NJhD'Qlc-?¦׮$c8z*bǻfۨ"Za:ǣbO"`Km||AG ID%1#E Ұ}q~cNQÏZ|IEgw`8V.%M\F>^~ esQBkJA)N$!--s;SղU+cRR?-`;!Ϟ|ob/e`oZ)G"1<%k*Ns5%-B!B!B!B!KwǠpQnwyU_!*=8HZe gjץa;*Yg{q酘pAtn Qz=!aNL';W/nG hd1%gQOfiRB(N?As7~V]9c֝TxiDfPX}S9wl;xih9KxZ &Aʥ)9,ʱ5TǾ]{O%@s-3e=fn'vJeBՊ PRB`昚V5aff_`C"u&-ZWב) ccQdi8%Y{I.`jgnMy~7-Ɲ;й׏{z/T-B\b!!O$O݇fm[ݪrצAؽ$N%P:fw(,Mc\s*Wg <%1jp0ϧH#篝fӘ2+謩{ חf=T +o?zQjD-7f=Uî̜h$ww_W2Ë.Oaꋍ:OYrp ]NInE+m ݭ<?38o5,JXne0BMgHŌ͟_!k;fwfa_Tl.T޲c^afD':*р3v ihyj\ҷɘ,۟@vɵOr(>F=OY梓d,S"kk|4qSX>P7#YH~>9k^hL~1?uqLK,9]6ٻ(=㿙H!BOHBD((TrWTQ kX IDAT;BIH/3-B |'/n9gfLin.!lHn{e5V|4w/} 5+\[V=~w V{fbabqh 5o=*;O2]U탯~+<0f*[ *מ:0+D~ϻlLi O~J E0;{A-"c楱k ]ɞiJgiJ aͻqeӚ-5)$y{_ɤgs|\w=gsDvB&#q\~ݙ=<&Hko CV0DHFzJΚsu9-b_rXZytg1ˬBom8;wdƫm7(rTmI^\b6{͆4 YvGΦ_侉qaR~{܌͔HZ:⩏^WD X gJzz*êݨ\*igvTm_ α%wQM аvAgf?sU~x0c ' ){(“*Mr%QTώe3:yb(NYۃ,Ӈ6:l.K`rG|:s1e)7n%2ufP#D]g-]ww,⇅qᴾ"jM4{'gXΐ.ޞت^^_fy3>`dh3i8܈m ,6ٛ+<BK}ȿW7U779<WPDjtqeCP?+@t Yۡ.dhG:(ć[G8,d y{m{q#}bՏǓ|%/v>ty@`+{s ܗ7we<3ɑ9cz#=>[Wɹu+HRo ݓ }OU$Ƒ}a%%6c~ sdnaÃynv*KW>o9_##y5fW~3UO>lgSő'yFt"ȕҗ׽à{>em_=H 7}y-AٙTpg5|X!q?Lb Ol̀ ~kZZё/(M֬75uEdwW3*į,):ŧu9f>.czHo_nAe1aHn* ;9=^G*OJZfN/Lwк,Th-6`#LY3nťm`^"};oEO|o1w>ww2 \g%3yw#]Alf_]^MU|W2+^83*nԉÌ@wEs=:)Lυ˫.0r?r`!|0^{04[DPA[X3%vz^-ywZ*ĥ:. `s#7Û"vLYC&'Zfun04'cZrJgC3\A>}0y|Г/7e%1i$[qO?R< `.a+Y]R ಭ3)+`ٯR63#}(원pgwY#>y=2fxܿO@^8& ZAP vg߳DDDDDDDDDDDDDDDDDDѶ|`LfZ`n.ݯ]U3!UMHؓ\,g7kۊl̐N\!j&᝺ VJo:Ѵ=s68c>efj'pׇ+>dlCë=/w4B:rm[L,gt?9k qPkhJ\X ̛}LkANa+zҳz)7Gk2\F 1Xl#^5؆MAw ?.3aeKt7}3׵+s-!k8oOvI+),I*)baނ0lz5u MN4o)FMFYF }1؟@&""""""""""""""""""} X=K껋Eqϱ,6o%ë!-Mž'"ዿX9P6m8X=_boIMW<E[8m.lL5kJ2|8]/Nk̀^ދK7kD]IW *)G\Dmgkg l0(bM&YO>T;_? 2r2?e"""""""""""""""""""g\K vGMkxR˳xϬ3 :~LOo/J<ơn嬭L2\؀+n*cZ`S#?AHh Z=ah3 ИVl+}{qraggDH`Iqh$8\3gA,k  9)LB*W9ky(]pƕŞ s|l)=0>advJ޻A.Kea8Dp`E<[f%'\cxٙd 8Z ڇ  :In &<Ʀ'خxn˚?‡W V5G(&+LNQ6  k_6*D㉧g=նq yd3nez˲-|!ﯠȻ5@|ͦJscVKv&eI tD:^x9O/p_dh{>o"y;am۸^F ك{$5m1 oT` 0m\U永GU_/d1&-i[P:ᒻGHy\DZXRab&P~9CrR"!ܳ;zuc^mV򱽟9>إؾQ~vmJb![BO:NT>#9NƵ,^lУn5kHfgȽS]Ӓq^O_&"#- Nf^'$YPkK!%t׮A`p&PB>/0Wj.U7*XV^R\`pMn΁SE3`_]&bQcv͡J?Hw4<;ʜW¹ܟ/OٙD7 g̳Qc\3?4z4"u"6}&F(.#WG{8UV*V$0o;+#utKE2I(nc;CiG>i(4 _;U6QXB;מ,Kuꖢ?CØ&8N6[CaaYMp:i|F򊹍*a.'}bӕ6Ui$ЊgtkQ:Xb'%kVt$&'h#KW&sr +ޔG`xW0}`]Hf~D;-[JL{jڥiCT]'{W`WI6d>, 9#v.׎I;u߫]_zg,gc8N4[ic%2Yez5G5ϯl⛯qGK԰,m[V;lؘ8jP7Xh9\0?ۯwIzV'TP.E~`Rw'&-:^DyR]DDDDDDDDDDDDDŠbH4nLz!xz"^,M7"jŲ9NYt'u*hzBϹ~/F?ݗzk"k<~^@]NC5{r?40rȥ;6n&j|4ï `|z!o`a>+)/0ZmgykishRYcp?a`ѻ}z7a++ؿ-ro׎joE3G`SG7̳ΊL%5g[KypsMK -~m[Vm"돱g,Ov;T&'W<.+ Ld;DR )=?[SktL¯˕=L^[Ǒ 2pF\?""""""""""""""rj6ْQDŽm@\z_uksعdVl#)ׁ_Z4m۞ #|KナmYʂeؾ7|/+S~sZ7o%odтlړJvU"hԪ -VHܼ|րpemcޑJU7%MZḼu;I>_Uˆ_|NA,`]$gJV\ܼ~X<)v$[C@HUj֏y{HEֶ9w qV ~vtlVlU>)[kZcBnֆfy*U.0yl1svf:rQMSٱj!`o슁7hNۋbN qf{7O_ ߠ~lB}p'5a;!39ۋfOc6~xV~ۀ&1{[Og$נѩF) s}?GŽo_z7OĢ-A0Ffg <#G\lAnt'FE_j"V}8AglG38Wc3^v69[so0qE ',3ܖ?|[+xg_ėkI+:vGVAe-]i<̈o֓m^%wƘ4=eS}xyE;> 6~ܗw|6hMKB0Ƭ?L0uBX `vo6in5Op~`k~t&wcu~eCJޖoo>5^0ҦF iKkKD4D4`t[|53پbWnތץĂeQF}NV?`g'0iخ=]ztq'2p,H*g0 vyi$xU<]72! 7RWs#yo|n8 /&mhxEGF}ˊ46-&pT"ڧ`{=AsД}䗅؞Ɂlۤe~;U1/'zn"wG /++M0D6%Z3:^La"a㺛X;JGا97U5q( .3`xS<2b%\oQ+1ॏ!e#g 0gr'6Vˀj &]'.iAEVRkż-;Il\KwϧsDuJ'q~}%g΀ݙ^Z͇,{!?{vQU/\δ_f%i!cJ{uXQ IDATsU Z1i.\f8mnMbiSGX4GŞ)qI,gH u@l5orwdԙl5w#a<ץx6bG"mOBu6 Q=q]suW4tf0?ּ;W5 "ntI!׸0KZ Cg1= -{\E%={_<$u#RzzҶaU*d,߻/?ī~BEB{fX[piVDUΌgɌm%KBum 2>Û:-">~xZ9$ǭdl3 S5:1cy%6om^ڑu+S( 1eN}p'Wt" DD.pܷ"M8{vN0{i9tbߞMKZv>fj5a`|527~["E8 A5 pƶؙEpG5Z)'9Ya'^7ItI^=RLA֬e[>Cۘ^l9qYBVjD6 ?݌_bZ'g~^5]_uF)++w/Vm >F`jD0ܷ'OcuHF1ԪTϛٹ~=35*T. ;#yŧaѤN x3ʙy)[Xq V*""""""R f~w,DΆVtηș^i~|Yg_=3]y|(އi_ՋXJ*D2 > G<59nw5o 1 dww]lX{޽.6NQҟ<;&n/&ĵw؄_:m-.2 N]N#3><:|CKÏ2> .<6Cn/6χ-BkYrFWǴ7zsqmcY[IkG]Q1}J[ȫCufSE,aԍweO>= -~]G7OL7G?um #wʱBtDے(,,ã OJaaBʫ*hZGSÓF\ѨL{^kֆz`rmֆ>nyR9"*k˷;- 㣏 Ce]rRvLȼÀG֕/`I$nėsФi9g4vL`Y=}#}|69nj ;Û/rXpP$uԽ|-zXb?~f~L;fnoNOʞ4704x1oWאr1k zp7v6|4ٰ//J3Ϊ\c\x͔x_Mw-q1Z69qCȑ83S>`N\cMc/^_Sm<о'8֖+/E?'oN0 n?u'nf^y &.Q#ۺ:p1s[[DDDDDDDDDDDDDDDY;rUk?oi؈] V\K ^i. E?ZdctA%g޹ `e`"skܽU\V+sWSXߎ fгN8wɇOY@|OIiO#o7hb`'WwT@Vn5s=MP٤ZT$L';]yYX={U+^em1m$v 0 wyG4fXIm: /!hѾk *6yχ%"RVʹoP\*VgI)ΌBtzV9_yxx2GXx>Ww,5\TTYˏ p83#yb?{Xյq.lL5oJR<LRIIxMRٳcV&A ))GEzb#+.dumK`R-6 FM`nHhV 8vYh+>+S\rQ .hE 3*1닿X.K|*fj6|M q?_ >@wo`S F̽ 38ġ(qm^xzRR0cnV6 ?~#/4;])]O'm:q; Y08pBDDʠ\Ǹ{`LRRHŊp:){)Jφ¢"rssٟmhȽݪ@"~aХUD7nuwGDFۤ9T? 3$9)iZ ~sjӘDDDDDDDDDDDDDDDD8vYU WrՑ: Q'˶(u(jmfGqb8+O|I;njdWmbWv њ|`;fbwf~*MT?d_?j#=Gl*jALRPnTnj6c^JojV)k""{ 6.!]3o 6bcRA}yt8PmJ,CT='FZ{W`ՌZ+0ES%O͊TkrP!'/,/`뒕 O) %+8jo5#sא׮g7bWn,39܄felpl@(O&cςĹtZ["/UjzLg{9 +TiV4m\OEDDDDDDDDDDDDDDD #[7w&ۿg^uugѥ;MǮci>yoݟ25];0~NPcHe-0Ҿc1!-?rLҲ,q3s3vxy'yqlf|]iѩM ZP*ej s(SK"wY'RH%Po>MʼnDm'ٛ'WzRCڲ$iK T k@**"EDDDDDDDDDDQg9TYDDDD xsMk4^Tf:8yG~Nxne?.j&jT[Ȁ'zk`OώaP"mXxeٖO~Og({$㧯68!m~U?|vzYn?4%o ,gDOP61/m&tm^c^%_=ƱPy"mOgR^aF>m-yLBҷ,~ ۦBND9y>yk浟;1^%ML o-0 7l(]KS>r1S&/y=s~U<߷ѡ[[ w'p96p:ŭEDNFh9xF2g9I~Ƥnw"iAžx6BR~ q=kޱ~g_wjc\k4hԐZ!>I۳M[woBpP;ѷI,X8*wo$⸰܉[.{?egCspD/Pb=->`ELrlҜ0/rweDr-0[riY ,6MOjհ5B+QƯeU<;?"3]Wws׽bϟjиAU*yJf-ĥ‹N%A鋥|ߞU^D˺5V#ۋ;zsӅ}^͞[:4C?r3HܱMYUohmȿ7"""""""""""""""""rq_ƨϪsoKHH GD^ҙ *QGI絏&`g%QlO `@v9koil=5>}ȶy2? cܪrT#OAo0gYJbsw NUm""<ope`~{L~'+k_ ^EVJ,qەeKYROxU3<,_l \,Ge,YmQ3vvdǯaSrդIT哮yL{(8J\⏼1}>,.; ^gl"_ """""""""""""""""RlW~g8;~9G+,*KefrqCѯ?^AA/{̮£g~*LMɮQ;琞_pt" ]"RT!ZDDDDDDDDDDDDDDDDD3 lS`Ѷs d]2e#x +# 0_0vX\O g>eWh]z>Qf@ ٙd-P}mV+qGA>٤g'R"r@|>_O|p: "BhGDHyۗblf|H:ʋ*NdT1,F2cxB!B!B!B!eF-'?r2qjVn@S |؅g9xX eiLZu.'ՠ ُ@IEf"q'q7gୣԽILͣMhL=^S L_@MlRЕQ:[YE4/n:%NP\ՈBa1u$1>;pc-M')(MFgiL܃Y6W1fHK{q@o勣(>>Fz餱^PDfq#3PBBPZ?gwEQ0͘f FT4.. ՊfcGj-;Rk5"VaD?B!B!B!B?W IDAT8`1ƾÇWKd2\j,KVLwc' jx<4)x=v~_bW}ǍߠO-hlnF a]^fcnco1y1-]͟ȍnY)[Y7N:~9Ö:?Mi,mUIdWnۊ s<RORѦ(1`fbp7_Z1~7MwXñǑ7ѵ6FK'-vTolyjRBsֳblmw ~36ul#?%bd_)77b2+L b/=2>G⅊!oXŐCrs(]ΌW9s=k#[ő/]X5+|2+ZK`3 N E;_#*b=o~{ ћzuaC1_`42 Pd2b2b񡪪/V3,/|⿐[yi]Ff3`4`06}D:V]iN1< M!B!B!B!{Tթ޽AKX9֛z%~u(+*ACg|):u[NR?'gz{HJXGٺ3X0~azCۅ<~UG1i0< ,6m`95{%XloSl['fuk%lZD=a9KZd8z~EN3^K/}?q qn’=W'ztc0s0{M6~1n=W׷vA1^ͷy{d;O7Fc!^B%hBDz6|*U:@f,89}`3c߾7J__%ma'G1ySG 97M ɇp'0{xFkVGjv+:o>~q1Q;Pgra9U#5@1y?7QcfpH }vNoS?s߈63US q qY0g2cQaW^gZ%^ז=a +'D!;q [NQB?>{n6(JI$̠34j(#)>Ǝ9]}wxttv60Nd)n,SHfX,"+/ 7!B!B!B!BR asW0ض^X01rR pc;:;_ggcŋ7[?G̅Խvn@[R}2<U:~c揿?EmI}n;MWGn2meЪӋ$I}o=-Gޗ眻͏i+# 6#&p}Xrf%Özz h Oưx!8?x_/=]I;k|Ţ g606H. ?y[t n}~`w_w>ɥx㻬yh&r#h6cg6~yTo[|k𧟒noֻgJ V Auź؛nfMr#xeW)֊Y&J50glP 0HCaCc*Q+~󝄡:of?ah̃gcvnMÏ褩Q]f>5iްv5V 7moO şi`a1*Z]"ZWr45EOM@=<8Y1zBh &|uoSۨPD0~! at7A` )惢})<\\+}u?mS}LyKüfJ߯<˯ڄ)w1֓-ZhLwP+L?~X04?i_ +<30k'-j3:t)ֵOen4ʞT 3Fh 0))}6Jw[d4E᙮cPv=^^^Dc4ZxF#xyyq(>8.ߜ B!B!B!BcڊDבqv:grwRV9Ȟ;:. mS|MLR@+`߾3j4 n.S'sӲ8am%b.7FdRXǪi~(u)lvviMշZHAAS&=Q}'hF"1{%ۡc;:jSRR|Z1u9}Bx CCCP_ţ*!UPc<0׏#B!B!B!B/ Y omgrÜ<}殜Cx'dW::q*Ok;+hDeԸtQb4b@84( Lv[9Cx 婭YlO>Rl8uˡ5T׶ ={1i<3enߘx{s+:~^ϯNUEO/~օ)ج`NMeuS7p^go<9nz۝[ |f-ٍ:`#8$o# QpZ0GT#~grI\H`q^r3w߹!_@v,afHJ7v[XۺXIaa._<\Ab .)[M . "*󪔮nW u xFW xКNÝb4 !@ezepӃG&'" Kt"m^T\#@50} "nP< C"kUV6ChL>N !B!B!B!St+gJԂ\ׅZ!BOAm iwin])^ . ɬ\/ {<xP5# ˖)3dfdRFз:q j8Nw0gϵn@sfgb:z_~ד+?ޅljqL̿|_XRXz~wp)?8q([9x O?_}p: ^\ȏtMGX<\g?g֒m53>~: dg<?nK؝tGS(6kr/>S} rDDž{Zcz܍F^QKV*L\})[Y}5v:_[9+] j1v798?X/›W0iٚH^6|o`gj-2-Lsu rwr:5Z,9GZ F]A俕k. JCm%g9vb4 LWv0k7i{2o8]N!B!B!B!ė!n17NenП+&ЕVCB URJieSh%DRJuq*e%eBx`o|1&g6#EuPLcXtPE4]'Ip+dT3!,e nxMG;5\7J79ׅ*TYA"k;[5l67 ZBxD(*gkԝ J6buB<Eֆo1/?4[i5Tu6↛q.js};0/łB\42P_?Y̲1Wo !D0( E!*>Ic 7a[io [-1-ySwp,ۮ?{|#G^qktWY`c@Vz/B!B!B!BBj$ WNů9j`#V9o8C}9~(O]9\Bi8Z$^ñgqvUcR 3VI4hl]EW𞸂%}ڧ F22P{O`.u‡у1}+바w;_]s]bx/4 "]/qgAah-C*=O%Rfj J\&Υ] D;N'a5T"S;X<pO`Sw0iO{=:Ǔ9aN q\Ӂh{Z1AרŒ!f0X.eZPu&1/䴂¼x~0PlFQfZX{IрO`0!BÈY+X55G12*Þg|C#$rCnsC "nhf._^\&g%-B!B!B!P^}7⋼ P7ߺ9ާt(a̝穎t|g|؀:{&z;bQx)U;ײ#c3k?G\NJy(\>:):~9q -H$( iU=?Po^P|ٲ'7^ PZ.qS> 8gB^ rο;|oyK/&յz tEaDczn (z=zc ]3o//UQFAj_EmȦˉ `  DwZAL>iw鼶}Z g9v H>zԬ<ԱV~0I$=bK?DfHAWYXOcz*(] TP\RqrΦ#$'l] !B!B!B!9\h1˖,bnB7YY f=_aIA+³ArE?굜z)8* AR8tMNPp;?)65x2]I Z9bQgre|v Uۇ'dTf^Sw ?s1fY 9opW–⯂6gSۣBآypVΖS]@Zz-x>ѣ<=*hl~o$Wʣ?_O)<Ɵ.vzK׍Yx1gۤ{| |{ˉ5=-klqY99lh˜ݏ,&Rձ~G ˸9>puΓs2Rz]v>+ѳ?獍) GGq`˨o qյ/|ŷf> )N 1i_7BAejޣgt V5ۦǹ: W-gdV!S^Ʃ{I(퇼b"xDK"=I1}bFw=n/Ma$ruX8V:T6mIte_ܱQVJn] j?ݽx˂&ak awހ(>̚nzy b?Q˹_F؋z#GwH> ǎd֙w϶2 a7&X vZ:bdn|?0#*slj+Š !>F|VÎ]þ1[I-Z51|*'SgW YTY@_,z;WX4nw^;[)'`VE̙6(00mǙOvy3|]W6]|-p 7q}WsNr߈BVNRSWVؕnH؅OÒ̎='ȫk3c̙Lkןag)FgL*sSPnX<!WcR!B!B!B!Dyy~}OY_{猞0vJs0n^|r.7q}#>7놅֜P)5MeywԓD]Όjש+yhv^o$cZSJNf٤ IDATefL0ll9cnp?TGg8OM#^ ٹ|MG5`4PPO|bBs!ү)xI><~ bADp6TQIFn%VM!E=iw?[ܳbM+%YGIN+9֧K !oQWZ}F&o(>X-'+#"k ak(?g[!FfXt F[%H=W:뗬Z5ɪ;"|.fOoGS<8j9q9ތ]]v+q:^x501h #K ǎQܠy8w}]Btz)|kFa~~0Y|TGrf#s1'PB涵l?mc40oTg#5ES[ZHdd63+Ud4`=}>g̱2;j&| DcpRW~Tg`m嫦&Hk/>ĚG( 5)%: &~) gl^ޘ ?a`ijjN܀k>ď4PStJ_4C cP+Hl(]#)(O}V}l 7o3mNGUQPT>фcRq5P:vnCk%{zfԢa?z0Cک.&+#$R;b"8nC`s*PϫYl=Ξ-(>DSL 䓞W7<Qlv;%s;8E7CoQ[LvV8a-+3}(%s'ksq?@/sέZŮM2 !B!B!B!E ޏ}_yg8(|d#{'x> }_57𭧟]t0w H1,^1w"hü1_xo)r;XM MymL/GLX2 ^ys5JHK*!E0F͂̚s,x~kDOHlI5;pv/j|?̊3$>b S ͜{R׼a%O3$nnnL씻d{xSxWG/\|?h1'?yq E%f,[m *u.=dTs^>;}pWyM O~G(Jɚ~yrU?.p"GphU'.=ʭ{&R.s4Ѧ{g0{Xom_-Z=+GD k< s):)kh_LDIEW_tC̑74Ue60o 3\ӭ5hf|uc[Oؔ>}dZ:GY.Bȸ~}myx,:/Ø]ԗSKckO֥YQf#IEؓE3>j.˦hs-.w S/fbd:8esЍQLm[|wndlx]}(!O֡Nk+G7fR1U38okA֮?FL}sQh34KDEFb0z~{0zVbq_w:18̎G:u'ޞB\j~U<ר:/āiqؠʍ%-77.Mw'UiY,u0fzX_2׽c0`\۳Tp'F5#'~gǪ?Z΂-V8(;5 'ȭ[̋( 2 \vK9ujq) #[_#i6ymf},g!C=^&צceSۢVî[Iv b G=gH"jN>kX2lu/Ϳ%C>B!+B&`OzZ#? &_ǒ_>^YSɲǟUB!z㹢e38uZ>ďF&kq,oB g>E"W}1YiYbÄo`} fplDoSN"*F1tH/{˜e_šb &*nCE5vVˠw! ƈa23;'I9]i"0zF&m- kE>g J(/ƪa | =^x= p*D. ZafahKЗ̑c8SX4?)^zjD%t,nhP4،=((36FHЙtŇ!3 CxEc<>[Duz*&E1S~tJ# C_gAo$?y3cŇX4>Fb&bBdC5k vrVSŌs~HuddS49y`Q0NfބB>J*Qx% LvwXJj ?/)}Uj{u΂DWkX,_mSsJ $ e [cT)#. E2vodgF5Ncg-aΰÀX⇺ dDDr2Sq.[T†vYJh|XvoAg]"3dD?Nc[1`dDm9t ug8uҏq]Uu yyh!z8kgxI4S?.Æ %p/r+v\|B!B!B!B!B\s.k ysn s6c;lk+{2t**!بW mUj:@4@rRAnTK PAhzpd!R; 1OjPCF#CP3pYrjxܿ9@Jj\ Dh,\^QA^dZ\9Y^гuZkZw> 5~|u+e餟ɧK KXYך͆U7Il'DDz| ҭu:j:` '*`"T9Mf*jo _u Qr¢fq=Ƶ@ZT"#/(ADEQЪiV tS+5AB!B!B!B!Be D,*s?3,iWX-tj7mMT/=j ʅP]sm4ZBZU&{wdv. 0CT|}`vUqn^Ǎ]k3]l3>Q1k>d,\fQAFKruN-5g5QApQ#a_iRvSp#ѸFKڊ9q3Ʌ4Hd6c6ah.,6@ZO͆@ǻqb4cRhb2 샏 h`q@59x">4 F܌S.+kc\}|(4٭M ]h~+:GB!B!B!B!Btɽ5u6q.׶6~//9:N5O Ɣp:B or1]B iDݦxcn.~':NTQ6@NC]:YkB!B!B!B!B!{]:Evs5 WwʞLꙂoD8 *#JDDd(*UWhJdi(ȧcp x3:8e-;N[I:OQ\\a+&/L [iz_5Qԋt;ҕԠ9()k(Jhxh*z_$b2*lt "{N-u͆ɨ0;!m!r,QШN=B58՟(?ZFA_5yx ;J(|T m je8݋ch_:̺KnPF-\\5o[֌`RN*]m`2@%t@VtU@MuϜL3)S݈Lue`_/@6gO;'(5ã(83ɦJB@{TDb)"bAHIhI g˼@ 4;̳Lks&™Q.SDiY)\hkeL&DлsuNtv(]#@)}kRE.z%y.ԊNElߓkuzN o[3(NYiZIAFEf[%0-֭n`ٻ3/ _7rr3+z#00ʹЯ%_&]=ށg݅6K#'=VJNex&3KF).hIuxߡRUGB`~wpdi>{uXk׬!QdKKKZmZtgelM"ee&@;zCz8=F^CNˡ(w->naSL-&#;Օ>uf~1-^߸Dqq1rbMD$%WPw{Y%z0#MkY5|%\Cs`{ہlq6tX=x2F jVO}g. AmK[-w(u óue=H|\U_|^*xniطm42>`i1Nd@SԏN\ԁ\K(2prlZجJwөe xGT䐝_BтwWlj>>Λ>#YN^Ve-*G<lTM y,'''gggBR\\Ţ1MvB!B!BN?&B!yqlVoK&ȂO({9+PR*EV9[3Tf%vVSs#(;{GmQx$Å`VChCJ 9VRRbd2t8СO;a5p>UgFM%j7mCߒHrz>%U6.x՞؟VP%pdgڏR Xp 1җ(wLZ{H-0cJxvE+IcOJ.FŅܭiMj=.Վq#Swnbsa2 hӉ>=b?c'QΑ"4K!GwPm{?"Z`w>IJpkCkd69T]o݉}۟]K,&odźVwu~ _{MZ{ٚx#Baה^jxEQ2+5kw,r?n^տdl޸}i9ULvFPR,}?2YعX3h]cv=hK\Ԝc8v;Lzn p "SOzDyaա.Xe-w"،CH< [KR)^3X\M{`^ރ.w[SyF̤zǞYF4Φ1_xVķ)X8ɟ<%3. A ;8LsÇ}Ŝڼ[oEsX_/]|1 ^ucx7o4S ]qX)e;x|UN#bK[uϗkfsY}]ƫ=7<\O yTuxxښDڜO?BK >:) SaV<-TG%Lx[1z'令Tfw*orNg=>ʓcOvgOe>ݫZ!d/f׈7sۧs) Cw_uՑAx~8:]/R1?GͿV_YxsczzT!g:=NyOt!>;WW+oyi*GOr6՚1v>3akwW2=UG1#wn3G6n>6f4cxRf cγ2ho%Ulš\ڏ̸,T7X8&x_ۤ~ >) =`LZ nkѭQOU"Ep{D_M|e[=6.œC0\v7McgҷZߋ&{Ubz{k^)eN!׎Yd 0 O3_N cKx|czxҫav8T *avjĘ|pG;_jǗ$ -B!B!B\ *Ri=n&> G2 8wfU}nn F!ъVG1k:zi?= 8rpV|d+[2fI+%- ]k% `՚0SZ2n@I~փ#A\PnOc駅"obl?G,dqs=&e;Pu!ԬqKЊo] yuah\WldGX=?>qO[- }MLv~|:ny;} ZUJCt=ߣR(_=.z0lKgڎI?]P60z\ΓkFXz융4Յ~ݍ@>iP\:3 SF%=۪t?@,ql:gh v&xxڼ 8鸲;WvroRB!B!B*RY| +;P; Sgz[wWsn2qT9xBTb]kF\;k 2jDxwuzr[1w*Vp7K1@錵8F#L @y )xۣPDlDHf+nj_qM|0;=9K,Ƣ:6a8mOk*h&V,_7Ig,!BԇFaAz^˭7\J)1j.:Ggf-5fUqr}k %Gظ`EKP ͸^>5Jg*.줿&/AA"Fx+cz^Ph֦(m2@|4|i\4RĦ9OMfliN8;0!,s<*4.0TV~/~Ob'v6u+8Q !ji NMUۚW5lk9,.EB!B!B!_N+XK0yٓ|4m(gY^LCa(FL5[!<B}5:lNF݌FciUT)8},> bxb_F)EGxigqK:~<ZӸZKṗӿRÿ]<1u4}|qe<U־-Wr0:/D6RxǾMt04Nu6my!w'>ufҠsI@B!B!B!r9Pb>gdcsZi{R0*EnWn wZ: bZ hdO&[X-)2^zƭ+2 r TGڄya8m*ngC^R TjI^]uXU.SA Gc^֭L7"2O45uB!S<ӎ߀_2Ze6{6,fǟsR!GC0˿ƣ拪5-唕7|ZC<̈́O1g8JN#733X??R' b5s`,е &,yꆷ#¹[ j$%e SdQq<<꿽 (jg5񜨭}5ׄFyi(I Z!B!B!B;ߝ4UF4ʹs39>mqRּqO64 ֽ+-xf(DOxXVũ, O!u1ӒwxOwx_m+-bL* (zszwFbĒ6?~2WrFC30B!DsRnOuIbXgk]{%PZ`5&6qҖp+AHMl8r1Etwa I2;Pu=v5xu,/"..]/9 3_TG'R@^VW=!y]H 1.*ز.~]+a#9os4v>Ovmg/mMPiM73GFt04hgO {ۅ[yzgFo]:'W, Pq afuL+IK8#DωprPH~^ gT+42_B!B!B!S +U$9uԐ4*oބ:*h{|qTViE؆^+~\/K{O-YCs̈́g$ӷnA"yCg|BVoWkC_7 QLBqU5L{gwy$&zZ3M38&SvƔ®]عk/xE lE^s2 ,d-e5]8n\92y3'ë S|B߱,/F7`gU':z\MQS%xp:ʭ|F |;|*/L-ݏsv86O̬Cω]K‚TDx|g# ʼmZ!h!B!B!B!T\3v<,;HVYSwM47R"ox:q" ] IDAT=.?} ݝUDv+=s<)~?lĵ]|8)hY`Vz}k8 ~`cm7r)<|?c ›knb/q}?ϋOfĩxk~xn0>/|ZD!Ƹ[cW,.{G줠m(ϟxֹ3ېbax*4iF odWfGY3x.+ξ+0lcD&=mO6nx^u)hX9%PituEn6n~>[dť:P 6~RMVrl[k\B$'=ʜTCд>,ֶ m>]A!ߞ}{ݟZZOEmܐo8>[LTVT+3*z~jе'z|@ C_:4JﳽJ[V=iY4܃B!B!B!B3fs ~8XFE٠xDҡsw .'^ܘ| qom:9q4z85L}z</i'3~= Oӡ~~UAU@hhQu˦ NwXvFEdvlCF"k :ykf, .-‰i=Rlcǡx =}h.Ds 0_T?g _`_<5f_whGܔv.©R>u|.jxcLS;2;(6ښ(db'KA~>}N4?=Ă5@=IHJ{(9&X9 CB!B!B!@[>xp4=C\ПAWe?|q/ǡzAz[Җ4=>­Ⱦ o|\JMhFA]W4*vűv~a[ iArBBJh!lZqM[(:~eql^x&`v&kζ:tv׿c[ MR<8d[:VppZ+?%Qa<'<韠Uoo=l\_`kJ![k6߾v?!ꋇDZW7z 0_:ǯJgoa,k-R͵01idk)|;?-޶& `ͲEp)@v-0!^f|Sg\ *cUUU Cn폧suơK?X-߮Ɯ6z:v^RAU˯"T%}gS:_MW5󞹅>PɞͫXp! fSQ uLs -ا.v>=b r@0Vw mԝ=v[OΒ-T}ʌ~MF}ω}O4Pr7| 'db0x}kkhr l6kZB!B!+yÚ^vlJDcˏCמ[70&qʫO=Ͼ[7Q|l;wlޓED`H՟gzkgos͋Y<ڈӈ7XbS]ͻyqN seJ׼WARlӗzQ.SAL[E+c-(^gk%72sؽ ~'2uoˑ%Fuln?qyu=ޫuKU>H,dMXL{"| M%̥s#YETb7apQFso) BidO PzW[}kU$`&\Biֈ~G;9R:;g~(:@#dbו1W{]"kE#h]]tth^iB!8惫YXɰNpBoxȴ(bF1:VbRdM:>N]Bԏ\.M^!B!B!Bܕuq)L2J4;ӝeRScK9e5unH'z+\cgLŇv^*Tj(v#B/a>O=й}Zz9Vsl66%Ԣ:wdh#=0t66IUqɓkڥImB!B!B! ɴb=.VpPK5;dn:ŕS]psY=3oMl- 6n"B!DS‰,m/~篝iaG73!ƮKSTlmmK6rM4B!B!B!BY4@{j=W]ÒJ4@ؚ0S!U9>B}d!kُ,˵@{i@3~O76뇹E>~?x08oXIс`U1څBq)w7K>#JGBk/ڂ!ѢynA6>@i|?_Bi ?ed>#yTXn !B!>$-B!B!B!Ŀ.:f>eϢ"$V}!EKykW-䮇Ra;Yk`Djf9/OOݽa(-њ_YAWg6H'+#b6r"|!k$V-]}1LVL'+3-עiÀ&R/'B!B!B!B!h::V819tȜ`V\r ꥪAњ'3~ 2+ֳ/~-6{m68ΖkY|1K4=EBB\ǎOٷ;&&#>~-puuB 8NҮMJ`ON$$2&+G@y8B!B!B!B!B7wR8md.u R^ǯ߂/Or bй[/.;㷰EF^hH4Z;. M披CnZ]c/a#w UUUŸ ~do.NeWC B!B!B!B!V|C95Zqv'"W(Q-93Q`.=NlO>N^{ЫCK˫Vƞ\ A1![ݾûI-й嬚*HOƝ8[LVDƶ'& ]Ö86ofcZw/ݺu23b)PR*9G,INC ;p\rٳe#YTYݛ6v!ͦn Y׆>4׮gہm 2k9Q}(-`u{sjn]Ūdp Ct vB=c.08]똛X1D`d(Jc9zCn?w+D[l#p&eF[Gܼ jMvax$#,Ej2O7^|eFnm q)3glۺ\OvhkkKמgᆪ>gvY; BB;cDZ8qqq؉{mu[w! I $z_²3 EB?sޙ{7L`l۴_}Ί oIj!B!B!B!Bo%]-Zo<۴P [y:LxI`{VsZCoCEkB}Inmw/(3N^\Ǧ⩍MB ^|O|f;\qa/>棻wo(R^w^w֓U{b0?qlZ?啻n6퍱vǼ)|ڍ @q˝o/"ewfBCJrDBJOqY(C$Q|i12ռy v|$f_?-_3s_3M@3}?,8V=ʿ_Ak=p)mNƝt瓬iɎ8E+ֿDs/6S԰en{jMnsy;)4d0g/{㩗_;{(Ո"sggJ{$>RFw}_:umVηǢo I7E?gvs5ӧκ)F_z=0S%n>ܧʗڧu=[_Rq0~>G̪H<ng7Oo99oiy͜:#aYȫkgj$Egu[ zˆ5vΚ׫aSE2y6^ɖ kٚxo$QG  }NL>qy՗H޽KEI E !B!B!B!Q\wɫx50yq;B+1LQ+b{y84t2"@m~ W'-c ~GqWHn~>=#?c IxXJ8]7vo:_|n>SG20ZNnF2'?j`'.ܑ]ø&iǻv-x쿤7KfNM\/FK8uL k0bHbheYԻ_jjVn>C֒Z ^qӘ=818}DV̺Bw"Gadt.d]zZ ~ n9&Ž!=kew~9^{E0M8Usl뷬I/'g<b3-t^K0 [X͓z1,kZdL_O/0mOSJD Q} ks, >!]g]:=^ϲ5` f$DaF9Dўx\7s!k—ٞ y#1gjWOOxڐSϬz%-u;X79v,Xtz:ٙUG8%#ٰ]٬T["z'?}^En"`fl%b:n Dg0jE5v"V$3eɻo}(cGq7maE^ B!B!B!B/3 X=jl-8Luj},ɡQ ao^Ϫvzݻ}ɼ]Dw{Bl%vpM_hGk!Gݻ1zqc7p'GL&DVLa0<β؍gJob28vy$gMleG9t5 i>VS IDAT'{<̤s#tv[uJzR+u&o`pӖ>ý{4[j[ p/x?=$>.}OnGou ;o-t-ڰO_~H'&~~x2x_1#ԹҹW'pZ~f\,>6~?>KI;^]_GNЩ2y6VLD^"<3]{?C!d/>9!}͖Bqc~ݼfa{ɸA[/ %`:W{jٻ| ?Sa95PZWpSbگ Yxv,(K>K皿smץ˱Wȳ:gv(/- (8vyN]VZ| wźog~>l?;XͲnC!B!B!B!aۻTn| y`/Y| leXu0Derp.!"{:_ ;x oPя^^G~  ?(G//#ՓIpHxM@7%`Tt0M‚;VG W7 C{WA"ȏ[=& `vvAm>@MW wmD0 `ϟNþluujE,[J40jnOS:\E}F1'wMC=.jSYfI:VH1wO"@rF,Ņ)(Qvth#B uRg~A%>:5mW|C|p ;N!B!B!B!L4PLX-̎Shy 2k;k-Y=n&fTR"Cq}_|ieâȡӒy ^Y5}:SƍbdPwGG!h@4>WX6/^:%!~}Ew3 ̘]Ft{Q A`n-Km GÓ`0ːٳf+XJmYu MT_LZԞEv'DtVA W~LdV 6j~`o8\jV(?/խ5W ŦzM⚩>8|Ɋ-ɤePVUO]kWК*Ku?bg|1 Wy>aڌ)LĈX=${%!4RֲP-jxnjpͶH##-?Ok b%YLh:2{HվnJ'†fOգsn3@:gw5wǹ ?Nfl߳䃙VQSx{kO5G$-#89HH1O#iXpq|pǻ^ يH,g(+G7v~DxyMXOx˗B!B!B!B^q4îkz5:,45Pp*N~O7`bךż'-e勯0kyvJ6" -:|wӼ<3LY俼VJҟ2@FRRoTww<45thn⦷h8Ԧqt ,Tj8,l䘭˿BӪ;f7mTVԢu=OCN<440!!.vN }2UXmf`0dǾB0}SW^H?fK7V0gz*K֕bWϟO|ۡNuI*5P}Iv<*NhkP6 µZ^Ln؞3G3#hG:rlgT49BRM  dXˆC4~=c(AeQJI۾]%{Jq;r&V~[v^X/㯚ίVu:. ̞ࠕ,orۼ?j*ӆqn^SesuqbR1{><© e)2v of61ٔvx C1a('&swN̽}$.^ = P*N1xX"&s8-р t5Ѥk˾ FG?UavoulN+TÆ3sjpkظ:^ Wsؠ?DKHݺGi@BP_w*Qp:w?yzvgλ%ujnhCc[l:֯7rԍH+`גqiwN?=lؒJnm;g_ODR{>z]NЫ~|s'L38B!B!B!BQ0Y*A+1obͿ#u NwI?,v-^dg)Z98_fT)K/9̉{0;zk5 U;  @[BV Y=@e^v}NfBfۧ+8mC4,UVo‰Be3v溙[t~b lVGTH#J՛A}eM&걗RǹK(.vNG1}o֐#5~,MGqahNedžzv.[C^6Tj(NCY8>M( :zw?fweD4ۛ_AC>AΥpdVʦI3Ò7a<$2$:O^-7pbJ$F̀ 7 ة9o`u5Kp OҘqL?16,;YlM7o*˒%I-Ǯψ1c8~ b U: y; jOle;9Qf(\ۯX!ͫr֕ƎqrBi"{*V,w*܇AqDU`bt8vݙjĖeؕŦL7vj RXd-kTTڋ-0(9XI~a5[4f,'g\`1jVJobc9Z2zٛVP)V݀982aGxќ̪5"v-_#Xq;<10f8q5+zJ/;/({uWMx=[hTڮxbd3zvT c5$[IvZƆר9RNDFH?\TY۽{ B!B!B!B!DY>ZMo/jw1{5=VwOSŔ(]omSmjQ5ϽrGAּ#vP1|@72sǃsTu~mnLձMYcT,L 49E\Ҽj9|oy U{Nl?6b1۫C0%Ld GxwIm3[z.@ hX6s)vĉQѨZ*ZWșXN] oR%yAMl.n6nk캨|ah>1//;If3&tux3ठ`OyĞ^MOyQ u77ԅRu?omFWpIZȼ>tBAAo[lmPd䑏rzj^|UڛKm[Fu}&@<6C3ol?\z25~̇70)̓ #Gpb׬Lh #1JںMڇsgԶ\pg=䗥q_7 :\MQG5G0~T[zN]Iu)O-hN,\\=gML¡5ٜSO-Q|T&L&K.'*l^Q4vd9;ِ^I3s6ǝ,[ynNx9kT[,xyyJxz]UUكhT>L DXWJ#GSyx=K76{7ɅL =$kn6FDЈ9,˩ӘY(\c?DrIN }3|8C|ҝX ~׏i-j gƠٛvModĐAسr$M'nD8fvqlj4p Ƽ<1 9lZtK28~FP<O":Ϧ0rCzB!B!B!BqncoO ?q-_F *7'F`DgSXe%g ?Ob|qJuYG3)FnUX:|0~fʳSIɩ<Vm{|WwՅdOfi#AOpP.uf<,WR_=c" !&ccy~҂:w\}Ei2 v,-"Ɉ Mzj4u9| w\}0iԖdq 0E _==?†IJ~8wÇEWq"=F}I7U`$ٛ6Ѡ?/*7ǂŏ0ŏ^˶P|Դ|f[ yT>E7Pn~/f37p1 <9X¡"2BHJ6u:(^qLyN\%t$ lW C*g|t׮Tei !{xyJxz+#}NWhX*-O>DdxG57ٹl8Y% 9SR_hjubL`ZR04*&01R܁<\[8 CD) '(OK%7a*BZ9>&aG̡ OΠ>ӁSm@Us `i fX،8+ 1`氻Fa~)=j!B!B!B!:Gx7gt[h5*Mw%G8SXC;;t2l2ӧ_n*6a22wm P Y=-U! IDATBGfJjvfQtd/EG|x?ʃs.X8_ObW>`M[8f>Lθo=WRhh*~ 1u;I+-\ =ɬ|WᙷofϦl@A5G2y{0D,esJؚttEieg^[uC;(<(N$ jv哛o<0bSI<Q~&R) <~s}}^u3oyCO/ȆZP]Byu%p3=tn?f>3=ßS5Z>2pS=Fsacf'ejׅÀPb8Eo9GQ\9Q Jol,Jm!7-؏vԥkA\}#C89.…OԓWTb%S5p0gcL"\tPDa}bLt\_vjDFD`xZt;6;EYr+J_)rs-h!x @C*(;G][ Dh&2+M554™s/B!B!B!pop[q <]MZFE4+~!DFG(_a$e=xɿcw7BL'cd@Ԡa l/v*a33^W‰SQ݈͇FܥQ?pwQWg'N Ҳ(iDu!$"H?cwˌ{nj{/t]WŗqqjX8_LYYUVg"bb tm YL ~k$)GɯjӗAuo [B;w <x6NLXE? yH rʨÝ$D%H߿a,=p9MΜg澴mҷc=}A/Of1;!KP.(>xi!RQgp¯5ҮtngNWMEVi'KpC];:]ռNԯVN4=5k}rP%v\B0d^-I7pm{wPn{ܦ7adQe4 &,>MF00 {a'ޞPL8ZjnCeUhjjh&uf**ZGW$KJ^=88k6c\;U0tj?H!J*a+VU(&;@JnFU;]z%ŅTU0f㪫--c~T@.eOI57x:ge8c O1 ۥmBV|b>S޾6u^r^tu^][[(DDeB{ezr/xѿ#!B!B!B!BыLyz%2`4]8'@i (TBs-5Vv̫ͭї!C wtjZ9zr8rggR;GucuOu4۰z'@@m^O]}˘TWZP[HK؉S/L nА)*ٵ?qm*7咑UQ2ѱ6X[Ɵrkh磜~kuWESqi-~f>;;Z475Ne+&tkujZ]B!B!B!B!@53y/!DI 4JURr q饾E.A+%n(^H<ʵPZϰ91YɖJ,>m>S=֪( t4F*6WdIt+ VE2KqKE=SM|:NM6 ˱G9֭WRP*}e4 HFZ*6[NNDf! F#h_a$Ef&ˊ%=!ܚ모jT3ACh˯:i =>lŅv$/J!Z)6#l(,B3~~]_iuԶcQM 4۱Zp̶Q^QF6=wvC vjփgѵ2 ?>Wjk!B!Bn{mx0}/wG"B!B!$&ֆM 4qAlճWh@sa]7 g@fϑKjeL`"c2fVa?6Z ii%4;"Cy6@7YFo*/w0n4;>"gLuxڙB 3:GS9Q)ՏȈ^y\\]ā{vc5;w|,;jj(9Jz+NݢHHcW[WY7RukH<+9a"vB ˬ1XR6wSznca}7ڏgCl$'mFϩ'iRq[R*slhg۹0gi>f 'TFJS66|W-̚V.#Gc4:>ݚm\Sg>U$F&Ju~20CA1PTc%ko2qA# u9u5jszQsB<9>̟ߩ۳yMἌ}H̑4fǩ[kI.b"|B:,SPOuid&dUObpoI~>,.ǚفLo0u*8Wݶi ʀ^T(k;!027b-ϒsڊ" J̑$fr{6%2={Ǭ6b)ʧڎǀ姑]V2%+pҔo(˟ o\ʋ h#>SqW+g|=?avO"&}5Wɀ`FluV5I)qv`p>r3j)=*PFpuU.s8'R*|A!4UPPRMŵcf$wB!B!B!B!B!.# Dc"8qdTˬX Ob93*%_Ջӯ7l;gk,mnL$ U(]I](6[\IEKU?i>s&ۗ>9+:i `xl-=g_&M$)qV,k6T0c\?Jמ'̘pw#yeXj`o!c?wr5:">q#0*s TV|9֣Q?G:UOW΂-ߓM-x c$.a{v"p\vΆG)m('XkxN LKrbi]'_9`gQZWFnlp $f8 K +L.{A5'IFڒë6gF:IB )"(׆ z(zaAEAJBB!齗J8ܿ򃙙֬Y3\9ر8x87"h ?;*j\=} 嘓Ȥ$"*lN2țFuk$?+jN$dmTSXF͂7x5~G~[xzy5I?ezqrsdDF$/ܬ +jɃA4\q>r2s((p&e ^EQN⌛+,/ jp˿%-ܚY7*#;*;VW|w?٣93헣n|E4iw59g5H)>3|7om1A~>z<99sE6,]NW̢lW4fT})oQ6ΞLߓ9f}փ!w^'>sk(sbKw3i"'MǞOMc Wu899f>~7pbQVs +s?a1@`PKh'>AjXXqmI<;mw;61gV7ڞ1wN8o1duѼ,nzCe,rs8 p"'t[=hՖG pWZlM G=ڎhd'y|<<%""""""""""""""Db>Fo[^*֯#{i%ezbk|hUɴd;s̈́c+;w $cb(9[N^nIVM4kG;w"";5'W:cg]"{1. oCD'RS42;}zqRSљ8> {:O&w9BGzRVMjQJcůZ `d-rrvv{f'q]4/=$LC|\mְjR UUW]3מ* 0BVQgx呏>eiůc}nϮf}dz0Wn8с-1z,,ޙ͍jP;ױ3үggo턆bἹ|7S/Y&4j7co0 .G]"""""""""""""""RGhzq,& 6j6+A=:rX KǓ x':beHV'v^Ɋ_a}.dC9csHNJOߧKdzCpP||}9!B2Hȶ-TЭ{^~5aZSIyF sTQ"#~c؎G`8= e`o#O&DDZm_.lKס 2RRɮt v,džٸ}?5.D =8X"NI(p?} gWۤ$}+iޭlYƞ,AVv>w(z߇I{(6su[E1yY,nxѪmgzw͒$,8P!{;wU +jWugAtRƖ}΁tWaWf-k,a]xFuI?*Dw Y1+ؼPi:OՋYYJV Tem'>V|FҶőVĘv'ԎoaP6x;q=8CSʆapíSY֊%  mBGvQ/ʨ1D+rZ>@Jr˗,"%9$ocNNtыGSfl|~#|z wΓL̓?6,^t y|r՝ 'N+Sp<%+yaZmd,3>#6CGG-J>X#\My?Љ!O-{`'ƏXxCBt;b曤Cस/bRFu?4n{Gֹ6|b?y.f{kcXhe x+z>.\O""'a\t?-aۖDrsl1ZKd\0m_Lֹkw:wNeEI lMLA^.EEϏ- [t W!"""""""""""""""r; IDATl{X[C_{.[2S\bhsx0oa: ݎ@*2WMnI/烈W}Ro1H 5 {=thnbmSxksv'mftǶU?p~}w~ tߥsKY:K/sFW.S-Uv6#[U礳=i=ћ)/z*~ȔPbbKF25[Yp I@zM,W{^d%t3x.nFx}\ -ew"Fԩd;;Snu>ɷ92Vj#moxv^ZUtI,ôdoeRM _O3Ǯ&a߇gg2qr o'$ȿ/[ ԰a\|ɽ'^=Fl>KLa{0ȷz%oLWw;Jɪo}ӷ%qe)Y#&A“wvko]TYBי91:{~K /~7m|ΰO'uDD8B#Y^N׭ӹ+߿4Ͷ_\.z^=n;F-}G`F1e=,^ִ0!qzytaVYUvSǧsE!?6y0-`˺L{92+ĎAP󈪷B68vc"fUˤ*LK<(c넡 ^-D?e'w~*M T^v sהTmc([h}Qt YYip ?Eád9~-/a\8d!c nMҶ\;.&.m [N&`'s_&v;zDD@r --5g[hli 9mA#z2㰪|TlRTX ~5ܺ/?ˁjqa1&!ӡ W\ Z?hb6:Al=x^> }7\3~nYLA7?< bf|l dRH/$oI[ů.Z'¤ ;`V'SO4ʪfd]8}=Fh9ذ-iڰ`1S?t2{uo{Ҫ{W6uvi,S( jxyL捞̚_{6%- 4g}gF4TXXsWth~g[?N`˪,[Kƍȣ`ʚqɌwx0W=3nxGoKSr'C)-"""""""""""""""""{ٹvhS*ԞM 0| #j%( pk& b\[Mv dmUTb:0[ŻX6#^x9+=с[\'s)4!)`bZ 핔W@d"Ͽ`1K[sX3_sBG։6 N5-[8uC5ͶDDNJzjS_LK;7œaA׎u'gGmjV4Ua ;`v+Ϥ0n=m%.}D}ʰӶ/2+&lvDt+P-v#.> [ <<fa> \^[6RkN }g{CxZZ^G̶GX?+No칅Xʘ~Shym$"r(EDDDDDDDDDDDDDDDDcH/wZϗ&Rk5s[h;b4] ̪X>|+&J:G ch,|>{ V'1T` ;ݜf0DHX0V[-5ɕ[8wOHGjA JON5l^o[u#U.vJwiV2օpG Ғ=D>cO>f'>^\sW[I{۫Ƽ?F^5ؽe3󜈺e2}~EE6||ɓѵCgmSr0-u*%pD&ckg/㩫~c '+~Cr?Ɏy;|An=w*)Mg42Jj0]0c;džؼ$"R"""""""""""""""""r건`ЃO2:O}~Jcի#x7>RgD6/?=Ylb_;t:Oر5c/5;5K%'c&?WT 5*[\RVWgŝ/bb'r!ϼNhuq|"FS3<jg2WOckWF4՞ ͱBXəd'3fÂwLr?w뱞wč7o}#'`~95&aP{HrwkgLIO;B{ eq u9y=IDO0f]u""""""""""տrϿF"!n3f4%gzMp>&9O(/䑈+aX2ca+ҋx٫ !nUVS;-;2+H:E%݁)e[1{H," S)};yܗEnn>E>AܕM\NDSSPB`w/'3XlW8ǹ+/y⣶e{~r/Gh.tmkyM*sHJEfav'w|Biё6~M,>y=IDNG38(Vӹ """""""""""""""""rpz.bp(0V£8pDqn㟰[Gi3݂v[`G>czz2ד҅Ӗ"""""""""""""""""""""rr:9B~1mEio=Ӂ""""""""""""""""""rpʕ'{""r:/EDDDDDDDDDDDDDDDDDDDD䴥@]9U|"ߓK؝[EthNV՛IÂhE*+*ؚOrfs).,~HQtIiϙ^t]6YȪUuawb4Y"g$/m[ֻOvVY^ɉ]3l(:wޜ3Cv~ 1 //O=pvrGMr^9 ޸B"i^~;m[6Bdu!ahwQTTHv~HNx&ӵ{c.mN鈈W䧸BNVpqvvd2 gg)((৸B:fpЦWi,]4b&A\j DDDDDDDDDDDDDDDDDDDi8,+ً31 ЇqqvϏemNƀ8y;_]CS_!^'){V(ZDDDDDDDDDDDDDDa')\j,!\ l`Zb=[ʂa;4 VI & QyXK]\*mcٳI< 꺃ѿlwf/)vv2 'mTg/W9^}74s2yLbj{e0g\R6'ƇVö5u5}}/7<[ݫjq74 { 7m=q7jKeT{QpfAvc7xVGz4=S8c%{8c~ 򏱈HLdexzx k7fœO&ݎaEDDDDDDDDDDDDDDZ77ҡ0Xm 5՘5ϰgOT3>&_? Sfaک@zR]ԴS[SMuI [rTfR^}m59v+ο}10 php^N}5S2Y+_=] Dέ]EDt|6F0b{mR %v ~:fF'֕==zd޻}2޸Me N?aʇe'{܋ŵYi^Λl0<|ܓ,7Ȩ>jdR/& (jw;,cH,쉈&k;$95Eo~Mæ]Y:cZRW"ztGmƁc1BP6Y/ ;aMFvevIrrŗ=}\KpkIH iYWߟٓ* 3ٿfbeyvfO{]Fw3&w ox{;4ӯ7=/w "7"c1VgY0'?02^N^9_z;8{r"^ye\Iab2yvʹ۶Y7>^̡.@ {+Sߙy7b IDATt xw1ۋ -sEW毖0ynNdF+zq^N#?}'䕩oiUaዏ[({/^| go*?*5\rv xGx}u!ݰxỹtr?“&!C2'7G>>:/'?g_3=Y+^15ymuVSlih]F<<3bks\ |;'K:99s| DO#FUYilJ΢&ep)QO^t6pksY[MYa6;$e_)Uٛ34K0Nּ˶yk;ݰH 8!{X˖e,ݔIwәT7EƆ,uD* l_#v` ϸHtX <emDuiKH 7cVr6|}Ub)W7eė1<D%NQV{(/j@f',Ŵ jGKO'j ؙLܺX(,kL>dzqQwA IDj)H!eMcS)|{״k>4J|G_:l[R(HP޼)~-o9c&Ы5Y,y-{ 6C329.; YOMlū=^x>:^K,X拧. 8oJʽ]ݵKnm`O{&C?WZF iJ-\FR<ߜN{orKk%}.͇#@\҉]}ľ'O;xh~:rօ\2+-Kٵa ~8.5cb[4*Т0.ч^d$-gD2c?㾛2Y\Ѷm>z+ck<;ke?s\~|K >ymUۿ`-/oP͐.8d/ Y+^ٯ}|yP-V}a?xaAOz\>c.z/6K+H:75$FLWwGl9|Zլ8'ITLie?Oq DA*+*Hٶggz:?_}>)ITVT~_`?:miӞ? jj2IږGXh+x4C?Gؒ6;~OrO ;:Khiݮ r4ԟ0;X|r8gPƦ͎rK\ŝcg\<6\tc\D5Ukp_ _t+r7|Oxv5EIpd\x1"8_㺛?dk|4 #oslٝX^~ub L$,t5Nc5+;ẺMR~K /~7m|ΰO'Q$,L W)Qoqr o'$ȿNѤh+XN-:LC?ۿ&-|[Hl _&_oҨąf|mgs]9{3z߬J`Elç}Ȭ;wq7|A[N|;o}n~[G'3mI&[?yWxs.6Җgx뵻9/H<؜r#Ӹ#s5l;*pt=|r/}xngq?ҩ<Ř5%dLfӆu!6.-[nkT%9~1%YBm#-eD6Ʈ#zz6&^PT䥓ukn#Q\W 4,2-=krrv%Ú۲Wu 9YYdf &dfe]\uUdgeSPq},2/WT/5\ )-h+,"++" Gښ{7_%\\\[m-I MؓqSKU{ګ؟LXY]d4 Tc[Fb1%Q6¤8-_s~޺XZСCЁ,Ӭ0;̬@V~[868*rwYdQ)$ĭgu%^@rʥfrٹe1kײ66-;shc^DDDDDDDDDDDDDD@o7{"^<'pe2u;=e&59YB?z>=od֐l9۹߿˼ ; W?\=ah{Cc){dԚԕCBZZ< hʼn;Q֎K[b5[,.8=w=Ck^_b+lb͸Nq3:"3vCu^nf [m䘦NƂwf ,qGRUn{ޑ/ Xhԅw, go6fs1m}qLJ5Y}Zݬa9|3bB`_Etcx6]?;%bmfs Σo#f`k0{9݋˪ϝ};1dyt)8D?[#iK :DGJ%'5J{DgI"wvj9{+%RmSωȿ7'_ Mf钝aASŐ[o)Xlai2I+?Ɩz/fx@=ť k\ңЗтBLf^2POԪ~f+~Di5rƴj i3td_X'0 7eۍTy)2``egS_a#}RR3ݰY폸N;л{ڳ[O:Z!Ζv\XV&Tc{) ??gfѺc%SNt?NbM>Vށw#ש]@`}` g츾i5ۣμ0 PKh` ѡV6|pE!~*6b]x.:b/\el*1sǠ_Y߇Agv!͖x?<]BX u%2ԙǾoPYZ p C0]VPݙW_٬`lK)34.!UN,ZU;y>,X̦jL:.wk-{؞IaZWr:s=?.HV wڶ'e <&Ued&=jNhDNwsdxdKbΞJ/ºvmT/5EEELc+ao^JQF*k0 --ڇFi.RvdS?:v$ }7lj& @pHX3x6mGB7\8I}=h*@?/ܝ-*IRrj+W8-O u[1vxtS<-f}F~^N>3Y3|mAD+?ܨ oO*e?V0,alLH Ҷ[$E$-nM6+7k;8hJRo;(#DMq&iw[u?ϧd?씤,ԶhC׶A!uwYC#""""""""""WTיzeU4E@hh,X)tciƖbbרQ "ҖeYإ, {3sbX`fY`xxÜ=3=g:9""""}{^~#?G5~z#۳Q\YGĴڳ ۅ u5ZP IY;|*Z\TfN ,W- Gd纱\?h;YET66防.`P[S)6 |l!vtu `0аNVKͧaٵXUF hl.'*L0x[ ѶA%gfV3M`F"ic߸4R xp [8i{iLbc~he'.dToIulkCB3ob&ŝx/ƲL?aGܽ7?ʥ#v.7"$ιd9mwڴZ(;]N[X;9T1sΝ~?ND7kך kwWNdR.9wDy5an]<Oc\9u55DDD< lvmmunŤzvbܝHb+<$N3gS^ ^<mmf:LIf&xc2ֱ}н:sQCa!\xF;L'm\>3IkC=6jAF~ 9!FK`ܹ7ӈ%uxww9!7Ro_dV^8G[Ob<>|=vԒ~#CgȬFq0e%+g&1>i{riÎ)$v (ċ㪧za^1Uygեw䡭U-0 ;D{V0ݞ,-u>:0lGC=ZE~I.L\n~5\^ZNy<>`` %k$(nek?fMF.l<6'Zr;`mq`&>8`R_OE3no3[/lH\{lhDx ]{ZEeC{]kGk>[,+1-gnc=4zH-YGV] ub5$*ZHbQF7M:e|:EEH#"(l UGM";^" &0;H:=u lyf~w9pMgӪp>t V\_YAZW;9kɃ}I>8w悹6#I Y9 `2t$s>]NaIÏE4l=Єe1z㧰df>m(&{7g$06{;-?kf %Đs.'J iBş]Gp:+I V{why#N&d"i΢]*k7p`;=j`_fdM|-݇n)g*^~{1 `]7yΦՇyᚙpR~-k] [Ʒ~x MLǫ[?ƶ4Rwh+=7_~{׌,bk]G^F&TlQ5bQPcR_߈EыT``oIb [)0dCye[|*"0%g;˩`,qꓩ#1B#H-4Pe&_oDh-P 36D]jmD|W=՘; |D,3:pMUմt E.uvǍr?Cƍ$4'Ӽ0pSfʨa^=ԡlOKKJMw9 8n,4 kWQS|aՓ_ Ǒ^r4NpsıxA|?FE mɏbD-M?Gx36[GzExlƍ# G;/f9kV}Li#W)VSE%.e&EeX *@qe\X>UKW=<8Ywyl'?KƑ)3MM4[ǻLUX_T(j_DfV c<${rn1ALg/K(xl1DPeVPZag.&'mQۯ];TN'/SIY CX 7+HRD; ژ17ĢV Ǒ1 {jF8'}[6'Ǿ˜T׶_}9 IDATڗC2kqL}UCEUhaIh-e[Y L[v -"8(l{qWS 7`"50pU&U5>г""(+-yH]]M{-QQ=[P<'24Byn6 (:v'd@VZ,ڪyJ\\GOf:,KB6SdPU݄5Cg[ 3/""t6Pq8-7+ z?F`RUcX|$F qM5T[6v~3ZNu%uަ""""rv7oBxd C-k 0k1Iy͛q 4rJ45+{ elz1F|i{V*}'_}a[a!6 \UUSPϤ|>|:q,Sm-j&ҷi-l )Uvge;a3[͕\4gl! &z-'4f'>DͭT`4kcGC;MX47f^6][Rw#]ʹt$`]CFA ah#0@ vaf -mYuF Gi.\aᑑVWWA ǜoᛷ7oۿ~=^AXMEl lnk [_// )mm'($0 c`~mʼA  驜<>jc`5WRjdϱg0Yt\l{ws'&DŽ0kY'o1!XzN(.r^}͞ż~mߤgy^ DW5*j}'6C*{3:peac{̙7;~t, ǏcRr m7u?h*4xUWhNTs7+9ԝf[-%lysC|/!C<ͻ%&آ8ihC_;}+^-?[A- gerkNʂy$]*?No&g!ε|=e ?v;ov0I]l;ds7mJY_~{^ʢբ,5O;;l.4ͯCgȈ.g]"%6v]|Ɉ?b 1Tv:_,e7sHQWÀ֝߭\^y˖%7$qWEQج6.~A:GڊO,T\pwRo+מH_<{x읝</e2>ݡS'Th`A5oBzkь89؃ 4Ѣ3 H` ~+x \]ȹ#BNihWilWۃQhv[N>~7F`A444v< ƦlAiCޖ2a"7}Dt,X'5@jĞۈ_L+;j tזO,$ZƢ0njEKsK{^1DCg@kNO#t8t6 y^jjZ8ed v$,\ml"߀f&,=.Ģ"1-""""""""""""""TDnm){uHErD%O+^gDZڝɾJn}w|OW>ǹ̜5AA-Kg˞rB9LJ,7\uQϚIjl流a\vC*6Ş-)?wǔaԗ"{>J[pSWtH `5Sݧ~Gxh'!*{k lg؈]6? 9#6WεOmgyqvVԱ8ؓCk8_ |+aqۊ%].t*s%UEnV2 u#Wm= ho(n{Wfw6i#ITMq^rUb$]}A[ ߾_O?ˠԉ &* ؗKq6?ӷNܾJx}|i ̚J(l%yU &￟ͿHG~L6mFzܖ%D{᪋JxrΙ6H-[Sцe3_򽹡lq\_xv_ ?>icb摾-V ÑyƝyֈYW.xM7Y `w+/>}3 h:)|_\_cA14`=48~K 6O7XB"j0aloEƖ[YO~$"BO#g&>. 4;Ib_UuK.d.Cf] %  n>[d ѝf珟X-4XxL.Tx|0&uVYKڜW.3z ;ZjdY8mnݻ;Mm'3cD6kP{;W2#o5Rl$&xZ54{ D"b:I3%ŵXQpS~7MDd`STdp?K61hs+p#6ܴ9/N7=tyvg9#hi()JE7+(*i#:񗼈HgVCߖw[Oɿ6RX˖s[VK~vy5}X}iunG$Ͼ~`?ye E{X ,ez|vv~* pOW Qc8oÛeH/n_Ƌwu.Ė̗~7~^0LG|\?yvS5_ewe}? 3 ز@% F2ܥ\tѨpDx'y=](թ[0It%ְ3󓿼|$0m!|#?LOϰ`1h[` I*Ki`~Ƣ'>a;;^0b?GNS?!̚j~F(݉-n4#wC;2(1D9D39ĭeر xc &p5{زw<+Rbb;bɺd:n,nUFڜ&Yͮ'`#z("mP㪦iQ'S-dqn?fZvrɌ6erpjOʀQ20b.O`PcǍgONvl9{u6t:a2A^L 6*g2?}~sjs' vWz4O*(4'+zʣ Z'3,d7Y -Kƻ+ؕY0†2"h-ގ[lq 7NT-&eŴ$͚xN?/GKw3:"Ga1=,JA'r3ɩ?G >sīIX>[̭2?ksmG %mr*!?xt~qa6n8){yٮΤkˊٓf@ -ϳnG,Felξ޼Y;)J&M pdli\Η@V6kir7cI=!pؼ>R}RpSwJ*q9B4ԱCz{7NA_QǙva=ddPb#,yS'%f#v灻\Q|ϰؕGYdLLcxD{kc[uiܹj;]7$`Y26^$w)#Y?udzHdNpG6av^֝7+"%3GpBv1ԣQ3Ye-kYʼq1hI;Gro~N-ֽ۽GygkY㎝ylxo.01u|'d%:+pQc$/a|ԑ]meô@撙;y#8rt*rp6M%ɵxow!2>jġ-Z=Y;ykKL9WR\NZrWl6"5ZN'{r 8B J[8u; 3I>gҐkш)AU> '[i6Q}6yKALލŴ|ʻCYq0Žn02u"IV&NrTKwlLEHUp JZr17sGr}lX ܫd}999pa-g>v*c3J]_G|ĴMG4Y`La/EDDDDDDDDDDDDDdeLڂHDZ/o80Nг|0i훪Ό#i$iFHrs{{ƍeⱽgH,ؓcwA`(7eܬ뛭Dʂn$6d#0f(1C~KY." jq> DYX6kR>gBL|~fu5TTⶰ`r1L;o#=k_f" r5RQ^E;i_L=u ƘEcŚUw\+`R 'FhI)냗(LfPL0FK5Ņ;y >aE#qǓY}9v&oT]FYM+~Cf2mlw{,oxR#^]˞5ean3д|e^XΞ0V4mgrO#ߤ6L &stc_FJ$vp^OUe9i2WK-I>tV=Gx.J(*o u8#aKgږs?$%JMI!%unL`paM[AE,,{(%)!@ʒbMAT"yl{iu9G8]'=~cw&ݫ_p\"U<ٲs$:x8Fo#?x*fa\~TX.`sN4%3!Pmue9$w""""""""""""""""""҇>?Vryl|InE 5Ň9x#x|l[Eok(l2` gᄝbɥ$mE7Tim{CG|Rm!ʏ`>).`ϝZgs2X~MMTQ ` $n"Λ;s%rE+ ޖނ jZpMmZb&^eal$9B:{b~t+ٝɛȸ $&+/b}։hKlɥk8< go^G#~ . OQ\I=ASdea[B>7V{x3v\%t- G8x14-h8 /\'dPV@C,_DDDD:_\Wtf"""r~ogwb;;D @i N ? :].hDq xN`dC"p ۢ/,!agN5wNPT"C[b پy|n|nlh=@eE9ge}:/~ 嬎r{01㫢Nd "a0gx: !1c;yf!1$DDDDDDDDDDDDDDDDDDW)a477jvd :j nb1 %E>~cre\yM-"""""""""""""""""""7.a7hll͉ IDATհt:illa7ڢ,2swbڬ9T_̏aɺOз}.|XH;TWW/ ۜN,;.HdXl@lWϟkvIɃxkXV^r9߿[㴵m3ozr K`ZDDDDDDDDDD vLۍnrDDDdr@g^ޒfL`s8yH .M466aYM˓|!>08o?iʮ'۷a70(a>_llJcShin&;k'{2j""*& IML@~:}{2O O2&ubU%=W'JN EY>J|Mٰ0/^GUf'}lݴԉHL֓EDDuzlv;ϙ6 ۷n/gz]lzm>o=-Ɩ&C'ԣ[LQn ,3aPOעP&9em6){,'{!,c'3<|t쵚=rWwV8Tcu9E[i[n?:җ#z춂qrO,0()3f3e.EDDDDDDDhf]eH/9oj2S a:? ko2ċX{}_|Nh鶒^),d D1 x`[az4~\ wt]uˏýsrz@YD/ϺH?5w2*J੿s%mLbKDDDv,/#+c [72MME|z'wi_m34lt%r/`fE@(5-enS3bn׆>EDDDDDDDDDDDDDN`Y׭f0.GDDDΜsceo¡N#"""k;"""""""""""""Bue?@ށ*vc>jϙOdtl_$"""ңH ׅ)EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD,EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD,EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD,EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD,EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD,EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD,EDDDDDDDDDDDDDDDDDDDDdR ZDDDDDDDDDDDDDDDDDDDDD,pOE"""M?}]@ue?TWb}]鉿Su,""""n'2*S~|"c}:""""2Y_ #"""]xu "eqj6OKBdtL_oߩ^t(-3halgO =}@eY'٘51"&.剈H~ou y^vSY^ʮٲC>^.e%|4-}_BO_/+-""""K6[MNVQ1\r $&DDDDD ]/@gۉOLfK?i:^9Yl\y/DDDDDTO_/|PBueֿa)!""""r]/gMb. MߣK7zzYh^ n73.TCDDDD^Ϣ!̜f~ D0eVW"""""zYDDDD>\JDDDDD_^/+-"""" j+KJDDDDD]/gՑkꪳg/ nJDDDDD]/gՑk#׼"""""r/KhKhKhKhKhKhKhKh}]1&m54eExߐeSQQM]} MGPhI$F`u""""""""""""""""""рD;up{]fwJDL<&ed~}r6RU^FiYeeeWP:AK|zڊwwrRjw qH8)BJ $$2A0qΛJc6<C4N}` MJa\ql)-"""""""""""""""""ҟ XevBCmپu3,fjb@ٿn{W2jOe4wZmaG]X.<ZEd>nN'ήik\26/LRC,g^rP p/nfV=s)t⓷!H;njg͎J̾.e@h+~[^2F-Y~J7~ ctB0`m4USPވRV[ >)g;N@X4qqą6q 3ZNOߙD3l8?{߇;^H$ޛHJZMq۹M|}NIz6oժHJ$E蘙A`%A~>!0;,_4/OI]q({7^?t_]7ܟWowks5ӎͿR:oKИo|O0Rݺ,wuG޸:+IԆTdߖ/#Ur~xmnȪ86̿)9kL| ڻ5W2ppuNw@348R:2-g|k3pxOv>##)6LMۼZbspFNSkI-X8{`WOJ)TקqJkf͝SjϺ)f7dVy%{_ٖw߫j[luY{Ԍ}6o[и2Б,qU6?BZnd~s׌>?1uOٮ䃭^e8=vm;'G{w ÅcYzy6WGX^y#S5uvpKn\8%Uض3cY>oY,9+{-[vᾑdYڬΖ:^JI\%7/?9#' vp%&\UuYgL"ԝGIc1/ ߤ%rUS\s[cUtp~#yfkW_wwf㷿:Es\SvUۛu<^?PE箻o)TrcǸ3F?0tz2M?׎.M˾7;RsYkn-)Ȏc3s4hK DWS46]33cڔ4URٱ3'ZV2iLo${{$/FNcLLסْoVwgd|r}m/GiϋCRJ%yޟWM2tE,'$pz;wfsgqٙ;XP33?|pq{1epw~o䕮޲=}M1o׺2.vXӞܹ)$#[o>׺բWɺcèMY'SrּaJϦ<~M:#LοrW6`%o[igTʁR$#9| 3/usF_/V~ev 7ݣ@=\>:T<ݽۼP,_O<=I?vu9{c3=JJ?֟XSJ>g?ߚ3B.+W` W?d2xr~V/pFJ)W*I%sge]Çr4f l(w0jTM]wݵ3;1}gKVd)8ܱ|ʸiU뵹qٳi`r:ΛgM"zlʺv8\ܵk/\}Mu57\{;TR5+'D؞d_u*>s0tκ;g^tm7gh+>?X ߟOCGT)eOf.ҷ>J-wW-tgI\FdiI+R;mn/.Rzs'uV2t|~-[ZOLx.,WXLݴyƵY{M{do~>[HL* eօ46!WՐƺB2| g,ll9r>5 oq |7o=]cŦ,ym*Ti y~2?L9Uҷ y󝁕S3Oz߶ؒ-gh^ӒBr^9ڝU2}5H%yN3rtW^֟sJ6|fV\ٹ5gV~`yhc焊-YuY>nr$Om8c|q;П~+ 8`rх][OUHXچLўa+sw7 _CӲ`u_6+͵_?3;ajuͩ{ЙB c u~4tR~N\Pښg_̧絝 ޱBCf[=P#/]idW)_xWeY+wl)bf|٩;9*;Fw%XHӔ}rOJǍ uMiN2tr o=*SE&v_9G=o<.d srߟԟ}S(y=Ǯ9_#?ƅ|[?:'Lt1p>#=ٵܑm;RY6e\h|{7ez] v?ȿo=j2BkhTeߘJ9m[wEߪѣ+4ec¨IJ{9,qL+IHvmx5ݜ'Rsk9x.U^MKwT2љk2\X?}թFwR1FrhCogL]US=k[JPXq_=k]*ei3l3YR{y˖sͿeY:|<_Iϖ@=v#]{.oi 4͜қ Ԧ Cpd*9eI&)֤:_*ٳPg&Iʽy\)8cEiabO\#aռTжyykwιBS\lhܽ>`F>pLܫdgmٔW7lOGni}tt̖}'?nD%gC']oE3wyˮ7co\(&-kӱ|mڮ3ԟ*6ԧh^̺HiHRgvαjypWO7}1^u'tduRssgrtt\i7󻿷(sgQeoӏ}?9UzӞr߻5+t̴WPKǎW7?{s|8=Vx0 :y[>={{Si:SP?yQ}:U[RHpƙK`GK={ޣh@tyS)ۆSN ^H IDAT_vB7^5w^M_)NdZq@Nm9:F;v<{pyK9|g6-S`z:;<p-I*R~l9n.o?yOqmх3RCw^{8_KYʒٷ D_˯ϵ }/Be$[k{/^mtn}5 Xaqn>v<]])_މa)9E?1"| o/( g)/d%TP_wڑ],{[?tmy:_t:b rʕ3XHӚkֳ;QԔBF/,/escuw-Bcs&Z`R*LK&3缛 ov=s[ O$iXoؙoȾTM6,kzΣ5C^igiLϚޕ 0~~ Ωtޖ[e<Fe2@i䳟^qS2_Ofy?_Gg^GS)cnꘫ+)/?ǟ|&pc?w鷥Jt0t)|<\=isާ2t *LY6_#=,)Sgނyio|Gd(4e=/M sn-3< 0FM̴ȁr*gIy&NmmmJ_2Z)mvwP9mwfk>[؛z5Ӳx7[Lmiv+c0HYvÌ,{;x1ߟ5ͩJφ|᏾1Y5/ko&'Bؾ8׵/~_)Bu[>pOw)yLk{d6ݐO9~fU\,}0?"} k'ʴY 2LmKUy0Gd;sh`'4.%kjJ8' Ti殺17ZS3җ7^̶#z#Ku_Wˏ1o]m.3ui͢Lsxۊ(`Rb)ktrAͺ9wY/Ya\?&PԛOcT!|& wgۓ)mEn`EnR2 }U6 ,+V&I3dy㢴x`?&R]4ГR=eQOs-sj/e}\D!/BK|䧲`ݟ]=J45ggibL| ؚ6ftgT5eZ,Z*ׯ^i5],\*uټ`z m䦕3So%G (vJ{MiϢ.D*}y>eUU薕 \b2! p(X!pNUjSHJ9#JOl[)/qpy\T-/IS!)ߘ t}.@::zr,]HuM%-zyS6nږ]W;g.λ#ҟyao_ghmY5jG*' uggBu.J;6g_ʫ3t8=}zaf G==$ˢ;3piD\.J;/|'Goˏ~=/S>gp>tm|8_)yDaʜLAIRHw\w,npIx 0[fYӽ1|ѳ$)YjAj$ޕÕs rɬ85!3.rg^~jC|hř;Vyk\8&)s>Ot)|ps6uo ]Hmv{rXu:E)wHQpwLbk|[βtBL1+s[RpTq sͅOܛul ͙\H:T{c.iYvY6u$I*Wf~ݹSUU8HZ!$.씉.NW9幐b՛,QSOooBppD\ʃlۑΞ L>3-ϊ-"+X! _ӽ{wi=K.ҳ-[;Fх44pix 0!*PiZUmSH@{<?%+mώl^|l_{}WVM.BgLO}a_*I ysH<г32zG5gKNvA_x!vpE;.ؗ&.]f^$Μ~$%@v<|k]gFιJ;^_9pn) \xřռWI2&_T#y_=G3T>]EY8!%p!&_TʴY|Un]6mK W>+{T+-״dpۓyxO s#.Zժf~n-?q822F}t6,ae.]\ݬMIʥR:O=+?T*/MC9:z,Klٰ5-1MM :=QPژ7B V3sܺ_*Vݛ] !W~w/ԮH2pDWRCg;R(haVў=3u$I3N+grύK3X<=dte0;pyނMgl㊍{yڅipջ`h̪2sܼ烟̵7ܚ|q#=h ohh8A 2WJ)[H{ỗ~L}bXv&JR*@4pqԴ$Knx#7o7dYry:.S̞ ϓ~/pkZgMtY\q*'M53t3sa1 hF1<)ŋ]2p+}Ynn_'q8sd\*內rVNw &I5K8q;2rօdxdY2߂\,t{dۖ\ Wb6XFzx׺|`$I17ܕ-$}mC%={}6udwdRpur5}Vp +Q̙i)Jg9HGƗ}Y9oFbW]~ooIcu%C}9cc^ް#b,=w-HR/pUeӖ TBL֞YSS]pUUUIr4p%*.Ͳ֗y$ Ə:5`k?^y|e˹c?w͑2.J x>yߵT5\Lkcm 9;ׯ˖CCI|YVߟC{䕗7cMkk-3g% p9(֦e´̚BƨgԖ Sʻ5%>7KV,s_Jٿ//=>?0+_y6GTz@_*3N.$pFy}JR"k49\ݖ5*IgSiJIEu#='hhpQ]sv Tҳ}[&mN?44, W=pfGvgٹ`z3R)9sx,٨pUs4[;ȍim9S*z(w=$3SHMMhWB ə;L;  pewhǺྜྷ yny5Y;!UW7FoMrmY5oZF,ud+OM'?WUؖ  RUD 2O|=\wDg3-OkGnNWȔ4w4<ҵ%cKMC}m  k9gF1IFy{B4 g5EЮg7 CW)]S՜UY=+M)4du2dhw1m3.lTWIsKSj o֧zl|C^ζKY(p(wߖyucʴU]KTrdl?vS*\xQ\ ʶ}'{C״{#K*tTw?=۟}8P% }#Y)_«n)DS|l80pzG[s sXHBV<.XKS3Wg.YQ5+,k)5~\5~02I*C<ԓVKOEMŹql޶;IH*UiҚ |ŢՏ]Uې *@4eߟږdi9.L-);r*L%.[歚B`sMRTC4YG\P$4W).T')%Iƭݣc ilj.Pt˾HWuؚe7-t.Ʀ4rR9z$=@`֕^]BSf7 DI9GwG9ۻϚjI  ! p(Nbr@8~LyK޾Sk]kfI'oDWg 9vfoVڟ7v6ũY} iw*y \֜"\ftk-bsܳ\uʝ[Wgұ*9zt$p)T>444 rS\L]y2[3ppoWNl[ҧK;OΨf4KDgtU[3{fhP:)s|rbKfLK3*NtIl$K\8v53Wft..TܬZsM+IKeZSjޚ{ٝo֝)d9p! DpfYqY|ߧ9/ͻr`5i,pMf7 # [WKʵypډIKh9^κwf m9볲>F DpBogTN[ܙ[6e.xe8pG244 <SH6<7OQ>mO|7OYPrQڞP 'IUcڴrϦ8#k?akmͣ'}+?ؑ#oE/=c:>ܐMihYK͉#: OhR96>{}-J#'::UNiRJgqɒBɴtc!KZ'' pYwٸn^I\*:է/=^]#le[\f\)*)vdSwepٱ;S7/4mތ4\xfps(_=CUKϽ?+$S,Ue;]U?хeC.OU=p9hʜe+S]3wC rQ@Wډgdޝ]EBcf.ZƳ/~ᬤmyޥ8s1}7?>M4A P;:|&6fK6ۓ 2Y_wcR&Uڞr0˛+Z`>wܳ)PN^d=\YVٓ oeX_POm^"-{eK C(:gz%9TKR;}n[>O=u,Չpzж8+7}E[,oG id4{7$:I,wq[K,+M Plxo- ?`< 0g y\ln#sogYi4@E ~0)*Y~mQs"EQIckGf̚=]ipŔ?x ]s1}m>OdqK5{Egw$e.rn `(fdͷfd$)70wKWga˥WP9vtt4I!\X9sJd&@jg^Eqp!` -[c99jҞ3dY+M=$VuZٓ㵞t_.On϶cAtђ6Y /OIQfth0ձҘ"Inx&O5GGlrY{+kfʢ+H笙i-z_&tSw.ͻTFO coTsr.3A4dݝ_&i+`v>HHF/e'~4~6G \~9K_&ɡ7>5 j'woǽrt0{D1tqu8'W5A4$<|8K%Im{SIcK{::ޢvlcAjYd%onȌ5K[\pV/ɾ+>kfv$sњy=[9pݘ}!EPO=gUş͍n_ ` d|#!sYM:nw/OV3c OU2W?ZL4;?,lܼ#{ɁTӐ֎̚(+V̢f%L8A4(522V5YIԒT2gcsdV%{kItNHJ \*iY{V8$hn5e(I*Y̅ы>:hFFle = `U9cGvoI*$fofE=odӑZ̹ά\'{Q9ΑZуyѿnroᅳ_#_;֭ž7?;7f;sVɴewe-M].r7`)" Mm6's{v}\a.LJQ%Iʡғ놏nOoZNL}}n_ʽUUܑQ~:[]I pu`2Tfe-^L WNo||;?%$mCfiFs'澔= IhIӚEwl~2arlM |5NWDx9~7h5esZєŕJUf},|yfTeњfɜt7ġ=Ɔl=<ݝ9ok^_9NԎmCepy Js.N MB~xŴs%;zɲU7GϽy_?k/]_$?ПrNg ;.ۜڛ$nQۅcY4$ܔg~?$%-ߖ'N~$lϞMi΍Mc!J;p-I2gƙG\v=6rbO6oږ]ro(e%Mm&KWΊ9v2}'O6vtgvX.TEg_w2'dN455*]H.4SMٟ]/?'^ݓSw}vh_K+C˜I 444}1/o˚32vf`\wv熆>&jt"h)e0fpj6[#}#ٟ9=]i=VHXP7gD \5*=۲f ܻ-I7d铜e~HUg˱dȜNA4prj+yq| yeƍh& `LJrԎȁdvkj?zu\\;We\C{#ِɞ.ryNoVݟwv1Yj/p%GC0D0Uӳpa؅ۑ~{s]Yԕ,糹gQ\ujGed80+eHXˊLfun\75 \%̱ҏ?̓|Պ|0_;'l/nȞ̿HЍMi+NFmGVOPԩDh|%\}:+YI֒:[{3xh_g4ا'4}zN9|($̛2J'ٳkOXʬ&_\Pet%;x1׬Z5YU3e)L)Ywm$O9#MܚO\'yx:ұ4|r]f\"I ]Y=g}__wЩԚ:3k3LA4^ђշշO$\܎-;Dplز+`=ipCV` 3]yC)ϼ[Щ#ٳHlݔwT>sL SߥSEuGdzuˢci>Y~ d;l4]qD|CKT?s5;|qgxMy;/dזe/O@"wOu"F>RFw]<W;7_ޘRMmA$ ~.=QBёd<?C1QCݐwg~Wk_|38z$'j9&)LWAs݌HDzFxU@ P'KE~4M\0uҹ<ùsqg.Wtca܃Y;`2x`"TQ4kFf&I \ϭ?Kwk6nۗ#'SkjO%Yrq'tj##WN9R_Uti0ASEeA?hqC:έV_FeV{N!U&{ [hn % [hn % [hn % [hn % [hn % [hn % [hn %A' IDAT [hn % [hn % [hn % [hn5NS_|8~Ɠǿ2m&:=/;z3d ahn % [hn % [hn % [hn % [hn %Vd<Ǐ'iu~? a.SE`6||2ѭ*࣯2@Dc+rG*80qM~wy̉,&I5oZ>18gM53ޞ|yx ;0SEѕe)AC_?u{).<71  duKe7-gW Ls8oїϛWpV8Gd)6kV:X߿M|i9#o9HJt vpgv;7_b_~ҤuӘO_ՔI[[۫+O P啱ʾy̘Yz*M9#39gU)W Nvg4^,.Ҷ3W* .b>~Qdx+lMؔ))?Sn'K3UOx<Ͻ-{ԙ W{?۲uQìٙUI֒eZ2mY8#cEtљ]`bJi˯= RXӊ~Lٴpʵst?׾O.z;[:aND01*=S@Ҭ^t:.9T~ЃKӗf҇ebh)vbsƣywr%t\WJ1-?ϯt*$Eì U+GR;Ei_.T)L?=j/?Fl{vdk _Ϳ͏gVQ+TT:nȗ~,K?"kϮq]?6wE:.ppQhKS)3#{9pl õ,,t6DLь\L=<4?~2NֶU=sF*9jj9~XjI]eNn}"_^ۗسm[?y:2)厯ePfdئj̝O_­ܕohI,?x:ޯ-g#tV]$,xFOq0tV1˿k>q΋X0ȡ9snu)@6_Cld(p,M5$JmUeaW`Xbc4t[9F2d6G(!5]3j,544 -1}A߻c;*ew%r{|YK/=/x/dkC1ct'>+3;BƦ0-N qm?:4v5͚aS|B,?3Ǵح*E0 @k0+[$p͝,GkV\-kq7-R4[f~;  Φh-5^=,ɮ>Iu:j;9d)xUC'.E_C1JSW\YzVѪkdH\1:O}BvNTdƪB߽AkQiWœOyjpIN{ z3r$hkbfRcBd4ר86]s=jܬ5kө:K$oVmƌi#@4}\-OxeI겵h 5mK۪݋G%oxM?5P V3r Z˳"52'j峕cojOѲ 3td/h%:~R֘8q $ !ɞkohRUy,ɞHM>4J׮Òxq%9G_mTəRy `H  >a(jF*P4dno$IF`{bD1UsɲAEC h#BxD?{&ph~RyI fon:c0^uY^$ :}0u0Xq~zgTxN旪#Ӳ5Qz/ g@[zje K%W)m]n̳iok m($$xpJ;]c}])~(E'TaI%W=V`:6NCi鐤f*uq G-C-eZ RK^edDh oHj8Z:Dۢ4zTl}G s{?Ia}1J]~Z)C7֚Ĵ:AS3 uXj*>nў#*(UPHdgLԜE5L4?o?џ֝kGVFP}} jOG/8u#XAS3~+cVjK/q@e]=]xZYGh/+ug{Rf7pq \tnܿEwױbU5t(*n2'Lųѱ!gh>+Ch'Vzrue\No]ި>|2B}z%I6<#/F/R^v+:Y ׯ֞' RѿȒbC+/-$E࣍@4 BQ%E-XqI1 6ZG(ihƭukO j;$I#-}~ĥhu>Z}+W v|,5XU_;`@3yڹelvf]r٠Gt8H5ryMxi-U o^4`@4 o~rݭqL}Zly8[H*?uVB4{uߵ0tp9 ۰%;Zb:Qsn6ϑ߼ 9 9R銱rhRyYLK 9ߨ/\?YcBzE-0L4uj='5Y} p?adjˆm-1m]}RaZz0,575_Cx{29rVNpHV?ir0daiSd$Yol5uw G~}~zhbۢ%C[&.mQcەFl2$Y{wu6vZtdmW%VCE^%ue؂5lb|'u:_}]`1~%K-0DvCr[r~O,ҵ*wiі12kTZ$)g`  ~6bhEeVthD+uhFEf(2:*y%JI^Y ߯3UwrZEb)|?gi4_`1<,QQ6ԴԔBsFS5>3LF~,Y֞ց=;ojKRZ* nSkG'v5i\%:14fV2"&iٵK]cJUX)+5VS><](i 9bg_Z) ! ْxr#JsFnܯS2b5r]Mwh 0e,ӾCht*7ߛ>2պm NRYZvZ!kZ@;rϵTrocoڠM:M>8,ֺ_>qN#[O>g6ji@OD@|U0t/mP@4$udN}kutv9|]Yv6<6֙?õ-#,Ox Hʳu%`=bR _`(*UZq-aU8 yɒd5Nŷh#zYo*/zh:$ =O'JwV\@156C&*ŶOY^I2DҾu69{fG1l R&Y20š_X>lh9e TP,s+G*7[!2s($K:8uO ~[zF%yhS9:PWqͽ)}wq[dPdz++Y +35+.eN  ~f-2TQmISf*Ͷ(YU*o`̆\y{afw(08L JIиI N,w*JKT\R%PN}cX<.(TAQ:ͻVCai7yfBP볿%W ÐШ8䙋lxeѦuxn=>ɰ+,i,FDh\~0I֞ZueT{ٝOkڂVrwT#f$ mSv{:PA2z{ J^GnWTpJӬ+jZbࠕL~M>7&yܝZ~~,Jrt"w[H햻1.jTVxJ4C}^<>ǒdj[˿oWuM+KyHO`*&yIE,o>=[*lOYnݴ U-+'jc٢EbjӴXO1i:?>2]b,5彩_uY 4dj¢%2B6{Q@4 [B2m:ZfJ-ݪ_e F.Y^֯/#(Ui.!gl2Ȑd.5ti<FY3ڽ\=P[î%+>AYrTm3tP%Ƅ+Ru ޶G;z:Skgʺ0:rm;mTEa}p7z/iwT,Ot͟7G.̴$EՙzYt=Kz`OӊI+|]!3 G͌uejːZKN HM,#uoI349":U֡{G_EwRn8Mi[USM+*U]ߤfW\ny A! Sbb"җTSe T-8Bq)#$ܪ-Tl1F`⣂S6lTQaʪjp)$kfMNSdNŏϮJU\mjD,=;39Fݽzl.{\nUu6ܢUWwr䴲sUTQ:7mש5n|rWy@T7)uوp٭&䫢CB;~{jN:]lAJq&(3!t?q$ԨuWFޫ9[\FKr&`ԔUigt[T J_1OgvdؓuՍsAj9=n|}^so*kL)&x}4%=TIcgjќq;hsA;NUqyZ6/Z\ө{Rj͆"ܱM{Nͱ &ki~]ŝaѢMyZz[(oSaarytW⳯)RS*[|YB3F tGʪ;W=2RΏҿ:uvٗ^_'U;n֜a0t!-EGeGl)k_GwA)C˕8iwg84ί?zN+o[&t}0$yUt=nʺ cZmF$˭UїCU[MzJRen/`ہUh\tUxr%ӤВd*thߏQv7oxL=% ݲR^ZaG|X|DahIFw'[h١1>m&q WEDz O[X@zPO[vSA14{& :7~TP%j+$msF(>1AQ tnyTW¼|B-5ֶv|hˣ]%PHt"ͪ*VcaWHoҩ5!2J}2O#YEߴX#> ApV}K;v4/e_YetE)&c%Ca)  Rլ<*ݭRw_k%lNE)1N9gT}pOԶҳ!m3hvFl'ʫdɒY}P{4;B煥ڝS+K܍U*:_￷W*LY/ > h;6E]RwI,K}ԩZ:u 3] MeU_Cvy䈖H+oU# @U[Э\5ж1Mh:5uJ*$oM6V֢R:X17hYfx#gNگ=g׎C4bF,!?Jߥ; "5~xEH햷J%%%KQh 1y[8MLj}B2Uw@QVʷtp.U._ٮ/at}ob*ޢ>.Tb?ח$5~F-I̲뿯ӌO<Rٶgsf7ުV0D> R푷ܑ P⤉JjK S1=n<^%YJNOrURhk]W}=q洆Q%zJZ5:U"oEɚ)hjFU֚LUVŴXő߀?ON:t6Vw`ԠFG^Ӓe%iҘ0^P%ڝ<z.h8JN$jc諸gі'ޑyn_Ĩs 8NMKMW[*4Dtx5G'sG+? (|hvEf^+'Ecl*U:W5{+Y&5RKJTuEU΢FRǝӭԙ4BIcr{2Tt>јmW.2^KO1Χ%|^{4w C'MJWOYJn}NwoM66:yŪl깍T_߫3yթ ˦R@B&Mӄwrt"2dT3?yRmNIle+ I+rF%kHS^y媯VYEmuZr{HY釷Qt{3R4Y56^2sz͝*)R؞٥N[ &gVH!?ܨ.YXoMjRS,uzr̿VІuXUx-TisWjxv&OѲݪ[LWx[d+z/@@K󤾮HDv*< Ra\UΒ6&oj,щ.ԝ֞u_ܥ⶚Fx)1ݜB+~ h:12dr**6^A:'-֮ Qm IRr\6Tr*zj+]cIQό޻"cg5ڡ;qDk8=]|>1;AZШ8%+#9ܓz/vCElG׎ӎ{v]r$1~ϝCKߧg/@\ ݔw]tM<ϡ:4K;lln1[BCezV.)>H\eF`B\gXs+$/1.d٪TY̷+VhvRPϛCa j>DܢENaQ7<|vBJvzv5ceSٮfrdw %ʮe(iH] E-?'éaw*md:ӡ#ʊ*}PE ~2)g*udB0$o θz* ([*Ss>|D۞kV*뭋=^v/.\Z!WX%vflTuCѽ0<*?nVmᣵ꥚鰋[Vʎє9c:%h}/z8*}ڸo)gl[Vּ_@g8a[RmVj6j[UG[R>zm)|͚4F'(2.۠Ҽ#ڶ%=sqh$qږ*ݳF/')!PCYkݽtGmeDi:*oj(>mGώs)HMjr9uH [UwRN%)9~ʋKUŅܦtZYݬ)W%6EDGt䳅(i]7a\u*Q}[аEE+}b(l*}ab141;{xvdiܪ,T6IAJ]^O;SWݬu96%&vWjJ_&ym WtBRp@/C,WiQʫkT]SfSPE+exC,8 P]:WL3T]ێS0J#GDMΰX%^he0KFPҧ*Bw`iڽ X)^xmiOѬ)lWHHMy=TzzF RMڱu WEn6Dy*oQ5)8 7?USoQJwĘxTVp\UNWg~\׎2ChRUQzd(p4XA+ C>dyUph me7끻+`  _+()d2Qfiei~ |)P!rX=1OnTs0'F&]{ԖXeUovkJ6GC#}],>r%[{ϺVW}ZQ1.?v{O=aA.Y\Ddp" E %@4Kh, KWu KR;DvIw1?i? p@2!:*:Ve%*/-VBbr Eyi$):&s3G7K0D}{?}~_ 4~w1Nt.'mqG p@2>glvvn٨3.g sFv͘s3@e;y/ez ww0_Yy/Sܚ'4 ѱC\/֤?Lv} \T^W:ܲQij줩dŀ@^~W.p\\ƀ ][6ュՎMĮAg5J_Ba ~ |%.F.Ð@^Ϧaeylߤc(nf+:&N#j܅r;ҳ`J-Xe:.qrvctpm..h,.Y\Ddp" E %@4Kh,.Y\Ddtp׾IENDB`adwaita-qt-1.4.1/data/screenshots/widgets-highcontrastinverse.png000066400000000000000000013242141414271704400253000ustar00rootroot00000000000000PNG  IHDR DȑsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|U9$ @B 0#{Ql֍l+H*"(EQl){6 ;r}=Y'.ѸqNX0I_K',II\.qIkL\O;3*3qN>IZك'.똤Ov>Sy D_B2 n0jl6ocli ðQp5_.yN /// re\LӜR~ 1 a }||j;ZiUrpteeggs\%=y˚c+c#,,laCj׮d۽ r0 ð^޾|NH咜vi~~~u| B 0k2==}<= пk4MۅPtB%aaa +Cl*HegYOOO_Rt[9,,la jq!핗1==Cƍ%MmձPf9jKzBYR@eF#jY!0FN>C4iTPPVZ .ઓ{.++fv3$oF-Q ϿOL}f6 ì@L4m6J2ƍ0 #pT<0t$4mս0(Oa))h'\ φaĚa4  W$ȔTBQ}K)}ooJUݫKkV RPcPcPcPcPcPc ?\\#|>ո"թS'pïtλ̬ܸԲeK+==r,3d/С֭[+ @v]:x-[%KT1{MLL,ulV4h@kNAA]OYY:{NNʕ+`B9NIsύUz/i]׬YoӀ[ߨQC=䓲lV5stL'___?o8_ 6k׮ eλ;sutHby!>|DM6zD }_sMl@tnk\(?Yi pQr˯{PBJJ&Ns :{ E{ C;NMj}l=:|H|oߡ7|C6MH[}ѿ͛vn7o|It1푑ϩڰa~Gܪ_qN*7\:ugyWW_co޼-]<ܢEBCC=СC缼<-\HΝ;Y3e S~}$mݺX}U``9͛7#gj͚+14MW-[%ܹS6m*Qq;65kWV-KkUx͗_mմiSիWOǏWBžaҴmF]tQ``RSSxT˖-S~~%ԠAWӧeĊ+%I5T.]$I;wRhh#y UDDs}q۷ xн{ɿWڵJBŷIOXP#F_1 ]hӦMZ|oW}/y~+1>zX+00j `k.~yi^+5 }5jP&Y?OW˗ 7`###ݶ4HaH:ԢE IR``zeT݂{Qjj$UV>}-!!Awy۱vƎ#wr{v{nn܂-Y#oI-ZSO*$$ĭ?--]>S') m\DDu~OֈחK5rH :D:˫k7r*[ҸqcնmGۻ`@@Ǝ]/̘1S Gg~; 4PvɑfڒcJ{Q ߪ-I7n:|}} 7D0 92ΙAjIl2dd'L.:uO駟\N?bc{ CKӦަٳΟkAAAԵk}G[_Fگ:-Ժmvec۶mիٳv)á6mX[lѼyt}:] L JPqzQjժ[_y Y{Բeɹax ճgvoq999ڿv"""c|MZpnZs2?,՘1c%I֭׵t];wLӔ54M=h^ZYYْ-[۾sir\Zt8_{ի֟6 Cr~quի=fu+ _AAAV{UWMx0#M:E]tkժ%InX]:))Iv[@nmuоsSN۫JZZI,u{@@@oq͛7wk9s]-ݾ1`@ժU_bIԁԢE IR&ኈhU>ymV%)":ߞ>L6]7|]sDDs]w^^޺{q:\OX眜=ڱc$i*D(URi[x Pddlby忨gϞzSG?'N'OU=z\.,^!An휜\Ғ:u+Zv P~}kF>fzx\W-s#%%E{SQ`mƭrۭ…fm֭222ֱzr[yfnm۶W\ǹ;wrkwUVp+-Iׯ*#--MK.+u]JuA#F\+00@u)QA~IRll۽ٽ;sr)BCCݮIRRRɓ'o~EGn:wT"-Iɧ}jݻw[o^z^zָ%K0tѿr;H47Q`+2PCEVgV ~zi֬;wۗ*Q"ڷu\Zt;v[oM6QDDs+xy)sϽnsf͚nݺUz-b„4gj$)>~/^6o7|7{[ڷ[9Xulܸ DKu]ƍYmۦcǎ+4$u8gmѢE*|n+2I翰/ {RzUIMMդI/VhlZ>z)Ν+ed億_L'5[hڳgvܩvI[crrr|Q}(0$m& L7oq Dx z9TRi=(͘@ =7\ұ###ǏGܶ/ZX>UKG?}Iǫjzᅉ5kjժ%|Uqh߾}:xYǒ%;n7|UtjBƍz״gֶxeeeWɧ 2jfddSRRcR'&)uە3~ >>^v+55U۷O9NW^[ne޽r:r^s^|=`B+p8tյkk rI%Xխݯ)̥^EW{(,_>P999V;((H6ݪ {H~Rý9.=Oym۶Qpp޹sW1999n}8y^W5k֛֟MY֭[݂6!╸ڸqc}!vϞJ) g_\ C^^^0=3 kz%Sv{w߫^zYo79̽mb.Qٓ "88HC qSn]ly%zr[oɭw}wI%)_l0a|a j n 4MM0^Wtͥ! Lǎ_׭S? t]wKZbۗ{=zԭĉnC*$$DM6Bzti&{:v6 C^;\NJ{A{]wq4)Nm۶WO?L/pkժ^xa[Ö-[=o޼Dҥt.K-qWX<VӦ+6ƌyV[W_}EUllw=3j:]~~~9sܪgKҞ= ϷݻBUvm_vF*I_:uq^BB[pvښ15 8@ ϸͫ;X;Y{=׿nUgEDehUViӦS*3Iݺn!< y E;խ{uWBӧ抍 ֈז;wZr[ xկFZ޽{믿i4ujbt=ٳgsOWPŊ!!5|2t:q+KqqԲeKC V||͛U8wZJC .ѿt2ܼywQٳ\}Ϟ=7oFx>}zV%qn߾}շo2^Sff}u몺uJԩGyO8S9ҟJ/[@໗޽r*Syyyzᅉe'?\.^xaV\{]^|1Z?WHΝCw}Vlem;|J=Ν;uԦM ɓz+$_yyyz=mY>vNК5kJ̙5*;…4v+p+^ObXD z˖KV3fTdd"=n͕%-+00P uQ:uq6M#G^=oڴ9n2MSj}W%??_|_ܹsC馛d٬![芼gΜ+Lsύ'G3J IDATQfffδt7n޽~it?'[q}Jt:SOe:}:Y)))Y`֯ߠzj}rduZEs:81N?VXۓ}|H6l(s>;V|RSSamU;vÇU\$m޼YYYY%deei۶m6mnf-ZV{^sK?z윜ܹ˭o7o~krK:vjj7߸=7yyyھ}F~J񕞻jՏ:t|Om;wKT*IMM˵w>7Fiǎ*((322.۽=,)ƯZ˖-+u)SShmҊ+JܿA|=%KwܩKx322W_кu.霋+~vk޽Uo%9N%$PPJJ\5ahI2ŽI^ 4M5o\5RzzhvN]jh޼+<<\!!~9sV}zqq7Vj}Cj|x5))Ivŗʋ6nܨJ׆ /B%Iٳw_cǎ*((ÇuȑrJKKȗ-[T&JHHPbJ5MSE^z:p8X`i7o-[*99Y[ni)߿՞9 ͙AGzzq@4,::Z;vԜ3^WϞ=$;d0edd\p8ӱ15l6IҞ={uC _%IRvvzW\ ^ʆ%)**~пpsS};vLjҤd].>?ոJTv 6P!\uQKU" @͛7fS˖-K?/+CU:t[{մ5 hUWVhO 4M\ZnSRRD0wUjjFV$4uq=>֯__O\6lڛ6mIcߨ~\^\*j,j,j,j,j,j,{UJB4@4@4@4@4@4@4@4@4˔U݋Kir;wr֔T݋Kdw\ 8YvFսaaag].HHY݋8u0trVb\.W0|I F0 @R)I.+V. M @Mr1mzW6W+j,j,j,j,j,j,j,j,j,:& O^F23Ҕ|ɑJ-ݝ@7ԇϿ5{E"OS g*fנ'Ӎ %-<;Y\7m)ͺ!!\uvWΝܣ ˗h޷r+K175^G}{bwzʯbfi{w24Qg;!]ܢT^7KMUto4eu^c)Du37]I`N9s7kʔ:${u3d;pT>fzM^/mabګ*sY*DAtC3oliJ˿8Lc{kͷhp`5o\j%]{/}j;l~Seʩ3+kUz/ese(1XYӋ5mWP W/c9}@ejSh=;Nj-yFk6V?٭syqAm\OcG84|9j]e{9Z ѐȏ5;>gH$-N.lqeScWb?Oy:svTq޹|J>KWU>1w^A2ɹ(0l%0KW,:N;Wd -NݧkRf@pHQ Uj3}2;6Ӱz ddҾ+rIe{ 蠮1  ۣk6iOJn$C#6~ڹJMܭĴ_¯1JWFw+ZV[vCC#4&Wq9tF`ET0st^m\FSJ}<][#*Ĕ\;JDV ;[zx#Ccۍs\iJ&ϘR>{ˑX_ z=:0\>EvzmmJ7wtR= Y8]c^RM遧ҍBUlZ4%?j׍/Lד*'u˪Q;@tp=$ɩ䓧+U=4;bmi[u5&zkY[*PW|:E%ɕErn|"FFj^HZ NjuwߪqPDشfg^L5zI5{lK.~9:4-ܯWoRDtV[|T#ooaWo*hK;7j[OFY28O'3] sfOuMvKSY$ -I34['4~ߟ ]Eܠ{ԕ<%O*>?ܮt(| ZQg̕m¬%IԷ~ziohgn-Q_*G^$[ZTS o|I_|*葎hjrT`2࠾_CЩ<}'hK2Q"k4գ_{y.eV vѪ7)e;:Fm*w_v[Q6,p)vXJ]Z ?9eHfpGu]7S7u[4մKB oo12Uz}q+_\Eض^2\>oymW}T~QŅ]rw-,96մO5r&/7ϔ2Ω˖jWdWVWf}_ q%/V)S wWsAUihW^!q6K<$7Bj/)Ӹ0ִɔ#C<#<'B]tIr%)XEe\$oS>|d(|@\vr霭ضp_$_jdJ'"uZwͰ!jaF`O YG:t֟Ď9oҦ$Z5 S2wTL93en+:}i.aД j&ϡӫzYĹgː\;!ۻ[{\j]%Knڭz۳e=^&[jEdc$93k)b_ڎlrIF8$5K<[ i<[{wTЎ7j>RBe=~4<3Nin`:!ԩSZVb[;Q}a{3y ͐\夝љY-8"ti^V0ڣ<"+d ikBi^( T.m~No\u%9kɼͺ]7D ֐|ITpToU)qϪ-麵QQu>=ԹCݨ ۲آ ի};umrرZ$癭ڸ2·y:ZF;f_L '2((&CPznhE&K*^=]:gdS۔]ͱ~ D~ Uy*P.P߭O)H3L^)N^:_k~5xX;cf嚡< BUjjUqr})j=WkZwV_C;7jKKrMGL1]Zɾj:tn#RֶYeNwYo\:`HK{띹{+P@wfW* -I"$Ӻq.T* D+omeo[=}/=%+ʷP_+G}^S>%Zf쾽 2VEl (2;OZv?{dIBgK~LlD5Uy.U#az{-I$I$I$I$Iґ){,d!(>!UclqٝjW ϱ\0w7.Bb,\Ą`WZy%4e!6|17]:n ;Wc=5@,@ qхij{Yƃ ז%K|E,\#b̲M02 Bl8sw߃gzt~dr.vNELvu >bV'Lf.sGcL$d6ʐ$I$I$I$I$`y_ߗ vwqŧ;XTT O@@ɭS6Xd!16wk#+汆 Ćrٛ?;%NHDi1Աlęt廹qf%^\:L+,[Y1.٦,r6CmyVBL{m\X2\QyZZYQRX_;p![1 ylݵջn ;$/}:Fw|;oEQ)#gr;>gy}b5X 8 ;7)lfɏ~tHl[Rv/Syd4N^v7%Fo3StEgν?+Q{gʟ]˔?2c5̽714>QCbO&PrɚlR~2\$I$I$I$Iꗾ?O?Λg3?@ok@$KR5f,E ylC@W熿a?u\TOy3H6=᝷L]99:Psx|77:&QVɨS:XȮ<>x,udݽo=!WȰaJvͲcre01]z:O},[K7|F_16/[KSf(.`Θ"v<_-\5TJ?c>Ȝ}/2i2Y p$uQ S/3|eWu{6^IH IDAT֦VE匨)c(Yil%EnԷYaي̻hJbI$I$I$I$IdT|{7_ӆS4l S9P:PKKW?ndS|5MOʭ[g_;rMKǏ|2̼&DHy/}zctfn{W9JȲGX1^b N@v+o;*57ađ1Hc >Y;Sک],їkrZg6;?{nKLD2 $T|lz|]7p\5T3!a-}%~suởyq޻b;amïwk2Z$I$I$I$IcjkkTWW9§/FɈqL7ģ}kEQ2qpP&w偧ذ;K' @YlbeE:w~Xq _fE]n%I$I$I$I$I=&DK$I$I$I$I$I*Xf ]: )\kv2G]-Qqc݋+_@X<t:JF%C炥rh $k?=/ @՘hH$A>A;棣sǫ3J ~ۢy ^s!  3m\0zsGOd 4@7DLޯ5@w)g">c_4~r QtIW>l#k&\$}r7^> FԄ[~Rthlߖ|I&02lDӎ6铿?4zb_}+Z?$I$I$I$I$It.1!Z$I$I$I$I$IRT_̆c,%;$޷M`ys撥?IJG (ʍ=q C[ww[Oi{X #%$gg|Xn:_=T;Vߢry9k63/WG|opQh=Dۖ9I$I$I$I$Is*I$I$I$I$I$0 \Tsg*Jnؓ6?Fۚd'aw]CR$l )'C;C٧+;PB*]RXSD3b-..V]>Tt}==?;D貲R&sg=1ͦ(YڄhI$I$IR&pkB#~_"I$I$!Z$I$I$I (c\8)F$I$I0ԜOpl6{}rL(JuE78,!+ }@sKJΏ{+`XQvf$D2Z.w8;l.<y~1W*[?<. [Vp՘98EU}W$I$I$I$I$I` I$I$I$I$I$Ik3EuT_!7ǫ.ǞVtM v1[`k~u~:6DRRdx8ߩTO"%Gb{#JK璧h(. _rD$I$I$I$I$IN΀7DK$I$I$-dܩQNqu/ Y*lkq)IOǢ g2ndVv7enwy2gxjSD'Ynvlxf 6eM=ç-3_5[IOϢy30zEV65mJ^xbW`Z A{Wϳa_+J$I$Ic\6Z nQr~S{'{M}wЕN<;x_wU]BAft(I ET4?]7\y:('B'qbA.9:-r ҉d+]Tђ$I$ItJ'}Ϲu0==0`7χ騦;.E놝;xwo?ˮ#{cΡfH6ؽ'{Q%\'_L7|m?dǿGGinls+7DMan`$ɣ7FWӳ$?SWt9/|׍-:֐l:~OO Ú$I$IR1!Z$I$I$ӯ~[Ob.bTT3~.Z8Kg~C\Xlw+iO`k~8.~?LJIvk̅sn.[ٵJF0KTb>{x1R0bp4ox%/maOI{s)%y;JqեXzPAyO"?~切 &9{#wt9#U-{?xF$I$I Il $I$I$I:y1FMqϱt1Q:vaa}{xӸ8-㛟ffh:4䚷\ň;XĊBZ^{~tdꕯc1|fh1rsM O7=4ChZkvr afhûcLFI$I$p xBt:A\6JrN|Ío\{|e<#]ьa `$qczuTs'{ZvP=t Qbtcc\,rX. :͏\/]@y.zghƾ1I$I$I:߷LE/~Bݫ=5 !W]@qc|qejJ^yEΓ-K54gg1b&%aSOfw_>ρ+g CXԐ=qX}d_$I$IT`!Z$I$I$Q~b6}~:,@[qCaWtwF }G$I$ItJaHVNfo={+j'Ok{d* l?~`=?b#ꍗ24e]_ zhjNVghoHiFƨSML$I$IF H$I$IBj_{K1 X0=Lo`.Bbx8xl ȰWcsϦ7 鍼.j"OI$I$>!:l\44vuarGNta6IH)'^Bt:?9lmM =+(9x|rixq qfr˟:㔷0t JPQ%E'J&k} thqMH%d莰t}gfWDI$I$I9sNfaT,A"N+:u3:0EWW^5ێZ76&uèޥфxit1on|~sRrΜx@زr,jmf˚z2R[ǎ%I$I>cB$I$I$I* %d6jM YbԾ}zAr7dc;ccws-z7:A(.,zGM{_,⨴2.ַ_~c ߺoe9T%I$IS7 A`g*J n=mKxZ8%c.`7wM}p(9KJ'N>['O$ʻ-wɬyWLм=J0'D^a rGءQsf(C*T3p(Q8/eGn%Q_8 ^#ػdq$I$I$G_mw#o6ֲnNHT0 ZUDmaw7{_ȏ>WudlbM:&QV S:~8%?~`3rG2N3f:M,:FfSڻ &ƻ5_+k#NyxϚBuQ?C<ЛI$I$Io%I$I$IN_pQ6Qfi;~G:rC`{>r'>}x%ٻ эLgկPvǣ{媗??+H?wW_Ko%[A,7%6^;[ߘoo|QU//O?d-]V I ^k:::[%CZ0*e^V=p|ELha{ @&xS ?8uOt(-ҫ:%I$I$I$I$I5gV׭$I$I$I$I$I$~O9 ʼnΓQ$I$I$I$I$-I$I$I$I$I$`-I$I$ILOГ$I$I;{{cC$I$I$I3 r%$I$I Ycgg !Z$I$I$fI$I$I,q߾}'\ֆhI$I$IgvAR^^>H$I$I*@!۷o?6DK$I$I>ACC3f̰)Z$I$I))//gƌ444yu]$I$I$I:444PZZJUUͣFp˓$I$It 2`NĆhI$I$Iԧ0dS[[{$I$I$H444p 6DK$I$I>!455QSSCee%A0إI$I$I:ÄaHgg'ctvv6DK$I$I~M I$I$Ig` I$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$IˆhI$I$I$I$I$I+1H$I$I$I$I:s}3$I9_ikB$I$I$I$IM$IR蒒ƎI&}=$I$ !477}v:;;u{%%%0l0JJJ_'1П7$I$I:)ђ$Lg A0ydFWCJ$I`APZZJii)G0R[[ktI$I$Iђ$\ICt̟?ݻm۶S$I W\q7nJ֐!C=z4ƍAiӨ`Νؒ O~H$I$e2.7kL֬ym+x>4̗=?>O'O|;vRI$I:G׳g&OLUUصTUUA]]mmm >OƖTxF$I$I$I %%%5 ڼys$IBw.aQWWٳ^YRRBmm-fh87CF$I$I$I-Ǝ{;vv8I$IRjkkcΝA@MMMǫ!vyZ?o$I$I$ITzT={uA$Iµ{n*++{=ְaú)II$I$I$^7D'Iob$I$I^URRmLI:\_~H$I$I$!:$I$0 cȏ)II$I$I$>k jI$I$I$I$I$I-1H$I?[OI$I$I$IYB$I$I$I$I$I$ 4%I$I$It `hi IteOfEC,/!tdNN!U Mfh>_$I$IΆhI$I$I$bO"8ra[KxmNP1~sgM4-;xuh; &[yCISj/m9çX˓O6$I$ItƲ!Z$I$I$Iň!:pE y A20N6r*S^3Exi ln9)1.qŤmպ&:<}]]KXP&ϝBEW6|2!Ԓ$I IYECPȦStgv`wXtS _c?rAQ0j,?bsƗl>$I;ŵ\|eLrd3aYi;MI2~*Zy 7hT_oGC%l$I$I$IRS: &Ncf:2Z'Fy葦48ַY4?;Lީ{/nɦ4-* M)*"H J""ґinle̽?dvwv-y<9s枙ɽ|{2bQMD(4u@iwIHD&Zt?AD{wh5Sei<B!I30)OJڏYdž#ʋwAFIdzICKN!160 Uuu`k}zCRr"qXM͋FsC ~hƱf|>l6ۘ9Ch,II Fb6{8[kh=عHI ^tʹ8J =!Px-8@]XֱB1IlR0DCTDVلQy\8m48C =UuE[CnTK#ªmojo d&nQ:lU6@An$,.X"C-?:j[gnF aKGs tEB!B!oM4 &ShB)fǤZΣ!4~?͸79c}ZQ]ZHaY#~  \AniӅJ!Vw6K&)!JZ$[[KB3ɍQq/YVB! K&S&F;z VieLVq mH͘˜)D Is5QcvVcIT̛x}W`lhV+K3fhDzeǤ1wӣ1=Fhs?q2g00ܛ-o?}.fzSY 3W4%'hNUb%^D ['G{n6m־pigs^~-o1;XeЃsW*7ڮ1»]Al~yN\] K,Ia(vWk*S1kQTj !B0#;֨h0`I:lf%Y%8rCJF}>],^: LfD,$T[[˲eY222HIIQ;558pe˖S[[; Bh|Oi{&+V1LY2uEDazcJܥNK?hr׳3d.U !e"Nk{}VYS{W0Dh"Orjp31$ E}*?Mr=,NX#B!B+t7Fʎ( jdF8q{4p#Q_>&,PB0rFwt?^ Ɍq{Ҵ2v)F[FzM#.-Us^_F*5D$[|4nEl&NH'1*ROmB!$脸>$G~GTn9셋luJq 1Ҫc^_spєܳ!$Ć3էXHSZfUw1E_p$SYYEGGǠ '==Zjjj@Ԙ,hmjݭc ".&1"r\ۇb=w5mQv:)NwRQ93J(gOfgV\iliR3H 朔UuV,QV#h1*w,XI>-ز/hy= yOQ޽5zDf]qHS9f-#qPx btAc_!vuT8̲B!Bq,u`_yp9:!.:`hQ3CqNξw5MCOЋ痆LIAk)pk N'mMM#OX6Pvˎ !BCZG4o&N夬ޕi-E\]['rƹ 뾗JTIL>;Zu@!jl"{Q?C1YtD{dϞB4԰K 55={JۃIMM=d4^S:/Xz5@v~T،@t[XZCd{Beqh.( ;YQ:@zǔVVbs9J(g|E9Mi{Q.XwUeŧs[8%L:xUV 1iKg^>jT*)a4uW61cv} -u' SB΋N18}&J>b518}d%9~%.gmE q @q8q>B^slox2- wP%-o`US"~{]ǡvB!B8;W<;Ryy\6VgZo`"!tt+E+N˼:᛭ cöj o3Q[MǿEMbu&O PKۀVReT)fUjmB =Y0i槶`-\c䪡쀝IQ f;NTˆWfSӝl;]T(i\[f|кc`q(cx6CmdʏXu pU.y2Ww]WFюͬsv7/KY39`d`,3[=::^ӵtfkr/{vmc5l.kȌi̜߻|x !B!XSTf3`ՏQ$eMԋ7wÀbl6cSɌNT|:ysot3/հm"Z:;z' q<}r j*nP bN!bP:vDb%Ī@O Zb Vbvg.(eM%'Z=-gnjl e/{],>led!=6d>*$-B1L~s( 3ˣֻ ھ guZ:I=S*V{.PIUjj*f qY1qPQ CjLqg5Kʐ8 мJnwNJ)&L'@Go+拒| Qy!6`%9gI&jbj9DZ*[p= 9ur1Vܫs qNcQnWu?#qѨc fdf` js9m!!I ՈdX5[ ':>I3Y\ϾNA,Ibd6aXmFDL"iٓ9w=o>g&B!tX5 ` %si\|L!yjU|u4| ~/^t2Tq=x][+*ٌyy<.'nMWPf!VL/{[yzU`!"aθΝLtn~NJx>L RQ0LywN+M&͋PFxzǍɌbp[1fՇG;nτ8aՁ@Rs zXCoWef7>[ax¨>sCV_2ߊKީUXB#Obd&F3I=~%ƌm|y⧨aD'7d^V$3.2ycZB!B;0 V}1V򯾊yJ-4zЍ$&Ey谵8ZcH#X1&ijn=j"<&:*=bvn\u0%/墓Jц} [HR)f0q4Ц{^WBLr<&Qx:{ۨD+ĥ՟uҊh!:d&/{L$X]؊HQk$h! cRؑ[Bt.d77AyADDwCN}Bƞ&ZDbpC)i9o&!܄mHf&O&anjցIE+k L!b4l (zAZGp~}O u90p]@ qHo(:/o55G% lX4-ȼ EQFόAf?d&si~G#5-=sJD"VF}kD21T;#!;!DM^YXIzK[=تo_3֭xΙ3~z4N~Lwe]jb,8*ٷKh'W/@y7[/ 74%w=@]xnԅB!T,v{6 \!f& ,@bLh8[Pl3l΀  C'|\8$20+xm4d&6:栩5.a~^ tP[^k)nn@i$z.>k&1Bzf<ʀඉ؜dgasX4##:ZpiVR#?i*I8Y hCwT݄7s'GgxLa؛i l-S0.!LU&> IDU$ hsX@hwC/vh?ڝB)5,lt{ ն7hs:gI"=TC}U6[7OdJex(CBP!JU<ݲ$B1T{ Ǭ">*zRL{𯔐"LPקAx1 vѵ^'CD %"w to:Dv 89d-1'Mqgy Qi)?Ęknͼl;kܳM8J}(p5CإG83#!gn6Qd21W:ky*BX@*YgyL)+esJXΝJVR48h-g] ^K3x 8(ot% 2;7pEKn6Dm(cdSgOg"رyj]>2E2LJo ֮MهApKʟ:x.bk8rZJ+(ecb xlMdd&EaiillwTa,&inOvB!LDD,˘vyߍI[HsSV?iXT(<k6-/2nE/N\GƒU"5[~Ds""lypjJ`% ;?!qc2 ~ngJ :^u9?Q%A' "K3U\x_ihκE | .}/O .g\^$nV" xhiEU{..fYG)u 6_Σ9B!ԓ8@Um힀IxLdxh 3K6%UIHx63*~St63bQ@kKijSQ_DLL\***bRIS]M4}B!^ "3?\b!c,p}8jIyʦr:Zc0$JGGLj~;GkON}l"v-O c\VbVzHP Chu{號T?5t;/VPc4N >h k^※5R,ᄙFr?- L$ďioSIPP4e<9C1\p-;,cz>iXɅ8:N@4ֿ>χK+ FƝw!^~:k?;'> ާ_+5K~)ܺiw]NM uU~a.WfaT[)~Y~T R|k`!^tlC)qW湟?/9< kO±N&Οb W<]6zs\WL8o?D%n(,Wӿ(qOycPO'_}| ;wIZ!Bq<$...މ#Flm5i?F?׵(x+V~~Q$f2uLƇG 0`LX681'LsɈ~G^Xzќ 623霳1v vJWϻ1$.}La`ۿ.]+ytrh-Z={)v8l_KGd2kY͘s-aA&T !B 4ǥ1 ˉůb^ѽʾ`keb0]G3?',J̥ŁAlL&tO# Jr_!<{*yndOxe&1mtL{jqbȚM⣩&Ie!BS S,g]BJ*ilsÈ%,T2gP~[4ZhKbb&c̴fG?F"}*Ju+u;{TsRJ3C3ϜK/Ci3N^R e_J;(04*J팟ޓ}R, LPRӎWT IL4h8:ä%*QiD0s2 rCRJ[06 fv|ʶjGJlj9&11ƚWW&{7C2 =uVag;ȮciIq D7F.z"jlXx㬄M'0TW Z%wٜ5+g2W(r{x3_ƚw6މ91ΚGfD.(BDd3kFƦ"nAɾzlN?Tx*w~C|a 'z3+>D rӸQ3j?qz3-ۈńҙsR /W/§__˔pLPxfJDbsOat† $.G~uB~4wy!B!P~vڑ0qg]z\x"@WrlԤ%|sI'~W6fSBIˊ-촁/ ;_u1o]5+&5& ph!2!^nje/=c8eϧ$QO K<&sOcJBÚy :^oWNS x_Zλ1n;=߾[|+ _8B!h-L0L;hl5+)>«]YiDY"Ovm/JHS&`pUqm=I䧍cq]OqVT c+w!Bџs??B9Z&љS9e[Xyc{ (!tޥp*fC)1/[PPQxV0'Le7&voAC3p2ƎjꂍeIn@=gׅ˫cX1ZپjDo5۶U0 ӡ멣OFry\ljH=Z;>/!{$zrfw)F[c"=^pch 37M?q jNYYU&U [^JvZ"%Y(]W~.ճ[}~esŃ<9Dϼ /пؾǶ|W) X|_obNx>^:Zعr%!K15!`xŀ%$l-uB',^,_Ɏ콏j:h tIS))L>\F"&,BL)"Ɍ躋mNKKM,YCTϛĀ5:ٳ`1C5V-7y}R4C>+kϞ8!+jhs|B.JFEy<^@@wPC<]1ser_WS&/}XJdD aΞFĩgNFr pݾ?=~eoh?jZS>P1B͇zᵜhUuo4LѡSc8Oglha?IZ!B OQQ=[n;vcx;ܟr-xo|U UtMӺyhgɹ٘=N:ZhFN/Z1wQ *)i$ot|.;v{7^MGG!4d.\0=Oچ;@QpB ok;u=}\1ű=!Xᱷ@mu7>0tܴ7Q]YIUM=-C8p-!<*j$ -B1{ ^U@imN475l*>)_.oJE##=lZ6}^3ȉbo|:|N+wY] [JX;,(11<7sgg>`<5yi>XNAZ)o/zގF*Kve5Gm1&G;_S!J'qj9-;8*N рUIKd6M0;LUBw6yg5MYKɮ2|$cJJ!eؽmxⳳR445ya@.X4Vφ-`Ij<30+0&ͩrdL vͿ #nV1GL̞,{N^vB!(..~wvJah }Z)k}Φ{iqu%>dLn_xtB(tbˆǯ+z_יIt }t%$n?ӱ: vR<`amExTB|_k8B!B!B%>-+@5EDAභaki1輖[(M\l$aV܄9`ܾ8b° (&paK{}.5!B@Ht,1ᄘUtAFǀQ'O5g'R>ת*7 K .ŠAbom+tQ_~ѱuT`^ Vbc lFo{wH>sz+yhSW/ Beña1Y9^RTIG {%Źr4E/4 i\4B(F1 `pݗ6o_?r53NìӘ21(kϼ{xVnxzXLqj Ly8=XWso#^-u|Z^ wW׆ڴB!B!B!" 61!f(kYԴQE|QQPnJ8 nߙ%ܳr;ZK\"!wxmSQQ+ za`g aYW0(#Q]T>39?|knB!Ǿ`h C)]U cCMCS(8&YEߺ"t/q5p4v;kJ"I* Oǣ_kNJH~WZ+mm~tLb qyi39ѣPV B!B!B!bp$ ŒQ 6vimnExDwh6vy\8Uw?7W@TlkC|$W9y)[jzUku>[ %3mMTRF(w37['rOq x !BqEn CYin.3:mNL';/=unՎ˧~fe$>| eoĮTsr2 IDATDƆhsb#4g"u^Szvz=v<+mw$UsjA TW9L7`sz[f/SMfKyB!B!B!By*~}pwߦXZF6DC3jG6d(+m@AE;W V39-3=TcdLBRFc+S>HE}wN@Eǽ}WXZpt.G¾ /ڐK)H Wή=.7{.t`O%v-{E~ ?5ڦZ!B-H_Ł* L;yחSadP>Jw?D|:qvLF {e:(q~r1}/=_卋mASo++=SɛKᄡםO:&uWϊw6sm 3X#4x xꚻyI|z=.ijǯ頻Yj/hMxQ&gq#p;Vք?23'oQ}~A^+c18B!B!B!B| h}M.O^ϼ`5?=g2鲇=l۹6%3mB{!zCgǻ}#ܱyغe5. 33/Sj*+;>P3&Urks{W_Y$G`4)(+h5o[nϷN!~lt~V_ýB!B!B!R9сtMqckro)oaݧk^ p5 E?GW/fbDٽثmŲ?w1_ը~>nnXDVTsgu=G_dߒ?pi,m?32|&j <迉W5 N[K#{).ʦ5~w#A{3z)QY\h}|{q?MdON~ea4#B!C-ohµC'8>XBqP_]{m!ĒCC0FR|,1Qa}vZjQZ^M[?_?ꥭ,z8mBw?&?!hFGm+ik )C"[= q9/jhhBXSY#Ԛu']m=WsC%;GцibTYB!B!B!B! 1cDZE"!ėz; B!B!B!B!B!#%B!B!B!B!CVTT| x[d<-2B|yHh!B!B!B!B!7{,fϞu!BB!B!B!B!B!- D !wQ_I# bm0Yc,Ifko&M{o~/iIIm6IӤI&u0K Z2g! ӏyt|93}>_iKhiKhi1X5CxDT!ZDDDDDDDDDDDDDDDDDDDDD-U/a9Ix$,;^Nk 4, ""2se-m2"""""""""""""""""2B C9YAfqN7""""""""23ER'WK#OU`d,?@{vEDDp)n*B3T1x^.u!Ĝ x^ Yd mmmtvvDt)2L< l NXYqXYԲ,Omm-%%%A """""2U-Z4CTN˲hnn9Ae˲'PYYIAA*E`FDDDDDDDDf.cF-[Ys#,3Ry2}Z"vЫLk bC >?3)թg[XIMU)~h?]->E$~ڷ9Ox+Оv/%0/3C<K,ɓ0{l^/N͖.DDDDDDnxXl00Gnݲ,Ξ=Kgg'5558!2S]S0k?^;LJ uG9SțZ/$g~'뇹!⬶\dUQ9ҁհ6rV3z@ =~c>W,bժ*Rx&}`]U~w e}9rl7+""""""3\4رcS= Z4+/JYQʳ_>5cQe^Zi'7?ȊofȐ]|β7VXoBaϩdŃ]/?_N"7 ,Fm ?+/n??8)5<!5Ǡ/ز?oY7Xv=Ͼ}@;^~ іGa l|$9}Ct D̕l1bny%6o[O'i&H*31RjX!c!nä8𓅟C ذ۟WOugroywY7X#|Sk{$Ӝqާmt"rC&qzi:;z D 9urڈ'6nƓvz s-<3OSn g^C9!r1p;Y=vo˅mTfKUsܿZLt4c0r߱s8z1~ux 5س [mT?CkwA'Žo\ W?E|=lY,äzi:z~IuܹfUNMEv7-[wdnaV8G4ݰlVk>F{EEDDDDDDDDDDDDDDDDdKkY)_|[{y˶hVzʌ?W9vv*Zؤ%Wǚ-wSb:4O'?Z]l_<֒>ko+k.̅,R'?߽F>]'{=z0njY(_wC_F5Y?G6<ß{н>A^gwo}#|=)rى Ό09w}o 2(-"""""""""""""""""3WfW>p+> FӇ q;i?4?|DŨe1yec>6kO=KS ~EER ZDDDDDDDDDDDDnƁ'7\c ~%7T>[;brI¡_DDDDիWe}^}4{SQwnͦe7_Z1_ܴ׷݋e) -p{ +kL<'_"t[(.v8mmvj{={~Ƈ5g1?n[|ts9O}O|ON >?uvvL47g6q eVzϏy?'׿õge2x)c3;/+r,2(-""""""""""""WgÆ:YSx0f-dj <[ Ν'h g=Y\ՄDg@SIm{Akn#8[vLDDDD5>|2sK+z'7N7R-]j5iێƓ` :]B2)leܻe5c/v\<׉{=峸rux]?Ƅ~w-Vf#[ ],G/~{T-|]ŗ*vc;;w8 6BwN5ĩ8* `?>o|drۿģ C$x?}EU*ncgסtE?EDDDDDDDDDDDl6$,!. ƺA}aRrgM~;pz`|(MX^fç:b֊ r]:<3轱Wrv1urnpwU]K?B[w/~;{9z'k#\X6G_gy{)A|mÙZ~:ӝ$8~!pSjB fb௞t,5_ȹ-S>a""4QE{cpi:'qr^*ljLkm - $ ׃!Q.W^DDDDDDDDDDDD $uݝ!mx5k47R:9PW}g܅E,g97*k;K{lywha997""""2Xcn/he_8y-hރem;Mf2_][KwI|&l9۲`ƬE<*JY# fT&/@.@ ˉk4`Pˢ|&l2A"*AsM IDATaUSh2`` 1Y᥌E䏚JFc]2Ko'-\?`c,^??Y&(쫭lW^-M/ 3-)x=\–jK[!%[69EnJJv7nbˊLk,-(8Ð+K4c-9y~z3AR` bs5t G"aRI/Vv5d|h[sԒ 70""""2LJoN/㾏o=^h&ar{.6%i5O|bS.6ofΑ#yڜ KWaטv%˙oy'x{gc6wO';&xNF0i(-""""""""& bۧz("3FeSZdlC%bv\{cO[c+GK!5td1~b()fx=wNt9TFilfZ9ޛ̩6:}3FCZYDDDDޘ^ke~g5{%Ooe-103Ksg?eosd_|Xx[ r]9=vV߯'<~e< cVz jSc c- =q0{~~cnX%acGp6t7eZl#OC}?m|)9]h+rf%}"OahO9hs.J[V2JO4/Jʣrml%3S\N3rCe[CC$-8p:Gm5sX [ Wr.wpH 1x*XG#GIdQM7#_ŻyZ.&H$V#7Ԟ3,i,?sO {R`+-X^^OiU?ۘU ^ȭ9?V6^&?|_,KG ͯ]ҫk;K"_M9vGpzSvgɞr(..&//C_\ܬ,"300@gg'xdr(**"''˅17m"2dߜ0SZdj\^{ wSt̫dʥ;/eUm *m>ڧR/KJlas:a7 Xwx/oսH2k-,-wԏs۹0+]ޠ,zwoOF#fE,6_+ͣҀ{|Ԋr,] rCڷ***Xi1ۍ& A{{{v*매bkP~#"""WNJhnMDY¾Vfy̙MY__]]] hrJDDDDDf˗p)0xϧ^Μ9@c f"AOOhT"3dߤSUUuD$vMDfcش0؋/qBE3;k6sKkm;C*VT"0lc ,~Vw'QŠ{R6^ka :\Pyng}g?{Ϗ>(drիطլF5DJŘ /ϻn,+asS2\A-]DuCGh+<Veά |.R~z;Zh?M(El{G.G}h,Unoo' Mҥ""""""25,"D@ @4=+}455ҮL/~#"""ד`_?IFXx1n/ph+J$z7q{8c S69q.6R]mzZko*XA49MeNJbS2+;2>Qo;S=E*JW!MHD K\.`C) -"""""2Äa6].ׅJ Cy&lU:+iWd*L1 g-.b8l!/'S"ڐP?}WT6JbpX<998Ewld?9lIxm1)/jV"""'Bе6'""""""T8c EEE^QQ:::1~I(R(Zd-)-2\!Gs/6P)P\#m ٖOq $C]_QZcp/R$SԬ.""""(#C`1`# ߩEDDZOEDDDDDfɹηsm'7b1Z[[["^%'z"e65 `c`+-=))0q$fS3`ionJfEYR!}CM.jư0^lXqb+B-""""ӗ Q 4CKxj6`'T8DV, 8.|m1Fp\6η)"2Z6oDDDJYzjV7d\/dK(q ϝhw|x3 LN-+W_hgV.m H}ġm-o)9=\^XA VwR&%'|ZJVT$De/&'%-""r d),k80`LEߐmoSDdl߈ȵ0)d>)Xq8F4c(>'|nGά]2Pw+`+ɑWIi`ܘrj2'`p_Fxg{:JWsws~ +kXf('Ԁ")""""3E1@=JOK$"a9N3'i.VDDDL""""""""""""2XڻSps{ݸ].6d<@_/I8'_ubq}&҂vGCqf;&h yqXqCFJfbWTCDDD""""""""""""rRf]P9\-! \eg""""""""rCMDDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""2m)-"""""""""""""""""""""Ӗ"""""""""""""""""""""2m)-"""""""""""""""""""""Ӗ"""""""""""""""""""""2m)-"""""""""""""""""""""Ӗ"""""""""""""""""""""2m)-"""""""""""""""""""""Ӗ"""""""""""""""""""""2m)-"""""""""""""""""""""Ӗc """""""Ә `ͱ= XS=&Qxgnb&B/r85y-"""""rcw&+ 駻h 9#qSTJY>8kSe&F+I"e7Ĺ'9~4u:kp$No,ӎruBb\o᧰R3@5'EDDDDDnnO q<T[yz{|M` ͎ݖnÅǗGal.msSwPapޜ\As~i~W:Y."""""%vWZF@./,Z2/n0ns{؅́۟OE,+-g]k6^LL? D܈zur{r';PV M8"飧7:];Hsͼee!6l*_ SDDDDDDDDDDDDDn( DLݮinnjr9ذYKr1JmLq( &E Փ9N HWBey196Cj(FdvC YiӉj rpNϴZIBNӳANC/bÛ_H =29 |8H0&+ S@8}]=$}AR\b8+E%/ 3e♎!tlEDDDDDDDDDDDDi6+*()4 F(x?;@ieEy>DfZd+>zj*x6%4fюY C^Ν9MKߕV28ʨ*!Š~3m}/7[LeE)9nсZZHpٻ (ϋÊ1ƙ3 \Aձ7t~~"+ӄC0+?\#.PtfZ3K_WS]a|cw`EpO UF0׃z}|Lޏp ݡAnp""""Vnn.'pYi//uVڒɖ؍gJny]̶Ǩt&ݙ7NZ[?į~2F\9XtnSӤ"~f ifp,e[εg۞ƁKPbYQ{C+3%J{~ledϏ΁^ Ls?Ěb^nj=D;&[SC8xr6Pݘ9xwe/bc,+ͩWP;dm,!VCޟdk[fzm>*cݲ]iffSqzlbRo`ᦍ,/7AvBЮx pCQj8/8]+*G*^h:Iǒ{c?z3%&ѧю ;ѣ|KP0ѣG4:\yid /g]:ș^"q RR^Nf ݉={Qbutv1s* Y.{Ł)&`R}wd87Vc R=LmO^z,"'9v,@Ql<:McGtXRt_`1nJm'Or6r(Ke9m&{'^i4}zlEDDDDDDDDtp`LWͲ,H\iqE2w6$[9}8)RJ_mC[wa>v,bg8F_܎9˗rכ8ޛ~и+Y{55AOp/_L͜J"oZO/~֔Bϙ ȣRYkO՚Ì{*$}Í0wvޒl m4EY؉5TKQ!X9gK˓O3C*Yz "7כL-cY+Xy؞{΍ WyS}߶\ 6.CzܕkظCtxͣw>Ȧ$ 7I™[Luܱ%Or+}RJY}ml'EwsoM)pM-M9s)ut=:+3'@-"""2CE?ȟ_S; COs< }Se'lYXXQv玧6l{.^,:v`m/;@G}pR*froopcp8.́˗O,_X {9ܙo;i-$-;ќ}8]<>;ulgR1XV> :/O|u~ guOْ;l[C  ???!8NyyyۋeeȌ5Mц 1' 3418nѸat] 򱓤.w|}C8<԰hڇ饬M߉yb{#yr-޻`^rmg8idz;1 ۟Á^v/oS˛YZyU uSOB˅yZoļB޹}ԁla 7/!6lW:/$`&v ֳ.=5@ΧyX^`XZXۗpIc@#;~ǺG1nٲEn*, X1ϱnzO;NriQc^`sߑn"CR9=?7g[ber3֓4%B=& `%\Ċᕗ ${Z)+'LSekkҷ;sD{t@[99%{9}%0ח˼o9k!VDDDDDDDDD1P\\ FIRY*clx<<\.:::FrpTlY)N ޲v_⽴ ,πw"ֺ:Hβ,*pHN1& 0ug%K:: =ˁdGI9E8]6anRsSu5%a92;FH66; P0T7)vg[`>F7o3vvP|#k+`c;ivtxLhe,Y^Xqah+žmӝ{dz~߹ml M,(_UlMHus9|&br0$h9@4rRt,#~嫸of6ܶ7wY>` Xt򳭐:@cڀv)%gSPx<~"5Ҥ3y 0ђ-6 * v'HTp ,,z6\*I&000Ѕ@t6oT!!Lϟ ""2M@*+Ci+8.n8N{5cSt8N[09TV=$ IDAT(ViM?\9+S}ihY B,0r=f'-OКV' 5Cj/eUN?;<wUߩz%u!r )+9I灗x9e `znY5UnLv0nV\C@cT,?eei'ͭp 4[ A56y׳qlEDDDDDDDDd 4ˋ0tl?c]TXxPXX~ydq_lf1` 4Rǚ/YT2|bdUWgA,m ?Ozqv?V+!:8(q ƍە~vlEDDDDDDDDf\1D"I C744D$K(1,E طa"W#2̣%:=8 $n%$35qdjMX`Y0䤕 h(Ѩ^ |Q|6'`]n7Kѱh#Ģ ,r60`>W똵 '~mT6x^G\~q>]QVI։0}lgW9˖Vp~[y%lgjJ=+pHR]'8޹%/P=d NtMG"""""!](Za— N H2~C8`QXYˢ++r\t+ĮD"a1>>œA!0:8 ߊg Nxȅ"""""""""2)Kɩ+Iwc3 %D"@>8@ :$A(OQbYU1.|^'d Fё[htxsA2];< h4ܯNv9=8v^6x'm}yhE##@l1:NĔ=qׁGñfVT=-v2$h9v>͑(Cр3 nqBN r0]Mq(+ôuO_ob ?6Os[/ē)}Tt95IC}jK)@O$~NJ x7~쉈LMUu}gql1ٻ8㯙nn+iPzqȩRTTQ9,BU@nP-?D@G6m6GN6f7#M6I4'+X{*ųs}A1u#2 C1R EDDDDDDDD DfyW\Lf @3>%V!h ج:7S]͑@ġDmT6{a̹2.9Cw`.aˊyŗxgKMIIdO{ӯ82l񌚒{#eύ"@']L>1|xQl"Ƒ`v7C3"<@dQD`yK(,?*lb؄L"ng܄4MauˌdgоE0V{a;Nbެy+x@N>^Gc5tNi@.vp2,$#l;p:nabѴ+=]A/'g999 V#{9|3Gt9wČbSI49L3Ǒ a1nJUeCLl`s %+,ȘDΙaDž.ٳ& 1̘^ eg/`Rt5-5uFʘ$ۃ-55MXcty pjft;m:}:i_͖ͻ`+@@ 4B9W?-etMTEJma8 ?Vl ;Q r*}`s3 ) Fխw0q.Fb`ќu|s3Ly:$:* ?56s1|VY8Ҧs&_Sľc!siLdV*[%iZʖ˰S?3-l-@#ܽgJmII$OOvk{;PŖ5;u"'q+>i!D'#sL5VRGc {/mB~*s0adjّ["""""2Yn[13:"1}rmHђϺLL<(k8zR6O:ZkiaٜD'Ģh-2Qϙ* gj5} U>cÞ:E¤sxx%5'nֳmҲzvn+SLN X@O_|*sS9f:IaØ}0N XXZ/'14F9+ TNym 3xl@M'K\Ϭc bxj`53Oԫ+ɯߛ{2\$OO~ K9 @4R ̩M'P_YAK"26('V2vU_9kRpţ*g#<.L,Uӂ}A~a5Qıٜ{HK+FJu,xE_e|xsGF0L.QMYE=F(ĺLO} Vlo&vvZc֗.fLY)UM~BHKa@+rh8.Κ8Yl](_ 3-)IfPwWq֌!e&XSIM6l8C!" n/myl/LBz{Yte.y>BDDDDD=O!kLF; OH'< @sf/_OsdV~;KXd-"""""""""DzY0i #}!C D1W\GM?֢99o73g8RERCՎ5XKM4e\=FO-ܸ59xJ~leiJAh.ӏRlgS3:{2> va$De2^pM@5[qLz#LH'2f(0փÿX~t7S#GqAwWȠ(4VNJYHBt|4VPQigA]GoBDta:C0>Zܵ4t0P<2Բj3pMd!7"H\v*5/>se\;|΂,<X6V~^Z+kl_A|b{xhkнmEDDDDDDDDDxbcd |؝<}`޾nƎyCtU,xNޫ&c23JFCOdb|;IjZ*F{bgbSDIn Ic13;Ը0LO=[X3OXQ_>禚F>}]^7n8ԄFSpjC4UyǬ/r}G,0qPRb#=nZVGLN|_csֲjcu>JZ;Mi+N8'3fhv/UT~m- I3KSI&iӦ^1 #>&VZ>[Z82]$&6S_YI0DL'Q D8[mxܵTU7=մjC]-4hv@7 4;M a-L-""""=6ydX:͛{No@[㍈߾ŋNc٭[W;R#F_!9"d~~~CG67<(_K5-_[>7 d<l˸J[9my)O<'vo 'T?q6G\01{w>w4ѻvT#hC̺% ץ\;8l*VmYKA7Ғ:i'ur%LO9 OXxzUվqUO3iz{#o|wtp_|Yc&2޹N),Zh/>+++Ka@U,ƪ#Ϗ=u}ҩPW{+JCe1 =@5ͼ-= +ddbbѰ+bEDDDDDDDDDDDDDDDze D $3dJȶY|!ZOTI{]ܾ">~e*3stlRVN+*Qo]*=S"lt 1d%ü5 'yU1/0+c$g^ p'~ |w K#{iLI%wq[ɷ]f,cO$*elݱ:dC|~UmtԳn;d;U;+)k%4} Κ˨|wZ~a{(:0W߈;paXo^չ{ Je䤙:-W6H04-2D"3۷U|NtRto鯊"f62t:Vr8ij9|)]W:̍Տ=7E3 ƟyJV<~=/| W_䚋^b3s HC˶Oc?GKÆpM?f_nGp}.3~v+p7~{ {O BS'3!LbGMer73,ֳ^o"""""""""""""""""A\BX5TVV{+:q a/$".°X߲Sn^aޭ `4⍾O?*dJ7~ww[M[X  ʔvbunpo]ƒf85o]f1K_cV_S][r?3 }E|sn,cwrAaui)ڝnשBq f$&9@Kz)7 """""""""""""""rQEg  ˋ{qPֽAY#$> D} MW;eLe󅯥:)anS_tG?!P7W6P?IdRL( umm7l$Pк%3Ya»<ݲ"7v~^RDtl76ZVV"IhJqR_Ni[ah>bYS*ǂE5BqAYe#gHχB.'#0lknBy[riR ucD r}ԩ҃qw)FPW9H8 .8>'dhR aN6hncna"*܀jҶ Fd؀e[Q֜c I^ D223zr)-r\h,e[wCDDDDDDDDDDDDDDDDDzEmu- 0bHL+Ĉ'1~o ʚDEodAIt @QCn:^00C̾>d,&`4P[]mpƒ[*H.hu8̈("{'QF;*j*/r D) w.a e̸aؖn?>q6[}=&˚&\umin?źMd,ԱxŏRGJҁ}!haj%oY;ibpdHP ZDDDDDDDDDDDDdr\0z<˲x{ ?d" >/ Zwl%cRMFBR േ~T׶;FR I4jhcз 0 BVV)))* -""O 442dޗENd m|㴸CWa%W&i5_5|r397 KƆ&7n B(bMhNZqY`%& L'G}+i|Ѽ܃4kc1 PrGsds  |̗t+FZXLJlg%ltSqLm>q 9&X-l\k0{lx'qɷN~ҵH_Q _DDDDDDDDDDDDdHOO'>>͛),,I+~bYMMMyf<񤧧w˲K@{DFOdD$Vu>7Q]ժgskɷlFI 4p:UP{%߸pYR a [ryܓH1y4Xʒgɪ z]U+sWrɹ'3:ELbձc;xeuAպ{—,ƭ\iq9LXv/>Ow 04Tvhyg(}}]t)j LOciL9+XQahuFzzz @bbb40i$6mԋx&O c;l޼G|SD>Oo7""""EVVlڴt#<<ɓ'xذaCwo}/JSN`ݺޑ>|8aP\\eO40 ӱ,KA%ct&)6VSR7v̰LIJLF  Bwt1C !H}e ;wRc-q3ল(|nu \ ?:H*_ӛ`H5QDBkC{vlgW#Z9-Zh/>+++K+Doȡ\.'"""r(N{rkkkp`|ݾ/2xYZ pK`2)c[wX x.BuA?-+)Ѣ->ǝژGnuѦHg9tGahWhllN-""{l6""""r,e/ADDeH8ЀeYDEE}*&&:hSDo0ȉʉP]NU?٧}(|l"""'+++=Cw ^$&&bYUUU=n ˲HLL$,Laٯ|NNnV__OSSvdbbbp8}rh455 e^/555őaTWWJEDDDDDFFFrNz$)) hnnq"2x#""""""""eYTVV&22cztǫH8 PRRBdd$DihhFi rCbb"^IזQQQ$::L*++\Sd9㍈ .'qbH,Zn7a{JeYLcc#>Wz%mY۷o'--8,"**h^DDDDDd@_Rfr+EOu1y%Y6 jkjIdB ae5Ys{_#>q@ p@+ȸF4.W?,?""""""""""""""""""2np\? öRcCyy[r QUj "ѡVs=OHx: .ʊ#㬟H\skSr#| ?umӉs7/╒f>".;"q#صG7HzFFipa8fXDDl}՞6,6 0 !$$/|B3O2: S7_ahCg?`;a0nt8H[زe0oy+)+?-\uHFX@DIEDDDDDDDDDDDDDDDDd>0eGp񜌠y~'xOrl{lBO7?Jx޻;QeҕW;ynfP Sm̞>PW^#td.mf#Éw@[m!%M37HO]> Ea>I#R 7i լ\ߊ2n Bm ?(#ڠoJ͔Yd⣱r79kVI`9LBtV}uGd42H Zvnb[s1d5bsOHF2vm69nآF0c,&djklF>nQC9id K%>҅sS]kVsXaL>I҈ 3WSY^DκuU>oQE$8|'Z1BS?hy.z~5 ھG6~hQ9݆s!rarKIFĩ[97_}^d/1?錌41:fh&O,~W'ꩦP 38(mDkO`ٽ~{slQ/_~SӜ]?д7Zߌ ua'e72{h(_g_wpolc/ _ivjRɟz0|Cμo"ŏ+5FܩW!D^Y_~ݏN~K7%0y 88,W g =u?o+w=7[lwm9,%kվ DEDDDDDDDDDDDDDDDDd 2 sIcsy~i@}sh_~| N-^^KUZH2%?dae-j> pɤYY.'397;lS5maYϛi =,NK.db P oCLb- xܲ?FqC =kcGMyOGnk_`x "Pρi߰p\8F[=;E$93ϘDƂkx0=Iu{Ywq$eN[#vuA .RKגWք=g1{$.[_-#7<9$P]ܴz+3Ncg_x 1>]5}#r[ łNedt~7^Ǔ[FdcGk7[XA]4NϜII-<;ޥD-=ʭg0,Zױtzv5pŒ>:SfO&5-tֽc۹&|{1R6}ܲ&l m""""""\G%!iOojZ i~N9?9sZm?oܰ ʪ]ԦNҫ[88ɤŇy̟Ojц~{*R#[^Qp{=Q$,۷ J jN?f 9 ۻl=`fÙ+X,~iMnߡo2"4ΙG6 8>kvT/OL:/­e(Wvuge,s|L}t`].yV#?¡n OtiTߕLͼo>yf.L0ϯ[̛%}\uJ*Q =}9~2dW>S}3KXyC9s[_-|^=ਟ:u|_lYqLVv=n+|}mXu[X2H>S0½In04@] ^ֽ˔-<} C*D PNN kr{%D`趶F}mvp"i[oۇk!""""""""""ݑWtmk!~ȩ/_0O)mឫv;/Y˶uӾrhnnVv86t3.JkkFH!Ҭrn:x\5v2ѧ]yb9d֦0&w+hf:ߎYVt%F&3%;sSaJ=bŕ+d<466w.ʥ-f35j2SY 1$Xk߿-^]& 9i,89 jcǎi_hpW5e([9A+(j, ;)i4ofnNX׼e0-'Otu7`בSB$Nw4SM԰7(>ֽ o8 D$<<|WDD{}MSSӾF""""""""r`zOy3H v0e!0_ee/6p0Bq?3}z4ZH^*({Mo3gr8yz1bFoϋԚ$$J9Lwӆ$&aݲ z0~l6Bz:H E׮)"`oX+&JHH/ޓݝy?$@!=ka9sf239ϠD?ٟ^=|׊6hȊࡷnj1_,T$gܵ$ݑ}\1\Ϥzl%Zޓ0U3N:@Bᅻ 9boU%TVKk+d0rDf8"cQ-U>t崲Fpt +sYjY vKTD˸a/Z~&V^m{+B\V.wa]t͔Rea_o8b7qs5H$\*KNF\QX\P2wSņnʀT Ǿ "ظ9%I=j1EG'mHh,jsw=c»мe8$wg_>c8;hMp1+10GUNBB47ӻO%/'T_3N mܫtE  ,)7$Kʋͫ픓[%vU~#u j4? % +64ѕsbP(]M5 WBQaQ3oт    ԟ&|ސL*,-- *^ZTTDqq1`cc5֗/IGIIIKm    K_\ `݁dޝ /gZ/cPTj*ݫߤROr~+ByõgDiM[? RGљTw>nCa n+\֞H*e6TFv1T-Vl'嚫U%תFPDJ>Ia>ʳ֪R؍|>k igq"I5`߅k;0ڎK+$ɖOѮNPO>m'IU9;OZW\LP$IF-5+ak< ZV8٘JRJ%FۆL=o`7Ԅyk2Lga<腵>og|(#gpO Y);k:֤Bhi@^y/,v,˚ئ E^V)㴮PNIAQ۳™&ҺӦ? gNoɱc-Qv⍗!^^^!I: .Iyyξ9bkkKNHNN&==]dAAAAh)5,Ǣz .Hj161@%;3dmׯ/[PI߾3?} L{?QG䓕m@E eXgRwJ>ٹ󛻸 A*quw*;4E ?nNn.`=Dk^tf?əd;nO>ek߉`cj…8r+yN0޾e?; RȊ:y0kKn؎v cY+<9~PwӲ),W։x'vR7I,>\D_  ㅷ}o>x{yM^^yy9O'^ W-%$;ٵ{'7cuPXXpEZJy=b$#FdĈ{cףJV˻%&#K=;͸)YI `ڋ[2;Ќ\\\ԩvvvt:bccIHH@fz=Ġ鰷sθ4bAAAAƴD_^~ϴ/q"z}iYXXMFG+ؙD5]7x(D 6g5wVR i5[cذPB (l@IzTٞ!̪]'j.;xdݍ\T-DH]ypb}w/)rF::͈&aӮLdBcشtaKKKelN:Ennn-?//SN,&AAAA榪§٢.g.-70ynJtuZu=-49%k+K'E";v?Qp.|›0}[ߜ3Mo׃_@ (پ(%:o"X1X^Lů<>;Lĩ>ٝ.eVή52>wbC:,SЇymH|mHt}b6Otre LZI%Z9 m9n$[<޳UTܸmߦjo箏2^*'V喬dDPzӇ⊉:G[T$AI06GjPg Bɮ̚@; 8_}O\]G |qo~:w>SZxsZRr>-]AAAC۶ 4R"Nȑl۲!xldkd>쟬X8&qL` ;O@v$Ӥ,fBokLbϤR|d2~ّ oglAWOVz qOpyJ5 ғꅝ\BV)Gt[^ƙ?96frAC!%-l%J3bN+6PL"j1iѱdXϨpH*ǀRHJdnxi)tꬽ|BUM )%K>Ia0G$&22y\AAAAl;J1{|WLn 2K ]^m`k#i]>b3$%S"cGZ PdVJ"7FHHGCZ`H†SFZAm]ʫ3p~HbP.V;;5s/2KtGa1J)3X྘WfSĝ&9g/q01|U2bdO;.oJPu ơkd*Uy3Y`onb|Jϓ_&cop0h(cɦ$INQ-N"r2/wΙe}CzrbH-B$< r@-N'6! ~5,O'K\.q y s:ҵ]B}pӢ+$%O$k֙^XK:bH/V:m倦,ԘEV]m_eZ}߰/2Miq(6?ztR>~#5[4]Xӡo_xb+s6{[s/v" ;Kd]!Y!N/m[#)y$G@As@N}=N5nږ} CgwtaK)D.aݻ1' Nпp-fvuNv~;ZCqq'9p8%`1Tǀw{z@#<_r` Kjkqiӛ=QKyN2`bauHXyvOp=l/wt7{Nf׹!׃>NX8w({EYsH1AAf'%,|H8;ɀ,nⅯ1&qd\u$gZ7.=plu[jB^|-G0u+UE)csxTFborO֭p5///t$%%5OOOҚ|    `2f~Vl:CDRN#Iߦ'ub&gP'< s#$JE^6(n;RUO"Kia0a=Ya x8 βq$Ȕqםi}y P˲޻v^mۙL鯼^xww'*ee {LL%r'r0\:r_*((rRV4cƚZZȩ_frArf'ޢ[cޝ>z˓Γ/?N#pR/I-%wNg˃1+%7yeZΫ!tl+O7;Z9>Lg :r#a_qy ~ya^m>sE|u0}! O&5LgyZIW.#y3K_]Ⱥ˦I}y׸b~m&L"bdg 7gUT~l}G85]ط9sڅ1k,ۑ~Uܗ4wvnՁ !3?"Ȼ,,{?dz-k>G<ŮjЃZ}3cjN9Kt3닷ŕ.>.>d@sʷdmW#;>9^zxAvmMUȏ'o-cmnfgy1񵺪-N{hY{ U Qc@m=/Ne\"‚[wT3YKo`_Q}b Ǿ|_@rcxj3퍤=.`EȨyf7}m6& +:]uDdTNF(W"''V~JhN66T\(k6 gk"r޾'(cfW`[IMEPUL¢x>|hvb=;1>؅1f"˘CDlFś;O_z>}ǝ6!aLRHJ+X_PMŧcHG6ip;\s>4۳Zf1Ϗ ؆VNP(S+:-+kR}}nMQK8KtR6Q4W՝7D@&=+2^۵铗4?Bv{zGP+ioO5f|0'\OeP ٿc/&fR5tӛ0O(| Ҕ=`d%ܯW?m v0F% EW,|7mבw1 GO||.=Ԕ4{uXs}kj6|9}Y~kWt ÿR/W//M숭p~BKv*w^᭵Tݕ_ۍ[1m:;;2녛HX&SNjxW~πiKs/}yʺ+1ty{ Xa⫌AR2رt9wo8?qxly\"Y3W?O2/_y%#ي?z?FQt_>΄{/V/dsq;?}.J΁ydoÛ˞F6}AfmSZ|{Ō >vﶶ6\N$V^g[hKC('T$m[uGU%rͻo'`Θqݱ~ϼjJ>]x=XdD:Ɏ~GjU̩ >KlӓWi>1 ;}1ϢuUb8OJZM/W͕Eԓ|> EJyxasSZ]%m"U٩ ݂6҆K4j!>_s` %qTAAhbV???cwu,~0 kIŐe 0q-Zwj^*`֖A(Od+P9QFd/L^vK )(),EgPQFs{Gmo w {ToWRswt HXu6F&jɩ"Pff&z}?dff_[*    4>Gm R]??JQ HYYAWdZ s$H%0OcEf| {^8{XdWstq=Wn ٙU5^+x_ɿ{/1u}7mᬱTJ2gPZ;`兽-bmIݸ9^IY$[GiE^h]Fi*7#XqDᅇ"K%22w8H'ױ>" d!*]nTt~t恌BM1`}ٛ;;UжO? lZ{SJGp]}O& "U7GV_XSK}_6#v!KGV%Rczڎj#rkV\5yS=`Нis9 ll,BVl,Yj<)k3TZisE ֫N0ec=Phc *FU;D+n+qrsrغy{Sh 0_%zǏ|x9R p :tuk?l޺s4"kޏ+OL6UPleƖc۷/9W_i8} G6?1 JNH6{"DPGӔXYk1Vq.%Lm2    Jz R K~Ͳn8Ҥݠ8iJ귋o,((  ܈nh}S2\+54 ~T&k ɛE?/3JW#i iZd!RȩFMHPH?dYNG棴qF#;k"Pp@Jg.R@dAjnSzaNUYd1څ…sFʊ )W\S٩]=Av tؓNx8ce.#KljAT;A窒JJ«2TO3}48GOL qm vù#Bq n^h]/`+ RTv$\t wr 81 菭 jY Ѧ\AaZg9WURII3Q¢ Φ8*t2VHUlFC%7m2h" mLAik"W/!/,qќo{IC"NeLwwǭƶXT De޳&sUkxVHurt-:f͗LhÄiψi>ڑqp%' c/,;${e VZPs7rz=Zss-    2gm1eP[[NȖ 5T4]N QjJq63QAAZ!srPT@r hWZ8`-:(..m`h{ PʮCﰅ[CBNv*ȶp- bz&&yձdo-GvN {Mͭ>P[Jj]TtjKUڒ]'?I]HJsȾPP1'^јcC9&z)P]Zsl*'אM) Na3-(E- ;:$ƽJẒXX`q1s H9!jI.&A&W䵳C"E4Йt je+Fz."JkNs@w.?gҝvҮ]<:7-v#hCs$^._k1NY ";١Z{{{))mAAZ` ;;  )O|rt62"eD6Z%I[T - BCх +7᧱u?4;Mfm:#%4e qot7}[[|66QTfՖ:5U+(P3R%شM)*{nvQO-ͣ]0|Nr,d]Oc*ٙ9(#k 8~ 7mU%3.81`*yy(+nWb0K./悄]qsi6& -!\EѣGcNү11``@H#@@vv)gjS`(DKsmȾJuO NoYdzqm۹ӽ?C1-0L{e@w)eUP)HA gG_J-4gS`8HO-=WR0Tn%D% n&]$>55=ۡ@)!uxs1 Kr 5FAạa`  pcJz Z  C3) Q<2ح3ֆ>1ȸtAHUʒ70ٷؐk ?,Z«R8SdE^D'Pq oSmJvȨǐܽR'gCJ %*HtoC;` !:]mhdw_-$PsT@ُNMs9}3٧;=ZR!+* HfͶi"&GV]{Ǣj08r4m`j yb󯯀膞K kg DrlO'c MAA;dWdFp׵FZ HhZf|>Vtd|՛QEGcږ}O'| N5EVԅ#^ I$˞s#Si|G2~32 {qjakk TdgVUE?Z͍AAAAAA# ?.gk#^ń n 7^{CReC 8}V~vǗ!@h#[e,d\LZfR2ٿ+r]L$<`4ȠrbA=jQaE&g'{("5>n1QiC# J85ֈFnuR^r][ ~cDA j'_0 I]vٙ#LkHGnasUck#lڕ_lZ=T@vcai[s=@I]͚6z.Qؿ;*a.F6Vfy-[ B HMM#55}o>v=u:^^^|%^|% {;GQ#x&<w3^8WT8vHb1r2x[s5FNEvKs'ҥjodGo(od}uْodDY0;pÄ_Ž̟>W:4Jގ|Q*0e1'~Z$I_}3XgNgX& m= ǀwgl*MQ%Z9 m9n$S[ HJ!VZ6o. =(m3$mk~>U3=<3D+o6& pQ֧) qg=/6w"06N o_~ͅM2sBlOqm~gٱMk9I)"gﲙ`K$KHj 1s/ Т*jvw)~»µ#,>Ң#=C ػx:[-0|T"*7ÛE &&ƧDq:(6z.Q kh`4!#c'>;5 ~QXoc ʁ@G²b%ݺvIr- IDATEj*r&mٔƺpO0eF9١UDž#_3cG YSF5$a?k0z d91l=YM8UP^HvZ"QaokPRuXyg`ۙ~/=ߘW%XT,_11&?p1Lh3ĬɅ<>i:d\BRU̪LdbLjye{HO_MS Eow?FՅWTT#666hY.Dt(XAA0BYAAAA P:O?%NBpjuy*UKͬ]ҍwփ!u+L)<2+pldfjռc|T-<]_'r!Q%G<=%7܅~'qx ^x2G]=o?:ږd[8^BI0f[q)\uA/Ж[KRm'%ZGb$vÏX|D7ſ{~QW9"f \m Huڱ`حZQPûGcUIW1 $Ml~g=xǗ~s5rօ& Ӹw~A%?]c8QU4=˝}? \Lq:۽kg&A0{ns ۹dQ.s?(wa&zizEQ6u>43>75s/dEA] Ϯgݎ#߬>Bˮ.dV,ξ2vįFTLC?t?|m| 7q~q6sϽ<.^Ο}\;l }|cb1!Y?ݏ{(/o`/.-b=*ٵ2%8uE n{Ջ45~y,[H+AWnl3p7W,t𹇎mw~OyqWogr3=X4`#':DLxd!"""""""2eF29/8e q3rp;HuROeEm}j3-0+ %JW}{*h>eӋ5tx U쭨WVsډvR{'&8;sSE3NO[;+h,Dž%%Y gS6j+vl_̧xOKޛxoQ_ʜY䤹t5Ro?uȘtMs1{&E٩8J}~8^[#T azn:.`>vn> aE*uRuvq>ǘDsS59spy -5 P({ز`=*FקvʕK裏j9}]~79N8 87oqG3fyfEDDdL6lؐJDDDxVXq뭷oOX 6o~uLn~۷4}DlH y5lX-pkVSU)Jpk4/Z2Do66k<1޳/\ $ٺ8U~n5Sj3#=G34]nډ?ՍQK0M^iTc"""""2F8NXF4UZDDDDDDDDDDD8&w ZD:c%噭~iւoȶDv=#GePDDDD Ճjض;N;@ǎ mmt;0M}f@OO>O}}}Rj;)󋈈L& DȈYo~6mԵH8}Z̙p[ ݯ߹ʱqގ#;;fbf @0йEDDDDDDDDDDD&#Ed̶j<snÿxe8IL-:>.""#Lvv6^"?p8iB|ߐZPdqXcڛڽ0d)""""""rLӤEE{{uj|DDDDDDDDDDDDQUMu;]ȘJKKٶmx|\lP]]Moo'"""""""""""r$SQCC]]]x*))nIcc'"""""""""""rP ZDDDDDDDDd$ 233)++j62233I$TVVb#"""""""""""rR ZDDDDDDDDd}}}TVV.\}> ,8, 7f㋈Ld """"""""r* twwSVVFZZ崶R]]M,ј6bTZDDDDDDDDDDDd9>vI^^@9--Z[[O8t:p80Mj1MsIh`& AzPPP@<P(DOO===x<n7ǃqTVVۛ$"""""""""""rZP ZDDDDDDDD$}vrrr|x^v;餧sh4Jww7` XDDDDDDDDDDD@I2MPtz.D",[DDD841 00M3刈0 пI5m)&DM+c ݈bga7c<ԥ@(E"hkkKv)"""" ävIv9"""2 @___+J ڢnc1AfJ$3&M=t;"""2DNr7KcQ$AJJ YYY D²Id0hwaG w&aәL3j#Ҳ-żDLyNQ7Nk,;7SSSG=~ $"""r1M|^o!x<1Md3%Et]X\xW*,, ,3ce`U cqwL9:@vvɭm8KכKDN?uJ9qp:9x^f͚@]]nQF{ AJXY"R0 ڣ-ٻłb!55UJDDdu Ni""""""2y^ ƬsIz1PDN锖Sp\,\<a$4)0 <%%%,\E IW0 8-fVo6i1""""#7[$/,,d֬YٳMDDDDDD&\2xdl25ZDt,Ya֪SI2M z{{)(( ??d%"""w:LLv9SBo ?DЛp$e~&Z#%%ŋP(A9M&;;1\2xyrzSd 1 T (--0 uJ4<|>NS]EDD4M444 5̤?wȔ5&y'yL չә>}/"OxGDDDDF/sd!"""4.1,95ߔ6zHMM @mzN`[nrܱ{y'% )J s8HSU7Dd8cvk$Z&s֛"NI""""""""2 c!ç~LXPG+ì{jX2<>#Eg,!5ˣT0 w }']qKҰv)$]d_?q4"S֘ւ$YV|>xV"Hr b ~t ;x痱xՕ? %_i ɭ_{+fBJ'-`7Mh#]?.r@D$A?|6V_8X&:좮{2 x}&{ h3+~g\Fh{:kuR2@ȩDhN@v0"fIl:C'!X_MUI}{_gE?gyH;2z6Zh]]ƨm72c`v/~{7sގvpߏq߿KoKo 5$"""""""""""""""""2h|u_uvk6m*猳3sZ&(]-5ܴ-:2k-Az*\ҙyx0;+TC-`v`]O Rvl#K?Ї+>͎1-xlJs} ޸^Φa6Ϣ$Æ]Ϟvb4sYo`op+?g9ΚMA< yV10 #AZL' eҙղٴf\ٳs2 sqM&l h;g6e3sp'Xc6䕗C==:O D6|T7.Ey֓5F-B-rbagddONarl&;1jxg}\> q5;v~/7WK_1I{/֗ƣ7\Jjl߼<9 #\yyv5G~C"= W0&ngC;w|6>*砩7"=9뜏Vc'wy{}#Rwì,G.}߿wZ N?S|gwpe~<'qz3YQo𷛾߷U㓗nK;y=/g]sf\Cy![n下ulOs|Zu//csRzSVT?0ɄɒDDDDDDDDDDDDDDDDDDl  ;LQ2n?<0Oyn8'W>>ny#3ֲB?D;|kGLzvo5(,OD~?J|2,eu ) 3+m4_UH; C!v~ӰSv,w3XGaah޿pL,7oP o8) d}t̑g%,M[l<ЯIhoo=;*=wV9ʧ Ӂ`F苌Ӿz,hbLֽGξX1 &Z^ro=5v :A :@m}uģ[8˖qVo8d!E"jRh/ #<^xZ 9KҒAcXx-&MxՉ-EDDDDDDDDDDDDDDDDd&._V8&SwaL m谯MiHq SH|?;DI]'3Z|0|D 9L.}Xt.<l ``@ӑwxJsL.b]-kr#ņ2 .7EDDDDDDDDDDDDDDDDd :y˯6s|ǨFDכGdxT'c^|xRKV ZOܲFp:0=(4D" CaӉI{ >l?$8\HtLԴT ~P4BtdK{4°qfÆD`ia#HG{IK@F]_0IDz:VRf1,X-0.Gλ>7]?z̽2f YbθS"""""""""""""""""2  qKhI>.F G<[~o(TY_q3;w¶`x}d/$a{XØtGcbgc}v4g>DP08fn00Abs ; ÊXZ,16`)y_¥4m5?a^Lls x\IP:^~BVg^U+LYʕk ɇ;^˩LhJo 0q3;<'ןn@[;cvfr l +_aI76h Yd{ hb!rp`F&Ydfe#Vf\|S pǭ`cKu|ۉmfj 9O?HWow׷L~6%p8HOO'//RΝܹs)--%//t}3_"Cds0=K֙9;KƣOT7ZTwQ&AkE% 01ڌ IDATY e |0 $LOm:B`F@| cK(?f#╿?AmJ֖rUj1 o~'tٳ)..&;;Tl66T)..f!iߟEDDDDDDDDez[X; Dvog@>ùw޼m;62J1|;T} Jgyεe2o|ϟEgû`/}HtghUzR ZDDDDDDDD$8N?b1inn]vk.hnnX,6ϧ ә#""""""""/l}~7Q2g|?-Z&0PIԮ1-\uw}bfxZRLD&4p}?wBg)|~5~}?wb1`? }&%[p9~;Z;cxgx{M5 0(((@M)0 RRRHII!77:&4@p8(,,N}}=xƉD"477'##iӦFmm\"""""""""Cэrj0P}9ۣ\7L3Z_6oeE9Caxha~ y.s(tQ87eFT=p?^iws<в#| 5/տ%=&5 ]ob\ƪA{?O;|O: ʽ Y_MM<{^y/3\rMFt?؄,* ;;{ڈ1 HOO`0H8VgӔa\.|>tttPSS3fkA09s&~47E0x{ w=B@'nmϷ~Ioc!:''t"ՄBVDDDDDDNaiKoo/N8yL((( ؾ}Edr1MnKSSKmmp8`zb1I("?? x )ZDDDDDDDd؍8ӊHHJ fP-k*%X'lF7;`F雰i'F"LvF?]nډ{9F,Ujy<N2޼ĉ* -&1 Lah) Q]] ipzLEAAi* -":;;پ};iRPP cŨ& bX(,,01GDDDDDDDDb9⌴Ub&WP-A^&˒fc3 ~GxL,~| 3my?o8ZHCtVVaҢ0 hii!;;,G5^^^aP]]02OVVh4:sډx""""""""SKgMe'vt, ? mى]ɩϒw\8UKX[|D+)Ryハ^'YsWL,6Mvqr*u  G]Ln`쁵h0D@qq1>o\w:Hx:JKKˣ&EDDDDDDDNv#FpsJVOX(:j#\<&Zʩ/kBD7Gyh<ξ]\eLtoa&495:1pxňֿ6_+gct:eB à}BwvvNFFEEETTTL""""""""SQ=DĴaϞ=c:W:LwmOe&^kL!,?n-P[Qߣ0$wݗj;WJI7HͼVݭcP:mT׿6_+֛"r,cy9vŨ񏧾TRRR ADDDDDDDd0stmIyjCah.پۑ2db5/&UB?d!1IDDDDDDDDdrKMMx|dt-""""""""2L2m[C8cÈn Qj%֍"""ccEDDDDDDDDN')))Nnn@-""""""""2FlGWPhC6X,F$IZHx$"""""""<-""""""""rHt*tFIv""""""""S:Dv\I@]qRDDDDDDDDDDD!ZDDDDDDDDH$B,fp8Vj9EDDDDDDDDVCFFa32[귲fvF]]]deeaZ'|~Պ?-$oy 1\RJ)?L/?ˎIp <'M$}=/WObcoYEg`O4ӛ*Y*6N`!#""""rX92Vl頭}XRn7Ll6z{{ :d4I9oyG6qb>¡:hmjP9RKô֜;yktsrGoN7LwJ57399IIP{3^3 V+V}Vv oF.sx3<~ZNa9ZYN\t g`I-{M 㰸qMg[.b_L0;Hc΅oey|YN}AGG2oZZ9AlTG]Zܩ(*i71K2Ź9{[zX  YCA[MF^ Χc'cl/rdSxrPbd̅17w!׮OSI^r룱iӦQPP@("߾V]""""""""""""'b$yϰPaÂMǟS@").fͥ3h;bUOp t'؉7B}ӏ&>(F}[5LOp1E[@4X2BCu%5=eX3[UZjmm%-- C~~>:_AAv%"""""""""""r:|h℻:8<hnf.lJty]C׺9N ,[F'EkKW8uiLݼ,Jaa@s .ՓIVb=vqt>\2RSpX!F[bSqQB!'hGdYl1F)VܙY9 Fk0)q{*YlDj ?'3Դ4?Qvb,2~g}3A`7|?nF4Lw{#55t _x2  }+R[[Kyy9>1H$4uȉur`㓄Y0kL-Mݦ_{3vnk 6Ӳq;m0]mMշsysHw1#ݴ7P͸~h#[;|8 莂%Oaq>Yi.Xjj[ Hv/d8 bu7wоMiMꤵ`}niB]M=Lv= y`wօ\2KhpYQyhq$ȁ;6W.| Y߲ן~+6:.hUkXoտǒK]f6n싮\ˡGZf 0^_ue\{F:'m\;wcT{j63J,Rq<G~|YvD4w2cz.XG_kV".Lrf$Hm:ΘNKH? fmUՑIqY.n#Fƞ;kkos7&i M` fЗ.kWQeB^{zO װf_ rs^ko/՛ڳ|< [c}kʗYϲ t`Ͼ2tgfK&׬( ײaݣln~cm-̽䭬%{ɅSGj76VF'~~?yyydddJkk+` ~?6 4ill$`cRN@4qs=X >; g ٔY ٻS%*-.Yn{q;k4 @^&^@4$L`BL2@7K7M7MW"ٖ\גJu?dH^e˲҅>a3CWÓ<^ KY},++cUQU{/xjjpK()WS8ӈld9\7DdgwsKFf[1cum9ۏ)0V 0L?WZH9q=Ľ7S1ۄ] A3~R3^acYħ-` :@^~:s'KK%:\f]w3K˲ap?/lh=vyws%KXb?x.ܑbްʜLo#O _Uw|i6A7RJ$I$I$I~Zpתx J@^A>Q LS8]ӽttQռ{04@8NwU3wϮ;6 =:`< 9?+c%Fam|04^v[ސ WϜų0ӯ]ϲngdEi}' Cd [;2@6UD=b!=۞~^|j/`~u" IDAT%X9{g?! =j8^i!My 9Yr! ʢ3DžjeS$IRVַ_o{ܻl ˳Onwb`:R }5f@{dK )(LzcҌ2K2* -By  ;z^3ᵆcu=Ḓ&N*bΝ߿4YYYSQQA]] .d…Q^^N~~>ht:MOO李0$I$I$I;D#]xt I hQ-6qL{0A9mgP)(cCzv#ܱWSUAmU6vA}̬uv5|M,X؆.r-#h`1Ѽc7}snNZv=vL䒝O v܊df"L;0ZNqq.Bf2-an=9X%%d%5$iMLNv%I$]~"rf$8mF="]ɰ-PY̛Żf箽45gkUގ>`zDzh d9MO3l>s4FQl^w=+kr[H<}?qkCqI0~Cnd!ULIQՅF[[u300pkxx{9xC= ~7|*"Z:E/y&c~í#CR}=$I$I$Iҥ2DG()/}ttHNiLj|Zbj毦~;)O=ڝ9(ZkQi=Ͻ>njx;O9A9z,7I~7mׅCm9ىHíl}3֑ΓxgwҎv손C<뎜nJ$IhT]OK{X|<]E.;œ3}D`:__f/ȂSl>5B:͉qv"ݙH$I$I$I:so :9u  8|pf[iۻHn1ճb"̹v5{gw B񜹔gAػ~ c䯃X ;Al 5<;g~B "kr}s<q9qYcWy" EIqhkgǾ| t'{6Fټp#yqb@'y K$IC CȊcpΦgrKqU;8@bNN>5ӧ4M/B`tOfC X ;5 _sP9@Hxud'9eDSc.r) v:@GEEḡJJOTH2I_D*iڒݢ#5Lmd9MG[+素Ĺ#i>}oI$ISXP1V7E,9S=nqD",P ;<]'TR9:_A6Z=H sǙ ٵ,[Z>}' dp.c$I$I$I$锦\|"q;W2;yac+ t_!@ϐ#{s㣝N-aђ=)@8=-gK>=]¢`! BET hدIbWg3W,tš ZͲcNu}׾}te ձhnY i!F鳈^M%I+^=dȝs-k ,{*:urK+ٔ,^AZ[:<1"9y$qGT2k37#$7gбWfHKOA"֮%V[;aeXKq#DYYcm}Zʢ1ΙF^=@H{o6Hb+cI$I$I$I6ӑs:9͎ϟFie gS]02ͼ:ndnf7w56pB:Ϭs)ÇodhoM22\=wO~=S‚ngeyt44}2bu=#=c-qFhߺ}3}]_2fH]n5ヘS|x̞?ydm[ƴxS<##qkdbw'twsB3_=gup}+rc]շQ^j?A]<oZDap;A{geQ/k'֒$I.Mϳ}XXP{ChI_Fey!9 [G?JU=,+-f]b8O&VLrY@O<+ 3$I$I$I.oS/)aśŊSIѱg#?澳LJTp\]3L_g] gSRQII< -̮ׯߵmKX2-FHA b#$7nb`2fj>l=Dr(TM!$ue\x;*OR=WU?~j!џQXQMEAޝ?}j/ }M-+i?D{ i V2:MˏtnRV6:mtF˟FqqрL˼va >Cu--(g`VZSDTWia *>vsk3K V}5o73Xo?c[yN$IK.12weQy.uWзsտkƸ4ö̚^BgعY~i7=$eضw5qG$;*fJw&`tz6\Kf3,qL+Cj!3J(9|^H@7rj%)9: mxxeo-I$I$I$]^ a&H:`ݝ$[o>Zzϥ[UH]쫘MuI>*%nb+/Ύ7_#t=$?wIs3ۖ O_C<ύ.jf!UGeI6Sm=}1Ɩ:2=ҫVhV9 j*9#PAfۡaISײzJsK}xrF8qO:̲w,:. i_9-dUĶcN m=;bwL7 O"˴r :t1w^DQ2Stvٛ:}Gh%ų S=tJҕXE)+-""ȤI AܢRJ%͎릣ڨS^Ont$}2I$|r6nx^\wu<]wu&I$I>ԧ>W$I>>СC2}tuW0¾Ζ/"3Hg>&b}\.sv蠥\fBzZii={K$I$I$I$I$]Y"]$I$I$I$I$I$+ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I.@$I$IKQ,rrr!;;aR$W,I$I$IW&ђ$I$I$DD"1yXX,@ii)f͢d2IKK Lb,I$I$IW<ђ$I$I$֒@tuuG__ Mvv6DD"AQQ?WWWDkkdI$I$Ibw : C 0$I$IST>t)T&Fb?z``N,]RRBEEx9sPYYIRH$I$Iҕ(r {H$I#k#k188pGKryo0d(|l2a͛I&ㆡǒdH&lٲF0$Hl2 /+$I$I$w iӦw1$IZ|tuuP]]}cIyoJ$Meeee,^,X~=mmm}> CX~=]]]deeh"&rI$I$Iұ;L& ÐrD$I$I(//' CywA0dƌvUtf̘A8p`ˑ4EP__O@:4 F$I$I.D q! EK$I(3sLZ[[:1inn&,YbH,] hnn&JMvIX,Ƃ Vw^]!{ ?>Xl#I$I$IWDfwWW999̝;j`"$I$] //jΝKNN]]]G?4;ikk#zj͛G~~M ̛7իWikkyK4E͟?,طo_SSdee1 ~?I$I$IdM ao>Z$I4aHkk+a555QWW7aKz0 U寢D"A466^0 ٵk+V HPQQAkk$I$I$])&$ o~wvvRVVF~~>999v$IT K2dhhݧd2IUUӦM#ޔ aJR.ID`ݤvt:ݻ={6$I2E$I$I$]&,}a%I$IWAv=eH)hoookkx%%%$I chhhRjtP$e_=ƃ] YY=, &\*`M[Di$I$IzhI$I$I!LH$0 /z Gk.Evv h rr((7w7 =\wJI$I7\(**"77 OK$I ÐA8pTꬮRA;ogJgIF嫥j8=\ZZJ<ghhzoI:.O}#1 roMd䟰=!iϼT GI$It@tPSS㦴$I)%ˣfO1J_뼝}yto$]2 MMM̙3YfI:(b455d.}%iLg1E;ظ ^/CvͼNk-]H$IՄ `̡ܹCwcJ$I%/8P[[K^^ iN\w1˾dyr%BHrRYYI"`Μ9رタA@}}=AGkk$ o?cM,Ngz}K\TOME Vl_ 45gPr(]O;[x9 1}>3رtfZnX> ɽlz^wے$I$R4!蚚JKK`E$I$i҅aH__}}}$Iϟt45GA466OqqED{{;g>-Yұ.DXn$WԳ}v-[FQQ3f`޽~3f̠t:/41{}e}^,t IDAT5"ӦQӦ{+%r}B<Ƿ>YCˑJЗ>zv:%y#>s~주{U c;Ͽ%I$Iw :77В$I^oΊ+!L288x9Ǯt:::.z~YhѸvgIc7;EK$It9@tUUAlZ$Iefjjjb?jii9hH1l9ϒ37L===ܹz*++e׮]_|0 ihh{BƖ ' qՍJ@={oN*Ȓ%Ef~UG[ fS_SDv)ӆ{ھ!uE;gO{ 86c {FngiU8p-%I$IҔuށ wI$Iqy:h|ZZZD"̟?D"q9DyDhmme޽P$MgL'6y`sKW07zK$I$IW.@$I$Iܬ[nKEHVV,\͛7300cDQصk$W+744LHR#wBwh@A'BI$ItC$I$I$Ihhhh4… bb1.\HVV444Lv44lPYSC1G\=rCВ$I$°C$I$I$IÐ;vh" X|9A͎; I…$ܷwά/%^mjXʌ!˿qCl$I$I#ђ$I$I$B&^2$*O~y2*!#];yx?y}]$I$IL$I$I$I.{}vuS>xO=>|Iu|s"ͩ u۶6>4z'OY>wG |$I$I7ђ$I$I$I&0{6ɮC$I$]i"]$I$I$I$I$I$+ђ$I$I$I$I$I,ђ$I$I$I$I$I,ђ$I$I$I$I$I.@$I$Ft?dmQ4T'd$I$I$I$Iђ$I$_W_'. %+XQ:BɮF$I$I$I.).`bŪU\r6Κ$I$]v[|rΎ1Y3UI$I$I$INhZ^//.W&I$IĊ0λX'){V'0I$I$I$Ii$I$)k>w9 8L w_Ka0I$I$I$IN%k $I$i,;j0c<{=˯!=T8?n Ǿ0ȥblb0вƶYr SI~dmK9Mgk34NBxvAOu5yU,v KgWQ3Ğ__" V:Q_]LAvd[_~ {I~1-g9Tʐ:ytbMӧO'˙1S!?cJ$I$I$IGL@t$^͢WlvʼnV7 ͌qAKeÛ;ٕLAkr*A:/ Hu k)+$ h KRǜ3JCK=x0L[/W2ܑ<9PRGI6 5ppqցڅE u $I$8W} 呐xlgGxWsSb%VOw`u[d&o_?pCu7/?2v8Ģ0rLK0M+ӟ4~i5yg< 17{2-aW6vՏ߸1"'uIxo|vZkj(((&dT*?72$I$I$I4]?O3 q{aʧ;ߨW?~kVȶ k'~AGnPk_g٫/#w_=;3)~翽wGl~BF6#dx;x~jƻ>z(I$I:QPN#y_7a:Y; Yt7}ʄo@Μw_#;yG/phEp5ȟ[?1Z iP0m&:I$I$I$dS'}Cz)_ t,F>?73w#;y:@Nbnc u?>kt:3?!VkjfOFҙ֭tt,f_򙛗“/l;tQZn;  _<3k̝?zВ$I4Jnk¡?` 5K-ΗG?w6w41tgq\|W{I[0w]?u!w$я~1 -I$I$Ia#L7֑9/ z`ǜj|w-X|xEIݻ̾tGklP}_;yMl"Or55DG'}be=?i:1}z+;{޼ol~s0r3%~O.I$I:kA%޳ ddu?痭Zg)gDŽOY?ah=ϏZI̎# ʹ}[tL4_zzC9Ӽph \rcoݷt}04@Hoo59Ͱ'/cn1}M)1?j7=m۶OϩS%I$I$It1n/[ɻ~s5 ~|04@%3eWbʛ<˗?C~ JV^>F|OOP7sCɝ"Uwk /=0M|<$I- CJ݋ юЙc6c͌*T7dşD239Cز4+ ӱ=wb4}'ru{spi?-S} % `hth,fm{:e($k]cKDL_.s!%TUd?(V|kW.`29dE"@@4+ (ヿm|OOz;3$M=HJH$ŎAii)f͢d2IKK ɾA@YYEEE{^NNtQQtuuL&`$I$I.9S l\J"(Z|o?޹q*D91оSnP;n4642v>Krs[Gb 7g:g 0{Eɲ޻%&vM6=o'Y9NdSwMoN*wY 0Ôs~H`$ s]s]gg0y^a \Yp\P,,zP/]$}ʫu򖳔?3噥p8IrFJR$`+pAISfQM'yːd/ݤO|iT]I  ]\yxf$,a{;ݿ[6ǜT鄢 C╓eYW P P$Q$$9N9Ny<y<yޱWkkr0 tJLАѨᰤ}h!-ǣdnneffS}}}|9A ڐ7#M6IJoR4ֱJ˹Amߧqҋwܧޫk.%W뼕te\`bW' q:'g_j7벛˦^>-:/^coX5ס\M#`lYS\d)Z~qo"/N{wƮm%oї٬WL]V?ж ߥ}n"EjP4ahHR,1[{k6c-H8Ur!~b1jdh..KV ٩I;=GQA HYz4hr檶߃"!!A%%%cC|>~?P($IRwwl6Ҕ)ۭ"effy,D "DkKa+]Gr,ES7Dk];ߩO/і6/(dxu(f)6z Hi[P *mTiـfߒlΰiwr&|:;RooTHjыͪJ4dvޫ+zzz+Vh N#><JKKkKK~{{{ק4vR{Q 0t+*9Yn\f;ǜ/i?yQy.exdXAm~I 8#Lm>%Y6kuڦ9'O|O~V*6mҪLճtj^!K+XL^WUUU盥1iii***aTssbk%cY400LT90s3/zmJcN=!Yq5e)mmV zה{.;/Ge] .Cf뱞4LsDC6{wG9 OG/Q>OaHgֶԢ2A='*˖s]:iT`HC$#UY>lmvFN3er:K `ٳ-k4,Ew?G~Z~K꜋NЬ]ZzwkOԒ-r}U4.lό5?v~F- .N7}|%t/~2]TFaKrR\pSˮ޿&Q]]x˥իW0 uuueN޻-Rss:;;eVZ%5TZZ:noo}KKK0738檌?OoD+E7dƛ~BvO'd9rP!7Tlmyzϫ}_OOD;Go֬9[gIR^³>taCUm:vS|YN߬Rs9׺Wt+'߬W^/uim~>wx:;h5m͹Q\P^_\15ڭ̄d畨@ bu_ֵ{k_ԫRjNE)a: ҪUp8߯9_kknRSSj*m߾} Dv]sޮD%''DuuusO`#-Knӵ?ԭ:EY'_7mݥ>RjfVPnSFYqt%9ZsV]bј,IxhKӗNqː7}@n*KVxy]ӻѫ?)%oVNrVG7Wort~$ w?ި5wUMj5>}䪋tBQ*V^~i=_O^ֵѕf*tmڷNl^w37.''GϾY'eV˲Р 6(''G]]]s,##CnLm{Ѻuvy7 -@$O_jߢ|tl NRAKXfP?'^?Zzb娾o IDATmmʢ,v-L{'O>Ow=j@ /Wn#XgI?;̺gn8֐jYUn3d U D%I6ѺӬa9P_O-^UJK+ ݦ&t<}9t֔(`4oG_|n-`^l6IFmhTMMM*++SQQ|>L?~0#IjiiQ,6MWbZZZT\\\y Q ZbyϺZD9BݫFÇvU>G?>#O}K[ 1il--V$qX,u,^տegԶ3^Ͽg3'E9PQQA{zz$檣ckXt: }}}}ʒVff|>߼kGYiԫ4ƻ:V_\.al  effJ]]]ZbD+I|q9Hiii0l.Pm;u_W$%5׫+WJZz{{eY<VR -˲zirr:q"UR w{Ne_-f,bZz PWWZiUzz:;;ZR"Ii;4544T5@t8/a/@|f,IIIZfl6zzz$ z^eG\ɾRSSUPP0k&]wܦ[ wzqG]pUUU%!߯H :8W8 qDWvv׮XDǍ]`IHHHPUUNT__`ВF%k4d>z)Aeeex<*//WccbXKfwr\ݻe,Z0p8,@\ Dx BjhheYrݪ38h̪ԝKh^zI###r\Zr ÈwIXh]H$"itNLLTEE P0T}}X\  k.E"rA DϝѰs%Br: jhhP,wYXDDB!ڵKhTiii*++[0褤$ISF$J$;nlliqA["eYVKX833<o*..$uvvrQG`>b`ƙhSQ@d68lo`9R a*//Y8 PEE P  b* JJJJm`0y/0{eY*,,TrrlqBYC˓C Q^^ޤm8&3X.jkkFzǺΥb*v}Ŕ9_AA<&rԁP(6IҪUEXԒj*IR[[FFFYfuPEEa] 'VTTHD|ȈjjjdYrssURR2' PIIrsseYjkk9_ϣp8={Ȳ,eeei(@YYY,K{Q8}SqFv 6MeY 3a())I*,,$q'2:hݺuڻw|>ಹ2 Cn[YYY˓t6Sgo`T}}***D544(****˲TWWY6/UEEEʒ=vJKK,˲Ң@ 0+ĬG UXX8Ʋ,mA˶q)3|ˉȈV^-׫7Q>喝2h4ZqDTZZ[N---;XŴgY DKnmmS^^rd=MeiddD~_Ӟ{uPiiYZTk׮9 `\o`9۵j*y<+//OiڎfSffrss$i_wZ @ P]]JJJvU\\,眖LnIR0Tss\`Zf[P(,,XPH555.c8̮m߾]999***RRRʴb kppP@@HDHDҾnNSG)))zcQZZZϗa)==]r***RAA DF%ICNSn[GɲlH$Σ4 &juuu)77WYYYx~eff*--Mn[JMM`P~_===,kf@4˜iPGG|>9N@Ҿhh4~,Dp8N9)윧0"zzz>sss%I===^0SxG@4E@4E@4E@4E@4E@4E@4E@4E@4E@4E@4E˓Ubb ÈwIcYBѡ8XvbiIHHPVVyXF,R8А|>pKB z1 C*,,$<10vv6ɲî8Xtbi1 C999 ,Sarr)##CD/+aRN8W,}G***V]]ݤ_3N8qFZ`\.Nkbi1 Czn~B!~e0 %&&*--MɑRKK ^N P(F +===eK^kkz{{UVVLAN,#`PR~~8𰺻,ǻ$đ-`~x^IROOO+1vsS`a8ךht N4N$''K~+FXD/Ĕ@AusS`a8K)_cpq%!!ALl0zE z0 CdYV+18:&c XXZ8 E w_tV>)Ghhhhhhhh#,6aĻqꩧvg}v*r~i-}9,Zt` 3P!Eh,v>[]pVe*՝ ܠ=%αOTRt~oA?mCWWlk6@o뭺|ɤo\k펙nXllZqW d5ޡoï5͗M_wmγ|Mz^ejݹ'4RώGܞP+@4f7ݨ_}r>?W4ʡ7}C)ʴ=*QT"Qvux4qTdj߿uEZ+ mǴ>a2}wP:fDCݐf|]iaCt٥ wVAJիn*߰AL5&ؔ}-g6,YFkoнwޯW:Ón'Jm,\]5qmG [.jzQ}$,IZJVdi{uNj ƏysdjH>uRE °9ta8eǼz>SiiSOdjO^~V{uҭ/8my]&m.hSulRǵb`6NAhIN)!ѭ<s.yu _ԭv*B;ן'Wq}AX 2,pni}[d h,jkǐ}MziFf 2s@e'D۞L\\X)Fo*p_ KvkPm"֠?\uվ'ͥRm8zץk._>ܷ4|UKޫ΅CiʶKVxDaK. Uě-G#1=CI6I!b#4+fKiOwώM.s9=ФUkvV%0;ڳgqv<~w~MAK2W~ viأpEɖtdi J*wm)! -)Ok?NJslH|Q/loׁMg RQ])%RTW@tpJSf~ Ir(dKkCjk?:_s@.W¬nsd$YSj7̇t \ڸ,=qEt$[3 8m_Cю x ZU&wl@m_3ըg  ןSח*;ٮov<^nreVjUgTVUM8 5}б:mWUJ5jw;BeY:DMv[qeb hğcI}=,ŦZOo/S7}y/ֿ)e=:ZtUOՙK/:K/)))5;FFFuwfe[ Qa=Z}m>7OC,̽zW:wm9ֿWܰY)t[?SnU\9}kEni)Sae~ zL9mºz@۪ΫYK?i}h9lmj}7e럴NGq:KB= ZېyaپFYTޮnު+bz;go$g(u;Dg'{d;3Oק~:͹?o}xG/UO..RRRt_qz7ʶTAe]ܝbSsuELrhFz'j{pE,6_l}-Er),ΧZɫU[+G$+䒫dmژ##ܢU]q7;jUcܣZuڅehϳ]pcj UchJr4dYSS3K-@N=z'j*jKJ=mN5?vtȮ˾?w2lR%= jJ[qλ ]}C<8#yom.)'֓;;ti謷\ ++4Rn޾*IF_O?g^oQ_ĥ앧sש|jhϑbΒLe,:ñon5eȦu~NH ןMgTwOߡobSwA%dW NVIJ]ioۆ}h+ܬgStIzmjHV _fOuunY ߪg:`TY(C1u7ߒjQ}KHʮPWPu:ʱ\Ӧ@TvOJ MT*wP$HҊ3SQ =6Buy#GqpCҬAu6ug("Ý&aܤ~cy2T^+%5QcTPrvcwhOaTRzK R/$۽b1 hđˮ+c߽N7ݨ_x+R|cpt۽.O1G{~Te^+ۿ0DXFÖ]G{~=unpYNGQ>bұG#g>}ah5_ꃣA-U$y2nҝ_~LƢ5NM'8̍?}޾*I򿤟_M~uz* IDATׯvnXV{G~C)61NS^ ɊQ ڦ-էff^_}GoN7kc]+.X~;W/vO*m7oڡo! eݪAiA }k_=~bTRE.Cvihg,_ Udj_oSZJ_=q^ڱN.;Y Z6_;j+Wɉ:"E6EzNVEgW(&iʾ6yKJ|AÇLcR]/<^Us.r3 {m] L=oVwc:qZuǯT^ŋ,&/l3[tAahI/gEQɵR] ?VSSnO2asل,~"i;GK";tC-O>-v_rNL6d _l}\zPÝgip)-nvwВdަ5YA{ٛs2d3z7$KտͿ|M#ruvqTJV? Uls{ߨ$R.Q[\ymBR7a\Z;]s[? -IᦿWuɔMW}&Eb!7qo|zoX<U))Q=ю:5,ɖ\tfhCKR_Wd(1/_ičd-S!|Wƅ%Iѳ)oK<6QZeTicY +g=( O|SQٔr 㟵4aZ`^zV+UёN,˲7MwtFMw$Eד-dѱ8`#ekպ[gȈnVUWWy} bʒemڔ{΅dYϻPUN)zt]kt 7ru‰%#u~^=?4q;֞<ۣݡD+K|aü3T|*u2{]Oɜؙcl)hc=KǩashtG?Ӿǟ~_[[7*6~Gz10I-j8^'VeXar&cDxT i)~=cMv|:&X(t-37tjjj>`rU%YܿR}ÀLTsiWD#1zeJyRnqb(sem +j.lYeI+;/[v5EZ,555[/|^.keGCK#m]gj?OMrjHOzfs{ʊ{kvkxunc~K)gE<6SMd]M֐Ri3*0QedU~Eʞڋ`Yt$8R#a÷ߥFfXEvC2;o5թ!bdVZ5Y4j$0%%2ќP/պ[/}aZn!EƦ̊ e$+Ԣփjz?8e$heK- L4'X8$!.hkdlkJS- 2>ed& ;^R6cnI%)c'ruJ򳔖DC!]\rya E_{~@@4&oW6Is%W_M'lCj=PrteWLӺفM>&,O-_IȐd 5"ck6ҽv쥛/mJJp%a% tjo ST#;7lԻMijdߌ~ Oܒd iph5ĩf)O19DnQN(04-{*+zOpנ vTI ebY+:)& Iֈ#SGXapdD%&lK)gMzGcSJ|Jy5 +5ש$9 ۸4鄢 C ^D#nFg:;t=I8i5`"S-e|@֞x>(PTcI[:Oeql;6&Mݴm{~2$Y߯_[5wg0,cX_ݧ}I_*_yI+hdrʙ@ o*MRe}绤[ՇY>Rvk,~۔q3tNk3{wݽӘyP Z}Jy깗jPd.+t{WmX E@<%T__Jdsj׽D 17& [|{Z{z}X5M6E XR O$e*+cD)߀LIo2ʑt}jfz{FULǬbNSF:GVy{B\=ӭSʰ .5MKoS@44Q(047*K8ӝ=[i:O)TȒ > ;3d3ϰuba괡D !e LH gfr=ה>x:LHt};c:e'۔ψ`Xx` CHfuʑ#+kYYY]]y3t\GerǵT|w<WO nҹ^ǦeDxl2i\ca|_OeOVlNꂓ9a|H:;? Y<7ʰ_OY`F" /fH'h=d˩?Epߝi<| KO2q ep聗h&tz)۟cNM`6&W\2[:""~YXMTȉ19ud A\4tN=|,K$d4j "IwQi-;R?#kj`'=)?MF( vRִZvJ֏HbDT(M,kp Qj5uF&""""""""""""""]Fճ۹0{E &z|iLABH#k୿Ҋd9^~s+|r5^+ۍ[9t1%qZ8N:N;cQ߹ƿc1wチ{^EIExL|16ރ7ucsk~E'cdf|;48 I!)%x__RPHgDhKo珳 [s_kUpj:ӧS;K6P`cq[HrN ټsMܼZLP Ě)^1}MI!u e;lWx5UxJLr?ZZH/afRSSw'ww1u&MEb1xP_"uBB $WOevɯuw"""""""""""""""""LhȮ0{]HX]ȡR ZDDDDDDDDDDDDDDDDDDDDDX DKh9btw"""""""""""""$"##x<c$aǡ ihhDDDD EDDDDDDDDDDDDz0c *-"""2Lpp0呗8]HR \Oǩ0ƐAll,QWW"""@t||<Ӈ`6nܨ"""rTS ZDDDDDDDDDDDDJMM%66zDDDsZmFqq1 "66:o剈t }y<RSSVSSCvv6%+tEDDDDDDDDDDDDz$1+ -"""|1$%%uw9""""]F^q1\Hr 8t|rtyWDڣ"""DFFPTT͕ȑDTTT7W""""u9< &88.G ai:NEz9NCBBttq*GKPP.GDz[znDDDD봼D"""-%ѽDEEqqq\Hr 3MǩHϠTk8Kuu5%"_˹\!"""r4]1DDD3n|"""(KܹqHJJ"44BCCIJJqT8wѥq\D8ww9""""""""""""% ==]!.,44thhhg"KǩHw ǩ]^/EEE)-"Я_? z\t7{""eǎ]0 DHf͚%DDDDDDDDDDDDDDDDDDDDDD:D&My,Xp*bԨQ4ߪU!ZDDDDDDDDDDDDDDDDDDDDDX-""""""""""rPg9YDDDDDDDDz u#"""""""""""""""""""""rR ZDDDDDDDDDDDDDDDDDDDDDX DKh9b)-"""""""""""""""""""""G,EDDDDDDDDDDDDDDDDDDDD䈥@D01tw """"""""""""""rS ZDDDDDDDDDDDDDDDDDkҤI],X1nxHJJ"22ǣΑ"=8SQQA~~> ]@'00Pq^/UUUtADDDDDDDDDD"""ғ)-""1TRSSr<@us%G6mCg!88`#//q:}= $$$pbcc())JlڎCPPAAARXXHaaaDDDDDDDDDD""""й_R ZDDc gyyyQ[[T;>lϟ͕>lmN0eٸqc҈Ў3frn7c mN0zh<999:vEDDDDDDDDDb>Kك""rؤK]]6lKCPWWX޾}{@dd$^jkk;e\9^/$$$PPP刈H/auw"";x<RSS9mذhx$$$( -r-,L Lc^ck6w'p/ŕɃi IDAT0Ch}N[DDDDDDDDDDDDDzEDHJJC^^"Gj0Ɛ0PTT0"1uw9G B`GbطyZ|>i Dďu†5cL C10Q<_\tf DDw+PTTDjj*QQQ+<<%"ݯxºpa2n! #D8mw!MW޻*""""""""""""r g0rHV^ͧ~FSS~@@_E-rPP;P__D˝q~P Mil++"""""""""""""=NyootI ̳0!{_qpU/Ʒ)}LDDDDDDDDDDDD@Da2J)dIIט4-  a# 5є :הqb+ /V阰3166l9]cExn-vV38PR v#0Xl]* eI1SCع6@0I <|y~BEKhk V\oo_؇{VB8l%a׀4^zmc0>vw&•q VUO-99]%w :Ա|7axqCN•+ ]o|eзOuX)X)yJ;59YEDDDDDDD\>Op*ps5܃&?n\ CЀasu5k0 4`o·Va][~s:hV6LDDDDDDDDDDDDP ZDDDDDDhf`l?~#N 0<{q%ECB|߁ValqvV&qt|u]$bSF9M 9uk&""""""""""""K(-""""""r4svBZF y D۰#|s.qNqJs Mt*IńtCsh8U~/LDDDDDDDDDDDDwQ ZDDDDDDhxl-Rmv_vaf|ǮiV3iU_8{phW8 @Ce;3:P9wk&"""""""""F\unn2c33HرcWwcǍ%sP(&8G[{Wش)xu.}ςvftAȮ 8DQXn,eD䀹|yx7'cLT~S<Խ\8L/"""""""W /07XSq®lظ0!_28w7ZMjCh𳼕 o'1k犫S7&nƬvbņ4ߴGciT牫oG.G|p5, -H 905}v':6ޤ5pi`%x&E{k퀕gasu?F_cSMMxsp%8;7u V|ߚH>V4-k""""""""""cWv k֬#Z#-kYf- +""""""""r^z+Vx\bY\A㪼߶>: ױ`\bo޶b+K0î*~U@LOp9ڼ) Ng.ױrss5+}<ڥ8M{l{{p$ |8vYI Ɓ9rKnS:)#0a$Yb ^xHLH\lbsq&8ѓ'1z`n/[Vq If15 PB^ĢUyT[X!}Ȝvjj(^y)ZIĩLFLܵ|7lgLV|νW8lbb+4}zs%|&xU6hXo?ptQDDDDDDDDM&l8F.?%k;9rxu{-h{2nx*3o=.Giduه|ɼ:ى cMMyn㼛]g`r\-O;.`\U[?dN^gp=B)9\uJ^V䚰)\mP77Q~6L2Z?O ҽEMPιv>?;96_=ȅ7OIKAٻ8o#ᔛy#qxk.xz&]ó32kOKpd_WRebxLhq=f"g#x߇+c w))A{vf>L^lFj /:fv)\O~v`=^!ƻ>],}Hi=5#,~j1Ckk< Z fSu22}-Ӈ}ks|~ٲû/;+os%ٰE<}]@aKy6l$,Ƿ^q17]rS ZDDDDDDDwywLWp)w+8q|g/qNJj@"+(l1ƞDc&5_vp#1a1r7O\s_45bLo/;u8W]~"""""""""G/: Ųk|d Đ1dNnQoUg/x`lY+?5V'83H#/EkduUڄ&g)3dt ῼ74]Oа_OZƶ28iZQOֻsrW<~3Y  /q (!W%I'>c8) L8Kxo+Zu51xC՚k|D6Qnj##4C7PqxÜ8ö k'Ɍ~"cSbw=vռ=^x>ś)i g>$Snml8hE< 3[jg,ͩ?ߙicR (Y%ذ:Q) 9f:SG%0{DKg}1xE<蕌28/Ys"ߙЇ?gQbN5>wr21ěz|5E6o[:"]Ƞ@HՄrW191|Y4gx'ӳ_4t>>Z4faϽ/:~ gE4.뫱C20)f NY~.6701C0!+)©kL?jc/]ہvftr.y L<}DDDDDDDDD A. om"%޼>p1De^ƭ?Ye'iԮ{o~Z|n;=@{'=|m_=  å7W-\stJ~xU9%b!=n|QR٧/bP \p_╼.ĉmx,[*xDnyNNMą7/.y5.cZ 'ph,y^mw{ O*袥drұxy7/|u?yb9'Ȍ f3Wsi8}֟mz ƿ tnk F|;?_üo^|_<~^7CkH컸2x {"MW7}%zږ7 I|z{u~O>1~;myCǜepYp;{?goNŒ+[_w2Q5p-daIz]'!U7C DDDDDDDDlϱs/ ݊]S;w.ˁ-8;ΙsMahO%ؔI* Բy~a5q~Ώ86Xw 9?ah ( ~r aM;s^ahl ? hY9Ir>OV04@OJl"HI,lpY/n1 76[ wӴc0tcPh =JH!e_oaװ}s>ۮ g˫t*SW^EcHL&tzmݞa^N#v`Ee@ޣ+0\KQޞ!Sz5/z۸m%p'g|u`b_R^y8:Mчp!KI;5Oz[Xc%2amw}"ԟ>.]33 @[{g8tѹBH"""""""=94yfw """"""""ҩܣ&1.Χ_.wpē<ㆻrQ>i6ѻ˩mƍs"'Ldlf*m{uv]8y~ m̆->㬆}q*ٸ~'q HJ%vowh|]cg;p4h2*lHu bڌ~|V;O>ܦdFJ$Q>O'0XsŠI.×/f"s@ >6͙Ji&ΞcbP2kUvwo>UtSNVIПH/v&Gdjǜ6Za;e|2꧟@ȱ p ԕSNSr9p9\0νy m#LhlYv\Ӽ1j;CEyEKEy-H 9~םD&Gpt~]_B|͎knvZ^cbp" 2j:T5o[CDDTPZNp)o>+<0 s̱~v{h\G}eEu4w@DQjFUb`akMvM;'eٷ)Hsѡ1"/>o{"3.oMHuf7j )^gri\&14 j,u ýX 9q|*n.&O'29 :83yi;(ڒGtjV>#wVnnoOgYm|eopg3^LP'Ĺ3F?v}o8NsújaWRZM`l<"q ~=vEeDYǺicKB ph,/vŮ~r8L㱜vz;Ot1XN.-ʆX om+"zl hg"p~xW)#^p1dL.cc|l{ތtE:,g7Zj濫s򧟑Po𫋟O\q& ogx/w+r$BRu챌MP+$B6._uŴs4l7nCk#yw^ Q36m<@Mɺuٙ`0>|dca IDAT1t׬ g 6E6Q 4~k{j!筄 Xz42GEw_ ik6x98'5l:V;Ez%+ya "`9͞jc\ݸvK,+ YPBɧsP9$kbHw*>v&1`/|)| NJ`.`Xpk\iEoV";2=;Nu`pۗ6b1 h9:>>"SSfGÙCVykpH>ن2Gg1mp7 v؝("uG64eD/#bc_׾1BmH?KON8PSWEu&|ZI }F8}.GƮ 'k-k֮'k{\*(* w\~~7nq!.KFf|}_s?Z\~̯w>u# gȔ pY[lxwČ4&"""""""""""c@Rׯ_;%>Ԃż*C:ܟnrcjmz^{#v='ȟ,;3HE^c`ДvT`ö}NXt&a9 7P#PmޡX I%ܴ. z CRUa)_-XGѱyǎG|h+k= O0nLQ}[8c2I,f٥{t $v@:Ʉ eDm-gװ#{enf ԇpj*LuV Ɉ$FHUyl\%Jh!;IFJndgC`0&M$#% ]aiǺN sp*a4V=k) WnMh2Evپ> - 2m} \絾I}4me4RNa{lsXW,ϭ﷠:27iM"$ !)00v#u܄FlX`DAj)+ XR &вVPGAyACTh4WH4qVmPYLeK$M#ueS\xoh:|+E;xBZ bוSҲÉ`RUW(LTLnlKn4#蛚@tnƧM'c䭧"Ϻ@Ƶx8ea!M,yO ۧ5|.|^ݣfN H,mu6DĜP3:we:EDDDDDDDDDDD+ } ۝˼jy^8=+'fbu&cF3 ʍqn!vu(ny*Gy,q^!ؘWFADĦ0`Pܘ5l)Y^BQZ+x3//3.-ߔCayv`CF3_$nlJ/,k͖Ɯ4ΜO&_< LHg$~qp}v!<wSŌKX[+~0Ǧٰf>k]w?=?\7q<5ng2o.cS~ ͮ~ҾE0;g˙& ( \w3o\X)7N"jOxi,_ &sHy<7ё1Myww]1o']u[)j" $ĴtF t漽 oLy˰}Mq)t9t8uu<#pxk/zU{e8l齇tJh) "*vzzg/g~ꡧFQ%!^IeݝI s|gw};So'rGŽ.OJQpg᛻.⹚Ξ=pk2٩=' f֝9q$ OɪbՀk(n`Ux ;{'Bvゝ{K\_x6Vi,xLly{ǰoxi^z?g>#vbeϲ l㢧rsYZPkWRH1WL0S+=r&̜Ȱ`/-ڨĪ Yu623[Fq'@ƞ<1^ YYvgOLJ| c-fM:Qy"Fx}>>6V|o]U@&M!9]3S5uh I2'GuCy| bV.Kqeʼ+Md,LzO\ɺUo\\ƪU[@₧1 I퉻P>n$j+ET6 9y{Klt4y#<9}4LVoEigd 6g֚LV._î6\F3iąOʧ_&[yfA1yQdyXH1P_/{(1Ϸå8'{؋0uz(LVN u|xskÁ܇UqW7[2>t5I> -}fSu?~O|Nqm<]eG/)l"f%/^M>9L])wܰ#=FXZ_ogof%cՌ8LEOs Pܣگ4;nI&[/?/>QzlL_jLl8r.⹫<~%.ċ$rx O|s>k=]K9o$H p!|prRr-% 4ng N=zc2 PvKs(he/qoR?PS#3=i`.el幝]c37QLI,M}:[YWKR`$&h-j!zAIhDћ)X{'};Ff0L!LSw[5il\KȤp"| ylYGWB"\hw᳝8e(2i\!ew7#F壟-/!]prrV8rgBZr2ض=ʃʢc 2.z{Yf|l$b!.Hecy샯h4Io]'ȤJS% !B!B!B㉭❛(yVGں#}cK7Shcm,oesit3U[wFSN6 d"Z#2Ŏd}4yrhdn,'X/fntkb\r ]FDede{+gvcDܾ&TB 7hTU2.Ȫ!$Tlno9Xyo=K89,{NNFUɹQu+ٟ.ahw7jϽ3 Вʛɦꞟm|<:!fs93X>㾁⍊NurRЏnٺF]xә{pbOey8.);ah0{LT-ɷ;X+_3NŠ LR.ah9?Zù3" ={<Do&gݚahK%; IW(! ]+#+),qԩ=p"T֥*&;&mUL9GiBA67ۗ;h7L=НïJgp9!op:G2j*:yY51 wfK9L wwHwNeezS7Xc.ڌp=&b耂;@/A\LmÑ]μq/ul^^ꃆD`oGEr**:  ^}ɀ[dtU7j48ܬI3h_1(?Ao-mѢu/t B!B!B!BQIRh\W=l!=5:&ΝZ&1%Mi[OrJ4}M&9Z[-0aBtZ6įZiT ލa31. زX4~Ak>KfbMc1(:-g^#kYb+f]eTҁkWVt w+;Q+z Dg%gvP&LĀ%G~̷{519VP?a<G4,t+L֬]C0a!]0m BrJ쿚R]I(xF4\}|0uf2'z B^7aG*rr\S(|ԎW8)4Զh*ȧJ%pB -)HfvӦFD7GNc~6{~٨ΡF1ofnCTuhgncoYRhǜ{?!=↧ZiZi>CBcji?,X:r(8-B!4i!b03O!B!*9'qK8N B4:5RɵcXR lehRF:C{2QwQ)Yj >I@O#5~X Hb" ,ZךŮs (EFࢀ֔KvFev.znraX :͆fz0aLxm**N>xnDZMlM }b$`l8m:G䍻UU:bpR@q]6;lavÐ{QȴG+f׮a~"c4@(j[D"zSSGesńKrjm`|vu@uh'pp7`4OQTT@sqY.jrȭM+Qqal*)Zo_١cB!B!B!BOaDGޠDl+FrR(b #RHPeVӞJy39u&FY1He"sˤ:Zu*{u~h%55Ҥsp _xMдwZƭ`wV ]yr¸.eindg_~IU&]05, a:/aA8bp&қijvplgO\@{F]m:~^xJmX B;ǧt=61]8tlCLA0 k+U Kdaq{@1n59BcH:~UUzB!B?!?c=!B!Do2V&)0(ٝ^4t@uuUaqՍ46!O8uEҹIQ0a{'!tK/ĠYx/}ԯB!B!B!X-zB!Q08hٹemM421n LՓWѪٶ[J,G`*O!_-۪Qۤ_ u?~Օ5hBBZKp(5t |YG1 c>o>WΟD \wi~7TB867;dB!B!B!B!C)Ӵ==V} &cp'hMgKƾFaV4qm8g-=6t 3 ?9Xg$c vZR(Σ@$0g{[sӎJ D;̡hΠ!'ax? } $\ %"̀]ΌHLe 9c[>Y6tTnj%lsJTts2&Zu@`b?oGКhv&8{ccGG z9{LTW֢_anG";)t՟ LLMm Yu8\hT@P[c/ ߝf$sWgӬL _`Z,œ:(q\:EǣOn8Qע*~>?w|]@n/B!B!B!B!AKiij3 -lo9uO*5\qpT2-9P Vg`\x{AE'bN?q&1C[ ~ͷ̺"L2B8XlM8ŝU'B-M4tP\k'+eA *u :`9!sMgЮ38?^\o慜nfB:HI3f k|;la{7W9af9@h\4 hyT[ȠPG 00:1 Qbr*(nA192O{;Л(!ϢLv1 l Q ĸȅqxRXz&:z\塍 =ieu:iHƏ9f΄doTtd{Hqlh- ND)4?)+s0H!B!B!B!BOmUhj#/5nlN1wAٙsQ',P\(v&t<|0t[ZF.g@Lj dI̳ah[=v:;ZU?f,5 * g;x+瑕oř3#1tP#9뮿qI# 5㒳Gㄎ5k'ZVHf4T u "Nnb*?birsp.2}&~>X^խޘʺ6tD0/kz݅i['^ ̷Lo3HH{8fOŭ/1^r Q: 1n(h(7fsF-6<bSj]1zȴ)qT4`Pvk[Kٹ ` ljuG'bvJw-=hMB4v`$B}V80jSPQ}EQ 3ɣ"ws DWUT?5VgclE\}lZJlCW:\FAw SAk`* !/VҪXŨ~ ȭ9~>B!B!B!ӹ?=B 'pKګrhG=|N/cK$Av,DŽĜ^^{& kawv;/*ؚZ5zRNC~W񯧾`Su:wSW 1$/,ΛhNWx \%<%蚆j|X]3lӇ'乇87.Z擹F+Nn> #n&UbkE,f wռh6+6lKZ'FgZ vhF%#Us6_%}4ngdN+#s1wVT[qJ|(EYL$y]馍<}qp.o-,`\UcoGZKDt yg4Ƞ ߨ"=i6.8?`0QUrﭤꄻo0nx2z!:QG1x{ ` 'JE꯬q?^CS[UM}7 ZVvMհE1(&i6W~ªSw´OGj+iS\ פ6VfOcshYJwUh/:d.ˍe֛)Ȭ$pxq-<B qAEl+okf8F\_MM]3f ߠ`:i|6ni.M?ȯon^*huk k%|RLB";wsexncW{HqlXJI`'$WϰA 3`<B!B!B!#P|A#o{G1QCRTeQھˆ$dkN$)W>;IxZ[Ѡ1LAOc96\D(]%6!#XάJeBߠ&Hda֐Ɩ,k=4*RdCl[ٶpu7;/gFd Z+%kaLsE Õ2eT X3-;î"ZiԪ]Ƕˮኳ&Cni,_O̞Fs[ :jٹj5;1"̏1ӥwLE-տW[>7p.fRC'ЎNi.Z;/ȢK~tjNpME\u_9{\cZ(Z%o>+엸nM{QxsG\4aW tÀQӸ{% S>`4kQ;}M!n~뒬e95bi $ƍ'Pwům-TQS;,_j!qL<>:M]7jL?aZInF6gV`7-Kњ8ذ]0T@G0\Es0S5Pcަ,Bq ݷlȶ:\zq&JJSUMf5k#]/՛Ez(^ IŨ/K6WSO6ȄDx5S]Rɪye'4,woTԸ՛)ݓO<uV 604 noU0" E0F L?!Po?^Ki*%8ݜ԰7wSԧJؘLI&SאZtv\Dp\,.ZCnU&L;~ 妱f&WgxOGUB@r_^b#fh(n,Zt~Ø4m#"1Qʚu9("p˜(Z*I_Eh 1a2' ?SP'&ꇧ"vmȶ(tV)oEg5'ڿ#ʩ3l(KMY{&Ϗs Nf~ QLI$׈[(]2 o!B!B!B!B!?m Cvۚ(\0W֮T?]v7w_>Ht [ogr҉Q?g`,|nocQpϿn!P7_7i-\Ƌ>;9'뽸^,# $޹*ʶ7pκNS3׵VS,"ϑJ7pɫ;uF6gޜߥFr [mB8Liv!uQ1Ĥ"66k}6+?ym+B!B!B!B!B9WPNkI*+Wm%KD&OKh/_& O  9Y[EJ^`MmX^p G7뷯ؚ[C[I3O$9̗ҫ.!SskXX͊ ׶= "!iInSuK<|z$.Ss5ϤA=t$`yj7ɇ{z>ytK!k>!M?nKSȤ!\.eב죠7ajUGٜg=Rcu#h>y!=㳊G 7>M`ceY'3Gx6" ӀNT-:r"a XvȬS ϕO?YJˇS3ZeRڤ7ty2w?QMկڽ?9-cMf9m. : "1xdwk=ٿ`uz!MfIc]7.d }mᇯۉH^gSݾ~fs+qjP.rV]/v% >|xnL?Ӎo 7q` Ň<›H@\4C/?V<|m IDAT|t,L?pO^sWLpˬdw»Ý]!%"jx5|l9?ʂe1)؊esS. h!ڎ?\M \3=?, ;$ -/`pO&sh@B!B!B!B.d,nNF0t~BSp: &ÝG|.xǺ;R]αFݪ*~8ovn%gw04@;K+hw.WGjY£=coO3N w'B!B!B!B!B .LWAe?٭l5#Q{ۭvl%֮b0K\ϛ#[" Aqf̬6nșLVϒo`?Ko*@ &9)|xpW)~L9Eyw,z-k݊YW0Nf rV#Y'e7;sm-Pg=qu;0k߶`l{b?LՓFҧiysHEJːk݌Gh(^]1cRKy,YyB%jt|AZl 2z%yBNF!B!B!B!B! R K}7vڍe!Y̌B2(՘3YUd-Azs#M WSԥ5_b >!>{kVfmlKCiJxT-mx<Ӈ9:C7  zS,Pi6D0ssvڥZ @cCõD^yPC)r)}i3 ! D !B!B!B!B!n5*z}Ѻ!{mL?o E,]p-?Nd)LHI$qP<u"əwKzsǁU֛%?wþ^}/m2Nc2H|f;^+~=~ޒKM[N{so8o>jŠ'KpØG~. w\uu{# (n-3-Rۻna{g{uw͆կ2,33'"2 C}~8BC8@٣ǣu8\8˘ͫ_WciU" Dl)ނEW1t 3iAl [l7#rn(bt ^O$ZT77fgM傣:BnD9A@ MO* ": FfHTm={V}˭>Ţxs1I16~lN Jq'f1w4wCDDDDDDDDDDDDDDDDD{ik(>kɪJF;) 5YMBV5+{onlIۂXQhӏQC[pk9\ 2Y$np љ*%<0=k! `ԏ6 7.}LJ[Q˹܂jlJR۟CY/kVլIֵc$#:mcm"];"""""""""""""""""Uui3gI?V-amcȆA 9d;61ᄇJ(˫[[_m2v9$7|kxTVlmH‚oQaOӸ}T`\X>Rj%tt>SGrrc`GP!2lwORdѧNCŷ8H< m`LLb9&Xy~w{76[2[gϮ671^g1娈f9scU7s'6U؀K~%*Qd?@xW]=E۹g]cbQ<->[8y$s)' N hdIH߳8cT6Jxǡ0o$}F'nu8.ZmxurӇA|`C0-6#{˓qJ2{t$6Ї=5lYMz >t7>XK6ukmt7?t }-Z)֤13D?_3O31F*6Oԟs3/s#DբfjDi׌$ĴZ6K]Mcrbdk߲ޓy+969 їѫf%X9,\II?[ c1֓i>6J 8m\WBK: `/k?h-DDDDDDDDDDDDDDDDDlJ~|;_&jE8MB5~FœԳ+N b;e2|B }}Xx<@peomuY|p4➺z$1W9uN[:|ÉMN6ul |"νP†^K^c%ecSþ-͝˦r O]1!sc[ab6yf:&u>XнQ5,NyێD3"35 EXDu{x|MW߇ 8']]F חkIxR2}:u Ce&2VgmrpHBl"C 4ܔ璙EAeS/+}z%akI>-u> !G/'DcQ[UFazm[kӡ{?DHYX]K߇BF]4-'+5 [OxW%w%&Ԥz:RWeQҒDW vY.~sO}IdjVs^m0 '8+ᶓg~mK$<v$"Ё͹dgo߃D vk_G[=(,,-"""""""""""""""""CE^vnJ0Uj,/l›;^iC`P;3ZM+LoM]:+5ʮ(cƬs 梷8:s܄A8 UKImqj7Vh*oT'"UDDDDDDDDDDDDDDDDDDDDڑEQ@/#q/ð0y:XHkRh gȅq][Zur݅~CSİ}4/+Cyh"""""""""""""&|OˆX;w¯]QӘ g_?_Z]Aܵ)ҍnC}he6ue}9{w ]䠣@$zcs] ]nc{s떿 WaWSiEDDDDDD;6QVVF@@ D(--m#<<\h@xx8\4vQ녝3XG~$^5L߃Y{K]GZj("""""""@|bccIHHH!)Xpp0 ضͦMZ"*/T)"aOmS\\刈>s>cE O/Bt4'3WbG"CqURɪ_Ccxz'ofe 4vv!ex c vWQV\@nVxgi3#Cүk,jK7.7~[G_56p(Bt\?6ɇߝ""&jjjͥSNՋtESz 77ryfbccILLdÆ E짺t͛ """"""r  $`@y(Ws'Dg+_ȃ|Mv͞89<46Zof8)mB8ac Ƒbֶ֌oxgbmUam3zV܁e_?ƴoHDDDDDDD66K@@QQQ 4\ ¶q5kV{pXzG@@zm7oߟ0zAaa!a/~.အ___ؼys{"""""""En|_!I LY_A͔V{ O1Cn@M¿ʼIw%C 6^_א[ZDD\ Ơ@J1I. W-Ek!(/Cx6ssVw>;Du@Gv4cϸ;-ǿC*"""""""Ohi3mAuu5 ;m䐛ՠmlذbbb&::kg6l޼Y72췜t9d`Y *v.n%PJ'K9<մC;q))_ͥL?^:KJw]ĝ| O*`oN;C8@.t~= j1`ʍ\|v׍L΍cO÷=ߐeGrٲe~mjjjgҥu#Lf PTTDzz:nEDDDDD NB:tcwǠ1'~  /xؽ]OCP/o5f,Lf q&.V04]N lZl- `mW:K>Yr(OHaxș/CX%|AIh3uvQSSúuڻ r\w"""""""".7}k`mհiG<,޽=tSإY kdQI] 3Sܔ[)-!ȗcz3gጉ1ͷFsgȼ ӭ[ R1WlG24Oj05i6.?NM2(id]LNΞO} ;`83 '98 3y4`HzTwʺ,zߵ_1U}K,l$FW<ʗ^~fڒƜO0z G`@F41 cr&`bд@tYi=_3T__ʲkɫh(`cճ&Z’e|@ 6`10څ kIk EΚTXo©&ѧ>S]ēɇb0 gq9ϰī[?:Nap?K@6(>;a7˩ 0}ݍ=6Qt`rÌޠ56º0pp !u|ؗQ9p].%{y6[1QZ}\<y{Zʟ}kH˫"Jhiq)"""""""K)Wz 0pk'_z%gJ&x-{1gJJlC-l)ٶ3#}wMwp]\R/:ਲ਼p`[U^_~)ܙ6 gN6N>$,x[g ʶPf@>2LN@3/Gc}#wM_|}ПeSc IDAT"i0c19nl,6k4'"?x$~{|W}`796]&e'3 O璞o^ʅQ@ASSFoxu<,S,J9%"F#r- 6MMy/nUs\ߓWv! <{H~Gpn9az[vA)r%9qGz^d} wH ÿd2um>}28Į[;͜&=ʣavr0}^Nh|2q5L|D"PڙCҫKQ! s3Y7RkbuOP i9Nzbt wڲ ~dѺzcbqN{lFU!K?oXk$F}Qfcj۽ Z8::t=w_V`a$Dtr+?YdCѣң#F [rVhodkCxaчNd.+!^]M+w/QI=踽+nfAW7w.x 1q)/ŋX{qFspDV-Elژil(x}9jf36p=m//*1\deSm{#=u-o۾ӷU؍̙fwKwy-'3xPw ,OU Vl ;bg~Y֍ill"@h.Ƿgu؅¹ dB7nn0Cp[6?\N J((tNp8p uiӘMf>$ܩ N9z#PN=6ӛ#""r^.or,)2g:K.)Iث^bﲡ4>('yXEWFhv ' DϞwIٞ2|? x18!ە})7"q=!tp}&w!gx v)P{НkS+vY%ܙq<~&#۷urlN\S׷ dE>2lzo8LЃSnkIzn ʹWpOrZK<>wӞ;^~&9]yϯ{@Z:eح۪b7yYV ˸{lw_;ax:spi־ԩ!)w8 gf'cokțU<:Wg=9kSǜix|wъB@d %EcBXC<>3yv|BMkk mGh٩.i"w #nrf[XWآ0r_zee;$zh1>lD㚫W[G.38}dS(ޱ./1cxG_rw1B72_x9;R5Kpf*^ٟ# U8-3$チ#Q(ZDD%B}c1'r)q9yD+3B<(4)Oac9l@ }Ng\\|w6vRFq<̟ d|ÓV~(obëONs#;;gMhڴi,غ *y#GNLdԩ}sm"oyb^w.;p_Wjٓnb]l r|G~n~~*ma]:n<'?)i߻ٕki/s֙#'r?-%nqڨa۹bYF qs1{҃: VG}cg?YAqIHb ccSHo`W"""{v+kl̨E7Gtm @ x7`vDrdב<_/ `/OWPgeQ/ w!3b0C9uz Z}0% 7go$2eIO$ش^y?}P,?ym.4L=2 OM- `S]z}95yDFl_dM6pgD~ mp-T p3Sfa!~SHX~ۥ||Y=sezE.!7#M֥{ݺ~ ?T>z|d8 K$>&P 7Źdͦro</Ǯg"һWgbB1=51;RYwӯaЯoWCL7cuj6%.l&^LDDDtG3.Yw0%zRVՍI] 3)y٘٢8#b{0a7?R@:.k nNwUՋƽkfolmfnC'L36X~8#b0z80lKgGհl6͆΅f12f ]} |ޖF>ZkR:|J˪ !j X΢- >7kj <7$1͢@`ԨQ… ۠9X 0IX+`Ux{ǶL2jKY0Y[וg/ylij{ ʔs˩mF#Nq#ث3}C5h0k[ylliveίv!9y ஢3ǠZĦ03, 76VV@mttJ+wgZ2]6^ @ޝqVeݏ@Lc::g`DK#=ؤyjH~e(Ru-kk¡NCҧkQ:҆ a۳D6cߟ ǭOpϕG53&Lb؄I`Q93>RE^[>-ׂӘl-URgE'-u DYښ:?HI 8#3iHy.aF0D@E:Y2wI?hB˶1_׉so+:qf0|7`e/ ,6>O#rȰ K B:pE8cx;(dR}-82uڵk^{=zg`tgfr0Ǿ_)-"""""""""""""""""m.f̕9"N{u43 r@6p'ikwا ,2 UY\.:Fqu, }mۀI͆ ]91-<־s|''﹟46ÈoWCI4SEDDDDDDDDDDDDDDDDyX|]`a싎 $MUU`FX6ѵINd͘`rCf")"+'2 PKÍq ‡wmP͚,ԭ]ɚ?խK'eO;c͌Zy,%:LB^ʵccu=6L:jiJ-oP&,7I& %f8Οg&b؍BfF&L>QV5e9(uPYm; 7*|B "- *Ty|ql:kwmǰv^CEDDDDDDDDDDDDDDdRyyx8k+~R}E†^+3dzrzʌ0:N[Է˲Spds÷qͣ;g?STGtp>̍缓{x7+++'9\h.-l4 lwzշrXvs#1Op1w=uUd7ȸ.tOgع~q \ZkTB$CW&& >| ry|TOϹO0 O[.-߳ =A&r2brݝ},>Egޫ)Z29ּu_wq1t9!ߖP鈠K|ɻ|83S_bW/pnzc 7xX]˜{Nbڏ}sk@A+bW`~vP'ʷ(KD%*=Nn.ˁ ब@7jF&"""""""""""""""Ma0\HJMƻwp6iqa]I*x0,>M~7q%֕aGv^z `1/r}P)%.㳷묁uMueuƼ08LH4 wﻌur Cϡ1ܹ][Bys"p$ <ֶjؼt6o>*_u<2?qwMq)ԁ?'hgإyG ˆMAl2`)^<:YcsQ;^-M`0yu'WOMxB G$l[.f嬧y_9“>7__ɔIկ+q8 Gݢ yq^y5aotH ûo5maW*LvRmB|j@h8 aO7" # rWbWڒtU@hg~|jQvи.O*ЩS.iJ5u>8 0] +ڼ&ӨQXpa;W"""";o|}N$N0'u[rH[N~U?] ׀tr2Hϫ@ϵofd^67U;v3u ?a wT^Xja%N{ѫkG"xj*(ݜKvF?2q1DEEoS+ilӡ{?DHYX]߻ cs{V<ߖ_ ~Q׷ с&edak]Sr`[#<ѣ}F),,^] ?qGe#]՛_S^SFC*L P ȵ-ly>Q1̆& POL2Lj7.ʺ:VQDDDDDDDDDDDDDDDSʅ9lZ-* + #y1t9dmps!pP6?- C)ݰEV65%9-a*h6ߙўEvv޸lj3Y2?ʼn)mvY]`<3vcw `qYoϲaSME@ ӉR&h!gtoR&4tR dSMH$8 {܌ xw!/mﰁzS<4Ɂx-u.u`qv F •Rw1~m^Ʋ!&j/0-0L|c@՚Zmɿ b""""""""""""""""r2=*>6җ<}#|Cb6p(;0lj2f˨irOɸ-#9]Y,VmZ-[un.B3 vHor8r[ "bW [vv6|~S4|=3Z .Qz.썇rǁvEαDTSVt*eYDk1J0vrS:2gYV#w.]euPD8H>>84k ~gʛ<-VSA+t{<ï:蕟P $Dž\ -YӮbLE?ߟhLjP3<0kϪ`R ֶw!"Lׂ_Z zV Usx_69 ()wqˌLbPJ bŒf_$'%%;mwJG/vEkphC;#1Z_Ԭͮ :doDO|wKmU[)boYZЎf0 "'.OlA5Y ^ D76FmqPXW|>'Vʨa]inE6[9ɦ'"""""""""""""""""";[ArPbE,J/nʤ9y4gٳ{4lzJ:'_dS=sӝ1b!*dƿ8;cqmZJ:'A>->8=þN $203[yC46FP"1h uGwK,,E2'{p״l=ݵB ڻ}u#s:v~-."Ou8\ŋJ]ED[~?{Uqu}!{"Ľwٲ2,mJˑe9ڻ̆-3ros/ds~p`^ǃ?3s]\}>IԺNq?%Rn?Vmgη'ї$ ])NїlP_ _ØmqY7Sn_礕DiFB3}{ q6h4Nqu          \O1,I=lN#K<л_nX?WUĨJH2Ni֥mJ<:%c9s?K?u>N[HD       mynXf,lZw7>3&g2~ƔA. Ʋ\I)c+2x,m9HE4?y툶O_vè/3]%żWͿox>hwh&wQVM&W6ɵ%z{]XtlNΝiDqn&ғ:vU W8cK'N{pnEH{8b3LđCl< qIW-+wZms3W`O:,VX혴>;s#Y9qc1k+ޛ@/[$%7r.4B \CW[^ב+׸Ѣo!EF3lu~zMmZc'Emy.}q@c($|Gp6xл{;P w댯N~WTBڣ-a]fZLvZ<%2ص3:wFqMʁh@/$#9Iќ/0BHLb)V8!Hvx] G-H\bnuY.>jg.tj'-eDЩDrkuc-KZα5zu&Mi.10F(b.       4d߂NS#qM.IL@;o$gHʿ* NhIP k BBP`Q巵̗`?4j np8NIAnRF׺7RvlIN3h֐. Dahp| a@Nh2)p;0~y'Ӯ o{zSeqRrZi /C kװj,$yGAׄh$|,%J@ؓg>`/lԪ1M滛H)٬kΠIs|g ׌d[Â7O>ٍa3?2)=W{A 2q?vrC䟟MuS\R0S̡.32CsФc?$Ά3š]s$meŬ%l<ׄ       `}o^xw*a,OŇDի/&́blm\*BSk@eOd}~W"s9Ank -_s9js6ƃ`@wtJ{|4{xx:<=^|aÜtjN&G7}:ix1 ojY3K@5!ؽ;&2sZug{L)' JXwxo?L;ՐMs6R[ AXY5 .=cќime$m\8Pɡ7Sw%NnbP[y ¼blL>c2gKKԌlݗ{JL u\JpRr,su)R tŐAǼ s#7p.42,k~& @jl&ea6Ʌ|V{F&O|̩]]AAAAAAAWxJ2sZ/׼hX-3UaZFZ#ߜ/o)J:>q+(Hŝ) Knjբ% Oc/3루jSe|QD~.Vm>*YtA81Lʪ_xk7.`XZi,|6s.߆WoY8zg"!1u^&|tJX³s>M~.2:qNKYY,~/bb~}b 3U7NYߵ]1&N.qfLcf_ң%;lϤW|r4FbNI_g\ro[˚ dX{2i(O&s *BȲ֊}ڹ6xּmYWQbơb!ZFժY=aNjs#g|Z_\?_Q~ ^OPOz&ӿ:Ean ΊC褕i7~:FR.ktuY-?yeOwƾf;S_Fc^=4f68zαb J#- cHO4xw)L죮Ȯ1~i8{^Gs.Yۇ)2κ@B;X.5ʯ5-d'd%+T CFe]XB'GIׯϰ@s#&#)Y04@Gɸ^?N\:`K6G>͜oëUؽy%^6FToI"|J3mזlO!y ]rePR~gɻ ǿ5|DVFsWsaBS2(U,k xz9[7x^ֵGumi U¾_:CwvJR)K\V%X9C5msWULF~m)pU"ֲxe04en{w{mOVR>K6&]ZDLfBؘ֟+cz.Xw+װ*)J4>ʨeQ|JarK{xoɯtz~6ıkFҶbLleEph[ݺs       -K_+<*qƥHnt\-&=6~z '<<=48]a?\N$H(E gw[cӓ<[* [HιZ*K&4,hgfp| ǏF^\K!9+:k܋$9)nmk 撁l.?Gp"/4H6 lѬBtd9 P>vHAhW94QrظK& Y6g!錽cQ;|:lA۰tJ$7KID;FL浩 W],P҈M)/胃 Gq.D1>#ºбζhR s2HM%t$IK;HuD[yL)|9Dq3JUKRd . r\P$,il^{_hl #4w Ԣ2/~ \<`܊ p֬KD9ĉ*۬#~j%Kٰ'B]D<ۉҲdzmNYwT̼:-Lo'_gn:P3sj[׮iN}֜lC #qo*mbNn|r&z  7JmUg ]=URĻKVr!VQsHE懓/)2+6#نЭj1u mqg"Z׾2(c?}A2;tұ降'Hiq ИaiEp Ȩ{..= *gqDk-p.-3m%\$]$       PG#}NR>Θ ~'Q#ug}ij.Ǟ;#V^K̯*Ⱦ<̎G{My82dofŋϢ6MG`_g& mM3T*Jq[=͂-fAd:y5k yST-Yab(/yQmT%ZBǏԚϟ@k}yt6H_W.'>'*gF8PNychUW?_Ȓugk.$qC/ҸT@5\&hq<>y5cz[L-_Fu7/oȩԿz?k'EWmjY MzN= m0,TgE?: z^\}բ|4̾;^XVksA|2 ƾ4y L}a4]=-ZFNj=5*el<9"*{%o-B?M3v`5i4_`aYVރJq\UmuˊcYF}M3oFkJ]12Iz{U bδʽC$aL~Y疰7Nj ig#ɪ""PZ;G@t>0v*=e--       SwmsR?ϑP-#av郟ʩLjN+Dea2 c,ROeh1eܜ׮( 9z.eH)X{о<2k+:ܒ%&qh^N_$Lvtkp v7Z]QR9!W (#ɽ*'aL5qpd)4hu O_B2wh>u&rD}YCf&ɏɪa=c[t ՑzM$WvU v#` Vت<=O.V%Z1#hocGXk[ ꊏMk~miIϳ&v4wRwp,)K = `̷q8\ШB4S0m1B3:6e"M®]y8˨G_㵨r*]oiZ e+C#3s3$Q챷23`6E4B|ah%'tߒ IDAT H-v2AflP2݇rj9 Ack UoȹĴ jY!ָܞ3 D9NmQPʍP&ɧ^Jh,hݝQO<;1vry{W]l;0<j4/buv73}y䒝[y!Xz%lm8ZfmmX҉عג>|"A^Ù~D#~Vbg. 9ٹe 998"۔٫+CeW.ă       ­DКv Aqqjr>t:ZCQL L|Eֿ :,@Ħf$]KXz֪ߴe<ɬ>)iX27~ުo:ܲŌ iԷ$Tlz(>'ONfM(.E\ gyt_gXhlX n^Jiϼ:~>bן2!uv^S&Zgl @GQ?gHr6>tP1#;hey8UX=sٜq;үEv/}7~aʬx>GY%~uǫPP׮?5ƴ#|25քWװX B`{M;م>wXqv0W6k{Yékp%1g}z7:~1syCg9Igf%RXO'̦-OѰ i0mIoՋU2wxM+|*4|EKWg0vNRw*y|^ KLnO)8Icj'b7u>%G|%Y+! El瓹(5Yer(gd#WHȗXUd'ou:.պܗ4hT|(Źmi[$SѴ,'çMbc q@*Ꮵya y/yqfܸ*Wy`LC.IJ IB+WT?e;gd{U&hT1^o.AAAAAAAU>6m{Y-#y,P)N=Ѹ7ʰR{7| `4/^ s ɇ%%`rjCq~CP?f{lߝUYva`$#{JAO$s~IVxx4CF%>֐.ˌ#OoW(\ FjƀG_'d`ܕ\b&]:!+X6J@0[~yxnt3NJ^& `$mJ~3dEmXIW!wG{!ՋXyUiQCI?wM@++7_DAƱS(~YV::m̐,_{ŪgXp5gk+(?[KVyTM;뼹W>BdRnݲ7tW+KĚJYYFT$(M`Oži,<quwi懳zT> ;Tc89;W6䐕_i6*SMM -9搣Npq*e9G:+M!\yzlVm=l-1D$e׺mCnF{ԫ$5&";qc4V]>Y-c$UB44slfzRr+'\k$g{dEVN8Լ䊳|ujy8TpT2mo +IYٝ\j٧g*۹V[AAAAAAA_RvbRyUC˾րZrhr5&1~?AQ ˕dw!WM\%/'  hcsӾr|c(x#HtI%]?l&%"֟PW=~-%]ߐ@u¬0ve6FKE>j%])YvߌS k+)9%Bdl<vsa8IxBMnvwH-9 Nvi4HqITlm+eHd\Zb'DxZMGω-8t$n~n۽}rd8E1 i|Z\3'c)eI@7@)\kl7 #:M;5)95lG GIJcL "̗JnT$ni|P¥V fK%%kZ"Hbj:YRQi/}`TMC;c.1è71RoΎ<ŠݞO9S[MB!e6kCG<ƎwL#vH;77|,I9)}u xs嘙MM)5$m bG&,fHطJ S.$bP1kAhߞT2cMqKǪfͰ d \q)d@?3_oFTrs)pj@t=yz&r Xd7<ʫE<|7!>mo o.,Ek9^ v~&?6X()ے#_m *`KwȐ.PQU%k|okbfoX+.YҾ/OgP̦ї.am 3_` ѳ?%ν/} s %g?oHR?Ɓӥ qM8wymsy]-ZpԹ<CR 8gN8]jwy*ḭqM3/Tc*~'-T''`w"`ٮG +!L?:[!1y CޯsDعn)mHw|u6ɯ,! !0r?eCFٚyaAAAAAAAAhZWÀ^&d<PLj̀Zx_qM!U_JΉL{ZwGnt #:i -oĂSko-NזO}v>oƓU=cjXLj,5(XzC"#[Vҥ?zucp[]İ |}q6?7ܛbR~J2܈Z @6ԡBjx?>v.RQof%\?k_Nn.ӿV!'.o{8qxu X6>˙3 ccݽ$G^Ѽ-iuB6o o}pWyu 7g&9GL?V^,5s| nkLj3`b,dhqU`K3|dHeK3ʏSt^[[-n8'r׬/|qeصc6ZekfN_+sou3YR 8"ǖ_Gyӵz6&gL onQ\u:C=ӟ]f ]p ywA.piݑ^6h$Xr+swkM2 ]oEfg~.E ֖Jt~0C_}8V|ۛ"H-1ǥe0[;˷=xpdMY¯۳tbM8~, -CiaFږ_8v7p❶K9Гf@,“ȓ _3Zʹ?hCj͡_m3Ml><\Xk d׹͇__MרD],şXe䋟x&#j~1\ 6?`4QcJ|z J=+8G oôw ~ϽᧈJ/3NAnXʠ׿       ըu ɖVX#`Pr6CruU:W%+#Ⱥ|n\ǟ qY{~%zϯ:`LNNS<0ukk-JfN.|98:з& +3Ӄ v6x;7B|3g~ɶ\ Z;|{B6SOD<'% B{1pPIhOlbo^pY܋QJ¥5a}1tHzv YKݜ %,«)R º}$U3f4,2xpj9^8ʙSXtⓟ1m:Ne#׷;$X̤WדTVKKNٔ|?D]Ȧ(i/G)q?Ys,h۽?5Ri:~Z̤>XaEWQ&ߟRQ\ |WCAc#. 6,`I,TypFH6`KjmOD|36uڛ΅~/>/ILx ѹF̜[ѥ  e3-l|w /ͥzCU s-߭`xm}ɊjM{?P% \Ч_Pz^}~;.r]:Wq*Z:VsˡRpk^~~!?NT+' G;w,(&yyv&E4       ¿F)PEEKLfN}""VB.tqk2##mG65`,'~}on]0+t+sd͛L%?S Nt15 QaUmvGC7?]}HAqt6MĈEbqhVþ~j*cr$Q HtFj1Q灀ntun协Mc{wq@-K &?qmL{=W*D_~QKU7TLBV׽Y/\8 #@_7lPsKtR6*g3lVIfSX[2yDm|7~w+}ifXRHR*9FNJ)l6hl\F~H+nIŵ)aWEu׾:[Ѿtzr.J^@ym5LEQ $ڶp(/9ˁb־ohۆ@/gl͍f{6KA M\c٬ q۱ Ic$RmEU 8a&W ~yԵ9l3m>3Ohվ5^PHS V?յm3۷ HʏsXj0p38L]uB-&'=Zzu$lb;¿-m|M)24=+guvTP)S?mZyd,?Hj~]EI]s]g|4~]       B͊IIV:|J,bކhנZOA%́ZBmO y{{;_"h1X߫4=l\e-Z͵)/=(#3!kvת,%;e(j2*z} Nӊc%Dg|!rۓa_kz< w:BFb2Jv"G*Qɖwac2PChS.#٠cKg$^RRysiP&JJmw&ry#1&sk<ʃuax4>v7dE{nֵT;[;J*O]&; $PrILcQHܷŽy Z6HuR6&zHajf[پ0gUC72rrhvk vhDRaT}6 wV޺cLBQZvom{8q0t%e9$έ[ضaW9gńc1K̊Ӗ)ۆj(UmPBq6}vR̊îF)N'm{y9 ],gǖ4#Z=ŏӫE|BoɹxZڍ{cQWQ:U+8ǟ.LPo!1x 6 O٢U$.$ɏm#Cе|&խjI_ v~+7 IDATXTep$_mOCM~9:ufj}s+7q c]Тb9CT՗jeRTɂ_doVޚۚ:nƸ^U?Wr8OA %xc/t z`0uo [&3<)}8M6Ƭg\ɊЧLWJ_5+ރyF6vZXkЗiga޼scm^YqXi S\(r#-5ʶ㷣 p3o       ߠ?+aFO{ڌ[r:6Mb&})òh-eX:K]ͪ)OʜVpWύ_CҕKOeYG\GiGD2>3ӬrXX :UMǍgkLQ"<[0Hׯ ȯi@0Aժ/ H3#Ѽlۢ~*6.¶ w֒Xk3"""""""""""""""zM|HF鄦tgp MͦYyBK:gqkݥ\~PzK":8iS]Ggr'-&nmհ5k?*' XC{qU9\{݅3.H ۪pL~%vؼ`*3GķM|{6bl>{co|S$)% `/`F=y"c{!5@2b~|nͧv"27#Rz8)b3tQ싹 >^GE̘ ͨK")"C2rS'<ųDpYǟXܟ.dLf,e5=ZUy{ΡgL4 =`{X<>qa{H엸,jNL> kxư: My<<|uw_z / Ƶkɞ9i]7aa3w3,ȋ0ݟ~XyL}s,[JykLL"%l*eEs>*oewrD{#'`[OO`zXʯ ...P;+ f[]0f`6[(ڪ*fOXT@HSz~̀\IqF0Nmy/]g"Jb* n9ȯG^ȱ߱0NMLh?$^@]ia݈̠gf%y`AhZW:`Xާ8?DDDDDDDDDDDDDDDDDDDp ^d҄kxgxLvB]17^ϛu-gpuPєЀUWO`ݖEfke6YEZ"""""""""rz,1l""""""""""*#EYviWl` l]GQ ZtF6Յ,/<Q ZDDDDDDDDDYͬL/`9d3Ghb"  :9f: 3?=z4꼥KLDDDD Nk~hLtIMY[ Z"vΈ6Зqz,H9.g 䎴rbWl${] f8G ePtl߸Y?BNi×<;ᠶh-g*|ֶuE!`CQ^lz0dHo'ƚE3p# :0C;d3b +شj^`eԏz'):-k3w2 *^?ٞ9% 0,l=3'$t'#!`(ټ%UXMܚwN%:='K768f Ro[W4Ob\xʷ>k>sitN ǰ_Y@$߉([g#,-}Ncn6uloO4}6nNN]\{&P$.Ȣr:fx)]wEgW4WTbÂpXTnc\$l7BS&rG6iٞĝWV~ { ^ćTm]DzY3Y_єہ>G}R4aʷ'k- 6vGܼ{P f`DC0/""""""#w 掠_ nxe#yP҃ie{ز&?움uxHsr*|Noo\Njav溡6ʾq ?4{nwryf &q#[$y-p+0ص>\;o\7z8Iv-: % 0ٱcζBA7pUsMGqD*Uԟ=E%~83x|f:Hz>qZoIKăb?V O~/_ޠ ͤ`M\2i~c3n =|?빰2Vw 1B;q-wsݩ]r*O'O?o5p'xTpo5&L$#0+Qg9TYDDDDʑ'2l7,`n.rGҡIRr(OA W2C9.^N[ʧ~jg26Om:]cIvO\ǝNG h)}28dlǕw}_5yVDP[ȢK6mw Lo '=n4rxG&Ƅ۹)p0nϛ}E\wފ\3aWt X?;ϣh:$wʚo ۓϟ|y@ ksÆŮ-+)O&I'?ˣ% EY 6҃' ]\$?8N=cl,/ɧ>j6u:!m-k-/ioK_uiBzrͳd SL'9ޗ?Ws煍tcNPiӦ'gSF aɴ҇= qG-=E-eմo|#5$;?Ÿe~S\9ܟ~`|J&iGݨ[@ =PGE y:(МiQA.xuL^^Ξ+?{)<-}_ȽWIK`oτO3 %$ذ*}a04UEhxN8bM > Ce ʢ6}>tr/=W&V$7Cإ*G ]&O6 CXEL%y^0I$Z3_6CԑYHO\.n y=͔a |WlaIrѱ.iqT]9Az̫(S*…4,{7CUӼ:p o_0ۓͿ|Az-?1q̇9NM8:qӖgy{+3_3ڗ> $%EbbS`&+LSō9}h!wZ 1a*fcb0~>ahʬwx%$ԳD(-"""""""""""""""""-Ę`0ݯ|VxY,Y΢:$Y|3rvs6Q֯o("k9'!$GY,{fM X>¤kX $&'4' b6~_Kh'S 0pD]d3M/̱`V1!&X[ә+d[LtGڌ~g&1px|Ηy>O^9_փg|ws)?qKӖ_ϭWWUYk(- F ]w_,IY|j|1i3lNhN/`y3'}:ꯦiz EDDDDDDDDDDDDDDDDķoK v*-YɑIzV9+W*`dF2MRڦ@fR׳OU;-[U(S֮6M eV6{ٸ~k+0p7[*?!gy6vAmLq@d;/Vfyu6YksߠIBfBMksX.{]ddFa3lb*`EvN8ڴ%Yۼ^Sj}Rsnr* 7AnIcѷri$dw`4fΙ-j{}P& mw9+:1h) `USw#@#x43-"-ChiAQ]ULQUKe ji8N gh۶wSofih:׷=xm{\a]VLJ0"L aD f{62_G "v_]JibJ-0 `#0@())-X`N{fWRфOKӖu~<֮fcTzǑFS/]Oy2~Sw,=r{ *-̦h38FܘF`P})"MhiQwGR0 =|@֮y&c`g) WMsXؖ;ip! l횀ax|涱b0]¶T.R?9>m9oɀܿ7zv]|ai9^pL}4]{_~8`S5}gŦ5 CQWWG@@~ki DH ))*"GP<lk\T*+KD IDATĆH3}C|P{K"Z))bŒ#ք _8B [Z bb0SYٌ%.WԦ pj@E6c5w9pf}-c0' 6>jgUV>T}-_ˬ2볷i=9ԋ$ N姻>U E۔ڗqĸzg:c6fNQg5{"c˖-o߾}5,(ZjG0ٙE4Rw}km0޻.?ɽ`^4oM kr G^A Vr7Lnzb g747"ѳm)ptw ?DM[`:w{іwg^w޵;$gO%ޜ# 59(_\K|uZ{K[]݅^ܬլZ/h?bsIJ1τo  ?8:NHJJ"--JKK#))(Ni aLLL $%%Jjj*IIICHH?}""""""""""""""""+}a7O4I^p]\g53f[%oL`qYCfʟ`x&gOgQV~Z6sgvIϢwób?o`"WՁkL_\?;&DEYۘ5}9u68;}}d=b]isެj6U؀I8NlݼmuN!>Y1_Y`&p¹ C8f#- ~6F`_.j}L$wJn& %(׬ogooϋFh@aDDDDXX.Uar #))2EZ&>>Tbcc vr0M4q\nBBB!558ni+yﵩl \m/1WsT¾cg?wgw.w>bƌ9> *atA<3擵)7#5pG64̕r7/]{L7[, W.{nOi$Gj <~檃28Ǹ ê`YkYSg3'wl -l3|;5: U<~M[>!g5irαJQΙ't#GpӟKe= sϻ-6>N; sfXW.~nNYx >Pg08M3('^Az %1L\xa+:)Ҳ/ALL ;©˲DDDDDDDDDDDDDDD)lgd} /y{a /ޟ0Fڷe[9fQÒG3&~NLi7zE6*BNjCDxs>" D를UJZb6eQQQAMM aaax(++kqE~ÉRUUE]] ^/^CMM a@pp0n$JKKپ} +X=\}17pGhwܴ۫a- .֛ghD NێFX5,L|kr*~)F~f-[f] OiL4)sR˦lKqw1wwrtl 33c#38ߣ7uMzqtQ#:S"/42~wlMX].{jT,~;o\_n'kiZUW_'?b%zHtM\n pt4,اv1~Mfdlpتaˢ狯YV*=۩^n;1}/'xCKOa@Z<a 6vm13g0RgBDelK:N'IIIAiiimlڴ鰏/[հmTUUQ]}AAAcr\jjrgVpf"IC=(,, ,]I4hf:3ߺa^=8M@(%{]1uBXTo"7+-fp"%12Gm9V2GMBtL] XiavLfBnkZ~+ ܱ!0m"M[}IK'&&pMmf&WoI u >ܤzZV,_Co阑HToM[6=92 ([n-X!:,, 0>"az ",,>0'00˲(--m濴쭪Z"## teEDDDDDDDDDDDDDDTl\+Cifʤ~Sͬ v +Rج;y)X>GٖmGz" EMq9죾t-Yʣx(_Μ#EZ۶WMM :\LL x<JJJZ$ 륤C`` -ַ.-v:wn@eSp9VeYl߾j?߰oKHH->9[#0ml]c O]gAㆣCW~ѷPʑrĶmJKK[EKYYQQQDFFRSSC]]]İcO~D8~0:u"O|X z#>Lzß>&a;ow[ۖbڅqنcOSYYIhh(lٲz3;k,oϞ^jmOaQ _uEX/. MB^jR -FmP}W/g_+(nm`Dd33.cg?k7"('gҞ_nqQEQkk59˙ϬunB?1,[>ڪDBt׏n풉 6.+bkzV-XHN` ϐA]I~{!y祅tdwl Ah\o[Oּ9,^wն{u$=>ؘK7Rٌ+ C0 ۖGna5>h:<~RrR)3fz!Ithˮ`U>e>fމ0ozVm(d:ǐWp"v%ֱ"8/ws~HgtN# &;+DLaԕA]M5,;R|ٻi?~p9IN0a 'S*ᆗl6T+&AuERmfRJ0Iҕn z zHhykQQ3S u( ksG+油ݑC)5GmrUc^DDDDDDDDDDDDDDDDDD~KKnFsGH[Ip s|~wv')w|=*} N~\.D9ٶX<XR櫽Apۓ8g,}'Mݶټt|1J.S30֠|z`AP3yћ86ͽךٷO+7O<;txQ|u3=E79xg+?dvfv_A;-ɥsNmyNX'lnFˆB.ƾƏ'&o`҃CqUOg@m~æ@[1 ܆  6+mD͍i=S s`{<9+%])Cyf'"mdr c!7uGҾ' )9 },'%SfzJp2瘮$ 'n/goوǍ=΅B0ȝ#?/[O'8#yXW U<72%d2+ (5 kC6ß~ofCg1/2OX#jD g0 |+ٹXmwOM嘛!̼{뷲rSY'Rzm-廙yɆl_ZD}#4|?3@,wӖPP"Nх>ȋ)!>_f!p8?bj}r:[}b ھ}LzLU/%; ^"SoC2>WdX;[w䰵>^9a<,ryFH w (3篥̈8w"]NҢkV5ܸaqVI ͛v]>>2 y_eC!-(+oyLēʤGLn&Yk J.e0WH⣷̴C;8H]vIlacnڞ~ jr>zQ/`@o_>=N99$s7:y|͋}G;bp ~P_yAؐyFx1|n:[vg0kxv%t=[9w~}5{/]h傯Mk]si.  =,\_url!ow P#k9m4Ϗ<rɇ?1qq(AdTQﺍ̿O Oށt^.ameڳw{>s=jy\F67Dk1G@(i]z%7 b~ydf9NXk#8 7'>Tc4<3OupP?k/um2y0zaNkʟ9Kaj<3"?#yEo2备xebۜa}T_ HOWݟ/IaS95g~‡^w `R>=6}{L86* ̚˜,'iQA$z9J01|04mYYY|Ek]Ip2{}0հϸ5kٿv ݕYf<',&X>ى e + {Y]WмКv-}5vw}w~%Ѿ0νcnEaYo|q*v fu_L͹5fCw3NiY9g MS'2Չ; NKiXL}g wos+ O5RӧUfXt3|Lg\g}|)  ̳o&/ ڵ[߁J'UIQGٚ֗A]0/XJm=ku650Ԭ MocqnobZ6y~yn UY0 sv=˾uW0ili爫@`mBlϫڪJ*+|xlzL@Lbtx~ɗk}-<,W׃zz; |agev%&II>f2 Is >hA61 Od0/49x,24&Ƞ]49 D9'wUgƯA11ILzB:55G2&LIc>Y?Z<g͎a&n]E+|&aʶ6QOҮL0ag8vSqVUmO88H%&1ԃ# ,6/Yy =s5h^WҨUdo7r=Τ ڸ!sle  Yv*VliNT{NBzi64wϥX%+Ϙw-S10.ؙ5NE;#5-.{<$6e&m13>ofw{%$!*U@Di" *bAŮXPE`m{XP齷T@RHMٙE(!ل$}_WΜ9sgsM ne^Ҭ#5扺5q[|t|vW Nt?iw^ǠayssZȚsx 7hKbZ&%h]0t tR IDAT&NYY9mD!B!B!B!ʐIWsŸ qxBq*ڲC]K?r<ՠE^hvq8-_@ntʜDU?|M%?eOVI .!݉C/doaI{(1pWCC]rƲJg.;zaOE&zms8zKqoX᰹1/Z)=S<Vq[n2gs^qST86cԡUhWw@4cUbVwuwE!GVc?{Ӊ Ì`;lV5?'عffhxԅu^;򚢜*B!B!B!z^cOvuUŇ-w=pv "v\tW5t'v1W9R![ݤd(} } 4s75lxmrߐ{nƚlj~ؿhmFhGpuMpڽVYǒ ^M2TXw1 MW=Amώ~iGB fRXX׏e'uGCFni :VK1~YX^{3kg9{yBy2_z![N7#8Qi>[Җ) 6?P?XZ&}+@T'dkrB!B!B!BqSp9_F^Ƕ?aہ;a15i*WFhT(N{R8)\=w'۝*?< je7q?9HpMi@~N]wйh%Z1AU,5hK9|y/a,^^} 勷_ǻvzjGbh*:xfjjf:xxh&ꍯЩ1gZee%S^^~V`o_W.4!$1쭩tȺwa9SƌEի,1Ɯ1a!8Kg⃏SkǮ 0:y@zO^Bqɑ?uȚ\[DRcL/޾ިjb3UWex !B!B!B!8}twV+YF01\-`c7v?m Z%IiXEaO_<܊_m*\W~t6 +zLX}Ù=7e7[ZЃ*hFP @ i keT⎧f=n 'ckc4=mvdR-:aNDE`Z[PbW+Ii69UVV:(ro`P{{{t]:k>Y=# ?#|+goPBLہhkVʑqImá{O"/5nF| ]v5J#&pI+T5z;)`o E8ѩS@ 6Ozoid;k:Vt/=cTwsV#邊%5tK!B!B!B!1*Vʆ7CJyh ůn!C]Pk(-ٗc9o*=;8AMe)yY'eOJc"o?b#quĠUQn';# ,ncI^DG;(=IҮlM,g!t vCъ9InA AWL7eKZqg:w^};mWJP$#=:շ=;RUGڞlޝE؅PO#z!Q8kcu(?|ױ`Y1cwx8+t4ޝ;nWMx6~[vck֖acmS] 3ѡLOGc$]Om1kCpUD{*đ52Wkߋ)7E(nlk q<7Zœem `IǹSBfa{ge6UQLOoa_c8&uDkI[z $V]({y ڭ3Ry5)+ҡzx@pRΈa.{quYƊgTUUgd(ǂ٧nf?:z"zs~{eG]jjt@uV%p!W3sKdq1v"} 3˪?.GJ'[˺Kם!/&hd5dH&NZ:ִ.^W:q/wc@yF !c<Ǻj̶Q^F;n*T41[ZV}L5xaWpq z%VobB!B!B!B!N7SOƏIk|ӛmjZ$VsSwsIl0Etk1Kdޫf#&8wYs0UEtuـ[y|֕5,̧dŌkycW+~W9:26 5EÀ;y뉡*3L?Sw=Zs,fMCkk'̥5֭e nze#Gv֮Kbi~8J;ƞfc6ԶyR!b~.&D{q,zwsǃ3!fWoݱ'޷S\sYrQn G_6/k}E3^&tsfD޷oXt$Y<5BNx;UV( aG?sxsx#gqf~9ϼs x޾6>m\7.>4:ChKa`<6&ڟ0T~{ >nmmɖ9۶}|Myq]g4^FMhglMfӣ ³U ٔ[V nqQb~YK;k-gX^ډ񏳠 R;}(2ş,:_N(Ϝ3,zoW1|0bMte5,w?U ytt<2vvOiu-P ӟξ躎rVrs[y\{{9G?wB\aBؼ;v7'w/S`w0e[˿OReqc:u~ჺwOdϬ[^bSS[5K>yMdnS9B.'büsR0x=P #JWO| ^CB'ǫ~ O=޻*pЋΧkXf,Vp0.?=j@↍W'q?͜C7/GCe$3:1X| i`z}a=@Z B]ZVXMp(wrD͟kR9q(ٕ!1 wtF6L$P\;Dk {lTC? Tfmc䔢9xA1z6¨8O:_ ͠ Uk9󱺅g(؉ yArxy4]TB׭b T\o:8W13VA5bp!#{}ü}|NB>t] 01XE/?ȦkؑGi/! ''aw!YVT3xQCgrNWZ%T:DGcǾT2KQ 8θ5]a[uQY?l;Xɷ+F`xnyG}nw WpprSeO NEcR!:^f>vY|qdI5~2wB8Cf3v7)ൻL|\ B ?.`U7H~bR아C`}d "+?`17p]õrO,Δ=1c5+V C\Nj[]Ox.xO?{_%ag殫|s׃LޏmI[] ћ;r-}/cWkqYEf_H+){œ𘞄{P*:~n.Zc׽5MUX\L?O3ڿ#I̳`ۙ]p*Xsm~׋V?;ڏSUZ+:`M[o4ەmyu=I{w[S`qQ8AB!B!B!BST@"i_jph;ыѬlݔIE !l0FƵ߭ #~ùl'VyT s&b.H{%GLޝ [yaּq_InU܋7d3KOpK5&IXSŌ]ɂaIkLyWO r{$ZMfPo^f'?=s:9bw}CNUw<6)֦4{|w72YqBW9 ~o%AUm<9'Ӷy¸rmTыyl⏿b2{S涍7h'+.itwQmbYl X|ZಧǍ.EcyOxξx#n8ګ.'2&;y,![qQrVu6~]|{>DQʁ^װ8ϻ}cLօo3:q¹jMĸ(Xs[|ܴh7 @3Tవk۩Lgy+5Ow8SoaٜA&=>?bjntQy~?Pӱ,~v-2*ރࢋp zw M/"y>| qk߼p׽,n+9UۅCGrѨ X uAì~i&}Dyw DK?01?EoU,\mRkw7*;/:°3X!x'4fnޝ0o-H",Vфds ZUnw= T? ‘ qFe۷qV/KCQTT+F/h4 l>ǫJt *cgtC?c^cpψ1suqK f7)RIe$h=;^4>I[#[Zz?$؊O$dapK_ Wxj FMyyTuj^_J1tPGR+9<ЋY^ QF7eFah,n uBH/d֯ϵL>U@E`ZC'?k9l[F@lb^"ZDбFX$`^O^=U+'#-18\U#yA@+;/|Ej-GM`|&)a-|25i`M/sL^jahjrX]`xo_wԩ18):e[lޑa3`yivq倢YРP_u.x)#>Q ?1T-g# PC~ Z6\uIFEpk,@9RAΦ2tDˮDNm햄uEQ~ǯOyrb"揧ze1ySH:XDyYFqj,m$ݦĥwpkX< X-2IKˤʧ'+3Y'a" qIiI)o6ͿakS!__oB.~l?vG`.f;{)<Ŵ_!G=>>424l IDATzޥsntvB/a2J{h4Z0l*]^97fU+$,ixxswu‰ rS/\;IUꏞcG'9PKC"Oޘ}:-2o5d$%VӲ 9kTuv!B!B!u7EQoB!;;y]]+B 0ܕ}V\DAHom;qŕw8=wZK#+>b^3ARZ k]E׽֞a߹}>%-u7uPdMlWUs'z:(^om]")tHz ¡smL=Y-Kb9Grk!n}Ě-5Nv!;'P^(t6_6j^ 30R`S(;.c[[6Ś;KwLt3;q"|#K9|Joєv Diܣrҭ^ٰRȶv_kPMn]HkVFEN"rg5fw#t*j0fcnG+))d2쌷7VUooo 唔ۃVK\NiW:Wo m[ڇn!?ekRbѱ䧰#jB!B!Bł#TT43B!h#UUNmuM] Nt+[t>q#%O7T#apT*p<HT;oƮUٲm30|y5;\IEK_ǶU+Yi+w%%p`§H&FNydo *GlbtY[դi'5ULL81Cy:օZVK 3KS:aq ښAVQ/2Gs:ʠp戝ѡ+u0P脛 zu"; $YFd[7D zU2{8V%z!q&w=Q䡡SO6|W ߴ6}Nڜ:X9 T&neT Da;@_<01`0*L?䦺V7?scFwD֌dR[0ߢIX,•fv*TV6|–BF#n74F|||0TUUQPP.B!B!B!W舯/8B!Ŀ/8=-nxYnA]b))p%5ֺtѭv` F'C\nØm,$oYfC*mx_r;. %ckA4s\W.'͠ x򊮸QSYBQA#$#*&rf\b3`r&+ ((.8ѱwRu6s@;zd".穅3oBt"3U*ξAx;n k:޺*1C'.Bpwtюzax~=m4&EAQB[Ot;>aտe0כ^1t#nߘKGvݘ~Em\}4SC'ã u^}6&QY~ۏ`޲[=I(x=۩z&Soєv DRRR;PP[{z(⿑PSSPRRBeee*#nnnuKlt6_!B!B!eX"88H%-Bsvv&22,)wyXS6j:x0">L"#=Nw/^ld {Um:[Eޞz?| (>t?oƸnnDL ++)[Ks:~0c榩 emIy[ՇajxGXFdɪ%+^xe/>@/1e"4BQM[ *)f CM(|<'ڨa+yb:a@Z1OP}|QpTpEf lTS@~>*dChºF'|]p"=EE֚BV@0y{r⼃X)VPcL/o_olz7[8V8Rl tp ю ZRC6Uؿ VBzyW>CC:Mj׸}II Fd2I÷/EQ0LxxxhB—BQII 999X,F#^^^퍳3vvv #w pvvۛ@0X,rrrd> !B!B!(++ٳ'899߄B( NNNҳgO((( ++7z~Kao˃JI*/@{\ɳT;ӳU!)*_WYSK\'ه9<8+ ={eƒP{3vDEa1õ>Tг~ 5i$D[ߦoj$$pX̀>.-VNӎ\oSjlՎtX5(vCw mA !.oF>g<\b6ӳ9ҳWW hedŵKFGŻw?"ڥF~~4P ]v 1qt2Z.SJNx1Wy٥@uwد54+:Bbj+hbB k(y7(V R  &bp.(8#+IM "ca٣ekj[h8Ҭ!s6-k&ze)e:pl['K+wmlS]]BN2^&ykWp]3fw;Y)YYY>|XB!B!B!D;uLvyiB!luSwAffYޠgc-s/ { a}Έ^? e[yQ̓³3&r^b Z1{2tjG.}]/S'ĈNm[`oB*AcoH!0s s$T>&w1qo$~O+bJ>*'rI7Ol3kɱ)ZϿA:ǭO`dSeq۪*VPu$br Ԑ\>" Wy͊}Zu~\{`|WmU=yS̻#JS6|Mj{&7,n-|0WCKnд61)&\$GR$}8+U|:ʎSׇ, GGօCQs9CZx֖-|n*u>3th0G<4GP26 eD_8NJ/S}>u WƳgѠF"T8~+&k+70)QLW)']l%yw:&s`Pq`c2=ʮkO,^_8'OJ y VlǧUK׶Sq-l;mqZ(**:]BfS^^NyynB!B!B?b~!B :ś^羇-{b*! 4h|(Cnxn3lIf7_f PvlGN1utx5dꄈw aДir/i$?H΃1uDŽFwhr&/cRāDҲ )Vq G\WU?Ⓐ[5Co&ڣw%oFRA-",]Dܮ6\29gt >DM E$qsaZ#n'|p(3X5@'.ᩕ5y~ݛgOXdI*{ܼ ńRoZH;?lf4k-VƋW=Ȓ +7/GpuXqZXA~u?Kyb?B'<⾻ؼ+r'=z=ma WlEpKyχ»M$2enV{:uK;gXt&iZ>,z৹sG<ͮX:36{6/vkt-za{.9= )p !['|Xբ7ϲ+<:2nW$sAJO:aBѫ8y_}Bc{^L|1U$s)ց1tC,/"-H+ zZM(| m%<>s8;S_Z̈=[ٝQ }zuƽj0qBl͒ӧk۩k6B!B!B!B!B ׬f5rŘDz9g3)d7_ds-%O̹yaa -l|ȁQo1ֻnM + }{Uּ7>]ǡ7=+V۩/Q^ $<޻4 y;~$} <:{*2B5ҋ,/lL}z)_̺C.>vNZY}MYS`ֽpDѤ*ZHanL[nQ1F#0~_Tg-Wʖr̨'!s^NvT0`hMA]s, n¨~] uhBQ H/dxzwGPÃ^)`Ϗ/୍xvJܒt5~%";^(ɚ i-M-{ z nޜ~VJRV7X)qh;۸a|o:u5_]_CԝN^@.~t:5yݘO8m/"Ye7φPx@!<L<*OS'b\Σde \AJea&{ɳw8Y;n]:jPRCFjYV} ޝJUq8Xb+.t ܃)$(\6͓TtމNJ=@bAh[;/¢" qII)䔝l3ܭ8蕘sROdT| 逯nvhfr|OqkO{P[BVag1o9Se8uJ.x8hf'g_&,ȄGXwwPKI^:i<EM9vihu/ h!B!B!D; DoyAB!--N!ĿEKBwi@>MB!B!B!B!B!B3x B!B!BSwZ[sNҊ .}2ReZ!B!BnR!Z!B!B!B!B?{Eq;d=!@ $ U@Aؽ^@Ċ(kE+*PAzIH {3PBH!}?ϓ̙3gϜ]oB!%B!B!BTT~B!R պT[kFqr,$8O $h!B!B!B!B!8Y} !Dhd !`jkw@!B!B!B!B!B!KB!B!B!B!B!B3B!B!B!B!B!g, D !B!B!B!B!!<2k6oΞ5 hA%j l^l(HBB!B!B!B!lGg ai. 0Ӿs8-[G).tHH ސM҈Tҽ{ LóI( z1)ZGB~ !B!B!B!B!D33sDޘWRJkzoLX)DkqJ`̻ڽ jB!B!B!B!B!h;^i IDAT~{vA&[* !ZB!B!B!8L&d2(yB!fS]]MII YYYԴvg=4v?$-B!B!B!iLQBCC B!KQ\]]quu%((~t]?pc[?"I9ꆎpY36ILBd7f*)UkIʩ~Y61qB/dǞ"m{w;Q.LR8=ط3~fa,ۜEnĴ *vZ{^Dt CQ'E`3JmҲr4NDtEPYDͬZDTp:yh%MΠLWJd`D`-fצ,ۜM{:՞6!)|ҹvx)vK>1 oc ř[ˉÈOxw$;ذj=v%CfBAz*ٕ:q@PLlV|= NdcVAQ~;7v~*5ؓ 5V{kVo%pv@UNv׀K ]G`ܕj2Xl ;a7!fOggNfDt;\*rv`H먘з+Qf|l^=wנhUNK/^Ntэ!yP-ɖk؞]m bg}c3 Na^jL]ϲɜx*6f :܏+|%%~`DP< LT璶3wybc}"v3ZJM,[w^#y &B!B!B!4( ۷,򨪪:&!B !,, WWWNwۙxKW޽9ߌ8U}A{<#om$2)~!꘣iLm\?^%lvi:_ :^[_ 'mצ1iзC.xX&.S I!s\ ;Vs=]9llYysa1RSx녁=RKΊwyf< mA\[<`\̋sǾŹ嵫}~CJqRQa:|1,yw"mA~C#kYT^`%GՀ<1! |},nM@#}K`}ANsp>Ftx̽:+yc|h)j8z}qRG+O^cW[(=z H|qDꤼ{c 0sqSᥧO6GL'՗ 2>b/ϮFd!BOb^՟wPNxw:M<7mM~z+yp(.Jt"0(Ο~0yLٱx>?kG PI_%tm{Hw4ǡ W{+,beZW$=JbxF|vL5?6^{+{XR6QK^1,1޷̛sbسmȔs`O5I/Aaf;g{;1V:BR/a}֨xF؏vat)&G6.ZȊ|lmy0ΉhЇ0on0\ݵttdOkIͭ90&=+OQ|A%%}bZlb Aq>]f *6 #8$lvɥʆw:ĀtljlAC uj~]Lfo>7=x|rzMG;ʔ76]Y%(.x]lwzuT7ot^#y$1Ś_W\r)9N$l?n쓯Y<:w?dn7{+Tngƽz|9b<HEp⍼0OAuO]Hǥn%]M⛔c!kK^>ɇ`YHU1uMz1k粭^9]wF=k7Ed՗}< <]gG1k5G //wXhz>zF֭Π}1A]ŒG^ffGy5J#/㺁zmS #..`%+_4Um[1~ቡl;?5bs)2޻7U;ou%|q^ C;p9l׍Z#y Vjkw@!B!B!Bq`E!++KB!h P]G,'Eps "^Iʗ/rtHrAcZ+ޜd?2:yzah,d.Z.8x0kqKgL8*5O խ7WwQ? _Ѣ;ѳ[Kaz5;OUz7?2e3#Ћ*Aea\/}dv7w |I CJKo`E& CXOZKr2 WqU E`/371ǯdapCspZ fah\4T|zeh963뇡4V͔wcC%8ϯCxjt5cPUfGxDFN+(f{v:MZ3!!ި_v;ahKNv6}e9c>pSA㟟Ql/ȧ觕izoFW◿sFѭl7Xl*Y7מ ㉪[Ϥ9*\W)w^$Ú΢ߓ SH@q"M@Wk6펻^WԻ7y_ ꆋSz>d9tmZW0uNF5~bT#6T CD>?A ~\)u*W?ZcNBP52uvŬ%?HbF_'8z1IIhGEڟ jʖa 4TCBw&Az5%U(Lښ8ϡƺl){NA>qoh5x!ZW j `h Z [L9W\u!DSL&<==qqqqtVU ___)++;eB!B!B!f& =;Y!±%\\\Z'E]&mvsu6Q>ks AdEz))Crd,:!-0\]Ы{s%zc A!PtTS2ٗ(D\Ni̮Т@m2)2[դnO6<6Q5AJԎN(TtS_jZ̦ }T>ljIH ٛӼCȨ@JGZHݶ=WD`ѩ]}j*ʩE5&޽Zf2)%heR|) Mp| zql> .:[-S}JpFPTOUT_ȱ*~n-ۆÂ-R@~*!d4JVJQ #*Q؊),j΄~(}jƵ.↿+ | QUܛK @k3}5 lo fݬ1`=^|wؗ6~}i*h,7pu`gfuq~zǃǮZ!! *Ci ml6lc!B!B!B!tdcN*4PÇ0rH$rxk-T n=cC s䢧^F5}K#xm.g/'\/g=y0 ]wPUdtxу`Qy9[ŚgYޝMvBF0Iӻ5cř]E|2keE2'FV?WVh|]exX})wb m.I7Sv㨁QLth$%fmb4H-wa[6`̤馠פ)o־H] ԐKugO|['pCv}xht߈A]ҲhrH:6r$5x=0qt͜MY.)nڙ ӱ__/n+NXSR/Gnݽ]:8ubսicnڕ5WWq'FSi_oiF3Z}FHEor9qtSx֮8լq77}ђ4d4Fu2l6%%%Muu5'l` 0KcW/2cHE=JD!B!B!B!8STp.}3.lXm`#ǸaFhz2)|q^*T]|7(z {~yjk~Ĥ2n ~Ga] y6»K3|^#g?((K'}Nͤ` &Sy`.{%L~ Nme}y_2wPZb <:f ԰hs#Om/|Wϻ]h6+6guSfP|#z]ih^Q$D }:eݮu_>7>xMRnrˬ8 &:_7G/:).⒧>༻ؚjtԎ|~~Z>L}a/22:7oaBltna|ڍh0E`ސlI+B8 IDATL:K ?^CzKFƼal^uABNFI '>Y;&^r m'څvH1_> 7hhAF:+."H!=Z7H$tj|2-^z[t;醩|}jC{>!djmc>E}.g{|zrkq L`[)߳sl5RњGwHT(0V8|I# j}lC\bi^| X-޷ZTTT7MhM%W졄朎nQSYJ~./eO1ת;ImELē v4FcTSYϾXv [h(^tFKؽ%"'B!B!B!BA6)z%vm&'#bP/`c o:z9𢎥`;o}&=`LCy#G= xۛX@PK&M]fr(>ݱѕ]mb|FV,7w;_dtMrC5;cT1dd?${:hDר\צѪ|-{ m#7~Qбf%{:-WlxL6q/]ڃc[ ٹb1i˙>!v7/T=x Ҵ̝=sixu338. ЩZ/ɝ'lESx{S!OA0_0_H>ΑsygBW$΋&*$#-|&|`w~)?Ǝw93}^̽vv( w%R'۸h 8b#1YKٵm{K:sHP%/// ZB48SxzzuաO <==$// v1 i9>e 5-xc߈8񈽚gOg~'4&!B!B!B!gledl[Cƶ>Nm!i뗑joU撶!8hTf':;q[L^Gf#woNzm!V~i$ͦuNA2;IMoRMѪrH^JcsiTfZAjK$4v=5//d^+Ϯ5RDKZӖ(:`d2(JӏR={xضz1+Nq5w㊋{;ZJC'5+ukYξi1\@?>OB!B!B!B!B1׫f>hg }9=?BUIy9HY\WE>qD`-!} oɡGV0w{bWC|0Z)GlSڀG(iO"=q*('3}d6F߶vCU6?*їsѳc(>N5e~*RB>r2RRbo*^ P#e:c~ƺtÿ^j ܋l]q99yEЭW:b0ԍkXZ{`Tp:yh%KOޔм\]]QSuZ\\\0-Xdj S 윲g8w%&"_kwmZgW7`ESq΀> 3׽˶du/*w:Pq Wb"pի(Ŗ5HΩj#5l,'{hM Ѫ'Tlr=4E>t@"c(>('qtwUm!!ʧ=Pܝ՛wSh6>7B4+u1ӿ'ü0Ԕ+S(j!B!B!B!B M!34lӫ hBL%cr6Ծյ6mO7YPB=})*ÇylGIdAOP4&;^^љfū'OuP%-[Qhq!C? eZ/*uiLgwZĎKX=Kv : =Ȕ$l#{#;C6]@qL/ְ`U2e*p^h"=ͧB!B!B!Bc˟oMcNR :dco25-g3teix@IR!ZN','0t}^nL9;f,kr[RjJv|=,'[=ثzr{ۙOv<2Gpu\|U+à1Os]G7(^ǻ^me;u)wPXqOo&]7w;*ZTv?!Kv?+c%ة'3:K:u8^yo|ts?+Ogl?UGhoL[H{ӷ+o9} @}<>",EN[B\>MX~~l~~;m5z.hkp2d&t S\/'O5T}I|.m/}K໹~_<|A`'x͔|/>g';.t n䆢GkIL'^wr;Wx\sx e7ruhs6gz܆qx%`KYXd @ GDT|S˺6/pi0.|t4gQ5Og%$}8YKᡷC^>ţ^Q ^e7` ﬩@WD_~5sƙ_|51nOy}za:ּyɰݟ. wAS&c~iLZQ B!B!B!B!B!QGO Z1ndգ$gk8ƿ૴8H'` -rp&Kdգ+;=FI?F{arェ^՛aGg(;AzF~~R/_VԻ7Q-YsFƮ?~a*Vv juP}N$vOQsAþ>㿳'U 5d}Gn,4T"Rxt8g`u1XG]Ρ Z{rkJ4Pz' **T[tgLjp~#0c+7PW~iʼn[B2#yG*!!x*vB!B!B!B!Bqh_81YhcV dU۷S6&aOHײr+(W+**]i7"! g]ŗ@#`C$# (hdoBvc˼zt?=||? -jPX-3:]MZnlI[hd[!,pg2R(^L(6Q8F4j.,͆j?LTU=ԗ%wYm{]g0b.ܛ1x`2ʁj@tO<(80 aD8+璲{gIK!͢r2}W l zMw8U6mo"2u]}=ٞ#_1}!>p3ɔ5 ,NTޞbZIIh1"0pl0]/cNyybrUeB!B!B!B!B,Z$3_\ nMjg?Y8Y~*ju35[ꉏ0O]Ѐ88P셗 X(*hXcE\ W ChEֽJqq):xPq*'O@/8}ԋ)*OU:z̅f0Bɭ`0KYy綃a_ɓ>~OƉ3~^Yzluţ+Nm >u5EWQkL`}VBQqIm1U:T ZЫ)Wbb.XBnb!韏ynƛIlEhiO(.*9ΧFqQ1:uacY=:xMQN*B!B!B!g?0iF=eY~Lw3xjdk }iR[4}J !8@tfAC\[zp~BLΆj_xudT6GG))*:ִyoA'`#k{uhJ*j{Tۏ+yDFe=앎w~4ifCp(S뇲!d'''jkk[NNuNWֱUwz|7կmmѬ>W>V*R-+[TC'*ϖ4q]((J]bPNe?,yNG77u:u7F?B!B!B!U8d{B PCХHQ9ņ'V>t[{I1&l}Dڵ),(QDP{QD9ehST6Xj^m@]w>>7x )( ATL&u9]eC9ޜ]Ƴ 3'zD"""'caOѲ_l pW0OuixG^:—zi뫰1֓%^O3vb7gpiMΛ:1qt ݲm#"w6Ub-ko͘`ekjPٔ}IzoؽN:vJݾ]j)pk:3܅a{4cݝƮf#V)6~n@Z_մ볟w37{1ԙulMNTmZ!""""""""""""""ǀu\N'KŬd/+i5\=n9¹=0jg[/VV2mp4[JqD>uMII)6`b_2\I0 ׎A\8k~U IDAT.۳" `6}Fv1 =!Y}&؍GwO0B _Ⱥ.طNq.)>18Y=ya5&pQ=p`eg#n#9jUkSY_vl=rp4=sz}3Bi Fgpjlp&]}MA sP|Tpc)@jj*:QE^jRSW!7X|  bG+yX]+ڶR@][Sy<{I uOV=odSɁQ[3Y)|0y*[- zpupw´ qᎥ~lcCr oʐ7_Scw3v8&Mߺo^\p˄+ho`磩]KYSzv-X_o{?Ƅ[O!u%s&J$ A:(Z"f}-?܋f= 44t aspg^VEFZEFa rI}E{_G1䁻N' v?ʖ~IjgUeʝE?hgL w?*D`Ѣ\۱^M= wIOf=2f귟EN(s϶AdL@"Mm' """""""""""""",q-i]ņB,‰]ɺ-T4IO.͉ (ݹUlkI="eWzviCb\~R rwq?Ni [ҫ # k6~^E,Mfkقh(ȦJٿ7#qWiJvyLFb"Cw3Biڮjq*rذqW$$MB\xv-LamM"W m2شUWIh ӁHشbVfՑ#y+Ben:EXf({OD"gaO X_X}`m{ӿG2MTmf9Qv3Ď=>@(+ kJvkÚ6!*b vG:{OMLrRڵ$!6@MEa6[-gt UED.LI&!:Xh)q+zm_Oj67y]qO}xRٔ]?ɴn=QOKm+X<;7x/71mrKlԌ- 37<ܳ)ɤެ9#zWo u6+$:~COI?9o~c }PW_p=oe,ۘڌ.6w|j}Y9xK.WbNe;2d8h֎v!-y{^Kmݬ)yFX^%cT~U0D\s`͊42K]ĴBDŽ`E随yPx}nWTTPQQ&00oPP *+}ꏁU_A=U? ϯ|ޛvY4ĴL6Qrx.>Ϧ+}G;76|.˖#BӎGw10Hnxd iL2eVn؈yN4waؕl<>uGs?CMSe&ϋKJk#"_|^kW6O'0'0nr7q=#;G:`MUB]|^țopxmm<ć(jN_$]˄syhY 6k<]֜_x}7qpއYRWF䪫bcp nq~lS}Lz(fr3/MܾXw#=(c]ƕ٭߼u7y}C!/O;>Q1~h6tlOޯ|#}A}n p=缆qZݗMڭ\Ȕ̅7;W 2%>ţo.$kKD@I.r 9UO!qv+hs?ó__pg#!bhpؕ?%T{w7ekb#=l\8Gyw2۸  o~A5X; ;3Ag[Td.OG|k}GHZvOK'xy$OS+Vmw?"NцĘ0NU[r}禬˸QK}8>!l~o^xcKO^PP@||:;+bqo\0+D4p:~ؔ|ons7"s_n6?»ڦo""""""""""""""{A[KR1i?e lLׁIiA+d|uv܉ApSclbWvln#$$6=ҳEqA6̣nQ]Ć93j+bۜu"q <$;nzeYw:~<Ҳ+ J hۃ m ٞKv&/=v^#j嬡h& yi\Ҳ* h҉ACвI_6M~1I8sh خ`"5]מtM b><+gm!$GnGR;W^/=eRFdi؅3NMbH[.|6_;⦮fl*>d0b~UhEԶ5MC 4=$}F~H1 lԚmwUQԵ;\$oORL3HXuЩS'}\\V:c… OHDDDd+jS2yd8&6YLaJ_5cc߯x55{3I7泵%r&.u!:g)kAOxFCϼz}LIU8v3-bˇ` Nt^$`Sc%Ԩf¸Mx?^&Ɵ]Gg:~l'߽!k>^8cpsrv3vL~s&V7[KՏtaߒNd=& 63uLc ;^s,KnM}ڨG832OtpefZո28Iٜp܌z wyHwNIfz#(㗍 ^?/c\M⧸/ɮyx`73jjR!ǽ⼚ץ?I#๱a'ߌG_׵%">~w;w2T"j3>Xk#hjo[}TGU\Lz,ʲֲ8(Sc-<n^Ţ'z EPPQQQ6x(4Mp8Vy6kd|6.ƆTm]d{;hv2w Al*r7.MrCЍ8&ÙL +/~֖(!7gjUt^KO㙚A`Eo}Ֆ$sב7o&X9/חahp!S3ojO@s`f\Wg&CTgOMɜ׋5mQ`hb뢺o(bѤ@zG|Wy P LxyGVOb?(! y_am+^*w1qbk,󩬬Ϗ8\.Wt:ϏJmcveڕw+[f/q1'3e@uڗ|Wf4f:Ț=`v&޵2}MӘeB>9DOp`Y5KU_3}C5NZIi)(ӠSkH~0#JɲpҨqQԬsAr3TqpL( jD#Π>v5 uEʗ3sA>eJ' 9Z ٌH쌿aSx*]Qa;oO%"rBtB4\1#zL]eǵomIPP111SZZm APPIii"""""""""""""""w60xt%w4#I ,V"UrSU@3F[׮6ǺڡQµk+g#i뫰 MJ"\R>OyZ Fӊ#q4kA-z ?Q ̛9?/gud d[f]aKl >+7QV;om'#wvi @&6 0řkdO [?;Ge@v$5!<ibw8 قN lJ 1̦T莣Q YIDDFL/Q~eVRe6f[(*˧bm"3S˶mx<Npp0Ŕ;mt~k),,X_DDDDDDDDDDDDDDDNfUx&X{75h5C s`a2~X}ZS¢C]EQa6n̐0B QqomQ_M$fp(sR=GB&ϑɄ7wN[S?i+YWVQUgf WizTչ6YCym#ephǮO6t-s?€A}٭ ]:qH : 9{[y۬*='Ԭ<! vձJQW!a6}w KwyY.}ir&dYQrPV>+ 쥵%"P rWIÓְ]`~e{z9ZUUUv v@@@amr<?%OD`QUL^TnO?!C1Q@1oaGڏ "DFastEEex3^% nl#m< l7\> 9hqt0{b5@p>RW哿˂({">8:T%"P +#YI'2*1e3:<3)PV6 @q:8w~y^^/[=ZDDDDDDDDD>}v ȟENߪUHDDDDOzWqnn=i\ƚz%BYzAqM9ڬIHδt,`D=]81عq#5SwO@wu^H;\V_Cu!S&6֓3]r~WQ>tq<oo$ORһ5,ЭO/3i_jah0ԕ7Փfp{MZ["uό??K I %X@"Ljm۔ONN;v ## vANN) -"""""""""""""""LJ]ȂPjHWEOߓZicwzVW øPn$a9k[ZB D1r+S|6 r_S\੕OvΞ' aŒٹX4~4s!TUUafd_܏_} -c,xזGС=-d""u"""""""""""r,\?" iժUix6?*pwᎥ3 VW&l&gON#Tf@<=w$g&3ﺗ kM"]ě{bڔOWpdulٖaz8W;MaFm6¶!5q*}My-ggD &ԼIH2O^v&OU%o #8&Onv޲0jt5WHn7'Wc܊>m_)dUef$Ns~P5i v&\ߟe6?_y_ΊWxQD𻈈x䩻Ԝ&C_l%ApLSZmAv޿Kl{`+_O1:\8wϺױ5/flј0?7lv*}?eKI˩"(=y+ IDAT:zw˶Zac;6*zOh o^]-Kwh:ʨ_W6&Hi׈¥k,+щJ!c= ,`MlYLD&kɜKXOʚ#WЩ)\m 7eS\ii˖4A%?lmrqQR,CƿM~fyz6]׎4 bwh}4QHp~]5U30Ėl۴G%"@ DIǛݐʿ]ǕguQlzƶٷq,V֪`ײ竸34ciH|͛ˬU[_ǰiĮayיG.bSpO敌ܕ ф0 0\UsmJVݰos{4i~4ݻ*cyik]gKӑİtՔ5Wҧ,ͫl-KkbvD%vN5vR}9 fW }2^c1K4q3qy6OWQ~:ruװk򜾴lN׾8GOfϛw39 DhҤI&@LLL=##8D޼tqK:u~Ud>}p<95mx m_$IZJaW^&m :̑.&%l'=}y>u^$]oo2DlOhdoZMbv -i׺1Q!.&qDEhxؕ6]{O30ɭhʋsܒΖӞ]'}XBlfmZ:{Y q6lEӢ۷9]Z["rmQvܹT!ZDDDDDDDDDDDDDDDDDNrvU>+~Gz(ܚ⭩ r7,eΆoPeG؉(s#EͰ 6,ᘾ>y(ܼc3ջ\ k`-c0"""""""""""""""""""""rR ZDDDDDDDDDDDDDDDDDDDDDNZ=O&; Va񈈈@H؅+Vq=@"""""""""""""""""""""rR ZDDDDDDDDDDDDDDDDDDDDDNZ DIKh9i)-"""""""""""""""""r.}^|nKqMg_䊎x9^x>Aǹs3x_|O:0vm""ur}ʊI$漧)۸xuTv~ciq!i'|<ሢeJWR ;Dc5sJWBػ?$#- i{Za uC?y~ O'\CK9{O%x%PDΚUl"gdDDDDDDDDDDDDDDDDD˵Mp#L>.A~sb\9b9!y "yg?#~kԈ3wD44Uc*pWQ%ͪCE%LOy1P/y[_QU1fXS&bXEl].IDLӨ (ZW'W}FW$}#9pW%eBՑ0Hl@pZ/HM kPx2ѴhG6kVc;[Db+Ys:oenMJ.$îHy17qujފF{*Do.&$7")jw$MD;=O(=]虒LBt(V)yױlRձ\4oO!/}=Ye6~19售jۛłҼ3)uMxBܘodKXUqи97-eDt~>}Kъa࢔f󢑇mH30v=өy#"L*rHu KVmuWxN 4(cgVҖ.e}]:uvIh ӁHشbVfQqAnbҮ% al* ٲn9KSx I=:V%ضUkZ<5p "]`qE4twvVEt}k_{G>Nvǭ/)]L;/ThǞWc؂{P+/^v#PIcmP,'Wx^>oa'3۹vD;"z6m{CVAˌ{^&%/J5r=9=ݘmFkkh٭\# a7;W{UfçxͅԊɘ13[[gV^Ĺ4݆= ُ&]q\y^&ot؛A`hyú: $V|+Euvsp3o1Chbm ygj}#^z*IAe$mo [?ߞ]āC8=缆qD-!fV*>fA7U8h=j"w_އ6ñΦ"s!SQA\kοY:d?.ㅕ DRU;?f`dC6 ? Wx[粫rD~Eɭ t3)m`R]ώzJ) گ(]"""""""""""""""be_kd wwCNx$(8~ZR?gvv_J`:B|f C?ɩ}C)ڸ+_HBFxrX,ܐDNg<npCrm fQR9 ֝ær ~^3y9u hw)&_GJ]E3<}'HZ=51^CƝ4Wns&41=n4'Kyk*mɡ܋_xc{ Xڞ=炪z-~,gBN=33wkV?{ެ,*hh`3Ae_񧊝si[ŷgSIn=;_hL?ngʺw3lqi K5{va#hҺ L|@יNNfhv+Qds0GF5+ˁ4ГJ,՛݅ ":#ySI7Vxޮ1<%$CŎǾJßƴhBN}EE~_,]e9ȫ 8aZH܉)0@BL+R ٕ!WcNjqU Ӂ+9fT筧j rqyϞ΂fHjF$"kg|:/t72$u,eW.=_n>akx(=Dٺ=Mw}e ="5&>Sk+H.N(S \KJAYꇌ*jdҦG#๱hrm\?k9upa3^CdTe}%8 *I#ٱ|}>gWs>be,;G! Mccww;-fq3"?+W{ݹ'܅żޯqSIyZ<.XDƽ8ZD6uf{p雙zLcw8厗y✦Ğ1ao{2qy~.@k=Ǹm.v8Sopi?׿Jo4ǔ߿#K<B'pE'0^f`$d=cólȨ/CqE'q&0qE'z(_0dTaDDDDDDDDDDDDDDD$g/`B,G"g k! O*Ӿzjf,C/B V.e:?f:tgv~x׬z_*xznnV6Y®zy+ͷ}|`&qzggGʛť؆?)Өv˙3ZĢ`t8 iWPW|93cZt"AnlV,]ppgH왬33)m~G1_#;oؔ.ʷ;Xv\FmB{?_;UiL,L'5@d@ j9eu uOjGJ&“/YOYQާΪaF5Yg㣸f窱Zu D@`)6\b>'s鱝r9]N%_9KsW0`z1D@ ޵Ֆ ЮB|<;w3z{>KrCTtr2ݠt]^t\˙7aqR! { j.ع} T!a~(˄C1Xf/[?!\H9B!B!B!BZ6M_ʚ~mZ>˄ idz)?^GUUҦfb䈊j9Y ZC9=jB1f3 1u;:kw}*bV2]텤i*Vf@k.:>Cf>96tz|n3RS!!.(RHTë6re`4 1RSC]%D01ScDAcHgwDuaǯݚDr uUwKs|fgͬ*CYՀ ѱ(~Z{o#pj%U ̱k7_$ p5wGځDt@ŝZ4Ts1ߘ|"3];KH>zmPaĜZRUFUsϝ7 D_{Jং$VCzcnjC4k* 3WPnFo;ʦɶzhQT㤅 E/{-v~ u.#Ӫ~l {}`Rd/'Wfkyuw !B!B!B!TW'sXf16ŀֹ7wv_s%&(Q:z 1D4?oN"A5(<۳+;!Ur_UYdBY[vqjGuj4s?Ua_łe"*1PCj}bX6l11f'qQYǰfB2AǾ (àt%cL2)N3 W\!xi x')[QfU(;Q42} {ӱXbb|#FHEtc#i)6: 6JOԋ,_>s YQ!JAzeWx wk ;[3//-|t{nb#)9Cc`I$9ي:A&iۉbqo7֎O_@٨VO:1fa?-~M^pONS4y6L]G#(Wn6%]Qе _?=-9IEu?&Iӊ.|rB!B!B!Bi~k'>Y?HQ5Z7eX~tZ;:j*TE=fuCD8#Qsj5N]K!k* ,DcR򭷨?dWZ_% ^1@'X_~N1ߍ8C[^ͭjfT >9-_bf*$'AtF1?1Ə ^8}ce6Ի"ã`^A"?eXMuT Wf^X{O7ѱ2 P1m=&1@K'[z.ۇѕGO'haGHEi7 - gbyTl__7D#`h`#)3lٰ3މ( Ŭ^!T?Mu?N!B!B!B!Ļְ7}yXճ# e IDATN:upq]&TOu2:N+q5>ÿJ5Xa6EGD]>LV-+]ű*zު:I1zEy Z!tL0pgm yt) ǘ(}>wF8'ח\ V11Rk:v,beRZv3ÚNG['SPMϼ{رwwHrmc=3 L]y;E6u߰;ikݯְ2fZgms pUf1K1/NO/sQGB3`< E`6wn)hBe- x4fŽl(z;hZ o;A@Wq޼ŹzE-۟w?붶3%Rt|2hټc:e~|,GXw=i`̹OL(1Ý'c(R )**pJz{|oObr'66ư0 k57v]]qC2c_l<.-RT{p1ZAZD f/LV B<} i)(3)*Ki\g?5xXP8țQRJf57Ezn!JR:YӧⴌXRZ0Ι͌<$EcMI9qݸnܸU|fR:2q6_h\n7nw,ֈcS;!zc&hnY1E u+4vKJv3Ca..;3oB _ZH Ct :>$>uWѨmՀBh2 UYJtH{S-1$OɣpV sͣtn1EyẕfNi)sfM';i,׀9k St"S`(?tOP[6AjюKzT,ĸݸ Dr C|ԅ'o+n7b.qv cmv6r>s)5)N( 6n7nsjs?R$?3$>)B!B!B!ֳo6lȶ+ee:k_xW_K'uT25z{&aߔr3͏QhQкw_hܸC:j">2)hݻxsGzm}?ѩDw& g{ydą93?Ư)+5 }Ֆ>_ Ih8y j [EB::ߖ,y8G , ,{ <i-'8Ѧˊa"Gc\_1g_nft=tM6afZ~%\+xSއwbqudE;y䩿S/7Ҧ)>ȿ|O4,c &{1sư{ ɲr:ϧ֤_Rrkft=̩"„ R>ޙ γNpc"1Q?mk1G^UJsb)[@M@=o|燬onaPzL@mZe7yT;afR>B>\_ Xcd0%68'Nm)~wg9u69)LM%֬:k={ku+x0+=wj!! yLJg.<|ܗ_%>\ÉZzN2sɈê4(Oê/-Y!n4,΢xZm~s*;wrz9CM$~i\k'8G$e4cw3o~:i{^~`J'}4 #OXlt{<;xImeՍU Y(6xU񧟽ʙC uM/_i_>u{kO,Fp)&cԳn_ V&gdGF@7ڈO"==h[j͊Vc|S-t ,2v_1" jIa[)rP4u5Է 8әDRVE[X>. ҚKXulf4/gjih?`q8IH ì@. ut\&lZNgwGŖ[Hzh:YMCKJTRcb26,Z:D FNk$egBot}7o~10#V't:9]L_ő,7"MTD_Z$}RѣgQr叀)=ы߹kX&@ю}( d+8Qm761ZqN!#с+1MA^RMd-Sbin4*!<-5o_3ܲ =LS"%V1mB4lĥO%;9 wbnn}ԪD}DZLe1Ej:Ky=m ckwaD,%8TмmԞ/4XI;' Jn-ovd(zJTVe`iL~[|:YXcsXKϫ{i"B!B!B!BFT1>acɔd&3XOG5sǿZɾ (󟏯K_cKoiC ]{v'w&:mkwѳx%*5xG߈C8ƃWLǕ9ÊT!kf^9>EgX#8H$on"yƧtPc;[mi#DyӘj4(+hm;Gc,"'>EZjسc+U3qoEydfQzKP>P{ۿH]L1_08xp۬$R#umy}8/p|gYn,yac<پ:?Ͼ>H*ZqxG㇯}VmKOdZ{zoLC!'%--,N*=gsͶu{ #E+ |%v?-ݳOӢW1Bl3?ڏoaz<|RQ̱473ʃK32ܺ5+ i1&yi-LJ'O,6l%M Xjo-7ۘyسq'/-=lHܾUh ;[CM Rtʆ=uŅm@h it7:)Xv` {_yLE|`DscH^p?k;Лᅵ3o[r+!+nWV$aY$ и;qQxï܍jw_c\hln6KَqA1}5/HAkQ\%hеe˼q7eL =|4È3)MA/׾;Md.彷`W^ `=u o!ZhNx.AaFm q=>#UPs[*{4z}稓6R>l)373)LƠ{:+{/#c6|g}V>w$YBlTG.&ìh/c[iV[udprc a)E~|TeoYǬ;o®oB!BHOO3g\kڱb׳=Hd̙_67_wIII]1 ,XݻHBn7+ Hk™=-!<T;Yd{r>3glGnD=rpGc&6NL4|򳒉jiI;WMjn>9i.FnZjiڒȟ98+x;8SUNپ ߀&f,, 3I|t4Q.R󘖕D\Ms]#2uL8 )H!HOK '4B~XSHI#ƪ3F}U%5m'ŋWAah բ1<}uif0?jTfHgӞY٦Hht~q@p͹ I1$hxW,;zah@[ޛ- P uF)Pm+'>CrXI)tA(߹.!`Z"4߸7IANa6v vS{l;sݘ )pW%o-L6XX1$ƽm{n ml"*4t**f{Iم̚ к+9X3򃌯H͡4E9%M֭`javBmG~hx@nIM<W9Tt{yQ @O}/vt.{5kgf Py<ť_DYP;e\e4N03$N!ݦx*ګuQ}-lxN֧@& STAﯡs%lI$9^YAFUp*%1Đh%sc1z8c=;N\> lT)@-'##NJ#-85mI%m4:OU6{Uub7(ҜoZWd8  [`jh4`8itp?D Z* ?`K%UәROO~;-!ZN'\zm~x+h,pIB!B!B!B!B\75!bb#WM׆W7CFUB43T!ڪh4PH+&8X :ډr wQ;{kn!/Gy[ )6pd8SPWm=b4HG[zN2jX7l DdkW#թ@@2~̀X"k⊸ Gu=05*4o5'*he?ה-Yddae|ARcqƪF_kH602E8w:~*B!B!B!B!b\&5 ϼ2G}K/R,V zKx,k!BK+XYTTgiWтŤQ( [c bco`/łŬ@MZ,QƨU-Lip;>puP Zl򅰯jJgڜRy^g{9[oavO#8$ g"jE墳d_'IЇ/-30R>Hrn0Cݭs{cS4t׋eh.S"y}P#v}…7kw} !B!B!B!B!IDx|Cl9r?{jїB<}xFIN}((^ *T6I#B!B!B!B!pMhlwZ/Q;#5F`0Xmث*:=~+`3`oyi. W-vy.ж۱+ c6 /%Cc%81QBçUb4k3f7Z 6`tED^kky¬+]5T7&82clLcq)̙Df?VaJ#/ہBYQڬ( +3[v81lyWbc7-rnr~Ir4=__nG!y1x|V[!B!B!B!B!ĻzwwWwFmoO .RhA[;5>T=7 IDATN:B-%9vn0mt2mgG_vQ$:"Bbк; ߟ(۫qFVK; ǭD%]c}cp(zѵѫգ:6U׎FBh}M( 1=c_Lnԅ8b6Z--Z%Dkصt FbRLdr'Q.#II8U@9Xj1tCA'C耊iF"#4}L챴ӻhGRёک.(@w*B!B!B!B!b\y -<ͬ>\˿T~ +{jmtk3%8tzji dfNrE8s,~@ͧ81j0o^^4C KW47hۨnöQj݃հU')0Vg0`b2ʁ]F?5)pL$M#AN#U1v׏x׻yeg0yj;'OuZ1AYQ{N 00cF҅!2T |$kL#=]p~^D1uz&rZ9ӯb%07|`z*&@﫧}|_s4:3Jn^/PR1^ͣ -RЃm tL~Z +a'lS ɉV͵ B!B!B!B!B!<բ~WpZVӯ!nRL҈řAa^p{*w ˸ęăMQ$N͒E^4[sU,΋gFɌXVuP'ckU!5kX>9J(Z!f^4/LnZ>t_=G+;/9̺Le׻%=(@>zx2>-v!M#i4{x}w }@ht]#xdp ѫOG|(D>_%Z682{6pUiseT>jVХ=L#nx6W2gg9v`JˊD Nr/ge'h ELda]gGJNrX1z:ZMM^PLü)4L[|v:C@4M?ck[UƩ>hݼB𘶊- )Hu!B!B!B!B!3q;W-Swr)ak\\rn񩉬ܛк{:im$ >uYp$Ho:ʶ隲Qk-oͦ0+h;f Xہ oCDAC S}{Q3wi!B!B!B!L%SP\L]\K1))KS~qg!yZ1%E*gND ~~G3F[/WΣbVv#t^ǓO wM +TAYEd~Ļ˄\z֑:{ah];?a6)j6@`OO]aCkl6|Nդ<=tu FmT^K^΄xbLΎnѰ7Oͼ|A;^z;hoַRbm&Fhϱ+aa h4+wJb$^F\:9]$_@X&x:[i ~?: Pwhu.س$Gc3h~FBx">HeˏC!B!B!B!b"?K` O{D4xG~u2B6ahKWJ3 ?Q]Apn*B܈Tҭ4Dɷ0CQqkAb$YzQ B!B!"RY\kRY!Bj#ub"1Zwp2ŒYN>=l3sB !/ʼn%͙}]A{@!&c:1 zO='{ЃBTj>S}g$I+YٸmZ>O^IS]…a 5_@`MȣdlrS6mľ=])ؒr4D(X9U/G;-Y0kj2&?՛}֌)%ez[Pyd/+qX¸+h])$F6T}&/َotU×AAz M]zui Xu>2'q;9oH3S68Cȅ(/=gVfW}N]봟 I"3,aϋ?c"ɍVNS jG*?#KR>gZӯ*4լcч32 ZY%&<onYuHxEKλN(/~@ud/xxؖON%fq?#Y:|μo}.ra3OXRYo=|M~w'7N9g~tΕL ~~ 9pɜ>Ukx1#04v}j:ZDCy/_l". b5qs} ;s.g۫ӆjy|߿rSA+g`8<}Y&.,͘xo[3 _5zx?_9$.jD[Kq q㙰@4e@3;U0%LjqVH|: Um A—BOO߁'an~ujT24k,ъb|A@OZ_6  ^B!B!B!B!BߠD Z!EŖl=v5}GQ}nv{zJ]@fWT] X^B ݝy^`$لv}?_v{gvr??kͶaWf:tC(KB ?Oiڽ#c?eQ^#[Rv #~ :Lʼ:upSL}fښVV}Rx"3:xn?ŏx ؋HZ5 1yцݺHX勽~ ao؞Q10$³?4i2qk{tmF׋18>ȽIcxc3Z;_+_dc6BE#pwsOtF>!ƒݚΚ&'uǠb7pRhىչ? nژfΪ½Y'Kn:ӄtR| @ζ,~"ݓ@pyy|wP N[*oY])d`U jO߁=]Ӧ>t?ȑ/1rwrnxER|t|<+jb+"i2VHj&Mo.܁13ܛ˖R߹~$fb|xϟ,]8V3O<,w2Dkؾl3{aµ貪/mb-J:@vq%Xhۋ}#/43qL6Էi;>W/Cr7-eKj.U.W:OM~uSJ9̏.c_dB}e^-+qS y6O{ f@[?"LI3/ D0K)vݰ$bIt&P?aF)-F3KevVWm&ut܍V|A!B!B!B!8f"7@u*?Nz7Vq,Eh5:E#k4ƿ+K>j(ϼ4cئZkc ؿ+ĸo17=o֋>`iD+lȽﲽLɿ%? Af/Viw/O՝fQ^#hj7ql̞;897|1q\x,䇯ryX8#nOFScZ;_<~.x/f}'x_53wb"Cce,mp@=;Gyoygޚ?!K7.$Sz?6iW5'Q d T^ŮsDߍfpX8gi58c)'_FsM̝ _$H~oeFcA5?dƟ-3?1> yk?c{ejןL|b.ksrX_O{ ~7ݚ_}Ȧy)E]Ww|"<ۋoG3g2O[ksMsgr}?ǿI+;޹I$rR|FLy:9et\ʉr+TY;|CC)Yk$-r$ -s4=0K J ո(vTtTt\;njYJhO3KB!B!BsO6t֓޽)͂4¯d6OB!p.ų/#/Ǡ9 ޮnYk|>V#qW^EEA+Z;3[# }5c Ii9,>5zY_}R ͺ94o7BC}Pۼ]ּdFA>֮rs&fi=fhG0{5GX-㍙3{--IUި Yɷl(vtp9 Ch,[{о{8 C0bTe3_8! SK^h;i>jzֺӢW'sl^AHJw}̯bSL ڗ3A+a;S= n#WyF@/?+Cq0)kYodjvk٣oNB4iXk)B!B!BqN4ߨ1veQoVZJ^]7_41UUB4ꮂ=BUY$Qw[I[`T4 âY]x1W:qbR&>`BT<$¢ t<6.pl" ?(ߧ9zrV2-'y_&Am0v5KX=0wب)ve`//T_~!z[Y6+exI{xnZIJ×1*̓nb1IKR8Ji{H<-HHX *%u VEU)s굑dFT"'ʨ`S82v=Otncdu[@Cw'R IDAT/Q&HW4}q>l=.i04=?~{E#/)<3!T:-eVf.!KQwgwB!B!B!xx[bkYz6m(6,9kϬ}?K oR?łA]9A#ϗ&`hCKWJ i_+`%HF`jIPm]&{_5z(ԍ'-k!RPIڕaWqw( ^x{rn镤&%\J1Z+-/AP-9f]ŏ P@tNr Ez*h?+/@4l *SF^ 8&4-}8ISеL22u@!#rJՂBU-zq@B!B!B!;Ń^O:Jٽt) k ]7ˆng+BqRD OVX@N. KWv>x濨֬ o8uyb+w1Q6Vt%;YĚ9vn#*طi9~3W9Z]~~lJ9r4,<_㇯tI:ٌQzSTXtJcASC'.b? t>&!O0aD*V]FaAeU,wEP3 z%eꅟ0D ICk+bvAWҲSW?Vk<}[<<*mG4䉑S3re5UnZJum5t^aq.@B!B!B!9ŻW]F<>s9'Hm+|s9ߚLk{ͷB!iд1=Uy?Jchv֣!6Tr & yt81Ax6g蝝Kys$O'gZû0_wCx[ho$m^?Yk)8J6|iJZ9SJR[egQSm}iN ֪#yaDZd7?{ ^Z"ͧjеCʑelIy}0*TXO5R*CA!۾͜VYJB.kkh픾!ǂB4= D !B!B!Bq3DY+ם>zKPZGbKؓNU#S^x=K1\ԲfJ&% AӇ-CP+HdM5@ZU<Լmёnml/%?s[oa_~-L~D ]r_zJf8o3k!OB!S2'tsq/?ƴSCJHx*8{P wUna~ hޑFĝ7&̿=<~""{2ݹo@vh.kE&pycrbgZs+ΏTky_SkI&  7^xuc%ÉsUʫ?fCK^>p,b蘠*}Kƙ FYX:t&'*k_KeLQ#[Zq|˨_ITc4# <)шK8kP;BFx)Tϸ4%Q"K6F4r:l7<" .ahPpO J>0COFv];c(Nt5a؅?p!&>sd~N8y|2*t0B*nhʩ q_!B!B!BC8dAqUҶΩ#gRpiq=S^^tV/y}W ׳LGhՓu|O*zb^zi]vtטd< |9_pA*]q~$3,3> ~3";X".)wҐB!]X%]ŧ/ {I/auk 6qPpHbLg66r FE4RP0 m{f"6.6~E(vv0'P ~W۟h UQVʑ녯shuKe Z6kV&aSFT?|튩F$T(.4;u>)();rNyz7Icb@|4MÉ<^G1ǹw\XbΜ^XL{)D(O<QUЭ3w?;x]-w㻯> c7}%9apooO?,eD^}Iw3j ˹ЉBq&P ڞO3{K}As P2]'g =2(&"sYLLqFpO18-'q0c۷=GK z凮g'?f!VpTQ49MmX E/5۫ ]Gwfǫ鍧5g+8CVh(yK'ǢMŵOjKKJv ك0ާ2\֣_xx:n&v$R1f$ kKOV\9eqAo20u+c#A5'$ZIG>v'INIH,EC%|Xov3aCu|N8{|L֭Mņ׀q<4 y=vC7&Έ=V-B!B!B!8h,1+ ݁aA*OέXwmFB.zoĔy!qy7 1`Ty9=;1y?k~%qЩJ)m"~9S~ՏZѱK;oыޅB 2[<ǟ÷m範L*\C҉";!%R)4,GF1 頨 ^/ hB& יثG0{z(j(Ƿ%U$oMܚghOɡT$]XCxێƄFު>su|ѲYO<1#w$Qj7*O6~Ft~lN;'vmٕEq;-[*~zc>"v7QvwFjvR,U`>WmjܛѭC8*sV1kps:KQ]1*'#MlM-pbܳ=_'QmU*$Kws|v$Kzn~l}G?n};+%."?6Wu/cW߲X|0tfpiM|p_K/!!~:|N8{|4R%W.%=lgOVĶ -w|7rĐ9 tB!B!B!d=w7ĨZȀ vMXs}7Z/:cEԅ})8 7Z_7!H-gMk9qyŏ:`Vt7jI{YʋO˯:q;[J>iH[PȓͅB\8_ v˯n̹~kY+z86r+ J0o̶b?|ˋuЩ(/o@+֍0?;&cJ.fYX! kC65Vאy _Jhx(@̦zԯv|:ǞUxkGi",|\E.+ 4n #сj,bV֮X΂]'^tOfxM (&mK?&}I0 [}pʷ0'O`d14@^ĒY3xc?^;۲fŻI4{nNADc U].8;nN(B}0]Xjֽ~fzѦ%5ÙU-|}s5p+1a*ڳ071=t+y۾aʔH0;׼8& z;#B!B!875k씟gdd4QODSHutϣ˖5QODcСÑ泲#uv}ի֭k֍x"6-ߕ.mGCZj jMWg_+W?ɢbG"MI}M-/J-w:"!{^y7Wn[+W=͢6e>S~^hkcqdfd߿~jMm!C{KwxG%t4Q4#wn CKmOG! s}E6Ì>QDRƮݝc#PsF34_CˢSUˁV!͛苟F[ؗ|j cnmgwr qDz`#mNsJ8nAhۊ恞`8?TҸo1(=] -c b+&+e ǝ˄OT,-4(NcFEd@;u!e+Lcڴ&ܢG VA;̶m@M2?}jRpjcԀNt6,擟l|u grldtp^InfV6ygmcMZn/= MK9gAW8^In_g`^;g_DӐ@B!B!B!<^fDOϾ7fYQxzf~^ΐ7Q;k EMs~^糽JB!i0%X- Ϊɏ'PթN_lg]igb7_4nl&״sB!B!B!襛YP= P`];JmZKW&d*G1Ә2'>Jщ9|K5S s=.$%BԈ<+4>aqUr|0'W^8t͊URB\MB!B!B!=O^ Y+rѨ 蔟G-k$Cdeeر$ѫW/֭[܆UWE+&qh2Ye6KT;<'&[uIXִݨQU^Dn~Rr(sB!uθن. ! 4%''Hh!B!B!B!.,Z{OS6m[C:l%d&n&3LwD! }3LSf.%N=q%9+;s==mjLxkrx/ yfK8uANy<+I$-B!B!B!B!p2汴tA/ a_Fَ{X ;7CsY^xGұs< kPxtS gE Zc/ :kYi׎078̊sb?N}]S]; qF DF<==X,FEqjc٨( b0`ۏWYYIyy9._B!B!B!B!0xkdorÃߑ%s1Nf|1f >gGg15Oblkyt<@(xyy1LL&<<<(..XB8b \y*& www=PYYٔB!B!B!B!B$7{sX¶#A=W95( PRRBii)6AeEQ0xxx鉷7&< E QO& \]]#+**faд#wb41bXUq^v#B!B!B!B!Td%u!zAnrj 777l6TWW;躎j2pssjRTTh|兏6B***j}@4l6(+>>>X,BCC),,A!B!B!B!gNHh5 IDATD`p,cϾCeJPB֕!Tes#wU^PDaK8NU|" 9XrRQ,v[y`VlTsp?v%YJcmxnvJaT呓͛ٗwMDfEx(^4#FC$%PGnԺ* s9t ;I/c>Bp"+*P:E!xI]>*Ԓ$0x6_B;ܒ-2+9%qq&V(>ȁbPkC4 DvMHQuu5EYYٱjVv4"JKK\i]u˩ooo|||0LKv!B!B!B!a47_rmF1Q5~<±K<:bZx(553g,+?98[~ƌWo_W<ίŎZvoL?e=ňVQ3gώv$=_972Gx䖋8a}@s9k=}?iz~h̸c\m>b̘OH֜13os餾 ~V^5/(=eR0{zn΂,UA3h9zϗ;:xycyY5<-ܛ],I̽fc0Yn:_}kU/ZzU|4;<M%,zJ^Z(4 <C|5Cdu?>SR&]ăZc{aGy(~oB鸅H_2,@]_ q' ɣx8޴L8%mXZ\fhq{Χ-'vcXoZ|nEK>ӷu|1Umʯ_]ozZ-?Xq;~>|W? w; L/ 휂Gxg|MihOOOEIOOO<==)((h>qQ f36ֺޥOuJJJ$00wwwF#B!B!B!B!.ju-\sw= >9.L59 X.rm[`ax>(_=Kgn]y`$na*dSbUxҼU]a:^P>OŤT̊?tKxNӑ0_ nMg?э˺c8OcD{ʹ5C塭XQ ELgua0t(Xbd}f.kYCS;ϑ @e V3lǫgp9雖%5*`Z+1J?5YؿW>Lk(\L0?} icۗyhM)<5m2'qϼ$6R0U?~Vܿ>Qx>ŘYOpAZ+ 34/^dyƠם>U߲R-՞{֛MG}~>UkVc_zOxWŒFq*~_e.ǐA1um' ;2v\U?%%j0 s/Ȥ;yrC[{:˭;lapųCbcߒ%$낂yGESY@̀gH+:.Q\ |{w5*7f<ϴqPZŲdT< $&;nXoM4.- jJKKUBf3UUUi{jra1B!B!B!Bqv'/eB/pŞ?,hY6q,H9駟w偙նwM{$թ^ǣ 7@6HuPDLr'VnxD(gϷ/;:!ѪzDеN@N~=}/ gMgiD+lȽﲽ䠫ɿ%z}"ڜk2ϖ۟14~"V?bgpd82o1hx?WvsIah>#hsut?u  o[=ILG{nR/YϬ§ûoBk!~}Qxv/ʸ٫ؕrqߌW]n{ '\68OPw?O^+<+86l|g fkЗfʈ6f R+?1n[nMϛsty+mN Y-'g|nM`M*&~I'O0𱙼py]ƌY2юZ0x~]gɳ:2eҍ#j!pm04KI nnn*C;3 7Mfӷ!B!B!B!Bs9Qv;6U^>! ܩI9J.o Y PEUmxv;nNYhlz@q#4ͫ `K&-Y:O }i%}gJm~*oC%[tcp(2e~040KL TtmQV_FFƯ_Ga|[5:e;*tH.pj99 Ch,[ Թ9-(GNZ]o{)ú0tp'*}a0Ægh4ٺL2L ,7Fo5ニ4ST cNta >|j!B!B!B!a@`i`+,gMZΟtw^t `hޛAQw7ivLX_7PriVC/fhE/gu—!!+Q-@/HŅ/" q6<.u^P\}  `-r%^AX)u~CCu@ P]LN~y8.a6|V"|}}!;;)k{kحUs(=.;GBt4 ԸI0LHBq 5)5r LǞ*nCJ m'Ow9!B!B!B!֭SAV;ԶAJ`h7MpV:~g}q.nϝs3p ȖHHͧ}7tTZKz[*k[ f+r91s~O6b˶ʝpurS(:˲ HiCk8x$2u@!#aVfz^4r2 z9eGZL'aG,z2{Ю r FUH=WQK£pQ@+!qWz80]=U[D¾*`- e%(\O KVnfѲ\~C!l5!֨eBFqψ+OGE劋urD.%?y[ /}:^eXi+[w%,2/$-u*~~x=/ޅ7er?łbfQZZd---łliQ k`4OPsZƲgK+;500̸zц]X x`Gj-B!B!B!B󉂷*bXGl17vNOc|;ޝU33}2ٷfinIJ-E+ *x#7(WqC[[Tԟ t]6i6M4{2ddfMII[|<9׹5u2y}}fAz, ֐` cyXRpŢKs+n99LfYo=L}%[yu^~YyL;_CtwԀzQ2$NwwkC?1v79)KjcŴN28UM{FCcjD&ىIv:B!B!B!B!mRb^zjtб7x>ý7 x O#l<X欹|7/~F݈BKJ"kO?ϭo>K?M,dӹ#WؗGL~ rC',.wj|ȶDh =/7*6/G+cT;*.7*n殉,]5ݹ?` Rc|E)Fkwo}%_e8]? 4K0{tOOFj2# ^{i?UZ/DQf3 (:EQF !N{0T[EM >4;)Iyr47F@[k#'jh_yi&ydَP&?B!B!B!B\4:mhd:8xbƶpdN7s'瓞0}i5" R1WV-X.fm *Xm7oտO;vDa.7npשFn5 CM 9@O56j0ZoQh \LeZLӮaU %r?#t(Je58=^P/`oSWz+||#weQ`@ tX \WOk\{t$Ѻ;m/-VbTn;Mu4x`T,q$k7cC~:91p)ZIpj껫Vd¬lDu--IۂJ7M3`;'6ABR>mh-ݖTs,)i$146?="ef/8FjEQSMu V͆+EDa*&gb1rjvB|وx[i;ASP!شjnm 545`sc7cM`r&nD@gu4B3PRuiiTN߽q%0locMx "<=_SXMtbuODR߅p 帶(k`%.5HoS'<zPxZ jM`Lf: .3j:6< !B!B!B!VDë2PS2Bҍ̛J%8(W6e|U" y*c3G֐ƌ6ФȅFK!"'1gf,/Z 95{xJ8x궱X19EB.G 8*TE!rkh "DNM Mk>|1(rPAMtT tx?֤TM-dFjs43acJxLHR *ˏF=hԭ[˞01x{C>$a_C Ό *h2+5aӳ./YK $=Ǘ[4>14F>e.sf㎉I립l/mx48ə9ݬXB@󙑗Oz}lRLCWMqy̜? )6=O#\C_u1SXrLY9qƄI,]:/U7@g߶4WLĪgor8}3gYǟ7V )*ޣy:ҵP;~H}[鰹b%mLe:?|eزcI\sEQnÜ j\'V+fy@؏[b2aR83pod9LHq.l~@\9suٸa)vrfVU^CL-h\<6jA*cˎôħ=L43뚥dx/lV[(x;hԀL\1'Dj*E|к^1k(ǽS#k n wP]}QlXz)J'׾DsK>kۏ-H*Z!B!B!B!Gw[5MuQ śU7rXKn۞ `8UԄubrYȳ۽JY?]WCm$Fê߅WloWOؙLC=IVE\ Fw\471U5bjiSq'2#g's_njήXT;tZm`ҬB/Wאy-ϵp㢗9Wd2] hT| wwwcEO Nγi7ܼ0s^lzVϕؙ5L6)#lR;*wX^lc֪䆊XVxcQBAđ`ԛ>J2Z+ ݀ F Q>:T'W\3sp(:8r`;ocǮ}V1p1sWdR,] G)ݿ=R'{,\sW] IXZ]ƾvm.+i&bgb,Rc\Ջbàh.cl۾=%i X\أ̹Z516k.JgŚ+1p1v}Ѝ.g_͕S⣆KpY95iPȑC IDAT8ߑ?;}W[3ptڪ)ݻ;vQr fZk250J w /zB=816ls]iđD 4SSqvmv{FaL„\4[%^+&%bV"PkwƋ1u:˗3oh0%Sb%ss1[{}mg{9\IX4a!\5 ++hǛH;Q^FDX3]C=tq^eSIT͎;s.3+aam௭Aő sk8={SVJPcl. E !B!B!B!0E=|j2nX3`ÇxWS[x;Ya^ȕ#;v.t۾̇r,}^5s+qFn#]vb&4~r J)92BY p:5ӸCw0' ؅|)rv`nqU׿mWb>fbD'|CP⭼ס1&&;Ŕ~ȷMFH>jmhFC=:><)!G`J¨pz)ƮɔM穧_?~'3+pq:'gW Ry΃ώ\bTogs/p4&,NQ|Ğdǿw?Fc׶b}nC y_ G#:y6|v!I}Æ~,0(wqmQ~<gǹqu2J)F^gPch9v;k*1wӘ0CXcckr rpm%r]AA 'zQ:x?JqՊ`z5x f-NRfǺM]z؀-1o(#qsռjҍXƏ!]jdҕ˴Z45RrթUcQRe0&΄dփ=5^os?4WM#іŜ{4aυs9#r/C%vDMZU'׻?ڇ=pO djY5\Yuiߛoc>J-b\RU8m? 1-Ʉzu)o?=S:e9+fcI-beZbl}P 1X]IdMJ~ HNp#1,%7 z+ߥ25zbc޼*ZYƙ4d1R&ĺ[0TF!ȚFS}Cq]=4ߞB!B!B!\`z7d>˵ZpD"4k^x<7q.>Or#uTԶ+!sHqPBjX &/OO4O~~;2qݍ+ ~*9|6+MA:V*uϹDw_?Ji$bv6n"Ģoy^)9}fFvfNf͏4":>{3Tj:& Vru+FU!*ZV'0p"V9>ZY<,{ 3v %%U+8q>]i)]s7IW-櫑0 лxw+5*_oykR1~5taI%R4?x|~y 3n[MRNL$O(dJYg~0m9Jf8@dki`j^晷>+^c4k?;g#{Ji:v?g^[~7{ۏs(M^XϚLaA:B'^WϗrRy$}&c:S>;jfvNԈ3zڽhțO!d;NG4ոILϱA*sVG{3nn*Idm:?<C6Rf BZѕ,'vg Ӱo Mg]7]d\,s&&spGèn:+UMX33 Sj>1 o.!dMtkL c#el>&br{GMTnO6d0AVv";[θl Dyo0t]qtSr}*ɢ` @ DˁJ1M'd5іU725"(ٻCu@ d(ix~5_5۷%XGH^6'OzC/=I?t35wc˔Lr^!y}^5:kooV#ws.pNJ5*8Kbɚ>}c/elBU@1[>}5+!-ΆѤaV=x} K9L-K~kCM##Mt|{vr|!=<ѿUnHJ"VD+xK sMp)]T[])(;l`˿ᱧrsB]}KCxl=>z"BfjG鯶3 inM!+69czw+orI Cr6c VD{.#QszNXӎBwVƭ?Fyupu:<;Ts2* (v20Z!֟> .r\¼X /Gɖ#sT:Wql2s-32S.t2 FۑrnT0t 7[5y,쫇=wpbXUin@ˈvcfyQs7UqXCJ&tkD}T:άqITuP>QTFqL[L@%/XT XN'zÍTMfFJtl%Q6Dh9I p r^wƉ 76/-Tqb+8\FG5<{RIݜY㙘B3=NCuUu?M s\6v%>̴dpYtTs98b2Z+;{&k"vr==x+xp/  !Wo&gcO|Kf XG*~˧vB[q]`(C[κAѨ^.(qә9΀柿aLЉ[cN>qxqެW.oaS[c'3iL"Ns_k4G*,yuHX=)P+[O ?$JW{=GQ e3ڹ>;"pKM1EFJ" .lJZ'/>EE"-443TwhMWwϵF# ~0m"nxv36.xwOk wbNbEYfZG3-Nô6{sSQnb \C殮;`3Mn;QÚ +*^*Ѫh+=Dm XH \-fL}v*ڳ.fbI<2Ziq^Űn71Ϣ)D>TՂmEVYkebY=UΚFf w-TΧ;V4: 4𺗦.++Xh78{,(FcϮLٱ B!B!B!NWK%V^ˆ橤$Gf& ;iL+59dq !B!B!B!B ĮejDBm@!0H с /֥BO/ߥM氡V0RnbR:]l;maS V' [JZ{:HpT1b4^z0HPjfUa;Wح=}҂.N.X ncZ$}Ztu⨅ٿ ٫gfjv4p*m`X; ݲ(kFb%hlQج bl،Q[N036ц-F?Rڱ)' /wխީ{}` H`V͆BO6{3G 2Xo!B!B!B!BCC(X*x@):f:T\2, 8´4e'Ə!vodqtZͭe2'voNdr3q* `KeǠ?TG2vh6FV<}7ք bbQ\T㈏8=jC9Nwxƨ8RIq(}2:EQNE( ]GwA'$ǂkB!yߠ7kw4Z'Z%h;O$P=Q0%oumj&ʫCQVGk0 {o Z PHb3@eطsUqVJC,@jr nk~YB!B!h޼y;LkXĐ1u )x*iTLO|^9~݀;\s Qa-Vv\]+\;GMbĤǨ LJ73ZG{O5lMZ-Jl9ȶ|Gݡ قyqzǸ|2Z0DڨJGuPTj( `"T/MLiLrzH$U̽dMeBSD%~$R=+&gabԚj8A3Z&MN5TsDLDƹ{3Dkf<= TbƎgRKϦ tH~jj&GxfT U B!B!B!B!B!G}iS_C//$~vW$|ֽx`pqD$΢[49pl%M,OӍv&5]y_gcdU,$[ygܥI2pw€is>lYX>o 1fg5:[Z 頺r&&qA{B5yK I=#0CB\1rKv Zwd)>Mk)eugt}M4O'=c&6`=HU!<(Ή,^4\Fڌ%J^X>| ,3[ л9Q\JcͽcXZO&[&RJΨۭwP[AC=3~hܹ_6$u0i-Ni>vNGE1G:uPL\| }c*"=JfÂB!B!ąڶm9 1O!B!B6 cXƕ3Ұ|ڛiu,8Ipk6Qqqql_q.hknB7`ubPZpVٌEwh 9E4x bl.:(~CjTnYK$r5K&Ƒ5% o`+m8La,:[7i؍ DTlQY'>+crl&ڻUDbtBeDcNpX]_z=u M?vԣq#s3inh#bOH%Nws W{|yA, r]Áh$ ujV*$JtŶzZ#2n,IX,ǥ`CUQ\dʄ-Gio2+R,`MdkfbHrPMYe!$Lh [+q\qvn܇$۳1_3D&`M}F^!B!B!B!B!qu 3go!6%S:>ƀYKrd(d<]vnjiHg% JAc,OaO ݞhGTGy;|5 3g%Wb]q}sz}oWй`!ӳ0eu5lʾZCxs&bEEKf6&qI} 77 L/`\z".AtTutvNcά|28H:u>wcOgG'HKK#66`0H(4QDll*x ݏ+IEtyy 0+x\63&EA[k+ݣ( $'am46we IIm1(a?͍/uрŝHˆ٠ vԊo(erv ףiڨ\GUURSS1x<^\gD\V#t5=ph V֦f]#8j Dv FB;=4t0 FlI$Z1D'̚B IDAT-x'O{K3~n!B!Ә1c}'b/'b4ɺ`:u* g/zi`۶m'B!x}ۈDwY7|^^"-wЧcz4%>?) ~?m)4N?{.xl@?/&5mдQ~c<0bםB\ ..3JSSS`p8dh4zف=3]CL]Gw>"MzyzOC-/NaY$y0j/N׋dnDSSӈUU%)) шzG -H$@[] m#թixN0oRze)!B!B!B!=}2EEcbbkƏS!ܢBǎ`*L+*A+;w0:㥎okZH4tQv"0J6ؽ N c C !B!B!B!G>ތ~~`[xswJOUxD =_ j;oա~yؠȥB1bp8%66D/Z(:&&D^/@uZZZBnp:x<ъ`Zq=ǃ !B!B!B!}G'PKݏ#ڤYKفmꦥ RO!X z& Fjj*tvv]mv `4OUb^/`ۍb!11] BHMٖ*Ʉjb( `s+ !B!B!B!@˸Ğ - 002e gTtޫle,)3x1!:j(}o{ pb!%wf4hs5i 1m\*n*7<ϫ;9R0{rRVߣ!`+8'gD55ex7-ɳf2ul*qvF*Kv~<B D4rp:ʣIu^/^wăB|tww؈btbXZXs:@KWWEB!B!B!B!ޟ ~Opgzp;[}sn2&׿ɑ~815>z2qFtOƧf_Yy#5W1i%DIZ^ D+|nܵ"zu"J_y{[^&`}:#C߱sovv8*|o3k__Ï HY{)J2qf{_c?]3?u^k'`aj}~` O|uG]m Ǣ6wSч66¶\=/{N|?}O>^rF0ޜ/}ˬ{8 >{ls]?Ǔmu7j7}{n[8z{kx+aaq|B2h Ep:XV éʱ#yH$B pXB`0H0DQl6fш``0DD"Sǟ-B!B!B!Bq4>0wۻѮ&2~U\5-N*' &QTlZjBf'+s<#}ID%u1c:MyCBV_T#ܖoGlu*i'yWqeQkn( }Ni/qm /h+ݶt ,(=[}'jr5jxGdu{y]kK1LLg"fMualymݯ-_<~I6]ۿɧ&QF6<~r~>G~ypɷnɝ)'3du;xtZ݋I̽y _{C!ȴf u 7%䒡14Bm==" #>? )qMx3_K I!MĆ\_dBgxDU|o"FgϾ/oq?q&_4q:ylsT^h> !DB!B!B!B!BM}K}z'yKU'o>)(Cܾ<UkcpV@W?~\}s{w"JB>LF[OUuV?OxrG'b"36ܡhⵟ=˕g}7өa RSlQiٽQ«#kmL \?)Ek~g3ޟѥYHޭ6p95B̅t,F݋?Z.|y<5;|;I=^[Ȗ_񻟰y`CS" I::f=S0 D !B!B!B!B!N;b8vWU;+:-C:v!w: i:zJƊ(=Az3=ӘʘQćx3$׏a|WCАz%؟ڭ Ә:>1) beɜs냸(}”7ekK찎08!>hB!B!B!B!B~T(q U 2z5]Pj:&hgQ< iu;=VyY !H\ Dwq4va!k9sWN$"p6w~BɎVOum OJ::Z\.7{5+?&wl;_@j`$3}<IJwM4ع}q$=GiB!B!B!B!5c,cFg%&D^C5r[Y1א0qAҨKa.Sg2՟v9hܿ/q? 4=v {;ͰF{XL 'yt`Nss3csqx 1 ĚN"݃u?o T҇l;5EU4vBŘĄǮ4ccQ\[ 36-l>\qVXo\ſG7fQ5";.|=sh_6K~LEA.{ ˨ic #!9@moʒ;^ LR9z=p-:½ [q-OsswWRC f|#C ž^>rrzBt#h!B!B!B!B!Go`O^q&Sf'o_{gˢY.^N9d aiիX J[LzT^uÃ3n۰W7?ʢt d/[IgĦL$6Z+[ w l)Fwp0"R KxX'.vقǽsU!ur 5OuzFoY=< !$!nױ/o hg&jbhRPt QU[=\GJDb&ݻBYjV.u::'1p> !!JddS!B!B!ę)**ꘟRO`(:6-$!99~ @VV֠I1a֮]{{"B3;+p8ү0D8:brPX [pDŽiHmy jqcJCȑĆa[-gWAO t/*華EyVpEkD±ڨ*aG^9-Jȥo1T~>& >Q$&gٹ6|U` #8 Zs-eEy)}PӼ F&ׂhԶXT'!ęhݣTTT-B!B!B!B!89^SL mhvW=8(ޱތ{iV=`ۍ%;XWrh(&{ ״ TN[U VO|\O|BS!B!B!B!B!B!8QB!B!B!B!B!B$-B!B!B!B!B!8cOuB!B!B!B!BN 噧Cm)q#L h!B!B!B!B!|Vp{!L!B!B!B!B!B!ĉ@B!B!B!B!B!%h!B!B!B!B!B!8P kjV:LuWhfjCܼ!(XVV+?q_kk+躻t!B!B!B!B!Bc@BUvOӁv@@BG3-]!Nbٌ(NQU@kk`vW!B!B!B!B!g17zaE4,ս5:5+slM3aiDBBɄfj:---AGGY]UUF#FՊb9\Mv!B!B!B!B!BjaF5{c揦VVLZV<nBfAmm---- 4MFEjbٰX,S[[K}}B!B!B!B!B!>n Dk=AQ> ݃%z y_Q 1hL( xzziuuu466 B:ʹ퍟6 DuuuB!B!B!B!p5w% ?*D;! 3 >gP70ghaDK'XTr*:IqOyxv_bmIw8NkzYFRo/.A\<ݚ36"$]ިpT+"(45XܹپRCLJ;|bU\6N|N::ɘ<*ӺEC\eѕ<5O C i(9u\omC/3/9@CyaP>DN%-qU #5-SK%SyCJ?Ը =[-a&b7)g@f3mmmTTTi5픖l& */B!B!;2 IDATB!Bӛ1LhS$x1l|}. F, fS~5+^ͦț+ iAoqwvPT &L&ثvWe]M_׶OΌ1l^T%#2>(Sd2a" }ȡmbhmm,)j I2TX#)^NH4eZcO!B!B!B!&G{y7\;_aTwtheTVv vr"Kؽč}i)cGtJ:/-.sU:ZE;\~lS*(#8Jg;OhX{33 f,h|[[du`< ^OEu': nSWW?6hMs,F/t *ҦSy= #SG/4 ށ+Wzdc]L}M9 SPA@e-6BmZ-Nu9!B!B!B!gnG\Jdn ,?_U[B7WPhMĈh XþZfCXPT%kv{JXB,&(^D3:m-k9Ҷɟ1i$ B7PQL lq1.O%spCp4QSYؘUBQƃº*D՗w$#:+D.WJf\z"1axy svW#Ϡ` '.|ywqLnj^"YmiD@03n5 z eyTuT"I3 <89X# -e{ɯlC"uDRbR(߳e+_0nT4vj(wG(ń2FYk$-6dVv_NWtDیDuϊѣ*jު$f%96 /r 7!I;b8CWCId&%تTu߳8ZtNLbH'4u _x~CILgTt0fMUݺM9̈́|Zٵv5 8neBȈKM <lXMq#NNʤ ągj`ŗdkGv_$&ZZN żL "NJAkؕi# D3Js t,Iӻ.b`X蠱qж؈L[[(*I׀h-dF"g7-lQ \`0`4=Q;Yd-?) a>7cw}]N!B!B!B!ęeךYn => A^6}K\u)r0&s_`]omJd~ЯhL>ޕuG9^OAA.E8iuk4~?{UW3Gx(cwJY\2D}{D `]/rG.B~zosYS^FF5Ww$Qcᗸ:F'nޜY<+H7tw7rsb .7ٱ^9:7߲7RyLn/XG}J<ϵ'ڶ=_{>Zm<:2NޓI9oUR\sq>=k]>o1/=i1~F~gp|NЭmy_DebG"̓doO؟]WO!)!?;p}rF~7|f׵W%85?UFϻ~CF>Odr޵0Ե)~֭=^gj^b t]l;ż}U ^I Z/u] |}}8Fv|Cwf/a1$%`53bTjb ځ l#TV`G$1< Q3Oˣ4&!B!B!B!# h5$D\~|(pĒ6&cnVo"w_9-fK~5N;R~\ݟ}U~)߬ɥEt깜?ZZ TTgKb0Qw,&BGNaֹS=\nxݧ|:5af23%}#<[W.a͞JC;|G1g[_2zz*A/LniS*3A;Ȇ/SwSׇ2t%#zp+˗ob:3>A%싗eߧ9 D qQٌ봴 K hiiAu, !nVSQu03 ) l:r\[N1j9o?u3!܄92hϽ>[K !B!B!B!py<2;+aGYp e뽏ANc11QCs4TO}^DR*z5}~Ki!cyygoCД_qG!iLn/qtƻ{y°+ugI/CLyuˬ^iΌesO߱=)]03t}_w;xO+@RK1y=Աdd%5y" 6f[$F26#Ćx9n $*a)icFJb6s?ɤ #} GchW jLpp0^c-H`p2Jh5^&  mxAج]bjȿ@oSߗs;f?cGuF%ɱfbl7\p'Պ(juCt]EQ-9͡ 0*>AxXR56tRITE#AB32HOI$6/׀ &͘9ix4^_}/Z= +;oYTo|z>ᩘ &88W<ł_p0m}{brN7l?2Ĕ4f%5%pc]( VlrWDO&-#i ³/y!B!B!B!ױnQgrgD5Gv+9 CJgym}+ʔOZ)muiϾKb")DݹJą0'LEJ?9 Cةܵ){ԐB 8fMDqA 4Ń+c̨ڲ{V: C`/e^: o.WŸ?x|[KDh5: @ uhj]2>mc #s*W\qs04V0'.,Z_>8 *50Dp TuˣmK_j~tA*hşsu_7wѮ+xIu+Γu C+ ]aemǒj E gb;xD$<܆NtQ^ӫd`{_M߽%Z:!---XVf3MMfu0)(&&ZO{2cx/ZUyXn~W|7#0u||p;+VEd+g{@x8aiq=V*6zjz=Ev:z!9jh'o;Oϸ Ai\<0n]0\HZ]g_5ї>J }hO֚V73Is4sgcl=󎺽n5{jB!B!B!ݴOyKynA8 Ocq_%Zv:6!m .iM6qĘPG a9)ni[݁i] uD1ܡ,vj荬{lkmӸxyjR9w0;JL\|'W_l[`G2$דS61cX$!*8Z90iZ fEiB>"w[h64Fy|JAiL15TG>_}yXQtqFn8iXМB Dpsm' g(S6燄;C֞PhbkVW_l1g&`d؄LU7Nz>/2fiX+c%Do35gwٕA D۬ix1x LI`L|7=|BѪ\XoTpRЍV|B Zb%j,4峷V݌-"`Odpz>]UD93H 4hT̀W@q `oHi GHCZ U(Ce#(b6_<mאLfLK$ФӸo-KVPF3qF$&JPRӂn#<6__fYYn+7dn XЛ_-V֌厌 pHtjvhb Kb<\Jws\ CgxWu흷F_~xv6{LyßPԖJ,VC`Px8|2M,\^)OœfqN* _E_X qQc8oz1'zC` !m,Pt;% +QqĆy<|2s|-|MU'rHo0zk|ό}#HA8woXћ*ism#;NK}ET4::+iG3s^%EwR¬aC0֗W\IC5 !Xtn 7xM!B!B!B!iafݬ;kLf߶Zv℩~ ~!G!bPQ g}U@3?oIq i6aPL0*}RP5iC b (hnˢ|:1xX[پk?+ W>B̂|VvL{3'02&@_+b0:>~>$QQ\ԛi 8J84W-VlcD&CuvSxҮ%0NlOT%nool w'!#HpxzS"75XZCT, eTmM]'ubھE.znv{zWw+UERk&>y ObbCPvHΞXC4@nTͧiO@;[YN gY~[ y`*y-N8 ݝ? I/q cQSs9nOS٢x;? %w٧-l8̖mDMnjx%m?;'3MzMKٶ+ HbҘ">P~}H2u"]U=OtAx(cG1bVTZE5 R6}Gھg3a'aiIn:<֯'lB$Q&6Iݫr<3<†uj;ntfL!3qFp]G7;0pN@8/Co"LJ{U'mG,ޖM؆ìICK"֕}ƛd0!;۾-e {qS=50BwBRlBћW,ϭ;2kyʈƔ,ROoG<=2Q&[(޲Z[!f:>W{ l(^ L ,zޞK¤/3'éo7m!+~iNRvO?B!B!B!⌢-Տ.' .>Ƀ? zjjhODFT ;aSTW?#8rehUٸ/?|8M*GjL?M㛧7&}sΒ)&@h@+8@+" IDATnwY1[C>ٯЩ7r>%8m_ PL,'-.Rm|@;(~hb[--:9 Q}Jzm >xtt-R{}j7>sR܅t*>+54UƵgi+)l#sPlNl. C!dM;uGжUT<< Eʈ0LV˖7gjܵldr7CPm*^čSGvVmKײ."üwCMp_TtZ }04vvbSL("Wi|e$;ݐdoNS:QD*Vn>* 5nn.HMRYuNQG43:AKV^!B!b M0ˬ]vz"Ǟ'B!cg;‡U׌8(LՃܐ|ҋvٻ}k~cuB%hoGM-/}>ۘ~'uUBe@(G|0zӧclj #g bĔ1y~Gnn 5AA#&07r{[x!S4)Fڋ㕿MTw(A,x}~1 OơeoѶZji d}sJޔǯ-eq\:|Wgǔ}qN=*H62CST׏\ʺQñG\nC;ۥ]hA~ W/2OcbF*cRFϐTf_??8o'x:@2(z v9{N멬jG` D!B!B!B!D+x]L%s[8֣tGcT V{w^0ƖWɏ:)h/] bڼ ˞w/,Id۫ H%8<ӤaKy/{)9fk7җKeW-'rQ'quSZ^?t]T'V|L)s` űo8?w u|lOt+kjj`~pcZm55:@BUxDVWӵ}ME $$kkht6LJA*85 ]ըSS@DŽL NWW ~9j]z8 Y xI᜹?+'8[n;?w@r&wK[w)xcQGe'Townh4rw@ΛvqrM? :zE`l9nr/ZVke贃Z0T~N@SUY毵N'4@UUTU=eU9[sWkpW%[uR,ưHB}1W'|4{h4QYѪ+_)xlxt]*\SGe5za͊ʳVօOTHHaHL:3YjZAa󱱢WSQنhEOw Zok]h8X'B!B!IbIg!Bqr~O\4GOղ:h!&X{{j" hedg;ϒѤ&` :!fyv҃D;ٹ,g`MVIwy<~9En{Zsw=/Yza&_? $tͭG'2 Zn;)V9m{ّe2uWh ݻR0&1a7_.m#(#E';)Q NAKR D;ھ'SaZF2&T;]c,cFN7ȫ%&D=t+{I0t 6Zc>yNU_wWvи _#|^kb$ ej<^,/pCzR0[O"́^V,X͝B3n79p?f̦^ksΨAH `}CJ˅uZ[:R̘=xmcVZ.ٌ{ Phb%٥-(a$w%K c biinFڻ`W#-IIG+ fcphfDZ_Ѓfop+} " :xBkKgY v8z%B!B!B!g͍4*~\ˏFyXPp?M!G;v[a%/۰K` W2?~v04_Of8鵬fM:١;zce:`0ͽb %!)Qg _ e7OεP\TgXuصouL ]ěLfVnlBȰy HtƬK2 o_%|el.z~|M }/V8n@d܂yί\DNU;\ZA?{G}5۴je˒{/b b!Z|ors/$7MI$@ dYW]Ziwg~ؖ%YeYŲskf?ϬfydgkMyݖy޷4A6{7dxɭءaUU?/RCv,WֶWkݎcj }-ժ։ah}pb{fXnڤMg<f^eɩ94/({: {J[;hpx/54A՗W^նdոhi' .e]inm*|!=ȣzO'ԓO> Eڏyr6N0z?;,MCLIbt^9ϴ_srpETsS"#K'z 3vlл 51$wRd=YQ*Sk?lN\rr%Hv6ʔM+myNyw>Kbk#AY6Ǻ9[  O-ݑc_dDՇY|}n%TXyˎfYD-O'wZPT-'1\>cQxK*Hμ?S2ݧ15:nCdi#t0lɖq0=Is>37Ti Yuz᧴?dɖL_53 `joޘ!LUW:}C˒&BbvL5{rtW۲22+0DdSzh]Lé|[_f:F̜i}J Y{oO7|H,1AW:O޳|wҍ__rRݧ{}঩rRxNig!MEVֶ;;< '"EGIjMbJIڽ[[ ҬVKxe_'XV[Qe573I]#ꗵpәkHMnؐ{"\ c+i:Qk/Q!P] *hIn[^O/0< h(::ZG}>7_UھqFh͚#Ozę12Qٖ7Vaw0?8mYxgfcHu=q.nG腥`}c8$pus#Yfu32pvw l$!+C=.Đ7{ToMìm5zDj5_٭ENQ{ǯΝTg+kDMh_m7L `}z쯛t̗o҇,v4%i1>Yʵۛ p5GS;57W*+:-O3OG#E+ثZ3FG]~gvV hW?[y*ڒAz*Ty5О}UQ"Si2:^N^;y4?SU/Q}>6k+ 5?ӣvkGqʟY=FUuȓ[;CK,]KF4kd_h5mIQJʆRJ+̺j;^j;q[(݆M.C_e=Z5ar*%-Q>o#&M1$S5g'ZZZdYn +xzan,Rs^qܥm4ǭe6F).lTEESZ#^)yQJjnpSqRsM@-VmIJKqp5ݩ? ZM 3`n*D ڊD6BdvJ^sPBBl!mZ2%-/Y5%]ѩ5ʻϢے!)\SڑrERGX'z~TUSz|f,ʑdl:|@?Z4:w/w.SN|\s~?_BE_k_g$*ʗ$TӑuOG>RDki'Ǯ|Mo_nڷaW n<^4ZQbFdwXj)\Oo>[Coh`=bo<_lb2hA$Y nޮ~rzG_۾Ϭ/_ ]9Pvg֔~oxU{ҖܭݸPc4ckX ԦkKM|>}hv-s1Cfwݞ6[ e}sʽW+?!W=ݶ mygzO+x'uoOߦţ4yA&@f\~n5蝟@_1W|rzO?Oۡbf[}{?_;EcfғSx#*8$Nk9}tJVlS6C23wZČD@cuXlUE3ky0233IO?4&Kb3k$i|L?ؖ7^i>"5;s甆iWKGگZ{445o~zSa[#niRg*9Þ+QrYA^^C46e.]2K/Q$㔷*-+٠_.okT|ӴM<֜-j}a^.Z!oq( )5}۰)a aFT]Ϯz0x_skhhZM8B3ܨ'0ުg%(:[JJn=ܕUrrZZZTYYQ EOZOͬ{zV{oK~m ^Կ6),Ɉ+*ǵ鿲ܣ/ rmHf`~zj7a4UUˆ7jaKҍKwos+k|PFz_$ͼ:Hjإڤ}Xj )\xyϩFYsS xS|ںɺyJuHV.=N/mWO*צ'^ЮNPIKdT*mFpw_lה ܦJjjPTXM4Z~MueڿP)9|$E;L6שPӹNO E%hB(ĹeU(ӑTR6WWMQ^Y eڷ`S15!+YQ5JU\P|cfiqʈ%pT{vUEo-o)X6P ם[zNPvzZ_#E:X1M]Zhs;G,ݙY[he&L嗇v4ucS/SV=V;OLMPlR-l-T%쌑?;WiAذ;j-91Cni6h䌒PA^{׼p*-1S.'/ѢWV7{(ͻlv ΢om:ZVvC.Q^ն?Zfi,,KM5ViӡZvtu(TM4%xr4jys\]JDʐTc?S}}n|>_{`|>_{ C.4ǭq5ng -YMjӵbZO3gj颱򪧉ԡ{T=UZFۣ'6g.՜ W#*|LvUhT9gkټF5<>[x&%MvǓdn< .7NY:9Gq$A;SDjPIIf$*j,] y:}w,mõJfmj"ב܉:D \ֳPC&*?&V\jwɘMlA*Kc7k)pD;7lж;+otDz=JHI2[U]Nk6V=.{/56#YqQrm,lXOiޜIȟ#smRifmR@QSSt+ *ԨT|񣨶vPUO]֫Z<3G(s|J$xl6UucWhJ#TUEsNP昄"M*ݱQ뷅4e~ޠ}kWs͝:FI$e:#-ڿm-PЁH(UVq^4>xX^^/ҹLE'Kǯ^ܩ붨v՚㶂:E8]rҔaMiuQu=|^~^3Xťf+T@nڪC{&0233IO?eI~ɰqAajc`@\JEKV5T]2aKT/FnMfMzԫ%܇#_rQrښTgɐ3&I)Iqr 6֨AlnV]UhKVRWQvS`558)Livl6p8T[[ANh%qH5Tݱ{xSjkTJ?m.%%C!kUUݠA?;qțWrGNTSڠg֜EUD%'lkV]uj[}.NYYY.?zUp zY41D`0q\_N*I*//TIҎ;&2|Iƍ0 yE1"nѢETN#6.3X''a=+fN I*6 DlETI}e?ޢ m/^IjRIc?Y$ڲ#Pso" ֖*j@t*::Z~_lr8jjj:ВdT}I2HE5GT3PEuev00jp`8k8]9(Vю$)Ts`0Y 555p(55U2 cXwzE2`h-$WdY ^7h9ue),m#eYVmml6.{Vh0zl6~,KΩ s"@jQiWC\L#;^2,{}e )Ts@=e)ѪdWnH+ v+99Ye) EPHHDy&.)#!* Vmmmт<<C*#IjmmJπ%KFUEh*TYPenDW04W֦ nvL,RKKE(n -6?/l! t:2 :y<~:th#$s%g1ޥml:m~YUU m) _c U3}Ƀ>CgEy˜<їaMv4!ߥwnϗn~G?SDKdW yqʹxLِE䵇s6e(`P`Pa***JCv H$H$p8ܾxZx2( SU,iB9'vJ ~ Ñ#G-PHGpRYYRSS*55g'::Z,K]Y3Gk ysohStD͜%ӵA((m:Z#DxGnM RGZzxu dOR%vTOn:_79[qFXU;ua4{bؓ;sf:To w9#!f̜!{$ >e(%q0,RSS`g:"XE؃ Vwd&r!* DYYY޽{=hIJJJ3/LAݙgG~WCѮK5E?{\HIs-8#fNpnJJJxSTjiiev`H!#߯tIRuuJJJllބ>S[ *i>f^xZдtE w bdff$ߟ>0 eff*33S@X ؅Tq:ڸqc[YYY*Fۭ4|>EEE,KUiiZ[[$Au2BY0 m " `" `" `" `" `" `" `" `" `" `" `" `" `" `r:@mܸqK0n/-0$_s*,R0T]]JKK:H6իW0K. 0LB#o`08e7s* ÐQjjJJJTRR"˲l3:3cϗ$ иq㔔$I*))Qeex-.x/`3 C^W~_ʒQqq1C`]z1!$H]p|#eYjjjRSS~{.V}lVff$|FI:~`/@ZZ PII  Ηp!jllTII PZZpW|@40%I\ p|>o+?yL 'o<̕Ηp:y5̕矁<_& 0$Ie s%e\N<p@/0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b98&WL|q1򸜲LM Ԩ.p3\JMM/>Nqr)KXMPpֈD&\,KV$`sj*KudSy31JJKSzzҔW!8* v;w6orhԨleg)u%+}&[X(<=Kq S5ux.e=VOeܫN֤t:O}Zܣ?V`5uz42l!gG )?],د^xIM oN3d;gQ uݕ9Cáش]&}UOXZ!K Zr)ex͹f}ݷm^It͹ ]PlL]w ]I}h]5$.\Zr 5 ߹p7J]7{=0Xُq.f2ɽY_ob>#Ci,VמҦQi1K&੝jMqVD*>Zs(#_fJw֞tAAӥd%u{Μ^{2ոw^)px7Ss'(C3MZUIcU7Vkm*wD5 ;1an^:ŧS mJ\L]ku8tCե:s(q1v5ֻSۛNOT?IQnEE9ej 6>Pc%e %Ah')[9y2[jU~Weʩ$EOc֪<ТvO23(PUzz|\ߘڲJ|Nu$ɈYӸ'YjVѺmڰyjBx/UVƆ'U 6${bNeţs,RB/עgR|Fƍ,bcjSc]Jюu!҇*;[ +3!J_QzX%:̿*8T^M/GfOJq*R@~|ov6> m? Ңtթ';QI^Cjj8\Ӆ hv|DݧDMj2eNMBcghnTɮ z}NUԝ˯ҢD9;jSUf@nS-}/[]EgjƒK5oBljS`fys%ؽhכ5zf^-VVv \ΞZup_莌Spf+'.UeKA?~ZHV[={WhO͍oGw@f }:ҶϫX3WMnlҡ/g=:myߘ݄;l}@ZpHђ)gv6gJ#Fӯz者kԕ+otBåIWؽ.\uSISbʋ.åqucF=6k>/1΁uzjI=r QK.ljY*{Z _3n~=6N~o6Su׃SuڬyE*C5&}_Ҵ2lY ht _Cϱ[yiQNT5 +[_1C3}RH]d ŦiLj&/_`(\4h#6K ]"zV;`֪X*uj6&+klR[ʺDN.ԓ;\p.9-VsJ!}dk vfj :QiyT0FIQǷdx.S^1̿3bj\Zwb4𩹯l35;K cR ChhQV|Zf-ʦgW nMahjU͡}*iU,%̾B`L}_z_TLW-ԘX %֧wZWya(z<-ȋM695~_}FwzyoߛL8eM qw]^߮ ‘5Oׯ=F _?8 d V\\LIݥњpFuj8\hCqMvB:yJN&ZiOQqN\ ÐahYP3!={_v1ʎ8׵DUuEzcu4Y=% Ƨuzq"S/\MUdO{<%] Ä7`ϙޤǜzβ:99:ٔ~'n:jV?Omm;Ϻz8=6mU[G rTy"왵X;M=#DZJ^O\?^]t.r\ zTyTZ?G|Tp(w2XEKD֒P]1jѠ` /ª-xE/l cIU)06[iv;Έrڳ)>9I[:|nmG$4Yv5-=VKKU !s_/E~Tt +ߙl-ztw Cl|ZީwT:V}}C:y&ʛnų4)7SI8ˈW\4+sl:56z"uy\Ӗ NWx{ܝI%+q>_t7׹mxE*_Z-pX{mvEE'*%%^n: ӴhBTshY Tkv6*WCfΕ>O7ݴP=eQQ.uzլnZFԩj+O<=>K})#P'/ tM5)ۓ٨kֳEY5~G=óo|D?=`S_gaeo'bb:?֬QUM7-6Q>Ge\3uEfjoH D*Y( IDATM}dթ8r4?\t牚 &~閗Ch1mZvus'w?~$F;_]=ncdUZg|>FWsxT D[j9Uo?/˒eԠrUO+{\K5W0lJ21Aή>Hp]!u+.GHgkWW 6߹̿9ʉ0HZ;^ZԝЅןהʒdYpP [=GN횢O~ah+[yOY?*-P[ Q)4l3WZTs:6\>T."g5!UPoNm)9΁  DK{>liyK7wУK3rdʧ<-NI.о}-3'nbf*^. Kp╕+ݙ~egg}gjaX}Jdք^}@HMROJ>}<,Ed*=uvF[lѤ[*}͘SN Eny r\S:mFOlסIW#BQlbc]'zK25WW]#brS?1+6j9!{*cs(DžU|tE=mm^KO)7_[T!KyHOQ]i԰+q WuS=d_wԿ9ѕp)g7ewh^k0\'ak882>2~bf$"hqztY`@56҉Fe.\e7`BdͿEVSa֨:`JHFߛ&ޠX(rX4MVŦ(/o2]Tm{y4TnzJ[_x]-]Go3>G[:Q՘JnbbaYWTsڭIlBM()ժ3οm՗uռOO|Gzr mw}O RYȩQiyOݫ{?~!t`\5|ٻ Lﹽh  6)("%{lɒ3&N*T*T&rU>$5$d2'8ǒejdm()n 7|@c#VQbUse-/Iǡ.Һpaڌ{` eLɣ?ݚ#w\ضg跞޾R-?׿޾Hu4CDz_}#OIӇFV2K |'%,GslyW,-2QKCW>\V=?Ut$~ZvpLyߘIy?Ͼwwe2աٳ|_I_N;?~uGW/-9kʋG%۝rע/;}K=7pq8|^n,4)`:ŕr{,aQ6΃>U{}*sݖۖ/^ҥYtjN;qa!5IͧϤqּ,۞֖Tь DEOZe7mt/s2orBeW>;*ܶ.+浤?mJ_ҷٟ;/LU7?'_̲s&(G\ahz;gSFӱ;{_fޜY(Ey+?)lr|7-ˌ_ndpi \S`{9~`o?p$'z2ZiNŹUYrN0ezMukZjEr^y{{p}[-=poVϮ>~5GVυѷX-7/_m XGn}3nڕõ L] :BK)sɜek.lMcZYqg^fU5oEd\~<9p2[c[|$}͍o(4rU +rbdqsxoFZSf<+_>,}'f-eKp̴4T}"G}}MhrusmYooMS}22Нcgזڛ;s|a`r+Zg~l,3u8{nkvnKpqQfPvw(kiZ{y{2{}~w>;?W囏oOO̸ܿvv*Iʁ}yrLYiR)f< }F]f XՔ$?66[7;oʶbb$ 0Is南YЖ7Hckwv:^s} rI2w~5Wfߞ9_=si _IRvp@$)~2eY]W$IK-jD9a]>nX͵NtW%LJ>?ziFp/i>=.Kc,ܳla7՚EmȽjn[9'M7ɋ_ߝMkץR$ev=. 0Yݘ7as_]箩,}WʡC}~2GϭM{W]rܱ>IG7΃`BTj_Nl5y 'M+>/^ $)Of{2$)2k+.!hz"=:SE%K6~&bM5y~wǟͻGԢPȑ KZ$uo<؝~#So)atU`b\B?kqڒ%KjILC+?Rno-gozLɤoI˙ i;'[_ݜ`z\y \HKKK/^;3˖-KQ\59\+- dد#we@fkv /#6 *so+̿C5_}"Gs'΁qg]oȟku)܊Ȍ3`,]4˖-KKKKvؑ4kfT﹚d(Igºʁxm9U>4eΊ ycS؊,X4;Ů#WYPky4#}>Z?/ZW~>;}iHRez{{ۛ#Gd͚57o^ZSa]f``p\mI?`y#}?z0+:uu)h`| uUv~s6)K{kcʑ H==>  ӓm۶;ҥKsȑ k(N46&M$9(dWhV,KRMwWOF۱5tl+:LF===RE/^\8\w VE Ӝ$գٹXHCCeQRcCj'hÇ'IfϞ]$\>ufUs$zټ}|4I]x+#T NMk&SjQGGWWf~%I󕿟Ȗg^ͼG~-Zo.:'oܐ1+|>ddU4-Jsqg)2C:z(`u<B4\RYWW-/\~W3YYݒ{>wKU27ߕ~-*fݔ{>+ 9w_z&?{#6]R=M/mOoY 㧮mI>k13jB4@m{:~8õ03Gؓ P3o?~+: )Z;HSqP_`dsxIϝƺEq:QgH`y5Ůy4&ےM.^f̛oHJ|W.H禼k`lQ%fϺp*)DpQ+VgY؋ _fXYHYPI>t<ձM \s5Ⱥ[oɪ% 3gfsjrc_vmݜ{3ZuHkԍ̿17~5ǎ_ݔ7.9SDʬJQ-34x(]L>*hɦhʏ>ڊ̬{sfUY9Ǜrh&)i`t0/z yn]T>skϣ#)HSsәCCщZSTKwͻ N[c947^ }Z_[Fw^poJ̙iH:e_vnږ2I^ph9hɢh˺_YY9ʡtpyeGέew禦 L^Ⱦ1?i߰18uSq uuCF+zIÙC6<ŝ??dtSM>߹(ER4پkWѓO}|lq˥ O^ }e? աOPhhI2oAv`^3~bʡcӶhR:fi`\ ݒ'jW^[&VȒ\Pclۼ+O`B0m(DLi958-q2[I'wT.H%E[ZR$ 8ʉ䥽:璻0>t=lH]ݹ_B0= 0IT2S_K2|ōK9cS/SWјKdliL]HQ\bmX5G. \+ DۓjTIUI>T(Zƍweѥ Jf'}8!@gdG P$'h2Tf/▤5uK%Cݜhi/ݙuNWu vѱbs|cϩ;ϾCx(gnW`RS,ʓٻxNuusGv*oLnitnޔ- oΌ"I97KTrʡܷ9=ng[~,+ӿGӾ|Cc/?q 54 0Gc~Mz\f;G;;so6iH̶3ۏ~Jzt&@zNɓ@`~ke=O|`Qd{Gjv44829o8Hy{rêY}=YcJ4r%LGsS]hF$EfHÙG IDAT>h]ՋR~" \P"I2T;t]ֶ7%u(3sfC`"_y O޾SSSɌTT]9UMUyìK%Y08svuZL7&DpQC'OT#: fvz4:ƊIe^߸< fԝ=z"GNt\)h.zh z̻)IFot>o|Ąh&F}0I˻oޖ"I9)dwV7oRޙx3/SkI!+Od3Od{_+w_R [k@Lh~q@B{Z'`:GeB4oϪ;ΝVfɼi+3{"wC)k(DpFѺ*|7qacs7Ϝg YwMG2\pV*iljJSSS| |4E{n.(C23?rƉLdB4dQwSgMC"}oN-ܝz8/|aXw瞕͗.CV?!ߔ.Ԙ!!F% g<7390B~eɚՙy" Kn] Ȅh:\+e Ru.`(feL͉ms>+>O,m[Q7?%]#5  p]OggWI"3-JAm/hֳ7ɷ_Ϟ==<~ϬhH[[S-yL*gW?~NÙIn923"ZE}i ܟsAUWfI  0)i[6.W*~An3Sftx¢pF=Xؚ}80e \T=:'5sfժN.{s @Ӫ۫.{8_Eّeds)DLJğѷk&J|T U_Lewl}/EC_z('ej(DLՃyJu"`:O>k~A EٛCvPsRuJ!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!)K!k1w憺◿[9T/B4dQʲf]5p]v>V]KP㜬Z67-eewF.zB%Jѽy=]_ הB4g4.+[g~=oyfgܙ)dh7p5*P# ЧeʏY׮rSgޗ[Z/?ڹ~Ά|喙F@09:c}; ZVߟ߹Ԕg-+Ypꖨ$Iݒ[3)fߚ/|i z6=\B4dQ޽9|Ef?{ћF& $p*gs`:7W7LOі7,w߶4c7,+z7y=G܎PC ֖3}2'A9=zyo'ۿyw5&I̗7Q$Z^էÛXoh8C\A]}N\=o;S>Lg￙cg&BWҾ|eim LhI9OWڳl̜5[K+GFbjq}DٛEi;s)̆,gnnN4 0 dL٠>K|f =%sGƹg-{kD4 ({>hΌK՛9ާ͙p0k+=|(gطElײ vsDN& +I*lɌh%VKcm؜MdPپ֖}ٹ탳[]\9tY̺Ԑ$){SbjI!`*({7sdKW &RzϔnAh)bS;uRcrfU͡];s/}}}h;oND'Ёw?G288x꟡\pM\1>&}ˎr֘`ud7]9>\T5y>ّ'bGLp% SJ-y-yQ`:GeB4$S,Ά7fXfpnݔHYt0(DL"󹬝UwYjM.,||{zdƍSIR+ϼcLCZ`L1+?e32{Ī$I]!޺!ykV& hI6-ôܼaE]pʜ̟^'ߐLsn4cMoJ+;R&Iќ扎 B}pJg2Ŭ[\V7)f>90TMoOoH"3fT/o hwWzS?WS/ʮټoECN822:vf`Q$g4M`NS"IƦ%(ӑB4d1?/l{zʤ[co)"IZhQؗeFG&:-0Mյ +Wgu,lu"+/`bT2K3{/9ϿwHqE][dMg =ݽ,7p+ҼhCWs9i:IMH^nZ>.")Nw)L hɢ<ǿu cg,]J:wMeq?/nm.: I>)ov&RrǷgk8iZ|2e$Iy2[ޓ$IY+Wf^qp )DLeysHeccY- NS>v: p,\ N ݖ~x~orӚu3oZ S=m?1.tY,DMM7}\x;Ɠ3Ppyٕ]dQ%)ZZI 0YDz/e{s$IhSl9㽼?pՌgmhOrIpٛ*l`S:ziŌVM`b 0IUukrř7%@oN][eω :$p+7S3+i_"_8c9VEucotr0)DD4֍m>=:SE%K6~&bM5y~wǟͻGԢPȑ KZ$uo<؝~#So)atU`b(DB|揾[$#盯OҒUj~k4\EݞG6/3ycxBb]w{nk-4d_ڟK=?]fr][LC+/Z,\3ƦCOO;T>hZ`0M9PQߒ34me=,'0'ӚB4@ ,Xcw IZ5iөfx7==}QP{kX jD77Oٝ 9d欙9{#JYr ^&?}m[:GN*MbC>'~9 NU~#GwCϧKU{ND`SpE eNJu;=Lߖ;?ݞsO7طib]_W"QPg_e7gú|񼴷6@ωtؓmnCKp 5PEZewNvWJes{s4+%' LkؚW:ZG;ӫ>,dII !M6QVQUVVm]+jkZmնjq+VdGdQvBHB ${2l1@(3뺸=z/s|vQuLS*1~\6)6ihhxkԧTxZlCj&h^W捛vn#83!I5+U[ߕ.|S챕$YqMMk` ڶbEWdL%Iew%s sOOk8*w`]!E[Ff´9iQʦ7W Xtv_hI=k|=LYjߖMkWVݟ @!&kf3flF~E~995Ϟx qF.|12bء9Eeyז3r=+}F~ϟ<'չօZ:S7db8낼iiuX 5Һ\qt:~UGQ8 )D̶,{Wߛe[:k`)gIGf A} lmYy7eĄ0jh7֥(Verx8SO>'g6"wg3|!uQ9vP_f9}쬌o꾻oɊ8(DնlxlxAvٞFܘjQkv}%sмrk/)'ǿ}U>H?>Ԑ&X9^`_ {T 9<4)Iݏܱ*X:T΋$o޳a#n8أCƞxΝ=e"çOJgoԨ >W_YC232u⸌ڔMYbi?/ oMWC"-ÇSe̴L۬[VL6qg2dXU2m;eg(TK!)Z2к'}7rTMÏ=)ߔ˯;+j:wy ~RN}%볽se|wy<13e4hD)D)MrkcF?܆:\01۳HͫV!=Q3skfEmi֞)̓RyҙkVfM5I2fȞٴiB4ܓPCSO9G?[z"&sO':?z~PZ͐=Sf L89'7Ycon睑#& ~{roL2[]/)DW۳B0(Dc3fSۮp}5Ũו23dܛsƤ1cxxc탹҇sǔ5L;5m5  GT[2{pZCa+rc}t}Ʀ"MH=?>znvzWQTӇNulyvs]B00 GT;ӕE}}t<Ɖ=cdԋjniU1'Lı#3tpc*EiVe6}E!(nj2CgX%@2>3ʴɬQ'fŊM ~RЩ'3ʹ yn:ʺ; }Du㺬JFUʈ 08Yu5utyyq-`4EyʨZ'=:=V=y޴g?!άԇbL>}24}B4@_QṇOw!gڋks\ 813rmhZ`jVͻ;{^$LYɆ'/+۳q[rm)k;[WWƥsNueE.ymON=:۳+r]gsGM0(D!{ݻA+JǶYjUֵv& 0i:d]~XM-#zvIҹ=[6ƍrOΤ뿓(7B4@_׶&?)HCÎjI+VfKMMQs}oى9hjszb,:MT} Q\ ]JWHCssvH{GejOPKw hbs}C}$hO{ؤY9lxwh943&uQ4eІ@o% 4GI:tl.s3o Zڶ4s$eGX%KnuW'Rݼ(_uO?Ca%hTX IDATo*>,cçdܰA):d뎹y|h~w|uJL`w3csԬ)8zhʴmݐU-;ʼR:#P`ejxro:&>&6;3I~~t,%aܱnZuo\c"'N(OI]&Μ{Yrn8#v1GiEO}Q^u֌ yA%=$;6z#p(e]CweÂjo_~Gm+X_7& (N!ϫd+Og8o_,kv2,#y  my]n7W^qgݒ֭|ލKұsEC &&i8@չeK֐ 'tvvv/M j'oA ~K!~K!~K!~K!~K!~K!~K!~K!~K!~QwX^ 3gsT67`se }EA9sns/U6WWWuߗB4o)D{+*'V}У|/ߗE3`FCݮ%!׬>{种0 xΚ&N?&ǵܸ4t}n}dsv܅ԍ9:ӋӹeuW޽.g:[ }Eu}pf&7;|{~_}kn;3O܉ٱqvI/q|g6 BH4>ܽ $EOώ=(g9g2n~2oo`Qʲ|CєMOiܴ)ڸsRMyßpR4׽4 }^' ΕsQw83X֖6hw1舜r|3I9:v)L۲~Uwd)gv i]:[=ϟGȘ傏~<NybKrͪj{Rph yJR/M._vqem󿗿x99M\ֹEY=Y-Q_֤&JZ`o瑟|$owvWECƴ}sV.~ ]\d[sQuʬJ&Wԍ deYۡ2bl4~} O ЯTi̿: p@[9fL%)ecSgyvTۯhN;O{~3C,]nzGٗp\wL>N{audP8 Y_ݰ0 ~\ TFox]=aF&ٲba~s? Rn|$);W.^܇C_WxLd2[#:kZI!;|$gԐb)Yu볺ZdgMJ]T7ݑo},Vj|܇?~W~R$Ie˾ OK!W}胻w(ryۯM-r9H:o_Ŷjܼ$޹1*@!g4? sؼӒܸxݔLZK)oQ#L2ܙ7tLiyLOR] 7$a4i'{i^vi9U_t44dG[>28 ;)5&vve)3*I%FJ%kUpdجR)Aw-<4ĺ$ՍO :kÄh>s劬.{je5IR]qmm[$EќA4 ' O_Hp!OwQ]~On:*'tRN:@Q#:ܜ[zJ nG֯]~.2HRyHtN 9]̤gx wgCa __̘86Ú꺗 i=9G_\t լ^:g2nyy錆[6xKr$IQ?9 TP+O_rnsGun5oכ cL5Wi>̭s|,y'e#6҅容esWjV=(GdLH7\O|+2hyߖzCw>ޡ WTu\W=:)e^13җm *ʿA^?q|I{Sn]k/zGZowg~vvTȖJbpNK:IuMY^ L&DQuæsGC'ʐ27ͲEssǍWۗ5`C{{eG7 E!&*i6"- S-ٰ-$Ȝ "33g.^p9?λ,_Z |/ޕd}δ4?&Gٹ6w3Knz7)"hZtB>FW-|yKbD^?\0=MOS2H ;Uؿq~Oc^ ԰]ͺ>qב]̨| 7I46RGNE}s}.Ӿ\/l* }{;rv+wx[~{zՕʮ\th)8vN^W?xJFyD!UuЩgfhG=.:MasS7u[n'7ܺ>}RєC_ycU/uլX2]I"Oz]^?{prc)S#_Yo?!.ͺ해>$O>?{ə\/_)̓ZMK7ܜNCg75[S4"fs. gNl/ry1g7ÆUR$;%9sֿj P]u%>>EЙ9m˹o}]ˡ/EzI.UrWNcswuҾ5ͧ#:4粏q>sGCܙ!y9y{^.7ꛗ+`pT&Ǧr}RRCׯZ-}iGH_z?+e=oyAA.yK$I]:x ߘ5Qfu'0Zgؓ"C?=6Ir{k?KmJT23.IfG{iҢ>7&@rޙݏsE}Kǧ'IOS5)ؓdPʸP$em3ULY}k`@+7CK2y>mBF nHRkTfc{ܴ9iow1ȼN>fsWi3+/~û󾗍}b2_G[ںʐOLnڪ > tm~:լ??뫳3$EM93K-Y5a9|)t,EIҔMI]++9מf~ucG< !5YQMr\N;vp8uY`B4B4{`ϝ\>]>e*x9cDw=f^~ @U_I9$'93S OS]g[ܙEM:j8m[ygHݓ'B(-/åwe]5IʬO(;[b0(D519O>q9׿5$dޖrG=re7;ǟsN?./xޤ֔Y̻\{M~ e7ښ`PK9}_?]xh=Եu3cFk T=%Ʋ5Ko,_Z'Tj'gRީGI>GҸ$I[[[M!͹LmYmͪZ\mݐ m/W4dkޘSUEcǎMlذIV_t+ӎlJϦi}G/ u~gfW[>W͢O䣯=<-2서zDc9+ I&,,_qJK&>*G̜q[2^ZyMu^<.h>na9>7_rҮTuq3nyQRTdRyqx!Cd̙Ie˖Xq/|k>77Դ2~G!ޡ GTFȞbAׂ_K~q~t5#d$ P#EQ9cǎͤI$k׮Ͳej*2˟}m6MzB4@Q휴V]*k\>;eYt)R}ڛZGKkEYYlY-[WͅU @ GTL$ /g*кn¤TI6u3+/~崜rrԺRBuM]ٯ ۷ou>~z1 p`)2d9M̔U?sV>?Q lWΤ^3rKݛ~K*@G{$te 2{Sg5|sg y[+sJrVd1IRosMٚ[Too.bf y IDATn/Χ5h>@]=hORvC\M=%eV{0Iv):w-m ݙTFw\{9.B4@_Q},߾4]IR4WX__zS ^j_մniM5I:Ӟ$)2xԨ щ.+er/O>+ ~s{۱b߬Ͱ=Wdyt]~Vf=/aV2z%\VViu)笹k3|֑>gLGGg0(DqEE 8eZ-˺j2RdrH<Ե8ݔ광Hi9iZ]EkRM].ʣO;5RI=w]q}VV2y\[1ۻ:o&3IsiӤ-]RZ@"芬"®ʺʪ(xJ Ћgz}$~GsL4IG2}|J~I81!=+wg^Ui!ɒ{|b;=|=txNGWA?ϿTi`x@Ϭf˴Gw莝֧\P9udz/hOӡpu'kOt%8@g$-ӺE\eXWZ7UVΌYmy0` c[^oYzұ9fK}`\7S-IӕH y_(a&$)/[]g7)I{F[dVʷ.RC2C&h8Sr `0 9jb og*l-^}UIpQŒRDMvK,9`櫨EJuH2c5cJ w'ZP=z,! #-gk Zv, >6t:eHj[f75]79SpE* iSUy- иqWxD\jVCUr_>9 0JXٶ$C2hFR_|ض6;#Ch3:Vo]5uŤ^an۶fykTQRY:j9-s3B%+>ޣ \kfs @?Й㔖>Qǧ(%9^_,҉SM1>:T\.|M -/ҩ#}[z]*`&i՗ꋦkZZzx1SM^u:ew{"0JX5ժ%!9EG陗Ϯ 5?-Ф˕c:$_Bֻm+ SC8 p),*N3fi7-4S KnҧGv30Z 7d%ԾCé)ZtuNzGϽqP$%)+@rS4M'ww H+ViW!Nw˞׷}Dh@h%Z ThI$#H_^m%-#]3P8yTOo-ޙ2N\/a{#]c((z[t7D9*^< {)o8GD(a2K3ƙ 9W[kz9##2]_п辗]cVcqeԝt)46YC;Rp'i toTK4ER:DT,[(Ik|f.TzԸ9meFQR zgo,I3Xstq߽:SJTkoTvHキN>ܭrTTQ/_@.֍3"1 TK4˵AGjEQH!0Z4Kt Ԗ!5LcݝG@f SYS[;6iGYc6@9?g][VMT_(ЕIc]PDb=1 T;PnwO:U(?Pށ$MŤ(uG*UtNye)@q1 qtc7VAecAJLIT\tBNY *SAN z=n`,|QZ* 1WIs9}Oj,፻yqUtXܨ2nl:1)!T6in*>?WYqRoxHRE1SN'7<ڐzC_ nReߤNQ"g~W=lG~vN:o]sSmC5dgݝJun^=_D-'5*IKV؞z uͧo%{ =yZS o:EZUvMj{Q3XA}%py4oG>n#BU]Вd+c?Yi&֏s}=%0Cy=?+4-뵫$AaB4*-*x=w>j3Q+swË㯟ՇŖz~ݲy.Y>SKNh׆ڑ=!3’%pj׫sHjTQ~JʫTg8Iמ 5N^{j/_ .F }rƮ?|_-Ir%7}PLc_ҍkbw{竭={}fJ2d_o^Ϳ9 P܊{/Mv}׉:F F8{ }af뚕cڒs :yGK.Ca0*[#֣hTۺ+eR{X*wml J[+D)RCUu vkы2=}rklFb!߰_@f]Z+'v|Ͳ֟l|JX_znu?YWjjjy>A! ta2_' 9'MVS*iM(]yE'{Xl CKRS޻ɣke`zǩirmռ~fGZMY9ͽ:tMSi\%dOoUUi~bP" z}g3mf8e̜RWo wC{"bci]S'JM+mV^tezQ|״`$-z:g z:O5#qI>KLjchhAR`0tޖb0e7)';MvD]KW_˖մ$9e>YFXġI4*GVSvnnZ隖Wet,'0K姴ڼH^̜+aV^Bz=2e-w]t]FԫkT?F`QʈHIA 2(A #j._}E̪Չ/E E5??߾rHa(dmGQځᐣO v>֪PiEUVmKH}\Is*i50A-b-T-˔Z nnx.$.VC.m=V}3ۖm5FE*v+G_KE y)gI28Ui]8k8!ӐՕᐳm$z0ꊳJ)5o2}EUC*??/-ɶ-Y>jˋuAeTu횡/|ahYwiGV-e3r-K 50eg#@B[nw__53(_u6;^oIR[pM҅9Y$" tX T3ӕ?E%=~CO֤؀^jkd)Ry<3\1.i'ԨUOV|M>W1z$?SaiZ}lŹjiӖ^ Ts=^9mV8:W_nմ?Z@T\Xe+mRCUfB&=ѺSuJmm",Uo5ٍ*r9%њ=12T4E !r Z:ZF(%tTV]~*Ŷg4~Ly$_&̛RK|`|۟ zJ:ⓗ1c  Ϭ+ RuXۛS6h/3m[/ -ɕy3GYe{T<=Fp6NS|H{5]n*|jB ^> VrW5F`%@1 )(USoK0͚史0tE !/ݍP%zWfI2C5K5'dԁy8uMڱ*|Ԝ>ZRKSؚ5fJT)g)h ՚eg N[Cn$MiرQD ʸL7N&U6iL]WPYuuڒGse(xK#VKnWYj9^;{a[P;'闷)ə7薕r여}ij$HQ1}tӼi'^]kTa/ީpbgF_PoNUd;C4nletxEl3Vx? QKa)vCݬJUa$%DʮЮ;5Ƌ|S3,qFǺf޷;Q'i:=mQr0WkXRљ HJQGCi[52&uH3 Rl zOGs7iw]4ܮ]W1Fzf./;e'ɐ-[F}hsՕGMn{B g^{f^۾VJm'[eoBf:u*RUh͊;uxXrF+>5MրO(z 2uni="FO5ZݱFkw(jЏG[9Jptf;y9U6T^5tݩVv6tpi4iDŶQ1fAv;S}':PqK 5NiWW○SM=֛]{No~RVxMhV*-.iӃbt8{Cۖ=o90a2RiqvsϮBTuM=@jZTW܃Қ ]FZMMjUC>xZ.ey[5]o??:޵OOK]?2 7#)))_<O`6Xh$iӦMX0:,]Te˖!u3㏫X>_瑩>4 dffJtzyݺuCg0BI(.Pqu<I[)=hxӓzrKY1 Q\tBd-5yU[]jyY1IfPgL  :O ,d׬SU)c|zsqB')}b<ArMjViaNgy@CZU*I6vνu`=3`()))$ZU`70”6;UM*{J ¨r?QORSurK[#j(Vֶbe v3^o\ohGac2# rn9MdnQ]*<2Qav )@D07cX:_ZZ@Fkbz<.VIDATA~i@٪;v V?M*gڶrKj U\ -YHiNu-5D0nE%g(*9EwTw y2a?w]*K5{o׻*{<98`T񩡾Iej(ѝhöGa$5N>;BN5|UGn?oTn㹬VMJz SRrӔFT(O9yeobCa$Yz+ZT͞3C"SykT^hchbhB QVSuN(҉.!#R]m*8M#] 3z3D#]vk֭֬[zG8=gff\!U `" `" `" `" `" `" `" `rt0,\pKpQimۖ$1bѤw(n0!Oz Rpp\0ZK[lyg-0HÙ說*Ir1hv[YY9佸n0! e۶: 44TIIIm[Cޏfӆ;1@U^^$)##pƼPeddHYn8; wbYf)//O%%%mq 2 Cx * Copyright (C) 2019 Jan Grulich * * 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #include #include "widgetfactory.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); WidgetFactory fact; fact.show(); return app.exec(); } adwaita-qt-1.4.1/src/demo/widgetfactory.cpp000066400000000000000000000133251414271704400206530ustar00rootroot00000000000000/* * Widget Showcase * Copyright (C) 2014-2018 Martin Bříza * Copyright (C) 2019 Jan Grulich * * 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #include #include "widgetfactory.h" #include "ui_widgetfactory.h" #include #include #include #include #include #include class WidgetFactory::Private { public: Private() { } Ui_WidgetFactory ui; }; WidgetFactory::WidgetFactory(QWidget *parent) : QMainWindow(parent) , d(new WidgetFactory::Private()) { setGeometry(0, 0, 1440, 800); QWidget *mainWidget = new QWidget(this); d->ui.setupUi(mainWidget); setCentralWidget(mainWidget); // QLineEdit with the icon inside QAction *lineEditAction = new QAction(QIcon::fromTheme(QLatin1String("view-refresh")), QString()); connect(lineEditAction, &QAction::triggered, this, [this] (bool checked) { if (d->ui.linedit->echoMode() == QLineEdit::Normal) { d->ui.linedit->setEchoMode(QLineEdit::Password); } else { d->ui.linedit->setEchoMode(QLineEdit::Normal); } }); d->ui.linedit->addAction(lineEditAction, QLineEdit::TrailingPosition); // QLineEdit with the widget on the right side connect(d->ui.button, &QPushButton::pressed, this, [this] () { d->ui.lineedit2->clear(); }); // Checkboxes d->ui.checkbox3->setCheckState(Qt::PartiallyChecked); d->ui.checkbox6->setCheckState(Qt::PartiallyChecked); // Buttons d->ui.pushbutton3->setDown(true); d->ui.pushbutton4->setDown(true); // Sliders and progress bars connect(d->ui.horizontalslider3, &QSlider::valueChanged, this, [this] (int value) { d->ui.progressbar_horizontal->setValue(value); d->ui.progressbar_horizontal2->setValue(value); d->ui.progressbar_vertical->setValue(value); d->ui.progressbar_vertical2->setValue(value); }); connect(d->ui.horizontalslider, &QSlider::valueChanged, this, [this] (int value) { d->ui.horizontalslider2->setValue(value); d->ui.verticalslider->setValue(value); d->ui.verticalslider2->setValue(value); }); connect(d->ui.verticalslider, &QSlider::valueChanged, this, [this] (int value) { d->ui.horizontalslider->setValue(value); d->ui.horizontalslider2->setValue(value); d->ui.verticalslider2->setValue(value); }); QMenuBar *menubar = new QMenuBar(this); setMenuBar(menubar); // Inspired by Kondike (a gtk game) QMenu *game = new QMenu("Game", menubar); QAction *newGame = new QAction("New game"); newGame->setShortcut(QKeySequence::New); game->addAction(newGame); QAction *restart = new QAction("Restart"); restart->setDisabled(true); game->addAction(restart); QAction *statistics = new QAction("Statistics"); game->addAction(statistics); QAction *selectGame = new QAction("Select game..."); selectGame->setShortcut(QKeySequence::Open); game->addAction(selectGame); QMenu *recentlyPlayed = new QMenu("Recently played"); recentlyPlayed->addAction(new QAction("Game 1", recentlyPlayed)); recentlyPlayed->addAction(new QAction("Game 1", recentlyPlayed)); game->addMenu(recentlyPlayed); game->addSeparator(); QAction *close = new QAction("Close"); close->setShortcut(QKeySequence::Quit); game->addAction(close); menuBar()->insertMenu(nullptr, game); QMenu *edit = new QMenu("Edit", menubar); QAction *act1 = new QAction("Pick me"); act1->setCheckable(true); act1->setChecked(true); QAction *act2 = new QAction("No, pick me instead"); act2->setCheckable(true); QAction *act3 = new QAction("Don't pick me"); act3->setCheckable(true); act3->setDisabled(true); edit->addAction(act1); edit->addAction(act2); edit->addAction(act3); QActionGroup *actionGroup = new QActionGroup(edit); actionGroup->setExclusive(true); actionGroup->addAction(act1); actionGroup->addAction(act2); actionGroup->addAction(act3); menuBar()->insertMenu(nullptr, edit); menuBar()->insertMenu(nullptr, new QMenu("View", menubar)); QAction *testAction = new QAction(QStringLiteral("Test 1")); testAction->setCheckable(true); edit->addAction(testAction); menuBar()->insertMenu(nullptr, edit); menuBar()->insertMenu(nullptr, new QMenu("Help")); QToolBar *toolbar = new QToolBar(); toolbar->setMovable(false); toolbar->setFloatable(false); toolbar->addAction(QIcon::fromTheme("document-save"), ""); toolbar->addAction(QIcon::fromTheme("document-open"), ""); toolbar->addSeparator(); toolbar->addAction(QIcon::fromTheme("edit-find"), ""); QWidget *spacer = new QWidget; spacer->setPalette(QPalette(Qt::transparent)); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); toolbar->addWidget(spacer); toolbar->addWidget(new QLineEdit("search...")); addToolBar(Qt::TopToolBarArea, toolbar); setWindowTitle(tr("Qt/GTK+ Widget Factory")); } WidgetFactory::~WidgetFactory() { delete d; } adwaita-qt-1.4.1/src/demo/widgetfactory.h000066400000000000000000000021741414271704400203200ustar00rootroot00000000000000/* * Widget Showcase * Copyright (C) 2014-2018 Martin Bříza * Copyright (C) 2019 Jan Grulich * * 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #ifndef WIDGETFACTORY_H #define WIDGETFACTORY_H #include class WidgetFactory : public QMainWindow { Q_OBJECT public: WidgetFactory(QWidget *parent = nullptr); ~WidgetFactory(); private: class Private; Private *d; }; #endif // WIDGETFACTORY_H adwaita-qt-1.4.1/src/demo/widgetfactory.ui000066400000000000000000001027721414271704400205130ustar00rootroot00000000000000 WidgetFactory 0 0 1371 800 Form QComboBox true Donald Duck Mickey Mouse Jet McQuack QLayout::SetDefaultConstraint 0 112 QFrame::StyledPanel QFrame::Plain QDockWidget::NoDockWidgetFeatures 163 96 Plain QDockWidget::DockWidgetMovable 179 113 QFrame::StyledPanel QFrame::Raised Raised 179 112 QFrame::StyledPanel QFrame::Raised Sunken false QComboBox true comboboxentry 0 Qt::Horizontal 40 20 QComboBox Left Middle Right QComboBox 1 Left Middle Right QComboBox 2 Left Middle Right Qt::Horizontal 40 20 PushButton false PushButton true PushButton false false false false PushButton Andrea Otto Orville Benjamin false Andrea Otto Orville Benjamin <a href="https://github.com/FedoraQt/adwaita-qt">link button</a> Qt::AlignCenter Qt::Vertical 20 40 QLabel widgets around Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false QLabel have tooltips QSpinBox 50 false QSpinBox QLineEdit Click icon to change echo mode false 50 50 true QProgressBar::TopToBottom 0 0 50 true false 100 Qt::Horizontal false 100 Qt::Horizontal false 100 25 25 50 Qt::Horizontal QSlider::TicksBelow 25 50 Qt::Vertical true 50 Qt::Vertical false 100 Qt::Vertical true QSlider::TicksAbove false 100 Qt::Vertical true QSlider::TicksBelow 0 QLayout::SetDefaultConstraint QLineEdit entry .. false false true true false 4 false 50 false true Cool Icon Name Nick Checked .. Andrea Cimi Unchecked .. Otto Chaotic ItemIsSelectable|ItemIsDragEnabled|ItemIsDropEnabled|ItemIsUserCheckable|ItemIsEnabled|ItemIsUserTristate Checked .. Orville Redenbacher PartiallyChecked .. Benjamin Company QCheckBox checkbutton true QRadioButton RadioButton true false QCheckBox checkbutton QRadioButton RadioButton QCheckBox checkbutton true false QRadioButton RadioButton false QCheckBox checkbutton true false QRadioButton RadioButton true false false QCheckBox checkbutton false QRadioButton RadioButton false false QCheckBox checkbutton false QRadioButton RadioButton false Qt::Horizontal 228 20 <!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:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nullam fringilla, est ut feugiat ultrices, elit lacus ultricies nibh, id commodo tortor nisi id elit.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Morbi vel elit erat. Maecenas dignissim, dui et pharetra rutrum, tellus lectus rutrum mi, a convallis libero nisi quis tellus.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nulla facilisi. Nullam eleifend lobortis nisl, in porttitor tellus malesuada vitae.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aenean lacus tellus, pellentesque quis molestie quis, fringilla in arcu.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Duis elementum, tellus sed tristique semper, metus metus accumsan augue, et porttitor augue orci a libero.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ut sed justo ac felis placerat laoreet sed id sem. Proin mattis tincidunt odio vitae tristique.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Morbi massa libero, congue vitae scelerisque vel, ultricies vel nisl.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vestibulum in tortor diam, quis aliquet quam. Praesent ut justo neque, tempus rutrum est.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Duis eu lectus quam. Vivamus eget metus a mauris molestie venenatis pulvinar eleifend nisi.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nulla facilisi. Pellentesque at dolor sit amet purus dapibus pulvinar molestie quis neque.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suspendisse feugiat quam quis dolor accumsan cursus.</p></body></html> 2 Page 1 Page 2 Page 3 QTabWidget::East 2 Page 1 Page 2 Page 3 QTabWidget::South 2 Page 1 Page 2 Page 3 QTabWidget::West 2 Page 1 Page 2 Page3 false Disabled lineedit adwaita-qt-1.4.1/src/lib/000077500000000000000000000000001414271704400151125ustar00rootroot00000000000000adwaita-qt-1.4.1/src/lib/AdwaitaQtConfig.cmake.in000066400000000000000000000006451414271704400215330ustar00rootroot00000000000000@PACKAGE_INIT@ include(CMakeFindDependencyMacro) find_dependency(Qt@QT_VERSION_MAJOR@Core @QT_MIN_VERSION@) find_dependency(Qt@QT_VERSION_MAJOR@Gui @QT_MIN_VERSION@) find_dependency(Qt@QT_VERSION_MAJOR@Widgets @QT_MIN_VERSION@) set(ADWAITAQT_LIBRARIES adwaitaqt@ADWAITAQT_SUFFIX@) set(ADWAITAQT_INCLUDE_DIRS @CMAKE_INSTALL_FULL_INCLUDEDIR@) include("${CMAKE_CURRENT_LIST_DIR}/AdwaitaQt@ADWAITAQT_SUFFIX@Targets.cmake") adwaita-qt-1.4.1/src/lib/CMakeLists.txt000066400000000000000000000141401414271704400176520ustar00rootroot00000000000000 include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) configure_file(config-adwaita.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-adwaita.h ) configure_file(adwaita-qt.pc.cmake "${CMAKE_CURRENT_BINARY_DIR}/adwaita-qt${ADWAITAQT_SUFFIX}.pc" @ONLY) set(libadwaitaqt_priv_SRCS # Animations animations/adwaitaanimation.cpp animations/adwaitaanimations.cpp animations/adwaitaanimationdata.cpp animations/adwaitabaseengine.cpp animations/adwaitabusyindicatordata.cpp animations/adwaitabusyindicatorengine.cpp animations/adwaitadialdata.cpp animations/adwaitadialengine.cpp animations/adwaitaenabledata.cpp animations/adwaitagenericdata.cpp animations/adwaitaheaderviewdata.cpp animations/adwaitaheaderviewengine.cpp animations/adwaitascrollbardata.cpp animations/adwaitascrollbarengine.cpp animations/adwaitaspinboxengine.cpp animations/adwaitaspinboxdata.cpp animations/adwaitastackedwidgetdata.cpp animations/adwaitastackedwidgetengine.cpp animations/adwaitatabbarengine.cpp animations/adwaitatabbardata.cpp animations/adwaitatoolboxengine.cpp animations/adwaitatransitiondata.cpp animations/adwaitatransitionwidget.cpp animations/adwaitawidgetstateengine.cpp animations/adwaitawidgetstatedata.cpp # Others adwaitaaddeventfilter.cpp adwaitamnemonics.cpp adwaitasplitterproxy.cpp adwaitawidgetexplorer.cpp adwaitawindowmanager.cpp ) set(libadwaitaqt_SRCS adwaita.cpp adwaitacolors.cpp adwaitarenderer.cpp ) set(libadwaitaqt_HEADERS adwaita.h adwaitacolors.h adwaitarenderer.h adwaitaqt_export.h ) add_library("adwaitaqt${ADWAITAQT_SUFFIX}priv" SHARED ${libadwaitaqt_priv_SRCS}) target_link_libraries("adwaitaqt${ADWAITAQT_SUFFIX}priv" Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::DBus Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets ) # We need this done before we start building adwaitaqt public library find_program(SASSC_EXECUTABLE sassc) if (SASSC_EXECUTABLE) set(Variants "light" "dark" "hc" "hc-dark") foreach(VARIANT IN LISTS Variants) add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/stylesheet/Adwaita-${VARIANT}.css" COMMAND "${SASSC_EXECUTABLE}" -a -M -t compact "${CMAKE_CURRENT_SOURCE_DIR}/stylesheet/Adwaita-${VARIANT}.scss" "${CMAKE_CURRENT_BINARY_DIR}/stylesheet/Adwaita-${VARIANT}.css" COMMENT "Stylesheet variant: ${VARIANT}") endforeach() set(STYLESHEET_PATH "${CMAKE_CURRENT_BINARY_DIR}/stylesheet") else() set(STYLESHEET_PATH "${CMAKE_CURRENT_SOURCE_DIR}/stylesheet/processed") endif() configure_file("${CMAKE_CURRENT_SOURCE_DIR}/stylesheet/stylesheet.qrc.in" "${CMAKE_CURRENT_BINARY_DIR}/stylesheet/stylesheet.qrc") if (USE_QT6) qt6_add_resources(libadwaitaqt_SRCS "${CMAKE_CURRENT_BINARY_DIR}/stylesheet/stylesheet.qrc") else() qt5_add_resources(libadwaitaqt_SRCS "${CMAKE_CURRENT_BINARY_DIR}/stylesheet/stylesheet.qrc") endif() add_library("adwaitaqt${ADWAITAQT_SUFFIX}" SHARED ${libadwaitaqt_SRCS}) add_library("AdwaitaQt${ADWAITAQT_SUFFIX}" ALIAS "adwaitaqt${ADWAITAQT_SUFFIX}") target_link_libraries("adwaitaqt${ADWAITAQT_SUFFIX}" PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets PRIVATE "adwaitaqt${ADWAITAQT_SUFFIX}priv" ) set_target_properties("adwaitaqt${ADWAITAQT_SUFFIX}priv" PROPERTIES VERSION ${ADWAITAQT_VERSION} SOVERSION 1) if(MINGW AND BUILD_SHARED_LIBS) get_target_property(ADWAITA_QT_SOVERSION "adwaitaqt${ADWAITAQT_SUFFIX}priv" SOVERSION) set_target_properties("adwaitaqt${ADWAITAQT_SUFFIX}priv" PROPERTIES SUFFIX "-${ADWAITA_QT_SOVERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}") endif() set_target_properties("adwaitaqt${ADWAITAQT_SUFFIX}" PROPERTIES VERSION ${ADWAITAQT_VERSION} SOVERSION 1) if(MINGW AND BUILD_SHARED_LIBS) get_target_property(ADWAITA_QT_SOVERSION "adwaitaqt${ADWAITAQT_SUFFIX}" SOVERSION) set_target_properties("adwaitaqt${ADWAITAQT_SUFFIX}" PROPERTIES SUFFIX "-${ADWAITA_QT_SOVERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}") endif() if (USE_QT6) target_include_directories("adwaitaqt${ADWAITAQT_SUFFIX}" PUBLIC ${Qt6Core_INCLUDE_DIRS} ${Qt6Gui_INCLUDE_DIRS} ${Qt6Widgets_INCLUDE_DIRS}) else() target_include_directories("adwaitaqt${ADWAITAQT_SUFFIX}" PUBLIC ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS}) endif() install(TARGETS "adwaitaqt${ADWAITAQT_SUFFIX}priv" EXPORT "AdwaitaQt${ADWAITAQT_SUFFIX}Targets" RUNTIME DESTINATION bin LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(TARGETS "adwaitaqt${ADWAITAQT_SUFFIX}" EXPORT "AdwaitaQt${ADWAITAQT_SUFFIX}Targets" RUNTIME DESTINATION bin LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(FILES ${libadwaitaqt_HEADERS} DESTINATION "${CMAKE_INSTALL_FULL_INCLUDEDIR}/AdwaitaQt${ADWAITAQT_SUFFIX}") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/adwaita-qt${ADWAITAQT_SUFFIX}.pc" DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/pkgconfig) # create a Config.cmake and a ConfigVersion.cmake file and install them set(CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/cmake/AdwaitaQt${ADWAITAQT_SUFFIX}") include(CMakePackageConfigHelpers) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/AdwaitaQtConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/AdwaitaQt${ADWAITAQT_SUFFIX}Config.cmake" INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/AdwaitaQt${ADWAITAQT_SUFFIX}ConfigVersion.cmake" VERSION ${ADWAITAQT_VERSION} COMPATIBILITY AnyNewerVersion ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/AdwaitaQt${ADWAITAQT_SUFFIX}Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/AdwaitaQt${ADWAITAQT_SUFFIX}ConfigVersion.cmake" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) install(EXPORT "AdwaitaQt${ADWAITAQT_SUFFIX}Targets" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE "AdwaitaQt${ADWAITAQT_SUFFIX}Targets.cmake") adwaita-qt-1.4.1/src/lib/adwaita-qt.pc.cmake000066400000000000000000000006011414271704400205460ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ libdir=@CMAKE_INSTALL_FULL_LIBDIR@ includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: adwaita-qt@ADWAITAQT_SUFFIX@ Description: Qt Adwaita Style Version: @ADWAITAQT_VERSION@ Requires: @PC_REQUIRES@ @PC_REQUIRES_PRIVATE@ Libs: -L${libdir} -ladwaitaqt@ADWAITAQT_SUFFIX@ Cflags: -I${includedir} Requires: Qt@QT_VERSION_MAJOR@Core Qt@QT_VERSION_MAJOR@Widgets adwaita-qt-1.4.1/src/lib/adwaita.cpp000066400000000000000000000155421414271704400172370ustar00rootroot00000000000000 /************************************************************************* * Copyright (C) 2020 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaita.h" #include "adwaitacolors_p.h" #include "animations/adwaitaanimations.h" namespace Adwaita { class StyleOptionsPrivate { public: explicit StyleOptionsPrivate(const QPalette &palette) : m_palette(palette) { } StyleOptionsPrivate(const QPalette &palette, ColorVariant variant) : m_palette(palette) , m_colorVariant(variant) { } StyleOptionsPrivate(QPainter *painter, const QRect &rect) : m_painter(painter) , m_rect(rect) { } virtual ~StyleOptionsPrivate() { } QPalette m_palette; QPalette::ColorGroup m_colorGroup = QPalette::ColorGroup::Normal; QPalette::ColorRole m_colorRole = QPalette::ColorRole::Base; ColorVariant m_colorVariant = ColorVariant::Unknown; bool m_active = false; bool m_focus = false; bool m_mouseHover = false; qreal m_opacity = AnimationData::OpacityInvalid; AnimationMode m_animationMode = AnimationNone; CheckBoxState m_checkboxState = CheckOff; RadioButtonState m_radioButtonState = RadioOff; QStyle::State m_state = QStyle::State_None; bool m_inMenu = false; bool m_sunken = false; QPainter *m_painter = nullptr; QRect m_rect; QColor m_color; QColor m_outlineColor; }; StyleOptions::StyleOptions(const QPalette &palette) : d_ptr(new StyleOptionsPrivate(palette)) { } StyleOptions::StyleOptions(const QPalette &palette, ColorVariant variant) : d_ptr(new StyleOptionsPrivate(palette, variant)) { } StyleOptions::StyleOptions(QPainter *painter, const QRect &rect) : d_ptr(new StyleOptionsPrivate(painter, rect)) { } StyleOptions::~StyleOptions() { } void StyleOptions::setPalette(const QPalette &palette) { Q_D(StyleOptions); d->m_palette = palette; } QPalette StyleOptions::palette() const { Q_D(const StyleOptions); return d->m_palette; } void StyleOptions::setPainter(QPainter *painter) { Q_D(StyleOptions); d->m_painter = painter; } QPainter *StyleOptions::painter() const { Q_D(const StyleOptions); return d->m_painter; } void StyleOptions::setRect(const QRect &rect) { Q_D(StyleOptions); d->m_rect = rect; } QRect StyleOptions::rect() const { Q_D(const StyleOptions); return d->m_rect; } void StyleOptions::setColorGroup(QPalette::ColorGroup group) { Q_D(StyleOptions); d->m_colorGroup = group; } QPalette::ColorGroup StyleOptions::colorGroup() const { Q_D(const StyleOptions); return d->m_colorGroup; } void StyleOptions::setColorRole(QPalette::ColorRole role) { Q_D(StyleOptions); d->m_colorRole = role; } QPalette::ColorRole StyleOptions::colorRole() const { Q_D(const StyleOptions); return d->m_colorRole; } void StyleOptions::setColorVariant(ColorVariant variant) { Q_D(StyleOptions); d->m_colorVariant = variant; } ColorVariant StyleOptions::colorVariant() const { Q_D(const StyleOptions); if (d->m_colorVariant == ColorVariant::Unknown) { return ColorsPrivate::isDarkMode() ? ColorVariant::AdwaitaDark : ColorVariant::Adwaita; } return d->m_colorVariant; } void StyleOptions::setActive(bool active) { Q_D(StyleOptions); d->m_active = active; } bool StyleOptions::active() const { Q_D(const StyleOptions); return d->m_active; } void StyleOptions::setHasFocus(bool focus) { Q_D(StyleOptions); d->m_focus = focus; } bool StyleOptions::hasFocus() const { Q_D(const StyleOptions); return d->m_focus; } void StyleOptions::setMouseOver(bool mouseOver) { Q_D(StyleOptions); d->m_mouseHover = mouseOver; } bool StyleOptions::mouseOver() const { Q_D(const StyleOptions); return d->m_mouseHover; } void StyleOptions::setOpacity(qreal opacity) { Q_D(StyleOptions); d->m_opacity = opacity; } qreal StyleOptions::opacity() const { Q_D(const StyleOptions); return d->m_opacity; } void StyleOptions::setAnimationMode(AnimationMode mode) { Q_D(StyleOptions); d->m_animationMode = mode; } AnimationMode StyleOptions::animationMode() const { Q_D(const StyleOptions); return d->m_animationMode; } void StyleOptions::setCheckboxState(CheckBoxState state) { Q_D(StyleOptions); d->m_checkboxState = state; } CheckBoxState StyleOptions::checkboxState() const { Q_D(const StyleOptions); return d->m_checkboxState; } void StyleOptions::setRadioButtonState(RadioButtonState state) { Q_D(StyleOptions); d->m_radioButtonState = state; } RadioButtonState StyleOptions::radioButtonState() const { Q_D(const StyleOptions); return d->m_radioButtonState; } void StyleOptions::setState(QStyle::State state) { Q_D(StyleOptions); d->m_state = state; } QStyle::State StyleOptions::state() const { Q_D(const StyleOptions); return d->m_state; } void StyleOptions::setInMenu(bool inMenu) { Q_D(StyleOptions); d->m_inMenu = inMenu; } bool StyleOptions::inMenu() const { Q_D(const StyleOptions); return d->m_inMenu; } void StyleOptions::setSunken(bool sunken) { Q_D(StyleOptions); d->m_sunken = sunken; } bool StyleOptions::sunken() const { Q_D(const StyleOptions); return d->m_sunken; } void StyleOptions::setColor(const QColor &color) { Q_D(StyleOptions); d->m_color = color; } QColor StyleOptions::color() const { Q_D(const StyleOptions); return d->m_color; } void StyleOptions::setOutlineColor(const QColor &outlineColor) { Q_D(StyleOptions); d->m_outlineColor = outlineColor; } QColor StyleOptions::outlineColor() const { Q_D(const StyleOptions); return d->m_outlineColor; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/adwaita.h000066400000000000000000000245271414271704400167070ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2019 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_H #define ADWAITA_H #include "adwaitaqt_export.h" #include #include #include #include #include #include #include namespace Adwaita { //*@name convenience typedef //@{ //* scoped pointer convenience typedef template using WeakPointer = QPointer; //* scoped pointer convenience typedef template using ScopedPointer = QScopedPointer; //@} //* Settings namespace Settings { const bool SingleClick {true}; const bool ShowIconsOnPushButtons {true}; const int ToolButtonStyle {Qt::ToolButtonTextBesideIcon}; const bool ShowIconsInMenuItems {true}; } enum EnumMnemonicsMode { MN_NEVER, MN_AUTO, MN_ALWAYS }; enum EnumWindowDragMode { WD_NONE, WD_MINIMAL, WD_FULL }; //* Config namespace Config { // Common const int ShadowStrength {0}; const int ShadowSize {0}; const QColor ShadowColor {Qt::transparent}; const bool OutlineCloseButton {false}; // Style const bool AnimationsEnabled {true}; const int AnimationSteps {100}; const int AnimationsDuration {180}; const bool StackedWidgetTransitionsEnabled {false}; const bool ProgressBarAnimated {true}; const int ProgressBarBusyStepDuration {600}; const int ScrollBarAddLineButtons {0}; const int ScrollBarSubLineButtons {0}; const bool ScrollBarShowOnMouseOver {true}; const int MnemonicsMode {MN_AUTO}; const bool ToolBarDrawItemSeparator {0}; const bool ViewDrawFocusIndicator {true}; const bool SliderDrawTickMarks {true}; const bool ViewDrawTreeBranchLines {true}; const bool ViewInvertSortIndicator {true}; const bool TabBarDrawCenteredTabs {false}; const bool TitleWidgetDrawFrame {true}; const bool DockWidgetDrawFrame {false}; const bool SidePanelDrawFrame {false}; const bool MenuItemDrawStrongFocus {true}; const int WindowDragMode {0}; const QStringList WindowDragWhiteList; const QStringList WindowDragBlackList; const bool UseWMMoveResize {true}; const bool SplitterProxyEnabled {true}; const int SplitterProxyWidth {3}; const bool WidgetExplorerEnabled {false}; const bool DrawWidgetRects {false}; } namespace PropertyNames { const char noAnimations[] = "_kde_no_animations"; const char noWindowGrab[] = "_kde_no_window_grab"; const char netWMForceShadow[] = "_KDE_NET_WM_FORCE_SHADOW"; const char netWMSkipShadow[] = "_KDE_NET_WM_SKIP_SHADOW"; const char sidePanelView[] = "_kde_side_panel_view"; const char toolButtonAlignment[] = "_kde_toolButton_alignment"; const char menuTitle[] = "_adwaita_toolButton_menutitle"; const char alteredBackground[] = "_adwaita_altered_background"; } //* metrics enum Metrics { // frames Frame_FrameWidth = 4, Frame_FrameRadius = 5, // layout Layout_TopLevelMarginWidth = 10, Layout_ChildMarginWidth = 6, Layout_DefaultSpacing = 6, // line editors LineEdit_FrameWidth = 3, LineEdit_MarginHeight = 2, LineEdit_MarginWidth = 8, LineEdit_MinHeight = 36, LineEdit_MinWidth = 80, // menu items Menu_FrameWidth = 0, MenuItem_MarginWidth = 4, MenuItem_ItemSpacing = 6, MenuItem_AcceleratorSpace = 16, MenuButton_IndicatorWidth = 20, // combobox ComboBox_FrameWidth = 4, ComboBox_MarginHeight = 4, ComboBox_MarginWidth = 8, ComboBox_MinHeight = 36, ComboBox_MinWidth = 80, // spinbox SpinBox_FrameWidth = LineEdit_FrameWidth, SpinBox_ArrowButtonWidth = 20, SpinBox_MinHeight = 36, SpinBox_MinWidth = 80, SpinBox_MarginHeight = 4, SpinBox_MarginWidth = 8, // groupbox title margin GroupBox_TitleMarginWidth = 4, // buttons Button_MinHeight = 36, Button_MinWidth = 80, Button_MarginHeight = 4, Button_MarginWidth = 8, Button_ItemSpacing = 4, // tool buttons ToolButton_MarginWidth = 6, ToolButton_ItemSpacing = 4, ToolButton_InlineIndicatorWidth = 12, // checkboxes and radio buttons CheckBox_Size = 22, CheckBox_FocusMarginWidth = 3, CheckBox_ItemSpacing = 4, // menubar items MenuBarItem_MarginWidth = 8, MenuBarItem_MarginHeight = 5, // scrollbars ScrollBar_Extend = 14, ScrollBar_SliderWidth = 8, ScrollBar_MinSliderHeight = 24, ScrollBar_NoButtonHeight = (ScrollBar_Extend - ScrollBar_SliderWidth) / 2, ScrollBar_SingleButtonHeight = 0, ScrollBar_DoubleButtonHeight = 0, // toolbars ToolBar_FrameWidth = 2, ToolBar_HandleExtent = 10, ToolBar_HandleWidth = 6, ToolBar_SeparatorWidth = 8, ToolBar_ExtensionWidth = 20, ToolBar_ItemSpacing = 0, // progressbars ProgressBar_BusyIndicatorSize = 24, ProgressBar_Thickness = 3, ProgressBar_ItemSpacing = 3, // mdi title bar TitleBar_MarginWidth = 4, // sliders Slider_TickLength = 4, Slider_TickMarginWidth = 6, Slider_GrooveThickness = 3, Slider_ControlThickness = 24, // tabbar TabBar_TabMarginHeight = 9, TabBar_TabMarginWidth = 8, TabBar_TabMinWidth = 80, TabBar_TabMinHeight = 36, TabBar_TabItemSpacing = 8, TabBar_TabOverlap = 1, TabBar_BaseOverlap = 0, // tab widget TabWidget_MarginWidth = 4, // toolbox ToolBox_TabMinWidth = 80, ToolBox_TabItemSpacing = 4, ToolBox_TabMarginWidth = 8, // tooltips ToolTip_FrameWidth = 3, // scroll areas ScrollArea_FrameWidth = 2, // list headers Header_MarginWidth = 3, Header_ItemSpacing = 2, Header_ArrowSize = 10, // tree view ItemView_ArrowSize = 10, ItemView_ItemMarginWidth = 3, SidePanel_ItemMarginWidth = 4, // splitter Splitter_SplitterWidth = 1, // shadow dimensions Shadow_Overlap = 0 }; //* animation mode enum AnimationMode { AnimationNone = 0, AnimationHover = 0x1, AnimationFocus = 0x2, AnimationEnable = 0x4, AnimationPressed = 0x8 }; Q_DECLARE_FLAGS(AnimationModes, AnimationMode) //* corners enum Corner { CornerTopLeft = 0x1, CornerTopRight = 0x2, CornerBottomLeft = 0x4, CornerBottomRight = 0x8, CornersTop = CornerTopLeft | CornerTopRight, CornersBottom = CornerBottomLeft | CornerBottomRight, CornersLeft = CornerTopLeft | CornerBottomLeft, CornersRight = CornerTopRight | CornerBottomRight, AllCorners = CornerTopLeft | CornerTopRight | CornerBottomLeft | CornerBottomRight }; Q_DECLARE_FLAGS(Corners, Corner) //* sides enum Side { SideNone = 0x0, SideLeft = 0x1, SideTop = 0x2, SideRight = 0x4, SideBottom = 0x8, AllSides = SideLeft | SideTop | SideRight | SideBottom }; Q_DECLARE_FLAGS(Sides, Side) //* checkbox state enum CheckBoxState { CheckOff, CheckPartial, CheckOn, CheckAnimated }; //* radio button state enum RadioButtonState { RadioOff, RadioOn, RadioAnimated }; //* arrow orientation enum ArrowOrientation { ArrowNone, ArrowUp, ArrowDown, ArrowLeft, ArrowRight }; //* button type enum ButtonType { ButtonClose, ButtonMaximize, ButtonMinimize, ButtonRestore }; enum ColorVariant { Unknown, Adwaita, AdwaitaDark, AdwaitaHighcontrast, AdwaitaHighcontrastInverse }; class StyleOptionsPrivate; class ADWAITAQT_EXPORT StyleOptions { public: explicit StyleOptions(const QPalette &palette); StyleOptions(const QPalette &palette, ColorVariant variant); StyleOptions(QPainter *painter, const QRect &rect); virtual ~StyleOptions(); void setPalette(const QPalette &palette); QPalette palette() const; void setPainter(QPainter *painter); QPainter *painter() const; void setRect(const QRect &rect); QRect rect() const; void setColorGroup(QPalette::ColorGroup group); QPalette::ColorGroup colorGroup() const; void setColorRole(QPalette::ColorRole role); QPalette::ColorRole colorRole() const; void setColorVariant(ColorVariant variant); ColorVariant colorVariant() const; void setActive(bool active); bool active() const; void setHasFocus(bool focus); bool hasFocus() const; void setMouseOver(bool mouseOver); bool mouseOver() const; void setOpacity(qreal opacity); qreal opacity() const; void setAnimationMode(AnimationMode mode); AnimationMode animationMode() const; void setCheckboxState(CheckBoxState state); CheckBoxState checkboxState() const; void setRadioButtonState(RadioButtonState state); RadioButtonState radioButtonState() const; void setState(QStyle::State state); QStyle::State state() const; void setInMenu(bool inMenu); bool inMenu() const; void setSunken(bool sunken); bool sunken() const; void setColor(const QColor &color); QColor color() const; void setOutlineColor(const QColor &outlineColor); QColor outlineColor() const; private: Q_DECLARE_PRIVATE(StyleOptions) const QScopedPointer d_ptr; }; } // namespace Adwaita Q_DECLARE_OPERATORS_FOR_FLAGS(Adwaita::AnimationModes) Q_DECLARE_OPERATORS_FOR_FLAGS(Adwaita::Corners) Q_DECLARE_OPERATORS_FOR_FLAGS(Adwaita::Sides) #endif // ADWAITA_H adwaita-qt-1.4.1/src/lib/adwaitaaddeventfilter.cpp000066400000000000000000000025531414271704400221560ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaaddeventfilter.h" adwaita-qt-1.4.1/src/lib/adwaitaaddeventfilter.h000066400000000000000000000036621414271704400216250ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_ADD_EVENT_FILTER_H #define ADWAITA_ADD_EVENT_FILTER_H #include #include #include "adwaitaqt_export.h" namespace Adwaita { class ADWAITAQT_EXPORT AddEventFilter : public QObject { Q_OBJECT public: //* constructor AddEventFilter() : QObject() { } //* destructor virtual ~AddEventFilter() { } //* event filter /** blocks all AddChild events */ virtual bool eventFilter(QObject *, QEvent *event) { return event->type() == QEvent::ChildAdded; } }; } // namespace Adwaita #endif // ADWAITA_ADD_EVENT_FILTER_H adwaita-qt-1.4.1/src/lib/adwaitacolors.cpp000066400000000000000000001075111414271704400204570ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2021 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitacolors.h" #include "adwaitacolors_p.h" #include "adwaitadebug.h" #include "animations/adwaitaanimationdata.h" #include #include #include #include #include #include Q_LOGGING_CATEGORY(ADWAITA, "adwaita.colors") namespace Adwaita { Q_GLOBAL_STATIC(ColorsPrivate, colorsGlobal) //* contrast for arrow and treeline rendering static const qreal arrowShade = 0.15; QColor Colors::alphaColor(QColor color, qreal alpha) { if (alpha >= 0 && alpha < 1.0) { color.setAlphaF(alpha * color.alphaF()); } return color; } QColor Colors::darken(const QColor &color, qreal amount) { #if QT_VERSION >= 0x060000 float h, s, l, a; color.getHslF(&h, &s, &l, &a); float lightness = l - amount; #else qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal lightness = l - amount; #endif if (lightness < 0) { lightness = 0; } return QColor::fromHslF(h, s, lightness, a); } QColor Colors::desaturate(const QColor &color, qreal amount) { #if QT_VERSION >= 0x060000 float h, s, l, a; color.getHslF(&h, &s, &l, &a); float saturation = s - amount; #else qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal saturation = s - amount; #endif if (saturation < 0) { saturation = 0; } return QColor::fromHslF(h, saturation, l, a); } QColor Colors::lighten(const QColor &color, qreal amount) { #if QT_VERSION >= 0x060000 float h, s, l, a; color.getHslF(&h, &s, &l, &a); float lightness = l + amount; #else qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal lightness = l + amount; #endif if (lightness > 1) { lightness = 1; } return QColor::fromHslF(h, s, lightness, a); } QColor Colors::mix(const QColor &c1, const QColor &c2, qreal bias) { auto mixQreal = [](qreal a, qreal b, qreal bias) { return a + (b - a) * bias; }; if (bias <= 0.0) { return c1; } if (bias >= 1.0) { return c2; } if (std::isnan(bias)) { return c1; } qreal r = mixQreal(c1.redF(), c2.redF(), bias); qreal g = mixQreal(c1.greenF(), c2.greenF(), bias); qreal b = mixQreal(c1.blueF(), c2.blueF(), bias); qreal a = mixQreal(c1.alphaF(), c2.alphaF(), bias); return QColor::fromRgbF(r, g, b, a); } QColor Colors::transparentize(const QColor &color, qreal amount) { #if QT_VERSION >= 0x060000 float h, s, l, a; color.getHslF(&h, &s, &l, &a); float alpha = a - amount; #else qreal h, s, l, a; color.getHslF(&h, &s, &l, &a); qreal alpha = a - amount; #endif if (alpha < 0) { alpha = 0; } return QColor::fromHslF(h, s, l, alpha); } static ColorsPrivate::AdwaitaColor colorNameToEnum(const QString &name) { Q_ASSERT(!name.isEmpty()); QMetaObject metaObject = ColorsPrivate::staticMetaObject; QMetaEnum metaEnum = metaObject.enumerator(metaObject.indexOfEnumerator("AdwaitaColor")); ColorsPrivate::AdwaitaColor value = static_cast(metaEnum.keyToValue(name.toLatin1())); return (value <= ColorsPrivate::invalid_color || value > ColorsPrivate::alt_focus_border_color) ? ColorsPrivate::invalid_color : value; } static QColor colorFromText(const QString &name) { if (name == QStringLiteral("white")) { return Qt::white; } else if (name == QStringLiteral("black")) { return Qt::black; } else if (name.startsWith(QStringLiteral("rgba"))) { const QRegularExpression reRgba("^rgba\\((\\d+)[,|\\ ]+(\\d+)[,|\\ ]+(\\d+)[,|\\ ]+([\\d|\\.]+)\\)$"); const QRegularExpressionMatch reMatch = reRgba.match(name); if (reMatch.hasMatch()) { // Process captured color const int r = reMatch.captured(1).toInt(); const int g = reMatch.captured(2).toInt(); const int b = reMatch.captured(3).toInt(); const double a = reMatch.captured(4).toDouble(); return QColor(r, g, b, 255 * a); } } else if (name.startsWith(QStringLiteral("image"))) { const QRegularExpression reRgba("^image\\((.*)\\)$"); const QRegularExpressionMatch reMatch = reRgba.match(name); if (reMatch.hasMatch()) { return colorFromText(reMatch.captured(1)); } } return QColor(name); } static QString buttonColorSuffixFromOptions(const StyleOptions &options) { bool isDisabled = options.palette().currentColorGroup() == QPalette::Disabled; bool isInactive = options.palette().currentColorGroup() == QPalette::Inactive; QString result; // Checked button if (options.sunken()) { result += QStringLiteral("_checked"); } else if (isInactive && isDisabled) { result += QStringLiteral("_backdrop_insensitive"); } else if (isInactive) { result += QStringLiteral("_backdrop"); } else if (isDisabled) { result += QStringLiteral("_disabled"); } if (options.animationMode() == AnimationPressed) { // button_active_color doesn't exist if (result.isEmpty()) { result += QStringLiteral("_checked"); } else { result += QStringLiteral("_active"); } } else if (options.animationMode() == AnimationHover || options.mouseOver()) { result += QStringLiteral("_hover"); } return result; } static QString checkRadioColorSuffixFromOptions(const StyleOptions &options) { bool isDisabled = options.palette().currentColorGroup() == QPalette::Disabled; QString result; // Checked button if (options.checkboxState() != CheckOff || options.radioButtonState() != RadioOff) { result += QStringLiteral("_checked"); } if (isDisabled) { result += QStringLiteral("_disabled"); return result; } if (options.animationMode() == AnimationPressed || options.sunken()) { result += QStringLiteral("_active"); } else if (options.animationMode() == AnimationHover || options.mouseOver()) { result += QStringLiteral("_hover"); } return result; } ColorsPrivate::ColorsPrivate() { const QStringList variants = { QStringLiteral("light"), QStringLiteral("dark"), QStringLiteral("hc"), QStringLiteral("hc-dark") }; for (const QString &variant : variants) { ColorVariant colorVariant; if (variant == QStringLiteral("light")) { colorVariant = Adwaita; } else if (variant == QStringLiteral("dark")) { colorVariant = AdwaitaDark; } else if (variant == QStringLiteral("hc")) { colorVariant = AdwaitaHighcontrast; } else { colorVariant = AdwaitaHighcontrastInverse; } const QString filename = QStringLiteral(":/stylesheet/Adwaita-%1.css").arg(variant); QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { continue; } QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); if (line.isEmpty()) { continue; } if (line.startsWith(QStringLiteral("@define-color"))) { // @define-color color_name #ffffff; // @define-color color_name rgba(255, 255, 255, 0.1); const QRegularExpression reBase("^@define\\-color\\ ([a-z|_]+)\\ (.*);$"); const QRegularExpressionMatch reMatch = reBase.match(line); const AdwaitaColor colorEnum = colorNameToEnum(reMatch.captured(1)); const QColor color = colorFromText(reMatch.captured(2)); auto map = m_colors.value(colorEnum); map.insert(colorVariant, color); m_colors.insert(colorEnum, map); } else { const QRegularExpression re("^(.*)\\ \\{(.*);\\ \\}"); const QRegularExpressionMatch reMatch = re.match(line); const QString widgetColorName = reMatch.captured(1).replace(QLatin1Char(':'), QLatin1Char('_')); const QStringList properties = reMatch.captured(2).split(QLatin1Char(';')); for (const QString &property : properties) { const QRegularExpression reBase("^(.*):\\ (.*)"); const QRegularExpressionMatch reMatch = reBase.match(property.trimmed()); if (reMatch.hasMatch()) { const QString propertyName = reMatch.captured(1); const QString propertyValue = reMatch.captured(2); QString colorType; if (propertyName == QStringLiteral("background-image") || propertyName == QStringLiteral("border-color") || propertyName == QStringLiteral("color")) { const QString fullButtonColorName = QStringLiteral("%1_%2").arg(widgetColorName).arg(propertyName).replace(QLatin1Char('-'), QLatin1Char('_')); // Special case with special treatment if (propertyValue.startsWith(QStringLiteral("linear-gradient"))) { // linear-gradient(to bottom, #5d9de9 10%, #478fe6 90%) // linear-gradient(to top, #f6f5f4 2px, #fbfafa) const QRegularExpression reBase("^linear-gradient\\((.[^,]*),\\ (#[a-z|0-9]{6}|white|black).*,\\ (#[a-z|0-9]{6}|white|black).*\\)$"); const QRegularExpressionMatch reMatch = reBase.match(propertyValue); if (reMatch.hasMatch()) { const QColor firstColor = colorFromText(reMatch.captured(2)); const QColor secondColor = colorFromText(reMatch.captured(3)); const bool fromBottom = reMatch.captured(1) == QStringLiteral("to top"); const QString gradientStart = QStringLiteral("%1_%2").arg(widgetColorName).arg(QStringLiteral("gradient_start")); const QString gradientStop = QStringLiteral("%1_%2").arg(widgetColorName).arg(QStringLiteral("gradient_stop")); auto gradientStartMap = m_widgetColors.value(gradientStart); auto gradientStopMap = m_widgetColors.value(gradientStop); gradientStartMap.insert(colorVariant, fromBottom ? firstColor : secondColor); gradientStopMap.insert(colorVariant, fromBottom ? secondColor : firstColor); m_widgetColors.insert(gradientStart, gradientStartMap); m_widgetColors.insert(gradientStop, gradientStopMap); } else { // qCDebug(ADWAITA) << "Unhandled property value" << propertyValue << " for " << propertyName << " in " << fullButtonColorName; } } else { const QColor color = colorFromText(propertyValue); auto map = m_widgetColors.value(fullButtonColorName); map.insert(colorVariant, color); m_widgetColors.insert(fullButtonColorName, map); } } else { // qCDebug(ADWAITA) << "Unhandled property " << propertyName << " in " << line; } } } } } } } ColorsPrivate::~ColorsPrivate() { } QColor ColorsPrivate::adwaitaColor(AdwaitaColor color, ColorVariant variant) { return m_colors.value(color).value(variant); } QColor ColorsPrivate::adwaitaWidgetColor(const QString &color, ColorVariant variant) { QColor returnValue = m_widgetColors.value(color).value(variant); // EXPLANATION: // We try to search for a widget color, which may or may not exist and there are two // options we can fallback to: // 1) We search for a widget_state_background_image, in that case we might want to check // whether the requested color doesn't exist as a gradient. // 2) We request a color for derived state, e.g. checkradio_checked_hover_color which may // not exist as this state overrides something else while using "color" from the base // state, in this case checkradio_checked_color. if (!returnValue.isValid()) { // We can only fallback to gradient in case of background_image or to a base color of any kind if (!color.endsWith(QStringLiteral("background_image")) && !color.endsWith(QStringLiteral("color"))) { return QColor(); } // Check if requested color is in form of gradient QString gradientColorName = color; gradientColorName.replace(QStringLiteral("background_image"), QStringLiteral("gradient_start")); returnValue = m_widgetColors.value(gradientColorName).value(variant); if (returnValue.isValid()) { return returnValue; } // Check whether we can obtain requested color from base state // E.g checkradio_checked_hover_color → checkradio_checked_color QString baseColorName = color; baseColorName.replace(QStringLiteral("_active"), QString()).replace(QStringLiteral("_hover"), QString()).replace(QStringLiteral("_disabled"), QString()); // There is no base color we can try if (color == baseColorName) { return QColor(); } return adwaitaWidgetColor(baseColorName, variant); } return returnValue; } bool ColorsPrivate::isDarkMode() { const QColor textColor = QGuiApplication::palette().color(QPalette::Text); if (qSqrt(((textColor.red() * textColor.red()) * 0.299) + ((textColor.green() * textColor.green()) * 0.587) + ((textColor.blue() * textColor.blue()) * 0.114)) > 128) { return true; } return false; } QPalette Colors::disabledPalette(const QPalette &source, qreal ratio) { QPalette copy(source); const QList roles = {QPalette::Window, QPalette::Highlight, QPalette::WindowText, QPalette::ButtonText, QPalette::Text, QPalette::Button}; foreach (const QPalette::ColorRole &role, roles) { copy.setColor(role, Colors::mix(source.color(QPalette::Active, role), source.color(QPalette::Disabled, role), 1.0 - ratio)); } return copy; } QPalette Colors::palette(ColorVariant variant) { if (variant == ColorVariant::Unknown) { variant = ColorsPrivate::isDarkMode() ? ColorVariant::AdwaitaDark : ColorVariant::Adwaita; } QPalette palette; QColor buttonColor = colorsGlobal->adwaitaWidgetColor(QStringLiteral("button_background_image"), variant); QColor disabledButtonColor = colorsGlobal->adwaitaWidgetColor(QStringLiteral("button_backdrop_background_image"), variant); palette.setColor(QPalette::All, QPalette::Window, colorsGlobal->adwaitaColor(ColorsPrivate::bg_color, variant)); palette.setColor(QPalette::All, QPalette::WindowText, colorsGlobal->adwaitaColor(ColorsPrivate::fg_color, variant)); palette.setColor(QPalette::All, QPalette::Base, colorsGlobal->adwaitaColor(ColorsPrivate::base_color, variant)); palette.setColor(QPalette::All, QPalette::AlternateBase, colorsGlobal->adwaitaColor(ColorsPrivate::base_color, variant)); palette.setColor(QPalette::All, QPalette::ToolTipBase, colorsGlobal->adwaitaColor(ColorsPrivate::osd_bg_color, variant)); palette.setColor(QPalette::All, QPalette::ToolTipText, colorsGlobal->adwaitaColor(ColorsPrivate::osd_text_color, variant)); palette.setColor(QPalette::All, QPalette::Text, colorsGlobal->adwaitaColor(ColorsPrivate::fg_color, variant)); palette.setColor(QPalette::All, QPalette::Button, buttonColor); palette.setColor(QPalette::All, QPalette::ButtonText, colorsGlobal->adwaitaColor(ColorsPrivate::fg_color, variant)); palette.setColor(QPalette::All, QPalette::BrightText, colorsGlobal->adwaitaColor(ColorsPrivate::text_color, variant)); palette.setColor(QPalette::All, QPalette::Light, Colors::lighten(buttonColor)); palette.setColor(QPalette::All, QPalette::Midlight, Colors::mix(Colors::lighten(buttonColor), buttonColor)); palette.setColor(QPalette::All, QPalette::Mid, Colors::mix(Colors::darken(buttonColor), buttonColor)); palette.setColor(QPalette::All, QPalette::Dark, Colors::darken(buttonColor)); palette.setColor(QPalette::All, QPalette::Shadow, colorsGlobal->adwaitaColor(ColorsPrivate::shadow_color, variant)); palette.setColor(QPalette::All, QPalette::Highlight, colorsGlobal->adwaitaColor(ColorsPrivate::selected_bg_color, variant)); palette.setColor(QPalette::All, QPalette::HighlightedText, colorsGlobal->adwaitaColor(ColorsPrivate::selected_fg_color, variant)); palette.setColor(QPalette::All, QPalette::Link, colorsGlobal->adwaitaColor(ColorsPrivate::link_color, variant)); palette.setColor(QPalette::All, QPalette::LinkVisited, colorsGlobal->adwaitaColor(ColorsPrivate::link_visited_color, variant)); palette.setColor(QPalette::Disabled, QPalette::Window, colorsGlobal->adwaitaColor(ColorsPrivate::insensitive_bg_color, variant)); palette.setColor(QPalette::Disabled, QPalette::WindowText, colorsGlobal->adwaitaColor(ColorsPrivate::insensitive_fg_color, variant)); palette.setColor(QPalette::Disabled, QPalette::Base, colorsGlobal->adwaitaColor(ColorsPrivate::base_color, variant)); palette.setColor(QPalette::Disabled, QPalette::AlternateBase, colorsGlobal->adwaitaColor(ColorsPrivate::base_color, variant)); palette.setColor(QPalette::Disabled, QPalette::Text, colorsGlobal->adwaitaColor(ColorsPrivate::insensitive_fg_color, variant)); palette.setColor(QPalette::Disabled, QPalette::Button, colorsGlobal->adwaitaColor(ColorsPrivate::insensitive_bg_color, variant)); palette.setColor(QPalette::Disabled, QPalette::ButtonText, colorsGlobal->adwaitaColor(ColorsPrivate::insensitive_fg_color, variant)); palette.setColor(QPalette::Disabled, QPalette::BrightText, colorsGlobal->adwaitaColor(ColorsPrivate::text_color, variant)); palette.setColor(QPalette::Disabled, QPalette::Light, Colors::lighten(buttonColor)); palette.setColor(QPalette::Disabled, QPalette::Midlight, Colors::mix(Colors::lighten(buttonColor), buttonColor)); palette.setColor(QPalette::Disabled, QPalette::Mid, Colors::mix(Colors::darken(buttonColor), buttonColor)); palette.setColor(QPalette::Disabled, QPalette::Dark, Colors::darken(buttonColor)); palette.setColor(QPalette::Disabled, QPalette::Shadow, colorsGlobal->adwaitaColor(ColorsPrivate::shadow_color, variant)); palette.setColor(QPalette::Disabled, QPalette::Highlight, colorsGlobal->adwaitaColor(ColorsPrivate::selected_bg_color, variant)); palette.setColor(QPalette::Disabled, QPalette::HighlightedText, colorsGlobal->adwaitaColor(ColorsPrivate::selected_fg_color, variant)); palette.setColor(QPalette::Disabled, QPalette::Link, colorsGlobal->adwaitaColor(ColorsPrivate::link_color, variant)); palette.setColor(QPalette::Disabled, QPalette::LinkVisited, colorsGlobal->adwaitaColor(ColorsPrivate::link_visited_color, variant)); palette.setColor(QPalette::Inactive, QPalette::Window, colorsGlobal->adwaitaColor(ColorsPrivate::backdrop_bg_color, variant)); palette.setColor(QPalette::Inactive, QPalette::WindowText, colorsGlobal->adwaitaColor(ColorsPrivate::backdrop_fg_color, variant)); palette.setColor(QPalette::Inactive, QPalette::Base, colorsGlobal->adwaitaColor(ColorsPrivate::backdrop_base_color, variant)); palette.setColor(QPalette::Inactive, QPalette::AlternateBase, colorsGlobal->adwaitaColor(ColorsPrivate::backdrop_base_color, variant)); palette.setColor(QPalette::Inactive, QPalette::ToolTipBase, colorsGlobal->adwaitaColor(ColorsPrivate::osd_bg_color, variant)); palette.setColor(QPalette::Inactive, QPalette::ToolTipText, colorsGlobal->adwaitaColor(ColorsPrivate::osd_text_color, variant)); palette.setColor(QPalette::Inactive, QPalette::Text, colorsGlobal->adwaitaColor(ColorsPrivate::backdrop_fg_color, variant)); palette.setColor(QPalette::Inactive, QPalette::Button, disabledButtonColor); palette.setColor(QPalette::Inactive, QPalette::ButtonText, colorsGlobal->adwaitaColor(ColorsPrivate::backdrop_fg_color, variant)); palette.setColor(QPalette::Inactive, QPalette::BrightText, colorsGlobal->adwaitaColor(ColorsPrivate::backdrop_text_color, variant)); palette.setColor(QPalette::Inactive, QPalette::Light, Colors::lighten(buttonColor)); palette.setColor(QPalette::Inactive, QPalette::Midlight, Colors::mix(Colors::lighten(buttonColor), buttonColor)); palette.setColor(QPalette::Inactive, QPalette::Mid, Colors::mix(Colors::darken(buttonColor), buttonColor)); palette.setColor(QPalette::Inactive, QPalette::Dark, Colors::darken(buttonColor)); palette.setColor(QPalette::Inactive, QPalette::Shadow, colorsGlobal->adwaitaColor(ColorsPrivate::shadow_color, variant)); palette.setColor(QPalette::Inactive, QPalette::Highlight, colorsGlobal->adwaitaColor(ColorsPrivate::selected_bg_color, variant)); palette.setColor(QPalette::Inactive, QPalette::HighlightedText, colorsGlobal->adwaitaColor(ColorsPrivate::selected_fg_color, variant)); palette.setColor(QPalette::Inactive, QPalette::Link, colorsGlobal->adwaitaColor(ColorsPrivate::link_color, variant)); palette.setColor(QPalette::Inactive, QPalette::LinkVisited, colorsGlobal->adwaitaColor(ColorsPrivate::link_visited_color, variant)); return palette; } QColor Colors::hoverColor(const StyleOptions &options) { return options.palette().highlight().color(); } QColor Colors::focusColor(const StyleOptions &options) { return colorsGlobal->adwaitaColor(ColorsPrivate::focus_border_color, options.colorVariant()); } QColor Colors::negativeText(const StyleOptions &options) { Q_UNUSED(options) return Qt::red; } QColor Colors::selectedMenuColor(const StyleOptions &options) { return colorsGlobal->adwaitaColor(ColorsPrivate::menu_selected_color, options.colorVariant()); } QColor Colors::shadowColor(const StyleOptions &options) { return alphaColor(options.palette().color(QPalette::Shadow), 0.15); } QColor Colors::titleBarColor(const StyleOptions &options) { return options.palette().color(options.active() ? QPalette::Active : QPalette::Inactive, QPalette::Window); } QColor Colors::titleBarTextColor(const StyleOptions &options) { return options.palette().color(options.active() ? QPalette::Active : QPalette::Inactive, QPalette::WindowText); } QColor Colors::arrowOutlineColor(const StyleOptions &options) { switch (options.colorRole()) { case QPalette::Text: return mix(options.palette().color(options.colorGroup(), QPalette::Text), options.palette().color(options.colorGroup(), QPalette::Base), arrowShade); case QPalette::WindowText: return mix(options.palette().color(options.colorGroup(), QPalette::WindowText), options.palette().color(options.colorGroup(), QPalette::Window), arrowShade); case QPalette::ButtonText: return mix(options.palette().color(options.colorGroup(), QPalette::ButtonText), options.palette().color(options.colorGroup(), QPalette::Button), arrowShade); default: return options.palette().text().color(); } } QColor Colors::buttonOutlineColor(const StyleOptions &options) { const QString colorName = QStringLiteral("button") + buttonColorSuffixFromOptions(options) + QStringLiteral("_border_color"); return colorsGlobal->adwaitaWidgetColor(colorName, options.colorVariant()); } QColor Colors::indicatorOutlineColor(const StyleOptions &options) { bool isDisabled = options.palette().currentColorGroup() == QPalette::Disabled; if (options.inMenu()) { if (isDisabled) { return buttonOutlineColor(options); } if (options.colorVariant() == ColorVariant::AdwaitaDark || options.colorVariant() == AdwaitaHighcontrastInverse) { return darken(options.palette().color(QPalette::Window), 0.18); } else { return darken(options.palette().color(QPalette::Window), 0.24); } } else { const QString colorName = QStringLiteral("checkradio") + checkRadioColorSuffixFromOptions(options) + QStringLiteral("_border_color"); return colorsGlobal->adwaitaWidgetColor(colorName, options.colorVariant()); } } QColor Colors::frameOutlineColor(const StyleOptions &options) { return inputOutlineColor(options); } QColor Colors::inputOutlineColor(const StyleOptions &options) { QColor outline(buttonOutlineColor(options)); // focus takes precedence over hover if (options.animationMode() == AnimationFocus) { outline = mix(outline, focusColor(options)); } else if (options.hasFocus()) { outline = focusColor(options); } return outline; } QColor Colors::sidePanelOutlineColor(const StyleOptions &options) { QColor outline(options.palette().color(QPalette::Inactive, QPalette::Highlight)); QColor focus(options.palette().color(QPalette::Active, QPalette::Highlight)); if (options.animationMode() == AnimationFocus) { outline = mix(outline, focus, options.opacity()); } else if (options.hasFocus()) { outline = focus; } return outline; } QColor Colors::sliderOutlineColor(const StyleOptions &options) { QColor outline(mix(options.palette().color(QPalette::Window), options.palette().color(QPalette::Shadow), 0.5)); // hover takes precedence over focus if (options.animationMode() == AnimationHover) { QColor hover(hoverColor(options)); QColor focus(focusColor(options)); if (options.hasFocus()) { outline = mix(focus, hover, options.opacity()); } else { outline = mix(outline, hover, options.opacity()); } } else if (options.mouseOver()) { outline = hoverColor(options); } else if (options.animationMode() == AnimationFocus) { QColor focus(focusColor(options)); outline = mix(outline, focus, options.opacity()); } else if (options.hasFocus()) { outline = focusColor(options); } return outline; } QColor Colors::buttonBackgroundColor(const StyleOptions &options) { bool isDisabled = options.palette().currentColorGroup() == QPalette::Disabled; if (isDisabled && (options.animationMode() == AnimationPressed || options.sunken())) { return colorsGlobal->adwaitaWidgetColor(QStringLiteral("button_disabled_active_background_image"), options.colorVariant()); } if (options.animationMode() == AnimationPressed) { const QString buttonColor = options.sunken() ? QStringLiteral("button_checked_hover_background_image") : QStringLiteral("button_hover_background_image"); const QString buttonHoverColor = options.sunken() ? QStringLiteral("button_checked_active_background_image") : QStringLiteral("button_checked_background_image"); return Colors::mix(colorsGlobal->adwaitaWidgetColor(buttonColor, options.colorVariant()), colorsGlobal->adwaitaWidgetColor(buttonHoverColor, options.colorVariant()), options.opacity()); } else if (options.animationMode() == AnimationHover) { const QString buttonColor = options.sunken() ? QStringLiteral("button_checked_background_image") : QStringLiteral("button_background_image"); const QString buttonHoverColor = options.sunken() ? QStringLiteral("button_checked_hover_background_image") : QStringLiteral("button_hover_background_image"); return Colors::mix(colorsGlobal->adwaitaWidgetColor(buttonColor, options.colorVariant()), colorsGlobal->adwaitaWidgetColor(buttonHoverColor, options.colorVariant()), options.opacity()); } const QString colorName = QStringLiteral("button") + buttonColorSuffixFromOptions(options) + QStringLiteral("_background_image"); return colorsGlobal->adwaitaWidgetColor(colorName, options.colorVariant()); } QLinearGradient Colors::buttonBackgroundGradient(const StyleOptions &options) { const QString gradientName = QStringLiteral("button") + buttonColorSuffixFromOptions(options) + QStringLiteral("_gradient_stop"); QColor gradientStartColor = buttonBackgroundColor(options); QColor gradientStopColor = colorsGlobal->adwaitaWidgetColor(gradientName, options.colorVariant()); QLinearGradient gradient(options.rect().bottomLeft(), options.rect().topLeft()); gradient.setColorAt(0, gradientStartColor); gradient.setColorAt(1, gradientStopColor.isValid() ? gradientStopColor : gradientStartColor); return gradient; } QColor Colors::checkBoxIndicatorColor(const StyleOptions &options) { if (options.inMenu()) { return options.palette().color(QPalette::Text); } else { if (options.active()) { return options.palette().color(QPalette::HighlightedText); } else { return Colors::transparentize(options.palette().color(QPalette::ToolTipText), 0.2); } } } QColor Colors::headerTextColor(const StyleOptions &options) { QColor col(options.palette().color(QPalette::WindowText)); if (options.state() & QStyle::State_Enabled) { if (options.state() & QStyle::State_Sunken) { return Colors::alphaColor(col, 0.9); } else if (options.state() & QStyle::State_MouseOver) { return Colors::alphaColor(col, 0.7); } } return Colors::alphaColor(col, 0.5); } QColor Colors::indicatorBackgroundColor(const StyleOptions &options) { if (options.inMenu()) { return Qt::transparent; } if (options.animationMode() == AnimationPressed) { const QString checkradioColor = options.checkboxState() == CheckOff && options.radioButtonState() == RadioOff ? QStringLiteral("checkradio_hover_background_image") : QStringLiteral("checkradio_checked_hover_background_image"); const QString checkradioHoverColor = options.checkboxState() == CheckOff && options.radioButtonState() == RadioOff ? QStringLiteral("checkradio_checked_background_image") : QStringLiteral("checkradio_checked_active_background_image"); return Colors::mix(colorsGlobal->adwaitaWidgetColor(checkradioColor, options.colorVariant()), colorsGlobal->adwaitaWidgetColor(checkradioHoverColor, options.colorVariant()), options.opacity()); } else if (options.animationMode() == AnimationHover) { const QString checkradioColor = options.checkboxState() == CheckOff && options.radioButtonState() == RadioOff ? QStringLiteral("checkradio_background_image") : QStringLiteral("checkradio_checked_background_image"); const QString checkradioHoverColor = options.checkboxState() == CheckOff && options.radioButtonState() == RadioOff ? QStringLiteral("checkradio_hover_background_image") : QStringLiteral("checkradio_checked_hover_background_image"); return Colors::mix(colorsGlobal->adwaitaWidgetColor(checkradioColor, options.colorVariant()), colorsGlobal->adwaitaWidgetColor(checkradioHoverColor, options.colorVariant()), options.opacity()); } const QString colorName = QStringLiteral("checkradio") + checkRadioColorSuffixFromOptions(options) + QStringLiteral("_background_image"); return colorsGlobal->adwaitaWidgetColor(colorName, options.colorVariant()); } QLinearGradient Colors::indicatorBackgroundGradient(const StyleOptions &options) { const QString gradientName = QStringLiteral("checkradio") + checkRadioColorSuffixFromOptions(options) + QStringLiteral("_gradient_stop"); QColor gradientStartColor = indicatorBackgroundColor(options); QColor gradientStopColor = colorsGlobal->adwaitaWidgetColor(gradientName, options.colorVariant()); QLinearGradient gradient(options.rect().bottomLeft(), options.rect().topLeft()); gradient.setColorAt(0, gradientStartColor); gradient.setColorAt(1, gradientStopColor.isValid() && !options.inMenu() ? gradientStopColor : gradientStartColor); return gradient; } QColor Colors::frameBackgroundColor(const StyleOptions &options) { return Colors::mix(options.palette().color(options.colorGroup(), QPalette::Window), options.palette().color(options.colorGroup(), QPalette::Base), 0.3); } QColor Colors::scrollBarHandleColor(const StyleOptions &options) { QColor fgColor = options.palette().color(QPalette::Text); QColor bgColor = options.palette().color(QPalette::Window); QColor selectedBgColor = options.palette().color(QPalette::Highlight); QColor color(Colors::mix(fgColor, bgColor, 0.4)); QColor hoverColor(Colors::mix(fgColor, bgColor, 0.2)); QColor activeColor(options.colorVariant() == ColorVariant::AdwaitaDark || options.colorVariant() == ColorVariant::AdwaitaHighcontrastInverse ? Colors::lighten(selectedBgColor, 0.1) : Colors::darken(selectedBgColor, 0.1)); // hover takes precedence over focus if (options.animationMode() == AnimationPressed) { if (options.mouseOver()) { color = Colors::mix(hoverColor, activeColor, options.opacity()); } else { color = Colors::mix(color, activeColor, options.opacity()); } } else if (options.sunken()) { color = activeColor; } else if (options.animationMode() == AnimationHover) { color = Colors::mix(color, hoverColor, options.opacity()); } else if (options.mouseOver()) { color = hoverColor; } return color; } QColor Colors::separatorColor(const StyleOptions &options) { return buttonOutlineColor(options); } QColor Colors::toolButtonColor(const StyleOptions &options) { if (options.sunken() || (options.animationMode() != AnimationNone && options.animationMode() != AnimationHover)) { return buttonBackgroundColor(options); } return Qt::transparent; } QColor Colors::tabBarColor(const StyleOptions &options) { QColor background(Colors::mix(options.palette().window().color(), options.palette().shadow().color(), 0.15)); if (!(options.state() & QStyle::State_Enabled)) { background = background.lighter(115); } if (!(options.state() & QStyle::State_Active)) { background = background.lighter(115); } return background; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/adwaitacolors.h000066400000000000000000000154541414271704400201300ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2021 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_COLORS_H #define ADWAITA_COLORS_H #include "adwaita.h" #include "adwaitaqt_export.h" #include namespace Adwaita { class ADWAITAQT_EXPORT Colors { public: // Color adjustments static QColor alphaColor(QColor color, qreal alpha); static QColor darken(const QColor &color, qreal amount = 0.1); static QColor desaturate(const QColor &color, qreal amount = 0.1); static QColor lighten(const QColor &color, qreal amount = 0.1); static QColor mix(const QColor &c1, const QColor &c2, qreal bias = 0.5); static QColor transparentize(const QColor &color, qreal amount = 0.1); static QPalette disabledPalette(const QPalette &source, qreal ratio); // Color palette for each Adwaita variant static QPalette palette(ColorVariant variant = ColorVariant::Unknown); // Generic colors /* Relevant options: * palette */ static QColor hoverColor(const StyleOptions &options); /* Relevant options: * palette */ static QColor focusColor(const StyleOptions &options); /* Relevant options: * palette */ static QColor negativeText(const StyleOptions &options); /* Relevant options: * palette */ static QColor selectedMenuColor(const StyleOptions &options); /* Relevant options: * palette */ static QColor shadowColor(const StyleOptions &options); /* Relevant options: * palette * active */ static QColor titleBarColor(const StyleOptions &options); /* Relevant options: * palette * active */ static QColor titleBarTextColor(const StyleOptions &options); // Outline colors /* Relevant options: * palette * color role * color group */ static QColor arrowOutlineColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * opacity * animation mode * color variant */ static QColor buttonOutlineColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * opacity * animation mode * checkbox state * color variant * in menu */ static QColor indicatorOutlineColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * opacity * animation mode * color variant */ static QColor frameOutlineColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * opacity * animation mode * color variant */ static QColor inputOutlineColor(const StyleOptions &options); /* Relevant options: * palette * has focus * opacity * animation mode */ static QColor sidePanelOutlineColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * opacity * animation mode */ static QColor sliderOutlineColor(const StyleOptions &options); // Background colors /* Relevant options: * palette * mouse over * has focus * sunken * opacity * animation mode * color variant */ static QColor buttonBackgroundColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * sunken * opacity * animation mode * color variant */ static QLinearGradient buttonBackgroundGradient(const StyleOptions &options); /* Relevant options: * palette * mouse over * active * opacity * animation mode * color variant */ static QColor checkBoxIndicatorColor(const StyleOptions &options); /* Relevant options: * palette * state */ static QColor headerTextColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * sunken * opacity * animation mode * checkbox state * color variant * in menu */ static QColor indicatorBackgroundColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * sunken * opacity * animation mode * checkbox state * color variant * in menu */ static QLinearGradient indicatorBackgroundGradient(const StyleOptions &options); /* Relevant options: * palette */ static QColor frameBackgroundColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * sunken * opacity * animation mode * color variant */ static QColor scrollBarHandleColor(const StyleOptions &options); /* Relevant options: * palette * color variant */ static QColor separatorColor(const StyleOptions &options); /* Relevant options: * palette * mouse over * has focus * sunken * opacity * animation mode */ static QColor toolButtonColor(const StyleOptions &options); /* Relevant options: * palette */ static QColor tabBarColor(const StyleOptions &options); }; } // namespace Adwaita #endif // ADWAITA_COLORS_H adwaita-qt-1.4.1/src/lib/adwaitacolors_p.h000066400000000000000000000070321414271704400204400ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2019-2021 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_COLORS_P_H #define ADWAITA_COLORS_P_H #include "adwaita.h" #include class QColor; namespace Adwaita { class ColorsPrivate : public QObject { Q_OBJECT public: enum AdwaitaColor { invalid_color= 0, base_color, text_color, bg_color, fg_color, selected_fg_color, selected_bg_color, selected_borders_color, borders_color, alt_borders_color, borders_edge, link_color, link_visited_color, top_hilight, dark_fill, headerbar_bg_color, menu_color, menu_selected_color, scrollbar_bg_color, scrollbar_slider_color, scrollbar_slider_hover_color, scrollbar_slider_active_color, warning_color, error_color, success_color, destructive_color, osd_fg_color, osd_text_color, osd_bg_color, osd_insensitive_bg_color, osd_insensitive_fg_color, osd_borders_color, sidebar_bg_color, tooltip_borders_color, shadow_color, drop_target_color, insensitive_fg_color, insensitive_bg_color, insensitive_borders_color, backdrop_base_color, backdrop_text_color, backdrop_bg_color, backdrop_fg_color, backdrop_insensitive_color, backdrop_selected_fg_color, backdrop_borders_color, backdrop_dark_fill, suggested_bg_color, suggested_border_color, progress_bg_color, progress_border_color, checkradio_bg_color, checkradio_fg_color, checkradio_borders_color, switch_bg_color, switch_borders_color, focus_border_color, alt_focus_border_color }; Q_ENUM(AdwaitaColor); ColorsPrivate(); virtual ~ColorsPrivate(); QColor adwaitaColor(AdwaitaColor color, ColorVariant variant); QColor adwaitaWidgetColor(const QString &color, ColorVariant variant); static bool isDarkMode(); private: QHash > m_colors; QHash > m_widgetColors; }; } // namespace Adwaita #endif // ADWAITA_COLORS_P_H adwaita-qt-1.4.1/src/lib/adwaitadebug.h000066400000000000000000000027251414271704400177120ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2019 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_DEBUG_H #define ADWAITA_DEBUG_H #include Q_DECLARE_LOGGING_CATEGORY(ADWAITA) #endif // ADWAITA_DEBUG_H adwaita-qt-1.4.1/src/lib/adwaitamnemonics.cpp000066400000000000000000000055231414271704400211460ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitamnemonics.h" #include "adwaita.h" #include #include namespace Adwaita { //____________________________________________________ void Mnemonics::setMode(int mode) { switch (mode) { case Adwaita::MN_NEVER: qApp->removeEventFilter(this); setEnabled(false); break; case Adwaita::MN_ALWAYS: qApp->removeEventFilter(this); setEnabled(true); break; case Adwaita::MN_AUTO: qApp->removeEventFilter(this); qApp->installEventFilter(this); setEnabled(false); break; default: break; } return; } //____________________________________________________ bool Mnemonics::eventFilter(QObject *, QEvent *event) { switch (event->type()) { case QEvent::KeyPress: if (static_cast(event)->key() == Qt::Key_Alt) { setEnabled(true); } break; case QEvent::KeyRelease: if (static_cast(event)->key() == Qt::Key_Alt) { setEnabled(false); } break; case QEvent::ApplicationStateChange: setEnabled(false); break; default: break; } return false; } //____________________________________________________ void Mnemonics::setEnabled(bool value) { if (_enabled == value) { return; } _enabled = value; // update all top level widgets foreach (QWidget *widget, qApp->topLevelWidgets()) { widget->update(); } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/adwaitamnemonics.h000066400000000000000000000043761414271704400206200ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_MNEMONICS_H #define ADWAITA_MNEMONICS_H #include "adwaitaqt_export.h" #include #include #include namespace Adwaita { class ADWAITAQT_EXPORT Mnemonics : public QObject { Q_OBJECT public: //* constructor explicit Mnemonics(QObject *parent) : QObject(parent) , _enabled(true) { } //* destructor virtual ~Mnemonics() { } //* set mode void setMode(int); //* event filter virtual bool eventFilter(QObject *, QEvent *); //* true if mnemonics are enabled const bool &enabled() const { return _enabled; } //* alignment flag int textFlags() const { return _enabled ? Qt::TextShowMnemonic : Qt::TextHideMnemonic; } protected: //* set enable state void setEnabled(bool); private: //* enable state bool _enabled; }; } // namespace Adwaita #endif // ADWAITA_MNEMONICS_H adwaita-qt-1.4.1/src/lib/adwaitaqt_export.h000066400000000000000000000013231414271704400206420ustar00rootroot00000000000000#ifndef ADWAITAQT_EXPORT_H #define ADWAITAQT_EXPORT_H #if defined(_WIN32) # define ADWAITAQT_EXPORT __declspec(dllexport) #elif defined(__GNUC__) # define ADWAITAQT_EXPORT __attribute__((visibility("default"))) #else # define ADWAITAQT_EXPORT #endif #ifndef ADWAITAQT_NO_EXPORT # define ADWAITAQT_NO_EXPORT __attribute__((visibility("hidden"))) #endif #ifndef ADWAITAQT_DEPRECATED # define ADWAITAQT_DEPRECATED __attribute__ ((__deprecated__)) #endif #ifndef ADWAITAQT_DEPRECATED_EXPORT # define ADWAITAQT_DEPRECATED_EXPORT ADWAITAQT_EXPORT ADWAITAQT_DEPRECATED #endif #ifndef ADWAITAQT_DEPRECATED_NO_EXPORT # define ADWAITAQT_DEPRECATED_NO_EXPORT ADWAITAQT_NO_EXPORT ADWAITAQT_DEPRECATED #endif #endif adwaita-qt-1.4.1/src/lib/adwaitarenderer.cpp000066400000000000000000001173041414271704400207650ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2021 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitarenderer.h" #include "adwaitacolors.h" #include #include #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif namespace Adwaita { static qreal frameRadius(qreal bias = 0) { return qMax(qreal(Metrics::Frame_FrameRadius) - 0.5 + bias, 0.0); } static QPainterPath roundedPath(const QRectF &rect, Corners corners, qreal radius) { QPainterPath path; // simple cases if (corners == 0) { path.addRect(rect); return path; } if (corners == AllCorners) { path.addRoundedRect(rect, radius, radius); return path; } QSizeF cornerSize(2 * radius, 2 * radius); // rotate counterclockwise // top left corner if (corners & CornerTopLeft) { path.moveTo(rect.topLeft() + QPointF(radius, 0)); path.arcTo(QRectF(rect.topLeft(), cornerSize), 90, 90); } else { path.moveTo(rect.topLeft()); } // bottom left corner if (corners & CornerBottomLeft) { path.lineTo(rect.bottomLeft() - QPointF(0, radius)); path.arcTo(QRectF(rect.bottomLeft() - QPointF(0, 2 * radius), cornerSize), 180, 90); } else { path.lineTo(rect.bottomLeft()); } // bottom right corner if (corners & CornerBottomRight) { path.lineTo(rect.bottomRight() - QPointF(radius, 0)); path.arcTo(QRectF(rect.bottomRight() - QPointF(2 * radius, 2 * radius), cornerSize), 270, 90); } else { path.lineTo(rect.bottomRight()); } // top right corner if (corners & CornerTopRight) { path.lineTo(rect.topRight() + QPointF(0, radius)); path.arcTo(QRectF(rect.topRight() - QPointF(2 * radius, 0), cornerSize), 0, 90); } else { path.lineTo(rect.topRight()); } path.closeSubpath(); return path; } void Renderer::renderDebugFrame(const StyleOptions &options) { if (!options.painter()) { return; } options.painter()->save(); options.painter()->setRenderHints(QPainter::Antialiasing); options.painter()->setBrush(Qt::NoBrush); options.painter()->setPen(Qt::red); options.painter()->drawRect(QRectF(options.rect()).adjusted(0.5, 0.5, -0.5, -0.5)); options.painter()->restore(); } void Renderer::renderFocusRect(const StyleOptions &options, Sides sides) { if (!options.painter()) { return; } if (!options.color().isValid()) { return; } options.painter()->save(); options.painter()->setRenderHints(QPainter::Antialiasing); options.painter()->setBrush(options.color()); if (!(options.outlineColor().isValid() && sides)) { options.painter()->setPen(Qt::NoPen); options.painter()->drawRect(options.rect()); } else { options.painter()->setClipRect(options.rect()); QRectF copy(options.rect()); copy.adjust(0.5, 0.5, -0.5, -0.5); qreal radius(frameRadius(-1.0)); if (!(sides & SideTop)) { copy.adjust(0, -radius, 0, 0); } if (!(sides & SideBottom)) { copy.adjust(0, 0, 0, radius); } if (!(sides & SideLeft)) { copy.adjust(-radius, 0, 0, 0); } if (!(sides & SideRight)) { copy.adjust(0, 0, radius, 0); } options.painter()->setPen(options.outlineColor()); // options.painter()->setBrush( Qt::NoBrush ); options.painter()->drawRoundedRect(copy, radius, radius); } options.painter()->restore(); } void Renderer::renderFocusLine(const StyleOptions &options) { if (!options.painter()) { return; } if (!options.color().isValid()) { return; } options.painter()->save(); QPen pen(options.color(), 1); pen.setStyle(Qt::DotLine); options.painter()->setRenderHint(QPainter::Antialiasing, false); options.painter()->setPen(pen); options.painter()->setBrush(Qt::NoBrush); options.painter()->drawRoundedRect(options.rect(), 1, 1); options.painter()->restore(); } void Renderer::renderFrame(const StyleOptions &options) { if (!options.painter()) { return; } options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing); QRectF frameRect(options.rect().adjusted(1, 1, -1, -1)); qreal radius(frameRadius()); // set pen if (options.outlineColor().isValid()) { if (options.hasFocus()) { options.painter()->setPen(QPen(options.outlineColor(), 2)); frameRect.adjust(0.5, 0.5, -0.5, -0.5); } else { options.painter()->setPen(options.outlineColor()); } frameRect.adjust(0.5, 0.5, -0.5, -0.5); radius = qMax(radius - 1, qreal(0.0)); } else { options.painter()->setPen(Qt::NoPen); } // set brush if (options.color().isValid()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } // render options.painter()->drawRoundedRect(frameRect, radius, radius); options.painter()->restore(); } void Renderer::renderSquareFrame(const StyleOptions &options) { if (!options.painter()) { return; } options.painter()->save(); options.painter()->setPen(options.color()); options.painter()->drawRect(options.rect().adjusted(1, 1, -2, -2)); if (options.hasFocus()) { options.color().setAlphaF(0.5); options.painter()->setPen(options.color()); options.painter()->drawRect(options.rect().adjusted(0, 0, -1, -1)); } options.painter()->restore(); } void Renderer::renderFlatFrame(const StyleOptions &options) { if (!options.painter()) { return; } options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing); QRectF frameRect(options.rect().adjusted(1, 1, -1, -1)); qreal radius(frameRadius()); // set pen if (options.outlineColor().isValid()) { if (options.hasFocus()) { options.painter()->setPen(QPen(options.outlineColor(), 2)); frameRect.adjust(0.5, 0.5, -0.5, -0.5); } else { options.painter()->setPen(options.outlineColor()); } frameRect.adjust(0.5, 0.5, -0.5, -0.5); radius = qMax(radius - 1, qreal(0.0)); } else { options.painter()->setPen(Qt::NoPen); } // set brush if (options.color().isValid()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } QPainterPath path; path.setFillRule(Qt::WindingFill); path.addRect(frameRect.adjusted(2 * radius, 0, 0, 0)); path.addRoundedRect(frameRect.adjusted(0, 0, - 2 * radius, 0), radius, radius); options.painter()->drawPath(path.simplified()); options.painter()->restore(); // render //options.painter()->drawRoundedRect( frameRect, radius, radius ); } void Renderer::renderFlatRoundedButtonFrame(const StyleOptions &options) { if (!options.painter()) { return; } options.painter()->save(); // setup options.painter() options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() QRectF frameRect(options.rect()); frameRect.adjust(1, 1, -1, -1); qreal radius(frameRadius()); if (options.outlineColor().isValid()) { options.painter()->setPen(QPen(options.outlineColor(), 1.0)); frameRect.adjust(0.5, 0.5, -0.5, -0.5); radius = qMax(radius - 1, qreal(0.0)); } else { options.painter()->setPen(Qt::NoPen); } // content if (options.color().isValid() && options.active()) { options.painter()->setBrush(Colors::buttonBackgroundGradient(options)); } else if (!options.active()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } // render options.painter()->drawEllipse(frameRect); options.painter()->restore(); } void Renderer::renderSidePanelFrame(const StyleOptions &options, Side side) { if (!options.painter()) { return; } // check color if (!options.outlineColor().isValid()) { return; } // adjust options.rect() QRectF frameRect(options.rect().adjusted(1, 1, -1, -1)); frameRect.adjust(0.5, 0.5, -0.5, -0.5); // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing); options.painter()->setPen(options.outlineColor()); // render switch (side) { case SideLeft: frameRect.adjust(0, 1, 0, -1); options.painter()->drawLine(frameRect.topRight(), frameRect.bottomRight()); break; case SideTop: frameRect.adjust(1, 0, -1, 0); options.painter()->drawLine(frameRect.topLeft(), frameRect.topRight()); break; case SideRight: frameRect.adjust(0, 1, 0, -1); options.painter()->drawLine(frameRect.topLeft(), frameRect.bottomLeft()); break; case SideBottom: frameRect.adjust(1, 0, -1, 0); options.painter()->drawLine(frameRect.bottomLeft(), frameRect.bottomRight()); break; case AllSides: { qreal radius(frameRadius(-1.0)); options.painter()->drawRoundedRect(frameRect, radius, radius); break; } default: break; } options.painter()->restore(); } void Renderer::renderMenuFrame(const StyleOptions &options, bool roundCorners) { if (!options.painter()) { return; } options.painter()->save(); // set brush if (options.color().isValid()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } options.painter()->setRenderHint(QPainter::Antialiasing, false); QRectF frameRect(options.rect()); if (options.outlineColor().isValid()) { options.painter()->setPen(options.outlineColor()); frameRect.adjust(0.5, 0.5, -0.5, -0.5); } else { options.painter()->setPen(Qt::NoPen); } options.painter()->drawRect(frameRect); options.painter()->restore(); } void Renderer::renderButtonFrame(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() QRectF frameRect(options.rect()); frameRect.adjust(1, 1, -1, -1); qreal radius(frameRadius()); if (options.outlineColor().isValid()) { options.painter()->setPen(QPen(options.outlineColor(), 1.0)); frameRect.adjust(0.5, 0.5, -0.5, -0.5); radius = qMax(radius - 1, qreal(0.0)); } else { options.painter()->setPen(Qt::NoPen); } // content if (options.color().isValid() && options.active()) { options.painter()->setBrush(Colors::buttonBackgroundGradient(options)); } else if (!options.active()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } // render options.painter()->drawRoundedRect(frameRect, radius, radius); if (!options.sunken() && options.active() && options.color().isValid()) { options.painter()->setPen(options.color().lighter(140)); options.painter()->drawLine(frameRect.topLeft() + QPoint(3, 1), frameRect.topRight() + QPoint(-3, 1)); options.painter()->setPen(options.outlineColor().darker(114)); options.painter()->drawLine(frameRect.bottomLeft() + QPointF(2.7, 0), frameRect.bottomRight() + QPointF(-2.7, 0)); } options.painter()->restore(); } void Renderer::renderCheckBoxFrame(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() QRectF frameRect(options.rect()); frameRect.adjust(1, 1, -1, -1); qreal radius(frameRadius()); if (options.outlineColor().isValid()) { options.painter()->setPen(QPen(options.outlineColor(), 1.0)); frameRect.adjust(0.5, 0.5, -0.5, -0.5); radius = qMax(radius - 1, qreal(0.0)); } else { options.painter()->setPen(Qt::NoPen); } if (options.color().isValid() && options.active()) { options.painter()->setBrush(Colors::indicatorBackgroundGradient(options)); } else if (!options.active()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } // render options.painter()->drawRoundedRect(frameRect, radius, radius); options.painter()->restore(); } void Renderer::renderFlatButtonFrame(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() QRectF frameRect(options.rect()); frameRect.adjust(1, 1, -1, -1); qreal radius(frameRadius()); if (options.outlineColor().isValid()) { options.painter()->setPen(QPen(options.outlineColor(), 1.0)); frameRect.adjust(0.5, 0.5, -0.5, -0.5); radius = qMax(radius - 1, qreal(0.0)); } else { options.painter()->setPen(Qt::NoPen); } // content if (options.color().isValid()) { QLinearGradient gradient(frameRect.topLeft(), frameRect.bottomLeft()); //gradient.setColorAt( 0, options.color().darker( sunken ? 110 : (options.hasFocus()|mouseOver) ? 85 : 100 ) ); //gradient.setColorAt( 1, options.color().darker( sunken ? 130 : (options.hasFocus()|mouseOver) ? 95 : 110 ) ); if (!options.active()) { gradient.setColorAt(0, options.color()); } else if (options.sunken()) { gradient.setColorAt(0, options.color()); } else { gradient.setColorAt(0, Colors::mix(options.color(), Qt::white, 0.07)); gradient.setColorAt(1, Colors::mix(options.color(), Qt::black, 0.1)); } options.painter()->setBrush(gradient); } else { options.painter()->setBrush(Qt::NoBrush); } QPainterPath path; path.setFillRule(Qt::WindingFill); path.addRoundedRect(frameRect.adjusted(2 * radius, 0, 0, 0), radius, radius); path.addRect(frameRect.adjusted(0, 0, -2 * radius, 0)); options.painter()->drawPath(path.simplified()); if (!options.sunken() && options.active()) { options.painter()->setPen(options.color().lighter(140)); options.painter()->drawLine(frameRect.topLeft() + QPoint(1, 1), frameRect.topRight() + QPoint(-3, 1)); options.painter()->setPen(options.outlineColor().darker(114)); options.painter()->drawLine(frameRect.bottomLeft() + QPointF(0.7, 0), frameRect.bottomRight() + QPointF(-2.7, 0)); } // render //options.painter()->drawRoundedRect( frameRect, radius, radius ); options.painter()->restore(); } void Renderer::renderToolButtonFrame(const StyleOptions &options) { if (!options.painter()) { return; } // do nothing for invalid color if (!options.color().isValid()) return; // setup options.painter() options.painter()->save(); options.painter()->setRenderHints(QPainter::Antialiasing); QRectF baseRect(options.rect()); if (options.sunken()) { qreal radius(frameRadius()); options.painter()->setPen(Qt::NoPen); options.painter()->setBrush(options.color()); QRectF contentRect(baseRect.adjusted(1, 1, -1, -1)); options.painter()->drawRoundedRect(contentRect, radius, radius); } else { qreal radius(frameRadius(-0.5)); options.painter()->setPen(options.color()); options.painter()->setBrush(Qt::NoBrush); QRectF outlineRect(baseRect.adjusted(1.5, 1.5, -1.5, -1.5)); options.painter()->drawRoundedRect(outlineRect, radius, radius); } options.painter()->restore(); } void Renderer::renderToolBoxFrame(const StyleOptions &options, int tabWidth) { if (!options.painter()) { return; } if (!options.outlineColor().isValid()) { return; } // round radius qreal radius(frameRadius()); QSizeF cornerSize(2 * radius, 2 * radius); // if options.rect() - tabwidth is even, need to increase tabWidth by 1 unit // for anti aliasing if (!((options.rect().width() - tabWidth) % 2)) { ++tabWidth; } // adjust options.rect() for antialiasing QRectF baseRect(options.rect()); baseRect.adjust(0.5, 0.5, -0.5, -0.5); // create path QPainterPath path; path.moveTo(0, baseRect.height() - 1); path.lineTo((baseRect.width() - tabWidth) / 2 - radius, baseRect.height() - 1); path.arcTo(QRectF(QPointF((baseRect.width() - tabWidth) / 2 - 2 * radius, baseRect.height() - 1 - 2 * radius), cornerSize), 270, 90); path.lineTo((baseRect.width() - tabWidth) / 2, radius); path.arcTo(QRectF(QPointF((baseRect.width() - tabWidth) / 2, 0), cornerSize), 180, -90); path.lineTo((baseRect.width() + tabWidth) / 2 - 1 - radius, 0); path.arcTo(QRectF(QPointF((baseRect.width() + tabWidth) / 2 - 1 - 2 * radius, 0), cornerSize), 90, -90); path.lineTo((baseRect.width() + tabWidth) / 2 - 1, baseRect.height() - 1 - radius); path.arcTo(QRectF(QPointF((baseRect.width() + tabWidth) / 2 - 1, baseRect.height() - 1 - 2 * radius), cornerSize), 180, 90); path.lineTo(baseRect.width() - 1, baseRect.height() - 1); // render options.painter()->save(); options.painter()->setRenderHints(QPainter::Antialiasing); options.painter()->setBrush(Qt::NoBrush); options.painter()->setPen(options.outlineColor()); options.painter()->translate(baseRect.topLeft()); options.painter()->drawPath(path); options.painter()->restore(); return; } void Renderer::renderTabWidgetFrame(const StyleOptions &options, Corners corners) { if (!options.painter()) { return; } options.painter()->setRenderHint(QPainter::Antialiasing); QRectF frameRect(options.rect().adjusted(1, 1, -1, -1)); qreal radius(frameRadius()); options.painter()->save(); // set pen if (options.outlineColor().isValid()) { options.painter()->setPen(options.outlineColor()); frameRect.adjust(0.5, 0.5, -0.5, -0.5); radius = qMax(radius - 1, qreal(0.0)); } else { options.painter()->setPen(Qt::NoPen); } // set brush if (options.color().isValid()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } // render QPainterPath path(roundedPath(frameRect, corners, radius)); options.painter()->drawPath(path); options.painter()->restore(); } void Renderer::renderSelection(const StyleOptions &options) { if (!options.painter()) { return; } options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing); options.painter()->setPen(Qt::NoPen); options.painter()->setBrush(options.color()); options.painter()->drawRect(options.rect()); options.painter()->restore(); } void Renderer::renderSeparator(const StyleOptions &options, bool vertical) { if (!options.painter()) { return; } options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, false); options.painter()->setBrush(Qt::NoBrush); options.painter()->setPen(options.color()); if (vertical) { options.painter()->translate(options.rect().width() / 2, 0); options.painter()->drawLine(options.rect().topLeft(), options.rect().bottomLeft()); } else { options.painter()->translate(0, options.rect().height() / 2); options.painter()->drawLine(options.rect().topLeft(), options.rect().topRight()); } options.painter()->restore(); } void Renderer::renderCheckBoxBackground(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() and radius QRectF frameRect(options.rect()); frameRect.adjust(3, 3, -3, -3); options.painter()->setPen(options.outlineColor()); options.painter()->setBrush(options.color()); options.painter()->drawRect(frameRect); options.painter()->restore(); } void Renderer::renderCheckBox(const StyleOptions &options, const QColor &tickColor, qreal animation) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() and radius QRectF frameRect(options.rect()); frameRect.adjust(2, 2, -2, -2); // content { StyleOptions tmpStyleOptions(options.painter(), options.rect()); tmpStyleOptions.setColor(options.color()); tmpStyleOptions.setOutlineColor(options.outlineColor()); tmpStyleOptions.setHasFocus(false); tmpStyleOptions.setSunken(options.sunken()); tmpStyleOptions.setMouseOver(options.mouseOver()); tmpStyleOptions.setActive(options.active()); tmpStyleOptions.setCheckboxState(options.checkboxState()); tmpStyleOptions.setColorVariant(options.colorVariant()); tmpStyleOptions.setInMenu(options.inMenu()); renderCheckBoxFrame(tmpStyleOptions); } // mark if (options.checkboxState() == CheckOn) { options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing); options.painter()->setBrush(Qt::NoBrush); QPen pen(tickColor, 3); pen.setJoinStyle(Qt::MiterJoin); options.painter()->setPen(pen); QRectF markerRect(frameRect); QPainterPath path; path.moveTo(markerRect.right() - markerRect.width() / 4, markerRect.top() + markerRect.height() / 3); path.lineTo(markerRect.center().x(), markerRect.bottom() - markerRect.height() / 3.0); path.lineTo(markerRect.left() + markerRect.width() / 4, markerRect.center().y()); options.painter()->setClipRect(markerRect); options.painter()->drawPath(path); options.painter()->restore(); } else if (options.checkboxState() == CheckPartial) { QPen pen(tickColor, 4); pen.setCapStyle(Qt::RoundCap); options.painter()->setPen(pen); QRectF markerRect(frameRect.adjusted(4, 4, -4, -4)); options.painter()->drawLine(markerRect.center() - QPoint(3, 0), markerRect.center() + QPoint(3, 0)); } else if (options.checkboxState() == CheckAnimated) { options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing); options.painter()->setBrush(Qt::NoBrush); QPen pen(tickColor, 3); pen.setJoinStyle(Qt::MiterJoin); options.painter()->setPen(pen); QRectF markerRect(frameRect); QPainterPath path; path.moveTo(markerRect.right() - markerRect.width() / 4, markerRect.top() + markerRect.height() / 3); path.lineTo(markerRect.center().x(), markerRect.bottom() - markerRect.height() / 3.0); path.lineTo(markerRect.left() + markerRect.width() / 4, markerRect.center().y()); path.translate(-markerRect.right(), -markerRect.top()); options.painter()->setClipRect(markerRect.adjusted(1, 1, -1, -1)); options.painter()->translate(markerRect.right(), markerRect.top()); options.painter()->scale(animation, 0.5 + 0.5 * animation); options.painter()->drawPath(path); options.painter()->restore(); } options.painter()->restore(); } void Renderer::renderRadioButtonBackground(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() QRectF frameRect(options.rect()); frameRect.adjust(3, 3, -3, -3); if (options.sunken()) { frameRect.translate(1, 1); } options.painter()->setPen(options.outlineColor()); options.painter()->setBrush(options.color()); options.painter()->drawEllipse(frameRect); options.painter()->restore(); } void Renderer::renderRadioButton(const StyleOptions &options, const QColor &tickColor, qreal animation) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() QRectF frameRect(options.rect()); frameRect.adjust(2, 2, -2, -2); if (options.color().isValid() && options.active()) { options.painter()->setBrush(Colors::indicatorBackgroundGradient(options)); } else if (!options.active()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } options.painter()->setPen(QPen(options.outlineColor(), 1)); QRectF contentRect(frameRect.adjusted(0.5, 0.5, -0.5, -0.5)); options.painter()->drawEllipse(contentRect); // mark if (options.radioButtonState() == RadioOn) { options.painter()->setBrush(tickColor); options.painter()->setPen(Qt::NoPen); QRectF markerRect(frameRect.adjusted(5, 5, -5, -5)); options.painter()->drawEllipse(markerRect); } else if (options.radioButtonState() == RadioAnimated) { options.painter()->setBrush(tickColor); options.painter()->setPen(Qt::NoPen); QRectF markerRect(frameRect.adjusted(5, 5, -5, -5)); qreal remaining = markerRect.width() / 2.0 * (1.0 - animation); markerRect.adjust(remaining, remaining, -remaining, -remaining); options.painter()->drawEllipse(markerRect); } options.painter()->restore(); } void Renderer::renderSliderGroove(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); QRectF baseRect(options.rect()); qreal radius(0.5 * Metrics::Slider_GrooveThickness); // content if (options.color().isValid()) { options.painter()->setPen(Qt::NoPen); options.painter()->setBrush(options.color()); options.painter()->drawRoundedRect(baseRect, radius, radius); } options.painter()->restore(); } void Renderer::renderSliderHandle(const StyleOptions &options, Side ticks, qreal angle) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); // copy options.rect() QRectF frameRect(options.rect()); frameRect.adjust(1, 1, -1, -1); // set pen if (options.outlineColor().isValid()) { QPen pen(options.outlineColor()); pen.setCapStyle(Qt::FlatCap); pen.setJoinStyle(Qt::MiterJoin); options.painter()->setPen(pen); frameRect.adjust(0.5, 0.5, -0.5, -0.5); } else options.painter()->setPen(Qt::NoPen); // set brush if (options.color().isValid() && options.active()) { options.painter()->setBrush(Colors::buttonBackgroundGradient(options)); } else if (!options.active()) { options.painter()->setBrush(options.color()); } else { options.painter()->setBrush(Qt::NoBrush); } QRect r(options.rect().right() - options.rect().height(), options.rect().top(), options.rect().height(), options.rect().height()); r.adjust(4.5, 3.5, -2.5, -3.5); QPainterPath circle; circle.addEllipse(r); circle.closeSubpath(); if (ticks & SideBottom) { QPainterPath triangle(r.center()); triangle.moveTo(r.left() + 1.5, r.center().y() + 5.5); triangle.lineTo(r.center().x() + 1, r.bottom() + 4.5); triangle.lineTo(r.right() - 0.5, r.center().y() + 5.5); triangle.closeSubpath(); circle = circle.united(triangle); } else if (ticks & SideTop) { QPainterPath triangle(r.center()); triangle.moveTo(r.left() + 1.5, r.center().y() - 3.5); triangle.lineTo(r.center().x() + 1, r.top() - 2.5); triangle.lineTo(r.right() - 0.5, r.center().y() - 3.5); triangle.closeSubpath(); circle = circle.united(triangle); } else if (ticks & SideLeft) { QPainterPath triangle(r.center()); triangle.moveTo(r.center().x() - 3.5, r.top() + 1.5); triangle.lineTo(r.left() - 2.5, r.center().y() + 1); triangle.lineTo(r.center().x() - 3.5, r.bottom() - 0.5); triangle.closeSubpath(); circle = circle.united(triangle); } else if (ticks & SideRight) { QPainterPath triangle(r.center()); triangle.moveTo(r.center().x() + 3.5, r.top() + 1.5); triangle.lineTo(r.right() + 2.5, r.center().y() + 1); triangle.lineTo(r.center().x() + 3.5, r.bottom() - 0.5); triangle.closeSubpath(); circle = circle.united(triangle); } QTransform rotate; rotate.translate(frameRect.center().x(), frameRect.center().y()); rotate.rotate(angle); rotate.translate(-frameRect.center().x(), -frameRect.center().y()); options.painter()->drawPolygon(circle.toFillPolygon(rotate)); options.painter()->restore(); } void Renderer::renderDialGroove(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); QRectF baseRect(options.rect()); // content if (options.color().isValid()) { qreal penWidth(Metrics::Slider_GrooveThickness); QRectF grooveRect(options.rect().adjusted(penWidth / 2, penWidth / 2, -penWidth / 2, -penWidth / 2)); options.painter()->setPen(QPen(options.color(), penWidth)); options.painter()->setBrush(Qt::NoBrush); options.painter()->drawEllipse(grooveRect); } return; } void Renderer::renderDialContents(const StyleOptions &options, qreal first, qreal second) { if (!options.painter()) { return; } // setup options.painter() options.painter()->setRenderHint(QPainter::Antialiasing, true); QRectF baseRect(options.rect()); // content if (options.color().isValid()) { // setup groove options.rect() qreal penWidth(Metrics::Slider_GrooveThickness); QRectF grooveRect(options.rect().adjusted(penWidth / 2, penWidth / 2, -penWidth / 2, -penWidth / 2)); // setup angles int angleStart(first * 180 * 16 / M_PI); int angleSpan((second - first) * 180 * 16 / M_PI); // setup pen if (angleSpan != 0) { QPen pen(options.color(), penWidth); pen.setCapStyle(Qt::RoundCap); options.painter()->setPen(pen); options.painter()->setBrush(Qt::NoBrush); options.painter()->drawArc(grooveRect, angleStart, angleSpan); } } options.painter()->restore(); } void Renderer::renderProgressBarGroove(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); options.painter()->setRenderHint(QPainter::SmoothPixmapTransform, true); QRectF baseRect(options.rect()); qreal radius(0.5); // content if (options.color().isValid()) { options.painter()->setBrush(options.color()); } if (options.outlineColor().isValid()) { options.painter()->setPen(options.outlineColor()); } options.painter()->drawRoundedRect(baseRect.translated(0.5, 0.5), radius, radius); options.painter()->restore(); } void Renderer::renderProgressBarContents(const StyleOptions &options) { return renderProgressBarGroove(options); } void Renderer::renderProgressBarBusyContents(const StyleOptions &options, bool horizontal, bool reverse, int progress) { Q_UNUSED(reverse) if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); QRectF baseRect(options.rect()); qreal radius(0.25 * Metrics::ProgressBar_Thickness); QRectF contentRect; if (horizontal) { contentRect = QRect(baseRect.left(), baseRect.top(), Metrics::ProgressBar_BusyIndicatorSize, baseRect.height()); contentRect.translate(fabs(progress - 50) / 50.0 * (baseRect.width() - contentRect.width()), 0); } else { contentRect = QRect(baseRect.left(), baseRect.top(), baseRect.width(), Metrics::ProgressBar_BusyIndicatorSize); contentRect.translate(0, fabs(progress - 50) / 50.0 * (baseRect.height() - contentRect.height())); } options.painter()->setBrush(options.color()); options.painter()->setPen(options.outlineColor()); options.painter()->drawRoundedRect(contentRect.translated(0.5, 0.5), radius, radius); options.painter()->restore(); } void Renderer::renderScrollBarGroove(const StyleOptions &options) { return renderScrollBarHandle(options); } void Renderer::renderScrollBarHandle(const StyleOptions &options) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, true); QRectF baseRect(options.rect()); qreal metric(options.rect().width() < options.rect().height() ? options.rect().width() : options.rect().height()); qreal radius(0.5 * metric); // content if (options.color().isValid()) { options.painter()->setPen(Qt::NoPen); options.painter()->setBrush(options.color()); options.painter()->drawRoundedRect(baseRect, radius, radius); } options.painter()->restore(); } void Renderer::renderToolBarHandle(const StyleOptions &options) { return renderProgressBarGroove(options); } void Renderer::renderTabBarTab(const StyleOptions &options, const QColor &background, Corners corners, bool renderFrame) { if (!options.painter()) { return; } // setup options.painter() options.painter()->save(); options.painter()->setRenderHint(QPainter::Antialiasing, false); QRectF frameRect(options.rect()); qreal adjustment; // pen if (options.outlineColor().isValid()) { options.painter()->setPen(options.outlineColor()); frameRect.adjust(1.0, 1.0, -1.0, -1.0); adjustment = 0; options.painter()->setBrush(background); // render options.painter()->drawRect(frameRect); } else if (!renderFrame) { adjustment = 9; } options.painter()->setPen(QPen(options.color(), 6)); switch (corners) { case CornersTop: options.painter()->drawLine(frameRect.left() + adjustment, frameRect.bottom(), frameRect.right() - adjustment, frameRect.bottom()); break; case CornersBottom: options.painter()->drawLine(frameRect.left() + adjustment, frameRect.top(), frameRect.right() - adjustment, frameRect.top()); break; case CornersLeft: options.painter()->drawLine(frameRect.right(), frameRect.top() + adjustment, frameRect.right(), frameRect.bottom() - adjustment); break; case CornersRight: options.painter()->drawLine(frameRect.left(), frameRect.top() + adjustment, frameRect.left(), frameRect.bottom() - adjustment); break; } options.painter()->restore(); } void Renderer::renderArrow(const StyleOptions &options, ArrowOrientation arrowOrientation) { if (!options.painter()) { return; } // define polygon QPolygonF arrow; switch (arrowOrientation) { case ArrowUp: arrow << QPointF(-4, 2) << QPointF(0, -2) << QPointF(4, 2); break; case ArrowDown: arrow << QPointF(-4, -2) << QPointF(0, 2) << QPointF(4, -2); break; case ArrowLeft: arrow << QPointF(2, -4) << QPointF(-2, 0) << QPointF(2, 4); break; case ArrowRight: arrow << QPointF(-2, -4) << QPointF(2, 0) << QPointF(-2, 4); break; default: break; } QPen pen(options.color(), 1.2); pen.setCapStyle(Qt::FlatCap); pen.setJoinStyle(Qt::MiterJoin); options.painter()->save(); options.painter()->setRenderHints(QPainter::Antialiasing); options.painter()->translate(QRectF(options.rect()).center()); options.painter()->setBrush(options.color()); options.painter()->setPen(pen); options.painter()->drawPolygon(arrow); options.painter()->restore(); } void Renderer::renderSign(const StyleOptions &options, bool orientation) { if (!options.painter()) { return; } QPen pen(options.color(), 2); pen.setCapStyle(Qt::FlatCap); QRect r = options.rect().adjusted(1, 2, 0, 0); options.painter()->save(); options.painter()->setPen(pen); options.painter()->drawLine(r.center() - QPointF(5, 0), r.center() + QPointF(5, 0)); if (orientation) { options.painter()->drawLine(r.center() - QPointF(0, 5), r.center() + QPointF(0, 5)); } options.painter()->restore(); } void Renderer::renderDecorationButton(const StyleOptions &options, ButtonType buttonType) { if (!options.painter()) { return; } options.painter()->save(); options.painter()->setViewport(options.rect()); options.painter()->setWindow(0, 0, 18, 18); options.painter()->setRenderHints(QPainter::Antialiasing, false); // initialize pen QPen pen; pen.setCapStyle(Qt::RoundCap); pen.setJoinStyle(Qt::MiterJoin); options.painter()->setBrush(Qt::NoBrush); pen.setColor(options.color()); pen.setCapStyle(Qt::RoundCap); pen.setJoinStyle(Qt::MiterJoin); pen.setWidthF(2.0 * qMax(1.0, 18.0 / options.rect().width())); options.painter()->setPen(pen); switch (buttonType) { case ButtonClose: { options.painter()->setRenderHints(QPainter::Antialiasing, true); options.painter()->drawLine(QPointF(5, 5), QPointF(13, 13)); options.painter()->drawLine(13, 5, 5, 13); break; } case ButtonMaximize: { options.painter()->drawRect(5, 5, 8, 8); break; } case ButtonMinimize: { options.painter()->drawPolyline(QPolygonF() << QPointF(5, 13) << QPointF(13, 13)); break; } case ButtonRestore: { options.painter()->drawRect(6, 6, 6, 6); break; } default: break; } options.painter()->restore(); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/adwaitarenderer.h000066400000000000000000000106331414271704400204270ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2021 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_RENDERER_H #define ADWAITA_RENDERER_H #include "adwaita.h" #include "adwaitaqt_export.h" namespace Adwaita { class ADWAITAQT_EXPORT Renderer { public: static void renderDebugFrame(const StyleOptions &options); static void renderFocusRect(const StyleOptions &options, Sides sides = SideNone); static void renderFocusLine(const StyleOptions &options); static void renderFrame(const StyleOptions &options); static void renderSquareFrame(const StyleOptions &options); static void renderFlatFrame(const StyleOptions &options); static void renderSidePanelFrame(const StyleOptions &options, Side side); static void renderMenuFrame(const StyleOptions &options, bool roundCorners = true); static void renderButtonFrame(const StyleOptions &options); static void renderCheckBoxFrame(const StyleOptions &options); static void renderFlatButtonFrame(const StyleOptions &options); static void renderFlatRoundedButtonFrame(const StyleOptions &options); static void renderToolButtonFrame(const StyleOptions &options); static void renderToolBoxFrame(const StyleOptions &options, int tabWidth); static void renderTabWidgetFrame(const StyleOptions &options, Corners corners); static void renderSelection(const StyleOptions &options); static void renderSeparator(const StyleOptions &options, bool vertical = false); static void renderCheckBoxBackground(const StyleOptions &options); static void renderCheckBox(const StyleOptions &options, const QColor &tickColor, qreal animation = -1); static void renderRadioButtonBackground(const StyleOptions &options); static void renderRadioButton(const StyleOptions &options, const QColor &tickColor, qreal animation = -1); static void renderSliderGroove(const StyleOptions &options); static void renderSliderHandle(const StyleOptions &options, Side ticks, qreal angle = 0.0); static void renderDialGroove(const StyleOptions &options); static void renderDialContents(const StyleOptions &options, qreal first, qreal second); static void renderProgressBarGroove(const StyleOptions &options); static void renderProgressBarContents(const StyleOptions &options); static void renderProgressBarBusyContents(const StyleOptions &options, bool horizontal, bool reverse, int progress); static void renderScrollBarGroove(const StyleOptions &options); static void renderScrollBarHandle(const StyleOptions &options); static void renderToolBarHandle(const StyleOptions &options); static void renderTabBarTab(const StyleOptions &options, const QColor &background, Corners corners, bool renderFrame); static void renderArrow(const StyleOptions &options, ArrowOrientation arrowOrientation); static void renderSign(const StyleOptions &options, bool orientation); static void renderDecorationButton(const StyleOptions &options, ButtonType buttonType); }; } // namespace Adwaita #endif // ADWAITA_RENDERER_H adwaita-qt-1.4.1/src/lib/adwaitasplitterproxy.cpp000066400000000000000000000237671414271704400221400ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitasplitterproxy.h" #include "adwaita.h" #include #include #include namespace Adwaita { //____________________________________________________________________ void SplitterFactory::setEnabled(bool value) { if (_enabled != value) { // store _enabled = value; // assign to existing splitters for (WidgetMap::iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter) { if (iter.value()) iter.value().data()->setEnabled(value); } } } //____________________________________________________________________ bool SplitterFactory::registerWidget(QWidget *widget) { // check widget type if (qobject_cast(widget)) { WidgetMap::iterator iter(_widgets.find(widget)); if (iter == _widgets.end() || !iter.value()) { widget->installEventFilter(&_addEventFilter); SplitterProxy *proxy(new SplitterProxy(widget, _enabled)); widget->removeEventFilter(&_addEventFilter); widget->installEventFilter(proxy); _widgets.insert(widget, proxy); } else { widget->removeEventFilter(iter.value().data()); widget->installEventFilter(iter.value().data()); } return true; } else if (qobject_cast(widget)) { QWidget *window(widget->window()); WidgetMap::iterator iter(_widgets.find(window)); if (iter == _widgets.end() || !iter.value()) { window->installEventFilter(&_addEventFilter); SplitterProxy *proxy(new SplitterProxy(window, _enabled)); window->removeEventFilter(&_addEventFilter); widget->installEventFilter(proxy); _widgets.insert(window, proxy); } else { widget->removeEventFilter(iter.value().data()); widget->installEventFilter(iter.value().data()); } return true; } else { return false; } } //____________________________________________________________________ void SplitterFactory::unregisterWidget(QWidget *widget) { WidgetMap::iterator iter(_widgets.find(widget)); if (iter != _widgets.end()) { if (iter.value()) iter.value().data()->deleteLater(); _widgets.erase(iter); } } //____________________________________________________________________ SplitterProxy::SplitterProxy(QWidget *parent, bool enabled): QWidget(parent), _enabled(enabled), _timerId(0) { setAttribute(Qt::WA_TranslucentBackground, true); setAttribute(Qt::WA_OpaquePaintEvent, false); hide(); } //____________________________________________________________________ SplitterProxy::~SplitterProxy(void) {} //____________________________________________________________________ void SplitterProxy::setEnabled(bool value) { // make sure status has changed if (_enabled != value) { _enabled = value; if (_enabled) clearSplitter(); } } //____________________________________________________________________ bool SplitterProxy::eventFilter(QObject *object, QEvent *event) { // do nothing if disabled if (!_enabled) { return false; } // do nothing in case of mouse grab if (mouseGrabber()) { return false; } switch (event->type()) { case QEvent::HoverEnter: if (!isVisible()) { // cast to splitter handle if (QSplitterHandle *handle = qobject_cast(object)) { setSplitter(handle); } } return false; case QEvent::HoverMove: case QEvent::HoverLeave: return isVisible() && object == _splitter.data(); case QEvent::MouseMove: case QEvent::Timer: case QEvent::Move: return false; case QEvent::CursorChange: if (QWidget *window = qobject_cast(object)) { if (window->cursor().shape() == Qt::SplitHCursor || window->cursor().shape() == Qt::SplitVCursor) { setSplitter(window); } } return false; case QEvent::WindowDeactivate: case QEvent::MouseButtonRelease: clearSplitter(); return false; default: return false; } } //____________________________________________________________________ bool SplitterProxy::event(QEvent *event) { switch (event->type()) { #if 0 case QEvent::Paint: { QPainter painter(this); painter.setClipRegion(static_cast(event)->region()); painter.setRenderHints(QPainter::Antialiasing); painter.setPen(Qt::red); painter.drawRect(QRectF(rect()).adjusted(0.5, 0.5, -0.5, -0.5)); return true; } #endif case QEvent::MouseMove: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: { // check splitter if (!_splitter) { return false; } event->accept(); // grab on mouse press if (event->type() == QEvent::MouseButtonPress) { grabMouse(); resize(1, 1); } // cast to mouse event QMouseEvent *mouseEvent(static_cast(event)); // get relevant position to post mouse drag event to application if (event->type() == QEvent::MouseButtonPress) { // use hook, to make sure splitter is properly dragged QMouseEvent copy( mouseEvent->type(), _hook, _splitter.data()->mapToGlobal(_hook), mouseEvent->button(), mouseEvent->buttons(), mouseEvent->modifiers()); QCoreApplication::sendEvent(_splitter.data(), ©); } else { // map event position to current splitter and post. QMouseEvent copy( mouseEvent->type(), #if QT_VERSION >= 0x060000 _splitter.data()->mapFromGlobal(mouseEvent->globalPosition().toPoint()), mouseEvent->globalPosition().toPoint(), #else _splitter.data()->mapFromGlobal(mouseEvent->globalPos()), mouseEvent->globalPos(), #endif mouseEvent->button(), mouseEvent->buttons(), mouseEvent->modifiers()); QCoreApplication::sendEvent(_splitter.data(), ©); } // release grab on mouse-Release if (event->type() == QEvent::MouseButtonRelease && mouseGrabber() == this) { releaseMouse(); } return true; } case QEvent::Timer: if (static_cast(event)->timerId() != _timerId) { return QWidget::event(event); } /* Fall through is intended. We somehow lost a QEvent::Leave before timeout. We fix it from here */ case QEvent::HoverLeave: case QEvent::Leave: { if (mouseGrabber() == this) { return true; } // reset splitter if (isVisible() && !rect().contains(mapFromGlobal(QCursor::pos()))) { clearSplitter(); } return true; } default: return QWidget::event(event); } } //____________________________________________________________________ void SplitterProxy::setSplitter(QWidget *widget) { // check if changed if (_splitter.data() == widget) { return; } // get cursor position QPoint position(QCursor::pos()); // store splitter and hook _splitter = widget; _hook = _splitter.data()->mapFromGlobal(position); // adjust rect QRect rect(0, 0, 2 * Adwaita::Config::SplitterProxyWidth, 2 * Adwaita::Config::SplitterProxyWidth); rect.moveCenter(parentWidget()->mapFromGlobal(position)); setGeometry(rect); setCursor(_splitter.data()->cursor().shape()); // show raise(); show(); // timer used to automatically hide proxy in case leave events are lost if (!_timerId) { _timerId = startTimer(150); } } //____________________________________________________________________ void SplitterProxy::clearSplitter(void) { // check if changed if (!_splitter) { return; } // release mouse if (mouseGrabber() == this) { releaseMouse(); } // hide parentWidget()->setUpdatesEnabled(false); hide(); parentWidget()->setUpdatesEnabled(true); // send hover event if (_splitter) { QHoverEvent hoverEvent( qobject_cast(_splitter.data()) ? QEvent::HoverLeave : QEvent::HoverMove, _splitter.data()->mapFromGlobal(QCursor::pos()), _hook); QCoreApplication::sendEvent(_splitter.data(), &hoverEvent); _splitter.clear(); } // kill timer if any if (_timerId) { killTimer(_timerId); _timerId = 0; } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/adwaitasplitterproxy.h000066400000000000000000000065061414271704400215750ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_SPLITTER_PROXY_H #define ADWAITA_SPLITTER_PROXY_H #include "adwaita.h" #include "adwaitaaddeventfilter.h" #include #include #include #include #include #include #include namespace Adwaita { class SplitterProxy; //* factory class ADWAITAQT_EXPORT SplitterFactory : public QObject { Q_OBJECT public: //* constructor explicit SplitterFactory(QObject *parent) : QObject(parent) , _enabled(false) { } //* destructor virtual ~SplitterFactory() { } //* enabled state void setEnabled(bool); //* register widget bool registerWidget(QWidget *); //* unregister widget void unregisterWidget(QWidget *); private: //* enabled state bool _enabled; //* needed to block ChildAdded events when creating proxy AddEventFilter _addEventFilter; //* pointer to SplitterProxy using SplitterProxyPointer = WeakPointer; //* registered widgets using WidgetMap = QMap; WidgetMap _widgets; }; //* splitter 'proxy' widget, with extended hit area class SplitterProxy : public QWidget { Q_OBJECT public: //* constructor explicit SplitterProxy(QWidget *, bool = false); //* destructor virtual ~SplitterProxy(); //* event filter virtual bool eventFilter(QObject *, QEvent *); //* enable state void setEnabled(bool); //* enable state bool enabled() const { return _enabled; } protected: //* event handler virtual bool event(QEvent *); protected: //* reset 'true' splitter widget void clearSplitter(); //* keep track of 'true' splitter widget void setSplitter(QWidget *); private: //* enabled state bool _enabled; //* splitter object WeakPointer _splitter; //* hook QPoint _hook; //* timer id int _timerId; }; } // namespace Adwaita #endif // ADWAITA_SPLITTER_PROXY_H adwaita-qt-1.4.1/src/lib/adwaitawidgetexplorer.cpp000066400000000000000000000140751414271704400222240ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2019 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitawidgetexplorer.h" #include "adwaita.h" #include "adwaitadebug.h" #include #include #include #include Q_LOGGING_CATEGORY(ADWAITA, "adwaita.widgetexplorer") namespace Adwaita { //________________________________________________ WidgetExplorer::WidgetExplorer(QObject *parent) : QObject(parent) , _enabled(false) , _drawWidgetRects(false) { _eventTypes.insert(QEvent::Enter, QStringLiteral("Enter")); _eventTypes.insert(QEvent::Leave, QStringLiteral("Leave")); _eventTypes.insert(QEvent::HoverMove, QStringLiteral("HoverMove")); _eventTypes.insert(QEvent::HoverEnter, QStringLiteral("HoverEnter")); _eventTypes.insert(QEvent::HoverLeave, QStringLiteral("HoverLeave")); _eventTypes.insert(QEvent::MouseMove, QStringLiteral("MouseMove")); _eventTypes.insert(QEvent::MouseButtonPress, QStringLiteral("MouseButtonPress")); _eventTypes.insert(QEvent::MouseButtonRelease, QStringLiteral("MouseButtonRelease")); _eventTypes.insert(QEvent::FocusIn, QStringLiteral("FocusIn")); _eventTypes.insert(QEvent::FocusOut, QStringLiteral("FocusOut")); // _eventTypes.insert( QEvent::Paint, "Paint" ); } //________________________________________________ void WidgetExplorer::setEnabled(bool value) { if (value == _enabled) { return; } _enabled = value; qApp->removeEventFilter(this); if (_enabled) { qApp->installEventFilter(this); } } //________________________________________________ bool WidgetExplorer::eventFilter(QObject *object, QEvent *event) { // if( object->isWidgetType() ) // { // QString type( _eventTypes[event->type()] ); // if( !type.isEmpty() ) // { // QTextStream( stdout ) << "Adwaita::WidgetExplorer::eventFilter - widget: " << object << " (" << object->metaObject()->className() << ")"; // QTextStream( stdout ) << " type: " << type << endl; // } // } switch (event->type()) { case QEvent::Paint: if (_drawWidgetRects) { QWidget *widget(qobject_cast(object)); if (!widget) return false; QPainter painter(widget); painter.setRenderHints(QPainter::Antialiasing); painter.setBrush(Qt::NoBrush); painter.setPen(Qt::red); painter.drawRect(widget->rect()); painter.end(); } break; case QEvent::MouseButtonPress: { // cast event and check button QMouseEvent *mouseEvent(static_cast(event)); if (mouseEvent->button() != Qt::LeftButton) { break; } // case widget and check (should not be necessary) QWidget *widget(qobject_cast(object)); if (!widget) { return false; } qCDebug(ADWAITA) << "Adwaita::WidgetExplorer::eventFilter -" << " event: " << event << " type: " << eventType(event->type()) << " widget: " << widgetInformation(widget); // print parent information QWidget *parent(widget->parentWidget()); while (parent) { qCDebug(ADWAITA) << " parent: " << widgetInformation(parent); parent = parent->parentWidget(); } } break; default: break; } // always return false to go on with normal chain return false; } //________________________________________________ QString WidgetExplorer::eventType(const QEvent::Type &type) const { switch (type) { case QEvent::MouseButtonPress: return QStringLiteral("MouseButtonPress"); case QEvent::MouseButtonRelease: return QStringLiteral("MouseButtonRelease"); case QEvent::MouseMove: return QStringLiteral("MouseMove"); default: return QStringLiteral("Unknown"); } } //________________________________________________ QString WidgetExplorer::widgetInformation(const QWidget *widget) const { QRect r(widget->geometry()); const char *className(widget->metaObject()->className()); QString out; QTextStream(&out) << widget << " (" << className << ")" << " position: " << r.x() << "," << r.y() << " size: " << r.width() << "," << r.height() << " sizeHint: " << widget->sizeHint().width() << "," << widget->sizeHint().height() << " minimumSizeHint: " << widget->minimumSizeHint().width() << "," << widget->minimumSizeHint().height() << " hover: " << widget->testAttribute(Qt::WA_Hover); return out; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/adwaitawidgetexplorer.h000066400000000000000000000046401414271704400216660ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_WIDGET_EXPLORER_H #define ADWAITA_WIDGET_EXPLORER_H #include "adwaitaqt_export.h" #include #include #include #include #include namespace Adwaita { //* print widget's and parent's information on mouse click class ADWAITAQT_EXPORT WidgetExplorer : public QObject { Q_OBJECT public: //* constructor explicit WidgetExplorer(QObject *parent); //* enable bool enabled() const; //* enable void setEnabled(bool); //* widget rects void setDrawWidgetRects(bool value) { _drawWidgetRects = value; } //* event filter virtual bool eventFilter(QObject *object, QEvent *event); protected: //* event type QString eventType(const QEvent::Type &type) const; //* print widget information QString widgetInformation(const QWidget *widget) const; private: //* enable state bool _enabled; //* widget rects bool _drawWidgetRects; //* map event types to string QMap _eventTypes; }; } // namespace Adwaita #endif // ADWAITA_WIDGET_EXPLORER_H adwaita-qt-1.4.1/src/lib/adwaitawindowmanager.cpp000066400000000000000000000601211414271704400220130ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ ////////////////////////////////////////////////////////////////////////////// // adwaitawindowmanager.cpp // pass some window mouse press/release/move event actions to window manager // ------------------- // // Copyright (c) 2014 Hugo Pereira Da Costa // // Largely inspired from BeSpin style // Copyright (C) 2007 Thomas Luebking // // 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. ////////////////////////////////////////////////////////////////////////////// #include "adwaitawindowmanager.h" // #include "adwaitahelper.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // needed to deal with device pixel ratio #include namespace Adwaita { //* provide application-wise event filter /** it us used to unlock dragging and make sure event look is properly restored after a drag has occurred */ class AppEventFilter: public QObject { public: //* constructor explicit AppEventFilter(WindowManager *parent) : QObject(parent) , _parent(parent) {} //* event filter virtual bool eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::MouseButtonRelease) { // stop drag timer if (_parent->_dragTimer.isActive()) { _parent->resetDrag(); } // unlock if (_parent->isLocked()) { _parent->setLocked(false); } } if (!_parent->enabled()) { return false; } /* if a drag is in progress, the widget will not receive any event we trigger on the first MouseMove or MousePress events that are received by any widget in the application to detect that the drag is finished */ if (_parent->useWMMoveResize() && _parent->_dragInProgress && _parent->_target && (event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonPress)) { return appMouseEvent(object, event); } return false; } protected: //* application-wise event. /** needed to catch end of XMoveResize events */ bool appMouseEvent(QObject *, QEvent *event) { Q_UNUSED(event); /* post some mouseRelease event to the target, in order to counter balance the mouse press that triggered the drag. Note that it triggers a resetDrag */ QMouseEvent mouseEvent(QEvent::MouseButtonRelease, _parent->_dragPoint, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); qApp->sendEvent(_parent->_target.data(), &mouseEvent); return false; } private: //* parent WindowManager *_parent; }; //_____________________________________________________________ WindowManager::WindowManager(QObject *parent) : QObject(parent) , _enabled(true) , _useWMMoveResize(true) , _dragMode(Adwaita::WD_FULL) , _dragDistance(QApplication::startDragDistance()) , _dragDelay(QApplication::startDragTime()) , _dragAboutToStart(false) , _dragInProgress(false) , _locked(false) , _cursorOverride(false) { // install application wise event filter _appEventFilter = new AppEventFilter(this); qApp->installEventFilter(_appEventFilter); } //_____________________________________________________________ void WindowManager::initialize(void) { setEnabled(Adwaita::Config::WindowDragMode != Adwaita::WD_NONE); setDragMode(Adwaita::Config::WindowDragMode); setUseWMMoveResize(Adwaita::Config::UseWMMoveResize); setDragDistance(QApplication::startDragDistance()); setDragDelay(QApplication::startDragTime()); initializeWhiteList(); initializeBlackList(); } //_____________________________________________________________ void WindowManager::registerWidget(QWidget *widget) { if (isBlackListed(widget) || isDragable(widget)) { /* install filter for dragable widgets. also install filter for blacklisted widgets to be able to catch the relevant events and prevent the drag to happen */ widget->removeEventFilter(this); widget->installEventFilter(this); } } //_____________________________________________________________ void WindowManager::unregisterWidget(QWidget *widget) { if (widget) { widget->removeEventFilter(this); } } //_____________________________________________________________ void WindowManager::initializeWhiteList(void) { _whiteList.clear(); // add user specified whitelisted classnames _whiteList.insert(ExceptionId(QStringLiteral("MplayerWindow"))); _whiteList.insert(ExceptionId(QStringLiteral("ViewSliders@kmix"))); _whiteList.insert(ExceptionId(QStringLiteral("Sidebar_Widget@konqueror"))); foreach (const QString &exception, Adwaita::Config::WindowDragWhiteList) { ExceptionId id(exception); if (!id.className().isEmpty()) { _whiteList.insert(ExceptionId(exception)); } } } //_____________________________________________________________ void WindowManager::initializeBlackList(void) { _blackList.clear(); _blackList.insert(ExceptionId(QStringLiteral("CustomTrackView@kdenlive"))); _blackList.insert(ExceptionId(QStringLiteral("MuseScore"))); _blackList.insert(ExceptionId(QStringLiteral("KGameCanvasWidget"))); foreach (const QString &exception, Adwaita::Config::WindowDragBlackList) { ExceptionId id(exception); if (!id.className().isEmpty()) { _blackList.insert(ExceptionId(exception)); } } } //_____________________________________________________________ bool WindowManager::eventFilter(QObject *object, QEvent *event) { if (!enabled()) { return false; } switch (event->type()) { case QEvent::MouseButtonPress: return mousePressEvent(object, event); break; case QEvent::MouseMove: if (object == _target.data()) { return mouseMoveEvent(object, event); } break; case QEvent::MouseButtonRelease: if (_target) { return mouseReleaseEvent(object, event); } break; default: break; } return false; } //_____________________________________________________________ void WindowManager::timerEvent(QTimerEvent *event) { if (event->timerId() == _dragTimer.timerId()) { _dragTimer.stop(); if (_target) { startDrag(_target.data(), _globalDragPoint); } } else { return QObject::timerEvent(event); } } //_____________________________________________________________ bool WindowManager::mousePressEvent(QObject *object, QEvent *event) { // cast event and check buttons/modifiers QMouseEvent *mouseEvent = static_cast(event); if (!(mouseEvent->modifiers() == Qt::NoModifier && mouseEvent->button() == Qt::LeftButton)) { return false; } // check lock if (isLocked()) { return false; } else { setLocked(true); } // cast to widget QWidget *widget = static_cast(object); // check if widget can be dragged from current position if (isBlackListed(widget) || !canDrag(widget)) { return false; } // retrieve widget's child at event position #if QT_VERSION >= 0x060000 QPoint position(mouseEvent->position().toPoint()); #else QPoint position(mouseEvent->pos()); #endif QWidget *child = widget->childAt(position); if (!canDrag(widget, child, position)) { return false; } // save target and drag point _target = widget; _dragPoint = position; #if QT_VERSION >= 0x060000 _globalDragPoint = mouseEvent->globalPosition().toPoint(); #else _globalDragPoint = mouseEvent->globalPos(); #endif _dragAboutToStart = true; // send a move event to the current child with same position // if received, it is caught to actually start the drag QPoint localPoint(_dragPoint); if (child) { localPoint = child->mapFrom(widget, localPoint); } else { child = widget; } QMouseEvent localMouseEvent(QEvent::MouseMove, localPoint, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); qApp->sendEvent(child, &localMouseEvent); // never eat event return false; } //_____________________________________________________________ bool WindowManager::mouseMoveEvent(QObject *object, QEvent *event) { Q_UNUSED(object); // stop timer if (_dragTimer.isActive()) { _dragTimer.stop(); } // cast event and check drag distance QMouseEvent *mouseEvent = static_cast(event); if (!_dragInProgress) { if (_dragAboutToStart) { #if QT_VERSION >= 0x060000 if (mouseEvent->position().toPoint() == _dragPoint) { #else if (mouseEvent->pos() == _dragPoint) { #endif // start timer, _dragAboutToStart = false; if (_dragTimer.isActive()) { _dragTimer.stop(); } _dragTimer.start(_dragDelay, this); } else { resetDrag(); } } else { #if QT_VERSION >= 0x060000 if (QPoint(mouseEvent->globalPosition().toPoint() - _globalDragPoint).manhattanLength() >= _dragDistance) { #else if (QPoint(mouseEvent->globalPos() - _globalDragPoint).manhattanLength() >= _dragDistance) { #endif _dragTimer.start(0, this); } } return true; } else if (!useWMMoveResize()) { // use QWidget::move for the grabbing /* this works only if the sending object and the target are identical */ QWidget *window(_target.data()->window()); #if QT_VERSION >= 0x060000 window->move(window->pos() + mouseEvent->position().toPoint() - _dragPoint); #else window->move(window->pos() + mouseEvent->pos() - _dragPoint); #endif return true; } else { return false; } } //_____________________________________________________________ bool WindowManager::mouseReleaseEvent(QObject *object, QEvent *event) { Q_UNUSED(object); Q_UNUSED(event); resetDrag(); return false; } //_____________________________________________________________ bool WindowManager::isDragable(QWidget *widget) { // check widget if (!widget) { return false; } // accepted default types if ((qobject_cast(widget) && widget->isWindow()) || (qobject_cast(widget) && widget->isWindow()) || qobject_cast(widget)) { return true; } // more accepted types, provided they are not dock widget titles if ((qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget)) && !isDockWidgetTitle(widget)) { return true; } if (widget->inherits("KScreenSaver") && widget->inherits("KCModule")) { return true; } if (isWhiteListed(widget)) { return true; } // flat toolbuttons if (QToolButton *toolButton = qobject_cast(widget)) { if (toolButton->autoRaise()) return true; } // viewports /* one needs to check that 1/ the widget parent is a scrollarea 2/ it matches its parent viewport 3/ the parent is not blacklisted */ if (QListView *listView = qobject_cast(widget->parentWidget())) { if (listView->viewport() == widget && !isBlackListed(listView)) { return true; } } if (QTreeView *treeView = qobject_cast(widget->parentWidget())) { if (treeView->viewport() == widget && !isBlackListed(treeView)) { return true; } } /* catch labels in status bars. this is because of kstatusbar who captures buttonPress/release events */ if (QLabel *label = qobject_cast(widget)) { if (label->textInteractionFlags().testFlag(Qt::TextSelectableByMouse)) { return false; } QWidget *parent = label->parentWidget(); while (parent) { if (qobject_cast(parent)) { return true; } parent = parent->parentWidget(); } } return false; } //_____________________________________________________________ bool WindowManager::isBlackListed(QWidget *widget) { // check against noAnimations propery QVariant propertyValue(widget->property(PropertyNames::noWindowGrab)); if (propertyValue.isValid() && propertyValue.toBool()) { return true; } // list-based blacklisted widgets QString appName(qApp->applicationName()); foreach (const ExceptionId &id, _blackList) { if (!id.appName().isEmpty() && id.appName() != appName) { continue; } if (id.className() == QStringLiteral("*") && !id.appName().isEmpty()) { // if application name matches and all classes are selected // disable the grabbing entirely setEnabled(false); return true; } if (widget->inherits(id.className().toLatin1().data())) { return true; } } return false; } //_____________________________________________________________ bool WindowManager::isWhiteListed(QWidget *widget) const { QString appName(qApp->applicationName()); foreach (const ExceptionId &id, _whiteList) { if (!id.appName().isEmpty() && id.appName() != appName) { continue; } if (widget->inherits(id.className().toLatin1().data())) { return true; } } return false; } //_____________________________________________________________ bool WindowManager::canDrag(QWidget *widget) { // check if enabled if (!enabled()) { return false; } // assume isDragable widget is already passed // check some special cases where drag should not be effective // check mouse grabber if (QWidget::mouseGrabber()) { return false; } /* check cursor shape. Assume that a changed cursor means that some action is in progress and should prevent the drag */ if (widget->cursor().shape() != Qt::ArrowCursor) { return false; } // accept return true; } //_____________________________________________________________ bool WindowManager::canDrag(QWidget *widget, QWidget *child, const QPoint &position) { // retrieve child at given position and check cursor again if (child && child->cursor().shape() != Qt::ArrowCursor) { return false; } /* check against children from which drag should never be enabled, even if mousePress/Move has been passed to the parent */ if (child && (qobject_cast(child) || qobject_cast(child) || qobject_cast(child))) { return false; } // tool buttons if (QToolButton *toolButton = qobject_cast(widget)) { if (dragMode() == Adwaita::WD_MINIMAL && !qobject_cast(widget->parentWidget())) { return false; } return toolButton->autoRaise() && !toolButton->isEnabled(); } // check menubar if (QMenuBar *menuBar = qobject_cast(widget)) { // do not drag from menubars embedded in Mdi windows if (findParent(widget)) { return false; } // check if there is an active action if (menuBar->activeAction() && menuBar->activeAction()->isEnabled()) { return false; } // check if action at position exists and is enabled if (QAction *action = menuBar->actionAt(position)) { if (action->isSeparator()) { return true; } if (action->isEnabled()) { return false; } } // return true in all other cases return true; } /* in MINIMAL mode, anything that has not been already accepted and does not come from a toolbar is rejected */ if (dragMode() == Adwaita::WD_MINIMAL) { if (qobject_cast(widget)) { return true; } else { return false; } } /* following checks are relevant only for WD_FULL mode */ // tabbar. Make sure no tab is under the cursor if (QTabBar *tabBar = qobject_cast(widget)) { return tabBar->tabAt(position) == -1; } /* check groupboxes prevent drag if unchecking grouboxes */ if (QGroupBox *groupBox = qobject_cast(widget)) { // non checkable group boxes are always ok if (!groupBox->isCheckable()) { return true; } // gather options to retrieve checkbox subcontrol rect QStyleOptionGroupBox opt; opt.initFrom(groupBox); if (groupBox->isFlat()) { opt.features |= QStyleOptionFrame::Flat; } opt.lineWidth = 1; opt.midLineWidth = 0; opt.text = groupBox->title(); opt.textAlignment = groupBox->alignment(); opt.subControls = (QStyle::SC_GroupBoxFrame | QStyle::SC_GroupBoxCheckBox); if (!groupBox->title().isEmpty()) { opt.subControls |= QStyle::SC_GroupBoxLabel; } opt.state |= (groupBox->isChecked() ? QStyle::State_On : QStyle::State_Off); // check against groupbox checkbox if (groupBox->style()->subControlRect(QStyle::CC_GroupBox, &opt, QStyle::SC_GroupBoxCheckBox, groupBox).contains(position)) { return false; } // check against groupbox label if (!groupBox->title().isEmpty() && groupBox->style()->subControlRect(QStyle::CC_GroupBox, &opt, QStyle::SC_GroupBoxLabel, groupBox).contains(position)) { return false; } return true; } // labels if (QLabel *label = qobject_cast(widget)) { if (label->textInteractionFlags().testFlag(Qt::TextSelectableByMouse)) return false; } // abstract item views QAbstractItemView *itemView(nullptr); if ((itemView = qobject_cast(widget->parentWidget())) || (itemView = qobject_cast(widget->parentWidget()))) { if (widget == itemView->viewport()) { // QListView if (itemView->frameShape() != QFrame::NoFrame) { return false; } else if (itemView->selectionMode() != QAbstractItemView::NoSelection && itemView->selectionMode() != QAbstractItemView::SingleSelection && itemView->model() && itemView->model()->rowCount()) { return false; } else if (itemView->model() && itemView->indexAt(position).isValid()) { return false; } } } else if ((itemView = qobject_cast(widget->parentWidget()))) { if (widget == itemView->viewport()) { // QAbstractItemView if (itemView->frameShape() != QFrame::NoFrame) { return false; } else if (itemView->indexAt(position).isValid()) { return false; } } } else if (QGraphicsView *graphicsView = qobject_cast(widget->parentWidget())) { if (widget == graphicsView->viewport()) { // QGraphicsView if (graphicsView->frameShape() != QFrame::NoFrame) { return false; } else if (graphicsView->dragMode() != QGraphicsView::NoDrag) { return false; } else if (graphicsView->itemAt(position)) { return false; } } } return true; } //____________________________________________________________ void WindowManager::resetDrag(void) { if ((!useWMMoveResize()) && _target && _cursorOverride) { qApp->restoreOverrideCursor(); _cursorOverride = false; } _target.clear(); if (_dragTimer.isActive()) { _dragTimer.stop(); } _dragPoint = QPoint(); _globalDragPoint = QPoint(); _dragAboutToStart = false; _dragInProgress = false; } //____________________________________________________________ void WindowManager::startDrag(QWidget *widget, const QPoint &position) { if (!(enabled() && widget)) { return; } if (QWidget::mouseGrabber()) { return; } // ungrab pointer // TODO uncomment once we move Helper to the library // if (useWMMoveResize()) { // if (Helper::isX11()) { // startDragX11(widget, position); // } // } else if (!_cursorOverride) { // qApp->setOverrideCursor(Qt::SizeAllCursor); // _cursorOverride = true; // } _dragInProgress = true; return; } //_______________________________________________________ void WindowManager::startDragX11(QWidget *widget, const QPoint &position) { Q_UNUSED(widget); Q_UNUSED(position); } //____________________________________________________________ bool WindowManager::supportWMMoveResize(void) const { return false; } //____________________________________________________________ bool WindowManager::isDockWidgetTitle(const QWidget *widget) const { if (!widget) { return false; } if (const QDockWidget *dockWidget = qobject_cast(widget->parent())) { return widget == dockWidget->titleBarWidget(); } else { return false; } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/adwaitawindowmanager.h000066400000000000000000000167721414271704400214750ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_WINDOW_MANAGER_H #define ADWAITA_WINDOW_MANAGER_H #include "adwaita.h" #include "adwaitaqt_export.h" #include "config-adwaita.h" #include #include #include #include #include #include namespace Adwaita { class ADWAITAQT_EXPORT WindowManager : public QObject { Q_OBJECT public: //* constructor explicit WindowManager(QObject *); //* destructor virtual ~WindowManager() { } //* initialize /** read relevant options from config */ void initialize(); //* register widget void registerWidget(QWidget *); //* unregister widget void unregisterWidget(QWidget *); //* event filter [reimplemented] virtual bool eventFilter(QObject *, QEvent *); protected: //* timer event, /** used to start drag if button is pressed for a long enough time */ void timerEvent(QTimerEvent *); //* mouse press event bool mousePressEvent(QObject *, QEvent *); //* mouse move event bool mouseMoveEvent(QObject *, QEvent *); //* mouse release event bool mouseReleaseEvent(QObject *, QEvent *); //*@name configuration //@{ //* enable state bool enabled() const { return _enabled; } //* enable state void setEnabled(bool value) { _enabled = value; } //* returns true if window manager is used for moving bool useWMMoveResize() const { return supportWMMoveResize() && _useWMMoveResize; } //* use window manager for moving, when available void setUseWMMoveResize(bool value) { _useWMMoveResize = value; } //* drag mode int dragMode() const { return _dragMode; } //* drag mode void setDragMode(int value) { _dragMode = value; } //* drag distance (pixels) void setDragDistance(int value) { _dragDistance = value; } //* drag delay (msec) void setDragDelay(int value) { _dragDelay = value; } //* set list of whiteListed widgets /** white list is read from options and is used to adjust per-app window dragging issues */ void initializeWhiteList(); //* set list of blackListed widgets /** black list is read from options and is used to adjust per-app window dragging issues */ void initializeBlackList(); //@} //* returns true if widget is dragable bool isDragable(QWidget *); //* returns true if widget is dragable bool isBlackListed(QWidget *); //* returns true if widget is dragable bool isWhiteListed(QWidget *) const; //* returns true if drag can be started from current widget bool canDrag(QWidget *); //* returns true if drag can be started from current widget and position /** child at given position is passed as second argument */ bool canDrag(QWidget *, QWidget *, const QPoint &); //* reset drag void resetDrag(); //* start drag void startDrag(QWidget *, const QPoint &); //* X11 specific implementation for startDrag void startDragX11(QWidget *, const QPoint &); //* returns true if window manager is used for moving /** right now this is true only for X11 */ bool supportWMMoveResize() const; //* utility function bool isDockWidgetTitle(const QWidget *) const; //*@name lock //@{ void setLocked(bool value) { _locked = value; } //* lock bool isLocked() const { return _locked; } //@} //* returns first widget matching given class, or 0L if none template T findParent(const QWidget *) const; private: //* enability bool _enabled; //* use WM moveResize bool _useWMMoveResize; //* drag mode int _dragMode; //* drag distance /** this is copied from kwin::geometry */ int _dragDistance; //* drag delay /** this is copied from kwin::geometry */ int _dragDelay; //* wrapper for exception id class ExceptionId : public QPair { public: //* constructor explicit ExceptionId(const QString &value) { const QStringList args(value.split(QChar::fromLatin1('@'))); if (args.isEmpty()) { return; } second = args[0].trimmed(); if (args.size() > 1) { first = args[1].trimmed(); } } const QString &appName() const { return first; } const QString &className() const { return second; } }; //* exception set using ExceptionSet = QSet; //* list of white listed special widgets /** it is read from options and is used to adjust per-app window dragging issues */ ExceptionSet _whiteList; //* list of black listed special widgets /** it is read from options and is used to adjust per-app window dragging issues */ ExceptionSet _blackList; //* drag point QPoint _dragPoint; QPoint _globalDragPoint; //* drag timer QBasicTimer _dragTimer; //* target being dragged /** Weak pointer is used in case the target gets deleted while drag is in progress */ WeakPointer _target; //* true if drag is about to start bool _dragAboutToStart; //* true if drag is in progress bool _dragInProgress; //* true if drag is locked bool _locked; //* cursor override /** used to keep track of application cursor being overridden when dragging in non-WM mode */ bool _cursorOverride; //* application event filter QObject *_appEventFilter; //* allow access of all private members to the app event filter friend class AppEventFilter; }; //____________________________________________________________________ template T WindowManager::findParent(const QWidget *widget) const { if (!widget) { return 0L; } for (QWidget *parent = widget->parentWidget(); parent; parent = parent->parentWidget()) { if (T cast = qobject_cast(parent)) { return cast; } } return 0L; } } // namespace Adwaita #endif // ADWAITA_WINDOW_MANAGER_H adwaita-qt-1.4.1/src/lib/animations/000077500000000000000000000000001414271704400172545ustar00rootroot00000000000000adwaita-qt-1.4.1/src/lib/animations/adwaitaanimation.cpp000066400000000000000000000025461414271704400233010ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaanimation.h" adwaita-qt-1.4.1/src/lib/animations/adwaitaanimation.h000066400000000000000000000041751414271704400227460ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_ANIMATION_H #define ADWAITA_ANIMATION_H #include "adwaita.h" #include "adwaitaqt_export.h" #include #include namespace Adwaita { class ADWAITAQT_EXPORT Animation : public QPropertyAnimation { Q_OBJECT public: //* convenience using Pointer = WeakPointer; //* constructor Animation(int duration, QObject *parent) : QPropertyAnimation(parent) { setDuration(duration); } //* destructor virtual ~Animation() = default; //* true if running bool isRunning() const { return state() == Animation::Running; } //* restart void restart() { if (isRunning()) { stop(); } start(); } }; } // namespace Adwaita #endif // ADWAITA_ANIMATION_H adwaita-qt-1.4.1/src/lib/animations/adwaitaanimationdata.cpp000066400000000000000000000035531414271704400241320ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaanimationdata.h" namespace Adwaita { const qreal AnimationData::OpacityInvalid = -1; int AnimationData::_steps = 0; //_________________________________________________________________________________ void AnimationData::setupAnimation(const Animation::Pointer &animation, const QByteArray &property) { // setup animation animation.data()->setStartValue(0.0); animation.data()->setEndValue(1.0); animation.data()->setTargetObject(this); animation.data()->setPropertyName(property); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitaanimationdata.h000066400000000000000000000060551414271704400235770ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_ANIMATION_DATA_H #define ADWAITA_ANIMATION_DATA_H #include "adwaitaanimation.h" #include "adwaitaqt_export.h" #include #include #include #include namespace Adwaita { //* base class class ADWAITAQT_EXPORT AnimationData : public QObject { Q_OBJECT public: //* constructor AnimationData(QObject *parent, QWidget *target) : QObject(parent) , _target(target) , _enabled(true) { Q_ASSERT(_target); } //* destructor virtual ~AnimationData() { } //* duration virtual void setDuration(int) = 0; //* steps static void setSteps(int value) { _steps = value; } //* enability virtual bool enabled() const { return _enabled; } //* enability virtual void setEnabled(bool value) { _enabled = value; } //* target const WeakPointer &target() const { return _target; } //* invalid opacity static const qreal OpacityInvalid; protected: //* setup animation virtual void setupAnimation(const Animation::Pointer &animation, const QByteArray &property); //* apply step virtual qreal digitize(const qreal &value) const { if (_steps > 0) { return std::floor(value * _steps) / _steps; } else { return value; } } //* trigger target update virtual void setDirty() const { if (_target) { _target.data()->update(); } } private: //* guarded target WeakPointer _target; //* enability bool _enabled; //* steps static int _steps; }; } // namespace Adwaita #endif // ADWAITA_ANIMATION_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitaanimations.cpp000066400000000000000000000221351414271704400234600ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaanimations.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Adwaita { //____________________________________________________________ Animations::Animations(QObject *parent) : QObject(parent) { _widgetEnabilityEngine = new WidgetStateEngine(this); _busyIndicatorEngine = new BusyIndicatorEngine(this); _comboBoxEngine = new WidgetStateEngine(this); _toolButtonEngine = new WidgetStateEngine(this); _spinBoxEngine = new SpinBoxEngine(this); _toolBoxEngine = new ToolBoxEngine(this); registerEngine(_headerViewEngine = new HeaderViewEngine(this)); registerEngine(_widgetStateEngine = new WidgetStateEngine(this)); registerEngine(_inputWidgetEngine = new WidgetStateEngine(this)); registerEngine(_scrollBarEngine = new ScrollBarEngine(this)); registerEngine(_stackedWidgetEngine = new StackedWidgetEngine(this)); registerEngine(_tabBarEngine = new TabBarEngine(this)); registerEngine(_dialEngine = new DialEngine(this)); } //____________________________________________________________ void Animations::setupEngines() { // animation steps AnimationData::setSteps(Adwaita::Config::AnimationSteps); bool animationsEnabled(Adwaita::Config::AnimationsEnabled); int animationsDuration(Adwaita::Config::AnimationsDuration); _widgetEnabilityEngine->setEnabled(animationsEnabled); _comboBoxEngine->setEnabled(animationsEnabled); _toolButtonEngine->setEnabled(animationsEnabled); _spinBoxEngine->setEnabled(animationsEnabled); _toolBoxEngine->setEnabled(animationsEnabled); _widgetEnabilityEngine->setDuration(animationsDuration); _comboBoxEngine->setDuration(animationsDuration); _toolButtonEngine->setDuration(animationsDuration); _spinBoxEngine->setDuration(animationsDuration); _stackedWidgetEngine->setDuration(animationsDuration); _toolBoxEngine->setDuration(animationsDuration); // registered engines foreach (const BaseEngine::Pointer &engine, _engines) { engine.data()->setEnabled(animationsEnabled); engine.data()->setDuration(animationsDuration); } // stacked widget transition has an extra flag for animations _stackedWidgetEngine->setEnabled(animationsEnabled && Adwaita::Config::StackedWidgetTransitionsEnabled); // busy indicator _busyIndicatorEngine->setEnabled(Adwaita::Config::ProgressBarAnimated); _busyIndicatorEngine->setDuration(Adwaita::Config::ProgressBarBusyStepDuration); } //____________________________________________________________ void Animations::registerWidget(QWidget *widget) const { if (!widget) { return; } // check against noAnimations propery QVariant propertyValue(widget->property(PropertyNames::noAnimations)); if (propertyValue.isValid() && propertyValue.toBool()) { return; } // all widgets are registered to the enability engine. _widgetEnabilityEngine->registerWidget(widget, AnimationEnable); // install animation timers // for optimization, one should put with most used widgets here first // buttons if (qobject_cast(widget)) { _toolButtonEngine->registerWidget(widget, AnimationHover | AnimationPressed); _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationPressed); } else if (qobject_cast(widget) || qobject_cast(widget)) { _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus | AnimationPressed); } else if (qobject_cast(widget)) { // register to toolbox engine if needed if (qobject_cast(widget->parent())) { _toolBoxEngine->registerWidget(widget); } _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationPressed); // groupboxes } else if (QGroupBox *groupBox = qobject_cast(widget)) { if (groupBox->isCheckable()) { _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus); } // sliders } else if (qobject_cast(widget)) { _scrollBarEngine->registerWidget(widget, AnimationHover | AnimationFocus); } else if (qobject_cast(widget)) { _widgetStateEngine->registerWidget(widget, AnimationHover | AnimationFocus); } else if (qobject_cast(widget)) { _dialEngine->registerWidget(widget, AnimationHover | AnimationFocus); // progress bar } else if (qobject_cast(widget)) { _busyIndicatorEngine->registerWidget(widget); // combo box } else if (qobject_cast(widget)) { _comboBoxEngine->registerWidget(widget, AnimationHover | AnimationPressed); _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus | AnimationPressed); // spinbox } else if (qobject_cast(widget)) { _spinBoxEngine->registerWidget(widget); _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus | AnimationPressed); // editors } else if (qobject_cast(widget)) { _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus); } else if (qobject_cast(widget)) { _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus); } else if (widget->inherits("KTextEditor::View")) { _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus); // header views // need to come before abstract item view, otherwise is skipped } else if (qobject_cast(widget)) { _headerViewEngine->registerWidget(widget); // lists } else if (qobject_cast(widget)) { _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus); // tabbar } else if (qobject_cast(widget)) { _tabBarEngine->registerWidget(widget); // scrollarea } else if (QAbstractScrollArea *scrollArea = qobject_cast(widget)) { if (scrollArea->frameShadow() == QFrame::Sunken && (widget->focusPolicy()&Qt::StrongFocus)) { _inputWidgetEngine->registerWidget(widget, AnimationHover | AnimationFocus); } } // stacked widgets if (QStackedWidget *stack = qobject_cast(widget)) { _stackedWidgetEngine->registerWidget(stack); } return; } //____________________________________________________________ void Animations::unregisterWidget(QWidget *widget) const { if (!widget) { return; } _widgetEnabilityEngine->unregisterWidget(widget); _spinBoxEngine->unregisterWidget(widget); _comboBoxEngine->unregisterWidget(widget); _busyIndicatorEngine->registerWidget(widget); // the following allows some optimization of widget unregistration // it assumes that a widget can be registered atmost in one of the // engines stored in the list. foreach (const BaseEngine::Pointer &engine, _engines) { if (engine && engine.data()->unregisterWidget(widget)) { break; } } } //_______________________________________________________________ void Animations::unregisterEngine(QObject *object) { int index(_engines.indexOf(qobject_cast(object))); if (index >= 0) { _engines.removeAt(index); } } //_______________________________________________________________ void Animations::registerEngine(BaseEngine *engine) { _engines.append(engine); connect(engine, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterEngine(QObject *))); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitaanimations.h000066400000000000000000000115431414271704400231260ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_ANIMATIONS_H #define ADWAITA_ANIMATIONS_H #include "adwaitabusyindicatorengine.h" #include "adwaitadialengine.h" #include "adwaitaheaderviewengine.h" #include "adwaitascrollbarengine.h" #include "adwaitaspinboxengine.h" #include "adwaitastackedwidgetengine.h" #include "adwaitatabbarengine.h" #include "adwaitatoolboxengine.h" #include "adwaitawidgetstateengine.h" #include "adwaitaqt_export.h" #include #include namespace Adwaita { //* stores engines class ADWAITAQT_EXPORT Animations : public QObject { Q_OBJECT public: //* constructor explicit Animations(QObject *); //* destructor virtual ~Animations() { } //* register animations corresponding to given widget, depending on its type. void registerWidget(QWidget *widget) const; /** unregister all animations associated to a widget */ void unregisterWidget(QWidget *widget) const; //* enability engine WidgetStateEngine &widgetEnabilityEngine() const { return *_widgetEnabilityEngine; } //* abstractButton engine WidgetStateEngine &widgetStateEngine() const { return *_widgetStateEngine; } //* editable combobox arrow hover engine WidgetStateEngine &comboBoxEngine() const { return *_comboBoxEngine; } //! Tool buttons arrow hover engine WidgetStateEngine &toolButtonEngine() const { return *_toolButtonEngine; } //! item view engine WidgetStateEngine &inputWidgetEngine() const { return *_inputWidgetEngine; } //* busy indicator BusyIndicatorEngine &busyIndicatorEngine() const { return *_busyIndicatorEngine; } //* header view engine HeaderViewEngine &headerViewEngine() const { return *_headerViewEngine; } //* scrollbar engine ScrollBarEngine &scrollBarEngine() const { return *_scrollBarEngine; } //* dial engine DialEngine &dialEngine() const { return *_dialEngine; } //* spinbox engine SpinBoxEngine &spinBoxEngine() const { return *_spinBoxEngine; } //* tabbar TabBarEngine &tabBarEngine() const { return *_tabBarEngine; } //* toolbox ToolBoxEngine &toolBoxEngine() const { return *_toolBoxEngine; } //* setup engines void setupEngines(); protected Q_SLOTS: //* enregister engine void unregisterEngine(QObject *); private: //* register new engine void registerEngine(BaseEngine *engine); //* busy indicator BusyIndicatorEngine *_busyIndicatorEngine; //* headerview hover effect HeaderViewEngine *_headerViewEngine; //* widget enability engine WidgetStateEngine *_widgetEnabilityEngine; //* abstract button engine WidgetStateEngine *_widgetStateEngine; //* editable combobox arrow hover effect WidgetStateEngine *_comboBoxEngine; //! mennu toolbutton arrow hover effect WidgetStateEngine *_toolButtonEngine; //! item view engine WidgetStateEngine *_inputWidgetEngine; //* scrollbar engine ScrollBarEngine *_scrollBarEngine; //* dial engine DialEngine *_dialEngine; //* spinbox engine SpinBoxEngine *_spinBoxEngine; //* stacked widget engine StackedWidgetEngine *_stackedWidgetEngine; //* tabbar engine TabBarEngine *_tabBarEngine; //* toolbar engine ToolBoxEngine *_toolBoxEngine; //* keep list of existing engines QList _engines; }; } // namespace Adwaita #endif // ADWAITA_ANIMATIONS_H adwaita-qt-1.4.1/src/lib/animations/adwaitabaseengine.cpp000066400000000000000000000025471414271704400234230ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitabaseengine.h" adwaita-qt-1.4.1/src/lib/animations/adwaitabaseengine.h000066400000000000000000000053441414271704400230660ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_BASE_ENGINE_H #define ADWAITA_BASE_ENGINE_H #include "adwaita.h" #include "adwaitaqt_export.h" #include #include namespace Adwaita { //* base class for all animation engines /** it is used to store configuration values used by all animations stored in the engine */ class ADWAITAQT_EXPORT BaseEngine : public QObject { Q_OBJECT public: using Pointer = WeakPointer; //* constructor explicit BaseEngine(QObject *parent) : QObject(parent) , _enabled(true) , _duration(200) { } //* destructor virtual ~BaseEngine() { } //* enability virtual void setEnabled(bool value) { _enabled = value; } //* enability virtual bool enabled() const { return _enabled; } //* duration virtual void setDuration(int value) { _duration = value; } //* duration virtual int duration() const { return _duration; } //* unregister widget virtual bool unregisterWidget(QObject *object) = 0; //* list of widgets using WidgetList = QSet; //* returns registered widgets virtual WidgetList registeredWidgets() const { return WidgetList(); } private: //* engine enability bool _enabled; //* animation duration int _duration; }; } // namespace Adwaita #endif // ADWAITA_BASE_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitabusyindicatordata.cpp000066400000000000000000000025561414271704400250340ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitabusyindicatordata.h" adwaita-qt-1.4.1/src/lib/animations/adwaitabusyindicatordata.h000066400000000000000000000043221414271704400244720ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_BUSY_INDICATOR_DATA_ #define ADWAITA_BUSY_INDICATOR_DATA_ #include "adwaitaqt_export.h" #include namespace Adwaita { class Q_DECL_EXPORT BusyIndicatorData : public QObject { Q_OBJECT public: //* constructor explicit BusyIndicatorData(QObject *parent) : QObject(parent) , _animated(false) { } //* destructor virtual ~BusyIndicatorData() { } //*@name accessors //@{ //* animated bool isAnimated() const { return _animated; } //@} //*@name modifiers //@{ //* enabled void setEnabled(bool) { } //* enabled void setDuration(int) { } //* animated void setAnimated(bool value) { _animated = value; } //@} private: //* animated bool _animated; }; } // namespace Adwaita #endif // ADWAITA_BUSY_INDICATOR_DATA_ adwaita-qt-1.4.1/src/lib/animations/adwaitabusyindicatorengine.cpp000066400000000000000000000122751414271704400253670ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitabusyindicatorengine.h" #include "adwaita.h" #include namespace Adwaita { //_______________________________________________ BusyIndicatorEngine::BusyIndicatorEngine(QObject *object) : BaseEngine(object) {} //_______________________________________________ bool BusyIndicatorEngine::registerWidget(QObject *object) { // check widget validity if (!object) return false; // create new data class if (!_data.contains(object)) { _data.insert(object, new BusyIndicatorData(this)); // connect destruction signal connect(object, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); } return true; } //____________________________________________________________ bool BusyIndicatorEngine::isAnimated(const QObject *object) { DataMap::Value data(BusyIndicatorEngine::data(object)); return data && data.data()->isAnimated(); } //____________________________________________________________ void BusyIndicatorEngine::setDuration(int value) { if (duration() == value) { return; } BaseEngine::setDuration(value); // restart timer with specified time if (_animation) { _animation.data()->setDuration(value); } } //____________________________________________________________ void BusyIndicatorEngine::setAnimated(const QObject *object, bool value) { DataMap::Value data(BusyIndicatorEngine::data(object)); if (data) { // update data data.data()->setAnimated(value); // start timer if needed if (value) { if (!_animation) { // create animation if not already there _animation = new Animation(duration(), this); // setup _animation.data()->setStartValue(0.0); _animation.data()->setEndValue(100.0); _animation.data()->setTargetObject(this); _animation.data()->setPropertyName("value"); _animation.data()->setLoopCount(-1); _animation.data()->setDuration(duration() * 3); } // start if not already running if (!_animation.data()->isRunning()) { _animation.data()->start(); } } } return; } //____________________________________________________________ DataMap::Value BusyIndicatorEngine::data(const QObject *object) { return _data.find(object).data(); } //_______________________________________________ void BusyIndicatorEngine::setValue(int value) { // update _value = value; bool animated(false); // loop over objects in map for (DataMap::iterator iter = _data.begin(); iter != _data.end(); ++iter) { if (iter.value().data()->isAnimated()) { // update animation flag animated = true; // emit update signal on object if (const_cast(iter.key())->inherits("QQuickStyleItem")) { //QtQuickControls "rerender" method is updateItem QMetaObject::invokeMethod(const_cast(iter.key()), "updateItem", Qt::QueuedConnection); } else { QMetaObject::invokeMethod(const_cast(iter.key()), "update", Qt::QueuedConnection); } } } if (_animation && !animated) { _animation.data()->stop(); _animation.data()->deleteLater(); _animation.clear(); } } //__________________________________________________________ bool BusyIndicatorEngine::unregisterWidget(QObject *object) { bool removed(_data.unregisterWidget(object)); if (_animation && _data.isEmpty()) { _animation.data()->stop(); _animation.data()->deleteLater(); _animation.clear(); } return removed; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitabusyindicatorengine.h000066400000000000000000000055541414271704400250360ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_BUSY_INDICATOR_ENGINE_H #define ADWAITA_BUSY_INDICATOR_ENGINE_H #include "adwaitaanimation.h" #include "adwaitabaseengine.h" #include "adwaitabusyindicatordata.h" #include "adwaitadatamap.h" #include "adwaitaqt_export.h" namespace Adwaita { //* handles progress bar animations class ADWAITAQT_EXPORT BusyIndicatorEngine : public BaseEngine { Q_OBJECT //* declare opacity property Q_PROPERTY(int value READ value WRITE setValue) public: //* constructor explicit BusyIndicatorEngine(QObject *); //* destructor virtual ~BusyIndicatorEngine() { } //*@name accessors //@{ //* true if widget is animated virtual bool isAnimated(const QObject *); //* value virtual int value() const { return _value; } //@} //*@name modifiers //@{ //* register progressbar virtual bool registerWidget(QObject *); //* duration virtual void setDuration(int); //* set object as animated virtual void setAnimated(const QObject *, bool); //* opacity virtual void setValue(int value); //@} public Q_SLOTS: //* remove widget from map virtual bool unregisterWidget(QObject *); protected: //* returns data associated to widget DataMap::Value data(const QObject *); private: //* map widgets to progressbar data DataMap _data; //* animation Animation::Pointer _animation; //* value int _value = 0; }; } // namespace Adwaita #endif // ADWAITA_BUSY_INDICATOR_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitadatamap.h000066400000000000000000000111521414271704400223670ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_DATAMAP_H #define ADWAITA_DATAMAP_H #include "adwaita.h" #include "adwaitaqt_export.h" #include #include #include namespace Adwaita { //* data map /** it maps templatized data object to associated object */ template class ADWAITAQT_EXPORT BaseDataMap : public QMap> { public: using Key = const K *; using Value = WeakPointer; //* constructor BaseDataMap() : QMap() , _enabled(true) , _lastKey(NULL) { } //* destructor virtual ~BaseDataMap() { } //* insertion virtual typename QMap::iterator insert(const Key &key, const Value &value, bool enabled = true) { if (value) { value.data()->setEnabled(enabled); } return QMap::insert(key, value); } //* find value Value find(Key key) { if (!(enabled() && key)) { return Value(); } if (key == _lastKey) { return _lastValue; } else { Value out; typename QMap::iterator iter(QMap::find(key)); if (iter != QMap::end()) { out = iter.value(); } _lastKey = key; _lastValue = out; return out; } } //* unregister widget bool unregisterWidget(Key key) { // check key if (!key) { return false; } // clear last value if needed if (key == _lastKey) { if (_lastValue) { _lastValue.clear(); } _lastKey = NULL; } // find key in map typename QMap::iterator iter(QMap::find(key)); if (iter == QMap::end()) { return false; } // delete value from map if found if (iter.value()) { iter.value().data()->deleteLater(); } QMap::erase(iter); return true; } //* maxFrame void setEnabled(bool enabled) { _enabled = enabled; foreach (const Value &value, *this) { if (value) { value.data()->setEnabled(enabled); } } } //* enability bool enabled() const { return _enabled; } //* duration void setDuration(int duration) const { foreach (const Value &value, *this) { if (value) { value.data()->setDuration(duration); } } } private: //* enability bool _enabled; //* last key Key _lastKey; //* last value Value _lastValue; }; //* standard data map, using QObject as a key template class ADWAITAQT_EXPORT DataMap : public BaseDataMap { public: //* constructor DataMap() { } //* destructor virtual ~DataMap() { } }; //* QPaintDevice based dataMap template class ADWAITAQT_EXPORT PaintDeviceDataMap : public BaseDataMap { public: //* constructor PaintDeviceDataMap() { } //* destructor virtual ~PaintDeviceDataMap() { } }; } // namespace Adwaiat #endif // ADWAITA_DATAMAP_H adwaita-qt-1.4.1/src/lib/animations/adwaitadialdata.cpp000066400000000000000000000060111414271704400230540ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitadialdata.h" #include #include namespace Adwaita { //______________________________________________ DialData::DialData(QObject *parent, QWidget *target, int duration) : WidgetStateData(parent, target, duration) , _position(-1, -1) { target->installEventFilter(this); } //______________________________________________ bool DialData::eventFilter(QObject *object, QEvent *event) { if (object != target().data()) { return WidgetStateData::eventFilter(object, event); } // check event type switch (event->type()) { case QEvent::HoverEnter: case QEvent::HoverMove: hoverMoveEvent(object, event); break; case QEvent::HoverLeave: hoverLeaveEvent(object, event); break; default: break; } return WidgetStateData::eventFilter(object, event); } //______________________________________________ void DialData::hoverMoveEvent(QObject *object, QEvent *event) { // try cast object to dial QDial *scrollBar(qobject_cast(object)); if (!scrollBar || scrollBar->isSliderDown()) { return; } // cast event QHoverEvent *hoverEvent = static_cast(event); // store position #if QT_VERSION >= 0x060000 _position = hoverEvent->position().toPoint(); #else _position = hoverEvent->pos(); #endif // trigger animation if position match handle rect updateState(_handleRect.contains(_position)); } //______________________________________________ void DialData::hoverLeaveEvent(QObject *, QEvent *) { // reset hover state updateState(false); // reset mouse position _position = QPoint(-1, -1); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitadialdata.h000066400000000000000000000044131414271704400225250ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_DIAL_DATA_H #define ADWAITA_DIAL_DATA_H #include "adwaitawidgetstatedata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* dial data class ADWAITAQT_EXPORT DialData : public WidgetStateData { Q_OBJECT public: //* constructor DialData(QObject *parent, QWidget *target, int); //* destructor virtual ~DialData() { } //* event filter virtual bool eventFilter(QObject *, QEvent *); //* subcontrol rect virtual void setHandleRect(const QRect &rect) { _handleRect = rect; } //* mouse position QPoint position() const { return _position; } protected: //* hoverMoveEvent virtual void hoverMoveEvent(QObject *, QEvent *); //* hoverMoveEvent virtual void hoverLeaveEvent(QObject *, QEvent *); private: //* rect QRect _handleRect; //* mouse position QPoint _position; }; } // namespace Adwaita #endif // ADWAITA_DIAL_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitadialengine.cpp000066400000000000000000000042641414271704400234200ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitadialengine.h" #include namespace Adwaita { //____________________________________________________________ bool DialEngine::registerWidget(QWidget *widget, AnimationModes mode) { // check widget if (!widget) { return false; } // only handle hover and focus if (mode & AnimationHover && !dataMap(AnimationHover).contains(widget)) { dataMap(AnimationHover).insert(widget, new DialData(this, widget, duration()), enabled()); } if (mode & AnimationFocus && !dataMap(AnimationFocus).contains(widget)) { dataMap(AnimationFocus).insert(widget, new WidgetStateData(this, widget, duration()), enabled()); } // connect destruction signal connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); return true; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitadialengine.h000066400000000000000000000047771414271704400230760ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_DIAL_ENGINE_H #define ADWAITA_DIAL_ENGINE_H #include "adwaitadialdata.h" #include "adwaitawidgetstateengine.h" #include "adwaitaqt_export.h" namespace Adwaita { //* stores dial hovered action and timeLine class ADWAITAQT_EXPORT DialEngine : public WidgetStateEngine { Q_OBJECT public: //* constructor explicit DialEngine(QObject *parent) : WidgetStateEngine(parent) { } //* destructor virtual ~DialEngine() { } //* register dial virtual bool registerWidget(QWidget *, AnimationModes); //* control rect virtual void setHandleRect(const QObject *object, const QRect &rect) { if (DataMap::Value data = this->data(object, AnimationHover)) { static_cast(data.data())->setHandleRect(rect); } } //* mouse position virtual QPoint position(const QObject *object) { if (DataMap::Value data = this->data(object, AnimationHover)) { return static_cast(data.data())->position(); } else { return QPoint(-1, -1); } } }; } // namespace Adwaita #endif // ADWAITA_DIAL_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitaenabledata.cpp000066400000000000000000000036631414271704400234030ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaenabledata.h" namespace Adwaita { //______________________________________________ bool EnableData::eventFilter(QObject *object, QEvent *event) { if (!enabled()) { return WidgetStateData::eventFilter(object, event); } // check event type switch (event->type()) { // enter event case QEvent::EnabledChange: { if (QWidget *widget = qobject_cast(object)) { updateState(widget->isEnabled()); } break; } default: break; } return WidgetStateData::eventFilter(object, event); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitaenabledata.h000066400000000000000000000037241414271704400230460ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_ENABLE_DATA_H #define ADWAITA_ENABLE_DATA_H #include "adwaitawidgetstatedata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* Enable data class ADWAITAQT_EXPORT EnableData : public WidgetStateData { Q_OBJECT public: //* constructor EnableData(QObject *parent, QWidget *target, int duration, bool state = true) : WidgetStateData(parent, target, duration, state) { target->installEventFilter(this); } //* destructor virtual ~EnableData() { } //* event filter virtual bool eventFilter(QObject *, QEvent *); }; } // namespace Adwaita #endif // ADWAITA_ENABLE_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitagenericdata.cpp000066400000000000000000000032751414271704400235700ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitagenericdata.h" #include namespace Adwaita { //______________________________________________ GenericData::GenericData(QObject *parent, QWidget *target, int duration) : AnimationData(parent, target) , _animation(new Animation(duration, this)) , _opacity(0) { setupAnimation(_animation, "opacity"); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitagenericdata.h000066400000000000000000000051211414271704400232250ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_GENERIC_DATA_H #define ADWAITA_GENERIC_DATA_H #include "adwaitaanimation.h" #include "adwaitaanimationdata.h" #include "adwaitaqt_export.h" #include #include namespace Adwaita { //* generic data class ADWAITAQT_EXPORT GenericData : public AnimationData { Q_OBJECT //* declare opacity property Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity) public: //* constructor GenericData(QObject *parent, QWidget *widget, int duration); //* destructor virtual ~GenericData() { } //* return animation object virtual const Animation::Pointer &animation() const { return _animation; } //* duration virtual void setDuration(int duration) { _animation.data()->setDuration(duration); } //* opacity virtual qreal opacity() const { return _opacity; } //* opacity virtual void setOpacity(qreal value) { value = digitize(value); if (_opacity == value) { return; } _opacity = value; setDirty(); } private: //* animation handling Animation::Pointer _animation; //* opacity variable qreal _opacity; }; } // namespace Adwaita #endif // ADWAITA_GENERIC_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitaheaderviewdata.cpp000066400000000000000000000151421414271704400242730ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ ////////////////////////////////////////////////////////////////////////////// // adwaitaheaderviewdata.cpp // data container for QHeaderView animations // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #include "adwaitaheaderviewdata.h" #include #include namespace Adwaita { //______________________________________________ HeaderViewData::HeaderViewData(QObject *parent, QWidget *target, int duration) : AnimationData(parent, target) { _current._animation = new Animation(duration, this); setupAnimation(currentIndexAnimation(), "currentOpacity"); currentIndexAnimation().data()->setDirection(Animation::Forward); _previous._animation = new Animation(duration, this); setupAnimation(previousIndexAnimation(), "previousOpacity"); previousIndexAnimation().data()->setDirection(Animation::Backward); } //______________________________________________ bool HeaderViewData::updateState(const QPoint &position, bool hovered) { if (!enabled()) { return false; } const QHeaderView *local(qobject_cast(target().data())); if (!local) { return false; } int index(local->logicalIndexAt(position)); if (index < 0) { return false; } if (hovered) { if (index != currentIndex()) { if (currentIndex() >= 0) { setPreviousIndex(currentIndex()); setCurrentIndex(-1); previousIndexAnimation().data()->restart(); } setCurrentIndex(index); currentIndexAnimation().data()->restart(); return true; } else { return false; } } else if (index == currentIndex()) { setPreviousIndex(currentIndex()); setCurrentIndex(-1); previousIndexAnimation().data()->restart(); return true; } else { return false; } } //______________________________________________ Animation::Pointer HeaderViewData::animation(const QPoint &position) const { if (!enabled()) { return Animation::Pointer(); } const QHeaderView *local(qobject_cast(target().data())); if (!local) { return Animation::Pointer(); } int index(local->logicalIndexAt(position)); if (index < 0) { return Animation::Pointer(); } else if (index == currentIndex()) { return currentIndexAnimation(); } else if (index == previousIndex()) { return previousIndexAnimation(); } else { return Animation::Pointer(); } } //______________________________________________ qreal HeaderViewData::opacity(const QPoint &position) const { if (!enabled()) { return OpacityInvalid; } const QHeaderView *local(qobject_cast(target().data())); if (!local) { return OpacityInvalid; } int index(local->logicalIndexAt(position)); if (index < 0) { return OpacityInvalid; } else if (index == currentIndex()) { return currentOpacity(); } else if (index == previousIndex()) { return previousOpacity(); } else { return OpacityInvalid; } } //__________________________________________________________ void HeaderViewData::setDirty() const { QHeaderView *header = qobject_cast(target().data()); if (!header) { return; } // get first and last index, sorted int lastIndex(qMax(previousIndex(), currentIndex())); if (lastIndex < 0) { return; } int firstIndex(qMin(previousIndex(), currentIndex())); if (firstIndex < 0) { firstIndex = lastIndex; } // find relevant rectangle to be updated, in viewport coordinate QWidget *viewport(header->viewport()); int left = header->sectionViewportPosition(firstIndex); int right = header->sectionViewportPosition(lastIndex) + header->sectionSize(lastIndex); // trigger update if (header->orientation() == Qt::Horizontal) { viewport->update(left, 0, right - left, header->height()); } else { viewport->update(0, left, header->width(), right - left); } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitaheaderviewdata.h000066400000000000000000000111101414271704400237270ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_HEADER_VIEW_DATA_H #define ADWAITA_HEADER_VIEW_DATA_H #include "adwaitaanimationdata.h" #include "adwaitaqt_export.h" #include namespace Adwaita { //* headerviews class ADWAITAQT_EXPORT HeaderViewData : public AnimationData { Q_OBJECT //* declare opacity property Q_PROPERTY(qreal currentOpacity READ currentOpacity WRITE setCurrentOpacity) Q_PROPERTY(qreal previousOpacity READ previousOpacity WRITE setPreviousOpacity) public: //* constructor HeaderViewData(QObject *parent, QWidget *target, int duration); //* destructor virtual ~HeaderViewData() { } //* duration void setDuration(int duration) { currentIndexAnimation().data()->setDuration(duration); previousIndexAnimation().data()->setDuration(duration); } //* update state bool updateState(const QPoint &, bool); //*@name current index handling //@{ //* current opacity virtual qreal currentOpacity() const { return _current._opacity; } //* current opacity virtual void setCurrentOpacity(qreal value) { value = digitize(value); if (_current._opacity == value) { return; } _current._opacity = value; setDirty(); } //* current index virtual int currentIndex() const { return _current._index; } //* current index virtual void setCurrentIndex(int index) { _current._index = index; } //* current index animation virtual const Animation::Pointer ¤tIndexAnimation() const { return _current._animation; } //@} //*@name previous index handling //@{ //* previous opacity virtual qreal previousOpacity() const { return _previous._opacity; } //* previous opacity virtual void setPreviousOpacity(qreal value) { value = digitize(value); if (_previous._opacity == value) { return; } _previous._opacity = value; setDirty(); } //* previous index virtual int previousIndex() const { return _previous._index; } //* previous index virtual void setPreviousIndex(int index) { _previous._index = index; } //* previous index Animation virtual const Animation::Pointer &previousIndexAnimation() const { return _previous._animation; } //@} //* return Animation associated to action at given position, if any virtual Animation::Pointer animation(const QPoint &position) const; //* return opacity associated to action at given position, if any virtual qreal opacity(const QPoint &position) const; protected: //* dirty virtual void setDirty() const; private: //* container for needed animation data class Data { public: //* default constructor Data() : _opacity(0) , _index(-1) { } Animation::Pointer _animation; qreal _opacity; int _index; }; //* current tab animation data (for hover enter animations) Data _current; //* previous tab animations data (for hover leave animations) Data _previous; }; } // namespace Adwaita #endif // ADWAITA_HEADER_VIEW_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitaheaderviewengine.cpp000066400000000000000000000042721414271704400246310ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaheaderviewengine.h" #include namespace Adwaita { //____________________________________________________________ bool HeaderViewEngine::registerWidget(QWidget *widget) { if (!widget) { return false; } // create new data class if (!_data.contains(widget)) { _data.insert(widget, new HeaderViewData(this, widget, duration()), enabled()); } // connect destruction signal connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); return true; } //____________________________________________________________ bool HeaderViewEngine::updateState(const QObject *object, const QPoint &position, bool value) { DataMap::Value data(_data.find(object)); return (data && data.data()->updateState(position, value)); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitaheaderviewengine.h000066400000000000000000000062411414271704400242740ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_HEADER_VIEW_ENGINE_H #define ADWAITA_HEADER_VIEW_ENGINE_H #include "adwaitabaseengine.h" #include "adwaitadatamap.h" #include "adwaitaheaderviewdata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* stores headerview hovered action and timeLine class ADWAITAQT_EXPORT HeaderViewEngine : public BaseEngine { Q_OBJECT public: //* constructor explicit HeaderViewEngine(QObject *parent) : BaseEngine(parent) { } //* destructor virtual ~HeaderViewEngine() { } //* register headerview virtual bool registerWidget(QWidget *); //* true if widget hover state is changed virtual bool updateState(const QObject *, const QPoint &, bool); //* true if widget is animated virtual bool isAnimated(const QObject *object, const QPoint &point) { if (DataMap::Value data = _data.find(object)) { if (Animation::Pointer animation = data.data()->animation(point)) { return animation.data()->isRunning(); } } return false; } //* animation opacity virtual qreal opacity(const QObject *object, const QPoint &point) { return isAnimated(object, point) ? _data.find(object).data()->opacity(point) : AnimationData::OpacityInvalid; } //* enability virtual void setEnabled(bool value) { BaseEngine::setEnabled(value); _data.setEnabled(value); } //* duration virtual void setDuration(int value) { BaseEngine::setDuration(value); _data.setDuration(value); } public Q_SLOTS: //* remove widget from map virtual bool unregisterWidget(QObject *object) { return _data.unregisterWidget(object); } private: //* data map DataMap _data; }; } // namespace #endif // ADWAITA_HEADER_VIEW_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitascrollbardata.cpp000066400000000000000000000172441414271704400241400ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitascrollbardata.h" #include #include #include Q_GUI_EXPORT QStyleOptionSlider qt_qscrollbarStyleOption(QScrollBar *); namespace Adwaita { //______________________________________________ ScrollBarData::ScrollBarData(QObject *parent, QWidget *target, int duration) : WidgetStateData(parent, target, duration) , _position(-1, -1) { target->installEventFilter(this); _addLineData._animation = new Animation(duration, this); _subLineData._animation = new Animation(duration, this); _grooveData._animation = new Animation(duration, this); connect(addLineAnimation().data(), SIGNAL(finished()), SLOT(clearAddLineRect())); connect(subLineAnimation().data(), SIGNAL(finished()), SLOT(clearSubLineRect())); // setup animation setupAnimation(addLineAnimation(), "addLineOpacity"); setupAnimation(subLineAnimation(), "subLineOpacity"); setupAnimation(grooveAnimation(), "grooveOpacity"); } //______________________________________________ bool ScrollBarData::eventFilter(QObject *object, QEvent *event) { if (object != target().data()) { return WidgetStateData::eventFilter(object, event); } // check event type switch (event->type()) { case QEvent::HoverEnter: setGrooveHovered(true); grooveAnimation().data()->setDirection(Animation::Forward); if (!grooveAnimation().data()->isRunning()) { grooveAnimation().data()->start(); } case QEvent::HoverMove: hoverMoveEvent(object, event); break; case QEvent::HoverLeave: setGrooveHovered(false); grooveAnimation().data()->setDirection(Animation::Backward); if (!grooveAnimation().data()->isRunning()) { grooveAnimation().data()->start(); } hoverLeaveEvent(object, event); break; default: break; } return WidgetStateData::eventFilter(object, event); } //______________________________________________ const Animation::Pointer &ScrollBarData::animation(QStyle::SubControl subcontrol) const { switch (subcontrol) { case QStyle::SC_ScrollBarSlider: return animation(); case QStyle::SC_ScrollBarAddLine: return addLineAnimation(); case QStyle::SC_ScrollBarSubLine: return subLineAnimation(); case QStyle::SC_ScrollBarGroove: return grooveAnimation(); default: return animation(); } return animation(); } //______________________________________________ qreal ScrollBarData::opacity(QStyle::SubControl subcontrol) const { switch (subcontrol) { case QStyle::SC_ScrollBarSlider: return opacity(); case QStyle::SC_ScrollBarAddLine: return addLineOpacity(); case QStyle::SC_ScrollBarSubLine: return subLineOpacity(); case QStyle::SC_ScrollBarGroove: return grooveOpacity(); default: return 0; } return 0; } //______________________________________________ void ScrollBarData::hoverMoveEvent(QObject *object, QEvent *event) { // try cast object to scrollbar QScrollBar *scrollBar(qobject_cast(object)); if (!scrollBar || scrollBar->isSliderDown()) { return; } // retrieve scrollbar option QStyleOptionSlider opt(qt_qscrollbarStyleOption(scrollBar)); // cast event QHoverEvent *hoverEvent = static_cast(event); QStyle::SubControl hoverControl = scrollBar->style()->hitTestComplexControl(QStyle::CC_ScrollBar, &opt, #if QT_VERSION >= 0x060000 hoverEvent->position().toPoint(), #else hoverEvent->pos(), #endif scrollBar); // update hover state updateAddLineArrow(hoverControl); updateSubLineArrow(hoverControl); // store position #if QT_VERSION >= 0x060000 _position = hoverEvent->position().toPoint(); #else _position = hoverEvent->pos(); #endif } //______________________________________________ void ScrollBarData::hoverLeaveEvent(QObject *, QEvent *) { // reset hover state updateSubLineArrow(QStyle::SC_None); updateAddLineArrow(QStyle::SC_None); // reset mouse position _position = QPoint(-1, -1); } //_____________________________________________________________________ void ScrollBarData::updateSubLineArrow(QStyle::SubControl hoverControl) { if (hoverControl == QStyle::SC_ScrollBarSubLine) { if (!subLineArrowHovered()) { setSubLineArrowHovered(true); if (enabled()) { subLineAnimation().data()->setDirection(Animation::Forward); if (!subLineAnimation().data()->isRunning()) { subLineAnimation().data()->start(); } } else { setDirty(); } } } else { if (subLineArrowHovered()) { setSubLineArrowHovered(false); if (enabled()) { subLineAnimation().data()->setDirection(Animation::Backward); if (!subLineAnimation().data()->isRunning()) { subLineAnimation().data()->start(); } } else { setDirty(); } } } } //_____________________________________________________________________ void ScrollBarData::updateAddLineArrow(QStyle::SubControl hoverControl) { if (hoverControl == QStyle::SC_ScrollBarAddLine) { if (!addLineArrowHovered()) { setAddLineArrowHovered(true); if (enabled()) { addLineAnimation().data()->setDirection(Animation::Forward); if (!addLineAnimation().data()->isRunning()) { addLineAnimation().data()->start(); } } else { setDirty(); } } } else { if (addLineArrowHovered()) { setAddLineArrowHovered(false); if (enabled()) { addLineAnimation().data()->setDirection(Animation::Backward); if (!addLineAnimation().data()->isRunning()) { addLineAnimation().data()->start(); } } else { setDirty(); } } } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitascrollbardata.h000066400000000000000000000166521414271704400236070ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_SCROLLBAR_DATA_H #define ADWAITA_SCROLLBAR_DATA_H #include "adwaitawidgetstatedata.h" #include "adwaitaqt_export.h" #include namespace Adwaita { //* scrollbar data class ADWAITAQT_EXPORT ScrollBarData : public WidgetStateData { Q_OBJECT Q_PROPERTY(qreal addLineOpacity READ addLineOpacity WRITE setAddLineOpacity) Q_PROPERTY(qreal subLineOpacity READ subLineOpacity WRITE setSubLineOpacity) Q_PROPERTY(qreal grooveOpacity READ grooveOpacity WRITE setGrooveOpacity) public: //* constructor ScrollBarData(QObject *parent, QWidget *target, int); //* destructor virtual ~ScrollBarData() { } //* event filter virtual bool eventFilter(QObject *, QEvent *); //* needed to avoid warning about virtual function being hidden using WidgetStateData::animation; using WidgetStateData::opacity; //* return animation for a given subcontrol virtual const Animation::Pointer &animation(QStyle::SubControl) const; //* return default opacity for a given subcontrol virtual qreal opacity(QStyle::SubControl) const; //* return default opacity for a given subcontrol virtual bool isHovered(QStyle::SubControl control) const { switch (control) { case QStyle::SC_ScrollBarAddLine: return addLineArrowHovered(); case QStyle::SC_ScrollBarSubLine: return subLineArrowHovered(); case QStyle::SC_ScrollBarGroove: return grooveHovered(); default: return false; } } //* subControlRect virtual QRect subControlRect(QStyle::SubControl control) const { switch (control) { case QStyle::SC_ScrollBarAddLine: return _addLineData._rect; case QStyle::SC_ScrollBarSubLine: return _subLineData._rect; default: return QRect(); } } //* subcontrol rect virtual void setSubControlRect(QStyle::SubControl control, const QRect &rect) { switch (control) { case QStyle::SC_ScrollBarAddLine: _addLineData._rect = rect; break; case QStyle::SC_ScrollBarSubLine: _subLineData._rect = rect; break; default: break; } } //* duration virtual void setDuration(int duration) { WidgetStateData::setDuration(duration); addLineAnimation().data()->setDuration(duration); subLineAnimation().data()->setDuration(duration); grooveAnimation().data()->setDuration(duration); } //* addLine opacity virtual void setAddLineOpacity(qreal value) { value = digitize(value); if (_addLineData._opacity == value) { return; } _addLineData._opacity = value; setDirty(); } //* addLine opacity virtual qreal addLineOpacity() const { return _addLineData._opacity; } //* subLine opacity virtual void setSubLineOpacity(qreal value) { value = digitize(value); if (_subLineData._opacity == value) { return; } _subLineData._opacity = value; setDirty(); } //* subLine opacity virtual qreal subLineOpacity() const { return _subLineData._opacity; } //* groove opacity virtual void setGrooveOpacity(qreal value) { value = digitize(value); if (_grooveData._opacity == value) { return; } _grooveData._opacity = value; setDirty(); } //* groove opacity virtual qreal grooveOpacity() const { return _grooveData._opacity; } //* mouse position QPoint position() const { return _position; } protected Q_SLOTS: //* clear addLineRect void clearAddLineRect() { if (addLineAnimation().data()->direction() == Animation::Backward) { _addLineData._rect = QRect(); } } //* clear subLineRect void clearSubLineRect() { if (subLineAnimation().data()->direction() == Animation::Backward) { _subLineData._rect = QRect(); } } protected: //* hoverMoveEvent virtual void hoverMoveEvent(QObject *, QEvent *); //* hoverMoveEvent virtual void hoverLeaveEvent(QObject *, QEvent *); //*@name hover flags //@{ virtual bool addLineArrowHovered() const { return _addLineData._hovered; } virtual void setAddLineArrowHovered(bool value) { _addLineData._hovered = value; } virtual bool subLineArrowHovered() const { return _subLineData._hovered; } virtual void setSubLineArrowHovered(bool value) { _subLineData._hovered = value; } virtual bool grooveHovered() const { return _grooveData._hovered; } virtual void setGrooveHovered(bool value) { _grooveData._hovered = value; } //@} //* update add line arrow virtual void updateAddLineArrow(QStyle::SubControl); //* update sub line arrow virtual void updateSubLineArrow(QStyle::SubControl); //*@name timelines //@{ virtual const Animation::Pointer &addLineAnimation() const { return _addLineData._animation; } virtual const Animation::Pointer &subLineAnimation() const { return _subLineData._animation; } virtual const Animation::Pointer &grooveAnimation() const { return _grooveData._animation; } private: //* stores sub control data class Data { public: //* constructor Data() : _hovered(false) , _opacity(AnimationData::OpacityInvalid) { } //* true if hovered bool _hovered; //* animation Animation::Pointer _animation; //* opacity qreal _opacity; //* rect QRect _rect; }; //* add line data (down arrow) Data _addLineData; //* subtract line data (up arrow) Data _subLineData; //* groove data Data _grooveData; //* mouse position QPoint _position; }; } // namespace Adwaita #endif // ADWAITA_SCROLLBAR_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitascrollbarengine.cpp000066400000000000000000000075431414271704400244750ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitascrollbarengine.h" #include namespace Adwaita { //____________________________________________________________ bool ScrollBarEngine::registerWidget(QWidget *widget, AnimationModes mode) { // check widget if (!widget) return false; // only handle hover and focus if (mode & AnimationHover && !dataMap(AnimationHover).contains(widget)) { dataMap(AnimationHover).insert(widget, new ScrollBarData(this, widget, duration()), enabled()); } if (mode & AnimationFocus && !dataMap(AnimationFocus).contains(widget)) { dataMap(AnimationFocus).insert(widget, new WidgetStateData(this, widget, duration()), enabled()); } // connect destruction signal connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); return true; } //____________________________________________________________ bool ScrollBarEngine::isAnimated(const QObject *object, AnimationMode mode, QStyle::SubControl control) { if (mode == AnimationHover) { if (DataMap::Value data = this->data(object, AnimationHover)) { const ScrollBarData *scrollBarData(static_cast(data.data())); Animation::Pointer animation = scrollBarData->animation(control); return animation.data()->isRunning(); } else { return false; } } else if (control == QStyle::SC_ScrollBarSlider) { return WidgetStateEngine::isAnimated(object, mode); } else { return false; } } //____________________________________________________________ AnimationMode ScrollBarEngine::animationMode(const QObject *object, QStyle::SubControl control) { // enable state if (isAnimated(object, AnimationHover, control)) { return AnimationHover; } else if (isAnimated(object, AnimationFocus, control)) { return AnimationFocus; } else if (isAnimated(object, AnimationPressed, control)) { return AnimationPressed; } else { return AnimationNone; } } //____________________________________________________________ qreal ScrollBarEngine::opacity(const QObject *object, QStyle::SubControl control) { if (isAnimated(object, AnimationHover, control)) { return static_cast(data(object, AnimationHover).data())->opacity(control); } else if (control == QStyle::SC_ScrollBarSlider) { return WidgetStateEngine::buttonOpacity(object); } return AnimationData::OpacityInvalid; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitascrollbarengine.h000066400000000000000000000075341414271704400241420ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_SCROLLBAR_ENGINE_H #define ADWAITA_SCROLLBAR_ENGINE_H #include "adwaitascrollbardata.h" #include "adwaitawidgetstateengine.h" #include "adwaitaqt_export.h" namespace Adwaita { //* stores scrollbar hovered action and timeLine class ADWAITAQT_EXPORT ScrollBarEngine : public WidgetStateEngine { Q_OBJECT public: //* constructor explicit ScrollBarEngine(QObject *parent) : WidgetStateEngine(parent) { } //* destructor virtual ~ScrollBarEngine() { } //* register scrollbar virtual bool registerWidget(QWidget *, AnimationModes); //*@name accessors //@{ using WidgetStateEngine::isAnimated; using WidgetStateEngine::opacity; //* true if widget is animated virtual bool isAnimated(const QObject *, AnimationMode, QStyle::SubControl control); //* true if widget is animated virtual AnimationMode animationMode(const QObject *object, QStyle::SubControl control); //* animation opacity virtual qreal opacity(const QObject *object, QStyle::SubControl control); //* return true if given subcontrol is hovered virtual bool isHovered(const QObject *object, QStyle::SubControl control) { if (DataMap::Value data = this->data(object, AnimationHover)) { return static_cast(data.data())->isHovered(control); } else { return false; } } //* control rect associated to object virtual QRect subControlRect(const QObject *object, QStyle::SubControl control) { if (DataMap::Value data = this->data(object, AnimationHover)) { return static_cast(data.data())->subControlRect(control); } else { return QRect(); } } //* mouse position virtual QPoint position(const QObject *object) { if (DataMap::Value data = this->data(object, AnimationHover)) { return static_cast(data.data())->position(); } else { return QPoint(-1, -1); } } //@} //*@name modifiers //@{ //* control rect virtual void setSubControlRect(const QObject *object, QStyle::SubControl control, const QRect &rect) { if (DataMap::Value data = this->data(object, AnimationHover)) { static_cast(data.data())->setSubControlRect(control, rect); } } //@} }; } // namespace Adwaita #endif // ADWAITA_SCROLLBAR_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitaspinboxdata.cpp000066400000000000000000000055241414271704400236350ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaspinboxdata.h" namespace Adwaita { //________________________________________________ SpinBoxData::SpinBoxData(QObject *parent, QWidget *target, int duration) : AnimationData(parent, target) { _upArrowData._hoverAnimation = new Animation(duration, this); _downArrowData._hoverAnimation = new Animation(duration, this); _upArrowData._pressedAnimation = new Animation(duration, this); _downArrowData._pressedAnimation = new Animation(duration, this); setupAnimation(upArrowAnimation(), "upArrowOpacity"); setupAnimation(downArrowAnimation(), "downArrowOpacity"); setupAnimation(upArrowPressedAnimation(), "upArrowPressed"); setupAnimation(downArrowPressedAnimation(), "downArrowPressed"); } //______________________________________________ bool SpinBoxData::Data::updateState(bool value, bool pressed) { bool change = false; if (_hoverState != value) { _hoverState = value; _hoverAnimation.data()->setDirection((_hoverState) ? Animation::Forward : Animation::Backward); if (!_hoverAnimation.data()->isRunning()) { _hoverAnimation.data()->start(); } change = true; } if (_pressedState != pressed) { _pressedState = pressed; _pressedAnimation.data()->setDirection((_pressedState) ? Animation::Forward : Animation::Backward); if (!_pressedAnimation.data()->isRunning()) { _pressedAnimation.data()->start(); } change = true; } return change; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitaspinboxdata.h000066400000000000000000000146421414271704400233030ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_SPINBOX_DATA_H #define ADWAITA_SPINBOX_DATA_H #include "adwaitaanimationdata.h" #include "adwaitaqt_export.h" #include namespace Adwaita { //* handles spinbox arrows hover class ADWAITAQT_EXPORT SpinBoxData : public AnimationData { Q_OBJECT //* declare opacity property Q_PROPERTY(qreal upArrowOpacity READ upArrowOpacity WRITE setUpArrowOpacity) Q_PROPERTY(qreal downArrowOpacity READ downArrowOpacity WRITE setDownArrowOpacity) Q_PROPERTY(qreal upArrowPressed READ upArrowPressed WRITE setUpArrowPressed) Q_PROPERTY(qreal downArrowPressed READ downArrowPressed WRITE setDownArrowPressed) public: //* constructor SpinBoxData(QObject *, QWidget *, int); //* destructor virtual ~SpinBoxData() { } //* animation state virtual bool updateState(QStyle::SubControl subControl, bool value, bool pressed) { if (subControl == QStyle::SC_SpinBoxUp) { return _upArrowData.updateState(value, pressed); } else if (subControl == QStyle::SC_SpinBoxDown) { return _downArrowData.updateState(value, pressed); } else { return false; } } //* animation state virtual bool isAnimated(QStyle::SubControl subControl) const { return ((subControl == QStyle::SC_SpinBoxUp && upArrowAnimation().data()->isRunning()) || (subControl == QStyle::SC_SpinBoxDown && downArrowAnimation().data()->isRunning())); } //* opacity virtual qreal opacity(QStyle::SubControl subControl) const { if (subControl == QStyle::SC_SpinBoxUp) { return upArrowOpacity(); } else if (subControl == QStyle::SC_SpinBoxDown) { return downArrowOpacity(); } else { return OpacityInvalid; } } //* opacity virtual qreal pressed(QStyle::SubControl subControl) const { if (subControl == QStyle::SC_SpinBoxUp) { return upArrowPressed(); } else if (subControl == QStyle::SC_SpinBoxDown) { return downArrowPressed(); } else { return OpacityInvalid; } } //* duration virtual void setDuration(int duration) { upArrowAnimation().data()->setDuration(duration); downArrowAnimation().data()->setDuration(duration); } //*@name up arrow animation //@{ //* opacity qreal upArrowOpacity() const { return _upArrowData._opacity; } //* opacity void setUpArrowOpacity(qreal value) { value = digitize(value); if (_upArrowData._opacity == value) { return; } _upArrowData._opacity = value; setDirty(); } //* animation Animation::Pointer upArrowAnimation() const { return _upArrowData._hoverAnimation; } //@} //*@name down arrow animation //@{ //* opacity qreal downArrowOpacity() const { return _downArrowData._opacity; } //* opacity void setDownArrowOpacity(qreal value) { value = digitize(value); if (_downArrowData._opacity == value) { return; } _downArrowData._opacity = value; setDirty(); } //* animation Animation::Pointer downArrowAnimation() const { return _downArrowData._hoverAnimation; } //*@name up arrow pressed animation //@{ //* opacity qreal upArrowPressed() const { return _upArrowData._pressed; } //* opacity void setUpArrowPressed(qreal value) { value = digitize(value); if (_upArrowData._pressed == value) { return; } _upArrowData._pressed = value; setDirty(); } //* animation Animation::Pointer upArrowPressedAnimation() const { return _upArrowData._pressedAnimation; } //*@name down arrow pressed animation //@{ //* opacity qreal downArrowPressed() const { return _downArrowData._pressed; } //* opacity void setDownArrowPressed(qreal value) { value = digitize(value); if (_downArrowData._pressed == value) { return; } _downArrowData._pressed = value; setDirty(); } //* animation Animation::Pointer downArrowPressedAnimation() const { return _downArrowData._pressedAnimation; } //@} private: //* container for needed animation data class ADWAITAQT_EXPORT Data { public: //* default constructor Data() : _hoverState(false) , _pressedState(false) , _opacity(0) , _pressed(0) { } //* state bool updateState(bool, bool); //* arrow state bool _hoverState; bool _pressedState; //* animation Animation::Pointer _hoverAnimation; Animation::Pointer _pressedAnimation; //* opacity qreal _opacity; qreal _pressed; }; //* up arrow data Data _upArrowData; //* down arrow data Data _downArrowData; }; } // namespace Adwaita #endif // ADWAITA_SPINBOX_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitaspinboxengine.cpp000066400000000000000000000036221414271704400241660ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitaspinboxengine.h" #include namespace Adwaita { //____________________________________________________________ bool SpinBoxEngine::registerWidget(QWidget *widget) { if (!widget) { return false; } // create new data class if (!_data.contains(widget)) { _data.insert(widget, new SpinBoxData(this, widget, duration()), enabled()); } // connect destruction signal connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); return true; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitaspinboxengine.h000066400000000000000000000072561414271704400236420ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_SPINBOX_ENGINE_H #define ADWAITA_SPINBOX_ENGINE_H #include "adwaitabaseengine.h" #include "adwaitadatamap.h" #include "adwaitaspinboxdata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* handle spinbox arrows hover effect class ADWAITAQT_EXPORT SpinBoxEngine : public BaseEngine { Q_OBJECT public: //* constructor explicit SpinBoxEngine(QObject *parent) : BaseEngine(parent) { } //* destructor virtual ~SpinBoxEngine() { } //* register widget virtual bool registerWidget(QWidget *); //* state virtual bool updateState(const QObject *object, QStyle::SubControl subControl, bool value, bool pressed) { if (DataMap::Value data = _data.find(object)) { return data.data()->updateState(subControl, value, pressed); } else { return false; } } //* true if widget is animated virtual bool isAnimated(const QObject *object, QStyle::SubControl subControl) { if (DataMap::Value data = _data.find(object)) { return data.data()->isAnimated(subControl); } else { return false; } } //* animation opacity virtual qreal opacity(const QObject *object, QStyle::SubControl subControl) { if (DataMap::Value data = _data.find(object)) { return data.data()->opacity(subControl); } else { return AnimationData::OpacityInvalid; } } //* animation opacity virtual qreal pressed(const QObject *object, QStyle::SubControl subControl) { if (DataMap::Value data = _data.find(object)) { return data.data()->pressed(subControl); } else { return AnimationData::OpacityInvalid; } } //* enability virtual void setEnabled(bool value) { BaseEngine::setEnabled(value); _data.setEnabled(value); } //* duration virtual void setDuration(int value) { BaseEngine::setDuration(value); _data.setDuration(value); } public Q_SLOTS: //* remove widget from map virtual bool unregisterWidget(QObject *object) { return _data.unregisterWidget(object); } private: //* data map DataMap _data; }; } // namespace Adwaita #endif // ADWAITA_SPINBOX_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitastackedwidgetdata.cpp000066400000000000000000000104701414271704400247710ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitastackedwidgetdata.cpp // data container for QStackedWidget transition // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #include "adwaitastackedwidgetdata.h" namespace Adwaita { //______________________________________________________ StackedWidgetData::StackedWidgetData(QObject *parent, QStackedWidget *target, int duration) : TransitionData(parent, target, duration) , _target(target) , _index(target->currentIndex()) { // configure transition connect(_target.data(), SIGNAL(destroyed()), SLOT(targetDestroyed())); connect(_target.data(), SIGNAL(currentChanged(int)), SLOT(animate())); // disable focus transition().data()->setAttribute(Qt::WA_NoMousePropagation, true); transition().data()->setFlag(TransitionWidget::PaintOnWidget, true); setMaxRenderTime(50); } //___________________________________________________________________ bool StackedWidgetData::initializeAnimation() { // check enability if (!(_target && _target.data()->isVisible())) { return false; } // check index if (_target.data()->currentIndex() == _index) { return false; } // do not animate if either index or currentIndex is not valid // but update _index none the less if (_target.data()->currentIndex() < 0 || _index < 0) { _index = _target.data()->currentIndex(); return false; } // get old widget (matching _index) and initialize transition if (QWidget *widget = _target.data()->widget(_index)) { transition().data()->setOpacity(0); startClock(); transition().data()->setGeometry(widget->geometry()); transition().data()->setStartPixmap(transition().data()->grab(widget)); _index = _target.data()->currentIndex(); return !slow(); } else { _index = _target.data()->currentIndex(); return false; } } //___________________________________________________________________ bool StackedWidgetData::animate() { // check enability if (!enabled()) { return false; } // initialize animation if (!initializeAnimation()) { return false; } // show transition widget transition().data()->show(); transition().data()->raise(); transition().data()->animate(); return true; } //___________________________________________________________________ void StackedWidgetData::finishAnimation() { // disable updates on currentWidget if (_target && _target.data()->currentWidget()) { _target.data()->currentWidget()->setUpdatesEnabled(false); } // hide transition transition().data()->hide(); // reenable updates and repaint if (_target && _target.data()->currentWidget()) { _target.data()->currentWidget()->setUpdatesEnabled(true); _target.data()->currentWidget()->repaint(); } // invalidate start widget transition().data()->resetStartPixmap(); } //___________________________________________________________________ void StackedWidgetData::targetDestroyed() { setEnabled(false); _target.clear(); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitastackedwidgetdata.h000066400000000000000000000043571414271704400244450ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitastackedwidgetdata.h // data container for QStackedWidget transition // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #ifndef ADWAITA_STACKEDWIDGET_DATA_H #define ADWAITA_STACKEDWIDGET_DATA_H #include "adwaitatransitiondata.h" #include "adwaitaqt_export.h" #include namespace Adwaita { //! generic data class ADWAITAQT_EXPORT StackedWidgetData : public TransitionData { Q_OBJECT public: //! constructor StackedWidgetData(QObject *, QStackedWidget *, int); //! destructor virtual ~StackedWidgetData() { } protected Q_SLOTS: //! initialize animation virtual bool initializeAnimation(); //! animate virtual bool animate(); //! finish animation virtual void finishAnimation(); //! called when target is destroyed virtual void targetDestroyed(); private: //! target WeakPointer _target; //! current index int _index; }; } // namespace Adwaita #endif // ADWAITA_STACKEDWIDGET_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitastackedwidgetengine.cpp000066400000000000000000000040051414271704400253220ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitastackedwidgetengine.cpp // stores event filters and maps widgets to animations // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #include "adwaitastackedwidgetengine.h" namespace Adwaita { //____________________________________________________________ bool StackedWidgetEngine::registerWidget(QStackedWidget *widget) { if (!widget) { return false; } if (!_data.contains(widget)) { _data.insert(widget, new StackedWidgetData(this, widget, duration()), enabled()); } // connect destruction signal disconnect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *))); connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *))); return true; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitastackedwidgetengine.h000066400000000000000000000050301414271704400247660ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitastackedwidgetengine.h // stores event filters and maps widgets to animations // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #ifndef ADWAITA_STACKEDWIDGET_ENGINE_H #define ADWAITA_STACKEDWIDGET_ENGINE_H #include "adwaitabaseengine.h" #include "adwaitadatamap.h" #include "adwaitastackedwidgetdata.h" #include "adwaitaqt_export.h" namespace Adwaita { //! used for simple widgets class ADWAITAQT_EXPORT StackedWidgetEngine : public BaseEngine { Q_OBJECT public: //! constructor explicit StackedWidgetEngine(QObject *parent) : BaseEngine(parent) { } //! destructor virtual ~StackedWidgetEngine() { } //! register widget virtual bool registerWidget(QStackedWidget *); //! duration virtual void setEnabled(bool value) { BaseEngine::setEnabled(value); _data.setEnabled(value); } //! duration virtual void setDuration(int value) { BaseEngine::setDuration(value); _data.setDuration(value); } public Q_SLOTS: //! remove widget from map virtual bool unregisterWidget(QObject *object) { return _data.unregisterWidget(object); } private: //! maps DataMap _data; }; } // namespace Adwaita #endif // ADWAITA_STACKEDWIDGET_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitatabbardata.cpp000066400000000000000000000130671414271704400234070ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ ////////////////////////////////////////////////////////////////////////////// // adwaitatabbardata.cpp // data container for QTabBar animations // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #include "adwaitatabbardata.h" #include #include namespace Adwaita { //______________________________________________ TabBarData::TabBarData(QObject *parent, QWidget *target, int duration) : AnimationData(parent, target) { _current._animation = new Animation(duration, this); setupAnimation(currentIndexAnimation(), "currentOpacity"); currentIndexAnimation().data()->setDirection(Animation::Forward); _previous._animation = new Animation(duration, this); setupAnimation(previousIndexAnimation(), "previousOpacity"); previousIndexAnimation().data()->setDirection(Animation::Backward); } //______________________________________________ Animation::Pointer TabBarData::animation(const QPoint &position) const { if (!enabled()) { return Animation::Pointer(); } const QTabBar *local(qobject_cast(target().data())); if (!local) { return Animation::Pointer(); } int index(local->tabAt(position)); if (index < 0) { return Animation::Pointer(); } else if (index == currentIndex()) { return currentIndexAnimation(); } else if (index == previousIndex()) { return previousIndexAnimation(); } else { return Animation::Pointer(); } } //______________________________________________ bool TabBarData::updateState(const QPoint &position, bool hovered) { if (!enabled()) { return false; } const QTabBar *local(qobject_cast(target().data())); if (!local) { return false; } int index(local->tabAt(position)); if (index < 0) { return false; } if (hovered) { if (index != currentIndex()) { if (currentIndex() >= 0) { setPreviousIndex(currentIndex()); setCurrentIndex(-1); previousIndexAnimation().data()->restart(); } setCurrentIndex(index); currentIndexAnimation().data()->restart(); return true; } else { return false; } } else if (index == currentIndex()) { setPreviousIndex(currentIndex()); setCurrentIndex(-1); previousIndexAnimation().data()->restart(); return true; } else { return false; } } //______________________________________________ qreal TabBarData::opacity(const QPoint &position) const { if (!enabled()) { return OpacityInvalid; } const QTabBar *local(qobject_cast(target().data())); if (!local) { return OpacityInvalid; } int index(local->tabAt(position)); if (index < 0) { return OpacityInvalid; } else if (index == currentIndex()) { return currentOpacity(); } else if (index == previousIndex()) { return previousOpacity(); } else { return OpacityInvalid; } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitatabbardata.h000066400000000000000000000106461414271704400230540ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_TABBAR_DATA_H #define ADWAITA_TABBAR_DATA_H #include "adwaitaanimationdata.h" #include "adwaitaqt_export.h" #include namespace Adwaita { //* tabbars class ADWAITAQT_EXPORT TabBarData : public AnimationData { Q_OBJECT //* declare opacity property Q_PROPERTY(qreal currentOpacity READ currentOpacity WRITE setCurrentOpacity) Q_PROPERTY(qreal previousOpacity READ previousOpacity WRITE setPreviousOpacity) public: //* constructor TabBarData(QObject *parent, QWidget *target, int duration); //* destructor virtual ~TabBarData() { } //* duration void setDuration(int duration) { currentIndexAnimation().data()->setDuration(duration); previousIndexAnimation().data()->setDuration(duration); } //* update state bool updateState(const QPoint &, bool); //*@name current index handling //@{ //* current opacity virtual qreal currentOpacity() const { return _current._opacity; } //* current opacity virtual void setCurrentOpacity(qreal value) { if (_current._opacity == value) { return; } _current._opacity = value; setDirty(); } //* current index virtual int currentIndex() const { return _current._index; } //* current index virtual void setCurrentIndex(int index) { _current._index = index; } //* current index animation virtual const Animation::Pointer ¤tIndexAnimation() const { return _current._animation; } //@} //*@name previous index handling //@{ //* previous opacity virtual qreal previousOpacity() const { return _previous._opacity; } //* previous opacity virtual void setPreviousOpacity(qreal value) { if (_previous._opacity == value) { return; } _previous._opacity = value; setDirty(); } //* previous index virtual int previousIndex() const { return _previous._index; } //* previous index virtual void setPreviousIndex(int index) { _previous._index = index; } //* previous index Animation virtual const Animation::Pointer &previousIndexAnimation() const { return _previous._animation; } //@} //* return Animation associated to action at given position, if any virtual Animation::Pointer animation(const QPoint &position) const; //* return opacity associated to action at given position, if any virtual qreal opacity(const QPoint &position) const; private: //* container for needed animation data class Data { public: //* default constructor Data() : _opacity(0) , _index(-1) { } Animation::Pointer _animation; qreal _opacity; int _index; }; //* current tab animation data (for hover enter animations) Data _current; //* previous tab animations data (for hover leave animations) Data _previous; }; } // namespace Adwaita #endif // ADWAITA_TABBAR_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitatabbarengine.cpp000066400000000000000000000060651414271704400237430ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitatabbarengine.h" #include namespace Adwaita { //____________________________________________________________ bool TabBarEngine::registerWidget(QWidget *widget) { if (!widget) { return false; } // create new data class if (!_hoverData.contains(widget)) { _hoverData.insert(widget, new TabBarData(this, widget, duration()), enabled()); } if (!_focusData.contains(widget)) { _focusData.insert(widget, new TabBarData(this, widget, duration()), enabled()); } // connect destruction signal connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); return true; } //____________________________________________________________ bool TabBarEngine::updateState(const QObject *object, const QPoint &position, AnimationMode mode, bool value) { DataMap::Value data(TabBarEngine::data(object, mode)); return (data && data.data()->updateState(position, value)); } //____________________________________________________________ bool TabBarEngine::isAnimated(const QObject *object, const QPoint &position, AnimationMode mode) { DataMap::Value data(TabBarEngine::data(object, mode)); return (data && data.data()->animation(position) && data.data()->animation(position).data()->isRunning()); } //____________________________________________________________ DataMap::Value TabBarEngine::data(const QObject *object, AnimationMode mode) { switch (mode) { case AnimationHover: return _hoverData.find(object).data(); case AnimationFocus: return _focusData.find(object).data(); default: return DataMap::Value(); } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitatabbarengine.h000066400000000000000000000066421414271704400234110ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_TABBAR_ENGINE_H #define ADWAITA_TABBAR_ENGINE_H #include "adwaita.h" #include "adwaitabaseengine.h" #include "adwaitadatamap.h" #include "adwaitatabbardata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* stores tabbar hovered action and timeLine class ADWAITAQT_EXPORT TabBarEngine : public BaseEngine { Q_OBJECT public: //* constructor explicit TabBarEngine(QObject *parent) : BaseEngine(parent) { } //* destructor virtual ~TabBarEngine() { } //* register tabbar virtual bool registerWidget(QWidget *); //* true if widget hover state is changed virtual bool updateState(const QObject *, const QPoint &, AnimationMode, bool); //* true if widget is animated virtual bool isAnimated(const QObject *object, const QPoint &point, AnimationMode); //* animation opacity virtual qreal opacity(const QObject *object, const QPoint &point, AnimationMode mode) { return isAnimated(object, point, mode) ? data(object, mode).data()->opacity(point) : AnimationData::OpacityInvalid; } //* enability virtual void setEnabled(bool value) { BaseEngine::setEnabled(value); _hoverData.setEnabled(value); _focusData.setEnabled(value); } //* duration virtual void setDuration(int value) { BaseEngine::setDuration(value); _hoverData.setDuration(value); _focusData.setDuration(value); } public Q_SLOTS: //* remove widget from map virtual bool unregisterWidget(QObject *object) { if (!object) { return false; } bool found = false; if (_hoverData.unregisterWidget(object)) { found = true; } if (_focusData.unregisterWidget(object)) { found = true; } return found; } private: //* returns data associated to widget DataMap::Value data(const QObject *, AnimationMode); //* data map DataMap _hoverData; DataMap _focusData; }; } // namespace Adwaita #endif // ADWAITA_TABBAR_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitatoolboxengine.cpp000066400000000000000000000046521414271704400241760ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitatoolboxengine.h" namespace Adwaita { //____________________________________________________________ bool ToolBoxEngine::registerWidget(QWidget *widget) { if (!widget) { return false; } if (!_data.contains(widget)) { _data.insert(widget, new WidgetStateData(this, widget, duration()), enabled()); } // connect destruction signal connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); return true; } //____________________________________________________________ bool ToolBoxEngine::updateState(const QPaintDevice *object, bool value) { PaintDeviceDataMap::Value data(ToolBoxEngine::data(object)); return (data && data.data()->updateState(value)); } //____________________________________________________________ bool ToolBoxEngine::isAnimated(const QPaintDevice *object) { PaintDeviceDataMap::Value data(ToolBoxEngine::data(object)); return (data && data.data()->animation() && data.data()->animation().data()->isRunning()); } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitatoolboxengine.h000066400000000000000000000062711414271704400236420ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_TOOLBOX_ENGINE_H #define ADWAITA_TOOLBOX_ENGINE_H #include "adwaitabaseengine.h" #include "adwaitadatamap.h" #include "adwaitawidgetstatedata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* QToolBox animation engine class ADWAITAQT_EXPORT ToolBoxEngine : public BaseEngine { Q_OBJECT public: //* constructor explicit ToolBoxEngine(QObject *parent) : BaseEngine(parent) { } //* destructor virtual ~ToolBoxEngine() { } //* enability virtual void setEnabled(bool value) { BaseEngine::setEnabled(value); _data.setEnabled(value); } //* duration virtual void setDuration(int value) { BaseEngine::setDuration(value); _data.setDuration(value); } //* register widget virtual bool registerWidget(QWidget *); //* true if widget hover state is changed virtual bool updateState(const QPaintDevice *, bool); //* true if widget is animated virtual bool isAnimated(const QPaintDevice *); //* animation opacity virtual qreal opacity(const QPaintDevice *object) { return isAnimated(object) ? data(object).data()->opacity() : AnimationData::OpacityInvalid; } public Q_SLOTS: //* remove widget from map virtual bool unregisterWidget(QObject *data) { if (!data) { return false; } // reinterpret_cast is safe here since only the address is used to find // data in the map return _data.unregisterWidget(reinterpret_cast(data)); } protected: //* returns data associated to widget PaintDeviceDataMap::Value data(const QPaintDevice *object) { return _data.find(object).data(); } private: //* map PaintDeviceDataMap _data; }; } // namespace Adwaita #endif // ADWAITA_TOOLBOX_ENGINE_H adwaita-qt-1.4.1/src/lib/animations/adwaitatransitiondata.cpp000066400000000000000000000036011414271704400243370ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitatransitiondata.cpp // data container for generic transitions // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #include "adwaitatransitiondata.h" namespace Adwaita { //_________________________________________________________________ TransitionData::TransitionData(QObject *parent, QWidget *target, int duration) : QObject(parent) , _transition(new TransitionWidget(target, duration)) { _transition.data()->hide(); } //_________________________________________________________________ TransitionData::~TransitionData() { if (_transition) { _transition.data()->deleteLater(); } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitatransitiondata.h000066400000000000000000000102601414271704400240030ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitatransitiondata.h // data container for generic transitions // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #ifndef ADWAITA_TRANSITION_DATA_H #define ADWAITA_TRANSITION_DATA_H #include "adwaitatransitionwidget.h" #include "adwaitaqt_export.h" #include #include #include namespace Adwaita { //* generic data class ADWAITAQT_EXPORT TransitionData : public QObject { Q_OBJECT public: //* constructor TransitionData(QObject *parent, QWidget *target, int); //* destructor virtual ~TransitionData(); //* enability virtual void setEnabled(bool value) { _enabled = value; } //* enability virtual bool enabled() const { return _enabled; } //* duration virtual void setDuration(int duration) { if (_transition) { _transition.data()->setDuration(duration); } } //* max render time void setMaxRenderTime(int value) { _maxRenderTime = value; } //* max renderTime const int &maxRenderTime() const { return _maxRenderTime; } //* start clock void startClock() { if (!_clock.isValid()) { _clock.start(); } else { _clock.restart(); } } //* check if rendering is two slow bool slow() const { return !(!_clock.isValid() || _clock.elapsed() <= maxRenderTime()); } protected Q_SLOTS: //* initialize animation virtual bool initializeAnimation() = 0; //* animate virtual bool animate() = 0; protected: //* returns true if one parent matches given class name inline bool hasParent(const QWidget *, const char *) const; //* transition widget virtual const TransitionWidget::Pointer &transition() const { return _transition; } //* used to avoid recursion when grabbing widgets void setRecursiveCheck(bool value) { _recursiveCheck = value; } //* used to avoid recursion when grabbing widgets bool recursiveCheck() const { return _recursiveCheck; } private: //* enability bool _enabled = true; //* used to avoid recursion when grabbing widgets bool _recursiveCheck = false; //* timer used to detect slow rendering QElapsedTimer _clock; //* max render time /*! used to detect slow rendering */ int _maxRenderTime = 200; //* animation handling TransitionWidget::Pointer _transition; }; //_____________________________________________________________________________________ bool TransitionData::hasParent(const QWidget *widget, const char *className) const { if (!widget) { return false; } for (QWidget *parent = widget->parentWidget(); parent; parent = parent->parentWidget()) { if (parent->inherits(className)) { return true; } } return false; } } // namespace Adwaita #endif // ADWAITA_TRANSITION_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitatransitionwidget.cpp000066400000000000000000000207601414271704400247160ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitatransitionwidget.cpp // stores event filters and maps widgets to transitions for transitions // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #include "adwaitatransitionwidget.h" #include #include #include #include namespace Adwaita { //________________________________________________ bool TransitionWidget::_paintEnabled = true; bool TransitionWidget::paintEnabled() { return _paintEnabled; } int TransitionWidget::_steps = 0; //________________________________________________ TransitionWidget::TransitionWidget(QWidget *parent, int duration): QWidget(parent), _animation(new Animation(duration, this)) { // background flags setAttribute(Qt::WA_NoSystemBackground); setAutoFillBackground(false); // setup animation _animation.data()->setStartValue(0); _animation.data()->setEndValue(1.0); _animation.data()->setTargetObject(this); _animation.data()->setPropertyName("opacity"); // hide when animation is finished connect(_animation.data(), SIGNAL(finished()), SLOT(hide())); } //________________________________________________ QPixmap TransitionWidget::grab(QWidget *widget, QRect rect) { // change rect if (!rect.isValid()) { rect = widget->rect(); } if (!rect.isValid()) { return QPixmap(); } // initialize pixmap QPixmap out(rect.size()); out.fill(Qt::transparent); _paintEnabled = false; if (testFlag(GrabFromWindow)) { rect = rect.translated(widget->mapTo(widget->window(), widget->rect().topLeft())); widget = widget->window(); out = widget->grab(rect); } else { if (!testFlag(Transparent)) { grabBackground(out, widget, rect); } grabWidget(out, widget, rect); } _paintEnabled = true; return out; } //________________________________________________ bool TransitionWidget::event(QEvent *event) { switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::KeyPress: case QEvent::KeyRelease: endAnimation(); hide(); event->ignore(); return false; default: return QWidget::event(event); } } //________________________________________________ void TransitionWidget::paintEvent(QPaintEvent *event) { // fully transparent case if (opacity() >= 1.0 && endPixmap().isNull()) { return; } if (!_paintEnabled) { return; } // get rect QRect rect = event->rect(); if (!rect.isValid()) { rect = this->rect(); } // local pixmap bool paintOnWidget(testFlag(PaintOnWidget) && !testFlag(Transparent)); if (!paintOnWidget) { if (_currentPixmap.isNull() || _currentPixmap.size() != size()) { _currentPixmap = QPixmap(size()); } } // fill _currentPixmap.fill(Qt::transparent); // copy local pixmap to current { QPainter p; // draw end pixmap first, provided that opacity is small enough if (opacity() >= 0.004 && !_endPixmap.isNull()) { // faded endPixmap if parent target is transparent and opacity is if (opacity() <= 0.996 && testFlag(Transparent)) { fade(_endPixmap, _currentPixmap, opacity(), rect); p.begin(&_currentPixmap); p.setClipRect(event->rect()); } else { if (paintOnWidget) { p.begin(this); } else { p.begin(&_currentPixmap); } p.setClipRect(event->rect()); p.drawPixmap(QPoint(), _endPixmap); } } else { if (paintOnWidget) { p.begin(this); } else { p.begin(&_currentPixmap); } p.setClipRect(event->rect()); } // draw fading start pixmap if (opacity() <= 0.996 && !_startPixmap.isNull()) { if (opacity() >= 0.004) { fade(_startPixmap, _localStartPixmap, 1.0 - opacity(), rect); p.drawPixmap(QPoint(), _localStartPixmap); } else { p.drawPixmap(QPoint(), _startPixmap); } } p.end(); } // copy current pixmap on widget if (!paintOnWidget) { QPainter p(this); p.setClipRect(event->rect()); p.drawPixmap(QPoint(0, 0), _currentPixmap); p.end(); } } //________________________________________________ void TransitionWidget::grabBackground(QPixmap &pixmap, QWidget *widget, QRect &rect) const { if (!widget) { return; } QWidgetList widgets; if (widget->autoFillBackground()) { widgets.append(widget); } QWidget *parent(0); // get highest level parent for (parent = widget->parentWidget(); parent; parent = parent->parentWidget()) { if (!(parent->isVisible() && parent->rect().isValid())) { continue; } // store in list widgets.append(parent); // stop at topLevel if (parent->isWindow() || parent->autoFillBackground()) { break; } } if (!parent) { parent = widget; } // painting QPainter p(&pixmap); p.setClipRect(rect); QBrush backgroundBrush = parent->palette().brush(parent->backgroundRole()); if (backgroundBrush.style() == Qt::TexturePattern) { p.drawTiledPixmap(rect, backgroundBrush.texture(), widget->mapTo(parent, rect.topLeft())); } else { p.fillRect(pixmap.rect(), backgroundBrush); } if (parent->isWindow() && parent->testAttribute(Qt::WA_StyledBackground)) { QStyleOption option; option.initFrom(parent); option.rect = rect; option.rect.translate(widget->mapTo(parent, rect.topLeft())); p.translate(-option.rect.topLeft()); parent->style()->drawPrimitive(QStyle::PE_Widget, &option, &p, parent); p.translate(option.rect.topLeft()); } // draw all widgets in parent list // backward QPaintEvent event(rect); for (int i = widgets.size() - 1; i >= 0; i--) { QWidget *w = widgets.at(i); w->render(&p, -widget->mapTo(w, rect.topLeft()), rect); } // end p.end(); } //________________________________________________ void TransitionWidget::grabWidget(QPixmap &pixmap, QWidget *widget, QRect &rect) const { widget->render(&pixmap, pixmap.rect().topLeft(), rect, QWidget::DrawChildren); } //________________________________________________ void TransitionWidget::fade(const QPixmap &source, QPixmap &target, qreal opacity, const QRect &rect) const { if (target.isNull() || target.size() != size()) { target = QPixmap(size()); } // erase target target.fill(Qt::transparent); // check opacity if (opacity * 255 < 1) { return; } QPainter p(&target); p.setClipRect(rect); // draw pixmap p.drawPixmap(QPoint(0, 0), source); // opacity mask (0.996 corresponds to 254/255) if (opacity <= 0.996) { p.setCompositionMode(QPainter::CompositionMode_DestinationIn); QColor color(Qt::black); color.setAlphaF(opacity); p.fillRect(rect, color); } p.end(); return; } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitatransitionwidget.h000066400000000000000000000137201414271704400243610ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////////// // adwaitatransitionwidget.h // stores event filters and maps widgets to transitions for transitions // ------------------- // // Copyright (c) 2009 Hugo Pereira Da Costa // // 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. ////////////////////////////////////////////////////////////////////////////// #ifndef ADWAITA_TRANSITION_WIDGET_H #define ADWAITA_TRANSITION_WIDGET_H #include "adwaita.h" #include "adwaitaanimation.h" #include "adwaitaqt_export.h" #include #include namespace Adwaita { //* temporary widget used to perform smooth transition between one widget state and another class ADWAITAQT_EXPORT TransitionWidget : public QWidget { Q_OBJECT //* declare opacity property Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity) public: //* shortcut to painter typedef WeakPointer Pointer; //* constructor TransitionWidget(QWidget *parent, int duration); //* destructor virtual ~TransitionWidget() = default; //*@name flags //@{ enum Flag { None = 0, GrabFromWindow = 1 << 0, Transparent = 1 << 1, PaintOnWidget = 1 << 2 }; Q_DECLARE_FLAGS(Flags, Flag) void setFlags(Flags value) { _flags = value; } void setFlag(Flag flag, bool value = true) { if (value) { _flags |= flag; } else { _flags &= (~flag); } } bool testFlag(Flag flag) const { return _flags.testFlag(flag); } //@} //* duration void setDuration(int duration) { if (_animation) { _animation.data()->setDuration(duration); } } //* duration int duration() const { return (_animation) ? _animation.data()->duration() : 0; } //* steps static void setSteps(int value) { _steps = value; } //*@name opacity //@{ virtual qreal opacity() const { return _opacity; } virtual void setOpacity(qreal value) { value = digitize(value); if (_opacity == value) { return; } _opacity = value; update(); } //@} //@name pixmaps handling //@{ //* start void resetStartPixmap() { setStartPixmap(QPixmap()); } //* start void setStartPixmap(QPixmap pixmap) { _startPixmap = pixmap; } //* start const QPixmap &startPixmap() const { return _startPixmap; } //* end void resetEndPixmap() { setEndPixmap(QPixmap()); } //* end void setEndPixmap(QPixmap pixmap) { _endPixmap = pixmap; _currentPixmap = pixmap; } //* start const QPixmap &endPixmap() const { return _endPixmap; } //* current const QPixmap ¤tPixmap() const { return _currentPixmap; } //@} //* grap pixmap QPixmap grab(QWidget * = 0, QRect = QRect()); //* true if animated virtual bool isAnimated() const { return _animation.data()->isRunning(); } //* end animation virtual void endAnimation() { if (_animation.data()->isRunning()) { _animation.data()->stop(); } } //* animate transition virtual void animate() { if (_animation.data()->isRunning()) { _animation.data()->stop(); } _animation.data()->start(); } //* true if paint is enabled static bool paintEnabled(); protected: //* generic event filter virtual bool event(QEvent *); //* paint event virtual void paintEvent(QPaintEvent *); //* grab widget background /*! Background is not rendered properly using QWidget::render. Use home-made grabber instead. This is directly inspired from bespin. Copyright (C) 2007 Thomas Luebking */ virtual void grabBackground(QPixmap &, QWidget *, QRect &) const; //* grab widget virtual void grabWidget(QPixmap &, QWidget *, QRect &) const; //* fade pixmap virtual void fade(const QPixmap &source, QPixmap &target, qreal opacity, const QRect &) const; //* apply step virtual qreal digitize(const qreal &value) const { if (_steps > 0) { return std::floor(value * _steps) / _steps; } else { return value; } } private: //* Flags Flags _flags = None; //* paint enabled static bool _paintEnabled; //* internal transition animation Animation::Pointer _animation; //* animation starting pixmap QPixmap _startPixmap; //* animation starting pixmap QPixmap _localStartPixmap; //* animation starting pixmap QPixmap _endPixmap; //* current pixmap QPixmap _currentPixmap; //* current state opacity qreal _opacity = 0; //* steps static int _steps; }; } // namespace Adwaita #endif // ADWAITA_TRANSITION_WIDGET_H adwaita-qt-1.4.1/src/lib/animations/adwaitawidgetstatedata.cpp000066400000000000000000000036311414271704400244740ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitawidgetstatedata.h" namespace Adwaita { //______________________________________________ bool WidgetStateData::updateState(bool value) { if (!_initialized) { _state = value; _initialized = true; return false; } else if (_state == value) { return false; } else { _state = value; animation().data()->setDirection(_state ? Animation::Forward : Animation::Backward); if (!animation().data()->isRunning()) { animation().data()->start(); } return true; } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitawidgetstatedata.h000066400000000000000000000041761414271704400241460ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_WIDGET_STATE_DATA_H #define ADWAITA_WIDGET_STATE_DATA_H #include "adwaitagenericdata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* handle widget state (hover/focus/enable) changes class ADWAITAQT_EXPORT WidgetStateData : public GenericData { Q_OBJECT public: //* constructor WidgetStateData(QObject *parent, QWidget *target, int duration, bool state = false) : GenericData(parent, target, duration) , _initialized(false) , _state(state) { } //* destructor virtual ~WidgetStateData() { } /** returns true if hover has Changed and starts timer accordingly */ virtual bool updateState(bool value); private: bool _initialized; bool _state; }; } // namespace Adwaita #endif // ADWAITA_WIDGET_STATE_DATA_H adwaita-qt-1.4.1/src/lib/animations/adwaitawidgetstateengine.cpp000066400000000000000000000115471414271704400250350ustar00rootroot00000000000000 /************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitawidgetstateengine.h" #include "adwaitaenabledata.h" namespace Adwaita { //____________________________________________________________ bool WidgetStateEngine::registerWidget(QWidget *widget, AnimationModes mode) { if (!widget) { return false; } if (mode & AnimationHover && !_hoverData.contains(widget)) { _hoverData.insert(widget, new WidgetStateData(this, widget, duration()), enabled()); } if (mode & AnimationFocus && !_focusData.contains(widget)) { _focusData.insert(widget, new WidgetStateData(this, widget, duration()), enabled()); } if (mode & AnimationEnable && !_enableData.contains(widget)) { _enableData.insert(widget, new EnableData(this, widget, duration()), enabled()); } if (mode & AnimationPressed && !_pressedData.contains(widget)) { _pressedData.insert(widget, new WidgetStateData(this, widget, duration()), enabled()); } // connect destruction signal connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(unregisterWidget(QObject *)), Qt::UniqueConnection); return true; } //____________________________________________________________ BaseEngine::WidgetList WidgetStateEngine::registeredWidgets(AnimationModes mode) const { WidgetList out; using Value = DataMap::Value; if (mode & AnimationHover) { foreach (const Value &value, _hoverData) { if (value) out.insert(value.data()->target().data()); } } if (mode & AnimationFocus) { foreach (const Value &value, _focusData) { if (value) out.insert(value.data()->target().data()); } } if (mode & AnimationEnable) { foreach (const Value &value, _enableData) { if (value) out.insert(value.data()->target().data()); } } if (mode & AnimationPressed) { foreach (const Value &value, _pressedData) { if (value) out.insert(value.data()->target().data()); } } return out; } //____________________________________________________________ bool WidgetStateEngine::updateState(const QObject *object, AnimationMode mode, bool value) { DataMap::Value data(WidgetStateEngine::data(object, mode)); return (data && data.data()->updateState(value)); } //____________________________________________________________ bool WidgetStateEngine::isAnimated(const QObject *object, AnimationMode mode) { DataMap::Value data(WidgetStateEngine::data(object, mode)); return (data && data.data()->animation() && data.data()->animation().data()->isRunning()); } //____________________________________________________________ DataMap::Value WidgetStateEngine::data(const QObject *object, AnimationMode mode) { switch (mode) { case AnimationHover: return _hoverData.find(object).data(); case AnimationFocus: return _focusData.find(object).data(); case AnimationEnable: return _enableData.find(object).data(); case AnimationPressed: return _pressedData.find(object).data(); default: return DataMap::Value(); } } //____________________________________________________________ DataMap &WidgetStateEngine::dataMap(AnimationMode mode) { switch (mode) { default: case AnimationHover: return _hoverData; case AnimationFocus: return _focusData; case AnimationEnable: return _enableData; case AnimationPressed: return _pressedData; } } } // namespace Adwaita adwaita-qt-1.4.1/src/lib/animations/adwaitawidgetstateengine.h000066400000000000000000000144601414271704400244770ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_WIDGET_STATE_ENGINE_H #define ADWAITA_WIDGET_STATE_ENGINE_H #include "adwaita.h" #include "adwaitabaseengine.h" #include "adwaitadatamap.h" #include "adwaitawidgetstatedata.h" #include "adwaitaqt_export.h" namespace Adwaita { //* used for simple widgets class ADWAITAQT_EXPORT WidgetStateEngine : public BaseEngine { Q_OBJECT public: //* constructor explicit WidgetStateEngine(QObject *parent) : BaseEngine(parent) { } //* destructor virtual ~WidgetStateEngine() { } //* register widget virtual bool registerWidget(QWidget *, AnimationModes); //* returns registered widgets virtual WidgetList registeredWidgets(AnimationModes) const; using BaseEngine::registeredWidgets; //* true if widget hover state is changed virtual bool updateState(const QObject *, AnimationMode, bool); //* true if widget is animated virtual bool isAnimated(const QObject *, AnimationMode); //* animation opacity virtual qreal opacity(const QObject *object, AnimationMode mode) { return isAnimated(object, mode) ? data(object, mode).data()->opacity() : AnimationData::OpacityInvalid; } //* animation mode /** precedence on focus */ virtual AnimationMode frameAnimationMode(const QObject *object) { if (isAnimated(object, AnimationEnable)) { return AnimationEnable; } else if (isAnimated(object, AnimationFocus)) { return AnimationFocus; } else if (isAnimated(object, AnimationHover)) { return AnimationHover; } else { return AnimationNone; } } //* animation opacity /** precedence on focus */ virtual qreal frameOpacity(const QObject *object) { if (isAnimated(object, AnimationEnable)) { return data(object, AnimationEnable).data()->opacity(); } else if (isAnimated(object, AnimationFocus)) { return data(object, AnimationFocus).data()->opacity(); } else if (isAnimated(object, AnimationHover)) { return data(object, AnimationHover).data()->opacity(); } else { return AnimationData::OpacityInvalid; } } //* animation mode /** precedence on mouseOver */ virtual AnimationMode buttonAnimationMode(const QObject *object) { if (isAnimated(object, AnimationEnable)) { return AnimationEnable; } else if (isAnimated(object, AnimationPressed)) { return AnimationPressed; } else if (isAnimated(object, AnimationHover)) { return AnimationHover; } else if (isAnimated(object, AnimationFocus)) { return AnimationFocus; } else { return AnimationNone; } } //* animation opacity /** precedence on mouseOver */ virtual qreal buttonOpacity(const QObject *object) { if (isAnimated(object, AnimationEnable)) { return data(object, AnimationEnable).data()->opacity(); } else if (isAnimated(object, AnimationPressed)) { return data(object, AnimationPressed).data()->opacity(); } else if (isAnimated(object, AnimationHover)) { return data(object, AnimationHover).data()->opacity(); } else if (isAnimated(object, AnimationFocus)) { return data(object, AnimationFocus).data()->opacity(); } else { return AnimationData::OpacityInvalid; } } //* duration virtual void setEnabled(bool value) { BaseEngine::setEnabled(value); _hoverData.setEnabled(value); _focusData.setEnabled(value); _enableData.setEnabled(value); _pressedData.setEnabled(value); } //* duration virtual void setDuration(int value) { BaseEngine::setDuration(value); _hoverData.setDuration(value); _focusData.setDuration(value); _enableData.setDuration(value); _pressedData.setDuration(value / 2); } public Q_SLOTS: //* remove widget from map virtual bool unregisterWidget(QObject *object) { if (!object) { return false; } bool found = false; if (_hoverData.unregisterWidget(object)) { found = true; } if (_focusData.unregisterWidget(object)) { found = true; } if (_enableData.unregisterWidget(object)) { found = true; } if (_pressedData.unregisterWidget(object)) { found = true; } return found; } protected: //* returns data associated to widget DataMap::Value data(const QObject *, AnimationMode); //* returns data map associated to animation mode DataMap &dataMap(AnimationMode); private: //* maps DataMap _hoverData; DataMap _focusData; DataMap _enableData; DataMap _pressedData; }; } // namespace Adwaita #endif // ADWAITA_WIDGET_STATE_ENGINE_H adwaita-qt-1.4.1/src/lib/config-adwaita.h.cmake000066400000000000000000000030301414271704400212130ustar00rootroot00000000000000/* config-adwaita.h. Generated by cmake from config-adwaita.h.cmake */ /************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef config_adwaita_h #define config_adwaita_h /* Define to 1 if XCB libraries are found */ #cmakedefine01 ADWAITA_HAVE_X11 #endif adwaita-qt-1.4.1/src/lib/stylesheet/000077500000000000000000000000001414271704400173035ustar00rootroot00000000000000adwaita-qt-1.4.1/src/lib/stylesheet/Adwaita-dark.scss000066400000000000000000000114031414271704400224700ustar00rootroot00000000000000$variant: 'dark'; @import 'colors'; @import 'drawing'; @define-color base_color #{$base_color}; @define-color text_color #{$text_color}; @define-color bg_color #{$bg_color}; @define-color fg_color #{$fg_color}; @define-color selected_fg_color #{$selected_fg_color}; @define-color selected_bg_color #{$selected_bg_color}; @define-color selected_borders_color #{$selected_borders_color}; @define-color borders_color #{$borders_color}; @define-color alt_borders_color #{$alt_borders_color}; @define-color borders_edge #{$borders_edge}; @define-color link_color #{$link_color}; @define-color link_visited_color #{$link_visited_color}; @define-color top_hilight #{$top_hilight}; @define-color dark_fill #{$dark_fill}; @define-color headerbar_bg_color #{$headerbar_bg_color}; @define-color menu_color #{$menu_color}; @define-color menu_selected_color #{$menu_selected_color}; @define-color scrollbar_bg_color #{$scrollbar_bg_color}; @define-color scrollbar_slider_color #{$scrollbar_slider_color}; @define-color scrollbar_slider_hover_color #{$scrollbar_slider_hover_color}; @define-color scrollbar_slider_active_color #{$scrollbar_slider_active_color}; @define-color warning_color #{$warning_color}; @define-color error_color #{$error_color}; @define-color success_color #{$success_color}; @define-color destructive_color #{$destructive_color}; @define-color osd_fg_color #{$osd_fg_color}; @define-color osd_text_color #{$osd_text_color}; @define-color osd_bg_color #{$osd_bg_color}; @define-color osd_insensitive_bg_color #{$osd_insensitive_bg_color}; @define-color osd_insensitive_fg_color #{$osd_insensitive_fg_color}; @define-color osd_borders_color #{$osd_borders_color}; @define-color sidebar_bg_color #{$sidebar_bg_color}; @define-color tooltip_borders_color #{$tooltip_borders_color}; @define-color shadow_color #{$shadow_color}; @define-color drop_target_color #{$drop_target_color}; //insensitive state derived colors @define-color insensitive_fg_color #{$insensitive_fg_color}; @define-color insensitive_bg_color #{$insensitive_bg_color}; @define-color insensitive_borders_color #{$insensitive_borders_color}; //colors for the backdrop state, derived from the main colors. @define-color backdrop_base_color #{$backdrop_base_color}; @define-color backdrop_text_color #{$backdrop_text_color}; @define-color backdrop_bg_color #{$backdrop_bg_color}; @define-color backdrop_fg_color #{$backdrop_fg_color}; @define-color backdrop_insensitive_color #{$backdrop_insensitive_color}; @define-color backdrop_selected_fg_color #{$backdrop_selected_fg_color}; @define-color backdrop_borders_color #{$backdrop_borders_color}; @define-color backdrop_dark_fill #{$backdrop_dark_fill}; //special cased widget colors @define-color suggested_bg_color #{$suggested_bg_color}; @define-color suggested_border_color #{$suggested_border_color}; @define-color progress_bg_color #{$progress_bg_color}; @define-color progress_border_color #{$progress_border_color}; @define-color checkradio_bg_color #{$checkradio_bg_color}; @define-color checkradio_fg_color #{$checkradio_fg_color}; @define-color checkradio_borders_color #{$checkradio_borders_color}; @define-color switch_bg_color #{$switch_bg_color}; @define-color switch_borders_color #{$switch_borders_color}; @define-color focus_border_color #{$focus_border_color}; @define-color alt_focus_border_color #{$alt_focus_border_color}; @define-color dim_label_opacity #{$dim_label_opacity}; %button, button { @at-root %button_basic, & { @include button(normal); &:hover { @include button(hover); } &:checked { @include button(active); } &:checked:hover { @include button(checked-hover); } &:checked:active { @include button(checked-active); } &:backdrop { @include button(backdrop); } &:backdrop:active { @include button(backdrop-active); } &:backdrop:insensitive { @include button(backdrop-insensitive); } &:backdrop:insensitive:active { @include button(backdrop-insensitive-active); } &:disabled { @include button(insensitive); } &:disabled:active { @include button(insensitive-active); } } } checkradio { & { // for unchecked $_c: if($variant=='light', white, $bg_color); @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $_c); } } } & { // for checked @each $t in (':checked') { &#{$t} { @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $checkradio_bg_color, $checkradio_fg_color, $checked: true); } } } } } } adwaita-qt-1.4.1/src/lib/stylesheet/Adwaita-hc-dark.scss000066400000000000000000000114301414271704400230600ustar00rootroot00000000000000$variant: 'dark'; @import 'colors'; @import 'colors-hc'; @import 'drawing'; @define-color base_color #{$base_color}; @define-color text_color #{$text_color}; @define-color bg_color #{$bg_color}; @define-color fg_color #{$fg_color}; @define-color selected_fg_color #{$selected_fg_color}; @define-color selected_bg_color #{$selected_bg_color}; @define-color selected_borders_color #{$selected_borders_color}; @define-color borders_color #{$borders_color}; @define-color alt_borders_color #{$alt_borders_color}; @define-color borders_edge #{$borders_edge}; @define-color link_color #{$link_color}; @define-color link_visited_color #{$link_visited_color}; @define-color top_hilight #{$top_hilight}; @define-color dark_fill #{$dark_fill}; @define-color headerbar_bg_color #{$headerbar_bg_color}; @define-color menu_color #{$menu_color}; @define-color menu_selected_color #{$menu_selected_color}; @define-color scrollbar_bg_color #{$scrollbar_bg_color}; @define-color scrollbar_slider_color #{$scrollbar_slider_color}; @define-color scrollbar_slider_hover_color #{$scrollbar_slider_hover_color}; @define-color scrollbar_slider_active_color #{$scrollbar_slider_active_color}; @define-color warning_color #{$warning_color}; @define-color error_color #{$error_color}; @define-color success_color #{$success_color}; @define-color destructive_color #{$destructive_color}; @define-color osd_fg_color #{$osd_fg_color}; @define-color osd_text_color #{$osd_text_color}; @define-color osd_bg_color #{$osd_bg_color}; @define-color osd_insensitive_bg_color #{$osd_insensitive_bg_color}; @define-color osd_insensitive_fg_color #{$osd_insensitive_fg_color}; @define-color osd_borders_color #{$osd_borders_color}; @define-color sidebar_bg_color #{$sidebar_bg_color}; @define-color tooltip_borders_color #{$tooltip_borders_color}; @define-color shadow_color #{$shadow_color}; @define-color drop_target_color #{$drop_target_color}; //insensitive state derived colors @define-color insensitive_fg_color #{$insensitive_fg_color}; @define-color insensitive_bg_color #{$insensitive_bg_color}; @define-color insensitive_borders_color #{$insensitive_borders_color}; //colors for the backdrop state, derived from the main colors. @define-color backdrop_base_color #{$backdrop_base_color}; @define-color backdrop_text_color #{$backdrop_text_color}; @define-color backdrop_bg_color #{$backdrop_bg_color}; @define-color backdrop_fg_color #{$backdrop_fg_color}; @define-color backdrop_insensitive_color #{$backdrop_insensitive_color}; @define-color backdrop_selected_fg_color #{$backdrop_selected_fg_color}; @define-color backdrop_borders_color #{$backdrop_borders_color}; @define-color backdrop_dark_fill #{$backdrop_dark_fill}; //special cased widget colors @define-color suggested_bg_color #{$suggested_bg_color}; @define-color suggested_border_color #{$suggested_border_color}; @define-color progress_bg_color #{$progress_bg_color}; @define-color progress_border_color #{$progress_border_color}; @define-color checkradio_bg_color #{$checkradio_bg_color}; @define-color checkradio_fg_color #{$checkradio_fg_color}; @define-color checkradio_borders_color #{$checkradio_borders_color}; @define-color switch_bg_color #{$switch_bg_color}; @define-color switch_borders_color #{$switch_borders_color}; @define-color focus_border_color #{$focus_border_color}; @define-color alt_focus_border_color #{$alt_focus_border_color}; @define-color dim_label_opacity #{$dim_label_opacity}; %button, button { @at-root %button_basic, & { @include button(normal); &:hover { @include button(hover); } &:checked { @include button(active); } &:checked:hover { @include button(checked-hover); } &:checked:active { @include button(checked-active); } &:backdrop { @include button(backdrop); } &:backdrop:active { @include button(backdrop-active); } &:backdrop:insensitive { @include button(backdrop-insensitive); } &:backdrop:insensitive:active { @include button(backdrop-insensitive-active); } &:disabled { @include button(insensitive); } &:disabled:active { @include button(insensitive-active); } } } checkradio { & { // for unchecked $_c: if($variant=='light', white, $bg_color); @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $_c); } } } & { // for checked @each $t in (':checked') { &#{$t} { @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $checkradio_bg_color, $checkradio_fg_color, $checked: true); } } } } } } adwaita-qt-1.4.1/src/lib/stylesheet/Adwaita-hc.scss000066400000000000000000000114311414271704400221420ustar00rootroot00000000000000$variant: 'light'; @import 'colors'; @import 'colors-hc'; @import 'drawing'; @define-color base_color #{$base_color}; @define-color text_color #{$text_color}; @define-color bg_color #{$bg_color}; @define-color fg_color #{$fg_color}; @define-color selected_fg_color #{$selected_fg_color}; @define-color selected_bg_color #{$selected_bg_color}; @define-color selected_borders_color #{$selected_borders_color}; @define-color borders_color #{$borders_color}; @define-color alt_borders_color #{$alt_borders_color}; @define-color borders_edge #{$borders_edge}; @define-color link_color #{$link_color}; @define-color link_visited_color #{$link_visited_color}; @define-color top_hilight #{$top_hilight}; @define-color dark_fill #{$dark_fill}; @define-color headerbar_bg_color #{$headerbar_bg_color}; @define-color menu_color #{$menu_color}; @define-color menu_selected_color #{$menu_selected_color}; @define-color scrollbar_bg_color #{$scrollbar_bg_color}; @define-color scrollbar_slider_color #{$scrollbar_slider_color}; @define-color scrollbar_slider_hover_color #{$scrollbar_slider_hover_color}; @define-color scrollbar_slider_active_color #{$scrollbar_slider_active_color}; @define-color warning_color #{$warning_color}; @define-color error_color #{$error_color}; @define-color success_color #{$success_color}; @define-color destructive_color #{$destructive_color}; @define-color osd_fg_color #{$osd_fg_color}; @define-color osd_text_color #{$osd_text_color}; @define-color osd_bg_color #{$osd_bg_color}; @define-color osd_insensitive_bg_color #{$osd_insensitive_bg_color}; @define-color osd_insensitive_fg_color #{$osd_insensitive_fg_color}; @define-color osd_borders_color #{$osd_borders_color}; @define-color sidebar_bg_color #{$sidebar_bg_color}; @define-color tooltip_borders_color #{$tooltip_borders_color}; @define-color shadow_color #{$shadow_color}; @define-color drop_target_color #{$drop_target_color}; //insensitive state derived colors @define-color insensitive_fg_color #{$insensitive_fg_color}; @define-color insensitive_bg_color #{$insensitive_bg_color}; @define-color insensitive_borders_color #{$insensitive_borders_color}; //colors for the backdrop state, derived from the main colors. @define-color backdrop_base_color #{$backdrop_base_color}; @define-color backdrop_text_color #{$backdrop_text_color}; @define-color backdrop_bg_color #{$backdrop_bg_color}; @define-color backdrop_fg_color #{$backdrop_fg_color}; @define-color backdrop_insensitive_color #{$backdrop_insensitive_color}; @define-color backdrop_selected_fg_color #{$backdrop_selected_fg_color}; @define-color backdrop_borders_color #{$backdrop_borders_color}; @define-color backdrop_dark_fill #{$backdrop_dark_fill}; //special cased widget colors @define-color suggested_bg_color #{$suggested_bg_color}; @define-color suggested_border_color #{$suggested_border_color}; @define-color progress_bg_color #{$progress_bg_color}; @define-color progress_border_color #{$progress_border_color}; @define-color checkradio_bg_color #{$checkradio_bg_color}; @define-color checkradio_fg_color #{$checkradio_fg_color}; @define-color checkradio_borders_color #{$checkradio_borders_color}; @define-color switch_bg_color #{$switch_bg_color}; @define-color switch_borders_color #{$switch_borders_color}; @define-color focus_border_color #{$focus_border_color}; @define-color alt_focus_border_color #{$alt_focus_border_color}; @define-color dim_label_opacity #{$dim_label_opacity}; %button, button { @at-root %button_basic, & { @include button(normal); &:hover { @include button(hover); } &:checked { @include button(active); } &:checked:hover { @include button(checked-hover); } &:checked:active { @include button(checked-active); } &:backdrop { @include button(backdrop); } &:backdrop:active { @include button(backdrop-active); } &:backdrop:insensitive { @include button(backdrop-insensitive); } &:backdrop:insensitive:active { @include button(backdrop-insensitive-active); } &:disabled { @include button(insensitive); } &:disabled:active { @include button(insensitive-active); } } } checkradio { & { // for unchecked $_c: if($variant=='light', white, $bg_color); @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $_c); } } } & { // for checked @each $t in (':checked') { &#{$t} { @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $checkradio_bg_color, $checkradio_fg_color, $checked: true); } } } } } } adwaita-qt-1.4.1/src/lib/stylesheet/Adwaita-light.scss000066400000000000000000000113731414271704400226640ustar00rootroot00000000000000$variant: 'light'; @import 'colors'; @import 'drawing'; @define-color base_color #{$base_color}; @define-color text_color #{$text_color}; @define-color bg_color #{$bg_color}; @define-color fg_color #{$fg_color}; @define-color selected_fg_color #{$selected_fg_color}; @define-color selected_bg_color #{$selected_bg_color}; @define-color selected_borders_color #{$selected_borders_color}; @define-color borders_color #{$borders_color}; @define-color alt_borders_color #{$alt_borders_color}; @define-color borders_edge #{$borders_edge}; @define-color link_color #{$link_color}; @define-color link_visited_color #{$link_visited_color}; @define-color top_hilight #{$top_hilight}; @define-color dark_fill #{$dark_fill}; @define-color headerbar_bg_color #{$headerbar_bg_color}; @define-color menu_color #{$menu_color}; @define-color menu_selected_color #{$menu_selected_color}; @define-color scrollbar_bg_color #{$scrollbar_bg_color}; @define-color scrollbar_slider_color #{$scrollbar_slider_color}; @define-color scrollbar_slider_hover_color #{$scrollbar_slider_hover_color}; @define-color scrollbar_slider_active_color #{$scrollbar_slider_active_color}; @define-color warning_color #{$warning_color}; @define-color error_color #{$error_color}; @define-color success_color #{$success_color}; @define-color destructive_color #{$destructive_color}; @define-color osd_fg_color #{$osd_fg_color}; @define-color osd_text_color #{$osd_text_color}; @define-color osd_bg_color #{$osd_bg_color}; @define-color osd_insensitive_bg_color #{$osd_insensitive_bg_color}; @define-color osd_insensitive_fg_color #{$osd_insensitive_fg_color}; @define-color osd_borders_color #{$osd_borders_color}; @define-color sidebar_bg_color #{$sidebar_bg_color}; @define-color tooltip_borders_color #{$tooltip_borders_color}; @define-color shadow_color #{$shadow_color}; @define-color drop_target_color #{$drop_target_color}; //insensitive state derived colors @define-color insensitive_fg_color #{$insensitive_fg_color}; @define-color insensitive_bg_color #{$insensitive_bg_color}; @define-color insensitive_borders_color #{$insensitive_borders_color}; //colors for the backdrop state, derived from the main colors. @define-color backdrop_base_color #{$backdrop_base_color}; @define-color backdrop_text_color #{$backdrop_text_color}; @define-color backdrop_bg_color #{$backdrop_bg_color}; @define-color backdrop_fg_color #{$backdrop_fg_color}; @define-color backdrop_insensitive_color #{$backdrop_insensitive_color}; @define-color backdrop_selected_fg_color #{$backdrop_selected_fg_color}; @define-color backdrop_borders_color #{$backdrop_borders_color}; @define-color backdrop_dark_fill #{$backdrop_dark_fill}; //special cased widget colors @define-color suggested_bg_color #{$suggested_bg_color}; @define-color suggested_border_color #{$suggested_border_color}; @define-color progress_bg_color #{$progress_bg_color}; @define-color progress_border_color #{$progress_border_color}; @define-color checkradio_bg_color #{$checkradio_bg_color}; @define-color checkradio_fg_color #{$checkradio_fg_color}; @define-color checkradio_borders_color #{$checkradio_borders_color}; @define-color switch_bg_color #{$switch_bg_color}; @define-color switch_borders_color #{$switch_borders_color}; @define-color focus_border_color #{$focus_border_color}; @define-color alt_focus_border_color #{$alt_focus_border_color}; @define-color dim_label_opacity #{$dim_label_opacity}; button { @at-root %button_basic, & { @include button(normal); &:hover { @include button(hover); } &:checked { @include button(active); } &:checked:hover { @include button(checked-hover); } &:checked:active { @include button(checked-active); } &:backdrop { @include button(backdrop); } &:backdrop:active { @include button(backdrop-active); } &:backdrop:insensitive { @include button(backdrop-insensitive); } &:backdrop:insensitive:active { @include button(backdrop-insensitive-active); } &:disabled { @include button(insensitive); } &:disabled:active { @include button(insensitive-active); } } } checkradio { & { // for unchecked $_c: if($variant=='light', white, $bg_color); @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $_c); } } } & { // for checked @each $t in (':checked') { &#{$t} { @each $state, $t in ("", "normal"), (":hover", "hover"), (":active", "active"), (":disabled", "insensitive") { &#{$state} { @include check($t, $checkradio_bg_color, $checkradio_fg_color, $checked: true); } } } } } } adwaita-qt-1.4.1/src/lib/stylesheet/_colors-hc.scss000066400000000000000000000023531414271704400222330ustar00rootroot00000000000000// High Contrast color overrides // When color definition differs for dark and light variant // it gets @if ed depending on $variant $fg_color: if($variant == 'light', darken($fg_color, 3%), lighten($fg_color, 2%)); $bg_color: if($variant == 'light', lighten($bg_color, 3%), darken($bg_color, 2%)); $selected_bg_color: darken($selected_bg_color,10%); $selected_borders_color: darken($selected_borders_color, 10%); $borders_color: if($variant == 'light', darken($borders_color, 30%), lighten($borders_color, 30%)); $alt_borders_color: if($variant == 'light', darken($alt_borders_color, 33%), lighten($alt_borders_color, 28%)); $menu_color: $base_color; $menu_selected_color: darken($bg_color,10%); //insensitive state derived colors $insensitive_fg_color: mix($fg_color, $bg_color, 50%); $insensitive_bg_color: mix($bg_color, $base_color, 60%); $insensitive_borders_color: mix($borders_color, $bg_color, 80%); //focus rings $focus_border_color: if($variant == 'light', transparentize($selected_bg_color, 0.2), transparentize(white, 0.4)); $alt_focus_border_color: if($variant == 'light', white, transparentize(white,0.4)); $dim_label_opacity: 0.9; $switch_borders_color: if($variant == 'light',darken($switch_bg_color,15%),lighten($switch_bg_color,15%)); adwaita-qt-1.4.1/src/lib/stylesheet/_colors.scss000066400000000000000000000103061414271704400216400ustar00rootroot00000000000000// When color definition differs for dark and light variant // it gets @if ed depending on $variant $base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 100%), 2%)); $text_color: if($variant == 'light', black, white); $bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%)); $fg_color: if($variant == 'light', #2e3436, #eeeeec); $selected_fg_color: #ffffff; $selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%)); $selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%)); $borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%)); $alt_borders_color: if($variant == 'light', darken($bg_color, 24%), darken($bg_color, 18%)); $borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93)); $link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%)); $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%)); $top_hilight: $borders_edge; $dark_fill: mix($borders_color, $bg_color, 50%); $headerbar_bg_color: if($variant == 'light', lighten($bg_color, 5%), darken($bg_color, 3%)); $menu_color: $base_color; $menu_selected_color: if($variant == 'light', darken($bg_color, 6%), darken($bg_color, 8%)); $scrollbar_bg_color: if($variant == 'light', mix($bg_color, $fg_color, 80%), mix($base_color, $bg_color, 50%)); $scrollbar_slider_color: mix($fg_color, $bg_color, 60%); $scrollbar_slider_hover_color: mix($fg_color, $bg_color, 80%); $scrollbar_slider_active_color: if($variant=='light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 10%)); $warning_color: #f57900; $error_color: #cc0000; $success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%)); $destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%)); $osd_fg_color: #eeeeec; $osd_text_color: white; $osd_bg_color: if($variant == 'light', transparentize(darken(desaturate(#3d3846, 100%), 4%),0.3), transparentize(darken(desaturate(#3d3846, 100%), 10%),0.3)); $osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5); $osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%); $osd_borders_color: transparentize(black, 0.3); $sidebar_bg_color: mix($bg_color, $base_color, 50%); $tooltip_borders_color: transparentize(white, 0.9); $shadow_color: transparentize(black, 0.9); $drop_target_color: if($variant == 'light', #2ec27e, #26a269); //insensitive state derived colors $insensitive_fg_color: mix($fg_color, $bg_color, 50%); $insensitive_bg_color: mix($bg_color, $base_color, 60%); $insensitive_borders_color: mix($borders_color, $bg_color, 80%); //colors for the backdrop state, derived from the main colors. $backdrop_base_color: if($variant == 'light', darken($base_color, 1%), lighten($base_color, 1%)); $backdrop_text_color: mix($text_color, $backdrop_base_color, 80%); $backdrop_bg_color: $bg_color; $backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 50%); $backdrop_insensitive_color: if($variant == 'light', darken($backdrop_bg_color, 15%), lighten($backdrop_bg_color, 15%)); $backdrop_selected_fg_color: if($variant == 'light', $backdrop_base_color, $backdrop_text_color); $backdrop_borders_color: mix($borders_color, $bg_color, 80%); $backdrop_dark_fill: mix($backdrop_borders_color, $backdrop_bg_color, 35%); //special cased widget colors $suggested_bg_color: $selected_bg_color; $suggested_border_color: $selected_borders_color; $progress_bg_color: $selected_bg_color; $progress_border_color: $selected_borders_color; $checkradio_bg_color: $selected_bg_color; $checkradio_fg_color: $selected_fg_color; $checkradio_borders_color: if($variant == 'light',darken($selected_bg_color,10%),darken($selected_bg_color,20%)); $switch_bg_color: $selected_bg_color; $switch_borders_color: if($variant == 'light',darken($switch_bg_color,15%),darken($switch_bg_color,30%)); $focus_border_color: if($variant == 'light', transparentize($selected_bg_color, 0.5), transparentize($selected_bg_color, 0.3)); $alt_focus_border_color: if($variant == 'light', transparentize(white, 0.2), transparentize(white,0.7)); $dim_label_opacity: 0.55; adwaita-qt-1.4.1/src/lib/stylesheet/_drawing.scss000066400000000000000000000343411414271704400217770ustar00rootroot00000000000000// Drawing mixins // generic drawing of more complex things // // Helper mixin for drawing visible focus rings // // If $target is specified, the focus ring is applied to the specified child element. // If $outer is true, the focus ring extends outward. Otherwise, it extends inward. // If $within is true, use focus-within instead of focus:focus-visible // @mixin focus-ring($target: null, $width: 2px, $offset: -$width, $outer: false, $focus-state: 'focus:focus-visible', $fc: $focus_border_color) { transition-property: outline, outline-width, outline-offset, outline-color; transition-duration: 300ms; animation-timing-function: ease-in-out; & #{$target} { outline: 0 solid transparent; outline-offset: if($outer, $offset + 4px, $offset + $width + 4px); } &:#{$focus-state} #{$target} { outline-color: $fc; outline-width: $width; outline-offset: $offset; } } @mixin _shadows($list...) { // // Helper mixin to stack up to box-shadows; // $shadows: null; @each $shadow in $list { @if $shadow!=none { $shadows: $shadows, $shadow; } } box-shadow: $shadows; } // entries @mixin entry($t, $fc:$focus_border_color) { // // Entries drawing function // // $t: entry type // $fc: focus color // // possible $t values: // normal, focus, insensitive, backdrop, backdrop-insensitive, osd, osd-focus, osd-backdrop, block_cursor; // @if $t==normal { color: $text_color; border-color: $borders_color; background-color: $base_color; // for the transition to work the number of shadows in different states needs to match, hence the transparent shadow here. } @if $t==insensitive { color: $insensitive_fg_color; border-color: $borders_color; background-color: $insensitive_bg_color; } @if $t==backdrop { color: $backdrop_text_color; border-color: $backdrop_borders_color; background-color: $backdrop_base_color; } @if $t==backdrop-insensitive { color: $backdrop_insensitive_color; border-color: $backdrop_borders_color; background-color: $insensitive_bg_color; } @if $t==osd { color: $osd_text_color; border-color: $osd_borders_color; background-color: transparentize(opacify($osd_borders_color, 1), 0.5); background-clip: padding-box; box-shadow: none; -gtk-icon-shadow: 0 1px black; } @if $t==osd-focus { color: $osd_text_color; border-color: $selected_bg_color; background-color: transparentize(opacify($osd_borders_color, 1), 0.5); background-clip: padding-box; } @if $t==osd-insensitive { color: $osd_insensitive_fg_color; border-color: $osd_borders_color; background-color: $osd_insensitive_bg_color; background-clip: padding-box; } @if $t==osd-backdrop { color: $osd_text_color; border-color: $osd_borders_color; background-color: transparentize(opacify($osd_borders_color, 1), 0.5); background-clip: padding-box; } @if $t==block_cursor { color: $base_color; background-color: $text_color; } } // buttons @function _border_color($c, $darker: false) { @if $darker == true { @return darken($c, 20%); } @else { @return darken($c, 15%); } } $_default_button_c: lighten($bg_color,2%); @mixin button($t, $c:$_default_button_c, $tc:$fg_color) { // // Button drawing function // // $t: button type, // $c: base button color for colored* types // $tc: optional text color for colored* types // // possible $t values: // normal, hover, active, checked-hover, checked-active, insensitive, insensitive-active, // backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active, // osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated // $_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03); @if $t==normal { // // normal button // color: $tc; outline-color: if($c != $_default_button_c, $alt_focus_border_color, $focus_border_color); border-color: if($c!=$_default_button_c, _border_color($c, true), $borders_color); //tint if not default button color background-image: if($variant == 'light', linear-gradient(to top, darken($c, 2%) 2px, $c), linear-gradient(to top, darken($c,1%) 2px, $c)); @include _shadows($_button_shadow); } @else if $t==hover { // // hovered button // color: $tc; border-color: if($c != $_default_button_c, _border_color($c), $borders_color); @if $variant == 'light' { background-image: linear-gradient(to top, darken($c,16%), darken($c,8%) 1px); @include _shadows($_button_shadow); } @else { background-image: linear-gradient(to top, darken($c,4%) 20%, darken($c, 3%) 90%); @include _shadows($_button_shadow); } } @else if $t==active { // // pushed button // color: $tc; border-color: if($c != $_default_button_c, _border_color($c), $borders_color); background-image: if($variant == 'light', image(darken($c, 14%)), image(darken($c, 9%))); box-shadow: none; } @else if $t==checked-hover { // // pushed togglebutton hover // color: $tc; border-color: if($c != $_default_button_c, _border_color($c), $borders_color); background-image: if($variant == 'light', image(darken($c, 18%)), image(darken($c, 12%))); box-shadow: none; } @else if $t==checked-active { // // pushed togglebutton pushed further :) // color: $tc; border-color: if($c != $_default_button_c, _border_color($c), $borders_color); background-image: if($variant == 'light', image(darken($c, 22%)), image(darken($c, 14%))); box-shadow: none; } @else if $t==insensitive { // // insensitive button // $_bg: if($c != $_default_button_c, mix($c, $base_color, 85%), $insensitive_bg_color); color: if($tc != $fg_color, mix($tc, $_bg, 50%), $insensitive_fg_color); border-color: if($c != $_default_button_c, _border_color($c), $insensitive_borders_color); background-image: image($_bg); } @else if $t==insensitive-active { // // insensitive pushed button // $_bg: if($variant == 'light', darken(mix($c, $base_color, 85%), 8%), darken(mix($c, $base_color, 85%), 6%)); $_bc: if($c != $_default_button_c, _border_color($c), $insensitive_borders_color); color: if($c != $_default_button_c, mix($tc, $_bg, 60%), $insensitive_fg_color); border-color: $_bc; background-image: image($_bg); box-shadow: none; } @else if $t==backdrop { // // backdrop button // $_bg: if($c != $_default_button_c, $c, $backdrop_bg_color); $_bc: if($variant == 'light', $c, _border_color($c)); color: if($tc != $fg_color, mix($tc, $_bg, 80%), $backdrop_fg_color); border-color: if($c != $_default_button_c, $_bc, $backdrop_borders_color); background-image: image($_bg); box-shadow: none; } @else if $t==backdrop-active { // // backdrop pushed button // $_bg: if($variant == 'light', darken(mix($c, $base_color, 85%), 8%), darken(mix($c, $base_color, 85%), 4%)); $_bc: if($variant == 'light', $_bg ,_border_color($c)); color: if($tc != $fg_color, mix($tc, $_bg, 80%), $backdrop_fg_color); border-color: if($c != $_default_button_c, $_bc, $backdrop_borders_color); background-image: image($_bg); box-shadow: none; } @else if $t==backdrop-insensitive { // // backdrop insensitive button // $_bg: if($c != $_default_button_c, mix($c, $base_color, 85%), $insensitive_bg_color); $_bc: if($variant == 'light', $_bg,_border_color($c)); color: if($c != $_default_button_c, mix($tc, $_bg, 35%), $backdrop_insensitive_color); border-color: if($c != $_default_button_c, $_bc, $backdrop_borders_color); background-image: image($_bg); box-shadow: none; } @else if $t==backdrop-insensitive-active { // // backdrop insensitive pushed button // $_bg: if($variant == 'light', darken(mix($c, $base_color, 85%), 8%), darken(mix($c, $base_color, 85%), 4%)); $_bc: if($variant == 'light', $_bg, _border_color($c)); color: if($c != $_default_button_c, mix($tc, $_bg, 35%), $backdrop_insensitive_color); border-color: if($c != $_default_button_c, $_bc, $backdrop_borders_color); background-image: image($_bg); box-shadow: none; } @else if $t==osd { // // normal osd button // $_bg: if($c != $_default_button_c, transparentize($c, 0.5), $osd_bg_color); color: $osd_fg_color; outline-color: if($c != $_default_button_c, $alt_focus_border_color, $focus_border_color); border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; } @else if $t==osd-hover { // // active osd button // $_bg: if($c != $_default_button_c, transparentize($c, 0.3), darken($osd_bg_color, 10%)); color: white; border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; } @else if $t==osd-active { // // active osd button // $_bg: if($c != $_default_button_c, $c, darken($osd_bg_color, 20%)); color: white; border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; box-shadow: none; } @else if $t==osd-insensitive { // // insensitive osd button // color: $osd_insensitive_fg_color; border-color: $osd_borders_color; background-color: transparent; background-image: image($osd_insensitive_bg_color); background-clip: padding-box; } @else if $t==osd-backdrop { // // backdrop osd button // $_bg: if($c != $_default_button_c, transparentize($c, 0.5), $osd_bg_color); color: $osd_fg_color; border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; } @else if $t==undecorated { // // reset // border-color: transparent; background-color: transparent; background-image: none; box-shadow: none; } @else if $t==undecorated-hover { border-color: transparent; background-image: none; box-shadow: none; @if $variant == 'light' { background-color: darken($c,14%); } @else { background-color: darken($c,1%); } } @else if $t==undecorated-active { border-color: transparent; background-image: none; box-shadow: none; @if $variant == 'light' { background-color: darken($c,20%); } @else { background-color: darken($c,5%); } } } @mixin headerbar_fill($c:$headerbar_bg_color, $ov: none) { // // headerbar fill // // $c: base color // $ov: a background layer for background shorthand (hence no commas!) // $gradient: linear-gradient(to top, darken($c, 2%), lighten($c, 1%)); @if $variant == 'dark' { $gradient: linear-gradient(to top, lighten($c, 4%), lighten($c, 6%)); } @if $ov != none { background: $c $ov, $gradient; } @else { background: $c $gradient; } } @mixin overshoot($p, $t:normal, $c:$fg_color) { // // overshoot // // $p: position // $t: type // $c: base color // // possible $p values: // top, bottom, right, left // // possible $t values: // normal, backdrop // $_small_gradient_length: 3%; $_big_gradient_length: 50%; $_small_gradient_size: 100% $_small_gradient_length; $_big_gradient_size: 100% $_big_gradient_length; @if $p==right or $p==left { $_small_gradient_size: $_small_gradient_length 100%; $_big_gradient_size: $_big_gradient_length 100%; } $_small_gradient_color: $c; $_big_gradient_color: transparentize($c, 0.93); @if $c==$fg_color { $_small_gradient_color: darken($borders_color, 10%); $_big_gradient_color: transparentize($fg_color, 0.93); @if $t==backdrop { $_small_gradient_color: $backdrop_borders_color; } } $_small_gradient: radial-gradient(farthest-side at $p, $_small_gradient_color 85%, transparentize($_small_gradient_color, 1)); $_big_gradient: radial-gradient(farthest-side at $p, $_big_gradient_color, transparentize($_big_gradient_color, 1)); @if $t==normal { background-image: $_small_gradient, $_big_gradient; background-size: $_small_gradient_size, $_big_gradient_size; } @else if $t==backdrop { background-image: $_small_gradient; background-size: $_small_gradient_size; } background-repeat: no-repeat; background-position: $p; background-color: transparent; // reset some properties to be sure to not inherit them somehow border: none; // box-shadow: none; // } @mixin check($t, $c:$checkradio_bg_color, $tc:$checkradio_fg_color, $checked: false) { // Check/Radio drawing function // // $t: check/radio type, // $c: base button color for colored* types // $tc: optional text color for colored* types // $checked: bool to chose between checked/unchecked // // possible $t values: // normal, hover, active, insensitive, backdrop, backdrop-insensitive, menu $_border_color: if($c==$checkradio_bg_color, $checkradio_borders_color, $alt_borders_color); $_dim_border_color: transparentize($_border_color, if($variant == 'light', 0.3, 0.7)); @if $t==normal { background-clip: if($checked, border-box, padding-box); background-image: linear-gradient(to bottom, lighten($c, 5%) 20%, $c 90%); border-color: $_border_color; box-shadow: 0 1px transparentize(black, 0.95); color: $tc; } @if $t==hover { background-image: if($c == white, image(darken($c, 5%)), linear-gradient(to bottom, lighten($c, 9%) 10%, lighten($c, 4%) 90%)); } @if $t==active { box-shadow: inset 0 1px if($variant == 'light', rgba(0, 0, 0, 0.2), black); background-image: if($c == white, image(darken($c, 15%)), image(darken($c, 5%))); } @if $t==insensitive { box-shadow: none; color: transparentize($tc, 0.3); } @if $t==backdrop { background-image: image($c); box-shadow: none; color: $tc; } @if $t==backdrop-insensitive { box-shadow: none; color: transparentize($tc, 0.3); } @if $t==menu { transform: scale(0.8); border-width: 1.2px; border-color: transparent; box-shadow: none; background-image: image(transparent); color: $tc; } @if $t==menu-active { transform: scale(0.8); border-width: 1.2px; color: $tc; box-shadow: none; background-image: image(transparent); } } adwaita-qt-1.4.1/src/lib/stylesheet/processed/000077500000000000000000000000001414271704400212725ustar00rootroot00000000000000adwaita-qt-1.4.1/src/lib/stylesheet/processed/Adwaita-dark.css000066400000000000000000000114201414271704400242730ustar00rootroot00000000000000@define-color base_color #2d2d2d; @define-color text_color white; @define-color bg_color #353535; @define-color fg_color #eeeeec; @define-color selected_fg_color #ffffff; @define-color selected_bg_color #15539e; @define-color selected_borders_color #030c17; @define-color borders_color #1b1b1b; @define-color alt_borders_color #070707; @define-color borders_edge rgba(238, 238, 236, 0.07); @define-color link_color #3584e4; @define-color link_visited_color #1b6acb; @define-color top_hilight rgba(238, 238, 236, 0.07); @define-color dark_fill #282828; @define-color headerbar_bg_color #2d2d2d; @define-color menu_color #2d2d2d; @define-color menu_selected_color #202020; @define-color scrollbar_bg_color #313131; @define-color scrollbar_slider_color #a4a4a3; @define-color scrollbar_slider_hover_color #c9c9c7; @define-color scrollbar_slider_active_color #1b6acb; @define-color warning_color #f57900; @define-color error_color #cc0000; @define-color success_color #26ab62; @define-color destructive_color #b2161d; @define-color osd_fg_color #eeeeec; @define-color osd_text_color white; @define-color osd_bg_color rgba(38, 38, 38, 0.7); @define-color osd_insensitive_bg_color rgba(58, 58, 57, 0.5); @define-color osd_insensitive_fg_color #8a8a89; @define-color osd_borders_color rgba(0, 0, 0, 0.7); @define-color sidebar_bg_color #313131; @define-color tooltip_borders_color rgba(255, 255, 255, 0.1); @define-color shadow_color rgba(0, 0, 0, 0.1); @define-color drop_target_color #26a269; @define-color insensitive_fg_color #919190; @define-color insensitive_bg_color #323232; @define-color insensitive_borders_color #202020; @define-color backdrop_base_color #303030; @define-color backdrop_text_color #d6d6d6; @define-color backdrop_bg_color #353535; @define-color backdrop_fg_color #919190; @define-color backdrop_insensitive_color #5b5b5b; @define-color backdrop_selected_fg_color #d6d6d6; @define-color backdrop_borders_color #202020; @define-color backdrop_dark_fill #2e2e2e; @define-color suggested_bg_color #15539e; @define-color suggested_border_color #030c17; @define-color progress_bg_color #15539e; @define-color progress_border_color #030c17; @define-color checkradio_bg_color #15539e; @define-color checkradio_fg_color #ffffff; @define-color checkradio_borders_color #092444; @define-color switch_bg_color #15539e; @define-color switch_borders_color #030c17; @define-color focus_border_color rgba(21, 83, 158, 0.7); @define-color alt_focus_border_color rgba(255, 255, 255, 0.3); @define-color dim_label_opacity 0.55; button { color: #eeeeec; outline-color: rgba(21, 83, 158, 0.7); border-color: #1b1b1b; background-image: linear-gradient(to top, #373737 2px, #3a3a3a); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:hover { color: #eeeeec; border-color: #1b1b1b; background-image: linear-gradient(to top, #303030 20%, #323232 90%); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:checked { color: #eeeeec; border-color: #1b1b1b; background-image: image(#232323); box-shadow: none; } button:checked:hover { color: #eeeeec; border-color: #1b1b1b; background-image: image(#1b1b1b); box-shadow: none; } button:checked:active { color: #eeeeec; border-color: #1b1b1b; background-image: image(#161616); box-shadow: none; } button:backdrop { color: #919190; border-color: #202020; background-image: image(#353535); box-shadow: none; } button:backdrop:active { color: #919190; border-color: #202020; background-image: image(#2e2e2e); box-shadow: none; } button:backdrop:insensitive { color: #5b5b5b; border-color: #202020; background-image: image(#323232); box-shadow: none; } button:backdrop:insensitive:active { color: #5b5b5b; border-color: #202020; background-image: image(#2e2e2e); box-shadow: none; } button:disabled { color: #919190; border-color: #202020; background-image: image(#323232); } button:disabled:active { color: #919190; border-color: #202020; background-image: image(#292929); box-shadow: none; } checkradio { background-clip: padding-box; background-image: linear-gradient(to bottom, #424242 20%, #353535 90%); border-color: #070707; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:hover { background-image: linear-gradient(to bottom, #4c4c4c 10%, #3f3f3f 90%); } checkradio:active { box-shadow: inset 0 1px black; background-image: image(#282828); } checkradio:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } checkradio:checked { background-clip: border-box; background-image: linear-gradient(to bottom, #185fb4 20%, #15539e 90%); border-color: #092444; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:checked:hover { background-image: linear-gradient(to bottom, #1b68c6 10%, #185cb0 90%); } checkradio:checked:active { box-shadow: inset 0 1px black; background-image: image(#124787); } checkradio:checked:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } adwaita-qt-1.4.1/src/lib/stylesheet/processed/Adwaita-hc-dark.css000066400000000000000000000114211414271704400246640ustar00rootroot00000000000000@define-color base_color #2d2d2d; @define-color text_color white; @define-color bg_color #303030; @define-color fg_color #f3f3f1; @define-color selected_fg_color #ffffff; @define-color selected_bg_color #0f3b71; @define-color selected_borders_color black; @define-color borders_color #686868; @define-color alt_borders_color #4e4e4e; @define-color borders_edge rgba(238, 238, 236, 0.07); @define-color link_color #3584e4; @define-color link_visited_color #1b6acb; @define-color top_hilight rgba(238, 238, 236, 0.07); @define-color dark_fill #282828; @define-color headerbar_bg_color #2d2d2d; @define-color menu_color #2d2d2d; @define-color menu_selected_color #161616; @define-color scrollbar_bg_color #313131; @define-color scrollbar_slider_color #a4a4a3; @define-color scrollbar_slider_hover_color #c9c9c7; @define-color scrollbar_slider_active_color #1b6acb; @define-color warning_color #f57900; @define-color error_color #cc0000; @define-color success_color #26ab62; @define-color destructive_color #b2161d; @define-color osd_fg_color #eeeeec; @define-color osd_text_color white; @define-color osd_bg_color rgba(38, 38, 38, 0.7); @define-color osd_insensitive_bg_color rgba(58, 58, 57, 0.5); @define-color osd_insensitive_fg_color #8a8a89; @define-color osd_borders_color rgba(0, 0, 0, 0.7); @define-color sidebar_bg_color #313131; @define-color tooltip_borders_color rgba(255, 255, 255, 0.1); @define-color shadow_color rgba(0, 0, 0, 0.1); @define-color drop_target_color #26a269; @define-color insensitive_fg_color #919191; @define-color insensitive_bg_color #2f2f2f; @define-color insensitive_borders_color #5d5d5d; @define-color backdrop_base_color #303030; @define-color backdrop_text_color #d6d6d6; @define-color backdrop_bg_color #353535; @define-color backdrop_fg_color #919190; @define-color backdrop_insensitive_color #5b5b5b; @define-color backdrop_selected_fg_color #d6d6d6; @define-color backdrop_borders_color #202020; @define-color backdrop_dark_fill #2e2e2e; @define-color suggested_bg_color #15539e; @define-color suggested_border_color #030c17; @define-color progress_bg_color #15539e; @define-color progress_border_color #030c17; @define-color checkradio_bg_color #15539e; @define-color checkradio_fg_color #ffffff; @define-color checkradio_borders_color #092444; @define-color switch_bg_color #15539e; @define-color switch_borders_color #1f76e1; @define-color focus_border_color rgba(255, 255, 255, 0.6); @define-color alt_focus_border_color rgba(255, 255, 255, 0.6); @define-color dim_label_opacity 0.9; button { color: #f3f3f1; outline-color: rgba(255, 255, 255, 0.6); border-color: #686868; background-image: linear-gradient(to top, #323232 2px, #353535); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:hover { color: #f3f3f1; border-color: #686868; background-image: linear-gradient(to top, #2b2b2b 20%, #2d2d2d 90%); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:checked { color: #f3f3f1; border-color: #686868; background-image: image(#1e1e1e); box-shadow: none; } button:checked:hover { color: #f3f3f1; border-color: #686868; background-image: image(#161616); box-shadow: none; } button:checked:active { color: #f3f3f1; border-color: #686868; background-image: image(#111111); box-shadow: none; } button:backdrop { color: #919190; border-color: #202020; background-image: image(#353535); box-shadow: none; } button:backdrop:active { color: #919190; border-color: #202020; background-image: image(#2a2a2a); box-shadow: none; } button:backdrop:insensitive { color: #5b5b5b; border-color: #202020; background-image: image(#2f2f2f); box-shadow: none; } button:backdrop:insensitive:active { color: #5b5b5b; border-color: #202020; background-image: image(#2a2a2a); box-shadow: none; } button:disabled { color: #919191; border-color: #5d5d5d; background-image: image(#2f2f2f); } button:disabled:active { color: #919191; border-color: #5d5d5d; background-image: image(#252525); box-shadow: none; } checkradio { background-clip: padding-box; background-image: linear-gradient(to bottom, #3c3c3c 20%, #303030 90%); border-color: #4e4e4e; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:hover { background-image: linear-gradient(to bottom, #474747 10%, #3a3a3a 90%); } checkradio:active { box-shadow: inset 0 1px black; background-image: image(#232323); } checkradio:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } checkradio:checked { background-clip: border-box; background-image: linear-gradient(to bottom, #185fb4 20%, #15539e 90%); border-color: #092444; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:checked:hover { background-image: linear-gradient(to bottom, #1b68c6 10%, #185cb0 90%); } checkradio:checked:active { box-shadow: inset 0 1px black; background-image: image(#124787); } checkradio:checked:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } adwaita-qt-1.4.1/src/lib/stylesheet/processed/Adwaita-hc.css000066400000000000000000000113441414271704400237510ustar00rootroot00000000000000@define-color base_color #ffffff; @define-color text_color black; @define-color bg_color #fdfdfc; @define-color fg_color #272c2e; @define-color selected_fg_color #ffffff; @define-color selected_bg_color #1b6acb; @define-color selected_borders_color #124787; @define-color borders_color #877b6e; @define-color alt_borders_color #6e645a; @define-color borders_edge rgba(255, 255, 255, 0.8); @define-color link_color #1b6acb; @define-color link_visited_color #15539e; @define-color top_hilight rgba(255, 255, 255, 0.8); @define-color dark_fill #e1dedb; @define-color headerbar_bg_color white; @define-color menu_color #ffffff; @define-color menu_selected_color #e6e3e0; @define-color scrollbar_bg_color #cecece; @define-color scrollbar_slider_color #7e8182; @define-color scrollbar_slider_hover_color #565b5c; @define-color scrollbar_slider_active_color #1b6acb; @define-color warning_color #f57900; @define-color error_color #cc0000; @define-color success_color #33d17a; @define-color destructive_color #e01b24; @define-color osd_fg_color #eeeeec; @define-color osd_text_color white; @define-color osd_bg_color rgba(53, 53, 53, 0.7); @define-color osd_insensitive_bg_color rgba(71, 71, 71, 0.5); @define-color osd_insensitive_fg_color #919190; @define-color osd_borders_color rgba(0, 0, 0, 0.7); @define-color sidebar_bg_color #fbfafa; @define-color tooltip_borders_color rgba(255, 255, 255, 0.1); @define-color shadow_color rgba(0, 0, 0, 0.1); @define-color drop_target_color #2ec27e; @define-color insensitive_fg_color #929495; @define-color insensitive_bg_color #fefefd; @define-color insensitive_borders_color #9e958b; @define-color backdrop_base_color #fcfcfc; @define-color backdrop_text_color #323232; @define-color backdrop_bg_color #f6f5f4; @define-color backdrop_fg_color #929595; @define-color backdrop_insensitive_color #d4cfca; @define-color backdrop_selected_fg_color #fcfcfc; @define-color backdrop_borders_color #d5d0cc; @define-color backdrop_dark_fill #eae8e6; @define-color suggested_bg_color #3584e4; @define-color suggested_border_color #185fb4; @define-color progress_bg_color #3584e4; @define-color progress_border_color #185fb4; @define-color checkradio_bg_color #3584e4; @define-color checkradio_fg_color #ffffff; @define-color checkradio_borders_color #1b6acb; @define-color switch_bg_color #3584e4; @define-color switch_borders_color #185fb4; @define-color focus_border_color rgba(27, 106, 203, 0.8); @define-color alt_focus_border_color white; @define-color dim_label_opacity 0.9; button { color: #272c2e; outline-color: rgba(27, 106, 203, 0.8); border-color: #877b6e; background-image: linear-gradient(to top, #fafaf9 2px, white); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:hover { color: #272c2e; border-color: #877b6e; background-image: linear-gradient(to top, #dad6d2, #edebe9 1px); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:checked { color: #272c2e; border-color: #877b6e; background-image: image(#dfdbd8); box-shadow: none; } button:checked:hover { color: #272c2e; border-color: #877b6e; background-image: image(#d6d1cd); box-shadow: none; } button:checked:active { color: #272c2e; border-color: #877b6e; background-image: image(#cdc7c1); box-shadow: none; } button:backdrop { color: #929595; border-color: #d5d0cc; background-image: image(#f6f5f4); box-shadow: none; } button:backdrop:active { color: #929595; border-color: #d5d0cc; background-image: image(#ebebeb); box-shadow: none; } button:backdrop:insensitive { color: #d4cfca; border-color: #d5d0cc; background-image: image(#fefefd); box-shadow: none; } button:backdrop:insensitive:active { color: #d4cfca; border-color: #d5d0cc; background-image: image(#ebebeb); box-shadow: none; } button:disabled { color: #929495; border-color: #9e958b; background-image: image(#fefefd); } button:disabled:active { color: #929495; border-color: #9e958b; background-image: image(#ebebeb); box-shadow: none; } checkradio { background-clip: padding-box; background-image: linear-gradient(to bottom, white 20%, white 90%); border-color: #6e645a; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:hover { background-image: image(#f2f2f2); } checkradio:active { box-shadow: inset 0 1px rgba(0, 0, 0, 0.2); background-image: image(#d9d9d9); } checkradio:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } checkradio:checked { background-clip: border-box; background-image: linear-gradient(to bottom, #4b92e7 20%, #3584e4 90%); border-color: #1b6acb; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:checked:hover { background-image: linear-gradient(to bottom, #5d9de9 10%, #478fe6 90%); } checkradio:checked:active { box-shadow: inset 0 1px rgba(0, 0, 0, 0.2); background-image: image(#1f76e1); } checkradio:checked:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } adwaita-qt-1.4.1/src/lib/stylesheet/processed/Adwaita-light.css000066400000000000000000000113721414271704400244670ustar00rootroot00000000000000@define-color base_color #ffffff; @define-color text_color black; @define-color bg_color #f6f5f4; @define-color fg_color #2e3436; @define-color selected_fg_color #ffffff; @define-color selected_bg_color #3584e4; @define-color selected_borders_color #185fb4; @define-color borders_color #cdc7c2; @define-color alt_borders_color #bfb8b1; @define-color borders_edge rgba(255, 255, 255, 0.8); @define-color link_color #1b6acb; @define-color link_visited_color #15539e; @define-color top_hilight rgba(255, 255, 255, 0.8); @define-color dark_fill #e1dedb; @define-color headerbar_bg_color white; @define-color menu_color #ffffff; @define-color menu_selected_color #e8e6e3; @define-color scrollbar_bg_color #cecece; @define-color scrollbar_slider_color #7e8182; @define-color scrollbar_slider_hover_color #565b5c; @define-color scrollbar_slider_active_color #1b6acb; @define-color warning_color #f57900; @define-color error_color #cc0000; @define-color success_color #33d17a; @define-color destructive_color #e01b24; @define-color osd_fg_color #eeeeec; @define-color osd_text_color white; @define-color osd_bg_color rgba(53, 53, 53, 0.7); @define-color osd_insensitive_bg_color rgba(71, 71, 71, 0.5); @define-color osd_insensitive_fg_color #919190; @define-color osd_borders_color rgba(0, 0, 0, 0.7); @define-color sidebar_bg_color #fbfafa; @define-color tooltip_borders_color rgba(255, 255, 255, 0.1); @define-color shadow_color rgba(0, 0, 0, 0.1); @define-color drop_target_color #2ec27e; @define-color insensitive_fg_color #929595; @define-color insensitive_bg_color #faf9f8; @define-color insensitive_borders_color #d5d0cc; @define-color backdrop_base_color #fcfcfc; @define-color backdrop_text_color #323232; @define-color backdrop_bg_color #f6f5f4; @define-color backdrop_fg_color #929595; @define-color backdrop_insensitive_color #d4cfca; @define-color backdrop_selected_fg_color #fcfcfc; @define-color backdrop_borders_color #d5d0cc; @define-color backdrop_dark_fill #eae8e6; @define-color suggested_bg_color #3584e4; @define-color suggested_border_color #185fb4; @define-color progress_bg_color #3584e4; @define-color progress_border_color #185fb4; @define-color checkradio_bg_color #3584e4; @define-color checkradio_fg_color #ffffff; @define-color checkradio_borders_color #1b6acb; @define-color switch_bg_color #3584e4; @define-color switch_borders_color #185fb4; @define-color focus_border_color rgba(53, 132, 228, 0.5); @define-color alt_focus_border_color rgba(255, 255, 255, 0.8); @define-color dim_label_opacity 0.55; button { color: #2e3436; outline-color: rgba(53, 132, 228, 0.5); border-color: #cdc7c2; background-image: linear-gradient(to top, #f6f5f4 2px, #fbfafa); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:hover { color: #2e3436; border-color: #cdc7c2; background-image: linear-gradient(to top, #d6d1cd, #e8e6e3 1px); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } button:checked { color: #2e3436; border-color: #cdc7c2; background-image: image(#dad6d2); box-shadow: none; } button:checked:hover { color: #2e3436; border-color: #cdc7c2; background-image: image(#d1ccc7); box-shadow: none; } button:checked:active { color: #2e3436; border-color: #cdc7c2; background-image: image(#c8c2bc); box-shadow: none; } button:backdrop { color: #929595; border-color: #d5d0cc; background-image: image(#f6f5f4); box-shadow: none; } button:backdrop:active { color: #929595; border-color: #d5d0cc; background-image: image(#e9e9e3); box-shadow: none; } button:backdrop:insensitive { color: #d4cfca; border-color: #d5d0cc; background-image: image(#faf9f8); box-shadow: none; } button:backdrop:insensitive:active { color: #d4cfca; border-color: #d5d0cc; background-image: image(#e9e9e3); box-shadow: none; } button:disabled { color: #929595; border-color: #d5d0cc; background-image: image(#faf9f8); } button:disabled:active { color: #929595; border-color: #d5d0cc; background-image: image(#e9e9e3); box-shadow: none; } checkradio { background-clip: padding-box; background-image: linear-gradient(to bottom, white 20%, white 90%); border-color: #bfb8b1; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:hover { background-image: image(#f2f2f2); } checkradio:active { box-shadow: inset 0 1px rgba(0, 0, 0, 0.2); background-image: image(#d9d9d9); } checkradio:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } checkradio:checked { background-clip: border-box; background-image: linear-gradient(to bottom, #4b92e7 20%, #3584e4 90%); border-color: #1b6acb; box-shadow: 0 1px rgba(0, 0, 0, 0.05); color: #ffffff; } checkradio:checked:hover { background-image: linear-gradient(to bottom, #5d9de9 10%, #478fe6 90%); } checkradio:checked:active { box-shadow: inset 0 1px rgba(0, 0, 0, 0.2); background-image: image(#1f76e1); } checkradio:checked:disabled { box-shadow: none; color: rgba(255, 255, 255, 0.7); } adwaita-qt-1.4.1/src/lib/stylesheet/stylesheet.qrc.in000066400000000000000000000006131414271704400226100ustar00rootroot00000000000000 @STYLESHEET_PATH@/Adwaita-light.css @STYLESHEET_PATH@/Adwaita-dark.css @STYLESHEET_PATH@/Adwaita-hc.css @STYLESHEET_PATH@/Adwaita-hc-dark.css adwaita-qt-1.4.1/src/style/000077500000000000000000000000001414271704400155045ustar00rootroot00000000000000adwaita-qt-1.4.1/src/style/CMakeLists.txt000066400000000000000000000023131414271704400202430ustar00rootroot00000000000000 include_directories( ${CMAKE_BINARY_DIR}/src/lib # for adwaita-config.h ${CMAKE_SOURCE_DIR}/src/lib ${CMAKE_CURRENT_SOURCE_DIR} ) set(Adwaita_SRCS adwaitahelper.cpp adwaitastyle.cpp adwaitastyleplugin.cpp ) add_definitions(-DQT_PLUGIN) if (MSVC) add_definitions(-D_USE_MATH_DEFINES) # Needed for M_PI on MSVC endif() set(LIBRARY_NAME "adwaita-qt") add_library(${LIBRARY_NAME} MODULE ${Adwaita_SRCS}) target_link_libraries(${LIBRARY_NAME} adwaitaqt${ADWAITAQT_SUFFIX} adwaitaqt${ADWAITAQT_SUFFIX}priv Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::DBus Qt${QT_VERSION_MAJOR}::Gui Qt${QT_VERSION_MAJOR}::Widgets ) if (ADWAITA_HAVE_X11) target_link_libraries(${LIBRARY_NAME} ${XCB_LIBRARIES} Qt${QT_VERSION_MAJOR}::X11Extras) endif() if (NOT APPLE AND NOT WIN32) set_target_properties(${LIBRARY_NAME} PROPERTIES LINK_FLAGS "-Wl,--no-undefined" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" OUTPUT_NAME "adwaita" PREFIX "") endif() if (USE_QT6) install(TARGETS ${LIBRARY_NAME} DESTINATION "${QT6_INSTALL_PLUGINS}/styles") else() install(TARGETS ${LIBRARY_NAME} DESTINATION "${QT_PLUGINS_DIR}/styles") endif() adwaita-qt-1.4.1/src/style/adwaita.json000066400000000000000000000002101414271704400200020ustar00rootroot00000000000000{ "Keys": [ "Adwaita", "Adwaita-Dark", "Adwaita-HighContrast", "Adwaita-HighContrastInverse", "HighContrast", "HighContrastInverse" ] } adwaita-qt-1.4.1/src/style/adwaita.themerc000066400000000000000000000001201414271704400204600ustar00rootroot00000000000000[Misc] Name=Adwaita Comment=Qt widget style for GNOME [KDE] WidgetStyle=Adwaita adwaita-qt-1.4.1/src/style/adwaitahelper.cpp000066400000000000000000000170021414271704400210220ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2020 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaita.h" #include "adwaitacolors.h" #include "adwaitahelper.h" #include #include #include #if ADWAITA_HAVE_X11 #include #endif namespace Adwaita { Helper::Helper() { init(); } // static bool Helper::isWindowActive(const QWidget *widget) { const QWindow *win = widget ? widget->window()->windowHandle() : nullptr; if (win) { return win->isActive(); } return false; } bool Helper::isX11() { static const bool s_isX11 = qApp->platformName() == QLatin1String("xcb"); return s_isX11; } bool Helper::isWayland() { static const bool s_isWayland = qApp->platformName().startsWith(QLatin1String("wayland")); return s_isWayland; } bool Helper::compositingActive(void) const { #if ADWAITA_HAVE_X11 if (isX11()) { // direct call to X xcb_get_selection_owner_cookie_t cookie(xcb_get_selection_owner(connection(), _compositingManagerAtom)); ScopedPointer reply(xcb_get_selection_owner_reply(connection(), cookie, nullptr)); return reply && reply->owner; } #endif // use KWindowSystem //return KWindowSystem::compositingActive(); return false; } bool Helper::hasAlphaChannel(const QWidget *widget) const { return compositingActive() && widget && widget->testAttribute(Qt::WA_TranslucentBackground); } QPixmap Helper::highDpiPixmap(int width, int height) const { qreal dpiRatio(qApp->devicePixelRatio()); QPixmap pixmap(width * dpiRatio, height * dpiRatio); pixmap.setDevicePixelRatio(dpiRatio); return pixmap; } qreal Helper::devicePixelRatio(const QPixmap &pixmap) const { Q_UNUSED(pixmap); return 1; } #if ADWAITA_HAVE_X11 xcb_connection_t *Helper::connection() { return QX11Info::connection(); } xcb_atom_t Helper::createAtom(const QString &name) const { if (isX11()) { xcb_connection_t *connection(Helper::connection()); xcb_intern_atom_cookie_t cookie(xcb_intern_atom(connection, false, name.size(), qPrintable(name))); ScopedPointer reply(xcb_intern_atom_reply(connection, cookie, nullptr)); return reply ? reply->atom : 0; } else return 0; } #endif void Helper::init() { #if ADWAITA_HAVE_X11 if (isX11()) { // create compositing screen QString atomName(QStringLiteral("_NET_WM_CM_S%1").arg(QX11Info::appScreen())); _compositingManagerAtom = createAtom(atomName); } #endif } void Helper::setVariant(QWidget *widget, const QByteArray &variant) { #if ADWAITA_HAVE_X11 if (isX11() && widget) { // && !widget->testAttribute(Qt::WA_)) { static const char *_GTK_THEME_VARIANT = "_GTK_THEME_VARIANT"; // Check if already set QVariant var = widget->property("_GTK_THEME_VARIANT"); if (var.isValid() && var.toByteArray() == variant) { return; } // Typedef's from xcb/xcb.h - copied so that there is no // direct xcb dependency typedef quint32 XcbAtom; struct XcbInternAtomCookie { unsigned int sequence; }; struct XcbInternAtomReply { quint8 response_type; quint8 pad0; quint16 sequence; quint32 length; XcbAtom atom; }; struct XcbVoidCookie { unsigned int sequence; }; typedef void *(*XcbConnectFn)(const char *, int *); typedef XcbInternAtomCookie(*XcbInternAtomFn)(void *, quint8, quint16, const char *); typedef XcbInternAtomReply * (*XcbInternAtomReplyFn)(void *, XcbInternAtomCookie, void *); typedef XcbVoidCookie(*XcbChangePropertyFn)(void *, quint8, quint32, XcbAtom, XcbAtom, quint8, quint32, const void *); typedef int (*XcbFlushFn)(void *); static QLibrary *lib = 0; static XcbAtom variantAtom = 0; static XcbAtom utf8TypeAtom = 0; static void *xcbConn = 0; static XcbChangePropertyFn XcbChangePropertyFnPtr = 0; static XcbFlushFn XcbFlushFnPtr = 0; if (!lib) { lib = new QLibrary("libxcb", qApp); if (lib->load()) { XcbConnectFn XcbConnectFnPtr = (XcbConnectFn)lib->resolve("xcb_connect"); XcbInternAtomFn XcbInternAtomFnPtr = (XcbInternAtomFn)lib->resolve("xcb_intern_atom"); XcbInternAtomReplyFn XcbInternAtomReplyFnPtr = (XcbInternAtomReplyFn)lib->resolve("xcb_intern_atom_reply"); XcbChangePropertyFnPtr = (XcbChangePropertyFn)lib->resolve("xcb_change_property"); XcbFlushFnPtr = (XcbFlushFn)lib->resolve("xcb_flush"); if (XcbConnectFnPtr && XcbInternAtomFnPtr && XcbInternAtomReplyFnPtr && XcbChangePropertyFnPtr && XcbFlushFnPtr) { xcbConn = (*XcbConnectFnPtr)(0, 0); if (xcbConn) { XcbInternAtomReply *typeReply = (*XcbInternAtomReplyFnPtr)(xcbConn, (*XcbInternAtomFnPtr)(xcbConn, 0, 11, "UTF8_STRING"), 0); if (typeReply) { XcbInternAtomReply *gtkVarReply = (*XcbInternAtomReplyFnPtr)(xcbConn, (*XcbInternAtomFnPtr)(xcbConn, 0, strlen(_GTK_THEME_VARIANT), _GTK_THEME_VARIANT), 0); if (gtkVarReply) { utf8TypeAtom = typeReply->atom; variantAtom = gtkVarReply->atom; free(gtkVarReply); } free(typeReply); } } } } } if (0 != variantAtom) { (*XcbChangePropertyFnPtr)(xcbConn, 0, widget->effectiveWinId(), variantAtom, utf8TypeAtom, 8, variant.length(), (const void *)variant.constData()); (*XcbFlushFnPtr)(xcbConn); widget->setProperty(_GTK_THEME_VARIANT, variant); } } #endif } } adwaita-qt-1.4.1/src/style/adwaitahelper.h000066400000000000000000000065101414271704400204710ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2021 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_HELPER_H #define ADWAITA_HELPER_H #include "adwaita.h" #include "config-adwaita.h" #include #include #include #include #if ADWAITA_HAVE_X11 #include #include #endif namespace Adwaita { /* * Adwaita style helper class. * contains utility functions used at multiple places in both adwaita style and adwaita window decoration */ class Helper { public: explicit Helper(); virtual ~Helper() = default; static bool isWindowActive(const QWidget *widget); // true if style was compiled for and is running on X11 static bool isX11(); // true if running on platform Wayland static bool isWayland(); // returns true if compositing is active bool compositingActive() const; // returns true if a given widget supports alpha channel bool hasAlphaChannel(const QWidget *widget ) const; // return dpi-aware pixmap of given size virtual QPixmap highDpiPixmap(const QSize &size) const { return highDpiPixmap(size.width(), size.height()); } // return dpi-aware pixmap of given size virtual QPixmap highDpiPixmap(int width) const { return highDpiPixmap(width, width); } // return dpi-aware pixmap of given size virtual QPixmap highDpiPixmap(int width, int height) const; // return device pixel ratio for a given pixmap virtual qreal devicePixelRatio(const QPixmap &pixmap) const; #if ADWAITA_HAVE_X11 // get xcb connection static xcb_connection_t *connection(); // create xcb atom xcb_atom_t createAtom(const QString &name) const; #endif void setVariant(QWidget *widget, const QByteArray &variant); protected: // initialize void init(void); private: #if ADWAITA_HAVE_X11 // atom used for compositing manager xcb_atom_t _compositingManagerAtom; #endif }; } #endif adwaita-qt-1.4.1/src/style/adwaitastyle.cpp000066400000000000000000011011671414271704400207120ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019-2020 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ // Adwaita style #include "adwaitastyle.h" #include "adwaitahelper.h" // Adwaita lib #include "animations/adwaitaanimations.h" #include "adwaita.h" #include "adwaitacolors.h" #include "adwaitamnemonics.h" #include "adwaitasplitterproxy.h" #include "adwaitarenderer.h" #include "adwaitawidgetexplorer.h" #include "adwaitawindowmanager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif namespace AdwaitaPrivate { // needed to keep track of tabbars when being dragged class TabBarData: public QObject { public: //* constructor explicit TabBarData(QObject *parent) : QObject(parent) {} //* destructor virtual ~TabBarData(void) {} //* assign target tabBar void lock(const QWidget *widget) { _tabBar = widget; } //* true if tabbar is locked bool isLocked(const QWidget *widget) const { return _tabBar && _tabBar.data() == widget; } //* release void release(void) { _tabBar.clear(); } private: //* pointer to target tabBar Adwaita::WeakPointer _tabBar; }; //* needed to have spacing added to items in combobox class ComboBoxItemDelegate: public QItemDelegate { public: //* constructor ComboBoxItemDelegate(QAbstractItemView *parent) : QItemDelegate(parent) , _proxy(parent->itemDelegate()) , _itemMargin(Adwaita::Metrics::ItemView_ItemMarginWidth) {} //* destructor virtual ~ComboBoxItemDelegate(void) {} //* paint void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { // call either proxy or parent class if (_proxy) { _proxy.data()->paint(painter, option, index); } else { QItemDelegate::paint(painter, option, index); } } //* size hint for index virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { // get size from either proxy or parent class QSize size(_proxy ? _proxy.data()->sizeHint(option, index) : QItemDelegate::sizeHint(option, index)); // adjust and return if (size.isValid()) { size.rheight() += _itemMargin * 2; } return size; } private: //* proxy Adwaita::WeakPointer _proxy; //* margin int _itemMargin; }; } // namespace AdwaitaPrivate void tabLayout(const QStyleOptionTab *opt, const QWidget *widget, QRect *textRect, QRect *iconRect, const QStyle *proxyStyle) { Q_ASSERT(textRect); Q_ASSERT(iconRect); QRect tr = opt->rect; bool verticalTabs = opt->shape == QTabBar::RoundedEast || opt->shape == QTabBar::RoundedWest || opt->shape == QTabBar::TriangularEast || opt->shape == QTabBar::TriangularWest; if (verticalTabs) tr.setRect(0, 0, tr.height(), tr.width()); //0, 0 as we will have a translate transform int verticalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftVertical, opt, widget); int horizontalShift = proxyStyle->pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, opt, widget); int hpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabHSpace, opt, widget) / 2; int vpadding = proxyStyle->pixelMetric(QStyle::PM_TabBarTabVSpace, opt, widget) / 2; if (opt->shape == QTabBar::RoundedSouth || opt->shape == QTabBar::TriangularSouth) verticalShift = -verticalShift; tr.adjust(hpadding, verticalShift - vpadding, horizontalShift - hpadding, vpadding); bool selected = opt->state & QStyle::State_Selected; if (selected) { tr.setTop(tr.top() - verticalShift); tr.setRight(tr.right() - horizontalShift); } // left widget if (!opt->leftButtonSize.isEmpty()) { tr.setLeft(tr.left() + 4 + (verticalTabs ? opt->leftButtonSize.height() : opt->leftButtonSize.width())); } // right widget if (!opt->rightButtonSize.isEmpty()) { tr.setRight(tr.right() - 4 - (verticalTabs ? opt->rightButtonSize.height() : opt->rightButtonSize.width())); } // icon if (!opt->icon.isNull()) { QSize iconSize = opt->iconSize; if (!iconSize.isValid()) { int iconExtent = proxyStyle->pixelMetric(QStyle::PM_SmallIconSize); iconSize = QSize(iconExtent, iconExtent); } QSize tabIconSize = opt->icon.actualSize(iconSize, (opt->state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled, (opt->state & QStyle::State_Selected) ? QIcon::On : QIcon::Off); *iconRect = QRect(tr.left(), tr.center().y() - tabIconSize.height() / 2, tabIconSize.width(), tabIconSize .height()); if (!verticalTabs) { *iconRect = proxyStyle->visualRect(opt->direction, opt->rect, *iconRect); } tr.setLeft(tr.left() + tabIconSize.width() + 4); } if (!verticalTabs) { tr = proxyStyle->visualRect(opt->direction, opt->rect, tr); } *textRect = tr; } namespace Adwaita { //______________________________________________________________ Style::Style(ColorVariant variant) : _addLineButtons(SingleButton) , _subLineButtons(SingleButton) , _helper(new Helper()) , _animations(new Animations(this)) , _mnemonics(new Mnemonics(this)) , _windowManager(new WindowManager(this)) , _splitterFactory(new SplitterFactory(this)) , _widgetExplorer(new WidgetExplorer(this)) , _tabBarData(new AdwaitaPrivate::TabBarData(this)) , _variant(variant) , _dark(variant == AdwaitaDark || variant == AdwaitaHighcontrastInverse) { // use DBus connection to update on adwaita configuration change QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.connect(QString(), QStringLiteral("/AdwaitaStyle"), QStringLiteral("org.kde.Adwaita.Style"), QStringLiteral("reparseConfiguration"), this, SLOT(configurationChanged())); dbus.connect(QString(), QStringLiteral("/AdwaitaDecoration"), QStringLiteral("org.kde.Adwaita.Style"), QStringLiteral("reparseConfiguration"), this, SLOT(configurationChanged())); // Detect if running under KDE, if so set menus, etc, to have translucent background. // For GNOME desktop, dont want translucent backgrounds otherwise no menu shadow is drawn. _isKDE = qgetenv("XDG_CURRENT_DESKTOP").toLower() == "kde"; _isGNOME = qgetenv("XDG_CURRENT_DESKTOP").toLower() == "gnome"; // call the slot directly; this initial call will set up things that also // need to be reset when the system palette changes loadConfiguration(); } //______________________________________________________________ Style::~Style(void) { delete _helper; } //______________________________________________________________ void Style::polish(QWidget *widget) { if (!widget) { return; } // register widget to animations _animations->registerWidget(widget); _windowManager->registerWidget(widget); _splitterFactory->registerWidget(widget); // enable mouse over effects for all necessary widgets if (qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || widget->inherits("KTextEditor::View")) { widget->setAttribute(Qt::WA_Hover); } if (qobject_cast(widget)) { qobject_cast(widget)->setDrawBase(true); } // enforce translucency for drag and drop window if (widget->testAttribute(Qt::WA_X11NetWmWindowTypeDND) && _helper->compositingActive()) { widget->setAttribute(Qt::WA_TranslucentBackground); widget->clearMask(); } // scrollarea polishing is somewhat complex. It is moved to a dedicated method polishScrollArea(qobject_cast(widget)); if (QAbstractItemView *itemView = qobject_cast(widget)) { // enable mouse over effects in itemviews' viewport itemView->viewport()->setAttribute(Qt::WA_Hover); } else if (QGroupBox *groupBox = qobject_cast(widget)) { // checkable group boxes if (groupBox->isCheckable()) { groupBox->setAttribute(Qt::WA_Hover); } } else if (qobject_cast(widget) && qobject_cast(widget->parent())) { widget->setAttribute(Qt::WA_Hover); } else if (qobject_cast(widget) && qobject_cast(widget->parent())) { widget->setAttribute(Qt::WA_Hover); } else if (qobject_cast(widget) && widget->parent() && widget->parent()->inherits("KTitleWidget")) { widget->setAutoFillBackground(false); if (!Adwaita::Config::TitleWidgetDrawFrame) { widget->setBackgroundRole(QPalette::Window); } } if (qobject_cast(widget)) { // remove opaque painting for scrollbars widget->setAttribute(Qt::WA_OpaquePaintEvent, false); } else if (widget->inherits("KTextEditor::View")) { addEventFilter(widget); } else if (QToolButton *toolButton = qobject_cast(widget)) { if (toolButton->autoRaise()) { // for flat toolbuttons, adjust foreground and background role accordingly widget->setBackgroundRole(QPalette::NoRole); widget->setForegroundRole(QPalette::WindowText); } if (widget->parentWidget() && widget->parentWidget()->parentWidget() && widget->parentWidget()->parentWidget()->inherits("Gwenview::SideBarGroup")) { widget->setProperty(PropertyNames::toolButtonAlignment, Qt::AlignLeft); } } else if (qobject_cast(widget)) { // add event filter on dock widgets // and alter palette widget->setAutoFillBackground(false); widget->setContentsMargins(Metrics::Frame_FrameWidth, Metrics::Frame_FrameWidth, Metrics::Frame_FrameWidth, Metrics::Frame_FrameWidth); addEventFilter(widget); } else if (qobject_cast(widget)) { widget->setAutoFillBackground(false); addEventFilter(widget); } else if (qobject_cast(widget)) { widget->setBackgroundRole(QPalette::NoRole); widget->setAutoFillBackground(false); } else if (widget->parentWidget() && widget->parentWidget()->parentWidget() && qobject_cast(widget->parentWidget()->parentWidget()->parentWidget())) { widget->setBackgroundRole(QPalette::NoRole); widget->setAutoFillBackground(false); widget->parentWidget()->setAutoFillBackground(false); } else if (qobject_cast(widget)) { setTranslucentBackground(widget); } else if (qobject_cast(widget)) { addEventFilter(widget); } else if (QComboBox *comboBox = qobject_cast(widget)) { if (!hasParent(widget, "QWebView")) { QAbstractItemView *itemView(comboBox->view()); if (itemView && itemView->itemDelegate() && itemView->itemDelegate()->inherits("QComboBoxDelegate")) { itemView->setItemDelegate(new AdwaitaPrivate::ComboBoxItemDelegate(itemView)); } if (comboBox->isEditable()) { QLineEdit *lineEdit = comboBox->lineEdit(); if (lineEdit && !comboBox->isEnabled()) { QPalette pal = lineEdit->palette(); pal.setColor(QPalette::Base, comboBox->palette().color(QPalette::Window)); lineEdit->setPalette(pal); lineEdit->setAutoFillBackground(true); } } } } else if (widget->inherits("QComboBoxPrivateContainer")) { addEventFilter(widget); setTranslucentBackground(widget); } else if (widget->inherits("QTipLabel")) { setTranslucentBackground(widget); } else if (QLineEdit *lineEdit = qobject_cast(widget)) { // Do not use additional margin if the QLineEdit is really small const bool useMarginWidth = lineEdit->width() > lineEdit->fontMetrics().horizontalAdvance("#####"); const bool useMarginHeight = lineEdit->height() > lineEdit->fontMetrics().height() + (2 * Metrics::LineEdit_MarginHeight); const int marginHeight = useMarginHeight ? Metrics::LineEdit_MarginHeight : 0; const int marginWidth = useMarginWidth ? Metrics::LineEdit_MarginWidth : 0; lineEdit->setTextMargins(marginWidth, marginHeight, marginWidth, marginHeight); } else if (QSpinBox *spinBox = qobject_cast(widget)) { if (!spinBox->isEnabled()) { QPalette pal = spinBox->palette(); pal.setColor(QPalette::Base, spinBox->palette().color(QPalette::Window)); spinBox->setPalette(pal); spinBox->setAutoFillBackground(true); } } // HACK to avoid different text color in unfocused views // This has a side effect that the view will never grey out, but it's still better then having // views greyed out when the application is active if (QPointer view = qobject_cast(widget)) { QPalette pal = view->palette(); // TODO keep synced with the standard palette const QColor activeTextColor = _dark ? QColor("#eeeeec") : QColor("#2e3436"); const QColor inactiveTextColor = _dark ? Colors::mix(QColor("#eeeeec"), Colors::darken(Colors::desaturate(QColor("#3d3846"), 1.0), 0.04)) : Colors::mix(QColor("#2e3436"), QColor("#f6f5f4")); // No custom text color used, we can do our HACK if (inactiveTextColor == pal.color(QPalette::Inactive, QPalette::Text) && activeTextColor == pal.color(QPalette::Active, QPalette::Text)) { pal.setColor(QPalette::Inactive, QPalette::Text, pal.color(QPalette::Active, QPalette::Text)); view->setPalette(pal); } } if (!widget->parent() || !qobject_cast(widget->parent()) || qobject_cast(widget) || qobject_cast(widget)) { addEventFilter(widget); } // base class polishing ParentStyleClass::polish(widget); } //______________________________________________________________ void Style::polishScrollArea(QAbstractScrollArea *scrollArea) { // check argument if (!scrollArea) { return; } // enable mouse over effect in sunken scrollareas that support focus if (scrollArea->frameShadow() == QFrame::Sunken && scrollArea->focusPolicy() & Qt::StrongFocus) { scrollArea->setAttribute(Qt::WA_Hover); } if (scrollArea->viewport() && scrollArea->inherits("KItemListContainer") && scrollArea->frameShape() == QFrame::NoFrame) { scrollArea->viewport()->setBackgroundRole(QPalette::Window); scrollArea->viewport()->setForegroundRole(QPalette::WindowText); } // add event filter, to make sure proper background is rendered behind scrollbars addEventFilter(scrollArea); // force side panels as flat, on option if (scrollArea->inherits("KDEPrivate::KPageListView") || scrollArea->inherits("KDEPrivate::KPageTreeView")) { scrollArea->setProperty(PropertyNames::sidePanelView, true); } // for all side view panels, unbold font (design choice) if (scrollArea->property(PropertyNames::sidePanelView).toBool()) { // upbold list font QFont font(scrollArea->font()); font.setBold(false); scrollArea->setFont(font); // adjust background role if (!Adwaita::Config::SidePanelDrawFrame) { scrollArea->setBackgroundRole(QPalette::Window); scrollArea->setForegroundRole(QPalette::WindowText); if (scrollArea->viewport()) { scrollArea->viewport()->setBackgroundRole(QPalette::Window); scrollArea->viewport()->setForegroundRole(QPalette::WindowText); } } } // disable autofill background for flat (== NoFrame) scrollareas, with QPalette::Window as a background // this fixes flat scrollareas placed in a tinted widget, such as groupboxes, tabwidgets or framed dock-widgets if (!(scrollArea->frameShape() == QFrame::NoFrame || scrollArea->backgroundRole() == QPalette::Window)) { return; } // get viewport and check background role QWidget *viewport(scrollArea->viewport()); if (!(viewport && viewport->backgroundRole() == QPalette::Window)) { return; } // change viewport autoFill background. // do the same for all children if the background role is QPalette::Window viewport->setAutoFillBackground(false); QList children(viewport->findChildren()); foreach (QWidget *child, children) { if (child->parent() == viewport && child->backgroundRole() == QPalette::Window) { child->setAutoFillBackground(false); } } } //_______________________________________________________________ void Style::unpolish(QWidget *widget) { // register widget to animations _animations->unregisterWidget(widget); _windowManager->unregisterWidget(widget); _splitterFactory->unregisterWidget(widget); // remove event filter if (qobject_cast(widget) || qobject_cast(widget) || qobject_cast(widget) || widget->inherits("QComboBoxPrivateContainer") || qobject_cast(widget) || qobject_cast(widget)) { widget->removeEventFilter(this); } ParentStyleClass::unpolish(widget); } void Style::polish(QPalette &palette) { palette = Colors::palette(_variant); } QPalette Style::standardPalette() const { return Colors::palette(_variant); } //______________________________________________________________ int Style::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { // handle special cases switch (metric) { // frame width case PM_DefaultFrameWidth: if (widget && widget->inherits("QComboBoxPrivateContainer")) { return 1; } if (qobject_cast(widget)) { return Metrics::Menu_FrameWidth; } if (qobject_cast(widget)) { return Metrics::LineEdit_FrameWidth; } if (qobject_cast(widget)) { return Metrics::ScrollArea_FrameWidth; } else if (isQtQuickControl(option, widget)) { const QString &elementType = option->styleObject->property("elementType").toString(); if (elementType == QLatin1String("edit") || elementType == QLatin1String("spinbox")) { return Metrics::LineEdit_FrameWidth; } else if (elementType == QLatin1String("combobox")) { return Metrics::ComboBox_FrameWidth; } } // fallback return Metrics::Frame_FrameWidth; case PM_ComboBoxFrameWidth: { const QStyleOptionComboBox *comboBoxOption(qstyleoption_cast< const QStyleOptionComboBox *>(option)); return comboBoxOption && comboBoxOption->editable ? Metrics::LineEdit_FrameWidth : Metrics::ComboBox_FrameWidth; } case PM_SpinBoxFrameWidth: return Metrics::SpinBox_FrameWidth; case PM_ToolBarFrameWidth: return Metrics::ToolBar_FrameWidth; case PM_ToolTipLabelFrameWidth: return Metrics::ToolTip_FrameWidth; // layout case PM_LayoutLeftMargin: case PM_LayoutTopMargin: case PM_LayoutRightMargin: case PM_LayoutBottomMargin: { /* * use either Child margin or TopLevel margin, * depending on widget type */ if ((option && (option->state & QStyle::State_Window)) || (widget && widget->isWindow())) { return Metrics::Layout_TopLevelMarginWidth; } else if (widget && widget->inherits("KPageView")) { return 0; } else { return Metrics::Layout_ChildMarginWidth; } } case PM_LayoutHorizontalSpacing: return Metrics::Layout_DefaultSpacing; case PM_LayoutVerticalSpacing: return Metrics::Layout_DefaultSpacing; // buttons case PM_ButtonMargin: { // needs special case for kcalc buttons, to prevent the application to set too small margins if (widget && widget->inherits("KCalcButton")) { return Metrics::Button_MarginWidth + 4; } else { return Metrics::Button_MarginWidth; } } case PM_ButtonDefaultIndicator: return 0; case PM_ButtonShiftHorizontal: return 0; case PM_ButtonShiftVertical: return 0; // menubars case PM_MenuBarPanelWidth: return 0; case PM_MenuBarHMargin: return 0; case PM_MenuBarVMargin: return 0; case PM_MenuBarItemSpacing: return 0; case PM_MenuDesktopFrameWidth: return 0; // menu buttons case PM_MenuButtonIndicator: return Metrics::MenuButton_IndicatorWidth; case PM_MenuVMargin: return 2; case PM_MenuHMargin: return _isGNOME ? 0 : 1; // toolbars case PM_ToolBarHandleExtent: return Metrics::ToolBar_HandleExtent; case PM_ToolBarSeparatorExtent: return Metrics::ToolBar_SeparatorWidth; case PM_ToolBarExtensionExtent: return pixelMetric(PM_SmallIconSize, option, widget) + 2 * Metrics::ToolButton_MarginWidth; case PM_ToolBarItemMargin: return 0; case PM_ToolBarItemSpacing: return Metrics::ToolBar_ItemSpacing; // tabbars case PM_TabBarTabShiftVertical: return 0; case PM_TabBarTabShiftHorizontal: return 0; case PM_TabBarTabOverlap: return Metrics::TabBar_TabOverlap; case PM_TabBarBaseOverlap: return Metrics::TabBar_BaseOverlap; case PM_TabBarTabHSpace: return 2 * Metrics::TabBar_TabMarginWidth; case PM_TabBarTabVSpace: return 2 * Metrics::TabBar_TabMarginHeight; case PM_TabCloseIndicatorWidth: case PM_TabCloseIndicatorHeight: return pixelMetric(PM_SmallIconSize, option, widget); // scrollbars case PM_ScrollBarExtent: return Metrics::ScrollBar_Extend; case PM_ScrollBarSliderMin: return Metrics::ScrollBar_MinSliderHeight; // title bar case PM_TitleBarHeight: return 2 * Metrics::TitleBar_MarginWidth + pixelMetric(PM_SmallIconSize, option, widget); // sliders case PM_SliderThickness: return Metrics::Slider_ControlThickness; case PM_SliderControlThickness: return Metrics::Slider_ControlThickness; case PM_SliderLength: return Metrics::Slider_ControlThickness; // checkboxes and radio buttons case PM_IndicatorWidth: return Metrics::CheckBox_Size; case PM_IndicatorHeight: return Metrics::CheckBox_Size; case PM_ExclusiveIndicatorWidth: return Metrics::CheckBox_Size; case PM_ExclusiveIndicatorHeight: return Metrics::CheckBox_Size; // list heaaders case PM_HeaderMarkSize: return Metrics::Header_ArrowSize; case PM_HeaderMargin: return Metrics::Header_MarginWidth; // dock widget // return 0 here, since frame is handled directly in polish case PM_DockWidgetFrameWidth: return 0; case PM_DockWidgetTitleMargin: return Metrics::Frame_FrameWidth; case PM_DockWidgetTitleBarButtonMargin: return Metrics::ToolButton_MarginWidth; case PM_SplitterWidth: return Metrics::Splitter_SplitterWidth; case PM_DockWidgetSeparatorExtent: return Metrics::Splitter_SplitterWidth; // fallback default: return ParentStyleClass::pixelMetric(metric, option, widget); } } //______________________________________________________________ int Style::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const { switch (hint) { case SH_RubberBand_Mask: { if (QStyleHintReturnMask *mask = qstyleoption_cast(returnData)) { mask->region = option->rect; /* * need to check on widget before removing inner region * in order to still preserve rubberband in MainWindow and QGraphicsView * in QMainWindow because it looks better * in QGraphicsView because the painting fails completely otherwise */ if (widget && (qobject_cast(widget->parent()) || qobject_cast(widget->parent()) || qobject_cast(widget->parent()))) { return true; } // also check if widget's parent is some itemView viewport if (widget && widget->parent() && qobject_cast(widget->parent()->parent()) && static_cast(widget->parent()->parent())->viewport() == widget->parent()) { return true; } // mask out center mask->region -= insideMargin(option->rect, 1); return true; } return false; } case SH_ComboBox_ListMouseTracking: return true; case SH_MenuBar_MouseTracking: return true; case SH_Menu_MouseTracking: return true; case SH_Menu_SubMenuPopupDelay: return 150; case SH_Menu_SloppySubMenus: return true; case SH_Widget_Animate: return Adwaita::Config::AnimationsEnabled; case SH_Menu_SupportsSections: return true; case SH_DialogButtonBox_ButtonsHaveIcons: return false; case SH_GroupBox_TextLabelVerticalAlignment: return Qt::AlignVCenter; case SH_TabBar_Alignment: return Adwaita::Config::TabBarDrawCenteredTabs ? Qt::AlignCenter : Qt::AlignLeft; case SH_ToolBox_SelectedPageTitleBold: return false; case SH_ScrollBar_MiddleClickAbsolutePosition: return true; case SH_ScrollView_FrameOnlyAroundContents: return false; case SH_FormLayoutFormAlignment: return Qt::AlignLeft | Qt::AlignTop; case SH_FormLayoutLabelAlignment: return Qt::AlignRight; case SH_FormLayoutFieldGrowthPolicy: return QFormLayout::ExpandingFieldsGrow; case SH_FormLayoutWrapPolicy: return QFormLayout::DontWrapRows; case SH_MessageBox_TextInteractionFlags: return Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse; case SH_ProgressDialog_CenterCancelButton: return false; case SH_MessageBox_CenterButtons: return false; case SH_RequestSoftwareInputPanel: return RSIP_OnMouseClick; case SH_TitleBar_NoBorder: return true; case SH_DockWidget_ButtonsHaveFrame: return false; case SH_ToolTipLabel_Opacity: return 204 ;// Should have 30% transparency default: return ParentStyleClass::styleHint(hint, option, widget, returnData); } } //______________________________________________________________ QRect Style::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const { switch (element) { case SE_PushButtonContents: return pushButtonContentsRect(option, widget); case SE_PushButtonFocusRect: return pushButtonFocusRect(option, widget); case SE_CheckBoxContents: return checkBoxContentsRect(option, widget); case SE_CheckBoxIndicator: return checkBoxIndicatorRect(option, widget); case SE_CheckBoxFocusRect: return checkBoxFocusRect(option, widget); case SE_RadioButtonContents: return checkBoxContentsRect(option, widget); case SE_RadioButtonIndicator: return checkBoxIndicatorRect(option, widget); case SE_RadioButtonFocusRect: return checkBoxFocusRect(option, widget); case SE_LineEditContents: return lineEditContentsRect(option, widget); case SE_ProgressBarGroove: return progressBarGrooveRect(option, widget); case SE_ProgressBarContents: return progressBarContentsRect(option, widget); case SE_ProgressBarLabel: return progressBarLabelRect(option, widget); case SE_HeaderArrow: return headerArrowRect(option, widget); case SE_HeaderLabel: return headerLabelRect(option, widget); case SE_SliderFocusRect: return sliderFocusRect(option, widget); case SE_TabBarTabLeftButton: return tabBarTabLeftButtonRect(option, widget); case SE_TabBarTabRightButton: return tabBarTabRightButtonRect(option, widget); case SE_TabWidgetTabBar: return tabWidgetTabBarRect(option, widget); case SE_TabWidgetTabContents: return tabWidgetTabContentsRect(option, widget); case SE_TabWidgetTabPane: return tabWidgetTabPaneRect(option, widget); case SE_TabWidgetLeftCorner: return tabWidgetCornerRect(SE_TabWidgetLeftCorner, option, widget); case SE_TabWidgetRightCorner: return tabWidgetCornerRect(SE_TabWidgetRightCorner, option, widget); case SE_ToolBoxTabContents: return toolBoxTabContentsRect(option, widget); // fallback default: return ParentStyleClass::subElementRect(element, option, widget); } } //______________________________________________________________ QRect Style::subControlRect(ComplexControl element, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { switch (element) { case CC_GroupBox: return groupBoxSubControlRect(option, subControl, widget); case CC_ToolButton: return toolButtonSubControlRect(option, subControl, widget); case CC_ComboBox: return comboBoxSubControlRect(option, subControl, widget); case CC_SpinBox: return spinBoxSubControlRect(option, subControl, widget); case CC_ScrollBar: return scrollBarSubControlRect(option, subControl, widget); case CC_Dial: return dialSubControlRect(option, subControl, widget); case CC_Slider: return sliderSubControlRect(option, subControl, widget); // fallback default: return ParentStyleClass::subControlRect(element, option, subControl, widget); } } //______________________________________________________________ QSize Style::sizeFromContents(ContentsType element, const QStyleOption *option, const QSize &size, const QWidget *widget) const { switch (element) { case CT_CheckBox: return checkBoxSizeFromContents(option, size, widget); case CT_RadioButton: return checkBoxSizeFromContents(option, size, widget); case CT_LineEdit: return lineEditSizeFromContents(option, size, widget); case CT_ComboBox: return comboBoxSizeFromContents(option, size, widget); case CT_SpinBox: return spinBoxSizeFromContents(option, size, widget); case CT_Slider: return sliderSizeFromContents(option, size, widget); case CT_PushButton: return pushButtonSizeFromContents(option, size, widget); case CT_ToolButton: return toolButtonSizeFromContents(option, size, widget); case CT_MenuBar: return defaultSizeFromContents(option, size, widget); case CT_MenuBarItem: return menuBarItemSizeFromContents(option, size, widget); case CT_MenuItem: return menuItemSizeFromContents(option, size, widget); case CT_ProgressBar: return progressBarSizeFromContents(option, size, widget); case CT_TabWidget: return tabWidgetSizeFromContents(option, size, widget); case CT_TabBarTab: return tabBarTabSizeFromContents(option, size, widget); case CT_HeaderSection: return headerSectionSizeFromContents(option, size, widget); case CT_ItemViewItem: return itemViewItemSizeFromContents(option, size, widget); // fallback default: return ParentStyleClass::sizeFromContents(element, option, size, widget); } } //______________________________________________________________ QStyle::SubControl Style::hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option, const QPoint &point, const QWidget *widget) const { switch (control) { case CC_ScrollBar: { QRect grooveRect = subControlRect(CC_ScrollBar, option, SC_ScrollBarGroove, widget); if (grooveRect.contains(point)) { // Must be either page up/page down, or just click on the slider. QRect sliderRect = subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget); if (sliderRect.contains(point)) { return SC_ScrollBarSlider; } else if (preceeds(point, sliderRect, option)) { return SC_ScrollBarSubPage; } else { return SC_ScrollBarAddPage; } } // This is one of the up/down buttons. First, decide which one it is. if (preceeds(point, grooveRect, option)) { if (_subLineButtons == DoubleButton) { QRect buttonRect = scrollBarInternalSubControlRect(option, SC_ScrollBarSubLine); return scrollBarHitTest(buttonRect, point, option); } else { return SC_ScrollBarSubLine; } } if (_addLineButtons == DoubleButton) { QRect buttonRect = scrollBarInternalSubControlRect(option, SC_ScrollBarAddLine); return scrollBarHitTest(buttonRect, point, option); } else { return SC_ScrollBarAddLine; } } // fallback default: return ParentStyleClass::hitTestComplexControl(control, option, point, widget); } } //______________________________________________________________ void Style::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { StylePrimitive fcn(nullptr); switch (element) { case PE_PanelButtonCommand: fcn = &Style::drawPanelButtonCommandPrimitive; break; case PE_PanelButtonTool: fcn = &Style::drawPanelButtonToolPrimitive; break; case PE_PanelScrollAreaCorner: fcn = &Style::drawPanelScrollAreaCornerPrimitive; break; case PE_PanelMenu: fcn = &Style::drawPanelMenuPrimitive; break; case PE_PanelTipLabel: fcn = &Style::drawPanelTipLabelPrimitive; break; case PE_PanelItemViewRow: fcn = &Style::drawPanelItemViewRowPrimitive; break; case PE_PanelItemViewItem: fcn = &Style::drawPanelItemViewItemPrimitive; break; case PE_IndicatorCheckBox: fcn = &Style::drawIndicatorCheckBoxPrimitive; break; case PE_IndicatorRadioButton: fcn = &Style::drawIndicatorRadioButtonPrimitive; break; case PE_IndicatorButtonDropDown: fcn = &Style::drawIndicatorButtonDropDownPrimitive; break; case PE_IndicatorTabClose: fcn = &Style::drawIndicatorTabClosePrimitive; break; case PE_IndicatorTabTear: fcn = &Style::drawIndicatorTabTearPrimitive; break; case PE_IndicatorArrowUp: fcn = &Style::drawIndicatorArrowUpPrimitive; break; case PE_IndicatorArrowDown: fcn = &Style::drawIndicatorArrowDownPrimitive; break; case PE_IndicatorArrowLeft: fcn = &Style::drawIndicatorArrowLeftPrimitive; break; case PE_IndicatorArrowRight: fcn = &Style::drawIndicatorArrowRightPrimitive; break; case PE_IndicatorHeaderArrow: fcn = &Style::drawIndicatorHeaderArrowPrimitive; break; case PE_IndicatorToolBarHandle: fcn = &Style::drawIndicatorToolBarHandlePrimitive; break; case PE_IndicatorToolBarSeparator: fcn = &Style::drawIndicatorToolBarSeparatorPrimitive; break; case PE_IndicatorBranch: fcn = &Style::drawIndicatorBranchPrimitive; break; case PE_FrameStatusBarItem: fcn = &Style::emptyPrimitive; break; case PE_Frame: fcn = &Style::drawFramePrimitive; break; case PE_FrameLineEdit: fcn = &Style::drawFrameLineEditPrimitive; break; case PE_FrameMenu: fcn = &Style::drawFrameMenuPrimitive; break; case PE_FrameGroupBox: fcn = &Style::drawFrameGroupBoxPrimitive; break; case PE_FrameTabWidget: fcn = &Style::drawFrameTabWidgetPrimitive; break; case PE_FrameTabBarBase: fcn = &Style::drawFrameTabBarBasePrimitive; break; case PE_FrameWindow: fcn = &Style::drawFrameWindowPrimitive; break; case PE_FrameFocusRect: fcn = _frameFocusPrimitive; break; // fallback default: break; } painter->save(); // call function if implemented if (!(fcn && (this->*fcn)(option, painter, widget))) { ParentStyleClass::drawPrimitive(element, option, painter, widget); } painter->restore(); } //______________________________________________________________ void Style::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { StyleControl fcn(nullptr); switch (element) { case CE_PushButtonBevel: fcn = &Style::drawPanelButtonCommandPrimitive; break; case CE_PushButtonLabel: fcn = &Style::drawPushButtonLabelControl; break; case CE_CheckBoxLabel: fcn = &Style::drawCheckBoxLabelControl; break; case CE_RadioButtonLabel: fcn = &Style::drawCheckBoxLabelControl; break; case CE_ToolButtonLabel: fcn = &Style::drawToolButtonLabelControl; break; case CE_ComboBoxLabel: fcn = &Style::drawComboBoxLabelControl; break; case CE_MenuBarEmptyArea: fcn = &Style::drawMenuBarEmptyArea; break; case CE_MenuBarItem: fcn = &Style::drawMenuBarItemControl; break; case CE_MenuItem: fcn = &Style::drawMenuItemControl; break; case CE_ToolBar: fcn = &Style::emptyControl; break; case CE_ProgressBar: fcn = &Style::drawProgressBarControl; break; case CE_ProgressBarContents: fcn = &Style::drawProgressBarContentsControl; break; case CE_ProgressBarGroove: fcn = &Style::drawProgressBarGrooveControl; break; case CE_ProgressBarLabel: fcn = &Style::drawProgressBarLabelControl; break; case CE_ScrollBarSlider: fcn = &Style::drawScrollBarSliderControl; break; case CE_ScrollBarAddLine: fcn = &Style::drawScrollBarAddLineControl; break; case CE_ScrollBarSubLine: fcn = &Style::drawScrollBarSubLineControl; break; case CE_ScrollBarAddPage: fcn = &Style::emptyControl; break; case CE_ScrollBarSubPage: fcn = &Style::emptyControl; break; case CE_ShapedFrame: fcn = &Style::drawShapedFrameControl; break; case CE_RubberBand: fcn = &Style::drawRubberBandControl; break; case CE_SizeGrip: fcn = &Style::emptyControl; break; case CE_HeaderSection: fcn = &Style::drawHeaderSectionControl; break; case CE_HeaderLabel: fcn = &Style::drawHeaderLabelControl; break; case CE_HeaderEmptyArea: fcn = &Style::drawHeaderEmptyAreaControl; break; case CE_TabBarTabLabel: fcn = &Style::drawTabBarTabLabelControl; break; case CE_TabBarTabShape: fcn = &Style::drawTabBarTabShapeControl; break; case CE_ToolBoxTabLabel: fcn = &Style::drawToolBoxTabLabelControl; break; case CE_ToolBoxTabShape: fcn = &Style::drawToolBoxTabShapeControl; break; case CE_DockWidgetTitle: fcn = &Style::drawDockWidgetTitleControl; break; case CE_ItemViewItem: fcn = &Style::drawItemViewItemControl; break; // fallback default: break; } painter->save(); // call function if implemented if (!(fcn && (this->*fcn)(option, painter, widget))) { ParentStyleClass::drawControl(element, option, painter, widget); } painter->restore(); } //______________________________________________________________ void Style::drawComplexControl(ComplexControl element, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { StyleComplexControl fcn(nullptr); switch (element) { case CC_GroupBox: fcn = &Style::drawGroupBoxComplexControl; break; case CC_ToolButton: fcn = &Style::drawToolButtonComplexControl; break; case CC_ComboBox: fcn = &Style::drawComboBoxComplexControl; break; case CC_SpinBox: fcn = &Style::drawSpinBoxComplexControl; break; case CC_Slider: fcn = &Style::drawSliderComplexControl; break; case CC_Dial: fcn = &Style::drawDialComplexControl; break; case CC_ScrollBar: fcn = &Style::drawScrollBarComplexControl; break; case CC_TitleBar: fcn = &Style::drawTitleBarComplexControl; break; // fallback default: break; } painter->save(); // call function if implemented if (!(fcn && (this->*fcn)(option, painter, widget))) { ParentStyleClass::drawComplexControl(element, option, painter, widget); } painter->restore(); } //___________________________________________________________________________________ void Style::drawItemText(QPainter *painter, const QRect &rect, int flags, const QPalette &palette, bool enabled, const QString &text, QPalette::ColorRole textRole) const { // hide mnemonics if requested if (!_mnemonics->enabled() && (flags & Qt::TextShowMnemonic) && !(flags & Qt::TextHideMnemonic)) { flags &= ~Qt::TextShowMnemonic; flags |= Qt::TextHideMnemonic; } // make sure vertical alignment is defined // fallback on Align::VCenter if not if (!(flags & Qt::AlignVertical_Mask)) { flags |= Qt::AlignVCenter; } if (_animations->widgetEnabilityEngine().enabled()) { /* * check if painter engine is registered to WidgetEnabilityEngine, and animated * if yes, merge the palettes. Note: a static_cast is safe here, since only the address * of the pointer is used, not the actual content. */ const QWidget *widget(static_cast(painter->device())); if (_animations->widgetEnabilityEngine().isAnimated(widget, AnimationEnable)) { QPalette copy(Colors::disabledPalette(palette, _animations->widgetEnabilityEngine().opacity(widget, AnimationEnable))); return ParentStyleClass::drawItemText(painter, rect, flags, copy, enabled, text, textRole); } } // fallback return ParentStyleClass::drawItemText(painter, rect, flags, palette, enabled, text, textRole); } //_____________________________________________________________________ bool Style::eventFilter(QObject *object, QEvent *event) { if (QDockWidget *dockWidget = qobject_cast(object)) { return eventFilterDockWidget(dockWidget, event); } else if (QMdiSubWindow *subWindow = qobject_cast(object)) { return eventFilterMdiSubWindow(subWindow, event); } else if (QCommandLinkButton *commandLinkButton = qobject_cast(object)) { return eventFilterCommandLinkButton(commandLinkButton, event); } // cast to QWidget QWidget *widget = static_cast(object); if (widget->inherits("QAbstractScrollArea") || widget->inherits("KTextEditor::View")) { return eventFilterScrollArea(widget, event); } else if (widget->inherits("QComboBoxPrivateContainer")) { return eventFilterComboBoxContainer(widget, event); } if ((!widget->parent() || !qobject_cast(widget->parent()) || qobject_cast(widget) || qobject_cast(widget)) && (QEvent::Show == event->type() || QEvent::StyleChange == event->type())) { _helper->setVariant(widget, _dark ? "dark" : "light"); } // fallback return ParentStyleClass::eventFilter(object, event); } //____________________________________________________________________________ bool Style::eventFilterScrollArea(QWidget *widget, QEvent *event) { switch (event->type()) { case QEvent::Paint: { // get scrollarea viewport QAbstractScrollArea *scrollArea(qobject_cast(widget)); QWidget *viewport; if (!(scrollArea && (viewport = scrollArea->viewport()))) { break; } // get scrollarea horizontal and vertical containers QWidget *child(nullptr); QList children; if ((child = scrollArea->findChild("qt_scrollarea_vcontainer")) && child->isVisible()) { children.append(child); } if ((child = scrollArea->findChild("qt_scrollarea_hcontainer")) && child->isVisible()) { children.append(child); } if (children.empty()) { break; } if (!scrollArea->styleSheet().isEmpty()) { break; } // make sure proper background is rendered behind the containers QPainter painter(scrollArea); painter.setClipRegion(static_cast(event)->region()); painter.setPen(Qt::NoPen); // decide background color const QPalette::ColorRole role(viewport->backgroundRole()); QColor background; if (role == QPalette::Window && hasAlteredBackground(viewport)) { background = Colors::frameBackgroundColor(StyleOptions(viewport->palette(), _variant)); } else { background = viewport->palette().color(role); } painter.setBrush(background); // render foreach (auto *child, children) { painter.drawRect(child->geometry()); } break; } case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseMove: { // case event QMouseEvent *mouseEvent(static_cast(event)); // get frame framewidth int frameWidth(pixelMetric(PM_DefaultFrameWidth, 0, widget)); // find list of scrollbars QList scrollBars; if (QAbstractScrollArea *scrollArea = qobject_cast(widget)) { if (scrollArea->horizontalScrollBarPolicy() != Qt::ScrollBarAlwaysOff) { scrollBars.append(scrollArea->horizontalScrollBar()); } if (scrollArea->verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff) { scrollBars.append(scrollArea->verticalScrollBar()); } } else if (widget->inherits("KTextEditor::View")) { scrollBars = widget->findChildren(); } // loop over found scrollbars foreach (QScrollBar *scrollBar, scrollBars) { if (!(scrollBar && scrollBar->isVisible())) { continue; } QPoint offset; if (scrollBar->orientation() == Qt::Horizontal) { offset = QPoint(0, frameWidth); } else { offset = QPoint(QApplication::isLeftToRight() ? frameWidth : -frameWidth, 0); } // map position to scrollarea #if QT_VERSION >= 0x060000 QPoint position(scrollBar->mapFrom(widget, mouseEvent->position().toPoint() - offset)); #else QPoint position(scrollBar->mapFrom(widget, mouseEvent->pos() - offset)); #endif // check if contains if (!scrollBar->rect().contains(position)) { continue; } // copy event, send and return QMouseEvent copy(mouseEvent->type(), position, scrollBar->mapToGlobal(position), mouseEvent->button(), mouseEvent->buttons(), mouseEvent->modifiers()); QCoreApplication::sendEvent(scrollBar, ©); event->setAccepted(true); return true; } break; } default: break; } return ParentStyleClass::eventFilter(widget, event); } //_________________________________________________________ bool Style::eventFilterComboBoxContainer(QWidget *widget, QEvent *event) { if (event->type() == QEvent::Paint) { QPainter painter(widget); QPaintEvent *paintEvent = static_cast(event); painter.setClipRegion(paintEvent->region()); QRect rect(widget->rect()); const QPalette &palette(widget->palette()); bool hasAlpha(_helper->hasAlphaChannel(widget)); if (hasAlpha) { painter.setCompositionMode(QPainter::CompositionMode_Source); } StyleOptions styleOptions(&painter, rect); styleOptions.setColorVariant(_variant); styleOptions.setColor(Colors::frameBackgroundColor(StyleOptions(palette, _variant))); styleOptions.setOutlineColor(Colors::frameOutlineColor(StyleOptions(palette, _variant))); Adwaita::Renderer::renderMenuFrame(styleOptions, hasAlpha); } return false; } //____________________________________________________________________________ bool Style::eventFilterDockWidget(QDockWidget *dockWidget, QEvent *event) { if (event->type() == QEvent::Paint) { // create painter and clip QPainter painter(dockWidget); QPaintEvent *paintEvent = static_cast(event); painter.setClipRegion(paintEvent->region()); // store palette and set colors const QPalette &palette(dockWidget->palette()); QColor background(Colors::frameBackgroundColor(StyleOptions(palette, _variant))); QColor outline(Colors::frameOutlineColor(StyleOptions(palette, _variant))); // store rect QRect rect(dockWidget->rect()); // render StyleOptions styleOptions(&painter, rect); styleOptions.setColorVariant(_variant); styleOptions.setColor(background); styleOptions.setOutlineColor(outline); if (dockWidget->isFloating()) { Adwaita::Renderer::renderMenuFrame(styleOptions, false); } else if (Adwaita::Config::DockWidgetDrawFrame || (dockWidget->features() & (QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable))) { Adwaita::Renderer::renderFrame(styleOptions); } } return false; } //____________________________________________________________________________ bool Style::eventFilterMdiSubWindow(QMdiSubWindow *subWindow, QEvent *event) { if (event->type() == QEvent::Paint) { QPainter painter(subWindow); QPaintEvent *paintEvent(static_cast(event)); painter.setClipRegion(paintEvent->region()); QRect rect(subWindow->rect()); QColor background(subWindow->palette().color(QPalette::Window)); if (subWindow->isMaximized()) { // full painting painter.setPen(Qt::NoPen); painter.setBrush(background); painter.drawRect(rect); } else { // framed painting StyleOptions styleOptions(&painter, rect); styleOptions.setColor(background); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderMenuFrame(styleOptions); } } // continue with normal painting return false; } //____________________________________________________________________________ bool Style::eventFilterCommandLinkButton(QCommandLinkButton *button, QEvent *event) { if (event->type() == QEvent::Paint) { // painter QPainter painter(button); painter.setClipRegion(static_cast(event)->region()); bool isFlat = false; // option QStyleOptionButton option; option.initFrom(button); option.features |= QStyleOptionButton::CommandLinkButton; if (isFlat) { option.features |= QStyleOptionButton::Flat; } option.text = QString(); option.icon = QIcon(); if (button->isChecked()) { option.state |= State_On; } if (button->isDown()) { option.state |= State_Sunken; } // frame drawControl(QStyle::CE_PushButton, &option, &painter, button); // offset int margin(Metrics::Button_MarginWidth + Metrics::Frame_FrameWidth); QPoint offset(margin, margin); if (button->isDown() && !isFlat) painter.translate(1, 1); { offset += QPoint(1, 1); } // state const State &state(option.state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool hasFocus(enabled && (state & State_HasFocus)); // icon if (!button->icon().isNull()) { QSize pixmapSize(button->icon().actualSize(button->iconSize())); QRect pixmapRect(QPoint(offset.x(), button->description().isEmpty() ? (button->height() - pixmapSize.height()) / 2 : offset.y()), pixmapSize); const QPixmap pixmap(button->icon().pixmap(pixmapSize, enabled ? QIcon::Normal : QIcon::Disabled, button->isChecked() ? QIcon::On : QIcon::Off)); drawItemPixmap(&painter, pixmapRect, Qt::AlignCenter, pixmap); offset.rx() += pixmapSize.width() + Metrics::Button_ItemSpacing; } // text rect QRect textRect(offset, QSize(button->size().width() - offset.x() - margin, button->size().height() - 2 * margin)); const QPalette::ColorRole textRole = (enabled && hasFocus && !mouseOver && !isFlat) ? QPalette::HighlightedText : QPalette::ButtonText; if (!button->text().isEmpty()) { QFont font(button->font()); font.setBold(true); painter.setFont(font); if (button->description().isEmpty()) { drawItemText(&painter, textRect, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextHideMnemonic, button->palette(), enabled, button->text(), textRole); } else { drawItemText(&painter, textRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextHideMnemonic, button->palette(), enabled, button->text(), textRole); textRect.setTop(textRect.top() + QFontMetrics(font).height()); } painter.setFont(button->font()); } if (!button->description().isEmpty()) { drawItemText(&painter, textRect, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextWordWrap, button->palette(), enabled, button->description(), textRole); } return true; } // continue with normal painting return false; } //_____________________________________________________________________ void Style::configurationChanged(void) { // reload configuration loadConfiguration(); } //____________________________________________________________________ QIcon Style::standardIconImplementation(StandardPixmap standardPixmap, const QStyleOption *option, const QWidget *widget) const { // lookup cache if (_iconCache.contains(standardPixmap)) { return _iconCache.value(standardPixmap); } QIcon icon; switch (standardPixmap) { case SP_TitleBarNormalButton: case SP_TitleBarMinButton: case SP_TitleBarMaxButton: case SP_TitleBarCloseButton: case SP_DockWidgetCloseButton: icon = titleBarButtonIcon(standardPixmap, option, widget); break; case SP_ToolBarHorizontalExtensionButton: case SP_ToolBarVerticalExtensionButton: icon = toolBarExtensionIcon(standardPixmap, option, widget); break; default: break; } if (icon.isNull()) { // do not cache parent style icon, since it may change at runtime return ParentStyleClass::standardIcon(standardPixmap, option, widget); } else { const_cast(&_iconCache)->insert(standardPixmap, icon); return icon; } } //_____________________________________________________________________ void Style::loadConfiguration() { // reinitialize engines _animations->setupEngines(); _windowManager->initialize(); // mnemonics _mnemonics->setMode(Adwaita::Config::MnemonicsMode); // splitter proxy _splitterFactory->setEnabled(Adwaita::Config::SplitterProxyEnabled); // clear icon cache _iconCache.clear(); // scrollbar buttons switch (Adwaita::Config::ScrollBarAddLineButtons) { case 0: _addLineButtons = NoButton; break; case 1: _addLineButtons = SingleButton; break; default: case 2: _addLineButtons = DoubleButton; break; } switch (Adwaita::Config::ScrollBarSubLineButtons) { case 0: _subLineButtons = NoButton; break; case 1: _subLineButtons = SingleButton; break; default: case 2: _subLineButtons = DoubleButton; break; } // frame focus if (Adwaita::Config::ViewDrawFocusIndicator) { _frameFocusPrimitive = &Style::drawFrameFocusRectPrimitive; } else { _frameFocusPrimitive = &Style::emptyPrimitive; } // widget explorer _widgetExplorer->setEnabled(Adwaita::Config::WidgetExplorerEnabled); _widgetExplorer->setDrawWidgetRects(Adwaita::Config::DrawWidgetRects); } //___________________________________________________________________________________________________________________ QRect Style::pushButtonContentsRect(const QStyleOption *option, const QWidget *) const { return insideMargin(option->rect, Metrics::Frame_FrameWidth); } //___________________________________________________________________________________________________________________ QRect Style::pushButtonFocusRect(const QStyleOption *option, const QWidget *) const { return insideMargin(option->rect, 3); } //___________________________________________________________________________________________________________________ QRect Style::checkBoxContentsRect(const QStyleOption *option, const QWidget *) const { return visualRect(option, option->rect.adjusted(Metrics::CheckBox_Size + Metrics::CheckBox_ItemSpacing, 0, 0, 0)); } //___________________________________________________________________________________________________________________ QRect Style::checkBoxIndicatorRect(const QStyleOption *option, const QWidget *widget) const { return ParentStyleClass::subElementRect(SE_CheckBoxIndicator, option, widget); } //___________________________________________________________________________________________________________________ QRect Style::checkBoxFocusRect(const QStyleOption *option, const QWidget *widget) const { return QRect(option->rect.left() + 2, option->rect.top() + 1, ParentStyleClass::subElementRect(SE_CheckBoxFocusRect, option, widget).right() - option->rect.left(), option->rect.height() - 2); } //___________________________________________________________________________________________________________________ QRect Style::lineEditContentsRect(const QStyleOption *option, const QWidget *widget) const { // cast option and check const QStyleOptionFrame *frameOption(qstyleoption_cast(option)); if (!frameOption) { return option->rect; } // check flatness bool flat(frameOption->lineWidth == 0); if (flat) { return option->rect; } // copy rect and take out margins QRect rect(option->rect); // take out margins if there is enough room int frameWidth(pixelMetric(PM_DefaultFrameWidth, option, widget)); if (rect.height() >= option->fontMetrics.height() + 2 * frameWidth) { return insideMargin(rect, frameWidth); } else { return rect; } } //___________________________________________________________________________________________________________________ QRect Style::progressBarGrooveRect(const QStyleOption *option, const QWidget *widget) const { // cast option and check const QStyleOptionProgressBar *progressBarOption(qstyleoption_cast(option)); if (!progressBarOption) { return option->rect; } // get flags and orientation bool textVisible(progressBarOption->textVisible); bool busy(progressBarOption->minimum == 0 && progressBarOption->maximum == 0); const State &state(option->state); #if QT_VERSION >= 0x060000 bool horizontal(state & QStyle::State_Horizontal); #else bool horizontal((state & QStyle::State_Horizontal) || (progressBarOption->orientation == Qt::Horizontal)); #endif // copy rectangle and adjust QRect rect(option->rect); int frameWidth(pixelMetric(PM_DefaultFrameWidth, option, widget)); if (horizontal) { rect = insideMargin(rect, frameWidth, 0); } else { rect = insideMargin(rect, 0, frameWidth); } if (textVisible && !busy && horizontal) { QRect textRect(subElementRect(SE_ProgressBarLabel, option, widget)); textRect = visualRect(option, textRect); rect.setRight(textRect.left() - Metrics::ProgressBar_ItemSpacing - 1); rect = visualRect(option, rect); rect = centerRect(rect, rect.width(), Metrics::ProgressBar_Thickness); } else if (horizontal) { rect = centerRect(rect, rect.width(), Metrics::ProgressBar_Thickness); } else { rect = centerRect(rect, Metrics::ProgressBar_Thickness, rect.height()); } return rect; } //___________________________________________________________________________________________________________________ QRect Style::progressBarContentsRect(const QStyleOption *option, const QWidget *widget) const { // cast option and check const QStyleOptionProgressBar *progressBarOption(qstyleoption_cast(option)); if (!progressBarOption) { return QRect(); } // get groove rect QRect rect(progressBarGrooveRect(option, widget)); // in busy mode, grooveRect is used bool busy(progressBarOption->minimum == 0 && progressBarOption->maximum == 0); if (busy) { return rect; } // get orientation const State &state(option->state); #if QT_VERSION >= 0x060000 bool horizontal(state & QStyle::State_Horizontal); #else bool horizontal((state & QStyle::State_Horizontal) || (progressBarOption->orientation == Qt::Horizontal)); #endif // check inverted appearance bool inverted(progressBarOption ? progressBarOption->invertedAppearance : false); // get progress and steps qreal progress(progressBarOption->progress - progressBarOption->minimum); int steps(qMax(progressBarOption->maximum - progressBarOption->minimum, 1)); //Calculate width fraction qreal widthFrac = qMin(qreal(1), progress / steps); // convert the pixel width int indicatorSize(widthFrac * (horizontal ? rect.width() : rect.height())); QRect indicatorRect; if (horizontal) { indicatorRect = QRect(inverted ? (rect.right() - indicatorSize + 1) : rect.left(), rect.y(), indicatorSize, rect.height()); indicatorRect = visualRect(option->direction, rect, indicatorRect); } else { indicatorRect = QRect(rect.x(), inverted ? rect.top() : (rect.bottom() - indicatorSize + 1), rect.width(), indicatorSize); } return indicatorRect; } //___________________________________________________________________________________________________________________ QRect Style::progressBarLabelRect(const QStyleOption *option, const QWidget *) const { // cast option and check const QStyleOptionProgressBar *progressBarOption(qstyleoption_cast(option)); if (!progressBarOption) { return QRect(); } // get flags and check bool textVisible(progressBarOption->textVisible); bool busy(progressBarOption->minimum == 0 && progressBarOption->maximum == 0); if (!textVisible || busy) { return QRect(); } // get orientation const State &state(option->state); #if QT_VERSION >= 0x060000 bool horizontal(state & QStyle::State_Horizontal); #else bool horizontal((state & QStyle::State_Horizontal) || (progressBarOption->orientation == Qt::Horizontal)); #endif if (!horizontal) { return QRect(); } int textWidth = qMax(option->fontMetrics.size(_mnemonics->textFlags(), progressBarOption->text).width(), option->fontMetrics.size(_mnemonics->textFlags(), QStringLiteral("100%")).width()); QRect rect(insideMargin(option->rect, Metrics::Frame_FrameWidth, 0)); rect.setLeft(rect.right() - textWidth + 1); rect = visualRect(option, rect); return rect; } //___________________________________________________________________________________________________________________ QRect Style::headerArrowRect(const QStyleOption *option, const QWidget *) const { // cast option and check const QStyleOptionHeader *headerOption(qstyleoption_cast(option)); if (!headerOption) { return option->rect; } // check if arrow is necessary if (headerOption->sortIndicator == QStyleOptionHeader::None) { return QRect(); } QRect arrowRect(insideMargin(option->rect, Metrics::Header_MarginWidth)); arrowRect.setLeft(arrowRect.right() - Metrics::Header_ArrowSize + 1); return visualRect(option, arrowRect); } //___________________________________________________________________________________________________________________ QRect Style::headerLabelRect(const QStyleOption *option, const QWidget *) const { // cast option and check const QStyleOptionHeader *headerOption(qstyleoption_cast(option)); if (!headerOption) { return option->rect; } // check if arrow is necessary // QRect labelRect( insideMargin( option->rect, Metrics::Header_MarginWidth ) ); QRect labelRect(insideMargin(option->rect, Metrics::Header_MarginWidth, 0)); if (headerOption->sortIndicator == QStyleOptionHeader::None) { return labelRect; } labelRect.adjust(0, 0, -Metrics::Header_ArrowSize - Metrics::Header_ItemSpacing, 0); return visualRect(option, labelRect); } //___________________________________________________________________________________________________________________ QRect Style::sliderFocusRect(const QStyleOption *option, const QWidget *widget) const { const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); QRect r(option->rect); if (sliderOption->orientation == Qt::Vertical) { int thickness = Slider_GrooveThickness + 8; return QRect(r.center().x() - thickness / 2, r.top() + 1, thickness + 1, r.height() - 1); } else { int thickness = Slider_GrooveThickness + 6; return QRect(r.left() + 1, r.center().y() - thickness / 2, r.width() - 1, thickness + 1); } } //____________________________________________________________________ QRect Style::tabBarTabLeftButtonRect(const QStyleOption *option, const QWidget *) const { // cast option and check const QStyleOptionTab *tabOption(qstyleoption_cast(option)); if (!tabOption || tabOption->leftButtonSize.isEmpty()) { return QRect(); } QRect rect(option->rect); QSize size(tabOption->leftButtonSize); QRect buttonRect(QPoint(0, 0), size); // vertical positioning switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: buttonRect.moveLeft(rect.left() + Metrics::TabBar_TabMarginWidth); buttonRect.moveTop((rect.height() - buttonRect.height()) / 2); buttonRect = visualRect(option, buttonRect); break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: buttonRect.moveBottom(rect.bottom() - Metrics::TabBar_TabMarginWidth); buttonRect.moveLeft((rect.width() - buttonRect.width()) / 2); break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: buttonRect.moveTop(rect.top() + Metrics::TabBar_TabMarginWidth); buttonRect.moveLeft((rect.width() - buttonRect.width()) / 2); break; default: break; } return buttonRect; } //____________________________________________________________________ QRect Style::tabBarTabRightButtonRect(const QStyleOption *option, const QWidget *) const { // cast option and check const QStyleOptionTab *tabOption(qstyleoption_cast(option)); if (!tabOption || tabOption->rightButtonSize.isEmpty()) { return QRect(); } QRect rect(option->rect); QSize size(tabOption->rightButtonSize); QRect buttonRect(QPoint(0, 0), size); // vertical positioning switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: buttonRect.moveRight(rect.right() - Metrics::TabBar_TabMarginWidth); buttonRect.moveTop((rect.height() - buttonRect.height()) / 2); buttonRect = visualRect(option, buttonRect); break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: buttonRect.moveTop(rect.top() + Metrics::TabBar_TabMarginWidth); buttonRect.moveLeft((rect.width() - buttonRect.width()) / 2); break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: buttonRect.moveBottom(rect.bottom() - Metrics::TabBar_TabMarginWidth); buttonRect.moveLeft((rect.width() - buttonRect.width()) / 2); break; default: break; } return buttonRect; } //____________________________________________________________________ QRect Style::tabWidgetTabBarRect(const QStyleOption *option, const QWidget *widget) const { // cast option and check const QStyleOptionTabWidgetFrame *tabOption = qstyleoption_cast(option); if (!tabOption) { return ParentStyleClass::subElementRect(SE_TabWidgetTabBar, option, widget); } // do nothing if tabbar is hidden QSize tabBarSize(tabOption->tabBarSize); QRect rect(option->rect); QRect tabBarRect(QPoint(0, 0), tabBarSize); Qt::Alignment tabBarAlignment(styleHint(SH_TabBar_Alignment, option, widget)); // horizontal positioning bool verticalTabs(isVerticalTab(tabOption->shape)); if (verticalTabs) { tabBarRect.setHeight(qMin(tabBarRect.height(), rect.height() - 2)); if (tabBarAlignment == Qt::AlignCenter) { tabBarRect.moveTop(rect.top() + (rect.height() - tabBarRect.height()) / 2); } else { tabBarRect.moveTop(rect.top() + 1); } } else { // account for corner rects // need to re-run visualRect to remove right-to-left handling, since it is re-added on tabBarRect at the end QRect leftButtonRect(visualRect(option, subElementRect(SE_TabWidgetLeftCorner, option, widget))); QRect rightButtonRect(visualRect(option, subElementRect(SE_TabWidgetRightCorner, option, widget))); rect.setLeft(leftButtonRect.width()); rect.setRight(rightButtonRect.left() - 1); tabBarRect.setWidth(qMin(tabBarRect.width(), rect.width() - 2)); if (tabBarAlignment == Qt::AlignCenter) { tabBarRect.moveLeft(rect.left() + (rect.width() - tabBarRect.width()) / 2); } else { tabBarRect.moveLeft(rect.left() + 1); } tabBarRect = visualRect(option, tabBarRect); } // vertical positioning switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: tabBarRect.moveTop(rect.top() + 1); break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: tabBarRect.moveBottom(rect.bottom() - 1); break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: tabBarRect.moveLeft(rect.left() + 1); break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: tabBarRect.moveRight(rect.right() - 1); break; default: break; } return tabBarRect; } //____________________________________________________________________ QRect Style::tabWidgetTabContentsRect(const QStyleOption *option, const QWidget *widget) const { // cast option and check const QStyleOptionTabWidgetFrame *tabOption = qstyleoption_cast(option); if (!tabOption) { return option->rect; } // do nothing if tabbar is hidden if (tabOption->tabBarSize.isEmpty()) { return option->rect; } QRect rect = tabWidgetTabPaneRect(option, widget); bool documentMode(tabOption->lineWidth == 0); if (documentMode) { // add margin only to the relevant side switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: return rect.adjusted(0, Metrics::TabWidget_MarginWidth, 0, 0); case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: return rect.adjusted(0, 0, 0, -Metrics::TabWidget_MarginWidth); case QTabBar::RoundedWest: case QTabBar::TriangularWest: return rect.adjusted(Metrics::TabWidget_MarginWidth, 0, 0, 0); case QTabBar::RoundedEast: case QTabBar::TriangularEast: return rect.adjusted(0, 0, -Metrics::TabWidget_MarginWidth, 0); default: return rect; } } else { return insideMargin(rect, Metrics::TabWidget_MarginWidth); } } //____________________________________________________________________ QRect Style::tabWidgetTabPaneRect(const QStyleOption *option, const QWidget *) const { const QStyleOptionTabWidgetFrame *tabOption = qstyleoption_cast(option); if (!tabOption || tabOption->tabBarSize.isEmpty()) { return option->rect; } int overlap = Metrics::TabBar_BaseOverlap + 1; QSize tabBarSize(tabOption->tabBarSize - QSize(overlap, overlap)); QRect rect(option->rect); switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: rect.adjust(0, tabBarSize.height(), 0, 0); break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: rect.adjust(0, 0, 0, -tabBarSize.height()); break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: rect.adjust(tabBarSize.width(), 0, 0, 0); break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: rect.adjust(0, 0, -tabBarSize.width(), 0); break; default: return QRect(); } return rect; } //____________________________________________________________________ QRect Style::tabWidgetCornerRect(SubElement element, const QStyleOption *option, const QWidget *) const { // cast option and check const QStyleOptionTabWidgetFrame *tabOption = qstyleoption_cast(option); if (!tabOption) { return option->rect; } // do nothing if tabbar is hidden QSize tabBarSize(tabOption->tabBarSize); if (tabBarSize.isEmpty()) { return QRect(); } // do nothing for vertical tabs bool verticalTabs(isVerticalTab(tabOption->shape)); if (verticalTabs) { return QRect(); } QRect rect(option->rect); QRect cornerRect; switch (element) { case SE_TabWidgetLeftCorner: cornerRect = QRect(QPoint(0, 0), tabOption->leftCornerWidgetSize); cornerRect.moveLeft(rect.left()); break; case SE_TabWidgetRightCorner: cornerRect = QRect(QPoint(0, 0), tabOption->rightCornerWidgetSize); cornerRect.moveRight(rect.right()); break; default: break; } // expend height to tabBarSize, if needed, to make sure base is properly rendered cornerRect.setHeight(qMax(cornerRect.height(), tabBarSize.height() + 1)); switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: cornerRect.moveTop(rect.top()); break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: cornerRect.moveBottom(rect.bottom()); break; default: break; } // return cornerRect; cornerRect = visualRect(option, cornerRect); return cornerRect; } //____________________________________________________________________ QRect Style::toolBoxTabContentsRect(const QStyleOption *option, const QWidget *widget) const { // cast option and check const QStyleOptionToolBox *toolBoxOption(qstyleoption_cast(option)); if (!toolBoxOption) { return option->rect; } // copy rect const QRect &rect(option->rect); int contentsWidth(0); if (!toolBoxOption->icon.isNull()) { int iconSize(pixelMetric(QStyle::PM_SmallIconSize, option, widget)); contentsWidth += iconSize; if (!toolBoxOption->text.isEmpty()) { contentsWidth += Metrics::ToolBox_TabItemSpacing; } } if (!toolBoxOption->text.isEmpty()) { int textWidth = toolBoxOption->fontMetrics.size(_mnemonics->textFlags(), toolBoxOption->text).width(); contentsWidth += textWidth; } contentsWidth += 2 * Metrics::ToolBox_TabMarginWidth; contentsWidth = qMin(contentsWidth, rect.width()); contentsWidth = qMax(contentsWidth, int(Metrics::ToolBox_TabMinWidth)); return centerRect(rect, contentsWidth, rect.height()); } //____________________________________________________________________ QRect Style::genericLayoutItemRect(const QStyleOption *option, const QWidget *widget) const { Q_UNUSED(widget) return insideMargin(option->rect, -Metrics::Frame_FrameWidth); } //______________________________________________________________ QRect Style::groupBoxSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast(option)) { QRect rect = ParentStyleClass::subControlRect(CC_GroupBox, option, subControl, widget); int topMargin = 0; int topHeight = 0; int verticalAlignment = proxy()->styleHint(SH_GroupBox_TextLabelVerticalAlignment, groupBox, widget); if (!groupBox->text.isEmpty()) { topHeight = groupBox->fontMetrics.height(); if (verticalAlignment & Qt::AlignVCenter) { topMargin = topHeight / 2; } else if (verticalAlignment & Qt::AlignTop) { topMargin = topHeight; } } QRect frameRect = groupBox->rect; frameRect.setTop(topMargin); if (subControl == SC_GroupBoxFrame) { return rect; } else if (subControl == SC_GroupBoxContents) { int margin = 0; int leftMarginExtension = 16; return frameRect.adjusted(leftMarginExtension + margin, margin + topHeight, -margin, -margin); } if (const QGroupBox *groupBoxWidget = qobject_cast(widget)) { //Prepare metrics for a bold font QFont font = widget->font(); font.setBold(true); QFontMetrics fontMetrics(font); QSize textRect = fontMetrics.boundingRect(groupBoxWidget->title()).size() + QSize(2, 2); if (subControl == SC_GroupBoxCheckBox) { int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, option, widget); int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, option, widget); rect.setWidth(indicatorWidth); rect.setHeight(indicatorHeight); rect.moveTop((textRect.height() - indicatorHeight) / 2); } else if (subControl == SC_GroupBoxLabel) { rect.setSize(textRect); } } return rect; } return ParentStyleClass::subControlRect(CC_GroupBox, option, subControl, widget); } //___________________________________________________________________________________________________________________ QRect Style::toolButtonSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { // cast option and check const QStyleOptionToolButton *toolButtonOption = qstyleoption_cast(option); if (!toolButtonOption) { return ParentStyleClass::subControlRect(CC_ToolButton, option, subControl, widget); } bool hasPopupMenu(toolButtonOption->features & QStyleOptionToolButton::MenuButtonPopup); const bool hasInlineIndicator(toolButtonOption->features & QStyleOptionToolButton::HasMenu && toolButtonOption->features & QStyleOptionToolButton::PopupDelay && !hasPopupMenu); // store rect const QRect &rect(option->rect); int menuButtonWidth(Metrics::MenuButton_IndicatorWidth); switch (subControl) { case SC_ToolButtonMenu: { // check fratures if (!(hasPopupMenu || hasInlineIndicator)) { return QRect(); } // check features QRect menuRect(rect); menuRect.setLeft(rect.right() - menuButtonWidth + 1); if (hasInlineIndicator) { menuRect.setTop(menuRect.bottom() - menuButtonWidth + 1); } return visualRect(option, menuRect); } case SC_ToolButton: { if (hasPopupMenu) { QRect contentsRect(rect); contentsRect.setRight(rect.right() - menuButtonWidth); return visualRect(option, contentsRect); } else { return rect; } } default: return QRect(); } } //___________________________________________________________________________________________________________________ QRect Style::comboBoxSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { // cast option and check const QStyleOptionComboBox *comboBoxOption(qstyleoption_cast(option)); if (!comboBoxOption) { return ParentStyleClass::subControlRect(CC_ComboBox, option, subControl, widget); } bool editable(comboBoxOption->editable); bool flat(editable && !comboBoxOption->frame); // copy rect QRect rect(option->rect); switch (subControl) { case SC_ComboBoxFrame: return flat ? rect : QRect(); case SC_ComboBoxListBoxPopup: return rect; case SC_ComboBoxArrow: { QRect arrowRect( rect.right() - rect.height() + 1, rect.top(), rect.height(), rect.height()); return arrowRect; } case SC_ComboBoxEditField: { QRect labelRect; int frameWidth(pixelMetric(PM_ComboBoxFrameWidth, option, widget)); labelRect = QRect( rect.left(), rect.top(), rect.width() - rect.height() - 4, rect.height()); // remove margins if (!flat && rect.height() >= option->fontMetrics.height() + 2 * frameWidth) { labelRect.adjust(frameWidth, frameWidth, 0, -frameWidth); } return visualRect(option, labelRect); } default: break; } return ParentStyleClass::subControlRect(CC_ComboBox, option, subControl, widget); } //___________________________________________________________________________________________________________________ QRect Style::spinBoxSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { // cast option and check const QStyleOptionSpinBox *spinBoxOption(qstyleoption_cast(option)); if (!spinBoxOption) { return ParentStyleClass::subControlRect(CC_SpinBox, option, subControl, widget); } bool flat(!spinBoxOption->frame); // copy rect QRect rect(option->rect); switch (subControl) { case SC_SpinBoxFrame: return flat ? QRect() : rect; case SC_SpinBoxUp: if (rect.width() > 2 * rect.height() + 24) { return QRect(rect.right() - rect.height() - 1, rect.top(), rect.height(), rect.height() - 1); } else { return QRect(rect.right() - 0.6 * rect.height(), rect.top(), rect.height() * 0.6, rect.height() / 2 + 3); } case SC_SpinBoxDown: { if (rect.width() > 2 * rect.height() + 24) { return QRect(rect.right() - 2 * rect.height(), rect.top(), rect.height(), rect.height() - 1); } else { return QRect(rect.right() - 0.6 * rect.height(), rect.top() + rect.height() / 2 - 2, rect.height() * 0.6, rect.height() / 2 + 1); } } case SC_SpinBoxEditField: { int frameWidth(pixelMetric(PM_SpinBoxFrameWidth, option, widget)); QRect labelRect; if (rect.width() > 2 * rect.height() + 24) { labelRect = QRect(rect.left(), rect.top(), rect.width() - 2 * rect.height() - frameWidth, rect.height()); } else { labelRect = QRect(rect.left(), rect.top(), rect.width() - 0.6 * rect.height() - frameWidth, rect.height()); } // remove right side line editor margins if (!flat && labelRect.height() >= option->fontMetrics.height() + 2 * frameWidth) { labelRect.adjust(frameWidth, frameWidth, 0, -frameWidth); } return visualRect(option, labelRect); } default: break; } return ParentStyleClass::subControlRect(CC_SpinBox, option, subControl, widget); } //___________________________________________________________________________________________________________________ QRect Style::scrollBarInternalSubControlRect(const QStyleOptionComplex *option, SubControl subControl) const { const QRect &rect = option->rect; const State &state(option->state); bool horizontal(state & State_Horizontal); switch (subControl) { case SC_ScrollBarSubLine: { int majorSize(scrollBarButtonHeight(_subLineButtons)); if (horizontal) { return visualRect(option, QRect(rect.left(), rect.top(), majorSize, rect.height())); } else { return visualRect(option, QRect(rect.left(), rect.top(), rect.width(), majorSize)); } } case SC_ScrollBarAddLine: { int majorSize(scrollBarButtonHeight(_addLineButtons)); if (horizontal) { return visualRect(option, QRect(rect.right() - majorSize + 1, rect.top(), majorSize, rect.height())); } else { return visualRect(option, QRect(rect.left(), rect.bottom() - majorSize + 1, rect.width(), majorSize)); } } default: return QRect(); } } //___________________________________________________________________________________________________________________ QRect Style::scrollBarSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return ParentStyleClass::subControlRect(CC_ScrollBar, option, subControl, widget); } // get relevant state const State &state(option->state); bool horizontal(state & State_Horizontal); switch (subControl) { case SC_ScrollBarSubLine: case SC_ScrollBarAddLine: return QRect(); case SC_ScrollBarGroove: { QRect topRect = visualRect(option, scrollBarInternalSubControlRect(option, SC_ScrollBarSubLine)); QRect bottomRect = visualRect(option, scrollBarInternalSubControlRect(option, SC_ScrollBarAddLine)); QPoint topLeftCorner; QPoint botRightCorner; if (horizontal) { topLeftCorner = QPoint(topRect.right() + 1, topRect.top()); botRightCorner = QPoint(bottomRect.left() - 1, topRect.bottom()); } else { topLeftCorner = QPoint(topRect.left(), topRect.bottom() + 1); botRightCorner = QPoint(topRect.right(), bottomRect.top() - 1); } // define rect return visualRect(option, QRect(topLeftCorner, botRightCorner)); } case SC_ScrollBarSlider: { // handle RTL here to unreflect things if need be QRect groove = visualRect(option, subControlRect(CC_ScrollBar, option, SC_ScrollBarGroove, widget)); groove.adjust(0, 0, 1, 1); if (sliderOption->minimum == sliderOption->maximum) { return groove; } // Figure out how much room there is int space(horizontal ? groove.width() : groove.height()); // Calculate the portion of this space that the slider should occupy int sliderSize = space * qreal(sliderOption->pageStep) / (sliderOption->maximum - sliderOption->minimum + sliderOption->pageStep); sliderSize = qMax(sliderSize, static_cast(Metrics::ScrollBar_MinSliderHeight)); sliderSize = qMin(sliderSize, space); space -= sliderSize; if (space <= 0) { return groove; } int pos = qRound(qreal(sliderOption->sliderPosition - sliderOption->minimum) / (sliderOption->maximum - sliderOption->minimum) * space); if (sliderOption->upsideDown) { pos = space - pos; } if (horizontal) { return visualRect(option, QRect(groove.left() + pos, groove.top(), sliderSize, groove.height())); } else { return visualRect(option, QRect(groove.left(), groove.top() + pos, groove.width(), sliderSize)); } } case SC_ScrollBarSubPage: { // handle RTL here to unreflect things if need be QRect slider = visualRect(option, subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget)); QRect groove = visualRect(option, subControlRect(CC_ScrollBar, option, SC_ScrollBarGroove, widget)); if (horizontal) { return visualRect(option, QRect(groove.left(), groove.top(), slider.left() - groove.left(), groove.height())); } else { return visualRect(option, QRect(groove.left(), groove.top(), groove.width(), slider.top() - groove.top())); } } case SC_ScrollBarAddPage: { // handle RTL here to unreflect things if need be QRect slider = visualRect(option, subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget)); QRect groove = visualRect(option, subControlRect(CC_ScrollBar, option, SC_ScrollBarGroove, widget)); if (horizontal) { return visualRect(option, QRect(slider.right() + 1, groove.top(), groove.right() - slider.right(), groove.height())); } else { return visualRect(option, QRect(groove.left(), slider.bottom() + 1, groove.width(), groove.bottom() - slider.bottom())); } } default: return ParentStyleClass::subControlRect(CC_ScrollBar, option, subControl, widget); } } //___________________________________________________________________________________________________________________ QRect Style::dialSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return ParentStyleClass::subControlRect(CC_Dial, option, subControl, widget); } // adjust rect to be square, and centered QRect rect(option->rect); int dimension(qMin(rect.width(), rect.height())); rect = centerRect(rect, dimension, dimension); switch (subControl) { case QStyle::SC_DialGroove: return insideMargin(rect, (Metrics::Slider_ControlThickness - Metrics::Slider_GrooveThickness) / 2 + 2); case QStyle::SC_DialHandle: { // calculate angle at which handle needs to be drawn qreal angle(dialAngle(sliderOption, sliderOption->sliderPosition)); // groove rect QRectF grooveRect(insideMargin(rect, Metrics::Slider_ControlThickness / 2)); qreal radius(grooveRect.width() / 2); // slider center QPointF center(grooveRect.center() + QPointF(radius * std::cos(angle), -radius * std::sin(angle))); // slider rect QRect handleRect(0, 0, Metrics::Slider_ControlThickness, Metrics::Slider_ControlThickness); handleRect.moveCenter(center.toPoint()); return handleRect; } default: return ParentStyleClass::subControlRect(CC_Dial, option, subControl, widget); } } //___________________________________________________________________________________________________________________ QRect Style::sliderSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return ParentStyleClass::subControlRect(CC_Slider, option, subControl, widget); } switch (subControl) { case SC_SliderGroove: { // direction bool horizontal(sliderOption->orientation == Qt::Horizontal); // get base class rect QRect grooveRect(ParentStyleClass::subControlRect(CC_Slider, option, subControl, widget)); grooveRect = insideMargin(grooveRect, pixelMetric(PM_DefaultFrameWidth, option, widget)); // centering if (horizontal) { grooveRect = centerRect(grooveRect, grooveRect.width(), Metrics::Slider_GrooveThickness); } else { grooveRect = centerRect(grooveRect, Metrics::Slider_GrooveThickness, grooveRect.height()); } return grooveRect; } default: return ParentStyleClass::subControlRect(CC_Slider, option, subControl, widget); } } //______________________________________________________________ QSize Style::checkBoxSizeFromContents(const QStyleOption *, const QSize &contentsSize, const QWidget *) const { // get contents size QSize size(contentsSize); // add focus height size = expandSize(size, 0, Metrics::CheckBox_FocusMarginWidth); // make sure there is enough height for indicator size.setHeight(qMax(size.height(), int(Metrics::CheckBox_Size))); // Add space for the indicator and the icon size.rwidth() += Metrics::CheckBox_Size + Metrics::CheckBox_ItemSpacing; // also add extra space, to leave room to the right of the label size.rwidth() += Metrics::CheckBox_ItemSpacing; return size; } //______________________________________________________________ QSize Style::lineEditSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { // cast option and check const QStyleOptionFrame *frameOption(qstyleoption_cast(option)); if (!frameOption) { return contentsSize; } bool flat(frameOption->lineWidth == 0); int frameWidth(pixelMetric(PM_DefaultFrameWidth, option, widget)); QSize size = flat ? contentsSize : expandSize(contentsSize, frameWidth); size.setHeight(qMax(size.height(), int(Metrics::LineEdit_MinHeight))); size.setWidth(qMax(size.width(), int(Metrics::LineEdit_MinWidth))); return size; } //______________________________________________________________ QSize Style::comboBoxSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { // cast option and check const QStyleOptionComboBox *comboBoxOption(qstyleoption_cast(option)); if (!comboBoxOption) { return contentsSize; } // copy size QSize size(contentsSize); // add relevant margin bool flat(!comboBoxOption->frame); int frameWidth(pixelMetric(PM_ComboBoxFrameWidth, option, widget)); if (!flat) { size = expandSize(size, frameWidth); } size.rwidth() += Metrics::MenuButton_IndicatorWidth; size.rwidth() += Metrics::Button_ItemSpacing; // FIXME this shouldn't be needed but apparently some width is still missing size.rwidth() += size.height(); // make sure there is enough height for the button size.setHeight(qMax(size.height(), int(Metrics::MenuButton_IndicatorWidth))); size = expandSize(size, Metrics::ComboBox_MarginWidth, Metrics::ComboBox_MarginHeight); // set minimum size size.setHeight(qMax(size.height(), int(Metrics::ComboBox_MinHeight))); size.setWidth(qMax(size.width(), int(Metrics::ComboBox_MinWidth))); return size; } //______________________________________________________________ QSize Style::spinBoxSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { // cast option and check const QStyleOptionSpinBox *spinBoxOption(qstyleoption_cast(option)); if (!spinBoxOption) { return contentsSize; } bool flat(!spinBoxOption->frame); // copy size QSize size(contentsSize); // add editor margins int frameWidth(pixelMetric(PM_SpinBoxFrameWidth, option, widget)); if (!flat) { size = expandSize(size, frameWidth); } size.rwidth() += 2 * Metrics::SpinBox_MinHeight; size.rwidth() += Metrics::Button_ItemSpacing; // FIXME this shouldn't be needed but apparently some width is still missing size.rwidth() += size.height() / 2; // set minimum size size.setHeight(qMax(size.height(), int(Metrics::SpinBox_MinHeight))); size.setWidth(qMax(size.width(), int(Metrics::SpinBox_MinWidth))); return size; } //______________________________________________________________ QSize Style::sliderSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *) const { // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return contentsSize; } // store tick position and orientation const QSlider::TickPosition &tickPosition(sliderOption->tickPosition); bool horizontal(sliderOption->orientation == Qt::Horizontal); bool disableTicks(!Adwaita::Config::SliderDrawTickMarks); // do nothing if no ticks are requested if (tickPosition == QSlider::NoTicks) { return contentsSize; } /* * Qt adds its own tick length directly inside QSlider. * Take it out and replace by ours, if needed */ const int tickLength(disableTicks ? 0 : ( Metrics::Slider_TickLength + Metrics::Slider_TickMarginWidth + (Metrics::Slider_GrooveThickness - Metrics::Slider_ControlThickness) / 2)); int builtInTickLength(5); QSize size(contentsSize); if (horizontal) { if (tickPosition & QSlider::TicksAbove) { size.rheight() += tickLength - builtInTickLength; } if (tickPosition & QSlider::TicksBelow) { size.rheight() += tickLength - builtInTickLength; } } else { if (tickPosition & QSlider::TicksAbove) { size.rwidth() += tickLength - builtInTickLength; } if (tickPosition & QSlider::TicksBelow) { size.rwidth() += tickLength - builtInTickLength; } } return size; } //______________________________________________________________ QSize Style::pushButtonSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { // cast option and check const QStyleOptionButton *buttonOption(qstyleoption_cast(option)); if (!buttonOption) { return contentsSize; } // output QSize size; // check text and icon bool hasText(!buttonOption->text.isEmpty()); bool flat(buttonOption->features & QStyleOptionButton::Flat); bool hasIcon(!buttonOption->icon.isNull()); if (!(hasText || hasIcon)) { /* no text nor icon is passed. assume custom button and use contentsSize as a starting point */ size = contentsSize; } else { /* rather than trying to guess what Qt puts into its contents size calculation, we recompute the button size entirely, based on button option this ensures consistency with the rendering stage */ // update has icon to honour showIconsOnPushButtons, when possible hasIcon &= (showIconsOnPushButtons() || flat || !hasText); // text if (hasText) { size = buttonOption->fontMetrics.size(Qt::TextShowMnemonic, buttonOption->text); } // icon if (hasIcon) { QSize iconSize = buttonOption->iconSize; if (!iconSize.isValid()) { iconSize = QSize(pixelMetric(PM_SmallIconSize, option, widget), pixelMetric(PM_SmallIconSize, option, widget)); } size.setHeight(qMax(size.height(), iconSize.height())); size.rwidth() += iconSize.width(); if (hasText) { size.rwidth() += Metrics::Button_ItemSpacing; } } } // menu bool hasMenu(buttonOption->features & QStyleOptionButton::HasMenu); if (hasMenu) { size.rwidth() += Metrics::MenuButton_IndicatorWidth; if (hasText || hasIcon) { size.rwidth() += Metrics::Button_ItemSpacing; } } // expand with buttons margin size = expandSize(size, Metrics::Button_MarginWidth, Button_MarginHeight); // finally add frame margins size = expandSize(size, Metrics::Frame_FrameWidth); // make sure buttons have a minimum width if (hasText) { size.setWidth(qMax(size.width(), int(Metrics::Button_MinWidth))); } // make sure buttons have a minimum height size.setHeight(qMax(size.height(), int(Metrics::Button_MinHeight))); return size; } //______________________________________________________________ QSize Style::toolButtonSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *) const { // cast option and check const QStyleOptionToolButton *toolButtonOption = qstyleoption_cast(option); if (!toolButtonOption) { return contentsSize; } // copy size QSize size = contentsSize; // get relevant state flags bool hasPopupMenu(toolButtonOption->features & QStyleOptionToolButton::MenuButtonPopup); const bool hasInlineIndicator(toolButtonOption->features & QStyleOptionToolButton::HasMenu && toolButtonOption->features & QStyleOptionToolButton::PopupDelay && !hasPopupMenu); int marginWidth(Metrics::ToolButton_MarginWidth); if (hasInlineIndicator) { size.rwidth() += Metrics::ToolButton_InlineIndicatorWidth; } size = expandSize(size, marginWidth); // We need to add 1px as the toolbutton is smaller by 1px when rendering button frame size = expandSize(size, 1); return size; } //______________________________________________________________ QSize Style::menuBarItemSizeFromContents(const QStyleOption *, const QSize &contentsSize, const QWidget *) const { return expandSize(contentsSize, Metrics::MenuBarItem_MarginWidth, Metrics::MenuBarItem_MarginHeight); } //______________________________________________________________ QSize Style::menuItemSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { // cast option and check const QStyleOptionMenuItem *menuItemOption = qstyleoption_cast(option); if (!menuItemOption) { return contentsSize; } /* * First calculate the intrinsic size of the item. * this must be kept consistent with what's in drawMenuItemControl */ QSize size(contentsSize); switch (menuItemOption->menuItemType) { case QStyleOptionMenuItem::Normal: case QStyleOptionMenuItem::DefaultItem: case QStyleOptionMenuItem::SubMenu: { int iconWidth = 0; if (showIconsInMenuItems()) { iconWidth = isQtQuickControl(option, widget) ? qMax(pixelMetric(PM_SmallIconSize, option, widget), menuItemOption->maxIconWidth) : menuItemOption->maxIconWidth; } int leftColumnWidth(iconWidth); // add space with respect to text leftColumnWidth += Metrics::MenuItem_ItemSpacing; // add checkbox indicator width if (menuItemOption->menuHasCheckableItems) { leftColumnWidth += Metrics::CheckBox_Size + Metrics::MenuItem_ItemSpacing; } // add spacing for accelerator /* * Note: * The width of the accelerator itself is not included here since * Qt will add that on separately after obtaining the * sizeFromContents() for each menu item in the menu to be shown * ( see QMenuPrivate::calcActionRects() ) */ bool hasAccelerator(menuItemOption->text.indexOf(QLatin1Char('\t')) >= 0); if (hasAccelerator) { size.rwidth() += Metrics::MenuItem_AcceleratorSpace; } // right column int rightColumnWidth = Metrics::MenuButton_IndicatorWidth + Metrics::MenuItem_ItemSpacing; size.rwidth() += leftColumnWidth + rightColumnWidth; // make sure height is large enough for icon and arrow size.setHeight(qMax(size.height(), int(Metrics::MenuButton_IndicatorWidth))); size.setHeight(qMax(size.height(), int(Metrics::CheckBox_Size))); size.setHeight(qMax(size.height(), iconWidth)); // Looks Gtk adds some additional space to the right size.rwidth() += Metrics::MenuItem_MarginWidth * 4; return expandSize(size, Metrics::MenuItem_MarginWidth); } case QStyleOptionMenuItem::Separator: { if (menuItemOption->text.isEmpty() && menuItemOption->icon.isNull()) { return expandSize(QSize(0, 1), Metrics::MenuItem_MarginWidth, 0); } else { // build toolbutton option QStyleOptionToolButton toolButtonOption(separatorMenuItemOption(menuItemOption, widget)); // make sure height is large enough for icon and text int iconWidth(menuItemOption->maxIconWidth); int textHeight(menuItemOption->fontMetrics.height()); if (!menuItemOption->icon.isNull()) { size.setHeight(qMax(size.height(), iconWidth)); } if (!menuItemOption->text.isEmpty()) { size.setHeight(qMax(size.height(), textHeight)); size.setWidth(qMax(size.width(), menuItemOption->fontMetrics.horizontalAdvance(menuItemOption->text))); } return sizeFromContents(CT_ToolButton, &toolButtonOption, size, widget); } } // for all other cases, return input default: return contentsSize; } } //______________________________________________________________ QSize Style::progressBarSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *) const { // cast option const QStyleOptionProgressBar *progressBarOption(qstyleoption_cast(option)); if (!progressBarOption) { return contentsSize; } const State &state(option->state); #if QT_VERSION >= 0x060000 bool horizontal(state & QStyle::State_Horizontal); #else bool horizontal((state & QStyle::State_Horizontal) || (progressBarOption->orientation == Qt::Horizontal)); #endif // make local copy QSize size(contentsSize); if (horizontal) { // check text visibility bool textVisible(progressBarOption->textVisible); size.setWidth(qMax(size.width(), int(Metrics::ProgressBar_Thickness))); size.setHeight(qMax(size.height(), int(Metrics::ProgressBar_Thickness))); if (textVisible) { size.setHeight(qMax(size.height(), option->fontMetrics.height())); } } else { size.setHeight(qMax(size.height(), int(Metrics::ProgressBar_Thickness))); size.setWidth(qMax(size.width(), int(Metrics::ProgressBar_Thickness))); } return size; } //______________________________________________________________ QSize Style::tabWidgetSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { // cast option and check const QStyleOptionTabWidgetFrame *tabOption = qstyleoption_cast(option); if (!tabOption) { return expandSize(contentsSize, Metrics::TabWidget_MarginWidth); } // try find direct children of type QTabBar and QStackedWidget // this is needed in order to add TabWidget margins only if they are necessary around tabWidget content, not the tabbar if (!widget) { return expandSize(contentsSize, Metrics::TabWidget_MarginWidth); } QTabBar *tabBar = nullptr; QStackedWidget *stack = nullptr; auto children(widget->children()); foreach (auto child, children) { if (!tabBar) { tabBar = qobject_cast(child); } if (!stack) { stack = qobject_cast(child); } if (tabBar && stack) { break; } } if (!(tabBar && stack)) { return expandSize(contentsSize, Metrics::TabWidget_MarginWidth); } // tab orientation bool verticalTabs(tabOption && isVerticalTab(tabOption->shape)); if (verticalTabs) { int tabBarHeight = tabBar->minimumSizeHint().height(); int stackHeight = stack->minimumSizeHint().height(); if (contentsSize.height() == tabBarHeight && tabBarHeight + 2 * (Metrics::Frame_FrameWidth - 1) >= stackHeight + 2 * Metrics::TabWidget_MarginWidth) { return QSize(contentsSize.width() + 2 * Metrics::TabWidget_MarginWidth, contentsSize.height() + 2 * (Metrics::Frame_FrameWidth - 1)); } else { return expandSize(contentsSize, Metrics::TabWidget_MarginWidth); } } else { int tabBarWidth = tabBar->minimumSizeHint().width(); int stackWidth = stack->minimumSizeHint().width(); if (contentsSize.width() == tabBarWidth && tabBarWidth + 2 * (Metrics::Frame_FrameWidth - 1) >= stackWidth + 2 * Metrics::TabWidget_MarginWidth) { return QSize(contentsSize.width() + 2 * (Metrics::Frame_FrameWidth - 1), contentsSize.height() + 2 * Metrics::TabWidget_MarginWidth); } else { return expandSize(contentsSize, Metrics::TabWidget_MarginWidth); } } } //______________________________________________________________ QSize Style::tabBarTabSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *) const { const QStyleOptionTab *tabOption(qstyleoption_cast(option)); bool hasText(tabOption && !tabOption->text.isEmpty()); bool hasIcon(tabOption && !tabOption->icon.isNull()); bool hasLeftButton(tabOption && !tabOption->leftButtonSize.isEmpty()); bool hasRightButton(tabOption && !tabOption->leftButtonSize.isEmpty()); // calculate width increment for horizontal tabs int widthIncrement = 0; if (hasIcon && !(hasText || hasLeftButton || hasRightButton)) { widthIncrement -= 4; } if (hasText && hasIcon) { widthIncrement += Metrics::TabBar_TabItemSpacing; } if (hasLeftButton && (hasText || hasIcon)) { widthIncrement += Metrics::TabBar_TabItemSpacing; } if (hasRightButton && (hasText || hasIcon || hasLeftButton)) { widthIncrement += Metrics::TabBar_TabItemSpacing; } // add margins QSize size(contentsSize); if (hasText) { widthIncrement += option->fontMetrics.horizontalAdvance(tabOption->text) * 0.2; } // compare to minimum size bool verticalTabs(tabOption && isVerticalTab(tabOption)); if (verticalTabs) { size.rheight() += widthIncrement; if (hasIcon && !hasText) { size = size.expandedTo(QSize(Metrics::TabBar_TabMinHeight, 0)); } else { size = size.expandedTo(QSize(Metrics::TabBar_TabMinHeight, Metrics::TabBar_TabMinWidth)); } } else { size.rwidth() += widthIncrement; if (hasIcon && !hasText) { size = size.expandedTo(QSize(0, Metrics::TabBar_TabMinHeight)); } else { size = size.expandedTo(QSize(Metrics::TabBar_TabMinWidth, Metrics::TabBar_TabMinHeight)); } } return size; } //______________________________________________________________ QSize Style::headerSectionSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *) const { // cast option and check const QStyleOptionHeader *headerOption(qstyleoption_cast(option)); if (!headerOption) { return contentsSize; } // get text size bool horizontal(headerOption->orientation == Qt::Horizontal); bool hasText(!headerOption->text.isEmpty()); bool hasIcon(!headerOption->icon.isNull()); QSize textSize(hasText ? headerOption->fontMetrics.size(0, headerOption->text) : QSize()); QSize iconSize(hasIcon ? QSize(22, 22) : QSize()); // contents width int contentsWidth(0); if (hasText) { contentsWidth += textSize.width(); } if (hasIcon) { contentsWidth += iconSize.width(); if (hasText) { contentsWidth += Metrics::Header_ItemSpacing; } } // contents height int contentsHeight(headerOption->fontMetrics.height()); if (hasIcon) { contentsHeight = qMax(contentsHeight, iconSize.height()); } if (horizontal) { // also add space for icon contentsWidth += Metrics::Header_ArrowSize + Metrics::Header_ItemSpacing; contentsHeight = qMax(contentsHeight, int(Metrics::Header_ArrowSize)); } // update contents size, add margins and return QSize size(contentsSize.expandedTo(QSize(contentsWidth, contentsHeight))); return expandSize(size, Metrics::Header_MarginWidth); } //______________________________________________________________ QSize Style::itemViewItemSizeFromContents(const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { // call base class QSize size(ParentStyleClass::sizeFromContents(CT_ItemViewItem, option, contentsSize, widget)); return expandSize(size, Metrics::ItemView_ItemMarginWidth); } //______________________________________________________________ bool Style::drawFramePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // copy palette and rect const QPalette &palette(option->palette); const QRect &rect(option->rect); // detect title widgets const bool isTitleWidget(Adwaita::Config::TitleWidgetDrawFrame && widget && widget->parent() && widget->parent()->inherits("KTitleWidget")); // copy state const State &state(option->state); if (!isTitleWidget && !(state & (State_Sunken | State_Raised))) { return true; } const bool isInputWidget((widget && widget->testAttribute(Qt::WA_Hover)) || (isQtQuickControl(option, widget) && option->styleObject->property("elementType").toString() == QStringLiteral("edit"))); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && isInputWidget && (state & State_MouseOver)); bool hasFocus(enabled && isInputWidget && (state & State_HasFocus)); // focus takes precedence over mouse over _animations->inputWidgetEngine().updateState(widget, AnimationFocus, hasFocus); _animations->inputWidgetEngine().updateState(widget, AnimationHover, mouseOver && !hasFocus); // retrieve animation mode and opacity AnimationMode mode(_animations->inputWidgetEngine().frameAnimationMode(widget)); qreal opacity(_animations->inputWidgetEngine().frameOpacity(widget)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setHasFocus(hasFocus); styleOptions.setMouseOver(mouseOver); styleOptions.setOpacity(opacity); styleOptions.setAnimationMode(mode); styleOptions.setPainter(painter); styleOptions.setRect(rect); // render if (!Adwaita::Config::SidePanelDrawFrame && widget && widget->property(PropertyNames::sidePanelView).toBool()) { bool reverseLayout(option->direction == Qt::RightToLeft); Side side(reverseLayout ? SideRight : SideLeft); styleOptions.setColor(Colors::sidePanelOutlineColor(styleOptions)); Adwaita::Renderer::renderSidePanelFrame(styleOptions, side); } else if (qobject_cast(widget)) { styleOptions.setColor(Colors::frameOutlineColor(styleOptions)); Adwaita::Renderer::renderSquareFrame(styleOptions); } else { styleOptions.setColor(isTitleWidget ? palette.color(widget->backgroundRole()) : QColor()); styleOptions.setOutlineColor(Colors::frameOutlineColor(styleOptions)); Adwaita::Renderer::renderFrame(styleOptions); } return true; } //______________________________________________________________ bool Style::drawFrameLineEditPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // copy palette and rect const QPalette &palette(option->palette); const QRect &rect(option->rect); // make sure there is enough room to render frame if (rect.height() < 2 * Metrics::LineEdit_FrameWidth + option->fontMetrics.height()) { QColor background(palette.currentColorGroup() == QPalette::Disabled ? palette.color(QPalette::Window) : palette.color(QPalette::Base)); painter->setPen(Qt::NoPen); painter->setBrush(background); painter->drawRect(rect); return true; } else { // copy state const State &state(option->state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool hasFocus(enabled && (state & State_HasFocus)); // focus takes precedence over mouse over _animations->inputWidgetEngine().updateState(widget, AnimationFocus, hasFocus); // retrieve animation mode and opacity AnimationMode mode(_animations->inputWidgetEngine().frameAnimationMode(widget)); qreal opacity(_animations->inputWidgetEngine().frameOpacity(widget)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(hasFocus); styleOptions.setOpacity(opacity); styleOptions.setAnimationMode(mode); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setColor(palette.currentColorGroup() == QPalette::Disabled ? palette.color(QPalette::Window) : palette.color(QPalette::Base)); styleOptions.setOutlineColor(Colors::inputOutlineColor(styleOptions)); // render if (qobject_cast(widget)) { Adwaita::Renderer::renderFlatFrame(styleOptions); } else { Adwaita::Renderer::renderFrame(styleOptions); } } return true; } //___________________________________________________________________________________ bool Style::drawFrameFocusRectPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (option->styleObject && option->styleObject->property("elementType") == QLatin1String("button")) { return true; } QRectF rect(QRectF(option->rect).adjusted(0, 0, -1, -1)); const QPalette &palette(option->palette); if (rect.width() < 10) { return true; } QColor outlineColor(Colors::mix(palette.color(QPalette::Window), palette.color(QPalette::WindowText), 0.35)); QPen pen(outlineColor, 1); pen.setStyle(Qt::CustomDashLine); pen.setDashPattern(QVector() << 2 << 1); painter->setRenderHint(QPainter::Antialiasing, false); painter->setPen(pen); painter->drawRoundedRect(rect, 2, 2); return true; } //___________________________________________________________________________________ bool Style::drawFrameMenuPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // only draw frame for (expanded) toolbars and QtQuick controls // do nothing for other cases, for which frame is rendered via drawPanelMenuPrimitive const QPalette &palette(option->palette); bool hasAlpha(_helper->hasAlphaChannel(widget)); StyleOptions styleOptions(painter, option->rect); styleOptions.setColor(Colors::frameBackgroundColor(StyleOptions(palette, _variant))); styleOptions.setOutlineColor(Colors::frameOutlineColor(StyleOptions(palette, _variant))); styleOptions.setColorVariant(_variant); if (qobject_cast(widget) || isQtQuickControl(option, widget)) { Adwaita::Renderer::renderMenuFrame(styleOptions, hasAlpha); } return true; } //______________________________________________________________ bool Style::drawFrameGroupBoxPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *) const { return true; } //___________________________________________________________________________________ bool Style::drawFrameTabWidgetPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionTabWidgetFrame *tabOption(qstyleoption_cast(option)); if (!tabOption) { return true; } // do nothing if tabbar is hidden bool isQtQuickControl(this->isQtQuickControl(option, widget)); if (tabOption->tabBarSize.isEmpty() && !isQtQuickControl) { return true; } // adjust rect to handle overlaps QRect rect(option->rect); QRect tabBarRect(tabOption->tabBarRect); QSize tabBarSize(tabOption->tabBarSize); Corners corners = AllCorners; // adjust corners to deal with oversized tabbars switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: if (isQtQuickControl) { rect.adjust(-1, -1, 1, 0); } if (tabBarSize.width() >= rect.width() - 2 * Metrics::Frame_FrameRadius) { corners &= ~CornersTop; } if (tabBarRect.left() < rect.left() + Metrics::Frame_FrameRadius) { corners &= ~CornerTopLeft; } if (tabBarRect.right() > rect.right() - Metrics::Frame_FrameRadius) { corners &= ~CornerTopRight; } break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: if (isQtQuickControl) { rect.adjust(-1, 0, 1, 1); } if (tabBarSize.width() >= rect.width() - 2 * Metrics::Frame_FrameRadius) { corners &= ~CornersBottom; } if (tabBarRect.left() < rect.left() + Metrics::Frame_FrameRadius) { corners &= ~CornerBottomLeft; } if (tabBarRect.right() > rect.right() - Metrics::Frame_FrameRadius) { corners &= ~CornerBottomRight; } break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: if (isQtQuickControl) { rect.adjust(-1, 0, 0, 0); } if (tabBarSize.height() >= rect.height() - 2 * Metrics::Frame_FrameRadius) { corners &= ~CornersLeft; } if (tabBarRect.top() < rect.top() + Metrics::Frame_FrameRadius) { corners &= ~CornerTopLeft; } if (tabBarRect.bottom() > rect.bottom() - Metrics::Frame_FrameRadius) { corners &= ~CornerBottomLeft; } break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: if (isQtQuickControl) { rect.adjust(0, 0, 1, 0); } if (tabBarSize.height() >= rect.height() - 2 * Metrics::Frame_FrameRadius) { corners &= ~CornersRight; } if (tabBarRect.top() < rect.top() + Metrics::Frame_FrameRadius) { corners &= ~CornerTopRight; } if (tabBarRect.bottom() > rect.bottom() - Metrics::Frame_FrameRadius) { corners &= ~CornerBottomRight; } break; default: break; } // define colors const QPalette &palette(option->palette); StyleOptions styleOptions(painter, rect); styleOptions.setColor(palette.color(QPalette::Base)); styleOptions.setColorVariant(_variant); styleOptions.setOutlineColor(Colors::frameOutlineColor(StyleOptions(palette, _variant))); Adwaita::Renderer::renderTabWidgetFrame(styleOptions, corners); return true; } //___________________________________________________________________________________ bool Style::drawFrameTabBarBasePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *) const { // tabbar frame used either for 'separate' tabbar, or in 'document mode' // cast option and check const QStyleOptionTabBarBase *tabOption(qstyleoption_cast(option)); if (!tabOption) { return true; } // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setState(option->state); // get rect, orientation, palette QRect rect(option->rect); QColor outline(Colors::frameOutlineColor(styleOptions)); QColor background = Colors::tabBarColor(styleOptions); // setup painter painter->setBrush(background); painter->setRenderHint(QPainter::Antialiasing, false); painter->setPen(QPen(outline, 1)); painter->drawRect(rect.adjusted(0, 0, -1, -1)); return true; } //___________________________________________________________________________________ bool Style::drawFrameWindowPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *) const { // copy rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); State state(option->state); bool selected(state & State_Selected); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setMouseOver(false); styleOptions.setHasFocus(selected); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setOutlineColor(Colors::frameOutlineColor(styleOptions)); // render frame outline Adwaita::Renderer::renderMenuFrame(styleOptions); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorArrowPrimitive(ArrowOrientation orientation, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // store rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // store state const State &state(option->state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool hasFocus(enabled && (state & State_HasFocus)); // detect special buttons bool inTabBar(widget && qobject_cast(widget->parentWidget())); bool inToolButton(qstyleoption_cast(option)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(hasFocus); styleOptions.setRect(rect); styleOptions.setPainter(painter); // color QColor color; if (inTabBar) { // for tabbar arrows one uses animations to get the arrow color /* * get animation state * there is no need to update the engine since this was already done when rendering the frame */ AnimationMode mode(_animations->widgetStateEngine().buttonAnimationMode(widget)); qreal opacity(_animations->widgetStateEngine().buttonOpacity(widget)); styleOptions.setAnimationMode(mode); styleOptions.setOpacity(opacity); color = Colors::arrowOutlineColor(styleOptions); } else if (mouseOver && !inToolButton) { color = Colors::hoverColor(styleOptions); } else if (inToolButton) { bool flat(state & State_AutoRaise); // cast option const QStyleOptionToolButton *toolButtonOption(static_cast(option)); bool hasPopupMenu(toolButtonOption->subControls & SC_ToolButtonMenu); if (flat && hasPopupMenu) { // for menu arrows in flat toolbutton one uses animations to get the arrow color // handle arrow over animation bool arrowHover(mouseOver && (toolButtonOption->activeSubControls & SC_ToolButtonMenu)); _animations->toolButtonEngine().updateState(widget, AnimationHover, arrowHover); bool animated(_animations->toolButtonEngine().isAnimated(widget, AnimationHover)); // Style ooptions styleOptions.setAnimationMode(animated ? AnimationHover : AnimationNone); color = Colors::arrowOutlineColor(styleOptions); } else { bool sunken(state & (State_On | State_Sunken)); if (flat) { if (sunken && hasFocus && !mouseOver) { color = palette.color(QPalette::HighlightedText); } else { // Style options styleOptions.setColorRole(QPalette::WindowText); color = Colors::arrowOutlineColor(styleOptions); } } else if (hasFocus && !mouseOver) { color = palette.color(QPalette::HighlightedText); } else { // Style options styleOptions.setColorRole(QPalette::ButtonText); color = Colors::arrowOutlineColor(styleOptions); } } } else { // Style options styleOptions.setColorRole(QPalette::WindowText); color = Colors::arrowOutlineColor(styleOptions); } // render styleOptions.setColor(color); Adwaita::Renderer::renderArrow(styleOptions, orientation); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorHeaderArrowPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *) const { const QStyleOptionHeader *headerOption(qstyleoption_cast(option)); const State &state(option->state); // arrow orientation ArrowOrientation orientation(ArrowNone); if (state & State_UpArrow || (headerOption && headerOption->sortIndicator == QStyleOptionHeader::SortUp)) { orientation = ArrowUp; } else if (state & State_DownArrow || (headerOption && headerOption->sortIndicator == QStyleOptionHeader::SortDown)) { orientation = ArrowDown; } if (orientation == ArrowNone) { return true; } // invert arrows if requested by (hidden) options if (Adwaita::Config::ViewInvertSortIndicator) { orientation = (orientation == ArrowUp) ? ArrowDown : ArrowUp; } // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setState(state); // render styleOptions.setPainter(painter); styleOptions.setRect(option->rect); // define color and polygon for drawing arrow styleOptions.setColor(Colors::headerTextColor(styleOptions)); Adwaita::Renderer::renderArrow(styleOptions, orientation); return true; } //______________________________________________________________ bool Style::drawPanelButtonCommandPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionButton *buttonOption(qstyleoption_cast< const QStyleOptionButton * >(option)); if (!buttonOption) { return true; } // rect and palette const QRect &rect(option->rect); // button state const State &state(option->state); bool enabled(state & State_Enabled); bool windowActive(state & State_Active); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool hasFocus((enabled && (state & State_HasFocus)) && !(widget && widget->focusProxy())); bool sunken(state & (State_On | State_Sunken)); bool flat(buttonOption->features & QStyleOptionButton::Flat); // update animation state // mouse over takes precedence over focus _animations->widgetStateEngine().updateState(widget, AnimationPressed, sunken); _animations->widgetStateEngine().updateState(widget, AnimationHover, mouseOver); AnimationMode mode(_animations->widgetStateEngine().buttonAnimationMode(widget)); qreal opacity(_animations->widgetStateEngine().buttonOpacity(widget)); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(hasFocus); styleOptions.setSunken(sunken); styleOptions.setOpacity(opacity); styleOptions.setAnimationMode(mode); styleOptions.setPainter(painter); styleOptions.setRect(rect); if (flat) { // define colors and render styleOptions.setColor(Colors::toolButtonColor(styleOptions)); Adwaita::Renderer::renderToolButtonFrame(styleOptions); } else { // update button color from palette in case button is default QPalette palette(option->palette); if (enabled && buttonOption->features & QStyleOptionButton::DefaultButton) { QColor button(palette.color(QPalette::Button)); QColor base(palette.color(QPalette::Base)); palette.setColor(QPalette::Button, Colors::mix(button, base, 0.7)); } // render styleOptions.setActive(enabled && windowActive); styleOptions.setColor(Colors::buttonBackgroundColor(styleOptions)); styleOptions.setOutlineColor(Colors::buttonOutlineColor(styleOptions)); Adwaita::Renderer::renderButtonFrame(styleOptions); } return true; } //______________________________________________________________ bool Style::drawPanelButtonToolPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // copy palette and rect QRect rect(option->rect); // store relevant flags const State &state(option->state); bool autoRaise(state & State_AutoRaise); bool enabled(state & State_Enabled); bool windowActive(state & State_Active); bool sunken(state & (State_On | State_Sunken)); bool mouseOver((state & State_Active) && enabled && (option->state & State_MouseOver)); bool hasFocus(enabled && (option->state & (State_HasFocus | State_Sunken))); /* * get animation state * no need to update, this was already done in drawToolButtonComplexControl */ AnimationMode mode(_animations->widgetStateEngine().buttonAnimationMode(widget)); qreal opacity(_animations->widgetStateEngine().buttonOpacity(widget)); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(hasFocus); styleOptions.setSunken(sunken); styleOptions.setOpacity(opacity); styleOptions.setAnimationMode(mode); styleOptions.setPainter(painter); styleOptions.setRect(rect); if (!autoRaise || mouseOver || sunken) { // need to check widget for popup mode, because option is not set properly const QToolButton *toolButton(qobject_cast(widget)); bool hasPopupMenu(toolButton && toolButton->popupMode() == QToolButton::MenuButtonPopup); // render as push button QColor shadow(Colors::shadowColor(styleOptions)); QColor outline(Colors::buttonOutlineColor(styleOptions)); QColor background(Colors::buttonBackgroundColor(styleOptions)); // adjust frame in case of menu if (hasPopupMenu) { painter->setClipRect(rect); rect.adjust(0, 0, Metrics::Frame_FrameRadius + 2, 0); rect = visualRect(option, rect); } styleOptions.setActive(windowActive); styleOptions.setColor(background); styleOptions.setOutlineColor(outline); styleOptions.setRect(rect); // render Adwaita::Renderer::renderButtonFrame(styleOptions); } else { styleOptions.setColor(Colors::toolButtonColor(styleOptions)); Adwaita::Renderer::renderToolButtonFrame(styleOptions); } return true; } //______________________________________________________________ bool Style::drawTabBarPanelButtonToolPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // copy palette and rect QRect rect(option->rect); // static_cast is safe here since check was already performed in calling function const QTabBar *tabBar(static_cast(widget->parentWidget())); // overlap. // subtract 1, because of the empty pixel left the tabwidget frame int overlap(Metrics::TabBar_BaseOverlap - 1); // adjust rect based on tabbar shape switch (tabBar->shape()) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: rect.adjust(0, 0, 0, -overlap); break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: rect.adjust(0, overlap, 0, 0); break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: rect.adjust(0, 0, -overlap, 0); break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: rect.adjust(overlap, 0, 0, 0); break; default: break; } // get the relevant palette const QWidget *parent(tabBar->parentWidget()); if (qobject_cast(parent)) { parent = parent->parentWidget(); } QPalette palette(parent ? parent->palette() : QApplication::palette()); QColor color = hasAlteredBackground(parent) ? Colors::frameBackgroundColor(StyleOptions(palette, _variant)) : palette.color(QPalette::Window); // render flat background painter->setPen(Qt::NoPen); painter->setBrush(color); painter->drawRect(rect); return true; } //___________________________________________________________________________________ bool Style::drawPanelScrollAreaCornerPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // make sure background role matches viewport const QAbstractScrollArea *scrollArea; if ((scrollArea = qobject_cast(widget)) && scrollArea->viewport()) { // need to adjust clipRect in order not to render outside of frame int frameWidth(pixelMetric(PM_DefaultFrameWidth, 0, scrollArea)); painter->setClipRect(insideMargin(scrollArea->rect(), frameWidth)); painter->setBrush(scrollArea->viewport()->palette().color(scrollArea->viewport()->backgroundRole())); painter->setPen(Qt::NoPen); painter->drawRect(option->rect); return true; } else { return false; } } //___________________________________________________________________________________ bool Style::drawPanelMenuPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { /* * do nothing if menu is embedded in another widget * this corresponds to having a transparent background */ if (widget && !widget->isWindow()) { return true; } const QPalette &palette(option->palette); bool hasAlpha(_helper->hasAlphaChannel(widget)); StyleOptions styleOptions(painter, option->rect); styleOptions.setColor(Colors::frameBackgroundColor(StyleOptions(palette, _variant))); styleOptions.setColorVariant(_variant); styleOptions.setOutlineColor(Colors::frameOutlineColor(StyleOptions(palette, _variant))); Adwaita::Renderer::renderMenuFrame(styleOptions, hasAlpha); return true; } //___________________________________________________________________________________ bool Style::drawPanelTipLabelPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { const QPalette &palette(option->palette); QColor background(palette.color(QPalette::ToolTipBase)); bool hasAlpha(_helper->hasAlphaChannel(widget)); if (hasAlpha) { int alpha = styleHint(SH_ToolTipLabel_Opacity, option, widget); int h, s, l, a; background.getHsl(&h, &s, &l, &a); background = QColor::fromHsl(h, s, l, alpha); } StyleOptions styleOptions(painter, option->rect); styleOptions.setColor(background); styleOptions.setColorVariant(_variant); styleOptions.setOutlineColor(Colors::transparentize(QColor("black"), 0.3)); Adwaita::Renderer::renderMenuFrame(styleOptions, hasAlpha); return true; } //__________________________________________________________________________________ bool Style::drawPanelItemViewRowPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { const QStyleOptionViewItem *vopt = qstyleoption_cast(option); if (!vopt) { return false; } QPalette::ColorGroup cg = (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled)) ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !(vopt->state & QStyle::State_Active)) { cg = QPalette::Inactive; } if ((vopt->state & QStyle::State_Selected) && proxy()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected, option, widget)) { painter->fillRect(vopt->rect, vopt->palette.color(cg, QPalette::Highlight)); } return true; } //___________________________________________________________________________________ bool Style::drawPanelItemViewItemPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionViewItem *viewItemOption = qstyleoption_cast(option); if (!viewItemOption) { return false; } // store palette and rect const QPalette &palette(option->palette); QRect rect(option->rect); // store flags const State &state(option->state); bool selected(state & State_Selected); bool enabled(state & State_Enabled); bool windowActive(state & State_Active); bool hasCustomBackground = viewItemOption->backgroundBrush.style() != Qt::NoBrush && !(state & State_Selected); bool hasSolidBackground = !hasCustomBackground || viewItemOption->backgroundBrush.style() == Qt::SolidPattern; // do nothing if no background is to be rendered if (!(selected || hasCustomBackground)) { return true; } // define color group QPalette::ColorGroup colorGroup; if (enabled) { colorGroup = windowActive ? QPalette::Active : QPalette::Inactive; } else { colorGroup = QPalette::Disabled; } // render custom background if (hasCustomBackground && !hasSolidBackground) { painter->setBrushOrigin(viewItemOption->rect.topLeft()); painter->setBrush(viewItemOption->backgroundBrush); painter->setPen(Qt::NoPen); painter->drawRect(viewItemOption->rect); return true; } // render selection // define color QColor color; if (hasCustomBackground && hasSolidBackground) { color = viewItemOption->backgroundBrush.color(); } else { color = palette.color(colorGroup, QPalette::Highlight); } // render StyleOptions styleOptions(painter, rect); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderSelection(styleOptions); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorCheckBoxPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // copy rect and palette const QRect &rect(option->rect.adjusted(1, 1, -1, -1)); const QPalette &palette(option->palette); // store flags const State &state(option->state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool sunken(enabled && (state & State_Sunken)); bool active((state & (State_On | State_NoChange))); bool windowActive(state & State_Active); // checkbox state CheckBoxState checkBoxState(CheckOff); if (state & State_NoChange) { checkBoxState = CheckPartial; } else if (state & State_On) { checkBoxState = CheckOn; } // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(false); styleOptions.setSunken(sunken); styleOptions.setOpacity(AnimationData::OpacityInvalid); styleOptions.setAnimationMode(AnimationNone); styleOptions.setCheckboxState(checkBoxState); styleOptions.setPainter(painter); styleOptions.setRect(rect); // detect checkboxes in lists bool isSelectedItem(this->isSelectedItem(widget, rect.center())); // animation state _animations->widgetStateEngine().updateState(widget, AnimationHover, mouseOver); if (checkBoxState != CheckPartial) { _animations->widgetStateEngine().updateState(widget, AnimationPressed, checkBoxState != CheckOff); if (_animations->widgetStateEngine().isAnimated(widget, AnimationPressed) && checkBoxState == CheckOn) { checkBoxState = CheckAnimated; } } qreal animation(_animations->widgetStateEngine().opacity(widget, AnimationPressed)); QColor tickColor; if (isSelectedItem) { // Style options styleOptions.setActive(enabled && active); tickColor = Colors::checkBoxIndicatorColor(styleOptions); styleOptions.setColor(palette.color(QPalette::Base)); Adwaita::Renderer::renderCheckBoxBackground(styleOptions); } else { AnimationMode mode(_animations->widgetStateEngine().isAnimated(widget, AnimationHover) ? AnimationHover : AnimationNone); qreal opacity(_animations->widgetStateEngine().opacity(widget, AnimationHover)); // Style options styleOptions.setAnimationMode(mode); styleOptions.setOpacity(opacity); styleOptions.setActive(enabled && active); tickColor = Colors::checkBoxIndicatorColor(styleOptions); } // render styleOptions.setActive(enabled && windowActive); styleOptions.setColor(Colors::indicatorBackgroundColor(styleOptions)); styleOptions.setCheckboxState(checkBoxState); styleOptions.setOutlineColor(Colors::indicatorOutlineColor(styleOptions)); Adwaita::Renderer::renderCheckBox(styleOptions, tickColor, animation); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorRadioButtonPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // copy rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // store flags const State &state(option->state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool sunken(state & State_Sunken); bool checked(state & State_On); bool windowActive(state & State_Active); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(false); styleOptions.setSunken(sunken); styleOptions.setOpacity(AnimationData::OpacityInvalid); styleOptions.setAnimationMode(AnimationNone); styleOptions.setCheckboxState(checked ? CheckOn : CheckOff); styleOptions.setPainter(painter); styleOptions.setRect(rect); // radio button state RadioButtonState radioButtonState(state & State_On ? RadioOn : RadioOff); // detect radiobuttons in lists bool isSelectedItem(this->isSelectedItem(widget, rect.center())); // animation state _animations->widgetStateEngine().updateState(widget, AnimationHover, mouseOver); _animations->widgetStateEngine().updateState(widget, AnimationPressed, radioButtonState != RadioOff); if (_animations->widgetStateEngine().isAnimated(widget, AnimationPressed)) { radioButtonState = RadioAnimated; } qreal animation(_animations->widgetStateEngine().opacity(widget, AnimationPressed)); // colors QColor shadow(Colors::shadowColor(StyleOptions(palette, _variant))); QColor tickColor; if (isSelectedItem) { // Style options styleOptions.setActive(enabled && checked); tickColor = Colors::checkBoxIndicatorColor(styleOptions); styleOptions.setColor(palette.color(QPalette::Base)); Adwaita::Renderer::renderRadioButtonBackground(styleOptions); } else { AnimationMode mode(_animations->widgetStateEngine().isAnimated(widget, AnimationHover) ? AnimationHover : AnimationNone); qreal opacity(_animations->widgetStateEngine().opacity(widget, AnimationHover)); // Style options styleOptions.setAnimationMode(mode); styleOptions.setOpacity(opacity); styleOptions.setActive(enabled && checked); tickColor = Colors::checkBoxIndicatorColor(styleOptions); } // render styleOptions.setActive(enabled && windowActive); styleOptions.setColor(Colors::indicatorBackgroundColor(styleOptions)); styleOptions.setInMenu(false); styleOptions.setOutlineColor(Colors::indicatorOutlineColor(styleOptions)); styleOptions.setRadioButtonState(radioButtonState); Adwaita::Renderer::renderRadioButton(styleOptions, tickColor, animation); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorButtonDropDownPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionToolButton *toolButtonOption(qstyleoption_cast(option)); if (!toolButtonOption) { return true; } // store state const State &state(option->state); bool autoRaise(state & State_AutoRaise); bool enabled(state & State_Enabled); bool windowActive(state & State_Active); bool hasFocus(enabled && (state & (State_HasFocus | State_Sunken))); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool sunken(enabled && (state & State_Sunken)); // do nothing for autoraise buttons if ((autoRaise && !sunken && !mouseOver) || !(toolButtonOption->subControls & SC_ToolButtonMenu)) { return true; } // store palette and rect const QRect &rect(option->rect); // update animation state // mouse over takes precedence over focus _animations->widgetStateEngine().updateState(widget, AnimationPressed, sunken); _animations->widgetStateEngine().updateState(widget, AnimationHover, mouseOver); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(false); styleOptions.setSunken(sunken); styleOptions.setOpacity(AnimationData::OpacityInvalid); styleOptions.setAnimationMode(AnimationNone); QRect frameRect(rect); painter->setClipRect(rect); frameRect.adjust(-Metrics::Frame_FrameRadius - 1, 0, 0, 0); frameRect = visualRect(option, frameRect); // render styleOptions.setPainter(painter); styleOptions.setRect(frameRect); styleOptions.setColor(Colors::buttonBackgroundColor(styleOptions)); styleOptions.setOutlineColor(Colors::buttonOutlineColor(styleOptions)); styleOptions.setHasFocus(hasFocus); styleOptions.setActive(windowActive); Adwaita::Renderer::renderButtonFrame(styleOptions); // also render separator QRect separatorRect(rect.adjusted(0, 2, -2, -2)); separatorRect.setWidth(1); separatorRect = visualRect(option, separatorRect); styleOptions.setRect(separatorRect); Adwaita::Renderer::renderSeparator(styleOptions, true); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorTabClosePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // get icon and check QIcon icon(standardIcon(SP_TitleBarCloseButton, option, widget)); if (icon.isNull()) { return false; } // store state const State &state(option->state); bool enabled(state & State_Enabled); bool active(state & State_Raised); bool sunken(state & State_Sunken); // decide icon mode and state QIcon::Mode iconMode; QIcon::State iconState; if (!enabled) { iconMode = QIcon::Disabled; iconState = QIcon::Off; } else { if (active) { iconMode = QIcon::Active; } else { iconMode = QIcon::Normal; } iconState = sunken ? QIcon::On : QIcon::Off; } // icon size int iconWidth(pixelMetric(QStyle::PM_SmallIconSize, option, widget)); QSize iconSize(iconWidth, iconWidth); // get pixmap QPixmap pixmap(icon.pixmap(iconSize, iconMode, iconState)); // render drawItemPixmap(painter, option->rect, Qt::AlignCenter, pixmap); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorTabTearPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *) const { // cast option and check const QStyleOptionTab *tabOption(qstyleoption_cast(option)); if (!tabOption) { return true; } // store palette and rect const QPalette &palette(option->palette); QRect rect(option->rect); bool reverseLayout(option->direction == Qt::RightToLeft); QColor color(Colors::alphaColor(palette.color(QPalette::WindowText), 0.2)); painter->setRenderHint(QPainter::Antialiasing, false); painter->setPen(color); painter->setBrush(Qt::NoBrush); switch (tabOption->shape) { case QTabBar::TriangularNorth: case QTabBar::RoundedNorth: rect.adjust(0, 1, 0, 0); if (reverseLayout) { painter->drawLine(rect.topRight(), rect.bottomRight()); } else { painter->drawLine(rect.topLeft(), rect.bottomLeft()); } break; case QTabBar::TriangularSouth: case QTabBar::RoundedSouth: rect.adjust(0, 0, 0, -1); if (reverseLayout) { painter->drawLine(rect.topRight(), rect.bottomRight()); } else { painter->drawLine(rect.topLeft(), rect.bottomLeft()); } break; case QTabBar::TriangularWest: case QTabBar::RoundedWest: rect.adjust(1, 0, 0, 0); painter->drawLine(rect.topLeft(), rect.topRight()); break; case QTabBar::TriangularEast: case QTabBar::RoundedEast: rect.adjust(0, 0, -1, 0); painter->drawLine(rect.topLeft(), rect.topRight()); break; default: break; } return true; } //___________________________________________________________________________________ bool Style::drawIndicatorToolBarHandlePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *) const { // do nothing if disabled from options if (!Adwaita::Config::ToolBarDrawItemSeparator) { return true; } // store rect and palette QRect rect(option->rect); // store state const State &state(option->state); bool separatorIsVertical(state & State_Horizontal); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setPainter(painter); styleOptions.setColor(Colors::separatorColor(styleOptions)); if (separatorIsVertical) { rect.setWidth(Metrics::ToolBar_HandleWidth); rect = centerRect(option->rect, rect.size()); rect.setWidth(3); styleOptions.setRect(rect); Adwaita::Renderer::renderSeparator(styleOptions, separatorIsVertical); rect.translate(2, 0); styleOptions.setRect(rect); Adwaita::Renderer::renderSeparator(styleOptions, separatorIsVertical); } else { rect.setHeight(Metrics::ToolBar_HandleWidth); rect = centerRect(option->rect, rect.size()); rect.setHeight(3); styleOptions.setRect(rect); Adwaita::Renderer::renderSeparator(styleOptions, separatorIsVertical); rect.translate(0, 2); styleOptions.setRect(rect); Adwaita::Renderer::renderSeparator(styleOptions, separatorIsVertical); } return true; } //___________________________________________________________________________________ bool Style::drawIndicatorToolBarSeparatorPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { /* * do nothing if disabled from options * also need to check if widget is a combobox, because of Qt hack using 'toolbar' separator primitive * for rendering separators in comboboxes */ if (!(Adwaita::Config::ToolBarDrawItemSeparator || qobject_cast(widget))) { return true; } // store rect and palette const QRect &rect(option->rect); // store state const State &state(option->state); bool separatorIsVertical(state & State_Horizontal); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setColor(Colors::separatorColor(styleOptions)); // define color and render Adwaita::Renderer::renderSeparator(styleOptions, separatorIsVertical); return true; } //___________________________________________________________________________________ bool Style::drawIndicatorBranchPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *) const { // copy rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // state const State &state(option->state); bool reverseLayout(option->direction == Qt::RightToLeft); //draw expander int expanderAdjust = 0; if (state & State_Children) { // state bool expanderOpen(state & State_Open); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); // expander rect int expanderSize = qMin(rect.width(), rect.height()); expanderSize = qMin(expanderSize, int(Metrics::ItemView_ArrowSize)); expanderAdjust = expanderSize / 2 + 1; QRect arrowRect = centerRect(rect, expanderSize, expanderSize); // get orientation from option ArrowOrientation orientation; if (expanderOpen) { orientation = ArrowDown; } else if (reverseLayout) { orientation = ArrowLeft; } else { orientation = ArrowRight; } // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setColorRole(QPalette::Text); styleOptions.setPainter(painter); styleOptions.setRect(arrowRect); styleOptions.setColor(mouseOver ? Colors::hoverColor(StyleOptions(palette, _variant)) : Colors::arrowOutlineColor(styleOptions)); // render Adwaita::Renderer::renderArrow(styleOptions, orientation); } // tree branches if (!Adwaita::Config::ViewDrawTreeBranchLines) { return true; } QPoint center(rect.center()); QColor lineColor(Colors::mix(palette.color(QPalette::Base), palette.color(QPalette::Text), 0.25)); painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); painter->translate(0.5, 0.5); painter->setPen(QPen(lineColor, 1)); if (state & (State_Item | State_Children | State_Sibling)) { QLineF line(QPointF(center.x(), rect.top()), QPointF(center.x(), center.y() - expanderAdjust - 1)); painter->drawLine(line); } // The right/left (depending on direction) line gets drawn if we have an item if (state & State_Item) { const QLineF line = reverseLayout ? QLineF(QPointF(rect.left(), center.y()), QPointF(center.x() - expanderAdjust, center.y())) : QLineF(QPointF(center.x() + expanderAdjust, center.y()), QPointF(rect.right(), center.y())); painter->drawLine(line); } // The bottom if we have a sibling if (state & State_Sibling) { QLineF line(QPointF(center.x(), center.y() + expanderAdjust), QPointF(center.x(), rect.bottom())); painter->drawLine(line); } painter->restore(); return true; } //___________________________________________________________________________________ bool Style::drawPushButtonLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionButton *buttonOption(qstyleoption_cast(option)); if (!buttonOption) { return true; } // copy rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // state const State &state(option->state); bool enabled(state & State_Enabled); bool sunken(state & (State_On | State_Sunken)); bool mouseOver((state & State_Active) && enabled && (option->state & State_MouseOver)); bool hasFocus(enabled && !mouseOver && (option->state & State_HasFocus)); bool flat(buttonOption->features & QStyleOptionButton::Flat); // content bool hasText(!buttonOption->text.isEmpty()); bool hasIcon((showIconsOnPushButtons() || flat || !hasText) && !buttonOption->icon.isNull()); // contents QRect contentsRect(rect); // color role QPalette::ColorRole textRole; if (flat) { if (hasFocus && sunken) { textRole = QPalette::ButtonText; } else { textRole = QPalette::WindowText; } } else if (hasFocus) { textRole = QPalette::ButtonText; } else { textRole = QPalette::ButtonText; } // menu arrow if (buttonOption->features & QStyleOptionButton::HasMenu) { // define rect QRect arrowRect(contentsRect); arrowRect.setLeft(contentsRect.right() - Metrics::MenuButton_IndicatorWidth + 1); arrowRect = centerRect(arrowRect, Metrics::MenuButton_IndicatorWidth, Metrics::MenuButton_IndicatorWidth); contentsRect.setRight(arrowRect.left() - Metrics::Button_ItemSpacing - 1); contentsRect.adjust(Metrics::Button_MarginWidth, 0, 0, 0); arrowRect = visualRect(option, arrowRect); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setColorRole(textRole); styleOptions.setPainter(painter); styleOptions.setRect(arrowRect); styleOptions.setColor(Colors::arrowOutlineColor(styleOptions)); Adwaita::Renderer::renderArrow(styleOptions, ArrowDown); } // icon size QSize iconSize; if (hasIcon) { iconSize = buttonOption->iconSize; if (!iconSize.isValid()) { int metric(pixelMetric(PM_SmallIconSize, option, widget)); iconSize = QSize(metric, metric); } } // text size int textFlags(_mnemonics->textFlags() | Qt::AlignCenter); QSize textSize(option->fontMetrics.size(textFlags, buttonOption->text)); // adjust text and icon rect based on options QRect iconRect; QRect textRect; if (hasText && !hasIcon) { textRect = contentsRect; } else if (hasIcon && !hasText) { iconRect = contentsRect; } else { int contentsWidth(iconSize.width() + textSize.width() + Metrics::Button_ItemSpacing); iconRect = QRect(QPoint(contentsRect.left() + (contentsRect.width() - contentsWidth) / 2, contentsRect.top() + (contentsRect.height() - iconSize.height()) / 2), iconSize); textRect = QRect(QPoint(iconRect.right() + Metrics::ToolButton_ItemSpacing + 1, contentsRect.top() + (contentsRect.height() - textSize.height()) / 2), textSize); } // handle right to left if (iconRect.isValid()) { iconRect = visualRect(option, iconRect); } if (textRect.isValid()) { textRect = visualRect(option, textRect); } // make sure there is enough room for icon if (iconRect.isValid()) { iconRect = centerRect(iconRect, iconSize); } // render icon if (hasIcon && iconRect.isValid()) { // icon state and mode const QIcon::State iconState(sunken ? QIcon::On : QIcon::Off); QIcon::Mode iconMode; if (!enabled) { iconMode = QIcon::Disabled; } else if (!flat && hasFocus) { iconMode = QIcon::Selected; } else if (mouseOver && flat) { iconMode = QIcon::Active; } else { iconMode = QIcon::Normal; } QPixmap pixmap = buttonOption->icon.pixmap(iconSize, iconMode, iconState); drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap); } // render text if (hasText && textRect.isValid()) { if (enabled && !sunken && !mouseOver && !flat) { if (_dark) { drawItemText(painter, textRect.adjusted(0, -1, 0, -1), textFlags, palette, false, buttonOption->text, QPalette::Dark); } else { drawItemText(painter, textRect.adjusted(0, 1, 0, 1), textFlags, palette, false, buttonOption->text, QPalette::Light); } } drawItemText(painter, textRect, textFlags, palette, enabled, buttonOption->text, textRole); } return true; } //___________________________________________________________________________________ bool Style::drawToolButtonLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionToolButton *toolButtonOption(qstyleoption_cast(option)); // copy rect and palette const QRect &rect = option->rect; const QPalette &palette = option->palette; // state const State &state(option->state); bool enabled(state & State_Enabled); bool sunken(state & (State_On | State_Sunken)); bool mouseOver((state & State_Active) && enabled && (option->state & State_MouseOver)); bool flat(state & State_AutoRaise); // focus flag is set to match the background color in either renderButtonFrame or renderToolButtonFrame bool hasFocus(false); if (flat) { hasFocus = enabled && !mouseOver && (option->state & State_HasFocus); } else { hasFocus = enabled && !mouseOver && (option->state & (State_HasFocus | State_Sunken)); } bool hasArrow(toolButtonOption->features & QStyleOptionToolButton::Arrow); bool hasIcon(!(hasArrow || toolButtonOption->icon.isNull())); bool hasText(!toolButtonOption->text.isEmpty()); // contents QRect contentsRect(rect); // icon size QSize iconSize(toolButtonOption->iconSize); // text size int textFlags(_mnemonics->textFlags()); QSize textSize(option->fontMetrics.size(textFlags, toolButtonOption->text)); // adjust text and icon rect based on options QRect iconRect; QRect textRect; if (hasText && (!(hasArrow || hasIcon) || toolButtonOption->toolButtonStyle == Qt::ToolButtonTextOnly)) { // text only textRect = contentsRect; textFlags |= Qt::AlignCenter; } else if ((hasArrow || hasIcon) && (!hasText || toolButtonOption->toolButtonStyle == Qt::ToolButtonIconOnly)) { // icon only iconRect = contentsRect; } else if (toolButtonOption->toolButtonStyle == Qt::ToolButtonTextUnderIcon) { int contentsHeight(iconSize.height() + textSize.height() + Metrics::ToolButton_ItemSpacing); iconRect = QRect(QPoint(contentsRect.left() + (contentsRect.width() - iconSize.width()) / 2, contentsRect.top() + (contentsRect.height() - contentsHeight) / 2), iconSize); textRect = QRect(QPoint(contentsRect.left() + (contentsRect.width() - textSize.width()) / 2, iconRect.bottom() + Metrics::ToolButton_ItemSpacing + 1), textSize); textFlags |= Qt::AlignCenter; } else { bool leftAlign(widget && widget->property(PropertyNames::toolButtonAlignment).toInt() == Qt::AlignLeft); if (leftAlign) { iconRect = QRect(QPoint(contentsRect.left(), contentsRect.top() + (contentsRect.height() - iconSize.height()) / 2), iconSize); } else { int contentsWidth(iconSize.width() + textSize.width() + Metrics::ToolButton_ItemSpacing); iconRect = QRect(QPoint(contentsRect.left() + (contentsRect.width() - contentsWidth) / 2, contentsRect.top() + (contentsRect.height() - iconSize.height()) / 2), iconSize); } textRect = QRect(QPoint(iconRect.right() + Metrics::ToolButton_ItemSpacing + 1, contentsRect.top() + (contentsRect.height() - textSize.height()) / 2), textSize); // handle right to left layouts iconRect = visualRect(option, iconRect); textRect = visualRect(option, textRect); textFlags |= Qt::AlignLeft | Qt::AlignVCenter; } // make sure there is enough room for icon if (iconRect.isValid()) { iconRect = centerRect(iconRect, iconSize); } // render arrow or icon if (hasArrow && iconRect.isValid()) { QStyleOptionToolButton copy(*toolButtonOption); copy.rect = iconRect; switch (toolButtonOption->arrowType) { case Qt::LeftArrow: drawPrimitive(PE_IndicatorArrowLeft, ©, painter, widget); break; case Qt::RightArrow: drawPrimitive(PE_IndicatorArrowRight, ©, painter, widget); break; case Qt::UpArrow: drawPrimitive(PE_IndicatorArrowUp, ©, painter, widget); break; case Qt::DownArrow: drawPrimitive(PE_IndicatorArrowDown, ©, painter, widget); break; default: break; } } else if (hasIcon && iconRect.isValid()) { // icon state and mode const QIcon::State iconState(sunken ? QIcon::On : QIcon::Off); QIcon::Mode iconMode; if (!enabled) { iconMode = QIcon::Disabled; } else if (!flat && hasFocus) { iconMode = QIcon::Selected; } else if (mouseOver && flat) { iconMode = QIcon::Active; } else { iconMode = QIcon::Normal; } QPixmap pixmap = toolButtonOption->icon.pixmap(iconSize, iconMode, iconState); drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap); } // render text if (hasText && textRect.isValid()) { QPalette::ColorRole textRole(QPalette::ButtonText); if (flat) { textRole = (hasFocus && sunken && !mouseOver) ? QPalette::HighlightedText : QPalette::WindowText; } else if (hasFocus && !mouseOver) { textRole = QPalette::HighlightedText; } painter->setFont(toolButtonOption->font); drawItemText(painter, textRect, textFlags, palette, enabled, toolButtonOption->text, textRole); } return true; } //___________________________________________________________________________________ bool Style::drawCheckBoxLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionButton *buttonOption(qstyleoption_cast(option)); if (!buttonOption) { return true; } // copy palette and rect const QPalette &palette(option->palette); const QRect &rect(option->rect); // store state const State &state(option->state); bool enabled(state & State_Enabled); // text alignment bool reverseLayout(option->direction == Qt::RightToLeft); int textFlags(_mnemonics->textFlags() | Qt::AlignVCenter | (reverseLayout ? Qt::AlignRight : Qt::AlignLeft)); // text rect QRect textRect(rect); // render icon if (!buttonOption->icon.isNull()) { const QIcon::Mode mode(enabled ? QIcon::Normal : QIcon::Disabled); QPixmap pixmap(buttonOption->icon.pixmap(buttonOption->iconSize, mode)); drawItemPixmap(painter, rect, textFlags, pixmap); // adjust rect (copied from QCommonStyle) textRect.setLeft(textRect.left() + buttonOption->iconSize.width() + 4); textRect = visualRect(option, textRect); } // render text if (!buttonOption->text.isEmpty()) { textRect = option->fontMetrics.boundingRect(textRect, textFlags, buttonOption->text); drawItemText(painter, textRect, textFlags, palette, enabled, buttonOption->text, QPalette::Text); } return true; } //___________________________________________________________________________________ bool Style::drawComboBoxLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { const QStyleOptionComboBox *comboBoxOption(qstyleoption_cast(option)); if (!comboBoxOption) { return false; } if (comboBoxOption->editable) { return false; } QPalette::ColorRole textRole = QPalette::ButtonText; // change pen color directly painter->save(); painter->setPen(QPen(option->palette.color(textRole), 1)); if (const QStyleOptionComboBox *cb = qstyleoption_cast(option)) { QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget); painter->save(); painter->setClipRect(editRect); if (!cb->currentIcon.isNull() && qobject_cast(widget)) { QIcon::Mode mode; if ((cb->state & QStyle::State_Selected) && (cb->state & QStyle::State_Active)) { mode = QIcon::Selected; } else if (cb->state & QStyle::State_Enabled) { mode = QIcon::Normal; } else { mode = QIcon::Disabled; } QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode); QRect iconRect(editRect); iconRect.setWidth(cb->iconSize.width() + 4); iconRect = alignedRect(cb->direction, Qt::AlignLeft | Qt::AlignVCenter, iconRect.size(), editRect); if (cb->editable) { painter->fillRect(iconRect, option->palette.brush(QPalette::Base)); } proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap); if (cb->direction == Qt::RightToLeft) { editRect.translate(-4 - cb->iconSize.width(), 0); } else { editRect.translate(cb->iconSize.width() + 4, 0); } } if (!cb->currentText.isEmpty() && !cb->editable) { proxy()->drawItemText(painter, editRect.adjusted(Metrics::ComboBox_MarginWidth, 0, -1, 0), visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter), cb->palette, cb->state & State_Enabled, cb->currentText); } painter->restore(); } painter->restore(); return true; } // bool Style::drawItemViewItemControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { const QStyleOptionViewItem *vopt = qstyleoption_cast(option); if (!vopt) { return true; } QStyleOptionViewItem op(*vopt); if (_helper->isWindowActive(widget)) { const QColor activeTextColor = _dark ? QColor("#eeeeec") : QColor("#2e3436"); const QColor inactiveTextColor = _dark ? Colors::mix(QColor("#eeeeec"), Colors::darken(Colors::desaturate(QColor("#3d3846"), 1.0), 0.04)) : Colors::mix(QColor("#2e3436"), QColor("#f6f5f4")); // No custom text color used, we can do our HACK QPalette palette = op.palette; if (inactiveTextColor == palette.color(QPalette::Inactive, QPalette::Text) && activeTextColor == palette.color(QPalette::Active, QPalette::Text)) { palette.setColor(QPalette::Inactive, QPalette::Text, palette.color(QPalette::Active, QPalette::Text)); op.palette = palette; } } ParentStyleClass::drawControl(CE_ItemViewItem, &op, painter, widget); return true; } //___________________________________________________________________________________ bool Style::drawMenuBarEmptyArea(const QStyleOption *option, QPainter *painter, const QWidget *) const { const QRect &rect(option->rect); const QPalette &palette(option->palette); painter->save(); painter->setRenderHint(QPainter::Antialiasing, false); painter->setBrush(Qt::NoBrush); painter->setPen(Colors::mix(palette.color(QPalette::Window), palette.color(QPalette::Shadow), 0.2)); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); painter->restore(); return true; } //___________________________________________________________________________________ bool Style::drawMenuBarItemControl(const QStyleOption *option, QPainter *painter, const QWidget *) const { // cast option and check const QStyleOptionMenuItem *menuItemOption = qstyleoption_cast(option); if (!menuItemOption) return true; // copy rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // store state const State &state(option->state); bool enabled(state & State_Enabled); bool sunken(enabled && (state & State_Sunken)); bool useStrongFocus(Adwaita::Config::MenuItemDrawStrongFocus); painter->save(); painter->setRenderHint(QPainter::Antialiasing, false); painter->setBrush(palette.window().color()); painter->setPen(Qt::NoPen); painter->drawRect(rect); painter->setBrush(Qt::NoBrush); painter->setPen(Colors::mix(palette.color(QPalette::Window), palette.color(QPalette::Shadow), 0.2)); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); painter->restore(); // render hover and focus if (useStrongFocus && sunken) { StyleOptions styleOptions(painter, QRect(rect.left(), rect.bottom() - 2, rect.width(), 3)); styleOptions.setColorVariant(_variant); styleOptions.setOutlineColor(Colors::focusColor(StyleOptions(palette, _variant))); Adwaita::Renderer::renderFocusRect(styleOptions); } // get text rect int textFlags(Qt::AlignCenter | _mnemonics->textFlags()); QRect textRect = option->fontMetrics.boundingRect(rect, textFlags, menuItemOption->text); // render text const QPalette::ColorRole role = (useStrongFocus && sunken) ? QPalette::Link : QPalette::WindowText; drawItemText(painter, textRect, textFlags, palette, enabled, menuItemOption->text, role); return true; } //___________________________________________________________________________________ bool Style::drawMenuItemControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionMenuItem *menuItemOption = qstyleoption_cast(option); if (!menuItemOption) { return true; } if (menuItemOption->menuItemType == QStyleOptionMenuItem::EmptyArea) { return true; } // copy rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // deal with separators if (menuItemOption->menuItemType == QStyleOptionMenuItem::Separator) { // normal separator if (menuItemOption->text.isEmpty() && menuItemOption->icon.isNull()) { // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setColor(Colors::separatorColor(styleOptions)); Adwaita::Renderer::renderSeparator(styleOptions); return true; } else { /* * separator can have a title and an icon * in that case they are rendered as menu title buttons */ QStyleOptionToolButton copy(separatorMenuItemOption(menuItemOption, widget)); renderMenuTitle(©, painter, widget); return true; } } // store state const State &state(option->state); bool enabled(state & State_Enabled); bool windowActive(state & State_Active); bool selected(enabled && (state & State_Selected)); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool sunken(enabled && (state & (State_On | State_Sunken))); bool reverseLayout(option->direction == Qt::RightToLeft); bool useStrongFocus(Adwaita::Config::MenuItemDrawStrongFocus); // render hover and focus if (useStrongFocus && (selected || sunken)) { StyleOptions styleOptions(painter, rect); styleOptions.setColor(Colors::selectedMenuColor(StyleOptions(palette, _variant))); styleOptions.setColorVariant(_variant); styleOptions.setOutlineColor(Qt::transparent); Adwaita::Renderer::renderFocusRect(styleOptions); } // get rect available for contents QRect contentsRect(insideMargin(rect, Metrics::MenuItem_MarginWidth)); // define relevant rectangles // checkbox QRect checkBoxRect; if (menuItemOption->menuHasCheckableItems) { checkBoxRect = QRect(contentsRect.left(), contentsRect.top() + (contentsRect.height() - Metrics::CheckBox_Size) / 2, Metrics::CheckBox_Size, Metrics::CheckBox_Size).adjusted(1, 1, -1, -1); } // We want to always to keep the space for checkbox contentsRect.setLeft(rect.left() + Metrics::CheckBox_Size + Metrics::MenuItem_ItemSpacing); CheckBoxState checkState(menuItemOption->checked ? CheckOn : CheckOff); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(false); styleOptions.setSunken(false); styleOptions.setOpacity(AnimationData::OpacityInvalid); styleOptions.setAnimationMode(AnimationNone); styleOptions.setCheckboxState(checkState); styleOptions.setInMenu(true); const QColor &outline(palette.windowText().color()); const QColor &indicatorBackground(Colors::indicatorBackgroundColor(styleOptions)); // render checkbox indicator if (menuItemOption->checkType == QStyleOptionMenuItem::NonExclusive) { checkBoxRect = visualRect(option, checkBoxRect); // checkbox state /* if( useStrongFocus && ( selected || sunken ) ) { _helper->renderCheckBoxBackground( painter, checkBoxRect, palette.color( QPalette::Window ), outline, sunken ); } */ bool active(menuItemOption->checked); AnimationMode mode(_animations->widgetStateEngine().isAnimated(widget, AnimationHover) ? AnimationHover : AnimationNone); qreal opacity(_animations->widgetStateEngine().opacity(widget, AnimationHover)); // Style options styleOptions.setActive(enabled && active); styleOptions.setAnimationMode(mode); styleOptions.setOpacity(opacity); styleOptions.setPainter(painter); styleOptions.setRect(checkBoxRect); styleOptions.setColor(indicatorBackground); styleOptions.setOutlineColor(outline); styleOptions.setSunken(false); styleOptions.setActive(enabled && windowActive); QColor tickColor = Colors::checkBoxIndicatorColor(styleOptions); Adwaita::Renderer::renderCheckBox(styleOptions, tickColor); } else if (menuItemOption->checkType == QStyleOptionMenuItem::Exclusive) { checkBoxRect = visualRect(option, checkBoxRect); /* if( useStrongFocus && ( selected || sunken ) ) { _helper->renderRadioButtonBackground( painter, checkBoxRect, palette.color( QPalette::Window ), outline, sunken ); } */ bool active(menuItemOption->checked); AnimationMode mode(_animations->widgetStateEngine().isAnimated(widget, AnimationHover) ? AnimationHover : AnimationNone); qreal opacity(_animations->widgetStateEngine().opacity(widget, AnimationHover)); // Style options styleOptions.setActive(enabled && active); styleOptions.setAnimationMode(mode); styleOptions.setOpacity(opacity); styleOptions.setPainter(painter); styleOptions.setRect(checkBoxRect); styleOptions.setColor(indicatorBackground); styleOptions.setOutlineColor(outline); styleOptions.setSunken(false); styleOptions.setActive(enabled && windowActive); styleOptions.setRadioButtonState(active ? RadioOn : RadioOff); QColor tickColor = Colors::checkBoxIndicatorColor(styleOptions); Adwaita::Renderer::renderRadioButton(styleOptions, tickColor); } // icon int iconWidth = 0; bool showIcon(showIconsInMenuItems()); if (showIcon) { iconWidth = isQtQuickControl(option, widget) ? qMax(pixelMetric(PM_SmallIconSize, option, widget), menuItemOption->maxIconWidth) : menuItemOption->maxIconWidth; } QRect iconRect(contentsRect.left(), contentsRect.top() + (contentsRect.height() - iconWidth) / 2, iconWidth, iconWidth); contentsRect.setLeft(iconRect.right() + Metrics::MenuItem_ItemSpacing + 1); if (showIcon && !menuItemOption->icon.isNull()) { QSize iconSize(pixelMetric(PM_SmallIconSize, option, widget), pixelMetric(PM_SmallIconSize, option, widget)); iconRect = centerRect(iconRect, iconSize); iconRect = visualRect(option, iconRect); // icon mode QIcon::Mode mode; if (selected && !useStrongFocus) { mode = QIcon::Active; } else if (selected) { mode = QIcon::Selected; } else if (enabled) { mode = QIcon::Normal; } else { mode = QIcon::Disabled; } // icon state const QIcon::State iconState(sunken ? QIcon::On : QIcon::Off); QPixmap icon = menuItemOption->icon.pixmap(iconRect.size(), mode, iconState); painter->drawPixmap(iconRect, icon); } // arrow QRect arrowRect(contentsRect.right() - Metrics::MenuButton_IndicatorWidth + 1, contentsRect.top() + (contentsRect.height() - Metrics::MenuButton_IndicatorWidth) / 2, Metrics::MenuButton_IndicatorWidth, Metrics::MenuButton_IndicatorWidth); if (menuItemOption->menuItemType == QStyleOptionMenuItem::SubMenu) { // apply right-to-left layout arrowRect = visualRect(option, arrowRect); // arrow orientation ArrowOrientation orientation(reverseLayout ? ArrowLeft : ArrowRight); // color QColor arrowColor; if (useStrongFocus && (selected || sunken)) { arrowColor = palette.color(QPalette::HighlightedText); } else if (sunken) { arrowColor = Colors::focusColor(StyleOptions(palette, _variant)); } else if (selected) { arrowColor = Colors::hoverColor(StyleOptions(palette, _variant)); } else { styleOptions.setColorRole(QPalette::WindowText); arrowColor = Colors::arrowOutlineColor(styleOptions); } styleOptions.setPainter(painter); styleOptions.setRect(arrowRect); styleOptions.setColor(arrowColor); styleOptions.setColorVariant(_variant); // render Adwaita::Renderer::renderArrow(styleOptions, orientation); } // text QRect textRect = contentsRect; if (!menuItemOption->text.isEmpty()) { // adjust textRect QString text = menuItemOption->text; textRect = centerRect(textRect, textRect.width(), option->fontMetrics.size(_mnemonics->textFlags(), text).height()); textRect = visualRect(option, textRect); const int arrowWidth = menuItemOption->menuItemType == QStyleOptionMenuItem::SubMenu ? Metrics::MenuButton_IndicatorWidth : 0; textRect.setRight(textRect.right() - Metrics::MenuItem_MarginWidth - arrowWidth); // set font painter->setFont(menuItemOption->font); // locate accelerator and render int tabPosition(text.indexOf(QLatin1Char('\t'))); if (tabPosition >= 0) { int textFlags(Qt::AlignVCenter | Qt::AlignRight); QString accelerator(text.mid(tabPosition + 1)); text = text.left(tabPosition); QPalette copy(palette); copy.setColor(QPalette::Active, QPalette::WindowText, Colors::transparentize(copy.color(QPalette::Active, QPalette::WindowText), 0.55)); copy.setColor(QPalette::Active, QPalette::HighlightedText, Colors::transparentize(copy.color(QPalette::Active, QPalette::HighlightedText), 0.55)); drawItemText(painter, textRect, textFlags, copy, enabled, accelerator, QPalette::WindowText); } // render text int textFlags(Qt::AlignVCenter | (reverseLayout ? Qt::AlignRight : Qt::AlignLeft) | _mnemonics->textFlags()); textRect = option->fontMetrics.boundingRect(textRect, textFlags, text); drawItemText(painter, textRect, textFlags, palette, enabled, text, QPalette::WindowText); } return true; } //___________________________________________________________________________________ bool Style::drawProgressBarControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { const QStyleOptionProgressBar *progressBarOptionTmp(qstyleoption_cast(option)); if (!progressBarOptionTmp) return true; QStyleOptionProgressBar progressBarOption = *progressBarOptionTmp; // render groove progressBarOption.rect = subElementRect(SE_ProgressBarGroove, progressBarOptionTmp, widget); drawControl(CE_ProgressBarGroove, &progressBarOption, painter, widget); const QObject *styleObject(widget ? widget : progressBarOptionTmp->styleObject); // enable busy animations // need to check both widget and passed styleObject, used for QML if (styleObject && _animations->busyIndicatorEngine().enabled()) { // register QML object if defined if (!widget && progressBarOptionTmp->styleObject) { _animations->busyIndicatorEngine().registerWidget(progressBarOptionTmp->styleObject); } _animations->busyIndicatorEngine().setAnimated(styleObject, progressBarOptionTmp->maximum == 0 && progressBarOptionTmp->minimum == 0); } // check if animated and pass to option if (_animations->busyIndicatorEngine().isAnimated(styleObject)) { progressBarOption.progress = _animations->busyIndicatorEngine().value(); } // render contents progressBarOption.rect = subElementRect(SE_ProgressBarContents, progressBarOptionTmp, widget); drawControl(CE_ProgressBarContents, &progressBarOption, painter, widget); // render text bool textVisible(progressBarOptionTmp->textVisible); bool busy(progressBarOptionTmp->minimum == 0 && progressBarOptionTmp->maximum == 0); if (textVisible && !busy) { progressBarOption.rect = subElementRect(SE_ProgressBarLabel, progressBarOptionTmp, widget); drawControl(CE_ProgressBarLabel, &progressBarOption, painter, widget); } return true; } //___________________________________________________________________________________ bool Style::drawProgressBarContentsControl(const QStyleOption *option, QPainter *painter, const QWidget *) const { const QStyleOptionProgressBar *progressBarOption(qstyleoption_cast(option)); if (!progressBarOption) return true; // copy rect and palette QRect rect(option->rect); const QPalette &palette(option->palette); // get direction const State &state(option->state); #if QT_VERSION >= 0x060000 bool horizontal(state & QStyle::State_Horizontal); #else bool horizontal((state & QStyle::State_Horizontal) || (progressBarOption->orientation == Qt::Horizontal)); #endif bool inverted(progressBarOption ? progressBarOption->invertedAppearance : false); bool reverse = horizontal && option->direction == Qt::RightToLeft; if (inverted) reverse = !reverse; // check if anything is to be drawn bool busy((progressBarOption->minimum == 0 && progressBarOption->maximum == 0)); if (busy) { qreal progress(_animations->busyIndicatorEngine().value()); QColor color(palette.color(QPalette::Highlight)); StyleOptions styleOptions(painter, rect); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); styleOptions.setOutlineColor(color); Adwaita::Renderer::renderProgressBarBusyContents(styleOptions, horizontal, reverse, progress); } else { QRegion oldClipRegion(painter->clipRegion()); if (horizontal) { if (rect.width() < Metrics::ProgressBar_Thickness) { painter->setClipRect(rect, Qt::IntersectClip); if (reverse) { rect.setLeft(rect.left() - Metrics::ProgressBar_Thickness + rect.width()); } else { rect.setWidth(Metrics::ProgressBar_Thickness); } } } else { if (rect.height() < Metrics::ProgressBar_Thickness) { painter->setClipRect(rect, Qt::IntersectClip); if (reverse) { rect.setHeight(Metrics::ProgressBar_Thickness); } else { rect.setTop(rect.top() - Metrics::ProgressBar_Thickness + rect.height()); } } } StyleOptions styleOptions(painter, rect); styleOptions.setColor(palette.color(QPalette::Highlight)); styleOptions.setColorVariant(_variant); styleOptions.setOutlineColor(palette.color(QPalette::Highlight)); Adwaita::Renderer::renderProgressBarContents(styleOptions); painter->setClipRegion(oldClipRegion); } return true; } //___________________________________________________________________________________ bool Style::drawProgressBarGrooveControl(const QStyleOption *option, QPainter *painter, const QWidget *) const { const QPalette &palette(option->palette); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setHasFocus(false); styleOptions.setSunken(false); styleOptions.setOpacity(AnimationData::OpacityInvalid); styleOptions.setAnimationMode(AnimationNone); styleOptions.setPainter(painter); styleOptions.setRect(option->rect); styleOptions.setColor(Colors::mix(Colors::buttonOutlineColor(styleOptions), palette.color(QPalette::Window))); styleOptions.setOutlineColor(Colors::mix(Colors::buttonOutlineColor(styleOptions), palette.color(QPalette::Window))); Adwaita::Renderer::renderProgressBarGroove(styleOptions); return true; } //___________________________________________________________________________________ bool Style::drawProgressBarLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *) const { // cast option and check const QStyleOptionProgressBar *progressBarOption(qstyleoption_cast(option)); if (!progressBarOption) { return true; } // get direction and check const State &state(option->state); #if QT_VERSION >= 0x060000 bool horizontal(state & QStyle::State_Horizontal); #else bool horizontal((state & QStyle::State_Horizontal) || (progressBarOption->orientation == Qt::Horizontal)); #endif if (!horizontal) { return true; } // store rect and palette const QRect &rect(option->rect); QPalette palette(option->palette); palette.setColor(QPalette::WindowText, Colors::transparentize(palette.color(QPalette::Active, QPalette::WindowText), 0.6)); // store state and direction bool enabled(state & State_Enabled); // define text rect Qt::Alignment hAlign((progressBarOption->textAlignment == Qt::AlignLeft) ? Qt::AlignHCenter : progressBarOption->textAlignment); drawItemText(painter, rect, Qt::AlignVCenter | hAlign, palette, enabled, progressBarOption->text, QPalette::WindowText); return true; } //___________________________________________________________________________________ bool Style::drawScrollBarSliderControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return true; } const State &state(option->state); bool horizontal(state & State_Horizontal); // copy rect and palette const QRect &rect(horizontal ? option->rect.adjusted(-1, 4, 0, -4) : option->rect.adjusted(4, -1, -4, 0)); // define handle rect QRect handleRect; bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool sunken(enabled && (state & (State_On | State_Sunken))); // check focus from relevant parent const QWidget *parent(scrollBarParent(widget)); bool hasFocus(enabled && parent && parent->hasFocus()); // enable animation state _animations->scrollBarEngine().updateState(widget, AnimationFocus, hasFocus); _animations->scrollBarEngine().updateState(widget, AnimationPressed, sunken); _animations->scrollBarEngine().updateState(widget, AnimationHover, mouseOver); AnimationMode mode(_animations->scrollBarEngine().animationMode(widget, SC_ScrollBarSlider)); qreal opacity(_animations->scrollBarEngine().opacity(widget, SC_ScrollBarSlider)); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(hasFocus); styleOptions.setSunken(sunken); styleOptions.setOpacity(opacity); styleOptions.setAnimationMode(mode); QColor color = Colors::scrollBarHandleColor(styleOptions); if (mouseOver) { opacity = 1; } else { opacity = 0; } /* if( horizontal ) handleRect = centerRect( rect, rect.width(), rect.height() * (0.5 + 0.5 * opacity)); else handleRect = centerRect( rect, rect.width() * (0.5 + 0.5 * opacity), rect.height() ); */ if (horizontal) { handleRect = rect.adjusted(0, 6, 0, 2); handleRect.adjust(0, -6.0 * opacity, 0, -2.0 * opacity); } else { handleRect = rect.adjusted(6, 0, 2, 0); handleRect.adjust(-6.0 * opacity, 0, -2.0 * opacity, 0); } styleOptions.setPainter(painter); styleOptions.setRect(handleRect); styleOptions.setColor(color); Adwaita::Renderer::renderScrollBarHandle(styleOptions); return true; } //___________________________________________________________________________________ bool Style::drawScrollBarAddLineControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // do nothing if no buttons are defined if (_addLineButtons == NoButton) { return true; } // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return true; } const State &state(option->state); bool horizontal(state & State_Horizontal); bool reverseLayout(option->direction == Qt::RightToLeft); // adjust rect, based on number of buttons to be drawn QRect rect(scrollBarInternalSubControlRect(sliderOption, SC_ScrollBarAddLine)); QColor color; QStyleOptionSlider copy(*sliderOption); if (_addLineButtons == DoubleButton) { if (horizontal) { //Draw the arrows QSize halfSize(rect.width() / 2, rect.height()); QRect leftSubButton(rect.topLeft(), halfSize); QRect rightSubButton(leftSubButton.topRight() + QPoint(1, 0), halfSize); copy.rect = leftSubButton; color = scrollBarArrowColor(©, reverseLayout ? SC_ScrollBarAddLine : SC_ScrollBarSubLine, widget); StyleOptions styleOptions(painter, leftSubButton); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderArrow(styleOptions, ArrowLeft); copy.rect = rightSubButton; color = scrollBarArrowColor(©, reverseLayout ? SC_ScrollBarSubLine : SC_ScrollBarAddLine, widget); styleOptions.setColor(color); styleOptions.setRect(rightSubButton); Adwaita::Renderer::renderArrow(styleOptions, ArrowRight); } else { QSize halfSize(rect.width(), rect.height() / 2); QRect topSubButton(rect.topLeft(), halfSize); QRect botSubButton(topSubButton.bottomLeft() + QPoint(0, 1), halfSize); copy.rect = topSubButton; color = scrollBarArrowColor(©, SC_ScrollBarSubLine, widget); StyleOptions styleOptions(painter, topSubButton); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderArrow(styleOptions, ArrowUp); copy.rect = botSubButton; color = scrollBarArrowColor(©, SC_ScrollBarAddLine, widget); styleOptions.setColor(color); styleOptions.setRect(botSubButton); Adwaita::Renderer::renderArrow(styleOptions, ArrowDown); } } else if (_addLineButtons == SingleButton) { copy.rect = rect; color = scrollBarArrowColor(©, SC_ScrollBarAddLine, widget); StyleOptions styleOptions(painter, QRect()); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); if (horizontal) { if (reverseLayout) { styleOptions.setRect(rect); Adwaita::Renderer::renderArrow(styleOptions, ArrowLeft); } else { styleOptions.setRect(rect.translated(1, 0)); Adwaita::Renderer::renderArrow(styleOptions, ArrowRight); } } else { styleOptions.setRect(rect.translated(0, 1)); Adwaita::Renderer::renderArrow(styleOptions, ArrowDown); } } return true; } //___________________________________________________________________________________ bool Style::drawScrollBarSubLineControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // do nothing if no buttons are set if (_subLineButtons == NoButton) { return true; } // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return true; } const State &state(option->state); bool horizontal(state & State_Horizontal); bool reverseLayout(option->direction == Qt::RightToLeft); // colors const QPalette &palette(option->palette); QColor background(palette.color(QPalette::Window)); // adjust rect, based on number of buttons to be drawn QRect rect(scrollBarInternalSubControlRect(sliderOption, SC_ScrollBarSubLine)); QColor color; QStyleOptionSlider copy(*sliderOption); if (_subLineButtons == DoubleButton) { if (horizontal) { //Draw the arrows QSize halfSize(rect.width() / 2, rect.height()); QRect leftSubButton(rect.topLeft(), halfSize); QRect rightSubButton(leftSubButton.topRight() + QPoint(1, 0), halfSize); copy.rect = leftSubButton; color = scrollBarArrowColor(©, reverseLayout ? SC_ScrollBarAddLine : SC_ScrollBarSubLine, widget); StyleOptions styleOptions(painter, leftSubButton); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderArrow(styleOptions, ArrowLeft); copy.rect = rightSubButton; color = scrollBarArrowColor(©, reverseLayout ? SC_ScrollBarSubLine : SC_ScrollBarAddLine, widget); styleOptions.setColor(color); styleOptions.setRect(rightSubButton); Adwaita::Renderer::renderArrow(styleOptions, ArrowRight); } else { QSize halfSize(rect.width(), rect.height() / 2); QRect topSubButton(rect.topLeft(), halfSize); QRect botSubButton(topSubButton.bottomLeft() + QPoint(0, 1), halfSize); copy.rect = topSubButton; color = scrollBarArrowColor(©, SC_ScrollBarSubLine, widget); StyleOptions styleOptions(painter, topSubButton); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderArrow(styleOptions, ArrowUp); copy.rect = botSubButton; color = scrollBarArrowColor(©, SC_ScrollBarAddLine, widget); styleOptions.setColor(color); styleOptions.setRect(botSubButton); Adwaita::Renderer::renderArrow(styleOptions, ArrowDown); } } else if (_subLineButtons == SingleButton) { copy.rect = rect; color = scrollBarArrowColor(©, SC_ScrollBarSubLine, widget); StyleOptions styleOptions(painter, QRect()); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); if (horizontal) { if (reverseLayout) { styleOptions.setRect(rect.translated(1, 0)); Adwaita::Renderer::renderArrow(styleOptions, ArrowRight); } else { styleOptions.setRect(rect); Adwaita::Renderer::renderArrow(styleOptions, ArrowLeft); } } else { styleOptions.setRect(rect); Adwaita::Renderer::renderArrow(styleOptions, ArrowUp); } } return true; } //___________________________________________________________________________________ bool Style::drawShapedFrameControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionFrame *frameOpt = qstyleoption_cast(option); if (!frameOpt) { return false; } switch (frameOpt->frameShape) { case QFrame::Box: { if (option->state & State_Sunken) { return true; } else { break; } } case QFrame::HLine: case QFrame::VLine: { const QRect &rect(option->rect); // Style options StyleOptions styleOptions(option->palette, _variant); bool isVertical(frameOpt->frameShape == QFrame::VLine); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setColor(Colors::separatorColor(styleOptions)); Adwaita::Renderer::renderSeparator(styleOptions, isVertical); return true; } case QFrame::StyledPanel: { if (isQtQuickControl(option, widget)) { // ComboBox popup frame drawFrameMenuPrimitive(option, painter, widget); return true; } break; } default: break; } return false; } //___________________________________________________________________________________ bool Style::drawRubberBandControl(const QStyleOption *option, QPainter *painter, const QWidget *) const { const QPalette &palette(option->palette); QRect rect(option->rect); QColor color = palette.color(QPalette::Highlight); painter->setPen(Colors::mix(color, palette.color(QPalette::Active, QPalette::WindowText))); color.setAlpha(50); painter->setBrush(color); painter->setClipRegion(rect); painter->drawRect(rect.adjusted(0, 0, -1, -1)); return true; } //___________________________________________________________________________________ bool Style::drawHeaderSectionControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { const QRect &rect(option->rect); const QPalette &palette(option->palette); const State &state(option->state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); const QStyleOptionHeader *headerOption(qstyleoption_cast(option)); if (!headerOption) { return true; } bool horizontal(headerOption->orientation == Qt::Horizontal); bool isFirst(horizontal && (headerOption->position == QStyleOptionHeader::Beginning)); bool isCorner(widget && widget->inherits("QTableCornerButton")); bool reverseLayout(option->direction == Qt::RightToLeft); // update animation state _animations->headerViewEngine().updateState(widget, rect.topLeft(), mouseOver); QBrush color = palette.base(); painter->setRenderHint(QPainter::Antialiasing, false); painter->setBrush(color); painter->setPen(Qt::NoPen); painter->drawRect(rect); // outline painter->setBrush(Qt::NoBrush); painter->setPen(Colors::alphaColor(palette.color(QPalette::WindowText), 0.2)); if (isCorner) { if (reverseLayout) { painter->drawPoint(rect.bottomLeft()); } else { painter->drawPoint(rect.bottomRight()); } } else if (horizontal) { painter->drawLine(rect.bottomLeft(), rect.bottomRight()); } else { if (reverseLayout) { painter->drawLine(rect.topLeft(), rect.bottomLeft()); } else { painter->drawLine(rect.topRight(), rect.bottomRight()); } } // separators if (horizontal) { if (headerOption->section != 0 || isFirst) { if (reverseLayout) { painter->drawLine(rect.topLeft(), rect.bottomLeft() - QPoint(0, 1)); } else { painter->drawLine(rect.topRight(), rect.bottomRight() - QPoint(0, 1)); } } } else { if (reverseLayout) { painter->drawLine(rect.bottomLeft() + QPoint(1, 0), rect.bottomRight()); } else { painter->drawLine(rect.bottomLeft(), rect.bottomRight() - QPoint(1, 0)); } } return true; } bool Style::drawHeaderLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (const QStyleOptionHeader *header = qstyleoption_cast(option)) { QRect rect = header->rect; if (!header->icon.isNull()) { QPixmap pixmap = header->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize), (header->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled); int pixw = pixmap.width(); QRect aligned = alignedRect(header->direction, QFlag(header->iconAlignment), pixmap.size(), rect); QRect inter = aligned.intersected(rect); painter->drawPixmap(inter.x(), inter.y(), pixmap, inter.x() - aligned.x(), inter.y() - aligned.y(), inter.width(), inter.height()); if (header->direction == Qt::LeftToRight) rect.setLeft(rect.left() + pixw + 2); else rect.setRight(rect.right() - pixw - 2); } QFont fnt = painter->font(); fnt.setBold(true); painter->setFont(fnt); QPalette palette(header->palette); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setState(header->state); palette.setColor(QPalette::Text, Colors::headerTextColor(styleOptions)); proxy()->drawItemText(painter, rect, header->textAlignment, palette, (header->state & State_Active), header->text, QPalette::Text); } return true; } //___________________________________________________________________________________ bool Style::drawHeaderEmptyAreaControl(const QStyleOption *option, QPainter *painter, const QWidget *) const { // use the same background as in drawHeaderPrimitive const QRect &rect(option->rect); QPalette palette(option->palette); bool horizontal(option->state & QStyle::State_Horizontal); bool reverseLayout(option->direction == Qt::RightToLeft); // fill painter->setRenderHint(QPainter::Antialiasing, false); painter->setBrush(palette.color(QPalette::Base)); painter->setPen(Qt::NoPen); painter->drawRect(rect); // outline painter->setBrush(Qt::NoBrush); painter->setPen(Colors::alphaColor(palette.color(QPalette::ButtonText), 0.1)); if (horizontal) { painter->drawLine(rect.bottomLeft(), rect.bottomRight()); } else { if (reverseLayout) { painter->drawLine(rect.topLeft(), rect.bottomLeft()); } else { painter->drawLine(rect.topRight(), rect.bottomRight()); } } return true; } //___________________________________________________________________________________ bool Style::drawTabBarTabLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (const QStyleOptionTab *tab = qstyleoption_cast(option)) { QRect tr = tab->rect; bool verticalTabs = tab->shape == QTabBar::RoundedEast || tab->shape == QTabBar::RoundedWest || tab->shape == QTabBar::TriangularEast || tab->shape == QTabBar::TriangularWest; int alignment = Qt::AlignCenter | Qt::TextShowMnemonic; if (!proxy()->styleHint(SH_UnderlineShortcut, option, widget)) alignment |= Qt::TextHideMnemonic; if (verticalTabs) { painter->save(); int newX, newY, newRot; if (tab->shape == QTabBar::RoundedEast || tab->shape == QTabBar::TriangularEast) { newX = tr.width() + tr.x(); newY = tr.y(); newRot = 90; } else { newX = tr.x(); newY = tr.y() + tr.height(); newRot = -90; } QTransform m = QTransform::fromTranslate(newX, newY); m.rotate(newRot); painter->setTransform(m, true); } QRect iconRect; tabLayout(tab, widget, &tr, &iconRect, proxy()); tr = proxy()->subElementRect(SE_TabBarTabText, option, widget); //we compute tr twice because the style may override subElementRect if (!tab->icon.isNull()) { QPixmap tabIcon = tab->icon.pixmap(tab->iconSize, (tab->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled, (tab->state & State_Selected) ? QIcon::On : QIcon::Off); painter->drawPixmap(iconRect.x(), iconRect.y(), tabIcon); } QFont font = painter->font(); font.setBold(true); painter->setFont(font); if (!(tab->state & State_Enabled)) { if (tab->state & State_Selected) { painter->setPen(Colors::mix(option->palette.brush(QPalette::Text).color(), option->palette.brush(QPalette::Window).color(), 0.3)); } else { painter->setPen(Colors::mix(option->palette.brush(QPalette::Text).color(), option->palette.brush(QPalette::Window).color(), 0.4)); } } else { if (tab->state & State_Selected) { painter->setPen(option->palette.brush(QPalette::WindowText).color()); } else if (tab->state & State_Active && tab->state & State_MouseOver) { painter->setPen(Colors::mix(option->palette.brush(QPalette::Dark).color(), option->palette.brush(QPalette::Text).color(), 0.7)); } else { painter->setPen(Colors::mix(option->palette.brush(QPalette::Dark).color(), option->palette.brush(QPalette::Text).color(), 0.6)); } } proxy()->drawItemText(painter, tr, alignment, tab->palette, tab->state & State_Enabled, tab->text, QPalette::NoRole); if (verticalTabs) { painter->restore(); } if (tab->state & State_HasFocus) { int OFFSET = 1 + pixelMetric(PM_DefaultFrameWidth); int x1, x2; x1 = tab->rect.left(); x2 = tab->rect.right() - 1; QStyleOptionFocusRect fropt; fropt.QStyleOption::operator=(*tab); fropt.rect.setRect(x1 + 1 + OFFSET, tab->rect.y() + OFFSET, x2 - x1 - 2 * OFFSET, tab->rect.height() - 2 * OFFSET); drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget); } } // store rect and palette const QRect &rect(option->rect); // check focus const State &state(option->state); bool enabled(state & State_Enabled); bool selected(state & State_Selected); bool hasFocus(enabled && selected && (state & State_HasFocus)); // update mouse over animation state _animations->tabBarEngine().updateState(widget, rect.topLeft(), AnimationFocus, hasFocus); bool animated(enabled && selected && _animations->tabBarEngine().isAnimated(widget, rect.topLeft(), AnimationFocus)); if (!(hasFocus || animated)) return true; // code is copied from QCommonStyle, but adds focus // cast option and check const QStyleOptionTab *tabOption(qstyleoption_cast(option)); if (!tabOption || tabOption->text.isEmpty()) { return true; } // tab option rect bool verticalTabs(isVerticalTab(tabOption)); int textFlags(Qt::AlignCenter | _mnemonics->textFlags()); // text rect QRect textRect(subElementRect(SE_TabBarTabText, option, widget)); if (verticalTabs) { // properly rotate painter painter->save(); int newX, newY, newRot; if (tabOption->shape == QTabBar::RoundedEast || tabOption->shape == QTabBar::TriangularEast) { newX = rect.width() + rect.x(); newY = rect.y(); newRot = 90; } else { newX = rect.x(); newY = rect.y() + rect.height(); newRot = -90; } QTransform transform; transform.translate(newX, newY); transform.rotate(newRot); painter->setTransform(transform, true); } // adjust text rect based on font metrics textRect = option->fontMetrics.boundingRect(textRect, textFlags, tabOption->text); if (verticalTabs) { painter->restore(); } return true; } //___________________________________________________________________________________ bool Style::drawTabBarTabShapeControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { const QStyleOptionTab *tabOption(qstyleoption_cast(option)); if (!tabOption) { return true; } // palette and state const QPalette &palette(option->palette); const State &state(option->state); bool enabled(state & State_Enabled); bool selected(state & State_Selected); bool mouseOver((state & State_Active) && !selected && (state & State_MouseOver) && enabled); // check if tab is being dragged bool isDragged(widget && selected && painter->device() != widget); bool isLocked(widget && _tabBarData->isLocked(widget)); // store rect QRect rect(option->rect); // update mouse over animation state _animations->tabBarEngine().updateState(widget, rect.topLeft(), AnimationHover, mouseOver); // lock state if (selected && widget && isDragged) { _tabBarData->lock(widget); } else if (widget && selected && _tabBarData->isLocked(widget)) { _tabBarData->release(); } // tab position const QStyleOptionTab::TabPosition &position = tabOption->position; bool isSingle(position == QStyleOptionTab::OnlyOneTab); bool isFirst(isSingle || position == QStyleOptionTab::Beginning); bool isLast(isSingle || position == QStyleOptionTab::End); bool isLeftOfSelected(!isLocked && tabOption->selectedPosition == QStyleOptionTab::NextIsSelected); bool isRightOfSelected(!isLocked && tabOption->selectedPosition == QStyleOptionTab::PreviousIsSelected); // true if widget is aligned to the frame // need to check for 'isRightOfSelected' because for some reason the isFirst flag is set when active tab is being moved isFirst &= !isRightOfSelected; isLast &= !isLeftOfSelected; // swap state based on reverse layout, so that they become layout independent bool reverseLayout(option->direction == Qt::RightToLeft); bool verticalTabs(isVerticalTab(tabOption)); if (reverseLayout && !verticalTabs) { qSwap(isFirst, isLast); qSwap(isLeftOfSelected, isRightOfSelected); } // adjust rect and define corners based on tabbar orientation Corners corners; switch (tabOption->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: corners = CornersTop; break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: corners = CornersBottom; break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: corners = CornersLeft; break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: corners = CornersRight; break; default: break; } // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setState(option->state); // underline QColor underline(enabled && selected ? Colors::focusColor(StyleOptions(palette, _variant)) : selected || mouseOver ? option->palette.color(QPalette::Window).darker() : Qt::transparent); // outline QColor outline = QColor(); if (selected && widget && widget->property("movable").toBool()) { outline = Colors::frameOutlineColor(StyleOptions(palette, _variant)); } // background QColor background = Colors::tabBarColor(styleOptions); // render QRegion oldRegion(painter->clipRegion()); painter->setClipRect(option->rect, Qt::IntersectClip); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setColor(underline); styleOptions.setOutlineColor(outline); Adwaita::Renderer::renderTabBarTab(styleOptions, background, corners, widget && widget->property("movable").toBool()); painter->setClipRegion(oldRegion); return true; } //___________________________________________________________________________________ bool Style::drawToolBoxTabLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // rendering is similar to drawPushButtonLabelControl // cast option and check const QStyleOptionToolBox *toolBoxOption(qstyleoption_cast(option)); if (!toolBoxOption) { return true; } // copy palette const QPalette &palette(option->palette); const State &state(option->state); bool enabled(state & State_Enabled); // text alignment int textFlags(_mnemonics->textFlags() | Qt::AlignCenter); // contents rect QRect rect(subElementRect(SE_ToolBoxTabContents, option, widget)); // store icon size int iconSize(pixelMetric(QStyle::PM_SmallIconSize, option, widget)); // find contents size and rect QRect contentsRect(rect); QSize contentsSize; if (!toolBoxOption->text.isEmpty()) { contentsSize = option->fontMetrics.size(_mnemonics->textFlags(), toolBoxOption->text); if (!toolBoxOption->icon.isNull()) { contentsSize.rwidth() += Metrics::ToolBox_TabItemSpacing; } } // icon size if (!toolBoxOption->icon.isNull()) { contentsSize.setHeight(qMax(contentsSize.height(), iconSize)); contentsSize.rwidth() += iconSize; } // adjust contents rect contentsRect = centerRect(contentsRect, contentsSize); // render icon if (!toolBoxOption->icon.isNull()) { // icon rect QRect iconRect; if (toolBoxOption->text.isEmpty()) { iconRect = centerRect(contentsRect, iconSize, iconSize); } else { iconRect = contentsRect; iconRect.setWidth(iconSize); iconRect = centerRect(iconRect, iconSize, iconSize); contentsRect.setLeft(iconRect.right() + Metrics::ToolBox_TabItemSpacing + 1); } iconRect = visualRect(option, iconRect); const QIcon::Mode mode(enabled ? QIcon::Normal : QIcon::Disabled); QPixmap pixmap(toolBoxOption->icon.pixmap(iconSize, mode)); drawItemPixmap(painter, iconRect, textFlags, pixmap); } // render text if (!toolBoxOption->text.isEmpty()) { contentsRect = visualRect(option, contentsRect); drawItemText(painter, contentsRect, textFlags, palette, enabled, toolBoxOption->text, QPalette::WindowText); } return true; } //___________________________________________________________________________________ bool Style::drawToolBoxTabShapeControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionToolBox *toolBoxOption(qstyleoption_cast(option)); if (!toolBoxOption) { return true; } // copy rect and palette const QRect &rect(option->rect); QRect tabRect(toolBoxTabContentsRect(option, widget)); /* * important: option returns the wrong palette. * we use the widget palette instead, when set */ QPalette palette(widget ? widget->palette() : option->palette); // store flags const State &flags(option->state); bool enabled(flags & State_Enabled); bool selected(flags & State_Selected); bool mouseOver((flags & State_Active) && enabled && !selected && (flags & State_MouseOver)); // update animation state /* * the proper widget ( the toolbox tab ) is not passed as argument by Qt. * What is passed is the toolbox directly. To implement animations properly, *the painter->device() is used instead */ bool isAnimated(false); qreal opacity(AnimationData::OpacityInvalid); QPaintDevice *device = painter->device(); if (enabled && device) { _animations->toolBoxEngine().updateState(device, mouseOver); isAnimated = _animations->toolBoxEngine().isAnimated(device); opacity = _animations->toolBoxEngine().opacity(device); } // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(false); styleOptions.setOpacity(opacity); styleOptions.setAnimationMode(isAnimated ? AnimationHover : AnimationNone); // color QColor outline; if (selected) { outline = Colors::focusColor(StyleOptions(palette, _variant)); } else { outline = Colors::frameOutlineColor(styleOptions); } styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setColor(outline); // render Adwaita::Renderer::renderToolBoxFrame(styleOptions, tabRect.width()); return true; } //___________________________________________________________________________________ bool Style::drawDockWidgetTitleControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionDockWidget *dockWidgetOption = ::qstyleoption_cast(option); if (!dockWidgetOption) { return true; } const QPalette &palette(option->palette); const State &state(option->state); bool enabled(state & State_Enabled); bool reverseLayout(option->direction == Qt::RightToLeft); bool verticalTitleBar(dockWidgetOption ? dockWidgetOption->verticalTitleBar : false); QRect buttonRect(subElementRect(dockWidgetOption->floatable ? SE_DockWidgetFloatButton : SE_DockWidgetCloseButton, option, widget)); // get rectangle and adjust to properly accounts for buttons QRect rect(insideMargin(dockWidgetOption->rect, Metrics::Frame_FrameWidth)); if (verticalTitleBar) { if (buttonRect.isValid()) { rect.setTop(buttonRect.bottom() + 1); } } else if (reverseLayout) { if (buttonRect.isValid()) { rect.setLeft(buttonRect.right() + 1); } rect.adjust(0, 0, -4, 0); } else { if (buttonRect.isValid()) { rect.setRight(buttonRect.left() - 1); } rect.adjust(4, 0, 0, 0); } QString title(dockWidgetOption->title); int titleWidth = dockWidgetOption->fontMetrics.size(_mnemonics->textFlags(), title).width(); int width = verticalTitleBar ? rect.height() : rect.width(); if (width < titleWidth) { title = dockWidgetOption->fontMetrics.elidedText(title, Qt::ElideMiddle, width, Qt::TextShowMnemonic); } if (verticalTitleBar) { QSize size = rect.size(); size.transpose(); rect.setSize(size); painter->save(); painter->translate(rect.left(), rect.top() + rect.width()); painter->rotate(-90); painter->translate(-rect.left(), -rect.top()); drawItemText(painter, rect, Qt::AlignLeft | Qt::AlignVCenter | _mnemonics->textFlags(), palette, enabled, title, QPalette::WindowText); painter->restore(); } else { drawItemText(painter, rect, Qt::AlignLeft | Qt::AlignVCenter | _mnemonics->textFlags(), palette, enabled, title, QPalette::WindowText); } return true; } //______________________________________________________________ bool Style::drawGroupBoxComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast(option)) { painter->save(); QRect textRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxLabel, widget); QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxCheckBox, widget); // Draw title if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) { QColor textColor = groupBox->textColor; if (textColor.isValid()) { painter->setPen(textColor); } int alignment = int(groupBox->textAlignment); if (!styleHint(QStyle::SH_UnderlineShortcut, option, widget)) { alignment |= Qt::TextHideMnemonic; } QFont font = painter->font(); font.setBold(true); painter->setFont(font); painter->drawText(textRect, Qt::TextShowMnemonic | Qt::AlignLeft | Qt::AlignVCenter | alignment, groupBox->text); } if (groupBox->subControls & SC_GroupBoxCheckBox) { QStyleOptionButton box; box.QStyleOption::operator=(*groupBox); box.rect = checkBoxRect; proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, painter, widget); } painter->restore(); } return true; } //______________________________________________________________ bool Style::drawToolButtonComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionToolButton *toolButtonOption(qstyleoption_cast(option)); if (!toolButtonOption) { return true; } // need to alter palette for focused buttons const State &state(option->state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (option->state & State_MouseOver)); bool sunken(state & (State_On | State_Sunken)); bool flat(state & State_AutoRaise); // update animation state // pressed takes precedence over mouse qreal mouseOpacity = 0.0; qreal pressedOpacity = 0.0; _animations->widgetStateEngine().updateState(widget, AnimationPressed, sunken); _animations->widgetStateEngine().updateState(widget, AnimationHover, mouseOver); AnimationMode mode(_animations->widgetStateEngine().buttonAnimationMode(widget)); if (mode == AnimationPressed) { pressedOpacity = _animations->widgetStateEngine().buttonOpacity(widget); } else if (sunken) { pressedOpacity = 1.0; } else if (mode == AnimationHover) { mouseOpacity = _animations->widgetStateEngine().buttonOpacity(widget); } else if (mouseOver) { mouseOpacity = 1.0; } // detect buttons in tabbar, for which special rendering is needed bool isDockWidgetTitleButton(widget && widget->inherits("QDockWidgetTitleButton")); bool inTabBar(widget && qobject_cast(widget->parentWidget())); bool isMenuTitle(this->isMenuTitle(widget)); if (isMenuTitle) { // copy option to adust state, and set font as not-bold QStyleOptionToolButton copy(*toolButtonOption); copy.font.setBold(false); copy.state = State_Enabled; // render renderMenuTitle(©, painter, widget); return true; } // copy option and alter palette QStyleOptionToolButton copy(*toolButtonOption); if (isDockWidgetTitleButton) { // cast to abstract button // adjust state to have correct icon rendered const QAbstractButton *button(qobject_cast(widget)); if (button->isChecked() || button->isDown()) { copy.state |= State_Enabled | State_On | State_Sunken; } if (button->underMouse()) { copy.state |= State_Enabled | State_MouseOver | State_Active; } } bool hasPopupMenu(toolButtonOption->features & QStyleOptionToolButton::MenuButtonPopup); const bool hasInlineIndicator( toolButtonOption->features & QStyleOptionToolButton::HasMenu && toolButtonOption->features & QStyleOptionToolButton::PopupDelay && !hasPopupMenu); QRect buttonRect(subControlRect(CC_ToolButton, option, SC_ToolButton, widget)); QRect menuRect(subControlRect(CC_ToolButton, option, SC_ToolButtonMenu, widget)); // frame if (toolButtonOption->subControls & SC_ToolButton || isDockWidgetTitleButton) { copy.rect = buttonRect; if (inTabBar) { QRect rect(option->rect); QColor background(Colors::mix(option->palette.window().color(), option->palette.shadow().color(), 0.15)); background = Colors::mix(background, Qt::white, 0.2 * mouseOpacity); background = Colors::mix(background, Qt::black, 0.15 * pressedOpacity); QColor outline(Colors::frameOutlineColor(StyleOptions(option->palette, _variant))); painter->setPen(background); painter->setBrush(background); switch (toolButtonOption->arrowType) { case Qt::UpArrow: painter->drawRect(rect.adjusted(1, 1, -2, -1)); break; case Qt::DownArrow: painter->drawRect(rect.adjusted(1, 0, -2, -2)); break; case Qt::LeftArrow: painter->drawRect(rect.adjusted(1, 1, -1, -2)); break; case Qt::RightArrow: painter->drawRect(rect.adjusted(0, 1, -2, -2)); break; default: break; } painter->setPen(outline); switch (toolButtonOption->arrowType) { case Qt::DownArrow: painter->drawLine(rect.bottomLeft(), rect.bottomRight()); break; case Qt::RightArrow: painter->drawLine(rect.topRight(), rect.bottomRight()); break; default: break; } switch (toolButtonOption->arrowType) { case Qt::UpArrow: case Qt::DownArrow: painter->drawLine(rect.topLeft(), rect.bottomLeft()); painter->drawLine(rect.topLeft(), rect.bottomLeft()); break; case Qt::LeftArrow: case Qt::RightArrow: painter->drawLine(rect.topLeft(), rect.topRight()); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); break; default: break; } } else if (sunken && hasPopupMenu && !(toolButtonOption->activeSubControls & SC_ToolButton)) { // Only menu button is active. so draw left hand side od button raised QStyleOptionToolButton btn(copy); btn.state |= State_Raised; btn.state &= ~State_Sunken; btn.state &= ~State_AutoRaise; drawPrimitive(PE_PanelButtonTool, &btn, painter, widget); } else { drawPrimitive(PE_PanelButtonTool, ©, painter, widget); } } // arrow if (hasPopupMenu) { copy.rect = menuRect; if (!flat || mouseOver || sunken) { drawPrimitive(PE_IndicatorButtonDropDown, ©, painter, widget); } drawPrimitive(PE_IndicatorArrowDown, ©, painter, widget); } else if (hasInlineIndicator) { copy.rect = menuRect; drawPrimitive(PE_IndicatorArrowDown, ©, painter, widget); } // contents { // restore state copy.state = state; // define contents rect QRect contentsRect(buttonRect); // detect dock widget title button // for dockwidget title buttons, do not take out margins, so that icon do not get scaled down if (isDockWidgetTitleButton) { // cast to abstract button // adjust state to have correct icon rendered const QAbstractButton *button(qobject_cast(widget)); if (button->isChecked() || button->isDown()) { copy.state |= State_Enabled | State_On | State_Sunken; } if (button->underMouse()) { copy.state |= State_Enabled | State_MouseOver | State_Active; } } else if (!inTabBar && hasInlineIndicator) { int marginWidth(flat ? Metrics::ToolButton_MarginWidth : Metrics::Button_MarginWidth + Metrics::Frame_FrameWidth); contentsRect = insideMargin(contentsRect, marginWidth, 0); contentsRect.setRight(contentsRect.right() - Metrics::ToolButton_InlineIndicatorWidth); contentsRect = visualRect(option, contentsRect); } copy.rect = contentsRect; // render drawControl(CE_ToolButtonLabel, ©, painter, widget); } return true; } //______________________________________________________________ bool Style::drawComboBoxComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionComboBox *comboBoxOption(qstyleoption_cast(option)); if (!comboBoxOption) { return true; } // rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // state const State &state(option->state); bool enabled(state & State_Enabled); bool windowActive(state & State_Active); bool editable(comboBoxOption->editable); bool arrowActive(comboBoxOption->activeSubControls & SC_ComboBoxArrow); bool flat(!comboBoxOption->frame); bool mouseOver; bool hasFocus; bool sunken; if (editable) { mouseOver = windowActive && arrowActive && enabled && (state & State_MouseOver); hasFocus = enabled && (state & (State_HasFocus | State_Sunken)); sunken = arrowActive && enabled && (state & (State_On | State_Sunken)); } else { mouseOver = windowActive && enabled && (state & State_MouseOver); hasFocus = enabled && (state & (State_HasFocus | State_Sunken)); sunken = enabled && (state & (State_On | State_Sunken)); } // update animation state // sunken takes precedence over hover that takes precedence over focus _animations->inputWidgetEngine().updateState(widget, AnimationPressed, sunken); _animations->inputWidgetEngine().updateState(widget, AnimationHover, mouseOver); _animations->inputWidgetEngine().updateState(widget, AnimationFocus, hasFocus && !mouseOver); // Style options StyleOptions styleOptions(option->palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setHasFocus(hasFocus); styleOptions.setSunken(sunken); // frame if (option->subControls & SC_ComboBoxFrame) { if (editable) { flat |= (rect.height() <= 2 * Metrics::Frame_FrameWidth + Metrics::MenuButton_IndicatorWidth); if (flat) { QColor background(palette.color(QPalette::Base)); painter->setBrush(background); painter->setPen(Qt::NoPen); painter->drawRect(rect); } else { AnimationMode mode(_animations->inputWidgetEngine().buttonAnimationMode(widget)); qreal opacity(_animations->inputWidgetEngine().buttonOpacity(widget)); // Style options styleOptions.setAnimationMode(mode); styleOptions.setOpacity(opacity); // define colors QColor shadow(Colors::shadowColor(styleOptions)); QColor outline(Colors::buttonOutlineColor(styleOptions)); QColor background(Colors::buttonBackgroundColor(styleOptions)); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setColor(background); styleOptions.setOutlineColor(outline); styleOptions.setActive(enabled && windowActive); // render Adwaita::Renderer::renderButtonFrame(styleOptions); QStyleOptionComplex tmpOpt(*option); tmpOpt.rect.setWidth(tmpOpt.rect.width() - subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget).width() + 3); drawPrimitive(PE_FrameLineEdit, &tmpOpt, painter, widget); } } else { AnimationMode mode(_animations->inputWidgetEngine().buttonAnimationMode(widget)); qreal opacity(_animations->inputWidgetEngine().buttonOpacity(widget)); // Style options styleOptions.setAnimationMode(mode); styleOptions.setOpacity(opacity); styleOptions.setPainter(painter); styleOptions.setRect(rect); styleOptions.setActive(enabled && windowActive); if (flat) { // define colors and render QColor color(Colors::toolButtonColor(styleOptions)); styleOptions.setColor(color); Adwaita::Renderer::renderToolButtonFrame(styleOptions); } else { // define colors QColor shadow(Colors::shadowColor(styleOptions)); QColor outline(Colors::buttonOutlineColor(styleOptions)); QColor background(Colors::buttonBackgroundColor(styleOptions)); styleOptions.setColor(background); styleOptions.setOutlineColor(outline); // render Adwaita::Renderer::renderButtonFrame(styleOptions); if (hasFocus) { QStyleOption copy(*option); copy.rect.adjust(4, 4, -4, -4); drawPrimitive(PE_FrameFocusRect, ©, painter, widget); } } } } // arrow if (option->subControls & SC_ComboBoxArrow) { // Style options styleOptions.setColorRole(QPalette::ButtonText); // arrow color QColor arrowColor = Colors::arrowOutlineColor(styleOptions); // arrow rect QRect arrowRect(subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget)); styleOptions.setRect(arrowRect); styleOptions.setColor(arrowColor); // render Adwaita::Renderer::renderArrow(styleOptions, ArrowDown); } return true; } //______________________________________________________________ bool Style::drawSpinBoxComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { const QStyleOptionSpinBox *spinBoxOption(qstyleoption_cast(option)); if (!spinBoxOption) { return true; } // store palette and rect const QPalette &palette(option->palette); const QRect &rect(option->rect); if (option->subControls & SC_SpinBoxFrame) { // detect flat spinboxes bool flat(!spinBoxOption->frame); flat |= (rect.height() < 2 * Metrics::Frame_FrameWidth + Metrics::SpinBox_ArrowButtonWidth); if (flat) { QColor background(palette.color(QPalette::Base)); painter->setBrush(background); painter->setPen(Qt::NoPen); painter->drawRect(rect); } else { drawPrimitive(PE_FrameLineEdit, option, painter, widget); } } if (option->subControls & SC_SpinBoxUp) { renderSpinBoxArrow(SC_SpinBoxUp, spinBoxOption, painter, widget); } if (option->subControls & SC_SpinBoxDown) { renderSpinBoxArrow(SC_SpinBoxDown, spinBoxOption, painter, widget); } return true; } //______________________________________________________________ bool Style::drawSliderComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return true; } // copy rect and palette const QRect &rect(option->rect); const QPalette &palette(option->palette); // copy state const State &state(option->state); bool enabled(state & State_Enabled); bool windowActive(state & State_Active); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool hasFocus(enabled && (state & State_HasFocus)); bool horizontal(sliderOption->orientation == Qt::Horizontal); Side tickSide { SideNone }; if (horizontal && sliderOption->tickPosition == QSlider::TicksAbove) { tickSide = (Side)((int) tickSide | (int) SideTop); } if (horizontal && sliderOption->tickPosition == QSlider::TicksBelow) { tickSide = (Side)((int) tickSide | (int) SideBottom); } if (!horizontal && sliderOption->tickPosition == QSlider::TicksLeft) { tickSide = (Side)((int) tickSide | (int) SideLeft); } if (!horizontal && sliderOption->tickPosition == QSlider::TicksRight) { tickSide = (Side)((int) tickSide | (int) SideRight); } // tickmarks if (Adwaita::Config::SliderDrawTickMarks && (sliderOption->subControls & SC_SliderTickmarks)) { bool upsideDown(sliderOption->upsideDown); int tickPosition(sliderOption->tickPosition); int available(pixelMetric(PM_SliderSpaceAvailable, option, widget)); int interval = sliderOption->tickInterval; if (interval < 1) { interval = sliderOption->pageStep; } if (interval >= 1) { int fudge(pixelMetric(PM_SliderLength, option, widget) / 2); int current(sliderOption->minimum); // store tick lines QRect grooveRect(subControlRect(CC_Slider, sliderOption, SC_SliderGroove, widget)); QList tickLines; if (horizontal) { if (tickPosition & QSlider::TicksAbove) { tickLines.append(QLine(rect.left(), grooveRect.top() - Metrics::Slider_TickMarginWidth, rect.left(), grooveRect.top() - Metrics::Slider_TickMarginWidth - Metrics::Slider_TickLength)); } if (tickPosition & QSlider::TicksBelow) { tickLines.append(QLine(rect.left(), grooveRect.bottom() + Metrics::Slider_TickMarginWidth, rect.left(), grooveRect.bottom() + Metrics::Slider_TickMarginWidth + Metrics::Slider_TickLength)); } } else { if (tickPosition & QSlider::TicksAbove) { tickLines.append(QLine(grooveRect.left() - Metrics::Slider_TickMarginWidth, rect.top(), grooveRect.left() - Metrics::Slider_TickMarginWidth - Metrics::Slider_TickLength, rect.top())); } if (tickPosition & QSlider::TicksBelow) { tickLines.append(QLine(grooveRect.right() + Metrics::Slider_TickMarginWidth, rect.top(), grooveRect.right() + Metrics::Slider_TickMarginWidth + Metrics::Slider_TickLength, rect.top())); } } // Style options StyleOptions styleOptions(palette, _variant); // colors QColor base(Colors::separatorColor(styleOptions)); while (current <= sliderOption->maximum) { // adjust color QColor color(base); painter->setPen(color); // calculate positions and draw lines int position(sliderPositionFromValue(sliderOption->minimum, sliderOption->maximum, current, available) + fudge); foreach (const QLine &tickLine, tickLines) { if (horizontal) { painter->drawLine(tickLine.translated(upsideDown ? (rect.width() - position) : position, 0)); } else { painter->drawLine(tickLine.translated(0, upsideDown ? (rect.height() - position) : position)); } } // go to next position current += interval; } } } // groove if (sliderOption->subControls & SC_SliderGroove) { if (hasFocus) { QRect focusRect = proxy()->subElementRect(SE_SliderFocusRect, option, widget); QStyleOptionFocusRect fropt; fropt.QStyleOption::operator=(*option); fropt.rect = focusRect; proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget); } // retrieve groove rect QRect grooveRect(subControlRect(CC_Slider, sliderOption, SC_SliderGroove, widget)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setPainter(painter); // base color QColor outline(Colors::buttonOutlineColor(styleOptions)); QColor grooveColor(Colors::mix(outline, palette.color(QPalette::Window))); QColor highlightColor(palette.color(QPalette::Highlight)); QColor highlightOutline(_dark ? Colors::darken(highlightColor, 0.3) : Colors::darken(highlightColor, 0.15)); if (!enabled) { styleOptions.setRect(grooveRect); styleOptions.setColor(grooveColor); styleOptions.setOutlineColor(outline); Adwaita::Renderer::renderProgressBarGroove(styleOptions); } else { bool upsideDown(sliderOption->upsideDown); // handle rect QRect handleRect(subControlRect(CC_Slider, sliderOption, SC_SliderHandle, widget)); if (sliderOption->orientation == Qt::Horizontal) { QRect leftRect(grooveRect); QRect rightRect(grooveRect); leftRect.setRight(handleRect.right() - Metrics::Slider_ControlThickness / 2); rightRect.setLeft(handleRect.left() + Metrics::Slider_ControlThickness / 2); if (upsideDown) { styleOptions.setRect(leftRect); styleOptions.setColor(grooveColor); styleOptions.setOutlineColor(grooveColor); Adwaita::Renderer::renderProgressBarGroove(styleOptions); styleOptions.setRect(rightRect); styleOptions.setColor(highlightColor); styleOptions.setOutlineColor(highlightColor); Adwaita::Renderer::renderProgressBarContents(styleOptions); } else { styleOptions.setRect(leftRect); styleOptions.setColor(highlightColor); styleOptions.setOutlineColor(highlightColor); Adwaita::Renderer::renderProgressBarContents(styleOptions); styleOptions.setRect(rightRect); styleOptions.setColor(grooveColor); styleOptions.setOutlineColor(grooveColor); Adwaita::Renderer::renderProgressBarGroove(styleOptions); } } else { QRect topRect(grooveRect); topRect.setBottom(handleRect.bottom() - Metrics::Slider_ControlThickness / 2); QRect bottomRect(grooveRect); bottomRect.setTop(handleRect.top() + Metrics::Slider_ControlThickness / 2); if (upsideDown) { styleOptions.setRect(topRect); styleOptions.setColor(grooveColor); styleOptions.setOutlineColor(grooveColor); Adwaita::Renderer::renderProgressBarGroove(styleOptions); styleOptions.setRect(bottomRect); styleOptions.setColor(highlightColor); styleOptions.setOutlineColor(highlightColor); Adwaita::Renderer::renderProgressBarContents(styleOptions); } else { styleOptions.setRect(topRect); styleOptions.setColor(highlightColor); styleOptions.setOutlineColor(highlightColor); Adwaita::Renderer::renderProgressBarContents(styleOptions); styleOptions.setRect(bottomRect); styleOptions.setColor(grooveColor); styleOptions.setOutlineColor(grooveColor); Adwaita::Renderer::renderProgressBarGroove(styleOptions); } } } } // handle if (sliderOption->subControls & SC_SliderHandle) { // get rect and center QRect handleRect(subControlRect(CC_Slider, sliderOption, SC_SliderHandle, widget)); // handle state bool handleActive(sliderOption->activeSubControls & SC_SliderHandle); // animation state _animations->widgetStateEngine().updateState(widget, AnimationHover, handleActive && mouseOver); _animations->widgetStateEngine().updateState(widget, AnimationFocus, hasFocus); AnimationMode mode(_animations->widgetStateEngine().buttonAnimationMode(widget)); qreal opacity(_animations->widgetStateEngine().buttonOpacity(widget)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setMouseOver(mouseOver); styleOptions.setOpacity(opacity); styleOptions.setAnimationMode(mode); // define colors QColor background(Colors::buttonBackgroundColor(styleOptions)); styleOptions.setMouseOver(handleActive && mouseOver); QColor outline(Colors::buttonOutlineColor(styleOptions)); QColor shadow(Colors::shadowColor(styleOptions)); styleOptions.setPainter(painter); styleOptions.setRect(handleRect); styleOptions.setColor(background); styleOptions.setOutlineColor(outline); styleOptions.setActive(enabled && windowActive); // render Adwaita::Renderer::renderSliderHandle(styleOptions, tickSide); } return true; } //______________________________________________________________ bool Style::drawDialComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionSlider *sliderOption(qstyleoption_cast(option)); if (!sliderOption) { return true; } const QPalette &palette(option->palette); const State &state(option->state); bool enabled(state & State_Enabled); bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); bool hasFocus(enabled && (state & State_HasFocus)); bool horizontal(sliderOption->orientation == Qt::Horizontal); Side tickSide { SideNone }; if (horizontal && sliderOption->tickPosition == QSlider::TicksAbove) { tickSide = (Side)((int) tickSide | (int) SideTop); } if (horizontal && sliderOption->tickPosition == QSlider::TicksBelow) { tickSide = (Side)((int) tickSide | (int) SideBottom); } if (!horizontal && sliderOption->tickPosition == QSlider::TicksLeft) { tickSide = (Side)((int) tickSide | (int) SideLeft); } if (!horizontal && sliderOption->tickPosition == QSlider::TicksRight) { tickSide = (Side)((int) tickSide | (int) SideRight); } // do not render tickmarks if (sliderOption->subControls & SC_DialTickmarks) {} // groove if (sliderOption->subControls & SC_DialGroove) { // groove rect QRect grooveRect(subControlRect(CC_Dial, sliderOption, SC_SliderGroove, widget)); // groove QColor grooveColor(Colors::mix(palette.color(QPalette::Window), palette.color(QPalette::WindowText), 0.3)); StyleOptions styleOptions(painter, grooveRect); styleOptions.setColor(grooveColor); styleOptions.setColorVariant(_variant); // render groove Adwaita::Renderer::renderDialGroove(styleOptions); if (enabled) { // highlight QColor highlight(palette.color(QPalette::Highlight)); // angles qreal first(dialAngle(sliderOption, sliderOption->minimum)); qreal second(dialAngle(sliderOption, sliderOption->sliderPosition)); StyleOptions styleOptions(painter, grooveRect); styleOptions.setColor(highlight); styleOptions.setColorVariant(_variant); // render contents Adwaita::Renderer::renderDialContents(styleOptions, first, second); } } // handle if (sliderOption->subControls & SC_DialHandle) { // get handle rect QRect handleRect(subControlRect(CC_Dial, sliderOption, SC_DialHandle, widget)); handleRect = centerRect(handleRect, Metrics::Slider_ControlThickness, Metrics::Slider_ControlThickness); // handle state bool handleActive(mouseOver && handleRect.contains(_animations->dialEngine().position(widget))); bool sunken(state & (State_On | State_Sunken)); // animation state _animations->dialEngine().setHandleRect(widget, handleRect); _animations->dialEngine().updateState(widget, AnimationHover, handleActive && mouseOver); _animations->dialEngine().updateState(widget, AnimationFocus, hasFocus); AnimationMode mode(_animations->dialEngine().buttonAnimationMode(widget)); qreal opacity(_animations->dialEngine().buttonOpacity(widget)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setAnimationMode(mode); styleOptions.setMouseOver(handleActive && mouseOver); styleOptions.setHasFocus(hasFocus); styleOptions.setOpacity(opacity); // define colors QColor background(palette.color(QPalette::Button)); QColor outline(Colors::sliderOutlineColor(styleOptions)); QColor shadow(Colors::shadowColor(styleOptions)); // render qreal angle = 270 - 180 * dialAngle(sliderOption, sliderOption->sliderPosition) / M_PI; styleOptions.setPainter(painter); styleOptions.setRect(handleRect); styleOptions.setColor(background); styleOptions.setOutlineColor(outline); styleOptions.setSunken(sunken); styleOptions.setActive(enabled); Adwaita::Renderer::renderSliderHandle(styleOptions, tickSide, angle); } return true; } //______________________________________________________________ bool Style::drawScrollBarComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { //the animation for QStyle::SC_ScrollBarGroove is special: it will animate //the opacity of everything else as well, included slider and arrows bool enabled(option->state & State_Enabled); qreal opacity(_animations->scrollBarEngine().opacity(widget, QStyle::SC_ScrollBarGroove)); bool animated(Adwaita::Config::ScrollBarShowOnMouseOver && _animations->scrollBarEngine().isAnimated(widget, AnimationHover, QStyle::SC_ScrollBarGroove)); bool mouseOver((option->state & State_Active) && option->state & State_MouseOver); if (opacity == AnimationData::OpacityInvalid) { opacity = 1; } // render full groove directly, rather than using the addPage and subPage control element methods if ((mouseOver || animated) && option->subControls & SC_ScrollBarGroove) { // retrieve groove rectangle QRect grooveRect(subControlRect(CC_ScrollBar, option, SC_ScrollBarGroove, widget)); const QPalette &palette(option->palette); QColor color; if (_dark) { color = Colors::mix(palette.color(QPalette::Window), Colors::mix(palette.color(QPalette::Base), palette.color(QPalette::Window), 0.5), opacity); } else { color = Colors::mix(palette.color(QPalette::Window), Colors::mix(palette.color(QPalette::Window), palette.color(QPalette::Text), 0.2), opacity); } const State &state(option->state); bool horizontal(state & State_Horizontal); if (horizontal) { grooveRect = centerRect(grooveRect, grooveRect.width(), Metrics::ScrollBar_SliderWidth); } else { grooveRect = centerRect(grooveRect, Metrics::ScrollBar_SliderWidth, grooveRect.height()); } // render if (enabled) { painter->setPen(Qt::NoPen); painter->setBrush(color); painter->drawRect(option->rect); } } // call base class primitive //ParentStyleClass::drawComplexControl( CC_ScrollBar, option, painter, widget ); if (const QStyleOptionSlider *scrollbar = qstyleoption_cast(option)) { QStyleOptionSlider newScrollbar = *scrollbar; State saveFlags = scrollbar->state; if (scrollbar->subControls & SC_ScrollBarSlider) { newScrollbar.rect = scrollbar->rect; newScrollbar.state = saveFlags; newScrollbar.rect = proxy()->subControlRect(CC_ScrollBar, &newScrollbar, SC_ScrollBarSlider, widget); if (newScrollbar.rect.isValid()) { proxy()->drawControl(CE_ScrollBarSlider, &newScrollbar, painter, widget); if (scrollbar->state & State_HasFocus) { QStyleOptionFocusRect fropt; fropt.QStyleOption::operator=(newScrollbar); fropt.rect.setRect(newScrollbar.rect.x() + 2, newScrollbar.rect.y() + 2, newScrollbar.rect.width() - 5, newScrollbar.rect.height() - 5); proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget); } } } } return true; } //______________________________________________________________ bool Style::drawTitleBarComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { // cast option and check const QStyleOptionTitleBar *titleBarOption(qstyleoption_cast(option)); if (!titleBarOption) { return true; } // store palette and rect QPalette palette(option->palette); const QRect &rect(option->rect); const State &flags(option->state); bool enabled(flags & State_Enabled); bool active(enabled && (titleBarOption->titleBarState & Qt::WindowActive)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setActive(active); if (titleBarOption->subControls & SC_TitleBarLabel) { // render background painter->setClipRect(rect); QColor outline(Colors::frameOutlineColor(styleOptions)); QColor background(Colors::titleBarColor(styleOptions)); styleOptions.setPainter(painter); styleOptions.setRect(rect.adjusted(-1, -1, 1, 3)); styleOptions.setColor(background); styleOptions.setOutlineColor(outline); Adwaita::Renderer::renderTabWidgetFrame(styleOptions, CornersTop); painter->setRenderHint(QPainter::Antialiasing, false); painter->setBrush(Qt::NoBrush); painter->setPen(outline); painter->drawLine(rect.bottomLeft(), rect.bottomRight()); // render text palette.setColor(QPalette::WindowText, Colors::titleBarTextColor(styleOptions)); QRect textRect(subControlRect(CC_TitleBar, option, SC_TitleBarLabel, widget)); ParentStyleClass::drawItemText(painter, textRect, Qt::AlignCenter, palette, active, titleBarOption->text, QPalette::WindowText); } // buttons static const QList subControls = { SC_TitleBarMinButton, SC_TitleBarMaxButton, SC_TitleBarCloseButton, SC_TitleBarNormalButton, SC_TitleBarSysMenu }; // loop over supported buttons foreach (const SubControl &subControl, subControls) { // skip if not requested if (!(titleBarOption->subControls & subControl)) { continue; } // find matching icon QIcon icon; switch (subControl) { case SC_TitleBarMinButton: icon = standardIcon(SP_TitleBarMinButton, option, widget); break; case SC_TitleBarMaxButton: icon = standardIcon(SP_TitleBarMaxButton, option, widget); break; case SC_TitleBarCloseButton: icon = standardIcon(SP_TitleBarCloseButton, option, widget); break; case SC_TitleBarNormalButton: icon = standardIcon(SP_TitleBarNormalButton, option, widget); break; case SC_TitleBarSysMenu: icon = titleBarOption->icon; break; default: break; } // check icon if (icon.isNull()) { continue; } // define icon rect QRect iconRect(subControlRect(CC_TitleBar, option, subControl, widget)); if (iconRect.isEmpty()) { continue; } // active state bool subControlActive(titleBarOption->activeSubControls & subControl); // mouse over state const bool mouseOver(!subControlActive && widget && iconRect.translated(widget->mapToGlobal(QPoint(0, 0))).contains(QCursor::pos())); // adjust iconRect int iconWidth(pixelMetric(PM_SmallIconSize, option, widget)); QSize iconSize(iconWidth, iconWidth); iconRect = centerRect(iconRect, iconSize); // set icon mode and state QIcon::Mode iconMode; QIcon::State iconState; if (!enabled) { iconMode = QIcon::Disabled; iconState = QIcon::Off; } else { if (mouseOver) { iconMode = QIcon::Active; } else { iconMode = QIcon::Normal; } iconState = subControlActive ? QIcon::On : QIcon::Off; } // get pixmap and render QPixmap pixmap = icon.pixmap(iconSize, iconMode, iconState); painter->drawPixmap(iconRect, pixmap); } return true; } //____________________________________________________________________________________________________ void Style::renderSpinBoxArrow(const SubControl &subControl, const QStyleOptionSpinBox *option, QPainter *painter, const QWidget *widget) const { const QPalette &palette(option->palette); const State &state(option->state); // enable state bool hasFocus(state & State_HasFocus); bool enabled(state & State_Enabled); bool sunken(state & State_Sunken && option->activeSubControls & subControl); const QColor &outline = Colors::frameOutlineColor(StyleOptions(palette, _variant)).lighter(120); // check steps enable step const bool atLimit((subControl == SC_SpinBoxUp && !(option->stepEnabled & QAbstractSpinBox::StepUpEnabled)) || (subControl == SC_SpinBoxDown && !(option->stepEnabled & QAbstractSpinBox::StepDownEnabled))); // update enabled state accordingly enabled &= !atLimit; // update mouse-over effect bool mouseOver((state & State_Active) && enabled && (state & State_MouseOver)); // check animation state bool subControlHover(enabled && (mouseOver) && (option->activeSubControls & subControl)); bool subControlSunken(enabled && (sunken) && (option->activeSubControls & subControl)); _animations->spinBoxEngine().updateState(widget, subControl, subControlHover, subControlSunken); qreal opacity(_animations->spinBoxEngine().opacity(widget, subControl)); qreal pressedOpacity(_animations->spinBoxEngine().pressed(widget, subControl)); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setColorRole(QPalette::Text); QColor color = Colors::arrowOutlineColor(styleOptions); if (atLimit) { styleOptions.setColorGroup(QPalette::Disabled); color = Colors::arrowOutlineColor(styleOptions); } // arrow orientation ArrowOrientation orientation((subControl == SC_SpinBoxUp) ? ArrowUp : ArrowDown); // arrow rect QRect arrowRect(subControlRect(CC_SpinBox, option, subControl, widget)); if (subControl == SC_SpinBoxDown) { painter->setBrush(Qt::NoBrush); painter->setPen(outline); int highlight = hasFocus ? 1 : 0; painter->drawLine(arrowRect.left(), arrowRect.top() + 2 + highlight, arrowRect.left(), arrowRect.bottom() - 1 - highlight); } if (subControl == SC_SpinBoxUp) { painter->setBrush(Qt::NoBrush); painter->setPen(outline); int highlight = hasFocus ? 1 : 0; painter->drawLine(arrowRect.left(), arrowRect.top() + 2 + highlight, arrowRect.left(), arrowRect.bottom() - 1 - highlight); } if (true) { painter->setPen(Qt::NoPen); QColor background = Colors::mix(palette.base().color(), palette.text().color(), opacity * 0.1); background = Colors::mix(background, palette.dark().color(), pressedOpacity); painter->setBrush(background); if (hasFocus) { painter->drawRect(arrowRect.adjusted(1, 3, -1, -2)); } else { painter->drawRect(arrowRect.adjusted(1, 2, -1, -1)); } } // render styleOptions.setPainter(painter); styleOptions.setRect(arrowRect); styleOptions.setColor(color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderSign(styleOptions, orientation == ArrowUp); return; } //______________________________________________________________________________ void Style::renderMenuTitle(const QStyleOptionToolButton *option, QPainter *painter, const QWidget *) const { // render a separator at the bottom const QPalette &palette(option->palette); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setPainter(painter); styleOptions.setRect(QRect(option->rect.bottomLeft() - QPoint(0, Metrics::MenuItem_MarginWidth), QSize(option->rect.width(), 1))); styleOptions.setColor(Colors::separatorColor(styleOptions)); Adwaita::Renderer::renderSeparator(styleOptions); // render text in the center of the rect // icon is discarded on purpose painter->setFont(option->font); QRect contentsRect = insideMargin(option->rect, Metrics::MenuItem_MarginWidth); drawItemText(painter, contentsRect, Qt::AlignCenter, palette, true, option->text, QPalette::WindowText); } //______________________________________________________________________________ qreal Style::dialAngle(const QStyleOptionSlider *sliderOption, int value) const { // calculate angle at which handle needs to be drawn qreal angle(0); if (sliderOption->maximum == sliderOption->minimum) { angle = M_PI / 2; } else { qreal fraction(qreal(value - sliderOption->minimum) / qreal(sliderOption->maximum - sliderOption->minimum)); if (!sliderOption->upsideDown) { fraction = 1 - fraction; } if (sliderOption->dialWrapping) { angle = 1.5 * M_PI - fraction * 2 * M_PI; } else { angle = (M_PI * 8 - fraction * 10 * M_PI) / 6; } } return angle; } //______________________________________________________________________________ const QWidget *Style::scrollBarParent(const QWidget *widget) const { // check widget and parent if (!(widget && widget->parentWidget())) { return nullptr; } // try cast to scroll area. Must test both parent and grandparent QAbstractScrollArea *scrollArea; if (!(scrollArea = qobject_cast(widget->parentWidget()))) { scrollArea = qobject_cast(widget->parentWidget()->parentWidget()); } // check scrollarea if (scrollArea && (widget == scrollArea->verticalScrollBar() || widget == scrollArea->horizontalScrollBar())) { return scrollArea; } else if (widget->parentWidget()->inherits("KTextEditor::View")) { return widget->parentWidget(); } else { return nullptr; } } //______________________________________________________________________________ QColor Style::scrollBarArrowColor(const QStyleOptionSlider *option, const SubControl &control, const QWidget *widget) const { const QRect &rect(option->rect); const QPalette &palette(option->palette); // Style options StyleOptions styleOptions(palette, _variant); styleOptions.setColorRole(QPalette::WindowText); QColor color(Colors::arrowOutlineColor(styleOptions)); bool widgetMouseOver((option->state & State_MouseOver) && (option->state & State_MouseOver)); if (widget) { widgetMouseOver = widget->underMouse(); } else if (option->styleObject) { // in case this QStyle is used by QQuickControls QStyle wrapper widgetMouseOver = option->styleObject->property("hover").toBool(); } // check enabled state bool enabled(option->state & State_Enabled); if (!enabled) { if (Adwaita::Config::ScrollBarShowOnMouseOver) { // finally, global opacity when ScrollBarShowOnMouseOver qreal globalOpacity(_animations->scrollBarEngine().opacity(widget, QStyle::SC_ScrollBarGroove)); if (globalOpacity >= 0) { color.setAlphaF(globalOpacity); } else if (!widgetMouseOver) { // no mouse over and no animation in progress, don't draw arrows at all return Qt::transparent; } } return color; } if ((control == SC_ScrollBarSubLine && option->sliderValue == option->minimum) || (control == SC_ScrollBarAddLine && option->sliderValue == option->maximum)) { // Style options styleOptions.setColorGroup(QPalette::Disabled); // manually disable arrow, to indicate that scrollbar is at limit color = Colors::arrowOutlineColor(styleOptions); if (Adwaita::Config::ScrollBarShowOnMouseOver) { // finally, global opacity when ScrollBarShowOnMouseOver qreal globalOpacity(_animations->scrollBarEngine().opacity(widget, QStyle::SC_ScrollBarGroove)); if (globalOpacity >= 0) { color.setAlphaF(globalOpacity); } else if (!widgetMouseOver) { // no mouse over and no animation in progress, don't draw arrows at all return Qt::transparent; } } return color; } bool mouseOver((option->state & State_Active) && _animations->scrollBarEngine().isHovered(widget, control)); bool animated(_animations->scrollBarEngine().isAnimated(widget, AnimationHover, control)); qreal opacity(_animations->scrollBarEngine().opacity(widget, control)); // retrieve mouse position from engine QPoint position(mouseOver ? _animations->scrollBarEngine().position(widget) : QPoint(-1, -1)); if (mouseOver && rect.contains(position)) { /* * need to update the arrow controlRect on fly because there is no * way to get it from the styles directly, outside of repaint events */ _animations->scrollBarEngine().setSubControlRect(widget, control, rect); } if (rect.intersects(_animations->scrollBarEngine().subControlRect(widget, control))) { QColor highlight = Colors::hoverColor(StyleOptions(palette, _variant)); if (animated) { color = Colors::mix(color, highlight, opacity); } else if (mouseOver) { color = highlight; } } if (Adwaita::Config::ScrollBarShowOnMouseOver) { // finally, global opacity when ScrollBarShowOnMouseOver qreal globalOpacity(_animations->scrollBarEngine().opacity(widget, QStyle::SC_ScrollBarGroove)); if (globalOpacity >= 0) { color.setAlphaF(globalOpacity); } else if (!widgetMouseOver) { // no mouse over and no animation in progress, don't draw arrows at all return Qt::transparent; } } return color; } //____________________________________________________________________________________ void Style::setTranslucentBackground(QWidget *widget) const { if (!_isKDE) { return; } widget->setAttribute(Qt::WA_TranslucentBackground); #ifdef Q_WS_WIN // FramelessWindowHint is needed on windows to make WA_TranslucentBackground work properly widget->setWindowFlags(widget->windowFlags() | Qt::FramelessWindowHint); #endif } //____________________________________________________________________________________ QStyleOptionToolButton Style::separatorMenuItemOption(const QStyleOptionMenuItem *menuItemOption, const QWidget *widget) const { // separator can have a title and an icon // in that case they are rendered as sunken flat toolbuttons QStyleOptionToolButton toolButtonOption; toolButtonOption.initFrom(widget); toolButtonOption.rect = menuItemOption->rect; toolButtonOption.features = QStyleOptionToolButton::None; toolButtonOption.state = State_Enabled | State_AutoRaise; toolButtonOption.subControls = SC_ToolButton; toolButtonOption.icon = QIcon(); toolButtonOption.iconSize = QSize(); toolButtonOption.text = menuItemOption->text; toolButtonOption.toolButtonStyle = Qt::ToolButtonTextBesideIcon; return toolButtonOption; } //____________________________________________________________________________________ QIcon Style::toolBarExtensionIcon(StandardPixmap standardPixmap, const QStyleOption *option, const QWidget *widget) const { // store palette // due to Qt, it is not always safe to assume that either option, nor widget are defined QPalette palette; if (option) { palette = option->palette; } else if (widget) { palette = widget->palette(); } else { palette = QApplication::palette(); } // convenience class to map color to icon mode struct IconData { QColor _color; QIcon::Mode _mode; QIcon::State _state; }; // map colors to icon states const QList iconTypes = { { palette.color(QPalette::Active, QPalette::WindowText), QIcon::Normal, QIcon::Off }, { palette.color(QPalette::Active, QPalette::WindowText), QIcon::Selected, QIcon::Off }, { palette.color(QPalette::Active, QPalette::WindowText), QIcon::Active, QIcon::Off }, { palette.color(QPalette::Disabled, QPalette::WindowText), QIcon::Disabled, QIcon::Off }, { palette.color(QPalette::Active, QPalette::HighlightedText), QIcon::Normal, QIcon::On }, { palette.color(QPalette::Active, QPalette::HighlightedText), QIcon::Selected, QIcon::On }, { palette.color(QPalette::Active, QPalette::WindowText), QIcon::Active, QIcon::On }, { palette.color(QPalette::Disabled, QPalette::WindowText), QIcon::Disabled, QIcon::On } }; // default icon sizes static const QList iconSizes = { 8, 16, 22, 32, 48 }; // decide arrow orientation ArrowOrientation orientation(standardPixmap == SP_ToolBarHorizontalExtensionButton ? ArrowRight : ArrowDown); // create icon and fill QIcon icon; foreach (const IconData &iconData, iconTypes) { foreach (const int &iconSize, iconSizes) { // create pixmap QPixmap pixmap(iconSize, iconSize); pixmap.fill(Qt::transparent); // render QPainter painter(&pixmap); // icon size int fixedIconSize(pixelMetric(QStyle::PM_SmallIconSize, option, widget)); QRect fixedRect(0, 0, fixedIconSize, fixedIconSize); painter.setWindow(fixedRect); painter.translate(standardPixmap == SP_ToolBarHorizontalExtensionButton ? QPoint(1, 0) : QPoint(0, 1)); StyleOptions styleOptions(&painter, fixedRect); styleOptions.setColor(iconData._color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderArrow(styleOptions, orientation); painter.end(); // add to icon icon.addPixmap(pixmap, iconData._mode, iconData._state); } } return icon; } //____________________________________________________________________________________ QIcon Style::titleBarButtonIcon(StandardPixmap standardPixmap, const QStyleOption *option, const QWidget *widget) const { // map standardPixmap to button type ButtonType buttonType; switch (standardPixmap) { case SP_TitleBarNormalButton: buttonType = ButtonRestore; break; case SP_TitleBarMinButton: buttonType = ButtonMinimize; break; case SP_TitleBarMaxButton: buttonType = ButtonMaximize; break; case SP_TitleBarCloseButton: case SP_DockWidgetCloseButton: buttonType = ButtonClose; break; default: return QIcon(); } // store palette // due to Qt, it is not always safe to assume that either option, nor widget are defined QPalette palette; if (option) { palette = option->palette; } else if (widget) { palette = widget->palette(); } else { palette = QApplication::palette(); } bool isCloseButton(buttonType == ButtonClose && Adwaita::Config::OutlineCloseButton); palette.setCurrentColorGroup(QPalette::Active); QColor base(palette.color(QPalette::WindowText)); QColor selected(palette.color(QPalette::HighlightedText)); QColor negative(buttonType == ButtonClose ? Colors::negativeText(StyleOptions(palette, _variant)) : base); QColor negativeSelected(buttonType == ButtonClose ? Colors::negativeText(StyleOptions(palette, _variant)) : selected); bool invertNormalState(isCloseButton); // convenience class to map color to icon mode struct IconData { QColor _color; bool _inverted; QIcon::Mode _mode; QIcon::State _state; }; // map colors to icon states const QList iconTypes = { // state off icons { Colors::mix(palette.color(QPalette::Window), base, 0.5), invertNormalState, QIcon::Normal, QIcon::Off }, { Colors::mix(palette.color(QPalette::Window), selected, 0.5), invertNormalState, QIcon::Selected, QIcon::Off }, { Colors::mix(palette.color(QPalette::Window), negative, 0.5), true, QIcon::Active, QIcon::Off }, { Colors::mix(palette.color(QPalette::Window), base, 0.2), invertNormalState, QIcon::Disabled, QIcon::Off }, // state on icons { Colors::mix(palette.color(QPalette::Window), negative, 0.7), true, QIcon::Normal, QIcon::On }, { Colors::mix(palette.color(QPalette::Window), negativeSelected, 0.7), true, QIcon::Selected, QIcon::On }, { Colors::mix(palette.color(QPalette::Window), negative, 0.7), true, QIcon::Active, QIcon::On }, { Colors::mix(palette.color(QPalette::Window), base, 0.2), invertNormalState, QIcon::Disabled, QIcon::On } }; // default icon sizes static const QList iconSizes = { 8, 16, 22, 32, 48 }; // output icon QIcon icon; foreach (const IconData &iconData, iconTypes) { foreach (const int &iconSize, iconSizes) { // create pixmap QPixmap pixmap(iconSize, iconSize); pixmap.fill(Qt::transparent); // create painter and render QPainter painter(&pixmap); StyleOptions styleOptions(&painter, pixmap.rect()); styleOptions.setColor(iconData._color); styleOptions.setColorVariant(_variant); Adwaita::Renderer::renderDecorationButton(styleOptions, buttonType); painter.end(); // store icon.addPixmap(pixmap, iconData._mode, iconData._state); } } return icon; } //______________________________________________________________________________ const QAbstractItemView *Style::itemViewParent(const QWidget *widget) const { const QAbstractItemView *itemView(nullptr); // check widget directly if ((itemView = qobject_cast(widget))) { return itemView; // check widget grand-parent } else if (widget && widget->parentWidget() && (itemView = qobject_cast(widget->parentWidget()->parentWidget())) && itemView->viewport() == widget->parentWidget()) { return itemView; } else { return nullptr; } } //____________________________________________________________________ bool Style::isSelectedItem(const QWidget *widget, const QPoint &localPosition) const { // get relevant itemview parent and check const QAbstractItemView *itemView(itemViewParent(widget)); if (!(itemView && itemView->hasFocus() && itemView->selectionModel())) { return false; } QPoint position = widget->mapTo(itemView, localPosition); // get matching QModelIndex and check QModelIndex index(itemView->indexAt(position)); if (!index.isValid()) { return false; } // check whether index is selected return itemView->selectionModel()->isSelected(index); } //____________________________________________________________________ bool Style::isQtQuickControl(const QStyleOption *option, const QWidget *widget) const { return (widget == nullptr) && option && option->styleObject && option->styleObject->inherits("QQuickItem"); } //____________________________________________________________________ bool Style::showIconsInMenuItems(void) const { return Adwaita::Settings::ShowIconsInMenuItems && !QCoreApplication::testAttribute(Qt::AA_DontShowIconsInMenus); } //____________________________________________________________________ bool Style::showIconsOnPushButtons(void) const { return Adwaita::Settings::ShowIconsOnPushButtons; } //____________________________________________________________________ bool Style::isMenuTitle(const QWidget *widget) const { // check widget if (!widget) { return false; } // check property QVariant property(widget->property(PropertyNames::menuTitle)); if (property.isValid()) { return property.toBool(); } // detect menu toolbuttons QWidget *parent = widget->parentWidget(); if (qobject_cast(parent)) { foreach (auto child, parent->findChildren()) { if (child->defaultWidget() != widget) { continue; } const_cast(widget)->setProperty(PropertyNames::menuTitle, true); return true; } } const_cast(widget)->setProperty(PropertyNames::menuTitle, false); return false; } //____________________________________________________________________ bool Style::hasAlteredBackground(const QWidget *widget) const { // check widget if (!widget) { return false; } // check property QVariant property(widget->property(PropertyNames::alteredBackground)); if (property.isValid()) { return property.toBool(); } // check if widget is of relevant type bool hasAlteredBackground(false); if (const QGroupBox *groupBox = qobject_cast(widget)) { hasAlteredBackground = !groupBox->isFlat(); } else if (const QTabWidget *tabWidget = qobject_cast(widget)) { hasAlteredBackground = !tabWidget->documentMode(); } else if (qobject_cast(widget)) { hasAlteredBackground = true; } else if (Adwaita::Config::DockWidgetDrawFrame && qobject_cast(widget)) { hasAlteredBackground = true; } if (widget->parentWidget() && !hasAlteredBackground) { hasAlteredBackground = this->hasAlteredBackground(widget->parentWidget()); } const_cast(widget)->setProperty(PropertyNames::alteredBackground, hasAlteredBackground); return hasAlteredBackground; } } adwaita-qt-1.4.1/src/style/adwaitastyle.h000066400000000000000000000675351414271704400203700ustar00rootroot00000000000000/************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * Copyright (C) 2014-2018 Martin Bříza * * Copyright (C) 2019 Jan Grulich * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #ifndef ADWAITA_STYLE_H #define ADWAITA_STYLE_H #include "adwaita.h" #include "config-adwaita.h" #include #include #include #include #include #include #include #include #include #include namespace AdwaitaPrivate { class TabBarData; } namespace Adwaita { class Animations; class Helper; class Mnemonics; class SplitterFactory; class WidgetExplorer; class WindowManager; //* convenience typedef for base class using ParentStyleClass = QCommonStyle; //* base class for adwaita style /** it is responsible to draw all the primitives to be displayed on screen, on request from Qt paint engine */ class Style : public ParentStyleClass { Q_OBJECT /* this tells kde applications that custom style elements are supported, using the kstyle mechanism */ Q_CLASSINFO("X-KDE-CustomElements", "true") public: //* constructor explicit Style(ColorVariant variant); //* destructor virtual ~Style(void); //* needed to avoid warnings at compilation time using ParentStyleClass::polish; using ParentStyleClass::unpolish; //* widget polishing virtual void polish(QWidget *widget); //* widget unpolishing virtual void unpolish(QWidget *widget); //* palette polishing virtual void polish(QPalette &palette); virtual QPalette standardPalette() const; //* polish scrollarea void polishScrollArea(QAbstractScrollArea *scrollArea); //* pixel metrics virtual int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const; //* style hints virtual int styleHint(StyleHint hint, const QStyleOption *option = nullptr, const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const; //* returns rect corresponding to one widget's subelement virtual QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const; //* returns rect corresponding to one widget's subcontrol virtual QRect subControlRect(ComplexControl element, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; //* returns size matching contents QSize sizeFromContents(ContentsType element, const QStyleOption *option, const QSize &size, const QWidget *widget) const; //* returns which subcontrol given QPoint corresponds to SubControl hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option , const QPoint &point, const QWidget *widget) const; //* primitives void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; //* controls void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; //* complex controls void drawComplexControl(ComplexControl element, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; //* generic text rendering virtual void drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &palette, bool enabled, const QString &text, QPalette::ColorRole textRole = QPalette::NoRole) const; //*@name event filters //@{ virtual bool eventFilter(QObject *object, QEvent *event); bool eventFilterScrollArea(QWidget *widget, QEvent *event); bool eventFilterComboBoxContainer(QWidget *widget, QEvent *event); bool eventFilterDockWidget(QDockWidget *dockWidget, QEvent *event); bool eventFilterMdiSubWindow(QMdiSubWindow *subWindow, QEvent *event); bool eventFilterCommandLinkButton(QCommandLinkButton *button, QEvent *event); //* install event filter to object, in a unique way void addEventFilter(QObject *object) { object->removeEventFilter(this); object->installEventFilter(this); } //@} protected Q_SLOTS: //* update configuration void configurationChanged(void); //* standard icons virtual QIcon standardIconImplementation(StandardPixmap standardPixmap, const QStyleOption *option, const QWidget *widget) const; protected: //* standard icons virtual QIcon standardIcon(StandardPixmap pixmap, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const { return standardIconImplementation(pixmap, option, widget); } //* load configuration void loadConfiguration(); //*@name subelementRect specialized functions //@{ //* default implementation. Does not change anything QRect defaultSubElementRect(const QStyleOption *option, const QWidget *widget) const { return option->rect; } QRect pushButtonContentsRect(const QStyleOption *option, const QWidget *widget) const; QRect pushButtonFocusRect(const QStyleOption *option, const QWidget *widget) const; QRect checkBoxContentsRect(const QStyleOption *option, const QWidget *widget) const; QRect checkBoxIndicatorRect(const QStyleOption *option, const QWidget *widget) const; QRect checkBoxFocusRect(const QStyleOption *option, const QWidget *widget) const; QRect lineEditContentsRect(const QStyleOption *option, const QWidget *widget) const; QRect progressBarGrooveRect(const QStyleOption *option, const QWidget *widget) const; QRect progressBarContentsRect(const QStyleOption *option, const QWidget *widget) const; QRect progressBarLabelRect(const QStyleOption *option, const QWidget *widget) const; QRect headerArrowRect(const QStyleOption *option, const QWidget *widget) const; QRect headerLabelRect(const QStyleOption *option, const QWidget *widget) const; QRect sliderFocusRect(const QStyleOption *option, const QWidget *widget) const; QRect tabBarTabLeftButtonRect(const QStyleOption *option, const QWidget *widget) const; QRect tabBarTabRightButtonRect(const QStyleOption *option, const QWidget *widget) const; QRect tabWidgetTabBarRect(const QStyleOption *option, const QWidget *widget) const; QRect tabWidgetTabContentsRect(const QStyleOption *option, const QWidget *widget) const; QRect tabWidgetTabPaneRect(const QStyleOption *option, const QWidget *widget) const; QRect tabWidgetCornerRect(SubElement element, const QStyleOption *option, const QWidget *widget) const; QRect toolBoxTabContentsRect(const QStyleOption *option, const QWidget *widget) const; QRect genericLayoutItemRect(const QStyleOption *option, const QWidget *widget) const; //@}option //*@name subcontrol Rect specialized functions //@{ QRect groupBoxSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; QRect toolButtonSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; QRect comboBoxSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; QRect spinBoxSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; QRect scrollBarInternalSubControlRect(const QStyleOptionComplex *option, SubControl subControl) const; QRect scrollBarSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; QRect dialSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; QRect sliderSubControlRect(const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const; //@} //*@name sizeFromContents //@{ QSize defaultSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const { return size; } QSize checkBoxSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize lineEditSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize comboBoxSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize spinBoxSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize sliderSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize pushButtonSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize toolButtonSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize menuBarItemSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize menuItemSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize progressBarSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize tabWidgetSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize tabBarTabSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize headerSectionSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; QSize itemViewItemSizeFromContents(const QStyleOption *option, const QSize &size, const QWidget *widget) const; //@} //*@name primitives specialized functions //@{ bool emptyPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { return true; } bool drawFramePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawFrameLineEditPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawFrameFocusRectPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawFrameMenuPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawFrameGroupBoxPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawFrameTabWidgetPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawFrameTabBarBasePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawFrameWindowPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorArrowUpPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { return drawIndicatorArrowPrimitive(ArrowUp, option, painter, widget); } bool drawIndicatorArrowDownPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { return drawIndicatorArrowPrimitive(ArrowDown, option, painter, widget); } bool drawIndicatorArrowLeftPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { return drawIndicatorArrowPrimitive(ArrowLeft, option, painter, widget); } bool drawIndicatorArrowRightPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { return drawIndicatorArrowPrimitive(ArrowRight, option, painter, widget); } bool drawIndicatorArrowPrimitive(ArrowOrientation orientation, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorHeaderArrowPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawPanelButtonCommandPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawPanelButtonToolPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawTabBarPanelButtonToolPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawPanelScrollAreaCornerPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawPanelMenuPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawPanelTipLabelPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawPanelItemViewRowPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawPanelItemViewItemPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorCheckBoxPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorRadioButtonPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorButtonDropDownPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorTabClosePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorTabTearPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorToolBarHandlePrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorToolBarSeparatorPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; bool drawIndicatorBranchPrimitive(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; //@} //*@name controls specialized functions //@{ bool emptyControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const { return true; } virtual bool drawPushButtonLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawToolButtonLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawCheckBoxLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawComboBoxLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawItemViewItemControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawMenuBarEmptyArea(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawMenuBarItemControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawMenuItemControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawProgressBarControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawProgressBarContentsControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawProgressBarGrooveControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawProgressBarLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawScrollBarSliderControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawScrollBarAddLineControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawScrollBarSubLineControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawShapedFrameControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawRubberBandControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawHeaderSectionControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawHeaderLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawHeaderEmptyAreaControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawTabBarTabLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawTabBarTabShapeControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawToolBoxTabLabelControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawToolBoxTabShapeControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; virtual bool drawDockWidgetTitleControl(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; //*@} //*@name complex ontrols specialized functions //@{ bool drawGroupBoxComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; bool drawToolButtonComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; bool drawComboBoxComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; bool drawSpinBoxComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; bool drawSliderComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; bool drawDialComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; bool drawScrollBarComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; bool drawTitleBarComplexControl(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; //@} //!*@name various utilty functions //@{ //* spinbox arrows void renderSpinBoxArrow(const SubControl &subControl, const QStyleOptionSpinBox *option, QPainter *painter, const QWidget *widget) const; //* menu title void renderMenuTitle(const QStyleOptionToolButton *option, QPainter *painter, const QWidget *widget) const; //* return dial angle based on option and value qreal dialAngle(const QStyleOptionSlider *sliderOption, int value) const; //* returns relevant scrollbar parent /** needed to detect parent focus */ const QWidget *scrollBarParent(const QWidget *widget) const; //* returns true if given scrollbar arrow is animated QColor scrollBarArrowColor(const QStyleOptionSlider *option, const SubControl &control, const QWidget *widget) const; //* scrollbar buttons enum ScrollBarButtonType { NoButton, SingleButton, DoubleButton }; //* returns height for scrollbar buttons depending of button types int scrollBarButtonHeight(const ScrollBarButtonType &type) const { switch (type) { case NoButton: return Metrics::ScrollBar_NoButtonHeight; case SingleButton: return Metrics::ScrollBar_SingleButtonHeight; case DoubleButton: return Metrics::ScrollBar_DoubleButtonHeight; default: return 0; } } //@} //* translucent background void setTranslucentBackground(QWidget *widget) const; /** separator can have a title and an icon in that case they are rendered as sunken flat toolbuttons return toolbutton option that matches named separator menu items */ QStyleOptionToolButton separatorMenuItemOption(const QStyleOptionMenuItem *menuItemOption, const QWidget *widget) const; //* create toolbar extension icon QIcon toolBarExtensionIcon(StandardPixmap, const QStyleOption *option, const QWidget *widget) const; //* create title bar button icon QIcon titleBarButtonIcon(StandardPixmap, const QStyleOption *option, const QWidget *widget) const; //* returns item view parent if any /** needed to have correct color on focused checkboxes and radiobuttons */ const QAbstractItemView *itemViewParent(const QWidget *widget) const; //* returns true if a given widget is a selected item in a focused list /** This is necessary to have the correct colors used for e.g. checkboxes and radiobuttons in lists @param widget The widget to be checked @param position Used to find the relevant QModelIndex */ bool isSelectedItem(const QWidget *widget, const QPoint &localPosition) const; //* return true if option corresponds to QtQuick control bool isQtQuickControl(const QStyleOption *option, const QWidget *widget) const; //@} //* adjust rect based on provided margins QRect insideMargin(const QRect &r, int margin) const { return insideMargin(r, margin, margin); } //* adjust rect based on provided margins QRect insideMargin(const QRect &r, int marginWidth, int marginHeight) const { return r.adjusted(marginWidth, marginHeight, -marginWidth, -marginHeight); } //* expand size based on margins QSize expandSize(const QSize &size, int margin) const { return expandSize(size, margin, margin); } //* expand size based on margins QSize expandSize(const QSize &size, int marginWidth, int marginHeight) const { return size + 2 * QSize(marginWidth, marginHeight); } //* returns true for vertical tabs bool isVerticalTab(const QStyleOptionTab *option) const { return isVerticalTab(option->shape); } bool isVerticalTab(const QTabBar::Shape &shape) const { return shape == QTabBar::RoundedEast || shape == QTabBar::RoundedWest || shape == QTabBar::TriangularEast || shape == QTabBar::TriangularWest; } //* right to left alignment handling using ParentStyleClass::visualRect; QRect visualRect(const QStyleOption *opt, const QRect &subRect) const { return ParentStyleClass::visualRect(opt->direction, opt->rect, subRect); } //* centering QRect centerRect(const QRect &rect, const QSize &size) const { return centerRect(rect, size.width(), size.height()); } QRect centerRect(const QRect &rect, int width, int height) const { return QRect(rect.left() + (rect.width() - width) / 2, rect.top() + (rect.height() - height) / 2, width, height); } /* Checks whether the point is before the bound rect for bound of given orientation. This is needed to implement custom number of buttons in scrollbars, as well as proper mouse-hover */ inline bool preceeds(const QPoint &point, const QRect &bound, const QStyleOption *option) const; //* return which arrow button is hit by point for scrollbar double buttons inline QStyle::SubControl scrollBarHitTest(const QRect &rect, const QPoint &point, const QStyleOption *option) const; //! return true if one of the widget's parent inherits requested type inline bool hasParent(const QWidget *widget, const char *className) const; //* return true if one of the widget's parent inherits requested type template bool hasParent(const QWidget *widget) const; //* return true if icons should be shown in menus bool showIconsInMenuItems(void) const; //* return true if icons should be shown on buttons bool showIconsOnPushButtons(void) const; //* return true if passed widget is a menu title (KMenu::addTitle) bool isMenuTitle(const QWidget *widget) const; //* return true if passed widget is a menu title (KMenu::addTitle) bool hasAlteredBackground(const QWidget *widget) const; private: //*@name scrollbar button types (for addLine and subLine ) //@{ ScrollBarButtonType _addLineButtons; ScrollBarButtonType _subLineButtons; //@} //* helper Helper *_helper; //* animations Animations *_animations; //* keyboard accelerators Mnemonics *_mnemonics; //* window manager WindowManager *_windowManager; //* splitter Factory, to extend splitters hit area SplitterFactory *_splitterFactory; //* widget explorer WidgetExplorer *_widgetExplorer; //* tabbar data AdwaitaPrivate::TabBarData *_tabBarData; //* icon hash using IconCache = QHash; IconCache _iconCache; //* pointer to primitive specialized function using StylePrimitive = bool(Style::*)(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; StylePrimitive _frameFocusPrimitive = nullptr; //* pointer to control specialized function using StyleControl = bool (Style::*)(const QStyleOption *option, QPainter *painter, const QWidget *widget) const; //* pointer to control specialized function using StyleComplexControl = bool (Style::*)(const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const; //*@name custom elements //@{ //* use Argb Drag and Drop Window QStyle::StyleHint SH_ArgbDndWindow; //! styled painting for KCapacityBar QStyle::ControlElement CE_CapacityBar; ColorVariant _variant { Adwaita }; bool _dark { false }; bool _isGNOME { false }; bool _isKDE { false }; //@} }; //_________________________________________________________________________ bool Style::preceeds(const QPoint &point, const QRect &bound, const QStyleOption *option) const { if (option->state & QStyle::State_Horizontal) { if (option->direction == Qt::LeftToRight) return point.x() < bound.right(); else return point.x() > bound.x(); } else return point.y() < bound.y(); } //_________________________________________________________________________ QStyle::SubControl Style::scrollBarHitTest(const QRect &rect, const QPoint &point, const QStyleOption *option) const { if (option->state & QStyle::State_Horizontal) { if (option->direction == Qt::LeftToRight) return point.x() < rect.center().x() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine; else return point.x() > rect.center().x() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine; } else return point.y() < rect.center().y() ? QStyle::SC_ScrollBarSubLine : QStyle::SC_ScrollBarAddLine; } //_________________________________________________________________________ bool Style::hasParent(const QWidget *widget, const char *className) const { if (!widget) return false; while ((widget = widget->parentWidget())) { if (widget->inherits(className)) return true; } return false; } //_________________________________________________________________________ template< typename T > bool Style::hasParent(const QWidget *widget) const { if (!widget) return false; while ((widget = widget->parentWidget())) { if (qobject_cast(widget)) return true; } return false; } } // namespace Adwaita #endif // ADWAITA_STYLE_H adwaita-qt-1.4.1/src/style/adwaitastyleplugin.cpp000066400000000000000000000046501414271704400221270ustar00rootroot00000000000000 /************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitastyleplugin.h" #include "adwaitastyle.h" #include "adwaita.h" #include namespace Adwaita { QStyle *StylePlugin::create(const QString &key) { if (key.toLower() == QStringLiteral("adwaita")) { return new Style(Adwaita::Adwaita); } if (key.toLower() == QStringLiteral("adwaita-dark")) { return new Style(Adwaita::AdwaitaDark); } if (key.toLower() == QStringLiteral("adwaita-highcontrast") || key.toLower() == QStringLiteral("highcontrast")) { return new Style(Adwaita::AdwaitaHighcontrast); } if (key.toLower() == QStringLiteral("adwaita-highcontrastinverse") || key.toLower() == QStringLiteral("highcontrastinverse")) { return new Style(Adwaita::AdwaitaHighcontrastInverse); } return nullptr; } StylePlugin::~StylePlugin() { } QStringList StylePlugin::keys() const { return QStringList() << QStringLiteral("Adwaita") << QStringLiteral("Adwaita-Dark") << QStringLiteral("Adwaita-HighContrast") << QStringLiteral("Adwaita-HighContrast-Dark"); } } // namespace Adwaita adwaita-qt-1.4.1/src/style/adwaitastyleplugin.h000066400000000000000000000036341414271704400215750ustar00rootroot00000000000000#ifndef ADWAITA_STYLE_PLUGIN_H #define ADWAITA_STYLE_PLUGIN_H /************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * 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., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include namespace Adwaita { class StylePlugin : public QStylePlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "adwaita.json") public: //* constructor explicit StylePlugin(QObject *parent = 0): QStylePlugin(parent) {} //* destructor ~StylePlugin(); //* returns list of valid keys QStringList keys() const; //* create style QStyle *create(const QString &key); }; } // namespace Adwaita #endif // ADWAITA_STYLE_PLUGIN_H