pax_global_header00006660000000000000000000000064147757525530014536gustar00rootroot0000000000000052 comment=cbdc9630d363fb60f2e2b83c7a6da9f516e36f9c danmaQ-0.3.0/000077500000000000000000000000001477575255300127375ustar00rootroot00000000000000danmaQ-0.3.0/.clang-format000066400000000000000000000000631477575255300153110ustar00rootroot00000000000000--- BasedOnStyle: Chromium ColumnLimit: '120' ... danmaQ-0.3.0/.github/000077500000000000000000000000001477575255300142775ustar00rootroot00000000000000danmaQ-0.3.0/.github/workflows/000077500000000000000000000000001477575255300163345ustar00rootroot00000000000000danmaQ-0.3.0/.github/workflows/macOS.yml000066400000000000000000000023731477575255300200660ustar00rootroot00000000000000name: macOS on: push: branches: - master tags: - '*' pull_request: branches: - master workflow_dispatch: env: targetName: danmaQ jobs: build: name: Build runs-on: macos-latest steps: - name: Install Qt uses: jurplel/install-qt-action@v4 with: version: 6.8.2 modules: "qtwebengine qtwebchannel qtpositioning" # latter two are required by webengine cache: true - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Build MacOS run: | cmake -B build -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DQT_DEBUG_FIND_PACKAGE=ON cd build && make dmg - uses: actions/upload-artifact@v4 with: name: ${{ env.targetName }}.macos.amd64.dmg path: build/${{ env.targetName }}.dmg - name: Update to release if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: build/${{ env.targetName }}.dmg asset_name: ${{ env.targetName }}.macos.amd64.dmg tag: ${{ github.ref }} overwrite: true danmaQ-0.3.0/.github/workflows/ubuntu.yml000066400000000000000000000041711477575255300204040ustar00rootroot00000000000000name: Ubuntu on: push: branches: - master tags: - '*' pull_request: branches: - master workflow_dispatch: env: targetName: danmaQ jobs: build: name: Build runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] qt_ver: [6.8.2] qt_arch: [gcc_64] steps: - name: Install Qt uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt_ver }} modules: "qtwebengine qtwebchannel qtpositioning" # latter two are required by webengine cache: true - name: Install other dependencies run: sudo apt-get install -y cmake ninja-build flatpak flatpak-builder - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Build native run: | cmake -B build -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -GNinja -DQT_DEBUG_FIND_PACKAGE=ON cmake --build build - name: Upload build result uses: actions/upload-artifact@v4 with: name: ${{ env.targetName }}.linux.amd64 path: build/src/danmaQ - name: Clean previous build run: rm -rf build || true - name: Build flatpak run: | sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo sudo flatpak install flathub org.kde.Sdk//6.8 io.qt.qtwebengine.BaseApp//6.8 -y sudo flatpak-builder --repo=repo --force-clean build-dir org.tuna.danmaQ.local.json sudo flatpak build-bundle repo danmaQ.flatpak org.tuna.danmaQ working-directory: flatpak - uses: actions/upload-artifact@v4 with: name: ${{ env.targetName }}.linux.amd64.flatpak path: flatpak/danmaQ.flatpak - name: Update to release if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: flatpak/danmaQ.flatpak asset_name: ${{ env.targetName }}.linux.amd64.flatpak tag: ${{ github.ref }} overwrite: true danmaQ-0.3.0/.github/workflows/windows.yml000066400000000000000000000040521477575255300205520ustar00rootroot00000000000000name: Windows on: push: branches: - master tags: - '*' pull_request: branches: - master workflow_dispatch: env: targetName: danmaQ jobs: build: name: Build runs-on: windows-latest strategy: matrix: include: - qt_ver: 6.8.2 qt_arch: win64_msvc2022_64 msvc_arch: x64 steps: - name: Install Qt uses: jurplel/install-qt-action@v4 with: version: ${{ matrix.qt_ver }} modules: "qtwebengine qtwebchannel qtpositioning" # latter two are required by webengine arch: ${{ matrix.qt_arch }} cache: true - uses: actions/checkout@v4 with: fetch-depth: 1 - name: MSVC Build id: build shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }} cmake -B build -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DQT_DEBUG_FIND_PACKAGE=ON cmake --build build - name: Package Qt env: VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC' shell: pwsh run: | New-Item -ItemType Directory ${env:targetName} Copy-Item build\src\Debug\${{ env.targetName }}.exe ${env:targetName}\ windeployqt ${env:targetName}\${env:targetName}.exe Compress-Archive -Path ${env:targetName} ${env:targetName}'.zip' - uses: actions/upload-artifact@v4 with: name: ${{ env.targetName }}.win.${{ matrix.msvc_arch }}.zip path: ${{ env.targetName }}.zip - name: Update to release if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: ${{ env.targetName }}.zip asset_name: ${{ env.targetName }}.win.${{ matrix.msvc_arch }}.zip tag: ${{ github.ref }} overwrite: true danmaQ-0.3.0/.gitignore000066400000000000000000000025271477575255300147350ustar00rootroot00000000000000 # Created by https://www.gitignore.io/api/qt,qtcreator,visualstudiocode,cmake,vim ### CMake ### CMakeCache.txt CMakeFiles CMakeScripts Testing Makefile cmake_install.cmake install_manifest.txt compile_commands.json CTestTestfile.cmake build ### Qt ### # C++ objects and libs *.slo *.lo *.o *.a *.la *.lai *.so *.dll *.dylib # Qt-es /.qmake.cache /.qmake.stash *.pro.user *.pro.user.* *.qbs.user *.qbs.user.* *.moc *.depends moc_*.cpp moc_*.h qrc_*.cpp ui_*.h Makefile* *build-* # QtCreator *.autosave # QtCtreator Qml *.qmlproject.user *.qmlproject.user.* # QtCtreator CMake CMakeLists.txt.user* ### QtCreator ### # gitignore for Qt Creator like IDE for pure C/C++ project without Qt # # Reference: http://doc.qt.io/qtcreator/creator-project-generic.html # Qt Creator autogenerated files Icon.iconset icon.png # A listing of all the files included in the project *.files # Include directories *.includes # Project configuration settings like predefined Macros *.config # Qt Creator settings *.creator # User project settings *.creator.user* # Qt Creator backups ### Vim ### # swap [._]*.s[a-v][a-z] [._]*.sw[a-p] [._]s[a-v][a-z] [._]sw[a-p] # session Session.vim # temporary .netrwhist *~ # auto-generated tag files tags ### VisualStudioCode ### .history .vscode # End of https://www.gitignore.io/api/qt,qtcreator,visualstudiocode,cmake,vim danmaQ-0.3.0/.travis.yml000066400000000000000000000013101477575255300150430ustar00rootroot00000000000000sudo: required language: bash servies: - docker matrix: include: - os: osx - os: linux env: BUILD_FLAVOR=fedora - os: linux env: BUILD_FLAVOR=ubuntu - os: linux env: BUILD_FLAVOR=debian before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker build -f ./.travisci/Dockerfile.$BUILD_FLAVOR -t danmaq-devel . ; fi install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt ; fi script: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash ./.travisci/.travis.sh ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker run -it danmaq-devel ./.travisci/.travis.sh ; fi danmaQ-0.3.0/CMakeLists.txt000066400000000000000000000066221477575255300155050ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.16) PROJECT(danmaQ) option(ENABLE_TEST "Enable test program build" Off) set(VERSION "0.3.0") set(CMAKE_CXX_STANDARD 20) set(CMAKE_EXPORT_COMPILE_COMMANDS True) IF (WIN32 AND NOT MINGW AND NOT CYGWIN) set(CMAKE_PREFIX_PATH "$ENV{QTDIR} ${CMAKE_PREFIX_PATH}") ENDIF() find_package(Qt6 REQUIRED COMPONENTS Core Widgets WebEngineWidgets LinguistTools) IF (UNIX) set(CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS}") ENDIF () IF (WIN32 AND NOT MINGW AND NOT CYGWIN) set(CMAKE_CXX_FLAGS "/permissive- /MP /DNOMINMAX ${CMAKE_CXX_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"") ENDIF() if (APPLE) add_custom_command( COMMAND mkdir -p Icon.iconset COMMAND cp ${CMAKE_SOURCE_DIR}/src/icons/statusicon.png icon.png COMMAND sips -z 16 16 icon.png --out Icon.iconset/icon_16x16.png COMMAND sips -z 32 32 icon.png --out Icon.iconset/icon_16x16@2x.png COMMAND sips -z 32 32 icon.png --out Icon.iconset/icon_32x32.png COMMAND sips -z 64 64 icon.png --out Icon.iconset/icon_32x32@2x.png COMMAND sips -z 128 128 icon.png --out Icon.iconset/icon_128x128.png COMMAND sips -z 256 256 icon.png --out Icon.iconset/icon_128x128@2x.png COMMAND sips -z 256 256 icon.png --out Icon.iconset/icon_256x256.png COMMAND sips -z 512 512 icon.png --out Icon.iconset/icon_256x256@2x.png COMMAND sips -z 512 512 icon.png --out Icon.iconset/icon_512x512.png COMMAND sips -z 1024 1024 icon.png --out Icon.iconset/icon_512x512@2x.png COMMAND iconutil -c icns Icon.iconset DEPENDS ${CMAKE_SOURCE_DIR}/src/icons/statusicon.png OUTPUT ${CMAKE_BINARY_DIR}/Icon.icns ) add_custom_command( COMMAND mkdir -p ${CMAKE_PROJECT_NAME}.app/Contents/MacOS COMMAND cp -r ${CMAKE_SOURCE_DIR}/macOS/Info.plist ${CMAKE_PROJECT_NAME}.app/Contents/Info.plist COMMAND cp src/${CMAKE_PROJECT_NAME} ${CMAKE_PROJECT_NAME}.app/Contents/MacOS/ COMMAND sed -i.bak 's/VERSION/${VERSION}/g' ${CMAKE_PROJECT_NAME}.app/Contents/Info.plist COMMAND mkdir -p ${CMAKE_PROJECT_NAME}.app/Contents/Resources COMMAND touch ${CMAKE_PROJECT_NAME}.app/Contents/Resources/empty.lproj COMMAND cp Icon.icns ${CMAKE_PROJECT_NAME}.app/Contents/Resources/ COMMAND macdeployqt ${CMAKE_PROJECT_NAME}.app -no-strip DEPENDS ${CMAKE_BINARY_DIR}/src/${CMAKE_PROJECT_NAME} DEPENDS ${CMAKE_BINARY_DIR}/Icon.icns OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.app ) add_custom_command( COMMAND cp -r ${CMAKE_PROJECT_NAME}.app ${CMAKE_PROJECT_NAME}.app.bak COMMAND macdeployqt ${CMAKE_PROJECT_NAME}.app -dmg COMMAND rm -rf ${CMAKE_PROJECT_NAME}.app COMMAND mv ${CMAKE_PROJECT_NAME}.app.bak ${CMAKE_PROJECT_NAME}.app DEPENDS ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.app OUTPUT ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.dmg ) add_custom_target(app ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.app) add_custom_target(dmg DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.dmg) endif () add_subdirectory(src) add_subdirectory(man) if (ENABLE_TEST) enable_testing() add_subdirectory(tests) endif (ENABLE_TEST) danmaQ-0.3.0/LICENSE000066400000000000000000001044621477575255300137530ustar00rootroot00000000000000GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . danmaQ-0.3.0/README.md000066400000000000000000000033451477575255300142230ustar00rootroot00000000000000 # DanmaQ [![Ubuntu](https://github.com/tuna/danmaQ/actions/workflows/ubuntu.yml/badge.svg)](https://github.com/tuna/danmaQ/actions/workflows/ubuntu.yml) [![macOS](https://github.com/tuna/danmaQ/actions/workflows/macOS.yml/badge.svg)](https://github.com/tuna/danmaQ/actions/workflows/macOS.yml) [![Windows](https://github.com/tuna/danmaQ/actions/workflows/windows.yml/badge.svg)](https://github.com/tuna/danmaQ/actions/workflows/windows.yml) DanmaQ, pronounced as `/danmakju:/` is a small QT program to play danmaku on any screen. ![](https://raw.githubusercontent.com/tuna/danmaQ/master/screenshots/xiaowang.png) DanmaQ is **still under development**, documents might be outdated. ## Dependencies danmaQ depends on Qt6. Qt 6.8 LTS is recommended. ## Installation ### Source ```shell apt-get install qt6-base-dev qt6-webengine-dev qt6-tools-dev-tools cmake ninja-build # for debian / ubuntu dnf install qt6-qtbase-devel qt6-qtwebengine-devel qt6-linguist cmake ninja-build # for fedora brew install qt cmake # for macOS mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release make && sudo make install ``` ### Windows Download binary from [releases page](https://github.com/tuna/danmaQ/releases/). Or you can also use CMake and Qt to build it yourself, but there is no help available temporarily. ### Arch Linux ```shell pacman -S danmaq ``` ### Fedora ```shell dnf install danmaq ``` ### Debian / Ubuntu / AOSC OS ```shell apt install danmaq ``` ## Usage DanmaQ >= 0.3 works as a client of [Comment9](https://github.com/prnake/Comment9). DanmaQ < 0.3 should be used as a client to [gdanmaku-server](https://github.com/tuna/gdanmaku-server). danmaQ-0.3.0/flatpak/000077500000000000000000000000001477575255300143615ustar00rootroot00000000000000danmaQ-0.3.0/flatpak/.gitignore000066400000000000000000000000211477575255300163420ustar00rootroot00000000000000.flatpak-builder danmaQ-0.3.0/flatpak/install.sh000066400000000000000000000005001477575255300163560ustar00rootroot00000000000000flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo flatpak install flathub org.kde.Sdk//6.8 flatpak install flathub io.qt.qtwebengine.BaseApp//6.8 flatpak-builder --repo=repo --force-clean build-dir org.tuna.danmaQ.local.json flatpak build-bundle repo danmaQ.flatpak org.tuna.danmaQ danmaQ-0.3.0/flatpak/org.tuna.danmaQ.json000066400000000000000000000033661477575255300202210ustar00rootroot00000000000000{ "id": "org.tuna.danmaQ", "runtime": "org.kde.Platform", "base": "io.qt.qtwebengine.BaseApp", "base-version": "6.8", "runtime-version": "6.8", "sdk": "org.kde.Sdk", "command": "danmaQ", "rename-desktop-file": "danmaQ.desktop", "rename-icon": "danmaQ", "finish-args": [ "--share=ipc", "--share=network", "--socket=x11", "--socket=pulseaudio", "--filesystem=home", "--device=dri" ], "modules": [ { "name": "danmaQ", "buildsystem": "simple", "build-commands": [ "cmake .", "cmake -B build -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Release", "cd build && make" ], "post-install": [ "strip -s build/src/danmaQ", "install -dm755 /app/bin", "install -m755 build/src/danmaQ /app/bin/danmaQ", "install -d /app/share/applications", "install -m644 src/resource/danmaQ.desktop /app/share/applications/danmaQ.desktop", "install -d /app/share/icons/hicolor/64x64/apps", "install -m644 src/resource/danmaQ.png /app/share/icons/hicolor/64x64/apps/danmaQ.png", "install -d /app/share/icons/hicolor/scalable/apps", "install -m644 src/resource/danmaQ.svg /app/share/icons/hicolor/scalable/apps/danmaQ.svg" ], "sources": [ { "type": "git", "url": "https://github.com/tuna/danmaQ.git", "branch": "master" } ] } ] } danmaQ-0.3.0/flatpak/org.tuna.danmaQ.local.json000066400000000000000000000032601477575255300213030ustar00rootroot00000000000000{ "id": "org.tuna.danmaQ", "runtime": "org.kde.Platform", "base": "io.qt.qtwebengine.BaseApp", "base-version": "6.8", "runtime-version": "6.8", "sdk": "org.kde.Sdk", "command": "danmaQ", "rename-desktop-file": "danmaQ.desktop", "rename-icon": "danmaQ", "finish-args": [ "--share=ipc", "--share=network", "--socket=x11", "--socket=pulseaudio", "--filesystem=home", "--device=dri" ], "modules": [ { "name": "danmaQ", "buildsystem": "simple", "build-commands": [ "cmake .", "cmake -B build -DCMAKE_INSTALL_PREFIX=/app -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Release", "cd build && make" ], "post-install": [ "strip -s build/src/danmaQ", "install -dm755 /app/bin", "install -m755 build/src/danmaQ /app/bin/danmaQ", "install -d /app/share/applications", "install -m644 src/resource/danmaQ.desktop /app/share/applications/danmaQ.desktop", "install -d /app/share/icons/hicolor/64x64/apps", "install -m644 src/resource/danmaQ.png /app/share/icons/hicolor/64x64/apps/danmaQ.png", "install -d /app/share/icons/hicolor/scalable/apps", "install -m644 src/resource/danmaQ.svg /app/share/icons/hicolor/scalable/apps/danmaQ.svg" ], "sources": [ { "type": "dir", "path": "../" } ] } ] } danmaQ-0.3.0/macOS/000077500000000000000000000000001477575255300137415ustar00rootroot00000000000000danmaQ-0.3.0/macOS/Info.plist000066400000000000000000000017621477575255300157170ustar00rootroot00000000000000 CFBundleDevelopmentRegion en CFBundleExecutable danmaQ CFBundleIdentifier cn.edu.tsinghua.tuna.danmaQ CFBundleInfoDictionaryVersion 6.0 CFBundleName danmaQ CFBundlePackageType APPL CFBundleShortVersionString VERSION CFBundleSignature danm CFBundleVersion VERSION CFBundleIconFile Icon.icns LSMinimumSystemVersion 10.9 NSAppleScriptEnabled NSHumanReadableCopyright Copyright © 2021 Tsinghua University TUNA Association. All rights reserved. danmaQ-0.3.0/man/000077500000000000000000000000001477575255300135125ustar00rootroot00000000000000danmaQ-0.3.0/man/CMakeLists.txt000066400000000000000000000007441477575255300162570ustar00rootroot00000000000000SET(MAN_FILES ${CMAKE_CURRENT_BINARY_DIR}/danmaQ.1) ADD_CUSTOM_COMMAND( COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/danmaQ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.1 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/danmaQ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.1 ) IF (UNIX) ADD_CUSTOM_TARGET(man ALL DEPENDS ${MAN_FILES}) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1) ENDIF()danmaQ-0.3.0/man/danmaQ000066400000000000000000000026041477575255300146400ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" (C) Copyright 2017 Boyuan Yang <073plan@gmail.com>, .\" .TH DANMAQ 1 "2017-11-07" "Tsinghua TUNA Association" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME danmaQ \- desktop danmaku client implemented in Qt5 .SH SYNOPSIS .B danmaQ .SH DESCRIPTION This manual page documents briefly the .B danmaQ commands. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBdanmaQ\fP is a program that act as the danmaku client. When connected with a server, it receives danmaku from the server and displays them on the screen running \fBdanmaQ\fP. .SH OPTIONS This program does not accept any command line option now. .SH BUGS It is known that current program does not function well when network status changes. In such case, please restart the program or select "Toggle subscription" menu twice from its tray icon. .SH SEE ALSO .BR gdanmaku-server (1). danmaQ-0.3.0/screenshots/000077500000000000000000000000001477575255300152775ustar00rootroot00000000000000danmaQ-0.3.0/screenshots/window.png000066400000000000000000001376711477575255300173330ustar00rootroot00000000000000PNG  IHDRe>}+zTXtRaw profile type exifxڭi$sq @dnǟYd,vR(pw3"kCmc{䫮͌?_~m |dti?.*ߧB7?s_sۯ_C>G c)n%Tj1LIV&]囄O=QsaV  w+dZះ (?\ neaDǟ[{jW|>´_}??ߞz'z5%I Gk,9}*mBzf_cW#0 T(\窋5LzC ;:/hӲ7>>>0S&W'( (꧞z2Rkiʬ|4Ҙkbw}0[s[)Q[˽~ ZW|{EyWJJ]RUzՐBlzܙJs]9زS*'5Qg&WV^$ϟ=rFvmx=V^6ݗOnؼymg{\Ҽ\w7ⴚiQ m.;6(dXeZ{-ur i-n`*Ygi3*3t~D"7=$0NmʽZz>8VI^F ޘǃ P1oߔG{ḃe\؍g#_,q^9aC}X3lqs h'O-kʭFv[h~o\2{YIl7 ۝)uz>#}D٘;N"svTAj|0I7Y[1Cf ƄlC$}\(2y2y? ~\v{{waycoF9~0ap"49+``N}}*`kD@{ 9P!iäds=kmԳ^] ]cʫ~cmdLҢCLl[ɸClE<.PH!Pƈ[IF_v֚u~W] 'O"IT\EozVrcL ;~`_[K w ~掘o4޹GrXmʱv!'_42o(!r_X[(ϒΫG'n^V [1JX(C0)c"2!e  ;gNGu',+`܀hh^)5 M_̄xMIIpEPV(o1ȇh-:d,[Ng?ԡ_ZY nE/߼L&_c [ʬnE ؉LL/`0\K\Kc>xܓN@=ɕU3q^/<)I@u{lPByC½{ mʝWlԦJ iO`8H9Эs5>5O4d} tPMq #F(%~OgVb.ϭBJ}sqg{Y-mrA# t`-@U!n$^UCdI0Dpw-H|v^52׺N I[BYo6-Bc(RR]2"k|ݒ&~NsrWnͼ)8g=#Šb)^|t[&[8@eN@5pŴBL8sq YS3B9 "Qw'ag*Xٮ3$xN546F/;_"iT, D+{$yDA՛DpfbQXT@ 3w?=sB9pslMSJaY{ȁi쇰L,%%0"s&S ((YA"׎)5u^- ˫4ot7[֕//)U@4A`l$fvDAq}`>\E"\`1J]Ǒ(G/VGtfx}7 }ZpN0*>GH<@0k*F62ad] [zIxZ*%ݸS~8I&8@zJHt*EPJld^Ȓ9ey| A-V[4g.p.B9,'N7UC>S',h '7p7CTp>G~ fm{ȋ5F㍔27D:`Yiu$6wp DYanvDS,9S Z ԄxJw O1 pK"3 Š;dC|dWv,zEo'f} bc2cIٳ@ :AAC 1JV~I'F,{yK*ޖDotӋj__$qپQ^_F=j<2# 9wlOQt%P/!V<3E@Q:ֈ/*usaS r:{( (U2@@߸'le,Fy\Y-D9f<#flWrH [(.:#UlpR= s C窉oPk WUDvGBQ*\WX'Aۚqߎ}w, $4TH{{Q@|'/+ ^D}]ȪN]Xk@gP.j*mG- 駡bg B2)rMCǡeiЋ(6D?\Th.6! f@\/A Sis}'| c%ü.$_: 4:1O$c{7f+)tJ[aMڈTyʋ EO87$% *d21'{e+~'h!K&H 0>p4U^:4"s0[k->HV#*ȲTgkhzDl&+ +xRm{8v G@ JG̱5 lKb| C FaQǤ;8 2 8(t;\ljaD3,Q\&iӔO<`= /j&K׈w(|堒ByF ɛ4Z2ʔ spYv ]>D,JCUg:꼬v3pjYYCU{ k):Dd/ijƴDb( -Ĉ\`)x%|'^XXuE}*)ёX(!@V9!jpg6&Ǻ|^aKrEGdMR, !(HeʚNج녷J*{Wt7TwbPX$ 6v@'*uыsɕ^ hbSʫ5{1r MAF ՙ&%L(gG2: Q#~N2rĉ>٧E%\` g\B- |L9H# Ba`?Dh @uEqZiכ7f j!t1s9N׵)۲Ȥ [*.MM7퀔!">1'ϊ`s";ehX4 Ww#S`<I{ZtWCīX`E&lqjJXGltT<(g͙ 'KX6Ov&HL N䖜Oj;Z;L+j5hxQ-IiE,gF$TU.pE !A>Q6|-zo/M",i׈Tr@W4f+Rƕ* ; ["pb>vLVK/ 詵I}8wR4?hxT_̴TXiE2 c 1]:?W Un i!V[?t< 4c6?dYYH>69PX0De3"umem7|Hs  W򗩷Fo!3RYV_WJ rwmFb+Xz^ j(2@JBJT6%g]4*4VaƂ1a>+hPl "Hq naE mrY;OntzM%j>c˙@C+:*r r(&b+kj~s"V,DUi3Gd^ A;i7u w2@iJ]DO D&yBF*bMWӣ& 9ׂLw_4U?nn$I-;6V\ˆn?TpUй QE1G-"5JԂANg@u#Q0eHU{x7dzW#;.yC L| dV?πuP z2Fbs/eFWX"Ȁ嫰=pafBƩִˈzWg1@,SxýT(R X{1AfY O~<A% XkIHoQvo'!JS-"K9L@ d#_6DhɠB q-75ǜ陜a8W7 %ڧ@h;ҧ|!$4MpFm5>#K$aK,a1jqUs$!C:dM>wgsu!>eΙFS-eB,keU|̚Jui^ypr7Tod$.p0D;7vpxC!t&kO}Ja(J/* !UZ v|R2VUFڵNW 2P{]G,7`5皆FZ0@ZKglC.`DutK 6Lz@R[wYSϣ}M0PF]8R<PDj١hg*P#Zymή>9ti%XAU{AZ9%*h|qu^h.F̪'f@;PE?4~hLA8ȥe |Mqx0׹?L-jAAZRބU.7F2X]u88@B,?|q#GjV_Z(&Pj3A8]Gn/< Dц+EmNY YľeF ڥIfB34z8.> O Xw-f (7x`طx_Y{h4ZVQ#3)p ]BbTb-Lg$Us>D}qF p[Ԥ圱ԏV p}Pi}wLT6ic!_)?1-bW6ׅ SgA aS7!tm0 sJ;pC1Ohgg̬v xT7@ԋ qXlj\A݃L.uDbv;aǴF @8b>-d9= 0G bE^B?Le=HjiR-s'&uHvQ(pT)u#g;G(Jg*Gǘj*u Heht7m.{Bm$ME0 ?Ix Y$0SLuDU+W S[f|YV4kwcɲV.!quPa٘+{z.<ϣZ޲`to oM5=T7DtXոd@&IP2RoE u Sn$?[TռOzaM +X"U A0vT'ڣE:uو`Lq2 e21EhIۄ3|C~ǪPmԪ)t?"dwٿ:I9]fga%\ &B8ߊBhdD P2l1fx%psUC'r|?U"p/~Vw-jVMWO~6tt L P9ό~:5Q8pso,)ԥO5*gb2W _7ǿ=G1t@צ>eWs3]ېMG &i6`V ?uUp&Y|<6]M]j $ļ]v~ה1mivĴu.5,oF8UC. UOԺ#::R;F>V'䎻NWu3a ȝuW3< @udw/|2Sߛoa)xV!8$/ܿ&kמ7"8hêjK5DJD\@.J?.UxHx/~j<B+βCdHuH6nTM]?}? |!_sۨk]E]UUP`3D`a_, @L8dX' 7g\rW>TS=<5̔3^Qޥyު2d_PUk'5U7Qz`~-dmLL! Wsj:RME9NG_"n!Z$ SyD5Upl=:>X<#Ol{AJ`v59]"VIV;T.d1M^b|F ptP[ OK U]7n۵!/d+$!L' S`B61Q҄{! JƑ%*HߏC:`MDU-jX,P(GX٦v+gߝu:LJ\_'f:0 L"\9E7bPw`__HF^Jn7r"piu]NPŒ>u/BʻQJ=\xôJgw\EJU 1_0I@EHEWׯaj{P= k :n߮X a Ϭ;\BPAwX5Jh|ͅ~ _i-\aRUi qXx3[#aSYeT pL͍Z|5-k ;H蛦 o8lKb|uS\e %Nzޗ'MQP3>xmQ>U#F'%TK \lM9Te2 +~Svy-Ģlf\(}W%fqۑ&(\UJ~suQ>UUT SD،Ӗ/eByP\L /zoBBBPb1 Y BB&=>obޔ%o`EBJqC,Oܠj_U^P?XSF R(m۶9Ey BBP( % BQ UP BQĐצ<% B /ܼ[uV6GO4"pc QoB~ڔA<3-&"X1FH`xqb"-uv3+C`5zW( WHn&3{׳_|@W#{^cDtKټ~ ׬cl^9Ff|WSix&[lbͲ,X6ϤP[7 lڲ6a6QϭIQt2c笠Az!w͛g_)BENdb+CyZT/y'Գ2| |kT1 OumSssptΗQh"OcZѭCVaPƴy#'.㔦+ 4c7encr\(e@pMܻ,~ }{2{9ٷO:T4 -GOd(O`q C͋Ky;kZoV5V(ґWq"HЧX]z>~?#30UM^NޔT>fWBP(zS'Oaû ŞnXVւ{"ޖ{ӌܬwhbT? BQd&,ih~oOT> ̠eoLyY%0c 4Y6?NOL`% U?BqӊM#QUrc-87C柵b5F>繏fDW ֓ޗo;o>6䫇=ȴlqS/iJ f2Y* Y4=GEOд,ǭ! u3úAoQkځ7~c1m8p_l;7p\_ޟ1~ˎt5ZJP\C;ֳf&=L[rîga?"+_-zͰqq.P(W\ g% BqBjΘBP0B!p9ͮ|{RbP(7G!]vw>!+-LBl%N9Sa(B!^tigwa$~ x t7X̞=[P ↦[nRF_Opb2O^, z"u67\ybrqHM+TBPܐb?Y azd(r!Y( qQP,Gy Bq JzJJ, '"!?OBP)"NP(" :)BDY( Jr;]mw, H;BGaJ, |xQ%ߋ9* P(!l-9 Z|2'+Ϣ(`ZٳgIII\rEUBQL&T&՘ֻjg@ҭ`8./wDEQbǎX,7nL@@ضm&>> !dk{1A^«J,"NaÆDDDP( 3w }zH"gK> BbphWCu]\ NgP(ׁ1~ڢw˫ȿ{< Bq^yLUYX( / 4SQ:VW J, :*v."nHCBP\c|}BZHa_NWRbP(I06I{A^BK=kꫯꫯyJ͗vZ湅׻9ý9Z˘[7e%strM-!<-DS2oa(y-%L_ZpMMyZ'=~&jޓm1RK`ɤ?،pCV][L|>LwR-܌f=!cI˾ GHirr=үvU9YwŊX~s#X> o|Iצ_b43`(v=<h?0?Р.|hL21ߢ_xF˞i2r^OXiIKY l3_3׼t0}W FcYc脭܎h#wNS7&@Zi'81w>laɼnM-ɋOl A9ɻo)WC3^﹥x`Mܟ?sF{NOM)y^+w֏3~ezԍZI{2^V>O}>DǛU(73D:G ;q>N\" |WbF8TƌXنtlӜ#1gzt&cLw̨ }uC29ï !ڐk(Ţw}6uc]Njc_3~Q }^NpsF1@ nOx潝4!e1]85ĈQT}-^cR~"}D?>' xLY!s׷+}Ŝ*gvX }.<:7,3I&|<"*~9 PFdil[z83</|3U±OuAJ>գ8 42I7Sκg/ᏎW !s1G) %hW*MvxwJIGv#/۱V{,%oa4j?G\bɰx|GT8CЃ ]ޏ}S< Aϸwk-#d&SH(..h%&hgF) q!faCʾū0~1 #aUZp5{/QqP*ҍh N|y$rp [@+']T` XfgRN9b9"-`_R.`ʍ[P7 ʷHUO2X|0P jĊ)$XFmZQ='ԃ= ó_=-e/JUךz߾:DoqWH~DG:=?K=Պ#ǟͺk v(Ռ3'a4U(K`L:7l1 MW$*R4)[zSl8Q4.CMU-Ll;.?ğ|&^=JH? fLD:lwOh|/6W& PY ^8IǷpv5SJ=` e$DuNw2o7#F 4$~)Fٰt3ooSe} ȴdȴ:a$5M^o, 31pQJ,Wo i\6)ԥ-Fa޿&sGnXm]f2:Җ̮?;8>3yyFcdI%粈'ٮ)U3h8yJi1۱SHzCҗ;"sMAehšEHnj%|ehx Hsi<l<=4y4&@CS-B@s@$(2cR0V(ab۝~?_X )lRϐ"k0p"~@\I`0|iқ-6iiք/sD-2+2c*}Ü5U"%2SuBR#{q^+2Nw CI1 nߣ $+~fdB4їm둶a37bx/lBjкokn+uivNšCj-<ಛ]96oXbd+) $HǚHݴDFZJ YA+[ N_LG^xm?ڥìY3BP{V!h2+ѹ*Y*S χRl)gDJ|C܅l=Bl_ 6oCt6`/O@+ l\AL-c\ʇb0SO`4%,wXZG]|dR5 vq |=A "Uγ]ѹ\UqPDQ,d 9ΚʒL5 /Ciנ$F \=_3⧌c 5-:'ު"3'$]=²(ng1QʼDg^xmgEY~a(BoG+>N-0/pڏZ|~~0iQt_><{5cИYt1zf/  i{$oFC'Vwpd+<4 2|ba2UY0p@;=IŞg3<7aF[7Z>sl]eĦ(<7 JaOu ٿL['F?}̇>I sDWޛ%,j<+Y>E N=w)y4d*½g/2nUS-(iճ?Ϟ=[WN,Z.]Jy),~q]gy$UFr-۸I)5Sq1qDڵksuy}W;!!wXJxo3OTSqu.B.=ip7Q(< r?wn9B$"P( Ps1"+@f" Bqy"ҭh茔v߻DS Y(th*Bf^A^s I76_"kحtOᅷ< B"/~E\-䘻 *P(LHD>t;𴊞MPP.\PP0'<΢GGeu<ܩwbwP(1Νjժ^ @ HJJRW3$mD ێ#Ev:CŠg0ka[j :vmO32^CF`t:<|jGͨf46%h:4;/{3TKKş}ə);D}YUV"TK{,n҃n96EP,%L_W/Sx NgӾbj=ҏ;z4\d~~I;aP#EG$)]~v]ꇙ'E) G9B)cx*%WԩdFO~i\53EYs^5'%sjH9ٓ~biBu=kivS:H9/g4/-$ϙ2=bt01޷1ɼKz%-%/q `iH>wR5$߇|* ~ksۊAoGlWs̖RKc)h 3mkɨG̒<7 CV`#__tzi(#1`]TRPݰ]֋CzCƒ^7}"HffSe=q{KuZM4c9?[DCW;PYCWBo oAfiZRNKʟ:qCDEWS3b9eұMsꖏĜ%H]c/eočZ퉛?Hl)kڽ`@K9O~\'֢,Ƥ[fEɃUt):vR'b6ԣXÊּ~o[HJ .chyeP_3~Q }^NpsF1@ nOw^ݏl vqCiTcJA$'R yF^O ֋0R;SNWmZ4Rۑzt&cLw̨ }Y6 /)i!X:bmX6r"$ +\O֢e1/Ҿ* +\xdI>| J kǻʚ ^$GCª|ob6t<HlɖF8̘-QlV)s6Mb(O>k)KXyF.Xnш[%(Mfv;Unؿz 3Ի݇H `ׁ\@|#a +&m'X9?ZCre5;l.;8"},Of؎&pI!;{o1.D 18rE[ sh_10V% gXRv)qi'4&@fH R-^׏sTWrajԹ&p#I#&+xٙcf%d:eE7\:{Uu׃;f^Bw)/q%j35FgVaf%{/ n N4g @lUU6 NjWzO:ir"=gZ2Dtgy&h)s~$%tGM˭gq#dȴ:FR\<ڕ6/HɬEC^Gf#JS҄د22 7Sg&&SbR\hd͜ ڎO>5 W? E^ }V\0 JH#SP6f%ҤƱE튊~q(#ѻs(ذێRccFa̠:EŽ9j\ IDAT,+(a2dOp8luS!<` +Kf>XWl ʉ]9thJ dj^ ͊j%=wtHf͉0M[sJ$Uh9v]311H=w-[s|r ŚJұly"eIL̉DR?4 A_HNݚS~cֽw2ym-1abzm̍G!m)$;vL!5h]Bc?rԿ5:Q?v$ȿIJMyh˼,!dېby"Y4fs,5%^ӮAI@PsT>ކ#Y- ~\VT rk F3x-3t@^$.^lv]*@Lؖ/vt)LP[d]H 8b?mцG_iIps-ng1Qʬ Sμlq c :<ڒaҌG![offԮS7"f}!˃:ڙQ0iěa뫯XVK;=uUf} BKբKi\.X  `ƌSw1עRDG(ު"3'$]=²A8۹Lr=+/$&&G%((HܛR&r'w-]t{ Q!FٟgϞ:Eʕ+9rYb6Ut-;r" @f/y*ȅ„J=O@룾*RC:k?*URq+xB.g#/]<{wSaVBP(p"ZJ-{m"c =ɥ$Gy Bq-γhv 2C6jfJQP(RD$-괆`=#z]:sBP()Y RY"=)_IG=tbkPa(BLUpr|nrpw_;֕gP(=Ye#DW!\zy.¥gBP( ,-"'bZ^8gĻ. I"oqdu+P(,fW{^³ϳg^y^vTbP(Y؅j`xIѽR;{P -؂b0r4i-"ojЬzB1 /Shr Шy*DC.u)JRQ JEJrS9ub)MjKT6t5}vC#f,[/C{zB)r+s{͕cR~1%b0۶2귯Px%FIHȌ5\T C(iFOeڒNHŋ$:9⹩r(EL`LeNf*GچqxiҖBC! ?3$>4I}lܸ3iWL7l f&*5.:Fbvn\p̶ Z6 U{d>5ߗQ$g|ch;p(U6.揕{MeԾ{cC2*J+ .X  `ƌS"5bhܡ$~*G;]k׉ Ͽ C>./#02ymh*/{j1߾B.btF[蜗W[itv2lճ?Ϟ=[|WEҥZ)O'Ү]<ӭ[۷tfK /=ͯǠrWBP0“wlp5CdJ|P(t!uzB pNE, :䭿D^E-P(7x#UYҥ0BP*LHg:F^aW B(d!_v^\(#\ CqU ߿* ȿ/:^pܢ<[jժn:-[*C@xx8UV- ʶ p9År`(,6m*By[yw;I(P(7P-tÓ.Hr#|, Z"uLĻ^wt'"< B(E<}۝|rSk%@ 3)BP( ހK\>A&_G"3-X( Ex.6QٟG[ADBP(g̸߮p}Ϳ0BP\[C:qsCg7DdL&)\bZٳgIII\rEUd2EJ0|"pc3b֐'c].k*rXNst5SNѰaC▥~̝;H$ˈKwuPRJϦLfg, R!XW^#Ɩ9ڞrFyGQbP(M^*:<+]~N*5 C) -,b.> 7pNq=+BP( ̖*P亄sJ/7SHLBPf\BۄCs,s B(hZst8x@dn%3GV?tGP DY.tJ, &tUB³e)so)=z:lķl,z_YKfﳲs>mX9|D6b4sϛCyC8'e'!̪=ȟ>du$^t:,p,>a{nt1Ev4OF8&IM&>F" j`Q}?==CFJb;o{ 1JR\+;X|vEIo#`?NOfF61}#8mllM.bhg;i8l*פd˷sbHV$gAլlW96r2ۭg!u Ir1BEJĭ3Bd( ӎtO,؛=1gv0>ada-xj`G$I{3cB2j6<WU֍J܈`ꮪ<=L۶Mb30k9w~mIR"D(:O&e 0Ҏg{S<w\`IRƐ‘Ӭ Kro;ğ lz_ o,[0hˠѥJ(ɿaؒG>B h6+^d.ɶl i[.fxg:6V)qgAFG[A ,1%^1@_IW4&ic|E;.Ѧw;]<}651wƐ)Rr~Fʸ)> BCo5=*p +/.2׭HKy]c4LZ:d ";R5ĈL!a7KG7Y5v*ϛjlHäK.d#nƔ~#&M5-' -vl>z7qe|RvO:uUcfs7h\*KfcFW30RN5vGe[SZP_y$WxU/' `py<1ݨX: *1{D0q-'Ǯ`Eԧh~'n_4O4+f棘Lu(nv|ۅO1C ?$ _SYxRKGXx>P_1 V2iy 0GhTc>'Ƽ8&Y{`^~# kKOTfm8GV۪-Ӹ_LX7g|Zwp⊤nXaI^R&U]i$݇!>jЃĦ}׼@'{G'!GneN98Qc#F~wR`g}#վ7{=+cwLۖ2 /xN߉zKƔ=HaG5ֳKm%0D1!8v<#MN8Q% F"t`WKX:{ff I0Rc|2w&MQb#0]6~"s'*lK@1 7%wg;q >EƠGBTLQ.C'u5Egxtz3Г-Rp׭)Q Ƥ]Mͬ9v;x) AQDi#l{6џ1@*ZV|:o#:օ_T{q  .M?[R/rAeMHoׂޕ)ARI庶΢yfِuwL}HF%TiEլQrq|C[CtX}z3>ܶ!ġ~=1LPPza,AzQ:\-vXHP]Bp]4[Dբ>lF(;sqș![/}`[˖P(ȱ2&5]j+a^]<{"GNCϮpaoBP8tv Hsi, } }A^BD96^8u~ 7j=Ҡž .\*Bq˲~ L&28I"r/ɥ&x/rO &j(V֭cPܢSjB'J2F.19N:x':ws E.ϢiӦ" 5'tᲤ\މ$)ȅ]8ߓP8 B(`dNEHH]p iN!3rrJ, Wۤ]~mmtLnϹ>ñLtm{p.^up+ 5 ϐːn˫ИtX( uE: ʘs% qћM.X( Ea!9sˑnͽ¹ȝ1SN IDATQYg PfЬ,yĒ+ã0I!R90 NWHR BqD?$yNƒN^U}YANʳl$$$p%՛YFh4{Y='O{,Cg?NPP*TW }HbPu}յG ҡ{oouɱ"gqʕ+~,L\\ΝSC-YqW<%qVW uVuYnS 7]wjduJ, 񰀨,K$!kbt}}awù@% BQVpx\O! q BVk3y^T:zΞ8٧0WbP( m>kdžZNEڇNM6 B(DN=^xBpGrTs)zE&Js\|C?Gd$BΨα7 Dta ]w!5yJ:&C -px+,=EKq 60Ӣ}ݼ~m ۴nHuc<]^jI?7M:b ]ߍBE.se}Ĩ0h)t|GuAP-6Cq.O u1tӎOfSݢa˜w;/0߀/0_@).^lF^\F\$GC:,}'x -і™4v9`7p78@[KܱhAε A-q܍i,fq]zDꍚ.dX{MJ}N_NSVCU"A*2"0H;2X1>/՗x%v1OfmЛ-xib|&3ON@(h,]cvf_]CSIgƘsD0e@?:U @k>xYZQȟs,Cwȳݪ(u݄40-y('~i/nNyd̮oTzHiNa(K \M19g\ϴg BsK<ܶ{׃KGӖiX_~@3{}c^mcxɌ3 rtU28+gW9l(JV2is*k$;c\ >x0k˛kiLQ2#F;ɮ#\"#] ^)a$&-SX,lŻS3@C!|H)bJ̻_R+Ʈ ܕj}Ϋ~|F̘de9j̻VI7F/wyJ7?r{h; WHRƂ_qwg}ň D$A /2`).N0gĻK S>Z7PA^'hصZ֥%o&T^jE'ݯ}ksL[߈?yrNHfɚ^/arXH |Exf: l}nz[-:;G:)| |k\jGYLqZZ"89h郷qv Iƒ<ϵ)v!DDEUi6=,n` mW3 Hs32e8OIbisƥ;='G$Y$t LEAy(W~~$\imDuXuEyv@ULE۸kYOڿxCrR]VQT׆Y#X ) c Z+׶S@Zs|t>oEax$" 5*y?܇ۻ/c1o^N/ץ6pȠTiFb ȓ1/T IOVRPQP~$>drBRKxEZOije1rc*}:Cyf^CT`UeU]iT )"j[& ƊfΖlLYǮ-{)uw4|lnRwm%ĬU: '&,&=ߎ5'~`CV Nem{6ZSskvRXbh$8tis^-MgyebW^z)Eh8s3ϫZ9oNػVcXOXl`_8 e؋2ټl)+Es!Qže_2R.I*g)a-*&q̎I m;y䔙hG"0N)N#U7`𷡶NUbZPGp{D>|~4_kybtkR͝Z^Ɠ#Cg}BΦ?y1|gבqKX= =g$ }'06>Ljգ/߿Z$4R%w{{?wyRHpJ|t>w;qg$O>pSGޝew?K8Mwm]}Ȥ!w2xK"Wlߗ桊Rt_rFz^WC)wmk;c >`~eߋyk5P'HyU7BOWZQ,XѢE R?J-$_3w8룪jX+Tut5eBᘈDE q%YV^RyƔ>~ÏX 3g-~ßب4;v%ߩJ9" ȶnC2Ru'NTW*aeHUP -n(AcKGf#f'0ޛ)W]k7־jΆA8a4!׮;I.JѕJCW[e!p,BUPw3.#^)Wt JU {Pc1x|]ļmEBѕܨ$>!;WT=m1jq*kg,R(t A7+Ajh #>Top^|&t͋+o}|A8QI{ rʊj!h_[VUvW"P٦PUA8xGhӬ/ߦjU h9U7H^Uj]5" 1AjOouj=*MҾ {CW{n 'YmANкbr/l^Z5D g1ړmYT'ڟ@xQ >BB[+׶Z)k}0i>Sn=OB <3VUư+к R~R5,E\HUPT[i)jdx‡;pcγTf]Ez*sU3 3]YUJh?=@kHanw|\Kj!GXFZ>"q*[U6*S֜JxRS =}(<ڣ|SWtM@-SӲPGQ9ˠ0Y.C2Pujz.Ԅ**MUTƕ^ RoPX6p*P>˪};ڬp[0*]SHՆ :}vbQ ¬]`Tb)AckYAZZ(OAV$! e AV7$г_[BM3mvXq(}x_ BZM\?eqp*VZ;*wmXZ,5.TXY7 / ԹeQ=(r3kח-5v5=:WQy>Wb[NHЊu1;-akn9z-9C#)5 b_,; ^˶pmeҥ,[뷑gDܹ9 A!_˒עդ;BHЌPK$Lgɟ mb+_sm#Q(0G{.̢Lt@^5ꈦΚ95A.юrKf2CQ$7r-ےHH"PK9h/XU K ((Z_?^KNo@`n}dAa`TltT,-&I a(0BjjiZ7䵹5, zBA8+|%uDSgPn,Qݕc t_Xa[]XmfXBJ<mb$Ѯ[m2!PVPi*;5k{j͆'v{9 5s*Qg5RR GͮaPk $( W E,AٕR" uТj,BCC%AN!֚N9s )|vh-Ș Csr%b! >bY Ѯm*n % T)DEdCBA*r.w c>cZp:]8Yv-aaa""'˖-wu~M6CzZxL-bq2I=MbŊ °օd ¿FyyQ]Cki~P SBAg` % T5-\'CBHAVThg< AC)G" raCJADָAPE5?_d05S5jZ]D$%|yD"==~GEPP1jK\k-aM0ʰbDCyi.vʈciY@Ĉ7_akʥO1|uYZB1wpz pUK>->}1 4v >2CZZ f,᝻+o`4K{}񳿰7 N9peee8PpG LlGK1#?߸QW`ϣi꿆O{T?w^3cͼef !QaM#iBc~_{iO`hРYYYƒI:Ba, -\,\˽CT4~F E_YM F\ؑkY+bdWIeMiOx @7BGc!{0N4jӦh܇6mxB E`+);=WܗYXڊ~Ls 秴'P,ՑCi.u^Q#|9EuL]w0]%\35/=iOP\m)?6[oNo׈ p!~M:*A8W#S_JbKWXA!w0p8G"RxtrwkB6׿1 Ezu/s:.c.p5dݠEyІ|:e%J8KsX=6щ!mjWâ "JpShb^Ab=B-Nf޺^6PAYг_ӱO =]UX3]Ǎ[t43'3b.)her x6Y/g!YPFL [׳vѽcP>m-%,. bbG.5.j/?AIy)[1gϵl@5!YȎϽF1+K4b(XYޜ7џ<t<7O^Gד h<;SY^Cg bY4ÏUqȚr(¥^ͯ_LǾtr04N,ѝ};y@e0둍eXc{0쭼XNfv3Zb;r^Ly感Ħ "lVq3_LbCh4K]wd.jKϣOr$q/ Z*0^x&y5(0hX =WF4?q# ɷ!w\?>s>?q_pbv [{A_x7_x&nf@$yzػu y{9=yvs^:ZVeF4^\1o&A~}Pk8~t>XʧoѬY3gJ ՅJ9LEnTg܌38Ot{jTp9 )3f8&۪̝;6^yj=ݟZ4QY <-ƥl7/BN.`1cBISEC_\f튒^?gv ߋ 'AiܢqhU,B[2g$#A8y:.@X Z @Ny BeBUXԄSXX(!LBCCJ)*C$m۶,\ٳgKfIFÆ ;wn_744ģ,{`[XűZ#©2 !p&n(AW,Bo AiIPk Aqh Жn* 8eA` Cm؅ P a(Z 7 $wc (+Gq8jR>Y]%%b!p1{lbbbf3"+D p D :C[+ԥXR>oT]mv\-f22Y:߉=,}`ZG[ʘk{&ƕp38s=N,8μu w]ٕ-3Kw3gyXmG̦H6 '(&V ]Թeau3ǿeus6z:WbV~*niŰ:!l\3L#8DB{ʁnpMxzlíxn`^|,]\|:Sl ZMrψ8n(ÊjCLg:74"6 s}L++k0QR#~7\u'|2J!PhmKD^q=c0f}28p:;s"(8&VKE\;faYԯ>e'i\}Y ,} Ǥxx6F& q5S0pǘJZv$?D%)#>ʫO<ȻOsu(V]%Ɣp`q}=EEټ7yh^-^>v(ۙ'ltHy2^*1W h(YNawrah~gN sc hv5o|[c܃K8҈KyK]v CrpPg#-")X;?KAAvQũL鮟9>{~xlyz>qzk`"Fvu)i]h,dOEݖ+9{׳`t[rmWѽA=:{\q/,Ϳ# N DG*m*KbR:#u6suR|YayyJZw&O~x+aw )}{t1Ol(vBC^,Tp8,Ldl x=T@, m9Ř3fBDv //ǔ'y"e}SߜJyM<̝afe}oPfb)T,G1LUe`F<1AΌq۟M3}w b 'XM,a9^c1q貽(\/.a_&.6Ų'ѣW(Owt[~zFoR*%̘a)(Esy=p>VUIH8"OM";BDEAP`W<ڰO@gi|&:1mX$', ٱgi9c/3?i VmO7ɼ;H3]_Ĺ $!@Rvžd-ED;Kٻ0ٺekpPK:` __&]o\A'8CAjs1 yѯY;-H@ %$8s:Fp {5~1(JV;ͲDwbXy|XI=Ȯc$0(YS>wiƠNrvKá{ |&IdW, 1ɻq؆lSE*|y߫^O!i=^2\/5 }4X; bP>4kVa̙k)ς ߿'w֭[糭jFF^>-oNddk,ANiԨeeeԯ_Ӱa7X‚ 'gy&C~ -IJA8hڴ) ݻvȨA8>|qA AAB9!!!HF'EEEXu? cpRRRX|9 ,+[fG֨[~="pBCCܹdp"SgAA  b! X " ?Aj ,AÊo-,SM(++#11(Obصk4k옄PUU9 P[DRSS|BzhѢK.eݺuiFC8 ߅yNI֭[Gdd_L׮]=©#JB8ٿ?aaaG)%%Lrrr$SE1\?Zc7Yi0eNn&}`ZG]yYz;nGMɿ.tgx8!=~&g/=QAޝ@Ҳe#:' &MPRRBLLdP U2kO,$p5öoElm1"ZqUqV J)u9Y|FOPqfN@g„${zi)%s6X _Kqq1QQQG|^TT[n V+t!k~P~`N-;‹'<Ƿے`Z=~aGmS(ibf݉Lgf&^Dצ'۸Sug؀[L6hrVbV֮@jy/G|^HH̟?_2QJLL III8>~ߣttȹ '-uo$)>d.?hhS0M֘fφRF Ia$Yf^?#I(>QJ$r81V׃fbYmϹK$䬟v߄#j2k|5e ^fU%&a tn_j;O勯瓡5JY9{CM[u߫AqA{"kz3yd ]9[:2X ض@Epک󼐐V+Ljdʕ߿ƍdYt~i3 sR ".p8ZW,Pu*j2!8gKq*/0?F(KW+ aX˶_7&;#K2&S6/oH N> ;99Woq!#WXu^ij7wǼAι>'ECQ&t( &i\ueGR{>;Oݫ8ҚՎk/!oA%"Q+ٙX9DDDH %55y3(XUWFSBrpbaQ  QP\XZw݄xl,_Z!*4bԋ/n},7)\; LEaN_66NW085ݺiF6m*F;ә?COr-<\wFRyQښ9_1ɇyui|uiGBPTF@ӨMԏDtrwYLmy60h׵ ͎b"@D8!,c/Y7y"B8p6]]`mw񄸬EZ+˝PZZv,Yh؎W$='I![(gt|E(َCiR!/J2;ڙO4HɰE#6rTw(/wRZ[,VV]m OG0Q]CUgBxbl!Xl%̘a)U%D+t @;tbBtf:>z7Ʉ[,z},?US5?[UЦI hW^Mzz: :gǎӡC@ }/g3ΠqAd4ßVY\daWv)HؗLe(hg)9{wUb }F~Ɯ99M _P[Fs`ٷ|ifS]gΜY닛%Z [L;Aݛ\ ^)|3Հ__Mb~q/CR@7&MͮR=\}崋9/goLk'56}`ʋLVMsٔp+mqyIvvqַ|5s]״ bǜ7uN48! YPF0]/U[Flu1J82Yn4k֌0O/|6oLii)Juϡw?B5C}fgW5A9o0oyV@vgau'Oת񳈕U JOOJc=DDDШQ#(_Xdg:!'KJ@- AxDX {\ 3q}HA 5ʣbY UK(܈X `򔈅 PmC W/܂h A^C%%%" B5zX[AjV(rXbp3矨K' {Vk{S;N222(..\2*g cXO2>Et:1 4'(%wfvI㔚7lٷoh&+6oLNNՓr>pe@QaAjX$$%!B5{4IDATk& IJ&M˓r2ٲ0PP2f!l )faZ-(\{q+'(A_B C" ]" P VłRJ,A_`qGR" 0 ֮U8B`||-q)ri>Z2<"ڀ@U+80Yzm:K=h;}lJjo$謇xuX:wM2t?س2_p942h\)4Llq?^&baY|3kvqfvv(y+y4|5ϵ${͏8GڵaI&s"<;-* Y>m+Pgc4J~rcیh9OkG_G0,rn!;,)ấNR2Y!L4iv`z4"f#2ig}?Źi- %.:W^6sYW )g_r>2S~/KOK8嵏Wx>vI !,2&mzҥIdRaVKl[΋2}~L(MŤni'~fyy!/אpz@Lr&oFA5rj7ٽr ]hb^e,r4[=s'|Vιv^uO^s/<5m+_*ضh2O_HfDOZ[]WqC#bΖҊmT2bΥG}q?օ *s{F\K&P`t+.,&<}7Mg܇+8d[frgkOpQj>p%}_?"G^c/;ọ7UQGF>6w>[#Xg{s]k =64O͏-~=<;b(gfq _3?U* -D``(Iy箽XNF"?@tN$ sYM'ՈPӚszYxY~w*ya$8qe0fՒAWd],q ba76f#e#1҆a۸ 7Iz UZFp -,Y2 Zhn.OoC:<άL+e`8Id%s6ֹĆ bvvUH Fl~rmfOu`H\ ~Jɹ݉4ē^gPS|PdNkV8w}R tց&!7[8w!Ok WNfɝQ NbR_fbqCaUb;,X L4hF6Hhɹ=||eƦB/ƚ2!|m3A\<{zE{>/Z.c'd}I:;NƎr, WoJ%[$L]q]Ӱv6ånh*O'Bg]+$YȘ0OL]B0sY> c Z+׶`ګlh^މx6T:|?-Ȗ߷Eʸ?ILEq0'al8f){7gOJnoЫ{Zt/(q-߇S"Rw1Oۘ7}{k lE0"\?1 1(`ߩ.#ԁv{TWE;.,.g´L{ ɪ0XfwfyiP~frNĩ$|_nrV&DEEy~OL}M )qٵ]SC;T=܃A޶9n‡Mr {ع7ٮ6sB|5N uh[Dv[([==ykwWHa^6cΚlgOIXĆleZ RLqaWIϡL4|lnRwm% Ig޿c]Ytp:1M,$0آvUש 9\+{e44AJ .eʙA,78~'ƙo$)O iɍfyb+=޹VQDqfJ+)(ZVыJ FI|?1|5Z*jMj4*44~DZX(?ݽ{l{~ܝ993wfΜѸ8 S!Ly5lnoOa.Ñ< g !Ǽjl@Wz_0]fy:,'ZwnqђոZXz.Չw؊ƧmQ y)Ll8}*;>5TNz;ھE_ӥF?v\sdzX2'^x^W1py⺆êf=2b"k׮-[[ggmGPQV0nA H yyʜ2,@,D,H{,Ȝ YhȌ.Dx_ә,:'8xU55%?H$+ LEEk,.Ħ w 3jjpZ%?W[[nd20$LV,:.3aȶ''LD[#D"zY D&)5,A.@$A@A)2 [AB)^wY !RZ`  A!Jv] % ǁwlCVC `{Lf(>, xRfRPء(A{ ¨0əK)ٔ' 䣙̰7ya D b7 : (СCHT9BA,E`AJE?b_AF7fe "nހ| 嗄?n20]eLdfX䞻êػxyj2kqo{"ɓuF6QU|()γ*U9Ƚu('dwD^aY6٤9py n}<[ 7:VDᚳ{5|}svilC̻OakE!W7 ®0S5Ne R34h@:c0vXضsD%~\ot9m!x!"+++QQald0PiaTTö̼P=X6~~9؉Ʌjl6z|iWX&`:AMu%m[L3q1 =L/q|֚_l 1wr(R8ߏq$@&eYLD#" g{K)GYc]VKijYa7ug܇FgWhzsEQЯRϫ ķbn` չj/Ce};|jVsqQ+ęo瞫;Z#sK^J۩kcX٫rIiQ[5ṭwǺ| ǰwk$h5YM:cy88sSi|j%?cl9{oaPBH{ċt剄&o̘ʀ̚Gu9%s]y!?$sj *N@M}凶˘py]KnpdfeS50},D8!O2n`JƦy6O8'(荠z/~xupySg{Tz^S{c6L^>Wqc:@>CcZ##j*VxAݽKV +t_|=s'_"OB+ U1]&)jtJm@1syלzn"%5J % :͙>hIVᖹUn໩iZ=ۮ_htQf]tOA1)qմCPi%pϾQ?Th`YZ4n4wKB3!z/`F,Oٓ^|1K *~ C>!F95/Ɂړ Bj7C\а0M˜Oux,baѵآ jʶ0cD%QGPzcձKJ6#YcY=AgqDτRcfP3VELVL@2byRFGF Opc1l]ţc8|7dzfpo9ҏv('ãP0=3יYn$dt-O\NV"uGDRP\J(+$ We ~hbӳ ;huoо6JR]vuy,l#„JA`u<)C9Y@Msv\!y@?.@/B^I(){hK`B0R6LF?;_PQ]Aͤ\pn.ensPάekѬ (f!?RkwpXƃ5~}f: 6çU|HA SpPL)<%8ℶ) )yy @G@&uh*1#pV*Iu 0E* <3UU1LU!6a2@>' EjDkEaO* C~CqE>*yަ{מ'16`K}+ E`* %YE{mPi1~ʃlsф"jm@ k#AuxL SؠY# ^B=)aZ%NiЕ (YE֩-9hewpڱ02, jP}ET! R$Oi@ I@ EwcH0BY='D@N5N qDC˕u#@z@xNO#NoC_j)jJ@GYPS>wIC  17λp-`}7 J D2 X ^Vk0 ´Lp\Rw^Uw:Ad?DNj$ t ==v!]X@г߆ vpLMuuK@2N SE %M`P=u^Tze@ ᴴ0/syqÃTvJ^J+LQqꨒFPɪ B1E(MKz?ydjB!b<qfI`&Le訃>[K&kĂT2{˰H`0 bE VDH6t RiX<֩H *Ր0$` >AU!C Q`GHi+I13l3:b6:œh'єaǰ<\? 3YTP>52 GڑL`"٠nZnUD6ْ9¨ oRU!M-4x'us#h-,Qax=d)|&{"FGӗ3 5p`L6E >q FA[Tz466CJhgcGf-=-ΐ?v <$CFZ+bFWEY%~XϕOnOp [7bT jA7p bPdzgÉ;!P1?؈=tD= zE$h@Z8. +h[mjQ ^l2/Ke[(,z BN:[ bC<;-r"OM+`eJ1Mklow`JaG"5:te.PQ 1dT 4tƏIn&}!Ƈ ;+w;a'PlWuzyx5DžPHÛh܁#M·"kO%#`iR-Kz@Wz䵣UjFyfc(.?}Hi!IoDfVQ楍*giUP`EKzU:$Or,]I57&tV S ʯZkӆ4 5''?+2.)HE0nZlV>/(RM Hdt&|`zz!Ž( BPTFmj m iabxq8ഐ&H2DGAyOEw `eݻ𵈤t)*dSi9]]n 6ik|9Ӈwhpǧۉ&'`!%ظ?B;S iͨI|;~]qx0T,lC(Bv >-y*V/zzebUGaB<جF˶G&2';-jwN]#MК a'p{{tX^eboؙX1>R3t02Cӌ]:5Oи&,`/{H #ݛ9`7-m"%̬7-VT1{òu(O2mM Iz H R!8IT;#Iz00V +!}` |\eT \xTVAGQ@rH;Oʬ] _Dv>iw 㡺_$\ZԎ0*ha6q\4X-ɰح!(oT]#qimP͑2Z(#%Ѭm}%5B²V06zO Y(L*/[xxovL v*^)D7gd?CQQx1(RZmȴݘ%T>Ust-'vGPGA hQf}=v1Y=VqOJ7.QFW?9V5o0c 4i/KG~@EXYRx-h?EOZwuE|))dty@Hmx)_Ne!8Ft^ab@hie hܸ: .zPR]Q5(I١p 9"]9uU-fNKKaT9OG&qȮc;@.!Qc4(XO/smGD^'"(S]RҘ?wZ R 0ը$o}n#h0 XV챉QR-.\{Щ3B TF'aN5=y{ c!Оǫ8}d;@ :2Rw#{!lDAl<0C!t[_Q,㯴BJncRTёB'Clo s `34̙fޠ!*Pu8^%uk׷KBos7ƟtvW(7dR?Ұ,lFM笂c`7l@fҁr_xDEv}_2 iN&ݖQD%+8Z6([cZ !.h|mUC-cҷ"[+h_h^-U ,fw@cXmk34 .<[xq[;qWD%4?jwR=9<A+~`$9 LZ>$ ]ԗ7 .#pMU'AE=KئiPW%TUp:'AI۳eɗ 4Z+EJK&8o`H6A;ƌzn4AM^%3dx9AllZS H@iZ6Mm$BUui]+Äfج } =V+@"P5\+[#C\ uqBB:TY9m@ BxRrq:k)uOI ,

5)Aa ]>cS #t-!+r#t=zFJit৸„:O );+ZU@`@k @^_TVl/÷<{ÏVIO9g;@{TBNkO{<ziJRK?>siO?pA'p T;\T-?!*e/~'ɚūN鰋5`"@*S H&DoVX Q(跐墢S\{ Cg*x3h: c!{mGdMЎyixMv$hG}/_Fz+DG|RDmEӨΦmO(pmxxW{`;Y:a;=FA7øCuJb*NxCONquΉs Uqnt&xƵ: E j 7Ε+ @D_GM2Qi3#4ħH+ĵKi-K)a}k~cAFK+#B1"A*pQ>tZW C5h[?= -vu,d W}4UvK%TPuQGLh iy]-NI Eǎ`DÃw @P(:?ۧ0CޔGqA4;ʒڗdpF:o:5ke[Nr+32㸟[_ :0SJMa$dmL V.sBITO IDATx}g`S,Kr,w\1`J BH y!@HI!0w]e[V>}Jn@y~3Ν9TTT 0`? h( !DQeh:m0 òb1QA >&0pg6].dpE@ h7.NtAۣx3pbM$_UUY5MaD;Y<,˚L&}5'iQ#USY|u]UU"DSN?gyj0%!hEv )G@8&BeYÑtcR2-(SELX,amG09~! 4M(ys\|$1i~5ò,'af2DQ$d6v]H{b&,D42``CVޓs WGSrWMQUqLy`*$%r\3aS\yٝ(%bH\.WFrҬ^oe«pBj(XE%mO}jUs7{RG?k MnhHrC*@$JeYL&S@?"X,$z;O#TG0F`e/5򍿯kc+[Si$)䌑VUi)t!Dp897*,kG|C<ϧ%ZZ[sF^JtePru>R&Po]ucPA#PyX<XDz?k1"e3H U57׀} }`>}`ڭM=ڂ웮(7_Ziڲqe?D˪o|rʏӫoz)eֶ{-9?k=ol!{Sj?_Mj {r߿z[S'"gfh K.֙8]m$1m{„E\|K.ϞT5c?Ϻu_;b6EqOHbv^9ƴD5W0(eB,ÑMY<$ 2b%4UۏNf i:g+bZ"QYli* xC!aNICVPJ2ZɉyJ8$c'G@[XuZL 4M_Hi# ԡ#Q6`Ei+^eaٻO{p./WW~=#pU6@D桊[].bW໯To =0wx׻dwK.́}C5o79nV~sٚ??TVUB:T7K߯.~.ivwXm |?ۣ(J8E;8G ,HGUUIBP$ 1#r`\,Ax<x1=ČqsY~4*zG-'} `z2Mme^`ܣZNb:t0jv5Jq\O9H;ljTqdw%ؠwkIKᕊf*NRե,RsRm)9Peeˡ~ٿ3hB XV>A6{V6{s"aK h#@FZGMqC`C5` )6.&E)@YfV,q_]}kڽ 񭽛M;&,\Zb).U:>ݰc[鱗ZݾuuP=U7>Zs+Z޿ϗAs덥f71u ;%IZ"ח$)'R(6*-g/fJUKrMN3hb) hAFk Zyl}l@4HC-}P $kY:edB'@52@쿿4ɀs _S#CM; B0__wy"(BTbP+3'vwnjf7V n,˒$t= hs6IO$R%͚N`Iޱ1Ρib81Z48u DQ$\x/HglbIo]cN(HO[2uŀDD+LEŊ(ٶ_TU;뺮E]7{RR1B,ZL8 sS !îxaXJH Tdqю(D.wt[*+063U^9k 004 x C/+q_/V֯qqL)=[Ci2V8\$$ R*+&$@*3Re}y@O\yQѨyG |߽;z/P~=Oy o m\ӟч{_|s}xPcn~fUwX=oͺ5c0.gG{"m/H٘8 Ҡ#/ZN#Y9fSi4e/,ʪcQRqpj;0 TM;RQE;r@Mi`iK Dt{&J[颩dVgPɩh|4JQ]R(U .'d)"hz0Qˎ*J%P{uHeMЄoRQT1jt*@sٮ ?۔Sol_@F,v333o:!txwn644DQ?}(l6'''~lKJ!,\m!',kFHSbXe6vJMM#;uJV~ojXֳ[$I`~V@[=Vbl P(^F1ʝ;+el`,ˁHˑhLI,NaxwN5nt&3ݱBxZv- ѣiZPњEYegbE!zK(]bAg=u";0H Nd`( q&]ֻ *Do<ORRRv큖|L4E-;򇜞ـ  DQ5ff 8b~!`=Ӣ*"Bj8|~h?c *IpfOdٌ_fL i8.U śYt'I! X,1s^Ley]"Gff^R>tN}V1 0` 0p β$E"a96L(rG;1Mu-h4JӴnO1wBB B?D]$V_bxf7WY,"vķ(Fӄqa_u4twhƔyyy4M|`kg%F:?!3DQPi&v>1o`#1IJJ{;W*p|4Z1@*,,dszޘL8';L9;9ttIcsrr"H|A2!,lQ?MNa â("v1еW\x%E lzڵW㓳fnϐ㞺7>ix丶Lmi#Io-<$v|ٳiԱ5+;[ .Z,v3x#{RkGZ=$zDJA4UU V+lIR'x6ң@s?> 6V{E{wh&n;΂m lO;1V}Woq$BSrHyo#Mʰ3D ֖TaSwm13oMD`0@}C{+k| ^y%#[xl}݉#;]l\<źiߚ˦NQ6@c ac.ǷwC҄Xݑ-lУm-UǏHqWǝ8OkTWESp<; IDATtiCV',d"BԈL2_evn_:i, P޿{c]]SEܦDgʟ>u\{^Y`\k`_7=_(vړi6)x;τE۵*jcĮ׎ v_1qHAڔ?o;inerv:S]l,mvM&i4M;VKPJf*誓 k^cs]itL4hrŽ-jskw`{oRM l6*IƆ0&B !?,˚X(##11!.ANﯲ$A(`_c5Pm!m̕xo (͚eM]A=v( ttcf*g?f3O V h}C+Izu. y=gC䈄"{);>NrmBȽnnĥUuaDł'Y׾C#ka@,ŶStw:_DH<#g'’9z?4w1" I5XzKZmef+6Yml^6W:29h[ƑSG,t X{ +o;1vZ0xsYF8|Pue=Ԁႂ/^%#)b̡ Y3SqCbe{[,ʲxwW辟t6UsT/|;N|B@6>\2Wj@KBj/I%s}.'8?<)WDMս?g%,Qڦ&*mhjkSQ5svv{ $];vw7\G_ջSeK\Ygk+;_|tmeqsW?29wO`G75L;yp_S6q˳k֯ͽh@;4ئR̒'ǿh]hso $g#mm~3f%y+@+R_:_ڳ݅nq TWN̻l (:G1g l~x{@Ȑt3&趽g~X8|JL\8WV ;G7Ozׇmwް  RgׁZ{}DjA>nua(r<]䥱&5-S8!ך+w y9VSZBO棧}P4jfz,u*@yɃʒާ3ClQw4+_nB{fvpt(?.u~O/G9츎~} ri +Nq|O͙|FPs|[wi׏Dq˃-)3VN5w)feп5+>tCFTT^4_o* X4U:3ԡɟPm c\?1wy[n} A4wn٭r]8P})yœtaⰪ03[,O Vh~BѦ>ݸR_䭇2^D^#FDzk%ϾڹKʪ5ǵF/֎+,TԥSG 5wm|F@ o*ߎi3=8f>\F{W~E*s~߾`y@=u˶Z[g1ݼx3ig0pP 7/ϥ%yPN N~T8Rه{o 6~´ u}qYi6knN}ܫ=`f; ,yʩ5bC2f7Gv&>}}kmqFOK%rRnlc=9cJUhO5k(JS/^ wr5yUs2?v׳88j{69qr9F%`IREPɨC"m_qGHQ#^(,i#m5Z$)"ij%"cUH+9 S>y+ӑH_A M¨+" r{#FEUu0}nbNc %kKo$L봇 l&=:?=w9>͜zh[ Zu!U^1:1; cs-.+kBhDttgzϵ=Mqw+=ZZsfM҉?Y Є5' 74ćTJJ=J2 ݸ}<ǁUY:*`XQPh9`IM+hu= < Qh}.O?UR7N# ]i'W,;/uT};;~)Lf*V3 XϮ>9μ+Vp)lzaا15_&!Rm{'EWȢb]Ihg ,n*[?92sӒosM$IB*M-Ws*JMta_t]oi&}4MӘXS$YV w8qV .i?뵇l&=tu ;R^Y±ߡ]9zy;zr`1>-L=˞:Ƀɤ7ܽ<'vb06W=" 6dH1<@iߺH~0V!c@mN`ϿwmH5͘㞦;3}{ ޮF:3_0f8B [YM2LI-2XG6ִF0IpFU<5!PR5E$h43Bޗ`5ecߖE爐˖%gl=8bBHӴh4J= S# CcFv~mPH=N$ݜ?%{ lE> /n@ڻE"awET6u> 5u@ʖzCyԩsf7ljO ob\Ya'qX9('gTF-?z櫧vc(;@LRD4~74kpX;eYgeYJM@ EQ4Cd-VB46յ!7w"(;ス!y$ٍpƬ@opR lkh{8qq8e!-7-ShTѳ͛Z)V!eG}arϘ9iL Wm~gNLHHp8&(w&8݉(5ƕ9夐3m%+wOn2 ˲U!D!2TxX,( <Bz\0m攱I7?.SYBueJA isd2'NQ8/L&gPd׮dٺ 0j]qWoa:2C 8'pN[1kJIw^` @Cckfض鑿n|7uYPXՇݯ7ԡmzźkY$Sׂ8݄4)bZml&D#@f1t7yܨш i`ۉOۯrᓫ/_l)CW%l{,W{<&=#˛|7\U_qbMfݣOW_8)JepF z|LbYl6fۦC)6==s &ȑ6eY,z4P@E4Y' عr4 ˂)mH3V0ݪ(V3iQQZD^R۟mUȢ% CAMCuL^UK&: 0Lf'Lp3ƒHFh 8^w4[dz|Y\f?'& 0o۶qoooi1A~Yiu9a S`gsˌ68k8tD8YK`&OggbCT*5._6CK5]{}̱a~̮D_yE)^IWsƚ>ӧ.LՍ/uttGTʱmggmBq H$}}}1dYNE yaZ={t]ƞiYkenTZZVaƪsd2zމE:x v8;pmofmcGu]Vr+"tºP ( ǖi@R%pX$4'ۦNuw#yWb̥d_QU}m\Vy:GS3I!Ķt:k+-EDc1aYOpBHX0.7R6uWղKjDdI:ԅl٬-B(@,6j-)?\?zt{y'-~eU\$ȔVUUur h[>M3%I{KzUU%)4rW=)Í\T(q]-ۦcZNw6iPU5U(ac"8ErWiۛJ`=Ofmo=L(8 B (Pyަe%^@!,Ff,Isy# k(i<!$|"\v]1]c!)|HERO?30 cHHU"1iZo2Reٶ9Ƙ GUUGJAqq@c^baȲ 1eQ^K")UU炪M/[LFyt춬lS}YaE O@p![qdY֤.mX{;D(#a|32?2r& p'aHvx86'66''6E1L]sS@{-ۜjr~˻Ҥe6hRUU^v@P0 (; 0T2UURvӤYCth4J Hl@#<%cff#XLgLd@ȱmӲ,va39@%TMQ$IA$Є5kܓ:Utny]iI  ˪#Uw„`BTU ee囌ϝmiEmjD>Iq+Tc(ʒ 'zE[rLGO|B~# u1$ NUW*g3DZRPNX?$@,9p)O> $WUNS>" 8IEܛ ({<2JuSk]ݼKEABz~8}'8Dzm8MBEY~kz%dQDZ,+N"."sGQeGHa`>B(yY&Bಮ!]_Ê8$}x|{Fx ې%I}Ua/9i+r(rK8|>)VTGį`vG` YRdY唓Q+ _ B (P{Aق"m_z,A^+<✱ήU] K+fG0p۷)&)`BfW{Z8W\<$cP(%gA7ɇs%f=7 p-:kmnV}/<ͱ>z@$J$H=%W#G>RV*r>zGX7Zs{J&>Jѭ 6_5=$)wwrkb~$T_y8.JԖN9u=]Q}(;'EQL"вI+7>w`P\o87$~0M-W@f̞ľtMMǢ)/~hg?s ϟ|"p΍vl`O̱߽jjV^]a]KZ6(g//oY /eg|Uߕ+625*/P|OC+Cnn7)jq>Eڢ0Xisosw}hU#LA F$)7p@IIXMEsNIi(9s89?:8BnGJ .Ё4өضw  Q] >}v~OH׻јU  y({0 GЊ3JƖOD#tg>rÇ<ˣӂk/=p{]P3[,Mӽ[HTݮ.7(#9~k 5=F?,n6Z<㳡֑W#YWKvW蝦̣CI9r$,sȋna"yT9>S)3ҝ/ӛIxe}LR,F`8ÓΩpiVo}+]nfOIwa Xp+PB ᛷ<1W§ހ&-17?f}Ƴ+Wy3Ki6ۨ0jYM+ӶM3390jxY. @8s@-pN0?Q$@8'3ڏ R=}XbAL\ps ig .rN;nN)p ,OtDZycnxd ϻوem/)=`0}r??0?_ "x{s1拷tc?yi{t~$Q3#~^ёD"mk¢YxYi V U1BҭK_J̼B(94WEEIdY5JLs+([%Ϭ&ݑRJMr q0I;7narm'7T( }V*˿}in㞻{zb !Օߗ\wMUEP0 a1,n$&ˉKo>:sw?^ʝ}%`k(.$bf3HN+]§cROѿM$\sWwmj/ïH`'7',M3HFd:qSp@Ze!z[/mi!kg: ]Z¼ƕ۞kzhOgJ9W@}%6?s7U9L{Â9T^:KZ_s)}\Ą`ۗ_~7$>x`p]l|J8Py;74̸zbIy⅁g05-T/ϯPox| g zȳ;(t+ba9HS#XJctz-2og| .?O̻j3qtCX-Ar a2?`!"FKBhl܉Arc*CZAډ,CDBʿ|7U+ƫ>G9-y@:p9w&N2GwO~I]1Izi&׍,__"n{錄%d X`}FW8j^}a'b _2;(LYtwcsnֽ/߷5ٸju'8y=T+Į`|eוu<֏.R'FÉmw(~ൾ$*0_ [0{L ]/R`_<ڝOnّpVIrho>~8)"?}ymmJ%4eAyv5SeG^۔Ji3D%'=D@VfCἺwӍy =0'tm[2< H"w뎃 |≷6qe-3w>w5h$O˃|7Ʀ7^+hW;?\!AzsGt73[?u6+.wކ/Tm= ˯߲M=-H5Q>>п8N_6>^Զ]>L1Em~UMi>~@CUy!2Bxu/movU9ȗV cs q)5f2bⰙ T" piNkyL]<bbv &ɚ=wDCxj2e==獋̚'{R)qA(9º7rAޔ@O'Oxlw%k'*'=iaI!|oG@wa(Ĺ~h8 E{{H 2biW;/A^8wu?EEu5WbG׾ˮ*(H (Cx'պCw{']]Z٤^걀gNr`Zs-_lqpG?.d{/T~b*Mxc>k,t+ƈ)ާ5s.=* nE8~׷\ӧAvkH!̄ qE4mq igu$Tn1& IDATx`/}oczfiB_m[_&7cnwcJ<؏/ur*̓ƒUrM-Mѵ5|ͨԲs4:RSn1EqZ;Sp 8TBv\W.{_CnaVijO ۋg@8āB0?FYgC *csaٶ4-+ K'444%x% 13M$.X{m!+N[9jO-r!^\.򍓼v8ML#YcճM}TGPiKQ3sHjϰux)´;CϞ(Je`&+VLC}5;=Sqj/6Rɗ\:YMo.|#rNeUb- {W]\~z gθ 3]4 ̷{Rd-$(-`pƪKרp㖤 $IYH۶MӴ,+ɒmDf1ʗ*#MUՠhH4v"ci̿*fIlۖ$#6WH0o#NAO䊛/8sgn8Hwț+.P~0UP:NkDz ~^ (`'?Q8GQ88o&XУ~8wߢ?|9< rH𓟔_{0\.`FwT\n@Зsy:<1`vx$3.[Vx՝i{l NlJc74(!]/TKbks{$b*B4'`4r jL\ݾ[.!Hr Bƕ+nx_H$, TUiNI4_va`jʟq^ץ,K4]Mu=Lt \~,˲,ڋ0?y>NTNMζ g|mRsáYci&=ɜ|n5ZzjjϞQU8֫z4?S}U `NocƘTYЌЀ(;<]S9ӆ֔"ڲfU;nW蜌alX5 ](K_օ' gut/6zO J,𮣔6>.%,1ݹ)ê7|%(MVA=W"Lx /9qc9c!9![Ȍ VZݟ3?Du 'jݴD`)`бk!Bߏqw- ܠp=+Ke>RDZ, ЗEwiG2最y{ݮcͥ\ύ66)5k (URߑY~֙вst@a .-bK%rT3yYԑol5zP@B ԃߕfLfKƇ~\yߒߛ.>Gu#'rX'.Ψ<0?>NP5@9'ڟ,es^S5NeH@?w7ㅃ.:|cK&+) zy@= } m0vȌ%3XSC;VUx$eUcx;)]Nj_6| ֬E['Ojغ WAkv$iƮWfS~E-znVGUL_{slBC`; !D AZWƎM(L&\a|峗$ۊu:TNDpF m)Lճ2]}fd8!#jIŸ.cP]Eyf?mC vmiArת%̃M@sS,~`K"UU$=>|Õ!5u-1ra@Gv}u=L+M!Qw3YAj =/́}dcz6 Z瞹hmgN@Ñf6ӹ+^ 귓IA/ 8{sfܽ;8ꁗtklڊuvy<߿{V3 mCksp¼K';ɺoŗ-TP@h#|f34;1>3ϑc+oU/t?׼Xfh|S]-~w eLОsÀ_TBtV 2œ+D@֧iH"AÇ]rlyMǺA;|e,N,+x{=tNGaS3^\㎖vX=(٭+*4sIk >*{קqaD˺8E?ݐ8wzOd {`8/] ˻;ΪV8EEtƌFuE!6nywCqӫ:=eFO 93kw֑9W;I`FWy9$857\~c*;0 H<&$Ut+1n H문4e$8)c4Lƪsfr'KfPPt}fHQי :Fh'dKﶉTas}Oz /0Kg\wLyR\< ',X^o׫_Yw_β,Ϟie;4 l¤ JO5^B1h[{3VVS|IfW{Tʧk]|ڟhă3J칓gN$3"Bl/tִ'?sF)͆z֮jsc͍} IKX2mm;er\{v3^q%4?a7ꛟ>'tz $<Z>G֓|NY*⍿*pP@paTYZv+ao?cW<϶qBq!{t`V'0[Q->hGw-"K^&GEC ~SO|B~yWҥ'raLKlelbJ+|h㩿$r1㭿d /dڑ} <(j| {>xLСv}G<߃%[zWDfjH T|0@'!Ɗ lڇBUU'9|իWyDQ!$PY!IL*{68&u۶O;w qjiBaUXORn]<8h+QYyv|WkGoՄU|H$ PJ`eE)]p;#"}SGz :<{znjcG}E6}uW Aijlhm[EJ{vffUeUQ[kNd?(R'E_y,(KohR?m=]ȟ{IK^s,*mFWQUUeǣjQQdW*9yWMt]r-tc۶ivTW̍\?:)"?m!="8qu@l$4q8EInC@R[srYFAF#adFs`JpŔ"r0%Q1#s]uf0AR0yWv{AQdxh)Ueߕ@97n5ypvJB3#F%rp@J$9gJ26x0I_"3Qu B(sYJBc+ST*iZThNq&;P"^+k4(9H)̓D@:s3Բ|)7?DݜgmM)edVZ`qyLKKqf%0JstEQ$Ξ% n]G UJI_Hb^w!b#8L&:/^/oiBL0Ld2$zlr%bټ)nN]j~zwUDԢf`}rqml7TThQmlOz.t~ )cSu9^{w=g}k7Noq  8`d㞌Ҵw^|x6@?(NCVTe)?ݥet44M=HrTav?G_Gۍ3`Oz,j[aO/P?XgY&ٳsG7]H,EDD( 8Q ! |6?΋=k_@pl!.ↃH,F+*7?e!X k]VDp-y0(VZ:m츐iu0~P=00& FrEɛp8\1q6.wvi8NkD'$0#!!{M}&O=$;!II6J( ƨsb^իN휇PS<7 Ca3׿}˯J`2j.w0Dl#,q2Bq49%E1Z:^1 "?Ni8㾾ϐZsR ItNUU sC8IjFB_j#m˝SN (S2r~{ ]kvR 8?$%W֑IDÕ켓J0StNS~j:8-~}뭵(%YQg#l܋M `!tYK$$xx]G/t5۫@BEu."4LdBTU ҭٺpGg||+%I!RRR)嶧 @8ith4:$%Ҳm~.iZ:}JvS?%Qu\ivDg c%i(#F;EtWws u*`-*=Y=Z2.(go-cǶQYBErxSƠu=VQ3eڿvFeoNG 'Z뺞N0G[t{o(PJ]~P(fhڅo=ۓϱ+euinΘi%ɅUu}PW4YIǘ9C('XC 7+ ( lYclXd'Pj!s?2o(b9kq{x#(z' Nt:tw> 1fXW]ʘF$zȀI-o 'Uq՞| 9u Jn K#bV7D"cƾ-XJ#$WMPEXrucO)mcw##S/u m]u{F۶Fd.8_4EQE NM1ƚBXEQ@ E0%ܮÔRqR:fGV|j60^/>:Ž3l~htOAڔk-Z,fH1%of*ˡ8\gkJ]oK[S:+JgzEEE|`vОVwyn ;E`W0Z; pgPe$6'ڿ>' @OEe7DsYm>_R@=HG9e9GS+pC>/| 7t!ٍ'12(2^ͤ9_@7gjkz3T>)%`Bc$ރtNb9&{$fhX֮<rQtNVqf#X4n1 ,A\5\( !Oԍ930, X € YrEԹCul,k֬.ax@Up8y&o L$sj`:EH Y_,"Yz/T}? An#g\_fz:A*k^Ep쮀jz3}c6D*Jģ' G1O9g.1>Ѭ{41&([ Èv; Lp6,H$KG^ީ)&͌H$)^<. qWeWsir7,ZDQTU5 'Upէ7M.j4@:7|Za(Z՝' 4xEA8P@@VָGܲTtANP~Of~笳̩SI} @F(ta0P-s.u#?WUQG1YZPf pp 0-6cg?T%b9$JiH+0ʷldz*ShesN_,Y6 qF3DL`yKDD$Dd 23g.LwWvJZb;L$YȲxH<%Zʏd$!j'a9֙&F(i9IxDQ o$'ERmGMwoK*[UA&V0Hij݂,W&tT7-a>J.gI="!UxAP;l 9p< `g`l]?>ZUVw@d:KIrO+QN7҅>rU~-Xa#њd4MWr# t:>_7J8Z@*)A* 6eHK#f`*$ Ə8`@Ć\_֭ ޲ŀ BK> 4Mأ 1@_av֥ReB&Wo/Hkj0 F Kވ_pV1חL&0⍥JqsݽݝizĮoNf-fq 6bCVUȌᦻ@^|w8̲L4 츩50^bAҒ Gq0!S{ %`qJ޽ ,o4z.%i"ƥe+wIkEC>QīAA`f64$v]ۭ͉D²BRM~n?M(v+z! g4ySIzOn/,IJbsѹ²3硇O<պz{Iǣg0Sq̀N!\!4avU(QEϛ-MM!DB( YVtZ #y]H۶˭],$xPz#QY8nb.?SeoSټ e $%1Y yl2)QqnZuJc^(=1d8ɬ7abxUD8cʯR^Ӝ^Y@U3t_?sU6}k5Dv''΁nͺ(+K)pfmsgWW,3M\ܲ7g5r/,K˲Hrp%}PDCvGmۗD]4iZ-%iJO9fea[<w5-;`mg~/,crh4J1d93fiXA"ʼnutwA6?;L>}f{REi (!{,c&0$*MA"PPQ@DzoKge;;;bР1{s}~k/˂NsƲl[dK=%@N^ԒhIl`5#~CʚcHxO)?s^xY41AlrԺËҗj؎{QKJ~3{t x>j_kqo's)8X@u:&/+mHgt(:61άZi% 5MҬBQI/_!.RhUm$by ! Hԡ3ۇ=VζoնKH$Z`YfJ$זcvȎl`@E4ͭ.w8;с"P(ǓI;nLMvx Q(pQSWZٌ?}?3{~\o7|5Td.7 Yђ?u0<^)*\,НT ٣`o@ wh"j#ʯHu17v1ᥴ=>P}+nXR fDLbo즨 ;Q6@Jmgw%v6c8>Z֟̋X6j՗T4hl%4GeOjMJEnJLVIKRD;6OA3QIF/X&Ka7MXSՠvIkIh俧0diY76s iUCu#W_v(!ҩ!gn~k*8t1t5UCͤ 4I,ˏ+woig:ԤX,{xҚ"MGyc9Z0rsw0ד$a:(Ey`6[˩Eɺ! A|V.I$3' hPI>{>8≲^ͨfY((5PVYYM 7iLu]5%#4mF2[zf_1M_[TU+'56E1h69ie^.\CyiV.oZ"獛nS߸Aӏ f8К[Ԯ4%M@1MJ^ ʠVDO]{v6nQMQfXhMWŝsMǧz {k`-} 5QGO20'?g(0I7)qD5 !PXN e> 3M:O&Mu2FRQ%zYW=UU^ǝ*?P{?vs_3C'SP{[6!SRlWȝeK\& I/5ɸ|*(&aHsAaRŒ0'/lP 0("OUp%p4@p`E@vޡ/ŽUЕ~Y@MBJKM~tPO0 NeYB(HJ8Iţx1 U.\{t< /BNna;?a0Ѩ(܃zM4MZ?o'"w\lc#Eƚ74MQ5*}C} ɫ) [\Ei^|Ō so Q`&տ=L/yhoW@Y>oSu]}g˽ F[>:s[~pA Ntf}qa1`?{b8x.X@^1p 6c+E>f}yQW(3v#vϧ.\wۥoJ(=TJom~_J1ilUWpbKK޽khx,bWy|`b6~-sv 8c]׮ =fW벩TҐz *?|4[",V"5D"pB᱅18辗^W^ug6%o{of\޼Ŕ?i7lP|r꣟m@i].{+}_Y;o~?;UKYUR*:o4V9n`03Rԧ#u`ewS'!f}ijWW~OI2%#tTŌoyt}Y閿Gn$O_a縗}/. XDξT˳ "O ye/_1mZR%VJ RTN1smHvg2.,T*Y5_ H{k=3/ҎS f̞OKa?u]8s P R&NL9iX2MrY4n{2i?$ޤ{fp5)Oh:T,xS (W `bf<@@*OC`+3& +a!mMNUz0G]^zGӻ?l4g֞QwHW%忴wLvyyJR/,D*V#͖Χ14 (%Y%H(DV !-=xZz./w9ׅ R:ݽ&M'"ܺjVtNq/{6Hc\v L[ƌLQ#-]1| 1%qBX͖92WSB_M@40jjNk:!dddp\T})0k񇟨8J**e{G8*FCd })"SfX2Mwtzɘ9/ԇGUkk|s]D9q阙|2[]scA:7ŵ7a% CYlsۡ:"UUdA u_Y]M@p\)DQEvǓ-|hgӌ.Fx#C]>}ЧM:_`Bo#147ϪT `l)t|F+#7ضOuE|v1=c0X t iEv#4;ʴk6|e}wMeoӐCnG^sDZzcIk~ px:HY]w:SBk5n?U<-!ݥ@]0s;FasnzpT'6gW9(sR|ʥ^zМJv01vVA35fgɓ󡇨FV09 BeB~?IKp0#Qi''me.!#lIw7&hbR-ΝۗZXuJOXxXK/\ S Z-Hhţ=+}:8qK)ɯJɦ)),T7F:haNgNNNBv7Z,e4qf!۱cG굘XDjYl( ]B~߾&i` 4Uon^faKM,=*)*8{u!&ܣ3cwutmx;V*e%l?vٽ۩ǢmBWƺky^Q˲VDjQeBhXBQÅ{=Ҩcic݅a*z)dCŋ@nDu4(0Mڊ*6D (@!.&  eutՋ*F<[nie1 CN5 qINB)I$;*s Pv;몪jМeYebUUe<9 /2jx}`94Z)0O#߷7[W-'},t:cnْs2HUa9p|cDujwcsu!,/z/W(TX@cGuE;oVa{N@mz|Τӧw ~Oyٻ_y1C6ۛH7Wp耉zc/}U ]{:[܎+Q"nԔDŔ? 4"m!==znWC9{M &<>st7҆cpR@Q5q@_2 òLv( v C;46vddy<hg1@&/Gq986Kq:7HLwZ.]41I;p@$_DeYAp8I7|x\E> k/ZfYׅ1Ԇ3}f<Ƒ࿦nD&%\~MiWܝv'ޘ9- <;4h]S4q&xiFyrxO-hK{`N;1ߥJ}jl3-Pc6`qfP߸'o`4Q=Llcvj(83 xxUUQBXj٬ Mv\t돩t?ip[ȿ,f}*/:AY #GkG_}MCG??T[ in@eУ+ oY1`sfd{"=5(ōpJ,54 @RT1ci9_׮gϞJ37:^-v_= _VA+ {ocBidI&*YrW~=0 (wksP踻(I'c]ݻ`vvoXYK 22I?:824 Ls'Z?u4 &|Fgd.pYp,Lq\QdeƐ]NcQi&Àgqryt4J6ʝ ˂*1{% xdM-OjSzzzI=ŌpNgX{OeYew+Ipi-W1i8/OEV8+ʼdp;fgevh9pYCvo [#sp`T'?8wUXب;v!O#7!nCќx2} /e@PGbGp+O3E9mvӗXwZ-s_ns߸TzqJ{ey+aȹUGƾ^cn3-A~$WB(xIKRj`(hfamv !Rv͢IemKr&Mn"[.9LWWV&2xNvBjJj Ƅ `r@CJehݺ'o `ˆJmyh"aDad(Oܶ~ZG2h?5*1yrG Z]鑪+b=~I`}O,o=ZuMb&Űv1Yڷo`]>19q^Ff%E1* `tg}8Mټ^op;1ݾ0GXf=-ӯz>ހӠQi:U5oNn ozBE_&Y<$cp(ix<Q1ƣ/釱IHFzb}W)Xs*uti5cc)H+_{iPˮ^ s֍ s';-Mb -Xe졓gL?5z>bOpsM-=V7 Мktz??Ԡj{s|ӅHwC']3E&m 7N8֭ؽz K5* grlٞ6'x g/5,vXmgIޤmk7!i}kh67TrR}رA5(r=*t=LH); , `=7 "qn†$ts4hDG`E'ILҪ, ڄ( '=s~z>|r.^PfC 2.ؿܝńu{=u8\Kß|aA )j/%agP>_XY-bYn]-~^9ƢS;Hӟnt\cج4xl^{;^=o_pC+<87 @lXY Ȟ5~R?4cªOwm8n7s_6~4B9]GqBJ7g:u.!D/\k$ûgYax\6cx6\0vo1)_|mh?gj ZKܰTV^{y0To4x{t$y4νyJ˂ϽqON]i8+_~YW\;֘۟]ZqbbvmρѪ7!w{QU=оMzr^^砛MvP?8io"7b,zeiOs r~û%629(2}RzhP,s6߸ّCvlszy}dqfz2n Իwot ނV{ G/H=T( ոG첆bF~,B㯙 ÈN~͟u5-}0(H)68B45(!gg׭kp [\[ @I7/jmgΨ8rss[Xr x/jb<ݑC;U+pnכM.!iAAQyQrӂV&.XŠZKpuuu$QUcl233|sNS& #GTUE ^WP:-tF_φJKKc8eQSRŦv{nnn"'4Ƴ:է/g hMD(t}ݱrqNNNLp7Xdgmm(^i Շ`!PCUUUXr\G~~(r*n"}0o::Ѩ$InpQDIzNNNn»L3o-8\FeY6M;Xx|>_aB,|,q^ Uʲ"6cCk&JSj(@{ۭe53u]5eXvLAU?z뫫y22ꪦh['['?ίmG~A Ѩ((fu8;(;qh8P!̹{ z؉*"PD:vz1GOd)Z5~Q|&a0~^p3y҄2]G[~.'K'Y$SbK#7=XrչpǾ6~aD>p]!|ytFFV KKW@=>pՏ<顆 /ki`0H,#|MNP-VuUG(sڄtT=cƏ Ornt;~Wݞ!z|j1K?O_8#9?\؆[nTnD;cfj'N J)&Y&Z2ucL:?cz/v|ǍF8[Yy"_$uFа|LRL"xOG>-GǹkN(6NT?7AF"hETEI,$Brl6p88Kʆ[+B@r\َl R 4ME-T[']C%ё9_BP(~hG_fs\5) IDAT! >VV H"(Ts٘Fjhބ- !DJ>HMxy:Z퀖9"3 Ih{J6OZYvR]WؐƸeDQTUպe6ʹ9Ρ1aVϮf`Ly]i%eY+ zZlv+5r3; X%7`2Z<#Ыԇ4ESn%.G( BH$%o=[yIu[42{/.W޼e<{7ojnr -n4ϛӟl§yb ܾ}Ťী8B!]"q&s0Ʈ_7:uRҥ>V4L͚ۛal6Ns(P$&FTjfxt(HM!`ba^ܚ/ReX/kl+y :<'l6[/[м& ѯ 'rɬ&fWM~X,w;F8,*JNäREQj5q(|xí(萙Ȟ#bEWNgil,!*D˂e555Lq͉b3է!BzN"[2/7>J 'aad#jk]?NJs8!pD"^lՃCIшZ%SfiJZ{%+q8^yKr2<^uD:I7 Ka)*ERgՍ&f.Ahg@Z-@ a@k0ch40n%1 }o$Zy OR9)(O'Bw=#G:"i2d(-b(yh}mPɮ|>Ǔ+,,@<Nj찕u*0^דqx< XeV 9 S44Me9 lV}$ ۂ$!6:v!_D&=浘 t T Ò$Yv={GYfFp<ufyn'RBӚ*3ij7-EEQq^;\oZ`|nm551!i56w֢Eb7ft%$VUW[qB4M@3a6;0KR[xH/GƦZN {",B(n^Pzpv3,kw8g*sZ-.q vcӄdVgLڤ($& c(ler՟Rь CѴIB8ә; j@f.E$(dgT0M1Wi5v2o.P:"hPpmsJomiM׭%pdETDuXCӸ_X%)OB8hMfkx2T,,\TƤ]X? tJp>t&}mL-mݞUe^(ûK!*R>.98 Xu*4 $uNisrM;(J(/>ɂ9wHh4ɉHlliU̬03 CVUUu Mm _]vgGzGeb, 6Og`!a UUո SZ$%NY늢膡IPِm` 6E0(XƘ$I]lUĞA_C֍(ZOT%-DyrqdbȌx-0gǢMT5MQNlkfR+^-Qe59DR"9(qWؖh5dґ]tNۓv)g骫ġUIa&eWtO)aЯk~Rm+:NM4$3v(B(!0I[28zhxwI&+cz8Yt mm[fu9(԰u#:~ gNȌtr~I+KZ9 (2iyZUIH4 Ăƥbb}Ap: ]htf35M%@P;]S*`gB u$QRU ׫Y%Qm5N'aLѐb4tEBj%a%X0Lj>BTI-@Ozf𨱌 66,+EKL2#i cMMTd[ǎN- vw}XQJLI4UQ|k ʲh=ǙƥYD"a`E|mbxY5JMGԘoM YYmsrTB Sw:"\F?:';-'WTE-/+ĵ)&;4a*뺮"/aOGtIE((?DM4BRlؖXt.U0LF +@UpȌMUhB?u=ʊLL3unmGQS"N#xJy1[\)Pah^F#QYuMOF 0M0 ]R)"lsF/ۇ9ILv{(957E`)L14clL!䊸Xa"[je0]L f¦aErBJ :2@ѱH$b"ZuZ;-0AFv:Gc1EQĞ "8g'cz,u=/ NKl!e϶_ jV"QNz+#M呅 ku~1.Am: ۶m`?mO_Hھ^$a[Beg/aڇ "H+(0R`Nxe)+%Rh3gi(c~g(,k5! g*TUU5I²i6Ax=F0RO xM\SQMUU о.MSV]9HOOVjG>8drX[fQu&Ȳ&VoDBtMd9 F,[Sp[bϵs٣vv]DP_'q>MlLMn\d2~֝#b=ퟟȥ1EӹC,bD)@`qlVv)hݰb|<H(N+~P86"\©=(t.k!6s 1]GdYu=kCXa7Vccb[ PUX .v@3-Βjc5pXViAzrZWϫnm~CP8D(ijmYOݤ.•UbL:^/Ǜb&M*?—Ld&w kcj]MQh,íhh4efb@8,F*ױAY!Cw7԰<j**+ Ok*ɲ b `4\U.{= )Ib ]4蒦Et0hv]™$I,I0 ed 4MMh@g洠k sc@OOOS|'wz"%d;[6jyl?pDI}[kȡk+ڿ+t`{YuE%QbYק3G!55բ(ZwQT{7unv+B"U( VĎzWD/ (DD@JK l$M}Ι3gΜy\"]5GKO*HANQdCQ A:J ̳24F/?7zIh &"8{+|;W/uuuuu5mCr@4RU+*\Թf4z=N:á NqvwʯoUJo tAw NζZ]DȲ(2B*@M-K= Ӵ"JCT@˳)epq!EUE¼zJ2[]' ?QEQHl(*8^2T4: {.dh MFR{LE|HfbfP} LOQeVy!"q/XliEeT$^ F?VF *5tb2ՕnSJ!;z lx bҾDKO O4yt`R EY9 `Yjv/WS0" aV$2ܜQn:D˼|:.,&mB2bV˅5zzmɄ5ޱv3!JB|=}0P $Iµw1#ǭ](Ҁ6O4m\3&ʋ@@ q`Zb#aӮꁄp^[է@NX,KE6r ȣdbYV+0SfYY+hLIƒ"HDdxW)eawp57wdO̲(vemP2hfD`,Be\9_](,{|"=d~롪65M{O' n:$$(GGa[_ʡbKAvG#2G 遆n/)7F"jվ d|~-d> ]lV :3IzjU0U#N=hJ|Z{ [9ײ.&Od&^TF_tsѷܜ5ҤM&k\12 u锁ª_i-p59AY,bg A$I*q\K5 B'XV3U8j(t X1`UUɤ aDIMB![^oXC<)u|,3\-|PrPKg,Sv쉍ZbI$cY3zad 9ZdLStG GdjO /mϙ}6>`oZKS~,ؽg{ K;ݥ4e;:œ0%uU8^yڞ+2^q襭eĮ㗮ԷsQ4_F~_:9;0{Dqn c}S9Vˬ[E˴nl2?6˸pd*^L`Lf(˗d 10b;Tm?fd{X/n2VGh#͵#j=^N Wbd{=(`4Sl2p"I@}sD m៸$ʠҟ(2M3 Z!1r#\KIk>Ef}᣾_~veYyGm-,#">sx$-`w#Oû*} M*B'^qxa[*C/ >{o%]Kʾ,ˋh |/&7M4/ 8\2IտLb/Y}!7=_;3.XҠr_>m)!OFSάE ʚ̫+6wHb̿qOmio1>ǷxzB,jՖvCtj`uQO,ͫh!pߏC.n]+LYv|cf<h# jQgf/!1;t@3?Nn'IJnM̗`ו;׾m=Ie x7u0jĬ>~؄cC*ϐ&Gw p36՜;6..#µi@°Iρ pr<+ IDAT2R HI=%L(tnfVPm9MI gIKpA]HiGH7*Ԕ)da>9tw=hL@D[?|L/+8u[7l>X͌u++.,@(6,Zך2#tN _5rk+0 x Bl|)HTcTR__9Z6wrEqCɫ{d5suPݼOμuβÖ4wX~q7 P㒵sP \{82üv@$KS{svxFq|廌$ts7rE<lj$߂Ԭ\";m! 4t>ZꍇJYQ;|s.NY l ME((, 9=זIzP vώ_,\ /Yw~C/i(E4L}\Vl.1yiL&S#򣥑Aӷ.8%[|*=ӵjJmp/I75t pz=?xh5,?%)術&>'a#B^+픂rD ^$Iu~J#!&T\4P(l6KE:֨(=X}d^;y'#D.9y~\ֈ~Gf4LnAn?WZyb laYnWlٰI fڌE!@qyzh4f CǶ~ǿ~/_{ueDưKI?Oȱt\:^Rxe;h*M'Oڝwf>"2zzåJ~xiik[nӢ"jy@AA>(Fsh+XWҸ$ȕA&&"~TDP 3CPtǤ^JžG+h w}\TϜ^(޲t2tCb,̠c:8zآ2mpwe/}q_&~],?k:^F [\ھ'7v\Yܵpz1.o|VclitScD=۷xwb^^?*TV{m7k≏|'+o ,lPB[ a;gf!ftt@UdPD c#me].$@;"CTG*dسh:\EOǵ@ @X#"t~jݥL]-dn_@^5ro2,6bMR"ٻD̲KjxT1}Hl1I ?%B )-<}U\!mMr-Tdʮ/|mB]@iHZ1hqt8fJJJXUqbUUU )S 'HV5]&n=l]Y6}}6O'_זGAH9Dr_ N8O ,B=. 2b1!AQbZM&N·>(HA[N;;sI.3JJw\PU&$IҚ po[:-m9E/yw㻢(OP7$} Рco;B|(}>!I WQq ӊC)hDɭcM&$R&7N^Oc[UUUocN1_\}b$! cH8%^;t :,(ftCw]/8ČtF@ß,56xTI͏lMZ}կn6/v.G; w<.f~[2:/24P+Ж-"$rW>Z{2]M5/"/DȠZy%1lo^-E`>6aOg  I1@U@<\3>Q>`OA};pɴI:1-;\}K(vUw8­ɋPQ1 W X/n4m6qQHP*(6K\`}]K(ٌ^ƲEe6H~ee'im? ˲Z^N ֨cIt? g+޼ӆahV1!H>3i]Ht_皝mv՝s#9\avW+X$y 9j ƽxǣU̲,0Oi2@\.nЈUU5t6!$:VvLQ*RWm5Qm'UUU8W1[FYjice$^W(JxKGvm/zUm~׮?b=`hPߒ`GbZ's@Xl5|tqQ᡿g]*=4}Oaϡԃ肊(GhA@imy%6͕KȗH* Q;Pe/ o)CDXMtmUQ*2HH eۡP./;> G[*`-%Z:pq 4gpӿ(}ʀQӻ-ӳv`r܅:Dʭs|!mVcP'q篭GSy`i}`Wo{r:E 'LD͠ʊJۍShP̏'{?TM;P%#_vAPX9T4,kSBAPË/Pa0,{ZL<{McBk+ ^~! O\{1O÷EKy>@Ȳ(gϴ=wvڗ AU-wAAl|@@:Ƴ)jsarBj}-󶼉W@p'_FKG@:>5JNP=ӕj %eQ1Va+9YOJs,.aM|b݁``QCC%%%a674VQpenijH7;vyRE4M3 CHMZfujiuuUTL'3S/t3!mvaL&S\m"/7;9].\U$IIVLrIk:V]Il*duЙ>ɜԝ80 aH B11/iz e̮wAֲG~Z8æ}ρs8Q x0/qcvmoP<(Vv֙I*"dWRXa *'P$BnMQBjSK"XTF:,oLf0Aye7-Uv7e$HS W|8)EQ^|;uaRQ1Z}4(w072D$xU<]/zBhs55A{- ysʰXUUO;T^. kgk*mPEEEn{1i`L'Gf<ЇUխ[ |jK~m/~f_fCZ3HRPG hdR~x'thO8D$Nd8*AR&"N+G z{+wT&eXRz؋nּRg=4|Œm< YcKFk e$jڊݑʚMD|^ؤXomI_,7>5{y}EC%u\3TCMh NpbٖbTiorfl!NUFTxxjkkq)7o]{ㇿg$ KpHp$%>*-lBT=3,mw X,@Ӵ'uq'ky4'_ "E_͸{K>xƑ1hDܜ; t5/}Чzim%y\ݫ|mdm^?*_vIO׼;cꎗ^_ۘz6Ⱦ,:q؆_{ ~[Gy?ot=8VG`|n据^ khiJ7a-KY7R=ۼu? ÕaS%jü>~au!b9n6c;z!o/fX8Ź'6w&h)Aȍ7Ǐ\6-Zц[577aI_W\-zܰF!Dt7'"‰?3N<,c 7?񻭕jnL8cmE$y|>籫)ɏԑkS+vUEZwsZUB5إ]$z߾ө'X)29歺59螡]rcQv$hW^PQQVJz\'V6-55_e?bOG 2 UUMLL<l,ư%]nrNS}C~ AY-C76Pz͖aeb>x!IUQeYR=5TK ;-I/)//w:@@+N}oWtbu+љ*.˯x<8(BPdG͖6o0+\7N[Ea1cjU{ d7ԐS8vNkT[z1L)(xq 'cMLLޡe(;UruIYeA))I_%AWp=\\\:5ROɤ'vWw-|QVNSe)rE}+(wfɌpbn'}/5RVKKKT5fyrƲR.+\(u+++k* &U#Yu8pB]]]лZYxW/Ш'{g ~mOvYTwƼ#Ĺ  Ku9g"Cbb"?'ΗNgqnɖ&>=Awa0|YE?3 #",ɟpVy9ÚR)V_. !fV󚒥%/_jQ(^7}F$I C(J |NyLd)1q_ÑAf% ~*gÃ"-{ BS6N :N9:QEGܑTMLjda,,$ kɲ>,MaI$$5,j8tRE^A&mJBg_{N9;xB !BQ:/ "P|wj  yrwy]-dnK؄S*qd? ʫ""ed - j q4-rxGR$kQr8)]z|lnA213:5:7JA$,yEeso~c7<-e'-Վ@0 +̧nڜb*ӏཙ']0HCs?>}^%;[V7Jҳ{u7EF_&2;zK{3KA "t[d F'fpeP5`|WUUNg1[OCF?gSRp03&2ekB( B`0 my`EQI5I[[]CL+)\x86LdBU!d ajj2_\Ǥ1 $6AQT ;~L@I=#A$ fBW UU$) ?Jw|m8%f%|ʐݏ::$SR~S>n AǓ94 b~O竪 cSpDz,}@o;=tm A}ܜfwR 4 $ 0ȵMHy Y#pC:r?* 4V" !\4a;12#E \4^=λX^G 嶤'ݴ"_nl@5 tn jD꪿>c̿E1 el! @+U]]1 gK(~qq4M#*<%ZDL 5/fm ʲ,I.S`yvl$44wp ޫe6nBZ~~S:ff3ℴ[͈ SSo>/\ $I?:֥A@;rTx#&ؤpvbbl&B$z^j8NK\pWk F˪t4O^-/q܎Uۼy~?4!;MvrY,aB~ Z&Qq(1D4T~6 46G?d"Be+|M[ IDAT޾cdw5<^)L&odcYVUU=O. T3[P dd!d]VUĚZMkݵDžρƁ WvLx1$ $a%H+IHJ_EGAi cx^sA >}%ųrύ="O WtR!_5vz-^sĪMI!aZB¾R`TRN%I !ۺBD,UU9>W[U| ADQ&ZgF zu:NcYeYJOa@b e5<t:$qPkoV.ESIH @@#Q+hd$ pHo1"_#ykϢD^~$I&7;&\`0\.aÙL|w=0$I ԫ=OYiMӦLWw e2Ny<^bj*4LHݝUjUUirr  ].׉PG$F!˲y(Ǵ4m0lm|Gt:'if "hT75hY",@0.TP*K4M4:YA9/uzX$Fi`A@ t:=[=%?h(JjWuuZINm6^'Ic2g,t:`4 (nCUF}X,111vb`8&y<ޗ-7s}d5d4Myxl[Uk' +BӜNTը=wԲMM\$IeYݞf7)% pUUUNnXvid2XVN=x7+Z, ł]EŴ$g nT&\g9f ,8c"1½>p(!ְjQ |b(1PیO1%IAS⺪*{YЌ^xyLnm1^3??SW_-ĎswY7" ߎ6uQr|xЗHjꎺ/:S{/PuWu&5C =ԦkslUWkRʾzemd_us5+=0 aǹ_'5+ ǩo_7'^UӔ/d+2E?@C۴!V7옏GdR遆n/)7FPDoBzkk{Ms 8y23CVKf{mUzgUN:KyX +Cr PX>"YTSߓdH Uz\neXnci iTtqGt{ivXo`Ԫ7O6|n[A~5 M}ƒhAA &!c TB⟷;WSH @.TTS2?eo8=~EMbr20sƖ:;xz/JޤCmƪ1/e[UI;TENI?)Ղ?+铃td`l{U]=!,5= &4Y~/-4m}[KoF|nޣ8ӧ{GV$E2JHI8/ 8pGk)7=VIJal2|^(&JzRfH@|&B ^`2@Y^>x&kD׋z1OEƪb߻ (Z9҇ gcZ8cW?"_;q㟾q+v 宸v78H_3o+cu.zWZ=НRi7}9qQj7^`c$BάE b)m-8$Xn=z]P_Lԅ/4?{s{Z|tM/7M >sE/ !wtɷ z~Iӑ7&^3YQ9c[g}e7=ffS+#" h}!N$uU,Jߠ+͠{<[P_-t(?p ٟ2o졎hϘ\FQ3!;ޟ e);Qp%lH\4<L'@NhOԤ/zc 7myoBdNs߲Wj4@7ۯlB"f_yo}uO(mNo1<|:ICNOcnu# ZTlo2 J_x"~t kuGv89vJz#3&gHf%2bgDݯs'H&_sjݲ%G^^ݰ`AŋVl-1t5{.+hl:Y3]@?lSs6-~8dǾZ0q[>MCp)HJ0aԄTMHH(.bիWx4Ie0yϽo6w`ߛX f]Ҡ럞$Ypu_\n ÚիWZr&z1֗4gDü_kjDmI![Ì]Ƿs7oi_݊ vyn0+ru_ꖕQ}$1'5̫^,ԞoP%?“O鯼vQq [40-~d:GמjY@~u#"Mh@O+٢KK^+T4 ˁ>^9`xξ,jɁJW$?(H}m|e@}#PG嵿@nYV/4ӉSfQo E@WY2Dz@'z]( 0E$T-T-{Pg>p,)5$* O/IJ< P׋yQ`Z5 p;Q1Q'(p} 4R)f7[k٦bBh*  ݡheRA왿dEܽS -[W+ik0ƏSm'߽4t_99]_=|zgvѥfrطfoH{KO di 㛾3{Nx(~rǟ5c 'uyၾ}<~׏fwo:?0Qs?ֆStT>uON3!$d5ʮsPQP '?r籂lک3_^1@zYˊ A]:8zآ2mpwe/}q@? =&`~eHLoWppolr&p: >G|U]G^-Pz̅uǾ9{ٞ>vL#?doyvqdahO;|c@Og} C \o#KGDph _/U_kJ4 J"b0`Be"WR fBه}مE# F.`VQt'LMB lCyS lW`cWwJ |o/n/+EeVl.ZmBQE#gtBdGg+8h^KKI2TNHHMrfO{"Fi[1k*T dzUc;p 4Rg˗}}}q/ *ϑ{w|[OOE`h/-'Xu 0w @u@?f0]_fk+VQSF`ɝ3^W%s\ ,ibeZ)PUAۖVWf.p$4QŒiō̰s 7"lHd,aQ%~x@LǦ J@_r WKرph۫?EYG<pr Y6V`z#K/ rcFnnGOY0h!I_#,LBjkvċy4tb I)f<5Co.ˡ/7bqR2H^4}|z߻w޽{sNu1e9lNluZoyk_AF{͹ƽƽ?yv0k+ݯL=}=[3!߽ˬ!BbbjyڥⲝvY?m} @'-B/bQ`r!@Ze~-,NA,,rt @/PU_1 @}3@] v}0Ɇ9lҗT `_E$sYxk8k¹cqC;*.BoӬYs$l)VӴf@'̚1v?y]WM:r p1% i/RΡXqk3R-JkD>˺ 껹|VX3l@a߿XCۀv=nHFn >2oFSJM7ZL^ј$1AUdpѭD98-tq};#ܾV)/S+6C5gL? ʼn~ٸqwSyd (d/^9y]TW勊Rud6F{@]%ܪ&Gl}w< bf_*7BOUz lU( V_h^4ogRnɌO+kߋ0*"i|fbH^1 .=?'[Յe$Ͳ%Ef9ɶ㨚%5Uz3=Ro.[U&ڗ<DZ."ɧ8XIVY(8y[R]qgNUzVE8JۤT 5pҚHG6ޑ.|HFsig?V˵oLJi83h2R2 =:0{pU ]/*'mz/kTD=}{5[8҇?9do iF<4so/xƽu8YO}y;0Nwۣυn0^K!)I Mjj/G̉NYoSAͺ@Xgzk^&eSKv:>mG=˶sr۵Ձm;> Ywo䋗M` W3%C珕 \bkG4%unI8"Zt0ܷb9O*jsq2iaOQ>q Q}>  k3J=tl"u#M-VZzҜK?I#f@ Xy+9g%9Y3Ĝzz=1m2h_WY!yŃ\`Qdk ^M [|(ig.o&4a2~uml:نēybyzrOQ3yqPdR{CK\;r'YCykߦG[rdr]A.XO=4qB;LlĬi*Jٻ㎙=AӁS~…i,f.={`viRB"`n&&6d?7Nˆ߶lCM;zh<8_~v@8Y^:vĬ1SHns.8pdRf4ڠU.YyT+ܲ:~+p?j{ylA"97ᩜ\=]g~( C#~eJׄ IDAT<@u%]\׎ԌRx P ӣgso1v{[PP`^^^aoo`s1 6I(T1 K,6h'fIRCrZտ*'RV1UBxIJzfWW$ʟO'ysXds6|7]SsF&>@$2+U!'rTjjalZ6{2skx,nƿ!7a<W^jƧ}Q6d D.ϱnol{;׳Rv--qԄf |AN=cc&-c88K!)W`Ducj 8!+)B @ j5( **DTe5\!_`ickc%qX @ _X ]BPW "Z!%@ 8uQWԱxzXkU-& fH[춒zS \lZ6dk &L4S/n齰YARZqhl;w6~m Y¿#/? )+,Wm-10O 8,RFCpy0llIN*[γӖw`ThL@{h,_Ծ[]V6Yk$:۹-O6mZZnt`_'+~^9Hјfu+TFyxN~]TZ*(ճUA!Ig`xb.=ֱ,_0Ir葥&-%΀~"D}Q!z=_kǎ;<`nwTo_8zkґ7R^TqU;UTMԓU(yZ#/yhd$IԏUjbaV۬JZ4[ ^mo!@@vߟ9Պ+s9l yHaџ/7@L#[X8VP_omKLߜei<{d]7ikd C9\Դӗd-L]n ^#k?Tc[*.HTO9Oh_ Bb-@lEtc.Wx/)Lu=Z’[rz{y1G*% [:Ad]qiFobl+'&k;i*b_ѣw~s| >{qV@ɷuR7jAidkLj#}_Lp6`/ PF] ?sgd~h>ovѶSjti͵SO_+o8L_]/jl\T:agmS3 پ mX˲0|ޚXjA_5Qj ws8,׍SdaosK e̱ambQjYX7,Qgv؊Ŀi+ ݻ!LPn0Yg?96HZo>dh J5ɀSRD ;Qd>HX{RxC B-=4sDNu"-l_lI:~v-bC?~_VYGΏMXb-qmFGh}6kF3w̥]rX69ImW˾뇅sT~[5&_ /{i")NcãW@ (Jux#K7P e%CWd1naџ1Z`Rj%N.|Џg YZ<](5$=ڜz.U+ elƱv8`a޸+722uyM mCd=(豾%lpvc)Jܱ&YϧAfKx,"s,d h8}vcMeKʬڵad_>]\/@NfV^~mZiKkl e-QEIJ@Ȝ1SI/v_ݹM0s,o糼GtЩ<5zqEm~ė&n_*/>X+Bg-+k gX9ɀH3&xTI-b]R3fikNFyYX[Yw K2I;|dz<8~=?pƃv8jAMgɥr { <Uץ&ފ󙴦nGOY0h!IYk/tq@J  TiyKlS68l 4:7YZm%0O|תngZpt"RC _dp+\UCJqQ_O Z7ApfKϪ泰4x_;^:"`J<,{K7@Rccހ0k;Kr:UڋTs$Vڼ^:(epkuwsΰJ[u6yaGc:n,,=wn}h?e.yG8/I6` D= 4J%+sܪ`L+o#FSf9E2V"sK+sUQQlئJ) is΁d6 wo$F/5adu.n=䯞/;.HDFր ]-„ՖÚhZ}HlZn*7U,KM+(|#*Gnb^XT[-׾Mwo2)8{wr[ l1d";:6Smե5B_Aa4 JD^}PNhrİ0bq;RBk2ѩPA՛Lҿ8.]űRw$9ea Q'9q@¡Ȥ[ ˗>vNfɚ]S¦>~ZC^cPPx7jĀ#{yPs48,\xlP|ʮMvy<ġKB )YrĪ _^6pŲ:1kۤ܅ ٫Tkٻς~n#0x: f*xܖ_Wcy @bР2sRkx3Zɍ_,;0Q#/  ##׵@-oe%0 ąˡH,K[+v(ThI65U|i kqtuxB+k&*/v%VeR^g٨;~2d HdV'j6 شmn"Xdg/2X[Xry8]mo/?gRF|P*|ȶv|c+h3`<Wj+=wXFVuyh)^7m$Gl |d"VZP;s\J Urmr%ЩzYB5[| fa(?C:)5KY)ZN#f.p 嗋+V3S&\i}_E9JqzBM[p_m.UMۥG _& + *L)~DFk.4w {T/R :̎|f#5^ڵ] wwp TŋTE"O+vˤCBYl6bp Bi:'JGG`| a!zNսZXYp&B%SJ]Е\fs̱"~u͞OOu?|:,)VO B j(TG,&((Lu9 E\#لh&u xQEF֘ƪrU![!Ҙ;_,yVIn@ 8Uq\Ŷk~X= @ 3G&@ @ @ @ @ @ 0G_Q߉okQU=@ D (ǀ3- a;.G1wJ&s9jZ v Յ92d3@ @|moY-l@ƽ"%v}UM C*w`;_Kw7KnRsH9zV- }o\ KONy@LV@wUCBWd ?/;W}jC:X;YГN3G4p\' ŖMdӺ{ |4Ƭsj}(zN-p\)˧[C=I nfQwM4J@^ #؞_mNM[w=#Ky\Ӓp<]c 'mNMۜpMoĠq - چz~/6Q xc}EGwpT G Q|m;jã/ `]!F7IZ; Bm̘O%]H~u_X%1YEQ%NJXoY@If.ʎPHoxZg{OP+s=|Lo?pBZc_d xg,gE/r; !W )0!@.I&460}n.@"[ߝxT*wY`uy昺a+lLecR>ݙ*]r?btmZ 6VDzH[A?-wu/{(*Np(|D5КGt;W?>޽{bY֭Kׯ4*ܪ(yyy@FF.o*WoxERJ IDATpyOTFAӕY3')Yuw*o0lU;dNL׳ΘckMWq)uv޸"a @L&3}H$2ˁ 0R @|O+__ .P}uzSA_uСw 4 I200ʕ+`TDZZZ~"$Hzzr2*PX[[l)22cAAAYW@@bqǎz}>|bޭ_~͚5T,Ҳ[eee}JNN/pO8pBDRޔڵkٳuօ9pNWBDhhh_|w#G(Jʰ.\ҥNyfHHŋ 0A7nׯ?sʕ7nhZ&\.7>>rC:W/1`z۷-CI$ɨm۶]tW:ėnwʳ!jՂc#0Գea7}eWQiqoӆous VP8TCSX~k3LJs_`T3?drwwwwwoҤI&M5kVV"x{{gffk'OR9sfXXQNo??gV&Nx&hz\w.]ڲeKf 7ޱcnj34 A85ܭ[0{O+ZZ;;;1aJRmL tB 5jԨQ/޽{7sH4hРuT,CT%ݺuM_k׮AAA  [jl6w999Wa`buʔ)SLH$aC!aP5lٲeҤI';o9rT*0 [[͛SwѩS/6n8&TviZ_:oou~T}nnٳge98ó\Q Zzyҭ38Q1xI^ ^cQ ||C(?@TF蒲06iӦۻsϜ9ӹsg^oB Uc:zTu!&M4oǧC52]I``;w\9`m6J͛7g|1ӦMcZÇGҮA-=Drgʔ)B͛:XZr>}43ʴ^ wwwWWW;wd23ü9%چcƌﯿ*Z̙3={ڵ@PbhN8Q,=a:~{0l͞=Ξ=;eB@Œ<Ǫb=W~װ_"L˪BoЯ9@TE䁱~]4o޼iӦY&EGG+>~x5ScL۸q+WTٳgRC,_r׮]ׯÇQn^z><::)]VZÇg~>r={ܿߜu( 05k]C5zhsBe/;`왁̃= 3*z viĉof˗/Ϛ9s&]aI$VK?1{СCzfIzDopȑmۚPEGGGFFFFF޺uKQfyQ;;;栯AXErxMG ݤsΝ={͛AD"tٳ-m9ŋ۷o=e˖-+DT0=WjswM-211~LW2}t۷SBp瑑ĥ0\?ijJ& .Sr̅#sussܹAQDD۷)߲QF:tۇaD"y==3 H~>u! TF١MjdSnb*ׯ_4//I&^b*Js5z1eiCtRXgllt߿OEdff6k֌Zɬ͛acM8AS^g:T|>Ȑl|>ҥKڵ,L)IO>%l֭)]f?^~}hĉ/^4xFBRn̘1tccc#""X,8e]4)4huYfQ7R6HpB(//رc1Ç~͞={\VbYڌ}urrrJaa!蠾&F9Z O2CzJiӨ 7LQQQXXaYƍ۳g݇řLLRozz>1@ *ի׿J0ϟT* &&&66V,d20`'hya +0堥UÆ rVєMSVt:f{ԩf͚|ٳgϞ=o۶-wRTAΣiO81""~.u9r$-Z7Siat钕E9cj`|Z&$$_dE<^?|b燄0K7((ٳg'٨@=ŋ3UڵkJ%ff\=ziL8p޽{w={y8ŋLc2Vv횐`dȑar\١Φ3i޽R94sIjj` zLo"8zjc޼yӵkׂN;r bȐ!V*[@d8yW_}aB􇁼0?*@V8PN[96mj*jȶZjr|}}ϟ?_uawڵiiiIEQq %ژWM؇j'hQХA :ٳg:nڴiOf$6,;uѢŋ/^:cǎ)))Օ\8~4ir޽E#A>|?~|ڴiߧg֬YˈZ ȩSΌ3Ocqppqq=ztJJ QߢEX01굚(iiic`)S0?c~zѳJڱcv@(6n4 ]Jz\nz:Ǐ 7@ ̕#PjH"„}eo0ӧR'ۗ;eiذ!5oh/_bclyc̑r իG !%ӧO_t!C.xt7oL+lDwߑ$?m۶6,''$ɟ~i|LFuW;Fجvv1'`TJjyN#"!!w[}Qx`ee5|j#sI#b\ | JimעEpG8~=ӵ+J[hAEUf$I6o~>j-r5  6XYYQE!!!>>>|My_-ep/֫Wo޽ -_ hǎMvMpcjՊ>ʕ+ځ0 矓so`bYj5.6mb^%55x]tjo߾m)R-C\.D,5%baa1a„Joa&F$;LDornW J i9 D찇Vˁo_߭[+y,UUA_Wz¾t7۩:d{v=o2~VtL޴4$kBy^ȏ\0׻ x/z5Vv+GI<2;wu/MKS=F wU`7퇀f8zMA֛gGWY ?mܹϕ+iAeiWvtmgҥ .jPxu:׸5UϹ U+WnR+5뵼gK,ѣ-",XSH^[lRh|:NS Z}QF9zT*6dp͛79[f&A3'.(;j*,eX{{-[0Z6dƌLJJ"IR$]zlٞ[ASpӞ Pj0I:u͒!H%"[ne&Hj߾=k1/pb1822rT+(' @BXbŶm(7\Ç3nnnmڴiԨ^{.fRtL5<?.E^x >|Qҟ4kY9-ΐ;`S?LuЋ A z V$"G/%H+EFd_ɔgGA)'45-ҨwWg ڍ;wեG^k=Scm4vm! _qa*4fƢ~Y=nO&< s ѽ,[ 7I=z($c'ئ0&Ypv[UEK5t:Օc,Pw@jGDp{*%''ܹTNtbbbl6 a C,KRe0aQM9n8s(ʱl{L jѫk 3J^0R6r~qK˘j~8o8ՍM'5#jEg^/ujLzܑo)Hq[<ʄX 4ү`>KW*sjDu:zwHª7_GbR6X9pml6 3~$IQm?{yԺgs: 0Ml;L3x`N:FGI6lX~~>0cH\n@@R(R(C?f@2ڵktQ{\ZY㏟ðu֕aR_-o :h޹s'A/111gΜ1nT{Ih֯_ӕJ@ E*… BVPNr-X|s !8. h+XřM_࢈  ᠻa+;xFm祣g}߻= ~uKgW2ݙr О٘8P˻ VeđS=#<@Uc!Dq|v" 6RDf.@ڙ}e{7weC4ګFp2xEw>Xܜ]a;e皘`OT6ɏ9燳jH=;k͸KNǻ]OwăG63)E" nU{{]'g7Wܗ7쌶 "l**7#.S,]:Yz~{C 5LL}+Qg7.ftvӶ !`CwD-7jʀOMMjٲx _ `.UT*%{Za,' NIIIG-v={zzbP%)% ,٠KԙeE*=E#J&Sϊk#$4_Fm^H/e=rv˭ɓ'Olnzŋcj4jǎXz5x):tdSNݸJ"j͙xݻwyos83ƘY BCCM8ǎ JTj˼<^Q(?cPPPӦM###{֎?\`qF&MܹSn+VcMj|^bx}ĉnjX,R9nܸZFbt3`C'P6No޼iӦMY=M?=1Ξ=錺K.z& 5hI@5:ߚ5ɲJ߶sٶd%T{ڰ@ୠԿdY9u=ؓ\ REj ,.ZH3S_7% Q?/$j]m:z{y1P$bhkRdK֙U(u7>\=\>vhak/fƻoNؽVw ?xYհGo6&ZpjfpqؐO7^Q=)5A0%Ѷ1O^]Gcw.}敨^8(.F d\]D ߀b~]_^:ru}{gf;>o@K:Jz;7\Xk}9p7o17dyiIK®(;mA;ᇽЍ< CFu^͢E݁G5P{Jjyum+mvĊ!B%?wxwv%Ci(j޽;s9[o9/S[¶Ikw„w/%{J6Hz5m Uci6zL+vޗbg鮅r#]*S+}rqooʩ0:.5P?@mtUXXȔMTF0 .]$Ʉ Cڙׯ_*]˗)W98~;v\|9** ?L7xΜ9T,XЬY3\>v1ct֭<щaZ>u֭[Ν{Az?::ҥKT٭!poӦMhhʕ+)̬Z+KqFV۸q㔔f®\{첵7sefbs OVY~,뫯CeGejtfn% LAjذ!6 3j"I\РAUVQ{ޙl&!vf BO *ubԄQԣZ5wȘ~Lg%wL{ xKnRsH9zV- }o Vyێ^  )?Y@NVt) 84XW:F=aQPfvܿ'/8m:  }f)/ +t:=a~@퇼Hԩr9vsNjF>NB&M6F=6/ P] IDATo?vz,֜ZvȤzo~fL>8$hϡwGqyf6,2"Jw9.:^,'+^Bk -OK~p]˦ hImyvlHƾ<dZn(Z[X}qÃ]G%: ]?}^+ >޼$U:9I%IU"FU٭}+dm۶1bs'+++((lޭΝ;k׮R_P#.\hΑZܹs^@>Z:1*ų,-.èo>3Kkn:z.@J1[`=9o<\nUv2뎊wf+AAQa ˧DcokTTĂ l4E@)J^]| v$;2͛W[dO 4f[i< ØQwQY g7ńI_pWwP#ť&:/KAdRuRQ@ M'2RRrI |iFV%qchpv,[;L: V3ϢV=w ew1?Y?ZHªG>}&͔#hjfEZN@㦶\\N3ģ+D~la ߪ*Udػuovc޼[[\@h7^H[}KoN=opT˹a~g] E]ڰ5/a,dPIkX8y“\6{P׹qt$ #26lG͉ζ5y¨=ryEEEImPECm|C;l H"X+좈矠IoV`QKi/qk׮2</11QwڂaXnnnLDHk֭[իqH$999ЪU+-'Ll-[lll~7&%%uMAKVZ]xP-8f"  ]s ø\r(zwEd" ɻ/Yـ<}ٳ/_TipR2eʔ)S߿?qDe}ӦMK.%7nD#y6ԠA]Zޯ_? a[׃ RIrc>ʮL&NHA%7PmD,*ѭɵ<5ήTRX+PYYYQ|Kg{cH=VjJ{0)QtCT`+B7\]UAY5M-{V -' ǭl l ?n׫ =:Zh|=30n"KFp%@G-Nٳ}ܝwmw렺q玬o_fHyyZͨ ]T/Eǯ]Q5kԪ>(7+Kȓ`/+2gfYɻ8"..*b*qc v Lj)2qqbuZVXbʣilҒ9?ajj &SybJݚ*M{zw>̠40|O3ll'.Xl5A}^Hk忨i3oöϒKfyYϢMѳ;OU8EKW9An '( %9=ROO~j7Y(/OOO}lmm`0,x`Qo|ľ>c\25&*+m|hnZ^vrD!L8ѨDy18Θ0} fǬ[KR?X՚ta!} RF)١ %%Eyʘ&;'-Dk׎0b!  ]\\(`bb`0Y6?TCG(^zQFUniii...ebbbmmk׮ l֭T"CTN$jPdi޼ya )))Re2~Q3B}}}vFİŋu$;۷oJ D~ C&M5jDyŎ?h"b ͛w^mtJ$b|}}J:dlܸՕ3??ͭϏ<=8r *V %kA.CCNN^@*#{xc>Lתzbͧ)I.-/:lU%\@u8[Zk;!~~L0HyL3@<}& (YF!9\X44h[GɤDXq\nb"XOR aQUm9;gJ 9m\ōdp7/m+q5^>p]ōA:?++ q xo$VCZn/<_ƐyܖxღKͽz,[\c*@PF]Ӭ,s[51 Bm P4pA 8-l))9 ~ nUغ#\~@%*m4ĭ5u{JԼ@]83a/~>:3mCxGh57^ s]>թtk \,a0P1|Bŝ9sF&u*(:H&jYnn.Ƥ&P#Wv(=ڃ\"8qq"F,~ qi ƇWe̙ jueg< xQ@/&]۵C?EݽQjx pZPmіbKJ>|H׮]KuXD^"I.]tFU@-CEѣl6{gR+i87nd{eS!j%K̙SӓP;F-S#hd(Λ78bСC%%%YVÈ8ID" Q'33344~uG_-!w+Leee8Ϟ=>A+諞3lʫHhiی]d zRC B@t(h4:-z_-XF5Ŝx M,/.0 c {d*U&r#=O-S ]d$0k%g " Ju=E(N 6u}i٩ZݺGS@c$ܵK[X65YE e66$ Bf\2p? &D>PğNx*|ܷ#ro}w|}qKɞ-[<1Q&1&\$Gs غSƛWN?I,6bz9یλN/n\ {RibWKxPk OUt׏ysU.Ջ®#BKKK8t߸q1cHK7ܼ(""]tZ, ߟ qƆLG X,!lA9R+0Q~D9ؼJ"OMGqEǏ@ӦM;vJqlTfعsw?wa< ȍCHp687{tc.yy~23qydyT ^fc7q! AV%ҋtů͜SwƢ]8 ]z({ܤT" @bBRaq3uKm'm a{OVϯYwYNp^bs9~$vON>y;䄞0Zی^ro;욷i-&ɭm Ե4yxgǶ;^F\ϸ8chscwK \:Ȥ: |بϗJݻwoPTt)#y4pk_ug4X{z1"U޽9f_x}oK$>S7_QX8c&mʄ!AxG' a|mSN}AvUJ%M_%KgtاCCtØh4FbIԩH$"#!̚5k͚ yImڴQ(/Hzr:0 [dɖ-_7X,vvv...q|ȑ.\P.#É$D((*** @!wj /۷oOشPcw!GNz=7nHƨH$;v ޽^VV ppʠ]vRTAkCEf0χ 20Z?aǎAH2ðe˖$˟? `6}taee%8D2)ϱgϚ6ɢnݺ'O*7n /fff0ʶbF"󍍍qyYpppdd\.'QirΝ *JI@T }yɋ޽Rl)XXX888{NݺP~;ծvBhU),5kx{{9HAnZJkY z /co|uhIgmFKz|6C2a=dqõke'Nszml/.#*b@*2߿٪Z^7j$NM6eoTV Y+I>9x]RDg[xvgv͵#Vz>1dHy>hZ7L*-~bM||Jr#GQSJ$iiii+VTfZYY]]һS֚%xӦM@CXAYPƌPPعs簰0Oq\],X@(z7o8qH$g7or?޿ԩSTyQ+||>ӦMфK+^nO-zX֭Q l^zbj#D(**ds+++y< l&˳숈e7 6tyرğǏHѣU dLLֽ{rJ KMM~~~EFv5t9s攔(ŋ%|'OS HZOWe(G]H$Olm67KTiqT~C2H"@kp9%V $\J }/~ڳ4}7OBe"r8L] 6TƩ׉,Z$MYYYB`^E"ѤIH"JG|yժY')$RhyEQB\F#bzӧ]tQnO>}HZ>d2dFFF˖-bbbΝʙqqq0`;ɔH$΅*P:yΞ=KRd2]`Rptt422 ZYa Ttպ&7,2B*P.{r(bܸq[n%6D2$Vy TOۃE+W Ϝy99|0I<.W)VR8T\Xs:tS=bԝ}х1A]\ -7wϞ=_xxҚvZ/7o,*c":GV hllLj qZHZѣGDHC{|Raa-Z9s +**"""oI,h i'-[999gϞp$KpL&ܜꙠNj+]5rqoڴ)9ٺ)/ԩ//zFjݺMVXb SY K.0,==/_vQ„433FkmҤIe6@,S]d%~4G߿Bhb̙vҜWM>)#YX)e9'z񵑙IzRd999=\F.޽[!r26 _QAt!udgg|ΝKZzM6'Nh1Ŕ)S񧥥/uttԑؼye̦MAu۷r9cTӔgώ1yӦMqqqt:zm(8ܼyLEd@aFV,߿_#G$ؤP,Xcb >& U֭5/IcXC;oݺ/ Js`ھo;([>csqQȘKyNZZa!mN_Ϙ>՘|# \Zno68=Wop̑Rp^ 5S;;ĖRϸ,>fmcul̒%<~#5)u1[IB.ѯ@5_BC*ڵ 2 W qx}zXӃ.]>|;vxVSlP Nq޽{8cѢEd,0l̙d`M@Q4..ٳO> $g/TI|Ǐbl 2tqqQ!>3+++_A~MU0vm,7j3BBBfϞM{ʕ|T7nܸbdȑ8.tNlڴڵk*OcҢu릲~~~_URruu3ze#xX4UK8@u#7{V,ؖ-Z7oHr8JAphja/JrC7lkG~111~F"o U0q3f8Z`n.X*p~[ 33b00 qCC\gz fU ,tתu <7:4ѕ!n"Elf7f1c;iٜ]w. /_Oiii5$gb5N;FO)/z臚Ւ5gK],oeqcATŋ &D"-[]nn. Wv%Lٽ{JðUVE###%Y/]xq˖-Ç蘘XBFNH~z̙>>>Æ [bE׮]Ν Y}fL@իWLƋN7WݒOhȾ}fٮ73>0hگ͈ 6&(CM(6E߿O r͛۶mTcEOZyķE!E_A$IYYɑGGG_zAҤCFQ4::zҤI7o| x<uLqرӧ4irA\5(٫SoV^Q W^UryHHӧu\_?̟Ĭ^fy,P~=zu#u=w-S Ms1_ V_=0Zh>r(>AXCL lP`i@3ĴJFGcnnUL+0buْ4l odY=Lıcjfrdz6M9VpxۇYBQ~/F(G֟K;4S4p:Fkߑc͛{@ oǨ(YqcPx`D) H^^Fcw7ϧ5!qX1mn'"*9%*.!]YYY< ##`u]C(Zȑ#DD.^lwwq d2ר[Mڲ ccc:~5Ǹ19( ,Xf #2:QS%@dXZ)MMMupp044ر#KLLDƵeDޱ1ffsvtϧjI&RSv!vCP-PPsڌnLJJ)ScaX||<ѽ׮`wa~H&60`KqAP9NF9mʳ980I$G*p͘O>YXܦځl8'ib̊QV 19 `…TT!dJJJvGBT*EQ488ήL<iܹPa2 åXNlȹsb1Ha}}d P,gsW,mWrz Y~J0X Yc[UaFG@7@Я}g)40cZ{O/rӨQL<_ϒ;u>·'@.1=/_֝Đ' E/-Ə6l@ETkKbkLI0H aqL 0q=h+ {1@QfQ͒ TE3%ԁNַ&= հ_[򿿳cnv:f \leU9L+{{Y^\|n Фe J+N :':l 2r\It˔NĸEsUb"y5x ©<"H_'m}(r/]gl}=۰-,,2X[z߹cF5&ݝx+35o!ZUw1FF,8D"a`jhhd'R~=w<}:ƑVvٲL:Rc骑s3 :lrhl|VaD└Z/ңA1PH$D )Ж=9WebEr 0r=($S,W{"K~(զ E>}H "lbpeU,A*\ՉMϧ?x<U $rLaDrZ+hS( hd @I32mntۺSg8ޝIKDx(ݞ{pL`.ss)~ɜKsfzpR9}MDq8R;pA+@ #cNHJ߾/06i P|.+⼸ ;v/+( _!~%$nj*4HA_XE?}Z2]ZwԛW8{t//ZY\qwϳV~pR8N:GJ>q9NJ"Éխ4uPhULINrB"#O]>cٷTe8`z[KpVudJ3v+-.V.3; b/w;K&-׏Fhڪ݌._ Hff~-[tMh4ZSVV\ΧU#===oIJp8vou|^ yҵ\NFFFy]TW6ἝnUgS8NbB2`Ajt:JFM H޸=HX- ۴izq:d2Ml5jDdӳcؾBG/~ׁUk|O=WKrS\.7bJFg{/*-=|`N!E@8nccc&>{/mZZvwrlb V6;iiii ˻صpFU\.7ME Ѧgn;.lXz5^cՠaًD'(Ř-L" Es*թQ:ĄiLFC>X7hX™|1i°p#o܈.GFyz>3FvnP۬f 6 cr88zwdx#ƒNreR/4CMm> 51HVp@CduυH$[d@EXoSu!pܴo_y.%\.޸Q>]X'soE\2o$! $-q3BqlݘeVk;ّW-0ΔTl'pk_E-=ǹj9ib\;ɋ}x'knp?{G}G*KB?jm߰:/#Oy̮y$!J94^!):9}Ijǭu m; 99 >t1fk{o=R} [(+jWᏻW'ߏR=7P\ѲM# Hg+^A9\%)0( C-yD(4VFe_ LWUP3AJl%< ((L z3uhq8'ʼntysދG7?}MѠnf{O({+RlnǶmRZ)8Wa)kD? +uR7 1aX߶\$뢘DwV"t>  ['Vb{Yaؤ)7wXLں;Kl_Vm .zzٷm4巗"8x.gy_ .:ޢo} x{b=SM!\jN=HnRq. o3-]\[ۀ R[[˨Q1yh=,vHC /U:u:V0 }ZP>#Ja|hpKAh"aO g ,k2>oT.ut諂 6ۑ5\o {e_g?\{ܴ]/@}t޲yȁD4ʼnU/Jc8ѝ>@?"CgN@77U1gL 5Ҍ z]Ԣ! j͐OM-MxH"ncHc ohH\G#zr{]Ɯm.عzF⤠?ruGݪ-'<=?H_=q+2ml?h@Ci]Zynt\pA=vn|;H  ㇿ(p$,V,td&f2%@!fc} k?56Lz_CN68\%/9^Ӄ7k-?9ZB@sLu39)(z6«5y5[637*n]Mk? 0+`e6]>Dd'xyKBX_j/øqrhj|k_M@[CYBC_Ÿuk`;|>w;ދλ{:Zϑ[&cFu Ee1L&:5nX{~Fl)KHx.NhhFQ+pJ V]e2eFя(V"+WkBθ|AA+86uڊj@D$_;%;WGi։Pxz{|Bsr2sݺ7;1oޭ-.Tk̅Uka8򱌞  fjB`v $иm?׾eSG h q/upCJ%RŽ-Gh0,M[h}s~zo^ =sj.Z Y\и$od2:J܈98}̓K?XxfY~lH7<ד*SqbeglQ 0f4p@L:1@zW'*+C`6 ҵ+@zDA=Z~>f?<\+>ݼ~1X\~"϶)(8 Jgc 34KN0@SKKr)Ĵ[oCnU1(_A % y{Ȯ3 arF z Cc7%y# }p>;"pZq_gBIry;@Q&Y2JK`ܩ`iSWׯKStXcp*#c2i^і_2X 9s;F Ԣ/ITA 9k% Db))pf!ąoճ.Et~ZVX{ fiQ<#iIE\6aw5rڿ(#UÛ߉|{ A!W40>K4D*eUu(`&ވ?<+/Ҕ1mN{iW֚iLKrNm.:z,wiJ/M|vf^ !hqc}0УJ'n> Zx xk P47SGfdD{Љ; "w{XE<|@x̦dO['(w3z _vVo2[nS /HwUq?t5LOHh"dƽ{W8 #rlaQi539-TV"JԱZ9xuپA""ѓj!гF<@!J{Oc+-mC emwq\b[u6bQJ\!6}{nϮ~o:KlI?9BrФ4e)dÂVӊu8;{mTQW.E֑b֝Ztmޏ7޴rIb}CMֻωftu|qj۔JCZLւ.}_8tjf[oE3gp5; ˠxrʷk96w’f--~ȣ C;5s  l-',j/{y?u"Ohdn s`-{sxwhOK6DvH.MF@B~^vIK\ ,-O9{XC/hEqtP(1 0VԊR褽 >@~S[}=$яѷG򽋆CF:Ծ+M?WӇ<\:i"}*oߦ?}| <v*~hѬgp!hn9c>{qpX0AXyi2J+5t=8J$vik|եw8JUsZ(뾻xp@'^{<:c]r;Q-;&M9Bg]=U00e yj hbκc0Yw^vh+gs:I * "Q])wi_?z.4jKPzb;u_jIBV1bx|Y=ւҕg:4^VMp1?Y`D|y}jf1dzkȳå{;^g TߊLYȿ}/3?&O4i @{oNV*{~3jS/fAQ{ӧǤGC/ X&쫥Gt'jCQ8 Y" 0%ru~ yѼ< QOMʄ(J GQ\e 1 ;w9:EkarM9ZA]YS^aabDCX#՝| wwf ӧ㪂}okZsEV1\ *JWŷyU:+oM?n˫N)Dp|?YPkY,t~oqϤiM{]׽fKcY?R m'pf]f@鹣 ?Ԉvj6dy1:]e T>IxxT=:8G¡Cu(-58VXHpre4pBRd'Cnc1&:@{'~Ѹˋgqf\+ ;bUK'wHrtvf(;c_כX삯H ?1&kۈ)?ҟLzQHAp:ݰ8BM/eY0ҡCq$fkW@`D(gq\4~ɯ%Rq׮Led0iӦok$}),DTֿ? ˖/\P>[øGS" ~|6y=`C&WHEGKTr^ZHQt$M+*wOQ4@9W@@ARR[[Wݣ0D"_3,= Hӯꡇ_ LKkC sCW$''oMzcZ-Hbo%LdTOɺuuYWҊ3B'顇z= "37.^NقW3Ai >5 'o{^^6aBĤ@_d=C=Уj;&}5k=#z |HRGG~d=4!q4]wޗjp5?5 P>0Aֲ%ּ9nj ʲ !hj*-zf&: #>z@=)el 2 wAi4Z%u_W.GdyArڍ#֔fܿz衇zz@=#^^^hʼr]^_iQ#h6衇zǿ4kkk?b- L淗mJ[ :ڨ2DT?m6(A4VֹSq%-S vvD쥭 !5u1m}ɹ[Dԕ1t8a8]gұUz|)|@]Po [mΈ |р 9ѮGY GJ3=mZqKd~011 zԟphja/JVaJ7mΚ.(H˩w֗>o0]u\TY~&`nDT,QB,QQlQ\;qBEBAEB! 3 |̀=xiUa:}ĻQ9ǵIvQҿrcnɂI+zwC 8Y-AaAޛk(j1-?E&jU=o ݫ~[8} AB&! 0G{W9fAAcB]"C}_ :&9֙u⚘foweqnKv}fe mQtD ֶ ٍO#m@U D$PNDDHh< p.X8:GAhh3iURez8к멂.L`o_{ehzTɾnojlJ=|0}.(()E@yJ#=\-m򥵷IȄ(oNѥ7KZνfBDJ0{O]1$=ͣxna4 @1X WƨazלK6w*;9xC<+>Lk~9-|@R )uuidjm(@cWfF焸rZ[ue$gMJ+?I aO+/[12&l Iqo)>tPxΟ?STK*Q(v+>$>xpwưƝ9/BU ѡ^Jtj<{,TxrQq{qZ-犀Hw;y!PuҊnx -]ja?9m=S4S 4*r"ͻ VFT>|Q˃ޥ im_|>ui%aJkS>(D11? z)gZp#bu5iH DSRZW{+mP>x8ǥ4^x\.B0SXD#i=feXj?Զ $Vb~p_ocT?7_q:p=' p#b`4חn;ӟXM_yE Ó:|L,R꬧YS t )g6?]$$H}6 <i?0sɚ,| 5un cŗ—11څI!osWct#a Fߜ_+Wy`Oz 2>p 뽈l՗ l{Ϛ? a%ZQ&YYgUTu 27`еtnoz2h ]˃Bi%o4IlҾMl,/Ee1lMjV`(*9bc(+o <7"p?չv7{i_=:ٍT ^.3lVz1UV#δ$c;uYj SW)MRy,A?TG * F/J>fV}_ !E鞫qFfG{a\ʩWyJ/N-!WȗebhnH@[ +3O.s q0Xrs>3rWĀvJ?g S :t$$%$g NJniik=iW߅ΙV3 bNJ.Uv< d @UK86VT) /,7M@ᰅnIZ; 3ADmi3^RCpHIL4M۟IHw0EV7zgμ.#Gi9qtſ7X)^F; ?>? wJGۮ{}ze\-ϒt)=wscJNpo\ޢǂA홑*)ִ&|nwr P@N@hjֻ8 e#[s>|zs^9]HM['u6ɤeƥR ^[œ2OYabG/yC޷V8"o4dd 9yeI[Ch*bEiyܟU"uE\%: : MGFAbIE |!\&F+mT­̔}zߔ3%(@9':^J42F (Ҙy~T!+(1s hB IDATJw=9ܬX/ p#8[UQ6d|SKYEءep_lKȳfNz5_\%9`{mtޚv~lQe#=CBliB,oIQp9޲幨y|(JjШ4= [o)y1]6[:ny"oUJiR>~1/8_Xa D\ӈ_^on5s[YwnL$ꁚY?U %sܖ&$Qx>n7,.qjtQ*$-/8b;vcEUò&܁>b'W.PzI.PlR ! &jϳ#bc5s3K@YYFr_ Ÿ+= ?6m&VՁ /%%S]0LLv@j=97!VJof8k|י@f,=H3Sur;|&B{xuN:6[̪Ì$db$9oVl󓳶:IAKRd /S NCchbQɠe"s:Sn5,rcdtGa$ ϢЪG\Qg{TИC: Kfvs sڋ=6?"Xe#?v;KƠE/틝}#b^Gp:+ L7?HL-j{!ZrJn*Zĉ7$bsvTWbXS {7"G@쳀zx!9_=K@UTR\HTl.zFr(t78krQuw5gI z4Q#Yݒ \tЉsA ԙwaAoعoՊy(, @]۲~pA13Vmؼ~<GonȸI̍5gW-_KXӤ{牷`ȍbw¥a$!aVB&cΟV<1mIhNXo(0,q<\ɠHMMmTN3>ܣӬn!_!@)Q9WByT ADjiiiQG 0YT:~ARYo"vt RT,RT1Wϔ!-U%ǻ; Y73g;V"-&cX=ӱXo MDmwC[W2жm[SWK@CԊ^؜U,&?o!ZKQF?/ԇ$F9sż#ٿ. tkbg/vL%iTnmQo@E'=m+4͝W½HA%@*IyMK j2_2H)LK~?%@$HjaѻTaZBdЛͮ4 ? M$FsHBg5 }arr A⿅ܠ7oH* tƼCD+'1$_bAKh $H AT$H A $H $H A $ $H A d@ $H AVZ6mJHHx7Uc96 ̏KykkfEKv:Ҙ)-M(~FzRYRR/' #oߨdQRV+wneFm ۖI9 BNE)ܮJýݪ;~ܠ!D-  *wٴS,ȣ#JF*hإ)']BY˩UKS[*##E`c:Ta3񕌯Wly -S\o%O/Wu֮N|3tO2߱[;EŒȢɨɖ'hFN >#o&9]\8nUܽŘs2(V1@%˯DfĪm*16^+}eM.5 VDΣP(|~yQO>6%Ve~\w*//IK rzD.'֟y27}f H`jO[}bņne*+ zzߔt 8Aߔ멿F̬u:*JZ>EȪӐ%Z eaΑJ|0vahddz-zX!g__nIi8uy2u3wF܏:hN0XGK ?WIfIbUp_9|9Ar[ )Cy^ZQQ?`9|i|jFaݾf^g[X],MI}5n%'M;F_>wU OMS6Y]Of~SǎU=,5ȳ+:⩛"kԷ<>s+|0.Knm&e0@t)+BZez)C-[-R-npLBesCt@FbF\͵?Y4&͡_^.geeE% c:O_4;VCc'{2;:M4J $!T|`YL $Lr@H@ZnZ<1$L-`cm mY:9Nu*eD8ADxѬ/ky xKfri37;De{"7h=-AD]?kAQ4Y2Mu?AD\Qg "A 4hd> R/ Cҽ WϞu*&jV~̌Y_Vgf:nRZP-Xyuf{uQ' gLS@4/cuf̧\ᝬA'f3z(A>h`lDcXh ݫ~[8} AB&! 0G{Wխ N. , Lr23Q 0,_ܖ͞ڢ(@mF<2Z H/Bm,$ADzoa炅s$A!A>N6/VU(puS]\yzpˬ~շAD d_75"mJ=|0}.(()E@yJA܊@U ꙛJNVI޽Wp{}Z1 ZKe-^vJ}qcO=~T=v^:xr]oAZb-\flYy/1L 7Pd'L0|Y}>gwe1[wVfVoD=MijHW./'0Ȋ0A 6ŬGӪLORjҹ2G.4fP=3Th)i珄} ǟlIS3\q]KF-G{_.0w=*Dz?}iwX)ZQi?:j+'MS=#R{IiIkThY/= #`쎊K{ZVN36v:c?ms~OunTfg7R)nxq^hϰw4W(Zu‹*TY͎LhoKQO!H|J0n>Х_+پ1$$%Z))i{&:X/ IRnnG RτѪ-sRrFo/> ݵkE~FKPl }O\R F,LqJ9e!Q?oWZ[i J["bu&1'o~irs>_?#O#m ŀvJ?㘈L[VL\ ;5U:#-TY?En?S25Z+)@H[;J 0{;ZZTU· mK۷o߾}1fgQh*NBDZiwt\e7ê-2nny)^̣wӫG7o?l;tȩs+.>N?VA%R{2,ׇ^VtW־ǧN0iU/ZK*y|lfci%j(b X[݃##,+qZ3o>pDh oM+qVu6s,^006%%* sXs/76 ڦҔbIBVjQb3zrYq,oQ\T)F?ؐnOf/fɖCztv6"?ney<q!vh];,k=pK gd]"DEս5#wzd׫*qAۛ.o3tޟc*QbKb>}Nf-EeE5UoK=/y^ bR稟^y([=ESxpcTu:DeY-}٨ZL/'~5ukJ[x<~O8#W)Rb --a-Z1*~VUͻa0L*vݾis{kYjfUפ(+:\j+ pw껊WTDiQ DTA6cUdH ~\{t W5CjfTϿAe:tUMg8b;eP ZݤT|(J/}TZr ɦ J,-)Q9:1‚2ѮHGȳ_"{(O_nR9UӀGӿ[{pӴ3F/>oe/-]};o>g9 m;k̜vCLNeX?-xlǣ^~#gn$vz&,GZ2JRY§'Nj3/Κӓ=XX- Diot4*p gb2EbX \[s̳tEMV2Yיjw#da#;Z ,$QyV F<:ܫƔHb@dX4[˜^wH_M^x-\^FKتT+!E}{Hvbkri`04Kr~JYuf|^ڷ>Q;P(@Q@pj`+[E`9 (wYzݤĸKƲ]e3a=v3xW(8h٫׌w>u_}`:|m͢~"a5BYSkmݗ2.r~q kls!V u=PL`|( kǵo=}Ӛ=~%5Su3}{t,QSAH#YM%Ct+Ǔ]S9@IмBu_`nPb^ѫKPkwbLo;c[b|f^u>W pN\-]߸l:댱 eC#|dj{7wZ @cG* ,${b9d;?gze(Dx]-glV}H 3{N<J~+x~raKڥf]tΚyYٟonؠ;ʺK_ʲ^jh/{[jڥ 3%ͣ !aV5e2!9m}M;ҧ@ѦdCTEEEAOO(!,orSΕνKHK3T:<ŘBw#߬,-( U^r⥤xEEiELjf4\}aaJ2H}_{HeES2CKg?o LktFiYƌA0A* hS.!,VHKI+/B1tl}sV;!-1h۶-Z @ 4}> t =P`3]wkteļ_. mI|~^Omw 왣 ̂q7I!A hVף4l]ϙ+ ouq6Uk;nڢ?_yQO1z[^qޛ;N{%@- ]-,zwT*LK zB>`*$24n  dѪ@ $~(H搄XD$ $H $r[`H ђqm&L ID/-"0$H A $H$ $H A d@ $H A 2 A $H A43$1sJ7O}%kF,I_[񧕧b8|6MJm)뀱;5%!(=rآAM.AAuff:"KC4iZS2M^-{a_SfuΗi1W71okX6uds5Bbv:x -S\oԟ丢w7`{c8.6PS,%,/[Sr^7s֮/?5ѩ-E ;V~$Hp*eмU8:QB; zHz](zKƟ:Q ^1`n{Vނ?;$ɺ Iϊ`ި~5u((UV 8[[ͫCžc(lFMi`4S7OI[VBΞ!V ̪,s"ְSM5 ߦ&$*ʵ^SRSPZaql> RWQgjJ9pD'{~=r8"ŁXr,l'4ŁG7K s]N 05HC WEUT 펋GrzVw^:9(Y4fnܲƖ%Y-{lPPkKV'ZT:[}o.& {7n2b QN\Vg]PRoFk͎X8}85VͿ)&9f}|"#"jK>{v$/DEmJt[ۺT,qp $CAa>v>G{ޜX+j/Ax'8Q-OcmY*tDJIQd8"$=5k GJ[QluZKoTK?W ίLv-w`޺27VZa>~J&!Ċ7>}=ϼlMuL4!=T.5}2#=YkXtӘ]>\Cmj{ؾk1Xu3E}NyV O[r%#>dv[j ֏=_?w+\HgchT\S%&XE]Q\Q= 4m8S$buwV͵b˄KθCVv^C dʤμSm+i h%y$ &w!曯=`ýd.ٙ;G p CF^-JHUGՊfQ0͕>QHZ;$Z Z @2\xכkо _OZ^?gRSʃ}S}95hR| @f& hI7rU+Ƃ,9QiFihTzeU!\߿gЩ4iE?71n`С'ү (]2j,Z|l3鋤߼( A翤r]4S |)LRj:;\ v:phW!n.ȗnϟ?OXZm \~k^Ȣ&z߼w ⰧjYng+d=q9}XJץ.XWtHyɋW<`|gϞ> IL_c;(VA#N>Pd`^T/*|y9"ш) L)X8 /!X|ɐsOP,%(}̿b&#sP0DA@qh5z}喖7y^/m5 --aUz@/p>,, jTsq i=7Xx5@7J۾ܻǬ ;:t7,V߃H73&pVo/k7;o.qtnɢ^w0q8[7+rN %(*u^pDr98{D]N׭q3_8X duRS8W9Ng8t'X5G{sd ;N\%xnuU9zYQăߔsM/7Vm'ŗmT/kj*+HGzbڕ\.z ڰa yV|QE5sQ|lp'Sݏ tUj&yBd6@[YZP*Bs|zu*&[nݺut@K$za\sjI~|ikA/ll賱C>Ӂ6,Q4ު@SIArd!G"iJ e`+G %<&%$H;;bNZ>Lncs4 \(F,(ga519L PέPKpΑvRfiǏ!n}<!%5I{?>4&"Vk"!dR򲊺Q_cD5]JB+n`~]-We9B.$FvȦ:S+rʸg'8\ ^L 3|e(XkAW<+$nsz\H@Yǀ4.WejEqy1 Y=ct"/35 zK-tT^e<>ҾH7|A _8"9MSC Z R# 6V7\R Ȯ 2XLbPV=HYcN50\J8MI T` @udm"z^ /:G<8#',^Q e IGCn* 1FZS[d:t(UbD>ps?|~ࡿ #s@o9!պ=k,;{}>CV~Zc +}[:ny&ho8 XaGa/hKbXc%1_{(B^QAEA)KQQ8iwu{v<33@R{4uUMqVSG8XZ <]h7?.% #! t9\^~&bE~k=YzAeqf2Lc(StDv-贶ɐMǨ 6he9 6-d:;T^=Wntս7!@?ԋS-sWo_V׬%%04}|eˎ˕݈jDo+# /ȷe~ *ILڻ5$/ |:R |qQ&0?hLE CˉT^Vv'km6Do5!?I=ڵ9 >n__X6L4v3nH7~Zlzv@҆G$@V/'+[6ܨlYrVvdFGϞ=rM=Ro=t1'Ba8@+ŎbOűӖX/^s/x1t<XQr˯2jTU3gɾmYiJu<۵eIs%7ŧ {\oi:/SSa.z H[mlXmZw&ZHU' 63ko96-\߾&,бԣߪ|7{ʒց4V'U IDATJ +(KKKIII:::,ץ}-ˈe}FMMQLt;>x# J-YY垏 ⫕|o2bmM=;*ߦk45J .^%r#uuEv|QLn~iӦE Gsh[ٷUKxKUedϭWȯT479LfZɪRw'MWVmvښ,߭?n~G䰬:s5UTw4j PM͑ȫc v$ \iݵ`V狲us?԰WUUPiL)W|`-}H+,ٌ1H4j;5FM |"7F@f#E ̈V;}|A+]*ߢ}^,v72[3F[?SjɎYGel2ާ  FU ȯ+-d o+yB.{?1n[ g?Jϩ6mdw7JX1@& u˫wu#CJ]R 9>oꬽ>+עFPHXfD յt'݂@vzݷm~82_q⍴//T y>^^"qooooo8bhoY}|J[;R+.s-@N߻>+_#v(@uZK3'/>ewq;O ,vY|r=KF PGbri#>?!0tG7m~[#gѦ ]X3!#=G}cJVW=`n7 #~VtH#bCS nt&W=_vT /Zh\IƬc}.vK;>HRKIYهj 7PxFl8z*ټgW3&BF8\Rr9JAG:vKaJI X6&@JPhogY`5a%3lOmzy`G{u]_pr KygZ}nze̓^> l e`Eg^Q҆+c׿HM\ ?ԍ}MGXunƜ{n 2vWH'MBfNTp|nKZjfZ22#F ʪI{&`ӚO%t~Սm/p# c&?{(X/&T mwK|E@ƆGld_錜U*4vt2@Ӡg|=%~%#+#‹B ʪ$h@ 򾧂t@`g]r~hIp9ISt-Q̻884`Q3YW3&kK3;Z| )MzE\P/DxѠ4xc,/>L4MowRP,$\(yS_fS J_Mz u1S8Z |x{QU%50ٙRƦ9!=%˼^ث!0?|vi<? XB(44'G1bdmSuۜ5l\P BO,(~+J-R4rRʿ bS.;mMo,!f ըl<0 T(4Bk]g8mӝdϿ|PF~mF;))e"9*89 vlGӾ=GyS+kI~QYjBq5ai 0r$29ﺹmmZv !b\X)WqQľ5LIXZ=evT{/#Q.X5oY{sGV^K2xWF?xSҤTџ)vW^RЕ6eeO @C,cѽc;݀ρ1TJAVl Ηq{v5-iW=aS8鹏׽LEkTLB,GUJHzTȸx z h^ zt#7q շ/J<ફ)z_f-H7Eh /l!i}n8 6΃<)Z2v9۩M?),զ,`կE zPx9"~ Ƣ_Wb#,FQq 'evT{/'al5ʻ8ч}OZK6tSκ od)Q!jM z!GϊhFyyЈb]TK{rF:,E8V\ 3:x|L Ό3?Z={^pdzs--r4ҿWsz̳A'=% az}/o?nug*Mͥ_zEA^pX|N]/#% Ԩ.=\0^OaOF@{_}WHe& Xw Ow3jlhdTT H{KvlqoKLg1Qv˭Yes͎}-n Ul)L)XN]{TB?73m0'- з^s\m˞}rbzaw?:yV.Etm7(oǬIjE=kbDD+<5&,jR m\S]<6gkeʥw\]S{ʤZ=D-;d9҈GGR]`5]ϊhf9- P]K7ninqW+AΞ\-4L&n7cBM'Vj){ [+gψU'M:+M_>a-޴mb۴|4wu3޶ewQPG~ v&AztB}=eVT^4ke=[/1׽l]4voۢ SDózY*R_dsQв ~|q/^4TE{њgE4Yr8G sՠ>;Vf#(k^7w&@RR[ēI4%2J9,T:i5V V44jdue~f6 wO\`XW|n=dz~w0>DUh{k|Z/%dgUHQIE+meV-5AdZ}+,]ո[ 42šIk崫JYaT /:l=߬UT%FCJeȣG&5h29Z#Y&U*+ޟV#] -E@ɳǽz'nBiܸ1;%2Y2iV a%uבOiI orթq(*G yLgm$D$/l3,c6k=:HѿH&C]0wYJzPYfʛ gRuۂA_G S,R:5jd)MMr\2gWQAxsݣ}-ېI7_ۖ-S =ܜ% #Z2?JD4^OBܨ0LF/V.~i`kmPohۼZW!AR2Y 5ZwYD}}-@* 1RLd@&@&74E@ d@ @ @ @ @ @&@ Lt9SDm+{{{SO_ǏԤFzYFDZSk^UkMZߵYܬEӭE ˕-ZgZu\[9"Α@ oKضib"\ ‡Py+kMeFM77"ܓA׮ҿ)Si=fklgȓRmmQa ۷oϯa hOya d蟽1{cU2Q;j.YKmDz/?WFf@{4"@ ԳQtOGVrbC^3ϡq݆P*o(!C0}0ǎ=SYȱÜ;3j.'-Vu E|w]tٴ%ôʎ5ܡgr]Fi M\12+&Q72 7uB_/_(Ezgz0#e&9=<42[ņT1q`BtHd0;*v LSI BFAittgШM+s صS90+y'C :yP\*<-_~!CUB%.W篡۟k8J*0p<E876+"~i:h> Gs~qݣаF/hN%ÙфBhw:wFH#8:L^fi:btGtc+fKF4Ҏ/{+{Fۃi>lV4M/6gh#-X(̋Y\z]dPw|S)x{{{yyz>NPJ J6S yV )T忸$\>sSa|cj__+xR)ONv6CC+:b^CEooKL2mP>|!+;?!0tG7m~[#gѦ ]a*@۹\=yӯni|D Cutjm>p.`DxJ"۱}b[9wkr<޽Y!p-l|}#)gWw$FW:f9mL/eJ} pI u7oφR7.&A `챉4s]JY0~NڗjY3Q*N~i:/"ˉ{^^Dח-\ʫۙE6hSS_J֔vp;Yf>#[:7c=p +TXg]|Wvy eF?T2MW8>f ?J/̓^> l RPe&Z vJۉS{f-KP7 ٺ:Q9--k @"rpN}͗"nk.B>iz?Tʂr,ЄG@zo"UZ/\d dli$mOιYHШIcmG'0 zlS›W}{2xPu3(\}iC{"`5a%3lOmzjDeU4j NySA:p PtS/ g IDAT 3)4'ij#?y''f, }:˟WN9{負\u}s;Ac Jި{ڌҺ!iA"S^sT@i4Mv'u: E&d7h9s NJu1qjdv fk% wrU[t}GS8%UUsN+V]Poݺ(V_B9{ I50`%/fÜ-\,55Z*T}ϥ>Jۂޮ_;kS ' Ndz-+K>,/)UJ%ү&F=uO:N)I-{@b|"Щ)9-/>;-54ѕ~^" $(L((FZzE]G&WA=:hL_NJ -pߦew)e5ymk GmL\.@[FrPx`mxP@a#חPF~mF;))bjk0&'}حްðimCCZ+kI~QYjvVai 0r$[WHN]| nbӚxm&$Brt-Þ2^wyeE?,^yESЇ U,J}ΑҨ~OGtWk,7,q߂ŽjpRCy KyɫNިQw=UQUZHM2'nΒ&@R5Rl4SUN-Ҏ+#f/R$? |?H=OrGPOC4@wùTq 6IQ,&uqGT)(@aPi zt#Pb\4 ig>]Z4WK{VoT, Xn-ԜԁH2Vt0Ce<SWT%~]Փދlhr_DEW_-MQ*>^,ׇ=:V :b[p~O:27D5V?YQ3gC#>^wR4^ i]G8V\ 3:x|L׷Hu:sR/wWNZo~ }]V> ]!M&`݁:B5/Gb3'G2ҩ^nտ.nv#n׵wK djA?`CΕ c6o{tm7cחP.4fdG4pVqgKL0fJNjjD޾˱2C ,bۮ=*}dVUB\L0G^'=<7إM5I#T1zH/8,>Pˮ{E 7gOz\K12@c@=`ۯ)Y\SFntI!зoqMu؜!*quu \L? (BkuF H#IOf9- P?<_ Nd:pڻuaG>c"/ޫbT 8ݵwkH^ NZYM'Vj){ [+glVXWB]ݦlm?FG~RES)c} NɎ?CL%-+rT!Sb $_b۪FJʖR  qdv|-[z9K }u݆40LFk{BN̝vnC&e.O?"/T7@ƃ w}G@[^S-q»ɔ۩G}}-@vtmP-ݫȐ^0![/zN APvu֗)Iyhዝ!j \=}O @  @ @ @ @&@ L@ S oiAYdDڃ)ж7to0zĉ'N0a|&̷nU>'nïKVF7٥D}vNo%0e8N_6jd6X00kX4I gi:&:Mq>̮Ĥ JOڴqDBTMfkG:լͳ\XKbbᛣi4]ռP}AGCj`\XJ[@vR3.`)3S-{U UΫ6ƺjgOx+ 3Rfns~ʳ|A!c}ة!PQo]/%WM^fjjjT#oVu#Z.H(!*l3\ 4Mi:wFH#8:fi:bmx4MG4km=f%;nJb~i:h> Gs~qm pXtpа/TW?UUNN4ImK4Ea[]Ld#ܟ4éx}eSWt,?UH?fq14OS$K&--:Ko[H};))Б*OB`iQTbֈ_$DsC9"nWhxBeh*UH{dBaUd] *efA|0 EczDv7)@K[,';aIGP10٬QYX3!#=G}c슬.ĞBn9Κ+wH ߥs~*.+w)~%Tq|S)x{{{yyz>Nms Hz_Ur]J]*ߖ-X~/X1ϜJ|;kq~C`nn<(FϢM+.$_,[S#` <&#`y \U߼$\9tZl4x4PyZGO"u!OcJ>6ӗ͔[ -'- ]=YlUaKJrzd̼HptZY*ZCC6owN"%ݴ&uA3[W'*8>Gw-T@%M:b ."_LM~)B3zL/G7r`չso-tg _aQ|ӚO%t~Սm/p#L^{^^Dח-;enp%D|=Wˑ~jDeH3OhC{,4wph5$Tzlan4Ko*P >4a-~.ޛȧrB4nW7E[Z{LXxJ=Rki)r|H^ ZQ %VhAauh83h#ͲV%$]'pv/c*ix{W[]R8Ӵ0+R1^gCD mz9:k [.ѳ믿/s1"Z82=40QTZ)giNtLCor\2=d<<V]l곕Y@υ+ ٥_Tdgʚ/~ @EUuB2zHs[Ƶu驅VynFI|@ bT:f~gWXxm@h9(oSKrT@w*vޑyT/Oe^8gNIy9PeWf[ju?>Za~/Q!x',nNۇR7T*kY_^:o+{;M& {(k/sZCI&`}ZFEZ#v ū^<%|Iպg~ʑВ[}|P@aX2kXZ'Cj<@E%dPV7Uc ӼG˜ӪYh }gr"8TF6+]Z+Vͽ^K{C??(˗֪̬U/uRJ<`; vb=R(G==oװIپ@@V*F[|Db1)Ac:n;Y;qEsȸ#f/5,U4D ; (9ey؀'04*_wRT, 0!VQ/h|eN`ЫG?==uErϺȈ0-kԫI^> yeZ2v:`[X1ċod(0<{/J^誃 @ZHCj oLmx`&cRǖܓКnܵFBծryy2 (Ξf:"Z}X:Uy..or)JAY@}ﭷRfRh\P7r};Q5642Mfbe$ܽUrOAc7E7bݖ-TvB7Y=KGnGh5-8ES@NZo~ }]V>%]!M&`݁]6Gܲk@]E;Aţ6}=@'cA׷Hu:sR/}8ͩ({K;WJge9p1ðy<@|%yWvgǜs]y2]-zQtÞ{C(3S-ċn6~o-PFNgIA 7GU~sxc*14TNjZi?7B; 2}T SUB5 y)3;/inIIq{;9CEp.ٲP|r'W^'ZYt2B+G=F;'o$ [Ѻ/7!Ա;9Dk,~=@0j$#{׬%%04}|eˎVosw+Tj#xVU v9e2šIYW5ꫮTAjM >bY{X:75yWd 5=fP0` ƍdS!O@N|__2GN_VLC8?,?I^QQ5'fiU)+mexcg:k#獾2eG$UG蟥̥=5a_u{a>tsgE>U^b7hjp} W#?@6Q"*o 8M'm2\2QH=ו(n%ӏ9DA#.~|@ | SG[>>!k%NxE3C_(k @bIy)H "MFtE jQ:2'@  @ @ @ @&@ L@  ;Ȩۈ=cB9I@Kc@k#Se`1- T[ޱ0 5GժٻH.QbmFs"ETC}/ǒ%dPg:p" B4QNyPeԨykėR:?{rO?ڛoӒoZrt|byv k?u.hO8E՟i㈒of>/̀*Y!#dPGfnB߰?Q>fC3*>)+/>ȹzߍ]C^?z*t<#vׅN9y=0!UesURl$/tJޥWܚؾa-ZSĩVye/r`WʤX?MG_r4}e1\_ML ao%$è-^mء[C [^e'Dx^&jAwK) S.,I.JC٩)KoSe^*뮙)K CtHY"LY"֩@i:,4i{*)7_i2}1h!4]H6{㡫4F3-v Jl=fe] #FH?fq1B@&;ӈI?v{,^9?!0tG7m~[#gѦ =yMzz颗םh1 |lxܹ${AwEzoKmÑ3WC)}\qNqI|ŧ 6.n@=s5/V>p{ߑZ?`S.5l[[jSoƤ*Q,t̲syntG'i^j"zR*uڪ{/ '+7gS)??,~{[\}.://T y> k&:d8spL]ҎH9r_xsNqK\t=Q*vD Y]'F/!o:۫6s^eW[W}?X n3v޴E> r}]vqj=ti3:mЦ {=gmG^( ï,f{jR$]y<5b;RVc-;ucĩ_z-V1ۂLwZoxР* PTgwaQmݽ QQQD,]PQ% vFc7X%$5kQcwQ@EA8 |q,wJngw{ygw̆~B>{Ga$㢟}u=&g>-y2x`SOc!7$,3. 4D];ʇiHT$B%܂i4hV RUm$㵬Co6MJ߸5=uuw5넔̵%;"<(&Kn٣tU!?;D 1J@Bf禛ųB=M0lmȹ[> `ɻ'_<7Va3B)'DPm矛4v'֬Zvz&rxDgiRa+6x6AU ik껼뚇aw_;q_U-U G73{y\Eoy 5rC/R*^"o:oX;gcuDP?+gY@A'deex iqP{#3B;],ǽCG?7sJ?i Mw{R+мm]+KϏˌݴ*C?۶67\'@v_ݦlcś*]TI?8!t=?'Z83Ϯf ߆.yvts@'3;lն[+R> J6@4+\CJr4qթSe{|4XU Xe7_GthP@|)ylTY{g W?C8&nmT>j4 ij^]3F2bx}iعZE^G#vysR- ;]6<ǪγݻE~6״Pa/zlB x狴Hj3РAsaÆĂ+->3̩()qssDUnU9o^mfJY{?3n? Ye,&R58I*U E s+cb%X=*eZT"Tn0mջ73# 3\\\.Ȫzl:d^{;pl,%B_P"=n#P ZA㿦0?Fb.j^*|s)"b-0 CXE_!=lV.UE]B>b*{@F[eXTsǕ 2\P%gIo"Z2eʣ%rX K? 4`ց<&'950ۋ/Iտl{ X nk 4hР* $@a{YE1P}g\LON%cهDL@5ҷ=,%}P#Kγv6AzwOTƹۥ[O'SQTt hРA _йEzW'IeJ4DCZ+А,NZҞ.d!#{iE8kJɀW̿}*fՈz$s3I#^?φ-5 n<\*.)67дub]`aWW8OU2g)$4rmFR6#.;4l6a>WWYz7N$ 4hРQ'Pk]]׻yx+r N6},`̮vZʿ|K\Yl%@FV4 \L ͥUŌ,Nd!_PfK`c4Djf+iV6\&k#bd}n+ `i^f˻DvE;DAMmNDt"HH oDïZA 4h 9r m m<״eSgRe Q\NYAբt&8(d__M,2=i`8JV`rF=ܐyͦ| Kwd+`');M}F4l%FH2|y!m2>9hФCH.uld\.@9oծW3|xC 4hkUcb4R4c)4WwF1\,99*f$)D).{eMyqOH%#K^`avHi_B}UџN*lm2}9x~.^]@Y22ЧBױsLy!iРA _;4o'%HBx׻@X ƒ0(*akPF2mۗ%>-uW'Ux=3n_ P^ݑZk@nn1" ,P.= 4hРAn(iUv)5[#h17"fYkDPJ]9lDӯ[H gKp&yhsPo$fNa JրRC8bP{XIZ4mjyp;'VfAHD 4hРA )@qVL`AR?SrDŘ"hP:]܉-DUKYg2i6 pG:9*zn%Vn& Wbl[>o_0UP%f AƼUog0\[hUoP󎉙 A%bUҪAj\|4hРA 'deex9HGULPЇZoΪч|HPq p ԅܧKwO5%IRt׷TՓXzx0B ÌD"j)5Ta2г@'*q_rz|V|@4hРP[  6q\?_H߈Ux}Dü 5e.59쿞{D* 4hРA+_. _?e{Bϻ6X%9V>W$"q_?C ~h+5Ε6EӠA 4hF*F`Yukyv$IV Н 4hРA+4LoWT-`?*4hРA @_O+FPtJ7#!Bc#Vh(^߷RGT DvvƅBT<5\B & KC 4hРzOumj?D8^Ql :DBrVYqq8uֆVFf^߸|| qqg0H{ 4hРAZ: $͛ˆU6nJm^0!{@QewR`0p *5kCðJ#iРA 5@A{՗lB|YZ@lVppk~Vǭ^5o`7u0^Héyo2xw? rZn|Jad~ut ~T9i5Y lGlxpFn/TK ꡛVޡ_# 41a=J[.!98- <@7z|dGnUb7K.5SڻϷs:rT3Ϭ`n^F32<0.aɚ |,:u. clgebbd ^ko3`e)IS]ɹ Ud)F"AȜ:0&W KA&ɡcr/Zݻ>,^3L8%1u֔2C?m]W`6숻;kWJuSnT?CoG3 D.@&:bvn͞6J̵}fqYc\M߾[0TrE޼*Mլ } g k97i|t3ƽ{fġ7j(ǎ @trwSR H%APk21aIKRŽHurj-vRWUQף\}{KauRQE LPafRS)4T \{O0IPUDr=2iP8N6ק$rsu^~a}2BV De7~P] }3X@iqwUtT9prQLP5?F5"BU\Us0vs|Pr>i8c4XWR"6J IDAT#T;d [r^.xqk? ';)ʂB*UY͎; r5WS.Y^[Z#WjыdAw}W^\:}aq`(fk87@g-Sv@n@KD>˂>ېC1|~R"Ͽ.Hfy>< gCIStN:O۞HHu]''k>>oYoS>Zg|>?v=wPdiy6AuUH' ]NTwi,m9p/Lhon|4-q=|&)W&yo>ﯟ֋id>sd>>ק^5 GUuЎGGGGin\9< \r@"ݪFa, M|kmrk$㤉 eP, U6-E:).ដŏMhx%deHoF}2WE bwM.zwQG%z3ӚT k2>|~4Gp\ >w _ /Z옋"kD_lIlx84/d 3ű{yϳk']Fy JV˦d Ў  کsoyp>K<zd`RLk7\q_d j=+߱?Qd?|'Kw;&0"ZrMۧ_`$X|;[g6#Ј[i8]#0 Շn+ϕY9G"ǬhrЩ][Hx Pց׮ߨ!/V,kN[;_zֵ0 ?ץ}qC˙O~ ZnurEej(n{3OmՀᔙ"#qJVyZ`11&͖2BC5DUtL$x{f~|\cr^>}^ߚΧ"=19b`vY(`Ϛ -?pSe9o3pnd LGUן{v1enZ/@޲ۇ{)Qҝ} -.vi6>r#v̏N 'qscC' = $\}5@vo1ſIiiu_`wK:g>Jv e6AueZL#pig8 Zݻw콙|}~ReE.ss]Vj Ǯh?7Q5s[g17=@Wʺ';->{5:~67 <Xx3Ǎm~slU2s4kٌ-UI)IhxlCN^m[!Ю3l u܋r+2Q.M!-L \ 3/^?Nk/̔y8|t=o}tՀ~7́nhTE]>UA/艹q!-1CNY>5G䥖޸QvH"ҥLۅ?8l*zu7 IАG<*](Jn,9ǵp&.gyj$w=)9Udr6 e0 HPkT| ** N̮]M\C5oո@ ;u.[/$Q <$$@y;Oz$9&H))((T/ ;mҲg@H!BiaCr$7b9.B@lU$*5$Rd:v‚euu`-5uU+(o)xVB2u)TsZy ޽S t+71115As'T*LI$IF7O\#WlX ]ʾ5m0{˕6G(!廭FyϺh4#NE5uf./;Il6 mY̖m=@pl%LP6Pjٱ\k$Y30£RJ^X}ܵlz~S0N&B19;UD’"Kc$̉"H&?3Svd\z\{{ y 26~M r?0(QVI̶5U~L{u09)l ] 8hdK~daֽ@ɶu+ n\3i&L΍wDM: Ĩ/@)zyU|VU]ռD9˜U1/޿w s)W )nvmۥ~fl`gW\H#Ew"TzZfHbPBPY*Eo33$B8Bb8~PEd%wґJ Hh5R H!¼|8??PБLNa!HTid)ϗ{92%355eXcʽI B$B&/YR<`$#4Iְu fO,7nL"IdJeƉ9x*@Hp{084V,@:B uVjoZHo_~*tYfde)l֥:zUFA{Ä3VsDHPyĘ4ԣSsvltͬX:qD]PDǎ&ŗר \>-ގ+N4y'7ߧ\O?"xʐC$I_t׷TKXzx`Ba诡#c1Xj2|Ej8u#]?BH`U,2]Ë1?P0ΞUM}1CJԉZ4ffҗ/'9ǫYu/H`}H'J阻@Sފf &͚Ks"02keWtje'e,ƽ|%zg=֭s謭O23_NaR&UIT,))Jbtܹo߾͚5C6Uf>>+.L;iTYÇ voRH_:b}ԭkIrg:wܣG}ztn2qm ~i $Iѱu?>lFnfqwIIIo |:o;Ǿ)솮{+>W~}W.GϢBCBPF<9Aaa Y:x)qϹ 1bĈ#hfm8,'Ϗ۷μ!εs^j].Z, .(obg[Ӛ'K䄵uϞ=ڵko7@ L&sTdoZ?Jh_Ls5t̉-cU+.o8a„ &w{Q^7P.}MQ7d܊?J%ҥ.R{‘ӷ;6>Nx-x!+Bwn֩SԴ6^sXV.cQ(}KO/R qܯǮ#,F(6%Nj,,Oܚ=L !bJ5&XPb`il%{߫ILNL1jDKr.ˇ$B9yr_GJ#a=&s-FzvVs7p@ߢ.aXݗN!}WlM2e6rKL|y)0Ƭ|wP?]8z聥wv-)g$!_u"o:oX;gcU֕1%F K"N"5 wc\ b]U$ݏ3@Sݓ|,+N̿mվCQ8ܥoڴL=:tJze.im$O4С+*]c^;镵e^ЛMU gI0w)c$>S0 bGFRz$igrpG:o_S5HdtHm~11Qj #GGS6[6St.";eBɭLHs}1(~v<]S@ Nj!8P@*98v^p v.WuKmsO$ot I^|EfLztpZYS IR2tJ07QVVV Գ7u12fzҐQ%Ӣ_6m4]?a=&STiKD>؝G&H z@guR*,YLarO.cFO끣)[C䟶j1Gqܜĥܿ󿵡 S}Ą MK=Bi#U*hS^ζb=Ԕd?eMZ8㧹xykB(¯8ǥ)翟Ax" Ae]Hg;͑3ٶ-E7@`y2םAYHaVD*J;u@>xgggujۨ7!5N{Guo%gMJkxɹ#! { X[gwH9v+Ek6~ds7V_2tt ^_2vk}v?0NWqs~uryX0GJI?0})3b@/+cJ ;|Ghߧ̻m\=~]ZI< :cVMyuc<== ++KhXZPr pA.8riRͤ ]Fv]6wwg ox̎TgIt_?C ~h+J5H;mĉR_K+ w(^nw8kg5u%!~^-Y It2eJEL {wMfffT>21h]NN`0,LET aL ȥJJ8sn?9R^Ni̒V2ښ41Q0p Vm2 S"&2'r$ɞ=tU<33ӓ$IX}Wuy]{~{mjIn68cMvADf׷"$$$<C&LJ;$$t(KZlY\\ !Wzl!a +_6U_,;w.>ҥK7Y,VJJv64hZ~blSBB7sT K[n7n5i4hн{ٳ;ws~nnnP}HNNҥ (0-X"qxx'u؇!##cYy/sS$`Xpz^1OuU/>ȳMN`3as5oN,^WL*ԌD^OkčW}2RR $*Jdlq-xbQ7԰M\>{ܻs8հaC{cS~(xE5#~2udv(7ГX.a .8:w+.6s04T!H%`5V&K:̢">MVjvz;6BU**ѣGTdÅՙMXˊku{R[q zׯNSϻwӭ4??E BGjnݺdx)LF "111VVVTF۲bϷp8 oTM$ .PH֎8 *fff|捶tZ$p [OCɓ'\R睌 __OZxp:4g&yY4^vU u,KJ ::69ܩȊ8VR?{NrVYqqE:ʺrh !8Y>8 1^?5XPWO?AV^X6UQϔ+`Wji[*N-d)ۺu5](𠎌Y$bŊAgO>=qD $ u{L5`'c@!1Bb677+VMtÆ tu_[*fq+,6nk ÄB? HNKKSS7Wu>ՊVVVP$---U*Ք)SΞ=K<BUn$CQǏO2%::Zjzꔔ0ӸqiC޽{ovɣ.u܍A#G|Ǐ!Ժuk׍ & 477թ &PٿkYjVoܾ};Ҧ޷ҪU`jjxZZ΢zI,A:]?~o߾:o^|yرR^]xETPOW*U6Goҽ|c]t)eڄkWeDTZ%-eV+ԪtdW+(*~v]2\ }Ms(;9].Nj+O4WO-Ti$:tWx|ծz_g>5Nbx׏ʃk_mmm+ҝprrR J$J ϶J$YTTXzǣN:uɒ%ϯ"MM6ivqqyB˖-r[nӾ6FfHaW[J=jp`2)<W:X hN&pRrF4}2us昔1=0 è\"|}@F/5SuN5PRǻ[e FJ +377ֶۋ/^xQk}OPF&((( J4Zn=d6m?T|ExjJVqfeeeǵl~0ڥKabb믿ZXXCGA:wVgj B$,,VZ+ th=<< ={m q͚5ze׭[;q'Pj*%o}PأG*GVi|TKhu8r >, M4um +!9|… _l/Ew * ko_JE=~\+lN *!t6DBBmRTCn QEQXh!*UmFrϧ*"DqqU*6E8Qͻz_3^ ݻwG:nnnW} O+WV^rE] Yׯ4H?+V۷/R"/^`DϞ=QR`֭7n B@o3rZ})h?#MWќ:uJ*x<ފ+pYЮ];fxJppڵk(Xkk~ U}`ɜ9s|||qٍ7pQ=;v@)@XX͛њfgg \9Dݒ#HPȎ; A*q4M{SN@kkkk8kݻc bժUv킝vZU*ծ]4h,bXnݺ-[lҤ 01110ѡas_T>hѹP0 0"I vL2`Ȳ\@f,a(1 QIEhEAOmIfŊ6胃"iF`uO24۷omJm԰tTs psR8egzzn4q ::ÇsoKjjT*DeҤI__mR~qƭ_ݸqO _ѣDdZd4t@q( C؃'NFl2P8exPxaZ-M4MC A鳜«>}: ?44]v èjT*+Zii)˲>N$gYUyeee,),Xnݺ/TCD *|>a}!'Gw ŋ1I# d2h14?I+DcD{5I&_S{_Khlu1!4 g&>B©F7is;1oյ_ϱ]sxH3>mmm >;6/xkv˖-,lF!>>>Э+!oooL.P(d:A[ߠ̜9k_ѾgϞuiӦ QVVh oϟHX~٨(4N n4M?z(<7p7o^~Ν;oĶlقjcGFF9X- w^ԩիWuu:tÃGܹڵkFt6d~G+~:tOfqg]2ҢgN]Oza7ԘC3oFmۃ=u |ٌ㘲ϟD܎ÑGƍb(ںt !_ _훟T'vaG肘 ͨ;d~|F;kz%&o;iGeP7hxr,Lv-hT|&@o@.1M!>8Åu+9AFȜ Xq,E'O6ՊF;>MyWdML@i)kiYY8''''7kh倦߳?ɔ!j Lgim_ &"P{wCA$EQ<:kjXţSgU  }\!e\2I;+}Z`9N||+q\RRŋK;777""^aÆ[/jᵽ'򲛏޸k /zd```xxG/_DVnna/^ܢE \>a„ȴR!!!;vX`c q111׮]8~$Io>((ݷ]mx4^ 4 XlٲE:;;Jw̙ׯ=ztѫߩRjwrr߿>gu".^ح[7XjժU *fSSS;;D899@iV+H_'kK,EG(ԲeN:uܹK.ͫ"#'**N IDAT T$A;w!ݻZyRYag3`?bMŇJ\\ΙT`Yvҥ憈j.L6M,;n߾ҥ ֻpj8͉e Ϩ(LFVOQ_RSSZСC;wxb~ch4gϚxM ?UKM|gT a0mش}Mт[}YƫWݏ?mu&wN9 Y]?3, }5R|weZSTT)#tp!楤lǎ(t^HdF0 vOyMHWALw+:rm*  ÛsQ)V:jѠǚÚQ)%V]Gyh> #h3Y< J 5>//~ 7fA 8HThxZY7i-r85wSoΫuG@o,d2CAؽϟoݺJڰaC`` {lZ]^^6_|RV\pkڱ0l0C8y2[C#I\z5͈#9U |L:Y7`ߠn߾}R1ٳgϟ?ĉ{Vʆ8D2b@%BG JqJ;;;1%}dObbԩla ;V'  ߿Aobcc(J[[,͗HjYf˲7߿?˗111vpנAѣG8pǵB/+B{ptPA jP "((q90 믿F"HZ-zsQ>92>>˫G4'wp%o@,WWB ; Wgnp?BU36 ?_72thزIû)G|;{{GEGӣoo}Q(8묩Q bt7׮ۡMmM4FM9@=Y1ƭP`Mo9 HO^{[ڞf$I2Wf<,:uH$D DVDPD+iQZDjK Zmfff.λIzNR) ߱ B&=>(}uT4=yeYi2۷k4Rdn٢9s@הH$Zv"W-s37o~qX8B+ +uۉI Sq+4$@UW޸q#΃y!nF rwꊖ<ie9 YUŹ=Y:īӁ!O"t4n_vvgڴlH ыNNDiԨիWǿ]z oƎ+5jԈypo){C9)СC^^MB>7oF H$Tiʸ0 eKs&ֶt^8DAAAxmDho@Z- I *,ѥ|Y`2&ǚ}թxuRRRYyY.]{nF m|󍉉 Rm|w J_㸸jVV,rANE*'GBk?AՙUyyy p-Z/)B8^^5IkF^ ٳqljb%%%֩ւN |Wxݾ}/١+}|} ,ptt޽Ρ۷oGFF…yxCA`dbbE5 |aACs% /#Ү_rqFڼ9{s[*r ̇M=.Ӫ d|^;/26:eC2lrI'͠&W JZ$ -{D U1 j@|Fu*|f# HP&dۛbyMG{RDg (LXDT128l5ʭoS-ײ4Tzi:rI643+##c|>߱73Z.}ԵͨQ#iii`-('/n'Ty͛wMav>+idk>/")f`c)vpv 8]6xӡe˖%P*Am>Iuo.Y00Ӆ$Id}OAny{LHS^g)JUr g %hUa_oܸo[gvC}l\=78lwb"%)) ҬY wo=ZJ_>3:LHF{Q1kٵ]LWYJV 'OƩB®\>sѽkβ01դϟXۯRRZ.SY Q&ՔE#@#+*qPle+Ѕ8Ll9֡)ׯL*9uhTiKV-ƵIG85?ї{Λ7r !!2w)}3gf߹w}âB 6| dXJKKB!'J[nef[gnߦNe_Çmll V~sŋmllIOOGqDqӦɓ'J$KK%Kڈ&uR^RզH@o(LH$ Bj4Z]^^^TT?B+VԩSG$A]\d2++իWW&Ure˗/18yza^z7'f755q̙vxEFF,W8<ʉ];$z)8srrJHHT{ɖx<˗/4iM< axy֭o߆@> cJz6l~W4mtǎ̓3"a<,kff`xѣ-;@5Iq,<Óy_^VV @^MYS'$$R9k,x#X3gΜ!"77[n:,???T$77WgrJnݺeeeF~b/*[7y{DN3wVn\jAx1C͈'1@vwlVss[\*I\gƚ歋/ls4Lf48'NJ$2҈,X;ekwF7?xo׼,/\(Ң0qqXS "8^ oWȦʴ4L=+2E'}Sz"Ar2ɭift􋼯a}q2ž&ӹ^@+:魲a6S %(Bۢ".͛yu\yaÆusziCC_!.Iխ`R6,]ݣ+W^AL9ikv>M*5al{ڵk8 ˡOgg~xGװSgW (Qh`aʕ O,}m# u8,yEp M\ETϣV𳖩GxTa%={W2dؐ!U 0 $V[O 8 f\X{_p8γ~gMG'n]dg}{,dkU\Fs]{wPNA3!Ak+{^ٶ˾0uDB^ ܼm۶bҀ,{ʕ2JjJD"E lmmY3nhz~Z@4h}!:٠kܜfbߏ0WyR?w߽>tׯ_K ZիWRR;J$___< ((ϦXhQAAoÑHJxp.|7YׯP(4^Dϔ#Ir̙?9z*--?`ҴFg~r`(Pz}`6'NLmd8a&Bs 1RBBpY.dsޑK?/Z[&lcYݵ4d% Gr%Aøo4jKi _A˲:t.APUM- A@QR2 JŅ*)1) dTYK5uٺ}:u%iQK{z6Ө59ϖXR55!TWyY1Plj6/?YW*ƍ$IZ4QY:jYXXy3f4(yS$ qRt47iPWP➕r0)-t0ߟ M4gʨfvvB ܻwgYa[nHZ_ :87%ڭ yp .ҩQ7%%%rZpUΆ kݱ[~ EYYٟ Y킊-yd'J\яA;26lخ],< {M\ClȑHxX,Ŧ L&+))AW,K; D:Ӷ,j^yq^w )sWRRB\.tb⋋||}9{%`rsse2H8ϗ&d+?;a$^E֭x&&":B ,80,NҭŤ z `5vtt o߾Jҟx&le x"aiͲJ*ceU;ݬY3cKKK]\X kɉSPkJ|}8?v0`/[LuO]vEU)N>S.]ȑ#Sβ'pӧg͚cNaÆ۷o,بQ#Ν;䳒$YYogg7nܸ7o@FiժUNtV018׌Einn^XXәӦM!@_T*U`` l~;pRcXL۷oT`3 SݪU`YV$>}߳\z^7?}Ӟt=&. (_vzN ZYvL%2`+r嫗I8pt=uV#?ٱ#WxD%oL bd"3k\#B@O NګA":][j-q$R:=Pc$I,_*Ʉ+: PRe?Z(z6|yA~#*+ʹ-4Se  Lljbp"I-usTy |>pK.W\U?U1H#I61AuR雨EEEE(OM狮J2] eY}x7 VVgJϋ${+8a4]#`, $EQѽWORc5t5roROV9,pN,%%̡WޅN\ .OWOE)H^^Crl4◝S]srnf}ʍKX,33+5*dDZ1+ \kGH0HDγ~NCɯ#G4hhj ghӦh" B9sfyy9A˗/_WԩS|͉'`wo 8c&;MTwYv]sx={mjjT*;׋v:",z{{8pСCSRRj?KpQcKN#xӪ}߂;(_rΣ }78F .\u`&KSϹ _b~8O{5ޭ8$T@b!#;a*&z,2>D>T7Oco++cKJ\3]vIH.aMۺZy'vG.N,^m"Ews(*sN?M{̫1`+֠ G40Mw?,+45ӏ~W}k}}bƔc '0o05ԝ@y-iq_GŤއ帳gCxl~FtK~\qϤe,N4Iejj7s 2EYwu0Iyaaaƣ߳8U IDATn5z$٨2gϞENNN΂ūZ0̟oeYV_TLLD=}NLj}3mQQgs ]F.< b|Mћ,:{J9䷨MmHOU>9cƩGNqy+ ")oUZMٸq˹s/_̄ V >ACo֦_װE/\gjjpרZ-**S_pu֍ GMM-Z$H!ֶW[+juLMY5rp5#=L̬h&?QGd+Gsϊ(ܜ5}+;E1'.8qyu$ t[5899$Ioܸ}VTOv8NCͧvtlѮ\}nY,,I-MdI~Q,x믿ZXXCG}6 )fYUV(pA4ZҥKWZ+ ċFzxx 7A{i۶-5k ],ˮ[.==vĉ4/^ )CV-j:??a<o֭]222$NZ622Ҹ] %p655uss4iҧ70#Zq8Ç/\wrH黣L۹|†UK\4p3눛E~VYn7OCo%y:fjmb+gOٝU>QWFMlq9Jk j4|०\%ф\lCymXzl7O/L4Ġ x<2 mR{Nf߼qҥ@T*1j߾}xp2,,l`.D^hhHicvMouȄ6cDP >2',)!@@I!!ׄ B߄堭C $j_F ])qnv)PV(YXTٺu7h4P{tXϽq $>}eڹS2 >>j:i^y<ފ+pYЮ]w_>\@ ^v-%kmmoPϙ3gСiiiƍ8(ޞ;v  ,,lH߰C\. IyzznɑH$W`ǎ8Aj~~~Nj秦, >zAƬP(V^sN9~~~NNN֭&'fؾ}͛3 s}3&Ɂϟ(61$/q[u;vlRR^W8ՀSRN@RE^Dx g lTf-Z%ה^Mƚ S߳,ˈŲdD;'>$`}e3Ϝa*AWqR?_qՕ'@pnHǎo2pZݝ OK3EI9cRɐ$٦M/^$S?ܹĊB,;o_$ o)L 3 Rd0gff.Z$I -MrX/uΝ*ѣGߺu ׇ8so^ĭ**)iٲ%\]]?`GJ͚51!˛7o  Ν;giK.z4͛7_EFFVGQV۵k W eΝ4#N 5o@HHȴiƏL<ŋ,p ޽{CE:Rhah:u_|]vFUVsw!<7oY҇W@ڤ\ i?Ǒuap@*- V~ZeBO>A撥M'Q"V=%uhlȌ Dӧ3g΄(ﯱww}ׯgϞ@Ѵnݺ@f' 8t Vjǎ4MÝ;w <5=Q+EQ0I>æGmڢU\c!18 kB#FxSSS}+D\Ӈ-F8D @JXWtF` pݺu  ̙3&Ej/{YnA6m2Þ/++h4 ?ʂc0{GeВzy '[ɷfO>} IYYYՑ"\G("JrN1Zb\nWJMM=z `RpqkT٫ ǁm7SW7.qgYh*jʔ)бabӦMӯ_}LP(1p |Zk׮ Dٰ {J|5n@ B0*ѯo>RTϰ.Xoh_iiip?W^PPP:u֭ {X@u$ Ǣp' # /Y,8s ,SX+2l0%jt %&&9R~H׮]J[.]VX9rHHHD;DV>O o*? >bIAAAAAARR[3 S#A@@/_%pwƍgdd^ƍՒ8Y}):Ǐ߳gEQJS1L}$If4A :(**l߾A!2Px%V\ GѕlZ 0lˉcݎ8`h|R~qɔFf̎04KKͽxwwߙTA`ŀgb=Y'hl!jlj#lݺu!į=:jl]p8pE7oބa,44bPkdoZ+XЩS#GcH`M(޽]]]5{jj*x ?ػw/̟۷A`E$%&&ďbbbW^ UZ-Nh噚ʲ7ovq)m׮}B^R$ٰaCOOϑ#GA<14?{ ەxzzB?EQ dff,--kɲcxE?! ,BFԌk׮ǣ<-))iȎ͍Wnذa֭6 Ъājχm[xq-r Ə߻wU juHHȎ;,Xp1ŏv먞ppo>((h͚5PMnk{-[hZgggpBȎ3g\~=((h~]InWjÆ S5}􀀀@vT|04k 88995 ,|>_B6mvZhrX1j piӦM6mڵkm& hڴFi_~xWAdddԫWP#""JJJJKK޾}T15hU?MOO///DM4^spp,ˎ?^"!RXtIp0\%%%2 a|_ϟoݺJڰaC``m:ZrJTj}}}7??uɓ'kE p$W^=x`FB?iח}֭[o߾y&B@fϞ=|{{'N̛7/==G.H$jh\G#?0sUҡC1ca|-Zٽ{ƫ]>נA0Tdɒ%9k׮ fQX5 }#RBN>6"+AR'Z:?(.vKQl-R^b|888v aOBJAcm䦦/_6er޽l"/k|WÇ7xaϏ17 8[|={/^LNNv|Ȇt <7nҥG'6fU bp?wܼyЮ7`dff"5sVfXqУGT*E4ʂ_*TX$Iȶ 3>t!'C-2333}YG5j<OV;;;㋀BxEQ4MFZ- n|ĔGh GGnݺm߾]dgg#Y3gDk:KJJܹsM?~*]~}ٲejg`Y6--MlsqFs0:tP]ՏԈC=z  >}]zU!իW/X~3f̘+WB # H$JJJ"ӻwoVy oq"ܹs:?h:mTJ+PoްDN"Z2ɩ6:ߩ%WWKI-RxTQwQ}/ݻW^+:III8_7n 3 i&|hIOO 2jǒJ[nݵkF!IrӦM߿u[ŋaZ8 |Jyy/\p޽g9[N߰y5Tkrggݻo)EQ0>PF2L*ryyy9q0azaݻwǎT*cbbRZVTϞ=KMM4hԩSaի]D"|oz9 x}B449bbbӓaS֭[wرA F&Z^p@ HHH0Ap۫.$` ///OOO ƍׯ_ogYY?;-aRRAYд""1119981 >vɓG{{{wԩcǎ| k3Uׯ_mx|}}A~uҠA _p%ݻw޼ypΚ̚5 V"ӯ'53JѣxVY=hر#2A``%K4 `ɓ'䈾^Fe$?ce2 y8cK믬=nI&?(Ast Vq)QN8aذaógj E5q`V &;wnw܁tFiiiӧO?q~3~GTggg#~ ._7+W\|&eΛ7OgdYvԩaaa8!>>СCJPo&˗/oԩ+;``&Xu ŝ;wt2ZO?o3njLf}4.."dS!8ɓ'SN2eʐ!C-ZԩS3gBwKJJ`6rWgP088xǎ:jb^^5eVWd]GxUd0 c޽tC/ |~ۧ?T*ԩSܹa>͛'NhdԉuϟClQQQRRҝ;w˨T'OBȍxI&eff>ܹ{X,^nݷ~kooOe\l6{͚5toN9;;nݚtHJ]4˷nJ)mٲeܸqt[jm0q)u: IDATIII3 ͛7CCC| AM̆X,Ev̙Ç7 m)M1  ϟ -[*tQn֭[qFhhSpT=RJ޷o޽{V |6(K&--Ml~$ZXX>|0D"sVTWI7 "]!!=LտHBG:w۷o۴i#躰 *(]ĉ,((PQ ?RH&"vzAA:ǎ*hS8˖-#Ek (x!JTʭQ;wʕ+I 1*I)EѴ4'''===WWW@ , *9@E?|@Q6 &)GRTd2J)s@wyBCa-/ȊȀ\/NJJzM=߿OCßǵj,JY8nmmF}7ArBokY6>* E%*dC|?a~=g>|Xe0 bbb"###""Hx7o*~@@y%a9{Μ9R488ԇ<tp8L+W#ciŋSއ9NV!3W|뺩ן7or4Wvƌ'QQQZB/un) 9Q#࿈57ce/E #,/O foӜ)*̫nb>%$P5lЊQ.}%hiq_ʷ=v `oRuVt^!/2|C@BT_U99QYګDjSlj46eq/S_}˗B>  u8Bt x``ɓ'%D6IӧOAUEE%K}2'a?V`p`T ===:6( W>r䈂}PCC$`9]<|[ ~q$22#""'''Z{ϟ? qGw+40$ufqO8!\{.''G"yϟ333''' b|8 :O*V55hcKP{؏)[d}ϸX|th.f7Ln7~XZo}}Bbe Zt| ڹV]=(kvàQE}~^;ǴDI[|ۯ¦˨xv=CБsXb:kK111Wqz e9 $J333UbKK .k.H֭['Q00|@QT!3aׯo גduG8>{쒒{r.DRpݺu,m7ŔkWA9Mm%Lo)DHP/^&]0խR7k`hhek*mup@6NX\.VUU=ztرRdRN$ ژ̢ɲu_t)̷ki0 !xLuχAXYk~*IH>U]a],/u6߸9ʵHՑs`5,#R*iq-1@z/IPTu=t8 Sj-J

w!**ʈc4$$43ecŚ?.A54=`֮IrB;w[U!8f8`P] ڲj<ʋ F wRo֭oAPEI2|*ta7ݢ-[lݺ?G^ |)hы-s۷oS j*GW#_g{iL"S dӓc$M&0Ɨ+w*<ʮR?`kd2g1!aVlk6?&@ л3bxSKk˕'0,K%؎ o!cL2A|J *h`}3k f_. 2T)@?Ys#$pqb< I gb|8_+Wp{̀c7~I77O_4r8.K3n ;c#]vkֺqÑICw`N^~uo8DB1'S՟U7-t>uC{<^r~{7cOח/hq.=x>ڪ+@o6qwg‘;~cm âk$~ 0Q߂G!/3L\C 9r$=޽{Y잹nkc<*7sfwE,ןY___,e?0 ,sɢYR.}ڸq r |V23hX?v3n)]áSYYI$QX߿Fؽ{=zӦM=TF'E{j0ck6{)uo)zOpԸ&̯ʕA/T &Fp# Y8Pyǹ / V@Oo15J|A{qA!zЙ?Xqє}Akա;L.ZG7vdL;ё3 >h y9 nEd4XXN12R2@-kҧV!!/>{`&VLN!?yXYWR8)˹Z0(CMȋM`MܸmݜN$nPUNx՝HIwߺu֭[ߔmP#p.\s',^ &p犦ty pFn ޅ-A Y[{Kıawnݺu/ H 'f wΞs}>E6v@''O_=ySaq^͊oޱy ՜W =pd#;ro;xwX_}Jn=J_<{=Z֥UKɷ%r_8~,Q׸>v5 7ay/]"{D_ awٸkaےOelcknX佊zS%x۶ޤ=xj^֌k7wA4|CccCCvW^eVyh,cbbHd(<)eY 6ⅈϫV=y|lYH~[$WB8ʘ L)N*loz2= 0 |p\3G-++3kkOΚbO֝S#9O} iTة!ԑJLN$daaaaaaXAE֭<<<6ۺMֿn=1 MG~;wҫNJP6oNP1*^%ǜtwI󶹖% /PgPYOsۛ ][~ӇpƵ.uMT 8AǮz|;VUܻ.HZuD˖-FU`]vUܽ{jPgRFPgdq}l 5Yde1 Ѩ^ 9蹷ؾss\5]E~ե1vco2%{ll'`˭'zڋ,hY7:EW KanHͻ?Kjx<-RuPc@Ahd|sA" ?3=,@p:Z0CCr6qEYY\n;aКzs԰/9.vtAf &v?}0$w:;.B B~Y@tYeJoY=1MˆiCl O~}~i7 j(ȏ\Vp-ͩ+(ɷgp1linw;L:8E`Ens*SJSv{W9hc IϜ8b%/Soy)lǫFZ;J/^NQn_p 8 _9qE_]h1xͩsW6y{ t>z7agN&n7յ 6)/{ŃNՑ{wVZi;sx#)"PT>[Iqx[gk.PI4k֌N Ebf7eEExV?=~͡sē!N>mccWa@>ϢG}(ZPHbֲD"Qh*u,7 FفzհHlCGɘ1  C!:,?=E*p!C4/9whO0Q&S=Dmfvo|>BDG?y+ݏ~qn8r|b[ҥKe22b?*?~CԌlkw_~@xmN , )(k.]P%U76ʋ =Qe%f`;g`O^WLvHOA[UY)1qrw7m(7,V[YI q(z ru w Q)sӧo۶@?D[ xiR1 6e% U YWxd.1/#f"ȫ7 ZW6EDyJeq8jTv"݌)F\ǎl_Nyd~F#cʔXc0D09E꿜*Qo/INJoډۉ*X'x߲vǂ* p@Ksoh@&++{Gsḏ\)@veFgY\xz?ɼn`oGW&@[ua]~˟|^8zq'?0X-)zgeϫa|w~͠Oϟ9{pDt;ʤ2q>-W7 5aJjiяQ@:>@Q}byG^_DfÆ 9m U˅ ` @Ъ~5D]*>Of0K,յQ,Ǔ?m'#~y+$v A,[ Ӊ $Lf͚edd(y-mB 0P.K_q6n0٣3_(tRX0`x굂4rkd|=^~3,MTd չsgoo{te\f͚-Ydɒ%Aܻwѣ(&H$52 q-@ɩFVibi;7  ȫզoѣ-P----XX,c׭-=XEqIv>ꢮV:d7 123,-[X .ѣG+O"F4<Alqd2X,n۶-e@ē'O4"b„ ǎ?kj<<<Νl2իmmmϟ#dT*J%\.uvv&EtwA=vid:2~7BΘ2Ugڬ+ENpƹLjfNf6;rI[]ߠ*cuؙ@X-R0ifeWʳ?Ȗ9K˖c;`I?1ןX_~D:k/b`(?eW=8˔)?s!XF~lC$NkJm4sG|Yҋ<A'WyubcE3zco&F+b.ɪc0PpKB&>Wv5RF5chIQ޻b"mr N\`L?.//x|lxn;2w}3$ W*a! 6lE.=Q"7Ձ#G٪U~w?gg|u5cd2?Ê?Se99Njaih0mz24rnwmZTcPk5 ڶVFal*9׶դ qADn1_4/2ӫʕ+wj0 4%o3Hn|GGYdc\ -QZGC_`3mۣ:?|G9d^jhU-UH~1 _+o[ɉL&)aB8LHI;+_}#M<"ix;Sϟ$KZu{r@yÇ s/N$9&$89k%g_Wު1L&ŀ)b΅Æ 322RII<`0rF8g}BEuPYwMTNpyZB19STJMMe1sxz<5 mMq D"s J*Z[[ ;wC-))R---^+Ű_vMkD}Y3VkIzӼEA>eټ cC5q"yVvRޑ&19Oex Jb ]G'a)@g驽l͉ ğMɋKgrO!ӅXP4$f~sd:2s6C`7|h%"K_<4É1 @spb:kx̍gpG k7zK'O,Ȼ[07n8>rPcQu@8edN{k$*/qϪkI'u;ͻY?ǝJd9Bʟc%[폸xii!<'|@.g;| |λE~?{o<~Gb?@}I7}fⱇf^IWEWYgO_bY]4W /'Z$$l-ZxFLjn^<#p+GшڶӨm&{qcƭ;|9 g[tǔ;wV4elcfarOD]<{ y|&OյDܾH؈ǖ-[^~M1Ǘo >@J1X=JoHf/9,fRA @ @N[v BQhCbuh [ḫ>>]Z0P\:a„wOvϖMTWWg~7ΝSr\܃rEt;>絰ng<|6K+9 ØL&ApK!vݻϟ?EʕOtXb8,'O|葠ml}}áMޓ{:E>Nϰ^";ӽN~:u^ zϳ/ ӎWU%g3wpL\Nޭ%,&J/r|Æ Ӄ0P&e1 XXѳtZrtTT7|COxݻSPP0zw;Q*>A"=&&-YnݥKP5Q333㽼TϟoRۯ1"j#^k'Dm,팴78ճVe PX«F\,yeڣrg)T2XG ሾ]8yӊ3]OH6b+8lt.{v{ #Dj9S/Ys Co"իEڶ1h&xM2 zy(jkDԘ#k0HQܯ%rѼ}*9\@ϏE܇DxB4%bO(P=[kqK]>xsCUO|pˎ)xI^ f̛6@~]{ڔ[kN;a8 >\_sg `7CG: ^|0y^YLQ̖fٓ/giv19GmOA\se=NH<h^3Y> c9vmã*mZ`wv8J8X>[Ѩn?qpso@٫3?ܲ%[LpB[Mh~T o^ط9fo~ZM7?HW<ݥ<񦘍ԎVՅoZf}cG[ҡ⚕H :tqaxޟY^Zs,QbbV:vaGc ct&e"y'fO>tOGT,(nɸqLûw{rbO?P F.6w48΍zϘ}[nw<232|ۧV-QM~ceUD18gee%''ǿz*!C8zԞ֭Z;:J/1e>ӧO6mȐ!K.5k͛7QE===D|ٲeA c|fSg?~{^B~TSs Yaa!݌Ϩi~kYguK!Le6B.r?]mYQ ii1HIIA{x*!=Pd}O/ /oT?vҠr#iaƲ;B@aڢ 6,@kvsF9)&2t#xve%ッHII{nqq1=dr &\z566vܸqNWUU;vj޽`ðcǎݻwO!0\<Pdi{l3}6`PØMrHﲥfp R5p ԶJ9Vy; \ B/he.%ŧ~Y{2&a#U78 xMmG&kqQy}}\ 3 xJJHT 5vijƭ(69ϐKǙlCCJV203.M r  Zpqłe0AkeUDdQԛvvvఠHh=(\.""Ѫk($r9c" sFSA)/TfSPe6|>ӧO \.eS+JKKK.6$5 2SK\C|H嘾AXXVez. gȭJ@},Xe?0T@7z]@pn8ޮ];K,߾}[UUEfaqq@_#&Ҫ]TL&{!&QLR֭|~yy9+Yiܿ 8DUH{SrAGT倻d9,bƕBJ0**l6["uqS陋eK͈kL2t 91~LY Txˬ qQ68I{ AaORɵҕiwFI8J)KI+Zn|BéPڌ2Ռ5TXNv\.rEQvҾk'ҰB%# N=, L~^4/ Bde28})U0uGE8K _пt^m߰ pctC#%pqmQoU<+DP67?9VZuErG'=)Y燢$JO8[djoX{Mת7@# Š5:A! t#/fБsM^ )9*=Ӎt#HG:ґt#HG:Бt#Klԙ<*gW~Q;nMiN^Q!vVnOaNJ)5,->6I  Ô'U>驳Z.K.ePhƭM_wHG:@G:ґ_}}cǒvaaaڠOa#kkBuak 1E4D{:ad@ɗ"YŢ)o 5*TP\ ]]7ѣǛ7ox hiiʃ$4 J&)7L&Imjj|!>ٗ@ A?5tD prn_P t# 2֍;3ѿ(ü8ܹs<d䘰SO<1bD""QU 2СC͛{zzR#CIA{-CwosN-\xi&PHG:*1!s  N>N{A\rΝ{e~~~7nZ#6f̘ztKvwwѣLj#:wL/s̑J8S W^/_FQO>߿-U|E1e58у{5vرcǮ\رct0iӦ+YfǎH)"d##=zCi&__ٳgر#0ܹs/3[[[Ϙ1cƌE,8NV={L6|rAƌCqԴ}d/_|\*ʘBmllUyii7}#ct#Q hg/} --PkF2Nf@ YGm{˵GrHM/ݶcA&k.OOO{{5˽~/gkҥ G_ѬWpM A[qo߾Wnڶm'FGGcbȇ6m 4q#'QQQ <_)uX!A$:&*8b v^'q\ xT'9%wwwCCC*˵kbri(8ښz- IM3z;5)Qc8~x֭[e2Y@@xyy]~o߾={z-JCBB.FD.Ss`~$ƍ3fPY)a8f <3<ct-<i¾Ms4+3yu ?́/UfcVޮΡoQi?{cw1QJAmf]Tj Ri۵kפJBa\\ø5k' ɼ)jWc:sqqyi Y`A||<=i f.heC=a>8p`BBH6 mllG=|]\\B<&kОsRFMO0hDgFa,Ǐq^xuuull6,ofϡ|P@OϥUr \x{ԩ䟡g*ܹs\s$d25*uΩ2bDbbbKKKxZNݲyTϕl,PHG_PG_Gs. >f+=Gwu'L4ȏ)~۬Y3ÇT7h g˵K*TfGQDDuZ^$e@<Aŋ*$EDD\KKU6n"&!a9K4efq@N'KJK(Α8EId`Ǐ'777;;ԔeeeNNNRAd0L&T"oB^C~!eLYZLJ >c>S#C!zx(dBzQPPLZ|򊊊RƦ @͛ǾxAٌ(a@yTg͚r^{w{x#L"Π 9&A(p9ADAخ|LwZnM&M:5,, a0xrk"$YGDD0zGuȾ݌3m{ΟA1SܘlI/_N%"L.>ȈJ:~8!˕=)Qc {XvmĀ֗^YYI1* ֣|BӍrBJ=q|IIItX<{l".\Hm@peA |||jdAФǎְyho%UUUUWCsG@N4!U,(k!ij5j M-krtEG:R}F_< lotSLsvmPzʋb_n3կmVx^)@?Y/i' 6\ǦP&BuC{<^r~{7cOח/vݍ+ ړν> iQ3`s\.W$|S>Nf͖.]nfN&TWWK˗/WV_-EC 0 }l6.K-nNw2|EiiitnPa;|԰^x$ n%n&vT퇮:}j3.|ui&rM 2L"JRiYuA%o$ՁHm.;`X8777-_EQ uxxyV}1ƍ1w/:ujDDuҲU݌)uͳYrj]̰nl A. [ҵkWL6=wIH)Yc*+*"ϻ,zC9yf͚GLI?tS& e% }kJccchy;nqqqЄ1yp")@pi?: FUՓ['fZ1uFFƀeփ&~ҳgϔru.`UM@q{*(..#Q IDATl°TiW\ ul+qJ+{VVVrg-ۼ${.2R&#-4ݑydLi=/fe[k'޴iF,_~з1Ϟ k/W ӷM"K?6X=rYH6rR\SSz<2p 0͹5usV/򘔤ltuo['MtjcTHOSqz5pڽ^]>3{Bc8m,fm:#QdТ9?dZXY7R4̜缤PS=]jtcWA˚)B!/e$M+6^r~>;$17'@Ⱥ K/Kfo\pwޫ7o8 q nScpx ܹ܍ wo0i? o, ,e[we#FP"TDȇBee={\0! u:A#< qL>*`y*9ltkkqFn)bbc̨_ȡ2}ހ<{̵cO_֐&&\B.Tՠ\} K MhD>>>nRW?G{IyQv)ѢE8>ĽX02Eژe%wVTdtuBef)$-=ð~7wq\p 1~R˸V޺)HX 6\z-]DsM;~?L{5:ʳg羝Iuݿw)nViqiU^T6$ܕ+tҥKg~ئVi烃 DZS$tzwޫ߉M:{:,Z89^#cZX#slp"2sJhhh;`t~Z:Qi clN}ߚfl@DŕL5kxE15:ˠj6߂d1c@IYIoo&6oԪNɤS۴tŏ+ cTe4]9::63,\9FT:7mĎOһ5I1/+q" mqH:r\zmcc roɸβM ^7ům)C:t"i\QwN"V #Fl ;TMT|`k4:]9@ѳFOo8P|dV_޾u;W[">ۅ']7:Oε $-@WcQnowh<ZAܐwyi*57}4[ p2wD@~:fzXt`plђvœ5Io>gi*w^_<O]'@O=`յOs۸K?GpJyg4(yrxp |҃ dZYjVЩ_yAg͝eWFa lvwdg#A~2n| q|TbumCZ d%+qdcb YI077w CGdŊ&3^z\!7oػ_3L,..nѢE_rR9_n/++CmFc.&EJڟ!A,-˻9 L1/[d-ݾY#G.|*M~?UP(q˻Pw,Ǐvuxz! 51;u؈qn7^1ͩ߀>~|Vr%An <2y}Ǯď(z⋛nC0Vl &ԋ{}3u̙9s̙3 n#䷟]=n5[\iPܙCmm^m3s2Ur"O5?sޓ9>츈zcsS:mָOeZN =o`@74A6u[EԃҔI߭K}\=||-~n&NR0V5@YU}}Q6ŮeLпtD'@PǪ! ɱ]LGeҿ'+i'Jo',cL~ˮCXcP)e8 97Uȣ+ޭ:ʋ0m~[owj5љ$Jʪ`Ykʲ/He%xƅUO8 Օe"O+!Jȵ{Q/9CߵiMMUuJ1QB|Ip)}>OLAhnHHȍy1bsssjS!_s a3HHN#۷ȡ}';w>qb7w5jt:s8k,> H@|qҤ eѣ/2 Θ2ηUIv9dʜOe8۷:Xq\.8TWo9nt;a-N}_=`̺s6*,J{wv圠Ξ=X_#j1D":{,Ay)ExL{?~88 --uPdz5*օ) BØ2Rs̰-._܍1?;BAvCNo?xBrwpy@Yަ[g!>}vi<1CYP>jg۔Va%J5tв{S~^2J_GN4>3 EYowM7Wo+tMUF޿_e9`&rbjyQB_fx{omѲu.bVZE=ҵE%AbN@mQBPP2ֳ;9 K >[rS*১e/]K.glɒ%9[a f(K,8(vG.H{l8.sY2ۛTWzeGEE@*۷O ɜ6w )?#ê8w0''"qoժZ$WWאh\q:,aXZGkCRͰ"ӧO4cП?֏^d?Q(2jΝԙ??;v:9^)HH  }||bI~FNBH|3oAߞsR[0Sv6EFFtv5j $7+<_7bVҾ.rGFB=l]om #%U*U R RDԴiSȄcǎ9b%/Mrr'GJcf2fk7ⳭWշ7klyq3P?VOwU$R)S2cǖyÆVuf--Erω]$D>GMVZa[:-͑JIm BPȣk9v&y@o7xjLˣG rAGO˚83J7o9:7mVר':Z4Єe~޼sR-:^z&eK>?lc<֨QcXfz{[|гS qoى_s$&zJ%knlj1do[/ؽyĖ3,bs?1L^:ʧS(Kx{_ Bh⠼ `9 R%Dc(*0kq"#9j><%OB]ͳp qJ}ׯ\.755x"F2m!PhJuڵ".S&V~ jiB:t bm׮݊+n޼mۮ\Yٳncq8Xvv޻wkmmm_zBѶmo߾!zQgϞ׮]++WL<7uTJL֬Y3f̘&MݛhsO>,լYӧu{p}7\P'Mڸ~}Y$:J(!,bŊKܢ-Ç?r-Z"c1=3Y,HI~!>WZ(-Cc#Dj*XRծ];::4ɭ[g&MR/_LD3UVEDD%pĨRc ٗ/_>ذ[}=*up$RUV ~tuUemyl[3DZ뚆|:yp~[OcL V>&TӯUjoUڵA?Q(%QVheP.K8MY!}uF5,n2qxzf,QKfKxY놳͛Wd5SzF8;;80C6J-ʋ/_R@R>"`.Yti%שSϏdM7Ba/^8t萟7>~HΟϝ;ے%KlmmB#޹sdBH*޺uk;9|]ryƍ yC.vǏ}||N8q\&Y,qZ8[l!{`L4i͚5'O|HQAŋ-KM+++"51ÃH}4`X=Oމ=,TkyD"??JB,ŝSjGv# 2TۃϽܩ҇_ J}+W+ZРAƿ$OUo8As O[7\)0 3HO!AԢRhƭ~#5OlĤ -SXXH:[jE7oK$-[:tdDB{~_|ҥK(СC,ݺu2lgϞ%$g1 STcǎUTtss{itBXͩJŚ6mܹs-,,.^8k֬a҂wwwJ犡ك#3 IDATǾxV^O8Ip8cƌUCNNNUzvݛ: Uyxd 3e۶ }bʠ!xذ)1s 4#s}6lXy]<}gj|Oy1 PT:Jc< 4C74R`2V-[X%k bbb*_7\\=Coذakժw^LJ kkkVN>Xr7nhaab :;;9w jmm}µǏ-[&Jl<_~ Emۨq0Ν{jwYN||ӧ_zEm2uN !d2]]]MMMGnwhВ ]n9Uj*"Bz.LtYKVxMϞ=,Iιq7nPOad2V޵kWUMEɿv4*W(Q5jts/sҔ2gͭ྿^ZРA /*,?ܭ[7F|L]_f0(M2Ç,wǏ'/ڵk *du bҤI*JT6mڔh^,7oޜXQ!'PWM5@+*r助))B' rP^=}}}ssm۶*yy6m2-pJKX-'X,##lƑH*OTzxJe˖;wTjUҁ]e{A ,_+HG !8Du@!!)4jsdod ɜǏ߳gOySR7i&={Lꈈ<###'M"r;ϧ>~ ZРAƿ#G<.HF>|($ ~y|رPz ޽;yH$""˗+S5gϟ?"J/''g֭2qF[l6lq`0~F 0ŋݻw /q *݋p8U T`0Ν;7` P(R͟Pc+i?~(99z()ԩӪUwQ/*Ό5+u1޽{ƍ3gΨT@-f oؿ?uWCijr˗/dQ嵋Ti 4@yF* GHo$VےFڶmKM2S {!Ǩ1`0ë(Ho>jx_Jհa*1r@bE̜>}?0B(/-ԙzJennNMwS^! ƒN)S̜9S$J^^^]1^CcИ LHHvq "sY[[OlmBd>|-cZXXeH_) U!O\'h 4hϟϏ~}ǎ?~Q X=YL ILL+ؿ+I_maC.00gϞqƍ?Rg-SRR7nvL&ӧH$"C0"zرHT*CCC޽{R[{-۷jylH0n8d+WgX, $כٓrM 7oTb͛G*ǏRYs#lSTyyyaaaf"_̙3 3ĉG'eZU@`A4hРpU5<2O]Smd :}t{I%q ѬCnn.9šRϟ"=q*ϟ "e||~Lڽ{2R5jÇ 3p0`@es`LP&133|Ku B=Zl"?5WR(l2"e&B}5---+++((((((88X,;88PA Sq722R. 3fx!A.?vgۜko0L"wT*ׯ_OeO>ݳg!vވAyԩ?$T[.""X:O%; #U8?yϞ=j4ixxH$"B0aֿ2R.}[{;AZQ.|M~_.ڡCLd2ɨRZ3W]y VjˠΔ{߰9n- Ʈs/y`)V:=j~-hi-ejjiPas0;1!U#eB~Z|b>W,^o͆=Ҥ8ZK0_ڤ&CVNpԗJ"jjz=FH11}||*P`8kD}\.7,,LsQիL}QRgMvl"weR&1P QooqnճO efLԯ_sQS@LL̥Kȉ 36 <78>{l-=z(,,|ÇRRR6((aaad7MHѩS+k0 kѢŇ 1T~Kc;̖.]JLKK#v]PP߲eKHnݶnZ-Z6UW)0l˖-[n%OL&r{ꥫK;w.]v=xZTf٤m3C_KGwo}t?31d|B $@&Mtuub&VHE"[ԮQ+ Kn8"//Pԍw^[xzznڴУ(c/~XAv+2~~>(ŵ/p>yd,4hZuAQ9U-Mo=uޫ0t֫8r ȩ0ӧ/<F}iV/ gil)9Ѽh@f^G<=KJ~_Y/7trrrDPȓ޹v6Q.A,:!0>Tf2Z x< "B@f˗_xQ^`HT#3_T*U> 4ؕ]v/wb`rA zjb@OOOOfeeQ˗%K޾8E *Jx 0fHF܅ћ,paB,w^ke%B>S tzԢnHDyyy|>?>>ԺmG}" X8c?knf97 LYnJJOFM…87Ip2.Lbm9{R&ܱABÆ 2V^=5Dl5hРs֔g֯_6}\8///%o(d`teБ\ԩlq111DN+W&j}V}}.W*ú DIm077Gv m$&cRw6_m8¼uqO.솩T"(777>>K Ck76b޻wϾUn+V TxG :gl,a3K?Ǫ{SQ^]1'=]Dʃ! vP(ʼ|gU+ehhH|]v۶mqЩ['kcB͊?ܿ/ 3uba;3xɂ-rvzJ[*k.[$ݥgܨY|'Lm6qfvob0 [z%HTXrߥKRT,^]?S@#j7t]rt;eݵj !u7r׻h'lHo/Xz3%v3,(v`r:vk +ܝ$@R+Sg:y[Ǝ>)wuӳMGiQ) 0 -F y>Ҏ,u: '?5[Lm3D4KA7\57LHtUR4zzPa6[Yi[xYylLN2lk63ď-v=\'Jrm+:n|cQ 3Ywc Y71]Je\Qng?*WF) !`:LxѬ &|"P"o@ƺG,ihaqˇ#֮n7k;N;y>Ԝ,YQJ3n,MA&g| LQfRR6 z遏ŭ 8΃SLuF~@PT* M:-'m5Y,’(w'f}ooxnGO ͂S\$K000 DhҤu}zNضY:T)U*p\>S3kKNNk֬!{{իuƃz_?2?ÓV&$OkҡI̟?8y{_~pJ{;. ?t @LLLJJJ^`mzy5jMy/*z7Y%>\I鞭?(%usR1ϓ5&rPFa֠AK˖8MzҷO+ĂfÓUs&=pc=>jZ<<ָ/8xf]0>_,H#![ձ% *Qj;t|+J R잵gSP(J__6(];0fԐ!c:vx!͢s kԓ5R*_4zuyPcP*/6[\횜BLТ)^sۂ7M]H}rO֎mZ(cƌq`ǖ!](cٍkqܪ睖66-[:W炂\ RQLX@Fsg\:tql $p2*q]Pa.+v9dߙEdrرңw][.zcrj5c\nL 3Oc/6ʖ57? |=Ƞk{M6|۹R21|{ًB:zo hO*%˜̸BaJnMoH z 4-/:"?4韨va +ZȸRW83̜,:1c2mU[jxi`5mvc:m,"*>>}N,P[8pO/KO0S ?+bu/4i׊X呖۩m]mdd2(^bٙzg0 inY4g KL20_|" -2<jl~ݺuQQQL&z+OKZr:ѹu!K [̙3>>>N7խ۰B֭[yye,{JhұͮRgς.,6зS1?M___ͳ/?QF C]MS9 IDAT8߿}o,Pc=<}?FPdf(ЂK}7GG<:pD*$}76$k-پC-;Wonޢ^|j7HÖ vqxQL^o QWEөNxRDPB={,;n 5  xԇN^ .708  ߜi؀-;o\l|Q䅹]J?*{#Z=Tni|MRzD?8YqiϾ~-=Ίm{6ƀ9XݸBQ-߶m! ?0(cm@+%oٲ%26Ȉ+*y~B9(>>kXuwIbe2밚' 777@AH$*,+|PXn? LqaL /Ҙèred#F|yРA={VVu,aׯ_'MTf_>Ta|~Nv8U%Klll,{z|kD=xC__G^o.(T&Lx9eaQQQO=zqzN߾d T _&'~W Go>~Jd-NRC QM>}z`1+RNMcttAAAw?#D"Q``擼aB dqo"""޾}Ӈ! }Bcr\];(HD4czzy;ɵU2ի"Q 7@5kde:? (i_˫mDBjelwom1wFgm:+J!\Z ZP]5ytxhHHHHHȋ{nr,&drWM)UEoA!jѴ]m$]ax֦sވKMӯנ._&8 Ð$@k׮%0yn|-n̢e8%3yX/=ɭ⸆ԘBRAOO?٩_8 Cʭ[n_III!] u~ͮ(GnP6DZX51qn%3l?@6xD ^AM 戵Dw ͑0#1!""ʕ+fMLO闕Teo7A@@@=^z5l^kmnP'N]g{76f2 c5RӾ֩XM8qm\[B.WHI!^>99if>b%>ICKR^ ^\,+=k,};h_Xd2}6x!=JڞbMg ujc2oT>Z;إm'9z$l;Zݶs:u,M$ Ν}5դSWUG\, rӾLΪkgggwdG)߯̚npy!!Y":,=:nm4ؗ)_F#?4%=9}{{V{O}iժUAAAtaۆ2Qd\8jD/'7{Ngw^~ͭiг 0 !t֓z{n4FPy;37"xUa~;M@c6vnuxzͺ61qCaZzzI\wu0w_ޢCέ۲GGۘ#W]埞0fBGtA(ȹ/r|̙=_lx}|v6akhhhXa ⦟x֯VOrgd2/.:; ^&θ? ґyТ)SMm;{k:.CzzK=!^ס5␁]-#֏@e_ѿ~Ŧ^^Zq"{Xhb)UtX|d݈f-yonGWdڶ F,Nοj:{թӮGs#\'GT\fyN|}bӠ>8UMJf+kX6`RI~zW6m]@uFdvEL-Kb0Є#F GۋAwL(r%JSy.c<]Z;rc9..r~v";g!el y^ȯ2Xf}'/ 1 v77XK7t⌋b@PFc&~CAgo>пY) ] #|.]'<ݺçӅVG)!-% ae2j3Zbfsno-~1;~@oΎ%FLX遳,ULƢ6` S@^w|I}@]&-p2 !$pb$['g1rd]{x6!`gu3]dx{6B 8l(awvE~ٽ'$/>fܧ81 㿻F]p{w ;BH <!$H ua$ٔSn/Z%]m~13+Jeʋ+ N Ӛ5U\F?19<,5,v (o{G>U*UγOV\OL,}i|j/}$S6v7K,+ x<kM&8a8R D"Iya;L&}=}|L`@Z1!h,czF\YIs"w9 M>ulWb' PК!\q8?Yc٥o_&/rn eT:7ٳc)] *`|lCMkd2! ^oE$[Ϥv =V)&r ⬜WܜNEa\Zj2B(>y{#gwPT? Ͼ <<خ${nd[pVtn7h\P~'2.˅<͛?_?yͰھaɝjnؿ(UsFp2s4w_RJÏ^a?@iݠ~*rPaۮljPn@n2 tI^nv#Av .UTyNsP`*(cJ$|ZoUHP 2"T9lڅFMnnNaJtuUeyp~g-W\PN9 +exzzwγw{$~V㕬i(/1}}L P~KV^2G@=*,,iqNN-=8 \7-NzEnik#33(@OQPX1\TpVZJm*zz<-2@Z駽oJQvmgh%O =UBAEa jVyPTi7Rxztl7b #Za+WQ}{LNs}0⽴³=*@XOB }[ _#-=WVכRS'=SE3l>JGCR1;VKɕs5f=YS[Ш(`R? iSWuGv);1ng -hS5dJ װkW?>$Kpƿh@A ZРAFu@ 4 A 4hРA 4hРA ZРA 4hРA4hРA 4hР 4hРA 4`C%РL60F-;4&T8V1妰i@:dX#yCŐ/3G_&еߨ3rV,VCtl$W/ͬ1S#a3a]Zl٢Es]cUϯT=  $i-ejj!60g RE ¬em3}K>Wblh#MGK0쿵? ]=ݥThE2֍CsǕc=!*@ǎȝ.5/Zؿ3_k}4^_WHh6nᲣt†x'1 :76-|I ZРQ&z856!ҧҔUתa6=ý/ Gh1 ,hJpǥPD' `nʬ7o/+m6_ԼsFew>~qn?lmxMIy\_to}%ڴ()"CD1[, cf,clQ)o۽? e[Wh糜:|\(H@ [j@Rgۼ$ѽ-ofnP%_9wZ V!zDQs2rSR*H^P5tzr^)4Z*n9 ^OAPA=lQ S *no&~@{s7 >ʳn5`j:%U+ufrUI~r[_rfY,U6+UF#Sa}Sן'eO_) 3vlM?~n]$$]bK𪶝l~ߑS`Z8.$:/JMKxDzYϛӭ8n$:=;?ϟϛ_8T:w/RkQ??ϟX]{iD՜ezmOr '4}mi˂biw:)lVuWh:]XF (Y G$Hjc MOhئh5d-i~tf[D:nSau)p}ĵ|'4Mǟh4Mo`Pmi^ܥz@z ;pvׯ锡pwCPpdj:%U+u:N>LJk>###oߊ88Ʊ\/4jkhkW؃rhU=d. |hKi~fo'WK iwicka)ʠSrKZزKP9&U赵%gVz0miZ&xٰP46VnxҞv#+S{U0EbŲKW-,n_wdfK+ `!d*Q珟J48aW*2Ye)ˤsQl˜Z-nTw=LzÏGvǵuOli9@^v$ {yxy}FyTlU=y3g;^%P ;йAEBoq}wOUbüSr{z۾xyP#$N̚6>:䏝'si]W ܯ^ >Jz X ft/z91eڌ JPC֪TɮY닔sK6\l~fSn}TT~ʯv}3$42c]G}ysOu./m׳!+MfKUOx{2Q*#[||!#~Jd=h2ܺ׆ FL!f?!Q@x3cAZ*=P5߉5e#O8ҁK4QNLrv<j, y޶b 65Y0U[/rRsR\qx(J;CL빗W==y}NcMbWZ?wqXh=Cr9JDl?8=}&tguOwor X%`%~:y9`ޯwXa) BtE@S M]Y#F6Z 5YnNIJn>x ^7c4 g17LWKAqؠL _; X_?;|+*VWN;]<<*Q;3q=ZSYl%Fk[EtLUL(Cc^Iy+M?O@v*k dZ RRsWp3BlbĦ`ߥдWqQQ q;_ )6BF*P}#׏KWz4۪F 2~Z}㷦g;`ܩ#tx3g b؛9}ҌցiF;[%[/Qrϟ}=Cy&αp ~ة+ucEΨcS+sz0e/ M{W8 ;a$̆_]P UhB%U+9dgV][LUZx IDATqdRJouoOwO0Xy :NrCO^W(}I[{}Px, ^7OB{- 7huԠEng-Ql(-,-mTNdQת^uRy5C EI$:l.2SOu [}d3ۦ_I3?1u ܜ":#tu/m[xQ-z8l:zB*Cs_Jk^PꊊR%Z@I3ʴ"]=^GDܰ]5u7=V&VNLY: JH@ @VAqZd*'#S"Ǎ׊L0uRGZgC3k3C(YBT7ߌ_W2B5Jqm[4F8olczx@g#]]n#P+DkQ.CxOssGzz]Hm=nvzk;և+茰0v^ǓqwTS&@v/v^FlK=sNxK ,.>vcv>rzr}ĀNVxO ~<_띾{ˮPy}́ؕp?N=jH\cΑ3Ey9>WgϩUw.N;O6MۼU=QLtO@neq r>}!ymW+PCl:%Ul{yQ23OV<1YDR+~7vM͉]Z3?bNr{ge'Z5"jnu9WoldIԧ h/EBIe;Д>bL?sc!7cJ5gI\zld`Qy${DۇzU O9CWw8S05kaWΜ{tKɎpmqe}~N]מ\}ˌ(C#xXSW\]DWվzʼʮ_>yotfLr ;>cn8E'kǿMʎ w@ŽZoַs7>й3 u۽uxz$N=0ah}k6 @eʹ_/ݐ;S#^عsܪWgDV9D/M*,}_×1aS.Ftb9+ J6J>mH5gop,UT*Pߔ 6|J*wpK m7v73f+U[{-VWqfSa@oynkP"_ȉ@l_!t> e_FsduNRT/T?ދWyurttE |> ^ԁ,Hge+N >Y2-)UR6rɄT׿9\stTTX6Ms9+lƩ-+ Hȏ*P()iX U܄JC 9,0W]S]ceyEK߿5Ԥj!)U6^vEWVvkQe4#O)-(6ښbnncW\pLMMAV=R♔FB-/VI6jEKI#wa=᫋ܟV5Z-y#*5%%MIaqI܄JEEd @1QbD KWJT+USYWVWzrYI˛'T^ GłB˕Q6XUt!3mI-wN=K!Csܤ-4>߀iXl`Hq Aa\qgܮ2VѮ>J 59e-uIJx/M ? +|aጾ޹dѶ"Pnaf}}$Y|n1t޾!@ppY5(Ns7 N#>dѸ: f#n0|gPj(Aal7gmJjWʫRn3&X 52m:kW@FZi,f&?9Og-b_2<@D޻kWPli^ն ;2WPVu*"L ֵ#!gDJ,VQs\U7/Ra_)`ݵ(ϟϿUĮ=O4MGm p}"jN̲z嶧tv_hxeA4];6E{4x`\MSE.,bjx€ @VV#I$˱y 4M^lS#MI4M?:MmWtܦ.6FURP$ioٻv#4:}zj:M'\zٴ dizh8twAI}j(A t ~MJv]g@Ӊq5؇T)vD4fV˵vk-<22Ȉck {hNHiBOMb {P꽇,R~<Ǽ'WK 0a6NƼ? -l[JB9&U赵4(-0mM#{rl"zAVpЭy 7ɸPEj,{BU[8AS#gfK\Χ@;sZωk;HYd/ڵؕ#Q^f6fw ݿtu;{G^7bAέͺU]RJ ޲}'3?V/[v!#kpuZ =6dۡGyUH t| }-eʩƒϞ={1XZVdJdWe[2wKѧcJťf{z[(G/12bNtp>?l[C)녻 }ȻxxS놬4/U VW= \xF5O1*rχdljr<3.! 7SkeO bs1<c U@H^9QN v^NiI䒇@VڎW@PTP?VLF3& 湊_Sʝ^ .{ěutҷg__Ͻl1h;?XzvnS,#z^jVؿ6hsfv:o/o2ri ?{5?w `͉W'0`cY3<=ۯ}Fd]޷h{ӿj.N4d:[=X5X Ҥ^ q̘5b_kPCA&u19څMJv%p<h]3n☍Vtor X%`%~:yVLWpA!r=ѹv>)(ZcUav}?W*_ UJGv,*%yxxW#}[VmF&] y%)w/_|#:U3ne>]LS(KRRR*Q RR 6C}R #uFfѴWqQQ~$ ʣLm?TS J/# i\g$VOCol,X M4~&}GLϘk k(&k<[/Qrϟͭ!9vnDrRyJ->ݲ 8Qd2huMGY8l#˭Ջt`!s1˩IG;5>q -5=vDw#`6l2jBS*]!#=`vm @ K+u;wܹsхl\Zٺٻ.L#Г[+J7Rjnu<d ?ֵ"1  KVȫD.Jtt%avzEm:dl:t}܎vӘFlanNC~eﺗͶXOsj?6BZ=Ke|~ؐتEJ]/vjj@DXp߷N1Remؤ_N4` ^RKL&@Tm5K&#SaYo};yP9zY5elDGVT|sLkӼcb8~=wn%S3x[үzw}!Kf)J6ޮd7'EKN*WZUq\ qucRiJԪj_ɓ7ލ&@Z!i5ARjnuBN.(/)"aGS'A*J;]}PHphHRTY=롈ڵ %VO>զ][DثC٫Cag*7q[ly+f *xk]XMs~FP"fRcR@ ztױN_[ D_=Dryd*U8Lwއ~G6 ⇱R50`|p @Dܰ]5u7=VpDŔṁ^uXW<jPC}=,<#mnNT*=شJ6ڮ]Dnk[橺(q虛ʖG&S轋c*xڤѱ3.dڷ 1pmK}204TZ&zVWT*uvJ'(~ʉ ?K'aI[{3(NK 02Uzd@ZZ .VȾ]u\YӤLy[݂8:|%se2j!֕ⲫPxhp|XFpG(}Vrsג\34|e|8R~ŵے/z: ݼcv;WIaA`rӏ'JoHͱL/A5_2l:z *X8;,]||r$x;}vj]"~c+7)~4{Bn$j8edʍ~TU#uWtœ[1=4Ȭ @r-|Z$B9q7.W*=tJR+kef.qybԳ\?sdcvw^շrswI~?iׄڜ8p=1Oܥ>c 6+סmw:_v(US[{}-Vs&:FD}\510xMJ ݶo?tgN0,J |rȡ]Ğ8N\Tcm5@0ΡCԩڳoe[b+r*] POC𰀻?_ٕ'-sN߬c؜]~ༀyׇWx-]a(d@`MwIٱqHQk[ΝdCb[r(( ]naS{o#+;|,)vCG 龀Yeȩ=GV+ve)V1ѭ=Jw/p+t5k)^W->V@ UzɔTVkCʌ?<&.9|c`Ҋ:xcJϱs>Gμv=Tm7%s yp) UP]@Ѐvcف3p;3`Z5"jlug67;qO~k-cxW7H4P@ MM^`A* ax;C%ӒR%/_ksP,{Z@Р244iYa5N-umnYq=h0EF~$V\mMIqJTQ=شJRmGۆ1j2 WN<"()Qk~I o*(xC(S&lVMeTF7עޙi6#\VA6֏{/ +JHgzOH(JŊ_Rڨ=E o͒4"J/7q֣ۘiuXՒyWjE hl6Ԫ¡肬(8jqaTHai--)isJ'UFJhT֮EhՕ/m2tm ?re52|E$aL[vRK|AG5)7)o˽6,ťOy\G ȃaRtd 7rM9nnL)!J3ޝirҒbo?zQހFQwq @$@ H@ |F A @ |>@ @ fYjs IDAT@ @ @ @ @ @h0MLLKQ7PSS,up _}uؾLb*q6h2E~];LQVbK2E01|ʞ=IG+2έOŸf>d唖O³;j(q~%V -f^GܽGd#a.NNN;:j?zYB5nZZZ %|(PQ ʌ:^ina΄%&g.oJvyM*)*j& @soǼN\Ml3+Dd3rLZVV:ʈ ~w*Zz(mw@fCu"4 Y [7L`skyuQVܣYõ+Al]RAxM7TɆѷ~xl#v6tU%_&aݽ@-kdT/E>f@v谾6yd˩<"v/lt*9^zL|M%JռwjI`+Qzܚ|bs?T]?KD9葵K FfFy/V8.۵ýotTAE(u&;d砖}D‹6G" ?oVCV$Bݞ$u^#l>NF'.<wsTUOyqiU?HŅ$WdL %_;?)"y׸qqySOf- E ^O?fizfjPw˯K$uTd"I=+RQcLw)ǃ /kEr*UT^oug4/\TlOYq~/& WF<L IIύvŖm;#seQ"pjzfB$ir>{gtrNgj)U݋/Z_*Vbמ'i6>t5'fYrS:a/CiIKz*`6fw@V}<}(tܠ[8tm#7a3t ;:Dž}@GN,F"ܒ [~70ԾwW@j$~ǔi3Z.+RE z_~TIU_ʴzi 5$ pבA_+üSr{z۾xyP#$]<^ںgCVbo*VW=\xF5/\ۤ!_+UZT+ui  B^+4~B6(oSx,HK8񁐼r@],6 U.U^ɵG]aDc'!ūY`zۊ)hFdͻ o$d٢t&u19wk5x ^7c4 g17fo&J.`Ƭ#]ZDZ5]/d()Td ΝM k5o9?iC<,/pV؟`UXJ^M}W*E*Y]:XTJtIoAM?qA~/_+ZT ИWr7S mJ-uoOw]=QVv4{Ν;w; Z#Г[+-R-zVci@&(n&^Y yd UJ[T{@uU'ɑWIG EI$:l.2SOu k.y=+Ɏ|of`lO^:[S$Pgd`em+/EMgV R2)6du7jEJy|5p v ['Y՘h)۲6l/{kL?/@%V&R*/1ˤ@}dJ ɦoO:?`5zuɋ|S9f8oJ}.ٛdlR%VUDlquRiX%jU8.VXffVHs~8]*E!(-fEߐ뀕I4b\hWi|[SVNB C{@uZ2"beE_W%=n|~zcJ 1Z]XMs~EP"f|$EcR@ ztױN_[ D_=Dryd)U8Lwއ~o(~+E_ VAR>dmٸQzl՚꺢ǡgn֘m5b!۾Xr`󈑶{7'*h*߄MҤѱ3.d _m{TP hsrQ&=.(6ȫ4E$ -=m%OxRr=2U -}xȄ [+udߊYdaQ,3_d``nȤqwȋ[JcHiWv޶H_/_\-ӾN?Vom'pos+7x2ԡ Mm0edw Bm|eֱ`?dWa9pmo7f#/',G touW ]9NO>oE0&>]XֳĨg2a8\ 9VZ/$owr-RTUTT* u]&js<=s}VWr韋w92}Ʊh;/[ Z95 bNr{ge''o[.Mt,1hP&UPv/?HH*ۈ1/jBH@ ԅn[{ 3kGW%>9rZk.]rbO[W|mmaJ_Ɯ=wSH4V8T@=;ziTnu<˩̫j|.`+sj_GpB=E^e^|eW/ H:}csFw9s|X_~^1wyCAS5&edž; aGpFn};w~y;m! ˡ0_w[zOi ܷfiT ^5# )3nS]FphW.U!>(h*߄BTn)dncS2.eJubΕcz2"__Nh@o0X-R*l* m9ovm67pCTe\@8]ϑ=BDZ"@VV@+45[c oc3*0N >Y2-)URX]TZ1ȗ y0ZhWfdJ;v v&,!?59ˤe =NI^|)@ IOu~v\gN]sQPqPlۯt3 ;2!DU@ $ >Q4Zj@R56d$ɺ#~!}XquchaۂGT"j„2<V- Y/-[2$@ OZ+<3.! 7SkeOE"^cAZ*=P mMs\S Gwϑ2@ O, y%)w#SjN4>]L&Jb$i)%)T=`2>8qAv)ዑ=- p||2N@#I%kU:OL!ꢤXHAGW]o:YTDHA';9P=7^mZ ю@ G|@h(iiɪphHRϋf͵u@G Sibb@ 7'>Bvz8[i13nalfe/x%P+whÓ[v^ wDgW+,pmΦ:( "<@.M $ u~v\gN]sQPqPl~Uioٿ'JCy⯰ȿ~)ԬA&$]bK/m;#seQ"pj]]45)%z<ٳGKH_7=syyULԍDg3y gT6Zs^9 uע<~?RWouOVݴ dizhê,EtR;[1{ 1VЩ,xlXpk{_~>]vtmEw~A;ӛi&aRi.ti} OmAp+>]ʐzpLnϭ_oxJb`` ݿ_/T6nX]JbM$^𾮎~Q]ެE%|f *Hڬ_c ᆢ|+ׅ쵩 |6p HZPEzm3\h ^Hֶ jزb!'3ʦG-7)U$, ?x"wP˒}b\'SDHG..v^i @wjw:ɞ @=R: `MTS(ԉ5?->& KtZ>CSF˭(k zh<_uDc+YU_ڦ1}T:mZ'ސU~24>£W?!慇%U6-Uҵ\4 3{Uߠ( _o.ek_46ۍsٶh9S_}(H\hƙ˷|bPl7'6̒;1y^.]ۏ]bUf, Xyv7m U000Cc:~1 W @5Wxz4E|M%X  4=''ZKW =E1SIr,2z/[Wi77!vVޕ1I <|@{%P-ؕФ/2gtuE!OkGcHf'ǧMCW7=m1 4ʑv4:, 0qROXsX5Tϴ~Ʒ%K$l :44}U?+"G Qq"C=:a?ξ/_Dãd\\'w͉*jM)`lAb3v@qگY+E2Pn~=uL/Qj-ժi^̞=(nƌ?Os|zO8bzVM NU_7dWi K=n_0@#T_Yҟ~»aoǏ,0zrH>%۰uYw}3(hBސG)G{ 1R[`1q"beSL*Nbђ2m?iEr¢/kr2R 'mzJ ?+WlR1uxE:ڒu2sfyddPvMc``&@X/a``(J:K | ```````````}00000^;[u۹8Yo๋R ޛv/e[p)#Ey KӴOr0:aYfs{Qs]΂-q0˥R^<^fq}GXL6x`$LJ=8P$IK@@JP Ð$HqY玼b{ʃd),jG  bqf9 ^{=&;qm۶vVeak֬YB3g᡾IiZ(l6a\n6V+qw="+ aq֭ .GgAjժUi:##MD*W#^  +_ߗ hP\MiH[ְ9-BM);NSK;wܵ;fQڰ*4Oe슡P ^Iد)eU֭8.fgg7jԈ(Nq7}]ZHԢEΝ;?88aÇ=z.IB{F(HVVsrI\.K$4º;!qb?`Ԗ-[RUz+WxAzx^R#e> dTv WV 7䥧e;։UC6mvZj ճÄ.6ܻpu3[fCjt=5WCT[n*#-+:Uԯ}2$g_pɌCxaaaaaajժUVdddڵ)ƍ### ,}MavލHKbĉ;vpIYݮ]}* 4(&&# m۶ׯ_ -ԬYsժU&LZ4M Ih};v ICnb-ϏX[GF|W0in۶Jdhx/w ]Çd۶mƀe/~QQQ7of?ڵ=b/d[8q󍂔yVE/]?KJJ {WtqQ@n섆N Ľq iXb29dM^[\c@vͭψ93NI$=HZysw+߸XⓁ-4O[\;%^>}()+mĴ{?:Ktۏ)Dw~{i1]8}/=e7?yǝ OvXXh56,0[nmҤv{BBϟ?iN$k]lh:33ˑs7}ȖEZՂ۷SRR"""<ߛ}:ui\eh|СC͚5?a._\n]( N?~|dy<^ժU!/ϵəfqgڴi|V2^X$IY&229x?fj5{~BRgϞxcuN(9+tdϬ.2q'iơ(&&̙3!$$Elц j*=j.߅ׁwKU*>jEFP1bAa`WH~CO=LU<0O)T!AȽٿKU[_[AsEW9u^xiʸ`x7f}-?z$ܙBUvV1$+Y^mיgOE6Vm߿ǘ$GR.*[>,OTk阻~W6|^}Ffo!ݷ w[_؞gT_wtb`96 SO2 ???תUj><H,N8:S6m۶G@bb.AQǏk׮<>M5oԩS΢s 4ݥKxV)"I( ɐƍ'틮Ç7mI1Α#GRr9""ʕ+,mڴ) @kתW}C9H꠿8111&&9E[oY+V4iz8Nvr3آhTg>>>lѺuJveY1vڵB lͣG ז!βi5jԍ7&=&i#?cVh4;v ǭ[v1bĺu5({7eot֭[gee*í jެPjsU*`!6 GiBo Q%5jw5vlH\ \lH|s%T'M-OJlIxRXmq]:AN>fۭ7gC_^_ɭQ3.L80#uwVJ@΍6l]8.;Uio IC7U2t{nEӣ 0LPPP=niӦL&tRbbbjjj``^2={ܹA^aP.GRYF .Z2.ND t=::~wINNNNNuV&MlF"b@4`İRjA!s.[.\޴iLoӦMnn.HRҼys?mRRR\nϙ3G&EM6+p.7n ŋ[FG/ g:YfqY%KL&3.mK$)rrrΜ9nݺDgO{um03[oGV;h 69WnnnTTכbڴihyj%u:p+.Yzz:y[;D"I$ Iƍ[`C̷zгҎJB]A1^ mܰF9߻Bx᧙ H}]t= ({N zMk)C}^/xZn\oY86ܐn(l"Y~],f!FNI ^2Ӱ>3{y`S@ 4ӭ0Bͽ[7[}r_xXImsIk'0Zh^B}? uE$B{ca4p.Y @;Uzwv^4Mϟ?mٺ3S\2Kguf3lٲhLb4Ѱ2mʘ^m'-h;i^&L%9fW1K\"2Wxb Giecq:YkR[g>:r%!]2vڕ˃_~֥KRݨR3jԨ ,̙3anoSNtQQQPPP)sMJ ??o߾'ՇYj1 3w\Xrqƽ;O>e믿 _ףʣGtz$w5j(u#?r~l6#ukҥ/III`U3gthUְaÞt}̙3Kk„ He6mƍ:'7A?~ҥ~s]bYf>|hqx_\HZȴ_\?jã)W(.E"ƒʪ?_I-h9\>'.o/Z)ea!7޽svTIZ]p"5W?ҁt΄ܹk?l| n*X.JOÒ>F}.޲d(BpN=nh;( VȾjٲ%?v=TŎ_~ݻw͢:u;J ֯_OQԧ~LFƍhsٳk<޶mXgv]! L4<##5إKƍ̣wrWx׮]N|Gp9ݥKyYw~<\!Oс6klʕ<[n(@phvIB(eT.[ 0NV#G+SM$sj\#oeۄoG0>RudG<[9ŔwqaOOp IDAT~Sl"c5vHv|s?C Oe 6+jگO iڿg#Dqcfc㙝g1ʫwRn/+E@,%"=====Q :v锔Ν;;BkxT*M9O޽^N!IÆ I^ps#aaaԭ[bĵZӧO/**b^zmf K,a6nf4k޼N[.f סC֯_f͜9/t0+Zj7iԪU"##n V^ݰaC.chhW_}RUO7|>|x=d$g"./FP-Q۶m+6ۙ3g<+(. KaёL&=z r`FaXSNuNu``| !a?W[)kVE+swg8_9zhݝ3gsСK"O~ M$:E?p1 V+vC/e۶mHu˧V zYf (@F96}\ DGGϟ?{JR~GT K&Lп^zݻwa\~1nQxVXMC;vRJ`000ZbGiZEdŊժUc|If͐Z ~ϟӧ xn9ly\ gĈaaa| RlgΜ mܸqHHEQgϞE>69h{]朢*%I288bFFSRRԟ;X F9!3fOLWVp+|lXa-|)M yE}V@)ZHP(H84`#ր'5bvkƷZX(5K5kkUslRkDc bܮ՗sW@RsU)t~/C["uHZ38.5)4M nδ_n۹ s.\+PSSSu:Cyg=1›^*V8dȐ cǎq0`b̘1]@> [=GhƌVeJpk]Sپ}_~7jԨQFl}w ؘ 6xo߾YrN8@$ws.3nO2?` g5Xx Оbv&$uL .-ۘC'C(9ʧߚPgrW%w*W[^nbB BrSR%.ZK90 SN~Bv$ y睂hРz>}X ???K.,p O8ĸq:wu]--V^7ߺKpFDQQj oȮ;tvjűҥK{ui{{ˍʼnZ}˗/]DdVVdH$%vH:8qw#&ݲsM6yHx憁 7]%}0T!d\~ߚ}?-! +;==~uR)wd2qsZwlev#UpCjر>T*E<4AHNNׯ e˖ ,X璶-Z̙3q={L\j-qH$ZvPի]>1'DGGGEEEEEt:2??(nF-;wQϟ??{lh۷o7n;jժϛ7{=(G˗СCW^L&ӈ#^َd$I['hl|ƍ;iawD}v*VCJoj@y].N 08uÁ\LyoQddKU&gaΜ9e4M荬~rᤤ$n"0aRRROni?~ɓ*UԫWȑ#yy9sfժUGx"ܼybŊ쀧L6}ڵk aÆ :}Obٳgϊ+>͛7 FvΩ!H,((hܸqTTW_}07;Uayҥ6f͚(k0cǎGFEE]677׹5w'Wmc8\aGh"vy<رcΝn:F(;Ȩ@ ϟ?n{f(IȚ5kPj% W0^3000''-ˣ\fU$es?"ʞ-ႂ^* p$ݻw׫Wl6/ZhժUuX,9Z*Gaٿf4hz۶m[n-Q"bժU$$IΛ7GVo߾7nd[vAYfMNN8sBI6~8eʔ-[L4)--kDj{.וs*6ow6KsnI&dD'O59V6m ysuޝ{ =$Ɍ3iC :G|y={2djժU}?/$cg*FQɓ'05k /jf,ZSnݺRJ˗/Z٬h P8HX<>̡͛;lիoܸm-3 sر/YZ,#Kws(za,Y9eme8oq^]'Oܰaŋ]$>߮Pˆ#FqC:y}'?s޼X,NIIzJx@=mK.uAIX,޵k]Bab%(X(#Q޽{wNtPDFw{ﱕݻǍSpܝ;wYn;v,JUNdĂ`2ׯL>JY,܌i\$ JvZFzYTVMPTXqɒ%EEE ,2-8JdI(35,!͛wE#7%rGn(Xw ݴiӑ#GtҬYM׮]}zރAq߿׮]ܽpaK՗H$BʆH$Hx6m۷o`0`.i47!ÇY~VRJF\­T_93vŋ?o߾]v4MzU+W\b׫Z{.]bOo޽ۤIwᕜ] :tbAPycbb$vpu-Z`m@*>~],[5q 4<NjBdKQLR1rNw1tpmw#>bhݙ1/!m3--9onTT6mҮ];vźfϞm0|?Fmd˅{駟222X5Y w2R<X7)O>:u7]ֶmۣG: XZ½  <}t1ˬؠbccv]v:u͛S FUfMVgϞFF _u)sΡ$W\!j?!!aSzjժNK\r |,ZCdeͺv*l6wvPz%>Vӻso2; 8IWϝ >#w 3f ʩS222)'.׳=9vӰ rOPIIegxyB+ yi1kUfe`1b l߾%$k干 kSf4=b7lٗ%0ٳgPXXq4=uׯx\IQӧGJT*EjK~'LsRbbbT62wsh6;vܹs'`FFFt:4|s EgD \|9&&&66… Eq0̾}VXU&lj|yً7ot֭[Y߿VZ7ot^8ε";3otYzT*nxV^ҰDK_Q k4J WEeX\> -};&.j[Rj} z\G&,R7T@1$aΝܹ[h ~; aV5--%P¶m"##=nX͛g0<0d1k֬ʕ+A{QnnSN:g24iU }}}܅`ĉBr޽{_(1l0GW_}e'NKDfn?}SgΧ͛L繤5 RZ4`nje˖9dHpF`"IO>V]u:ݚ5kܦM٨e{yz휫Ν}+]`#``C TYvF> /9z_Oߖtoܯ_;&%/n mfY *ƛYi>]]OzrVQL̨02,!!FQ:Y;M40`/Pȁ\߿Kb[.7,k|2 3ydΝ;jed49oK E)33d2!ʭo6 vQl~nܸљyVJ<ˁ}"4Z Ih'عNڵkժx<پ}'OFFF:޶mou֭[7 /_7n[\wСcǎڵ V^zαeW A6l`s)+v7Jlll,d2T".13xY@E"8EEEH+p-Vo˗;t1p =nsSv C*/uHJR,% .*a6_R߿M6gϞ bjj*Wblw/bvܹk׮zrH=XrFGGcV۶mٳgx+Vt:t(˳Y tҥl+:o޼iӦM6 y*{䦦4}+Vl۶QF.}7Zkʕ[h!-{bp]<*11o;df!G-Y?wߖ@+Hu/ U֨"{RxV00^` A @ًo?ð&Vp/BaV5+Q2=oFDDp|_;JexxVjFRN d2]RhjA,Ϯ]* NQMӬd8p B\\\~˖x~dΝs4>@ hРAVZnݪU+/#SN:a#GYepAhe^,؁͟?ٲe ࠠ j;vȕ9bjfq ׯ$GZd2խ[ P8df2BBBXaΜ9!0Æ [v-{l67mtĉӧOGW̙4i$ SrjZ-n ]6w̘&# ubOIp@~ЦuTn'x>{v{V۷ɐvOjay JLLtvF}Uʈd#8}tAAK9x^a*w9O>.(*,,ܽ{w߾}0g^z5ݻΝ;l*V@7߰5m6̙3 PBSDh4ѣG=z0 k׮I&&W\q 33sϞ={AI ݶgCmvժU.~t:=] k56WXѡB~~7.Jw9 M#Go:u5k׮#Gf;v MӍ5ׯ`EQJX>48<¯ =^-{ʕڷ}xzr[>:Bvvc<ס(ou\Яs8MhV\(++ 7nk _f_c#FOKK>W\  VV-<|ɓ'D"|3 ӲeI& $I&%%mذɓGag/\\I޼yԩS0tD F]_3uȐ υyпN;v,4**jh~>|Y־}^pM0!22ܹsȷd޼y۷owyöؼysp֭[V00A^'s7,`?*Rpk>~h'I{v]e+"x~Ϝ9ýxŏ?8--KΟ?߭[7w5kaտqjuX,Ν[hQbbg2AvvvzV7O0́ڷorl3g 2-5ͻv?~nn.K=zR:sh 8ТEV"4MO>ĉܜEgu$'''&&޼y3))d2sĥK{gϞӦMk֬ٸqY o @6c*Q&`Hsrrn]&vHY={|7.\sCԩå/oBVkQQEbbbtt4A)))fKQ$8lذ={\xqȐ!Zxt5ZvmʕWXiLtt@QԩS֮]{//TǏcY`9+x=mwr ͎u+T*u֔5j@Oox/Wˋ|Ľp9=Q0000000000_#<ϱZ10K8pRn "(( ŵk< 7X V`^+2.%RR./.oyZ00000000"D'Ђe*EW2J)qŬ7r?X٠)f1M[&lVdO@"*6coZzyӞGA>m!_b2'mYmS!)x$Cmހ 0N $fǡ$>}ib\@,RϬ'DjbO%2L&|ʗȜ o rBTY^<\WPjP_GxDYKK}{10000/U &+@g{*VX5Ѹ(x<B5O7=9=t@uMa^^^~~~~ D^Kj+@NUVϥ^h@b!L6&Yi *_L"LxrFo2ƪך)Kj_,bW܈,l|Ʈ/)`חPh>bW1k>}[drd[|H$97뱁rf"6k$J ,6F$$O `W=&hi &;|)i,""~j__?oK0`*,A#sq/e5Fh2,vG^8##㑉 xb1 X%|Đ2 ū"R&ᓴj6}_Y:sy(殔Jc{)@Bt,`1'ƛ ʢ)/S:y2?T@c]mbLkOXQ,S(oH#+WFfhl!R#JbXtE+×E x"#H#RD/L̦L ZX&n.ov 3_"$-hFBټ.)P,U ^H$r-xM)HhOWIxUS=Wz\*)|G̅ PfLMF)b*hbx  kt IVbH쾌\PU| . e(S@^ &$PR*AUDPƼ"K2op)ѧbwhDTTjǥ)RjJMץ$Jٲ`H?ƛ OE>2!P&3S|cJBdԪR˹'KEρNIo(n[FSnRB\,#iU(>m[g/UH4f (K%R{Qvk^/zT.R-B[O;v1<.Vߧ hƈ4mj2]LkeI4EJm&s"o4YJ۲X|Xa2Zw'ƛ XEvk/Ơ3G "HֿaqghYSpn,*,V$21,z76|dg?{gY Bw-^\J)-@)  -nwwwCB$+.gI.{o޼u;yDk)&""&%ms KB#(0P0&H,ZSǀu^"J)c0SRgI7J$ 2節Xj k: 2 T4ǚTK\ŇL/Ip.?*S4F66%%(cM6KQ9,2D{9t. ?UP%K[󞊴 {VC0&YX6`;xWrJ? л[8W`XRs&0Wəl!  9gA*U 22RQX85kxI.^ 0 `g2P/T8G#0 o„~`0 ) `0 ) `0 ) `0 ) "OÏWo U) `02z^Gio^_Ye W]+`Ѫ5SnYʍ:OZVK}0iw˶N~e*oнU<O`%k7.9wzhՀg`0  hEbIJojԏ @?LۣΤ kV5Hqk|q.da˷N]Mo~мѣk"~xv_ooM8@hBoY}L8pɟ$B=ߙ_/r^>mxeIo-aR{*`0 ƿ]{!Bx@GToxV{j:ϛk}}T ֨Z^m?l_#mF~,_Դ4÷|Ѓ;~I8$3zy#7<@9=?Yb p_oqw}HE6^.)5dz3\ZPI;76xd1O`0 7D{ȏ&$3@zpiRz%^~U>Z^+ooo)^^uZ2>z۵zo.rzz]#Tt]5,J%d|>'vi/;>k5~ŁKSgqw_oo齎a=~{~?ŀ/|H#:Lq ,tCz~} `JϽ1#kMvVmzOky z^O>@H9?!e<^ܹ o×-;kkʌkad)R{.wsy ?nQoFuV ~QD-'~ݤepbmJ:]6+ܷ@+SϪ!v{/«ED/ѴZM᯽ esi}%+C_޲/r Z>M93ďΟPzR'\_W~׸NRrFZݛ:$=nb~gzqdyd}>)^25Lo.R27#Ro_PQ &W> V kԠS/EkTvTv}£{L~ۜXxԱG=zׯ\oAYO`0 _NSooiEr_C1١k)W}[y>&;ol~Vy@_+ e[ğ?ek.]B.gQ%%JXጥ^=u…%cG%_>2 `|> :1+پzVX-P͋wTfRC9.n?Г-2dѧ)zطK|Zfs.-Z_x\{n[Y ;59Ի6%/=4}3U3_2-ۤ5qp 3O՞>U;uܱ /_8_}yk; (nG> Ҳwᜠ'_5re?t\Yk#_̦s7 ضlG|6}Mz-+Bum\,u5N<'5lX&:oޤwcv ӉΛ]ZcU*Ju\th5S6V'5*gԞpc642ƻ<J5Nv3ԴGTo[W4-[z6U **}9$T. ԗ\ )%ǖD.YӝC gmJYֶJ+o/sBQN?G8 j8Qf?EJۓLR:Ϩ{{>)JYG~{?eB Q1 >ѭfC۾I@F5|6[CqwцyIl˗ڤ_8^A~%^~)?+l ނ Ͽ_}Ę); %:MeL(a0xsWӴ}j5Z@(+X*V=}#`HM]*M]k9v$Gf^<7w_S8Kͽq |lWsB?d7AqhO]5EاOe@]zo+k.ѵv\5F^X}БG-\R~S+L HZৃWoTv<wf~,/ݽkĬ JM@r᲻63P\n&jزE)ݾUf8oٌfE2|pO\}J?Nz+K;Dç]yT jʔUyYof׫Φ.s51S>[_v@E3ZsԚT:}sR|\Ȅt !󩯳15IϮ76_Tqڹ[FrX{N,}!Ҥ!yyChFӵGA(i]y7Obtˀ`sT ,m;ZIyT8 ~g?vmnmnmߟ;}3 Ug~$^жXQ+R"@nT4,YTZ;@kg,6sɵN_Q%]0v_.yl ˅@fC6KRSW=Í `/RCgo|+_oiÇ8st@xkrА:l[~ m6'C+qoAss.Y<;~fWNUSϥoiؕ9=9U.2NĪJ$F 5I *Ȭ,#u ngs%7o6NK/n (9u[`Cm]۩ovo?mJ 箑<d1?W'i;'ti5AG՜LػFg/SVLW[YyU/ZU͑p @_>[椪4eƒh 6,-ԭm"m39%n:FIȽ .i_kfkKQ쩪;-+˪@ іXB9R7s 1~ycQ@}b}B})!$(e*(n (`t5<+Q& eߔ.HM{*z^qƻj5r-) Ho=k--+4ջR#Wn\gF\jɌ%K??U(j6#k@xk7nZR{L/gR$\>p{r\׺O>w]PǠP [_VjL/:k'Wn~q #_di a2su \zke ?wy*)LEPz)m5գW8*mpI%Ɇq9LOOI.J@^ƦќE,*pyߚϩ fnMT./}pL'@4*"|A@ hFH77ĪaRsy\f&p`WMa8;͍?׬ظյX.=aʖPCzOqrZq:Sa-xB Zŀ>nӶ6uO_fFZmܷ#p%SlP n{`q~lԦ,m-mۤ|zKǜMĴwnzQ <ȭmw|p>ל\H1NI%&&ȗ#g*8o׭_W~Rs '~ڏuۧ7j{3:3'\L}Q]GLu&`DM NDev0b` `?< u3ͮ2c7m'nZ~y]=ZF4o۞~R*EvW>۴ S)ŭw$W/쫆qvw# q{W۳g-3꽕[w`Iϑ7oe"ū< |~ 7PndUeҬmosP 履v#Mu[} (C7ĮeZq /ѳv]G=Du_)?2[DPɈV+66X|* p& 4'd]lD1ě dk*gԟ~ΜD3Tjlז~4-Z.\Uk#ln"|uqVD=|dٻ5ڮeKi׸bOOt*}Jm~Um@wigܿ᚛ɱlYv&_VIDřT>:0T`0h( tCJ G{Cʫ)T hJ$y4*I:ƴ! ֺQR$Q$sՒhaf(?zbB9CQD1@kuڻwɹs:Vu9KKXoltj^X_f^bԤʊx d[5*bdx:¦?(^=}\'i!5\SDOoCmHÁmRa88ooH 9.D^Ί w cbYSIg,_Je _j%?ll[-R|47I\awrϨ(ju;}͞htQsika&] I']BݦR P!kY~]DWZc-K\='ߨEbRF+Vú -[_ss#@U0C\Wks鋲+\"Sb)b2:iG'=T8`Z$F<dMBh2i軏N+1]mvv׀>پ5Y?MI$*ۥrE4 FE)Fd)Vd((vձ`q+l]Y=sש%@%ݶu҂ŜxCOk&( *(UDa^6P {ձ$eG^r&:5rkJ0);Uɣ8}܊(S`%[88b~|/Cv~Η?yvIT@d']Ubf.Sp\hLբpm,? >=̦S]@AZ`%>>UGQШm th:D;h5Ϊqnp@Nh}r+rB_oy9Ma,nlUŸD/*W/>y޲fq2@*PR)rOL (a9+8PJa~}g"akbbb^dEQeݬߊ_n.:kke8jҜUCt 3vbs`,@,\ZLO.îA/."7r7m xd8Uʅ.>]\Y3W䭉;*r侮x6M]OvUFo^AKo5(ܜ(Uuj }VQ Sɝ+]گ6EM-ˎ2%r}֘ me Z4)!nhؾYܔR%ˢbd6*,ʔRE4>}Q_,˦IFR CtPzظA{nBiR1bAH LN]fn*w섵tA֤kKp&Ħ,^=*|=\?qZL5C5|m!7~֕V+U7!8(}֔K'۳͇f]eQ.=M !ߋ vw}OTA!WN9C69v36g͛MePVL^"un(Va}ݜw'] /ccbH癳 n=꛵11W,shZ_&]ot8>uLYl!qvMMyNk2ʓTD ==h X:4rD L[XFv9vоqH`- =kY] ٓBݹ*o,|.뭓Z̅Ymڭ4p.^vq $rptAW9#Im*ݵs0PG'8%t-jxr|ϻZi_T}8? `g" pc,b2$* rbZ7zYr&V)Kjbv'D|2=9>4O}I7t@]GUnS(<$޷ڣpYx)̧<ԷqoZV.{?Z7jy1[ @80I|o,_jTsiN8j8|K#ީr~=JsV CzWqd V mfHgD/ˊ]E*:vh4VRJEgObLba^o+bNKL2HR`)5~RmHQDގf/OХlz,E[;fԢ`I.&r|Oqs8N1e+Upl//z17/JK8#9DEQBF 3jW1MSUpomhUr+%#*%ozV%X3*!Jp Qʓ]KfƊ굋3Cb#Z[9'MjY4@//sXTЋCxqߗnٷCs$?nvz}sCd'5k3R9וI!oP⏨o&u3יt@y /cB*U 2;KS6'@I[48׶nXՋ u|ddP!52b~bPfMYZc[oN IRi_n,3wpz _R6'Js2/OyB!4O1Ӳ*S' IDAT\*PLV,Z h9N1~7O˳w4]Qdàdyo+IJ?GPA3?O QӜ C ݒOMEU, +)UjntËT+_ϥ[ =Rtx_9b|ӔEQ]O9W0\B=Z k߻e4x_)HSehHRVPJuhvߧ([!#V'=!;-7EPV0(&'%y6~tG)e?:si77\'+9/x|T'L Z**!aHBj{-bܤ"(JR|TU2`0]"dCVbbDEH P |$UOU)t7J)\@I!47UJ5[:n!󲹟Y)gR59G]REQUv#rJ]4I OENl>!sHc\Q)!:eJ7cG)+אI$2 Q+3况stN{uʄULN?퉼zf#;k>q#uĭKo5'8%*Nnٸp)#M %PJ)~Zjkuii>#WJ1M0q@(l8W~O625ӿ9nj7L0ʾ&I:aM-e"rT^+|aPfddOn8J 50d ~u%ga@i T5Ue^. AZX\G%RR,],Bᑸ|Yr:(v=#YE˼ TEuGL:~U2[LW Svp 2 S9#7f4wnZf9uB嶍*ӧU#Fp^q ׯgfPs#FT)K7mh !F#Uz=͟?zu_셁7X ܻ~SkU+kRk}VMLmk MiM;DIXs,涢sW\5c7qI!b JHyI ?Enp $ ƙFOTT <[{0WMQpmS)(i9]˘$#`H*;Tg(f՗CEv)*څ#iI0gzbq(\DŔê=͛)ݻiÆ^ވ88yKosKܳB wGx킹D\\ͨAKxfN:I> ?u]J%/ (:M@3Ucb *]_FTCT>NeL<2Ϡβ#/3 0y("H+Osڦmm]*W2nw񊢤"W=՞(K#Ly6ԓxJ]Kۜk_[8څAdaQ?-IXTp~KHpDPJP()P\S9'(8PGIm" i_D<ּzKn((Wa{ V?TW:63EP(Ti&ID*!#.}r>!}J%|GK HWm.]B u M D&MphJ@iMLQϷ(K4#}W$T}(r$+7 +kmm?۶ࢉ\Og'E5b0L`dE)'WqFCHu{3J@6OK0>+ qVibvKCKm!uWbYaṞ)"/Lp 9}'<\'\diYk~Oyw"ׂyҖ崣U&>J2Cj-ڎETUf qB]4Ts:$SY" SY)NQJN)TylO1ʹib~lVR_qS郞i0+~nq9 GSI^\!DE^ϔ2II$QSJyOf~,S-UjCI==u@b:j&d8@xpHwDAgpݜTeh"^E(K F꣚\ #ͣG\t4|i(ʕ{yˤI|۶)DǩOKq$N=wvf|bkdb,ttiiE e*O"3@b=m]ɦb.sy\N骞fe СOp B(N;ihkdS`ͯU;yUR.ΐ HJx DJf+?!¯(ϋKf`0M׃ѣ&y\TO"c uHqnym&ôyJr.'\-0TfvPJʦ#q-"E(`1A^Ûx{9gkܼ_3bMe&5qU\= hO@"<#iV:r+M"T8&|鲔0wJyDl&Z?f(,@zwM&WYg 4R&HbP 5tFvU+^G}ۿ|TqԣGT}5LF!!iʙu:BiҲhV~]oY534 E_}mu )\x3- G@F`@Y-,c7oψT/8'0w-hb% dW_#\voŕnyqrC%dd/?!DuIeM^S"Bh^΢SM,Sj/Ir1CdFrpRPBp}>ݩrr"ӧR-…}}\D3fwLSt:)9s:=T*EIIϏ0+7p0svCjB*-' \ Rp la@k8g;pRJ˸,"}<7P9IfP{؟kV^ fF[H$WZWb )6mq lq`*! osg*5jؓjˈ)gCȲ9P܌8FYR\!RpyT: Ҋ%?"TKW&W`0=:TwU|_ދ#DU^nʸq1@I@ExYJ(\Q?{zK 0ܦ&)pVs$e .ՖĮ-ސ<$@BmʻSJF薜#&\)pDjwgw%/*ڽ(bBD]uӦ8*lj#%uV.s&(GY[&%B;\z"]Bh6`0 0^}D~EQԳfebqK]jUץmi}%ݚi!'wU b2iBCT#{(j-7*ҒfnTJ=L$Dn?JwL0縒 a ,*k"yȭe<zޏP4νB-:M)\-,YZ%p^rs-(R7 McB!ː-DL:5jbL!IA'%~9NfG S y\u֭Zfƍ R#*Iu9sH?3JKjK< )+H+6lk[+Ś.|YUGULR+K"ݜAj%I$(2pc4˭d~D;; ~P-!s|1Opn3K}Ql.nť /%,pw@*װ9lyoK-N8#J^I(C ,/KkvMPBW:3%i.fbv` #Sº$ԯoɶǖh>Ծ6{&XA Q ),%%]+KRw*7sVZ,箩DMqF*rx#HdHgI de "} QU쎒@􀬑­Uͫ?q$r˴r 8t+~ 9:bKLA"0R͖|j X` "eJj3lZ R O4e Fp2841R>.kyD@Ph-Bhgu xцSfUv(Z))DvXfIm[RNL* Pײ:*LcjI;}Zwl Aio1R*YQHȯ)F+&"^OP"FrUfd<'eYƎmqm*45g9BKDN'5 ~$E%)[uPnUwlGh*<$ߑ4\  4(Y/< 8\p8!^Wp`L$9a PryST8A"%pwTU5 e P *+!ɲ0qF+gF e60Hq|3dJI#`) Lh.B -kkk\JNp.P1EQ.QYDrˍvei7lXYU8kHQM0T (RȢMP($IeE yP.+|"=HD+vh(XP,n$ 339\NdS-#$ˆYˊS*M/(OKAU%tuǔ#-#b1*G>Ţeyxƻdk0 $9yPL&$ك%=%d%]#03,USыh6-;AˠBFb^t$wKੁ$IZ3Zh)ZBe"NHӴ\)S(f\uTS+rA*u]Dː$+(,y{gv^AvjfKwu H~:U$dD՘/΀tR.,focw`"Z:@ O) dSX^:ܠG+0V/ZFQ5OOZ|VW5 "|8"YR Y @șҧy>(X2WF\r: do^ -g@6nܸuBCCcbbjZI;icHMPToJ 22`eU*pѫW*J$zU/$`1ȟ*IH(`: uV4pQ^ U@@ (~=LKA,u VW?UŸ6w&K@ g*K&nˁȞ@{K @}+1JT I3eNBTNB*`WPp ue$5X>m{K0>fgO8;vmyeA^>ŋy< yR%R>@_''̱  3\ir9[ 藠ҁpX x.-4^3쨾<6 vƃt(H`=pdG PGA;/`oU@@?3~W) E^ -[PVZj=~s}}^Zdf={رcZha``Ta,,,ZjEQǏsX:88L2Es/LwDo]Wuzf.z38νOfb[@^Tu1g~k':MZT-ܾ] ['dBW| j3-R@/PA6T~x]PAz8 S%HJ >J" -$#Ȁʁg@Q},@N5 NH+ mZʡD@> dXj @@ِSK=$EpPc@NsU9K%V}o9X]r޾Y> =..N:VVVZOXZ$Κ5kȐ!>>>8y߾}hnn+GѫW"GGG??dyvڵn:!!"77W(ʓ_ \ssD''7o\xȤvN qAFNʇ Kss%OWcjbٶ898!@,Zw"]];' ϼeCW2Ǩ)> v~wL(sW8؀ι~fCt,IILRF&{X 0Lᗴ<65(H{N[Q9Z쒭kZ0+<C)O](LɓԬs~ҷ|Y{߯5aJ#U2 r jscJuSC SIzf,;{"plظ*Fs:&L|pd\b;5.{(qf|,L̍z涂oI G0C֬gf(.NZ^RɎI,P 0teOQǂAz|X0*4W!ZXPTZt0daf"IoY35[efInFJv5uT?:*NU.B$ǀ'(5YiE`9l˕\HL/>+>fiuS|{;w]-*'1ópaeY_r&y,Rc`dD\< J`vɤ@U!ڶMZP:Ae(=-`C)40N`BzO$7&] jPA䙗 EY8@?HU.д8|$&ux7~tvz|:S1~<1+GW>@DuٱO}^Lk;1_cKtjHĆUZKx8YZRlR@8z5o̼{ki샭5 e/ YoƼBɫnXY5uue+Y;yOziҋVEc-/5 %kfݭO E5Wv׷B Mx5e$`E~M6a WHS47-H$铋mbbrʕk׮|YRw 2p@...Rq~Q%W>|߾}>J$[[ۏ?iիcǎ-KIlS]#sy +173ieU+6twK.7P||-H5los0U$v5r͚u(Ԥ8twMUAc{ҧ&%Uu.8jX>A|<=~d~5+}3G9@U He {.nƣmVx?=M~`\5J*kVA;d\3cЮcdoGośZ2M{*)sWĜ'; a[E q`,1H$^Zn?W$ miiy…>}t9,,I&J+,X޾o߾G ˳9211)=w0ϟw=lذ&M$٨Q#OtDD+7n% ϧ(J~ M<x!!!% go!>\vB(Is^$پm齯m L*׳۴iKr뗤qGpp\j(/@-gwa{Jr=.u]`UߴqU`ڇ/@MuU*5^ 1kZ N7m3\6hu*Zono:Z}3 $Z:%8Ϻm=HgwZ@azGς7F庮yv?W4h.>}Fq!q92w֏g&8v^˝DqFe`QoXωivɥLJX ~ӥkԻ} ~j"-.2$z~fv$㖩}K`01s`J>&\SM!.Y~`K@谸?fTew2:agTf~Z%`_,r~\m9}Ќ/ _95ks߉W ә@-^O*j J=y,;c-ذ+\K ͺNܾžs8iivdAeplHKK3=Ri}l|xIdM)vivf^өuH;_¼ٵ,ߟū7]+_[䓾i3O}zX 'NqC헭; V7$&`W-nz*.6~ q;,~f9 ˜s/!@¬ccyTuMN\~9 h5qVGێէQp ׿zO߷ö8<|wU;%%+k Fh6z!6]q'5VMI4i&N~ossn}oX Ume?dP՗ j 2$4~:>aݮ>Ug-D >}*<ժ4ruǘi\wmC6tUm7vӏykw9$sg+ }m푗ߗņBKU9Olll̙8---))Q*$0 S<5|pe#""bcc8883i}^R7]6~9 `?I:/#N:h+:>?#16 6ּs2+4հo*  m©OZNRTEa^I%?ueIs3veukSEM]4g|gIWyMfF4*;f8dx'g!TA1ey I!Qx{9 ?8f.'mj.*!Sm;ov`Wj qbs,26ZʀL\l,lZv$Pfo Y]ӈ-T]gy0nj\}%`+]wE}g$cIk?Vt2 Y칡_秛W+|9v]t-\sG/H#?]Wf6@Z֗5/p6;(&;w͹,o_};ۯr=1]J߀-O>{pY5<|-sXٖ \n3n1_$wI[|ٔv4uL"׶ƍp v͕+s}O+͜@T89Lm"%Ks'z[1) yzuS`(lo0B䩕]++8Yg>E$46!vO\NIDAT捷老ǧ(`UnY#_{(Hb١q5ivMq6ʴƩG8w8c$58P|7<V(KlP UXkQaVK[{pSyFM'$O{: ƖJ}T֦cZL[՟c'["a\& x:loKl]>uc`[T^:զΖx}(ߨ5N8dK]_j[,?26g.+d%ݓ2tXH,Lm5ۇ9ϸ{jRC?lʇ&IkϫނW5&8(aa]\j:y~ |ݯ95Ct?g𯽤+iuKıqO~Uk]yS"B=,eSAGQm g9L~3H%UBDZ mZW?o޼3fxyyegg[ZZZ[[9;;#p(UQΟ?W^Ǐ("DÆ W^VY1S׬Yٳ .f}zqb][<{܈9^IS|'o ~eeUYKTIC] /\5524[v [UJ<·aآ[Nұ滻3I6mv޼'|4Yug{d]oa͎QY?K| daFAߥ@->gqZhYY'9|EfZ'hSt>s/L/'8|;O0V|=_w++V׌*Kj0rqC+5qg@*\pNڽ5Az|~Mf:<0haXZ0L!8,@iP_j8zn5Htx\_t蹬oTnf~8'':fUky倽{tA|nn> /r 2|7UMR %lp<T $XYŔLlx՟#d.!:NKQ ]0d ޞO`{xÛ7۬I1k_]la!M{۰+?w'QԨGE$WӬZ]b9/1ʇ>>/_=?rUg0?W 3-mM>Y65$}sF-Lj{mr@ek{L6iռ0clV'_z]3yG}ٙJ&m! 0y YYf|X,TE#eIK uҿ7nz:w~TDN&ϭecE|KSR2@VR|y`[L":$T_@S2> O١Xp"XYq =-_mX Ba3nE'o|EIMZb}زҿs'9a>|5)-f:xWHՖTk ;1a[p)e@wGa'o}KuQŎ(YQ+l%P4^%ْC+I,Fg*+oԘS &knWߜtW&X rrwel|tqZT 5󛌭4wm1A9CV]?s )LNLvA/y35<9 ,=ȅL%I9# ʢY c %뢰P#5t\Q#fhXDF40:wm Cd%dmڲsMp* =kd}f͚OKaa[Ɠ63KO[EpgmtRQoH#+0 po}=[n wYn-.Tan8|͹QBOi,$DžNvGYgYAlvnRv'gc Ű}ML=6cT*Ēmj"U^s Ȭ˓>[u/=Ûi8KVq0pu*a{.f'U6iB;0붴?,z60K^tQQrɋnH4"XrnlTU0OqcݴҬlf+=>y_Z12/z_!y6Ჷo덻*)wSn#֜l7RbR3}^zHMM544k޾U9|a۶m˗//**ڼysTT߾}ҳgȓP'$$ /^h۶M\\]222bbbʎDRѴ;kHxuY:_n._?{O\(Y ꛵(qҢwH eY=itlrCOOOOO!4 y6_@6ɫE}o:>6teVV_ &۱qf"KF ~ :mxѣvh>B,;4|jT=*ڽIc j6M)I?Oq/}aXY"噝.~ik\fle6+n:tрp|VzwL U 5kxnInRK.q n>Bu5-YQU{-}Zwre|͈O]Јxm*d\sokB't|=3vFm 5M|D8 8R^ U/GtrJ}yY ૛.l<h ZV|9WR L~Xב/ ihgh]߆u}{LmZ945rK}:^oԢ6^U8\_{v#H''/}F ~TYyj?E}HSLJɎ"@gI&}f㒽h衟<^\PRƮ?ۥ} limxayu^ڬbN]2XxWi)U#GOM3drGbni"ˣW~l蔧&EB]qVZb6M Ȃb ]-6gR 3pu9Xb]r'ЀxkÊoo^;W=vR 3lꧠu^x(_T^SX J^=G$*Nv;YCuݱ\5-sW;~tȮ[ $D%ajg@0B[Ƿ~^YߦE t vtswP`g%}k. DnS&wrr ;;"[%26&UQy(t@wX|%#"",-- sVFdd$˲zzz1o eY655ܹs򋟟_AAL& _9 &ш'~Rr1rqf @אpjkO :dC-Y>(f.+aWN~z+ɔd愿'Is2eJj-L:N~yQc‹kyzkàPyPWG~=pZ0qѐ޾qoBπ)=0A~֫u}ߪ&ӡ.\(yt:zTzuuG_@zVkT_ 6>yفMRn_{E~24缡a fWԼ%fNřőSY\~[`._@#,buVI5 C:qqx6sK]*|zdekw͝מV>}M7}^yk<_|ks?iCOwG䠤$j'g44fg>y^@s]ƀ"5<_ xdӟ<-Co=θb hT5`Zs1ȗϷzWCi&oU+{΁K"/le\ͷ_<~ui2ܕ]MࡇR_&^8 &fftYynɋ:bĝrٱb#iTi€?YmȼX?#&.tvwG>cهmOk7^.IIU6gf…rK[D@ѣdO"^m ܹ0Q8;Z*Zh_Qs;EAAniߦ2lfj[D;ZhſZ@ -B -B -NZhZhZhZhZhZ kgʒIENDB`danmaQ-0.3.0/src/000077500000000000000000000000001477575255300135265ustar00rootroot00000000000000danmaQ-0.3.0/src/CMakeLists.txt000066400000000000000000000017251477575255300162730ustar00rootroot00000000000000set(danmaQ_SOURCES main.cpp Danmaku.cpp DMCanvas.cpp DMMainWindow.cpp Subscriber.cpp ) IF (WIN32 AND NOT MINGW AND NOT CYGWIN) SET(danmaQ_SOURCES ${danmaQ_SOURCES} danmaQ.rc) ENDIF() set(danmaQ_HEADERS Subscriber.hpp Danmaku.hpp DMCanvas.hpp DMMainWindow.hpp common.h ) qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES zh_CN zh_TW ja_JP) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) add_subdirectory(resource) set(danmaQ_RESOURCES icons.qrc socket.qrc) file(GLOB danmqQ_TRANSLATIONS translations/*.ts) qt_add_resources(danmaQ_RCC_SRCS ${danmaQ_RESOURCES}) qt_add_executable(${CMAKE_PROJECT_NAME} ${danmaQ_SOURCES} ${danmaQ_HEADERS_MOC} ${danmaQ_RCC_SRCS}) qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES ${danmqQ_TRANSLATIONS} ) set(DANMAQ_LIBRARIES Qt6::Widgets Qt6::Core Qt6::WebEngineWidgets) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${DANMAQ_LIBRARIES}) install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION bin) danmaQ-0.3.0/src/DMCanvas.cpp000066400000000000000000000123021477575255300156640ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include "common.hpp" DMCanvas::DMCanvas(QScreen* screen, DMMainWindow* parent) { this->setParent(parent); this->mainWindow = parent; this->screen = screen->geometry(); // this->sx = geo.topLeft().x(); // this->sy = geo.topLeft().y(); // this->sw = geo.width(); // this->sh = geo.height(); // myDebug << sx << ", " << sy << ", " <mapFromGlobal(geo.topLeft()); // this->resize(sw, sh); // this->move(geo.topLeft()); // this->setGeometry(sx, sy, sw, sh); // this->setWindowFlags( // Qt::X11BypassWindowManagerHint // | Qt::WindowStaysOnTopHint // | Qt::ToolTip // | Qt::FramelessWindowHint // ); // this->setAttribute(Qt::WA_TranslucentBackground, true); // this->setAttribute(Qt::WA_DeleteOnClose, true); // this->setAttribute(Qt::WA_Disabled, true); // this->setAttribute(Qt::WA_TransparentForMouseEvents, true); // this->setStyleSheet("background: transparent"); this->setWindowTitle("Danmaku"); this->init_slots(); this->hide(); } DMCanvas::DMCanvas(DMMainWindow* parent) : DMCanvas(0, parent) {}; void DMCanvas::init_slots() { int height = this->screen.height(); int nlines = (height - 2 * VMARGIN) / (this->mainWindow->lineHeight); myDebug << nlines << this->mainWindow->lineHeight; for (int i = 0; i < nlines; i++) { this->fly_slots.append(false); this->fixed_slots.append(false); } } QPoint DMCanvas::getGlboalPoint(QPoint p) { return this->screen.topLeft() + p; } int DMCanvas::allocate_slot(Position position) { int slot = -1; switch (position) { case topScrolling: case topReverse: for (int i = 0; i < 10; i++) { int try_slot; if (i < 5) { try_slot = std::rand() % (this->fly_slots.size() / 2); } else { try_slot = std::rand() % (this->fly_slots.size()); } if (this->fly_slots.at(try_slot) == false) { this->fly_slots[try_slot] = true; slot = try_slot; break; } } break; case bottomScrolling: for (int i = 0; i < 10; i++) { int try_slot; if (i < 5) { try_slot = this->fly_slots.size() / 2 + std::rand() % (this->fly_slots.size() / 2); } else { try_slot = std::rand() % (this->fly_slots.size()); } if (this->fly_slots.at(try_slot) == false) { this->fly_slots[try_slot] = true; slot = try_slot; break; } } break; case topStatic: for (int i = 0; i < this->fixed_slots.size(); i++) { if (this->fixed_slots.at(i) == false) { this->fixed_slots[i] = true; slot = i; break; } } break; case bottomStatic: for (int i = this->fixed_slots.size() - 1; i >= 0; i--) { if (this->fixed_slots.at(i) == false) { this->fixed_slots[i] = true; slot = i; break; } } break; default: break; } myDebug << "Slot: " << slot; return slot; } int DMCanvas::slot_y(int slot) { return (this->mainWindow->lineHeight * slot + VMARGIN); } QString DMCanvas::escape_text(QString& text) { QString escaped = text.toHtmlEscaped(); escaped.replace(QRegularExpression("([^\\\\])\\\\n"), "\\1
"); escaped.replace(QRegularExpression("\\\\\\\\n"), "\\n"); escaped.replace(QRegularExpression("\\[s\\](.+)\\[/s\\]"), "\\1"); return escaped; } void DMCanvas::new_danmaku(QString text, int color, int position) { Position pos = static_cast(position); if (pos > 0 && pos < position_name.size()) { myDebug << "position: " << position_name[position]; } else { myDebug << "wrong position: " << pos; return; } auto slot = allocate_slot(pos); if (slot < 0) { myDebug << "Screen is Full!"; return; } Danmaku* l = new Danmaku(escape_text(text), color, pos, slot, this, this->mainWindow); this->connect(l, &Danmaku::exited, this, &DMCanvas::delete_danmaku); l->show(); } void DMCanvas::delete_danmaku(Danmaku* dm) { switch (dm->position) { case topScrolling: case bottomScrolling: case topReverse: this->fly_slots[dm->slot] = false; break; case topStatic: case bottomStatic: this->fixed_slots[dm->slot] = false; break; default: break; } myDebug << "danmaku closed"; } DMCanvas::~DMCanvas() { myDebug << "window closed"; } danmaQ-0.3.0/src/DMCanvas.hpp000066400000000000000000000024561477575255300157020ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DMCANVAS_HPP #define DMCANVAS_HPP #include #include #include "DMMainWindow.hpp" #include "Danmaku.hpp" class DMCanvas : public QWidget { Q_OBJECT public: DMCanvas(DMMainWindow* parent); DMCanvas(QScreen* screen, DMMainWindow* parent); ~DMCanvas(); DMMainWindow* mainWindow; int slot_y(int slot); QRect screen; QPoint getGlboalPoint(QPoint p); public slots: void new_danmaku(QString text, int color, int position); void delete_danmaku(Danmaku*); private: QVector fly_slots, fixed_slots; void init_slots(); int allocate_slot(Position); QString escape_text(QString&); }; #endif danmaQ-0.3.0/src/DMMainWindow.cpp000066400000000000000000000174441477575255300165410ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common.hpp" DMMainWindow::DMMainWindow(QApplication* app) { this->app = app; this->setWindowTitle("DanmaQ"); this->setWindowIcon(QIcon(":icon_active.png")); this->trayIcon = new DMTrayIcon(this); QVBoxLayout* layout = new QVBoxLayout(this); QHBoxLayout* hbox = new QHBoxLayout(this); hbox->addWidget(new QLabel(tr("Server: "), this)); this->server = new QLineEdit("danmaQ://", this); this->server->setMinimumWidth(200); hbox->addWidget(this->server); layout->addLayout(hbox); hbox = new QHBoxLayout(this); this->hideBtn = new QPushButton(tr("Hide"), this); this->mainBtn = new QPushButton(tr("Subscribe"), this); hbox->addWidget(this->hideBtn); hbox->addWidget(this->mainBtn); layout->addLayout(hbox); this->setLayout(layout); this->fontSize = 30; this->lineHeight = this->fontSize * 1.2; this->fontFamily = QString( "WenQuanYi Micro Hei, Source Han Sans CN, Source Han Sans, WenQuanYi Zen Hei," "Microsoft YaHei, SimHei, " "STHeiti, Hiragino Sans GB, " "sans-serif"); this->speedScale = 1.0; connect(this->mainBtn, &QPushButton::released, this, &DMMainWindow::toggle_subscription); connect(this->hideBtn, &QPushButton::released, this, &DMMainWindow::hide); connect(this->trayIcon->refreshScreenAction, &QAction::triggered, this, &DMMainWindow::reset_canvases); connect(this->trayIcon->showAction, &QAction::triggered, this, &DMMainWindow::show); connect(this->trayIcon->aboutAction, &QAction::triggered, this, &DMMainWindow::show_about_dialog); connect(this->trayIcon->exitAction, &QAction::triggered, this->app, &QApplication::quit); auto primaryScreen = QGuiApplication::primaryScreen(); auto center = primaryScreen->geometry().center(); this->move(center.x() - this->width() / 2, center.y() - this->height() / 2); this->show(); } void DMMainWindow::toggle_subscription() { if (this->subscriber == nullptr) { myDebug << "new Subscriber"; this->subscriber = new Subscriber(server->text(), this); for (auto w = this->dm_canvases.begin(); w != this->dm_canvases.end(); ++w) { connect(this->subscriber, &Subscriber::new_danmaku, qobject_cast(*w), &DMCanvas::new_danmaku); } connect(this->subscriber, &Subscriber::started, this, &DMMainWindow::on_subscription_started); connect(this->subscriber, &Subscriber::finished, this, &DMMainWindow::on_subscription_stopped); connect(this->subscriber, &Subscriber::new_alert, this, &DMMainWindow::on_new_alert); this->subscriber->start(); this->reset_canvases(); } else { this->subscriber->finish(); emit stop_subscription(); this->subscriber = nullptr; } } void DMMainWindow::init_canvases() { this->screenWidget->hide(); auto screens = QApplication::screens(); for (int i = 0; i < screens.size(); i++) { if (this->screenBoxes[i]->checkState()) { auto screen = screens[i]; DMCanvas* canvas = new DMCanvas(screen, this); this->dm_canvases.append(canvas); if (this->subscriber != nullptr) { connect(this->subscriber, &Subscriber::new_danmaku, canvas, &DMCanvas::new_danmaku); } this->app->connect(screen, &QScreen::availableGeometryChanged, this, &DMMainWindow::reset_canvases); canvas->new_danmaku(tr("Screen") + QString::number(i), 0xFFFFFF, 5); } } } void DMMainWindow::reset_canvases() { myDebug << "Resetting canvases"; for (auto w = this->dm_canvases.begin(); w != this->dm_canvases.end(); ++w) { delete *w; } this->dm_canvases.clear(); if (screenWidget != nullptr) { delete this->screenWidget; this->screenWidget = nullptr; } this->screenBoxes.clear(); this->screenWidget = new QWidget; this->screenWidget->setWindowTitle(tr("Screen configuration")); this->screenWidget->setMinimumWidth(300); QVBoxLayout* layout = new QVBoxLayout; auto screens = QGuiApplication::screens(); for (int i = 0; i < screens.size(); i++) { int x = screens[i]->size().width(), y = screens[i]->size().height(); QCheckBox* box = new QCheckBox(tr("Screen") + QString("%1: (%2, %3)").arg(i).arg(x).arg(y), this->screenWidget); this->screenBoxes.append(box); layout->addWidget(box); } QPushButton* screenBtn = new QPushButton(tr("Submit"), this); layout->addWidget(screenBtn); this->screenWidget->setLayout(layout); connect(screenBtn, &QPushButton::released, this, &DMMainWindow::init_canvases); auto primaryScreen = QGuiApplication::primaryScreen(); auto center = primaryScreen->geometry().center(); screenWidget->move(center.x() - this->width() / 2, center.y() - this->height() / 2); screenWidget->show(); screenWidget->raise(); screenWidget->setFocus(); } void DMMainWindow::on_subscription_started() { myDebug << "Subscription Started"; this->hide(); this->trayIcon->set_icon_running(); this->mainBtn->setText(tr("Unsubscribe")); this->trayIcon->showMessage(tr("Subscription Started"), tr("Let's Go")); } void DMMainWindow::on_subscription_stopped() { myDebug << "Subscription Stopped"; this->trayIcon->set_icon_stopped(); this->mainBtn->setText(tr("Subscribe")); } void DMMainWindow::on_new_alert(QString msg) { myDebug << "Alert:" << msg; this->trayIcon->showMessage(tr("Ooops!"), msg, QSystemTrayIcon::Critical); this->subscriber->finish(); emit stop_subscription(); this->subscriber = nullptr; } void DMMainWindow::show_about_dialog() { this->show(); QMessageBox::about(this, tr("About"), R"( DanmaQ

Version )" DANMAQ_VERSION R"(

Copyright © 2015-2025 Justin Wong & TUNA members
Tsinghua University TUNA Association

Source Code Available under GPLv3
https://github.com/tuna/danmaQ

)"); } DMTrayIcon::DMTrayIcon(QWidget* parent) : QSystemTrayIcon(parent) { this->icon_running = QIcon(":icon_active.png"); this->icon_stopped = QIcon(":icon_inactive.png"); this->setIcon(this->icon_stopped); QMenu* menu = new QMenu(tr("Settings")); this->showAction = menu->addAction(tr("Show Main Window")); this->refreshScreenAction = menu->addAction(tr("Refresh Screen")); this->aboutAction = menu->addAction(tr("About")); this->exitAction = menu->addAction(tr("Exit")); this->setContextMenu(menu); connect(this, &DMTrayIcon::activated, this, &DMTrayIcon::on_activated); this->show(); } void DMTrayIcon::on_activated(QSystemTrayIcon::ActivationReason e) { if (e == this->Trigger) { auto* parent = qobject_cast(this->parent()); if (parent == nullptr) { return; } if (parent->isVisible()) { parent->hide(); } else { parent->show(); } } } void DMTrayIcon::set_icon_running() { this->setIcon(this->icon_running); } void DMTrayIcon::set_icon_stopped() { this->setIcon(this->icon_stopped); } danmaQ-0.3.0/src/DMMainWindow.hpp000066400000000000000000000036771477575255300165510ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DMMAINWINDOW_HPP #define DMMAINWINDOW_HPP #include #include #include #include #include #include #include #include #include class Subscriber; class DMTrayIcon : public QSystemTrayIcon { Q_OBJECT public: DMTrayIcon(QWidget* parent = 0); QAction *showAction, *aboutAction, *exitAction, *refreshScreenAction; public slots: void on_activated(QSystemTrayIcon::ActivationReason e); void set_icon_running(); void set_icon_stopped(); private: QIcon icon_running, icon_stopped; }; class DMMainWindow : public QWidget { Q_OBJECT public: DMMainWindow(QApplication* app); int lineHeight, fontSize, screenCount; QString fontFamily; float speedScale; QLineEdit* server; QPushButton *hideBtn, *mainBtn; public slots: void reset_canvases(); void toggle_subscription(); void on_subscription_started(); void on_subscription_stopped(); void on_new_alert(QString msg); void show_about_dialog(); signals: void stop_subscription(); private: QApplication* app; QVector dm_canvases; QVector screenBoxes; QWidget* screenWidget{}; Subscriber* subscriber{}; DMTrayIcon* trayIcon{}; void init_canvases(); }; #endif danmaQ-0.3.0/src/Danmaku.cpp000066400000000000000000000117611477575255300156200ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined _WIN32 || defined __CYGWIN__ #include #endif #include "common.hpp" // static std::map> colormap = { // {"white", std::make_pair("rgb(255, 255, 255)", QColor("black"))}, // {"black", std::make_pair("rgb(0, 0, 0)", QColor("white"))}, // {"blue", std::make_pair("rgb(20, 95, 198)", QColor("white"))}, // {"cyan", std::make_pair("rgb(0, 255, 255)", QColor("black"))}, // {"red", std::make_pair("rgb(231, 34, 0)", QColor("white"))}, // {"yellow", std::make_pair("rgb(255, 221, 2)", QColor("black"))}, // {"green", std::make_pair("rgb(4, 202, 0)", QColor("black"))}, // {"purple", std::make_pair("rgb(128, 0, 128)", QColor("white"))} // }; // Danmaku::Danmaku(QString text, QWidget *parent): Danmaku(text, "blue", FLY, -1, parent){}; Danmaku::Danmaku(QString text, int color, Position position, int slot, DMCanvas* parent, DMMainWindow* mainWindow) : QLabel(escape_text(text), parent) { this->canvas = parent; this->mainWindow = mainWindow; this->setAttribute(Qt::WA_DeleteOnClose); int r = (color >> 16) & 255, g = (color >> 8) & 255, b = color & 255; QString tcolor = QString("rgb(%1, %2, %3)").arg(r).arg(g).arg(b); QColor bcolor = r + g + b > 400 ? QColor(0, 0, 0) : QColor(255, 255, 255); QString style = style_tmpl.arg(this->mainWindow->fontSize).arg(this->mainWindow->fontFamily).arg(tcolor); QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(this); bool enableShadow = false; this->setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::ToolTip | Qt::FramelessWindowHint); this->setAttribute(Qt::WA_TranslucentBackground, true); this->setAttribute(Qt::WA_DeleteOnClose, true); this->setAttribute(Qt::WA_Disabled, true); this->setAttribute(Qt::WA_TransparentForMouseEvents, true); this->setStyleSheet("background: transparent"); enableShadow = true; if (enableShadow) { #if defined _WIN32 || defined __CYGWIN__ // remove CS_DROPSHADOW SetClassLong((HWND)this->winId(), -26, 0x0008 & ~0x00020000); #endif effect->setBlurRadius(6); effect->setColor(bcolor); effect->setOffset(0, 0); this->setGraphicsEffect(effect); } this->setStyleSheet(style); this->setContentsMargins(0, 0, 0, 0); QSize _msize = this->minimumSizeHint(); this->resize(_msize); this->position = position; this->slot = slot; this->init_position(); } QString Danmaku::escape_text(QString text) { return text; } QString Danmaku::style_tmpl = QString( "font-size: %1pt;" "font-weight: bold;" "font-family: %2;" "color: %3;"); void Danmaku::init_position() { int startX, startY, endX, endY; startY = endY = this->canvas->slot_y(this->slot); switch (this->position) { case topScrolling: case bottomScrolling: startX = this->canvas->screen.width() - 1; endX = -this->width(); this->linearMotion(startX, startY, endX, endY); break; case topReverse: startX = -this->width(); endX = this->canvas->screen.width() - 1; this->linearMotion(startX, startY, endX, endY); break; case topStatic: case bottomStatic: startX = endX = (this->canvas->screen.width() - this->width()) / 2; this->linearMotion(startX, startY, endX, endY); break; default: break; } } void Danmaku::linearMotion(int startX, int startY, int endX, int endY) { QPropertyAnimation* animation = new QPropertyAnimation(this, "geometry", this); QPoint start_point = this->canvas->getGlboalPoint(QPoint(startX, startY)); QPoint end_point = this->canvas->getGlboalPoint(QPoint(endX, endY)); animation->setDuration(10 * 1000); animation->setStartValue(QRect(start_point.x(), start_point.y(), this->width(), this->height())); animation->setEndValue(QRect(end_point.x(), end_point.y(), this->width(), this->height())); animation->start(QAbstractAnimation::DeleteWhenStopped); connect(animation, &QPropertyAnimation::finished, this, &Danmaku::clean_close); } void Danmaku::clean_close() { this->close(); emit exited(this); }danmaQ-0.3.0/src/Danmaku.hpp000066400000000000000000000032511477575255300156200ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DANMAKU_HPP #define DANMAKU_HPP #include #include #include #include enum Position { UNUSED0 = 0, topScrolling, bottomScrolling, UNUSED3, bottomStatic, topStatic, topReverse }; const QVector position_name = {"UNUSED0", "topScrolling", "bottomScrolling", "UNUSED3", "bottomStatic", "topStatic", "topReverse"}; const int VMARGIN = 20; class DMCanvas; class DMMainWindow; class Danmaku : public QLabel { Q_OBJECT public: Danmaku(QString text, int color, Position position, int slot, DMCanvas* parent, DMMainWindow* mainWindow); // Danmaku(QString text, QWidget *parent=0); Position position; int slot; DMCanvas* canvas; DMMainWindow* mainWindow; public slots: void linearMotion(int startX, int startY, int endX, int endY); void clean_close(); signals: void exited(Danmaku*); private: static QString style_tmpl; static QString escape_text(QString text); void init_position(); }; #endif danmaQ-0.3.0/src/Subscriber.cpp000066400000000000000000000032451477575255300163410ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "common.hpp" Subscriber::Subscriber(QString server, QObject* parent) : QObject(parent) { this->server = server; } void Subscriber::start() { webView = new QWebEngineView; webChannel = new QWebChannel; webView->load(QUrl("qrc:socket.html")); webChannel->registerObject("context", this); webView->page()->setWebChannel(webChannel); connect(this, &Subscriber::finished, this, &Subscriber::deleteLater); emit started(); myDebug << "started"; } void Subscriber::finish() { webChannel->deleteLater(); webView->deleteLater(); emit finished(); myDebug << "finished"; } QString Subscriber::get_server() { return this->server; } void Subscriber::webError(QString text) { myDebug << text; } void Subscriber::show(QString text, int color, int position) { emit new_danmaku(text, color, position); } void Subscriber::connected() { emit new_danmaku(tr("Server connected"), 16777215, 5); } void Subscriber::disconnected() { emit new_danmaku(tr("Server disconnected"), 16777215, 5); } danmaQ-0.3.0/src/Subscriber.hpp000066400000000000000000000024641477575255300163500ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SUBSCRIBER_HPP #define SUBSCRIBER_HPP #include #include #include class Subscriber : public QObject { Q_OBJECT public: Subscriber(QString server, QObject* parent = 0); void start(); void finish(); public slots: void show(QString text, int color, int position); void connected(); void disconnected(); QString get_server(); void webError(QString text); signals: void new_danmaku(QString text, int color, int position); void new_alert(QString msg); void started(); void finished(); private: QWebEngineView* webView; QWebChannel* webChannel; QString server; }; #endif danmaQ-0.3.0/src/common.hpp000066400000000000000000000021471477575255300155330ustar00rootroot00000000000000/* * This file is part of danmaQ. * * DanmaQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DanmaQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef COMMON_HPP #define COMMON_HPP #include "DMCanvas.hpp" #include "DMMainWindow.hpp" #include "Danmaku.hpp" #include "Subscriber.hpp" #define DANMAQ_VERSION "0.3.0" #if defined _WIN32 || defined __CYGWIN__ #define myDebug (qDebug() << "[" << __FILE__ << ":" << __LINE__ << ":" << __FUNCTION__ << "]") #else #define myDebug (qDebug() << "\x1b[34;1m" << __FILE__ << ":" << __LINE__ << ":" << __PRETTY_FUNCTION__ << "\x1b[0m") #endif #endif danmaQ-0.3.0/src/danmaQ.rc000066400000000000000000000000471477575255300152560ustar00rootroot00000000000000IDI_ICON1 ICON "icons/statusicon.ico" danmaQ-0.3.0/src/icons.qrc000066400000000000000000000003111477575255300153430ustar00rootroot00000000000000 icons/statusicon.png icons/statusicon_disabled.png danmaQ-0.3.0/src/icons/000077500000000000000000000000001477575255300146415ustar00rootroot00000000000000danmaQ-0.3.0/src/icons/statusicon.ico000066400000000000000000000410761477575255300175410ustar00rootroot00000000000000@@ (B(@ @C C l (oĺ󻬖滰ֽŌFl!ZwwwwwwCnoooooooop Aۻ@nHooooooovCq ooooooooooo=XnHooooooovCq"ooooooooooooz3(nHooooooovCn%ooooooooooooooaţnHooooooovCp}oooooooooooooos$ nHooooooovCs&oooooooooooooooCnHooooooovCnOooooooooooooooooe~nHooooooovCn]pypko\oUpPqDqMpioooooooo?ƭnHooooooovCm#ooooooos%nHooooooovCoooooooofffffffffffffffrooooooovƎffffffffffffffffppooooooos&̸>>>>>>>>>>>>>>>{6ooooooox/>>>>>>>>>>>>>>>>q=ooooooo+poooooooooooooooooooooooooooooooooooooooot ooooooo}CpooooooooooooooooooooooooooooooooooooooooooooooooYpooooooooooooooooooooooooooooooooooooooooo϶oooooo`ppoooooooooooooooooooooooooooooooooooooooooooooooPćpoooooooooooooooooooooooooooooooooooooooopooooooAşpoooooooooooooooooooooooooooooooooooooooonooooooz2ƲnQoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUooooooooYXoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUqonoooooou)ƿnHooooooovCo^oooooop nHooooooovCC]qMooooooonHooooooovC߹mU<ot'ƶr$Ķr$Ķr$Ķr$Ķr"նooooooo{5x0Զr$Ķr$Ķr$Ķr$Ķr$Ķr#ֶooooooon,oooooooooooooooooooozBpoooooo nHooooooovCpPoooooooqoooooooooooooooooooorMpoooooo nHooooooovCpPooooooopoooooooooooooooooooZ׽:poooooo nHooooooovCpPooooooonڶoooooow*IqDqDqDqDqDqDqDqDqDqDqDr&pooooooǻĻĻĻĻyնooooooojԻĻĻĻĻĻuֶoooooooooooooopooooooooooooooooooooooooooooooooooopoooooo3pooooooooooooooooooooooooooooooooooooooooooxKpooooooooooooooooooooooooooooooooooopoooooojbpooooooooooooooooooooooooooooooooooonoooooooZśDDDDDDDDDDDDpooooooooooooooooooooooooooooooooooop[oooooov+JJJJJJJJJJJJ~[poooooo`s%|owowowownoooooooMEowowowowowpooooooonHoooooooooooooooooooe[poooooo nHooooooovCpPoooooooo5oooooooooooooooooooe[poooooo nHooooooovCpPoooooooq"oooooooooooooooooooe[poooooo nHooooooovCpPooooooom$oooooooooooooooooooe[poooooohboooooooS`ooooooooooooooooooooooooooe[pooooooooooooooooooooooooooooooooooopooooooooooooooooooe[poooooooooooooooooooooooooooooooooooosooooooooooooooooooe[pooooooooooooooooooooooooooooooooooov oooooooe[pooooooooooooooooooooooooooooooooooov oooooooe[pooooooooooooooooooooooooooooooooooov oooooooe[oss#q"r"VIѶy.s#s#s#s#s#s#s#s#t%s#s#s#s#s#s#s#v*r#oooooUz2s#s#s#s#v oooooooe[oUos&^û^ z/VŪ^pr#oooooo`v oooooooe[qooooy1kTq oz3e»o#ooooooophv oooooooe[r$oooooo[Ao!ooooov*Z l!ooooooo{5Ɔňňňňňňňňňňoooooooe[p@ooooooonHooooooonvooooooojƲoŶoooooooooooooooooooe[r$ooooooq ooooooou)Śm$oܶoooooop WoŶoooooooooooooooooooe[p q"ooooooT;q#ѶooooooNXpTooooooo=翿oŶoooooooooooooooooooe[r"yooooooop ooooooo|oöooooooo|őoŶoooooooooooooooooooe[f3s$oooooo{6co\ooooooon:ooooooot&1oŶoooooooooooooooooooe[r#gooooooor#oooooo}7qooooooooVȀoŶoooooooooooooooooooe[q s%ooooooz3ht p ooooooqonK7 /(()d$Ƀp*"Y#x җnN#`*,!jfo3.p2k+cUK׺ x$zmn< _/q0VT'ZeF[sga>SD$1OZu463iln^/k7W5"O0{fZm>3J60;K& %>j+N2ݩoejOvVMUZCMSizŮ< s eT}Fr[kvkb6ʟe._0Wfd@[$|#R鏴0>:_SzKUOIUUC%߇8GO\s?= iv~ǷF{;7}sL f},Jy6#yYQW<&k*}uI\/kب_/):]ֲr z:qiAAA@ rvo^׾"[m%poאgjS6fj}J8W5EFś9gRؕWxW|xL6i׎' Lase4&~).LLh4AW`.[ZԦ&\q$tqk0}L>@Y08yᒱ7aO~KicH#ᮙfZ.^OcE X-ؐD&Xtcڴ`61 -h #5,ҀͶWEm沙)$7یuN`fi] n#p,=JÄgOQmo_ok75hnvu^^ |YYr"87ͼՍPc dFq^m]7-]ȯO7e }oyu?)b .Op{Y#˺v82t%C T:@H Y( q kYyB;8p.֐G&mZZT#0ahcFUTG.!L>4B`RF۰k H8wa(}kfג_/6'*`Y@P( Bfbdx]}eFIy: 3C:⌒rgwꁺ SnE0vChʂ? /@C ?9*`: VVQ$Ybzo9[uё* ̣"eLRh<1{ 8;bKG`" oe&d18tыct$ KYcQ_9OnX FiI怓0xƇ3$ȡJ}QE~Ҫ%.לlVBVJۜHẀ#Nz%XQ1Akjђ: bq%uV DRق G_: %xJߚˮNv Jl퉬9!BiwtFg>6,ñ=xJH8iRD͚j|6GJtccH:-:ްހ3gj h5Z^J/-|P׮m&N 6&v=VXQ۳hh84tf.6O9ьyV[ӎ6H #%NxN^Jr͌.?Ijuu |Nށ ߿S o}t8w 큥. К._Hi%:01E+GcE5Q @BhX4:@`JRil&1QJ]yDٱ|傢?|ePF`.w~FFe )2:JhBֹ̈xd_4'|Jh8JѦ @$Y mLWi-71Xx,0[# w "G< ɡ],C,}Ou8Ңih]ѬX}R=ksj\s漲׻\/l(" @sHXu`wNx&ZP iC2oEڙC$Zic_ / _ơXcL}e?9 Ԭ ýlP޻;Av;=aс #<;±Xe`Hh;!N׋ā.]hI U\J8Gsk!`%(AoGH;M:Ws `5WU0.0k@(+䍹s'R4&#̤2::E 3>~(kR2w4oMO_CHIENDB`danmaQ-0.3.0/src/icons/statusicon.svg000066400000000000000000000104541477575255300175620ustar00rootroot00000000000000 image/svg+xml danmaQ-0.3.0/src/icons/statusicon_disabled.png000066400000000000000000000054041477575255300213750ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs C C" tEXtSoftwarewww.inkscape.org< IDATx[{l~|#NI(PMZ88;DL KH-T-DBA4`;4@!# ʣq?w}Np|绳}IO䛙ݝ۝#q  V4Ϻ5^~(۫^d.955fMYxƍ* ĺ x$~c,n_u "/GQcWc5k +$MS5v߲ws}MI: HMZZZ`Ӧ-s-En\Jm~_rAI>ЂY]0ѽ @T{XzI pʕď=8J#2$w<QGwm>Y6>)+ڞ;b 17|dS`]f ЗZG"gAlZ [\9 |5dpN-[B6DAx[(f?peu麯xV!!8bnej-%PU7ed @kkfJ* U!"L׬td*T/.q\}eQ4 Dt۹_dH3"A_<'6;07 EߘWO)4E퀷%^6 m~Ҷ:rj9(ho6Y O*,!bהjs}vAD'8#ד1v,P@טsEЧP1#>k| %P.^R)0̉?1'o 0r yHAFUĭmѴ: CxÞxbu[g4 c @_#8+?oIÎ=v0j`}%Ө1S5Lc0Ti[OJRi17e]y^};ήa[ذW7|ԮB(qS,g3@M$l+$o˷zzv^4L %>!nt$ѱcM(E{d9 ʝ;坂 DRE.GÉIaGy$i3Wj`Co6vE3|՜gB'MAD`& :jX8 &Jѝ j|4Al4O XYf`(a. "(4rܩ*Z鵱Xg%bY B= RRjkӯںP/f'I$pkg.zV`׮'N:禞A*le'D% AKd A֫K>>x#g ]zz41&T;@ y9kH!@{GJM4W+ cIP|ΨOL?)H<]9Ab*88yذ F#LONҡ`P9 9<-*rg ?gkGR ," u-)]}w7,p(V¾ķMe U=`Q!(Ȅ=)7A$ <'Fm]â(rmC)6tl DAC bG s4g?0MlE (Tj|H/#ob񄱍WQ))nUV"3⯓Wt513oj'OF -ďQy@A=tL\f+W5 BQꐕ$!~:u -%0& #IGcBe 2Of}Cmg\ 2{j&,1m. */ #include #include #include #include #include #include #include #include #include #include "DMMainWindow.hpp" #include "common.hpp" #if defined NDEBUG && (defined _WIN32 || defined __CYGWIN__) #pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") #endif int main(int argc, char* argv[]) { QApplication app(argc, argv); std::srand(std::time(0)); QDir dir(":/i18n"); QStringList fileNames = dir.entryList(QStringList("*.qm"), QDir::Files, QDir::Name); myDebug << "Available translations:" << fileNames; QString systemLocale = QLocale::system().name(); myDebug << "System locale:" << systemLocale; // if system language is zh_CN, then first look for zh_CN, then zh_* QRegularExpression filter(QString("^(%1|%2.*)$").arg(systemLocale).arg(systemLocale.split('-').at(0))); auto availableTranslation = fileNames.filter(filter); if (availableTranslation.length() > 0) { QString translationPath = dir.filePath(availableTranslation.at(0)); myDebug << "Using translation:" << translationPath; QTranslator* translator = new QTranslator(); if (translator->load(translationPath)) { app.installTranslator(translator); } else { myDebug << "Failed to load translation into translator."; } } else { myDebug << "No available translation found."; } auto dmMainWindow = new DMMainWindow(&app); app.connect(&app, &QApplication::screenAdded, dmMainWindow, &DMMainWindow::reset_canvases); app.connect(&app, &QApplication::screenRemoved, dmMainWindow, &DMMainWindow::reset_canvases); app.setQuitOnLastWindowClosed(false); return app.exec(); } danmaQ-0.3.0/src/resource/000077500000000000000000000000001477575255300153555ustar00rootroot00000000000000danmaQ-0.3.0/src/resource/CMakeLists.txt000066400000000000000000000010171477575255300201140ustar00rootroot00000000000000INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_PROJECT_NAME}.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/moe.tuna.danmaq.metainfo.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_PROJECT_NAME}.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/64x64/apps) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_PROJECT_NAME}.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps) danmaQ-0.3.0/src/resource/danmaQ.desktop000066400000000000000000000006201477575255300201470ustar00rootroot00000000000000[Desktop Entry] Name=danmaQ Name[zh_CN]=danmaQ 弹幕客户端 Name[ja_JP]=danmaQ クライエント Comment=Show danmaku on screen Comment[zh_CN]=在桌面上显示弹幕 Comment[ja_JP]=デスクトップにコメントを流す GenericName=danmaQ Exec=danmaQ Icon=danmaQ Terminal=false Type=Application Categories=Qt;Utility; Keywords=comment; Keywords[zh_CN]=弹幕; Keywords[ja_JP]=コメント; danmaQ-0.3.0/src/resource/danmaQ.png000066400000000000000000000055771477575255300173020ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYs C C" tEXtSoftwarewww.inkscape.org< IDATx{pǿ~"B00<6|TЎ$nK7 /(()d$Ƀp*"Y#x җnN#`*,!jfo3.p2k+cUK׺ x$zmn< _/q0VT'ZeF[sga>SD$1OZu463iln^/k7W5"O0{fZm>3J60;K& %>j+N2ݩoejOvVMUZCMSizŮ< s eT}Fr[kvkb6ʟe._0Wfd@[$|#R鏴0>:_SzKUOIUUC%߇8GO\s?= iv~ǷF{;7}sL f},Jy6#yYQW<&k*}uI\/kب_/):]ֲr z:qiAAA@ rvo^׾"[m%poאgjS6fj}J8W5EFś9gRؕWxW|xL6i׎' Lase4&~).LLh4AW`.[ZԦ&\q$tqk0}L>@Y08yᒱ7aO~KicH#ᮙfZ.^OcE X-ؐD&Xtcڴ`61 -h #5,ҀͶWEm沙)$7یuN`fi] n#p,=JÄgOQmo_ok75hnvu^^ |YYr"87ͼՍPc dFq^m]7-]ȯO7e }oyu?)b .Op{Y#˺v82t%C T:@H Y( q kYyB;8p.֐G&mZZT#0ahcFUTG.!L>4B`RF۰k H8wa(}kfג_/6'*`Y@P( Bfbdx]}eFIy: 3C:⌒rgwꁺ SnE0vChʂ? /@C ?9*`: VVQ$Ybzo9[uё* ̣"eLRh<1{ 8;bKG`" oe&d18tыct$ KYcQ_9OnX FiI怓0xƇ3$ȡJ}QE~Ҫ%.לlVBVJۜHẀ#Nz%XQ1Akjђ: bq%uV DRق G_: %xJߚˮNv Jl퉬9!BiwtFg>6,ñ=xJH8iRD͚j|6GJtccH:-:ްހ3gj h5Z^J/-|P׮m&N 6&v=VXQ۳hh84tf.6O9ьyV[ӎ6H #%NxN^Jr͌.?Ijuu |Nށ ߿S o}t8w 큥. К._Hi%:01E+GcE5Q @BhX4:@`JRil&1QJ]yDٱ|傢?|ePF`.w~FFe )2:JhBֹ̈xd_4'|Jh8JѦ @$Y mLWi-71Xx,0[# w "G< ɡ],C,}Ou8Ңih]ѬX}R=ksj\s漲׻\/l(" @sHXu`wNx&ZP iC2oEڙC$Zic_ / _ơXcL}e?9 Ԭ ýlP޻;Av;=aс #<;±Xe`Hh;!N׋ā.]hI U\J8Gsk!`%(AoGH;M:Ws `5WU0.0k@(+䍹s'R4&#̤2::E 3>~(kR2w4oMO_CHIENDB`danmaQ-0.3.0/src/resource/danmaQ.svg000066400000000000000000000104541477575255300173030ustar00rootroot00000000000000 image/svg+xml danmaQ-0.3.0/src/resource/moe.tuna.danmaq.metainfo.xml000066400000000000000000000015121477575255300226650ustar00rootroot00000000000000 moe.tuna.danmaq DanmaQ FSFAP GPL-3.0+ QT program to play danmaku on any screen DanmaQ, pronounced as `/danmakju:/` is a small QT program to play danmaku on any screen. Graphics Qt https://github.com/tuna/danmaQ danmaQ.desktop danmaQ Tsinghua University TUNA Association tuna@tsinghua.edu.cn danmaQ-0.3.0/src/resource/socket.html000066400000000000000000000023211477575255300175310ustar00rootroot00000000000000 danmakuQ socket.io client danmaQ-0.3.0/src/resource/socket.io.js000066400000000000000000005512611477575255300176230ustar00rootroot00000000000000/*! * Socket.IO v4.0.1 * (c) 2014-2021 Guillermo Rauch * Released under the MIT License. */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["io"] = factory(); else root["io"] = factory(); })(self, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./build/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./build/index.js": /*!************************!*\ !*** ./build/index.js ***! \************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.Socket = exports.io = exports.Manager = exports.protocol = void 0; var url_1 = __webpack_require__(/*! ./url */ "./build/url.js"); var manager_1 = __webpack_require__(/*! ./manager */ "./build/manager.js"); var socket_1 = __webpack_require__(/*! ./socket */ "./build/socket.js"); Object.defineProperty(exports, "Socket", { enumerable: true, get: function get() { return socket_1.Socket; } }); var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client"); /** * Module exports. */ module.exports = exports = lookup; /** * Managers cache. */ var cache = exports.managers = {}; function lookup(uri, opts) { if (_typeof(uri) === "object") { opts = uri; uri = undefined; } opts = opts || {}; var parsed = url_1.url(uri, opts.path); var source = parsed.source; var id = parsed.id; var path = parsed.path; var sameNamespace = cache[id] && path in cache[id]["nsps"]; var newConnection = opts.forceNew || opts["force new connection"] || false === opts.multiplex || sameNamespace; var io; if (newConnection) { debug("ignoring socket cache for %s", source); io = new manager_1.Manager(source, opts); } else { if (!cache[id]) { debug("new io instance for %s", source); cache[id] = new manager_1.Manager(source, opts); } io = cache[id]; } if (parsed.query && !opts.query) { opts.query = parsed.queryKey; } return io.socket(parsed.path, opts); } exports.io = lookup; /** * Protocol version. * * @public */ var socket_io_parser_1 = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js"); Object.defineProperty(exports, "protocol", { enumerable: true, get: function get() { return socket_io_parser_1.protocol; } }); /** * `connect`. * * @param {String} uri * @public */ exports.connect = lookup; /** * Expose constructors for standalone build. * * @public */ var manager_2 = __webpack_require__(/*! ./manager */ "./build/manager.js"); Object.defineProperty(exports, "Manager", { enumerable: true, get: function get() { return manager_2.Manager; } }); exports["default"] = lookup; /***/ }), /***/ "./build/manager.js": /*!**************************!*\ !*** ./build/manager.js ***! \**************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports.Manager = void 0; var eio = __webpack_require__(/*! engine.io-client */ "./node_modules/engine.io-client/lib/index.js"); var socket_1 = __webpack_require__(/*! ./socket */ "./build/socket.js"); var parser = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js"); var on_1 = __webpack_require__(/*! ./on */ "./build/on.js"); var Backoff = __webpack_require__(/*! backo2 */ "./node_modules/backo2/index.js"); var typed_events_1 = __webpack_require__(/*! ./typed-events */ "./build/typed-events.js"); var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client:manager"); var Manager = /*#__PURE__*/function (_typed_events_1$Stric) { _inherits(Manager, _typed_events_1$Stric); var _super = _createSuper(Manager); function Manager(uri, opts) { var _this; _classCallCheck(this, Manager); _this = _super.call(this); _this.nsps = {}; _this.subs = []; if (uri && "object" === _typeof(uri)) { opts = uri; uri = undefined; } opts = opts || {}; opts.path = opts.path || "/socket.io"; _this.opts = opts; _this.reconnection(opts.reconnection !== false); _this.reconnectionAttempts(opts.reconnectionAttempts || Infinity); _this.reconnectionDelay(opts.reconnectionDelay || 1000); _this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000); _this.randomizationFactor(opts.randomizationFactor || 0.5); _this.backoff = new Backoff({ min: _this.reconnectionDelay(), max: _this.reconnectionDelayMax(), jitter: _this.randomizationFactor() }); _this.timeout(null == opts.timeout ? 20000 : opts.timeout); _this._readyState = "closed"; _this.uri = uri; var _parser = opts.parser || parser; _this.encoder = new _parser.Encoder(); _this.decoder = new _parser.Decoder(); _this._autoConnect = opts.autoConnect !== false; if (_this._autoConnect) _this.open(); return _this; } _createClass(Manager, [{ key: "reconnection", value: function reconnection(v) { if (!arguments.length) return this._reconnection; this._reconnection = !!v; return this; } }, { key: "reconnectionAttempts", value: function reconnectionAttempts(v) { if (v === undefined) return this._reconnectionAttempts; this._reconnectionAttempts = v; return this; } }, { key: "reconnectionDelay", value: function reconnectionDelay(v) { var _a; if (v === undefined) return this._reconnectionDelay; this._reconnectionDelay = v; (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v); return this; } }, { key: "randomizationFactor", value: function randomizationFactor(v) { var _a; if (v === undefined) return this._randomizationFactor; this._randomizationFactor = v; (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v); return this; } }, { key: "reconnectionDelayMax", value: function reconnectionDelayMax(v) { var _a; if (v === undefined) return this._reconnectionDelayMax; this._reconnectionDelayMax = v; (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v); return this; } }, { key: "timeout", value: function timeout(v) { if (!arguments.length) return this._timeout; this._timeout = v; return this; } /** * Starts trying to reconnect if reconnection is enabled and we have not * started reconnecting yet * * @private */ }, { key: "maybeReconnectOnOpen", value: function maybeReconnectOnOpen() { // Only try to reconnect if it's the first time we're connecting if (!this._reconnecting && this._reconnection && this.backoff.attempts === 0) { // keeps reconnection from firing twice for the same reconnection loop this.reconnect(); } } /** * Sets the current transport `socket`. * * @param {Function} fn - optional, callback * @return self * @public */ }, { key: "open", value: function open(fn) { var _this2 = this; debug("readyState %s", this._readyState); if (~this._readyState.indexOf("open")) return this; debug("opening %s", this.uri); this.engine = eio(this.uri, this.opts); var socket = this.engine; var self = this; this._readyState = "opening"; this.skipReconnect = false; // emit `open` var openSubDestroy = on_1.on(socket, "open", function () { self.onopen(); fn && fn(); }); // emit `error` var errorSub = on_1.on(socket, "error", function (err) { debug("error"); self.cleanup(); self._readyState = "closed"; _this2.emitReserved("error", err); if (fn) { fn(err); } else { // Only do this if there is no fn to handle the error self.maybeReconnectOnOpen(); } }); if (false !== this._timeout) { var timeout = this._timeout; debug("connect attempt will timeout after %d", timeout); if (timeout === 0) { openSubDestroy(); // prevents a race condition with the 'open' event } // set timer var timer = setTimeout(function () { debug("connect attempt timed out after %d", timeout); openSubDestroy(); socket.close(); socket.emit("error", new Error("timeout")); }, timeout); if (this.opts.autoUnref) { timer.unref(); } this.subs.push(function subDestroy() { clearTimeout(timer); }); } this.subs.push(openSubDestroy); this.subs.push(errorSub); return this; } /** * Alias for open() * * @return self * @public */ }, { key: "connect", value: function connect(fn) { return this.open(fn); } /** * Called upon transport open. * * @private */ }, { key: "onopen", value: function onopen() { debug("open"); // clear old subs this.cleanup(); // mark as open this._readyState = "open"; this.emitReserved("open"); // add new subs var socket = this.engine; this.subs.push(on_1.on(socket, "ping", this.onping.bind(this)), on_1.on(socket, "data", this.ondata.bind(this)), on_1.on(socket, "error", this.onerror.bind(this)), on_1.on(socket, "close", this.onclose.bind(this)), on_1.on(this.decoder, "decoded", this.ondecoded.bind(this))); } /** * Called upon a ping. * * @private */ }, { key: "onping", value: function onping() { this.emitReserved("ping"); } /** * Called with data. * * @private */ }, { key: "ondata", value: function ondata(data) { this.decoder.add(data); } /** * Called when parser fully decodes a packet. * * @private */ }, { key: "ondecoded", value: function ondecoded(packet) { this.emitReserved("packet", packet); } /** * Called upon socket error. * * @private */ }, { key: "onerror", value: function onerror(err) { debug("error", err); this.emitReserved("error", err); } /** * Creates a new socket for the given `nsp`. * * @return {Socket} * @public */ }, { key: "socket", value: function socket(nsp, opts) { var socket = this.nsps[nsp]; if (!socket) { socket = new socket_1.Socket(this, nsp, opts); this.nsps[nsp] = socket; } return socket; } /** * Called upon a socket close. * * @param socket * @private */ }, { key: "_destroy", value: function _destroy(socket) { var nsps = Object.keys(this.nsps); for (var _i = 0, _nsps = nsps; _i < _nsps.length; _i++) { var nsp = _nsps[_i]; var _socket = this.nsps[nsp]; if (_socket.active) { debug("socket %s is still active, skipping close", nsp); return; } } this._close(); } /** * Writes a packet. * * @param packet * @private */ }, { key: "_packet", value: function _packet(packet) { debug("writing packet %j", packet); var encodedPackets = this.encoder.encode(packet); for (var i = 0; i < encodedPackets.length; i++) { this.engine.write(encodedPackets[i], packet.options); } } /** * Clean up transport subscriptions and packet buffer. * * @private */ }, { key: "cleanup", value: function cleanup() { debug("cleanup"); this.subs.forEach(function (subDestroy) { return subDestroy(); }); this.subs.length = 0; this.decoder.destroy(); } /** * Close the current socket. * * @private */ }, { key: "_close", value: function _close() { debug("disconnect"); this.skipReconnect = true; this._reconnecting = false; if ("opening" === this._readyState) { // `onclose` will not fire because // an open event never happened this.cleanup(); } this.backoff.reset(); this._readyState = "closed"; if (this.engine) this.engine.close(); } /** * Alias for close() * * @private */ }, { key: "disconnect", value: function disconnect() { return this._close(); } /** * Called upon engine close. * * @private */ }, { key: "onclose", value: function onclose(reason) { debug("onclose"); this.cleanup(); this.backoff.reset(); this._readyState = "closed"; this.emitReserved("close", reason); if (this._reconnection && !this.skipReconnect) { this.reconnect(); } } /** * Attempt a reconnection. * * @private */ }, { key: "reconnect", value: function reconnect() { var _this3 = this; if (this._reconnecting || this.skipReconnect) return this; var self = this; if (this.backoff.attempts >= this._reconnectionAttempts) { debug("reconnect failed"); this.backoff.reset(); this.emitReserved("reconnect_failed"); this._reconnecting = false; } else { var delay = this.backoff.duration(); debug("will wait %dms before reconnect attempt", delay); this._reconnecting = true; var timer = setTimeout(function () { if (self.skipReconnect) return; debug("attempting reconnect"); _this3.emitReserved("reconnect_attempt", self.backoff.attempts); // check again for the case socket closed in above events if (self.skipReconnect) return; self.open(function (err) { if (err) { debug("reconnect attempt error"); self._reconnecting = false; self.reconnect(); _this3.emitReserved("reconnect_error", err); } else { debug("reconnect success"); self.onreconnect(); } }); }, delay); if (this.opts.autoUnref) { timer.unref(); } this.subs.push(function subDestroy() { clearTimeout(timer); }); } } /** * Called upon successful reconnect. * * @private */ }, { key: "onreconnect", value: function onreconnect() { var attempt = this.backoff.attempts; this._reconnecting = false; this.backoff.reset(); this.emitReserved("reconnect", attempt); } }]); return Manager; }(typed_events_1.StrictEventEmitter); exports.Manager = Manager; /***/ }), /***/ "./build/on.js": /*!*********************!*\ !*** ./build/on.js ***! \*********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.on = void 0; function on(obj, ev, fn) { obj.on(ev, fn); return function subDestroy() { obj.off(ev, fn); }; } exports.on = on; /***/ }), /***/ "./build/socket.js": /*!*************************!*\ !*** ./build/socket.js ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports.Socket = void 0; var socket_io_parser_1 = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js"); var on_1 = __webpack_require__(/*! ./on */ "./build/on.js"); var typed_events_1 = __webpack_require__(/*! ./typed-events */ "./build/typed-events.js"); var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client:socket"); /** * Internal events. * These events can't be emitted by the user. */ var RESERVED_EVENTS = Object.freeze({ connect: 1, connect_error: 1, disconnect: 1, disconnecting: 1, // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener newListener: 1, removeListener: 1 }); var Socket = /*#__PURE__*/function (_typed_events_1$Stric) { _inherits(Socket, _typed_events_1$Stric); var _super = _createSuper(Socket); /** * `Socket` constructor. * * @public */ function Socket(io, nsp, opts) { var _this; _classCallCheck(this, Socket); _this = _super.call(this); _this.receiveBuffer = []; _this.sendBuffer = []; _this.ids = 0; _this.acks = {}; _this.flags = {}; _this.io = io; _this.nsp = nsp; _this.ids = 0; _this.acks = {}; _this.receiveBuffer = []; _this.sendBuffer = []; _this.connected = false; _this.disconnected = true; _this.flags = {}; if (opts && opts.auth) { _this.auth = opts.auth; } if (_this.io._autoConnect) _this.open(); return _this; } /** * Subscribe to open, close and packet events * * @private */ _createClass(Socket, [{ key: "subEvents", value: function subEvents() { if (this.subs) return; var io = this.io; this.subs = [on_1.on(io, "open", this.onopen.bind(this)), on_1.on(io, "packet", this.onpacket.bind(this)), on_1.on(io, "error", this.onerror.bind(this)), on_1.on(io, "close", this.onclose.bind(this))]; } /** * Whether the Socket will try to reconnect when its Manager connects or reconnects */ }, { key: "connect", /** * "Opens" the socket. * * @public */ value: function connect() { if (this.connected) return this; this.subEvents(); if (!this.io["_reconnecting"]) this.io.open(); // ensure open if ("open" === this.io._readyState) this.onopen(); return this; } /** * Alias for connect() */ }, { key: "open", value: function open() { return this.connect(); } /** * Sends a `message` event. * * @return self * @public */ }, { key: "send", value: function send() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } args.unshift("message"); this.emit.apply(this, args); return this; } /** * Override `emit`. * If the event is in `events`, it's emitted normally. * * @return self * @public */ }, { key: "emit", value: function emit(ev) { if (RESERVED_EVENTS.hasOwnProperty(ev)) { throw new Error('"' + ev + '" is a reserved event name'); } for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } args.unshift(ev); var packet = { type: socket_io_parser_1.PacketType.EVENT, data: args }; packet.options = {}; packet.options.compress = this.flags.compress !== false; // event ack callback if ("function" === typeof args[args.length - 1]) { debug("emitting packet with ack id %d", this.ids); this.acks[this.ids] = args.pop(); packet.id = this.ids++; } var isTransportWritable = this.io.engine && this.io.engine.transport && this.io.engine.transport.writable; var discardPacket = this.flags["volatile"] && (!isTransportWritable || !this.connected); if (discardPacket) { debug("discard packet as the transport is not currently writable"); } else if (this.connected) { this.packet(packet); } else { this.sendBuffer.push(packet); } this.flags = {}; return this; } /** * Sends a packet. * * @param packet * @private */ }, { key: "packet", value: function packet(_packet) { _packet.nsp = this.nsp; this.io._packet(_packet); } /** * Called upon engine `open`. * * @private */ }, { key: "onopen", value: function onopen() { var _this2 = this; debug("transport is open - connecting"); if (typeof this.auth == "function") { this.auth(function (data) { _this2.packet({ type: socket_io_parser_1.PacketType.CONNECT, data: data }); }); } else { this.packet({ type: socket_io_parser_1.PacketType.CONNECT, data: this.auth }); } } /** * Called upon engine or manager `error`. * * @param err * @private */ }, { key: "onerror", value: function onerror(err) { if (!this.connected) { this.emitReserved("connect_error", err); } } /** * Called upon engine `close`. * * @param reason * @private */ }, { key: "onclose", value: function onclose(reason) { debug("close (%s)", reason); this.connected = false; this.disconnected = true; delete this.id; this.emitReserved("disconnect", reason); } /** * Called with socket packet. * * @param packet * @private */ }, { key: "onpacket", value: function onpacket(packet) { var sameNamespace = packet.nsp === this.nsp; if (!sameNamespace) return; switch (packet.type) { case socket_io_parser_1.PacketType.CONNECT: if (packet.data && packet.data.sid) { var id = packet.data.sid; this.onconnect(id); } else { this.emitReserved("connect_error", new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)")); } break; case socket_io_parser_1.PacketType.EVENT: this.onevent(packet); break; case socket_io_parser_1.PacketType.BINARY_EVENT: this.onevent(packet); break; case socket_io_parser_1.PacketType.ACK: this.onack(packet); break; case socket_io_parser_1.PacketType.BINARY_ACK: this.onack(packet); break; case socket_io_parser_1.PacketType.DISCONNECT: this.ondisconnect(); break; case socket_io_parser_1.PacketType.CONNECT_ERROR: var err = new Error(packet.data.message); // @ts-ignore err.data = packet.data.data; this.emitReserved("connect_error", err); break; } } /** * Called upon a server event. * * @param packet * @private */ }, { key: "onevent", value: function onevent(packet) { var args = packet.data || []; debug("emitting event %j", args); if (null != packet.id) { debug("attaching ack callback to event"); args.push(this.ack(packet.id)); } if (this.connected) { this.emitEvent(args); } else { this.receiveBuffer.push(Object.freeze(args)); } } }, { key: "emitEvent", value: function emitEvent(args) { if (this._anyListeners && this._anyListeners.length) { var listeners = this._anyListeners.slice(); var _iterator = _createForOfIteratorHelper(listeners), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var listener = _step.value; listener.apply(this, args); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } _get(_getPrototypeOf(Socket.prototype), "emit", this).apply(this, args); } /** * Produces an ack callback to emit with an event. * * @private */ }, { key: "ack", value: function ack(id) { var self = this; var sent = false; return function () { // prevent double callbacks if (sent) return; sent = true; for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } debug("sending ack %j", args); self.packet({ type: socket_io_parser_1.PacketType.ACK, id: id, data: args }); }; } /** * Called upon a server acknowlegement. * * @param packet * @private */ }, { key: "onack", value: function onack(packet) { var ack = this.acks[packet.id]; if ("function" === typeof ack) { debug("calling ack %s with %j", packet.id, packet.data); ack.apply(this, packet.data); delete this.acks[packet.id]; } else { debug("bad ack %s", packet.id); } } /** * Called upon server connect. * * @private */ }, { key: "onconnect", value: function onconnect(id) { debug("socket connected with id %s", id); this.id = id; this.connected = true; this.disconnected = false; this.emitReserved("connect"); this.emitBuffered(); } /** * Emit buffered events (received and emitted). * * @private */ }, { key: "emitBuffered", value: function emitBuffered() { var _this3 = this; this.receiveBuffer.forEach(function (args) { return _this3.emitEvent(args); }); this.receiveBuffer = []; this.sendBuffer.forEach(function (packet) { return _this3.packet(packet); }); this.sendBuffer = []; } /** * Called upon server disconnect. * * @private */ }, { key: "ondisconnect", value: function ondisconnect() { debug("server disconnect (%s)", this.nsp); this.destroy(); this.onclose("io server disconnect"); } /** * Called upon forced client/server side disconnections, * this method ensures the manager stops tracking us and * that reconnections don't get triggered for this. * * @private */ }, { key: "destroy", value: function destroy() { if (this.subs) { // clean subscriptions to avoid reconnections this.subs.forEach(function (subDestroy) { return subDestroy(); }); this.subs = undefined; } this.io["_destroy"](this); } /** * Disconnects the socket manually. * * @return self * @public */ }, { key: "disconnect", value: function disconnect() { if (this.connected) { debug("performing disconnect (%s)", this.nsp); this.packet({ type: socket_io_parser_1.PacketType.DISCONNECT }); } // remove socket from pool this.destroy(); if (this.connected) { // fire events this.onclose("io client disconnect"); } return this; } /** * Alias for disconnect() * * @return self * @public */ }, { key: "close", value: function close() { return this.disconnect(); } /** * Sets the compress flag. * * @param compress - if `true`, compresses the sending data * @return self * @public */ }, { key: "compress", value: function compress(_compress) { this.flags.compress = _compress; return this; } /** * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not * ready to send messages. * * @returns self * @public */ }, { key: "onAny", /** * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the * callback. * * @param listener * @public */ value: function onAny(listener) { this._anyListeners = this._anyListeners || []; this._anyListeners.push(listener); return this; } /** * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the * callback. The listener is added to the beginning of the listeners array. * * @param listener * @public */ }, { key: "prependAny", value: function prependAny(listener) { this._anyListeners = this._anyListeners || []; this._anyListeners.unshift(listener); return this; } /** * Removes the listener that will be fired when any event is emitted. * * @param listener * @public */ }, { key: "offAny", value: function offAny(listener) { if (!this._anyListeners) { return this; } if (listener) { var listeners = this._anyListeners; for (var i = 0; i < listeners.length; i++) { if (listener === listeners[i]) { listeners.splice(i, 1); return this; } } } else { this._anyListeners = []; } return this; } /** * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated, * e.g. to remove listeners. * * @public */ }, { key: "listenersAny", value: function listenersAny() { return this._anyListeners || []; } }, { key: "active", get: function get() { return !!this.subs; } }, { key: "volatile", get: function get() { this.flags["volatile"] = true; return this; } }]); return Socket; }(typed_events_1.StrictEventEmitter); exports.Socket = Socket; /***/ }), /***/ "./build/typed-events.js": /*!*******************************!*\ !*** ./build/typed-events.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports.StrictEventEmitter = void 0; var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); /** * Strictly typed version of an `EventEmitter`. A `TypedEventEmitter` takes type * parameters for mappings of event names to event data types, and strictly * types method calls to the `EventEmitter` according to these event maps. * * @typeParam ListenEvents - `EventsMap` of user-defined events that can be * listened to with `on` or `once` * @typeParam EmitEvents - `EventsMap` of user-defined events that can be * emitted with `emit` * @typeParam ReservedEvents - `EventsMap` of reserved events, that can be * emitted by socket.io with `emitReserved`, and can be listened to with * `listen`. */ var StrictEventEmitter = /*#__PURE__*/function (_Emitter) { _inherits(StrictEventEmitter, _Emitter); var _super = _createSuper(StrictEventEmitter); function StrictEventEmitter() { _classCallCheck(this, StrictEventEmitter); return _super.apply(this, arguments); } _createClass(StrictEventEmitter, [{ key: "on", /** * Adds the `listener` function as an event listener for `ev`. * * @param ev Name of the event * @param listener Callback function */ value: function on(ev, listener) { _get(_getPrototypeOf(StrictEventEmitter.prototype), "on", this).call(this, ev, listener); return this; } /** * Adds a one-time `listener` function as an event listener for `ev`. * * @param ev Name of the event * @param listener Callback function */ }, { key: "once", value: function once(ev, listener) { _get(_getPrototypeOf(StrictEventEmitter.prototype), "once", this).call(this, ev, listener); return this; } /** * Emits an event. * * @param ev Name of the event * @param args Values to send to listeners of this event */ }, { key: "emit", value: function emit(ev) { var _get2; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } (_get2 = _get(_getPrototypeOf(StrictEventEmitter.prototype), "emit", this)).call.apply(_get2, [this, ev].concat(args)); return this; } /** * Emits a reserved event. * * This method is `protected`, so that only a class extending * `StrictEventEmitter` can emit its own reserved events. * * @param ev Reserved event name * @param args Arguments to emit along with the event */ }, { key: "emitReserved", value: function emitReserved(ev) { var _get3; for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } (_get3 = _get(_getPrototypeOf(StrictEventEmitter.prototype), "emit", this)).call.apply(_get3, [this, ev].concat(args)); return this; } /** * Returns the listeners listening to an event. * * @param event Event name * @returns Array of listeners subscribed to `event` */ }, { key: "listeners", value: function listeners(event) { return _get(_getPrototypeOf(StrictEventEmitter.prototype), "listeners", this).call(this, event); } }]); return StrictEventEmitter; }(Emitter); exports.StrictEventEmitter = StrictEventEmitter; /***/ }), /***/ "./build/url.js": /*!**********************!*\ !*** ./build/url.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.url = void 0; var parseuri = __webpack_require__(/*! parseuri */ "./node_modules/parseuri/index.js"); var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("socket.io-client:url"); /** * URL parser. * * @param uri - url * @param path - the request path of the connection * @param loc - An object meant to mimic window.location. * Defaults to window.location. * @public */ function url(uri) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var loc = arguments.length > 2 ? arguments[2] : undefined; var obj = uri; // default to window.location loc = loc || typeof location !== "undefined" && location; if (null == uri) uri = loc.protocol + "//" + loc.host; // relative path support if (typeof uri === "string") { if ("/" === uri.charAt(0)) { if ("/" === uri.charAt(1)) { uri = loc.protocol + uri; } else { uri = loc.host + uri; } } if (!/^(https?|wss?):\/\//.test(uri)) { debug("protocol-less url %s", uri); if ("undefined" !== typeof loc) { uri = loc.protocol + "//" + uri; } else { uri = "https://" + uri; } } // parse debug("parse %s", uri); obj = parseuri(uri); } // make sure we treat `localhost:80` and `localhost` equally if (!obj.port) { if (/^(http|ws)$/.test(obj.protocol)) { obj.port = "80"; } else if (/^(http|ws)s$/.test(obj.protocol)) { obj.port = "443"; } } obj.path = obj.path || "/"; var ipv6 = obj.host.indexOf(":") !== -1; var host = ipv6 ? "[" + obj.host + "]" : obj.host; // define unique id obj.id = obj.protocol + "://" + host + ":" + obj.port + path; // define href obj.href = obj.protocol + "://" + host + (loc && loc.port === obj.port ? "" : ":" + obj.port); return obj; } exports.url = url; /***/ }), /***/ "./node_modules/backo2/index.js": /*!**************************************!*\ !*** ./node_modules/backo2/index.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports) { /** * Expose `Backoff`. */ module.exports = Backoff; /** * Initialize backoff timer with `opts`. * * - `min` initial timeout in milliseconds [100] * - `max` max timeout [10000] * - `jitter` [0] * - `factor` [2] * * @param {Object} opts * @api public */ function Backoff(opts) { opts = opts || {}; this.ms = opts.min || 100; this.max = opts.max || 10000; this.factor = opts.factor || 2; this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0; this.attempts = 0; } /** * Return the backoff duration. * * @return {Number} * @api public */ Backoff.prototype.duration = function () { var ms = this.ms * Math.pow(this.factor, this.attempts++); if (this.jitter) { var rand = Math.random(); var deviation = Math.floor(rand * this.jitter * ms); ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation; } return Math.min(ms, this.max) | 0; }; /** * Reset the number of attempts. * * @api public */ Backoff.prototype.reset = function () { this.attempts = 0; }; /** * Set the minimum duration * * @api public */ Backoff.prototype.setMin = function (min) { this.ms = min; }; /** * Set the maximum duration * * @api public */ Backoff.prototype.setMax = function (max) { this.max = max; }; /** * Set the jitter * * @api public */ Backoff.prototype.setJitter = function (jitter) { this.jitter = jitter; }; /***/ }), /***/ "./node_modules/component-emitter/index.js": /*!*************************************************!*\ !*** ./node_modules/component-emitter/index.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /** * Expose `Emitter`. */ if (true) { module.exports = Emitter; } /** * Initialize a new `Emitter`. * * @api public */ function Emitter(obj) { if (obj) return mixin(obj); } ; /** * Mixin the emitter properties. * * @param {Object} obj * @return {Object} * @api private */ function mixin(obj) { for (var key in Emitter.prototype) { obj[key] = Emitter.prototype[key]; } return obj; } /** * Listen on the given `event` with `fn`. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.on = Emitter.prototype.addEventListener = function (event, fn) { this._callbacks = this._callbacks || {}; (this._callbacks['$' + event] = this._callbacks['$' + event] || []).push(fn); return this; }; /** * Adds an `event` listener that will be invoked a single * time then automatically removed. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.once = function (event, fn) { function on() { this.off(event, on); fn.apply(this, arguments); } on.fn = fn; this.on(event, on); return this; }; /** * Remove the given callback for `event` or all * registered callbacks. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function (event, fn) { this._callbacks = this._callbacks || {}; // all if (0 == arguments.length) { this._callbacks = {}; return this; } // specific event var callbacks = this._callbacks['$' + event]; if (!callbacks) return this; // remove all handlers if (1 == arguments.length) { delete this._callbacks['$' + event]; return this; } // remove specific handler var cb; for (var i = 0; i < callbacks.length; i++) { cb = callbacks[i]; if (cb === fn || cb.fn === fn) { callbacks.splice(i, 1); break; } } // Remove event specific arrays for event types that no // one is subscribed for to avoid memory leak. if (callbacks.length === 0) { delete this._callbacks['$' + event]; } return this; }; /** * Emit `event` with the given args. * * @param {String} event * @param {Mixed} ... * @return {Emitter} */ Emitter.prototype.emit = function (event) { this._callbacks = this._callbacks || {}; var args = new Array(arguments.length - 1), callbacks = this._callbacks['$' + event]; for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } if (callbacks) { callbacks = callbacks.slice(0); for (var i = 0, len = callbacks.length; i < len; ++i) { callbacks[i].apply(this, args); } } return this; }; /** * Return array of callbacks for `event`. * * @param {String} event * @return {Array} * @api public */ Emitter.prototype.listeners = function (event) { this._callbacks = this._callbacks || {}; return this._callbacks['$' + event] || []; }; /** * Check if this emitter has `event` handlers. * * @param {String} event * @return {Boolean} * @api public */ Emitter.prototype.hasListeners = function (event) { return !!this.listeners(event).length; }; /***/ }), /***/ "./node_modules/debug/src/browser.js": /*!*******************************************!*\ !*** ./node_modules/debug/src/browser.js ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { /* eslint-env browser */ /** * This is the web browser implementation of `debug()`. */ exports.formatArgs = formatArgs; exports.save = save; exports.load = load; exports.useColors = useColors; exports.storage = localstorage(); exports.destroy = function () { var warned = false; return function () { if (!warned) { warned = true; console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); } }; }(); /** * Colors. */ exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33']; /** * Currently only WebKit-based Web Inspectors, Firefox >= v31, * and the Firebug extension (any Firefox version) are known * to support "%c" CSS customizations. * * TODO: add a `localStorage` variable to explicitly enable/disable colors */ // eslint-disable-next-line complexity function useColors() { // NB: In an Electron preload script, document will be defined but not fully // initialized. Since we know we're in Chrome, we'll just detect this case // explicitly if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { return true; } // Internet Explorer and Edge do not support colors. if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { return false; } // Is webkit? http://stackoverflow.com/a/16459606/376773 // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); } /** * Colorize log arguments if enabled. * * @api public */ function formatArgs(args) { args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff); if (!this.useColors) { return; } var c = 'color: ' + this.color; args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other // arguments passed either before or after the %c, so we need to // figure out the correct index to insert the CSS into var index = 0; var lastC = 0; args[0].replace(/%[a-zA-Z%]/g, function (match) { if (match === '%%') { return; } index++; if (match === '%c') { // We only are interested in the *last* %c // (the user may have provided their own) lastC = index; } }); args.splice(lastC, 0, c); } /** * Invokes `console.debug()` when available. * No-op when `console.debug` is not a "function". * If `console.debug` is not available, falls back * to `console.log`. * * @api public */ exports.log = console.debug || console.log || function () {}; /** * Save `namespaces`. * * @param {String} namespaces * @api private */ function save(namespaces) { try { if (namespaces) { exports.storage.setItem('debug', namespaces); } else { exports.storage.removeItem('debug'); } } catch (error) {// Swallow // XXX (@Qix-) should we be logging these? } } /** * Load `namespaces`. * * @return {String} returns the previously persisted debug modes * @api private */ function load() { var r; try { r = exports.storage.getItem('debug'); } catch (error) {// Swallow // XXX (@Qix-) should we be logging these? } // If debug isn't set in LS, and we're in Electron, try to load $DEBUG if (!r && typeof process !== 'undefined' && 'env' in process) { r = process.env.DEBUG; } return r; } /** * Localstorage attempts to return the localstorage. * * This is necessary because safari throws * when a user disables cookies/localstorage * and you attempt to access it. * * @return {LocalStorage} * @api private */ function localstorage() { try { // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context // The Browser also has localStorage in the global context. return localStorage; } catch (error) {// Swallow // XXX (@Qix-) should we be logging these? } } module.exports = __webpack_require__(/*! ./common */ "./node_modules/debug/src/common.js")(exports); var formatters = module.exports.formatters; /** * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. */ formatters.j = function (v) { try { return JSON.stringify(v); } catch (error) { return '[UnexpectedJSONParseError]: ' + error.message; } }; /***/ }), /***/ "./node_modules/debug/src/common.js": /*!******************************************!*\ !*** ./node_modules/debug/src/common.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } /** * This is the common logic for both the Node.js and web browser * implementations of `debug()`. */ function setup(env) { createDebug.debug = createDebug; createDebug["default"] = createDebug; createDebug.coerce = coerce; createDebug.disable = disable; createDebug.enable = enable; createDebug.enabled = enabled; createDebug.humanize = __webpack_require__(/*! ms */ "./node_modules/ms/index.js"); createDebug.destroy = destroy; Object.keys(env).forEach(function (key) { createDebug[key] = env[key]; }); /** * The currently active debug mode names, and names to skip. */ createDebug.names = []; createDebug.skips = []; /** * Map of special "%n" handling functions, for the debug "format" argument. * * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". */ createDebug.formatters = {}; /** * Selects a color for a debug namespace * @param {String} namespace The namespace string for the for the debug instance to be colored * @return {Number|String} An ANSI color code for the given namespace * @api private */ function selectColor(namespace) { var hash = 0; for (var i = 0; i < namespace.length; i++) { hash = (hash << 5) - hash + namespace.charCodeAt(i); hash |= 0; // Convert to 32bit integer } return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; } createDebug.selectColor = selectColor; /** * Create a debugger with the given `namespace`. * * @param {String} namespace * @return {Function} * @api public */ function createDebug(namespace) { var prevTime; var enableOverride = null; function debug() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } // Disabled? if (!debug.enabled) { return; } var self = debug; // Set `diff` timestamp var curr = Number(new Date()); var ms = curr - (prevTime || curr); self.diff = ms; self.prev = prevTime; self.curr = curr; prevTime = curr; args[0] = createDebug.coerce(args[0]); if (typeof args[0] !== 'string') { // Anything else let's inspect with %O args.unshift('%O'); } // Apply any `formatters` transformations var index = 0; args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) { // If we encounter an escaped % then don't increase the array index if (match === '%%') { return '%'; } index++; var formatter = createDebug.formatters[format]; if (typeof formatter === 'function') { var val = args[index]; match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format` args.splice(index, 1); index--; } return match; }); // Apply env-specific formatting (colors, etc.) createDebug.formatArgs.call(self, args); var logFn = self.log || createDebug.log; logFn.apply(self, args); } debug.namespace = namespace; debug.useColors = createDebug.useColors(); debug.color = createDebug.selectColor(namespace); debug.extend = extend; debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. Object.defineProperty(debug, 'enabled', { enumerable: true, configurable: false, get: function get() { return enableOverride === null ? createDebug.enabled(namespace) : enableOverride; }, set: function set(v) { enableOverride = v; } }); // Env-specific initialization logic for debug instances if (typeof createDebug.init === 'function') { createDebug.init(debug); } return debug; } function extend(namespace, delimiter) { var newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); newDebug.log = this.log; return newDebug; } /** * Enables a debug mode by namespaces. This can include modes * separated by a colon and wildcards. * * @param {String} namespaces * @api public */ function enable(namespaces) { createDebug.save(namespaces); createDebug.names = []; createDebug.skips = []; var i; var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); var len = split.length; for (i = 0; i < len; i++) { if (!split[i]) { // ignore empty strings continue; } namespaces = split[i].replace(/\*/g, '.*?'); if (namespaces[0] === '-') { createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); } else { createDebug.names.push(new RegExp('^' + namespaces + '$')); } } } /** * Disable debug output. * * @return {String} namespaces * @api public */ function disable() { var namespaces = [].concat(_toConsumableArray(createDebug.names.map(toNamespace)), _toConsumableArray(createDebug.skips.map(toNamespace).map(function (namespace) { return '-' + namespace; }))).join(','); createDebug.enable(''); return namespaces; } /** * Returns true if the given mode name is enabled, false otherwise. * * @param {String} name * @return {Boolean} * @api public */ function enabled(name) { if (name[name.length - 1] === '*') { return true; } var i; var len; for (i = 0, len = createDebug.skips.length; i < len; i++) { if (createDebug.skips[i].test(name)) { return false; } } for (i = 0, len = createDebug.names.length; i < len; i++) { if (createDebug.names[i].test(name)) { return true; } } return false; } /** * Convert regexp to namespace * * @param {RegExp} regxep * @return {String} namespace * @api private */ function toNamespace(regexp) { return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, '*'); } /** * Coerce `val`. * * @param {Mixed} val * @return {Mixed} * @api private */ function coerce(val) { if (val instanceof Error) { return val.stack || val.message; } return val; } /** * XXX DO NOT USE. This is a temporary stub function. * XXX It WILL be removed in the next major release. */ function destroy() { console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); } createDebug.enable(createDebug.load()); return createDebug; } module.exports = setup; /***/ }), /***/ "./node_modules/engine.io-client/lib/globalThis.browser.js": /*!*****************************************************************!*\ !*** ./node_modules/engine.io-client/lib/globalThis.browser.js ***! \*****************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = function () { if (typeof self !== "undefined") { return self; } else if (typeof window !== "undefined") { return window; } else { return Function("return this")(); } }(); /***/ }), /***/ "./node_modules/engine.io-client/lib/index.js": /*!****************************************************!*\ !*** ./node_modules/engine.io-client/lib/index.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Socket = __webpack_require__(/*! ./socket */ "./node_modules/engine.io-client/lib/socket.js"); module.exports = function (uri, opts) { return new Socket(uri, opts); }; /** * Expose deps for legacy compatibility * and standalone browser access. */ module.exports.Socket = Socket; module.exports.protocol = Socket.protocol; // this is an int module.exports.Transport = __webpack_require__(/*! ./transport */ "./node_modules/engine.io-client/lib/transport.js"); module.exports.transports = __webpack_require__(/*! ./transports/index */ "./node_modules/engine.io-client/lib/transports/index.js"); module.exports.parser = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js"); /***/ }), /***/ "./node_modules/engine.io-client/lib/socket.js": /*!*****************************************************!*\ !*** ./node_modules/engine.io-client/lib/socket.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var transports = __webpack_require__(/*! ./transports/index */ "./node_modules/engine.io-client/lib/transports/index.js"); var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("engine.io-client:socket"); var parser = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js"); var parseuri = __webpack_require__(/*! parseuri */ "./node_modules/parseuri/index.js"); var parseqs = __webpack_require__(/*! parseqs */ "./node_modules/parseqs/index.js"); var Socket = /*#__PURE__*/function (_Emitter) { _inherits(Socket, _Emitter); var _super = _createSuper(Socket); /** * Socket constructor. * * @param {String|Object} uri or options * @param {Object} options * @api public */ function Socket(uri) { var _this; var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, Socket); _this = _super.call(this); if (uri && "object" === _typeof(uri)) { opts = uri; uri = null; } if (uri) { uri = parseuri(uri); opts.hostname = uri.host; opts.secure = uri.protocol === "https" || uri.protocol === "wss"; opts.port = uri.port; if (uri.query) opts.query = uri.query; } else if (opts.host) { opts.hostname = parseuri(opts.host).host; } _this.secure = null != opts.secure ? opts.secure : typeof location !== "undefined" && "https:" === location.protocol; if (opts.hostname && !opts.port) { // if no port is specified manually, use the protocol default opts.port = _this.secure ? "443" : "80"; } _this.hostname = opts.hostname || (typeof location !== "undefined" ? location.hostname : "localhost"); _this.port = opts.port || (typeof location !== "undefined" && location.port ? location.port : _this.secure ? 443 : 80); _this.transports = opts.transports || ["polling", "websocket"]; _this.readyState = ""; _this.writeBuffer = []; _this.prevBufferLen = 0; _this.opts = _extends({ path: "/engine.io", agent: false, withCredentials: false, upgrade: true, jsonp: true, timestampParam: "t", rememberUpgrade: false, rejectUnauthorized: true, perMessageDeflate: { threshold: 1024 }, transportOptions: {} }, opts); _this.opts.path = _this.opts.path.replace(/\/$/, "") + "/"; if (typeof _this.opts.query === "string") { _this.opts.query = parseqs.decode(_this.opts.query); } // set on handshake _this.id = null; _this.upgrades = null; _this.pingInterval = null; _this.pingTimeout = null; // set on heartbeat _this.pingTimeoutTimer = null; if (typeof addEventListener === "function") { addEventListener("beforeunload", function () { if (_this.transport) { // silently close the transport _this.transport.removeAllListeners(); _this.transport.close(); } }, false); if (_this.hostname !== "localhost") { _this.offlineEventListener = function () { _this.onClose("transport close"); }; addEventListener("offline", _this.offlineEventListener, false); } } _this.open(); return _this; } /** * Creates transport of the given type. * * @param {String} transport name * @return {Transport} * @api private */ _createClass(Socket, [{ key: "createTransport", value: function createTransport(name) { debug('creating transport "%s"', name); var query = clone(this.opts.query); // append engine.io protocol identifier query.EIO = parser.protocol; // transport name query.transport = name; // session id if we already have one if (this.id) query.sid = this.id; var opts = _extends({}, this.opts.transportOptions[name], this.opts, { query: query, socket: this, hostname: this.hostname, secure: this.secure, port: this.port }); debug("options: %j", opts); return new transports[name](opts); } /** * Initializes transport to use and starts probe. * * @api private */ }, { key: "open", value: function open() { var transport; if (this.opts.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf("websocket") !== -1) { transport = "websocket"; } else if (0 === this.transports.length) { // Emit error on next tick so it can be listened to var self = this; setTimeout(function () { self.emit("error", "No transports available"); }, 0); return; } else { transport = this.transports[0]; } this.readyState = "opening"; // Retry with the next transport if the transport is disabled (jsonp: false) try { transport = this.createTransport(transport); } catch (e) { debug("error while creating transport: %s", e); this.transports.shift(); this.open(); return; } transport.open(); this.setTransport(transport); } /** * Sets the current transport. Disables the existing one (if any). * * @api private */ }, { key: "setTransport", value: function setTransport(transport) { debug("setting transport %s", transport.name); var self = this; if (this.transport) { debug("clearing existing transport %s", this.transport.name); this.transport.removeAllListeners(); } // set up transport this.transport = transport; // set up transport listeners transport.on("drain", function () { self.onDrain(); }).on("packet", function (packet) { self.onPacket(packet); }).on("error", function (e) { self.onError(e); }).on("close", function () { self.onClose("transport close"); }); } /** * Probes a transport. * * @param {String} transport name * @api private */ }, { key: "probe", value: function probe(name) { debug('probing transport "%s"', name); var transport = this.createTransport(name, { probe: 1 }); var failed = false; var self = this; Socket.priorWebsocketSuccess = false; function onTransportOpen() { if (self.onlyBinaryUpgrades) { var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary; failed = failed || upgradeLosesBinary; } if (failed) return; debug('probe transport "%s" opened', name); transport.send([{ type: "ping", data: "probe" }]); transport.once("packet", function (msg) { if (failed) return; if ("pong" === msg.type && "probe" === msg.data) { debug('probe transport "%s" pong', name); self.upgrading = true; self.emit("upgrading", transport); if (!transport) return; Socket.priorWebsocketSuccess = "websocket" === transport.name; debug('pausing current transport "%s"', self.transport.name); self.transport.pause(function () { if (failed) return; if ("closed" === self.readyState) return; debug("changing transport and sending upgrade packet"); cleanup(); self.setTransport(transport); transport.send([{ type: "upgrade" }]); self.emit("upgrade", transport); transport = null; self.upgrading = false; self.flush(); }); } else { debug('probe transport "%s" failed', name); var err = new Error("probe error"); err.transport = transport.name; self.emit("upgradeError", err); } }); } function freezeTransport() { if (failed) return; // Any callback called by transport should be ignored since now failed = true; cleanup(); transport.close(); transport = null; } // Handle any error that happens while probing function onerror(err) { var error = new Error("probe error: " + err); error.transport = transport.name; freezeTransport(); debug('probe transport "%s" failed because of error: %s', name, err); self.emit("upgradeError", error); } function onTransportClose() { onerror("transport closed"); } // When the socket is closed while we're probing function onclose() { onerror("socket closed"); } // When the socket is upgraded while we're probing function onupgrade(to) { if (transport && to.name !== transport.name) { debug('"%s" works - aborting "%s"', to.name, transport.name); freezeTransport(); } } // Remove all listeners on the transport and on self function cleanup() { transport.removeListener("open", onTransportOpen); transport.removeListener("error", onerror); transport.removeListener("close", onTransportClose); self.removeListener("close", onclose); self.removeListener("upgrading", onupgrade); } transport.once("open", onTransportOpen); transport.once("error", onerror); transport.once("close", onTransportClose); this.once("close", onclose); this.once("upgrading", onupgrade); transport.open(); } /** * Called when connection is deemed open. * * @api public */ }, { key: "onOpen", value: function onOpen() { debug("socket open"); this.readyState = "open"; Socket.priorWebsocketSuccess = "websocket" === this.transport.name; this.emit("open"); this.flush(); // we check for `readyState` in case an `open` // listener already closed the socket if ("open" === this.readyState && this.opts.upgrade && this.transport.pause) { debug("starting upgrade probes"); var i = 0; var l = this.upgrades.length; for (; i < l; i++) { this.probe(this.upgrades[i]); } } } /** * Handles a packet. * * @api private */ }, { key: "onPacket", value: function onPacket(packet) { if ("opening" === this.readyState || "open" === this.readyState || "closing" === this.readyState) { debug('socket receive: type "%s", data "%s"', packet.type, packet.data); this.emit("packet", packet); // Socket is live - any packet counts this.emit("heartbeat"); switch (packet.type) { case "open": this.onHandshake(JSON.parse(packet.data)); break; case "ping": this.resetPingTimeout(); this.sendPacket("pong"); this.emit("pong"); break; case "error": var err = new Error("server error"); err.code = packet.data; this.onError(err); break; case "message": this.emit("data", packet.data); this.emit("message", packet.data); break; } } else { debug('packet received with socket readyState "%s"', this.readyState); } } /** * Called upon handshake completion. * * @param {Object} handshake obj * @api private */ }, { key: "onHandshake", value: function onHandshake(data) { this.emit("handshake", data); this.id = data.sid; this.transport.query.sid = data.sid; this.upgrades = this.filterUpgrades(data.upgrades); this.pingInterval = data.pingInterval; this.pingTimeout = data.pingTimeout; this.onOpen(); // In case open handler closes socket if ("closed" === this.readyState) return; this.resetPingTimeout(); } /** * Sets and resets ping timeout timer based on server pings. * * @api private */ }, { key: "resetPingTimeout", value: function resetPingTimeout() { var _this2 = this; clearTimeout(this.pingTimeoutTimer); this.pingTimeoutTimer = setTimeout(function () { _this2.onClose("ping timeout"); }, this.pingInterval + this.pingTimeout); if (this.opts.autoUnref) { this.pingTimeoutTimer.unref(); } } /** * Called on `drain` event * * @api private */ }, { key: "onDrain", value: function onDrain() { this.writeBuffer.splice(0, this.prevBufferLen); // setting prevBufferLen = 0 is very important // for example, when upgrading, upgrade packet is sent over, // and a nonzero prevBufferLen could cause problems on `drain` this.prevBufferLen = 0; if (0 === this.writeBuffer.length) { this.emit("drain"); } else { this.flush(); } } /** * Flush write buffers. * * @api private */ }, { key: "flush", value: function flush() { if ("closed" !== this.readyState && this.transport.writable && !this.upgrading && this.writeBuffer.length) { debug("flushing %d packets in socket", this.writeBuffer.length); this.transport.send(this.writeBuffer); // keep track of current length of writeBuffer // splice writeBuffer and callbackBuffer on `drain` this.prevBufferLen = this.writeBuffer.length; this.emit("flush"); } } /** * Sends a message. * * @param {String} message. * @param {Function} callback function. * @param {Object} options. * @return {Socket} for chaining. * @api public */ }, { key: "write", value: function write(msg, options, fn) { this.sendPacket("message", msg, options, fn); return this; } }, { key: "send", value: function send(msg, options, fn) { this.sendPacket("message", msg, options, fn); return this; } /** * Sends a packet. * * @param {String} packet type. * @param {String} data. * @param {Object} options. * @param {Function} callback function. * @api private */ }, { key: "sendPacket", value: function sendPacket(type, data, options, fn) { if ("function" === typeof data) { fn = data; data = undefined; } if ("function" === typeof options) { fn = options; options = null; } if ("closing" === this.readyState || "closed" === this.readyState) { return; } options = options || {}; options.compress = false !== options.compress; var packet = { type: type, data: data, options: options }; this.emit("packetCreate", packet); this.writeBuffer.push(packet); if (fn) this.once("flush", fn); this.flush(); } /** * Closes the connection. * * @api private */ }, { key: "close", value: function close() { var self = this; if ("opening" === this.readyState || "open" === this.readyState) { this.readyState = "closing"; if (this.writeBuffer.length) { this.once("drain", function () { if (this.upgrading) { waitForUpgrade(); } else { close(); } }); } else if (this.upgrading) { waitForUpgrade(); } else { close(); } } function close() { self.onClose("forced close"); debug("socket closing - telling transport to close"); self.transport.close(); } function cleanupAndClose() { self.removeListener("upgrade", cleanupAndClose); self.removeListener("upgradeError", cleanupAndClose); close(); } function waitForUpgrade() { // wait for upgrade to finish since we can't send packets while pausing a transport self.once("upgrade", cleanupAndClose); self.once("upgradeError", cleanupAndClose); } return this; } /** * Called upon transport error * * @api private */ }, { key: "onError", value: function onError(err) { debug("socket error %j", err); Socket.priorWebsocketSuccess = false; this.emit("error", err); this.onClose("transport error", err); } /** * Called upon transport close. * * @api private */ }, { key: "onClose", value: function onClose(reason, desc) { if ("opening" === this.readyState || "open" === this.readyState || "closing" === this.readyState) { debug('socket close with reason: "%s"', reason); var self = this; // clear timers clearTimeout(this.pingIntervalTimer); clearTimeout(this.pingTimeoutTimer); // stop event from firing again for transport this.transport.removeAllListeners("close"); // ensure transport won't stay open this.transport.close(); // ignore further transport communication this.transport.removeAllListeners(); if (typeof removeEventListener === "function") { removeEventListener("offline", this.offlineEventListener, false); } // set ready state this.readyState = "closed"; // clear session id this.id = null; // emit close event this.emit("close", reason, desc); // clean buffers after, so users can still // grab the buffers on `close` event self.writeBuffer = []; self.prevBufferLen = 0; } } /** * Filters upgrades, returning only those matching client transports. * * @param {Array} server upgrades * @api private * */ }, { key: "filterUpgrades", value: function filterUpgrades(upgrades) { var filteredUpgrades = []; var i = 0; var j = upgrades.length; for (; i < j; i++) { if (~this.transports.indexOf(upgrades[i])) filteredUpgrades.push(upgrades[i]); } return filteredUpgrades; } }]); return Socket; }(Emitter); Socket.priorWebsocketSuccess = false; /** * Protocol version. * * @api public */ Socket.protocol = parser.protocol; // this is an int function clone(obj) { var o = {}; for (var i in obj) { if (obj.hasOwnProperty(i)) { o[i] = obj[i]; } } return o; } module.exports = Socket; /***/ }), /***/ "./node_modules/engine.io-client/lib/transport.js": /*!********************************************************!*\ !*** ./node_modules/engine.io-client/lib/transport.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var parser = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js"); var Emitter = __webpack_require__(/*! component-emitter */ "./node_modules/component-emitter/index.js"); var debug = __webpack_require__(/*! debug */ "./node_modules/debug/src/browser.js")("engine.io-client:transport"); var Transport = /*#__PURE__*/function (_Emitter) { _inherits(Transport, _Emitter); var _super = _createSuper(Transport); /** * Transport abstract constructor. * * @param {Object} options. * @api private */ function Transport(opts) { var _this; _classCallCheck(this, Transport); _this = _super.call(this); _this.opts = opts; _this.query = opts.query; _this.readyState = ""; _this.socket = opts.socket; return _this; } /** * Emits an error. * * @param {String} str * @return {Transport} for chaining * @api public */ _createClass(Transport, [{ key: "onError", value: function onError(msg, desc) { var err = new Error(msg); err.type = "TransportError"; err.description = desc; this.emit("error", err); return this; } /** * Opens the transport. * * @api public */ }, { key: "open", value: function open() { if ("closed" === this.readyState || "" === this.readyState) { this.readyState = "opening"; this.doOpen(); } return this; } /** * Closes the transport. * * @api private */ }, { key: "close", value: function close() { if ("opening" === this.readyState || "open" === this.readyState) { this.doClose(); this.onClose(); } return this; } /** * Sends multiple packets. * * @param {Array} packets * @api private */ }, { key: "send", value: function send(packets) { if ("open" === this.readyState) { this.write(packets); } else { // this might happen if the transport was silently closed in the beforeunload event handler debug("transport is not open, discarding packets"); } } /** * Called upon open * * @api private */ }, { key: "onOpen", value: function onOpen() { this.readyState = "open"; this.writable = true; this.emit("open"); } /** * Called with data. * * @param {String} data * @api private */ }, { key: "onData", value: function onData(data) { var packet = parser.decodePacket(data, this.socket.binaryType); this.onPacket(packet); } /** * Called with a decoded packet. */ }, { key: "onPacket", value: function onPacket(packet) { this.emit("packet", packet); } /** * Called upon close. * * @api private */ }, { key: "onClose", value: function onClose() { this.readyState = "closed"; this.emit("close"); } }]); return Transport; }(Emitter); module.exports = Transport; /***/ }), /***/ "./node_modules/engine.io-client/lib/transports/index.js": /*!***************************************************************!*\ !*** ./node_modules/engine.io-client/lib/transports/index.js ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var XMLHttpRequest = __webpack_require__(/*! ../../contrib/xmlhttprequest-ssl/XMLHttpRequest */ "./node_modules/engine.io-client/lib/xmlhttprequest.js"); var XHR = __webpack_require__(/*! ./polling-xhr */ "./node_modules/engine.io-client/lib/transports/polling-xhr.js"); var JSONP = __webpack_require__(/*! ./polling-jsonp */ "./node_modules/engine.io-client/lib/transports/polling-jsonp.js"); var websocket = __webpack_require__(/*! ./websocket */ "./node_modules/engine.io-client/lib/transports/websocket.js"); exports.polling = polling; exports.websocket = websocket; /** * Polling transport polymorphic constructor. * Decides on xhr vs jsonp based on feature detection. * * @api private */ function polling(opts) { var xhr; var xd = false; var xs = false; var jsonp = false !== opts.jsonp; if (typeof location !== "undefined") { var isSSL = "https:" === location.protocol; var port = location.port; // some user agents have empty `location.port` if (!port) { port = isSSL ? 443 : 80; } xd = opts.hostname !== location.hostname || port !== opts.port; xs = opts.secure !== isSSL; } opts.xdomain = xd; opts.xscheme = xs; xhr = new XMLHttpRequest(opts); if ("open" in xhr && !opts.forceJSONP) { return new XHR(opts); } else { if (!jsonp) throw new Error("JSONP disabled"); return new JSONP(opts); } } /***/ }), /***/ "./node_modules/engine.io-client/lib/transports/polling-jsonp.js": /*!***********************************************************************!*\ !*** ./node_modules/engine.io-client/lib/transports/polling-jsonp.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var Polling = __webpack_require__(/*! ./polling */ "./node_modules/engine.io-client/lib/transports/polling.js"); var globalThis = __webpack_require__(/*! ../globalThis */ "./node_modules/engine.io-client/lib/globalThis.browser.js"); var rNewline = /\n/g; var rEscapedNewline = /\\n/g; /** * Global JSONP callbacks. */ var callbacks; var JSONPPolling = /*#__PURE__*/function (_Polling) { _inherits(JSONPPolling, _Polling); var _super = _createSuper(JSONPPolling); /** * JSONP Polling constructor. * * @param {Object} opts. * @api public */ function JSONPPolling(opts) { var _this; _classCallCheck(this, JSONPPolling); _this = _super.call(this, opts); _this.query = _this.query || {}; // define global callbacks array if not present // we do this here (lazily) to avoid unneeded global pollution if (!callbacks) { // we need to consider multiple engines in the same page callbacks = globalThis.___eio = globalThis.___eio || []; } // callback identifier _this.index = callbacks.length; // add callback to jsonp global var self = _assertThisInitialized(_this); callbacks.push(function (msg) { self.onData(msg); }); // append to query string _this.query.j = _this.index; return _this; } /** * JSONP only supports binary as base64 encoded strings */ _createClass(JSONPPolling, [{ key: "doClose", /** * Closes the socket. * * @api private */ value: function doClose() { if (this.script) { // prevent spurious errors from being emitted when the window is unloaded this.script.onerror = function () {}; this.script.parentNode.removeChild(this.script); this.script = null; } if (this.form) { this.form.parentNode.removeChild(this.form); this.form = null; this.iframe = null; } _get(_getPrototypeOf(JSONPPolling.prototype), "doClose", this).call(this); } /** * Starts a poll cycle. * * @api private */ }, { key: "doPoll", value: function doPoll() { var self = this; var script = document.createElement("script"); if (this.script) { this.script.parentNode.removeChild(this.script); this.script = null; } script.async = true; script.src = this.uri(); script.onerror = function (e) { self.onError("jsonp poll error", e); }; var insertAt = document.getElementsByTagName("script")[0]; if (insertAt) { insertAt.parentNode.insertBefore(script, insertAt); } else { (document.head || document.body).appendChild(script); } this.script = script; var isUAgecko = "undefined" !== typeof navigator && /gecko/i.test(navigator.userAgent); if (isUAgecko) { setTimeout(function () { var iframe = document.createElement("iframe"); document.body.appendChild(iframe); document.body.removeChild(iframe); }, 100); } } /** * Writes with a hidden iframe. * * @param {String} data to send * @param {Function} called upon flush. * @api private */ }, { key: "doWrite", value: function doWrite(data, fn) { var self = this; var iframe; if (!this.form) { var form = document.createElement("form"); var area = document.createElement("textarea"); var id = this.iframeId = "eio_iframe_" + this.index; form.className = "socketio"; form.style.position = "absolute"; form.style.top = "-1000px"; form.style.left = "-1000px"; form.target = id; form.method = "POST"; form.setAttribute("accept-charset", "utf-8"); area.name = "d"; form.appendChild(area); document.body.appendChild(form); this.form = form; this.area = area; } this.form.action = this.uri(); function complete() { initIframe(); fn(); } function initIframe() { if (self.iframe) { try { self.form.removeChild(self.iframe); } catch (e) { self.onError("jsonp polling iframe removal error", e); } } try { // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) var html = '