pax_global_header00006660000000000000000000000064151503626040014514gustar00rootroot0000000000000052 comment=b0b3c64725abacb1a1966afe5fabe18fd0f84a1b KDAB-hotspot-41e5de7/000077500000000000000000000000001515036260400143335ustar00rootroot00000000000000KDAB-hotspot-41e5de7/.clang-format000066400000000000000000000026251515036260400167130ustar00rootroot00000000000000--- BasedOnStyle: WebKit Language: Cpp AlignAfterOpenBracket: true AlwaysBreakTemplateDeclarations: true SpaceAfterTemplateKeyword: false BreakBeforeBraces: Custom BreakConstructorInitializersBeforeComma: true BreakBeforeBinaryOperators: NonAssignment BraceWrapping: AfterClass: true AfterControlStatement: false AfterEnum: true AfterFunction: true AfterNamespace: false AfterObjCDeclaration: false AfterStruct: true AfterUnion: false BeforeCatch: false BeforeElse: false IndentBraces: false ColumnLimit: 120 Standard: Cpp11 IndentWidth: 4 TabWidth: 8 UseTab: Never PointerAlignment: Left SpacesInParentheses: false SpacesInAngles: false SpaceInEmptyParentheses: false SpacesInCStyleCastParentheses: false SpaceAfterControlStatementKeyword: true SpaceBeforeAssignmentOperators: true ContinuationIndentWidth: 4 Cpp11BracedListStyle: true IncludeCategories: - Regex: '^ space characters (utf-8 0x20). In cases where the layout would # require a fractional tab character, the behavior of the fractional # indentation is governed by use_tabchars = False # If is True, then the value of this variable indicates how # fractional indentions are handled during whitespace replacement. If set to # 'use-space', fractional indentation is left as spaces (utf-8 0x20). If set # to `round-up` fractional indentation is replaced with a single tab character # (utf-8 0x09) effectively shifting the column to the next tabstop fractional_tab_policy = 'use-space' # If an argument group contains more than this many sub-groups (parg or kwarg # groups) then force it to a vertical layout. max_subgroups_hwrap = 2 # If a positional argument group contains more than this many arguments, then # force it to a vertical layout. max_pargs_hwrap = 4 # If a cmdline positional group consumes more than this many lines without # nesting, then invalidate the layout (and nest) max_rows_cmdline = 2 # If true, separate flow control names from their parentheses with a space separate_ctrl_name_with_space = False # If true, separate function names from parentheses with a space separate_fn_name_with_space = False # If a statement is wrapped to more than one line, than dangle the closing # parenthesis on its own line. dangle_parens = True # If the trailing parenthesis must be 'dangled' on its on line, then align it # to this reference: `prefix`: the start of the statement, `prefix-indent`: # the start of the statement, plus one indentation level, `child`: align to # the column of the arguments dangle_align = 'prefix' # If the statement spelling length (including space and parenthesis) is # smaller than this amount, then force reject nested layouts. min_prefix_chars = 4 # If the statement spelling length (including space and parenthesis) is larger # than the tab width by more than this amount, then force reject un-nested # layouts. max_prefix_chars = 10 # If a candidate layout is wrapped horizontally but it exceeds this many # lines, then reject the layout. max_lines_hwrap = 2 # What style line endings to use in the output. line_ending = 'unix' # Format command names consistently as 'lower' or 'upper' case command_case = 'lower' # Format keywords consistently as 'lower' or 'upper' case keyword_case = 'upper' # A list of command names which should always be wrapped always_wrap = ["add_executable", "add_library", "target_link_libraries", "target_include_directories", "install"] # If true, the argument lists which are known to be sortable will be sorted # lexicographicall enable_sort = True # If true, the parsers may infer whether or not an argument list is sortable # (without annotation). autosort = True # By default, if cmake-format cannot successfully fit everything into the # desired linewidth it will apply the last, most agressive attempt that it # made. If this flag is True, however, cmake-format will print error, exit # with non-zero status code, and write-out nothing require_valid_layout = False # A dictionary mapping layout nodes to a list of wrap decisions. See the # documentation for more information. layout_passes = {} # ------------------------------------------------ # Options affecting comment reflow and formatting. # ------------------------------------------------ with section("markup"): # What character to use for bulleted lists bullet_char = '*' # What character to use as punctuation after numerals in an enumerated list enum_char = '.' # If comment markup is enabled, don't reflow the first comment block in each # listfile. Use this to preserve formatting of your copyright/license # statements. first_comment_is_literal = False # If comment markup is enabled, don't reflow any comment block which matches # this (regex) pattern. Default is `None` (disabled). literal_comment_pattern = None # Regular expression to match preformat fences in comments default= # ``r'^\s*([`~]{3}[`~]*)(.*)$'`` fence_pattern = '^\\s*([`~]{3}[`~]*)(.*)$' # Regular expression to match rulers in comments default= # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'`` ruler_pattern = '^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$' # If a comment line matches starts with this pattern then it is explicitly a # trailing comment for the preceeding argument. Default is '#<' explicit_trailing_pattern = '#<' # If a comment line starts with at least this many consecutive hash # characters, then don't lstrip() them off. This allows for lazy hash rulers # where the first hash char is not separated by space hashruler_min_length = 10 # If true, then insert a space between the first hash char and remaining hash # chars in a hash ruler, and normalize its length to fill the column canonicalize_hashrulers = True # enable comment markup parsing and reflow enable_markup = False # ---------------------------- # Options affecting the linter # ---------------------------- with section("lint"): # a list of lint codes to disable disabled_codes = [] # regular expression pattern describing valid function names function_pattern = '[0-9a-z_]+' # regular expression pattern describing valid macro names macro_pattern = '[0-9a-z_]+' # regular expression pattern describing valid names for variables with global # (cache) scope global_var_pattern = '[A-Z][0-9A-Z_]+' # regular expression pattern describing valid names for variables with global # scope (but internal semantic) internal_var_pattern = '[A-Z][0-9A-Z_]+' # regular expression pattern describing valid names for variables with local # scope local_var_pattern = '[A-Za-z][A-Za-z0-9_]+' # regular expression pattern describing valid names for privatedirectory # variables private_var_pattern = '[0-9a-z_]+' # regular expression pattern describing valid names for public directory # variables public_var_pattern = '.*' # regular expression pattern describing valid names for function/macro # arguments and loop variables. argument_var_pattern = '[a-z_][a-z0-9_]+' # regular expression pattern describing valid names for keywords used in # functions or macros keyword_pattern = '[A-Z][0-9A-Z_]+' # In the heuristic for C0201, how many conditionals to match within a loop in # before considering the loop a parser. max_conditionals_custom_parser = 2 # Require at least this many newlines between statements min_statement_spacing = 1 # Require no more than this many newlines between statements max_statement_spacing = 2 max_returns = 6 max_branches = 15 max_arguments = 10 max_localvars = 15 max_statements = 100 # ------------------------------- # Options affecting file encoding # ------------------------------- with section("encode"): # If true, emit the unicode byte-order mark (BOM) at the start of the file emit_byteorder_mark = False # Specify the encoding of the input file. Defaults to utf-8 input_encoding = 'utf-8' # Specify the encoding of the output file. Defaults to utf-8. Note that cmake # only claims to support utf-8 so be careful when using anything else output_encoding = 'utf-8' # ------------------------------------- # Miscellaneous configurations options. # ------------------------------------- with section("misc"): # A dictionary containing any per-command configuration overrides. Currently # only `command_case` is supported. per_command = {} KDAB-hotspot-41e5de7/.dockerignore000066400000000000000000000003011515036260400170010ustar00rootroot00000000000000build*/ .git *.AppImage **/perf.data !3rdparty/perfparser/**/perf.data **/perf.data.old **/a.out 3rdparty/perfparser/build*/ .github scripts/compile-test scripts/appimage scripts/output .cache KDAB-hotspot-41e5de7/.github/000077500000000000000000000000001515036260400156735ustar00rootroot00000000000000KDAB-hotspot-41e5de7/.github/ISSUE_TEMPLATE/000077500000000000000000000000001515036260400200565ustar00rootroot00000000000000KDAB-hotspot-41e5de7/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000013441515036260400225520ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: bug assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Version Info (please complete the following information):** - Linux Kernel version: - perf version: - hotspot version (appimage? selfcompiled?): - if self-compiled hotspot, what version of elfutils: **Additional context** Add any other context about the problem here. KDAB-hotspot-41e5de7/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011341515036260400236020ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: enhancement assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. KDAB-hotspot-41e5de7/.github/workflows/000077500000000000000000000000001515036260400177305ustar00rootroot00000000000000KDAB-hotspot-41e5de7/.github/workflows/build-appimage.yml000066400000000000000000000021431515036260400233330ustar00rootroot00000000000000name: build appimage on: [push, pull_request, workflow_dispatch] jobs: pre_job: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: # All of these options are optional, so you can remove them if you are happy with the defaults concurrent_skipping: 'same_content_newer' do_not_skip: '["workflow_dispatch", "schedule"]' appimage: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Build uses: docker://ghcr.io/kdab/kdesrc-build:latest - name: Upload AppImage uses: actions/upload-artifact@v4 with: name: appimage path: ${{ github.workspace }}/*.AppImage - name: Upload Debug Info uses: actions/upload-artifact@v4 with: name: debuginfo path: ${{ github.workspace }}/hotspot-debuginfo-* KDAB-hotspot-41e5de7/.github/workflows/compile-and-test.yml000066400000000000000000000132251515036260400236230ustar00rootroot00000000000000name: compile and test on: [push, pull_request, workflow_dispatch] jobs: pre_job: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@v5 with: # All of these options are optional, so you can remove them if you are happy with the defaults concurrent_skipping: 'same_content' do_not_skip: '["pull_request", "workflow_dispatch", "schedule"]' ubuntu-2004: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-ubuntu20.04-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -G Ninja -DCMAKE_CXX_FLAGS_INIT="-g -fsanitize=address,undefined -Werror" -DCMAKE_C_FLAGS_INIT="-g -fsanitize=address,undefined -Werror" - name: Build run: cmake --build build - name: Test run: cd build && ctest --output-on-failure -E tst_perfdata ubuntu-2204: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-ubuntu22.04-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-asan -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror - name: Build run: cmake --build build-dev-asan - name: Test run: ctest --preset dev-asan archlinux-gcc: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-archlinuxqt6-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror - name: Build run: cmake --build --preset dev-asan-qt6 - name: Test run: ctest --preset dev-asan-qt6 archlinux-clang-clazy: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-archlinuxqt6-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-clazy-qt6 - name: Build run: cmake --build --preset dev-clazy-qt6 - name: Test run: ctest --preset dev-clazy-qt6 archlinux-clang-tidy: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-archlinuxqt6-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-clazy-qt6 - name: Analyze # the first lines ensures all moc generated headers are available run: cd build-dev-clazy-qt6 && ninja -t targets all | grep "mocs_compilation.cpp:" | cut -f1 -d':' | xargs ninja && cd .. && ./scripts/run_clang_tidy.sh build-dev-clazy-qt6 && [ ! -s scripts/fixits/fixits.yaml ] - name: Upload Fixits if: always() uses: actions/upload-artifact@v4 with: name: clang-tidy-fixits path: scripts/fixits/fixits.yaml archlinux-without-optional: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-archlinuxwithoutoptionalqt6-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror - name: Build run: cmake --build --preset dev-asan-qt6 - name: Test run: ctest --preset dev-asan-qt6 fedora42: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-fedora42qt6-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror - name: Build run: cmake --build --preset dev-asan-qt6 - name: Test run: ctest --preset dev-asan-qt6 opensuse-tumbleweed: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-opensusetumbleweedqt6-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror - name: Build run: cmake --build --preset dev-asan-qt6 - name: Test run: ctest --preset dev-asan-qt6 neon-qt6: needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest container: ghcr.io/kdab/hotspot-neonqt6-dependencies steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Configure run: cmake --preset dev-asan-qt6 -DCMAKE_CXX_FLAGS_INIT=-Werror -DCMAKE_C_FLAGS_INIT=-Werror - name: Build run: cmake --build --preset dev-asan-qt6 - name: Test run: ctest --preset dev-asan-qt6 KDAB-hotspot-41e5de7/.github/workflows/pre-commit.yml000066400000000000000000000005121515036260400225250ustar00rootroot00000000000000name: pre-commit on: pull_request: push: branches: [master] jobs: pre-commit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: 3.11.x - uses: pre-commit/action@v3.0.1 - uses: webiny/action-conventional-commits@v1.3.0 KDAB-hotspot-41e5de7/.github/workflows/release-appimage.yml000066400000000000000000000027241515036260400236610ustar00rootroot00000000000000name: Create latest release on: push: branches: - 'master' jobs: latest-release: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Build uses: docker://ghcr.io/kdab/kdesrc-build:latest - name: Delete latest release run: | gh release delete continuous --cleanup-tag || true env: GH_TOKEN: ${{ github.token }} - name: Rename artifacts run: | cd ${{ github.workspace }} && mv hotspot-*.AppImage hotspot-continuous.AppImage cd ${{ github.workspace }} && mv hotspot-debuginfo-*.tar.bz2 hotspot-debuginfo-continuous.tar.bz2 - name: Create latest release uses: ncipollo/release-action@v1 with: name: "continuous" tag: "continuous" prerelease: true body: "The newest version directly from the master branch. THIS IS BLEEDING ENDGE AND WILL MOST LIKELY CONTAIN UNKOWN BUGS." token: ${{ secrets.GITHUB_TOKEN }} artifacts: | ${{ github.workspace }}/hotspot-debuginfo-* ${{ github.workspace }}/*.AppImage - name: Release latest release run: | gh release edit continuous --draft=false || true env: GH_TOKEN: ${{ github.token }} - name: Create release PR uses: googleapis/release-please-action@v4.1.1 with: token: ${{ github.token }} release-type: simple KDAB-hotspot-41e5de7/.gitignore000066400000000000000000000002341515036260400163220ustar00rootroot00000000000000build*/ /.project /CMakeLists.txt.user .kdev4 elfutils.build.tar.bz2 rustc_demangle.build.tar.bz2 d-demangle.tar.gz *.actual* *.orig *.cache scripts/output KDAB-hotspot-41e5de7/.gitmodules000066400000000000000000000004451515036260400165130ustar00rootroot00000000000000[submodule "3rdparty/perfparser"] path = 3rdparty/perfparser url = https://github.com/KDAB/perfparser.git # url = git://code.qt.io/qt-creator/perfparser.git [submodule "3rdparty/PrefixTickLabels"] path = 3rdparty/PrefixTickLabels url = https://github.com/koenpoppe/PrefixTickLabels KDAB-hotspot-41e5de7/.gitpod.yml000066400000000000000000000135141515036260400164260ustar00rootroot00000000000000# X11 default option to be able to test the result in the browser image: gitpod/workspace-full-vnc ports: - port: 5900 onOpen: ignore - port: 6080 onOpen: open-preview # build tasks, run in order but waiting on sync-points # last one is seen first tasks: - name: setup coding environment on Ubuntu 22.04 before: | sudo apt-get update sudo apt-get -y upgrade sudo apt-get install -y qtbase5-dev qtbase5-private-dev libqt5svg5-dev libqt5x11extras5-dev \ cmake libdwarf-dev mesa-common-dev libqcustomplot-dev \ libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev \ build-essential curl git wget autotools-dev autoconf libtool liblzma-dev libz-dev gettext cmake \ libzstd-dev ninja-build libdw-dev libelf-dev extra-cmake-modules \ libkf5archive-dev libkf5threadweaver-dev libkf5i18n-dev libkf5configwidgets-dev \ libkf5coreaddons-dev libkf5itemviews-dev libkf5itemmodels-dev libkf5kio-dev libkf5parts-dev \ libkf5solid-dev libkf5windowsystem-dev libkf5notifications-dev libkf5iconthemes-dev libkf5syntaxhighlighting-dev \ appstream \ libqt5x11extras5-dev \ || (echo ERROR: broken setup && exit 1) # note: appstream and libqt5x11extras5-dev are optional for Hotspot, the later is required for KDDockWidgets gp sync-done system-prepare init: | mkdir /workspace/kdevelop-plugins-gdb-printers cd /workspace/kdevelop-plugins-gdb-printers wget "https://invent.kde.org/kdevelop/kdevelop/-/raw/master/plugins/gdb/printers/gdbinit" wget "https://invent.kde.org/kdevelop/kdevelop/-/raw/master/plugins/gdb/printers/helper.py" wget "https://invent.kde.org/kdevelop/kdevelop/-/raw/master/plugins/gdb/printers/kde.py" wget "https://invent.kde.org/kdevelop/kdevelop/-/raw/master/plugins/gdb/printers/qt.py" command: | echo "setup system-wide KDE+QT pretty-printers for GDB" echo "python" | sudo tee -a /etc/gdb/gdbinit echo "import sys" | sudo tee -a /etc/gdb/gdbinit echo "sys.path.insert(0, '/workspace/kdevelop-plugins-gdb-printers')" | sudo tee -a /etc/gdb/gdbinit echo "from qt import register_qt_printers" | sudo tee -a /etc/gdb/gdbinit echo "from kde import register_kde_printers" | sudo tee -a /etc/gdb/gdbinit echo "register_qt_printers (None)" | sudo tee -a /etc/gdb/gdbinit echo "register_kde_printers (None)" | sudo tee -a /etc/gdb/gdbinit echo "end" | sudo tee -a /etc/gdb/gdbinit - name: manual addition of KDDockWidgets (once) env: KDDW_VER: 1.7.0 before: | gp sync-await system-prepare init: | cd /workspace wget https://github.com/KDAB/KDDockWidgets/releases/download/v$KDDW_VER/kddockwidgets-$KDDW_VER.tar.gz tar -xf kddockwidgets-$KDDW_VER.tar.gz cd kddockwidgets-$KDDW_VER cmake -DCMAKE_INSTALL_PREFIX=/opt/KDAB -DCMAKE_BUILD_TYPE=Debug . command: | gp sync-done kddw-prepared - name: manual addition of KDDockWidgets (install) env: KDDW_VER: 1.7.0 command: | gp sync-await kddw-prepared cd /workspace/kddockwidgets-$KDDW_VER nice make -j $(nproc) && sudo make install gp sync-done kddw-installed - name: manual addition of perf env: # PERF_VER: perf-tools-for-v6.1-2-2022-10-16 # KERNEL_REPO: https://github.com/torvalds/linux.git PERF_VER: perf-tools-fixes-for-v6.1-1-2023-01-06 KERNEL_REPO: git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git # use mirror above, when needed before: | gp sync-await system-prepare sudo apt install -y linux-tools-generic libtraceevent1 libpython3-dev # to have the general perf and depedencies setup export PERF_EXEC_PATH="/workspace/linux/tools/perf"; export PATH="/workspace/linux/tools/perf:${PATH}" init: | gp sync-await system-prepare sudo apt install -y bison flex libelf-dev libnewt-dev libdw-dev libaudit-dev libiberty-dev libunwind-dev \ libcap-dev libzstd-dev liblzma-dev libnuma-dev libssl-dev systemtap-sdt-dev libbabeltrace-ctf-dev \ libperl-dev libtraceevent-dev \ binutils-dev gcc-multilib \ python3-dev \ libgtk2.0-dev # asciidoc optional, only for manpages, depdencies are huge cd /workspace git clone --depth 1 --filter=blob:none --sparse $KERNEL_REPO cd linux git sparse-checkout set tools scripts arch git fetch --depth 1 origin $PERF_VER nice make -C tools/perf -j $(nproc) PYTHON=/usr/bin/python3 command: | perf --version gp sync-done perf-prepared - name: aditional checking tools before: | nice gem update gem install mdl npm install -g markdown-toc - name: actual building and running of hotspot before: | # necessary when re-running the workspace export PERF_EXEC_PATH="/workspace/linux/tools/perf"; export PATH="/workspace/linux/tools/perf:${PATH}" init: | mkdir -p build cd build gp sync-await kddw-installed cmake -DCMAKE_INSTALL_PREFIX=/opt/KDAB -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. nice make -j $(nproc) command: | gp sync-await kddw-installed gp sync-await perf-prepared $GITPOD_REPO_ROOTS/build/bin/hotspot $GITPOD_REPO_ROOTS/tests/integrationtests/custom_cost_aggregation_testfiles/custom_cost_aggregation.perfparser # some config to ease working in the browser vscode: extensions: - twxs.cmake - llvm-vs-code-extensions.vscode-clangd - webfreak.debug KDAB-hotspot-41e5de7/.krazy000066400000000000000000000010001515036260400154630ustar00rootroot00000000000000CHECKSETS qt5,c++,foss #KDAB-specific checks EXTRA kdabcopyright #additional checks EXTRA defines,null #coding style settings EXCLUDE style STYLE_CPPSTYLE qt STYLE_OFFSET 4 STYLE_LINEMAX 0 STYLE_CMAKESTYLE_OFFSET 2 #no need to check 3rdparty stuff SKIP /3rdparty/ SKIP /modeltest\. SKIP /processlist_unix|/models/processlist #if you have a build subdir, skip it SKIP /build- #skip the borrowed code in the cmake subdir SKIP /cmake/ECMEnableSanitizers.cmake|/cmake/FindLibElf.cmake|/cmake/FindElfutils.cmake KDAB-hotspot-41e5de7/.mdlrc000066400000000000000000000000221515036260400154270ustar00rootroot00000000000000style ".mdlrc.rb" KDAB-hotspot-41e5de7/.mdlrc.rb000066400000000000000000000003151515036260400160360ustar00rootroot00000000000000all rule 'MD009', :br_spaces => 2 rule 'MD013', :line_length => 120, :tables => false, :code_blocks => false rule 'MD029', :style => :ordered exclude_rule 'MD033' exclude_rule 'MD034' exclude_rule 'MD041' KDAB-hotspot-41e5de7/.pre-commit-config.yaml000066400000000000000000000032001515036260400206070ustar00rootroot00000000000000# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks exclude: ^(/3rdparty/perfparser|/3rdparty/PrefixTickLabels/) repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 hooks: - id: trailing-whitespace exclude: (tests/modeltests/disassembly/) args: ["--markdown-linebreak-ext=md,markdown"] - id: end-of-file-fixer - id: check-added-large-files args: ['--maxkb=1000'] - id: check-case-conflict - id: check-yaml args: [--allow-multiple-documents] - id: check-json - repo: https://github.com/pre-commit/mirrors-clang-format rev: v18.1.8 hooks: - id: clang-format files: (\.cpp|\.h|\.c) - repo: https://github.com/PyCQA/pylint rev: v3.1.0 hooks: - id: pylint args: ["--disable=C0103,C0301,C0114,R0801,E0401"] exclude: (\.cmake-format\.py) - repo: https://github.com/pre-commit/mirrors-autopep8 rev: v1.7.0 hooks: - id: autopep8 - repo: https://github.com/cheshirekow/cmake-format-precommit rev: v0.6.13 hooks: - id: cmake-lint exclude: (cmake/ECMEnableSanitizers\.cmake|cmake/Find|3rdparty/perfparser|3rdparty/PrefixTickLabels|\.h\.cmake$) - id: cmake-format exclude: (cmake/ECMEnableSanitizers\.cmake|cmake/Find|3rdparty/perfparser|3rdparty/PrefixTickLabels|\.h\.cmake$) - repo: https://github.com/markdownlint/markdownlint rev: v0.11.0 hooks: - id: markdownlint entry: mdl language: ruby files: \.(md|mdown|markdown)$ exclude: CHANGELOG.md - repo: https://github.com/compilerla/conventional-pre-commit rev: v3.2.0 hooks: - id: conventional-pre-commit stages: [commit-msg] args: [] KDAB-hotspot-41e5de7/3rdparty/000077500000000000000000000000001515036260400161035ustar00rootroot00000000000000KDAB-hotspot-41e5de7/3rdparty/CMakeLists.txt000066400000000000000000000000721515036260400206420ustar00rootroot00000000000000include(perfparser.cmake) include(PrefixTickLabels.cmake) KDAB-hotspot-41e5de7/3rdparty/PrefixTickLabels/000077500000000000000000000000001515036260400212765ustar00rootroot00000000000000KDAB-hotspot-41e5de7/3rdparty/PrefixTickLabels.cmake000066400000000000000000000004751515036260400223060ustar00rootroot00000000000000check_submodule_exists(PrefixTickLabels PrefixTickLabels/src/PrefixTickLabels.h) add_library(PrefixTickLabels STATIC PrefixTickLabels/src/PrefixTickLabels.cpp ) target_include_directories(PrefixTickLabels PUBLIC PrefixTickLabels/src ) target_link_libraries(PrefixTickLabels PUBLIC Qt::Core ) KDAB-hotspot-41e5de7/3rdparty/perfparser/000077500000000000000000000000001515036260400202545ustar00rootroot00000000000000KDAB-hotspot-41e5de7/3rdparty/perfparser.cmake000066400000000000000000000101171515036260400212560ustar00rootroot00000000000000check_submodule_exists(perfparser perfparser/app/perfdata.h) include(CheckSymbolExists) set(CMAKE_REQUIRED_INCLUDES ${LIBELF_INCLUDE_DIRS} ${LIBDW_INCLUDE_DIR}/elfutils ${LIBDWARF_INCLUDE_DIRS}) set(CMAKE_REQUIRED_LIBRARIES ${LIBDW_LIBRARIES} ${LIBELF_LIBRARIES}) check_symbol_exists(dwfl_get_debuginfod_client "libdwfl.h" HAVE_DWFL_GET_DEBUGINFOD_CLIENT_SYMBOL) set(CMAKE_REQUIRED_LIBRARIES ${LIBDEBUGINFOD_LIBRARIES}) check_symbol_exists(debuginfod_set_user_data "debuginfod.h" HAVE_DEBUGINFOD_SET_USER_DATA) include_directories( ${LIBELF_INCLUDE_DIRS} ${LIBDW_INCLUDE_DIR}/elfutils ${LIBDWARF_INCLUDE_DIRS} perfparser/app ${CMAKE_CURRENT_BINARY_DIR}/perfparser/app ) add_library(libhotspot-perfparser STATIC perfparser/app/perfattributes.cpp perfparser/app/perfheader.cpp perfparser/app/perffilesection.cpp perfparser/app/perffeatures.cpp perfparser/app/perfdata.cpp perfparser/app/perfunwind.cpp perfparser/app/perfregisterinfo.cpp perfparser/app/perfstdin.cpp perfparser/app/perfsymboltable.cpp perfparser/app/perfelfmap.cpp perfparser/app/perfkallsyms.cpp perfparser/app/perfaddresscache.cpp perfparser/app/perftracingdata.cpp perfparser/app/perfdwarfdiecache.cpp perfparser/app/demangler.cpp ) target_link_libraries(libhotspot-perfparser PUBLIC Qt::Core Qt::Network ${LIBDW_LIBRARIES} ${LIBELF_LIBRARIES} ) if (Zstd_FOUND) target_include_directories(libhotspot-perfparser PUBLIC ${Zstd_INCLUDE_DIR}) target_link_libraries(libhotspot-perfparser PUBLIC ${Zstd_LIBRARY}) set(HAVE_ZSTD 1) endif() if (HAVE_DWFL_GET_DEBUGINFOD_CLIENT_SYMBOL AND HAVE_DEBUGINFOD_SET_USER_DATA) target_link_libraries(libhotspot-perfparser PRIVATE ${LIBDEBUGINFOD_LIBRARIES}) set(HAVE_DWFL_GET_DEBUGINFOD_CLIENT 1) endif() add_feature_info(debuginfod HAVE_DWFL_GET_DEBUGINFOD_CLIENT "libdwfl and libdebuginfod are useful for on-demand fetching of debug symbols") configure_file(perfparser/app/config-perfparser.h.in perfparser/app/config-perfparser.h) add_executable(hotspot-perfparser perfparser/app/main.cpp ) target_link_libraries(hotspot-perfparser PRIVATE libhotspot-perfparser ) set_target_properties(hotspot-perfparser PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_LIBEXECDIR}" ) install(TARGETS hotspot-perfparser RUNTIME DESTINATION ${KDE_INSTALL_LIBEXECDIR}) ecm_add_test( perfparser/tests/auto/elfmap/tst_elfmap.cpp LINK_LIBRARIES libhotspot-perfparser Qt::Test TEST_NAME tst_elfmap ) set_target_properties(tst_elfmap PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}" ) ecm_add_test( perfparser/tests/auto/addresscache/tst_addresscache.cpp LINK_LIBRARIES libhotspot-perfparser Qt::Test TEST_NAME tst_addresscache ) set_target_properties(tst_addresscache PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}" ) ecm_add_test( perfparser/tests/auto/perfdata/tst_perfdata.cpp perfparser/tests/auto/shared/perfparsertestclient.cpp perfparser/tests/auto/perfdata/perfdata.qrc LINK_LIBRARIES Qt::Test libhotspot-perfparser TEST_NAME tst_perfdata ) set_target_properties(tst_perfdata PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}" ) include_directories(perfparser/tests/auto/shared) add_executable(perf2text perfparser/tests/manual/perf2text/perf2text.cpp perfparser/tests/auto/shared/perfparsertestclient.cpp ) target_compile_definitions(perf2text PRIVATE MANUAL_TEST ) target_link_libraries(perf2text Qt::Core ) set_target_properties(perf2text PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}" ) add_custom_command(TARGET hotspot-perfparser POST_BUILD COMMAND ${CMAKE_COMMAND} -E create_symlink "${PROJECT_BINARY_DIR}/${KDE_INSTALL_LIBEXECDIR}/hotspot-perfparser" "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}/perfparser" BYPRODUCTS "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}/perfparser" ) KDAB-hotspot-41e5de7/CHANGELOG.md000066400000000000000000000172101515036260400161450ustar00rootroot00000000000000# Changelog ## [1.6.0](https://github.com/KDAB/hotspot/compare/v1.5.1...v1.6.0) (2026-01-28) ### Features * add support for archives ([f375adf](https://github.com/KDAB/hotspot/commit/f375adff8878e99738f99a01ef212f30cc8d63ef)) * allow handling of compressed perfparser files ([90451a7](https://github.com/KDAB/hotspot/commit/90451a74de3ad58367fa99f21c987177d0fe3aaa)) * allow user to specify perf and objdump via command line ([081812d](https://github.com/KDAB/hotspot/commit/081812dba0470990b3e7d1e5f435459767c8efca)), closes [#556](https://github.com/KDAB/hotspot/issues/556) * associate application/x-perf-data and application/x-hotspot with hotspot ([8b8677f](https://github.com/KDAB/hotspot/commit/8b8677f9601465fa136c34279a173fb6a2d3fdf8)), closes [#718](https://github.com/KDAB/hotspot/issues/718) * clarify "Filter In On Thread #%1 By Time" ([91fcdaa](https://github.com/KDAB/hotspot/commit/91fcdaaa6fcadcd7ba7cde37591169463f1d8a33)) * ignore empty command line arguments ([06cfd33](https://github.com/KDAB/hotspot/commit/06cfd336911b0ef8a55aa5faac7df082eb553b7c)) * move compressed test data to files instead of base64 strings ([3e74a87](https://github.com/KDAB/hotspot/commit/3e74a8782a1f8b9b16239b436ea74e18c9cb10b3)) * open more perf files ([b0d370f](https://github.com/KDAB/hotspot/commit/b0d370fa1348edbd0b46a90254f3af6e2f50c72a)) * Parse tracepoint data in hotspot ([1e2ae7b](https://github.com/KDAB/hotspot/commit/1e2ae7b2a212ad14af1a839cceff066c1186d220)) * remove memory leak when calling QLayout::replaceWidget ([0665717](https://github.com/KDAB/hotspot/commit/06657175eaff244d4d7233d2af6ce83557f8544a)) * show current unwind settings in settings dialog ([ec5632c](https://github.com/KDAB/hotspot/commit/ec5632c1090ac6e6ea71cf5325fd1b53feda2d49)) * support regex search ([9da82e4](https://github.com/KDAB/hotspot/commit/9da82e40ef2bba69f49d7df53654373a9cce420a)), closes [#666](https://github.com/KDAB/hotspot/issues/666) * update icons ([d5d9cd4](https://github.com/KDAB/hotspot/commit/d5d9cd48aabf2cc7ef0e36363d3227f215b164f9)), closes [#472](https://github.com/KDAB/hotspot/issues/472) ### Bug Fixes * -Wclazy-function-args-by-ref for signals ([e0c12f1](https://github.com/KDAB/hotspot/commit/e0c12f1875de14dbe2404b7c2324780127320145)) * also support ' and , as branch visualization characters ([f326ef0](https://github.com/KDAB/hotspot/commit/f326ef0d2f651d45ceff36050039cbccb2eac6c7)) * also use Qt6 for OpenSuse tumbleweed CI test coverage ([9185eb6](https://github.com/KDAB/hotspot/commit/9185eb649a1f2fabb2c68469dbca6449dbb2d59f)) * Always call QToolTip::showText with a widget ([ab177e0](https://github.com/KDAB/hotspot/commit/ab177e0c7daee2429ea2a32cb8afe7ee253a1f89)) * apply clang-format ([f77545b](https://github.com/KDAB/hotspot/commit/f77545b173c5bfcfa664d8638c8c54ac1d0b14e8)) * apply cmake-format ([222abb3](https://github.com/KDAB/hotspot/commit/222abb36e8770a373f6f0413efb8d903a10d593c)) * avoid OOB access if source code unreadable ([3a9ea36](https://github.com/KDAB/hotspot/commit/3a9ea36453f8e5c920914ea42051d4d33064b6c3)) * broken flamegraph ([c945f43](https://github.com/KDAB/hotspot/commit/c945f431bc80e86dfd333006e664fa1251bd9996)), closes [#624](https://github.com/KDAB/hotspot/issues/624) * bump perfparser to fix crash on strlen(nullptr) ([9912340](https://github.com/KDAB/hotspot/commit/99123409c7a17afbe2c7a0d95b2d618f0a08a529)) * Bump perfparser to get fixes and silence clang-tidy/clazy CI ([8e468da](https://github.com/KDAB/hotspot/commit/8e468da9f56f1d164ff750d9aaa084a6a2eeb7a9)) * Bump perfparser to properly support COMPRESSED2 data ([b61451d](https://github.com/KDAB/hotspot/commit/b61451d827dd23e35c5f611e3626226a119dfa48)) * bump perfparser with fix for clazy-function-args-by-value ([ef74c0f](https://github.com/KDAB/hotspot/commit/ef74c0fc8c55132948741802d84533cf8d7d0288)) * cast to silence compiler warning for Qt6 without ksyntaxhighlighting ([e906456](https://github.com/KDAB/hotspot/commit/e906456dd72058797a7f726670fe3b3652963410)) * cleanup qcustomplot header to silence clazy warnings ([e27c66c](https://github.com/KDAB/hotspot/commit/e27c66cad874954fdb01a2b02e586ad2a775f1a9)) * clear more members in SourceCodeModel::clear ([ebdeab1](https://github.com/KDAB/hotspot/commit/ebdeab15bd6dc73e1747341b2de1811415bfa396)) * correct cost attribution of inline frames in disassembly view ([36bedef](https://github.com/KDAB/hotspot/commit/36bedef070d5b846d2be416e96a860220904e14a)) * crash if hotspot is closed while loading a file ([221d60e](https://github.com/KDAB/hotspot/commit/221d60e92f3ca2a5fe0530b1ec48b71f86112984)), closes [#654](https://github.com/KDAB/hotspot/issues/654) * crash when attaching to a running process ([#699](https://github.com/KDAB/hotspot/issues/699)) ([37215fa](https://github.com/KDAB/hotspot/commit/37215fa0a5e69b7d3968feb323749a5fc65c65d5)) * display disassembly correctly on aarch64 ([fcdabab](https://github.com/KDAB/hotspot/commit/fcdabab5166ab26e7b60f2a0ad55cad2e4af1561)) * don't leak memory when extracting archives ([177fecf](https://github.com/KDAB/hotspot/commit/177fecf50da7bb78512cd9ec3b113acad57f56a6)) * don't try to use a cross-architecture objdump on the native architecture ([36309bf](https://github.com/KDAB/hotspot/commit/36309bf69c8f221b14014709efa6b89606ea47aa)) * escape special symbols in node labels of children, too ([71a3ca8](https://github.com/KDAB/hotspot/commit/71a3ca82832719357d720d66ea096f04a5a5d52a)) * formatTimeString ms format ([5cec693](https://github.com/KDAB/hotspot/commit/5cec69301a3f34ada86ce9fe01a9538b04b3cf7c)) * increase test timeout ([9b35d2b](https://github.com/KDAB/hotspot/commit/9b35d2b0fccc4881fe658e56396568628b8cbbd9)) * install test binaries to correct paths ([b57dee1](https://github.com/KDAB/hotspot/commit/b57dee178d53f8eea9acda34b77ff0ed48f1a94f)) * Move objdump setting to disassembly setting page ([2d1d958](https://github.com/KDAB/hotspot/commit/2d1d958996043857909277ef66931122b55277f7)) * Properly include kgraphviewer_interface.h ([0d216a5](https://github.com/KDAB/hotspot/commit/0d216a5b21f3df2380f63d19e5837729ec82ef19)) * read perf command early in tst_perfparser ([80a0884](https://github.com/KDAB/hotspot/commit/80a08841378b12fbafe7a203a11a7ed228f4378c)) * remove --no-buildid-cache arg that was not used in recorded perf file ([3ccedd4](https://github.com/KDAB/hotspot/commit/3ccedd470e0b637c32034386fc3e8877a87970f6)) * Save & restore custom perf.map path in settings ([ea75b0d](https://github.com/KDAB/hotspot/commit/ea75b0d03e3c988781dbbe645e988afcf4c27e59)) * set buddies and add missin colon in disassembly settings ([112aef3](https://github.com/KDAB/hotspot/commit/112aef32f86ae57eaafb0d06b1d7e19d286da56e)) * stabilize formatted time in timeline tooltips ([13565d5](https://github.com/KDAB/hotspot/commit/13565d5e9fc63f455ab8edffc685ff609acfe700)) * support special characters in callgraph ([fd9f7d1](https://github.com/KDAB/hotspot/commit/fd9f7d10cd00832f2212b36f07da1752cbe550d5)), closes [#691](https://github.com/KDAB/hotspot/issues/691) * unbreak git in github actions ([5b47207](https://github.com/KDAB/hotspot/commit/5b47207b702f0aad46c1ca1eb6ec12ad123d86d5)) * unbreak inlining tst_perfparser tests ([697d846](https://github.com/KDAB/hotspot/commit/697d846c1ee23c13cf3f75500b6e8a2501725ff0)) * Update archlinux CI to use Qt6 ([922c5df](https://github.com/KDAB/hotspot/commit/922c5df6f2f444a5b326946b8491bcf69e55cece)) * update test.sh and push.sh with new container names ([e68038b](https://github.com/KDAB/hotspot/commit/e68038bc5d734b50d98db13295c4a7dd877bb16f)) * update to CI to fedora42 and use Qt6 ([e317188](https://github.com/KDAB/hotspot/commit/e31718820146ebfaf6f91090d03e8df69cb67d63)) * use new-style ENV A=B in docker file ([6ed6e87](https://github.com/KDAB/hotspot/commit/6ed6e8707bb825a54ec310061f731fbb09559f08)) KDAB-hotspot-41e5de7/CMakeLists.txt000066400000000000000000000124611515036260400170770ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.16) project( hotspot VERSION 1.6.0 LANGUAGES CXX C ) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/perfparser/cmake/ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH} ) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) if(NOT DEFINED CMAKE_INSTALL_RPATH_USE_LINK_PATH) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) endif() if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE ) endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) option(APPIMAGE_BUILD "configure build for bundling in an appimage" OFF) option(QT6_BUILD "configure build to use Qt6/KF6" OFF) # Enable the test harness enable_testing() # Version setup set(HOTSPOT_VERSION_STRING "${hotspot_VERSION}") include(HotspotMacrosInternal) include(FeatureSummary) if(QT6_BUILD) set(QT_MAJOR_VERSION 6) set(QT_MIN_VERSION 6.4) set(KDDW_SUFFIX "-qt6") else() set(QT_MAJOR_VERSION 5) set(QT_MIN_VERSION 5.15) set(KDDW_SUFFIX "") endif() find_package( Qt${QT_MAJOR_VERSION} ${QT_MIN_VERSION} COMPONENTS Core Widgets Network Test Svg REQUIRED ) find_package(LibElf REQUIRED) find_package(ElfUtils REQUIRED) find_package(ECM 1.0.0 NO_MODULE REQUIRED) find_package(Threads REQUIRED) find_package(Zstd) find_package(perf) set_package_properties( perf PROPERTIES DESCRIPTION "Performance analysis tools for Linux" PURPOSE "Underlying system tool to record performance data" URL "https://perfwiki.github.io/main/" TYPE RUNTIME ) find_package(objdump) set_package_properties( objdump PROPERTIES DESCRIPTION "Utility to generate disassembler" PURPOSE "Support for annotating individual instructions" URL "https://www.gnu.org/software/binutils/" TYPE RUNTIME ) find_package(LibRustcDemangle) set_package_properties( LibRustcDemangle PROPERTIES DESCRIPTION "Demangling for Rust symbols, written in Rust." PURPOSE "Demangling of Rust symbols" URL "https://github.com/alexcrichton/rustc-demangle" TYPE RUNTIME ) find_package(LibDDemangle) set_package_properties( LibDDemangle PROPERTIES DESCRIPTION "Demangling for D symbols, written in D." PURPOSE "Demangling of D symbols" URL "https://github.com/lievenhey/d_demangler" TYPE RUNTIME ) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) find_package( KF${QT_MAJOR_VERSION} 5.42.0 COMPONENTS ThreadWeaver ConfigWidgets CoreAddons ItemViews ItemModels KIO Solid WindowSystem Notifications IconThemes Parts I18n REQUIRED ) find_package(KF${QT_MAJOR_VERSION}Archive 5.85.0 CONFIG) set(KFArchive_FOUND ${KF${QT_MAJOR_VERSION}Archive_FOUND}) find_package(KF${QT_MAJOR_VERSION}SyntaxHighlighting CONFIG) set(KFSyntaxHighlighting_FOUND ${KF${QT_MAJOR_VERSION}SyntaxHighlighting_FOUND}) find_package(KDDockWidgets${KDDW_SUFFIX} CONFIG) set_package_properties( KDDockWidgets${KDDW_SUFFIX} PROPERTIES PURPOSE "KDDockWidgets is a Qt dock widget library written by KDAB, suitable for replacing QDockWidget and implementing advanced functionalities missing in Qt. https://github.com/KDAB/KDDockWidgets" TYPE REQUIRED ) find_package(QCustomPlot) set_package_properties( QCustomPlot PROPERTIES DESCRIPTION "QCustomPlot is a Qt charting library. https://www.qcustomplot.com/" PURPOSE "Frequency tab" URL "https://www.qcustomplot.com/index.php/download" TYPE OPTIONAL ) find_package(KGraphViewerPart CONFIG) set_package_properties( KGraphViewerPart PROPERTIES DESCRIPTION "KGraphViewer (from KDE extragear) is a tool to display graphviz .dot graphs" PURPOSE "Call graph in the caller/callee tab" URL "https://invent.kde.org/graphics/kgraphviewer" TYPE OPTIONAL ) include(KDEInstallDirs) include(KDECMakeSettings) include(ECMAddTests) include(ECMCoverageOption) include(ECMEnableSanitizers) file(RELATIVE_PATH LIBEXEC_REL_PATH "${KDE_INSTALL_FULL_BINDIR}" "${KDE_INSTALL_FULL_LIBEXECDIR}") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/hotspot-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/hotspot-config.h @ONLY) add_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_USE_QSTRINGBUILDER -DQT_NO_FOREACH) add_compile_options(-Wall -pedantic -Wextra) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wno-gnu-zero-variadic-macro-arguments) endif() add_subdirectory(3rdparty) include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(src) if(NOT APPIMAGE_BUILD) add_subdirectory(tests) endif() install( FILES com.kdab.hotspot.xml DESTINATION ${KDE_INSTALL_MIMEDIR} ) find_package(SharedMimeInfo 1.8) set_package_properties( SharedMimeInfo PROPERTIES TYPE OPTIONAL PURPOSE "Associate hotspot " ) if(SharedMimeInfo_FOUND) update_xdg_mimetypes(${KDE_INSTALL_MIMEDIR}) endif() install( FILES com.kdab.hotspot.desktop DESTINATION ${KDE_INSTALL_APPDIR} ) install( FILES com.kdab.Hotspot.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR} ) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) KDAB-hotspot-41e5de7/CMakePresets.json000066400000000000000000000122021515036260400175510ustar00rootroot00000000000000{ "version": 3, "configurePresets": [ { "name": "dev", "displayName": "dev", "description": "Preset for developers", "generator": "Ninja", "binaryDir": "${sourceDir}/build-${presetName}", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" } }, { "name": "qt6", "cacheVariables": { "QT6_BUILD": "ON" } }, { "name": "asan", "cacheVariables": { "CMAKE_CXX_FLAGS_DEBUG": "-g -fsanitize=address,undefined", "CMAKE_C_FLAGS_DEBUG": "-g -fsanitize=address,undefined" } }, { "name": "dev-qt6", "displayName": "dev with Qt6", "description": "Preset for developers using Qt6", "inherits": [ "dev", "qt6" ] }, { "name": "dev-asan", "displayName": "dev with sanitizers", "description": "Preset for developers with asan and ubsan enabled", "inherits": [ "dev", "asan" ] }, { "name": "dev-asan-qt6", "displayName": "dev with sanitizers, Qt6", "description": "Preset for developers with Qt6, asan and ubsan enabled", "inherits": [ "dev-asan", "qt6" ] }, { "name": "dev-clazy", "displayName": "clazy with sanitizers", "description": "Preset for compiling with clang/clazy and asan and ubsan enabled", "cacheVariables": { "CMAKE_CXX_COMPILER": "clazy", "CMAKE_C_COMPILER": "clang", "CMAKE_CXX_FLAGS": "-Xclang -plugin-arg-clazy -Xclang level0,level1,level2,no-strict-iterators,no-ctor-missing-parent-argument -Werror", "CMAKE_C_FLAGS": "-Werror" }, "inherits": [ "dev-asan" ] }, { "name": "dev-clazy-qt6", "displayName": "clazy with sanitizers, Qt6", "description": "Preset for compiling with clang/clazy, Qt6 and asan and ubsan enabled", "inherits": [ "dev-clazy", "qt6" ] }, { "name": "dev-opt", "displayName": "dev with optimizations", "description": "Preset for developers with compiler optimizations enabled", "cacheVariables": { "CMAKE_BUILD_TYPE": "RelWithDebInfo", "CMAKE_CXX_FLAGS" : "-DQT_FORCE_ASSERTS -DQT_MESSAGELOGCONTEXT" }, "inherits": [ "dev" ] }, { "name": "dev-opt-qt6", "displayName": "dev with Qt6, optimizations", "description": "Preset for developers with Qt6, compiler optimizations enabled", "inherits": [ "dev-opt", "qt6" ] }, { "name": "dev-opt-asan", "displayName": "dev with optimizations and sanitizers", "description": "Preset for developers with compiler optimizations and sanitizers enabled", "inherits": [ "dev-opt", "asan" ] }, { "name": "dev-opt-asan-qt6", "displayName": "dev with optimizations, Qt6 and sanitizers", "description": "Preset for developers with Qt6, compiler optimizations and sanitizers enabled", "inherits": [ "dev-opt-asan", "qt6" ] } ], "buildPresets": [ { "name": "dev", "configurePreset": "dev" }, { "name": "dev-qt6", "configurePreset": "dev-qt6" }, { "name": "dev-asan", "configurePreset": "dev-asan" }, { "name": "dev-asan-qt6", "configurePreset": "dev-asan-qt6" }, { "name": "dev-opt", "configurePreset": "dev-opt" }, { "name": "dev-opt-qt6", "configurePreset": "dev-opt-qt6" }, { "name": "dev-opt-asan", "configurePreset": "dev-opt-asan" }, { "name": "dev-opt-asan-qt6", "configurePreset": "dev-opt-asan-qt6" }, { "name": "dev-clazy", "configurePreset": "dev-clazy" }, { "name": "dev-clazy-qt6", "configurePreset": "dev-clazy-qt6" } ], "testPresets": [ { "name": "base", "hidden": true, "output": {"outputOnFailure": true}, "execution": {"noTestsAction": "error", "stopOnFailure": true} }, { "name": "dev", "configurePreset": "dev", "inherits": "base" }, { "name": "dev-asan", "configurePreset": "dev-asan", "inherits": "base" }, { "name": "dev-opt", "configurePreset": "dev-opt", "inherits": "base" }, { "name": "dev-opt-asan", "configurePreset": "dev-opt-asan", "inherits": "base" }, { "name": "dev-clazy", "configurePreset": "dev-clazy", "inherits": "base" }, { "name": "dev-qt6", "configurePreset": "dev-qt6", "inherits": "base" }, { "name": "dev-asan-qt6", "configurePreset": "dev-asan-qt6", "inherits": "base" }, { "name": "dev-opt-qt6", "configurePreset": "dev-opt-qt6", "inherits": "base" }, { "name": "dev-opt-asan-qt6", "configurePreset": "dev-opt-asan-qt6", "inherits": "base" }, { "name": "dev-clazy-qt6", "configurePreset": "dev-clazy-qt6", "inherits": "base" } ] } KDAB-hotspot-41e5de7/CODE_OF_CONDUCT.md000066400000000000000000000062221515036260400171340ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at milian.wolff@kdab.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ KDAB-hotspot-41e5de7/CONTRIBUTING.md000066400000000000000000000011761515036260400165710ustar00rootroot00000000000000Please send patches targeting the latest master branch via [GitHub pull requests](https://github.com/KDAB/hotspot/pulls). Mind that all contributed changes are under Hotspot's license, the GPL v2+. See [LICENSE.GPL.txt](LICENSE.GPL.txt) for more information Make sure all tests pass before and after you are changing the code. To run the tests, run `ctest`. Please format your git commits per [Conventional Commits specification](https://www.conventionalcommits.org). Install and run `pre-commit` checks before submitting new code for review. If you have questions or need help to get going, send a mail to milian.wolff@kdab.com. KDAB-hotspot-41e5de7/HACKING.md000066400000000000000000000306651515036260400157330ustar00rootroot00000000000000# Developing Hotspot - the Linux perf GUI for performance analysis ## Table of Contents - [Building Hotspot](#building-hotspot) - [Required Dependencies](#required-dependencies) - [On Debian/Ubuntu](#on-debianubuntu) - [On Fedora](#on-fedora) - [Arch Linux](#arch-linux) - [OpenSUSE](#opensuse) - [Building Hotspot itself](#building-hotspot-itself) - [Online](#online) - [Debugging the AppImage](#debugging-the-appimage) - [AppImage-Debugging using manual symbol loading](#appimage-debugging-using-manual-symbol-loading) - [AppImage-Debugging using debuginfod](#appimage-debugging-using-debuginfod) ## Building Hotspot Building hotspot from source gives you the latest and greatest, but you'll have to make sure all its dependencies are available. Most users should probably [install hotspot](README#getting-hotspot) from the distro package manager or as an [AppImage](README#for-any-linux-distro-appimage). ### Required Dependencies As of now, you will need the following dependencies to build this project: - CMake 3.1.0 or higher - any C++11 enabled compiler - Qt 5.15.0 or higher - libelf - libelfutils - gettext - extra-cmake-modules - KDE Frameworks 5 (packages are usually called libkf5-*-devel): - threadweaver - i18n - configwidgets - coreaddons - itemviews - itemmodels - kio - solid - windowsystem - notifications - iconthemes - parts - archive (optional) - [KDDockWidgets](https://github.com/KDAB/KDDockWidgets) - this library is not yet packaged on most distributions, you'll have to compile it yourself from source ### On Debian/Ubuntu #### For Qt5 ```bash apt-get update apt-get install libkf5threadweaver-dev libkf5i18n-dev libkf5configwidgets-dev libkf5syntaxhighlighting-dev \ libkf5coreaddons-dev libkf5itemviews-dev libkf5itemmodels-dev libkf5kio-dev libkf5parts-dev \ libkf5solid-dev libkf5windowsystem-dev libkf5notifications-dev libkf5iconthemes-dev libelf-dev \ libdw-dev cmake extra-cmake-modules gettext libqt5svg5-dev ``` #### For Qt6 ```bash apt-get update apt-get install libkf6threadweaver-dev libkf6i18n-dev libkf6configwidgets-dev libkf6syntaxhighlighting-dev \ libkf6coreaddons-dev libkf6itemviews-dev libkf6itemmodels-dev libkf6kio-dev libkf6parts-dev \ libkf6solid-dev libkf6windowsystem-dev libkf6notifications-dev libkf6iconthemes-dev libelf-dev \ libdw-dev libdwarf-dev libdebuginfod-dev cmake extra-cmake-modules qt6-svg-dev libzstd-dev \ libkddockwidgets-qt6-dev kgraphviewer-dev libqcustomplot-dev ``` ### On Fedora ```bash dnf install cmake gcc glibc-static gcc-c++ libstdc++-static qt5-qtbase qt5-qtbase-devel qt5-qtsvg-devel \ extra-cmake-modules elfutils-devel kf5-threadweaver-devel \ kf5-kconfigwidgets-devel kf5-kitemviews-devel kf5-kitemmodels-devel kf5-syntax-highlighting-devel \ kf5-kio-devel kf5-solid-devel kf5-kwindowsystem-devel kf5-kiconthemes-devel \ kf5-knotifications-devel kf5-kparts-devel ``` ### Arch Linux ```bash pacman -Syu pacman -S cmake gcc extra-cmake-modules threadweaver kconfigwidgets knotifications syntax-highlighting \ kiconthemes kitemviews kitemmodels kwindowsystem kio kparts solid libelf gettext qt5-base ``` ### OpenSUSE ```bash zypper in cmake gcc-c++ extra-cmake-modules threadweaver-devel kio-devel \ solid-devel kcoreaddons-devel threadweaver-devel kconfigwidgets-devel \ kitemmodels-devel kitemviews-devel kwindowsystem-devel kparts-devel syntax-highlighting-devel \ libqt5-qtbase-devel libqt5-qtsvg-devel libelf-devel libdw-devel gettext glibc-devel-static \ knotifications-devel kiconthemes-devel libzstd-devel binutils ``` ### Building Hotspot itself ```bash git clone --recurse-submodules https://github.com/KDAB/hotspot.git mkdir build-hotspot cd build-hotspot cmake ../hotspot make # now you can run hotspot from the build folder: ./bin/hotspot # or `make install` it and launch it from your $PATH ``` To build for Qt6 pass `-DQT6_BUILD=ON` when running the `cmake` command. If you need help building this project for your platform, [contact us for help](https://www.kdab.com/about/contact/). ## Online Instead of installing all dependencies and building Hotspot locally you may do so online with the following link: [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io#https://github.com/GitMensch/hotspot) This environment uses a clean, pre-configured Ubuntu 22.04 LTS environment. Just open, possibly have a look at the multiple building tasks, wait a bit until building is finished which is done as soon as a hotspot window opens in the preview and you can start coding / debugging hotspot. Notes: - This Gitpod setup is maintained by @GitMensch and not used by @KDAB directly. - Building may take a while as we don't use pre-builts or a special docker container in this environment yet. ## Debugging the AppImage When the AppImage crashes or is excessively slow, please provide a usable backtrace or profile run. If you're building Hotspot yourself you have the debugging symbols availalbe, when using a distro version you can check with your distribution documentation how to install the debug symbols. But debugging is also possible when using the [AppImage](README#for-any-linux-distro-appimage) using debuginfod or manual symbol loading. To do that, you will need to download the debuginfo artifact that matches the AppImage you downloaded. ### AppImage-Debugging using manual symbol loading For using this approach you need to first unpack the debug information downloaded from the release: ```bash $ tar -xvf hotspot-debuginfo-*.tar.bz2 hotspot-debuginfo-v1.2.3-45-g02fd82c/usr/bin/hotspot hotspot-debuginfo-v1.2.3-45-g02fd82c/usr/lib64/libexec/hotspot-perfparser ``` Starting the debugger is possible directly with executing the AppImage as follows: ```bash $ ./hotspot-v1.2.3-45-g02fd82c-x86_64.AppImage & $ gdb -q -p $(pidof hotspot) -ex "add-symbol-file hotspot-debuginfo-v1.2.3-45-g02fd82c/usr/bin/hotspot" Attaching to process 123456 ``` with a GDB session of ```txt Reading symbols from /tmp/.mount_hotspoBCRbef/squashfs-root/usr/bin/hotspot... (No debugging symbols found in /tmp/.mount_hotspoBCRbef/squashfs-root/usr/bin/hotspot) Reading symbols from /tmp/.mount_hotspoBCRbef/squashfs-root/usr/bin/../lib/libKF5ThreadWeaver.so.5... (No debugging symbols found in /tmp/.mount_hotspoBCRbef/squashfs-root/usr/bin/../lib/libKF5ThreadWeaver.so.5) ... 0x00007fea98ae0a38 in poll () from /usr/lib64/libc.so.6 add symbol table from file "hotspot-debuginfo-v1.2.3-45-g02fd82c/usr/bin/hotspot" (y or n) y Reading symbols from hotspot-debuginfo-v1.2.3-45-g02fd82c/usr/bin/hotspot... (gdb) bt #0 0x00007ff72544ca38 in poll () from /usr/lib64/libc.so.6 #1 0x00007ff7246777d7 in _xcb_in_read_block () from /usr/lib64/libxcb.so.1 #2 0x00007ff7246754e9 in xcb_connect_to_fd () from /usr/lib64/libxcb.so.1 #3 0x00007ff72467943c in xcb_connect_to_display_with_auth_info () from /usr/lib64/libxcb.so.1 #4 0x00007ff7283a95ea in _XConnectXCB () from /usr/lib64/libX11.so.6 #5 0x00007ff728399d89 in XOpenDisplay () from /usr/lib64/libX11.so.6 #6 0x00007ff70f181527 in QXcbBasicConnection::QXcbBasicConnection(char const*) () from /tmp/squashfs-root/usr/plugins/platforms/../../lib/libQt5XcbQpa.so.5 #7 0x00007ff70f15b072 in QXcbConnection::QXcbConnection(QXcbNativeInterface*, bool, unsigned int, char const*) () from /tmp/squashfs-root/usr/plugins/platforms/../../lib/libQt5XcbQpa.so.5 #8 0x00007ff70f15e588 in QXcbIntegration::QXcbIntegration(QStringList const&, int&, char**) () from /tmp/squashfs-root/usr/plugins/platforms/../../lib/libQt5XcbQpa.so.5 #9 0x00007ff7286ad41f in ?? () from /tmp/squashfs-root/usr/plugins/platforms/libqxcb.so #10 0x00007ff7267686cf in QGuiApplicationPrivate::createPlatformIntegration() () from /tmp/squashfs-root/usr/bin/../lib/libQt5Gui.so.5 #11 0x00007ff726769c40 in QGuiApplicationPrivate::createEventDispatcher() () from /tmp/squashfs-root/usr/bin/../lib/libQt5Gui.so.5 #12 0x00007ff72630c0d7 in QCoreApplicationPrivate::init() () from /tmp/squashfs-root/usr/bin/../lib/libQt5Core.so.5 #13 0x00007ff72676c639 in QGuiApplicationPrivate::init() () from /tmp/squashfs-root/usr/bin/../lib/libQt5Gui.so.5 #14 0x00007ff726e12a69 in QApplicationPrivate::init() () from /tmp/squashfs-root/usr/bin/../lib/libQt5Widgets.so.5 #15 0x000000000043a929 in main (argc=, argv=) at /__w/hotspot/hotspot/src/main.cpp:69 (gdb) continue ``` or with an extracted image: ```bash $ ./hotspot-v1.2.3-45-g02fd82c-x86_64.AppImage --appimage-extract $ PATH=./squashfs-root/usr/bin:$PATH LD_LIBRARY_PATH=./squashfs-root/usr/lib64:/usr/local/lib64:/usr/lib64:./squashfs-root/usr/lib:$LD_LIBRARY_PATH gdb -q --exec=hotspot --symbols hotspot-debuginfo-v1.2.3-45-g02fd82c/usr/bin/hotspot -ex run Reading symbols from hotspot-debuginfo-v1.2.3-45-g02fd82c/usr/bin/hotspot... Starting program: /tmp/squashfs-root/usr/bin/hotspot ``` Note that source files matching the commit the AppImage was created from needs to be manually downloaded or inspected in the git repo for this approach. Also note that you cannot debug any QT (or other system) parts this way, only Hotspot itself. ### AppImage-Debugging using debuginfod To use debuginfod, you will need to additionally download the docker image from `ghcr.io/kdab/kdesrc-build:latest`. For that you need to authenticate yourself to GitHub. If you have a `ghcr.io` authentication token and use `pass`, you can do that with ```bash $ scripts/appimage/download_docker.sh downloading docker image from ghcr.io Login Succeeded latest: Pulling from kdab/kdesrc-build Digest: sha256:1be0cdbeff1c8c796b77a4244a1f257e02c4a896fd6add93b7b00a9d76db8727 ... ghcr.io/kdab/kdesrc-build:latest Removing login credentials for ghcr.io ``` Once that is done, you can run the `scripts/appimage/run_debuginfod_in_docker.sh` script as such: ```bash $ ./scripts/appimage/run_debuginfod_in_docker ~/Downloads/debuginfo.zip unpacking debuginfo... hotspot-debuginfo-v1.3.0-391-g590f810/usr/bin/hotspot hotspot-debuginfo-v1.3.0-391-g590f810/usr/lib64/libexec/hotspot-perfparser starting debuginfod in docker... to use it on your host system, set: export DEBUGINFOD_URLS="127.0.0.1:12345 https://debuginfod.centos.org/ https://debuginfod.archlinux.org" [Fri May 24 19:58:56 2024] (16/16): opened database /opt/app-root/src/.debuginfod.sqlite [Fri May 24 19:58:56 2024] (16/16): sqlite version 3.7.17 [Fri May 24 19:58:56 2024] (16/16): started http server on IPv4 IPv6 port=12345 ... ``` Keep that `debuginfod` process running. You can now start using the local debuginfod in combination with the official Centos instance to get debug information for all the dependencies and build artifacts of hotspot. Here is one example for that using GDB: ```bash $ ./hotspot-v1.2.3-45-g02fd82c-x86_64.AppImage & $ export DEBUGINFOD_URLS="127.0.0.1:12345 https://debuginfod.centos.org/ https://debuginfod.archlinux.org" $ gdb -q -p $(pidof hotspot) Attaching to process 123456 ... ``` with a GDB session of ```txt ... This GDB supports auto-downloading debuginfo from the following URLs: 127.0.0.1:12345 https://debuginfod.centos.org/ https://debuginfod.archlinux.org Enable debuginfod for this session? (y or [n]) y Debuginfod has been enabled. To make this setting permanent, add 'set debuginfod enabled on' to .gdbinit. Downloading 37.95 MB separate debug info for /home/user/Downloads/squashfs-root/usr/bin/hotspot ... (gdb) bt #0 0x00007f70bd5140bf in __GI___poll (fds=0x2c83f40, nfds=5, timeout=0) at ../sysdeps/unix/sysv/linux/poll.c:29 #1 0x00007f70b7a4c3fc in g_main_context_iterate.isra () from /tmp/.mount_hotspoBCRbef/usr/lib/libglib-2.0.so.0 #2 0x00007f70b7a4c52c in g_main_context_iteration () from /tmp/.mount_hotspoBCRbef/usr/lib/libglib-2.0.so.0 #3 0x00007f70bdd08aa4 in QEventDispatcherGlib::processEvents(QFlags) () from /tmp/.mount_hotspoBCRbef/usr/lib/libQt5Core.so.5 #4 0x00007f70bdcb361b in QEventLoop::exec(QFlags) () from /tmp/.mount_hotspoBCRbef/usr/lib/libQt5Core.so.5 #5 0x00007f70bdcbb26c in QCoreApplication::exec() () from /tmp/.mount_hotspoBCRbef/usr/lib/libQt5Core.so.5 #6 0x000000000043a23e in main (argc=, argv=) at /__w/hotspot/hotspot/src/main.cpp:194 (gdb) continue ``` Note that source files are not supported in this way yet, as that would blow up the size of the docker image and thereby slow down our CI. KDAB-hotspot-41e5de7/LICENSE.GPL.txt000066400000000000000000001507241515036260400166100ustar00rootroot00000000000000 The Hotspot software is © Klaralvdalens Datakonsult AB. You may use, distribute and copy the Hotspot software under the terms of the GNU General Public License version 2 or under the terms of GNU General Public License version 3 both of which are displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 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: Copyright (C) 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 . ------------------------------------------------------------------------- KDAB-hotspot-41e5de7/README.md000066400000000000000000000453741515036260400156270ustar00rootroot00000000000000 # Hotspot - the Linux perf GUI for performance analysis This project is a [KDAB](https://www.kdab.com) R&D effort to create a standalone GUI for performance data. As the first goal, we want to provide a UI like KCachegrind around Linux perf. Looking ahead, we intend to support various other performance data formats under this umbrella. ## Table of Contents - [Screenshots](#screenshots) - [Visualizing Data](#visualizing-data) - [Time Line](#time-line) - [Record Data](#record-data) - [Getting Hotspot](#getting-hotspot) - [Gentoo](#gentoo) - [Via package manager](#via-package-manager) - [For any Linux distro: AppImage](#for-any-linux-distro-appimage) - [Building Hotspot](#building-hotspot) - [Using](#using) - [Off-CPU Profiling](#off-cpu-profiling) - [Embedded Systems](#embedded-systems) - [Import Export](#import-export) - [tracepoints](#tracepoints) - [Disassembler](#disassembler) - [Known Issues](#known-issues) - [Broken Backtraces](#broken-backtraces) - [debuginfod](#debuginfod) - [Missing Features](#missing-features) - [Recording with perf without super user rights](#recording-with-perf-without-super-user-rights) - [Export File Format](#export-file-format) - [Qt Creator](#qt-creator) - [License](#license) ## Screenshots Here are some screenshots showing the most important features of Hotspot in action: ### Visualizing Data The main feature of Hotspot is the graphical visualization of a `perf.data` file. ![hotspot summary page](screenshots/summary.png?raw=true "Hotspot summary page") ![hotspot FlameGraph page](screenshots/flamegraph.png?raw=true "Hotspot FlameGraph page") Note: Inlined functions have a darker border than non-inlined ones. ![hotspot off-CPU analysis](screenshots/off-cpu.png?raw=true "hotspot off-CPU analysis") ![hotspot caller-callee page](screenshots/caller-callee.png?raw=true "Hotspot caller-callee page") ![hotspot bottom-up page](screenshots/bottom-up.png?raw=true "Hotspot bottom-up page") ![hotspot top-down page](screenshots/top-down.png?raw=true "Hotspot top-down page") ![hotspot dockwidget layouts](screenshots/dockwidgets.png?raw=true "Hotspot with custom dockwidget layout and disassembly view") ### Time Line The time line allows filtering the results by time, process or thread. The data views are updated accordingly. ![hotspot timeline filtering by time](screenshots/timeline-filter-time.png?raw=true "Hotspot timeline filtering by time") ![hotspot timeline filtering by thread or process](screenshots/timeline-filter-thread.png?raw=true "Hotspot timeline filtering by thread or process") ![hotspot timeline filtering applied to FlameGraph](screenshots/timeline-flamegraph.png?raw=true "Hotspot timeline filtering also applies to the data views on top, like e.g. the FlameGraph. You can also zoom in on the timeline and inspect individual sample data.") ### Record Data You can also launch `perf` from Hotspot, to profile a newly started application or to attach to already running process(es). Do take the [caveats below](#recording-with-perf-without-super-user-rights) into account though. ![hotspot launch application](screenshots/record-launch.png?raw=true "Hotspot can launch a new application and profile it with perf from the record page.") ![hotspot attach to process](screenshots/record-attach.png?raw=true "Hotspot also allows runtime-attaching of perf to existing applications to profile them.") ## Getting Hotspot *Note: Hotspot is not yet packaged on all Linux distributions. In such cases, or if you want to use the latest version, please use the AppImage which will work on any recent Linux distro just fine.* ### Gentoo Hotspot ebuilds are available from our overlay (https://github.com/KDAB/kdab-overlay). ### Via package manager [![Packaging status](https://repology.org/badge/vertical-allrepos/hotspot-perf.svg)](https://repology.org/project/hotspot-perf/versions) ### For any Linux distro: AppImage You can either head over to the most [current release](https://github.com/KDAB/hotspot/releases/latest) or the [continuous build](https://github.com/KDAB/hotspot/releases/tag/continuous). In both cases you'll find the AppImage under "Assets" that you can download. Untar the AppImage file (in case of the latest release), then make it executable and then run it. Please use the latest build to get the most recent version. If it doesn't work, please report a bug and test the latest stable version. *Note: Your system libraries or preferences are not altered. In case you'd like to remove Hotspot again, simply delete the downloaded file. Learn more about AppImage [here](https://appimage.org/).* To find out how to debug the AppImage, see [HACKING](HACKING.md#debugging-the-appimage). ## Building Hotspot Building Hotspot from source gives you the latest and greatest, but you'll have to make sure all its dependencies are available. Most users should probably [install Hotspot](#getting-hotspot) from the distro package manager or as an [AppImage](#for-any-linux-distro-appimage). For everyone that wants to contribute to Hotspot or use the newest version without the AppImage detailed notes are found at [HACKING](HACKING.md#table-of-contents). ## Using ### General First of all, record some data with `perf`. To get backtraces, you will need to enable the dwarf callgraph mode: ```bash perf record --call-graph dwarf ... [ perf record: Woken up 58 times to write data ] [ perf record: Captured and wrote 14.874 MB perf.data (1865 samples) ] ``` Now, if you have Hotspot available on the same machine, all you need to do is launch it. It will automatically open the `perf.data` file in the current directory (similar to `perf report`). Alternatively, you can specify the path to the data file on the console: ```bash hotspot /path/to/perf.data ``` ### Command Line options Depending on your needs you may want to pass additional command line options to Hotspot. This allows to one-time set configuration options that are found in the GUI under "Settings" and also allows to convert Linux perf data files into the smaller and portable perfdata format (see [Import / Export](#import-export) for details on that). All command line options are shown with `--help`: ```text Usage: hotspot [options] [files...] Linux perf GUI for performance analysis. Options: -h, --help Displays help on commandline options. --help-all Displays help including Qt specific options. -v, --version Displays version information. --sysroot Path to sysroot which is used to find libraries. --kallsyms Path to kallsyms file which is used to resolve kernel symbols. --debugPaths Colon separated list of paths that contain debug information. These paths are relative to the executable and not to the current working directory. --extraLibPaths Colon separated list of extra paths to find libraries. --appPath Path to folder containing the application executable and libraries. --sourcePaths Colon separated list of search paths for the source code. --arch Architecture to use for unwinding. --exportTo Path to .perfparser output file to which the input data should be exported. A single input file has to be given too. --perf-binary Path to the perf binary. --objdump-binary Path to the objdump binary. Arguments: files Optional input files to open on startup, i.e. perf.data files. ``` ### Off-CPU Profiling Hotspot supports a very powerful way of doing wait-time analysis, or off-CPU profiling. This analysis is based on kernel tracepoints in the linux scheduler. By recording that data, we can find the time delta during which a thread was not running on the CPU, but instead was off-CPU. There can be multiple reasons for that, all of which can be found using this technique: - synchronous I/O, e.g. via `read()` or `write()` - page faults, e.g. when accessing `mmap()`'ed file data - calls to `nanosleep()` or `yield()` - lock contention via `futex()` etc. - preemption - and probably many more By leveraging kernel trace points in the scheduler, the overhead is pretty manageable and we only pay a price, when the process is actually getting switched out. Most notably we do not pay a price when e.g. a mutex lock operation can be handled directly in user-space. To do off-CPU analysis with Hotspot, you need to record the data with a very specific command: ```bash perf record \ -e cycles \ # on-CPU profiling -e sched:sched_switch --switch-events \ # off-CPU profiling --sample-cpu \ # track on which core code is executed -m 8M \ # reduce chance of event loss --aio -z \ # reduce disk-I/O overhead and data size --call-graph dwarf \ # we definitely want backtraces ``` Alternatively, you can use the off-CPU check box in Hotspot's integrated record page. During the analysis, you can then switch between the "cycles" cost view for on-CPU data to the "off-CPU time" cost view for wait-time analysis. Often, you will want to change between both, e.g. to find places in your code which may require further parallelization (see also [Amdahl's law](https://en.wikipedia.org/wiki/Amdahl%27s_law)). The "sched:sched_switch" cost will also be shown to you. But in my opinion that is less useful, as it only indicates the number of scheduler switches. The length of the time inbetween is often way more interesting to me - and that's what is shown to you in the "off-CPU time" metric. ### Embedded Systems If you are recording on an embedded system, you will want to analyze the data on your development machine with Hotspot. To do so, make sure your sysroot contains the debug information required for unwinding (see below). Then record the data on your embedded system: ```bash embedded$ perf record --call-graph dwarf ... [ perf record: Woken up 58 times to write data ] [ perf record: Captured and wrote 14.874 MB perf.data (1865 samples) ] embedded$ cp /proc/kallsyms /tmp/kallsyms # make pseudo-file a real file ``` It's OK if your embedded machine is using a different platform than your host. On your host, do the following steps then to analyze the data: ```bash host$ scp embedded:perf.data embedded:/tmp/kallsyms . host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms \ perf.data ``` If you manually deployed an application from a path outside your sysroot, do this instead: ```bash host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app \ perf.data ``` If your application is also using libraries outside your sysroot and the appPath, do this: ```bash host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app \ --extraLibPaths /path/to/lib1:/path/to/lib2:... \ perf.data ``` And, worst-case, if you also use split debug files in non-standard locations, do this: ```bash host$ hotspot --sysroot /path/to/sysroot --kallsyms kallsyms --appPath /path/to/app \ --extraLibPaths /path/to/lib1:/path/to/lib2:... \ --debugPaths /path/to/debug1:/path/to/debug2:... \ perf.data ``` ### Import Export The `perf.data` file format is not self-contained. To analyze it, you need access to the executables and libraries of the profiled process, together with debug symbols. This makes it unwieldy to share such files across machines, e.g. to get the help from a colleague to investigate a performance issue, or for bug reporting purposes. Hotspot allows you to export the analyzed data, which is then fully self-contained. This feature is accessible via the "File > Save As" menu action. The data is then saved in a self-contained `*.perfparser` file. To import the data into Hotspot again, just open that file directly in place of the original `perf.data` file. As an alternative you can also do the export from command line (without a GUI, so that's also usable with automated builds) using the `--exportTo` option. **Note:** The file format is _not_ yet stable. Meaning data exported by one version of Hotspot can only be read back in by the same version. This problem will be resolved in the future, as time permits. ### tracepoints Hotspot currently only shows the name of the tracepoints in the timeline. ![hotspot tracepoints](screenshots/tracepoints.png?raw=true "Hotspot tracepoints") ### Disassembler ![hotspot disassembler page](screenshots/disassembler.png?raw=true "Hotspot disassembler page") Hotspot includes an disassembler, which can show you the cost per instruction. The disassembler uses colors to indicate which assembly lines correspond to which source code line. For easier navigation, you can simply click on a line and the other view will jump to it. You can follow function calls with a double click. In the sourcecode view you can press ctrl+f or press the search icon to open a search window. If you have the sources in different directory, you can use `--sourcePaths` or the settings to select tell the disassembler to search there for the source code. ## Known Issues If anything breaks in the above and the output is less usable than `perf report`, please [report an issue on GitHub](https://github.com/KDAB/hotspot/issues). That said, there are some known issues that people may trip over: ### Broken Backtraces Unwinding the stack to produce a backtrace is a dark art and can go wrong in many ways. Hotspot relies on `perfparser` (see below), which in turn relies on `libdw` from elfutils to unwind the stack. This works quite well most of the time, but still can go wrong. Most notably, unwinding will fail when: - an ELF file (i.e. executable or library) referenced by the `perf.data` file is missing - to fix this, try to use one of the following CLI arguments to let Hotspot know where to look for the ELF files: - `--debugPaths `: Use this when you have split debug files in non-standard locations - `--extraLibPaths `: Use this when you have moved libraries to some other location since recording - `--appPath `: This is kind of a combination of the above two fields. The path is traversed recursively, looking for debug files and libraries. - `--sysroot `: Use this when you try to inspect a data file recorded on an embedded platform - an ELF file is missing debug information - to fix this, install the debug package from your distro - or compile the code in "release with debug" mode, i.e. ensure your compiler is invoked with something like `-O2 -g`. You will have to repeat the `perf record` step - potentially both of the above is not an option for you, e.g. when the library is closed source and supplied by a thirdparty vendor. If that is the case, you may be lucky and the library contains frame pointers. If so, then try to build elfutils from current git master (you want commit a55df2c1, which should be part of 0.170). This version of elfutils will try to fallback to the frame pointer for unwinding, when the debug information is missing. - your call stacks are too deep - by default, `perf record` only copies a part of the stack to the data file. This can lead to issues with very deep call stacks, which will be cut off at some point. This issue will break the top-down call trees in Hotspot, as visualized in the Top-Down view or the Flame Graph. To fix this, you can try to increase the stack dump size, i.e.: perf record --call-graph dwarf,32768 Note that this can dramatically increase the size of the `perf.data` files - use it with care. Also have a look at `man perf record`. - For some scenarios, recursive function calls simply fail to be unwound. See also https://github.com/KDAB/hotspot/issues/93 ### debuginfod Hotspot supports downloading debug symbols via [debuginfod](https://sourceware.org/elfutils/Debuginfod.html). This can be enabled by either adding download urls in the settings or launching Hotspot with `DEBUGINFOD_URLS` defined in the environment. ### Missing Features Compared to `perf report`, Hotspot misses a lot of features. Some of these are planned to be resolved in the future. Others may potentially never get implemented. But be aware that the following features are _not_ available in Hotspot currently: - the columns in the tables are currently hardcoded, while potentially a user may want to change this to show e.g. cost per-process or thread and so forth. Basic group-by functionality was added, but a more flexible column arrangement a la WPA is not planned for now. - many of the more advanced features, such as `--itrace`, `--mem-mode`, `--branch-stack` and `--branch-history`, are unsupported ### Recording with perf without super user rights It is **not** a good idea to launch Hotspot with `sudo` or as `root` user. See e.g. [Editing Files As Root](https://blog.martin-graesslin.com/blog/2017/02/editing-files-as-root/) for an article on that matter. [Issue #83](https://github.com/KDAB/hotspot/issues/83) is also relevant in this contact. But without superuser rights, you may see error messages such as the following when using Hotspot's record feature: ```text You may not have permission to collect stats. Consider tweaking /proc/sys/kernel/perf_event_paranoid: -1 - Not paranoid at all 0 - Disallow raw tracepoint access for unpriv 1 - Disallow cpu events for unpriv 2 - Disallow kernel profiling for unpriv ``` To workaround this limitation, Hotspot can run perf itself with elevated privileges. ### Export File Format The current data export is limited to a format that can only be read back by Hotspot of the same version. This makes interop with other visualization tools quasi impossible. This is known and will get improved in the future. Most notably support for export to web viewers such as [perfetto](https://perfetto.dev/) or the [Mozilla profiler](https://profiler.firefox.com/) is planned but not yet implemented. Patches welcome! ## Qt Creator This project leverages the excellent `perfparser` utility created by The Qt Company for their Qt Creator IDE. If you are already using Qt Creator, consider leveraging its integrated [CPU Usage Analyzer](https://doc.qt.io/qtcreator/creator-cpu-usage-analyzer.html). ## License Hotspot is licensed under the GPL v2+. See [LICENSE.GPL.txt](LICENSE.GPL.txt) for more information, or contact info@kdab.com if any conditions of this licensing are not clear to you. KDAB-hotspot-41e5de7/cmake/000077500000000000000000000000001515036260400154135ustar00rootroot00000000000000KDAB-hotspot-41e5de7/cmake/ECMEnableSanitizers.cmake000066400000000000000000000135461515036260400222150ustar00rootroot00000000000000#.rst: # ECMEnableSanitizers # ------------------- # # Enable compiler sanitizer flags. # # The following sanitizers are supported: # # - Address Sanitizer # - Memory Sanitizer # - Thread Sanitizer # - Leak Sanitizer # - Undefined Behaviour Sanitizer # # All of them are implemented in Clang, depending on your version, and # there is an work in progress in GCC, where some of them are currently # implemented. # # This module will check your current compiler version to see if it # supports the sanitizers that you want to enable # # Usage # ===== # # Simply add:: # # include(ECMEnableSanitizers) # # to your ``CMakeLists.txt``. Note that this module is included in # KDECompilerSettings, so projects using that module do not need to also # include this one. # # The sanitizers are not enabled by default. Instead, you must set # ``ECM_ENABLE_SANITIZERS`` (either in your ``CMakeLists.txt`` or on the # command line) to a semicolon-separated list of sanitizers you wish to enable. # The options are: # # - address # - memory # - thread # - leak # - undefined # # The sanitizers "address", "memory" and "thread" are mutually exclusive. You # cannot enable two of them in the same build. # # "leak" requires the "address" sanitizer. # # .. note:: # # To reduce the overhead induced by the instrumentation of the sanitizers, it # is advised to enable compiler optimizations (``-O1`` or higher). # # Example # ======= # # This is an example of usage:: # # mkdir build # cd build # cmake -DECM_ENABLE_SANITIZERS='address;leak;undefined' .. # # .. note:: # # Most of the sanitizers will require Clang. To enable it, use:: # # -DCMAKE_CXX_COMPILER=clang++ # # Since 1.3.0. #============================================================================= # Copyright 2014 Mathieu Tarral # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MACRO check_compiler_version #----------------------------- macro (check_compiler_version gcc_required_version clang_required_version) if ( ( CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${gcc_required_version} ) OR ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${clang_required_version} ) ) # error ! message(FATAL_ERROR "You ask to enable the sanitizer ${CUR_SANITIZER}, but your compiler ${CMAKE_CXX_COMPILER_ID} version ${CMAKE_CXX_COMPILER_VERSION} does not support it ! You should use at least GCC ${gcc_required_version} or Clang ${clang_required_version} (99.99 means not implemented yet)") endif () endmacro () # MACRO check_compiler_support #------------------------------ macro (enable_sanitizer_flags sanitize_option) if (${sanitize_option} MATCHES "address") check_compiler_version("4.8" "3.1") set(XSAN_COMPILE_FLAGS "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") set(XSAN_LINKER_FLAGS "asan") elseif (${sanitize_option} MATCHES "thread") check_compiler_version("4.8" "3.1") set(XSAN_COMPILE_FLAGS "-fsanitize=thread") set(XSAN_LINKER_FLAGS "tsan") elseif (${sanitize_option} MATCHES "memory") check_compiler_version("99.99" "3.1") set(XSAN_COMPILE_FLAGS "-fsanitize=memory") elseif (${sanitize_option} MATCHES "leak") check_compiler_version("4.9" "3.4") set(XSAN_COMPILE_FLAGS "-fsanitize=leak") set(XSAN_LINKER_FLAGS "lsan") elseif (${sanitize_option} MATCHES "undefined") check_compiler_version("4.9" "3.1") set(XSAN_COMPILE_FLAGS "-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls") else () message(FATAL_ERROR "Compiler sanitizer option \"${sanitize_option}\" not supported.") endif () endmacro () # for each element of the ECM_ENABLE_SANITIZERS list foreach ( CUR_SANITIZER ${ECM_ENABLE_SANITIZERS} ) # lowercase filter string(TOLOWER ${CUR_SANITIZER} CUR_SANITIZER) # check option and enable appropriate flags enable_sanitizer_flags ( ${CUR_SANITIZER} ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${XSAN_COMPILE_FLAGS}" ) if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) link_libraries(${XSAN_LINKER_FLAGS}) endif() if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") endif () endforeach () KDAB-hotspot-41e5de7/cmake/FindElfUtils.cmake000066400000000000000000000033311515036260400207450ustar00rootroot00000000000000# - Try to find libdwarf # Once done this will define # # LIBDWARF_FOUND - system has libdwarf # LIBDWARF_INCLUDE_DIRS - the libdwarf include directory # LIBDWARF_LIBRARIES - Link these to use libdwarf # LIBDWARF_DEFINITIONS - Compiler switches required for using libdwarf # if (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS) set (LibDwarf_FIND_QUIETLY TRUE) endif (LIBDWARF_LIBRARIES AND LIBDWARF_INCLUDE_DIRS) find_path (DWARF_INCLUDE_DIR NAMES dwarf.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include ENV CPATH) # PATH and INCLUDE will also work find_path (LIBDW_INCLUDE_DIR NAMES elfutils/libdw.h elfutils/libdwfl.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include ENV CPATH) if (DWARF_INCLUDE_DIR AND LIBDW_INCLUDE_DIR) set (LIBDWARF_INCLUDE_DIRS ${DWARF_INCLUDE_DIR} ${LIBDW_INCLUDE_DIR}) endif (DWARF_INCLUDE_DIR AND LIBDW_INCLUDE_DIR) find_library (LIBDW_LIBRARIES NAMES dw PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ENV LIBRARY_PATH # PATH and LIB will also work ENV LD_LIBRARY_PATH) find_library (LIBDEBUGINFOD_LIBRARIES NAMES debuginfod PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ENV LIBRARY_PATH # PATH and LIB will also work ENV LD_LIBRARY_PATH) include (FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set LIBDWARF_FOUND to TRUE # if all listed variables are TRUE FIND_PACKAGE_HANDLE_STANDARD_ARGS(ElfUtils DEFAULT_MSG LIBDW_LIBRARIES LIBDW_INCLUDE_DIR) mark_as_advanced(LIBDW_INCLUDE_DIR LIBDW_LIBRARIES LIBDEBUGINFOD_LIBRARIES) KDAB-hotspot-41e5de7/cmake/FindLibElf.cmake000066400000000000000000000050431515036260400203550ustar00rootroot00000000000000# - Try to find libelf # Once done this will define # # LIBELF_FOUND - system has libelf # LIBELF_INCLUDE_DIRS - the libelf include directory # LIBELF_LIBRARIES - Link these to use libelf # LIBELF_DEFINITIONS - Compiler switches required for using libelf # # Copyright (c) 2008 Bernhard Walle # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (LIBELF_LIBRARIES AND LIBELF_INCLUDE_DIRS) set (LibElf_FIND_QUIETLY TRUE) endif (LIBELF_LIBRARIES AND LIBELF_INCLUDE_DIRS) find_path (LIBELF_INCLUDE_DIRS NAMES libelf.h PATHS /usr/include /usr/include/libelf /usr/local/include /usr/local/include/libelf /opt/local/include /opt/local/include/libelf /sw/include /sw/include/libelf ENV CPATH) find_library (LIBELF_LIBRARIES NAMES elf PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ENV LIBRARY_PATH ENV LD_LIBRARY_PATH) include (FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set LIBELF_FOUND to TRUE if all listed variables are TRUE FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibElf DEFAULT_MSG LIBELF_LIBRARIES LIBELF_INCLUDE_DIRS) mark_as_advanced(LIBELF_INCLUDE_DIRS LIBELF_LIBRARIES) KDAB-hotspot-41e5de7/cmake/FindQCustomPlot.cmake000066400000000000000000000050051515036260400214500ustar00rootroot00000000000000# Attempt to locate QCustomPlot # Once done this will define: # # QCUSTOMPLOT_FOUND - system has QCustomPlot # QCUSTOMPLOT_INCLUDE_DIRS - the include directories for QCustomPlot # QCUSTOMPLOT_LIBRARIES - Link these to use QCustomPlot # # Copyright (C) 2019, Scott Furry, # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. find_library(QCustomPlot_LIBRARY NAMES qcustomplot-qt${QT_MAJOR_VERSION} qcustomplot QCustomPlotQt${QT_MAJOR_VERSION}) set(QCustomPlot_LIBRARIES "${QCustomPlot_LIBRARY}") find_path(QCustomPlot_INCLUDE_DIR NAMES qcustomplot.h) set(QCustomPlot_INCLUDE_DIRS "${QCustomPlot_INCLUDE_DIR}") include(FindPackageHandleStandardArgs) find_package_handle_standard_args(QCustomPlot DEFAULT_MSG QCustomPlot_LIBRARIES QCustomPlot_INCLUDE_DIRS) mark_as_advanced(QCustomPlot_INCLUDE_DIRS QCustomPlot_LIBRARIES) if(QCUSTOMPLOT_FOUND) add_library(QCustomPlot UNKNOWN IMPORTED GLOBAL) set_target_properties(QCustomPlot PROPERTIES IMPORTED_LOCATION ${QCustomPlot_LIBRARY}) target_include_directories(QCustomPlot INTERFACE ${QCustomPlot_INCLUDE_DIRS}) target_compile_definitions(QCustomPlot INTERFACE QCUSTOMPLOT_USE_LIBRARY) add_library(QCustomPlot::QCustomPlot ALIAS QCustomPlot) endif() KDAB-hotspot-41e5de7/cmake/Findobjdump.cmake000066400000000000000000000006361515036260400206630ustar00rootroot00000000000000if (OBJDUMP_PROGRAM) set (objdump_FIND_QUIETLY TRUE) endif() find_program(OBJDUMP_PROGRAM NAMES objdump HINTS ${CMAKE_OBJDUMP}) include (FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set objdump_FOUND to TRUE if all listed variables are TRUE find_package_handle_standard_args(objdump DEFAULT_MSG OBJDUMP_PROGRAM) mark_as_advanced(OBJDUMP_PROGRAM) KDAB-hotspot-41e5de7/cmake/Findperf.cmake000066400000000000000000000005261515036260400201550ustar00rootroot00000000000000if (PERF_PROGRAM) set (PERF_FIND_QUIETLY TRUE) endif() find_program(PERF_PROGRAM NAMES perf) include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set perf_FOUND to TRUE if all listed variables are TRUE find_package_handle_standard_args(perf DEFAULT_MSG PERF_PROGRAM) mark_as_advanced(PERF_PROGRAM) KDAB-hotspot-41e5de7/cmake/HotspotMacrosInternal.cmake000066400000000000000000000012031515036260400227130ustar00rootroot00000000000000# Submodule handling function(check_submodule_exists name path) if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${path}") if(EXISTS "${CMAKE_SOURCE_DIR}/.git") message( FATAL_ERROR "The ${name} git submodule is not initialized.\n" "Please run the following commands in the source directory (${PROJECT_SOURCE_DIR}):\n" " git submodule update --init --recursive\n" ) else() message(FATAL_ERROR "The ${name} submodule is missing - please report a broken source package.\n") endif() endif() endfunction() KDAB-hotspot-41e5de7/com.kdab.Hotspot.appdata.xml000066400000000000000000000035001515036260400216010ustar00rootroot00000000000000 com.kdab.Hotspot CC0-1.0 GPL-2.0-or-later Hotspot Linux perf GUI for performance analysishotspot.desktop

Hotspot is a graphical user interface for Linux's "perf" performance profiling system.

This project is a KDAB R&D effort to create a standalone GUI for performance data.

Performance summary https://raw.githubusercontent.com/KDAB/hotspot/master/screenshots/summary.png Flamegraph https://raw.githubusercontent.com/KDAB/hotspot/master/screenshots/flamegraph.png Top-down view https://raw.githubusercontent.com/KDAB/hotspot/master/screenshots/top-down.png https://github.com/KDAB/hotspot https://github.com/KDAB/hotspot/issues KDAB milian.wolff@kdab.com
KDAB-hotspot-41e5de7/com.kdab.hotspot.desktop000066400000000000000000000005561515036260400211110ustar00rootroot00000000000000[Desktop Entry] Type=Application Name=Hotspot GenericName=CPU Profiler GenericName[fr]=Profileur CPU Comment=Linux perf GUI for performance analysis Comment[fr]=Interface graphique pour perf (Linux) pour l'analyse de performances Exec=hotspot %f Icon=hotspot Categories=Development; Keywords=performance;perf; MimeType=application/x-perf-data;application/x-hotspot; KDAB-hotspot-41e5de7/com.kdab.hotspot.xml000066400000000000000000000003331515036260400202310ustar00rootroot00000000000000 KDAB-hotspot-41e5de7/hotspot-config.h.cmake000066400000000000000000000015721515036260400205330ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016-2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #define HOTSPOT_VERSION_STRING "@HOTSPOT_VERSION_STRING@" #define HOTSPOT_VERSION_MAJOR @hotspot_VERSION_MAJOR@ #define HOTSPOT_VERSION_MINOR @hotspot_VERSION_MINOR@ #define HOTSPOT_VERSION_PATCH @hotspot_VERSION_PATCH@ #define HOTSPOT_VERSION ((hotspot_VERSION_MAJOR<<16)|(hotspot_VERSION_MINOR<<8)|(hotspot_VERSION_PATCH)) #define HOTSPOT_LIBEXEC_REL_PATH "@LIBEXEC_REL_PATH@" #define HOTSPOT_LIBEXEC_ABS_PATH "@CMAKE_INSTALL_FULL_LIBEXECDIR@" #cmakedefine01 APPIMAGE_BUILD #cmakedefine01 Zstd_FOUND #cmakedefine01 KFArchive_FOUND #cmakedefine01 KFSyntaxHighlighting_FOUND #cmakedefine01 QCustomPlot_FOUND #cmakedefine01 KGraphViewerPart_FOUND KDAB-hotspot-41e5de7/hotspot.kdev4000066400000000000000000000001041515036260400167650ustar00rootroot00000000000000[Project] CreatedFrom=hotspot Manager=KDevCMakeManager Name=hotspot KDAB-hotspot-41e5de7/screenshots/000077500000000000000000000000001515036260400166735ustar00rootroot00000000000000KDAB-hotspot-41e5de7/screenshots/.directory000066400000000000000000000001021515036260400206710ustar00rootroot00000000000000[Dolphin] PreviewsShown=true Timestamp=2017,6,2,18,5,27 Version=4 KDAB-hotspot-41e5de7/screenshots/bottom-up.png000066400000000000000000011223101515036260400213270ustar00rootroot00000000000000PNG  IHDR}8Q$ pHYsq́ IDATxwX{G{C޻'ӣWb/fL5&fb,eyVPQ?r3lfg9""""""""""""""""""""""""""R LU\_DDDDDDDD(o&qLx.""""""""QVr8vʓ1TF8VɤQ_u)ic\Nʋ'DDDD->_8h/>"""""""" z>=J 漢0EDDDDDDDj8ww7rrr9}(LcX-O9 dUѕVٜ͛֝Ulݾr7 qO:whˊזz헟#8(B^7<{3n7՛ۋoˆ^6';^6:wado'7/BؼG +|X89EwQr k098=>u=|8={~D>+΀>=Y~#wVbCg((5N) ÈapIe;kv,EDDj8oo/x?aknLtO)MffVuڤY!1 s2qr!?ߊɤ>""""g''0]+ߖU Qu |/o"1٪VfHMe20:[ĉ |}}ʬ[ZXZLo~I~.a۰akL.n`:039K=uw?+FVI|?k.Cз&$8Դ4K~_n{:?!Al޶6Q|<޻xZ6kuWNZJ87?(|d;үwꆇa;3p00Sz:k1|@}ϸ;Swn@:wd %-=?WbAmq|޻_}OOO36"-ni?'-[|I?|}۳/l+F q9J8X|E1alںO ̰AiNddڎ]RR2|[ D?XZcW>RRŷst܁V}4ɳ/do۹7_zeڌ9="""'''nj6n7gIL&j m^ iECھ3<н;JDhnܾm](۲<yf Ê%~DDDB(m.D͚4ŅUkٸe+ÇǛ#GHKO;Nqߴ])V_a䰨А`FFƍ gggj -3*ݓ\]]gKJeϾ0k^ u ǝ1|@6,1~_d@^dgٴe *QRRSm%JQHZF "9b7.33vЬI#t,EDDV^&WKL&n `LBxl}lܲo,( x_axrwwݖϛLV-5|msY2dffmg;]Y, DZPR^^vC?f,F_n!1=Ȍ?z/uN223m5ߟ2j^KIbq^|&O 27\um[\LI! [XRg2jxl}ƙ>SM  lV:9cc2 ?S~.F^68iRg+GjZdddj"1x73듚]=gl׏KZL|}%&ywLE׵+زmMJ>ӽna~vu|} i>YYY|;}&NIdD]]g9F9,G?bjѬT??_22N{,EDD7IIɼL~~i݊_{>L.J|?nXa| 'Ǥ'j͜lfJX4wMN=+l&';t&Sٮ&00fb28b8aoX {|nwؖEKwh00bAm.pr{/^^0L%2l"l Պ][]+e8M[EgCtЎ޹c;, qa``)]dڌօڵC9|`PV(u:kQ/EK n^DmCJLNfkoOUoӯcێ]eΣc_}#Qaͷrtnֶ\|$OY;lٶJ?N٘۷ *I_6DDD0 a9zzO~ =~^5W$8(m;vaDxXm6n[L-)>Kҳww? ҿwu9?-ZBHP׎]YaOe63겡0{BCN iņM1gpr{mx5w{'5maH⥿qGա[/[l&|!mD c6gw[iiw̜Q|׀an&?wM`Ɯys>t~Dzy' e :[l-sDFɝ;ݲ`_Ti\˦bߦ-cTV[&NNd1a`8ɩAHi#Ѿm /.#.p291oVoXRRֹ#]f;@mQn8;cּʇ @jZ:Ce6{/C1#jقfͣMt+e}g~5cGϋ~ߏ߸hղ`P>Kr{6bz!8p p1%&ҭK'MX:,wfY`wD0t`5l?!Nm:wh%}{ѹC;LJݭ:&6t̵˽ɷbt[v*cD NWeݣnoCkoWw("""r ><3yuj~‘<,6~5mp23 w&'L&gLX7 SK&L& 彵\Xlk뼊222xfʫuM>m '_T(SYUsvjrd0s0L.&3߯LDDD*MIUDDv"#Wz(AV-mw2ټu;M[9tU8!.;٧sgE,3ݱûUIDDDDDDD1gW]2u -HIHIHIHIwιCDDDDDDDDNe^I=*8F`%.HIHIHIHIHIHIJ>[OA|XVyA:%KQ۶(ڂ0+ͷ'}ʖۘ{ .͸o#jgeRs-`ϧc """"""r1poF +sr*3Q6oƒ?J(&v3^^fL۲+nnnZ}p"AAk>kj kΌy-Aδ?rW3ܩ#999|w <___аA}nFj eeX7[gƬ93O /{bs& (8"""""""*M]ԏ- -oS-Z4gWll'}JbjfΞccPP-SKӶQ]O???5lȎ,fZM[ˢ%,^+1ټeyyyק>ubIKK!D[ Cbbmy]tɖѭ: )/3t@bZG XUiҧi&LY/g]bӳ/+vi餤2vgL<OfxJF\~ ԧa\CIw }5o*iizv@bRÒ>^^vٖoW Oϓ gsO?0gpqqg{SDDDDDDBTm9/ѭ?R:Rvm^lלLN]ɝZj#<NNIV7emص!1\ۤW^p3zBC9ҹ{ֵ ڶOrWиQC2378Sq8;;_SV-We~'KLd@~ #33ߖ-'n.ګHLLm @<[m繧~D?/\_CZ "$$VYK.$^]*1y"zF^~II|ar*_y:wHHp0Xǟ\:tCȅM;o_1"8(mchܸaudbswӘ;oIҼiSƌyuԯHJN&e z*WfpIIxzxQL^=m]-!̙;9Ndd\b3h%lٺztj,r7oO=l)ӹSJVS{>O>CHyA~q["Qb%|4sٰ!8:V""""""":SNԴ>AbRburٶm;<0O?F Tw8"""""""D`( df ,@~(Z#0ωnE@@oiZ 3PGkii{E.][;,w*3܇)""""""""UMIHIHIHIHIHIȥ",$&l03 fXH:ous8~LP;4''BϥDDԫ0,L& OOBCkZ """"rзcde*ӢesB;NRr2;vR'4Cvae&1TB4U2 C jaͯ0DD+pU(!]"""}\4yH H H T%`۽B|Arss IF\:l!Uɋ3mNNN g8z<=+y _?vmf3?Μ͠VaWƓ<Ǒ#Jvqywhܨ!cFݝ#p IDATGv:+@wLzX-bv3HMMe*Μy ӻgO6_}ѭ=s=r223mNVVٙ;' @vv6?s4iq.8;;s7ڕx{WO0g!'77~޵ řC Yj56oasOWwUb˯  cʿk㵷W^hmXSDDDDj'}ox{pq9!Zy#//WWsVQDl@IO?_b&r1iެ3fLvmy,&ѶΝ:2h%3v^L&ScG=w3rڷcؐA,Ӯ_GHIMoUTK6N.߷;LwDG e?EDDDf3~el{~jzn+[2-^.hi:uԮU?dx{yqٰcO"9ebؕSYh]FF ;?xoMixx~Kv4773 p 72l`V+ZH^^ ʄ[obu|ɧ9zѭx&c 1)]:1s\RRSiՒz:d~gf˖Y,4nԈ+E'cy쉧ҹ#]Jvm檱WcF~&:uh_X~Z +V $xG2yG;n_KJJ*]t_Nwݵ;;{Kػo?9Ԯ]KV=3o>ihތoGfF&L{Z+q]Cl,~}п)cVң[2{aح_t }8k6%p){رD={#4$cF*e?qUW%Bt|տkIH8DHƎM m311Ys}.V+͛5WޛQ{|n^Ye<`Ťu{a_б};nq9_| 4z5kMcvb%+__,2Y ߟk0cz) 8{Gpaئ8訖x*Q-ZppsuO>ނYmӆn@nݘ5gXuʘ?@^^ѭʽφa錸R^x)ڶ*{0 >)ѭO,6lGݺctԑn݀7&'ʽt^y %%q5Wqˍw/TvCR_et[~@?n+Fdƍ|[WXH>^;'@ZGGsI>ԩS!T먯6Gr5W&5leÆv纹qlBbX2 8=w6orӦMǞ aNܩceW^rGp(!3~&MznMLk?+WsW,&-[4]Ff͞˝Fpp0..x{S @`@]+V"ӘL&ɦ[9{.Ov|Nddg_8褉Ȥq,}CUmܴ6l͚OAAA5;>/񮮮~Dci԰..Sղٽg/ѭ^ݺx,4믹޽ is/̾h԰W.: [`B^ťh˳K(%oG\~YDQySyo!lP7mÏNfmtܩ}ԴTo~/fܦu4O><_O>⥿aZx}3͚6'fտk9*Z^MҢy~hڤ1v,00ÆRc!""""5Ó>nn}J8[ݽVdUnn[~'-ʸ֔:UVL묷}o;XRr2Z={HKK'??ʱcg^Ўjn7 7xDzyV9srYsx*Yf3s5Wەlgg'...J({(pGxء=C ඹ%-G]Ν5g6n}^}zWʍ6M::uxhңw ݺtK޽*͊g|\]K_srOMggg`I|8|ۨ iii/%ؕyx_JZzz]ϯB4k҄[޽{5b8nnw gЀvm{-;cRe29wdǎ~axzx۲ܵˮuµPZaNSFF :2>EIS3K&6n7s-[.NU:[t,;$XLtXYʻ9Y>L15JJa9""""R*۶8aWW%9ֆMq5Ǐ |///ڵaŪոA]*\;8pݺt&((u7Zfb<3gMeLV?^:R^Ug]O(|LKOdْ6mi԰Abiڤ1];d~dn0c&;wbZiҸqv7aߺ\sXVש(]:aTz Gʖls^Eɤ3ujެ)?))z;we)++BIF tX+1-[  #8s[y5-8znU:UtMv 'r>zX20HH8O_SHJJ[bKuӮgΆMe'Ngnl۾EKҢyrMwNӲE %&}N[L֭[OCW\]]͵iZأ*/mӑb9q6ڟ6f7, Q+<b޽T s<%ʲfQ*qifĺu1 ZTQ'N` 卥q.ƍDX:{hRj:l^UZX,2-*7&MԩSTsӳG7Y=ZQN9u6z쎛+ӦXܫ] @Nᵨ;@RrruNEf޳R27oj7Tʽ"2q|%t},DDDD>?ΜMJJ*]:w$44̿k ^}^6mXǟmChH0Xɞps;Be1ٱs.Bm4o֌@˭7Hamcp0?8ZBR8mn]hִ O=4/O/qNN=Ndd׬kxzzQ.ŅfMMGӻ'8'~Ǝ!^=:3fѨQCziW?((g7ٙϿڵjVUMԏÏ?exhRLN\ҿ]]''g#G̚3N;q>0شy 99[saIӓuÉcˀaUM7fæM...4iܘ~_FF 1 1{yxT>> 2Ysr<% 9r(S`7~;Ӵi\\\HIIaտkpss;c\*rp~/*ݻu!0 Դ4֬tܑxzz_5b8I|ץɐAXƛ ߏNcNZjEvmV^^^`bHz>);uÃd6nu\EP`C\Xbj{)xSvmn:b9dxөc eR4o֔cF1s["e­7ҫ DLL4+WKm,֏~j^Hp0mpˍlsL&^|Y>p*KQ-[kP7[Sb6yytԁI=ǟ~?baOsqss+W민g_|?}֛n%64__LTɄ;BCٽ&/iznnL|>'G~~>!A'EES}oUʢKe2UTx'+///p ?̘?BpPC bUږMz0k\ѢY3ի[v܅ 5r~:E<},[0 iOg#\XJ.l`ȗqq?Bs/мiSmٽ^$&%+/Vj^AX& =4={tҡvmQcVM?ML&rSuRm4p""""5U`( df ,@~v+s+ -[9zwvKu$""g麫gRǁrssy+#"""""""rixyFûWu AÚOûDDDD_ew9""""""""R*t̬̪C YyEb 1|7mDDDD.:mbbκ ݽKDDDDDDDD=ݽKDDDDDDDD%}DDDDDDDDj 铟ݻ2*6T(gEԣVHYoXDDDDDDDD;={hڤYUQfV>""""""""UVPҖ*tǖHKK __ܩC1bHphgMYf͚65Arr2q{оyٲu; ԧO&ѩcLU&ł;/\p!קTy>yyyo=%;;@:w@zumu֬]H?qwww kN| 6iLnn0`p(0o 11 g''BBޭ+KLח.]:Q#HpxZ!={+a,7bvӮm ^BP` ,%55V/336mZ3x%t҉T-^Z-[a`0a\:l0ˢ%8зO/EHH0vq,m9/o/lGjО>={t~eHnpLxXHKOgM o:uj?r<%@[/=u aaeGm4n:|tJIaȅʡIƌ8t(ì[]q1aK`=G~&RRRzߤ%}ص)EDD؞eHDDDDDDDBYcK۷_[mо٘싯3 ISRRY7jHxzy0k<[)$Ʉ]3V{,"""""""r[]5hP///|=0dRu:?pOOOi뭓Q8E=fD/"""""""rarD'b.e&la8b! bnx;Aa+ C{̝:kS~$deeuv yDFF/&&rHJJD ٳg/$>¦[GXd)/y8;;s1ꆇQn#wYDDDDDDDФO]ػo?ol6EhH0&$$(KgKXa[m#+3 wwwBCCnֵ3+WaD~}`aW.Cd,['΄дIcGyL rRRqM\&"""""""r{Jؕ@&`r<>ls8tN9?(#"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""RU(ɱcUEȱcxyz9-Tnܨ1q+.!hܸCڪPɉfM8d""""""""Ru4H H H H H H H RdzaO&GDDDDDDD K.۪PgO&hbx߲WvѬiCNC+68Geϰz^*4+۪HUyfcҜ>""""""""5>""""""""5>""""""""5>""""""""]U4*f6 IDAT% (6vww']1;>Q[9Gr<>2;;;;윝ٙٿAAAA    `ٝX>mM,5cgHӮg4t$ZUێ :u6чRjђe8 ^ܸy;r%  srFFMMZ!>z\!KkԔ_S!3ygΑ^f-F)IJA ~_e}A d;Ӑ#}\vqV6SvKιӻgwf͚AAA~2MMMf͘ @TdW]g՚hiiѬ-zȟuucBBB9xK͗LLLJ>zˤʙ?*Cpqljd{ԫ~}PSSC   UHױx\,uXYViӺ8d2bѩ3g053dRX.~a,Yg%a!C]ș+g򃨫K>}bCy34hܜW}>z,f<񒨨(.[Iң7'OQӽw?7oI{^a{PP0.e4iњq-AAA}==%=NIh=b14n.vrn9f-vUNdϫ> q8vtfx1 7eqqqԕ-[gҙ޻( 4iцm:`7~>>o8" 00H!>kԔFJ"##qX]zШiK ;wڽnb۬m;ve4S=gܰUS!,.U_Gπo>%K3sׯJ4il9wbbbP^NۆRL&cԩ]Ϭ9Y4454ގ ʱtJ޾{p>>lB>2q24/.[deɌ Kzu6eahh1 R;'iŋjJ:[иQC+n޺IdͪävL8bŊ@9}N>CΜfT(_.4gryv(P ?۷|`vڴjs5 ssR^(((>>.U2V伍UkQB4{9Ϟ=O3.Cǿ91ob(X5[Ӿmth԰>r6k_SSSdtڙzulnhȘq)^(cFZUݸKWҹo``K6Χ`-Rqy7j~êѹ{o<̐A2XAAA1114kN!]4o$d2| כc'Np-֯@V}p[6£n?cc#)I[fΞG``~+ʖzдq#" 0=𡃒-[6o--- iiif={|G)W^AAA;([e DEGe[6G___~(ikmh&N!'::[$Y/a544hԠΜS=wm-d[P/^g\)^NR|9sR9d %((fɒ% 'Ǯ{100e#ΥhTZ;WHLt&3xitAI2}yխɑÄ7o]wJJzXXSL ;fB(YR>HiO]PPp   \yŋ_{ˎys0T5w&سo?^^>JR|DL€4kb˦[֥ndN#1}}}rɂymSWO0RSS]Vkӊ~~sg3)G&UZ2{~@DYmWN?'Cw%]P)! =jjj6j _|/{^y%%d|㩧',,;wRLd   ){%ߝFDd$zRWi͓eJn|hjߢVHaNqE&K֦vN#1ˊQQ˛W_<735K˗7oSL7On>R))[ J @: ? 3d(ʖ-CjU12g??=@& q4nˮ=bllsۻlٺ 3SSԫ @u+ZүOOeƮPP]AAAL&D́CGQZuvңXmN,XTaU4i܈K'On5^+)Әt0.cn162XO@"E016z)?? q *Y#yjjj̟36n#1*YKex^AAA&O uifFֵǬ]m;3];wtu5^ӞeE/,Xmm-+F ը^ӮgidacUHƼ3G>ŋV.Yc''!wn &SxYSR԰ƍ[2dVnhȡ#~8?EՒԐOR̃C|o,G^a[~tkS;CAAA+ZWg㇜sK_ Qkx![6oȀ\e;wa?}L߅XU,J_K| :F$1nx@ @Ҽ ]G       !#   ʔNZĹM.Tnk7;>_#"踅ҠI B6sa6nTF6jJ>Xv~~ߕyN0qt&N,|޻_tSF)3-6^|F-ǧXst҃uҦCotToj͜!<~]{RݦƒC\݆ndqrI֬]&;4nц8ߛ2l>}ru)Ĺr:ͤETnúնcW6j؉S e浚st:4~Һ/#OAs̚#~u6eێ8:oT[,_ف1&ĆN3iֺ=3fKn4lTn+7wbnOztٗc'N*uum԰i@ێ]Yё)!v'Oy^ީq/%kyC?l@Λ%300jJ aumjeʱ&˖,8ΎJV9~{stw!n>\~_ӺeseGQSSS)/L&|e^L9eJt¥ȗ7/۷le?ޟf݆tm--hڤ+Z/gB_OO!+zjU+-}yXsgs:gk5Z5Ydȱ*2YԺOGOg}> "8>bTPIؾ-W]!K[8o,+-kVʖ)-ś8e=.ӷW̝IŘ=o!]my33S Ԩn;hi(ݯlYNCE8~}~u3*YVTmaAu7::mmLʙrjjԪQ]qڙCG0yL-5~Wqqqd245%g֯G,Y~SSJ%8gxzL2555VcJ㚙R{b1}phĖ… ~w:'O=y)KUoѬ)} pr(szv;}Jl(TNM19s3J͟=W^W ;>W555Z4m̞iצ~꾌A˯hlUǦA [@XXx8eK}d˖M +SE7ke;,] ڵϟw!KPjV橧gκa۰>;SHiFhjj{~M۷G'xκV kUeExzySx1xn7n!**|y2o/֩^;{w7On)qf|(~k󧲕%fKx yra*YBJv}[FPxk>pa yE ݣиEiewWdMs'8$B 0b`V$ōf5:s 5%WNtNOd΂ŬwXkx%#Sv8߄ǥ˼>U*Wb̈(a8wʲ"3'[Y O/ofBzu=bhF> p p:˗PSWdb9\jv7oprގvV-[u*i ߫umرs7>Ց" /qmbc㰪XqvȓB_ -{ѷwd 8Z+VZˣO%WΜtЎvmZZFSUnݙd?Cn8owGE9m w~lՒeJb˦u?[H͈ࡣDDӦUKF ĵ7Yf->|Br̜6٥}Ɨ/_]ԯW;zw7cbS]T2fe<{ \9դ[NQ\YLL-U9L9u,ݻtJvll,^PX[O> >ʒ%4G:Ӷ{ccZhF=$٫/ej||`aaA>unC~@&t؞.:HS""#q޶OWG=mtyߝ>ua=O=(Y8r_cyw05A&Я7 ۰ى'OL|yЯ7$+Ǧ qtF@` J` } k\?*Tiz_ض!!s'66z0nٲfM$ߊJ|I{ː)Y8ge7|2;wQ}),a괞B\}=4G_0?0S F6J%ڞԝ{QTd%8OCc!/J㵏ҿO/Yk6}p)9B^AAd˖QÇ`ϛwlL>[7Ы ̘Jre">>x%"OܜqucھbZ8!ɗ//wW&`RFgzviqٵQc'*܈۸-[wС]FL.^LTt4:::ܸycQצ6w%8$`t4VJ%444x;7j@r,nXr)FjRH}>~BCXp.ujJ1 bcc?g&d74$ ~bbl¤cy GeҏHZ]S' |Jɼ}.eJT(qifƬdɒ7HT=& ۦcGH5,S]ٴy Æ Db~ƭDEESúƌdUڷ uu}je)\ FKl#>>Wս+rXDz3smrX9 Xh^ʖ&<)S o:ȹ3'F’Qm\3Ա=ᣌhmN,PR%7oV+[ 7nR:Naznq[UVjq fͥE&6'O=Lxx8F ғd,g3M&sN:¾AH>oްr:zt팖7:*WETؽw?۶>~Ĕi3YxgاY)HpiycXY<~… 紫ٳRJe)œVlٶ̔sy ,,Hbbc~]{ӪE3A2r굌14Y΍[m:},ٲeFjhkkc] gκ1r`i}.fzg7Z)GppNג+|n?0yXڶn @<ڳO<(M*)\ ==]YCNN3mcccsIq/]ʭ;wRWúm3M!00G3b m*iӱwW&1d`[WUO)SBylW(T AlwM6x/s`ͺ TPfIaff~}*(MIaUSfuuyw:kihjjP 6:j6ܕ|‚93zl%66kKO;*V(Ov8yڕ߆\U/]luXQbEоKzy\aǗ0޾{4IT,_V IDATJ@CC=Ͱ?|tQ hm)##\9ffY'Ȓ5iSn޻Ϯ=ٽ}  ˗/^nٺm--\΢˙|Ȅpv\%@ذىH|\1y.ʹTٷLR\t^a?ea %bymU0ЀҥJKH|?~J<y( @vCkDOWޙ|vHJVHԨzLnU Kx";pu]&KP53:u* )??>~:;Gtt4!dnE˸|cbb,avQNо]Rjjj(ޅݻ(0ױGG[[[婉Y 7bձ]+W髷kPP2 ~Jll4+%Ŋkϗb@z(Q'<"RD :wT3ߨA=SO߫J:q*W=x@tL SSúv(|nʮ8oہK|ؘbR}z=w'0!@Yݗ@5ԭ[w0͑#DР^ lj"""ɚUT` OވO!#*X@_…+U"}E++KRV;+=3vGzu4Nn-]>loF m5w!o߽gɘrU.Xˈ䩗p|J~˰>I;~ U^~ BCCQ܊ʣ׳ROpHH m==0t0qxTy2Ga`>XYVG0{B!>C /\sȑ򫮮p kKuٽ ƨɧD$OœQ?닗,[?W)lg4EHHt 3솆1\a9i~n?oJ'Yry/\T#[֬josF+ɢvjjj^73o(_ F+I1W&sQ`hh@6ؿO ,ׁIm-yY'{I*+K abB-y1Uthki9Μg'v2H`lرhddJzKFGE+# ?zDJ+=u7ңF)@d2YYcyy%}|@*`yܵƄ~~RjђeܼuQPAtuuٽw?nͰsP窥SV)O  %G _TFY##d2aaar4)j9H'ϷJHz+C蠭@@yU[J;+=; elφMN)/]H"SwՍ\9sR۲" ݸ9 l\JRي?bd> oRيffL9];'[WxTBϢ8n$8n s%v;ƌBCC솆^imOS+:vÿ~Mu׳hԠ>}{;%SOghy.V86oQB'KhI?%9mT ~I!N͓, }y!QZFI]q8}`;V-[t ˗4}*}[]BG*Ą'O1c``ϛ䣜Ǣ8 S8vhoyWK]]ӹc{>})׳]ܹ-Q9Qe#ʦkhrq]ƌL>5KXi/Tlu܀,[:k&.I"((HRR% 7_”__|ASSSj/g7I!'ɟ/woWd8u,wgtlbbTV@&= S;NvX\HY$^ۍJ6 ,!4?װ0ή>\c =FBy;뿿AAʨݤ2A,Es_-%,ᆵTVK|vظv6Խ輍Yӧ:kDЩCd[}oMPxѢ\L&KC,罯 2QJV̛5y'22iP.׬T7vHCqSfJVx\*=L* 7{GDDy3S3|?|PaDDFb`x3xZZ򾺨(ʕ#QQQȟO_|yEŭ;O]o޺!"2}==EsPZZZ=qRi/V{$; b:Lsv|}CС򹸉 /߄'9\Ɋaf#9B.U7oBCCNΛ7RikjjRʒ];'9sѫ{Wǫ>~T#yuD ߗ ՑVpvӴq#cJ[KE s40shii%8^\\.zHqʗ/^^J: c∉Qxk7)V{I~H^3}\c+Yϵ7n/VZZ=|SXQwzeD'YTi ot;玺:%-ʟOvVZ{5u5fO|2 ewU9._aib(ո.z]˟x%ov]~o`an] O .Qwy\׈:wheڶȈӮgѭ3::}Ҋ|W8*t֋ ̝) =-QzzlrJdd$/^by&Y@\v[wJe꾏?jͺ\jXJzvB\lܼuS]3/\k |̞ϟ`$l/WFĝW^fH;=έ;wq.)]Jj(+#U P-+V;آXv=}yC%ˊRv'O]?g2fd?yJ@@ oWhkiqu=WF&IضcUk%,,<հFߦR}B.dpٵpu&L&_HzKSt[9(V}}Q*ŊKr4u| w'..ׯv]Z7'_#ȞEUq _.tjC;ٳ 댟4~RYeN^=X尞rU<._a݌>THoJ).dx%,Y8WahU-UZ W~~ '=Y߼%Uƭ[JZJpf[(}/`hhٓǒO6TSjլlٺ:z_\07߷ffw%K OƩ? 9u2/u.fm#:o۹ R2)}7oF]]խ0eu_eXR,_6s>BBCifJDӭF 6{"((`Ljլ$O!"鹯hӲ̜3hձaT 6ʎ#ظnUu ɾ'#&W  a? ag{3 Kږs o7 [<ʒ% +~N[K-̙0v4Zf \I3uZ֩^jjj ۛ#NPݦ{̠9zvB%"W6Z4iyص'M[CWO-Ĩs3F)L_K˨kLAw!w GE燾:YAA~/.'O}-Ve_FMrA~m--ih糰)AɐAٽk^s.?AAAdldۻgk    =KXxSg+Z4AAA?U4h2M.M_OWgA)1GAAA/$:}AAAABGAAA/$:}AAAAB+3jg ˛7C\Ĭ99u0*iԠ>2$y f1n/M…q;.:}~ )nԪ*X(jjjXW"]^:oǨ5w;9S^qqqd245%~Qz,+i]+Znch`xѨQ[P4G,+V1'TAmMjԩ KR%JeٲfJ(I\tƍ#tʗ+L&czjVy1cGYTZogs(um8azhhjrƏ۷G+%d2/xPjUTb?+x9EQMNܹ{(C]UF۽1d(;o&洙f$ߡ-7?,+g񄆆ϊU<"ƌxbRZM[eؐA4kb+8x{r`N㖭ܽw rѰA]tꈆ!!,?2 S`"##qܲ ` +ˊRho;4jXfNqe鲕,_7kG-k}},+2dP8r8zzT(W ёWwc<{,Y`S&C H(;C~,.]J]55u-)X ?} wع[6pTJsH^Ԫɞ׭P~`f'ܽGll,ʗcXXKR>}f#JsdC_nfzzGN3SڶnEMS-#U*eӻv@WWbE 3iX?|hDaRDqʅ IDATV-)eݥGo6%..GLL ͛6a`>ܼu 6gʖ)ͤ cnh(GXx8aaaɮeljd݆M 2AtMorӧϔ(^qcF)vP^ArqqԪɈaɚ5+<.xR¦vTEy;=.i4jX?A0Ŋ1m_v?7ccda BCBmKp}WF @WWW!2,|01&.. 㷼ÿs*|?xH@@Ԧb ,_:}>z,zz c^~ŧϟUڞo޾e֕6nrdUAjќ0c<\:p`eʠݻlsIDD$@uW0dhL/]ZZZd2Lɫׯ٭+s3ؼAZi͜>s}{'On;ŋ+2e+V3d $s¾d?U˥8NpٵV-3_""#r1hs]&NFҩ!lvr&22ƥ7+ˊhhhS{_׫91 #,Y8vZ2۷(J6;2xPŎݻgRqqu#k,Td>l+z)4E&a#FTQyj bf {;z-7 wn+g*PPAIod˖62_Ȟ]SrZZ*{lįr%[|}?!&ٍ@Oe~o6g@O>d[Q=R\tړoP ~8p];wd@>3[SLifNpna]iBk­OJTR^r*mZ]] eS[)~AF;^-fL߽w?11XPzRLiEW!k:/_f)\… ѻ@%O>*gN%˩02qʔ. tvOryt8tttTҥJҡ][[ȭg,-s ?2Ȝ93DKK5k9vm7( ev?^njzƎxϏoQZm˓;72䉏P@ HrXײfGv {8w鲐e cc#S.$SȞ=y5}KSRp$iW`?*l?揻:6n@T);W^^:*j\wWQnmy^ÇI蝻ZBMSC |Zʶip:u>A||<111a`-Ywbffr\r/v:::ԬQs\Ҕ^k5}{7(L߽@{4;^ШTL?|Ȏ]{x15%oYg%@^lz߹M%sY###O=S("4o– @ܹ(RR|_THlYiiɺ ؾ[+,RBjO䖘… q3[z*_1ɇ<ȼNFIxț7>}V:p9_%CKK CCC~@ ,_i7ː/_J)s. %ࣼ5<}\ܮnNi^t=͕>x%N5TZoaòd^7 ~] ,Yۍܜ^7Y lTZEegw`dqTT\~7!!!TdKìʕ)>.J`̒ GԐSDCC7LΜ;êre144',Y->A|Hʇoő9sf橿@[[C%7ob7i*ujפK%?/'!C٧ Xn#koRzʵ(!~C&a?yF 49ȔI "K79@PP0nqC,2n2YalZZZ,^8;Y LFR%9|B')RL+6 ,,SFFFjь{jd^'`dHOD=wҥJQLoi b-Ҳy3=~d85@ $7I!R# %/S&}P72/'s߄ѴI?V}n]paY*T0.#GvJ*~7W=X|BPO>qVOo~T(Oٙh ;S9gWJYV~ΨC%%W7A_|ŝÆQ VDJg^E}}}⒆W+ԫSݺ(|Ԅ!9--Y83m-&8Ad"))xx^ĄIv_16 _ɓ;J Rf˓Rzg\ՆPaoj042tz\oK_3s3|Z`H cdhȻwVNyapC8`س3ٴK3hiiѾmkڷm/_pm;eeI k`Rthז_Yf=aܹ{U^I:Y  9R# ${!Ҽ/e^$i~n߶5o޼~ V._X~%O8g&MUSDDoжu+PY-R<BhQBRښvLK'**k7S&+.R6`n{?AɜZ鹅ܲO Hx4Dv >|vDFFb:zzrݟ,Z¤Br|(Uɓ" {z߹+4A6N㚧;eJFWWΫ АE soɗ7 o`` 8bnnNjruķ=/^zRFzz*+R <| onaH+?p Q߹ss R޺;/}HjAڹ#[e0HyeEũyKV9sW-ZESvkre~[ĄKnntԞL9v~ ,WI5W <|wGByk\ݮK9tw*+h 155=zgSJe[~t9m;\q`˶l۱ _eެic6nq焇g^~a]5^dɡѭK'<̚uWYx!߬g /f̞eܺ3L6_0y ^\rucӖm8@fN0e-V(ٲecמ}DEE.^F֬YҖ/_^nܼ{>~C&-h@R]:u 66c8{wr+K䊻^*ya2+UJoJz-p9w0%Oa. ЬU;6lڢ-1+׬cv^ٹ{/oCy$?;_'xXyt@LL,S≏_}Wߠp/fϞ >>^qs@ AZ2wH,Ô鳸~ËNά߸zuk+S+IURre5wmoΞ5Te)ϗ S$z4h҂^7nwKM*(Wny&r*ݯ'>>,\bE`RUU{$CEeł8ǵ,wX^iRޘY~NΧq>}Wi#l+*xo+\ru*Ɍuܹ F̌5ٴuk7l"66|yгG7'c* ;'..>]:u?i3gGݺޥG:;MyFn6mƘ p8̟3{q~E7u 48MBKKժнkg+Cۺ\Y M[YtE b 5V>z`bl_'pr>!ʡ'^W5+.bמ},Y@||<9--t}ߚ"K,eE&iۺ¢ 䊾3~fZ넥euĹկw/\`T7>>8 -9LY;ټeaᘛam]… J_---̛Ŋkѻ?FFFnmeqű0۴jط ~PښAi#)q|[eUun)UNN| hr΅qˀ~}8qҙ;wSTy,-sn :`iDFFʊzukplf̞qX|e-J(s@ @./j;Fj޴ Q,ZLFƧjREZZZ,; ;9r8Aȑ& S>_ɄIS0q V,Dñd4A,Fm8n@y5111<}x@n7CPGLXh>vwABBBeQ#<Z*]QȰb@>mRm'钹rmk`Fك9ITO=tȲ@ m.U+4O^ޭګH@ ~]{yW'%PKeIOH nN #T/&mw@(D2 ?b{@ sЮ /^:) x\$.> @ P ȈIsCll,ơ+@ g@ pjT @Z5u@ Tؿ{ǯNBX/%qzMfB(}@ @ H'K>̑'F #>@ @ w ?q@ @ T[H,+Hn߹My_ @ @ RM 1 ~G @ _P@ @  J@ @ !B#@ @/?ɨCvmڼ~6CqquöZmd2d?lv{_ Kǡ#hд%}ŶZ;vͰÆ[iTu5g߁]/_#Ǹy;S{`?eSf:H'5y\"##YfzVMll{b[6wIHjw##GIԋ츝 '-j ~u22- Бc?$-I?-2`FqΧze 5W';~~7qXA=ѸFGNׯlں}R~9U%Nvum-\B6Y1zy`ȱ4nކЮS76nv$22d@T%c޽/0_߇8lYrʕ: /Dbm]/RPǛVtuuYp.aa<} Su‰KRlTw_ԯW[ ?"7x5[-翖Gө*YҥK}=kTԙs?9i'!C~J\ttu(T Yf o!ڷIԋ/⸃}zeXe~rÓ/_ѪE_o裔y5oܣDb*kҢySu/~wwrpe5x@_*=r8?LR 7)y쇥e.^fEӸa}޾{G٩]<~=xsg*Ps\Ȕ)ŊTP^+א;W.׭ѯL&C__L=ZZԬ^MF ٭ dY?z}=K||]:W YFrOA' qŕիRJe.X_1޽e݆Mx&**|y2_o֩'>7c7OnE짢IsfrSOоm+m—/~T`̩`R~beܾss3SY  /֭^+V^σ!%;})摔8)}vfvm۬Z{ćb7n4۶fT^zž]#^(Z0ZZZ#'>OYtϞ UNƌNU?|Ď]{x1ϗ}zQvM;)3ȷ"<~-~nf-VZ˻w(\2zDKR_9}'NaffƦu4I̙Щ};z蚪rKBZwFpX IDATB~uYƄq%bbxIM1uԔQKd frd2.^)n߹[dG\\Jhڄ(k~<,:ZhQ@5O]]`."[6QzE__[wXoPL?&iRkvYt4e˔f-RX񎦲T,_ɱ'V=1b`Ξ]{x=ffnٜ~}z*Ʋdus'Nq W,Ŧ &Y:nǏ,QiS-%v7lq޽iټ-[4%e,Rd}ѤqCpFLL nhfɒb\ڠ^]}D7Hxޗ#PX0g/Y$,+[D;)r~4nT_Aӑ\ O(};T&Mϓ}_hԠ>+V`ࢤGA004`d|QnɀdYk4nHmسSfp~N-|J֬Y=b(Fywa122d&zܙ[􈋋c$|ɀɓ'7/0f=wo@|\Sg1t㸸),\1#+ ?Wnd0k` {bx{[پs۷e!DGpQ22emF@ڵݣAA۸fϘ1m+UDGGϤi3qXH$IyË1\"3M&>wFΠM1L'>د%lj DŽNС][vm̗/~L<;_D%ۊ>/_6sQQɇ /N85eJF hWcΒTR3p.kohŠ2Rn|+o>vHǿ{~ylްhP.ePʧU0vVhkO:sEU:+-V}J89!_<3/~~ߴsSSE$$F]?{&'qXk_.[4Ǻ\a'&}˧O3ޞreK3l@>}̔Unf.?~\ZS">>1gd˖2x(ގeIe.؏޼lIkL=͛2j=~–m; ca80I Np4(_,QwC,[V@n]cfGf̚˶D2ԷqpbTHͩ]83Re}m{GhݲdKTAO(}VYT;^n+Id͚ժO*8хQÇ(Vw=@L014UMSC``6Wh|cv&OO6ț'7zʔ*x)$(V WfİhkkcCjffUNŻWyr֭R VZw}ٱkO! +O:3r`v@J-M鍏gTZY=Ru9jW(T _ٽ{vg3k7luY͟pˑ#;Md`M111& m~JԬQ]zFmna.ٔV_-VZ-;Թ|EvYJ+wƵ՘hվ3g]7PM{_dNG-@"Eе>OɝJr*$4޽gI/W@L튻8A~Fkii1kd]DE3W,Qcff$qL65ki|OFuH͗8wLvmRٖk>fN ȷ9&J%[9tU*i,gu]ҥJjE_\F$s7FZ2)~-F ѡw+@e R)9--i߶5ΜU{̌e+lٲ*V3חΧq:uTeԪ::VQXԩU{MrK Wimߩ;=R rYnh%7)cDb2gΌ V9-Qj p:gXQG Uj=q=֬\4H+/Vϟh?d$m`] vp%NaϗV-ѢY Hk߲gAeˊòŊzzz[hkiWՍRbJ\v+MX<-vbÌ9\RYjFFFd͚}}}a#UTbI|+Itt {eNekp: /,,i޴1-7S$ɂ_uZEZe8|9ԵÌȖ-+͚4ufJaH4}u>HϏ>cƍS4@.gPׯZZGHxQV 'O#İbZ ,dh.^q*l|&O[/yejdz-Z!?^O_#HҧREFITцjλHzWLL ܮPV ž s݃W@n{SzUMSCL=[ϟ?C:>'NqIA\|<111*Vq7f*{DU yh~4Ʀ۝ضc7/^"((  ޽DGG#)!<~+UAGGO% n .6NcXR.UW]sy=J*,yݺMJJJGS>|yr+/yQ_eu |j-ݺtREIB8f-HirY1z0,_I||<ӧcdJuhX&{w:P#5xˀ6k [xD;vU>}LLt41UԖspHO=g$;iټ)mD M0N wn+>'TVEI]J8 ySv4oژ+u̩Q RJrKWimߩ;?%C-_#=1iLdLF 9mE ܺMv U*+q RJR͚% [6u}'Oao$qJ5־GԪQ]鬋(}z誴ԏ멩ɦ,-s(>FFFTTQqLk]EG tRبA=vãO:ߟJZ5Xl1+ULv$ &P`%TrkO_+}4E tð65UFqN:f߁Chޔa?M*EQ1B֦qqqOaԫ$qi=~/s7lݴ.ٶyP5llE=3M&G\ɼK040VJ[Hȕs0oߍT?j#*w^SZBBCvZ__.*>AAX'!Yicb!nt>%Կ/6122G̙Y D@WV0bTZ0I mmm^z͈iP.zt -- B}t*;Vz$'GTTAAod;ccFUΜdʔj,M .^r%XfR$%VL^CX㰔2R(W4vƨU$ 5Ο_N-;&s,4J@9хU(fʓ@SSSoKWp7Cpd˖p|K_j9M۫.yrbBXIRvM&-I9# WLȢcj,hfʔIѾȒ% JXX8SR\D_OD}rK@]+;JSc2ʤ̙3# #$$d'EX$3&H9Ojdm6$4а0""ɤKڷS9ɤ3k֬*}TŔWx%,SWQ2}ppM]jkk-[V #$4d$ &uir"ݦeDD!!򺩭AG[$eʔ }}}ф~UJ!?}PZh*|6mن8,[.$7_%l^dkÇYv'֯J6XYsѭʹ?0V9> %7&&)vH' @JgʘU O~O>hԠ>|IbeU˗=Ӧe N9 Sܳ2KѲyS֯R\JH-cǟ_R1BSU1\ݮpCF*'-5y&XT>Ȉ~oHΜ;Sgx5eJda4jX?MJ-%DDF:vfbMehnnҶAU!3SSmwrf,ZƍӲy3N@,()r"##q|'3򾃕UNZhFɞ'"EOM~$CBCdiۤR:kFtqʯБc8SRj 5:wlz-ʢ劻GE{__ yI6̟=gZwԯƵ~ǎ"00ж ɞyBAϳJsJȞ}3MHy._U_OOKE)VÇDEEQ >_|yy'-o啧""#140P._Qre3j022Ŋr*R >GׯZԪ%ߺ5A‰W G~ӋmE-T9YJ*Y7oO$;o<|JA0֦=uO|PGRhjg_;gLa?Pza:elX@󦍙pi+Ҋewqqq\qԷcbcVZڰ+bEq:uF00FW6^2%s:qn]cwġ;ٶy= gu4iٖ)[:Ԗ[zIMO/ui#tQ(Rjzz4nXWp~4j'iݾ3F wm+Ϗ^7%}OrHQR5ML6عgU*rpm@V-le@jR%K[朗˨XT >}̃n!xݼ8ZSYJIR(Z0/)o]s䆞bфMkΜc <ѻ`:wÞ} _sI(%>{EKiҲ,Ԅ+s~(|@rCɚ/?@s)}HK[93RLi?KJX氚QÇдq߽|ŝ(ڕDyQX̩(857t]!rYY?f1-EKTVul3SS]@]ȔICt ׽nw!8$鹑!6qܱ _{̹U,sC5qr>h Wm \g cNbldd)Ϝ<~C||<5WMFc%ˬ۰ᴭ[6c<~CXX|˗ݶmx.^"** Pcz{Y 븸1c|Ťz􈡸{\n4\\ݸuN81f=>}V5=q ms| yŋ [$22/_1c|+c ȏ#~<|Du&ܒW2`HOۜ=w sU:cμE|?.XBŀK$ zaq3vٝRTI鰺<'@YfFt*uDehټ)ժTfּD~[L4###ƏZ-yW73wu*.noqqu4勶6{\^NQl<~̙ȨF)圔Æ#F(O5֮ߤPƧ̚]s'Os{N`7y׽nr47m!SL)Tt)O_L;w޳qVsMuN RM-nҴd}fRJ uRuq8x4\:hf҅d˚Y*ר^ L:{s&NΰxيT%%,_L&cެ>qqGx@ХZڷt֙}Yq !<{k֫\k~*רKhO:gT]U:%| .3bxtI~,/pu'>|"_2?׽`1ٺm';vsv Oб}[[P,;v M(%v;2g`L*ڤhȱ8Tmj !9-"&?ttt;<9r8ҨA=>*%tuuY46 `ws5y]vwnRQQzI@WB]cf]@*⹋Ϟ.=b]ٶ"yrb9vWh)Wy*]0h(;_'s,f TZxj{Wz9wܹr)L Y7g ,_Xˀ~4>9m -kϾѣ[gbU5iW|cbh԰}zugӳ;~~ 9X*VnvSYn#&:: t![Бc|⇱%k cF'66#Ǣ%?Ĵo= }L3vpV]Ϭy _",;Ku S؈ʓ;ۊ6l\-۶3g"*5WU% IDAT6&$mM[Z/\)CW:َnf ܅iټ)5o240`{F~ڊ-]·߭&Oݸt۷=Knvcc#.qJS,;KKXhҵ鳦MfeؕlٲҴq#:uh%PJ9'r] 1{>)Q4o$Y? )\WbZC0mV }+~-ɕˊKj&S ~fL̈QȖM YdMiBi 1G MjMO:vHǿK~DrKR !9|8nd8,]궙@hOmmm.f-;p`,sdt"UFIRu;Wpp(o޾E[;+ڷ䴴dE,_op:9 )G\\|WB3.jiitײ|c([֯R\4,Ms}/^JPP0{tcİԬQ93}N=)^Cq9&YP R;rxoSY(埲h۪%̚LF:7&>*G?g =aƱyjg_%&>[Md[|EA̝\mԙس… yG,.:(n [ Gm|3gfݪ۸m;wJ\VL?mߎXFu.\RXΕC)P'X 6`50MejfwJ:Y 4q#wyÚ_pC )RXM;qqqmԜ'Ҡ~]ߜ{qy*j׉֭ZпOzfٲȔ?!%EAPejbxa@  O->෦k8|O| ?)W fyM[Sxss3խ"dwܣOnB#5F̚>YJ`` ,'0(lԨ^#d%s_ X|N@ J@SV_%w>˚5+?6Z !23771hOIb*??h)ϜK7 ? Tvr-f&?*YHtu?U *&CWn>O\ @ 1`y2I*&fo~6w @ @ xRmxŊ@ PϐL@73'04a#@ @/D(}@ @ @ @ @ @ ">@zq޶c5S:tYsx?BAjst'::ZL:V:Ҵe ǫqEEiݮbæ-{ᣤ4SQ3nNazgW0MZGl۱+q<|ݤؕfѫ@,we{wޓC=Qea/Z!irAiԬGW6y4i&O8ѦC4MҼu{cԑca7i*|^f&-_HרYٳZȴs Iwhj!iz^A}Qq9 ~?2?`_ %~Uڳ{qJ?XbcN}L3W@vڣt֋K Js?;wgrzDӖmiӡ #x/_q4j֊)TP2,ϝE.y)&&N[8EmS˜DDD1|`Qd ֮Kx .9b(˗d2ܽ$IGG5k?W_s^T<}Ƽ)Y8sgMC6x*]񥦬?xɢ4Ӹa={7oJOܹ035MwdTYwhߖ+ITieuɓMдIt?411azܵ7E_pB򿟿 %Inś7on._Yӧp=N:N9KrR2g*޼u7oҢY[FŏO@kZ/r}MNjy1ǎlҌ56[u#F#s3s3;wfb055a҄)}d!ŋe ;+!!ԨV9R|?Mv0ic6n'|Elhצ% ̜=ρxT(ϖ;eKp|*_D`kkCRg@_ܛnfz=AtX= c̙sftJ^g.4NOv9lNj\ȧK=+f߭?t ˆÇXnG"׻'Ydq ,ݏ(KW N5mN%8"""p uaa4m@pxnCBhݮcF 3ܺ}%3h@?5kɌ)] -Y߾qqr˺ѿo/ҥK'\[x.rɀ~1z<۵IAj=w2dFth,{||<>6p BBCqʞmPp {Yje6l%88|y0瞔ܻϔi3^[Yh>DDFeueBe:wwذɗ |1u2NN4zt֋n֥e g~vχ0h 2SSeSlܼ?`ggKZ5iצ~7Y{T(ϲ+ӫ{;Jǝi:-9ZåWV(^^=۪]GԪI||<{$66zujӽk']Ɋ@1l06֢{<{ =yG&GGzJҥ111x.RzU3:!@޼yppi޴ڵxy]\O.13jAۻ33Mf*޾}GLԞ5(ڳ>ޞ&Ҥlsttt̹ɶ]V&%׊ʳbj>{Nr ̜umc-Н+W|7att4krypΙ];Sx1!Zʄs9P~}z>}ddR:Уb׬;1#իUUꐜJ̇4lyaCX,aIwR#[cjjJ%-@9dw9$ -J] LNpC&NI'OcXcmmrUܼu^ݻ!=?sy7nbTp/G gj9lOP0obzF#G%88˗$d 1#q6gZֵr)|o[͗/_y6߾)SO>wCGfo޺{YQ޻O֬Y4d2˕e&_B°&:|WʺLt%/W1TP K<ӱ}[PBvCuY@OgO5v%{N1e,}5Uxq<񒶭[˙ρ<}Lj5C6rL2Rg)cbb¬6s6K*;ҥ׻'.g7TJ%VfƬL8Np}e/o֮ȆMԪQ Λ=c  LR-!!/kP-q6G*#.]´U:=vg۰_ҳ{W: ϗ=A;[Yڇ; S4%FW@Z6oaal۱ǩ}X<|\9N9?W߸Dk֤CCC13KO]ݻ۸h?JțoȜ)Z}T8:*z>ښ0~TΘL&9'˕iFXX#ppPؐQ=*reԯ+K3];w cF׫'õm.lmm!VYX [016,\T907oފF[4kgY>Ș2iwccoo::)~CݺV- QQ{zJ*!LYt+SXnIͱ~/Yg˚SS?~"| 0009q4P.A $t)TfkrWҥK'LP}nV{-#G'DD-P(h֤ +t.Y8;ww6DHH(GBIiױ+V֤ \n!J4_8x/^_^0nd,1f D&Xo !2  RSBSv?ڵ³gVڶn).Uo߾vFGmfLMMl!&\?ӧɜ)hj Mm,1-ЍPΟ-g=v/_;w?g!_t)>|&߭:^:ftGX[[ѧWwFHvoڵ&>z+9K-SVB^bQ.SÿM\\˽ș#%Kh3qyTQܵ+0gʤB?̙2iքmo"9}gђe>#d<švn&oF"8\仕/93qq]-d/K.v݇K {l±H>{.x(Q<{BYhO2Q4b/^[ 44멩,..ؽw?+W^֍|y"n޺MEaVVV˗ϞQfuBCP(X[Yi,6T){vW,\q[n&; EXpbE tOU̙3sɓ)]JjOȭwx%TXA^REAk``{Y7^(Qᑠ]R|9;WYC+kk|B\\)AA-R.x NNٓt ClKWr):?_^ޟl>2۬bEpHllZ{ҥU$7MY{}Vjh`Mm,1-9DX,U;y6vvjeJ䩳o].Bor8ǏBPGDD$Zg_mn*UT.b':|.͛,?'Iy5"""Ԯ*+?O3n"sg owou\}\"?vArDtȈ#ɰUF~$p[ؓйc;šp]uзw|֙w V5Kt@% +G{.gLAi`` lDp0A\OMeY_ }beeEzuԡ2pN܅jL^١T8;=I_RM (Z0EПxq&c:uh5Rw244M  Q{/LMMH>]ñ0WEPp06t[[[ BG]w[.)9FJXXKΖuc| ee'9gZg?xYyڷ4eaIJ!( lme M½ԙL9|N7 1Jhټ)d)N`e%14X666B{T`o/vKY҇ ˬ,_?v~Bw4k҈7nҵGolmmرe^.j2qXx]{Q}| %l.5ud+UfbMv6' I`pBBBY(\.ڲ>2LMM011tGrhҁe%th׆E ciiɣG5w{k[*n߹Kdd$kUcu̚9r&O W.$۰а~=^~"e,X쉩)mZ`:5/s>i۷YM(}d*) Ξ;O>DɭsssA^=x%vb킵Rv҉2KSZ+ho{;TS&)lԐϟ9q4V%sfjլ% E >U%"R}…ذɗׯ߈FA).5KdVreɐ7o3vҾ}&AIު!!hw2,ɵQ4MvIKƍ eDDDrzP֒i!,Y2SD ߸׽SKJeA!d˪ E&*J>ؙZ)Zۭt)-YM[X܋j¥^~ IDAT0b`Y{k#$4Tt M[//5)}"""###aEK{Qc'>zٲvuM̉S{># !iW"Z+8nesfN i*ػԶGr*AD%޽Oz؟`K$$$KKK29:2}zԿLѡ NILLL;GjTA-' vI~Ʊ`?n{a/# N6)**KШa[ʙSe! KDLܿ@F-sR;x#&&V䩎ڵz_%W.zv\.XZZۅ{=ڿ )!gΞ>{<IzftpUf89er ރȐ!Z=2d#fffB*֮1+W*?KWI0WӖ!! #JkN7o^\..^Ŋ%W.9HgΞ'hG)}$;QGrpC&pjt҉ի{ *V%6ɡ5} ) ^~-3Sq)u122Y>{###͓lYG~+{z-}Mm ZωRq%כֿ r9/]!H..q9 WֵICɚ5ux-[Bmɑ eKX8O-5c$-aı)w]IB^ [W}拏K³.XFFF<}\LIR?ٲh3Yf! G]؟`K$$$ҎŊߟobbB{yC̹d2ay}utt48/\-hgQA2:sKӣkgZ8߾Pr%c *FE#2kҒ\9116f&_ _XG"EePl߹˽VڮP0he:0G. 5qPJ%υg@_2:ocrEɦrE([47nS ?M`'ffϟ ssܽǛ7o}'͛r3&nݺCҥXLF|yy3:O~̜3ACGPf sm8DD;3B Rέ 6|̞%6=vkKK 4k҈3nnPρlܼSSdI{˺hL}9"RY[[[ѺesoLTt4K 7.^L>=Sv7sP;O>cm4iP5T*Y<{B!Z wvVaώ-'{cdQ )^(7oԙss;lݱSg 2m;vOYw 6gkkC5Yқ̙3-kvދ߫"'.eMJx٪BwMR%풋.1*x}!G\Λo9s<&Ɣu+?WS@9L?FXWSL&c瞽 =[VO``5m[dJo>L"Qo߼GL?Fc9Aw{T{HM{LNz%qR'E5 DBB"(VbE0|XZ6oK.g"#3 ܱ^АQc'ФQCZ*=|mŋeԮY,3anh[ 122bQ3!Gha099ܽa#:ig4lÛs >|!]\5m0=x̛=u61k| )VZr9ri㌛83tԁujI= Ͼ1d͚C vvx.x\MׯQha\\~aXu7P(D#5W%sfG6n’eˉ/Zo; | ֖ 3M&1m׬e݄1jTtvGhhٳeeܘ?֒Cr8ekٻ5kד/o<1#ۇa#,3SӧLd 59s&ցH }dݼic=΁ $}dϞcGQs]&ŌqrʦvԐRYtlkkvǾh"ve0r6m±'m떴oZ2*Y\zgˑ$ ҔBRh:E ӻG7X풋qGҧ?z=d= 4ah*bݐ4t2 rniՂm;v]֤aDD$=Mjeq떰ԍ[޺sYs~l{ΞON \<4.d2Ən߶5ص{/#)NN٩Qj2%UK==&%כnc``[RB_!=׮PePSK̟`K$$$LIXq#0(++K Jc/֮Et7f̞GLL +ӿA5}u bSD1#TNϐ2l B}hLBÙ=y(mix{-9g^|E\\O>hҨhwpnܼEvK.gg]ڒ7oƌ.rYZZc>LFB6dڦ ?ÿ2S !a,ŀ-?31/V_}OvX8ovk.DFFҬU;Nc@B8d8_¿dѼT/r+y}fՊWvdʔImF< mwMXՕH4nƔD[G><|>7y/]r2rSǘ3on`s5b(juܹ{_0}Z1 hծ#ukפmVvQ~[BeZ(GIzE Qj[F;   BiM lߙ|ԍǍkT'N!..PV<|G1i .dV"Ю5VeϾݓOR$ևaaTNZ5Ftڃoޒ-kB)'\?Lv-N6# &<<\HK6&!!!!!!wo"66 ,,-}>~I蕐U̝O&y{Ra'"M]wIC4`ll,,-IkJNh٢Y3JӔ%~=GBBBBBBBBBBBBB"hݽKBW#-,!!!!!!!!!!!!!!!DH]穥|ߝJHHHHHHHHHHHH;X"}J#!!!!!!!!!!!!!!!DrHHHHHHHHHHHHHHHH>A$(V4.ZEr¿Z1dh^~%Їk7nR~#bbcEܥTQkЦC؅\.WiשUkQf=uƂŞ5* /5A2Q._M}0^{ pIj{4j֊^ީ>s}FTZ&-2i >|(ٺ}'n-tdǟFZzbON&e:u,[G56o&6!ʔsnIStnb}GZZm&߭0JKD(KW9v5T9yx[SFExxx'=r=w" ..Ncu;-د"-ר(FO՚Zد 7g]έV>[Lѹ߉{~UQ;w0yL-\l}P;v:r Uhܼ5IA L?%LwA3dr*éV>y$kPMHN###͞μԾ->gDDDEdيUj cc!#3h c(\s/b)( !8e:]=r(C d=vo11D}bT& 쌙Y/Y#z*=~˜ )TsfNUf<}Nٳaooz[hSg{2͘3Yf% I4C;[[Ԯd{9y\]x3gB܅­L)[2,^)~&;vMek%\˻%]tw@-+Wy7H6HyQN91#Y_F;ѾM+׬#6рYB>|HDd$]n;Ok*Uk(\ 3Ka_C'ty0<?qV~Q$-޲]WtLFr\9Ϝ^)f||< ##☘LLL~ʵ%-c<|SOL5n̙9r??Πt4_m;vQr%ƍ!\VLw}[6nE.]cG G&QLi7m+띻`ooǒEDNNڦ7LMM=cg#(U[wbR|HC[&.S|?M~:t֋}`oܧϞӾM+@a(!C ؑcǓ,cF3W|~gGlۜ*[I2ujeN4j(:oTZt iiT޼}sTo_A;Q}:sa8tdɒ9-;?=ϞsQzƜ7թŭwa$ HTpRV+??*kkoХG+UZ̘=hjZ;wi߹;صgypQ B5U>7R~#7mG5j"KuP&{qx)R(bЧWwEE:pF߭Bڗ2gΤ dQ~# $L틉'<|Uk1vSI4nΊUYd54jL:h}\N6qFyN!QQ_IF(QM[G8+wSyTUN<}Ft {!5kEŪ5wsOJv'NfIUBrtK8҂/|%ٺ޲A{{G꣮E~>Y_|5IYI8=g`4oA)z3jD}&?|tw=jZQ8&U*q؉T*MaWҲmG*TIݿ2q H 7g՚Xur:,\B嫴l0x!jx)ĽRujDžKEcbb1{סj[D3Х!_сG5;j{}K?Q ccc*Vp`2S> 95]nYdJe$?sjuãOg+P) uB .ӼM$aTT4s,N&Fێ]r(r銕L95멽ɵ뤞qPP0ͤAWNӖY',ļ{3l"liGnjIz7nަGNdRO*(]f ;?*>~N9 Ozu115{3gP֭pGc XZZbcm%J~}n߹'s 3ж5aax."**F  ga`> %0(M뼓M`1C)z:'MFеr1VZC^ɗ7_z߾) aPP0]zΞCcjb0koPbQo޾C4d2*U:BBC_ػ yR,s,Y뽂]z0y. 0g"w̐1ݺn?2lX׬o2z.U~}zs cOKRr gܡ.S!ٺ}:wՅG1bx̘*|1F̛5S&Mɸ YrVٹuc?3mcϩfj,\΄E9)EY{ }Snm2d{97ڶj-J-kPYfMѿOOFq`jjʹ;q ֦<|}d@u~'Y.T/_x) (?=yqa45t }8d'$42`p|ŅaCK׬C.܅KthCCCy.cނL0Vt1iѼ)ݻtb >MV3 /e߁C'l߱NB ru hQ̹xyBy̜Ճ{ҹ[/fϘ"YSB`;ٳmڳVZPXQ>~"嘛j/^J%&\dL{{^A|yqF%DSK̟bK=ѸQClZBtյo0zDԫCV^Ǒk&əs2}E $pޮ=풋qcF+gxe??SpAz솿NTo޾Vjd͚8;Nמ};;[@;Q"}=+WGNيUظ[pM^SN]dD>puc s~^kh˦_n֥y ,][r9˗tԁlٲr kșIk=زO;1ihZ3 ̌}{aei7XƇQBJWл?/VFkR9|>~}V\zMcx_H.v? 9}RIZ9~T^?1syh4WGt5k/YbE 3cŻ2ft`at҉lYJ٫{Wʕ-#*FFZjTLRɃ{N0SSY~gjQG]/gXYZг[gO@g2ft*;[[2grT3knؘ0s|F, ߫ה)]2ٺ&D_YmݒGOk˼VёnhT8dȀ::)~CBCYї^2/oʺ,/W86lRgcc ^vʞSSS<|$| w >4T~=(uLMxG.z%]jJܺ}[~ 9 Rr6Zд)EmXanj$88{ӯwZhSֻIC.+J5|_~eϾ<}'r'&&&X$rCtDFj^N M]V(֙Bߝ]:q%YvFtlO.(W ߾ŰGdٻt%Cb[U]xѓd͒YcC#C Y/ڷt؎ՔN[z@|1Txn8Μc6?.* L6] `nn93TccciS=vPMZĩ4k0Ipuר(^"K.qeZor9]f̒e+ L]Uy\s-tI]dv&MY<+)#T(c m}fmǟMHH(-mnnƠ#vxe߼ υэ{Y7޽Ϻ L; ^frtX3h`?%ɵkM1Xd ,,̙`ПҦKDrn9,ՃkT<ӿodu >' P9~fΙԉȗ77nV˫iX<~2ih0|gN=q+:9s8k͓m;vaanNYҢ/PD1/;S4%~*Q |  Vzj*K^We==yQby 'RWt)7ڊ'ԯ[ ; e-U9][r5߸ɪk9p0׬iŋkPpAY3Yc˹ GZ{M2dH=}XyիUaނDEE 'gB' k;YA&8{7oaB>3~4Es^;ήm^+!:}t̛5/8w"oeテ;pgShe}=bccia1<͛kTϺ <|XP9;>dXYY,oۊm[) Sݏܺ}>y秜}a7o߉:e˔;g|/8|rp"&&0#xT,KWxTc/CCCT*krښpHIHWɑ)I>˗>yA`rTiˠf,ι}.1Ԩ^Eǽ>66coJmr<漚Xb[p$Miq5mE}d^M;geDYBy=kV,aGJ8e:?![,y\sK U*{`bbiPKrvlQ6ٲbiaquͭ6Z>xn»J眕%9}_Sl\[]QQl;)ֵ\.mmhz{`Q VglF*1tPLkVYGLjj&Oף$~'V,]4Lϒ9Μ=koҳ{\r9cnn\qKtkUYns,&{эjU+ sg[D|Ɗ:VJH>he^PPv:SSYԮIDd$;wgFhow턁aa?ygΊ΋,rGa&E)wXM (Q(%+߁g1t|nGMԄ跡h^{PP6bejj*9)BɐAAي?dmmQ(DDD'Me[b߁C-\Hp2'iw@-;1)5K.gc]޽@n=Yb^k.0e} FP*픲O8wI:8v$c&LF&1iht+Li߶vvvd)Nˠ}*NUz(vb9 1 2R֤P>K(H ԥ6-s5Z넝-G|}ePUїۉjϟ6KM4Jr56s111'6'}hѦ#/(W~v9mNWMSQ&<^033Ą Rӑfff"C`cm̀~ɜ)0YwBpN. o߾Ө,XD066KDo߈B-hbl̤ c>jgzG/ SbggKxx+є#/{; #88w!^.ڲ>LlMMMEvrhz{dt҉ŋbee4u7oAzu~ Olڲgr~D_қQ_B><^p|KiI^K>!Gd@"'Naj`aa<Ϟ?g歌?y\z^M\;[>FuEABS]OZ6oJM,]YPnm(RUGeȾD |bEY+H<(CGϜ;OlY: TxZ֣? {{{`}cblAU`1L&"Q4MvI"rnٜfΙϗnܼ?{'y&BٲfLi\z0qhaڕ>. Cs|ѳV%iwmZ!r2XYY;yɴ?y Lgמ}4ʤHmFWnZAWd',%*O>w,7[AE;TCaT@'z> +M4N[Vz-;'˼pF\.gμE/Z^==;ޞ` k!jNF)W*;3$sL,:SΝ/w[_?IjUܱcQmzKEMy k}>K߁Վu҃eJhl^y[R(ϋ~:}+JHnTrB '66V䩎+s3_or9o޽ʊy\}.9s8K녽<-}2gr6M蘑m[#~NR%Kp}2:dPgƌr͡ad Bt#< i!$$T56V[|S˛?/]r*YρI.'2ZM'O7(DZ4H9-Q'9knܻׯ_{PN-,]A*pͭy+ؤWo޼U\.K?ltQEJe]Ha{&ƸvIԙ'Ocll(-눈H|fӓ/ozvLPP0O=zNTt4Ѿ3g}om$G.sAy]]166Mq7.kRPOȞIة}[6G8;dZo-F&p,6NΗ\x"ԩUCto]]N/>>3g y)1 wuµ7 s=}\k$_'޽{vl\kWٙzqJԤr ko<gLf<͛ C6ȟOg% ,Nļz:|HٲkW ie?~+JݻB0Ț%3='O2&_잜t acmMo[Cڶn눎\2p<Ύn;0&LFjUxkoyFbT%VǨT*XH6lf2N %e"@ QPnTTk7nqVT*e e®=|^朜z_d˚ws-'&E '[ddT([`Ɣ҄eTH$d˚1(6-ж5GJ(JիܾsS&-'jxAi+RH}BW`; Xb~r4>}{O_Z|`׶  N&,^O;-[4e,[NVys,ښ/_lmmXj-=um;FSɚ5 \Rm;vs>2ddbX; *U,1#XvHvmؾQeLo pe ,Wl*%JdМ{Iŋѯw.\؉Sț;'}g_dd2e,={;3NڊطW %!yoӚ[35)}%"Ӿm+]zMsԕkגu MN C{ޯ?;kJl1uyeݩC[\]]غ}'vҒ=WG^%=&]^T*brB ⒑ 2%gKr R~H$B}P11? LFUy-F䞉[?QxCuF*$,;[[>}̓ό.3d\.Ẍ1㱴RSgĐ-=vPݬ~477GTPh BPZJnSXzv"(( )/͛62=W&ɵk}kݒ|{CPPTI uҩ5̚>}ӽw-g+1*U|lRdJ)T㈈'q) -_R=,V"[|PPPZ%4ȯϻwwS/YdHِYӧPDҧ*ѵG>ª勿;uZr=:tuN=ufi !~Jşѡmk-cXDDP7fMut Iljܒ{鏳3nj0;8p0L9 W!:vdJ%ƌl%7n LRmgeܼu kVwQ}um` duߴ[:uLBMtlgȯDTq萡"h@r@O-c| M7b333c DEE1xH? qyܻρ>jŋy_9J%?MFV?gΡRnﺏ 6\r\ByHJn޺vmZ'((OfU]CBB9q*mtWo5oژO#MZJLnnt^[FiQ*\rSSS\$"""KD$mZ5g붝4GQ#3LÒ}៘2}>akkC ˸S~vR)'uE?r#bLD"sv,[Ύ]{د7M5LR$ևaTV?S&-+f_*I ?2S 2dgaZ?TY[a8:8p.RN,~NZp FT*}VXXXٳEDDD~6]"""""" #((;;j{߯B`;-̿^"44Ȩ(fɜE#22Odt>"?#I^߼~uI]Jd073I{$"9C$mIDDR߮h*pm"iN %"ֈEDDDDDDDDDDDDDDD~A^%"2E󉈈STҰ$" Nŕ>"""""""""""""""" GDDDDDDDDDDDDDDDDtN_Tqɝ;mlI}Yru=O+>r4ych IDAT6CP2c\cC:>}Luz\z]^&::7{SLj;wI{S^|Euzx*Uʒٻnw14;~>8yѻ_ZOdU|={WfRA_'z}L+^|QTZifVYһ"(i=FBR"i޺6mNg K<zi٦C@NDW!r]~Pݧ7n gy4mц4S9)bJ\t)Ior9gϟ䩀t.MDGǰvF߽J!'RiʪX1&;ATtt=W[0ωS8111[$%,=prtL G?Ig/^d(J>}f4o$""f$+_}.'3G6ƎNjUXtm` =tlߖ=})R ֮M+ƌϻh(X &ߘpZ4caɝp210v_Xi\BJ4mwqwϤv5""")^̛nBƌiZDbZ$P(!N$w./ $cFgʕ+Řwϟ?sM[\xժRiScGwD\.'4, WtQ'OHh(66XXX|=bcc޿'DoՅ~׳ED~Ud2io% g  ;Uʗ+˗mğR ʂ033{E kRXȏidPp0wc@Ve˔'<}槴~U~XXn!ȟ}z%Kfp/]+W`tڙ9s'pNĄu|pqvf-ٱǘ9{ b"?x;];Qd ͽoH߮V&m=lں[7 .سﰵH\G.)T # =v^`żz}ЧWw~Wh:tF5bQQ(YNNYhӪ%+U6c6A-S;NuDLL +Ws|=ҩ%i޺jT'**P*ٱc'N!^zD"%O\tօ=v}մ1;u歼}#Ԧu-T;y˖,$gF[?sfjoq9y4NNݓ6;q* n`s ۬YO`jjJ\^OlrZn޺MhXnԪYM`bb§OiԬ%.^¸ ?Gӡ i[vrqJ%ʕwO_,--^yBdd$Kҕ+|eJ_=زm|wQ6oЪ]Gʗ-Kn'LʇY8o6 İjzΜ=GhX.3Sm[Cg_} aZM4ҥJޅLƙs9tÉ#9Bg 1y ~V#-(_ ];aoop-dXdBVͩTQ~+V{%÷k']ξ+[ZS/eذi a˛8 +,]?zɖ[&o'NZ5psu14B";H=}ennn>3rN ۔,QqG^?ɟmZSBקΞlŬUˢs8{NG Q9y*׮cog_A&4et*~VPZթM<Ƈ* ]Ǯ-SzujStoZzzܻGZԭ탫6s Thcl۱J(F?3ppV.[B잂e;|Xlml>t&tɚKɖ5$WF˗Ytf@s^._y̙CP@/5\oJ>|ObGAmլ^O>p,r**ҫG7 23s*KuHʕ#9 |GCɛ'II^<{oJ+Y8-R^!033CR r0߼uPWIh嵱M-w"ɓ"5-t=1/_btl ׮cQ] SSST*G!8$]`mm;p0+.EP`ђ<}!NYVR;ݻu&KfnŘزa֠{Yf7oӵScbp8v ЗFRbyTȱ'9sgMҒyмic,]ApϔE"ӫ9lc5۵[[$ӖXiۺ%^9spiM̄(_~<`阘0wB=ub,/^MxxstFaEZŮ=UyVVoRzU<ݑ8@~Yj9oۚ/y1Kq}dVs,X_A2~gѹ c$ӪȖcIӹr:kܒoG*#FsZhW| '̘:Qt)4jz[h{V<}ơG8q2ʗ+˔t8u9ӓUcDD`gk+Pr`A|Uy_ΛT*%$$}`kkC.qvr|Qs`5i>}n͢s .1Bezp4i͙>k82j\\22l ,-,xDFE,߲9zڑ%Kf?ș3t_?{=zvM2͐٥RXȏvmZѫ{7t%::Sg8%Kf݀:>򥔮O ٕ-]^ݻ`֬Dj"Mr&(Y.^Jӗ[ȃҥԺJ"gԫCյɑ͍C#njԫCfrnצs?6ldԫC&y];۷qi,]NPd st0,۔Pߧ7tcٝ7o޲bjڴjqsCzXt Ӓ}4m7fffZNOjPhn >}dĩ̝aC*s۵3'q#ļ_ N"6xQ)R$N.L[G_K"y#Щ[^x M':y* )Y&=S&yeӖd˚9w2q{YI17e+ڥcƭ[kB cƲɚUsyѪ]GƴJDD$O<}F\^oӚ5p=:;U–m;8s֊IClٺ333O%n. 6WRll߉L&c?MO<6xE qּ|잞I.1RT2b`}0`\2f dwQCtԁg6 !]j+!)jժPt?ʩ3T\:hvbRBק,,,A-7dPȲnZԪֻ5WaΜ=i6On'O>Q֮嫨T nH)z@=?q ʗcȞ_8'&t`7Fϧ%a̛3CӬm1jOjpsukd`O.=[ឬPTth׆ҥJj\]\ #윯y% lR ר-)T*%O?J1|S9?҉+Wblmz:9wժy¸ь3Nz`jj~}.ӧ7]tq|)C勞,Y2k>GSꢽo.~is!yRϞ#˵D"|25a&ԳXy޽\.Nmdu܁koгO3ecZMMM:x z4kHkigϟGʕUZEK1fɢ{ޞ9rhčprrZtIN:]y=kmT*}6YY 6^j6mƣǏ5J/[z[[YaeeQdtS}6@.//VqeASk8y4.ȟP;,]nA gзw!#?xwJB.Y&c&(9992ux뮮.L0VpYrydϾX[[ST fb72/^дZUTq[8-gd˚Sg4Ä'!8;;kBB0k+ [,--Y+gdyt*J3͝ˋlYri>=L钚zdgk˝(W 7oݦ\ɮ]6lWf󛷁ZF!glZbz wX͍EK/捣=} \NibbB9rVCv^ow!SU_ O +_?;wQp!zFʕ?c,zwwXs"w\v̹ ?rFʦNsɘV-ѪE3sG=o-aiqe˔l|Y>rvSǧ'ZBԃ1d2^zMDuBz>[!^UTjU*3|X$ ˖,qʓ?_^й>}$gӒ=9 }P{\hooT*<M;j= ZZZRlvM:=ˑݓٳS3 )P|'GGGT*M,N|pjDTtC&1dH3d[NbaaΤ)3ɒhh*J:ƟUpȐA=2d'c"猹;KꌕzWtT4DFE%7^V2 K S89;%yG2gBڶnw"CϚ<1Jo(J(RmCޕ5lشe+,%۷լaj:;i̐#/9Uս111\r.zҎ>lPØaaaLHO:WΜ @reغ}'!:MАPAMBٿķq\߫W4tUTYF8::"{1ԩR 1ϔH$L22s|߲"EL%8~/Tл8>_ճNNܸyKOpr'qrTwN>}RzO( 4c`~0dJ2ߓOٳo?syVsǞy%X؏sf5auTXXDk/Tr `Au@];;;21e$r=}7o0i֬ADDwprrD"ٰY7{ubTP^+[w5oքzup a(:>5VN3g!ٳO;1Ϟ?4)D [t8u իVUfG|~ReJ3coWzvl߹S+W[+rhx c UTf!!ɵB iG/ 6cڻ>J/Ǝ-8{<P2Qۧ&kU+<~ tYIS&,,LSrI~x G1?~ |,Y0vr9wc53-,/ZZSBG\=K-}%>%Ǥc>-Xbe˔nZ.URg}JAv^YCRqm󘙙QZUA\^oϋ8rG$""eJ3~HJ*)^̹9ƭ͍u|[G.LDktḅ !@m/\\^9|*\LRFH=#d2697W^3dhΚK%011{NЌ82er{ٲe ؔ$7EGGseY_ǹt&ryKD>)95ތ2C}͛|Jy9 || G<ܸq… ΓxyԔ .kT*\2fZiw *)Gt% ˙:}ż2,9gV,[mZ1v>{;{+gN8}Vzs2 y/^hDbEy2eͪ5KY@3jg, ۻ z{W 5p,gPO=gݴ%3g!COȆ+iݲD\j9)Uc[jUlƄZR,]N\\OV fΙϗDxBBC .k8{DBܹ"!G J6d g TΖ9cnfƆM[(X fUWd7~s-dάs܅|v*:|~ R;w.r7oɑc'p:,gΞg1Pz5@ٲekܺ?!**ʨ.LЮ [6e1X[Y1m'R:@bޔ+SZɃѬ1d(Ν!#L2|yjf6 szc\~;wcn@]_|ũ3ʸ|*vƈ'Ĥ,g͙kGuΝ-ɟ/V&}߼^-_'Obæ-xJ7dɦ *WBPLMMTS'gƵUΞI)Rv 3;wGĤ,/^CQ*׬`ԪY`Ēe+̖yv25i䶨ض}'<}زQ#Rx$P^9s`aa'όzNrh֔N|jn޺|*6l yGP}4Օ9xȟzcggGOnH$ ~<>f߹OG&Bۺ Yw-uLӷ}=%bGAre\|oիUѬ+9 2fpŶ٧?ϟ_<ZsTqEf]+Wi׶=OsOofqpghLLLP)(J#usssOx'ftC'ԉ&Y'&سw?!!ۑ7wn|;[[ƍbeo77WZ4k‘ǵԪ{5w?yt؞re0l@6mʱ'qtpUfiB7O.,beeouk[ڄf>WF5U_ AŘ>e"֮gʴ7O|jy&0`0 %KOL3nd+J 4PYff5BڑZcYz-;vϸPǧ>ڶa=hN@R%wc:iB~9^KMz*,YNk-N gggfO’e+8e:+W];k bU,\BAYh{-]啓#ѣw?g%%Ĥ,߼M~vg''6mJpHvvKۥ3J"HP,-7eZP(Zo}iBu!.5-dHiբcO+yfJػ׮'_<:G9)JQǧw1#;nԙ42߮KOĄ r5Ԯ]NFmNvK"E֙q&cmc-R]Yn=s/h"˨ 8UDD$3̥NZ+SP6_ EJ.Z`ʣRP*` QPޯmHR_Zj ĎV11L1LFJݳP]#sss&#8x8fO7W4fgoO9~R… 1x`rȮO-r9[ddrse@Z'::D7iZ‚S'rZ6nʗ/xgwU$uH쪗^#?iM*埦'OmdXYY1n.O fɆ31CG"SL#""b4J 3dܸyDZk&)Ŧ-ضcom:[㷺iBXGH>%yN.mXqtxD@4 9+}~%\N`` ^^98p7n2k.wT*y1}Z6+"3SRbzEDD;(^̛\^99pȟ7}GRPAL&EOIe?z߼E.3cG ל$"""JٻskzCDɛ7VHb}zG3 ̌{{~pɘ͛Ҳ-"""""?d8vU_ckkNNl^&J6:<"""""""""iˇiӡs]]]<"`O>MIf͙IǺL"9{ڊvݳ;խZEH,nQwNd&,,,qqqfbbB&7*^>|\!a#""""""""( H83jH ÉsRazɍ ;зȏMZg:}~ bmeu*K \ӻ"""""""""鈉 =<һqpp0XDEg"|٠"""""""""""""""""?,Fd)%6]yżs$Ş+"""""""""""""aI%EzA/J_#""""""""""""""" ":}DDDDDDDDDDDDDDDD~AD/Oqd ΆXX 7 %}6wuc@hZܶ'N)7Rd!6eREFLtc@ |Hgci)>V?_L9dNh{q&F/?Es39J+}|H.q(\}QR4m#qlgʨ'?h)Ws%qR΅nj93^'K}q{,nJ6ZrۙXU Yss귁Nqf-~>tgG 2XX0lo~wQ^΄8++ATk˩G͕zof=sAMU܏0a++"뫟lk r:d}[zXdK+~f'""zL] 饯D;ߧ%1h<d碶=r(1Q15$3[*56 Z*yi¨Ǻ5 Hkz>ZzW1.Kcai3f.Kd$-J/B!/ZiWR߂BS[35n 5eA>+}uQnjxbDo2RH7FJUJALHq٣yi2Jl|4CY,wC`!m9iķUh s'3f4w"'Ev+/]q+%A2D9Yb<;5^XQNOFwDj'SbPYWt_Jg}"""Jvru ^Xs.̌cUϪLyZ)(jMIK$Εk(]w߫c2%6c̒w#Y,1|rILK)a03}`BH爢GI|o&:"B)ئ}S(j/\’VY/$V\IŔ:.2Vkϴ2QTE@UɑZAn3^h~ 1cRH, Kb`v+%{?O+/u_Kͷ(O!2)!2)OL Hv*T9u]d nWt_J1#=iMX^D07~uOؚh)#A暉mP(,baf\SՆyEamCr/v[>GzflohrZ+xeBIKX 15a{s.;'e`jHzݷW9SJF 6G,Nf*~1a++lMUtCnb,}mӯʸVԚEUFX:%LEs )p0U'L{>XP^,/Q4Kc!U#rqؙ7Ƅ o-I]*9ơB3~-cSf!o-9dN XJd\EB/&}c}vFu\dY(RHŔE+vrǒJARp3ֽ0$%CrFQ!N+;Q+JT(uGaa%ls1[cHWM*\ɠGfH^ Xjy\I1.]ҚTzdT&nJ X&P9G͓g Eb2a++]lgD0MzqNa"ZeIxZR^N1x.gRH1QacRzho`?F/eZA1xZ*(%7>S"LOyeBHqx3@K/z>%%2%ϵc 3ŒBIxT=< :{3kdRX]Yz\]JLukbԈy6T4⧖5F_ *lJkS*DI˻D$ N}\Mt 6 j iXTK7D}) $nhdq15XG'(1Kb 7.$Yh&JP){q\WC4+g}Wk S?謐$T4/?fv=t! ᭒y)PϔRvў!::ZU)SLjZ#QRS3 *^Z\2nfol ?F$Nū1LF~F:ro] !u}&q}U2S/y(Bj3Bt,Tw:s'QĥLp3Eɚ;?`x,8D񀷖ʞFf\)S*\t ұ>*v[&XT1Ѣ5slt2'X^9fnkxd:Ѕ [ޡ:'G%NfKjǔ3$%|TtOĩXX1~Eh1Hyںu^Qɒ<_귎bnf_y%LQb}-^i=><2.fr|sW{2N&Y27*[H^umEg#BO9ɝ<2}B<;0ʖ"oѲ<͖0Wj}}VTRwi(͊YO']瑆u t ұ$z+;Y]2fn=p?n(x9~/]qSȼoUw\ Ȍ/K̖!na;S8b-KOūPI!Pǎ.~P¢ˬԖ.6K%1HǶ.*4 K,FGՑ{jKݝW3K9)C~'vt #g;>F*zx;gӼV^L=?>T7d`G!T,LA''m|Tf]RJ&KM'8 RoYlH0*YsǕI۳Wt{d9/qZ^ڲp[zexWP*qWyf2.<)4&LWp[|*Z\f oVmDA3JzPYW4k2XOǫl-ud#VEB&:(jK)&f!.ΡE2 k]e].Ÿ;n&N.UWLFy5fO!(b,l9?~HMO%+jlqfJ.io`[8Iցci<42SQ⍑>j HD&x*e4V]W)JUdj גtS͜M)jA1*Vչt:%},u]ÄZ_oN[Jn+WL`=u} eT %pKu= l$Gϊw,=$ FZJYhXxŨWDBh탁?YDmnX3sp~IT!a1;3nw4n^>f@=GcԬH{ _-/[&X0dãXۈRT T ߉s~Ke&Ɛ 2sBb1u6ꚧcLMaNP`(abh T2>j ]<^MzMW\,!K'q4FͮnXDJm̂zٿe+HZTb%NJ xt2 ~"zYbdlip4R45PDV%ly__aݦOS+p ŝ:ӢQ\LTꎫA'=fn)ZRz:H0J԰ىc?d][I(gVCFfz.$*S[JU2i1HPpc0Ky䌆~FOAƲj̶']V㌏'-gdrI&%62&~ǼT21Y~R˄B(S;Gj(j-jљ%?3Dg& ϱ'Yh)ǽeqR@_iik`uj`6rDvR2ݘ-#͠L7htSdf5F4Jg'5=f+a]No!U޴FDDwt >R FzX2!4-g31@PL=Ʋ":/}G%f-J^FC%gѐTLA ´SgtXIl[jzdbPʘd g>xꮺf eNːg5m>ټc F ?쫖m;`{Hr[_ g9=2jEEgqf^># E]L-̌KO&ve= id"t=-ssNPOg6X >㢐c5\v[s/l y.AI-omU2=}: K)ᤁ ۋ.[{"ST{%Xh$ZTCd%F*{گV] gG*,ڴ5_>9;Rh1CYjN|T2zLOuwM5%x3L g+029*8L^NVb3|z*eJ{_ 2d k̸փ:r7(]UPNYW흙`Bu^ ?Fh:w{I_s1Xњ%%+|_L[IׁiBѷx[gH1IX5fЅ<|߅;Z/x0W#y9ho;AĬikO1dHje_)YZRusI7CݛP%Y dMw5eHOv6+;v.AZZ&L7RddғO 83w8Ϋse›n\LT2tNvH4IJQ`%:븘<<խX*dDH qF zfMj^F^ RީLKT%XGLSǞc*l1`:(Q ,Bݔ2T'$ghR@Y-',M-L@=U5;TGqF4 Qulj%E43QXlh5( tQDKMo#ض}yׅZFƇ'S҆- \*4u@|JH9,@cX 5dǗqVlBuo#CP+::.Bc#m ?R?xĶ. jE71!Pp{/dA]_ZfX\ҍ\2{W-#jWk ibV8}Vc9g OCj^FPԢ#4t)HGMod+t 1 x8ۣ,Gˀ$@p"4v[L_w_5UDlB3rob)L,BfUQ+aRPd)<o7LA_ JLJ3+\ugP1-*%h.Fɥ$%FDZ_1XVfU|șPHrwQZZ.&)iYXOzTļ%G%h{. 0#DǕ$eDD])<ɸ(dQ3;“Z*/{L5|\JRm]sf%'Odpc`Q-LD̽n嬬ǪC¾.<2e=LxqR^Kz Yİ4O+(x=}s:DE7I!F5h6zZћ%hV%7TL⊉5"4O]ٻl2#ve,[Q[q8zcѱn R%u^i{ez|T2wu ]w;[ 9ઔ^<¢W1`T_93/rF2_rczdIf%l,\Ҳ"$Q 2ORGCZiW-cնSU2cc{r+uڙOGH"Bbbnfgx'Oqd9$ֿAA#DGEO#/Iӎ,ȶ."uڪ |t=JI! t 1hi5Hox9:M@f:x ް_G/1@ xXZ)QjЛQ (H5_U)ރקpH@#̤Yzw Dh(ft顎 i>y!$lY#$mvzmxG >2LDf YW-ShԊ#ݗ_@ AnB@$%tˉ.E̒[Y5 2^׳zT jVp&O+$yMWI] ͬj}͊#ݗ_@ Any33 }aB]g$d+&(9;&},e;&?1Z͏qz%Y_u_~c@,1-B\, 9>M,prs@L A ZHl@xϕp!jA >@ @ 8]?uA @ t=Þ2QxzZN.P*,Τ&c߸Ukut̕8{nnn^v]:uDV(:ztʲ+ib\@s r=}z@T8O$1viK|=CP` _ _All;wP6ӓK/iV'&&Р^] 򳻶wl;wI0-[Zt%0/\x/ Z%5j 4yqA#F?$Iv3G,Z@}I K;i٢9J;v1~h /6||ϵ'&&'NfpEFj6ڿԖUE՘5Wgy2Or=^hޔАF#ocڮx2*Y3gh|f4 jʴDFE3t@ٸy M`K x :#̙?\JSN-7jO]l@WjKu6_~{7Xb,[hތۿĖۘ,R#9c:}!P?""믿oێ]ܾ˖,$22ubccqwwcxyzr]֭@Jv.,QL8?>ҕ\|r}V]Gx⶘'Ofi4nԐݻkjL0ɲş1q cL{=V,[BbE瞯kױ~f^|ߎ`bqF^` vFV^Km6dPi1DFERj\KW0b` _g@~)]N>Nip ^݋'&=/XѢ͋-_`9 LRNm޶.\ٖۋ}ʐ2i<+UdDDFң[W v0it85L#::6nŠkٽk۶'HXÆ "**k7wC,1V-]FǗӠ^]N>Ü c_|6l+V /]qpMnʔ*EuqwwI!_ysP*|`1LmSҨQ,0'z=;{L{Z5k0׉rܶO*V`Uf;@ rwXb_Zf̋;83k֬Q#}C>]QnF ̢j*J,tC Dꢫ3},L:+WѧWJ QD$._vX'nf)TZ63L?;vGWl /Z = 7ҹ5Hb0z[mVO̓_x>wϥKW ΰ߫}>7_WOclf' e DDFP0ݶm5,ը^}mN `˫Ml7/G[*/4c߁C6dx};066ş#02P/֨og€ùx2+ϑqeڴ~7|y(Λo 00/6%[d1fxxxe&[kd`ujcj*ۤ…|WdkŪ5TR.I@L&I IDAT2&44ĩɲm}zoo~6c쟯ظ86mJ]muЬJɒ\x7Je4_K ly;.͚5Cvϻrҹ-F m~8g?խý{ٰi Ə]aC2Ȟ#&&ƩrHD@ח {O6jU*ӵg_nܼIB@_I@P~EV3mOnj&5o:kgZ9iܐ=φM[ӫmnt:r3z0f;YA$K\ҹYCIR?Ǐ[W9~%)))ܾs'g`zr׳ӿ_oہ/36`uww慂Tɒp-Js9Y'&6MwwN{6/rv̘ (0AǛaC2uL^kZ6f0Ȳ^;$0 >繿ԮUvm]V]S_ǎ.->>ٝrb2_Yj 5I0b:ܞ!\/O ":wVƍ5|?[(A}gϘ:qޔ n[ؒ8dY'9׿/^^:vf7־?&&K@ /Q~D ٱ3c*p4ޮ,\|nϜW4}1G+pX~|gϡP(زu;zt sj]7nԐ7 Xg3}>p)Z-._aæ-|8woOJ/+>Qz!C)^ooYE7]fYP4v0+~~\~.-]^J-%(W,8Hreٷ իU%$d1D̐9cA]MY焅h$ R`x\?yooW_`'SxӥijKKK?h4:pli*OTt4&:7m?9a/V OOOBCB6s.>NjղII[6nڂ7^jE$≉U;2f.oX' y'Mi ~~~H1`;!Z!+,*dw?Y cqS%4^`1"26W(TVն5oG{l۱_뛩\ORevX:$m3#'z=;;Mg+7@ nuf쐓1UsqѠhlcP(v \<-gIRRmZ|* >n޺ErNgUfo^Vk7ΫX`1 09tڙ2GT0:sϗb!6/g{+Wr=811G *ǩg2*k6Xr {vc?vtprj4&5))v=<<6dÆ k|mKHXheǟi޴ }z]Le)X'n:o/5e[N  =_>ޖ:HXɊNJ;KgzRW^E$KN/("k uxyy2z( $Iy?__&k=ȓ|ّ_C!??-!.=!<ɶ-Vv~K^Zk؀…uN$hը*U :91))|)Gl\]NgW JNry .qf쐓1U211 ^a!Y㽽J]:͛8e:~2'-)u^'bŀleʔ/㩏lh56sXX(=KKIݗvE8Cy miI:u*+fqc7m`hxF9#/r.L-U$lΰ5.hZDg(cړr/{74~#gʡV[zהVł\ U9]IxZTʕ+Rtz; ;11ټDl'ܽw+W>߹skׯS>2??_yQfY+WcO`6mi?.(9>|P`ϫ@ 8 /аA=ʖ)Wqwsg㖯Q(vG;;Moh׶uԹY9kԀ]ҨaBv~>nϨ1hԠ%P(|~ݝn5kTgoiEBC>Μ9<2h@&NBxC~w5&IwIh0vKdd-n3ϗ7ztIj[Z~` { ٮm;t}6vAReG^EKpwBxzxpsܺu!,kT)J '))/T(l{"66C6O8Ï c1)~~8x//*e˔f߸~sYli3aْM[rZvmیGqҒC=`TZrzש3|`G7>>ՃW"""ժ"o毿2lUTaz("]mj ƬI!x,*JkHlj\2v7c%""#Yq3..$7c|dNn*9rf @dpf ,[|L{.^G,_͚<^+vvgy3}|^*7{PdI"#pGo/WT̘6o`),1 g[Og< յ2<},'Muw1J$xqLf3G~SFWmsJIx__~)TZcNDZL8([ ŋERH?nv D8+gn]314kք=uN5+UܻJIR3=1rB݈bɘL&jת(ys?dW|dY&8(:S6I/Xĵ7 wQ<Ղ>coo/WFqZ^xl( ׫cd`wyiJ*ow B8n$I;|~;w!2* oo/ʕ)d+Leﶗ'%gkco4unj=n"F}{wRZUWy.US'3l[vfL&ff3JgI~M4&*:VyTPQ#2ٙޓm$xO/ cnvڃ Ŋ:_W6K!??ʖ-(S:Gm@iղVAdT+gvo܈u_nIB .[iPX1&{q#x-3?A(@ gΎڵiVù<߸#ӜUXQ|ve_R\ Ǿř>gê5_uN -h Mʸ SX0oYωdYl6ۂ*e iٹAd#LE?vt9e[b4ټev%8(Gڝ"ܰA}~gۮ|^n,#I ˖/w3U7+{K/#?[vgLO sYy Q8phނƇs?l23eE dGsenpHJJkϾzwFK)² Z@xxxйcn}\MJ۬]ժVRf3/\6Yd''X\>X|@ <<Fooo&Mk;i像r-6iL ZFbZ&;֕;wa0==?gNz2M ]6?q9#;9 ӥ˙ @Ll@ I8}߯|B#w @ @ѣ{L ,@ @ y7ӻEA @ @ r>ϖ @ @ >@ @ AG @ ?0@ @ F@ @  O!#شek>H#<=r7:thǎN&f/十C,moܜm;0x(6} VSRXj w{>m: v 2cO884lߏ9[nE/\gꥎ4xھ܅7lt܍UkXVg3l*OzEK{%@ |SbquZlGI xZiOMqVA#(`Frc\q^*hQ|F puueמoϨC7ƽ5 Y=n"w>Id)_,~1b`BY3^?啒ŠUk{F~#0M5n"׮_Q>JḻYCCu֗>y6sΒg.66[Z^^ݻ?@ /r5VZ,-SgWT* Z SBl'9v²\v|>mZh*V(ۓ'R$,7/\̯`jʼ5reJtҝgd1֥3 C3m|s+ly_v}t|ԪiK,YHK3ù +ۓSByxV5+jYz @bb.Z‘ߎ@Bhؠ'ʹ:tFju|>Lf37nĄ1qs㢢Y ]p=.'Nb4U:ƌ%k{̜>?GW׷Ms'99Ŋѿ߫4mvMVr8vDPmK|k$<w]`ڵ5bh ?'Or vnߡ- h0!mQpg :_{>C1ahN<͌wgQt)ԯK&ӫ=|KHpkְݸy_C׳h2f1ׯߠuҥ#_)ٹu#J2GrfǂK9v$G #00=s޷iV^܉ukɄX @tL >o//n޺5kIIN]c i|cޝ6bp/^bܹ{ϖT6ֱ'85y"6.%˖S.,SfLLE6Mʆu /QplJ|]tb$_8%/@hh9v⤝ѧQt2cG2-=fGLvg,êZJv!-*5zkwwww7vw'؉b(8ppPã{3g֬Y{fM 4h=*;9u.޻O-׺ѡKLKre mې;!>u. DY0ٶiaVXG1VwV>3zDfΞ mBB3fe`>0((.=zcfjaCI40=;6).aؠ̘:ׯ3atLi޾}G%iuu#N`rFeȻsTalڲ W{( ,՝ gNys/VV䱰P)GS@~ @dW>+:wT;!<{{+\҄* @ ~^h ڵi+WSAںRg'ٿ{;hikI*]Tt IDAT0d8?sv-j)/_ѻ *g1پÓw?\z-["u>㆟~ȗRakW宫U߭r L gqг[gO@Gs}<~ IhWZ}n#ոQwk:)38;9Ez>.}85EMMMJӧP֭Z.MX>~ d>l@hӾ Qt 3=HF ZG kP5ӳy,,YSwlQk9cCE{pсAeyvK9yʋ}J{r[2,]Fr̜6IJ<7[NϗW%$$г[giS.8lcQ@+'6oAvJuPUDQk L M 44 6QQq6CQŵ l/W6ZHaW\t>7q[H22UqvwlشFKqZa yO ܀lrJ9ձ0?MMM#^rC@4l7Ϟ?()?ثjry,,ߧ'F ؏!Gӽw@]\IoђƱrX4%=k7l>9U``U0ǹ U~wWݠFҵƍڊ$88ЯwZG*Sm}"  ͒V |י])HPP0=xfyb,P >@ 4BB>fRieQҼHUN וLLc`lQXX;^pXp.NiǓ0+;1np(/[I[~f]I)Q Z'}aldݻY;w &>.X^~#H’ _^dLݻP!V/[V:_|6pCJ, F gU$yrVlI@@.|Gb6޻}==)T`7˕ΗRe߁C}Q'$KxD*[rȁ9e˔ > /~ [+ڣߣGϗWUvhǹgA֭;$=97 #c#޽w{Bz%s\E vR>XEU)]Dv>JA+q\XFOSOr(-m IAY8o}۶q&G Ç~r޾\o ȐҥJ࡟G3lApH&&|bæ-9{bcbZ!!e>2ʔ.ŀ)#9w"L0ݭ`cbbbRK fus8;UkVڳO.H$7555  V@ Ur(le."ET)uH~ܹ݇rk{m;vSǥ&# @][ '5TFGGiWtt4} Ȉzc':::8hrIV%AA䘙ty6V*YG%{vțR>D2&N4~$'#L!f7ma%ȟ=Qv4SVБc̘=]:aog!wg򴙲N6'W-mKtQjhhs/b^ f111Iղ6$00P}} ,ҺR5Ihki)݌0zP.>sbll,nd߁Clؼ##C7];ΧOP/K6O;=$Y)GJ?ACS۶55hoUGGmmm0uuu93^>+'J"e?IjA`֜\C]*;vr)Gޝ>8;s\F>/@\s͇*kkk}JGR#,#! AJR|#q^nJ])5.ןȕ~>DDDФQ_?vfGD% ?&*ꋂ~&[}^%1tGU yJ~ߣǼ~Y3\ff\KܵCc~<~w1fd+J;'OZ6;?x%@6۫U*;)nhPPlAAm"$ gAA*3UDxD4#XzR׏uuuZhN$W&_4FXZaѼيz)SyLLM8n4TX#"&Yڊ!˕{N 4$AR>̌xNyy3l4j(QPpBU=dD 8 0xv۰Lqr+chh@BB?+]A @ UtT߫+*㵱!77*nќg/^pV-_pXݻw:#Ɇ ~w $|בsO!HIkL=Fʔ.wݗ#"zܗmUqBtL c&LBGGZ5g8ɧyns޽[il*jcÀ~՛7S/_04x;Ci&ahhHbEu… *)3ХU}Ҿl˗CKKCGgJ~߿@2X+YœmPPAx R_*`/ϝ{ٳ5WV}R--kQQ_`/%쏵ͳ/ȭ9u H6ܾsܹ<\ܓ]2&&#,&&K}w<|(_UJ|mDE⺏Jk}䮛5i6.P04 bF>ZKS XP dDJOWҔ4+Uk| L Ǐ|20oުX1V.]$׳{&MDH&J5+#;ݻ6%uӳo߽gie8UPDqG]emhӺ?NOOO:.59r̝?44'\Vj޻ժ/o^>ʝ{E{~TVkk+9x(zzz,cDž;TcC4iZnf# ۋ~1lXAOO?}<\s>(X{ c mQ}ѡ]֮DTg*^`_<}ƿ[ʕzzg9'GˬգLRsӗ/_10ѿK*TakۚD~?444*-B>}܅$'M_<dJ\븤G9y=Ѧes,, Tv¥#?|ȜZřnɘْʲ}nʕ-C ,Z/_$ 3Q=w3x@_)NرkG{Pى7ogtSS6nɗגs>>{vm?z$c'N]n4jXsss9yw>HUGHjmnibEmȑ#SF.͇GM D@U ו 'c*9VDOOOД2^W⌽-#LKv-jǏCdI 2>f2pK~?g 4l2NIxlAR%Ӭ?!ΝJ'0{/ZJzcNpJG*Ƃ93Yx)-!&&reJ|woQ*G$@|oۚ 1x\бl߹[SlwhjhRXQ,#wбݿѫ P1fJ7 \3yLH2%ժ8cd$[9jfLȌx̙9"E ];cbl̮=ٻFFTNT\~uuuVvK?.6tGK2ew&:&1~H鸺: `Mڳ122Tn\={ad{ *R}{g?䌦c,^}Å3T}Xt9ΠxQOHn'6V~H|B<$ YYD})Ӊƥf Hz~ \e+,*(Lc 5]ݜM:`QL=?i. Ң_:n>2@Μ9(??G ˋ][ ̘={;[ '|~}WAiغC^SemlشpLMMprt;yL~Tv)ks WWw\tK;/#@ UtUu*H_W*R}zvcYG%}O*㵬 Xm;vynr6fϠπ?U++M'OOH5,!^$AHxA ٖ/u2S?۩.9I7}3|NVrZ|njŒΊJ̘=صmSvgE#G3elJ?Ob3eΊ@EՂMѥc,I4%W,m߃ko0xh<9%$$дy+:wh'gTw"u%w(n`obl xD@ @|d-}d[ã'Oy/&_)/s?gwvAAsٝ@qhO6?pX >{hP/s&@ UweFFL7'jL@ @ d%zt}6n'F !>@ @  &&%l@ @ kdxOxDd@ @:_"_٘Azٝ>@ @ @ @ !#@ @0@ @ %FbEfEwkC^R|sqqmHtt4QQQlܼ?de6ranM ϓqqm鳔޹[/V]/]/^>ɑZݥcfkM%i?񒍛R?Y ׆zZᷔ!ҕ8}NR˷2xkCx%yUvQYr55R3: kCܽYc݆M8Et mu"666s1Sf͙;rdѺ]GlSQy+Lq>{zڰ }|ѲM{4nFמ}p̲r G P B]]EqV޽:KKڑ.d=<<~4Ӟ 6nJ|||jyǻw~ul6&m._qwE㉙yZfCT#|Hm|РpB̦ 20?HV-0JdJvoj:į H}RƍF "M_&MUL7Z5XZ3a4.^L60vŊ0{N'!_L5뛙I |󿐧]֭^f]eSkX79aaa][~K3;?_fza87nW,_g ꊛ#"OyyMR%Iƿ[2fΆ *XzeJ~JppÇ^ׯ_8/'N<7%KԨZ}ecٱ"7x'OӶuT.\ժJ~߰i Em;zҩ5dӖm\c` wޓ~s!*Rӿ>u[ݻ`gkIٵgT@M:b4kWHB|MNL7^\~ClژV-K7}==F&=ya P)?7}oaV=~&Emз7 dɼx5n`^ʥ0Kޔ)S)'Nu[N92f֜| NZlٶJ/A(|b*\FLL KwnXYnב]9gnבǡ#LjQtډk}p[-SÇ`ld$f.]»040ޮzt}t0::ʆKs1\\к?t҉KT% dJ=N^KKzCE ?22nk|*SAocñ-_͚fɬq!W?2ϒY]waQQ_hO+A5Yߺ]Gխ×_9q$qTqv^D.=p@ 7lν{wKzp\c5ԪA(^,s],1q4^nNJ֮M[`anN:hݲ@2!t)QBWuʒe+h/r#ST*<}OUܻJƟ$0 ==_j۾ >v% ?ΰm5 ܾs(tݻt^f9X)")75v+0r`u.AA*Tӹ{OV޼y5ӾmI6d GZԨVϓp2 ͒w`&OGΩ(~di&y >kKd&Le] :5n1M;p׺Y4611Vspa/ؼu;q\r-AC]5kYMK@Z33S>{~F/7^ Xd! daWC---C7h& mmmͰQcظv_l%۷_;jJƠ IDAT$%lZc̜Jè@`b,ۖj:^/8:K[ٲm-Ere{5ӥA=W m9Vy.]s_.=vc6mϟٽ/\B(hI@PLC%ݺ} \jV- -唗w>u6uN6iD򅋗.vSvGD[&XHt%\x{v#ܽ c9lz\ލ\wosY|%6ms%Gne\E>b8CXria1.RwY)2c\Mϔ?*?Hrb0yny,,=r0S\]а+U:o9Φ-ۨhoGTF|wO9UwnmT !kT c{57bdlD?]ݜ}}޼y˦ۈ"WZ2PI ċ/գ+)̓3SSnL蓞,Y&NNٽ S>׮d̘:YBTIĘ2y Tvf)\6ɾUI?Xx)y--Y|eHqPWWG=ٗ3ea?J||;W..\,}]NZz[vd{ȓǂ}W!ȑ'FjU}.{`ݪ*TmH,rr˖x% )kccXXHڳ8ϙ!)WʖMNz+׮SJx]RS K?|oٺ*=!!x:-O]]]OTW/^q5dϪdD)\Hiܨ!'N&ԪQZ5'Oq$w|4_ժJGR#o^KuDNz:'<6szzԭ] \mz͚`㦭^G*iP r2L>PT)ꐐOlٺC2XY~`KW+-RI" ++"<{j="w3KV>}-{%G9_OX`o]=]ƌ(A^m̝%O%G޽{϶9L7FUla:`ddH^3~K޼\?0ϝ;zSho'U&=qrt`ؐ* YETTnѳ[i2)V3S3^y#0dkܖcfj:yHHå)3nd&C PK=K2,^1#Q4BY'}EGG+Z.Je'F{ZZ100S2ē2FԪQ&ƪK֙7|;`0yХSK(I#( gieC?s6H\y'rP\}(P@~ we^|IXXw?lI 8)Ά(QG}*W,ذi ? ((X}6>}jV&^fuXŗ/_$J >\eҔȑ:.>tVVi>opY6,P^g24xJ&V@_;wTpvrT*)z cStttݳڊz8;Qx1 gϝG[[ʉ;wKriUrt`ێ]LILL Ϟ?fˊ]j`ێ]=z$LږL}jgOCE4sRYZbR/]{rPE޽{X'Ɣ!%cfff~hcmŁC{Ott4Ϟ?ek֨`Q2EY؏U.+Տ%KIFd}J2SsmVmӊwr-a,7+uS%GBCdF:ٷu>TP ztK{x2|X,ٶ2U@*ūU O>}1 [}q޿@TT ^2A]*8DC)b&5ғ)+N6Rl!)R*D2$Qɱ"xQ_WH1W%!!Gt`AJo7}oaff&gQ'ؽ5Wc`>nزmrVe [=*ЭW_:"6e+VqQjլ΃ػ ^:{|޾{Ljaefט`z ~OpG )F: 4ݸ.jp7 ʑ#Nسo? Ͷ=)OPYԓ-88611ramCCZZȇ%Mjcd}Ffjjd>i[hhg܅rᱱ)?hь5C##zv9::L14 P&&O^utt&22HN{ """\im 8(XcM^fez} \rѺїPn"#?s1؅!M5Svi`9s*:UU:W*T/8;9Ju @}KR>J}@9`<71V|' I]]]aˉ:zbbbҔnN%G}/[mmmNyylQEof|eH]2AtLƞٷw6lcێ,[Fyҩ5kTK1=wfSLO+WF_,1j-Vd5&&)4T.ӧOߕqqqraQQU?ApPBsTKacmŕ׸rPOpaX˶ժE\ߧg%&T<-$w;TV .cblaC$1˞Cʔ.Eқl?y7o߱eJNJIIZm"AMMMՒvسc _ I ֡^:XX44Kјqp̔SOBBBvbhh怞GR9sRTʏT?GN>Úuki)r,%f,>j|}F p}&&`0L|WsgMW汰kA89SS<I!ڍa:ؘȜ6`μ,\Z5iZŋ)ܓthSx=G=Uڧ42B|rGdH]~zzzՃ>z3v&>[m8eV̐]VʫWK u_''N&""JL0G*;w+g_[caA4窲M[{xrpUPztuR}z9Km ۬ғ R$$$Y黊0>lYPGDFFr5\ŊUM‚WCFup IttSJ{ɥOYS^|ňY8o+xr“o 5}J,  KD<ܽ{R%e>VX˯h~d<2d|)\ .]۟{;͝+? K:- )jc O6j_ᶚ͞`1V,ӱ̜= %Ki/>7} lҀ^{mK\Yݥ$320ϝ-S|%XrFGGK/΍7yOOPSSzx99s3H)SMMM=~NW*+VE>{N p9455)h -_ޒOCRP!֡ M< 5kTI#y[Ϟ?gr7nM9XL455q8![" Ue ;{g<۷oɟ/|kkkSHa|}o˝Σ 1.ZwY)2c\Y3.9%)cbb8~'<{Di/Iu2<}G:sVvf >x"88CG~“+[SH]$wr۹0S$JKV&Tѥ*▹2ғY%+pU;w0mwĮBy<ׯѩ3"/^BiE󨩩ISӉRCjW< 4x1jP&LʰY4Ng66̟3S.{۰ÆH8X~k+9bccٲmKvX[H'ߊ % >IiՒS^gXv=7}oqV\aUT桟'16iٶc\e9ܽwJe޻=seu̮˴x:wOs"p2V]uk*ؖK,̿y'}ei/޿uٳ\Fa)]{Sil7oعk/U*;m262mV^Uk|*\e4UL<:̙+Wi6_6IR stgF-_Ŕ+WvH+.^BTTT}7mcccN9ҳTFFiՂ;wdJ\̘5eCx_c)31w:t稨T <]r ndJ[Sw֭8Y|…9ᩐ٧a5.RwY)2{\g]jsJ2S|ȊUk(TfUjeVl*bcc(U$ Β;V6-_=m ڊcFѧjUeY#LMMXxkoduD~)尶.fzL?+WXXӦU R >Ə%w2RFIL2$Dg|-[(ǥf V岩aff3Xj SgFG[gJMZVjfjʒp[+܈`kPVw)ɊTFxx߼Is%9|G':&|2b`Ɂdڹ#a͔(^e`nS&l#_0-K?!>xeaK~VMڷmCܹ& Nm)NZr08;UbԈl۾S116mVOlKQWnɎ>uKr CCl˗G[Kmdkܽwy FH$'320(ɟ2ʔ.ɉxX[3{@jYA,_YsSd ͤ)ҏ'..>ͰTWY1 Y3N̒sbέo'9ztS)#TL}::&Z>Ā~9q$&NAW7';[eֺe 2|qqqT}ʦ'Tѥ44<B IDAT4:MlR܅̓VE s%\EXX8h԰ܩlvLԘ6y"nahh@E%CuF WfΙOtt4իUoNS!RC*'vF=@hX湩ZGiL<#0th͟X<->QSy3gN8HXX8TvDC{Fٲe>t0VE Kqttt3skmdG2iKO jV!B_&NunTR,uڜŮ=ؿ{Xb&;wy4kW-H[2r8~}ҏ,M_ƌľ]̜3xFd6uSD|F?N1NpQdmب"( b?Zۻ6l ܹ{wy65m,&X ۹}.[#$>>ѪEΊ@ bWk+s‚C>{[Ɯ O==?xϟ?;W.mݒ[ Y SO~9wgvgC Я?ҿo/ *__@RGE&?Q @ sDW544ȗ7ovgCe3|4gvmV3' @ ;9 @ @ ddxK2{i@ @ N6A's"+}@ @ F@ @ CG @ a@ @ ?$K>l"Y)5tJOyr ŪwQU-]qRnl--*bdzTD$NL,@Rq%U[sΙ3̞={e 2wAݸM'OaZۚ)gzs>ur~/^fWHKvӘټzdI/^e JߨY+?%i TOvжcWLk[ג俳s.r؉9Y!tƋֶK,I˿A_֫iVj/O?~ &N~\ȴsr0E)5wvs: Ѻ]'\\e;U%,,FZjd2\?oy=^a%t: 0dxz=&OǦq 5lBunKgPSS []\yCeC\ O=NM%ŋahhs?B&wg/_Liq$Z~<|Ļ99RΓQhHrwD]k>RZZPD?DFFLLL ןPvO݄n;{W4Ob݆Mzm]߸۲hlrbh <{WadTE oP>|ݐ@92s ^QIH {v%TWޤτquLM la¹t1 `;\FTtKWy,*G")QvMXx8a)=ԤjxzNۻsfNd 1U]ÞTV5㎎&(( 32t*[l/ѦCZn3fO'(XU*-(Sc8D&'fO=)Zll,vҩC;Nږ,Y8D= Ц>`LJ(滖XEHvвE3F AzY5_$WfGj#GafbQ+{ٹ{йc;GÕ2#wfYxzysUԾzt5v"::̙cg޻?voTɴ \qSrRb】Q)NKvmLܹpۻՎLBҳ5UeB&N޾ʝ)rˈYs7uA]"S'MPQʊkp2qqTZQ(WpOvh޴ :CBb=iݮ[ !!K6a7Wj>|Fj̜6y8o .f&a/׏Sfpϋoߢhڪ-Fz Tʻv\ǵ7Of Ǝ)%͛=O/o_)K$*U,()mȧ˿~ͮ˗`iaFBBΛ6sÓ_C(Y8uְ5;v#;PLTƭ\p/ 5'u& UOXƉI:q1Եd`d^ѵ3͛4a=~Bzu;jqݾGtttP3M;R 6T7[6[,[7oR8n93vnR?pWttҵSWIO/6ow140MD>^qs,f*VZˋ/>ۧ/L8~^Z?#'&&rۗVXZ3g"?yJ U2z`=pޣq̘2MM ue+9x(wn e+y GUdyŊKs35xp miΤcM7}ضs7aaJ[*Cf V_N٥Zv!!i߾Eaۼ GPN׷n׉͛'IHL^]+Əvl/Atړ:-iӪV-,6p]ZhN(TqpUkhbۈ6ZPbH e^&G||<667z$Ze_2c'~Rڨ#`nf"ܣ~ΨlyiCe4iFݸIPP0 YS[0+&**]#8+e 'U{TTgZ|%ݻu`)ݹwHl6tt0+B{N%K2{T$&&.z2D3r]9~'N w\%<,Y8r ݶ+(W3h@?ƎIц7oѴq#-B|\<^0dvb`UK8dV-ѵ3qZدʕᤧ`yԫk%3Ltuuɛ'O<>yGy4111ԫkʥ)뎧7e˔mm嶏ptug`PC\̙1а0ok6opB"%0aϗ/^G!yzK̨}Uk040TI8L&}6iNMIO/6n°X}aWݐ|f8}'6s8::5nԐN[J(.<{K se ]ӣkgjլǏYmmmZlϹ6k.Z4~>zͮDFF2r&LƂEKq1L$/|fjL7*+)wҸQCLLjpr;d^ Q)Ҥwۻڲm| dil*t.ĜSq?؉S0קenՂŊ*-q;iVMMhݪuiЦ>=CG(W [y4!wyس>1yL.^+RV8ۥVjey,7Zݺ . vPbb"M˗ ۛbŊrؽ}0h~NlgC@Aׯhii1rPtuy-J߉3ϞӯwOʕ+çOSyīo1Z53k⤧>ҫ{W._*UR!T={^w=xLDF^x%t؞= d|ͮ Lll, LMxD'=8~'OQ|9G4 /_}.C QC؍iRiynݾ kV, dX.\L:پӍXw$o^ᕼnfӒ]rTeFu`:vk;k6{F6JTVn]: a8n3 *`Xؽmm-V,]$,'` K$H$PK3ԤyK>~̔~ c붝KmiNLL,]\OFz0ӧL$..ݳP.d2C B>9w"G܏sU3E&jBai)zܾ{ujsMZY 752뛫"K#sSr(aBrew6P^*WCձR?ȶaN^=*,eM-L"`>NC*RJn$߾{ظ8<$aei"Q(/IqiOF6nG8c ѽW#"WKanf;KzuJ4ms}==уw#..?nHVTC bX h˧XxAe6lrYʙ)PVvY~])]'.9ժ(Sh4mӯOOɭw8z /clpZAsԶNmKBBB9yʋNm/-[4cwYFTP`?3g~܃R`#ܧLR+7ƵHLL'+Z_k+d%)iBg-ZIOtUΎR%(,JRp-#_d]~CCDmKsNyHnq?Gy@Է(e29]_I|2td2d f&{DD.8ʣ܃dϫwZZZ Չ BC:!mCN"ս+7uXm/[6:$Mj2|$0(g xBXq $j!+C գ+xgm!Yy*966ƒ7OFpBhjj2m b2ԗ/ Дj;wnbcc$<<L?MeFյbǮ=04 i JucM}a!$442"ˌ@S8C7kBDd$uNѣC4oN ̓(ZZZ)ʡ6#Ȩ^>Աd @#Ig|򅿾[ՓҒyxx„0DbɉD"A[[P"#" '>>>]yU°m!5#J9uZi2z0$T.;| QUGs1l̖m;Xr ŋn@@ZL.|i(#2CG(+Wۮ攮dqqƟ@xxǣK.u쨨(yiNwKW|\t .ceip'Oٻ ʗc4mlKNKvАk*+Ùs7gɂSgQZUZF'O;V/_0ZډBIjS}:?)035 ~g9~!(\7E.9zҩCy9 Ne*8˛'O zf~ߕejhiiQJoLD"L3'N~#EQ MN>CCB|Zy/RF5rۇvmZs}aa9^(}…irσ*'vfO 9w7n1f[iҸ!Z4JSCCdxD8r+R%1i|&B;#::ɣK…XlqkuXzQR>4nԐ~}~jc{q#0cRNxdziu fcØzW, ^VU_z-\Sd IJ$9  >ٽT*Q)^nj( awUy=]]*/qa\jXH\l֬E&[D!c.LHTħOk7Q=LM"*:]/7" 4&VPSc޻O(U_OwO#>_LQ44rIRlYSBrJyե4m޷qQڴhɞ^H$/Y*/U*ͅK\~pjTϦ051܅Kl(S]r2CYEݣ%Kk4rGՒLw%߼vƭtOzH$Xu/o/jpHW^ ?y*YTL-?R ʕ-i%>~hhhPo ¸V ̘A0a.7"##y 4j E3ʞP^KI e`qTPI7d0YUʕ-v$&&|)FjJ-S7pjNeȌvAYeʌv5't}v.99cK>p];s~,KږJ9|>{μKhڪs/&~^֮\}зR`7mu;3' T+{g_P D"ͶRVS˓$<<\@?Sc>|HLLLoUsFe+-(-St9nSc ϨIԘ=} իVaѼ}^4d˗M i}oU- vn_rƝʖ@\v]!žT")O}zi:9sM6lKﲲ4˃8)?*׏!cǹ Y,t.]ǘzLis jձR 4c=;cPHکc"&Ƽxibbbp2;wA@ܻG ս+ 2c=v'=3>~gҍbhqVyҟ桝lcRJr߼ţO@q3vp%͚˝SIˈ"E 3t% bS11I]תײE3?xճ{b=38~3PJSg.hjJ?d=|;we^@o쒓ٲLgϟӡKt;.g3~gqm6Ljg?>ޭ3~#<{kRmn4 ""20/z wa](y׻'׳j/^܅ƸIS2҃ig\|9qe6mފtN@fmẉ[6Rf5\\3@~з(tl|wlxzV]yлg7np2޾~L5puCRx鏯Y=~—/)3ey1:tɷtf:ܸt*W^gUhkkSBtݯwOQQќ9wTcc&Ыߠt2]PFvY2]N]]K}NNfO>jFJam/SIe9Tzl2?{f*-9w"Ķ!bj7mngK:JSWWg xbZ7fWl|Ν[h~ӧd{LԱĸƱc\m`pVZ6DZ/O='22p#`C+Kk`l߹W~܃EK/W\,7ҥJ1~޼u: pv42r@IfUp2T*On=pm9w.}آ׏`BCCIC˛w-¥ g19+> ?+((pwZ5e?Sfh2VqF,^q=dwLXr)60}<4R*U@M `΂EjьVltut6yѰ5 پˍS& =U*M]Ys3S * 4ie5jjjXײlV2NlLjd0VubT(WsfwL}ϴXF?/ زiN7q=3ĤV 7oe9,_MZRp! ؟y2f$˗`ia!HR8ׯ!,Qsg**?o&4-zMS}q#Vvtٴȟ/֮d'̘MnMM֩(h>CC\Xe+א@Я77OKv YFXX߼A"I{P*U8x(GbE>eٮQ 2}i3WȖ(T +.d5ܽG~*)N% YaժV`|9ņ@w;wnJ*)SNmfϘ–;8qӋ}{H*7:Èa?a˛Eה? $*~޼'&j)nhѬ wcޢ%ѻG7LY~?ԭZ*}@sQ|9֬X"V5l@`P+V;2sVc8eB'Y2j}jv]jsjd/X ?'l[&gԈa)=RhբJD+STڶnETt43'66֌ \J:XqK/^B?ߟCZH$V,Y-ػ _'WH򥡪VZ6DZٝ EBB&L7Jai<pr.}Q@~Z^*lh6[X&OK(K3LkӢwd!BCBT"kW-S(k_h~pJ-[4#.>;w! .Ĕ>V${H>|(5$?MAoܺ6ؽGMDDDٺc'~yf^;زulSvbKDD$ǹu}zuȿD<|Lv2HJLM)_, agΞG(E&92 zd{V#H O=۫GN'MDDDtDD~DIoQ cG#w|BӧND""""Ot:r@W"-voߒ[Lz&۬S[ h8N5(.Y˻OBBRWD\lҴ݅ LqJMV+i^Ilo߾}0ۛ3}D'>LO^]]Ŋt2@__9sl---r:"""""""""""!M}DS9QyOxDd'""""""""""""""""""""""""""""""AD>td*ię>""""""""""""""""AS\VD æqs^gΝǦqsbccb|1+*sloZxqs_~e{Z'ُʮ)쒧1y-fΒ_fd9ЅGܳ$-zMy6ŵ!ҕxxJuNJwjzMz%i7諜BU]z5-jUmEde3o!_LڭwХ;qq uCBBhѦ}ǿEK3vN9eCtهvg;ҕ̜3zѼu;ۍ'}aaa,X:Ҽu;&MA@d2qO4iцNz|_K$gg6JD"WhnIWb.]&:::giɮX"gNzzyE+nIbbbřiy`ԤW8ybhhH"s EʑVuVN%+R&dvy;w)ĦpXn} o޼6a붝lf6BCܩ=#GQ@,Zʁ>k.W]gЀ~3/?o߾)~6lԘqcܡ=111H΢qmjըъljESSPVM6o\eTdʕqƍU7o4E:fϜ%񆅇3a -6!::5Nyò}")E*͸nGD{MM)eʔ׏=gI:];tDrUژβv<&&o)T jjjGPp0:hjjVZDrV}n||-*;wxrXC&Ɠ'Oy1OUxYc[]p0ٞ~Q>73}d-"nbۈ&aڷ7oq}ΚNmK *WD^8v܃N:ŒW7)HΓN . ??bDDD`b\mZ3vd\6èTI>~D}1m2>gvzӦ]:uq <]]_s5g>'&**]q~$!۶ $҃޼I7?}|ٹ{``OMٽA:yʋWbBo+ OZ/L;w9qғs/pljTp9,135fɲ<{re˪$?e c>zhSZ5Ə4CݰzO`Ӹ9];wd`^ē9"5+q=/)R0CXGFFy^%<<}2jt pQ',GEEӶcAڳMléSIHLC+0(>canJM073f{mi֤1 W9W~&lXӼi*ϼ--{lƙOHnF _eo.qOK` Px4UTNP<ǏNڥ+ \z]s}h\lyBCC1*UAa\p29u4mzuqٲ[+ QvB6nJ|hl0́? 3mW>IT<~?555Lk ad\zMpxnۻ'{{,$}"˕2bEgAf̞W:7l 4| ?H7gΝgzi Ks3nܺ)uk ˌvAeʌvgSgkR.ISV8t6Zq5̘=;w B 2y8Nzz1ul iܸ͛6hӫ=NrI؅q-7mUmK;uIO/܏ti#7mmC4!Uʞ\^-ٶe|f܅\Ȥ cNp'FJ?_>Xߛ`e]R%n޺'~2Rv;otshhhyT3^ݻQHa|0i 69; SV?Wҳ!Ғ> AK/ꏮ޽g]DEE [&1qtxIn](Sڈ_yY2y-cOzL?Fi{/x CMM-J5xTP8Ill,ժV~%KW).'ݐ9u({ IDATٹ{ m3t@Lk&*L&6M}{貅J+`l3jia.\ϋpf]UmKlݎQ)#u$c\&[`)\5NV"ܣD"A5%11) F_=q3/ϗ . ˕*Vfjtч PK9 !w̝=555?x )64~UбkO^~MwEMMߍy)Tpm'|V z崷/M 6h`MV-ӫoK szșsuK ɥ mm~ۻ'];w܌O>u.C&66S&䴏/'=yʖo4j UC100{ЯO/y~[w?g]E&Jm>444X`,X ?'MkXZY^pR%}dUdQp޸m@.[:i.[qXSJ>O|HB4~ l)Tt\"9O=Kr^)Q|45if˫oѽBUmT>IAI)\/;&xtu:4i3QSScú5)< 9… ѿoo*Vc.%KP+\_O(?`7U{GyQajl ŋgPx1bcc Ļc^&,,\v[15`8Qb>{`Ԭ2>~u<|DPP0tK⨟lmp\h@(Qx ϥ+W5g>s禑MƏEҥ}d26(W %O'O173QXhb\ ]9n,YIId7WEՁ3Nn@TL>z]bJ=z \ptAa)kjau9{U0jԨp_Pp0 '"":V̟3 SZ!>>.`ee)i`K==у? >>c!9QCCCCC6-SGԘŊeLll,/Iq*x})>LI-wuJ}jN?AvQE' .ė4A|ѭ =ux|𑨨(d2DDDͭw044TpƳ/w0~y5 ,mCAXYZ/!+We҄hkkaf͔J$::93 nѢE4t8gĶq<ٺ0+rL wO|&3=aaafMk|`nf^AsœѬmmB uܣ$맔~^_)͛F#8u\bX78uҩxg944 ?spQ!<>>Ro)O?:,}jQ$L nkw' حba+vwwbW5FǺG]zys̙ywy'66 115eX[/cBbc|n`PJ}˷DDD ׫>DFFvnr.^]B @ jwt+ RP+?i嗙mP`iiIΝUM7"22'Nk^LLLhӪJ}dϮRn?ɻwɟߖKWb_Pa Z1p~b`rLM@0[ʖmm  %22ԝw? </~166&{:FF{>]yI~#֮ۈӈaOVcan!J!!!O&#!!A)-:ZsAi+hVz]!n߹;wV5/_c)l'V>g%|9V+"*Arpp2FKKKՒ*V`\g=v<9mlhڤM7Z?+ڴW5f\r"Z 88X%=88X4;lKudNɒ%2T---Uߟ /a'sRZ MI A`|||Z.W 9,,t*Z4gϙ= Z4U66( `J,,<8Vȍ}bff6 ͧΰpRܗAz4oҘbŊsԊɹrCEMM7ݠBZDD$NSu\zٲ)K../^R}|dîPAhWKq5Fu/WDzo탷?h{ *Jnȏԫ[[EG8 !44T'?˔..ϜUXݠ+B3.3]B >ٻq붒'ԕkҢX)5000W?<A~$ Yɷo?y*qq̛3+U#y%w\ܾs__Z$[Z5!إ8TS^L5.]peoGٲmoHw@Z5ksG^c'4ߘ˄Sr:7oa;wsiFrؘÆ+Vؼe팾pN:#\KfLiKjjWhL1gqc'LB[G[̤b\%&&wL}1f=wϽ}񒤤$vHBB#Gss> s]nɮ=h߮M522]VXZ-[m;w  7n&::ڪw֭033ˢ%Fнkgv 5ܾs+׮6uC|{]KՖ)3?T9z{+Wc`` lN=u3\ro߾uΜSi fZf b.+UfRKNIfz?V@~|,[-ѵsTC }_^߽)SbtmyOazl܀4n b~C=&Nέw8r8kѠ~]3e---J/W~ڭY?/7NqFMs@9^ :q {\Ml O?kQBy.]ʫobBe6t3f0}{˕-aCؼuK\ٲ8Ɣ3EQbfӖm_LGEiҸ,ZNVOLƎvuԮ{`ܘQjOҹ#׬r XDbb"9Ҳ---ΚZ8J(Elʗ+ÐAY PخS'v?άݰ gW9}0Zn&"aaAe+f~FF̘: 5hӾ366tڙ3g+]׿Oo/gDGG3o,Vd>zP~*_`rWtY= e \tY]65rn^n ЗɰÐAh V,] Xz- KmZݥ$+RC+J؉?qظ8ɍh!n~| ߗ#Gy6+ʪKbZ0 +埔Hbb"U4Z[YOz++K>ʡ#Ȧm>4j(\L}Wc ;w܅ѳ{WzRpa 3l .+WNt׫Ù31zor1?1˕C'C__&J74iܐ=g ֥pHr2.'ijRGR%8{>AWWvv,;KZխM`Pk3J(HGf̚bb" ieV Z_eE+t;u:2K[YZr`ώ Iΰ!IkӬIt-71]-y K5q |6VRPvMn۩'+"">%5bKh; 2---̜ζ;9|SHXIRCF. d̸ $$$PRF: W-lܼ͚4RL&ci˸,[@X<-XLmZcad$wX[[ѯO/:wlt aZUREo%IG>ehK"xemN;weڷ %!!]{qE6񓦐3gNkXBBnҲySODFFҩ[/̜t3ܶ]<',[bCM餬? ƇKU/f퀏@ D@$~W?N9KҥdߏEΝ$+!!youD}^4wEBBBchhHvm#E%$$>zzz<{͡#LjҒݺУf7d mi9r`.CΝ8xqqqJ5iެ.W?zViӹqWx2Ξǔ'-ku՜;1МF8R8/!!!!!!!!!!~Qnc> |5bѓdcmrJMVB~WyVYMTt4~onf%$$$$$$$$$$+爒O513y!33tmVc=;ٳbHHHHHHHHHHH_#J!s%$$$$$$$$$$$$$$$$GRf6IHHHHHHHHHHHHHHHۻ$#yHHHHHHHHHHHHHHHH"}$$$$$$$$$$$$$$$$>HF ASB?))Ogj7hJ-ppŭ;wU8tNƪͧiv,XSeIɌn88<V@ͺ~}ػ Δ~ٽw.DL݆ }Ԩ+o҂qv&4kXnP5QI zJd(ϽrL.2i1b9~jϔ,XNAÄ xy)۷oL:M[QF].\^?ĩN*|VȞk%Mkmd?aL[Ԩ7o3% ׼npI%&&zZHMo/\%L5oS>$$*5r֝t[mLbbRUL>+Ce]DEGnf>~[ˑUsH IDAT!vjڴFϭbu׉Sճ@N9r]Pp0в]Gj7hJ9vTѨykԨ2 c94hҒ: <ƕJGz̝n (X ?ӧL`(ttqtvaÿxYwx?kwEB"S07E&۸nIRR.' ,YsquMJ9r]{oCbDs n޺͌iغiU*WҒyrgsoݹso,}FF ewEu3Uܺ.;0oLjմ0cXVC10Ȟ^y$%%)wҙ?Xʬ%:*=.Gj56J7frd9ڳO:׉Sz͋}z6{:ŋey9wAmm@GGGwc'Lƭ8ԉgg"##3$~tٞwjJ¥>zCգެicϚbTXty'accGg7l@l~wQ$$2-[o0F2G Qlʔ* @5iծ2BLL _lZZԮYCYFޕAL<v#ӓ 0KtRخj i$k+6ync9YrIll)a_[ԯ[=~sēտȈ=;<3-?kk+TpuiJ"~w1yg/_^s:b$[NS&+,תa/g_iJyx0t.W<|RvMʖ)Mێ]9t=wוHjXƒ6޻++Kv9{"{̐~9[7QQQ䷵e@ԫ[[&""~&aXXXPþƍQ-\͗/_(Y8'ZAy?SgءS{_hӡ 3N<|##CvH^=RSr[ƵXt9/_&o<8;9`_p]ll,KвySr1@EGcz.\LHh( a(ժV`\Qخ>4G᯶DAPP07oa%JΜy-mmJ/(*(\3c_iѴ1=]Y|%^7nG24"kڴL-'OH57ڙٳ@vp= %$$ТmڷmÐA2u ֬?**2c$BCØ;o!?Nyh֔HΞHBbOK,,qqr5]zl&m,_UEffܽ rIf۫ʪ -\Wɝ+,|39ֹ0PI7\ɲ4m܈[Rx Ԏ*-vUQ^Wγ`;>l^>E[s_L6W:}|q_SV cjC~>Y dϞF dL;~ U{ ͛33.pLLLܡ`PgEXX8U*UK*iϽ}?WQV0**.=RL)ΜjY?|Īks111Ǡ}_97- sQ@.}zvg9-F؈Y~l{= `߮mo+ ߼}r~xrХSa7c^vCxDժTK88fvO L{xr޿B 2n: q6~|e&M @>t»7lP숮nS!>~*V`ڤb3شu;>|$m[^hk7S̟f`[.m Ms 1ccfMʅAz=lgEYVF QoY .%7cЀjO LŘ;sF*|-SZ5>>#CC댍zL-\N]:*xիUҬ(Xoܔ>*U+WbC ?qqq̛-fʒR%s##"T3L!?~TmO2~4.'t$Vzp}cmeW??=Vv{\M]cͺL>M:DEGsE;ӿak];Ѻe u}cG96{wc̹ѶuTIJJbrN|yپsp>aƒc'N1b`lma.\Obb"ǎ՛7 ׇyp]\ٵm3ҭK'._YsܰĤ$rr 2%K(͚4"Osy΁;0AOO% ܐ˘9gR(2j ܺ!NڶYI޻bu0n6n!XYZRӾ:ǎR2ܸyZl&6ma`>Ʋb_۷Ьic:vhq8w  5ARϜci,7GA=UY⾂Yӧ!cЗܶ#ǰ6tuu9}7lf/VpܻOLL줤$,vgڔ ϗ:[7 ނb;8qZL<}@DWAҥsѧfF-cLKIbb"~TLGMl,Z2j$q|ISiצ%N#/a³4e[T˯ZgG{\ACYPSvj:.=Qi #abl̻ذٓha`itܑqQY\q3<ѳ[*V(sZ!mZi/tCG#)lG-iѴq3Qc  b֍y_ 5|InJ=4!LFFE1mxtttXv#QQ)UJ% vf6mٖ! 0GRHafMLhX֬?شmmmϽs>\_}zv'$4Uk͌!۷8;9ZȘ`p¸1ܻi3P0p2.sԪiϝ9wRbt@۫WQJerb:&: v؈#aeiɫׯ y7-C'<0kdʕ-v+4;V;VQ=;+Lgނ%̜6Ic;'%%6ΎÅ<1}vbb"#njWӋ"EjwqpE 1uR۠~Ϟ{cWBGܹR"n'~[lx*O=gJ>sOлG7ucbcR1rxϻy! fȟ1/_H9sӠIo%HNUȱBmZPy&*ܰz%rЀc'珵pӿq Ν@q>h,&ӬicԫӿsFPa"8|`:[h޴ AA>zG! rUr<!kW-i_?u;ӧLDKK'ЭW?6zn%&&??/Y x O\* vtړ .ө_BzbB"O;8 ruaKWXuf}8;+TCƆĩBЦu \'N%009,8z$ʗ#O!!lZ!ȴ6nf¸1o|yнRTIٷCOOyԪa/_Y3]F1Mu 9ʗEyBxd˞E砭Mx1g͂Lxx8+<֢}nXr0Pm:tԙsnٜg>+[]; JAOMnɴqc-Kdh}֮c*(RĎm;v+=SGWmi .MXX[$((k ߋm&бHJJbhga2} w=R!033%((X{XYZSZhkk4M)ldRFF,v_dILLG.tlժСKACCزuVkW#&&=E}wMȈ;ҵsG||_pIo̊Wm[J@[[]]n4kk+ d*Mzu/^~Î-)Z0E c^j֦or[ͧr͖m;ѓb"3$gN]qڵj~kP,Pz1h@?-ă)\(uϣddLкUsZ4o&8r8.]>7onZ־ZU fΝGn]8z$K)yJdێƲg*Le "3d$Ua6,Yz-VJy|LKIZm>2ex3Jiy65i$]U <>]{044`6^===fisl07{i2 ͗}}}=N¶ӫ@XXn#ի2ux@>VgN} Y4.UܨiaaQof5@bرJN̔Ύ7rV;'%%1l@m66k^7x1+Qj7 wMՙ2a~ W]̙|spqD1.'ShZӈan͗D|_t_t7󎘘,z+%g EK3c*ŋP'}i'^sqz" >GEGu;^W?OHP~+Z}adh}䷵M- PR_L OPcGa2=TNiWT;wy*wW1W?|_$..F ~&Czu8~vrP"D칋ܹs1сIJJbD * T%ӧϬݰ'O& 0Ąy , Lhg}T&PjereK+}Γ'~vrzFHH(^7n1UtB (1+ɕjU~???(U^GjܨKWM,gu,v]<|Mx-a%:ljU:W#[bcc ̔;Sj%SSJ,/[6XZ:ujQDqorE]!|$_axIǦĔW)aaa +#W/QS]?߷ClT\/ =8i ZlAL>ҥX{C̽{vSYW&#NpQ>~DtT4II1(M:=yBl\M7Pʻ}u2m~&`ld$,.oڼ9mT&Sv-,q[&cddkm[$K[CD ]]]W_|Q jjbBy)K{CPA ٽw??цMl޺+ȗ7CѨtJvEE@5""ň''LL:V+/_`@ ࡢRsHH(AA*ǿ&$&KzuXt9ٲgI#IXbccK?966\035erD__)g @hT,_+{+6.Ns8v4ztsѰ~=R4y ?'{X+Oss-KbY1r ֧wnXXX%]2@OOSߐr%._t]|B'xhޔH>v O&&&B0@1U]3!Ntu`7Onid@qdncRnm\F4]\9oM&qz#%?soF8z$n 3x@?*U, ?{9俗dRsssACBBKLa e3bcb$""D%LV F n]SѻGw-]6^@`}"9}( p2|dpBWv @}](A$%%R,S|N+TB}Amifp3/;~.:`nfƄqc e܄ɬYB k:wh]3JZmŊ X9C;YT)uy*;g@DbΚBB:9BSrXuoXXi\4'O/# XVmmm~JLq#"""hӪg+#]\R6Dߺsc9ʗjJ|ԩ]_s>.'P iS,@3o &OEޮeJ~:w5ɓ'gM``VV?&cB/ŖŊ|F˫ <<]]]X Kmըa_HnbɲX)ӥ;HHHlR?Y-)9w"M5[{R;<(8Xib,Ȣb`jR"]w!)){p).]LOM:v4ŊU2G{Mt IDATl;f?((X0y\O65\k}rmbbLRRQQHeɘ ZZZ*20r)Hػ ߼`,Z kW4I\f^ 6sfNi c\iղٳgn-ƚӏ%-$>>j:ƌȱC{UUyHpRzpb+9rB- #"01N]v E&ߖ C˴bDzz!<" *631~fRy?8:*.BBBqtvܜnU{b.VWyħOc/} ZU/]E޷?|@GGyrwPJV' OFOҹ~~w@k7 Sq֝T)R0#HLL^mm9b'gi2~-v` >~1/+}p rڤbEǽ{JJ| UK \zS'2ّ.W|yBG*+ ?SO(]_BZxDwOW%mm)_ Vx+%CPpadzzmŊ KV*̲UNZz==]%ܛYDd5ϻ|D^d\2Rۊ>E~O: hӾ NAW]]8u .Pd ޽@ƋҼOG]8zʄ'nypʗ-+&&&+ZGmOń0_^.srbL (lWHP1~<+Tc*+q}==]A]]] ,4fx\,-su.﫴uI V*Ǐd]Jޕ/_*ɲPvB pR^~XY/U^waϢ+o5<w/W===8{E )1.\ӋW΅??F=~u/% /Mcjgu鳫T@bI+S#GʐDGcqų|B rNe")okK<{㶈/G81hۺ%2ǏRJeV$ {Rr,: Ҿ]`43rq=~B jXYZpv[&};q.'LľGu51406_^nݾUkqqΣ. +)O_U*WࡣiՒ}"ߧWW?*U@RR޽ӿY薺LXI7\#hռm۴"_<<ƕ`nZfZfQvM2sqV^o߾q.016f7YsӠ~]}ܶn;<%_,,9y fRX?nK0ŕn]:WVZ#i:ٵjSbyOƀ(R0~]ڵեZ͓i3пo/,u7n cNc##)rR%K(Kț7&ƼxѪE3!ޙğAkڟ1(Bҥ0_V:m&L< ѮS7 h޴ ;+5e˔ĩ3| ]]-Š د Ÿ1Μ8yq``!hצOq8 s\݋(]mmm.tcLMM(Y8ݺt`BrX3,لo҄tWZ< @%:J*%7nؘsgdJ6mE\9׫ǒ$Kc,^xʖ.Ze < 2GPd2{"88p=])f`DiҸ}{`מ}5Y%ϕ+V`pWz0}ŊfP=#a XITXA)]r1bȗ7S'W 6{:n ry bZʬt_u:c2%Jef 鿟=_J''1M?. qu,[IXX89m M3z000 oܴmՒ.:(m `E;A~ĒW*ĤDI")4/_1~W.o2q TRױ4usg. ?ڊ=wAeFSs"Fk ֡u:z611i61w" SSS:o'lٲѽKg<֮WJdJwWx0iLSV F9*+f2oH"\9sQ0!ѡNܸu[T?UcF 嫘>ۍ2K2YIέ޵3^g,76_V,s`ZZb$$$62$-7ӧ̙0!ԮUKa' @KK"0eJ3ppFJEd2Q㞊3ّ7`1*g葸Nxorͱ̑[1U*W!͚4"00;w{*U,(ጟ4- kbd= };v!o܌6sYb)X ?Çbìݰ% ǁ߸y2J {w!: +V@v̜6[sY,,з7N3ߔhLte5 >8.+'3VMk}cҠ^]ƍqEZ1}v=;w#4, k+Ze21|h M+%aww+bݍ-%bM؁؉A7,ߏ%w<33s̙3&ak)ݗRl|I)I3R)[$yv d˖ױڎF6y]:>a'ɓ;# o*#XՐRaõ~L!1Ye/t;-uO >>&m;sZmw [͙T;s,Ci*s,^[W=ҎI:s8])w2i,\Oѩߤ?'s^8ٓ-Jص'K й;;Kr˜1ȎiRb<졸llbrkb֑?>/^Klٞ3瘚дI4э/_YR'߾r=l;Ьica(Łؿ09f5kPTI?E=Y/_پwz]{];Ki Lw0YZ(Ore9z0-)ɑ#! LrßƁ+g8} itl/ EOȿO =Y=1ɝ;ePi?Ll\@KE@_?qK @ ?+VsKq[OFI]>@ @ 1}{@ @ (O,h - zY]d;}@ @ BG @ /D}@ @ BG @ G[3STHV eChjwUZA"ɮ=KF3Y8}oV,8?]{gӖm71J2?|`EصgRr?]{rĩ )Kzp'\\awb(;Zw)I,攩!q[ȪclV`T2D\)geu1PU'I/z25Oeq˓ңwt˱_P!M-$7~Ty<7 9rBz!!!,_ѦCgfΙLy_WA2QHev(vG ɗ/o؉S4jXjUdjYEAW7{V?5P{ttt(UD[vG=H47=y-[ZduQ2cblͥEVYEb=C ߦ.;wG]ڵ,_tE0.$8PFup555͙VDq-\»>t0z=Ȥi3aknWHW=//W r%hgu1Q;2,z縸8R)iw}ϟ/J^LHh(c&LmDEEy5_aY]$ iа0 3HIX`n)d&?CSF3фG`b{s>Bv\n1ʑF +34mH!\MM-Iܟ{>=fyԭS ѧ`N9Gn]Og!Yf9tNFԱS֊bEWzqwbh`?ӳ{Wy:.@_OY3~ls{5Ga R<s>x&J`K)x=mc'zF͐TX93Ӝ`1޼fٲeKKGfMػߑ@ʖ)͔ r6111T(_(^KLL ڴfAܾs|J+0cdr䐧}Nnܼ/Pz5F/+WYxΧEמ}:c~d~Gw`2A\\;w͝ *H}hؠ^֨A}>—/_BbE}oD8{΅"`Ԙٹ &s,B[Kg(V;9sGR%1u2FFFЩ[O{L)_q3 -O̝RQQQ;ShLa-.EfɝK检Xn癷7:ԭmΨC144PZ&A{δh֔YsaH˜y1KE+[-[Y')1~VWٶY!l~ٱc'NrҥSGbS9~4>>ףjL2 :smգÆ 8ȧO>ӦUK%W]Xn#׬`߼e!tC%Jz.\zKQJetQ#hۺ<Љ#+yZ6o7ϗQ#bVwodמ--M ,CT" +ujגgt-۬t Z ){;rJy+M?aBBC^ ;uL5cN͉7j{]z@@` yrE&]aPTT;v+gN,Z4c@>։g&MAҥ;kR*/3"eʔV{ HR$d /_BMMMaP9)R07=o DU2b,3\𸈕ݺt¬f >z̪듍e Ç bܘQxy=d/VL>Ln߹9Y3NB[[O"4~Ξqc,w8пoo@:yfΡA4jPv&֮O>cI,Z0ux?.6֮glٸ YsrLc6r1=~ظn11./*St޼y˞}-Oz膆6je? a~~ SS9t3fϓOFCC6o` ̚1E@@ c'N؄F~CL9] BVkXˑ͚6&|qq{F^qb^ˌ];`l$[ٲݾc'N1_J/ Yd̕[y?'66ygGIW=炻֩% j'/xs> H% }/kЮ1u2޷АPʕ+R޲[Mp3gV1v;.6x  ĩ3\|U`(^Yӧ{-*(i$e'mcllL…pq;R)۵Qzsjߧv-3Zd6kG]C---2s<*V ::Z!NɣK6iFsqO,X@[KeVCnٵg{;ҽkgTl߁̎w ;cDFEqM$1 GhX?~ouNH[,[V-[0b``DDD0rPyR)6lfԈanM.O IDATnsv/TX cGSlYHR6lڊa,2RА_`2ڴnCH$<аjeÅ6x 笳3T[orU6o柎c^XFuYʘs :oM1R; 7|YsPz5?KJ~v;{1j0r4囯/?H)[/g% ;-ǸL?ḡ1rLMLy _}S,W$;w9ʍեYƴmJTiigetTy dڔhhha7Q/lRE^%CGya֌81g"LhNVNZSbά=6k;YѸaZR J1_ΜsYgvOiʂzu8W3>bmgO]bǮݿg)+dm`æ̜>%U$,砠 tu3b '22JR)3fݓŋ׏/^$['?|`YT\&q̞y?/&'7__Ò9W]f̞9zujj|zuڳ2ɵ7y-V[>:J/΀I'~iLM(+444hҨ!M5nT?y8:Qr%ڴjI}J5W_CㆊN{4nV+[F… %1ܸȖ-͛6aڔ(WI(Q'Occ'Ԧlҩn~B > K,r{abb,WD0U VXT4_7wU1USa}1>$eۢs٪#US U>w}M l5LbٽkckiР}._6u٣OIrܼscbbx ;)jڸ~\Aɺ@F!,,lBjVO7e綢)~h ZlAJS=kbcc jjjԭcY7L2${l~|7n@e*cN/_^|}1e0iWvɖ,Q'OK- +%$.~w\Tz@ڵEe]"a_ԡ=-ajj+Cu*ڳ2gȟ_)k)YB5ddGII=y1]Yq3ZaJtٳӦUKڴjǏ8ʑDZwńqc'F]]浨m^٢+E Mq2}X+ZD0[hQ@5= /1V*R/^*) SΜ/DFF"J%,,}}={=4SļxCGӸa&|޾{NJkhьEVBY G/5:NһgwgN:ușӔ 0sAdd>(z2aF^T*U`d>{vś444"I1eN.\y-d}e˖:9|[2'doSP)& 슈o޼U32J^944TtjbX}=Sg̦qcccd~+27WrBxll,ٳ+Nr$j3`##%Ohtj$THRHR}dD"!<>^^_ uP+$9ȾShhBXj2IU3gNzuryA@y}ٓ4iԐS{)ǥԩ]KC:BIuGpMUt oc dPWWOYC]=]]  ,dhjjR^]ZLvR(k%׶[oT*M\RRaI"44lA/_jc,Gsʆ3dЀ$7)>3.*BBB;zEl 2"p#"c m0nI2-zBUUQb #<<8 P}FXx8Qhkk-Qy!2*0"#PWW%_A$NpNLH6r]-5Ϲ~C*100gZ{zeZz׃ӺU?/fΑ\J>kLJ94j؀*mk8!yu+ Z%=tE=KH#HR544m܈{ü99ɴ[btȻw>k֮JoNf´s062b9c=& |C$F5}Br۽>A;Pq>  >G[[E s-k7nRzr al4קT8W9Ǝ֮ZEfYI~/&M+VZ*lZc#c֬ߘbzYIe0A ޽TtCz隇L`JbwTZ<%gΜ.TH/W '?dz-OT;G+ ._dJꦥE&Yr{wӬicN=G2}/x&(,_~QQQ|:|R#w\э… d)]?#o~~xRW—_$^ K(&^(69+-ʕ--; { SQdz7eIh}WɲepC{*RCMM q2/_&{l +/|… M%c/---J/ƥD+hjjR6MrTRY3r>ӧ5v""~,$žJzzz4mҘؿJ(&oh[R7o%?5&+V/mWW9eʔao~*Q8#%>>^~l763.*WʍrYRcaH.pfˆ)T+tهe+V+,ұ *+#[ U]K^(&&0j ōtY4k)eq-Gp:DagŖhۺR^v&Úu1ʑU˗w=Eڬҩe,Uv]r555JTNQQQ':AX^ ܹ{/մ՘9} ˗cY|Q ITT3#&6KFxZ5],NlpswGGG?V`A-<"G}@=pk>nݺ CW7wUWr>t0Oy3s<.]ʍ[;p}ٳrﯯO*ٳ|3WMv@H bg7z]{UMSu)T s/\qs`ddҠ ujSjϚܽwWac';vd[۴n=_$""yڳ[bbb>k.W]笳 Kl2:Mo^fN$> #N[?{|;voݞd0[#<<<0#PnQF9rзwOl챶[ܸӡ#[Mz΁ؼ͚[t*W׋*wr_' wYvyJ@@ {;38s΅r% W<.]z2~ @CEsl8u,wgɲGDX+?RS^fΙR KqQ~У{tt;q2.nܹ{CGq1˒zE:y2r||pصG9pS *2Iu(T +׬VKTK^*+be" q*vgJ[!H=ce*t:tO1h@?;eԨ^-zT+wOVvޛbXLL~e,U䓆.-ON:6k[6i$!NիUe^zMDDN奸W9UTfe f-:w'O  =o!XZf5>t0?y` ,93ώSO2572th ѵ +ʕԙ>sIL  gIIn?J@MMKnf/[}zkxN^MMg~8?)UJA5|qL:555խM^=8tJnrld*tSÔv@zȷ0>|ji}" 1t@N<î=-S֓;w.-^V+MVݠ4>x~MɅlp\KIo߷7r;ql::.\qQ;qSbhh@*U֒,Z4OXa3!!!эaCQ93Oa_Ȉ{ҿoo:%J,Ʉ%5|qq?ݻ IFٝǎ~bEv۬m %)ڴJrSό5RllРymJeʠ7iܨlcu/Wc-YxJy瘓/o^.6k;f]@…>e"SV07XMM J(eURjsK||2(GGH@@?j!_~㜋+*V@[[uٽa8>#00òm͚6re&!>zLB }J(DK{>kW-e*wPByx;wJJv||ZZZ)N"""\9sҧWͮCCC ˱nr}I|I4mm-]-RsgQJGVCXq !!RܜQ#ʟs,,o'6G@1ǻ~FR|;wT& ]);n3RmK @ @2s(wyǻO\\_~My$-tܹuY]mFI```ύ~9@ @ "3}AJcddՐYn3͞=!@ "KsD(@ @ Qy[{k@ @ .qK b@ @ _0@ @ @ @ _0@ @ dѧF@cV7nz*"fu!HށO>>Ydq:|wez)q=oQ{Ȗm6Wa2x Tw˘޼})ggHگ^ށx7oG3,遪t x}geC3+׮s$Y!r'ǫo0ۈWdHY *PUg\MgU}AI}69opr,MbʟXƬ!:tݙ2\v4l֒r5I=&msqMǬn#<MJ0w3#$>ŋCMM ȈHwL/c&.n|QY\I *Iw̹$u#H<^~NRii|$iJ]()oߦ>.nؽ?ajbBm<|t9/_֍߸W^3n(zt{IRܻSgp2֭FǑ9AzuSۜV9e˔V1>}>5Wc)V'0+kfVgzT.mf&^|E0Β:Tzp6l7 Ąu̙9mr8x $$Sʐ^BZu+~g\M̒]wAA)hA^й;m۴"**3gazL4AsӭW?׭CmW/ny!۶}͓G4^-h٢9۷\2*$o}-qꘓއGr0f [:28a}|T}i5&Oler=o LL i֤1g]|[7ʕG>aQ^ <} --M֭Z6dނ>JL2??&.;wc8q OmZm"&&V~J()x5ʵ  6mb݆,^0Wo߾ѿoor4%0(}?y¤W144` `9T\ ---2SSfL6;cvܣ ׬𡃙2q<1V)P ?1gq܇1[6aȱԫ[z`bb m8>ư)U.n̘=5+ҰA=yO>#66e```QI W^g%oۚqG3v$<SJefLD z͛QfuV^JFe堕vv[N=ȈH._Fw*-0r`BCCy+ʔ^%158n4 dL5SG)dbmx޹˄ɝ+'_}#Tq57ѽkg׫,Z"I&N?S KqAHydόKm|$eRV;:kNv׏i3bKnȟ//ԙsL1ccڵiEm)Tu4b`8ű sthߖF }iִ1QQQ<}#NPd :oK-6p)}6=I[WPm--Ҫe $ O>ISgk@pusg” _4WV>'#Wf]UX4v:$1040lwIdD3~4x(U_~dXHjUX8o^f(twXڣI՘4a,ŊQOm WΜޅ}z_;2+ ?ʢ9Ǝv-3+?Ӿ]kڴEsNi֞:k1o @MbbbٻߑۅT*eԭc𞱱\zp'9sҶuKڷm<ԫ[mmmԮywƍ uTT׀Z0A[x,lE00Z̙{S9l!ǀ{t1l-A0zsnܺEu?g4iԀzuj iUɽa6U, n]QBViY1.Sv٩.]qOUv)I/lg'ܹrѢYSN:-jiiQky[ OSl޶r4mܐ5' ߇}{qm?Ť10ЧA4m ͶjdhH-iۺ%~/8z$obUTVRJ٬BѡDx?:}d++ N#HgbfmaŒ¾XQ3h԰~"44 m@ v5+cI%7W>~ۙ2q~Ν+HWY0| FGȟ/o6(rfA 144`Bz>Yx>.ԼzıU/^w\kEceiɻټmb׶MXZX`jjJ.)PD.^a5DGGӿO/e?'-kd91c$aµYuW\\o /(2USti۷,"^|1T5kTvMزAAa ЏwҽW?ͣJ,kL,6r|JrJge- D 5\\ 3F2Rw.r)T/_@B#,,\0}q6^?1NUܹwW r1%K8O(p_X~#?!(8Dx}q.^ /#&&Vp*zcO&gԯSPHy$ ujK_LŦPAΞϞSUnkKy*ݹwU* >0o4Vԧ9r0lp0Ew+Vjʔt(3V$8|j׬ܱVVeixԨƹ^NpT$}1yx=Ȩ GSKS-=x^~M`<{+g9;.(8{EY<]ʫ,DŽ.]zžkru|=sB=ciL?$!%-2K `eiA@:Fb6lh` :..W_ӹC[5k(@.^2EYZfue*C٥$=lRr˗'Uڊ];ѽk'}rIf]Yri R[ݍns9?{i԰>:Ң}1c\|c'N1hHr=٬Bݺv,[WҕeTNv¸Y/- , b5_޼+ZϟӨatFWtg{G[EΞE~]Y+8;Z;G31cHHHHH 2* #CC{e/ٹ{<3fnLIuSK~{gXn.TP]z!VEn{wd=tbuavD"T.,grGGn횜=JnJc̙*+s^4jǂ)+3G17S>canoR֓ cc:::Ց_vD[A5ܱhhHc$d1aȥW|8l$&& ԟ #On`>|乯u*wב/_^YĔXZX >>،\α EMx~b+.R:K7Onbփ)P&-}bnf;Mg IDATǎ9̞ujҸaJ8W9철9uÆO_=( )lYfCCF Ĉx;ve/VTirFh2Gpz netPv)]?ODDFRfOݵ[=bccx ǎoMF hڨD"=qC:55bEU7٬Dݺ.S$ѓB162oѦUs|%44L?`blD"#762¾XQ8D"IEKWϪehX.3f͓32m&ذfLHJt O>"s>eWvd1y/_#U?~ȥW(̣OĦPA?kk+rH_ƍ~^Qhw:: +I).ɥ_}jꦫC5Yt!^Z~RK$&&!#F҅V- @zw88ث䩳ȑC!O:}GF9s{ΉSgG^CGA3ͅzW^n޺7f$ƌ64`%3֬ȷoL牞S&>z\gT\+WLnVCq{FtCFI֭~@Pޙo9wދ?~p-vJ}zF066܌S!Hܡ ;'Nq}N9ǴstY3/6n!66o4u'¬Stt4fjٌ56yvݸĩyț7z},7 }}L%|;J%w5ϓZթC[<|$._ȱL<%BmӥG;q[wc^v _.%Y]x-vRiϙ+pU?a݆ͼ{N<޳Ϟ :oçOYzQQ|V*lݾk2 [޽϶V(3SSwYl%nl߹Qc'ץSO^=yf[߸vЦet$@Z4cl۴reذy+~/)Ccbh۪Bn8sZ455Klٶp-.\Ĥ3T_7.^s_?ʔeyqZw+_{yc%`oR]:q Ν"&&WqLclO:w2-u.;UVSKm|NIVo,Y[B]I(zm;w3Ωcd\*8k78tukޝ]D:9CJSҥJ eeyH޼yoœc&pE.]fHOr岦Pr ɵ57P坝Rѥ<g L:=]]iؠQQL5 S$#CC&dQԬ^ K ͤcATtЎEKWPѥyrBH$IҲ ͛͢Yd )U5+d11l/_ɔ鳰/ZӦЭW,>aaaΦXz=KW&:: K ;K3xsgNcԬۈyrӭS<-w]^=1g>#F{L KՅA P̚>Ed=cfj8p(&&Ɣw*.zzzj醆cf̙Gxx]:NINV@|r[ҥ8q >F[KbEYh%5kլAPp0`Y.U#2fd'%%2-u.UvCβS6>+#t}.k+N;n2% P{^jTJ3uLgu뺜cvݏ=8>)Ƅ|`gkKXj AA*Uq#7GE8z\ MMM͛M[ٻ ASxqڵn M~n֤11L68#"emET`, NYji`$YҒ$IԫgH$\R@ٽw?Q;,Y, 坹uc'NML)*cOf߸՘3Sq˼ȟ!T?uhX1!eh#=}5hszؼu;wɣ]-_lپβ{&Q'<|s?-0MiF '3"L" 1s1}(?ߟCm}4Vٍ>Z l?yd=^׉ "Dt":}DDDDDDDDDDDDDDDD>""""""""""""""""dӧXѢ~Ɛ9pHH#"pmwFBBB: Z1pܽŒfd]1Ze1<|?~y111lٶ/_fhש+wH Nܽwޗk;6l +0xXEgΝO4lڂ[ӧ`VYGbb":3x3ۗ\e14n֊: Х{omLdd$_ӀOfwTK97%+&KF6c\ aAbԘ| ģN#>j lKm9~ Zh CACyULDFftZv[@"Beܼ})fЦ}g4iN8wK=[N͘->lgok?}̔i3hҼ 4ߠ<~$'qpw4j0-EDCVtaM:}ƍd9}{@DFDrqN̲ (P< )B.$%GOXvOf٘XlA%ȓ'w6JߧhLX{ñ'1l?OҔXXX7oomǮ=lشzukӦu x .ѵsGr Ң?iQsm݊SN-3nwҵsG}!emMn]-aa))u˙N>RcsQjT^V%"נA:8xh>JW{766ؘJn<}&rHLLD"d.򋸸8tu[4a>׭]ưaNkQN-?V\Řܙ HXb5їX5/'b\Y>{d{b/?wФX"5s-$0(Z5k}nBBB)n_Æ7oXf-%>>%JпO/l21y8.^O tfΞǞ[^߾G~,;re7j ɱ,c=GKyGy9l0ԖA ׇ if瞽سhVYϭ;w̔*0lT]ԭ]?8{Q:{dCSˣBS׮>lڲ^#GUL>eVN=K3s֮Çɝ~}zRѥBc9|8?2e=rHK^U*fF^|EERu144 _||52a'^/NL4]ri100XŒ5SSSbccٰi \#<<[BgrrvMeSC4mܐ0L+l@XpatuuYq37oT~}zfEp8xLUEơGٽw?89yiʧNݨ+{KdJtš#+hT"2]UZ&4,%>dd9s=PG1fiTpV78L|yCʕbbb`W\P<=e{ ST.\#עYzoҥSo (8e/o^ټu;g] 4,ӹcV' 1۷`mmxGV7N]U ~ϙɉSg8~AA̙/LŰ%Zl޿ 8z^~M…֖sR`A#"Q==amf8ughP.:&$Ե3!P6TR=kkW-'666v;}.m ,ululvRˣ\rDU̠}ə3'^c9Ԯ/K۳b"oTZE-]۸r!XYZRvMt꠴L>c/V<.GFPHؾy=G!!!xԨ&s}yBGGGp}ditrtOr KK ɳ4;pM7d1l۱^=ҽ9ӻF|;v+\#TrwcH.\9y5/_|򅍛bkS Re9n"U*ӮM+#"Xq3=RI$._ȟ2q4֭^A[ٱkM4Or-⥫Xԑ OXsӧnæ4iԀLKIRRAAG>ҵsGK||dzJ"E䁷?~ e9n߾s͛K;a2׬`³>J5Yp.i0rP}׏ni؈UoPƍE%Y ڶn9a;p1' /&ʺ˅]nf'ԙsϗM[033XP[@cӴ1n]PEz&#dDtiݲ9e˔K֬߈>-\7W~[U]gsbxȖkC*UrSYi/_2nѻg7>knbc-r,HJJ'c+4 IDATct;nAn]bӖrmG"0~aahiiqVbbcVn#khho߽_*Qc(lg8QDDF~&޽% Vi*XfZ4Byg=~uUzH$,^}{?_^;g{f7{:K`f*#>>羾4mP헔+VRޙ1#yko+/_Rܾ AWW'O1u,f;E%HXxƦrg%8$XvF9FN(lgyKL>iS&Cq{tttx gկ[ڵ<QNs5\*8M58}ILL܅ DXX8/fUزmÆ qC`/_zߋp(.9%աGu!vM4ﳵ)D]q=APvvrr|jJePޙwro 4qu`^aeJCbei縉t؁y7DB.Kܺ}{9j8v gkJ(ժ # ;;[ 4.Q!22]{F%77KhҸȱ*Y͛ ignݹG,?Gp2Ut_ع{/cF͝;2B?BCCʇV?_>LMf;ʖ.Evx6&ZZ嫡&))]fM*G`P^PP[M%wW*w&4$Te0MFȈ`tlVsP?~e:xsֆnl CCuz/cFR:{9j8wEթMLL >~LsUCzzZw߁C2mDf=3ß111};[@yU&#::---fYG eڙB(Z0x + ѥ[޽g:::̝5]Xڊc'p]\+ צvCMB(DxxNT)H$z&^=r n߽GXXXa$$$E>ҮMkLL+Ҳ3 AZϓƏ[5nd<3~=K][D O3_oOJNRT2W.kg~fme.qԁ=k# o2s.5b_~x3a\GACC@ \v 9$Dj/ZfMӯwOܽ124T( %[֞?Kb(\͠C򤯐A&ׯl޺ϞBRR |IB @(UF~X[w7q"OFׯW{bܾspԮ)wM!E O }&|3-cRu_ɓ p)|JLL VITtpDryy6 7+-hN͛G Xα,7o>վi骷ӱvJYI)E2Cz^\+oױ cbbع{/n$[ $&&*u93tq`ܘQn^yC||$ŊǏ8ΝVrPܞ]2->>74oD:ع{/~/^9Tٙꎅ [SnNOnlm OA-D‹Pҥ>s(7;pU0t;f[@5텆uN&[wMm8gUNv':}"~CurWX зwOrY[ˌY󈋓߯S z$oaff[9S>ԔTٸ̖;Xx%K86̦Iw̐H$DEE#Gʔ.ͮ=8st,Y?~J*%ܯղE3rZo+羾ԯ[~8ثvܽwy ӹc{2)q(nO5w>.f Bu }LjF+N0U]Rd@[$=6ZEWWW([U(g҈T<|Dtt4>߾2z!Rr6mن}8/.ꑔHBb"QQTeuV*¡ݗ-+s,[7o f?O8}f'Qc## ^l1MΫ= P׆n&:kí;w5bh u%)1Q11r Я7;pPHa+xTFm4?%2lգ nBBBfC"N21ypH()+h3P6Փ2S/͚-0 ^Xq3y^;W.fPiPB]n߹0×|\y 3SSƌ! ߾qWȪ`nf&u0(S$;&^ϙtݰ*#;%epp(%KJ,hL(??2˟Sf|fd,ҩ=ժVfɲߴ98 m'4,L1-430*H,9~ԑDBtw+!-̅mre*e)߈%s=6D•43"+ Pܞ=yvzJl0/hhhmTI444ygϞӵsG (!>{fZݢjuNTTt".]G7qϞ@lٸV.A]ue|]{ѦUKj`V07}XwR:}Uٙ ]e5"RQQťz\ZK Qԑ)iѬ)޽s$/IxxNԔ'(8Z?|GiҼ\w\vKʽcpm5m' ,(֗HC"Y^2OF9˗Wa%&6=F[` }h,YU/VVkӊ ʕk@?~)1i4s_?A²fu#R `{o̰|U宫 dWdRJ͋ ѩ>*:vBC f=Uu6!>7?ߟ?O)333E__+r/ƝHJJnʚ|)92^MMMq,[Ms}mO}NW^y#b|`H1%[Js=b} /QQ rTM [ڲ BGG;+8[6?{~rJHH ..^neABBwl8eΕ6eACGGKWQpaa]__v<|Ĥ$@ҥJ{~(lOr2jC~  _2QmXj9];wP]% 1f3mDg{&Ȱ!M0=w&ݧ)PV~t*BTw,TFfF[$=6ڍ[\^CCCCh:?U].u*W`YI3O?%Cv˘ Ogi59arylΛMr_q?Q]Ylo|ȟ/N?KɬwDFEWajbE100`ޕ_2k|^ݭ"ŊaڻM-McE__Upy61Y)gJn9zJnɝ칯\'2|4*bkk&'OA___vp*'_y<3ӧW_~Æ Jihhp4`Y8r8AABuڗ1۶fێ]Rޙ?qyoԐVMӸa} "3x qp(=yJkE9sDڶnIa;[%Z~^Us$IIDDDc.\D|:WL$uadd)g]-mm-S9GvWpwuCP4vdBCCYb{~ȏ{00P7(9Y:kˬ)S>:sN=YQ7Y ۷eͺ X ʕiOSmē'Oqww@_>pYJ:8ǝKd#,Q V]Oj٫hݢ9c 33Si҈M[!He<}+ʔ.ŁCGp*(8Cʔ*Ɋkɓ;܊!^Rhiib)lǍ#xD"j\~C@3=1*Y׏ACG ֭K'OʼZ~/^k>Z4k*k.-;SݱPiW5u) |DMkӊݺE[D] [JMBfM 7Q2_#w.Jѥnq,[)fҩC[  $EO[[1vdFzcXYZYN=fww}2jxigf!Kzvʣ'O侫抶\ 99sIJ.x]PJР[N[SSSʖ)͝;}.ǏQ^$KQ ,ޕ@ XZZp}!!S'g4iޚ\i߶5gΞO5449m*+׬cŪ$$SETrw̹*gm["88 Dж5)Uҁ/W(R0sgNS!=kӚ`FKbb"1d,9=ylݾ!Hȝ+n.BTu򦡡 ?: ?II-*v#(b{nED-*(v+ vwwv' R9z{Qkq̙9cB=~9'MW1ȝ؋+T@SCSiy!jr_3JSďKR߳='_H0MOHh(zRz1xƎkKB߷M䕦c3KWՍQByrGE?v4ɝDb%%D:q3%;߇5 crf'2ISgxNvϠk玘o7;w aϩgXaRcGĪ׀ *DYPJ*/ǵjڳfK3p'&O`rƌHqsX@Hh(o߽)CN pej֬!;^7Oͯ|vJQQQaԉ̛zO推ڝLY԰˗i%FJz3o ,[ή*Iw̨W6alٺ~P<aҔhҋ? xn];ߓ'iSV\`ő7OԫK֭ n#\7!DGGW8yZ2Ǧٻ];wDOW{n""")?-Er_-z}l*kC|n`:KsʵkXW]pQ!̘5GX"EX(I2$)mFivժ2͕ 7sQ ܱ=];w+O< 3B*%Me'E86i̧O>8jմv(T{vgV^Kl-cD|Vfv?"033q閩ɴp5בcX0of=o)nZr{d,Y[?22+WѭK 4n؀6oήX1e IDATIncAΓzfB˗*`)gs_~*7)$ݿCV$+}pm̛eJ<,[ZTqf/eC̙ . 9L$%&1fԈE (`<އ0gV 7H9M.L9\we,w>{Fm86mL~m۰oRd(<,"2* mVe@qUUUvmP"9LMhW JPbERۡ&ffLw-^H"?\C8c6Ǐ151Svtug%fՊ_"ON^SHjմI EEWW1n¢Z 7u@ ^>~HXxfD'~‰$1`>qmWU!ܻ@ ~1}w sZ9zt}677n_P@ @(ܽK G@ @  YQO-@ @ @"bK@ @  B#@ @D(}@ @ @ @ Tg m;tRyƌm&0i :cl;l+cl,|Vիl+35/]iPSgβ;`osӣπrcSTYM[P6mΧO\ޯh0b??:ILLĦkGu~5ȱTw ...AXx84KWK>8k㟭0y߇d۵^8W->Q ~W~5GY泊_zw/2:s1q55s;p0MM[2zaS݁dZnTT4ǦC9Mdd&OnCGjkp7^ƿg˶\VR#yb?ƲǗ/_(gΥ151!?%Kg fOca%t՟,,""[ѭKǟz@tut)biJidhH& YJ.l޲J+0j m[w>|ȶ 2/{;kc'x/GXL&iQ~ IN9|y,,?i7o>RR.Y5w 1ΞA?f޿g`|NlόUX|--QVBC077Re=uPӾEg vf̞}Y߳ss3ʖ)ӢT^nsǦ3116\2mE[[[Wtiʱ'iPtut?]_Az︙)6Uٲ}'nrP:@ ?fNS9u ~7kژqV:k#]UUU9the޻2xxx ׮`Ԫi@reiٺ=;wӹclGV:dw+~=~|ܾs,iצjINy+}ײw-ܱf7o1kW]Ȑݻfg&&zq9122]UF.̹,X7oPTI&g 彜Sk°!ח-M7Ç<|ĤDlɫׯ111Cr/;Y~#QQXW]VY뤩3x=5Wc歄S\ƌt`DDDҸ_ CѢU;MρCG|*Udx wAZz(-kXX88s̘R/xxrCˇ@*sehO6lJHh(&Ƅxr.]Jhhy,,hҸݻtBMM-6TTW!e[Xq311TB63ɅM|)ZĒׯТU;fNāCG8"m7];w: ]=]Lr:u֍k)\R\r+V|uu5J/XZm,?fÚҢ~Ӗmxzyg)y,,hߥ;˗c꤯n#FٸvrZeXf/^Ȉٽ _F3szx/ax̙Ie)7iX?ȵ7ա}t)˲~ˑc5v~{G',,SS5iL^ݙ>7ni\9ngђe؉6K̔ӹC;\BDDFJiϜc4jP)UD'+|9:r 555Z4k >kqWxz-+$$$b]".Cɟ/"w^b3d'vN6jBs}׮oW߿GWW%8n *Q P9r8,̐j[Eʣ:qDDDrq[6#\+GgTYeJjixNPnL!?=^|ŀΔ*U'(~*|R(_,w2 t.ݏBo,L,\g oD>U:d)~\bnfƤ c?x>|`т9?դɳ!IIIŇ(Xԇ)WT;wg3RVM)ޡ>ՒC~Ex Cafjw~\Ϟ`tl|?q +Q{;bjbLxD7nap79$d:6iIJ%'g+}ҹC;*Wݠ <ѡE@g'm[M {;.^3\w|BԘ>!.#ؾizYJ^2*/tyaCO'X>.=ܺ} б};6UZFL!! :m|׬@'6]%ubK`uiN19.---^|ERhM-MnܼŨ&>jӓh>{άiɃN2P1e?DFE彌Orb3d̚0A(u66f;Jʡ̨^7nԮUp:xzz<}|ϥ"y1Nt^f8t ԡ-ժr &On޹ <#;s5&LUUSLSs.<܍Uh45zއ`iY1n O/oFwٳ,Z=IcF1y8ujע^@RׯeNeܤ4wlӠ bJ_>|!sj/bΟCreeČx2&OUIII >{г[;в#w"0(XNw?8Y+[.KVzܹ@"Ezuk'vc]X+J4m CEӰaOis/# З;ȕF~162fԈhijv=gۦ˕!*:{Z)ꓕm 44ԙ7{ZL6KnWbЀ,Qh.^q*Ek5كGݣ#8q*飙-h_l߼7o2fDfΞ c0'xxsFTU7d2f̚A-b pR1g:k-~Q_#,Y]5[Ə@v'nC{c`[aSd̞;#, סqԭw]#)}UΜ,?ji}K,Ub+#I` VVEY~SJHH`ނEKi߶5A+Vpj;ԢesGlTC3uZhh{:?[4ZUvϟ|6l"!!ER hՎ}<>>w`hiiqn`Jede9)1)ǡ@>=;IsQ|9:o+b (Ek3s5z-vxk1q@9N``! 9{?_^ caF"з7Jif΃A->b իWcY8u0mr767Ndf^@~w_ ~r ASlR?x0mxJ(kv/]deǂEtl**ޝ;ȟOR@y۷!ci?yuSDغ}'::UPn E, MMWϵ7X黖_={B3LS7arv]HsCv7kPN> >scU(wQr4i} [TX.CWܹ&>U$+7nOLdu?yoߑOBbwi ޮ\ڠ7}VĘ+uݼ|؏$d$$$n)\*"44 J,!..G+[C*}*W˗wJSe5"ԦA**_f4h.^g͛O_˨^y!ʻ6_5Dٲ39u,^*V,ӼQZ̺߰  GWWWN3嫘d:kټ)Vbhjhgr r r&**tMgɓXᄱd,QgA8q =2ss3vo,?7u[{@R jڳv~ܹ)SA4ϤWQQA__а W'+LeaI/oBʘ[*yZZjPTn.0._(vu<5v$ ںR4E`e{ٰi+fl";x1LDZI#֯WZyP&̘=AWWE昋 }~ik(]EE,^| 29[R╤$?NXɪ5;!c`>ԯuf_>'7=~CS^v**ЮS4 |pcr)kwߣL&Dȭ&M__'b``&M<&&>}CJP *x5F{-qUE"i6._]2 |!QQoUU4u55u~5̘=z`]"ܾsf&?|\*".4L`CCÐdiCô zlܪ;22 H?vKj5Gn\f {6lBfMs$HM76J_TTud;~ʕ8u 8*CDT>IxzysiԮh46K3 Z|%{1gfc9!))IN,i, S>z'Nʥ'$&+Wr*x55437<)1iF|]OO!?@ 0c (HLJYONu=---455 2ej1Ry2?׉E۷ vvsid-6o}&11|ǏM^iii1s$86_߽WXp1n$+e)T O&!!k7ndG 116n`pȨtA?]];a?x[;a2%[\+=N:!Ǎ:7o*unJ鑮 C/y4o ʒ^FeɭfgރxzySގMnW5˾&\ܷIA{v:픔đc'2TrVtrK RtӡGiX=u}L-#~L2?*.Rcc#TTTߞ><?%RCF|9=)nU3sy ǖm;(Q܊UѸa9_AMqL!RC___:ÝN.̚&Ƚ2;)1 eU}}d>ӣCMCCS5m&_tt4i[w ƏL&޳cOApBVJ[rJp{[_ ˥4_G;^mOVTUUUɍw?tɗ/oL@ 'yX`4T2LΈ!..w̃:mͣ'OprɲŞRܠ&""!ή>cwYܼzx;uxzɁn?_^Oٲ߿d? +E#;xcc][bh54%mr eJg Ңww_?;*VCij/>/',\R8qRVP )\`?MMM455)VH #x}~9>LR@r{|˚_g:x{vmc :j,M[bż|Jʖ)۷}箔KWA+GCC{[FBb"r_ 9w\> pʖ)͙sTt4˗Lu.vQVM"'`'N?[ُ<)?y͛:?5,3gO>]噙k7n*}%[g|E|\*2vq444(Su(W4sgw?^Yr;A s UlX>$$Ҳ#/\b Tyރ; IDAT<߼I?t(s<C\|㨪RK dK#e+;0yX*+ˠ.<R)~&:|$ xsOIY/r`1 g)UUU ,H|y9sFFwܹQWWϒ:ujעNZ{{gs|U޽{'V`AjհT=zPSUCm rӭKG|V!6#vժ'N<zzT(_R\YdXp1>BG] f?9&ZetԞ]prqSvDFE{9eJ¾z43g%Ɉ8t3jmmTfݴhHyع;+崙DDD>sj*APݻvfR ׮sׯKRǡ&lcϾUʵkl۹+Ke ' >ƍ[Tƚs/;y3g0'uVKݻ,ǍWAׯe)9v\.M__ 2}u8thZQToRgLm,ڹݣr }i1v2*֕+2jzuU1޿n` n_ߩ*֕0;L8.}ydw2atJ(N<r`;qYvYƴlь)yaY,4cc5mIJJ"|\ﮝ:pzBv177#44KWb_uk;d_dݻL&OehgYs档Cٲ<} ;eT͜_ rvTӰtEѿo,sFvmx- ׉_.\MQն :::ʧ?bchh1֬#}zzTiWm>6kGN*>j̟3WΝ_FN,I.=1!D|w^NV,pW* u U*Wb /Zĩ3(aUS&ңݳffl޺-vPp!i"H +$4O/&NĄT"4k/儼l2q.1nxzyoP9sP){tWRo^&sv 2xx.b'Pl.^ mЯwO زm'w&wn}T֗xsMttiҨ!m[͑'24ƭ[LNdd:wvS,;a2hiQFu9 Ap1:Y_"8 bu҉P Fbb"Um6bcO+/6S|\Ujslshܰ>a۰M[c]"Ü1j9Ŝ2TTCX܇b]"#\6V_j[Ed'MCKSRJش111L1Mi[OWqcp6z061fM;JR-S:EU[Xۯe)bC? ~*Y5+QFu&O˪ػ FFޕ^=άaoW)1v$tuth߶Rr̞9zڹدUxblشȨ(LWQQ}unZiʉYJ!s۷m-,Rǡdɥ5))Di)Xh jj4i܀?[4cXb W͇061JJr MM .PLiqʖenv'.>1~(Q _I;gbl!έO%.y:͉SG,,\AuKWti}eʎ)hjj2w  ua ˖xK[d/onI dIE]L&ci=Gr޲m{KV\ $:k4f6n!"2s3SIT3 ._ixDZͪ<?$ҥ(hϤ3x==(߄$4tdr+Á=~ |/kֱnf-x -ZcEk@]\Q#\߳e+Vk>(gWrib)R^zL&eENQ'--[4K3+$Fl"=f;[_b8 HIB@ 6allD: TU1vөC7oJ*ɵ7]CG$%%|g mܼ];v s/ ϡ#Gp2zd5{O<,IcFv@ A@ 6J*Ɏ:;wgKGM n޺͖m;ff֙];+>Y ">[~3l`Xݵ#<"ujѲPSSy XZfִT\)[OHLd?\@ ?ޕV;u; ikk1mG wϘO}2@ @ A~ʖŭ~.#UӞV߃s/˛5k5VCBک6USԟ0Wn߹ $oѭe԰ñIcT^ll,[azc3DC86iD~5Szϲ%X.DddiiSVxKW5v\y4448g|>^%B:̎y%jjXXXPB9/kL9k}r'NfҔCSS3Gd?ȉMql8G/̙>!!̙5=Ex)'Ok玨8w""00 GVѠ^]|2kwQQ(n*VL.߉Xv/^ĄlA9OQ(._g4k:%EjUmY泊}ҼY.(hv0 ,?ҥJf?bޭ3$"y6|سysfb;e~b-SU.X+ʄqcW]?`/Ç ENjƟd[q3>VӸQڵmERR>tڙ\r+w  _Gm^F B\ <~kӹc{.V|נC̙s̘5(9eͦ[Yz-=uҲ0[uV._1;v!O2%Ouj?9-۲ rcWV:֤QC;6eh<,b# pYCԡ/ow5k0r0)~:~(Jj1o'gΞáV͜G 1r̚W11ϗWݨA}\FbN?IQM[es:o @ehש;vӧW|׬êXQ$7cbXn-[4C]]]َ,'d紥|׷w+~#tJCG'OJqb …<)fa݆MSDq\ %o>2K3_۷t҃ p .]lN8v$gyS 3T$SfMYP*WhDEE1w'A˛aN(Q\i9Aؤ}6oa |%KWpEc044 Æΰ:tN3&1) {j8 @XX8>Vs 173A:thVҶiS&r1Ξ.nlٶm;vOuؿ_CM]vUrCj``>BPQ<Ĝy 5} K䱰`@T?z]]*/HWIH^Z5ktJ@q7}!_|~&7;7b]IDzq'$$[eԈ'|VDFFbY}{ĺr%A|'HJJoۦ Pt)Z6wd?B062RX(Z ⢲b/_7a]FOO-ؾÏz2[R鷛M[M[ WWeFRwH?˟y &ƴW-ȑd11~j?RjUmضݏʔ.!ϟOÔ+[&-5d/_eaȨޥlrSݮJ@ p}x],e":tNuS$$&PC'W\8ugРIXRd <=ǜ,^ΣOߧj*3aZN:MXx8&&4lPn]:{O^zQ(^qcrb[O eJ"(@>~HoZlmp鲤yB*֕;wPe rl}"+WH~HsM /_QnmCBBGi+kV.@|>L4MMMf`,w-$70닶67ou$+.T*k~&gS[kjWGGGGҶM+bnnF 奴gϟvtH\|<˖0o'O>~:lތ-۶3a4֯^ZT\v}`bb̻}Ex{y„X~GDD~}{ˋ/Y~Ҽ䋼n7W;Ys!?``zk,\Hp5ƌ}u:kCdT+V'FtUn2 EKpBᷛqۋB =_+}װ~fZhF=lŢy,,062krJF-iѬ)4-5IIIP|j];3d`9|kӧWw#::׮st/nj'Oک#yg+zQ@~iؠ &>>!CS; Fu;c ̘Q#([4Z>$m`llDDd$[drqjƌ#,,ދ|/wlܞ8D|4XCC{2[ 9ٲ9vUmr:d_'+m=|O?zzmDS|9g銕hhӤQC ߷ VEbWmmmkg?yQSScEˤk7f_W~1&b]}{ $43f,"gҥ^CRR_ ϟ{ZBCCפR<Qf)cL3֬Z$SΜ;/}NQ,UX}jҨ 'W6{XNzuILLБcl(ɢ03K(zz Lsd|Ч`ݧtYSAiҸ!֖RJ…ݳ;ff4o֔Hb"rʈʕ*â%i[U+36UpOdh 3bk*ʗ++1ֹyQn2ݺHOݺtlڼ.+"2M[ѡ]q%))b)uƩ:Aifll,1lܼ줲m:uhQ?eJ¦ե_73KR2UիlشQ#Ky-,q4 ~+UL,> 0VP\Yt“O)\(ySUUEMMJj"M fL$N:]Cf} ^M6U  Б޿=XTT6ms1[*|kKJgAL>Q#cb6…r17l@ll,_Hc߭wbhh G)9)Bll,O>e@ xK㰶6cMYEүOOrgЀ?n]չ @Qd2zv*щ9sy6gLue)^)y,,' vRY؞(~<-aX3!MWXxs|׬@BC$ ˗/*XPRR;`LM,Je!59y>$Dݤq#Ep=J(΅azrY.$- ~.jս[7%9Qhv5WϓǂC?}~Xd2 |jԔҥKʙ?(Xs.Fͺr%Ը!yQn*VH oEwHHHEjj7;t/wHSnzi.#FIӹc{9ŗR4E;+}FӸJy UmpIVL=Uz[YaO>%**Z*W҄bIik߶uW+*Ueav.y3[x1ڶSۡfJ=حwnT2ٰa"#ȝ[ t17o\~56pazyvLIiK }}}X&+n7l@DD$2 'u|6rSr`Yk!Ʋp!/ _YEAzd2 7Έsko`ll,Iukioy)3ҰA=֖'L |e G,cԮE`= 7V,AK=..>'qqqܹ߷7ffhii2m;qqrysVSUʀߺ`hhOrJUT@N IDAT”(Q}QDq8D c!L")M=r*b~aæx-YJyգ2^~;p֥+GOO fR~4M B/o-^*/!!uTM,RRv`wvwww+ݢbbw]݊J | g;u}&1P7o?u<z+8DѶTq^mWF:wnɞ-̚K7e5jPx9ʎ155eBC Q3ed2ffO?Q08 yދ&SV :wl9::w> mH__Cr% 08,-,t&u+   [g;_??D_"Pt)KW2ml8D^=TʕzHs oꐟ MzJ7 00MwDmWH/9@ Y:&6ZHJ >9$BPf Qi̽ IǗq(\c a,44 }}}ŜU畫X|%t҉ n6i ҟ4qܹw5k]6DG]LMLQyΫWɛ_)laaΝ͚4bt҉k7n2vi$rJRdJq+mddA7oسs9R@$Rs[ݻvV=OeWHG|>>Ja7o%EחϞ+BCøs.%KKɤ[Q̙T*fj93YY%*?:dRϗ#mӔ|U;vP@~>|D\KjR\_ll,\HasAUD 8~V+9sH2Ԣzɜ)]:u w\Vli|JddT<|=1`Ȏ{JVCCCj׬SiִRWժpժV![֬=~'O)-1jժؐ7o$ GPvQl{Idϖǹw~A1~T͜C124ׯ\r#9S&򦣣CAG\9sp~~s[i_3ҵsGlAxD*'"2+W1vS¾}*i˶hDԤR"5lJ )ZFF/ p]LiOJɟ//aay% }{LAA\~8o3<ə#vN>LLL0773d41AWOB PlŹZ2g#M2@VtVܽ8oFFɟ3ݻtfނE*UB~{ם{;q*gQ7,cFw̚uRt)^x)O`J,A6ˡGh:-W̘@=edɜu(V|*t9th׆#G3mZlv@_C޻U+49A~fmulum464uڴ⫏konZF;p bhhm U*Pt)f̞Knɟ/~~<{>uLgI8/]D&+7Yӱ$?09ɰRngő5KT80U0}$:-wd͒Y3bm-(m_{v,cFr(&)]Zq}:|ņD"MEccc KKEq?r#Lj&G3Jq󁎎fevrSS ,dWL:CĘ< ؏fMc({֬߀p eJb^DžK(?&Onҳ2Xɐd$qth?ԮU\Vq-ˆC9{gQ7iA]ɔɊs;;w.aCsenI`P*TQ@~E:@kk5MShFWZ2]F56oN\\ʽe͊ì鸬^Ǥ3ΝcF2fd%?_}|۩Cz p-jԨQ@ sPQFh֤1_(j֨ݰ߭s:M[(RPkFA>u&;HpH3gqI)Jq51&3f$,,9V\\2 OƦdL=űuc߃ޏr@\\=p,tt~ O=Htt(YƌJt:i ҟ-_ S`PR$<˗ZEm3d5)GV<Ţ%N>ޢ(p1X&MoQA 8.\U;Х'mwSُfQ6aTf͚dz?{~lr]+w .=zӬI#wޢ.=&).)y]_2>a?Q@4~Sx ]Ҿmk<̋{6D{}w8u[@_N-@ "FFFmݒ6(Qfffx}歔.URHd<}Bidz __f @ 2Ԕ F+S縐^^ԮUfM8 Z&:wNvmR`ddH ]"ph߮4#%R s&+ڵi"@ Gn@ N<}Vk\Ulۻ@ @ Kק;uP{̙4@  x{@𻑤@ @ Jui{?@ @ q@}J@ @ @ @ N@ @ @ @ IOe"Y bZ\vCgyRj-Z׍|NK1dܼ}緿7д~~Yx} M{/ƌ&i~󖵮djůߤOYW8q4t֛.k[ %^yKŪx8 Mڜ:j9Ʀj{?i'MK6ΟCi9j7*PBSD[lWͿҹ{olסaI a,6lFz=Tߐ7iAŪxK.ɘ0{Pn#7iPQPyG Hc#c͋YƧO,GWO|ybh!E~Ja.E bh{Øy-7o`8\&5d˚=zSTIw Sx5;l$CRn)1s<ҴQ\6@E2qҀR\rhJ,H;[ ȯӲmG6nDXX'O%Vclۑ-M :ko…ϟPL)fL"͕qe>yԄJ+0rPLMM)gy2at.{ph^t06*(?y]]]5iD,l=<}e]x)Ԭ^d(o$HYu҉b?fׯ[5yd˚&лG7,^ʙs)͛4f@IO fOѢ;kZWu/ѡMEEX̙ț'\MYdݺv"v1c@LLf ~5Zm*g9q ˖[T{dK3l ƍL@Lmp GǦROTʝ{#o񒃇=8q4ԬQe;)R;9~ov@.DH7nܺMddd2F@L̩JXa!!(VLwd2F7oߧ9s3؏ώ-e]p?raC;w.;șs?mGP`fOBpH+WlX48o>~i cѮM+r\TR1#Xԙ{v+/WGt <_}4ufzu۲rL kX=ܹs)=}U*(>k]7m ݻt\2Ii*zt팾>׺~ovmׯL: 0kdmHz| АÆ`jb{FpEd=/_ѷW ׯ><{"2yދGRlifN^DFE1e` JaOzvµ7UCTt4!ص,fM_Cntlܴ c?ʕ*3-7i4nXC=8sSN.k(QN(lר^U񻅅9ƎbԪQ5+0z즈SbyڵiKș#8ѥS{[]$ٰ"1{Tv2p>>dΜ/s6[ExreiѦ#;vQ 챣@'C9: HW6wgǮܲy7aO͜|hm2iڲo޾%_--H$d,\-,,Ȗ-ⷭwK_'ʖ)Mv8v-5Qmؠ.۶RJ{PJר^vs'ڵ!zzz)7 ={0h@_zu @U+6)9}i IDAT7{FeBC9~܏K *Ƞ}iҨ/(]$];wTHI'ߜWKXZZe sfNeZWΞ;X)Տ|]Y ;vaddEH̙@)}D:**V(Ξߏ/ܹw3/CشyzT|yZņ(ֹѲySزm'ztv~. CCCRRX֕*+1m@޿cغ]yǐZF.^!#\~++K5iDfM5$$..C+گ퐁;p+׮ѤQC^zE\\cG+ժTVG1~H*6ص'[:pݸZ5+ƀ*6؉&cN|m k,kӊ#ǎ+m;wcaa"GE622T|EքOѲyS7kH޷MMMU9uE"b6Eum;bꕊ~ЖJIUc煋+>y{s(G@e̙9UOAc&m0mre^~öM*XB оKB}QWҠ~]ԯ/Gqn[QlZhF:RWtIʔ.:}#0dֹsӲyS7mЦ93l kq8ƴs022iFj4QSk~'A_BO 5vFvfɂ`22~8Mb`>̑]MIYdfp+؈˜+ܽwQRE7ڍjL8?/wd2xI"ʦ+8\ݰ!)ع{/N+;cc/!MZfqR%QQQyի)תQ=K*{sȎ /_ѢYdW6 e <S'%RvC016!XZZ0tK/K&Iy(??yF, J*(rƣꆷ*6ښY(>ֹ"((Xv}ۏivT݀!sm*W$ɘєŊsʕKgrM.Ԩۈj~Qԯ[[)A<R0<ֹ9|.^BmX~eKbfWSvr@pܹwo\xֹs)> .o޺j>/_MuR6Mx)ժTVZr_RELMLRtm9B#lvOYР^DzvKu H$ԭSS*9T*F5y{h6P[*+AAܿhZ|Uh^~֯KLL O>S /_~4k՞g097C H'R% /'%_[7'Oɕ읐/_ԶtttTɽ[:Q$VRB1tJȑMiժVV4Rpw+@rY֦ؑqQ~pjT'ůʒZbЕg=ؾ-xN`Ӡ ԞձM?~J9\r*tRYLlY`1[Wj0CZh+طs+kVgǮ=4mՎ=JC"Pj}ݓnө[of:(Sk'Qr/ߙ m!xVEzD&-V>3#((Xqͭ[wde AZ56ir),{/`1Jyذq3YfQF n ΢x7)C*f5Wcݴl4!K~,=<K ^~15U>T__ R}y9}F~: ttVUA>{cbc1̠|r6r f32bPe͊SgNQn??,ۗ̕9qqq* ` 5!**а0} %..N+N6iDhXm62f4} '? @xjk);((@Rbe2Ey(ۄ}JEUت$9! $4o3Yѫ+@a~. e߁C}ypYWxoʫ77,cieѻ;^K y QI$D1K$ &,4o߈ъH$)tF9X`7oa Ql&7$WJVNLKT'Vh6$տcn~ ~x6neɕ3C ~26r팋`,U˙YRkWdȐ===}'[(aaɤ*Ouڳ:IñNS}D%$66oB #&&SSt5| %4, W8$Exx\0$ K4i?hbgi Jh+ɑ|(,f`>/WSSS=~,<CPHZ{Ҳy-|̟3)3fʾ%SVM<} ھkKW8"~|D;J43e"ZFu˺ n,Y0wfM iq6N]?fd_KK ttt R LHRbcc¾W;9S`._-plܴ (:֟%73^=/^œS')_}?ԔҥJ2_D4Yx%>|yBoI( 0}?0Js}?wMd% ;s|SqY9+m‚G$  Tl P&d˖ &v']!!ߔ ϟ Wu$ LLM!%Khv&C… KE;os(θn?0˘1 XjdImэ-s ya,Q͚Р^]c۠:%O&/!՗ii^yǑc=~oߨ^ ϡjeW^o<|o߾db6 {֝d˖͛Ҫy_˦N-Y脄[h(QQQџ9u, ףo1&\ffjmJ]:ͻw؍ZMUJ|]]=rN)vLtt4G'zWAT҅IKxZ\'uh}T*%_<\|E)¥˿^̙x"vbLML(\ G`+f4ky &̘=f%̙X (^_}&BCqFiJxD&J^.irhd+GddEJ2gΔ?<&:h^~)S@>~9 *֭nR}}5A0ub(8o,[xx_tZYdWX[Ntx\<Ŋ>(|||U+/DFF& ,>Uz;Db\zMi[ 2J%2oTɿ%\YXDevd_rH$խũ8u,2dZKD__gϟ'<ֹJ)] }}}9=z,J)X ?ϞS ?s}}}S0{gȠ<|^ѩ[onIXX"nLpI~cc#5GڵT󣧧ԖxJC:Jȟ[ēSh\ 0bPd2^lsZ,θn?X</_Ur,XmԱYFumذօyY漒-0u2:i c/V^^) ᅆyՖQTt4{WAtޛҭK'ys^Z0jDnϦ۩\"a*ZlW8_Hm3wffX{vпO_H^6ujQD?]tYiۙH$8FMLM?:fML%1?%ßD":wnrx)7P^o~̘:?YJjy19g}V>w8y.kyk]7rZgԪ'O9rs=pH4̣O1zgyrVMw `҄12z%N4֬ۀ/S'S'rM=Ə?z% fj-Rqqg=3lht%trH y-N%22Wm. s;Gy9qqqօؘXǑcܼu'N1{#g='f"066b݆MDDD[tHteh<\v[ws°0C6Y[t*SgGI~Kٳ1d`<ay2cοK2MML(_ nOLk:8.Z 5x^;X^T(x5@5Ν'y".^f X#h֯WB9;vq-zg媵^+1œV-EQܶ˩{tLtT4vy"܏0el+Pm跗^Ѿsd')O<ܵO̒n];7+W[h(/_frDCl޺u K6 [{yeNjը=̌zr5N]t*/_a(?,#zteӖm,Z8sΓi3{9qSgR|3@5y,[q6ϒoK"uov?©g K'S6ǜn;؉Sv&=fJǃ=h߹ߓY5ppn7~ 8addDI6n؏OϾ ָN?ѭ3R 1ݸɶپsڲcmW,QscF'V[8֩AۤfjXͬ9ߟs+T/G_B[j9{wnoRc,X(̘C5bƗlپG0x@_gTX>>au ^GҚT@I Ա4O3KWwA:alUTPS+غc8۫WBre0y:[ڍ9%cLɃHχs6p5EwT䀊'""3<9si%lݱGYԉмicl*UvKreůd*^3g=2-8zM[ӫ ׎ Zޕ^x;ٹg˕a-&OO4Nre0~8kֹ2obʗ+Q#3~rRV,[ĪL送TJѢiִ1BC=ϑ͚PccNȱԫ] K+Klɴ_ J/Fn]XJɖ5 q=I5:::,]8+X촜J(4ZBe f̙G;{} {N Att4=OaiipY畫 ʒ R@!`l8^d͖>=~R!จc'O_*+1|`R) 00ܹ7gҍPaU-՞>eХGLMM޵XW%0M96yBۏ~ibG:.bXXXЧWwz׸_K$.ٽw?~dhJ"Eҩ"p[bce >>={mfLVVZe]<}PzUF ؈׆~ 彗DSy<=f-uȚ% gl۱K~ɐAɐdlȗgɒ_} пo/2gĮ=ؽw?yX+nA yff{}1)ʕYFDžЫ{W DU5}27mXXӯwOVYHB)< {t]cIbe4lP=c/?/\b BBaeeIV-_38&եInٜc5M ԫR̘3%1n=&O]sgX괒Qc'ښiS&2nFF/_T9vOQPA/]خͩ[.2dô5.,-q]U,^Xs^ɒ+JĮ0̐-Ӻe?fS :D"a٢u\D]Ș1#۶h/GY2g~mlr]\)1riӇoI2a[uQD?iقf̞KTTukbh{lU ?? Ill,6+0~H[ype:CpHY2g-R a;bCFvsȸ$>L2,N^%3޹M100`%s& K.z(3{~ŶbE0kƇ Җnh$U`P?%m:޾{/Mm[ٺcO%TwZĀԡ]znh6mc'ٹuЇdn? X0wvzn<|cF ߊf7j,9gcQ,#BҲmGZlNީ7K,!5?GσؽaaadΜ>ӧgM ㋞.J`e_Fmb4P_E*q8{C޼ypt쑿`-XLPp0FTVÇ*~H$9 vRj}$WwsTcFũ 9z#Or69z$T߀6v=[6 @ :s(whk{􉍍GGE/W{Y-Or6; n sT(@ sD%W-Xk|5dz_+۴CCn@ /?h~/@ @ G>BôO @ ]&!b@ @ _p@ @ @ @ _p@ @ ӧP lFjLxx8l/j?#&LJ˶hҢ5 aT>ӽw?6lׇ~{=lKS0 IDATW ߸ykeCd4Rs~W;H-/^næDEE|`R' BFͰ9&Q{Pa$5V)lkGӖmй;(O̘@˶hڲ-Cѣ4˧@s>dϞMg#شeޟ?3؏Oxx$C1iX+ 8[x9y^HwشeowJy?"BRxq\Vcy]q&h̑ ssvܽŊP tyjH+;'MZ\?9s)VgL}ּ~6tڷkÅy+E&l?ors=[uҿvP";w9g.9gg ݃2a4bbb>y{3l(|J>6R%hW'ǝ{(W/ѭK'm$>>,u^NJ3k::::Ԩ^" `Rʕ+Cƍ;s<Rϙs-MTM+>U*0{T)%{efi!Jbbb $sLہgH BC016`֌ZK;22XX(1F59f󧵍*7o&)cG٣C iݪEq3YYQl`YR@ ?B*iJ5S& 3f3RFuG[",-ycaaNƍѭOb'֭^eμzܹ;z$r`x^1=wI* mƋ/ӣ`6k܊;Q֯Ǟ{_m*wA(^(F 'ggw܍DZcddD0v4fff^=~SҪes3M`XZZҴIC֮ar/^zz=Tj@6 SSSEܸz:ޟ`jbBre2?&&&8QQQ\3g=եazdɜI-wG+wEҥ*+1_ ueO~lSaSb`Pŕk׉M%شe;^>G9<sNn |<֌6D2J'O}n=ʙ:SZU }zz*䶡C<쁷g(Sƌ@Jll,nrȝ+'=wfjSG @f\q\'ɱ4""׍p`f`/WVG;Kԯ[_HLl,jTg`2dȐMoo-]4xVn{ {gUU5VJn^ NTD U.q?p/\^g-Ή3gf>{ #|4oD]А{.{t aa53iJ'?}̄)/W~؞NU<}(_ -O*$887o1a2ZZZHҟ.HΒ˻j3t@lu~g_{sg Tʢ044`5Ls=;ٿgRK)\%KOwLMM k+޽ $R'Okڒ+W3LKKHh(&;4 4k8N-zL.Y8o6C ͻw8N%w[A>0?q ((8Ы@&Nׯ=*dxm8$ѵGpOJ}.eJBGGGH̙˳h;NQQ5(3fall̜Yi٢)-!>>^.OUR|9&ͼ3k q zZ.Ya5̫3wtF:|ٺ}mV̛=%J0w"_S9 c9{hlgKTżrDEG,ՅlLN8n _~KR)f˛];3LJ(b;q ===vΚKykm2RʲjzXnnȢsؾ'O'Jq>]]ΛM] C3vT̬dנ >z}#[MG?Idd$߳e7U*WLigdu5 }t֓Brf{Lm$''3}a B7q A53#%AFFȟ?{P@>(('VCCF Шaqu̓SZUZ6oFuKʔ*)oJ5Bhu?r8,?G0iiibZ>]WVMBBCp:_HKxD{ OHOq] ۛ]; vُU]#39;pm--nbz'ƧZL`{" ӧϨX|F/"""""˅^WO3c鵀ܽw+RZU@}8y"B|y:xy2rϚK=)T`cT*e@>Xԩ-˛Ç k0GOO 6 ^WsC-^ U ߼e4ZaqwG[rի1kT/[[T"3I` o׆Cp&w`OOw)2n&;LlY2/^;W+&( ʌAA24D.]JX.fר!W#V ~ʥ6d<{\NM[hQ.T`EEGk&B'E >*YϞӼiJ.gٶT(_.2&#UðmP_0JvܹsӲy3Z6oƇƱ'q޹qcF bx\<+w~D|D6/GCCquBBCccc0W5D(YD6#ij[j^~MBB @#lܴ8e1E\ƑYb)_~eɲ .gΞǗ.?<000P:k("""""'RDq R ,-jc#jWO ssR)_T)Vy_t̹ |/HRA__;wajj*gQċ9r$ 3nȿyjȥ?|e+Va `מ̘5IVƚPf >}́CGD[.6f|U/_ ƭDEEaiQ@f7COhhR4qm%řI50D0HLLM՟ǜЬ=118{<А[ҿooA؊!&:,}Mt,Jg JJҍ߽ dtl֧[N&,!MT:zDDDh.;6))hbbbHJJMF"feBX8o6b9hjjRƚ# 2 ܹ͝s+"c֬;Я7%KGWWc'Nq 6)7S%SIj/=ocR)19TcNʕVU6DDDy&&ƴiՒOk~Nv~0)YdD$aa4kNda"}@at#s'L555þ3+ N1(Z*;p(/RGTF٬uؾ_a ,HfMX8o6?|W<̖;kiAfMS[if7axxzq͝wTÆ ζO Rcbj"Ԅ 5p=͚?%K@]]O?P[2mTPM-[nI1dW<UҒ=DV-s1p۲Óo k:ۆiZ~ oްi nŢN-H$@KKҥJ{GϥhjjR!? )[4i٢Bs-8rxϟW$>kʔ-#߼cy+>v7O;VH Ƞ}vs\1{FFyh؎vmZ}eځ=7þgLs!*V(eDEG ד{4˔.&wݓ[uիa^#EWN9GiԞ֭ZҎe6!! ݸγg)Z]:uyS{;)\/_{aȖ P<ܑK}OKLLD"IJLLƍ[9I_OojiZ \tuBRe!+)]g1Ed}bc>x`#漓F [}v@۩Y:'N&>^"lU^Θ(ݩ@ج8 lPFu<[3\⥮TI̞ɎXj}.aiQ[$Yx\>4/INN.Uffܺ} Dndw|@fU666ݓǏ }e_΄Ɏ{r*68bZVLN?vmZcddy)>{&D߷77n|`8t;2hO>cY^9;D.{2m`5ԯgCV-ibb̜ ϚK|kȖlsɕܽw]{QSSlXp⟶m|*n W NH$;Nȁ6$CϓϰoZn Eiiֹ# 8Lʂ˨Pf s޼}%%\ccllDؼ͙/^7?ț2}}=iۚ-NⴎjժgAxieĦ)^(kW-c׎t)ÏJ*|y]pexb~[Y]:uپÅ^~휠Ңj=~0BBCYbqiv[zZ{Fhhnwh}k^|T*UTDDDDDoŪ%5̫0m&;\Ƕ.Y)hhh0m]ԙ8mފ]B<ec2j0/_۷o>zw{՘3\tug(^)Ř{`߼5niwSvm+^Bhh(Qo߾ɝ3>~DFޫM,X@bA##;Ŋ2h@?N>]{P׭ƪ%S&!=062Wn#GV,[x (_M+|M[!$PHaF ?mۤ(Q8͚c!!TX F ֕+V̹=wIB akfFգ kTJrrLYZZLMMYl1ngehkceeɈe,ի1b`6o(SOer>d0IL숚6uٽ+Gem{ e˔a2 2D]6˒H68Ż/& b\d y+QҺes1`(?_,?pq *Yr\OXf==@OOvoKWs?m(_^ÉSg8s<WL4mmmN>CxxEf֌v2ˌ䘲?>6[vgLA\\< ĮQC/ˬq6W nRbt1DDDDDDfX8o{3`hh@ehUՃAB#..%W!HhP߆1FǕ޵ !!!L2$jת1#xhw豓DDF/_^7U_ikkpl&9NgҔi], .E:hrrd<Ù;\Zo筛䖠yz;wnR-PW3\.+WdЀr]MHLLc:}1qaU?kԐyfaRvH]3/~:h 11qbúU~fUbOQ&c^EOJ3=)UDDDDDDGգ.KIhEQ ,ēTα/FyZ7  @"Oѕ͝5R[̼ IDATo̞_QN9sE"O4fM??ݲOĄ#bvօ lEä N)!'"[DwQ́=.?kqRzy8)#}DDDDDDDDDDDDDD~ҭkgFDDhE2ݽKDF ,"""""""""""""""?H=}T݆,+lQGDDDDDDDDDDDDDDD#"""""""""""""""?hD4#FZ5sYb5< Vwqu2}< uC2I]c&bd]pv opreF 6*9nߥuC8s:"w?T6M<|O=g>y(RPk9 Jsn^HRs.N>z >-Iwbc/-s?m,~ > jn4L6Wz?ew+~ڟԠTɒMQK]Aɒ%(\sJ*s'ˌyuUWWOwn=ksvm;ܱ=KCSCc&(de{{O[XԮ6 HHH(EMǣ!EmsɱgNJJB*"O ?]=\"o޾݃Z5hVYdA7"2CGЮM+bbYz-/^qO$=mmLS6{Cepud9UCԣD2(\IڵqѬI(jacx\\11rd@$=v4`$GӝcldDFriGYLsnj$ .ѥS yjnߙC1jП{l's=]#~s.I1ҩ[o֭^IIIlپs\ x ;ۆ5VgܶIH;t 22:jҵsLÚr՟(LLLdꔉxzu:Xʕ<&?e\pu؉Ӽ~5uu*V(1(]pD"a \t@CCV-Q "/ЕKҠL:ӪE3FBHH(N[qmBBB)X-7_hhhؕ% ɵҥc.WnmN<{ʕcq,Y) 6n[$&&Q9&Ui͛:{lS8̾ƲNmv18ׅҥJ'9o3/^ҳ@CT*OFu8a:߼aʕ nfv9o`tjUY0wpɎ3x$w\Ro1wb| e&8&$4J+0c c ]$!jU0~Hʖ)-ӶCZ6oFLL n^$%'q m;tmV$%%qi$ ڷkCvk78󿘛Wci ܸyg SG`hh[,۴`~>hkkgRypuXZa٢ʇe+piXd^=5bJ45nԐLҥ>D"ۗSgq]|䎿}/q4˔T2"gYģOѡA=kƍ)7~Ʊy3>7[4g~@沵k~ dv`ݪXյk~ԷeF}Wl֔qx 3i, ˞}R[6b:^|E…7fVYzIRUՇظi 7oOEzQli.8}v:cFj<}Xz]:u7n1oђL˴v7o1nH5ׯܽL?q4R~cO&8$3L |M)\ {0hH܇1k;qF BbE9z$>= O*q{,XCe.w-6]]z=F eqܼuRLia`XZfhks=Sd BBB8t&8N6.{1jDܣPh~ËSg#+JniӪeS\=Y~#=wwc¥ p$˺2qٰi+Y5n"lи-/q73`p/YmJ~'Oɪef¥̚3ߕuTʸI0~(tqٽ#p`NGѪE3nZGBB~9ʔ.͔Ix5;we?ꁆ6nb՚̟3SׯՃfaNtY 弅2 W VU2hƏ%{ð]{.)Hz?U<%11E```Q<<}W7iP߆5+WwձkԐB rnPJ  aȱ-[g[y;:Nrr2c'N ۛeKW݆+ E[Kȟ/ҶWMtz*6/_2m\c͸M[r;´9}<)Vp7Vu-VpC]YÜOnfhZ&3ŗ\eiՂ1#Sp!&&GeJ,^qG*Wu}A4oL5Y|Y2*7m]{ܱ=cF#[,]A+V]Vhhsgf%XյP6E>R+V3~H-p63Ǐ82oҿ2C f3vp+>p(e*;Ԩ.=)SJi;mZesY}4ojϩgPr%֮\&~ݻ IlްZ0Nێ]NV-s<|ĩ3pq#ƌyd';wyS{ƍ ufCAfuhbb L1e_9ujѱ};,_E…Yj-ݻvFj9jڞziJrR2a0d~ "_^".W\ 5kЦ}>")L)},5rf҅Ӹ-wܳS0b槺n,5̫ӲmG^yCYM:k , J?hĎN;3`hh.rfEJ$ϟ =*::sg_P\Y@fMzHyxQvMLM<{fk~Xz`,P ?M5׳Uܽ5+fu MMM.-Y޵3&lp‚3ٴ/o_8uY_T)oȟqEAРM5/r\f sڵiEF aalߴA#==]&L*_~׸y[6dU]>|̙9 P]*??cF(ƍfi ԟ" )Xϟ/oUt^z1̩S O{N022^TX$/i 111*kבQO IH ..NX {߳Y8w0utic;f̙Ohh&&Ƽz7o _DuMXf=q閪H$^zEi(SOre8rz2W2_֬L?3(ӧlپJrR /HHH{v 8{fog󿆝mC?m;uOO~%Y*%11haVzUypB|@dT_ddn[Ե#0cHJy;x({@ L0vrdID"J ShUdm4cdGPSc.tϘùpSPAA`Pr%_4W)Y,_B2/A2ϟOPL -l@+K /Q8"|/D"!<(#+Db >8}6sE&̞H2e2ge 7墫{G`cUWNԵwߧ~=kn޼M^3 d.K̸,_,S\eDk㦭4hP+>zlƮF>[ʛ6-śK>hkkSFat}$ 4m"lXe^#PPWIEWE~iOS{;\vrjHw=x\¶A=!vD&tُ3B9xhJ>[l,.s _|%1!Ĥ$JR432eRV𿶖yLűoѿTA%yu6mH?;F3T*Rx1=U6ڇsҒY_Zs .TG̗//f@ܹ{gϳxJZVuE%beJt^2a^L?>LePR)f,oEL7;ع{/+׬hŒ:Tk+)B"0j$a,PfΙ/l^~65żz5=dSn!44?X 4CVMs y1.A/6tuuA2EDD*,Sj#"\zbR L  EGGM\|z^vҍN!T5i'6Vu ʝ;ٰaڶnۂ)3@ֶw751իriiS ZZZI3%{>[F}FdszeUf^R|PFVi|tuȕ+JnhhhPVM!`=k+<? e\CBeI111f##3Rwʓ̬/}{{kJ͈ӸG\%Eɥ|o7ȓ=nSˇIǪ4^"Sj@INNۗ 䀟6b粓ERU<~jVexvM[7ݺt4_UpN]ZrBz.pQQԳbX׵ 14`],1uFEG#HT2*Botwo3a [e9EWwk0AIiſO2}NN_ypL ۥHgw{p*B)W ZZxx]Mre IDATikkStt3[([ cG 992^-M;wGvBzbCW|ٲhiiqvei֦T\*~O/_r ޽*_J^I֯Uf,\\N)MHH`EԩU-111a@+=Ң q+7&6.}}lB%Kҳҕ[wڏiҢY8[#hԞNӮcWFEWwܻk# frmZ5ۋ*JJ_p-"0&SA\ Y?.sѷW/ƛmrƑd(2B]]v qӋܹscc ]zUxY_x1U b--ʖ)UO/\JϠǥ~7n}O?n"ͫWCKK.(GbR r3 _ ;OlP\\N'_/x+c"yjVd'Z8]_(_,ߍJɺKKvzIBGtՏ~ޕs|Y[Uϟ%>>>dVB9ضcqqqzYs*h1ڴd'<}FLLlky]c##jתLN횸{xKbbb{~`a<|elp"(}zv')1AFsnܼEWw/Z{jjjȶkW.t/KSeLK>pu`nܺV\PF ]pm9tZ'Oe$ 8~ Uk{lٶ_9̜ʵ78ypG׈K2LiԳbL:.˨PW{Ι'S^Ëxlc_pGxAA?-OQPAGX|1zYX8.ݻvVMsݺ IHJyٍIc&L2ΜcTTQ0*ԳVMsfϾ\ sXbUDq];|MKveFxNzg!t*68menݾ6g޽ vMY|emg|͋X)N^#c2Lw@;H䖖1oomN\eSge&Z-we>vꐥ |[w`blJy"зwvNJk󿆧.$2* m--WʁCG %8$y /ﵥH6(B>*'OS|oѿTAݳ:: 63.p-fÀc"yjfÓڵjP:]_hݪ=VyN>u_|e'J(M9zplx}.,53*nپCiZfK~z6VԮU1'!ǗylW[=~k7NS&7NfCj455Yp.J`*}.MHqҴ P)탧!DDDӶGtS6j,W؉S9vc&{ jkkӯw;n|/_at4&%ۗwd A}.ӫGt$G6 ,,Ŋx io܈VȜZS&q Rj]pOhjhR\Y֯^./.Y8# lپJ+s&KNN&11)4C-Ϫhܬ5 I`$%%3|xd;iv,ʧ ֯wOC>z390fd6̔=2kJJٝ6biQ#EBފr555V/_uXv= TR-Nk嶕nj׬1#Y9 Sl͟Có5Xq3CG%!!?_ʇV-q.]NDD$}{`Ԉ?%O3C]]zVԳ򓒒QIҥ(S3\~B^336mXÚNL=\::ԯg1QuuuV/_Ӗm?xHKW¥+8y*bcYjr.ͻ@Օ/Z Oĩ3H(Z0;.V ϚKXf=HB>4ݖd"0 dhk%_:rG+W.J(.%7{:;wE7LLدIWhqupB cvięsrpq 8M<ԮY93h ==]Z4kJNaLV&ҢJSAA| MWfRwf8oqbM\$+ʠ}(e*'UEy{*kmSn2T9Yw{&d}|yxxu˴(IMUپs7'((3rxjgE QhC&TNGQ<~Mi|kCV㻙iFg @ Di@F K);+wcFtj/X չsݺt ]ͣO7jDjgE  G (>~{lYUNII| ?Hou_+anf@ ?9>}~O@ :::ʙ#1ff>3Hou```@ ^C@ @  m@ @ hN4h 4Qt Z@ @ _P@ @ @ @ _P@ @ ҧP),{u<SS,/Iay3>optj7$|9:|4OI;8:5)?-Y!yӰiK޾{+/ZB߸]bO“IeFХ{/d2:vѩ<7BRuquq}ҬUf-EHK}QZc$!dKTTN غmG>Ԯ(E)e qtj@xxɫԒ_d4h҂V:2e,~oL1+Yiq\~ d;wcӖ;_H>U!Cg?6y*MZA<*9An׉3f7w<6n!4lڒ0}I2 FٛПlO%7o[5, ٓ5MSSSvdFec'}.N>lٲmSH|g_(?|_??tu}8e% ={Ӿ]RBV f ɛ'ɷI YOOHTT$.c۫'Amղ9/\͛lLtttjg%M77n&OXg{G _ٽ+CǶDq8n}4rX[<:sƎw%22g~lmK0l@5m74tZ HYw(mo 4$,, S;钠`562;@Ȑ!CjeK ؾm[ߩg/h֔}{K:124df>BY3ٲfEKK+E3f`N=G3gQ\Yn߹R=~,V-R8W de҉Ϗ,VVRDҥXzye勗e̩͓G~mGq,-)]ʞ}1t)_Mxx8_ZUjVx7U U/8gΞq6ndhx~C6+Rm7b)t_">j,/^Sd. $ЕҷO$+~^ykx)QdbEfMiܨ=zlڲM[0cdʗ+×/_p1?̔N'g4&$$+pu133š\9:H)޵7Xz-_|HBgW5z /3c$l[̙9-uaa,Y3.CzNXYXeގ?y Y`.7ٳӿo/ʕ-#ՠI Ku{evoߢq<ľFF2zp"##g%Jg¸R|WɼfeDEE%'cƌSe"** 8~~Ε.:RjeʬnƄsgM"<(iYj ޽'{l ט,Z gYh'V3GNtjO*ޫ/J3d`t&N M .%NMdϞM%V'zOА͚X;~U(%UVt*N>Nuj7H;/ɘ1#իUa@J d ޽@z'OӴI#v([ʿSV&4:޻iݰ-o4'Oa|ss3ԫKTpӔtzFF|YRGUXr5IqKׄ?vΞH@@O)]J]۱&;Ȩ(WȔ).\dʴԩ+./sflj^y_TV7p=|Ț% ujפ}6(a'/\+KKԒƾ|RP!\ƏI5kcM߿p-Ə2L}QdR36V|o377SOPAJۻJӷOOVZ+Y$`ܘQL4fMzLϟoPXQ"+e=v$ݻtb|𑝻+9ߓ:҂uMW݃.3ob龯߾1n+fff:Ӡ ,,L&We2]&røѣ aJ4%dehh(cаtݏ+׮Ӫes7l 2eee\A.6Wf̚>%AMd啫ט6c6Ef ԯM[XzM2o<+VKW`9/JPp0_L0и,8y ڶf ya܄J>4wݏ!ׯaܙ~da,QRvbdh(i.^+׬Z6ɟ=z+6ڱ:::ɶssc )N-esL?Ο-g7}%F+;޲+Y;%lYNe:uh'i˗+KXX<7S6or ҽʖ׏Nk\kSHaO$ic.m߉O&5YX1z]Ytt4FK[w̰zennfj>@n~5=΍07ǩN-խTg/Ȟ-[q @_~ʕ-M^lP&ѧWwiԻg7/nTiKI? m;vѾmkz&+LBAn"ݤQC,Zu,^V-I}S8Zhkk۩ wݻv}Tp(ϗ/_ๅJ+hTf!!!BDD̔,4A&ѽkg+vkٶ}'cF (mnY<3W_b:._JjUS]]]WSɟm;w/_}nԫK&ݳ;=w=~3fchh@ZhPI 6c!˕s/V3gQA)и]DqΝ/"##y?BCy]:ut YkPje?}ʦhPOn4LV IDATsŘ<%UVsQ!Y~-STb'{RGjJ0ے%cR+KKƌwkX[gg=0mcμ5zUɊO<)eoKNؽgVn\x ̹|@^=(YJ\!+SXV1oM*ʟw g2g4  d%:Oʗ+Hy`Ǯ=oFO^eKy%2ed+̔ /VCCEP9ȐAORt+pB7{>̔Cr|-v0v@;k+@& gWwvљM3e͢d6֣[ʗ++eb`uRd z+׸!OlRܘ ^yfT(_Q#v+W^_MӿO/߸ɚuѸ\oog8Ϛ(V(&YHXEJ'OJ>wf1M>7`Tȴ+[:ށWɄxH*:pq H/0,,,{GDFFR0.[4t8ٳeS5>8ڴ]V /_"""&l j֨e fq0w :1\+\q^51s+fL =~R;~ժ(EL2g&((H/TOҒ}z}6S<<}#ǎk^9aNVQ7XVoxÆ$:mے%شe{]]]5mL>~d2Jj:n+رs7J_c/_)+rVı&{Mj=LRK*8(YԨ^-QJӧ^dRdkÃ5~JG#lK`~ԨV5HJ9)%+㚷&MODdd;s-k̛3㍫deDDiѼRٲm^Ϟ)-"=J͜CmRÆ} ӧˣO-%qZ$ ˷Lˡ|YN9/]'UFG& u?8>}Lhh(2HC022{XXX()|+vGjU6d`PD몕+ѣ[@.>~;%G5gk9RZU้ ̝5]EKyIVg}\?K(w---fN3!(^+)tb/j1P Ki FCl+amM]Q?s* M&KyQcQ*ڴ --ѻB, PuW߁J"$Gt ,,4۾HԱ҄LAAA?Kіk:SG[C ApH0/ӱYRPt.ԴUhw ׿1ɘ1#+8k^׫47 LFppe!!?߷W>sϳXʣ&yD҇cӠή/4J<}$###quUr?C G100HߡR ̞7Ir ŊÃx%#w\dl£Ox!s,3Ē 닩)hii)JEۋ?1crڲR!/]e["##%Ł LeMP_S333ϑDY `KYBHp?7ʰpw W^t {[[˗'+}}d Pydzg_$**6Z!CNvc̜3cFrʥK֣Ցи?u* ƒČݱ!>R;mmm%8cǙp ];wcccѱ,4T3(~;plؼu;jTmIF1Wr燖FFPT\Kcjj*mI ~JuM &&& Nzʗ+9'NkJ 4QUz(0_c'{>ٲf~='uJ _Hgמ}vTBvL(`;J'J%1<;T\+ډ12Jm#)RfPP|HwImYXlJDFFO Uss3:i"޿#ؼm+׬Cy׭CreUOY)o"労w GΘ:QcYh՜&'+/ֻW+c+"=J2f()5K/M4sf.\L-/DEI166&[֬L򛶖#1cowBxxx8s<5өC;)6TMy-cƻ`,MvZ wn3{rZӻ|򢭭O?Ȧ-;zDR! 9 3KѶu ~&MtUE p0ċ&~Ett4>h>)'FFJZK:+Q8<{ܹr5J&c## *E sM;w |(_8?Lһӓ0gogعu3=uɓ<cn~r #5_9Kll򡫫_f lĸN V|Y)G_D tuu9zL\^Add$3fͥԌ9&:Ο&~8{R)`cCƌ5*fMѫ{WfΞǥ˚;W#**Ppa r:񜎠E]9zSyt/_khr._Iȼx ѲmG[i̚>Mҹc?iҨ!*:ШaN+qdܻw`lݶd n޺Sg91cXd͚Elș#_~Q'+ ؠ{SxԐ,`ÃJ©Hܹ[VދS#ZH~Ɠ^RXppoߑ IY+gNɎ-q?p&LDYj >'{d&;Ŋa꤉;q%:?J===lS#Ϟ.E|SGzlACyF܋IHHʙ#.e/_ WWs[bW)9>w"ZZZeTJS ?bRC4JLJnǛƌD;?j&>,-u[)w%P ۨDGG+m;szO=v\3С]<7o%Oʗ-ϰ0._ʠ062bO}iSȐAG0x=rLrfIm;vfwo ӄ\9s?_^5i d23x1S]5.sLڷkÏP&Mδn*[2d/%Iff4_ג={vrfϾx~b!)&-+ɘ.Oc ._埡beEV-8tkyЮMk~ʊUku:KB}RE ,zvA&؉p;5d.UTj|Np 2e$!deʸ Ҹ r˘Rvɟw1ds1!Y r'ή̞jU+9[eeeʕ(Vn2x@?bWn߹_}ie/dj*I*VpcƻЮM+l#$^ϟMn]5v0E~֗_Yf=5K|V+lR;W8W=~]'gܽ!blq<a??߿3 VvD0cƳh}ܻ1uDiMt=FuV6c$,h¸z 3Ljʔ---w 055ζ$ׯ8jܨ.a9TR 6oݎ+ǣ^^L9B 5[V>3u|} Rd;>Xev`llDi{{!ѵ s,՝PfLLre6ōy өkOLLLhڸ!:ʆL2hɁ$!ŋr)>~ll5mFN62ooV\(`Wq O7]:uʒwA2f@ܹpQ*>,[QhiLR̚>u<>sz.T:y|LE}}*Vt`@JνƌΜ w FmՒOdF 56r =/ `ӛ,Vܸq&ybԿ/d\jvaz:1MA6eDwY:۵a}ѭK'L3gfLU:+pM:>wde>fhiiQR:oǶ{J t){͞M[5g>2lYʝZPfbŴn,])<.8 U---Mvg,]-93ljJ+KK:wlOq$),+㘷&g8yRXXtF']lʗy(&O-7U/&ʊ7f$[nĩӘҩC;"=JfϘʺ ,X??(_,׭f̙ccIxM-*>bInxn¾ド1 ؉֯ϟa̘=pU̐AE7xRp!.gڷm#F#**eJ1t@LTiX~v# 0,Y社3uDFuf,7Kѿaњ~*k9U%kzNud?plY0b 5¥PxQz.z5x={ܖ͛*&H]b6BKPڰg]m={BY8oڣcr]]ٳcKR!+EE&ѱK:vhXJhX.:hf=H4h'o`C`"Pi @ D. =ѪE3;/ÿ#66ܺ}'CneBBBx۶‚+{~:k&(]ʞ69t([6O"d =7K-n@(}8011aѾGDFF7On\/ .?|;zZ$TZR!0t@zy%Q Y)H 2**1#'ט@ BlEEI#> טUΝ'?v2 'N ###fnnVOʙzkǩHnJJ/L$#[ dѾ2+]zDF=H=Ok(+Vw O,|Jd 1@OO/{LM%VBbaY_}Q_6ttt6׎S#?Pݦ~^IGAJ9})#de/_ AOk(I{UϪ]Cf͒YH&y L0HGTS;N/u^IG!=1)h_ʤHOXGG֩Iom@ HnJA@ @ D[hjܦM@ @ .V"@ @Go@ @ 4@ @ J@ @ Q)e{ZC굓%;vvɒVR \ =x8UoYv=ѩVZ˨lK/_ySRu^Ns_N `⥸MNl$Z?vV@ HS3`Ά5nҢ k=6gj7o:c6:uáJMz6^U5;y,m;vR4mՎw d⤩8:5Z 1|'ӻCWWSݥk_f[H-!ɕ35'HǼ|k=٭Kjg҅sS;+)imмu{ztL|yS97#k=%ujgG 4N <nPD1T5IzzJ߸yq&T,X m[KF c##mal۴CCqwZ!Y>o|2əl$22_fB5w?PxQG__?r~y#9s}(d2^F m+8afBR2)Kbr,V+[2f?)3@  Z5SF%(88θwrz *ITZ ֬@[ܹ{3QjelKivN%[GoZxI{*5y1zr:؍+׮+ gyԨӀZ3onH IDAT"##U{#ǻPөUUMжlAy:{ҠIK7Ies>]zr_&OIm\ufF EKiԼdzRЪ]g*UMm՚SZЭW??HHHHu;A]T6aͺ Jf:~rڴnߙKWP}+LewOT6߼M:sgITHJ޻R8*5U1S(gU1ftjV~3O9.TUF[qVwaVTuQG%NhO.XL&-T6tJ굩ۨ] ~״'4p{Sձ.N ޻?w?z0ppɌ:/p@ E.]J]V. Uʓ4 5iцe+W3mjmDZp:@s?iܼ ǻh47I)skܳϩP^)̡|9x^ϞErR,Yȗ7//_Id)I/[p2l?2sϐʕM[3f $sf,^0rŮ8uR:>>; s ƎA}}<<73hvmDWWm[sE&Oc e2&OlRlTm~ri;w.:kMㆪ{#5)s6x 6燁Cؘ7o߳f?B4/ 1g_Уkg ˗};\#œػs+:2oP , dUx~úU˔œyӫ#JE&m׏W 2@~u̝A2z0n޺IS)Xԙ̙6ZPrE߸Ťi3҈fx^ݻ3g8Űc깞yrShuȂEKq(Wk]ƌPo!}ׯt+K ټuCGaRR/Ol_-Y z=׺l5߰-3d`?Br%ɐ!C{|cǏJ& 2?x7f̚Ǥ΅!eT1y-CRv:lܴ֢Kҥ>l&""R>2wx~CRC!C}_3hD!I ŏL&c~ z`>޻WR~;pJ{ +/G6ٴeQX2MZȱ4nX---&}HXX8_}eѼY*zˉ]&CwIYERX֬Y1lt]l `4@]t;wx*/n@@ 6ng. J gZ>iJboWQ#qi{'wn4j@077k!~kki|Z*V(XTHDD$lk玘f_ӳ;/]a-L0.QnXXKa 3f̈)ٳeU03usaH5UL^|!éT.F'&PE ceiɛoLK am͓'^J=z rItt4^ϞSHa@n%U I! 9J…uJ\MO-Y\V| ωcM)5qQ)[T(_NR8dlBbEyԋ `m0kd2.(/w=cMi)SJ%lٳ>~$G(2cld͛sp{>8qT \7 -pԑ_AL4mܐ;:;Yr5cG YF(^k(;,<"/_ҮMKxNظO* eJ++W4.^WyVR(HţO\R{P&ܽ_ISti۶}||O]IeEJ|Ֆy%]:*SXXK *:piZWWwWgÃ4jX_I)obPחܽ:O^z{˷d}x_Nk@Ӿ 1>q޽DDD׸@_ OgWw7l@){dkC@ ˫񢀍 _ɕ> )Pk)Mtt4Ozi0%T =g˶vQJ0?i>+V(CtړҿO/ZlƼٵg?NkS\Uj,>k.&NȐEKV*IqGFRr&cF 痿 gKKKkN>s#0ȔI)fj̝2T[yq`ll @pp0A ,|mmmL~L5>=S=&&&<|ISgFEСspٯ~B1-ֿ:  gO29!|||d*VrklbbD}655Uɋ&<.H[Hbbnn&i{vbv´SCsVkm;Ֆcm|}T$VɫM|SgnL%?/{{fԮU.cnnMO)ٗ!տ:4zS(HLOh ̕3fMgFO5]]]jV.@ HOp |nfMB 2z^ 经ؤԚJw IJᣎ|?_^-l[45-`yd̘]:|,s 20c;&Ӻ}gJ(Nx*H6HXxcF#Y$I}``;"= v%ӳJ3f V^'*7k:o޾e߁ظEKWPrE4l@ɺ8ծEnO*151g E.BcAjԿŶ5%c8թf0GKK __?g&-|||O$$~5yqaia __?E:۶MLd&(A[YĘٳpKXwǮ=|M|y3o!kV.U2}܅2^ |E)NTA+0,>gY5 Q*:¥+Wp1 /L@ d~\HAlNPp0XZ$QGroӊW_3dhV-[1=BGGqG0_o~ulܽ%~-Y};{tttəÚn)>ɾPING Q`AyR˕-beI}"4jjj <Di3,GPUUeXG{>99޼eKM$ v&nOwl,?9}޿T*z144Oo >>uHHH y|}5رk>a`O֥n'=lw>sISgzE]ų\f =Yt9ͤ3Nߠi}s,\xT,͸ai 쏑!;veSf sgʲ!g1Rbb>bjjBvmqOp,^III?}Zc5R:zD2Df҉R(6ò\Yʔ.6v"::}==} S__ЯRz5&Rq^---lATt4E6?=uQ*gFd]TȨhնd@f߼AGwL9'l`Ϯ^Ϩqu_ R):u^ 3z Ѷ+ڶf@ߜDE .eFw@,@ Hɣ.!jRڊtV3JjѬ"  ?<!_F[[&2FAA7]Zjig孭(o!+. :  |c(,Yvho죂-    P=+s#2"#   ydld]1}AAAArc|M'   Ĕ?=]B]"   $>    A"#   $>    Ad}LMsL:#:ص.)^Xc۸}M{YԿ/ݺ˾b lڲ )Q8lkо][LMMr}bn^6; 6mA6^ZsnҪE3zv/^sT\ *J_,G=Z#~;rCfI /0ei']OTX###^|9ϥ3ݳ߼a072c#|g^@? v&p5uA]7ҥ+~c8s<͛6 ]*J9K:umgKl[2}Ċkt ?bddH;;xrM[ʶ٥32  W:wSBy|qE)uFDGr,))89} &9͘ @mYaQ8fY֮ș爈ԔMg7C?ntm7]HNI4[ |YFe11 Nޑ5mlp< ρIxx8 PƆrTB'<<#FÐ016'{^slܴ^=ĪA_gϞ܈vmZcn&NkԼ0** m¸ ./_b-'0h@?Xd!C=F0n@*2n$<}J)Q8'O0YL>.R5=;T?+gΜU~R).a , | kgLLf i֮i׶5nHLθ~&Ǎѡݺt&:&5kבQͶf Ըs'Ty5Rxq9q*Oo_6]!GvvR p/LOz.sFX<-016CXXDZtJܺ3fPlYjq,vmS7o1g ۻ'Æ_vLm ?",<s2DDD=c#c=d˶g}*?7o`/1ٴe:POܻk֢MfMP<ݺtf5֬AbX|%xy SVʕ\D"ɴKavQ;g"a s6[`(֬\Nɻ]V.[LXXLgM5ܸyajj;Ӌ|9A!xAt ֮,]4@麈22H-;fCxϔiXxcGRÆdy в?:JvOrey!dxNxQ^'ƎfLRR11ٵwRfMg e[3޽w ̮G̏ωS.\:Ԥ]-N m`ys$&&dA  2DTT4KΧȗ0aaa߸oi%չd 2{ir>VjְAGG+4***}HRhQyڋp,;[$Nm;^~Öm;7(vj֤W߁ʯT*Զ 'vF5rmV ˔9ATXӦȟSuص̔StՏOy&< \Q ~̏kÖm;ٽv37nuӻgw.]BtԁG1}DdY<}<1{x{l*U@ jtٗ{1m|}@Ti'UacT*J2dWϺy6&&&ٶhy1;waGFx>΍RR/ ˄ Egt*h ֢%xKi|:툍Ȣ8"`blv>'ҎtPOO7ݲz`Szzzeμ_y'&:(R D"41ݴz*,{9~ciHWN"/'D|7q[bִdY KT.99>N$&#F_豿o`)ZZZLn^jp4RcDd$R4ݽ ```YcO^&?s1~r/(,ONNpB}yx;m1?atln S J}E&|Zuzu8ĝ 0}tiO:M"fTR%'1u¸7!>oq+W9|N: k!g1ljjjgg}j+4Vţi?#kjj"I,9u ٽ|ٽ/}#GE9}rTUd Ǐ Q}(K2o%4xxD$JNԀڠSV W4Ӻ~)))T$VG|Mӧ*:ieob\{jס̟9=}=VLK s)_?es3w [|۾y)eX<TO[Rg6Qcc#nܼnyddT͈CpƣǏٹ{/fʒR%KdAA 2uee"ҔAbc?g>ncv<{&pޜ< MP(ga}Ki߮m}i6ƌm )`{ԀOn3.^#f) Ftt o3-KWddOl}N,!!(Y135۷ ,IHH@WO1*}%X]bb 5;>NL JuuunݾnFJHH@WWGpE4?U:GpzzzX[Y;2Kg["pu&&&8ԫ @|B—ms~?yihAu7MMMʖ֭?TtuȱԥicwB155Mw=LMY mmm޽Ǭ({ V:<0W_*(~{2i?=fݗnHvJ+Bޓ/č7j Qer <D"Bs) C2T.]Vhr***Ҩ@$ ʖgլQp]TUU;ڗ+7f^V*M"[ߡ/~s.s"΍fS!gX<c1 ?| %;>>?æz5vmZchhӧ--MXaO)>?TޣPڊ qqΜ=XTT+g;v\q%KW-l^4O=ܻm_AoK2Tjjj?K!¹y2e,_wYOz}:TƤ3ؾs׮,\,ՙ8~e;zcO\e7otYvT?&9BΞ#""qqq,p7vplݾaGI.mӘ)etݽwRڊŊr_C !{W^j?y4ŋK7'F pq<016fɂy\+VBҥճ;@aE tsGOO.:"_Чkg#ed$)5rGWWvݗ:ݺQcIIIm ~cPQQ^]zt{mWc Wav|,1, {æzu45d-jְa~,6lœ J+ZT6W&''?~***.\%Ӳy3ڷk+o@ ,\E-Z]]9zw|ӛy ?a2̚>vJ+JH$HjѲɑfv|*W0&O/W֬X~#3gESS Ӵ l׳jZ>ablM5,-с  JsCkػgwLٻ{eʔlvsCV.wܩ.\d֜y,[@>pte{0cd\ͲHNNrJ,;[aveTRcaeiɜSc5mҘüK[6AA(x***E-jќ Obb" >Ly ߗ~#+O7הg6 ^ϮH37upD|;j0n $I$!"ҕS?ZAY sʕ->{$**c##*T(/F zܤOd$''stؾLiBJ[RAG0VRm*tI$,(5h BZ>}s^L21ݬ Bx-=`}Ъ,w  nҪE3zvVYaIyL۹Q6(>]Р%x Hɗ?yP% Pttts[vɼE7aGAA8յ3[+ '"f ߷!  7MlA ]]z̸w;tAA2u㺂B[cEKk*mFAAAd8 VE|h#   ydhh]1}AAAArGi{2AAAAĔ]"   $>    A"#   $>    A$c[&N6a>܋gUP0^o޼Ůn9K[G`WωGhp\K,]Ryμ449ao{Ytٗ:1pti$ SϢS^8:7åEypǰo w.M-q 9ٻų:h6ժQDοʎ]{i석m[t)LLAѥ\ٲ|}Wx)so6mܹ <{Vlk{{tcj Ύ O=~u ۻCx!._jY@K4nDɒ%gC aUX++Oʌ-omn{M]ܨ_נϕk]6?7+ 5 dNZl߼@#wIcg *T D"ҥ+tE4lXRԠ>3f%y\tvAfAgjܐ&.xcll4 \YSOR4n0+gT:{EK˃?yqqwC& /d87mEFMÃr7Gf87mEACyiަ=^>jϔpriAٰi}ѼM{4nF~8rV!Ml'͜C6qprM{WfΙn_/^µG4nƐ^|iwϝptnX38-\B˶BϾ|.=s֮(?oM=!qnڊ0|tBË/2܋ҥG_.^VfL?yM[Ѡq3\faVZ@m<} 9=p'q&gGǵG}֬]Ф5KۣO?x г@?xHBBfΡaʁCۿ$E²hڲN3y,ߧޕڅĩӌ7ex\vn84lK6 OB'}Ѷ+k׳rZFM[xY Rеg_7k("#KFMiަ=6nr\| {ad gst2z66oA˶qtnh^*2e(~nkֲh lsu5苃 ;nܤ[~88Ы \}544ho* ?kdWOX=܌V?wbY(i+W3c\7k\zi'L3vS7oAqpraG0ulvC&tڋuHIIIw /usr]Z9y5mڻ2jxsu^jz*aޥRB]$3߽|mS-^Xd9^r'ZanPSW#pU>~޶ uuuR)#|GpttYa3n<ٺ1E(7m[9|(޽ǘ>h%}1u/Tial$wF[}:L07ndy V׭ WRZBSKɘ_& `<͢`wtc={EKWЫ{W444\ĄISYzRĩ]N`ϕי2cBD>~~}(U$ǎ`hn ¼ Keեg.͛Pd 9zwqg4pprCv2QӢYStȞ}=8 IDATn<@_)Ô)]#<k012b07iŪ5DtB|\zLP$ΞHQSSc_+y=9m2W]cҮM uMVfwϾv .YFnԭSn3e\[k;BʼSm۱Nڳ!x>1jx˟ׯ7vpwÇ0~8ϟ۵im;pjHr_w3bhWʰ!x=O `٢Byk:nՂ{+Z2j֠M{WwTy!<E /^L!e -Fd n''N7uQH_aa?~>^שMxx9ndE2`}]^zͺ 4~f ٱ~=:vɉSܱ}yLj$ }{YִY\tI~X^|x1bFcijjplN:T'2*ѧW܇ /Om bUuk3 ̦ٓ- ܿo/Ȏ7w/*U?1pS!g۫?QysfȃZZZL1QdZi݂eyS8p/]6՘5}|"EŠYo;+ f騪ҸQCn޺ض1e-#Kdju4y&87tϿnCA{)YxveuϾ~#͛0;ٳ@ ]#ePʲ\93QhQ:oǯȟv`ll-m?q \*G߸EbE)QxEYkivttY0w6_L9'G =q<~+r9ʳ  ]]Cz6iٶ#<\+ZO!3ƒ˥FF/V4]E*2t@ב/+Zvla-g_,Y8<=Ӈz2~Տ vbRYMOWysfȃrӓʕ*SgX|%>}b?uujSbLMy96nf0n org~f]~V)SZ?a%(omߡ,Rhy@__ڵk[(Ʋ?a2.^QWfalr5KrA9.>+WڣN.-pprxdk<|(xM+~u LL/Tz7^~)i߹pprŋ Ǫ3'*T2[P?<}}}Ly.O:ՂEK9rw"""3̓}: /9+oIRRm[Ĥ/Gz4uq&99;w0EڿF%~={N6@"p,_>,YB폱޽'B]555Ɍ} ܜbŊ*TːHTTºTlk[""3:yR>K'OiPAac[k;BʼV5M+ܷwBPBa/s?q Y{fJ(po_޽{Ȟ/w/nfZ7_{C{= v#rgAA&n1—:а ?w >QYMri*[?+}Ң N.L6h7׮4ۀϽps#ƍW|5qa̞1*+1r8B:uj3m 8ҸQCO@fMؼe}iۺ%ukյ+/ 6;w-2]gRv*w/Qۯ&+cl+1=V:MR%?g&67uuu99%o5>kjhf <reaێ]\~SfOt׬%x&-\BR%6  QHRLL#i>GEEb…npo_ Fbbl q<)ߟ2yRQQaɂa>LjU0돾~45HLJR*QѲD*gb,~i9kihj;immm455 zmmmjjj{<:Z`B$cIwL{d=ִK3yw$&&:OgR 4K ޟ[k;BʼUxx8F3--- ~!wghǚ<~Tpd׬NyVA5'W]gђb9^?"2*ݲ(V\&&\`H4 <׳Cl'_EKXd&H8q*?/ڶn)_ټuP5Ks>LLQQQI7ZLGz/^E7Ww^x yb>~boK<)SHNN?Xb#Gahgp=SO@h¹K\\yj n8|*UFA!<ĩLU__gӷHL7৸bJN{"*22gvF R e011Q BEDȾO 6t<7##C8:`fj}\{]4>)) ƞyS6P, e !gadlĤey*$M]ӿo/ $\;S<}Fjt^aeYGd.̓]TU]-j|2/x䟛7*dAU*{y2eJihka}._ɗcȍI]];ۚޕxvT~=X[YS O8BbE3lPt)eP()R,ryʛ2&ZpgΝFʾ#sV*Wȅf8sVXYCUU.˗(Q x1C*OW˵Rn(^ko"Js}Sy@ ''$:&̹ wy'NV(jZ}Vg|B B*ۮ-¸tjRQUaTw/^|T ZF3lSq c*TH>HsFiBgTO~|@+_6x j h"42qTXQc3m :ڬ߸5UUvV:;uԔ/_qI~nQ PWWb򨨨0bh""#hYv454^'nI"Eʢ%IEgP8:`iYUU*Uȿ^L26թP+׮q0M=lkGݰS'BCƐ088أMҥX<:^!x &OOJ 7mhYvӓ'O X.Δ*U؏߸U*gۥMY՝ a_ 9'zz 4Qc:c6΍ ǺI>YIaqtq۷X|s9r*Co/4oꂎo޼%9Ǝ0cr]/BuqeZ*|omȶQrMv}5նrsݓ Q̌:uy6.\oy2Hw2y?+GWW?_ܱ= xFDӽ+עI|$~NDCCI>+hfMlW׾G.eݳo߾c娫};wRt) e e vl ^㿟ndnOMM otYV.]P.|ض}ujBGGGa0jdm݊%!1=5m?}{ammŇa eBZuuufM̈qfM2&ϹqC=0S>752ev!_Zsi@6჎'NfϾԩc 0a 3Eykkʕ@"p*,W]gIMBΞc8Գؘg/^s^Ls4A{|ʕ-KYb%a¨Z F0‚Y,XyLUX|L+r9EK ۵m`?y^Əe{D"h2&2ssnhӢYS\;uyj?UGy5jT(o͒9<;.΂˘4m&?U((Oʂ ]{! }*WH.s7xnm̘EKiܬ5Ŋ_H󚒜BJ$e6OFFFaaî-Æ8Yq#CCv00ЧVh}GƱ~=L'x&~;r cc#̀~-۵!>!SsC'syaW˖X6)f!EJbqtϿU9_;ʨ.0AܶuV).]Sv5k0r+W1s@ ߝs]>K8}O "<<" d𑸸8rQplNѯ@ w';\#d=]twd t~i|@ ;%A@ @ ?  @ @ PC[K3QJ@ @ @G @ D8}@ @ @G @ $K>ʗϊh&$$+k;߸/bemGLL l߹?de2r+w|f{S9혷`} a6560lJ.y3o0}֜,+MbbRnߙ#G]$-AF';޻Vv~&ŵ!ʵr?"<'2nE|~/_eIZ~}SdTg^M猶ߛ_dN;1k/]ISs:r ѥGovٛToް|j B#f3>=,Y^}ҴEZISyT+wN6zϬiٶv-2dh?x&9L@Z*YUUibi92g=t*QQQ9tHMvŊAOW7B&g3~/_}n2-ΜWǾK빧ׅNM\zSn)'H9"H-]c>QdI44ʡ ?qqqDDDdz!!:|.;fz: <Ǎ[)YE +yf9=ISS`qtځb;ˇק#z*dw ~ ٞ}|id pcȝ[ɐVlݼ1ϩo'11\үStCCCu5kq\"Ru̙5=K ֆhnċ~1,K'HILL IukXZZrg=ϓ;erӋ^=eI:n]:t9LFژ?UkiifY;Mxxzz?7x qIܹ*-"t X͑Ι>ӧ/OJ35^<3 Ͱ4of|*kV. kdeA]:ҥz]{gѿO/nؔ"7QP kW-G]]=>FdAgø8DXXkՠM4G.U?ҵGfN9ܸyڴnՂ:}ZL%W\/WQÇRd Ϛ˗b^X<|͎lZ8Uϔ8g̚s??7'OL\,^_и%8D?f{]All,UPLi=]zI#+"""9upKϱ']SÍ߼?Qj&ON|8luk@^mmjլA=}svQ,M>8q`J/FhhV?E5`߁|(SKð IDAT<{9~B^..𡃘yJzu1tpم%MMM*/ {lE-\"׬=mě(U$._ųϱ߰V.Im455G]y]VkZׯ3<ٽw =uuN{ljV.[ĆMyѦuKߕ{tse͟au^1SZ,]ϞQ\ O=p8G=ZZUcɝ[nXn'N`em@NЯkmS3"˵v&^Qpa qZp6o|u3jx8|.Fm*Cjғdv55KgBBBSm##hӡLң76MgOH~]SF"л LcgkCci'>ֺ Mm)XP?q\vM[4ֆ2oe^c+KBBB9x0b`YVٸ>YtSv]͎|Ia_ ** mpJ*}UeszeTmf8naP M[ҥSGaN.x_$0(n(Ձ 8*0}$Wu '9S\[~#۷E_~%7o1uILL)' YȈA眧7ӡ]k,YR63_F=,^JҥeAfp-3ڵj0yX$ w?K@%K`쨑8͎>o߱e6zv*kP')`֠f 8sKWjb 59Ӡ^T~'3H$,Yn @a:}&_:h b)CGaݤW,!66N~͝2J1jP^s^r:]:u@MU -hϴ9>Bȟ_!..ӦI|)Ϟs;g==^]SΛ⾳^)]R%Kbea΁CGbDZ2vdʖ)IƖx V/GUU&#^~^'Y,YRO: 6oZfXf .+Ufߓ>;dVrIᣴjьMfΙ{eBL<7w9=]]cgkM"EQ9qʍ'رkk֚*i47k@TTn?I2I#Tԡ=c>}ĜyXf=S&ISl%eN%*s+ 3N7oٴّNۡ;f%=uHœ:ϔf~l\YVJˆHJKr 88 4ZZ}%߉L6g_нkgʖ)ͧ_xB~qbXS&Si∍%4+!1!&9sΓ>ҹc{nܺ"ǾRG %:m݊.:/D!s{>YY0djתIHHlT{4Ic+@:)7.x_TfmTT }]:뺺:99R^]mIRݚZ5kвy3VYG…Ya#۶Zժ{TTTPUUE(gIHH`ڔ2O7__\.'MQaT{sY*da)g!ɓysfYCG갑%Ke72Q~2jUХ/_TIAeQQQAqC!5g҅2ztч3g=i"Ҝ-ݻgwuMг{_uϟ\jԔ{oPP0GOt:&|;2111̘6%4pΜ䔛;O=|كƍ,_pC) s]p͚(-O}QWWgy2ǥAA}&NkoP״ڕdW^&dD[iצ5zzlv?S&m.^MM_'T7۶5_O|:n dF:V_EUUUUW j/^.нk@j߽wifم];FLkeN`j߳i'&Ƶ8Nibccq9p.:Ebb"}{ĸwq5N[úI#lm);_QDqm<=3_ e`pH.ҩ=}IO7hkkir`>V~q=qk7nҤR)Mmide! Kz>tLzv-8{N>UU{ ( ˌvAexO9KvɈ/]n,Ov>sV)TSSҼ! 9~ {]0^ ;[5HwiR"Я`hjjФQ#Z[V43,۴gr;߼hjkMFr:L:Π> _ 2i3fӫG7)JqqqDE7pEbb"aa) +p'iaX+Ig$9J*3NAPp0W.YCSig젫os+-%uLg&O(+[>(ϰ!dk0BSSu7+פΣv{~/?i*&L7rr:|Mi7gJH7oe~. `uiՂ!sMluB[KCJ%sϒ?kmdڤ //%U!ͬbbbx5ݻu _T'i4(" ˗LI HϞ`i*sX7dYqm o}y6GpBKzJ9v<ݰdr| gؗkMټ@~GxQqZr*^?~9|J/FLL !!2#W *;v;>ת)g8͛J*S9Cao~N;vG@\\޽K_ 66fr Yс(QPD+׮3{Cc+K&C2e|9$&&bea@re)Q8<2x:&&֮Um--?xH]:K]S4G2+3"N6ȝ;7C #-[#ǎyRbF=iQ. )>;[ʪ(LUU3xz}DBo\\uLBHH(jJϏmiYY'O8##C0x8aaa4_sgc\fi%ׯ+[oei+Wy𡜣=-у<$..o1EnHNFe}ۨN9cmce8r LkQXtᅟ: 07KQ43EQeeg՜쒓]F,\S нkgw̽8vײfFV-_AsM`ZDŽP4ֺ +wSr(?C +{0q?,Ȟ )S2Rj$5HLLg)R=β|| вmNֵ3v i9ENAR%ke9w|ӕ9|cRslNlGr \ODFFH\\aahiir.s(?x '+W"(('Oό,_HDtg $'[կ'(U߳w~Yy{`Pr(u #wCCC˯V:Oc{ɓu8p0Mm&dOPSzԓnJyR.LGGq7q:aIژX{_z̈́Ӱ07sꢢ"](rqqq~K͘&M1x` $wn .%&&6l*0H^'@*ܹsCxx8aa=E2e֖rի[}H~:@`@` :)_~'233"@ KGyPYl4&<<'NمyҲ}zH3hW ], q=~W^Sd <_L!Sߤ:p勬('0PuuR H7NBUU5Œ5UU454 !<<0bccԝ7nׯ11ojUH$>R˸IXX8;<\(eHK>c,wn D&V2c̊d<|A͞; PߌTTT]Χ$kM>M3dHNl"iV^G026=fޭM/I{Զo(P ? HL?x;va|plY;tcdDan14wr59Ǫ gm9|lOV !P|:6TƤVJ`Oev׮ߠ=O=1Wʗ++]fi)zzܾ"<((7TVKW dJӧYΫM*ӫgʍl?{5hd$fH"7Xj./^iNL!lcӤ1Ο'O)G{N Wmd{d$o޼i6虙?+KEh]ң"gΞbV'.,7zz) ?;jٰz5y @oyl# Nr'AwRɛ>aͧY|%֬҂MXBg};:iS9C+N_=/߀ M'~F7(JGdؐA 2/^a-\Lre)VTҺ6<4YLfeeg՜쒓+O{p90cœ`b\[}VpnܽG!ZZi{/11;>wqs%ձ`Ԉa/W6ߕ,‰w9%ɕ+Yz]wikkHxxDQv֦ 秜M"镭u+ sw, }"wT/urڵiūW4u/m,;FRdG8 2b4Ƶkx\JHK"11kJ>Ird~>R%Kp5}.]C(˅%ΚZZ/W5I~3,_Xr [7oyXd95 3s: g,?燾++\{]xW68,,۷6/]PWV#5} :ߏ{R;G2ePWW낷l:HO\)WR^$҂>p4Ob02֦ ,iXEEysfW7o朧Nʕ*q朜Qj@*דnrKG;eZr;ͩ>xbtl[Ʃ0Wij/8zO Ҡ^],b ӧTVF*PZd]zY/BoQ2XQa ?}DK+N5kr1cRu6fD?WRR#** d3ߒk0Бܼu;%^*L41aTVXsH>zD҃ʕ-+7 3ݶ:dq++-e˔F@nݾnPhџA4ɰqr$ѵs'zzqw|}n] ԯc__N{}c';ˣǾLg/ru6;nmi[81#fueql۾_0ahr0y8n޺͉S{=ms.e5֡Br̘=\Ą)PUSMqsfR~/_y1\~2p,'OILLs3jN{pgyt*.x_J3 ʣɎ]{+.^b*wŹv&>w)кesmg^΂EKy_z+IK… ѷwOwmgh]:OFԭc"H'X7c_޿sv2it.^I7w-\BeNNۑ;c[0sEKNf2-xAȮZ͎۸x >w}n^~C ߾I:rQؾ-`V'yM[RLwv9@c愇%^o޾eA׫+wfG69l\v1{`jӧW߸嫸v;vam2jiiҺes7~W=β ^#22[(߭Z4GGGs^^JK=/_^v}Ya׮E.^װ0uCy5/)_(LSfI7zHDdd;qnahhhȖx]:s嫜rHf2x42]PFvY2]N]]K}NNfO?a %Kg%l@3pGӧW8bԪY#CKE\hdiN-Z&l)S2RԘ:}W]q6lr\63Od)N3H;͹siƫض9[~'$$m{&~uadȤq9p[p:i1^J͆H5/!||#̚}pm=Xv}rS)Y'MUzػض9׮ߐjM'g)"::9}@BC~'/2vd:q3th9ܖSJdLЧwyg&.^ŠUkv{uWFAΐ3}rSpS IDATCGbX:C`hhflMaj 2m;vrZ Wgİ!L Z5kdzzzȦVTN۳qk $$$6e5***,; YсX\Vgl+(W 3MaH6>T cGce+O"..Ge8nێ歄GD_O#-[:=c69вmG ҵsGOo,_i3fɢs11}H$9Jppŋe?S~j37 N^K 0gzzMMbB6:la%H[C rG]ɓ;7%JǺG~u2i<{9tut޵3=|rQ!/=V R_ qw fԈtWV|8|'ɛW#CC$r(4Yj-tAvd,'~VZ2ϜrR\ٲ,Y0WFj07# 0 6x \Q#2{OH3,ed*+);E"2K(}h2h}s2YZ71ԡt͚͢+Y}F*Jrʹp+a;4GY BEEsfsuK@yjS|y0#9 ]:u$ qOZ55rniٟ8xP ֺ8% di8+VOKa 炂SI6RTIʔ.My9NRb:I!,McA;N!=RSkCTO_O{WO>M3g\&[ax9%MPB1,OiFvң ܾô9_e+}H@5s~.5J;Fk |€ b8 ۟[G?cn޻ЦU 9νҹGߒ=~Bs:)@PʖIN@ C#۳uuuG]@@uD.OCfἔY =/!F 㱯oN'C 2˻>~DϾR^~t:oXzϰ|jN9ˤ'-~7f5gαlT>f霼 @ ߓ}DW]8}cccP>1ɠ`d%+8 (ғlHRӛ3 @ /(>ɫQHNdhΜwmV_h@ A&;?נ@ @ Hg(;e)6 @ @ ˻#J@ @ p@ @ @ @ p@ @ dɑj󉉉8Gy555T=bjb 9vBHչtO%4uIqM.};)UDv'M!Y~KաrŊ4kjE g=ߧow ukӳ[J.t;x-ubuVK-د۷xܽǶ;y_bbc)Y8[6]VC}&ƳuFUҒ86ΜrMqm;~)ѶuHb6:laNTTTԠXѢ1M/8sBoNmjLL ޼} @ehԆ6ZT<*EKf񧔓P$ÜJӲ]`| kVdS#lm;ҪesmT^{>?xWTZ-ݓKw!?}"wn ʗgP>VWlkҶS7BBB:8ncM[`L>%Neeu=5=w!6&1z<Ə}TPEg˞q6e hkk\<opY)-Vg.\ĩi؊ygH>͎N٪ \44ϘK୿? ʶǙL=2KѧW 3g<|4'tSR ߇ĄDCBs56r+֯BWGG"#"Q꿔GKS2KLyNaYQ)w_a=M ߼ɲk{y+W.? +VӥS W,^,'>Aibcc_+W., @xxOr ue҅vR#ԦFFF1lX|}в{v] P}V9Tˉ2RLhh% ˩t^t/r+دӧϸzUMLLL~&,)Z>z#Dzce˔NqF-:.˧܀ {T0]8őc9l0=u4a,_Z5kPTIYZȮYzϯn=Β;wn*/rN$?Cɒ%0_OcݷaX*: qqqb`P8?ս>+ szvʥKWr*rœ[DŽ)Nq6S>::res;ڶnYd9KͶ}OcR}2=$ɝ;w!w)eN?pr5eAK]2s/ĸZ4k߼}@*u._װ0k|%ݙ(O**rzֺ1=vfLgG:#QWw ߗO>mjRmijY}֍ѳ{W޾{L_P!L񡭥GodE?WMKWj?aa)QUUM1ƺ16Zsg ϓ8y4C`5{u4ϽAV s./@S\6x ***8t|s)? t,XF61od{;&NfV67I6S'>2r[4eێ9v\a8suiݲ9_{8Eܹ{}R߼1~f:w ZgEfX&ѥS*UC2wbZD}&GRg޴efV3π!J=~~/Yv=v-q Yg/FIH喨'3eq E7m+]O-u%::G+4i$)<+f4mx/iU,GFF|ZZycϵ7Z*th| l[`ب3Ǹ9111JAFһ`u%<<sqbȖNzk:1}\Қ#shٶ#Yr 6ZӬuJ]K33+gܽf>:0'xؗAFҚF-=o!!!RRߢ 'Nq=s.x_X~+SO2"3i 6EvNqycZȖIHH]ߵV)v<|T.[zFZIe4Qrݼ}.=P߼1= JO`P8ӡK_, ?r8111 20E-e˔f uXr\x||<6[cy+ ]0tX8мM7fQ~F9e9&&EKW`ĎF-Xzqqq q2a,>sNzZz"tῌ4mhȆ}u[ǙsY(/0g΍[Ӕ./.ޟ[?V~65hT2N}02_eQmw9p{Pϼ1-ubJşD|ڸّ;щ?fX."3Azd*9{e]>ӾSY.]JnhȆGLOo--5iަiѦ#NOUg?"O Ӿt*u$TWuۇA+ԙ>&k1jPVC3<'66ѢYS ߕuG8[hGyؗʕ*t90goۆvGNŢ%+3s 4zw ֍QvM-]Y*U w_bb" /ca2덛|ݻ_ ?A¨qdkϕIzzui'_W[ 4445|yy-[9𡃨_הcFlߋ*i"""#8s'!%Jkh&ҾmkrHOfp-FyCzuJpH79d)ʷQL obkݘEA*֌g/^пO/+i?;)T=SSvuhhn^ͫvG{zܙȦ+]NϞQ\kʒV͛'w.ECTþ'lXb eQ~sW׭^ƀ#_ϔ]:R;11'KcF GSS4t${wnkYS6!6VqIfкe3FBLL 5k,_w|Rf e䮈%W҂% qm6lڌZ4eϞGfM9l0>zN3j )-ܱ́ϟ0qtmճ?1z$ We|gT\Qx_֍iݲ>w)^©***X44iAJ-/PuMq=~ + sY+ y3[Y؃R kQSSc;λ2W݀S 2%szzH[dd/Ӫŋߕq8C.SܫHO?U*WUfHrK{>ʥkjZZr?Meq8IBruLjƽe#?y69ʔ[w|~65DGGSiI/AٲญN;ޥ5kǬY MMMev9Q&ˑoi[mqmZhY} c&% =; Az;x@_~ʫoX<_L7/2W_zFzt팺:1k.[塲2Pާ7K2dBBMgՃI|#P!gLSz&..XBBBٻo? 4٭ WPO||{t+U|r;~Rx}0z0 9L:zG0nTCEصǙx6[)+5 iٮ=hѬ).^HPH6gР~=S$ uMM8},# sT$&&2d`խ#|j;hײ/(StdȠ jkS\Yƍ!n\ZZ,_C'OtuFzBr 1gu=Ƿƍ,9lH}𷲔W{ғ2hO r{M,ϨЯlɑ|3KR=m֠:w笧ڵQ*e+WyWS?N;v1ktc`Hg@y*+[zzz.\HvȰF՘0n4gz dlnGs;[9C^ȈjaߓVyVFIX7JOCzeQ@rʅ|.x6m5kТMG엫E bQ -'ϞȄe#G)I-{_TJ;.QgetB 1z<._ŬA=jV9/@:Gjь;wӕ#""xP=QF0VUVMM  i&̘6Ǯ= |z_2e6xT>kӊdl}hjjrbٲ uuu-\"w;~Ĵ1fOaϟ?SHTU6laǤ3->v$5 eU3]v{\I}đc1t]:uզcWs"QQQX78nl5y-œEHOdkX1_puMMPWW5'dNxNyЮm+I$ ::dz~\o)l-KZD|NMW)!!l߱~{2_o@:fG'>]NɧbE0| p=~硩 ZإTUUɕK-ݰI-ޗ.T{^͛ $I dAAlٸN~MM N§O)XP_6Qz^,5[ ӵ%/]]֮Z&;@(5=cWϔS&f?V:ٴXdc2"2571r4eqv9**o:,q2ɣӾ|$e+?{l抢:NJP&U ;lc̨Hq=qEP}mf\& <~KE~&r^|RsVYc6~5:MPv1l '}hr͛[S޼U_~QL˗.͑$3Zd9nSN0 .7*7wP4lM4QGZu2#$Io? y㓾$9~Lu;QWߠɖc򤇔#55:@yyyEn57VFF.EO?'CGk) )o\=+krzuiڼeneffϓ'h֬bUTV1ɘCC5s]]M)Q:sF\k* v.8 5NB'('nߡgzRyݷ_+^{rܝÇ[/[q~t|>JgDOOOWiڼu弝vkpnnVZRW}? ?k9}BO^UTV_ܹ}>Y 7oh}x4쑸]Mg빇:9ZRO|:Nd#55iViɪsQzҕ)--MS 5 _ym߹K՛pH@.I+?x?|}N\ 6,Ө#%IZá2pZ}7Kvϒ>MOh*tIDAT)Kw.-1cnwגe+ɪkUjܸ0Ҭͭ5*޻o4-n&K)j[;] &)9b~!ޒ&ouU{<ޖӯLRvI$y%],KQNo[u< ɔ GvEѦ`Kpc}GKxϞ;[}RIba]%tС?\ e>_kmݱm ,XEepsg0n.cIWx>I5;KI'ڣ\Q.({=b'K3ukcRFKRO[ ~=K k̃6y.+?1])Ct슜lwD#-pczbs@/Rg77Btŷ38Fcm׺.11.l*9R+0-AY=^Ri 28F]o6KژC3ԉmc,A}6.e昻q]K`aĶI !@Iտt'HpIENDB`KDAB-hotspot-41e5de7/screenshots/caller-callee.png000066400000000000000000005126511515036260400221000ustar00rootroot00000000000000PNG  IHDR}8Q$ pHYsq́ IDATxw\9l)CpqfrҬLfۆlm̬4m92WQQlܿ?#GQ|?{99u """"""""""""""""""""""""""TEDDDDDDD~,oTEDDDDDDD>N1r$mL5bIԿi8[8~K/+D|i9_.~9_.s9),o`* 5 g]<)X9 0dg_&%(cDZT;^ԫW\'s:bo^Ɖ䎉rB:H)[~nn\DDDDDDDD.QK _S$N7 M^u].SOsrҧU#"""""""rp\N,lMLӻ0R4ڧPo SDDDDDDDsqq 77.ΜXӧ_UɞC} &35'"""""""r2LnՂݺкEs\a]r [Ĩ\ř5})S4O[';%ϖLb`6۫:&[ob԰kU};ܼ|v'$+{\3GL6eD:DKQϯB^7$ݻ36M]]})""r)p1 ''GB5'zv+T2⛅ӻJ>\kz)VQ&3&]Snb?;>+^cu6}GL%:F۩4F: ԟ/{RDDpIxֲa<>~6YU>0(RL&9`2VTsaTXK*V$&kʜ=US_T& n&|ӳ)˖Ȅq7WY9<(ȧВLf&"""򮝹uh^CF_;@$9b; O+ӳ;kƢ%YdnLJu62Ookyچo+ojތG NP 91|沨ލ!{sٟxO=F@}xټuY=wgc; kTGK`@ij ?_atj] .>_y7771mpw'-8[Ŧ-[e/VQ`).HU2~i3Z>_xxe0 ԏ,aGLא_Xjܨdegcv\7I? @jZ)|}x;~/wv3NNƉ?Iё.SIK?+ogӖmӏcg?favc炓 gXTZDDD΁dǟ#vw<?2m¸1Z\=?[qrtbXr>'G'ޝ9i}Nj)Gϼ>w?b)(?mc/3Ə?Ϸ9nͼtlזV2mX{kٜxku; ~u"gdZ.9(:7jkXĂ+׬iɑ>4>_~QXj-۶q<-m.|Y_ٓ?=c_\f3ͦ-z29 ĘF6<{z?(?_}>gG_VOx6##l?@$V-.]x 0 09ďHU(z޶c÷Epy&8::fݿ6e6m} `RiigltB7bCf,WXIӢk3| 6 ٌA'QvE{͕4ISٽ'TfĻ[crtt~ݐq'] ؗƍ4\OWMm,5e|R!RRS{223w &b4jvlݶMpXxi<6i"a1L4(((8ؤlڲg.9Z48suX/^ZIc{B+..VtΨjwcrĚ1 &3csS򾝑e7jyE*z!xQ@>#x{erٹZE9991{`sI>v|?i`E,|r{eogc?OY0 33m;^b)(^0LNJK+!n3_Ϛkz@?n5Cü_Y/ddfZWooN1U+-8ꆜ/EDD.$Gק1eD*Ntݵ o O#h2']ټJ%v6cGc&V8O-'6\kvptd2Aa!<0kQg+~EjZ;dddcş<8uvYԴ4j۔sttz|udk9ΐ(-v8gs 4 Ӧ'@Q!듕ŌY1k6 e`=~ {I:|8|m!e2e<:c_\hko3[mּqpp`JIlUWX`ʤL~9 ZgnNYٸ`>=8lrsr*}Ngs>k S^&&SA.xOvTH,^ -D!2;wa`36BYҳUۊO(^\1L$2 !Mm*'K>vBC3Ur|?@Tv,{X,كx# Nط?];ÇԯK¾ ~,^Al|<I)^nj+ؗ"""#G2xx')PPX'_}öNa|mhNAaA/lITHvEK$'G(>PZjoe˜l_[>Ǐg2SzqK,[JG:m*ul*JZX` ĉE & 3̕ZDDDjX##xwrdf3g-}g )itH=h׶ jb޳ƊUkmڨW7o6CjZ:kCML\<C kՒDlC\@ݹ~0"mx{{q<# wZjɠ}׻;vư@b== WS澫@bp00kN՝:uX~sX,iҸKZIp :ʞWա99Lk&Y|,ek[❏>^0~U S~Ws:|w C/9*YYdeeWwgtH2M5NP ..\ 5_\p q51z s9훿ҁ< @aN^XoGܐP,]Iaa>f ͎ +SAn]p~Ou"vtmޮPDDD4jyx̔Ʉ *WĤC<«ddf2L PPEӻ ũ%& 彴\\ kqPeddW[?cٍ[x+𩬪d;P`rd0 11L&ٯW&"""@ͤUDDv<#Wz0zuF֭Wf,k%[r!p].K 9rgE,;˾ӻWIDDDDDDDΩޫdZ""""""""5>""""""""5>""""""""5>""""""""5>""""""""5ޕ5vCDDDDDDDDNgw>I{V:J]""""""""5>""""""""5>""""""""5>""""""""5>""""""""5>""""""""5>""""""""5P$}[VPPw瞉Z9yľm2|zDZZz9ٲu}#g5{LJP= ?_ذqSR\ Lݺ!6%m ~?$kfİ!>(z~m> Fz?ۿ3g1c,^hb ֵ  WWWk{L@b"M7ǟndZ/}prr~z96ڄ۷EDDDDDD."U&##Ӻ섳s=v,Ngggfɏ=ΗN/c˵6 )O>C=BBYl9=4| ?m%k+888Ȕ';-0c,닿S+)3ᴍh]1|g{3?nw32ؿO?9MsT'F];_O3' ߛFrr2O?7֚:Ĕ'CvL G_!7p0)gAscWL,Ǐkꠈ\ڪ4s2mG];;'/ױϞR'm¹[XRkxK;9SY:6n^mD:Gu"1 3g}ϣ'|<ɚxydCa,,e@9F`WL,}}tXT̜=cn͸n SGrssoؿD Ԫ#<6e\\qs;q\ݐ>4|S|GGG.v}UBgIx0ƍ}W'OOOgg6xce;Gкu+W!!tЁ[Wq2굗_8eҤ<ӶחԴ4}ydggԑNd?x|03N.ؤOHZ7_ Ioז?Lnn͚Vih?xF r#+oef{)QGGGv2bcqtr$//~쯌-zZ 1h֬9myz-رk]bX]IѣedF B`@RRذa:n"]t]d[$G]Khdff3&[o{c|yzX O^U}#GӻuCϥˈ 7cnGʑ#Glۻ-۶Oа~}~$00~~צA]/]:GFzuqwwT#G x197~3&sѢͿ[թ#ks 1⪁g""""""" 6{ϿdǟEm??"## m\`23|L GIf1|m԰!Ͼ$QZKяv8 - H>'˭Ǝ? ԧ_+e-[[׍nqcyi<ԳdggԡRש?fʓаAyA~qk"IF\?NzqkAys+[pJjZ{78k/Pݡ\tmνLⓏާIFy= d@6fsgLJW3hF PG.hiiNΝOӻDDDDDDDD.pe>aHUSGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDrH| G&;;0~Tؾ}_^uqIcp~/~c)xzyVw8bG..4oY\*9r0YYU\eUw(bgG+6͛Uw(""""R .;;aJPk~U>%"""""""rq$}HIHIBW*ظ:wO^^>>>4 mU_vU4yIپc'oN{׺m6]۶\sUT"8-[4e?9^1ǎԔG7W;o?os2Ç\À}4y? 0LOX*m|*}5 mMzg6 z, K?KҡRϗaa\ٻy}\f-_͘ɇ}^ڋe޼3Cvu- 6(w=~]Dqm0ٹ+YUQ~""""R3=oM#IcF  I$&TǎFMV@ IDATFPP ݿxqny\Y|9۵+iZI אiݞ1[6hwr^bqpp aj5{ﺃMK烃of_- w~.ҙ>{ă^[fX|/*6#ߟl9N~Y!?%(0p""""R3=|xyy{qt ԡ}buZ(J.?i2!<#degÏpw:]:wNF { T{}"$CPPW Oȶ2%~9s4Zhέ7%3#g~K|{4jЦb$=7WI޽NSnn.\M]N9 IL9?r@"J=:{n>|g~=3r0ZpίNnn.w{A޽zZ%|$$`2iެ)w9ƍ9L'~F, m#;  !nK.gMtОgz?y~^ăIxyzҡ};c<:6_+=_wn/DDDDfB΍6$!a/,$553 O>qc),4˯qppch޼_}3Cm{j Gqe,Z?csӻ77}96ǥҿokJ$Af}?V< ˻]Ɓă$$)jZ:{'??\رsZMH(0xٵ+綛ǒkoͱxٝp<0<κѱ\ulx7oeC0qqqw?#*W.Y+{I&?t?q*vXfv/w,͚6%Q`2ٷ@M&m%˿;'0 >J~&Y6ӖMNNqthv"ڄ'u6rIos9ظ̘9?NX˖2&Om|7{mrkW֜6= {'uX0 f̜Ő>EdSyn?!u2o> 1MћiҸ1g-{@"WɓS&%)ǎp߃HL<ȃG'bؔ}؁Ϧ'M!,m[SyINfL}ip Go{ڵyG[{*xk􅈈,vӯݻy?ʼϗ6\ٳuU>04?:vV-^{m6 leM6:8sϝBbbcYd)<1:dee㼟mڼuM6͚5{ă >h e5$&w>FVs?ߚfݼYS0ں)z3 {y&ѸQ#Z4oΣO<şK1r0|qp0F~c|}Q#o}:KTU­X2eoʓ]/ul׶Τ<_ϏÆPV-9w?W Ԉ'''jժE厥IF8::G%UKOx[KuqssUXX[^4dxIIM׎I[,6mEuh֪%iiir5N$]22WOIM3th{%$IFdff?j_5a6KKMM6 %gggk.(*Ty[a0p@?_g[4kÏNamt:TH>z뗫clwҙ3U`ƫ/ZGD 熛naKm+z5:kkCHO?"=lݶM8#= eFǟ~NDp~$HHHpBDDDDj'}\;8x͛UYz w7͚6pm[[T8*l6OI#ZjeM =fM8'##ZSbbc$L"330L u_38::riެ}6cnMHp d~}LD|}_<< kՒظJY:+NP͕<<kɶm;N4DI_ssrG8g1:/OOn;ƚ9v,,GNZG'G222zF:t6x{{c2ҏ?eb<γUii6]7-l$-lV:9lIڶ}֤`yci4,f`2ѰA}\\CAAMCCs1 oFL%%IZe;D֨aزuͺ0%#sJIgS){?*+m_-!0Ʊ@"3>o3*+##Byzy:qco,s_h԰!AAg^r|}|xt$cXdQi%?<~-tX$BDDDD.v_eAbbJ!9MJN9 -l2seze6"quq!((w2Ҧ~)C_~??_:%*UfyCcǘ3':up| zrrsٷo+W{:-Qn1 \vdYh( _hiʟKҴIc ~q.yytZ4?sXJ -tqk;|EfMqtt$%%5\"S}n[?7A w3Oc,]Cӻ͛7Ãfd7x0_~=Z.[Nf!p,% 69ucM\Hgv|w,]uM~Ώ:G;nGއ),,S ߏK; iѼ#G c| ׫˄+DDD8CȶU?εMfr&gw?bڤ1?x\Ptw?\.Z1n̞̍;z~''riO$8˺D1_HMKIF2Zyng_~%?"Q#L&...se]ݳbYP?@f66FG_SJ2n 3fbSJNѝ6إ Ǘ%˖t_8;;\'.x3Ϻ(,,Ŀ¸ g]"S}nU= $$og}oxF>tОG'Oj>88k"((Fbjϗɧ?#3+~~DFFڸBumظ'''ZyF;nÏ>Wߠihz1`bk.7^}f0 ѵKu =BDDDD..'.lhʗNIMK(}gllOXvߩ0.iS!T؋{CJ-K/.""""""""OIHIHIB 9gfeVUR̯18?KA~u U(%; KNۈstms-8%5-[s= d@6f]""""""""5>""""""""5P),,$..쪊GDDDDDDDNM0}N>w^zs""""""""b#MMϹ 2"dee٥.#"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""RU+&-[lӳ!Du`kîXZ񷎫PDDDDDDDD]>7E4oތȈ6G%&v7G^0IήI-[ӸQCz\ͺih:udgSdXpt%]3$yyyxz*>vǓ/Q;P^]ku'!a/ǏB!t kofMC'nn ƎYa#G$`6_˺vz|ZZ+^#xyzҹsG׫g.voώ1'//e `G?__.ZLjj\ff&m۶+ڹ)),XL}[n`UjP HWг&33&.Aww{vHH˻].aҸQڄx0'$8둖Mquͷs,%?__Z<ֵMG@?N+kذAx#۶!4 !u,Hi>]>>>ތ6C9p ă߰]1 2WWWjMhP>qqذ1T7i6I:6rX W\~Y_o=mF\l&$5gO۶ӡ};rrrϿ90 aNIIemҘmqsw`Ώ?QXXhsvnn)d2d ȅ/uըQCݭY)[20'a^rh)Y9;;ы\캐s酘Kdee+uC9~<łggY {+jc ðY\|:gϿP'( JVV[mZ4o@ hy$'l6ѱC{a&vA$L"zrձ -fŴh :Lݐ` )\Kg$~&qww'6zt߿6PNWac4[m#+3  o%kױt kѻW~e~W.X/YP{[(eSRJ߹):/zbj5m#"lx@& (,Y׺>""""""""raPGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDPݍÇTU,""""""""ÇqwsK])$ظ슍K""""""""r;MRW>f͚ڥa:ZGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDRGDDDDDDDrHa;(4 *KlUV8:V(esJaԭ_?snXDDDDD]14oִÐR\x\xvҡ][m;v~uUhzWQHiڴ F}fXiMHIHIHIHIHII,掻'rՐ >;}LAA:_}rӻ Ys_ѻߠgâhEEYݝ IDAT݂X(pӓA/s;33u7K^;pPa/T*͠ iwu;~o֟*d%Ix3FZFyvV]Oڵh٢)<}ЩC;dɒAAq 2"W`455q[}==ˇ LHH({g)eybffFΜa?G6;pG* eSuztD"IM  H$V(O>FremXroIOLL qqqhh飕A?y6s+IQ'm[YҴd "E[;w뉍5{),30 d֜\3ɓ; /̹ӡ]vNNn&(Q%w\߃Y|W]'**%Jлgw ,GDAAf00q GCKKK|pl.^/ș#zvBr2gᓿ?Uؾk7~~1u2FfTu/C6Rn{ynfeBӛ/_2eLoހ|/}ڣgL*8˫t^3.Bѭ ȗٺm?===Xb'/ǎѡBK__._G"9M5~=2{wjfF iڤ/ϴɂEKxć |8Ⱦy=zX)ð!JACiObE9r8 a[" [6nWnhjj+WԿ|8&MF:4oژ2a *!#+̚3R%K'wn/}}ٰq3];wD]M70|֯Yqqq3@z쁮.[`aZliyXAAAHCDFFrU?x}\'..y ۭ;sd=o26oQé9s ::o6YG#ȐJsBϵ7s?7q/gÈ=pCOO'OѢyS:G"VeCYyn)B(5f6oN٭ \|iT4b@?w7f H(P ?Uli֤1z8ת5t UY ~omV8UsȈCS% tʕr.\uubE޲p!uʉS\[㻈XUN޳^=aAA!DEEڰBX&R7ѭ3VeJнk'<Ԫ@ֱ\]s5'J=RDݺdGyRt)r٭\Ŋ2u)=l+W^Fu?!o`iw/\?r:^w;k{5{{| qu楯/=]vkP9ݺ텩>^yDcPܹ{k#bcc70(##Cy.-,Xt'O!((XaSuǟR?,[}םeWrWiM̿'IIw>Q"gSSSڪ[؅K;~"cu $$8ӻgx~?@a9MMM(0%ML d=~}c^x=AAwH$.URwYk"R6nJ000P ajHdR#n=a-ZL:3󆱑QqYOвy3N:fH&/ML]`-Z#=)ZGybmUٳG톄Lm׆ ᱱPVM|Cٺm4BmȐJH$I% ӧNd̚;TJ%ދ… @ q?{zvOB$&k<$3f?5}*vdjƫoa+ $gri!(88aXPŋz(m= NAA!sʛ'7Ѽ{E~gyM'3gyxXꟅvx1ǎ{Rͱo?OJĸ֭Ukiۺ%W]g)Gd` ~SH$dʍ'N:ê5ș#G ˗I1\M18k;-~735 ?J oHȝ+K2K=tx7o.H\#Gs4͛ϏgϟSh+Ox|/ܺuҥJ$OAA,Þx{??ȓ;7Kdղ1.}5Ͳp!lQƩ#Ҩ(&MUا8"#͓Gߏ_lܜ-7o|_N4ܹd~AX[Ѳy>~DDDJDCC'>O%o9pb: ?_˓(]=vemեZUyեN!8#ʕb1jьB WFNp1z/^ }==իW ,6>>(T Xdի9+gزm'ŋEGGڵiVe^zͽon+ 3uuum+s y/-cccLMٲu;SښݺЮ Yٻ{{M޼ypTIjtc##a BKSyظXbccQSlIdCԀA!?}VeʤɆ?Ӻ]'F"MAA=yJT9u,SdetrR-dEܹ{Aϭ^;=;$tf!$yr6ViK5a Q@4퟼*MQŗ/_x -%v;   i꓿?YaU5gΞ 4j 5 t#ߒ_ٝ{=f<9s`İ*}zMAA!3۽gxvIxFS+9:R'}yq D[2lx   ]'ȓ']111ܼu'OPHaʕA]]=ujxf#   Nn޺{?IoGAAA_G>>~˶E    B: H5Mt    iH AAAA FAAAAhAAAA FAAAAP'rV&..CGؽw?_D]]Ŋҡ}*W+7hhhijr쉴HR 5SK[y;n4[PI&&/Z׺^j|'O[玨XnoSWn/V4ݷͭw> cUwEGG'E} gӖm֭M9#ɿ3=g{oFC#Mn3 ',I4iAکoۦ2/}_yv޻ϋ.UU%X...7s>C(Q(X"J I˶f4y"$&Mj)g.uЮ5Q(;NC>d ͚4hKM _[޻#b`zZ$']7opIzt)RTϥNOpaPƏIQsV^[+ fLoڂ{AغffbEУ[gb ᶗ7 -e>-q guX)})XtصN'3ʬҏCغcVCo]?/_b~̜U)/3,P],@Ɩ=.^Xs"<<#a=I>UmYt9=ѴqߙNF'g&>>Or:J@*&M[Xr n=RPA6oَ{Alۼ ̗Xz3#'BbRs8H?w7ڷm-S'Na+kCQϟp4myD[["9MT*EKKKȗ//v[4k;3VKѲy4^jDGGE6yD ֧?/\q&cc7BF p33f3ctOC7oߑ;WdWXץy"##NC\\f3#ӛyq0(U&iݲ9Ŋaמ}򰀀@&NN-Vfڳzbbb豲 `HTZ79/^dŸ4h\x1Y7>*?|Rݙu3aTBB^}i߸I;G.X,;{TOpt4oڈ3g1ND;G*9[ݓs͍=KiLӒ\:~޿#OdQ8֨Ø =G[]Q>} u[WYQW%Wڨv5iݾ3ΜU؏ һ vO歱sKW):ɝG7iӡ 5i޺=/_I׎]{h֪=v5iд%[T)=ۇ(-<|Һ~O_f= cMu&FEj\|540Oo>syyxre|R*ҕiԬ+WÇ$Ә!$WG0{B\4n(נI X F zyw;w]d9>ѫ/NB>xwU{ЩjѲm'._s/ҾswjJ}HdrPFjx񒇏'=hѶ#5]N 22Rch;ǚo܂UkR:WhѶ#UkƭOe**XrHRɉ]zcX߮ļy[0l U˗/ԪQ]m\|9gm۴ThT'DHL^yDEEqCES-s,QTa}WvG<|Օm۱fM{f>|`ԘL1ƍd7]{ԌCź0mDCCX _tjtɒ i'k֠|L9c'cY N72oTG:kyV3ټugʥ*nl+fFB? tuuߧzêN=̐5w{wnE]M M-Y'2_yMwMv|Μ9aҲ0P/[Y555ll8zS!ﴴ-M"fɒd*WfܻjU=_]{2q㯓`q8`5Ӱ+V!wI nfz֍kȆW'ͳr$ >O}}= H(STǯR򨫫s}?Uꇞݺo{{jz*U(O8:+ mktܑܹsq$ gƵ =l۹׺YtQQk]3^3}ZO_6)52^cTXqɟ򧨮>k.'On6mQcس##C޽{ci~}z!Jy1C?'{N,PҥJ2s|J,}3gq$Zbkoysw#k8.\$R*E[[.1f$֥>bu|}{'oz}ҾM+455Yb5cOdͷkCRk GOe*cll,Stle!>|%Bw em0vt5xܹ aGy6r IDATڶʵ-'T5Mv Dɞ=;>OgbE,\+ϞuW‚~n1h@_Enɝ+'l#::ebhh 1O܅<}WSIJ0E Y v tuu+rIGYA߫G7l+)X¥ASxARtLcM: )U(_}}=f[@=D6C Hr8SԬQ~l3f#5z-hjip,dM>=} +8Tƪ +W# 33S~.`mUFganU9jjjcnjjJK.JcmUyнWKz.s#!ZaJ*O|c OASS8tTÑ4mP_Ҥ~H-뇳/c֮\*jX `뎝 N䶷75kuʕ*wζPPAGZZZɏ$_'V.@\9ӻ'ݺsU<aIR6 ȗÅKq6ϧ5y6lbQesAN644DWW--4Yd9J`kDz3%uEnޫҕ+ԭ̓Oc"{$uN9{O|€YxUDDPTIղp!?x~q6:o[wyx|%\GȏuTT436Vސ^Yt2hH>~Dl\|ERk GOeEd/q˛f?vϞovv3roLZU5{iT5<ѯOX@H'' at>H i2Z忧,]Xj-AKSCGȕ3'em+Dwʕ%66G;WNݸI7FF,QSߵ.?$O\z8s?ҨD xí<}ʶx%+SnW Q X<^޲ikkShn{f nyycg[ ,Yo{yccKHXǦYJUSS-Ul qO<̖m;Zq!m7naff*gg[㞧 d\ϟy#&ZV-S{@-MM̳' }k=v]]J&ѹc;;VG ?͚wݧߠڷK؈w}(PHghBq.HN۰%x ȯ VP!>|5z^z%W$GYY\x-̳fMlIMj:(ٺ6#)K[|ۚȞ݂:5kU"O2F"sO!Ҳov}LLཟ_u8`2Ν@jU9z̓'8A~Yٍ|^N:͙$(M3_zP*'ŲBKK'n040H/^ҧ`j֨Nv155E"quUIb>|u758x3fӣkgʕА{iH#=|װ0> &K%..Ϟh FkWߢ(JZGGbEE6s(Zk2xyAMFLL VIQV8~߆@| #""#JזwUx?}G*g߷79gG[[1'&DfĄ8M UΣx?m(Ogppm+铼GYzSs.dm[@}}_ɗ//1I٠}2VTD"A7U?.Tŋq|Y!>Q4,2Cl苙)Ϟ}UVڊýqwN$""GDFF*?~)Snxx8?555UC Qa &66A>d!~^T-g}ʓ;sfLe톍 : ;:0d`${̜9p~ßӥTL5\=ee*cph(YɓݼEXX dCCٵ aahij{lپ3ЈpYo_*4 '$6 lAKBFMMMJ,WNUOޥ+WQSST):ʨ9r8ŋ.Y}z\Fv TI'>~sf* 9dovɕAAH$e*U#偹}y:o /=Os)%1Nު] IQz,ZseƎ`~P:Ju[f߸`݀@Fk2lؼko"ABEȒErmfnCR^)-u#""8}pmrNz.4Pf5#Cr3hfdϓ+l3l+ag[/\|92obp N,%2:i)N̙&MuǪ +#!=ʷn& 9,koҸVeJ#HXaKD]]󣫛 'w.x)YRj1PWVܽϓJqtt`ѼT(_6M'U?lߵHLQ)[?P%аc嬾kC:ҒPaL4 l4m 6޿S3k2hjjr9}iijbY'NV(O:&%KO~7U˔w'W$vU ˱mn\/Ǝf1ʥȓ;WiݬJBOO' ¸|:+R0WXX1 RGɿ)Ս>5WQz,Xg_`oTc\|N*"|dn{8~e8d8[6 /ùQ9ynn}iӲ[UƩ#Uɗ7/MƘQQSWc̹ Lpj4A_kҬ]c'~馾Br] `ύ[ټu/_Wx>}\vZ5hIeٳ 깒+g8͛⊟}]TX===˫Һ?РzTV?qa<!noԵs ͹ qtB  mdJJ(I% Pp/(8/GHh(n{q$yrfİA):~p1РX"*ȗ/ƏjD5jӤQ \NU+V}}=VY[w޾{  #ʟ?\=]]ɍ ͛5f5Rp!y=fO1w]{3s$T=ؾsyk>>~CրLYx>|\9}{̜Ss.EgSᇹ RZf,`COzzzztGiԠaCu|j{+ʰcݳz߸u55Zh._@_B r]<ep9ql._yCaiCUxe埪nܲOֽ .uUuC{[ʗ+KCi߮5 >|*r/?{sdnAV33ͳ~Poo7 JhX---~{[.l}};Jg7opM45#ǎl>IQ466c6^VDDDg]dȠ~ֽ+d8UwǬ۸-{ITRvmZҷlXlPֱ}zLȔT9/Srߝ\=}rbT)R5#FkXZ'<|!` <~Yl|_ P{RiV-[#-WYpN>CKKN۰tjM)\ [D]M2ק\Yy>z,Qݺs>ZCXrJ&%[6suHNcʓR= aV`5+Kc%:8Tc`> fh`@y-%JC29Ү?aБ؆,P~}zѨƒ`̨,XO| ''&:bQ3eTI3LdEԨ]9ӹ}[<UXWL>CGʾ0g&+ҷZZZؽ`I&LLظ$T=Ny99r`I(_{.ɖ͜;wctttȟ?.uMojΥCR*.6ϳ'G]]UtjpQ|󳿡~P:Qet H;ss,bDEESTI/E6um)eOxmm-kQeh D"AWWܹrҰ+-7UJjXʺghܙSYv;v' )Q[&Qڵnmeұ]AJ˳h,X Ңx~"r6^B9{s/"43YѸazvް9hXʹYs ʕص}3;vf_j\qS>wRzv낉1;veR &wbFv&= ];uk *RXZSSSKL}wrHbɉQ|t,_ɖm; "Bޏ=c*ѻ V,] 1(,R1zBX69ؾ-qqs^BC(^N0?z"O܏U}#(8I8]{P|977oݞrem1tP4iAک5^IACG8uF/ ]qAFqо$U0uln{ycˆA/?q 1LN_GA\.\OCMo0 H( OVWW)3gNϩgY|U֍GXWТYHEA2 QIJ0{y$\j/}9q4eɯ ? t." di2K H:v퉡!IIkD'>d |A t%    L=KAAAAXGAAA/$}AAAAB)sؗH    @_/#   >    !#   >    toٷ߃^*-;~dOfێqV](eaipo~igrϜÐ~ZLL N.Jݼu;[IkGg_Tk9vogQz~Y!׻y6N.Ԩ'O6'g5QOKI4{톄µ7/N.x2Yڰ)^ΐ x/7n&..nuNlڲnSW_3{|Eڮ8Drqqqlٶm:P^#ӧ \~FҤEj6}nY߱+ UN] UXåAji3! ])wU`cmޛJ@]]U8w{7ox9LmG~fJ,A,AM**X R{F+WKvPPAڶi/o JͿGGGgѢYyT*+dɒ%Srygd߸Ws۷N|λؘZ5Xa3cFBx7ӮMg_p-J/Tr۶dt؞c ŚK133۷g-}Gq%Mk2*]ϓ8xH$j,LoȟO~pS;Z{C 9Wucמ}|k++6nD& pufL ЧWթ%عM[c&e9 d%x{;;zb# CChܬPvt-XgեNXY~vľ[Lڽ߭ L4i:h6y$ƌI\vSjԀVyֶغ}'8-MF = 2`Xs)'._ʒ+)B 0x@(F'[HuqYR"}z%KN=J;F*\ NRV5Q)(XFx Q1I<$**+ iFFF8kM k+KHLd2:w  a`b4*ɟ7KQc&`ccp!dΔ7oԉ8WgA[[P(9z,QQ <]]]V^GtL4E #Xm?5aCkttt^0SϞ۷tlVxE iբaaXU ٽ VV|Oxzyz1b->AA 2 ǼBXx+V,;SC-Xٻ'qq/LΫׯY~#]:u@W1 Z6o%!l۱a#Gpl@`ԭSݻ yJ/B`Ĩ|mZcooSV,]H[]z:RÝzuj]+#""R_WWm'3zp033ӧ У{Ly=6n"::FE( &NJ5iִ17nf܄s̋)Æ K̘5bE3GmB imZ[>R`֮?`)L?VhC%0=chh-[<KFPXf7oQڙ.\1hS{;;9w~nr,,̅{>B<ʁ˗Xq3 \|V-+e銕,\Æ& }c8tn&ʖnT(&8R"111>r}7ukפF5C99#F% L ڴjAtt4\eql۱Ks FmǼ|“OU۹{/5kTcAHHH2)AXZX2_ 仍!Gv2Qu l*vGvmp7q2Ǝ[4E\##Fltډ/L2]-^ٰɗ7d<~+Vahd(8oݹ(XAP0gBzFlٶ1'a Zu&.^Sgֹ#<|?~28}-F psu[L1;Ce!F,X]:ѯo/nݺi>up)/]Nqv*˝>Ss.̍7%DxKMguLÂ:Q=Ď]{hԠ>V s'Neμ L9g<{d%lXLe5&C~HOJ۷ :%3|nYR\rʙ.]C\|<ϟ`ԭSKZi {лG75kp;vFuCBYfŊ!O㛜>g`/a%H8VVValdD6[[!܅xe1/yҡjcA&!KUqhã;[kT(4^N&K,s[r5%ShcmQth{{;|@.3̔ZW\}lC__S&9sfl0t?\rrµUVaz>& 3i9ҶcvjNŋѬU;^~Mܹy% }{ bWgKWrfϘFŅ?w+Æ #cT #[T.kodcyr#cii!+SFFF,XDӦuK<ܕ0؛3__@}ҕ+;wAX*MA[٦nhJrS2qN/SΛ- J*A˶ٱs7zt#$4߭iբ];wMZr*&/&&&f1D___LVYsY!W9Wغ}'Z4Bs8;K9x(W]Ғ5QV YܸyMسC1&w,܍gWBz̙8~ :::TT;w}nV-[LJc)<"+W vt҉.:p5=Ƥ>RZ5֩IܚbI)W4ng8t(kmdUTP:kRt)Y&L֔&9|mZKRdt9}.\Nw=llקJyM&߷nA|||ŋѺ]'vi~[FurppSvjl\]koRqh*1reێ]XX3a(aPbhh(̔w+m[f]eɓge˖] ]; }[;pWQVy`=FWW9TN]{bۡw- }PPNe  ؉* 1<:jPs97nB5we Vl&1v+!!̝#/C#CF/_IfGҧWwFGvJyof\ukkU٢jcf^|`sqf oHrGll,oҼ5111TT}{G9uݽJz%=r8Sp2) c˶&6122$- /Y&)]Je:5>zLv{{a #װp?_{w+#G>#8}N>Krg W޲eJϱ۸sby .N1wWq$99rdW.bg|B >>HI=ɕ.Ķ 1h+)-::M[9w">OBByGFep}㩝F%../_Ҥ6-*l'OTTAAtٗ*Vpcq8;Ѫ ,@UR:5?f?xH``{˖UCΜ9)@pʙ\Nhhffd2r.su!44'8t(wv ,.}|7zt܅>r6kV6)5e8{5Žre/]o;Mʕmxܼu+++cZJezX7o\)SSS *ȓO:}2xA\\ɖTuˈUrq}'8 *{qqq*1@9hUhAA)IZaUVVVV|Ϟ >>^9Cy7WV?}0w),Y2KZ4or{Jv `og'K\ΫohFuq4:}L'>>^'!sRd2)i }}}!ڽ6!me߻̙7oӹc;Аp 80W)۴'ݷ%((B-, K֟d2J0f] #CCBCC""28MMLIwr9̌ݻb5+20iک 4OwZIR)>h"""RbDFFBPڊŊA^,~R.07WbX0N<Ԟ%v'qFur`ROB{JY. /L TVʅеGd|<zd25L-AKbBfѳjy!ϓHyJ`?+r:To- $Ēr+u{8ed 3B!F?Qn!22:kc Q*m*R0PjcäiѬ [x~[|% gW?!!On3VJ|͙#cG$>>|3 kSʒOc?Un&.^111Q' Vu鄫ILSSSQ>%V#=hxv( +g_9Æ C@g{\pqv"22Wp2/[ΰ!011!-S&tݮѪes֩'8xlHԮYU* qY~^Ɏ~wy6!65g_Q(9{>TU%҂7om3-0(Տ5XZZdnn5+Agl[GUwԬAA,Ϟ={6L2+4 O&˙s9|n!-ujפNX[0* n޺#8{#:9yrbpp0:::iNۗ--, UI-wgLѹ4ojb»w~700 1!A%-*Cz䵥BCT(!6ĖP@y.9JS+0ٮ%$ F'R :'F?QM77x͜UVN$x-9sH6qzzzT~:7oUSuCd2> J|72XAzzz.U͚Y؏9/\o߽#0ى+<{{eG\9s1/'NqYT2dbbB|ܽ{\9s%?eJ+i|oB|P.\AbE޽{ϫׯ?|/(ul S}Uݩ\"()]>+W+䧄rƳYƬ^sf;gN/]-0ywo+em"h*Tw+q*3O\z=])\?c!-""7nRr5[b ɋc^N9~Y6R%K0bmHx<ܭ[ ko!kO&i@l|3̣i6̘5s33OȆ+iצ(OPP0kmU A ߏm7>+W+[6f% O<#ReJX[[=:]MNv̛}}}NSϜ#c p5 T˥X3e/{v{bcmַUh)qtt@OO . i 2000!ڪHMmb000 O\\ͩ㏟>=iENL=|eѡ@~B8"LM 1At=bE 3dϦhrԿ"""z:ɶ' I\,l~>:[۬jO>#11Q-֦7y -{&m.TP0s(B,Yș#;ʻ3G͐͘A^d2[f?|OA^ Р^bQ(jztQ7j'_Ā}jcCM9Ankk+^zݤ1&&&XXs LLӣ@|l֔=b͚6&,<R`4D҂c'йcd2׮# =`q7oʗ+ǭ۷ٺC56ҁCG{.NX[Ygqn\)]$#FѲ8u 22O+ѹc{y+R0Eo{ƁCGXɗ>=5 ȏ6lkȔi32Jbm;x%:fOJ!jըN:R x!88X% `nfƄ3t/(ˬZ IDATT0vmZ7/_EN%jVg$&&`ogCGR;BbˠmL>%)OqCG] NuL惍5Nep=._ V<ո]B[I2bX6nħXG*ݤvڃSj<6 1!=:JOO1F01 3 ACr"ـr͞V˥+>DLL,Ϟl 100uZssS8}.te2olFAC)??sDGÇ9v$.NMB;b$Gߟ.:h|Vu=wS͠R򄄆q177ҒM%0cʔ*EdN;wh99zL4L8YsӶCLMMiԠ'( IT(T4z^+Wcei xTmQ(dUn:d,]@9h׶!Xb^XYY1k/[)d`+{tKId'wnjըH…T/U{tcLE>Ǽ9> ܚ!/\dђecmeEӇttt4~,7nb}| Ԅ2dB:W_V-ȠIHHlir"̷ M$$$4&i+[n 2W4yȬ9iӡ3FFTAF 8}2aq,ZG…=c۷̌]{oALMM(U$RF59 Uft r ̦[8v$mݒaFȟ/^ս ,PN1nH-YF&ͱJ9r7?^= *QftHBBִel߱а0fvZ#$M҂frZ-_fiIR%pttКoݻv{JpCRCL_˖IǰhrFK\<#Um[cccͮ{ٵg3e"WԬ^MHBX[[quZ6oF``GbB"UVMlߵ[7$GNI^=@`鲕RNw`ee^AA,Zi>(R={3ntK<C5wٺm;wdٍq&c䞈H<|DV-| mщb$թMLL,S}f!˩\&;WNvȞYv= P;=9bCzuƏa :cnnUתnwMHH&5e-gZ4CPg~BC(X ?>&!+VSgvvvtܑƍd(oU 5u {>Ξ!EkNmRr J/`:ܡ;$$<|qݪtoCz bEuȓ{WY;;k`Ȓ% FYel;ٵmBcYh%۴jבzujѶu+KHHH|$8܅j s; 9_ oݻԬ^MrHHHH(Vy56PDt;|n;wg+WryN̜>WgSx|={3-7Sqص6-[H FZ4WgABBB'44s!n5C255eAi>Tgc`x=ɝF|s\? }}}?xȮ=ښ6ZЦտ'RRԮƓ$$$$$$$') nys9z<+.R;9KBBBO̘=7j\M|@ΩwRC+>}]wNOO%મ\HHim5 Qy&$$ӧT7b%>}]>uhkWgbnn;HH ,Y0̒=OWWWQ*>H/~VoGW|%Ki!GBBBBBBBBBBBBBBB#!!!!!!!!!!!!!!!?DrH\ /]u S8\. *:e+WGfS#[?a\WgK\MbbGǓ~ȻϞE]uNiC񫉉atч U\ j׽zIS}hٶ#ҵg Ç8­w%뢘>sI"E,XȬߥJO9%&&ҞJθSo/CJ~U]ښXݬP(Xn 5֫/?Q@zQJu4o͒e+T'!9}$/062&:::DGE|޿u.N:_`5( !ܸyK>p9wwHddȐbŊzӧϸt*ynoX[#O{_zeO99o"o%?RzMr\+ߝznĒhִ1&GOW>7ޑ5 ;cT( 4mƏ#:Ht.!KL~u6Tpuqb5?P(ifZmD zXN77q 5{P(҂ÆMj$yS#<"'2tWgA#Ig_Ifr ˳S?Z'wlȖL}wAnY7c6*Qe@fMU[&zzznΨ؏?ANq#"puvE&7 kpiشS'ȱ\|SSS7mB < cc&GH{m:taɝKT~^y zz*Ppp`xMV9sf|ng%]lhٮ#Jg3 Ϟyjd]M&NSg֪5 HB3[ň fp y\%c@>(\ӰIs֮Edd$G$!1ѰIs6GBB;wE'qxW`>|T5 ss , .N 썩i)SLjvRa``[׮@ҥz勅{޽g\vXrI^YkjWɞG`i՜r.ܼuiv݃v&cO">Gʹ|\|A޸81d20ƭ|CFxE[x- /kdaDUTG9sS'^RiGc)d2`i;U_ |Ȁ}122dͺݏWcݶzujl<ёx+W#11/ҡmktuup1gQ}ok+CBظy+y 2 kW.CL%K@__ 荕Æ "kooAl](g̚G~}idOPP0 vȀHHLdܨteXа0)sTߡR(L6/>$GZU٦T)9Jѵ3cמ}XWg'6GJ଻G毆׷r=+x s,]dJ54p0xANȑ#;Gk7ׯX4رe#?}bĨL>cF@sSbZ^ʔ.ɸ#UG_ O*yr̙sjGGǓؼe;ԓVa~g:oK>׮vxy3!!PrԯC5]:{ߩYh)Ŋa t---6d KJY\cg]Ҵq#"G̘5V-t5:(=2YiJbB"ƎPa{# 3Yp9aXQT4 7gmBecjȜ% 3MB&Q;7of_CÙh)PǍҥJRaS^|I^eZd2l*Ve~۰ɗ,-.UM[p1ԫ#\[7QYJӴe[NYX[{ٶ}=uCT,ƇXj3C.3eXX>r=S OnS /pmϙA9T@93 39wJ0>sTx8;؈s+%rr̛>=֖qa!_ckUkmkCا@ʗ/ǨCmaa #&&F=P~#=ܫ=xN2\.Wt^%J>%W?{v{>3FZUwjT`aƵ+Մl>|*ގ=^h.Ӛ88 w察>+*8|@i8͈y y\=UkT`֜DG+Υ9{F!KԩY1 #|ڵX[k5ʹԟc^nߩr͞}ع{/&Q >>L4Wzr*Y5ٳ۩Ȅm.KVi^JR%S&altϞ-TVX>%...ý2V̉#jkJ(bڏ={3} Fx{dLܫnRQѬYSgSqq'$߭mc׮ߠR7A$OЮ7Hu9}P([[? CCCuuuMrlm:ɤVj=~ n4nȒ%3*V`V֯=k*3yܾbinZYZ !3W~/_oATVm[aii2;֩&BBC9~ҏSϨ'$`%J7r={c-2eb ZK BADD`d|/@&LdΜ\NDd$i *{ K Ǝ!(>%Ԕ%ӽK'R:}RS޾}ǼY>*3 BBCY| > R=VVV$&&r4Ca5)mcff vjA6YT^bĢo3&&gطn. ץQz7˻R͕H_Ĭ3O;l̝XL R^GD 3SbZ+ ʲED:9kyn- %wD&l󧁁yp3gyYA%;751`;pHXަ'cԫSIS|Tqqq0eXt!LbX| Ŋӧ><"+WSd46cb016V8!pطgcUҝr=X'w.Ym&:=Y$ ˇ>ORI?qҏZJmOՔKmLٹg/w>rL;?¥+W>7-cb05Uu>ҖQNȟ/={țwʭxzb0%zzz8-C-І3G__k7Tg^b9u,F`'7o{Wrgf ũqҕT٩,g_$$$f%)7oy歐Yc 奩R##}><}Ƥ>nЄcna΂93ٽm3];u Fcc#jը{^z nO8;Çƪxrg9w^e։d*TH!Ŷ5Gdb?ދϦdbq !-<"Rܿ5u鲲gdյDHurؾ-MWWgn޺͹ c_e\XJ%|n#Tp+7پkOٻ'4jPn߾.ex gLMM4-tg\Wg)S&ƎN}ؽw?5ң>S& i5h*W@B:|{tȐ7+Ѫy^g^cORRݸ[;LMM#GhߦGkOOZ[۬q */r,xJ *WOnq0J-Oܜt 024$WXZZ,] Eb"9r n߹i}vޕ];se=؉S]+QL)Cȟ??ÇxTҰ~=۱k~g`}=˩{/O*Wc^d:2? *S |l ###Q'tMCHH(>S'jW̞Gȑ֮HEmî=;ullƚF 2o"ۑ+gl/ԶVV&5T )-h/̚K)Y8%KiN¦+ɜ9k.\LtL4Ͼn);u Vp%@1::Z8y̺U˄oєp=f]@y7W]=PK(-(Q ̝]>z.=б]lly%::кe4DT {7+;WNyOd2X2YzOYJ]+-R+MsjHEo)s&_={Nn[U٭wfu:o{sʻbcmw9v$5PڬS:::@tLʩW=G.%$$bߚ*Vpél BHdT$>FWWݻe`oZhǏpM#zښS'k7} `ŒϨ1ZxJ-瘗MЕhѼQ`ɍL&<|n.J#ՉDjRO b&_|lR ׇa#Ǥ5Qt)yytJLI22?Gj+.N,3V2z$2PpAխMxDLA:T<ؘQ#7`ܫ`emM9L0l-B6=o!.eE{׃)Gl̞sObEYh T4a΂E81yX:u]3j7.Gq1,Yb1`%DFFbemSiqj'0kժO6ltj׆})pօIf0hp7r.x[w"88ܹr2eXK`IG3'Ƣ仍а0lP?Yj1tl׆/_9\2g8ʩDb8tQ@~:Mضs7KWHBjǵjB[n Xn_>gﶦzujq]&M!44m[ӷwBACmnɒ%3];wk""-c.in5{}==::y[0Tr~MGvi]!߁;ZqJtYfݻN߲a20Ywo AG۷_FFFi] !~?NĐ:?9^BnZ@!B!B2kC!B!T1g.BB!B!OH>B!B!?! !B!B$#B!BAsz[La))^ܺ.Z9o@V'Y$*%uA絬5In\#Z=wx/cLqܺ.o_*|.|1c&j3 Mߑ#;7b P=ݟK'~ !ҎU ;nP>жhaھwo-?w^u_[/ ÇV9{+gS#>kw Lab؄Yq܉o?9{x/r` 1r٢|PT_\?oQik+>:j=ϽrpSzdeK FZQϥ01h G= "$(0j5m͑J!_UF KfOerxkRjpND&Oyprb:|':sp:kB&Ǣ[Z٤5z * v}MiHĤߣBEK2fΊT_*:5j~ݔf"#10>__"##000*SG1̂m\`lU%H^>B$[.[Tƥ2ETy|\]xi]!⫩Ӽ]Zዅ3k FYuZͳjۄ[8-P [Z)?Й΁I}8{pux2[P+[OKo5?/f}x(̭Pa3*iČzK]1FeyvLmp9̝M000$4$=v*!f4ǾDZX7:C5æ-`ӢYxQ|Nہχs m56Q/Ưip`j\_LL)Xfzcdb χwLߑ^p \_Ą&zRR NvA5iֹ)kԶrwmx1S|Uua̕Gٺt.CcExe6kw]I)Sa!!ܼxJEUysk=߼˷.C%m/7 K4Ћ|<xKFsK5lqܿ#e!"0q6{/3v(XkwǠsz(WȓԹcB.Pi;u'22krIt([VYޗq3{+."19wIڠaزۗu4qA%r$w._QEGs"#X!zunXχw+SeT522%Ԫho^哇x*ڭ?{l{>qgx<~!ӬSoMRSz8ճ$#⧶cB<3lm|^{<"KVu}ń^1V>[hz#ə'?- [Ի^$C7BC($15%7+OA{<?LH|qgŬ[fQKW/ ?0KfEL3fBVbоptg]׸1 2ߜ~RF72ݰw[4ԋVyWK׮عf1^ʼE`liF|7~(fis߳S0n*%&%A:3Bڹfe*q(n\8ƿgc^>{DνzkMZ OӒv.7Y:m,EV6p`j"0`OVmwCfܷUǤ165Knc920h\"±x>q&_A%ߕG)V9g+75`l`3 дc/"#xv9}Gwmf/ʋ۸FƔQ/N9wS^c/VGvlSdZy4ԛ6-4 }޸L@_޾ OERR6 ÛtNz#:_Ҩ}7d#},s'9}w'grȈ?jLst*[vn^8Ͳ5{Ys?.Ax}MÕ+3[G#c,2gU]]3F6/ӆtX:ƋZ%@!k֧TJZ*0L< iA0dٹ(L4Wؑ:r } " wxC5]R4ߥqy[0aZcn_>Ih?MKjoZEŽJ K~J%ZM=o_s?ܿ}Uj%Z,d%m^>}^{>4эٞ8uikQӲ؈+Np`l^o2DFsxu4jsܙ[eRF\;sNݓ=Vj5}2JZjuؿy5/)-?Gʺc%w.>C 4w/OS]RL%^hs|C*BhJ)?n\ѽ; 4[9KkJ#%t9P|w?=grM4w^={a ,1f+q"yr. ړc`Mk::?<60Lųiк#VYs|3?t遘nɴ1ݺCZILy  KIYمBZF_\1s=mp7qƩd3Yf4Sznٷi=fj`sǿCC4KA':*RIttF~]==ߓ?Ȧ~* QD+= rv.7ʮX)%ƦfGJ}̛&f`o_i<1Ls.h<(ƖƥdӴ=48Oit1txFw<(?ʐ*_>y>p,Z/NZM[Sik>M 7rQy8xHJVe9{+tcWD#UVk|Fq3&fq(]+*ARBU 9@)|4hQ\e9WS9rܑ}߼2W(E-H>?0d|b.^O)=슕 g͞ 4~Q˚#Jziюe+a=csw7N%S)Ry\le6-ŋʚ/QVx+V #c>pšTy$1 B)]]]TV̛.L6-!Az$ݛk'"b8/Nƛgto_f'i%.G MzƒMfQZJV &uEA-kغ/"#"S-+כ3ZX~Iq-ж۽]k`-;uDjw܏XܾW/hGGE)o_zxhJTF&1d:'< $v^ĮmK܀n(.ڕ,~wUkoJ\_X8*j4.l9۽3'OѲ[?M33Ghv};pI^-UzDi}WY1w|} ǴOFps%_L? Tf4Osl:s?߳cS3*mD֝OP?FJ"Kc$p.}| IDATr|},*U450]:z)ٴh6}E&K+-ҿ>&.C XO-T$|̕7i'1] ###'BL>6ɘsK{OLedY0Ϝ@a%nT@|>hغ!{)n9C70_,6|h'׍/#ucdɞnM ::']9y+ȤϧCXj+1-Exʩ;Y?9sOpPPoZl%L2063$ƎW$1F&-[o@P?eeٗ(}2v*.et?By?af_YwGKM܂kgUL$|s)&$48Pc[S:::Tk؜j Or`j,X+-RY=fZuƜ7_\ 0]z%Pٓ01ȝ+٤g/;P"##0XOfƟW9nɓͽ'B\sƒL6-Fe`Ni(]lJ]YshrZ̘+q=qw<]^Iʓ,si gɴ1fD_SOAl _D1mB/!Az$af{RULY?yЍLVd͑K_lk0M4Z?\Kz0m721%g<o;ȕń69k߻%>-S2SR ̻@kyQۙ׆X@Iu|0ϝ\c>2;9rCO_Gw4]oi]^meLmȚÆw#2"<^dϥo*G>8sp74e߻y(!W.`ۭJBLѐ 9h'1>(R!/*_Rr ˗clO[kbdlBǃ;7x fzX mr 8* CNжJt޼"80 ^ky1Ltmϥ\}+|⎿ͩP{7GČ<^9~>}ߴ ky|o+O)YHp(c9Εs߼k.-[ f\_"'qwҢ)+L w-ij5gۭ\8vQR eMZɒic{Of/&Ob^ch?_I{vmv몒z;Ѵwnhpn_>!8(@L```Hfm9wdGvnEVΚ.U6S~xN yrUY爎JR'"1_F4c&2Ypl}126cq8P4leX1wB3v8/ǔA161r~ԨTxs*Jh,µ3z=}}rGqӕq氡Qn?_(ޫ2di 8e 6 ,4Lp(Nۘ~YٰMf#w> qR_vܶt,8}#FVc%+%%9mRtttp(UgQ\xjUĩOӲEv[JpP-X! o߲,3sދa:洡L)Ɣ+,d&f,Aát߾t\*[y<ݴ ӬS/ThNP"u[(Tx.Hp\)?:nud&ދ7ƦfW c%璮&Aul[7e2p񲌛u\MLq(]Р@޿~k7$"< $2"bЪezFsKL=뗳~ )R;VMĸݺFrUl !?  Ƕy Y1|rmƾ+Y0i8QQtC[ -Iq3y!6y R eb۩?>O['N0?̝yJjOp?6y oL'clm5q'R'"1ĪCL]#;wkS[MN~bzwӠ1qw[wݾfS8יkg3z:-ždUҽK!Bob/^XQͷgx @(DQ?%jcZ瓇ھ_R~Ӵ.WGٱz!fc rq EJ=qsNubPU>B!B -0)ͻ%[.۴.W+gN*kv:ZO>a=fjZA+2Sa.B!;"ݻB!B!tB!B!ߌ}B!B!~BB!B! x &B!BEzi] >B!B!?! !B!B$#B!BB!B!O(9 lqގSFUG 鉌d}?p/_bnnN6h(B!'y5+$?2O?BBCٰq GwPtIzuM.|7oȑ=2jW5LL9u`Lyf錵u6%e+Xn#Ǎ/ 7ow/^@hԅ**0_DgЅג/od;=dg\\EXta|ju6}/\߆ ®PA%Ϲ 9a\ &W.ڵAr~xG__ | K`@dlg=5gw]ajbB ս+zzz)^H[_5w>UTM_y+Vt5|(^a kۊ66>{9-Ғ5骅B!1BBB0o;xym.:vŢsp(b@hH(+VxѢ>ukעfg}bqquq%}qqܽ늾>ɕKKo߷c._=[q3KWOϗM?h[7%UL``Uѩ&Ɯ9{'OϟvmZ}-iﺸm'~i@xrm7@ JlYzK#]H{_YlYdz*<{ /Cɒ%3;7abSժV\xI>B!Bڹgͷpr=fE8~ 4lP.=0~vl݀~HyV N˕+'2qŕukRp_ﺸbW ҥ`S?kZ5SvMM`PP<]-[ХŋQV8o۩:\r*5jX>y}R@XlH`oO9uܵ{/lZ sX~;9ajbD1}b> @hh(At!B!H?̣kϾT^V:reeZHh(fyfս+^SqsF(SZ-TXс.gGu<{\ j\Qc 6N]Xxf-RF[]&yŕ`ԪS|Y.^ T*耟?Bhii(V4؋+,Q\ ԩUHnܸe9oqΝ.34JŤ30LgHvmRsB!B1'R^f͘ Gs? <<ժ&8o[nULe̾ۅk-T^J0ppe=::BBCpqGț'2Č<,'ĩkիVSxxx;Fzn[eZb'_޼_l{n4=Wo6幇汞ܲDKωSk"F L M3o\Ƽ3B!BϥRpj׆~br9c ٲfa|lY$8>]]]fgaau6@rem@̝}y 7EPTC]W`?nKOZjU*3b`*+})Ugo% f%Ov135%"2;sXY%|IJ<ɛ'7+i,]W}xҚ{PTuqcAVcI>ߚ)j` c}Cc_؎cF~ˢTݏV̜1iL335% P yфbj(ej!8[L9}``ht!B!>}}}}a;ҥK̹T*M<htu4uՍ;..dɒY¾aܸuIcii]g6n˖7=Mz|J"X?-KT cD+|2غ!B!B|g T*Ξ -a!M53|bZ2f4Z՘.b1y<{A…4ҋ9:Ⱦ]2@|lZNr<CCCoLuD^stؘN(iAA\r)ia m$Q,;+vݏǎd_ Կ M0O y6>J'144TǓfY"Jw4kٖɿ~svo'sfXB!B1clLTt469sk>^y˜ӕ<⮋+}xY3Ȑ!=fffXXs2ë>v ry8oR XYX%w‚V6(Sl0+ OcCvދ1IrۺuMdbTTׯC8а0֬X?xiѬ\P˽_XX.]LJPN: oll!]:gUd2D|yټu;zi pCŭ;w4SJei%m=L2BΦMȟ͛uNCNz7ӮM+!i/u JZJxJq:UV'B!qM2ɓX[[3돩ɓ[ndd%~f; ؘX^cyƎb?H.>M\u035JL4淴 GzOZu,Ž]{p,b젷kۛ,b8:3rF/Z)::Z[7UY;:V]pa;ΟCf=xZfes?[DKG_-m@ fL% b4SSڷwnJ~m%ާcoKw]*W&B!_͙s1z<#[^Ezi] xbEjgx @(DQ?ōKM!BTJezv¬xJZG!RtB!Bgޅݻq)됖>B!B!?! !B!B$#B!BB!B!O(9r!B!BLMӺ >B!B!?! !B!B$#B!BB!B!O(9'fTR_7ME .]ߋ~ StIg=8{<:GGGGIq#FS>ckkC'v-S:-ĶA[ ]_BCCٺmNPDqtt"g<~^}0ahjTolDNpj70/Բzz6nު|Δ) [,_GG###[[ST 7meg~lmm(QXj7QΜeM}++KjVF.>kYiXl``@YSmZ Oӧ"4kKWGzuSi.44m;vQv-ś+Vaʤ5җ,[/FVE?a欹|bi]EZ}߷؅_ԣCvl |;vv=<)b_͎OVy;{? B 0_o ;ҕ9zD9hksԪ-7釧Mg.]W016xU؉̘>ů-hY"JKkoIScqB|7ʗ+K8th۰ J>z0m$ZbK!) ]_BBC(MjU}ttӧ??_^lmrqԙ}yYmXd[S>ӦLbڔItО=>j >>tS7!SD1>B^}q޻[|&#NS&Mef-7jIC{ PBy:ubJ爈0E\O9YvM 3Yj9Ԩ^M[ Hc'O]^h[QQQ%sf%MGG rmkðt 6*תY6-eo#cddwqiߋ*TZEiE=v$剈`m4kژvm[P6Nٵg̑]^ 1(JD{;;nZQ JZaB 1/Pn%]GGjU⚕G IDAT*',K/qx-8y၎. _^mmYV 6nފ/v 2|`gXe˹r_͛ѾcW&NSgvf4kژ[1M1 M뱰0W{eΟ3(QRƍjZ>xySx1ƌA@@s-ȞCQPA аI / )i;wa6v:o 88%VrU07D2e:x@ЮcթMXx8G'ZR З˪5u>d͒:kЮMk4)8q/_Ą=QFuŎ]v]ݼu56ҧOO׻ܶ>zs3s,_ɋ/Ζ{Pl_{`Ͼ~c-HPTRe+Vq?hSI̹L>@RخLLɑ#o޾պc_`<}>=ӼYXfϞߟV2K^i-XՕXb޽OAm3uB5sDEGSJeC I컼Z*ޓn8{<>dnZ~~a#GS`A&ͮ;r>!!!ԨZEI366lR\v] *b_SIXE7MV<;}ɲDw ]\^Vd&**0hp֯^y&%Ci'bhhȟsbY,?9NzȈ-2|$+-U{eޕAr]ϜE]:<_ 8NsЄ/AJ*V@GGw\V 9sd`:}F#s9WFd݆Mlܼ-[P#lj1K])]G А;.xy{'>> 1|y0vXz /X8ʩ3g9x(nn{r|۲IkWQG֮߈7VV]]]?yJpp0Ƹ17i)UzzzW>hۺ}nF] c*\2nLZ ХS9t~fJ*IuTB7ȵjVgيUL]#"K7._a_{t#oLHH}z]! J5Cw pw ̓D3Q`[ azύSg0([];w$0(/_1qX f^yekkhނEӓ9}7bffƛo4e: ԣODDD1Ay8G(7zWbnnM.;j55THxFBKXEb``uxfHE i5+y=,b̨.LV3z<~ے/oѣ6r,Ŋ:2fo#/Hɕ /'9~_Glp-w*Z%-5mI[H[_qwulvuAsԭ'gΝYFJJbܘеsG6^^d¥;q8xY8o멗6lb4%9ga_.EL΃hP.jVWҴ,On[zt@,iܨ!Ge o<%cll%K}J*I>1e.SW^l\Jy@z!g_P>+Vr1MG@NdnնjvщWy;F ?ٺmڴR 16单7ox6{4-զ 3e k, ~GDDJ``[G rkSjn]:iиt*3 Rex ncߔI{ҥKpy5# ]_>xy}\OxbZ-XZZ(j֨ΊUkPZ<}Ŋbia@@@nCʯie˔&<&d˚U#ordnM]޵3Wj* &("vw`݁݉ʳəfdxZ̹{}g?Ȍs10Ч^:4nT_~-v[LBoz.Iőȵ7to/EKε7QىÆRbIIIܽabbL%xukɣKg>HxD~ ۤ>&L^ܢΘҾ__1b)t|j,T&|j,U1E IJJ"!!A{Wuǎ)/J QLĄSd D"/j:Nݳ'J0LL?~y aby}vrXUځ?} +KK(A m&~6`Ͼ<{%Kp "##_sE )ۦX8SYJgf/VOg' ,si?||M!:r?D"!99Xv*?_[X ߿@&/תYpRM7/j:}W<(aσJ*Ε{)rDl޺7o-%eLZ򬦦&.UpuBddΜ؉޻1rTrUvy|scff*W:|3γyY77iPAOJJ"kZTWf nɳϩ\re r5%PlY*/ϱ'Ri$..wr~JRr2""je蘘LWVQ~IGGsssK3fӨA=ʗsȴ=L4z'O  4>)RNA [4?ԕ[3eъH$x|j,L&s Ux̮=Y^GI7޼}_N!%͒+;)lQ*ܽN)Ȓ%ɱ'11IiIbb"ƌĄʊ߾ aqԬQ`jjԏO>\9y6.>~GSSS8-KEVdd$VaffJ&yi|5mLڵ;TvD p$ yT_Q)|rl۱(?xc+WHHHr+:u+f?EK}ztHa;ٳw ?+3j_YiGiW4HLl `Ilٶ&MUw쟮95tl61#' 5ғemM%+cFɣZ'`Ցɢҕ]Ss}bcci԰o122D"]a1&&%?1_|erM,6lDifN6=jTƩ3gyBYKc)Z|w?y4M*aff;w#XIZs F rP7E"{la``~xǫ`vY/^L3u9{k֠Kg Mۻ Eo <06uꗉ4C)hV7cc16z}{eiT7 QHtOIښY3(]}yRS`Aέ0v4vr5?f֪Q%ٱs<]eiܺ}eJBKK ;[[پs76 %GDDj x)@a2gutUg_ fŴnߙy kbœYټa ];wTP/V+(IzuYf5WXќmE^=ܹŊQ]6RNקX"X,w4/S%''S^ KHbD"͚4sI dnܸ𬶊2QٴӾrڵjRjUކHm褴c5\iM9PIܢp5eАYԑ+U 44ngcF ǡLiFJϦls܏u11ܸy T=~"II̞1Mp ,Y@>+Jcx4y䡰%ɱ l)?}o*Q6nJ^=|)Ϋ %3qtz솾>vBSKSeuקfj%sFJ9x(ԧ@|>zw(ۛQc'0qtԮ>>&UZߦACBm8p0߾ҡ]@ebbLشeqTD|B/_egc3O/HW_yuqV4kHIwڰ̾W4N<س*prVF\]TNC6+Z<{-MMzq" U KX,Z5k`S ?111lݾҥJͰU/}z' 96=aafIJ[qrāCGȓ'n ХSVZׯ_X<yܗ_}z1jƌH '=nqrnyuhۚN0jڶnITt4nTɒ dA[[jU=VՃ߾qD O]:ud\r wW.CC)գ+ $*C4l|rD"ʵ}΋?yHiS*eΞ+wceYv&.UӣPAݹk_ӳ{W׭Fvm8{&L_^XYZ^yNsWrϫ`N͐qT1øRرkW]7q s/z5=hݲ"\{REhy$|J,Ebb" BBfЀ~ѡCYv=@2e !`jZB8r8/aeej=Wn#N-\ IDAT9?| rJFFFdiL֦}qQx DmAE1J&Ӻe >]<:2 +gt܁bE[(O?{smmm&M˘>j,Γo6r ' .],J&Xp^rZJBBWVQ x g'GեSv]y)RCKSV,Qg̞/ӫSN*X:e3fΣ}qY˯) |FXC$s)2ܥWnq zr܂ʔ.97nܢy&tnq, XIVSv8y*khh0sX$''Qti1pwD)n:;kKhh'MA,SV :wh}8-SZ/V93:oGhh(FA$Q٩C<>7GpTsgqV[D"!5nU0ImL?~K~|L<G.51a߁C:|cc#*V*B$!3 {Im!YaJP:V4=rR̘:M[!bllDI{,+\U}iS073c| NJO/snX4vl۱dYp^Ԫ7qwuQ[NXZZoA8y`k[u8{wrĜYYa|硫C%r|zenn΂9Xr5g!.nn. 7G,-,ڹ#]:u 2'JFPh܅kr*8~8,@*,7a2aS ?6e ʈ3__Vw+qc_ݘh1&N!..3QIg뛥> Xf=#nj'>>SV fM)5vK'|DGw..:0i nݾc%\]3j8[ LKtIrROTNeұ X:!0,cF^5‡й{/ [6-[4B]zux1-!**ҷwOUEf+Q" |e+ܜ* 9Ǜ=|?]]#M)] sse?:r @F O`$&&R^ʯgU>SG&ɓYn'2* ++K֯2N]]]fL>r,~ 7o^bH$R+L]#"2mB[:oD"DFFQ=s}g*Ϟ@"j:ܻ CCAɫ7$'' {[l!?aαRE_bl d0oq z.Yi |PR$ko-%47Y跔no?ȼ~:~W'EČ=W'?KL2 AhѬOJm;vx kV.j H$:wENT, AǮ=hҨ]:uI?(+JӼ&-w@  @ S{skV*8/^FtoCY_w휩OYӕO!5G?! ې+ۻw ^J!G@@@@@@@@@@@@@@@_H= >5G"(}J!G@@@@@@@@@@@@@@@_?ٹ{/7nVQc'2j,UkVYX,2g"zşϞٽ?9%+e11L1Pn#MJxDD3+ߺs^6jwz\W̨ۨ;w{tي/űr:z3hٶ#+d]8َ,_Š<|W'&< `ĩi،: 9ć/^M˫8U\ywv :vGؕ'Oe+y̙2}|~u2r*jǚ;Um3fϥCTET'HXq3MlGz0Ϟg+.nf8kꔉ쾝Juiܢ53}OE~g7siYf=}@Ͳ;a2^cƍ΃6boSB=}M_ \&{֬Jמ<}(Py3ؾ-_R@JY\ "(}2!<>keL7 xf"Ow$70bxJ,3p)ӹ|Z.T #rً/zEƦ@t۰y+ҶuK|gNE[KO/~ghiiN,[ߒe0a(v@||H@.#~?|t#\<ԨVs3sk7ps+*Ʉammݳ{N_˕116fQhhhRvmZd'JY| ?#'6;fَC \zo/O5@~q?56`_ǍFCCw7^fʤ "11]]_\Nԫ[GtObb"7n]VӴe[vàԎK@}xc'ؿ/.Vn<|;w3k֮@ ɱ'k-^GI%ښm[Ӻe wې֮X`.nU3|q]Lգ[9M k5igP V-g2mx_sڶv|3e8?ɝ{144C6`rnܼErJ3$KV7n"`Z>{ԭ] 3z3{̝^hP`$&&Ҩ~=>rif?.Wk n.RLFea=v`ff ?._TuwX3SS._*z ̟͛۶c7mj*[Yු'OEF ȗ GF|lݱ(l߼bEnu;_)Z#ygwDX#Nm!A5L>_ҸA=֬HhXeJbQ iz3}q,,۳;;sjؽw?;XIF'Odͼ{s33Z4kB]:}H,Z7oCA(bgGf-?\ Ctt4i\i ׯR='ESC3R.AhքҥJQ|Jێ]FfMpwU߲˜ػ 2ޥ1ܽw+ܿc._ɉWn$$$`[}{uVpR._%1)}ba)*6Q9Ƹ?-ի` nZ,[nF|h԰=vVȈ'`N=GXX84mԐ{̓w?0`7KdIhk5}u{K:aVkv.XDNU.[&PrD"Qgq0|82io߆~0t33Sb1>#F;ƏFKK+=;ʖczVf̞r^d|#:ƒ-Dmi֤qӛ:׭o356%˸~ރ=/ܽ Nf:wlKܽz:By_;a YdY;wo@Fļ3^C~ߓOfYe _&NڔIX,fшbL&n 2* 2e2LYa3m[˳?qp)DK0e:͚4˳?|dԸټ ^ȓψ؈ kVнw?MOё?f1w?"L"4?ȪJ **7oeE5cwhެ S[yW >Mϡ#>zf4mܐ͚Pgoڂ9y#CC@Y߷Ѽ ҉`ϾҶ=|߾2t Yq zm:IK4#ys&M}bŕHFfMز}'5WRj{9-\L6:sR^CG-4פn[LxW=G#*gʖ$''Ss "HoʙU%oCB[:C5JψѼ O,hxŶM(lg /_֥GDeN x˨fVY)_L G__!`ldېw^qrB,3dHxI]/_T[/XS&Kw;ϯBSr¥_=O'u7[&=l,[ʁIHLıbF Hg~r􉎉w0n|wvr_@[[CC'?w"/_eJDU!~ _M E!QK[ --ii^vgWn-6@5x1koLWyvE,](F+U@9v"fMeΥWPbyfϘ"dHre/+uP/O.]ʩgٻs\ )gΞ+}ԍ_"0x`+Us_wWҨAt^8x(#44 WgO@ɈP)c##٭aa?xѱ}[@Z&-uRzG:*,y>kk<7 >ރ6r,y}{!֩*V((V(ߺe ;.=~JiXU۰=8mTq&""RRw?@|M:::L5'Kή׷ݻHPUw7>~̪ bi'_+VVp7oCصm#vR!lҴh!4GDivw,@n |\0qhyټU\޼&@}/H$+ <\ﱶNT̔u6PnI7oV}ʿ,2K'OP:]Ə* #CC:kCvmx9eu,Y5ӢY+;fҨEW6_|>zX"-5NrK(M M455GicccUFR%/^ʕ>/_sy##7rŦ-IHLdGLS[՞xInPVXf-۱m.t6kڈ gu9p0Ϟ͵Jcazy7GА#Dz:`)E_u.YS _wͺMԨV>CR08p&ZVՑ2ϓx2ʵXXӤQ5im224Re ^T^#輸\;-n{73yXJ+иyk_h"lF(HW-vV {Ε044`rbeܽǒEpa~|L3򷴖ACpc##і^Eű?AWu$44?P@~LGHIJ37+Q`h .Lپs=PAP Aj&yYJTNJp 'Up⬰hbbL2yYgԯ[G!Je'x\F?+M=A?¹R-|VX=\!Xr5-vԙskӊw7ujTRP%K9f٭^ ))OjiiQ;>5ϪbYuC@B~!? cGXPo|IUJ(ή=ؾs7oC2JLL$WUSdnuѣT!W &KU׫[g_/+R\>O\@**Y"4ܻ$3LLJW u~$''SbE0n._}qb[` &;Xf=wZqǿ,2KcIܾ{+y',J,a;3Uʒ^=wVV.[L5g> E*gݺtڥJIOPEf9xĤ$9M8Vp_fov力nSMIˣO+|@(RUdr}Myݱ`ܤ-Z=;P@~ _i]ý[hfj*eڕV+Jm7i*zz,ˡ;دoj,# Vd(Zbx1DY_um n.,Y8e1{. T(o%Njbannia䈴R8443SmI:ss/('DG~O`+))Iab&]L҆ꐘ kjj*i:[OOmmm~'&:XfP2شDGMI[C(9 >eIesu===B@ ͛aB;[[|gN%99;|%Fо>can'ZȨ H$R]彲 YnNzLP1mjԙ ăUY:М73zt̟͚r >†[)PfMQNmVvv\|H`>mSmeJygs0IM= T}X,VybZA%:&t۝aY a#߸TpyƸ(=g%͙ahh0 ̋/ٲm'&Md { *pDG(.䏅9i<))x,WdȄ0l~ hhh`=V  oQE^i=~ 4, P3w7bbb r~KX_npܩC;񝷐nݾP>Ԕo O,`662ʜݲH$ܼuGqtuthPFP~GqIqwuUqc##jըơ!<"*ݗY7IP ssnܼ60,Lڿʔ#f,]4<1SӼT_Vy6v̕mm*v?wVnݾC:×sР~5iLҥ)h6o޼T/߼yvsgLȟ?~Ok(F_)'+K>}2Lx ֡W,Z56ַ̕J۵!|Frbߠ ?Jo޼7oʯ >|$))AÔu7*,^8W2)bg/ Qr"k%#]:urvm^F2y%**/^t4z++K>|v}q:sNɟ:VN+K *YYYffcccJJMW{3#7WU25svܲ+QӰYK&L`rB||</]ݸupSmaǴ坾xvJ=/io7oQqvޝQ={\<'$''+qR3ԤT:d>2d̩HLLdq4n%NmJ} <XL;e0]]])̅ .e}O2[wfRxqtut3g)Y>KUeʔm߄-k"eTP9򺮎ŋq4i<e˔V;144A:ԮYo68i)a_{=w~4mܐVPvM싧o岰{NzYbZj@/Q9vh/ILJbtݏ]zp1 ;ȁ̝5nVoڢY^M[qH>kk{2;:Wvb"""U^w([ϟ((,cb~Vf8ɣŊɕa g¹  uQϫz.ŋ歴cLiv2+2mxˀ~}x1{}l޺X7Pٱ*)'OlScse'>~DBBRۦ(124T9Clf嘖x_T|se'~oj445:q99ć߽W+ ? 000diyXtL W%'J XL0)-n|UaK'O޾O*"G>_aԯ[maæ-8-#z #5<<0ǶPAW֖g3a(44PiOGϓ+쫯^l.w">}n\TvԪQ;ws <\uP->e?O2nt[玜 }f98;A[[Z5Sfu|#Rzz쬤930<(V(8|JTѭ Lgܽǥ#w5h"NtԞn]:g-Yo533mXXL8x{2wfYv6j,BSSbfjfy7 ݻvbͺ}U=!>^ѿoo|FaL_jת'Xi ۵D}s}\w <}?Icffc'kb6J[N>cO>kk^ Uktutr/^+^|ɘS5NjV`oC }.o߆=Hj[eq12ih4C&.Nx{yuJX喦vw0g] _>k,ͱLٛ\ɑ|y&OP쎿];w@zGXZZk44UիzPTIF~}7gæhijұ][V0<ԡ֢KՈKAWHLHDGGM["~>ޕISgXU=ܹ~&T(J",<\O0u۪:]zyZ iۺ%m[8t57RT)~kzN?O/&NAthޏS);?C>Jxü9r#L@__ORV/gYj9+\ى~Zg#AB|ᖮ@͈܌?O}==lޔ?7Uڒ0c$-eb RӭKG~ưQcԯW:mǮ әq_ZrRϽ{"0x(R=uevE#mV^=700`,Xf-agk FV-7#.>fH59;oi}OMR3|9;Ҧd {,DFu clߵ'NJ dIY*ɟ|,7e `Ѐ~* Ό=ζOZU,ţɢǸS033g.9w><קys>;1+'EY;S'c݆=~33SzFݲŊr%-%** sZhN>?L;BRRAɟϚu_ÉOH@~ԫˢy3CGf?6 ې45v",98wA8DbR 0qhSir,jըN&rt䰵%R[KĈb$P%4iԀ{0w.QtI~⎆=9|Jgyܜ5+9-A$ag[>Ӷpl.^|%$%%Sޡ,+\\Ju˳?cמ},\쏾+gْDDF2r+?))-齷nZ| eb&OE92q$'+oJn[UGKo<ψR%KPރ=,t*V(ǜYXb5Ϝ@L4^}fwUJD"Za& bܽ_abbLRؾ =n'.cY/iwR|٬c-"pq̨C7qjoeيUlݾȨ(,iVZ]]]ϙzrbLMJG(%˷uvGdD$Kb|-%;S&::gޢ]3Æ 8-kHt˗&?<"mߧJOO4oݞU˗IC_bjo„1#3toyvhޔ=6/~f6oAуC߿Ӽu{A3_†[9z$7mZ'JtM?,6+ ;p*WZ6kx@$ɀ8O{Wsͨ]+g3R r=֬H.SB{162¦ aaal*>kX/NΝwaQ5mU)i BQTn;[젻a ,;u폝3gf33<3s.ѲeKRR<¥˼yY'gZ[@ ~)Z0mF$ZZܽw̔;еS?k珦%۲lтL/`ެ=DYKgȠ+ "@cw*͜áG|uZM@ @ )]9.{ЩC4̡x@ @ B(}~F*=H @ W@ @  @ @ DOWO'A)G @ D(}@ @ AG @ D(}@ @ A~g߉S1qʴ_"y|_fH_8䗅/yDGG~f>~&-ڰgLs5=2C.x^K\׮Ikk4=Z)!Ěuhݮ5w߁9{e>EHh(SϢq4n֊ߜ´Eo2k|d;h۱ lq*۷s_H^.T]C+'JMvӠ ^y˰۰ -t`ͺ $&&2Zn4 :"Sa ]eT\Rv%uT߅W߸ڠ#DGǰ~fl%g,+Wukeqkhhhml:)LzaמlG.˛3V ;!O<d˖kn;)UD!"9ċ\yE ?mY~#:w$oBgCrb d7m[B/odrR),bGdATTQ߾pV%Sa aϫׯYb?&!!s3S5iLӅޱix0s:g?/\ĝ044C?1 L> uPp!x6n"::jKzgXYZgu9~GGGM[Z|p ؕ,}25Hsu63455)߆AbmmXr~B_Op===P3QQќ:s$H/{g| cc7mLfM2̛8]ȡGs'=́GDGGl5bjjh9Dϝ,^ޓښA]T.oX\^rnI]ר\zSnme7;mINϗr5} Vw̑=(W!ݸoa<{YRrEJܹˡ#G93MƮd Lyтy,Zʙ=p(SZޥWXq o޾EKKK Nq[[BChڲL@pe>{ ֩1xꐪqjm}xy ,<{4k8ݼKg|0΍SrMhҸLޱʔ.Eƍț:4|5uۇX,r[ЩC[*Ut 88+Vru)V(}{$_0vB5ر$&%X]Ț5+,[+׮2@WGTۮ󽈲ȸ,Ǐ*Sn-VA[[[H!wF"3W]gj>p 2Hn9scM(m_JGձi jqyR"![l!Rܙ,]KWٝ*+zzn!(8s33j֨F֭,bbbXn#_ (8SjլNɇ:r d+gM_MM-C?>"**jZP֡4WߐWݠd2@*Yq3>wPѩ}$Qg(T s'?,M ]G5K޼}KdTsfNe+@040D*2fD9|Yh), 4ɭ(֮ߘF ϥ|Yâٴn5hiie:V0_&[>̘=٩WRAA 2 #C# D"avF+Uod )]Q#"Hs>X[[ɗ7GjZ^yPWO>I*2uL֩EMٸy+L'M>3jP.^ -VK Y>z `Ÿc@V-166"$4;w3jxx}Ϯ=U: &>>7iZ4dl;#mm<E V?4/XB>=ȝmw1a46C__>1qtխM^݉焇+d N9Gn]ȕ+鳙Tog_`4ireyۇsU'+ս+s/o^3,[IMq(S3{^i aЧWw}g??Y@@`}{B[[ۼ<|$V,T{iܰ>˗xظyl0|*nWOLLzuk6/dZ IDAT ( ˢnl߱NMƺrQ.drOVD:(n[LbQB~ ;3_o߱s5[4GKK570}/wO+:oG\99u,N`Պ%XY&/UǦyӀ kW3YౄѮ3CHR/XK A[;{uGOWw޳acd-J5f<_C6ˋO=S'o޾eH7J(mfo޾JҒ}UXZFMM7od:}mߟҷwKCJHeo166FSC]r/\KW\XvM|t&_PWWG=&YCCCn dɒ077nAYjej8Wr%'>~̦^i*}w$!!sfVJ]Ǯ8y:kf)\S'4ɞ{mێgL֘2rX^.+Ji߮ Uٳ3d+ `p\ƅ ,5b&&q]G UN8u:!`dq[Zȫׯcu+Gs/o:k#[(PXo,􉈈ĩ>rg_P ];uFjr6O<ŶXQZ4k*sv@@n߱ mmmO(Ե;\jꨫmMv6m R;ʔ;kxmێ눡J\m񚚘6V|*QfuԮ *iգ\g.?xoP3/^"JԿN̑cԿ/=]{!6Ձŭj}۴ euաLi9~TB PvMjHNSݹ* Iۨ\/uɬLű}9ٳ+/_g,pHB+A]عk,>yѭ ff4lPc'N|/oF>6573wndϮO?^?\zsTJ.$-XۗCGG˖ʿS&Z](_ցdyIQ[{Oll,Yd!<"TNNWy,H]sqO}QWZDGG,Y{?!w\r?ZE~9E đTp,/~h.Oj{|q.\(MMGDKԪ)ʖMb y0˽f` m'A\{BI|yS{9z,uN&y{A.,%߻xre'44 HEE۰ⶶx._̊hڤ&ws:>zLRRelٲ2}$6{?4aH!e']'׫3fr bbb $$$555*8S?UoqqqJe@̴o +gNY[7 2ҩec Cj?~lj7uśWy&{g}yk k<]{hծ#U9~[oqn#$3~yX)[ K>*ERl>z[cSvjT*3śaCG2`0MZv̚;0"""566К J% 'eirYJşWsu"""֮Sg+Yc#KC>jjj̚1k3}!qqq+ʀ~.ebveO\HQ6a`xI=!!lٲ*OMXX( R OѢ2(ӗ&---)Uu 75U*ѦU QSK6էа{'r-@ٳ#"K,IDDByQf "#8p[קQzt130(Hn?8vldn"M_ ~S̢%YtܳYC]mmBCC""2r'׫ܹr1m6o݆۸hjjRѩQ: NϔV J:Ŕ'2PcT* {v9? 5aaavAAJ-1 }%F ʋ}{n[d rE3p9v%[ Ohh'M},x%M7[CEeK=μ3a <Wqxի$%%a-DDFD"!k&[oeqv_Δ1kJBg5%%%/K $Ͷ- >z ܱ=v%KǣG=K:_0}%22u^E*%wsDD$ZZZ[tuNLL$::ZHNbio~-/^dA?`1$$$pQsgbUn*TҜeP֡ \v%Wl$[ 544Lnp]zZKUR UY555+5U}}tFFܺ$!!:::sM?޼x;w3u,"r """euS]]qncԘԩUٲ{*ȸ,BB91{TΘq100 tPP0'N~E ӧWVδEo!OjSܜ&)>:#~VH$䱶eoxJo|ΎWɶJ*0~PS"7{ 0ۍz쎫8OJuhkg.^AnHAWW&ФQ=Gٸŋ ȮU5qQݿOY2N=BH^]VxH99t(QQ gC6̘=%l-=>۵iYs055Li{޻ի͇֭si F֭011kԠETp,G?i*ݻvB;6[p rF :'r͛<8t(,PH=ޕ&pR7m{žpVE֮/$44ǩ6QEMYa#''G|qqqhjjmF"gXZX0fH*:9fx+勗/w1jR&˗]I\ѦU l%22'ϞN.256mD7mg??VZs*ӚC});8Dڵȕ37ؕ,)ؾ 6O<@~ &ƹ1z>Wx~Z4kBB`meq+< 6燔>e6Ύ^=t܉y <3~̜6>u",CӸa}5 R)III$ZKLLTnjG.w7RPAxSDqf톍{,d ¸ؿ/ǎ`hkg{β(addwV]J5DFEald] ll=c*kodƬH$Z*XZ5kϞ:c6Y$ѷwϟr@kkj׬5  h <@6+Y{|*f͙O~|3~dr2:Ԅ{{~fɂ%jT]uuuʗ+Kre/VǓ;w.\;zX]IHHȁ=2}D,[]Εݻ2{xII$%%mUVfu?xȼ mޕ6Z HJLZ*oӊţƄn/\KW07gqrƾdæ-̞T*%ya3x@~\z$11Aj3"_<\tW1 աKiߥ7HX jp~:ToUT"0(=5g>EfЀL2=SqYݹ*Axoɮ={)Y.}z2itSݖ!##cŪ5,^D,-ء\ǦO,Yx)YJ'a[NOhjjƆӧȶu˗clش.5llѳ{W+!3~gLE"(© ,T+=ܜt'ٲfxq[͞Ahh&O%~vM7-\}.<[gAf('}i7JݒNԘ6y"7oaGdʮ̌M׭CLL,3'..ʕؿyZshۺ 9Dʔ.Š:}7L2k׳cB033NJÔH$L<0| $c*UrSe-gm[D*wBC(TsfM˼Y3Xi3砫Cҕ!儆qm:wlϒ-[6[J7,Oe5|9CB_ݻLuO?ӮcWΟӶL0k|;+s%sq_ȉ#tRJFKl٘4~̟Nc7;v{뤤$5mi_,a?q+$w-dBێ]_6ڵIGd˴ .+_ 7@$ @'ӲA@v&>|&/qq9{n3o?~>zŐH$ܽwM[ҦUԄٳRrڇjDY|?wݧmO%2C H$Z9vޓ@k+&sW_@KK{~051}ִo&! *ȆhDY|?3*޶#[ @ wu֓ϟ>FTTW7C$rD{WX*@ @ ElE̙1o%t5LJ?MiӺe~cj@ @ ?17  )@ @ @ @ @ @ NI  Z"@ @">@ @  B#@ @">@ @  \coRɯx\4L:p/^P /^0Yz-?|ia8T½Yr%8>{t%q UpP򕜩Y}kNbbb2(FZz݆? xE j/^rZ21jEK7qOM@ ciuZB*5hܢ [mWƄpUk3x+?o6sm:t\j?wV^C*$޻ \'$%%1yLZH%Ԩېr_}'ӷwe\:*\%ȝ+ןN/˼xKMML-\ ztE$%$4>wX{| TVf%^|utIwBBB꽃% ڵnEӖmֹ#y@:ӿK\qc'PFuYh)m[1z,^1_tuY~#.i-::VɳgϹr:EOټ՛ѕ9;cyի;w.ٽ}eÚ%)rϿNll,YdnTMBBATvK740SF ѬI#̌=Ye{BYD".Jhjj!Ͱ-VT2޹C`J@ dIZXB 0mr.ʕg՚h---]m;̛5ʕ(Qܖ-ڰ{~:k'?៣sUjp`QGDc1 ]g'%%1wU*W"k֬jb9kՠv&8yZ(}"~XחK! 07 IDATu4oژ֬Țu?e33fm ZH,Z…K  Ȉ =rp2>}D";Und'/\Q֡ CE_QVԫSH8EbR"'x͇111mrnmwaVq(mO3೟?+g˶Sx1FʒP4l @A_`/9N``f=~7nQC _W=pCѢyzurZqXKWDq[ G6rvڃݼ]=]Jۗb˜Qdɒ{n&<|DTTVVt҉U*[vC*tЎ}{3{=~Ze=~‚EKyYdr O>p0Sff%uX}q,W6o.n[͛k;\y rA:5ұ=閙D"Q^7S7OtxYǫoڊ](U uv\ɉC-[r'QײZd! KwuDGǰt''O!$4|y0oʕ-#?.. s 444_692lԬuj$$$ΐsUF vl<}1'PRr'l[(k=rjUشŋ?yjTVE!UYౄa)t@ oX^_iOj8Wpl =Ws155A:Ei{)R'OmョϞѺ<\Yv˽/eǓOQSS|933SÅK'-׮-v{oOo޺M@` kUOן.Yf!!!A~=?,̌IƐ5kV^~CddΥg8U(O022$))#Fń`يDEGQWs{ҭ sfNjJ2w*5hִ1`\qafjg??|%| /c6hii|jOšo~~~tScCBؼ՛A\^wRnmV. >>B\56ҡmkKc<,GGGG3uUfTtrL>3y~<.BCCs3`vzmB__Wй{oLKҒ?wztcA+1S{`eeI6-iXߴJ J@@ CGGGu6ӻ@n\+Zrkoe ׇh]Hl\Yd+R #"{;93q,_>=7o5-U OA()ƒ+}5+T*e\w 쇥lmwmWj ˳y7>AHwz});bPSSSPDe"ߒV"u_H]䔝qI S³ c$%I_ONG!OxDo߽gܘQUo151ASS]]r!s?s<_d,ӢmGHXk-545c5GZ5dnukג{'88UҡIȽSʮ$5祯/~5O˕3# ctIX8)gsX\\3LHvr:| qYYZ%K<|$>@ OX+xGwess 6/^-tr-_TPqGfGQWW'w\KZՕ*wpqTOWy˔R$+s.]V-SZabai[fW/Vxɣr |Y+Yy&m}s56ח0JJs.qԪ,Xu6v6xAf5W˴JȞ]mx 2jtϝ{+Ɉ\M<|p&>e˖YaݹsxhmęsُxQ2!8Mpr,/]:ݻ2$[T Ę~*ȱwAv&I*%!!tu Oz -֧qy}uvdԈ4i@7u;JYW1X(X ??|` tjߎvr3~ ף]Iȱ|9M>w<+]{oHa/rr;|p&{s8tD!Q&!IJJ'JN[dW𦳕AAJ@ d4WU?ҿ2ܸq S >O>cvj8WeԈeMM`;vVj-5s/`d͚:le}HγS'1vZ~QܶժT ej.meGmmO;%(SSABJi۩k1_1aO&!!wdJtcn4116a*s@а0ʠa = W2k~o.Qܖ=۷;444ȝ.=>^y˭>8ת//Ϝc2S#*:.Ѻe3Nj?=mġ=ڵDG)Ph^y@-,,Ϟp: Ϡ}IJJͻw*\e>{J,Y---?yBk+D"A"&2HF}^.޼y/(Vq+kmeŠ.ܻ'Qc׸9 -*e[?qC[xD׮ߔdWZZZ;xXi ˭s59ZZY+Wdu?,<%ySu=xȎ]{Z̊$:&}}u+2S^p#GSI oBlۼ5hҨw)|V )T@PfuVa}YZ8)ǏUhVV*P---nJoe*.\R:y bҪ"Y'g˾C A2]CptRSWc1,nKACyJi&ZZZYmsQWW ܹx >qi( <,r碌})/^H}̢%˓eyt^vPlttt=ܮ`d͚OQ 6O"J)Y6Si_G?3ݿ2Hi{;F@.)P ?cêZ*%ma-ح^Vn G?y^={5kZ{p6DZuuufNĠn05ˤ8}&:&FD}*->>5Kr.^™簲$2* /oxscfV=]]<|Ⱦ g ܻ"::Z:i`ɕK Cʕ-7)f>_8D ‘ fqp⇔>~>Cr KwL5G9:P# d45syS&" &$*jeK+Yž=y j.ʒs *DegCέGeu=q(Ϟ˿F[[ Wg'Z4oIܼ}iAvmNxJؘKprLL9V2>`Qrm=],Я76l?Sӻ`P3~Byi3eˍkWf{(`eiSgh)Ѥq#zvyd(fiʂ93X~ röxqZl.]7_0**rڳur$4jHtL L'665k0b w"۫;`uOu,lrԨ^ .\a _w?oE?+~v6gٶc715IMMM͞A߁C3`V,W*MYt {GJR%?f$VȑmwNSzvB-랂 KL{ǖ Yv +)$wڳp )δ2+tSA WɸyU+WUu3x#UӨi 7:dk\eȈx= %&&Ҹy+tlp @ gAv@EryJCb >@,Ȁ3W"a]ԊKi'O!1!οf@  ?a([#$@  ܻ(͜ñ}zqj@h֪ަ>A k$@ ]?CKЮM˛F ҅dik#@ YG(} 04 L @ a&@ @eKȨO?@ @ h*@ @ J@ @ @ @ J@ @ l9=11/o9ƳgQSSuQZpUFa9x=Ua&N&1~kש+o޼eڕ*XWW-MP[CCܹ©nU2>{ΩgЮ ***Y4Ya[Ǻ%]:uĺOs555tt1/RU*Յ9rdhvهS:˗gT/BzwwfسC!}݆M<{ǪlݾGA33껺иaTTT3E)Cu{~9rӋѰAPI>>E|(_ M7(Kyu6hiiQЬ-kF@.\2Kewu wҽ7*:ҽkgϐh۱++.c'eg֜| b鿻*ZNNuN4pu]ֿqi6nƫׯ116鿍hTQ cͺ\rH O&\7Kxzys^ QQ4+@fMWu+usfN\2Iֿ݉9Eiբ9qqqeĨ ߇ %ƍ\~G1t@tFVS [Oѱ}\#Eեzds&LF;-Kgظy+ڴBMM'L0?cnbSv$&$[Zˑ>sb IDAT̟;ܹ.+::bog+>p%>{J`eiA6RGoA(}5w>vv\zKp1F0x 5{;[)YRB&qY|NQJP>Ǐ9ɑǙ6eB[gꟽzt`A3"8|SD[K G?~Fb!;ȏj!Snm6nʸ1#_i;?ko0i j׬A.w?+W((~&L˗ܱ=&&Ɯ:sAZ5SNo؄6-[4C[[g3c\"#މ79r|'OqOzvBKukby,[ҥJQPAjT*J144HUIr?>hjj*#*hF 6n}X {;[([#d2BBC151TTT_p!  O~n:;Ѱ+CFbLg[a``0fl<015x1)Ç,XL>Dճe/K$KY]sYѬIj׆n;w3[x)wXjBXv={wmC+W.ZDڵQ*"W\R7o޲r:]L&tKa1/Z[10O\211X3o!=7#/o_Ă3Y'Oѫ{WriJ3ɿXn/\wRlz솮m#Y:G%OHH(koԔzukѺe 8y Slc͌_p4nO3k뢀|q_hjr === I޼y1t0 ߍ6MЧWwΞS97[[7l}*f4o%.G;< ###:Qf 2m[ey-m~ڵCCXr/]&..;[[쎅TFpW/_:A|BU*Ud@̙O>b.\DddTpp`~,^GPInQҺKCf$% d;O>%| bccY _pW<&I9r8qt9S]vTiٶ#njzo.hӞҹc{Ɍb=@hXv6 dB111]SgǼHazt`chhй~'O_&޿MΌ톯I߸Ire4~ w^|I8g>>rgϟuQ+y@sg{G->> ChX ѡ][ٴe^'غi W5l"Y| Xiܬ3NP^e޺tWزm66se˸ZCZ5Lc}vú 9u !T4d־͕nZlٶPf 8r܃`.jCy; 943we w;0o߽ȈfM+IQZUv˻wYb)111l۱|MA33ڷmE*2NuN^~]i߶4N' 5ŊYcbb?-7Ͱ-߸ɆM[y!d`>.\\H&I._.6nH6*=Ίkw>2YuFF}$FjJϙa)y-CF5F2ORm&/WCr=J,L&@[[[:mmI=?\ᓄ (ecɲhtdG?4*d2ũ^6ŋq-l#|PA:AUJ8߻ ækderɶ>j ׮B]]Dƌь6555֭DtLt7o&885Sti,ZIȕC.w*^~#tAAjFF{~F/ WʴI|||Z<[ 2* ]E]իlںwLEGŒlٰU5Ui8iS{}1uq؟WeO 9݆Śuy%KCUUR%KpOsvܺ};Ym,-2T$P{s~ U+Wʴ tYd!bDRfƎvqOfjjV%ҭs4>}{L7-88~M]124鳧M (8>={4lkV.W̒/[LPP&Ocwj ׮ߠwGz:wlOdT^\ E`* ʯD.^F^1+1a4vl u]:afVrrCCx9{vSHu;+,VPQQJJlٶp\P/oW Ww`٨pRFcocqyڶ!|d YLVA.dpΘObWP$t;:^I©^͟M\\{ uj$|d2|N2`06[>ժTF[[>TyRTL۵\2q=IiQˎ._1/_ujפKNLL$8$850۷œL:)QREJgæ-%ֽQUU'| mmmnra{/6gT NGinoT^ժ7œ.NԫS;]q}ii3GЮM+,-1*ݾI>+M&-`9,]4+>6lJ(jeEdd$׮˗ ЬQ;oܼ-vТySJ,A\-m-d3 mmr/fM}'455 sISg0mDeX.2}\ѳ[kf܄)3m89s˗|9w | kiټ۸IO*;/*;gȬ+#?+3%˗ 1R%K0j_fL&C3Ÿ!߄~%J _޼)]m;vRWsܻ~4Xe8ǻwiբ9^ ~%? C&a/)vًL93$!d {ڴ ?\q<}ƪK‚]?ZrQMMMwݺ(hLҩCGw׺=Ϟ?HYj01A CWG s@2f wwL9ȭ/_c0d79w㘇d:Xz5zv뒡"::[,ZB Rz5;wS%<&5.SbJ۱qVBBB1448q1>GG+PR􍇆****|U7O2{%(aoǀ~;y OoNA33\]pWWZ@% 覕c^bccYܹ劑;g_ C-^ :)]V:wz7̋[NR5>^'|~C\]S').ZH> W6jBBDztL%޵+ԫS0g.wreiI$ SE(/o^|ǏAJ{ruufiҷ pӛ%qqq>Trr>m:pz\t7o`,+8:[C~~[}5kPVu7vjժA R7o֩C;+U@.9y ~5W^'$O||<>~R$wn=BCä؏Oo˛Pʗ+˘Q#Rb;DGG9ZaƁCGܱ=[ʿy=7or/:]nP\Y=z̝pt(ϭw0OleތPWSGG[;Ue@GG[nҤ1=⸇7meuTRW'ʖ)UUUSHvEn`A \n$3j::\Q=h>ablL`lib4RHw sDDv]VCy|[>3J. q!8$8:PXa3$Kڊcמ}nBWғy,-ٱ{oϾzzlcwPbwed$\Qnmُ38:#*߼aİAɭ 3а0-#-m-ƌ(IeEP~lQO751T~l KΓ6 :VUU%_޼>PTF>[DDFJiS&g܄tǗ6x/qksz䂗Yzwb A6mOhhhM|y<&eJ&11?>]C zzz/^\{)?iB2SRJ%'v;;w$A!#~v[DDDJ掯^&e$]Ұcyʗ+PblmPWWv@U*W@zs.v>9\x(\WL!|S=]A1cy|JVe]&cYr ~'iVL:7KN6m{H_quqf>X1k.^Lxx8Nێ)IGRLu6uN OF qW#O2\1xñ6<~򄸸8E7@Yb111̙kܾ}GR8:'WnVZ OY[ʊݳ;gΝӛƒԔmK͘:)UޔioHaepBY~(_`ZZZpV@J)^:gq;.qqqԮUC!v"<> mm-òYSʖ)jCEg`^'A!uFfg&;f6%v=@4/U$ѸQXšGU:?`~)s܆Ȉ .3w"tt̜3zu e1MI 䇔>tyCխ[kqU _?4nj@Ki#&xs d2r !!Q?c#ŴWIGT {455;QUUU3JGfjjTT>Yn5fDIqO/,ZJm)]$ܻw|oJ e|}֨O/_2U3o yk֮gY/[$yʌ_wrAQ+Kn5UU,-(io;Qr?~ʾE'y[jjj;4ɐ4^}>}ӯOO6lfێ,[ӵsGjP\pn=vTՈZ '<66Tc##--޿/// cNuu5焯 ⢧CH"# ùAck~GFEq5§Or9rbkS_?TJX5+*bccq5ܹգyLMɑCi3;0/BbX1k<<)]dVV%H >1eʙ555?GǸϟS OB f㦭_;[YY>h``@bb"QQș3'Jse{>ݺt$WΜx>ziO?ӧO|DtuSϣ!wQ}!MUM'd~#G}.hO}:wl`tW!=i1(HRep2]IN1/R---?ȍ㇄~d!@r KSQs@)ݸԤ¬SX~#s,"66{;[!(ܩޥ2bVč.~qx%`eȑ[n&irNeٔQl޿5B##F^e?{~fL${cbbA">/Kܭ ~*UT qW7u!)ݨOJ 0]=]l!u$0i"d†?-9'O^e} 9|4h Z ʷIz\|… J(~]"Wz(w |=ٺc+׬bG\P>RQQ1%Kؓ;S,PrJNhh]=׮];;[TUU)Q?nOA33ͻx ***ˏ+Xi*Y-v )ph;gyW;w~` ^ԬQ=r|Fstz&},9mݪ]]:1O܍ .NuUznU5Mbtړ HYhh_hh(***Yގp TTT(jeEΜ9Yܝ7n"ɰWRRռ\qOoN=߁R2<!RI(۾ʠ"}_֬@|pq8^ݏu,;kz!%&&r\a4')9GDEE19I1ْiEIY@ 1qd2zNĎ-T̼!uFVQFvl KY<Y8owl<ݺtcP0y! 4Ͻx ҂s/۔V+5}}&M]߾{L&S8"POɎ ~?lܴI#>Tݰ L T(K}'\])[tq] <}$ř IDAT+-];wallLcWKDFF/_pEj֨93ӓ^KHVttw}x1xg_P[ rCI43Wڶq݈eɴhUkx]uU:Ŭs^iӦx1.^"iA%2*Jr /\"<<"mǏܻ(EE}ڵ따O,эC]C=SˋuuunܼReV@~"uRxgO>3 Qގ+4߼Q^z͓O)^eJ{|M5%cfV 6g4444;gG[l OSfbbb9v{ 4oڄʕ*`]Ԋҵsri}nTTVCFPR͋ʱhiia]Tp=3g155PcөO*ioe>]q_|aV ? "K srÇ,ZLMM!jtA t>Mw vgkhkki6uě1k lIhiiQz5> f\v.aaQOkʗ+C>k.ڴȘ /r%YU=L9ҭK'n}=3L>xȻw cclmJ&$w*^2%[94[[>ɓ|"x7^AEEJ+}jU+yMWbb0s|bcc^ ~744`]Uc.RtI,-ͥL: ЮcWhܰN'_i (jjjԪYOOobs.U>=r ҂cFwjOxz@CCܹ(f]IP-Ůy-fQS\VPAuCGXq3ŋYlf1۶]VGmmʕ*`aaΎ]R"FFF̟=0ulrhjRR8NWG" [iQEE{;[_NG3n[W" ӫGW*.BmCr: sC&q|ŒEYv'!!!4#CC,5Xb%*hFvm6>eWfيUdqذ`,ڕ>yuu5,-=}\Np..!""-t?aҔʜ9mJ{t'!>!G~=f"m[d5jjjTTKWZ,;իC|yغ}'KWKN0tЀ>W?vW@.s]`lm3dPiVQQal޺.ŊUPe_֩f=թřZMf&9::L?hԴyҦU xHbb"׮Oۡ}ёːۼi6Wq]SA ǛnQ*YR;zD27zwuړRJ08Ew3ڴN#KFm"ko0f$ږL&c07"#"Yx~J3$ga֍Ϛ3AA̝Z7`Rnݾ5+wUOӛ }!c?nb*ÙsS_ s7^Q' S͗7/nj鳬] x>`歼|&*O!D -S+K :uuu&h&LL&}>qM6lBjU:o< 8 ҶUK-]iQLiNx>&3bbb݃"}4? &a` :#CCvo]ػ{x13fԬQ]~wuO",<ժ>@ |?ŽK @H.ݥRbhh~m@ d{O@ |cΌiv ޠ@ !>@ u]kϾW2Z+񓧬Z,{kpmѻ?;vͪyM;wg$|q\,;}Kp2M]u{4u} P{eQݰ3=NӲm'*רKR+Wr4u7$zg\6e)AᚐPΘMS3m:tA]׆8T/~#~B#~ addV@bbOx6GJxSqO>t::X:9{>MO-;ӧϲT@ B|*N҂S'\ ,WPXXaI F+*8:\|c&`fVi'ЫGW^!#dunqYtlό)^̚ff+VAMM=g#@Y̜عk/&gΜRZv=o||<pËbE0LLVTp,έN&8/Ǯq68o&66MM]le.ʴrkժɚui_4440קN ;s=^'|011fqm;tuup=OR̺(>|ی9\ڸZuzu|ǎ{ѧWw.X˟I=vغ}'QQTp(Ogvlـ9o߾Q̜6 Oo.\-5CR9DGW)Ji>mǮ޾" )UWzz>@]]֌:s" sÓOٶi۱kqJK(]S'}s>r,=fʕ3._u|@\9[̴Mxf!= Ϡ}TQ{ɓbSܚaia.]3i H}zݰlm3vfK׽~rm޹#Ϟ`J?fdg߾{όYszFtA:$gjN97oѡd2j׮!ʕ \!_޼ԣSϘbٲ~ ^~ò+t_|PtґZ5KfDWW'xXx~ϛK&l7݆q~ %>!% P.Kϟc&pMMM!*c63թ]1tP"G=EKWݻ4\?aX^Tp,/]<šr OVڏpU 13Ld@<Ōk2{e$QbEL1n!+\2m&~t՗Prݿg`$&d1D|@vm?{:ɓ AC044`4n؀&q_7o6fȖ@ _`oӊnyC򖇗7۷-,4M!IfT# _`Ϙ5^ݻo6jV ᣴh֔yӹC;CBlg_УwJgƔLᓐ@\ M 9xy޿[8 +? \y%w&<<Ϟj-JuQχCߴCG}.͛P7o޾CiN?oݦ]q3.NuԿ/ vW8TO^._-͖b`$w044`!;ժrZ,-ԡtC95i91+PѺesɒ@PUUEUE5ôz+)S$3MLMM8dݻvƬ@~'6ߩC;\8ӄs.,g=uQSjej?5kLWt]g>|Syop! gFvԙVPAF_Bytp1\9V6o(v\!@:b ˥5ࡒ}BܹTK}!_9111!W.s@nʹeNM U.@|̙bɑ>500@GG---<mmm{yc]D@UvREߤ5nݹ˪eV&U6max T)Gk|ҧ^TZY3gd/ ?H,Y8*)y AjU?vuFMMTizmmmБc̘=>|2͔ys>| ViaO-MM%}uJ#%THllƞ ^}-AfX ?ӯ_ ^#5&6VȤx*#ɡ_`f8{Ѵq,hӲ9/_b̚;];bZL>{Ƹ@-]AbEq+hU]{ry;ڍ;S T# .->~b,3а0"#"O d٤ A_ƒ]111Ja8P_s.HB\k \T||k>)[PUO/Ab[-/k=eO;ϟ2grW Lj?3d635++@pH+.]ĘI]OҔ)!!JqTIQjeULXX8W<1.Y0 BˆR<3p[yy$J000w)G,KaorD@ 2 C}r2O`) cx*#E񋑁Sthۚ^1dhV/_tHf#د7;9?:'N<&kg7~ƍ(*h޿Poh\tL4Lkۿ}ZMO!dFZZZX+W/^rȎ|>E\ǂˈfŒ4jȴs&4e:˗}2LLL:SuE s˛וG2I3q1 C__PD1^y˛7oa?QT65ϟ2,Qo!!!f/_!*:Zq}y(V( / es BSCzb\ׯ*ə|JbZ45sߣgHzFc>KT)Gk$*㗊ߟk7n&DM ؔf}^%~*h&6nt)D=!N9K*usxǛH}Bll,s{Pxۏ˛\H$)ʥI]c+CսkgN:嫸ysmT*ֲ㱗7Gq=*CGy.]嫸q6np\ƌÇDFǪ5 ]f\~(s߿s[LS>:{?\ChXO=g:!-i8tISsY޻ϡ#8}̫3|3zg,ZC qO>#<<-wrTرs]:G[[ \qwm.Lc?GUi#n߅ohTK<_Ǘ/ 2 @ imU*/ǐNlپ7nqXj8R$5H U/mR\ƸNd\qG3kihh0sV3pp  N84Ѱ^%+wR\qy sQlɿ}s8H7o߽fZh6.a]Ɠ=?\yr3m{¥L9W=Q\8k%+Ny9dO} 4O2|{y3|$~\+[j;[Бc84*W҅s g4&Mח cʌY4i;[UzzwqӜpؼm#QsY,ANXx>-dO*N,,=TPK7&Oرk/ ZahhT&bSuu3e<۵VX8o9rdus/UfXYWj3)=/V+pO*+!Yt9n#ӧLJS>9spL.]cNpc`*iIPA+Ch)dhTrGM(ZLgԪYCiS]:QΖӨy>|p4 ~{ = m|d3SSW-U-\Әq?yܹs g7굌9B}3_tه_V/|1!AԮeϴYsڳ;wUv:JH՞T@ nX0gM4bמ} y y%7wVe<GJ㑤IE 4u6aDż3033c}o{R˛y }&ƸZgɖ- E&qLeذnfMG=rڵ'.HO+] 6͆M[ز}'ʲ߾}ivٝvmZe8tдe[5mT"+Ws=VX%DܹppEw!hֺ==uyƙ@ ɟ4/zbSRa @ H ׁ,O:r66hiiq}7lkbG$@_<y d6Yn}zY,ڰc^}|)ÿ?屗cn;p2X8fj@  md餏&>bמ#GvztLR,j| uuJfŒ*m ƏMpYf3=_iL ƍA1@ Mݻ>|DvL8gn}L=e9;~?#Orie'Ҫ}g>~o&ڗ}CJ]N-&f@ @ !bG @ /$IY2 @ @ 2TK@ @ 4+2Ns1^z:EC6T(_7o3u|hjjr)L2Mk:w?lp_E^K-QbbbנZSS#CC)C:UMu/_tD&ʺ زmȈ" ҳ{7.2|{ct)??mҨA}S^DDánr2" .6e:'@KK+K}̎ܽԮiOe5J 4t9sW|U:$E'}.\'ۻ'ڴV׭]sljؐ/%v8jJWL(X g=Ϋ!!U+WR\7oքljKE_zJ#{vED"Q?p4ndddG4jcYh)nZ.>;w O|["Ӎ(3]BLL 2 d)Ѿe_Caz=Β(Q"^ 23f}5FB׫$]"L]|Ql:2] 5~ ٰi d3ժV!4,M[ѬicfɲȞ% 硩":$E6?)Z$4գ;<.pa;cW+T8jݵ lХ;uk"88 /!ޮ:#[l>jkRؔf~JO>3?xQ2.Qre*U,Ϝy y 4G?q4s/bܙ,_/_ѯdɖhxMYn׮#/W}{rh'ӑjٜSgqQŇ@``7r}ș#֢CseNp%(^(/Hޔx Ns4k8ُ"E p'OYz->hiiSJe텁#`n#Q.nقzp5&NL|J(N&سX!n/.1??Ssᣜ155aj״GGG'ŲU_M#""3Ot҃q.Μ{Pn\9}H$j)\P >zwزmc)TX6l©g t܉v?]WLs^>~K*_HŽϳOa굼}\ۋʕ**ua<̇135UfJ*Ikdh3$WGn+GDDp)jUWȖ-ݻtm \ľJe/t}z/o؅/߾E`iaANn[ zLƽ8v$._eɔ)d|녮OJwҝzuj[_ 66{UgŪ5 ' 􃇏p>Kҥ=jZs֩Ŗm; X">TIl߱#O.E dH?|&P7nr;>}N###q_/Lӫ'˕UQLINw&?װSIFFFnf.^L`PpW'FC"EiIϞHP|9>c/olJ?n섦&2L6FD"]ZA*K}z*33S+ʽTNQ>r 'O)cpkTGi֤1֯L:1y <|$&& 2---؍XW6FCCLI|QQWWgMDDF$!ԮYeʰ`Rz\P`w%ۛ?=wK4?۶Ԅ޻1U$&&&r\[ 4, }==~N6}==޽{Ϧۈ=R"clb&8{#"" 9v^^XXuw_~|j1*!a]o޲t<԰)]3g=st)V ;ţ^MɓT|/A_"Jɑ#{qr/UNHBӊAxvv uݺt"w\ڳ4sf(fKc9A}z\ƋXb) ZPʊn={'yterhiiQb<<.зWOD&ѳ{W*UtRcGR)eM]x5KU$Efʪ\2tJzmmm {̙CI_؉Sx\@v3lDD _]t9y--ˇ䎝d?rsdgq\qU*Sʺ$7o%00c<|D:rodƃG)UJxPPJe Hm9KJYuI Dž8y#A}H)uuuHNNUޟ8jղiFJiwYjtٛ .ӼicLMMP@OWW)ߠ8tݺС]TħOظy<** c܆$ jjjN&J;{ۣ[@.v;vi!!!l۱+V*UٸyҤOb- IQbd Zl'ΪH]Fׯ,Z0Gюttup?IQn,; ҥ\"~~ضccFrߓ\}&Ȟ=Ez:>bp5pLP/^b U*UiLXWSS#9O'|< $4/,X͚пO/nܼuӣI㆙&ߎArd_JJ&Ja}6l€~ePql2d2<}Fܹs˗S2400XI;qGG"""dHR&*G)]ʚQb4jJqò Vh}PR*/=jʔ,Q >zmxүO/.]c/Kٳt1K:ɨSȖ- ;Ұ#޽Sw6d@ء} L$LTy(Ƈٰi T@>|xAtt@5Xb5ϛ2>1ŋ̉#)Ҏϗ@y:Ӑ IDATyMZJq*Wȶ Iy!m)U"""U\dCMM@IY's>""m;vq'_>!Z*%&&\Jm3 0Fu۪LF Rl+B ]]_t⮁}}}L%ƣGJe>r˛Wio8˴/_ Zq֬ۀm*+Z$ɉ8A)?ġ=Ww8\<.*U}/S{R"~ %}r}LMM&|{56d`Xg4kڈe+VsQjլcm5zv ;w Fԉ )5cld>}N2ΧϟS}GݺYvW^îz5ΜE& گmm-  88//qUxRlx`@ &gfvBCC\bcRRhiiq҇Ҡ ׯ4ƕvoccc$|TTT$)>ǙT?yҭK'ؔF__oof[#ߤޫY  ''}4447{2/_}=SbEU@ic[[[… cFV.GQSS#&&&Y_En`blS#,QDIRХ!t ,ޅ󡣣w/ekUڦ::0SܰTzSZr"o+Il$9tt]m5.zu Ƒؾc4mܐݺ ~_WŕHpAA_qlL)^llS^$Gb*$$$$ɶ+? <<eYj֤1_e,\ mmm:uhǺ 񓍍D\z^WTQ'HפŋHSmqi455 Ʊ^)ݰpLX,A 7>[M415I`r8_>yPl+.^b~i2սy c##8T(Ye7n"_^KŪԮiOq|}N100 0i˵8Zhopvyg& :^=?s,ULc<}\>22x W<)]kċRro/ztu?ɸ122^4kXiZ5ص{/;wb0~9;wYں$QT5+VA*t)>P}8t(vի)\sT*?K:v#Np-t[6ǍM^S')""#e /_y_Y+he&/^Rpe ,a#yޗ'qpں$p°ȓdRhhhp)=}2Rȑ=;ڵԙ~H]d ڰ!pI.NIm}Oʕa߁ܺ}'Y/55 cG1m*Nc\X4N{NG*eJ(4Uq][n߹ؓK:'ݓ>viUky5U*W"::3<~&ڷD")Q 9s1IjьO?zzjײW6o:܉V-#{v{>+U-ժbia p9 555-^\vZ6oԼuIlɹ!Pln߉DžTR{ko~ɛ~y[P˾͚6VБc4pt w.s;{Ҋ ޻ ʗEGG* bWݖ/8y'O-[dlܱ'MulU}V;~giՂP֮HEю۸c/ymm}|i֤q~ drCz"O ؈SbE R-]cFSݶJGp6lڒ&пodTS')).lW}ȌYs|kRٲe"F4oژ7#ɰ*sx؋nR,o_p&j;H$;x$,-ph߶5 wܱ=ָؔF}G^L8.YyӖT}P4?l{˛]hݲ9E &0([M#V&zMMMJYdϾ,Q2V^KJbFz==]7mLyGd)R8#AzS>{L&K 0CC:oۉRD~ի4_%ѡxbrC޼yK>~C cZ2e2m[SЪ}u55zv*]RߓTETR264e:]:{Ir_l}=G>ҨA}ӌT-XvF9#J9qubɢ{ DLL )'19UyB_O ,_-ے3g:oSg֕y :fNBӫ'ZZZ8t_Äqc6&N LFllbTmG\Xh /^ellGW8J/8r8QɓQ#'8% 2D´ɓؼu? }.M.NIm}O$ ӧL}F=@pH9rdCnZZZL+ڳ:X*Ef47[wػ c@]M=J y--055j1RŽq;<z2m*TZ9Pt*PDբ2tad˖y E I~Ht&yNMHhh'N&$4 ]։:ٲq9;S ?u:ٲ-""$8~ f=,[4O{._4mJc@_Dvm)mgi鲥ff j1REHh(<''O佟KW&Fà}Z E]Cɖբ2/^}vբd 7of츉8ԭ~y%ЮR\u]ZSC3Seajwҩz\x n5XQ'>b箽4nԀ?[{ܲA1nJM IĘ:j*CCM̙95EHP@@_)\ \ HV2_dͺ ݤOJعuCV!DbccvÆ 5keT e݊R%KrntttKߠxHF կOݻ^|ɐNvhD:ؕrWoްnf9_I뇏2 ۚhڲ-I(F2l߹GrZܸy]{*\x^K1no߁֬GM9g>*#yZ]mGF8%4,w0x858ұxy(#s)EZo҂ ,˯d2n޾IShФ%O> *:[wRvM%zuj˛lAf[ˡo_*VW ˄qeyqZ@:4w۰y+[w־.3dAA@f8t5Ѭu{=Qռ#""p }]:wDEE1s|jkHMh)R4MewivF54iі6*/ǽ {ѽW?lk֣]x^W6Y;fQȴh ܭkw0vА+>8S nSg(lg=3e<58ҸE6mٮOZuSo Uex ]zƮ#ѣw$_qHYШykF9rL7/e]3S<_T9灅E)47mN&-e?m&}˻~vO-vdH:f5ڎ4ji3 Q9r$uj)%͞}qCEw20MygTfϫoUrwoJX.$Waql}Mfk/_p26m#GW=Slń Qܾ}P?O+G%ޥnV5ojn߅juiڪ]w;Zx^mn/Rjg=:a2UjS݋еgla2}M[öf=ZM \#""Yx[Qլqߐd{Gm2>SӧT\I)r񣢢22ҥ655QVKm ۤg+9sm+_!<KͥwVBMll,#ǍA]]R%K*~؋3gTt[lьWT#ɘ=o!Ǐ%;ve+6@|smE-tܑ,[&YW_vFzFTTKd|hݪ9[elG]+ۼKp>Sݸq'OȈfM_8|8emJ3i%{R)IydyR%K:KASSgi0i ֬k֮g`>+ZPnܺ2|bbcqkm$8$ʫ)<{^=aaS2l37',\G3d8겸t*ݦҤQ 쇗km <<(d2f]!`˶8vvYԙ)yF:SR&w ȏ@pBL8\WYz9jj?-X }=rnei.TUYZtX͚4b]װMTuJMu~~pv@2?QQQx" L. uI,XDɒ116NQȝ˜)qqFqؘ ӴI#,-$zφ[Yb5NUX$ zuks9=}ujƯ>r6/,_Scc[L@@ )cFņ[4t${vlFCC> 3];w$)A_u.tf= ^|ɰ!“{Ihh(߼e4GyBガ+@YU*gcZlޝ[.'1s|&OTm-"gqQ>zL޼tl߆&~zGDMMW_ PU7Wg݆tЎree+UNfX!+x Khjjr{K;HV¨C`1woG]M M22l@ Z-Pa;֮@ķΎe}Dշ~0 IDAT7 aa}c< tɕ\~%=֍/*ػ(7ߓqÃw @ @)ŽPܥҢ@q;%G8 Iy;3۪}'+0_6Ϯ{9xUw#{66 9US@~ /3Gvrʙt,+7zCEݫדб8r8^aXdVY cfqUJ*5*Ҡ~]^|ͺP;nBkcaaa\RDT@`ZR5_M[~F˕;rxZ܌6/_q Ħ-[j#Yx!vvҴe[wq|4nڒQ@$1|3VVVkq]$w6*Rr#{v =C`ȱ˵7ص/{>g`>+[:Vޠ`ckhJ+,Eu(RZ+9usb bt;ztjnGr:~8U҃.6V 1&YKx}-9 zn2ALЕ+Uƚ?d<ťWyTR9}.ZL3ׇT*ɝ+&7< ΪnU(^(Y]\x!6ngq-.iVO'8wV\Z- -`U$CjkEg'i7+(8|ݤQc߸Au .\lm|I޲Mo2r˨2o0n,?~L\9?d8/^g  ʵkI^޻2HOM©gcuQ+&0.;l"(X I09ܫ\*Tx~xD(Y8^]|ӸYKi@G1~uD$gɩ.p &X%Wj_+t:n%P}ӵg_>z̈gN&g'Z\z}k 5 իDh44l`j{UxA@@`]+?+TH$^E{?J۵/:wEF_Sv}LI@@ !]$KO7:k2q4 Dkղ9'OaqN9mP>_5ƽjڵiҟؑeܽwSgФCc=o!?`ڔ &QR8$R0F¹lg%<ibgoyǵ`d2Mј\'v&L7dWl;o650~yMpH0Z6AkSn'6Qݷ7ׯsnm܌iN]!Vz\6uOڦ#u:㍶o.NM08;ϻR$J6k29ĸpL $4Ю/eľprr!Un{{sӋ_~^5̡{~ :Us}z} l"2q͂93Ya#CFFVy 2(Vc:xH:o% ΤߠaL6&ϗHC yVþA a ^%#ss3"4@=t#GFF[CݻwQ|ױ=NNN(qP똈 O{ZZzIlRUj#9 kaa9>q_FBXxIP8Vlmc]+DFFqNz,9usb0m&yQ|*}m2RE{?R4y{9g>=ubrqM~>˰ 6K_.\LHHMjnomݢ9g=ot#KWǧ@,?.k"垿xA)Qnj7kX8o?+d2}H=^ިR)n-G |sV-K!B!P*/V,֘~́'@" tQqQՔ.U*EB!B!tB!B!Ȅ$#B!B %{V:##RAbMK.u0r 4!ʢ_鰏]I-rq) ޼n{'&d<yeb&uȨxdB19Pm,KB!B!Ȅ$#B!B %ѧY)B!B!D>B!B!}B!B!2! !B!BdB$sqߴatړkeQacΝ`Lڣ+WE56Pac_ӵGvkmؘt*HMrJi'D4EF%PV ʗ+k;NT*!?/Y{ȕ3'}zur<Ğ(J{R >c933r8&CՍy###im'j܈.;H._a݆xݾZgԿ/wgƬyNNoݻn=0LS/_89rȟݻRByc_nc㋵5E ba888|eĺˬ]wv X)H^WBn]g݆M?pq廎Lc>gӖShD\9j )IJF-}B`ހЫg7lmlx 6o!44X'ٴe+mZlxzf5XY[苆|u\rrQƌĪKț':̺{ \tmo ,՗Q /1jjVF b՚u1fmHqH:>d~~ 1B 0vCXf->b(Jz=M]:~ێB ^owhi :*iӪqwZj ;vs*XaʴL+/5.KAPP[nOTDxx87n6 DDD0qȣ4i44kiֲEsj(z==wl={A|]Gyܫ]=~M2u>6j1}(S9sxV^KbE9c@qzz? 8x$2uy._yӭJe>}Ɩ=b^*YV-1WzTreAQ|T]~FW^Kҥ4aqެ..;;O)1g4,--Ȟ-+#njWu\v93Qb*!3jkkrdoyع{/]:w2v3V/^~NcܘХs'+| =ҳnO= 篿y9zZ-!!Ntkohymt*ٲuA=y摀 ~Ο30(xzzaҩC-Ufff8;;ǘsmčj*VƆko^ՍKlyWRCs.:j^K ,,X|y>1}xR\zqGVDo? -s+[[[[<_a_׭۰WҹS>?{HX[eK&ZM^8^Oד$(ё`pxPb|o:F#zcme$J2G|RLFS-cffF8{?N>|uԦi^Z]Eܼ3'&BĔ7+ZOQh7'O4}I $/qvnyzoԮe-3/|M}Ukо-gΝgİ^FLȞӧĚT ( 4W)w$i̒`㼾{>Ϟ?O2RTI._lml(Y!؊#.u&Baڌ٘SFd/# #bcϖ5+۶&o<s(];weDDD+gNԫKVѼ۷m/F!22J3h`?͘u}[fuaصK CR{D&j7a2`3{ljќ1[L/VдEgƷڰoZNO4įb̙9572s<(Z 7WZU|]F4B&qvڃ/vv-\-Pxq?7 sbT+ѧ"ʗcYlش9ɑ=;U`o[ȼ^X^xhZL+}ɸUa,]i3`an}{0P(1u2׮g; "[|p;&N!44YӧRrXٽ+ܽ@f1 G:n;8C/%? Ф]ԕW)[LZMdMŸw1RБ̘569buL.ZkXjyEn{Ƥ.]dTRg><~u6QfLqc<|Ľ{w_B$z=nR !D#u{&A!2??wRXQN3CԮI_wq"ɤ^BHݞIG w e$˖EB"zܤ^BG-U_.B!B!2 !B!BdBB!B!Ȅ$#B!B IG!B!"Jۻ|}}?D9H1g'G9?39&#.IdDRd۶ w؉;1߸<󽏶g/SeYTVg%)PV^˓OSe9K>~Ns'}L5vǭt?|zu6Ѥy+i@>eS;&[Qt;۟!h IDATB|Tz1c^%$o⪢|8-NZk9 U>5k[%*S"5SZj0ۛ+Vے5-R g EKi- >;/AA<8;;ʲTj *K eu.zt:] ',,*n(ܹrƛo-,[-aP8W>>TX)ČYs~&]?f%{#͙#ᱧGns3pnۙI˵"AƑ=[6L%<7,^4PZU:o #:#F&Jbռ }C%˾v&]{aiԩUӘ^v}Z|ӌaeImӊݺ 5-P >>z̗ ;w.-Kcfݞ,]7Ѻ7 כ7;qdyMy& ߇TrQUe&EII%.Gp/捩a}f ZU-b9z@r"~_`=*T˪s!5V*xװo)r:BeRR[sR<|粟}2}l m6TTѤeH|n kn0i Pd Ξ8kcŹ:߶R*ԮUSӞ>}Ukz:>~"#h<|ʕkh46i6'EtquƔ/W,YbƧR.d D/ o ƖB݌iZf|>$|qIymoƍa ghm=|^x+g߁Xm ˱|ɢD#ĵ?QVqM{ΠI/hX/Bz5nVa$Wu&-ys-fZ *4t_G *y ZSS5 Kj&.qTK 1CzxqR'V %j% v K2.c'_Fy@KX[Oaj_˰ڄ)jFk%#/s9HQGP¹lg%<fݰ!#FVvM};88/ ??׮oI/L>J7n]B灁A .[V-~y#0qhr|"Eޞ];w_?o'&lmm]gzE56oY_(^cFuqBt9N/f <tr7$AlZ*bF¦3}QQɦZF<߮ӛD=kM׫FN.[mfNߵ|I*Z+ ѣ:6Z #b fyp5먈eT,j*1CA5rJC$ⓑxL|y2{hZ.]ʒ+6r,{vlwggnzxJ &9M%* uGӂ& ~q7bǀ ygXg~y+Vrْ3g͟k2DRKfйw\rf~.؂0v*QXo*?q,+0tLjEvJz;Ӣ2`p;sjP!H̓7zf]ӠRh(Bjƕ1۩8FkMDtb-n1t٪Mr/I tx+|o!`Bx J*U5wtVKy |cwl"!Z, Jyi+sOo7qU&75'ժYZMm;xAhpV%KÇ1u;Ee8r:cORDqcybnsO%k{b*W fff;.66|Ѡua_G$Ǹr<{pk7o %J܉)9%)繝-Ef_. ([?pИVmw0 FsJ !H=\ױa$Y-Ƨd o5z 0S@H`j%TtQ_$N ;Ž::3y/%QGooa#iu͹rU*WJi=AV1tq@닗.g̝i4,δE PJDg#44PJe177N߲tjPAlRI6-˚0y*<ק'\1YO5ՏB< z1HQ+hOWeUXǴ[r) ^xՓR[Vxj s3PG<*c X(s䫛Cf <èqڎ:Uʜm l4z?ҶKX(Y%D9͙q-s>^ޜ{!z֡T@լ*cwp#tEY^5: o"#xke [S2wu S=`7:I7 !EwD8;v&|^`kgKJط1Oݘ>{FMh(?-{*8o3fU7#EchuӛpH"#c71u23Ν̙_ymgk˜SYh19sХSdmϻzu۶RXn ,X`\\YSzub3a(~Z^h8y$`єJ% d l'^`ooGbh߶UKJEtDFEFF&)-$tq177OyV8e:/^&Lk:]̤i8E8ZM2Iu:cΝ: 0 ŋx|1n޺^g/cLB!A`iO+~:xSZ3cBs,U0Ju2}~5yO$55co"yZŔP( L|-z5NhWZO1m%P+W5r#"zGa]O먞ME* xFOXB@Bs3Sc%M!$DZocQLq | *<ӻB!B!DIG!BLfw].#PXzA| B!B!>a(x:ˑw !B!BdBB!B!Ȅ$#B!B IG!B!"B!~Z ^Y$߹k|dVzmGpp0 ((u7OO>e\t6|ҷWwJ*">ϞcxxxBܴj 5|*CGsҥJhܴ*H}B!䜝ɕ+$wCZ5>OzmuPTSJl֥3ܻw4- YnִmkkkN< eϟIƚŸSb(@$#B!D&ס},,?Ȳ?VwrCtҙYkK-k6~q>fffPB!7qX\s2~A};A{{j׬a2=PiWX !Bɽ۽,] [j#ɞ-+-7ӵG=~̦-[ٴe+OJ労= ͛P9NcvC.vFn{ҒڵjзW,,,q-[qӓ7oBJQ?Xl  o;˛Æ57?/YƑcDZỎ苆nsBƚu9v~duqazt8={ٹ{/O>ƚre0rD\?/YJV-Ț-ki>>cG ^BH!"M D+Y8<#-Zܹb/҇}B!L4Y]3j<|o0w4[ʴiGGMX` /1jjVF b՚u1fp={NEheC͹~&SdRqzi3fˆn 7ʔ3PA=b('OaނE*Y! 3zz-\DDDJ`@>|V`;8ؙ|  /e4V+C`ǟp~߉aee;vqUyJ%VVVуٚ333#"Bĭ6-c/^;9m !!  M(aaaXZZbgk@ٲM/W,N5"x#njX" 2(|=ݻ >$#B!'&+'Cr V^ISغi}eѭ nU*Ś^ de&A7U\죂K~Βe>{VˈbM3`0+Ud͛0taIPw!C``#nj)ƣV>aj5jԈ7HB!V)_,m[`ʴƖ&ffj""" [[[ Vk׮Ӻ7qh4DDh1iZΟ`Ҫ'ŵʗϝ8x.U Z?铐 bY&io`ͺ1؂PduqK|ٰ1q͝;7 V=~"fc%#pR 4*H* !B y!?&we/Vص(o<=Uݪ%KN08ӫG7F)ӨWVV<񂓧0dPeJR%.J(=V",<<Ղ n IDAT>dZŻU(W ΠSv*X_nyy1x@?]6nа0THXx8Nq˓äTsjx{w:zmUXD .wbqpplҜ;gϝg¸ѩH g6ݻ~MUwj疧'O>[i]O>,oIG!BONNl7||}Br՘kO8PfMjwU(_sga[^'GWa Q#ǟй+VԯWo}c'Retz:=ێS'zz eʗ 8۳cvv+[s3CK^N3̜_6lVmk^rdưM&Dz^g굱wllކ>J,YpꖖEI2/@\JjiU6!S)+R !zoJեcBT\u}S):/4E#2RB!B!D&$A!B!BLH>B!B!}B!B!2! !B!BdBB!B!Ȅ]!B!D겵N"!HTYB!B!Ȅ$#B!B IG!B!"B!B!D&$9 !B͙#e:wZ5kmymmWD4yJsfMUJYRڭM={uWu56V3fϑdaC$Igre(W\ڷ=\'WTH 6R5}ZmZ5׼5h0,QB~~`mS u8aXԫ;:o%ܹ9zv֜`R5{ѽL &mޮdΝ[V4ah{<-jL}7Zrn._sbx,/]sUUTV7{hn !u3:d*W $5o*//O,X CB ^veg}ʕ5~H[Y|Ag:w RF Ԉ/iBŢکQ$??uKeJ֠}$IujTmЮqf6-ۢ}DՈݕWj߮wl+y$9)m&߳VqGh14%m irrrrGaWzʔ.@KeKҐAmeŋUW:M3th"*VY }9!wǾ#٬kƬ9;-mX*$Ejp<,~e mv_q__Iҥ|=y2;?ΜwBv>"gI(WWWU[sd2%J\tgJ,W ̩JII߳uRRRɸnr4jU#tEq6*M}EU@~9cWs, , eGb'UL.r0y5ŠEK>Vre'OՋ SZQPhH-WգzVF 驳gҖ<ϧ|jW(/2mo{ެΘZd-8j׊RDJ4d:uh%Ӆ u G~~j߮-X,)AQ5+11Q[nW>o[V.5ah=^$׸װcTr,Z@սQGJOg̙Z5˗Oʕ͖[NIҥ˗e2%--ۢ|jժyuZZͫf/Gz>#_Zx.^(ooU7^jӭs'ywIS'MXUS4w3z`S+J>o&?ZCMj/6mɖqY-Y,Y-R8&OxW3?e+V+6.NݚՎӪ5k룪U*+w\iRS,V ?+gggZVn+Wn[|m$Iջcɖ[W\ՠ!nXPŋUhH<<;Ii|9K r5}vͨ7=U [W:D<9#*:Ϥ-,ve~ISIRIfI-fM"0 B"0 B"0 לu-zNwpWg3} } X0g1u_~BUR{ܳ{~wڷc*+Iv?.Izkg}Ym@ܭw~f}lNU|Az?٦Ocn:Zl.[!I?f"EUzA}%$iY,[Vgޟ`Wzζ-[J1G*!`kRkմ˯IS4w T˯ Q\XfWڶVe:ۍ#11Q.mѺ|劂j߮ ϳTp C?ӥ˗U'''U,S}~pG)((P{:u'$H&7Wjj$?[O}FO6ДI)%,Iڽg5TujT/Tbb'I:{/.URO7n\r9zƼ3B"lZ=v4nf/%/QcXbѠ}}NM4E˕UHp1f6ժAC_S-UXQpQǎp>^R?T]^(SbvS)i3Q^}Έ]37}E>Q%ñ+h%ruuUޭBC$|l>#$>{Sʗ$5o*/OOȟ?C[ 5|[@ |kڷmB AzvmFTѥ˗ŗ_e}ڴnfw*UzCUvwUǙ8ةqg<%I֨Ufzc񛷺Hi l٬ѪD=%S@-_Jo>yxP}~OOȟ_3fQ^Tʕw+_ױ㿨wvU*EU dҲ]8A)fRSSUH רY:4$m@d2.TH.^~ߴ} p8G<$٬ƷuLRˍ._WvudURY6cW0 }~''';n-X(99Y˕UXbn?..N4mlM1٬҂ОԱC;-&}v~y]gggyxx$I>vB) cImMoV|A*_? UP;˿!1!1tf<#b,KԹU=j~~Zں-Z=w[|9%%ѥW2={#\t M&~?swnjj* 0>?X$G*W^(IrssUrr[%+*4$$-٬y{yڙfڵ&GR.]vqئBruu՗_}%%%2KMMPvq>ުTr咔1"KI={վ]k} .ի9j]ysfh0[o2uR-_Β\=Uf*{ pw=|`woﳒJ~c3IJ",rc%Ҭ`@>D`@>D`@>ۅ> ̭wv>:S9լE ϫE:y/\ HNzzS~vR- ]?sqWO͞]ta-\TQBBBCթ+W?Bƽek :z츊 Ӱ!MW;vsMt̷ɔs7+ T&չS[5ӪOg*5|Ƞ V țbxyI۞>7W(Gbr7pf~(|9|u)] I>e:wZ5kmymmWD4yJsfMUJYٻڷm1{L&F"I:sO+SF7}FrҾ4^8CrpI[&(0PT2/TeW6}և\)\nj^}s*p!5nЮMjxo.X,ء5l ISTti GTvMEAo٦8gfز-Z{ާiLTj]zUK>^ڨ{ζ'ַvR=N? OmVe˔Vjj6}Ug~ׯ.l֤)UhQU ز-Z?ڭ1 }GgZ2ytn\U#fʕHQ ׮od~ll$i¤)zTc)))` =Z'/VTZj~ڽ׮SrI||ʥ;߮)00 7 M;հ~=}7:qw+[؇sk}ǫcZ׹sf?-SZo@^ݺVbwoQ>_72?+It<,faϪ5j9Lg9X|k¸ru%>x1xDZDmR;')Q; d|||Td of|||dNMUJJ|vxOuqT /j珻T1\nnn/tOzrwwW"aoݤ]FYpLwRR̚:i<<o&?ZCMj/6mɖqY-Y,Ye6jيՊS|Ajn.vVYO~&__URYsJҞ2fZރ6mцO зv_#1G5hpl3[ njf8¿`xjۿ_kFݯ?bxmvxY':e|RQtI[X|tVRI&IɒR$%Ynl5} } } \s׵9]ɞ9:0 B"0 Bb!gNǎkwT UJq9oۤqNP޽kz8lhZc=Qq 2^wcN5~ʕ-3~# . @ q7~IlWXb;w^|*5 K~vޣeJ+99%@\V-y;w{r֩}Gug~8W5ԁqx=QqI[CG(>Cce+V)Q%$vmZv~~78iΞ?_~Ua!߷B kڌڼuJjTL|q$&&j%ں-Z\QP`=@۵_a}QyV^^ceZrzkԧL9)lBs:k#oo>B ) cImܩѷSTT)-XDJPҥ]dʜ#gg绾.D$szd dZu[zvfrJ.]qҥW\8]]+55U@Ͻ̮މOj[vM2Ie˔k@z>#U+UTf/jqJLL\|GVNJj 뤤(99E^^2٬]vnQrE}n~ڽ-^ʗk5}Ijjj[;Ν[EB%Iݻu뉓(_P^iV 9y͜'UBe+VLRrww$~Rʓ'B 6ҹ5TFV᡿Ν;ջW R*Wjm|ޟ>"aa#FuUƪ]*^.^cfQ͵2%&*jcNU^^:sT=wQ5$I}RT4,LО?cWlwt\ d+fϚ>D`@>D`@>D`@>D`@ }V0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 B"xYڀ} vO L"0 B"0 B"0 B"0 B"0 B"0 B"0 B"0 BR/ܫΟO?r"9C=ܭUp͞s99w]{>A٬#11X,su}2KEmS;d5Wg,s/m"邤xI L%H2Kج7d)oBGwYWmZ))jۅ>~/lp-Ż\nwJY޽nݺ>>>-sJʅ~嗗]~҂$ck8 -|ss*)|rx~u.e}q%#x_}qű}ITڢ7|~T9XQ#O.In|ܔq 5mNQZȓ擻ҷ:k:InrcUh#`pYäzn {D6>O褿s򛡏2Kܜs͵|2IQ~,(-Ik {Yoyn~[K}htnsJ+}s.oʰxszڤ}[}nss8(sNBt {椿+[һ^ {8 tns[Y myr?=~6IENDB`KDAB-hotspot-41e5de7/screenshots/disassembler.png000066400000000000000000026045221515036260400220710ustar00rootroot00000000000000PNG  IHDR 7gh pHYs+?iTXtwindowTitleUTF-8windowTitleperf.data - Hotspot — hotspotj IDATx^wՁ'KU9!PF"Gl26{3gݝiݶ{vǶ16hEB P*{BB$@" #禺~?~/x x{:eVv4@@a|h Q+ ES9*b1rw0>GP(T*XlmR zj)hT,R*S gZk>fĉٹsWzz{m\.-r9աj384 457R.g`p0MmX,9R).PPHXLʤ x{>sοo,{=47UR*vAsяܔl޼%C+bƍ/˻=;rr;'R)lilZڲ|ى934TΝ;(innNsssdxxňB!TikkKXLUm#g~jN\8===ٳgocMP.2mԜliڲs׮&pЖ];XK+$i*ܔ}/DRHvC)ǒ ̧n9sܹI;;= sL|d޽j:uJz./=]x~}YrUcmm9iٲL41Oɛs祽  BΙ>pC~-O/s\8ؘ1YhaƌX96W_yy>󩛳l*rN\$q{ՕկJTʔɓh႔2{cy86xsd8aB>OdΜ) ]pB!SLW^,NRilrXMMMYpA.̙=wa|^RTLKs%B!b1J9c`Hc?|2cL8!W?o~;YyGg*JN;ٿl,^X6fLGwUh>M2%'oxc;y1/oSO}b13g}gdK_1Ԕ'.|n̂sl'y KŤ>ʱT^*@Ϳٻ7{c8T*)CCCV)iooK\NuTnT崵\*eph(}}}) )#mSN\NG{{JRۛ榦L0!CJSSS*Tk pRRTRa崶Rzߟz~MPr'%--ikkKROZ@dc]TLkkkSߡX,fI9)Jikk`zj-ikkM\p}8HV;Xr9mm)WʩUk@cJL6%N\+WLpFXS(TIkkk bFpcbҒBh{XL[kkB248Q}dM) y$:ؑǣ; }<ȺܺIO=5I_R֯p>V5k(^su?Oڳo>,Z0??r46OX( )IbrR):R $LP/* [n…ptttd}yg̳k}ǎC T*L29'̛ݕ5=5k֎STr=kVVmjݛ+.$Iݝ"[m;xcD=J9'?7{֬Jر#]eޑ_PH{{{;';.3fLOX;̚~ع3?^*2~ܸ}ảƧX,eټyK[.6nL^O[[[$y3uʔ,Z 3OOR6穧Wfԏj=xk4gԩ-[;R)'Ϙ<7K׾_~C_Jwܕ[$y@|ٳw63 sXBR*$ B*RzǛR.g 6Z-oȷ7Vb1?2@֮]K.~He1)?<_淳e}+J?!7xC9tgpp(m)_ߺ57oIs5W_|ioo^b=I1YԔŋfab)'ɵ*zgϞPp-Ϯy.](2s9y`ٙ[ |9󮴶OGn@Mrw_tA> 7}0G5shL6-^su tP,5{߽ͭ-qGٛҋse#-yצVkϞ?ͳkypN?epp0R)?|[m?|rޟs>+HRIkKK֭_~̓e``0S&Oʇo@/;1R)sG>$ɦ͛}c2_.`\v9n RIgggݛ|zQPرcs{..'Oמ#!j;ߖ͛zeIr٥^/B!--) ~?z]?.m933s )c:a8p h]3m|2W׽̞53/:6nlly ~E _#a2߯X,z=Cjÿё+4_zInWCSN> 7oNnmjMm93m'W^%sU皫LZ}dpp0B!ӧMG>ܳs=翸#wwe9sVs Y2iȣeϞٱsg?s>3W^qY|V}8mޘ7m<)KYtI.=w5^gpp06n̊'cL8!\~Ź#7>"_)~#7p}ƍo~YjUٽ{Qյg|^Ob)8qBcU%Iqc.M7ސV?Y<6MMti|%{0ݹwf|*۷ Plٚ1yͽ&?яk箴g?<#ٹk0ʆ ߔ^[$I_֭0jNNJ &ߕU|m76sv.|婧W橧W&IZZZrg39{׾<Vsr%u׾7-ۿB_q75U|ى湵7o͆ S3}̚53o}ӧO=[w[vؙI& EO'm<܏v=x ?:47W*{\PFhy wW~&.% sX$}XL{ksJB{3T{QȡROYha;A|R)O~oO\;w~Os9g?yyvMt\p޹y7BXɧΖ-[k9ggg9~ܸ,8|[_!#vRVyoGδSs嗥;߻7}镫mٿA=^a/WVwؙKg ;gN}lذ1R)]zqrժHz|T멽-gyF&LXd,;wNޫy˖oo~ЁO<-['+rɦ͛UT*Jwwwz:o3gVvwuw2ws߁zessNgxx8;w<3=֔lݺ=m۷(_nC&M%N^uE|{k>+V<5ϭͿ_4sv{7^q̌24To|(?=@Fb1n_͎/^fsёSO=9W\zI~z^4w:lɗijU`p/Qe?x.??Y.ϭ]ylT}VZZɓ&䓖)ٶmGsgLPhl:Ѭqc攓/? ~}&w̚5sTɾ<}Ͻ?~\8u/gph(;wJXȒ%se8qBJRcQuwgŊ'Gd]NG{{/Z7l=98SOg>̙3%`k5~\5G~+r$cv66}C?NȿW<˖.nCz BBjéדjm8z/BJ%c;}yAO̞53JZfkCx9Izzzڵ7onN$ikkY3S.3wёǥǍϺu[_Lz!յ'7oill|~Sf<4|ܜ)S&gĉ4qBƍL8!ӦNMKӽ:fP̛wܨ򁁁lڴ9]{*?}_2ƪ$#I˗^3%fHoo_oؐj:>Izzzp̞}gz8]]{rrg/G}<[nˮݻRmؓ=uڒ3g7k֮!#۷/6lɓ3{}}}Yēgw<7mʎ;{F6mXl|֖'dpp Y oE?I:tf%˪dM^R^Ν#䢋.Y2uʔtu^i߾x\vř9czޒz8}}MA4U70zZ)J)䅰~q$_($J9m-ٳ7}zz{sNsKsgikkU/a^ajuwT,%IR*ޖ֖,_vbN8~^C֭OwwjvHkQ,ܜj$IVKaO{" 某p-}}j)˙8aB;cJ,;qiF?_bg?+W/uWcU IDAT%MM#Ϲ%Z5=݇K崷7VVZ+ok:'-_~pݵrʕFx5벵%+̽;3OO{ۑp::se>ƪWm]ƷoͷƪCԆko,>R$iOJRS(Fpz)7l_W_s:3W^~i<ȣ/#=ݻG_Q А~<]ת7d=;@[O-[^>ɛs/ur]w{nkooϻ='7\m6ߐy5PMMMY~xhoϊ')~(u'Pc79X(R.gZp5zzS.GbʥbbJbBiiq7A!ٳwBAMPHTNXb1MJ6 e֭Ï<:~j-vUVOu^VX,›Q=V.xGikkel޲%==4qbSyr^1zmߞQw>-ZR*2roT,2jM +jƼrޛ{e G.u۶7wNfN6}22^{{{Nlv_nͯ7ƪcNZMWWWjZƏ1c:wQmZZ[3c3L_bVeo~;^?\q%{~m3yҤzT?~|ߟ={_z<:\ \*u ~= ŏ$,ӟ/5{͞~?I9ѯ8ZN^O{[sƏmOG[KZ+imiJg{k:[S o z Bʥ!ox#5~~|dƍˎڸΜQaJ3gfEٻw_V?ld}y֚N9%&Mmݝb3/M[k[<ԋ灁l۶=&LYgZj Ve޽{300$iȒ%B}tѮ<yx\}?J+/]#륫+țݓ̘1='\O6W.T ad67+}ҮMYgTڽ;7/~̜9#>Hnm^׳n?O\{9svTk?vlfLoʪի_0yEdٷ@ΝO~SO993gʕS,3u4757>'>"׭ωKOsk9#ӧOO__,Yb$ٻwo|葜ssfڴٽ+[n˗W_՘ǚm۶~?S&O+-֦̚R.g޼2iw_U:gd2I&J% _WeeWtW EDP!!=dj2%{zL&TCHz>G9s=揙96n֯b_[n]M5k ~UVh=U3{%I*).քqTSs@~}ɤl6MS}LZd;: ekk^n˲,uvvi۴`<?* Ziv}jpЯoQeZd_VuM≤J5fh3}AmÎ;|s/hסf++?/W&W8[:'?PWw6]diS'+ ky؂g;OyGH Lڼy?d;wi'̈́^ahTH?'moq1r7a4M6ef)Og,R,P˩TR8W2Jozl6͘6U?S~tZZ[ok}L=p&LԨڕWQ=Sj1S$ՖoW~V+*96HMU556ey+'0xHo۠Z%Iv=|GvjE**ֹ\N+Lj[;w~ICקZ9NrrTXXLG_?Zj}jh<$˲400CMx_ze붳:r9U\TD<{9$f|*,WUuv [޾>!Cyy*..ϗ~5o9.dD!ݡ̬,ɝ֡CM );;[E*).VA~$izyVI|^w\.T\T(OFK/_T <`(Vy^eef`oUDŽm.K%EFڹ{q};d~*)>ZPX99هAⱘ6o}SOYuoneYTA~RCc{w+<{Fvv-\,G>khr,-'#CAϿ:-[o_ҫUx\mm95o|z72zl6-\u7'O?"!ɒFKӛe"x:\\OZ4wѲwarmp9teYCdⰟxX<`8LEc kriɢך7ֽ+]\>l6XHM[K_{l6yQ0,Կ3 Cɑ44889ݚi*?/O-FMd3Meee)++SPXgͦl3Msd̹q+H?s!ۥ 9}T0Rf)UfV>\K4)oVbOW./GNS~_~ %t(''GC~ST4MyAqϧl>Ч5i}?Қt:ZPpg3Owldz8O&v,KPHP(JRPL408xUK$kNtc>sYp8r\`TN5ɤߟ^uBd^RÁ3_!H'՝^|RTJ`/C,R4U[{GzI|{y@z\ ney32-%'̒7-#UčNPv"}o"_Lԫhfz..革8H$Ymx_Ԍk'^+RR\م4{ƙqvM\;?xVLlC,%1;Uz♵ $0{#tgD~z ֗0$z-YRKgToK?x]]#c5)ш̘:'`ȻF,=}0}n|Jͨ-gzК֤nÐq>a X~8jRMCf/\E@<̜yii![_T\^O}9lz>6Q=w $'UV>NJsTt=*ɩEs,_tY0 㜜Ka|2rUdoFǰ[\xR,>uuti A[3+Gʉ/^RtmjVtas);@d 6gt iڔ_6AUhͺ.X'MT%%jS$.FS+ގfiLWzu'*,*PnW)Sm]~%oᐷH>y3R4uv)VqvBm8|aw)ۗle{ʰ% ۫`TjDus#/J¦K5疿eq0.ɮ|xhS?3WP\3 E~O%Ȓ~ Mј-2pB۴}K&,IGjCU)I2)ДɥTSQI+Ocezҫ%p*oDaj#XE>de S= C5/'GYnCz0,7(?ǫ,GxHQ 24=Xؠښ:< OƗxX]-- ӧB>5u+|>W\^*ϗ#oh`@}==POG IDAT8~rvn]^$S%'^Q{vum+1v}\, ^Tm>]}v!V%C #_Z]r_;[lyn9Sٓ޷fJg.]wߥN7R(Qo>.Si? G̺Rw}jf<$Kn[J-{O7WhpSG{wVƅ}ULg%Zt]amyilͼ#}?QsB I2)ռӝZ3Jpܤ^Z#|}ji6=#skw3jZM̹E?ztq !~pvuߣ%U>ҭڡNY3rABaC ӴR@Ji2:7ZPb >&s_yJuIIfnxo ooԻn3G+7˭ ]zm|i䗯1QZ|ݭ4oG`DȠvvF*mCNof.[W_SH%%ӦXZkS3]zٿQokMǑip^-Z?{/ܓn׿WPT/[K?]}v~=הs孺zhe]mۡyZϿSmC+6pY"wTNO1MNdT0q}jަ~Y"͸rnz:6=zҳSV[u-zvՇӚ5? '߯fmx i.+WkQ` ˵z}^kHIk#4 lتgۥYר'3˧>]px+Т;VI$_kmJ:rT>޿nA Y y.G?5Ӧ7_~R+[VJҢUr4$PfdZ=Gk~ QQn^J  ta7Nbv5֌+u'㊣xeۮ7ur/B_C}qkYŽoo"M;O+LRqא W_}>ɛTػO<vex5ab>w~*j١'MɹZ=2 t5T0/&ꅽ;?.\Y~RM_2܅ZpW_&b~$iZq b=mxO 9|*-;>USs^21IWz>Be_+?yI92W´Sɨ~EwkYѠ^O7djӞ6]}n٣Wv>ڿU=?q&=r.mٴI[vT?zL?LG毾Gˊz^ڣcظU|CNջ&\Q4ʦ ӳoνzSjy^~y ei~^1K)ϖ&&}C̸^ ˞TUMBi5jŌ|w?xYu IٛU'MHZ] J4nl?g}N݇M dH3빑8uo59Kt3d[Zk CԸBֽm}!o}?oKѤ%öA\kZmhWEţʃJJR zS-sдkiijO%%Y#4T9V60sxT*\5Ic(֠ΔG3S[w3Ku )yPtkœrAP0^<]mA%%v z5 7Jz-)st]{R~1բ&vvS9#'ڛViBJczfcdTO?\>ݰu_ՖJ&Ȼ[d| }U[KnԨi5&s*d+e2ڹî~{xN#G&ad*w\ݸj [%ަC!mZTwiá>OրdسɮMj*mzF[:`Rp z{m6M^oϣ翿_ cLֲcjҶme6Vn(//#ϧmzǏ[0˵{=plzܑ1YWQZ۶U߲Cww+LƖ1Ě7ՍGRm˴)Cٓ˕gop8/Ib-ڴazÂ)E#!qXW,гRI~g *׿`JQ3V02Gi*kͫ8Uް)w-gU=ė$+VӾە1cUZ URoDw Mؑj6eNZ KMI<#Fi\i5<@}کOF8ǔ1Q і]JT_w@m v2c5gOݭԙmӞW~{4/IVܯ++cdrMIrxXU(zyW 9߫m Jjl5mߢd%ot(1ZWT捪32T<~2 IJה67 lz/kјL֚_8a]<Vic%F'MqNUmX]MGB&Ϛ #O(T u8/IVbPJkm*9Q}:V{z0R2S?AYY KeUGDM(p*6W7uMeڔ?';*+!͘oVBm|1x;v]:}ztM}ۯ֩-=:ֽ_n:f C\V}śjԘ=U(lI)}h/OE9{k{z@RM@d~^}5ͼ&}k[>Y/ݚ=Lۨ?UB/׵ }z~匝GGZ;~ȱLC1T̔sm3{Wmʌd)Rb?'/ьߨ5X&jѠTkV- KbsF*Ȓli:#LJ}_o}FiDW\sЭ7ϒܞS,Ԝ¸ը m{ؼD,Pp+77_>ڃi$%ѧ`x؃9-,UQ_{:4O;&QGGzR>R]Z]2Qʜ8Ӽu4hͺUQjDM\.w~yM,Xл5#a}랯EXypfD+>MEG)$PGSo$bQuO$+ڪ>g) Wz{\$Z#z0,<)ON&>q *{YJ% vjߚ_bKW+?rv/w4Vi*cHPXﴝ aC{Y;N9vYa#IYMEGW;tGC߸Nn=?QW8yxd.}~ ͽz ֭W?*Cޢ`4c2t*tf:~ >C%%+q޷j҆MD ) fÓ7="_k_3kiD,+T8V_of CiwU2W+Mţ_?< 틍9sT^`KoyAXve&k2ҮO$O4XN{JF0tcԽs*#6Zj٨MXRUT˞=^ˮ [SC} 'VWs{U>k)^Y[ũAT֩ߥ VhdU0x.UR:۲TT=l&cnVG KFϛ6o PQC- - e߰C4r,-?VF}M)Ijv9r^T ٿUϯXP=]jҤy\çfwU$BAdȕ[O7i߁&[cu5uLwf-qYoTNWa7J%rPm~Kaxq j֨Ùy˯լvT[_Ar+[fun:S;6&ZdRu]QKRjڰVff_q$TSӨذs^h v7!3j\C5㘛cJ5]*ZRsr-TiYP꛻;{^6y˦iq>:gJ]Gm;Ro*x,Y&m^@4!R_}N%sȨKچvbAVU%W,̆܅t=j~n@-P8a(3Tf:)QաXJz_h[dW4;++W(3tPiIVDUq)gߢP\u{UᖽiiՄ}PۧTM[vV۟߳^ӖEtӍh(<*0KfLÑ)ٺ7xP[H-ԌjQnVİ\X?j;i٪_Uի/r&qaKz?jʃO}AgNSehw:RڴN$͚ޥ^ѡMI=0m*V %%=j?$D+a[qaT_ti*UXأF焥@>nLN|䛸QA9|>o&ď=F~[O>‰PM[\+_]9<cA M0>u/`^Kw/#gFO<%s`~zMZ}_oP"r(;DKԷ)=FӬ HXr'>MVAKyh 4xE=lDža%UV?~4ޥߢW&KZR[oa" 74y"-qJX\IːnS6>#=ZUuBVR5oGz4ʤIK1!?=(ЧV'>HxuUO Њ>"/`ݹ +}iʐ)K*:H{KIZuRݘ)Hɴ;eƺ/lQ{B=%#ڰBwM*4+vIFOO;^ZyGtu"ef7ڧF4LyF5>8YݪQ*ޮm3hnP]Kh](ѡzushl7}ڵVgc?vv [h(OF, !5G=~}#w(w}⃪^MݮU ]F[^~  >5iѠZU]U ,,QV>rJ*ܭ/=GE73M׆JʐfQ$JYÏh+ʭr\2:w?xLOSM NEcڬy,ly=%c Š4iʐ Aٴ;ɐ-Q0UrX &+CY*+-VPd[-FƏi>M[Y+*RQWN3!OZzG'Jqjdi|!GF|='+إC F$7'O#F)SW!5u (\Y0S$Nh:3pJBwd+i(Th] eï)ԣVon_/;Ii˝B(TPxC;4<=lLeeؕEGu c=[]pPXr.LC.Gť*+ΕۈM no.ey2"i/đX‘j!ӥ lɈ}2ny=.J(4<~A[^(hɝ!E~E7M7ʐ]1Ç$C6KJǎVaFJjnU .32!Ç?r!;ST^Ub[-m ?MK[v% K Vn2\ɨ'/нx\R,P$voML2AiwPvQƔHEݡ>Cc$66mޚ^hq4iBzI qfIY3gg/׬~(*-:T:U-M ˰ q/륪SFп|[ŧU]S{Y?p'$|>-z%J8M5'*/[\_zqBq&&N)S&֭p_6e䩨0_>oN +hhP]mj *z֊_o[^|Zd ӋuJ/9rnN/:c@Pk־^|l*2_㲢j;_}sb9%\/~fz;!@{z.NT*ddI*GΌi{{13 CdY}3MTƿD$KnS*"3:3ølۋi2 C$Dl6RVJV3//6-dl60Όa{{13dHd3xV'blM{^y{):G"zƀ)6v-Ŏo7lvI6n޸ıpM1*P#!;y'3std~+""""""(IXE4;i '9R}NJIPviGa|viGa|viGa|viiA.legawF(~y\ץp%+|ÕDH;eˠ2ʇ !~7 V*-nc=LOvC,ˢoRƏb~O9{gʕx8ؖPxz)R{0zhBP]EDDDDDDDDDDDDDDDDDDD.XpP(Įݻyc՚8p0d b׬imt:M<P\ܝ\ @xG2*?PNCVf&Cؿ?U55ln0~'ҥV}v-K\ X´4yrs!Ԉ_:#XX38xGC$Mٽ;TQȠ rA3ƴ,MIS*r0` Ly Kpl vH$ijn"@* (/r$xp۶Mrql@}\<#NFD"475(/"""""""""""""""""r9PQ˳Y(߉(PD"lO:H˲flGe[DDDDDDDDDDDDDDDDDDB0~'H&_`$S),¶[)q0ƨ\E!J.1ǶIr;֎ 4ZeYZ U=H&X`6mk$%?f/A\ph5̳됏 PnNȲR,6g"PyX\ci|^8[&caY}{A?,`qAǔOfhexŋ_Xc:/x*عx -}|4<+sM˃`3 Mn#_q? X֏L}RZV 2N·  A+{7^/^9{@V6wpsNoEVq_w%v`[*?Ȼ76wX㥞& i7XX>WRF4h 0ҍtAv8L==2+)7~y;7%bNYi7BX=vN;D4vl2v8K ❼\Ϗ:絎u @=]*/,^Φ$mcSg7q-{\>I /@83DgTg}A23C}RpPp ppXG'y ( n>Ǿ8m⼘NyK|DƗbvFII)z]TДl|\| VA8, 2<ƨ<79MIěijj&D}]- g["d0ˇPe4wTF,SH~ħ2;4?#pIbttfʣl!;%ٳ}/U Wޗ6#M6i)B}C#E0@/csd942@_pnwT']iO~^v'pύb Lwh {6[Ai Ll`aƨ>OIaͧ {{QA#pCPQ}#4%ϯ WXC/ۇX=f]OlC}OS6/JvnY0< ѻ7= Q<ȡj*[;=c,ÐY6{~yD>!.|\gO&Hms:N'wv'3 ~-v <\d\obmFeC'?GpеMr8#Ie-c[]:i] tҬֲgvj>y~&[~?Ͼp m[1}|Ɨsˣ|5|Ywi"a3}2?ǟB+}"X@0?cg Ox"|adŝߺy6&`|8^;xk+Þ_+aܴ\1w*3ot"/o>. ׵yvlv ۶Mvϸk,;~,,Ӝeeap]scaY։ mc֏ k Vxszp54cPԽ f{d'KɟţNyW1˪N' 3>w\bDlx]KDDDDDDDDDDDDDDDDDDD>-%!C[Fl!ʣkg:?)jaN,}]!Pyglw ݤYuǖ],ݳJ5@% 8>7Y1+yٲ =̆I1n9Os/줫Tʍe։ ~^, uʣ)]/E1̮XLT.Ui^xw}y> PJtwEb姰̈́I5K.e;j<:\JL&OD!""""""""""""""""""""1t g$XcϓOyx )t)KLeeV VG#D|G2q r9T2y+O~M N$H}"̱8m/͟\o7'^Kk$8-& 4eሗ/]ofhxMdJ{nkKHZp|=¥j7_[mV?YW\޿Dch-gn"A\?J&8+{0>yMgq hSKn%n:cZIU^}}$^LJK*:2>Nj[ϸ-'DPdL)ƓkU@mG`,aVU>˸+lBlq;cu8.M2qy*88;pilFYK8+$uc?)<% XAy);Y} ƛdbIU-ZˮC&/Rf,u[JCڷNL;ۤSSfaוDS}" .J&Yc;[0$# áX~HI6gJ_fz,sn,h8֯ya)7F Z'0#9vR9SM6U1rdlxx"p0r#fTKC{0;jL)9vHS'# IDATMs3FmDiB998J6 q[ø+=p<ھYE븴"'dQ`O~\zO\3 $hNAxց9}%l_T䬷E-mm_<'yEvw6pk6ҤYhծXhҼaYwm;6 ,*GN>\(qvEh5 *&Ӂ=zE.mV3CQL2azPqjng Ox} w0k*f j:3l~޾\~pPf]l։X {Yìn3!)˗GM` }sܑԾuE̜?eyYl=#\ʍCQv؄=) n%^t,vaPk <,}S)C{9/A}蚗%Te+xf.ф{0uel/̛8n#l[2 eS&#fcrJrxznZV]!f̞Ʉ!= Xa˼[l(ۆf 'ï<O-c_$yj\͑vVCބ[gZ+ ҃l<& J~~4{K=i*G (Ti5/aJ$ms%7NáOQ}>2rѷ[] &P@K5:wxAr'kjh6!F\w+o_|ꨋ/7s x{{n w*25$1nL0/~} &(kNf]çgSWe閥'Mçbے'hH22vL;kԜ1qx]7) :ÇSTPaJv?h2z$B%X@/L~Ø>b N5L\HԦ|t+ː!vcu M4t(eϿZ`f1çNW܋B)Ύq*Wز SB:RF%8\K:P̰)Z֋yt6@w*pQ)g a4!^[uߺpf@U5So1=!̈́˯`L^_pMuP[w΋g/mYi7F/`V9mVTɆ;SE]bAdƯ['IE8BN-c){G㓛HX bDy/rA^aKr ׵A=svF]ڀ) `L޿_Q׋ 1ixՇ[`r|8%V=+0l0#ʺLIYfbB]:i#K NuKbt>LM  d ?A^Xwxs#vL{xX a9̞ZCtb.>$1 ʂiY_ 9)7_v3 +5$\_UJ6u%/Zmu7*, ׭0L( 3>^Oi#4!E~?e%|ۘ/ȑw4MQ||C_=,N&ALӃw {3yr1}[9yX}ởEqCU8oPuzu8O>m̳^ G+H^iv'dfGyKAC\zzig3| yp&pχ˧-n]D /(eڵ#8?׬9RP>}2CrۼZQj+9p a|%LܟˋqLKrziz֜*`Ԝ[ Ch%Vq4z&Cѫ~~=SߖWu<7N+#ݵ z23zh~GXHk5dv_kGT}UM{[F0bX?~/Zۅ"m`#SnG2f{i&Y>.7ݛdbk6Ob69֩cr{RO~:m{"kc!ݦJfْxnIN*`ę+(Q@8`4K5z6w3{ؾ}sdmSu}7{vbp[W䶺Lq,GdX,e?_ș ?\ǒchˤ|R,,z"UĘ}_^N 'L`OƎ짢ѡk̚>q^Ţm:!YgWߎ,cbּ|Lfv?? ;6v&9;?w6@M҅74 <{u}c:_x8E 1|'_?@۴?1bûvQS2b&ƍc|z:`efg>-sGRh5k>}L x+YO.&S{Sƻ^7O| :_&N䄻0{U D*ٽ7 2l0ɤϨLKcJ&]҃*4[?~ ?_²#*Mun݅[?-Č^?m;yj'+k J,frsEIߵ 0x܋%hePfxiW)}Gˤ"""""""""""""""""""򞜚PM>Æ0d{xw7HqQe ujH ׬vc59鷿3:t&w{3,#x߮:Dq~=\5i [#Iz_H0UOo<Xl&>Cwh dƍ;Rp:~E1oE*&>'hԴ ˲忝L7}51t;su<2@ ϱulQZ멪>Oh OOܼ1DUU"\D@ (Wi|c'uchq^UAH{ɡ6 ܮԢ Ru5B4 >@ `\ _kV1nbb;×wؓ#7 )*gA|^g ?)O/ɟ}S;y}vq"Z~'&1O[3b7}n^)d,Zd |L@ <>|GSkJ5NPbWW<CUo=QNGKVQ>;0WKl;9x:FZx<2gO(6r넙U C<`5yN]2_O@=4\~no,Co>Oă1o^IUΕ71|{RH|^?p ŕJ+3Wz7_aO_q,Z͚|lÌl.?{" % 5q|JY:ׅ7qvxJn&6p_x@ }fE^ Ŕb+p^d-jUwc`xOe_D@ IDATF8tSRK?G}]= uT׵Q_=Oz&0*mcef5frnE:d&#>*_ySEgz*p}=$932|.-3leJkP:~*CT7 D{d1/L97x-OM4/jX]sjsf /^NCՀQ0O8  #w+rb*U {y7 3[OW_Mu@<lkT,s[1}0?D9 Nq-IM|gݩP'V, ඃ^ L&;.ϋ?4!# v5rd >k{Oq8ݤ]H\`/eŲda(2q^*jG| VkI]-7`!:h^=~73,eN^rL<\+LǓOk%ȇ0 Q4VQoR J9>xj 3qL9 */;~/KW>x3d?$tH >_w_i0؞i n| afϼB^QHƿ I nߵsqDuK3<@ӒcdO8j!+ZPk% ?#)~uZ}Lv)"Hit^$ۅJP)%@9R*@ySLe͔zZe3{/M #,aR? >y?[5ᣌn.ܹ[K< 5}HO[ ve d>)o)7,/zΜ4cC QJ)Zi Rc.7ܴ"kZ̵Ĺ#_b6*,:Nt:Nt:Nt:Nt:Nޕ.:H>wzpV-̕<8O맾iXBGB|~B( D&ہ S 3F4<ʨOGH hxٌߞYpHs;[͘ t( !D R6Z76W75dz([WbSxyxE \?]TFыB嘉130/F 5dfo(#a?c^?a-|!#޿KY@y)z|X(mSZst2R]8lyߚͤ K;{h#u:N&0ebż"GV={V D:D&*._ ap&nl4`0 FK=gHʣ wwq)z{G6fF̣iE`yC1W7ƐaV~$m8DIgUg6lK%'dffEh&Jbk,+9S^3c˸^}_a0,0X{}|EX|tv33?bVIJxOP#yUaú,?;ڪx~]ӏqbYSymg<, %a}|vBct{"#1A5|3I@j*H-q<"%)ME9[(b޼24b^ef<ջV/>A<BePݚ [PyVqfeJ0; eeI^bt͢3ҺԵ|ht3^œL,F?n.^4i!.rgxpjzz: RP X2F7YȢO JّBfV&ϙ+-8Us:zN#dcԢ")-s:TCoa\& f^͍sL:ʡ#%\R(HZPszYkt:Nt:Nt:Nt:Nt:N7=:IFf1gbV Wd|n}{J1%~d ǒ.)5$a)ASKRJ¡HrY"59QvQ5׮gR X 2^5ϐJ78O!NsS:7qSZ-!YVF%vYĐ!@0dEDPxCF ֬R I"S<r0p2{ō|pAr\rb6L;Y/8LU8%6\N;Sih_L%+; )a|8䜔 %aHRr%D qQu}DBCasqPqTtQlFqPEyV*ѨҢ nW,dO!sˋ%l),!kQGDY阈&~FGX@g$pLD'GJ р3J>do _HZQA멪jf!3T3X:/o [9C#͙E]Ny815y{ūNxh8D7/0+fed ,L{7}^e^812u #5@Sd:V-MInv@jRI(͎f[ʈ@қJHA}S]&+ GF:S* )(& 4C& xu'U5tRNh®矡.łbQV6O>g$))ײ~|ʊsH' 9”ut9MN#(bvORZ8L^?_ئYOla*drad0pPFyRky=Nm],QFaVEsyLIP(UK"N-6-LPGR.̕FB„%,Xw{[wm;.!w=ȧavy1(qwuY 1YwZ"ۄ@ xuDY.6E& E99Y }I-mg+l̼k #:M^.7RHGWP17!Jy>83y g^yySoO"/ieZ\a@3&cSaG+\#ǚ/bj`uwo k$CH-oi[|wzOhmtNRUQrL5Iز;w^Vd$380iQ6y.b8B{!#Ρ 6U.@}/gt>Z<^^Lpa.}v1$CR%ML^aH㫭Z2z‚C0[L"9oSrYFu{l'՝#Llu>Z4@_s -tiCX_k#-0_:Fu >`0$Ӫq:LoWʲyq]1%9n4 2f/d RWyXk8(IǮ ~pwczYc,(@9ȎMLJE(Θ [4A|3Id 4 FUQ9$z8{ĩM6^kK-> ӥSSP>3p1?-SCR%vÔ9}iu7ΙGiA=C~e7J^"Ia^X,̸B* [e@~fiy9 "L|-.-MRl  0S_ -Ed9N ѷ{ KsjfZΎ i^)L6NosSce,POR;ZYfך F'&<0bߘ$cz&nS -?Ԉx $g2e0rb%obH1K-Ʈ:eV;#]溅s9;'32YsX& *nWL)79邡Q.ܒz6ͪڡ\es }7] T{uX{MYr4X2i@_+ 8?É`4 g]"6uܮ;  EЄᓯt!!au9cS`ZX& $B`6[q8,&hA<1784xŷDc3 ?GCh:ny3h],#ۨV6*%RebOi!N+qńAeWdI&/ܡt:Nt:Nt:Nt:Nt:+@Ju"$ǫ^EDҕJ1bS6e3pV?b ,zNvzG\J \wxj}p/,)gu Ņ y㞷w~xe.TjŪ5_ @&l#JaP)+=CKgB̃tZ1{ZfleP] KQj7mLR_+ @(l4Cg m]x#]Mu'/\,\6$=Lw1g\2k2d2g4JQHC-cyDbaͺ9Ia| scB2cکmx;.bl{Y`!G54' IDATd vS,s".lDR[gB UP9T#IǗ0Ajłoǟeo)"mt<>#%Xb>)~Z =iu?Jj`*eٲYX:$|uįZȞVzV{%6h!8(K z~" 4w,05u%haGF rצ&L&&K 3\ugᚚ0.yH7c218C~)X{S6M×]բ$;+|`'53`b#}HS1dad`+)Y/l#cm9DPq q픺̘M&L&3Wjc3;φe0x H,}KK\7b4@'᜻yNsX1QS[/&2N[o}qz ߀aRѺ%*~q1)ֳ}CJZ1wϣ[YIgkX>;D,f;Xޡ˫.0qTpbcb:g&c;1_r=}4 )|xE։ee{0s\{$ꬳ,bYRݼ>eBňlj`Z;Xt|3w/x :&fv!zڎrͫIŏEe\u9Kp =4U6f;No{ia9=fɒG8^rEUB^$C󄁿58VN$,C % 0׵cz(ܹ˶LM8rrPvk?́cܸ\mal_@Q^=?ݘ2З7- irfg6cX0.F< ؜n Y7[& ÞYO}|6xhX#+Y8 #DRa V TNvx)jaw'CLe+as)MrXζ#ł͝KٌLL@8b/8Չebܜ9knU:.–E||e9vgIf Vg.aK^i\BG;gs2Jɣ#|+_?TmHcf"Q<gZyy9X'-~y?.LjرZRɇ73?ˑS]?/G.Rᮻoa^vʔmLϦdf)Jբ4h,Պ۔ fW)fT84vi#"n fΤtf No;w'?'/J8"UE-95dlu}P[?b Wpܫ7M|דh!U'TC[V3Zӫ"tut0fe[yf<o<yj\gj6·?xE\muMl\9 p=k:φ# R% OF4&0$j,׿ݗ]{ vR' E=$4MCiF4>đ+3"R"FI/Gv7fL\X,v2g.dnFR=4S-{7P匏uLf\s꫙>00ŐU+PrvԼ\{&fY,gϋ{f;k-ٌ=%’R+Y':9iV[f:'Ǐ2`w 5=- ˊ1t˵ow$I|ZP˄ 6\e"ֿONۋƫǹCt:Nt:Nt:Nt:Nt:ݻSrQ!>­uꥧ_Tȣ8ljSG'*:8Y7U4fQcAW3kxjᾹ¿P؏MYI&nx?+2hQ5._#- 6DZRZ !M||ʝbbP TG6QQ8x2>~{)]Bϑ'ъ[Mzmઅ7r/33ZgwltW7nm{6> sͽkOqÃgvi>p/xy?r o}|M襳CDSTB5Lo6~ Z' ˇ/#7wYos6^[@OU?08H=6eddJ%D/'o hH-,eVn 7wҕ<6*=ŝ_Fyq=_.6R|3_5DU0II#baN e*T 7{3-|77rׇ#{sfTij;9=Y-\ kηJ[(JZ ci=ɟV 8E)U eO^$OjAF.nGo wm|a;TFkQS];W5-30{9QHr%Oe [|;khkjc8l17<ΧB(JXSh!d=?w^{?{a1;,'ûl?p- O53)5PwF07S.RdC;^$?W6F`O"??p|a/s 6oZ~=Eyh}I~n|ɟuB2LT(˚p_h)-ok={>'?|T^:/ 6Wi)aL#i168?>[wb<_zGjn;5#Gw=EjFi)V 2|#5Ta [ǃ[>|0(("GEE#ދ=^j1&"|Pɑ-' BCĨ̤ _6ZH)0ZSpXPǻ9s+O#hɃbJSxh #qZG 7+Xn'rNj*F4}'8܃lF`0p9r3gjiO0苁:JCm!ńbJP~tyfFU@qgT7@Ǥ % R ;5㋞"d- 0@/kaj(m6|>^+߮) 3c xFu+/0XSHvqT0pZ 7s["]9ԋ/CEd6aQFOsymkdS,Nfw'?~ 'ɡmk+^E0]> zAH7,C/Ζذd~C.-[uH$NT|dz֛ȓ/pǥhdINLR8zay2l7+mzhok#Я_?,˺,;TImv/U1=nbGwj⧍7zGlpY"MYU^[֞l}{Ic| !7ʳ+P8x<]G+hKdd#g ,P(8'|m9rٸ5MEݽ 2x|>7V6=ycślH4Jm9;CaCTݽu[jos6mEs,cXx^\Fymj#}d.C]رl{:Ή840(7~K#3sg'L&iooò,LSEDDDDDDDDDDDDDDDDD%cnj"nF~-2\M)24G!Ԕ_&߃C*+${lJKaQ#C4|vi/($d4L8:g"鹸BY߾dzk\pϹ& LΑa/GmҒcԨvHd:w6qB\ca=R.E,p'.!7dp$\&/ȥ%OOϏ/o(H'„Éz7X60ưoc8Q'&'kN(z7X,F8nt W"6HFDN4+Y;k_;ixc&q𚤢]tFSg쓙..l2FWW%9変\;+ 7jn U~WKuɢ}Gs;8eXd.BTVTɾ}{qDDDDDDDDDDDDDDDDDDeTן7rr$]$/slc݄rN.C Y2,Nf~z]/xI2ڰfX7, 08s2ei!%&ThgpTtKqd;GaHE:h:ۂ_ А1Ұa Ţ0cV'~'nW/9 6/ eIdڒi%'KxW-ê\FQpb6x0HG>dCsHDI 9N#.%"D ɑiv!Nvu;/;IvF6 =K.z8H}Nݹ M \DON*Kg'e->< QMzkj;m{Vqh'{[.'%n?shI=&ƅq:\#3&"eo+0yCz7KxIw 3l&A ,_,s]kaO.Kk%d|+ed2lV IDAT]8([}GpP`{LS@Źʤ-Nv'V2 O( Ma!d/e@ɲa;'G=C) _^'!'Ka8x);K/\ۜ {,F_O[3>7Iqb8J< PXXxR-[YbHuO|*" ,n2d]L+&V#y'3;=wȥd|+O't'@ЏȲqdz'%?p/}N(x)њ?B<| P~𰣬W2er~y{콒:pp.S 7xCy{kNhsr叐K>owXꭓʤorNO|30O==;nl{Q892TBWnf __Q&?_Yn_bkO{ ˚}/r\.>IeT,`XnFxN.yy1"&=\jS"ږUkE}sqfG~J8dk䧦 H_=0ǏN*T{N97kWҷi!""""""""""""""""""җ(_DDDDJV^B"NmFDDDDDDDDDDDDDDDDDDDDz)%E3VbXZ'ƻs¿/8)vwm}ړȥ6%ri%}s=KDDDDDDDDDDDDDDDDDDDz?%1LbEz ˲0Mx,8aZi`6dhoo'L':d2!LN4#NW0LDqh$8b "r24\d*?JDޥN,9=FαYlL~:BiII~bJCC.6Hxƈ}-N&߷"ۉAgG cEB471"""WC-"kΊ_gqҋ) ))-Q"""""""r>mxa"rviy( HH$/^N}LiY?JDDDDDDD.BQa!mH$G  ʫ!"""""""""""""""""""7tvv*R2~c[aN.-"""""""R[[{~C&5XDDDDDDDDDDDDDDDDDDDx<󋥏P2~唌/""""""r <[QqD"N,#N8N~aضc&}3A*Pd6^t:E$%NfOcY.`0-}EDDDDDDDDDDDDDDDDDDqpX,mx< 0krD"4!LӤE"""""""""Wt:M&&SZVN $Hw9Ƹ/}3ˑɤiooö- Id|bX`Ae p]==_]r94h:;;q8NvrN'#O*"""""""""gbeZi::0 x"e۔SXTŲ.!q,DZZ W>B"""""""""""""""""""rbQ,ˢ"Na0m C@"'Lp$`8@T:E8AYy9ex<RT*e~l"NJ,˯&}EDDDDDDDDDDDDDDDDDDI.`0bd|mD"C=d|w'Nȷm@C< _j`&>_K t:_S%㋈8avHҤɞ^>NIR|^LqEDDDDDDDD9s8lW ,xϋ>i1 DDDDDDDDDDDDDDDDDDDD.'ޣzCsriEDDDDDDDD- NvGTv_g\npM*""""""""[pe>(_DDDDDDDDDDDDDDDDDDD ծ7ͫHoۮa)S2\q'que3}t).hp/""""""""")`&UUX]aC/S2\ytg_YxBn̞s ͯ\>α4sBܲfv iԹtCH_d|S\..o$ɰg*"""""""""qj4hwy'U0 #yS2tQP:QP^ন_5 o珔khcƎfheNc(é*a\ Gb~c`Ro(ƎPHǹ,m,Xnd2ɣ(<޻DDDDDDDDDr:܅x˗ 0Ow)۬+5RTT? "RDӗ}B{yt}]P΀$)cŇlw;3R5Jf K)Z$i97U) xp1R L<(o9S)J*J ), u @bNy ܡ2 B7Eg4Exӿ+ sc7r()L)Yygln/o މ%T*E+W\|~>1/}l]K]Əɓٸi# iZZZRIb3kfiV~-o2e1OWs5x(`##x;7WpQV=oaSlqx~^̢llz ?+ᇿ@p>O|j8s_!eUs}I'driB&JÁ^*Amk3ZL^>; _jOl~|}i%tT's0 ]شz}MvuraːGn3k\6OITG;,edi<ۍNa5<u)oۚQΖWhQ &PX+3IՌ/԰_E *(ܛ9L&Ű `i^f_h-cN-AvNפ.壸GHKu'Բkȕ`2d^G .,CFռz bMDDDDDDDDDDDDDDsnݶ| jkk;$j`T0yyz.kT*_4M͝#}?zNENdHef፼vKؕijy M[nKVZgKF} W&2[u^Srn24|)~Z:SA`ȟVsG?s)0_Ca[=;- c, =M_pOMi'"Gxײ!rm`2AW}[p~ C7r0Y/_A_ń1)ZrW.N+ײ7\-yǹdeYyvC.;86Krp-l{y~,QG\EDDDDDDD9͵>,:eee|dȐqJ݋o ?qWʦNu Ȓ#mL'K:{W ¶ Ξm䲙H30- pd}fq'Xv5buݼ#Nҽ 0,\.'m|ض,šSoD2aK`0> WўFl;r8,ZKeI缾^l8q#۸aØsD~:δ _}sE c"G'9k&.ݳo9K u>C3bɝϳ1ze2m!=iFy'ô,/'VOGaئC&s~1L ab6&>/:Jވ1m<.t*}w:%I}9R ,;_`rS>M@ѵ)̐1udE>d=Vb2~^Q) dܱ+ђ~er0oMp͘a+o5|5Fп؏KVV6N1Er S8j7;OS1emy 4'O󻞆Ѱg-549X4 & [Sn7ܛ%=f֟iNIqp ˷F7B,Mґ3\f;9݋qML5Uڸ76_tC̙:3G[ֱj9d̅,~"nj`{2qlk0<ޯ$|6nWd=w}pkfUsGTt$ٹmVoOg~aAiTA$~V\ǡkC ?7/fxg|q~p++WohaPP1ԾBC&3{bn$))p‡XDjtfMCuY;a?| GN[;4)33y@L'MCXn܌nKnQ%EμM&Cdk8!9c)X,]hW[q(b8,\ʜ Vr*|G؁TVMI /Ca/aalk&j&O( 1i-ͻO8s oC?yֽʫI= TjfPE!#K"ExegLe5jLGըi̚1\ןQĄEZ̋l?i6s&ԏM~t?WbcmOAckESWc{͎C6Aηxe!a9m#JL-Gٻm3w+4 =jVK4Ntʡ1uC0MG~V12uPȐtpd/7n@O<ċOS֕a2XGoS2IӦ2q@lhW+wa.j[c_bL0g&n~^".?G1q( wbcul?F*v> 7eCQ3}"#JMofS/3%̟2M_? ϔ70oHz8u*N|XpQ]IS\ɖ7q%a#|xrS3:Ξ?NGq֙#'oM`)+-ٟeLZrQ6`8Uphoo3QEVY%e,Jga~.P4 k#"*aڤ̚6bigTisڲ}c'QNNWBu?k?j]K |qǽ3Jc{Oa)eʉ4)>Eg2qP! e2(ׯ'in 9%>񜋂PfR?MWĤoc^5npB2d?G{K)W13f_9y3p0l oD'`I)9̛9YbQP6sc̀"ܶEըYHGFv ~g)S}tPI A)+ql)LBU?߲tO6\~Fκ޻8EAQ2]žcsfp~w8R.QVV?9W*/I%w|Nò{֙m4PV[Iu=oyIY$1}xᏯ Ʊx\d{-]I|=w63VʽjL䣳δE͑ ם 1bxJa_ў7[7CF2 @ܙL=1d&bI*B7'~^o}|٥.E3wΣ>kz>cXOA|DncCKQ2r$ I`J(/˼Yڃw4yO}+ )".oº7xcO""""""""""""""מv]?rXx17pxg߷"=y=Y{G9YM0sJDz?қ3۬*edQ2K>_*=`xGrϟgj9d 7skj0MgG?Cӡ](x/_R-oa Vl>;Zē<4EهO=;O؀L3RO{y b&˅21=ݰ=Y>=?~vGY W=ܥo`Zn5E +9 g 1p2vmshڗ?ſ=&G S=g1ZRר vSo$ffy׏D2%Xâӷ:MNš {Еa`)ե&G;D;#=f~O~T 3ֻlϭk"Er4,qaMUO8ͬl?廩n{óMq0(|郳ۯҒ±Xr?_o\-{ijs~Ma!4Y ,ТT|5?-?%n=(#pH'b Ȼx㋩7%3=o}|/ou``Y6)|V͕uIJV ~!}=[Vh'mG6vG޷yjO;T KΡfHyfGRTYA NS 7KED&T+zaL>;`5dUzin߂ȤlͻC?ۓ`X}Ti'Iښz0 &ܮuĎ7!y,#u=k3X0w-!>X'&J(/rzgf2`#|}Zc$uGb-u/d-HerXRa>uu޺z13Cg5uK4t6%C0/srax<|he1=x\  -l_"op3 VYܢ)̞Wp:NlY:=MQ290YKx—CoX w3M Wp(n.a?⯞Hg:1a]ŮOpWpQPUUۮ,d\\p!7x#dQ׿f/bnyv2?۸jw?9Z]Gܱ) O0j_v'q/=C7֞S%gN/ۻvWJ]zl-11)BwpsI P E ǀ1bZ]+iW]{;[NeEgW֪ؑ׼ g3O|G9pz7M'M}I0o]j(>񤦭htx7=@Qyt? ayI63Fs6@Wo_0\/>ʪK8uQQC;8p{d yCO.!k;Yмx֋yiE(4 l4D}gvѥyz1O>P7cuy#}1tS6[@;KmU8zbT 4dݽY8: J  +4qwi)b}Grw(}~eu3 ]iOh:{.}v6~NFQ ?%BsvU_$37G?=rnD<HX0Q@g0wj]]SK_*VYn5뗽ʅ#qe,SӛHHqPe~Nj\Ɂ:of ԰\^.l}][VhV3 .8#αoT_ xßLaɣ%'_Gk$~¹7qA bg)ҽ,WS &ĵ׋7:|97\:h+d眥ܷ4s\ea3COc#= uX^t{B14-A44 щf}}ΫY~Y9|  Z";a[YMɫ/̑!8|TmʾX?5aOI%ˋ_z$*Ni`ݙJ*?3u~ xvn 6VV><y5޾8Y˟_ }5{7wd"#WWCO9t!>?o9W=L֑ؔ׶ ~rQ-3Jb5ᎌG 3>̳f1p~6v&&B!B!B!BK р` дI}Yqn,j$ŝ/ڱ&Lp#~A^vǼd+}/P1+lZs;ɹc 1|^6̝Mm:M!}%ε|wΏ|+)J!B!B?3x"F,6l2(p{* ć./yZqX,cX87͕ 9 /nBay)#h>%ff\Q<>Z䓗i祢9.qAIJ:!kfO%=v;БQFL=nb9nz<RrH3zF"觳G.!Fi %eG+UI!%{[7@0s {^>ȍ4 U@Q)WG[6ed4ijc21\8ZWgeL8\F"&   |: @fq9K&6vc\ʖ3 :8S}u5Ip֕@g0cQ} *R1ϳ2yfc`iN:3hNэ7}'wv1yXU<^b+ _@vT-)Šh<52{DԢPR1f+),{x i0A]s9 ;~3[/.ĪDikeGO>ll&M'^.`,>%e`A Kذ(L }Niq "8Qe04 }9\3,R-)MSRHXMu XF3o ;WǕ__[:XGgѪ?c G}Cх;m)'k{lV.ʢց2+u8 &k+q\tt{)}#RZKe7-b T_AzMcGu Eu|0,`y9N]-lr!#Հc4 ߠ&I щ;e 7g*Qf{6 V'LmSjޱ=]t;)a41fc^on.ydX,l} Z+u,6솉weKOqԜʨ@|!B!B!B!ci/h{o>l6;ԩPݸmo2YgkF;hRU;x69tlidQ0b,($P,VlI||AG[+ I.FuB!B!B|Вbv:x`3^o`v7\7G& u13Q&\1ܾDM4 EQP@G1NM.ӈF NO%fEa8PP#%G=&4óTFί3K1ץſd~RpΖ͠`U^̒y3P*=)d>=c5P= :Z/g]P ڣJg18WNPLydd.\ϧ*:#Yp`6 ʌǢxb&Hy6msвt<9S3~yD˥I˞xV?ŋ-|$Of 6V 򲍠Fpt FkF ##m}2zS$6%"2?lL* CZ Q  &4.҈oZzPy^:'~ 7_Kbm-]."#cbeTh~n ݔCQbǿ%`@U5l6 ]]8֭z3^puR 8Pɽȱ+[F+9qshVt,ZK?k/Uu9g+~ΉP=Ye\M]u=:D{vnߎ,ȟpíT"8A8c/=|rl%lxbRM8ڭQ/`LMxs͖+?^54v10T'99d*/6qPXY1e,!bDaIɢ8]~*&Ǯc |h:{㧪8Ԣ,h9PCc!w(FZH$H8tӋ;os*ʘ1%^AZ]Q˞'WCUU5tOɅx w_؁B!B!B!BVhݻw6=/ xoxO?Dɀ3 5j"Ǔ{i FR =oV,cbStz\fODub|OijUQMHB!B!B܍, w?=7&mhڍ=}$CΜMyzp@}J"MUN67Pn,6<mץףWP}4UWEÕ;oImd'35ѓuxqP Z OO+/0n+]1hF<>12mZZ#=}ST;9 ]SϰveA TV--MIEA7( gjfԸP-]^{K1lV<"k64q|n;E3BYX w$`yIt -ʞB͸@ ăt՝"GL|"6Gݧ4["Ezq' ϘAFBqI|^q@'+ɍp>Kmu%E3J>~^>T>Ny0\ǚ:zR{ҼOdbAav7Ҋu_J Z wG vsJzCl8 O/[O rYt9s͢M!Ѹ}IătWxŃ-}1}` ,?Qɝ\y?vNy on@"ϕ}Ԟd6٧tvqō2uNsW70ōR^?}vpIhӲ">Ҥ}OnEg'%= #pC !B!B!B!ć }V; DٳX4ƖGӴ|0Iv1 eyGOo\+w-Ɗwz晓vB!B!.wřflƍq8lݺzagm26` =̢:+s:j5r65slRfQ>Hw".|g彥iʚ\dc[7xY(Gr.h`{Y5k&fiA4'3/4UG4n%ziHê9qƦ9,)7R<iuPxifώ2miQBGjF69cQt.4%L@?no4W.wh>VYvO9HVIUH >(VY=;9*mk,ΚTkz!B!B!B!W nyŢ>r;wǓO=ҙtʸmom(d3%+<2z LTB!B!ib2xGشin^9uu$q">̮&fFs!+-'BM];О.&^Xڵ23j8V<.>́9?i_^iR+TevmyoL${O SGazPT%<ғpf 7)SnbiT״Z;uV䃫aD`M#77ȏ7F`= ȵ9E :8xAexE_Ptf/O~X6vWR8}9gg=ɻ DypgF!s*($oD17!ȊhHKCeӰ59y[feւ-{o,_29ly>>q]R}<`28)UeGgX[ãI/N]daG?*4MlbNGH9zS'sTt)91FBi@MbruM፫P΃$Sx?Ϊ"rV䗗 '/>&H^S@oc3D "*nLfN#kQm?M$%[de#YYcIQ{xm|#/O*?EF9̞ViN#}Th(zfc$D GM]#k8/rl?BW\ȊX5+èlZt3s(4h^on"bW{Z,]{s}W?DFN>9c; ) Q(73JCJҳ0jpVұY&Ԟ_1z\9)pn!.u[a 98[y Dm Ѐ)ixasܻnO^<,hn=Esְe<NfI>B!B!B!B`;Um߷Ca9]>NqDq(0iVNY=b B!B!2na1M<ì_=QmoyjcćtFyf Z"B_?w<^nC:s"#ʕÿfǁ' ԽeK[JڧV/}ukw02d:O4-ɎK8D_?塧g WpEtQVG7Fp,Vfyr+u]DFu@{ߠx?_VmB["gݗ{e}VՁ5:^KϲrS44vHޘ7bOM#jDTbNѮxf^ɴ=ʵf8smkfWPR|YPh΀-#T3J"J˩]'q&ggQa3opxugE  LoF. R&|×:mˏOnbo?o5-xlw3m.<ޣ gmb$V㣟*/'Ly_9¯^1'zGW{s l.{|z/ĸgNf vU].yH=>o)sr|Av8?C?b#E2:FdM-gr2TKKW0Aw8+gQVM*Z}u-wn޻}Y|cGsMfY/~s9Wjp02bLeN}/,%xˍ]xzrJ|,͇҈;<}K0_orRW748}. [/*zn *Γɷ'?a:R~Zym7T78_fѯ?g~o9.7v+e2G\+K[6>_vؘ2yv}K ydgSU߇.efA_-[bًyO\"nΠtr60g%p8'J\B_E%sX9]Ah<vk5\>^BEn9+VvP1]T?Hݵ1.< ˉ.p~ZWQ߰),*R8O?>SSͱs95eDA# uz;/o}CBhz/ U(T5ȅW(%]V%%%$\8F 2Q xfpE.3_<[_<4߿dOWPqB^y?ϩs,6-ܱ pËϮbq u5T'{eMO}2zzHWxdfFT.h Johl/M"# ֆ{`&8Mssޡm`/03sf-hP9z8}lsfJʩT=J5:xp#nmG\}x6.BC;&:/ 07hμ]^Ϻ"a<@O'-Ү^o礳^_5&"x{hm G,BOsm]q:[C|nvkiw܅Kh$ͥU}+mde`Pø]g΀-= !<.7Htdb'y=q7`M#+3 ^% AqtF+YX>(/ ha.w$V1XIL'jDGdl7?Ox 4zDž?~5"[J;rl0V#P[%7HnI'|2H6|H߃K 87|@1`KM#`R IDAT=6T]תlK%#=#Q|N'Bgfbу`!=#T)Eݐq F߻e s 99D}q3H"~<\k!B!B!B!m݅dP(O0L<ì߰}M&jBKK ^``0͉Drt@1?l~+!B!BqRNdh41k,l67?}vv/V74׿oyyAgOU}3$ iĂ^Ao ׼T'y-T5b10אt' 1~M2efiv0Z%bLեf&0\JL^1$&uR 8?0D,7{Z0.T#3E#S^%Bz:n-~{ϛ3+k`ejrL5tlCuI5*M%r4Møo_9.j"%1>\B!B!B!B FܵEuUU46B!B!mv6t:=--[ !B!Nfp}<*RjGQ}oB!B!B!D[yfOinnNY&B!.o9fI'دd]?o!B!B!B!e0t[)B!B!nzwS B訫# wx@Thp6c9tODMR!B!B!B!58vK\}pt !B!Bqw|ww<д#I0B%KK_LYqRoKY!B!B!B!ITt !B!B!$_!B!B!B!B!(MH$(CɳG) PPN!B!B!vD4):TUM^}Gt Y|B!B!B!B!B!x(`}4`c4Q[0 MFbB!B!B& "bZ=CNji*hEQᇘ!!B!B!B!B!Bh$HHHn5Ѵ;o+EQ0z^x^>B!B!vtt: 6ՊN''ozG -&‘@N`LL|Ha!B!B!B!B!B|`V^nj7o*xׇ!c{I$ɛ !B!B!n(L&@0e -5ٌlf4D"A(0lVŇ !B!B!B!B!cZŢB!b.Nw}T iDD"djb6 (iɻ !B!B!&IcX0|>n~^Nw=3PU 5 bIJ|XH0B!B!B!B!B!>0#55 H0" z=Պ^'##P0NB!B!we𹛢c6lz=@h4$uGtLfRvV9ب=$_!B!B!B!B!(Nff'+Xm6sp:4V!B!Ba2`0ɜ՝O?$_!B!B!B!B!gdb2|bQTUKD!B!B1^l!==q0_; !B!B!B!B!B EQlUB!B!B!>$t?!B!B!B!B!B!B!B!$_!B!B!B!B!B!B!B!H"B!B!B!B!B!B!gxyl_ ${kꦨER鏓'o?qIX%˲$E{o ށ~E[E2uQsffg̙Y!B!BB!B!B!B!B!B!B!B!D/B!B!B!B!B!B!B!BB!B!B!B!B!B!B!B!D/B!B!B!B!B!B!B!BB!B!B!B!B!B!B!B!D/B!B!B!B!B!B!B!B1 eW?B!B!B!Bqjܪ B!B!B!B{DLl,QQLn3,B!B!B!.s47S]]EDdTn7 H!B!B!B!]()n_$ 2gZ *q477S^Q#** AB!B!Ľ,!>Kqq1~Պb O&='!>kXZ%{_B|<>˗Cyr_g^RQɂ&yW_n7?N4-`6&< Ʉ_3q FD'B!B!YQQQF.\Bt_,Ľ *2K L{Z qL~y>**?~)B@innق.<B!B!( F^ƦTB{KMM Oc]qP|>_XmO%=G'v #&fɻu,3nrTUM3`Xhv8Ó !B!BqOp{&jjj[7f@B!B!B!B!B!B!B!Bu'"n!B!B! q?~ !B!B!B!L! 5 ?B!B!Ľ'|R]񠐼+y5o!Doi_6B!B!B܋[܏_% !M2 Rh{'B!B!m9Ҧ#V_[ɻ~o%G2D!DB!B!69UBF<($>x H%B!B!B!ICB!B!BڷaI{IBd2B!B!B!B!B!B!B!BF& !B!B!B!B!B!B!B!a !B!ڭU'B!>`0[ \M4{ G(lUn_O =N`4c\8=>${nŬ --tLb1܎fB7fϏ㸃%)k/L:8[|w͜Bzan=@ISCzz/x;x!% k϶+w+J=cN>bMxGLt:8m 'Sc;~ x)ϐߴ7?Xђ;yg^)!Ӧ3O2W6;{wR4Ypo %^c0;s2ikoH=T/)/B*kmb3ơS8n׺/BqRJc꼉Xdݎ#T8o&جLѝNr24JB ,xcg cQq)6zԁI]6k߹N&g8f,G[9ﺪbxidO^No\3wr d+FFP&Ծ=p}hcj [Mi7B!x3i`58yf,$uW[ h'o#,^8h ˨k `IO ȊLJo}4>bjQB!d֜;ߦ%1gJlľ[;ֲ=lS' gZUS̑=4'6 }4FMJ<7qlF`Ȍyz3~w`Mb)e{7b8{9aW:-w_PJaAkT=3e`Aw:^;w䎙ʌ;[QM6r?cؿt.?:>/;ͻ.5SNdba7Xb02t\r|+f 9oϢ[r7Pt l^eĭgG7e{FcNdB8'XS*ofMsk}~%7+e8<节d%*:OCU1W̝{Xq/kr-B{-6Sg0!JO%.p3J[UQlo ڇBRLMce{AQ0l`SהsV>YcЈĤ_s"WO#B퉭K6.rv.KC hFl$<_6+6!k] ۥn9!Lܛ]vޝDtcĀ.DvK)wv~'Ψ=qU조[:WHz ƏM7pqq<+mLhX!N_I-NP̤wAN7?+J%! 0!̾/8 |˻wUM$vΌil Od8γT 9G7wzJdaraӮ2|x̝u$ 7oW߳6|׊Fzr"(޼ƻ|2_SPF1P N]hr Q 3ew(iMe'x-.]WRC8n&b[n.R<\ &d棋7̹x$-ߵ?q{[)5ˎAQTXzc;{NvMt(tB!ĽH5e TVw}wq}C&[|c*\BtJrs>cu^6 X/Lt͢'2jc$yK9R./p77kmzڧׄBq紶eA뜪-e(f TNvw':{N>O]s8o#SJOHRugWŕ-߭\@q$tϡW$j.H]cѾAw"Sb^yʫ7eӋLR7Wcg *:~TU0v{Q(f\;B!D 5*Tbg`~.Wumj)iw`fSMA4B'E4_WQ4~ᑆbbW% QՄvG[:͂q7WoͣVƦ?߮(>li:};圣}zlŠ{pP4u.]GBRPbFpyfס(*fd1cďr5L6;fŋ!-dq KhrYE:ˋ pLKQwbSqǗs9ՄnFp:BeLX&t#Tֵ;/A~f0 @p.o3V Á9Q཭节,(No[okZ.n5JLb:}eQyC]p~[d]V ϣa붶-o~&#>\P]B-*5mF3sp{eB\ Hf:iO~N%kYr WzCWlv>Om*f@Ei|*딷*jl53:92\aF`Q=479hccQ8n|Қ IDAT+ˌ M6exzP͎Aq]USQùfw3N_ x\O-p|Í 4bC碓Fֲ\:m~.gW1ܭt^j})ljEch+[% ŊIRlMwi1iEJ ^jF0}joVhXhi6toY6ق{p<:]GQH ׳c(ÅeL<Mf,Fˍ|o6Mņnw'qc0nntNjjOerһf؞wMW45@T &+6 7MQ &+Vx|^&%z(j)#,*f'ޖx*-Z0=;(`bV\x}N4l[A3ٱ8qoLF\׭; !B<4F_wͅU ˄)lP7 #4YrvZ?hk S.ܾญb1P{L'mz]ca|6PJK:hnq6;ttt]Ll1&.o*mZ vMXAnrNzVYn :Ce+`Xvu㍵V`[1CFn\9zQouuۯih`j1h-1_p|冟dd)\ط Ffř~t%4# kŽ}_s=u]tоƤvǃtzZVvkխt˥[j'A;8X}~QZ҆(%5XTOp<ޖ[Ǽ訨#W$6ءSeD4bgfQ=\%B`E,@@W1ŝR43}0cFiBQYy]װj~.V7URcϿXLĉ>挻}=oƧhA˘ΏQkOwcC-detBrv&Ϛa9$EДJ=xw?uzegƂyѓ(sQvj/V|ƶ#E4z:\J%a"&$)9^5ZTsc I! )9UKWXqB#QaCYn,T%m'vg̹<4eiv ]Q8>])o\B Ӏ ]X͘ CL"¨~JNihI|*Qyx|1 G" ~c{n|W?:DbN,9H x՜޿嫶p\Ш4Şć2ZYHiӗ#JA|E1r|OFl:\DSNG߾=IgBQ5c3s2#zax-*`Mw)])|?+a1F3}Z*#ٌ<`CUTNY;~BAEt#w, dL^2FM,t3/T/ST*fDaT4OCؼ?KEJf'{ dNylM??1(L|VV;~}{ i꓍zVNRT]4{6S"9ʌ(~'K^xfzo3VXI/K*zY# #:Eٽ|l>Z`cD̟ʐ {l?qָD—yeF$(2'/ddWv|"9d*?41oxmr\uo*̙WADVMĤ2qfCFEq7Ur|{j<뇈_;k8 [>9PncsaěUt݇-[Nx(#0q>EN=X5pAJC5:{&SGh5h*ORpgmNn4XҪDH^O^̫f;}G[\/W7j7=d]̔]ϱvs;Us4c) IŢS{-,kj[OdbԤL?8L*Ru dsԻRGⷞ`Ҡ,JX7$1x`Ob-PÆL}΁߽Ƈ.F[0h*AB6wuKOMȤj' =gt)W1h9|ݏ6P}蒝Oτ*.=OmCCE!*%^+׭,(tP69S#)Qc܇oQ $uNTJZO1a!{~36uN e?!Y%61Ƀ:(?@v3;93/-?mX̣필uVAV cDJ~<&ǝ#;l[11gxlL*^gNmQqdGRi/ﭽo9V1iOϏR}ϲ{z9X9s ' &3ւ(pQ]r+mgqt, e֜)NbUQ]őh& KCm*LG!-ڌ*sPq$[?|w(CW4"=u'3|)Q|[Sb'?fK^j)b|nEVb4Qođ;Eӆ-ކ/gl;!w<MFLJB}1+w&,躁<>i,3Fcą[Yb-_ỺTb{Τkj_WPXsy_ |fб!>'k.%tco1|܉s5'&YrU ><ѳt o~>lL?yw?O5fHa)̚¶w ,=:'gi|K?gvBv>[Gv/~xT \B!7USTRJL>ݜR5A5=/|Qi>.ÁUHŰ/нK"{g5e`f!:.hFE!mf%h"FZ,?]0"۩wp|3^^̐&.zq66)Fr7ghL#vLi.Ē|,{ ^MD2xd,^EriQz,l?BiK\=z?Co߯?MCі6o" X8{xBAj^[|"FŖܛ{}\(+Y?ϼ@5# !B\bJa؄Aĸb=X`}wTGe)+ju5xu0vc7IԜ;5qĦv|G&o>^ѰأIah(O5ң9{2x2 |{!K u&9+Xӷg+q BocW8{3%nin,2f*#?mZIuc"CK>,|)(1`!.!omQo1'tݟb3z2plo{.@Τgxyq>ͧ~Ou>QwI%*uvCcv ,;ҰDFg-3q΀ k/QUhݾ9*iKy~N΢Z|2du͈=28݆QU6qmF,xP}[QOf;8]Fb|0\uWL~}~4v~ ny <=ԴoUDŽ49\r5bGg/?.~N?Ćj<؄jp\'x6{$M28^.\&:W^\H/c%,$ĩԻ;yvژo%ߝBE!LI^+L v ,\,3z9q`3jЭ$&b0NYH:f w])"/vzU^PT#XbvbAdz`7ղm9ZǸ*&Mo%qkvSOJj EiymJV}qLy#M of<'9s%1;zst TF/X’y*αkn*Dd7^"7Y͡`-ny,Z{7Y!.7OdK =D|+9\ŞࡃyiHMfĒ7?Ӝ8{/CP+qd*bHipΘʠv.RSۖM LO[-_@#㨽pݛhK Aoy&v CnINk9"8vSۍl&m#ۥK! UOyo=1bJYKd,LP̱Oy|c,18m %5ṉϒv{4gc0وMBy뙉yxq#ZD*c= 3zpw\^ӗAolR"Kf\Ҋ.y%LeB!Pl%Dhly.83fz7Z (D `dN&1M=B,Of`'%XN'N/\! ^ /Icy x+|ghd&.y%4m%A:$H!zF%+BbC||3N8,Q2FDѣQE){ HDt~v`!5+Y?M'>gNԶo1EVNzDUEjJXs0vx _i{V_4]8ʦ=tĥwg !Eg3;Q dKzM$f`3 DWh & Gd$^-4lE~Fq3 [IIYB|f.|5osڋjKb'y~f6'ret q LD硗{P~xwS3Dzz2&Xy'6E3׭;iqJSP7i)c`&j8{n$gofEQsj/ң/CWs‰ ѩYWaÊ=zE̟=: [9~&߂X IDAT4jNw_ʁFJ$>ߛG}VFn":>$>/$BH9>:v/Jb3b0f-̾vǍq AVmLDT|"iqhJָg?A6HG%2&tԊ1^㥧Y}Rڬˠ y)%_#44nt,>M2;p!eX#cpWgt[2y2vc~US }F$ʡ`MByĿ*m>EC'MrJ0 Ƹ-)ih}q.(غdPR=pMJtBw'RR Wzq뗦--:sx5",`)q˓t`/+7LLB2%tJj$QV[[! 8\l5Qg/VV%YXcD?srl?+7P%$djhyŒĈG^{eSUx_\o'='~V\q20,Z lPd0H~.nW"Ɩؕ~ȳX?,(kWGP ;&PUugo|39arWM& P{4g0dt[ǻgODQŻ8|]B! kx/a2qdgO\7rvYNDRV/ ÷Sxt^>fJS&11Er- Tz Uu{(sbb_>oh3tFe(>yˍTa1oԤn8/dԸbRodw`͡+ XR21XvmdHJv>啤xv"7[ߨ%VǬnLƏYG]j -^^on΃)2X7uu.fѓ?nNqX d Ս,x/^F.HWWRyچ{kIg~~&W :RP h!6* "l!ݐHSocL'!1ou L_/y9iEљGʼtrz2Wrq^XQ1<l'Jzf⏖/h~/F _  s>6qB~}FNMlYGӗiA{6pMCSpS!B"QT)47[ʟ'pijm|K /o޿@72Ǹwf56q2 G&d*̔,z~>&7K .VƎqwCtN XQ܀š-[Xh Z*kn[e֥ub'OV{7ǘGD2?+>yvu/ ;@`lʏKgSglv?66$Ər> ؂<Xk/^t N "D!BQe|UG h/!)}}ml*W dqૼ!M0Qj+{.?m*|FF1=* r@"F%?\D’KU,m:"5"ͅ,H:A[ГKN#d>lݱxU^e>8ߊ]VALH8Nב[Mv䂝a^Kb_>Z_Kbh/=s~qDIѤ5ݱ+`WHuSQukؽ"՝x\q^}wF'8bS%uz8KS/?]6}h3}'yg9?bmܵo5N. ,ݴ8~̌XnfhzYx4-~kPvc],hb/ag=978/P?K(dϭPg~ɋGkrl@tqzFM$~^J>c__߅!aO8~svH`iQ|e$a&m)ܥl<cڏ'"H@koJs%lc\{9~vm2WQ٨֫țܨ^ț_elp_#xoݝOIF{g&T^5&V4cvo[B- *$VmҸ1J~?,{7htF w2{3oZvo,S{'~.@_ľw 1KWy ## sL܁?V0D&RMjZ\=zQj5)'ߦ9NRvm?O=Ѻ!_?F`7s&%mͭX#~ċm90LqbLin@d훹kR{O9y$\'p)~?u*:J ''rrͯ#D0t zC6zW+`D 1Xd]!Bβl Cx4iQ14H._Ɓ)@ dcT<ީN7B"D!X1sҌR=Xs /_A/XRX]/xSV#{] `h ,cӼV>Ҙcӏѯ/bώUďV~kMMax䥑ą=mBT+ ЍVO~0GY& QK^΀0?YUDNQZ94?wG ã12o)E$d_OAT:Qs][b_Y~y?UAđuS|\볝EfGrvFT7w슌 !ݿ |\Ӌǣ;r÷JkNdl_WAU 6/j`㯺: Qۋ8xiJ1E+ѻͮl!Bh2-w=Vk%a :8kֹػէp|Aϩ1qA( B3mgy0dE+G]S`'wngc{.N˜>fDc[TT@5'^y/Y7ܞ9~g9\ӇK|{I+JYkTͬMUEPc:~blռ3|Pފ a0z9U3rώvhr]LgNeɲ \mhaT`ŭط0/Sf,:762my*v",tw-= *N 4,=uW9ObBI^ w-O/) KϭN83i۹q#i]f=w5`Ђ᛫OιƼ``޲a=ȇìUgS6v`93okb}0,ʄgX.aD٧_>d3摯νP]ND)DK Ke>y_x냁m[4O=:}sZ%>C[ױ N8m d/$Vުm~6[)G7;'irHAaԮjgaxS7ĐKƅj2S:eoȫG;-"0 6<0L zh$uz G 8P0'Ǿmֳr-x1Ń<˷0tD%F<@Kgݲ jxߦtY EH\/_?۽dZNa<8utZS}5In+t۽Cmרڌ;!)hin7N    е x u|[_;)LHZKٙ FqfN=J+y$E|q&fU_ U\x =ؽD!a9E1Q.>BɎaeTU "9 3|r:vwaȴ3"fš5hZHC|z쏓t^:e]sY"%d5|j=CM8]MͧX 6*EX%}N)nꩪoÛTDIJBH PPP>Ik/];HS1շ2 O i`Nbaq N#~gv5OmuZJr0hPU/]XYYĚ5cg9ظ.SqW)iTujAgAG(#r(K"">xRwLSUZw, #+$;ώRVۋ7/{qTUGuU=ArZY\V,Mz eqKU5dHh9!^yǯ`Ud-_LbP_$gcQ r{Ǯ19I/ʛh TĻ (DFQ$P/u1bk) -t_oeh򹩾?g_z\QĘN[EUB2"q2dm_o߯N\#tt`uL>S>Jw{+0" h)Z?Ak ur \:sA<3FRJ+.,0%8m+}_sb3nN{ʫڱzԜbP',2\is,о:oLNO8Q56hũ*tR]Q+DL= K(8;bv rGZ'z 'tA]ߏIKX;?˜˜'0;h9A#i٤Q셅$%/U1<‚<ҍ70N>)i|T':KdIN {9%_]_+beQdfndQ˥Ԃ4 3QQ3Yd3rcW^u8ky< Z-xSOb)(* -Oʨt{sj=BˊЊwG"&%8T8h`c 8˵~$xTm/qwe[Y733YBK["lJJm(hYcc9U_Yǐ_T@zg>)n0mWΕz4%}o"1LĬ @v{&e [#p~t⺿{ h0s>X٨d_q9_xX1wn̲ACtj KEi*R>w9Hc`JI./|Jid?v[:ސ8-¢uQ86$usӳ4'O y^xSjz&өD,y=NCli%N Yk,(/n1bEɄt6uۉ.#Hdg'kfOm࿉&B Kv>c>cxm%purG׋$&>:t'"饥k0(chnM:D kkK g/V;>7SYՊ7BT-**z nL0B͙O)x\rˮa ou=8$[`ȼOS9{ 3O4;b)I!ʬAUUtX3OmP72K(|i!46B(B(B( [ِ&p0Xw#D.ڔCEqd ̯dV+cNnw1CBxNmA<~SJG&8[UU5tX,\KWs#~ݾuUw:^Oe7-UwX,LFD^*9g[%.V>⳪QbΈGfCoC-=ְ2Iۧ%Qu{RzZmhˢN9] IDATa#5i=.LX0֟^268Љ1k?]QUUq 7R0m+G ۄh-!SE;j9Yފ8V\US ʚ'CSS NRW$5MJYz@9{t ]zr\"|6GS:N9Uy+0zRI(`E~ ֑I.OYwQ_!GkdP㗕e8iRƅ {SèXĹTIKT\4)`ĺ>WA%s|xQO ˸uq R}"4OݒeInZjhh/IŠrOꙴPcXU7Z-lL)de'<c4z!z8=2>nfxĐ;*? YSuuzRU><|ځuU`||唖` !޻4DXL ɓD_ ZAGd4SmC#8UtT) |+2"+ oǀ_Oz #5g>In*KQn?vSSq6wy)ed/`^\rh,_S'};#6'l:]YFD`K&?/c_e>yX[dOUͨxVF쾹'""*ZDK\ ]a+kESY ˎ]1Ǥo*.z *D-$9kŧ띜@OL A}v!hùM 3N[U^z)2Ą8tZ;6(``^~"z)=L'M!B"D(Nz.~O3p9׭dd 2q4k?KA#") ';z Jyn[MۙF m*B<dSM80đlf7i)h'.1{:*p &HNSw~U\8{gK2Va g搟DICXxq%p='_!D\23/ h&&>A F$++ -5ӉQǸZހk2Rk陸GirsSl$@'F/bWK#4M"7hJ ȱش/39\ø*`-k4;'b1W20Gן L^j+hԶ5f @2Ck8}ܭfSNsjr%(Y9UWM,M0LuZ^+TG=Kؼ~ 9YVNmp,\P)lS0 Ħ`蔂dzh$ 4X6BWk;-ŤYkx\v{N{]v;~8ND .3qdb y1aZfΏ(apmh!˖p5lV7ZC$+J0 4RSİKEL`}4 p6I҇a0a>Nwulj[\˥9u)5DtJ)\}~IY_*((NFF&=闾Ds08iktb膹X;qa2\H^amkeֺSPbXIX$=nb{ZHDz6Z-a~}3\' :ϼD#NSexk8V پ. !1'XFDž>7"twv10BK "1>FO=<\4~($Aio X]ǰ2gNSVьmFeZAYqZ#хf0n"Bpo}KD]TeFC\ *H[u3b}ˮrL.e J/'_y FK<9 j6sx=/aOc"-!0#:}8ũDI~ ndA|'\Euvy2V]مFVu:=Qik_˝<0$Ѡv>z0K]U?}_hl"D!B/ͪQԵaLJ%@im[[\*N,gq.v<rqWiɕCp%nV  riN4YHL',m-B Ĵ$I㈔D'RbҧkRj (Ӌ$qۉiT;FsSH0 A2f}#\֒ؐ׫"5/4܍1tt X#y*_L*Ym| ZGG.S*gK8S@,2#*1ܜLEa1MdfQs V{Wb)Zř2V53dU[xep S) ZQ a|=wj iI$$ l%O]Grx< }]sm?N2}&5de2mxa4 7 aOe>: ذ|g?@FKj|c;~!B"D#t6E/CI$6_>!,rғ àcK#$Ec4,ēAGkNXEBl FkBV.:pLI#36@:E266M={i,8S=<)dfF<4_adInu*'92㨂W9>J*d 5\id)EDE` b y,,q.봵q:xOb," g/ 1hi6-7Dt}dG"n)65`&DlR Zɋ7qo\I9!Xstz%&c %IO710 5d* _盧;xx{:Xm[!T@Rj.yYFZU<30,:jsQMЛ$àx. v-1i0bL4CU|OX^YA٩2u26u)E$ZF);\9&Di6â:T5Hǣ0 Hٜ2m% "HtC!B"Dzmj9}oq$FL/.;F*^ MF?cی0FXЪ QsN4 &zΛ?uQ$ ay/RFDE#0|: \:fm.h0i4`axe. ^,z=)2 [R*uȄ "D!B1@xV;Yz2:A/ >N^Ect0@3:FV%""LLNqۊۼ^XsHZF<2Z40L;؆t@a4tsODS)Q}l]mwj>W;*xb7`fT j J:4KHn,q:orЅnM*-~&YЙ0D2 x]^8 FF:&tL 0<:nWnEkٻ+N7 jC5_Gyxn˧Ŏ1;.O`$1ૻiC6n G+Xq\xf\DZdqث;Q sQ` 3Z^S\$I.6Ѹh9s[U;|kwiƢ!B"D|H)+S ޿IH2ktmk)SA 5+Yŭ=͔}BϘP>O_Ǟ빷d{lGowc4 FҖ'd&h$yDDtRe\.7Y"O!阘PU8MzIT'.^ݼW #9'U/c>d yP]-NGDtz{ȣ~,*ns?VxznػozF\ Lerb.6;.LE \~UzoK-hGoe9B呗Fn+ܲf7Wn>~U;pApnG%$UF9ViouBvN::C ]8ܞz/t}sS#>>IǮ{[435ZgM"D!Bψv3de Ӆ7b;+!I*\ƪXa+NT]8aZ!QMð xN;fí`u좪 N,2]DuCc GK{xd)(۩=$Pqe WD0v+x0 FD,  j]ɭK$dl(8NƏ:s`?B[U;+ѓTBM/M@??kOU:3G%Jh7}kEggņ[[L=kQfB$wZ2MTE$̸plDʕD SpIh`eF8n蠺x}kذc)ϝ;˜)d S°]Lp} 猗h4Za&03KIJpZzQPA|Dx(n mgŎ;Yi'=yWnr61y)/r~vd!Bmgg.EEVF+~{N "D!B߀`&"6v-dU#(nAD#iH̘VًGQnD枬Ϫx-"-+(2;x,rMd#yYo)Dr+nŚހP=*((עmO} ( "3R:witN#D!B#&/p?\۸)'YZCZ: Akf9d@MИ^f~wEU+$!Ir̙b'֐x8Iyd&+\~q +ͮ'r'ˏy,(;]ugMi>ܱ۾#s~(2q*H0xf4fN^/$"Mwڠ:U` y]7ތ/"fƼffzyQ=8 ZwT0;u2^/w>~yiT,E,Lu'U jf5 fl #;'UUp=H42 i4hWFQUn4~NpVZm哳T-3V'mT^m`-lZf+I6/sjͣeٷ9UТ |QW^OOW.0r^'myWxl6칝}[W 'zt1.X@dW [ap$ hxxTč>_3ɍ:-7g6/x򨊌E& ~Z tZ$۷4%%SNDA=?Ӕ1bii.[P**#"f6R2UKֲn'Mx{9eׇ|'P> "JM󜎢*({92t ߥRVpسl#<D-bqb$l9V^dED5S,^nzCYB fvVDkikI(ZD~Z6\jƍA3KQ1Rd vvDDl)k*F{1~UySVݏ}[5l<~oT>T[NG\LT',(:^~WYtSQ@^}'kNF߶p_h~[GH"D!BEKE˩흩ۊ]BA26,AT@q/Yk}?m[dzȌ{}qUv{WR~FY IDAT>ܹ]- _9ƛ?֩#u}Nz2I` Z-곿}Uڳ˟j$Y Iq]NoeAX@l ;)RD*%˖-r<6ϗ;=-"+JuæݬRz H4fQb6G.hp8tq?N[]⵿ěƥ}0voWROWްe:{ WŮAB^JRfPP>ubD_IG@ 7%Q(%/[D+PbN_Φu9MW=DD\D&ܠɴeKi.U!Xxz\#Ns?Rw&9!q[]9Ƃe8!\ł?^ %5XXEωk 1<AaL%uSD#Ou39Dk,5|RH"E ;"*c';+y >|ΉI<ީUQDcϨHF_L>x)9[XRAJ񈄸}IAGʭ-~KdxC% Yl@AqM1ǧCˉ@)07eV9$.]a1Fz/E)RH⑑Q%7~߿yѩ I3gY̽hj8.'6Hv 3Չ'AOYb`G%@Zv +GpDpmdg&:LJ2*6qU :ڸi!fWmXQ24<\gC qLNfQ^iW (Z[ ()_^K@ܛgUoqZT)蓂:܇hvw['?6&MBVAV&C|&' Qς4аe[Aɢ ' zU/j2Lj-0ǥI+K8'&? n5b.giU5uuT)8mӳD.|ŨVb\㌺H2*sowQmR)Aǚ Ly&y,(M>>y=% #&Av?_N]Vbt(aS\GiI(2XP?05@PVk(aNRlgUקFBXLddEd H:ؽb_kFc[Ң RCJmwÒ Jٴi!A陙$'N1⍢TSVY aB%X@v{'?[w˩.'E;gk95-M1G]!"C%7zE 01GIxxZ3pA%hDwU$hY DPTV%40z5Xzt8 fR3)5]On, ;vl"Yyd?^H.CMY\Z:[19~H`‚=%/7tgILq.ksw~X,۽%z9Z\'̝|*HH(b 4$ # sݸ}JzGPgoQk_'|'N F,Y" IL \CaI\yzq0 " (49fIHNLfQɂ] i~rѢgUT&=O658pMYӡC)RH"E!K_Žb{OL? (IO 2y?{>89{_=[X^@r1De,7gBZiחХ@[ ,[Օeܺ|#a)RH"E_'ҳO% eevC(( S P(.g:Vi;w_>5d(zt3tc:hf`(F0wCPPVfkWF m4rtIe吮a2M;b0fgȡ872Aq.&{~wb(}b"2M2:|fCǕ]'dhjr!$)IIJR+24JY9A.#XIq$YeU,_ZafLY祧ˤ oc/O3RXE6skٲxJіi$+F-w"9˩_UN*9al!,d,m`tJ|b"ymNVq.jQ2JLG[w¨6'/$=ܒ81JɎ_Uͮ ISĥLcQbibn1L[c S>LWJR$%)ɴ.ˊJB&@"4s<֬ Q$ƑD"QDde*ΉQ{GKٶ{)jf,[ɪlı\5M6K&1Aqfjltw3&ϓIZ!f&Ȣ3 -b,z$% $qP-dEhb+˦1SG`/fE7RW< !SѪh z3I@52jA[Jrn"d.BQ I U#9qtr32^K <'x(_-vtnD94RqĴ2r$ך ɨXeIz{rXH3NGkni4sF~kH{YS2mԢڇ*ښl7HJO9K<0O#SzGXZhPR]+1;uLAF0<ngtQ*4} <čɢav*U }րV9YBQ&İSmlJ \@]ǁ xiccp +0b*Tnl`6ީ`~ :&HbhPkը"~ޮ^&"J4*9 bs=.L|(2r %A|ԂT-e,Bj5:y| 0,`jVXC=tl܌3bggXi=Kz/'Ε;x:jm&G<+Qŵh: fm/0};8>\5WcLTJSKC19+Ym˜L@UM=4"8z7j#e TFc=bBa>7Hť95mMԳjI$(\EnMe{<{tn1jw,Qo` *fy~g >Fn@Mf6 C_uKIc N[ٴ%>,bZEy*zFt ,t.[%d]R"67sHa\t)\eʼnmM+ d1fX;WQ. 2z*}`5<r U45r/)M )fFPU1[P~Mxi^ XCfV&C򽉥7؃'ˣ/Wh;lCMq #6sGr*K2K.nu㗫@eFn,'s&/H׆Muߵ6^RSzKgJ9)I$n2vsu Ô.*(h4IRISm}(ӻ(1k1IITТywƥ_Lt\&GWں*r$]gX78,dr2ʩ* ƞ?MbzgDrq6kJ|> r%Jy,ٔҘx$6z_Œv r J{ *2ڶv{:/"'jin~eS8yLD͟raL"wZV/#ȕ贪~>:@JF.4qjMzlV%_hUitȘJE.ōWXˆ:#1NLu=t[Y.F&me>vաt L>"S,dc_kOBKM MF͊ ]-S_/I" Z9 Ш!f +X0~J )=|Zn1#ihe2.y-deJ*DFi9;{NW=:n6,~N0Q|8RZEez,=\8K,~ UmegBr\n5$#$%)IIJR_H0H Q lݬ=@Πzq-UL]HHD#n(lr3MV1+VWsDJRv\IEmiZZH(BP5m ƛxy,]te>'#l5oB`$+H `Ś%k}\:~dYy@](%oa w:g.bmlQHcrn'ؽ,uP(wOE))ƚ4ɾr:u[ֹ #;l%[ DJםX³Rρ'!ϘKfZVXK*.O ٌDlYY^6A[= l $L:H(^.(3Yass_il%RݰŹ>;Ҍ/t1I+ig۩ 'K*1:iq%JN9^$1ZZ)*fێZ"aş^67Y%UXtU\@Tĵ0W/:r6֮$ornl4}ʹ+(^%ymMPL-V!_,ub_MPUJ麩NKAv,(NZ&^T2B-Z&$f^\arɊ5K(t-"#vXG4Ex hXְ A4!DnZ;q$-}9_|eH>'oO<˚\wGdd)1x}v4/ǴH"E)>hUض<цjehs\:#D>7N`]A|2Ód Vg*dMކ7E tNCbv?yNl~ M%ZdڥӟM2+g^DʹFMDPOFOtrR#9ҋ(.1bPj dKmLFyhcM7aݎgfN9W[1jsR#=+Dk $wOӳu|k6^+]Xai,ٸe<Ʃ;Sܸ Xu䫼:F󠝠!l[KA>ce|O4u Dtd)Ork 9c])RH"d})}?.5/ッ؂k(_'E!h3)[ r46'PK=lz hkĕGJ /0bc=/nX!4r2TZijڝW &ְ}gzbS~'mi^<=EPCKT.# K:KK.\naWoa!!B#{8ugc/P`h̆BRh.cWXFCVta ᎏh27F(1F};ۗtZJҍlڱUt;O)"Ȃ呦V,f.C c;(t,mʉ] i bӎZĵ[xD}woز#e-}8Jmi0~;Oٕ|cv.4#K7?ޒ])2[v$&Zsږ|A.=cQbׇ좰 ^haSXQ8uKt%<2|ݜэ+D#޾Gþ[ؒ1$}-#ڷDیLZ2r6s}_$~:Ne[qv?6wI&-32#'~ȅ̲Z6Fl!5YgĤWxVt;Ok>sn3O<ɲMxҡFT_PǾ]$ߓY$NBK*Psuj+! *9%illX9L$(h/vqZnV^[UZVQ_C ##Uf̡LDmtX:/q23>҇')eֽsrF:L9s=~.a*Q8sPr D yj^^[}}Qtr r^rѭ|xwV_ gs{ OX@EAaNӗhΩc,~ϽLQ!|cD`#u6S3 +dnN5^e00_8 Dks;;aEU M}^9ʩس|//>!!}n)kwo#E(Iv UlEbpÄ7$; {/7m+)QI~a)chEUºz q|!P(Y͆=,^DyFe1;N_I%>4_R KrurH2T JdJsrIׅbb؂y,_Uϒ|@}4H< mBd;_/y\3/ԧh3{.HAnqj{+_|AF~]D]zl\;WV`:FP)|58?S|VcꚦH"E?@cdru..hbB;:pӧ{L W-+Ȓ\qBԑ_55n2#a/Rcl "d/cbbheη&r]F&DPMXd$x$Zs9G/|a }n5{>Fvrt;(g?i򐍵Տkrǣ-_ǎz}rH SRtE& l#5X` {}Mر49!ݻ s0YaUEK7P[jq`(;Q[A֝8uxE ߾\sOZZڷ(qP&Uʖ3r(*dîmdNGV70~Fla$D.|‰UW^<66RXsjhm#sB-ʹ1+$#-{S&sj+WⲏŧrB? G$Dӻt;IH2E)RHk$Z޲sf޻n9 (ܴ#~ M]xJr,gyx ȍ$^[/԰twDPsYmn?/b0&ʺziq&+ٴg/1ߏS%aaCKɍGPξ}@EϭK\\]mO%Y:ajҳ(zw& ;%lnhHbVゞ%,* s=8!&7.s<Hta|z?`IsKj2~"JrY6O ]2؏Ýx'xul;"k;q"UBEcT 2zߐԁb ;=^2 읗x'4vY ^\} ?ͦGxu.B%n7~TFo]vs> COg{WO#Y'oW^a焓@T@֠Oi>Tew1gVoᅕ[y|PQCt_(!~}4CߴWVl占ԥc&hzG|yDk9͏P87`uBqn]8Ut\͟#_akwPDTQJLV0E)RH G9:VKxeM@.'8~3Ǟev$Ds"sYgKql-x=_i3Cz(K0$PWleBwhz`b Z:Ⱦ ʪa*-(1DO/%va= c]yZOdLveAr`^~u^Qk5+,צ&PND/$א#0xI 퓝_鈥Xj!Э|`CLXMUxHLrc4C"rMpg /ni7QaHx͝[4^Q(t 8׿6>vCiw?:ԜG"0̧?rs'!-\RC{o6pjtJ?WѤH-l_\ !J.^? +Sgxc+"J*Dߥ8z g7U sB73]$&;Nb߽#/WC)P:_d]rdBVںx*Yܽ_dWI~nI`@Giz~^ӳ4{M4商"pbkMYzst}:),bKٟCq=^ZC)Zi<:U%+9PNZx g}B/J4DqlYч8 ?ɞu{mxad*&9O8a.~suW\Lz(ཏ.c ߎ"m㣷 ǞMG\V hŏ^!U;Hsi|YD} g?Sԁ={&ژM{5'x|F^z<._l'K? dj jq>׍45K H+ :!PhI7(p ^ǿ8Aop6׃,ϲ"2F@wYvKr$;WpfA.{[q@2r N%>3Gu8-[d_PD5 Z{QcGD~[rz&DAFFQS<}7O ԑaa{:@Z)RH"U4]D|[0p]O~%+yzj(EqC WcЫp7tС-X727~MKu q÷ 8v૵t9nbO:$<^bfĨJMO~;UEdqǶr@CKsóEгhhCol) ] rrwGqX$Aq.p td=xk"Dw~Hu~QZ1޾]Ku VIPZO:hǼ-Zn=<ґzS>8z~WV~k`g|ދDT&yl~H!W8z|s+2(}~}7y5!/19t6δ`s !E)RHk'AQNZV&2g>'[G LO i=}p"(TJv. )}'>^ WrJ9 ڻpC61VƓwr*}G2 LtO~ u3n 63O<Ʊs媋ŋ*20x*ݾd>>QzdO~^ێV/~1ۍtj) R^^Nn^6^y0BCnJ5i$"މ1GxzJT0Ճ-(&=$}LT%w>7y%WkB#р˘$|/YA ?/׋u܊JFH="E)R{@ґ_HA^6d4ȅ^V¸ˌr\c1%%E!͌͘Iμ\Eva9%䦣a2 avi)%la& |,*BsN6b 2LX 3`̬-S+(BcZH`jad4%<2%\ %'ÀZAؘubf0 @eȣB#zAc1FF J%b &1 ?dG_FiF;Lo\MV~E䓦񻱏[tBě"E)R`' 1jETT `iy,XPNYtUτdVTbJ=쪺̂",X@Y~:{tL Q\O"{ƘİɊ+#\Cna 07̸'8kdQR90ȨǬ&Gm8qS[w|~,sr)*,ρetθU|e~zIcxP\RLq^&Z{CaT FJ}EbNC)p;lX-VLfl $'py琮U =جL'*2 ))090鿯PPQT^JIQL ߉u(.MtX2:chP78=o4A4`,/8? {@0ͻ݌P(QRF-d^G,GA$-Hqa!F252I,C NˣdZo)0 `ƏH+\@E~S;Ө QX`$7C\ [1[DZL؃Jr K)N 3<8Pdd4 (*,07a22Gp\PoUv+MMP).)L-حf1MJr(Px1c_BJ (4eP#L[4bPh1S\O~N:͘LcX'DdiUO}qA&-RJ '͌l(+ɗ1zdAUNOzm ʣ|r2t"\VLf* D"Gm@Oiy9 0(LZL arD-,B33`q2=/S2c7IO SmPGQI Ed=7F`(\DM<İ-q'.UV9K,# &*tFkN14lJm=t ٻ0{ur%Wll -$!Bi$c`p&ٖeYkl/SvcWh$]sܹs9sJVS]YFA:6H=M _p_}^Ȧ?ϗ}` CqU uA%]6Ã:[سIb-EO0py VSS4e8OWW]]=EQJ*)9R sxS ^m/"XSG]mh?; -ZuNL 'B{t&6Iɢh(kI9\AՕS剳yֶVN'ngY jO1?Ey}Mt/, .0]47} eTS],$+D{G'}ĸ J+&J[_dp/.&XER# E[{/Ѵ'PfDhj?1sxU]{`wֿ[7ɳ}jjk,頥i6ۄvkU<f.{2 ~o}.Hņꦫξa.?U5Tz45ML|4R,%!j+Mz {J .^Ƨ,iAvN˧q1^Zۻ$Gj9'T8lw$<4ǓG t@*Ib8qi%d;wvM29:tKf1LEU4(ĕjy_ } '߾yPSM,#o6w0 Юtm PQOcU]zF ںjqکѺvw/ݡvzb W%TQYVBAL2F_h[nW )ʱ>Pm]C$yyyK,aT8dl6Mr$@?}CꃣNmC=ޑNu 1yTV@my-43 PS]HG8no)˃ݴz&N jirNȁ0] R]YF$맣#Dfޢ jp ;iwSRSKM{ОnWPB0:HyG6Id.B= ƒXx(kLE(`b?k=PGXI[󸼅,j7MkظSGeʌAZ; ZΒn(|TζvZG6=7dQ!uv _}?:?{:4.JPwvc5rLŠ$L|+,Th~"q-㌾o;l}v"XQmG""90壬5TIvvΰƠVz"ip"cciz{ utꏑtQ"nx.:;; p{LŕTQUUIi# KG{јvD[hߏd/w/{Ge?wA9A6HƲ1y4PlO_YKccn>:Zh u34n @UKVRjko5 7ƚ])mDDDWTX㡹wDC',b_V4⧾|pz k(c'#'lS^=tpKmXDcm9X7--- Ja:/g:dT0]J*"6MGgn&̷mI{x|]\Ί ^z'Nbn5pzc#}mm-.XH"&<[TE]]J}ݝ!v'>Vex9/lb~OhcMR^SKmb4с^:[:@iKj F|EkVQ^M^B]=twuN`9(},%$[u[W`n'0phڵ[Fkꨭ,&졣>FR6w~6_|~멩,•c F{ ~:CYF7B‡vN0,K0EDD48*mef':a:p8L "͎Ț\a0M&L}^t0Zeʒ,fYeq3 l"N}qw.0g:N(""" Ltb6V6KvA.C iY74 &|Awi6}M2d&[}v)X5Y0p88:~UWן|u{~у 0Z/--#NOT'Orln00ߵf75qs^_gͧO| Lm88M!7b4e<`0zݓڟkଏ|{{ >Q o&;g4Mswqݲ2dX<ߏ3>ǾfÆᕷɯ šyM`0=I>ϱQn2$r,˚2|-2t8ރnobyobwy?u۩i0Mqm_8PLyq7r?·.7ů^|B9 kJ=C8Fg{lc.o`^m˜7s-'(qczQ1FG0ߠR01(5e0ک'pQ5.<]T7WobݤWsmD湍cgdfhk?.gxc\q 0l!﫯 Ysms1Ԟ>Oo%|h2GDDD3:Fl6Տ18ŁviEs`za 5N8U_K`97~Ӽw%~<0V/u>`cg/ 7wY1(..vwr2F?wp&s&c,20To.f0K35in73O7s}P>Ә7'&9Aخ#ǟy`*`cem$+n̂mce3XsLV3ym;τú%=@uB9?Y}z!SN'诸/;:u59+bzei3S\3b"Ox*9%n^}p0i+0s73ҿwxc\èsh.[L9Av6Cz&gX!3H.7.zٯD^#^GI)Z7?OƲX]l 0<,bV Sjσ9ljf?9|6ܳ"_霿z;zm+ LˊK]D?q|;{p#͔/ 33GVٖEƚZf˓l5Oጕw'4a9pLp`[d3,,GT2clPsh NH>0|~Ig<4wyöȌ_1qJs3:{֟?ui#|UW]N},įn#@|yo_ fS;}#\Z[4}|喗383S9P3 bZ2V?gG~& !^ڌs.z'*gM;vom273|9opr{. ɧ_)Ͳo랛}f(DDDDDDDDDD+kV^tإh$9Ǖ}n K(݋2vhohlMOn_>%x:^^ 8B`|Y02#vnŜy(1 gp7tV~GM2!̪ C Ӿj8l{H#߿)7If`zο/ȦcSIԯoMG,Eggs7 | GVj+OrcB]`{5DDDDDDDO2_rթŐ3s-v/M@bX~1ѫYVG6e{7Al;K2#2 zLV;o&._}g;@ދ$!2|vny۷(7OdRd5؇XUeMDٷ!ѣhX/"""""""""rwn"7h/{na_R+RmtoyVvv M@a3ҲR0u{vZS7""" P6Ƨ#?y&},\#3LO^v4uM&l,Oƕa,:v=`sC]ܲH&wGcqX-20ؿ>,4pM稱vJhg9]G;³&DmGMұ:nib=>ÎTjWo 2o)>&w=Ou 9ӨJ"ѿMy` c1USٹ 4|d>M?M짙.Nfi-7fdkY86+ J+a~_l+mGdw) V,$m/Eq篏A۶1r΁:TOa\;ڳd-V8cqTΎBW˲,FFHR<ՉmdY|l{DyÌ +7>~̸p,ȼ3!$ bhn"p&O)ў$GaI6Ŷmytwu&"ǙadÓ# &""""""""2/or8 &2ϻiRb:Md^3Md9(gdr mceY(ƷضeYjӑaB޵FWPTޕ@,Te[ IJsWتljDec٪'`ںeRޕh.}p)r sK%%I""""""""I" B + MY|~_nȼ7M}Y+{-"pP,Mlu˂+ Q:ar Q01.Jޖ,""""""""""""""b>ӱ",47YDDDDDDDDd^2+,""0D2M """"""""""""""""""""""""""""""C"""""""""""""""""""""""""""""""9/""""""""""""""""""""""""""""""C"""""""""""""""""""""""""""""""9/'c`i"""""""""""""""""""""""""""""2(_2LN'Nsvip:0Q>w|qW\tgV9rq)&"""""""""""r4( X0=E4t:/.%)2@9O9e{{mQɔ\ˮ灯9&ܝDDDDDDDDDDDDDDDDDfpsr͹.}#<@<~?NGrFtN'{ֳWƒA•[ZNe^ :*ŽY@0PE4z #-; fR('abYI~Z»Lg*5/ ?N kO}XA67c _ć>a:9L|2o f<+eŪ gSK涯tnKκk<jKG#}y8xuo(+&+O>o!.*N?Ŭ/#6Hi޲x͡(t]""28+?J|mdCSz)w)JOt1᧪`1+  lidnWg^>D.W!K9/PIɮ7[ż_m<},ẘKo|~d^ sg`!>>? ÝOqݟ]%OaY}9U Qή}{h ;=\xٜP_7u';;Cw_"ל$ݵM Yuj.V|ݻāC O_q2wmdwoX/|숤|cF J[ص='w5qY"P_ f:("Tw>=R4w 2!o!CKlH:Iڶ1<* NU,-^ʞp;}d"""""""""""2)e ?{xq_}δGs}?ŅUY?u'7߽'ng_wl椰.{ռY^]˰IWeLۆū㟾ރob9oqvɀb+{7$ `rm`WnzHkؼܵw4{>^|r>/~|ޝD39|\֏ٗWs5Exg... o ÑGAxzD6{XkB"=BZ`O X`Jݔvv^w"$&~f%{ӿ>vD_e9Gd}v̄=SE M #""""""""""0(8f{YOY b{t/}x YL/ N kpƕ+T)\[$œ_e{y#kc|{/ mfm =T/Yɕ2o:~{ӂQE3:2+/}1z2GruN|q.׮roK/B~%,{t[msx c[?XlY<I`Ppڛ|ev3tZfzj*xki4eNDdfF!g.}+SΡ=< eSa+ ձ$66u<{{' ʷl¢szYpbIi@vva68M&i;gtty$1^y4_uuKd3yt8J.+o`in[;ZI&XuT.gcYI'{ɎM`c$LDDDDDDDDDDDɣE3⪏7E!O6_GgC'}}}׶#Fs.╶N`'i0cX}o]7*eXqD;ƠOr-缕CEDDDDDDDDDDDDD^G6ѦWW5aLjϻ^ٰ}q0\>}һXZǖq5 ,sܵ탹<+_P IDATW"[Bn}. <fX. /Mt,dE۸H+ "*|e]T{ϯ[4n<81ǂ'pqsrI/B2e)pP:;P|1JUDUWRꂟԇv/-$ y $<,/e7feIxl#},É.=Ŕ{XY I&zlN}褁qNYw37%[  ǟ#{la&;[ ЗlvgMY^Z]eAM d&qXV{tcm[M3%TVcnO("""""""""""""srLfR#*ys0O翹 |b*+K0w,kP{dɒ:LQ,altrʛʕX׷y$9q5鹈ljA64=cle%grsYT.сؤe׬,+ `[#5?J}xm/a8ןJuYھIg^ϲSX]%2J<.B}/}&-0Ξd` ƃ+O.9R*.eGi/cvdGrNp\<]pTrZpUN6%=DDDDDDDDDDDD1XCfI180@8Ƕm{Brj*+Ɵtx9yy<s舛\6zo[qcN/JDDDDDDDDDDDDDOĜDFrCC#؆ڳ+V]+߽wk{L4鹈fo`#`QuK l!293q`_bO #m{+lk4/SJxjaT$Zb( ߴh#%Ol9+` I<ƚ=ݟT:wccj8;^NKG*ƮFT?>""""""""""" E8ў.۲ dtl, #UΫY'6RpJ$IgR=Ď83$6am]Q#4mϥV6I*mXɵ"߱}fe2Ara <|;_s7|Zz$; Vz 7|R*`É$Htp಺O0^ĶN>Y ;d(G֡2Օx}U:\QZzS|3:LG3j4}ѝEwN:Cٛr,di{ofGݷCaYiQ¦ egGEbNH'2E̚DDDDDDDDDDDd^Q0 6e1yII}I?kn[PQ*]?=l=?i7lC6HLaELn[cA&u7)㳙Avw=KUɹ89dYIcLr%3l cPLʋW-"|{cPpNDNb`YiFRiFƥ%bXbcEAce^NjF"seQPPÎm /*cDDDDDDDDDDDDDDgqpZe}ғ3᛿}}dm0M'A2#"Vmb?`N_~Y% ?F""T@WO#`u.#B{{H? ;!#π"9Y$7ΩJKt6weY\R}"'\NMMc{x;Jz=akംS9uysolH/a{ ?y cSψf& # IrޅPSNII UyŻ{di ͧ (`+ VVP^VJqcV)ˮW7),O# %;/fy3ͫ;4HE ζշqyEt|'QRXHaaU 8\~;,npOsmg{wt"""""""""""""" кGy2/m0\\4N˽+4]I^Qqb}|uzw?~h7,r.YR RXA"r\+95ÌX&yyuYZilaIGHX*%,'ȉ士.nQrɎ[Ab?NܕXT?? `.Ym{.L N*ԙ!!||o奍1Ƈ>p/cl;?fhC̝QV OK 3oIҾ)~̦HBKdi}nnH,gOѾNj(OmOp;i!̶H#v16s';4L=&? $'ge^s7 %29\>*T+deaRw)!ji{p,}ݸeg]Ct 7;n hcRsƥO*X|꛸ =s^1M^WXs]>mړoO~ua|xfO #8=!K}=cAw2[9ig(t*Zr$, ;ȪxG2i,L<"/ę<3e'ˤHe Oa^s/`H&ekK6?(uģab,6q;b㷱 J-Rn2v6 """"""""""""""o3 7eOҫ$o f=?O+sg_pʠ$@d~І/Xm'ނAvt}뛸5ŻstC1 o DhwܹW}f)YG^#Mkm{Ƀ%achUZto `dB?>`9J9d"X0a 2u2acU’Em<!aـMo|粢"36u0,7p.nӁA%g_JJc-`8ԗA ..咆:Rvt'Zױ}8 dN\ǰHY,L7g{F'""""""""""";$:$ADDDDDDDDDDDDDgǺX/Y0rB$7׸?,cI}"E}{_3Y6ܼ bdP;m--tGLU?&۟-S3拉i;v0T;nQMhbx=IB0Γ{+ET>z)6:Rt;Nu v'E2=L8f >`*yI:zL" Fw z$F jblv]ObEwVoWJ kA {k0g ;C41pjrv <: slknmN ;K"c(% N%L8w 9SZwJ-Ӱ2D{[x-/;qͤXSZtnx7;0 Y2,T` we]\8Mf3dւ <0 ZR&6mcƻ{i1 0KFx)"^"^ Á0{I3;pIG14+kMƶ 'ٓdN30fNwne?2BiYv./"""""""""""""""o,"Nju`ʒNj6L9RDdZYs)e,SFOͶd=-۶QyocYgFDDDDDDDDDDD37ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDx`|9á `~ley$v*7YDDDD`FnWvh ی04vv9&)2g`rrK }Qy)IWY{7`z'@BBdSͦ&ٴ,ɦ@c .^*]d[dclC0<3sΝ939' !B!B1iDs' !B`BG oҰ3B!B!B!B!B!B!B9{B\X!AtSJ!B!BXBqH_!B!B!B!x4$!(釅B!B!A9#ϳ8 !B!B!B!B!B!B!B!H_!B!B!B!B!B!B!B!=A++4B9V@!B!B!B!B!B!B!B!a|qfpa14Í?=T J0j]uMafxsuimhB!B!B!B!B!B!B!|I_` `Wr<W.O_OfȔ\2kh2]3ņ DmƄ[ac}F=9{Yn݊[Qp@@ Z+iL\To !,ΙΜ2 Odv 6Ҙ|'Lr=UgcL[2p7YOi6Lε Gb͡u >_OOf\34C h*׳X.nʛͬ;5=f!u NٕзWQN;S̢Rkֿu _@/Qdmj+Y|/nm8}r!iLt& io9#B!ICK/_/zon wsz`g)ckl#)tW+'1B!B!B!BA0Ydhe{e.fxr}-R^G /$JF0|@&FRG~TJ*ed-Q~΄*NeJ `2 Sbw˅lLRDz`u|K?}}PXďy^ݼc7o>P YI~ IRt%J]f?7=iL'﹅C+,zz7er L(Jk?8`s{ytm4|yP|nP pM y?~W{_3=Ӱ6>w[Ti覉ۭchG ύcycI5rp נsTz OqI}-w=s?`@#{T6TSYKmfB!B!>X9t6慇nQZwn!!2u3<B!B!B!B4^?e̿>~< RfYy,q~x~{?e$S2Fd@/htjg3{=艐SA %и)2Cy*.Li;b<-uȉQ63^uoOs0hlic ܽMrD#DtB!BHC̉wP55lYis{|@wD!B!B!B!oOڛeL ԻI”>?:pjn;:4 F+"@w$w>N^6^J6h1q|.+_o?NPxfr1;3ϰmA"y&2o>!PeԍBBt4v, *t@W8 н=qv5"iLt딸ufl-k ĭ@˦  \D-~מ`m?½žYPodrGSm_ةݞ 2u4840<蚋1yIZAo*4 Ǵc :Ѩٝ3N,MX^>Leʪ=Tm'v΂g&jhjk$`SрBۏQ(&ũ*z oCt4vdUM.@sm7ێN3E-;F(X+GQpRSgu;G)cX03 j}oFYZ^XWECkli /_`QDZob=Ϸ ;,@쫧10iW^ƤU`MSJ,>+aX/6P0pa OרSӧs,vÀ#(ݢg),(䧿HjVFښjfLIlQAw{tLɈ|cK. xXg2˾M89I\ JDZθ~ܼLLFtDsD:Q*7.<Yg0q::XY 0p:N"N4~K) e(XX?I$tǧQr ;:Osc2knbՋ|?`kkWdS)-3%Ly׬j-BN9qQڻΜStHMB!B c3KbsgrTB E!B!B!B!>tҋG2cR ^7+$4|2W'spp.? /n$(FLl2cO˧r‧aQ"h(^\_nn][VCya6䵷ڝH|+|xY rbG/4r%9HO:Ma~}Yd{R\ ,;F0NCH?(2t.E}b}+5%i)Q#tE.4mvǝ>!\ScKY6LVd([A[ç1ק3Q 84t2lG 6{tCc[c `;ٔ'/#JGoX8J'%i~7MͻhH)cg82J}NA@<~&h:PEM$H )442zm[8h$#>Mu'tu&'B=IۨTp,C-I,jM~b儨7E{]x_S$egPJ[u#atd(!=\& a9}Dl=HmGxJE;oH3k_XsCw,uhiY0ɣXsǰthN^xzKw̬Rnm -$FL`B *zø6m瑍9zD6)YxK&s_ca0jPYl?巷;kX|;Ɣٗ0/wOYRC[VLaN~Jͱcqexa ~FO/c(Cp' v`}p3>j(J H°4d[e{$Kq(գslYxFZas'Qk:3%ydMj*e*[IXxMlٴc[0ixlغ-=Jǟѥg&h(h%Q3H)d̘! -&#hb} cFJ &/eHQi>xxox0{;^ϥ Llo=އd2,,hnW鼹 [Ǭa ^Ns.•[saZصn+{P$as(nO7pM0٫6ﺜ+w繗׳j~\A!B!Ź| y%w_3< _=LSVc?B!B!B!B'Jh8Ѧ(31%-^gƮj=Ϋ(sHb ZICm=o4$}V8Dqݼ;p*9˟b{o8^CuWI[p!a|!{HKbP8ePIFÄm0mT`eM9-=Q*ٓ9\D"DV BV}Cc4Jb(5c?)F 昰'btFN+uRnXwNɆƢ\6)ڵ'}#5p+tqKc;w75a]=  2uMUs)p@)Ԡ.fj~lW:G0 <}r t<L|f&H nV1N2i)>\[3d[MQ̬adpFH8Y#LLTv꩎u1{3CpmɉƧfQ. X-y-6ϡILRJ;i Gz7{Va")T#b2z^ow: |K3pMlkԨӇ0#si@-XkXV(ގLxf;Ɛ<M%9m:`q5Ŝn%w^ ytAZ}K4qiL,2+ټ;\mP0y._2U_sWg0ߪf:-aW'|`'Sq- ԯ~]WaNEU4ҧh./]k~MS+0l4.΂E85:ߍ]64n 4IE%̓} #z2^7g֨|NKKY|vİWJ&O/ǟ%)K[G+<dګɌ.nn-9 T+C)qd'y&A,?T dfw֋/򋿬bW];u$w}nrw Cr@=m[jrTR0?q#B~"&H5#o[NGQ:eӸcKt@] #42Nv_ǣ},4lE[k' oU/m?G*s ]Xlr?[/Y_ne`i!I7s73u؏:/kזPf%W 6e esvngSO,^<{Üy5yB!B!$/΍rS8qƩm)EnhC:Fpz#B!B!B!jy`cک(G`v& iy>6Tm *% ]#TMCϷpJy. Nq;;EaL4M_8B! ,,M ۝Ǹh㉺zN&4wfkxLa(e2z>tEl Թ)I#xӢ8I1£U8XҸӧscÑZtYVԄ^oȲy=Ϋݟw|*I'ݶiE}tƸ}b{RL"6[͎bGcKCyf_҆PFr晶,-~kj;u 'C~GG;4E)XAePNG."F$o^ɾH/P%n\3!?e8)LXfi'$銶H{wsa%϶JG725Q:]15L6~#a,t<?1ٓ˛ݟ8qjj`ZY)e)4F6s,HffTYɌIO3RN 'ض$ٰ#&>%i) NKil@3Grqם،rMʆC9ƿyR8M'%+8MIbdJ&c0R)I`ƙOsG2T' PU5=FcERj:3;xkO| n1 Rt:9xuEK1-Eq\x<|ػ`:Ak(/7 5^x}/9QݩȥH2[n]̒iHҚ==L=N񓓝;c!~Nw#,'\W絋\ùKX<`~c[4Ӆ?#!!DN@ oTLv>9o;rr[0G˛Iߕf2#f^½ϣ<Ӈyak5NvXnrfQеh]o<40M>y``[Jp3gbFӿ-$w8n\{G8~{_ a&+0L|ܫiiFoF}.nIu:Ns0h:Fe[g +g0>'K~gpmH"MASelnu8;^>Q^F/U& 4 ]&q`Ͻh:ȫOV}f&̘ Wư`:rVo!9(B!!a|)3*~֚Sd)PBjh6N!B!B!B!`1zP^HDi 9Sy;[փOqhLzF pN!+%~xWn?~˛Mf|O2s9|iIqvn;t^!x'4wJ7928*D&d"C'Q'Rf1jЬlbVDh X{ӘTBg# vG)h`: +422h.@BAjkFvX(1 %sߐMKdx.hs;wFN^S2F$͑sNc(LJ$d[)trB[  Pw&x)G]|ڧ1ݭs;eY?;tmne[*LΞF1{YBaN)iv56h#Q7cKkjO{":&m$t|Dwâ05Li4l`]K3B;*DJ JJA[#'ΙB-T׷XB/pyD+6a2YZ{YX/u9voo5F{F}Q3t(oȪC4%FՔΙ7P,T:#_&izƷXT}(c\ο}M4ws(&y<ȭh+οd!wGW&}f&ٳu{&N hI;ESжbuk$|`+R :;ʛf3g~uӎc&p+jZ&&l@n LO)fGo׎%酧]N0 [zHNh%'HK[ NC|(99 MǬ~?>',JYk(≓[G(s-~sG4yӳpR,{)~  tꈺ{A;AGC j'xɼ6YNЛ/+iw{-ȩ0,h?^=t¡%dǛXz /MB 4I5^}NHgOfSC;4woI7u[%g%37qOW|ΞΚg'|#B!Bqa!zH-_ OtOޏP]pr9ED]B!B!B!BsrU)V"D0lkfLK]'{lOCFJ] !>\xM-'AGC)I6)o;9m G;4D#X)(J5* y rC{ɐME[<ѩ(I5X=c 8tZ;HӻF,)^kO2f():KS "Nm:{-,f3v2D, JM ݦUIKa54R97qjX[kڧiSMMD@:7TК8Lj` >inKE`YyTt=K@'MmB<יSΚM4Zúc5;P88'$5ֽTE A8RGy{'#;YÙ)Wr.OSVζ*Z/FKOLKr*OcilQBSd͸YĎE\.v4FE2.A|xah(k˙& h4Aјq,lwFcXJC7MNS,M؋5Dmp_^'67mgl?4a#OY<9ԗ`A|+I͑c'.r֖v0 ]␈n^G;P͆W`C];h?zi 9E *zz6Ě[~Ov 7Ɵ?@ɸ IDATh}H H*.ecGs=տZwͼ??f܈Kq[Ȱ9.u?[f+///LniY5-% Swx/=e/LŝzK?RǮ5[.y B!&a|O&WWï!Ev[Dm\ĺ+1 !B!B!B!t M861z.'Fwl[)Һ^Ώ?a/ԯʚhn1`1ӄnFƖxjU>&͕GH$W8@)Tw؉0R&^ÃϕF7ӃKѕ|_2: w@m86wXvC׆m_uw-IO D5vl^_!8~e߽Npl_ݹgiÿZαsC#` b֐d"T#!B!hH_%|+_*˟{r*P'K !B!B!B!(ᨃw5s3!1PntӲH!_M s˗]Žutt?F[i'ҡy#掻nj{}p)M!xWu])tW2z7)ld ʘ3RHӅF>" bfT< D+(՘o* 5!Ӵ=]evE,WwXj*25f&8'g=Yt}ScnJxlM2 )kE$i 7 `w+Д8s'ĝ±D?!944 Ʋll LΏ=~;u R:>_v]lgcq瑘w:ofpUF~x٥l|m/j 'sFc1zI1><$(e;r;he#^= sQeϽs>@9M/XXp8ύcĈXWlmoF.:;e>Z_XKw`=m=.:Zj iLJa9 <QYK]k(7I8 ~oM0g~tU%3x7 U!&jSX2BґM<.j:vIvl"\Syn4O>`R3wە,.e>DWft!x).K3eLd4f[-B!B\,$/Ί3+||F65ppՃ{rlϺUiB!B!B!B!s:ih g0j"2eyv12533cZXq`h +"# ^8u;w6Jjyݝ9 w.7g,HiFBwC(9]#IfHM Fvmxr(ǜtu|09@rTBK!` MSMSυSnA"hihO4GyG:lہ Elt)0T߰=] sj{˲,0Y0T "ݮceF"-^+WrJftl椕0#wB~J`1c:& Q8l LJUKGױ?C4}8;qxoN`Rz ~Mߩԁ,R{ )fh'p00؋ɰ2ƭsp W3ħgIbAEorZTUM`fV+j ~'哙Q=jCC]3q!{Tn2A 700;8< EHdM{wyP0n;[پf5+u_`9k`FL¥'1kGضv3+dCTw$sA3DKK O&nt zQ r<*Aee bml{)v]Y;} S&L/M`ߟ¦,ۊwiJi+@M30|1;N-Q̙=iFXp&h>xjէUBM X(u]4INM~Pa4:X58,;NeK<c2#f63g muTtZ}=pD%6;<#T7J {o>5+ymO; wj6e˘6c" g@of\dM4d#^RGۏˈ >ke0 f!Yى= Z)ƒW% eeaS6$tS8Mgd J|x&udI9gyIno|A!q D,Z/iCBn ڷnQȪ[nnn?0?߰{[J'DDDDDD|0rzG|wښO? _)Cb @vr,}DDDDDDDDDDDDDD^%6_3YwvӞ5\4@#4|$20q6D +/9z-+%s,KL,1~AHӃe$ ^N(Q8p8 <К}l01ႆM4LY\dH6bׇ\䲼 iF ,C83>8_dԻ A j]&S\6Mc3 JA Y^qF E⸫*x)J PW<\/DX8Nn:88X~>R&;4 П:B̂%0wLJU">X8#ܪET0# 2096Ǯ6 Lc╃_/*oП{_^N"aL!WxIcv6SZz9A#_ŭu9W?{/klngwl =|~ 7OcdB.ռRo_Yw8Ţ%~ ;yw/94:n Ә!~`='ݳ/+x5r[|T9mR~C{r)kIyi#-KYpͥnSb% Q$!5(g!e-\ĥ˖1&e0b Mxlb5Ź~ s&W|0PS;Ӌ1/0~:N,m(* `=}1,Ջ0zO'm.-XĔ2ʋ, 8̓/p2\ڭў yOd"W<=c^_u5&z"t6uҭ2!y: 6C6i8.\D3d^'ŏ<#[˧g852`,?{xtbȺr5|SLvǿprc ::_G92 xy8$MdrE-WLtvs|x@\4tYYNȦRƴrMIYtYgULXP82 -hQ˴3.ootų2n97f-AHWdsKZ]!H@eK, 1 e&M68@䖠E g3s1:Dž3^l=ڛ;E~vT(2ƍ$2'd%_+.8Jcz$ZԱv\ -M4)j*K'äd<⧹.s?>wnOry\V":= Ox6ESǴ )&`g_d^RO%FWx\e̫%sl8+ak1mZN{8>1f^G&ˎG';롨3%O߳gKaQ 6M]Ɵ|)ʰ<4&joËS\cFI8jVQ|Yܳ^8uf3A=ɛs&aWCxԓe5iܲ {V2K!{y# sOs9}O*7c^y}͌ OݽIl{;3CkK/l /̯'{غa7/Yﺒ]{<ۮcEgaz%ߘ^go#1Af\Ɲ[J Ѽ,O _ޭh3aQEaor靬~|7IG4{ڕMᒕ$[~l?#Wpe}kh4ۀKo勷Os]wMb BdI,vy(*.2 uK_K O;>̗nsc鎑[w~35|/?|gzGh/yDR90ݶcG3$Ə""""""F06j T'yIߜ>vDDDDDDDDDDDDDD#PS^RΜEX>U 'ċ?Cݤ eĪw42h1}B&3g&6e/{R~. QMss;c+ s (dq?sc_lMݟuLVDe~BwO$h>wtLp[:vmQ蹁kKpӼMӓM һh:H1ɒ&wOS(H4s$6Ȭ/ ߸laS<ɍ>XeёupLjtʱ)kۧz,n Y397l:bYfytqc' ;tf2s,].t-šC"p"Cq{öA7wR&k,pd&>~7=nb\šSW,<7&¶v;"C̫\[kI_6{iMEXU\2~|KÍO8馪m{ܒ9:_bxE|{01ڊB|nh||1C:>LDYpO]~d-fUSQQBUӚ|򶏅w,,Aw=@<[t~tW°(?Mp8f멯3alyl>wO_ʗl-nR>?HNyGw>r;/.fdB^:h7 {P?o|"WRnEeQVZLUU1~ /nQYSJ$ou 1y K6F03bsZs9'hDDDDDDFa|yYoS0M܄""""""""""""""ov˯䆵pdhijN%q`/udik$\T798{?XZe@.uu/pHGhm!=C";PX. ,f e'< ^sXs}p跴/aU4j<~i<ġ1m<䤹z}EL*(¶tȋ]*'sx'zBL MhI`¦L7MVLBYs8ゆYdžsTX, lH s;됳^.5CSZI ,lYvh8<q0=d2c36OƳ6f~W]i[̒3 >I2p3۟9r4G:q/Jr 'T^:R W`%ȍΟ}|f޾ۍѼ%Azd/C rҴ΃T]9,d퐎vϟdcsm=~t|_RCTL*q6?t6m`L3{o.㣾ZE/Hݜ9,' wuL`y)X8Z 8T٤Q:Z;Lępri=cћR_Z(׻{(2H|dSaaꮟ̚"f-\Cϯ?DN.́'^U&Q^WO%`2tʃϮ=[_t?g0wa T~;K:h6 3O }fozl;~t|rüsn~O];]y F9,Y1 +H;C"';!;߂t6p&}ۛ44G"C'5 JLp9ɘAA`00t_8Z|mY'nWa&H;Ư_|v|-a#ݸLt6F4r+}^gi׾S{ʀ/?zG .|m+Ht^axxM lD.{ȹ`)-/#o8sg1@x=Dxv Ĵ38ض}NdOa եL!b){yv=w {g:!f(ɒDIo? bŗs /z#[/x̘SKM;;wC:;||יNyE^ T8=E42y{s$ax1/I_xrv"-X0r&pHG´DNBWK&;xI{ݣ~<ouY6C:6D{tJɡ0C'\9Ebϱ/=!Zp2AFi0O|؎C:?8F'<"""""""":sH\""""dsnZ(o>6$Ȟ#Cd+D2OL~+$9|8Ir?|8vngӵ|HgpIԒ*""""""" l[G7y5`&""""""""rsH1ߤiC< mcsGbEDΑ,C=li/886#<ߙ_ g*[EDDDDDDB0ΝA</bQ8sIa|EMDD g?"eh o38Wy }S_DDDDDDDDDDDDDD!/nsc]l{̸VAd-W9){Ir87 ~2sg?Ta"\yGa7=9/}wo =0Ͽ7xmxLc_᭗?Ӄw޿ \1=DrE:+s_aBKo#{9(&fC̺=`3=:Mϯ8<I8s~Xxۧ6Zuur._%~hL<_01! CةcuIb %J>5py~ eܐ00!Oea Ƕ9$RTZNUy>#@}a3G_SPX@IY)^H)xrq‘$9g1,7`@ @IY d,`pX"Myxpd佼\P,./ <8 9- iJp19V nX;q4]7,϶|:_wσ&O(o܊oh)緟7֜hv$}ucMZ{%+΀aA.ݾ xk/ aZ`Z`8OD jW9J\q A>L~'9p{oy?:a3˸ᚋY2%km`3O9?|*׿}Y п|Ww]*?aBr_K @dVYδT*KҲc=OKk_3_̴Y{%\2A6gcdgNɾnBP9GuuDDDDDDDDDDDDDDDBaX%,|1+J?D\ ܮ Ş !2Ne&`3BvTt P=i0,' f+ʐkyl_7,kju:YRQB~\(L~% P3t7NG Aً[)aoݳ FSJ-5S jWRз7KIaޑcu*Xy|:s U2{nb~ s!W\ s ޷}D6._5%$`j{000[ǁwS(a;NsxK,rHDz9y~^F \(,Tᒲm};ٕ2r!WNOӔsxJUzO'3I砍 UӘW2YExqCLz&qqݕ,+,Z3,WSpY2<}sq"""""""""""P_ΈW +*<ʘ4e2ա,є H&3ǂtmoS[kOt< ma7=OflH>s,$:߈{t\kp=Ee'e`N,6ٷu4#I%ܓ OTl>,] mu :HVRؕWg$;F)K,2 O]زXɥ=MhVc/ k3wVx-4t 8 ޞ g`&CׄLds61u󖛸j"fO› }M7_|飬1ng0- qR1Egrf 9\*2+:dȵ&x1ո%=0᪪0zI{>'DءvlCQE ,GZαgA^~𥏲,CuઓùS.o^b(k-={0SCL _ӴgR>ͭw|d7Ft?Lkc+;>Y>q}}?(twq!N96ܳ,!ɒ&Hr-~0Ld&AʾZ?A:%0u<|cn!(LR8c4G,ˑ}'e8p ׌qL \vs&Ar%F3ro"䏂rFR.n7 [\v 8p&Zr`Ls0)^kMQ1+T*x`GoˎIJW_z\.e$"uq'9my0+7qZnjf[N8${`&TH&dNT9fXP`('>aGWi;O<>ɪ;t*^V8bNZ]ݽ;0:q@Hىg9``}3/0i5|nbQi-OZNH[U\}덼eIYN=W8O⊈JG6mnL^s)can47֬/>s%lF̨ͤ$֤Iξp9~_\CLw>J.jbz3yjoܼغ4'ez 3\Q>z^ IDATl=$.O12V|CDG-pᱼxq e^ˋ-J/3SaZ P੠#W꩐aO P9sn?8|M1[`CIySHuppHqrĒ)u z)V1v>o(%vLSa1̓8] ȥHDDDDDDDDDDq.Ӕnkos)7w~)y9s`nk$8ӽЕ bG'aVaiȫIvc9#lD$ p2) in:0-L78;wI1,^Ui|wJBy+՟\6Kl8 P1!1Ùx<kFM:#x)(q:񳈈,nSJ1tv;>ĵqo[o-0F_Mt MN`ߐ1:}B"fy%}"e_=VmkV{ vmi3 U^G :~4;:ȥGX?%bmlAlLLBTg#NŰYL}]% RQQIi0>4.z&M8p .G&m9k&r81C튷0{)0xOfrjM\BCtFHfY~4w\N/rQTRtBvܱ >@.Q̊zBcw8+& Fԝ C>>vHk@ǎxUԠ;oW$G_dgD;:のAMO0޾"g0^l9!&jjXa*XX}S8fZ'Q崸+ftF%Wa8e7a;' WЋ=eիp mk96١![:FUX^7vd<~H;nw=y0GoB? X`=6D\T'#J35 `E=_}1 s6t8k1mJ.Y8 3]M]?'Mog#;ʎo3@@%[2mϖ,~V^d$9H+ɖH& @49;ssb$3U}S}~U^;n iC6h M5ždCs[Q,MEDDDDDDDDDDDD^LZ!!Œ!иwy++)9>0v~j>|;Y^MqU@ѓ]|ڛ` ;sG~nGMGh^}Cܰ ٯVD,<:;mAX#͜keLv:ڮY+UWӯє3L!\0=1%F{y$OtV!chbZsYZ;H+H`R=iaE۵\][E&}:I\%""""""""""r!9mOk§d%+DìYct>w|.J˛tb" *>JC)³`x0f?:@q8W݂&ainK^܂{bi v|@+6۱na|4z)܍!ʇ_Ќo;G aa-x,NF- S ["S.V675N# mk?T-OxpMs̡C*茞clsX}J:b1f˦q|wH10?)1zdO<9⎻~kpx8/Ģe\ #5t'wѰd$rH:g}(@0LHԡ;zEDDDDDDDDDDDD01)UjvUp(?1c8?-_onx#V0FC}{\3dse__Ο|fL|Dkkeo [H%ShLD^t!3cR( ljYP9},Wav# GOv{G2I3M0&3;zy򵰾y.r'' ,}3U\Ĕ ƌӟ)p-ˮbi&nm P9wfnNDarC{o?Ͽ|I:'4%o&/%?':;B:Dv*gqvu\d(f+[ex͏\{ 9WvK=D~X!Y,]s,l, "-4q1ƃ#{<%%O`;Ϻ|m5Ahqך ϊ`) YܙF6KIv?s׳y\p Aյw+ ii[MテU>q, biQ'K)6^#e\{=^ r?_wĵW2orXKLo(*DgqNQ~/K32ua]Ƃoe//?~Ѽ N,F\P(S3?q[nf%5~;U cSGƼO~/{cqHЛbbv/=DD^sglWu3b7.cCBVbq zF}gr)g McrVFB >G"V3g',j+73.nM;ΒMڲya&(ѯ+"""""""""""rǑo!0;m0w/1ZfϦ6,IfA]P"?EHk@b> So+-,`-vd1qbm_3~WyC/5#PJ&0el1&b5R_hCq'c#g!zӯv>CR6A~T];Z8=Ocd"zYa,ͯ"dkg:$s=΁Z5o%,kZ2|i򵲶w M1kQp=ccsX]uu5lH5Ǝe.a}LNlc9r1]1_Y)Lq4AfYuDOQ>Gqxe ^3psU0իpyG))1$Ӿfƛh^Ž= cz::^fDCL<4FPlri fQ=&,|X]X[Yd͑J3_'/hpSLH'CDDDDDDDDDDDD.n~Ƴ#%L/= {{3WڻuQ90pmխ{ئZ˽Ouce_O{|LiLD~ 嬊Fb sY})2a,yhaA48mE ʲB S Ua"o땏-iuf@3jf+ى )s 'plEcRM;S ضXzTr*~lMq)1HoQ,ÌLJ?\"QgrM`O)yX-sWƍ]Q nCȞLȫ άjBj5Wqu>I>d,.P?mQ3kyogϞ8El^Xndͼ]—lO:o^Ջ)='dns0dv"4,fߦ`\X6.o[@؝b(;E-aװa>u>>Jfiw0?w }"P?9 ̭n#*3b[r,5VHmU†e%^DvbSfX~:aH YTϥNvz 7ZIh@(2 RtNt_ȝu19?(/r3<dm Kt-K{>@yzi3n>C:s<_MmOs;?HrN/\$?QY*""""""""""""Ul kc-O!;O#m-Mw.|r;I-߿d\s͍4TG #t; [ЫLfcؕ&CA LJTvGrGqP)g\v|P=a!;9@/=]]t MQ:m(А;(qZØB~z{z`2STQD~IÖaiR"d4;Hbu$hq]:dSgFy)?2!<ʑ8`/cyJ g'(Nw]}180ʜRwA}2>$qZz$L1Ϟng/L2f824ɉRǔIW fKq2 G|3ªhwg4X|FDDDDDDDDDDDW ㋈% BC w9[\*SQ)$޳=5gItmq,[.Qr461>ql,\亘35#yqn9W2:Nzsi\+X_ª*-´g.rEqw,O<_5!"""""""""""""rɲZr?ȇ޹١<٢9,_w'+(x{AOҦmŵ?(_G @ IDAT~7?[b6nwU633=/"Fplxͱr[)mZe,<\=Yůd0HofB|El-ٴ37d?z?cYxŝqww8,x NrpbcU1+9` $ ㌗⟲#>f1801V Q>Gλ[q 0ܵGϓUEDDDDDDDDDDDDDSױMW.&́ʆ'/} =̗y"ȺױfF+xQFJ@hX|g9gn->3|AN_Z؎zuWD^'H9QEbndnv O [Nh ͡*)-ώП0 h57 Lf~;5,iv9ћdlc0l۩gUR$zIU|-,D8yl݅"Űu,nL?=IFx)7 -ri癉!SrLr X=A+,""""""""""<9-b>Uwo^iVpObj'ysHDDDDDDDDDDDDDD.N&Q9Bhk֟-gQVM}Ԟ涏eI(W\',4⚅1 ?  ={67n14-yX:q#Kfr'復Z-"rb6flbx|ZAMߍj_?9JdĪ5MSOd _⩑2&WDz捬xs{[D~e4~0yɉٌ|T(2Qpi^I/.FJ.>oO Y S \߶` p2c'V%ll\H~Dx~Cb`+iaspY8}8eFy X<|Lb >`s`v„CT"[1#8/UM0ml?AǏcFU CyFrN,,OWfa[6x.#""""""""""rQ_^;ȣ_std+̪w:ャm"L9;W19¾G+Ho%0oJI'Q1pus^ܵ8`zǦ"bdyl5`QMv0JBv'R [bwװR6WRW>#݌'_'; NcYQƪ&gV~3flՐ_u^?Jj""""""""""""""SY6}N#^FF `;MuuX$0,chWi:# DDf]2vkͧ !`("rf6B'Ov2a ĖdrtaSK߆G8:T3ʣGly;3B%=s Ɲ;5J##'v$,Vl#728ǝ+Xl' Uw+<;'3XS(&(M(C<<~  `Y9>"D F)w;q,Ʊ,<RƔ qՎ>6Ln函pCR[#Ɉo!AFr8riE U,-҆?u?Oo@}_&o`c,H39rB """""""""""U0x;U )˕-DDDDDDDDDDDDDDpP-d`Uʧ W%) C8@g;E̹MK=i !hCIx=V:wr]?ĝK{g*!f3xvl1CɄM.!Y6A? @S@nf H<. -`II' XzBb Yʖ>*JK0ɾĶ?WTNk!v1w56P<ώk8Ă7G\S"zt'Q0ƣnLfb˱g8\JѱSg"]t w m˨a`Evf_Պt2 N=r 2Ux`DDDDDDDDDDDDDD-q<ڕo}7#>yxul7^o~&|u,u9Ƌ(OH`(lrGw Z4aBD^C=ַnD-` :vϕ,?  SM=pbG{tbxE`wWae?Bh6[7z Ę1'Sg q$2Jl`Y/:$s~͠]Dz+y븱y9sCѳ^)s8{ra7YX ɼφzԎyWY *;,&_< cL\`ǃD;~\֚G1E8~ץ\*P?w?9>p &^?I'L8a%TeЛbp$Cٳijm¢++{.pwߪ}ظgȕ=" b,ݓLַTaz]%\`Y+`hWTKȾr;7,+d٣z!ˣ~fPH錗$j1+֮f$yCN(p+| ,ES0e,05;n|ّ2+²ܲ>""g`Leb038G\ave1>hNM&2]̯%6e,Qn9!|3+ʂ̲Ӽ4|P'yqO|l\Õ}4Y<sNyz&1dN| h.,N䉑 \o+@cl6#AǺ(Dsyc7 VV|7wcs:Ŀ+k)f +*/""""""""""EDDDDDDDDDDDDDD Vȁn|/dE)>$]9 s"[8\j;ccWb69mZi5wnyvK U Y.ԄmTb OȥȔ IWCgw߾+?H EtVGXѹ_MdϞsy%Fs e/s ` a|\F'ZT(VC[ '?@g.E- %8;h1Mҳql cNg;{n!&'(!?_ZkaRf ${l p)71ؖYFqY׶(evgS/ﮈ\7\<-IaltTvR>c}0pp,1y+@[ħ>usv~H"j4޽YL;nE?ٞ=7G2š^p!tD "֥4/X8Wfd5KqN2V.vp+MSٛ`Ȓ(;Qb~c-'EWY,iqN͑H-R:B?>orsskS]Pj#Qc*~" I2#4r圛S⅑=\NoO}}9* DDDDDDDDDDDDDDDD^id\v> ,Y_7uLw#O0L?o~\~'}_U6]O O 6?f%H!-a"e~_FjC/bo#\8O߾k65+=Iya{u,Vӟ'oEh6RS̼V98zlZf-+ Dz䥶=>9$/,K!XȺqR%7tx0Ʊ̫jqj{bTiC؛'Dsܱ:/x>dvH3~tz/GңLy0Q_/F?V/0rY~^;H! v 43vv9!wB85~:މ 5nfU۵$Ɨ27fy7Ģ GGb}6Kv SyqrbE"K0/H_MS0|XTM'[kS XDVz@(w,X9p`t "YY'""""""""""rP"gcf؅=kEX&uf!cS;rC{uhWowu Xn_[?I~Y x<#&n˹)FW?۹ئLc|߾7(\/O]Prs$y=֯SNMK`ֳXrycyr#g\SNagz+NӟTfi UԉLmg66.溘E8ģ[6ƬphcS$Y<1 Jp0=~%cO:bA 0^#cyalGrZfZ9{T:|1|1j.8=o#t  NphgT/c'Α-v{c[zUECs)>~}H?DЅXqq@#sPPjjzؗ2JdY ~6~'Dıȗr̹uv/LW"Wΐ=¹Y~↎?|<Y],g+ED b ձ`B<({vnS,y#4iF++fPLП,~UBTe[rLsK(YހV޹bȎ5XvVۧԸ >=~}sțBa|9ɲql 3'oJ+`ʚ0e-]?uBobZt K;xª_K`2ٺw)*+,4uI<}ŷgAFd3Y %"j{3unfH#evM !B0ñ}D d~.3_DDDDDDDDDDDD.=hHDb0+CgK%TѾd%wavUkSU7$D؀)`ˍNy?onMcNrc_;u06fu59}C9 yV9{ه~kv;B4u, &EƎckΈM$< f󿙃 Ud$NE#&Äbd=c<tG0 Ͼ)ltRqJhe>6m -"A ?|' [?slkKC$Nu]9CٽuUv2T7o_qE%&qƦDDm3<y@ ""c(Y+?UYv]? kys/_;e{}~by^}7FءEk>c*Y±6?AB>3i$n-3z)/#  7'\%L ̌3wYR}`?~ =i/E@1e ։ȻAaq[>>u"aNE-ա"[;?zsN n^b=l06FPgÝC= ⁍K9D&5P3Sp!` e!w}d[E4JBߒIC,w ip.+bOyAa!^;;~+|j?#^ş҆o05X]kxG; x]} dP"N|bPz3ZSLkRL$(#l8D"\_g-G`ɾ4.|`˹yT;^Yn]O`48N XbN#uYzU/qO7]P3# ZMCDDDDDDDDDDDDDDDDDDDDDDDDDDD 㟷, 6}{أkqo]vʝZM@9,~0q̝M␇) ՝ o.R/ IDATmpuq] %q%L6!KR4) e$Qb-=<8ٗ'>| 'C]i"f1o,Vn8H/|]C1dR8+?.V;XLkJ`( ASDŕvz_/Pq*g$_8 yv~7Z~qi}x`F[kȹ;V=W<wX=D_ĥn,o=-g {!6YKn%"""""""""""""""""""""""""""rRyguEDDDDDDDDDDg Is]b5#0.Ѳ ~o7biOyGEOx&M&bBBc?_ PVd&Na|%h&8O66C} 3=G+-sqkX<2Wy}0*mr2C *#q"ƒ z9#&nD(~Tc'%Jt, mR#9hԫqo!.zx&JU4\u+F?K/̓z7CzxܝVr;@kavHom&6@Moر:'"eɵc^ͥi2厃[UN1jEDDDDDDDDDDDD.N8F<2|!/xȒ?É'LYE51cTiLDDC!4qQE,HV3\m]xmhpDiXeu ttgP0&D"VGc8M޹"""""""""""(/'-ȶх;诙Xm,[V1|ZrCb~`}7F;&90f,y7qcĢ`qG$pinvnbމf,N9Kk3c/wyp"If,[oSH-.vo\c>îbib si4T1,}m{y_Ȫ=dNgc9˹Lj9ԻmsrCώ9[".bF]^a yP_N[n_N(ƎƗs^(xPϳ?+R.HgI{y$""""""""""""oN2u۸%̟DGowBLn~?ϊI!АWpu+X8}~v_+|pdl."(̕wk.g? 4<*"eS;ƆM\C;q.%Wq`P9ˢ"""""""""""r&)/g}8~93,|](djdiL"""""""""""""o/'>siO%/qem7; Zw->Ɂ_`*K^=oq(a Kgۦ5j&"<  [óo #"bxH8DBeK˒α:b3` i<.'3v>6^lc88rC$u(3dK=81*"Q𳤼vs-ɞk^DDDDDDDDDDDL0\qEG׮]hHmK s> d™I[|\"* 'מ+/#"""""""""""" áͼOYCG\ʊ|t ::J&_dacͽܡ-ՉȹDa|99,ntŢO` H M z=Etk&`0aL, ,Im'4](ww[[7 3V,v ?JK$%8qN05Uxŀ  YRN(B,%qHKVRS[#Q,Av/?Ϛ%[?ӧҝDXCZKcTEeqI.""""""""""""`ڻkݑGãZ0iULІuXi':׺4yzwtfwm`koh-чy+3 #&\Fܫ?WΧ>baZ6=}Y94)"g #`ޔ[~*A,nƲ.s/} 0P2=&ɘPUP]{@|h9&C#%ʪ M3p9 WӔe[޻62Ӣ L*K20-YM^B̟D[*}?6 e8AMDHD#'.ZƗc̿w/W0p֎~r&NԙL2]w/xK-7Q%000/Χ wP=@n$(=,c"BfO7qo}O=6q.n_%CGG/!^QEmUo +zL"F$lZA<}uEDDDDDDDDDDD䴸ÆcafϛA!BKs] \,/W[khly ̑1>5SPicM2?<6~'Zpkr_ä?>-4/"oIi R@e|peL>OKsT2n !C[@ /h"TU>)gaˁ'xn|qʘڸۧ.fBr.jK1{er|Cbt̮2>Ziht#]xpp+Ҭe&/D'ys/ŀH8IOlD*dM "g-dn5 {'Yw~ɶ^Tv Қ#,6vp.\~, nw~D`,gzWAPm-L. 7_ɁQ yO ͯ<:tBMk*y-]ɦ1'%UqB!-fɴ.""""""""""""r b442 &ٛzG|[q&R^CdLxsk\Z{F~2%\Br =P6*~f͟ʀI\?g,k ,l8t""""""""""""rNpA)xH\wlOYxnp$_ѵ+gnՑ$꙳Z>d18sW\i\ۣ[8:سz%OmKoz?\u^];v~""'28ڳ vQHZw㭠20-]>z7x m iF([L3X,[pñZB7"UT"""""""""""؀|z|BD?a )!Rxo2,""""""""""""r0NEW-WLd7vX=|',n#1һD˩sٵl[>i~L05̚5p|ˋG3'U:̙] ȩ 1|5nD0:}u sE\>9uݴ5{ <}AHcNmdY *<ӗg75[K[̓ϑ.(9/C0pwԥ ylb)& #9(/"r P,^ișJY2/amgj*ut|p#IE|>$@iI\w bd^?%O%g0P8a7Ĥ3KbU""'¸!pqpN6n̸ˎiΜ%\0&Nb^~'[wS+rS'=ΙCk.`aYK^=5մvʁs&^W=3y@n3 ,c0F];ks92 mhf;3+K^‹p>K݅=ʺ==ǥ~B~c;"m;y'y>1G‘{ط<Am>_qѬ_n"3ס(1-P(N}--! dZy@۪x)NO izN"cL= {ֽ朥{ g.*^mw8!GvCȄaIs9aBc$vC)ѽDDDDDDDDDDDy*/""""""""""""$]m&+QXWmpx*&3A[GqEk|ߧX"xm:,1HPU7ΟbPzP@D,Bq„GpWqN?ڀ|kgP?F+Dclfhi~ddY| yބTGJ^ ŨURF|7!IR!*:*J"""""""""""rR_DDDDDDDDDDDDDDDfuORw:Kkְ%LYW[hh;ihEK ~z_xǶr}S+ (M(Nu]%""$\qqBo8DYZ׀c=k,9/K>(b"M*eDXPUOc < " <4j Io/am\`q08a -rJWNfB,}3&DuDfAl oԁ e:&Idb,&Gtr~"""""""""""86&$I6m9C8uMPWIPZ…̋ViC%k%~r5q*f'sx6D^͇7 CG+/b'O¾~E$h6 ÿڒXDޒd+18n5YJmc]OGg;i 3-/#ybMX5yQ :D.8hqi#!bv jB>=/n|:v+=,cZRE&U63l*Hm$J Q#8`*Y;9}r%;[bL`)hg2"fE t9;ƽ>,3 f\H-4E:1 >JQ?B""""""""""" 1åu""""""""""""""n s;AO:a.85q"+??u{lj/˷ŝ, k'W%>vGw*H^ozPG_ˌYX,al ;_c`/y3Sf3]l|R;16EcC0*?'3{jQPAZ<.U͵݀`Zi޷}xDž--ټ1Mj܀`7흴K)1b_Xù3td3%;3^j'S7M{&OEn&[ϰh9P Czҽr:gۡqΌ; ŮC%r#,CZM-yc!\U4'j ~R%ΨP܈QSl9v\H eFbX?@l/|ɽ0^^z╔7Hw i_?B"""""""""""EDDDDDDDDDDDDDD 5'f^ p?^$4uCB|+gzؽ=[B!c }K"c |7p,~m f:?0 kt}2 fpkbmo9ћ:Ho}+->~t[3mcGC`7APgx=z (=Cg;s!rCt fs"""""""""""""""+xcABXZ|RNȸX cwq؀=]္=飜 x;xHpDDDDDDDDDDDl0{pst(ae IDAT<cB(H{:f c;e1'/z(!W+w#wq\(d3g yO0kp.ĄCo@f'g GK Xq%,?ƪ2Bd9E~×,M(0YQK[>z+MM?/^nPHDDDDDDDDDDDDDDDDDDDDDDDDDDD<0ㄉzc=ĩ "١>zsc.o;v!7 L4L\y'T1>)nv$"8ak*Yr 0lY2}{$"0,SUN7քʪy"/MԖq)Kxv: cٝ0.]rf^NX EDDDDDDDDDDDDDD@]n\V˾d5CDDDDDDDDDD=Ca|-ᅰ6wmC./dƤ:*ʢH烈f@I 70f XiS|\3/x'>!+#fs WI-Av]8.H>E/(mzFHs.~*VmfW0~(FyEuft>sk&z"""""""""""""""rDΗq1Ɨ[6g7cY_ {w\8?wm+mk~/ܱp;h>ԅƈ8]`^q# $m]wugCGyRcsл)F15`/ | ,lmx7$'qɕ1:˺G~/_MP넉b$+*870_=0+q`o?""""""""""""rV #E"" 0qxdaMl 8aͣwE@ """g3~U|/@Ӫe]_+ڷՖ~"ָ6x_970ĒS3-aB cs|70a7oB0c );ƏIƍRQ]A$ȑN:Q&M$h[ 뷱#[va` a^KP{§vq_F-Z :~w'?}9=$+Bu8 >;L, X(߲Fвk0?֏.s0@j_෴V%hC{>A,]xZK{\cAb ?oLBLF>yM̭6^zn]͏1v}vz3]Dc-N6=$j-ck n(D8lY2 Qgi",^~$FȾ'WXK/#_׎b{0?+_m%?NYrE:`w#{Jt7FTNcѵC""""""""""""""""""""""""""""Ia%ݽ'UvFYf7uwSh50⓸uql g8fS|cݜ0&R_b1nIMٸ+1@@߱~%Ý5 Al!lBr{p2IL:շLI̙;# rkO`uKv6&I&HVP%b?#LYاd2rl{aʘ0m*Q&O;?~i}2A<NIuƊc"C]ٹ3Nm2A2(NSIwZ`7D*02ȵL02f]zM*+۱e̚1;aRӃ̎s0&`"""""""""""""""""""""""""""9AS7ĎVQL5_9a6d-k+)8C] ؽ[ ZƱpp]l;qg/ tMx=-Bş . 7,(Y3p.s1lfʕ8@f'Kw iy9`VVHa]_kc?_~1>=7p o5#ڜ)hT.V!8[>r-wW;Iy<ĖM;Y Ч9n;HgùbW~?#Q.?լT1o^~`tTq?cܸ-bBnv|n="8ϻO],jk mǺ<4aS󍉈=ƗQo|7™4TD{ؿuO\ɪm=wTib+_ lq  (?V`;=ZvaM$`C0Q`ǂ.k1qk0d{G_foRX̺ /O݋HyN^}I"^2|s\y`'M@qBg3[9O̾cLYv  zz:p ٻgO\ٓxy{;1ϓFaC.DDDDDDDDDDDDDDDDDDDDDDDDDDDD0)F&ؾ9{ag^?\vLco_X Sل``+ QC8P: {Fd AⵘD%=#oqj'`JE Ff'G( D'Obr4D3GQ@m7O=ϾYt1/ύWx H ɻ.O}JRxgxy#Q{SES8#ÄpqjICF4X8bwrRLY 8??z|Dl se|33/`{f!+9{ IVWQf"Lhy1~[ǩTDJK~֯̂sF&T|khˏ}kߢ{u,=s[;4Gp5,f,+40 jxp ㋈0íI\ق=s#F'jeA{IDDDDDDDDDDƠ04 xd߀T>'/3aRF_t} s_Ұ3"("v;;cp!s Z{Aͩn вwβ+.co0"S>ﺉ+f跹"P̥hۿݒmGfDDDDDDDDDDDDD'Be$fL@eԐf}ts1!N"ÂåQ xֲ'6~k改,s9X|}8C`zeiP$:,9,j ˁB ـt:qCoّx!.m.Ņ)w tvc'e“|ίy(ȅ_:|&QC,pKzmOsiSR_swOZ@aA,_Ɏ]!7^Ǎ>Ͷҗ8e.!'D:˔%y Ɨbض?ύ f1wV5GZ(Iff[)>zAlLlN5N] " v0'BnnwarU=y6G,  DQ$@Y$[m{d_ھ>umږ%KLP%Q)Y$E 2漓C/v,`>X]3VTUNB2ѵeeRv*sujjwT˾e3(+BEs嫉m|9,κM D%2{e08B!B!B!x(Rݲu;koq#}PYPk;ß!w'?Jyfߒe \'p} q/W_cbnN~xڐ,Gm>ߦ|&f4{)3uT{G#gU۹z)K3dБ\U_E>$3YB!B!BWŋvu[s߉Gz@9UxPeω#lj^ƛITft}g6è%k&cJK+jVk#f>ġ lٰuTt _iH"A\H -*K&S:});|ٴMݢuKXq~rmi&(s虝 lU/da9>Iqh;D"Rl<{s(LdANd3dU!B!B!BY$sխ[#Z9F!h'E}>-xݜHi^;;G6MO2r3?ϧGHl,v-jtb<S@j(vtF%/Gy؏LLNMX^e ߇?^gO[|8+T($CȼBO f<3ga,M2GhK<Π{槒qM4GHa4.r04S]E8TK[hz|0Kl۪fqu I38ɐ֊E"]agp }RVWFG†ـ}a:GsCL1[!/ʆVhjhSwbQHӡp3L/G1RZJ#4b׊=Ck /q 8CGª1þǾb+ÅRh̩1M'>; c6 + !fiV4νh0O4GrauvCrk.'fY~;`nםA8Z"U-,ѓ!lEu$iKц7OB!B!B&!a|ns{~MH 44&)5=9GxuiԼ˰-PeMiZ ^ ݅NLeLcڃ%PޅU@`A8~HAðb+jMX)m Ø0j^se׎SkVR ÄK%2c70tW7 9CaB0!i\ RǾ_'9ă l\Y̒)x`Fl;S3f K6a6WPt M4F8#5vwԳe+B#s!*͊X|W/H9ҝ UxӫŻf E1<&OSmIU v}T>e@+Ų{ŠYo|aW[:jÊ`V15 , 5TJ?z>~r2Vub0r-`cft18J֣ULa2C0'=3{;poQy=9nB|L~ 3ُw0"3Gf{YΏc~?8|UfSѡg" IDAT(CksM$T 59CO`8|mp/u5$HDChOO2229f6fz> 1Կs+_s^#ݽgno|2OG9vZhM0>68Ccs!04QpB!B!B!x)8d3Lȱ[ipZ]2ش_~>~bƞ ?̇Χ-@WQoi^gq`HGYp% b?e0dc7o%&Υ7~M2p$/xIKWpx~%YӺh,gqzFZ% usteMqEb<}RB65`Ӽ*=36IXcbEU 'a~u+Cv 'gAօ4WE4c广qNzKx`89%KKtj5Ǐs++-Edz%?9%ָET)aB<M>nсr@W׏P eK>P2Sk[ؼ'nq1y{ե_ҊUT~1AԳ[8Ҋ*/Of4{t1շU5,KԒKogw~TPWmem,pj/OL1(+\V+t@33M:TWo|Od&)Gڹi5k.Asxp$ [95\JcKKڸZx{x$x !B!B!8ߜ3^)J <ҷrÙOj(9Vu2x}Hw+_$SLvaRݠ;_ QcgnJqL >A\fa,drùRWE y{ƶ-,0A-PLr,=JX !|^h;C$WYA!B!B!BX]R#ƋWP?8|$uU(&0<9chHT%`Bq&kZAvw}4p۟/{nԀt@ !^NT'u;̠?ƂyXoPhlO5<OrVv׹a Y۶r8!U#Fǫ 4ύZU32:b5Df$5E3"WcU5&9bۂt; Uټ'isu+&mu@g,ǭm͍EU Ul7: (B!p1ϣqxWHQ:ǔ8/L&aтB~לj>xs"k&`\iRfꞜ% z-[YO:͓Uki&xro{ a5n`]N$hRկeNyZvlz,0:?FѮM-n\ʞnf=g!B!B! ]Y ċaLW.Q,%fbݩs&_5[Q5 PExe.Rį`KeJ%w  |rR@ `t9K}]B!B!B!sfTj +{[x~Y e'L4(Yp-T/ƖB<?N:u3^0#}*?H^z/!d,0#W<YyRAa DSPbjdOH!ᥬHf*X}FYQh5vfư3 g}hqq`m2ėCz\X1NB芋6W[h(`"4,0&-c6k&]g|z Y@zK>۸f*>3 G\$իNMJjtTIuCـ֚+U6<Lf1%&s̃̂XužtT rtNg2h6B!B!Bͫy!A,A4&=9G]^z92O Wv-e|I2=YtB!B!B! G+ M+y6#L(Rz*Vyr>I/cGum qXV!^-Kw hTPe S>ӂ1z . c5! 9M"چ& T;N&+vffX/K QgӀ!nk>X⒰p8LQSGn'X?Lg Yeڄ ?GgC,1E9x`HWVDR,p͖" bAhjŝW+]LE #Esƪ-#mMT]@D53uLeUў\D5өQT[D 3{Pc|'PԄ,(W>]B!B!B!'BF4f `RKÐlE'1]ZEBBeB!B!B!8_ŲA':-O>{ϧKp'\o:'>çnZy&rɶ!JLfgI !ī N @ Gh|  o*(C&~R-4]@>:bD>/*fcdHx)n[\xW9;6S18Z47,:ᗓONMQSRp~VرhpYsYؤakf9XJ"5a@ހ!@ 5k_RX|f . Κ04&G3/fܑELA9+vDeUd2{tss*j4>,H.bY|/ cLpP@uhR4ÜzM1^lmK3Qg4w$R MȲ8{!B!B!瓳B,@]S8D@>]# B!B!B!;exV˪˯?~%ߠMT$˝9c<_c'lJ̇H7BF10&8S`bB#4'qA)R.F1ҩݜ( )y0߱YRD6S ߠņE7fzwHhҐ YncRl OS9uNc}Ų47F6gs!dư=0 J._"~5JAkⶤey|)79c`V\94]Ƕ ڐ7,x9Z$9Ze%s]beHy$}v1PLVn)frCYXYD` YB!B!B!7 Y!^q>: RV"qeOyL,VB!B!B!B72wc_o/o]S[VEKS: 8n(6DYBa>!E+7g_phkUQ*f,7@qV1G6i ^I(z+S:A]H[<>P5Պ$V (s37 !B!B!8HM+x}e(*KB!B!B!xKQjUߌaqmG_0d 7m 1uݗ?+V)j~A~Y!8!xc(1R$T/>1h|!L0ΉlEщ#h[Hsb)Keإt3B}1K*^ϐZ[ŵ1KP.F݀cŅټ3.+B~^T;bqEbO ;]Xgh{f[DS ;r>]s yzXRX/Յ,>Rms rt\D5]d\)QN-OS[hr(;}WeZ:T#^R[JCyREc@3wxn%$3gS("G WYyLRGfW!B!B! iB!B!B!B[)Ϟ^cxxtpMW].L3Op8uК xUWwX/rOgpB129_BS_02@,4;8#;/VcC[ 2V~k}bK 2+PI?7Psw1 7 {J1 J)nssLSv=vZ[qcb a)x Ҹq/CaFZB|~?\x`PZh;ZsKU6pƗ"Xn}HVNb0 &|-x;J) >;$?_}*X_I9B9e&)EU0Ʊ$T Lgɍo*<1O:8}mױ$98Rpg ’-)<ξBXN+[[VPg k8޻!o}.岆6p|s]!B!B! !B!B!B!%SmK/ . )؟ln~1dus׾e?~6֮/;Cͥw8 BYAC"?ҳ$&x !%r+7З4 psQ29Bn=kW`ˎ+& ; >c+|(x>|(1IAx4ڱٜpBԦLJh 9λ;Z5as}vg}~>#?0YTcEg+ņ݂C/p|l&l-xRiDp RZ\QT)E`E>kRa x(tԵYg!r8ڌ sz˪mF}CS޴9' ׳hښ<~tt>ش7]BU`A}a1V5শ i6 V0F37ɇږqQ;Yݔa8I60D#&Î-g>'ك8KxV6GH!b48T` ee(%r&puXնM1G !B!B!8H_!B!B!B!/5ҷk`+CXkn:).Ƿ{c%_}@2ŧ5/gU +2vw>G՘0åI !K%rnE2C)𧃽˒qN}ǡ4ϻ $ߟ><4~f6d-LdɬRp,a,]O9/z|8&1(ܓyhϨ18^+?cѢY &gܾ}.̽RIcߏIUb lZqMf^c(>CtzMX>B=`OϡϗO1ern\z7?<֋YhN))7GwU)lɶy<>[A822"B!B!BWN^VДK%:::hhldttc4pB!B!B!Bי-m$MBoM5+P@zxܱR;^GKc-Q; ?9DtP!^ W/$CQ\r0 JA}^VF~Q2^eAa Pr ++J cc({92ωX1▅F3:ߺX~:qbj򾼯B!B)`b!c%KraFGFmo>ٕB+nhC# a,]W0 io1usٽJFkC52bp?G{'-I4`AU1B¸e4'ʾK!B!B!B!^=~)po r+&b .,ae|Cfgx&}ds u#{Oc"rDz *74^Ē*Ўַ;[GaVPfWe}+ #w~>5F @[8+I_!B!B!B!B~bc*B!B!B,j]p۶%$_r9GFZ`q d}:/+YJ0X|Sr | Htezy;MmmrsEUZx}>8B4;B!B!B!B!BR,olƂ7B!B!B!ެfOVeYr{q{y5TV 'GJ)*?;>p{ٛ?oo ʉIT8^b-Yh:mGQ8*Z.&ƔroT`QNFE"1 Ǹe03Q(3>v *D%jQŸ.`a'#H,jVӵ׀Rc[PT_:1 ;:)291I*Pf4e9Dc1"#+P*ְxmȧ}Ja;a"a4ZGHDBQjjNd2E(!diV1BZIVS>1#Stϼ JD1ꨉ* 's E^pab$!@P1œQ QΤ /qmNlq)KH!B!B!Bq IDAT9G!kL'(ݥR!B!Ca_A!xI-K[naIY2$^5[[SzϽH?F.Y~9N t,2TpK=Iix$t6EZ w !JUr«.n_m) aApU݄D6h 4(8niiD) v®CS8!DPs5kq?!stD /_ N5]ȕ'7]zmcr#~!w;@o[>q??cgzWO|Wl[$O$R>>˯n3~25pWrkiOZ`z(#9wj4o?6Cmb⑯_0ɍkA"~uL+/y[pt2 ,!B!B!BRXY$51B!B!L +~!xLe"ś߲ kN{zی_,][ofkWc!\Q/ N]3q S* pٗ-`_X4!R'lgԜA%3>Lx+mZBӻ8|=SUVV3rt?:p'8UVsu$;/3Y 2}lY ܼp_0v WE=76@A+L~U2N;)`J'ĶlC/{ӔS'3 g`Rœ{#. x>cM ;)윪YN쎛a ~7uN>kک[(ǡ*AbU ^Ljx:Ij:uAYaV\G~m{7<_>|*09/=} ̶_ޑYT?~<8zTE_ȊTjx:~CMN%[y;W\s1cGO0=?@t_ƚ-y}w?H>F e^Ł0F8 ZI!B!B!B!B!B!B! EW$뮾VqީU$ g^#xߏ;<<0P=<4A~> v:: A {F`xiB{=}nyʲqB$)ʓY=i|Ž/py{&;7~#yjo7)db*"VƆ+u/doT ps?,\jp Oŏ?H ^!O|${5H!{!B!B!B!B!B!B!B!x+ xBm"3W Wz>ڱ=70YYL+˗nQ (VTTU݊P-T}-(V,}>uLFٖdu[ ؀1P!+n!B\J*[e^f̜~Ieٲ՞Z{{} 2 =O 2 K̒O`rpyrhaôe$0m4uZ n?UgqU|MU4YhS?w=6h )9""""""""""""""""""""""""""""-1e\~jV.J/?#GR-5f 1\/%_*fƯpThBߌ^b Vãe? 8A&SZq2৳EA6O>{Yc3 $Ay H2>Ne%UKZ + TZ̽M0A8)8/v~x(//Ka׬Yv>͌g'ǬO/S>P#U#6g:dPܹ zW뿼C~U)NJ}ɇmcLt-`G &Q E=J2p.KZ'@a`}|8pg|ބoh܅d8QfM'_ ▜V88eeeW0iST]iNx9y0h MuT^'k*ib59V4VvW&*f4V]SfAy%W7&D"VOs2 """"""""""r (~Jny?`} K91bOwZ+n!?70=:շéL+f<8p~~l'n9NUDf΅;IqhXt [>}sqT4L0~d|OeXM K-`Zmx^kLbfs-=k6]%RV0;JCdj0x6$`)Dkjn~9-eE{'orX|r56[Cټ~}^iWȡr"z[X1Ų_׷Kۉɥ~5W9]s.橆O["Z-`V}<^IHa|9#Nպg~xYo9^!Tu/O'4؍N (OWr,A~ ܺ֔`TNƭfAnzIqk0rLqj.o#J >s?7l}UߦNV62wȎcd/{wc ,i{$ ̞!k5l{Qm7,i8;LކcҔI4vo>B2]ҲZϬ&QQNLBhw{YL122H]lIT \E L~FEDDDDDDDDDDD.&`koUKY0{1o8>fj;LZn:ͨ_>Cxe-{3#^?"" Sܺ)[ 16p,NmP0Gr$ѻL"""""""""""rV)/g$Z oy~ͳ>OBۿcFxµs!"Asس1N "ӯRk!Eq/)3O|2yn8.ë́fՏgl9a`G4enekqq85!o]k+b\u$<<+қ>53ҹ~t;nY{>ǒd$S,`0XUAuqC.!Pndy5o>!pwR(8M{zns8^'"%cqsYx'\7Fy8k=r^ lj9+f?OJj#0El`!g4!f^Fe /r┹blp9cƉQB%U,9]DDDDDDDDDDD. ˘ V/ީn]c}f>rL2Pf " =Q? G(t?C ʚ02(cG E<3o#ͩ_lǾS? {LHuܐ롳wc6lgi =>½_+RA16>?jʆ&kA>2<^~?BɆJwDH=Czn\ ,#,xxicsݫ|gW: W`qCb:+nLio0NX< .oD*]d{u3Jt%^Mo~51mSc,|'f9f=<\b0x֣lK]:p(9'ƴxslʎb1_*VnnL1`?7:n ձt \8jZdzvl1q9niw`<oј0+xEg󳶍&v"""""""""""rQ_~٬Oᴍܲx|OV`xUOb #aʓ|`}|z7:K{R:_$xisS, ,o/?gs7*cQ`nEEDDDDDDDDDDD.꿯! DSV_l\ޱ ~F>7i4O9blߕf*Xw5W΢qȋ]E"R۹q&6Ǿ,nI6{Aq"H8Qܱ0xƄ)QJ^r[{殠HzeLD)4O\W]&&TP7&RMsy C|ynrKlGL42\i p0b~"N,>6 W=]E]H%5(FO^)0RL{j`eˍCrvTěiN\38kZ tg[YU~{[Ţ,6.em~: ⋈\(Ww/O䷠DDDDDDDDDDDDN 3g ô]8 nk3ߩ0jqvu"#-8ö'+Ic勹c*doHcv)wSyQ>r&""/)gil9w12n9wϾiS^ǵC+ [*O&d8r?hm%}t&BuYN~`} N soÀo1NӛiԸGHpKC)G8l,my!Cnl{?Hs JZY=sXGo~AuPWws ㋈ȫȧؗWZ.""""""""""""ceq%Rov}m),E7D8f4~ лc='FN-ܷd63fb]͟}1O~|7Y[y9>:ԃ7xY3uvFNjs>Fnb;әKSξ}JP8U&}c}]@&7͢;9M5C@:~uoω#J˃"baQ~g,B\ 1†g2:1Ka|yu))S[F%̼v~npy9QH>?VN20CB>ڛ qo^YϺ/~6h)"r,2.KWcg瓴`nV4bi hȯϛ(S,䨉K/$ 5Wɯv_?bC;?K󖫙Yտ'G+L\VNo$Guxr}c,^uB;mc;r(Ɋ4ni GM,Ym'5./"""""""""""7EDDDDDDDDDDDDDD̅5MbR]%h%s#ae+X92B>7Bw{}Ѱj)~\[3jn5LgP=u ~vnۏ< l5=kwȳm 3wǎ{9s'l>dzh'],m$"RdJJø -bY"J* ݌M+B>ͬq5ٮ#$})f>E] 6 |>D&rL"]$#!fv jC ^*nb:1p1hcE]=+OLj$fRlN Qo.!)Oq0̬G/Rs$s rc+e|lVO$::/fNH[>eSǮu8\/ SγCìU\ָ\GDDDDDDDDDDD伧01b ׽yT˨R1f֝Y}O&e/&y滟knznFr*2ͯ}<j$h/jk.a/DCpYǺm:7SZ΂Uܕfp-4\͕q>N%u9^h(FfV %.Vp-gRa}l`K{s(7T F{ [ܦYSUFԍq#D$yy@d{:!}B82iekrV}9 %yOqWDpWTLnbC_+C^plké<Sfie9BDDDDDDDDDDDW \\HLř4 Rz;`͸4]ʲ1wdǡ~Wl[)8ACz 7ڀG6rLk20sv}!NHt?=><4o-Ma:[}!_mOwIlL'C.1>=Şl6FJ+*00)_s@i1zdٙ5APwd%}N' gs;@q/'8EWZ|%iJVyNa|9..M;R,= 4}>si۳}#'29cbe1 g-n[^i- \r̼Ň˪i1b%*rxwؿ϶O'%B ArNƙӟ܊`/tOֹtށ39=/iH} 5S W0o?9iisbyމnq:t`*bj0CC:1MP^ Ef>&a-񏶳0`0=P5e&IJC]G_$!Dee/v,`,`G(+Vg͘rP}OS\ Dadoč1W\SBz؁ݘw17Θ &czmUoK X(m%"""""""""""""""2,{9-T!"""""""""""rPV~NZ,m1^[QJXs-S~ sÊ\E9ml=s%&7 sq]q\03ZXr V(̾wREC}bHc>ոW̆{6ae-  tm{,&мFv{ !9W;3 """"""""""""rÚ]D\ Lq"씶9?W9[ƿE$8]k7P_UwX]q?Y[޼w]OR Պ"""""""""""""""""""""""""""""8"q,9ڞ䡧ǂc ;WgL K)0J D&p `}b1ZaRxnjb%2<=TEhD lIeK\p{C.DoE@a|yI#2Pdx?3S8:nll߾ ]bTL44C[y7r*VO!xu3{<fɢ~Wh#z/9 fܖO`b+ 0#6FIl,]V֛͞8cEbB+Eֱ䚕b*UTVVP][G|͝|x*FHз~^}8n#_1IBuW 0hnqIԷ0wL㖁ûؼP1U OgLpv&"*qKĉrN~]CkVG];Td<`!lvRu CgԷ;r>_Nz<'Ua7prǏdzsnc^p!Gf'6 䗕-){g㛉\Ɨc e&Zޣo Oիk aw|H*|n<ܣe[p914c"ضFS)Fm0Z5r Mx̀9cvh;^*N2wKM%vt4NU2@.rKXLMcy  Ghˍom~oejho|bhTnz'ムB(0?;]"Pu]'=+DDfrY2-fE\E]n|lcCcXSrw|X$%\][}Z_ư<eϷR>kV%\Z .}ﮄѰˣ~>SkWpy,Jwq7\AEÌeL@Ҋq|:{WP[ee8"9;쮯SUZ~= (ہ>u=rF5 ى^936ʃ_4VHCR_詈ȥθ$pÛλム"Yb_-'`ʇ߷z~n3IEs-o?Px@X̅*%'ƦޒZDD^&c\\c0X| ^1. x2Kip_]T`vP[A|Cǯ"-peaal@Xs b~<`2$OW2D`07dX_iaL-ee8AGX >hN:RVTta_PeK|½~490).҃rie 9&fp"DC||KS8{p%c[# /Xs1>lW\%Vq+M/8>L<.iʩ#|vO=."r Hjw8#eIFvS8DZ^Kgh 2iZ>f %%@]GБMQDUaV0\Agu)Z]14. T}M2C܂F O,I pEԡZ69aih q2(Z,AqWwf\B[8vP85,n6FJnHl*q̱K*\ʲL+q }dۆC,RMSH9eN/П맿?~*fW5ziK(k9VEu ]^}VMa|˜B|W2`s_=;r'5+e^zVզ_Զn N$TY W2)zBTO.c&j1LP 5ž-xCd r8>-"g_4>&_ɼ*\Kd{<|,o(+uSoK^J&:9 K3X3u&WTEp"K2ƖX?8pBb3j/Z&c.l'? pM"s>aY }҂k ]R_KuyKKǁlr]05aI,%7V~ldƪ8bn bDV&"lcOwdbeY<&qM@{<`UbfǢXkqȱ{-aXl*pyE= ؽ}l~_dz=Wl ԹX+qOЗ?m:dx"3;bUy"?͍];.9GR>)ZF |gu˭!< Cw'BY}%Á$+/cqr,i}lGnU^m{~^M؄,˨)ϵU4<ʀods}dZ.SkbEuûX7N 2ԉC블fnMmXλq33|gż jj+1N{ٰT:j罎C6~zx4-h aL><)nνm fȄL%Sd߻-CcC(Bp6Wv]3+\p]q[ve|'ȭ9[jk<ؑV?' 9/ CǶ-tx}Zj[h.o!ɏ[7pųMqX^K r|„1a<ճAmc,U< ?EȫIa|ٻ0+SUwB7 Zо؎lg;ILL:Vu7떶7veX8M92D"d0׿&#~=oWp9-mCX$SE"x-[|ձ60 p}9?Ęu$ۿB}9)+[*!v y8tZ˦ϟ.s"bFR<䱬!CSN<HU7xF.ࡢ|Cј|h-[>ߋ>忕>t(|;p0<9T_ -ۋ{c ͇ 8q }^Cs; )˛s({p {KcV_e򾏛9Bgس⇧>bIc4ͭO6\=QFDDDDDDDDDD䝠0>"""""""""""""""?I`m@:/Y=VQ;)[aHh sd5ޣ DI$"xc 8`M) G͟9&`<5na?#򕭣'(EDޔվ,Ym.6lcWf\P .&d8F1 i =gZ|~Нp&>+ͅ IDAT(k >3?9̯|8`&w'h6_@LӬnoG<`W灢eyˍ1bXBH[dm@m sO3C-НHP. ;}rקٝ;ğϞW8\ɂ4mʏk?WJ@Rck]DDDDDDDDDDOa\hCJbu9[]t%eS#4¥r|O`D L ''<ę}!\+.-$o>4Sġzz6g[g~q L:7("r l{;0/9!dD?Iӛ:ɊA7@)Y D@Z%mp?[k\V'\[9 Z(XK1$].] O$"> t|*ϥՁ=ŀpw5.<1\g !O%]>^rGGVVms/ºYx>+1R.v^dg>7i<;7:Q6sYb'Y=ՅC6aFyO{Kٯ`:^d~w28\ĝȒ57t"2/|om<@)CT$O]gӬivA&>5ÂM/䩧^g]%d Z""g"$O{<.ldn+t4g8tSS]qv+ aQ]˚Ær(LKG!k\=C#-禙Kn?y^,]Cewxm9,뤳sX:gob[.{RU-ֆNp """"""""""r6P_DDDDDDDDDDDDDDDae:w<=]3=&?bf3#GzN;>ܺ/)+'C~[/=0>X eOț <}쥥XYw{NXHpǐ${0zx@%r~*- W,ê!fMCo)VuV%]nF>>rTDyghIJݷ Um+!Be&U7:3Է60Ral QOq ʿU қNf?-Y,n5uTcF<(O@hc "[EDDDDDDDDDDyn|~7AkO_=Ha2kk/ax`zG‰,_Ԁ_ >4t̷҃G[Lj=q""`rݼ:6H1T){? l?)`Vs!ӭ.O0+Bq({|ae岨3ٗˍINcQ9½JȾbƲ-{1\um,;*P7]5. 䫙3Ut%Η^`WzrIݠ@z3蜕8!tkYr/53^z04-XKl1QZ]G=^|IV9&shTZ2`)&eɪ"y4-dE} 1!i76g_Hڑv+ۈ!3y*LyfS?mgM ,NE7  -ZrSR啒Dg xܑt(W^XǛnM,1!d6T,AhytgcWx\3ħ/쵆 cWmKz7\e(Xz=&_On֩_4.!dwxh0ļ8 /BbʒÿDN8RqlXʢds۩g+KN99OW] """""""""""""""fLeanY|INp>G#g/Wgx߯oqe/s UvG ^/YjwJVvlxe9Qh2c~F\0֔籿[ȏDXy93\x~rD%&7MPas`=|RHz ̦c̵ͰgH@@)|N@̝;6v?ejD|+|84íWsQґ~jjɲybbgA*kP>p!?t%GgbS>h,y#s:Kxۘc4aJ0xκy0С)N{4AXgk>e Оf\u OS]DDDDDDDDDDDDDD?&9knZ@Ep"}wc %¾"˙@Pg?lKOMⷜk BzK[rDx4h,?=\ŗv}2[?~/L/9S摃hEcbd0Φy)S}ɳ)p5׶vR C jKA|e=Obn}q[^ɿK)>g}ڈ˟FIX~:E/Y>P: =X!e-&Ps+n)<蝲skaw[y%\nO[幉 S. ##aȓoB>i&J17{OrQ-fw ]ŭܿ/]v< ͮL=,)Kí%=LyǴCGXqX HvlLL{ ˖p/YG9n幾lJȹTȹiKmTbܹ2<<¾o0UW?c"m"w=NO;%Zp.$t?{^7;38.HR՛՛in,Esk+@ӭUoiQ[`hp\98qc55T ȏ3<|q鞏81R^ ȓZ1%Ր"6iobK\9pӒv| qtc5sß3?YH4њȲ_Kp?/.U9QP2ؓezô,0N%C}B o1'mcBuB4Fzû CW[ tgK4+ӿҁ%1co" KL (T&(H-g)"""""""""""g7͌K]ba>r bT@q|-o[{Ҙڙ\:s?|Co8Z^+=sQ < H[e@DDDDDDDDDDD1 kM]7H*~Y?|3]_5_0@} OrwK/Np usl>zJDDDDDDDDDD,TȻ\ҷc߾/6O1\zA|Kq5zʩ.f 3@?;d Wo@= }y߷tSMmC81Ic=#;vr[i^pf=Nѽ%e29w)f NնىqƂ̈ ]L}SgEDDDDDDDDDDDDDG`Bl""?-v򟈼ե"""""""`Wy)/g$8HsђyʡG2^q54^G?F2 ㋈Jbu&N蔪EDDDDDDDDJƖpC+sŲܧ0w}Z$Dl"^ƃf\&Nsr2gyWxUzqHvmpK) 1V9(/g.__yz^H13q:>!RL""""""""""""""""""""""""""""""孱!>;^Ǎ7,[DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDINu[yGȲz2UDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD1^u)ɚ& FXoAsq Gqn$""""""""""""""""">At='""""""""""rvP_&Y6FM;hc FC7a {6<ذwk88/(vPPG³㌌8xX:.i3y*ZZDk>)7BqGS߂W:@̩n103qMM.3=e)W᩼OO`߶I粪&I$ ?d{YRu*&,}_k/ P>!U+O`llɡbps[D^cw>?{]g3'`uw+blxaxʹ-DDDDDDDDDDLa|d\«~T',d]w/'ȼq՗2;TDjn uRk|Ƹ_X]u1M$#P?̞y=8 lwd39.]y^$٦87K> Cw,]EZ v|-E={,DZ/i0u{ϟK_勻x3r\dv^;5]µv&x|PDRz&I *Ez؇Tco|gK);`\DDDDDDDDDDDDDDmL%۸KYp /NwkXK>V&3QZa-f5ә VzX+<\|Wܷ):NDDDDDDDDDD,05NW}`uax`V>xiu"N/}+`l]r{>̡gC_W_3ڟ8$Zr/*3|v&>}"*"?e%%HR%O1xD'J2e"f-0%I3JR5z.$GX|u[D?o?a!'a,1B?τ_Fk3.&:+[g6#=4ܜ1QjqܰL/M{s$\ (j~n6k7-d^^#""""""""""EDDDDDDDDDDDDDD G7=^:ſs-?{i1wI^zߓX 3V`Y!bײ=lWxGb:WhY ͎?S~u/5d}_<9=Sq]CG7?%8gayx&Osqbj.kI`)F="O?5d쫹~F[v~꾔DK@c4Թa(1:3s 5&dakȗ'*]8^9XâKRf{)`ĸe!Ru9l'M"cs&K<9X]o| qLGwjHfe/tt.af&Œ>ş|_yv˼F^}e6=M7d~]^#3IF˃ǃ6w=o )ED΄C̫>> +R7q#*ڝipH.$m~ޘ6l|zjfGqڙq\|,?;Fkh"j|eshS8kqAhӥhġcOв9[fKpC}.Sy!|T#Kg Bw''{r%sf=csIg 6|&}lSr N(x#mZ(0]ȍ3綰i*F,reJ?C{լkOSa8{]9`#m\yZFk}`-ǹ_sog4> #nϲ29=,YuSV\P'>{o-c U 3˄\I؞!"L]žχv1X2>J֮WH7:b~7_ Dֲ >5?Efjj$Y4c.z˿=ZGS2n ۯ\A IDAT|sxHk-#3; ?D(Zk0Ty(]fnSG].bIz.75Y<6Vbxlu{1dDtY M5pbޥ{3k(omDž<>[V3&giw-$s1<]ܞo`{=׵`Mg;^~;<[s95k[偢GDGwI^= Y%{y6;Jy{f3Pz%XBZN2 l͕xa~G}.Yq! OY[DDDDDDDDDD䬡0y`p]I sIhXS.9/3us{cR &BwS5pkػ^+_AzLp$co_o_ɵ%^ʃ?HbŋpNN4]"GCc:*"-=Glˮ)E{MHnc ;xd߫ xګlo>?uYqKPx:.̞ϒ<:V!%O5E>Od Z yLlϗy (h84R. îlr w@#ccyn%숥l )O2IۛK>)6v/HZQޛtK|-;IA|D,doi'~a݃}A4b<:q^Ik3QO2ʥt,l9?-DԐ"x15.L Cai]͢K֥~RNO0/aM̪7!""""""""""rQ_DDDDDDDDDDDDDDDa;t:\} ]5 4H[5Iq"t]-`v[Q/BV V_~x 6Bms+~L&{AEX !=rg1G#&JM$F ȧQ +P>Vz\97mR9GцY2"0;ឤCP* Q ƁGi7,hsm}bp=\Z 5ǺZN&Ok => 1ndy"ZSQBDbR r98ڳ~5\4f?; w3FQ_D~T?o1oOV&Cϝvp{gÐqz/۵<4TSaCc)VhЂk`)!jLXH:.kj]Vf|h=X2!N`&a''h8#N PsnaYb>^ڸ"пo3C4נ (ӔO4vo fx!>5uס }J~ 18/O7c}SMDDDDDDDDDD0h6׿磴\_=ȆCǥ ?@: X??X,Y?E.:es/tӉE.0}+""""""""""r684"rs]Hġ6 5PTpYOb([H^OFGV&9ߙk?k_DDDDDDDDDDvڸ+G71T:bm\|q'DxՃfry*BBH7_M?γ DD yJ9 47-k328C}M ʎ7$H8.aykV!V2StDfG 0ư.ƝITs}9>kLDy]RK!50]b>N1?4KXd 1~>a^#X ykL/3t\fwKƎBJؐІ֡!:qkz7$d{L{mpFEhJq ՛EDDDDDDDDDDJgk n9,u(`t^zC0Qq-M"-*{TMl~qXH@ԀdQ+ɳ4Ix9wienF\a|Zeӎ>a#?5iLH*V!s,a+)yf럎JE"#S2ZqO;},R)V!Z5(p?ɒhrRifxZ/3P <&J1rF&Bku͌o#/N7lbOSa ƀ-}UDDDDDDDDDD䭱m>G{b0wmQ~#'nK2:>sj0{5IdDD92} Ұ{y&=qlqj]hJi;OOR v gʆHM]F*>[+S.ǿt*qeMNc ca.' XM6m&ەCdTRѡ^qX:f؟9'bs A9oqMtq؛OS(ZqV(?`%hL䅬jjaf_µ3:d~h}43c*v^GolOc\gPNYDa|8up 㑨m6H-ŒpkG~zN1OP<_Vwϥݳod {,X퇹c%u]KdH OX umfbMj]ԌWa{8g;76'.9HS\om]ȆBUTXϺY\ܐ 15LL%=9s<ㆎ Ժ|)Ɇ8F4ՏpSg?[&Cz^:ΣZ9P&o|Zi+FB JOz;xi>c4a~oaAD1d 5n剞v^Lޝ|SÊVpdvw47_͉iw(ٟسԸD:\"R]rO͵ģobpi:Ce0#< +,@'s Wϼ/?ˡ^gV/Ο u]\~]inCX -rmwsӲZ~_/ ~)ff_Ț7nX'B}M:SڡTߝB ~ ϻr`F.kh$,=TV7 4DDKh] JЧ\/;MpR B^W"07ZRcXrshyQ!Oxlr&Ͽ(ϖB|ZBwD]nLE Qj}Nہ>=˳xRV}8I0~sq^?H%^v+,IufôYӀ)_xJ.. . Cb%hqlb- h\e%rkYv! A! B\AK8؝/VÕV0%?giw9.L """"""""""r6S]xqf̻+gҐ K>֗2P[ne ٜs 'WܓVAAj"uOls.1~v;e&Mf$dɒ q.!n {oHcc-˲l6^Ι9unj,Y֚%~v;Y|is6AaGxTg ]<ѡ0ƞqG>יv K:͕4&+hd["v8ssj7Ou 'XǨvc}#~iB4tݬm:&*Q0F2k䪺$/[Sj﵍P3QN)nZ+k|,iȎKwsox}xFeUCF8W=R@n>s6L'*=ea:YVrym{-UFnRNs}|jB'*8Ԕm+ݖUl}T{RRNNI@L#į<΀Ifr^OoF!B!B!Mk"S\,7K.}x5n|7ʺrr/o~7Ύ }߾UXsW?)" $_~깻(bDR*K( |/I϶,iڇ66nXL+$d<7<~wda&^eU-cjeD)1ә#,gEU\U6mQ$qCk ]rS]L9Mkg]o(Sf*{BV!9.{}}Xm\[@3ӳ}Zk:s.?J|e=H@ᆲWBNC€I'S~ nk>M}\l o_"ynHUud[HOlJUJniIQ{3໘epe 1m,XRwu.nP`"s{e44S<;nni$tMn)o 6;0F]r#._eë1,/5\]7~Fǭ.nk6p!B!B! _a->r'Kg(I]̵ﺍo@w="ÇFP\?@;}%K隵cvDA Zf~ &?@6)I<@U[DZ aw0D/Xe|>w`?0q & t`/BƸemɱIJ)ޱz]n`@~r3#"cg $HHf@&=M|yO=cEA`1Z?꼊vs}rF=cgym|ausb sG-mCU`J $6G7~[[;,P?qS[_?#o(n>5Vɿ EIrM(^ڷT0蚘VWK'yv^_dcȒ^>t|_ܺ(i)/;OeҧzO3PF4 D'[LHO^k]blGf 9!B!B!B΍{c|4]cG Hdfqr +.Lѱ;vw29/)`W.ZNS];`vnAgaFw^&"{(O}Y4twu@cӅ9 !IY:㡉(tnA!\c P‰b)ύ2I 7ϣЅ^^tuR* [H2?;5f܅\ Aa♝}L=v}=;I4[>~7Q8_4gM~n>_e=*,Q eP2VHAh.LzRPV.&CM szn]&R .L^HwQJ,0gtS鱴zKL^ģ ШGc4.㢮Zz Pq.XAS2 -\r " %:ĴI*ST׽5-06̷;ifnPۜG) /w'dž%;W*:˳,u k40[+K8eͼa\/35%<8 ssyݿ nŦi8&)_>s]k6xqj*T)Pi*`eK7ګy:Lav5so8#Qܖn%7.NBlc 5>"9?ѭ1f) g !B!B!xI_{׊[#Hㅡ8X.JauЈ:Gw^W^_؜]h( y02mb(Mׅ~vj 7A$"g wb?Ax"|S0J \֔/nbI !B!B!bƿP.7~m1]΋okfybTku+cy֮Kze+Ǟ8gK尤H?p leK3;3)xganʫKJL>L.߽VVf<|ᕣCoYD t UUMs*9p|'xG_)2qq,֪$R^(eğpJlXK.L2U8b4]uOWkn`3t#ǩZ(Prpß8>%HC+6X IDATPy"bb:g7GdeeyZ$Ҁ1͕ 9A|e'yײaGL%mX[r|4&YǛxPMC oOdtƦH#ycUfo{f(˚:Kr*A,MK8 h0Ӭ-)i >8%4B3S`Y||<*f>N*$@@@x705S @G:fivW_` Σ}Ѡ0~䅊3PaPA!B!B!8Dn>[p aϝ` }\u,^GMz /DӀ102Wo=]dۃ8/4 OrۯOYL-[\v3RB!B!BqZ\hf^V( >996M,Tk7T;ظH@{}2-?h+Zb) EQ֜ 0ppi2Y#v̧0lJ:_(ū.B!b_*K[:lGM-',n^3J,sB=S>7s[uPPPB9{C57$w/bE4C/摤"bY8tL,)pTc%b5د˯=XIٓXQmSg)ECX` Wdymb*T*7Pm N3;HL6'FUM)kܮmQkbC!B!B!B!.`ڧG?MV>pG}geTpp/9=;B!B!Bq~x8i%hmKdtlf +lv:C4I)oYFNd1@/l66 ^5AHVNlh6ZАM{;V(;c]'fqzhK@V:1HA0;Ggw4(_$\gzz|ݰKx|w͟tP(30ˋ[l@l2Lr|p]nZx&2)?Gz MzswEoO>q 'pKaV86%vz']Ux4Q ڊo!n@ދ7UJw&`62 !Z'Ls")\2D[x9r fr[" M3ltFY+ >"J1Q b0#d&v7f_ch0!UE,J;$Jnf-;5 \Y-)U%FJEgq1S^@y[v+{ ?L 18V_kmy.hX?lgM44~KM9!E<-u}VhBUAx=pCf@ ex-ⶺ e|o(֚ 3gL+φA)ٹ'mQ萸b` @SQayU|aϤ޵P*$j(@q10U4lrRǔ?!z<5q} :eڱ*.pNt. Rׁ0Og{7JMPXejcH@kvyeơ~0@WYDVt2 ?x:wxV>$ȁeqjH6B!B!B!') +i&(J]QB!B!B!yCbhӵ|~523u_˃Q|gυ"Кx[hEz&8R:E 厦qEr(Le^n* lLp5F9H3+"NΊHbveBs-Wm5'M6JF}gڔ҇?Bt!$8nٺ*ab)C0 +QiCA|l=S'✠v-n9Z͌imSiw,璘ɋxrBTih@qD'JR "A|ĻJѩG*HZ[u<ʋ@`jzqUj p ?0NKrE$ٖv p]N]55eüepj0̈́V6^h̼ < ZD-MSm-?'˘ 5@kw"Fadxk[5uv3ts-}ï0;4PS] @WK+MfͤNŹӘ} `f9yՍ=#[6NChnMO=Q nXǍurWT51'fjҮCp3x.Ygi,s<|9ϳ3CTpW-V?HMb@{6#ϲQZGy|w2 T9 7k]&*HU}1h `2H )$:6>M\nExS=S !5@ qV-۽ٗ^F47s d9T?2{vNp Ҭ(:ܿj&b/xO,F*E0cvzt l8WA^fz!B!B!B!B!B!B!ĩՅJ)⵫7~\Ö<HLjJ}<.N7~5CAR{ L?/mˡ8iضN@1{j)y;c8>y x3aٲ2h^[%qdUC} <` Eo3^þAVP)`HG[(7MNT-33B^[[abu5ӏ&u0NP ]߆P}+) -St͎}i1 )R8[GMžJRnmu >McN_0{~gf 4LNlGxG늮Zm@10+RQ:ʯ$/T3=+)_ &=fY.^ tRǾTĘ)pScxC!|a!^7N(?j`A{!a nPkta?5I!B!B!B!B!B!B!.t@N57]I)S1]w+ͥ)LsF>}G߹81|5+:~=ۑ=+Eqzw@[`I_ =(- б \{n;. WDfW`5? 8|7  K՗SZb&X2X \bp-z<=4҆ 7-gʮ`W$ei8r0g~M"{ V\ö-ǢTXkn>Ti1i/:FdF V>e:0@\]Cy9ɛZ̿w)BIs]K77G,t.ɉL10L+ʖ.w]M$)7\}~wrR~ٱ2 ww{L!ĭ|:@%' , К'8NP)˯6D"6C1 \ޣwرo?1x-$;$iZ9 gliΥ B fyd_ `~V[10v|uEhDEX#? t˶=Mc|x(İ|L?ƮVEkziI;m6Ʌ35t?n_7Sed 8uåmTGgO,B0{>@>{dn:0JXuj!B!B!B!B!B!B!83$-%Gũ)wo$?*~b/W/˛f;w @_u/" tgxzozX\ 14 B{L0?1cc왎QrٳKT0)}Y`00̿x"MSIG*cW2o" 8<Φ"3z8c|TUjYЅ/<|:CQ{t!B!B!B!\54] d-ԩ$9 2B!B!B!N/P7e{qa=/3UFi*c T3ul-~!~ 6"??,8qvOO~26eJy V2!pHkzxM@[ $HBlCc{}._kqv! 3E*Sl#Cα:CS -^18hp#ۃt%ϧ+p2 #[kKCx6!B!B!H_0礃FP8׃BI xPI6CaV(P!=>{NM '?&' LNj_<I œ4 ^*-&*9x#.jXM.hGv7u !B!B!'*"39t8άLJi[J]L3ѻ#ŋSMO}gc hc]vw5`!K<| Bvm%پGe󃊰?<Ͽ: ?ʊK}~+=T$I8+i39$)/`(VH5.hð8XUgaH<5^Q̈gyB!B!B!G&ep4 +}~t+?+ >gRg13݋K Ft'i눚q sQjBݙ^q{1<Մ(lવԕxqs<2E!m(>q#q,TJ}蛸%dub% O:􁀂11xb(}(`|pmϓ+4vHXe(&0( F-,/iAy9d2[X^qFK9X/lJ7oLrΆJV_GCqJ~]`|s)+b9o!ec*INB!B!B! i3r9}Mɡؿq|3/.!];D'^Jk,exwMƑC2$nEGAV/$[LɢeT8ֳpeWe̤ S؃M̩Enܳk+é8е"J3SWRH:SQPj1>MT|j+{e_ cTBNen7ffv\Y3.bl6S})^.b|vpr?a%w!SEw>بhe;t/&?c)Jd=A#}u5ebֱ3=TTeM;L :*P}B;@O<u8W)j 5=O/ZO¶UQmP,e+˨fꓡT(4[0OAJ7y6B!B!B!ĉd|!B!B!B!BgG[@񑕥aQ"Q?.U } I:xvwmK OV5?&%dX$I}&:)la88TY Rg9RƲ7ў5 J{4 ϘK{>5O+zqda'Q?ZH#Ch8@Ȝ6v䀢`c)T,јժfp7gaa%jfg`hChC-H!DҾe¼i;_Jnҳ}5J,6b3B 4&R;R.B!B!B!>h/B!B!B!BCWmRɜ[Dn|=$l-KQTuX1a3c $Vװ0t6SUt vUp+cP`6\BWhʑ_VQsf'kd{/'lӊ61}>ġZuVfI&8rD;UKKRW3Ji꟤D&]WW_Tk1drXvv9CxO>%NoZm$ƪrM*D˵gൻi @]-$1>9% D"h5$B!B!B!ubz!B!B!B!BNOب oN+οQI PTebFˌ1lj1NW*&ar36=Ú-(.wS Yq)s۹oOWa &֐(tŁ$̱*IZPCLg3%:KpZ54D{N{PQH&+BYx`yz,.)0;Ϝ|661{wNqs¼Q:|Tv2H[NG{:As9R*.aNM Vg(q+yd\ X$(0c]qB!B!B!uB_X)fx$DyGAE9^;Dw[;hr2),Ƒ6&D(1rT>rJP,T"J@sS!ȭ:)wѭ8 F\zB!B!B!>0ql/= o'a(_N6Z2N$h#60L@QQ5}IgC}ZGs@#'' ]1 L!UfMazPyKf.ro`Jh/ƲG5y(k!3ϣPz}ۈأQ(NI%'x?(82ȺʺZ.+sqBM]|!)*g&ž ^*}Չc$s6_wQw:p3S3(Mo 5GK=2>g'XBFN:Gt'~lJ>zObĩӓ a+уDS!?!ӽYPh ȮV" 3,b G}o7(vtWOëj[X);Mv0WWޏŎ l48 tO2`.CRCV#_hhN25u8bU.XSOeQ*>m6 yPC%B!B:}dzT{f=dzF$PStYŔu@2A"CUP㠯@r#>(83i)"0ɑ! GZ0{^J(A`g -iMDc ڸ&RߓȘl #MGg cU Uq(/r`%tu6:"O8rp)f{H6ѥ&\'ZGKVpfdMi#Ȣy۴1 !^{E^Ht Ys}tWQҟ:m:k"4dg}ޑB!B|tyƭK_EZ|v8_TXjmֶѫ. ΘRDSJl{}oI>y24z7+`oy1*GcқW0qH=3l Fl\v7^Yx\:*xq楃Ջhl^Y>{_45[*V\ >yT57+imw_1^'i{RsdTp\,&eT,3NoG5^g 0bfVΚFϋ*رfxG慍ÓFp[+.'BS,Rv?COw:[+bκu 7Ͼ/4 oy|gGBhCyB|E< ;SUaZ7b?pfrdWqˮ{g_|B*ȜWHl7mdy1'ޤϲc*9EД:|šhEILP\NZB𨿛O~]u%cbBsspN DV!by^4:I\i(b^`)\8UWڶW7| }8)_t ^w)^|V+A^J#EgNKʶ9P a+N"n6HAL&O&xb;!B!B!oCOQ||ayF'[6_ɲVqOI៩Q(u1ͯr"\c5jE$+K%pb`p21pfټ 4c2 8mO߅ZIOpE h'dAi.xRSOoh=J">($ĨrU#aMu>_8UL A<(/[ l(QP4۶Ip(Q2H@Q۰ IDAT y01ag }#!B!I}^fQGR:eS&ln;:<4Mҩ]PJ6㙭5t{: Wr +7]/ws2~-n -᏿zvIf>ٖiFz2/l:vPƬ$`~=k7ֳV9 w|5i#z1ӏM(@uM.n=qP1w7x>m_/vK*|'p2Oqۢ<:ڤ\ 3gc5*]9o; /}o7i{BK\L8K|曙}:^KDge,^(6tf 7_DƮ?,q7}s׃|-.;r\N)|f-ZƓN3vF@_}$mHx仟;biӨ5^Z6O (jØ?~9ԆL]30w?W<͹s`ﰯՠ`T~y/Bq ul9)k쑲euYKjJױs=VRJ&r2 lBts@m$3&?cUϞxQxONڝ2%w>d1Ul2l5-H+ aR)CINC¡Ϡ*s>Yz&n5 G>Vz >#1~(8r|wp9d9NIY&im!vm:řQ4Vj3{VӖ<2 Ϥ^UW3), )J(?0b*3iՒmH9Wq2}JBM^ x3qk|fb)!n vS:7;s11S5c8rrD#[fŒ qiT?= v-#fH}%vR3&B!B!B$(Hи^| ë+s^Ȋ5QF{QUwwFEO [3x);PUEQpxh بN^cp[;#S4.6UmJ&H} 3+Å7+LF2K0&La` ( ũkؚ/ȆfD29Up* >o 7ȏKӘdm'=Ǻ_,%y W|Y_}wq2T=_X5`(dnok yjc>x z165Et^nO|c n|.u_H[/~||l}9)sïW77>~wV/=Vvǟϝ&ʏ{}@I.\yrs4Nd;ҳ5o,.ˬ*c_k7H6-;9IVxrw`?#L>9ֆ0YTVc= k64.:UUƱOuX(8ǭxkvŇQsT s hJ. qWs-{k;'Ծy?8w~ZXxTmv ki[O<>En^u K #;cһ| OpĹ,V}/awdžl/8;yI3B>|ϱ8)+1diEHZ!tě܋+WؿY5aߠ11JbC$ۏ>w䭷[xi^7(}8^ACgt'=}CRejƥ(66Fh{g98\"e/>;^M} Cͧ3Rx$I+Wx⇈$u+#gf`rZϼyĸhw.ݯ̶Ã#(8)U mh}v#{{řw-oB!F(:{[ Y )'id ~=Nkpa q!D)`ݴ϶D2ԑĊ,is$Vp q@ G[d/gB!B!B!I?Uv@Bs#Ϭs)))E;1@-8/~G ŷ,]<]q|x}~|nb.WOb P2'8sV9NMEU5TU'--MQtL_|.K.f\ôQf+/q>{ .'hc`C2 c֎EQu/8., /NEeM??n8mKr=27w<3Xɒ%)veh*ѶlY"+UU\ ^{.bޔ\Љ`ϲazcÓ5WesƊs5ja+: /H3p]U;?z/E+8x5AWyyhQsBV&L냣FNތ9wLTacڠvo=+n9p|Uϱl\*kXMVq50ȋm+5?Rg‚ XuL(` ,#LWxyM sɑul $j'd;2>{"f- T ^?x6`TسӷB!BSNKل6Ͽ~|'ANN*"9ó;eƽ?w6n :v cm+P: ]Ŝwӕ'?|cqRtf笅17ϳ:ձOR QcOl_\BnE9YV:,@+bgnoO`%N(/9Ũ aR.r؋lE%1pljt~× !B!B! I?Ս6b[F ۲0Mkpc-?C/fC&+XD ^11q4|M=hli2vǛx\L^Lˁ*(O'2g^v#+!ڼ peR9uˮ,<~t)?gA]-98 f2JPx)2}8u$ho <$ѕ9ED[u{Oɒxi p2O$lgǺ* &Mɲr8ॷ:\MqS r9F;u;^=@JSX9K窼,~\ue1wĽj6zwˑEqfZɅ.->.'dzB_1SQituM+YvѧyWH BCסee_>|gdr8Cl}8\vmݽIZ-W#p7FS:i _ǝFO9QQ uAfVNE%l}9-a\%sbfIPspX,ʎ:<} .tz7S&q'E@Iց%3ήxflvu|iLT}yQRA ,E#ۊ4+d9siё l,ND(qd0ەmˉDšA&0[0HQL؟y ?EtיV!B!NMVuw%/yxqURpLeK(q5h>R(4)(#z1=a0 l;Ahg !B!B!oF3K woH򞝠f0Vx[5램\{Sy7 .jfKU=󾼈۽g6/gr_cW} P>Jg+/b޹+S}w:C R<h1Ff[)?0偍c*㬅ծ'nR i˹ky9VHz2mdϰ5iIg^˕מˬEgPsMalQs.9"67$Ȯbe3?o?-/o'8$6\s+bvS (p흟g^d&6-YO* c1 oN$9'qÝS9lIGKs3Zz+`\={^g<ԍh8^T#t]1Lz/m%V\tXBkHNd(C߰ôSbo"'޶ƧY8PhǺf2 "FB:IN@F?`N~ `4B<`bHvqގ6|/U.' 4$mA U7m]cO?;kݣyY/z_6yClMu6`R8;D>0Hdž0ع.х!B!)ʎ4~mtNUQVPN bAJ tFdXwJzzu |͙B?MOJ8tTMťژ$dO伋e|d3=E*'b>ځye!‡'|TW6_篚Im+АDƣ4,21mWӴenL$ k^ mj\S!LSrJ3謫;WvczU>=/pB&mGg JjuPLv9d? d2$zZolO !B"^=c^my5K-M#Gbdv~-M[UЈy}+4X!B!B!$'"F[bdޞ/-)A[Jմu~e{T=;g.fve{KO%!8f4If2iBrRl&H9!t3xL}#G^颶z+M^g\P9B5Iŋ.dZAoa^#Jֲ =2WQI00$Jh;;'$;wR]Â^2q) +pK@̞jzIzm`{ǨM^.qq'~n$;\5Mٔe׾>i'ĺ` 3޳^r?M#-h92عƫ6T-;#ƅEI!u6mbXx4IH{l&fQ^w8o6F{983cl2cOkCĬw#Q !8͆D !B!{%hr>YNmh??ms)^ p)<Λ@~6'寞`ƎGtva/( 'ËJj:$GZɖ?FtgR }מzGD`Ysq2S>\Ȳ8~ #&"b*.=c<. &L(#9~<*2K P MJdwk/sq\vQBoW,"Iڛ;f䐛KpXqLIK4dewA`dFP{=C&mH(j&*'R@u T782k1(*No6yEd}8:c=XPK R))ဎ=;Iut8H=g*+m;XTVɴySyf;q:fSw*ڏ1 D@YLQ4txy'bb H5u*TF35,lmr3NUy|Aڃ" !B!8vl ô$hm/n-c̙>ՁdFu *Z%x&q.?QN+hdjv⾚VNCeDQgeP&4y=?fs-7ZW帛M2Q(yϜGp:fw/Kj7r[8s=ȎC6g^r!%my1';X &fR'E1e\l*~K; N( ᥸jx{ïy`15Y ~[-w/=/'A^ WIMx-:`K)\9=w`3+?ͷCm IDATLWS(mW! u=ea Ѽ5Zv[X}$̡B!B!B!H'b /$~{Qdp:Fd|I2&5,uTg^Ǹ#BAEs(u'мz?bW6GVT:ܙ{,1KCQsUw@t0G(Rb15>U7B䥯|{ M"wTv7l^Qv6}]m_)ޭB^aXX$bKedTHQD,mfL$jhdn]՟+X!B!ol~u*X w,3+ذwTǝx"7K[/Ȃ%`9\BD4 ?goP}숾ޖ!@/H[6.w1_l}Mm4I/}zyͻo[v4n|Ͼ{`}_b\|5w=MWMʲ3wتe=>YN=yOiUʮB!NDmɎc؇$B!B!B 4ȌK>y;', K5^ٰxtsPX |u ڞwr }D߰P_. ~Sln?togsGs_Q~ܝn˛6M"&rff^cpl)ܣq^e~ٴWE3zLɌ"u%F4I7b)A4;|2q{jX?T!B!O.ofXu?f̮ٺ\\7S5[2E|׋u';3tVt;zgYbstXǞTnUx=/!)zZhlXPQB~P/ϋ5 Xԧv2.ZΚgO/zx{yqX=cxGgs3)H JT\G`_y4iG ǵE[׮8=v(w'v| b\3;@*u$޺.LoO1$oX׌O$_P(b`e(o B0hTO:P!`.8D62]Ë5pG >2+ҲsJ:zG(JL"Q?`xs:.e-pZ OG i<_FgZ#8Z'ߧ>,xzh)b *~g&(< lܒ&B!䦚hv9MaZ6=3b ʋϧl'h޶m>M TPmd2~Czs:ŧwwiX,Ϭmu{oN:41vhaY_Yߪ8?`qˮmI;}><ıLy"L]~;)xVUvX+:jVstc (yӹsď_ye'iݹ֝3xG(3Ir.mt痲{dҹI(3Q6$8e4gp!B!B!2"{!{Qjؘ+q\wtß]_;!qBD8L)`5cC_tM/i-\8Hs2U͠4drZ#OQi<eh>}16Rf&Ź'{˸`e! x=Z!UapL^]*Pʹ* n(Q:5S)r]6dWGNJmU65h$ zB&?orVZwi|+ʰxa+"*@(ҽq|u35c}B!BشL8S}Ʃ@Ui׫a8!B!B!B!B7KNTJdֹ|c^ُ[HXG&RK*Bmj9s;1޼2jfM;*::q֭(eI3gJ6Jp,9m>&vG,g -PًZxBЂT;SC6EiY8==3Υ(18R3W273 i{( 﫛!qAiU @ɛĂ䪑aoiv:Y/%S 4@<:s.;ظ`q :dn`Gg279v!j ^").ϐm>G|Ska~-L.Oc87OI!|0M8 XÊߤd$dr7#R ka4(:nB!Bh Ӗ^λn%x"\=F~Od=, hޱ`ӴV5Ʃ?=3.bymt30FV[?y9Ni7q|U cNrJN^2XvUSϤ,4=MXv;9y [:a X’Cl:hk&U0¥T*{ o4osNt#%û ȦYfIK9)ގ/F8̾zUKSK%\/Ŭw E8rYe3OֻmݤU3F TBUFOOkB!B!B!B!Ì$NdSܩ[y |ksVuׯV#=bG7(+  #Ԗih2y Fu7TTM/QtLjV")Q _4N&u'H$vz2.(uR]t>WװΞYGßWDq$O_vŎM֧yq]5r;T1m"]l!3;2k?2kbJ֭[;پ:k>WʹuwOf|a K(+ꓬl ?YHd"gsq7H,8u[hM(TKM;UMLeF (:9 >mz蒨_3/ͣE,}ONkW? ^20uhڰޥ2gq=XjD'1=l 0bA$gK(fJ~AmaV2kBdb0F|ߗ"b8T k> T=Cܱ&2CmS/v=LҩYbog]cK6V3/ >4"n ygr->TJExޕ| ~_+Ceצ .nd=[\~xln3o3#B!B!B!B!"'((bƂ4fQnsͺ_`WGzS!Vʹ,zfyu]7u w&-lƱXӱ>e1y\tB}4]G*RJag6`k`K99X*t]a;iܲ=Hu9댓XvBA>>^}1^Z̨I@̾F^}e<.ԋ5 g/? /E|XD$ixAkaٹpYL[`JHӽw]^{B @E);X5I?.kɚ6JY6w0k&/T7-\3H5m3~dP{0ީ\Xl??ﳴ7g>7OMT'5048(OkUB}~D(Oe~O3WdY,4`x {k9]6=ߵӝ|sI l^s>)j&7`Ҝf",$~p9vq.," @L CgOa򫟎 N[od}-_Ӵ+ٯ7QͶGG_{!B!B!B!B1KcҼEKl&CMM %twP sA /O2ceHҘ05Fv I:W.{r_8(_ЏXd3iqVt/^eL ax|x=:Cr,T6'\<2 ,nfdM -agd <F)t݋'Gai)!/f(l˲G?;[/c5WRNIA'CgGLMWPT\LЧa&v̘X5l_ƯX4st{= ̐ZcLHԂ^Ṣ́|Kh4F*m~^ +"P^~/ʢb7ҽaK)dtFIǧ}?=߸cP4<^CL{"+U9Ӡ6@:7HJt|Eŵ5::}Fa{#X g΅D;l e3r낍a`tPA8g+:«~$,IϑUB^1(z̄;9B!Sg\?=|!6-xf T9YUi^eNAm4p\P` @8RBeU9?:hl"Lʘ84P²*&aE,$;P:Pn1П5 _V쩅M2c?q7w0D|hnxBb{]q⺤ILo#U-2yCáq!B!8~rN}xq_N!ϐѼgƃpdsʳݬncb4 HMXT-Ø̔r)Lvb/Аϕ2fM!u u!B M< _!ڽF( FY`eZ +{ނ IDAT}Z4=Nu L$nsS3{>@|O!B!B!qGP>s A5'ƞW󄘼,.:w)ܴ|aK]؏=o0_#j]{ K\<|7k&sB= fA~9}4~*qGc/t; C*l*=MtMUxBs)a(چGAjsz 3oaF Dll$z3XNmby#i,-=;${i򃋙Qt u?u.l 3-Oc̑!oE*[OFL=NsZB!B!B;$_!Qtfi{pQu>:Fl]Q6S\ZB$/GWlny/z+.uz+<[| qGQYB!B!BSsqqxv5VAkngymh>Zڟ>D]ȅiB]p3wfyt  BqPTk5{zӪ84j+N*TĶmƏ4AB^MC"m<,8ƈ&7+Lg;hZE,*YNUx $R7^@eBU+{cG!b9K.*PNcGˌH-Vy6Iew%iDB!B!B!/=l{v;\8,n[iߎ1t4pm3Ŵ!B!B!B 3ϸOQӴv%/Ɠs3yU<Om/W~/\p{iھ#QTs׿cD'/7BA:^#M3҂tG ++g ;Jg(T/IfaxBiz$:u -WӰ5 uIFJKCvMGi! Ŏx2{ h<*Ǐr@bB#|\Ea`5=፿е~Mr:8hZCa9Gp.ҹB!B!B!QNs' \ B B!Bqo`ͪT!~?iw{8+@HAFfosS~u%&vrtbGYqkdsOg\g?Ŗ~E µ,\c{r.Z5G̤1@͛Dzl__dgfB (\Ò WbB[gXPv)U0Ȗ柲=yc:Jbf48V+}O5iPL^F Ϸ~(Ψr##B`к҇J(pzbZK4LO3*HIuVv ~ʾ$Si5zwֱg`W;?>Idi'}l̓pXc;rEEE5hL:$o2pm}oHLM#NbOSh 5_`Is eP7{:ޜt!B!B!$Oj V:& !B!B*%b Pc`$Gn)wQw|l{lGӷ{h hTLG֯bG %gOpr:&Q5y>3'ؾsX(__w:5~֬5ޛat\FkK~X8C'x4-L;j)&Nm{t5FUsS~. s48LxX]DSfzٝTWL#8`q\BS0F0F~xJ|tdB6ѓ6)ӫ)AJ|n'iŤ}Jbeo0 >|ITͩ5`])7}̛g>C^hM3 /J+>m6K!F 1XS#ڕ̝)S/;NJ<)44bfLgn%Tz4zcdU6-`~ _YM<Ѷ BG)%LLas2:2x[+2TG銾Lq<@s3Tܲۙd{(+EЉ%4}bo*.&9'4{k}=:"CJC)c 3m1L*&!zU[iCXPz #r !B!B!G; B!B!B!B!ě,NQ)+ ae%pz?w՝"B#uO1W}״v[wE7@tQ)/+fX|`|!aֳ/bڱz;fq&.eF>~]i ._ٵo_I?!̶*P)=+cOO~s>S)^y=NWnbwcK":cL O#4=˾.&HǮ-?.eTbCՃ92O6KbVTxZao}}O=|^i03;^)|؄ϡagPisfY2v sDː _!B!B!8HW☣) dNgB!B!B!tо;'N:xgs ^4Y݃Ekxd` >@{3o4)g^duJ_'o>Kp_tAbRvLrR 3:. ]<K&l M"X8T[һDq<T"FjZc\7M_6vccULKl$I"SP`eB!B!B G3݀)..+b3<  )yP˂4lhlfNbraabl߹1+7;hϙ;;֋W,;e*%9cczM !B!B!BJC3w%\~V5\߉r]a?V]FI 1LV0nW!f BÓkr V]`]{TD,݌˚4y Qt n%ĬiL*XH )^FC]z{Grv5fj4Nc9ވ~n+ݙdnb{MQʃG#X,u>9.UDyh%FzBd^x*AqxMKkcfrs8?fRf-b^I-ՙ[hH,B!B!B!qH#L/—p .VW /x4p]lO(G+]W`!oa9F< ,T#~,KU$58d3q`|O\ntfkԗX|D9唓Yч }ޚ`|]3{\R}6 萉M}B!B!B! hAJg-Kڷx`) tPmdF(N2Qz@7B.떕_B7qsB]w0{@Cpp:ԴCST/Sg[MYMCXN~tjazb&濈3'?ɶdK^r-O3y_$ٜ_$ItR#z2dU1-`rp.G4L NJ=EӊDK=ƞ}Bg13r :iY$ʲ{݉L;iEar9 $B!B!B]$_yLbV?M;QיG#SdN3C*u4=C$;m'qX6)B_~lNBt3s2tz!.}=;h>p[o^IA/-7&{t6UHG[쥸ڋ NƦ/9A!B!ȣf| ;=48G:!R^Ü9,:n]9"X\ÜS(9ֳxvf3yz*;Z)L(,'_O#wyo;# 1*';iM6{PH?uɳ]SFHKPG]Kikt@y(2Y5UiPIrŌJ]u;b <Ѯ؉3e|jKPԜ󑎤 J0g46]qWq"p P}o% 1ilWٹmcofuG=Qy[Ȝx;{>D"yS'ȟ49S REr((ePP=5(t4aO};]O̜ٔ~'{ZdG`$Bk'3 wςjοVJ<݅킦TV`';#nkt2z8XV+/ַ%XÛ?s'|G \MGK=?~<홱;l8Rҭ.jV 2.O7B!zT:B[`Dnh58Q^Ich@S(NW+gay8O?uD̖WS,-ټiq:E ;!6f.IP'K^E_8xE}Hl !B!x{i\~;;S``Fҝ}7𮿲31Ծ5>o Y>s خB]:^_?guKzX$nZ*4 _'3Q8w~y":誏 .RџFK_#_|<֋|KfaYhɯYOgjbmJp?ŝ-|\'FM${=Z>8Vq24]DkX?p>w{6ǗǼ؜S->E>t,uM6!^It3|S`q? 9-[]n}4I4e_W-±]3Z#w'j>Go:WVω=y,;?z/>Pj*KGS; E{œk0i ~_-ʺ+~Df_D+ |[~{1&f-pE,954#-eѢ)ģikdRX0:uPõH[!fy.T/>AhR.c>/x 0`044zRZ5>YbΜ$6.%7RNG]PG?<* ێ-\\RV?yQ6PG9httMemKN*<;4m8y>eb:IGCߤo;ٹ'|< v9 !B!B!$ ?A)#+iM[yWЍ /Kn~n6`TqͿ/a ܻv#u)98o#?L-'] W p')RZJۆָ.\ H%qCa^#)\;Fk4wA&7}WUߏs;$!@{ʒ-C PgŭhժmڟjZj[- BB&ws~$`IP -x#9sʹ|ޟwh N03U"IӝIߩ7\@c7-y5x3[;E(8ur5̜_t6W5\hZ)qiqCczfPlt6:xrF,7p'{- _p,Z1wLwt>|;KP{1aڹ̺x.^bmUoha9yc{oږ0k](g` n5>syru'%Ljً80 ŊIi`R-( tω&dG4߄ܑDRO_DҀԍp/`Wem%ذhgQt1aVU hJ(Ԙٰi|FB(lrђ IDATQ1B!B!Bӓ$L!y>[׮fo'6qSpɀьkf(O6R82bⳍe7_rM|Q!) F%C13fLNd{Ӄ'BɌ6:+l~|m PW@9}O`|inc//ʯ5n4-hj>W>W|Ɇ|ˍq{_blת*M+6Rpm&-kq3V.gۮ ɜ8oxkv`(Rѝ_ ͟8(>x0ÊxynkaSF6gcK'M7VQP_f}_5sz^x>Yw?]Myy\r}c7.>I-"tldoE1tڛ^_Yd9rFvfɡh$ŕSRA엸gI`sJ曏pKRAaO ff?[Yژ:N.ɐ֬XǠck %;ױRJׯCuݯ6R|q\>6~Tax);l:Pipzݿɸؘ]E_!~xy/زܸ1gE3/b&(IŚWX{WCh6;Cx3jC s9*-%*ҝ N}1~A[!:},m [7?Qq;nȥo"f,l|juJ .Ғb\!)P}b?2o a%ڟ RIA(ఽI; N*qZ˟:FLX_R4l:xFRx<:c|w%(f40fh JvbƦ%E)f8d@RXŒ !݁#POo1=&4SIc׻"w>&&(1|9Wb,1.\Zibֺ)'!<%R)=(qf FZwC%ڕՂZu"LUPD:Dp2|x8-ߏnI:@}kSLI bx<&O?kVŌI1c҉1`%*!d <*\Ao;DžB!B!BI2Bm; PͦbI||,bbe{Y}R$㋓I=n -u7<02_ Cc! c0Oa:rhit0х 㻟[E$pΔsb&b!̢Ȍ99hK|& i]sZX͍"g+w脎1 };5&/Xy[ `6!.H&Ɵ:m- B!Xl[\.o^RUWM`HTپb`tؘ՘`JX',v-}F[T'?#JAȘ(Lb0jaw{~6elS:`Ur1bz1©Wwl!ץ?y ՍغuVc">!6*=NDl+[y-7a{V9 ==ZBJْ=-Zʢ2t>X4 Ii)9TU;10-)Э[2 ̱錙<MF0SʡrW~4w}-յv"2ՂBԐMPjmL0e,c9zO'?£PR\">& lD't 3iؔ<ݘ1o ]࿶ q'ϜЉ~{ؐS+6uJ>g)3G1v9V=JLz[yHV2>*w;Zn&h?̮4LOF$TJa)bҬ 4Ԑe$Ea5+WHR**ʩjdtMB-#&M)WeR听cqjQ7.ԋp:Ea6ۍۙ˧/ʒ ٸ |γ&-.ޫ!_6yEn.=n!nc7/9Dis^\3ɝ{/k;F!NFeu_[3f0S{4RlXMfrV^Ƹ}{7&.3~_&U|mTLHHC8SlA a\A׋Ɠ{1}c06j8fU/j@º/rdӼ%s jASPeC:%` z9%>;:`0W(LhMaWS\O^zJ}m бC f3w}FfIgHGIq.~w&3B0i;9*oD#2zYÛޏ0̪ ~ LJ %Q)uh#h>龦; n8@^:L=U2T3Va8q*G+%!Ʊ[A@*ZoSŘP :~GHA ~o6Sfk|\8f;_GgԗWCGa^¦0kV6v~kxcOfޚ< |.3!\hQp718BO2h 6!B!??2yXG6,;8YW1ܹ+i ֑9vTDEqv6-: |])=蒬G;@!SuMoIfn؜PL*YCЛ&>CAєpzAf>>[[B?) 1ɤ&>aDZU uGEeԛ1w:f|9!@I~%1'ϬUlBŠz?MsI3>\!TV3 Дjt 6:ǹ9;dմ*NW*^L|h$ukd9vDסx(:@U(DfmLET3~ (uH2YU$2h`7ü|/4f =$j:>|Bيmɖ7R<~IKMƝ4*/, 62?Y_>_)ʫ jY ل8\'^VQ4 M q,)~j(f{aTrW,bkvSqp /8גNU0t 6\9]R4T]{Q+Q< Ƞ>H෗s8{/wDš 9׺M8k.m1pegYiz 8MsW&oz];&Eb7PWDu@&%M VPmL91z*qT~7]T҉0)8ʩР(jjy[4̇[uuu؛Usx֓YqHs(, P@ R mL `͟}Iy <ލbM7BydWCCxW5z:o.5zt#* 6_A㟣QDvb*qk1XT *Az\*}[TK(vËW{c !B!B! Il8+ {Z Npd +ҟP8 ؞ep8l& WeiٰvߔX5^3!Una1GCK*0Okпkqqw5Yc>.ǚ8!u쩫l`c9?vLBQIȬAd687R;AkȮyVcocD5 Eb&RPxB!Bv _1k^ ~XS^6:alzk9y-HD_Leeq؍@ Ee:aq$$DÛϓ7?)/)kgjKL:Ģ5<c) gAv;Lݟ Ȩhbb¨ɮo1ꥻ1=MUJuh~T*>JDJ%J+`閊v<K^H, 7FXJX&É),sAg>_-c3Vdsf=?rO;,);fM5|_kٖUڱ|O]<! |7;H1]A\hhSލݣ**:!#jN9 ϑ۩qmordaxboqbqxh_]SGGm+* :$tBC;v!96r5+mӳg7cRLя>:fi}yhFצWR82OE!B!B!8sI2hAr~';[Ŧlg\dD8w9 m7pAgNS&0BPn3`T&0 @{ַƠ̤(,2K4[ Aϴxb 5ϯ h'?)hfJy !B!83}C޻}ÜsI~h<˶9Y3J1ݮ滛}LJÜf!<< : 5_ OL㎀PИ^jTWVbHbd&\H琇U.z=}<|N:^(t\ey9~k?+qSLXaX-v -DBx<^AFawt Gy7Ȫ1;%rNEn>$RQrkHAͷ+p3ص8 yt cq(;Ѫ4T#Ya8%hhbXG#PÖ7&=(dÒE}g从VLfb fC|3!^/~ArL4*2&3yhw\즁(fzcޔo}:9Aǎ(Utҙ{+{0κ/EX3||w3J%Ӏy?l OE!Ng$d_JӬ&d%%3fr?vN(D8ȏ}mB!B!B!ęKmA|)ԉw[Qo/^IyցWĕ)Q_J!~fItNdӍ)~gv.>)i]2fs5ʘ &b".n87RA5CS4[ Q*ze+!B!+EQ1[T^A͆Ft| 4ԵMlR0j `EQQMGR͊U bCZF'}"O2zlsjV1iX-Pn?`ތ 9:c9\OI5*:NkhMUOEvLlx۝l~ =k7&wn2v9g%̚ np$ѵhW*ovx#[9g(3p[1LJ3bl1a0;$aqWS06K By5Yjܞ : Ŋ-<ΝHqi;¹2ny{l5^铱^zo/w#̛6gww5-L9s Ɛ'ŭYeWy0-EB!HƯՏveB!B!B!d@D}5Lv3xa6U(X,ft=D0WfI~vsr/;yfnl#Epx)پw>XMh%<Dž eޢw>1)|b~ZY2 J\9#Xi1tŬߡ5Lwʽ*& )&sݍ K̺B{fQ4b iYWb{)עl(ʛ/|3cvC,ywiq;vۏ*+띔TW՗쏡o#(N/E }᜘<^yx3/ˍȦ.̓!ןzU9UkDw9qYK,PD L^TL^˨z]'\l\"K7Wrv k|`$JB!8 מ~- !B!B!Bg܅yDž y8HV0G$3bXx8U& qF1Ʋ*B8A'Y˦-[\]Z]m-4F~Yam&F77I.B!4y?.-<_$/"^v.z.ڹ'ח8ᤪڃa&*:װJV>/.Cd\3!ǗQ3 ^v?f>J_ {oy>"-L}aqcs`j6ŷ2&-XBnYůYGeBh­ ۺg n W'-&ͤͫ"kDDa1)TU odRJ9K--yx*άXH3kK/x>Z|wg~B+bjGqd>Ň*IOrxWa"C**T,N C7g=]<|] 9pu {ʼ֓ ^FtL$ q78+g C˸jRg x?E>䍿gc|$ IDAT Ywv: 5݅E5^|{wAǤ0\X2,%fz1:*\0Jv$wB!B!B!B!NHj̩8[Σc{ Q{TK,f_'a>%>. OgMSkay)CoD5Ք?-mv3O=>mML E^j}\`ICWQB!Bg&Kwuh26fWl"ԅ#: '`FԔQ]Hj7Yúm.ዷnJodjVvk2:5{TKuQwnay0Ԗ˪qf%t  f '/H:u9IFYgCR65 DLs֩O^^;+wSm )r]wpI">xi^xmj|ط7†pF_zS"Xgx4͌  /lAs4ޕ](۶ %AYnEtƞIiYIIO=.bJt*!݈[˛Zv}1+r˜㮏\O~`Ll"̚klJtq&3p۩i >5(ݦ(wQTXC'Du=XU&UnrI\sm\ڽ%/<ɢ6QFEP_(r/.aJ\K^,lƤ GLf+fBrp,B!B!B! ~>s$c sX;*LGd/n_M@; |l-0 (" nZ@.TՄ-&" `jwM(7m/G? '1<>}MqWSQn(?dbjsk,ۇu< in &͌-̄G, * \Lπ(.2ťѣk\v'imw̮,^Jw[$U7UWq7~.҃/uz,~)0Е" hwmiӚbA qZ D݄0ChB!B!8C YBE\f:m^Bܫ,[4YJ$/?8cb{]%_r0,&*dCF i1 {ȩ6X d!*XUj3߃%Jb ^s O%C?́6`׻p[# hzvMF$y-ha&L^$m$K!B!8,ø74S&cDՎtY3`@ /ex}W{/0-,^GS`^xZoHP9[οr"_m U#BLɈ"T]EtR9oUtoKS1eA ia.4:&(= Lu~fcCP173[ckEc2ÐW2wlcV,;we}Xa=ڄ<+`5c W5MdldБItD8$%EeLڵzz{2Y}܃NtxQQt` _馮eWE^˒[9sah;Ը"cHON AUk*X"MTՇ5GQ!B!ϐN |a.Otcښ+mә#1w25+mUBD\^z\þC BB>ym=v7 Fe"F9x{y^Br}0҇y:Vo<@W#YL;QU";Z^*O[DzXR7Dkɼns'"_ߛ˳ه?/~2tƲ1CzxYқSﯣq°LJ.%>8[_Sp 1}hGp.I?RP%o޽0i\4fo8lsƷ5h&c4fOf+muS& {?Jf0EҬ[oT7;hhӉ=w;o`Ӹ &Yb;JTG~׾[Jّi.>: w%|kL|\'8kr,>! ^<ƵHشt)NϜ 䍞X^*&{ eس_G<[[qc.sYt/_v5]-ߒYs m| , kb٘~]k"2 Pz1|`:v‡9\LU\0Ogo1CTX]u)Ff` ؙۿ37Gwie=J~9'6_JgJ4r3FE/siL͛K.\J8\[o!B!B!B!BI2ϖM v{@ #.1e@GĢ`<8AƐԲ-`E`$21<7?N4/F_IC  82]~gP zvh7_ѣW?dh qy6R U٬ϯg(Ǧ1zHRԣAЇ+ZD #bГf_y9g#OT0}p&tOgXzvٵuMj[a6 ҿB!B3+ nt.οɊFO]>_~YK~AEO@ӕpbx_^̈ 3e;Og>!}^[[oIldz(ۿ}2+`;pp|%<ܓ0_M+w=D(X'G2 !U9 /tK>G'*tPUӀ>v:qzZ$6i ]Z/ iTUEHزe#_1Z#Pz1qb ?/kY6󯷗~l`-+_wJ}E!r>f_DEBxE,z{%9Ս*ktSUSkP'^q3c{'?$,5dݼ_N/Nl!/Ykx-;x aKy}x5*_ߥӟpgjkݟ`>^øY8[?^\nn֎qmA?n'p| S5̊BU]1**t(fjWNԬԘn=z8ɕ+xpu[yη_OG ֱ㕍)B!B!B!B!ĉHODA G.]HLJùQ^^ڲR0- fmYS@!g.R]D?n&^kT ~W'l '!:0w7Ŝh%l#9Bx43z DB!BӂD5|,LLRIQV o=U54fݟMT`mF!sR\djX:$aqVQU$\OtN[[F+Ir? T:uDwRQYe'BD3ԵrȋItL_]LiC+)ŦqT0| TTQ_cI&,IVjJ=܌ABr26{y6VhbF!5H:{S:ݟKt:`j2bN&=%Bj\Iv0G$M{3ߧIDFFuTiI )))%Ncc;KΞ--w !@a!"B!B!P)BbO=ɦ[`L>U!8 ܥ~|QVqau!\Zc{πMrsX MqNq">ߥ{AҾaiTʃ ~MO\d.89T9%aGp٣B!B!B7% Bĸ> 0Vv|C!YM7)7FB!B!B!򉓨 m#+7B M00q4z`o%[h:K0~xpJj0#YC2w7(a`v~M V:BRq?^/C׈9C*B;Lx> C*lt*x)vI^f93Q~3c R`||IswBș~C)"DY2^]#KtT|&ǦHO2Ow(a3!B!B!x`|!s*ooB!B!B!["nn'?GcVeIT ]Pjn3|o.(0$agk+퍜,o.=_> ۊuf1*u=; ݜyGQ!Bװ*le&~˲csSl`n}(8u\gE+5L'Ns9{GtJO- 8$VAc͎S6d]>\dWr&D$͹N<!lGuCa.Xhc<<G`GtpP*@@P]EX ?']XWhk6B!B!ۆQ5q%ٻ=.&P:3&PQ` rgS*&0s*㚾#j8JWYp"~T>=s '\5j:P3}g4)Ctl)\$mA7OB!B![W0U$^][/Ɨ_̎, uN7jOs>}BghSZsvg"%o4c^׋뗑?oV{orz顨;)ILS\԰ 'Fs`Gqϻ]:v%Jn1.ndk]Ȉecř5c% q2lt1:ReNB+ PJiȨ.#TNv>?o(oPFid89BXDs/)5GW6<g;Ic9=LeϠ>W5s4p@FC(mN4!B!B4 x刺oK64O!t QVWOFLֆ|/DnJYA8~61l_Oxv7-Nvw~/̮b|Қ_~eH]E?t%>̾إf7<)!~'ˍ4P/!㌜,B!B!ڬ4}mW!xҤ +/$Jg{W3 {LeX|'C£mpfkw񥿲(~<}$s圕G֗x4-_Ǩ_uԫ[B PB0xBJ񍏑QLJ-.6;i}*h%:<+NaE@PLJZLi˚>wF.lPD'*S~&B,pJHqbiD(c3KejrP5)ph/i:S6Ѧ+uߟ=޿9/:F+ o{Ma;_Xq;1,Փk%cr{3ү]cr. TV y7xE-=JxyI!B!sǾWG΋;hYrӝ^!hHq$Et|%, #0vrnX/gȷv`ДOOqK ~ҚWxM\{(~15㉍GSlk[{ϓŧ~һ5+׿_<ß|V/4L:G_9I<[?}vr[l(sWVlxfg 3,r LdI@ls'68HB@B!B!B!BqqLcx>dj1ZB~reUO= ;Z;pÇɼP}83b/&3@ Ӗ/fٜTT'Gm蹐NG*ƌWxl?yMeB ʩI\K}l.*lIҗ5Zא|(K tu%35:QXx%BWX(іӵ9~v57_t֭yM_X{ч@B!B!xsRv1bf8C<0 *7Q 5wTLm;ѓH(Xc#{9rh7w3PM7G 0oz;;Z)#>܉d{{LS^SA8@eM|-GN׿ !^_/B!B!B!BV>O _c }8IMpxށ6cOJX8c֞DruX`c">2ĺ' ߮uẈ7?X!.N,,='r"JE&QJ]mEw &'2.B2Hy(J&G/Ł,2UڡogM'BTj.&0$3Tx$Kf`jUvj&4YPY,.^Y[ r/Гz}Y1 ڴ*FiZf%1%Y.G H`,q@N9%c)vҖT2)ZJWZڲG0*bN U, Q^N~{`ThpSK0"{2}vz(m̋n!yhXgT~ǐw=@ӞMlw+o>_d3{ΎA!B!MvL1sGO:Υud 0~ ?h n_#),ƶ y볫j)4tu;b@qA'1nL-aՊp TϣXa*~l5x}]=IB!B!B!BYXOQ!&L淋ЕxV3W^>IP^^t0a%7ϧSHL룿GXWϞU41KfYwTB\e`ZJ,?ZcTLEw{:) Aeȩ bbl{2{,M`s,)6Rr<[bMo)v9cp'i6{ƔO\g1u6vE}f+uǭpb/Ş&:Q]/pphAVg"LM M=ͮuO-ߢ=׊4S;@OaxkBDwSrDet}Nց%+[Du=Ⱦt+gl#s] q2k0a+Ŏs$0DMc QH!BfLGֱWtx՘`=vn;GЊX"8Mp:{dEi=Kq4ԙ'˜$=I07#6Ҝ@|5.}Dذn o%O{<'{|> !B!B(+FʱaqG`Oy z`|(h?܊hQJ-R9y!ąQ:nOqۜ0~ѥXUSS=Ou}*[= 8c[ңR˶xEO]}q@1fj989rl l`g/)ma ײ|ʹs;9`N[x9CX\fqȰ?\(C3J')?ޓy:[W!DXp$G('WkEyfzD Z|l_u&fz"dzF.պ-}3b:楨8+g&-lm SO8y"G(']kEUfZDr[E͉o0=7矡q xy>4ۿc3FsyJ ,[6wXBabBq^@%0ٽt ?R6 'Xv&Ph|.v+2< hۛ@ٳLGҧQ Y1yEtu]PT̙?}[H]c(BO!=ʲ |}f!aM/)w}zQ!cS,G*ƕ\?| l!dG!ߟ7!?~P5> RJA>y>}oty!6$mLip1:u8$͇v=9@ƌĴ)2=tMM=gLQz& %meDm ~]zOv^Jks0旘Uw`M2{v)K/7goS&Q%uMav ,@C/MoٺM-WlkР5An{αs #TƸ3yx5"9EXgh{CK'wk'|p"bۼkZ9 ,-V>fxXrü%XbfyeA,?9a[(q,y4g=JO[g`p3$9u5%AƗ舂o+>c  w1u_E?R*$Uwa&7_{ >@@tKX#jOYYhbVi[:j!nz<'G!.9KCuf 3n%^Vx1}9(t1w\757װ?7J޺ ;!C_ZA5 _ F2#%}Y !B! :"\:V҉YGݛ@(Â}/3M_3G{`vR P3^qݼVNtD(Ȋy}Qip&1Fg&G?G:*<.Ki*̕V)ugwXJa+1>bk8 Ee_1I@xh!b.eR4[0.Qc| g5GnֻŲ_z[}'6z9׶(0(?ka`)a#o, aT0A?r^npz>=]E0Wh0>Q:Ơu˸`|0j'&k `hFj^ wNJ9u?s]B!B!o)`Y6=2ؾ?QE<3)Mn.|ܳ4 _ [,URN f_'=o53ܳVwgz9kb1n?̇O Φk_XQ)h—9Z68F_wnnR`)mf\û{7w]*;O_*cTՖҹ|k≍$|wtrtW7鼏-*Dۖ'wqB,jxa͑X\2Eo,5;ΡqzJ&ΟTg"q** ;}ͻ;~))|LC. ['v(gR"./30#郧 9<ϐ1:q|CSo_w:sj3YcӔrI,0 7>qݾ $V+k"^R [hƮ,R^%ϐ<{|4|e)biiv%5:Hkb~8MqɝC3.gRx=}_';\c2gcLC8 n$h'P8u?< ۩6)Aμ"l ɳswpŜ*dC9p˅B!B!\|/EWO@,D8BROpMD|pFhճy>ˇd_=̙5=9?,gC_k?S$Ol_cL L#{ޘ~'t] 'YOJHҒ]^W?ށ~u'B gsakQׅ])+iEo˱$^WƇwDMi̼jc[x?6q3E%c|L]J1&Q]}d/66hq@Y6pg] n24=rP͑+{#0h5Zrs,B;/'mä$lK>ǔpB[r9?صm.OzQvW$sϵ>ljaWXᠦ˒jh\:9Bx>}L' 9'Ҿ9o'V` YB?%di \c{fSyGNL,ho Y4a.R$lsGn(K)BBCRJ GE[+Z} .ΐVR{i( }RE349ch^k?o]s~PlGm,Yc*9!ϵVl q%&MPmWafuy@7_!1>fr r6vEp]9wS,@h{*wKs# Ht;ki(w z\g*WC?R \Gyy8eA԰$8eJqB!B![RG5x 0%AG;CEP R3CNv3FVyt {:/NU!8٭ IDATՄa`sQ3 ՠWZCAWfd85@'ݴДeJ8[]"8( (C#ʘxXvst :(V^%s \' ~]/n \q ^y W~1NRTQɲ +KS1XRQV N L>RdvZ{/Ob#et)QmўI LA:DgEfo ".#ϐ<^^yT|Á(J\8T۴glínB!B!x*34m%24m>"KmKNRTO}b#~,]3w}s|*^W<\=4XOBeY0޶}knfd̼>V @`BGxEw`|'H!e%oS/и~ω`LYϞǂuk:D!l1'w`+lGs\5kublr=3gW#\z &~1t;'.*eYXbK 5,0W Mؿ[щ3kV}1xl::*օL`"#lxp3{ ̽To3.^ 4[i*^>E2g &+%T3)Z`džtjVĦgѼr('2 OT?5Ӳcς-bHpiSKb;o#zݩhCH[wDj?p e֜1]2=]ޗґسD BUeXE)Ua|f޴dzfk86p3[5$wI8g+ю2̞76|FzE [,_ 20yZvaW,dѢq$šb&Il~d%7gbmS{Nb Vg8`n"fi"bZD4L)qMOf\(߅L7<ڹ:JA8 gaA=wxD!,/Re`\m0~! ͻP^ȹ1~@Im㤓C;#Ni؉L_8 *Iă97o.6 븥fq}3 5,USܻ/죵㔲ÌYK&PY2.zeɬ}۷ XT]q+W6m_v;47mNZ^Qr̯V6/5T8gɤ&<:64<t}'ӐCmYa~<B!B!ěO󦍴~j6Rѯy~QN% T.څ1:Yn-;y=S 5d8vfMa7P_Bs2Bq|҅f/p0 cpo}X >Tjq >=&I`8Pdcl`93Z}*av6fMæpalXZ ƫ"z}[|5<[ "R7w||uG{uV6~'4>=ͣ("u3ƕĎ# v>I8.!bQMBj箓OW:Fl {`-ǰGOv, :qo]!NKiDle[XJ:? 3 BŔԄ 1sLf-K?~u |Ti;@qL' 9kaƲ]<Z 1yjp4D8q4&Gמ5?>u6W ^8f&3dz3UJt*CiEZXh 4ū hLmgƁ`|BLfnÁq+1vp iڲÑ́ `)C(aSQRd ň5=Ӣt>T-4Oٻ0=3[UHB IH.0 87In{؉^pc Dꨯj{}{rEH౸ :k C,a@^y=d~e:C w o9 2ʃ/ $t0F G$@42*z{7s]@YLzp'4Ewc1 9+$2qO'HFc/((((rNC/::6r M}B=ktb[g]@y;`V]·7ճ_#q&Hߤ˸##W_?%:7^ 1wG?^Og;O?# __,sm3c M`M(~x 1\bj)tb=lwfQ?WV"RcKۺj*#Vb v!ѿ[T roaVճ26̃I@Fn1[IG}ZtV^K]s @@.ǓyfH\ &Ue{ʡ*~J8IpO5D i1. ;&/'=yzi̯ ?ԺeSʸX[FG43ʹB0"M ШArSΓLRh@SB\mZ|Xm;$3{맔qG%?:2ɻHဏO &HrahrMOz I6$rR`Or?u]zSvikBy⩶(Olr2w;5i-M?+zT4W3KL* 3\;9LO&/nE@ .{z|"&%h:k#|dm}8_n>ϏN c{f?kO۸3ru]3aKg݅odń׬,z?qѝgЕMJpp9vŽp5ȻF.m!ո;#ZKKT@.Y#~yŅ*do{$܅^{=~O_re{'}I@4Dˮ0xYArWHz$7 obSOr|n9hFJ2wsWI˱i)~vgk?0'Κi AG_~a--}p1}<zu|7QCZ{Cz 9%9X|]#z'TYT.dthݗf~ ^Vh>9"B %@_f 89\ryEQEQEQEQ +biTFY$X :x/̫'{K'Nd?ʻ>9_ĩδE3.D~Kg _[vr2cʵ\h ??ΨX|d17[^`x(R$S{ cw)GL[ɹ%lTl+Y'mLδg&RgCx ^aEb#$9>D5e4k! Ky7{* kg\~0V7΋=_pKͽ^H&1oٕ,Ӏ/w?%~}̀bgM$i3l̍? 95znge( WFFq nS#wazz5|/>_<۫ZpE9'Rbg3$bdfHF:'GlpbdU*7S5ny;8ޞ k.V&S,)+o=Ŏɾ,Hg FװNcos51ٹ[6-bmUו7:daNq\vT,I211@b%gOː\|2M2z&\!p`l8m$<юCb*xa 8xa K."C>!K),B3Ysm=^#ԋmCٿ_l*gW`(e|dsDqSRo`:@rH\P]C#[K*ͥi MSd楾 Lfb(v%P6|1j Eh3 zR+Ga]i}_eu0KRB㚈N.Ѯ4;nRHPOjKkk$%ⱱ=n1a$eĬ>p(]Hgy=Ρ(I|Ys,--fc\#$Hp)>/Ip)IHv-Wb.!sFIh:+|, jt왤͖ qOEC}g;}v?HO杻G_Boj ţ nđfH:&G GjE9j%i#!݄xiDk'wÎ=pǕ0 < DsΈmydVv^tF*ë?{W|uL/>6b#Ų\I4%;:[ԙ!޳:Ms'O0t)%Կ>F7>-[Ìs >{)KNqt_3MȼQhoÌAnHh7]~22MIi8yq$$-`|1NFJ[b)(((2&SpHg{9rП9G|s J IDAT9>{Y*j׎ _q2)^8?|sGC N<5cψ2ZuܽOW6^x}2(%{Mڙ[Nf00$ҍ2:JzX `C8Uw0'`-Or jX>K7d|F'QO*N59LEr(usϜحY.9 c'+"= .N?fŚH);16lq2xI=٣HbnYJd݃2nMV;b[+sخĕgQzTҷr`O84=9%TB\e=JK$q1ˮ/[fΥ+ 2E,DӰ.,Yܗ,8",q5a!QGN [6S)cgOKć QNup Sqsوx}fD+'mP7qŌdFn[ EQEQEQEQan Gk9MHrVxtif}$c%%15\!8|CZ ]בV#W*]Q0,531ol1eɭi婇^PO~蝙W_| |@\t*_6p97[yrcR2'0¿pt/jOl'UxX EQ.>HȫΉF:+2ϦSd@ Ln}dkY${0 Â8pybܮv:+2m.ם X,圥y̘Bc؃̵VIt~eqو fR0ξv`O%KBic?)nm=JWO!ܸD֡@+M0& H,M#<{7WטllR"ưhΦ?s:AeAS4tӁ+9^cR1lmVj\r#AMA\B*0r%m!\k 6í+a-C_IE~?:B"Lc`B@D6 /ƭԳ[?1 Mee^\[IP$cMܞ`#K ;h{DfgV^vw[eu tۻ9L.$BWe'"td5{Յ%X:3\ KEQEQEQEg??[:g|2гӛ~Num ^hW;cu,wC3fn|'J'+\9IS~|Fnat_c7qMZA2EƎcI8m%ebgr+)! ?-qV.}N?:<*< KZ J{tyvXx_<#Lʅ[*l~RK<¦xrBq̨Z?D׽Pq:i>->|F0pe*  l{KJ0Ln}{{xm1"V5tx]Kz\V9l>ij HͰEG&:%V]dgd^z߾7י7hh1-yZ M+J?IQjnasHob0ѯ+fG}:g\rA1"Dޢ}ٕ/SLa9Kߘ#Ctf] BFB|$ュ#lB3#ptQNgGge!XMoAS£}LB> D2됷Gf{amsBAĎMQ͈C;7}9bv8ysh[{{{f!@niut}Mkv3U \'K֓FymW %I?Y B+Ź< 'Yxe!V:_QEQEQEQ3'5Aw錉v%%EQWI[$q⥯7$%s.H22?lRZ݌3(gz,gPI%ceCbw | I#²[hN6іۊžI'g\>Ƴrq|t((((ۂ#Q+r,x|TdEQ *_?_}|~~a[/h/HF_qGʷ(J\wt !űL6a$9x׫bu Q=n?N}Ǽx=vAs2<NdtJ`|L~X QU7F.9y8plܨͳ6Lܨbo~Tyh$Y풓`Sy<2~ SюҒ̓Ⱥ3šcdJr =(sڧqϺ+z 8r<%Md(06j@ЩY$$r6 %ioCFytqGyܬs:Yˆ?\:}{S# R4˯KZ=Mph QlL!nD毂WAr=X9ʩ~5\yTZAθ#fIB0X|^B>*I65V> cp_fRRA̭2Hǁcyl+^pD&ZN{pMEɎSU^`REQEQEQEQEQEQ7t:i>NуB eĖEQEQEQEQEQE`|l:71G&w [+9l ͐qqVЧe< ]XQ E1 0XMh膎qǍE0o5H#dlNȌXn!`fVX;v. 87k,`]lǺ(uɉϏ#׹[(#4fG0,MY#\1DGR =y;+)wS8.bj 5B%)Vv^/%&@Xs-rk`9Rք;ց|zamW9ɾ$$;cu Ζ09~;qĖ׶x#u_J 6~o*r d b <Opq y'V(㦡y; !F^}/̘>85mۈh~v!rzboEw6fnZ@~>Z;d2ylOUOG.DecI3f.tm6 ~`7M=?}* {:a2gTBfC/mC5p}g>_}=p;ލ-!T]CP"zH>K,8 !8ʑ`8uI`?-8|[f%\}7_-mR$f-78+[#'џKB[0L0i4h;8y!Wy[r4Nb۫.@]8C׿J_=OOmXNc/L%]J<]ڲkmd'vtZ̞t DG2DJ4gN1^a~] H/|A050%dB$EQEQEQEQEQEQEQEQEQEQEQE3&vX}ӏ݈{|+?gOG5}Xh6"+4Ω,2rLf0:2@~x%qGbVev0 QX=GsE7<"1樂yx0'XW`H rYYZ,Nm&.Yˊ1-aJ!--KW]Ib &Mf o0.ȭFNqBr65Xten>K׎tUL3ar4]!]]l;R޴6TwN8~v/|!H9`~<0=S*(((((V&Cz^O[$zfkkNQEQEQEQEQEԨߦg-~Q?@ pAyK x=<^/>77+y~M¬(o),[5kg y0=&P9kWzܖ&6/FT M^D/iσ51L$lD9(.ax=xye_;Ir NOVɼsi)kbgvL&NeS7wz^Y8x=/ arvak/~.!vaW-zhu0s<;( aC WeyX ҹ ǕY`eؤx4Wԇ;9D̲>M`EZa1B90ur̰%kB|4SZΫ |&7Y1,/C^n3s淧EW;:n9˥r 'y <ÏG.KyzW$cI<2rk9yȑtVׇL'X\4x7x%[cVi̬pkNt9ɽ3,%6NpUJx1l W02 ;7`. ZZjؚÔ$}>á|lgOVE$1s1MH~@PQEQEQEQ-lk((%+RJӛCGiw*XV ]WiFU(((%1b EQI.0ʥ˽k?W]һ~=Ko!7ɱ#haij)8懟{c(Lqh[gnן[5V 6rۂL.*5$b)V"yP[ (  yD#ϸ.&Ol;sɎ-I57&ctGm̲0ZW<,[_ׅI ff GO,nn2 t8|m/ma.Cמ]_EkSIYgFyN1z/,]3;KQUBvgæܸd2ɫaϻnLA8*<.]eOObŽWtaHP$HL/3IͱbSSH XC+-g3 j|5=4<SpӴ b``.iKfy#MTy߱8+"A>[`0HL]ާcۺox1$aC4]zxAUAwL1׫24F&4naM]^8La} ?h~.uάCQ/! MK ;K ?k C\6CI@P!X߃"k&ׁCާXY8 bșsC-2HStek }d3>ԫ{ tyU^H;ZB 02?^I8Ow=t]KR۞_Upi\?d== %"z{?hWOCsj@8E2[vQ{e=Ηg,lБxW%4 * CjQWEQEQEQEQEQEQEQEQEQEQEQ7E^y3,X|rL69y8uu,]5PyD6Dx*Xo5v>iNVKd?76~~\3YK(Gw,24>^r )Y2nt4U ɳD t_ЇH+O*',44H/N @Vt܏ A?>dY|L:vþYAA 8$.heh2C@s%)G2aU.jq9c^$C# l1bևFHR݋0H! .q.1_./c[ِoq;]%f$N.Ar]g;gʘtM#lL$9Gvߠ(4ɀ3Y<] 2IMu{`|FsLSd)1Sx6|!HK;Nu!ӦNbޔ)h֕+OtP8OY);/]qe"׃L瑱!B!B!B54͏B)B!B!Bqad|!8x;~xҽ 2) .~;Ód ! ɖ"q*!7OW{$ !B!BM` yXO!ĹN# Ppx׵ >#^˳G9?iZtgkƯart*QlJZrĴkױ'ۜk2`5B!B!xw&)vEg@4N<§+BT*K9~4@$FY4O%ΐ?j:`xOpctӏߧ w I?i' *zB!B!8{IB!8?y 92ͼ+ͣ1/ϒvi3t_s5 >_d,]sV%|?[$ !ɤ2vsHf愨]|N3{YϘUw8On'šQٗi.bJ-8SbRI2 B!B! 3Ȃn5tc]5\Mh'd̚28CQLоk^Yʚ}wfn .f 4֔4-;X 9DfP9~!w&-G%XҳjU őtj.y1W6&xњ?ik!Y@B!B!B!Bq4_ \wBK|4̽/'nbdA::3/n7,.%Bep ju\Q A40P4w2cs)s,z.i Vӧ3l"NUs,B!B!9J'0;> {l̽c+xtvڋ -C 8:n6_5yhy-{S1 ^AvqL_ɵoES7ua)j_ a-o⡹dx`qTNAmO~&bB$_!B!B!B!G3y=|?>:/7b3Q`w|!nh#񗶓4BuwenzGi߹o<tc!88Rp-aBMbd&rM 0#H;u&ӱd]CNi"إ#40~]2Xsٳt=L@chyX' yIZE@${fC PY~'cVzA]2X}'`D0E͞BB!B!ov^e=ZϡKr!^o׫xsW#7総HW|3wg[5!/B!B!B!BϦ/뫸w^Ibxq{E$u>A(:7\äؑp^n5B$ɮGi c9މ tw2]K1gvv=C4#dk3sSkncRla]GSslKl&N։`n-Tv$}hYt'Fή %zkfiLH$7]L1*_ S m (2,>'@ =jb L_BCnTT~QHHB74Uʼk$G(_+ װ v-ܓ<<@iMQ`eNx<˔ƢYfӛ)o~fRt̓Ȍx0ձ;Yj_tp +Q}b.RGe ~WBBq"lHg 0FL?.>"Y̨΃/T:\tG2߅grC4GeIo<#o`)Xt!c+eL;z癓TZr*PI/=Su-}mdUd4'h44hWqiD2XF t)Lz/P{HZX`[acٛ;@2~gZv y-=oNbJؙƠVK! M.;1_-ȠU6y'2p5G.'d q'ؚ >R\L]C)w(0-@Ev.v3XA3 LeF(?ʚM<ٗ_BfU$*cҴZ}MnyB!B!x< 6zs&K rPB\s(RA)\q`($dRY<@R |5u(Yt]ɯ埗;'bB+N6.B\0L#+|h$\|UB!B!B!'ió'b9x |\??%_J]G@>/˳soX fFh4D.} s}>˙YI\? 28!Zr*0yW3/{fbۘ4J͉ .>У`cw9S>Lk3/4 Gm&]C%ߏ*h:ٟ9_]%EDŽ-& /m`by=N%vfIWdi@#QCX׿3"8#fM p(S6au?{zjc\8L=\ Q>ɸLbSrE"T|0R%s !B!B1*aNIFNf*kPj:OVT e%QaHd .14f4CPhq w^[ڧ~Ȗ* H:5T4Tqd|p4J4@lr$,o  44+"8h2?> Pd~OQkZX(S!QP!B!B!Bqw-B]]ʑHdQ'}&?~^TX<:*|UQ7?5/_:_~> }5=@/c5M_. `hԌ=>&x;v~$ dw1`6,EYF6FFK @f&t5w0v`+}YPݳI*0Iu״lM2>:}p9-.Kkewj ҍNB3P'4p3r>,% 亽tWB^kʯcW^Π92eI'yOkfMg)񹔙&%gIg9S~ %zU}+(l7=| qwpp">E*+6gpuY ա)D=_Ѻi_πOEeS{NGB!B!;K+ut`\͗в[K&VcZB~@I+ӳq&C}\vw,++0j>4:ٝeݟ9̈́ ]wm􎬎)8H2L3Ԏ%\IVD0]l}c5+7pkTNVEq6#|j.:5@(j|E\sߡLS($ZT!B!B!B?s -_txm̉t?e1,)kzP">շw|O1?+XPhUsD6~oMGT?jzNp#\wNc/92dbEQL~Opu17X`liC!B!B!BqxMG7c̸nލ :yvoT4X̧|ckuV&\c1"/o/gf- P,kCJA3; Z}7[m$Dohn6F.l 4Pa}}ɽKvwAЛX~QoӃWDŽp oْ>x WȖ.M  L)2@5A=h jX}W)MsrL,-#f(- uKП]fR{~͋(`;}Ϲv/yetF}/PET; [%3 !B!BpV&`ǫh?YSuf IDAT/VF#Tܳ?KE$@0VI)L|dxeɢGap+r^0}pc-D?͒m k~ķkoy~ţ=~7]&(mp{6Bq2FgPY#ݵ:JӨR'+ztJf׈GL*Pװ,.'*|c|~~T!*@2fHp:a>tMI2B(]T&(t]"Ĥ8i˻5~ ;<L P\b@nO4)eŠUe[@3t B!B!B! yR^f\߶ 5/WҕwD6bqT $cǭ0#D:|N$XI੒oF?spq}P.df+Us%m ֣rBa,b\0J$7(6df ;soarݤ c}t|*)2'y7R3[K(ͨaLZJ;¦fq OXN?g(ܡF001ቸ簰*o4J(|9n{ْi=n< CU$ބS  ߵk8n?SzL!B!B!g/4qJ:\/> w}ZxVuO-dzOٰv3 _}=Ey~f݉Yw-6 rLy~M!ĻJ/TE˪6XstPI~Nv8&OluNċyK<\ńƪQ-oB73/͋R6";g^I1njٯp tˆ0ϪCT5 MC)e9l=ldG纪Ÿ:ox?c]#]ɓ]E3gni xQZV\@\@:8"s a P0b \yY<_<^BhNo~:/-`f$׉ <["|F>?+ĨIԧ74AE45%L CMM1O_; y7Dq|qrAԯi\i2.m+}:рIsmϯWNapy3HT.B!B!B!'k6:.*-/e) fqtvJ -1MD4 IRtG}Z*VoOcA]Tg"C!B!BO994?yEhAcT:X"*?~+7R(6P4 uu qlq Ì0n\v*I_q2;YS)  !FSGk ?:ZC5}(:җ8,ҖXۚ!@7MO=c5E6[`:LX{ _slsrι[(-؝RV0? Jc;YW$h4Mn/-ΔEkҢ=amMqDu4[\YoM+lrע0 kT;>sZ"^!gqMB!B!B!(9,g4 ЌM3 ѳf\τy43a5]Z7khiͦnt=@fBEI|k.fi. ڛhf@aeֲcB|"աzى#c Gsdao3;2(8BKG oc xKMGFjF 5w/1g2j*v ,`WD'2} w)>̮9qЯE_JRNsQ 'k蚎Y E H` #4t,^u{q4qUb?Ogz9-J!-,$ !B!B?_&Xç#M>&_e=lݛM )&'3}XVt8vIֳ牽(l:A,MUX^Dq0K N䛸8meW+&7#xSʣ/c})2zacx6[xjOY߀\\6>JUw=9hFMI/]V+B`hC@ 0Q =|nYx7[ޢ1eB uY-#F!s[y-OQ6v>\bɖ.3CG|qQ&QQK6|9:~F!B!B!f<g|Mש89}ib<س~﫧i\.Ҧ;k <⫴ (&6>OG6(k^'*|{y噗hpRF1ؽWR6e?fsia9T*X8 (ͣ.:t?8&$r=J#w|Du MUQxEN/'w}R)Mf|xɍ E4-JY&f px-NM}̉U-c<t*alnfؔ?j!B!B!ޞət.=[[`n,O6inM{`Qw=4_̕SuZwғH/:hf \y}8g_c哹ޛiή]7捉j}M%P3.?wL+G.gOCVk%xXgO~d^c&^xf?n _Y#kD$'>?\zp6y?\{n/}zHdpʘӫ;G<B^`3S0{t,; ~ ^f`1C\ T8zz.Lì>2X KHGV*O,awW2>fA|znUXn-<;{( 28^/SQu &48 LBoeZ|nS[ɸN\a;rS/'L;6_ǘ8>6WAyZ2t61`MÐ.aGpIӬƴ7;ێʘTs§hbnDl7%N=ˆc&vp:/cFlѴ8QS'_˞Ktsí#sI\L{K1Ɂkm`S_#[h._L~}c!B!Bh5IL.=3 Goe|0GOO?鼃Q][dÇ_TLĀMdBD!du7O>XRlD~'VX|q lv> 9Gq6%Yl%PIܛB!B!iP|^&89x|"ɭ/5JOW1rB~eeIu޺vҞ( Nk&76PWUF8`y}]g=eF/nYã(l`'d f4WUx[gIk+|5:O{7$ZBq&)HCӴ#LiP;ɀqoiNCgoR mOaK!B!B!BR~v}kKלghҎ] X&ʰg5kǪٽOgZ{1$e%س7 (v\FԺBS(V7bM ؤ2+H\4Ly d7șl#_Gt1 n>\ux/92+T(5}y4zy9&[ľ?-B!B!8uԾU<=v4=!| =1>L]Cye8{)tO c.U:a^C;rhg!V7m+EpKqvd|z6-×:*Ḓ7V7NG rӟw#(\PzȤRPB N j!rhFum4mI!B!B!B!BUo'k^[~[B!B!B$_4BՓcngc=K/ƱZ[|n(R̥fBiD&QNOIʏGL.H%c+23r\c(+ $F4gjMLȌ(CKQAL@MZn[ӈt .ʳ9Qhb[[38%vEtà"򙌋NtBϺmt%snˆ:sB!B!B!B!oNytB!B!B!M2\?Z%6w)\|SJ;صdK$6 `/=vi !qD!kIי=`њ,rWOps, xֺH/ s.z`D|:ض9xPe@Q+sjm|w簡-@uJC act UsbL*6 ^ 'cқ]ia.Mtaw\aNTVeWKH *(w;c;&%yv^;į$nq\ ]]iھ;;{?Ve5 I<)3w9α݁GGhm03IEDDDDDDDDDDDDDDDDDDDDDDDDDD! 㟧8*Ɩ8f_wө-?}[oӬ %׊04w?+gh0YWh(2%@ПLٝ%}܃\G6#ɔ(#.Q [JY >9+%rR<ͽY6t1Y( }6@ND/f -;?Zvj狽.K1T%8eRp)~ 0.Ƌa^>EDDDDDDDDDDD &&r'tlH:Y\,rv0qV""/rN ]/YU\qY=ExlT IDAT8kHXαbR-;h 6-i!CK8%3<5ek 6}iK$QtB:֟LڟÉ0@0Џ 󁈈inqƔ7ҟe_JDB~\XDDDDDDDDdl=2!""/"Y>9)/"r֒=?96dHod/ƍ`"qgG9Fa|Sal7n|VDDDDDDDDDDDDDDDDDDDDDDDDDDDr ㋈[HwEDDDDDDDDDDDDDDDDDDDDDDDDDD)ȹZK/.>/ XL, aq9/""""""""""""""r&SgAP\|^ KDDDDDDDḐ e_DFFC:wѕ Nqr475ӑ[ɥ w mN ؠ]~=ɬDF;.m=ty~S&$*m7~CEDDDDDDDDDDDa|y5Ԗy{:H3.5c< ٻ;83?|`w 'U6]㽷-`Tiǀ :)e|t>Jcgc3[ˮc sx:䗸.1rvg)""""""""rʜ8#0cXIѼy-sJ#%QVIyħ?1xxOjܡ3w4ӓCIh&LrtW377ћ/n7(Q7y3Fwf=ǘg3DeTGgȹMa|9uUOdn÷Dcfx2SHh|Gۗ2t9_yhCJ+ qwȃ ƘqӇ\w#} b#w_`ˀ)ȩ䢸wOW\saLa%Oi% ʴER`U`a,/VP`jd<0h-dkX> E\o/6ęKd]a/I}݉9P:fo=7ϥ*j7ҝ?gsωX9ox/??e[zo(S?on51wpnަ|Ǐn`xxT7, ~?oa>JLp\ _w~೸Z 0 ~/+m{U8Zng&<N9=PR7ŷwy)3 wXp?_w  M b7|М9('`Rѵ~ Ȝ-Ð,8c,Z388`'ԯv291ދ0tbLbeUa7Ns{ Onׁpkz1ڀκzyT0+űml- `1ttکvK\K{~+\׉\ֆö9] I b-a okoy(7~䋌-o[HMp]j_Ň?q_rꭴ cg]ʵK.Ὗ(~zb5/|׍MmʹCݴKye3ϝl#cT.⣟~=[~_qoW3Nq3+Xq# QĨW2@ǂO7E[]~ _׫6~\4e1ݺ~cqp\ 9&FeU nk#"ED5eԸ8&/c D3qdfo(skUPÒ Sݴ}O"N#**2JMׄ p^2QC)ʭDw Q"n/@a/MaiD%}bcF~GF]JZ#Vv!(xUbm %STPRfb}~;-C['J.=%{!T1ڭĵ=(SZ"1UK̡v|g P%(uG1֩8l y>r *M)eN?̒]t#G4e`Ӵۢ/bS8o rtO9P?2n~]O;Ϟ'Z3R5*nGy˼U%,v#/Yf>r _:߯j? >J|b#]ك#f񟟻W]Ƕ>i)} ,k]^FI!.,@ՓHDq_ͨgt ÉKHa|9+8%DK a&G!Sj,BakxmLg(#&Lejh*J┖bH ,e乶S A*Mҹ4xMq1T1#q1Xϻ`u &LƧ1ѫ&F5DC.϶ZgvW"q#j 2f,e U|g9C\IBP=ʝ8zÀ9Lrl7?,>ʣڛՉIT<\` w竹21in)R`W~v,S,8ll/ly%)wDfCi+:VEgy܀䗿d>rB8q)[ԛ"/JG~[W&9\'Fqq=#~  &Zl>Ca0>v WDs`IX] } opM3:C6(2:[1tӍ""""""""rl&ǧ+:nyg-kYX/ߏwE/}t + -<~Kq1a׳6f#a5k;ؔ)#04TiW!+ekH",07 oY;14WԎr MS r}Bqi`ƌvZ)M.}]*"""""""""""""/\^֬{o1Q#LXpe^vmt{1,Js?y]xƖL{D1rE+qjkKw_};43W[/,F,%a& ⃉Hb} Iɇmlv ƴ˙jm`>$w wG3;1%WIt oCy\o`Y^5 rAfːtJjlH=mMNNRveG~?3bMiejdN h'FZ,K%f<T6PNcqb L 6$$]O Xa_~+^6OC3iŸ<Àodeb(EgPKk+Oql={әOP ÓJo'b<*ERMeq1v/Om-q1t9"->.z,>1匍cat_y<[G]f.#|~C7Ө<[ {j"""""""""HSpܲ!IӼ[ilKmKkGƝ._Jм8fgpׁl&KqD݀|!C>h<@ ~8Sqo~R;lKD^r ǜh/7n)M">~|o'7~﹢_0={\rY2%jYJ$fZA,b\\= 8GRmp'o)F?aųYT`8wcXtJ&YO5#bO}#[йC"rrA[ e3I?5aՎ3i4!ےPv?I`cf=T6% X{G*eWEؖy糩!A}`Г-m^#Ie aodY"`O~9˝,^H\3W3ɱ)XPC2a;k5\O7Ab"1=|ņl&G}X(/2`kdgF,btONVױ=HsW{bBz +y petK"Plή4pg_l~l U("S6 rYv)򀃋 =Ã'9C»8Ƹi+Йen 0IW}sY|.mgxe,""""""""RJ5t2IOoƎt;.kk(+A TL^sɑU'.RLa=$S/4ο$t*MH6F)dao|Mw-щ\~]#L+n} ?츴~ 㟧H) |/0yJN+^[?4#KeׁS: .6[z\D;o{7M ^_E|W7S3ƦJf ]SEy#/}LG>2DI . >zǷf.z\w^ӳw={EY4GuZ}c*2n_˲>O"kt嶳d:xy2l%Jr?5`>\;XM#o,MBIО{ !AY:/h3)&Nxph%F,bVBZxr8;r+Y?zɲ6"`OpYJZen?'sw8&ZC. !A!ٰ `D1|fh-g{3WFf1?3֙\TaZI 9-̡Л#=z+(dI}%%bQ pNȡzLZU[LE#Ҿ'~Mnʫk5UF,oޱ"7>c8awO7ޔSDN?SgF3P"/bÀL%p.cODDDDDDDDDDDDD4o0027|uCBcp`PȰql?A慿)3mپG"rQVPX܄8"Tez|)joIb} _¥gK`sm@!>)N5 ̉N1Ml(t:tt}(?cbT5p*(7\wio|-\_6xaY .uF&{gM01:InB|fYA\!T2­Ĉ1apʇϮ`tŰ_c`3?NmGA|9 a5e %c:齟uŝMk48%x?/Vo|?{Gxk=pk|l;?~ .&:^~OSj53]Բ v{f:Ͼj^7Q\? 0,ϾvzC Ʈٓh@S1E䥠0ōd֬zR]khഔCym5Q,ai:ו"䈼FDDDDDDDDDDDD,c׶+U۹ٙqXutuH8qJ1YNrӤ]$"Jʓ s%j [ٟ@Ga& 6kJoG0;nsZ ZV0'^A>JCZ.Lp /2?brxʓ٧y52%Xf2dؔD42ɱK(L<\9LL6TƪHTGʆN:BT#9A%L͢,[rPn#cLZpה3%:9^-QL^ĵad. """"""""R3in#*tDFZM0շ|H[?/nxC׌bo>ve^[ټRn<ц ~|8a7Ma|)2?ճ]?tL[~>B}l]?w*6"'CL0^݊DDDDDDDDDDDDD ٳYo&Fy'ݤL1G.etmnbwk9@׋3e }3ԒDK-EDNU@`^vwoF0j-ODhtƩebd^-0L?ķCD0ALF:i֧wc=<|?|c%bN}YK % x9#8+*E1ˋіtsc>F?}T3 i߳}.r?{,8!é%8i" IDATBt8wFFpit糫h5 DJ3=A #""""""""2(giY2yB#UOb~!ݬhCWFN`uw/s:wv 7eHNƷ?[2ͿߺA~(C\{唷<νOn'X\Tlj(f8b-i˞{P7w orgv}9M\s~$ATL Z9% IZғ\!MJغj9[{\$e8SzϪd2k<O)]("rJ,zƔ1:RO3CĆ|y3ʮ`WZtzGD;!S햓0abl?AkG'Ps/0:L/ RJ0;xzq!m!TP9TPMLFz(BvmsVXϛE{Ęy_~|v5>הFMB+6K_ʩr=#Nx4=+߆DsG8Tn \Yr @ĝ5iT:vy,3K"""""""""Eluc<˖\ESj I׿a1ݰ·/#zoHnXFw/^I=Wl>ȶ̉U0}(gͫNvuƨ30e_Fs )"r %w %o_(Wֶź!;;[k{ A"|Kox/~Q>uSyQ6$~u\^luY+<I2KdvU̞W5\S iaYIB!\OWnץa\_@h/(^Ǿu/_I@_y 9W@kvK_FZ~D*H#>*zUU2#Hܭ-%b7qwv>όev%Lv]~Ax95j(39|$[XT9y7}~ĩv]& ,ZgaJiI6.-| LԶHa$hgWAIPTSe\_OM {ؕV܁^v13>+JnbARwc(p?-F yy w3m U)c>u7[fiq K''xk~?:C٤;>iGp(airY2ſ~z>.{w\^R&%1DM QH uωL.mӈ8}$_-5ulg>c|3 /ldƗv뺇NY|}Oo;1b;a& gGtcXzkrM\q `dvIG?˲{؝+S덥@{amvC>bG~54PwTgX>ΉJ#?u%3?v8=b}9F\LZGMIʈ!z2E h͢v/Tחƒ-gyE*Gf1)*@2MG-#dYhoK I#{-;1l3Cu`ɰ= Ϻc7 c!=Pa'&v#׿n.ow|㇏7{`Φ֋{`Pr┽qDcxlQc9ŠQ(#n Tԍ1Xcce`aXRoyC#aM~>3#G̦r߿On9j|QD^:gi,7kޅ6H݈tvvkFM]1nکWO[:wp}m'kCr'F`ӤlᴽQʜ2&$0`"""""""rLo_[q9+a̘:JȰe=cRyUL@y3{N` F˨YGCkg??b&O¶m[C~q*erGl!9*s~/_km; >D=n^`bDN +dRd[9 $mINj)`Xc/""$Lω._dn! ?'#)}͒ŷivь(obɯ:($K_-./ynwe ťg ?="2q >uafL%Q-ڀD~5vg=[" X#""""""""""""""""2ݝV'(n """""""""""@Xnyx뵓(4c›ZYvc[O#ʎ]ʹu3qjLKd?~a""""""""""""""""""r,֧yǾghoڧ5X"""""""""""gSnSs'- g<^xn9ۻziu7%7y{dޯ+? 'uR)н"""""""""""JRC2$['0x1L,w(Qr*?9sdJ&FH!  ]PDEE]uWw-]A] t^&&ez۟IA!_/JNyOyvEDDNEDDDDDDDDDDDDDD䔙`btfX]۝nȡ\|*%/`d˺e}9{n1b8ƌL., voY͂Vٌ y"61v1MJƷJl p0YCAxB;HYn| 'X̺la qɋWp70>x2/7nb/{ֳIzklNDDG ㋈Ȼo|囟ž!^+GݘuLïm6i2﷙vͧطewO;K:QԻ '汭u47~VYnY2g*z4N! !h=}D|986N˜tL&h 흼4gji.~[ q`4{wxCM <%yg^:kNw:)ɍw<ʊ0y̸:>lq ђ.wˣyp'->b3&c?gvEDDNn9%q>ۧ0X5/(k+Y_F3S_ⶫ&ң Eò_rr£n"ddSLLTϿM |͠ ms8zزxrţYGz7K^yV״ݨjk=KQ]]G<5?'^Dzq <AV7N/BԉӶCxK[8=Ӊ f3#Rkԥ % ̛Jp)UŽF.p8iݯD|JCEF'Hئyfe|mq 2pG9;u"|鄥ֺ0~&F⒁f~jqD;3y |熋~c|gXr Y":R7n\Xχ琎H#"r2)Z-3K:@2& IDATdx ~< UqDDu;r3F_af^*6&iӹpmKO~ j`6/G8Ǟus{J%틒m!e98(~ K:[w7B.gc]?7b:w*z-<W2,ƒ$JtϘtJb\^qT`ern8~ 1]To~Q__K>'x>2` F{2,XU3?,Зk͎mӕɅӘ ՟\^\$7D"6xƔk,aht okopCb >Ph@`0 2A.2>l'mn`(`X aS 1ى ~3am w#J18a 2MeYhlG(4An0JXacKSEOv %'H.kaˢyߘ>Fn>~w8_YڲJY!%Ĥ3Yyha+6l1zt%'c-$ض;݋!`{=Y~3>v9Z/^Nym@a&]|)z${r*Zެs(o|<װI\~QKMxr"">P,e$>K25֗5rhX;7bktbYsUhc9{,or)L*F]] G~JjcןV.$/?pteFG2;sY|. bWͬ3Jpy(х%ϡ8Rzxw^?|{9] |P凊hI5,p)![+sX>SXƫu 0 rCXz8,D p0؄qhI^i ȑd);l ~n3'|7 OW\e;+E9?y:ekؙ('ᅨ4b-fV$dCu v8\&V} `B|_!L&~Zv\wm3ۚx~7D|9P90aqpcviַ#g Г )bo oeM[Ƿ:!4QBL76{cBy"!Nl=qk"L#u: O/ch h Xƺ4TUNOQW~QLvf=:~BqbbEO3n=j-8k¶C%cӼzLcpNGԺ4ѺuQl)hW.<.9 qkSڭl?XCc䯽YL ʠ+7]Ll'Y}͛ȍ7|&}a56E,|涷h)Ők4ro/w毡Oy3qǸVN>d=˞-?-Ϩxsdղ5;4fD AE}暥_ĘSdU~ewKa|gU_dvDzmMXЧsϫ/[f7/38Xjv.=sU?;~ 'o ByTŗbz\Ǩ=Tz;9܂CM2Ǧ9ߡ1X*03 4aMkȰzj$lq_UGko>I,.?N?ډ frݵ[Gǖnf_cDm3]( .+gg 2Hgh)1qmFho$#EMU=4t c7wu 1Cx&J|~g6?<kjqp?N\5YC_`cU ׽WuiγsH. _A4$p=4UUR@sq]9%ʯĶ_*RC&C(w7G]31g4D[?ͅ<')KyXk0|1El""rבv9C@.. u-ɂ# ABज़xg,e_c /_ͥ9XȸS7$3YQb`|nj "t1f KRsWmrL^yf92ȡ؏?|v{ki"th 2%6MNdXe[w/v ?99@>>'zT%^;-/k66c9eL!1!c>,Z\VRɉCIamݍ4Xp>=i%wŸ̵ ^i^,N7=;0CVD*ϬgUt7')A^|>F5u&"SVUxN#g|Iz%UrޤG&˶ם0'">Ɋ xweE6J}#YxֿͩZZlɡ(؝^YFy08t0Cc'Gt[:a0?CMvc <b6J뵅O]M2?W a &dci;E֭b%<5F$9?Ky<C/}0Qb" ~H/c擶./IHMl 6%6$+~f Exdpg\g|H?_?8a&bY%xԺ$$i>z7:u?^qN)No8X: hb6ֶ}GiVX?M;l*(dؑbٷa1ِ].""""""gdKڛ+oѿ]5ͤ}|'_togu1?[P6~GlMxr5m3ݍ"ø<ȳ<.ױnLf\}W?ҁ>MK֗/zaW^?n $f<,Ø#8jZvս͠Ȼ0Y u`WۯWrʚGxk0 D%{tcEDDDDDDDDDDDDDu«>G/H^N.pI}h!ִ~nłgC㡒/r[!Pܥtjn~%obƸq%IbjݳL.`TsGC_`ϖX""Gǜ]O2ho%N=)V*iG?RM#qo=mDY&81]‡0ŒRiKQcI'GL/ M0?M6c^Ӱ$M"%&G!c3jSLG97Ț9povi쯨!A.(%#sVR@猦_<9ǰIx7'[?tV't$.g_淯h[xϥrx5O/DD4S,f?6_5jx{ﺏg IDATͮ!C^qqv1<^̬kxvoK7 vݖWC$}[A K.XR > ~g cgܹ`ojs0h=S1'zDDDDDDt1vd0!dDb&Hn~/D,ի1B7$JsP8LeR$I-rD"A7I,ѵCйsۨK0֭RCΟ] g`/\<(Tͥn+}MO?;|XT>CǞϹRVEDDDDDDDDDDDDD䤬!k&]q2u2`:]!"aL_.a$'Z\}ZKDF{. $gGڦ8n3%]>:1u- """"""h7%}H};YQ$W֒NؽuI[N߸&nEDDRƉ+g^;wc+!tZ趰o[Gx9o>#O]͔3ƇX`/G*ٗegd~t8~]6l&MaR:\j˩"""""""""""""""""&pp40|4 Oi( 6%]w>XT{ή9X\z\| u]lNncUv*Lv'9(/"""""""""""""""rT[kgcwIJEC,}D"Ə!CmKf73"""""""""""""""p@ HG?tʿ?{E\ HB#-h|8/.~{а)0rѽ 8O+†UH4)eWȇLv1{|""vE|dNq!] """"""""xZ1VD1w9G%""""""""""""""""O CL%JX9}1]@''cGzU^Cy50|[EYf?@B`ΏLIy)Us|)/">Nhv) N6SYe+1&%joԓsٖ:\DDDDDDDDDDDD>"r}iJƗ-B~ƝU{P\ڙe_%""]o٤HXHp$/xbWk#0KQV؝}kr1ή|+y rMs|4r y`|cru'ZDDDDDDDDqtُA}gbu[5f{'%ۻED=;ׯ)hN}г3yAKs~vCus 'Vb˞*C )CO1c `bȭo"u|1(y/-^4o]Э .~ GK94-ՍbI; 1[٬!<{8e끬0)`\?7a; w{k{zC0}5'Dg|3*mz΍ [|*fQwj_O3c;F3g'#~d شmKQ{ g: >WKE<=|.בI[[9`":мu>ݒҽCI99y-dk=/&!#F1_'r%++).yu,[Uucڇ;`!tv4X1rXw'&dl-#z'ٻ8;7eV*-[{`ltB r/$F.! !! cnrQmE[gI,K! yvvv4;qM<mKv!I$I$I$}jby?fw_M!DWMǛ<^oWqmOK{lq" ~"cx{cJ{:GĺMqn ӵto0H_\ 7ez/I$I$I$I$} 飹pϕ%$X)0ZK~唶G.I( Spu%Id;N؜q$eONFzMuŅ?u!0" ]$PGԇE3m[޽hERwͿ͇Jz`}.{jb fxٳU5֨XRmANyُfV:pM4x97 jPTV;qHS6Jy|7xS#$aIR3W -Q_Chь%E#&JlY̘:W']qf2iM abpڷ5v7E p73\Eu]łic-g n d_@|acX8ŒXz7P ͢#&DaCŴ v[c>rKBQ4 V%L}~^^'qy 5Sq@Ց6$I$I$I?CrFǕ0,=rD5-n?]MآbIJ 7?dp7fۚ5p"KT<)id擛"x Twg#&Ĕ / '=IKiJKOPQی3ԕ@Qq&0fX4<̞,8rD8gq1) +*L]u)mM TKq)gP0$xNkxә@5*?K"gL1isid-{P.;nZD"}-qK7?7*cg`u|=*pKPf^q ShD"C@ <[#((L3r)lM.܉p3}=ATm4yJ;}oRP-f#G=8h(fCnL-:"ht`(SDh ,<гZ4kAW }iI$I$I$I$IzOK|.O<Ɲ+4 Ll C!~k(ީb#k<;`eΣTН1w'VN\}1z6:;W d^3!_}w5Y|glŏuY2oO.爷O1UI.J2ߔP4Maqx~L-Ĥhv7wU][F}HZFCz|H,} 54l޵]]zN\-(hsz7C"e{;8}i}_W5Y8U}S4";=4}]8||dPZրgZyc-BkT7WRIe+W#m_=Ą ͤ@@p#zcE3&ӛ~ix9߇C`ҙәnjJX}N?ŌPy]. 6Sg͐;v go׏P3[7nag];n#!1ygI$xqpiOrHb@T$I$I$IxS)v⍔8ԵQD.$eLhgkoœIq<  [ W #c N'%]-qFC&(6 [fnF'nCQʊ?>Γ+S sݗǝShkj?k^C{:o} ?3jzm`eOo0|?KrCe?Ǭ-v/W1!Ղ2f;9\UQcmwQ^{u~_UAWoVM~Eirב%I=s%nf+)Js8blUewu#!T= pk04a:-]ũ 6Rsfp/p1l)?w;srưڇbxB\Q:QJ J,1P1>Ӄpj3TD5jh WOAǂD&PD Ěu @vbD1=L9=KĒ$8q0~Ët2Zq^φ*1Z) S$I$I$I$I$J2ߕ5+gP%^} k"#^]gK6_`Ӕk'} 2h(//҇G`f+PjEW  Uf@jaU1!V$h+vMW"TDЎ{tXu uCG@ ŊU1 /lR[4-ҔcQVv:MH;[D/vJFBM^]Eh}X<1Zߓje̸\VEj'{w/ we2i8;;.h@8o8&ewM70T.eKi]W{ŒX6i΢n9j} FZ8q6GB3<~ޫ6t6Rxcn>^s&-*K.,_vjyjOUBZz>|Y7b#QSn?4E7sn/!z'__:ޓ`DH쮝ekp qyLycoJ*B'jMe)d[pWI6̼~Fz ч),w W-)a2f1 vW=G<8 ۽gJBDTo_54K҇Z)BՇ)2۝%+i)?6ucIg&F$le9ƈѣ)Fb uPS~O%?-.͔$B8ȰNg=o` xvxfcFBJ0=+_Qn8[!YAC'+\Q.v讷Igx N*T)qL@s P}>t8R04(4a+^JeerQ*)XQl) K4X9|}= 8 J> qh 4MTafG3҈amT+P@:^k?· aG! 6a5CDi㘬Yi XnM$2:02;$.e_`7C=[l&&Sg'f.TZb}wL|k64tt he9ք3$I$I$I$ItAn'ctFYjxm6txgFk% ykg5uwkfzJ'Kd.{]Pe̐2* &c@=c( N`6R 2=/JCᔹL 9}d11)444a[g.@G)%-`K yb986f݁YkI%:9 sڈrf2T833g ޞ[-<{K#Q(Fb]@$j8[J8:BtP&,ddz1 #짵Gspa%uH>FP_ή#8J~FRFӋ HUپ}[sE`#sd[T%El8l6rq j[j9[9pxN׶2H3'mna㚍Pd`GcW!P]UΣv[_Ivpy;@|ZܝAii0ʒ@f; Vijs&a(2ƳdyqffQcǰ$NcYx=`LO[%7'>.eE,)3zttēp?wǀD&6\-+H$I$I$I bwׯ-p>@b2;<}ދJ»uV:'W54xD4㮻]~G;8e=J܁3Ϙҡ%L-R)/a,jL0]Xk8vsVȴf%6*i7 TtUq>c!jkx;ص?4%1 S5+#I$I$I$I$It+#w` 3 ':$h@3bP7aZN<6h +q $BZaBpDXXBLZ!^BJ9x$I;44`{Srm'`bA%Kq\2|{c7%}2oeLɌBW54UE™qI;֤Qg^Qx"#աQp8ҡ%1Ⱦ}u .ᦹӘREE3iEX ^?9T'oc1L>g\öZ}ǢoVn^^a|/BRADe3oƐFj1vu㫺s&v3 хd]Jy+3B$ٰ/`wXE m ^$I$I$I-[PF Y; G)f^=Ooŕ7@k/+ *)q8b]q?HҶ@GFT($&R}|u5KM4["󮸅NTn3IW%.ǃuSDEHhf'}B #pϥA~bʥWh[xc1M ]~=&]q{f~f{[IK0ώfa f$B3U@$I$I$IxSHM8usk KɈXV޴1o(ԮʮAA!x2RhV ?8%*!yHֱ@wfHOH #T%x>L|u[w t( Kh%S2n 78Pz {d)UU2L"aQ|}[ʊM_$]l2S6Q㉶:Wv7ꝿ'{Cx;g EQ00z0S TEf˘7FѶ3\$"#r+iDB><h_%){a=|A=Á V{Ĭ?9$xQw A #~{,A~$I,; n.1PH V{vRiIֳHV6-SItS?H=1hF{R;C*xPn8*hԲsGTL"fe# #~慰'KdQN{LBF3UrdkiU!DHT`|>dΩ[h BId}@U7 2DZC`n.$IM'Aq7#N]4:t dvF$I$I$I$I>pөr4;XzW |6 HLK!ڦTk;sߜ8Fwv~]Kp5w-LZ!d%[i+o~pF86!`B$ƶPXvc@eLa1i?~s glټdn4ֳwK=&8S0z)V3f d%'rYg*hϹOOJ:feͅծ "a?mm=C7@4!짥~sӓJz ~5yf2lbՆ7x~)){pn^ܿ 0{FJS:B! %XكN?kVOC vy$I$I$IGBCBKS 3QLmmn:CRQ)y@P\LIStfN+`zQ@'v /o@%;?E=Zĵ^̢ lV|Wn } ;әu-q(+îjt k.i)c*^uRog՚ô>WH!|A-؆1,ˤyO5/IԟꕯvWlD9l#P.:W$Dƴ8]C%}\‚sq|1t5Dǩ]lؼeM%e~FwY*JFaԙ[”]Ś?a OX(\v;9؏yd'@ׯK$5f} u{#B}+29W؄IC{oQOe8HCa7\ԅ$3 x| ]BbnZE*,#PHCuL J3Edg`J,QB &>2l#u9lab?1^g>JeôX9aj)!_u49:E$!ZBN8{"pP'iUk3i[L:m2$I$I$I$IBGWD0ΛLcb&pŪ3(85+*ƪ}52[G]>R>i撟h t㏊!1>E@F7]0p`Q -<< ?m-gQCC>ߺ/j+&I%/C2se*VYS,/NNb~e]$\m AB=չcBYuT+NG^Z1 ˖z6$KQ6WP-v]V].*[OInt?-o3h.SoP*`ϫq&e:V4"+U-/J$+>h0â!f"¨X cx:Ry (D5Cdvwc|r͜DIz&/3Yy+QHw-Ĩ~؃V8/x4/M/GG{a}֨x[`q}_f:ҧD6nBz _ XW $>Tjb|m'N'%F[ZxsANtuկa fMK)|1Nd}136lic)g}KsplqöކJ!@ h80gB&y'/q#XQV4 wdIGh)/ߞ`!.+8w~AK$3\GF~ϩ2EC:h Ϗ0]&/2EO"!#˜ )!|:wyηP)vdHw3"UwIxb4Q8bu #S0whQ'uH"VJݹfp2rtHlrVmuWs!ǃ-} :rF9JjaQ۰ RT2=h ca|;pDS,0Qj "Z!N\/OcT8f2*;EKnQxlf/~v똸ŏ7֜>[D7Iu`~/Ǐdy] o?͌prǫ"ǢMfDT` ա# b6TmQT1p:ܒ5 Z.yVxhV*:@dKbIUp={޾+;#bt9h aUz!Ez>j>s#) b}VGcI$I$I$I$Iz6WÊaCS@@Q:@p>@0aDhܰM=gVc_ 99 AyL_h*=5nXr9Iz"F+;Jlɒw7r qNMnAl3IK %$%Ԙl\YXW~g9:Ј0q4Mvf5\rt1|5 J6х3w$Ocבl9RFUG@jXu B %!.~Oiz."5)&\h=w #3ydA AXG~;'iĝ!đM6uWDc;Xp%}VF Iޝr~ aY6O]Hų[%ovRUqC urbz+Y,?r-[Ff~i7ἤ,Os%N5]paL7wQ<|8NٝX-(z}@2?@Ч؀$I$I$IqfF Vt[%-: ^[4z8Y~UTwG!Jy׏0jƋܒ?q1ߥ]I)?pQV)&ϭ1;Ϝ,^hz/8\Et7x IDATq) 1W_{ ZO/i?OIWdL\^/Mtd\OJիO)0'qI UC%Duw╟O/dL fay]j2.1cw8K 8HK;?u=_7?KID16**%< G_oDM- 9ryr5o-!/RV #ٶo>GI8]V6#Yy__ϩf&vgw}Nh0h%)#ow0jٗU=jGlI(wgh3&:Y$I҅Pp=Rő$k8Hﻅ>#@TPh>?^Ēh;~_>v5Z*Na-qp3~t5<-5aӃIo*IШ㈿RH^x$ h5i T~M'GFUkMDӡ*,`:ټ-ŸL;pK&zy3/2əVeoxN*%e`T^_@r(DW`e[ zh:`"ykEg5MCqO!)2hųacI tpqC|.)p FîY wgY.B,:$Lm[VМ)bݗP6B)ֽ+60i̘9ݵMzj\Y=1)\ DMG28KG !B!8$1I"6z@i. ~ڑRD#1Lƽ;hɟΆa l#(,#GA&M*Ƅ᣾+1t$(#š /ޕAQ;&7xaK eBt& icb mH0yLEI$C4i9B!젡t.E<@2Bm,7n TU$YDu,ioJ"|T<[؟ӋcŋOѹ\ah(B7|w}myBmcY_=Ʈ VfT+pV"GoU):. xi?QmB Ft- v%RvX @)ph,f1 WRk!3֟#I<}$X|Ӌ(y_e#KvFqL' pɭ%X$@Мx|CG;8;)RVl>6%0ml:hUx6'ZHTݼe #/Ma{J%LE$;غKaNکagPf“c}ou͎ʲ0%B!BGN:;̭AIs۶bTx0oP7}1oMAq=q̽(6JYV0YIEE!yֻ=*SP9]t8GQ`$$ ݷ1X-"&:00Lm6l S.kԀ#iHhi_ɢ^90)ٰeC0!$<ʊN[<9eױ8y?9409biFQ[9n$kT:=0G29yV}t ȷiهⵚ7=͆OҦh7ڈQ`S92*{LqdA߿DmIVVꉪ+ R;[s4 ]NLO"wU=[٣t<;WvG>L8G@^J2МcB!B!B|LӲ]6-Kb>ޮP:>5WvG0 QPx`DOX#S+I >hMR0@C^N]Ǟֱ4l.'.]DN4(::ssŌټ}G q}Ƴj24mg{DfW汣g2w".0{؜8Vt;"f:C:aUO!B!"\OM]W]=+cw;bj";Y[^>1 [;SKIօE=1Y7]Lj?lcOsEF}eI%tK(.PdcGgtb'MqoՅ*gǎ;nʪSx6<13fE>Kۛ0ӆŭANSThGEg>HZ\%WGJt3diUמ>ϮL8O;s7h0o|u!L+@,tS2;)2x^q9GP\XʤtEw-ߘ$jd˪u$ ;K=`Լ}4Dl8 е1yq+^ٲx!?kcDByT5qr [-AOqk"u?>t4X.+Ӭ8 +Bmz ;rW4?Cٙ9L2>.ak.YFEE<̦ =q{)UytDa#@"@e{mcXAi h^JlC}m.hf:R{hz1(g/`%H$ }ZLΠ3j(ƏM q_= Luxiϭ֌ah͵ =4OJ;NZYXԳ:2ƺdsfa+) XQy2ͳ!$$N @3=AūPb+Ɓd 6$UE]n75FwB!B!B!ާL:k +Gdn:2f,4kz$J,>>se1l߰AV<1|d1̞3 *,F*K1l~J{Kp3&VS'^eWk,O;"nZ2mj!Q}O+>yȵ>bCﲿYYq`O(b_⟿yjog[KfQeaZf p\cߋټ\[bOCa4-iN"l4DT [wdǸjͻo?Y^OfOm*5ww-lڵ٣p鵷э$U4核Kٿr#sl(7=V.Y5J>7GGSտ`|Fһռ3@ѹ(ۮgxG֭`0/g Π|v< "Sx| )-iFٸr []-<܏k<&Ͽ_/M2 ʢN?֮ZC;]pյ!C$L% x {dٸVg55pe HE3>ܶzIj gGO׉M=_6D mxuL`i:&_TQx ش _'$kˁh*,vyίrS EU監qa'T-U]y$86ӁM3$u:>FO^ G҄b9 2 Kx`-X?Gs7`q7/(~;£Qǃ1v Wzd9c#Ǝs/Kr:hv^&A7+o~IvR05c,s+\Gr]Riɤwݍ'Vul"H96a>B!B|̲,o*/q v6c+̈́~=!\|̘$6M\x\Iٿpӽ%{iJR8fм-{95x?)͒{ήE2@w)3ot]8p`W:q3؛7ҕ{r,aؔ,uaǕrϽFP.me[Hq1?_͗?Jv'̩pvl?<;Ƕ{j6UWO~/XhRtw^¥wWQAW<yˏ *14;Cٿ2iq?--!, oÖN,t C\q{FAYM&hKS],U0f/sHM#Yo͔]|3;xpN(ęcooC_20Ͽw"E uee91TLE vt5xi@*O/B$Xv O/%GS17@lifE׬8T%&6^ Z^'"eO`5)+AZmHX8*KT 7kx+^;~< q+BB}SJuAGg@ߟǮb,"6͍eʼn\&V=kOA0Id[O;=Osa mE{@Y[mhK~B!B!hC%Ikc>Gf/7FCm,*y?|+"2g{-Ij7>Ϸ7wEPubtat@ݿ~e# )ǝ%'q"PYV~";(C IDATgx{~ɶ">re]# toh+yŊ1ˎ۩aCS޽[ykab5|w4`dDۉX;ۛP[WQ~֦,2 EvEždADFl.'){73ysш=ʈ$Hf (v:l-{w፵1`u@tlXR1R5)MCNh62H#$Z;ZMZt>K[$NGui>fl=Hfvm8\vt]팟`&F);7$亂Crrp^C>:O6n;2VrS7j xvlF"6ġCys}P.v&uS~ hiKLBlڝ{' e~4>GW[=wCQ(fZ"=Z8'Ceio]cC%ON`ele)cvI[VnZQUlxX$M 5J),3K4E]!8LC42Ȑ NXDTxB!BPGIvn\02TϿī|[8/`wYȱaW^-Gӿ;jnESG3h˫O'a$GM:xY<2]O5F5/?NivDAP*e}ϼm^}s {мe eoxtmBm<ø>s3] 79O8(:]wC]~/C̿x̙a$;W==Nj'ߌas( e~} *X[_*Μ W?^@i9`֘1(ecݞ߳~ël:t}eûظyNT`;iUϖkYdm=T;5n%~$2FZ<1* K mwO?ɛ[OQZ5q(3K}VBq.0U/EV=Nv J% 'j&j/8#lTByGtyjN"E)q^Ұ9=x]t #!JTw"CσSWdI,1Qp}zRI\^@1#i }lx<^n'#L]`Иr &;芜S7)ؕNذT?@J Ig?]4N a2D)29i:6~-ebz=h*+1A2'1`IaIn>'B!BsޑD<:"7*#ӈSZ`#I<f/L銤^鸼X(X4n_^\6\:A$!=y0t%NW|wҰ8U`(D*mW<)Caav#F0:ۀęP2 xmº݋WDSYR0 'Is3MI?`PSw?,`P#$˜6fQuDee%T!GC$ cC"!9*taz84/.FKwW>-ϫB!B!RI)cư /ǟ`ͧ%2,8)lPr)BMKL/. 2E% 2I%cNi].F$L]44,8ɶ34ЇiptG\,gFA0.=1Oex:s)_,D};'k`RĒab]K!B!B!B!#GW!Z˅B!B!Bq`|!8)H l"g/Ȇtb(:㑕E6=Rgw<ۨ,u;[cAYSsken뢩Sa$p~X`YoB!B!B!B!B!B!B !@Yr0ʲ0Hs;]F.E0_pQF*ʧ,O @!B!B!8Z x⓶"!B!B!B!yf$ B!B!B!B!r' qYdH`_v:IYTh&ֵ ˭2Z~B!B!g%-Ð~!h_$3u[~'+BB!B!,fYL/Bqh3A4t0 g̬MSr/B!B!B!B!n5 ә_T*ĥB!B!,ĝIB =a td^r蟣9?Y/B!B!B!B!YD !B!B!B!B!B!B!B!y$_!B!B!B!B!B!B!B!#B!B!B!B!B!B!B!B!D{~B4 M @u[)TZw5zjuoVP}z$}LҎ| =#]CGOu/xt}l[!B!B!B!,41㡡=:@B!B!Bo$_qαy 2 P5KH 5l<ӱg/bH naOmogzt]="QÇYjj|znÆdY2Ysj1KpZ֬c$Jd~Lc5ۆJnl`+[پ'Hvp&hNz W*D{[$oM=ZXn{C%0C*:a׺r ~ܱ4 33j+\2Ez6meBIկPKk h&]1rSm66zP ~u!B!B!B!/ N~r}ǀFLJ vb"_p84 KeI4^K4tʑQv8:U;S+Xju!B!B! x}<.t#Ș4j ǏDSxD`~"-;-4 {Q!.?]Nc%cp&5pTx`[a0b^ƑOݎPSG3a0TqtthG^ږ$f?y3 \PcߪFk{bn}2$- a;L4ˉá9IAY\`0I\+ҡmn݁d}؏ϗMj 58v7ŃK)+sa1q1(ve_Qwznm d0mYnc/_(< z@cKk?\"A=#xT]]wC>$%!B!hv|EvT.M<#m@SWdQ 6~ M&\Qtb$5awy 5t?>w=1JMl<>|^K ^Qm"Tpl߾!>N݉ˮcf~`p ei }$ʻB3jvp3Ystbʤ (ᚗx9FZҬV 6Sz*쟆F4357pPI6TV>`{&ܣ)42V5ȶPݿil<.6tnɫw=@AQ,ϯz:,5 9 m_P!B!8Q]09RQF4ɚUkYA<͐sd .1"Ȟ-ky{6k Ȝ9S?j8%v\|OcH47C.檋Gk²W]ȉsx$F+ãe7s&6lM[w{iWpӒTۉ6awxoR{Xfm1BћfW: Laь,1Q l]G4Gs3d4fNp#lv.֭Zþ9sAeindz?~ўyXFM/EuD>V D &s ecTr3F(La l~aޭ\0Eg2S6wVD]NNQT.3}Ǐ!g3Nh~.܌P4V?aҡد<S^Q8Bi.BIeQ'ܬ9`P aZ+`aq5哦S༘ 桲ؑP\#gfCبtg:g8_!B!B!8I0'fs1j{5UB.BS{=YK+OO5w$}{wU2˸qCA47]x _,rq -I;3/ẫqᐟ'yL㖍ҩ7r7!X:շ˂"[4 f^}+wy / PQvּ/;|_&4#`+Xz"xQ~wiLv\[ZpϞeGKEw1d#Jeg!) ȍw~ۖLp]3E\d)^/y~!vvٽݗ1axԷG0쥌u)7cObwJdu|[X4y8Zum2z#s=0ƽ,9cDێnΐyo<-Eq^eW\1{R5>+#?_S9i)_}\>x[#mqA,S_O5j{>8'Wx3'kpC]>A~|BؙSYɨ$ 4'*E{NiF֊JфCs2b<\e٣rl:6)Qԩ(+UTw0x-]zE]dxC'7?<(?Ǘ&gQn( \2˜(fzGb7ӊB!B!B!> RJi6^XP"y|#8Χp [9~9Hut4 v8tN1 ˉ@eIijuu UfGUhp@ Z'k@a+r٬qRXFpSG~{4y26(;Z[NOC 8sK!B!O2~ѵ~<~*49?u3w_=MG8m\s}\:"['L|jwK?wo#$kTp]uw]`7+_1;=F _noqG$t̻'xdxyECݵT̊-tΓ(!G*ΐuz ҆-gp]Wwa_ 5{QD;d";xXH2; |럸eg̎&u \]fjh$ɚih?9,v%d8ٲe[9k5g:wW}HM8܏N0]]SU]u(Kåp fMiNv%:Nq;A*q1Sx&oK7t7]y6¦W O& e{{%  "!"v-߲I[XEvne6))^H79q OBz$A"b^ z3JKp(qh…G8IU @N<ƒѳΥAQEQEQEQEQEQ>T2~D8B"}!ǯa8v~LC+~4|>9-!p1 Knz4eC= Y[f0ilV{#۞oV. 'c5,`';ΦpdE1t҄v-.5wL ki?O@'`&m6mfʣDzWœ6Ld{ fړDz0=iDyȃ7!I^a e՛v4'̟Wd +?,3frgD̞isz&^| }øECyd&V`[ěٻr375kq(6@ڈ&}.ʴ)*xdwiDz˸\{u%3Θ!~gc5WlaoUp~z(5׌eH];Pإ"J#&Ȑ MZ{bbOx)(((X"c(3Ow޿۳g;OnculҒ,>OPgOa IDAT:gg2Y"6 ꮻXZ`-?x 0E 3??4 șr-Wsxy;uɞZq!fϛͺm'9bĸQ*m>K{*3(½$䌿N1+l?}MZQIRmy?e;E,BS|-d2atnMi-A56]߾iDH.[[/ߞ+Fz6 B̻S\[OGb"#x(39UM[W;k6rg1fxdKFK︜4)E3jzv%l?Kv7 Q@F,b[؝lμG/awWInp 6O/` |9аIg^EA">@ڧXߵ*cT裹1BĞ*';.(((((v}Nb&`iqpr S$6] #mx"wK+#4.2O8Cmx$A"eNzHoWGz g_M7"䱉6Rגƛ93) ?}:8')8IQH٨L\{ZH%JESX!_&1= g@w3 4#n{V]ʹ /2IfbKȡ̻MLU99+oJ9MG1@po2R͖;/E\}ڕ(=_3Ǐx.3Y>[>!~u9 d =!xX\''|ޛqU?K!EyE";S)R.qXq:;NI$@f|zCq/D0x~dD;j5Q+@Lg5pz_okVIJ{M[~q߆/Q8s#m}#Np_RBI7QH2AHwc 7>}48Ѳfٽq^8ESrÙ9J*hYKwMp!-'26Td|A{ RFjU$[7A0`RI7j~|22NDa\TNi2p&&2XİImԙq!'RԳMZ$Th&{ÛWר̛`8H4$ɠ99F)%<IE !gRW8V3 dfIǠMgrSX漂yz;i;+3q3S:TT"(((((upCJ3EQF`7!jLgW#4of9oqdAmJʃ^׬bwҁ?2аI%bD"q箻Rb6h,pnSi[a梫\#H!Ա WpKtäc9U}cdrp}d˃ίd9/ f~L h=-59{Ǎ Q>mJDꊐ0(r|;9Yw]3gWqRQi4[6Vœ<&5@r:Lt,LubSv[/6.2E lO2ʉ~Ob :1d˓xl3ǜKiB0G)!6[L`7)1p ʸqzUEqC&*ݳi6j,ݵtr7 agcd%[$M+a^,pe֋ߌvt,t cݳe6:VC\)^R6Ev>*((((({JWd/dɴ gdUCO}χG,6K>~vvfyj; nTm8M`ݜ-S9l\=!Kqx};pL :GV!3>>0}-LhG3eJ΃{XD|I ^OgP1ꉶ^"̈́ӈlKDǟqۄ%S%h޶:H-:`36mY7/-SC"!. 3"M.#h߯f+ξW3lLǍgzN^6`Go%D"VQEQEQE3x}<>2IWWDr r6p ;hiM!"ު6* dLi>֭YmUtFlO3tpwCq8p\h0U@~HFߟA=?;Kn]ƣl^G1c(o0bH>pT/Cfj~zj/9t}° *aX6?^;svRT\%8zobs,ih8 kײ~ڒ62"с l3b*獥?,O}eD돰i:vVսbѵz~Q$9*1EjY"OI2Sϫ1?yuıWDH'{DŅ9\av׻oX~LF8MvJ^^:qEy;$>ӤETI0]G ezX:ьtd[xmCmbìʧqޫ9ζ9B]Kŋhl"N],!6H/1 ((("tCI&D IXu<)i[$T6x 0p: 'ˋ[WK:s582 7V=:wɫgFm>IݮŇ[Yw"T<΢~H4w72gxfĉuliИ|,v1S ƳvZwli}_7Z(W)*}A2}Ƕϳ`-a)_p٩n228^,< '=u#;ɘt;w}'8v=Pؙ`xd*LC1Zs\9nX@i'Lw+" V)2:9i>!2I ^ 2AEFg$,&cT]-ڏ$1]mlJ% Edjl;LILZrp2MBJP'z-;AY;3T1eYbeX:vwt!Rth.W-REQEQEQEQEQ&̛_Wu83 ùX8ɩMϱy_=aS;e(Ew%?Wc '^]w3rY ]i _7 >Oz-ƍ<%c`l| >:!||3o埾~sg׉-l|=\5k Bk?ѭ t){ OONslVKsq;э,FT=ghOXhW?~\{=]g>E3>E4I)ccKɅ57>݃SԦE]vl4hcn*T8*'vE ؙ~l6,l6Nad$<& NX4V)@YaN .Me&L!$㲃79q6IP(J(gy]Jp`j?F p並Ęد\@N 2 .ڭ{ Yq`٥gb+Y`+((((({JWpN/)ODMW2ooH?WSő'_v'wm."OܿIA*Bf,F{SD3H"#:2ϑ(tc{z fܹ9|0]޷G'wn'xK?o8]ڻhyzFZ_6x$I>IiiiunXcml;# ]+J[c;~23HN%#>QEQEQEQE2 i ַ(rbm11:#= g׍e$)$n@L_{Rk/ዓ2Rz=cZdִ /htb+B8=~+QQ8cgLEr Vb2ƋGՅ}UX0Z (mU1 '@&crݟf>M]WOzY)Mq sW{?Ɲpq8~*J?=xibꕬY+qض$xcΘLEmkȎg12]oF>֟+@T (!2JWD<kaXt= iI&S=I:9Aln&yʺ'<ک0gvKofӸ KQeSDv|=hh$ASML[ʕ1q@) 7Q@#=H?L$$ږ2CxX5$H8T!8?#2`d-3iJu'6bǪm?}z,63zJJ,3M: jXM;2{qd\.lx>%{fGQb_e(@%%XJP}/ZC26dO'3{ 1%_Vfo M{΀ KbT`j.LInnJW"-XR+\t IEM*|eTs("0CƦ4eFH8zv pDs@WvW 6i2P,d`r"Dej t&L>E&19r#ʁxR]T eXLZbDj o2:'>Ǿ`o'H^1`L!8X&Kvp2wWeZQEQEQEQEQEQs.Z 32{疍WXZ>S{9ғCq6mJJq(xp'&^h D23xE:ƲA3t{+2=7Ma0}wIIR4irez0R?W>*Iw$.K|&E_cEO$eEQEQEQHښijn'|Y>lJrp7rX.bqd!l2<}ᅷCl5$e:<I7B}& AGWx"cU, sTՍ[$x+X5R [s{=F y!_:(4Ģ1Ҷ߉Tc%X6:c;x:ajjZ 6uWyuIb]NI9O߲Di#DF}]jDQ}YLzCkxf6z*VioOڤ4~=حշM2j\@siX4)E iEHHWSb8&GG8?NqA CȦ#fK tbq.F*4S.#<`'{%8Iw&-ٍ| EEBt[Ƌ _2 #v|ˉ!_&tDJGnJbclAf0AL:6ZD!bن\Z 3"~$\@}DEQEQEQEQEQEy|XYøίpϵ{>o1H"l%m(Nyqqg0VTI7ӡI$s0cf }Á'+{S8[ o&deJ:kۈ 1 K0uRuYzӥmVq:fȸed6޵+"N9`';v;ߨ%fk,Jegixt^+ΚfΞj!]=lqt6S Dži2=m̻*C{pec5 *NP6n*}Kw6pT55;yigc.{`tH[sW_h-+^b/MxuG_ .1Cڴ0i t%h:`̐c8t\l>?#K01&f4Bc} ک|g3ymW]4&#5^]/$u;t nY-%+6#t4HKny>\.qr!ZȰx"Li32EBH D E3|~B>ܮ!+%oX1spBL?L/.nhr %x DӴ0SqZvjkd))Θ/fX "F93&%"lsJ s!kn":-zE}((((VZYK᤹#q@1Wp3xt5:Bҿs ~Sxq7mimx٣|vi+iI\>?n3kVm6yt rw?|?3Xʜ[ncfž?>ʖr) -0^2ưfV?88x }5^}hO6In&0jdFq̘X-o:y|ع)3+'v m]iy7pr{V@ '>4`C?Oo*n&tj?U5tM]2qD־̞+][5~F8Z~+ u=8o2:r&Y㱗D*#RP9q156ߊN.l>%Ah9e3*B*hH6Ryc6c2=JcL(ۿv;x۱6/ S7z NF1˗Ava.[gwSwV۞?8,yom{} T= ,R $<*oi4ZIJTjke, R<$(ru]Ds )+)ve%؟j%[/ao n;[7@(\L:S?@HYOMwz(((((d)SʼeWQ0'-kP_ҲIƉ<_Rʭ,XU}V g ?e%gy?+U ʼ0؍vjh"ˮfIXݿyG%8| 5 8qkKYpw.3b)${O)LZeE7O-J'e \~."|zi K< ."MNK Ӧves.7Cb|? !q$)$m۷Lj$l4)s"~I׮9}&[0U6'1m|vf8F4F8xNduDZ_D>$цz2vU"qx$e8.ckț'3a;t$F4ndd8׳sZ17-`NEXtp:b<(xڽ{y4Q6koGn{= ǁ0c8ƾg_gή-4!%VTJJr]Džۣf޲+bp2a˯dI E+p9.g].K\:[É 4>kf s]ixp>΍3 nB}yCd ۈ (((gRs{no*k:[(}a7v;@豔QZ!hKK1<n^;|<#ºy?9woo-/lG}+J||N?~0TR dQT$U_ӿ]cO~cg̥. 8xaHn^Zu{(YoR^%+ 0cg -vưu7<2)ȃ`_cܺбIQWVD)h bZhl 8! 31#'qƦ~/-4ߙx 8}a~~^ y$ױb4W^ky.uaTJ@1sn4E#<̻,J,|wu7ؒ܍{۸6c0-% o 7 77tS1{ݖ-]:ҩ?$ұBHwgYٝyOcmaD;%}-οFNQ.v6˃L;WFnm#KR.*pa,u[it=*4|\NK=EvGXlrB<).W|Fr]»=4|3GM}Mu0%xzh9u]]]/qg37飱B))ʏ԰-׻K4W|\˄+mwEǯ)BMrQJޑ-CwRs&2+~,^* ;}h–DB!B!B$㟡h-/{U}Ds9K׾*X=u,Ç@cl|k wy^ٓH$Xlsexk 1xklG ZVmqrCGFDQeճ{x 2HK6pZj9<t26#ZCՔ#wP:4"!AsU#M0y Bj=:]lj[i!B!8V?*1uH v*e۔յsx2x7^^mϾϮS]OǡZºe'ڭ;xgƎ,!/݇i|/7l`x{?$аwc׊Ӹ#6vUjܿ* Z4\_2[71[V>L(޺W;!D_qjvʡE "A9&]UUgnjZTfvo1C)*#+=O3Ekc=ai<oƍ*aPF7FM>nJYs ]{^ouM}q#_8qI^ϖkr0$QkKce3S:\ڴ?lSSOס][Yi7Ǵ~_| M`Ti9i>xBz-I#o{#VgMU^!NC{boua nz^u4%Z{Tv-%-J}n6^>^B' =Dvj*O,m| v#c?l*0r>9KFqBxޱ)S>F![),צMۍS' fۮn^э[\6# tpob/.6;]"FdS, *Z{Y޹DўeSɪh򕐧2BGS˖+TSh䒩S ۍta7`6;ADAu 25?:q:*e0Nj:r.]]c5K%}_ ^uG!B!B!DYp41n47SZZJn^-<@aa9Jax}ʱ$zu _E\b!%4WGiaY@J)\LX/o+M30ic;}3u<^]Ǵ0M㝖>{ʿ'r Y~\B[sǃ? fhq\Ժ($ol/>XQT{r!B!h5$QF|piAVX撈E$ 5p8Mh߇GSVXQiσ7 !\ yt>\DSw>7K.iH^ .V"JWu!pL9t_I\4dccF/m GT˿'mA w[j:,4d&ޟ} *㨪S#@LTߩB!B#3Jq_S]DǺE,ҕ4c؉plh<2߻űDw`g6E̓+]l3Fgu{{~y\;N똩Å8I,|2e/b-b#-#x?qH8Kǝ8.)%8/EMYq*߬/=q\r@pqHr !B!B!8sH2B!ePnr5^8dO#CB7OmL IDAT@EbiB!B!B!B.ZGvTbşYd;B!B!B!NW/BEmԪP`app0:P!B!B!B!ɶUOmU !B!B!B$_!ND?Sn9B!B!B!B!B!B!BqƑd|!B!B!B!B^oݑՄ*YB!B!B!B!N3.i&/>#hX!B!B8fJ^,_pDM7y-7tsN#N:x<ɋĿk;>n`y !_Ãm,B!B!NCڧ}I?\\l[` ,!B!BeuȉBBkt'y-3JpC4mX.NiLFggU'eH0Bvɫ!렟|-B!B!{I+!Ŀ+ixa"B!B!B!B!B!B!B!B$d|!B!B!B!B!B!B!B!"$ !B!B!B!B!B!B!B!IB!Y:Brp{#m8nrGz Sڢg+=@FV.)Aew495|ft5I. SI+\P5mB!B!B!B!B!B!B!:/6o1/(3nyWVlJ.|yOaYY-1(N7,71S.)%A9&p W?I@#q?ĂC1ɧ^&ѷR0c+ `GSϯU^?*`@,7B!B!B!B!B!B!B'eDnv*ƎĀI#sP>p+-vr1!XSYPᴖz m2E@J69>R<^ Qb!i-5ؑ(?JQrbJS߶ x hPFGQ\45<ϫ$$'FWp*|x>|tJ&f,'FySՍ8qτB!Bo+.0+m hRԬ<2uԶlRTK"M55BSPD~Av3ޔLI3|!iO>?f$B$a5! `81B~FP2(]5z+ן_F)R=V ]3B(|:X3d * /+& w`oIDhmh#BB 2tWRx< MK]!B>4&2ZJBU:F19*BYE_)!B!B!G`7a+/b"2^4עo<ͣO/<7)5d&? xp+/='T nl7Kši|F1iX!cWt54۟Q:8~\D Wx*Ď-qw/PJGdqN*J..rqcܘ_4tH,B!BnR͇?vM*!oQ+xiA:Oئs\!n|KϰoP ۹d\X'u_]G>UWmWbHN%>^S'^M}e?yi$Sv- RPɗ?߿P6CO)7q%SP߭!$emCgv}e9^EKaXՋ/Q9NTg_auhǖCo"$Z:\52$TD}y?fyO0۹ug1T˳8lf>ryfxHW}Iw>Ϥg-N]!Mϣ(/YKEcR! M/aLef`@H¯ (uʩB&h# N JK*Hg4nV- Sx3 {b!jMe,U<ˉB!B!BqZd32LQdtR} 5a3{6~4)|QF+X}6 ^ͪը ;z:l|.~M:Iٷi* e(ne .F 85؝'d4ڽ65UN]XRf1Nfy׵LvW*V-k(AhaB!B!O,>}u_uux3kj(}ﻚecaOS;+̘9|ٳc0Uqjop(dy\L>P|x19;7oqg{#xY~Ol$}L6h`ʖ΃W'y)#X|=|姡)c6Vdϼ{>r~O^bmwTϛўCE; 0 8)tGJj h2r)IS\yL#mgƵ=Hܓø9$ƍ.&{HK>myӹGxs*錛~.} ˴$pln*ʟ{Wk GW.ū_\OA`6٩:f~]%\j`qNF֧c,*P^!>R)\2 jb=|Ş\Oek(5KS/guj2c HmOB~@̅ɄoRm?'+?^%:BOJ#MrrB!B!B'x8c"TޚS9?,/ѦJ?Dk?I=x(#K Ht5p.h)ZJ~N}{+0}K fQ:r$iP}9eL^#X0#  5o^]'%?KPmҰw u~]GR~=3οyW5M*E_ W /ɿ;a5dN!%J溸gfL:ZZα1J4/i4pg4qO8!-{tkljpLm}dgq!:B]ՋR ݛNfF:'L[[I˟>(N8{)M).iv^%$]K%#- =t߁NgUSS{ 2n‚^;B!B!8 f\~5fr@ O{o7fgpzq]Q?~][Uudp-c:=ny7/xS Ɠ47 ևo!?"xd^f,#Qcr= /neixl*bs8>xl?N|Ф†>܍ÂoOc^x t͙?/Lt&ʚ\?;^Hly2bE3f?H^`}p^}m'1kdsܐ|/:x̸|iVf yW E+,o~Mo}v/[oh#fBpx,YSɋ-#b7ן 7>5oȩ(^w.f7ğ?w)_4pK#%}{?q)#6ྯ+dTsyW !8-?Բ<b&'*@P(*~jP?)X(Ϣ&$jen# 7L QB3[O!B!B!D2E`< uTr>:~Ϸ7A'8 :`Ӿ ~??C(o&c^'V+dwpxM44@iN4YtiƑܫHfWi3s|ޛ.Ʃ2?,:ږ|S|nb Qv ~#S/|N=/؎vrM6>W6qLnq5ϼzȡhp!~h]_~'a|-˟bM]/xB\;Y^FG]tC0˘5v():8K"Tκuk1%+TNР'i ;\:yTRRIKM4&K~rѲJN7^?{OҌT Mcypup{V#2pp礣 AFNp{1F@ !Q֒\B!B!=w3&!Z<;m2?;_-Pkm{sZ^?1N&A:D.'ͫӼew:ؼi/7bf:dCN;:q.b|Tq-2-p߳2;KJJ'J[I ڏ |>><6’_'*_bZ%17#cj.Pb sHUǗ4 S9<2'trϚ̜7?;0p^{x-y1SҬy Jr~$ 2M^OYѓ`6my?5w^/V=B?HVAFs mc֮q #QO_d/?GqU V13]ny#HSF /<_ l`F87cɏ9BQ82@CGbsjH>ņ.Z+KrY10|lIh3^AsjA'.$jYihn{.VfgM?1&YKQAh \8?y]CKwe?{w\3$-/–]Ԅ w,.x:x˗tO> <5;xel=f&.><>c;C؀h\?ʧ䧞<|UNH9>{e{)/ =BwDt􆸮C"uu\\ZA1C}:;ߚźWVq->{2~xGTĆx-iT2 1&; 0R_+w%H :6w_K9\uL΃-쭭?g-ּ\|16ubYa:#Y٤SPp.%3qPDUi͖69 @ 1t 9R7 ) 7i¶:K.cG~{k0@d>ˮs{hChdW"I֋PvZ1B1B]8CJ 7БѢ\`D Hy};| ._`Fu:ZIb/ցܮ.܄JBVaL< {:ޅB!B!H+,0kkln;t啴ϛ¬x .X 9D(a1,JRr-G2dp>EUYUwGapbq,GNK#%O3HBoO-A`Ik[uDXw֚(kx;A jxרp^4\w+~3j/ o2}\ >FW ]N$S݃G8'Z!i>:64"= Qo5|Xn 5ܾR22t: "v H h9 Qkw Ui9CYE9^-;~ï\xKI8h5ﳭN@ekPc;Y* ݮ鎷Pt24T)EinhEN;v>:>-<-i't^4 Fp]u(Me11pn=[HZ+b%j7 vjhwbTxIs2H$;4[Mt&iiM::Z\iOB!B!'Iy(5m|dá.W^¼xdU͑6d*0o[(_ KK=2/ُ`,Ísh F}-^x?׾x7$ѹW{k/ݿoo .`Ċtr}"2ڶ/T-a鶻Wo>̾"(Fk;}W.yPƞ\s-4Oe!ĩd|q ÛرDZߦ R(J,LB"7/{#"{s߇R2ll'f)h:opΝ\gXIu (iŜ}M\1sO&bikmANz0L-^ɨIͬ6Nvvh~"Juzp]Q+ /,2Wq(K\6s4gUqݗTiR{Evw`I-f۸|D|8o1G@wleE-n,~K4/"s| ISadMfKjٰI^۴Hw7s,_ Ì2Vls)IXh))4Z*K<܄2-%B!B"+3=5I]v tE39"E婷7hYspX'*{FvϮ/\j6L[WOŭXƯzl۴PM׺ \l3ø貋ʏَh$2o!v*4& f̸4ŒuHsGZ Ukl\ËO(4݃GI6NKoi5|o4Y>m 6Ng 1̽h,\FGԯIxɘ{X|!@=o;03J8nҠ6M0 ǧ؉K.f<2.+@f$+NC;Ĭ0q@:Șt)sWY;o!&芤3bLemc /-Q1kR[Y{i;q\0gubWcv4um/8)|(8~RS0p.jaVN6>0q!6-yM`Ruv/fD rtBYоccO">a+eirؿ"+;Tj"}]f,DNQ/m3`~ϊ6S!;.x:Eneֱio3`آ`SJ|1~ 銆@' N!̀D6/e:bK,tx0/%c]R[I.b-L3qg12]mDdS*s&1o|J lEޝI5ypg8ݴK2Z& 7C_pG 䭭kН`jƎʹ{ϋuøIAIɗ21ǡnjVlAsh`V}/WcʨK))Š]tv  n' nTZ3aV Y&U!B!'bkCXvr;E h'IȞ!>v <«kk8 nh7O~z=CF C[/uO-͸rL :*ΆSg?7Z^/EIh?Ͼw*4)^o>|3wtul[:/ػLaQ؅=a~Ei>A.Gțu7dݟ=7ǰoAŌ;J#o4NLZ]h6 f\'.ChqW .(uGBNYf Ky xDz@/Mc<4Ɨ`yWfUI !D/ ]0.S]n:c3( i,-N3S&SOA 1?t); c8c}ev\"v V;cǎ&=g-%[o ?rcw 8>F{ М2vEL`[g6rlIjxcF>s ͱu>$b9.klneBF'03qs+╄{h6)1 }9DELo14;ݓ Nt?%Cjfao4TB ɛQkGC1 d)`լV:AL>J>y9(UZv t׋44ԑ$3Cew<#t!B!B!8)OY#1SQUCg&QJZ(-BNN]srLFahZI V^Vur)Lc麁'@E9 hB,4!G?lL+NwqE֠<TV;YǚsG0v\ @$n9C,n^<[0y# !y/zQ{p -ߞg_{۲'^-g-"RՉ7w/[ u]D&z&-(&[DvNWuL,J0iR*AN5FʨI jjI,0?Tr3誙w%TE]Q&x<^4 mxZtv4Pԁky񀦁NT:# 1-:" !'=Tt Xe^`rIl gt!B!BdJ=C´g4-l%V^:KZZil6R(6^ɬ3X3ӛ䴱mZ]m7L8\C eyּ·_ rcz-nJ.?y+~2Ӣ8/e/ qn6|rJ2MPֲwсH66/@eS~ǗL/yzM!Ɉ UwRmĂfXLAg'p1:2?W~fO[ɟ{3}t亚^ BW4t]).nj r&q /(ۦڳ@ѓrX/ˇӹu~Rvv`a)e°Xpu,|~Kv5S}:˭ί=GSfBqB:> #iPHJD]OO^`T.Y1iQdvDKOBOT\rgdU.!_H5(VpO>XYO2Iu|\&{R\N{2J7PSD->7st":hʃއKi`G 1nd ʬQgPbnVvlu 9;sz&0xO"F67Pfu<ٴ+y)3; =.FjP)_`_s E3}Cݼ~28  8S?a4y+'}N 7L79ߦOG6}(CuRB!B!Bn/"I{"4&-թ:n.M Cs;ҼMoN['{SdOYNOuh$LPRR08v]5yn%xvw) 0q;i3@J{Q(#!Șh Ym:-?{e^ ^" PyFMN=s Ҩ5"U=5Us.go?Nw N/48 I2voG7uz kwnE>NXF3\85Wܷ/'x9i ݡC{P? x3H`2xh*N& )`܄f=[Wmcs(- EEK졹gGc合EIK!K+(Df{0 (.'2-BŨWPq}ȟ4Wrq.C6W p!B!B]ca; ])T5 ulafx/s׫8^>? TZM/2^7nkzp]"O6{i*V?w_?-RfW%xk kw3qڴqA ̉gfӨM:e0MrB~5+=t_k^QZf/Қ}F<竝4sgMM>m"{H~[E^e鍦Ae1K9F)ojTiW~c¥|ɨ/~c;{VuE ~k"ej'.N* .'Kc !N.Q6"EG$lq0={*SH_ge28`p S>hSZN}* iOnM5jZ6QgC.:I '٩8X$3+qlNu8{JtVٿ3~ǘA- zF\(?nzUϦz3Ow14Kw1sjhIy0PؤHR\0cZJW)jkiPL4-ӞZCo B!B!xдY:Px"yH^Nx~ڿ@tH: u` -ce,=7c<vX-~+:.Zwmƚ̿Ǚly4PIRD´h%3~BK@Z)*B{ybKX:V*^ZzOrcqpRl|\οxӆbԳnw] F}okyo)LʦssDIK|}=4=4+N('?h! Ki,sZ@5?_c ؽY^EriN97/w,ux}gEcsRi9^,!Iá׊_;M'II%c~,ʡ=0 BdMQJ@xc3EN̢UNJIvp\ki6IThfaSn;~!G+D'[y00j)_&3¤+5z)Eީ,\Y&r/ۉٿN{ c8=w?Rq _U|my5ZCqd$4ycoʒ(~k|D+ɾ5Kgٓ08{ڒLLH9i\˯l%6C(pVyKrtLC( 6<"Kl{!rqz0p=v]g{h=< +=Z:JW(C]B!B! pP(زR. \O˦ 'EMcېA)@WnQkC }t՟ljo̹я5lRML\945PiDuه!C4"+NjF;$i*-A 8Ŝ15LXv bivWh'!7o‹+ɘ[l:^~Wp"c\ٓߛn{E֩K#uXQq;Έn3zYX |.Th ˲-^n׉>/NI)-˃7wg?c3\;L_2o2ן[†_ڢ r=tPߜ9NhyfNX fϜK|<|1'd=xt aŐCId5tc6P:#ss/n%fC"ݟ p5ɔ$(RʒA}Iţq,#\4o Ρ2'K_scoO,J"p47\4 K5+N v/zy.N_D9I~W#a:(??# xL$N iZ8\!k !K>r[4}h}omXz75t&3-i2wEQFqR* ,@E11FDY\jx'd7=4{:|!Iq5:B!B!8l+Bw(2.Y(b$p9(N)Pm3ELQ"nZviG-o~^vs]K ohDZ/%xw|thvh+|&2SF#Fmli߽Mcxmk_~J"ݜuי6s˛f_pC: ĘTF׋B k vȂ '+S0t>}X2:γwzjǒH\7]yI=^mfᴩvɛ}igqEg3ex>s_3畳?g_ jVmaR sǓ}Pqoѳ=" 'AVS9-W |]68QZZ:I匫0@V!!ϥ,r<: ރ2< z\UwB2}+h_6lZkjITVf).0[kDq)q%OefJwS1e!_|FV P9v$C+O!.=-ۨI(b9W%@RbIO*" oF)U&$ Z8F ?G nd]y^Ja{FV;5dd_, 멶 F{fQt2FƑO#]EQIZ< ב9N/hRUYo#"B!B!;eqR؟2eUPVh$;TS6b 1fv%TUѝju >M}M$+U裿:(ǒ7;e懿~=ӵ_GGuz1jH [w;$ز~wQ/ ?ELc}eOŇoìHE0̌z7K+L{^z PKQX1spi}~ZBCx[<9Cqn>e(`bXx=۶Ӗxk!śoBqޅX1+QJw4y-K`#!pm%pDBʹ|*ry N)6</^qhC98DD"Ne+[v` Q32_ ;뛉Y. *&0nhh'ec84dQS4_>KC Ld+?}nh7iFNFyNjǓˈE"kb.^revS^,GqxN=L6yoku}ɓ@m>??;xulp%h_u77rkc}vѕ0[}۱[H.l#=q?ww V+aMYFCuf'SGS{є'9~m'33O;J5ig.Cej ,q_p>_lz^ho+YUA˘KkJqBiX&RU獇}Dk g`F6oKݵ 'Lʷ('b)6)p&"r *!8NE{j RxQ2<8N iZi5ѮŮ V{͞焓I6#\cԢl1p)4f3:\d VvwF'YZ9jvC3}* ?WX؁m* b4:0)|yTdR6=y3G1О^K` H?l,,FWJAW?nѶ)r)7 1>JU1RB!B!B?v*ADLa*lJndMtF}sܽ}^r rWNfT:yeMXCo _(pp>Wp3caUgr07˖z5aM嵴lFu Hwq{R!vH2Ip3id SȨY\H:Vװ7LRslSzeuQK&2˙T0\\n4+#Ncynπd|Ҵ%wrڼE:lMIL8JǥC՝}'AHhzU>Zg;m1/a)u0 (Ι%1MLѱ ;Eg*{F#qy̘~&'06|m,\PN ;)B+*B5 ?[7 paJüEUfL~d|}9y}tMaTyiҖjesKw(5G"-̛)33itq{z]娏r8]؃?fQn7ʥA*ՅB!B!޽~ȍ_p@dyV"s(*@cs(إ81,x}z5''_H/IKQ,7 fk9U[w=zw?n*'It\B¯c\V+N6qiY4,,-C9>>6qbOˣ@ŰdxQ)J\cnaUrN;ג%\lwn{PqV&Ϳ3|WMomuE it=a'NNi.xUnbVv+=q+bXRLh% !B!Bq4+AˎXv&>v Ӂ9|x[yN:SWrG&ҽ)t]-xnmg_]ʞ{cUp%V~ 9(Nd_c'k'SN?3g 160|e,>w~%5^`w0vLCgʕijםMIx5wS;OYUkKu)'j/T&B1}!4I|@L6I%1bNjQRßV"Bx-1f2$Ìlk=HWwބTxO)2n?Yl܃542s㤣z: ǢcQb;@v t~II3sx](+NO(B?HNn~HDI@adegz GcAw?+P_n| J(A7ôb^~HXjMwм& ݃OmI?ry;%%m9d=t! hhE!N8J_@ɰ1.ƊtX@sGb{)?iU7Pr\䕗>m&u T< VYB!BSsn]E+)&וDˣ|8&ToHBV#?AK9+݅?+ܜ|J *(F7ۚij &<0tecg1}n_r ݗCQA.DMo<rr8].b/{9rI7`oRO"g/SC'z3\̱>cWSdQC~I9ey HF:innɃ.~:U>~8y^hOMttF-.&ϝ9xuכKiX&*$^tr=iNYy%YYY]575QVVFcc}fN 8c.s& '?S_ɂ]݄zٸb5[낤Äs'J6}NB:UOabwV4S>cTƶ&qfT[Kon O[-|WA\9}&yjtY`8U,2Kzұ:Kqs} 3}PF.@"Oz~f}FC"m:,.9MJS:HR(2*(sP& =CXs_fwLϰ"Qld3{K-""ĜQB!B!xThtA+ao7.۲7.dg08ͪܵ *0?KZl@q>?Gu+XKi̙5e|bS -̫ȭ h뉡 9i:NC~z/-R6ŋo硟^I`8!yf;?<.sEetvŌ2SRbO߽?^ȼ1|/pa)~poX_V9,>y _ؓ:^5=)?{ C惉wq1cR]`G_{ؾy TdI:8;ž']wJ2cHBt3{a`{[ıRD#A̞q0SQz:y~C~3 i$E2ٖ!Ս=&̀\!pHǺ8sRD88mv%p4TN.Z+r E q+!B!B1J  P1Jм w lMROX BVBVjweI4{Ywqgfq4Ph(Hsu GZbұz#kV9.OƊ5>mS? vzN> \G1Sؑ\+^&z/c|&j v%ֲ)$VP8i9Xl2 UFgmW>˪!H\ vV`45\uċMQy3ȢȢSﴳ+#vZxoD}K8= z%x#[B3FV T^PVAVm,R+B!B!0x;<_8V~B.рtgk~sK4Ӝѷurg|oqW0cŨ[rs_Baf7dɜ\pػSI~w_YX@[LPٔ@=0ix%Ћqg![8l}~3". Ϫ0;eb?rD|!޶CG iYN*dĈ vRweefn~R*4x!~ZcTt_ f;f0 %?<9ǠXjzGw|ǡ] ر#B!B]: !x#rN#& ^S^yU1 jב{^zK" !B!Pqe(p (&@ֆF[:gu۩:tMi:E(/j3LlKÓOII>7v2Bg[ <V$ۍAO4_[i^Uehm J*ǁƌKun|s`};R8B+;Y] Vג ؑc(H`%qM0NBB!B!B!в/BKfa8VpG#̞8M{BB񾱜^L >lRNqyp0^:)$;@dc" Y&!B!B!vRWݙ|0 ݙ9Ep{fO&do' GxNٰꎝ~G=&8,IBY s{srd8N8Whm&B!B!B!B1!ϫ]ϾJp !B!B!&Bq{im!B!B!B!B!x_9&_⮎i:)TB!B!B!>$_!B!B!B!B!x_!ؒ.B!B!B$)x3OJ=Q*B!B!>, <B#.l"d Ql8p !B!B!B!='r PJlKB!B!ĉHF9Ɠ7 \/hZ$B!B!B!$B!B!B!B!\"l*1,qd7[BlJ>B!B!ĠiLWBRZfoX!B!B!B!B!B!B!B! B!B!B!B!B!B!B!B!DIB!B!B!B!B!B!B!B!2H2B!B!B!B!B!B!B!Bl' wv!U#GPQen4137TM`\U!F;wv2B!B!B!B!B!B!B!Br* IDAT$㟴\򙛹A8VWc.ά§:pV!B!B!B!B!B!B!B!NT=y{|ڪ_Ui A0w!gf.VᗿƩiv.V"3˒YjB!B!B!B!̿Ih6!fEd/' A@t'7zd%֡{^4<8evBEC88$`fnz}( `&3n4(\(!ݿ}:sRr]c8O$f+;o.^G`˧ NEyc ]q);6IiAA0-gxiWz7<,B!B! ')+~uشb=iǞ|~y_4f`3դ)?&nfoΰ (m6x3g mM !B!B!B!x)ÍPX$;p{ dx/$E!N*i;J [ˢUA~MܡE%lEP CU><>(7%hx$qvB<JWh(/sP¢o8QV:):Hzfsq"&:B1+%pPZ.e.GJݕ ëV'}ԥi;s,V \ʅO˧@qSAazVfB!B!Bw$㟬ν+yjofFn)QR%udy 5},q]~*- Eh!B!B!B!ʝq0ԩT,6. >k g`,&(#lb浼b I+BL@a(W1enz^bPqin h"Ḣ\, 0a5T67hC줨ƍ)*#v7;I""-,9iK7I}>E'U>F:T3v:qT#f%dh f[inl;NgZS0/0IЌtɌ&\ϫJdž,ptBT>Ou/(RY es27qngUl#azn ;|hJꆳQMNin9/M˼[eQx16S 2ay0&T!:eͱox_”s &jst@oԄ%~\r.5v_$|?2!.7#olM,eBMF:SǞ;Ɣu"I'#g͓ߙL sˮұ%A:128*Ɔsaم\HƼ-)R6{JO71 #ŕ'1ƗT/""""""""""'Oa|-~rXTaBKxsݸDƍօ&"8*>xݕL=?n:nCw*{|&L #%,G 0$c_r1BN?yR)Jq">jBK8?2ă<:n/?xa|6YG[gd7}m)avz)ݏqCcT0ΔOwSdTly[x#Li厃7O8AP]RNi@ """"""""""""""o^VoY6g/yS拪9.қP;&DJxFv{q|!\/K*{[ 431.=sSwC OƾKc\dr|b`{7ll -^h9cq,Y u8'S4kʹѸȓ|p$0󄍳$9x!ͮ >r>`|x zNq\1 8@[Xz 8aJ jaQŇa C[de_fmiG3&@Up#  4t{e[b2= R&ǹYqøg㴧76C}NsJgQx2UNCc9$f̭}-<96[2*o?AWT1.8:!ӝk5-%$i*.L<]^MX~jxƩdzx!sBcppY|,{7W]ϰrgwq4ɎiP gB\t_; G+I8RFY9Ϗˎ?P1>\RDDDDDDDDDDDDDDY zo顿LsNCÊKr٣Mt5T9^1!=#Bơ|23&Kd~y|߾ϖѣr T7;=ݬեEg2W~! 9"Y:jsؚ.sr:17ɜ宎ig a|CQB ׄ)ԦyȦT# 2$Nޣ<:Q. !*G'Sᅥ*\v?GmI @AƖ\eʆy aF%bB?}8քVRJ& 9HMҗ:TSvUDڑهXQbtISYV1_㞧i;{pk y6"G88(]i}s=,q^jy?ٞjcqdc39n/6|1S ]Zd0+YGl1L gQɘQzJ#Jt[ X/moo?!>+k#;;Nj 9+rF:q|@8J݄,Fn|e9WOˑ ܽ^""'Tfv*^HP4Q[`z#Zwq |sgriŵ, -{J's;Ga2<6A^QpHДr 3$$)^C:tvk*8drR{]pi 3CユK&Eo\_ֶㄭYyeIa?ߤN=f.^ <ģ] T/Mdb\"S%G0]%\:{L5˪?~C[j e.!Uշ$t!}#SʄX: /սR>O2'L?bI-5]<׷M*di0Kz$s)Qz2bUӿC ,ʫ8;| ו5֡sAV {jEhM>̏{7_ܡX!Ǝ ?'/~a7<}?SM,_D""""""""""Ea3eR2ja lk<_x埱G}y%.2r㑋3}2""""""""""""""Ne#RKgS&>Z>v\ {}$ZV:4?ÒH;yo۝X kĜcWɒH;7ғ|Q] wG~ؑҽm95\+XMv^ֶ%^TaCrsU N 9NZN!CK *NI+G5*&㧀Gbl>~e3  3CgERtBocOy̼^w373\6~fZ>?!` I>K_p}gqiLfSf`x k;SBw2?teX V"sXۿW^%cZ{u8B^U^̸x+ś[fӭ@< 1KX1'?7}C42 kfTSﯣ98W @0uŬ.bć5&@qkLf6o?>\!cfQ^n3{fm-~wc|'>"?{'rS#~'q~_q!"X I[Hg}L/U#T9 I:n)3W\ŵLor6<|`  2u|*=ǎ[S(sw's,jbr1{V%fKPkQFC>J)} dVh2u('8N%CiXX ..sL.Om _ eȲ͑K4k% L$b)&&@p͐\ P;oS`SͿ;rӹcY~-O8D-8 Jb᳹b"M4f'B8T;GJ}.pB@5C$+*v rRY. + r8͙Ϻc,DR,BȲLblţ`^kO4w!K/ⲥX>kgMGFDDDDDDDDDDFS }v];ҙ}A=X=ntz~=\~nt;1o+t?ͪuo[""""""""""""""b2Ly\uULK?|-<~|BL&;t٥c tv9Nm_h  O/?vjG^oRD,.>b'XjJ\z1X@ùv6C4}eaPOE&L-iijơ0#!, a +2iYL8$<\j s0,?q  IP40i~L;_ .ŪGY[(|pz*Jpvh![:Kcf%F_w a9?Ro|#i|N^\q~IԸ 5Lp2 #GΑAl#C3RJMSfIzѿ+ +P`Po72οw<q؃yy- 㟡%S^+w@K7)fвyeSwmp5?eW}ԾvRoȗGMSN^M`N|Ώ\_5<;04x%c3X Γ^fI{`O?ã|_{mpR[3}ϑ %gn'cs0%И`P#HH߀;?7q2cR kslo/2e_GqwAdDDDDDDDDDDގ?Cl|fnXeg-u=op׏gۆnV}qgo,鎭7OVWEDDDDDDDDDDDDDyv ,u?Ol=y䞴`ٓI綠w(xrǎ!lv?= ]q2 j}ll.n!":,[K08Z'LPC[J6SE]C)$SaL@p1ӽ dhp1>q1Bˆ%XÃ2 -CM1PIilDO$ܹozhK?ğEĿm|G#]l}?ĸ,i,`vg >Mi_ %j|UTqאX g8YCsWh#w >rlX!N֌3<9[CfO?LS#ޯo 5bE/j37@_>?2c |n/?r}??BDDDDDDDDDL0*no|GRND_'-d_K>C4n5cghm&=EDDDDDDDDDDDDDd}1^F\-œ u o纳3~h{ؽqݟEÒ9oBKR$rN-oI\5a0DM2X6O+p0fYgR, Y&EA,,1Q66&ڇPc'Nϰ,@?KM`͓"36 a s2Dyj`ćYl!ˡOÝ5L漊٤h+<:*f&l3ZF'63b79ّ"nsX|&LU`2N]gh /xl:7Nʛ_@n-.SF}p 4ap}k<K"U1^W ۲ bfb,/YavG !gSd#m=.P!%Hy`>xmk[R_ ?C+V360 `dz ,^ڼg!c5~\l(tqhjmDDDDDDDDDD4)/"""""""""""""""̔゛?ȭ$)~jo)IP}ǵM~C͸Zm}g (Hu*.?C|i-tt~ʫkv?#qR;|wpE+翟2葉EDNdg1"8'<巰Hyy q @*c;'qHBsKB T9AN"d )(9^M.ݏh8̌\Ēx"N tB\V9&eHd'}[Z[[؄Δs.aʍext~%$7/uϘ!@]6Oͣ t$? eN5)oc^,{?6%|ĔbpqeQk{( cEx)Ix DHp( x&&y,^<.!7J9Q;$x^̒[q+˼$ /%@č`&Or04O_˵8u4Zؖʹe\^ 4$FmK#c%y-xTʹ6G |+Ye敮dA$h\.]y /MO ~9ĨS \μ ߉>z^;JDDDDDDDDDD ㋈ȩiٳ 8u^?bGCa@gضfM'{Zٻ}mN+x]cB*בH>³e~s[88_al2$Gl 3~7mc{⏒MaƏGK0ma/"y(/"""""""""""""""&tqͫ,7hˬ l*I*w-0peV`Psd3ccC 9ϤHgx""rҬp%Z.~1qðOsj3'gsCz#Q#KOf= PlKUo YY/xMPM8,xXάnh#EMw9/ ,Xq8Ǖ=v|Ə8,%kwem~sGfGlN:3{,yr+lb F6G^$V*ttDgKc\ƐF!W`OƏ@[sИDcq)*x4pظ$>EDDDDDDDDDDDDDDr9cG.$w !S%/XDa)MgO9rx2X2XNul<·=͐?Z l);YGSr](s+U1/C!A{Nųy6_\!""""""""""oEDDDDDDDDDDDDDDDDDD #Y#Yr""""""""""rQγ)%5>>,""""""""oN2袎oKICPu-#p5+P{"t 8:DDDDDDDDDDDDDDDIzi&OaDEDDDDDDDDD!wGqIk5'EDDmϣ7,e_1jyQ_DDDDDDDDDDDDDD-ɛ`N8i`6LXDh9 D= ߹|!Cܗ).71%N0[ϧMP%3kfg⪓2|~:ӭU"6T R%+X[\"4VOY̿p!' 1z[ٹiv6'9/S9#+<-ؓ4֒QHs.YYS a i4mx[S5\V,HvSwW2gJvofSx uSb񘶗xvgyoh9Gj,g-Xalb&zsuN{v5/7g({|dB$t|a*+^]~^szKncӻ zv?xHTXO UkرCh$rc:x00fƊ˩`̤r>hOxf<"5W(ifݽ?Z2?ZB6MX2}`.8ޠ"""""""""g0'XYpݕ䒤rP0lz_k@4V^nUIq)kX~,9?9wsx)X^O|0KpGoF3osV B]7g(㆘h%'x¶=&1f-zmȣf0D}Z UJyN%Nis c x L$0̯R G bG_[PdLSq~#ʝA!^~hzupyyqK&rޅ7!ˆe޽t'DjfOacm|'IMg颅'c/x%Zw/|5t^šKԫB@O\-7]KC۞`SsWSʺwne·o$?na̵g{Wy*;m-ϲnfŸ/-{ЕQR5sWŗw:Wәwi~O_R@4o%X6OkN)/%lǛSܴy#LDuYz/ܽ""""""""""""""""o{^D\/|qyo#.Z%Rus0Dyr?%U~ ׎XW^ǤYS E'Q0kƲປ%jmIZ˚Eyhef0ktƎ"Rxy2~˴F8]&Xθs9w25|#svoOw8pCr SaʴBIbݝ$3EO?񓙱p6PRK'omfߦ4#wʎ?{9]\{q CKj1/&wc dCj:Y@UѷL7j'ڶc9g3ej ˑ饗ؽԉJ%# 0-ra|VC];F5y gcî ]psֳ'KUݟ?<=8ε|nƒhh~-;&g9s)ʟ9:w=̽Dӓ p5po']9"n!PθI3hl[>̢ESm~A&w#/$V.Ⱥ'}еmg=TK.ut pKԫkO1GF58) 2a-tTvm›(c&ͤ.n8Yd #slޗy]7Nk\;!ذ!o3?1ลTSh'?у"""""""""""o 㟩Gk[+@c\% $6Goj'c-{4sƗ7!0%7ie>|~?>Taenk}x'O cοo<k)-q%S 4{CnX\s5\2!]$r~"U/\ٛᱟ>ĨkYb:ե>e {5`It=27PBoR{)[udn!cUЌ RZYh&La|䫍 8=ϡr/Cww3݃)[+5We%/y&'%\[oUφA5vѨ0>U &xm;HkGU}=%5s8_"Cܲ1Lmhp""`\᱌h Hqx'!RH)Kv 3-yK񍿆 Ȧ;hhe0~fqBTVL&$zvk2D+pv js0Ҳ)̞ZMbO`X"""""""""""oM 1|/F~`T#M @9NeI6n:g8˄g^-ɶ,[v'BzB* B] ,,[ʻ`i nBdH!:qܻe˶zͼE>;$r+W癙s49~19rw?H.VAvY]]̼FIa+΁YofڲzR{y=DPOcɍײtU7{>Dbf"/5膂fᩩ$i[9Z_C8C{r.$}ο(ǫ4GyWTbM3r n~`udT{1UD6)6^w|+`=ޏxpsw)v%f\fWۙ9ԞTcej+5_*:IӅFyչpY99L  5TU/k <).s{XTB!B!Bc3Z:o޿JTn7{mNoM-bʔ ju?:w"LxʪZLrt=*kh@[/3wV GGFX0Lv _$j( 7TNMLٞƹ|8/s䱟18D,f8v+TlE,f>k_i0Q|E\`w_/o=1\t_!)|b< _w,.ϳygἃgs|:Ow wB(*`{* g((=rTb,OkݯPighPyTE wdۤx)w9QzQt]!&AӅ9ð-Lط ~**G1'r.|_`!B!B!$'g:]'ILɧ3HML]Kz|$_@D&SvJvs3vW /OL̆ JkTW5ZHзc [^p7hyu-6#=VFYT V[0nSWCQJT k[4PUHedO1j u.%wb.qYN`s:;(dmvzB!B!8JqյiQ>ֶ-f92$DL6E,d4de şf[XXziV>qJl߽A}|<|׿uE$>F_t.EW.}_Sɴkȿ~r._'w?#NM9\~͝\٘G5gU,\amʟ`C(`-^-{Kk`Ҍ~=J lkoT w֧yKXFjlg񅋧пm;?\Ε+6rd슿6JKm4yw-[f-^[? } 7}sVp/`YcEQQ5# ";_;AIf^OF_u+Zy!Rf!(qnkK D >eT+.[N يjdIga1Iٍ͚b d':)vaQuAb,RpZP,5qW9 C1[+%@_Pv_b)kwn3ȧ}:6{v6M%KRG4y!2\v/N$Th*B"7vVND.%}`6{]8dvL4zi&)pFhuPf-fbI grXm;k \hbH:A1ŌVn#M8'_c*Α͝B!B!B نg8=<{bVpݭɯ4վ=>)Ed6c2iL|7Ίj`t `:%ʒσi;j]fk@3싃tnس8}x"ٱA1;)^1Nt(N~nU7QT:p4'J!~PtX)  !B!B!2yq_疲 wϟOflb*gqy7q%w2O~[6'HO՜L[|3&}uFK,_YOrǟ#i-ף4A-ϳe֌iZwOϳ*w.W|JZ^CCJyurR[S1j\1~S]ɷ:Meq' [G:ٹprUեxB1wV9j͈30iXmhzg7p94UΠ|%sh'm#C (m54O[K?vJOH!,i>e۟$6Aӂ#fjR &+YyT[wL\)f޹U7jBSMAri^q3l\.4@Q u?+c̤j d\  :2†f,6vuo'3MM,(#־3Mx FD&N i0X4HgXܳi.EOpzj¤j+lXir6 .' )ְu`3%U9jȐA#M !US`,ZTWPCNB!B!B!N3t4,L @K5FG!CuL&Lfba f MSbl1Mn 6oe4.+bl|N 606,,dl IuQ?ɉ1tIrdȒMI=#8s ΛB!B!sbn׸}Y{w=,I#)R(@7]=U |M wGvogFbЃ5PiN3NOx`V2lPQ(,?ma3jd*tNM!B!B!8H2s{LZi(⴫ S) OJQAU |ۼCxhT &nV@F@h۶{.[/cEgsSX\:@h$}(k2y`7&=iRPquǤI(PDW!B!B*YǾ/zPabбe#t}d72fYZ_EM0Ci0Vf]iХq͎yK KL@Ӽznpޗ>y!& s=;&gkxVͤ\ˢ21;hG w+%8+^B9ir`B GFHTRU65̥T{ƥ@^r׳t gS@>3DKN2˨dHfFtj"M5؜MԤz&ݱTՄj jfrVZЗH( RYHEpxtPGށ~3J7@2uq ??DdQ]Ez.NZ \NNL#VLgfNƥn`CU ;9|}ct \(É"I&GvB!B!B!N'2ۧZn+9Q4{o.BMBd?-[8{Tj<6hbrP6oGNAr}v1gr.U /{ %\bdCǑ=p;i;H$OBIt]!"#AL=s]w=T'I8}(ᨬgD6m@ohDxRyPPAB'\:|.p_c(qi/OQum' 8`3qgmbXV& &1)B!B!i@s[GWLgԡl 6_6ֵ :*`gE_3Z;;(S~߾JP)qOشo} <֚&;qj/{io!s:$̨0Io S7~IC__$/#]k [G)5OdֲuY7/-+b_ׯ%dwG\S4 oId\z>_~`4IJ 8gsxәY3]q*`1+z|3˗Qz;~h+*,/;\4E'=uz9LqMeQ*(Ikf̪N^2BM'ƣ =#Ie3^bTlpSg%2L(v1=O,JbrPiQ #4ɥ K%lnu<;%UNĪv!sW0G'Oƈ d44U𗋑#>_&Ξ]YH7]oa2">t5N7ae͔Σi'/K$_ #7L_$:~~A"?VH"CC!B!B!8=l%qѬ\swhwxքf5L pӛ O⤖cx q#s8=.n"6#Qb~v=[I`dygw-,^^Xva)8a!Z a :ak1@OCߡ B!B!Nӂ+jrJmYy1m<]'[?&@w;ÑXKq6K^㑧a}_rtWcaUWbV +.6CL`w??,0X?1cwhj^!wǺMxsûŖ] bԲj7#S?z`EZ1:\[E9E&lރ{xʇ0if\%^r7p,|癎[EY!I͆niT*9RI 0R2:`1ƴ',r6}oAP*ƪⴧY1|l; j^EU'70UͧvNX#B0~#(=O^ϒGGI}{V0[k+wM51ÖJۘRHr(Kk3 ׏qY0 "3aL&](B!B!B6$ M܅rS+N+BU 8-<›/<ɓ/m/>IHne#+P n3w!2it{i=V-҅Ť6D{NP IDATT6J> J 3xdۙ9cNKgRZe5Hg]l~i#}V0:֭MSښb6n ӵq/mocRg.NkO@VCSc%N ޹ޝjyzRpa䥉?xwfZpӰVPLXv4%O*& ?zlb1 fĻ}:y)ڰ73];HLk,PGͣ6aL|B!B!8p{[֐qK3Cg`$n m=wY8"o% #3kkcK]l\Ʃ[v70 tng%y\9~|U,?wun?kW_F:xqǰ;N;H?{֐;8A7us8M7jn7}71]9!0Ȅٵe> 8S L?Σnhͬ 2]֡IBd(@KRr"7;H S&E"$4 E#dT29g"-k.v1nfz釴L+bf0&.hLv=O5tlԹ7p:(rH[̌YLة,I)Mgnҫ5 {BYbI+01EQP&|PFøc)&2Cܔz*%IM6)&)T\IrǂiQgX܍?CJl-(Q8Dc !B!B!8I?C3#YNjiǬIBq&,bLJ5 fB!B!B! ^# H4 5K=o]ǾhF>w0{rMPi9t$EWsJN+Ԩ%㱌`-׽5›`dB w3E3}r)5̨ml"Nw||=A[(ZF*"Bc't~*j0b0$LfVՁ@<=Z/)/m]veST;ų%%G(T^ 6ZډRD549&J,*%ceS _9v}꠼ >B_x.IzbCfyWws¯̏`CK?F ._{PYgQ*tr!:ڻ 'Qe7d7^`X;B=3@kNJK^JO3Xb뮤FIec[+>=,,CEl!hӘ@-IOG\3dVVG,dg (/ َZäRǢkh&Hg 菆-sA:&iQ"aWQ.jig$:;=cel~|^ ӗ>G߮lu+q쳎$|~w3No$O2v3mM% L z.oMvğ,vo 7=&Dԇ? {F})X%TAt} lZX\s>T*3mll!nboFs֏/*8:D;;qT T/-=&}hY2 #8ra:P2c9ӪHiDFPV /fGtDeBAvecx}9oB|ށu4;c9)8) =Ű/ ?桍- 9P gTpb*v1eg a I2B!B!B;4gYF&rFFtQYUEwWGg)9d)!B!BqR "BGU[ɛD;ִYQ~CC'q&SUZ\.Waa}}TUU]uJl*( 0nrE3-k"`(XBU59ÃÄqIrq^E<]ˈdBm(By/EӜ8lLdIbcGlr`3)3q2~/ma b3SF|>>s' @ˎ-}J=UU HM΃B!B!ĩP TE& !_|i{Y%Nޱ{XN1,r&|*BgŽI,NB=3'v|!kDfbds|.J(-xi5TQR Yۑ-zX*Y0Dr2B!B!B9$4* )lB!B!KaBwISa/1=ɓ|"cXRxJ!).H'_G^B!B!B$ !B!B!B!B!S97@RB!B!B$ !B!B!B!B!KF`g!B!B!B- B!B!B!B!B!B!B!B!ęT B!B!B!Bq&ā?6/Q*B!B!B!T#BNŬn`u!B!B!B!i"J6wQ .㡖.:.+"m.!)Ȣ[ISB!B!BJI Bע(ja8H2@5Y;,&=G*#Mǭ&lN'v i^[8qUO ȥB!B!B!B!B!B!B!DI2Kd+a<771R %$8]ٲh.YU]ˮ;xhm;Cb/G5ӟqCEL._˺- ~x.nGCSX 5Cp]"0d=qһ@)Pt3i%`z;IïX-<%3 )J$~u_>:!/e~IZ#ӳ$;ڕ>Hi !x)hI2kXƦsh_B!B!B!N) 3CWRB7L%SXzM\S>ʋ;8xaqvx]|P :r(B!B!B!M,C;6^[A"0K'OE`ܾx굽F6ҰB¡^.C_'cB2ɐΦ( ]1h4\\F3MtayD&,m QЙg2^]}<4( ̋  hJ;ؖqIx uAm`jH0˹N8јJ)Ea@gndND|i }Y6\zO bQ9Tuҙ>:$`CCiV$ȺQ6L `:"* l(8lK75ˊ INQ cTQ#Cw?m6vv},l6E:c|"!T2qCQp$3I!B!O,%ӟvNFX)i{\t+L4xY$ab>9;wME# p2),Y =!?\I@f`qGi 8)>[? F)*GϣOXiUY%ضbz#w&2Vy@w;ó]NUf!B!B!B!PVg0,.x?6:#5Xh&Tg$پi +WmD+³"~sVex1Y,7QYOP8ɝ<߲{B^]AiI$2sbȦC)ZjP:n[ȟC~@659+ϠP(OOuJR-+0Rtf]ڳ15?γ^L7iA>RjROg֣'( |dzXvm?lmAŠKG1i 9 s() IvfMRx$`ZnBgVݯ/>y .Vo̫Y´ "˛aaJdADF6AJ0v3&r{KX~-ՕIvmfc:45BS#tL=LI"Ι1gdˣ&0o<5i'H!B!c<{!=%hcUi#gJ,i(Vvm]+(@ +,efm * L3/?8˷'=/MT3.γxz{DQSMQR߾W7;N޸9\x,)ob݊ezòVkT.˦XY6q1!* 3=\OmŴB1n$.;4>G65'̺LJk;F鑭Ļwq:$ "bsқ?!B!B!B!8YQQs\.\1=_ϼ/_pbR-t$5J'\7s4|,,~1`:Hd}|Ƅt֌\E!ޫ|׵sN(axع,JӘ p]IӘnqAhdႆ΂Blɰϡ1 y!>X`ФCџ#Аu}\%!,Zt؟u McfA!gBO9_SLqKBljysV^1!-Mt'|*=D$R)lop>LiJ|Z*o'ˑul$Ζ86Ə;+nY͖& r² (. 9S֭-{21.97spW]_:,['qtjˮ f?I݈":l>txbLw2^PAY~ ]#rwPf񁧨pr2`7ճ&:|j,fT \zgˋYfܩWųomU|ofs9!Brs._d;^=^ `8FId.K|pzZ9 MAijӟ暩xe(-~˸`Q -/B!B!B! IDAT8 'XR{j^R•3F6<Vr'?Ǖ/?]za"VOp`N +qRWկe2<9Лv|z:et[q( a ͐9TLNӃ w:69dBq߿|'y4%sI؞v+19̈F85dӰtgp(^1PX Aam,oNł%|%Tm?2j0>JCS,܉MUI 踔1 ˥y;J'x*HX{v;<~R$0K'aj>EiFS޶Za *N+ f.!E+%QB!B!iCpG8?ϮOP=2Op-NV;Us_!PTU_Y (EӹMeWxƎ^RYe(nփ-'g'<|k7՗yYϗ~>_Q0y>X8?}n7\tYI@q]MǾ;FB$ }<sɑͤ},.f͚NeJE!Z9kn/~ϟZGv 7OaQ&$ӓ{$B!B!B!طu~xv.&\5#8!sR^~l<7SԉTNaԊ fX!{ X\4=7~d蓮7f>K) P}#u͍ }VF%L*,P ~:ָN[eiLdy4 Yo @~Rc|+ :cu )@ >@i4҈v|JcjP@0>2g @ &> @|G\q:C)@tܭ\{{YYX"Q)BW5Ӯ9x>z} gθZQ"|#zӮes0O&/є~M4-LY|UL(D<7IO6L}bN9s|O=9̧p,N.G+??|#:zA+K%.[ !B!B!B!tս <<`:RԚlw_x{ih-ē9LkpX,ʗ¹TFur}F@\=o]osh9c!81,whull'f S8r"\skgi.z)|=J~d cWT׼H8&U׆FS"K#xe 4,ŽÊ>X)R %A"|r>}( D\V=6t h衟}RZ>(Ģbt&"(br&CEVn{S<3qTD/5`k8k&V {;ڙZUNQĢ )C, JR%ZH5SkSg63O1K3}HʧҦ@XO?W\C~l.9~-B!Bӊf{&UшB.m,ɿ~4Iܧ̱Fş1 kg\f)ϔ$]@#?=uͳ|U%S{R(CC)/q췼B!B!B!B w(+i `rfi$qwr8~{SYQVߊ"8J@;ٷ#jf͠(_=^?@^a|\6C2&Mb^ vW2MbFϰ8>ɮllh'ݵdzpBļiK-c6LcqBPFt}VbSm.M(/1SSX ++NfYp`|R?SIE!. @[˼O i -MQJNJ2~bn5,GUy6'ؾ*^̜2a]w|]/av5Q=]<2)x-* vqe0mU69л}=h{E){gjL=I}d -pq\L;>H0wpՋ1:^mӑcʟŢ0,n}G?GgX (py`9/nDX}xϱw[𥟜8f%oB!B!9`1$_cxKc{DQU]E$dаe;Mܛĝ?ӢʱL<w˃iňLtdi>[y?-U |=JߜKSc TFgڰDRu=?]7<_#|m{G߄#Sfx2W~.k%x 3lb>k7GM_WzI{_+=a[$hr8B!B!B!BXQ*JyENӝǠhU|Yx~m,$//2.җe?~>ֵfUWqêSUUB$`}|]}*cn]xᙧyMHx?#2ڢ< :v ] ]#>&P: yVb6@-4  bd&=<@WF+YΉDY:eD?vfؔL>5:*|gVO|P)Jf-;vwOl-xǩ@ Ur=ΗtRWPNoozo+"bqzm=Lmb{^(':^f䔁i_7X~PEv e@{kiOƒK$}]h2ŀmVe||| \ȝ|2s;IW+…)75D;YH6i)0< ҔeXhni'Z8vx8.}ݍĽiX4CO7ͭr<>RuB!B!)JIFx^a,Lh!&t K͒Ai:yqR\H)B-8ىاUP% Yt>gC~-UeB!B!N/TFۀC}"4Ϫ?*Z<&̿~3\v&tx;fnG톝t|%UTzٺ('H'Ӱo7|Wyz^W[̻|_?|?%_?|l|[#zB'@ߧ<7iXcZA|lT&7;޿n=KFP97\!B!B!B!N)?IG+ Q2y]~5u+4MHq,.p,p[E!i1"Y/APRyO"Ȃ| I$M) &՚˳YF BuNOkr:{g_ o3/>kGzCQO=C='EN̤:$[<'g3y`i&lXhhfsdo}ncqم\|fL-kmc׮6X !B!B7$>ibY:*4 46QYҙ,Q(G .7OȎ:v{־.bgpjo9{]-~Oj-b2ʂ)x_YAp3xh_8./2vs*g#ɖm,=X$s$fF.@e !Ӝ| !B!B!B!ĻO܋9󯾕3ü?mjS\Q/ޏxǙ{# ɔҰ n89/@Yy B (Do#:cSβcܛ 9x@0Qh1| \zs>tD E}gW3aQC#+> T}NegVPTzx| kY> "y.ΞuY .5\M̾B_}{5[;ޕcv[Iq =Os<#DPA['VM,ZIpDSAJJ1>RaMA,M31eL1K#3kJ9fnOy48RE!B! Mў 86B,A14@#( _ThtY924ZIiyєCہ\l;E:#|xj>E8,< ~a "A l:E./6'ݹ4E ,fl܅q_]Gz):lm|;E?V@e@q"$_?'F2IEbW/0&B!B!B!8mڎ~^\J۪xH LsҍfOֶn<|R]]ʲ17;t{Ҋ2՚ii!Ë́lhSt^!%IVmǝF qWmDE 6.=ʢ‚L^`(tLhuOŠJᏘ\۟vhWc-塸Cټ=mwÌbC{x Lrdo1I$UsOjJ̞cL(#7q.ܚ;`ҡ:vd$G?'n:Dl@|!B!B!B!{Okϲσ>^Zuh%s>sr47lfgD&wtg-3 1R.>"$7n@bGn`j54\3:g)rnK !NOx.Nmy1 4tb h}԰U*ưo3q>ݙlXۛeH 3+jPlK+ +ڑ4 L *lۥ887uؒ~wVИoRGCƣxKbj-}uPFX ~vNfp2S*+|^y6}nRNcѼ}ٶEyxdw/mDJj شw;<(s΃BTVL" K)sl|4@>a}9Os/|pO_@ҕ@|!B!Bl+W3g,C}MF 09L]n;q`%eczK/Ƃrq&ͤsXTQ@v <:7K8{|搱*3,5(6uWTu)@l{֧G6.ˇo?7^vauњRt@"us2>&ěd@q}%B!B!B!BSIR ayTLͤ\xW7},`.?(a!R9}cTun^f`q?%w-}]G֕3)|kQaڧk O:M2gSX8M|*|&#?jV44M',!+ K.!' `E5p4*r빸NLS5?)Eh ]A> bB·94;>3 yxwVй"HPqq}`%! ,ⱶߡ);Xe ȸ.9LƄ E}ve=|Q<{D%SwX Oq4}NRLf\t:eۀA:!*Zɔ ٬2DDZ胷Kд⿹wE{Xlr7!m /b^u+m][ANB B!B!B!B!IS1wmxT"Q*&硛g&|dn^mΥF>-'?Ha+OI$.B!BM'a_3o51Ey{ټn5olKPI{'xߢyù̫GI$<77<[#^b? uo`4Ɩcx~=֬aӮVRf^i+mXga^&^^$lgx}y+vmc-43TŲ}=+X31R?s,!g7ֽʋkIq"ׯ+N3))-=)q_B!B!B!B!eSQ9h4:r!-TTTk׎NkJ7 Bt;$;NҰa±ӤsP0I6qvsPUlV_Cgr+{кr"!i(+-1J躁nRk8wmaj K ^֕`0G1/NrӇBM MsǺ蚆h*^{So-7JH' XFQ,`q_㌎38~QJG T) !^N?{rr#yZk}ڳ>kyecN<ꋢ #N6l/P3RΙ>hm\z|\7k rǿŒ9~ܫpM9zM.9z9^x$|Z|#6ȒՄT. [>lCcŵA:;bH2"! 'IdS/ ̫ c&"""""""r0A> C}hc-Š C>0GXN K0ltztzA`_c""""""""""r,P_DDDDDDDDDDDDDDDDDDD{v4/""""""""""""""""""""""""""""""/Ȓ ?E$Vn_DDDDDDDDD80>7sb9YzVDa|=-O3IW_)PjJc~fޮ.zYFDDDDDDDDDDDDDD^*,W8m% 7c EK8><ވEDD[HNR.:DWP aɡ6>~7|m_; &9u%BA>H_k￉W]DDDDDDDDDDDDDDD,VɜElxL.PvtGaܢNUXDDDDDDDDuM9xi+ZOO)缏_x v{u aJ8ETS׿k6 ZLRsz6ē6a.q'.9şS?^CB79)s wv0/=\BlnqBwnzhޡr>z-vIDDDDDDDDDDDDDDDDDDDDDDDDDDDDDh0*ȲsM|kUa${VR_WGܴ0lSY[ۮ0k ㋈Q),1N(6%N6(`bŔ ?PVuƗ8 f-+ΚH׶u"ιC|qr׆=CWd ⇸7"ZRAӴq\b©̳C&9x *\Rd1nl\L:ec;!2r 2o$CWk/ƻk9DS9LuL-csʨ Hͩt$>qpMyblN*~]\ /e ҏ;p@YةrwГo)8Ñ8!V1&N̩$d p"TMƬmz6:åM̜Dy0ҽ;;,Ni3P_#7Eˎ:5>gvvЊPҸGz8"0.e#]-c wr3.ʭذvFo聟uZa_9pε|ʇ6"""""""""""""""rrK&qk.fJd̛#fj]Q>Y1`<n+<:qq4Mhb<3V˨o$TZDDN+f_̬;9!z1Ӳ[@m1_I']BTG.fW̎y<6|'EOcjl 9"4DϦ.Zs[2gRT2\ρEDDDDDDDD^@vW\)>xj.K>o[:BNĥ#]ͧ"l rnz~qu;>1:N|ꚋ]'ٽ~=~GiKSy _5, aDDDDDDDDDDDDDDc5rWwE1%lӸfq,\ to[0夳X~;⿇ ><1."""3Π-"x{`l+0:/BA?ow2'&/ʶCwN; r'8oP6+PFk€ ]L[Aȴb E>.?"_/`G $1kٝ}݅"""""""""!T6;>z<\CfEo+?g<_LP:Jv>s|b#a&-<- *Ǽ#B՜^HIgwv%qފ\ oz%Z2|mTnng|aڙrޢJ-O>Mym(/2Bxc&֎?Qb/C(,Ap3(_ネz~h >{N=oy762"7IJYg7ڟ<88FFW0݌~Zs\bdJX'G`j&~2V\n (7ꌋXjnx{,COq] sfcg&g}b~,=y Cwa7<~OsKӑ ZS&'qkwqΙ ߫'!Z7={;j߮ȱEaPXHny ,^Y~ִ{-gr,ŮAqq Znw?9)vv-ϰu2.\ n[5'\︂%T)/ev<޽7jp3&POѺYON %Z=0Mʆg׳71:QJD9fi zSI[ *]Lǥ#?T`154D13zu^!\2 ׳=2-{ڇY+f+ ހRN-*vׁ9@22SB8`=bN1.A49ôNP)0.Tܛ`AB&!CgGܟn(eITF䕂&lʬ/H-`{$v a kSwYF14Eٿ*K 'HPI@`8a!PÇ 5DYF0pQfF/bWm?*4#*Bg0'r*^5.r⒤70&\/LMm,xďX=:"""""""""cL(JYkGcî >@o#w!.,Z0jsU;JNa)6œ6wRϜNy(xlv'/}]tv -+&.jBu.]-6ZF26}q机3gXVt%z#9J( fp'C4좫o/c K%d7{x%v|h]&;ʪ'0slYO] l&Sx19{[x"B!}9LY?Kɗq%s~w5'3'G'&s´0A!{=wn,`SS}]HJlxv~_׶""d<\Sx=4EO.F*260;~HoZy,)ZJD)f1%5/YbLbrV?Y0!3NUxeNlI:cyn:rmLdJ$APNvY`,#*K6" .fNt [Kȉ쿗p63bB0!r>YV0l@pa ,,dVY;9Yiee(8Ar$EL\.IYhef?DSJiz|Y2Gy&wg2)bosIԙ]lI=K"E֎~"!w)Qo5NBęȅ`bEL^L;(rCQ&͙׻;w1:6" IDATy-ے1yK]:{^B` =}A{1p 6vq"Z`2L,g}ٱ3䳤5%uyㅧa6_Vmc8w.yQ8 2N#˯<7 d|`J( nэd34@D8H Lg G4^l|{ ԁ"9z9x֙(ԓOop*p/bNx ?yz .QJUeA,afX~.y':PٷiܒFN{yl'˟9" Y^SE֝Mm\v#SL4ɦЕ7(3lu2l?p8hsGٝm%D}d6t;q4%dؚzncNݙlcJ" N֧$z3 2O piDݓlf}vd1a'Dؘ]!,~ /"jsI{ Җ}2- L5ffc(͙h?/P2.8:2k-e {3-۩ʹd šJogY|/91`lw`Q֦;HƬ7(%` >#gyOg*!wuntF"""""""""/b7T~I';sQ]IIqz ^SܹS)+ xk@w+_N?IJ~|fʖ^sSOsm>8ڷ$dH4l(B<`GHQf~g7q+4g5t3N+/z0q*΍)"Ndm];0Lvl'|zJ~.;w0=6#""""""""""""""SX/SDyG>b$S̢ K kzi<@.@( |xwϿOop.۞am50ċWɍ .Sg|V_nXt~+}6 C*?O|' #d <4r\/϶3>:OT&;2 S> J߳ qoncKEN*= f6~Cid:r0|7G9pޓ+n4`0LG$"ui-(LC^Dҕ [rd XfW06M fƦQVOoc(+|ϞE'j&3+~O X/ L?<"""""""""/SRʐNÖϥI&q"h99K8ޕ䎖i |).!0?ܻd~jmt˨mh j5NdJqΧ+s[Ofħ|'O.ŵYڟ_tjyu)6Pw;Cl߼`=msIz:tmbǎ909yO_΄{/V1[sy|:.NYiqr- H~SKn|n~7|lN_R: ^%;,9|"mε̍?z"2s[H3&v;a[FWɶbF[&o 3blMtM-*4"ǣ7qy CDf# 11J%_|;Y{;|;m]{cC~/QM0t';6jTSl6Q=g(ܝM#qu;ˆ.hBk:t^1`;m- NP~;i`\qp ~K/k[3LLDy"A~aO%qqC.}H|z;9wV?|<;_}>dp%>eN"&YKw?Û\Ɗ0嗲z̿f}K|?y|G4$ ߞ.; ABZ ⋈ȒY'B3/Ě4`pa`tT!Z[KFptZmk2襵}\8m+"/EG sτqL*$C)4HGTFQ>V xDifG = 7+7!FdI87hA= 6K^y|0b<|7pl;{ibBhlbS0s_t13K{g/U  q(>`bO|APDDDDDDDD䈱6K.ẅ=]qB.~'8QhLU7N VIJW߻3W_v"јn6m?1N3_:;ܐ8}2-c̘^3wǚl{ZIKdN֣WV0Lwo˖SyΉOoN:o1!C/&Lb TLt*u0~6;lk!J9.X<~🡤JKexh&b e}R֒ :wtwPA#lbT"^'z9q&L)Yɳ.J5'r ;$OuOTr%?+=9\/Gl%Q۫)"zEDDDDDDDDDDDDDDD ''\LcS);Vog W.ťIkj%'T3ٵBSʼ+4=',DfO.%dټcED^IݤOqx!p"!͢ދbm=BeBKhPM!o#G[UͻLJ>ȺN=NLfzt9Mn .CS0},jȝst \ Mn5k˜q/mҫ=k4hAȑ\# L<}V4negC*}]5[w~'H y9ҙ,~Pϒd!0^ǟWa-#O.&=`(*Iҙ_>vade}?5Ν;Ma?Ȳ!y tluRho[Z7޼&N8k޲gESN{#gͪz;W3JDH3@gܓ8h {ϙ)T0JZ}gٚMrf0-r"(CflQCĝBSh*~?Aהq\uJq $#p/6&wcLU 7>Fy4fg5 # fL !w3#Kt)|N}|cfi]a}/ǔP>Rhm#a$r`#ld|;΋eٞI`J N[gҡ1L^Hi""""""""ʱ4bUw:SD_Ը7 ĺyv&.gyf*pՇ?.ɖ_<ו/ѦmO_Ԛ}ƥJfqҢy[X3APakJ8K9oV緬 < DPN4bcޜ Rz`C$),>LًNf Ur¼b+?18ڿ>d-䆶p// 7ke?7?f`?\,{SN ؊,;$vogf~iTzYrWybc/^lN;}~G/"G ΦCT^JC쭜ZJo,%y0<98#ޚٕ^R꣧bmsH/1X}*ʛO3F,`؝]LD$e$bwlc D)&N nBlN,vtMWn- zIQ{i` u'S5lͮ'3Q7gN Ɔ̣t/0H{6an LHf6{J&\9'P_{8 *a(0]~?3 F.aRb3-DC'S Ӛ$kcEΦ-&jJT8. 9`tG_~5-}З=C`o'G;ǣ'oϪ9GS1E :\&Mid!Н_K{[9YO}os_Om;bg1Ϫn;p;=W97ʎ@W'_.t)47:?wӲ xx9^Nk3UKIo8e*tsnv*2_;,Yq7W_t9obfe/bKW#"  |y}GyߔNG/C؀q\ 7¯;{O/nOv,\!_+ϤS /|S.Lou/D =7_?m|lEC@}-|-DD^9<8KǴ<;'$ό3pƔ4 &PD'C-R8xSKK k-rr U4"tҗʫd)vPxE65P]&;Kgn/Dʘ0hz7mZ(g-TVV2} lLOw7uXvG9=UEDDDDDDDDDDDDDDU姇h>.-o(9K>5""2,,'gȽbU-~GWXqT7Nssa$G@@27,""""""""\z cӪ#קg ZUX &rp DDDDDDDDDDDDDDDDDDDUd=y{h_Z"""""""""""rx""EpadA7m)4ĉO$_I)a4V;,6odsx{TϜϜZ-lHpXy-͢.n rI6?ƎapND43v1rp]-;^wsFDDDDDDDDDDDW ˌWYD=H&q/ƙf)л `0YꅙrgT`GVDL*p՗pjʋ<< ?]x\~[9,'<®2Xe'sNrX&??̓7#!GWTԙә102G{k+vtҟ̍?k{ij|;ܹ=_JDDDDDDDDDDDDDDDD^ }mk+,ג=C 'XYs6ۇ8R=ʘCvSFx5ap*J)YXGsk@ STpɅP-Žw ߇ ʦZؔ 8i\ŊSIoٶǩ)%]x(H8 0kqw#/[N+ 9xTN[%˩j)G?#J􏏱?Wx0`(HaȱCa!^=s-W_rS+8cr[OyP;{91׭OD(Llr%Zd3;ƿւ _F ['̌Dgna/l5>'5JKۑ5kW?ŎlcwY 1)we\|J-M)k+isO`h`t KqaMQڳ6Q+?oXE""""""""""""""rR8F+8c_^\AUlnL /]C_ ;DO꿽9MCca~y=0xD'Aw+7u,0`Šfh5 cĦ#8y|Đd!|زާg#ܺЬ>A8k, S4+yb ,~ ?B 18ll=?z1Ljө"y5Lp):,gM^P5VQ( dgk/1ӊ Zq q ȯ>Chɬ'lds+_9Lo{q:!bU,]- ?7hjA8;q#tu0'DQY55TUR飻`BaBUQ<'۝ _x9 lmp˶ 'w\;2"zWĴS.sfѾ<^soXPppm H]6ā7]7{lUa 3Jy`׭|}gҩ8cJO al۳Q}Sqqٻ8̙47T #D5mc;vv=OMnI|88n`  Bt^PIgΜ9z43L_/`ZϼfZ/|/54}]jZ9y1FE92h;ul g@ׅ4F?vE;}LV~;ͬ$    p㧾5W @?%s1۶mɰŇ^U0lYzݵ\d&c rG;+ Px|u@Y7ﱦ^2L|Çxp3z2Kr)4\^yEy}Qn¬la5K4\ !B!B!B!B!B!B!B\E +BcS^$!Wy[|o<='8 M<(eCwFfc/ i7`i@"^!ܵØx#Ũ /Ӡ)būpݟ}G|d)0!RT2סY@ۨiāAG=Î04ްY|S_gShT5+^7M/>g^7rlevfoAj,q'/&qx?yd+Rɔ f:5NWNSsv2/5}z1Ͷ ?/nY;jq+fԣGU2l.ZÍzI= Ƚ/ġVyM+ƻoO?@h3ޛ e(0 )B!B!B!B!B!B!Bq CFV~2z{28l+eM]/l9`d]] dxg. GѽI3hאr*.Ĺ1a&^kegK̙sVu][ζ l@{f <@=Ƙ>](Gs'*%s8f+8w\J.^9^?WRcߦ<|`Xzlk91ɷz+(;9XsM//e$%O ǺfͲ%,~6Cü42շq3kv^qȡ|htXj!.Rqp&YMX[ۏ[8UPjFYx,nn#?{tͽy\ > }6/ϞCl=a Kjm;[F>/!B!B!B!B!B!B!B7"a8ko46Ÿa'?m!V׭=~F=Ut5FďṸyRYd fC-ycϠpFODY&f¹Pz"*FomieP;od"ʧq.h=*VIп.G0&΀ѥnl3K]w'_8ysuZի;;ОC ?3)˝L;zLO_܅˘0m֞a ϱՃ`PbSw07gCOV΅7UvJ/= N^Qly٫nn_)i? _G?oU*Y{yb~Ϟ:L4&LcbrE? (0~ňa|=%B!B!B!B!B!B!B&H3ol`ڦ),_{7 |?҂Xi=v$ܡ`L ̘~Ix-IIUc%z*͖l,P%.,Lg9B/#$?*,e N^l^ i XVgh-< #=RO]O?K65H O)+Œ[EUd?Â+whޫP!B!B!BU e] ,x_enxQ_*coj#KAK))GSoRXG {2迢")ޘ"y~]=^́}xh_E7ļLW^mcث|=9 70 @Q+]Â*wr4G-8 !B!B!xIN 9JHtu^ɍ7`'ÊJ<8M̘10<,*Mcf2O_w+-]Qu{`⍨9N9eFeh[oh;04pUO>jԂ`>wE5u ˨7Dʭ2,3Y:CRh]e(z0@EToH)38^O~cB!B!B+%a|qiۻcٛi!^>%7$7}ax~d¼v^~|ɼcb(WІaK ;qcF&bj@Wqۓê硐G{*V$qTCeh>W\DOYNMhA2Dʦ|n]&0ϝ)5@"PL'8c+F !B!B!BweGi4gx}OxC?++@,]:)i]g8g;lr[9wۍImn$KB dy^?O~\WcWcfea)?eu\_z\(hTQf 20QQVUqj`29(acjd&6puUQYa4q(ƼhsjbI]XST1yRGFINZ$AK2[ӘඓvD3^E[)v;K{ؙ( o1-',;:#+cL˻ !B!B!{e&X2Eˉ.BR]*0/Jk?SܲW{9r Gb5^6À7dk;~s~v*#F+ O : EU?8zH?AeWCg{!q=x TZ6|.^Jx7=x GOuҗЀճp2 w4{ӌ5ꊘ2f+hٲ_:Lo^a3oul?C?ReXDkPe|RaՕ\i9d$^G!B!B!B\5#?,{p /e݌/ /q +_O|cGӧԠBγ2:K+P!EїnK4%Zt7;t/tQJFtA1[HV֝|D+ gvF}⣜[T9qX|X;vδpX_wz'a|ebŃB^HB!B!B!j^tgG=S0 eF`xnkjhyf{gEUGh DpMS _ Go 7>B~.(:oOM*i aJp*q3h{K2oR318j p݅-KmۻuiE"0u7Ic([9;VQ> (`*~dGYdT3Gixg8x>:J?ʘiR8ćj6@S q*@V^ j?%v.f7PCHӠ`v/ٙ61G$'y=:AsoS+iW&P"XzGԄb~hwx5LU,9)j< a!v>Yg`drcL+r̊,*D^rϳ+f7 W07: K)+{`mOab`"aGYR.D4ǓO21p)FǬ͌5OJ·1742JG8~Åѯe14&dEQJSn .T)^Ӫ=n>7k57zl9w#B!B!Do^WN gmp%hV(c믢soTUc,9*@Ֆ4=hW.toy%9v))ݏYtXSv42e74_+`+:XZAP@Y 5 6U&eu~Q+?Mh58'H#}E@d:hk>m;u`G68֕:߰3:3ic?Ђi9}MȜ븤цY| m0f,?Fc'gl"h%U1ZbU2ם# >u]a?H㕽ie4 (ܳIWA!B!B!msE?_F{.gѤ.v{ {: x.VShb̄Lȑ =|OC}Ģ=u@Bqٌ,2| QIHAWPkY_MiQpZu`2?q:x.y7]KO E燑(*T E(p!fNNRe3YkRTJV3T+5 儈Уs$/ sQG5Ez-TQfߗ ԳhJ?^.tǽp<0c2JMtw"2 K(xIzֳVjL(]:IYGM:3QʨMܩK>4%:x0#,pSX`~xjL+jckx=$$QM=r {^"uL{Y_2qn04}4]N^'=[vjM{uG8Y(sɔ$beJl3qݳ$< *!{2 ˬ)(>I_״G\-R7{6~_-W N޺gV!B!B!K..ǜY~? PVUKMEil[&u/O'x/$]t(ጩ_lFk]ه)i⾴CblJ#4$ޮ5rxзrT(NIS1|Jtb(AC|w0|EΣp$HK7|jǟ|`xɥi?ˠ):پgъ *ʂNDw%QA+`a"SI!B!B!Beps7&}\ IDAT!u1)3'd[8yE35{.?t,<\t&1l< dp3L nYN=ת ƐW^7@t}*ʕD{ (:t+ CJ2(_35?75~1 ~9E4PXâ'}^NJS(EhװU;'=>l"&Ɔ+ȸ8#j yLV#5HО?B+b(;Flft{g/fi'zY= p6%n2krm1"eS8-otz#u cjA.G"O_ ^k\IOyn)oOg4!B!B!x1/B?LŢ2lnX'*Nwm- !7eKr'8lB!B!B!hsBy+>[~k=˺7~֤f)6>0jp5c bþV|sik !e0Q6AebeDʬzz|C10( `bQx-skFU%NNmvo`QT4f^׹μ,&sn|k#Oot2{Ȏvj 5J(=_5i!„:†B]@TF2{ NS@5`GMފ(4As{H:JF`G)+"6w:ɷ>#qt:XN]8C &Z)B 0|L L1Ƣ?wo*n1M?vU2b!B!B!x/BOhR[6e,i Ǔ8o~Hqq{SdfyL8T%kTGwq">ϕa q|(\Rx@&qX*h"S6AL<C[~ [sF|YvOsgB!B!B|H_;?9~K !B!B!B! :K^ ^_ҁ6 ˤ/C__ x=whFM۴S+9tlGijS1`ٷ/fsYN]P?z.ᡵ ,aGb$KPDM$E  3T%Ue8l,D1S51l [E]2jPشSln(r,8C8o>/ܰܵK_zw>#?Ķc.Gu"$q44. Kzh"j {)͛̌BtUX:OIp7tJ?n~ ; ߠ >t TR elj[qTɡ̪&hFvE I7luVtasQ61X[15:wl=rEw/B!B!_B!B!B!B!1?7Uѱ'ܱTG5vt^Ek3BM|~iZT6Nzfz!2\M})nWL"bWceȺi]CDAkU2uL(,V2_=cei|*5~Dj!,D.C;]eV98䆔5Ԑ'b*4#>{<ү?7_xpEAB!B!Gsߎ? !B!B!B!a_>;+Yyᙧv$3l*f[89]=wW-g80iD\A{޻wɴǿÑTqh0L|-A !>< HL>Ko10706R F ҅C*Ub"B٪jҼC'(_Mji٥Oc/Aߠu4(:1}O骒yNg[F{Nɍ|o_ikY2$5ʹ\6}c̈6t%!O,%τѧexM[H{v@&wsoV z eU;B[8+a41!8u>%t71Ǝp6(/&+Y`̓Ȝ!I慦? `RZN< }XLc@ jE Aaᳪph)x9>77/_\]_q;cLY|xܠp.͛W+ݿ3YX,y;qJeB+:ؗ4&?knD@Y*m3} 59(7Q .8Rp@"5N675?%:u+s<QØh 9K2#XT&QA4?!JKQxD QξDw|LrT><  $;ɦ'.B!B!BB!B!B!B!r*ʻ>ݫRP?9S_34cgQLb^3QY p!7$nW$PFSwҜ~xl=U֠XϱjkXbkfn䵉~p o纠CC{VRYA§F@fb^DGz>I~@iI-^JoFHO5B!B!B !B!B!B!99:wQv]}sܹ`QXAE2EQؒزXɋm%~v\XvώDZ-Ƕ"*-ZE Љ6z{;0̀E" Z\{r9sk33X?xa}0ܙb}f?_~7_v#!8"; {nf4'-ʙ'81P(cT%B037^ǖ}tYLġg9}2""HPl-Iʪ6~Xg{G.LS A=AgLazi?I%"8? e*S,‰L=i˗K}yBd1Bps|/6iV#m ~19FS_Z) l)S]\ T(d0ĤI8„>a8֖Q%WǠw#QtsKLMRv(8m$$!^X͒N3]]p[噪3B*7;I4t)/]d+֙ #g+j[Y+}gj>ԂJIM1_CD`!NW˴Q!\?cctu 6IN;:&r_e4>*`_8&PFd-^p?Dy%.oa04bXxA]/q;ZJ?mmLO0p X\DDDDDDDDDDDDDDdeC*Z\u?⪷4cGH$DZ@]&=vƓ$nDqnKdDŽ2K wC{q+rkUxaU"TrqtX1,B 0&N8\ܠFpg`P!X"tbp.~ު DUлf q̙%EcE6m |2Qs읻07r}O)nq`쭹%b"0x CV@DDDDDD3{[?"`1@x=/40,P Q&υC}{y#)6f,x2ES{/k֭1r0)-פߴyf8t:˅18ݭ4_K2΄>a%O ke_D5:P$b{g=e373;g̷ 4S_Zzfv}>>q`Hezx Q_DDDDDDDDDJ0۔^~g_C]XTД&{;|>uٕc[_ ըT=E_vaILԚV gf jx/Nȝϼ^Vm"Xeer}?0 pσɄE ōϱzY#fx_ebmEDDDDDDDDDDDDDDDDUJ8sEy;)6e8kn]}~}%gJl]w'SG󄀕n93}q;-v 26cgjgq0NBxe +xW\q0cyK1Hw4\Bib IDATJ#`,NSx[gM<P!J7Пcr^ N,F1x*57x HXwk\0! /JDDDDDDDDDDDDWr d..~& ÔkBry F82CFى(6Γ!GN2S=6ۻ}s?;@9BS1;^L4BS#?+/сcX[qZ[aij3[`Z!xa…0D۰{64w`b1kiɗ& gl08b _=!anoAu  =VK'&J-%#!$|3i3TG*$#miI kxi:ka]bvl}T'\5^Idk`Gi^UkZljX2 ƢwtnaqǾ"e'fUW)N<#پ[|n+='.Iбr-[7fE{urd MOa y׮~>ǟһm7m%ix^^|&6Ppxrq/""""""""""""s"yP {xy{Dk!9s& OEu"""""""?Lc-.Ha0 ?N,:pk=DCb5l3s(G{ybq (df*,ğ"vauVEM{]6<Uu +a1 Vʾ $qzccƂ`{Sǖ'naqзoNahLZs0NhH$B4ch|l탩'9 ex}'xgH!ʍ ן='yI_Ԋ5i;]7pU_V)Lޣd>‹soH4sMORLXwOklHDWNؾa,CM8|\{ԐhfSvf-zEV6#W0]_\%"oAb؋\ gЌz^[/qlz%^8㓓Yhoi!I@!]\F V]w[pY?~~=NajEaj"=D׬TX"֝v܎+Sor6>3''K,Ʊ-Y⋘6g G*eQԧk9'9ٻz%&U ⛟c_@긎O]ɜەg+FϦ$xjNnxM棅9&yȃ'ǡn˟|'׼Oљ_q75L.=Bp<$-FDDDDDDDDDDDDDDDDDDDDDDDDDDDr0\iȏoyxZ!ٽ6R$=˳Gǩ^)J'X>br{ ofȪj/^Pi0[pQƋ;v(?%T&vl{_?DP8`cK^=TN>?UL~jDF}f !qu1eB&_~>NOq񹐖V>:޿~ک=e>I{T_B[ajxϖBParh3KQo;[ <{}LW4ϡyM;asxW11 Q?G {6cj3.A .3OH)F3D23o˙osy=O[אJ߉5so/~#X&o@=uX U7`?6nqzW{jAyzoa oA$T6Jc|wh| L$(mŊ/ЫCQ;bù }ˑlyA> mg} t۶SzQ!;ߢeh`lxK}=3 e-.L)6gGP+rzL8mm8d%$/.{ɹƦL־?n X|s`aYx;2+[hzNǷGW_҈N.&Lalzd{e]" Vx͑ubuhrc+Zx0>OEFF2~9J6 /#k衫@n7\x猝gM#)m}`={""""""""""""""""""""""""""""W悹|Y'M;o|\GW;x w|g?7nf}2r*˩ 'o=VdpiOX/_(B &`WX RǫB\j|%1?˪Q*/=AZL,Nbq/$v]qof t-yʌ1x Y斸8""""""""""""""""""""""""""""Wϭ@D!3#RqMqC]>ds}ki2 㿩Bχ|ٲj{j߆܇WmiDr'^ZJ Yn5D, $ .^ Ϝ0eL~caY@ihZrN .\e8C }fO|r?05NR-<""""""""""""""""Wc%hlBe6\m*d!Y5q()e\²4VJNS/58EDDDDDDDDDD0\$ <憎1VH]҂K!T, l/7PHPq"6,u 'ڏцnj싸S ۆErs;0L^|۝vtB0?U %B5clkqc&!(%=m~Mi1h]@`Y% Tuܢ7HRL2]20.9U\nC<Ά$,R8cqjٱHTa$,0(²hot'.0tݴtԦVa2;@ bYu46l L2S\eo--02^ d?B]j3WFk߳ofZcWDDDDDDDDDD-Aa|el_IwF>\{m \fN<P7I~J`b/{=vX쮫DbGj K3c-ؽ7`UvLu1NMfԽZaa8 N+K1hH_D{a t~0hgN!'KZähbw=t%Xㄔ>^d5\(\Yu !LT+lΡPDI6ure/qȎ %6y ~S3 _y]B :ѓgBVӥ{xu ]G̉c >cۺw ƾ8hr'[2]rËgIbp,{1ۮ#k&t4lQDDDDDDDDDD:W)'nS{^Nv_~㬩 ts= -LZlYWǷF'/; {wfVNⷜ؃0;o;j/% 0vV7/=k3;Qx >b 3$׿O~ϒ nkP_9>6z._癜cݺǎN2^4mۮgU~^G>7n>aJS`EiMAN=_A4f7iFv}~?{/<_w39ů]k 8.c?Ko8+'xn%?cQ\M2/"ݴqR5+?ʦ; kuټ37sx BKN3|ܬKk\{#! 3Ca[i`Iʗ"󆩑>"MvٙjKQmʉ3ېca MRq͵ipy_K&6nj:r㧧(SGφ-l^DXu|`_HP,P̈́DT՗rpOҋ } ̪0oaNI~qB+ԁqBoP{qM{Dc%1V辕{a`#xM-Dn"S Ib5c'#8-'cǪp3%K7 820o wxǫ_yo8=Kmi~Gw_4Ɍ10:K9Agk saG?wؔtcoLe̎_bnl+B$`E,L>KeeF.vQ~g?Ξ: DeĵlSί|sbf5r뮟5o?q7dHoΎ#yf?ɪ-r;3pq""1gXc ˼],tVRb& r&Y۴tStz; Ó.1 dIgn[侙f꛰Ff|ȖնT׀3gnf]s /;{=Be|m"瘚y"""""""""""9ߦQú}+X ߭pby⾯f8q[ۂ!-{[wo^ FXABeH$ũ`.-aQr˗g)w[q:1& >!=Ԏ#nc |f d=!O6ކ=J0(OTM{dR4wUx8[o=%.w#Br'9t+Yf8z 6FeO;qw޲ $Hf0ah1$ҍ-rr $H%pOuF,F4`LH ե.X VS~8.nyNi+?swQ78=O S !{??k|_?Efn5cYX@, 2{xjԯst>CH XJ9!шd(Q] %oы̊55$*ZRuR o;śy ^JN6Jo+Is \"ĈDZi[_D~ s`'qXtmyyJQ2vaXu3:G[8y!>wYE8 iLXP /+c[TpϜ AXM7=vXlAI[zDc- S(OP8h%k.@G&_2{xjO{_Z0<{/.^VxQ{x}T+Qȗk ~Cx|kb'ȟ|3e)(3t{g <~/gHo}t9t7^'\?Js=e\:w&gEMwd7;aSD \x$ejk.]t O"S]QvBŠ`[_t ˀ_ogs&8;<\ dulACe?7e7AtR}GV׾ aAdĂDl5׳1A~IF '8k|7ı#2>3_a_.;o!"c_}nuUߊB33BENj16$\{2&ѿ@fVcHDDDDDDDDDD-AaЯQ0fO9; $ pg2O7ҴTb4+ oD:7G2+/fiܘB‰ fbЯ275xy^嗝J>C%cQ odBJDDDDDDDDDDDDRG?LjDfbtlگ'o^]tnѦiK?)S٤+w:6T9ye 8N'+zdtikFws`ttqr)/SO[;w=O0[8ɺ`˚694!$Z'S}+iF˥Ec247>{V e +ڶjƪpkJ2vѐb!jG%7u5LqjtE/ĉ&g.V  '9>vѼ;ol?'9Yɖ-i'?,YXwc-Ve?ɿ >Y&g4lzj2Mԛ)[y~0GH-OcH&WӼ-oc`d7E/$SWupaKtD=Hnx}fmhaXȇoB|~|dٶ""fOpB-6cyT6VD:IE SD6c i{ǿ1AlYŌzSLF(5m-q* O#MGc`uWSp¹wGO?A.c5'c G2n IDATpe0DS7Kzb(?C-(Vpa@޲86=F90ĘVJwr5m!JY f|tj5qOGz NNf嵏> Q1 LNfcK.WoW>PPѐDgj3C;q?Å,pQMN:c|fO?tLnVm`qߣ{ُ~D?F"""""""""""=ETa73e"qWgA$!N3%exT&DǷ\! ⢅LM󹧘(|ۼpA{_}}}V毼HtsQ+</۰`l|Фpwg1!s/ED^J5w&T\zegk8v J<_HXRC4\Pebvj گadb:xizzـ̊]ź.*uuVVO#z~~%/[ jx}+;pa= ;ة.P0vek:{s©(/.nbp> °H[j>ZiqCa+Ņ""""""""""""""&3mԗ䙞u:Ҭ65{—v⅘!؈V)J70pjK`<˱fȎ`2035}<;3g_q?{&""Hx @@H@2XgVVpaX;=xZ֥ћzL#YMCj&jgso+95Nƴ,= O/et~wq r[X_pD'$aZ 4w+Q ~R^t7~r.mL0=9&|;W`u1G>~T9acy"""""""""""o] _,cFcEDDDDDDDDDDDDDM\2v1x|Ȯ^ncGOqgUzm;T󇙝ɞYl'fo\/#GضnR#s?DD^Jխ6D#ɋCV#Tj Bo ԯm NJ4f1Do&(h&31j^xvZk? mύ\|_cljq,"BĮU /H[DcXu=m*cp4XU"7^E}pCi;q9gQ:ZX'衛BJX^p5H(.*27gmNRErf'-QMpWZՈӤ*TED^%Oq37!\C{"N2, LȜokF{tY%eY6m%Vfd|0JĆ0_ ߯c? 4ѐh%n/ܓI%;s*Ea|i&Vԧ>wYJvo#Y2e5ub:VmXCSR#$kjHf\²-9 Bێb̥6L-hL\48+i/*r,۸]wxpԩA&s5<_|ga%y$ lY<li_w5;ZI:p8!ڴwGܕ&n~ED^)B%&KLr[Vl#u.mpbIS$Be μȖpbkXq5 A3}~ /r*! j."؀!6PfcּT+go45'݈Wd;{ zִƔpl|9Hn&ڎm4FsX§Ou=;HceORjB&IT~go&ikEׂ LOtF?OKe_DDDDDDDDDDDDDDDdI&;ٱt3WoJaE |_eG>=K-7wo|^n??+o=pΦwVlx7'svc>n5#sxN=k7um;#]~,6];~_* f"[Jзf=3 1("jA~{h7a6?kHhkŔ煓PX?ĖkhoПx~we6aܰD`9ºUu"ho[K,\c%iiEWxxֲeϲV0=w4ޢCVTL+V!r5Xb=$`pyf'E7ӌA9IֵȪcTV}Wof5H狗MlSL q'==wsNKo5glb׏qHdƘ 7}mj;G&әI?aUƿ'X_v[Ra6;J{}dv7+;$:I&ڱEoHgEj әLSDDDDDDDDDD0j&-ٻ8=kf~oojduKr6nl1L1`sBx%99vRBn_9%X__rwiHNۛؽ3|WsO0$4`mkgGuq ;L< [ yj[X8RD7%?4mcܫ_y=_|;(}?+f\YMmgǮ]")âƌ^AmrjAn/#Soͤ.gqY̴, \ɶ}cp/`an̎~]|u9 ؓ<~dM47Wu%3;Χ*g&ؒѧX^ !5;:qi*'l?& $@H zW_DDDDDDDDDD~Gu[yVK%Z[[oh]m;9ΩoY74N63طoԦcdFLj>ҙ)OƉQ]7=;VɌY3IE #v2-z<ٜ|1nԦrެɔ&9UP=YYv%D%NXP仇 ѳq TP7y;RC:|qdRY|-/qw}YR$cIB7C;\7v*HFa\1UDDDDDDD~S t:o_DDjkk9aoF_|sش!8S'Dzqbz y%uLꇏ[̓-_іcj^= Lm9_zM x0od6om&M~]<4u9roa """"""""""0q+iY0L+`^uѓ=)y2V,]ȼ3L`e^{{YEDDDDDDDDDDDDDDDDDQU03(^]0qr| X%IHܫompk?ǯ3" u{0oŨ- nyc|z_yzw S!!߷Yַu3R(c")f.::vn]`Ѻ&sWQ B}!􋌌- K?5-6[ܻ|0Ȼ@Ow>uQ{1BT^DDDDDDDDDDDDDX0Lfҵ'S}];ȇN&S/1jH&"ؖ! |rt;XҺc+p˹cӭS{Z&SbmM"r *?6ﺢ ):*+"b5u(s7RWò#r ㊚6~^g6Ktfsu(u^fG(~1NaU5>>v $W l?{X$YecE[hlG>K.so+z~,` cB C޻6c;'g"S |-sHE;|}(Nie)L۞1k9;XXe, $ }>[4V9D|~hkݿ{畈ȻǩHrWLJֳ/CT N4A _EukZ3!#n&:TnpO>4=o!b|;#-ӆ!*c,"Xۂ+p+"'"eoDZ-NLcX+ "e%DUNmDi{c 1ۡ6dye5s]#<-cSOqRE5S m 7pٗjfm2prX$i5,O`ct2Ƣ2dyE5+IztFY;2̦Bߙ{MX|5- (ƪHD 9r/ql#%5c3 vQGp]佷7A+QM$COdJ@pJ*b1|wNmס0qʲ,|OS즻oA*{r/~/JnO8 \_ z:̞;Hf~ܻb I3s"N:iͩySg8q3NfɼTEC}l*/HWh^+p~+ $"7{{'vca[1圼4Ou0CwtwcTT_y'_Cտ Q;Djά`cCb rK9@w#llN-eEƚXN:9sμwū]]WDDDDDDDDDD?N6?Ҿ:*R1Pޱ~ ky6JWr+Y0T$`cËo܊zeYf]sNsZ]X֡>dr"Nkfpeu%[*쏇 e`0CCtO%oRٱ",n⬤MG'Gz&¢|.Y5utʼ\pyL1Eki;M2VAd<ySf~+B°LٱʊcX^ b% J<1MzSŶuJQBDodɊEW6PNm,ZɌZ KȻǩe %h,A<2^HP?w ܻc DR)yo""""""""""""""rL3qZOFV-!m m勧x7̵mV |5 /OOӽk^ܩ!*ky3lcp1"&TrEfq?˓Ǜ;Zb(țg2/*B'}ϱs; (Pw˩KVl |m^fT>Ag7o(> si]6tcA|t=#=XDvߌ {ULWpo4ˮ >$\UL(sbq,#Q.b3Nⲛ>562K?Ĩy)ĢIZMbO>YϖWx58f^*c)l@Q*t"{}>W,ϥjq \BeāХ9[_}|Ϸe?>ŌW4f}_0q˗1zZYw}P,#|9wY3i'$۹7鶧0Zql\{<;n{C]"9ϲ`lTpIQj61)bH^Y/2-v)dJ*ӋZF}r^3z l#ĖmP\zergR\XK˳:3J]E#c1bƂ&nB 9#%HXI@#. RHhmp}o~ g&x?R_Mĩy)Kkckc0wT%KO!iar"NNϠr6'3uzg6'՘D.MN-dAbf5_Ceͬ+yrfSd(Ӈ3t̆8X:-_gMgnصn gdѳ{+ei2kXVf)5.v~'9yxeFw {>V\q-}V}f C~OqDa|yll{ L3*J;bS}w_$wm/$L/vWrC/"u'ٿx՗_~dVs=X!'_u#zE,Ueڶ_?=7?),`w`5,^s0.TQߧ fG tz5}0,!ayH@ vdGiò,h O=cW}U\9/>Ƚ?g^^`51x$/R,8UAxa$)6@t}2.ܷ~,߼vK.8`UP["qix񗟻]Y/o"jW/`%#nt,ҕAUvO5'RI*@ET Mo; Cj\^a])BBB0cx€ NO;"jiɹؤe a8ܷԲ :ŀ -k >sHg6g?{w"DN!P(gkBmfheB2/1p _HY6,jR m} SKK̩M*=(5H9Qk T&&k$ 0LjI#,~f6 ,Kx@xiLqG vF2CM\k?m7,|g/*r=+"""""""""nL .!!ve3^DDDDDDD aI/vȻT?`)}לO}۞$c0QEq9gpx\SRkZJE} ̮%87?~K/X*y?ӏ]S~""G␌Wb IPQ5sJԐı-XX47%#28Vq^2p2J6|*dفE{1fNqfe% ezc'_͌Tg㸅Sdopi{ܗOυ,'f},ma%-_`HǣK&Ǵd0''ۗ {iҋN6)O)T`)ĖriI `$166 sXyۉa[_$d,o b3%nt9,:/sKl{N^ro}DDDDDDDDDD~cM~ {jSLÊ!ȱ$(PeS'{9Fs!VMy'rW]7x L`50#bcpg%SI%F0вc,E-ރB=u;Y=tθJM~liA^YIO#18v CHݣ1/X{筌c}''pq{/5Khi`9 ,8PZ△hNٹ;la@5%w ːJpFuc6soH*lѢK(R X1cahU Va=VK 7,C(c" \hC:vV,`v,?ʹ$W^n v3kᘄ~Щ]HeҕT*19T=HljcѢt}3]8/qR(jɼtթT2/w{P$"""""""""rLsyyl]pe|'<<](Tly+t {t}ZiJfaSg'bX w""FÀHJE^7jMUo.^n<)m: ow w )R̈AùncSStG78&nAFs fF0 `pHYQCH4Nws~0w>Ƿp 7X7º=Y $c.X#at4M)pR4xbfy)z+30_ٳiy"z"((~O(LIr,T4Cz:_ |s z&wPq-8"LtfwʶǨLVc }G-o9TO>.OTvwbDDDDDDDDDD G몈[#́UhGmc{Pz9ɧskh/\q"ӌ"kّˆ96Bϐ'ӗ7 Y= fvXYXcM.YX= ! mDf0TaP)ˮr@yeh}h!M$]ACX`k8={i"C9KYCRbEr)͉ő?z`)ec'RC* H4QS>AR*L**1epp;T՝!ڳ9 !,w3Rryg'wEDN;%D[tl]V"""""""""""""bET+h^X?Z%ɯn F>4?65o\>@΢q ~ӯޡ.:{3NY-YVg_UU\?cIӝAł0.=?g}% h'Ye)zNw,FVК] X " "N qhQV?K]w<̖cl˙]ή>|)GhWo:澞$L |^y["41*"aرob0G{XcJ,n\Ăb?J\ 0QJ"a_C-?r~^D۟;_dIk#hH.{'YKԇag-Tc}vֽg'usXt5<{ /<G&@D Jmlv;h"Mb/Rv3dL|7}shI‰@Xwh `k6>|C뼭R/,ˌ`MPaqА8?,kbɝ2XBhi'<:iZcQ*- /,ؑeOɛ <6vR*ƩwRMԀ %YڊI#Wt џ.!;H_Dp( ?p9붳cWG+uN+cۘЛ𽙆?HOۊX6%?q dבوmp, B/O>(e3Y^w:eHDbn==ӝ`X2: [F6q"x;g )e3u7-+cG0~ /v#EDDDDDDDDDdSvU_*ċ=l^H /c`^S5VY-OʘD[*|u/wG~|!"Ɇ$+*#ʨߝWLXW(U7tyfHϰDDDDDDDDDDDD8eePЧTRz{Dž,#ũEDazzaPG7 |1)z/ߵ6=fo{~G7-f~z"o"QE d J#CenywPH( """"""""""r']wl~-w?"t&߾.{e';Ύ0w{ժ$ےe"q6` @HI^JHtBb08qlIeJyؕ܋d=_Ǟ23w{9cLDci;U?Rbr@Y4aV%6dpxV&r ,2#eK$唹IywUt!,VS9;F#c6)?׌N)`G y ˼Hc<i@X>l""""""""""""""""" ,\l!0MK?""""""""""+ 㟨2{̗UW@1~pStt2{#6]Ȼ^?$?u9%8B^'v sϺ>/ K$KW(nZ^Fجyhc?w=к"N8$9<߯ۛo0w~ YwpK`9ZۋYQc||kĒn/͕~r%m\:+Bֲ.>to]8_C 9=Z&&mZ?H@g-&xRHE*\ܒg]F˜ 4ώI >_9ZrELb1hsϚWR;.m[g0 ,C2u XҼ#Bdmlޓc/߻*Q(LZC<u u-ŕ>nf}@,톴D,#yXey[ ֏?p}K%f8T4E4qqq\FDDDDDDDDDDDDDDDDDk֖(9BqEa|9cW 1<> H~Uo=ijWPXLJ(Ƙۘkjp 2(l)3V!॒\vkj`$[24WzyKx t 5 ČiY€<\3a%?@_D=61,lW:8, -#yvO!ꔹ'<c"kyB坵?7Azcö;;%:08© "j-b9`K q8$ 򃣄hDJ`B%W],"""'*na 9(3&:5hXȪ5+i꽓/"ǖ07b$>4S]+"""""") .IaIwpU˗I┆=ͦͻT8(ҺK/8w;t(9|>'Sq~@k6I&Tp@>FrM"<5oϑ^f~hǪ}]"{'|(Ux Wteg2(Rӧ5?e;+ny_M&Nn]Î K,3RPT],""""""""rL W.WUuO'pb?/b4-srٗp5ϝÿWٖ &IVv2mDu 9RJ t7whHDݩ0qw8ԸC^0sg̖6X8?:PR`|VBv|5T,$ŋ_i6u1P V9(+gٱޝ18m=~K|醫]ϰuϏZUmX9NJ|˱VBoqϲB yoR-Q?!rIK)4dho-pi"``OԺ!q[DDDDDDDDDDDDDDDDDDDDDDDDDDDD^ ` 2ccx\|,.rUg1Ԧ̮КX:;2=!rƢz 5FreT ^k1]6tWXb=9&{>583?qY:j6X Mt!"""""""""""""""""""""""""""ZQI.OmXRka)g 1z`oY!3zh8[^9 |VDiOĦ&39d2?n.0놙nms"k\sNoqJcI-,A]cwq nd @OCC LP)?W|8N_/h[b?Bt` cR=0lg$3V9Tܷm;G]=٩=XZF2"wo!J N0 H=`lH߄ņezMOG;yB޷Gs0@![1]""""""""""rRe2]eL*nCCKay]OUk,+-W=+)`05hs6V*>>=#S3T.%k̖̖k0XEFgv,1:9yBNj ̐xd*;LC_MM`+GxI\^^>f'=Tnh⬷&,n2o g~i?GM̙I1(N4]qv\.:5Rl(c8:0񀍥TZ5.6 XHz5\npYts Prio;UIv캕{F}f+Xg|d0}Ldٗs?Ylh eTŰ7<,B?8ɏMR.""""""""""""r2Dj8M7-g̫81"%9qh'_;|JNݵc. ϸkO._xp ׿ fnXlױ,9\T6>?",M:!C>Cc ?+X*[FB.]Y/*1RCpx@X}#?_S˜Z<ώQa(Hy!R5Ddžb+Yglx=;3V^/} 7""ǂ0O|vf$c`W_ü~ٽcDO^Az-h!q5|g8wɅ\{yk0q4q7ķ}py\/Im,E2$E1֧XSɗ371KSKynD2qJܪ,;x 5QP,g'TJ'ȭ33 >ٌ5}˦\,h:,։'SA|ڈEua}ɒC[Q2:)c390[F lJvC53:,"D]b €D\ǩaU#<2ɣ\%MHGb8B%[ɒ-NY H X |r,rl! DB4ZK]2,RbeDDDDDDDDDDئ01.96.{6+9G_PJȳ;ѩ >fwpz@XǢfcqm_E7גpC#S۩bCKqOYZ"`۷lchEb8yhCc% 0.[v#!U7-XMk$0o8%\LXv86ϝϩ-I;`cxg&' @Nybr,أ?pp!jhesk \N`G1$qX3 d,<%M.X52>0@kf G!LU|H8P%@R!V=l7Wܦeh>9xDMmlg!kg,mh%'F<=#yb9&:Os<DuR/`q*ΏF(m%H]+0ԸpU͝^ ,#8]^py[aI˚zYT30:}e=EK{y`X }/P}泴})248l-,hYHc=]dxYDh9 s` <>QjSsYּs"1z!='JK  ݃*MRkHx.~ϸS'qڬ26 S f,cs`7#kOa|y/gطwqNe*!hXZfp h?]B:e6!wLl,q!9z wLSrUeϐpJ%Iؗ3>ĩ.xFG7p_eu6AMVέI12G"M,̎E~'ƇS{ IDAT2i/N7WgC}atŗv!8#X:)Ly3{reymb-X\t M;1t_DDDDDDDDDD01hdGfhup7.cyIQd0)Vj޲f~!:fS"Lc{?l3|kҟ-O)7>g?4j'Rq[ .\ϑ9L@%Q#b2C6T~gb#C,$ 0:_U-'}ʡu.FH#Y q b ɰҸa sgޒw k Q LO⇖'3ޚryWmȿuwN~uY30$ D.LrrjlpshiYI08cCà CC;i=d+ ]LݭO&αA|RqzY>MVj^~1 `hɬ5Ҟeg~{9f(:gyWNA%b9/oV8#!1ذ[ /?{e̷W|s]WrEspOo϶aOaQ?v|w 0cm₅X{z =(E8fGܳU5'3o\~ݛؓPB'8l(0 o1bzeR OgNJ{nKg8eE܌ύ]C;aȏGC0.3Uurx¨ QB},ҫ/rs?97.a~^޸y8{{XcmZƜC H :#I^C0#@1T)K.;HFҤ<0X1ad0_IDIDPFDDDDDDDDDD0*+ljMsٗqr;<6b8(^!tt(%럻k&Mk&2cCQ =̛ÀV(drsS׸Oflbw?Ɏ1ˠP)q{APh-'V׾~v*L>dܺ WwaEe&Cv*\_@1\vY62U3p3O,nriqaDJuאX0/GCV-5Faf~ѵ}85Qq5zK,sZ*~A5$q`F _šEDDDDDDDDD80 ãZBκ X=n~`7Eb"D}^D>_ X10 Cr|~b#{?dEhKT>B2R`-D"ZDy Ɍ'ocv VgVj|F痻6]:R\Ȍqq#WcJGߝ8e݄ϸupҘ!a k!0[aI˼!(8aLƒr @1N¢!-G oK?WPo@Аn# fV55q\Sy u?C["V^泸2;(MʇEx_ X"$q#,-T,Ty,T,86䶱3R 3 f-Ūc W RÛS.[F4cn}' uԶ6 {F!t9]L}l8*GcC4$Fp"i&T(IF\(T0T$%A2cFrDDDDDDDDDDDDDDDD^&]>h,͜ Nްt 0ҰsW16}9,lgPv-=b V8QUZ"&}Ȋ"r|$=CO~bhk'5!!KRӚ'.CM\Z-5MJ?H5,J8,3m13eW`ZhB±te~Q8v:aY +j_&f/Ǣ%siN>N\jYPfl|`P >L6$F0"pԧg; LP_A erIrOX׉Ӕj rH)2'd ㋈1/"zlh`mJDDDDDDDDDDDDDD^-wpAq={v30QIur?̹vGZ#N[lti10-.K ?Yr3nÕMEK(ZLXvycC8\X҃'-Z|?1mpnYqC`Iŗ\}z7k;z&h\BS8>&"rK^QFvv  5&Fcllƥ&9MI{9$+8S2cr1~hkXƼDˊN3?ff5I M72{\S8v/q8UO׵}#9M^GƓlR0ŧrp$TDDDDDDDDDDDDDD7Xd6ZƉּ7%cLNԺ ,"/+ISb[*%9J9AuX R#IbeH".3WP}Yސbll3,#m;E3[LGQJAHcݞH.8EkimXHaLq'X70cjڜ)AXfTdN3T(`"̪Es4`px3ό½f(9s8oQ=#dCd-D*C<Nך',Ci1-o`Ac1%(~w446O>6s 4Ζ<=q X*dRNԪN9dxk@xȱk>Ǯ\J8V]~V9$,ҵo 6|+\W.`(g<[8dzr|tmy\zv x;$xI8#_=o^ǯr18/o=dc˖ٗͱy SX,CH>wiY ZA$霕&YF~11mM8al:(ev&|*\akQfj'QVt) X}`6,04(S`2\f-Ԇ 3}v1UO̾'ʖc,.&hȱ`r[j-Jtvvwd֬{y'OЃgS;/|dž;'*_Ɵrrw>Rj\~ W9ćn*[ѷJg 4%2Ye*3sל 8bׅ04N顽U57^G{,]L>`b7ޔ}=}d<%3d8Ao XPHSsyCf_dyMC몫D8ux̵]ZjQS(gVJcK[g; IO[xj& L Ň v/AsoPC/c&?QYPw--5X[lv(`&hhLbȽAה'"""""""""""""""""ZM76Ja;{$""""""""""r,P_)fn",311dvo$:u0\fa?3ʶ ⦑ n!KX"""""""""""ns}N={6ɺMLe}F~t_q5TOa$+}\0˽_ w(UoRDDDDDDDDDDDDDDDDDD-3s;;+DDDDDDDDDDD䵤0 a%WpѪz:Υ%Ua]_۷-wy3P_ uF [1DP\""""""""""""""""""/؞{Y+;e"""""""""""3)3Fu r)Qcp `X?ؖch,_܄q*$L?fB & b8OG*;= h=ܾ;#}Z: ,c8`#QDDDDDDDDDDg ¡?#s)]zkN?yX?kͻgySMwomku5+LゐELڕQ/P(1tgq1DDDDDDDDDDDDDX,T+fͽ[6{urA,xCU"rX],""""""""rL MqW1Nu(Rr L2:g6<o.d->}vVs.om-x_|_Ihwϧi^sBJžx9~yEh9?4mm4:8sS)vd:?ԷMdytGSsl_a"~CZvžށ8^5gL\ʂ{eco/~;k Eg gu8ҮkRqᲦ4?.DU䚑y}c~ɉ̟~ݽ=be+@1 ټF@`-x*1iJ0\iCO[egs[;+K^;L!^琞@y[DO%DDDDDDDDDDDDDD^2z\C'LXd*I̱C"r5:ʕE!jbΤ̭vi9`p Äy1r-[Jܕq!q~yif> l*F 1Дp9۳睷ϘDm"bs??l}Hȫeq7ɚ*8ԿVbtGh):LI,ƹcg0Q[, 7t7% i)t1,K4" ɏS)U!?3pvM%Ut@@pזBVxC 7qU;6R4Uqz$(uCvDDDDDDDDDDDDDDd\K4c+V^]%Ϧ}w7.s!޸d"~! S-?ȗ VD~.q=ţr{500+8g >1.OVKuYQc,Gl,{0Â$oq RfW'yoCS+qԮl̡FQmN/ y6ia|CcciC̝%+[" J\cXӭ1Tk-Ў0?g$yQƗקDFDDDDDDDDDDDDDD tď~[~}\uSW+'ķϯ0LhKvV^}1z{(T'R'zATx$1_DXD^uoc{Fl, u-q䦊mX{;įɭ̘My8 z`-t6RS8g9̮@u ;) O{Zv|;R @Ccky:?nyCC9ݹւ:_gUu&w<:Y(N&1/{sJA|Ȥ}8LԻ/{6ڐh97ܺl9 )5Sn{<Ο4ɳ<qάMan_óC&39-QDu,XϷ:65 fz#j*hٺ!wx3>x5y1g5?{b@~ߙPwY񯓺˙2M We=2aD <5`.hHpUBgБ;0:< "ϏWϏ8X%kq=vĤKg,<äTY/4gVǘ- fM +_|GWՌG""""""""""'Ma|9I!][?6(.-xjcW\\ǯz: D.#f=r"Κcv(4nYF.8{X`W=J8 zX̔8Ͷ5k_6n&?'"sfΞTYtMRI^ X87A'f͜ŕ-UKҩz&U53~ u}Gt2urLKa~B/K˄spSv]JȏQ{wȄ~MMqjÐ $p qlB q/Xj.zvih/\Dq~C!Y:]21$B)3Irq!L0>uNjo~JLN;~m}#mIu3IĘkmb™lanCAlhΡnvS̝}5$aB?АIO`Fv"Ѵn?1h!HҤb ⮇C/mI3~cPP[LS&R~κ#C8YK1 t \Pc~ܲ@k][b.5a(83)zC|u?D6&X`/4<74e[d18 {:|LxҷI>۸O\so,DDDDDDDDDDE8_وbqt_vVnWӎ㸕^SlP G#wqb1s0Y"̷gnJp2,yyv+}Iqvj.ȿ-#-kyv(Όs0z4.u ƿ~SlC{gNbMg0 ?Ke @kk\Οr6v,>>T1kڥ\5{ x :Y[il#P3 *G#Zgb̺C% iN[;K㬌c0:;˚4M;%Mrc @`ɎgSI>/7z#0!}L|AToY47=&|C@1Xvr&NNȂ1$9~x14^ʛfrlb۹w~ OnvwQtȇqsY[$p ݃}8I/ c+ֳ=}X!`Wxj !v|,ݜsΙҍԹ0<92f qSKKX,= 8Xrt傚8grGOk-k0DzȗS.Rqscr'Nj` ͙e\Q{1XbhƑ\.O`go`9+k gtG6_[F}{%+wr]Жa"""""""""""""""rN*4i2i"RW=7|=Ko}<%D< U4|k_:~s| w?‚+b揶YMt?ik͖}ҹ5udÈ-чψO{̌v8o%``Sg-xA'|n e(F>w=~*cA})>Adk-AX"4i\'`p8 /Np1.bn (V6zI}cAQ|y;׉sl aل~9k].0x3ϗB"waf&%î2Bu؈OsmUw%=jÀv^yQ>1>3o24̮IpyʲgPHgbp+HQ@ֵ| } z.­ 4ȉ(/""""""""""""""")Qfb7\27i%c0ÑH\0+ n"`f2aS{=gϙNmCO7iL0DϭlxYV]"2!9M1:ea~u :cKQK؀Ցr }l=py80nYꌡgOWFڱGE'[ %s $ԪWT2P`8{~ϹjNwO#X0RnlR cc%gX|S1D8dLtlS %;`Fi#6)l0YUq.Ke/["[{1{3tʺ?΁֑I#Dǎ ~Qb$k\0ގDW7$,:Xe`5xX1ۄCa|ye\UO5!$H& UդIx.yIXFҌdDDbcZOt VV9u :.a;YvtxWDr%TyUM6:JҸ Ȓk-#+]@8p=`hq>qI"ƙNe+f RXv=su[WwU+Z~Gybc'EF &>s.f^m=(G`0 "djVF>N(=9=/!cE6|\TaI:2k Z` ELr LQQǪ$7d]65Z ǡ&rUueuw 8M[Wr5tdu*u($B`{噡|e#ǽ?J`l!rIKgSׅÁP=z7+3_FY5.:m~xw3`"g {ş?~wyr[XXufR9gR9r}<72X;WǘEĶbD)dF!|C3n/5mOyu6"Ƹ$k0=d!D*F gF2VwÊ8g8Н^X,G$j#g瞞ʆ)nLc~oc˭SҼaX+֔-`*j+_< .l>]0C_<]a{g""""""""""/WADDDDDDDDDDDDDDD91UY$1 KuL"J +X~/?{uڦ)>k&EH,>n=ĮV~qӼp?>V"xu\j&G/gy|/#pI[fK '"՟;~D8KbJ¶f6.s޻RZq:a&xclӚc Yאr5F->D*=倧{l@u8.5þJÇ 0%r`Hd.\>ʖѫ<糼)ƴtUda_m5CeCrp"چey﬩,y l?}9m0e!;-Vfř HㄼML"Eqq#y\ҩbQHdJ~Bpt؈VF!8:qIWpf6;j]ʾ]G\뚓\YA_H (}~11;'س 빼9U.Nho@X?b#(dG>"倇r q1FthlbKko$niR0~@o9"8,KpcCw:}NJ-Jܙt@m4B281`ˍ28ף]EvZƾ? W{gG>Xǐ2UQg3PNa|9yaCٺ 汊.K-@oC=|͗T"zm>xg/XÅafj3qlY wmeݓ{Kn|f,:k:- Ycc'ٯ>Vʢ-,i:ؼIZmG-v)L֓'0*S( З`_5~r LeјB1˰]1f' !, C>KW"ˆ"}6d]>:8l1>糭@@{cnҡ5Y6#*u+o][n[ ߿5{r>.ܿeY L3?@W>wָ-ʇ(Og>aQ_vAi?* xYHGB)b#v <18AȽ=%! yHHZKBzl^C0egւCkZ-CX+ .Rӧ3nvIsK ."""""""""& IDAT"""""g2q2UUUEcZ;V7N:&ZJC 8.dt"Q|nRx%d(}7`RvM]ŏ6HD^XPL/Ygѿ~g7W(kG܋QSB""nhrcH9FP0;Ɛq b2౑W3c\bnXLEd>ʜk igEDDDDD/2J^kfy2f}6:;|o}l^NY8r+Ɇe UBJAJʒ㋂"5Etgx [P_L\NY^/Lje$ߏQ+ )ʕZrYBk|fdT1G.\R]53ZHD^0~xDDDDDDDDDDDDDDDDDDDn53P*WKKM n@GW_DDDDDDDDDDD䴣0 DAr@Md=Zb*R^ c .y<}d%E7${-H}-""""""""jxy}[DwTnӌ"""""""""""""""r$t c"yr>nCrȫ)8ز>W]rn41HEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD*(/""""""""""""""""""""""""""""""RAa| ㋈TP_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDWADDDDDDDDDDDDDDDʉW4q"MuH_g;m}ʚ""rzH3M%kB )N3Dlְ̈Ϧxgر 2CAh,EDDDDDDDDDDDDDDyZj3.'tmӦO>aoͶ}='hI2ynbŬ&2 Zyί?p1{΃9""9i\.M_DksF~S9fb.HԲJ[_Ӌ1(s gq|[aGx@9 SCgxb"""""""""""r2̭Eo~'~*'r׷'pS ,{bvCǀ K\S>/ȁ U3|wGv*qu04Op~g'p ذHۆ{?vP_DD^%Hiuf9'VK^AʝČ9$h{ *wqZ11q-Kbu+}&%E WG8Lk]9% ㋈I2xF]q3z-,^q}g*+`$snbBn~v8R.=m6|ⳬ'FiL6 'gBe-0S3ӷ2c_lϤy켷gY}(_RDw0zJJzt?WLeȇktS=YL/没]™;[ʕ;Rpih`Jlr ]a[G 4sn?\7;\oX@T#Rʳg>r w^Dۃ1ϸO'aRTzPDN1)ZUNr'5?QjLSKƩ!dp)QɅ} gpMɒrȘ*h$1dbS礁"14n=1Gȫ"""""""""""""""rr{6o}w?s{X?>r y6Wܷf8Oo2 f-Y<ARNHTsid];e.+V)X yM tJ~/2`ubfP.{̻:}iϘFfobyr2۹;p8leocq̰c@= y 8;BP!6zɖ"˃ T6 ɤ$=SףIQaNr.2i(GL&qg15G9whu$=|SyCjpC]̅i/=ʮ`c(/"""""""""""""""TneLBPA{[!Ʒ_ǂ.oft ^v6$\ ɴs|g䡍ke_0YI:ٹ+W5WSr<4/83RקB'-L٩k se,N ②Fcņw6 `ِ!/{eyyTvn49DfNbHk-[d>s=kx;^YʖMI6%I1H"s7Muo} qѠH[yOUݪ:U<k'»!9^!'0-S'w-{*}ˤq)gi]mŧ;7.sp22V/"gK!v)2.?B;[25z&^k8D0y YNW.Ӟ(pbr $]]EI/.b} 8NgM*?3j&r}"t{.wj,tSeeCb Y}V)Do݌\[zK0z8G"83wC2H"1ZY/3'ċv.fU ɪu,#Nf&R)`U7Me2׻~\L79|[hkⶑJ͋uq0?}Ï]I285HƦyU}*F}Aߥ#MCC E)'| ):h8/pMwitbP<g]~ϑN$Ľ,_(l쫜 C噺wR 1Ƣټ/>kNǿ2&Is-VTNBa7},poәM|CΈ1` 9V0fb&XSSXlC+)ŷO]z˵č! ˓P(P=U̶|-쪜bBq2;i3 )|:J!Ʊ̶Ӥ&( K?_X^ȀUn+^-bt1D ㋈ϘK5DaߏH7_IS^dȏh}±_ec6&*SD0_{av,R_EǪG1Q{x_um<fgeL{B:>ƦQKZZ&L`S#p3QpYYd(거HR&!_u?ĬFf&m\Z  9^xiJEɏD;y4}_].""""""""""2(/"""""""""""""""?c*ˊKK+\o1n ' Aԟ  ȸb6O_a n(–""oB =fbm3=+A c&e*|UiyVxFTTcYYϲo'XnD&Vy6BLS07~#]6s~Hg:+ؘ+!bbtXơxvsD(hw:XD'T|Qܘ6KhO+\vSQVxQY1IZcٝl@@0fjަY ,q ϜKX}Qao>5dv@XY0pb ^}E?¸dm-NţP(r| Tfx7/{pۄ *("oK֞Ga F;K_8X:W6cspzu{2ED\0#ٖϾӘاXdZ[*l,p"<E}(o?rE FfvvO&us4娂cw*A:qKڞE"*V{ oT .ubF0^n?`YFMe@Qcs;# w!m[hbS0Ee*K~S0Фi;HS׻EDDDDDDDDDDfEDDDDDDDDDDDDDDgnKgsM/}9"tkO=5J? ԫs!if^bQek^CZ3(T[(~V-%dex+LDi]IGxGM!B0}Z-HP|zʰ0q9}KBq/x>2ủ]J. [<)&""""""""""" M,"""""""""""""""6 8%Y:4pGxCO\iQ#0sYn?2#Wu5`mc˱s׮yl{!k3w0qO`M½˒ISg(Vr^^si'!NV{Fvw~o+CQ1L8?*Fq"c88N4괓5olzj,bK7%:lؕ,u< tef.+0NNl΢kB̙Oc]"; Wvp0)O|(11]9o;h4o4Z [ޘ[ |/z ŗb]l+ ,K|n~(""""""""""3-[DDDDDDDDDDDDDDD~r={ a:DZVj7}׸~;^dOعG(G;_8-'5wezav%Xa{K1goY![,11mN{=W.֜,\̲b*O?7-S\s!nCe10FE սcK='DoL&g)vR"⦎LEYEXG K8'Vo+8yMY4Y'Yp'o>W{5dh%"j\#I(yP :g=h4 )Et8-δ)D!6qj6S]k>1>|ֲ1yMb,>ͼh-bMFg$""""""""""2޿싈L$Xb5/j6KXŚ;~O/f|$lcω!*Go.g[>NYt,+Sz_a.Ǹz/u?ǁ%^G7-I[z6ByN>U^*t0+{-a0[+~!%{3sRvw='~ʤip _ O>LWl%NI+M c/fCsQzgN\Vg9"{+@ݬIcI2|Lgl!+D=l/=O6yK-v65-Y{ FJq8X8q#CnnVaZƚ4v9L҆8=@ VŮ`eNj~rV= fݪd JT^?L@ʫ ofaFc5[9xxQH#R7(AZ Jn@oqbݬOd~C DN==_,d}Zq:][˚x/#grIa|yLu~%, u,XuƐ|؉!F((/9g?}ޱ eJ{(^qOW 40a#_cQ""?EڽK74o>6_޾ IDAT2;~ /w2xa[qS:"8= <"PI2>VX,~@F̾|Fo񠹋kogn%*`IL3;g `[?Ʀ& S6wXA/yBDDDDDDDDDDdf9UkESs3>tY8vpu,fV[L댞nf͚ʼnǪ~ىZ:iH 8Bڻo'ciˬac_׬t'_}Q%"AvmXئ:`BTyk`35-C1Ë SdIC9e<<%$~. PkRd43^ +|?5eND#C鿡6i2V)cGx$XG‰,a?5|ED~^Xp!coo( NoU J88ʉꎷQz @u;(FG- (GÔ| a4p0^|!~4`^6shf):svm7+$HnD9F]ӊcA.w1ADDDDDDDDDDDDDDDDDDD~LLR>0G9/""""""""""28 """""""""""""""""""s}o=lj݇ EDDDDDDDDDD0;ʣvU;ɪnyS_DDDDDDDDDDDDDDDdBNu8 """""""""""""""2J&jΛ_PGxYDDDDDDDDdF2T7ψ1Z7NWXDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""Uyg8M6!HO$.ADDDDDDDDDDDDDDDPO{{ #WωS """"""""""""""" 72myEDDDDDDDDDDDDDDfc,Du!x'|'J-0˲"0$ #:_&,&m#Autbtu^--N=½' K,qrE4wm6 0"~&2`0 }Yؖ5]B0ڶ20zcGDDDDDDDDDDD0 asm{U]2c aP!xݴrb$q+JJ7gieKR?~Ww`j'>%J^ {r1T0NvڝcJ6Y7x7:2m.NtFˆbx~2ƸYK6mE%_XWK!`Csf}ecڦ10BgK!`0;7i_Y h'}j7{dž)MbfVw^Ltm1M_PDDDDDDDDDD=Ha|"1ں:8S]27Mk\B{:ⵧ=/l8Msv*.1w]ng*L?i&k7950ob8N51o-]¢Ydݐnmqb2"rZMsIulDoxu bE嚬ˊE>_e#Nzre9pvctdkrȠZ\|:R1>gc 'CW6ΆZK|m‰ ~Cv5\v~Jfp |cX45fM1x_LDDDDDDDDDD=Na|vljkkI$]3q4w-gWsur%˨JϏxX]Ʀyug;׵3T44tt|+_ =B 7pׇoҽ<'w=\r7nnUl['y/߿#*;1o-=OsQ1?V]"3mY\\7\=^HkQ.Zc6Wf^>O:ǹ2x?ZwlO\>P \pI}c҈wG&XvHs+jc)ܗ D)ZJ=֦u:"4p #o=(/%""""""""""" ㋈PW__<s.~?'qE+Cزo6[T]xō^N9|#'OP4q:lw8|}q`د"jYqjz과v|oQ۹?qnEc=o)p)".^vE- %1&$Y^VMö$0(>Sp0cp&Kw~WG#C2 9O cc2>P4`avXzܲXN/G%]Yv-a|9D==ƽQ|drhmȲ#9V:]zl;I6; #n;Xxr4}&%l (AuȌ0 yg? R)3O3ڽ>E}aϼoQD׍|Nm_ҷ[$X{3M1lR*zG[8N[hRy_+_b?NM&c͎wo,/Eݮ/縦6==r&,mu00ᵞml&o.Kg[0,rj5681Ve1R='wS4]-XϖO ?/*Wc)0߉2s<qGƢGT,'٘[ .H6ǹ*/ x0R&U(𣩓@qf7#b"n03 79\5{Vi kwOS/8;&!{Nc4ؑ1uمteaB fؙsebeWq0ְmEcҽCB"""""""""""3"""""""""""""""3D w\3S|'xxf)jg~H~n5:St.r`S}\LC}s3?a/[C Ez7D~>MX""P?W vu5pa|`M6њmc~w}秄-j/KљLBg ?BԳtu:?=9dRrDf4eED@28op"24,Arb9|%FCOk&ҸELD ~>no@J@aYMO4x9or^psaud_ֵ&k+-'߼hނGTBGad5dc2-kXٻo+Gձ(2 Y7IM ]<̩1 (ddȝE`RvZvyX jSʹ1;So ҘPհ)獒 v2̮{a[@X ㋈xmQWW}_]2cDAb2u'V杞͢K '9r00)VO%i|?ހu\qlOn"k vF # N(/̦xf-J,"fE?߿9ocŃ>F+}=M.io,nஹ ذR >Ή⪹+L&(oWX9}eܹp5M;-=Ύ~ʀo㒅YYO.6\ 9P ِɆ/,L 4Q3F'ۗ5%-;<7 MFԸ aK'm>^b?EИKM12 ]μ}*A!gIߒ"Pr"%Xc<6l!QL N=,om>Kʟ~.ҵhJ s{‚oL (V&>ntVUL_~g?PS#bo ON-`}Ƿl$;LZȇEc:Y!~9']Gϩml E{z9=I;'v2%QnrC8S|!6' :nHZP"d6  tG^؆TX)<\kVxhBxTz W6aۆp_o TrW}\lnGn#1_䛘u&2:4{c+si!F, ѳAc}[xy2Vx~ߓp;],Epuy(/""""""""""""""2Cn_Z"y^S c_fHIJBn"cSH[`۹w6Wֶ]ɘ7̶M\5疪 1 +Ln,+FҍZ61XP B Iҙ|"$MZRM/q8JOyY0N Vrc~Ƈù2_!:iX\3[+<1VaK1`|J("$²mnoD<>\/"Ef t4rKs; =קن JaP|٤:0V;."?*?*0Ӌ(g$d/2V.NG0{2:9#85>eAJ*{8bR8 UG+&ESw8OFDDDDDDDDDDd&P_DDDDDDDDDDDDDDd({G]]\.JTS̿&zC#_}y@O8I̯ҭtUvkc?wvcupWw±l:8Pwݍ71~6j)m,,1Sf'rV`nP=D(!g[N~zu 3 ^/<_7/TJ*VY,4iBLy|2Ĺ-m{|{48lDy'B^AS1~'m.z;T4iz2\T]~<+AG[[,{|c̞$oQ`09 {i\Mia Fi/ªGO>ϋ _Mv _\p|/OsSfT:$ ㋈Ȍ0 Q<<|sz_PQ\!ªK0w97t3]w~B,'"xe-<ش.OiӗwQ^zUDޤ||z7qռ jl#36Ȉ7F9N)zm, P;A?c02PiE V"J@rpe}Թܘ2BA.p]hJ8F_80[ #ӜЊra(Vi}MC1f>_|H!%׊w4&@m+}>oGC2vL5^ ;i%4b |Vvn$44@y|bT<bqB4eA"N@.`|̈́L{~X՝"""""""""""3"""""""""""""""3D,H&%0:2\])sggqW17Բ]TB0㣹iCoVv?Cnh籯~/V9Ic Z&{`}erF!u\^)C? 1ar%)FAqp;± QRy+m1#(GuuuaϐgW-jmH)T}q˭BU,ZRqn|c,I4B=Oq1QHgL eEDDDDDDDDDDDDDDfX$ 24uu%}u/NCx#{m'?Z"?2@o[Żn//}S_k>/p|lUEDNq92C;0n#]5 $!̾AK9EËn3;ȕ=*!SOtC6YCܜ.R{;&M]"4cY;"Dv%"Abn&Q.aܔqb-ow[\0l/z<l\82cG0DE2!nq7ϐL4iv0{Ih\? ȗs*,T0*!S{t5̣eնR&|42' ٔ ȝ|QDZ9D!OW矽rifMƥ”nYkcZcϕa\9Mc}n~܏(CkX<3>Ǎ#O04.YwG?|-_}&FSb<ʩR ?g&j0LLrAۜ{T" NJZߔ~6I-aEM??|fƩnwFY0&:SXtL*cghHavG~,Gޫ|7Ĩing¹dJl]ç?Ҹ6noMs]gFi]֪ Z.QD墖 r٪޳"RJ] -na,$t!Χu*ͫYW[U4 98x ,|1-\78,˸+G#\wf G*xgveJRS}uȿ'|8N/k'_C /.ĸ>\hh|90yS&8ɰCsF(mϰhB,D9E1 Ig]#;-/˓dT&w~\L Kjc~/s8yQ m-#@ޢunR7dt,\2?+7W緹ܬUxE&챇5%,j_nd:)bKF?wXT奣/ױ2>f%ISo_bwꨐ] r%>7]l 1/- vE)*4K4@TeWƑ\rF^tra3 3_G.BM@T ;XOȡGXGW*A1{=G8e r\xDT*.0}6ZR8!5ǙΏqb<=kj%c${Ǝrx$I$I$IW$I$I$I$]%8 :imk^x~U#=͓ F}ϥE"Cot,0etϊ glyIT?KC<>uT"E{R=W$I$I$I$0 $I$I$I$I$I$I$I$Ɨ$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$I$I$I$I$I$Iz+ $ s Ύ0Q$I$I$Io!%I$I$I$IқFlm "Sc MQ֏$]t9P^@*Ƣ 9*/v XUwrK4[O0Y5N$I$I$Ɨ$I$I$I$IY,J[cs嗉-12],#1=|C\ Aścۇ}u7M8AT8sms'3u)ںgMRvCN0]]8PtjhX;VLoQ@1~E_j/ e:W;nAXJS;?a۩b}YM}7{:y~~ٰIGƘ `>'?lYt $I$I$I$I !8/ RXD%#Tmؘ9g?Zh Z !/,x/?㷑_&K Cߪ>:>w30yՒtet7{cc4LP[mG8uz*lX=Xg'2X~9IN:@1[61I!IRg?'ROu og9@uȶtc'r0ؕ gmkkPf'53I%)Q, E>nfU*Of4+}\MslXKn;^K$I$Ika|I$I$I$IM ioKPΕ hw?LQN@T<3J&n,|s*WpBV2IuI3Z $V1>_.QˮsA|*\?ώi =Kic<ٲL噧6:@"*)k1׳y'J/")A4Dп~Ceb-ȯ|每S/8uQR.GTvFXJ2Xx%CGt,`lzsACȗِi`j137BsU$_ќ30Rhе#Q(M1T:cq}O?aZYݵd@v$_.MrxbUf+dR3&r:R)a4>QTft;E+xuH$(fwG&$I$I$IW5$I$I$I$ V\$nݼmcGyjxԙk5yA+K'4~_o1!=+? \P.I'X>y $8P%B3<*Ҙh b)F5 C&G\d[{5}Mqj-CG)(bʡZLZ梵[ j2!x6ˡmZ[?+S$I$I$]}^b$I$I$I$IelL,ª-U#+Aim%Y./>^ZJBT=7橗gEC<{b \ .0FDDzDflW]־Թ $8U Y)ueyʾs <}o_FF较_fvϙoۙ+h)΂d *QĢvK$I$I$]F$I$I$I$uSđ$ږp>ʭ xG9<2Ka%+SabbKkLLQ,c^FX&"ɋw2ҘnbY&l DjyJJ58Fql)W74=W"!1WV$K(ǧj,jnX4FךX0$KqQ?IR%_)[xl't7-Tc/%X{'748$I$I$IzS3I$I$I$IO۷3nfN68Br7Ѿnlcb$'O _hcGwpݫiOam,YBr{?ǁS#(M=mF˚{xF6oZMaWۿ3m6O_O\SȒ^Mns|>9)-+mBXE-M<YnNxgN;s+{Ώ64 ͂6w{h1cS roeO] =-K8x Tg˲n6,\OyL_g/h'all!)Ms,bY rNM4 N/f)ڹ}e+Wh,`Fq2?wSeܶzdQ(Yy 4N1b$I$I$IƗ$I$I$I$IW,h^=8޵x2EM9ֿFx$e ?we>obaÏ|o剁ܹPRз;:9Ŀ??3[B=,_>Y|IAvQ n%ؒ 2͡ݓG7D&'fs6aQ[jyw7syvrxoxٲ 9N mѓ\\u H:XٱNP"'fkmuZ@ugOlcWF,aYflMA,XC/Qm=iE5r:tΛ  Xdv2W;[4q]\q|xM^:`8gٴz3f )H$I$I&7iæRH__]]s{z?q~$I$I$I$XYKSSS}9O7XEHW8y #~]1Z.ɕ//Ӹ:]w1Sb]ބjVjܲݼG>_%iI7t>KV'PxL#IJU*4~sJ'gN I34UřKԽU4r9 qL@X,IzDtttjj:(~~ ݵ,\A$I$I$I$TO3pxSTef83V L_V:l}+E%sLwQ,g)_/ CI$I$I7H$I$I$I$I$I$I$IVg_$I$I$I$I$I$I$I:%I$I$I$I$I$I$I$Io$I$I$I$I$'sr9f.J Oek IDATl >$I$I$I^a|I$I$I$INc_ol }(2>+][JNf|: 2~gj$I$I$I!2/I$I$I$IUP7 yw/}sw]-}3S乡'$ EjY$I$I*A0 a}1aI$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$NA$I$I$I$aQ-E$Iא  Ջ 7iS;9ڎ(I$I$I K$I$I$I,cPTlj1 'H$B 䋕:$BX1ݻ^,Q,F, /U+Tj|FI?X빩s m*3G1xgG֕<75A5Lai1ez$I$I$Iou~Z I$I$I$I^ ¥+Xa-"l}a YTDv{^Ů݇_o^Y*Ad/.v+Wt/@ȳ_$VHOםor ,^x'nH}A<ꅛ:ǣ# $I$I$Iҕ1/I$I$I$IXOӹt6zژ9AmK͌2 igm KQZs/~oغ{B)`~fc]矾gA}=@@L8Ɨ_u=kHȑGWLn{lnzdZf.$I$I$IW0$I$I$I$I2AzouS4m`US ʕYNOّ# yI$I$Ia|I$I$I$Ite ϧ~ RB)عBo)VQOhz#GJ-~Mhw*VXj@TeƧsQTR.n#׼;>֙3{.n_}(O=_Ɖb il^ǻ׽M0|K! شFƇػ*$꺕]w+VwL9ߜ*rrY W;V9p).NJVu\8Ŏ} r'xô}1 R j$I$I$I0$I$I$I$Iz.'hj/M383J1΢F6?Xn n[T&tFKC_ܓ$I$I$M"^ I$I$I$I^ ]|' x@YfǾΓRR^^t~,>@.?CXx4M4XykN1/fhkh! {n7u-d+g)jVZT[kgutՆ(]ݷqC{7|aCû99%^81=wu_'[SkerY,9"}e@B@Zr\HД1 KFI$I$Itp]I$I$I$IƊrdsa,C}h/Gϕ!74T(JO_Ds|'38]"IW(VDVAĈ@ b(VW(Uk@@2hQjT.TK},u=75264oZZ?M5šT|ITˑ`EQjm_ըE CsEDDE3 $F,@#I$I$Iob$I$I$I$I?(iM?ɏήo<#/ RAh^33 Z/czvs_J H%RgĒ$ U*ԈI$_I(Uxr޺ LLZ 뻗 䱁At:ʮSO3l>EYŖyEy>A#9NH, "*  NloAx,v}qE$I$I$Ig?K$I$I$I$| Ewqb'8=w&~CsSc Op=HOwy[;y}9^!mM H7FJel%(t1Ox} ,nHEU橐ƎyՔi!ƈ*L*[H{*ַ21,/R,$)LT2,(ƶyBW&HdhIfH(%iL6LH0~LD6d}>=Oj,963eQ$.k6?~j {ஶFv|vtn0ύl|򁝜,ش/_GkXım/Toa+5Rtuȝ]+C|źkSenicdQβfNTi^@*,qlzZ7AH&!FAL;BRP=:_n/xjl\F<-22zcs( 3Q8QS#q%w-@Ke'(U.$I$I$IW/$I$I$I$ͽCw_Gks KֵK#>4/;R>}06gy/ɩ|9Vj|u >3J\ _gߩ<3:H4~T#;wcs9z᧺ d+U2UƧAF wij]\S&͂V %I$I$Ij%I$I$I$IҕUM3p1v?i=pҘؽziN_24_b|fwc )DS|?Ao|ѝg NfEjq}ӓ+Y޲DU&f>A$6o= +XH"dqɣ\ת01)嚝G+ܰ`mSrhd?ƪG/8"ggTGwP r`ji-`27ʾG'srnv_̟f -+XJC8h0<̗ˍWP\-p]$I$I$6$I$I$I$I$I$I$I$Iz3/I$I$I$I$I$I$I$IRxcA$I$I$I$ItNc"W7gu*yf 䪵A]"9JAI$I$It2/I$I$I$ItbPPcMGWreI8Rq*rhaIj\:_s{yU5I$I$I.%I$I$I$I~FQe0{2KVz.,Zr%T $ WZZX̵PbXz0NAI$I7LƈiIz]bJ$I$I$It%:zr-n:+k/g6Hv$`e Jd6\mܰ:N~ȤYݽLy'#׼$ =+OgH!Q!A8Lf5o_U!=hLoʇ<žow|jWyt4 esKgA̵?OLS~~^vnr'}󳍝 QM983Ekvۗ=ɀYTdJ^{?FGj,80 [s]3OR,N8G_|%5=ʻE,ipyIݒ$I$I$Be_$I$I$I$o~~~C|~_58de|}h+7zb}⏿_ywǎOn#{J?N:FK&ρ'\n[GKY~G?ʧoȿG?*I $l91_QehKКl"A -%\u_xmSuHd4T,%RX5XVbn=dAkݩ$=ãOؽ{l}=0sa;ƣ}n0sPtRH>k-\ƪV* $윝|dBoc78_ܽÕc žWMs TIѲ5]Wpgs'=`}HY ƞR bM,h[ƺ3/_!hӬZȺˉ&VbWgf ^Tev~?9 Ӵhk^εɥM=vjD2d6Cac&3ԫ%*$I$I$ILK$I$I$I$8/ ŲT{x߇bSA[ĝo,Q}MǁK}Z|/nL_z?K?K3ϱw=6/5H2r63K)<5F};J_ÓԀd_Mo<{#Hh&gR޺ m xd<89E1d)7s7bpp^* }gWo3 j2TgAB2MTe0T3zv[dF^cǃu <79ƦzVux,B0α;D2(WsL׺ńŝltA,<93qj%N| SytFY9ˇ%I$I$I҅0$I$I$I$Iz%I%zj5":]oczJĂJZ4#+1:{riJK8* 1aXv2KHLU3t[I&f0{<BWiB2M Lҡ#rcdO9Wi :^*LtDu i cnfC*bгΪ%%#잛zD9aQ+2!SQN$I$I$IpƗ$I$I$I$I*ZD&HdzٲmSwHA=:y' EѩA;WǢ _K{ױEErXL<b̕^.^2ՋnJ}<:X*@$I$I$:Ƃ$I$I$I$I+ RlW k W3dF3>2M(?%wwq71 Yv\ _~Wޱ~o yFrݖr]ogxthJtԘXv:2V*K3жřɱGxtjmh}Mױjͼu5Gs4]-,m&,vp^$u&sy.kbX+}m YDv;7>)m @2+dR N%l]Oy²4E<2%S,Xf24-~Zc1i;X_)qtvC9'/LӲdbI JnZaZXb2]WyBZ:\tWG'ySg?M6R}<\-72# 7ev"U~/c˲Թu"z'xpYOEO==ťܾr6/x\A}чoyƪo- beRb]MS>r|7rS[x_oi:O\Ö $ XEԣ9g|¥ ;7pc BB @t|~rH$Zh  FSK;QT 4H$I$I ӿD\隨\*l2011ɁgЁ$I$I$I0?ơ ϑ#CXѕ19x#)Yhete 714ų 7/a[O7\ygktکWrwr[OG}ҴHQfPJLyh HҚi9뫜*$h50_x$I$Iҥ, ÍeI$UWgn&7I>f/rƂ$I$I$I$IVY7GQ%=ϽV/6ϨZ15_Q=*3gq@@R%KX$I$I$IzƂ$I$I$I$I$I$I$I$Iov%I$I$I$I$I$I$I$Ij`_$I$I$I$I$I$I$IƂ$I$I$I$I$Q#cOs_.CnD8~^粯$I$I$It&%I$I$I$IN0枃o,m#Qo,K DQq<0=l.ȵD$I$I$0$I$I$I$IbXhaRn\r'/ ne4S#7IEZ,I$I$]HsIzAX%wX$I$I$I$I$I$I$I%I$I$I$I$I$I$I$Ij`_$I$I$I$I$I$I$I%I$I$I$I$I$I$I$Ij`_$I$I$I$I$I$I$I%I$I$I$I$I$I$I$Ijo,H$I$I$I$]Ȃ 8᷈(:WI%(Aĩ @G·c/ާy͒$I$I$g_$I$I$I$fA#kUg8dXJbzŐdSW~ZTa80:OEtы[X}9W,3Vgjv/F0T,wl[O>S3S_rV0A&@Zh4<9@4DXӽ%4ckyƳGx~l7s3kVI$I$It3/I$I$I$I^ ĂEX~--{~FNbIeӕW~b:SuFܳپc/ㅗ([>JR%N>#{'!{p$bҷ` ^Jnb}oMI>L!`M\ӑ羱*p/$-nu,gcֶ Cfyr @"U6O\\-[σGɝyI$I$It1/I$I$I$IYKӽd-׾&n}m~t2_=<5RhA57?1oRN0]XD3ݟ1).g |CaUesG()Z2 tSJSLM\/ͤ|n{ 1Vwmk|pW'Ig' ۹~u<lL׀ ŢEo\ekx`u[7rUgG3rTBZZ 7i6Eq=R?V6{sO3Q$5ױz坼c|mRv1<׬[˭k,%Y5@40۪=LM<2xQV>=t׍kj{:Ɏ?|Rt\^/;xoYH3I$I$It3/I$I$I$I^XcA3mTKҲ|"~lehkk%dWۿr1~w>_?M1ѿC~">c3_m܇?=j'wJYscA|Vݹwq @@[.k$^y׮:N˯oM\~xxV/v DeFE,YʵqsO꺴LM>x g6#:%L'pi Nva\3%$D }- HVy#|.I$I$ItQ  $I$I$I$I1Š& KubKk?8NGT)R)Δ%ա'_  |އ90V` JҙD&w10h=#T hn[ȂvӒ377ǞB ՝ kiD~z?ECcjuRx-E^/28gmws'LMLM?s:Nz:H_`3=?0EkvIjݕgX=jyƳP{~0ӵ۸-8̛dI$I$I.v%I$I$I$I+3<;A62?KA|H ,l#4)5JwgEÌׁ8s2- 61U5I$ IDAT'jG3?%Q_|A#;}4#fv?}73eqMIKI:7S|yh{џn"^piÓynjP}xw3`+ڻiM$E 1:{Ǐ2[kh >/Ǧ 45 ^vLSnlDA|amCv5#2<Gw2T0Vg8I:ITdRh ejK 02GRgn?¦ڒia:jgq(7K{$I$I$I$I$I$I$E!~/ƑՊ ︟(--d,iS/J ?qoH*S{?y6,G>7H9 كIb(T/W3<ž$x⅞jJҦ%A;pd5G\S$I$I$I0$I$I$I$Iz͢Fkg˂(e9 c|Ctm|_I}:FP)/) ,2$M(^ugB/u$I$I$I?%I$I$I$IE->ݬL.a3nD-\}?nֵ@e/GiW9.vV>3̇`j<~"ř!k:U-H(%I$I$I K$I$I$IW-jf磿ܲD$!Tw=&`]³ߣ:>Ǘ?JH,52??gh$XL*%9U$I$I$I$I$I$I$ՉԲ/ }Oس;=OJ6\~4 # 叿}|=?}31Rfv1Wᜂ °B%](Dt4ʉH|V(dxM5DByK,J<>B<&6QK*/,X̲TS:1$HH`yMA'9yam$I$I$I$I$I$I$թd8| $'g r?w̰'5s> uy&]}3g+gyo'$DtSP\Õѓ 8^`c4SP.27;f.H%2G=k eMo[^OWCRB4C<#<<<{I$I$I$I$I$I$5 jiiNP.fYX,@Pæ{'6C)ImmP ? _ mv&v=WM3g{G5u>8G3B QXGdiz$]&x\Q ~뚈#_WK Ms{5Wծcmݓ ͕N%I$I$Ig_$I$I$I$f TK!ky;o7=~O\&o!ÕT"[*P$K8.$I$I$IzCT7H$I$I$I$]Z?zWw0Ƴ,UMf&pdX@ Ɏ3Af^ Ig33,K*p*CX4$I$I$I$I$I$I$Iz,zGg(g8LsO -p`dzO_n;N!'8hmL&I#/PLr[J8=%ngݲ.Nk?lv " k_L_$I$I$I+V I$I$I$IJd#7]՝4ԷpպZ"^9{x"Pŗ>Uq~d GZ9^sK_yR.\<]Ώ:o/lhc>{ KyV7О& J~ e%[04C0aqCӜkڮ5L,0R b&Yn>8xũ.F:ny k0Fmtk$I$I$I0$I$I$I$IzՂn} m OwV\_fhdba)·?L؇Žᅡ9g*%v_=5wP?Z$I(`kU!BH!T+!0ŝʕOY!togjc}]7Jcb|?+u#]B T80A|I$I$IQPݠ7˶^yz{{YC%I$I$I$I?`HήUNқZ4DwrZSel%O7|ecM/P(rlv7ttAnYv x$MRnRnn(A&DS<a҅(DM4Q ,d/{I$I$-.dƎV7K^'a---Y}LNL_{fb $I$I$I$Irv#.\R!4NW$& ,XUW.@X&c4?W]$I$I$I$R I$I$I$I$I$I$I$I[a|I$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IĪ$I$I$I$I&G/T7_ƾK%T7K$I$I$Id K$I$I$Ie:_-+Du\{^}$MaYU$I$IzcFb_A_ Rݤ2aI$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$JA$I$I$I$I$&;֬!݇1W!I$I$Iҥe_$I$I$I$fA$J4P)Eq8ʥ"+vdND=\l12=B)ھ~*!]K,!I$I$Iқa|I$I$I$I$-=[qm >A5O壼>)fsMݤg^/b,8du{{O|G ԥz W0ّﰵzv?puڸW~[3<_]s?>Nse۾Ǚ-粮+h>H%Acj=r|5Hrfb{HG&XFS: Obrql)$jgEMk[ڮ f33 9>rx}NM譯av<>pHkgE*GX~3Yw2siV,I$I$Ia|I$I$I$IIo+{( bǡEn[Ued;wW/~{'c}wC|#IZzYٓЗ?]%IeliDP+1R%B,"(J@I(s N< Bb@<}u.5[O>Ka|;ʨGR4FK,fY(0Pin%aFwZ~Ff?-~A#KDTraA32;˲5#]jم?A0l. 拾t 3& ܷλ.-ɶW)JmxPdtnRY.lh KgsGorhz ^I'O@H\RhXrbgI$I$I^_%I$I$I$IҫT)'?7IO[W;Zy7ﻷmS^n7cz.㎷7kGGŒ$y&fψE@<&F|P]]>xwPt%5&1͝ƚ]y7=ɶ2ξ}2\騩!Bbnh>OX15$f%a#NYs󇫛(Ǚχ,O$EJL";|O IDAT$]t-IJZ8hIZꚉDR$#=q&w> s4k6M_c31,ff(FikXAgFVkUXP XJ03F,VCm| a5Rw F2Dcd,M"3^laeוtR.e # ҕ)sbBq˨ǨYeԮfCJZ&GO?'gNyoTh-.m*~԰,C~ni2=یK@tx7}q{( 2cL,Ly-m-4Xz:[Iţ =3?7%M/>93Pvu[ };9]flfy4{~A3k7;[^jАTW/k Si ͳ?Kt#7^ϺZ9C"v\A[, >lCeu'"a/z#'9 {#arlH$I$I.$I$I$I$5;o0*,|h \ۖ+'<6ii|d2Ixh_H Wx%=R  ,~ܱg Uɕr.{h:5(UjP]PhxB20P*(K,(B GD#IHd^dd^fZ]BڲՍ̉yRi cDo1Z:">/g"'Z4u5e&&Fbq\xޠv%{N_gAdss LP{_^MSlbuœD(/,Q(γLh,kh$ dqf'Ū%UF949Ŧۏ {~_ˊۈ4Vln!?$O"$I$I$0$I$I$I$Iz G]vsz[G 8d;[KLGvtZ~-q|Sw2'K$nX# 󝁯D֐|1{,hT2aXX.R *T*!H'Ģef>Hylki"±wa V7m`ew;g6Xу'y %FC^U0>\ɆΕD298|,oXF2Rbi0;89GHAf_ /Rk[~?ȋK,, uI _(5u,oj0$tw=,st6{c.08K|*&cTXX:L KO{Wg]=̔.ސ$I$I$uD$I$I$I$I.0b&$MӼro{l &KE !^.R()bGUJs8(ѝ}!juJ|u$P +g"(Jbu,?=AfEj]I{25,k#;C-B4@Rx)Z.;]axYҵXa%]U[;0!뿿X3˻n. #bHx|X`y=Yft-+:`Mj3g:  4%~PB9G=t,3ۉV"hCXfai_e#cI}=zh&P\g~6C ]m$ϚbY:kG3C+ (X,.RiN(h=]rŊ-WyqC읞p邺&ZjbYf&OR)Zed0hHŅ!r <$Hǒg㿒p\PWs}@]M s.<ʲ{RXqZǗw|MmwsÚh`#c{iaYCWm3>c*kngYΥjAoG|6ۗQ:n+^f2 22Mͫ%H$i,KDSCdhx5c#OT}1dflC+ٺj+-c}өNV2Dl榍QSYFc[azjI$I$I.K$I$I$I$]~9~yMuH4p/'V{|sן?L&R~o|eb1J>gqb.X܋_>|m9KNerK%e%iI/W.4X+M,-R ԦVyT=#ۘ﹇U2ϏŶ\osxė18?E1n:Vi=tklL37D&Z{54x xxqro[|1B?{h&w֮tx1U?N—z 8UY>ұ4<ĿǻnZy!~"WÁu ]HHQ[\~!.Q^o*Ygp cdJND%<@_ΰR b:T TN0;,{zRrs'^gyrf::[9ϟzNS,M>O܃+ ~WU@"6&)ԕ[:yv#b4*T x]Л :".08ŪPZ\C.@"2J-K$I$I$Iz5^D.zuXeY[S:xNUw$I$I$I$E"Q:SWWW]:idxN[]zS bIHBs,/}".h9"id>? OT$ 5UjYVn(A$A" Bb)Or!iUvoq{~7~>2~DFĂ rYo Fo!_~ 5o~׹o(>3:JX,E"r^ !R/$I$]LP`$6],IzA.֬]K>&'&/}?ؽyor<$I$I$I$I%,L1>1* 3L,|_t>a@H5Ƿ fz}wb>W\Α/޼A|Vom|32{Aw3c<{h"J ҥ abq\!c_$I$Is1$I$I$I$I$#3?=DMws;6R|P+w[yS/M]X>),2܃gbtPC$I$I$n$I$I$I$I$,OogrYr-XLJ9<ɇ /,/I$I$I[a|I$I$I$I$IқNc~?&,̐.\$I$I$I0$I$I$I$I%4$S\n$I$I$I$Ɨ$I$I$I$ .o&3 M! DV7K$I$IoH Ӓ}-a]U$I$I$I7x<^ݤ7 ˶2_e4]]&/lj^%I$Ic%I/aXݢ6I$I$I$I$I$I$I$I K$I$I$I$I$I$I$IT0$I$I$I$I$I$I$I$IU K$I$I$I$I$I$I$IT0$I$I$I$I$I$I$I$IUb $I$I$I$I$ DX@*!0dPfTV:kZWQT;UJwҔ!3Vw8.JxLvBOYI5tm^KOW ;XC$I$野a|I$I$I$I$I_ћb|rxIAғ R|bR*A$)nB sK|u(˓QZJB|sxDX@ȕ+.DiڰM+k/ dN/iVҒ!,28l6édJZ!Q 0$ilM7Q[Hj.շl4νL,^$Hs]4aiA抧 ]GL͎;144_Ŗ'x&{ߝ u}w/0>{FF?hA>z>|Hk7KdvFA}7Wܸ8KԎ鳞j;zpZ:;v}WUw! D4ǀľNwN8v~qņL! *j^?vV hΜyf"|j'5T/'P]m`׫'47r7k<%~ISr]RvAfmy'L{(=v[ZNa|bԚK)k>ýC\sn/fBu>>d$Dw16!~ /ż}$x&3_c h" p?뷵 ǏGK;_%^psM~(JFXp,E^ ]J 6p`㋼!ƒd5LTNnC$8Î_=ƆWNcʭpnj^_R _dk IDATϰ>}g<8pɤSAjys_;}ɬFέ0χ˥xH_uSy]WPtGaҭpӍ3QGV ]L*Nmy'h8[J˹UL[Ɨ$I$I$I{vZ$I$I$I$I$I$I$I?yk?g>JGyI nvdn^Nfw_;{/V#ץ6v1{ I8q|uK$?hn-$IG`u1MM$x[Uu0ƒM7Iye!'UQfje8EPv0cpL CGF4TA wi¶m"gs^Rt,IM2C: f¶x/Eu8)E8Ip !e,`&-yY:oѸ;Q_Ou~7aBi G\Fg7җ1U;FO~LMWר_4lfw^.,hFα,ld }$mE)pk454$arn .WgH1"+QՔ(Gg61GM"D}8\{"r ޡʬ.'-]xvq"kVr5ܕ ge[Wb.aڕ̙YA@R8AVϢv6>rKW|b>~~k_GR2u_Qn0ǚS9Yn\V@7yô*1%#)GM@qP2{%},v6J^L#q:^dH_GNj (*x\Lt1ˤkԑMԅܼnE&^ ꤹ k EnY~́'1s2wXF(_ qonW~n1}rT')#ŠJN/G(+B-7j1F;yq ڃsYsl[ ++?è_)nGB@^SQ^L/%0+ WȀ$I$I$I$I$I$I$I$I$I$I$Iޖf’bɸ".b-mr\ʼ:BXq J9ieG ]0[CF8>˃?>ą-{4Ek(w+aS_)!!Ik*h<N,8u0%|eX6[m5iER;[gKX"CPa1!Uش$-ܬ}q+DHi4ـ'8b'\:4-8 x7E[ǢI,1ڥs e>"ȚU&ճ~ >o>:ӛL!"Q&y qBz;އE*ʙ6ꉴaS3YbNN[*SquᣛcVV m)x+RsTQ/Dwq2x]vŠ7??yE9Ǔƌ&'c#W(`̜ffܢp3B ?@K=@_f¨x,D:g$3MIwDʖv~e'_CHR}Z*N=ÖSWȉZ^AEN0S}E̾^nY`G"m!un/s̑&݊ieÒI^xsjpFunhXVLJM2Ɖm ,Jl`2stD=~]n> '6bx/r˒"zvnQv PT! sa]h{I6.sy'sy7V2fZ?-W#ӧw 1M{!奍'ֲٓz+ ~M!հGhtg"ޝ5C}@$I$I$I(,I$I$I$I$I$I$I$IһxSw/f!?Xn ny*74_n~D17Ev먪Fޤ @seWV}n3,YB5peyfPPnk')!tKVa9^D @DjZŗFǂ ۛDeSPZHn3KwG1lUna"j (,ã vE8P0~!kn*H CW3̞^~d=pݝrJլXKpKnP.;N[y7OclF( $I$I$I%g-I$I$I$I$I$I$I$I_J 0?L~@m/_1|_t2rS<#hIGT֭3reHS4:o*L-F !2DB9Xh!cq*('$`Bx&#*p4ea[1zzЧ&i¢EL(ƭ("´o`)>"} #1m!t LG2u n93=hxHy~̾~}lxv77q^dH/_ǍKIl`z3rGP5ECZhN⚥ٜ|f"CFHFz{ɝLٱI,_Ÿiټ{ tO6'1kf(`3z-pI,V~&9 fB^҉1Op)şEUK6u~s|sksobj\ficػ Yڥ j< nkoψA*e(6ᆣly9^AڃbrM| MI~tmw{V`8ϳ5;5: UwU+(=c=|Tf/AuT5|}{O3m&Q+Sfǎ= \yd&f:lJՌqD9qp7u^XiR) Đ몱MR) aCOPHv 5Xn//b{’/S[8|@s$I$I$IG K$I$I$I$I$I$I$I.;jؼfുO4-^wpf,[?`2c:Vsr蹗0HɔiiMXty?WA׆_$IR5I,t/$  6Ceq%h'9sQ5Kkb2SNqlfzpzPD`"LiH*|;Ωo0GC p >i\UYmLvĩ@s,t$>S&=4aT,jL5&pA|!d ^@ A[JWS=;K1`aw**c*֔I{scINz]Ty,Hۼ5 ڂ2Jjr]ye%uuNtƆYDMS#/Fi9"`(EKCmԷ90t?yQ: )-*!8Ls"+N,=0m7q@Uu GJT Y/&RY$C$m~r(-][۰}y r3nBͧF܁JuP3vNPO bx3b475Ӄ?L"HCI@Ws(.YFUI6^`aR)͋ ftT.#>E]hBwROGW$ՋS5Te.m٤Au5]Q "Btf^A`8Em iK_Ǣ;^a߾*9&2}J9Ei.U=7.Χs[l[KW(ɋgq>GCDiz#ݸƱl |cY̘4w'1(@p+Km7.gy3e+7šMbh$I$I$I҇%\$I$I$I$I$I$I$I$靨hÄi B"*F h[5sp5O~ n =SPQA%I3 ʮtCŽlRÜj|t1FneF!>C\#U,z=ϚBf%gרkKO~|yڇ+f%LEws1@R`(҅kcŢRJM<颴ʋrxcގy*YwE!!Tto6e&3mɾg_dӜ3P>BL$ibpIˌ;Qfh;W04,e^3p;~&xWT~7w +`apWƦ#oƬ Yr5̚;ؾa+N~ǝ$I$I$IƗ$I$I$I$I$I$I$I$ w<%O`A*gkYP`6p6zv6Y^K$ix6z$aN$ & _V9./Vh:8?M&MkQ* (˚Fw7}4$l&MYx4y\!'8?X1mYt4K /MW"֐JaN:T渘 $r AuNAOmE;o$YFRM({U6Q7֝杜h(IH9uvo  ׄw˲jc=( p:&K*9cd|JdȉƱ߬u|1D=ɦ8Ճ 6waoYHΰߠ+A805rS IDATi~Z6OH}(8cbZ6ynst޶ޫR'T>ËOnxst`ؤm߲E˧RY]˵7}?߼!I$I$I$,Ɨ$I$I$I$I$I$I$I$ ;|B70X$)TN^5S UG4H@:%ItU$)mJaY @)M.YA.|, M !:D.h+#חvafHbO9#ilqhZwBqG6(Ks*oHJ]E\'l7Uzcq^\Jp{#c=.m_&j&iWP J~ ֈI„,}3͖H0XUwc/Ia|M97l+F(#4ZqT0_+Uǡ@g|t+LobFm(6h;K6'E_LI6# !D,F<@¯Cw&c 炤QɨJa:a\fdtHAl3J0Lp6ƥQ^K#e˗OiFnAQS+ YKC3}2 lz KOaٶ3Ưhs?7TO]U6` Xn[yWs7g?kc#4'Kn`|u] $L]UP+& !UcDrX>wVQ6^ϜQ3O lxb+OW''"?v.N4qβ4 e_,4E%T1)㧲`Jx |W{mΤlysS_T^z{fqe"&'ۉ3a{\(I:>/Tk_;o`~q`k[a lna2eMW\Geہ"? g^?` Wq0*w^RjƲY>خV.i}IwLia#P^J_ ZO?Hb& Q=<9(=7$I$I$I K$I$I$I$I$I$I$Iѓ` ton9n9Q۝ƃX6!BI)mevv˲·l8WlD誁*ē{vX_nik%_D~$m yqA]Wwa?p6](r0ߩEwmĆagojJ4bsO˼x\Y;Þ@-L@2b ]́eg:,z+W'Odw)8\[b~).UUѝ"`]v WEIgkd`MDCL4p5j{B~15CWMze+#m Ł M'=H&mN0peW'gF܅]<*@4N=O}tQēahhfDYvd:v45/S8y*# Ҵ y#GP*5Ճ `VS!KOWie'9ԙtL!K-py}5ẃCxeazb-Df2i7 Ʒ þ?0d2:"Ic T!J8 U!I6ap0v~ëOB">L9"muZ-s|㳫YAkSʀ%Epz\y^}_۶njAn P-<3A5ptb`8{7 73$QE#S(gX/RHzh>D0nGڶ3rtd`C*E," #sp ۗaz)Pj!L}$ɴIays?y=yn +U !+EaO~^~h>7}v-x57sAmchҢf>_}a=Kk΢jkeϯȐP. X6C]`4cgل`㋇ a -s;Radbq2Bp8ɤ"P4ez~6N-Hvn󑝟JNob~aSz*?4;"RK4S]}ؙvϤǹ((/DP4cfsgt/M6Í+g2Yg}v7K{e O ~x *}ۭ< 6G{В$I$I$IN%I$I$I$I$I$I$I$Iȱ[hL{7x휉]xS t%ISvz^Ux`H_ {R\PFm,#Igk{H}6q3C֙3аy4UI[trs)G&Y9.Z(+B<Ed婠YŲ!H "``[A89i]2spLq4bS!_Sа..:`fHǓ(QT,VS'VTJ3t(ǣI\:Oax.YfЅMJ ~,40\v$J|{/Z@2%F,L) R ;Ke4͉CQ6 C.&zu~-56Sۑ3u,M/Щ77u97V/=͉}~|7M\LC Ky۩3$11 ŭ_+.>vv9m-D/̉i %+M:2[4o.`jI,hxfU㎜bMLɧ|TYZ=٘ᐍ0 MdfR2ieGP7qSQh ?;U1sQk<փf^NI幔ܑ,Vn3׿7$>J$I$I$IE%I$I$I$I$I$I$I$Iȱcu>&1eD#/yh_g3'2TR$C' 4-F  >E ox Uj-@CD.Մ2CJ$y%l PbhIdl1#t5l~ݽI̋W'8(bW_& |T! =h_!L9COZCD!dh_=".f^UU?ycq aQxl Jc):"<6"NI2Cl،'+,tWy n8hwhjذr2}E5PlXWt&phCːIGd\=ዶCsrx.. QH9g0Q<hWŅ|cž1?E[X܏zxV(s [7oKqüfNu,9@066棼[}Iv*Z6z7=55TñS*Ex8xvsY8ՃωcWNiٻ鳘j3dv8W`vXG=y _Bٽs4!d&tPMbHƔ8r&xG)/0LIFcBe65-яԳJGp7S7ߚ@ЕKrz6}R4<"?rޫK޻b[.b)!$/ I#{d˲,YjVYv޽]I-* }=gδ33gs?a9u p6^9Z?cr9RTܹedA>H$\`иiIq\fIfc'/JE|+wng_Hm["+ۍS7$q!2}nl{^tQHXԻ"(6r&#ۡci8PK'3wz&]?s_c5/F!B!Y$/B!B!B!BˏOom-x9}IԊ%񱥤y./!I@wxSZěu P칔L%ˮ%82hqҿ2r)n}Bgާ$'"Iu"I􊢐1?Fdc`D⊢RqثFyײ#l{Yq4n7z\`j`KUp4e.-tvo4 uUU*nd2Is8}f2$u&u3BEڡLt%̑D_W'<eRPbupHE!Mw& ;IS Ӧ1># 3CST9ydf*tj%LdTCg-J;~[dTS`ԸxL3B U.aF=: g䒛;Y+SϞZ|hf/DF0~,rռB =XOfgbZBۣs{~NnL}1a\Eg6\RN4"ILJam>X/BZ|sg%8:b-9k2"Y[9-O^C1v:3֋)rb*o3>r濾Ƹ~T@%^buyݮ oaK M,ln2;Eܴ@Qmt ΢(:ΔҳGLhmG(* NꏯN+Zg]go̚OJL{;OH``O˦4 FsS(̅H'X5_u]H1F μrp53%9lyĈzgO`ݟ#F{Gorq hYQ68RZu5V2<*O!gijdcQ)\5Oۤɍ;sMyLJkk !B!H_!B!B!B!MqQ>q*S*If0ʍL_Qn/ tpl!j[}3˙p )^r kYOޞ?;j&];~/_\VNBz粰?'OZPX2o29gJF+oV?olOȿBwk A6'He>GK7Y43er~U~J&Gq&84ܒ74|N'qF!3}+d9,Ksc%xv0KPhs3=A[`k nSYd]2VPa_|\П47,BM%ϮZqh蹙I(v07C3IK$B]i#݁qkdϊBG[i(n[%¼)8m$bZl36TԊ(L 'N$5 ͉ÞNfE(_#X2J$J[w#!:K((9l]N-ҕdBēQbq=uƆ q()]7@i'LQ9۶\TfaߤχB0A qJ&NRKI¥ AQ*q׊wƧOaFe vB8yd{ ;PTRǑJ9N)i(FFL""dp(m).zz91ZJX Ǩ 2Q OtQ`ρfqgF13- ԴTbo-o `fC`gڙܻgSLjEIri`$>$xy_n$g<Z鋡Rȫ(2W C(3L!2XF6q^40RRͲkgBZ$ `M, t6shN6NB͎7;t|_':ӈu(,W-]m%Y؉xH<9&?7e('M_M_1J"p{']^:E7^r8Ib8~oCS%[O~G\7IkfuD q@pX-]ȂocZ&w$Iɥ4w>o~ߐ$8} !B!I_!B!B!B!MI-f>]WN]nTf^&30b'w=m;dl\dh IDATN5|cQN$?kncz+pUWp\SPͼzϷ}/6tBF@-YΗ擌Ks6.-sIde&V@nv3t㲪4PQ>n7-#jG{bn2atE$\RB08䋰8xʘL5n"FmXgk mYLȝI*}6o⭶JCŌ;k8TI4Ŧ2L-I[54|͞H#NC> mMgj4+:^&iL-ũ(( l+=mi&e<}-fj6/fbneRL ̤Ν4$U<8z&9sLKGUnw1Ů",IJ m4I=^YEn2vhŔ9Qs|'=y>5簼RTxG~4[c}hjy[FNna&K&@5oy14󈴵XeK ihJ#;/vw̯~ssU|i_:ďOWLwu~o W^F霅$Mhg- qn05}oV3̎'1QPUHgomE.&,؜dWM&jx%{?"CDCA(V2NOWcJKCESʔ~_Um!w9W36 ǂ$Nocps~` d1qLOT3vvEtG QB~qP65*[g~oVSFoGUsqxP ?xt0kUJC'N$#L`zM/{ ~=9f_Rԁ6StiYdBtlXOܿUM'o\^-FOS=Ɛ^bgT{.) +͉bm頧7D0T e=3-ƫ;im1X82 ()@hoh?l>LcԀ(('TlF_G9ze=rzo˳O%rذ4havv ;:+~/Nwd)(L#o\>6A?c5n ]aacfa/UM,,Q$EQQt'y䤠%#!9-/7hn!mC䬑θi 'Tb=]=(͛FvA6iHO>1m/B"jVoxBweAff&UU?^CwW_wp ".[!B!B!B!B0!S^21.n,3A}6!6Zude:U7{ڱ ' G,y.eF+XS,,Eg̤s,P tq+їs_yNy? 1p{}eʼnD: _4:v$ П _0&[Zӯ` O&c%fsS>1m8}ZͲ=ka!m1:4#Ghe}k7ea?-BhI"v _t., `Ey3jDtZ2Dz;i=2 nh˲$ wY.zd8mtW_3YWo`608I"OlQG >ZXE2Gˑ>Z/a /H- 69òLDzz/^r 8u.0UX 2u3yu_` i_0eXI 7B!BH_!B!B!B!B!I6?ncbu\Ɨңk9Eײnc?')"]k};;`B!.z^yrHKcBwb\;F-Z]s 'g_8&!4[R!B!{B!B!B!B!B/=C9 'Scd(y1< = 6{% M!x/1c:t_ Fe\Dߤkw##B!BI_!B!B!B!B! u{oװK?0Cfd|=(j b!B!B!.K1%NT_A!\E^$g !B!B!B!BB!B!B!ğ5@!DB!B!B!B!B!B!B!B!0B!B!B!B!B!B!B!B!0B!B!B!B!B!B!B!B1B!B!B!B!B!B!B!Ba$/B!B!B!B!B!B!B!B /B!B!B!B!B1UL->l@|ਗ਼L/=6ru2ǓW0|{o "EvT 8B|(饬-_M:۳싟`uE~~/8:ZUB!B !B!B!B!)e`PTUEL󮠠6l6 2I&$AaTHO#mRRJ0`qĢt**SS\LuFP7Q󞘆r1{1m<8=>S?۾Tv'1x.9$p=]-ʵʚ{-7_[B/y1|/\͖I~ ʳp |i??<O\dx_]9ϋ_^'p;$p;g뮚Bq78Ry'ˏBC^u[J:㧰̬.#+M'lzU5I܏jR0}6˯_ͬŤ9 M'slRCOўVݛIn rpZ:kf3șJɘ5^!"Q~O|K)t_4Ƞg˃橦oUǝYLWnlʊRb4˖'6kO=Щ>/LwĊ ×^8SX&9}J&EV=][ⲥڳh6n^sGɟ27\ҝ&:|^|d>b(Rƹ-=Mv|{B!B^!a|!B!B!B!Bm"3UxnK^2MC#x[$1j$ fE4ˍ4 _ lZ蚍YYN榹ˁs-k"7~ܶD/K >P\v= =AJx Wt@5q)i A|XG =B_46;&tc⧸mAciuYy5oP90|eLqz))f\I*vR21|'b  ?|h$yX}X̖{~C6KO^˗?yE#%;9r##IV"9^T7W~TBtN(X'֮a3~#~S錫9hc!K!Ұ'˅B!BoI_!B!B!B!MdU2cbVYǕ+fIuFWl,*eɲ_e /i%1:N*W|܅Bnν/͙9ur/|ji7l%Kgs>޳>BqQ,d2B,!i]JG\(U՘aW'J_4/k2,71y)yv m>?[Z-pncQr`oO]Im}Enc~ƸߴT&\!M覎@uU1>;UyKUeU}` ;k1=hI(NtQ߽Y٣=lypsuk[ʑxGٟ͕OAF1;kKhS)J9F_锸U^eggۃY(#3l{評DJ;2V3ʘ6Wؼy'Ǟ3Y̭Mʻ?LݑﱵԠ Wp7nĨ_>Ʀ-dOY'L|d?.|?uW>7{n)vm$PF׫YphmϷ? ?=)1fBWιv:ZZ:ߡ:ARZh\5 ϿoԜBp}i3w/z0D8kvp=՟(W.ʡէx졗yÕIlZV~֞䞍`}gq࢙ulo8c@Ϭn;N>DqSAo@!B!eMB!B!B!B!8©]0ێrd%e+3XvQ@w?r`+Y_,oҘ|Cկq~l 6q'[7v;+n7r7;<\!>]s)#i^HoNtU4$\٘uMy;ȶP&I ,Hq:950MUq0MǤ`S—0y캍2B_(j[O qڮkPcBgsLd* -t K|ڝxT$!,+B(܋DӘP2[8';Pt6"y{ڌ 6^~^*nGW #JJv6,{8:.nPEæ;0I$cMÈ4p?i--,̦#t@ 'oEHMSՉ8OpD]ȂH7^a\5_v7Ļ–By,z%WomRwg&FXM4Եlb'|-ٱǯx?®l ^՟][RG 8ԱQ":74 ssBjwMqQ\:%N/>/aD„Q9 ÉBW b침\.\n3&J ۍ۩ GF܉S[ l?Mr)n&!f皜/C\SICګ^^=h9ZiF/mwto(s]z~3oj"t B!CB!B!B!B!H;tAo˜+fYIJs๗y˱|O3OTc=?~z>i?7rGx󩁰; wƯ~G^ C4X8vV,dNX!ğ&+g:eHs>_ 'jO]d ͎(XVh΃4u8O0A!nԡq"f]cw$݁2 [*Unn_a<,¼CSTy],JF#<wH{*JT'v IӤ+c?‰yV1f[ǭ*42Ҍtn<cS_`%-k4195WZqR2w&*syG"k` g4 9sLE[d[ )CҲq% )IIEHtܶNҫά`imz`Azl~c3OIǮ(F(t4sxV/YlH4pQmN22'ѸG[>U3xOm&ziiEKE~5yt,NZ_>jϧ4o9tEˌ;B]W+qq0C^yvNS4&/bM˘2>Chܱg10F4p:edbOǻWǂEN<S}H9?9IZbdT0uf>5b(.*@ֳBu| do c6,-y=ӇXa: ʿp33,`+y9p7r !B!YB!B!B!B!űtOc'V$@0 ,tl4f28~99X=V˦QɝۖNl>IOq!3%f:LdS+A40MBwEE/Ʃ)ģ=*^o!Ug-tMofz^ .$!#r sƓuqvu ~_Q<6,H,It OeZf S4QY,UӰ,pS%gG8Js8XB[!TU՘5Y.u' : T6 'rf{^WgUQPP ѰŮ( 74aNK!ԜNӝ h1ˑifykzFu8#ldT:\ l~BJ.Ue8b9zz34=Tw* @W.3SM0UtA_{Iq`םu'6MCp(iלN!SI*.RRKK$75]Ƿsj@aX?5Gij_͌ɽw݁$I$ug:\0DPY;v7{ge>CQt4R=mn6J3$YĜ|4+8P =mY^̉kHƦ&F-KNz99Z]gv(#4o*v͉@WeU~o=*7ۋ>a=3T F=3~zv&FMQ0IbJ-bBNCϽW~8{/L_-'LRH_AC%Vc[0+;%dQ\V})J*nXIyFbo;U2㆛L*R48Vy, K I׻رhbx YDNR`Ne gfhM}eO,4E$t2fdV[D@d2mMܲ>Y,/r$Z,0ؿ*q憫'J}H S7ʄovo䤧MK㱣%#lxi8O^?ǎil:-0d%ȫ,4bhjtԖ~xy%e"Ý\8ÿL}ɨTf\,=!}裿[{vΏsmw2uR^<.Z\ !B!,H_!B!B!B!͌G=5M=g"e`;>0XԌ 9I@@|EI 7:_|槌XP9;tDhy J>{GH+V̡(#Ϋ4Bw$ZfU0ٷq19fJrNhOfm]Gpwr1VT/E_^MUB;Y)Sq~LO ץkB!^Pmک1j,p-}6s\\%Dak:2SX肣aCfHVw:8+ƶ~^'X3+;[\3D` .y꽦sEqפԴ, :D$ˆtܚdrG3}ajr)WHJ$:>e,zo%En>|6w|$')s*WBw\GԲᴻ 1Z{1S+35q<)dM4X=Ӯ$kՑ6<1r^t7üHkh :l*&LUN:>:Êp0%g}Y> 1 'jpg+qSɆ`JF Jtjuv#=r؟U͒א2X"]4ţH/.'=c'haɔDOr|_3LZ;$G㝠/dTpgȳ$;Jfƅxݿ>[g7;K%(f|&Je_;w⻵ s8w_7uJp$*t*Ys6^z=_;K{.GJ آmF0GkX7mQLNaU!*#YZNޭm82 *ihGGqWP<,HgwȱX9-GS}TMZ [HZ*U @3jOoh/c2Y s6US̢rxqw`6q w|\y*Vړ軤 2db7ű?}ij{⠀:?Iz]`G"2ζ_5IPTUoWpէ?Fs6_c^Y~Oh`).?5L:ۢc0ZCj߰V8On6* HV~SXQsxboKIaݟE$Ǥf21~{~eE"v~wZnOq?~%mh%.B!B!<$/B!BޝQU;,$ AvAPmtx8:^﨣Όx\fEYD@H ٷN:Iwt:UtBy?V9ߪV%+"""""""r,,tى9|f >bgV󯾞N/r .ʄw3g?rOλ_>[/|? Ĉl!:Y*{AY]5uжǙyKӲwPu3M޶ٟcđ90P(rbn1󃫦`?v_JRg0C#,]畭[`Y dF7_95k<=M $L\G1 H _$Jf˰ e Oe׬#0@mcfi1SGƈ??r>oOGK~Z:1NA $ Rc!(yytcDca+yqs/v2l:jwq{`\bxbk`5SWlwSZWx?f3t[\_׵wwoV`”Z1x|Ye5X>mM[_P;C @Kkl}׏a4=]7| .tkw̠+n~{_74,Bb}K7Wv{p?=3{r>Z~ɟx2a3}l%[2-t#Z孼Wk|Q6@O00\ۥH,Iya6Lm-+#Vo(8<7Ni!F^I}آe}^H(e bᄳL=j?NPt &v|+]PЖKKLg*u qKshn10 ?UՋSx%o@"k~!.T DzIg:u:-O;qŊŨ0k-.=nKfp~mjf|ͣH7̟~'ZaYg;8 TtHu8uXyWP_ \WN!~~p"YXY\r46׬0Q1;x#Il|{ YA e8!.a`twяxo{zJ{[/shX&N+#%h%yҹw'Mg̥gG{uR8򤺻(Xca|>%y|<צq̾J.ݓbd_p 8˯heƝdk=a;1rjkLh614x =27_wr|L»Fx&X I'((c?{[M7Hc1+o^Duϋuzb3 8ώ{ůf~,w9q/~' s%3 ȯא<^fo~N}ڷ|/̭'x]/EDDDDDDDDDDDDDD@VP5\y KgZGYW~GC|TM[oQt MEv4_KH>^Dc|c9b @0 WR]>Xe2 ibAbeX7%Tx?a-<?ኑ̺:.ae0Ax1X,`ȩ\zR&xxhzVZwu 3 5̺up/)Yc^f g8Ţ~Pїs'.r2 -[XǨşG&_YæhB̏aRUe@dDxH`dAȟWi}w~V7^u[ͺUٱa-cޑʉLib+q;%G70 H$BfhYp؀d1Cjo3|{v⨥.{{w .+Sl`gJCbXӮ 'X{SlӇRt 91qǹůrׇb9?k|c OL_8 9=Z^~Mϭ*""""""G ㋈뎗͒q=je[߲cc<|=(N܁7x?G.{y^ŭ|?02/_;3 ᳆fB %is XQLs1SPi刧zN;00Y`]9? F4DM.f;_aD|f, їWzg1Qgeq= 4fyi`d|&bv( F\Pw seϡ)d=Ft+ۛh}:;?$zkG0e\{TRg3CJnx:CHŇ7ds(M׵)WWS$0\_X-ت8+ZCgUnSmgNU̽B.zsM%^zz ǟ(dsdSYQ_ĈRQ0\{/jp$0?k˦+ꋹ.F2/< k6_l~ vBk]/༦JEB>Ϙ1t.jc>,]\t54ڧ?=q,(Q+?bw:lI~As)^3^:Mn0~x`4ʘE~=G|0][Ls\jk8w :yƐ*bCw:MsIu41Uj1~v'bUbLMҞ:j5 ^EK3sF [;{""""""rnP_DDDDDDDDDDDDDDD^wܾl)gr;Ҋn<8>` .'؟q<;Z;TsDz~ ^D6uCcvE4%)2H<דb 2@=d0,(dx. /Lj1#gC&wdsqE?>w r{ٟ1~h lܷ#F`dsv'?-68gx0|>,#-ׄQsm4%S_?9t\>v#+6ӕd>Wg=F멫)L7ڐMeb IDATEDGSѓ1#1bL&iƈUx#|'_q `9ӯm*OO~ ć/v:3)g-ϲleQYȳE73^d3'@ЌS7:7-eYՕ;{THƱ#;&"#=2ih~r3bܱWzK9>+rõ}X>/fX&4^ot"/I$lc#\]$fgIkIj"GGlb;EztJS] Ms}xGvHcL&}182YHu%!x` V61wj8gQhc.%` 0yLhjf-A)/d^w`XY&ޛ; !Pi~;6ӝPO xK:M'*paSaHҙ‰S_?-[ؓ? _R^u?o2So6Xvxbu/Ƭ '|{[q#&- _ WLw~oH߁YKݻj3of_bǣϱbyyYHwӵ́8}"&t/ VmP6< Kmo߰h#Z䅋5e_grvi;{ز9&-Zx39̙V&[<&nm|ΝVHF /a";s{_e}l/ȿ+ӟ$WpNOEDDDDD\Pt?ߊ%o`K>C n)Fk8ض)/RSS4d+ED6 V̬6g0)gKB?G*Nrs@@s0<R6I .M0~Y8UU&ZEL1_{sqU#' 8BfnN:.iR3 j<Ҏ˱u_U|`l.Bq?YQAMM%aIeLJJN%xMGig_nrPI3&UB' S1Gx`m-nj'QSGg&z{gpp8̙1YW=Fa/+h1,M<'h8>p-ɞy維a,XMkYvKEy;r@Fv4( 㙿te[Yr#un!Gs{s ^7m17%JCj.X:12+de%gv"LyUcl9zʎ;9ZسcȔ̘4r#DiL92"ּ\TTU 1$_)qdziY6$ѱ)4²}8Ew/y۵dm]|#?; C{Ӊh_w=;yFzR+/`;>/r߃i J韀EDDDDDDDDDDDDDDD^a|Vh$2r?@7HeQQgUU]'Sl6^^K1\e ךF1}g*MC?ؼK_eE{ VٷדSuыe> 0|a,01Žsq]bt#;PɌi|xu +ʄ];^b4| )3r pt2',&Ug@ۓ9#ԄCٖ0L1B.Úѳ|Cya sY}!(h-fgjq$˓6)whiT D{A+=Yˢ̬rIe]֡ GD\g؞HwK 幽'< TӶtK.PS6 WtIsXk0  p"8yGB0|}L D[`98N[Rv Q?r&gWЖaLg][9-eP^_GZ͕6E _+'X_}^JJDj/fzdp*Z"KA,&&dHg(~41 L,+D(y^?:HhT1vTBv؞3T' QU3H B<d4L +xexG. ?ӯ,+IvS?o~L?`Of[ӧ3WHE`ph彼ϳ.`rf9i/8G?Jt{yGmOb~um|s go_v_L}[ͧ"{; 0v̟bMfpLeqTڝ58Z4ʟGy[xx $<.6-{ oN[_(zqoajsfh`4ML+BY Jjku(d0I.xogiK8 {3 c snu%[vv- 60}Qftv6~#s\zM~Up<0,ep߸qʇyxRuw'i`}݇1KKWr{y=ӹK2m}9ؔEgI=0kZq_G7w?CWރf0+/lgc.ILjyrl7s{gҥ""""""02lx;7_2ʲ ͪ ,0AM<Y~P0Ұp9&UQ=z2C5ֵ$R<QvHo.ϸ 1]߾?\0~.˿wЙ1=)ɶ,߿r/SeDsjG!>30s 6|y(8elY`f>sC,lr5Mٳ 粘!I;{=T<] +Wy߸0ɢkZYy/îiLqyD*Vzd7E&oߗdxMafQCR ~rr ɓ y@:#}7Tet"|>FMrv)֦mɛui?e̻l,/,fV2vl}6=Vvw61b,]#HDw6˜1"!GX\r>Т<-6&;p `P̒=۳3{.T3sƻVHS4”GIz^bk{3&Nd0=o5}0#R1:ۻ# HB}nvS7n:s'Y?: QsD }QLàn\Q!_ha8E(6#a"Ka  pnbAj3a*Ё0 ̟9YvB1GM۟GF,_xcǸ oa$4|&|η2wǘwGi!_}˿rG/Aࣼ&< WHuyW]ww__7#TVcXv)5i{_-| ԭ̜ZOyeALk*7, ɁA~-݇Ǽ>*\J>b[T{˾w7ߜ:P0Ԍ+E@eԍ'fNa3Sɼ-Lb5 > õ.#<8oO}n#Y Q;m9KG!X3KWQVQNEu9`{>o$9$5+?_=La ,*{X_g[9;7֑,eߪxnu, a&o쥻c#01u}[^aCO{-"???ԭ{G亮G2=k 7Ĩ/ ~Fǡ<WoqFޕ1Ce$sc{Cc~hģowt<+sT> 3s#wԻ·_A]^@s׹?șQ_DDDDDDDDDDDDDDDN[I''j˚#yNr<;"^HiÑI| 7.ø>+xi#嶣{ӏNW9+'}yM<)^j?r y8vTa= tٷS=p iLM.فlڝan2Ց2|-֞}Al%a7]`EO|a?HJؚIa2\v$ٙȲ>zm? U p]ƁbA,b EZ2yloҖʲh5\Ea} }#~|&ҹ<"S9e쒐4΅^z%3~2JC 2hL#?Ԧc9/%w^EK6H.@>~Ծ93{6|QKynslд:jg"h#hb_nX?WQǤsI^$O}Hmj=n)&v{+ރ^5l2j2񮕴vo' z;'xOtvuQ.#`1 Ek_(dR29ΒH"gCU"rt:eOoY)%!Ya&8NBx$>$jyd,w4 [Qp=r7Lg0 BA0p=TPڬ[iz6|o}-G9Igw;8u7PH>ϳ럥 oC*=b1o)|v_X ?;b<{^0~.8} fϏiN/xDN)C'SaDZn˨?_n.<d dXF_>DN!䓬xbX /pz+5tO{ؙ̩]UgAҿUD,w;{8,S|+p $q yi'<&;8p.-H%""""""rzNtDDDDDDDDDDDDDDDDDDDŦocY]/=Gy5so7ϝ\'H[gÖe sb&K_w/+I i̿j1f+h: jo;ӿ'IlJ׼ q8"g/\UxE09eO?M8QDDDDDDMa|s.]|N<9;mۧ>-$M.=.yxC}}3g<EDDDDDDxy """*xvf<'EJԋ"""""""""""""""s.vQp:o"oaaa.K̦ҝa7G IDAT'""""""r:,OFySUDDDDDDDDDDDDDDu.ױusIHJW9EDDDDDDD7=>}ȟ.7tt ㋈P_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""%)0H _7 Gv&AOW79`5:K.Ao*yWR|'|7(WE](~bT7͡1Frw\DDDDDDDDDDDN"""""""""""""""rƬP9\r})H+HY,OJ0Վbjn:s;xs]!`S?O٘~_\0Zm>*1z=-csHufT7xEO݈Jw;sRDDDDDDDDDDDN"""""""""""""""r`%]vw~],@odM0om0"""""""""""gFa|95f.2ϊG~O^/my/<;|-O[!ɧojkÊ~&KOss_StcL3Dmm9ޭ4m&YtM9 _4pNi L<'Gh=>+H%czr4b-ޝFygzhtcH,$@eR4-ɲ#";qd&s朙'Ɍ'v82GYD\AnV,FJ>O*tۉZJ0$*N7^Sy{I!x@HݫQ7SL']gqp"0aJ@ͯQW[;ec17M@U{5gDm Qk>XVq1a}izsQ AzApo}4 9\Yz]7ỈaU*"5zc\ŵcDe"ZϯP]cň9.aQ UNj.[pYzppxi~Lmi{M+՟/UCN>Ă*ab b_w(v:ZEb+w6ԋKB7EDrY?(ȏW.]6ؑ>6o~MScOs9*Ky+v܊X Oe"!'aX L=Yuc  3_;##ԯ ^x!);kl"nTk]IT;|e0N֖mIo: |Bcgf-Ob\X7n+wcX,P-]ԛ̏Q1oA8/dj7Vo/ofZ[5~c*Vm 0v6xIJRW2v- uAoXaٹÜ<5~/6ҙl5Ah,곌Y2+M H gsěqƻW9uی(/""""""""""#EDDDDDDDDDDDDDD'_YsH&_A\>Uٱ*MxxŀʞaWS޹~4; ~}$IҴw:$?M>S*,_Q~B"" j O50k?ΖR3C0v3}9M%*/,11Za^Z3oP*(qWcg\i)\%=p@̉Fײdf6GDLNIQ.s%='c&޶uP܁Ue &&<7v{q,V]qG$ʑK\ vD+6hvbC{|vOWg/ZLxK/317a55f[ sdC5Y[͡)̄-4 dJ6#ǻR=L]敧3pXUD>5V{n`Czwjr+V]Mki89uiE9į06q5?jr ,,ե0tY=vZK9&bi\ճdM6]9ΥɥXQt'Or)s%PN2^q&KAJ<<aP$HHǶaO<1k2ػaGXtXysTߝ>1?BԶEߚʫ¢. ]^* (O36}u9G=OzWb~O˭',>L[,A<+a|KHgc*wsl42Ba|yn_MF"ZQv~ĝd^Ckx5L׹\""r*luF_WqR&"!pAӥ4mLv溅C w })f*SK 1C,tw KL穇!Nv Vʹ\3!OaXeSdEĢ-iNX.X`]= dq>=sSv xS{п[~}hEusO3ZiiBg,RyE,޾/QUVqױr\[>T|`Xan8zcv=`0` .ZXqZZd[nkaS_Y&њlgSKv8[/1U7v}odMrtĚ?˞֦7u op$#Ɗ T&Nϒ ygGxKGL[)E$AҵÐHŪhs%lVHx0 DhA26*A8prJ'.p [`b4ӥ*g7K[ +F{C5x0L(Ԋxfa:"m"))&'Na[S{x-Mfe{N6-2opXN>$gԖ^'=JU$;ertqYf8X@hbMfMyہ"""""""""""""""r gƸX5x??s^|?yEF K{|||"A1lGڟc&_"̶Y oPv kԼ~萈0̿=lR$P5 Nl=1Nto^9tv20qzN+R%?8dozis+ 3g%Wp" +sgq6ҿ1*`8_~Aٲf3]aZaR#k>>.LNk?v88z5]Z_nJپ mm:->Y#""""""""""r[DDDDDDDDDDDDDDDD>la<vk+7^<1A̞:|""lXqĪLM/0Pb6;oEH'אo4 &MK"J藙 78kY$vwvesrx^a z|oDDDDDDDDDDDDDDDD>Hv ?,s?Q^y(9WE`5[Ҕ29;qLi,?Ȗ_(.2Wcvwr`GXۻK- zk*a8% ˔>u,qXʵaP%?t٦mCkI~]XqR~Zc +&! WOC,>@vZU"%ݴ qÜ8A^`~ENKogcFAE.k!~7>? {{>N޶fȌRk$- pP*Gvu&TvwrkDI&{iK4\i kc9c-8 NVN;k,0>},QNMPg˚.IDDDDDDDDDD䶤[fM nnҩVnH`9; >כP[9?Em=l;kǝt\bg>LX`y?l%_S3|Mwc$v@λ3S;˩zg83Eˆlz|..%΍9~/}kI]d31ҩ5t`Wsd0YLiymf"Nhl c05l|JW$3R~o3qZ=O^-\bcۨ=: 9%ħ\d' ?Fk4ROH",L<ωjfg`hMQ!m5ATWk$.эcC 3^@4Ǟ`c7 ƨ60=]/:-rcCmk}Ba ]˂5Mi*s};ǩ7f1[&ɖ3Ǝud)gb׭1L2Zm9M[dPm@f i0&&^D];;Gy89_""""""""""r{R_DDDDDDDDDDDDDDDnIw|[:6Dˆݟ[Dz?yFlHD,_~ϫ0W7Yf'yai|O|`x1^QxODoh6mqԳJ,Ǥ 8lܙ0W!׽@.:=B,LX!9ȑCJ˅EN_>Z[el, DZl3 *c 'a|ut^Zٹ=殇+riFʋ B+Yg}.4o9 A|CW;K!٧>;Fs {3Uo{]M>5r>3YLk2سMhk 1XjM?!!uo`? b8Go:ۗ 85~we!f mfM^ v+""""""""""!2 ѴνaZeݺuttv2;;tppcwYMOo?Tв1zzz|R1ضcL#}jX60<E`9R-]]IrytB w5خMߖx|| r Gg^k<$"A-~XB_ίde !a41c8MiY*^ |{_XaC`)oqM $lX/c\"ncT*벸$k&jW/P\oiU 9 ⳰r0 V9?>Ci<e16ڏM N&9J ۮgq=l;A2DĶJZX 1P.P`Zҵ, \yp5:f"""""""([5Ɲfy!aFΞ= EG޼?mil0^ zθLHU͎r|v N""uWkOBf_ B-*°N6OxdB*BУV[V{z[~ $niѾ3_U;\ck |֞$R"""""""""""ADDDDDDDDDDDDDDDDDDD>H _᫿.(/""""""""""r[P_DDDDDDDDDDDDDDDDDDV:Sȇjl~46wolEDK IDATDDDDDDDDDDDDDnsJInc&W+D#XT}YDDDDDDDDTjT<^ADb$ctEDDDDDDDDDDDDDDDCXcEDDDDDDDDDDwa""""""""""""""""""""""""""""""""""" i0HEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD(/""""""""""""""""""""""""""""""ilCK>n$!gF_gXY~E55IN|-|3>wT$~Ry74 YĒI~㣧)x^cۀv߳~b1KSLE菞Ms]lB=+rvU """"""""""r# ㋈Ȼg,l>; ,࿳c0 $lȇX.HX۲1D2' =,;B,Bu"D\|0ňꨏb-q6:p)WŢWf!:H'؛H U;M_"6IZS2ojx!~ 8lNǹ+ϵ0Ah j>O=hq֥^/MG2:8fց;HT8\^+±#[8E4;|m @x$a.Lnl'N*5@Ok)7Be 3\qDHŢ816#({5 ދkR_DDDDDDDDDDDDDDDkƉ `s^-XRm[φv<}hↁ0cz\vˇrj*AVu d9z  mx,LS/,:ugmRůs,Zʱ,Z#.ql3Zya|CK,u5qO¢r_Gݩ2_Zɣbrw{l |2^c}j0mf}<s-yEDnoaԊx*ozz>jČXJTg.Wk#4Vq5]qh 家46ycVB=\ zCw"#-QZ+rQ-徶S ֙-3X---iLK)sZ6;ZdkړLsN'DkK *ώ$M1eF/Hfn)^^7teg_0?|=c;t /B cbaM5^aEOd$燏20I^v[hk;w{ }{Sx`=pk!!B VkY41* _G,"""""""""""""""A3Q?O}I!0&0_ ؜26vMXksLNbdn>v0Wx?K=m[h(qn.6ovCo3ÇVm ͚ $r>V7ҖHᘐ˳0(^INw$IIY.^Nvo릺ZBrSLfy\[RmD(H֖&rޫq«yQZ6d31 2%5L5{MZ,\[֙>m~_NPΒ/ã}]zW/8޳?Gw?)Α)x`VcկԙF_fkk1g1H\<,'k6қ<k}[5 e(T˄VT =Y /}쪻`5gfE1ȶ -Q3Q)\Y_+CI-Q1@H55-T~+\#"ui NU=毜˸<ړf 8)PuHx 7v?)~?-]߿*BJ`C}7]ܨ6 ٱ ?Xکްcp)Slȣ8[#6 C&Je|%Z_Vbw iP.827El~7y*a/dۻZĭϦw};糿y`w _/={R&vl;]μ5  gQrpIwGbpC /,Q>Oa0X^lavgzX}_&2ƉsljIcN,9ʞO>aŖ1;Ϟ?J -}O-;y ?YɮOĎ-'/b0ޫ`'lyӬSq7961]Y7JsR !Jsab#,xLv5Mcx\.hz{<ºsaGg*,2=M1+3Ɨ]9 }př/{Y oo}?/qw}q"""""""""".EDDDDDDDDDDDDDD]ƶ,fa,}ƺ""7b%"oL.zdfYwS.7Rz;n;Ίԍ얁mRh>M(Ze&( 7W{u^1<ќ'&F4UT-1!`ݍt{HP?ccոKn,ݴU.ƲƮ˂9G@HxxͶ/(.paW#3׼2}tqq(p,-\:q[HWop6_V~%/^^/];aUp!2+c<_6vDS0I†KJuޜkYᕱW;h$I"Rshv"νhѦ+U֩9uh$%r׸X\,Pʾ>:6s>F+S׽[ geAϿ=ɿ=~㙯~;??y;LoS+"""""""""r{үEDDDDDDDDDDDDDD]\=8Gݪ ""ռTNp~feHx4M""+a&q3X@B@L]F%d?\E:c 9'{|_:mB0$[]8b@w}_~~0uK̗s3(8x'ƅF##!兓, dXNqZ06@_̦^:tll2u <`}3V.p)X0! DΫb"t%o20³ww? ݉k/"""""""""^pDDDDDDDDDDDDDDDDDDd%DXSzoNDDDDDDDDDDnw ㋈ܐc` W ^ұkw܂W"W)Pjxg g?Ae?q ct:OO^eX X,Xfx!WJy!!5FKUFZS<>SEBBJ~m M"q9>M9K!j |;ǾGn?[/k~g稽`b!a5cx~•Ba,+J̍XKLgTC.__xAlہU%|@8][wr#r{<`7ex,TADDDDDDDDDEa| D[a0z᫜R>A`>@OKƁaHc{Zm]LoPsҶHنBŧ[SZ ^@zu̖Ex2eCZ@ y8 KK9r,UEDDDDDDDDD>:!R(7͖5%94zr!a9+;d{*C2U`mP%| ,"LV}K!n4;J9 o |L',le:&Jw4B^K SdCus>H/ e/ٻ(þ޷N fB$XV(TVdEZۉdٴMvv)κlj"[*%Hl *gv{8x 9pr>yyġg{7O7ӬZoϳ+z!X ]M3J;G‘{ֿB2F3)SaDkpզ FX1Vf빂 ԉ 9}!0ױC(/'.iu£Q\q gK87~<'fiqϓ$I$I a|I$I$I$I$Iz^3SG/ZebH"ڭ)jh)~UgL4O,.f<|bl_*]a))?liWed̵s '3w/1ŬlznsvNQ=T4:"v6J~3eUȫicG>?_p7lÞo%{YTVnlEz`H{ Qb|r.ƥ*8" *RMyBDRB! @RJzji+3i0S5,Zˊ5̎C "J/k16s56w;=:4% _|$<y^awry7G 9\r#]qc{d >R*U{H8i9-e2Pd+9w',?y쐑_u`_m K$I$Ia|I$I$I$I72+mYI'pO=B57>..e ]\rL%<gݝn_͢Ŭh^[U<;/1#^yX3C#lX]]cLx͹I'ٳ+oc\~ IDAT؜ROjD|o|hLbk?Qң9u.0Z6\DoJPTR.DDlde+Ui6f XyVP-W.vQ  l冭li%5Sp'O;/R tsy5Qy_˨gsى&r)Oͱ ro7iN) 9c:_s(y6ngl?1÷ }\/tqզA`QN3^@g,c #nSkig(/FƳ}.$yoFIT\@WV {Ǿ}Ko嫨TUB⏰jdl V)m~:s\a>Mͽ"4Oӻr 6}+ǙK3^1x/p|lذzƚqtvFcja# 9͖rOjNR Ə~_0efM,*U( !ҟeSF3jmbsvK\.6xӍEW|+~I$I$Iz}2/I$I$I$I^@,'A]X dSB8тJd Z"VɱcyYFG m3gTQDrt}82-X&9YpoQoNjNvT)Kj: &~zz99st193{zڳ>ڍS qIZSqN@%Lngw167OiUOzrz]@28$I$IFpeTuʫVɚ5kfll{vtdv6$I$I$I$Ƣ(fd zzz:N;|###<*nY.f/pI$I$I$I$I˳Vsosu&\V;b m_$˘z.y| srrqfYf=׵ޮ"!Oh6`f|\2ҴF\!Sd$I$Ib_$I$I$I$I$Ֆ'Q;̱@" #ڴK$I$I^%I$I$I$I$I~br,$I$I$ K$I$I$I$I5IFɳF+M;+%I$I$I?!%I$I$I$I^ASԒbI.@>BLOT\Y$I$It:Y,Izyg^oI$I$I$I$I$I$I$I K$I$I$I$I$I$I$I0$I$I$I$I$I$I$I$I K$I$I$I$I$I$I$I0$I$I$I$I$I$I$I$I K$I$I$I$I.y>ֵ#Bg$I$I$I+Y I$I$I$I$I*=wv9s]/qA(/]euZ/hƾBB_(/22F S< n1k@rYZ!"Se#$I$I$I0$I$I$I$Iŕ>)jɋ%zz(5&ZgU(U*RO/- qEX6OW)̍o!$P*lLzِ]!i, u.q8NI: 4pk"15x<*쏲|X!Y.W$U9yq"z i3wx9i-\M9qI$I$IRƗ$I$I$I$I/[ܽk>X]Y~fggEeF.~J:H;-wɖu-w>Z5XqOk.\$5?/vv$i?ﮍp}R'$ܕfB ~(t>E67 #4AO v4^qe^@ǭanHY((}}y-Ƀ466pG8HBe2fy:!I$I$I^$I$I$I$%\r{[oټR1PWt^Deo~OV)0sG#.7\R8σ%*..o[qcO3V^b!I:*7֗qGhi(53L/b.N MB{]\`si.6h{/r]c8QH8//B!/re}oThƳ|{Fk%m_d9+(]< rZ<6A)7r%q{ޓ$I$I$I2/I$I$I$I^o !#ZlyZ2l@awXe(_[W%4&3%eP"&Iް))b *$(3̒ (PL1M1 j4M$(Q!E&sPLYו@VeSRUa;sRʱN@P .4cٝU"rhrUZf[0 ѕh|SrSΡ4BN!e{_x<[gv?*Ub`HiQBL/븋Ax>/P@tEL9i != )PHU( SR'Aʙ !T()-jɾ| WD7$tq'ä,p $DO3?9ͷ qc>V8_oySW7{M;F_O yL5L-BEC1v1LoLF:lj,v:ŬiJy9rڽ|tf5eM}/; ,N f s4+L {FJdB@7>f2;30!r 7ad@)s/x#L'N*3L (s|m<8׌rwr}Q+?brA @wvNy/$%I$I$I%$I$I$I$%ʩr%J Bp_XTBѨC>';$#sv \~=7d>`_+N⫸8ꡖ?Ɠy/#rV4L0?Ǝ|ŬĮ9Ft1ķ3(d2OE_X@=%'aN.eCYe%,v%΃2eOِV8?/'qd+9ZM3ab)ZJ,a sJ}`u3j|Xmlb31W8H@˸;f%I$I$IK$I$I$I$I )gqL^Jd\]B1?dv"nRV%5mOqdԮRvGb +)ϣW96<.:fwy ,(CmGӯ01ϰY6PgXΪ0BYd2)g64zŬE8k >#zPwqRMBQF)+4yhs<>R:865Fx{X8wW Dy5 |)s1&"2&GXVxN-/#%bV1q[nylܪ _`Y&8ADG0Fxi9<ƧkCCX&b16>P$I$I$I#$I$I$I$ ɟCx}ҥ*Mq{nnhj Q!&Ooۿ|?I/GN=dԘiSD yQ&YGeP?lbI觝O~\nICi?ͬd&qo~bK$I$I.d%I$I$I$Iҏ\s{=WbQobq/z'zW}Og]| JIZ~h$F|u2bbYw0uƱNJac0H8`Uar7Ca5}ȉ!a9qYcCk)Ǜ\`G:|_={}953!(ɜx{*NGĊ<_l:ORNQpt^"bXJmr}H(-/<,PJFL~(1EX]T)R @?9h~/d6%4]Tw#(J$I$IbƗ$I$I$I$IHX _gX+%ˁvO3_s}^?+I/V7s %%_Tb#eJTIϵ4y!+8R{ND5*63~`nfw裗@g@Bx~dNF(^dx~.>w&'x'XMlqvEbvs#I$I$I0$I$I$I$ImYF~/o rҩ||\u a%t~乥:Uܐ˩8_%M _<'`( f_c~~ExT'9.M*TsBN;LG 0k*hߩΝW<&RjgQ$+R@w<0$,c/0[y7C෹]n&.c749 11N-<(V,e<v1MYeK1馛~t~ u3$I$I$a_$I$I$I$]ڳLLJ^Mȵ Yt$I$I$IS{$I$I$I$Ip ްJg*0e> cSdՒʛc2A@j.b9r;M0AĢp 0Ca|7QD_yi7+" Dy@K) -㒇x#p<ݥgb"nF򄽅}OL>5}9Cq`Ss;Z]t/hJ*VY:++u>*0 8 j4rmRڤ1Q ,z_`.28A|feϊd %?>q}$I$I$V]$I$I$I$IM8Zg{?Ň|*J,޶eg*I|'GIp=ě9x .gi(̿˞qFo4yR匄>݌3ZTU]'"e|bvw5h&NFt~=c0b٠~XZͭJ, -]\,1)6i|kCT>̖tWbU'7 },:8~v15E)SH9ڤ !블KxƎ eI@3bȻX{!\ƕR˽0c|GxWY*$I$I$IBg$I$I$I$I >lK.{kw>tٙQvmΞ#S$'{5= _vCE*oefnC{ؾ}S67 ۻ+BN~z2&g91~j'[3.!<2Geh-Wܸɷ~)*鵔Q oc]QJX~nX?p3v5UM`gvR㔭>6 dPcg('Q.Wj<0tǡ(Yt"OxzqB{OZeFKZypt4W>QF({^Ƥ %.o2>4B,; uf϶}XKn-^O_|vUl`Y cdgSZnaT%9QZxGXI73~F 覗Sb{y$Uld5"gd1fX~+"c|FLrìMȕc<=$I$I$_ K$I$I$I,y>s&*qJw7QΔ?=$Bڷ).)U+%Mo~+ӿ{yKT(PTbzt{BڬW]1$۾Q~s=]6Q@?׏l+I?u&{VW>e$DԙȾٷٗOc;!,ox~Vg׹fScz|ff^~Zc&J @)yHS>05(4Y:3L̇%G)qv> IDATצ;ü3if@; m"ZKiS9đaPaEb|`\"K%39|o7s'-&;x9dqG[YJNFD4 &]0NG:ڴiIXv=@7+xW{y2`<ɟ0gX[1f/G$I$I$|q_BtWf5k04<8{fl.I$I$I$IzEQȲtVv!FFF8x@gk/DKeJAH-}z(.R8{jh/ƥ*{@N4i} (+ fPqezI>{t;nMm*IҔ911"%)'ځ21mZE)`1jy3as٦MrG_XLv~Z y’vD3jr4NxQ%P# @FN|\O-$g=W?}]/~NsMN;9;(O/dL0,-"" 飗*DL3MR2(RҦ3HIx$9Q$&RRҳpz^w$I$I/G:3Y,Iz9,^6l`׮~s~?lW,$I$I$I$IzAyFҬmlvB}.,~^Vt4ݻ_/Qr2f8Gd@QѦqPUfJAZ,!IBʱxcqgr2/4d yVNN++1t5ý}?u68CFs-'uV-Ѣm` hй E6M$I$I$g_$I$I$I$Itȣ:UPah"t~ٛe$I$I$Iҫ0$I$I$I$I$IşCiw$I$I$ykPk%d̄F Y7qc2W*,3Ǚ̎ ^3q-|M-&C W&O^qqZgǗ)KlH7˸8ϙ s!#Jȅutkey\dY˟f9FU$I$I^_ K$I$I$I,%Gqw۷2&_zgs P`-ͷw뇨կp2Igskb5xs(kOv%镳eF=_2Y{R3r8LghpnzMe4Ž\C^ʫZ#|4P{w$+y&:®}@]e$ \ew8Y^ ) ڕ*I.L-XhSȫ\pW[[K5x N_(J}(3ORT!̏mu_9!#9Z϶i'JMZ$Y·[#}~4E6%ۍ4y03Q:P@Μ嬋K.0= /q4).Krgϻ+Y|©3 T(j2>=Ig.I$I$Iod%I$I$I$IK,-|3?˻xi>XgΆϊKg{#9ps>3g-&J86~!I?V8{_tVuHe_ف2PHɁBP ^ S b2Ҽɫ>v .L.,l@`-i_,8 sX2rbV\`TyD ksh00IY/UŹelO h˧G=Sy5sEy[Kr頕;:ދ"ǝ]SzKL #*uzn7ݝ?\vau=?ǯro;k9z,8~i! /:5zPWiwiՃ bs`f_~Ks(ID|6OwbeNm}GVgcUHƇssv,(90!Dd^V.ڿ.[WYY.H;6-gꨉO~6vEL$97sNR̲jQN{ !~7Xꏥ*μ=H=/t8"ESݹ(I=_nOg&s;ZzL6dXfAJ'gpr2pg{~EqN.^3ٜsnx >{a^yKN-g<4z\d<=ZgrMu3YmΦX;GrBGrvz@6?G^n;gࣹIȺ̟'GqpS6UG=>IRb8':{ 崪A=,.UYP;#Y1XS=Hn [;݃GL0{qsu~Ł|~dG;ҜVd|Y! /[˙l/e4vi>:Y ou7u>{Q^sʳ g&Ԯɹ[v{u̶$IVݺy´Z IRʟ̟=6J||.݅R잽̓ospefӹocU:?(SE%9}u.^Et3z ޕ\ڋu\jF;uNɺֺ|e\]yKk{_޺J2eU9W_˿}̆ϥ2Kn`Uދ;5o<ّOvySdl=<ڑ\/KOʊb{Od[)I2,o(jr氛A1E//$!b$+O*?|{fFݚk_;7`a}7E2Z~WCڼܓf}n.ȹ#זk\'lܔ8|(؋baִ6o힞;oȖycNeSIQȩ\=K2,9z wμ/g]׍7gyܻ=;n:OSs9a,ږk{|prʪU;E:Uv݅u8Y)\9s|.vp7RfuIܓ:KrEYNI|?;c}<[w8/Td*OO$Uo~o璋o>{=db?yuIfxG}#=7~m6OzfgA2%)?359-MnEWܚ'{0l\_NYz;F6V 뺘˸_lOeڗ[;/L;_*{>G?mWWIz3D9SuTYVG.RvM+)dU)FRdb.Xaٜ'~js&򪴊to̻s.Mmb&ݝ=_Wx?ݘK79mNHM{7ͻ/xU^5)xyܽϸ'wϸ r˲~ǭ=9g׹3H:z:9^x}LԻBvzOf2HQ¢HN"e Uy`$rmwܰ겜\K|u]ٰ}Wq9T9NR0uLRCSs=UY^bIƊѹ e+o3X 9Pzv޳GWSzC3S07?rc_/7b|e2lٵ{2q+̷.i69sW^{vܚ=S@guTP#gtGUd1LjeI4o/˪Lc#[ܪݺHT S/ʊsrU5sBΫgrhw6wUyyyyWW_w\ܱܲ|mˮ% u Cźޜ:5vf ^M_Luf llφC7\]%_n[GI2Yԩ2ѼBsXٚ*̢:LG}}PɫVb*2qki6O|3Ib"_iMc9LeOR\=sB.nɵ;Y3μ,\r9/|#=73Isebn{=RU7?./?qf?kH7k U\fiT?YPwn`7S3krA5M#}7zٳ|n׃kr\rsrm羭{Cym!h@.˹wK2S20UQ^Ue[]=S $k'jaS7;W#Y[2ȞhY?> LT\_Zl+T1H/Ub#FVg(]i yMUSy#+rơ.yS^{yY3;w] v "^F,=aM##rQV7/ʮ޶ܔTy{9Ȃre:IfNJM+u3GUUWȩä_Οvg=ZYQeeliOgY3ZY_w͜T|iUw!dvm[ݻ}~*9|[~"o_ɩ˗sڎ˺dy`b´=48֚xQe`y2-_mIRV s^UWLdspl&?><|bdWF ɼ;(z[ R WC IDAT:ʳNXu;eA1hE/NsȞl-c\e֜w|^tOno1w)>$^FE.[|rӵY\xƒt]-Lj׀owOMk9+-_u3E9.#E;}uGvȩuyqzq~bjm0wt7c݉+Y;<1>9uӿmlhᒼ7/wL<\c90V<?b"Kkީ#7sŬ[7y` Ϲ?&LMJQhL"ݱY0LU 2V㯢lgdVYfX7"):Y`~zUᰟ~[hF;eu;)S3:/ O92U./߸>f%~ o8me|螧cLt~7./8+uʾޭٟ*hޔ״ץGD/oEt2)Rdln{ng~0uT)Eu*sW`ϺœԞʦJŽuy`4O >K+SS'j{; yYzE/_T 3S{οȆ;ߌ=J0'.՝HyE|eQVE7Uc餕Lb~ԩ3LUz/{ns@>=M-X0 Dzϰxٛ#+3+New6寻3d3vd<>l!U<~<2G?3oKeىg]3ysܛߔkyhߡ)oU'eYӳrdAs.'mgۓ _&2}ӹ3K5WGyiRm)?Gv8oK~ spKʷ{Ʈxu0)eI8E+W>U?f^βLY9wA&Av}WSJwkNu?dw1H=;ʦ1U"e띜z=fŁ|`#D{OҘ#O֛㹺쫧*gaQܞk[ÊW撑fu1?#bAFy$9+9t&2Umcrps^Φ尓#;Au+ SdM##V/s`,ӭl)sowK>=˻kϧ';}zޖ?gf򚙙*,Gsܛ=NN.Ω4+5չyoQ&F_JN1ڗ>1\iɒe;Vl+WV֑$iuGJ?gÝ۟oVC_s{_nwE~.8xO6wwM?pFW7GQ;ˌggߺ~"75b2Uuc>ۿ;/̪ralܝxN:3gOYeo-gWV!?|xt-9ɂHUL`y*f3㹭+g޴ܛS) uO]ocө6Ͻ:yl0AupnA&`^vV֪ӫ>gY^.H;U&{?ZZ,쪞>Er>C~4u&28aʠD;G'ƌy]LseOkU^;u2QLή؞̑*u7A^6b<y2h?`^?XuU'uT9x֑1}]SemRzM柪ϻdݺu9nŊT{Z:Olz;ʲǟ 4ۺeKV^74,Z0z&tmQvܜdYN+Wt/ʁ䓽{3囲$u,\INXvדg(}ފ̯ aƋarlE:I~=Ane~Z)Se-|u8" 2YT/ |9 HQYe]y/_^$Z /U*v8i,@SQt3R,H'oU< 2S{zLL'ߴ:u8(%uLiT g38%k['g$;T=% RduE\z<ʬnE;wO9IZ,NIT9/nBԩ^zdzu%$8:=YX,b4E2QȾ`_l}>5ta^2b|cNyLg<L[ߚi8U47/|D 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ 1>4A b|h@ gߎ[Cy02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>r IDAT#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#ޝUx}d!aDAhTE-*ʲUmY]}tuwU{*jQZZ8 ̃ 2y 9{G$+>]kwOߵD%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@JP"1>D%b|(@0h4n0/<ᣩiCJ3T*!?M1<( Ѩ(4*JZ[R}AT*VinnNZ-O!G)twΝ;Sh7M♻NؽRI*j#G9z==]ٹsGjZzy7jtvKinO m Mhdٶukidio S(h4R ;;vlKRdQʶm[ё#F-MMg/FQ>[^g1V!tյsWhxci^{G{f̜Y~]4 ֳc^*;wR'Cd=zLZZSTk;:2thgyS8d7ZR$ dp`0[n+O*J2cHFl߶5]]];~Bƌd``0EQsPU*Iss>/&tzFy7(RESZm zÇeXgԒ$C IKsKWc6FÇgذa)"zEIwZ?IgZZ񼹹)JחQR'jylv^E$??8+|qϬtprJȮ`z&/ (($:*awH8T /NoPdr|x I߻ҿ[p3sƌtvMOOo\4,Z+R< Pzx~Ǎͧ?`AԔJ(rcs{.ޗ~ټyKy/ްpU*T*)4VUMi&ρZZ}!q?JG?gYfM#fǎ9rDN<|駝'_2˗Hk71EֶR>8 ߼ծ)բFyJSs >W3tĈt6ղekW^n_fyQҍ;C }JΜӖuK~mU[3b̨t Ȧw:P-~Ա7?[z(oU2l4vg{Wo_J9iomIR>PK_oojo!0z*(]|Qp?u\qoeѹƛͫ;v<;iӹƛs}}YN?m0W~YaGz]/jڇ#2iWޑ7ϪOeU=X0WIYx‰ӵ8w=d/_oʄy9ћrҞ$IuԜ)O;_<4egcjy8gL:\zIi]~O,^#F5mCf^ݞ5[_-_j=\4yYjA_ƶ{džvg롱|fD,}ݗԜSͻJxsV׳uޗ6CWgUF8S/döԊttȄiGfrlt.ݫ"7GTޚJ/}´n+?=UimkIQK}-iϽߜ<o5ڝϽEґ'+W\|AN9b|*X8?sͭftՉs8So?̊=sr.ΚIֵ?oY.4g_sKvRFYxЅgdT{rmMo=i2=\۹3?9ZY}Wʨ#ޒKG3e5wdTZ?Ggo5?!#/<#GOb0>臹 0/ȇs[Jz6-]~'߸ysd/_5kIe؂||&M.ryۿ r!Y :z{ˣO3O{FQz^7=_qg֯P:@Gr@߽@F) ҒjX/> +W993Y} }X%#OY:|srzN;+}w8O(13?'NʘJWWY4|E~ٷ1O<$ۊL;Qo˶Lx"CZv=-|i^ZS2w|3jWkʶ{L:#3JZr1߲:^qY+2}ڴ͜)kKJ4L.ܞ+U8=?}lro69= MO!ܑ-{S=HmC3aʌLʮW*3%G/!fĉذ2?ؗ!f稣>51Z޹ .9> ټvUr[*#&+7t03eTNQghgSf19x_plN71C*+m!>E#+W;:3Ç+O(l޼%w֯[_޿b!b?3Mwwwƍ斖j/r5$3zTvܙz3C0V ֲrrιˏo'KVo;7\*յܽ}sKu?RUڧԓf-7($I{X0;nΪҜsN|ws)'gdMy~Iw]q[ΣyuOگ{c<ݕzT2O>ybϟ_<&zݒ/^9/S_'&Kz朏\FC~h`43g%#dTw/ڞ NͿ9{a*nUœ[R鼯 IDAT/*77]|򞩴1[r7WloRmɌ]?YpafX\59]sGe=_tgT[33r>FOe]yǤ2rVvߝ/+ES$i:1g|O̹'OmOn΍w#97^ue~pײ={.V?&fj|K 4 |YxК,.개|rZ|7gҚ_e98~c·Ә6z٨tLiÇܷ셮>"ɥI*yYg`yvYz5BM6e 9rǝdMMR$Ǎ1ˊVf˖MMKXkd__*97o=_?x0?$V?z}碼-Ow-[IRI9aWߜ~ݝbz`ùkS fSOG[NΔi$tcά^s> ~'#F#Io4o[cwsCFub6>\ys7CsېwJSLjOڶJ[Z\MRO댹Qk,^ӷI2~x~hF^CsgU{IKic=;nÆ~Yj[%s:ٕ_qWwt'~Gzzz˛fС9s S+W_>~{\/o`vlX2wL͙Аnכ2}qcyy9Ym Nˈ{ݧHoWOMUvҜSY睓ZS6jLRɶ>E#;&YfN75-_@Տ?:Ol*IҖ;䴹/777sHjKjM1_dpS%iokI֭驗WT;APW/oIQ :>S4~m92CRd˶-پenݜ*Օ`*cg|ST2lŊIN;L7.k֭wޝUVc%y5<3ٲ,ZGo_+~;۲tshg̙='o91<]]]0~\Z2~~ 7!1I1 Yjuv6|Y0of}|S4[ş̓ޖ9/͖srq)Q4R`*==~ص_ybP0P;ζ+.Ϲ#'0=ﺀС3ft,_T{ѻreMoooy4/J4ŮaZ͠HMY'=i}YwvfԤ9qqL5ܵ$;jɯJjUiʨI'&e#[߾:w>8KWSVg dsលr2cM]iLgG>\--ioo/?cƤcHGZ{yUƯ"=[6;Yvut __K> y !%<,[)yO` ݝ;龷TV?aXgc^ep|8'R5l%]=9<[c׾̝Z~{玝92 ƪV2=^_%4KEg23޼襗[detd^zkQd℣uy|>?y,ֽݒK'ߟo{ +*s9mk.{*ٺo:#.\~N)/螼f˛'9b-EGw6䪼u/˦Q]ѨeT_WbK.90jReb("Gr˭{/uoƾvWגΞ{מJ7yυ?_3o߼"CG?߳r#^YRIs8{H2gJmǧU{Gj]?~u$+u%׼'i.fzv!zһv(m(ej[r4OX9;_1f::T=y݇ޘ?t?wCo~C>ɋslZ}2ۿ;˖'T^|Mr/|+I9|7-|8S+j92|_n 2p߽8o;x4 ͮ0ܱ?8+zZsyo疡5ͿC3itg@G'rlnC=Wy [w2^|fr9ilJ~E5||}yו/}mϧYM )(eh}gܲ9gO8[{k9:13k7ehmɃH]fyBj++7V?pcӟ/G<œ{Rg{ylfr%V= 3S9:z8G&37='[anYhryS|iQn㾌>SVfrpώy|:+W$E#󓇳{pFOlXđdaZu9eۣ#_Xء92=J=F5G;!7PMeztoFrk0^&Ïnv^o-gXg2ql.\ba$Ej˳98#NR?ق,;ob]2xblQ_98:JF*{EWk\5I)Hepv iJd]z"ytpM-4W=vȶyr Ve*{̑[\I^􇷥>9+'}]IJe%Mvt7R+Tk]?~{|nKom627FTZW(/}=])ԫ,VPOTʚrKPj<?i۲ٰqc&'',oYϋox}&;wn򌆆I^˃IR4RY.'(ZT=W"Z5 藍7]pI.pmwMdR= !"Rps/Φ53H^bV3RjO>/ Wzu64Vgl,'lU߬g]'U.-^qoOw9I_z-}l}LMO30>IrV/ɻ冋{ulV^)/~Uk8p>%\|L=+Lg.~yEpvb-5noUؙpNȮJ9G.͏cgv p> R07_0{/7?xZ-Gۛ0>Izs ̧?k<ؙY9Z?Rag5k'厎J$EV3t~|7ww\}w#?KGGGJybNV#Ɵ1;>w^~}m7vwi5 <ٿ6 Sw~f'y")3Jqga|st}lgsC9:J?sٚ䳹 ɺKOɞfȑ,6ǽy/s+^vq.ڐrҨdzl=-ͥjNu~>r/M2әfm1̾z ΄3̡8gV?a|43λ <ĮOCL*RL^JLS."i4%X J$IQ|ee%,..Qi>Rr9I,W*)J)utwUERrWJI'vLRbf횬[6dJtvvdiJ*WMBSɎq/J)\3VQdii)R)}}IQd~~.7LwWw+"F# ɱtuug``+*gRf IwWw宴Z^p&N___:tEΦ3NLLRsP{zϣ4[V?4O7m^[~]ZF&&&4ȹnb{)PhfR|~+CCCBz3Jysz{{iX?~(4R0Yfzz:IRl'*UN֊{/f;7Ozzzҳv_\XB{3s)"8ULMNfZM4Ͷf?f~-Vf#G7pOϜI#0Y` k׭ko^`]zq*&i6ٸa}^+2ߟ{ϷH'3<"6?Eߝ;PP4F 5h(@@@j P#4^ߥ;'sԱџџ^EaM6aGb+-2q<; 7FcF ںswAA;5jpM!^gOՐ!̴nݺ̲q}?yTE5kT;{̧ѿȼ|ꏒmcSlנr@`pFF捛qbߏ@ q3N4Kg?`V9Ng1IF BP(TWSr4G{[Kڮj* ߼u;u*xYӧz]d<))).{pGuzaP~'iiz¬SIl3j׶Aׯ]AtC]leۛlz^:{󥡃U/ìXȁLPG[уϜ`[75i]bk4KHTIDTt=_梨شIc"jղE:n?׍ujߒWSPX%%%Lrrr>c͚6rAZLuKW,15r&dqv6kV._0/ם/3J@ڥ~N3M`֭^z޾~fLYO7a oPƍ'͚KD'Ns7╫.} ޹g߿#":zܴuΛHD=u=b_}vD$))% ,_ii8r섐p֮AxDn"x=-=<wlxs+=nްVQA!*&^G"rsrr5۵%.bo =|54,""2بwtݢ"&vIN͚60dDC[4o^vm&y;012*f<Fܭ.]6y<u1*:VPկNfXq0c%U=~hטG֭DDdoc @p%-v g'}{8ӯ]<;fS}Xp嚋1{JEKH$؛y QOKswOϞ ^/^&Oy:_UUw))Y>~6VDР(MSSQXx۷cbuxNz))C"w#Ν"c76SS_Im~LNnnQQё'Eɶ68URRrs Nz1;qWuxWxo߹uuڀ~x\fKש޾n=MMX E{|76hPgD$++#:#3SUUDpTTyUFf\?n\*77(*.2u8e_j$Ti ٯÑlJҖ* HJJ6i{D9esC99͛QQQZnID''7e<7  jܨ!ֵuD$))^G[BBgLZxzN?eR/XM!a͚5ux\.ukKQtLl/Kbf豣GTTDtf\C M wQ62A!G 7z(vsJJ<o!G ?47IE*NҠAG{ M;Tw]xAՋ}{;3C`?;ܺ}Dt؛q>}PGL,vOII93B_ov?Oמ7o&" S'xx^vCLvAD^jj^:Y{_p7{f-ZD{yfALZHxDͣc:\>n޺ݶMk_O=;:s?0_ߝ8rr`WE68QIgtߞӚ6iBDio.[:--; )8F 5h(@@@j P#xt1^0F 5gYCCCYIl+.#3+ի؛\ETD^Psݺu}B ?^II1'ɎBi_ƕT34M$ r9C^?Hbvfin>:x ]BK_@GQ3]gsuHwk`?P6`544P}ZB;j1;;PMϳQ>"s 5Z_t)F(@@@jħ9wJJJZZ5!䄄Lv*|N"tQ QRRjWcc~-p8B{{ a|>_l @}|Xtl":࿫٦T-vQaa὇22 ߴo^r4jhk++%N"tQ r+X-EyyXu-Y8?=#Ukc߀Ve7)ɶlyM[s@`YB)PèGwv E?ݻukV͜1-t,@M8wQnDD^|~҄jqvu ,IIIzVfݘNvNtcV"ϮHs[}ݽ{+߉ :yh N )))ikiP(ޝ7c]^>l;~}4[n%X /z Ȳ%-Y$DMw[bmCYYW5$ߎ;.,8pϮutIխ&8K%z>Qsɨ(75CIII[KJ;TE{Sj}[|O;vТLr(_4@C^w`󐗓e7WDEAAs8BU% ~ܞ_dЭc=M;giYӫgOO//QI+%%˫WϞ-vVݶ;ut;u76۲mٳ b7o6ihu1mZkjzv0*񣎮nCxщcGzt5E0cv8egߧcٟ!ZZ:˻lzi;;Ϗ2mf-zYњ+OLDrrmwQEEE"2>~ƌbvbgkrbHC]6 ^f֡ι3'ƒ^:ohPzQ`|BTX#[lc7k+&4۵u|!,͚5ʼn~7W:w_WC_IIIE1cn !QZVb= (ʽwAAaFF_II ߻{ܘѢ1m۴!ukVM47#<\t4w_!Aaa6_xFkΝ|<==}r:{Ԙ#EDԸQ#Ѳ5S+d6nܸh?{Y&LJLd+fDԲEw6ԉZ-Z0ۣWϞDyȰ?IZaC|b׬^uب/|UZCCk~>a֭at>L[KJJΚ9#&2-7g׭Y5iܱ#b"\ٗ>_U?d&eӆ 𐵫Whk߈`5i813!xFG>~0jBSY#x|x֭L3'ފUSU516t@ 09}8n޸~ْEQ~^'N 4?Wc4S}*۱&cc ˎT6dP(imgbk-YYYDW6ciST%%%WK{6*08ϝgjimmxI"RTPػkSt7رkώ6 8`DS +":{KܳwŲ\ҷc&wk Dojb̬ٸ{z cBY9R\azVNEs 褤{ [6mh6nb?0f5d m*攔{xklf1iB$j3Os8߀/^Я/oԨ;ʐ-S]ej*!KZ<@__MM5"2,^8ђe݌mظiú6[?yt)_[Z5f<ذi/^lXގC fv޼Y^6v}[n޴~݌޽7g2_Ǘk֡aCN/eGD&%'mްnǮ=Mޤzxrcktω݌&N6|Pk^LO{v7Y[Xu'L~~o*(ȋGhq3gϞ?}>z_:hjVvW)DeROK -M͂O7^>D6ai¥GD>x02*ԩ# +#ǎ7kڤYӦLBk85WQ+N̺e䱣p*|N}YBZ 7޽=}[WCvF9= \.|>ŋOqT>EG,..N}^Bor+@ @=^TT{^%%%ǎH zP({葉QM޾%"yy9uuNzUXXmNK uDE0;07;x^Gڵkh'N:cA@`R1s}wD;賯@ubfj:˛Cv-ļ%-[D2.?~A(>}ӧD÷WR{'O^ҫ fZm/]_bk# ps߯6!6VsNWTTp8`9Μܾe YgúUΜKD oެi__Yg3f5hblf('7WY̟]:wSQQ135ycVmxFųp8BUE79!e惮Pg%>|g޵c괙11$#3 %% ՒI}1~S&Mlp2 DKfŭn޺MWPP23$QE_e]Nr-[ضeSݺuOsVMMÇׯSUUU6j7ՔשJNXIIIVvۃODh/z&퍢i,. ߤn17oXSSS%luuүT yH[Kj28$^BBZ D4yqq]颛q.^,^wG=_'** Z4oĥX߽ zeC5jxWlm+### 9>+:.}ױt9ܱvv6DT~ oXBUU`ŪլxXxDXxf{v&%%ߒ&>||<?xhޜ֮4/pv12LHH?z܄2 "".@ZZZNN.##S5ݻ`;]ě.'88iYġOAU #E|.;QIIħAu֭---|/[4xO7_@_|ڪg:22uCBIJg3AqD$Z|>GFD*jPJDB*s/^ =#C$DP]ͧ,}}_Nm԰xquI"RiЀYh԰QfVxodddr85UTfUE%F|΀~}<}&--33SVFFT`Po""";thoaaYXXbjbl`%<"B{tQQQQ'?~oZfw)ʿ{DS IDAT ƦCѹztWTT 7iiZ>W|탇2ldnn(Agnmi}\𥷾:!6I'ৢhnfrpߞ~M[R'䜜JJyyy=wc.))١C{DaaO oBaB}.WB iѼY<iݺv⇫A\ ? V¥+Wzutb5P^N6:.^4h쳂|饘B-9 ntӦM jժIn!_tܙ9ɨٛgJ kKKX?y.vUH%D^& }|}Ň2B__Q½Dmi٢ݻDtsoG{fuw"ή_uڶ%" @ u5G{.WQGr͹Aϯm۶F'+;d ̬ ddd&Or۔vUgy<޸c>ܸ4hkiUf͂ClIZZ4oxт]^&%ݺ}{_֭EEESSޤ :? ";E~w{/ j٢y>m۴a/Lȡ]ԩSV-UG+))1Sp.7MD**r%5kگo/o_QSugW P9֍(O7I^s6s6Om۴pt GEݾzzu#+!1{ {;kU//ϭ/]2/??++kÂB|-[*! ?xЁ@u.XT7nIJ#" OuZ[u+h߮uҹjYa+Yԩ3ޜ&qvGщS֯]z-'77**CU-v,[p\ܮvt`g|rm[6-[@y/!AG[=51(x=fΜ1ddfzxz?xc6n޺e%%W3ٳDt//W+io?ckWanݝ&MYxѲ%2.\t iioM8o_S'O4iJr+8!!MRR28$teNƲoAwĽSg945ߤ͚=W|Fڵo co:|$U"eK|ev&9h`P"JJN.,*|e!]$n˶/Fb7ߩc{kEEJJyihzy!-~N[fU7c7hE]toן_>1j,j\no/ulJ%ۥK[ﲣa؃GWMtgmի2 P! Sp䔕M|iv'|>->> eP_O ND?Y$~.'绸]v,bjbgan6 GT SpN<޼YӋV6, ٮq]򓒒gf70i_.!e;X&c~#3Kvj~_1̐0vZSGiK-g~2?~6ל]ejHt,מ~ZhߒZ?v sAM~j P#Jڵk8ԬbvCΝ!o&:]N 9##؛#SWQF(T j*}~vhd Dz?>;xyF=<;Z۾ގaG?oӧNfGOt$ʁ D)))^޾O.**""gW ~q˗-^qK@`eO7@#۱kωSgded4gϚaei|>?vO@ CUVN߾sG(r"5|~Ϗ2mf-zYشrrmwQEEE"2>~ƌbvbgkrbHC]6 ^f֡ι3'ƒ^:/:򅨰Gjb!>n6VLik|BX߱5k*QWC o殆!jKDNw[C]e!,?hꑕk_f>aC žv&oڒED^^|y/i3fϘ6EMMURRrՊ_ؼaCh޾~ֶN$"EQnn\ sڃV,zqƏJ PmަUP$%'611%&gϞ==|(==C]MJy=t@55լWRˤZ<%"Sשo||($4,mzWzK߽)(, |adT ֩SG ܋{;ެifM2q" W9HDf\\E,jjzuwSXX]{-͘AеjZ~cr򫂲s"?ZKI""{;ႂC?~" \'|/<}֤Ic&'kO/oPU99۹'  cbCBlKODDoޤ_$5xXc큈9ZPPPPPԼY3v3s@խ+r _. {lժIRKAaIO? 61 54dde G 秼J~nWKZCˤFRWW{x3jἹrՙlz(### 8@ 5vѣΝ9y Ya֭߼uGܭ oެis)i)KDBII 3ΚKJH4FVV6PXXR.nS&MPQQ2)ѣǢ&3SS%$$|xT&ʟKBb⫔ffqq]L(=⒒ ՒщGgddt܉TUU>z$N}@ZE_ݧMY(.. W!9y9)9rjׇDݺusE|Z)++ߍO(.Ri͛crQ O[}OP^-[Q٢8Zj;>Lk$UUCVaaٙ\TTKFTK|<?xhޜ֮4/pv12LHH?z܄2 "EKKKeddf{lgcQxKfVL^~>i +JʟKAA+Wl++t^ *+)4hT322UUUDquu5f W^玥*uʾZD$翯[Ww>\&>}Z\XDB(.*~Y&]5ƓQO"}􉆆Zj;>Lk$%%Es3܍ojݺ<%'%ԖVRRcMYY$%%;thϕ(,,zImii"^ZJJ(&$r%$y͛\n֭k׮-~ 4@IIN0_`%\rڪ^GwAJJJ}Ӥ֭3sT/ҡ*.D魩ֺ>*ҧWBi&}N][ߥq=UTT֮[H*|Uro5ᤤKTQQoZ +R*|?2\#5sӋxy?..e۶igǶZR <B|:ujwjx)W (@%8&9}72|74[uQVVNNzɎw?]xd$;޵;; 5kWC??_vT"**@Dx԰;>珺L!CN9.4 p%$ݮ\.{}_*͛]{\0WiMHҟtQIFb7ÇQ1솚IcA]M{?|;ѭ[ ?:ي{ |<(*(\txiiif]MDp3d4۵pmbBw?,,,dAuÓۺy#͝0.. K.3XPp%;ZcM-Qǽը|5۵ʈ*)xVZjks]vT7<)==[:wB"Z+WE ~_6fn$؁LMMŒVfjj7OR+yyǏT^$O P3St[z-crˤʯTsZMMyB}vCJHҼjn.;?WbQR¯|F?Uj?Ivjh@D֬9csʅΝ~Z\=wcG?s?l٢;>3_=~ƍy5'[eC5n fUhͨqYfϾom*5_@ՠ̿zTj!,{5}܌}#6*Æ3RP735i)###^ &RUQEo)(|yqp7J j܌uqܟZmvpFۘ#?щݹ}&uuuvFٹkGyؘGB&8ggTJQQ+qúϞ_EZ6m\ͻn._TBY-7غyxi舰;rXYI 2;oep\]HKK/?L zoФIÆΜ>mʤW;w!ٽ{+߉ n.Sǧf'Uֲ\ze-ZiѺM`Pۘe_ŜfhҢu׮#c%8۝9u2+񠱱ɓGI0=#}ʿi&kѣ; 'ķcƎp縸1cݻ{8uwI}rrr{vn?A7#Ǿ9{͛4vϥ$Ҟ mm۱h-Gƍܽ'RaaQD$#1g֌uOQBs𧩞w>3][o\*=}֌G:xÇ ": ~Ҽ<o)^nW}=\/+%%ED۰vU?Oף**(jjV-h # y1IKKؼQG[@cFii)`[CBŸ={֬iS"5s{Ld艣Z4oNDvֳfLv_8cG4~̀e{;[W+1.2{qӆu^7|{;[ov~ukVMpwP7+f|>Nqtwqu#}9u vhkpܘu?m[62Ǎٿw,YU;w''cBBbb}"RVV޲iCH_Tx++:c=ܜC]Svr5:"#͛7#" ٳfzF\BD{vm 5r שWiӚTaZ̛u qcFw}W|aQ!^.''cۖ@ȰgN*)*ROW[fN썉 4a+_ty-III>|կ_7b޺eFYYY"X8^dX蝸~>^] {;:̛3><4xE ~I _(/QIIɒŋbcn݈]f53 xׯ;ftCoǝ=sQÆ9V-|<=oy{wT:sBݽ}V-?֭i[7bc"GQPPwlۺkg<~wqttÇ>|uێ^=-[h#"ЮM:uL2eӖ~JJ̕4UQڵ~,wW<@ZDdMdh?tnFfrt[&N!aG[ZٽIKxEKt3^aӦ k۴.-JZfd+/ocmo3KkeeAU1n̨t3޽g߶-\\[ZשSڵmӨx}8mxێ]wna`ODZZyyݺx<"2߼)**hk{3hۖ=,deeV\s푣X;K#5v|;mr%:uҳw`g~!ܶ95MQcOtoԣ.KECBØ 79c~#FdيLIsL55Y:۰qİ!DB3KkoϬ%7vw5Zthbou%vѾݻrrrt72WOvӆDߥC/kz'Lx۹ܯw72YߒM% >y֮U^LŊztxт&u|7ݻ3Q:z^׮a3O޽[~t::q5ż9sZlifԼMuaG6oL<X-Zzm^^~&|$8@0u$/+WXYf̻wlvyyx鲁~Mчnތ;rTUUZ*.h\'֭ӷo}s|rr2y>y\t?!Y6iY ݌e$%%KHزiTسs{~{K+;^;qܽwawEK'3uʤuYm֬)/Z,JIQ޸T2@EIhVvv8zŠf_e :qCAjT(RO>-PH%%%f%:&XgH;'bhҸQ6Μ|9//?#3sάZZ ի+\(--k'v֛`>v;UJo;B"?xlZ3w;K "m-ղ[f5c挩<`MID`vƌL":vaC C` C qtۼ~z݃CBKJJΞ;{"j z;ĸǹES^ZZ]wt+x3SӔש^DkWHK CZtwf EE"zz'S*,,,,,ܶcu2wY ]h(~Ŭl"ڵg߈Ú5m[Y~}{_e5nHWÔi3|~r+_aᢝ0Ξ>ADN}J6t{Za˖eRr}MMLY܍'Ȩ蜜F1/oDgâ8StI ں*vownXZƠ 2E:Dfq2 *<>39{ԙ3DZFF[?ql޺jBbv⥈HVrx2%&&>~ܼ"hђ%̅.fwZpHs)e~߳ID|s挒K 2x5LccnjоI>{/_2==/YU?'$uD~lEEEEEż}BQQQz,ZnkoDFE/]uwr^W쮶6dhffottu{{HjanUXXȼ( bcKVŮnniխά="}?GD!!eT|˛dm~~gϝdD';ccccF7y҄'^ng]]"rtԔ6 Qc_zkVy"PKK+6&1oc39:9gddL0% =~UI5*)'NkQQ4:D$% $)טw\.WSS3""ro9cڬ/m۾Pay$H%׊ (::Z{fР\uuR{/y9%[340<.b8.>^G_0G"JLL<. **LMYYE$1ϊ*K#pvv޾>ݻu۽g]vuKNIIKO344t&ϣ׷aw`RcG\%EEEu-3 _ ()+1%;'!8]72>""#%դ?xБݷwB0+;ޏ_%o;::֭0xnُR?$Md)@_?5-dXYYЖw%ҤÿQe "#ul TYyԺu8镤hUTT444(4,lђ{wr srr,-0ͯ^1h++K]:wtptbRNWXhA ͖,^x,B"kƍQ޽խsރ%&&=~t[GB!K]szC<a^>Ǐ+ ={|;w9Ӧ61QTP05mZvTt3s*(+++ϱ|SZ-MȔT3x颿6ǝc;3$$4"2Դ6((*DEEZh 122,*goƜpa%D$-SL2x2 6PSS#"-!Kk 茌 ŏSOmٺmܘ1slg***֭[NȨ'O,ZhFu!hٕް~#oq݈?l٢QPPh޼ڻ,͜1]GGO<)//W*OD\nO:EMMM ̚9];fc*]6cZjL2 {"RRR]2;W6~} EEs<,pV._f:" W@ YK1 NӲeKvQ˖-OKRV&&<@_?6.6===>>Kr8%n+0LD$Or` ϽpML+vs_Xbg2=yIbVU/Wbրp8))7]9FDxW\qy^M>ooؽ[ׇܝo]qמ}W._3jG[ؾeۘ9G;+{O8~mzz)NN7:")wp?ov#+sH&JK~a 7D)&O[pҿ !fav'woÇ>bO[ܽ7}'=R^^>))i˶Qѳ_l];m߱3g۾us/J(%"g盧9&h"H]]m ZZEϟ;~l_hmgz݆XYGd??GRڵwyW.WPTx:pԘ^޷\n_x.=#=&杓-FҲ{nJ.uȨ\\O0**KWDB!:yHLbqffGޞm {' GnwΜ<FDB%á.]&MmS'#4-Lۇ]Imdf`coK_tueGOoz <M.R:k|+M_;rUq޽z߹[%]s7+|cp`k͕oef$Yw%8Nn}|JR}A2Hiֺy#OJǙQ?ev hz̺E#OV hF\\g_i=ԜTEeu_MUUID2 ,>muMM^w.z:ׁAV zsL)ׁAxPӗ909۶}ꢬaCSkv9=3+>>4jibcUC\_5&MUYeoAA3hutJvg?(6C5߼ٳg2aC5S+(((t)mL~AILLԩ7d]Z5ZMQӎ;zPԨaC:X/gee'>3 󭬬Ґm/|5lQ 222Q }}v=$kWv?i(*BY'dQzՋfGe[ԴQV-Z(Qnn&;^B)WrrB};wWP/5ៀ+((}5 Y9jjj(Tjj9{xTO>RsI4F7g\nEl~[X̓=-EsrUsrrD"q9\ee圜,v{߹1uMM#"#eՋ@ [4m *ͻwfaaYDj55zfbɼ.0-'d!äJ#=!!Cz+HTW\ u RWWx/' sr23}"#"9iJ^N]VƼTt"lh.D,dgǼMOOggK%)Yj0H=w q;t@IOnjUK#_ܠŢs8yxD4cF ^ikl\_x# ޲}ZlaWw ͟iێȨ{DmZZzEAÊ/ׯYgఢ"IHWGg\[f1M7r{eуwwbδ07ٶs|<߱{_AA% 5i.XLKKs- ٵ}.0[2qP6r%(#=nqP1U"p\nEҙ"g?2L1;ќYtLV͛=KW卍ֶ3Nn=cꤍV8'M߷kۙG-{e}zXdݺv46++kׯkx =yݹcO7]\}ؾeChXXUE58$tȿeLxmvt_ I4k?G޾ubaDԠEjZ@N׊Quqy<@ U|¿Y@VI1F2Wރyyw GDB]loÆ륥{KDQݻjeٰ ,~H$8e;vKHLܼm!֭^k/ttu:wث |UUĤ$"JNNaũiiD %,--H&BDNΓ&mެ۷1!a"ISS3;;'[充η u`6{$"m-8ىcm D 見kFf昑#ϱ=qk7ͤp8H4@ERPPӫ鶉IL۷3#3s#Gk;c哧ۊDv׮\޷w{vt= 99+VD_[2ZAAA]]-%%U4==z4oӟ(-=]EEYYI)'7WvıC*^޾DRRSW+kٰޝ޾yLRT\,JVPVRRPPU3X"-<"eD[C M4rawfMˋ7A\.;::x`ƍ8 fGe<}O.9DEҁGȘԙ3[-9~Kp cG}]iijN0@йc˗',]Z,W {;we吀?=M6o%8R   hH@@("&&&\PE¸ظocJI@(**U5ءOTݣ h SijjjVvv_~}_}\gaaa1}TvdIkup}&&n7oЯojjj;m]0o.6|;ׯ]c7_ [Y[߸jcJo?ǦL(ҒnGޞG/`*eKaӳG"9}e;- -DYwn WVVbslgޣWN]՛3v+-;w|A=gΚܺu]CBBVY]LN]?ݝDmWX>w&Z^nΝ Fݤy[..6'W&&Fc7 h ӴI7o\ITT4(6. ¸GXXQQQQg;nV>{8x(==`Ͼa:{ܹ>zI59_Ĩz2APѣ SRRKsYI :Ub}JDg=LDN7ի''%%m޺mi&?zPa5 |ݺu5mzh~ij EE<tutbb}T&щyW*11Q(2tm\,+,,Y+=tƏ}ŋWfeeD:eÍ돟<^v]\\t+ݝ@wH/raQ!ϓ[5rd 9q겝$Uf@T75:(8M-[]bͦ'+LD"!CRrb.$QNNNgn1l"JJJ1kv_ڶmV۴%ϴ=zxmmNs&[)))y]D$[N"))P*lll}Zڧga.Nf]vW~777U($*yppկ_?8$],oÇZjKm sJ\nO:EMMM ̚9]|nFjժՠA}Iwt@`ݲ%+((xRtuuueu'qݰC4npڷk׭[koQm7_'G{=V:$*yHh(5lPMPX3no5jH?W$mwȨ&k^//+.pK֒M}*??COd"Ǿ} d2" x妳=Nk݆ {wzligQm,v"""Ǫi)aBڵuss@ҽ/q8Ԧm[M?)]Ec Ւnbbtd?\CZc+SgHr8nݺ[hvIP)J4T $R  @)((Cf@@@*P)J4T $R  PV._:u$vs<\ڷkˎYzhty9O^;̔~v|3(T;H@T;nUTT455]f"vW\j>t;$ӧ~ǎ`GfC˜NKOnѓ'LaWYM4%""z&(*UbR#]H$UX^3M[; UM'gNt_vu^=o:٫J:dW\yU+ܒy-._8%#L?Vr飆 ҆k}Y ŋ~xT޹}ff4* h է@''670*2jq} ֿ̒_7o:t:hݻtFD:Ǐz/:>Md3{yzշ9}Z-k֝9cҲ,^xaq]@qúyii [awlz9b4N^=z5jL=ygI]uV:w8xXnND.]իvfnnjU {_qFAA\.(:-(..B0>>S?fon]ߞp)???..>==ݬ4z8|xzFFAAC%W#!9v<#33//K=mlQ6\|&LfBmL̈444HMM}=՝,/^JOO GWnzuY\&I*;w=6<"զM|$*E n:ٷlbo,?U-11Qr>UbRP(dnlڰ]wW,[AA3||1bÍGPUU%"H_223.]طgtdIIIandddhk\^ "u5cF;ܸjbly55U@0mdIslg1Шoa!)s>=-7x Dt-;Ymm-7m"ZrEmUx7p&*Bb׫ND-,CBŲ'L9kԈ8;ܰ.=y t|ᜂ|hhߵgo̻w=\oEEGGDF2}>:wGW\leJ̟ރ{_j  y떓kvIvw {8sꄯ׃͛Ϟ3_$q6mZkKyYXXȎ@űjrq~/}Pvm\?PtnKDiֺy#OJW`F>Tjj GH455Uv`4T $R   hH@@@*㖳/fG+c/EEEv юm[̛ˎ~ 99Ȱu|6 hm7oQ)ztgGAbbҚuRY eZp5Q hq'33үo_ M@;:95c3T=473>m*;Z5ߓgNXwϞN4 eڳo7j.uОvl:k3'O~? A,7w@-[Dm[mgθp/iK?y&߽s{ϞLs}}#x|[Vj5%%{d?n:>񣽻w "m-6;楿ߖM^kԴD"Qrrr66oZj}D2<kҤ5ao lcχ'wsinfh}M9\6n|kWG)(H@T)&ڳq /^f {.:89veͬƏ[v]nL~^^ mԈ͚5%{jզmbbX[ Ə?I.ׯ#fM W쪥aHH5k޽Щ˰']YV 9zl}!-Zѓ&L4?~pVVvN]w|LI6SVm4ma=wf?(9)#;uMfMTacӤq]ZfΘ>j^={n)5(!Hh][hڢe\\9-ͻҭYzDt!uֱlxޞйc'vj$*3"z镑ajjʮ1W77obmwbaxxDppH:u:w ݯmbN7>>^,;::YhXX,fW=,w99e+WFEEծ]I;v*..NJJ:~S^7Zn}FFFffۘ"ˀ"gVvP(|L?"hђ%iiiD p豠M[p%}J J+H3>>99bx@~JOO/((ع{SᆃCFIӃtswOMM#}UUUɦj>;P5W8qqqEE|gމ̍삂]OD3g4iܘhh'HJŗtZXTȬˡ&k/2z(ܕl_[[;++++++jےl֬ɓ bəg BIׁeiXxtw$tW7޻oko`*0GP5(쎅mM? 뿔OoC9v MV dj*xWDDz*#vnj|6ϹxT "Q)DfZ_ڎm[ccc󯂂9hv6 2>LK$$***OMIUUUUQVɑjY~˗b=%E8R'''yDD**L._[|;JggIjFAOTEQ/5~c\R#ii۵"Ӽjtt]n.((PTT8?Xpz8N93ii:){Xޣ͞5sێJJJcnjaaaAAK^a&PT$8$DS/UMR*MQQQUEӧbظ}vsQyoޚ6eSӦJe.ӷ~9>4QTn;{k ̿x7(ϑ;cbݻy^FF4 «׮asEj}N:>xPrFX5m9e8?>L]nnW`vBv a v.*}-·rwbzz?NL<;Ͱwӽ/q8Ԧm[M?)]E#/P_ovA%ҥՇ]@DD<ܗ,]SJSTT xaKTv&M.J^Ǝ:P:"ԙ3[-9~3{nҤ1DK IDATkVG[jժ5u$&)m--HXVr|>lېRD4s[\} k@Tg99lzU+۷pێDDv/{AaAa3m5۱s;P  c`G#;wcTH@x\kn '̋bv6eDB><.̍j+C@DDbC5Pi Mc܄0/7Ys".r:nYc\k EfMKLDu4m~RDuRt;y'ON`7g͒asQG';;il]'v3q8NN323e5UT'oڇGki~q85=3s" GyC7>jْRJۉS_r>֭m픨ȌwL΂??uk6o\x|!0jz9y,=  ;pDXXtyns,XugRdĕ9ӳ-:[MGǤISye]s Qm;1^zuEvK3&7?COχ(@M4D9\`O < jQĕSWNeؘ}`K3v}tۮJڸ@Cw}Uv֯ =j*oovܺv'iӐF*f@|| $ውmͦl[+\e+T;TuhWԫe"Ҡy%~ilUд$k"v9C*M6RIeCo6&G e  _ٻlFMB/%}~دf/P9AR{;z\1q}܊|R`GYS|v G֯Oc9׻ MD4d4YYi /{\~ S+sخ^>39hIx>x=P }5Q!f}fc/CD-'N^!8lShĺϲ7E ]hk7&`p[WS wLz۬ {>;ӆFsŔ>'״ "l=vKmvn ?$Tg!A&ƒ`\nЬYS&yЁϞzϝ3-ZG9qm]UC{>'U=vDJQ:U+A1h@g/0˖N8ZUdmϞ<xѾc hqU^ռɱ)4tủy²cF[|dՍ-czCwvm;؏۳U#v${s{GxRwk-? O%EE ]W\FwU+LL8wLKK}ys7FoabZTge΁. y69E%ڿF/O:m3v/_:uk@FFz7nbs̜;r̸k=]]I   s͟y{OI~sl}!B8g7Ǐ߸&܍Mb :a9;_R4>sc`XmZ Wkq4'J鮯Nw3O&!ୖ=Ù@G[m'A]]]w}5̜1i;::jjkϝb ύWy /on =y>> Y |PM*AJ"D~5YxhfZʽ;>rr0jȜtzFsnZ퉍z2IC /'48#5948HMUް?x>##SYY 8p9_5j~os sq#KAPADq|&.WmGc b#W(sjm,NeX޻ jX/-+}&z|D˗:'zmQh,,N+OMMiA..N$'%Ĺ^=֚Y|85LW'߁&Ξ3fFZh*cQcLJڞ:ٻQ <G&S4'Ofe%c%=Ǎ1?|.CA@hA92GαDzreRz- ~MD計|J%KRӽnP::>F_uXAB0i6mk_~3MuLL!!}V]]] d޻jOTt̏^bN`Z& mmsnYȗ/]]=QYY_id /\.nrBb]_ӧJROD~ں:ڍFU K/Y6fȗcff+++i7::8S#GFё$'wwFEy[TԻQRRSG"҂ 2x<8 $'//ouuuwW7D%tfUSUݲy-y/\dR#K/mn2^p涶'A%%ձA%PANQ'f[81y"%%(ƭ7?iqDzrWz,ß0wr$-S|Lx{$h,^ݲ>; ϙ{MrbcWzzggy=e#k%M0(f>BJa6t}kؖ 8AnxMϤ$abbZd?WVcbbZheWܾ|qɓ{wGߠ;Rtu8xK>~ :Z2x)䚚Rט?{ǗޛGhll|ն; !0]o!A-[(JSSӁC.^himihh_YI xxx.]|r׏1}ڜyYYYyZeUUjj6RNEE;vef{AA! esP)kdP\2Wyk_ΙyErp`T{'Od޾#Gf`=Լ/cs g/Zn:GB471ǿ|݉3c#?`WT4?6܎%ѵ |2 ])C@6Gq`C  @h䇭c7%k" UZ@l8{"vzz풟 {~*HPIrIKD] g* qkvݚ6^NծB>R+kp(b^qx6iPiXAAAd43?vaC/t  /\BByH_:Wv6p~-Di?<ωhb5h  o2@ۯ=%YSL6 T+y|CN% =iUӖohk*-xh;\wx<wwwMtzuHF$2;T 2WO_GH]qljgؖ D l*- wZZcf7VfaBSM2\8}e}af䈏t佫uR)jME~߲; l=gx{G뇊¼hj7Wa[=}tRQ T'Zӕ- by&"c B{sDfWef  KP* `>ߥEӂmgo[=Fw鱋 zD!&`'6%~< v J@v}vUm6``GK{5b)7 r9>3\iƚ%]FuE?5?UW\7j*3wG㆏Z2!9+W~z=voz#  /Bh䗚"ml Y<0k=uE$I9IqVTr7_9cJ^!Əu1Ax&fa<sHr(4EsExo/w̄4ئ|uJ_ :rlsz# *!?vJhm=U/u67miM O 8`ó00^mZB ̝iGXJ-/k{+N߰pJ|@EkEkߗu<FMh80Y%* cWȯ[vd f隿YI7֑X|o V)WV%kP)Ԏqj)IؤƨOe'..?."6AAAN+ Ȑ"YD$r"{h1r )$|/&#ՙzғH#/_8Ιjs4ntw>zNboAgkbw[rKc>}W^,l ֌Um˫Z◝rϼ뺚 *}>?2@B%EMokv*MDD:73)ȋHp~ja~rppQFgwutypC~MZ* ՑjmN.~Nm*$,pM3RAɓҒ==j$-hobx<XYYw|ﮚxz'ӠߠzW䋈w/#GEG:̧NON޿Ϛڛ uriť(ow>u=={m]wdjIHg!OPJI -~BvaZUY4ܐWҬ(#U}}U~n‰JGc3%<](?W}8;8}Xkk洙 ͙ng!V^>a@#-Xb6dow hϛ;ԗ~D"G[[ il{~|mͲ2ҺPW_l)-.++=)כm4i#Ο͝4eY[+[=_^&>wl=Ξ;?it iUUմ u^]Vpڑ:hp UB: 5aw߲;L[(;Ez{>]Xi2<)+VMX\ i9}<4zqjzO-HIƭsmНG}j͚QT\4~sKiSOQ[[gwa؞9W^QAP?~%,,D "BW._HCONNv+n33>=ё/Ӓb|85;;߿lllN|k4}^y-1.iP#0`l۳盛i#?~}߶ϛ;jCCCMmǵFDG2k }Q~AA[[֬<#F wrqmooO ~bx!#ơfl[0112>GhP&&gmGEGx{IH|VwݺypS 3N<"t'c7VuIvvv<А\Xu}:r_QQ>YY^n744/J w~bbbO55'Z[[=M&3ޕ)(C?}[5H Μ=q:%EE˗ڞ/,.={㚟=wbS`p>b^zuu㺐׽K9z0L5o bb#BW._"",)>U7!?ׯ3uLvx._|M+";ĸ'Cݿ}T\d>nbiQh!%%C;s_[[[;;;|aCAd{GhG¢$){rW׵#*2b >" -vzWzfw}yd-01]:f *[[qp=7nomnzWI|QȬqj- #*%=r՗x&67Կ Ǧ"w)W.b8JPu,Y <λig`8>a1" i.ߓrCJ|:q_)/Nx"s,hf6a)EUMg+`"2:Ro$;\qCzZD߳ˠEvfWS^`gTj cg,b)dJu7O}Χ6xyX6|Ķm<<2rI$a GLnX&&fZ*EWSr=,7\]YI{{ |/*((vZ인g)Z}eeBOL*-+/jD"⹳6ǎ3wXnSWbqUUSP(.]:oड1$(vl&/+;{A[{lll=}zq8Io6Xpqq:1A}ZjjrmMKvSYiif  ,?U4lhX^~tWW歏wllI۫kj%%%xxx*++ht}ظlݼiqsvvu]uuٺeӅvOtF󃇎`[w.;81^2$$l>뭖;vaaa!!Aaa'YI/#_DͩO{S7=KK˂hNKڣ)<(T //eK߸qI`ϮG6SիVmjjڳkK xQQQ))Bq($$Vqؾ-,< -36GOddfQԯt;oOl0,]jڳfQuUdHX1#;v9}5ϬlM&]ݮzZh᭛_EyǏAh>ܗ/4TR6&oWq߾~.D xr}I:e4=EίBß!IwKr0psGߓHō;_65#ԾYKCgQ7wEE}X޼5&_HHh歖o8:̞KUz톛sYY·VAJbe%}>J'@ss3///Djniw5k,\0؉۾m녋v*5-(Cػ2w[}l={~$j $(@$de.^zbWTg{a#=]!r2W=fff=/??ro/Zbl⛷Mr-osחVdzta۶wrrt[[{SSjNn>k+ϛ^W\x齻#"; ߙa̘ўYiF W**_{,*.~6>j9sJ㾿jLTvk?02Omm&X[Wykj0KJtSR22 ((͛6b3՝?F<{]MeeK/9c2`+? /_UVUiN$ϣ"7wGFPLm>;=+ #y;w^t! iߝ,AdPyZ&lD.W6U h 3n@֯@mfx }Ÿ~H$YᾺp J/SUy[}%w iDV!sH;'vxA-0 T>E;-vHwy__bJE*9|Rd V0Dv{ʆ*9#AC'ў998*?T}ZSS(PZJ#( p㺇\'iOXb5&.{L󶗧cPS%EEK繹 ܤ+( DbÇ^@$Fچa9rĈh\铠H&Btt`T׳L#lkGC?kG=u 6THPpӦ# ۬xo⵵fmjm@$2wvv;:O]]>w|W?~UԨONNNC7wۓYH${~׭qhz%_o0mmmMMM ׹c'N]x.=#3%5 ǧ䤤7#G)--} VVҌ}oXeB3>XΙmfaᆆO+/8LMu5k1GgZ;ϭZP@^udr',_eljb?7 c V8zeK/?|9,.t= Ze]]]aD5|l|IK X889ϣbçOf-oxݢ%.[NRw))eK̚5#,<1T}Fdp p }*Jxv԰Ohl6:xnXbC] lt i]m.딱o3Bv+$A2ÿ%lh>>q16:H:?;F"EӾL r1qoڲܾmkBb"a׮{@o+5]#-%Y8ё/׬[c(ʆz\7Z~mmm &g%_om]'+++mb2AIZYY::?OJM B)-+SMzPTT86+. pssL V}}_zoiΜ>Çkvtt,_d񍗩>aа4| 'L_4ahni| jF~ B&L1XXXv>q)$$&.[WϘ>Ln2 0ڟ_;AMu OC= Zt9H9נ233];r8}ksz^0PDDR ogxϯ{EZZV«V, |xA@Jw899'L`^rroLs='NB&ڳjjkw<_Jxc*:uT먑#Fx_)--Zڄ@3"]6oxzϮ>6m޵RHH薷ςEKh?LA\2  z_dh!??(/Zt'RR^ cccccc#pI{wzp|yyVV-quun`aa5r9{u5<|r(*(@VvvGG++Ilerqq;s6Ə;wlLW":@"VZy0QQŋi @II\fΜ[YUĤ _P+®$IB\KII233lxǏ h3\+(9C4&KKI /M ,,,LD&E> ܬ$WgΑH$666 *}n}n>wfiю,5k?y}$K3Lj]qӹ8ED֯]bKT?nDRYYҢ8.<>q,(Ӷ{viI7 /珪 4AAA~v:pTIiٖ`0OЁ}]6Ц5_NBB S'h=]v8qBFfcC6#0Mcc#B "hggm=5+;{ì%%=u8'J};>?<$kqI M;v>~H\tduMӑC{̬>u\XH(`歴2u!Aܼ;vcF5^!!.LPx|sj4W_sggcKIMw
    y">&ᢝ]Jj˯ ڬ >7>{x\/(8C/[V__ ;ϗisPl\ܳ/`߁CN)ȡWkB)7?%~,R^ZAh"=&~w?vk5~(]Kқ (-V ha}- ˿c|v\\<p0QCCuh7Oڷ訨( ?"B ,..#B:\$\vpKVbAI;Jgjb9ёUnx\$͚:n'AAA }E'Riy&iL ƍw&/V\tcHFuQ'O<:8X~c!PAAA;닍ظ>WH?{!_s*?*==c Bh?c* @6O?ywR䯑PI†ǸC PSAC@MfX ;ÆA!2 &ڞrv"9'u{@Wa0Z|ydϗ''Q?^Fh'   {]Y(%$KD ?NAxo{Njn!01E^>]0`<:ăY{Np[kW@0gcqdAA P:0"3swwwwWm@aB-xEE:SmkٸV{;7wWGgC l!233/] Ʈ]EPD}YA^zt|i[ <Օ۲7+JcpUŮǧa3~˜.{] Jjڼ&;ڪ &ŦuUFwN<㻻7Ƕq1<*6b`m# &N!Ӟ؅$M4uw^CiKun3{[fBAAʼn TFTJc^[d`O=5j2M2rbv_ߴ<%? ڶ*7W̑&?zR~l EUWnHH{ *c;E';egɨ] Jr݇/*z#3YAi9yt31+6˫Os5P g }V@w랜W.G~{ zoȉ]!'vN.@AAo n^ xHkoz}!q>hI1N3^+"XW =IJ'/oIW8,ؼ- v #׭^|`?IJ;+L31ɓ,y,n Ĵͱ%"+}73->af5yBR- uC^zrx|IfV)Ԭ^!Cf|Of6 g^rv+GNwWE1yU<_RtǪDCp}62v&Zsϻc/LWoIC]s),#~j'(O\GP.TgSVs!wwy4,`ζVn>c'/fkYf-6Q[wu}{AIivĸГ;nZ4u.~b-KORx͗CRee?58-x"ˌGFa&eg?X+HRI%5u; ' 3`)ˍy>?i,ΞW]Z"9|ByxdGnZv{-(5u}߿!%B%w\ 1JECSsrx8IOFl9VۇͷrrFz\B$+>8jX zKf1H |egY"   B.2tl"ҹO葂QbJJ )pr922wn+u6ڞ95zNܽfQj'<%%^xy$&W}GiUcr#hg0r'u/PP?L(U?=z-T0aÝ;B wdx6:-\b_& WȐ(\S[ð|\l&ǽx:\츅 ˊNnQjk <' i76#WGEettgcCa{rߘ`"rpZ?};0U7L}p17UFFp8۫ův4T7:?~ + ?L[@Rzr Uig9gl_4ms'OOUvAgD=WL)J_mF {57KyYλYU WZቝ9W3InDsۺLU԰πACQ9ѡW?ˤ)} ILX /ȉ>=UTez'S0oUֵ ]/#$UFD߽uvwz;qxa$KMAAA F~5* Jt%= I|bb0JG%Z@ѱ$&Nl"3gt0gp X'Fnm= c5ƸeFũi׽u\L8OLZx@qUq7n0yy1 h͙I$]}"CB&^rQS{)46^ޯAt`SJFs FUWw B!xT_wdmziw\@i'ѱσ|LiwTgKƦ1%_PPZ&ߛFT*-=i]..ez>9Ŵ\8<~L5+@fk!N Epld3uW5'f$ݰj'ww~c\]Nc}BloK Ɍʷb$=zµ 6v$+#'JӒ'.\JKSƌ_lGK O   4[۪JJϣ_O~fE^^>PF}ee~B%1kSpx¤ˊRӔ&i77>|HJWO=BJ|G$l-2fTuvs?vut\5 E2 "vG60 1N1!ɌZf~.|&'G3 L]n>3i?55-hwO}x':|LMF\SWNͲ>~ uwk*&'>^DF|K3FjLޑѕ( = C1e<82hnl,xpwJz?}ЪϽ| ;t4ӿ'AAAd/|Eb2|8=݈I)9\e Hd>{\ ڢʢ"E N.2YHJedV$#>r-arRؼ/R|eǍf0NkYRcPO UHږܽV8"Qv{JrN 5JM6^.Al' oIKV̜gbfan)(X4jY܂܂OɌU{_Nj6çiN@0DJ0'E ̬V,lo?ka)9J*j PWy7jDJZzơ.\V.WrڞprܗQ#?hNoU ǧe?y~|ի,/+)(x!)_7j$oAw/ʩe }VMDD B{YnGD.5ߴnWB"31ۑDf=,!%|ES7n}ufي+lF-.pA"*+*UT\~ABR*/;iaDtf9OKIKg%xW[󺠮G\v?&a6rYAJbLXux<u}*}JBJ]Yi>aEyo*+KZOzoiIы!wQcg 7Q^Dc9lR- {]%MF:n'#cr!mſQajՋ0g]RPuI" ɯ# gƾL{.gÞvNZRlʰv˯L|TQZܾPv|ڳ{-]#)+)!YHͻʎXngimtK"޼zc$꽋iz]̜"<((zS˧ +x*4S|v gWzB"ϙ+ .l׉Oe $^B8ߞ__+"pGϞ:9.^E۝3Y`L%'3a>:7k,.>v]XX85jM{9w~}Ft񢆍EGG;zZؑ-[06*o߶UOOw5 81|hWs;w~񢵍Ǎ'W/[ZΟ;'`EYYYD`&=#ҏ>]8Q#mش񓿷>fff'S'O~Y\ҎuyyY^Z᱿]~\pVb#Yh4+JKO(=7N~ G' a_0wk"vre=vJ춧fv EJJJc 4p9tvwFya~[u޳sgJ]vܸa§Mrq#B8'MTWo,i}ab%5(+_f/jݱmkBb(C+W 1bSplٿ_캏jjLCZZjo)'N8ՠ70oq{mv7Uީ;~NB|sXu9wwhWv$;[vD^[{iasDz#?SZZuŸ7Oc635qӓ_8{L?36ش,lklW635s.3E'~;͛|9zQuӶpYf$֕׬^Pu^nԿymxB5UȨ5occuu;^|jDdfͶN ;uktu0Ttt̆MU_~Z5UTQ0APJKK_ ^G>nՊ_ZZHbRbf\.B&lق$$$&))g5yyy06..aX/_5u$Q>|h3 W7'e)c~^u708xH̍p &vz{M5_ r9Dr|AoCCn]z{y.]XTyz]%Gw䔔tvddd ((,PjРЙ3KHTUUmW4Ҕ 2o>eeDr/~_V,kn1I};{% &MWXF|N>}NEENZZZedfWP;v\||=Ngeg-.RRR_PФz#V_X];ɓAEEOVbQQQYv|k,r?|*+2-MM\޻ADr辯nii?zvgކ={ᴓW>|PRRRY rwܹe4v5T3***5ۉéz"n||1:>`VJJ?;.(jq۫[VV> <~[pظzތ'#ߘ   mӦMOO"JNI9{, aO:}i"RTT xpoŪUAf͜@DRO>aқ7oإ'))YTT۱{wVZ֯#JJm7׷?uK*7h 33SBBB|!!7o/]rpyλ7; 9zFcld,]ƻr35mn/^³=~&̀h| qc(7jϏ> c~m!WWLѴ=n0s7oаӺxƦC-[.yE|_KUQQ4L^N64;ƍHLW~ IDATC-"""l.zD'OTQQx+VDG%pܮ]СLe&M45[QNNNRRod3gϽ::Ym֯cI-[?{KNNVNNVRR]?f@_A_/IϕO'IciUs?ӿY /d֯#>!a֜EED4beaa'OIHHdܾ@Ann%wwÇ3,<\ۺ#<%Bɓvlr\S"? ??(I<ORۮ2^C" ϨS)b/nfQY_un'iUwm;[w`߂2So֓_??+;3>uߚ 78tf^_Y ;G!@ytDRkWJdih^^2Rt"a4|;AIiM/YEf~Qj~tPT!8wvcQ{piU QEV+;8C$3G{a4#IIف!ŹyiKޕK)(Q]--6(ϗcYSYaabGNQƲ+e|hjiyk붴G Z <+>!$aՆj~iXZyY)4n<ƚ 0 ߎ+#m.<ow9ܙ}]t1SX? {i"먖-Z̞5cԘqL&%c]ֱf-deev~}IL}리l/ٽgoLL +\z5K;oe8Υ :v*yl%MܱI.7n&Vc@RRT<Ҧuk@P*)|~gطŽe5dӦ h←7n,ٿ%~F#ƚ:&OطO3"۶ED-SRS322Dukg>tțXM4AAAY/qu;R\\. ē-w1za^D4rWe|[Jrxح[aaf`RXXAjh붷 &nݮtٽХ,;cqco<k&N;QuU+iS&rucvp ###ED>|HMMWLMO:U^^a}z-2x͛^p>9BAA}Q|_|Gu!gN٦u< y0L.nټQAAh@{a(OBB/j&MEEERһ͛wh^[[뢂Q#Glڰn OmڰNIQq]=ptF 螏a՝iiiżyCDm۶3{{EM޹i`{DTTT4iWD5DtƩgsJKKmJjhVFVZZuYi)&%hʄM66ܨeD6)XRRrmkog/\0C 8rv޵c@7=~ڜ_PЬYBϷn{oٶ#!!tоyfζ]m7:4q'Mէ?]x= w9޸~-3ļ{S^~ cA 7xpz`1ƍJnp\"r`Uϟ9uI͖-cۛ 鏭''Fz۸y9bUUr|`άw}|\|ĘQWoti3geED~U-R+}n_S] ɢ,NZ$gT P2$mO!#-]XT(-(,TRR*//}b<OUEfҊ GYYYY\\|AM(--}婩i~ꔍGAEɗ/qoqqe#[9{C~;FAAAVVvE Kmx ";>M4֭] wmfj"++qs0"151vrEDFv'''׼YeeeۑǖX35p#saIIp8_XO#utvx<^n]sss4-,,LJz7s\5t))u6%%+)z }Nv|k? 5Gq(7pD;_Onn^cꕔ҉hv}oeee]ѲE QɞYY 6x|>_Z {`Y.W8s}^ڶiknG׿~𑊊L-?UD~2 [EEIJHVqr4PrڥgedLc޼}|;w}zؑ.ӧO5{ީǟ?혚wD7=sfϜaKy<~h@srss4i"(>!}dmuc9-=YTOS>/_>h䇗27P7Phi.6PƣUs8I㖔 YAD32 7)eԲG{wjhPRXZP_FDrb dLz6'$jTŞ(}&@JX-ՔOqյHmZSӢ\;GRY/,F/+1XZZD.iyxq v  l_dHxU߯__Ѯv+[(%5uނELdOjTTT%rrr~3M:e|\)g} &"n݊KJ|>U1=~̓= {ܴqE/}h"zZ5zXEq4+?O"! T-HU5n]ƭzTÔ(|'#S78eeeRg6ћo5[|()٠Rzzcd4`ݢ%KeeeH.@@MS|{֬&-$uӼ}{2ĪzjMF;xnvqSNbB䉺쯤\3)yyv.^~Ͷ-,\\\\LDؖW|9}$>22*22K^=??v\޽ݎ﹎}| |f9-k`F|B͛6W/ vKDM\PQQmӝ>GdgmHדܣ砮-Z.Ғ{D]}gt#̏}׬ZlƮ#q9x^=қ7=k0rɓ&fǏn,}۷Qfk^B]EsG;:h@Nfi4q6/sm[ӿOM[| -)v yܒ׮{䔔Vc yl\aɏ((x%],!.)~CV(=vJ{>v߉ c='۶e߿Ybm#*/Nj;vdd)DW^rzY׮_v]]y{vly5%(qb. _Աsdd^]c>:9)*&Et+$;6m#L}pQ,]tTiѼ7>FV)i DTRPp̨C6i0`lefeeO=9OFnjmۧvT@3&]BWOw޿NDϞ X_tOY٥KeEtizly%ɉs4pԑRy3a/[Ǯ;v gφ\} Io֜y~,.;r_ء~V{<3o>=Ң?t#)%@yA~~ :},STUe(NZ]zϾ=[;޻[V>^:ΪdKۖ[ڶܭˌ>Q0NNƌ21`"%3!t{M!SÇD= ?} Doʃ#n^hd|t@yIk-m[|S׃  >>mJ/?4K10|ϾDhxZQ^^辝D*SK{)S/[ʮINYsmQVT$Yr޻DԹE辬$+_Yqܭ%YI^<-ϓ:)KŇlAeŃCKK g7l`vOh *- >ORR(eq$,[O^g}'t?ش$9]GDDuv]N~3.W/0({'P(QKpc4w~vy2r}7>}uSQEӼ%I)iu>'^d(ۂ/_xqW/FH֫'FD%< j``cKDڶ wees+DI^rzmV+pR?̀%-!G^=ۨ8>n;;d [  *+"">B9E9HHIge{t }LDiw]]&$rRS"'뗣My ¤WEF:8UVmzV6 ׭O~ȡL{GڳEdq~~zN`̻͊h-vDDDop.O'f^nN׎|:oը{)--aG74|#~wr ӕ3 6fKߵN3G ==vJe )%z^Uc?1{*wh:h6d.S{@?KmsJ0af^%iQ=GWd$HҸrVȒN2!;%"|AL.says8n*ND2+QM9U+3k(8KHk "/KڻOJn~8΢ D7}NQ {4$z.{C{w&ƽ_>6nx8h0[Zz{y^p^EEI̚9f{8LVl[HTL\"Sq9cS"*$1zG(Q}:@DDk:cW񉤈(YPvϐ5|rvqcbJɧb^c*k41bĶy?{Au(>y_KIIiߞyyy@6hAkn{=jaC}UVoݚ׭{ ϝ)).vq;,Ϥ2";wJ>8ujMLWmVf9bpSlᤩٲ-ubgxsz׎R~(^}vJDDM:@IjOTҳ8"j)Ң\ mɬ,|"K& E"""R'b@N];^5T>6]ٜJ$l"ҐŅ(r)j•_\ߥŋqoEI\l܍Dtٳf pрƦeeeYeew\cڥ-[HOXqG<]#GO>#N(+3"ʍedd;/ZmlnNjt>gL}}Ysr6F .++.(8[rWWofٳ˗̟KDklTYY) ;uktu0""izCΜ;AP8jt>}rrGXZrQ?u{@ы:xL+j_ qW)V 4qBDԌ*3j6% VS~m""y+׾pfqI"2SJum*,s1xVmq޷HzOIiiYV 5r (y숝㍛&Fn..e ꤮+Ȼ: --q?O""K 9fع_~2mꔱ_`rcW|b!-sr>0 &geg[/Ye&Cj @rކ22ݺv]l-o{2e{; /..!=z=waf͚]f֯ :CIIIe%/\п? ={?#}ժp>><>>aqt?[c+%UQtf\BB~q݁}{tuBCsgǏtuظ8Cr父3TUU?E9@Kph45~jm|Ppr'+*Y W'Qm/wPrq/ڸowm#O3+)crNw=F!]Xg  mӦMOO"JNI9{, !̰Vclj:IIɢ"G$%/M]1 /ߠAL zY|H:͛K\0=D$ɯ2rׯ3ȈYwrjj̶(o֬YFFh`4RY;| IJA,7~ϭv6=;3LDEB.=2eA+3~˺rNΦ#SGw^X0!:8ѥsff}>-Z47:DBBbܘ1ʍ=#"fpSBBbwՕiZ{+ ^{YYY"ڼqCoCÚA\noCñc9B|],F6Yf+x5>BD~B<());kw9OH5g.-ׯu,+/ 8yJBB"e?aG;u|~ѳ+--իgXx8:"N׸wFRzU=Ļ;W!duR {΀ @zS۵ykNZhq¹mou۰WOv9ܙ'Y3*yHLT⡩/|o-Y'!+3 o޼{i{u/pG˰gNrŋ=qE^NN_թ?uhNJW} u`ʤ 1Qoc۱~MjΟe_$''#P 7']ko7uDvm۴vgّ/_h4m* {zaÆ8? yܪ 慅w{˶;;o|)S=jϟd77Ve_Yh -m@vW'nN?#:^d7ߡxͥMAq>pE菍닋{31jAӧU ;jii>NDOܨk?BPUUq~a#۷י1}*0.}VTTs}&Nԯsg%%%> y~7)+-+mmB4L'xݺ]QQq{aQQ~}%$$KYYYv{{ZYIJJߦuk|()x{m~eF[W|>?77P5f>!N8JK:vcQ͌SKD\.wwCzݸޣ{w@KK+Oy\sڥϑr^EmӆlW.鼻R엦{>;tptDsuD$:7w6iX-$a=HRRINjz;u8mh+..nC蓐Ǐ~Za})ef222;u~=BBkvQ~SLi֬}OikkgggWTTQDdnED~=s>NIJp6:#Gjhh$&&vixqǏcĵIy\ˡ&#Gjh.">rÇO9ԯ۸駢kSOEXUgVFVZZuYi)&%h_n&cArsC#"#R~ṅ>G>.~59|ڌY= ݰޱA\.\@ ճL.=/\0OTc{ zNO Ϟi;du7n޴ANNnϜPw$XsG[qݚ?4s\vGm[>s+nؠAc&N;f̮N}߶Gn޴;TM%gth$9%uˬHJJ@ x]_ݺu[j,55ujە+ҭE >.=|w}[,-,dm D[nꅈRSSGSVV"-Yhf5q8.[^uNZunڴŰIf&*N qdMVG=c/\KDA˖.YbŷSR|$'N\=gԴQFλv1<yᄡ'Oۭ2yR|BQ /ݲe[JZx,"_GϞ3S'="5jٳ瘗¥ˆz6vlp/_?SRRbk@D^o;~SLNr>.ZqpPJ`ff֣{wii鲲vh'~eg_!{O8ASej VF^r(Ϝ=ny{ϛ;())-((TWo-kە+89q^<ut >s.qMurJ wݻ׮huFطcB,?B΀OMDǼz1WP5:TFFܙ1Qj?ᅇ,//_xImN;UUTڶi4;pȠa#%% ;v]3rnDv=g6:XeeeIII"bֆyKDM""#^yu=zw2cTK ;v 02^d(na$b@  "UrrrwoA]ݶ;n?<FȒbHIIF%"{h_}/KMHV*"kY#)-.3OD~_u|c>>g>󙙇vodZаt%5}vB0Z_<5L&_A /^eP]3002dU,ohB & 11>ÞL" \zy>W 1NT;c)&So>2ϷdWWk8v:tظfh+W P^ qzB-ݻw :q%22lk7nݼ58\C?ޮF2͝9gF͛6k׎|~3מ}\hh8ǩl6ѣd7ov]T\bg4߽[T\L'6,@_v:MxݴhGgOcǩZ>EExQII\\-eeWZ[}o&zh/^444ۉ m6Xv̓;=JNݣ{  _ͧgOբeeP|M}}Ӊ]K ^nm5h@^j=oJ; )Ar2H냷v2ju>†z۷ߵ٤CEHHtkj=ngX֖K p/ﯧkKa;)%I||Q¢/[T^z:oQ{H9uދU#q߭#e?_BqXKKJ:HnanA[b[-sV !f=r!|ѣ߸AZ?"&9|NӦLްgx##)!!/ˑXjsEe!7_;j!k׮_6twWoިliAQU푙Egb8=i3gXĤvBB5!}ݕFhid:wL**.njj]˛$v--o&Ĥn>؉6&43\gbBؾu7& Жڰаn3gDuܾkjk뫪|ǐE!%)#lB Dyy]` [*ݼީS'OO_?ݵ/_|odMGJKMܶyq[w.x9:߹}jێ-zp⤫xK !Q !vrZnm; ޽;u/]޶u/M67#9Ev!*"<<,tܸq~~3xk'C92Iʣ[((jDݒ8RJR¢UM谣C\\׹38 r趭[^WB"L:rȹsLsɋ*#z s +>oBkj:tpO7lr:rZRQQQ[[Wų>o߾Mp^\\LUUu/K/(\vx?zq!䢷ϙuv9*y~7]O yM[?a{u wNԩ}5 WTGE8::[ s܌%z]{B&[Y.]Z[[[^Qqj^jWv22ҟ>}zd=a!w슍'(+wK/߽HYcfR ٵSAAhێ]a !f}{ 2 |^ss?SUd~`0ΜvȰs8{/$%%>/i@Y0o޳/x#4 罼C;x`ws(@!*ׯ];'ӷo`0nm@%%%3g C~B~/a!۶Oo7_7-nح9 Coj5 3^a4 M mk@:ORR?C0 &P64 M mhcFTRT}d {G&(@l c3_))*ѣFz,(~<-XxQBzog6t+>/=J߳{ɤ $)!-]9g {W'Ӯ];Ci'ܾM@O-7ƵJJ}ol߾=;WQb<ߓ˟CB\c舒1秩)iz]|/> z)t>EL .^Fku"N-HIIy?KM;r=zF.v;Icƌ^ne5o4K͟p8\!8e 3h:RKsтo^bfyymVejwɬ_ٳx{#,!ofۤG\Z#gV$zǝ[~ C<~`/!!3.)>VPƎMNJ')eeO97}W^PPukP :Ia٦&%\VYYI MNJ=ӧw{_LR|nU^^^__L>*)p9vɓ4ӧNڣǫWouSֳ'}A{ĻƷ-x3 B٤I#}.P\TQQy}UU*).9>bX]L4&葑AeUUU++weq 999 ? S8dX|b⩓':TS9J{(mm6>c0CINN!_ZSS; ,**Zš_~$ۢo2[JJKy-Hz/_tN+͝={#xF8@]9Z{hmII CQ c-js3S?[MMM~GhXX}}}D=R}թ`Wf]qy}54ƌ=n_"DAA~љsg :4ũto 6~}WUUQW2TUz}9" r;wlrk7]UQNtg]89EEEƎ=~ƆF~>jll\vի\Or%Q2}^7픗+ӇyY-[EA*))y]DXQLLNku p*)i8PQQb޾}K'KKwb2t/E 'L09{.vkW&++z劾 CJCAA!okk-YKG(-LEEtp8|Q7纩"duԩӍ7o5~I%EallQQэkW&z_iݸa]QqqtAdOjbfA2˭1BLji:dK Bje;AotA!F|'-[2W.'p콻wB:TU}O勈HJJP}edffdf>oҊjMa4jC5ڵ=b$cc_QY,TlYV!***%Ձ*Bd?:~b9赛[!!AHHhY=y;JJJj̙ݿdp8\ͣK-+;w'? j=B"ӝd:oM&GgFOUUiiwʯ^"k oEŋg~~ Y.[fh8jŪky3[4j#K-S\999z!f5|Ͷ[M-X,Vpp!즦&6w=I{:d&oKTGÇ:$ 0hm{B hɜ>utdTd.87nNlSTTtúR3;rė~sgddL+Wdgn ٸ~x},?}jk/&֞rx{X2O=khh55]+B=y=idnXnݱcGee;=Krrr%lٴO>Bݸaan6lذw}KF>!.[7#N=s7 m֮߰unݔA$$$Νiׯߔ2)EFOWz79oק`aaa|Bիkj2:SaRdee'B222w޳*zuhhZOiS0L&SPwT>tv:u-۶ zǻ/W&>KO.,,iKNNn ݄}Zv{w3{Ǐ}}oM0mmM׊"&~y+״<8UI)&2f pce|Iuuuaض^hXEE=D̃z'BM06^=rdC>y=wȑӦ55̟~\"B+/x]h͎moёy EEEn`$QYYcrJ !ddӧ2m6npus^-NG\vn& (w~BHIiywn۶{N6WKkkk[|߻al0BȆM6ݒSR^wP7r”Դ浨4BNoՋO 0d=&P-,7E?.G~={7BP}ˋ>d0::w<%8巨>BpU(?`&P64 M`B'""0 &P64 M mhqv]?7i` ?Zib.tp;$ѯO:?e宯?n̟s Cݖs=q,<,$&*Sǎ%C ~j*x锤O7EEE^?]vMp uG3 m2N lݲЁcx{\J/;QBDؽf_wʟL&߹u ٲy64O%ա7=9Η'O >eǏ tt'̬,;{Ghrr6t755mX'0G]9fiz&B/y_9f(m{w1V.Wx$afLF驪jqú Fkll{p^y/'?b-Yֳ{\|a/_Q#/_fz[_:BȺ-Xrܹ !ݔGy7_~u6sr !:c_ nll~fuMфngOGG=rr"H? قa!fL zPY8)w:".&f322y }!,//0!uuQ1J_&SLMFG&ݽSDD8iDM0e3ӦL&544yCuIuk"&==|0BHjrF>TF>b|I g=7V22YYٹo>}JK{MQTTG[}}}gAS& ^|iT{w?LU'&&&(//y/55BF'g&:'<,DO/=SW}ؘQ fN;oMfm`;hK7nwIfffPQ ,)-<(YLkW&޾/!!>pؘ(.䉽o߱설Goڶw ϻ|۷^@2xDc̫)+g|xYYF>jԈҏr ̱cl&-7] ر&fɟ Bhi8p58yJ;hkϞ9 p񒈈HW%%*a&TT{;60(h f@z""5aUu!:>!fWVV=NMURT$od2rXcSR7dmw>ik֭ ?lkWr/~mm'z_o/^ 591(·KޗD&z@O3w>WKZSS#**"**r{]T{-;޽ $%XVTVg|-<<*?xc$̬, omm[l !5tNuu5۷;ܿwԓW]]]}UUܐ!_|ik;Z擧G/5*풷OBbbmm-}3~A_>z'++x/C+/%ũl\\sѣF!pܢ".[^^~ޡ{n]ZÆ u>z/X[[?~z:URRܹ ϜvͪS&SMgΞ?h(ܷ7k׎,Ё}#FGضEDD’ǛFd%p8 tx%zzG;s\ >7m{:!|O~H.**bL0:er*ڋ uuhw$;H=|ؼ_u=8qǏSlG"o޼wtƵ+C?~^XXbC~oިIj׮ݹ3cL1kYq <= 2jkk)+G}ܵ~;qҕfA;c# \[WDyq󬙩ɗA %%%%J%%%ko9f1c5G3NR-9N۷uj={~O0 Ni UO,++{DSAZ.[Billl*s(׹sqI Oҽpvpإ%o;w,..NTUʦn/| Sp9!D\\:BHbRYslnlnvIBDijbӥt.Kl>F&/! J]C~] 0)1DED?Nr]hN%۽[7))];=+-HٽsfsN[۸i ,YLٹk,?/01Ha0&&Ư^elכ79JjBDEEt=N1ד&or钒ZEիt!HIIQ(*fL&SJJjݺolKFfEwB2GhiRs B|)+B>}^TDI1}oθ} Ƹ+2*Q?zi1.gbuyEEQQQRң˭j16p?үƜ3mnټeӦ ][| (+w坻ʵ?~ȤS^aנEDD\tAAA&S"'yɂ*ݻO0 -&^]]5wnj@N+WB(.)ͽq&,''FFF2*:fFBC>{;l]aS^ZmkqْE2V[OBl߹\.7*:1Bm[$$$-Z񓮄˗.HJJ~,+(//wrv~***`gp8//?䟿un-TT߽7f5UYYQ&O%BsoEٻ? w,mhh(@@??f@s.>Pfs9Q\]UYo')AJ^^M-߽{8d`AA6;6)/ 7P&{;|(@ ;lP?+N;m{{Zb94`0V\:󕒢"=jdXHЫςǓOPPvMrRBG]3 }+$sg*)M=TT:9:/xWѶ3IʣS&ӑv9J{8ym?`_ *)x_|4-AS[btI,;/:á;vt;z /x]:@M&_{?c䏶 vƍx׮顢k`9g,&-fٳl7Ĕy#ǎ:?ba+VضUM'o{4ɴ᳡CϘ6ly'_h> p59t_gxꚚqcBwv)I\s>}cn1cc"ΙMX,iw')b,^w|+qrؽ`]q<=!{auuuJg@WWL5ɓ'_/0&j'G+W\|ӴÇm(1Iʣm[md'GV/y=KK XfggOZ^^7559qTYYYqq)7ӧQ1cF?}}QRR2xmߛ/ғ&qKFfW555))*>Z0onBO{O{2",49)!<잶*H63uc.GQRjrx۷n*)p9vɓ4ӧN{h!!Q"""G޻0srr0kgU- S_v/՗^PуRR\r}hz3hL`7S啕]veq 999 mD^~açΘz67d{~. _#CEM_*ۯb񢅻ӯ4G42ur1KoNG\\OW1ĵ7jkky#"""]222/_tN8z ~`XΟ~fM&=zܾ3YO{r\Bb.=z=NqV?05MTg :{vK151yPM M 3>SQQϯ_PU푟_mNCbb׮)((uJرmkPHHJJ =·d3f骤gڵ~9~=QQjJcGBHUuul\ͮLNyL06n̙bb7_'!!@ټ%Cz6s\Tt45{KpzaM`2ӧNrGТiC ;DKcy$-mm CIQ^Y_O޻ ǏgB/,.)yotK1hڣsor;X,+en!DFEo`0zF'WcL&cǎJ_E!%C ^Ziׯߔ2)-5W d".^,)!mǎ#.Gup҈M&L45#̜3;>̝̆ 2* gBrGܿw6f](<OPWWg|5R.Ҫ[~6nzy.Ԕ[?pn@ !D@@@KKKvk#V%$$bD?KK=sC^yV!{[6?KKbyUx{9"wμΡߑߖ6RWZiiq1a!A{xB Wڸa=wy ,\0O竱xpȨ&6CKΞ;%",ƵWz ]|BvVuOR98&ꥶj745/^.))ݼicmmmg%%ń}o;OP7r”Դx:jx. c< Z$%$|E<س饦v>} Xzaܾ***!\GlAq>zY-M͛tٵ{g鄐![JAA;׿k0}֖KUU{ldC[PXxI s3_[|Aҽ[Bb_E;J ?"2k,tw6/}*1 <98):,,70&f󖇱 -qrtw:-YYYzʂy=i>E2 {kaׯspt3r8zC>wme宧O39f\p=B9Ga1eƘqC|'} ~<|(/+˒ԉ>:|/\=~YPP`uv~w)fM0 loBTT/]?JHqq_>B~ wtԱTҏ_SmA if$<[\CTB\""<%\{vSSKWgK>ş>}wШ#:w.3޻:x}3VMNNPpHcc㍛~555cFb0_$ ](cF_yE Ⱦ=;FGϟ7έ**ݿ?$C=~?؈dnڰ.:2,6&b""w`ܰ{q"ٹoӦBLa!#.ySRR<SVuBXHu),Bczߗ9RߍxP:i׮ёa)I/9BAT8ټZ1BBB;u>cqc]r)>6 -ukV {aC !;"飞eâO= Y248 1.**TDc}cc"Â͝Cq.]B[dnfJEtQ 1}jؽؘ|;kYbMBddd;EG?:o·5Nё/_o Н;ʲd;w|ƽ[|[dl;_2+,$1gyyBPO%TTTTUU^22fҝq>z@_wL!f@`>B޿e1Zz%u>+VXPQ121`<{n= !׭IO>b{˭-0B{n+!cF/YjctSO0:655Od1fnqql6{2kBȬji߸~͊UkGaB:raZ173OzaC̙Pk]{b⫪虿&Ouog`swN:?w1G\?zDSN25j먏_Lw|{V˖h6sO˾ 8dXRR7VzFBM"!!޾}իVKlܰϠ:thU+ڵ梁ZJJz~m]uk&Nsߒׯ !/_**.VP'L0yᄫZzO]]]cc$Ӟg+++^C`hpVV6ùu͛ot̃6 VK:N3drݬlsw_>;ˎ=͛.ː{a116:yw _r7nRoQ=]_ݺ)sp᫽_ƍ!/?(8]XXYTT$.!aa>ILL,7-K/\ۚdgIiiSSsÇ?̚9]A^Dzw:7uu#-RPP5?fs}^=ktrkQ<!D˽Ƞ#eeGO4p߭TXM͗)g|EVvVc.N˖,$芌̗GMiKJJO`B***puۼiy sI x^ҏTMKmg %%%QoݱkY3nݾC3k&}Иdт:vr&[zœUUV˖FEǰl.r o.'1tUfiQ;mo?{qvqݾus@@/W֨a/l1wn}}=|I߾}ڠ~}{u6::+WQTԇ#,^~P(e.-\E"Q cbjլ)[M6::&##=..+%>!1AJJuaϞe]r񆳋i/_effN0_lf/^(,,|}͈(##SMMMUE%=#*s%2:u(### cb=[`;e̛ɬ|}˕c3vlW^j=?_>p25i҈;JKgչӉ۲EϧPj}K,~WѣOdeeD4gU+D._ݵgiSf.[xM@)))nۺIUE8ٳ'NSn-79d* IDAT]7j(> G|3g=JJ3r̸XpY{Zi6m?m/{ 2D׮mOa4H(OHHоmL7 Ùa=}YgݺvY|Ǐѫ=^voGWWwӆu-[4:p g"ҫ[j~gffJx7oD\ofæ->edʹ?M˖-._XzMZZ:ݸ~eʈ{w:999wΟ;m1t6ÐO`OvҤgβS޽ nٴm 'g"RSUza)qqqTߒ =xS}z(ncbc>z^5voΖլYsݫ673=o>*Y4*okǶaa3g7jcϟWO/>!!99ܤq=w([UQOE"Qqq3e㆏ѬzYYY U| =oΚ;g~=~Ȝ8vd.K<`Uݻu>uiqqV,_jh gϟ>lHYs }x^oz&1ᣇ]8eDÞ=ի[wͪ ԗ |*P+ ֮Y5_aaW=.Fn5mJ+\(͚LQPPEװaϞ/Y@SSeC 7kז4hP Dt娨)ӭɌ5Vt٣d\Awe8Up ߽D8t 9::͟;y^$қQPPp+X^wދw߿ODҎ8d-Z ПIءOt77q#7!*i\KJJav߽eێM$DCPpd$""r5Y uy@]'OIINڳfX-]%)ra)Ρ fq\mm-Bs'Nn=}ٕp6kbdli:&ٴicL.YM]=+*(7F]Mv2\}}}qfJjjnnn:[4o.@ HIP$\a캣.y\0wiVÈӧcO嵫W{^|֭]#%%u'OD$ 8D$% ]:wɵiq%|٩kO[_. mǏ{n={^[z1o8|V03+]va~Oo_L͕xNnn͚5(77~@4,.!bcc]L%+V~Ew99ܼ/ rsskժ%1hii.^8r[blc~k,w%"޼<99Wp!99Y$yxz1hkkv=;wkGAA?~dQQQVv#GM9V*ŋm͞5sW9>~丒k~}(ի֭Zש]۠ITÞ==v%KժU[1&&/ G0 [}}' EO,}<"" rrr4۷o͛6K]\tl1tD^M7b?yr/...w9&&vv[7o\o|jfxU{A(o h,yyyWPP@D-[4߷g׵+]vѽqJ3)jjj_#=#Cx?Ԏ[vܝ$3kf˗wޓ J*~<˝-qyyyPXXX$NK$~]\\,--MD99o|BTZ5]KDII̔GDD޿ڪeg1OK׹%3N:rtʔI;w5nӰ530O#!--=k].׌/8['N6lڳӾE慅EOÞIII=}&=zܼY3&Ç~\\322ߔ+PQÆ 꿏VG3|Ԙ5UU񶦆zjjx׈xn """˦| ڷof Aw[hn-6L=x=Cݹf&|oQQQry<ӧa"HWGsNQ>0ZZC-͝]n֩]|mDԩcǁۭ p<|hάo԰fb'}W04: Op>6mJM%;iT5ϯ<˝ED.7?.+#3}W7wY'O/\uii 湹{ ae~&3Nr/ڭt}^N..uq7o쐐iiQ>p8D}^ݺRRqhI**>~LKKp8 =F̞3/??vsıO;:/\thѼ2|å^޷HGGSRRRU_yoZky̝w? cg|.%%99zV>+gEN>S[WC zxz8yJrlkV WPsO1@qqq˗>^wܽo(]*~whU{NQiX򕫉M6y5s ;~y6?b۾T&? {(;2h|Q.%j*\=hhhx{ڣSI6KNI{ɓ&vyL"4aBzY4=s DpkRD{fGڶi-жMkכn?LDZvXǏaf華4+//o/O/oO; 1d$1_olЂ b~@~ ?J-ի F}J`|,>;STT`ˏ,@o\6)9#:ڞnm:t_BgNf^fRRhi^#vIFVڴn%_C>55.\d'h+m;pH2\ =deeZN$I_z:rk*)2ۙY9O^pqϳ8D!J(#+YPu(@i/]ٹ{oZZzzz_ޛ4իW`w)5.]8>"b11::ڨ>KM%E;̶Ie˧Q+#Tr%Nή{dv_zlm +uuuHpʩ3)KUUem۴)(,8wtpV"""fͰn&)}""cb$ӦLəp@($&AFFfmZ}r]\\DIfӧNVRR|M DԪe6Ԯ~i'}6ݕY((9=WCE1%=[]Y))= k~)v@rZM4vrqe%$\Ψ߀sΝ=SKKٮے{Lf=uʤJճi&,m/;,;~n]3gI%%%^#~>u2+As ϝ`q}_zcf"RUg]fgϾ{vnWVVf??e(%=(5= _*+@תUSDQQ"wDDTn->*ocԛ Ekm*(,ӤI[>%DTVdV\PX( Ctutßt=2*J(^pԼz/Þ I^|? 09%K25#+-#PY(Rpأ*kIDjj̆&,MyPWcHMUjTM8brJ9rzoCÁ3|>_QQA]]M/&X[]2XNЕ}.š\wn݃h9ǏHY N-Quvkk)oܼyɋڄ=۹c{bbltzzzTԇ!|W2ުeWLb;")9*ӧ4@iaakܷRRRfC/]=@\tu&$&Mn]XX4|$G%~G%-[x)%'uk)"}M/?a͛DTެ3 322 %AXF 7WEK={Μ=GD[6m\cۛᤦFOHϞ=,55,))a իmfP0zx@*kAD{3j ikrܺuԩS[EE9''iѽ[WUUϢcb^|tB<֮[4u܉?{^bN>c i7mҘT_~SXXr+>͛ÇYjقpWoѼݹ__iiƍɱgﭰB>߁VMłb3K$"KYD$U6Ww';;ՋOJJ>ٳb_7˷5^:{~߬_)(޲5k\fT[K+(u~=QVVvc'օ6lhm+:;EDF8у3g~D4r9g֬YEx+bE5O<%ID¯M(@QpύŖٮbEhuF|BB˶KKK_b$""rqusquch-;$!:&f2vBp!ĻN.TgEDnn!^<͚?HjZ2֪YGqqŋMH[l)_2yyy߿?i'LM3$źwjfĨ16Kܿ’Ckkkcт~O ԏj xBӭZ$">ۨaCd=喤+7tfKWHSSo_c33Sf7??_II1))rrręwݷEx8Pu(@rrŻ>JII9u]D<^nnxgϝx4chGp5nܸlJ]w;zt6m8mݺruj׎L^ݺA*BLl3"ҥ6;<A6mڶuςG;wꔚ)"2l: o[Cf-TXXp l B#~L<;;~qZKmA'g'g.cΟg(1)]vnB=P)S۷}v-Z4gsݺv:q4{h˶zzgN`| V@r DD=~dv ~ ҂'/1 r2CPJJ*ʯ^gggM{)**6hА)-@kii aд){3.WJ{@x>|-';[^ǎ@&S ? S ? S EGET{ow/>^!*fՊJ͞9#nH:ujǪ̩G`Go^  iiivF~X̓"q/Þw|eee׻kTgׯ[;g,vmy cGpln߹kO[ 8p͎5BWG/&&QÆoy*((HaU8 IDATү/cGoO޽{Ͱn&KQ~Omߴe[qq1;R+l9;^۱}q8kW.5o֌پ=NĎ~eANׯQ'6d4BKDժU۴qA.a~@wW޾zADݻusv&##:|Uv˛OVkԨSHT:W"Q O֫\XXHD֭=pHNN8ALZZzՊ<<{'HOOOO̤]oU+'K$yagTn:۷7:\ڥ YEFF|NuǡWT$====#2222?Әqz6&sfРf;v5r 2575d2SRƍ#9*@dGX{޻C =u_|Q]}F 74$p\][:}Ӎn޸`\"0߾uUC֭]#%%ՠAz_xn@U+׭S{Y-7ӫIDM/;xoΜRWWp[SSOrvkV xx?̩::ٶ-?}uW̌L֥ ^=]pS)\BCN0^̉ܟt wWB\g4o!|gXOp8DdiasǶ5V<tw +&N\"?_1F(4jjzz&b޿'^5nPNNjڮ=,D$%%h}BC=nt1(8D|֭9~fC\?quvlۦ gdgdQzF&A*zXɓ&iúM֍5w/À{~*={ceEDDnش9>>d ^[1dCݻw{QQQXfݵaocO )Ӭh䘱F&II}Nd=svn=<}ڭ[WAvtɢv=ݻd/;UÉIzr8Ν;1CryD|d.>wģbCC֭SRR8vT7 D4~#GБn:;py6voٴ`966vђ;u4eڒŋuYGiղe&:wp8g`%T_WhK-ܳwߎMs?q(+;&`jo ʦSbbҕARROg%GD~Ǐ&&Z4oVPP,e1ۇkDDP(<{|544| |>/_***JOOVRddso޼MIIOF:۴nw@{vTWlWD"QP;wūv{ǻt 11Ϝji Ź ˆHG''~}KDD ~|VɑMHKKk633_?ܘi3VNIIQ) MDNMըQC| 6 ^y<}*NZEO+a.#"BKԇD$\]̆ &"999>F7%L\.rssݼ<99W2ظ +V>xJ*/fdd]Y "޻{ZRRW_'$H8薏I~QҙdeeeqGJ)))bq~Exv79~Ƕܭ۶?zl.&%%3}zTU+)*WCݪ4p<D"e)NohzdveQg^--7oފw45%IKK311Ilg)ڶJ/QRRqer\\v<={tw'--=33S[[ctqgXM9ꆓ^z5Nq? /*I=q555ɞɥ.;q19D$/// Y[=6;ђOJKyc:d#xii}8Z7~DWW;1%V% yʪ#K:{ڶidBO=DT"0#"",WSU=o47F).@$+y$/455ȨF{4BatLL O5l܋ɋJQNڶiuMZXYͪFƢ2LgHqI y!(O7ʊx3U"%hqۇmp\H򥴴lQQQ^^^ӦMp8}4nԐ2j֭[q8.۲e %''Wvmvb**9L'=3>""lZ5%􌌘893ǷAL*U&U|⼽o2˰g&C7n8оǗ 9ܴ^fM5US3\nm]]fd_bd55l[/CCɏ~+uВΙ-|.++{{UkO//wW3CAcnj-..4{BavV2ە999Dsvk8֎?ozN8&WC s-vlZNGGݹ Ga070~le*WO|=C<dgH3o2;mHHH%I!Cl۱~Jll"$ӧN^vͪii问\uXÇ .Y?yKTuU9iTT;oeEEEJJJ۶= {v fJaabvkVeff]^{O^3Nqwq6Fl\W^rU ߳_^^{hժtXo, R 1jذI;s_P`dl#".7TU|>uIKK̹EDԶmׯ o| ߳g> ͛}dG!f 2eG:kkT__/a+X١$_]!C,1'N|;|əJō3~? S ?и/@D[.(C>EEv軔STT,;ǎ@NJLjРaDdDNvv~}$TAi:3+ 6[DĤ,.{@efe1eh44(@O4_a rqACOZZnj/@7m٩=4n۶l!=6˗hС7޽OD'OimSC1Ξ=DDnngZs籣)-@hk+**F~M?^ƍ޼}ǎŸi~3111⒱F߾ffn~~bh#ޖ<#1)(*.\iZSCg|>?)9~:ߌH$o:}fTZ5i/duuuB҆RR>|s8RkǎݶMr[nEDEEEyy DFE43PRR"4m:ȿ$++WWZ˥v !J@`ІMmݬ {FD۷oٴqfΰ=\332cbc]odֵڴ l׮;^(qrvqrvϞ?/]nu%Ɖ;T7ǒ-Z4-**Hџ]B#k梃; lҔi~ @~ H[Ka=iii@ pAv~& uO\.=+;cMtEWWlWpT֭J/9 ܄TcG>BC]-33iسUvB!; 4&e=]$?t(--} einڳGNmIZy9ykm\w.:z<"2=q8G8\v]/ʱCV@kNӧL\mиsdչSG/^JDA!99H$gdAjc;AHq /_'ɣG.9u# nKo{y9f9Kw}<䒒 !n|<\׭Y)//ě6i|~_nצLpJ(FF} _Nm*|Ww>Οnղ93Nm{]rwٸn, 4`F v["ϻqL|]l㕋Aw}]jҸQEG2Nm]#(ou5J^rb߼MII56 G 5wZjN.fC1::M4ED&}޼{[Jȴk:${Ȥow#;qa=WLKNRΝ:;AH)'Ox▍똵Q~wUU4%&gdQbRP( ))\~#/??/??7:rIII>%^Dԣ[$O[B0..+ <];w |ڥݽ zFJjH$W.{P(}RG[ E eee::7|g@~7ko*M{>y8GPX:M|]]-9~R 'ܹ۰'E1eдIaaadT=xxmUlvW'" ÇZhjjddd2k͜Õk QVdzz"ν$kLy/_u{䙸E",e4#-11׏BRRR;ulOg:x|1q99DpKW$VDKS~a%'8))O=GX>ׯǎhS'$nؼmS+))yx1f3vu++g *MD%%%o%8SZZ554ԓS Iɒ ' ڭq}XزAl0]Aӭ֝9q̉#]:u-sކ=Z6oSWRQQNJJ{}NSSU%k{9y9]mݱgOmݪ%{r[xGKJJĭ~UUTq|q8+;{GO^8oUV}v#OTώL n-m>QFf:Sefdff4gܺe fsib^y3mV?:* j(E IABlP0E ƤEV@?gֽsf̹gph4GA,9~>"B!\HQV-ǙE9kWܾ_7oL...~~g<|""%%%FR223Ma w8YsrCgxywttHKIii"gw~}5 8*QTi)~iU̵l( PWxER988il[G-,*NNΉϮ؊S]MJw'PSUP(K[WAg?|i϶ڻmׯ}͟+!!Nє{7F7~NaᑽzgnAєtII bW/TIӦLⒷ ؊{wa&l).ikk)߃g~~Zmwop^=I[ B!~7d̛-!.֖jwݵ}{|AVvNVvu\\\Q1ꕫoXnʪk7pBĤdm;|***^zs禦懏 $?pIqqDEߖ]fC]]ߟO:Vmڲf@_*ZRRuIۑÇub2uwAP::::l\?j{CUUYt}Tֽzlkm{ b<<8nlnnݱۙ?SτNYvI̬V@rSNN'1q]*lV[cbZ[F;#7/oc7A;6T[[w=EEր֖4UOW'/{+R4edzځo|YmraήnQ6B!ꃬOJIMM 7"o1bق% Q&Ga;9}{˛ɯ/ ]|5~3aaV<%jllO 7DO-; nJ~/i9B!П@c=n;8#Е gZ۶OqfbTra4`}I[-;H8:;ȡCGGǒ藿p!Bp=طDOUUU2O >z9(UFC#~F!B8B!Bf{ǃmLnC!BO+B!M<.{lW"!B!'!BDEp!Bp!BB!B!4B!B)==ݒ(B!B{@vG!(/_4|t of!B?LJ !8B!B)rg8x!r!B? nB!B!B hB!B!B?N@#B!B!!p!B!B!!B!Bjnn"B! CW@#B!B!!3OK"BJ:AۚkgO g B!Bo'C"QB}?rblH;qm!x#۽bqj~Ϥ+Q) YActSo~ FPoQS}3me_7s#[?g޴<|CmkfOSWrfX, V_5sdwa&͐wmJwkt J+ɏB觓.zp58|ϩ쭖&z+&z C4TlETW%e 0wK>tC!B_ he>tFֳ^غdס[9̽`2J7)|ݯ[oǾ)`AF\tr6ʥVf;_bO@!KxmYA~^&N ƯٕH?mymCp݁`AckgOU;noIE(θ\[{;SeйF 44TP\ڎqBjsk+ OLrf9uh-uͭY&IQ<\ Mͬ&aAv/uRYU +HMtn.:7fvt( AiWU\P\:6DINlhng5TVhsk+9㫥GAoﬗVsʹqs6{[Q5u9NI?z'iR“ȈI'w<̎vu]U's拢:^ %-<^ZL=W|]O] 6]l?yӺ#WoM0շ7~f?G5u ui*4qxYYYm=q'۾C</;X(SȩŢ b#>-ڽ*,-{}Ǎ\֗s {p|3T':9Y|DMM56:Env~NVVF໶6+BB!l+>ѷs}b|<AB|ut>:km/۬׳/m^4cÒi+kk'QLWi#mQ!6:78.g@"WGGGZnJ{?mEu\zt n.Nucu]>b8/8fŖnv'2aFg ^6\X_L1Ac2 YKdݞ_roz q'.@v^"-FUޫY Qu^=jܗDE]$UtG&?+)n6 N?2*"x)1Q 'rZYE<MKItἜ,>4)!6C&pHݹgys/]`0H5kKΓ:rpplvOII봛$-,9b9 [[[ C=b51w_ dI]VUSU]lmm:~?H]]]dTy󕕕 --l ̟77,!~B!ԩ.W@Աڏ]J*bR3!~Wֻ=/;u;jQv&+imk+z[A OJo*SoFN}9mm3g1=q>Hz9d05 =N>˪=k]'=~ r@9ύ-<\\VZ'$y0q }چFt~ܗ{?}Z^~[Y]7x|t s R=aeNqꭳ;׶3V'?~w^^^mSYNxٽ? 1do7eڌܼ< x0N+--s=?//qX1&?3ׂnuvu#=̚9xoJ-Ma#F=ur*[gWr(M~aa6mxۻ?Z`ѓNkl|KqrrY!(0{Yf6QOݸaaF׮x2&6D! ERR{BuF>:yIBc).MOaW!!؃׶-Ĥ0J /..oWTTrbbb Otpsskhݻh4M\hk%<%&{ }[o{{;c3ƌ1kld}1Q[m{,ƍ]f#|w&q;=~Q{=ll5*"2m/^@Nf20 >s!)S/[xB`>β@UwyVڬ5rI;yKW%2*IV-zpzqVBxii){dޜ9#,=: bj:-8BSZ74DdBL&s)557?vDJJ$%%Msn%$ 4>knK 2{~}ԼA_}n.İ;m&gWYU:hlraraQM  gžDP^A1>!5}3+Sv'%u0?YVV8!B4B;0(A.^xs1BB.gj_Tճ 1T\j51½NY\KSto_VVb*bX -mbp򕕕c111!nyy74880ihh]FsƼs_v˗ɑޓ2dHxxq*((q B!" hB9}Ū9X !~NNNAh4ZKKKfVN?ӧРP(<<</^>MMYBHK}iC^*((?g_(u(,,ܧ2у8yDee%:nȨ *ڳm*lt@tdxzj)RRRC]r5.>c[{{{\|{gx<[7hkIϝ>ELJN>rbdm޽? aA!'wPb|l -[PYYE4eg_AvಥD$5>zy(!oɊ{d 1L0""V,_w{/B!ĂEB!_UG3:tf#Y=%oz8HnxK˙ӧYMNn3\8v>o޼uחB!'^E9B!BG&N`N۾s, G;9¥K菱EUU=2jjۯBle&[Aƭ[$B!&9!B ȑ*r9ƌmCltttr3 =.1"B!!B!B!!B!B!~F!B!B!C4B!B!BCBB!C'B!B hB!B!B?ė'5iD?Y4F=ꔷ9B GdVP GB!B!՗'$QBYn.1q1Q^GKJJR(I] HN k6nnnu}=ndeeϝ9(ั7\9'&*JD6m0oWO>Ǐ n6f4['PWWHK17C:lx=ՙJBzYUE B!B~,&6o IDATE!{QcLoߺC\\|mZc-&oy ԭ۳Zg<?\2331^f"Ym;ggϞ =\H~,]}z˟>~czFwݽeAq*/CGKk$+:0ae^^^g.!B!st>-/ܙS1wo2![޹{Ye%#b?|0܌116 ( _xdedBCgL(~BlibbB}wNwDG<~8cr@Ѝ>.U477؛pDjZ:NHLg\xyyED{%舰'anDPUEϹ'a!KS(. ++QԴ;wM4JVWWgQV{=_W=E |/kGGVG7oUUV 99,#O%:ndC|B!i:P(Ϛ35}E3M1{!{+ZvF]M ]tնRdTYd"RBh eKfRr 9 4M[[k̨nf oX&&6=`}CGy{!!S'_l`4{3Oc z99 L&JJa2tyt 7جXQu ~U^V{bhHÇXQcF>uJ{w]d0(T*P)Tixу[f~xB!:۷Ammm|.3pȨ3YeҤ׉榦搇{wBbԈ^'kjZZZB=Xmm-1]>pꄗ_@l\<0@=)>&&*\UUi3jMxQ#TUCM_~}-&YXXtOE@YMMuuRRZZ336\1XOo¤)CMQfbl]}Ň5YlňQf_RR֬`d?߷/FT]]=r¢EK6}Gs޳{JrO}{lt͠@rBV q31Bu2-&*Z[WZS\\q{JʈJ⸭ 898l̙S~W/]Խɣ["FB!􃈉y8.-+c00`zVFZVFZBl4+Ss^e+YA6׉>}:H[oӗ.#r}wss9$WI~H{UU|t)??SS#t`>5UՖ䔧T*599`$$$~nZdۇj} n{{0(--r1++k#z'TTTVWWw| e%i)227?M WWSeKq1Qq1Q툂?ߪ6KyٳXM|ة8YY!ƦLaa۷D;:l"gie5xYY.MMBϗ/:ڙ7wN8w{_ 'ӡ&^GM_O5-]}IY}I::: \%*455߽\PXg0/]m6KOyʥ>l$++]\򵟀S %$$S%EE3f;8N0#`@{;p7IWHoB woXnnnqsTjj;m \d5AH؝ ?nNRVRbF!pɢˬ`P=wZ^^^^^^&))GJJR[7#!||| ..>cO@OW~-c'a-y *X7'=u0ӡD[uJMNk>g|M]1Qѣ> 2ol"h1έ舰wAVe{cuQc#vnIHB]]uz3nYൠ윜3*ԭ[WK 9YٽzٳfFFEx}I'׬SSS tKW$,<"1))$K4GD3B\z;v& RRWb/z||C 4ڜٳBCS;l^'=I{lvϩT6Q9lG<7n\WWWYYpiSD:u? ';m{߾}c#=ᑜ2|!C]Ϟ}[}XYYYjjGѯ+طo߾}Bo8wnpp`oأ:eێrW{{[]]}m][Z?{z:NxjmmT/@W^>.@qN{u 8p'--#--K$deg9'$Լg6JDD82* _ tA70>*<"RG[+%σ!/jkk;_qXvlJR>uYFævZN{: _&3]}û?K_SAAb!3̷^p'']km70yGdm/a6dH^uBX˳NvXfee=zȱZIK &JP(fSXXx)/^ ?ྏ)ߤM_|9{i>>$}t(gO>K3 VX9,׮^!!w`Ȋ_:f9uL-Z~W}ɣ11.~ϞMa Qԕ7o-XD[|ضlێl7+q+qLᣞޛ>sA׮5K.goE!:O}C=봮^HH8 }D=1 jt:db#uVV^ioyyKuut9ͪyWpu{1&)o9g$&6cKqn 1)%i3Ϛ9c¤)W.y{vߟ=2c֜B!BUWHJINKޗd21QZGyc2--`y!FSQե[n~ _VUEX~f mټtJbr)),V7o$оxzDԴO+,,nɜ\QL&sً-𽒐׹>?xfV^] Ѩ "w6u>7zgׄ$!_,˳OUUUSO?wNn~ ?sIbG-Л6o!B!B/o e .&ƊKJH3̂B%EPVRy3Դ! 肂B1;n..LDDd2k ֯ijj.+/b;\VFqmwt|L9؈nyY901T婺f~G7n2szԣQ#988&Oн{wVӡ&*S(&}y׃nZ/Y,$$$&*xnH,? BGyԨ))OI_8yTT*%=9 "{v}={s6n[Z?z:&F7n"wﺪ -=}F;~~~ "+##--ɩ1p FkiiF`v58^ ZmRVF:ɬBeX3g4RIQN]ɓ_/ j[~%%ŜwIMe4B!Bjjj]v^+lln:5U׮N9+'+|d޹{@=qgTN`߫݋^\6mm׷!*莟dltKKK 67m{rF~f]U׭QTի-v {;w8瑣p9AAʪ'Og䘛>ydu ~!۶ٽ+6:<8(˳O<=} >^[K׬] ^ǽOyooo[~#JA֋'FFv9B!п@Scg؃xFBB"M}CL B+ G͙=¢ڿY tq [p B! x-}F!~+hnƛB!~kZr_ {/E!/+B!B!B8B!B!B hB!B!B?N@#B!B!!>!D!BWX!Bȡo+B!B!B8m5yRU6@Wkns 9B&֯;٬XlB!B!of)--۱kwSPDDxa藘-O?A"/޽`rQ(VV!e>Kx:c4RB99}n OܺAzS()Vݹy777#rr/dFGOL--,zELLlxoCn9Gn xjld3zO`S+|Y\t}y3ŚwXz1A!B;~)173'i4[tiii'(BsoK8pU\ff5UUnBMGTq^^<<<79khmbx{/Ezdd<l͖J`aݴܽ`\իᙳH}ѯGL}:妏cd2l"Vw~{k3{na^dY2Jkbn~A0vp= !B!~[lA~.8USU /59%޽cGSSSS6}JݸaȈI ! ӳ~qc"6;С'>{z qIe?6q„+.JHH\1 *"l!e]ܧ cODFXZ#rzslltdR|ܡvslTDY3#ӟ&;+..!'~d޹#9!>&*r BħOaHNfF^z 6;3L(KZZ窪>>""yӧ팪x999^0ȅ 泂!wSSܻ;r{Czɩ8i[ZYQ)Ԫ}۾vrQ(.4h))F[}^>:F3`bϟݸy՛o;q7h`udRjj߼uk֜0adC`=s郴uk>.pq۷ɉF@yY1&Æ>n9iYFӧP(+-%% ПHOW7>!aΔ3fN> LݴnC ['ڽ{Ϟ))O ""`1ɓ7Ŭ MWWlLЍlɹf媁B`=m[׬۠6@c]ߡ𦸸8VT`2T PiOh|UGZsvcGuqp@EaO (T*t0GN}qs.~B!} /UUU1#G)(((KUUeǮ555E^-}+( 0e?ߋ/kjj999yii OHH8{|ccc[[GsbUUUssgQp/84>Q[[uyp𑦦(**BTUЍcF~qmmm999L& 88hNo\ N{yyɎ+--%X϶ 898`cGdldoBgW~_kk+ !tҲ2b!qqo|H9{ ? ?3Ҳ23 ))*jy?{Gb륊}mύ ɜ8yJuM͠Ǐ!TbbJk**xyYMe#ZZZTjbRR{;#6.N]MCw{ر疙/v8v90# ꜻv*=0%Z:9Q(J9YrYwo0 /ߕSbvlG].Z 6:yzޢݻW.?\\\.{SS:n&ndi`Q IDATV9jBż9}{8兮_O:x{3b^B'o#~Cd:.$ԭR@@ ڳsrlW1LKSseZ%44qڳbDˉؗHw{..>-'N8)*:!D@RBgyO>\\\^Go/ئ[|Y vtt\x-uòCPVV&-%J}/ $%%UUVV m2y@l`vFzmM@i^FCjI19c=OD,+vMI0LF;0!!gQVf),,uAê4Ν:ƪ*X z #gPpҥs/++/۹c;|Eaۮ?kWꭠ`l:|у}(­>v^glׯlh]"JJN641lP__k)"B?w={(fE^^~n^^n^^VV&{>>^eSd{ t:*Rbb&$Z[[TocN '$&vtt&g _JZZjdj;ww&M8pJ!''((ޅN>]VVsn:=EPի'Fࠍ9RYY)99EHHؘ`RBBbII %%''A4%3+G/`ĉjİC]b2oƭ]ͭf1nhZis劊̬,裬?* si'yqV*9c%FM}r U٧E&99o߾cc}o޺vo}CP SCf:042*ZIIC\!_QȃАF~YYٍ1\HH苅mXX;|XUUUYY1ӦNaiV9wt/|M w111σbR 3M&&_B_TT*SH?}Eh4ڵ5W .{?v]?{|uuuss;ה>4)!6C1dXf$:2<-%iN ]=BLS4 Z†XӱzT|LLb| l)$$tXJbp..Ǽ ڵ؝۷>zѵ?ma=,:N}"/߃jjj].?w ]K@>Փ._9;w^pG<H9wg# ̘>-#-z" ӣR={ʟNfϞhFEe>K}ziYنgddO7%DOoiw99wnv_|En^or߿ӤG:%&%=MΜ;ii%%%Μz[ZUqHKTq];v Q oN!'}d'65@)6;GvʙW|י Y>.f玷ؾsNG{q(VbbUWW'P!OLL:MS[υݟ,V;;;8.--']wZض4kY zr­հWb jjj \> P(Loqu{(P7!G)" cQSU522jbla &,_S7Ś:VfXFd  NHL42_B!D@ѫW >R64{Os/rR-퍄$iP) ij/EFD$G~] ~9u{<ϣ/^pg@fVֲHAnuI/Fsq߸֤ȍ7oܼI r8se6.:]I#4a'5Br^E9rv5zkIA{3Ð9{sޝH%&W6r4qx^3S>qs}F'.\lB|y*N\I xBLTssHA }"ֆf>G*ʪm?bЄ555\nd_kG 77o'L; !s/[o>)cA_HiUUnK 6{|oT~Z% PSS٪­Dx;rpw9rĊUꎝ8WPP}AHhԩ ۲9Ǝt3>~\ejN nzF>|1;ۓBVۈ1z(36]LLf=~Fm+W3L__]`]Ǯ)}?BAhozKſrssxə;9u#F󪸮 [EB!ZEYi\d""y _)nX: [b΂EK~0jynj'Om:3^Ii 1S.l)//g2B $$b8i---[~tee%_8;;J=z4- _b#" L,w6{F¢0vvEEEqloQї7o6]OH RRo6ΘPc@!d2u$[6r oA!BUgdp&}e/oo6goyE^vδi $M!7356YKqq%%NGGzz q[RR{niХKgwiڟaX>VQVTӹ,Jtrnm1Z폷+5=܊|!&9QgXyyyZS5g$󧥥QܷxVVvKg6XK.:ÇN&wf s@,+""fhlνloQQ?q2'PTT$--͹+&8HǀB!֜!B!(*1]w8g* ͖ZZ+M넄kAW=Kgd|R\LP7xhMa_ZXؖɺkDEE%%%Lenm1ponͧOc^nJфnq𬯯65j'y=q<*2W/E;ۓ/Dd+MܱW/Eq5,>~H4E.]8e{?~=6D)<13FCPM߯fB!G@#B!_MMZڝ:ӧf_6Lp;孵X+##bDAe bAצ+"RREȯ^~~ee7\ns&p;wmBBco.  ǿ;srOР@&tg;O8&6pk[VAkؿ/eDMM@ 룺{x޵yy[DhX8Aszx3"((`gwќܜW9͙;w]rrnS,_q ۲3kbK3mvEPyxrsvG AAO/bvBQ7[<6!B3yrj#N]ɡ֠9UmP׸xPYfK fZ`BLJJ aIBpR( M@!B!Աb3P~r!B@!jsm4,!ЯٳB!P{!B!B!v@#B!B!jB!B!BM`4B!B!B6"B!hB!B#&EPl6)NP,)ȁ#B!B!BDiI 9 ((XRRB~!B!B!~"7/[(@o!B!B!O$&& 4~~-11; ;B!B!BDmmmhhBOy)))~~~~~~)))򡡡opBB!B!B?=d`999 $qhB!B!B2"2mNB!PuȡM֓?Dm #F}׌B&!BFP֘&у?nۛhwGCsQRJN|G&絗y{eee; t>FP{%PMT*Xm ~2ԉݺj*<$t4ԧPg#((xe&K3/AAno߼!)!ADvlۺ|~Ùr!P!//ڕ[O=pw}4Bm8PrY;B!jWݻur颊2j v~܅#Fu<<r̚7_6|v<zNk-˻rܿo!Bں>[45d|Nqׯ'M$t~O=էL&olK\TC m[GiR N8a!Դ4&ISRRҁB$&~.0US[EE8a4]tnm&6ޝT*sLe=vŮ;`SO.Uϝu 9c:#)!awDxHЫGQ2948I#Byyu>JSSRtzffbϞ۷7wNlC,Y2Ё}' }r疋L<)2,z3&*b= Q)Բ~**44[(*qJˈg N7v .BE^^~Р/־}ќ -]^G]݈6 z3>qOIMq8㨩޽[JYYYCUURJIMKNIݻ7,Y(,>>?PQQ :|E ,[j7\[:egoowR{=6|^OJ9eĿg65jKFf/qYY]nrֱpK0={ٟ>/|TyETmQ(1cF{Л9ӓoǘLJ*bv{o޹һW/"GSC}Z:9`0N9k$"so=T*ؑCWOL IRJXcF ź5S'ٝ>3rB;Դq'/6Y|G!)_YvJjҷ/BKg#GRہfJJJiiDfaQQUUUϞ34mL0`z׈7yy6[q'-#"_FDOL4]r ~~99ܭ/jYܭȗQ nڰ^DX[4AOo YuuuM+/}_Dνeee!a>$GDsAAA rrjjmNUUUڝ֚)((5Ko&LxFo'&3TUHH&Ot+WX9,{@pHhmm- SoTS}(]vb/_jjj++deeFPz1cfϙ>er~*Dڭw^ѿ?t:[{C!y T}m⩪vEKgRRRSL׬Ҟ{qqχƽׯ֭]sȱ/_ !PUMIIٰ~ݭ;w֚-[`N:!Bo6UVV.$$Ĺ+",Lt@qI '^XXY6 էvʼnqcnj5 )no{FCK{=rkW.׮]3}ނś676N.'=~ޝtzAA!⹹WPk(,*"n0tN/tee\***MkMKS#=#3W<W/bŲSÙF#+;d$%yxwLWS) ޼ugq^/OiSCCRLfLk ?~$nHJHTTVr<!ZIi`pcaaᚚh򌏏eeeL&h55&RnF͖s%}=-6,(84UAF5ޞlV׮]oB!BAnۡ:Geeݾ}p$%9qi/_8wWr7hE˗-tVg U!3̒G͘ΙFUx?}))Η@]]G57(***((,(nDsIIws,yNn@ݤۗbab@уbg|PW1c5 Ʈ{- d2( ]ǎ]tW5~!&&v[w6 8q«y oi3gsd2`BXDXh8Bϙ]}IW-]}̔"L&Ngd|RVnXPRB[n\b2o߾ (((XlђOOӳs8EzՓGh4,ŋgļ%%v~=6Bkkk_8eKĽ>ݾmk@ ɯܴe:fM9z89)6;ϛWZZi0K5sf+ػǓЬ,/'ԧbω&1 .}l6{ ),*r8f)!P'ewߑC"l@˗g7\n >~rKBqw!!];[XXr6yyy,7Yl 㢓g'j۷G Tnje4 !B5f6[<6mXX8ePG?sƼƋLB!Ԃ]En 6lk!D!B!RÆ{9B0B!B!9BvCNNFZʃc긘,fA~!8/B/BTŋB!E =vSMM L~*I)(< Aii 7:Zb]v|emb~~Z B?oQ99:bBCϟB!CdrB!9z?}\nfގ^Ƒ#_>ISgcF\n  r*B+aL^Lq&%|}[׮֙s 7= ^O^^NVT:sS'}<ܹ1b0*𮑡,Y81q+wZ'>>R1pcA78z߻uդiy= ld|syRfܷgz{?ذhMH?U}[׮wn{GSCQaѯΜ'މ.ݾ/))tMlLTDˉprJ IMǙj{DE _cfJwΝslݲy5f.׮3+Η89wn'7o\߾`\qc9|||W/;o޽&KڹCo`uw$##t\6;w@ _htT[l޶}"₁ǏSmNOӚڽ{w5عcKKK) ֭Y~_7>sEAhanO<0:$e? 36mm`癷%-@A^>2,tyQaobcmO smӴ؄O!tOjnBd QT9Nn(.)qNl\˕KZO}))3 dd]933"2 &O7{¿{T*UAǸ\s!,?wf/_LW.aea>8L&Stb|̬TR>lEaal]mݣ{ŊK(δvp }yl`paH Mn9s#.[e>l4y}|YY9z-?U*wCU]`BgO:arN o,^Xtɨj+V-X8Ys/kg6$}eeeW7 NOfu -;fl Kx/---##&@ |q񺺺}GDU=8KII=z˭lgԉczfHJ n=w´tVΞџm(..v]xzykj_xquΌ/lJ.3Y3cYƏӝG1 wOO 9d 8qK۷Yujj]\Wo ]xIF!: _~yb*+&!'GyC]td2srr_OD4جGѷӸ1Ã#޽CEkaQ 쥨H[:wm.]4O.cӴ\Ωs^~~3tu4~ZXxbOT+*+++rs3ߌX,֝  %)Y勰BYpo3߯\1]ʚOէLyN#/LםvKqI y.J9bxfKOfMzꓔfcbC"hڌظ7t:8VG4Z1euuu*Ǜط^zf|L&3'7xl2bLt.Qw/rKxoeg4Kʓf{қ4mD4=L0>//?# Fly޹0h>g yOh .*JHIIЄ555*"2dVTT멠a[mMjÇ3L__]mxj3ߦ復@=p II^ [?PfV`MM- r)+-kEDX$ۚܫJJJС榦=l˭[!-- _ grrr&Lܭ[cG؞WLzRShWl6c &tp\ӵZzpׄg:g{,++ Ӟ6!f8HJZenAdgNsMQQ?q2EiMU`0K8ʚsRv?|HζC)).k>gfh4bz ??|KOPQQ!2%%%wKMVv#O1cxsvv*SsҋCYYٱ'O;޵󌽽W]N>l؛=.@9qНWZZ_@u#z=ymf[.l(##gPKq1cCK,}V[""#ߟ8E B!ԉ#k^L^F /O yfdeG 'oMfVv⇤-(L|qq1C o@~Z ѡ_bR<<<}rh6'7/=#|9=5/P{y?342xB4pH deh4ؾuSfJ߮""PU;lYl*bѭnݺQRo׳K.Y6͛fKO²2 qq11joOgBPF ?n3_?6BoΠTj9Yah:M#t91Tu0???LRyyyG z 1663+k530,bG>>>!Tj}}}Zzhc}znnV.ރG\yǴQj6ֻw/yyyyxxT К-ys5 BLE"..1kyt:bORPT9c.//~r\gEE\nMhPTx;f:_s*O⇤M[S43}&3(- IDATzaї&+8?xhq1ќܼ;&mS/Bd+)!QPXrkeeUhĴ'fXQ>Bv;YiOZ]]_u`^Ō5#W*~Y޽ܼNB Z]?Lhݿ߰|cPԦۂ6"B<<99;mv63ٵc|HJZq/fΘ" ?2%u@%7o޲?ݦ箥lЁ1QՏp qq_rCPH(u6즏g6kYYwа?vDGZ7_,ݳk׾={LFRRj5Ĵ΄l=$/9x.. ECCWh'.\|忳hQ#6n&7v>$T*#Ngigƍha` " ~xՆ uh>B㓑YbLFZZ Vy %~)B!;Hп#QG0쟡S&M4^܀>>͛{z?cX?uaM:Bu9wb~NrITvKKa{B!Bqѕi0 Go &N%GjmX G"j"+;[Q8F!,*9B!B!BF!B!B!&!B!B!P9B!h4r!B! F!B!B!&G@Ks/_;CB<g<ROvwvxu!B!;߿# +!d bV'VGPG"%%E_#:-^B!/)8B!B!B F!B!B!&!B!B!PhB!:(~~3" f_8w{HN|C!]+֣>erOTd;9izrD͛k]UuB!:EB!B,}=y&3 ii\rFs{1rʶ?ulii)9ط~ ))䤟?XC]|-|s? RTTAnbV7[`0m!BhB!:޽߾M__@hΩSRR&k@~sJbl6N_ry{n[l63vl6;E)YaK/\h.6B!)8<~xd_F@xhȩZ[ \!ԑa"8ŅXn0gތ@I',?ˤI g"B^/3YBed_TTTVTTwo2%Orƶ+q,?ڷoW/:;ضuցӴpׯ^у!aج, <$Hm0R? }^/'lp @.]}~ B!jwhC5556c_rQ(y}޿ \`>)ݩq1 ozyg eSwoc"9Oб&?~c(n. /$bxʺ9]>XuŨfDDX\.B?y]|lrb `woǮ1o8 3P(35ݶ 1l"".-!wbnнUpruOX+o4@oyk']?;t("gۮ}Y'd( 9 @P,9~~7߽ klDnM 71Fs fW}Hy3Ǿ{} wS/{[*  !~Go>ϏZr"Rro܏}^~Նi0CsDT+Η6{3nnSCBp.//o܄ɋL4qx{?fm5vf_Ԙ1U^EC rISk,9--}6b'?|H:rTm~Ǝj|&$oowq?n\xD4!9.]<cڝ>wA\\ ^FE**d0^EgeeD!Bw; S]&%$ů矡~]C_n%$hhMx իB?A9t59CoҌA gвKܹ5g}Lf=bj~0&i_;u⸅ZK5aedK8v3{\Dަ5`vF4~}8Qd>46,[ZeFk2LI*l3V Cݸn.3_AҶNiI 9 ((XRRBj]g? 9j:ݻv(sR(۷Y[Y5;)fL:rظS4F_UUyAKqQg L0{+NѻrVv~wp=%&5c2WnnI#\}4n0C飇_lX5w8srwVGEgOap֑dfee= 5|y6k? QRZnV =Y,֍7U &'@iij>%7'3x_P0~Xۧھ&+!B}5s1Q۰{}A 'ٹq ͖mya-qx,?/(?5)14(w^ [ׯ;vټKH`2o>$;]µ7Z Yso޼e0Y|_G [b9',mϳVt(JP~;./.LzsM'\^_IGoU^ cqz3,R\k׍#ogTSĥX,fbj\Ng%~ ( d2 zz.|qfI6 323zˣ3sT׭[Wr{nyhC?I|ύ\x!M\dX,}="GC]-&*Ud3S").y%E$y㺔g c{Zen."P4w$B{KITed({o~ݮ>}>Oޯy>Ȩ8uys&[ihh`J8g~b,ܾs+ +++bNN.dd6dOcuwjmkY8/#5k7]o-׏z\p{Q][{srs`ղQElu/FG!e1LMa===4pr޾|ҵ새)!OS_9ח:qq9Dk&755G@B\\QQE-B!~ɜy ;6:`;헝󥏛ܺݻ!zz۶:YئWHDXXNN6-Ϸ2&!!-qqc[ yܸqӦ:nqbNNΣnGf4-,,wܱjy7&=g1gl֊߾Y{F;,7NL ڒڒ|iUtH0r8z}OhzdCm鷎Aedh22; "-! =lf0NcǕz̡{byN\UQΠ8H$!_hɍ/~(8仹 T.NfMfee$%͙ꥋYiz3<iܼÆ=w9Ξٽwk·SPPP^Rp+0-BعQXXJJ {Mt:$Xk'8pI/'Ok( +G389gW$iAgppH$\ps>(,,ڲչwm:od*%5?ড)_uu7ݿ= _2#r5O/okimc~AUuuF曅񶴴GB!fs}}=N?㫠 2bMMMe?rҲ{fA _XB!?~yb1Gxg~賧r\tF*t:t%jkJJJby̞gfϞZ돒ުgSd^>nI1@9qeՖJ%uØ+qz6س?$""RZ;{`DLk`ɔByc ߮ TU0XvHGGGTT i111......111AQQQ_|ׯwttDDFʊaal(pppܹ{o9G"HT*uHU޽{qzY L&:x.:J.*zҟ]" !BJ?lllinnfj?YU]MLev|z YU]q“56Bu~ߺɜoFi0##G<~ԝ m9}OV,/4"I|{K@Tk'} Cs^>imv˃C'Ħ>!mE~s"I8_/ q ys NMJ8tbrk;[ן=3b{gΞI>mjLlaW&%'@LldI/[rYccvl&N_SS[PXM}8m.B!寧%qInnn eՏG qq{{MM-хĴĪЯ_?omw|i%>YZm<"S\\|ۑp.'=<_P]]-%i41$3J-*Ȋ~rԴi!A~4n̉ m(à^8wBu4=w`_}cigFxy&L1YBjO\t*vFSbQgLqqR Nx`}e?Ai@InnncC_`1G;/[HJAݻw||--0x2A}lsIIAǎ9YSa56o0K/\t9ouz{Uo1E|$Nk=|jk\7Y/^hgi|NX ]|aNg';tؕ}#֍[Pjjj?IjHpw[/5553$HIM5ڻx=rAsohLl8 6n^Rz˖ o,Zj%,? 6tXeel !Bȩd"Q ή0 ''e3//J V˖.ZJJǏvܡxCJJrK2 ?Gpѣ888gpluu_O"4&M# xʔSStutxy@\\|E)) ))q쨔$''縱cdrgggvN1V`٪**aܽ9Jd%N*`i9eOX\x^5O.VRS/ž<̼vƤI|0bmt9uu8ҕFᲭʵ0))I/>/ZĬbIK{=sIrrB 2߼ZaWKKb4 /麺zNJJK]@LlO).)]k_>@ۦ[Op ) y{R_]joG z}Z; cvkm'-=NW`8mv46Bj| IDATOa1itP0~PZ.]bK[xM&FHV^Je;ϲ7Wmε>p+/7~IQ{GQȜ[}Witڞ_DL6-*EEeE\\|˗_`Ԩ\\\ !!AZm.nG^$7qsONIg1GGnշܾ]JJ;̥W|  222 V1}}]_.f2va=r ng <ܼ'h Yd7UIP] 4i4 }'7٣,.>a%>Νط!Bofp|m_ҥYoY#L*Ç]rK4qcF>קOD!B迡K|fM&Ci^[[',w;s5ֈy?c%wB!B!MMNg "wӿ B!B!BBB!B!B>!B!::C!Bg+8!B!B!O!B!B!~ \DЏ`0.goO6qR#a~я2F7IzD"I$` "B!ŀB![u<<`gfk  (`"B!F!B,nn*Wu\\TjVVk!B!a4B!uttDEE $smQXo.U|J+YYY?;S^2Ņ +QRT}{w[^B!BP_')!.)!P_D"ٯ+ˑf&k=|`Ԩ,!//f٬Iً >BlKII=21>KHHo.L8!8fBlt\tfG [ShB!jnn  knnf \8d` xzysճ~Af|e%%%%vlҡh[latFM5LLf˭tuM6 N?Z+~ӧ͘ij???lݲokk{* 3mo9mqhGVX-yy9m.(B!>h<:5.:j "GTTDҫnzdr=] _]\\"''2XY9(63aC˭e>4m1ѩIǎt\tԂb_$1L|$̡CW4RUUNp`An$//ԤWq1K,urB! I ?%vشWfӧ߾37#H>p9l ҮD&% $zI$Y&%DGؿw7`u$ie[~6xo_Oܴ҅n"8@;?9R̚D5n7H;է&羳q}S^?=@ScRS 9Yl?|||`liW~>BTFy#%1Q}Sc"x'^*? v9̌w`mN^r)-ULdۈn#<)?VGGG[lAnNN.,̚ig~b oRR!^'5t4tw;r8e$DԘD|ٝ;wY{u`8HAaڹ#֭AnTP'r UUT v e`:utDDD:iRR#3a t/qcdž= ݰށv1c+6oڤgh?d*B!!_r'OϜ;:ھ^9B[Vbs*(,$4Inn#Ul6n-[mub%0`,if4.]z˓J􈉉ܵ{t3Ç7vzlў?vDZMV U8 T01nxU5 lwjhbpLɦW96g]6;Bqܸ[]O6븻kvv:7nrvrRVRb-87^MS^d2phϮ=SR[ZZ&kj^j:vl*z;4]v>Xvjko_T*XVS`d'Ο7&xI]Sb%O/mni]=i<|@F׬^j11̨h[5N=+-s'mm۶nm~5⑏1q,ټi#???ے>~mmmM{oYocqX//&wuslni9nb<{f᭠ ~Yff1xyeeeG ^UUsgdFٙÈș3h4Zkk3gLMLG;ukۛ$'NۂoИfff?lP"+qm===&&||:;;=YBh [7pҕ>Յ=y{>uv<pʥʧ<b#=>m*"*Dٸ|pOb/=-Jý}:::32>zliaΚ`[X݁A-:Z@geg_ӧ޾s/7/󤷁Gp`~t{lPRPK.sX658pUƆ3ϵ`-'NxQU]O œ 42w;ۉZfɚjGCxlok3iְC?0zslD96'a +**Y+Iz*~T*Ni ZwwMMuHu'"))IY{!!`)SOѣaI/իW>:l䔔U"Fbjaa!xyy9ksמS^'Gvvvrpp$hWF9xEEE޿'>B!;S+))>}B= eQ_` )&,^|ܹļ{]͎w3v}Ii){d JOӥ$((qc|« fL&O0xJHh(K.prr:5 -s˹^Dĉ.۶:9W8xQ#C fg}Տ*!*UPe2]@9Lbޑk%ť9H D Hys޽w;ܬGc-?oe&@Э7ƫi8nbsiYm'kY۬ݸAJJTUU0i*o /WQQ| [n^kNKEG~ZJJK\999V$i)'((,:xsw`ܼ&&.&ƌKJJTWW3wWJz%'+*~ԨQS =[TT0×Nt搅ΝI_C&]praQ[ѨQ#Sc"UTF٣̍`y{p2z];vyl(Q/j+-z37;n =v̘ G賢F Ӧ^<6aa>cZN]}=/ϧ |||u>Z+(0|||m kXzi3=}f T~&:{.xyy jc##;@<)@{{u;IO[|֏7lۚyu]뙗W[[-S566VHgЫi4ڭcUXX~H|L'aǎLFZJJ.. }Z </E^jk @_ƒ+JSkk_68V[[kϾ/GV\>a8?4CMƣ<}n9hUuMdJ8Pswɳ.F= 5$;]i!QT^~A[bf\{Esׅsg܏2 :t/_0z,X4;;#_gMv%|||ee%%b5SaQsWII]U\#2@a;"" (,,Ĥ qkWn@ee 5`0JJʫ`raa_5 XOOi 726e'-iؓv~A j}X})v7.[!̻SL*ưYh4cljjV&SEЏ>}m.^S[v]C>X555 6=6;mengy3wBn`Pp`P0slڌpufyƕXÇOLLj]!Ksٱ }hfd "B>3r !_~˗,^(&&6#Cwyzy|=vNRW#C-@HHȡAdS!II ٳd,beGf9RCZZ T?CGܨT*1\mĽwH$urd2L&(+) 5w)&&pׯ@BB!II NN1G\*7n߾3kوÉh{tM}\T*W?*fRՏ^q}$D$  xgꊉP(Jyy/njj&z&:Kʌ=_Y*11iZ...UӦ K/\d<b ) rpdT4QWmDGs̙JJT{: >>mN1}|w͒5DEW }/ k컺xxxXT'!{ ^g"Bgm`dh@Ϟ2fzu Wjj223@NVvܸ1@rMԼr}?uV-7'O%%$܂=Ͷ}B!B!Џ!D!B!B!ShB!=*=B!G@#B!B!)!B!B!OKp hg!}8ZCߡobg}l臓d}{%q!B!p4B!B!B;B!B!BB!B!BhB!o&&2".A2 nĚㄸhӸ}O&F޼*>fϮ>6elKIɟ,`ׯ9Yd2=:X!`4B!BDY&=p 31))nTUaICzcc|%$3$%%|O>z㘠 {7_D?L16G `"'+z9t npKyÓ5mߞ]nG5=0]xk:;ׯ'kvulb3zS+XOwa6^^=}eK3-|[XXQ g|nn5o {0˭Q(/3bE!kIKK_x>5)Eٳ؋?s,-r2?DMnGX'c+)) uvqc4}=]S^v@#B!K p`ee)( qo5<4tܸi_j|@_fVZ#4qz&N7O]YYK,֚%5]XJjjOOOww\Zz:NgOuJJJkjjrO5t[7?888j kƍ55X\vd]; O1c""7o\+V16>uL5Rg|O}ٲ!;\x];[y9>!~ٓ&߸IYIM ""|pϳ/M"7:2`jko_'g͎@P7npu?w`4B}Ȉ)Ifd/ b^N}{w[ s,-o!-fB.::;>踅\#{qwww`PpKkisLd?zͿ#Se%E aΟރwn<{yy' :jDD6;_@"X\K<ۺFt+ 1>6Ibqs/^~}ܿ{玃͘> f:k˫mmVH$fu2|11ןIH8~EEO!O&--=bpȯ[Z&| +f$""\QYL&+//K/)zc!v?$٣ߌD"͵^)=p`uu378HFfz=]]NNJIiGcbI$K˭ jkk |}8韒Q&/c#( R -gJK[3sWRLjC{c׮zeeǏrpp޳Ub̟7oOBw6$#zШNxĖ5Ys222EE._NWRT||jP9e+W?.>isMm-xzc:zlSS^*?D;w5ҵ U "RWNpg';@a'T5;:_xÐޓDu+<`rֺuttf 1w`?qTVVI:hƏt:=!1g;y<+d))[7EFE{swf3-...&&*..r7""NR7ƦfJ"qXwwz> ~EKb V^kn9ZYuww۬]wN_ؓظrl_q74lCx3ѣ٫}¢¢"b,3ӗKRg͜!$$ q DQUuuKKˠA2 kʕ'n`;2d BBBg|c=]S^Ʀ}^ ?9oOeeF-C9/>451{>L6uCG\P\\ct:}ŪI.".򊊧Oh۳ꔯ_~~D!S(UTT47~fM{??i+WX577?yKM||^T.jUUՍ]:A"Hys/\tvPѻw۶Ip4B^^qqdbj*{ϔ_I[xxGq#GoظkvU>co4EeԘ.R===[3dʈkWBTwykeHaI"gǶDgpUW_kT`Fۺe [kykfm@Pn|0$kO6뤧GV۱&ڭ۹e`eRAAA?_O/oQc._zϗB!(ٶ}GbRrsKZW^]So ""k3󛚚/3\y>FˆwX{*8,]X3AnAYVh[G VN&f,{ݒ@!s,t.TjKk sE@@f̘}ʷS O55q}Ǯ8քj 1G{zy'OM127YYqqWܴ!ӲYkprr**ț[̝m9oĈa6 .>a9<<<܈qkljjjj&cAA!1SUU-%%^;| @BlTZ+nnjK˧䖖yyy<Xxi;W_OD񋈗&'رc`1D_@kk+?(++`0 1bryrR¢woʞBGnimcߛo2uڤ+WB{)&S5vݷniS 3ͨ#G`ow֕s--h Ww^^'^ŧ&usi%FNI8vG< 嘻Mm~`Ԥhuv9 ϋx\^^&m۾##3N...a ȼx21p^^a!!>u:FHLd5kgOҒcW7kGiO?"NZZ9yiO|s7XK7]Nug󯕔srs`ղQEluX1Q/--f?ypcȐg|3_EG4Aܻ*.vMp`f㒑zdשW/_c$#rWGGBB͙Ú`dhPXP $;歖V=]]ѳz*ӧ`Y`ppNNn[[۱'DED+U#Cwq)`0Y+d7_aYo,(~ۯ_(dIc/k>}p!I+dRK i/K> EߩwAXa>|h1Ga/%WG!b"#b"#LMyxx{[[C>t'g.OSݍMM7njjLg _XTM WE[Ӧ^<6aa!ҏ:&jZ#F_yƹs,5eXkkt3߿i>DB\\QQc"#DEٓ >|(3lfǍAǎ2>UÙB-Z̖,Z:Z:`(%%9bp-]}m=N,N8wE 7mu2\u 5_D,",,''֧KIHHykl\܇OsB)iSMݿϒ Gݎ_?z܄iffOß$u;wltܢ:j̞}O?>lPZW/J˿x.Lt鴈x9N]cp2+Ufzzyq!$$x¢GNy$,ВE[0vDxpkTFqu?zAa6o6jŪ͎2LzQ#GOP Hv6l NAACy9!''WII-!;''a4:x"bnn.jnn||}Oe< {\@/Np\V^*\?}ڳ/`$qӧ❔ ΠH$/d>eIiy%}EE?[URRzIIOy1IZ{lELMu N72֝i):^WWwБӦ>yo_ήNif++*jiH.4^l  "  ")ݰqpY}?gfy93ɥo"#=W ݴin۱sȰCdaC(>}ŕY9&捑Q>QUVwo$#l?= d'#%5Ysܡs۱V{HJJCD[m4pCC]Rrr;w4j|SѢo\+O8eåKRpYbdhZ&l|sU'SG׿;EBP $"P(W`WFV-mQTTuݻ1Q⬬?m|;wbq\\ܵיz㒒(<;? 5mٓF]Areog{4"ӧ.]ϿtI&P({v15tuhn\&}|}]\],]qX~-CG= 2f޾'Ϟ5kڴyf/#"ϝ{3g36))iN.\(,,t|CDNNJJ̩W"(ŋzҵࡂΆoQPP`n(fTV]o1Q6l1oVrzԼYV+V3{63oKFjƞKwmc("YS[X琘/\RR,"pX22]t!U~*޺92SN\D=\X?xf6m k^?[i95u^9y1 $":sc.^~rz|ݲs33C1KKÏ+((=gӃ?3f􌙳4 yJcU+WѲŋtt]oזiJW=W9{.AGG&fw4|ܼYj-Yx{]rKDW#瑷ŋmstt}<ztߋ[h|>֬^#${nܸu" }bkgw1Ow]]+V"=aܾsD XryZZISj2*UX{?{Դ+sj^401yyꄝ݉S̶vٷ~joχ5k{7Xfm}ۻkϞP"_~zslA>pI*$&Q#>x{˖ f-7wD$ڝm׶ͧ{W*|>gnDZDKDj|&Y^O[Kt{>` RҖXYh"*((g0m6[Kű/\ܱ}错u={Z|=CHMMՕYOO ,SG8s@ `ŕX(g[}III/ϞٴyH(D$TΛDԼY7:, " Vcbvojkk󕕙7&fg={{6'N=c2HCCCUjw,3oEVyG3o?T$Sn=&6 i{Ovwáy"Q'/>y!H=w H맥=Vr%W2$&ݺ}'&&fxEO;/~'+V S'#k3jSH ,9{B}Sͭ'O}^ L5Zl;QOWʃA ;cd١LSSp8ff濴,b~@9v㝷E&OIǙho.@ES.12iijj; 2nݺ}t p @TBG>(6>!; 4+,,`*>>;]πh%ʖԔ"?BrCSRRء ?]q;oy @BtB Kp/h%0 Pi_fh.?;zHv=ӑ#:;5mڄvؾp~d"ڲi8NjjꫨWOtiEV v52-//obbSz5KE ᅅ?:/T8~mA= c겥Kz""%%E-- ".0nqc8.Ɨkv) ++;9%U,3VGQQQOO]B;? ޭ~_Xs5/ig_qF6oкUcO8y̩9JDСC6bq&/=Ӥy[$&&ܽgA:vݫCW^#z1w ES:$ ..h維DtWcƍ|g3}F@`+͚[vZII6l%.]M4>awl1Qҵ+w^ܥs|ļ<|&uҙ3;PAA =7ؿg7kt >rM.]<۵mKD3i c:::DmllZ1ptr:ugvLۧSN}Zڨ 4$8$0`ݚUT!mڤݡ}{w0 *w ON:fffKZUA^3''A OV /T8蹿ZN]S߿=wt3j5޳wg 9\h1e"3oG>"9d\|fZ2$ѳgaC2ƌu9"jԨKqq1+*r]B­۷MLLtkp˝. Do߾ /,,dy"ûo  zn%u5WMj.6ڷ9~h1n|i QT\8w¹o۳w_?.U/aKLT PTPX@ "fm֐ PTP ߎGDғRN?n]úIIɒ:/@E PAI:tv| ׯg2"S! ƪ%$:/b:?޾e;q@PV-۶iV]w{m@`0? ? "W !υh%0 (݄m5jPWq)}ZAԮUkjtpp\~*;5\M5 _,Yh~cbV\z֎D @mRIIB 0ҦUK@vp8Ӭ̚1[1-_DOƛ7֬},J|<դ#63f=tfGUfVDj]1##C:e ͩ+ܽwAH$##3ody>7lʒU3lN7nPmڰqY~+˳͝ӰA;qc'xŪii#]zt/^?ha[p 6iסM1K:Q5\zK\͟7/>bv̛;{IN3jתձCs/yxxtL ; ^|ٮc9/]P˳ڵj}̢mcS&MjӮc+WJ.L5{YOrK/^x<ނys% k¢"Gy qe;uycIIkstDDUTYxq\_~#;;GFFaaeO[ԭk0a#$e%WBaIIIddkb2QPPAD Uܹ)7lԱtEdOw_kW=|hՊen.NUUTǹ8 @ gO:/չO^L}<lٴv&KN^<^ڏ_UנNTdTIII\Z5k601144yn݁o\vQ~ׯ%"@0l`7?[7+++^C |[PRRraahⅻ7 {!::ڊ6rw9b;7Ν]9'Tnzzz <|0 N(lW^~s`ۧ׍# ?hnfZX,\蘛x "^EDF֩SƌgL !oUXXx VN:QèWu hY[1zLvW\#=iZGGW2B? 06.NRھmͺْG'7jZsQ$v޳g,׬^޳w ".Sa8/3++;'G___6͛5Ǫy7:ufΰ)))6}ft7Ytϒz >lq:v!kW.]teݰn 3ļwάl3f| <9N۶m}]Q/ E.\H,Zlɵ/_8w:k39f LL,{ڸy+x<#CCn=,{-?I{uKOOOgDB.CD\.G$kF^AYwn]9Fs{j!))yY=zHQQ9 NJJa# ʻ>tWTT;{_Yƀlgeg\J7 RE.^733ŋ쁋z ]-ڽ(77w把w׷)((X}<oڤRM}}SSSt|'.(AWf^9q@ ?~Tne 'QAAaNNv˖-^|t[kv]ԯg̤p|X̬G>f*"ܼ%rssU&U^噦iש63,z.amD [jMSCUߓO3aaϛ4nܴIٳfxq4$''PS>x'O ~ڶnjϾ]; ,w5V^-7J/=u=wά!_zb%%%)555lj2yyl9;2tqII xZ99\nj7nݲ0WP47L]㇏N8~>l`b伍+ kI^[Jjj% 0̈())Y:Xa];5lXTT冄 09_kh'+)NzFbtcee傂(LVwLPhwdfM322 $'{=ߪ^ѼY3w̬  *o] ~ׯ;w$944l2",ƍU4+L?vZD$[EVYIf,s3m;M:;.]B2TײE{Diw^^TTaӖ QmSKgv3޿xG~ARK|}Z󙛗jDII1LM{M&"@b"6]B BHpOx-iiiKoZZG}}}8q@|+ӵKgP@D>\߿Ҍ$"~yۄ@E|jdhȺ*,6.NKS ’7FF{jWZ5ýkU:d̸!%''ObMD'۾cH( D$*̀=|X~x<<辣i::222e|Ï8)ի}Xx7XhI}kǿ?p቉I}!"ӷoHQׯ5nԐ,-É2Z4oqúO'V߸y{Yz5j+~ظ+))͛;Cqq1ݸqUV-[;}M lQTԫڵj֭S&'9>pħM*//l3ɉ\nZ5T"əac}ȨڵkadTي]N—.&%%% pirrr6ݫ睻D4fȱcFQgWݘ7giS=_FE{0*< j&˕ *IEļO`|o_pW.߶eӛظ3gѮ={/Zxyyƌ#ѣFDGKs6mZ= {&jқegg EhK/:y"=o$^yrM׫Ub}HOƍǿ۶}'gTTT32?!Bf͙z /wwb.Y67w1Lw%22[ncQx.NU<<t7oPѬ\v ޙ %sC_9{NYY+ZBCٝcfv_ӳGH3˞CF6Ŵk@%}f~TgɈSӳ$kqD{GH#.^___{>:&F$xa-MMv+_|MPZנfrn>#+GU]HѨpإݾǷx>MX(g0,GDZ]كSRS%KJJdddg4 d%/\Gk橩χ\:tĖ]>?,T2Y9]q3q3ġA3 TTEGw^~^tQ#cc^I8ܻ}o"QN6XoױSll||5nbێi[6mܸiKֲMACI̛3;$4q7nWx =zn߱sBBtR|e#xyHNssy 9{"p g^n#G g2޾ouL1IS ~+UUճO36D`jՎ9M9{ :tiii]Lw",Z$]z⥺$?qu{HMԩ]RRRQQ50 ""搡$KJJ ꄄ B"200PAl\l_έ1ut%;w>m [n>uOU_x,໸=fGMV-/;ҫE567vYr֭;fUÇxa=/jm3cˍK;7}DsBӦM_ؠqYs^QÆD4s}[pD,Zi+ @V3grˮ--cc޳/))ܼ<Ӯ]J*+/ |v.pʿ5k$|Doag{IprDd@ ,))y!''']E, BGWG̙TDO^k׬]DzKΜ:QN-7xy(((09FFFϝ#;n;sz:tGvYYٓ׫n/cFXc钧CaOCÞ\LMݾ# ߬xڵ.^p $zzDDd~~{YZJJ%4՗/[z322k6<Qf޺,4~y<͚6ex:ylc= ;Z cA޸~]H`@hP$^멾ޞB7mX/~WV޵sǤ)S_|qyG{N]L4ʪ/ӑ}y|Ūwٛ;zsWGڷoڨQN;x<@о];ׇe7U߾WZ~[7=w:eQ^gNѠAQ*UV^P`in{D0)9cǎ^̔._iӺ5kٲFBbKabb@##C"٣7"""B[%Z4oH]MM]]ՍTUUH,Ȕ7r]{03 55uSmlLxh$q*P9&|ط/%5u}L;mx)v'N:4==߿W*=ZrٿA,KJLb'8A͚~+111삟-:&F-ݳ't]]/_Jv؞0tȢQ#GWR; HWVfiѸY @noO K`1bȑA|e%SÚ7kuCxAD>>LTNG>^DTEVVYY9߈QccL UժѯJ`ߴy랽x]||䩥{$mݾYX;aOBׯ[KDn41"b=G~>^-[41UKIIq¸Glb=MWW'/(n޼~u_}>R?08$#Ξ |WCWw%椈bwEQc 4iHpH`5nO/z./Vn]G:ԙϞyةcJ􊎉9{TF eee9NM}~\ܹ{Рzf`M{}{w^~gtr>u`"21s>{nޭ[F) L>[x͛H ֽ{7҅Sڷ_ul=yBpS\ӻAkլr/)XdG;.W455YA};UfMlKp@%!.o]׹gpށR!&k+1F m/:tT| @cpۆcg h)6SQ)GlڱP}@wtQ)OWI'8ű {[.mں3 0])W`/ @G]@DD{aGKZ5;vVzII4$ZF ϟ9)9,..nٶT0/7/;za223C._%X9j3}/%W;r04黄VQ ]E MɊyyy>}=<_e' w6+=I2\EGء463fxaP2LD?Bnk Q"|o}mƗ6!:}dp[6?ulddt(((xB0//?+擕U>ӬN=I(!V 10 ##C`ޜΎnΫW,# d uuvG554Ο>h[KKKDZ<}V\\ۇs1.N40AIcG۽j޻uewo޽u6i|쩀G.--H]]m^]5iawo2[pƶ>~άm6DRzШCqx?|x礪iY}"7g-^ ''GD***[7;'lUVȰFDg#KZpqd_&//wǶF  b~v%DV @AZPEBDTRDZ ka:Rϧw9̰G]hB&E!Bhp ɴ?7~^}}Wy?lXii)޸EUUSo4pZ}".\TP:UCC^N aᢢ"SR<\Ctӻ{ cB!'fĦ޽wXh߻WOL-Ժ8|}~6'Pϛb-Y3؏)**<2*ZYIqR.$%%ܾ3dV'M6IAA~E,8eFN2'<{0|=î F6kh9Æ@nn ιSoWuud+I7okmiN4)))v z(--v}@#SY?pdz;gSgYMҹy9Τ fsn% /_WTVr8o̥nE]*ǥxV9.:YW4B!B?hq'r?e҄M[s~=oqqx['v$$$cblvEEŻ45!;'Ks($`X, u$U]]`0ׯx!Bxq̔la6}8sBeee]]-_yާ0 et &O%))q{t #?d99/_gmE{e0FͽsQ__XXT^^ҫg,+77qh!oپK>rKgU]nUUUU!dusSҲrsn߹W___TT\QQ{ /^cܾsp7`(MM~ Iɇ,PPP׷NI W|c)/NiEY,6EEB!ڨnа}z_deewlbGmhh}b2\mݾ ϻ|ᬕx+ IDATEށo##\dd xde) ˛Фǥkx "9孩h7O$#SlN[6mdlGgLwvr<{ҝ{ɻVpǠy@MԋB!jV>z|p^⵪ʣ߷mjT6}ܹF7jg;."iRr23Zb;!B?f?473}񴢢>lܼ-.9E-ZHus?>ix-Mϟ?+**pF*z͝ddBLA2s ki]_m o\LLTTDsS'F@iYܷݾWRZugH蘸蘸n:>OxmjldQ-hܦ ƠmZvmr~rݿwş>YؑZlM`7u,R[a)+VضČdoڼ5 @!BL>{ʫ&%%YUUXX__^^^XX4rAAADDUE|,ᣴ^nT*FY!BzOսFnj2X=XAYI $%%4rwQCCCMM6|?s_>tuDEEDDYS}FXx97Qacml0h¤/}?oup|{{~&I+l@"B6̀y 8,<{ʋ  RO##FΟ7JVVV>~_Pegk[SSS^^B>TUW`0laCCChXx+r Baab @f懢byyCOxgOe_|>1q|˦0~avG(+++-?O^^LMM[̱-]eukJKJo޹U;۽c[m]]EE]ZPTTr7_WSSs|..+T*))ߏJibjkW޿;p]wG9lp\nͪꚚ}O>8N_|5##CGK>AAA0$*:K΃ p2p8W]߶yk*㟿8[˒!v_F]˛7Im 롯nlhh~$a!>wRRޒB!EgEsO#4K[@nh!BB?A^G6e ʰ!55H̋&zVp:u2?_yEŶ;cW99ZYZMM6c8k:_2h@AǏC;PUU%)!c־}|qrǒRNoү_z /^^qgΞ7kzBQqx`ghdrJʦ[s`gq ̚9}ƴi斸B!P%.N/_}\[g@HgB!h㰢B:6kq;&,"ǷcpY AL&s G q@B2t5WM5'3ê+>8qT޳k'|>#B!Gk@#B!EOyyܸrpr[ӆz7++ 's323y{CmLӳ{i8j$B!ݹj޽=X,VNNGMƌVVVq6wf/\Գ<{^AANG<ܴey7B!f@#B!ma9a߭L~~>9 UUf^~>J{_^Q~NxyGNN|yZ@ddX]]]cc#-362 6$ŋ*NnB!!Bk#R;LQQ15-𹤄N/@GaaDwGO"2G':],, L&ac6'*:f~;|lШhX~m B,^Ͼz>Gn tuuަ$WVVB! I]]&W9@ dFz{蓮Mx&227A9b:3 k6Mnk!!Kyx)@۾$B!qӋѶP(FF>}]XP>}A#BQPPHn@?WWG&OջOn?5s mmpG!o$i3B!.nDEm!BWRYY9]:Sw$]s kȡLB5h!B@@yE1 B!:.*1++CfXG#B!O@#B"B!ZA%B!B!B_B!B!BB!B?#B!O!B!B!~ F!B!B![4B!B!BJJ T>F!B UTXOn@!Bhe%%qq' 2]Դtr!Bglfqq19:(B!Bm @+3B!B$@v1hB!~Ɨ7|T}F!BGJZ02"uq66uu5;o^ؽs de#7~4v۷.[܌Bו4B!B eTUTBRՓ'l]vo@S!JJ>y.--}. 8qё1O]V;ST[ų7/_$՜+_zճOvP$**r%"rrrCDEEOloݸ.++KD6oܰ~YuvPP09B#謪zʥ7ё&N 77yMWܙSc_>feiAϋ|Sdd@LTyȈב!2 ?p@"2fS'F!B菒x6Nx{sS^')**"// d2ܬ3[6m,))ih4tƵkBvƠcǚZ[YsFafa8z ^-xדPdei;+۹sftXf'jjjɩ&j Ɨyr=zJ^!:Ϊ=sg0_ĉ ]9,Zx|qַnNKK=tɘђUUUΝ;fjZzjjZW ;gx~_B!taaqaa9Wc0o$544RҸii򲫝W --}朹`am=sG6mݎ/?{Llٸl6{ݏkv~~~@R_IS^^^YYI|=rr\޿_?1C쪡‘dγ_>#cӖ-Æ}W9}S޹t~>]ݽbt?VQQ1laG$B :88;w권fSR)6gMos󆆆:3f# nZ#G٩Suk]4%%zzG04VUU ,6XaC ‘vȑz[PPz*-MMc2 444 ʹtMͮ&/ӧ>QO"5vMOO'2tv1CѦO*#-,6JP(l6[ZZjƴi>?~LD/<4BCE?w#gn:]5Qh4ósr닋ssNٿpuu5wJRJ lmݎgee7yO#?bՑQёQѼĤv m5׮og{eQ1ӧN颢"W%5&y«իf7tJYYHNI!>iA"*zױ&"""wَ"""cFC>n󒒒-&*ڥKzzņF{xz<2vYxcDӍ55'O= / yPWWWYU8po7m\ΰC-Gu%.\SpƎ=y݃h!:"aaᚚfUu4O{gr_0(//yųD'[3ILӻw>}RV99xq3gN<{@#iFORr ̚>UKKEIOO('5GDDt1::uꔛ-06tAj Fb0!ⷮ_=uCc ׬^E|:ymZZ323Lfaar=}}V=oR\\Lhd2?.  UUUU_lQTiiiۦ&&&cddd#"0(^tcBw"!!66>sɗV\IFF~:7^PP'l޲=z'$R/Yq={ r223y_:cqq1{@!ᔖL7k{@sgG܎56Nx߯/F+-+,sh.pX~횩S&qO;[uk]߸ٿаҲظo绿 @#߉fKNMmp{ʤ C3ޡ/8{|ɵK\tWO}XtU|o߿gG;!AϞ!:%EŊJrBQՇL]mVwPRZ-X`?_]]=&XOw.]d#nY%%w촱. RSNxy۶i8ԬSaaQaa!w/+> jۊ~dt:r .((H.##chck4׮`mk'++L Y, BKm򒓓#^((ȗr.;.)! [َe҄ b~ϟP\\B#1KAAmm-M<%/'OX,Vc#3##S[[JJJdvZc#իA 3gϙ8yx;{YFV#=Mp!5!^wVU𑔔C/_adjqun8)Vr14t39v<<&? 4юی71q=VZV]!!HIK~7ɅP[[+-ݗƣ]t07v1lPrstZ5hrrr, lmBg65whFfj^=@DD$1) T*uk@~q=DX}j番** %% ?1u.kh4{~এOޭ zzy@zz&wa-] $$D;,  Ɨ-YLbb˗.*EPPb+WihhVj?.qX$... |r3B(6.~r!!={X[Y޽sfϚ;g64yv5Wh4eK56|nNo%,,)2*sIvϞ=)J7]]s /_rhcQt:??VZ绎#F!Ա\<{xf>|iRee|SO+l, @dTLqA?>ş>ǡsg9y6V# FDFMmKBs|(Q4,۱}ხ>~\ȡpݸ~0-1)y){Q!C~7g>f} ,rشqbE65ue4n}9NXxwkޠ`޽1y]\\dZ_qXdmbBٻyㆇB~.=.p-6RvEBBBaq&X@@04,ٵàAC @M˨#, 11¹3EE^ _<}ֈ n!:u7:yYY/@O(ٙ^q#$|yĕDDE^$vY bb۶lVP+**u į_f%qĥ ˝V~}w^Ͼ&z&׬Nŋ]Pbﰔ4.wΞ}7̙53iBBǽN޺}ƞ}c+n=$4{t%E.ݹ3Ba3̚7¥ŋM bddܯO/x 3_ IDATyD**Z:L:e┩AB5INNt v8!+:9.%%oSSF`sX4U0:&.:&αî99IB!*|*9Bpw!B?J}EDbEEEϝL7c֯s15񣠸HkK aaaOcqOoߺΛ֥˭cm Nˣ>~DQQ7 kW.rZJ"9=!pk?BW@KJJ > /)) ߻}=Q jjD~n:n:a~7=X^^NPPiw">NRkǎ()*;M =={7W.">*"|Ɵq,4$P#x[Ns-[2بHJHj],\0nQ&9Ncbvoڎm[88xHK>jڌټ9˖.~?5{ k[;&i;vphH0o.z`F\N̞E_ȡ~A^q831Μkhh1 ,g~f޸],DbR!71hbGbR!B+k{F2?|  b2|nWԌ1DDDv4S_u=`0?}tu"»uX\LdDXȜY3Y,LOGzpX_)**^zF]tӧ;w7 l ty)jj]vn,,L#r45^8{|n\?{{Jk+ v! $r<=6o\5럿HP/**&8Nq'iR+++ZZZddG005Ml1tz4w 3B!M m_RP]]==wݻ]54BV,knU`_"""³B߯kᔔC F*))ݼv9Ç^\Xlk+˥˿kyJa|[/RUU-,,""AL&s G /p=D̞&1gѶ&]^[[;d:,Yvm^@EEys&L .OwFM9@Nn߿u?009C 6DݎЄhnܼ|*hhhş>UWWwZ/'+;܁_z1& }:cfQQ2鎄3w?@EEgUU6u p2F묪 'p/P(yy9RGN22_\^^>.~g-34#37c6߶i=>#B?IFnVUWKJJ1^NWT{W޹ NVܘ?չj޽=X,VNNGMƌ䔔蘘W99?z \r6Vgϟ'6cbLHEDD jj;PQYYYYE;fddişȻ u Lƚ6|˖8XZ0[ruu5j㢢Θ{}9oFfsΝH, GSS Fw`d8*?/? 0Ÿ 2׳gW_duM p8>/ :}7wU ӝ׬=yۑ璛B5M?75sIRRr={ꕞ|W8,3AQQѤ ߯YRR{Mb28oLi~~ӧ2_@vN@@@֚t4asgiivv{wP(BBBYI[wݺs/>#B?BTTIc0 +)?/]0gL1c._;yϐ"£"LG1ely;͝$"";;>y:-=훷_drD2dfΜuڭWed_u.P^^^W`X_$=b&Lsy>yuҹHxJ/#-v7>9j[>} Q^QQVV{w=rv+vZDEE/7/qظx8u<ߕ g|)oS640ۆMMF= =N\lsi4Դ={~. #"2*9-yC!BOaĈMMͮĜϟ?˥8w|jcFϞg_ge4ƔwX,Vii=? Z~#i\RBb3g[D~;w!}Y_b555Dw^vl:cVjjDF}ÿ\%( PS[ <'JS' 0w=tvyyK9>eiA§OU2**Jb\vukOjPSbR ro$?vbaasnTSSj_?è!`K Nq;w%B_ʖ#f.kij7p깉WQQѼ\YlV# X,iïujZ9FL1gXǽNcn%{SN=ʌ9.kdjAĭ&?{A1ÍL,^NN>{ͮ!BuDaa;55`g+##4>z~8]@@`|'壍,] ""B>VP?o7~BQQVVRR.(( beeNS3ILAR[ٵsc߲CFffw.EDDh4fN22U7 d;u"4d;uml$**JR dggwݳ9._˝J̫6W^#/qXǧ84LIYڊOUUuY>@>}h4IJNxu8~~~>>>]]aaax(d)~s)KHMK:}B!o i4bEA8B[KJM4u-8BJqqgϗ-q?̜1m̹|xneh8!*:N|=9!BSWp\j%/cfΜtcmm-q;(( QPVv6xtyy {$8GHHHTD`0?eNtXX1'<`rG1a!OBq*^"""3gL?u,oPEEYlTLu.k8DCޒe+"¢X[=x"!!$8mi p3cc"׬^~æ/իާN=s2*"\IIqp8O#Cȡ#GRR|yFަMy׍>}ذȈcG]tv=zyz!AA>5bMTTTT*??^7bk.&(?$8 ##7Vll|yӆW^OD! mںMWW7.:#G^z:̹|ѹ Wt 466zy:s{A7oS;>^Ͼ&z&)܈]Z!Bb3[SxάYI,㦯ŋM bddܯO/xpӌ ee8),,qmeǏzqd!j'K㽄k@#B!BO9wwB!p B!B!B΀F!B!ܼ<(B!7!B!B!~ IJ'܏ZĆܽ(oJGrsr!kVy%^:ڤB̛3+.2LIQU~\H-{zUtr!!zzN}B!Gp'ھ%{sut\UCUBBbޝ]04u]||| A̜Ҧt)wIɶ[Yf)hrrr CUp?ZWW7y1ևډV ճǜclٹNH;⪩3[h[-{zUtj!(=BZMh'>yOG!BSPVR^rM}}}rGC-͏;Ma0,++QH({0}aCGDFfc͞)%%ɨr;*cMFSgnߐ&=~|)wJ.^hof:&L+--=p?Bk<7~ iƆ555܏6* VVU@TAAAnS*Q_8}0rXi*V !jZHG-| ZH B;Mb0!B!:>qq:9SpgtҹSuu5>#`.ZBFfZbZ@@`󆵳/z>CJJRDDnZϞ ^\RSS\B%͛Df^=MM'ϘSSSYU'OkK! wo0t(oj}{zofIIWDSPȽ&ƫIL;cܦvUH}}(*Xj=-jZHGHBG鼚,W{鼚+tB!?Kp YSS#))47VBBxb &UP/++B4YSS#);ۧc#'O?Y[ds_Z-D^^n-;vl8BZBV^'OیrڍH|Mh?U@ )-+q|*< VPi*Vuު[zBcB*!B!"MQQ:***Ey63l6~ҪgNس'sEEE뚺9W;lrZɵwXM+-Ok*c&wObnr /p'$4~62uD 3qYNxv]XF4BZBB-(=Uc&?[(dB*!B!99yfW ̏ yKU]=fEeĒҝ6qP} oMk7#5e~y3?g Rr!tuyEЃ;At]ju܄vRHU@Nnn'`C×X@Pk7***ΞޭҪ+@@-(=U>Сzz˅@ #B!Hpg|9իf u5mL8~ʤ 'eúA+**=NxILm-M `ܮ IDAT۰eӶsrWX[^*|"uu5f3/`>ou_qpbbҎ]J'9%V:.pƛ51 !.c&i&Mb҅W9^˅46&ȪpSHU@ԝmްVVSFF5,~6r+*l݆-vUHx iRB*&uޤӛ{zZH 7>t螎B!jEgEs^yBnDMNMK'GB!P{fYRFxIP}OW!!xmdld}V;޻Gnn۷8InElٶ=>oxC㺯HBwTS0 ҤbAW{ +b`Ů *)(QH?1\qf,8Z/w}NVqӨ3n-4ٶoݲeF]\]o0~X';3W{ߋrU̴]<_з KNJ}^<3jqSF>yBW~222;wl ߰nxoηȴ޼DMM-ϧ.*y)0 Sjhh rf())^r&"MHLdV|#4l9Gp8lf'>z=3*ssFPUUը}džM7d6Doom[v~c"֭Y,'O1)3+zW,ZPOϴg^}wiq7#PO˝ׯ/JDgϞ۰~OƌPOϸiqq13 4n#ݾyha|RTDX߼sX,x?|бc_G^<%ą)))DgeKKfڶ ڷwdA޽u)//tJaQQ݉჻w$"_o.H=n߸>n옧*d$+*|>ODtu[4**]#GPsskٻoJJJqY /ia-,,'LUjii.[xՀfеkW_?Ɉv:I~-ZT@OOY]57jؐc0,_>7_߯ߒeg̚ EEE))vp_TDWt!"==7o D55jHD6|*׫jki>5tE^^^'&&P(d23?K=RnܼED'N7vYGG"YaCrr2cHzGe+,,_()+ё>UoSL5{3GDD)))Mds8C:qA<H\SPXPG}Qr,xDT𩸨7NW;ls|~llՔiW.^k'#-BhEiiic7n,QPPh׮Afzeת*ˤb lԶ%#~~rs54ŗ o$ ̝3yO >FtZzE+cFܱ㫔d9K('7GNNNW(.)..)8??ˉeee>Љ\fsӏ;;:u8u3g::RR[K+9*il]Hߘa"5&R7fAH̓|]V[ff_褿IWCQQ"3h fTBbRhd}w]\> wzϭVkVܲu}f'EE^%׭[WA^^Y_h$}}}QRĄD6e@ xX_ԯoD?!1Q |#Eu֯[1:}IN( 'q&-&R7fAH̓(Y&R`"IQQ<<=W\1bwMr fQeI/_6n?0֛ ~c7 j.^LMUUKNDZdKclؘE-ouuu- hIvv펝7g&Ү tTTXMܰɆ xJܳ<T[pt:tcMdF[q:9]MQ""*++[j 3 a4h@4U7μLx"qxFm2+CmwrׯGD**uN\~Ý.z8~h=5jdnnַ [_+/=;_&~dddnؐ\RRҫgԴ7o N9tBiiizmg]E?%%}@~|>?%5uDm-윔"Jzr-[(--ND}zN{]"zwoMLLeSTP5j˗+}PTۀ޹kW:t5g^RKq\XKS3=8*ljHCCz ^k׬|9 G5GuutߤQVv8ND|>߸iYYd0Nζj]FFTẗQ%/,ZvsfgU 驣=b(ͮW޴)S\JD>l԰9˗7[ /btutڶeeeey<32rB0&&fs8OƍFp8AfZZ rrrRRRDcF &Np¥K͛f̴dy߭yD4s?ǧNd٫V  :d՚Ddf68',8K-/((o9iёa7())?zqxhLG27 0ϟcF7amˢѿɰy];m_ ނcdf(5-^#HLL?AfC$#YY -c7nfcbbG+od7bf͜>xqkV~*yM1}PO-FШCBFjhZZ; ,XNXOW#-lcս?۶6ٻ_{-4Y]]9_N-[<|̑10z,0(h=Ϟŋ{wxYgӅZqJˡ$`VSߟ8q<~}ccG̺/y?UiY˥>ߍ=+{nWvJD[z=7vD(N<ĩDԴWfMOX,rssej"#GGm@5U<򴲜( x?=kŒTC-.]"Y Ԓ x޹ձC"zbؼyq!Awnn* UU䔲c}HGGysFĺs1܂f_4-6_} XRyyyqMhՊe{UTTkX~9UTQ‚Kh@TW]g4h  -HO@7n,++y  ߏ_&C5?@ ؽn~}lܰÑ*β "{߼yt3uj"wh><'on``bllڭW/%""))@ ܩ#kӦ͝-c弼}{Xo %%emˉSgʼn_ 4r >QPXDD9zd^~~YYYoϘ>3B޼yhɲ7̢ǃeK[ 1?bii(~ȰSǏ^q*9^=6[8SSS{<ۧ(]WPz~}H$##CA^a0 99W3+*{ы"{X"!AW5kp֍W+,**++QJJΝwnbiyyyꔔjjmgV,yvN,ݴi|,]6;y@ nؼW>UΫ邱qHU0%|٭[WeF ]QVVzD8pi$i#O<=bkP(LIItʶ-%Geef}}y^d˲zffD~e+Vܿoi./b\ e] ܩwҵddZh!𳳲 544Ek6n(!!QT?g̗/_*))fqJU&(((\riMDTQ'+*UN9g::]XlIPPPI ~5ԀԩcPP03*?Aii 353T<|h|px0cQQ%%gΐұC==Wőu5,Zhg͛?˗tutZ0x}zS]eEEEƎy%9UrrLl+v+**=C456;tu-,n۾Cr`u ZZ22srsSx\zsN1cF٣{sOvkڴe%_׼MDT{yD6o,; 8`Ƭ9DԲc-FRTP8p:4<<99"RRR:o޼(2wKWsrr?!dqF_XV9m]\miogl*WRR`s焇N8aDdg?k7ׇn))/_5s˗9Y9ccɭ*~^۰ig_Ͷ8ᡧW/gfeY1pނE <9|C_ha"왓.^rs/9~ڵk:`~-'Nw g||ڭX4<$p%w#;`D,6njڴip}{"?xvܝYsveY^w׻ׯ<>y]ƉcG233c=jdFͽ{ѣ2hv===O+~/+Kظ1CfΉ/Y,VϞڴ:vD;PWWoݪ}Of28`oj2F| ׻|zZYN49ϛ76+--(#"U+xEE^(%%pv=9]]J$٥ ށ~޻v2_vv8U.--ݹkk7o۶m+ nJ??>|={PQAQm?5-mZZ999Bի##"ۧwkׯYFDff:ZVV$zBoR>맫-Z^zկ_KKKx!'4UAKvuTTU đӧ>_ 71kW.[W]پ]u5zUU6nX|3gLbU;M6[\\޵K*+"/'_RRRQQ!ڦg׎=versrEf;qA&8{ފ IDAT-[@Dyu7+;{D٠Avhԗe99%"m[9 &=ԙ3)>͜_8}8yb.f%;4EDD,Ybɲ}&Ĥ/^XTVV6jP2+--ݦuk6]VVsF+΃hΝՕss3kf]6ݴ>>+++xmp\P pũׯ?|נrӆ;u$>{-_ԩv[z՞pU4EFFFFF2՘3of]G^C$Sl6{~޾h-KKK_];ظW_vk5֍kGu0 ϣv{W^+CHyyyXx1IIIu^KKWQ"rk3NS%^7jXisƏcFrsۡC{fccq9(f_KKK1Х'NbFl6Ow ee%%6[m#~ _~Ġ(j:у[o޺]\pig9 EN8utjZib͝xRD&ׯMzr՚QQѕ,ƏۺF2$.nD4s5W933S9s!ʹ8> BkgO>c][mwzMT߹öe"f1tтuTT׭3qGpvVRRŒ~-KDW]߲m@ `kw&''*9fsLl,8ߴG1}jqqq@@ 3Sxy=89i/ِRVV>zڜ=xFSrņM_n~8kЬِ!_͒"q,h5u%ogĨG߿gF*?,k+-{]fM޾yL2آfl}yyI222'o;bbcѪ4k&yd†zz={ۿsN_Y?~-ݻS53UPPXxQڵOPt݃h2PL,.w8{JKK]\\-X(%nO^IIw_|GD$''sȰА@ˉJK?4YА줥h1ޏ~NZ(VTE_ZZ{>鎚daeAAv)))D<55^z3|bGllWV~&_o.Dp֮Y8EEԪUiIIn߸bRee/PG^;XMUݕ^r{y碽-YҸQt޳ +3c]vջufQJJJPPΚ9͛Y٢ksw\.w*uQ}fL>yFûu5a_gт파zץiC=E 0+M|"|LLJgXRerJr&rS&[ݹyCIYyћl6RǏ9zlNNص{֭l6RSS,[ޮcg)Ӗ-]%Dݪe^}ԅb͝=Q r?.|,^A>hɲɓ,[vֵGwSѦ/__m\n;mojfZQ?xp߾{wU+WX KŌX,~5[P<P|YPXLD?tH^^^YY|>tu?`U?/ ՇY =~w8PϞ,Z0̬,"п7o%%d_gᇏ/..vpa@~̊% 0o>zz 8Vޣ̸cN~1u|nnniiϓ8Qw]NNVMM^$$<>і.ࡒ5"˖ˋ̟7Q y<KNN޺v];m[b;v8wn66WgZVVvbĈM> j?QnNlQQ#.++yZKy7oHMM-kQ0##jr֌ZZBPWWxO6cԇHMMmú&Me'F9~JJ/^7oH/kmODl)z?S@`ǏUkD7oJL6}ԨOx$SDd8!zPQ^q~EE9Is8Ddn6xQ BPUUEUj7o>~2?| sQlTdDY)))>///'D[NN^ z323}|DSLп=̚|`_Wر}zrsw_fݗ;4ULKvmEfHIZZ?GbRRS&K}ƢŘYYu5ꊂddd;2la2%%qc9vLt9bWBeѕQE(&D!֩j̹Щ]NmڵWnrѩw]M{9valAag zފK]k JI|mn۶uvsaC %kO"&^%'7]6m(̛asF)fq>@FFU˖TLy<ÙG|r`vgw}Х%':u fFs\.J\\~Z$[ˍ(I<<l4h-,TUTY3#"#KJJϛ#*x aBPWGKΉIIDԹS'֮vl5)*:*&&Vtyl6;8o ))&MkժY|yyy&M,sfիӴ^?îhki{* =<4/PLWEMMt75mo\~cQg7o&VZN8l N!^%?b~^eee;uRVVNHLf8~|:l yv3햟_ ZXvڵ|}$iJJJf͙gcq]/_>sVQQ1ڽzFG>|`hs|۝Ν|vܩ%˱eeeݲm'O߻wQ6[lڰ끧+3+kTLKJJ}ˠeۙ&G<`& h~eR("3 5FCȇ+IAA0jX,VϞڴ:vdEr+V^- hs26)))%J9p!|gNG.Ϟ3sV@g.c) h!Ѐ{@s\.Oj u;r(6qlukV3C y8<4o]M#BC8=n]MJKK3ʈHFFfݚa!Aqׯ^p8 zrz*k?ctN! AA'}oT(VT"ii;m͆X<}LE|jjjAAA޽ﹹС7o&"F-[SG~@ nYfmyy}^7%_а  Y>:r⁃^ggKƌy͍wQUY 1_n}rr2%$&𑗗職c^jȜٳN;*cGij%+WvASn>_zٳ*TUU^շXߺ~s̒bՠ࿡5^ssđGkT_(//v&]33QNN}ffWE,?-ٵSZZzqÎ8)5㟯YJNN7n,6jۖf=>6tᢙ߸u2iiir8fMjLllYY37,z*Mͺv{vZՋf1ڶaajՠ4M9KKK34((<4Xc٫V  :d՚xHHO~~~ue;wƺܾzm1m7׻N~du*/'ODZlܨխaܥժUk~^<1?rhkŰGwn~1s vۖE 3W~!KJjՔi(=%bٲWEU۰q݆∏o^ŗ(!1Ѩ}GQd.\\+~!f::&zTTThhNOgVk66l޺ig׎OOv`&wܩlʴO&YNTTT Y~Cvvf}VTT4yZHh(s<׃;{tYQ(/?w}f)f̞U\TL~ttlyyP(|]hhߑUWW webl#3޻cOLgN:m&֭%;v8\RnnnYYYQQQNNN^^>3MDDa [n\VZJ?o܀ӻWTDX~}_  i fn6衧{&cnjr8<=[MU~><,'2SXxI~3ZmԨ'KO#"5UսwxoߺYAAtx9gpNmghݺ+B޾ѥs'Qvۖٳf<~4<$Q#Eqˉ/;;|"n%?G^O"*f1t&ˉCl"VyۺzfcFnPiތf^q%%%Cvmɂ*Qnn^nn=t7l'ёuHQAɐ ;zt7rT'o߽߯/߷w/'gxx>hն3 `g'6[1D=bbuS˗>~_"!!qꌙA#FѾ'$OZZvۖ,ZBDu5kڻ@{eKo\NGozϭGwC{CDS'[M1+**KN'}a^^~'zԴ&$$6me{Q=XZZݴیiS,&&% 17ݶ%_?թSG"2<;I^`PqFffaaazy1U/jn&"tJvV({McbcKJJlЄV/L7`yz/Gߺ}'6IiY(W@mӺ|>?55ǃ}>swikiݳw_YYYaaួ%ZMD'NCG׷7=u=7"z;ΝEyEEEQ@`P~~~=zZ<71)ITHDϞgddjiipͺ yyyy@p此/߾}w`"x{Dq1[XX(,,,TVVW+c"JLLحv:18$X>z@D~qOv75rԋFSϋx4L]]ݽ#|2)VS$#pdDn]Bquz/ "f"z]:ulv] }Dq.n۷oEɗ*8`a$ԑb}\*ڣb<=&w2D߼|ӫgbR#,)77WNNN|)//_\R"^|)yM L5UUg߿ Ѐln Uqfj nFVf٧_YY3GDCVvBAAhk oߩzJJ*dg̘'&X2-\.f֭[m4vgDH\&yKVvRsBBbb˞=z 4DqFjkNb4#z+DjhJ$?SPP(,*fFT\.O"_SZZBwK-ƒWWg~cbcW\{]QQ@(m$'DD>^x]l6{w]\?| Κ1fV3{L7ww"zᲥz]Pظq^_J{Çz HHPUQy@G&խ#vwqúknJNnڭi&73jbjݸu~[N[0n``x4Ɉ]ݛ=}*~/[ά "F Zj| Gb4{@-X ~xHjeV.RVVzr;''wQ<7Ow=vD3eaC_LP^^abbLD>._pjgVDI::w8}28w!uuԱo#>z8؉O\v=hӆusfFv+/  \tɢ%˪H<|Ùi? ˠeۙ&G<TZZ32>n"wX={iur͠EkLwnW0\ 0s҅Sg3DDt <\׮z!!̊ٙǻCyxHАaÓSEEEr yy=8j֭8ӻWƍEΟ73GDD7x**u>XVZoZRRjЬ(tp! VirjqW,#7o,]̢͛O,[ Ufr sw# [Z>2R4T+&-/--mo]. 5 h!m@7k}~ёa&ѩGF<={T֭Eŷn\37,9~}HFRFmۜ:qӎ]{ BQj^S&{Ӟ%%%G)JKq3 A ?R ukV_~}}jjjIII'O$ Nvё٥ ށ~޻v2U :u4[~3 RUQݻWtekVw˭LT+Q&o1DDtȰׯ֯Wd IDAToi>|`VTի~0l^ZZ fXKDj {: l2fݻv*V@gg$&& 17c&Қued?bfN/>y~]U4h^ϛ3^=]ׯ,p ƙv4446mX"jۦ  OlG9n@?|5kN;ܸz%4(MEyyo޲mɢ~>o\xSgD4h`G~>]zmAAs0|6dF#G |,7~{" x ?R h"0iQΆヌ'M> E6Q].YB|;t1l]ʃD,kI/uut&ƞbiժDyMw䉇EUT;r(6*2,8pRRqt@?˖~YP%y9Kx=2يY5zHnϞz=7v `iI jjj8ZMz?RPPhܸ˝[\thNӻש+3#*"lH/]|di#aXׯ^8ĸ6_z'bݾqE CfWeddZoRRRL@ SOWyǸ?Q#G0UݞXQ#Gލ ݶVZiS=>}򄪊(ho'9)AHDg{QRR:pOE9la6g98zaK ,'NԬ+ik[TTlԡӀAf 1mD-Xc_tcA37x@ d`IIѸ [:}ƒŋڷ3bU&+kݺ%˚l= ֶ0F4hl P#nj@AA9Xtٚի\lXիVXuzd'ڴ0pqNSBFk6▁Wcx<c"1|؋XɲTQQWvqqO۶0{k7Vy{& 544V^ӲM>6o>s4"֭Y,'O1)3+zITƯPDwЀJKK]\\-:O^IIw_|GD$''sȰА@ˉJKD222֬ ~Ըc|uFM|a%٣2v3vLu,KV N{[l#Bϛb$kBDSSSիGU!EEū׮G%'Urnp=b0nq1Η.6iبwaQ\m]-"Gb"$FTP;vذG "6Ԙ(IĖX+PtPC-q]%!Hwa.s{ϜsoK [cI迁;RQ?׷oB\LϳFFgiZzFZZ1}=fĭGl }=#%)qur\(?!"^^UUUPPp;2̔RRijbAD)wИ3kMlllz޺y#U"})ɿ9 jc²3#]~ީӖmUUUwϞ;?]1Yw%H$344$Æ8y2==r-hтya Ǐ+\^?w_{ ssMM &E6#G[udL&ɉJ_~TUUnټlʒVUU19نIaL~mNN;Tw9jczl7DtCwuC?wn+))ջO}~oFp8^_~eİӧ4~y;ؚ"Ie\.d2ƍ|;ih]S'~|GDOWVV*PñPwy3]oTrHe3=/]vͪgC:`bڶmpI ۻk;YuaˮWajJ unLM320wSRvҭk״E <8'=e>>̛|q̛3}?+jiiX[[D"ggSV2#5k7;;[,+<{\.wMzEE[V^RG۳;vXtL̫G9Q]]q0M(7͎D ܱgc{~F%Ţv:F)NiY7"%%ZZZ1=vԴT{-[u萐X蹨mvLiID64}ŢbM|-~htϙ8 ڼ1i֪?H$46.c}>&H@|xO-]ssPuԺϊ۶mOjdd[;vh>>6ӧfx~W7===fL˦ue7--}=#]\*@nͦ>H$ҤK|իyh֬;KKK}fpsuiӦͩQDv<ˆW54 |f@&flLDZ˛1}?[/J%R I$RvF3{ֈaM8=6_qAC wy"J%D$UxQ-(|qyQaq𯐕ϯ2LKӆg \}ȯz""0}F h‡f2>&/ւK&:r[r5r|enV7oѥ˳gz&޹#͝Ɵ?aܹiiffii_2xJF5kl6zHT"Jy<ˈcFz)+444*9@Gǔ{mیrw;yt\{ņ͛7OKKb6QWW߷gǏ_N]]RفCOfTTTbn0!'1 /++;>!{TTzxpkkGYX4-F[#y<6,'l E z:óE>.%q8˗QFFꭖ:-sss[<0?fjߕ\rt1ДG~3^Æ/֯gf ;Bchh*}.?OKawZb]=vL9LM響vK)\>f,6N|!_4~B`ݣA|ίĘϾZl1i⁠_z~YYYR?ekch"b ::鞳$ Ql r55uB< ]eڥ/BUNo즤{D"}?-fAzzRk>|9zAEEAvݧN1sƯG?D6mۮNT.ki+W)vyDT8?T(5Q.Rl贴{WG"r\r[j5ep/ɔJBBCCBCφ9 }31={Xt ]]Դ5߭#7mp88D$#_Eds|8D\.}ڴikbj_XEҡ}vvNrqyW]hUZZi\UR4//߲EIii\|bzRBs,uvtۊ<~}f *.t]^1*-PIENDB`KDAB-hotspot-41e5de7/screenshots/flamegraph.png000066400000000000000000014522671515036260400215300ustar00rootroot00000000000000PNG  IHDR 7gh pHYs+?iTXtwindowTitleUTF-8windowTitleperf.data - Hotspot — hotspotj IDATx^i}'ﭪ[JkhG f؀۱ęn}̛y9jfL>'KO{tvL`l02fhAwJUnP]"΁ܧ}'/Ѵ}ǮZ5׻qÆ_T}- ෝ0>:PG@a|#uyGjFGG/FUg}MQ/)J9zH~jZ*Jjj3e.QyKZ-;~<]]5kV}sPdԩioooJ˕4555b۪jMTJsKKp.VIZMKKKZj fH448-[6Zd٩jihhvNSO=kիV VVחm[e۫300;tɒ\r%p6mڔ{fٲeYxq}j5V)oyAVKRH6:788_z)YbEuww>J%]2m,^X 4a|T\Ν;SO?rL29g`` O>Tٳ'vN|>O= L81 9|pVX_`ȯ{,|+_ eÆ 9s4.XwI2b޽{ /dٹ+pիmtttRdϞ=яO~,Y$?~T* %MMgT*Nk;o|(ϥXsxonRszݩjٻwo<Z={Ms?O7r?p'Nd˖-9qD}ӇdXlܴrM^Co~W*J9[\.7FGGw5:;|dڵk3wλ={Vyj:t(W+Y>֭[vݻ2QV˱lܸ1r%ٷwo_R?I 8p0==DzpѢvlٲ\r%Ypa}\Tʺu//yj'Nȃ<s#Gwޕ}{M>Q^;Ӄk֬,ֿʕ+nݺ-_V_6nlܸ)'۶mo X:t(Ǐ!;wHcccj}sƛO:'+T*X,)r9))ikkKS[?r=9RX,-Mj˕T*477!r9V*immM[[[FGK9֓bɓ'gtt4R)Min.L*JS*T, \.P(9) j/ᑌdpp0B!inn>mƳ\WT3<< 5Z=^~9r9CCC)) i*S<ʯ}߳|sҒnT*9t`6mژE!b1u|.j)JJV;Uc }ZFGF2<<|jL[[ƼzVJTJVK9-)_ZkZZS2:ުNwNgLAo|ݝK[.I-س,X0?<ηo7|qjO:wg֭rw+#I'sK?]GO{I#68Z#Gŗ^yeٶm[m۞81 ,̂k\Çcر#C[*J؟5k֤)s͊U۳}gB,X0?&NLC۷/ʾ}ןƆL>=-JwwwRTr<3yg288_x!===ihh̬Y3se9eJ%Ǐe׮ٱcؘY3gdѢE={v:::w߾<ټys:::裏----Y`A-ZRÇgϞ=ٹsgO)ӦenNWW{V;wΝ;r mmm={v.ZYf0p6oْGU<f͚$Ʉ\tᅙ>}ӟ BJrvؑ;vd}T*… 2o޼L8qܘZ޽;;ẃRVՙgnwwMBp>V'dzkܱ3V+vy;o^~N2o>qb Z5ԧ;Ȍ3N-Jپ?3> )67ghh(j5]wm̜93I244z*?C/}1OZɓ''d@OwޔJlٲ5GIkkk7 W9|8gyАI'Z`a?Z?;w-b1g׾k:yu{rT*WgM.4]v;$sEZפV=Z-CCC8qbn\w4iRڵyx dtt4446dɹ3ܵ+w}w֭[zT*N[{[xg?gI{{{ZZZR*2<̚5K/ѣGs}?GIZfdd$Z-5o}+B!ǏO?;v-\y8?bsFGGsĉ힛|˹S,z< |x:!m; gd߾W={f@ >oE3U)J/=l3{tuu}`?r/^5k_r.]2/Yoϥ p^x:t07ӹ) ټyKV^~PG)j9tP~xSO+_)S&g׮/~իa_ 'cɥ̊/ΤI2mڴKyg5ҕ[АiӦG?QfϞ|\|yʕr^ٴ9ڵ m 473w,_,^ta&Oc=_=5kˊKV-]ta~ח>,Y8B!SLysN4izKj5oJ2vzfErT*eMyx͚|{O|3Ʉ O|"'Oߧ+?ʄ ijjʌ3ߟ_=<ēӟ9SNPߗ#Gfn)}zϣsֶ֬deM[>̝37?̒%K_j5t8vXx,Z(7?ޗ~:k֮ߟ%K䂥Kg}6wyg&M/q{.455eΝY#dxx8mT*eƍ2qm;wnJr:}{n68p@Yzz2sZzc?{<2+K,IlX,5O?LFGK(^+R=Syg t/Z-[ 9Ɔ48',ƛ2s֬<ҒyݩV+fmyx_T*47s 7n;u}ҥ6mZ?<3>dtt4lޜ'x2+V\?o /]43gygs~* .<5dzWsK_¸~L<%Hcccf̘~&? &䳟LSmK/Ii#^7gΜٟY?V6mZ^y;ݻw.ܹsSTfڌdɒg\9Ƶϧ)IR._Zfye׿>e˖e^\e֬YYxqFGKi*1aB.L2Ը}g޽2er\uV^ԿH6mڔ'x2]xa[ʌjK֖sO~|L0!_|qOPixO5j5ӧȷLu#ٲek6lp*Сg׮]ٷo߸ &deoxc„,^8ۈZ'6lkƽА9g窫JY AoXlԩSSղy+ٰaCzzRwg„ Ylٸ ~tvv暫@nݚX_re֭[;n`Xoo~塇ʅ.?;‹Ow}_ tyۿlڸ)_ >g4~ cbZZZ2k֬4)JJlټ9J%ዙ;{\=WZ$λwjo@_WPH[{{f̘Qߔyٹsg:$޽{^xؽ;qcrxoFKښL鿎h)==RV3y̚5KZ[[3g3GFFrȑ'Ǐgxx(==rjTg~sjg箝㮷4dY4iҸgё뮽6;"~Ѭ߰!?]֖45qlݺ-{;=ɓ'gUWe yDz}\{'rg:uuӺ?n|'v{n9{fJ\ѣGsСwT]z;Z[[X덍MiooOVK\NFGshOFGG3y̜9nX@~oo}eeK~??.4gδiR?ll3߸̙3'b1CC9vXp? ~2I+,Z(]uMBSK.ɯUۛÇgM>H?3de+󺾾ʦ\Ҵkz,XGS222TՔر#];𥴷O:w$#{P(X,ySSSS&tLHZH344 7;zͼy2a„qך1گRddd$ipyg|`pp0ֽVؘ455\.رwbJ6?0ٳ'şIKKK/YMIƂ룣,j%#' c IDATtLhOR`}555e7_̆s?͕W^k6K/wy]{SSL0!8뵟@֬}$w}w}ӻ6u~m7AcccZ[/QZ=m?8U* V{̝;7"?Ç?###ٶu[6J.̧FjZ4qbJFGKժRRSV0Z4ZJCأBbS1SNm}>+V7椦7qBƱ4vxZB槫T*ٲeK/u]+"3ḡ 9zhλs{5g!ӻ:su׍>eʔL:ލroNZ{dd&FXKfٹsg<ηo7G%p`ٓ.ώWwd9zH2k\lYvܕu^Hc;/KV|K陸??)ꫳuݷ/'O΍7Vehh8ǏԩSǵ )67jkiiIgWWٓƆ\tYwkb1'MJVK|Ëwĉ~C<+Nһ]]ٽkW80|9|pZՕ!No=}3mmmYꪬZuU}9X̔)SؘǏĉ8q\?p ՙŋ'>\jC_ȤIlުkZ BL+.Z-SO>Y`a6mژĺo{.*?%_] p B?׬IL<%IrKWfkA &/yeӦMM{{{ BJRedd$]xaZ[[Ow7{_lݚ'sM7%IMUɃ?0ӦMͤIRrȑQiiB C # _lNƎ}ߟ;geeiȑr{ ٩ޞ^M阶0 C>Oklv+7/W6mƍק_㔙-Nkz5sSpݪ\蠣CbhWggSO>:\Z22bf}DBjÆڻIv]===l*IV9\3fԓO<>/ϗ윉bZfy9͙=|tpHRZj)SOTJPHPHG>Oq_ӦѨJRz-bl;I UYiNGfi B (ۗ-iJ Fu\PDLT$Q__v~v9Gib C~ON31Rv>T*Bl6|>1#mͼL+k``@vC995LOxBٗs;D"~ |zMqND爤e>V=ڳI͝3[x\>Iߟswz;p6_\jkkSEyE ޮop8v|lۺuw~Uf.-W7MS-iĈZC!5ݛL %.K}}9(4+N&OZ_.<ŶZ|jjŐά:,~)w?X,egvVrrr2O0 y<y<*IgwΏ"0r ̟bsjϑfwfS~~~fenqj[,y9L0p:UTTY}Rg3Owlx<͜1CahK4}ėTSSY|ZG#F|p!IdΖU+UTT,ͦX,v\;߯bٽK7~q+p<ϟY3gpbd6.)`5qdYVuwwr~l699*..V:VwOƎƌ3JdXr,Qv]5#j4w|lVE V\~婼LVMvЄ 5{\> r\*))Qnn^f%p0//GVU9*,,ʬ\D\ټ,M6]C+W,WoW%ŲcUVVfϝ3g,Y, #骫Rp ꪪjEddbf.R:;;u**˛UUoh`۶n]_YK-$ժRfVeϒY0>0>0>0>,7gf8rsd/qt@ @ @ wׯݧ\[6$IHa<f;2;J' tvye<18i&)nffXpyuZnۮ*oM(uIJ+вQO?ګn?1[>k>z̤:٧i;;GEy8K Vpii] Z3X$Hܔ+#z瑎k?!OC֝Z[%c'([֓xHȴ:v& % 9]t2H8))KCX`T͞P&gFs#C^/[/ony\.?Rɸ"L[$s3X(H"-gOt?|Vqꓷ^^ a|'1I|?2ά$bZBmo'V~}dYe*ߩ]Wkoj‰L^IZgzFoo9p\iYd;nBu|U/lHlkHh}dA8~*?ݪO}EN|"Myo֗2[~VjU-ceO2#u7ӞqBsJ-d^_=9Ez;̸ny]iE'ߩ?U*mz^_O^ۦ?O!p>mZZ~҅}.3-g>/c]gTcI9c9朱rdꪊiZsy홍[WwpTjrZl̖÷bh*>ٶK9ڷ9bSvUt_ 96 uNuU[Y*Ӑs$b2Od:{q%9yip ߁H! Ȗ7Lr c&c ݫ`Trx稠P~mutRVw\ݨE 9Rt)ۭ19n ;귯Q(Rڙcd0OtX_Jvh]7$'OeEr٥M;[\|`ߒ SR|kP]]*0d)'H%ٲeH3`w: 3K|;CAJkJ_"i<^luʚyVRzs^n#[cZԱrj$RgwXRed9_ShH=]] .@9r QD> ^ ǐ%]j (LYC:P"\UW^EU3gWOiGfs iJK5qzhU"I".Ѫk4HNIfGZeUV'!Ɍ] U)ӡΞJY娠HyLAuvv_Ѵ\ٹ*(S"tt<ޞn+ +e+??_,Lk!%~ +g0Ýj:l2iש3W% @\IłRoOHJ,rUʌ IDAT~r[Rai`::{Nʗe9Nw.o.+PB{~K(Կ^}0}:>}g^һ[*҉yZp閅3T<9%f-=@oD)Ӕ4B![{%1Xrk[sor=G{Jƥ;mtDuJ:痨%m&C t zޯJҧ'gːGS#>&[F͝D[|x~Qy6R.ߩ-ӥ19rzZ/<ʹKfb@-ճϼw7W8mHɘbI|cSwjo5_c&4:p[*~mꏹ5*JJkoֽը/}G~M30kպ7_3/-EJM6Ԣŋu>F|`~W5:fTMo=ӗ~C\z$V{_ϿPYN甽f?U{UCKdl5}9#Z mӢ9 z-L{i~ Wiq I |ZRURUj}SgFrTkgFۯUK^ГϾur{\rU=a&f*!NCz%Z]IMJ M7\[7-Y9SZ=2 o_S]oP'5ih*دo_xS"r LFN׍ޢG: }M7ҭw_Z+M)znOU2bWK&~d,єLAz3o롟< ;nԖw_ԫ?OMz,;Ozs䫦fJO?OhOr}3o?yHc}g4fXH^} &ikҬ}*^U,UgӢ۵VMOLO^^⡀suK~s]Y5f]U5ѧo٥>UݪwL 4?_ْԏߥY rajڤU?}0%TN/<-.Η-VS dua7̶qW= AsIؠ:ϙEJ4ص%%sm:֧o>]UtNPyMCK/$ǟ㇩kM˵|oBwz7mڴyZ1E{Zt[5͠voߥCe'FUcsdcە]iMy34}DV= ›%#V ڛ*?TT}}2JJJЀz/~NU(դeWoG+/nm| Ց;Y}~jJ thZq*=z ɌjO_Vg-Fg wkφz煇t'~&5i\yBKvn杽W\0Jwi[kՑ;a.4vTU;I#Ur $4Z#_-8WwN G}jP7n/^{Y?]zoxM1S&5<Ā־ud~V8f+U௿ouqBK֫-)}OՏɣ+> M4ZW}x+=uiՏJmXDlְ}U_UI2GKcRᴺ vyooŷhd z:h$#ܰk5gp=axe,!Ɍhj xε{ vnϽ@tgFi5d677ֻ4yuX"ZriURY;?a/׶~*H@vkSZ_@[uG.ע@J6/[^#KWijj~yvvjlEllتxN*?ՆG$iֿ_Uj/]?~UアV} oT!n՛KioZw?fBsǗO 9yZ;+kAY5,RpFr>=E6u_Uisdlثm50@نؤw3fzEoTKh )ծ5k(m-)5r c&tpO8l1}wݻ^K9ͯ˓!)JoR?zSWϩ?҉DBhRild&\_WkkԑVt&ϩzԹs~__׷s`3 쓧^S:b$'iCJsddn?[f-}1?63N-{{<21dM P|>6H_,NД.]ɔۯM;՛gK!L3fMҰENW,7л(|ֆ*7[ޣ㾀 LSǢoZiBZpNi>L)дB+ ՌqA|I2.U1!4U[4r\rՑdFuiq6f)cV% iRK_&Ёt/-3[v񹲺 4Vڣ5;:K2MڰW2UW -~ $lנMIKRB-MڻSc>X+jQsȃ3lݮ-U1q KaUvif̘a-[GXZE3fƌcvj۰F;9fWmڱ/4^ڦ-!YhH_8aPR]O>u^׆c%fH-igsL#ga9Gnu娮QUEvnܩh|'duezl;ė$Ö_SjۭY+͙.q2d9?4(+C,_MtRSW\} z+CgRwS@ɈSLh|3l*ҬO&-YgYl1O%^]ǐܨ=1>%1 >Fj1Ec̴ER=+?I-I<%e*z%C9ctuh_փ^|bnenj2y9g_htM@S䨿y6S:][^WZݿziբb:p@mU1*t]-Qզ^<ТCAꮨP'Cz+BG:+#/z@vGQ7TlJKZ2ՏUt债2,"~ohnEf3AiEi禾0lywdi8-^ѽj#k: 1l Vqt NM$J$2<^e[Opo]NC8 4_&ꉇkODx~^l \<ꚅuʷ=gܦQ}*ލTZPXTLmMr9nm̱>f<5mڽsuW}AϚԮql߿W}%?D. 櫾qx:͛ϟ!!I|êT[Qe+jcz;7Qg)%q%S6yp ?F:R$cQ0͔ G?WŕƖ?BsS:a3|6Y^l)RAa[~:Cg4#Zǧ%Ð!S͟|OfeV+ݥHc1*;]}(G6nXTf O֢y v%cAyFO|OX]YdZT`(45RټBkvo~Rk)eH2;jRMZ5t(n͎_H6 UT5Z'{LM+7UP"L[ּ;5hT܇ 9eI{['O+pl :/PIVH-- ?tTٛPYe^)٣;nZ2Ud|>m˛ba4hJEZk_=T\>)~HPZ[F7;[VBuYY%^ ` ! <tR]Ji+IW^;3 {Xr*4z0zj}p3֭+׫{`M%!rS M9e5*ɲ4M 2*uk% *>HnX[3]SL^]Ӥ`|7 tZ'jvCuZb,#4bX$Y4l Kjw]u#+s 9fW^0UWyպuv'T;s96ȯ5ojCPnDO{ς]ŕ5"_ҒA|?er=v4j̈2jByfiڄzdg,54mVʃAEsV)Kj۳IRGvl>Y_ti*_?{]O=j8YeI*ݮ _MSUX3f?ݩ[ 5:Ue35czhV5Q_w^WU*|њ=0%Vj ʖj3Z8qr2|Y7bnnv5SP' e!κCw-,{Dz :}vMiPiz7m]t?OLkvYe*2)4|l 櫮^Ů.fhʌz=eU*+E䩢JU &5W&* Fh҄! 2[3_n,W7)mIoc9Kv}YVILg9~UY9oQ1.s.qV(k!kR %.Ф_f^+oRϑ9,eM l$3cؽyvbeoNy跊MC!/|^ͯ|M .96s7w` a,=nO4E&dqe)9r:W$Qu,3)%b :uC}S.ˋre@LG yHR6TZZlS CkkGPV,VL%!Zu- erXrY L5ףH8UPQV)W$eӓ%mDDLG~^' %L9=c60Eܯ}7OeMlп}_|SldECT[{1S" +/BKB$eq?J"Dr;C>v1v^EMrTV+)f:P0*#W 4Mʰ9vd?3TJ( )v@e嫬Tt2H8lr{r؆>"фLSY^'/矩T"H8*9r'ڔ3wܽN'E#+UUU92ȫYtƼ^̞Y WJH IDAT#8'T6o,>ѣ_`KzKj?7(R}6޺FW8ir" ޗyM,>+*?5k2g>}alUUaߐ'D%vY2+aFf.M>3zo 5{bGwю;3OiΜ#ݔ"}=V@XxRaSAIsY>z~{ŧܹs2/[WPwwOfYVcCCf1Α_z9ey?^fYJspd(U.9^ 2q. >KfW:d @[f.Mh$;L%N33:=CbXf>b,Df$vSiҩ*b2r2q "Exf>"~"q+潽.93 +*ca 8bƿLƿLs2.KC]?nѩX,+潽YgeYnfά+YKa˄}!Vkf>blV>-gJzo/u6sdlW}YQw{aJ) bƒĒoo_zL11רIXE; s~eQ>ٽw眙}#"""""""""""""""m+ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDNa| ㋈$P_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""" I0HEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDxf!PYQAccxsx;v`Y{sND}ضMII)6m1_^HDDDDDDDDDDDDDDDDDDDDDDSgbTUVQS[C DFFFNrR BDE54w9%x<IIInlۦH46rzHIIa! @,fcI̬,RSFu-_exHJJ"//۶)+;H("+/4˅ '&"'">\.hTK"#C ';@2'IR_i$MDDDDDDDDDDDDDDDDDDD$y^,E$N$0b(pvڑjZOTb Xj]A,#;+Դ4ܪkiˌ1Pc#(.ލ1˲('`Yqٷ?TΪg²,qhlh$??V4VȌŨL|D#0[RBcc# }I`TFJjj."""""""""""""""""""""_(J!qp!-5p`4cYeԐ/˅"##ŸnRSSq\9n7鉛E#JNN_v%%%hll$33p_}MڊCzIIIh,mȡW(@NMֲ,\Ku-_ Cs_P_ڀ\.,Bct/\.{3-:9q8O7ȥMR(@Ne9_յ|qcB1"mqOΡK'}5 """""""""""""""""""""_d ㋈$P_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$""""""""""""""""""""""""""""""" I0HEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD(/"""""""""""""""""""""""""""""" """""E'{11W+-_a| DDDDDDDDDDDDDDDDDDDDDDDDQ_DDDDDpC_BJ`WTB`DZ|>\Ao.i86S'p*61lLĕwbZ iZpY{Ls;ԙRnM<D=eu+I??;qXgNn~v5a }= ѕk!:j7B/L%j_wNj')g~AiJx}ᅪ>yhC- DjTg֗jyɩ,^NXMc18YwW)<ؑFjjɈRؾT%Bk7$n@&ixrɸ¦0eg01ϳql*wo`k]!+**ŕYH^?}ϱ|l o]ͶJ5 @j/wҘҕas>щ+>xʵqL81ǁXXF^y m|Zy?'[lj*Xͯۄy;'x.V0|>?i9%8JK(޽]%e4nٴ/DlrrsHnʄA&dg_9~5MwqjI23hY_葐v $LRr YYcv)E=Mj-PV]%Ӌxݭ1 4> i=Nu36KP?/nL}P[QkrOJ!-542SI{> >u`C?/+ژ޺G&Wq8FvM%@<zڔ8xww <,DN7ygO-Boϡamχ';؁#`y3ӉWVclEې8U8xŔU}gvHhDY}ba:_wyl,3Z~iWqVBIәz66 5d])&leѾyd9sV=Kҟ>e`a8_v6~2>'L4Jy{=Dc4>*jMCֳjgqlE6>'A[aQ"- b4>:j +LEDDDDDDDDDDDDDDDDDDDDD>E#9"V/ Y/FRZ >C4@m]_/s?qmJxLĭ'$pT]ȀS,0($S/}>MC@bD*`I&bTF y%#Oc~̜Q|w3{{L=f<=Qd}ښX'?:WFAv6s#Ŏ4aS?I&a+yeqOrR !xtF51#ӣ g"?Nu 3O.B|gvwlGX re7WtuܷxPc;q .n ӆ1m2x'QٕyW?o =jnXHJr?5ڷ:!MX.<Ď~5&lm]9$i*I>!Z 0IRF#IT<,ᢍmKycH9{$O@xL$J?}^A=07h=e1?iIx]hM;?FrOpJ34lz_yo~ؙ]Z0:lZάiӘ>gdU=}.{Ơ6X+[3O*1DfƝx,O[S'Hhrew{3_t,Eඟ|Glh"ϣLOuQbk6χG yx"^zi;Ȼqǝ{2OW& =/u(Y*/.AWճ9V֥&`&^p]-'X}l*Z+Z͊re I/4| .^AtIx&v&J7|08 o"2)K'U??#{ȍ;8Kʱjܤ.6mz7ׅ7f"]Ŭ\ :3++`=ȶټc*;.t33"3v,btu1;XxUGF^g ɠNi5.ˢtK!%=cxß2Mh&-\II/Q \DZ|>&G Wb@x~3!v/~o$&ޓrJv4֋~Wضx.ENv+1q\xiǺuUڞs 푒,߼"5qsu1b9c 'ĉc~Ë00iocbGjݭ+TTzU` Ǎ.ebݸwN6Fpr0bE-Z⬫Y;I5)Sz=f\/a\ޓ&.R3܉wd̵5ݲ ^_Ix$:gCurM&sp{' 1 zA.Ww/N=:xIg:=ȡ_?{ꘟ$P5cwu?7h},3k YMyv#Uuxr0/1qO}anTVrUwƐr(kSc9/=-B7d9XՋ//Ca{̴kv憛Z 5+GqC-YET &lμBzav,|?<<CRJ ~(SIC&^]y/n[Gڽ+b7q;?DꩍzIh 7~_Dw&sx}Om[y \<wBrfY ^s Gsߵ"2k.ݱ-nO^ØGG9AS[4~7-CZ3zăMͶiOk/1x@&tnz0vPc-+^yș/ϣ[`ͫwNh >gemֿ17 Ń W?~?6fL,F8dxٷ\GdAqa"`G&<:$mgbөQ4g6K6Nq9tM9򦐝٢TȢ Xz3%!xIq0Z A m6+Aq;~7ߤ$|> OQΡ}_FEsY] H;N^;&nx,}]Z^216d<ފzbMRV!gϤqKXtf[KimW NG2i8Nxvh(™oފpu9L\zeٟ{NL(|qb<cl{fptn OD,ĩn{Jv ڳCU|L6MϿ4Θ|W_8l7CŦx٬YNxI SpX av୹(Nʦsܞ?9坸s z0*־/y ٧0иo30nx4[ Vg0}p<ɴ}&/]R<ƟbE`_R?~ ױ2MC\xť m?AV̜E(h nH* [1{z.gs>y~w*3veuR%Nu-Mb|:+?ܷǕBaLRZEٸ }1lZ5nĭ`4&@zJ潕7e$w$t֮cG>F4䅹[pPs ֲ~_#wRzpe՜9Jw3q/{ktMũɒY}7FdY,?ClܑHѦ]TG~;r/mNtK'VeocUGn0 ^wv"993tutĸ=#jN}9{-_xL}{ˎfi|i~#.D7|x'VƧ_Tui |p,)(:A<{ybnbt:t. *c ,7ŷ_]{>',MuƉ,;@“ Uٺ Tj.b)mCx.oWJ:fTb̟OڈՋj3TL׳jC)0l ҩc64hzVAw!p2BnZƻ6Qbwծ=9I.e}l7naR ֜{VX X迯a"廷S#xw!˰>|G`/a{g? C)pSmZ;swqf桢 q`*'Z:>Cm&]E˶&w!@ԛ]|yHnuD(Y5<)K^261kj/]͗tm>"z='e4f^+m;IÓ,CMl^=pPSQ%ofƦ"zT7VŎXb[*ˏAv}[2x~')[ǍC7E`y0uxgѓV#0<>Losh,enorю@$>uWqc;LfX+k5~&#knl+Z76.~x2M}NAJ7asX)ݳqc̘VDֈ[ >Nxw0w;'=3Z 5P.MC7386pXȊˍ?juq'.|圎}ruOp{lswmw;紜#~VwOj>=%+o䱍xcsУCs&w:Fg{- 7y5\K~epEW`9~"9q"fjvbn"\txoUdo?/xgOgj:4Ov4n_'ى3{ϯb-wdx;J]| v>SR.0Oy[h09Rﳿ]Wk)v:pըAt96Ӟ`ӵc 6.I*o09X}rʍصٰr1tZ'l/;9ƾxnֱstV-^̪.͡Ҋl=SWSa2շ~>76膷sal_#/0*زz rt[bu%}<o`17;H.ĩڶU]ĔA TL=t9|`rL<~t1Z}7xw+riĖS]ӴTd[7֘͵?voӰY?/O~ݕp ecCbF}t(׏ωcǢ8N} ɩdz=huQc3Fu!FgEG gEXSথbtd@$|h5iԜ>t xʫCHn%kD^L>&@yo}]Eӝ~O=\:9gw"%`'nǰc 79ۄC zaDCA| oJҏŽT_ڙ#s=M:-+T8a88X`YVk^q*zp{*gx (d7=efǂǙ5{% Azn0ԳR '|{7~ sopCOƒb86No-߾b(''74l^΂JtB]Fv$`I29m-vxn I6Uzwʚe(:g(c;Ћ>®`ɴWxur}nH+xoW$:{p"|a[g~W&?y.?{/n;?j%bQ"sKɤ|VL,;?儞y n+éNlmSjItjm3Ic]rd(sq?g¡v[72qUzfɫ3Wi cSeL| 88o7;Qv-~^By7_Nv~,lv#߹g6? :.h>żLn#\1$l? K3`͓9ah7WrjܩdRW?K3אÓCټ'3p}0aLͱ5O4FtR,SH˘hOA+ =<5X 2UDDDDDDDDDDDDDDDDDDDDD>%5&_ )}&O2sfJ*[a%s0[F{џ{jy6zRw֩C8\;K,R{qC%z7M4 o\)2/eصpmrF]Ĉv㘆&Cl:oOS[Sאf؍Wo/_n9Ӫp7.(<L]h?9!Dv} >I0>;dz/Kr"|y+1fc5C8h'#I<VPrygsaӿ_k fu˯fD^Wr7s`p i%tl+99Dh5́S8'G沭:J˾ך䎌Nym}"g-unSօ L.eN'"%5ߋSSE8aJ/cZzw1W3BsRp\6/`k Gkdl.U,݈Pe͵ʊ 5/jwTHՓw_e\S؋bV.bf+->:9kW_>y4/P*c7p`&N}?yJi-*M5 {^XhnVs׎.:~Gk }&? Nke1&!m.B0-`>ONaNp p,眞LCM5u'y %Xb4x.& ˨3رt%*jppJޜg1yYMA|WCoQ)5ܴ wDclȻ_+3 Ows-G(߽3 Yųa?Գ⭷XkpF8"׹\5;Ag3SB Pv-\vӥ :4Q!P&?is5?g9 q؞خ=4?'&4;5 " 7]Ď/;$aAS Hz uyX~ۍ]SPMxՆaMVPTVJaoXKb-)$?w@P-n|>DTV4Db 4H&F:N"ej`0!E,f.X^ZIZU,_6KE](aEA񣕖@DQ6Z7eVͦ(( r>(Lҩp@/V>9.YO7ʡ`K|e'3t*PzV%!f{&Z:g:UoщJ ډT:tp9lX &cDc|["aH_TɄ z`41߬]riu(;f$Nbtt1Ҟd6!*`e+LcŶlXԔKq2g1:yu{+ƹh+#f=L8u;҅,7r|S>ΖDԒpS&C4fG[mX#Y;όXǕln' IDATty ^z{- WSOß۴3j;000AF)pfh(@O_p$N""շވ$ c Zq10VUnvOs`$PY: $oALUQQF'b HHĂ$4'pW*ط }C$Q?#mBtj6[(56cث}&@/݇C'9Y4E0G;T 3TB$u腒3W ;V>f]u{k6iaABu$qk7bwm4 VTŤc.Bfz_/흘 hð)7|ÚOG*6ǰWXcTKudhNQPlC19&ӣXp:lLHa][/CQ2+b#2+ټ]&Bi#(9TVxFB+)]Ƶֳv_/zu,45:KzǾ ܰ6l/[oˬP{!MO_aΑlNkgOqQ|_`yPD"db JNV#IW3M΄QBp JWW;=#^-kXQ]زCBf(YpvGԯ|^0D23G9'@˺eE׉ϨEXgL$d H@4NZ)dl8I0IM.99#h> rhj0&gp  H)`S nr[w1?CMa9&(xdtNZ e7łm]Kb:IuدXJOcGd7=9͔l|Vixq6Vڊs-{8)˸FZݬm[s圵~k̽3}"j =G›)j[ z d*MB]DP=8z͊c$Vq\zy>z51SiV3$}D7m 3~>)vl  PO*kVƚ9I0 $h;K g&>$}o=Ip?|e5X:$hۺ-OdGA8:hX1;5%1ip"DM 8rڬY nӎ2JN|,c)zɚ{PL;dxE; UܛM(1 Ci>>\7_`-t(6g^ey > ͆vb#jI|'w@H|luT߅B!B!B!B!B!xBY2t<͓O~*Ot5 0Jr#zAӎ]oБ)SPT< HR<[ҋfQn⛸w^@;Î \l2OlkW`qM[m@ʔ.dP6]#.7^u6g=;p}7^ Jbꑁ|UAhV≮n|)V\ 0Ý.'y/i ߏB=ͧJCWML$m0504ywɎ&(ȿBY=|x?53[p\ f#H.7M#}CZI Ns0QFg/ρ5UdrSʑwCSq0uAO[o 0ajɁ*oo#*fcF)}DRZG6Z-ؗ.ƾ| FO@j.-qr-جV0>a$ncc_fP>, o;D[آgb[]Giqj'jI3%/5]ggk?z f_r) ^dOkG  M~VLBWYEY%ONuM XʊIl`Dm<4 x #}ѬO>&f%Bݻ-)fԞ5gW=GwN3]"N-<)p2&.毮PFEMUYЕS.lʁX)7̩NClvE9$7tO~74S1v 8`> q;(o{:5i`. QT)` LIKZ쮹f7a5*%E8n}b W g0́7^y6cÎV^2GwP\;+}dNmH>ab&ZĂ[ngh(`əHa212bvca1iXȯʲ)XTV?]H8LriQP;9UʹϡĿ:mbт#!`|P pt z}&{P#yr7^Br#݆Z^6아B!B!B!B!B!櫓'{AS5u13a|2a۬# M8<@2u꽃R' q'3ٽq5;flؾ~W3 2q5ulذO |kΏݎ%5^OױL4楸 HYmfik d?+auOR)N>6KLJ%&n4Zqgvc~rrtb&dž]PpNA"ft`$JBr"?HYjtP6htR_}(Nz[ !S(eT0 C/(U.Kӆfvq- C2?_~ȕ0=Y+tFIV1186m']Ms*Sp`g38p?E4@!i:ʹ^;/ǥ@]L2^֍ Y4UN=lf{wۢyدs J䧿%{/=aw݆}ŐH}C/(XZ84ՊUU0ÝtGL.ݛ ?<ǎ(DsPZ;yO+'\ GS/^\z'uKZ*Xw)R8l `PWfb {xtk e;V'604Ϗ_ifE' 05{Q#s˯۶䡎 Qf2I//YTW`b[Pl|o+++a yz 7O~$ܶ/6~\> 5v6b<0jIZDZpR']NIm섚˩dm/jk𾺑oe*J''cJp-u ϠN_q8W1{{ OA5s,p%f0x=R\^rVTӠy W՝/$m6N;~IL6?3Ecco >ʾ+Q"qpj9+yf׍բEqǯ3xmlsr v[psOvpURbT A6N(fP:}%g?r\abJmoM^U5زŸf{vҟ1]Lq{?;wv,Oם9%ZaY-`[PInEr&Mp/?#&5VZXb?qy޲P[xY ،b(} OpsO_}],?<#ϡضm/inǧ`qg ҹv6Q}k̹ލ@ScݏY5E][y7ogg]gXclTe ne58b$5( w܈cRPۅRœM<6v͂q ?H(HOo[Y-*`SP8a%n'6<˝˸L~[e74DqQ= 3TUO>3eZ) N9xhWI15هSAv1N0ƏB^A)e>nDgQ?ؿw3;\J8X&Փ\3"z҇{=4f(p,'_\a^}w Ŏ\{[yxvJ^ĜpQF}5|a2҂\5]Q_ ; $Z ib7$nju,-Mu(._Dc}|_I5=kgq5ǖ%_;}c<_XڋoR./8OHHcb`'^xoIU]' RY̟ǮU[?~,O<̯-yd44Uܹu[Zq70{$/i(ڵ8ceNӤ8_ J=m^M׾Mjfn~BTw bt`;Qa9ыo?)~]Ue**ӆf[m8v,G VNV}hZ7%M/o=3[Q\W3y[4`Fû7Ÿ`ŊGxOϱzG W_8XE8lDgʇ1[Fp߽|*>{:}|2ɝ7|~_Pkk?oHp:G,v;NZ/cf)/%7Ԃ:{^o(;y'~h[έsj%vq?~tGbDٹ$`w8p;Deoox2I2 ܽGu3gT?aMsI"'Ɔf8P/7e+39Byl._-~$L_E޵m=T+cҤ&ʕs:>'/*zG~NNY9}mt > O<؈Cl%\r"<[㊇xeG7DD2k`.Z5'㌯zm}GQ#}wHG^_)cJs)V?sbV^5Oq) ,Maxc-?*$M>lVsؗ]&}^!B!B!B!B!Bwх[|ǿYPƸ<\6vQ]%\tqLoKJ.Z87vb_7fPl#r}qʪ) ~,ro~o} KBl;zJ E'wlNx_~ה]g@X-KĪ{w|ٛ.(|\-HE #5;5ӹ򮻹׊ٷma\aR}9dvғt3|`CcF^ӀjzMܶGu3s'Vҧ]3g95\mZĤly>Y:+ÞB7)oKWՈбe|˨.zx[A9UUx}zX.F<)'c7a: E(wxk|{iV|SHeFl㨹MTdQho͆TY?m{{V^]T>b3ȿ XU0Rq¡ ݎ˛G۸S?bbGq-Wp+}Cs۶[|hg~o,aG*&m$s.bfPw6 -yq́HR6K/0yA-O~>a4nkܙj-/q>y@?|?vMڟ3C*ki6,?;co:y_q5_pj'' WΦ /2;LwoxZbw_HǚUK#X=3 |T!$SV.:IQi!c ٘of5M?n?M:L IDAT>iz~[kyx,·|)ד˅C/|of7)b\iN` pC|{xZMe#i5xAG")Ԟ&Hs?Akwyt|/2v, :L".6vSq549ϯ~ex-iB(B%g?;i[nǾ =턣a1Ps>ϻs=jϿEk.&tKTL]xW>C/|r3&WL8G7=oǂky_^gBh/{8&MP84E2;xk_=47c!<́k}Bnté,Їq^3֔0tR}&%\[gزd0)LO}h 60B\`O'I#az/O~9nO#GH2UC'jL^zWΪc=c8hE0FaHgV<)EA+-񁫰̚4iPPsЯT %%w_Aq90eidW"1f O\ˡ~tjs1R4 E0:0c]K-}"Ԝw؊(R)8Hnn%%%ٻG(~٫޿K^~y9x֡9)!7/|r8mXnr:Ox~۞7xw\2Ŏ7'w= -b4Pm64˸2-z=K/ STT:%Śˤy\n˜ Sp颹4[WS̓=}ʧ\­wȌR--)pYH tqeJULqGa*&Wp4 :o:>bEĒv?t0(zN7X\84ûbLo(>9BCe!]G1 TB&4iC-UQUHƢ*ȧd^DG}$P0>D]sXhEґši,\2xE44SA'E,:@$D4K/GSe>6]b)H Ov.E]}TQ"^:VYLn8:/ F)**BUճ>֒tL2y)`Sx'`jB(ٻiL"캊LDI:ޒZ-3j;, XMۊ'fu7,kT-t@/ $?@B0qRnJ&h̘Tϑ۽ohfB hH⦼~:\"\8=XJj1oάPIyC Ӈ]'TWg6R贠&Bz^4)UyCO[0A&s,wv q7ZiFO/F|E^ejSsNQb}~ݿ !B!B!B!B!BOR)3yoK.<3W/oĺ:\.ivRA| D(#e؜<. WcM .]?o;iH㴝v D~t7|95{*Ih;a@q94a[4zvCUU::;ikk}nHҚǍ͢$X^n$ qg$"6sD]ednׇ8d!Mf N`qxz Tğ혡pC˴/[Z;hkuv0M󬇾4RD`wq;ldžv\3 L]3M4?~.1"$ZO7Ind.Cv<ֹ3ΛfQUh4kNMM5---ٻ I_b??"޽ũIC#y#LP64k8e/qݻZCsstd)b!B8i4l>O֜L I=}γ|̈́n8.Xrq9d,39 yd@ s,# C9vz.bO@rf]'|6Q>,/@u;l}2]X;L#E4$Inఎ>W<۽R_O/(=C!6r.3C0Ѥu3Vؙ3I2sдbe=cqo 933/\tIϋT}](*@=TVV= !B!B!B!B!BK,eb}9~ɿ^+7ŅOQ}cXIW΄7.3M߁4V >ڥXHnAj^҇1C!HQv}Bz]52!w)r>mnr NGX9owł;Q^\Pqxrpx7P\󛪢ac:)3 H@QQ:Áج]C(C+-˜قc&Nfn'¿imeÏd7ŗ^rN)R?Ba2#h,lb`Ql6TaK'H`AwxĂRQX۱47VcC㦙yP=nSB!B!B!B!B!1tP#g <@GK^j k9s͊R,)g6nܔ|?d74 אָ|_Yfmv){ٻEQs|"G[.$yl)k~aK@Ġoh4:_" .?M\aGsس˯_t9ye7_;_~#E,C/Ǯ_BHW !B!B!B!B!Bq^,d*@$2Mڱf*N$5bXldx<~L+UQ\3j>~ wʉL:gaX,vL+Î=SN|VgvxDDtzBSJ4RSwX2EQ !B!B!B!B!B!$A2 ck>t4oKK\(E,9`/!ή@ŅMiB!B!B!B!B!B$a q$)_+'KE HKs4e$Ĺ0@ȳ B!B!B!B!B!BHbi}} X$ k 3/@$~-7TUa}4%#.L&g( a9l2 HӃj2IUUD@ Ng"B!B!B!B!B!N  ijv8I'''{pkv+@ I!СCMBs`ǎMB\9\!B!B!B!B!ⴔf7/0Ǐ'//7Y!=d7 !(??3g7 !B!B!B!B!B!gO+<'a LAA>B!B vg7 !B!B!B!B!B!%a B!B!B!B!B!B!B!BI_!B!B!B!B!B!B!B!"a|!B!B!B!B!B!B!B!"B!B!B!B!B!B!B!g*ŏg$dB,* "jjjmvjժZ* (, HB=l3>aBx>qw3gyyB /B!B!B!B!B!B!B!Bd|!B!B!B!B!B!B!B!"1xB|UU8]b!7@c6GJRRrOSS---n4M;\!B!B!B!b!++b!=q7---477r45BBB&77b!*C}}mxIQZ[[illt2WB|5DLL,99ل>DzvڅG4I[ihh ??=>B!B!B!B!:XVjkk6lYUy^EQU:+u >*Bv"Z[PEiu444̀ "B)PZZJyy@@'MBSSÆ #!!>#$_qp8ܹ Nǘ1cHJJ۸ Mb߾CZZP__Omm-٤N !B!B!B!B\`TURT۷Mtttp5!.HHUU5 8E/X,DDDW|TTTFaa!yLjBi8NJJJ"*BNNz>BgXVJJJINN&//$s5!}̙3)PWWϞ={())aԨUD!BsFUU5~1cƐ\,t:2, &,,\Eq;kF}\E/8g8]hFbb !L&:;;q: B!B!B!B!)!!T"ąKUU.1#wHLL t:8|>/n(F3k1̈́шB!Dbو&*ʂ^',,,NpFqLtRf3$%%S|x7o@4f̘\UVVƺugܹ$$$WB!B!B!B!B!B!B!%⌰vƌ)WU /^iL0co\. .L\6`OyW&B!B!B!B!B!i%466/( ***H>gDHH\$BӠit%k4͛ngL6 tΡD :u*C `0MMӰZR ;zN3LL2EQغu+ s!%%E: !B!B!B!B!B!@O }cc#SHHpע*vnI}V}CaaA%_jd|! P*cȐ枷y̒d|qTUe˖Θ1c( ,ZI9r$FyiFgg'֭c߾}r 7wL&M^g˖-,\3f^.B!B!B!B!u IDATB!eX l6**+7 ' 4(x׶/7 !4Jee֬&j yyk)$_UUaXVƍǤIIb &ǪQD|)** \b2:u*F͛7rJMFNNtB!B!B!B!B!BW B1Fkq#B3Wں:VZôiS)/МY[*uuu^&ƍ㿔{n֮]K `ƌ :Nw:ZSXXȔ)SHHH@W=L&&NhdƍZӧ$k<Iށc$1-7M=v8(: r!B!B!B!Bq.Q\4u';9s/O1r>I gHkښm`%>Ƃ< 6ϵuމKEfr4rifDu]ߔo;MV_GGHd<) XŒg?+Ⰴ ^Lp>qs.IG{Z$iј zT<6~"㉱!B4Տy5GWN( D뤾GRr!zک:ЙH=?9p~HSS1kX|\=ǔ iUDi,_ƍرc ;\GQG}odРA 0{QZZJaa!SN32ft:6l`Ŋ\)ˉdVZW%+%'*g[d~w ÉOa4DGj8 ΁͟¨Qu!B!B!B!ܤ):[h@d—*i?Mwfi.*+iyA\R*qCC4[):?ȳqh~ISɊ;~Z:CO!#==1WIܷ)6 `Iz)N AmodNh '224ږ Mˇ1"5*n{Nŀ9XӆݣIDXq㋵. f"&.K6K&3zh]47GIdf~9@|]?p8)yqw쫆C5ŇH? 5Gq9hM5ia|~Tꣳ\XR32H;~ttQKzc$26gG\5ѿͺ~20C5j&F=KL0*Z\K|Ur )8Zj(jġՏXB{Vm$5'p T?n'B󵻲3+Wbe+ (, .89fwޡq1n8ÏtR\\̇~禛nb}"y())3f}&-̘1cP 62w\ qߛL'&^lUܝ ݾ: !ag2bcC?x u[=B!B!B!B!|]ͼyn[47{H/` q[,;@MDmtg^_NYN`"*?!?n0/Es4JJ t+gHk\(8؆ ;4:ov'EC"b3= bO=Wqۨ*$zщhxm|ymg<(jO¬FJz<>#j>O5eP1cMt:(2 G0qLnjIe؜*' ֒0*30##-ࣳJ=6Q⼦Yxn۱Tb%oh͸c{6֊9i]lzk#9nCGoL׋sIDpӣ} ^κ*z=O ߥ*=} m_Oe,i7w*~JՉ_QC YRx-} I8q颱bu[Spu6PVZI?>7;S/<,rhӁ>$A\q6RңM}<2]hy ka௦ؗUo7_@E@7`4Yȼhd} T:feI}~룵eZvOOq^ZC{C%%fRNj:Z8PR)~mSm{=4vPAg4<~L3;X?vF}}wJUŊ7KKEE)"ữgp~p#"r~۟rKRi~vUARiXIk[|Jt: Yn+`3f W^y%&ӑ4Mŋi3g<]. .̙s}Qxx8&Li&^}U~oe{ok(soB9䛆\O4R< 36,LmkWULNJ<wW'-VlxTz!B!B!B!OY6MraD'J\XcOd^"+^~Om9W Ɩc\CK &sQf4ZwE*loFw&紐2 ST2C0(7M݁@] 5U<#z^.b8 &< IEU16軭׹褽Fb(CT[˾y{?fqa 77L+cƗ!W~ǦC̅y>4\]t"?8:MPU+ٺc>W5к6A֯ÿ[ |znXǎ#fHLW*mVt_98BкV[1N܎joة:,q?&OP\VQ O]KʱG]u%CGwe<y^ŤAnVO-,2qJ):˩_=W}<$Lz&'7?=Tw#s83wb>GMUw3{*UgN<>[h^&UG#&"K{xF⇹>`jUik C3[K#C!B!B!B!ӜY\39 '4$޼zi.7BBJy)VEE~$Hi拉&mn$fZG= 5RNiJF^qS~NDCE:HdL4L e`(@<-^4_nCKy$DŽ0h[o0nV;HdL"yO vSYR#&j*iƯ%:>G}9BKףS]4QІCRF6rRMFVFWI\b Y9YF's:455z+,,T"ɐ?y^.?r/cÂεK|(.+jhBхbK"37$ 'u[ZM[c5Mٺ(!Xb{ҎmTCݾt藗ZZ^̙82S/ 3D|>~Gm9DQOEe6~&sQ1GQ:Lie ֞8RsT,)9f&c R8ݎG=s O:S* F QEYe=V p^Ob8tTS^ՀӁ_g"*.Ɍ5 [9}£IJ$/7C1~@"/Fvmg01jAdQ^% gP 2MTCeMN'1dr Ȍ E>'m-TWb&"u$d撗@NLm}NN/!D2N<|]۩(ݘ ,aG_U :ʫI%Ckm{7, %ld&ZÔψdL'{#}ZVZ[[7PB|))1af3ռXN͎Q(~l-5T6%9#~I \Ub6B}ѧlP #97dv8hnmkQ$gdԶh<]4VUR܆Fћz,"䥥>JIHV6Ę#YꙠz/.(R"rTI%cV_Iye=1sEkAuc6]hqIcsvj[;q` #"*tҰݡtp\YDum3wϜ3)ܼlÂ( Ncm5Mm뛉O!+7. LuSyN*&K<y$pl]_Pad+9!g$we]ؓ9w1zٯ9{+[/c\hj,^OS8~.?\G>3 IDAT= cCsLgUh>SsH 寧,Ғ 3YZ?djx;ktF|qn;LRqAQUV^jeܸqL4D@ @QQ+V`ʔ)5Ml_" 6mQQ=+Q]h%䇄yfV\ɴivU?mU;X"VnI͏Ѡܟ t=9s[g,X~^7]$y#&0;adjHP2~~ 1w<gQG?!7ayeUxs}C'wֲ֎Atfwse}DQk5ldce<ڣěAqYٽa bFp?nfڨ.wG K-{dLݛR֍ӅJޥӘ}Dl[: )swr>|ԖsO+Y͢JNE)>[Ŗ}u8=ՏG `]|_H>vp7a ϲ:YQ&|Ml]wWl`wUoO=~2꡹d+K,dge803j2|f& jn*ֿײ/.wS\6i"/pmb~e=Z[1^yͣxo3*)Ϩ]ų̧}oX脓M4V~\ܫtzYHa Eq*`8/˞*]~Fj@Ao%F rSjdמԶP1+B?t8CS1\l`] to 4 rH%-ƈQW^4u tJEE2,樣q?TlsWx~1dƥwB!B!B!B!h۲b*Wad)?Nu#;:PTm7^Īex#bf ėy?S,&{s%no-HUBT0?Fcd.Z n/$f5 'h5ۗ7~w=>C!L1\>jV1o r0)Ase_4MFnBӹ{eb;vX:s*Wf R;og"Z<R妹sҬHzVqwTwxMD3P^Ts*5uń `Yl{j D_6[o=&[YVmġ1twQCl<+l^Ko-fՏG_»z'^̃?i'Lc??aɺ=4;=nh /m.QŇ`ʠcx<-,y)O'O>FF*ؓȜ_wqMf3a&j ɡ Q_PfٟUK7ۙtx0%n{l.u X܌!,?gǝ8l׈K&NˏƔQ:޶2V+a=4ڼ|Nn=Cw0DzV)YUӥ BœmLv0Gջ]Q?zO7rpx0%0qr/￾ E ty8ht.>zWG.KVGxD|a,ѡPKOEw s&3-۞`;(@ΰ6RS}l[ʛiq~ ][Ea.ZĚ *+y77$2ֻg8|}EmKS%dDq90v<4S},xh~qCҎ5/ۖ=)|EDJa͛/3>/]*>€ CS;ŗu}[l6[OccSpQRR:eJOFXQ Zϵ;ظ.BK[qE$^ ^K?(  3Oa=sÂw?`KB c/aba"z̊OgDxc?j<7:kFgxwb<2V|Nm Wn5CgoϩnwuwcIx9OsIW_}~e$[u/罏:N!q t ~2_lYD]dE:MeWS"6<43tΏ&tyd޿b3e>BLz.?i|\{%DvT_ÂKogbaBz۵U\O3f]}pJ{yY}2]"ks'{Ikg1 G1XȽh33Fgظx%=v׶Ӆ`ć%2k3f%Zlja"68 ,izL6vydGM0ׅ )7&{(H985⾙f>zc6 h x-MA'yU쨶7ٌ&fϚДI`Ѻw5xP =xAsPa1Kw_+pjt,\:+qˬ\>0Ȏ+Y?[?P/fzA;hGpVm|L^9דN"ݟc{WSPF4ys-uvԄ~.j7 C26LʱuMKMְLnMr 83xQR#5̍ zsca{q:U4G&3,ۄ88GqRWWիijjbܸq?K{a͚5: v^';N֬Yþ}(,,dǣL&'Nh4qFV^ʹi>k v?ϫ[ɾlJrӎK_86,}<R,6*~Kx֪ܯ<^J @ӂES]8|x+X: z#CpMyY0NjK7=NGIz%3xzIyR#u hhJ7e[ҋaa07;aYqN|Ňy?U0@UVJ?b&OrQɻ}^TFR {ޱS),ftƑ4O{ϙʵep-$ jKg_-Kf1(.Ms`ͫt%`=s٘NEnv1qx6}Yb^]͍WX\|QinV22"@;x+8Q]tu _^TÁGմ?l D4֭'gefrUS|}zsH(aP^ td" CوQ[0iPzB2KLd8b5CU5Mꦣ{sBcjKn+|{nK:C/A%nwhBhT/'>Fj{8s ,:oB!B!B!B!aV߀ݜ%/&+ XFkitm?|{apͰ4`M&(C!lW^ce],+;8s?3]Z޻%Kd70L1Kr_nBH @(lܰe"n]e[mߝ,$cj½sfv)9~W#ۨ=k>a&Zʝ') ^˙C|aB(y?ׄ#l8Ċ2+nLLj7GY2^"t@$*Z[?_|egLJ$c]4Wa7f#Œ݇CB5;L "XbkdҷyeۼUH/F``45cAw>̄p$'@n`/ҊsϾRV?_IF';;ػ )%h(N;F >m sӔ89?MjpA& XQGxc=#ˆJ]MBTfcf1qqPΠgi[yS޳1Ɏ6"Z8e)~ưxrr89q{+N&7*LQFhfʆ^~i~)H 2ݚȟXBOٳc;&dmPi=5;'=#`VZwH0e-{w _{3A%\{,U8R6e]i`Ȍx,+䦱K>s{ق&OW;z-K7"NI #9m5KV "<DR $,4qcǠ( ;܉,E$! ;f4!!!}_r.4!.4gnɟ̾oゑ.-+&'dVoPnOaSNpRw|'+ܗP=E}X8TU݆hC, S0&c^żyH3ǓOrSWʼN$\+hl{Yݳ )vvnCvA|J]AFj<%F~//eC1N2_IZ߽8eo3DZ?fBnw=*||ּ2CGLiʾUyE4_΃9 ΦJ/oϦ @Ihԣ0zfTjѳ:.-h6TSuG~8qz??-D0%=1_"CiD}k˸:R1 BLc 3j;jٺ#>YO^M/"׃F(xV=r.cϼ}ӹBFg}@QpY=aĉ u{ ;-ܼEG*?͖]ucܴ9w 5OpǤ4tLys^~0P'63 C M?䁛3HrcMmzagqM&ڨ=yosmHO=UybNم3Ӊ̸̈zv-ylk%QdOr;7|ϖS֝d]d.P:-yZc)a"ġuy<('Dh\: Yb7N3$wi;Ẃp&bDvzvށkV{s3+*Jl\$-8Ẍ"ȎmŃS8֊Z$ Pg$^M{쪵 Ouc'[eA !e5exڂrE7ȔbnCRT:M|-Yd-qiodK:`5lY1F3~=XIr>[K0#l6sI&-Jk~ \vÌɎBmEE_Oiu5g݈~usk!dk/Åsjx7rZ_5n{ÛʥV # n!+wRKXdnNvx9w>=aw2~P2FbRw<_reyETǏ㦟N";\\éNh 1 j,-0"&$6KZd\* m+XMر3xxLj,>>X@\r:ǥ⋑br**"rcmT ٻW^*`~rߝc޻oLA"{M8L'o=wk4#M[("'dS2z<a%g]V`GS,7?q's&yD\9q%@Eeb+D% Uu0ytn}&5 C2'OP]LQB\׆ݛw! +՗U=mlxۛLn5 5nnK~2Vu+eT:zS:8tp1LGAlǧ,6[<̭S1ue:_{]OWlc3mPQV?lb1 LvG0I/ YTĬ ]`{o)R0kW‡O?C_I,uInP}<423$Gײ =Q5_u%(U;9yYcSbR)hԾ(i@CEMVIb|ߗhmY0aΟ`onq,J #71 MgJpL70d@Vfʽ;*y-o{6~}\+I0ψ$iQ<[װo['bV DiT)MNBn%z7?GNqd&V=DĘFϠtsuqEiiXzŀ+gq]אRI n屧!Gtv@bu+0|6 38k©-T{PFq=.B"{&wwpbnZ+of-&Y54q]1kdA ,|'!<\9 3 2v>UI:Z9SU-&3)?˟rE b`bR:T%rDŠ1z&3gd,NCR7-併63%-=>pboxN7G0~T>1!Z$_H$}/NbHWzk_bђ72˦2 n~83)S>:ǧ98}v]R& 8h'1$@>r/Zt}K+w3=͌Z3HA_̖-Gpnn5V=c& kx\[4K|"{0ePjP OD?k?aɄQdLL{tJiD;zaL0*=#$\Jn>ZPX="p D_ޟʈGemu|YϘ=(7> D|g_+K(Ɋ#5⡩qs͌CןmX7<8ϽCٻSe%E3ue O{\W2Q.W-9>ʢX\gÜ8d#7[Ia*>Bh 3{0].8xry槷1:6WU8~vUN޸!hPȍ3H3iMO{$&t ..Z'*6^0Hv~:EuwBYTHӾ9e)krD ɑwGIDa t&u o1uy,u=;+fז: u]MQ8ig5Q E x𤁌07KA #=Ue9{ƯhJ'N$;;{KQeo#)n;Z*&Y3ȎUl}Nʔr18c7>/^1,&aEE Lފ'5@1c'2ܭqKrɵ=ʽӲ0k}9 _[gKu-$8Ol vmfZru⢶-'~q7}6bhG˸#,u55q3g(Er@v d2ˎ8~g潌D xwW6VlgEiw!,/O3G+Ø}HBtP 5"Ǎ)$W}к5(>|)!>x(\u޽g&GuC\4ps1+7kYDm)>-žH o(8Zi LZKp1G3d6gL!-T۩)";RC_b'44 gPaѐX.6 OŃÉdԠb/6Ҵm)I"QycTCn9#p˭SH y8:vѩ](,qOxsWv[ϱgMwreY]|~j0g+~ k3\GhpJL<+']X6H,8f;κv $\h:|kGfdpeѼ2BnxcBݣ(~|_ 5#"9991Œ%KX,=ʨjƍGVVMMM̟?ѣ̏ ̕W^Ve֭TTT\4Xx1rss~,ԎMT<)N!>J/&ʑB|}#Hcg/i;ILX@@ATf[|'(flAo1aEdNjݲ[HEt d?\LzUd C߹(2RXtX緱Ai9!37ֹM0%d3rtQ@*AKJ^Y1mZϮf Z{{*petf,zIulNzM/b̨4e[zt=6*wSOxH>ɝjSqpd -v1*$B2~fWg$t zjejd_u#1/Zf`^&N$4$0qqBu#UҘH-Rt;7 Y κnu fu^ HcPi,4F!Ȁr>`]h )u?ϋF7qGv-QBiL"V~3` @ @ @rJ9TON^aPRkrW@ih%ut("+SJ⡤Ņ%pZ8^q<&|^$!p9L(#1d!>؛9qh/Zb1zIA@EFN>IM8TMJ+;7|Kdt u0%3FH@ĘBJa/ֲsaڃ?N!>L:'6"8i3@TЪͩ8DԨL͎" }x6'a&e 9+pS$JC|'έRXu yhigXАGDnbg]KgUs߱{R#s V Z0aYD]# _sJ`o}8;]ʹxFO.B>ʾGtطr%gu -&ԽFEOS "Z0Od\O L IA#A{C#66#PzŐ.!> gdi޶6@RSu#nG0=@@eDqjm={`Ӧ2|x!F g_[7 v *C}rqN!>Hz8xP԰!TGAua|G?dzSBh2#MbdVW IOָ[i;s[o`ίaGxٶm`]7N!>BS# =N>$D6Zl6< kiEP0b4|E]$bmzq DLax|X4`}B|jξC%x"Rû3#!+Pp@ &9w0CӉ0H"*UV@ MeAB|Mh6#qsP%ԉB1jc18-:~G$Idfd0y$ΤȒXV 6ܢ VCp`H!*%FJn`J[KY~b&M P"<:h۩s= >₊,R U,#K:"LP 4vo L))9VnG*R2KvJ7ndoڨܵbC 5_*4aC1@7b4Cz'NR}iw/qL"ihFڷ}6F*ĔDJb_V#  ̗l8SpO䖱jc4!,rUFT0{tk#N@ikKQW2@SaJFFl&ؤXQBӣ=oKⳣdFL4!LDžm>W=r531cSf}~&!#{.N Du0DsD ;(l_f)1,S h ^bݯBĠQL a41_ێ>qpT7HrR; cL!LGidsY"138Nk[; 8FL!=6#,%!=yct. h=p :be.]a4hzќƈ\;2 u܁k+#|Z$%zW]xæf#i_ p 1g:וH1iDڮALbvC3^\vo{NPk {x=pYzu8){:A6+MkY?_C,ld҆,M!'rTI"PdN/Ry[=v/ʗ䟠Xnh鶲q=kzsn ҏϷzuDP:hhh*Dtrz 'ZDθ_`[Oi;Ln5X*U7A@J $L5 2GfP48囗bYΎB+h8}N,$#)YsD ƨ\s\~G [gނel[7_?7w$RH2bT#Xm }xpB[M6b*A0 #DJ*c lY5)|<մz8:Zn"q ~]"qՅJBD3z,nˣ/iDnv/Rkzq;5Z I8G=XGxwԯk8jkz4Z[Q/ٴU5 u8pplJ ""Y(’eijjlf ;AE<ktoPܴeǯwS2%7 c2dRzH2#F}}3^"{p_۩JN{2IXɔKvž(D", C\ߝ *jx>®4 }H%CUR *IMjNAl^{F>SZ6ͬ<|ctTm!W.鉗S*q( ;#w~n;8R𸛰ADb)1?WdVQu=  /ؖ:֔ŞL fޣ*D vȥ,.PhkAHqTT҂tl;ʉs^Ƥ_mt[7x5+k AQgޢdLVf4"'9{/D溫vse,=o' &ΨFȖTԻqگ}Oe--n?م $ 4`| O<8.;ES4w{=ܶNbt9nC҆d` 190L$jHz '.o^ϻciM\sbz ֶp(,_HJ'TZ8^fE$F#Ixpw%~$ɷ.pp" sGv!ypbrƆ!p2~{V>(oiTH ^bIҢddo<Gzz߾ SeqSW>q/*{n0aåȽ,?ɋ[7`ث}UO"X@ &׾$IJRz]^UID^\QmFb L׳ 2 ؝BrH^S~ɥRQox@DoQ>˲#Puɰsxx>~Ӕ]l I4Q 'r\Ic(,+YtlӾ @w4 'O}v|Mn&:J^mƼy8v/fڴi2?&DQ$//IYY ,`֬Yddd+B]]~!bN/Pp8\* {T?hK%܊Dvw_|nFdT QfB g| cAuh*D@B\N\~ _D"ׇ( ƽ\[EtL'L"SiZvC01d(˶mieh ΂L;@Pi_"8NYnmU߀ "1+ѶT^{˙?a͎ G|.\^DL(XOaסJ\QM*@d IDATQ-_AiS/#j0f2"6AmTUX,!Qx_{ك;F .gz*zAV/utQDo (^^ED^D @ @ @ @9q=_6vyɇxqqz=x(j4Ʋ׋FmԠRQT%st(2km)1̗Lp H& 4DO8 xNEDtё 69)BGAqpz<(8;Ziu?Ĕ^B (8N$4NjiW$8 ~4 z!ы>bAٗX,ko3-7Dh5Z4"]N\ 7t(Yj-'o, KeuӦrcA oy317mAU(lcﰷ?"mqcE)>__A@5}sAC'rwe/]"C s[5bi>mUF'3{l(.8_>,=$tRD9)l>Dy6sid !|5wc*˜E%DFbԨ]!x^U`qizi;΂WIttQ!#H}OLнG@!ujM$cnOR`S{~3pmwp"B(VًK߅6AĘlH)k?$>{,-<΄r";J[+`RxrA)"PD-KIJr1@ZD2'H)]y=ļ\s۝8m?.w!Zuh"lBKҐ`2~rr,¾No$Pu(jPn'~Dnb*!:D@0r+QCdv~>%h*w5C4Th.)ȟQD9nO_ˍ,+鵈}/ `B}0K{[h_Zڎk .݁h4Dm8Sy+R"JhrI| ;ףelB\7)i\´ Ɖzh6m(}v.\W\AbbbpWs׳h":Jbĉ($1x`dYf͚5̟?3gӯ,s-[Fcc#%%%L:E6(Adrc9׏_m?lo>Iˉۇit1i>mPK5헓(#?p&JMLCIo(:XNdS_FiB678}y1=߀d 8\Vlv>•u"UD?_'oeNIʷW3u3P2.kvh}!J =a/Iql? n"90)xNv7NgvqX۞GH0(gu9VAF'O W3!ykpج80̂AF妵ŊzK;ڰ=Pcgr 7al~q.۹ڰ MCz!c,D]>%OYp{PLAJNe5Vmke_.174 /Ѥbe/Z(~A *f .@WB`L}9D R0dl8N6 > phc?Pԝ=FuLIA%!mXZd" .#f@&{.w3KQjѨUd_s_3/gRS0R"}s_`Q$/{2x\`hZ ӒQ "Z!)>`nbB&` J QffmAyn1;rL]]AL^m.տ'wJ3yڗ Va!mC$M{2X̯xwU(3zbt*ݞQZilt;{iP(Dq-v}Ժr]թp9).DkjmTZ^WSHDwauT4aܩIQ'_9/v yh㰷JRaZ^)Ql)/\,VE0zzS*Pٵ˺nVՕ4 Vb H$G-6mEBDjzl-pQd2L&d2L&d2L&d2L& .Oalj"cC;b-_eR_/+ں\7 *;% &}h+-$-.I]M5U #L Ƴ#9e4x܅@T [} nA.ZOdSI1;N# Qm]b/h"vl/`fSd?F s)%EEəYTvrPԊ%1n#f-O2;EǙ9Sq㨐\=q,7Ǎ}4f'#={U FKRtr# D'"!{բjѪTA=TRcUqXqc8&z|.9r}2Mygm5(/z75pTMnWB*k%cv u5xzz}!zgFz0Rs!,xJoD^F-Y9^\Tѝ333QUP@QE[򕓚R *Qb8u:3ƎFDPJWN/5IL𢵡'Nx*taP{(R^u 泧ʃH RTˉU\(;q:tgȬsࢮERNȤRK=eԶ^t-\&O'Hmm4VV()Ѩ(D<֘lj5]ͧ9pŋO87s缉:\%[;EHr{ٷpg ~gcOiS;0aT"^J@Ť$o.H4edg#}܃wok5qdIl%<>HAɌJ AW[vyg^~PYpQ~t/g/VUe onғSgHj(d<ľC5X}#LUA旋9\Љwp>#Ms[;DqN7 %ۭ牋*زmoFxt$z뻕v.JeQ>^8ܽAw<9$w8uNDK)!*MdeU|{\6s$Ƃ_c/4X#m+t^!UMfїxO-Md;E}{~Rft{nl[AwpnI~vԅ?t^A0A wI͜8xz'X&INN jgWKh&(44*]YVQF~a1M0w5"L_=XBokƫQ>*J/HQ*o_nH@]e3ctbe9ֺ8ۨ)27m޽NvnKkZfر5RV^M~~~jeĉqaV^MCCC\_J% `\.2228p6!_$ ȠtƍZM*B%AS-qοm96l]ϏTp=>g;_eae= j<<<0E'~n.{5wKqJA@rٱuXWkGwmgbJE)+Ӌ>K`iMa[DKu.[7mX!_sך8seHZ qfrk; hmlԡAax ^z0RӒ骰qLLR|jks#ASCsJ* ٰ2*hqAC]-u-ҦS@ l3uIި`4e6=Ζl{ޟ|Cj+ʩoqt{1l*"Z:LDUswϦwR_ S:~" (0|PJ~\.%kk BK8 G}m$߽Q^FA—A8,9$RSBIÅ#  Vo=FmFs 'JH |!y.͆T1e`<pڨ,kjf%("@ eۺ,1R-ˢ\ DSn ӹKQ7u o[╙TI2ΣX7x._u7NjK+=_r;9W&&"cP 'ekV4u*܇.X?:OgS! N؉kAKpT) m[CMTg㖽*4<{,x12EycW˯uD.Ch=,Ou0#,Yb7Kzk a*=@F5{Z+H֟/C9.1RK);C̀O`AVMªjb)Kn` m4B^Gʺ&AI.lT],r(M&_0C}TuV6t$Iش}b 'J.;8qp"^yE_}k<5 SGTE14Ulk6v$'U%!)^D\-6·JTbm^;:OO c,> jA:ҧADNCU)U* Qv\-ٷWJBd0zL3]]![Whefg-B5!?l|I.Ź:XBalhm)k?\vUl֩۔òwr3҉! vp/I~c!7cmbL#mtV૕G:[~ LIW0dT*~&};t& #%Z'ցS*.q QRR{mH?pg=О-BKsBoT }Uz!x2tΝL UQc>y{;rao4F&[ӽ$+m!^$妙] $VS} `۳9xWgFΖe:Z9 C5RUS%@P0y`R * AX̦ ؑ[ࢱ˼ozo˜dW.`龒Z cpWzi< 7QS^ 9yK;RG]AŤA4;Rk`YŤŎz&bHLTl;w^FXw: S:=]#=QC1qP4bZ^~uW{ FEE*/iC$[9U|㵷[+ @N68Iu9ص3v[JHG:T%{hm/E(Ťdך ȫEc $OДH<ݺ>˖eR0nLD~j+kcm'RԇNx|8[laŊ̚5s >>>L4 ÇimmnCV5ATZfŬ[A߿? E˗SZZJzz:t:Ů.Aox VʟJ1(0b˚I3~s=)<;!Ahl%؞L){w0QOBT0/1yDBEX6ш PÃ?;{ ix))8~}ٕ8zxm'Gxxw.K @hUz$5FdƚOS{HO CVؼ !0w|"Fڿ] &&r7z5^ݤcVة,8C3g{5rӔD>yqlRk*dԠ-ֽ(7Q~,'UÄ!K9g'G*8iyD_0n8ꗟ37 d&p->g3d+$ZQ+DtO;_*sŧ(5hoB58EVxߏP_3:o&cgC?;2| -c0L$JRFMOļyhC\<@_a]G8̘6p߷KJ^}=Qc& leZ)ܷfR $,,_=ܓ>xHw2VƛX+UcI\\SsCynn27%`"O=}DL!)̘5WK {HR}mvK8 [2e-^/:hɅj*+J))9.}`:׷g7|ˎ0(5`gS 9(m#̩C?71.#ks7Rj߱^~ÉVS_=)Ra6Bذx.KL?{[.'wTql6ngЏ|R=k3I(\YcY:ZwC֩"G2"h1<3c/Xx9{|=~!UN* 9y4R} HK@u'kv8y4i;92fhGc3onLI{U-#c{5/zkI'jZ.%Q{cԇ2;w{_ecxr(zg5'ogӎSs!D_FOOn hfrRz[= ZO"$yH 6b+> 52ȼOWPOBt(&%M\˾&oQJbf=M I'KVKљ2+r. ̜2';?q J"1֩xs,7&5|N4?Nq0^{i*^~ UqD9#~NPCr|;Ĕ)x)m>άlj1c@}QN*mb'˨ƑQIsU.{2ױ9qx(_mH*χy3I 5a-lφҮW'|%DaRI*)/^LT&GLa,] d3vD2:'i<채{[GO"6"D]qZK.cbD$c/ R4}"2(+|Kd, ,lkNeĀ;{:_gaᷙQ|ņ-PGMa;z VJI]WG Qg.cR2I3H01{|v>{ay`4RCLHH6} K:\l].nzcS,ٶC@D%4uvS1u&#^&Wc܎w̼ΧlX6IDK~mڷ@h<#/?_R$ Qm&rX-zDI?ARV~}='h|# 8u+¢?D#3Ol,y?JփQ7mZ|cNwlǯ?*%)-Qh$'Q0 9NY&*(I4xbjQM#8&6vg|DD'1iCf߮S7TF{Yt| Ʒ@g(rpUg_gmxBA'mmP&d2L&d2L&d2L&dWީB+&d佤io&W9mY14x?W_݌c9 Q%t> p(ÿo22(QùcmnW5?sqJS0~K<Byk"2,ޜNp(( wgkQ$(=H|?7ڂ1?J_(=XCPv1)3^|m>=nLCS s4MƨeU!#ƓdzFAN:=LˊQeێ.bR{`(B(JJcpres-n:sl]b]!ugr_NIIAMU>~m%ɅSRO{pBL-ۡވzb_YG,ڸGw# $\xF cQq)&ϯ{3߯OرR ? x^$4\P9~ >G+ AT&C(+˽G_GM@\VOV(,1ܿk3Yc\S%V/NidC1o_AEɅ$7FYwywYq)7)$S`7LDh/뢠Ap5P.$qz\I62Y~TADc !vM7uc0P ]˞+{__og͈ \֛!Sk8zn[7\ W`{}6/~=˔ ndž΋UyI4ތu5֢| ΋nY,}8+=rPY;lR*0xFca].x]+85# *<OČq hݯ}E{sJ")!ʃwU/7/*^x*. |/~U"N\*_yFwI^W1Us\`Ii~;)$%c3Ƨ] FAAQ}D/or^ۇhHĘ>(w'~5 \zs4/ V>ϫK70 w"Iν-pHq_-^V\N^x$ЙZJ^Jezxf3}֎߼oۼp mAT IIQH8)/7#u^ a_glD$$Qo(ҽ_]G3;^ hLS'JkW,ؽzJ2}A2sxYO>x2c$ H>;u$ DO ј?>a^@x4.cW*頥َ"} AxN^{V?*m8t6O&Ř;]%8TZÒNZ˺.eĜGd[P<8A&}n\xk3i-#ўKQ<97Ǔߴц/53".| KqcacF1Q J]seש:)';oo/BCCg__㏻ꢵիWm6, >(fsqm6|999$&&2gΜ}%\.Xt) 0gbbbz|Mjjj6lSN*73䦛f@iQeuvtAz$cѨ_(ۚ(/(ʮ'0oh*/ ٗ ?rWdע0zۚImQeS` %՗WC`^ߪ7+IsM944S#iOOLyW+uP ūFya>%6D@Mn?((UO'uAQ[@CwP0~_]mNyy9:22VMjjH.'v[M6.ބŬ 1 Gk3u:Et GK#8D  Kꉯ7.u6 )-e [M%Um:|Mi֌ըmOGFFO%L&d2L&d2L&d2L&ɾ7-Z^g).[[]!ոtcj~G>;?ʤn1$.* -F02o/O|^=S^jR+EyW6R Cs,䠱’j\F?}j xa,O7Jv* s)sb $ǂZS@va A$W7T |6v\vK)*ǥU~5W[Th&b(t˲I}YEm|6ӷ0 jZC Ӽ _O0푨9&_1l/_NXXiigpj)-*Ac? ?w?.?rH.V1mA~pXϙF4^kʕ+ e;H8[)+.IeD+IVWJAQ _I4m`St9It 9iz JhX9 PH'++R[%EV7#hk]5_FC۟@_+N׾SQMYK*ܹ>; SZ\LeJHHj<7Fkhh & J)-*A2䏇^uYej1}44 6nLJdE >L|\5Pv\C$eVч .񞒳URصCIsm9%U< 鱆jښ)/?^%W9.&Ev<҂"zWIk)*٥/PNWѶ۱lL?}ַnzClI8TPV݄S/ ֆr hUy菇 ԝ [m)U鬄aԾĻ[eK[ceV}1iz6 WaAH8Z(/*JHX4& IDAT0K]BJkiS$KGdY\Dy5kGvggk>\4:D otϞI.g3DEjOz{{ .LJ1cFϺ FCEe~zS.{guh!l[]I6J)*ERBO`=Z)Ʈ$ O崍ֆJ Ki0xG6j)h+F]E午NE?/c/AMIN7HJFǗ4&ʊ (wa'GVITSZߝoa\~\-P4UQPيgh~8Зh׮]0}4TYװi\.׹i(2zH&0ӒԐx/ ((D<=,dׄnULWjnΝ;yw;w.~~~ :|駜:uSbX-s=Es,X9s}]&KDYY_|555 2)S\D%jLFq.B*q/#oϓ Vc.j̞V<>a$/+Ae$ "۬2>@@? J~"T)3aAiDj,~X.߰X|/r4&?'_Ac!4>{Ih f\RmcpF@5᭽/HDc(%}B{"[~d2L&d2L&d2L&d2Fe &ryRJ1DJOG䤬FV+eP j;&6Z 腀OˮPgoЇxL u Bb,/z\ (4&L_$,ɗK@y{ -$ޗ{5~־CL`o+IPas;c;#/nڕQ?!=NBSOD.VQ'OjWAET_į9j-^ _8>߰>mx%[m/gSq6{IV".p! >]_Ə`ǎh5qc.(toevjS"";wd…xKNt~,]cǎT*?~r qqq(=|6\.Xl 6)ShQן~c9 q?wM'I 8TƼ/wbYx]Zd2L&d2L&d2L&d2L&ɾ#RΔ56zb0ר\4T撹j#G|%! Ty539Vacc Fەd2NvT*J"tlVd2!ѳ0-Jn[]*Rɨ9zF۩2@NƗ]jɓ'Rؾ};Vbڴid21m4222BT2i$+6 RdիYd 7tIII^JKKȠ#F0qDjKGsÝsrӉBTOh(f-V5pfFVj1)ԥoL&d2L&d2L&d2L&d22*a"lgfۮћc'W-LAh-ضb i9~h0Pl9ȆPMb䑄hG:qYs\bm-AS }r'Ugyq̃nd2"չϺ":}r7}>,>jHb'duQٻ<,3;ŀq8m܀kR6UVꡇJU[TXA/ҪeUXf5ظv,zI\>/bѲ3ߌ|/ǩS/y ݬ4OOh'z ޝz|={y (1>';j5Ο?N'oxgRDQg;T*qVK/wNJ%=G;bՌqPS1Qog%n*bǮqQXj4O=s<E NÇw\{ƕb=?2_oR|q+zncoo?|T\kQ<O?8rpWtߩ+ īOsQ_~XLlsL+1_߉QC/~WGZmp#(56[ߊiR_*ᘚV㶜V1 n8q;wŧVLDu/֛|Jf3fsoN<Z-OZ-9?x ("ĉQEݦzmJ=X~cӚ>zvl}?Ӄӊj^*3_bd|,kNlOձ cb,E'JQQjF'{zz104ިjcGc&x2~nG|#1>N+Esehw61b]N57<(*102#by|K{ߝG|&E?gq,&I̋/~56oipd߾}yj ;|7V.crr2zr9FFF򸫔#{owJ;g3/(EO?Zh[)Qk F1WNQ@f˕{1>@m{+-w G4X__VyNg_'EN'RDOOOB(R*m<$NqAѹYEJtQ|g n7"bgƹa}}+݊xߺ}|&7Ώv:7ΏzMLvssbee%/P5RtbaZ\8F#KTNi4Q*ʕ188p zEiln\ J뱼˱cǎ6zu!"y`>r JӉpbtT*[ٌG}$fgߌKyTh6qCk},phb߾q~zT#t"Vڵjbjj?+Jĕ+W̙3q…(48o o߾[U.cff:._gϞK.lw׉X\\~86tz=v?^}8u8w( pt6ΏEݎr@W)fv;VWW7ӳnU*Fuswr_XYYۀ-P*lczz*jވ("C177׮]WpϫT*100OފO~r6~hy|(/wF@W*"jZj>w]˝sgHLOOe6yW kdxs148Jy:1>$b|H @"D1>$b|H @RBRF#b._<>N;1sg<#y.!br%<g^QeJy嘙c1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H @"D1>E IDAT$b|H @"D1>$b|H @"D1>$b|H @"D1>$b|H v,0z#F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d| <Ȳ{{},% \fV! c*v!E'TۉQ "lp!mfՌf_{z1Hsf$49{}?@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@A1>P@Aw IDAT1>ct?pwf#U5]2zG3a'iog^*9PMcƊ ,u-?<1>)ӿ< mIwG#Ce-<p<Ƈw^zytb|(  b|(^xȑl;΁,zI XMgLdҾtOt'dzkh?#를@՚ʞ'g;Rw-`?Xk)Of*G=Ȗf9Rr`džwskD9N9'7||{xcd*?MMn^?jI^xxv9>nd#7r%U9ȁGR 72*9A}C5 Um08ӉTUfJU#ϯl:œ^::r9UOͯ?+V<ٸ{4czfs}:Ecvd,\YV+7oéY׿bN:'Dz~ܹi2~ܼtԫ۝[oۚY s˲|3I1mv-s`t:,Z(8ϵjMgyd9Z#~2" r&Fm}wW&ss˗yK:/"UYߞhp]>wmY=o;M/ίstTSٻykӻmyf$IZcCo'9k_`uH59}4_sIq'Uw]+OW=jNgtщfZiIZSSkdbJf3cy;rxъ ;SƵr÷~O~"Yz3򊟿4m(`A%]@v]yu~usSK]9'Y0+mOxg_w1ГcPZwO/=r/Kg5[6ӟ7Vl6I]{g>򩻳sI~WMg9Ė_ݓ~j$~)9޳%ʃy;ʿzeͻկݞ|+3ݓ ߾*W,IG5}[榛ʍ7{Kg1>6޺+qU=;$rll{9C7;gy_їWY|w瓷̟*|oCՓ^;xmf~k,#rE/ϜZvnۘ} G\s@:jI*/[ݟH΅¢ܕ]8չtMhb#|yzj_v@vo[]^uY_+s|+}㎬9-y-g>7K#WVjYKK'vk,~<<ڕ7yWeSo_wݟq|gݡ\k$i](ۏ|s_s;})g֕oοge錶h-ʅK5TG廷?{wtƼ dA<~\yDNO/pZ'qd:=^7 񓤖YKW}*?+OhdŕOIRK%ȝ۔'{u)ڱ?n?gKf;jUΟוw>cIFvڝ[[ҕhY?Ijte,˪#㾽k<{jУ?5476!~ԗ[.~:OZ:skgFg3>}fXvaפ{'?]\.[Gm33μԟZ,Z27+jm{+IRkל5inߖ[mƪIR7ߺ1n;Ѫ;f2{BiP˲峏Zwp"S^=3'dO\WH#3gpL}pfum`6j%98C=Y4'=;gFf td#k>kdrw[[yo)zn3@YY|mԲ`ɬ t3pVORW!zl[|GGr/.´ F-=|_6sn<~e&ީVڗʞㆎꘛ 399]{'rʷ,Hv7ҬyN܅ufʙU1T9rd6?\C0kG3sLO[5hyOMtp\CN/!m`nSg6 <ť|iC?[F3wtO۷ֳx&8V| u,l#+/C!W,+˶-lQuUUMYu[F"SgׂA!q:Ī߾_bs[ocq1wо{7yh7=U3|F.V[sNCmR3"""""0ΰ1ʫ?t3/?7nZ?(Jzب{3;ex~`r*q7#OH7R}j~bwm̿f _c2 X쌘;wUY @Y97}|yΙ?R:}d+_A_ô/KFo.Gxj-Q2&`u0|dph/ ܥ|?LV_Omϒ/K;&39xa4Hm<,'Hf9l8'M ;q"""""FS>a /dJcV{h]S'bꥱ#塞؇_"X{MirtoZG3tRPg x{iPZKD:&9No8(*gLCkNUy1{0^8dKnX3.SL3*F朷i)-k@oRDDDDD.h ㋈Ȼ1i&eW\dê HdWfq1s8SE՘ EDDDDDDDDDDDDDDDDDDDDDDD &o"isaϮEDDDDDDDDDDDDDDDDDDDDDDD ,'EEbyd\l"""""""""""""""""""""""uwNID;EDDDDDD,yJNۺ!y2eyR_DDDDDDDDDDDDDDDDDDDDDD}?T8IKd""cpw,N*y ㋈\|...70\ǚ|v\ .QU],""t.RGe٥"""""r HV&DvmϮDcװR_Ű'""&36r6飻dWXz`Qgݐ]-"""""o@ VdvhmǰZE=ǭdWȻŰa@W#ݙ]+"SF4{to ;ۤهP_DDDDDDDDDDDDDDDDDD.x)qe{T`-#ED9"y21.%~*9"""""""""""""""""""""""""""""""Yɢ0HEDDDDDDjv IDATDDDDDDDDDDDDDDDDDDDDDDDD(/""""""""""""""""""""""""""""""Ea|,*M(J°wpZL}IKnd77bf%& {3D!b) ~""~b&"t\d3I:E8#OH\<+d NY1\m u<q&`1} >=w25!?Lªxdo'jXTL|Zss-;Cqlm؊>:oL$blؽvձ+J|CX F맓<}9ˮjꍼx,H_^ɧ'aW?n^¦X/3i"""oM&-lnaZm|yLg 'cn]2VrKsܼp"rޚt֣uN400Uqť w3$w~z?P)7p7ה:+ [\Hipx}|6y~ wpZ, nGlk Kf 3>tʼ?Ktc\v?n4LՏ=Ψ%77̃xam'׏#nrlK|h6~zfvWXEŨܾl%SǏƓֲb[B)L-`ql xq?_&6֭[=B z$>r|MF~5ձu<0-vokfq5̯y\TGDDDDDDDDDDDDDDDDDD䢒O=xmMT+fov*M(Hpw|xx\bi:,;\#:ORN*o_Dd0(E{{ f fx{*¡C|jbF"ÎN/X/dNĕ#ݍUPcFs˔\r&~y[- ;G' o9d&؝~&QORʵ3[䗐k@k2Aoa|hn@>}3\?IGA*Omc=|Yj{R_e83|Wc\d}{7Xjg 勦2E&<LgRi:{'m̭5yx-M "o;.d}[_nYŋS!C< ֍58N,^t Gq7ܴk@2/Ho^B@Y'H#tO99tf*N_ < >l ukyyH򓿾7,bɢl['@'u;6r+I3Kǐc@4cd0L LHLTd)D[N73j3O&Bӑs2S]9$ش<桦+*5ku|qհEކL<kt><Am;wlw7 Jpa/S,?jeVo~۟+*=YW*""""""""""""""""""7_7HE#6voO"ȟׯ }rh6=H`|i8JR䉎:6/`@pS=T8~D$攉W/Q3*;_tBˊ=2c8j\w>8cNFػwN~^Cb&"D֕ Y\2fac;긪I~`ljK#aۥW ccN>wc2 w&̶];xH/K25׉ȤSYae&ܼp݅38=9,>Y.m6;>-Ӵe̘s8g,n=PoƷ-yx-i^G7C#o?&""L!YB>zˍ͂Jrmf+G؝&R}m63|fR:Цiw=Ɵ[}S龷2~y/%P2X;S?ɝog3&M s'W070'gYٔa%|9+woʆL/\cu p ߹a2> 3;!|ɔ΢ެ q#X\7?s *<3\󫗸3c,70]yeJ0 >K㼰bw>_ϼONw/UQDDDDDDDDDDDDDDDDDD䢒๽a䉌,7wvc2{"r3/߂bҘL8s*I:#ܩc`B ^HԐ G\NnRkX>Êp5=vZczJs,fM`@j0y84ٶim1UӫI8L[2']/!wՎic0/`fH &2yH_ #Gtl>2r `(.mJ%:x~o3sy0;84DQ8r*7L h=̾a-iAm禹;Y}o]n?ƶ#mEc@ Lb\;G}8H)\>D_1%3RaV"K ?=˃}&jXJD?[.Vr+YUx!oM} -93e|t| cxr+Kih*|@U۱ Y0c6_ W]=YsLaӅuWMf@+eqiܷo&ϔaFc/]40ΜcD[^L rNb-Ą wxDDDDDv"""""""""""""""""""!33R0 F ve]vaFi^`P+>d:;,ڨ MM$' xl',?ؚh芒19`z*5&-ej\<xp559,0KuWօ>?xG)ӪO1j LY9x`kvL& ѓP?M(I 1OV͌"2^]INvG ;c*J1F9nEDDNiQ87LYSef}0fprC#ɳ玲(-fOΛIoO}<{2(>WQH-M0$IoO'mQ*f(/.$`acST @' {|mH7YJ*gG[hon̈́7sIWO2;vFͿ;$D4g?1o "UyU>Q^CW3 [~55e[{:9,u/ǒP!A!5r 1:ck#u $?Koo?}g7xJJs{;3,̾k=CDDDDDDDDDDDDDDDDDDbI$` 9M䎥 }@vڙp6<Jn }9vYdϰqذ[ HR4T j3Gd`0eXm3bXl6l$dzŒɐN9T󘘘6 $) M{"Wes;M)"4\wvHۅb>KDDL8rެ EHH՜dZ 20J$$)^7&IabF Xisi鰒DdtЌg6dD&{#zNY\NkgL4F(c`yg/VO$̘X^gohO$$Әa`w:p' Hɾ)dkPv[fܾ?\/>2\ވI,.dbDLη3ˉ|/5D"Ɗ'6`u?iEγ9ހ2Lz2 I3:e&I6U1p8,h %g\8N0bbXp9OYÁf J0jr &p08 pm8l6b9$Dp{\ζƘEɥeHts3.#٥ 6q[7c@ ӗLqw;Λ0ͽAS.ح\ln%>/pga=Q⦇Ş#>U2-&jS ?J\qw˾xGˁ8gSN\4MΖzWn{q2-鳭S.MxdgYYBL~CᐝˮZƗ?8؞v]sYr 1E;il?svВỊvH?JmߙU\* ]ÓKuɎCgt} ݘl)nm!nAx(iONDDDDDm~ًY2O2#%vnǁ33: f&C*cblg15eo3pmS*3E[k;x+_2p2rG/﨧!v*ef4gC{F*ڹ QCv53 Zއ)^ǹCZ9SQB]{X9S(}[|E.g:ƇFLŎ˖&zƘ;hmN=&f?J`a'ʃ}IihgUm# e<ɺm7uEDD.%F1o#rx;+yD;YAg#ƍd\yH!os"]tA4Gv|]IxbK;>Dyf[Gf̌Si?zIury\;V辮9s6gGk"]lۺ5Z:9sThZq6n;DйS*5;85bل<Գz:ԛ ;^ĦQ2tk>sf gۛ2Mvp+jCrFxr[RR]R[dg>!ajjaL"-iw<9Y3ųr DDDDD’maym\fcmGY/JB<{=k;rϚmU#Aclhl#b?۶={׬s|#.![ IDATN'27MRj4v4pWFE:Lz{Xw?\>t4;O?<~_e; yy>sXp4#ڜΠp\>;ϞOP;~'LP?MQ~ k&q96pd7ԌaׁQ" =e> #VN࣋8v~yt-ǘBH/w0s5yocxXl{O_yxs5VzhvEj rKq|dxz[&0ȋe=M"̄[?ZOe旺Q8x*J\{hw:>!\m?O{1܏- 3'aae|Y mV(;/}JSԊYuc'E$i|tla8L)_8ó[CL7dzIK:A_)7^FM ?CzWy57 &ӋT~>$P>:#I2IT2BgwNoH2o|yr=5^vĖ[Hxp g,WVJW> )B1(;\w)W fgg Tr?{k7 -⣗ wpHm?n!WxrYr"P:r*_F&xjpD`T& =S{ZOoY0TUUYxOďB8yS2$}4cs.ȥ2G&CGNQ$CK4M RƷ$i%d8(!pZ)CoO)+ۇA4Es \J\'$ :;h &|T3,Nj#- 0#l [^M, HwEY^>U~\vo~vғ4Pkᢙ?'e  IC_ OeA/u0y?ݵK!9x!2:A&K2 p(dωՀxM37Z:XKa5o|æDDMC0\Gw9לi졩J )󛴷R^$tvzcql?EcydAↇ}qWwZE ;q !@ n YB!H vޫl[63?$l-~?sLSΌ9srzoEinnfB'#&ZfHJvk[!.xMgk#Maq d&s`Giilh=ڈdL;Dy]4>6ӿώ;X6pƈ4dmbGm5bNɣhHC3VlP7G3 >5s9|8| ,@1="""""`|Xܰ,CgH~rD$xz>:J|<ދek<.Jウ?czh9^E)%p[wRҩy&}g6a5#4#\N.gl :D]˞+k9e8*bF};ȹ#~߀MS~yoPps烓 1}Z_(g}<^Ϧv/?Yxsvq~V}KxO]_y?&8)7;FcgS308󑊈{EyG.2s1AiY\&1kS4-mLap.O8bvGpav/ +7qPA #2Os d{LyI*4oPG"C39L 0l3a cG?Eq5 3H)IԷ.f;RR8aK. o\2W u ve #s/sf;yc'.ywP0PX0#1';317o5ܤ18#36Ȼ_\P>rO2-EDDDDD.' l8IOԜbN2 ."""I}cEDDDDD]0J"""""""""""""""""""""""""""""""1\ """""""""""""""""""ˉDp6̊C8qYDDDD0\^ݿ""*cSEDDDD/""""""""""""""""""IB-~?VeEby/p8bSDD"pY<c3Xb%,g5F|2F|J"9㋈{t0Cpy"y0Fl\$Rd 88&(_DDDDDDDDDDDDDDDDDDޓ̎&B5;IE]̶Zppx7],""+Wd9 ㋈\7.6"O]$"_hCf`۱"""rRDDDDDDRg8bSD,CϑȻEDDDDDD4 T/"r9_]KS\TZDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$EDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDb(_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$EDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDb(_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$EDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDbbDDDDDDDDDD.<ӴӁѝjY NDZDwht˲Leppijs`cQ .NR$1&Áĥыζ-̨pT?mFy6F-lÁub{o۲8Ll$b6ib.QTϘ=gLlecfD- {`6v:u""""""`|˜tu4DQ( xw?zXEԲN0:):-pPi@-B9Y4-LaR@˄IL؟eZYáx0L8pu0|h.K㙈\bV-H?Ro&GcNJO|OZr& vf0<+̝mζv$$yo*N*TyG9:0I >C8cs˅cv+!Z0) HDصdۓ=q,#ܱ+Rům3{,bS9FA@.}acntEi [ \y(oXŻdJY!i>{雬kIdԤ3&n#<fW5pW5MTCUbl`ŮZHdB^ɗ*"""""""""""""ri 6pkl-bƑAHquig@v&e;ubì?DgweAdtԲCG[`NRRRVKYA*FzvW`] m!"@+J#a]lnvɴ WK;ؖ^bhnrkwƲ,hed:tevfR^GDDDDDDDDz^VK,_lŢzzyɸ4BbӴ~~ܟZſ#gK$ߢf}YgAB|=7@>edTv1yw <@iYp!05ˉxo*YޡݰNpʠ$M9Ol8*wWMT:u`F)LsS[YGn1$L=&O#r &.2MBx\N}[u6H$ջ8XI(jtxn/2ظ.ܽ6шIpug{CD 7~Tی ۸~X;#s>"#%=D"գTlHuѳ#V մb=3=$9D#Bg& Nיn/G3d{q\gOE$!or'Ӎo+3bυmF .~O ~"!#N\=?f9005mP(r g7bxxvVE3Hr=~,Wb"s?@ˌ?5羹M oXVޔ2- nL۶DMlgQ3J2'O&`:Dӌ <ξۋEDDDDD䝣`|˕kowo8۲1 wLq᲻Ϻߙar0.-6rz5z;\N' gmEٰM~I8n_yv'iPA'/7Sq_6fb+Įxr67lዏgəeLz^z-^ϏW1s(Ĵcvv̲,n'lr IDATgsc}h*q=vd[am XWLcpz)((CM,ϙTGYxǨC}ØՑΌٺmϬϦv/.AŃMYADDDDDDDD$Fs^ww1dNɷ(ۻjܙxOh6<:O-GE'Ɍo[A|^{a.~k/MadƼ* KYfzdϽWWe Q2y5<|0*;ظd1Zuň-<Ŭr1=/ÓOcΚTEqx)Y͍I 4?OM{gbユʜ]U.hgK_x'^V¸I+MΧo*!pNtGZDG+ zE^և?&fQbӯ Mg`$ȖW?^3 @d7?x.He_4$2['Pس?l}yꏯښCԶE 7ILb*;k|ɭ nyޓѾg ?h򃯿/?sTH.'o*&o3} _^N}/5k|`<a`ంX*yr!+7K1<{wlrV__=uN#<ln^ϞC vAy~mW}s|qBGl'|rL_H-+gfn/mT{:IBaWm[4Uղ@-B&x9;ȶlkPƐybhFHڣS\+Ⱦz/_ʑ0}H rǃف?) vP^QK 0B )LAsm-6'Pd&M'\϶#"""""""""'B5_Vs2%$ŔZ;u5lZ4tEɐa 6sO%w+II f9;س^;7WPtngWs0kT*P3;w'p,:[9{//>S/Ii>5l߳G~R͑OͧW@YXZ&|hq%R2l8-*X?Y|&f$`0&34TU}|Y^?{ Oct5`uN6^"_rj39n9 {v_?c%; [_RB'ѣMTEXYL‘K '783p:v>D}r`8&7=6mTTaǎcz̼†mo˨ 1`pڳo㑚& M6iڿ|)$2xh&eۿ5n<r/S^l+W˸F/^,?> l|լpδ<fG+?+rl:=kDlmM]/ixnMIyΞm8'_v_.0Q'ڶI]!pK! M9GĶh%4v?5A N l:SorK$O8>:*l-{g\V_ˣ*זƍWs8+zV[k. ]J(qg2 ylgn=We}N*| VBl+֍ky_{xq.S0)͍E5jM)EC5c"7crΧ\\€q3Cse~l=<'>O{a*#25ۋ5#bǛ>|"ϛv`"nlo=yT>6͈;g73 &5` gzFϙO}*gncݛY3ϯfLdOs:v+ͼgݯͭq8H[ ^zG_XϨJfc[؝4|.>8: 'ig/9[܁ϟJq]#x4럾ۆ%y'[DzB1# f#'/-qVN ^}\qx1ܫc\~<cJXϏs9{f7GBDk]rb7Yב](_T`ٻz1cgX's 2vWyyIwo<0]~r_+^Hv;koe;Cojdx0Ư9` _emk2}S|A+Ⱦeygbh闸kl8+'0;8)~Lh}=?ֵL* C՛dzk(o(~ʦr"up;JbzVg*L R]Uy[YR>AM;ʩypF>>APU#w>:n lw|+Y8EY6^zW 8Q(Mխ-CH`?ҏ_fv'['?WEy> Xg~s} .CGy,g3cH=kqCu l1 9lv{763G?-vWϘExe ɾN.܁J M[S]wL~867l;ʫﻂ/@+ʑꭵv+C3ܒ{|MEȖF>XNZ ~}e)(UwYv* ~$]JY vǍ3'syH""""""''%""""""rٳhgzu iG;F388\ dC׏=lN w}v)+krT|'eiǟ^]kNfΜGeܻ\= >݁]i"@4ᢰ %;|:\q5lAf^.3ez ҡE vGhh력9ᢨ0cx ćMcc[8gd[Tf䪒@|f6$#lj6,`\`8&{AEDDDDDDDD.[Q^yc7d͚@|OZ)7;. 309۽?'3;ˁ)S50{K9K4Ƒqy%L/9ߵep`xnc&q߄\M$0vf>E{P7@Yw^-E] =T\ܚpSvd±q5L8Saۛ;Os,&{6N纡]A|xlZ: *)6Ə݁OI>ηVю.K 49q ˫ op(4l N *X0ApXJR˸!$_'q'O~#P]`;~n&Ev;[Zf09v#+8:;cf[w `U7o0ƛ(J: nL7{٣S6{Neۤ0f2Jd2" -r09z[wV1iN<"1dw9wQ4c:Sx3y8Fd }4fr$d\`|m|lR"PM[ʢmx >/c  욻?WJG>:m瘳j' LO>/ Y%|߼%v/_}(gqD:*X!nxt$qmIϘ+WMdJiW >+>)׍0Nm]s۱c ${$`xӹ qF8~ۚZ\ڪYXT}c 7Eùk?͢aԷvwSP4 Jk rn:Z'ٹ9`d,bGE:xM-L(9?IG[ƶ;طNF&0v|! N8y'][Ģg&}|T~ R(-0H2"/DACm5gyn6,Y_o6׵q]\N]Y΁MKG;@ӻ`Di F6vg' &]~Rb;N .O}MM"=`wlyr:$i90 p8kR=XZ]kRA!SqzMߍ36j6in vh}r>ECaڃa2<^Ǎ'-R[ߎ͉ x%s;!m7fz`zh8ʦ ػM[QUrJQǿo ̼5ps7>)rI>)ہpm10{aN':DNA{đBf  '݁7DCS'6Q3캛u|҇OYe:+IR\ؓcM'/9O^|6MmmeRy9ym0D.ӂlZ;C@rb|wAZ? Jk(Br;IDT IDATO:#Qx?q0v:!" aHq*$x=Ĺtt<\r 3J# 9x7:Ċkyz.V?w6&Ld´a/M7;䏿a)Ďa]}~r!v= Gt`8 I4&khQJhney.f0p؀U%t]a׋wq\3 `o;%J"-XXnb;ıIMy$7M8N|8$VJXEH޷ %K$33;sf=fκ{kY.7JNxoRd[rb|6a')kimTyrq297ǜIJm0ҮNXQ_CVShM*#aBNSX'ovm]@|= MLș&@ yCafbD;eXL f,>vOYȿ|i6\lwsWM!8=.z8 0 GG;&NavS40~6a:ljL#3Dà%ˉ> #m =C6Ӷ_RM $#Aǁ1Nm: fDb#?xZN/EY|9V 1MH{ Mpa"sL ;F0.01BNY#9|P&SAǢ*f$m \-c47ёNj':6Nѳ}7ol$F# YyԄoc;Ρaj SDPtFF;t>g}13Wg㌦m1Ė2jX5_>v;AȘcmh"Y\ʬl,]<g<®o8:+ζR$O: Q/z߼Ct쵒֦p0 LH3<חpqN֙bS)85"4100LH|-D]daGNM>U3Ҧ7>m"}mcJ^w.C݌ 3|nҞmg_n"j[T}/Ça;m%_B\xࡗ{;$C -v68Ylٷ#cy+A۫[RXTLYCde8N2OL%>]fyP.xr7Y^ʜi@*I_A8~"y 5E pW2gd/E,֟H˝΂ϫ؉a6? c>~|%GGܗx۩$#CF%O?dt޾!"g߅8SUǏ`﷕ѾM\LG;j[k"<w0Yd[FGf$~LZCC E/w3(%`MCg~ON);i>t7bgüpA OLfv5A\=m<98cxK \fÛm'829|LJnwhLNY22b<~ۆOq2!5O6rl`|;g䩕fCsI"'g6]͐]V,wԳ,Wvy`k])"EDDDDDDf[t;ĿzGs5sXI̖^ WT0⿞o|.}!!Yn|\e^mX'ύa:p]g 2DZl;cJik9Ob|qz$С<0nD<;yYe- 0\Ge<ɒB}IʦQxIDDDDDDDD?,n~l|Y_?N;pops= ʤ(q0FFU.;`1yv7=1sE]|R~y^~6)f O`LqWbmU'xMl?a3\Qkmă!nO :6O6{1g2)n5w=c~e/$İSģQzzzHֱlJVCZVU6Xj9qÔxoc"03mK#{\>2g?z5'%|mMy>vbƭ/ɚr ,8 z?)fG*ٷL É ၽKfrΩu]Er~IEm,- 6Rt6qG7ݳyʭ[GZ7BA}c3}y+kkk:m߾ ^MN~6"/p7W>u Vpy ~LA~ 3=߃Jմm3I鉛 ͛{>2a/N&1MUť8}=/_ Ryg^忭NЖ:6J xl?6]qvN⸎tk+_>@)V~ȋ7݋XR;\REuQ3S毎S"2bX3ӑ~ܼb/M[ع7Hdtha)|da5SdVVD6|E frX 0o*_DDDDDDDD o| Zy$g(Ep<K?g+Xt:;#vL+$HSzNf+#s=0Ml#]Q;PY53̺An<[VDצބۦ?A P6U~v?(> o0MAܿj 97>WydRÑψ'ufٔ tR|(.~palP אs rêilALL B}Ctk;r)7Ix>,:vZOpm)rDil<{ SLæH#;tc^27{Ǭkū/vQQ'f;_?ʤuI{?Fi=C2uwƧWּ;>s;'x_I '\?Ns.f5jO*%x{;~'l__HfwXn{O8-fJۏy<$ÈfÙUnI$&'o?G p%F㴎Y~ uMTs-?h^%+Q>wfx| d<$Oph⅋Խ70/֕/?(|o#ed:bt! co+D^K}<ˍ˷5rJX} /~SOߙ`x8{a\hܱmt.|3+.o϶+/wPQ{I͜,u‰/'#5#;{ᦲ |yqeq*!,i"щ(3F3Y|>|<'/ sTG;>R1 Lν aVޢ~y{t=↢"fϪenɘP#k8Htj]`a6X4= '|0Y=w$߹cTnz#Pf4pm]; hTv?b^{R Vr1ZTEvG&?Q e_m=$M7Q;%s U{Kf?aΦn{8WͪR̯gnEhLߝIAl>FmηAIԙ|junI-ry]R̹әa^U'EaH 5cWc}1i0aKTSL-[i$eՕ,fc\LWCyY4'I (gb@}7UM32`6sJޚ sJ oG 9Be0g,N YyQ=rs(.f-)u,_NxLC. R3gI~/_Aɭ5|x~֘A޴Yd`]X˝T1kœ,-|* N sr>ho ,\Z]&\̹.p 2ϤʘgɺJ0vIa&<ɫ/dO :#$p ΢3+NMb>rvW5O}k=9,q%#ԭ(4='kS\jϬa8e+-eiM"/:x3KwE 't,+e9W:Q?Y^G+9(+`[G/#18UdJa! v5@V!w^cJI{:錦p,fFIce0PȺ% 1ݝQ'V,e86olh"'ICY CK΃o`VS;FY%%'ȶmr[Z͜J ܏0rzx,4ɴmn:|0EV]ݙ;І_3)5ғ`X$<;H$tp;&֠_滯FpOeYdIύsZ Gx^|B'>£V-vbNKZFm"z Eb'9Rr98͉Kd ax.^mK$lN>ׅJ&$lyr\=`}\"""""""=Оh7Z\]&϶I$Db) d6XX qqΦ1{O=_uP-YfHtq?)E$%fxngn[)bz^<,&~F IDAT[.>`x$p;6X|m` ^L#ى#"{EqSDqq G9٤ "wJrDƔ_Etd7cbu2 0|N%3J1Hr@}L&M>{2,+ht 3L|~.!7ax 9^az\-$R2L^i~!+m UϹH ņ<a<60 %%:yDpNmƩ4Ϧwv:Ocu{^r0p&ULپ3N{'Ӂ?ޟl?z-M-eO`&nlǿi"Q7_J}IFHן/zI;y=OO<`g>')t7dd7xJ'M_ c߳axݞޥ q:]YlxdN fsYSC^|tL"t{LI;/xx Y4 䙈L'"""""""2ljK# ڐJYyLeY$Syd UD&>=xzWl l\qEDDDDDDDD>p&ҖgԹwq\eӴgʩ&qZbـu>v+ *O*wߡ.^'Ub"Ș`٤R fy5Jݷ)_z_OI^wϞH9+rOy^p""""""ri(_DDDDDDD. ge˗lyzEbfw.}ȥlB-IOx/1?13=ADDDDDDDDDZYKW\b>NOass^?u//{g˗OǪ3W1/*?ʿݘ].W7ܜ0ȩ_W'|8]N\N ?Oy*NOx'Qv<(iLpQp͝fi|[wM|yX{XK {\ c ի,0 ׅ*[ 㓫Wl/""""""""""""""""""ᢠ| |K~e&E+Nb?UjY1Bw~"avY/ z):u'Neu.5\>P.Ƒ(""""""W㋈|P*ņ ņ) G DrOz.ީSDDJR>4}\sڊ\N IL """"""""""""""""""~!!@z\Rql#B*$ҹ G.""rV Of]f㋈\"7{zL3-UD*}|θ=A|Tt(}b19N'Vb #}Ȣ}}wlNK-QRUDDD.㋈\Ka'DzLPyr +=ID#3*PbxbĎHO+ XF  WDrI|93a#=IDDDDDDDA"""""""W{7$do+|פotXDDDDDDdR/""""""rǶ"2QA`hU+Qifo1">$#JDDS0U*ڹ}?öI"27݃'T3ȕ垁׿LOh- 6fz\\`= y@pm%""r hU*ڳP$q0;=YD5@2&/"""""""$#lj Ӊ 'iň A GzL=| ßYDDD.㋈\p&n431LoZl;IDDDDDDDmW;'}\  ar/"""""NvoL """"""""""""""""""""""""""""""A`|4 I`|4 I`|4 IL """"""""`Rvr0 0e!%94DS0#LfW;h"2BˡA %=b`O?G:fQV潽D}Vdr("""""""";A>^JJBdlܗ"\,|-brNV! 8ۮgj(FFUe{~" (jl;A{MQA6?T"Bsq־m3:8đ0a.x/;ddg1-%dtE]TWe$"""""""""EDDDDDD䢳I"8C{(p$ lja;Fʶ>p{) )1#?}l!j:p`㛱^5]m'Hk/G{c$l030.d1@%JM040^uE&Y*s( {LJZU A(/Ұ ;k++gD=/穽j]sJ8mk[_y '_G}?_RB+v4Ź<Yϱ-?b/4<;Ě_]6;;:ʖgg|9Yx/v2mydS[~Dwl=#\&N-5PH_.Mݷ7Z SwwV2I_(I+ة$'x}<ۉr*+pYR05)z m1?r'Y!MbhCy7{yq{æ ǁE2dt"TYGr#]H1~íˉx}T|em.W<{p=sL/ &"""""""""P2gCvPu %9wlсNr^<}31‹T-\;Ρ,#}g(_DDDDDDD.hwV~OA>KW38H8d!$00ȟ5? /X2?T}[v`@mݬa3ÿzd,>c[󋇶Qu5=\RL7š1fǞ9đa'9.{y[ן53P"p0Gh=n XUΧ~/l {,˵LȾ"`D>,`sZfz>Zf*'},<+?"B ]EDDDDDDDDDR0\vg7R0{ocqu&!@Ɉ\rJ1.C6L/ wv^CAw@|˲HlL3-=9<ěsev6d"e:p9' m;;r`VZr22¶{yb ̍gR^tLgӻ+}\#|v?xj~ssYsM70=MaUkVq! y7?\tn gҰ<=$0x녵IⶉmNR)ibL RI N)l"io$)N^[& u9ؖE2icvI$m q 8WҩX)Rqζ)R&4nW;L$q= 1uAzʙ޾1C+eO=6:ȶ׻,%y&qX#qb)pjzViۤRgOIeOٸI%-R16a^rn).9ndؖE"ei>o0yv*E2ΑE,er9oh$S']N+e8슈EDDDDDD"soʫ޻pC .7}tmZk1y dVVpp nkPgHv˦g;S}bC}&E7-`iVc]lޣ$;/fJ&'e禃<2y7X. Q]lڅ(` >V}3Ys[wfoH*|a,sp_vE_aya/,[7e1mMKL rfE U$v*Ig1^z- W`^Ħ{6YlxNskEX}A6{ RwM-wTDhh=ۢ[@IR/a0s>ԉl 좣/pWǵײ.p6m<ڸ|yXSJ?w~9""""""""Wd,¾-$Ke])XXC<-%~tGl\ͩE9xFGxc^GpJeeE3x}l~:$m sʹqNoMk'9zwFn~8)\^[ ?޳& EwS7wp}є7触Qtݎm8mpxv*S|_h;:Kؚ`s3X5&^DDDDDDDdrm#jSv+%clxzN$ǎv12MZt?!c&!2m]luG2Y5"it4pLڀAGʣo R&9ϮGymo}l>kDzx#?!f@llˢ10gy>UsH_>P/+xKȻci>/䶹YJDiOA*Xkڎ}6lir g:ncd`wQgg1qpIaޙ93Ό<:m=<{HoWEɰ=<!fRP yg/[[ZX:Ykd⡽ʛY<07>s[} ׉s/ &E'JXXCdzl=!Q1aU@zHGH=s1b<Q 7†gz Vy޲_V85& T ׾ 2%~3(;v>r.7 ng$-Njhc`WI/A¬<na,/pȥؾ'kӷTzn@;_芒6;(+eO'n]* 8qD Rb1oZPHGGxbC5˧pWoLb(gM16?s(m)bqڰI:t.w,ojc|PoMK%co'E[NC&}8Ƌ{{"KN|b?-kMyv!@wۊgn?25(m<Ҟb8鉮CJqO3~/HRe"9=<}%o=ea=|~$x.J=m<Z%p!(8vL<l|F#{?KG|n^\!B!$Q!B!BhF|} xXz)BnJn͎G;s IDATJx2EU1+6GޛъaZCӨ]* m)SzZ((hLcE,y2;fUA$رa;<T*az*{DRjz`O1\O7Ł[8UQ;Iϛw%\ä@*4_~~?.Q{G51G]sL Ů;޳;ɁN ϳ_XP0q={>;dFF㻯bqa^%-|fm`1;fkq{{l_>3IAQ*L F(Y8 & 1ܼ|S9×~};5_Yg\L=m,Y4" a׶|{#* 7t:|]ߵ+J,Dzٯ=ހ?p ZF?f~{(;fQjr)>~&y2Ͱx45atᘍS9)lnTg#5;{O|?B>֏gԷuqMkU'>k0kN!j\l`oF2ô۹yII!md Z>1&la>@7?dּf>VVY1ap|3|{xvg;WY6YP w,m )vI>r?U0ݲOO~Jn.\];U>^wl_~̹՚ CH[hoB!B!⼼2{B!BנGttMuq~!G8k Dg_@X\ޚ] &բaR@QTfV IE1Rtb3fŬaX()gQDŻM,T&6~'V3gAfqZMX6*APX*ŢM> b8&]at:v~c=?zGy~A񭇹>A?ycGGƨ_:[2OxUIeR;e3ڴ<)D$F_ fUoif~Մnq< (cd‚uy)L؝jQ9jc;VʆjtsMeZ߼[g;qXMXm6Zne2cz@~EWM{i"ChXZ=V2D:75T&bPe1f<=+p2Y{U#WwͳӋx&c,}R޹cE&W[8xτxl޸ȏ:qb?7\Z{99*:~/i4WX4, Ou-}}\4̖@&S J޳ԃjj5-c5n:Z4fbl2YCUEޢa#и+yb/^ EäNTo5;XtY"7/ ̾tO=K:PnfYyޫi{λhK Hټ~ rఘYj6 (T.som`ӄbfwڥ|Շ>z<=F6#m_c3>Byݛbv{X{Jk8k iuKJl-&l׶ ~M3W8'LݢE2`lIiљ"xp$M"# IHH~3?0Hw<}q K4jnmf-ʱ01W^W'!B!Bqf ۏ尹\MZI_4Jc^'ivʊ 38b,`:dŶ4Xd:G6gK'Ig#GDʚҋS niͩe}c:QllxrnSQhkNbeNS-e<ו2ߥ{}: וSW.ji4WkvQSaCլ|C:L FAY)uՋQzƉ^\C# 4~ڵwWsU.g]9V6؏: K 'Spw--(.!B!BqB!B!.b34(F`dΜQ g{{Y87ۗke|;ǩ` 25? mQ"0& f0-[!B!B@'΂zqbwQk&>W)h uzq*S4If!ں#cF]'mئab2Ƕ ~Egl<7ke" 9O3Z 0kY:7d4aʻ݂ib g?=N`lJg_qF&Ipf2'.pi^z rQ PLNL(xUHPrADӁo`u8(*\TLYBHd0, Fu}+vBau(ҷ|e1&hai xf+^{,ʽ{Ri,Vf ?/~4. jA%ZhS8YH*/au:ñV-t9|S!k* oP͊+?Ώbn5>RU00UN]_Ɩ &`$P T2h.jUr)ǒ8׸po['.o3+B!B!#B!B!x s#m)3~]e,maS}m}8418nL 2LB!B!x }rLLEt (hgo|JOӶ0߿{\V’n 316D o9֨2u39r ʉ.wLƹMK蟳A6 &)5aL,W`6M!|5PEN7ța*i]**&KZoLܯ'47==8/8}=ձ;0͉ g= :y_}>?i8Y{ jjrmx/y"Y3wPG 0Ym<cAv QP;en31ٮ2',}z?NμkE|8N|Cє>B!B!gp)>!B!2XֻU[۟bhaӫvdjE=;cV^͢gɍ yjrUd%pο_( 1:$r!cNO(i@7]LDV'o?9be҅.*Ǘj?ec|7zis^r$it=C'H)8]f,fT;E~P$"wS8 >0&a;i}4BZdqs+(V3N 3GthB!B!83iŧA6X筐Ky_Q]Ɏ!;o2?93cc'ϟdMBpj%I(xe݄aB$IONH3ʒ5m D\~0!̐ƂϥN yJq3SO4 v3 # P{ZpeB1S6aRu`6`Vrē)bISo"l6M<};碱{xUx,sQl6uQ˄E?Gcc1Bė׷y]MLcT[YUj9ESN$"L&E8?(a[HfPS_MUu)W-mN~zNx+ܻ؅B5C<=P˜v[i]`g2 QXbsX+`u5L]uT͆3//h>`e-z3G_%^!B!B\\wB!B!ċXXN1Y=* fYep\qphe>wbF H$XYV*D;=IQ@1 t}'RXJI4‘QS1H#t zxv[Í|LYr2*J$rѨW) 0Éi hF:PqU.\T xD;Hes "1FjY;Yc1FϏBvcߋN5z`qR]cy0^ B!B!e*DCGcL;8[2 OqB}49: rӖfǣ0hpJk'5['OU;32Ɓ8IǒF.ΑGct FIxh(aX΢yTCw`簾92s@usx)fk=pdkeص{E.Ӹ]H?8Ciir}U~v~O%;Tz +1bƇǦphG'm*K)ַ %)v1o"we! tNHL=[LC&Dcq䵄u;QuSGtVEY=aW䱨Bn^R#5̃[ٷX rp9Bdt^L?|H/OI^60ۋWuqdzC.k+Hlg~uB!B!LCB!B!M{[%8]&fFCm!ӲtxCSHX8&ctDҜLcT,36pH*;y9 c#_cyHQ8I#&Ҩ%깪^g˦<۟3vj*4//a*VʁIWi)+V0ڍ<,ŋg.*5RcOC'WKɇ` R`Q@c n%\,h~)Y&lVx_䩗Djt'=iRȍG?<6R+nmTT VTRWfき|}ctFHH*wK!B!B˘kQcq2xα- OHB<;FO}ýo0bwTAc&3 p<{?UNy5׳©ot0EEE5^X0tzyh m|owA!g`[1)ïeWr(aPj>k<'^xQt|E{Yb675nje!B!Bb!B!B F zP71r/5a|4DGɋŤ ;b]|heT{M3$ֽraޣ9`^sYdC963\XRহv[OcUXRȂn}_au-e˂&'*+Y\vo }4H-8~n?{Xz^LqG IDAT ]]EYSN)KH([|$=!4)]ue@+)bU=O=)ڏ2d0{XgVbJ=ž+c Q{!w:߅P{ ?v?,*e098>vg0?BrkEy _m%]QJM0 pp$MUVkWi#;OhDMcIL;%20Sتe"0f4`ɚJjh@&_aśs"#<o4Z=͢|J4UB:bl,X$sJ*3H8t$k-`2R']kNi#aFL.^H_A93Ecp\o198Y" =nf*ZX@OpdO[mKW^V_]C&8/Hؠs%{chTN6"J &HL5WrJf-/q1F US !B!U!#1dGOѼ @a|6yY @] zGI[xJ/`Y#M0FK˨ORgAEU457LG,(3j}x '2⫭mo˚+2?>Ȧ]1o_= t%T(oZ p]hhT1QXJkt4P$+[[X\je2#Q2sg3s)ڎ9'[_=wz'ɀp|w;Yyb60#IFFYh]Q˵KT'&J2uMx`W}[UWU ed(̨fJTر F"F[O҆RX\B9=ؔp/d.(//s pRG2Tj ZOQ:QT²|緿cҹU4&G.R7QdR2{A5x0 bni%zC3x"4=CiYU|1b0cgq,D+*~'^ o*`uI"@=G8d8<) KDFtZʙ[j=#e8:tShk\ĽoiAsQ4p4uל,Z>߽ӂ*(oZVΛ_;9q.eYK1's:G) =P0.7NG8(o]ͭU3J[oBiM5o ޻ćuꩫ΢է 7BupK[Zh:2n&I@U)3>#,o*?MT|E.\ c J7B!(6/jjP !K-J )) K(qS\_60x8~EETWWSOsͺ(B!1~D {ٲaN R$fu^ѣ,ph@ꙃ,N,`3t:e_`|10Hœ`RP`z`ngvm^rAw*B!BqJncЬ~4?:xP4jR6O+t~2HEFsh6+>F~CוQҌSd53^l:8Ѭem7u& r6 >k^/O{ͻ楞b#M04n ϔB|z6xDNiZ4$e\^;wXXf2c>E5FnE cIv =HA*.6{3 oL71HPvPWVbN(f^*a'Ʋh6+~`Jə,l ʧv|% |븶 G8$A9b31tx,XH0jii% gO6|ߍ"{`u)u^nЃ0A!B!2`d=>C!b3ķTk*2UTNv%_/m#35*fWl̅/ܕlN]d8p\no8I3{^SR߅Ԓb)!f*NRT ǁC"(& ~+`r֥̾6;=uT oֺpê[W0 IpG j0BFLW[}ֽn 3G.;v0h53CUM径FM~IWi2@sW.ϟau@3z:GgrsKX|9/~_Uﺳߥ\xP}EqJnvybz#]GJg477Q{ C\6x&K~B!B! !B!QLK_^L -KS4\N\/H4 w /d_ş B!B!.S 6 34N /; ."* hT6J4=tfI=u,.Q4<^'嗈f(/(VjJΕa/RL^nRʹdo>ӹ _4J=B!B!x9WL!B!B!B!B!eo/̼ß-饧=fKB!B!j0R!B!B!B!B!B!B!B!xA_!B!B!B!B!B!B!B!#B!B!B!B!B!B!B!B!DS!B!B !·#lE1緊}Iq W0ݓ'$CAB(,+Ze˶]ݽyߵ7x׏ޕvm˲,ۊV$",q`&<=0 #@.>PtS5!>hLY!B!Xx}f!ħ%>SRB!BaȍB!j$_!B!r.#6ЄFG& !FØjFC&QXgb0zFnB!B!5q 7=<2I)زQ;P\/B!`,BDB!B)-i9rJ(?!>UHB!B!yļH̽}d@PȭB!B!sB!>/B!B|)*ȭB]U Y!K!B! !>3";Z 1 t*B!bi1\D!B\ z)B!B|N.ZEף#B,[lP ֑IB!B!ҵ:ʑIBOx-h}S!B!T!3_} BqI0B!B9H9edB񙤫!Bj-odB!B!X5t=XF& !>4L)FP$`D!B!#SBqH0B!B9gI!LGZGnB!B!8hB1$,M-JQ2U!B!b1Y!WL#*B!B!B!B!B!B!B!B B!B!B!B!B!B!B!B!/B!B!B!B!B!B!B!B B!B!B!B!B!B!B!B!/B!B!B!B!B!B!B!B B!B!B!B!B!B!B!B!/B!B!B!B!B!B!B!B`A!B!B|h*'l' fenZ1T;v=>&-A4L;֑x4Bg{i'-Ɋq:,f8q~Ry"B!B!8.ii thpe$ᔵqIph7r!:h>Ezap{_O;=d,`#u6HONB#N?=! wj*fb4M#kY@>"T2]v.myEP/$6Y=ݴ!ɕHRx}ģ!|D.<.VÅ9tv`MO#-XZ~?!HIN$boxaANdyznd\2C!B|FH0B!B!>FO@ `ĝ"'+a=j8B_@Evb4` N$%RQm5$C. hl觭/f4='3 QV2Ms2L\ʳlhڋyk~w<B!B!B|h}O9#ߝLP9y.HWHؿOs_IX? u5Nzv)LGI ~_H{f~ܳ챗`qdB!lVh!B!B\]F{U /rMGz kh`bP:.w33J|7{ꍹod鸄صrO\KQH/,䉿[ĢߢzX}: 82<,w&_>ׇzG{ͬݵ_UIϟSn/fo IDAT:=4n6D$%AgM_0)UaE]J|5>rN(C]FO86#:ŏ4F 22X6{M/%a N$裩Ox,LGO ѳ -ϞoԮRN֒lLc +-K}Qo@7ʓ3)|m]}DFA_$zv#B!>C$_!B!W jR,e2$oC$Jkc'}tuaBA!{T~aݫ{y4ϗe 0:d2Oq?VrMao^6REן_wT:-lx6hㅟoS4\9tqǴoNd\`X#&(vXVȩ] Y82U!B!B!će3!Q3cNlWPHo`uw:_~ÒB\Pz+_C\9H8+ +en6l[ d~ԕzWUO­_4%y TdgsʘDaxF8A3%Sn5cOU쫽}Oך5'ON[bY^_8&(nƦ&~~&&B!B|a|B!B!!ʭ?Gf]SgAt}ATR&ЏaE؉\;1nCff.-evA.V~llkW_`riXFj=z3|<үX%74c1uK^ah\.1ƫy:6i%` Vs9LЕ^ϥڔ#A?Qq [U]|:c0 M<[ϢƳya*(ӣ:`=02~`?eOޱjF1 +ssn}ץXXv,adʅt]CӕQקB:]D/Rh2QU ]1`E\+v:Y/k0_tE8|yKS9w緸od]9]ڇ}TyA g{bIИ=J}O+zr?k*K(v .]1XT]l6nA׈:&ҁC>t>:|:d+pw\F9ɕ/ chKb _gȄ^̥?ri6{LT4]h̪j]1^gşWj`z/w|4{]=b4XgFQB!Ó`|!B!B\C*(ŀIQj;іN:CQ0IOP3@@6SҘS)n<9X#Ե;/pfdSI%N5pv{ )&ny$b;-9ܥPZ6_ǛiGPR=T*4s1D; ?U4mL,+3TWôwQE@b& =CiV&)KZ*vN6 ƌەB7E1} DuLV)ʼdXbX+Wgav;;Ӽd MM4 j G"YyTdnt5n:Q IFL<jmNfNgFI En jcKso2ע>0[f\V:˖#554tv8HCQK{-= 7p!͈۝JKa-ɉU3\\؆EZNZ}&+Id{|Dug7ь --I)&WP@VKu[0q4srsϽKj-g X)z=@3jH'LK+}>T݅7KYV* [A,mbJaLNe)QP;Ze09Z9M)J`Mtlv9^礑0:{:}O b8HKΠ4'Lp/:ȴh>Rܒ"l NUtihc+m(NO =8L - fݩ0}CimPbiwFQt鎳+F\ I{r(sLaNWgr!B}Иn!B!B9JF k?`?;heޭeT/a * 湕UaMOgSw#aFOQ$/}}#N$a <7eZ XTbgޗf[L q'=g5V3},ة^̊W6@,nd+8dřO%7ˆ _m-mG{ *9,{2OtIGB!B!7=y3n`pXfy.h{>Vl SK#7Q' Pp(;+kWq{=|Lvc: gOIQ=ZHCf1I)ᮯKS϶;ƨ=x`^v N4%frR1T_h-bNz53D:NO*sxGFTTWv4F@ d^Hq`rA'}gi_| 16ˀfjPBzq~i wǨS +Nx/1N4?,nS31xyLI90@'`랍<U*N H29M*65շ0L\čomþ :sl;@;Krr@#j$3?5Ao9}t;z3TB O_oaݞmv8:bAQc I,Yv/35oN-ȉ]vwT̘VM__vucq&VÌbBL^&Mr: T=m@$0klZ8 R( . J,'O TYSDffPf|<8!/"N[QۼM>36{Ϭ ?MoݑN$&UoʓJ'ŵ =#fVo+>di+;٥iT_ϙJ}  |9 hk8̯MV,N("lHAݬj׈FCU E3x%,r+v6l4W}jgE p?_Wطw/8~QaDxfX0bPi>jH1M# 7'1b>Z2I) v^o︃`X~핃dOtC=O7UQcACrs¥3!{/]xzN7t6X_P/܄+oz_\ky"g`]eJo-yx1 (BnwN+&@ ۸M5 fF4f\̷M0Ͼ[;P;lG9= 6#j4?LnfYn Xvo%n0c"@H^^9Y^"o@+k|~=\zW+MND@,žbP–tLǃs3!yi?]/ӹ~L:M5' Wø=1oL=⚊ǔ 6@W^~.Mu@{J>7]s3_=dq??}mɳgip/+N6ӈE„;c 'r7rkk!Bq+B!B!>Uf^Cg'+HȚʜrdalE 4d>?%nf/)'%+<ej׎B5# ~zSjPJy|b><̪WMLnLfHѰ IzsqLͱbGi>qWެY qja4$GJaFiOoV0e9g;lV EL1d+Et#o:oV34ٹ+xՕf'6F_sogAn:3-%5T3JVz:3)<=Ig~y>YMcLN_e5A9cd3…Ӡ1%崑8w_ɶ˟wVP ],Q|"t5BM" 5@jS%׵SWt>3K'@@hwPW8[FYv$Qaǎ`ÕʤnbBWn'%)yK(<6j:wjvz봜5o-&f$Yg5%D"asϬ]ިy9)ؔ81K ^ F\}8>>g_/bwήb3~ )8ls3l6vprCg"ڸ9;z1n yhC3ϟຩ3(@ ;9g3ckq MQ0dObٽPlgGd49q$&$E2( 'z2 }GΝdˁZHmu&B!B!BfGx{;Hj&d5#sAsU*IyY@gr¡MmsyΡv.ZvLS;Gk",؆ٍ,q̈́aj[qp+r*6Վbv8\T4<:zvߚOb{潝l;'c L~~ /`tf oIXW.gg0XNW='ht=.ߩ㎅$ۆ"(/oa{Eƃq?g|*F΂4?֞a/o&}(uM#) rHpR ^J/dD=lݷ:c&[SqOIGs1kZTLZ Q첞 Jng˻ipEY>&AA5_bJn(- =9jkao;Vjc )ꋻx}NLUyu";ݛm0JUPǃՑíKn`c;Yw+pRfFQ3=j=lܱ _Iq.iZ8orb=XUM/å3s5Un͓pkڰ=B0}?\v NPC3Jؾe+2~ZMp7R8&^83@o^]Lҕ0soN%1?J8V[_)9L+.'oXf྘JE;ZxioZ[Xv|mV!&3ٛBkOx6N<}bywnJEZ}#y<|9w绱HL:i%Vpgavn&;aEM̘')ĬTn1&,N }軂-xS1+Ɋе|r^*WlGyx".r~9dxl `RQ9/}1k=7dzwGq_IqMANɁ&bfg:Ly3v9~VAm{d7]Tks]|sj6nQ4x.gO3>f/K{M Ti{}5`|k*{"gұ=QS3͜`nJ 1]ϊ*{GeZ'oGvLze;'簞<*ڱÒ;.y)CZ41/YȘ˔k{Z .*j` h#i 2փդJ.GϗU+) >ʖ뿼͖7wc5\KK8'ʞmo p3.Gt&y_꽬;3::;i(;G]S&sYׂl߹!.X~cǐe/;2#o1.2AbIav$3H9[jh`82 }N^[y@g@]3<ƒqd!BA7҄'_I>2skb=zM!q 3'Kuj:'QQ̵;PfHc-g js;{Z9,Yp>dws,FSW ر9,dw2| мƸ,f\&d;X_Xcg>Hd_en3ֆjNÒ  &&rSQ;#  O4=F,Xgh0/і)8L1l(B!B!B|ADز;)Ŭ&0X|XV 3,ɩ0ۭM3$`t$2ȊCmV(XS;zl`/%s()EL-OdU||T#ҥd [W1ȜeԳ؈V`)32]2ī;8s^(5]@P >b1yX֓urǀd1,IA r>'3id&/#jU )3E&Qr6:օøsvb"=%:iT7]>b?{q={z{f5[,˖;r7*Ij[cŲ Eb{ ;p8\o?HIe^z<|ws;3{31u*©2ܽ9 K{w'-C熒A\UU1(s`&HiaL4a2ܸx<@`qװ܉c{~^%ٹr*O(FexDkNDqb.;‡ҕx$Z.Mka~WP;, lTS'hF/YI@|b9:;h8X >s& < m}}Ŭ_5?z+9ǔji;Nc"r7 Pq.X k)'yn!FNE&ilo?˩NXeMeQk*h:ET 0-8ͧ "]L6N4ߒ Vf<@18WŨ(تVrx >P,1XxX۝8xCQ T ć2h4LlDD!ڰSS5T<\Y~zҍ,\ uPq5#k :9ݶws~M>"Ek[oӋH%KV1oBϧXL* E5a7O(>&N.BQ^Rɢ<۠򖰴Jeghj=AK(NͲć:jpK#f+r8O(3E^?~ C|-^T4JdقmR}$r$I({g{R= fY)j1Ol3P8.3%N HĴHէ?K3)Fɱ\/"p /A9>Ki/㺍7ؓ1QU' Ȑo3|_ňb>l T >)h"Kn<ݪjE%A|bP_^56s X:'݃b+d IC\7Prb7ן铯VT,F# dx!_†5&3+5$ *%5X;φN*9ŞnF|yo3 vPTRɲx >.cUCf"lVQ69dqR,l@|ho&I4"sE1NMI\[=N+PG`8$I$I$-s$I$I$I$IFձW-K,L#D'C2+!Ѧ ,=k=!!UN.%+*wsdN's_JAs ] IF"*9e0c,S5jR/E NEgp0N<f1{CjhA :T~v#B(!JbX_an1Y(315f^֝'>O!N0 7Se2 9M#RēYR##D>z4Jg(M.y# dGÄS:pQYv}$I$I$I$I$|B:`*_x$J YŠ*O5htd"| G81Bf 5 e8 ir-g'b*tp&Rt m,Xi#MexcyfHqbDҳܸN&d`7@O?LP?]9̅'4J,#:yqrQZhCI=o>ą xSrE((BtR E r"NGF3⣴ kxO69O.(Sn9+ .J]fUe,-9€;`0(:hW `wZpٍ=|YM'f# ]pN2CA4=o @q]ef3gמh(fql"&C.:S;tQԱ kDzzyAc}3f͑tt!Œ.,U$I$I$I$I$ID&GZE1bsN1b5qY|dPՙ9O# Y{azH`PPl&7 Mi:Lv*cE*1MRUl]9s'19XMqrXG L,ѳ(TTňI=U @De2kwnW +)NE=OVˢ:hvXM:lL6GN?nz&kl:ȐKK$3a4' t YML>+gOP̚t-GЅ Kb!,&#f`| =G=H:3>:dżjAHevWL&Mi0VwS;Ok tx&Elf4V`1Zɻ6C"|8gph'ϼEGAӁY?k$,rcI0ب*J)?}VwFPǃ$q&F^E~ Me{«uR4Ĝ{UtogilQL:e:PqB9Mӎ'Rit@XWToIxy3Z&'nAk,v[4iөmSMuke~X!n,Zdk1~~]0ۮ/b@d&ňqb*!0 cm{n ;KPwN`6̑fZse|l~1.h)1U TZB\~JM$ K"v#m`Ӂmm ZBQ&y<9Ւ$I$I2,$I$I$I$I6K<8[]\kѩw(*`zxmbXvp M|hFY F'nDU X_rLV#F!Hƒd^| IDATHOfȟi1B# Lݠ@'NP-8=eKya._goϊ2GGyhj~̙lF,='^/=*P0TLFH43>1sQMt‡/?9F?*^=>Oo3 AA(.nY2gJ$I$I$I$IVѸΔm-M"5cJ /؁,k" Ƃ|x/?#4Mܜ$=K4?gų > fVK1 zhLԳYb N:Of#N, spv͓6 4GE1[LDF'/\.C*_`X)VW߽geذ Z4̐Sc Dt0എ'ɄI2O <4=7Ml-_z 6hP93L̪ppyɊ۠ CQ h ](جzpbʯ!a>48Dk NEb:3p^ P\_}Ob1}7M`XPDcq-$R Q``Utrn (O?G>C<+?g6.eKm93@UL:tTV975M#I$i&-. b$B6&"ąl >KyOT}7imUPU+W9^25-gsV~Kk2/fEeǎG9t$92b30(*u~]Qr]5i8&x%|=7eU:C}fK^/0[l"FTsxy%\j(wyߊ\vIeewWTMXfǏg[+Z_p5T~rI|ΞΛC$׺oykhd=<Ah'cύEI!O@ L$)Ht14's-cA뮭fYx >KI9ge PymZugQ*aoT86`:;ӶάJܰ{*4#L;V:Z "3F*'$I$I$I$Iga^@J9ޒbج s3NUŸY˼@|l(`,3Y[#DS;2s+n%A;hS072Bcg$.%;3A2=PIYBbK;ȥR45 0:S8ADŽax'ϝS:zL"*lƒ{ZH?^@UL#E[_S\|E;n捾τZxc0>hE37n‰ oy{NCt&\M!GW@n};RO&,W'FPU+5Ł`8Gh> %Дμ̵(. qДLg P{8ILt7h$ݭ.[徱@|@d;ΑR^i;vsH;i`Nmb^\KlIŇO0KaPGTM&\d+*lt=I6F[+W@|-H,Q,/PI$z912m0QV;{t%e(J!e W$b4&=\oP xךcaUuTNvXԸt1y[#l=AfKXx2Уϧr+It`ɐ$I$I. /I$I$I$Iy /]]Wat'{}4CH0.y #uzdQwvv&O^2t?ʏ;@CKY[a}qͯ3fxv='~VJ+YDy' fGyyZQ¥] OM&U^]K U\XjlW$=C+Εpp1S؄z*gHl(BNGWMl=%̑@5(N&ThG;l:I1*=Fs[$;κK).>pN24JH$I$I$I$It\s=aNjS^|-g@ULHtߢ{K;;L)N^je8ɔpqw)6')w'xw$_oeGSZʛؿ=Tt#{;},oY 3ϐ;J"o"7Xx|l\ťy'88!eHRLح9#qB#Szwu^B=-z ArH79LT 2ܲG7қ|dq1}pTrâRZcnh=5K[v7d6@IY5^'qߞμq4tU]'NN}:)f!=w/(ƪs/3<.gduR<\j>ņ4ȫZ {6xW {pW:' z=xi`B:r1Ǯ(U\Dj~-aŦxj`Ɍ94q7xt<6>`2`pxtfR>l,y~GNj7q#to7a[=4V9FG ]Ne$ֳ0Ƨ1ڵ6o\K-w;FfAЍ1gCQ1eN爞^eG@'},:hN/uT:I^0 AU,19rCͯԉH^Yj#+,5l g=py*0̍ .Y{c7dz2=G˻A2a* Bȝ<_iC']\^x rgh>~1~lh< T.`Ep&P޵ңL鄪dHgOgx.;97@-}yjA:&ЈSۈZbl/uFҤ 7\,Ǐⱃmө(}#PP,T Oz^mh7/?-Oݗs`(~|gCoa:_Ag*.Y%1+_c{_q%^c;>px {y6,7fhof~u]|] O也omW)˪l3):F-[]WPh޲o+!VVHkɢ*u҅N,{B5ef&To O7p_lc1e>vX̟}|UQ.N(חP ukB ]Owt,X??};EԕZ1d tԛer(V޴ qV/+ `9/>Afe ~QwBt퍭T55~L͍<Qh2SY9]v#o>rQSW'93k6l#!@%[1i+p0DQ*/*F?m ?>;̚rʝ&2Qں;'~w/ܞmk~Jv??<3Z,`#fb<v^|JۛzUgcgS#? ] *pkm>CvVWYUf7k_uͿOf`; ޹]'[`5x_|.Ρ8B'rtA P9 8{ϣc`tp4[u=Wuͳx5xh'O͚kY3a/z '쬩eaЅIK10 .w L۠bQZVC7=Inx =[AT-tNc;?x%z)~E1FG{_vũj6pyi>\ʲ .5K8<^X~|]y˫ J\VrҊ{4p<ᢾLt9o-?y͛@>I;i_?sr*W7v;ϿjVHq0{K>Zꕉ ue4U~/8pE>l"p#}*W5GRy}ӣSd%BCE$k5jGxٮu:/7a)STmU9ܓ־ϴ=7VTWP4KEh3e9q~KÃl=tC `7 0| K~ lbcu ^x!6P?a5<|#0Sh)Jk1Y\jvg_mY[YBЬ +5W}<˗WO A ,ʪy-'F_A$gMKX[EAvgN>Rkõ$I$I.{%I$I$I$I΂S-pG:X}]Y%K8Nӽ̈́Yr4n;ȿƹ n $i m>h3tKwWOe-k/ie+lOU| xJ78?i;' Eu]4!@\ 3kbM#p/n>W`fRT9;N:GU]߲Q<>vts-WS.ae $~};X \f~zϖ_sS':,xwl1+ 'o(F*7N;?^zU*E`[ro/?WP-N6ܼbǺ3!#Ko^g:b;Yăಏ]W6^SX1Z]VCWQ$I$I$I$I$|1+7aQ.P%]K瞶~pr;6J>TfeH;=t J!hf" =|lgh0+v<3+c Ԯ4޷/K_KOsnLiB1RU _~WvkF歸]_Ů5/rû8ܨݍB>3,`rO|gco ap|{.gs(8~00QQ&+uMITl{A~>*oz/gJ+ޏޗyG/16.( Vjoc?5[я~sr#x=cj\VPm]ɉgؼv]K  F2`7+c.PLfl]Q0S䣷WH[&ǥkWRjzӄuwrͷ[:xA/ؘyxyw_{cuΞ>GQJj=_{om9EϕP, 7|~o?n jH1:y#[nyNp%ܫ<ʱݰU%?|w`w_wvyԮW&yv3[waf +V-^;/Gbkn8zI S6Ca|XXpYrF+'(f)ǟ;<6A@AQ-9gN;﹅Ǟ啝/ F\ݷsh|t#_>4d7U+/Ow%ͷOp+xnk3ϞN.@훮T&Ģ7mG?"/¶}cmBQ z00M"L/??^/M.f8_g)bdHi &pqd3Yt]`2l|?Iz_=>oUK @`K&ˁ0PXt=rgW'ngwrZFW[w3_VxglY"{)`qUxv_~_ϯ/ NO7,,wc$_90|al^#Ywߒ P+_oO={蚎ڻkVPh|$I$I?KB#a?u_(I$I$I${X\k5tD$A`HJC5q{zMY* IDATŜ17&: c_Itd4NOxNSZ`ySyrF k|fsNEct%8- O:pYR'nU|=8m1& Ev<{TDf( 8q| ;QRdx{O7|˗K<-8Fχb:taFu3>~GRݎ)#?<`RdqQw4]g&d()\:0Clj5o=?=|復Z=m~I';7tsAt=̇xywP2 k& kVʔqW`u٩r̍J'MfK" 6 SYU]]d2=/Nlt l~L:S휚Z6Kh`Y`)'31;T;c*?pfʪu3ϛ &3UfJvQiBUz$I$I$I$I$M5#1Sdf$ETNN+߅˟3ȥ3 GOpR1!P\ !bzmqz,JSWr|'&#uHaegir7K*:hݷ"#Sk-@1(,Αfp8P"ͬ#0f/ǩ@4 e$#tgg.-(2}7=楮b3*Kf!,t$g1m(?kģCԏ`8)vpL,V e̱8|7.Ɋ18젢lK y$?,,Tu2NiƯf LV+O&j05ҳ1a:Xp"?nd.3i)@A ?&=-E~DOpl 2{{z~(YQgsNF5 ̿h$aCQҳ5NY0vp/Mg]Ԕ͡*2\a>gez+B\X٬C<&i~`QZd;/m$I$It`|I$I$I$I(=#`Gd3 LO@E͵T9g~չzПu`hdglabE59zhK͒N^Wry5!,%׮kXJ$I$I$I$I$R~Y:/<f/VL}=|W٬ 657K~x=7/2fd GhMcδ/7מᑦY=cոԍ>ppx-?ͧ*H ;Nw] vm>Gl](GGYv'fPKlr`f\t5TȦ9u맺ݗI}Eѫs3c.-YDùZ]Dyx;H8r^K0)+y;q%7LMK:/e@ \ٴc-;JSz@½V22sr:#ctoS*fTe. OCL BT@""""3㋈|Tj'D? nȿͶp V v|opGɏT\jF#MC(0;B-3ȭ?3+/˘~|d#gg_ yYTe\`$Hf\Z‘*"9 DDD>l*>P3$("""""""""""""""""""""""""""""" """"""""""""""""""""r%܄oRy N2$"""EDDDDDD>l)3IDDɵcdõ2E2pm%A5`/""""""!Fk+\$""dxCf.0_`\} NHUDDDDDDz3SDDD"Q0ȇT :v",oD"""""""r`֍8v["܍\"""""""02SDDD"P0ȇP"3}83YDD/'5=3YDDDDDDD83YD.cmHRy+'cTe&E`|h?YfEx5ȅvit?2|Nx RD \EDDDDDDD>bܸ-3YD.cu8 F"#;,_DDDDDD>p=ƾ+W?%`|(?9E_\Do`p%""6t=> j""ApXG#o@̕DDDDDDD#*vy$FbLںw-+&_w3 d.D*"""هd&;_873IDDŶw($k\,"""""""@`p-ނdLxԥUDDDDDB9ڟ,"""'3ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDN"""""""""""""""""""""""""""""""/""""""""""""""""""""""""""""""A"""""""""""""""""""""""""""""""/""""""""""""""""""""""""""""""A"""""""""""""""""""""""""""""""/"""""""""""""""""""""""""""""" "oµhO$.>_`\KDDDDDD]p&4F(DV{U4Ipp؍i|Ar"~xHG׶IĒ$\9YK}.V2E{{mʎȕ"""""""""""2&OCD|K"I Ew'O,:;X?p+d"At FD/y;M< aA$+3-$>(A?f/&']Nޒӑv „=wI:S&@ܠ7sc ,oЩ-sX"7+Jf˅kL% y=pҴǒXFܬvDDDDD>^.+`S3m\Fd7y2ȢYN3_-z\YDDDDDD^纤 Z[bt&,\pV(Q=LKڸzCbLRi^/H3N4+d']K4/^a*B޵iܷMp8n^E~0sK~&[tsoF.uCa$彻.+kG=xTM(s'ѺJf1_ٗz cqx|qӘ7 $)3=/Eiwۻ6'kM72˟.Ml) &p!0%y[ױto 4@#{?k?LnM`9W04-719y:}($V[|݂UO-DDDDDpb(mfou(ߑ ]Gq mf9סa;OВ q p^y 193kT䚕ӻp/zq՝[r0jntƜ&ZY`ȉ8dw0~(+eB"bhvK^H4WO$?xQ-4?K/lW|'?;7ُ..+t oQ<7p:y'47&=|hic!DDDDDDDDDDDs8Ʋ5+I:\9beX۾j6e]mpZYf9mO`wMp`Vj%:co+j`ѲxxO~N>Q]?j hڿ>/{3lņI,#:WnfHp$XM2g♅0h>Oqm{^;M(3_-[7̢l?VVZ ~3]W挥PZXa G_>磜<ᒰ^G^岒UЗWT]:'xy>r0PEqu sPXj=YLM|!z p]ۦD3G{hU_>qo%;x FɟX%|@r|_OM|^;`,WseMŶM^~k!y9R;Q_67 fh\/"""""""""""r.{6/5it>$cH7  \PU*/S{lpS;1cR) Ov_>{7!D{)_u73<$ؽi>||nD%_d#'WV1O̕>B/1ryq]\3.\,"^ &e$)G4#86ԟ8Ig* x~|oQu],ۤ=tB^x*a>B^˲H9ak7L $>DZHZ $z|>BoTbviOVO%yEDDDDD.VV;k9䄹w󏟪&M`Ѭ `>> }dx<^|>g%9x _}dP`^q0k.$U,~~>>tcۤ&DΤK4;D8]'>uC:eJbi@`O:6E:mHI;‘PpK]uI<"eȎooT2M, S[:IR `VHO({]&Ox}mZ$6PPM*510\dgEDDDDDDDDŴ-RM21yo uRiY$m=^쳢ڤ-ӂH15Yk3<^A%m$-aKokOZ^>7Ir1-@ϮC²ex3EylDZIYK;ZD.c2$S :Ppny\"4 30)i|{=\&6IIiYA$\,3M4IR]`P H&6IY&d $YZIʴHL H8 8c*qۏrtK xM<4T   ݀sA$N4$L@0H ydx $TXo~ݞ~ضE*&HsdGBoz]@@ IDATl\i~>?NqQm I`x]ֶflJsK!],+M2+AozsN@=љ6q,n uם   2iI6@ЛIgu0-iH$HA>>?_8ߵx2Eu5K39NLHP @8 aNl<_id:sf|O%IPP Htt~t_VwՕrDo,_]Ǥ$n9pdB$Si$t;  |xwq1].:|Hq:< Yos:6I- $i{@wًmH { A_;_%8١3pL3Mx 8~."e$IL#@4$wgdIKxAM4It &7&NK&uۈxǤ+ibCD|tmL$Yrrs)OD2I187p"m%%m`O~ox"""""ryP0\Vu73ŵٹ!-xfil"^\9pw CM؏lU+:a%t,~2[yWwmc#ԧl=e)|mpW9g$cѦl0/_Odko;+A ˄~ :ャkyEԥ Ŭù%a[Mu,;iRqKjdO7M6`0>[bҮ,k"nx|VZGrwI1v{Yr] O"su+_[:#nۘFUs`x}XX[yx!6vn:7Øa;?=_v^޲2s&/cwn`]猡݇V C7:&{K񕡵 dlEy ןͰӘ"v߅XF?{ xbQ:,ɷ ?Uk8|`X{]\|׌ٳv`97i:EɃګaNp0G3j9e9cvqhf[vt1 2]s;>et8 ^^S[`; zW#ۿ_0Ĵ=VknScƦ /,^Pq[T53rյfrIv6r~l=[Ntb`ݳg0o)oح?*]D 9Wq>Dzxq~5Wt'7TwFV[#ֱ9:xL0{gdq6;rūU[ԅ x|ʪ} W!mπHh;{|{W2< w}^+`?_ce}#]ĉ;SV,N,xE?"gI/rSK˻_~u6/S2y&|5ZIZs9 >={SNKᝋŒ>@Kql@!&WMedi־#_m xxNH8^J*Go*^wkvqM|~b{AcI8R?|nwt4'?L@#O?6v\Xz- W1o\Ygsobenjk%ḸF#mXN=PTZJL"$uFൕhf?%ؓ=F/̞Ȣ[78exn>%qpp\9snP9={&&p4<b& p#&woKu %|'6?Svr+z՟믜;]f?<\_z 7 H~{nd^0O._úmMۛqWrU3Xr7Q/[۞ SisQ~a {pW~^z5_2+Ɩ+ݒ嬬o%8lgNgryl;ȳw /øu\n^MȄ"""""r񜿾*sdfuI[)77'g03B~66k s"ƕtP E91.:A\lȡ^bIJ-KL+Y^X(7Ua?m,ڸLyE_>?<ädK`_ſON?[LjkW.;GyuJN]6rUEDDDDr>ɊuMW:3{|X'SNWU ߴ)^^vNdVP65ym%rz{1cZhcdO,"Hq <>{;IoB/*b\Sqͤ2/'Ldˆpbz Obڵrƽ؞}ߑf6uD=v2F0Edn~!GNa^y!T+;vo׹ȹBÉܳˎQMqȥv.o }s|nxg Y9,3~l {hoc< av!}ds'e5nh >z B}̮ oWPu1m``O;=F)<ؖIڲ8jOp2t [ٱk#Qq/;w$%:rIFhNowr7uOW~L:ڂ鮓l2Nx߻JB݄jj#gtaZYc7{ b=Pohmck/!;!54YEo(*Fwv}6s8~0UYܵ=J{ODMu<#xRa047cɖ |qFYuS#|e#&Zׯ'x'MQR^'ע6~˗FVvxMQek%8y^{^ JsǰVoe?q5C8ƳOuw(>9l3dwǧPu!cI[iص_<ƮA~ \'yUtr)TD x|D3}\]=ϳvIԳøc| h;q[glz5g < """""VE.+nƜ|}-oy`#[5 'H1)`^ilgh`>;2nU] 64)̗~rwc]׌{Q C/fLd %?{kwSf1"PO{KVu^q;9>䊪\WY~ 0"͢Kja2rzdb ,z Tʽlds[o$_8"8ilPO,—[Baߣ8_#[Xuo }ឪl7ogKW/w3Q]yEcUCUM2__|%ck-,n~,?@\1{l`ٗ.&圱_|3wrUy/ٰiee\=VZ4mΟz SJ`yu`N%cw3t __zK(q`cµdGB޻̵~ӥ:v0o>>՛ Ȓ>ABv>ȱȍ`7sOjSsnFR~g]&i;Y`^czRN8xߵt$Mj}P;9rt_ټ8J۹+%4C?˟ {]7kT+;{ffyq9YoㆾyjgRNV g)=gܪQ-C#7нA~Ɩ VK'PUR)&26-s! 4īGmU=79̙۟S=Q ½ZjKl68‰{[X{#[:HE+' U5UTl˾ϏFy5{ YĘ(_jl07UQD2aծfr1c z 2k`/zoY`~ofOδʂӁ`r5Nҫ0f ;OL(sQvq꣘ IDAT] $U4@|Y31> Gw,gu?rǛg  }; {<JKzT >7ѵvo)<ێUs󕣻 /U#'k U {9a4}@|ß1Oxu_~ /g3'eqL,&qt <~lJ1~Fwý7z8e&vs"+eڔ+TzVuΥVVc ?%}'p렼:{bp {'9a9 EHQ`[Jwϧ{3eY,e!$A "9lcl.TuTwlwկj %?z^ljn|njy|q(#PΞ!*= FtG,dnРenG3.0o >S5j ʗѕs(;u[4040@S6'PJh 2_$Nʍ$[n|޷v%sGl1cЃ\z+,`sY09!ݱrc2%;Xl̽x"~^l6M|85[16>֮ DPeֳp7>|:^bcFU4`rkehk=3ۤ4OcEt >#E_")B!B\f /Ŧ{al86 y k ŊK-0G65١~fX)\4]$ [St owB!BM *OvvlWPe0綛97]u 挞Tqd;ݦʹE&3ᠶ.LeT$Z[NؘTHmtpE]%zOm̞AE.,;:ٹ &díQRE4""6x? B|1l5lnYqwNgWk])ŗ%ebA%uS#4N T3:klUdxCR]AsXcyr,&LD*3eM\Qe=Tt3hjn|t)rA?>z)پcQ(ˤL!d/<+Xa,oФߵ8`jUW6a(0ֱ8G;z) E g?bQčDG3񫇟bZIu~wmSPVR)yPfyf5M,hڄ P-͓sټ!Nl@KbAghxt@!e)" ,)eٜ l[$:h^UwrP8{O%SV60t8=Mp94݆af)XָkUyz{N6ZC es Iv Z(9aNM]c~Ӊij,9HPsgylXp}%uΊEK{E:*K.r=0zAɼF|yX疃t3h=?#L"νOepTXSCj=')Z&6-㏔:I޲ljm,,ý?q}Ē2 GFαwK؎~7PHuCgp3GGVqMy$l[pUP;&ha86'Lal?N:$sy>%-tea14ʣM, _q:h@i8 ;b\LA3+)+mEuneQ W.vfP>Gs8I30/0Usǎ1d8:?qk(3FeώN&` gW/4|t,33!B![EKqG;>(52[I3nb!RYlZ('Wv&\xt sz)(\|ϩgΑQv<' Rt.'q#bD͆tye& -w};<ֈLdHZAϸe#lv><\ `4@{hn^UXF\n-#9aB!B!BL-[,Psv'A*p~$n=ɬvfC+IHT~)J8iv$8⧯C= x]"N'n[spmnt`bt(VMV6N7 /I97 Å#ItX-<9rS6Yy 4U$΢ɛv>$o}9tC$™K1 u ;2mv5G|itI#uB~>2 yŘI`}4 D:LIP*ػKsjÀRiMS6ϳf t-m?y6, Q_t&4?f-%< źs:UMd61qP!3mW' e Pq@<l|p$h8I~Fvܲ43$n1(H26?~{B4M' VY3&&x~?$ː-|S67DuT0}!:n2L,U-MXMf'iWWA^j h?eA|N\*I^mhDD&O?ZKiZmP|{tB4 >i0EnΏ'd4`2\T/Jx݁װM~jE4Mp&{*fhaYIv]AY6l9 72RcEڏ䡖/0-rt"f=۟Ce2A> k L!BqLxTRVziTSl|AOc)b]XB!BK΍`l Ǽtqz#.6<Nskt2Xc_1e'19Ͱa`Q,Z "PXf ہ, %c@0<ٜnذu4o㾯g|?N ~13{5EP _P R4ÆîNrIδ(h/( ưf8cB!B!Bw&nǮCPbUiY2NEDXI^Y('a:O^4W0퐡3x f?֙b5|}B{ l*'6!QԔeQbS0ȓG[̃π`㜛xO>!RnPYh*_(s4t]CLpu ͒.4 G*@qv fϛ۟/0-|S㳫(]a9秬aRӰ躆6|nu4%W0ablE:Ga8O"d߾H0tL=tZ4vwӎv#g0ZY}?ˉU|Kw5xt $^yo|O^3dð蚃>x]y%&\睦iS$O~eq.g@Cȁ1{}m&0e-mߛqaw.&wgiCe8{ʸ_oMr7 Ueߋ|Ón募(jȤ*ˮҽB!67wL9}y lj}7]Tt$ib&>!B!k#ݿ{7yheZRN5S+;dOlSW%ՓF2Mub`,f(3>\C;]R.ew(I6<׏S'^nZ0P:3c/bpΞzE&94PЅN]s9e{ " <pR ƆdѫBT#i:6]LnPRVP uB!B!!a04mwAZEtG9%+*[<d\/@n# ,fhOHUO) t@5/_ef>p,EnBy4b^,{cC0korfd' "s+rH 7\r*Lrx-r5oY9,~ɉL8CԻ %J 2.b7h,iN?~d{)k^bfwk0+k5](.;Һ?K7BSЅӒX lj+Uc] *x,G$]S[UTJrvw&u*3p"[Y L'zgFE$C6NI[[Gv{9v09\\C&3P=A*Fab40Ue6K&өB>G_D,U3B,x{$v'HٝQBg_4*W_,/#!1VcmL?%+}Uqͷpڑ@|@&tt>3y:Lh%y("]˧]AmBq'BS^MHiɜ{r 9W3X_ m Cl;ƑoY82q{!B!.13..ۋݎaIsdߚ'3 WF(eyq>v'KBS?2<~t@~B!ijY"r!Rse Krrr`dTV2񁜪HO;ʰ/,kfٜ+2bxDSuB\"&.ot}':HF ~=@Ν N8M^ڎ# 'Q<j(F(x0}cT1Ł_e˰InWUz"~zl剖qM KA&Mt`;"7ʆ'8 Tޡn9Qa|~,҉$ V5P'yi+;*sl+fpY;dzUdW؟ӡfh?bIlX[7uyrUfgϘ'|t~L:nZQm;8|9 ͎aD2I?Kr~^Ml6E^:UM X౑:Z8se(x|_ Sian]r+ng*沴*t(Y6݁1&pbkl憻 4KQ9Gћ3R´x: /Ǐcg,=~ýt9Yj%uwoe{,;fDn~w;`|@r]g+k6kCsj l|%'YH3, "iv:AI}ZaGZɜ:I0wfOojN 27cF>']r,U2vV UȓW:7UHpp.:`^ʭNynW@E._\ n9Ȧ-[?+)"I0gi/[e, 'ǎas$,Z,ECG;u)@'+7K!B![@w ?B8{ۏOc[s]-e|3ZWsZWN@ e &_:gUe~_7!Uk߽ʣÖ^e>Bw$^[ujjkؾa3}aV&צȤ0 x˨FEy~@cm}0np`zZ;4ՋsRv?A^ʼ2!>0f-i|"_M" A.cK֖C, `?SU5W/ Y.GcЍn:d`jn^PCp wC>ϩ h@:5H[?p#K:AWC[\W@ ̟ox/§>9C4^vŖ^c|(t{'(.bxb/CC,^5˸~|_s2p0]} V\7{tzrҝl#Tګ/#2>v϶$5>F!BqAՖo+N44t#-b[ACY{-׾%`TN;vte.Zx}U|nuʣ| >8O8u,H)Z̍I_0 !B!ĥA#r?x ӆfY29|n{5?$fv=_ZǺR*o=e=/hXxZ@?<:ϼ =e5UTp'c)7g|iX}zp(!y+d ޴ h1>z!@{918tFӜǫ+,Wk,_|,h:UV򕿰寶/9ET\ɟݻV9=Mr7/?Q;{__F f͛-KwU]w| ,wh,%kܢ.~DJV|NB&EYᅨO΅npp7^مsYـQ͝w~ o_rbH&[j# hɵ|^~k ?lCS#_Ԩ_p58MϿ<ʷ CtƇGGB\{Ǿi# -k~uzl|z<9n +qMy5:THŕsx%O|9?ﲃY U-ayn5/^n&\-]BSL>_`|xM'?ЁITLh\ɝjxa˦qcEB!oCCcDx~ t 7@?)M[p\4kVBDaAЃiL :&!r1:ӛ& xF_(t.E@? yAMUe_0m,BcrLtgMʂaGWHͥL$N$fz2d8'}xa&`-B'[т_2z8T-b'gupRd z{;"Sr?e7N!HWsl'CCm!āgE7MaLP%8O$Ct3H@Sw,"@EU6g E6=ƉIEM*:=eUx8(fu#CsykPS]FE؅1~T}1N쥭/SyN@~Yʛjj"맵'Q^żȧRt1ڇ~BZv%]TF.܋{iSOwH#4Ω6he$ PxW{V!Ds^ hkڝ$P_"춈u ckRz9SDTeo$<ሐN>h,L!B!Rmo0O?a ft%He(N^U>?Un'd1-<-.ifh"VP=~Ajg(,}$]tgsA%hFIf9}ݔ Np2{T9G^*3Gw2A=9 C-7LkV.\Ft|0ċ G?@A6rTáLRCtO'1LBsR᷏_+l[:a>eex}B,(r}=/m-+g^e%5AɁ^ nE_IzN*Tg[`(Fx' "Vt{ht|2jQC!>HJMjPEbh A4&ZN}?xb.AWX7C,H9MT\5E6Dw7'I)Hs*htwqiTxݝ q,jldN{d<*24?NG,NpD }"/@A# SR 85{3}}̫xO7i4wJ+]J9_ |1rfl2IKo"2\DCQjc `FhV1:[P :{8`F˛k3~X9~P'8JȚyDg.6e3=@p./``ZW9z{BUmR[YbelW:5vr~Z{{i1P W0ƀEk[ _As;n/_>q+ O i_pq*2<m$RuY{8Cg2tGD#} Eh*Y!<7ÑFaL?z\QUF3Cg_xΠ4Y롵e'*pʙ$qZ{zhMUEMmiRBTGdt/!:hZx#}[Vֶn2?5파ǻJkQZ]8=,P(J}PS>؃+iAF?-ݝ \TW\QNi@G{k`y}nJ^4z(}|7O0g* 0V!EWx`ε~m.ٞ<[|}{>|{m`su]Ǚ`ij9=O֛Q8]1ٖebC?BY-ۦSm8_ߩY}s9Go;yW!ۍ !'|ͥ+ox7ƮpXB3\h Wi9BS%x iN7.W.<6q6ՋõB!Jo̓Ҝ34PNZ,9C3X|u|V3Da~o3XOFrC63gh7]_ϲAI݌eދ6]9u.14t6̤Lf۳q6Wuf3~yu6eB!B!B[n)l {G= ]7|5N_ڣAc7zSÛǟgW}4Y!0:0/g*@].+ !xp  QU%[:d!5;N{nUo ы1؀q[bN9K67&vMv7Mqz[lzP]Wҭ3sH4 1`z=wN=|猖?D;K!c ~pKY|63vw!qΨ$ !B!B|L`ׇ`Ηd|#{P cg !B݌={PCb;[!iEa.IB`zJQc' !B!$R1ԍ oF_ )icg !.T"A7wM !B!B|~lC;Kig&B!84hWn g !8#QMB B6O LsT!BO͂f:yh6+]ąȰZ4\B!B!GB|d+B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!/B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!/B!B!B!B!B!B!B!,\ IDATB!B!B!B!B!B!B!B!B!R SiXsOttYvGPP#[4i]!B|T9`4'ĹBsXRJa r\ot4,ssO0M5r:GSJa#,sυBc}Xfz=O;B!B Rr cU8UF M_dm+J;p1]L94GaS?U8<+0rRmx\rB!BOI 0hPfYOhQ`l0uIWĒ I\@e04<̠a#q(Jַ+&35=B hrbIo[zq攲,3v!B!:&!.`dhOCo?M}> F Xe\b"^zj fIfQ^:d=lW% M7;ht%*񀟫O22nM;X!ƩtTqS%_!ǎ7H0}a EZl,Yq%&c[{ᑑ4 㘓:KI&^5wBaɬ&;fF pZ ](,x\nr(LN8Pg7%_|JQ_Ocab!#3 {I2ƚ>"@3wVSg>VwGD w|<dsaZj{8\?@C ~jśKn^")s00Y :7oqߴsoҲ|ϧrIHK_KL]E䏏!כ#}N%'/X9SK'8|n^:b.!7O_)f̌D-$es23AC5yn.2d b)!B!i񑤂-tb#)KzjL+;(hT)ET7jn У:ņz&˟0MCNqiG .FjeXvc睂iM zw !g`%˛qg'P"2LQc䉨Yl$xb+^ضZ$ƒcJRlsyCu a-H#~S{jZ %35RaPDtePJuL͊fyr2 Bf^ 04\gLbaΘyJuv2JDtbu=eMZq8M3.Zm^NGFƔŅL vX[fʧ.??'1' kdn'%3D+UǸdIaw;Iϊ#eElēpd=kyvU#Mf }R>=5 Ŵ4Lͼz"E3pmgr+E86\gIG) @u"H)$1:NuFL`XasHa݆7ΉhB!ya:]aN[2 ȑ:{/ G( .=cgDYu7o*/קre0ؿ/uLnB!B\ؔ"ֱ8GψR#:J̻4a~RPXGqJ٩ʛ*x$56d)ru,YqŒۢaqRO}Q]G׬1K]#3,ğLQeᴞnhtRdaKtΕ2&Vvϐi ͆,}'$lhܟxM\ !8T:Q:QSq>yHf0 nbO}[˛t9f_ct4o=;N2tqdR&VSgNrr ; =%8Ϥ}l8ʂf=-`} =fsnTC!BJyA0ư8uT&ሎpNG(=`Xb.W#6lڇQf@=:V܎wwcPm93|39cOPX81O#šz4Jr|iDttrSR4Kӎ{lcρJ'e[ʫ`ծ>C&$.-XVP ukyuC;-QLI9x4GXjkS&4blޖKE~v]ɋ+nQY\yT>,^bEOq,"_tIՂ9͋+x~Cp%3wY TIJ1E[$m2aFZ趙|vQf^_QÚ *V=]˭X_( B!.XQQ_S{k5İ 6q\^\ EdWgimY21,*?>V?JU aJrb,T shƟ̚s,3@đXmSI}u@~gWfss-cB!d||g40h`s0u$>wi&e囷{ {O%l'n^:k&yqi`}< lZ6wniVJyixϸKMZNːf’SLR>Z*{fL$bNU,SQ|'+)&9XI,n?Vr ="`kCIOTY'rԙ\g3WvfK EAOoVgUs'=QIFR2ǧ>F4˫yGIn ͝NA3 tA{2mTUH[wP>vAxn.s :9 E ˆ2^k!Alxc_4{ts`׬֘d.t 7[[!4#a_?x3KL׾# ̽eXPy}FUGp3+3?uRT} $ħoOWYv/0LXg'ѡaDWvdWsa&p*ߍW,ӉAws5ϼ6Owm4O:7.gd\g*D~}9zVy˹ ~gƤz'{KaL9UP 6K=VP 94y^{1bwյoLp%275CUok!rvxq!cL#¡-eJlZ:w=B!Bv-ybNU)):e"GZW:!Ř*MwbyɩLSYwn^U)ΣI V_QrSp:I`MW](+1' VHDTM?`S'q,uNWq\`]{rg\2SF ʤʞL݊ڲ53<6D! T^t&Nda̻$_T4DK.J&=^UYbXV465Ici}0'b0bQ&3t491#in'OIʎZ~˖q_+5okvg΂ ;>65utx(}`BTqOTN8&Uul%{t Tr~ꨓ,:M]<} }3 Lpidoek| zKĤ~?U=9 Ajw|,Ʃ(b!vYǃ/u2&N~:cl7~*FG?z˼#eFӈ@U3 o,<;Ct\Fvf$# ['.([{Z覩L{D 磲qA3[H>1^.^Ƴ> :_nzN!ۏofsb,'|Fğw#Id,~my IDATq)_509f~  I Puz7r{n==,~-9 3SAjZx쭘÷LAܑs@1T_F6vi$Ƒ5>c0@{}'U;hWA%Bk]De0r_ ũD" %JQw(:޽lFY4c۹B!ދ2BK2bhnj* Ey`͌Ŋݪ Ɋty"r:+P!Bq{ym<+4<ZV+!X7:<Ævdp l|T}҉uYB#ozhX[{i(:~.jላ#?;h1A;ONw 1n*K"yf!ʪ6;*b)JG:j՚Frl؎`p?n_ɯ`8ŋ*~ܫp(@jx2o`sߺ:> fWxڅ#.\-Aڛx򙿰 w7w8zoN}0gwǒŬX䝷^୲:[X|d# W9zط}5nG_2F5}]T8GA|~q U & S}G{kލ?W G RSȴtfinnǰᴀnweW&~;z s+Q6e2JU ~{m fH #gkpd28w5_Pu|wv* SEP9DTYqou93Nz"P&ūE\decn`'=݇dl乭8{V+>EEV11/OUC /2ayL}zmoʯwHKOgNi>P/{4 ǣ(lᅗԗcOˠ w?,šΤx|΃{)yta::j1iD̫M$ m>gQfV'ҨQLCwLW)1=d33@W;7JQx6F4n`ZäM;[4(u <p;q9zG=iFjT%&6higۦmW H_j!B!xBpUV[S3O|+R$"M;u V0>4 uT,`F|ɞ8o/ʔXD" 8Ǯ4/7]s==<^7,J=a0kHl/n4䚥˸$Xbrg-ʤ[@CCk|ʅ|vB2 WL=;sQT!T4HP˒ؓFe?R8yG=y.?<&%\_xb9x#ܹJ>?7lٵo&T75Q>x5evh29 AEHL#ɛ/nw1GŠQ6\?+rHN"o=5]+)ǪC*ǚfeExP\U=LܜbxwlH!3/IT~Nfb0*v=L|ȶc\;gX<ǹF|c]ZۨK丞FS)؏vz<F ;/fґh=<գ=~0+ +`Q,vd2siퟎjs&pe=!ѕuװG$GAhV2uCX Q3sRL s4Mp=aLOYY4'jvKZdϦlh1s ?kA&-{vy@;!hK9q@WuhKa^,X(y!?Ed/b|w;ds"GX't_ҌHGg7TbA"ސI Tg~->70n';!b GR~ϳ12`KOiϮ?s35 tʟZW_prIX!DC7˿\5OŮJ1f13[{+8\>şWoUe^:]ņIgS p~v|[&~^U$>qr< :yu<9õTA] .װ! q\=)Ҥ 7╠/\;4j;d|!Bq3,až|Xe2Ɠr?cQFüԙ Ŕ$uV?bCL8W:]~ (%:~l`}+Yz te>=VP`(Lȴ~4 qQOklCT)K~O/&̻Ƨf{V1ǝ|Im|h|u&Ō mijdC6o6w̻/%3RFU[JnDx,vXͷry\"k{ r6 J""6M:x1/vd`z{ vY|/O5pel,A޹߿_oHɥTn⍲,O[SwJu=*;IuX@RwÌIYS(D#>zس8LJb,o9>Ńerqi>9`_>r=7skI"@lyyDRL= +yqxJR/.7Ybp{/?ũ#q`=>ߕV71+7S1sɭwkLDF_I΃фh/=eo=+ڹl^̏}G}_]޺n&s2~rëҸ>>KV.:K}6 )840Cz7?|j-76ធf;nykIۮڂD|[^WfeL{+pL囷^MEI- &11Xn­^?k)?~&@z6L/!ԓ̕y,^PuS7#7(ZCȝ?})hz~Wa[*us ,- ^ȯ}x/q!LNKZSoRז@&&Ցme|xg%z?oc1Yn,93/XR9&+^/AdžL:w^f]u s&SP82؃䒫o㯋g%(ZCYǥǟCl͗_FCۡ|n($vx~'޵3ٻwX|)?eI#!|Aظ3. ;__F'o{oT/$93}4s-Y#Y*z_xga{τiDkcݾF")f{@%?~ZE|s᎒D@W/$+ϿKz} &J:LOPEe-=Lͺ LB!BIB\T0HX=zRA*UGVTS9d >,dNGxM̤I\.3ɱG4' n'g20]I\3sr&AWo{)Ďf7ZO`V΁.:0VP;+ F4{W_\L*B@:CQ$=f$PsN[ooCGX֏0Fn'f=hM5" fS5sF,n.:)!?Q@;d$c>nI^r Ggk| 4g2rpnRw&&Rl`igoܢ"$Ixx|jm7D4ln&e29ΊŝSr}ˤfq0!%D}CuX.̄d&y$h2#>qLe3&0Dib[^~vԜic=kV?'{&X])eFZ_"[]:NH9`fX0fKvm5f b,2@8+7Vճv>$N8ly]$e,MģQGNRzؽ{9\8ѻ¸<^}?]MFbp{1]}.#ts4IY>(v֮#i,zSF)i)[|Qc8+uR38Rrd3n.bjڑZF\vW,-`bbm;|BIS0AHZ#K5h:|>S}4IiYkQvW5n0:s),?RзF:ye^ h(|@\3=_[/UmԶj~b \r=MvO6L¡ C؉w:91?æy6z:sm :))D|$S7zO?Y݌}50=h"e)&lA۵iobkg%RMm]qƒ8:Q%gMprc^26NTzt0ޤI>y$@ƱdJ vj%lO[RҸn, ֳln(”D|#L"L`'纹LMH7.,A1_n%4h">?;>)sSĉR$9꽋(V  lSIT(YRvwfg<ֆUܾPRd̒уqm7/z7ܢұ72{}P߹T ؝<dsF/7nì)LFfԗFx|qyեB|Hͪ\<~&{!V7/v5S Zxõ|`qv~an*hCO4lו ,znl `4u|q{ Khps[5v 3+<@69͑m5yFLnetxצM,[-mUB|ڝ7s92gewZiv>@+cgx$9^Lj#'yq}({7`ciVyc7/DKFw=pm65͡ç[ :BppbY lT +t:Nt:NwlUQi/ZK<+5ɊLwx5Unkid4#~-8cX&pJQelBh>:NtZI45+Vf0KD~'s)D(/'kJl4Db %7x.p9y528!BVV+^C&yW LN7٨)7ZoGۥG9>hrpM-MJxl"|)2ӱIp1ХK!gu V-S, "ri4LJT5\R3}GXf QJ2P&#G}Cc VrpZ!:DGQaŬrRtNDV =D4 UVQi<;+A")cMmBq+ sfBMq {.-TDR$ ELյ]7-`dž \b"Y9, Rs Ja0i|IrtcYTqhQt PŖ'iɠ^,l\' {'QfSYX|&_9k6}KH_Ӣ(ZfX,h(͕o ]FaBhVl)WvZf}}yH IDATH'O$N5$ y&d9^)*CCL嬙?f2?҉ VVlevqeB&mlos7HeA?et  $(? 41,٢BQN2PPE$ k ϋMzDA^UC6WQ ϓXzF:k87ƀ5zzITVVS=of5n#^RDL,k'0 پ cQbZe-X>2OEP)fpMk /$VQcNhut:Nӽ 鬌nawYFlfd.&YR*ϼ9i E YѮLHiF9LX>\Qd`@P /3+('K;<5t]muY4bbYD uaaۥRL)f ETa3]Sfs|9uxs>!%+n/EYTxDԱ"S"\\Q8o/Nc(:ibyш "f&fX4qYA- GZPl_̥A(.h-a A܋$d"-0ъi@T2Dټ*LS(Y^߯(** Z6DQE4 G1VPIɣ<P^E[ ID<Ѽ%J΅4TUYχ%QxJku(MCS9#at:N!`jJk(/'9<8ƩVVCt.`-;b7ԒBE@=/]:T49H'8|f^?5fMom5ADY]<5IҪCy4=9$773GNt:gL(5rig.a@B5Y^x"-fGp=y byJddžZj,COU0{.E|b(Oԯ*)71h>]@;/-7J%YoOj} ND@hqTNC K ݋"/WRm;% \4_ƚ ۹{ŋ% !"۾DEA@SF= N979r/aK.O(DQb4k ^5&QjePr;дJcyt:Nn4=CwrruV!h0(5ß=sN"ĭ*œQMF\f#cMhђ .nh[WB8wp:VIR b(E>o2"IRIEc糚6A0OO*<|mc9KYXNt:=b6pڌdR9RӜ|A&_b4 N xYUxYW$bqXq <٢τ phAN$YrTfE+eqY>UUIhK_$ S8"`t+4cKAqXX1y :}{w  W4.)<t>mT1Z<[*mÉSSɦSLiO#ʤ)_ ɼvE;dX bqJ2NME5-oYg4F'藡vFqv\A-<6Am`5*DȚyѫF]<=cŶ۟h#lw*.c4uӁ(% 8kho`s(=*8o9i%|Dh-Tgj)FbET6BH(8QJE+@>E rDb(ޜ$2#L*n5m[D.; "U5" xqKnuusZ qwcA-Zt_YmxnVpaeF]T*M2G<.t"IiĒYW}E߀:P`h2ɱI;o-^w3?wc/j%T$({/V-2bۯWv46u*26:Nt:N-rcumh $uцAs5SeQ a" ᳻ZL"Cq~Q̿w`$ PQ/]:8YZںjJ~Nn:N]Q"l0;}3=&amL8EUUa*అ>p.Yr缧156Dݣt?A2:BYf$U@ dP26:U5d=8rn dBwh.{Og%_!I8Ciy, %)^K:kn~$x;M%uzUHp'8\~hGcȢP$Bt_S?5 AD@&?HJHS<Ԣ.&u1ܘnRs!,,hEw͋idxc2faEF, &k&8G_z_4dϱA2\a]Aey4B@&_D}L |lQ_d&c!y  `Hu`R4%ގ0;0xjtbaMy`~?EKiX>jC ȏ3Ka0'G&[-s46,d+;w,:{=l^UE-rxǂ{8So#Y4Ԕ}\/y$Þəs`gӊJLZcGq6:wn\ȤR)2f'^nL!>Pe=:Nt:N/uo曯uHWԀiIS9yR`:&VPTT6TΎl`t-J(GǓ^cDBf J}lbh7hQ3ϻHfkc%u6uT[(JD*E%iKdw4o]~;"! ,KI.Zܭt:;%ܹT;NeWմ8L% EUIJsϚ*ȕBlɄB;2lxAAA%05㱘0 `wxS]Sˢ006Jjnn(R9>̈́baی؝nZ8Ǧ,hLtF\1zV<^ʆaY7FPˆ]˵R OS)(E&9L/.huQnV8rl,kBRI?ø$?ehZ5O;775Po|>ȱcˮ87-gÈQEUtM\]1Ȥ9𙌘DPUI:E*솥"tB_Q4~28ۯ+gd4b.Oh~ΈjH"#VTl"K4^0bbQbHj*KL31t =k'{IB.w0 ^kPnkarO{g}T$b<+Jqޮnt[8פƁ *L,ET H0*v+-T@2Y :]H `^WWQn7 lh"Ėr߽{xO㣷_ǯu"iEiv(_޽2r){u嶍|zˢ1&`C*>1ރ|yjֹX%Q(u'IhXTr\Z1h:li+_µ>^?>@.f9tj?R" p _'_?͋'ߠ&QeYn Y '|4EƧx,8g_A۝xa:G8vRmP% 2o-;(Y> IDATÁ#ԕ7L(#ԹhE_ng>kZXf7blbQ>}X"5a,[csv{:T+8>ʣGomaXS9e +C$CEZABahƺVV;Myv`ҲSχ⚍+F1B2#&8i,#X!m;WD<أ9>UR$ǏɈk~_Npba~xc )d3irfMAe!,j]8FED)f;;4!:{Gy`/WmaE+.kzOŇƛڍUT\>C__-+m ٴm3n&B!7ͮ^DӦXռ4hHEjX $?1bye빥ÿ,ܵE*dzX=a0 >|iqaA.BFwpt s؊8Nnyi8ո10ܽo߿ [b}Ќ عKS$4GȌs׆լu&p~v~٨tX0dEw .Nl⁑n8u.+h5.NΟhLEcd.jJH@k*=ϟ=`3rtOctW׼A;mVΰ~[Z Ie2Uٶzua2{bpsSa~'ɫ^;&9PZONƍ6p&:?;ɏ!d0y/ q; 1)`)_˖FI瑳Da FsgCR3t?;7{ :L*a2` Hr j>6O4t)[ :ˣOtg0<$6O/HV޵_<0~s ")ڶFnti6myCnjft5fhd7rw ?{XiSX+\bfy~nT-~ ݯI2hSM5.? AZ_3Ϗ|r6 vOqSek!9׶0#|!cl4O×n|1DպZV[w^ ƈ6|[\fVegu-9cS$K,nB<NtJ1ˡA͈N3%W! vSYU. &b4Ŵ/o": ȫ./5v#(,)!O\s'xh;|܁Epp-)xwrt,Έly t:N~M-u|r[{҉E-2*vZ Z=h1Ov_ᩀMg1VzrWK 7LlG;!Y_s  U[V2:G;T{-<Ѹ-mǝXSg4ZqkH=2(j?pwAY>Uw%]{&1^o?f,@e2 Z P'{0uҗN򧻧Y߸_]v{m|f&w؛/rKt v]@RIE~ee{:WOO'(VGY/g{u]'֮qVy( <4٬1{e}<}?,6W+;ܰr#üҾg][,EWɯ,U 6tjO_8CˉSHRddjccTdPWׯ~f=GZZ>C'irofڕ;bz7 8"C.Agt$TAd2-O0-iBR7mDXcdm=,7{Ot"RֲE:BrfBRC6)iI& -?7"֝Miz??NdThG]T2/O׶PvSIL.gJus۰+df/eǦÞOغe ^[EE5N49͏~| ȹ cIUŦ(L5g֓xz(LUcjbu;Ol޾,&3<)Z߼ק x5|cדxf/{=T{lJhwv8FJDzjθ@}&tvZm=0.dp}lz=ۚmD= ~MώQ-0*W/f"l46r}(Ͼ}jD2>Mgu?Nt:NtWe4m~~lݥ/{z{wM! #zp2?^7.;nł6\Ʀzog}ċ$ON_0R)"Lׁ9z)fgu &FSy9m H|5^+ ̧׵2!j2ԇy]&,J5T_rSD@$XPi}f0h,cωm<V'Msb,IX"YnkܴvZL$V@W-k`GMpu:N~ #cjhB0ki8~6sv9Y8fV+k+h}-UQY2Nuea]lV]njKx4r,i/H;`LPR zv([pvj!qV;^`PRn21J|Nk܊:VM4H8NC&CE$LĶV5pSIðH'J*+1'8e2Էpg] QVYNH5 #'aIҚLRm(*nm] 4G-F!Ƣ9>B"MPCupմ&FDhV43+1M" jmav2aM[M wTPX88L;~3d[_H,MGc% Rav()efњQWĜ~G 0oeqkuNkZq:;Z[Wv`llTmĨyxǼ6:JcokDikoeas%u-m̯Phζ.}ʝԜaeNV0*b0L9=XF[&J(^2q! ۉR[( iji:y? UYCWidT0eTH̛5ny0IW5sss81rb7r-MZf7"CyU=wܴ_ZE%aSbݖ->ls9ɜLM*zji.OQ 6d6Y<;۪)L,aSʼR*3 Xf^<ۛJ`bUS_ (,*v1dӘxs;(Sjꛙ__NM&A2E()`9w\nM DM}#Kj(31-PZJ&HElB(5-ܷ>+AWG+=Չ,]Ku|>rOx& haNuɯԛti5:OE &Jc!"*gт|rBUkXZOթ U^v2'$T%:ۘW=- om*XғiTc'imjc,ːaA0L2ԗQu,‘--˸h =m4#'whEmԦSYŋ=KS 3F{[+ +)ae/Jdh.>1NK{-iaŽC2{,beW-'A`T20aLZ[AU"B2(d8maL,X̪VW`cyOP 8OMĸd nт?Q}cu!z  >&Ǿɂ'W(0c;įPY=F  8Cl2޹h~\oY61VEȾ3̓?Hq${g] ^iyBbW +0 LH!r)xlBRlM"nO<>cڜixyf,zss c9,xܙb@p@~,X>8D#S/~\NK"Iy")p0( N8ZmW VϕiNYaZB!Nͩ? ;YϊbS\ =}:uOs> ql16#D"b1=,cE*~\ct| Zo[iI8&~ yn\x4|2dgɺ./Z{E$&VNsf bѫ*oY,dʈ=NCi۷s{Xz5s(ɤXL.Kr)2vzi`x~q[ ټ\vH'=O./LqC IDAT,ȻqsdȷX>sk+M3f3/-hg/Oְ;u *m93R?{'SAUlMGٛa ~%dءdЅ=19!Bgމ=u>òCԵU_jS1 H(L8mfɉ-/i$#3xrr}|6T 10S [y`eu_I.GwŮ|qiBaC'1{8aMGwŮcSA;n哷JLh|Q'"=9bCšu0ECftXY糱d=ba2[X^ p9p8",n3C,[m;1P7I`DH($g{˳}:Bq$ ^TMOܵ9~R吜 o}Mb;ݛ'M4,Twjk0L"EeyzZ韪aVPAͮ1{ ils SZayw-+LW78O<2?O8nf~]MeXD#Qطo:o NvF{֖"8s9rH{P)֜w̔3 "wعY!f]ֵE,Q~88SdFEg0L"(NDqdE,Vt=I$;#3LD|Oôl1{~r#z)~/{Má{R>4S|?o26+bGr`M5q#  `&N=.u//'=xt"""W.SͿ̻6YW`v=&rsD.ST.`ܿJ0W'j2~`;wϺMUY LFO )P>F0bA.Q|tiːۈ'_pOU6|aua2x%"""""o;dߐ:pظ~6p3|T5 b>|T&gb|L~I.}0~ Ib*L=uѰKvN{l׻|mW@܉0{7ʻs F'/pbgɴj/J@;7p .ޔ\ ñ{ymqFjáDyFsF@^ c|',,աir繌rN1psx7s[DDDDDDt#_\WN vFzz+^~I7'( 潲cqf2U-""Ⱦ3̓?Hq5- J*>j*y'xգq}?Yh7_6G6mO^<Ĥ5 &Yb1]HmT.iۈι8ZDRޝ䷭Nؔ}1,/%3c>8?MeXC/?c8MÜwg.w7Țg!SFGpZgrMd߾̝իٷo?uutϞ@I& 5N-""""""""""""""""""Aݬ~Slc f]|Ӧ,Z%Y'"""I;Y+F[[+4{G.XFF5B""""""""""""""""""a9TVsomuq\geeDhZD{עkY """"""""""""""""""""""""""""""rd|"vq滣yF_}L/%"""""""r]rk&%x.c\0QBa=G4cň\|8X֯.>fu}q :7r8Xf8Pxc7ޞ#"r |3Ha%|0CDDDDDDDDDD8MƗK&`q#Ne f8Z#""W1KDDDY2PSqȕ cݲ8TatfsGq ^)F78JVʎ`V`E3ű"rUܞW1d|i\4_.Z?~?\%"""rqI""#V """"犃DDDDD6_˕rgq\+rqUC墹~v xwq ,V ?U (V!""2׏T%yDZ`ecY%""""7#(.+ex#gaNq\r}`95XdqUM0B%n(`A͌1p!""2 O-)K ی4b(B8C<~&䋈ȍ tuq\ cv`NJU,;^n0hXe8J䪦rIxׂ;]68JDDDvCF""+_FG%CۉFo)y&"/"""7 ⏿N c{ :Wd"wtPU-"""""""" x/*&h2\:h,0(c[vuaYQ""""rܐ `ŰˋCf7VɪDfq*d| \q5,i2HM)"""""""""""""""""""""""""""""""E4_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD&㋈d|"vq\o|iG/y:3DgGC+8ԷS6WѻIP[N&2yq8GrTĂ `w? *- _)q#ZfϼCcqpBy #"w,=%՞"Av;Gp#qZZcDLvGPRV>&"W@@0w pl SWJWKU|xl=N$I}]Pי ea0m])b+|ٵs&e et5Ř#cϡ>fuH& ?4ʮ$J՞$~|<aQdj)8"I8q|]Cee4| TV$7 ?eO(CF91O/|aC#C|ud(]_^GN0fG)I:K;Lǣ%eeT"ȥrY08 4 2K§M |Bؼ0yHFf7;8S{o̞aӀXe7n~&_/_G+ki@!;Ʊ'q 5 te5uK.7ƾ{x#AJbDBe]#yggO˷+|x_sGk u~ _w5> ٿ'/&fߟOQȻXZc/ ̈́?OD.azT>} G>١QvlgG6O&|q潳eL 8Z'+^ ]ʮ|,?:ē~ުz}v\1qo1p+9=M  yl$lzrMl:a`w^cG6fUO-o[Ͽ5k1:AA`3_2^|gWlYY)G/r\237D, Z*  !n@QQ_JgKL|z <;^ȟz^=T|,6.6L_f $Xt[)-._}> GS]'o;30t]V7"c;7WO<})aكʹV嬀6>]t%Qf#]#Rͬ bEDDDrsl[?T-$ ]`b?kusͧ:90SQB k[֮8JzK$.gг)KІr# ,]].Dcmu_3g,p(^KJ*am#%j~c}׿CyǏ߾zng! N #ܳ/5[|*)کF፰c q׿{~qN_(!>Cw[oľ-|R?U]sxvKI#}l۲_}OxGn%ݔ {_b'h|[!vC6+^:NM QV-""tg z?F-b*'_u9Սpw+"bۦ^x{sYZ1qnӰeR#˺xc4M"ռ}=,u2)yNJk7~]gf3ovśu 7_ w3ov5%f!Ol\w)츙̭A$|#ر`G{x䃭T 捏cЬ(ㄊT.gp6pR]G:2Di\V4mX6Ml{eQ[|/l/:#̾sʩ/ cyg_D~/k"<4sdZϿw~YS7.9Ɯ5s=41μ2N;p79S?xZ}>}$NKHݑc Q_ h?5>™7!p]4qh}||LzM< |\7,Bю\Ǐ7Q#(Go2<[x]uTNx߱|ɵ]U/j;Xɻ`MM=g6/ c|$H!¼(IɊFYE,tLDbjO &=M>cͨNxU>) {|p8ɕ ?<ƉC}Ytr$""r $YYBr[¥ܼ7A-Gn5Q3yKc`!|婵uE6//9˶/G>CA@nd|I+N Z3uKV_ ܂o8ӕDDDDf4#ɹs>kN-/ N^:8Lc(BD[ߥ(^ LҴDoR  ~iάq:;9%| X {R}ac,ʹ0gL~y1}/0,㴍a^R SB@391EHkoL+&KőI{}>w>y/..}N\>&NL96q,dٰ OXMxOeݛ h4Ĺpc83?ا] :F }\ .v&g6_}/Zcճk:k'/meŌg nvRh>KX뼺|@,]sYڢ/O7xMl>pq"UQMKp "ٻqOMxJ§>aunݯ=ǟV;[clѣ<ޛ`u;FS1ֱ2ʣ&AV}oGKʹzoX_/? pǝ ̪zr<ݽ VW:Nq]/k^8Qex~ߌ4m0kM>4sל,HSȲu~{8=pBTstV/(? 9r6sx0b4έKJLb;]#0#a*::Jʀ,ov_;yA$>ük}.zy^v'X$+R,\9ޙ17h}%˖P:v35X3¼3q!2Av /cn?s">aQ V^;&V;Oqt5qKv c>xֹy{w0xb2B4͜%\RB9:]ܻ̩E竎4*'??8OyXTFj;xW^egӛ?[S6;gMtׅ?0kWMxX(MSzxv^^9G`$K4wp5KstGhUw4YYl'Xn^:6{r{c<V[;/) ^'%-|WzxgM❍|hvq^<?7in!v+O-"XvW#3cGy=kD3)ojʉ''{ojdj*OM<:~z\}-K̩^zl?AgwRE4[#~}0^7^1CUzl~ OsXE-Oauv~{ ],_@K=) 3{yAF]|"I^khLgU.(=~of F¢9tkbZ&n??-+bmXCd}W~<fO`6W̛FxulذTYe3o(B[jF=P֦:39+#<ޞ;繽"q;yϜQo=s{Opd GhiUԆN8١~u84 L=QBT[waܞe:ylaNVqǜ:Vň4DZC<[ \Êrcggۖ13gWYzslؼy;?=氬&>}GCl:6ΨoHX;ۓgCcl2D#jkA֑CGq68/wCmuf12Ů{|} ={xwN0`\'Ǫnjw硭{ ocA6ǚ\,'JCU-?{p6ˁC{yno/{Gx<ͬFj,%~ߠ{Y{dcYrHt7p{Mey>CG=8ưca*K+ c7'(xO08 Z*ywnVeht(TpK{33i'П]<F R]]mTu5 pٷo7?ˡ15,k5VYPe=3Y:ى[cc{yi2$i65sk})gvIz{{hq PQRݍ[y( *i\r/׌ذD̉o2)};~M;v>#ٿ<}l=N,%䎰+<&~={S{wطiK?gq?{ўְdyxd/IV I(!Ҕ~eʆ2;[{"}l۶jHq /a~?˄%7`mm/^eqWQ%ZOyt~l%;bfBMq_;i +Ɣcl]>X:̷=q?Ppm}{/a|]<AXzcl^Njێt^U#=8_y:>x(ĵWUґ1?[Adl )d۶Cl9pWfp[vao(7aTʸzrx> c[5y!vv]Ŕ!lFF{;ٟDϧŬFwcMYjʒwʌxv0Pk!1]~j>kX?cF)4]'Pl_,pKZljfϮ w/;?XBDC/f)JG1FVJ/Jd{'B|JS=[G~vbϩE|" mX _i.tfP3Oګ'?Lw{0q q>Q6b\\D^Prbd-Q[ n_; iL"bGxt *fH3V(HYċ"8gGhkgr'Vp}dPD:ƞt%X0S ͌9TLtB{]?N;`!8{{9yrICz 25"5mO/g JFt?n dE׼A01޳#ᬬe|GƸ"\t)8;:`(}1NDیEvvr} )3M|9ԗ1+ um[+u︂OޙӰFΚxQc w4P_gL퇛y!Vs4ѦxI5@:Ř` Wd1`!Cogm;:8z:‡jɮfJa8Tر=/&R4?ɞFAE,D@Ҵ9#w*?G>h(7]TʵnBҭm< !5̑pl}b7CGi8`3//jc.y5L] FNy~P`/BN"dh4F#tqEN1lՇ80a$naNNwS8Yg&qvl8ƙ//=mO!t7{{ن,58HG<{xqEe 3vr̅D[uC ftVR|ܯ7D=jSw2&t4Nts|x1+#a`B8JCGWM II硃uf=f ݧyX'o^ÿ,;;φ42%*HDc 6t)ȇn^ȭ%v.X?ԑ6&;m0esC'7S3Wt6ňP ]lo+nⲀ δh^+thϞnLgiaӱN^^qs#B6qUci2m׷mᴊ q%I};D.Mc<|xΤlfe~d @J<'n2&fSDd3y ;:{I\Hp xx'}ƲÃXgm،$}m`__Y2%& 2TZmإ l?+ԚbSV z^ 2p$qksXx`6;^w}] +Yj7Ǟ^:i*m= ~WQdp//?m [}k2a|<0̕;8'xo $Ϟ?e{*ЉgN¦\g޷yn=*Xށ0"db$$}R5|񓷲"J~ç~u|oD^Sbydcͦ8N5bЉd ;W`3^R2׋{09v1*M/mܺȇ A<?t~ -|{*X'>6-iz>_ɯ<>z&}^rw.kD'Kd;O϶o屺Y>0}#s bg{A |F 55ʞӏ?Rc=Gq:.bI;Ŷg`j~Dmp7AYy35<`)W?=foY Ɉ$A=/x?G&C__?_ĊQ/N"ou|~Uo7}7/]Ua0JILT*^"!3^摗0_s'r|FLdWz=.h43dRQ~ sm8/qHFj #GW(x0@I+ u.?r%Sk$Cfxn^;zh1-%%7%p?w~b10JXG+}0ht-T\A2)LF ,Mje@hѿYK4K D #+[X cL"{1N$}*#wޝ-,^O*Ab]#nеu v/;Nݹ6s-l=k=ȐIY~1%|Y~o0Ze$LvJ\؈Hq;+Ô_?pyP!^ _+ʙ 6`7|6!H|W_IUBMD~99xҲMuX`v=U6,SuA4Fh4TU%VLBGNՕC XmD}}/lo%ԞmeZ *>QGWKb2 a40ϱ*=jwV;*@DFC$9{nM~ NnBJf## X񰑼|?~NNVNWQZĦ2<ǴCg4rqYH<ӂY/@hG34їJJ'[2=5<i4?S0Z m 灓~ VY"3c'HF#UW/]k=dL8&%|RizΌ2>qic!Du-zyn#_q.w%%ɦ'ɮ"?+Xjrc>vQȭcuDK8Ó;-RRVf#8&627;MF,9` udv ЛO/`I ݈䊛JXYna`[+暋bӞ!5֎e2S<όX044'qT{ )p:|.J]#x "@"$`uS3bq8vjeQ0ܵW&][[z98&k{ :ÈE& ׹#fxHT`3.ym2 9euup:ͯཷ G |[fµKl.J|_jx/w))q/IF@? &/ͣpdFh8ƙ!En msL6pL22.3.ig}m ~ıY~o5OP`"SPXi&Pڥli}$8ΞۈTnue\Wؑ>;@l/p㮻)O۝=!?3MۣIn>v+i\gPp/.(wUbӄeJz<erGՈj"/xk򇐍F-y|V#.kk-Q%jC̈́jfГ9="/+~&\#N̲"zGh<}Q`).k(pY<n^Uyv:2s J'{9֟au+yƍfe5ýT6[Ǒݧr2%wܾ+sh#gBg7P%jkwlDNQ9zm8ۏ3&%KrK̈́f"u0džU/cpY^jm5l.ZiKع- !ׂbe0/!0|Ba4vr\+Xme1XQSm&N5s"e2 Z"9Ξ.lnϪ,;N ̼YG7C aEϊeQE nBQ5w*2*&#nUՋܓHW?Sa~M՗_&f39U$83ĘϬ_ ٌb0KtM`r~%Kvfv #w/,@#^on6b%@b24qu22IYu\e¦Gt%fqMܱTB_I,_Y/J19;Ȑd4.\jrȵqYx0JF Q^ހcZ:M93j4Fh4Fhy "Tҝ;@ aF((ɣ83S6pgyRRtD{A: fI%3, i=c ̰/Ucq1@I0I[l,36e-pC'Ҝie4R\!_ل n9S3FwАS2.mt~*K._:hz(ID[b@x:Ct 'N1W"$+ g\9!Ș 'Vu'mm O"HV~ג,d0gJhLyA͡ Hzz@uI8:A$K8r8D"3t~:=tw p0"Gc'"2Q;E5EZ@UAZST%-[^Zzǔq4Fh4o2JR :\Y d-5p2n30Y2S96x!YO22xBb~)@8xR@:ȁ$zFh4Fh4O-Ѽ>Ɉ I_GA"#c6Ct݊ml4$IȓF:L[oTh͏ONV#I%I͔Wp`#w#r!H^rJՒؽ-;o[6o/:)b!5~fjKGbE^?EYZ(tN&R0*>*j7P?)/<[•kpŊ 6"2*)Mod"CQdI&]OI1(*\lxkDE=8WBe`Y6^F Ew,XQA4cدthL"AkwHZAUT#tgp3,BA6癥R_C$:<Ƹ 0#r(ي=C:>ΙMlhmH*P$}*\q:RB賏0#H8qIƋH1 1U¿E?eBM1<4JZ1ϹyJ\$Zd!DJAyS#Ib* .D7 i"bbp8E*#VϿWc$&pzϳ-DHޭ(V'KV(!'ICg+kl L()ˢ9}oI?ȧ^lu>kVh,D9Tݧ c95+8aB* #MyXz%C Ѭ?7X&Y%d컚WAIj'8"` _:M֫m=h4_ ހ$JIe.] %HHk}'Bd6r^%^-gqz2gNH'`ʤ%uT(*0dX vbR2kt%Xobx7m>rm0<#VP[NZ+g&$ht% 54ɆƂ֮+fղ\j+YC5Fh4on:l6s#OJl3z  <7N,W{zx2ea{U8ҝ27-I2MvU'$=Bk9ttcdOVwUp<+F΀f|Q>+Б3Ϗw!asx$ 2L 5;qF=,;\,sZNN $E,ϙm! GV)˵c*X:e&y96/ޗٹw9st9+@I 7 8n}s. ,ʞI&W+wGlc " 2* :~/%,Z 4kїi?1æY,],8um; )5sAt?d HȲw4F!aͤڢ Sdp U:Osxg+\,f#dkX?L/F:mq8E3*YW1?߆KǸ(.3f~(u֭vZٿw]FBRc5k]s,h4FѼiH\Q_@$I~#Ia@$] $ }qWUeQmec$ƶh D,z/eb ҅W$.$IH3.D |FP OzcI J@nXfҌ0$1q?~M"YkeUHl1muvƗ@'ɳ u-(ᓌ_Q[ù*!wB;'U#?rΑaY`, T>ja1!wџKDI=Y)Bg"w^5o/-hj: yMX~ QiǮ3ngх#K v rqġfZx{PgAN̔SZzjvH&I`" įws: R5;';|nd㮓\n.d;{V&"0;%0,X :(()Uc-<]4{{x\QT;~;K6n$Sza~9Z-XM /_Eyk4?6QOa׶Z Rx|azʗNcb %Hn|s?ctF8YOQB뤬C9z$šflLFy=]lT9X 28q13Ɉ##04@0 2#*Id9S{<5 gK /:ͯ[B͌-aYXz}5]:{cFQXtr1֕X1],bActx)^Ʉ##wI̻|TK8s)Iy_; fP`4[wuz[ MiU^J^[4.,a,,bc턬'kF9ug:=o~6\jٻ8;{{viջmEBK(ZH yK !Bmmٖ%KJ]mwom?v%^iW+Yb{Ν;s9{Np')8\$9sY-@gt37'3ݫuIBc5`UeDRē0wd2C$Foa\7  \:UOE^?lkbgH%1S/Fj[=XϿ!pUH@v>p{abچ>t'٘7c[g M]wn-y4]$$V E._UVSTݍelCkxa$'>2K g,Id &2$2%Y_FӠJ$LO*;J_4K6cISrB9+,T4&uY$T M|uNI#C Xl$NƠQIPZLH'%N/mnekY$HdR33 \DvH%{W7Q],VǬRECi-O0#zlF- F*O 3>˚YUoY]jyHczwBgG&u]{I%Pfnj;gtӝS[UJ劬uŔ9tJQy>jbxh?d4i>OQRκ6oA 78?æ!3yե:7//M0_;?"euйs:'\4֘sÃtfdamXx}'I-dxh@LaVW#cA"_4BJW^ % /(-)z uOI炃tqWL >@I߹ߔe \|d +ڊ GwfOwIH<{v5ڋ/o0FMYs)ˋ~i}=1f+@]6Epߗ,L!Wj SgMhWKY-zV=ى)Ee%\j4Q11d0>Opʔc2b8|?.I:wmٚhh:Av?$?{q)E!cw:VOe4fG6UxjkJ0_URSV]vSuΜmϥD;pEܰJG|W<3qd'y<[q{ d &2LBFIFf : ɲ?99ƃ ,˧>6x,}<Oqd܎Ke(Y,W._zWrԮwl]d7,^ep3A^|I^ ͽo_-2S>o6+YF*^Zg3J#y.Fc%^3lc3OgOSOob+jdR4d X4~~͟쮓l4asDc&gQf% jO1<炨i&n9Q= zA2aNWu_k`A<~.w8DJ- $om1Zy|G8%;?&ufU&#1=*DF'yh\l\c\kAABd +پыs=0ox?Óc3t:_ů_ n:y}y'튞@yMSY{9='x5t7'F,PkU2Ģtj%#<} ?@ˏ>5%` O "3wi̬k,Ξ剧Ĭ LpGs=w: l ¬>t=]8vci^:m_D "0dɉC?7O$&9ӷRrL.OOgQ16ψOx(gڷlV-+qϦ fyyw㓧=`q㣿c`ЕD}w<8zIsA7s~.%"8nxHçLνΙtHl8˼(gʧrq  -1Je(oGJ.M8%E|P8͝|!Udtj F C3siAAAAvBo\٨^ᗏb$%u)oamF+ڢVo% }~KeC=h'dѻЧ﷚Ȍ|v/}_/܊2t?1lP4Jϋ,fGGgcd6v?~}UxF[~յvXugh=_@E|]|]'ٸjs7>ԉ] }=×du-M%^{$6޶2-?x/;|VG]M*8c W/~:POήe[YI1s{.u/" ^!gwN2~A[mnH [ +_-.O`d}Sj*}j+UKVQ6޳o=8<ΆUx]s2aySsv+>{|O㿛jFt2Oi~Hzjr:n7գSVS\rgʵ/~~WʋnTG#e{l+I+h>p`o|!:j(g䤦~~mh+;/ys]G鷮5; ǪN6®ySXSRFw5_'鷾·jhs`O"~aNܥ!ʸ7sdOae5^Bxrc'G-Zk\kX=48?Qo羵6Tj'G'^J=\ }cIZ37=hFs2|?~w?ɊE [ubҊ^NeVTLICT6V*! R6NѫGѺKU"}"Ȥ~s9E^lmokPw_|m6d mhohp` S?ʃxR%><+CDeojn*~#Tt;(IN8ިcΫm|}~~>mtPd)SF-u{tXn^̉Rj6pJf.A.{o7?, ߲l[ۍugx`-؋b>#4z+!%uO1π[?;Ye"|vO~wA/M5f}>3l|{*O=5q֕a?eHxWlfgWw}-MMWy^+VIN>.zDcGd:7?_[A*YN<_z8Lyk)rc= S[P-lOzŊ.Dic\ dCkF ESQIaI-7Soyw]_JqኘY_7G~OkDK1<6űmw_ um+kzߍVL rB.޵uN-?q+ Yyם,S/26qZvkp770"Sb3R%Y$L%|nsoA,#Eɚj eEqxz7k!RJ>sqU[~(a~[\DÄ*dxjSIwmȻ=p7>~{pܔh!?GNoeFiSq| MHy=[uҰA    Wކ*F>jjgo$c(bmɋǞ !!KZ3$42߼D*  3 0xm|]Kjcl2A,zEwZ2LBM1Lzg߀U#bL&$UU"\~I# s+9ZZVzģ?TeVIosC &h(o"x@TZf-լo4cTY-e LN$R(F3+6TقQ ,?{b 0)o\; get"o<@SLE޲ɍm< T@.7cd$ʄ?b4rk 7uSl^fSqNj #+hJ22dr,Tf/mU o(t7`,LZL8®G4zc^n[y6HJmnkMdh8ɔ/N Ec6>My&b3qzϜb>?] ueכ1̕lB,ɔ/H1_HFtcՙ!J}{ ~G2`Ǥd~E=o5")9cAF%֗Ra<ddDau Uh6g4-^8Mv6m-e⌏FNJ5Wrǝu2זj)Ogt4@0m|#,jyHV:(1*1FC&]W3cklNm,šO16sq[ e:T(8]CL.Zrf@jSQzO$XN^Bgū0>7D ]I1ws-ッCE!<<рeV͞B!՝ly+m;NAtAm(L\"ɾG_7h&d97wy?L:7TR#;gQ-oiC;V_DAJLA5K() 9ܓ+ܰ֎*?5SΚH4nh[*u.giХseTɠY-{GѬIK! r?G2-.)q2fV*i{'4~E$M7WQ[NGL;l`ML‚$ '3:2S O]̇?uՆ}c'LXF:fbn!*)F3johvc@~%*0YAOI%3WhUkX]iB+Ka cn(cmsW <䲌MYK-%xg|Vn:f8q4lh.svelM&H G H l家"fIB0d"g4$!iij'JȆ:c8ŗpKg ҘlaeF3SXn""sG >z#5j-*8#(dUl`HH8 [*\nB' {"[kJ(JiG:6mFōܒC$|1 _t FSm&x(` X#k뱧d,E,v`32:Ą*381B.܃F F[&O(c,f4#zʹvif$]S`󰪦C4€?P8A^kg]jjdev4XhDźjڝF&+=(00Al]Ot8Y_fi_qz)qb &B!P-iB+h$M&E#L%s,nnhidk"@ʸkEFJ<39 S*>}5(GF& T7pK?d554Ȁ$񺼴)QacIrj5TSBA='iaQ!>XZj+븵΃]H{Ȋ ʯRAAA|G,$ΐW: <כ| I*'cp4Rb#Yr ݀l"o*9S/毇)y$@42&b.D!M0Hh8]" Y6b2^Df,JծbT]Ze$" LcQQ?l2ߟ$ـˮA `pl3`R6 뙾<rp8ԸBiUf#ںdAA7<%$3]\Y[Q|Ee &)MR9"H4Zn#3y"!Fzj g.I|Iv3.L@'Kxg'\rGvڄd))LxJx"T-L0 tC6_?_0ޖ Ct@4ğȡ*y}$Lzs|.K($ /ix4d"Fom֜w!l_8I4 :Yb1 zb>xFtB<e8m8Uܹ 8o*JHC( UPkt8 3.U>%O͂`]X t:T<4$|ŝ[^*9"dTVT6&OI F\l,xXNb4bӜ    !e}S)# kPAؽ{7 n9AN\wYfg=X0,Iu)eۍ0a #]yXV)LOy1) ΒTFVZ֨ب/L2Qv?1ЂTgM:, =?I1;͘,Q?Ta,*opEdf %}xi*- .|6e(5hŨ0:6).?Kћ)llI- !csÜ g S0Wq*E`1<)ė,LEedԾΉq$Yh3ao) /plˊf'6nn*j H9́2rjq AAw`0I7Hh*nn<8 Ì py^OYa۠$crX1w?WexǾ0´Yd\NwK2FE67f k믢F.bEЛLT-TCA9RIu^|`_tY HKM1YLIna T$IB%6(*,fsX'5x e|~6ϓ#10-t6SyQ0T-NZN-GDhՔF‡ZOrbp$ "nq Ij& [eND72/= jjj0_ë)//e*I&YJzq:4!9(y|C<c5Ig R͖ -$(.( "K&X yZ\Vcd5k$    \^W< ,J+O-ZM)()Y&zN3-d"閱0>SVXngbBGxɡ;,\m(8]DQ}sUmZ8+ qս<~2>'d`K/iz̑ p l[o[j+q~%@mAS[DI&94S tzKoui05/%ϋ)mS(oQxaF-Z77,/q^F_RSκv9ZnJepRvc_R0tcFK%"dN"$ ͲZ[JArqtFxu66-A9K!<`t/q\UL-((wsTʸqIfZ*]9[&&'˄CqN    R| Yfx"df}It4lO#;zJ яTY<$ 5E_odJ7jF˵DWMmgݎh؜&s 魘.]ʎ Ʌ:ˉAQSxOaIW k{߷[cERas j}[~AAQ/r~uۗ86Eq͑T=ե߁{-% {d7x$ Ŵ4FI*ʖʲyItmWdo1o{dfk 蝆+^WXl;:6 (Arع}٘^ j%/5V\干],?XR0_rJuTn[$tVy8AA#y;mq:aBְV)LERk)3h­[Wv%Lf#xZ>ee e ;z⤓I2:z֤e|vjuOm.0&@mW%,r~oBXZ"(lcU=nR^c/=qҩ8Mm%TEAAAAᒈAaJ_s1ٝ셟_$*Kn/i݅ µN)L {\,^-~|Qqx,8 P*HBo1Pfegw[y5sQ HXp()~zM*EA9w(5)1 ?-ks IzmX AAj(.6+ɈTҐjU.bEU@mRmYU}*i0^lz0Z&Y\yFO Оr͒T]04):pJJuK9    p         B߷\$cᆪ*<;IH666a3 vg;;=;gwgfgzz1cABB:X]nI H>u+ܪzyزrjgițaо*""""""""",= """"""""""""""""""""""""""""""A0H oɎBa;qHDDD-q3DDDDDDDDDDDDDDDDDDDDDDDDDD5 ފ=w X3KEDDD:c?B/m|EDDD> 3'v=vrWi2Xᅙ'VZ,"ؖj ĮCa|33\\ IDATƗ%aǥEDDD޶w(- E _zXDDDD|]KA|2 """ex/Z[Z"z C"P{/EDDDDDDD> rQ_:EDD`:a>p=EDDDd xc|p.8.[,-yK E87ceʻul^1@Y|Kl ã6rQ_eM05'EDDDDD=.3ו(^&ع<n;1EH7ry{@O""5#Żu-ş?SZ$2wfwd`5D07Qv;W\4;LDb^xUE"""""")LǝuKDDDDd Xq#kV4Egf0 ""NZEM$)>$F:Y+-wc@nb1 ff6Yzy9<޲"e@pmay\2(&b>|a-@V0TDe{xjn^]zXENkh[WWzyYS|aKYz@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDNa| ㋈P_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""%)0H oy)$3 fI&U~|HmRY!"""""rs)沌̤+@4"(ݻuf$S ^OJDDDD^Sj2tCYEnc|6l%T&pAg13"z(\,fg.TVTS3|6D*1+=Ic4iwq,,sIec9n s_ """""&L3"!Pw}a$r6= xD;)}= y8>(ζ<_gouuɧJ h}Yȯ>5YN2G^O~YW~+¯_WK%1:Mw?LgByeS繿f6vIZ]`{e#kh"S$l>@ y+29>̑!/SNYQ@|K)d蛜bqXLrb2LҺ,=,?WsW/.4""""""""""" L䊼 U6(8fzO'o<:a|aPjtu 5>tcRMw ptwMr/m?YGȟ9c3j{)`Z˂Vq&f``P2?< Εl_$R{sWEDDD.zS{PC՗V[,260ɁzY5w}sg.^_tѕ p][{Zi, W8EN:}(MmU|8p] Ӹ ]dY$9RVU˃x8.a`\ ,&̯no|kqq לJ5.\`;͵BF"""".p?"SUwl i$\L)P1߳|JBp -:ȶ?8|I^p}2a<\]xe苔&*騌Sy]y3>1̷J _csbmZ҂zW؜c5q 8s^s<Ǜkˉ\\Y\{xuKB]|..<.Gץ\'y\HMDDDDDDDDDDmϷy2ʪbtv cxr)fvf}ǽiϿIU`r6LL%PUNsy,ON ^ezr I% Q[YA{u[`O32%cA0Ȣ]s zk72ʓ! Q[UA{E (g92$d{cdmbf &Lnn3"#Z[Am؇344OZ I|DYW_h)'gː 0UT /z4TTW(20>LcvmgK{h%L2SK<XߢK:6TS, P\[ICī]^ED}&15L$uad ?`.2DB*╴VSnOoB5k'v 'e9}3209P2K󇨯qt+F"'gI idY,ie蝜a$%m!+*i/Xw #$,s"% PQNS,ęnn!M4 IMfkH7`<#kAj˫(?rȏM9|MO3if5 Mrx ;"0 _Bg(K/M1qEY zj>S]1ܗ Tޤe} *`H?_}9f 3Tgx$-S;aG +YVa|aHGmrC_0g} ,?vPs]퍯wmF OO+L[mP\7Λj^+Ҽq~!,~'g)@YG#wݳ]0Z>w>;f}r־DDDDD]J7۶ 32#'gα~z{1$/`  AmKjni^X^}<~ecغi=f9r){x!7,\cwlj1- <4m&Nl)g}ȥs>NJxB&ϿWkVqQLPpCf|#y''()#lڹO.]>65 /p?J27=i/f#'VS{%Zǀ=6upY]^e(Qı,)&nF>*W2w~p]f%71a^ƢW5?"F7C{p˺jI] E3ի5l- `dR<ԋ<|r"<l/ƶ 5~{KDDPdES<~r& Vy88 yiC!#ck7-|X| }+~l0ȷXoy9<{ ?|Mt?<2PZyҶ|zZvFϾMoF?.زZ֧yM'ehjh;.֖&,~sD̎Bs 7Gi}24"FγR8MfzC``U-Wl+l~P0+3OrQf ~o]⿳ ua_dH<\I$:6Cü:ASd~6`q6CF|1:kx(nD꫸Fm5״y|U {in3H{7_`zΡ#Jإw>/;}:\:J_o#߾ #
    "hH__3F9( X-0{ECfL$T&#=N2ݒ00EўLOMl`jf;j~|| ~:^ӧ@>ʁB!ssq =יJ>mZj1%KSыO'aQB!Br{MsgG"n=(>n7wk!TU‘:;ڱX,m\gO˿ik12<>roLշkۧެ[[ߠT*1dӸx>:?>F}ețշ E?4чMoxz|PX7`qNN˯lo!_(ܨ!ߛ׊O,';a3<<鼴Q\V`zrѨ.SV nm)Xfz{{UZ* f}t8D.y"J>&}0 qm:=uzb+ez{m*"rk[OpkAv1LqkF@G~$G}ćBH.wwd]8v/W-Ye˵P*[!.gmWX-MA"ydfq|KH1tFn_yːȣKéVol9܎(3?x6&FjSej^/P(l6(MIZSL&~zl6K8!_(dj=ȴ޲ٜ}j}@쪁@ o>[U#t3fgwl.a!7qW(胮Vo$v LPZ,nFSPAϵǬw6;3O>&\H&i+';|ky{e}c%_at:M@{~}ς>jշtww11}.k,F./TV/}WT>ܝ}A22|a4z MJSTh z|^/ѥ}ukL6KT0^oz ߚ(zڬ$ų977N,U\*dNGooX]X;:)J8&/,h 9F IDATݽ=vvz<7ӓhZ5.6(KxgcsT EQ݌|V'''o9>Π( fޞ&;{/04k@O8CP`n)}[(|tvQ*VL6N=gtdXms.޷eNr'+.-9v]6J2.1]lmYVK@=6jh4(?ҵ8&/շkd9l6+SX-76zlU^+wRT nJ(JXf::{@`x<}fS,3#ôkq}݇Pd驦OO󬮭d-7ZUeV Cwt$.Sm:Qdtdd`|bjj=&.q&C(!PVZ ܵ q\b8RHgGCF'wrF3::rueܢP(ͣZMBյuR4Fʮ`? J%7$Ibltݮ.XO\&Q)6}ux^pk.s3xn~ #+<7}F6_5nwoM??t1tuv08Яދo{k>NH$Y\~ }wSeYޮm.R0ؠcٚZI2gZEQZy{tXW.sӴZ1L^K>BܳL҅btё[uzz <f%H4}wR(u]$. 淣h#C8v TZ]REQX][cld1jRi nxA{әiR4-]]eYZ sOjYY]cye_ۤ[ltZ'k!rrzV(Z`շ뜜NOOo?T bH_&rLxg+[99=X)-ގh_ebaqēI:-T ׋&ͲD52,0d ^`rƛ*EQ mOQ. nSV>\{r|~7-F9==%@q&j4za?[?oEa~q\,3hE^i̥=:;7+tuvV(; +k].<| ~wLO:gAR*u 79=ͳZ>XT=𵳻2/ʻjrFiz<>>FQjx<h?>mch~FY\zsCq9W vQr''lmC@/-7y2 HQr a)d^ttX,(5h~͟F ܤl:==ecs^Z P65ZM*ӓh4[TU\wXw4Z\4DXblt^G(W|릗p]z/) ,-vm)Æ {<{b8kt(ۦ$:pzzdb|^zD"U:;"ɲ SV~7܇o[,Ymzs: } YoQVɝ4 ;d0$n(l6FԀrRH&j~GGMҺ=5E!٥hHG{O$8:J]F&hv4r{1@jTUt:j-FG>Ғɣ[wd]ߠ6  ^PRi4ͥ.yJ%Ck>0=]$7o)JW* GvkzX.AVcTv?X86Yd3jd21tV}չv7Yhdr|7nocٛZ5zjB='''?yLJy|N}K"LOMifSQhW8&ǀ@DX<@߭}מ\Wn7ܽz`thh@NH$"''}:kv9 "[t+*㦇GwyF!T:MdgoJ?6[}:ڛ'`yERH&I<{ ]3kǏ?J,eS\O/ו^? rԷyWMDY}n/6&.q{z7ݦ5Mg MiޮoFyljsQx=&>|:a4[>WwKJQzܽ^?eGpkE5mCX\. f=cP*27;iVuBt Zrrr›tvt\9|^UjJ%M[7EQZjڦ5s\jy}`? H$iM|4dp\ZF@~{M|={tt`hzy=MׇjP(4m6+Z|jJ(!OP,E CʐVRiL&Ӆf|mJzʦ@iGוM.s-VKSƛ޻ 8fi$!nŲ=AQ2컠dVon4}nOO4S>XVMqqzǛh Gd}MT299AYw?Np~Zϓ6deDvvMTZ216J<7?3Y=^FL׻SFHڿIZ9~r'neKpV)pRTBPtF}ȬjTԒ#,ZhRO(`0Zk4tC"dhhFcspXwר4Lb7oVSx<_ih a4Fײ)ŇwRIb-9X4wkƹy<ɵk 1 g2t\U%IpSV-4goVr_yg6..:@T(ȝ\UbB=oǮ=R!o"l9# Vr;ns>\vmTᡁ6M VR.}TxPoM22lFӲfML~w|>/fz?BW^{Zi=_w6kX0Jpkrm3ٓB7BRtлLj}GXj9x]IFCSstsrz%^.L&#X.=1Ogoyzo|>y=}]ܦN591Npk x6:UCB`\._*;3r=BFvSP3d4iH ӺJ#Г$IG;V^XVSx{[DܮLJZU*G)Iaųߥ nm3=5,SRd&a&0ɕAyL!x[I,l6)j} V!RV/[D&'S,,-/^ToYxԔfYߨ˯Zds9?=kq{vܼw} j #OHm<Uv]$U $ݻ"ajMcKEcqǝ[d3,r{%mJi:Bvʬ%yt2@O|˝Ͽ{yt]t: Gv<*ds9|zZw?Dr9 #g2jJQ*EwWDsc Ec].3^XDөciZv;Gt ƣ ;.^z^bCVa'7F]w{U]ܦNe4x>7o_XS5_?N3WQx<>qrr^r|^7ꃓ7VgfVlkJf:Jh4ji+<|tHG;X^Y%22[ v. ,)Vktr:WΤӭgۈrpxH^5-vm^DדJ9==b@g IgXJ?8dnx7j}>f Ԫ5cc7&tv(L4Q*E8sO_X~ Y-l6Q*8:Jm*oT*/}vZ>МI{{BR!r:tt: nQ,RBy||ә'&Y`r|iёa^/LG{;:}}xGΧ@} H[[XeZ~ 2@L}ޞQ7^wmT&,ťe̠jn\_p:]l_rxxH{i,/$#dΚGoBuf/oOvv)8;wM"l9#fltVkxnFYX\Vq\O`XvJBցQY\zNcdxiۺn}C vwWǻq K~66YyagՕj>}«^^9F#_xNpk`JZn06o.}li|3LFB0b ^af;{iYmtt|@շk8Krz=^EjokdxVR MCZ]tM$? ޮO8U*ו! JS7hF[Dvv(+L&A4k\o!{!pe}Ue o߮O]lMp{Cs3olp9]||Rjʛbz^m>S,YAC{ @Xb.r9m*osp\& E>$0F לw!u*gj7++%ݽKc $IzОJ<~ޞ[CbogoFh["ϟ~M?8dv}{N\iz(J|7 sXːǔGw?y)%_E/o[~?v dkd>@8@ (vO"JK!'|^B܇vF#Soƽxecʣ%_B!B!BϒB!ɉO x]4_ބϞ?G!B!B!B!#$A!B!BGH>B!B!}B!B!! !B!B@ @ ? ~G  ! T*C"l6acmJa:<{r(d(ix7yR$i㗟X WNO_̷)L&-==^{Él6Ϟܫq[LOMbqa'3˫P)_9}cP09aBj8ۅd|'?a6ʼj^b1d2:-ffh׷ϵ(L&`"dRi{Dj5Xy@$ETqP*J_uoŌmwzn5"*r9fgg03=5~%}{p `fz Z SE.R&"L+L |>D2V ,sfb?S"'ar|4od2ȋѨ8=d_i}cQB}sRO$2T*2?ƈ'Xq(U*iqk[v?y|p?+P),JnܾU fgF`FpQ(pS&SvYLGP^$(JXǖݏCJF?:s?$^V9Nz4j57T· \{Q,le:..wƚxp`t  x9k^ F܆T*|Djlہuʲ,(z ˡTa44 ^4Mc{s&@^[T*4 Fͻ܆qqyp\ ,;"&PU3$Ib1fgg0?3>1aõajYЫ`(@R 4M`ckc"\*ۛVt BP`c} Zg_ۃx"5iW!HʠT*ç#h5lo(J%8]$S)p^Օ/5Q(pdqrfg``r23ުK?r]|:<6?)^䄍wAORxrŰY-,C,n]e/gw@./=Zl6aX['@۵J}yD8_FN^x+ryTJlnCPt!i,-cjR8yV^+5_Z .5R* \ m,m..7" 9+0ynt?<Ɓ8$Ilm /KB6Bݾ,Z8k/no`U( ,-.S3 x:iq`,bzje$I8nJe:lnn@3 ]&G6E^R<}uH'zb`*d2)&'&#n/@Q5PAy.rgWFMrWRiHҾ`r^} apO$q,tZVP-[0*(Xjڪ]p~@{;0GVLr^>&]0tӅ_~ 4M=#\{(JJ #rCB6qބ!HL&J{%)|::b&*\kul%0LkxOQ,x0/X\dY'Q.tt^5 q8<>A>_ 9"(sv  ϞepzvI MW+u:~2:L=S6k>D"0 þ ZBX,ڋz&8ÕÉ͆+ /_<8v?:L&ca0br†ٙiB8>9?A.`KvGp|rֵg.#Mj v xYPÅ KTVD"2,NNϰ#xquH'| sP(+Pb + 8C8ӫeT,ty0?7 <}eԢnjݻ^ckcEF^NS.? U hZ ϏsAH?~zr'縼rݯp.?E1\9lB2ťwifK"(L&#hI ]`jr%d9\{}밯,~a;>0~uNpzv!y9D"VA&x]fodH$p{T*PT//u9˲'H$]@pxtZf6tls^_P,159$ID"X灄}{0 b 967qOS!D@Q kL&#5dR "|>?W/LH$GfstK]T* P:-o3`^@qj-CT*>3u[܆#$~ÒLMD"מj5K%lnCoԝyװZcqa3\.>eYlo vm6 \kA(V8J]]nz L&IsryW[Ô-J3XfVj\:~ /D"T*O]bɄR ׏u^rkwbry~H%ZߕMXIw=RT0U`Mqp=zѥ.-. HckcoJvWÑg>9H`0qXDSD60 4,l2\s,}ZL:#X<D{;۠( VXJ3~|Vkp=7Ll&J7qbҋx"T:]ϴT لo@4кV|tx诛M8V3~>hyV7[A2D" O[\:D"xr'H{b1cukNs6 #'ATH4{T1 t:{c?q{a2&X[sa>0~eNDp~~UAc̩FI҂8>0jN+ˋC8:9+K(LMNd2@,#P(0gеɈ%ܞl F@*"Wh-Zm~@U*x{D"QL( z[рwG0XZ0 L6+aQCp=Xj4=wJ nx"u"4??=s0noX;.zn&)V0 u*ϞV!H@,D* <f ..L!~V#LdlƆˏ[}tsE"_ViŮ bCu RR\Y$ ȡi6j5nn!H03=^S%LXZZ^*N%σ>˭O_,5i$yDTc>ih-([ BǰY-ؚo7y`1 4 ZS"!{`#ϿH$# `.5..uX[CV4{\u%pIM(Ʈ0vKNW'.oY@I9<:_<kFBp$ ӕs10V{Ȼ^P0tV{VE^ʁ zHh 2,/. z-O!@ĕNMӨTzFy 岮1Q\FP:US@CkvϵZqƸa7H<ӈ#>(+4']^TՁI,QÛder"gM-FFtSa |<:~sT| sLh[B~q }Ikl6lV+޳%m5Lgl~>WD2e=s+]riۗ,$|.`ØnyD":- E,^-o,ۃɾhh4|.O,X(}{R)凾>q qw1DZ](5+=P(d Jr!Z^& a" H;rd3(ttO;дD^-W^pT*Jv_?DK3frLLVxdk2aU;jmyTJ%?zFx"ѳO1= Ls`  9vC."&lVAlnpN^tR"H\ v/%QûiQ뼵aFN\þo<,r$f:*tV;_"ˣX,ȥֶ~(t_ M2Gת52v?J`Rטj5,ˏ !EQ8OGr8Q-H ^L&E$t:ݝNk^Ƙ}eNƧwxz/0x;S"uyi i:BL󞓭͡.O!w*}F-jZ_OsdRi#Sȕ,M&T*ۼzjE$98JęP(\u8C"Ze2KB];_RDP{Иd;)$ >Gc1{}zg ps{;}Q׻V,y-EQ܀NŧOG?}d2dP)Bg:=}( Fss(˼׏H$B6zFR9ԑV,"# Š$ 45RLѫ~j{X(+|baIR|~xB0FEjܠ~j0.7H$ZF#mA5xESły8C$AQ'D"ാaAm>2J%xjã\ǝS8\]9q\1,-.4Gw-odsd3ڥ_d2 zu]+}]b6J'S)PJxp&'l8<><TZf(JX^w^#h(- m*D#l2A*X,"T*-N>b16PPHp4MCՂiiE{$l'RH:dD*mGh*O"`a~A&lE,}0~ \{}DHRE EQ >~:5hh?| rA2l<, ^sAS(ppfBPZCB,C,ca~.JюFe&$mnTծe|:<)&l6QX뫂SXaN$bwk+xO\9|Mv|rE\'c4L0 ttYhj5d9PrI}>2m!H JqC"5RF &+A*ݽ+P@1JB!T*, 8 x8٩TʡhYE*gT*4VDNg3:}։_DHN NFbG꧳\4`yz l6Uh4kK(8;,hJ7=&z~q#BQrt~ر1t3x|8uz@avVxl:EQ8<>ix-pj'کT*LNN4&gZ-6W!}ϵ`!Hj'} B-67ty!Xſ PT8h*Ne:| {;]8:k쾊Geey "`URsa7Ht-޿4븼oށ1<⾗tNcNQww\ZA&N@.ca~M%~iooϯs5:`o  Bٓ.#$:9Ŭ !oCɄMC,cnv6 Gs.ijQN\rucl}>aHR,. Bo!m>3R(xrqv~͡Tǁ둞%!5rQmm??7`_6V!H 5Ae zDQдJ{;۰ &Q!0?7ʦRpˍӳyzjO$|3B#K`2s`+t@R N߽hOc'r&ϛw`vfNԇ"po͝<g+xr?0.._HZrZu60 yb5~T#>-&-~PE8߯@@v#H{c7 <@@ [@*/Zj_<@x5J_~G!?oș@ @ x?ɉK?.?k?7 x@ @ @ @ 1@ @ @ @ 1@ @ @ @ 1@ @ @ @ @ dQՠT*0?; [׵R .d ARbuez&P,0 XYY\&;J%i?~@0`(R DلqvqJ'{ZN\u0j8ۅdwh ǧg?~H$BP@4<(bWa6r8ٓ߯j^=p__Ә-qz~Z ]TŸ?B!cey"BLI&S8>9fڋc|L0YaXϔ8p `fz Z SE.{ (U*iHij @C|kQ;.`o"4MCT@* CO$!ɠR~m*HbiGzr(W* 0LVF;' cOB_aC3jp{jNT*RmJt9\۾$3ɐ}:[:c7PpvT*ϓ@P`q8x@$\&o%4OΐѨkU*VK@&?l#<4M#h4b Y1k!'0)(JFn.xj |{pCy}~FbÛtfzoJ`05G.m_dkϓ%qaYx6|!߄5n F|Zu:dvR+ $6 q\OͲĴX7nuQ,(y0Jwc G"p{T*X[m' H4hFeH$w.>?B7T*i[]zKDc14ٙi=;r[LMN^6 kvōvwxZl.Ӎl. H لն~֫[P Jh:.70?%qx}(( *eSj)GTT* 46+| IJ͍u( 8.D1diq^뷘VFlVK>߯ S,t!(LN agq{-gOaz^ qp=EvKgj-#Q$IH$l.*Sjw{|rr3K& ]wyلUw'g(x ߦvpQ,Pa_Yy^&G6E^R<3F[3JEO;yw6DL`2u1zaw2E6X,j}ey`[CKϞp!C+9|Lp` h!aǵAOU7+NCa ]b!L6+Xĵ\)Px{yȤҮ‘`cTxhe~=Q V+P>I2,Z-NB7`Y| k"(sOGKd2)L@G'1$4FjT*ee]:0@*Z~T/ )x S\{}='0&kv\9_^wbן^#X&@<$adR)V!?z1p0ɀX zǧavf-OOA .yS8K%LLXP(‘^,D" D8?lcYTs2NVWd*KH%LMM qv7!iH$T>BVcksj .BϞlֻsk30,^#KβXZ\@ZCTs4R3LMM¾eQU)AeD" ]`jr%d9\{}밯, }zvI 8^[}W/Q.qrz+6k;֫m+KP*nƺׯ϶p.t:*tZmc@&Zm jhZ rEo:J#4+ +KX[#lӝv>RV D"d2Yaw&QTOϯN,-.bmuEKzߥ>j1cg~j.5}.՝ʉU2 |@'6-Ţ`D0=q^]b2ԧ^eY<=;l 3Vڬ\{}Hg2|'`Yvii: x~l5c'd4R&q%C?t?Y/}[:ABwLã];K|]Y^B׉Rfn& 0Pzxԧ%IOЋj;C HC]R( 8;P4c3g4P,IU:%&l6جV0Uk/O`WhmoLF=,vR?#brKT*Q jl$i\{ n3)RTPCp=Xj4= &I>j<`YV)@Q:EQ]]@P1FV > A0H$jd߃>@Ѣ}%H =@6W Td4dR*Q.&TJ,j Dd*T?M&#"N&AK$▿n2ǡT*s}t& a~Z8OR|.}LFcW;7 ]} J+9h&la2!Hg2=>{:˲#'Tuu]SwŲ,r<6gOجfsE@{wM)Rݟ{ɀ8dsk>EQV nnÂW'xzZNR)67>םlBZկ&VgwKaSPmafoj (<=0cZJD$5m3u{^G4GRr8N3Ga~n0{r ߵZ \tR\A>NN_$A*)bA$>h "[ڠj1nm~f)0C `1g2>7rol/x0rC`c*hkǯJJ%H@łIFM(zׇ׉"Ri#h>f`kݟRV!tsD),-.&.OH. kn`_YVOwf ;}9(+l߿ Ͽm{2UD1Dc|qs2B(D{2,; ϵZ^2QWjVD>9*,Qcer"g]fj4IfyyuZ^a{H@gnM{Nud[ J0 S;T~}8Dc1 zBnTlVK#Q>}v'1(A_H$P(]!RR Z . [Î6 VPD"06hW$Si,/-4O6J Q(i_=^jgr8qnX^ zm:tjE0t{,GQM;uQǵ S0OC^uRC ܓjOGǐJ%;l;hw*"&'jET*|]\~7:0LaiıxRDU. 냢(`nvJpn5 P$UłP=_Ӡۋx"u2RH4&XFb1;>: .JZm{ԻAH$mW~i6+ҙ ,,HFH4&XD*ZMo!O`H4L!JdJpݠ>jOG=sK6Oj۠~'9>+:b{DGvffQqv~ X+U*%ꆷFhퟭB NoF''cYdwtF/_^}}$ 45R f#c\ >+MӠiƵxո9nE=C>=8=@6o /--RdD;۟'3SSr*k2qAM&HREC7J 6bqa?.[VLv5I8:9ӻ2p5 Fa1LriZ4T:boa0 Ӵ`a~h?| rA2l[,T:'R3Ӽtx(иa1L0 ttYhj5d9PE}oq4M"J2/rǻOFjppl6!L!BF1?7->cnvj.5tZm߲wD9x0`,b8VW4T*S.C&"H"l2B&X*!b<)kyq'8jF6̃y:P㓆a :tNau$B!RD DPMYAݝ-i>H/.7*:Xt&p&7\ώNN0;3͟5J"|2:NNϱ0T~;XiZQ{z:Q@0#% R`O؈H$^?^t^g^qcׇžO8>9ń1-F" IDAT\F,*a9͊@0Y}?yUl}>aHR,.4v$MeaX6|Xj_>~:Xf,.ϚM&lmm6.ю^/@қDVL.ܬ cP?o"H=EuGUhcfs Egseg{W(rl̩˫+h6L EgϿjj`_O@#,l6=X8szr rExȈ|q.nz鄕%p\TPm@Os&S>7nrU$x";tމ +՚;{a]^7"(OK2~ϞDDDDDt^DDDDDDDD-9@$"&#zzzVn6E @,RV`2048^^po{=r9hZ.\i_hd2(KhzQ|D7p:mHj#2b(/ [`4/ |W#:\iV.19'cffz\kkk'iukm<&R44^CCCE,͛7x nwv_F{{;lXchhFrylFPel6 l6y P(PVx= C\Z`$i`X1>>V{vh~ Պњs\޾}1 jWtpxՕULOO8 A\.`sk ( 0ױwz{#""""OݲT2u*޽C&VCwW7zOmjP.1<< t}UJ%(t:`pOT< ">N/,T*all lnnT*fb1qcrbB&J2Ǡap Մ>Dr>m|>|N0DQf+а e B$loǏKzun]]xdY֮[jAP@<GT09fQe<sƇrtMIFa2 /_?^p}X,8<<|>EdH5)ݢH$X< uY>_kgmu ]D4C`3I+d< Ơ( ǫWAŦUϯQ*^##qX,bnneOgԐ  X,bƯ>n 177~x^67Q.(hR n_~a1dR?D9~ ?ɠkV!/waKRvzz>u㫶H!_WOa0TH_,MN $IOeR|l~D"Q`ll |{=|. n7$I@Q=>DbxSIZevtѪtx*t"bggG jRSOF~ PMjffR t;X^^ȹX,bvv LMT* Ѩ2N^kOu39Nt:>nK  5p:5ejZH ˟J%+-ZIӉd"Q[3;(PN>T*AFbApo@nVVH̦"\\jLgv8D"L&RX Jku#""""bCxg/d.essZy =:*Y$A<[,HUUmQt:뱴ޞes9E uj7tO[PPe}}fROn(ǃD"|!OCX@(A8C~E97liQE&YvDQtWoP|8vU=]~'J(eLOM5 , z=bXx<ѤpݐeǟZR)KElWY0v}++jWZ8ׄ%b&$ D&tPzP.t'J9Tf 2fl+b5F"QU a`Xш$I逪Jף&'-®sDawg 냢(ڂdԀǏX0L$S)rZۋb%LM=h FGG!m$iD0226Z@b^oۙ2 :‡ ^|>X<pd łŅ i4=5 t# IjA4H$8>bp4{.& h. & ~2  B@el}yYYӡ [PʠGGGH&xI 刈@*4g}j+v(2vvwёkEQ476^ 6\N'jm5/ۍP(Ã`2ܚR f_~V+ g{9<6VVW0 p]uxۼX]jօ-:ϟ?G @GXNly ͆O(JX^^A\gT٬>eFcc ]U32auu (JnLX[]C&`'5- "P(a4011 ۭކd25b``NDDDDj"K'nDDDDDDDD-c݃/: """"CaK"""""""Ї1!"""""""jAӇ .֏1aK"""""""Ї1!"""""""jA }ZC"""""""Ї1!"""""""jA }ZC"""""""ЇF[&I٬uˬV~QpT* T0!""""""":!"7Cؽ1!"""""""jA }ZC"""""""Ї1%@&}bQ bGSSr%]""""""jUХh,$r?t1w >DDDDDDDD-Q bCDDDDDDDԂ; }Z ,!-YA=ȱtvǃP8T:}!"""""""zZ-NCQCQӇ1!"""""""jA }ZC"""""""Ї1!"""""""jA }Zt;/#( wy"""""""GI+Iz=owsQ8^v!"""""""zdYF(F{[۽Ncb^ """""""zz= c >DDDDDDDD-Q bCDDDDDDDԂt."""j-D kFɄޞ8[9F\:8"v[* eHݎ^+;P(ͮN_뜈C"""2шb,.-afzV><|$lW,O,q]c4}NDDDD]jUӉFO\(f0LB:әX,uVWWs{xDDDD݈$I0 r\.ͭ-q(ݎՎ,xFG H$p8J?DQW_~YwRã#x<t9 "(zB!$IH : 88 NDQ.snۋeh4lnn"'=tr.d^G]0801qA+IhooG__"TF(V_?R4vvwQ*jo`F=,೗/!IrWVχrt&b'"""C"""rRb`0B-{ Eԓ'?56޾{P(Sx<ttt[@s_m t: @!/5=^/v3.!IRS8 N'EA0Dww7ZnI> "s| T׿ѕ͟K-j']PfXNkBj.]v ǙvP(jed2t>UH5EQN|ZM& `m]DDDDtU }ʆ`2!I C`ɅBm23V?Et'3idъ ϫUIgW}} B g֯>5KA@\ Lc72A@!""":C"""2tL]ZIfCߩAnb( |V4 ӱWØgu6XDTB4C &FFF"""n>))Yt:FcU•h4! N׼W*^ÑHH$^9(([EfD}k4x=xngilCDDDpsNG!G"#Ja~a G>d]תt:  ӉxDDDDDDDD-cQDDDD-}ZC"""""""Ї1!"""""""jA }ZC"""""""Ї1!"""""""jA }ZC"""""""ЇI] LP(>tA膴V xqrh,EQd4~iCjYd6fBDDDDDD7dJ`/\/l6CKrtx.^٬AݢbEƦzr(^@^ dYs-lCDDDDDDD-CQ[ϮSǼ6-}Z[Qy|nC"""""""j-|0!""""""(ʽg>7=pL{_߾?wD"k+  DԺ~ ۺ8: o~r ( ۷"Y(w?XXZo?>p/b7>VVGG!D*?d=۲D4rx"q}{{⇟^#Ժw]WL?nU|E}}sY>ׯ 5[?o{o=P(4ftpߏDDDD[ܱ}}(+e,FGFs7702 :;Zyp8 IDATj_[$ ,fmVQxܮ.ƵdtnFu0ϟ^Xfh$͍sp$ ^=/$ܛ­ww76/\N畷k]WUwu}2J3^E]m]C)+xtF$?k‘?Q_O?nj?tu˞LMajj|ܡ02<^uyG{; q"thk6|r?]M$CZ,f3ÍaW$|ū2H2D.Ng6{벺J=\鸷t}q۟=v|ac]%&w)?kY^Hw1C;;0 [  ]wAWק `s{0Xi`˗X\Z,pAPfLJd*_߾_~YӪcvn(b"۷0<4tkpt.PHO&{XZ^3X]1FF9Պ^R GP7C6fف_zGG!/˟{^*(B>_^CgG|xWdRU6{e$j8t:]l$`v~C|>b8Vp|lh}YC: Y-k( 7GTF{ҺwO&qpxh,˅!kL="(Z =9n[[(p:;ygk{V_T kkHE <7FOw"o@{g/P,p8BNۅQrNv&F]λ/`v~HF?]s$ ST:7W_~suz_*[p]xtarVVšJ$F2DTd€m^n߇K%""{ |p1VH$H$0?_趎yܑrd2Κ*^͊x<>nFF @8$I/ WVG|un3P,q||)((5ˮ> ^8$S)ol@#Ij-˟t{>G_/DQKxS av0$Iͭm zLN KHRHB6Æ?ٌ/w0>6 Q>/?W\.#79uȲ>:lǹh{g=]TH;;ًg(^فA$)6P*028l+J1bA.'#J?>v^:lbxhVBXf<(F ҝ,v;s[X8EGGF#C}_yMۇb8r9uFQTpШ}780㯬cxhcc#bXX\lQCVV Ǎh4ť?d2btddž?N_r>w}b  Eoq9g/WWGGo5\[@4z=\7ΧK+xq_Y^^]C{3OűNmicltSrF186( XT*w`ie0[PGx=n@sE9%< P,`,l6+: "$lfn > Eg1=umKDDG(/@]C$OsfZޜ3??{ܑBpA3wt:>5 Z \.crbarb?1Z-4 DQEc1k˟\ lnoc߇v\.#4n @W uM sNdzBaUVy`p:٭ .FGO߉p'_@+H&q EOV3N?:X,Avk18v|d25cXf`0 5O8k 68SHx21c00vuˆ?ۅɓ<'|}5Hxϟ: Wz @..d }ZHmp^}VKh4LND,.^_kǍ^zN}+𩭝Ϋ6twݐ:;ҵ5PH}lnuvpEfCYqxRﯭmf$AfD;߫d ]]hoWut|dr\}21Yg8ᄍv۩y6n=iy"ѝ)] Qǹipe/> ֓U?f\=WYV I@ĺ]-y-|J7ߜ|5~~}{-h?1bB&Tłd*ts6 gZO4;G<@\F{{[rۍͭ- hZu |>D2Uf1r'O"Wʵvk[ǾFQ>Tz ?V &Z-lV[EI]#]:Ǽx<6ҙL͌9nFUg0efY8  jr: kmqR.J1;V [H&S šXzLs9ł 7z=Yuv^}`jxRH&k>omuO6?@((8fkx5I[ KHRBsygCшIW몿uH{[[]p~fl,LvՄn Zx"qaw:RoVU]łd2Ύ+}_4ry{au׋[7q3|>QL0q]: Jׄ>cI$0j&Q^WU*PC@Q&#ɶDDD.]o~ tݫjvVzpNhZnr ZI{mZq TÂ7Z%' [e܆H$ PUgc\tY9J!lEA_&(Sp(]z̲G08+uyUL}E{O+~~k]ע-AY'!4AlW>I e3W?[Gׅb)BAvs(askZ=]Q( ArZ\r?BbtxFR]]Vk~Q]t?ggA,Օ7}by|S:F6յuF SH-iJZI=|_4ryړ׷F>|^OWVװ^^\VArhٵWYf*8}'IE,vy7lKDDDw j玈͆H$EQ)2:;:j9Kׇ;|xgQ*dfTٳNMw1p$R3(pt:X|>+u!) ]m #5]. 8/TfiT|&Z No ԇzU\wV>_ A_orCl0츰>'ǰY|&uui J7R4櫙VWLR*P.k~Q]]G5@+j:^Jёa #Nck{ KZ0*2/7طWNJEUuoTl p;S9?Iߋà yo;::RTbA(HtgFn-Qq{N.]z^koqU}lI9Yn{@\mwęAC]/c8EAHӰY+Շ.R TBgR~DAD*d0JQDk>v  bXV v9H$00L5?: Gl*JupB.GbsxR`T7FDQjٶJkm]3t@eDs/…^_L&2JKSų(qf6 3- bgjt .aA|+}YO?CEX,D h=s76‘hMP(@߫U##CPcuyT:ާ~_4o.:P> `0u z=rg ԗ*VjA,̙M[kiِ9>iZ(jQiT.+u--W_~|F#]+~[|{qBlsڼva}}tZhx1x܅h>$Dͧt2>.\N'$IRǙt A?`PˑJ7ͭ~u 6L! Ao0@j7ӴZ-|~o ˩c6g2H$ ?r+wg jSev2uvu6@@oo㩌߇ã#}=0Fx\hzGtpPӉxŰse1gAl2a',3iC0;ťyLޞs$Nsb1CH&4fHIф HIq|| XXէ^NjgO`=ᇯ\kO,ڬ$ -  aaqǹ9twUfnbׇe8vxnDc1Ԭs}8^ l>ͦ..'4Ʉb}H`@{wvnÃPFAطFEO$ۅX,L`{g݈ "7d25u毃Úr YͣI\.P(њp$?^f K++5ۈݎ]8v(6P*qlV#7̶DDDdZm$ 7Qym&JPs񺊂;zܱ16AAXVlj)d6048`0?͊^g6 <6jɉ ,-_~$i[ttt H`ieB}}j,-V. v;=P.+0j>F^<w}"L`0.Fi g$af Vֱ |}?](JXX\F\F׋ʬMuAX=vGG0;7z=^> /,Bq{0:2v/2Mn&lV+^}fs'<:SӢl6~?d;1>Z3 v3g'0;FᡁݜgtÿU8%Sq./_+g6Ï?g/7H2KnNpҜaoKƃ6Uqhtv5~ G"7~t:`@@@@@@@G҇.µ{Vub8jT]^m樂DDDx|j;\>N8ŁQ,06:E!""""[s?[ɉW"'e1x21Ex/] """{!}cK"""""""Ė>DDDDDDD2E~ߘ> }{Ww >Բ$L& """""[p|| It=QdY}M%9]Df"N!?tQ$6 2 = Aޠ]CjY(n?t19@Yg@gA^W0!""""""!"\.CQ>DDDDDDDD-Q bCDDDDDDDԂ >DDDDDDDD-Q Բ2EyQE8vj[ЇZV4l^Q2 \·.N >ԲE^>DDDDDDt7 z24dY~aC-KQg5EQ@Wg3""""""""lC-%DDDDDDD6f>DDDDDDuQe]S719~Ar>_߾^P(~Ovn~t n7nf7 tuvab|l6^xN#ytuv, w727?onnbk{ h$8NtuuL_16麖ekG@tff*0:23SQ|kQa0ކN4͆gϞ]bQKvFs'7twH BF!Fbt}ad2w㼴UQ &''b Lԓ'lՆD2YT2 Qs2t'u( RzzzjWppttΎhoA\F4E`sb B>≈aaCI_5e+8 DQxnu<L]\ZyyEwwfg?bqi ^(٬8 !_(Td6\dJQ*ajFQ,t8ǑkBFQ-A.!|WY^DDDDDDtϏ?ΎKeCQ*c#h4(c|lLmAixmmd^lؽTb18{ ٌd IDAT2޵YށͭMLL C vfsuAoo/Jwo~ 鲶JkLd2 QqcdxX O ayex: ϳYtZ baqH^6r.$'5LfB"y*I&X֚BiuƯo" X, (RzNBEOw7^}dY<Z  AEm6 5'Ex\} %◎gsq '8; ݎ)r9/,\*_zT bfz(biy K.@g( LL&2mm_X@<QqxxQ3FMU @`k }p:fcIBWg'P,q||N?ddYƆ?ӵyO&'Q(@xAs. (J:D2afz-\uY}AL&x`6!i4$ LRVёd2 T6xT*!FV#tu5.ǩezB ;$ͺ } 5+<$HI$uQe YP0dBEˡrȖvI(ZD"LO'(P ;jz@L#7 }뾷Z DDDDDD^Rf%@(n&ytwrhiia~~0!I`sݕl&2++]/xE399f`mrLւ.nܼY_\Zb}={ヒ pڵ_H$aԪTIZ+JONY/&RVVesR, kACP`qqv&&&0,.^Pqܼ}T*E,c)b-;oqGue4^߰XK'bYU.vFGǨTX,U"]jX< 1FXبUymV+9}iR)z{zjVkso;wlp598kOYתX^xu߻]nBP(Hn}bHvuaU*Vcu>O6%խԐH<^o] DӹgA"ga!*$=2++TUFvU'U|]jX4Z7+`ja\v%>~}k_wglK?6idWWq=l6^/aFPP,J..r:k8K{ubr׮qx 466ig1 B]]ժz>yVZЎg{h~d*[aP>R nYYY!N0Yfd2x<޺d)D"rY߱"v/n np8ua P u>o$BnX Kݵ* lR @X;խ|vZjJ\޺~?*kkkn&YfkCe24˛b1},..޾]پD"NRanvy¡>aA0_s<ш|A;BNFܺ|sY;H2+ {*n^jdVȭjsA2 LPp܏SSVr9R >sБU$q&|>ܹK{{^ &&'|EBSSX-My0vkokcfvQ: cy&c1<wޥ{k%1vǡ0nmmKv:;;!XXY20ZafvE.Ncߕ,nߦR(@y,#Μ> Ǐ}lOn|볙>L͉s IL3X,F? X6<wmX*Q*jۋ"++YXZZ}W?;z!<>w_/2=‘>/22: R NC"AOwwD 1@ X{okdJ,\.. 244nޞnd0 `rАishٮ}u6;n|_۷͉G"ajlvn"mZ[y1tZM< `sȗhLgV&?gfmUt˩T*|5;;imݻ<ܜ0nyyÄ}/R4րP[_#MO`pE&'hhػlY$""""""Z&qBchll|0\x˧^ϝGDDDDDD9BcE0(TGd>4uEDDDDDD^48~ȉGDDDDDD~Pix J9, NQwEDDDDDDNBa18w)X[[;ꮈ erbY,"QwCDDDDDDHh"gH GDDDDDDDR#"""""""r)9@Z]N0lR|nX_]B92,}]*`um` x]P"HTV#"""""">#L@ }DDDDDDDDN >""""""""'BH %۷261hii~=TbHsS3 019D#.^w c8Pa"Ξ}={3Eܻ׿e,ח~Mssm-F75=!cHRabrFFpaDDDDDQ賃08wܞ~zKKKr>MSlllWp:^k?T*15=ť6^Ng.};iǩT,--dhjJgGm6>?zY3$7 Bu08F>~z{MEDDDDNA"?^ G)|5Νg!@jyFkk+7珟eIRevhӧN$q{氤We9ftl5 q\{xZ)q|BYxVRRadt"R C_OӪIff( l6~ΜA2)LZ<{nr<ae%i\NZ[imiG[_gl|6҅A<^߿zsg_HND8LJ.}4?jf|b/ mQ ¡|zv׿eR{wE JaU }=|Ow:MT*1MǢjhӧX|>ljH.2 Y}4771=;Cvu_>XVJVs,opԆ"ku!Nۋ$/YԵ eVWWkUB /} I-/s]"0gϜjd(cql!ho=fnnU |wB4u.kk9:q],,$u6^FQ*ITqn޾CPwz9n8Cgԩ>4<F}Ng`ZX__RٹtqO>E,}9 ֱTo9HP7lvt8Y7w޺~r YEt] "}lV'&[۸ZɩiZ[y+ Eܻ[izp:2++ǯd|ɧ\8O<ӏmaC=yuR{_fqJ*wlwz$ FGG놤,$x=[UK/bB\vyvHcPƆfgH&D#v;Vł|B f464U7ٖ, 縺 5SYjhllkxZ,d٧C 2<2J0҅ڶCn>i27@I_tRe W._$ mF3>>ɹfW 9jJ9/9\ץ9D0rcgN m+;q:X ͆{nC"Qw jbrjW.w!˵8}w*ouVaLMMEKs3s m*?tBJ |=~b!yss ^s{ťTmB,}&]CC,R$qL$HKt:M$ݔvպgaP(Ӫinjbtl^, ss]Z- CLLMR,q8:m|>33l6gVdkǀ͡m;}VDk9}m&]%VSk rݖiǞkFXXHhjzQOs3:6^>{!]MM~뽹<H8| KNFk%r|F#a2ۡ6]3oVVXt9}eO*~ip88LHy(ϟ |>OU>Чap I.$I3" ;_*H&p;u5fmm]Ô 8pjlldhd%8 igv}y* +c|b'CCxnzI$u,^l>@牄øݮc-Av|z(2>1njmiłCᬶaT+O_K'T*B jop\hS*pǻ9ruv=˨mI o{h~bp҅]>]y GT*$I|^ݷAN6mA{[+m vpS:x<ϟ4Mҙ ##cܾs/~ὗ:b4nS(Z?᠘N^,|?ܻϏ7:m?2xk%@Dj"E YYYtx꾜;&=W455$px].W-99n>o5"G_o/&&rrTjۮ!@jr,Vkd=Npo0 /ֶe=ù׃io"""""rlcQ޺|._>JzI2g멭d C P* hogaa~J[kNbH:&Y3,..tp:vø\NV+;{v6U<"^N3K}>Vպeo|zx,fYmw(IG/}wy-MMX,2++D6D"<-M{rb(pކ\)ͮb=]qΎvNVYeq8c1,FJumΓt}zjwAێɳOoajϻɍ #{]"""""r|? &^e]U{{w!Ǐ{&^u8u #c ST6' 4NdVVx1RiO?^V,cn~ԩ~{VnwLV}s4 X,Jjyyȏc1 |>?/ ͱZ^&\ysE"a.]ddt{bX{c1innzcl3 gzzBnV 23;Kjv9{TJU&Pqp8p:OLP(l#aV'ܺsJ¥ x~:;)ܺs0iH$hgrjpK dh4xtwvڜ=sQnܼEZ_wOS%u˵D(dn~׮qW2r:͝;w?8|FW]sߐ0R)Z>1=~B:w:Ji~3Opa9K-P, 2PYs0Mlv17]U>ffgEL^5YH&p~5ǡ痆wV||6;}}9^~;&}49{t\.Gs4$|ƪ =nj_s۸\9,wha'I9NBDDDDDDDD^9>""""""""'BH GN,F.q&> IDATl}}~ؗV+󳺶r&s]f8ĪoB9, @!""""""r$4KDDDDDDDR#"""""""r)9@ }DDDDDDDDN >""""""""'Bvy}LVYJQwDDDDDDDN(͊b9~u5 }d>^QwEDDDDDDN\nյUQweC"RYV^؎0Q#"""""""r)9@ }DDDDDDDDN >""""""""'б\olx?좵5͚at|//l;;7,\?@G{hϛH&tvvbFm{2WŢERefYftuvݵ]\0%$߇nM2++47qǯolpG\tp8Z `br$㦭C@.'CdWl475UdzzbD T_/~ȏ%"""""rl6 GܛϏ#^gϜԩSXnݹct||v͊}=J[ݽTjS}9uJwigZI..af$VyruB }ݜr#ffJ2޺ERt319X]IFFhmmapa #=qt*}X-|>? IVEHdrٹYz{iokmolhG >{XDxw>q~PU/$m%Zy7oJ-Fjm eb;*c1`PzL}QsS# iin~n33Je}<جFZe|b:;|ug>cW4MIbhgE:0x^N|VY >f12:yvp;|5Va8WWY(4jCWg'xJ("R KoO7j0 ASc#Nmjz I[k}]]/0=3Sj@T"Lb&xvN"~uʾû fXbQz{k1k8we6t:N4q9]kc}->zViquwe2  8®|;wp8 ?OsS?Z4$^؅dh$R|Pz{zrܾsgO1,oX^N1cSPFoo444a;wYXX|^n߹Sǡaf3o355kVVfD}I '9'KXYH-H{300En޼i;{ޞR3X{FFFI-/߹{jٳ\r\?11~!r4$?{ӄw# ӄ!<|=2{^?znX\ZZ|/$ 8/edtGC T/j3MJBXdvn2m;:蹭l>noww;S:cɰbq)cU鳐LbZFX, z{{jm&''l\U X,>zTkq"Lsgڝ=sC ߻z\.wǼ5>Ϳ\.ZZZgOSTU޺rVQZ^&Is%B v(OLp̙͛9z{iDvsYTڬqrVnǝ;wvc;j}^ jO.oJŞVB475ظ9ocCs$rgN]p8\d<4M::hhج;ӧǢ,-H..ՆR0!V7̶H$aXXJH,$:b  YVÏoUM=464J jR*jm=kU*oX"""""rrܻw/<96i$ZӐجhd2 ꆜ4$ua$ v>"؎.0>1Z.WwQ]n;nX3ibhݰiGE#LkkT*7چaǙΕ{9WwØv|lvX4Z7-`Ȭԅ>{Ul].ikk# hoYlWl۾߶s3 r;Y7y)eY&\aHYXHrȓޓRT*V+ jCxx%22#XVZw;Ĺ砫dQKDDDDD>(ϟ |vAݱ }R˔%hmN(bLBH$RXVlV.J4$U,$Ş\oӐHpVpn؆aԆfbbDX|ni >΋v,A~k(~, BaB(I&axt;w?q֕KGxxXJ-yr!fBAl6+3srvIz>H6ffg|>0}hH$frrX,^7P8f|bdx,F:f+e=K{{; |rS:;q:rڈFanݾMGG;>rjv0pn k N$4/73<<ѭa6 ˣՇap󌌌А Al}+ۘ۴Q*%ԅl/x24DCE\f|r` P719(_?7Ck<*/ F#L2'eaa˽'p!Sp\\dhh)n7=<1`0$_(&exx8wo8to]OkC?:kpapq) v~m.^Lӛx,FgGΜ>E0`ffd2alV\7|iijRC*xSO y=zatt@[W=wK/1<2̽Z,b1z{5ѭp2>1NXnk+`oXNgx{3\$\n/}P>p,Oy24 DQN~vwubۙaff6Wj%L٬x<. Sytsl\tOw!v6:mf25=KT"sⅺ9X""""""r!_ ά/t3Q!o]IJrDDDDDDDcjfR*UKf5 lEWZDDDDDDDDsI t,7_"""""""rGDDDDDDDR#"""""""r)9@ }IJmrG 9ױGݍ}i.9>?k,g2G9lv;層/>rbY,QwCDDDDDDU0 9@ }DDDDDDDDN >""""""""'B赆>vB:BDDDDDDD*#y׺d{<cq)|cnE_kcXhH_S>4y }DDDDDDDDN >""""""""'BH GDDDDDDDR#"""""""r)9@ }DDDDDDDDN >""""""""'BH d;irEQwEDDDNbr XG͑>r_F """'PeOc·"{&"""'YP`#dD"GC_d Ď """r6s lSVq::&"""' F>_8YY/lcÖB6sۘGDDD^947?gG7in~jO!"""rYc±JDDD' UIt""""'U>kkjbԬ"""MGZ飏["""Z\""""Gykd]"""zK"rL0:2{cسi)tn׮3p$ٯM ,}_;o׾9GI[~|o&c/eD~0)ygOԟw$bqFGXL.Ҳg".?@\`ZSӬֹt›6ڵXN-[ؠGّJSj}w[vE-/1}&3o }ҳSC}4k<ܴYm'k:#9}D, O<#yϟ  \\yWSVIinn6W\y^'N$ 019nzTǭ*}09/ӟyl??}BMmgT+&F+}xW?mo+Gߡ7֗穔Xm.?^D$y^g,dh|~U۞J-QVH$bIT8pxsxWRa||%J2N/$y x._Q.v:Ν;(O#Y4CAz{zmjjy "6ǩSvgwߩ{WISS 07?|I*$ . UD>GD0?+n[X-_%w `?&WwNvqw D_g$a˴̃MY]|5C"o$^߇-}XM%Üڏpk?Zf=n_%59j%{?W549'8>m oOXK-kg_/?G |kˋ\!7K&Fѿw|?y>_&=3?i9R*ѯ2c^b"?~PہV} y|o'yX4Kֶ'Kxnޒ߿\n6\n7ܿ˗/q OLR(q:d`@n-GTf ~O_(p9]b[np8b055ݻx \dbb|>rL&CR[ۯ/RA\fcc3O`oy!twvR5MV((rBiNρퟕ?}=mk{q~Ps۞6'(r$g_p=?}\cir[(y˿jڷ ?YgY9JӃuu*w~9?FcY&FolNwmH 4䃿3Xmvˤ6&Nq}?'37ÏcX,W~?yO%2jGRa`XߦT쫫2?4?M͇O/¦~2z\ x#CWOqg;lai }2t}/2a66LMMߏbXXYY!B8b-#J8fe%j=&O.oUJr9I8]gf0Ml[@0B2ICCklѭb ӏ}Ym6V+łsGEQfemۮD*}4K27A&z0C?WzKSy>ͧp؜.6;H7۴_%2_s|o3|Ohs?ǟaW{RR~zr`~ ?9Q TJEn_p79^&lU!\{XmvwN<('J+:|/Z_|Lzv?7Hk'~s1wY;N$zp;L߿I_b#a/|cN稔)r@/G?K"ֳy1[㤖U3dpg[$ X,|>/lv3fX(f%B )3^V׻Opm6~?kkk444zc||h4UPjG@ ?ȉ8n1G9؋~Vv sG4G{#fbG\7AR.W~n{ywL`C`nngi|ws6ps{mrrE0,,O IDATOg^S8<^Fzrm{cٺc,7imvU2;ξڿV`t Lq m=gkz8%*8pU{TmZWj]j뮫ֽQޫub(F$ QJh=ܬs) zI S` rILL$11'OiFTPjQQ.TBAPp0*K^DGS }FQģ0*0=~L@@EѤILLEsN>юIT<>o<|D`3>zR+ )eJG\~ \\(R33t+w9}[ UfIai@1Ob|NʮM($؈pPni<_hvsk[8̭mK3;~CD-ٰ܅⢣9ykEr7fK{4Nn:4eIgacƵJOڳ& fZiL QkrsS^W=:~A )?Օp .>Wʽd Kʔ)7ϔv͛U$uYԨT/Ck8N8::%apŊS`!ĿU%zfM[D/t`bBlT毺 Crțb#qe͝\F*ɎM4;R3NjιyꜺqw$6 y௳=>VW_Daiky\T;+3eWܹ ~~ZM.v8::JM=z&&&X[[cjjG\Jqww'((Ǐ驉 FeaaA "66ss x&hT\+LLPUiW;wn"#~uSMdaOc-2ϋX;`6ɽKLL')JּܹN3IyA"u&N{QELx(Vɓ&DVSM=9~R_G7w  7\~ccc˗/ĄBz(XXj۫7Obref$_|>P!wȟ??ϟիws}Հ@xDNNp?١TIll,5ܻ箿? tw~lemg y愅y0y5BCd#Ŀ3פ_o 7H:8(Zٝ9sB?.yN<9u)VX;8QI[,pEI:yN"ull*4mBaʕݛuʥ32h6cytU[}>nɥyo'" @*5CrhT g9%Ŀ1(S߼qE)QX YߥĿtTjޑ+ݥ7 ,(qK6ju^|(U+FB|+LiǧildzF=9BF0lVX98wb?~'4!UkiW { =9f>ff8Фwa\ڹbjfN2ܲ $~=}`,(^F{?j.X5)Z.Nh4BI fԛ*̨D;tI}G2LAueqd*"o]%*nQ%%qYo_A a-B̖ݪY:!].j͟ߖLD?E2 յy B!DfZB!r,#-!BrcI!"]B!x/2c*L$B.>>E#}l,AiaU!!"J24GDB!DNPbiaEVe>]kbgUB!ȁmwt8::&P0!Bd ,--pttP4\GYuz!B) : !BJ!B!B'>B!B!94!B!B@#B!BIB!B!D$>B!B!94!B!B@#B!BIB!B!D$>B!B!94!B!B@#B!B)g*w>O#B!B-Y[[QHQ6ܽ{O#B!B-pߟ➞ﵙ)&6V|B!BBlLL[B!B!ȁG!B!"F!B!B(FB!B!BzB!=,[55)^ܓFŲ025o՞}AV-M3Zù% >k}SN&6 mݾ…ܩ\{;B!riB!Rqcxk72^"]  ]:u$_޼ܻF-:}~Qy:s{g->B!04!Bi.\rZ4o[V?a2V,^vvԪYڵޫ/~˸123d!B,!9 !"M)úiߙѽW_.\sw4hܜm?ǟ&ٿ/Xj-*a{n&}=|KٹkE{Ӡqs՗7nfXKpΝ:j|Ri=zMyVڑ?ȏ?M`sٱsW]NԩߘС,^_f̦Y˶4n֊ISkfvkO]﫞zˉSIHH‚)4}z+VE 9Zfڌӓ" '̰?PlizvgAA8~" ԮwZl۾׮SAר]ѣnj;M[Ѻ姬[gA?0z0>mG^|֡NN AB!4!BKJ/gA̜_f3|/~9Pj<~Țu9|(߰.:/5ǦnHYl%UaCQIl:$7իyiu2'073c/3-[̔Jϗ7orW=} aog5fff˗Wg޼yk߷#F}A~7WΑ[[B!Gw !B#11ZѸY+~ك۷a¸1XYYi\tgg'MOywvĤ$~(O %))~WXA͛]]Pa=s byY9rJP~uB!#B 3ӧV`ey)ӠqscU*DFDWHhjg'7ί,EEFi) eCBBZ6kk+)}rr!1)0=}U\c7ܜL;B!>#BLL(_,ʗ?Ӭ'@r#F|y6g]d @:\011!4,Lk{hX8vv:hBdTֶĤ$=Br?yV-?v ʕ+ūU^|.&&BBCGGG $JҚZ!m.!B~=J(PZUJ<}x j,P bT{>YG~1̔JJ,n\J+Z.]1-+Uã0oi4z!Iݺu4=}rӧtqqqܹsWJ338B!>#Btu3>3ԨQʕ*軅 /q .^ƒe+ t=ggΞB!B!94!B!B@#B!BIB!B!D$>,\[Cׯzfu8YbwaYQ|?Fh9v/obbc0K-IHHx{uO5/o}Ӡ[>k3˾˗<XtyNw}w[WFwoۇ|Lxx^>>sΨs}1\oOʔXt9<ɔޕ$$&ҸY+֮lإ1]t/oBBB<)km08: }iW˰?Pxy0{μw]7o9]k^cig=iͺ 4m65#hӡ3ժgCeE-,YaCRt):$asi:#C1Jbæ-mss͕ܹuWܱ={ϊk:%3ʞYl(၉{={,^ݺfZkRbJ(iyo-O\\e朹=wu0t7]KF b1\wmZ`İ!ou2'*:qy ۧ'毮ϑc:|4ӧLd< ByQ8Ȩ1w,Y(j֨aogIM[0}D<ŁCQu  `q?pHCjw QQ+WCPV^c%\ysssTfoɝ;[54i׮;ptt 22pybbc)ߍ.:Ҽ'zM[q͗5OqqFǏ?QܻτӸy C;Ʒְa=~)ժVe~͛G+GXs~~)RăG%cn7n"""~GHiP]W{i˶th׆n_t ƌٿw6\\ &O'oz>rrlu7Ԯ:}C/oy!ya/Spw/HMz/o>Q";wYt_FDd$ntԗ IDATA6!!u?֤`يoۚaCOVȨc^r 7n"!1v[r?[;[~;Z&z!2;2'm>ϞQx-O~/S&ZڕKqu͗a2KR8: zgTGl jyz'$$аɧ Of!u/{|/9e7p/X-p?a# _޼F^! x.ɑV-7jx>mք!Gn)a;ά9ؾi=ff:y*s?r?{zpϜTfN9ǘqhբ9>r9&M1ǐxvU/(Skm-?խeO1b;QO1ۢV=g /ewLѢLi,O3o! GQhXÆ d17GӬIc"ͷXy%s,bҴZo8R\!))cޭBFDDDAn]ɓ'ϟ`RT/_2dP֮gcQaZвC 0eL&nμTż_gt|ۧN◙2b\o|yaf֍k5CQ߸I~\cF%)uI;w.~љ[rY2mcׂYsk 2{;Ó@qűuz}e= Μ;Ϩ>tGR1dy?y,=6ݽ ]ˠYjV ;/:r:~=; 3$C;wn~;kkk=Ռ5 3y ~i֯rEKhS|1:wFY7SSS~n2 +U`ǖDFEyih*/<;waŪ5 …y /\ԉnP~a${`-⁇Ga-X 5 %V eOj6RNm\um߱|3iWbǖ< }gΞ'>>WcɦMĄD.Y=LHUe۟BLmJgZ4oʆM[4> /ãpaLGx6|c:k@")aRt)iː^'ӏ5WӚlv&J(Ψwoky]nۀV<7mv-Hr~_sF^|歴oZGjݿJw1<|ȡG5vC\|<&Mx"*ҿoo͝O>nHp1>ujQFuʔ.Ƀشe,_4_37N.?~{X~#ռh Kѹ9u>)MgKBB -թ%E<_W6m®={^wٝa#~`~:= ,CßS'GGp''q\*Obڤ5ʕ*ЬU{:'`R 4jޫvvi/N"7nI4_U?QT|,qW߷VSgc֮\Jb>}Zǿ{*D>'}< l_χ}@iѶ#dH̑QYWs.9Χ͚P_t'89y6\Sf%K K 9׵7z3Npqvwpռ5f^8ggg+oܤt钴k *+_TڷeݲDRRNmy|TIl}{08syϟw.~a$&&&eQCE,ǓH;)~nC1d\s\\C֚D5>]֮ߨ^Kk^ǩwS Y[YannuC6[ɫjnSJlmmƓQ>!zԮy/W&-ڤ>z12;5z!6o;;[&RvMo]ADd$eJ"((а08r8ExP`nݺM1555i,--quͧuqvɔz2XϧV;w)YǎSBy 'Ezu\..X[['ۮޕUjŹIIIT*7 պS[b>|D\\N~>sK133~=SXu6UߘlWX'js8;;<#DEGksF dV>q]4ԓ23(Pu}mƔːI{ןkM^-gQ8FAmʔ.IkhҮd&J(!uĒ%ʑ5y?qRמ1uMCdBlImmPTDDDbnaNbb".g4)_ )X> E"&Ơ#""qrrLwF8kv'!1≉%!!{{ S`6Ɵ0ndѩc9#6ҬIt',NR($%%'o=%m)?n )sL HSӧV^*Z6n`4'\ґct֕!cccSg5g.*Jrm˴uNQA{8At++r=4#$$$PI/_jőViİ!] nn1LgNc:M-4Wpqy!"<"g V槱qvv&<<}ߜΎpc׽baAgcҫx )1~*Z犎L;[[^cm[$*:Z3L֖_.:OcBÒss{?}dT<<_;:^;?B9^FoOCʕuϷHKJs'>i|FeC]{߯eJ̜EKl2+ȸ`HCI!ҋ9&&xRjiY)!ߩՓ 青PTRx1nCPPt).\ ۷i1uH= E7|jҙ(4ލKW"22kR'BdF( Q((Jz|MN@|yuS9lecmmPRҬ-"2s33'ⱶ‚/^धo,q9=[~gC))1=j;hX}|?Hj^]3oe4DD$w wrԝsT'Mf=87~R*Vjpiqtt`>a/3٩=cl޶''G;S*MQ}g>>.XRِOHH QOCʕuvx#v:}=F3睴\dV>q]4ԓل/3J^XXX422*VZuVcewptt:n/S7YƬ[~GPLrOci2K.TMƌZGWkoɓ@=Fҥ4B%zH`.^{AJ% q?…uҚ%+sILLW.{ɒŹps/R#+U;wqsͧjع RIOuư'..+qq:wO9VyZ^.]FPP82ɬJ&w)9My]PRJu=bRf..kkS?)wky$bX2\Oʐԟe.ERR%d0&VTjsg/Q?weZKW4B ,V<1\~xټu;۵Iwi t/;NNZAA: ư`MP!wK5M!m+\xqxgBߺlwwTCpL#?66+W{.OF2+Ɛz11izs%4\ܳ(.̌zaƔ]S QS=p㍡e˔6/^WTfͺ8;;/o ̬sds33Cϵ(ureː;W.=Ƒc'tllll!Dȶ> =O|;@v')գ;e܄;~'NdJ}gd!1/WڵiVYݼ?IYv̈́8y ̜ͥWԡQtl׆?̹DFF2mdV̏<؉:C ռ'XX3t(?ͬ\͛Ժ>۶&))of߁9wҽW_8jJ-m2yK2 bbbVLiLMM3oW]Z"ؐ|>VNs\km˘/\{{>[@z>I-J+Pz5歿sEصG׫JѝP9#3nXɣP! W]Pԫm:re+WSRE9mD (]AeewOi9g.a\~MڽV!$4?v%!!ϰi68t(WG\\i1-CʕY-SreJ3it1n$gnfFټu;7oq;S~9~g]`ҴSx1|BBB񧉜8u'L6K+JڷiM[Yf=ObQThƂ*%hi=zpz:q4Wٳ ~֒ː<00)! \ς9WByvp M-M4fيU ﻸx2&O,ќ!ռ< !$$&MIsG"9z .sy@C0dL̕*[lW IqI.^ƹ=v</`L;m[$0)km :T7ʖ):Wd$ܨUPLiM̪sd7!FR]ڬYgςtV54C(]{~= !}%Sͫ ~BA.hۺf /ZʨQ*M)Z6kQИ'iM42+7%Jg#C83w ϚÈcMO_qpgy̙)f@nԩ][/G (8m[S;͌ٯ_~0w .o<>qV yji߶5OP^o͔_f1efϙGhX85>bDe ϩ#S'ĂXj5aaG^U&g-W4b%?sssVg9߲f֮߈Jbe˔b]|bZl)[4]sO=|`&N`ieɧMFä]yȐa#} 2|>Iܰ~=^ M64iq=~lش9AQѽ4)׻~5S&gop ʖ]V>I~77R"z2^OYuƐ:b|شe< 4&C4lP .3coSÃkWCIݛvLH\#ީJ^tejy>itT[t lhԣO? #:ΐ;pQcs!Wz`R6,Z}6݉KsvP>}4r//\زq-s}HC]g!Rkݾڵљ]ewBEC2jP;ѡ9bX Hի?xlG7pެh'ne 'IJyv*]krsv'Z'gu.K>}Ǝ?vU2VVVa4iaB&>B'O3nB0eJ3dYBLɕ+i+I/_R' ~3yB>d]B!B!ux׿gr!B!Ba0iB!B!ȁst]k-er3{<֬$/E7OnyU=pvrz<}}_6oNBxU^cJMM׫ r7jլp)} %J_^/晅oU;kowEgς4u:/_Ζk Yvq`5.Xg\ `ڌ\qCpqqA k++Mf6GVѠ^] 쏕:Mvhr? 3L{]Vu:KEVw3"},-Z2.E IDAT&w\Zi߸ɜy ~T(WizdFsq9beiEJzuB!9g)$%&1mlju|VVL?J?wj:t\LLޜ)cE<<{j۴e;u}jeFSgϝ }\ɝ;Wi -Yf=`ո8guhzm;E< Sli.^_R1hpih8:8мYM:sssN>K8z666F"44-?%o<~ux~Qn֜yڽAaffKei+g'' u܀[5;`k/;wo %KAQT;*&ܾs:k^1߸ofeZ B!"7y$6&6IfjjJԩ][[~9[~)Um\"saƎ!R=˕_g~>1#mP(YAo]Qק6nfZ>5>4lP`>L(F)Xʒ_OXf?eWZh@dd$̣orqWڵiE6[JOpB 2/h>,ZGB̟3 2uOʬ4sgz\l~ՓWfPj!B]e9};-tfݏإ; @Tt45}sc>|_4(c\|z~Cͺ6,_F'͡#G+jkD:|4:?xpϠs-S O _L-((/o߾uL5_dflKF͘L^|ip4`ي՚Sk=x^>d2iАa1#&f]-};}&i82I3.]xQsKPMtӲLſ4my{yڵe|ȹrc{Ԥqw} m5p0]y?V[0,k,ZBJԔcuGh 'OdR=!F󦍳)dҙ`R,X@+k3k O...*TUPI>g6.s;s5v[г;IJzLui9;;߳?)=6rvݺ}[&M$)M}zz˼$+*]*i,ڴWw k4rUMóۊ5k| 5jP?K`jެ,^F TDyDDEaaإ[3Nz,r&B@rv?LMdk_R,Z\ŋ3͛6Cf:kjڤ Ǣc ZO?KE'x< OokOl`jݾ]ʛ-W_5.7/ zM?@JHHТUJ%lȤ>OS{h5vJ,f[ޣ#J . /G9p𐜜ԴIVRNmyyyjo$%-`=պMdd2j޴2jU(8nݺ%I*U%8[OWu4 TmFrttccf…, oIZMfZS*WHR5o4 eʔ6_OzzzK ,=?(,rWj%K?S&̫ܳofܵq\# ]&I7͗הM]\\th+GGG=o{nаv|jT3Ee6D~Cf܏]۶$-k;tHcng*Y[P4-2{ܭ[7m\"*ZW5WU"Eo=۹*U 77W%&&*66Vsg'-?4L[r(E($y77Wޙ~5kʤ=}ִ"#"|If֯k3cO\WT|`P t)[ˤKUJ*nj۱6nڬ_|-G> dSmu:s?5KH2U\]\+W.fHRBwڛ7mM+66V[ЌsURtgRɌ`Ö]Jx"c)3R>(77tgGF4?fe4kd%$$hok)`ƏisʖyfOZ>|t*U{]|%Ւ2L*V,b[L8NoKse<ʚ2##iu?<Pʗ/+"d^D)UjXB38Ttt6ojqyU*Th{Sfu݌#',Q\e}Vؽd6vUVE_L&crOu)ᖷ$jrrrޟ~6aO2 Q#[/g~/*cSukʤ>ݥWt5+aٌ-SF vIZP ^xkx^77mRg*Qx1kBuJ|?_9rOJհA=8EWBO!M8΢l61{>Y| zUMh+-//_Q{z1&IrppЩgtğ5}$/TԾ_ӥWv!M6SXf׮iNitXxnߺmi> ͛=5iE˯԰A=mڼEE*_r*=QTxZ%Ym[j5xpuÏ>Qm,ALP͘3WZ4o+8X;3&%ki h@kհ o`pP*Uuj˿M{sÏ?i{>>x5ٳNA^luj[Uk>oڵGA/곍UxqI>kR^77uhV~F^rrr&9z< }GŋU%bG*P 'f47$I7oFΝ;[^7usS5UXQ͚;_CW~8ũߠ!PvcJ0\W7Q JJھݸfqv(sI4U͚h" goힲy|xG&VhM W"z ӌsզUy&: ͝HQ7oS6d$jJZL-\\GU\+]Zjm~_RvM1[1*Vƌ|Oիok]MZ*8yYs4}IҾY!-zu%$DXuy oxxz,Z/RO)a}s8Y?xH3SxDJ*ukVIlݦs. عK4LiϙjNOS=lSKTXX||.d/VZ,6b$郙T2 5m&NQc'=o^yڦ~*UxB ֢4jD9;;fj*S#ժUѱ?k݆MR>ojojV>oK-X,Sb7mAZ(nۡ+VɿfMl*E=kSuz2 1e&L… [.pM4?4Q%Im[*M}zt-X"̎2E| bǵc.  ?;.wPҒ/$ȐOޑGUz{>~:u$}i_[7gl>wKN1 E7n)]GsX < ?KGʕ /OJ+)NR$;L;'3W(E-_Z[I:|~& xdCK]ߩVz7vwn~]9#h?yA?(GdрwjĘ>V^v_E^4iꌇ IOӖvZ~U/@ F-\Lm;vQҭۓ'4j P抍V7rLF-3zDժ_m?>>^fQVmդe4Uqq,]^Aj޺&O[,HWۿV^Vj3Zs־ղ>nB@R-Q? IO?;ϿS.U=ˌ8U|AOn͛),,¢~WQY׭[rzYϓ_2|lvO^Sg2?~ xgn#v7c.M>ˢ/JMTre{C5/֬]7vWG#sNnͪRTޓ,3kt˭ZvڭK/Qk~U`sK;qN8%K볝5vdmZ-"I}/ZͨT%뉊ҌsE||mto$@۶M dž>)vO֠}|I_c&C KMP^77s(dAtX@iАTJej|k-^B]\N<&ȗG[6$Yn]iznZ֮۠'TF l$Qg;kŇM`K [&OSYUpp~Sh9T〻?Ŋj yo ,hY#zk4d}Ukme>Q7oꍷU#{W h&Mi5p0(QLƏVBB>k6>ֳd\ݹsϸՆoL t$h_F%J*\ /I;ʕgYtJH؃SOG ˗ӐAxr6ku D[C-lN$ҥ]A˕%I svg6>3! ,jU*A̺ аz$b'i˿6 .\Z35_O}~KRҁNl$uQ Zj:oU*i|I)\7k͚UN:w}kʕK{޼Vm醍6>cM6~E..(rL{Y&7/W:tѮ(esI'زGF?<:k4f*o$ 'OVkЩ&[.dq㭰psTF5moo/+ms;ִuYծu=m%$-yKR^VmT?vE%oa?^.^KwܱϙcMN>jUX,1JY9pThar%Igϟ$yzzK ,=?(,rʮzR;tVH#f\S*WHR5o4lm˔74qhկZho׮Y h@;F5UU<"9 ?V==o^'}Se֗fΙ7t9-Z\s疃!iI)Ѥzu+}ƌz_7n<˕5_PtƟ'Oi;CTΪ߸u%i߱S(,߯Y ]ꪲetY}~KiW_*8yfԽ|R/wErFsDF`0 qqEo[}vݳA{`p8vfe_P=Urrr֒+zݢgHruqdRdd||sfXӟ/cQO Q:w4d2%I;k.^Q&(.VqY+IuFNڥƚqey|'Rnn2#IO@UQ ynݲ}K#G/7{^JiFwKeA~ʥZn)@e /Sܾ}[.\5ʖ̷nR˭[7.>ܕ\5J/ndV5)#GY,-;x4իUՙ[J(nq斮__I5_O0cAٴy~e&l6[ǕWWWeXtydVv^#"t'J哝R+>) /) ;j$jrrrޟ~6??`0F9'fdyzzZʒ**`0#.X(aOy]vͼ֭8X,_-_ֿnFG[,:xEժ*,,\>){Uֿt꠰ ll]x1G w>ҵKg4D&OS〆e߯:x&e.SF5]H_|6M7THԜ:wĩլic=Q-]8pݾuwIxx9vgI߳5b8-^BժVk?sn뗪eڵj/Tu ͘372ggg }^}Ο;wi6Y=Sǧ>r~ Vt9P6p%ooO-_Z P,,a=*^J.>R͛-תYCs,m;ԲyS~6lO֮%kM mEjUw`y/VT/ l|)a}StLV|jTaX|iusS%l3_Ȇ>јõ|jmݶC а!,W`R}0:J [V-t9$D#G׭۷Ԭi͖%i~gYIKNVժE3]|YLnL;uYa8uyy=1kZ[S/WVkИq`0陎˚zOB5eX` ujsaO2Zx.X)fv|MX7ok)/OO-YRaaat+/`Әgm9gOh]sfvrUouvsi-7kiy PRn*IIa935c\ {\\]vӻ,^b6ְ%I̜O֖>9USg؉e08QoK-X,Sb7mAZqvv5kuSECն岱Y.S\l*UޗS2ӫںmX%2~5m9d)W_+Vi*W_#{W} 6?AӧLиS5*UzOj;5u8-ZB+W:j|٘+<_~+WBڵj_kO?S〆2c/nᠤ%_I>!b#GFj|CY:M.lN.+4uΝҲE2//ԓq(22JӧLaΜ=^~]_nZoqGэa l"fm;vjڽs[֛"**J:iTJ A/U*W~6<=tMRXIq%%ݑdJ7}dgث״eWUɣ٥naw2obUZYj]>?5_W>ۘUm,V׵x ul UXOK t'!AhѼY>EISuf-Cn[xS?aw#G1ZtBC+_|j٬|=www3oX`yȩ˻!B;t'> c"C>v!B;D`}"C>v!B;D`}"C>v!B;D`}"C>v!B;D`}"m}"C>v!B;D`}BVC>v!B;D`}"C>v!B;D`}"C>v!B;D`}"C>v!B;D`}"C>v!B;D`}"m}C } ^]Ȳr495f*VԱ?ٳYh0b _c!ϕKժVə@}"C>v }\\(F?@rɓ硴}S?0~:{.^'ȑ\\\PGCd{!B;D`}"C>v!B;D`}PFOb9Gb3XLS)4{1gy }Blb y{Id,4R]8p( ={al-x??۹'111J ~nKt'b= n\%咔GRI?|Yl 쟘1^k1^d%c9u%).տ)%$(}2 }0Ǡ$'Y>NJ?S×ZIiQI!m%>)SS%+ 5%_OH!bS\b66D%0aO,m蓺B ~?%qTBxp 9)nvOj>gTrIIaO았zBI-/C!!տ^C%\&Y.Jysj6CnГ~d3}R. ː5C2+mz=tfmh`udІ4;@DDDDDDDDDDDDDDDDDDDDDDDDDD&)EDDDDDDDdCM8 iEDDDDDDDdl1yy]@셇^;V0`6Uq"""2AN>xsŜs)$dza!ݝ㥬byzأp׏#vWbb֬c-اeO#g{&7DKA\\,֥ȞͶf%{JXJa^.nm?{pΛ}û>\ ixWIG{ddIy"""2qres'斖#qG}?JFP(n}=F?#gN=i5ϿH ;"""\\\,?fevkv  ъO dROltxN05s \pJ:Kt.EDD&+^ HH3mcS2 ?G}yIvFWKׁ~(}尕\vy?rY15+G~ ‡!wwkokozK/$59?;T6nƢsx{{Q̙9 9)YTǟ|d_/X1Gδ*ygڽLw 8Ƞw׬_0 /Ywu ïQ^w?4-K\l,M-lؼ<Z|i3z ջ="""sg3RKns9K/ Kw{; ,?sgEx>+w>ڵH$_.:,RSWǪc\Oo59U7V\=v]6TVaA?ﴹl\=s|OMI/JJxIKMQ63Fff[OÉjK˗\vM- Ŧ-?o܂a w,Xfbbbz?`"8]8ż#qIG-<\tpӭ|>q*sgѧeoc)<[ ^Xmw@ ~L& Rxgp 'Kdbl^off# ya \˹ t|aal4aA1bx;fgIEDDd L&z%J /h\8^ 7c8'ʳYmhjnkn S΁'>cp۹ %_Ͽ/6r-?e١x؈吝ݫ򎅹gUwĆ[? 6aX8iձkZC(,ֲ}Fz6+z!66p;nKyoG,Y<~Q${bYգyg<"""7/:/6mǞ0L\t,?? tSSuW>3身(3%~^AP9]tx 1 ?mt߲C fRjeǟbfN>xhq=55457 XWن|VhΠϾaQiqI̘^DrR"fBVfF:zϨF|`2cX{mWk[{$ .)40fg>#$'%i붰tnwaQ6.G|gC^^~)a`ʺ&TW֐s'}Y^~>e{|>Ȑd)|TSST\llPzi8OXŅIm'}>{]SWkk&'%Prex.EDD'n^nj8 \|Y,?gЃ2=u|6nnA}K΃_=?l0Y} fM,""2:߶z$'%A_;\.W" <;:0ĨOcSaV PiL:3.+ kشe۾uyg & )1!,mbB@ikkǞǞ"/w',W^~)s=ۑDɎPΞ+Mbbֶϥ~ˍ?K:-Z0>>>60 |I.njn-Aho&]s|+wt3pOv5ӊK10Q _g/ ;o.^l/-Q˫o5hY? ?܎n̞d+J;-:|~?650.eueWU5+ =b١|>Jw j wEe-->;'wZ>h\KmS[Œ9 Q&Md,00Q`2"""[~nK/W~Vw fxt[V,cE O?l.-YDLL (i٬Xv(O?RVGcS3k?CvS;sK<=5kx?oqp_bZ~7ொSLaWf%9cO;:5uQ+Hiksf ᤨ )YQ|#(n,z6 ŗdǁfx^5X;oSON9K.6w}{jjU·߯kϽgke.#n9e^$Ud:?"""""""fd_ Mg6Liiidg"Ylܴk#͝߾ؘX*xYS kQs''^^#¡ϙMjJʘ"Yh!s ?7U/Ljj wq6-E[n)勈#A^\4wO~9>ŋrՕ!;{jrbg{g{=55qr{ᥗ8vI|vUU8;:x~ؗKttt??TMQa\u%?rک'õGUYf%7'\-̟?'pwߧ‚|2.9~ pgR\R dff+8SBfy .<.BV,_FGGx蟜z b٘x+qqQX} NIϓO?CJJ2|X~q2vcL&VX>s5=}Yc>bu.۽{<?~z^~tos.|VE9"""""""r h皫$?//1伟~9˗. |={%% DGGs-?|gk~ĆM+kٸi ^c9*,y'hjj&))qL3ܰSp8C۷rP SX-WÆER?=IMM |\7zwssrzc%&&RTXȶ A-AD΃ijjx5a}>11XSX5䷿&.1 9fAؘmł m7KrRRX=}egs-?㟏>΍7݌j+Θ?}=*+¶ٻ_;5l 48=(%11XDDDDDDdro'=IHL`\zɅSYt)@]wgd(öJjJ MMa::<}+/ceѺCKBBSm?d0oCCN}^͛3f9A%{N8y{d;+*HJ?VR<Ծjxz$f͚ɇk?"`6$k֮7}\\s47ma[qag{3>ջwSCWV^Ιg]DDDDDDDms⭷ko3N%3#{/Xb9GqxDOcaZTZ[x㭷)Q5W] @rR]p_q8,^Uɦ-[g? ?7^~LRSIOO#//>/\ALL 9ӈQ{>t^zS䟏>MX|iiT[N\=&lJ]xsӋ immc{I ˾qqySSS۸`Xq3G """"""o>){?ֶ6RSYx!ӧFs:W_{^~grssM7r_ Hg^ n'//U}5f_e-ͷM.ͽ~WʊKGީSp-??o<~k $BzZ_?qE:Wcd2q-7?^Y_Obbf3N0oA~>?8;g6}*-.""""""=SԽM$-[߿> &9s]w>MӁ*nx]yb/c$''?0.>@SS3457a+W|%"""""""HûDDDDDDDDs#efH)#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 )#"""""""2 Y'"""""""xubcc푬Fс h 9x BFF%ew{ (d5"h{.ׄP0~t&F4cz^ߔDDDDDDdpDDDDDDDDdջ+ADDDDDD@o7Q0A=;DDDDDDD\fb&E~NHV r ?}9fN;w{Ot3壏ֱk׮QnǼQp8yw }njs IDATjjzi]""""""o3Ͻ{83ûzG8_wmniiQWG~~X6n0Z,b7FimkeJVVhl6v}EDDDDD|#uCpMgûZYzعsg(OAAeee,]ظ`mu8SpѠOPW{SYtihXWsH L"#C/kKc԰ȤgݻilEXLp8KG9x<vCNff&L&Z\.>3/[FLLL(-[0̙=x::d׮]x<^9s&ѡ|~ N'^({YY煵j@4ObR\R">>>xmm-%,X0eeDGGSTTHjjj(ݺup:1 t:ٲu+_9pf󐎷={ֆ O`0t{j{Kaaׯ'55‚Pꨬn'*Ɣ)SwnEAkk+12)#"""""oD>wq;a|>X7,o?}ݻIMMVs煾uo~ϯs/;On4~wyIիxSSCzZg~*g~[71]E46e cJ^} ˡ4^LQaVMŮJ~y=--.L&l6S\R¶mXhQ(ۦMimuK|\\.WXٵ030ͶMhlj!##$JK׭7lxii)3g$6&ݻٲe K=PdOK`픖2kǐn;^MFFy _l`ٲDlyqݡjvUۙEaA-.|Ii) -[brl?@rRoFÏk_FRR"\u2OK؇kqwqªo~V,/8TWYgÏ<-ӋHJLZ|﹗ys琛:>8gy: ̧7bcb8aC>7-zr)+vp"lQQkְdRv;(,ZDr掸ظ8BIXVv(G!WF}Yf@^^6nN}}=MM̟7}_޳ +d23wP䱣٫M=9X,RRR0ͤ$p8) xt;|Blhh3gv uZm6 ٲe+yyDGG ~~xHMMq:L:Պbd6cc*UTTŒ3HIM%0"''j[aAII䳧f dffx#),*ilj =^="""""rINN민 }gig;h?˗-}+zyg8ܳIJ  嘣#1s {r}1|!{6-<\x\rQpn˗| %zdо]ղt2rrr䣵qι獸=5쩡 cXO.1ayuy<v;MMMأ }III | ڽ{πy à$---4*##CO.IIhI47ǘ ֟o{{;v܌$vZ~w@VfdgH6|+0DEE αLaQaOO|IDDDDDd귐>]"%%%@Ȭ3zB^/e;9SsQd{9Z>#o^ ZJKwGRR"VKJlOj 2zآm^d"`̷wo^Ԕ|>/IIf:[{fzXa6a6x:\ov@M6cY),,ncپs;~׃ռ?&L&¯ :M$ :<䤤 mH!~=yJ]|^xC $$$h^}ጆ{1 W'vaf9lJHHkYtvhjn^Gy9hgRN Os9ݷxNnKw96-/~lvIFz:9Q<.yޕ0CFX9~^^W)nVOӠsv9l۾cNG=EEa<o\IQ:zt|lguZq7oiX!>]Rzӕ.SmAZ>M_eMd QZ94y%"""""eӻϿ_`NrAu>v$'c2B. {kUUz't.t/gp'++s<1_̑-~h_P _hev;bd^C‡8uFۻ:x<466 444΂nEEx}^u:}0hlhhqT__ Sj`xmmwөf8]81LII̜5f4'':l6Ea}}V+g;jRRRJnnN[NCZ^VF[[ -"3#7|A[2M6Pm蒘Hrr555deeMMM-MMaV IIITVVv.nsgE@ÜĶm!jVӧ[CC=~SI1+11JNGg6&v ͞=5tx`Xʋz'vn@eVJJKHOKrQUUEԩ݆ 6$p[qmk7.n﹗#eKJy쉧8Sz}w$.<\9,^Àʪ*6o78hua,Y (,*bgk?,^|(;w $`}y;g9Ӧxشi3a"s!PZ>JNvOB1`P=|^v{pŨ$Np8&1!W&ө#P=>{Lvچ=Μٳ ˟E@ --EE}@kX={ݳNn4jLϤx}>rMs_󒚒3QfC^nЮ@EDDDDDd>> =]\:}I^MSsBiz~6.ii<;)++bΞ#1ͤF OW#zԡջDDDDDDDD&!}DDDDDDDD&!}DDDDDDDD&!}DDDDDDDD&!}DDDDDDDD&!}DDDDDDDD&.p8zFDDDDDDDddZHl~7 9뉱IJLd5""""""""N'Y^wDL>*DDDDDDDD[v7!ukNIHAIHAIHAIHAIb.>\v1,_OeUըX|f n{Zշz>X@ 5k84Km]]eeelظqLMA9`\.p8Zd"662mh(* u """2RL\\NqjrV_NNθ%""">""" ˮ zv222ș6 {|aK,!:::wmff͜ @Ii)222!ӧ쪬ǃn'3#jvC  55!qדBrJ Z[ =^WWG̝;۱Jdddzqciii㏙;w.)ɡ{jjBRR39ٌᠦΡh pt`rM#??2\,\ TᠪMTTYa̟OYy9mmmDGGSXP@r6䤠AbX(,(bvSYYI'??嵸\f̞l⒒Ė[imm%7'8:::pSWW Dx^***mSSSta2t8‚>aPVVƌC!&&{u6]P={0ez(۷ogGY3g9ص*NJA~>~fw{;DGp:lظK`nogY(.)!33|Z\.*:Bb޽m۷lRV}N/""rpߎ$,V+# ̜1#8cMx<hhhys*Qdb9FtbXHIIl6 xt%!!!t޽TUW3CBi(fQTXȖ[ Kuu5999T>3L2Պbl2ad]$'!%%0fڴilP򨩩a޽ddd z\"""rRGDD R[[KMm- 0 |>߰{}Ą tttEcSQQQ#JII |bccSS3`0'-59.EFzz(Д蒔k!l_ri 8m(A 334TVV҂ >̕L` 6|-3`6~9Hձ\YPRZJ0]簣Mג>l2͡2GJJ >9NgO:V+^wvf<=י.[[ljQPP@ݎlxO]]]=c N9(#""rp:r =@~W`0V5ԛe9z°C^7,x†?;>@ o'kg:KL𴶶nogܹa=|~֭5W ӛ~`@!N]>Okɗ"9) CccZۿ@ @޽3޼[Qa!^Ʀ<}0ohӥk.yԮĄL&uuu}>,5hkk ;&yОW];aNL&Sc~D)!1djjj$::ZzGV+IIITVUVYQѫPĶCwy<Z\. g~?SN C*p:˨@Lt4555x<eg5Llݺl;: #=}H@MNN~R 74PTXH|\Jioo\11R__n'**arylݶRp\TUW=uzȤb۶oΜ9LaArr2Ӌz q!_|jeZv>sff׮]޳׋npp8DGG @0pN]];{֘L&f͜Ɏ2ڰ̞=ذS`i 38jeOM 555:h]͞=rj֭n3mZA4Pc>i\,553fPYUEÁf#7'+Ƕ6uocSh MzZh:Jwˇ6`O֯'++ng}=9ӲO8Ӂ*nx輅~Ӝ>"""""""">""""""""I+33sHs-[tZ#"""2GDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdRGDDDDDDDdNtD"Ǡ7 QY-$$$b6%аw/aSLXfmxSG&f≋覈(iq4`{nK;:hsDjjʸ9TWJd >|DDDDDD&!0 = 0mc̎uLa0n#9zLB#"""""""f"(#"""""""b>>"""""""211[~x48pZx-"ZO]7z@ Xq׳{Ϟ^?Z;ƴHs8x5l޺O?b[4|N|焾QEO}]cJw o(SV=v4ڲG;}OHHkh 5w =%lܴyDyp=߇"|8hnnMqj7:NZ[[ɞ:5lLL 1/R'#сJZZڨʱۣy{D|\eT Y@N\}Z1- RSRwg ~/,rcM{ brRҀ-#1ڲG;qzO"~;;A#5Ѿ8(ם"RW]˚)~?­A~yG{7>/T&>㠶L||5uIMMeVH}C=f̘fYO|\1ѣ* V/\>:㬯'=}t_jf:0DtOts5صuVc|?Dy1xƬܱv whnB@1ֶ6n7iNõ>_Edp W0=vGGo,R' àtRRٺm---$$$SmXx%͌C e?dJV^: ##Y3g`Km]7qQG)Nj)S),,՝]M$$$0s!_S{7oyy2}:[GZZLjg>F}9,AA7 IDATʒ-russQ{-tuUuWٮd+'J bbE`V~~ki- |fP(flk{|}8 _(cvfKR(Xo‘\n/r =f%R( @x FL9tl.}ӥEA#s;z;<1xGv|@6E4 0Lr4ڛlswυd2/5=ObG,?YoP/‘ \.>`pr@ج yVD"Q,NlbܞJPta)?>e2 /@?&/](tMOF7\.G쬦crb~snGsv;ɩ|Aa~vFR8&bq\8?Bbfa6L t4n~?e}=Ӫ`XtXZG B$\adxc;DTlpoq~|y[h\.$XV͊Z#|=h0g(Jp=#(JP(Y-PaYqxtBр)h4qvq Eml"022󺲶07+~JϿ7hf>bQ>q岻luSZaZU :]@4{d*L8v1o{.TwQ8-s6E4ϗQk011ޞlV:Op|\T(022ё>P($׸Niש:WE D<'seL&=D @RbdxCms0  8_G׮ϗF*Fi"-cpFAr b Ja:L9j|],\+д.o:eٮCS^$< _lC"@"FkD@A;Ǒ/ ٌ=!IЧBfggQq||uzU9::>z\|͍}; `um TctHR2sAVCyC!#z (J8??B 5Jp[[aG*J\2ðXZ\˲^<..BW/oʹd9\n/FG <llmˀ:p Cqo^Juca~n`[HRHҘrڑCbhP(>AP`fz ,;Ǖ5}J Zdב16: RbVVGGīϑA%H@x&;A 4j5Oׯ^B-'ËgO󂘮1d22ˀdnλ XY]G*(t:r5g~ՂыtQ*a^CXB,*=Bgg܆aJw5F8&'簾0y6ދ2-  >WS?t:-fgx!~iV@%MNL`z! }Nb1ln@ՉAP {. f"ak{[SSN<}( 1 qzs(Kp{8ϜeXLO9_F D18v(Jst$e =|Z]7ŲکhoΞ }=XZG,B. t3IsoXh,U9kW^Jeu:Wm.>džű9E=(byh?&'Q,p=ozo^qwW^Y8B:J7-o.fc{(sǂ8 V,j  Q)`LLL an"RV4rNkk똜H8A,'H:]XMu?lx'0<4\Lezj`vf. cc7@9xrb}|>Ea7vD+}Z(e '.*rv[Tl2wptt, *X-L9C0to^e+ǒH&:;0#gOc6Pi0 L7_7u@_NN;>4Z,( ]âX7yCgb,.oU*%>!fBq*JR$) Ow옟b馾hoh)su҇aT+$M9T^Ze2Y˴w{0bmrp ,vwxx^X,w1[>IGA~qO׏+5TW_ox{{zJ6NeRls30*evVeP(}R<^łwjzN$̦Ja)"?J2~h0`ɒ]]r9X]h{xruNyjS.񻯿o|C`,v݄h=DC :COOx!Y8x<I\7lF"y,f3HR]}b e]G*aD|<xG:̌^|H&b5V+y Z=\ͅnSP@"UZFrCi%H&R)ś.rSeK*d2h$\c&r9 zCEm8bi]gDZpt&b(~_m]UѮҨoyHC@g2wP.a21=bLfu^H;@^-D/\/?druEBQZnr6Pse ܡ`&tckoPSNBZ($o6< 雎 {T&_.7V*yo*ux8jťYf|PzeP(P/ ~K[a4L&l.w',B!t]sVp2Oe}^ޔwӨ.˻byAxPo3xO%7J-K[RigWK2$U+rb<9mVQJE1I~W(Mgꦼr)SN4|܆^FS9&i!_ߤhw܅4ϲlۦr馜u*/-!Ǥd2jpQOes:q/\ۘS4=IХSYrT̛5 !b8<}mwoߴܟjW*$糾p$*츺n/\ϧxx\md.n:D|F:nOׯ^]jzdjgumdi>ʲϩKT0z{lyY3tP,"Z  AY8 A:s8- \̰ ٌ|!h4|/](4L\6e$UgaapA@$Vh4 ˋJh,Е:,fTJ%zDfOrM5і]l5f YcaYzNu,P9 |i[6TJ%Fh.fk Ϟ>AXdX\|^x7lc.a È]ڥuTh\z uM`@8hoٙ4ΠReUJ%rui\?q'7IV5)gnZ֧W:Yr:≆}j4M*G}FRMFS k1D:>kڊ8L516ǚWC}]eMJmV$#rbЬu:,PFܫJ&S(n򋙲]txH)XWמڮhUW)w\!_޼m%b~?{wkL+=6+^<[Ƌg˷9l.ͭ3 cdxHRK&#lV+XØ7c#89FGFP*h0j*އGǰZ̐q ~ =6t:-08qTZìo19a*oU*qPnfqIܰZ-8$pxt  ՊX,㓓j#ˡP( n^jҫU*;>am}}}q2r9E033R1hZqrU$" >a|2+ba ۊB.(/|8 s~D"Ņһm.n+Law%ƷT֚d2sR C 1(Ԭ) @VAL7Hu9iPi>ah`,"Hb6bt0 V+vr9ܗuy+-w\!_f-~[|[m6/YO?wwQ,16:**Vfa~v> &1>>>W pkc#3uEs!<#^<{* ^>wnRJf :R DNgl”˃ͭ:,._?^i=X 6-'0=ӕ2dqL4cY07|7>6y*"<}^R)inVQ.d F''89= P՘j:=j-?oW9T*1/CVar<\n* cM( \.cskG_f+]:u"/`"/L9Q{T*|)\n66 Ymr7Z$O?A`20 z,IZhZ "/h0`vfJ2 v7E}YZo{3SNX[߄L&>!lQ;{0LrbuTun>sp x_YnwxԴoϟ=wSԫU*lVKV1WNX,b|lT2ka-Bϗr{/Fjrb*G'Lj 3um.Hiqu@weBRχ|9l1Yl2 7>~ZP Nwx|Y+4b1c<}llm-SgU\\us"|u"oR2tb MV~|rz3nwv?r?_&Y8P3F%SL)~]=%,.I?msm_JzJ<-?u?\ [?ds9^<_n:z]T(ׯ:(^>`hpKBN ~]ih 6 G"7114 ,"G QQKoׯ>.\[_ooa$.Q-H|._Jz~RmRK/|KP(O{7!ʾzFl:϶?׫m>^43!O(˘r|]!B!2qH{y{yu"B!{i]-wQKB!B!G!B!Bȣ!Bu&!B!B:}]B!B!}ȣ9d2ϽB!Bn98r,y]| P.BAG*B4ܻB!B!8r*Lt `2R - IDAT]}ȣŲ, B!B!d<ЙaT*>$!B!Bȣ,,ލ!B!By(C!B!QЇB!B!!B!B#DAB!B!G>B!B!MN1dbs!B!GJɠ] }ȣO&aժ?B!By2,Rޕ/ E-)K!B!rZaBAB!B!G>B!B!}!B!B! B!B!>a>B!B! jsX%~RaNvUtރϽB!BiZj?jZ|ZYYZ ~|-kxRB!BMFed>drccgk{|=8<:D6ë/PzŐ/Vׇ11 x@ p$9aGG8<:L LP [|x|/?c6 ǃh,`60tBVwvl)\n7ҙ v;prG'07; Bq D!B!rYl(to<˾#:;?xOyϿFs_?C3߉X,HFiX,oG&mԪ?rt|h,vg6ĕ~>`ղwVLwH7Ym~>wڞw^;?Ir M][eڇ÷wnZ]M}7u:G]]G! ZF@<@J%~H$ ceH$>00 jJ^U191 "8nNOOlyrq2{ۯp8L&{] Y-{7%#jh=JjuNh;#QJh)?swQv[] z{{`1wӪO&]y^E|sW}v?ضnο˴G"Hz֨{T?\M컺Bc{e_P:,,,^Ѓhj(r$ 4JRG" 9}<ϣS$fr{ & o]koo=^x<E|d ֋7nHlrba[7(fm(+ bq~p`{gOj N]  T.# A_ fP(08Џ1C3ml/W>Bgg(P*8> 2?ݎwS?<8^M}p8M''06:up~VTl )ҙ Ahh%(/N~wbل/4%S)\$SI 6SyRn{`P*r{GP,P(`Z03=4fBFSh4;M.XD$'addcuemaanV.N㧟Wo^A4-\5}Ţ}ewjY릜*/ ô\7mӫu~h,T 2 }=p:bj?v\8>\/cp'[l6 Njh,/C`bbLrm_`Y%<:^sP*ezUl|( k\TZ""q ۲L&ۃD" AR)12>8t: 666&.L q<̭X,rfG/籾rX]_lnG>}[d2cC X][G&8j5V+0,V;20xJŖF@MjKnl#+D2_ Km&xp~~ۋ,2 |)'Á~\/R*v].lE06RR4vd9xit( OP*˲qe o߼<#7uyBTX(wt1sml`'yPI$fIN077Zmj/oO0߇Ϟ1]7618cd >e8y+HӘNC.G*,?]¯W`Z0z.J`8u(Kbq ZgU p:yh419\>ͭ%γYBVCA'}JRϝi17;\. A0_8hV@%MNL`z! }Nb1ln@ՉAP {. f"ak{[SSN<}( 1 qzs(Kp{8ϜeXLO9_F D18v(Jstˊϖ2 wiu o߼jUiw;{.`iqXn 7(\'}8ëaa~V^,U9kW^Jeu:Wm.>džű9E=(byh?&'Q,p=<H3<~81 Bt&\.uZy&n8N&bL .-eYlm׸viM=V_?t{\{.7X\CݔfV6T)07 Vr @:?}': uaiFk7 YWo@W8?v6M˛e666 Ll6#Hh0^̀D"ł UFP(cՊ\.$<sJVVWd̜VtZ-쓕 J!1stx\Efqڼi ‘b//d܌YVdY|EXccc@_oL&˲]7MAoP(L&/s#(z{oQ "z,v!dC[JggaUb\)Ʉ}ѱ$`X0t\nF8޾y M"DL  -?dď?b[,00@ dĿ~|L&#AwѢ (+O8ln499.ɉq#b~vF\FRauǻՂlV+xFn{űtm<*J $]LF{o4x*=JLOOI2Kc[;81.lYZ>Y\󉌭krb\,ҪCj7~ Wԏٙ?&bAP?T^/|>`L_>!X%Jħ5D"QlV(.[RIn;PfggߋyUiw&Wփ>IaRU·BS7SyinҫΗd-d2RWVn{r'˰]uGy|~yѮUb!&nZ.I> `~~ }r~\qoz~z{ӃP!?w*k͔J%gT)Cc*{B'~8Z-{Ss'ar'qrzH$ڐ !E>ry|-@݄h=D&c2,P b3+$ U*ML: ͟{{{rĖCj|>a<[~m\\R#|sL%aZ%7==Bs݀h JB TY-C!@</⠓7M B QE#L ~uR(H&@VtF8LBRp@j1#UdU@ +c̒\.Ao( G"Z, o8?8D:AXv3hWijҷpi5-f3aw-NxG*ȴ^L>ttsޣ8J啛t:^ߐn`vvF T%IجL__oC'x"BAIJ]ƵU=VW?t{\z$?w*krY2^L&9{.7FGa1*B àR:1/;˲P({DBwҮKO?a۷ngWw:e , ^'>ds91b4 B!/"P( rVWe(Jp8]|Ig;aF9_(neنnZ0 Q(Q(KAckCYrHg2MgP!rS6"k7߇RS!1<4ɉqUzPMO>_hxXds<>B.caJ+cݐVڲzۥBѼ~a,;β* M[O) Ii^CШհ'$9y5s]hqןo F릜uS^^}{.ܒw? iElYtiR4} IDAT9**_=ϋeY cNҬ~Qsm~TVV_Nsz,?]ۻ=eLFLO9Lkuiȫ]!ܗnr6Pse*ߏx"R)1(yqcdcP(4 ˠ}*^P($MKP7aU<ϣT:"(0ݐ9T*<}2@F_siZo# ;4joшb/TJt:A٬N˲I B]`vC0 G#7L==+ɵr(yh40L`~zߢ&.tZ2]hZAр\./* TnXCW반MH\>sq$M ʛLVtscz5u̾̬򖔣'p~PB"%Q^zO_MH8f_T\ .9\,:fXLEQp vN!swYFO-_A& LYic%|8Sm͆h,^~D(t r ]8Qa$پV!", }؇v H&P,@)9i, 3fsYuy6C*:E*VfΛ;t~ `0zOɤJO8\3qӶ}:ߨZ-V bD]&SàJdFz:vh(@89i;DQD2jX9mxkphv'gkb1F=\N'zz]{ÿkN_./Ԥi4:_~O/_^;lwQ{488x= $T/Dӡ~3G% LMN^^eTݰFpw3D^(ląü6PEqd2btd vt:Gb6T.#LAAբ(p\(+$I0L  A[I_Ktw`~q&.gR2ě059Q352N}4 T޼}. z Dqx<.x#Jy\N'?8A4օST뭟J57dV0Y;evaz Khi La}c=]h{n8Σ Y. LBMf#Qxnh$ LFV I6$IBע0ycy3YDQ@owA>cC`6+$IB`}}_8ǙtwuwTg:׃E8vxnDcW9{{FXĪ?ͦnl~lnmrBsx{=,3B$5T{La T{> jfΛ;Hbyen X;{;`sk{{݈n,mV Nݽ=hZb5xu|rڶj,Z[4"A?0jrñFz{{_߾:+b5"$N>Nk~Ȳ\OdMYv9~%),-3לZ#LK˫hmmhDT&6jtt:taeu F& [Hg20BDҨ=ʫh&s@*JS^}t:#r\Cfv0V7p`(b;DPdģQ.1=3գYF''30M!i?T !@V[ t RÞA)ױ p|jEw?F0V D KK(u߯T-vD@Ԭ''U(Jv_<{R3]et:|T*CtbT*!H`ht`xh++k_j8~}BۉblrbKH3DM4cll`oo:}^zOy^GO&`sk b zaaqgP.v;wvP(0j=F=}>`n~lVͭm c~S"g$ajWV |=mrsjrёMe@ X> zlmL0̗1=]‘HCu 4w밾Y.@+Ip:nwuLx#j׃ O"":k׍ݘϽuR@uȗ=Ol\eK y޼{J>?<3giV8Awgab~]]5SL.ӷw]+[\ZFXx=,,.7VW?hҞMgnar^ƳJ}.r<~z_<0ֈ]d[=7ΰ 9wSu8o3ߏF3h8"N_lH(((!{Y][nVC6?`YVOKZ>nr0!Q-cwwf]\s9>sϥ=spW""<}(϶oE7Do>7X,bp$Ip=!9a0t"Mx#, ]7#y]Df"N!uU$6 2 - Aޠ.AzDQfj-r8ρ,NBgA^W˽O!""""""CE\λƽ>DDDDDDDD>DDDDDDDD>DDDDDDDD>DDDDDDDDЍ}Z-7HjuwRx GJo"""""""{IqI7E-ޛ,`N"""""""A"""""""A"""""""A"""""""A"""""""A"""""""A"""""""HɍW*ś,^J^Dh Qfb%Y rehT,BdDDDDDDDD^GXӇbЇbЇbЇٻa'S_k4L&twut^KJ+(Jnn\F0D8F^!Iv;za4/\v4CX]p9>}|>F#J0IX+o{xCCj0 +˘E.GG{; vqz]>hl.c4.ODDDDwA"""0ժx\N'޼}+}* DQD.d:ҙ OMb˽^/gfgOB>}tt """m ѕH|>.X@<(S{Ȳ7obdxpDT B˗E߼xQWf\<OM9"(ZB$$~e@Wg'z{{ B҂narb@l}>^4DQh6JBDDDĠ]( v@X t: "17?gOB@=CRF:򲌑SLӨT*p\ ?ZL&x@}}A< VT*!ctd@5H4 ZZZE*62|>_ͱh0 ť%|9$IB>Z[[PTdP*;DDDDg`Ї.R\.T*! X,``#HRO ͆7o" Xǃmk4^jGN[Gt:dfnRFkk+$Ijlڂ tBQAtvvBժ|b^/2,`_]b1CDDD6{l/Aե: !`Vt&s;貄sW]q<ݎbM,JL#H5ɤEQN|2L%fڻ!"" h$I0 5ɒ",^~]JD@C+]OLZyYnbZ>>4KD҂ R FG baq rA"""0tL]ZIfCϱGb(&j>)@]2aac? }Nt:t:Q. m褫aJDDDtp.NXsY4 Z[ZDNk+ڂ^Dp$R:@׫AQQ3Efpv[0A^\R """:=}Zuvv"cfv( H$p:pRNoo/fٌB]  Jp9BP7WA:a X]]F:v0 G2NC.G(F[k !}ZZLMNbcs(j0VF B0 $In(Fcg:8"4 z{zz,zLRNmraxh[8jՅCb2FP,phEB@uȗ=Ol\exyDDDD%2޼}ɉDDDDDDDD>DDDDDDDDsуݷu5n{=@ =@ =@ =@ =@ =@ =@ =@ =@ =@ =@]W(H$(Kw]"""""""j(R AQ[(ᰟ[Ơ=Xd6fBDDDDDDWJ`\/l6CJl:x<y+e6~QXb0MPzr+? Ȳ|mz]Ӈ EQpk#y6=} !"""""" ˜}Qc>7=0-ůooD"V&A *`gwu߾{|}ݏGREFou ?-,w\y˯ ?o5 ͵[;2̍q}.[ADcK=s<׿!H\x'lm_k7Z* |H+X/Λ8/Njt]W\s,޼{׿X,69L]pG"""=}nvwwֆޞT azCC |7SapLMoX뭭lHx(7hk{ ao>c;ё }BvEls/,@enlmmP,natd&SM2¯o/jzuL@ELG8A.Vr9148V~Ǘކrݽ=( 12<SEQD1h%<}<5dY s/_rPw}7ކ>_!L_q/Xp P(Bס }>WdY7aGGl}c]Ȳ I`Zhl:a{6G0=;>TX,d9f03Ղ^x`u͏]xmn8v044^# BՉޞrDT@)= O;>JRXYYC2(j1|xVQ|w_8$TWObבLhچGO`yutp]xxa<šJ$X_D2D\dB-^}r;X~_`p-|p++H$vUF IDATH${xʼ ܐJd2#z6xm. aie߾xA  $Ig G|sn3P*f191vWRfE66 Ád*յ5h$IBU﮵~8af6ʪ=Eku/"g   B4Xěw/aVVxh| _@*B*r<Xft ~}z#Exa߾JmJX,>_ːe==u(‡3uͭmtuv/C E`}:DRP)d4bk;Y|՗A@֊/=A:;6 #L!rf(qt}X,2R)y =鰷`Z-(Kb5Nk#f048N4a1ߏ|]l.F({x=}UM) ŌQru茢ѱA]_Fk_ZY@?FF07٢BXZ^AwW'<7㳳ɈArkt:z~Ʌ޾łGc(KX]#O!,-oA !ahhzr^˥ `ai?N_yΛ{qy-^LM>B,:ALN#z4ZLX,bu-r\s)% l1CQz,(3(x46 AT.nr9lVttAE$I$n|(K沘xwy%""k.W$ ?z m:\x{>7X,(0`0 N7MFV~d R`|l à~|{{hook V FQϬqX ᇚe4b뛛pݨT*?Mל{"hдBo?U(HM^G(V{mÁ_vMPraxhw'‘?_CH&q -(gOf;~z{8lX,AkLq ;~2LM٬> tvt`wo&Dt:zcC8& ݲvap=9_oOMo#p$Xx"J֖n(jrUBdR 1M5\}$ TD<^ FC5Pmpln1ΚVj(9lp$ULXD:1hё6LF#dYYGںNe'{T*iw,okm&TÇf{4^?9bvk~xجֺv;=wwQ5xr$Lq\o-uA\. x"BEQPTjx5IKs HR>'&?j!--uAS,fsed&vJ'gXhqjlitߵZ,H&ho VxCPu>- d*rT&s9vD2 Ѩ|d2뎔eol ,Q(PY""!]?+Aw~{쬬zDpNΠ j3n ZI{nZq  ~7,7q"(FCP!О8GԕruiU:t'. b2QDpbtԬ(J,;pz\̋d2xa-^<׺E'{| PN>G:i8ɡ|$A 5t'P^KtnEuET*!MhZtuvϧ>$֞0}#˅jFSs+ V s umuX;:gN:=93 $Vc.5U {Ots_Z&WVa210Ї֖OAjI[5*i%u.rh>y3ss. y՚*C{Ba'-.-#cw8mbþg4ʹ@Eֽ_!(f!@Q~ʲd*Ϝ,;B|'(72N3I']F8I ,NB,VP(\KJjawtd/亄tښ!^g8TgiօB&0Z}}QgޑfVU/Btw yY>Ftٞc#X4?}Ruu*cT*l6ル5Qj*eT*Vq@+k뫜:\^%I NٹX-VLcYl[.br8k ڶ*>:}K>uס)t88pF Jꖗ%5( B! L~20U>KDD}6oq_:PsvιȺv &pRh,v-$ zM6 Gl*upB.GObR>Xa;6LQaZj>{j0swYFO-_3^_oL&2jOSٓ(Kqf6 = b' GNgሚ &e=| QaX=>zbrm6#њ@X4CXR{ gWX, @QdsYuyn*VfΛ;=B! u]^6><>uzjZX≺kl2][/O͆L6[X,ִ[uȣR3RQ=/Y""ߪo^P6шꐮ?|ywQ!A--^tD;t:&(G$ࠚ//z<0E"tlmotB$5τ^,!? /Gð76Q7l2!P(NwЎjz|>lf2H$ 5?~ٻ35dN}4 T޼}. z Dqx<.x#wt"x=Dc1lln]x;Jx APsM&leSf:ng076ud3vt`fv}^X,frdRl2#vC#i`2I` Ib8,\kO^gOͻa.;X]ۃ|>5zZmVH17puqf]]-Yj`n~NX ;{5\|Fpg?Nb6Mz_چF`6{x=X,f݅$Ij wg0ߧ e4ľ/7gw<*nb8vv06)6vqű 6Y>d K+_{{5ӘE[k+4|P5!6k~a Hj~ Ʉ%ťψݎͭm8v(VVP.Wp|lV}?6Y""߲F=~Ny}b>6Hu701sFG` qppA`Zdj;{oo䂌(Vz{yd@? l6+xٌ6  laaq $IޞO[[P,Ӄ\_>zEfK>(P1rD@Ԭ''U(Jv_<{rt:| kVP*t:`XP*O$04tsmrӁAan~Vͻ m'ADuIX\ZF:`ɉ$ѧxܘC`c{{{t{g;@5djk6P,`߇2>nG0*Fc#p]Mhc8 z.nnmh4`p 9k% Sv`0whG\"* Z^Tgm:.\d0:<9avnۃuxl@?aZ۱\.x㩚-fmX!pMBf'ϛGgv0=3Fݜ5_2FqHOjWOӉϞXTF9|(5k I,..W?9N~z3$mmJmeEz{08g~u#n7so D ≍l|;s3tq eO<Hݝ/~/ꪙbspU؟ťe%LN,pceaiynf|.yZ[ݴ||!e<{ڷ}ӆ"tGݲq]翛Ñӿ~4AÑȕ?PPPP9QCTCI|]WZ[Zjf mx{5tҞwVn~.$""/^?7F9ӟ.&ʼș~s޽R ]35-_@g&Ouachlpo ?w] """ Aƞ>DDDDDDDD{у(Ѽ[pr0CDDDDDDD wUqxĠ=XVB&j5fs@e] Etl+R]WHjaX]`0! NBA [)"KEm"($tzA"""""""z0DQj CDDDDDDD1CDDDDDDD1CDDDDDDD1CDDDDDDD1CDDDDDDD1CDDDDDDDqvz* Eу%@#p8շAzf3z]W,# Oruuj0C(uӇnAC&,w]: Ѓ( 8n(k] EZn>1CDDDDDDQ Ѓ( c>DDDDDDt{à <˺~}zS7V~X?~O?/vcp`nwO$ށёr^~ x)G G"( hoYӫWlorLNLױ h4FN':::jy_12V*OjG@xjf20<4SQע `0]]]O鷎8͆'O\`у#,f3$Fo4ndۧ4B! Cu>$r d2uAiVE(Ke3iawwflVdͶR$DA@^Σ (HRY_QaֳJhuKe>::Z V{/}$I_}utNp8'Fqx<߿:ݩ3wU p]|E6j`@"fG>C"i+l#(J8BMPh]Ѩ c`>_]ݏʬ/""""""UEWֆJݽ](JxdxJ=(x<9>"L:#X +0] emmXX\(fbltFQ\.:|}G=D$"^ԠO&A&Aàvmry:twu@u8Rpg Y*JRX]]E2(j148O cqi x:}3Yt:-17?H$ ^ݗdL&aYi<I&X֚Biuįo  X, (R{L>N|e3k180Qa'ԠO<(y,?7Y@^qzv󘝛G\9wA$DQ"C>N@Q<uEuyZ[Z0;7Je(bv&G͑@ zt85h$ CTB6UN݃ddYƚ?ӱ Q,_C&ϞAuG ?J29L۷ASmma H&z<04j0@LVu;d&:lpY\F4A[k+Bh\c˲ ^A]KbkF%q8npg tvvbooO 08T&It#H>xSixr677$#_d2l6^zqr\DQp"77SŸnT*j@C@IOE@C^ cAcDxDΤ՗_j,V ^, imm JZՊd2 XbV ?rQLr9v+x(^hJR\!`p`&>h|f5OW؉'{WO#v`D^lBT T r0qb;-'L̦>暞2GG?%r^_7T, RrZ޺* Z[kv(E҈YbXN' iQl JӐ*:$'H nd2A"L"dd׺ IDAT2irB.W\YmB~/9u>gjt:j1ԠϿZ&J+՞> BAndt(K Czv}3]ORAT:y0h8EtzV|NT*UNTRA3fl?X,EQ`ZV+T$ItttԼW jB*]֕Ng`6z=j0awÇ6r Yu'"""""am,lxaGTD,^(jp !Hqq:FHR겫ljǯ%gِffe,7 Ez}xܧ&=v8TJRvxw.n!Ģھ6lHbTReֺxEסjh4LFbqd!w6T TnU8hDģG# C^#>}=""""""^v#3"tg=}Z^lX,AOO7&667aXm<[[ЈPnw8R}zߏޞyBYL&gf08U:):uZ>_/VWאt:LDٺ&;;B t gk;;#zQ,fS>x<0LXX\( ٻH7RJQ]}t^0,6À1&` v a1e`v}+SJe*~GJYJURwUI}"}|y<:_>ӧOl6'?򥋇קƳ6w.#HbYϟf3H,&M^O}_ X*Q*ۋ"Y4Dooz>w$܄cnnخ'CEDDDDD4|[ze=-l\zq(J8Zq&J>PC&O6W2dvseFFF08ϣìape<}ʃGp:L.a7_>gQrevn͆磵^*>T*]_e\.׮^ctlaوb և*l}tٱgNZDc=xţǏ1qݴiok -u` b@߰a:l`&ާX3S+dk Y.Oɤ3Ք  jCl@[::E>;7OlG|>JnݢνKv+++9 =F) ,M2PS"pl=}dsCXdzzvKXA"""""""eqx)9&&& P(W_|)}DDDDDDD^(9q^62:%EDDDDDDDQO9,^]DDDDDD䵱, 7Kj|DDDDDDJûDDDDDDDDN!Sf@PrwUDDDDDD* 6~B9n/\㮊Ranܮ }jj U:ka\5IGN-F$>j M,"""""""r )9B }DDDDDDDDN!>""""""""BSHK)fR*"""""""rJ9L;@Q#V&%y*""""""rJr *{J) |DDDDDD<'vBSH)GDDDDDDDR#"""""""r )9dq&wv oFJQ,iok;S/>zn˗.(b Ͽ暽H8ʎ2JZ[x`bg$ 28Џ=ƚigap=1r/ }Z[ 3lnn2<4Tt9_k=R*իOwW~>5tjkkJ2FFVt[4M>(y7g|bP!y]m"lK癜Ow4,""""".v2 ő|pdiyRx"1& E$fvn3ïv%of3gvn' ;o*6Vqq_Q|>/~v2mX19MR>[|Xݲ,>m +4V"nbxh [\pD2AjeiIOwgo=z\ vYFQ*-.;b"A&4M:;i'|*ˌJ(8NgϜ7732:ЁÒ^tI1 @!s9<|7NRc_Rr1TT \T*y y+frj iplC]# `Y־rЧ|>/H^Ύk lt,ev줳~1 &&Ø]?҅,&D#._ChޫmzfɩijqV ^MMG靻?Sdy9gxWX˩U% 1<4Wߏ>V* X4Ǣnۯ1^N'hgX|>B]mvM("L6>-qv1ɧr:9;x!)dK`4Vի8-i1?O{[+--/L&F"8v;6 ,,,Ckkk fZZⴶ^7َ,0m\[[ؚK幵,mmm4zm6ad' rCnZ[XXX>esǤ/;n tׯnjF399ͅgfh /+000 r*J62KsP{[+m[KkK s $F#0rsT Wvri7ÚZ֍kvvùn[ZZ&]㭛=lMMÏehyo:Wxn7,,&۲5_z6 c* P |<}f#yss ^< {T}ߗBl}&]8##,Rě,/`4H~Q p8dB<7BU7 l,,.q{öpSg84by6nY3;7iD#Vd:c@mhE_T':Ξ9L{[3dkjjm[AaJ:sΣD9Fin $ikzmn9FF$JsNFj5vN0jCPkixn}=A~j}yt:x\HycQ.^'|zBFb|'ISSd"It&CXeǯRdr-Vժ;kaGrTLss3 :;;s8]kۡaXV1`OX1<4SS<0O<o(g3l\les }^$}P,o -kkm\.37?4Ύvz_:Ll6 g7_aP<>]G32:FR!Lut8B 74M/,blJ{촳ʇit`Q²s4bxhugfxxwr(_GNjl{w[whoctlR)Ο;{cd:x餘N^,d}}Y<|L}q75hjz7VvXN= VrJ:g8Q~,͍ADDDDDNXׯq/mȲH&lpccJ=8zI$S:p]E4hxs27?.yhH8b5ʅ-][ٳ(4v,~6~6;kkk `3cQ|~?0i7 XQlmm 9x540gw{taȬ ˧xE::1vEDa>{.~?Jlv 0gI(4Mҙ Dvs}"ouHm~)R+.~3Vxl8^R4`~~|^˩b(vӎ׳Mۚcx_`5mX}DoFoO7.s+r88Nq86acj$ݻ]`еch}-,`fqWY>/]9v]"""""r|O >;T- x >!xtr '\& 5NdVWy)RiO=>X,ԙav@?;&>L ZY5yuIl sVVea8狊D\z 60zQ(p8j]PyV-<ϝiX30666|ݜN'.ɩ) "$ 3@/<νT*]wpMXνEKrj\n!""""""qؗVS+J&sUSt8a7IZ6P0t9%"""""""r )9B }DDDDDDDDN!>""""""""BSH)dwD^lR|Sa l'_B92,AsUS*dm}P0tUP"HTV#""""""9#LB }DDDDDDDDN!>""""""""BSH)t"lGllnw>?я5͚c|roK/,077O.0 E4=r9$QߞL.q~[fSf2 fyz{S\.ld2`Fp|r32tq왆olnpU.$X롫# VI{[}?ɩifg(J X""""""'͉jfllnH$6_<ɓ'|^Ο;Ǚ3gmܹw#o}=i5,R6rD#d>"ZΜ!{vKXհ=Hb_y_$۠)`?gp3CC k[n6lx=Ldl|e678&p;|pmT+U,bjY8+4jK_o/T*I&(J|>D_WUFFFYL$0 V\nK n=X\L0;73gmjmiT*L&,xM=o yƾûkkfbQ1[\pD2AjeiIOww\T- MWg'/="<坷oSַzOldDr 4롽;T M8NWCFs,J"rr }gvny6771MpS IDAT iX*m˩ᦦz3>1J:C9FfurLK<^/c&HJ=yyCӜ]LB@KKxs36FbW|{p:\x6<|DRiY[_cccᾉdh$RuP(˗$q޽=Űu&W._be%ĎOBOn:\t6yfݽwD"AoO7/]q޽:2@_/ΟccsjJ6%0\.LfOLkkX]3H=H׾ƥK}Bg}eY\8Rw3ͱ_{]'R}Us%:;;(WSSS}r#Zq.?ey apY&=~5ylllx<>㷶LZ{/&45p^dl|'OG|g10T/eYT*" VV1a۶8[9{w9a`'ϵ,ZZj@N?C0acQS$Ã>R0!a6/- c6S)$I:b =.@C/o^Mmra`)J2rõ*V7{,9=C~F=t~ nןX4JZetl6 8tsϰ`na{r\DZDDDDD NUL&0 \Na1vj p9$I:Y]]ŋK8!^/ N^pP|AXpn^r`@; !lARe}P(ȮѶ5ej=:,箉{ay^.]eYd2Fǹw>}kG:a~n޸V8 xrjeب1ۭ)iڙ_֐83<0O%EB_6KnEXw߹Pr8.{rҗ22sRayyx׮5X*N I'%Ng2{ L&I$ط VT0wX^^\,/ h"0|J c3lYoۮ"_(03;ge8rjJ2Q_)f]'K(d9jViJ=0 0=]] =ޫ`&MP|oZ,R4LNS,j'0!|~_Cv;u >I^Y4z/ö-dDFdk(bS(i,&O^.IEX"""""r4Ǣܼ~ׯ}i8!=}S)ʕ ]{}i "HDbn~qz󌎎bg~xYŚ LNMH&iHLdtwwHOruuF ܹ{n>Ja߇餽1<ٹ9s.7Ӿ(D$чC 0{]]]yhin 3DaLܷgCww ܹ{.J2ccerFFh)LNO CদxK3&ϓͮ$g~P(H4gEx}A:;V=݌OLRTF#T+UڷTTwǛxT*UI9l::ڙνtgjzsmfl|ÁczzàP 'ZZ,,,P=s͕˗azz@?vL- v {Ʉa~.]Ƿo.ׯ3:6ƳЏz\$ @R egwXޞF;{P(dèڹzKG[;jGSV77sf0!@?sssO y޶\\zѱQ""""""""ЉGެ@E=}DDDDDDDDN!>""""""""BSH)GN-amw5DDDDDDt8]rjXd*""""""rJA/>rjl6BqWCDDDDDDXhx)GDDDDDDDR#"""""""r )9B5q8L |Pp8_ͱK)_ÈHXX>6x|ه9B }DDDDDDDDN!>""""""""BSH)GDDDDDDDR#"""""""r )9B }DDDDDDDDN!>""""""""BS< irJ""""au;ij c>6JUYX/WDDDj;jce+\r`DDD4 l6 H丫8^'Y-{#"""_1[?r`j5In}|pU;>kElf,K_DDDrzKeY{DDD䕳,D8'Di"""">V?""""bg裞>""";)wû]KDDD^ɰ,KDDD;I1>ea!"""I%"""  NDDD8w }9ifwtٿG\zÇ>ŋD"7Z;w``r9i ٷo'& @*BTX#"'N_D޸\ hr-Fת2Uފ 97V+~{ Ut&\=RK__q0?.gDQg/߿}ǚ`)DGGǞKKK]. r׋i9:3l6vʛ̶VmhmQ#Uv9yTw~w}_yEtEFε+p存=WBu?;Rb6W0&梓\ԗ#JV  U}։4ȫe|!P(Dri]OZ%Z &7nx^'A$ 05=&j8b"f7>Dw~7wrs>^턝&ӹ͔0ݥc=ʔyZۏ~ ^ib_~}&$"8\!"{1ovSe* x (J\xp6R0992RK_o/p,&M$}Gx}^_ @\֭p!=oPg||Lf˪j 180жY)ϙ38fg瘛wnx?^Zwbtt~I__/ Slnl`lx=/i|iv/W^Pַ$7{ʕn.GC-D4Yj3v6t7J|gX?ܟ&6xvr;~n,6,bncO}GccPMӥ2#v~`NٲV[O l^CAxpNb YR}/~o\4U'6\ -3#٪;b0hOdmw]oG8 YܨwtGO& Y﷘T,|T/;:\(w%_5DR|_۷/;0h1oO&z<]Z#r zp{<,--C_! 195MPtͮR4Y]@; nX,r]N'l6fff7o0 %S*d2T+ƫotP.ٳI~3ǏimmeN\g)u9G䰶+}w\Sv?2e/wS{Cs߄v|7FҾl_tݹPw}=oř0/?ޠjYsnu7GzO# T]4Nd CAᰋſ?ף&uʃMUu̬[D\馇*&~ 3?٠#|#g\IM*Ani90?9}Z`~ug?æo" U~7Z/}~Ehnyv<IS8[O\&Nյ% XYY!KBa670<ENG-"/*{?] |7ZMKwW%>>-YlT,JUHl6Σ^.+k=W~T´YBk@v+p R`j3|coqezxLSzw Zr~oza'OW+O7\noJ$U /7bv~T%ߙ=yލmks4VyϏ϶HF.'7bvP"2q5[{%{~\vC"u9}D9(ԩ)>$NKK >&''F~ cϸW~ ---Avky,xl?a'Cz{e#ytw.MnLkq[uc9lϦ6s1r-(UH"Z+ZLUl/lD|>L6B/}.Z7n;R|y=?[.^d'RV u&dgaz*aڮ8x Ub~Ӏ'~,N}n2Dm6bii߿5W}}JR>Xv^> eUYˮӃf#DZ!NgG;/RZif昘``^T*[ZTc, XĩT,,$aӽO;w;=Οcffa b(}8WDo"gŋ`%o/ Tbe0+ӆd eؚwǢ6LiW=JU"νsp*Q0?qLb7u=,2CbuG[jVw94X)oPmhK-q۲ZP(7XP "쬵$[6|g9a~eI}/=#fDXZZL&Coo_ym\.7. 0j=tl63T-@  L@6q(RH[[[}.4 tww9f?F[[;mm rfj+6ݢZ4ԾF;{SS0J OL2<4ȗN,"nlo\zlL4zP\ݍ\6K;Bm;E\Z\$S+,So~#rWՖߞxlqHrsr}pt-MNsPe(+taRbmk眊 {ȉE}577i,bуv45XXZ, Yazqq:Goww7d9uZ^Nt:5rA2dstQ*T*cS}0Z/a477ͮv`9rD"_Oc#]R@ DP\p{*0~=SoA OχCymlgkRNo?ȿώoIlTS~W&*VJ0& XlkwӅ};C?T'n9}DM+]?5L,SKĶݍ,&ewγlp_rUbߛ#p%.EVޘ80Qˆ卉}"YC҉ Sѿ jg%82\ZWKō _EpEu'"!ut'&!V,NMwR_Gu{{mZ/TIM!l (=omm9FeʔI4>ժUUڦ% EX/'ilٳgO6^Y)_~BJu-DI"|\B ? EZh]-rUBd$?KMOH3)Vڌqd6Ӫd%c,3w(Bb9ܹL= !ϗ,Yȓ:0x 0 O~tޅM!x!hӨ~J63(=m-jYgBv=^ Uu|B2Zs=rUky|VdL,X]mxޡ QczL !"K5}bcђ֖΂2[yߙLY\!"G%6!B un,!BվH[gC!D "BƶB2Z!iB&BB٥+]!42B!w!gi !" 4XG[dN !"@[G--E!:} EK0BB!DfFsddjF@`!!!)(!Bdv:d Kzn>+HB jȊ%Mcnnh!k !"Uhiia`ssE!:} кtz/B0mmm,--; !B4!B!B'>B!B!t!B!BdB#B!B IB!B!D&$>B!B!t!B!BdB#B!B IB!B!D&$>B!B!t!B!BdBu~(B!B!DMcbbx)aaiYB!B!DdddHBҴӧș+K˴,F!B!"C剧'Emm{i&>B!B!ϲ",44]ʖB!B!2!B!B!ȄG!B!"N!B!BL(M%BǺ زQܜEmn+Z$#S_Ӗ[Zll7o޲qV\FP`V٬pYDr/\@M5S{> O Ӭ !Bd.#B]]]O۷o{Z29zz1hMԱr3]vqe-Fy^t/gij;ԔN!BM:}B} ,Ƞ#8͛6N>D__ev2LMQ5kУw?-YΔR3d!Bt!k!"IӺ||)=Βh75hBv{O=װ)-i3Pl?~TMhk6mFLlb#Ǩ]wޣWkؔpmчz G~0ܸy /gֱ'^hܨ!n{wGԪېW^+;a2`SnCjmh߱ koiҢ d)rrITbmԬ5?~/ٲQQ+RB!dB!.'w\bbc5v"^ֵyssFuȟ?Fۜhբ}{$,,s.E,Y8fΡ/ ۻ'lڲקX-XL(T`\\>9feJWaԙD&PJ;wY>jسg>޻O:jF=w%88/_1uxwCؾeo}1i /Z1#`Y8?kXXh6M!=#B%Pceϟk)_tnd<ʗ+ @՟7[;1vqtAGwž ;RoOU*3z0UBTT4N.;ܱYf:}zލU.Y ###̜zzkau{=]],--ݞ+gθtF###ȕ+9sзd͚2fD ysUF6++tuu011N !B'ĦDLB!BTT atޓG3cD i߸'^՟x;M_$YSO/j;Rz^DGGʗSz;*:|VodZR//^X1wgEѩc{z@&gyDFFRV Ȉ&dJڅ2_NTy3z$˜7{?Ub}B) |-߾sJ+|KB!?дI#v-CB!D:~&ʖM9a2,̳6DQ@4O1]w !B!BdB#B!BcH_5}B!҈B!dB!B!D&$>B!B!t!B!BdB#B!B IB!B!D&$>B!B!t!B!BdB#B!B IB!B!D&$>B!B!t!B!BdBYxHt4{"M(B!B!mm0HĥkH{"pkJQ C!B!x+E;:+:B!B!ѱs #B!B IB!B!D&$>B!B!t!B!BdBhش%vtWz. ̈́); 5#(9놝aaU;Рq "##j1k|/ZvԪIKZrIc57jyz}{PAc׭s*T1.̢s022 .kԭ]C)i WEݲZWq3ZlΘþK)\+Wy ~G9ƈ?g&W嵷7ʪ)؉8nf^*cGT. 7gSV͛2h@)؉S8~%S(Uk9v$A)S#Q@~twcu}}}*UddϞe+VyvEڪ5*>ͳEKt*aacMhD_Cɝ+'5'=W7N chP^ey<|NhVmӖ;q^Cʕ:?9sPJKڄ# a(^L;tFm較 eÚPAF i׳ܾs!vRFy8: 2*Z SMHRMz{LIpu;e+yևTƶp!ŶfP״lۑmד;wr; ]ן?yF0?6b]a_MIF2M)ud{r $/<2dȟ//Ӌc'+gNE'7h51{^xɊ배0e*4fM1l^x?Y7-]䡮R7's5ztEmmz.+3/]alx DљN<e ޭ J`v'{Pv{R4Y{ُ1 ނEth׆X/];j8w.li~b'E~6q)8e]hҨ!AsFL;?|f[ԐwC޻#Xb)ьm#R'00@ztJ9x=֬'G v6GfMDl, 9FuV% 5n"s-dԉ*閮XE*vXpŚ,꾧#b@ޜ=w.N41's\9sc'`6Tҧ`*V(qqkJu;OOgF.ѦU _̜g#:F-}nx_w1b` +<<{Ɏt*&Me􈡊>ӧL,JdwǴhք6G--_uuogQ2mOOv%{L4###NUھaL7I 2{&O-hii]/uYfZ4/?v&˛>>\#ؾeTP} s?6i<ʖ\Qٴe+CǦ`A^~kUgA c9r&Mp!ll bZ9з,Y2筛έv< mwrvX[VٶwAq`):ʔ(dS0ԮU}r}M~_h)n/2l@ Xj I\Rznwbt*TK3T:}޽cۋ|yr-aӅ\;qDG=٭:?Yxy canNm)2UܱC\ec>4m[P0W㇔R'vY&+2VZEiYG/VqְƓ8L%xw¡f ;8{Ɯ?s7ڴRőP][;*/8uUmÄGD0oL IDAT֌#.ټeQ\9ԯWPիUT<5+kdρCߧ舭Tt%,^Je2u=ɛZeKdd$֬WiѝB6qfqDLIӫ#L`*#˫CS ss0 q]_`ެFt hҲ'NXf=eɂysU3SSLMΕSeDҠ>rD8p(114k<[2bx4:¥˼xmS-os_6 x=׭ݺPhQTF(sPP0[7#˧5\gYFTb@Nρ{9]/uqYCA (ܽsg)FxXYZѧ \N*vdɒܹs)օLrCJ,N-T|+(^Lk6?p]{5|ڵkqT@سT;x^嫬]4٬>‚3n.dC|yqwDbEѨI ȝ;Xkei*NC-6lORĶ0ϺQ\Y,-,'^rmlVV}Ǔaޕ:0ŋω&&&[Pnm+ʗŋW;+Kݘ߸u8(dXl]%<+NRuEJ±H<%QQQ("ksJs``Nf󲳚Edd #22330kL1[xtcNv'4j ?CDGG'Y{||!!şhkk8A  ⩧'+ûwsvE|y\<83gփѭ+Æ ؘ.hrbbb Lkii)R;(O'jc%[6DW=MI``Ԫ|WÉuH4f0Zê5 k܌3R.:.\WoawGԫSpk}>q L[]L4KKKٷ˵!LMM 8fwi}m:$CmmBBBS0D@V- QL151Gѩc${l!>ohĭq1&OzԎY_':Sz%:wcLJ|BٓJ-._CGؿ/JGOO57NR+HNuI:944RBIY5:I TNgPWWbEmmmJ,7pFk怤[|ʡf RJnC-NѳG7nܺMPP0utliTM&ɰ>J&kV3եTʕS9d-Ԋ bbblИ\`Pzzv$!Yd!44TBH{]L8 Ɯ񈩉.c^V^7%>> V0jF]@4a@hX{``pZ'ZŎ>z(pWn*qC-UN|$MjYaeeɪe7 O|bnqG0n=~œ2qtW贃ukLLZ*̞1i30k|*/800Oй󗈍eIglj}VYTuYziORLLL",,\KpHF1У[WztʻwY~#Fyca`bʠɧ4Amعg/./((o_3"v$];wT{Z@muҨN$f-R>^&Ȓ% A_|Olo%fդ^SyD>Jࡇa4iGB ;뵷7 _~󡫫6˖ᩧ WKjn̕*'**Je^u«ŋJۯ\N1 -ǣ'txz=Ӱfq,-,(_+3vGx&/ƓJ +׮4>%+XΥ򞚚(]]]cք_0 Wj|Kݺ_Mv&LLJR=T<~~qCʿ|O?ZZZTPO#b⯤9<Z[㪨-JW+o腋Wk||7El?OR7oNR+); nܼMtt4ſd04,gF݉{_mnTLo[i!H)а0q2w4V-@lVdWYiq2Jr"V]Ǥ3קr R^3g 4۝LLL S\,]{kobWI֭~=~S+QRju5w>ʕ̌sf2c\hKܹk;\اX"361k|-„8dJݰ …X8ob5SWjל[]J:8Q$cG`ѻQQ̞1E1ŨtRڽ:Պ+’sUڶj w;++KN4ro︻7msr&88"Yp^%O.;hִQW[6o M҂))iۺ=P-۳+u]i @eXjR>z(iPCcּtFtR&Ju_035elԄҥJ)G%EC9/ڴ7/ xݻۛa#J69l|/)4~:ܽWL3riz| '8סƣ44׷SՑ;w.̘ʢe+XzeJm떜v|$5YT<&J|^9:mxu8cVAI>_ndePmB˳-Fhn߹CwxҦG[Vu1YsK'BB>ФEF D ܹ}7O&ޡ|w؉8Kn4շpٹUksVXf=G`˶d.H2Z-u :(n˝V^N弍yӴIz}YZHUVuLB+ҭh*^qre~SY€H b>)gؑ>B|דG; %\&? ^{cF֧W--OFcWϝN0R]fxy˾TCCC?~uBI?L7 t < CBr\v&GeղE* !i!CNB!B!Qd]?B!B!Bm#B!B ;}~;{2|tz+T[guv;q2L{zF/7Ys φ dx;{=n/|si˘5u-Sz> 䓖"hؤ%][IikVYefF^~jy&ƿ/^j6~L2]}_D}5`ب }HNgtWŐ7ƳɅ[ gwP.];}/þ]Ԭnޡ(`,͚NM9~G#666QSTRՎ]{E/wpMپCDcA,7=7軞ijמӥL钉naȈѼ|iӺes,_Łsec׳06Nzlz ϏV-1~7i6sREKWpa!8uڕi6G*/GbE9[c644 U062b.grVkפIK#<"͛|2?^,-,Ӵ֮īWީgFz +ΝoOPOFkhOLL N;vѦu ,R=v9ӷZ^rRRR/gX~W{j;rfŒj iOؾIJj>v]ٳ  K!脪U:&&p1(Q9o۔f2ƥ/MT(_El([4tt!#K܁=;fv'߸+<~+Q\j;[9ҴI#E:j?v7o(UFe304`ɲ А;@]iټ)AAA,Z~}{L5r)fȘ#1,Q9wާTLҥJ굷ڝ>>>hҲiPRr]Ҁ-  a 2I?+zzyakӊ+<}&i+Zȝ066b\"-(0e:,Y8O\Ji}w"7)Kvy*n~3r݃cc\ M1zD__J:h7 07'66иN[4ҰV,XkoK?dc7sLtePP0#FҕẌ́#)]1?-XKWr%FL>j:::<$**a06 IDAT̛mBDDD|Z8IpP0eʔba,_we޽ :ӋӤQG1q ~GJ*s ;yēe@>T(uAe؉SҫGwEޗ.]׳U:[څ {^Al߷QJ7w"=~B]Yl%ϟ g,k#&&ױa-b~suTw9)K.]+[#RjۤnS,u^VfUkU}j0{\ajjʀ?N%%"N;~2W]GQgϸx2͛6ĄZjp1Nǎ={6*WV>s }5fϘ‹/Yz/;a ڴbvBU:}]y :Z>o4:!Ȗ͊}h& ^x kVӋa#R\Y\Oz)?d8U)F'10nT5iİxSzO͞NTdmsfL@WOfR\ϟ~R 3M KW&**#$bca1Zq'CG@|̚>?rm2eljPߟ:YT'3nTBCØ>e"ഫ55xQQDFD[bWI~fG&NM|zxPbE:vh>ϜeqٮywMwaQ}ǿEbł D *h,1h-{ K-`/HGS<<{;7;w;ٞ?̘=Uݰ.m;S6~_ d>v1&c_.k/_^uiί+ټm}zx)ŐlߴNڦ]![g i6.w >j,6S٧?2=œ7nqU+Vvo'"2.{2eXSҶu61dP+/|jnRT5X,nq+c/[M[q/uԖcb9aanNZR$''3n?yRϟ/R\ACzReuϮ͡M-O˗޳5նu%OF؏ /1cvnQ6i]t?_`͛%+Wͥm(%B. ܺ}3dƔүիM۬icHƑc'hҨtPi6Wxb̚>Y;*: JA~~$%%1WALl,II%r##L˓lCϜG##Ya3I?PxJ]7m?KBBBy*)=j֨Sӊ'&6ׯ_`d2kp~iuY|%k^9NTt PZDF hۺeʺhkܹ{)lǯHǼg::;-U*gU*̙h|ߣ71ڶܘ/6:BrRͿ8Q&=w o 6ׯ@ܾs[w2 ?ĥ+W @T[£VM=~¹?S&~ŜSN|Ӫ=OU ³~]%:vhǝصg/`lcゼxP䓾Kn/Μ;O6-˔.%w̚~&?c.}˼2^Y2R>۷eCE=0kWJs^|۾ ݺtř&Z۾' _2hűrz:m-XzUyvƌL齳{^=;H ɚ5K{zi۹7YbT|VV8?ںV6mk/7Kij vMAkqȩY@SS rnM]еsGz('iS:SeFj+hZh&**Ӡ)?鏾>3N"o޼Z[[6ՂVVR.V4M]g})i_B+[*$T-Y:>477҂e+Vs,Vh.ue^}ߘvrƍ!񣭤$">rEʅV!GP45ʹG>r J]ݓv5~YΝ^C?g0T$o_b$''m.ZjgZByBR~y2/IU섁< $p\Iw;FFFj~ Kk޼a95Ó7!!,}hTnlL>#&&FchYJNjUTˡǻ}ܾsUkso76CHtY~2Hr? PWƍbJŚuإ;u4Óc'N]ll D8W"(ƹ؉SGHAduϮ͡M-clmնuw _m;Z஬Ci?~Bbbb'W8u,;f;vLrr2TusaZmꕕWXA'ctieE|zRTVt~?2uj{B[%!~}OY̪I h\SIK3T*ڹj&Dz6r]"Ҟ>XXg9L&Iq];w)]Jmm>ىARbZV]/z?.lGL2[3`/d25ϨQeDnl̢sחQ ~ ȯ6;'$dRzsgh 3{wdv?C}}}eUL28*9UdĔݺ0f$ aanxUڰ?Z55M9LFOO&.Y1Q*833%)L'b+V5~.{l\ *U +d]![\*W®P! AvmX<&& k\ %(ɻFugϟӡmLӤ 4}044TkPajbv''}#HHHv=oj+s걣'S;v&񓝤$2JŠ})lWLAFhy9t(f>~& 0teӏeb 1:].Usg[.^̔Xt9S'*]J=YbrN?UC sM^0.lGrw"ulʮybdhI&Ncng_Hi˗$%%QpcI4غm'd8>[&&&T*bcOrr2QQ:ffJ,^Hc] ǖYW)}XbZMdgo{0&/HXXrxx<-Y&ެS`M93ţT&fF__ݻѣ{7^ײhRjWhk!ehS:ucIɓ1X f=vn]:MzHw׹]q~L5>;KdD#"0249M;I㸈@&Iנ,OLl,{``>Y?""#WQ@EHsieVV077s쉠mbn{ 'M{S6m0ki}.m][wN077c95w'N{eVeFh&MV.J6 T*Еԯ]R*ΨWɒ%(S3fMHGR}HPɱ"+ZD/ȥ\.C6!k?a|d~L:'OT>ʮ^ bk.B88ZCҕ+<Q*}}}ܫW{ _>**pr#CC*9U_?T*[kgϝX"2]pvvȱ$%%ӥSBVS9*99bhhȹIiΞ;L&år/6<|>N@ڕ>k>nO;!-!!$''k~s̺R*I PeGRk^m&W|Id\I>GjA/)UʞOqOQK۬ic-z57Q꒏s%G}/4wzg`&MIڵwcܙ@J߼{jXsK<{".qW}?+p4]|cei1QWHh(q/RcC t}>s5ge4Gf3^K}AjլxMgj_6mc)S[{ԃ^}0ppڴjz:s&Pv]7mƥ+WJ>++?f-R&451Uf߸ ss YzM7*_bmmٶJN)WAU|9*/nj󈊎@e˱/Q\.Ε^͍C})lGpp0_qCOA9QfH9''%K=L^KC8wvvrGT1%`g'.ŋʊ[1d`^1s#*^oބ0qtx豓~M6ގ۴bXZXJOzDL՚cC7޼bDGEs Bmٻݰƭ[ӫR~F+Į={.Pccc ']f͝)cdh]Q*)]J}VSL:+Ϸ0}\׫C92x\Clk~}?5ݫyi4!eQ&]x)b/^p,~7SҦ^9U1h͜CZ\7>׮3}Yom'1r~ޕG>zC?f=ʓĶi۪%yxoZ+Vz%K^h>z1j 9mZ6g@>Z  ssVZKHHVV|۾ ?tS>_֪ 5n"ΟCjnd2̙s0y:JSSM4׿br,ZUL<###Tvd {+8;;qCxD,iܨQmxrWa%Λ7!9viХ<3g"fY@rrU\1tο̞>kXa#agEU*Ro,s?9}89Vdb?Apk7zMe[Y<ښ1{:|ǮP!&ɷo9Vx&[kPuM_[n{s 'GǏچYs ~ $* Hz'Mʖk{dŋ ?f 4i \ySk —^=W"_bsk._$T}2aa8W}gNŐFiT_"%|)¿K~N_lg;~W}7.ks]AA,CWXZZ0h@_sAA_.AAAA)&%AAAAJ    ]{r2qfεGȩ   As^J151͑AAAA|Ol߼sAAAA/T $T\#ǎ&$Bܩ-5`yê5y  7zJ4fFڷm͈au֮g=$Tn\c;U;iy4fB/nܼE ٰy+qq4j/CSAAAAoʵAc'rz=K$#.\[ ܾs"ؽm=ִiB4y)M} <а0ΜJ%۽C~+]:} B!9\ÏݻRlY6mԭS[J/WfZG=`͊2lh*99ҨAL#   #W}nݾÙs2cD<z57޾}45ʒ͚mn6isϏ$A.WGZM`bھs7jҧWO*/GӖmd ߛC!)hm#\AAAAA\:UkR.Ai~y :QTDFEI *v+|Շظ@ U\eKK Jڗlm "EdeeIHH%   O G`aaLu \ARR:9r8~#޳W=J3}D?yʀPq3&MJLl, (Jʹ#y-dj,AAAAnrxR$44,?aajd2̔:Q+- ؖg:x֫CLL fB/+Vp2ȍɓ'111jGG`aaU    ʪ+MVt\*WBRq"(>-RXwG4Tr(ϗ/Ӳr:kC![_XPȉJ@Z' QAAAAHGxMXj`YzIR<}+>ט=}Ȉc'c< :X-/md~իaanſ/ \]*k/QgQ&Pbiғvm>{.աCW!6V=@J|\.YAAA!W}fNUkر{!!w8) @O&[NmB4ٱ/QN3gBcb(lWIGSٹF?tEPF&&&m[3bXJq< bĩQ^]\]?}\ΜSZ`s,⹓Y    dD/eٻ|a/>&7oR9hAyϘ=@Vy/4    c7t/tUk89:~6,͚A@ HIÿrӻAAAA#>    AvN1,G    >    A"#   $>h/#7ij\kxpDE~1{./\d߁C|;mwAik ޾}FRl*n';u3Ƶ5<sO8nDe}_Νẅ^K9p_ 3̞@ZȐ_FMS'o8|8.P8e:eJ3v~בחnټu;(  Eb'rͶo^ |&;Nd2lu~Ǒ̙9:keOU9sO<%85A/_R؉S 5ef|;z}C7Zh@DD үO/YYqϿx[6Tɒ} ~e@ 11%VбC; u9;9bnfơGؾ.   |1rmĩӌ361sn޺B!iY?e ĺ@~vDV-<-[lXBzmܤ9ji6nȆ[QCO~2}}}}֮g=$Tn\U;iy4Fm]wRѮuK115aʄZ;}؁ЮMKTo6fİZxy6йS}0c<<|Y:>mZOiUfmѦ<uU0ժRޞ}qR,ZߗPNm\.oDRQ˽rg\z =y y>U*;7Wǃ7ow;|p=޼ qՓ'OJ*ɘ)U^Jn&?ųǭJꏵu)ӧϘ<}&wާXtЎfg  >>%+9zTXÇQh)-ߗŮ-;}K5_8">  \I5fdӄa3p'MUfx Dž1{&&RPH[{Kd؈TrrQ?|~ޕe˲i6nRYovZuI._I.;skԩNr1:c4mܐ!3mvUj6u6̜*AUk|Ĭi00| g krT*#z[xDҥXz[@JF1 ss)%E Nm[gfBB7oݦEWZ/C" ={BT*d<} *Ӱ/^=0R $85e0b`:ѹ^ngɔ(VE1t(~۹E*}l Eؑ;2|$[6RF!9))Ejlg؉\q>{Rښm;w1ppl,m+%~c4C^eXnNJظy(MYAAAF4n؀`_;q(S1#PFuu.>5N\rU l߹Z5ӫ'ʗiK_e266?z[[w좖{ HiҢhߦ5o߾e jќJNW>}Yil ZY.JyVqᾯGP 0tXYYҢYSܭs'|)!3s$ ^w&}#,,+I䳲! W?\)3]iOj9'zI,_p~mꥍ|VVr2n?q̙1M>EDF~fYE 'c^2uxȋ3f3otkܹ{pCzuN G-&FOO\=zîmˍz7 ѼK$% ӫ'\!GwVͫSZhKeOm8}O<`4cEi۱ SXQ|GlXB :|[wH~ŜS㲲ߴji;wӸ##INN=_Uѩ΂  9x8~Tyww7L)vjeeIHHHgi҂%tގ6{77>ffޖB!G.7]/111ZIPXn#tN{xr)2QCi?~BbbNe.m燳ߕWXAmd' <  KK Xͩg Ur*ݸɚu7z ^צ^9}_Jڗ>nURJJN͛O{j4jP>zry^z֣VM9s%u 173XߧVy)MMQ*S:+)ýLL_7oBxɓ'z!IIDEEӏI#Wsc҄y‰SgtW2(h]ߍ{}Hi: :;|`jb(u###j|?MPP=~Jٗ(ξ<}3*3߳[AAA{)FQј)ջ)$T$$$d["#)דɤ CLl, (J4iotubbؖRaC{7I8z2=agk7f`>/瀡+V%8ڶ?!I!WDxxVVZ9|)OhhKT'ppT{=))ׯ@__sY|L#66JN21eșr*T86kqMrJTT4f龫dTT>YD4_ @)4?}E*V5~]fBBF\ )U$1ŧ>XL}MML?z$Sg̦qӧwOm$R:V m]!LL01]hc |} JeL%aaԧtN J1ibIH![[nݺZRRR?LEI lDEFS._G} g̞{ؾyvTϞA/_Dv{֩{u>}%*KKY MI\DcR<dO B23SbeeEW(t477c95w'N{4ޗFAAA2we4WvUʤ`aa1 0m*ix霏6JkrDd9a766oj{DPKiU)1ImvG)U7o -Εx[+ZDD\WF-Dg}pS&d؛MzeGP:2<P ]rCCCrBJNڝӣX^>9)50"1հXl:wa1TrrАswyd2.+gneNpvrbEd2>oH=~BLL E^iΛϞWҸXrȿ.ҥJ6L 4.Ε %99Y{:wQzK}Vf8,4ub"E XcAAAz>ؾ`9Ņs:'OTqqk7?H5سwy]BYvm>{.աCW!6VF8$4=NBCå<|ۡ&Na58Wrbm~ZNsso罹{uc" oȌ9v?vJ@#=u^vhS6[yƌL-po<}}}}C(J?~'3c*>b"/5Ɔ'OrIvS'::ZꝔ@LLȈ_6Z4o4Iz¾x16l#(S4yYƬ۰N b-hTI}]'4,NEOԪYE1cwY|!| sMAkǽ5&NJeJRnjь7can!+Wij%V`aaRu:̘å@͚6f$'9nں>`ɓ)bgGXn# &[vvk IDAT8t|Շ{~S{57W-ISקCqDjn 2vHa;9wzJO>o)ioOTtkoŹR~PXQ,  _/6SzU&u8p0 0j0'w+@?{%.Uo1';5yP'N%.>M 0}\ΜSZ`s mx$ZmQ<{m;vm.ڵi |P/0rPϞKkMФqCSx1SO{nHhhYQյ izcV(_E 7Wg"uf_;ѡ]:}s%C3f? UދO/䓑)gYr֯G?|)J~20   ûAAAA>Bn%fAAAAON}AAAAk ?]{rGo[r µ~ wkV,? a#FSɑF R ǎdt҉Jlݾ;wQvMO?~w߶s,Zޝ[Scd(p'MUfx Dž1{&&sLLo0l>}Fr}.E ۱{&1z5UY3s*W! M0}AAAuw˕&ߍԫ\.}_Y.Js}_??!}d2663ݖ@E'C!)hm#\[w좖{ NJhҢVT*Q*dX;vP4cFf<`]}7l@v)e/Q\000`(MMEl۹[O>++r9FFFZMAAAKrӻʗ/'O[L6Kʕs Abͺtҝ: ɱ le)\ZyAAAA/u=}ʖ)~p5+rLJ…툋|x- ߇044bleϛ7ڲL&+bbbGTQ*?͓1KRIJEBBFFFjIʑVV'BP_+HJJ"<<++O^FAAAAu=}KŹǕקW^}_lmmt҉V-QdI-B||g.}r9y!""BO=tyGD`dhЗ厯BXXrxD2 3`|CqqqZAAAK;өP,׮ 44g'GpRnͥ8_T(~TS=W^#"#$rp(͕>j]|2eJAA\htJMH{2ۇ "4**pOFAAAM4S3Ĺ2IS&5HYj ]t 0w 0K߹|9ٽ{O~Oަ~{{֔I׏,XgOccәZ>I>IL,\0?Ih|ɐ!gnmuK^2Ͽ<ַ̲o};I3hРe_nپ=_LKKK]WIo/~O|(}WҞ ?ٟ踮Z(Sÿ/߯3n׾띻Nי}d%Ӳpɟ~=|);w͸tz^w?߾\wս&wM7d՚o'Mロɓ&Sp6)ctӻ9[>?Ҝ;sw׽_}ܝ/}J_~'7_N4d̙#6Ɏ$$iI?IkCI')yt^w@);ve̛$P@@>$P@@>$P@}EOlQfP@@>$P@@>$P@@>$P@@>$P@@>$P@@>$P@@>$P@@>$0D} H( D} H( >(8( D3TMs쥽SYQa?w~$P@@Urly%--9 SRWWiSbͫe+=?pJvڝ-LЯEZcǎIsssWoM( D} HǞǞso76-9m?66OuwySYq;Y!{4*'M̕t.?qt"mtytZ_6ٷo_\am4+.Ϲ˞=Y i.\o=TQ[>}SUO?'|:w$I{{{]XZIJZ&θcNz6lʌ;?,}4]X+rݵdaٸis,y,wugFqBpj<|eT*R13͝f߾rM7$I3۶'|:ӦMؘ5 ksPk-\wݸ)͘/{w>9K2˞]w],Z nyѥiniUW.LeUU֭{1?ůrw>IjuC֮ˌӳp>L[[[*++W,ċ&dW믻&-р>ys5WM?H3{V형3 ֖Ukt>pN̛7;ܜlf65߾#Fu2uI2Ψ4wlVֿ!]Oeeej I OEG_:ΠA:۲Ukr$M0mm_bfͼ"C7uY`~dȐ!Y|<̝;LvŴuilLƍ`6lܜ+-v̞5Lɓ'u>~;nlgJښ%3gVj 8:qg{!窪e/HKnwؙr)]@\x4713$ɰC$4$IvޓCv$>|x'cܸ^6447X#kSjkk޽M=~)'ޞ]c׍{wݽ1uuu'S??;vLqմSzwkkki̔)a)Jil{xl5`gJv-YzMzzY2n\ʌuNlM<ӟuѻX57tP:rS綏̈ikkK߿?uu=PW1jpRrw_oHuuOQ=CtܑwiI죊|=JRZZZ:g)uUSSƽM][疯춬=---=V6$ɈsM7\Ύ; Ȓ`rmzѱ0&{rS?'#6uni #k@G :6LHښrwxr$wKKKcݣ-\8?^pA55E_щ,р=Ay947СC9wؔJil̈{[outY2cFJsssv^kkk~睜{$yKTʖW^u5l߱cEG'&vOSӻyn\bƥR}nE+?6lؔ$6lX6o~)-y]uQ6m~)'LaC[k׮['Ɉ#3`6lܔ1笘cF^[.55s32iӘ^"IR*U׏.HsssV>*S&Ov\tф=*K> 楲2oHR]sf̚u9tP.`|>mU:ϯY%Kϔ)3*47gmՋs>gI3[W=zTn$|8W-^N'aF!IuinnI?nw;gVƍٰqs*++3bLzq[T*[n3>HҒd$NR>蜎pV\#ЀOMzI_wh !L} H( `k?*kͮ]slǮ]a_5mԼly)˴iS{+UQQK_q( D} H(5doޏs֞˾ei2yJ^}mǹ6SL}ѧ"ӦN8w@/\D} H( D} H( D} H(ޢOG{=sOLwСݧ򹾢;q󦧒I5ץ.5W7\wuÆ v^T?cO {)`$<*IDATTǠ$IjMR}#DžN';KO~]zwߥww9dG&9Ӗ^[I:bNE> ?T{JϙB@ithtD>G_ >#Ke/,[>FJG6\>2f lǭ=k96t D>]7XʇpFA9S5skUoѧl>~9-^3m]tϱ';ڔyTtyqUNSz\E'0>gα3}>ʽ׫6.KulzGՉF <-;O'mDs@&c"%IENDB`KDAB-hotspot-41e5de7/screenshots/summary.png000066400000000000000000004457011515036260400211110ustar00rootroot00000000000000PNG  IHDR}8Q$ pHYsq́ IDATxwxTz:PIW#("`AD*l^v;"* -@ГBz9,YCB 9;g9s9 """"""""""""""""""""""""""TEDDDDDDDE-X$?H+c򼍢$mL95ODDDDDDDDJץI#ǿF>el1_v9LHyXvs>蜯_c?蜯W9'\Ldf7MP@&:uvp.J)X)aRǺYgΜÒ1q1c-k𺋫D"pwptjSZ }7p1c=eb uݣ?pz5#.`204KDDDDDDD|U=X'{=34\v#"""""""rp\..l\M]\\zJ0lHMM+'.cDwd*͡>9}A͉\L&͚6ˍiָ.$'A{3{(Y ˚>XFX1cR޲=;IJE^ #J:)'bw2bmxzxk"/ΑcNJ|]oʼn蒄[b3?DHVlgkfuFFSW_\ݸq /ժxqժ)-ukd׾}$Y .NpQ]y-Ü&;LvR2?~X̑c_Pbӳkgݾ}`x<ؿW-_.[HSӧPJe[zc6IeWI@bd&bAfI#}DDDEvv`2QJe~g?'F5JsI nqb-rKd21qhk…<==,\@*L7?Lߗ Yd6i`N'3#f&"""s=f$o1# "j"nRvNC&zvBJco 'nA=\ɏ{28/>|_Gi1jUpǬg.!ݻHL#nN: gZ* ׋z{ϾB| )?qq3W0 ڷi{op8/:̓pws#.?=;^9ʗs6&MM6۱w?{2"8q2*7[%1#r9zwIx8u,oǀYo?tkrHNNᏍuխS {{{>K1 |cn 6.>w?_=pŽҟ{øJ6sQ888б}zt*ϜE\^C~l*;Ca~li5&lΣu`'n‚˩Wمc^}1g^$33 FHPF|p)1qШA#~:zc6c3ga61LL2_oonۓ'y^|1d2Ը!{wKQUe?_ޜgM`3 ZnIR`NHOGg XTZDDD.db ;+i<[dΗpw־=Y Ƞ[ߛ9:8/`IDFpߞINN?!#G ;kgWݼӴkݒu$&6 \mvlij҈z5cmٵg~-;vbooO=iZ.$$Z.**sfujߛٸoצG>bb^oS.99T(GGGz? q Qϓ p̚fi,{AuKڧnp)+gYÀ$} sւd".vT\eT?|`CnK־=b(gEҟزuMۛҮ5=AF0tG2},\LNZ՟USfuEZ*Ԭua`΀Wu+MϿ KQdt4xw^}x>L3s湎a|mo9\}iʺs$O^;_e3;LL%+frv˴.˨L!""R àwnٽ >0 /Ռ6J~>&Ұ~=p%U~}7_yG'r:ztokÇXb5$1|k?_*|8SΝN:M vMrJ*gΞ-۟e;i6ϳq˿`cǎd) כLտV`_ZLDDÏ?m2>`I1ⷤe.᏿I L\9LG_mlشŴ՚imKJVf ڴjo[ҧgwLvbw1qt iG]iݲ9=@6-quuύ[lڨQ=vYg{$6.Z֡IJNpCԴ /ZFfGIKOH1zv¨iϫۋ l 4kڄ}zһGW8DSE:rt22\ҷ''OaǮ=>sstО^ݻP~p! zvJ^=WjU iۆDH$0o8uZgd |7ؑS'YoMo*TFѡmΞ9sŅ3"/DDDJRR2IIFEFQNmU7w:k*P*7wɚٱ+%+V9shx H23uK1vY~C8VYI2l.kvf̎n%VDDD NLk cCR4q;ɇ;xjUTԙb%|JlnM &ٲa+~e"""Rb TL"""W {iެ^I޳ͮнy.$] wM޹8;ϝ;c;JeDDDDDDDD*Kn%"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""Rx^8DDDDDDDD$?K/!&}p)q,""""""""R:|KpwT@JT@JT@JT@JT@JT@JT@evzl6rCӬ\]^c߻oV_:w2~EixYB'bQmcラ|gM[a՚/];v5,+p]ThΒgT eټ\bwh(}fAALn\݈8q c VumGүOoKkδnfyH4Ӫe 6ѣn/˦%Z/o6 GGGѣn'##L~gʴ~UI8x};2N擹dddЪe 2+iRRR싯_QNm&NmZ{kQQtОK<2AjԨ^f&$$R&t ,[3g\CdAڭy%=z`ٴ"N`̛WgHH}d:u {[y}z$%5kaNyɸXv>h'O^:L}p O<5͠ظi3_}38::PF &Mہ"""""""א2M$''hvrrɩHǞ?ÃӦǴɉ ~'JRKcHMK6 9nnӛBB'Nd33pwwgȠxҞÆEK1p-|DEE1Y|w3gsmӚKNjp{eäCa\""""""r}+cO3K/fp `S0L\43)ԮU˺]߿}۶&|hҤ1*ϥlܴkMdҎQ`5k԰iEu`%}\\\Lc- êkY^{%Z4fw^ѽ%Ԟ ~ ..ooR'Yv@@5"#CH{kNl[6/z~}zѢy0U&}6hB΅gCFb8aOLL,}nh?33CdV6//G/aEWNm֩(,&?u}5z8&w1aUjI77Wm{{{ӭcb)섫2녙|x9| <8eR)""""""r-* Ip ƍ빜_˓'ժVYzdWNDGЬYR(h߶-[WV2^3iRi[חظ8}i$'' iߎHLLd?shΧNڤOVϿ\2nWIRmZdɲ夦ѰAb{)Az8q# 2#KĉfG2&8<@ZZZ/ƍi233$6nޜoywwwztн?xTbV]I#~LC ?cbؾ}'B;D:u@V-y|31꒘āC{/Ͻ8=5UTge|ʹHzNuaSf#ψU@BㅙOPfM~^?*UPϏʕ+QVMBpuuf긹(C37u;+dr,[3jդwϛez={ygù=n,o.O=<ɼ:EBڷ-Qժ1녙|x9jתNǟ&խ7s@J_;JDDDDDDZgc.wʇTo\ޡ\sOg'RnGDDDDDD D Hҁ 3adsՎ3sz-[4WGDDDDDDJU-..gO\|nْnbշ~TIF}]+;_r^~)Qyv2eҽW,W^G ,3dmӫLX'V^Xn5mBn])Si<˴h̐A]-##TYP7FJX,7oyWZ HLLӓMӷWOp9z8OozY@BBsO(0kC L&Sqi[tǎG0lrm۴lOOOzoYPSw/vvg֕n+.*wEpp_+)""""ׇR6H%?nǺo}?k፷f;vڵjiԬQ> cA>u.lfO+IOO8a˙h܌'7oos?Mp<=iۦ5'gΞ;ml߱vmMh>y/Y9}Z:777̙f}abBCAz1l05W,SΜ=kg&NϜ_L#`[8::Z'OϤ 0gfA70d@K>O?N<=EmO+Wq^~9w ' )9i>΃S&,;UNڌ};BHQVYKcPjUnׇ֭ZZdߵKg,[NllM7ƒ7#<(U;zuj׶ic?XDEGݻѳG|cJMM寿7qcyrpp9>{E9yÆ G,Y]wM4f!Y/kܹHG_2ÇYPb{~oӹ6l!ZϿ_:uڵj1|(-Yʾ14nԐÇY_y{]uY&L=wLݗkYIϳ(װ(8?s<NNNkӚCtTLsƍ8p/ **3 ^~n]:b_'{V-Z[8qؕpPSa">3?aC3) ハ>9.2*#3녙7㉧|LH|>#.nח8pMkѵKROJRR䯍hӪua&ʕޭ <<-s8~"ՙ8#Gpsn] /e٣wqQKxx8vGf 3qvvf{b6 ?~m.3$aٗ_8$%'<233-E:L^Z4擹g^rgΞ姟Wqk>G7~2&M?Nl[J_V-[2徉tԉEKtq nTs6 y0[xgiղ`QҧWO3/aToeϝ$};gC9x(ϿϿ*U!!nV͚Ů0 F1ݺʹGqL{:u᯿62j...LL&]o̮ݡ,\|Dڵ}a{fe`ǎ{6c__ PX/Ǘw޵n԰ci޹k7Dz[5≧60|`|ŕJZxyy߱sWufsrvIr6 &%%xR 7ƺcߌgVnءT*HQ?CÃۇ>a-KxGGG<<ͩӧ 8"(-0׷uJ y޳!<⊍-nfe`yEmN]Tǚub6>!șF 33Ͽ5j߮-]ThvIFN*yde4lPǺׇȀ\ԓ>...za&Gyva구Y R_ KGv(:{{{es\mmֶYgϞ&|, --xص;yp1/`'NI{N˯1eҽ8::z/Te>Œc$0 syj>3DcZԴ a٬iSV*m@V*$$$QJSUjs*wwwjT$+)N_\D;{0 ?~/bHZIӼY #Ya6T&|*g-SI{{{~~}5`vjj*֬e]Đa&33K،ʨV*M%{_L(CASuj|_F5tɭ?={Y_xikMYr(,W3$&&ZO;i0(kEp3nxQԕƢYJ9B\\oۖsrr" )OoڌO<6ݚ)_==<| ^U\}z,pmTjpYZ4ۛ*B Vu#lqqԯg n\\DI\|re8}uiIɤ[6ŵw~233IҰA}}DZ5qvvr!f3 U0 QjUZwtJ<2BQcuG~P.^*iW3LFF 3,\R c#VjG~k8;;Ni3a4\]]m~Oص+ϲں7u'GG/!Ԭ9S.ލ4n#>%v;t 8b\Qf u-kGO9Iݩ@bb@#L}p\;lOxC'Uc5ݷggj/{mZgpCǎع-.V[j*ݻ_GHHH0 "X:|klޜڵj's4p.ά^;7f' {"8ggV^^lSV"YڴnM9y3UV\d$k~իӦU+^^^|g p+v,[??_Bڵ˧Q?gD?Ϣ%h߮mݡߛi6IiIEՕ9iU gǮ]4__[Ozu1 qqdSIxzxпo-Y4sY gr>2h ǎ1$ @LL ''BG_4mҘUkhբ9uYø;G3x׹S|}|߭ۈ>OvԮUWWW~Zg_~kYaɿ۶[oӳGw|}hެmZ*,?p Y,5,Ȱ!xh\BڷŅhvQ[}!""""זRO65kDEGJ͚5 ZnDGϓiΤ{9KvHҪe w/2-ԯdzO=M+r&N;u2Kx{ӸaCvJ&L⇅EdddP^]6fͷG&,(qcFpRxg6f>E498X'6'.Xmצ5ަ|`@7t aɲQn1*WVHKK!#=6[1|l>d2Lt=uY̺84lP'NҨa}};v&ve?n /`ƳBǐtڅo/o__~;7ժұCH9;91X6ٺL*WYP75d,\/Gՙ8aWͫɕɕzmUkHLLd=;rӠ|}' HҀt zXo|Er^ϿD8s(DD2Y>#DDDDD.>(%%>'OHWv`lJ"WWW~[ø;C(W^zC J-[߲]DDDDDDDDʟ>"""""""">"""""""">""""""""Pr9_VqaN'1)øUu>]Êo]ue])mG@LlܱnADDDDDDDD.`$@dY#MS8>>G=LZZZY#"""""""rrvvwfqu+ȴ&?[͝˴.bMJKKSGDDDDDDD3aRuv):̎8|ףUۗyJ;wgu;mZyۚ%"""""""RFGtHi[I2k_Rri\>IIѬu㊭c\J5+"""""""f j6FMyuw8$};'Mz:2G;]fEDDDDDDD z0bFU!2ORsңfOdj\*YWRҧ8^xn^eb6gus""""""""T jĬG橷>/pJE'}31X+:*@JI&}MeِewsHLLݣùleqss\#*BݻHGY+K#}DDDDDDDD* @DDDDDDDDJFT@W&飬Uӻ`<}lI0tkwƘ<4AG0x,C5}1veSd>0fANWK9 S1&11Wh?Fc<{S¶`Y|^z$ƸA+j: 5g/hƸ1x:ね7?,Sg1lSdo)SZ75wZּ}EU٠k_8L9\DDDDDDJ⪙U4O``d=- \u~?_{-ɚ;…ӗUn`2Kl<-!=_ m7`6 {gh>cBXl(w _0ktVšMX :{Yicy,mἮAyWJT4Ss./#-ۍn8LLB@9@m˾`^f^^e+҇v/go]>1K mڧa{~_?잋ϙLQ@gKgLb[ao6#Ֆ,Zn؂uyѵ|p?23\?Bz$?HWsH).>T2%2R*OAR)8aj{x@j<މdԾӰ-e{b+ܛoϭn30)k*M|5C09{bYrq_J1x:N?\Z6u ,}u^bLX1*aYU>ud¾siL'A͎e IDATv)\ ѻC1ad#{auY wuS û1ލ0q9`>ZuW8޻ĀwkRB--JŋwwRww,q%= !|rfffa9ʣTg#cJI=PwF+1!B!>-)ၙRt~Z}R|ND9fA8gQ Ci"nd) Գ QW7C: oԙPrG>M*G㽹'cAޞoo*QԍQUV/RԓPwjn(r㕭4JoQ׵Ag'6Fi uSZڠn톺5م`a.{Nz{e*;nZ vQyj A?K2J0gSҤ7oS/-UZ]}F*nv^3WψaI=}dL @i1Nq7jeǣ~we)PEҤCq΋a1~DLl:=I˄bcPm6ù; `猦j_#h\`` W=ǰ`{̷({ +óKQ%H(ZkT(YJ-zc1- |"#ZTk{NRk(jS[Q",Ox_ˮEoE5P53y~_@kay#1n 4}{kK-gt|\Qzpj7s9#MA,y0֫/aM+c/*]JYQ&XQadB!B!>M΋c3<c#ڦ}>]JwFd꽃h}F54~ڣP=v>gECW )GyJg*åWP_yF| `,:HW5"OD(˴nv(%b SQDfƼ.$&::y,k/*!:eC%ZbQ~jP\cW@i< P hb}&Vö1ʵ(_ 5u\=⟊&)Ev'94Z4E_.@{5"@[ԧ [)c'|cq'rōv[ԟjcg PأJأHcVTr3C؊ɬ,,54Pw !B CFeqEs{?.(jؗ>I&rcGc/xj: Nh}R cӺxs7v4錉Z[iE/B|iN9y"Oθ<^>5 )E~3 3=b@e)E1?s'P+UEZ#4ViPF5ŵ87Mzbf쌑At9Š4](Ul <18eC {gL x Jƨxbz(I 16&X疢^`c2z/kթ2KE^>* Q^k>tՀzz ]v4-Ynob-y( ǦQ2B}s7DN<ͽPSy>[GDSV_V^A#hQ*3 MPږø4P.?q_/(E܄W41Lb}d 1s"=p W5GyJivI~1> yuQֱq̊ LzBQ5;Ģy}TGP^'rX|F,]z}+zPm7PMAz%#a؋*7"!~,5j ڀY>šqJ!B肍)q6!KO>Dj"OΣk񊜗$ϗ6=ӱ}_o'\V)Mk/khRo 5peNBhJQۦC_ ˃C)!cn>Wrk;,ZP7жVic G.91?OP2{w V)84+rl(&NOoR޷c _WQJσ5єjqNlh*+phQ,4)V(jz3o'硸GSwimQ4:B^g\'m.kpchmP 7FSk[˹w%gETgQbAU_\7*,R)ꋫd|✕1Gc&rg]0^NC{yK^򒗼%/yK^IHiH稧[ۤJER`%XXɆ1lgb893 CAhs!(d,~p#z({oB1>2K@)E+St!MC[s8&/zA7 c|9l1=bpCB/*|2`_$_@6(4uǘz'VJhC}rln?0%{]pq jdJrht@of#SN1x3>+cA u0nsH:nAa3+Quh*cam^PwĪZ԰@ ''Oo@M? Kqc@M(k3U81nD9=M(nCƂhtD}|CG'e88m˥} P%O5Ox] E"΃u m`Vrgqo> =AqȌ:nCW.BSsA}qM(nЯmḳ E}x MEA[o1x`*pbV庠;ˁXЇǪNBp|GL!Bl2xݻL>hL^>VdJmA@kִ๗e7msCME[;4{ݶk,h*RsӋ/eq(h*b+L WcO,y V]wmݮh^qN_G=i. —}OhJBS>/o;4'O} mXUe}T[-Z6_h|"K V-BhSݝ[wo4ϡ-M&0<~uK U)X#XevBڊ??}`}s%%t^׶V탶cWЭh᭗yA/ _X m#jKT^\OƵՅoLogtzm<WPCB4ŚDg'VBDB}QX5c=KK"B!B|bi%i2Ź\kMgz%WV_?X:uU?y*.EUG!R=_Ϣ?CǓ !B!So|sc3>KcM$cK-Ohę޹cx׉+!}o'@ €p@"^WB@ )]!B!a 8<0i&rB!B!B!B!H>MG>B!B! B!B!HdxB!B!D*I>B!B!B!B!D*$s!B!BB.!B!BT(ك>E \{KB!B!k(-d}xW/j<<]roF!B!< rt5Liϴ,(AܛB!B! S.زa␔FIO<>a:C'OlzUroV!B!"Qzі [R$97nц-ǰLbB!B! +ߍaҐTO4bF»w;|M !B!B9E>B!B!+E>B!B!"yIG!B!"B!B!D*$A!B!BTH>B!B!}B!B!R!ހ`޽{'B!B!>]Z͇F:${޽{fv97%B!B޼y)?JW%I${*(8X>B!B!칸H2B!B!0#A!B!BTH>B!B!}B!B!RdzB!Rkolj޻GHH(2fĽxQ:wlO֬YRzB!"}Ba׮k/V~ΎGsQ<B!gD>B!ٙS&bmmmJؾ-:.kBCCMj!BG! |Y'UoIun?-ߴeM1߳w?5j7=zvogܽGHh(LAoiն#3+UێXWҤYk|ӌy *gΞskؔgܵ;u4yL</^Rf=;x!GQaS?gҹkXe6hLPPL!Bd&A!BXHBxxfux~*N>d 2~Xi ܟRJ2yt=~b{}.}{e߸1s}:~;… [_RNoڴn4i?v4EƗոr6oe҅@`@-5!ޗ,NzB!X4i0n4^^8y W^gמ}/S&d .R #G+7iZrd+oEʗC(QɋL#]t\zCQU'O}J. +ճ;޻lYRB!Dr]B!xoy}L+-"M4,Zh4ٙDhښ04'yllXp<|DCpΐh,/ǼA֮EhhOB4_%ZI!s!=}BQgJe9w)`/((SW-'N!Cz` Լ|^ {_??׫\B!(G!{I4C12 |WH%&$$9Oz2~]/fʖ)EfWפB!D>B! xʛ:k#{v߽s}{2V vM*ɖ5+͛MC2Yf=t 6n~2ʔ.E̮ܸy'SMB!>}Ba6Zg~voH6 n9s2)_6-y C`Sth߆`tٝ92~ Ǩ( U*WbϾ^J2V!ĜuP8Kd{}aXj{mի-S*)B9J,azB!R /QD$+oŪ5qw>u⊿dH[ 0 #Baye+V}$$B %BaА'GGzyrJ* !B$H>B!H6-GKj!BXLw !B!BBB!B!H$#B!B IG!B!"B!B!D*$A!B!BTH>B!B!}B!B!R! !B!BBB!B!H$#B!B IG!B!"B!B!D*$A!B!BTH>B!B!}B!B!R! !B!BBB!B!H$#B!B O}9J~hM3jmH]Yh))]7bGJW㳴r:lǗ3}朔Nz@zU1zz9{>/^Rf=^$m7L>%m)?,a^^XbUmն#+Wیs sCݞQA2#Ǩ^aaal*=$߽wgҾSW4hLN߳dJBCC>{njeTYKY0x 4zzp)VgA4i֚ZѶw,^B!*+yv|Q^=`oσٵ{/Ϟ?ga)]EwߋKן)Z02O* I/^Xb5:6"28-kJWɹ=yrBc aيո/NwhPY2gV]Ͻ(SS#ʗ/˾}[ޞ| !"i}AOyvؕm[ҿ*ڴ)X;9 ֖Ǐд7hz=berF>Ƕ5aaaؤt5\mS .(W +.Lmhք^=*խS {X͋/ɒ%3ypCh4x>-55{_N-Z6oN]B!D>7m%Gk{5իU1ቭ _|Q^=pj׉9q4k~ņ[ظy+aaԭ]^=DٻISl<&O;w+#g̘5Ç@Nhؠ^;w!E`ҳ;y6?i ޯ[&+W[./_1e ._s_TEoJظy+>>/Vz3GS.YG#w֕re˘jۑuj7X8@Z7/-o]j|Y6K.K޼ypKI=&Z,\ /Fҩma>sp+Jɗ7OMlٶ7@2b}N /]fUܾ} o^۷>,Z .Y2RN-: IDATڷm6 ~߰i 6n!00r&?K\[50?qT=͚6]V$$,,YssChZխM̮: }K~_6`L;*_T`֜\qsgp2N:gqtr\2ܣN?G:},s/Wq~XrZr.ZHڵБtzj|Y>$mڴ>rc'U(Z00}Ϝ'.}/z#_}Yݢ+8|>o}Ș)#<&O=O*TQ#ZN-{xަ[_Xjٳg37t(lll5b(`ysf$ͤ8w|x]nڲIǠ( Ϧj{oώ888е[Oʗ+Oݺƻ.Ό={wLm7 jxށ;[ /(U$ivNc{b>?4P1 z`.2k|<}Fyۻ.iִ1;vbq{Bg -6%/!o޼wϗCςxfe ̘=jU`ЁaƎw}.zvg,^;ժ~'"ܸy ME245+`eeAU4t$ХS{g3p/[NSY[n^̚1]x8..-RqJ\\㭋':Q#@tNpRZڷm? /#$$aCzꃃ=~..˗#y zvΎ56K,_<WL炘1k.͚69&OMpyAre2?666\rׯ_;>gqtt,_`}![HͩP,W^ciqXzm%"5s6*g\r /o^*V(>̙=ߓ3GvL˭(Z0W]7}\ ^3}\F%My{{ӮM+28džM[8xx@ǶG3w"ڴn5cuhشe6+7Կf1|@*U@_z2c\֭^V11*N=7wnڧAU0x8wޣcϗW}'c1}~D%6dEiI%Νm-;9L<Ŋ5W^N횄q+kk^+;ݻO:'7oy;:9p,C3ּ}C_✁ knCXb{>yVKhO&uܽwM |\_f E W_Rd {^Fz ! Ȝ)Sy׬߈5S''M4dorYTd[\Yz@8u,eeXG|ɑ͂>USԪYk.T @ʕ8u,ǎ}|ߥY]TDN]9r6mUaqtNҧ?ޯɔ)#'N}/,Kȟ//:x+FAu3tp2eAi֪=8Hu9},._a?)R <}k3tSYYdϯ?>]:ӲĄ1z0nN,ZBpSk 4.;=[V֭DXXsgM#]8G/EsKelڲ{tKpV^K*Mʗ㭏/}ԂEK)Z0'5W_/ן2/[4̘=>֬vLǡ|]u|,kko6Uk׮sx>o}|Z6ִm;~g{q9jN-O~]WGs}tXT;ZCΕqy˜LyOHppi0rxOM͂UT7evƍ9'i݅BO>۠O鰲+Dy׶H2dXwh_lqtfcmv h3[0_# ACIDϟ%+71VvL_M{Fƌ.<NNy?|||UY`c[ӛ?f5- ~m $8t۷fC["eȐ{^^1`oj3$~nw4iؿ{򕫦f]EڵgS)]NܸSMm31km`يզ=իjΐ>'M>Vbm-|ѯ帼yc\?y+Vڵ"lmm͛7Uĺ}'xF|*ѰA=uZږJRikܩʑc'(])`]Y\N2(^3fʕ)^<{q tNGڴiY+JNǰeެK^>ireK5cMM,?o߾%}zm=<|Ĥ)i߶u!!B$ X[[ShΜ9ڳ{_\t=NN8;sX>>Kg (y2 F3.gDTu`+f9mڴȟ+WcSϋŹrA wS'N!Cz`{GCYr~̹ $,,  q}srJ:Ԣr4Ŋ;#BI}Ɲhu {Qp!ʖ)ŋ/ -+S# 뱶)[4N/r)̫Wfs:rEJ8&ͥW "T½Kl޼yӦM g!1zE`̮fΔ1#666Ν1Q8qʢ2J}ameE Q \roR2"S;_Y-<.I͒}ʼn !v1Ӿ ΒYL)^yù,KQ>d ŋ<14->C :.!!!nɹ{]E8n4{˼ّ͖/_^6oݎAoP~ct(x\Tvm8!,ZKYbΜ@I\[! ϼ}wAA\^b-Y;w)1Yl ܼAxxc2zCG lظ,\Xi :SϲmNf]@͚5L="6ivnyxgI\K`䨱۰s/{~{bX+++>ܹrѷtΒ@R%Xj-ϟ猝09Vϟbɹ{|vcYҥJ2v6mƊUk̖,Ε(VYiYf1+RNdȐ}p-<9{;vv3i]Jʛcqյuyðc8wcђeښv]gy%Bkc̙0fJ:hӪ`Ccƴ̙1c'bkkCʕճ{J#5w 7'KthlWKiIi3hӡ 霜hX*!ZH )WUR܉O[Շ9BR.\D%h=#u0/ҧx` t!eBN/^bpwvmZ$_- a ^(ӧѣ,]R%~B!})ښ7nu߼ "Stl߆&iBXϏ)g珽=_T=tBTM>:JWA|30v%mqݪf͙ωSgt*Y޿${m0?9z{@U)P ??vB"c-t:rrWp/n#ϜÍppaz|׹#Z6ɎB!B>cG˗Yj"\\w֌}[9ͿŽx1SzΜ9&O\(<%V`ooO-q؉0?Z6֔o1dʏ]֖^3 OAdvueԈ!<{cd;FB!B!>E劦sw8uƍNmk_V3E6K(W +.LG#Gաwlڼ9W^cQT2ŋug7mZ4iҰn2dlJƗnߙm;v}f̚KfL̝5kk8۱Xp.2h߶5u,B!B?-%rX׫Wަ7ӼUXy|ӌ;w޷jۑW2w"7kE&-0y*!!!]GQf=x%k3;_7y8x мU{5m0 f]xvohԴ%S$$49TX1|Mܽ(/W֔)SFrr3meeeptt w.7zx~͙siӪT5N9G%L5$<<֬@]UMfa&pB!B?ym d͚ߴe;VVV,?IX&)hf칸8;3|@-;ΜWi՜fמ}u_o1 GG8z$S0+VF̜3?) oܦaaa(yg4<|^eY<|)-G n߹KBcG_0et:6[LIosn9{Ho9}h4# [q/^V-TZ(B!B$>NMM?giӦO -k^y:&rꚉE>n9sri8_;Y9e˖Ar]SgVOCMukSf Sz*ɔ1#!gc;qlٺ-kSԈtիUy>{ƚuLA#%v ˶`RVL…Ф`B!Bm}ʊS'*{`RF?vv"VKxxxRU7GGG68:H6_2c<|:ޯ/@|RpAk֖ѿc̸tŊzxxxZTs4tjO̖E%K)U'OB4iptt 0,^'88@0~c*)Ih!t"MzH  )"3jzۦ+C8?./OOCL\z//O -oM4iFܼyma@rI5n<jU+[W6=Ƴ WU3stp |=v//4?ʈ0x8IIL06\9ٳwNQC8deJL}-4i!Z1L<_d̸ ѢYS:u…ش;6mĄD<""""""""BLHH&GDDDDDDD$R#""""""" )Ʉ,_udAB-7~vqqƯ/ݻ|+L+X'O|9…W]HZ>=7nl?E`gggqE?/ L}x|9v ,26IڧԪאZn\rCV|5 pqv&GXXXй6a \MڝSEG>z Exxk7iOII!K,xxb-]#R '''jzX6nWHԱffDDFra%vd$x#u!""""""">x ruq̌pSw8::yȑ#;ƏM[aK@Y{1}\fΞ073iF4m҈7om/_H\9[&-RNۦY7x""""""""{zVVV_wsVt^"##ӝtܸw3w4Q*U*UrpH~wln //O.U'Nflܞh;}Q2l_LBJ9}Ki8::вl ={}BVK133YƔ/@%?hZ4#o^obcpY,,,ܩ=[c)W77W^ʻj0etl+T{{{9JHz;Ufle'4=aa߿4v<L!ӆ>0|@,[۶윕vmZѾ]kWWfMs3}lC1ffL7EKvFn߂xI#||1}qusAtV~l|ObB"""""""""BLHH&GDDDDDDD$R#""""""" )Ʉ,_uIHHFw;nln/'ʞΥKiA7}3of͙ύnRȷGܸZc!c'ƿL)Ǝ X~#ׯ͕4&s8ye+9u4w噛vm[Qb֮ȲT4m0MKdܺ}{;; pΚޝ׋c?q;we˖a }DDDDDDD#S>!W0k|Z4k++.b_0{Tqf̢SvՓNJ]AiѬ ŋ̙̞[[[թ7([ukammͱ'5zƍ\2u7ӦϢqU8M.[Nȟh<ݻ?0?E޲^p4i˓(IDDDDDD$CODx3M!G2xHnݺMlnqիVaQQQ-[I6ؾ e{7OUM/S01Yq(_p~ڶxݩ3g)Z0͚66=[ }O2 uwσHLL$]<GO<n>%K7$&&RZr-[Add$NNNl%7o"11d|\x7jJ&O>߰X<| bnnnr=MȄy `0bDDDDDDD2L8:8| !!Ѥ=H:vn:`8991et<;[[V]ϡG `0b2oUbccٸ{._# ԧSvOt=X111XYYnϳrpL rB@ G ?>@b߁3fffDEE\m̌MѴI#n޼Ŷ0A rnex BaB+xy~Uedy+R+KKΞ=gkkkHLHDII񳵵5>y;;p#vwF$88Ha?lmپc-&&} +LDDDDDD$OɚՉmZ1{uR%J`0rO2vH(Z֬Ha? 3#>.vƹڵi)^]od)Scgg_BsQBBгGW㘁CF93^}xeϞ}@qqu7ښ֭ pY:ͪ500Iㆯ| ?thךlX~#o"KV1CgҔih[;[j֨NF AʌYs/)K>1rX…ش;6mĄD<""""""""BLHH&d HOBB5jqgL_ǎt2;w}6=U-;cX[[?rܱ'vQ/\ >.(Zďm[3gZE뙜9s93BBbZN͚-[scffƶlk }3= |DDDDDDD^ oϿ/cnjn,\(K^=XU3n(_A!߂ ƌ5z{T5-3gY[o?rkרQ*Dޟn2.$ ,}ǎ`Ҕi )eJ1llll13M15karE?>KRDDDDDD;} \De<ʒĊUkhӲ9NNNdur Gvw3_jTj2҄(WвySΞ=ǂ,\Hvwwi& w h~u760GDD0kWdwwP]}{zxxS>s0jU+NjTT'O(hNV)qtpD4kՎ~A59u,EY eaa׬9=ǎ6qqq̞ݻ&9r{xs; g 9::2/0xM[ř)?5f!III["""""""K}pM74i^ AVpY?8d~[$&&;6dqt2g/G续?m|8+ , \'NFrJ III\wf}y7iutgQ%L?*UkHQ_@jQח3gQvMaM̝H )[TVBGi >'ÛAȞ=Mʓ͍)S3|@=oqqqX>H^xDFݝ>zbnn8t3B9Ӷ]/""""""d'4,IsjO:Ax֖ksg;yhݲ9N0̘6 #=w%Gvwlll3nB7X=ƳlߖZGk_nɅص7$x# jCll,|+qttatyR7;wg⥌7du|13bbb<w∏'K,0z0ƌ@(WJ*rZ׬'44yckKy IDAT,]>6m?0i ڵ^Z/>< 8cffL @b0sWO'&&>>>\tH9'۵G//oZtW^\9ֳ7~<r\rH=ӓk^7 kCtȫC+++a篻L_v{~pW #9)Ą=`gkTu\zܹMR ._6'8K\~z_~e<`ȷl.Uvfv<{6ZlƏ?m#884ݹljț|6eɘcǏ pC &}ffxyǩgAc8xSNwrr0o/g!#(S$~^_YDDDDDDС@2l_LBJ9}Ki8::z˔//O-ª5(R9󈏿ԡ=S=<;8w}|@ctܑ^gO9s_!#cIjբG}>&pwFXX8&\Y*WȔӱůP!9|(!!W٣quwm.{R_w_;[[vi\]\ g?ƈaԃK(f2Ǽ| <ၽ=_`]ʔ.eSN-6lLAhڤ!f߸Ȩ(ڱw00Rm)ScːC >d KmqvJ6h߮q̛ozѵsGoL෋-Ȝ:?LERFu4j` TfǟVn7ɘQéRm u#>k.4!Gi՜?n{O>r o[#ǻ83g4{WWJ(N>.Ǧ߱i$&$ᑋLrJcM^\''G֭DDD.,Cy666\Hݳѩc{Z4kb2Ǜ)_N pbNIws 5_7o0vD!p짮MDDDDDDEx^3O;۵m%AOG)]J^7Yv̘6bErDDDDDDD2QX|B,M}CsVFU  HR_czhd }DDDDDDDD2 ʑ#;vׄvdB }DDDDDDDD2!>""""""""BLH9?G;cX[[r^[!!WXz-'N"r0 1)&cR &N'y66ϗNRHt獊UNDEEp^^EE1}~}/III(^>z+_`ނ@N>KJJ йS)))lش_w /@A >%""""""/ht/\dyӋ.FW^j|q/>ЖH̥Kӽd7 Ho1ݻ~u2;wc0a|Bbbڵ?sgŅ]?kDDDQ~:}_I;}䥫RժV`ĦcnnfOxIsvyLΝ۶ӵsGMeǁC9zc?[(R؏۳yh4ubΌ@bEhи9fM%K/9Z2[g-ons }:L%={ KK G>aooGm=r+U4ONNq4_:9f!;w"22yӋg^"""""""/&ٷR kkk9۷MB=A<K14t$/]Cx;8d ˓o0ӱԯ[ݻ爎60?ߨLRRDFEz: zd̶wp Zh̑[[[s9sŷȚՉҭs',,,X8{{{Wt9 *"""""";游8f]@]bc=t| 2d(N9k_ݩQ#X<ܘ2u:!!W ˯&..s`ب13~|g˛CGӶ]{h EDDDDDD^>QQQ3jz۾o+""""""'B{~~ڏ|<37Ŋay;{s$'acck=:E&&c||.f괙 x/>oAcݼ Mϗׇ6gH}93<"2vm۰xIS-pQJ8gAn||ؽ+vy.?DDDDDDDDD2>""""""""BLHH&Z> RVƥKvR Xr5fԬӀa$''R΋,;f-۲8hK]y~T!!WL AVФykj~R}^. ))OO pE 1h'  ~|36%T,f!-[o]L XXXз n*EDDDDDD2)[-Ϝeڔ+Z^ZZx?ˀΝ۶ӵsGMeҗ@4n؀-Pha6ouWQHw>s}N)%QQQ&c._I^>5n΀`篻=v<UߩKjat׉cw[SIs_677+jv5|Z[N]ٷucCV]{MZ?TtٛMw]:hQcHJJL>͚-['N{ժV6Ql2ɐ2N0|2|y}1tQQQ]-!̞1sssK֥#*:sneӫ'ӦbyB,ͱJwgr]ʗ+d 3j֨FF ٸ;5+T`00et>ٍܹ=Xr?r Db 2 UUԧݟg\q-4yӤM/O/>.C>KWʊ?'K,dNC}>*ԙ-RfMTNNȳenݺ {])I1hӪ95UDb4l҂={SO= ݻvDbt҉Kw/ѷ`2h'<>XXX`a71{zvBtDG{@bb"w>Zw:u88s c̝ȉHyٽI(g77WnݾL)g 7W4s=w}@Ov~~#L=AȞݝի[֞ """"""ߔwQH4DEGP;Ʋq,]GGG6OLBɖ I;;[[6k++q? 4s>|Xթ&0y^ߺMV^?#&&u7O||<w∏'K,88c0x}LL VVVh?С iqtp̌MѴI#n޼Ŷ0A rnOV!߂dx[ϥ~kkkqsΝgiF\faL%y}>[ׯ 1)O I׵G// BaB1Wɨ2]~|}~NCѢiwgufxyy`,0m$Ν0tzt @~ڲ}N111_j"""""""k`0iڋ-B?hoLtT4|K!߂ƷlM:;;[ ޞGrήd )-^1꾮;rD:(~'O~]-?+V`MTP\9s8y%KKKƌ!#3l{ [cooOc^~ښ֭ pY:ͪ500I/>}9zl VrL21fllP>zv[ cش{A ([7ڹ#7n&Edi֒%KMȚu~go>ѕuk?wk}BCC2SRR^ mZ`՚Owbmm̈́q0}bɏi7{Zl``-DDF[S&MU&""""""{_3R2rGD?ٮm/ z=JR%U""""""""/Á(^ɟyEK޾mG^^թpb8 H{?d3}DDDDDDDD$} }DDDDDDDD2!>""""""""BLHH&GDDDDDDD$R#""""""" )ɄdB }DDDDDDDD2!>""""""""BLHH&GDDDDDDD$R#""""""" B^2""""""""PlxUX \ ~K<3[[[xn^xcnnN_2""""""""#""""""" )ɄdB }DDDDDDDD2!>""""""""BLHH&dHII… ܉{K<3[7s̱G慇>.\=;../z)g)/߫.x՝8>"""""""suu%ΝW]s9+ >""""""""BLHH&%"""8[Nnֱ p!Wa[}\tExK.snڷk,۰srJ_QE"""""(G gƬٻD㣞Nf-NDFF˯HJJJWOxV3g5g>Nښ ]qttd篻=v<UIݱWȗ93ˌ}^cpqv\9 _|ɭ[)PUkA…I ;[[._IpݳǮ^F˲Łuƌc 2ĤiKJJ2FO/#"** %883P>z2m,-+++fΙρG7\yG0S̘: &Ot7XZZ>ѽ* 9c>O^ZԨ^Vi:?:?f;S 7WW,--#GƹO9K"iִR '""""ϋBIשgpwf 9/]ǎ}R%b0p },--ޜ:}:k>սxX>߰X<| bnnwtlO6=${UQj(*"(. ^^ **{J.R-tjz۾1%l R|>prΝ;R6B!UA>B!*#3RcccؽwoȀf3&r( ݺv.|1AL:u$-{;&ya$sqy׉,~H2235/J4h,{- IDATk>QQQ b&\7ڦB!fB!DPqqdfeZ]* t:dMKVdZ֛Y{,x:uhC{L?hj^S.l|[+Gxɻ,[B!N}BTvm9zͿ,??7ls:\.oкu*K/n/cFIk,{-3zH;IK;]{]6㇒G9OLL`+hܸCB!'Dw !"sE֭x`L~B!JQx^zy/}Mxṧk!v<NÝOԋgd+l6qN^LtP&Ms /X۴mۆW>OYb`0Ъe ~р1z5mAxmgС};C 33mƃl6z|://t̴3,B!)9zK4I-ḱװpJ`-)Bc!N y9v,~"B ҹD'EK.v2 8ET62B!B!D$A!B!B:HB!IE՝2}՝!BSBZ!B!BAB!B!$#B!BQIG!B!B!B!D$A!B!B:H>B!B!u}B!B! !B!BAB!B!$#B!BQIG!B!B!B!D$A!B!B:H>B!B!u}B!B! Cu' L;\T!B!6 3a 1NIA ?Sy\[IB!Bc.ZjY9yvEn]l~prR/\Yeujd.G>B!B!8q5as՝jU#>B!B!HG!B!B!B!D$A!B!B:H>B!B!uP]!B!8]nF4pww&}5'-}\Mna1l4v^:ީOz?998QB!BF ZHC\2 oϿ X~8jJJ|.xk!f?^㜪>ͼ-.+TųU~VYmW\e=^-]CXXXu'Q!B!*`0Ѓ;eݯF.2MɧKyGINίTUOqr3Z8-je|ۇ99xu(R)B!B( {~}ٱk??ӣ{7iIAUU Z(JXb kƿl+1EwP-heZ'~R:xanplJ.|1{2{|pntvps=v<,_4-֬3=e|͜ǟґrp:={l!B!"#"(L϶L._u #V^w˥#G1+2m{/3al)`]eW^͛o/:E߼fظi3w}C.%#Fqigw3`%dffw_*e,vc z)7M?6l X>`̵t0F^q5f$;;|jd7POK&̠qٕWȜq8aMS+>ڶe+X[ 3d V_/~eȠeGsp{x<ȣ<3 zM;ؗEKk>u YYYL>iV&t#7>;v rF!BQl6l6|rۧmTU^M'ѣ;><\:iiy̜>iS&::ﺗ@;X[f͸ ^M< X~';;PWL603ӦҺu+32{XVV^Ͳ+HJJk#r6֬+G4mڄx h Z.wL&Ar.YYKMCv~P~O Z /B]xh &O^%AVӻ[y9yIEY97AD.o/wn_@8 C@*c &:J֭Փu?3+fffkҬiZl5g՚ 8~Y;s&tݺvk'qMOuV !B!j E. Xv\JZ76msO??=:{0m=l߾ssveΝ4kڴ]);'>W ۝ -NZҧqF̟2>8dbwx˭cLt4{dيU햯Xy-5s 7Yg_IINXzzv > ԧel۾m۶g222ݻϿO6B!u`gg'e|7,ZnvH||<ǎ?:|Ǟ|k_ϐKF0a$--pxƍ|z<(V^ hu=V>yڽ9nؗ_FNN\>JڰqqqOϳ`ǎ]hќ-[o?z73KR:=_nҾD-}@kfs? f?ǟ.k0t@fzLrsعk7'Tj?F#QFNWؘR銍&3#Z['{U !B!2EQԱݺp:Y]_z1AtezgPN?@Tt47xI&YgA|\+W!#3tرʎdڵZŲa dY` !B!OF q={hۦ5ڶcm6lHKO!B!۵{ '@ddٞ8tph԰!:vy.Kukhjقe+VeO ~8].L&sNQ\n]8|ƍk0 r7"uea푣GBJGy:u``Y3\V;ԩ#gIll Gc_0tȠu Ȓw*qq̚_Nͷ=iݪ%_7pCtz^iB!Bn˯p9]l߱?]9g*5Nen pÄr8cCfq+HJJꫮ`yIoBqN^ Ӵף{7|,x{=4&6[3psv/\Ő EQl-yϖ~AzFQQipCv||78].RRz9w/{?bt|DEEҵKLFSK D*9ʓK4I-ḱװpJ`-A#iDe˕@c錾f<3OB!BT;wѺUNIYw{Lha#]:w6y{ђ˯;m_bcG|No?xVg/ {՝$!B!uqfZ~}ԉOUH/~WbaoPͺwJe՝q]_̘9LB!BO>O>]6Lybu'x쉧Hݿ墡;9![ٶ}{+:FBz<5+d!B!Dv7ps9W:NBlќ-Nn gQ]B!B!eB!B!$#B!BQQL!B!B>HK!B!B:ޕQIB!B*+85'>.PؠUwB!Bq-k$)ҽK!B!B!B!D$A!B!B:H>B!B!uPȹ_lOA|=sSTNZfBC;'J}Uy.&6* UWr|Vgp>KX\蠕C#zfmP{d_yzRaaT}U)f" NjSgehM_=Qګ@t*=\d@='g[A:$ɺ,c 5MCn69yTQ׮C (è>>lpWSpgSfy+B}.~yċih1s$Qٽ;hm7pVr gyoaMfa^9uny؜_\ٻI1{zN>T^%9$NV}Uy.BTz$CH; ʨ z #_3griܵ͊! Q{-õ۬dIwbRc./ݏd)(00oU=iCΉu>%[iĭE N^Qjs>*裠uw#Ȧ\4<ÞIf/cttcRT:|tįE>o6wy!.k"*y15͍촲z81o]ҸKoE(Ɉ$7!ƨ2Nb ^t|i#Z>Ҡz<f,oc֩\wHʿv=l)"è)vƺeIwU-c.+צiaQo:AhI&|<=o0 N^ = ? gMS+8hU%4s4 Srf_b@=',^T`O.߃I6{Yx1_7 j]K$L~$o@_z %L^nldCl.hhJHJq,^ƥhmNXn*7B9fuxq&PKapsgS{]s<}YaDzN 08B(7cS$Tқ>mGWՐ6rm7XNPtP}:{NN ,lȭ|JZŹ'_OvήB=.}b]|qtM@C}E-{[X%aeO *u1f/./=2{pƥ8Hx8(נu$%˥5=Xu]Yt*# 4YWk2!}.{@=O[?k̬S1nZo3|XT~q. ^u|xŗgʮB=,NBL݋ {(uP?dҫuWp^򸬲lc)ſCycIIf/[PsO PS@;Q1MQ姬eIaWdtP.jUЧC"1g.^Ń>F9 ((,JT6xI0!}^){cSN0?dYnD'41qBmb*,LӚ50{U߁EV¾0%W MkaÇq8'ܳHd! :%8U( ixGd *':ޢ0":,?fbQ^h7FEʼnBH73Z>ȳGDT^Li<Uks?f9aP# r H6'ǭ i[VsZԞp> zE}ax 1E,TF$9٢;9۪(`ZB0wF';TvOCnD;K<׼tSpx!%h(c5&<`)wYq}c]\;-)aPƤS٘k` ڙw^ke^ IDAT.t&a^.@Wb纆B~4rMMl<7o|=VJp;I$;Ɩ D_++I=dfc%2xc,^2\#f9xޱ.3Ry e[~^UrlQܾ7׷W࡝5>s\A*342e*!զ۵ZUoaի7{yy;MYytVJFeŵz؞obHSWp*'벡]Ol^d;p|#;p"74Z.%F/)o۽C΢,R-`||͗Cms@8jby2v Or0VEiT-^^~ X6_ a: ]4 0ʔaծ*iR)W6p)!׀AK|z*he>!3ݣ4 Owݘkƒ+ v]tٜg ƨݦ\{YjeCNE5զe`eOk3ݴ]z_hʠ':>֐;>:/ 6.C 7zpNB,/3wDO6´{uy^~y´ (9*.keVKE˩a^k׮ gPg=am [+J=KY`]Q ՚^њcw16Fx#=kWK׮|Ҋ /489ODxQɋEC^-}7.٘kXuG0(ZV f:̷}4xԫff6BK2e}DᶥN0OHX+%+X=UtAo`8lʶ; f! L&"=l54s+*r 4.`0؃FM3ϭpFKi&6݊ \u1c@Gk?Ly@+K.w s*g}^~1-JkQrFU 4ϭ#BWO+kb7ϦE]WfP2q9 L1*` |)jU~Dg3nk`ThCLj$Gy v]Yt*#;9+EQŠSSeCNգh:^V+|]c%ut |[\0-)1YF7c֩{`GEc?T2\'W !jf2wR˥| Z;zt:~E)><\,# FCv:{^-"`R;^榆R6 <@AˢӞF$9Vf_ trWِkZ|-'DdʮDVye䗨*jŗ2䘨]g ϣaRcFPLh;]48F?KvycpV2偖ed0r\:T.Ƣhudѹ-kTa7ԺgPcEL:ЫhYH^x?ǜ NU& 8m#Ҡ;Y]d ؽeJA2%R+nnlǤSٞgK@@Py4WX$yn&aS>%q_ ۤNETMRXn*Ec]Ć0n_:|JsC-BIz-k0JYJtiehVVOn'㋣fDzxm>9n1cPz܁(ъy/,mo־wjb#;"ݼw~WaheHw"!}Zbܤ`e__crEYZ_|hov#~2VF[a{ tg/.-n" j@&߭ Șz:^vn$;-=Vƺh԰j9]T/2%ƨ}Jf5kߺm){YvE^Ak;@X`7%r^Ͽ~X[!6[1; v[B\+s_5.U/QBsJEWGM4xѲwXkl\V_bW^+&Nh3 fYrϽ6ŭBc4- 2%eWQNh7?g3<ߛ,DT`[rJTEͽ:!XBA-c֕uft`Kw.%֢HIQI* T-VcD[N'6s0V-gF|-RQk.]껤u>DTy(VPF8[zS'kk6VNw( ; $JӰrH(;xTiGL3yQǬ N1fТ]S<`Bg/9hL#ce,պ*hC'P9{yJ˻S>g+t6&oP˭PҚRy2+ȉ&)۬)۬iEΔm֓K |i 8v\6fMwJIu+Zz[Q<-/HhPRAZZw(`R򶼲/klkXJ2Z0q>.CO(5W(uܗψvrFv-?ByN|QR؞gf0Bu9;ńvY>`Y1nLc}%_z8ϩ.-—|V:zDT9f|C&r܊%G8UӺ]ttsq!}^Q+e$$vZmx  gcB*$:MG!ǭ/EkZc?rf,D'IvpUmjš cS4׎1U`5OO0/gǺ0~$V숙I&4=JKmMln}r3Y!bsxa='($Xe7;Ph7}b]M\| * w]У0NE;% ע(Bݶ]sc,K)*.8"զUJmCW4Is; YjZjY.:F9+$'; Ơ(G`q$x>VJS;Dp W^1.th qY_&2Cf = Or1S@Rx^OiVHx^>>lflq)Z#ͥN4 lTK%81Unmb\Rֵw/x3`eOk?r=l\K]Lla9nL\$ݣDxʜ,U] !jP/{T=͠zN7SjG()%̾pj h`Bm]C .{IJPu~cP7Bp5PQWT ^+iv]!9q{993Eea|U53 9q)v6(W'? yqU8Ftz+c\bGh]R>*ZgV)hdD-=j&Ψ2y!1?9bX[G-;*՛py)_/`H8 xWw0鯈:̖dRSVⴖlf :)BO}Uu !Du{C>3|\օBN =^_v}|\+?6lKΕڦ=RzS)Ψ$C?ikQW;`Q`e_U]cB!&A^J #2]Dң2wܩC6sAwN_݅zQ_ 8}M]>:QQX%JDZeK@5`e_U]cB!"d]|j_.0Qˏ3y((c井ǎ*ǥ*S4moR*ԗ;Wɲ*1!N!4':!\*'Ӯ !B"5K!B!B:ƶ[nu'A!B!̨usD!DUc>B!BQȋ'O)H54Dg)ҽK!B!B!B!D$A!B!B:H>B!B!uP <Գ;ui;ބ7OD˯f*}@Cx]諮Zkb?yiҬ1gNxy?i29|_w-O;}|6uҙ0:o_/xiݪ%O>k*B ] 'f*4:Lw ޭ+7m&==zOkNVX+U_lc5j}?@zݳʏ'J̵r!, ޭ+6n_NQjOgϬ$jvEbBBr)˗IՊl>}8 ;Ç(!ol h׶I[8NL_g>}#lʽo#R޽gwvNjs_%1!Fc}u)oUUyi9\9?;o碡,vɚoQԺϪ5kykb3h߮-wq ?yp\thߞI7MyfZTs8+z=C$!>Eg+yyŹg^4n3z5ґzM\4dǟ|;r~%}%""JΝ޻q]\$:v_Gؽw/Lj~&yw6fcěЮ3gLTx<Z+WMF w{'zcy&}Yth߮on3ͷɡY&xzt_g ?6|^>zŗ_/5EѺUK&|#͚6u(&^^>iieA3_a}~}Gs^{%7kZ:٬X 66frw {F]6ǩ(6n[ cN ZɓhҤ1Ym6nLfVI |F_yz\.j Ssٗ˯yGYg I(4B+VrN^>, }ml߱䣏оPʼ7X~=yy3>sޒV*? IDAT#r޵ #G fݫn9sQ^zY nE|ÏdfeP\c0a-{yhes3{TzZq:|O|r6o_|?x<&͘ߝPjl۾ٽzrM7_C-6l܄aJC]3}ƂeݯrhӺU =#Dg2t zu JzEl/AI Yb5ǟG=1bإ;u:_{fMg&je)ev[&y4n(9a?t)^ϫ/=OBZtuo|9L>\:΅'''C}֛ +Z=<ٻ'^OsTWOC}4ڴnSOKѽqѝϿ.;oS0R@vddf~enqڻ؉V}pZ:=og0 ɤn$<o'a-sko,ӥ_p1hތUk=waQ--a^0H굻 n:^]سqy3眙̼;5i\ϻwD[[ (ym[$o<dq^Dػ >^,;$}^ժ7O9tq*LMMЮ 11yqcd :}5kxӭsG>z[ ݻvG$''3v ȕ+Fl3g*;;\rp}}}UN-ņ->>s.RV Kb ָ# D\eq/!Jܼ}P *HDD9ֵFy[ON066b٢ӟÇPꯒ*G\4{~:,_M¦-kofle6Vҡ]k:\͵7ѵ |;wdYN>â~]\z3gSzc gřU_qzt,7V8ڷFnYף4˓hݲ9v6|£Ǐ5}2}ŹM7D6- +<1?N+&OPw"([.TjU<ٽw?11 ~aa 2;[FBTt ׮,^0DBhh(Ѐ];anf9CBh޴ fDDFk>˒.#Bes4e8R)3cYr'PƌD6zzz/_Ԧ{KϟpרSzצWnB"t/YNӳ;IIIJy#)s}GF /ts΢ټ~ mI#r v@=qSg 2]Y"pQlmm]oj 鬰b!0zDLMN>˛W۷m͑c>[)_,k3/ѭ}A,[&P|9nݾ9mv\ ח]bɛ7oYvm[;sټ~Ьq#tuuYaNjϪkOґ8qj>}әp # V[Ҙ;=uAP!zXW_3hHʔfA9TUSR]Cի8)̓eh$SP`Ir2|<89:u O:s0y؟Y7>aaZ9U>ˢwx`5}9{=fyiNeh޺={G.|ЯwO ҡsw2lBFStjϡ#Gx ^ղ%=l߹͚йc{yxU˕uup1yae4nKiۺ%.^b֜4iܐc~L8N9% HVf `th׆͚)?~dæ $$>l@l+/.][̛=C.C {w2| ۫lڷmՅp7FFFGWWk++ko¹B9 CRR;wEkbb"cGPq{ڴWo͝5G2?S\YFJC $$$PlZ,]7oߑ?pU VYGŘ6ytswB#,^.:ES/ MB`i t@XX8;wea\rD*U`%*XP+UjUa:yv<]Brp"P!D"A[[eXUlٶ;wQ_\xxVPΝ(3MV0dg B~4ՕXq׏ORގmPݫNYHH(ܥWV*l߹S*̘Teȑ+ 1.]{HLLdѼ:3b`KѤE^|IB2]F4ejj*F ;:kCACBn Aw _89:ȯg[4j AU۴fDd S# Tv?S_ )OTIuq}tU*W[򺝑Jvzzz2%e@MdY7ez׫Z3zjhh@iԠ><ᘯ?6naŪTpVM:9f9¯MUTmwP4k֠rj͛.:ЩC;.]S@o//jpBi…|&lٶjUereR :fʕ fixn&l =لGD`,N7gԘr,ԞUמcen]:+1zte kӊydYؾ-,sV s ђE"`NJ')?|h@֟`1 ץG\|kcdhHݿk+=;99SgPj%N01&ҹ{/ttt#99Yͅ*6mM h9!C-=w%995|׭KG\F~cmM0|`{4oXajϞDʕUR%V/7 ϯ1662q LӺ8'0Bc2d߸Fjj*ɼ}6KY%%%s6^'[Gr%^`s$gΜ sgMvvgq˗텹y5ci%2 >IV-ԾɠD;Lo̔S&*\͔IΖsrȟ_=<{fM)WQ5%c   )y0r"]qsssCNwUu%} _9^*C6w$--M-boG s#\!Յ7n [yv^|ITT|*tuh"B *jJgN}Xl%M5#&j{)x~Nmmm*Ut/Bܣ*ݯ2u%%'T}%<^8wRt)Nʕ2,3y9DUޞ"ѭ gΝ/#FceiMNmaAiݲ9nᘯ?s,be̟3CYWg"#dNo?vGMo :YMHLLWP6<]U:}4#\yVHUʌ3---V.[LgbS.]' g':eIKK':f_v'صg?U*W^Nެ^cYgyH*JArex=vRp211x}+; 9.]f(EDD٘45EXh 28MMMx8?pYz36&*'H6Ԗhb:%X`0G{>jViMB.'ObRa2dN+7TDTdԨIjj1lb=6b4ƹrѽkg,-ӓ2e,XX8iiiJe);&r|F\XdpHFr![%Xb|vMR2=,Q`!2,gނŴk G2qfΙx^M꿾~N*Q/WԴ;ݢwnh;XlSv6*.9j:r>=KYOBQTTZ M껪"EOODbccU>0(;[[ͅ$ SԤ=k%|!GQų͛6-->>?,ʷD6;1mkm`$&&Rꯒ{;2:BdIJHyJ'`ՉKlL, Y:}K ˈ&̙SY׫&6Vo/ M'%%bccIIIm8bbbDB:m'.VeVTI`I\+dW8?lrty i5iO2OOOT*笐H$JK_vVMUϛWްrz/\Z4cr]g;8(:8w@K:R)ξrNe)-9[?~bբGO9}#"#)QB6joffʵ7Tĉ+7!q~6f)22JHP?!HRRSR496:,ߡaϗ3xթYYiӸSΐ33A#Bd/ISTIa>RҔ?g```@գO=cמ}L6{{LV㒱# U<+an޺MhhII  GƄ~ wU+9},G}8d8VVN XYY*?^&J >yF7637o '\2/g_ĄCɍO> zF~TC?fܾsUk3zoޠ61 [CG^̙S&79ǖ;Yz-.ԪsJK K ȏRiii\q_N=.ժV_^S<?3ǍƹByRBBΜ/7oameE>Ԫ`̎DDF*KJ5.N!@f/^{;[.^Kqqq߉vX$KbbABF +93Vy*ٯ3m;6'sVܹs@>3`J-}ψ4_Oək{;[Ν xhu7oK>3+ @3<ljڵ.URp :::pQo~kBn vbBROyiY:L9'GΛ)-P;VYG?fO>cǮ=eEWWSO:wRt0>ff?!HXa#sSZU@6=h{NLmϩ϶hKE 173OuXEjj y1?b|Aݍ<j7L'W.cZ6oʦ-ۈǹ|98w{uАu69$S''eA?#Siii̘5[4kDBvmX~#nuwfسC>$c u6MaNr=L?i ۷E[[6bei)/n.89:0l7m _x1| *-7os{i3f+L(TGrY,--173œ0jf͙OJ<|m;vѨA}A'A1'Uؠ{(Y%Kwn1_mY thF{\+|Ra";2lFK5JܹsN+DY'G>J>c᣾ܸY42222B[GGn|˯Gs^-Y~N3  66H$=懾>EȎάlnќi3gSL)]np/@#F#<#>>^=V\]pt(ISiӪ9v#mJX`.^39s@|w!䱶coۚKp3f͕넠urY>Yt4yF=ǰchҨQѬ^ŊG5mĉ DfM0hiA (Ȗm;:y wWWnܼ={֨]F]ݲ3oQL?F/_hrV$_<İu.J/o^V ZCe{evXh{,#njQ|􉕫Q|fк+NHGGGqcF2b8y :x 93pl $-\x6II%0(7o*JQEJ@GG{;;fN$_Y٪Yа0._ŌYs)Y8d¤ OMM%%%UmY~-BLYn'2* K.Nvm3!N ..S&\ nt^<}WiL,ժxljN+LQ sssΜƲ5kx ؟a#PjTp'--T kO3 K^MH;,=S& L5D*Wo|ֵt_!v·HRL0{TED~1GZiJD@jj*4aYn,.""gs Fޝ[6V.n{ٷk ?@6S[ ۬Z^3JS}(}l֨޻yu͚8L?]v;/6mQޮMLQ15b8 Hԯrjy._ݻwِDS\v93 }{|?wRDDD~Nr/M5}c~.Rh޴C> T_^yKrr2 d?_G"p`ώߝ Xl\w'CDD$ק>TQܽw}r[XЪE3ZP$VDDDD :}J'W}azmz(mh۱ ?~2=E  """""""Gcog-?~m7̝kV,%|̚>g$S9<.#U_DD>߁%KzRR*FˬiSHNIVywGDDDDDDDDbaaU24󮁕HVtЎ͚dzWGDDD俊s?++Qw9011Die""""Ox?TDDDDDDDDDDDDDDDD叝1m""""""""""""""?#oLA#"""""""""""""""?Dt":}DDDDDDDDDDDDDDDD>"'/\DP0=ILLK\+׬w?3*ٹ{/^͌Tpd؉*7k՞KWϜ3]z)21y)~9+׬#55UPsޟ@ 4iAwO^|t-nWr9>;2K*>{NwO>{S_W Mu֫Yi/ɍwRXr C>}5#997J&Og߁; 6^æYSQQQTUWen|Wէ3ӬU{=Sqsإ',A:sߜLv ,w1%ܼug;>{ƪ5IKK˶gNܽw7oeG'~sj*'-,ȟ/oH02KwD]}d>khckc~ߔ2&""m;wӮMKyXE7rCG~cimdhkkgzݧӧLM8wUF-'O-Ur 9Sұ]MObE8e:~!@t$$$$(\[֣S򜒒"x4,-Q\t ϩ3g;Y'ӢYlndT1{X'#eθ&*:Z)/zzz.Ю5Əhz#CCvlYCxBC~9޽!NБXYYRꯒ0---֮Ɏ?xF cF'=Ovm2ck[U+y(\_zŊaıTAn]hO]V@RR>}ޅF Sݍcog47 Ulٶ-vK4kҐ}}zlmx5c KӴQCڶn!΀142dҸ>zV:k& *((=^cum-A)ax9[7%Gl߹Ka X[ӼM{˔fg>Om:ȓ-rSDŽ3kxfFB(Y8G SQ gŜ=wĤ$ʔ.ŀ(bo'SaSj׬All,IIMCkؔzu됒}ILJAzٍ /`R޿cƏK}cc#+g@W~O3|8K56W @*;.Y+WINN#%M8\r  ̜:c~wgϞ%PxQ퍝 .+֮X8wnΤbZ#<8 X<Rr%觱|o3+VcFrMR J(WI֭Zkי3o!^ֆknISgc6_g_ߑ%);wXXӢic%ZfzًY/7[̨_۷A"c>rIf|-Xӧۻ͚4R4\CG >¹(WQ~=55'ᆛ G/VT# уg}}C#Cʕubܨ 3gTpv[һg7fΙrDkV,a<~ѿoO\5LL,-̹DGEcff #2;vamDEES\L]P';GUg.""2˗8kדz RvM8rԗT*W`rsH(MZU!OBYj 7oޢnVV?,Xթ_%Yc9"4oژmZɯt*._FhhyUӛmZgMdQgK>WU:^Upr?x6Y_Xx>|PiKųt*NMa쎋syy!^æԬMDD$'INNZ* 99iYZZU;=WDP0aamߵjҥS{2y=zDbL8_u5w>Z62x訬?Yc6Źur(324g[d />~'h Z4ř7n2q q[D:?W^g)?h.7zzR)nll 3r`n%:?^ftNn̍9QJeVᨯ?Μer{t҃Y'SrL~ܙӐI8ecOb׎EZZ#$$zc`[ֳ/6SPwN\g{v[%˘;HOhۺ%- `˶4La uƤq壆ѩ[O>dzR)7mwA޾Iњ=w!];wd~$}-y 5}/_^ 8Nس} ff,^0.J033`ܽ.S~ 5ӧ(>ܻdN&r)?x?$$$Pg+bkcw5nETt4FFJ^(RĞIFŒ+y%kW.E"9$N]{bhdH=maOy9yVˈPY߼eaSF2-~Z^=RXQt* x2x@_f[Ⱦ]ЖHЕf}P=wO3ődJ`dh2̧ի,X@~A>+׬cMnьN{Kc``@ekݳ҃Ys0ujѷWw뉍_41ml%wdӧ:z{0|@JUB!޵7Ou/ʗ/Ys 8G\r56lI՝/q:sD]:W1EfL&1{@l޺a#ph.:,^ʥ+Wߧ-|_}"(ҴqC*zqU&N֍k ˎvA~ʎv[~˪}84 wql\ϟC:b km;'fҸ:rGafjߵkRn 'XF:wdC;p6R<^ժسEWkxgZ@`Z&s5._ dӯwx ׭'K\^Y@-γ߷'ɛ7\r5K:+x /M|;"55C3:whG8Aضi|Y~K/{vlǏ332qܨ,`Pݾ ީ4Gб]O(Kم_m\t9x7oc5Pp!@礤dIeur$oߧ*~KݿkQ5}saNgg$ ̔ S)Ç dxVȊU;\gϗsТYch$˰%5%Iȍ]:ҵg_>}enN>#]Nz[u4e]2i@9rd)H$Vl۱acSh-]o0Vq]5ڨ E"`e)3ȓZ~m$'|rBBB"֬;}l\;j8 &IIl޺vmZEZZ=vE!ɜ>sp%,,̩SuδS}}}<]J:}{u]B`xDѫ{ߖu}}}Ri[SYٝNOzteϾpZ5|65}*km³REyLhhI$ttՆeG Dv?S_:JvD릵1_yV[[^O>s/c-ur~:xUTHȟ//{vg.pC1vd ]V[V i޴1͛6G<|Uױh2xV~:T(_VA CK1@fWfFӧ:@044`rye@-uCmUT.bo{3+`j`!#vr:+,b7W޼}?f$ \Y[YѷWwLLr1 Iȟ/om0n_,~gqM͟s,3z+cF s?—8.YN=.TLmaWXi ]{aۦuX#Hȗ7/?T}Yw9SNdd|"vdť+Wqu`8e_%KpCOe=+V;BRr2^򽏞m ^U>(LQ:B~vw?AvD;)'_<ڈؾ ۷<|i30k|V.]V ӹݨFDD$<|wwZ8SGbE)^(:r>cee=;!*~W# T6{/ IDAT#%Դ4PNbK+$e~؆+)O#._ᓎ BErgreIMM6ؾ}5r[Xu<|wQZ]]kk+*   iٮ;7{|Wl߹DŽy-F2wnΜ;i3124T'HDDS>aabjnw: I "#T 'psUWPΜ9TуwRɯF. bnfӧ2~t+HTW ?A~U[`ffl\Dd$>yJ!<9%'(911c+$5zzz?ImCBB03U,_榲111r5{A64G$&&Ktt iiiY6'(bo111T; <4rcM33SHHDddo,Ձt,s[(. k &6~r2qڹCNP\2XJP(^سϟƦ0'&EDD$-(HI_gr~}'dωI$%'}""#%:&,uU^J#"e3P]D7dDSYfpZm̜(?=uWU(LdBe3ՏK ȏįfFJJ 1Ē:ښqqq"H0̐!$&ȾwLL -ˈY&vuײک:bll̝8em4TRhiineBUd]>PnGDDD"%5U^>5mh===R)!jӪ}#nCkٺcfM'~EVX֤?<Ys3c\rAYr5_K >ʥ qrtd:KE?177CKK "JIIIQE;˗/̞E9{g_U!΃ع{/Ŋa݆&wn iUXsUаPY'O̔cF?}K.ccʔkJu>zoX8wh2ޘ/׽Z2ùB9KP):BɓǚkQvMX+n&?MYSGyOѼicY9 SaarI\Y$TקtGTD"OY|U9 ss"$%%894_` % ϛǚ'izM> WZn3SSk70`̹nڔ,Q\'uoj-<}}BCB/_)膌,CCà}x [dԸ+Z*m:2okBvGߥegzϞs1ME7fM*<šǸr:yXS`{/--+Wq1O!եÆ X"ߕ7LjκTcO=w=t[؈4b|G-11JߢN)26"Ok̙tMhR/2֯eD616jzRy}e҅x=III?HZNpsqfYޟ6#W.|B<ڄ3QXHN>)/"#ۥR)69uB3ji[i͛oldDE8tX[$-GZ52maISP,kV,̌ӕ?ROܹ{OåWqt#SӉPAI{V-qnfMLEw7AG0e,jm3115a9ߵ rbZ5}Ϗ?1r`˰?f4-V\x /:,8嚸աU1#Gp=M/ZpGg3iXPUk7H۰ӧ̙9 ---ϙ+9v\Z{k̹ީe4 ե\2L1'Nq,MBC]ݺbZ:O=t{CȐ\}.<$!!~{ǐc8~Wpqug:je˖FWWDFFs.XNm-+\v!]tps,;rG"|Yj:_Lz5W~:TVE_so߽S\}{ &:'u\ʪѡ\2=_9"""9{r>OFAR-K/2^_L[YS䟓OllIEjl,K =ܹ{CqKΣiu>{_QgZ6o!=lHV-RM";[wXa3}|li͉. .ij'k>oӲ J*I٥v{sH=t<.70K,ƏPnmjT SصwW|r,V[ٲ5qg5U웆&OK8tu6ӢY,RE>XzukSZϚ\)V^lٲ|-ʨdrg3Ce5NnِS[z)\lʗ|a7Ob c&`ldDuw*km vx)ӧL13A`  ,Y /ɴ%(.H܅+ ]{qժ0a(ϚժVa1XزlW”!^znyeV-gٰͬX*Uk 2ʦ75UeQl(S$KO~93b G#&&o/wؾ -hpsSZ47r"nLӖț//L=Yb5He`*jתɘ#H$8!xHH R cǏR$l2?&&ٷ N={v-"R]OzuX8ow⤋FF ЏCNdQ&nkA~0$.̜HvpAt0#gN}jTDRmܼ}%+VB>|Ozϼ!եn*V)W޾{G6l)]MVI(Yn/bL<ɴOll\e]F۫a3Sw<1ɍ!ə0fTGҸaڷm6ʼCIL<']2}6906D&|03)dʦeKihhР^].^bU?3]H̅HOPXc3iSC]]umNgrԧ|ٲ잸R֩C{""#h)4iԐK+P~'^ ,m㸟䦝%5+1jDFVbM\\ReIB!Q^Fwy3s>G@MM+1wtJoǹٳca-[l@hhcSGyT"ԁtإ n޺Ej)3F <cIF~.v݇cbʜ@ RvSn8.d)ȟi']Y ߫~L:Gd&_x͛ʯ>:tFRl7Ⱥ(f!g<6iԠ+𸑡c@ @ jA ,b([sfn3mmmZ @ @ ҅"@ @ /;'4,@ @  "#@ @">@ @  "#@ @">hRϞ@m ""yCF)#G~fWФE/]!nq%N,dP27^f/ᰛۥG:g,遪ד0&-ǒۆg&p-EyVsʠHny<&- wWY>"gUW{bZ&ObȐU>gڳ7Sϙۥ\G'Gv2n?y"S׬Yiڲ-c'LVx1:tJ13wdu .DG P])zݼ{>e9ud<<tȬ& `\\S{<~4 v8&>>>J~y!%^XԹ|هS.)'ϟ/ $REr[c(-RmY$ 3ޟ߅_g%;Аo?w8ov̟3 &OI@@gF"ɟO~MÇ ؟ͩT| Nk}%**GӢzX-[ i?9..X&}~OHH~׮Sjxrz),?u7 eI]'22M[ݾfK eg܄,ZZʗ/'ݳ;Oj1Y*>O:XQvTTA?~zE@` QQQiW 3Y15xЧgǢĿӳG7jd9s1iF ksg͠P ϵb &Mش~ ۷UJzu3~grk(3S&r0NFUԱvŊǏ;ysfr,Wߎѭs棫SeO>chm)\R\qy1ٲeT="E 3gB^x6k 8x(6lټ~/_NR%9bŊ˿~]{ٵKQӴ:qqq܅A_PPAM9ְ~=8ȇjŊʽh])Wn޺ Y@\\GgxxIF*lٺ"hQÇ/{lvQ,P~}zJbZ<5 jNZ5:x JL֥3͛6ay<|uj3fщ\@GGҥJ0}$n޾#]jѼu{ʕ-uܸy͖[x-Eahs jz<}&r'le!=Su26:)/^JzNd}}##CڴjI=QSKt.n^ucņg_0b`:Au%$$p-NrE/YHʕd{=O-33jVg՚<~R%K?e Q9vwޣCJ:y"ZZ4m͖88 @mٽ+CdfK>z,գ*ܴ~ ,sˇ!֨ce>>ahh)ƍNUnGtPULNU:_HKwg"2gC爈H:u!#(g{@͈4qԭ]ͥ}. N-3SڴjYMS`Unwiբ9[$m\˖hҸ!mZLR*efMs牍az59e+2+>lOrґn߁׹ Sh DjUuoiݛ/(kݾ7nD7kLА;{Ν@`PsE[N޽{ĩ)S4sfN˰AWEl[޽w_ҸA}i5Ms}oU?fN& JoslXߊ)T kvxzaemCu´Funݾ5liͰ;ڜ7nt*+&W1{5WeH$n޾@Ef⸱ 6k&gZ IDAT[Ǝɛ7of~}zII:c6աaz>ˬ_BwMd9ԫS[aQےH$\+VyZ iy2r0ٻω񓧲CGѢyS6]IL3ONRhQƍ/pؽ8.]ghk` +kcc#aϚ+ai=c3s騡&A0 #C#&D"a~̘ۭ2NkØ#I4`o߾iFϗX<<2vdv`hh;q f5M֥3˒nQgM8}ƋhԮ%=e3$?ySxxzMڵXxAz^/VEФQC:BhXzJ3 0SSx1fNBHhk6oX:? ]]F 1_}̌s? 4O>p#{ء-kҸ!\x- 9jV|v8fGuLJy1Ѧu@v0t KU 2s~ʈaC2%$$v&̇|͝S.*0~(ʕ-+SФQVº {,o6\҆O9 llN,=2H{~{2gR))k>Jmb-\ҏy0s\\ݙ=o!Fhь6ZP ~u4_NrIvChӪuVazDFF/^6ZмiNe!UD}cm|~3%4JobcK.CSS; E8uB:謬}Kޤ惓dI_|v.o޼e=DDDJߏϚ˓ӫ%g=~,W'^fԙTTS')_J/NÇ_kr(\LyB,&z2bϟЀvg"m'>Sl2| ޻Ma>|(5W#88D:=[6y&4m҈\8wB}llSl-^(}k2744`,\uj}ŊWn:իUC߸Ҋ.b :jjjW3kTio`4Ε KʖjJ3H @޼y;*,ٳxzHGj **A젢뱳wiuNJL[ˬ&11188DݤEBBi 댍+tqFFhޔV-+(B;Gj"HiZOϳ 2H鎘2vKp0Nٽ+C g$-۠vm455S}U!\"C ^y&J]?iݪM4%>5wvnZR`Z:AA{" .#Յ~گf,)Q+ZDn}6~jhhиa7l-|WutriՒ롥%IUGc ߫d*tti޴)mZHYIa٩#<ᔋ;vƎuкU U"cÔyT1șSQØ5w&|E_) VIf֜~e_nܼź+ج)޽gӧLoiE>Wܹe>\wUaqҕāeQ< &OIL4>ӃX1b`骋䄆&.і)%&&(MNҲu6өc{̇ *ե}6?q5 nE(#]HMSΖ)?Att4/^O2uԒI;||O7yBxƏMՀ5_ 0s|j)CqM$_޼ _xe8r<ͲH2|DGCLrv _ZUnMJJôzu}*T?I> $::i';ȋ/ O}RV&qקl2f+Y2^_*[+.9}|Y{;W.A^=u\Xa-XfED[ˬ&jsuôjќQTɒ]Cp.L1<&&qoLwHgj2\Jx -JEEdSŋG\~##Ci' 58ʾiݛH_!qVS%,,]]߸LGߕ+V@"yV頏2v08$Q~c# 6ȓG]&P :Fs9:q܇5g4jX_o|xXs'6BYeYUW]r~khH)"..0ÉC_Olw#"# kWNGH;y?JTyҒ H:JEr]Iߞвl>xiݛԐ_OnfMʕ\۹uiz-iݪy|>~Yx%T5B%!!e8RSS3}ߣ]\Y6Wre.^%H124DMM/}ړH4)nTFDҚ%sǗ+>4sTK7&Wg$FF\~#EyPЗN ޗ.ch`)Nӧvף?/eb>ɟ/hhrA$bccxʕ*bldskӚ;w1[ojrGCTR@8 ;#D{~'=7i%&m>ʪ5Xq3M7u)S:o|۩+)=w1#G(g@;S?A,Nm'GapFg?xVPd .ɇ${?ʒ6BYeYUW]r2<W7wN!,,Zf5Y8o65Mk(9**sqqu[͓֭Zкe { \qWw{{Iƍ7fJPTyðp:]JYyaْ'UދxzI.W>^:uWL9kVJsg?| 66V& |ccZ:+.ȿzJoTwGR^%$&6|G"PHa.]"͝+w=)K>55tu)U.niRaچ֬\Ŗ^;+id=66+PJeΛ0Ѭ^Kue$ʖeA"EhբڶF[[ۖWh԰>x9-vCo*-[6\\dr$mȦ^QJ/ΈaCps۷,_bŊr-֯'-ѩ ]FګYa3SwsrpōSn<|B ҭKgZhp<<}Qxz#&&zujr9xR#00cOΧOTǍU*Pj]|11Y+g_@MMҥ}̦Z>zh:U[ZFQB&9[Z:r~R]⥮ƌi`1SdU*%BYJ(UeܽӧLdĥ/6gI>aa^cSiQx1rʅߵj@ߵ,PYO/llsMv8_׫[ s>cؐAr.]v;~?||8q҅ƢhV6p೿?S&GKKw\u?xHVѕWԩmFR%`1.n;͔PPOszRjxsDEEszzz{y1 օ8M;׮OVYϹީYt)tttعkQQQ<e+V]p!^[<|_bhhڱ}{|ŇWq=IK|y2h@?w`yhUk=RjjՔ~H'k٢<?zt111L9 9e+)[4нҒ0f$\\ݹwsa@{.OwIo]g?hX7Y`c /q-v8իTR5%<|Juҙ?Ξp={ΖRtfj$.z RNmQ9sҧWmlٲupN2wbi젢ؿ/>~Z+>ܵ*$NkMX[nR 8qhx tccvpKs)csԧWnݷM[Xb5aaJۆ" +_ȕ)=uy  kD:&NiA|w:6[MRROtq9"##xS)ڟ1{#FM,2H{~53m}fNNNzO?cuE bڕJn]T 8?ؿ/w1gtWRKW|8~M7~׬y&~<*ihh0s|._q,lIҙ9z_4kՎ+>Ҳ7n*,*gv-3V̴sp:pk9w;{wٷ"jUu'OWƍ)JJ_}p.dlٲ1oL.i3eN:QceYM '3} q БTT CYh):\"̇}6nrJeΜϰ^*+-nVF"ѤLҴhތpV[OͩmVH4>S&g94_###?I{˕-Cn]ڲժ' Kr2555.Z V[|r[BfkJJ>-Xj-%Kgg2q<?y?!a}[mc##TDRmOOWsgae+:w#Oz膫izc̚/YDM 2D‘c|L;{H}2ɠiO>Mo4j6<x7 qt$wn>}LF)wקsc>Lv-- .DfMuR]OZf̘6={qCAoRdIƏ)%nzӋ|5AF puu'zܘ4W99|'ףJH4%hiI -7{Yzv*={S|IJ)i޽@l,QKIj(QbņR\YƍɂEKeڏ'..>ղ .UF̰;yYes}(*7o*ԯ[V-͵2*}[UkA=RzW+3r3oƒqؽ#G@__2JImط"ݻ3F;Jfit3;8p!!Ufr۔H$,Y8g1yL6]gR6F\\ReM]IHHqC(SV,;K V+V->=vyL4~һ |@?IЗ7׷;vtnH"w'p{|=N88{$I@ $w~OvGߒ7o^Əve@ӳڶn)Q MJmE% IDAT.X9V1Vw:,#p-_ųJ_ rva@8D1@,4W\ݨX$ɷ ң[W%[гGߓx?xZ@ A2&wQg~J\ݳ;{= Y 2eS!.sྫྷC @ _>' IT鴵`Z$#Kup;}&My~K ϰzǎI-3Q"@ ߏY-@|'W.clES2dX 裡AZ 100PykάwmF#9rd@ @  @ @ 3}{6@ @ ';4bIHH,b@ @ @ @ @ @ @ @ ˗`L4e{xzaZ!|`v޾{b!|eyq : 5w{`k3pyf'"%1yʐ>{V+UY88!^OfЩkOL4W)% L{_)ʳSErig3D^ePUߛ_ǂ9vbV!CVak3S)6s.mB-3`\R a%4iіM[2~4޼MMӁCtٗ ѦXb%"#.ŋCMM LaBWMDDdK:tWPA|'N[yqgړrB__z޻/|biR%ܹrQ@,H9#l?kdӠxbhk"ɯ.j>8ٲՖ/ݓ&/o^.X}eM10fΜΧϟ1=pzk7lf&Kj2ciՃȨjK ~-(Z j`n k?9..eK$y.ŇcppW|bZ:W8w͛fƪ3Im` <~'d)F"Y/$4}==rWw(]$ <0CH"U|̟jtu3̏GFF޽{O޼yPWYtutȞ=O++f/Pҿ۵iňػo?=w׏7nfRԯ @إ:ӧWܽ-^@&Oٶ  ̴ݻvf؉8Db% puS΄eѼҲGл`uhJw m۹ٲiPtiNObEC\|O9ӡs7:oK\\#:&N;0fp._efK޿@*?g&6-p7o߽G__50f$?t^L5o/w~UNߴ\o/w$ o޾cWz*L8Ngn¹{p5LYt\8xϞ=GM]reK3ahJ/$Nv;q*jתI\\8qʕ/)\ФQiȻؽÖ%˽hx K31yM!7Yr}hPnj"gכﰰ5(\Cq@<5u=uk3zpt;ЧgwڴlӸ!gq*a7GRL)ϙ7K-jo@ʳ ׮fF^zMŘ:iXt=f6򃇏v&\OEWWHRt0޿'W.czv"(%>{"qqun.޼y۷eЀ'NhJXl`݆<}r+!!׮sgαq*W"=iO׭MZf,ZQLi8pN[tt^*fMGKK+M۰rz9i^9ksCUѥm,PcGR۬JM\xАPSیS'*7ٹ{/!!V^*Cztk~Ư*"l}F˗` #(g;tF6IiP.S'>еg_թMm[nlly۶}͓G6.x_bfKZ6oFm)Wm(BgU|/bcciҤS&C;~Rf}26[}鈈H,m8ŗ`+ʘ#0YCZGֽRfMcim5ɗ7/[5g@hhh\[<< "w\k݊ɛ0=rʰt<'Ӄ>ITX{H~jjj23XѢ\xI9v$ |+TmK Q7Yлg7j,\Bn561zpNU[R%KH;+>4 57{Z ng+iާ?-0ux^zf _PΜhܨM7⤋.xbq= 5g4jP_ar45v2$Z.Ya`¸hcs7Gev1 m[dFbbbǜOPD Nϓϰݾ8{_^hhhŠ7h>}D>ȝ˘/_ؽ׉q|(z찵,7ʕ*I@@ ȘS&%`ﰛ&qAi^aC1y8bx Z4@~!#Fqq7FFlް#PN-!,t0C T3}3xHtt7ڜܹrS m'{.z^yˆMQht!!!u(J Wwlmg0ʖ)MHH(>WnZL06rx^4єh'OFJ9b(?~bDE暱w؍Vθ@OWWnYfM9v$^pBߞv-3igvӳ;ժVރl؂ڵR] `1۶fܻ;{7fTX13'OqI޽{Oʕ>e")'Sڍ|EԨQRGY;huw:1v"Fp7QhiiiF Dhh(/_fŒNηUtb:&EBٵgf~lZllU?ƏI\|7o*m[ԫ[_?.]Ȟ_PFwiï~Of]j"RȤwt:@Νع}+?3ul'ˢyq>qgadhH6о- PZGÇ Qguf֠C4_5M&S<|R%KС}[ڴl0;ҳM_Ǐ̜3+ײp^bnߡY| ]E2RRb؍(&*?nXFصQj~ʲyx̹sw9w1[4C__%VGP>~Lmɞ=;pׯVmرI __022OXGLL } th[|yǻO)=zL钌5\;Oh xߪ7oݦh̚{)"2J2h@_ΕF^'>׮Vr~UVzS&jVgxIѠςEK)VsgNSEz+:WPoiiAs*WtfڴT)goG1e,gƌYsiJ,ʣ( :D~TLt njTu܁.=x669{RrE([46a㖭7LkH>=3NDPR W^cmlZ@t܁ ({׮ӽK:=vz]}}Ϟ \fΜ}rY*:W`&>EDyBcTq?I]\ٗI}-\L󦍱dL;VrqjTu.%KE&*n-,b{eɜI}f=c*,3a4:  :$f_ x=Fvm؛W1~LlǠ`֮c6_*8ӧ\ $&=ѡbIdd6ѶuKyT*ޥ˫mgTT'OsgΝڊ]_N_>N000ѡxֳƯu Ѧ  dGvYHRmFFF$z~'w_э2c{?ޅ;wsYjjnݾKzuU*{T謺68/Ƥ ==$R⺠; w ]JN[/o^g3sL4jT}եFjԨ^o߱wA?)]ťj$&eϖ^=ң[gN=;cc#rum;Z%JA?K ,^\ulYy]'8$2|D,TB j4ttXRsٝs/СswfB/VNK2Gɓ[WlYcy{u.2٨n \_y+]8/s7@\9 00Hux5VYϣ'O =}>9n3d0hܹ{OFl2˿|+VqMMdTO=Ot>$"2Rcp՘5g>Uܹrj||OfѤO5k0zPlOtxT*Y#iΕ^"pԆ&:ԔׯSѹ/]'yre<O+SҥKG?$GAlݾQ3E &֭TrvR|jTi\m(k|i jU+u䨪M>惁bo^NDd|с5 BЪ+"2ѬОիf;U +⦅-t$$4ʕ3c*˕Mt?FEEqU*9,p S\~C-ОmknIoڇm+D hmśd^ =Mqt(GIGi޵KUϜ=SK6B}3۫>5컸֗,QL-OlYGHvЮ5W^cL6lѼ$7ĶqH``{g~6lB9pB P`q_<wddÞU %+k~coW޽GlYJyr>XYY>_Tp,a~.:6I{}K?TEHh(&&\xI|M[^ CO}ƌDڮԬu8kdhi37z&&[p;1>~ČU9sdeێ>rzuji]+͟E~~(J--H.RAAZMZÅGqrtwQى Р^_6Z| ~~XZhѣjiqff]H'OWTwJVͱDG'v~r`PG hA~1ϐ>{%sf 9f|~K "v8@hhF&z I.o6~ RE'7l潟VVYUw??UoYZZ;n`PP1OξL3MFkڶnz|Q+aaص5=Ȑ?NN Z|,###P[5\}n<ڴA:sGچ/NuɊU^9ɑ==vK$wX'mgW?z]Um}jwqh[hфFTTff&;<<<0 &qꢍO;44d "9^4CCC x JP>"00*WWkr>Iw}ұ=veJaff[7qJ6@`pVmW A:<zyj2eXFO(^(U+W;|fffO^(`SW{%:::y->|z/'Ç̘39u,ΜA-{ٲm زz;j cFkOK~=6҂1#.߼iV33J(~}={μY~mT|-e\- )go9n}t՗,Y2SNm֩EI>{;wPf]xY?7Ğ' Uk|U9v0/Z&‚[6pUvyeĩL6 ך.ԯ[" i,s+_&֑> Gyi̫x&!ݗĘ}{3oo<|- =l4z9+%ml~԰m=Oػ&8$g'GO@ZU#ǎs.^B,iPիRwc>'0ǵ C`doWrν0$4U@z+d03%K̝9M=@r>I:r]Ю*I̸>R&p?e%8/D` )Qn=[VuFo4UTnC^v?yrsi'O}Wy66yZڵk׵^Ԕlw2f[HdD$ϦnmW&Nv!dIەa҅XZZ2a 5(V0o޼۪P_D=;RJǏJp]~Sx[v\qΕS&c2nf睾FOcϑ>jGQV\ZÅEfkFjլΎ{QSz<  IDAT!/UC^( fM̒s /(VΜUm? Te=uF՛$.my|.ؗ?KL6mՂ\r&׋U0nĢE s$$FPR2^G}Tk@ds=s?whƷ=ǑCTO"0'ĮL)Ətډ7oӶcWlM_NKU{@?78AO|iK,>{d IҝR{O=ءr9ߗNmuA}3۫w ]Jɶ>"2m;vӶcWj3lޔ}1}+8j!LV1a4-Y0g&nSZ|Yb {<߼y˰!9ใ!/;N< B,7+k>}MYTt]RjۼxRunٌȈH/=1bx) *n CC:v=[ذi 1oŕ21>f";u,,Z _.]k倫-SZM6o;Zhʋ/Yd9!ӸoĠ?G%&=:w4SgβbZ֬K֓ vƍfW/L\b=y4kHn֥߱M;hn[v3fԙxa؉h6ͣO8s;wx딒rמѬ5ڥ{o7l̹;bllLw#G qߓx;`m:tI4- 컟^ul}9l߼yȓ;gۦl6qmuL7rv{4;w{ZÅ[6l<Ԫ$|soN>ö=w5WSIJ\sUN9JpriI3~#eo7sEge,YdoI /[#Ǹ!aaao̥8zg'GʔbѬw3fiǔcɛ;7=͝գw?wk>u+z'dܹ{ʵkxQEE}} p߸={3c\ A:(_*OڮȞa<`ȰQ˛UU+اpanǮL)d)]}{tJ&O]R ߇C'g˕e,^Qc'bh`@[!Q(V=3-S~n=`c&Lm~&qQQ# a%tهHNxaeeYd.!,, +k+ʖ)fL4YsZY2ӾuK<T׽sG&NA!ZMK6gW?O例j3dd[կwOyjJԯ[;Y3{ #cO"""jU*3x@_^I|}t24eՆB`ɬX-v{2d0HB4o;29[R&kpBڵn~tݏhۗeȠ~jCca*.gæ&#n``i٧?=l<,-,јj#::Z4mݾ{RɂEK5;zxad;ЪySgܙ̘3c\3Ooϧ6e dCl`6}֭X=Y+v:ve4gxOL%O:~$ZڿO&o[뾁}G_ɭ euU@54+~=96"ꦏ~9ſUn{KPv' 0x } "H D'zz={QdW\5hӪ|BrW\]nݾ˟!B8Re'.l{wIM>od˶acm[ѾM)_!~ĜSun B!F`a5U}ew$Nh7c|CwF4LXB!Twm_]DD%Ep_]_+U}9B!B!B!B!5B!B!H$#B!BIG!B!" B!B!D$A!B!B4H>B!B!i}B!B! !B!BA}X-B!B!D=}W#B!BCa>F+ȗ7=U !B!B|7###b~zGPPgF!B!B|C&rB!B!H$#B!BIG!B!" B!B!D$A!B!B4H>B!B!i}B!B! =zć*!B!Bfd|yP>2?=#l2`eiW%B!Bx1UI?=t!<\>B!B!HWW#ŤJB!B!B}B!B! !B!BAB!B!H~ӻB}bێ]<{==]dLR%֥#)'O/m۴B"e~nI>=3NLr?}bYpPƍAR-3 nmWr},j&BTN$#BB=6|ԪI󦍉G>FvI>}X֝6Z@ i{6 seg_Ak+KBfEB!DZ$A!"ڹ˓*+2tUZ֥#:GNj ɍC*'::Rޯ=jݲ/YB!. !Phh(3eHW(N׺}gJ[O<#F#00sgq3{{L)P ?Æڵ05Pp!Kr:?xHtZ"={t%!f٬^i3#rAɑ#;s/&mJgKRhl_ģOȖ5 =w}Y5iɻT}}}Q{lŋXZZRN-ڴn6i ޽{Oٴy+^aղEܻ໷밗7=䯿QP-{t%O@=Thټ ];wwxWR۠>B!}BTp?pqt,Fzkc#=wA__`Μ9ǀ}ؠ5ڹl¥W)r݃} 0p0*Ute&lj>~?Rɘ [ەvN6>2Ёzt%{llڼdzmzXp.W9 >CN9ISS&ݻv{YN؇0zv*{DEE1fpLLL0`ƽ{xAud˚Ȩ(}u+c6 ƍqۮ6$B%A!"׍1n::ɓh011fuXgZEWO'2s>ŋS]Iy dd69+)Y*0`њACӮmk}{&FMT[y P gΞ)Z6oT*֥JksYÅ122̙Zj-˕U st(GddlUd5KK ~vuhF'GZ4fVh I#!Bw#ۅBT(gYӢyS Y΃ "*8A/ryQJ%D϶r ._ŭwIrݡܻUʠ˃K'g/gJ%{}>y;bŊR5+>??x!}zuWZ0vݏ͘{zth&G0g".X^dTZ0AP =3<S+g%OY(Q}4j;|*fBZ5]i𱮝;X^XJR +K tttPK4~؃x'&_ B!H[dxB =}\#? @3::v>JZ ?!&#-7!gS 1356?o$gq{6ϗ'ҏ@_O" ?~«W맧d/_ B!H[B uދŋT s޾}Ǯݞ;[ukc#:@ޛ5g>F)\^ӧ=O>Uu.˖Ȉ9sУk'ΈQRcc#^~Sg nnڷᣙ:}+9s<6nF'Z,`1kyХS{^|ń4+WN<)ll2beeIFkT B!H[$#BBnzp$7 `W˛%KfɍF0h"Ǟ$[ 2ʕ.ڳs'VP,Y82;kkֹ3yLJ%Y2gcy2# 8卅9mZm?m&L;RA#2gDM9pK-_չqf!88͛еsT B!H[C/1 0ŷoi݊uݓkׯcWUR! {=fTZWWG!_+,Q"[#!'y+ _8DQ@?eB/_?eæ-X[[QӯB!HEd"g!_t՗Ǐ0|`!B !Rs_] !BJIO!B!B4H>B!B!i}B!B! !B!BAB!B!H$#B!BIG!B!" B!B!D$A!B!B4(B!B!І#B!BIG!B!" B!B!D$A!B!B4H>B!B!i}B!B! !B!BAB!B!H$#B!BϊUkpq{cOm.)'Ob(I֟J\q߰Iz7fŪ5)Z7ߵc._ޤykֹo_~Cj\qB!Bz?XeLlٶ>Z;wB!B!#APHa>wi' !B!D hrܽ*8Ы{ ce9{P,-,(_ޞ9 ZE b¹ ڊi6~oP}}xݺ} s.>3GvڴnA%g'U3ulV/_̴sxrdȑsSSڶiEڮjرk;vիXY[ѸQC7jCSO pe/\/ɗ7bthך^ǓFCѕ{:s))_j=6maDFDH?KNXt9._%:*RJҧwe͢Vߠ`FϹ12JOF iټi{Ӗmlݶ[<ʮ]tґU%u6iޚ5][qB!_ HR{Oɟ//# !88+VOY` Kszuo߾[88O̝kU( |e}֫W)\ b``=v"S&SRɘ [ەvN6>2Ё3MRrȔɆqy{ukRݥj5\Hghy ddV˜95Wcfթr߮~~;pPrRIqVs D 'GΜ=Slޔ`7lMo r|/:::(  K$Lyv,-,4~062R&C6jh٦#ǏX[Y13gҨ>&G;|>l%:*9afj @iҢ N-[nmdUG8)ڞS벅B!B|>zzz̜6Y#}:wUܹcy{a-e055ƍ[89:?>vȈrU=e~T8|^GR˵o،S}(ɛ'F^rs@r4]]]gw~@oDPPBL IDAT2dHB9*;wǡZQW^j:n޺?11DEEKR޾*/Ovܣz}UT333 *ĽԂ>+Tщyh{.U2Ye !B!*}ttt(]FnOs?ŋgaaApH}zug߰y -[VtlO*~9gr劸oD͚5ޟ5g>._c͓c##nɕ) T >/ ;>оS7~~wU_Excnn!ӧW`ad03G.dd!&NQߤi NRE,}珅qRsΚ˹+B!+}eeiI@@Fz@@*hbll[nGٲu;c'L6>gCoӪ:wq_'ۻڰ3}+!Ai{<---Ղp OTT9$9)ŋC}S/,nbbbԞ%B!B3LЧHBǏ!^._!$$5{ϗݺpxAT7GDDh|!NJyz ۣ"2"ozDFEqE^=߫DbqutB pYbbbTïN>VVxGLMMTi?իjeϟʔ/%~Nz=EL6Xvg&((pg{j9+B!4iެ1{d4i?BCXb5 ı|<9 ɑyrP(ػ FF(` @slݾ e062Rͫ6ӵZ>ŋc˶+ZR%S}3кU /]w(SJϞqm&;wѻǍ©2B;ϦG{lɴ ؘ5<ҩ=^biE98wʓ>}zrȮӢYЫO7jMF|*Q*p |*y1dmw2H>=K]z9=%LsV!B!ďQ$ʊø SXt9˕e ŋ#=Qc'Ȍi WtԞݞ{޳HV *HY2Æ f-ұkh԰ogڴ?7._ʈ8e'|OaouNRILL 11DJxfɒ)Ks@bbbTASS&+W۠#FqW+S3tht͛K%o<,^d5(J˫_^~#Dz:~nc##&7hܬ53fͥGB!Bc>[@ R{P֭X=Y+v:veJP%H nݾC^}Yb yB!BKPm2e⋿XgB@8DQ@?Uo43Kfɲ/Vsss>}ƪ5)U|B!B#$#OČ ؘ ٽ˯B!B  WWA!B!DڑIzDB!B!+ !B!BAB!B!H$#B!BϊUkpq>}T͕VJ3PF|OE5y ֳOEGGSafΞ:w?VTR T͕O%O,\ZJ\7ghש.hծG%YO1mvJZtӜH:FdʴjۑP87oivbr!/o*Useӭ?R+UצIL> ??xc'[fTYFMZ2i ){W>}J\9B!B.U}bbbLܹQ͘`1bTt𫫣5]]]TrxO=TwZk*8xcc#)`7n2|8 gؕ)IS9{B?| .;WNd&g_PJeMv `_.ɼ :u ?~7OL8 cGQ˵^1zJd|NЭgxA3r-7ٳ7(B!ieʰvղ_]D-^ATRʊFT.UKPξ{GO dEDD```hx<|!/otjoaa箭i6^o7/_^<_YC9˯RժV`ȰiQ(,7K-K5~kԔ>''w۰|B::ܽwǎ'¥ؕ)ͥW8y իi ͩXg'GtttX֝/^#{v޽{i3)goqՂoƑIB!B,uuHC~^~1b8j?bæ-j 6񓦪=xHmΖm;pYǏܻ5sV[zlc`>pxǮ=juiҢ [T{8ݞhު.xJܾs=ܨ^>m;t^GRJ/FƌxqcbbJt =zz13gOtzx;4k)' 0x@&NNFԨ݀~ФykVYǢ%i&&O`;͚4&cF蠣hH\FVZ;wಊ$N1DEE%{űDGG֫;lljlx*mD|D>m_0I!B!KA[Nl\n;l*Ν $q)RSgEdd$LtVn˻o݃zukkzz/\BE L0]YtRw=xc̨x[EL6@?RdQ\z^=2ѻ@cL<.vZz[Du(^y&Z//_E9śЬExx8߼e(1v"e'1CܹpVs.r_i,UiW]'o}L21e###Yb5֦ 4}fڴjAp(gϧOYNڮ5KK 2J%ݺtTt܁ݞ8{5k$kI^*lܹ 8;9pӧWRD1ƍJh͠!i׶5>3T*ܡP;SXQ?UZ%gt޻ϒs)RKqlݾݻ͓.Ɔa/vʣx ztL:CCVHHZo_yGm۱EKʞV{>HJȞǎ Q  禶]tuuy*PTI|s._# DH{dT|LM+7{>d8 *7)OZc՗ px.ժPp!ٳw?͜(T{IB07W]jUٳw?as.QAؽw?֬g!J9s9O{ʹؖK!B!AZ<"\mΜi61LMLX8o6ȱXGlm^-^.]̜V_a˶\r?LUS%qEʕRշJRѶM+ڶiŇ:ɆcOo*Ɔ[EbXFj_Sbx `ZU^FRmE__ h,پrb*ZF] ^~Ó̀ROsmJlffFҥ(Zp}%}c899Rp!Nvt9E.K}feK8q/_zk-\8;v0n޾M&?)R ˖hNݷ2ah.YRΥ,^ܱYs(^ZͅG(T-)YZ>^)F\g}N{Ɖٳy5kҘ=dيTKCBo֜B!B>jsRmԗRZ5qaA0jD&MAzu055{.^¨C\fffޯ,!srիUX"L2{`bb{Or5h܂͚h$,Jŋi$CإEaʶoɟK˟p JE"Gݻvb̚zujs53v޽@ Zh@dTW^ HSbyLML:wc?Sbyrȯ'Nc3N<ݻak3UxzBd4j W᭏F䬭hִ1GD^ݱ6'njdy?F66'~<ϻwB!B>L>+yg|r.e0t7oe+[̄Ӕ2 /ZYi`tՏ:d+Z0gLe̸IL13ң[glmsr8hؠ'WJ_IA9l([t]˱llQZXXZvɒ=3Gø4VJNR1LV^Uks /]IS}∋tڌO撥y<4Sg$La`Z'Vt)fM-xyގj^ xI Tߕ[7@*XKK >JPP6/V4JБ?qJeNj`Z<9/_zӹc{խͪ59}Ƌn]:yџ8xȃ{Pv-gص0lX Fex>B!B_2C K6n]m{<=ʻN !B!B/ܺ}ed\PG[Ժ{il €p bX >GB!B!%A!B!B !B!BIG!B!?(:}B!B!" >B!B!AB!B!2;[ضcз7NN_\c }냣C^ؿaV^}ȑ&U /3qtVXJ_OiޫժVqBBCԵ!!!ز1YѝGOӫKr}E nS8}' MΩԨ^93ϑ?qE)R{\x6b4wchD~ ~=~uH^=RWܽx 2E g:!B!DV>̚>wرkCGfM~vs-f3TvcuxzmV.w.J:d!/66O߳qu*Qȝ;#}}};1ؼa y2}ՌRm[l% @K^qr;dkSwxx8+V[-ԯK\\=1dHV-_BRS@;Qc꾞9rdpB!BeJZ>j/\ѷ >h""" zu aCٲe8:+hӪ9*El2,7{O>ЯOOXa7oڕ?eJѼu{.]Ju>̧UWjj|~қ իK2)]Jk;޾;ʶ:h߹;= DFEjzEKS7l`xj=ftt4;vut2KҶ}:"#B!_,ID>)nݾæxVcR_Kr:jVY/~9}{)/կWݻ/.]!22zu~d-xy'883_o*wUʴؕ'<<3g#KVYG%w\mRmzשgپs7o޼Ɔ&[N Al۱ @J/ʘQ#țsn{VC6䲵թ|l\fP311AOO:޽{ONݘ:im}y [cG觔{)̝=##C-X¬9YG̨ }gN;:vhǍtSZ,YzB__-v`ffF3ljzư $ھsZ4c`DDDpcϧc'LBr _??f̚KtTTxzQrERƎpLLSCKwfdd$xIM4aCZ:3x IDATؓ/K(#/]B!"+*>@ˆ?Ȉn&ʖ)[$mNFH],jzPRE\@@ @J9 9 ss*U,YO/%G]I.rW^Xt!.ePr%޼aǮ=L7Z)kgV>[ƏLq-u侕ʕ*0nHVDLL,{KXZZ Ir'Oz?OɫWEDDfF uJZ,,,XtMm.@Br% ?^ڴlT=ܱ=T'}ݻ 6̙9My.LML>knu=~›7o׻v}}4jH 166;poW\8ͩ7m!66fMkl_r-ԯK… R M2dnnNLLLB!kla4lҒk&C<3թQ|yWy\~r?׭ó?k aծcߺ}k%Jt0έwu:C++7{>}zE[)iݧgB!B!ˏ140`T*l˭,[9-)&6_??峞^ӷtQzUes֙3^/VTIțПװFx5YYYj|VT,? 6`R)]$þD…R? Zvkk+B jUD`C̟;Se @xDu+01@yWw]{=tmē ƿt_*-[ldϞ]kxOsԬQMӵj`<} i~&.G4i$kh׶1HHlLgnnZǏ044Tl!B!Ȋ|*8jJ[%@cccUO/Zl[wO3ѫ9vvY8wV* 89:0sdbccw63a4ٞlkT*UAA[g||ˈS7{*U~Eq4`Ç3iLm =wMUl޺[whl_z6sO:}/_AvB!"AtXSHa@ǫ_g=ϱi6[McyW **"E q p-Bm:}.Ts5FCxzK\/H,[Pc辕 Fk$w\ܺ}0edIdT/^L5%JeK_%ZXQ._J||tjOҒVK*_(VKoƌL5|<MBYZӦTIgLML8sK qMZhAm!B!}5v"̠~:=/]aʥIZџ([9IժUp-¨ԡ p?y>}zuO/Yb5긑7oBعk/%9Wn8 VHZ=SŋiֱK-)hҨ!G<1jDڶiJ yWp ^tbiiINٺ}TT(.^°!07 ~Sfкe3>cne˖*NLl,_~Z^?Jt${v_ByW5v"ԮU.i\)`ie˔V{Ǐ +_z ^ 0ʪsltߊ% `߁CѦutB!B| Oyr,[-v0wbj5vV2K140fu~%T*͞8x??,,)^(ߵinVa]{܌RM!Kz*L?p֥ݻuz"mqqq+ ,Ep߲"^`,?Ffe^ +++XXₑgގyr:MB|N;a"GԵk7 KsjWR%ٻ [n ""[ۜtЎɞӠ  4.T 92r].X|>w"_‚WwZ x,Y8OԄB!"KhFEŠ^z@`D#ݺvadoQ޵\Y1plٸ B!Bĭw([LuuNۻwM{eS@4?:_H!?cM.匕ޯp߲e$#B!_ ! f`jjJ<߿-!B!:BG]B!B!B!B/O>B!B!AB!B!B!B!WyxDGEaooG;,͹y#FSʛ?ݻuJ<9 bԬQMW1n6_M…a JĄyX֭Z`3?tt*ih)?r>U*3l ,2ѷ :xF݈6i]Ⳙv81%iݪ:slccs [y^'Lƻwq߰&1mN̜n_ 9+x ff_^:Cxx6oa;*U- ..:4^t^ oWtчS'QۭBB!ߒ>W#TV!cfjʋ/a_臣!8Yb)%K|0ky~GygPT/rϕ3 y3]ajLppȋ͗[i]OuM^iۓ?߿g} 57#G}7pߺi'dx|i;<<S')nݾDZ3{@o3 *Ӯmk:t.f)?&&ٕmd鲕(?݀O Уkgmy_ؓp)fRfuF=QE\\j;~vgϘE_ƁCԫqlS>g؈\rD5da PAd{YQQQdKqI~ٲiD Z*XkllL"9sK#s*U;mmsR޵e!ǐ5!7AAK1&-VV鎲dehTo-5(u. *1#QTTTz;qM̜FUa؈\qK9j5gȈ+iܟ6ɞY8GK4g 66%Vr͛5f萁䲵% .o ߗ)iJ%Kp`s 1/7[6UFᤤY~O>cْV;rF!B7d>!/:|j!jVOy"6 ?.\Бtޛz ЮS7</5v"Atc?k9qn=RaSZs`E 5c?ӱK5l+._ŀÔ6~=~qz@MңW޽W?_fێԪېZurMeߺ qqqlش6;SAz5Է_c4h܂a#Fg\)>|RftՏ7n*eһR@` oiERp_ŋ%mNNL~f̘=M 5Q]ǮltkhѺ=mwQet2siW6^Qui-_ۭ&zfiJxbh`[:5..4{ҹCy$Or111ܹujj֩[ǍGk7066jJJr.e:7=woZrK$W.4(^H[?=;0x@?WB…\eŏٴygzێFt)gqZ~N=ODD?z6:Аvm[ۗxYG!BdmYvOLL =ef4 >>_?\ʖzbyWyu$8n޺m;vӡ]ʖ-Ó'OYn#&&&4i&O#-Ə8/_Gݍ[ؾsZ4c`DDDpc?!66iS&bff>j~\cGCG0y:7!_>'/ː#R"ڵJk[koaztBB8u,Sb̩TVU)S ;{FF[YsfJQc'5/DV {ISgr`v,,,ҽ<+)ݽ{%gط mJt۴oFk|j5&Lϟ!cjb{QlٸV#4lPuyŭfu,]Q3wFxx8իVZTIgBCx?g<\2,#~HoGӻF>|]\\q '#VʽyCll,4srDVJ:[ y(KW|-U\)ڽM5p2w3~Up!OȤ)3RRӴRz OLhh^q8kobdd[ ~r<]'Or){VF% \ʖQ>1iL B!B7Y6Lll,moJDDDʮ fjWLFFFXZZ@HH;v[N0JDEEe4jHXXo޼e)] @#KPP0sSٞTJ)<9ZMݕn=wܳ cG3G 133.wrQzLZ޿gAx&OyKnQakTOO/ՋHV3_\_DZz Ygۥڕ$"_.[#ukJUp޳?+ټq-#44T9Pj FI眒?ٳgW~"9~=\+"ٽw?V+eÄGШ7|K 4 pU&yObbbS[szM:nXH_'$}̝ges@T9lK.ϊezXi s6i|651aeZ~ra?!W.[9˻r\4E]Cz꺱r:=4˪T*, :I5r#,T*84kѽwnߥ}j56o~KYuƞ}?fdSt(Vr|$i#-)ck++&COHRRHh(;ߙ\w>K+VX^ڳsX[1mT1a$͊Ukз$$MWLy&L1tǖɩ5iDzu59j^qITT!!!J&iՕ}45Nz뇥%aæ,XhJ*ɰQp!B@`J,mS,mnn|UgZMhX1I1"iDOttL5K5D__tfpC.Z?bFwϚˆ+S242R? s ؞'2Ӻ^;3jTʂKٰi qR144^%^5kTKqsmQJe",fddDIx;9}',qy s3s^~aaa# 0PYR)/B7>+i{ @R -SKKK͜RT U$氱I@``r]C TZQ~]_i K4՝;w:pʿ3q6'Ex@ț^z{SxJH1xToW,MZdNKYlk~4)=XYZroZ+~૑/8[6Q>aa=_Zreێ]L7Zih9r`ffIN f%o]ObEɖ-׮PF0ATAJg$<ceXX7oNt9lތjժh,cǏ ӂzaiiIs)]JI XǫթVq ¥/VTVrET*7nVEFEÇ*THڕs)ZYs(^L U\Ȩ(鞷%0(H#1pҥ}T]@OJ7R dS{[LiBBC;L2i?s9se䧕_Hܺp2)$tVf`>4QJ%McuRQ@~@={v4j/Or:_Ws/$2*iǧ;eM!Bd-Yv@iۺ%6lԨVSSS^z_Ss?ݣgeIԩ :ϝ1u j._@xD8Ϟ='c_,ڥkm佯/..j_̚1/Yb5긑7oBعk/%cll1;g]DDDPR"#x Æ T2THCGxϟN)e99r %Cjliݲ9VS`ANߙ3kZ0fdٰve~m]_]mJ,Ahh>>ﴮʕR.0y._՘S;'z*+ZISfзwLW6=!睞r.eRMk?P^'mbbc9w"9ayhH^:џ~! *hؠ>֬#""[ۜ8Fxx}wᣙ5wkܻit.AXd9aa1g͉ҩC;NbanK =c4mXbJb 1}Тy Ǐ~_d :_[7ڽ ҡ}[y Pժf][ۜXZX۽s)Kp߲+?>v=Yv=QQQK'?ܣO=wŊ.wnC^ '᎟<ͼD];w!L<&lIޟz3~1 SLi Sg0Ζ-̈́9q.1a(C4F %$B!,:d KcZhz׺W6ڳ c:bcc7q * ɓ7M7uӦzt댭mNg# ʒ9lؾk~~Q޵VգVVV:DZ0OY&Wbԉ,^]nfϘJ|/ܧWw.^ƸS`TT!USȈGӧLLsk,_Yٹ9srMZ6oᱫWBصg Gt!|U*du,_XJ:`҅VF^AȊ#u]AXXXg36D<} p.Q\c$‚FѢEXpF@LR̚> [:'JMϊXj-ju=1L/19ЪE36m im=~BCPJNXp^='1<~)gikۦC'R'.J6*>'/1{fffhք}{i166fْ:rg<9sƓxrSRE̜n`.3!'לR;DB!;)tH I[.l۞Ү)v]}V'I/Z_/hVvO#/Lfr$lgmJwfjwNiڤ?~<àSXQF=z*É$G1n*AB!ued<+@W[Ժ{il€p bX >G+L+ծm+?'O}Rӥs*ޙqej&..; 7{=fАt zɅB!Zd]B,,,0n4!!_'((Z5%&sޙ#3*$N9rذf8tUk7$j5%JkT(/#UB!Kdhm}$_93,J}ygVZ:Sv'%<B!"BX+ !B_ 9}B!B!$#B!B$A!B!Br?yEO|:BjU2?fx9[O<rcOft.ۆPVMbb+L:uܘ2iEt]}N233!o^||]68q4=I?h89:б}5>GFF~Lد7ʻ*euʷ !22'OOU>t0wspN5k̀~iѬ z:ԜAl۱ @J/ʘQ#ț73eS0O?'3%_??ݸ c144$^y/!Qը{oƬSp'#B!e9cT%,#ccLR"ޯ U!.K,&6SRExpY:wjS)?cOF```+?w&odi9<ի׹s7/]Kل*+;va¸JӯOOrEfM9qI077wn|(|}͙~f5vvzW\c&iӪ9߸ssseTZuގGdžM[=n";nH>g:}>!B!Y6Dd؈1ʿ ֥#: KJ_tcS<{dwCiѬ nZ j$R"gzil+]j5Q̙9UC޼77:#Uj~\ڴX !B!DzlչΨ^@ȓǞlٲ) ' &QKok/֦YY[i}.ԯGR%dW  !00z jWr$11ɮY___c011I6@ttLٶ9Lr)G.et*iganNA" affƋϜuӋW0c$yDGZMXXٲeTi!B!Ȭ,144s ]zP*X ͕,,OO̗p s,ah`s\\6r;,;+U[LN322"61@$>>LEj_csrH'>sz;s?ڞVBx5!!!i9վпo/:wlYB!BdDߵmūׯٵg}111;Qlqp 5^j5^/Ia=V-}D]Vxz͞}2,[ՅwƏCk3'DDD(=~BlllgJ 䘅 6'7n~jKZ|ʶOG *si԰˖,qUss3-YM=B!BeGԪQ[n&?x@jU155+~8%K:Vэ2f$vCxzߘ:i'+._F\\~~~\|7oQ-}>z̠3{WIY[nٜ56roԨ^s sCz:V ƪVk9FH(T?Sӫuuu!{NnyǏWa`_/ϔ,ͱXZZOE>~~JLLRӳ;. evW]g J?ɴ>l]аA};Sֵqqql޲SۭR񓧼{>>ܻ0lms* Sog[#q5K100B!Y:0t@J.#Xf=籧7ЮmڪW6ڳVP >fNQrOSbeiIbE5} jV(V'>>%ᇡq)[#Gbw"##LR_{Wuqu*C@EQ]*!6\iLҴܚiTQYj8@DTuWB>~^n=3J,Ʋt*ްP(+zEi-shOw>I:3l@[@wmG XZ>Ʋu|qyfȠwW&"..ţ:cϜ-_Reڛ`oKqJq|M+ $,\n_{bX|Enp)Uy^C-O/MV^?ngɢyϽ__DDDDD^cOPL_|e;OC/Nׁ} bX >06{<.>>_6i{iڶ~_ dEDDDDD*/y‚6>{L8.y㋈fdB }DDDDDDDD2!>""""""""BLHH&}w1`4iOF؅y s'"Nk:4iIp_ۗ={'CxyrTӺ]'}trD۳lŪٵ{^޾DGGKs588]kyho9~e,..+WӦCg^oД Vێ|tEZZӸ'M!**t]4 `am~]1ҠIK7hLzZM;wYbiCrʕfc?>G|ʻqfZ넏ocrԖݻwv|8c#F%m'*66{;;6{ < e/pqvG.IqptdtՏQGR%@֭0z{. z666\% g҅XYY=)'ҷ ULNTfgFll,=NSUFp-/6dǫvM֩?`߾LSd@FofԪYŊq|i3-73/gɓەGeӃݻPzT0 ړ? gg'Z6mqN]u?GKFDDDDDD2 ܾNll,0#!::HDDjZ¨]Fմ}G ٲeZPJevWf\FuD*M;S2#*Wh:߸Q{XX3i8,q&vI60L36ɓ'눋ptp\w5̑++KNhƎܒ+YE{R4oژ) _^7͘M+)]Ԧcܿ9լI#w}:-natW\[F R@grV~67[4O:| T,229һg7ڦG!""""""X }L0gЮ5K2bcc5kyͻ.(_'~"gfJrVd | ,oMsǏDM #ŋyxzz> `qZ]ϫW>z}-ݺt2 |[ztLbr,^ ;;;zvOF#QQQ З7|_B_1|gaOX.U&];'Pb\_Be+V;k """"""_ }cee7Sg=ya،#IřI#ǸAU{.e˖Ɔ;B ߹C.|fyf'®? ڳ|\l,YfISM)#RS[F%KjVگӨFcEk@oP|9,,,9k.ohF\9rz, d%tߗe˘P,$**wXn=Lg>{~d$QQQei""""""ydښ%s{j_… N Mr-$$ĬMr `IӬ IDAT~)#R.>9:8PTI:'tY>WMð#SԖ~<7|KѢEXr #WΜ\~h)d֧h_F\9ɟ3/f{=M~O!#` 81 2dB'""""""]ZpYf]k111ڛ\qwGОf FvgdF=xW׋iS'"<<g''ʕ-áG8x0z{.*QU<==$C>t|a'::n񮋵5֬i ABGw-I`iiw:lGHq O>EKXz5 7-~Æ dμg01l߶ gΚƂEK3!'G*+KY$kL2a#'PJ%7I~F=qtp -dKJNjjR$(?+aCs(^obyTT<]:ver9sItdmU_r]^y(S'O-OkjF}bbcY:ٸ/Nׁ} bX >0iFȿ$k,IegO6> koжC{b/"I… q_*T[H+g-Q2,""""""/P ǟ@BܿMHeiiI|y_v"""""",--XKyȕɄdB'pwAoD]`1w""8z^޾A1q}ٳw8/_x:F#~O^ߠ)o4n΀CH]Ktt4xyrSϝ7o/.]~刈d=}ϜW7PFu]-۸#Lm쎇;w""ذq QDRؼe_M?111#FҿOOl\[ZZR@~i c%XZZ2DDDDDDDСO}|~=umk:ԢM?6k_T SSF5ڱqڽ6oOy)̚ =cY9ɋuqݻʹ_v9"""""""f_X)Xn=h*5kkkjL=|-w3CDDٙU+3)jrɛ-%ֵK'~ܾenm?H|\<5kV}Ȓ%KI &zt%h~Lf6ocϚ?qN]ᚈHFawݾNll,0"::HDDjZ¨]F}o4jk>Lra56s&(PtvuWW5i?Hn]ToM5zlڼ]A{Z,lR|8fk yo:'_^7 a K f̙=idX61I$~CfMj)R6a-UT=U5!K4{-7nTJ=9N^7n&s]~\i+VҒsΛBlL-[ܹ]wKDDDDDDEɰSv~f 8=q'o^7la$ ۋEK|՗L5|ҽԫ|N ^bmׯ gΜf| %111xeM:1wkL9Ǭ]Ll,7C2?vk׭瓉{.QQQ܏$***=DDDDDDD^ X[[SDq:wTSPԕ);!I$ѿOO v׌?E /iVV(^d_P~= |_{Ho֙U$KO FLl, Or{~T\O?*17piׂͪ5\awT쌻{>h|`2Ȯxt" ѻgwʕkٜ7Cz}%R -!>>͛@ѢE8u IG^Y"6uѵsG6^= EDDDDDDdؙ>^jײ9,3ԪQ;;;.^̖(Yujz.:0vDIu08Iƌ|4sAԪYB `aaw[a-R4ű֩MF =o/\zDİ}G _*T9>w ~o#Gk>Fw5a ѬI#R/|2f.*QU<==^FY"""""""Id^.]o6lb֜DGG׍|bmmͪ5klL ϸFGK`۹z5+++)̧>Jv& @w ڋ^-ʤ㨖ҪbL:%V0qF#nyrSzU;̞G"""""""F9|Yaï?~Cv,["M78y+"EDDDDDDD^cOPLg7%8;eoH bôMGDDDDDDDD>""""""""BLHH&GDDDDDDD$R#""""""" )ɄO  B&-߈v0obDDp }MG&->b xyg$?p/o_Ν.n /o_.].%g=xy @xx8^޾:|4Mnϲt/yND"""""""ie x3 ԬQ{`og_/y63vS>=Ν6l{G1{g,Q߸r5xc>v,"˴.Z.CDDDDDD$ W7У[ڶ7C-saJ0~6U@{>l3 F4nԀΛ_q:>oo$Zjü_>Pa3C}f}Rj/إ4ͷ2qӒ3obǷQs&NBddSkTTgͥe6oD}8z3?dڌk\/$2l/Z* 4fH(..i;k?A^=2#u锪~'O"$4ԩ]k++4]J۬g Ż^Qث 8 F;!ܼy6L0=1t$6}s/0|`zFP^|>#qF{4?nI6o1a YK}{n/qN]uvyƒ; (NDV%,,5kgFSt>}G ٲeZPJevWʻ^,Zƒ`gn<=)Z0}*WHh-6oF*R>F jlҴlՆ?HM '*`kcǓvd܃s⧓Ll2ʖZ*\̊UkxӸ("##3o!{v#KPDDDDDD$ɰIVVth:IEfMeF*pfXvvw]?3?St)b欹S~\ϱ'pqq6>UZ;w^ M& l*rvG-%Æ>NNٱ3x ޞyL3i_\\Y}{hr/_^wyzuR#ǸAUL˙ʖ- wB9\(S4;wSǫ'~:IXX>ƚ .;R`ecp⧓,xC]׋6pqv'ulY!444ٱ!,6>Ǔ%KT_t ֮['Ǚ~QQQ܏$***""""""ߐaCkkkJ(ΡCG0%B LI]ٝLbΎ}zҿOO_f-Rw|Ɏ}g=cOLr-pmzw:̞3(vP $엳+h/M1bbbw~xgwƍd޾}DGG#Gd;:8'On&O"s-zRp5bbc8dxk{JJ|ɄP kj:GCB!xJX.θ#h^Z6oj B!{l')\=}JOԃzuh޴ٵ s8zi?^|,v=xUKSXbqppx^cc9t(vٲB{{{lɶ=p01%^A{ba0+Em_B9f#t|a'::n݇4]kkkVYgfP@~}0,<*]~իXYYQHa>Q3 aiW^7$%=ɳw:L9^}%I{h|0z= HҶIDEE1~dUwMql 'eU|a#!!8::PWhf S;H||iiyq܀X$aï?~Cv,["M78y+"EDDDDDDD^cOPLg7%8;eoH b4+""""""""/BLHH&GDDDDDDD$R#""""""" )ɄdBV/Ć<-kդu@+8z 3@~O:vhK*8w]f‡c]b؈,?E XǶ,q˓ҳ{,--ع;5WG.nOF ЮMڽcdz}&lllI &jE||<_`@:wjO֬YpwχsҒ-[;.^ĀAC1E&,{sa ɟՓը^wt3!_g.8xq}3C.^tR4i+++?ISq+[r:}_}""""""ߗCjztBuE8F#cOƆ3l>)'0XYe[dɒѩkOv5k'alܴ:ۘK.pj0#|H&-ߠ)C`+WI@ۄ~ZŐa#};3Ntzuj}׳qΝ4#GҳL?aC~,ժV1#:lO/*[~ܻ?M}7}s/0|`zFP^|>#5L9ڵjzօ !;5g>>u0n IS9O'OPjg;k\G (ٷYgc@>=;+nѻ߻\̠w1r{3hpbccqN/YNM2# O޼yy 4ocϚOyO~O%p==0\3Lj7VX[GhټU!î};Xrʕ>DFFr'"UF51ӟc> ca0P`jת_K`00qX7)ݱ=򺥺 c cy5S>PREnM:͐Pf͊ǭ0oow4-^ ׮_狥+Ymtt4cG0 ݖ,_I\l,OʔƿM~ؾo~t4e>KWFDD$.<|9@]y5tTDDDDDD_dI>ŷQsZ[Юu,Y4iS'Ӧ[ڲdJ:w̥;իU1>^ko4TCR%^͛!@B_XP딤f2Յ C{׫ù2Ь IDATH2\)pttxbY-\N3ob~WÖ`+I9f޽k:ݻg43MaqhޔHJ6'ӆғSv~f 8=q'o^7lmmM׬\pߔmRbaaAre(_ {g豬z]d:[7)[ZZ֭0F#NN8?qʙ#>pq6s\1DܽK,Yvx8vIО}fbcɚ5ܻwma/qttyt~`ߋdED5;71qHӰ雦kYd-MfJҥv̝&f.""""""S]emmM9t=ROBS|RW0$$%$$ĬMjծU\9s6)N'6!?hrȑ=3۷ΧfʲdJ:D9r$ɵO0{~oƍ# 7 ߨ놕/]6uwfNbfWiV"!{}7EDDDDDD2V~-߬Z.ɵ$Ozggg/FILF]A{pwO2q.ܭ0nN2I&&qb={0x啢Ylll(P ?4;o߁zb ~-qM[w4m0Op͕ʕ*ri: ) ƌNCykO5mDw#(h/˾X@nWWZ6o/b4SP! hϬM?;ww@ZW\ܺ?Qjxb3Fű秓t2ç~f4k(ӱ};'S.3|2qSMwSnMTT i7d^.]o6lb֜DGG׍|bmmͪ5klL ϸF=3<߷7A{l*nřb¨(ZS6iܐ(OLtt4ujNi=5^G[Y_He۫ǎ.[͟ߓg|jPfB%tD<==ٽ 666|aao#Y3sqqfi,X9r}rpB)\%K|bcȗ//L*ML/[ҥ?v4 /a׮ 0jON6l+[q&ٲeà vyyr K,7ء};-_ƆFR?o"8_EDDDDD2cOPLZCrSM.p Oz׮`m)]kN:ͲiJO:۵+y7jByq{4qqqOy%"""""">5g~|˽ɕ+'Юm]ZHX*Y/6y>3S'rL!K,DDDDDDDEɄdB }DDDDDDDD24>6,ZߪEDDDDDDD… M| p ~we.7Glmmiۛwv @4a4>""""""""G{dB }DDDDDDDD2!>""""""""BLHH&GDDDDDDD$J.1DDDDDDDD$C0>or􉏋ՉH'D_#""""""""_ DYO6ݪy3[Vݻw/ &y+`sğmF""""OL>sIJI$OK$/#~.Q@c>9!!#} } !̱QcXcXt|I7m!!y@B'>xV hH7>A 'B3}DDDDD6Iaz {L }'CKxpBdv }pI{x/?=vcϓ큧6'cHzu ssT*J2Y,s^^EI7hBCCq9[8TjǑ]yF#fff(,ZhEщSK婟}%"""""""2MO^"V%$+"KFE()))z9r<`0AAABNN$I(*"*RT*(nDDDDDDDDTAPY,,ˢ,ˢ+Ȳ, A@Ɗpo&MJ ((ZmJ4JIr m;ڧLNZc.ofqƝŝ[}V;ls$Y.zOG~elRS?xF.^P=5kTgcǑUDQ_| Ōg9Wjm$\īW]Ux7 j[yi""x{{I0ԨV͍35UEPNm8y&:YKU*U$IJ%Ȓ$)JFFoooTRbClh4*N @W*"A RnP՘f\*~Vjԯ7nW>*ŷ`+WJs*EEW踹-UEhXq""x{{/z*mק}R+"YAelM;2SEEWQ s | =h`6Qj=3g]WYraQQY\bN9XrVq>pǹƺlfm驜< " 2n=4ʆ^㴬U`ʸoKnw|*LdDQl9EWLdl1BPk-IDDT.AXϸS{4i[ls(ڬ 臺kh2cXr}YΝ0Qx/]6l Ԭ^ Fd)k #ѬqCdfeaƭ^֯}Bzukױv>vСmk<=%}1x냏K]8O@lw7 ?Ğ?FDzp=) /^?eztC=+oڒm[m[0ѺEXlV ƄѣР~]$%`U9eؽ <=<Щ}[^ lޤ1FjUrU獿zv=ݏ gd``;~{Ax{!& ӺʧKE#DCNkXa3=3jw/?lغ Z6-1ᾨ^ ,+W?t2=';wl}Bddfb}Xq E)y@DDT@JjZm3SOm;,-C'!?qT 3OW,bEj;&""*3uh!וbkONxYYg>@XxyS8|o Nί#lj$\N(ع{^}9=-lvz/=3XRHN/ ¹Ϯ0[,hܰ><|'q,2?ނ,˰X,P-@իUŠ~f5j2GDհ!l۱ zsS&bs w_>\VgIw\L2{Ÿw})0mfsrmxؽ h>Tj5ŵʱ K=3q ӓC8#b@^8u,׭C`=`ض_;M1icKt"@v?Vo؄K c;<;y>zʵjUCC ܔg^,_ֆC='۴ Ǔ=hP \]ト icĞ)+e\ys#gF ]:}SO`7#[hSO8F8Urp$N#IJYݠW2C1n9""2]:=9a`رKf;|o_7%- 3md(P V^۱HrrsRl[ڶjZ5kǥK x÷mݳz'܃Q10S-s[w\gzuk#܅+JfUd*.?6bbOEXs$'bɲQ+ەc٧gw yX,f &}Ծ>ߧ'n؂U7GFC`p>Z‘> ?_=Q^[FQѳ}ctD19b8<6n~\} <_\}N'Oo_R_Xy+s}|ѝCELx|G+\A#Ux(ې+zWMŶ^6Λ_(YSm[t 6oZu]VC$("Ȳ, G,痏݄ﺯ%D `6@Q$ZO0<""aŜEk\Ll,_,_;>y $n횸ddi,:ڰ~]\K7hm]CCЮuK@VAE$$^qR㰣X+Wj_bvQumiKz,<,٬ͮ;e=''i plgn{yyt]9 Xn̛&@VcC;}yF#j׬[9U N=`ʄ1ԮUj-Ԟ=b(t: ƂxLBb"ܳg✖-9k0vCnw0})c(UIyQC#A0f54zw|HNצ?Qi QãԒ+(@ӣr[xW !x)EB#Nh,I#[#A]$|FHD(f]ײsrqoE^E{3rj !6,#7ao-:"e3:m+׬GB y`74oЯ3 2fζL?˾~1^dXJ*g;ި[3b@ZFFNn.Za0ٗYj5jX{Lffi r(ӤQ T8mYʕt.gz5jKy ߼Y`߇ظ8X,[t{9͛5GB7q8[gAmI]bAvmnoؾ .'{Y$ 4um1bρhҸԫ_ε䥄خ v}ł Jy|ѝ()%s?WgU(4Ih/9uBe!hHTK7DEǶ Nm M Q1Jm39viAʃX9"Y{A'ADDtY= G(6CNݒ_׽e4/>={!/!AAhۦ%,h+nlʱup<;Uq5L?dYGYW_l6#YBF Vgr@!* <$^ҺA9X7l۾>GC㸞n]Ea2!U\].Wҹ(r]9lC`#~VCV,ٰ@Ĝ: jT ӯl،&é38z"͛7GM^E9Ll 0tM6'_|c_?1*ڴBrj32*< 7hj*};lwwz='W^iSqq1ԯW–m#;sݩS+oX`hXS.S؎QVVӀٟvد[#kr,K@P p1#""ru_~}]N!/^.*&s?C>)B=̬F8`*> >yAvvmmPr|#&{ ;4nƎ7mڊCG]V=r|wŠczpt YXnVX󀈈lInQ'qDZ ^ ԶuK‰tuKBtt$$%%u_P eYj,{T*/EQ,zZSEXE5DE*._Hp>{m{{Ƶ!=Dt9IDDw ooD̜%%Iz |0HTA$IE`2L(EIUT.]!!!JXX#h"HU~%@P$HQD>'.кexeW..54U- As "A E05""|Jt{s&Y9/2<a߶k0 2$܍Q1N'nהU`GX"_DDT9'+DI""(Q8-&8bCDDDDDDDTn@DDDDDDDD'GDDDDDDDD#""""""""r9r厝*§Z pguDDDDDDDDA{VġjDDDDDDDD#""""""""r948$DDDDDDDDD$!::Zp9Ujp^GDDDDDDDDw 9Rp pS{>r=zs_$/³Ͽd_!EC0vd|0\zLl-|u8zx'?o[\vNlܷnFen:>DDDDDDDT|G}R^OL5k8,Ek5+Y%K/PL<^^OHŅPZ5ڷ_{9,_f+ڴn尼V p~tG[DhfN[׬]fc IDATh4 rS='bMn$ [&1 ,GbAV-1PF֮:F6j!^fVY+W"8(CCߺ =z<:r8;t9~^ܷбC;L4:'M3<[n$<노ᅩgc1{\2{tU̜vm`F^ǕW;׷72 & !+,p[Q̜.`PFul,Z%Ԯ]l9>T*|xe,{UYOOO!77WMTݻp{İ!xj.ۊX$|-ؘ v #3q%%R%t!L,]lƍ ء=F#~ z^^h4V @Rqy1׫'&Ta붿+W! oÊJxyyw޷qy({`;uPcg8cOG-XۗxKWgL/v]ٌWgL|̘ŶO!""""""v SA:u췫С][{hh֬)N9sӂ#̝3/\ľ}q"*6oŖwFሌlF8۩c,]222:ܮ^ccOStNzus澇BCnسw?V~c F6:wXZzA8{Eem5nԨɱKſ8,X,GzuQ^]< \KϾ[}223O<:yyy:VT0۩iis(iyc5j`eٯ9+j]܋>vfF&AeY.5*, 5%-&"""""";vQE} ŸW0jԨ#q2]h4`08,ء=:vh?p_~_/a`^GU+r(^c. `R^))գi:dp֫[))m ^ z:UY#""h!))I4h $%%ZV#ʲҘf-QE+f5~7bbNcтР~nM#)9Ne7 0H4AdYhLfQ޲dBBBs)z^ Q”p}bp ?.%?UwuhDDDDDDDDe?*##|223Ν:'fmԌ/Vv*+3Uvbe7nO )GDDDDDDDD#""""""""r9bpDDDDDDDDDN18"""""""""S )GDDDDDDDD#""""""""r9 $%]EQ*w5ł4( 󟑕@Ր"[)>>kתfPޝABB@?=*5TSRѬySVvSsSRpT U:EQk@RuԨQCDDDDePi! ( *IpPIfVx'"""TZpiDDD-y8 9bpDDDDDDDDDN߉wo܄L&Qx_UvxŌW_EUBBе˽?qxyzk֡n:hӺ}`o+@zjnk{ẙWo(rS>`-kϻ J,3d@Mmq֯@Hp0B7CnnV*5j wвE8 xWfwāCpuȲn}n.cӖ?q&.99hެ)<ԳL5_Dž߬1xcflupt&,}: !8t08r<ڵkAXp&,;1eg՚ux]OQJ;,Td'}K N٣j.'^}q"2 s̮fw?,Aѯwo#==GǼߩ&**:%. IDDDDw:8]K?FSI*e7lF  Ehf]Eff @[ږM;B6oy[A@;GÏ?E㝷"w2A*xLy`]6קv+O ,9yr2DƨC+u7v|#2<$"""m.`0UJe}1rPtr}ٶc?{OcmC(f|?-]TVƌF*U8t(п__t{]1] IϿ`Xp{1d Ĝ<FrJ*7j @c_w՚u8x{yy>t))xmlL8Ʃk zqgb3k{C^,--_-Xl6#,4<9 L4yr_[s!qׯV-Nxtx$a0߯/<1ohW7~~n91qOXr5^ZjeeVh-4l#=Z5o7fS#G!IڵiGGNWNjÆ>/^OC.eMسw?y+ gFxW^zL})b񒟑{:uMzb\W1_-[qEPjU<ܷC:[+VY 4kǏENv~Z _@H(խ밍;vb? 9%~~~x{7ѽ6Fڽ]:7ZvX8?pr" (u (c$tΝ` Bg0xl0Ŧcv8Bbu`!YzVdiHMcafqO+LeDǜ,9tũXYjѾm Zǂ.ŋqW>EQh߶ & YVǟR0ahҤ1W]wXwמFݻa붿XJK륥C=S0l`$^_~]m[战5 ]+xC={]nL& qqlܼHQ̜5ǎG'@NN^|Qz5 4KZ?-FNf:þ\ѸT[pL^ >2Xo._aC =3qqn=.1'Oa̜U$TE_ӧ`!4~, y|gHMKs(;遷#faƴw~Ykڬ)DQĹs]nKFbޞ; ">2 PThX $x>zoEw?X$`p/reQ^]yl~r2ZǂE#:&ơkװ~&Esyr|`!B5Äqchͷ9lo݆uJn <9];wUk{Ͼbt%fϊ1xDV-:cKQ|pB1i8ᛅS`HfE>5k 00Բׯ'cEQЯOotVハ> uGGZlȨh;vaBbNgbr&.0inn.XaǍqݸq#7x jTw9U&v݇u.'&R|<}^i3^uݪe L{9{!|94oЦuKz|Yn=.fΘ`|Z̘ŶO;auAODb$4m&{c"00C C 0~h̬,Ҡ~=*;L\B7C||Ξ;PšV͚,0,xb8xyY{I 0>3#t[,8˞{Izuvhf{z#«/OOK p}y`;KhPrrri˟xo x/Qٌu7:~,(==*fPJ:/6:cKQixՙ=;8ݗJHGj͗6?ۭZcV[8|(?pKul$IiҸ^5D7ΑrgNDFY&%e+~zK5hܨ!<ɾ, }닐2 """";NųO?ˉW3gbسw^ 7jT:[DYU,iz85o0OU0iUa6 jga$^()x?}X~#F Z{!$8M}K3ũ[EDr̞36ASbx@ף]6)╥9ڵkڵԮɄLMծU/ԯSoiptE؃Bhf;{֡lMV/]PLmh4S=8:},ZBt\BqY4na+5WFlmoZ{#J>밬V'!7شe+?4X,dYFBÝjT;p|-Ɯ9{h۴Ŧ-[^O RI)ȾZ-cNoy W_\}l,:?UhAμ7sȄ,ː$ ׯ'rSN#ysa_ިW.]wKJATPdT4?Pz~zk0x<(͛5J%RBBBt,p[G65kTG!))~8׮nji/QaXwqZ ̻7."sGb2cr*>%ڷk>zB Xpz}7t쀕hۦ5<S&nP}r-QZ5L*8Ν:"55 E߸ fYu<>Z1}ro2ݦJ,;N!IY5*)nfȀI[z\̫R@ #3\۶9-S[4jȨhȲAiAL&\G=<nu)|(A\~, NbЀQ:<=<=}ڡ&5ku"CvZzNÇ>ƙXf:(:s@^\yl~})h:c6_Ç<@h5,ZcړGqq$N^ KIME+/9~''q߱Y,QcADDDDw;"8*($$asʾL@*4?1xVı'caOjjolЦUKٷj|O\k\t ;uD``=V\ZZp7NKIIAXE"n6???=]dyfVV3#1 5`6OYŜ<YѠ~2q6vNwj,;xDzF:T\8w|!;7[u.ؗ 8yTDdCqQۤ*++ +X ??{8j[aEիUN[JHۆL$b8ԱX$DŔofa5ZKVj́еKg޻1ZVeyrc"z/ ._ ˉHNI)NI5m߿)Ȩhaqy?pBڵp&ǡ-v """m --:GHH <<6j\V㟝hݪ%Bk^;Zm ͛5Ŧ-[qnbOmM 0 ΝݤQ1̄"HrUSv&{&;DCS6<{:u'jת ^l/PhҸuwŲ~`]._ƯDq}] ⭹8~,T*_UT)koV-Znڰ} IDATz" 4:6oQ`neEQϿ={tGJj*VZە:(83{C$Jbާ澅aƴ`xW`XyjhZt'Zyᅨ6 =#~}GU,`I PBIG*"z)(U@ATWQQzN5 R$5{'eg97p>gdNt$+??gQXQ듢ޓf0ӫ{/TXRz5L[ +[vm_~@$&& ᓝժRN-7QR8˗XߦC2d|KQ8;;SRE֮žӥ63'7oaptt7WNTylveמf{{T8wY {~ 5kYz-11xxxT(|˜ =u~x{yѤqCH}yxx0t@~yqqdA@Hm8y {{ JLk)oU,X,)Un]BDDDD Ryhȑ# G5 2f!>>p6bx.yt|L/%{V !E }tܵ7Yտ߄ e҄q۶{ӬFj4kY\tٺ?K}Ktt4:wdg'4yhB a0fs4`7񮮮fɔc[|||,AAA#GZ^q_GrMztC%""""O)8ʤL&&LՅ/>)IDDDDDDDiQpI99913zi !<!ȿ["""""MƌdN DDDDDDDD$U DDDDDDDD$U DDDDDDDD$U9vtLtFuCOKH)53;xPFADDDWTWGO$E2Bڵ3z"""""""EKDDDDDDDD$U DDDDDDDD$UTl6sYbbc3j"""""""" WW ,eXpL^Ȟ= """""""̸y3xj}fRF""""""""i#111OOq$""""""""Rp$""""""""Rp$""""""""Rp$""""""""Rp$""""""""<̩g8roGb4qww#/*hשgmtfFEDDDDDDD$]eC޳”)UBXXS\L[e,5[ QBy ?!!{L{yDDDDDDDDLL&RuQ||<{l9R͛Zg}\pȨ(ț'7U*WZop?&S9s6SgdDDDDDDDD..z}fXpd4 ,Q݋G""""""""*G""""""""*G""""""""*G""""""""*G""""""""*G""""""""*G""""""""*8!!O`3j"""""""" @ŰzqNGǏ _^e˨!c:u 2z'}˩g(_twL0NTɰjfYHb~+ǑJJJJ> """""""_}9u /W;; =zњumhC/ӽL9ħ8nH5lʮ{aT""""""ώy QaSOZҩkO~z[n^æL }iw~:Bl\qqwc|ŗ888ЬI#\])??Fc gTX!FL/ԮYwo-_.:w`0dDDDDDDQ Vd}]vMN9m[2o2D, X#bRfH,Fw!g)ʍF58إ;MKe.׮~9wo{Ϸ{>9ݻw4y*Ϸ|vw`՚eM֡3oɀAC|4oM^h|q/ȿ6$]ޔ|/wIzO瓖cȺ y@~m2h0Ν`S'yiԬ~m6uiU/ y }KZB0h.\dӖh#l;z mA6}&/{MӽWK^-Df-h nz`'O^æ\zզ3#?+ߤQ)߸AMY~/P -ªkٰq3111iҸ6n&>>ZɎФQkbqQV H̨1OcȠ)UIre>_й㛼7x ~ml(ͦH`+V`u6ví[iܰFeАadĐAxo@ Fpuued̙2KmIoxK g#x4acWKh>!En__޽O>ky;~x\8;'b̿m3>rٿUތ=}``ԨV[ cμl߱ڵjI_6{{{_@B:Ȗ5+H`aZ2;wb۶{eL5P8:tfM4n؀wLl ŊlRZ'zv/HOmlڴnM<8B.)]$];w`ů=4xx昪U*Flٺ͟L&IF=k5(UffΧX"pu5O*7x.׮嗒>DmDY]sn<ĔIeJzK}ːAp)J֭ը^ͦш?ϐA=7 W߰'[CٷS?@>)W?ϳ$8ܙ_2yGkN,Z={[lYRJeV]o=nԩU3U*UilΎrq/3ޞ'2uD&MGNU|=DPq&4}۵$^Й&/Q\r+Wlɗ&4ZYzn ;EFFQwpl06xM7 ]}6 <6jxyyZCd+Un_C0{?lNG1cgi>k <<<(T>Y2z3fΦoӛ3go4gIqIibҥmct|u6nȰ ۜ>szuOю60m$$$p5gNgΜ,;ܹ}wIsM4lj'Yvujײ6)’j̧֤}ܵA{6N9?vTP6ZЦU naf[@n\`:@LL,YmS7,,beK-4eڥjݤ˜[n$F $maSo`v_#9L"+Z!!?qZΝhOS'""""""pl0>>>GY˂ϝin/o^Jb̹IK IvYvթ)>MёZ5?r+W4o]l~͓~ڵ}|pM^zv kY\\u+Wڔ_|sɶ5վ %GfvQ})YժT37CBX4mȦn X2cMF#."Z` \a3Ҧutȳb]ě9yժwQՕEҥS^ l*I&)͛fOn]:1p4n#G\2/WԪɚuiִqii~UTl ~^yE $::OcgSiPXQ\]9x0/^g.v?>Gnn)]|_^,f 3K1 GKo`ggǼș#>SSw33e^=غw/]Fĭ[xyzXaCߥpM]\(X^^x:5Q̞;а0+ʀ~}OtqcFL>x+ƔI},""""""Ϣ}0H(;gغ%_}uwsca|9c[LΜ9xYsҢz*4I,Qrex['Lс"4lPߦ^jUXn=M5m$3 =,+ Ý" ['\+Ɗ_W˯0Ǔ'On`P+Lbك`Ҕtww7ھ9ep|o?wT퓽V]ß?6Fi8z!$$e(T!$$hm4...񎀳htX,s+デQTt9PڽցaCߥn?:ODDDDDDϩg,x,7oaGfBL,>)S̟33F&LLHh(&{`7n:yF3/'͞ ;:r*&͂xa=wKm|O'mv~MD[ޕoÑ+za'kigѼYFP v @ q/]-mf=Iü_1itoݻ899{""""""vtkW[Ll;+(ȗw^@T<(}{oOӤYۭS/DDе^K긹9Ų,xxxpIYNg*)GS?}zQz:*ר  IDATɝ+_Μ 7W.4n@cgg;|4mATd^^^TZÆM6*WH>iަ-'glwywO5x_eb2hҰԂ3:| -Đ?_>:wx:k{)>8gΒ7MUOr1d#m_ONyy(+Q*i[qpv6F!_ЭKGRA2^ *U(O>qxN>(^ISݛ .B߷z΅31ի;S]{үOord͛8xU0_&Mʏ}шMի9+ƍBѻ/ 0f܎dڌY;y z&Mn]:1_M{S>N>k֭g9q'OboqϚ!Z6O9uPDDDDDir*AŊf8:9ra?)?jJ6u?/H᧟8xKͣ`ioQ4)۽2l8 -[VF?-[)]4nXM?vB NRj)[ޏ+P?~ԬQZazغkIR"}No.z.7mQp$"""""{+H c_m#Lvmyuˤz+Ҧm{-^ʈ/LӰsxfF})V(C fjl۾M[tɦ5ذi3/iuD3cF~{Ҭ];ѭܼB>wΜ f¹ 0 ۽bcVzsb3_|P)c׹r]{԰)ҭ:]Cȗߋa#c2?]2up£ 0vpIZ;wu+~凟~իbXHHH (w+UT&ЏI̚_-aİ!)?z8իVFݝGʕKk:;;3GJFmy""""""%&6mܸqx/rkFjת!.۴]`kh'w!Iѣ˛y-ܩ0p2q·1m+)='ȒŁj5l?[ΌMْ_J˳|6mwiִ1}zu`H{dAϿdǟЭsGʗ+Gc؏05mc|C]\4cgg_eҔt1aa.U2E'Q6eٲeKdk&4[DDDDD$M8{ѣ[g Օe={i4lOOOBCܗh^9[xxϭ@L&oHYۧr#X$sqqy t7^hXٽS'-J/7Gݲ}|4%w$c".6,ۯ̛+ѤV/¦ 'Y;' a,[>CƍI"tޛ)fIѮ={ :q[S{?aS͕w~}8} Ka#FS$0~~yW2o"-N3|vooSG&"""""2lشAlF@&YxDMA)ti.]g'lrRۛcO(j]zD}wZJikk;;yox*VN5.MflɗϏmwIjUxnv٫(ԋCdfSe/@>0\4E>)_txնb%a yc'qֲ{ERDDDDDD2DmwdzcTo޲go['x':2{gsGn+x1.\HHh,22S<@LOnxoxczuoi'lFzEƏ~7=AlYvOӧnstf[,,#/OF DhPB9֭ĩgN/#.صJ"E(n˾Gu游pۿB) d,_+CPbTGMdv.UpB=#ƥk4Y7,{w~ky}':ƢEqsseq6GYVjV'|#n !4,1>5ֲ{=lܜ(S槠̧bsY?vqWX4'|=ؼ{{AYuէp.vrD||"[6N@5|f:t[RPWXQ#غm;7oqʗ+W_^ޡ@F>ILLr ԟaG[*Y_WիS$0Oh}cݣ+3̣xы̫m_˙m}gg_2lhY~Kɋȿ2I|.4iԐ_l͆[R7f$?geGR`':>ww>7SFϓ7_oϊ-ȧ>b܄IzYf-SY,I3f2e󓝁sL<~~yŶӯllǎܹsLm˦ܺKVVxyz2j{L3Dݡi4i =NKҁ#G4=zb2*Tbttt6fxGh4Z,wCfx#lCn3W=wA];wx1۶Ci!`0Dh o4]]]&)lqwwX,#GLPjjJ*Sq$""""""rZƎz-?G$ߠHDDDDDD2:jPDG#ߡHDDDDDD2=\\\2z"9HDDDDDDDDR3Dk=vO(n=ǢG""""""""*G""""""""*G""""""""*G""""""""L.CP?-_A_޻o?6%vyJsqM^æ8*-nߎ^æڽZ,^uz*66_-ڵ6剉6mf-xS7/'6_t'47rXF!}y)땉l CS{J8SF-sl z ϟ‡3;y;ySW9ӓOUG.%*2+~a#O(^S36/L&I,YXq,j %+ԧV]{+bcڹcVDDDDDu߀_A7gl;δ#v4MTֻ~%'g6vjoy^8Z$MZUѫXx {t !!ҳ{W7[dOr߁+S&G9*n U+`/+zpTJe6mbc ,dzH& GGn'_^V@Z5~kmPp$"""""Hmɕvò0 |+sdcg]qpH܎Õ!4jYW,4m҈%KYq raL̜5: L9'NH>nقoj|׮_'7mZM6?ppi)O߷z?>N:͌Ys8q$NTRݻ$M4y* OAsg.TPڏdbڌYlظ;;;6x9|<\ɓ'׮'-} `?prAuie}[~Y0\]] ,ϐA-[6>s;w"*٨\"ew:`^FܾlڼZ5fS,]-'N$&&yy+Ԩ~Uz_W1sHbjLԮY>{XgQ%sʤrlϝGδj߇۷#y 2ygs8xDkD,Zuu|~yyԪYCwYx!9.} c,[\-*/G.z=DDDDDGZ>s)S|rg.TT1M$;}i|g9sNi3VxWiҨu6◕pH`zFu&LLHh(h@ksqM&O降^mW% ٓWC#94o }{, !۷#Y&O ireн[ >1 <g''.^DtL_-aebkJ*S9g.._ e#P,C ёF g!*{u9s% Fc6RO?F]ɛ'7|#FeրiƬ9Y:7o~i6 tܺu ,tw77._¢%Km;߸_-k **}p:}г[WgfHGKѷ/Eٴ7ڷkKll,͸1m^vEiڸ!9zQgTx/JkAE{e1h0ΝЩ\Mxw`BBB9g M76j׌3Bxd`Ƞ}'&ODPqʕd &L䋩>X;;;_Dl\S_!0gO\Ư`]q zҸUUZ` yn.4̪k)S}EZ5m6wȴ<^xtN4W^݁(Ye˔eګI3@*UݻwYkp4{|-G[֪U*[Yw888qvv g>mkX֥5ڹ+~?vs/+WӽK'댧 z.d"66;|wDDܢzժ*T=߻egX'OQ"8/newi4nsX=.9:9)z{IX,t*V7m̿>$̖\9s;>!XLk7~N􊈸O?B7_]ۗR7n`WKV -G_.'Nɑʕ*rVđIA`rx%""""<ʽKmZԕe|AԗbPNmeJ)Xjܵm۶k6TR7:ueml~on̰@7_;Oc'3kP!5Wq;l-~9S~Qʼޣ1vfug I {~⧥Qly|=/\`,;+CGL/3l )6WWrɴxMkʕ-c>rxխmFJY[nߎhg`?yʕ*XCH#GmBo&4$dgΞ%!!ڵjZQF5֬ېXlookbx5u׮]'66BBBwD抿!~f[@U(Z$:; ?*U,oMSSV-ϜÅ ٴi kLzƲtٷl۾!'$HRMko*/g <<<(ZN~hpTR%I5kTgɜ:}f jHxÃ,X[_7kژfMY_ &>>:?@:6}qqq8;;SD Ç)DRXfeG(X /<'QFUC'?&$$)8:~$yr綆Fy&I|&_NZ PnIkbbbTq-f 2~FOr$&~c~DvmɚՃ_-_WHo ٓ郣?$J``1̝ISb2(T>{_ۑҽqg %K/o OOOF#NNN6uv|zXxxR_^6uSEЯ͍ܾ89۔y՚Loޞ2K')nVJ_Wok ՝\YMIܹMԮb,ٳ{SD?{1yGϧoA:ux?.C6Zݾs[vg ٲey% ־%߇yԯW_WB֠,y }X,܉ٙR%K7ɡG)W %K1/{.yz/I3-[6ш601L&G֬օ9ru>=hgm RCf}z6/ĿHc{y/SЦ̚3իagggCD-H`0X7.T 9v8x|~~AN:M4&Q"nݲw~Μ9+WY'O?6d=bN*HmUIBB3fΡG.۳!To\E8|gdqIKʖ)MۗZsfqqq(=N!_GGG(3X"kqqqƽ n= IDATQwXo"{{{߸8mg$/YJMڵ}|pR G.4ժUjU++/?o3C'!!ݻzʕ)cɞ={'{s.n@߄i>$?ҔΎ.:pu6o $}lmM-m#ߺLB$ֱ,IJoGBB4HDDDDGvߊPH':?~}T'W?bEt2a=e:**3g8 ]DB|C?z,.N)υ)?,yqtrHq';ժVIcȴ374p"9uj'/wa(V8;;ګ0s\BBB(SK9v#[N ~?&%=HҲKmXj ڴ"2*9RH4?25m҈K<᧟9w)>Le4iԐܾej Y>|..+V7WW:ŋ-iޥz,XUkpqqylY2f% *^ f̚Cݻ6H"ꕗ_d-?6[LJ?HJO:,qPP1Q[PQBE;NR ~ 'p o^><7;;[;30fD4j/,[ ת.Jo|044ԄcOblhvR)T[kLMMhԠ׮G.cmS!AܽeJ+l*ikRrA֬B  BZIIY@"}nbccɓ;7*ϹipBn&vȇ>+eg'GYs6d R U^߽w!G1eEY 9Fmش)(_lo=@y|ҴNEB"ТKgĀbsSn_}ʀq* Ά[=P%J`y`^JQ !cʰG4211̌MeK{Ί8۶&[޳{9S&,-Rí"Neɪ> ]].Lq3gK|V5L8:VwnJMkWnbe 6DmZP:YrZp'00!GKreпS++8p0QΝC+)Ʊ'Z,PS'# fμ}}=ܪҸa}ΞeiL^0|QtI JbPN-~kl\ə}{'.Mχal*ALL GAKK+mݒ pmʕ-CeϾ|%o܌;JeqG%KjYTmmAACӲD"aQ̝aa$qgWgh`cXԇMܱN=v"˒H$L`μ###֯TK|(ˑdȑdRr{r9Sr ".5m9*,L6!UJ̷}I*WU~Ec{֮IeЀJkMJ<<<$IhhZ/ d2===h] T*՗rt{5Y{(Ud>{@؂    !AR#jB CkԆw1y.\d}JJ$`D*:::QR4Z___-[6P-[6C2Cq$    Qq$    8AAA'N1kDۛk HAAA)^hMMR!A'*AAA O/KdId;b#AAAAAtmq'ROAAA O: S"/-AAAADő    8AAAAG    Z\mv[1z<#FkiIo-tde靌Dߠ;+׬K2gsr!**ꯤwOyv8WNX2M;>+Wծ϶dMHW\|Zz'%Qk ;'ܽdѩ[4_/^r52,n{a*Tly_JuxFE^ȋE^M-f俙T!ԜUY|# O۱ԯؙ=׭\֨:"""3u4ōf-۱c^o߾1t\jӡK^T? 0joWW۶]APx c=&SvM۷rz,{w\C%ɝ+W,SU/Xr ]:뉈@GG!i7l (ȋ!efRԺ;svXY峷ܺKQDEE'[5\VVN9#*:gZ7#G!8K|VŁ=ٸi+c'xiݯ^%>4[yrb )V]q9%|pNͶ]r c##ƍD"=͚ ?~Yz'%"Ψ(tuuU»GuiC``:ԜQڻQÇŔ ȋRܔ={6ʗc݌:TWEW;*0q<"kmjUh[Wl^\rsmz芡͚r:}?ܺ1E UmŊ {Z.Ľu{vk*עMG^yê5MI\: g߁?ڎw?0jժOŪ5hݾ ϜSL fd\kԥb?g_(7e>cOrmԌOaV4l[̞@kD|skoҺ}g]hު/_I6vYv8Ѡi 6oݮN;aXjg_~SL?w_s8WNێ]y9?~kUסAw8^?M[Qqs]wo޼M2ӇPɕ{+"""؝'&Oٰi [cҔJ4,^Fv8uRACG2nRgϱsr7J!_C1z<դVƬYt*q]i3ǯ? 1t_]S%h4n '7^~}߇ 1ZSZMuƙ<}1FJ9(5tn߽Gqvqc?/_1o7u4eJ\JyvjkOұkOT7.*:9(X+y]{po!\׈'\8x[QZMzR{ͤk?ILLL:?JMOGѵg_\kԥZ8~ݩ4=ӺL$RIGEE({ 5W#WI'V!K޵)Jod؊#ЯU 1h&N^7kBxx\ȝ+͚oVJ2d 6Wo0aH͆M[p!vN.991{Bot/з3<]Ӎ> 8t7oaЀL00z_=kf5gaDO/Z¥KWܿ/m[`*\.gy1wQ͕#D̙*+2kԫ壘e3~H8g8t.\d¸QdɒYr<}YsU1NĘy~=i_ĸ/ ԯWְ{i۔{3ƏI8}fI4~|:;Nvm9͓V :Bp Xݠ LKv,5cW=qo֘f1jMddFF]7 c罎?a2m$֯qTi9d;`dfQL?E?ܳbccz':ك[7‚?`Se'9v僳C7oVfNL6xMEn]صmU*WLt%%:::@_b"gt682[6i8u;Z53˓|{-*H̿{"/E(y:K|V0c<ʕed쏖TJJMGsib0>XCf M%K-4Oh_.gB)IM;jpc x1]{!((XiɝӚi2u6\:UodP޼yKܹKrzvLޥ.^f݆ML;Je}6ҥc{uc"#Xr foW2mͬ9iբb'<Gg=)«*i&1cF֙?ٳgK5)n̛L2[7KM[=vVZNN4mٖмi_OִL`K٢vd˚oްfFjnv VYCΚ۷^CdTS'MgL: /%Ǐ!**2vp ۮ d+Ϛf;* U͝#N'yVz̛7CMq^8pQʞ7oQ1ъ ߇Ȯt222޾Jg_3gΌEؕ/?%oە/Gjt=QU)сO?UֿO/ ܭfMi/Q^cXER%ٴn%֬E&*F*q+111<|Xv%~tRLOƿ~fxNxX ^,4_KsT۩ӰRs/qVfM„#ٽw?>+W+ڳi3g,?^Bu.K|PK\Y P-ڷm -4ϞSnmEAEe}2#CCܻ7y?_>´yso}>KKEA؈B Hy1f1ܻWRA 6nޚެ lgTZE ƚϟknH(P\e4ou/^{RXn.Yh~ u՗{; {7zJ#HWR*Rbyab|y/"/N^Fɋw}iRYYWŸRΗ^3ynH$:gJĤ&#&MqVTro߾SIU紦eʌv4WG{Z7cɂq-vNt<533e zv1O#[Cظy XcoW3ӤEjm,Wnqr=PN"pL/]i3TI[ &5[֬jb'/DkfgfjnnfƋ~JaWb{QQFaZSql+*²dLlڲ ޚI73g&**pBCÐ>j*-u w߾}#~?zzz> EILh7xaa#tu7?x%KPt)C4iԀ{|`oԮIXx8cѬq#wd ~@`r˒%mQ'~l  TIB)߾@*`0 oq RV4o:J,Y&"<0#ȖD^L)rdϽߙ(6;PM\gΙ EGG%44pbbb022D[+e^Iy)LLs~=wlٶ7o6HRRźLRt*:9*7advBRzLIV<}۷X0gPR.SXAjnBH&K}Wyp2TtrZ*\qSTeZ|QJ76vҶuK>}hFgS߼? @7>K)oRʗJ])_xPƵ7'NV?66cSڸJ@GGO?_|h<&OŮ\YV. iz::Ԭ^ gfjpc}4lڂsqE\M P&ΠخٳUh¥DGz9R)EQʗODFFK˼x/\bQmԌ6`o֍kX| Sy\PA޿OD˾{PN--^F5**YW thۚ|,G*ͦx1nR~sT5524HB?x8mms&o[h(KT;OJ}^y-_^c{-YF>eO=g-*311M+wm\*XǼԪߘq=j ,'NQwi.xÝ={6`UrsJO=Gj[AQp!ܽ6_/ DEGc^:tA˶92mZ򤢓ckzK*4S'&6h@*{hǽٌL@mH q/^;:ib: 2b4=e_H%Lƹ̛݇O>]/XſҥJþN[yZJ<7t> x)J|^_A ʵ.S+D=~W)VL}(#7oV*k]~TJAkkO>+tAr誖dGZi+f]@ 7WMXhko֦⦞?>.^#zzXCJ䳴d4ƍTKs߇tч^JrTV&(9jצ%GK>tl׆lٲK$"+:ShG]cMhIroT*e]H$,eǮ=|}Vj㛚йC;x//+W\o{3l*|gYdʔ qң{P;\rҫ{Wzt̥+Wٻ ^ԪY=ni{vᣘ|dhk90dhZ7ӧ,\,Q306ʗ+KAh׶  <"GE]/˗OqTvLڷm4l$_%::\rgϟ'Zy4}-!n7 33S>1-R6[k~.}V|y u6ԇG(Ԫ ׻'c4_]]]޽]yѮMK;@CiӲ_}c/ jj1b8z芖K$G j&Bc*ɘEִo TJ]XlR% %lm2?ǎd,]BQ`dҼYc-_\&`=~0{TE.زmсoc^{s/ɱ7n#14}:o/ ưQcU }}}>~s5| -ZU2X:Sua\|iJ`,a9.G&Ǎe*ؗG__,5ކljkkSJeV̗/;7p,t HwݸTH\ػ })reT*eb'OJ:Kڰk>0"N^;c:k=G .2tp ,OK5O")U6DH=M<>--Z}ZKx#'NQI&4-ܺ}^1gbL7owa!a+#*{$O zYr{SU;܍eҔil^Jvnߖv3tԯÛXj-WjoEt1q_ K)\Sg*5a+?jidjjJVssV@Fؕ/G=qzu”2l߿`L7kSϢqVӬI#2rjerZؘXڬ\K=o!̫YH$̝9 1{Bc(ikòȞmWy9s2s'VVߵsg;ٶc3g&|ԩUTM[?f"#)N6 v*JTtrRgTTщIưz9)]:K8̜69R;,-䰰`ެi̞'w.Ӕ/ːdȑ'V=}XEbEY|I!ɞ=];uKO mm[ʨQݕ۰yvL:]Vf|"/EX];cjb¶ٹ{F/[L?[fUk&5M._MX3u?4O F̘:9Qf=rAvmHiF.`@xLh\8!{'s;oe~!*:ѧg7L( p,,Z¸ 104i]%-Μ%8$&(LM8~4- ,4:jPg!I~)J%kkkTWWW+<<\*ttuRT_.rӽ)/&;-$L ,#&zz?IЭW_ʗ-KnȋF.ӰYK:whd /_aj2Yrn]:&:υK)D 7H$$T&?ttt"""Ri,***6[l2???<[lrJ eHA!ҩ#2R dg]@.SvN 8AAvtl߆ϟwRAHBLl,ǎLvIAAYHs֦^1EƎJ$DyBzi"m>hDBFZ% CG1K+ (! _ *AAA J劔ItIAH=Qq$   dxzzzw21Ƒ    V8 Ox   ]$\mx( ; D8AAAAG    ZHAAAAPKT    je… 6myvTYs\k!**ꏖk֮߈\.W y65(7nN߁Cv/VYk:Ue\.e֨Y<&Oc35pH"רs--  _`by;[z)E/5塴t5tIڝn0;whpf̞K&ͩװ)SJ^CVY!:wg顡DMo ^V?0(M[Ç?P!ͥW6?Z}zQhLMMyC*:^vFڶnݻ7oBwFy)^7%tuuO=p F[𧚦6,41y4+AAAHڽ۾̜Uhٝg^xr6i伓LㅟzBK[+W3vDΛD" ::G M5$[l|߾)r:ٲqvbL/]bj׬N\D9ueKN2޾@'tX|IEEEWT99:вM{8O+2gL8uR3g+ϭwYZ[ll,r|71g'LMœ {>&mJ#V;PTI,u~)\~=,4mԐV-UR"[wӧ,YU~<}R<~]L89TWq[===rʅRxll,km`7۶r%gmc'ظnQo Xx!aa4lꎗDQ)%  iRֈsKrXXЫGW*i̞_2/Æ "o,^ʙs144}ԮYC1^F"RPAzU|8i]W^xMF5ʗ+˾}R%KdΜ R%111CGZՅ9r  7~'3:o~j7Q2lQҥѽK+AEXx)֯ r9ҫG7N:͚֥# $44[zdlXD" P\!!!eG.{m?֥K}VpzuF֬|e&7=^%gg_G)^;wC?~hԩU]]]>dS&y(2'O͔eL>E(DD|gAhiij:*((~`fjƠ}eӖ 5+}l`b\*Udܾ҄sblbLZ5q?yJLL nj@_cc#r@ʕ-bC6ĩ3Ldq89:P-km Yy1R/G__`SXAAMr^4iԀ<۰!yLfRoYh]rϩӨ]͛6fL<126b\tYsckSyV!WΜpYʺU155Q,?CL&#:&N\/7o&Zq;rʥ2e[hh󆅅a`Z144 0kaV˗cd޿UkbܘtЎ޺=yfDEEbCq'CWʣ0f0 g*q lKR]5{`58;:PHȃT_[[[*ee|߿#ˉ!,,} fϾaoWNQ / Veѵ3.\bj}M[qeCll,V+gi$rQ>zܹr)2I%J&AAA4-k {TCR퐠ke޸J  hii 9GOXnL&#&&?΍Vv}7V.'Xs^d˹꺝 A2LMM7f$R刍{ݺv"FFFxNberepe|$,<޵S]ބ+W%O*~'J.|Cl޲ ###ԫKm5:yG>KK ȕ3'2lc̝PTI y13fy}ulڲ%ȝ+]:uK\eDrrrt`\ؘ [ͭwܱV󡧧{sR<==JZҸV9qi T\9oyy/)Đ%Kf_9 MU ֦J)IԴ'lYn#s-Ħx1 pAA?FSSSr9aadΜR%lz:<|;%sfΜ; ,P@M&n}lxhii===lA\ RAA5.$ ɸt*Ei|`)iy(=*/:lش]ԩ`WH._}.!!!J]s111[o#HvG|W^}j+O2lQzW[򕫹p2wcy2?YZZs^?yQ^e˔s<GDDvΝJq ζ;~&7of%)%7wKdxJت3GGG6ص`>k?"#5ޮxN͓@`P3gSinތX Ƒcǹu'Nfy;1u<}Rnܼ9zm[Lr͈͛pkEQ|3ֽiر{EQz^M[q5N߇tLк@k++@qE"P¶8?D HAAKIYC"}nv˵70ɓO?ҽ_Mc…g݆MDFFkR)MCwǭV=^}na7nJݽsY8{,<^ێ]4Kxbؕ/ǜ8r8Ob9/VeڴjAHH<&sE6oƚuW6YgR:kQHa|*?%Kz{gK#b&*:ܹs1b`Ej>˼tܑzz)-U w2|/W9u"M18ɇ֢`̘:Y41b`[Hí+ )ZD"as-m.Ѱ~]Zffx/kY(]$ X%zs yLFO/ ;̙xz .ݣ?nJ)uᣴoCw팮.{'$+yfQ*o(a ??J\tEJAA4-kH$Ə {LG|5}L?K}h nc'R,MCrL,A/Lx,-p y'E"Pܶ*RXd2Rظ#Y>e2*ѯo/|,RL6}׭K.UrEB~~:0F ʢ [5~5\HJ<<<$IhhZ/ ?:. oPRBL0@llnֵ[km]ֵ۵;IAg?q ^}sO^#ztf?GB$p$B!"ss+AN޷JB!BdS9H!B!B蕤+JB!B!~w)0$Ȋ#!B!BB!B!^8B!B!zIH!B!B蕤cLJkI݅de-d͚"U>"" fϿxٳ9RzUխA |Ku3s%MT_B!3fs/Y2;waܤ=q, 6 )<]{M@f^W˽yC?ꤗ-]S&hOʶtYE b)x,31zfI6X}Hh۸*V(Qhh{Νԩ]6̝Pа~c!B!Iil s33;1 |K&,ߥS{dΤNcg'{6G:k!}zz.%"2[7fFU^zRfu %C6ptEvMx$.X[Y4σjҫTHއ/"EޮB!B.&Vjtћu6+pZRkkk*/ /ӵs,iܰ>^+V%naM$~d}ƑRbYuPBU  )R,j򄆆1c\ji@ɲhѦg]EJ# 62R^#V^ i߹;n*Szm&OIXX]{(V<^UN?v0hC UGCLLPPlmx VEe)R,ϜއԮY]_x;,_s}:wMUX6cO r`8*TIU֫?S~cyz1cCG!B!į_J!B!_LZ51Nak2b4M93u4iܐN۲ev UȚ%s>j ujՠyx-_Őș#VVp1O0~TCL1s'OQJ%2f@Td?@.{ll5uߺ}##CfNq cN(q,0o8? y#```^}O^47o1^y LHHTX>=y]r&GltԁҥJjv-)ZM[!GlXZXpaWw~m=x|_TR>=Ph߲evMpeЇJX4ykתNj1URmwr7y S@>&O)& cgYv@Ŵyp `Ԩq̚ԩ144܌i?y*16M1wtLLR.]ZzSgt wy\rPPAjk̺4_ 1_8!B!5TRIx"m.Jy&4GLbEhФ9VejKRѮMKTɉ!PTIN:iӲ9;Ӫt4hڂШAOG>K tlGnxƇ4i8v$xk 3{v6k=~s/2a쨯344N/Z&)z:6l',Y8ŇCYЭs2gD`[6l1s*%|}t؉Y3gb̨DDD0g"F wHu>Lń1pʕ lx?|D6-]J+pt%lmm4J(ƾ1c޼ {ǭw:N s&pZP\eيxa̶0|~2[( A7vK \7ptmҦM XZZRha\Wޔ'B!}h(+Vȱ~Hx)WJeJqVN,cV*}{2f^x˸v?|QEGœϴΚ5&h1C_??R.uxGy5= #JT+ciܾsW81Jj-?m`5f<ǹ+';w'g:+DHs.1w39[[ Z_\ }tx̘S2MK szt!8%G4QW_ǫٙ)Srʕ)smmIfyz22>B!BT*e`ԩUC/NܽӧϘ3sN`?8ԶܼuG'mPހ}`cmʹI14L\8@RT~}<yRF52erĩX[[Sd */ %pL$MF9ǬY8vV'vW%s&_29Ļ=KKKrtɒ9Sа0,͵=vR'&15ٹ{1_.}%7'O!4ө/\$(8g^~7nj҂߽qQ!Bw]DFFj߶R8v$.h?}>./^&.<~__MZPPw&Rhh"2293鬚MttN{pvrbF޿ϑc5yt=N:CvWը?"^]q-Aڴj1IkgGbE|*'N>)V®w -[4#Gl֭;ХSx׻GWz#Vfff|N0tP7}HaW\(Sڍ .fz|Yd䙳ԔLC.q6zvMvC(T-7e7M6(9ַ)决S. I053e_k1P*iָQB!bldD|yYaA  R1֬@Tt4ٲu;/^9{srʉK{<Qc&/>ʔv#sL?4P2e,ri4g2xM9E$j|#qwW-]J^f89b8w<-ח|y\055ع{/ŊƵP1AA؅+!Cz޾}?vϸ#g<:oyL.?q\9spQ:o/o A~~^ƵPΐ5J%MbUlܼ_R$͚4LP{E hK-gɨQ>]zJ U8*\ }{ugDٙ8Νjڱ=L ei(^4^c01IɢyYoϮ=P(Ȟ͑>SvM fy=wG%e.UzzҽB`ִ̚3s"_/jL!Bs1SGfRj7CGuNΤ3x3mxfCgiaԉ1Uk.}:ڶlΎkBT2{d&NNFH* 3RuWUXԪįy6jy ;o&*Saͺ,=wIcGʹV Lw~~řÇh+hw(&ښ11}F*TZ9ߗ/-7n(||| GGG $$DRLMM"##JLV[jmwlOW]_|׷pX6v9]!B!/'M1N➈,Z7c69q4c9Fnu EBVT!@Q#Je*"""NP٩]\\:d[|;wQ0~|*^+VѪE3  !B!Bql!!!IcG-h۪ERwM!B!"G6B!BvDŽISc?S'H/8B!Bk(Wyz'F߇B!B${&u7B!B!%銣w!5B!B& '2" s7GB!B!B/  !B!B$p$B!B!B!B!+Iǎ9r|SyZ}پs7=\9sЬI# ?۶s=c,T\Z5c``v?qٻs+4lˬSȞQ9|(^ܜB Цes39s>LIԫ[E ǻ?s-{̟3뻌/9;}TZEJbŪ`oO&(WN.{Qf j֨3-B!|n޻o?gzp`س>nBGm?yMpm=~Kng̚g9__J'ݭdqƹ\oܼCKϘRJeM`ΘWq}ɒ9澟?:veYd̐G,d8V3ga}TTɁ4t{vnZaaa 2{SZ5m͛\ ԮTC_i7n%V}h(}g4_9?wХ{/MS.MOj5uk"K̼3th-YDLI1d̙s<|Hohm]5 7o{zGM7bђTR C_[B!xNDD$MkڴӜVOțDžZ5ch`ȩg:}*jV ׊UDFF~*6n„IXh^+^d;t HtG`מܱM5ԤWPf0' .[ɝ;w9m2yhW(WD%#H"w~1GFFsur?x3I\ze)ZS062fLll5U7nbb~].Pڭ$MڪRn%1NSn`I!Bc+Se0l;޽KPi4jU+ӵGo? ]rvmZannFYvXXXp}Ξ_˗$pdgH#Ş^t>-l#uj[C^m8t([wnkU/DԶN)z=y.0P IDAT;dbtKKXȂŞ=wH\r[8:fiֲ +V:rJ1:sp+ʞQt) mZ6gI ŕxͰ!Fqɭu}a֬/Fl Bz.^ϖm1l0v-ĘQx%Vp""±hO(]-AϴjJoU*JWL( a⥜9wwX[[QHy رk7ԈI#:o /_|А%oA  !Bn޺}߇`oOM)VR'1I6-];wX"jv%3c@L ̝#ǎcaaNj;v(JrN.Țv)fKYv=8ɀɐ!&o1׮cmmE?}v_Wxx8)Rw~[[[Ҕ/_zҶU ̾Kc*PΝڳK(!uŋջ=&uj[rq5 fAς!DGG3l@:uhǙs2|4*JoZͰr::wb蠁g hݲu* S9m2oB{eگ6K=7}.VBon%KP(r:W?>М>s씋GPjV^%^̛]Y湐Ϗ}ۛ.3fH*U,7o=ӿنa8w__ki/\ʥWک#S'}֚{m[brʙ-g_iڤ~U{>7nvʵYB!/_+'zd(^1'qE|j1'Qb9ƎCFFn+fdʕ)V3n"Ѐ!Q _>grϟbr6!*U*z@@v{9z cFxjSi?|;O>cЀtԁۉ{x^6`LBBBtjBCC d;?/P {#$$m;v ss=λwr&j2W}9; i6e+];wM.-w*P*Q*|(2W{*>Ihabbyc\/qeP/VH6nB&IJweUBKeҤv;pPj{TViTX LML122"]ڴZ} ` XYYk9vSkhrȮIHhh(?1k>!B"@aBgZwj5ӜZصudM /^mjٔ `*} &Ws F8s'NYiBŋѪ]G?u>R>tfѶuK/vSs>s# ""ϥ߷Je]Kց#<3o!$LJ{t{[\K|ܥXš@|C077Qn߾C;;C-,,p-T[ _>M7Ԝ'4}c~rs gjx?|Hzu++ss|\ ._JE amxӧWs=#[ԔE\q^W3-YL>+T*Ǽ83_oM YՎB!uvFN:"&k,:y?߾T*q+Qs/$8P?1C^zŊUq~~T*xeΔIӧ'&pt2fȠȞ-[ƐX[[i_TXQ2dY\|E3`is.x2LLL]+ KKKƏUuȚ5 ri~ͨ(0ԩmyJpV16 qvrDEE*)WNRHٳ&fSlluƔ LBjc9?WHảS9y jZsw|Ξ;նllQ(|qx1[6D3;8k^8I4i!uj[:oˈc񘻀bll Ȉ;wS|YWi޹{v=!Bk122"o6oنKܨQs)aZ[ !::ٱk7^9{˙3fffZ+&Mӿp+Y{{L}P*x̙s^k?h(Ǝ._!M0®5p|؅OXX8Gk!8[i3>EKSnܸ}q-TP# SliҥKKXhΜtN yҺ埘r? gΒ={6?I5V%MAEl߱GO:oJ2%3Nb8t} fkԨV[[[fNBϥ4Ɣ(Qn;zB`1,X =$3O[**~1)<~̙4&&̞1u6sQmDTT̙5NZdyY}IʔfJ/Xnʊ65 566̝5K1ob`O}g<.;p/_ahh@l٘:q *+ߍ̘= 5iDm)QS'gutP-#۷ř^}0|N1g_B!3x`?fΞK033R ԫ[NhS(>Ys~ti2}$3g07g̨,XII6 6m̿$.B̜=ciiI5Qhj5* g:Շ94UW2fD^ ɚ%3HRiqͦŵa:5M4UOs$33S#Gy㋩ us' |5khҬ:h,ݻwTTʕ*$zRS7n(||| GGG $$DRLMM"##JLV[jmwlOW]#7i}{zߖX/_k>*Æ?wȟ[~5Sg5fztռS$/_EjB!BDcARwC|`an%^+wl&2'Nj]:F ±'Z2S?efصGj*6n%Ӫş̝(?l\4B!BCzڏR`ݙ_\ص͛6'Cel2.5 Mn!B!H2p$$g4n B!~b,Xэի {B!Bdͭs;z'F߇B!B${&&$u7vc !B!BIG_{%]b !B!BGV !B!B$p$B!B!B!B!KGB!B!Bd8r-XMe5VaӖxXEDdd۹kJWޠ`W{5iMaނ jC =2oh͗?0xVS2t;5Hɲ,\SWPPlnQZm>{UU-9Uʗ%<<ϰӋuB5i챵IP=YⵂmZ%i3}(KVP _>2fȐmr+܅ٶc Mp_B!WL}I.-ǎ[ItTt]:'KL4vvZ<Ç(^K`MYdzvԩYQm܅-S˜9JPB9^|ɮ=QDd$[`Z&!}{ 5a  !B! ֬wXj [5] @د7JĕЛt ss7׊Uaiiɭw8u,oX)YoU@@J P󏆔P~r,_-+'~~ZKÙ0y*נbx[Ⱥ TNwҦCUQ<}F' TZ_nS1.cBԨKj3a2a<|Pt,%_9f$]{רe*VK<{E,0-j{~IfxnI؅B!?7?xjףLŪlۑ#G\k>nw{vV2-t1~TUAپsV=CTRjӣOyc\^zMq+W:uxG8u, *W@Dd$/^Waaa4RE>Yԡ-fG\6pT+{vG>˃ 2mxfa*ҦM&mn;0}$/^d z1jU+3mx2gĀy ȕ#;)S/7nАU==}2gΜkJJg@i]Vܺ}3s$F҂^1AqG l{FFFIf ImḱF!B! \6hS'[ 3t5PB9ƎJbQ!#Z 'M'2O>ZJL7CJ]U-*~FBXvoHC=~B,2gr@Tq϶πP3~T޽ Ip dݼ{¦-#{6,-,8p0Aԫ C$vhzmk^RrE]{tFEF>4pN:2澟?;vaQVL}ŊVkեRhެ נIsV^CuF_ё]:.mZԫˮ={ѭ3)S:ӥ t} Uq#Kvt֋7o|HƎi`ccCE9g[ߥ/B!BZJZŋ׏m;vQxQMz|RqQTkӒ**`meEqvrJ*ɉS9|8mZ6svZ.UM[p58-No֬rfNf-`,,)JLMM ~k9CCCԪAEHiWn&=~’sQ|X1]:v`Ԭۀ̙31fp"""`# %%| M> cF+'/_"""[brzG.ce?޻OTTeJi eJm.ʕ-RlR:}VUT_F|y3fLϛ7>*XYf|#4QfLe/^ !B!}h(+Vȱ~H訓7T|t$H1+mJ(I300!cFyՋ/Yt׮?h"xVY~}r-3j-ppEnGƚkK>#&OK-RY2cD+W=#Erq_DȻj֨Fn?N >~~jlmoP.ժT&};)V*PVVXkkk|}4okֵ*Xڄ~'6tΒB!2m&/\Kds̊7n悞uKETbf鬜.KK |FƚCDD=*U*zFtH"#1⚷V_vS{ ߛAZiфy0*V(DŽӸ}nG_g ,\@@` ƌg8wr}̑]gH>ptE<.`FakkB? P+? @otjN/^-t`E/[l? |uX@,h} uOזeIHwt1B!B$-JGد7ujФC߸R?xsfN>cMHmk[/y73dɜG_ST*fEV|U*o[ 4'jT#S&N:5Jb^~tE %zǠQb7266&{6G=~Б8нk'^xȑ#;qROVs)u|Jű'qI`ϫW2XDj##mǑ+298!B!MddHcCs[-?;DۙOI D*Y.__om IDAT!qu-k2{pvrJtܽSgЮjZlG4]8t8s<, *[d r_k1QZ51{lι>z,BBt^)T*Yn7ͩg4t$/^UfrMj5{g}B!7[?g3}Po#Gy *X6-coQ+_l[iϋ/&?w>aaX[Y7o֮I<.'O3o7o̜ժкeq}|}ig+t>Js}[yƇ6]rL1˗Ɂ%sf}?uʂȘ!w^?f`9޻ʕ*дqC"##9pwnԭ]K7,,Cs}WBy6K@A5j(7޾ b?[Yxxz-g}ԮU# {ak y\rKH!Bo`kkK \}h(}g4_9?wХ{/MS. ʕti7͵hϙvPXQ:uh߼c7kV{ ~&# W,Yh:ogvmZ࠹պ9?~BB:V"22kVq&LƒE4zz4Jmҕ+*P u=~]{sv4iP^By&OȟuX[.Rv'؉(bb+(*&vvbǵ;i$v?VV]JW{agΙ93;3{7眡` fʹڼ^] (5:rF5f+[FSCc4oՎYsH<៘>s6ZS Fϋ/Ut:M,Ym;Үz8i:Qp˻wSL?Ae$xL2m?I-hѺ=-ׯ*i?\-_4{ѰIsZ|}{;wcrOPQS=~€iԴ=z*t } 3Zaܻϟ#hݾc'`#qqq  1,cj=S]zy1119vڵlUFٲeåK'>~ 鮿!4qϾϗvmZiРf@Rk7(_2hPǮ6ݹe$QR(-Rit-]];zK32mR G Jtt4F&(8X%>2zk⢳mNV4 lܴݻ1~+?4-57of1yXZX&<^t)+sԔnuYd9+g xE̘9+˒LuHlܼת,G.`R kRnS+|pUIfx3ahW&22 ##C/^lݴ֣KPAA\ΔiԯWnɟ?/=x-V״D"νt߷M-hԴMT?ZW ȿ۷o=mϗD›?niڼsf*T(Ǒlj E3gIF^ȴ]@5xԷO u[ 􉄄rHi9xOpH@n߱ f{N#k֬ߖeqz:5WSshI]*V(G.ٻ}{+ʕ!HHR~iΜU3(\H1XbEғC4/%׮\2MfanΘֹy橿? Ҹ"E gMvmE9]m7a]2G*"իY{Ю-ٳ>S\Yzt!^Az<\A?լ~߶oǂ1rL^AA!=r9mZ9+ǝR]{f]q-G133%8$Djjʔ(Q 3S3޾{Ƕ;6ҕ5+afjʧOIHHP.#IBBϺDFEa``2M*Gddc0ikiӸUT"k֬ܿ{[zPG.̞?_^ƏE\\֬c!H]^fG,.NOkց|~zGORͺ2h?И'PАʕ*rCʕS߾mkN=tO4|*FsXѢlSgԭS[ezJsz@BB:hϋ/]Ke};xTu˔.[GG333B?@Ih\~%  g[FT*f<~D%Mtig4nuʴrnμYDGnr׵k^4oȱlֿ\.Ou:rujS5{vgȠ[33ȈiS&sg+.Hڳ… QRE.\Lhٶ#+WSD2uԔ(^<&hkkb eU soӂ)^X S H(ibBddՍ-v0~;ִa~)AAA}덍 Yyq(BC0vO PWT׷L2v¤ '040 *JeQbb"111j-bW˖y9+U2s^.̘9Rx1 EEg_秗/>>ptϏ2dPO=#mmm,-z: jP?yC}{,K K,\z [}he͏144ԜDcD6%%..]ƾn/_A.$&&*G)KrM+[Ycan6lz2{r9вrŸ_ jzo6O|yr&T6pZܺ'GD4FIZ:7#8$[뽑5kV4nı4v7 {XY5ծMnEҒ`=2**[nSz_{^~1 /^`Yf* gCCC+ʽ{)?Wy D@eMʖ)6G8_GGE syg]@[[;mL>uPVyAQSn!%  ϻpoLƥW,x-[67tjbccٸi FFF)ߓw@17o)Y{OV-x;wI鹇LYW{}oיR|iwND{s\N5Η'dѯ@фIㆬ\W^+Q>i^Nm)C^=SFG-=zNЯOOʗ+K6cOM+g""#Yn%K #(QLgec]Hj"mپs7kygrL#M@*g=\!JYa#9,,o_W Pl#|erVYvۻ'cObiԳ\tC‚E %KSH|[ٳѱ}[6mFLl,U*+.]a~н[&Lœy ]&OmNZ97(]9ƽZs33hҸbbbbnh6%|˂   $ #11|y{0L2YWő                ӣr _.{{+(eY]:RݺJ^q=R)rf#CtsxztcKL 6oSbh`@*ӳ; WK͜xeJ2iۺ%65{KL nI͓Gm̛OGJ7z$.1gB؂v6 F^o5fdf͘Gk[040#}zvGKK+sf7onzDRVղw<|[]& ݸ u?SϰA GN5l -XLJUnPLU:k!AZ|@ܹҵ::?11\'"˙^ll\ cղntvż6`ΘIj̙9M%zޮMK8G#..LFtL3mar̡@ s85i̝˖߆_%K޽@s<'$4Qc#i% Nر{ ¿}>DDDeZLMMb-t Cʗ+lOiŋe{𐪕+p)ӷWljT#$4G)GY{ɟ//Uqڶ\qS8x);7!=2G /S~0}jD"a.t)+coMȉAFK<-{Sy2`Ml)˹~=hyqqq̜Ek%$$$-'8ۺkĔi|2o߽W7jONܦ54ߠy6(еn4kՎm;v'7oKu %)\ ͚:rIBBCׯq5Lcˆ )NLLd4itҝΜMLGmnɹ-km@&)۱k/MZ}CF#$$T-XX8=whm] *ijkضc EL^Ym:t+;uP3xf}ש4˖>=Μ[}zi /WV%IZ׿jc9fDGGgh_[?Z HAxU+阼{mɅWtޛZ whB}.>}31oh1]Sn^|ţO~z m驣%zM/^ңji@g^<Fll,h۩/^c6jƩg;!ujb `ꌙj6j 7o1| M **j9S2n6`4 (1xu]ɠa07Ý!s9|TTL% TPijhTr iD Kc7npȟ@.I-[Z̩gh9u=!!.{WannF qjH|yU҆AKvmn]Umش]ϟKlYmkNKWekCFtdlۉNhs6nKWztM~cZo5uLCQ3˕Kѥ*(([` *rٵ{}{[gǀ@Vv-_խ >>[ӭK'e(\N>mPߞ <|M[T͝Pr8DT*UF$(R"َuM۞X"*iɓ'w*VlSPP0&_bbEˑYsեz5,uUBBB=)}g?'N@zu2?ʗUKv&j:b(5YƑcǕiΞ,2^Jqrn˶6x`D&ѩC;8VիUUNlܼ4Y|%+c- s`=ݵȕBW=mmmL .88l6ۏ2rsh`O떪]*/Keq9'zDhԑTidJʔ.yhތ\GGo/ؿ{p7tgr\G S>Y{@.gwbjjJuA!%魣L&9LF.8W6016XYZ2ump2ϞǥK' _Y IL=3`AAa y[6Db(V{nIR)zzوJ!wcO¥.\^sTZލ/_b2U9ssMr-+gL?w©)ujgԯW7c.:p߃GgX,75m׮Į^#ŋ>iӇYfw'$4 Yb" y.*X@-hJ=®- ΢uyIO}'ujsQQFuM(.FݽQUZ͓ŋ##wǡ5q3>}x+Ttw3o_Gezx-XLLLoJeC}{7n*Aʕ+9,҅.]w9{sj"St܁;-S7MdcԷ=44  Pcxr0m2%&9sA$ǓHdAwAݹG q1zuՎ ex9];Wޠ^]у{222ںJ[$UT*Ů-._՘62*G0nHU*œO3  7JryfRmϻظydʺ]{صgt)+rz<_ȡJ1**Uk׳`,1kW]'oL7L8J яLLVv$ @mP2K1tȕ#yqqq > :xs"K,LrPZK$Jg$!!!ŦwII277WJr-!LMMLMnbbLHH>}cՈ}R֠t,,̉'4,Lh߾ߤy'iS}ifb\.'**J,44 \ 5TD1TRiZT$&&ETT4 2뚶=..Dvq,,,]4[1Dzl|$EK]4AAHIFhhCGWњHmHWOOOsR]4"]Hh{dm$#CC勗$&&?*\J+Pݺ*N-{N+޵Vʕji1ڵnRHmY]հ,ɢ+ 񓦰kFY]q1fpekѡlR\|7c7Tnh` }E^sT'?Ą;r}2u,fC=8RR%}hDDMA(s33ԃ:aaʋeRp*11Q%͗/_͢ W_&[:h o8'd{(%i׶AAlߵGmkOHx;11 7tr xM^Žֳ/:yv}J/7nF߸̷ BRyinIrK~,{LL,O͛xm>|3J[i/_?yBgd0**Rh6nޢv3BWJ"8wbǤ%K]hFzٲѬ#>6MLL,z=vM+W@bXj;w  -=׿ԜpѤEk6lJuͺiѬiA#P<+Y8בӰA=)Q}UI[xq"""TސV ǍfjLm?P * ߖ:ZF5.e7o QN੆{MjܺR:~/tuuSbC˕=#,,\9Vio&jR0ϷYVr -c6֒ۄ_i[jnѬ),ԪYx;Wp҉eJo,-K``uد7?|d* mZ9Ӧ3< k7beiIJW'6wrdђe͓c^xҩ=>2d(:oXMRVFThQ`dr9.l133e؉ ֒3g&.1=uaQrEr9_νTzl޺V5L"H6~ѵbPܹrK6oہ^lL}9,<~,=ҽ7M#GBBB8~h԰&id+Vc'Nq}͚wԯwOFnjY׵ѣ'xoB- R%˨W׎aCR|77ocU:zP;9ӔxgcDbd͚O7ʙqG2uL FqM?@eܡ]ףCreٶcʖA5ԭSuj́C=tlzөT<5mv,mM,K2z$텞6mEK*C6tujk>jْ7O||qC$k(Jٲm ȗc@A<qiP}}}>~ =9s&NąaTM:<޻πؾ-% cǮz9`D"a4]{ҹE &*:+Ws9vl_jf[@> ڶT1d+CG"8z=Vj_hݹMjX{NN`&>r Ʋd բlR?QÇRt)~&::qI1c3SGAAH:k~Y]& `괙L?Ys櫍%tkrL7o1hHzͦu՟ھپk#FåK'[ЮJ6,;.ϔo޲/4VW00ǡ~=6n eI?{j(gY?q6O3}d+{0lms|yBsk&ɴ#FIƏE2ٽw?'Nׯ'cF)5F̞%kؔ\sѽK'|w,Y˒#6xk Hb#]-[w–;i,Yd /cTfB-[ҢmxϜM.122sգE c#/_IHpeʔfPэ9,رk;w%k֬*TF4A| PIbEټ~5y~&?!(Y8T>ׯWyaV7n!"2SS[WU1x@?tuuٹg(X ?S< S&~f=6 IDAT =]ҳ{T g ЏL.C&D(2wu---jҕ8%QhҸ!yfM̛Ȩ(c]<>s8ҢMhЁ[r꯳?UaAҕO?+ׯWP/Z4Oʖ)Q;MF"0L/Z¼O\Ҭ\Pm ae84ǥk'إVxΞ/ȝ;7sfNSU*bBV[i3#'wԪYC7HzzzZrI7m!!!}}}֬\J(\ [6e:rLre˰x\ ,_J6][Rͺ KeL2,XYc.M-sZHpnތ+L?EKWwPx愢"/VZ̹^cffMjޱ9###epHRlmjҾA2RGhw_Tʂ31k.m:={vZlV˿h#S&|#CC/LtЀN۩I.11Qкjź %\rȡ>=uUi>a+slܲ ss;)fdY/^ 0x`_N prnK<>{m'A;%<K"##%EKuuu2LGOOO'>>^*Jr\.79듞߹{7]Л;#>|Hמ}Z23A!#\ɛ'7cFpwV-[eɿt~X~&#FءvDDDnt 2.=6l#پy}/:v"GSNWrAL?]AA+zk޻Ky.\LTah̩D" H$2,щKT*ח%ZXX^x!744[XXK.-wwwWPBsyÝNe58Y2ӵSǟ?tPʕ-pױVvWRŋoottt/_=n"P n߾K׎?teK.Z KhhNG(  ]V N(mR)@H+҅^D2۱>fp5173ւy~).>)p1o"   dN F^)BVʒRV Ǚ9;#"o!}DHAAAԶMM&`iCAAALOOO==?] A -    mq[    d&D8AAAA4#AAAAA#8AAAA4#AAAAA?:8vz(^r?y5ZZZ,QPr%qqq9Sgx=E ¡A=:6FKK+]={SLw.;XL)[ ͝PL_7oYd=@߀ƍ֥S_Cpp0ԭcGȒ}\>zL-K(V!!U-MMxOV~V&66ٽJe+V3+I^ qqԷ}s_7ܩ2mll,N9С}>|̪5 S?)zos ttt^͚Uksq:ҥ>_jۊ   $cffFj ZмU;f""""b4kنN-5ftBc'g&Om?y5;8יLtJ歘1khutJt肃c3[ֱǗn=،]g~x1jx?Ag86kױjC8I2155Q^-_4Mc'g0u,_QO:z5' zp5NpK"$? ;зFͰQ VIw2^cf% kNTP[ֵsյu %f~ Woks9;8yxιS15CgM\kʗ-XdΔ) 7!E|ڶ4FO}0s2edQ<Bi_R%7z$UTf?N?=ejUWO\iR`* /1`0̒1x@_O^iZf͙OmY2)̨1ӛo;\r0a'DqgbNNG4]˃uWn ձ !B_j=n"+ę89cX={J4ե$*n`mmY <@ex$hꆍ111aq$OS_ 2s/PDq6lP4nޚvХSnԎEJFV3PP_"!{鍩\97=Ξ;kי9m(\ׯ߰n&G`` 6lyƴjw.V?Tuh6d ViՂッ=aaax̙2YdZlr`1|Jұ};k{9w"*'hZzu煮s1=>}.äc(VFTuLѢI<97ob˶<3RH4u:^՝R.޳ ʺ97D$Jќy^ 4lٲph\s>ŝ*[Gw#4HBܸy[n7nX_oe<}͚su)a0pTy._^Lq}7n&22ܾSu6C )RX1C%h(y{>jIam76ּy1{1z}N{7N擉 vvvx*65f$W":} !B!ZƵd _SsoWŊPp!:t]{hۺ%Zϵy6,_ӳ}XZm,9z,tNXʺ]Ǯ^^ ؤd@JŝI6-gʾFʗBJV^Ä eƬ\tiRӯO/mI e2%Ƽ{>:޿W֨:*&[֬_O'ȠƆ mu֓~n'OꔥLi8-~hZRHEHE^NFQ$?оS7:Zm8277өcǮ3oѸLLL4x Pſ1ZB+ZMd ҦeQ]#<166 =vVW!B86_URLgyrk߱QrƌȔ1j{cŊɛ7aa 6"I*,- ,&,,L/ɐ(FG@ΞW뛚R3{ $0VgGJK׮ǹhQrdƢ%g޻'r٢ $8|*/g.JQB+gNΝ@TT>Gܽw3Gv%Kƹs)bx m,[;[2ֆWjMbؠRA< AHU1aY LL+i+8$kL%?_x|{bEq.VΝZ%!B!D 'dy#{6%3ԙ/WVj}B׷DGG+?sp%v*{{u}vuCC0Mqrr WhZW=cZw{R}}[e6fYu<ׯ߰!/^kרS&%IIcQb7UNM}|ضcޱe+Wɓyؘ䔨llRbnnoV۷H.],-ɖuHxWbaaAre)S·SB!;uFsU+si޻.<jiѬ Sg̢IVNCFO_:<==UnRy{{TYdQy{{MMMBBB$22HV-ZVٹk΄0/a'ƛoҽ7 `u6i6o^7$$MZ0~( "9it4B!B>#Gg.J֎IU/-Y`yvmsٯSjRU*UF MLL"BCC#ju&"""AcA'O^d2Iq+Isiw{=+W+ܸy7z:HrA#/nlٶC)S4k7L!Be̝.^^.Ta&&&ܺ};w=͚4Yƿ{hjܰv$22ٽNB!BjբZ4??8ֆa$-^ך#GvrG$B!B.UB!B! ##!B!BaB!B!Au={ !B!BG2B!B!A8B!B!IH!B!B$#!B!Bao;!*CZ-g<~###rAM)\L~DD7oeüxdzUw(A=rC5nzб]֯Q^#͟ClYhٶ#ukפvkvYB!oL>;wb{g);u}zz>۷ﰲXtl׆ tYUI6Nu4:ek>v-vr}B°P4J IDATԯ[}<}鳸~VFvm:}![¥˼{TpX-,Y2޸Sع{^.S{Sv}:nK1mxCG﵈pk:gΙOPP# N='~Ԅع{/ժTe&DFD_ݟAPnmnXX8z޽FMqs/Tԯ[7]IҲzzͣ|lք^8;u,?B!=A.44Nzs6jHΜcmhۑ7OnBXl% TX(M,SgfӖmr)InIam͛o9t(tg8:ѵGRvd˜Qzy^{N۵g?/\z*M;wb<|쁘m[锥MFۑ)cu*w3f$fNDtihߩ;yr­t)^xɞ}ظvwlK8-}9zг[gZ4kWq L5" 9SF,\;wY8oN$r lޔ^}XǏu"Vl۹!锻)ń8~4˗iB!BiZYh>>UL>j,[6N|'KLT(W6;Φ-ѵ3-79ִqC?qVٶmI`` k\ Aj-Z6` ѧg7]nW҂%V[ҤIԵUPx3߸St8)Ņ̹iޤvv vG.PHcæ-88Ӹ~:\QTlڲ Ikܾkի!vpP;wѩ[/JL*7:??Fx|*W=#:56deL9 }qڳ/[N&U\xvZz0i u_|&-Vm:p-s~C||}ܭь5];qYzVwA\|>3f0Ե'޽שaV4Z-plV^K17zb#L֍kI ޻?LIn]8zDakkä cQ#F텋ɑ-+ɓ'׻rx:vGޅQս"o޾MڴcccVX̬i,[r|=1w4vnܡ-U*W$Wں][7ҲEx-B! EJL820<}|u+cm2P\|kk+\Gౣ+ǝ Zײp-[+ǒ%QTϞJX38VyY< uFFFd b\Vŭ"M[3?qXq˟//Ϟ嫼~'OSp!4 3fϣg.=R5 5Q"cuRN̓1շ׫z&&̝9 3rG>K9~)Zܢ Q!7mwnJݴiR3o/jZD[+(ı*eQ`~&Nʁ^}ҡ]ҧK˚0gɘ~511a):߹{OgoeJhX<%Y Yv#"ظp>)Sd WdB1vt^Z@Y{]j֨F6U+`mm9:)B!B_OЬI#eŋQQ3VYǨC9Zx266Ζިje.gkk}ʙ{{=kصWΎDEE_ED d ~`RRr4ZA;V[O-ꘛ)Y2gkd̘lܼ~2{JSF5J8#Yr]y9KRptLň;0j{Ԡ[in߉+)C$Ni3?z$9sdP22oE%K8SXQjұ=Z`_kodb}W$CI՟'4,!.kXwX hܼ5VRG6:HSՅ1~T.\kTrE?x fMLHH&OH6 Ç 7A7RJפL>v數3fVQ*]2JWo1sssH2@LL ?5-6Z>|ffW:t"ЯwO*WUk߸u6o?S!B}{ >>9ڛhQQQao3gD̙{Vsy̙15HJ ҝFGGqEFF2`03cI:(6hb5jXٰy1EKfj%Gu; ۇ˟ /D %o\{n+eAp)G,Ȟ׮)c`LܹxYwGEp38mF|ԩepbm}rPʚ4jYn7`otto\J~NߘRH:c6'Nfԉ%qFpP8I92CÞ}t5k|6n}"GZ8Ѡ@re]syJ$""q?nь|y(vȭ;wڳիR@L޳^=RPAZ4k]{ٷ?7C` .!O\>L)Wr!#ک=zFj5M6浬Z s,---O]g JXXX[8ŐptLEضs7.e&}Ysek˛m;v4mܐ9x3NTֆ}2E ə#;Ob͸֖g/^yvlmiPrehX.s/+.58s fI,*R V"S hZ2wԮߘ}{)_r.=0cD\K'/\L^ ͞1u֩ņ[;p[4՛7Z&,UӠ 9s`XOo̖m;Q ~~~9zL?_^ MθWHڴiw׏+gLJy`nn7ٳŝR>/_3R)+R t)vCtiIiIulQ/olcLyPԯYrΛņM[9!?J"Yݳ<`o׼Y̚aƐҪySlB!B_kXO&NΣGI& S'#sLqsss{euмz yݪ.UB!Bu) ~!,[iC9u,&VMZ*_Ri4 $"444RVGZXXh"""4?ZYYiyzzzE&si0q'=΂EKpڵiŶ . P|Y  !B!~ҥж5Sgs{8B*Ŋ)y$(\-{%P蘊ƍ !B!ЮW32?2p$~&t7n޴oB!B!~R5!B!B08B!B!IH!B!B[8 B!B!+K="GB!B!  !B!B$p$B!B! B!B!0nٳeCB!Bs-̟33mui3fs_8s[ [;wjʴj ##x|+Wq]?xHdd$ihص{/'NhZevmZ+g>z+{M4Y[7OnGdJéQ*ڴc%3_tgķHƑB!BXPp0!<<CӸa}6m򕫾.$$œܹrc6oۊwwSPݣ&22Ck{{3e,ł98pk:LV8|* #uj'ٷA!B!Ŀ= b{עܹ{hS9Pv-"y丕)ENH,w]B!B$e݆Mܽw0ҧEƔruѫCfΞ'OHHN)\,A]d|ϚÇȘ>s/؉XYYҲySWV&fNWB9֬ۀ?9sd^MF{f̞˵7IIM~s/R >%h1?WkJ;uFVd̐JYtT4Jj69պ TČ<~QÇ|sLJ ҩc 5{ @dx!񅋗ס#thךұ{>8]}5ʗ%m4DEEqqzϪKtq޽w(F)RXs AiW4j@~Z9d`B!B$o޼%gTRSSSn޺q?bEzZ&RvMҧk9% 1SΥj7aUTA:^c',Xf>f&o8O$|Nw?zL> 2o Fz}022bUŻW{ʗ)sJJ/y95?%Z,N)Xp ۵ȈUkaiiAeȓ;/_8:sFÂԾ?}l~,x«ׯؿ7Pq;@.QE ӪmG"""=-.Y8-vSԮYC)`!(eK 1T)sgjL'r-B!6_-) 5WGgֲm6l̠}t.VK)_ )RЧ rdF݁?s4n$|Nh6d ViՂッ='OY5d,YhնCR՘ϷlşDEERZUښӧ0x7٣ֆ)cgg@*ͤ Hrua}XXXP֭O$896hٲezu>œԎZLzu)\NGDEEjJ_盷oYj nFCTT^ҩ!N(88ҧWwzE ȈIH!Bƺ 8u,i"::̙2rZ/\LJYږ)&SɹXQȈti㣔%tN1C%h&MjcGw#]ڴJ }dD]V%БٶcR @@@F#C*ztZf >93)u+/h a5L;Pf̚˅KI&5ҹH R|WY3~NvЗ0 B* IDATGڡ];;処B!BhZN>rp) S4'A. QMxx8YcccN>h4>sF=>ݽ{(uXx89S޼}ͱYYY-ܸq NNz_VVVC!B!("""uwEEEq%9{9r1ȜKrd˗*eAAA<|;+e;) J˄yCH`GTzǏ<}\l/AHi?$~$8Ѡѳg?h({:}u6+g'OMJUugel۱.2j8d.X333,[A@@wc|/?'keϞ VYǏy'OINqyF񓧸x2{gQN !B!DRabbByزm'~~1y l9yv9whܰ/ru)SL6o|:}rkoPJ Ν]z-޲.yԨ%Flڲ PN-,--z[c:m_x)'OSJPhh(GRt)N9~).]Sսr̒1?# ģFUtu<|DzqCcҦMw0IzڏdL;[[֭߈/VV.X*ut&Z1RX{9zb.nDDDˈףO(ƣO~z{xr߬רYk-X+4,EKSQ3\*^6G2mljo[E*נwA9{.Q2}m:t+/\L:DDF[*mڲ .a!{ՠ#4to;ڣUG]/%::mÙ5w>:uխ"\h46mFXՃ U<ڳ/7o;U=(_::u:Bͺ T& -c?;^I>p&LƸSȜ)##0Mѻ?[Ȉ r1p=΃qT+,4%V՛ڻ "<,{0vpôs9VSؘS'2cDڴlwܽ! >%Y2gFRO Sמݰ3a(:khѶއh޺=ţZUƍAH<9} gJ~ϵע4iSlmlV26mE  !BOѵGÙ0f-7aͺx-Zv!!{ scNh(3fΖ];ӭsХnQӵgܿ/#"22}+޽{Ϙ>d+.d?yJŋw;"w >/^hcص:ӢY{%cog+B!ض}'s6窵j +KKlmm8*56pU:fɓ}:ҤIUPe !prJ@\'Oi\qp.p+S /V3ΧyFX8=w@6m ֹ#*M[P@~Rr=to\Jt⥘tXՃISg > U<(U2M[|Gq,]r=:uErPŃ&C7o)_oP*Tah 嗞ҩS;;vc͸ר{iݾ3e+ѠI N㇄}KhX|2:A#s33:këׯ9v"&R<|H׎uF ϧ;p ŭ"utzK#?Ýul߹guY֬ˤ3swR~\?-w~Бuv~uK/,,Rf=\*Ҽu{Νs=P >+w8r_9 .ӱKJw\jtޛ'O*9zCGP;54`՚:y =,{-SM[uN fYrr/s>w]!v #߫c+=~Bێ]q-[sC7q e+Uf݆ڳOѾswWN*tOocᆪ5Q,{]bCŊVTQTw׺vݵ^hJ@F#A>x3sd澹qMwAڽ&-PZ-zu3$/^@WUAæ-)Sh@jUhpRۙ}q4AF&K̼yV_7J_RP(x˧R3޽G6-?~G%å_ofϙKމyh ԫ廩spHM.bjffFjUٶs#os]>zLn]۞=w~PRE:Җ7o2wB"""7f$~tk5.}{:5w˗T) صƎPXZZ@>.ȑ cG68#,g!>Ӌݺ0d #9U#"8pw毿)SFڶnAzu\|3-kxۛQb/[AЛ7ئJe\x {gɗ'CLɕ1|X<=PtIu@\>S3_18|鞳iټ)˕ d8V1`0++VG]F/K޵3[`ȰY,oud7nEJ.\< /Qjee˖bObhP.YFXX.z[Ʋ}.:w"C'CvR2;gHVh|c9{l^͛XZZ0sdɔ81X| gᘛ`1g|?Ԫiz9SF =vvMDD$ VK6h4n$RR%h֪+Va(7ۘr ,,,QHZź}.L钌9eˠİj::o?pB(\p!vï) ץ~_ 6iݲ9[6;2ۇʕ*ҨA=J/jBܠOˮݸIhï:5hp0,'.Qg8 Φ+SϞl*G <"G$L͑#+W𞷀2{41>$=kPuk>wG(S$!,,,B!L#|}Z-]:fjئJE>.ɝᮃ{Nsq:o`0X:ZТYj>Z?.tݟׯHƁc'Nr}V/_Lș=;۴7|%jh *!Iy |hbhҸ,eJe+Y3pHw蘆#>a4nPʕ*yv^f l_Vadbsm2wT(Whs]A27RQ|AxѢW_._" :ȅjUe|9Dk4TV[֖cG,[#Nkb4bbcɖ5SXo:h޻Gv kTb8v&iA#J,+YMqAPPbPfu_h yF{hݲAyUYbo4k=U4jPF v72o/]Ѹa/@\9ɝ+'ܽ~蘆כ5cjm?-˕#;7oeB*V,O< MtO/<}ƪ_IΝ>h^2 .HN#e%R$88,,p]FwMI{Va6}z'^ JZ[h1c?AΤAٷ73m@S"#C0Wa Ƣuk׬nh c̚>0&MHQnCyb,H1[TXXXyeZ5WeDFFr}?s~x̜ O/m5۷_? @?ucvv22uL ,44P""?8rppO53e%<131.-FeLɹٽ+ٲfʊu6q3sg!Q09@t: }O^`gCkogǽ{㕛lmmVӯ#S888qS oρCj  쨣ӎ]\`c}5lLHh(aaDFELQфV5iէ֩EhX[`դLiC&ޭgH~˶b0͛Q/pZ~7 Nii|H TttkX>T*DfhffO_)DEEQ`~\ ?B!s_mBCKe\?KR2::*eJ\&]ڴ$Kg~>ܷ U#ب`bqϳ8n]:Ұ~]eko? ahԬ5VfpWu.^K'w.' 0ױeFƵ+i>ptfϙǰ!LaiiI|y9y_~&u2(U:,\666.YB𾾽zPH;۸p)0+ Egiy1vfيx͝OrehX.e˔2@\n 윉9~QqsZC%XzK|}hܰIA@,ZBæ^fİ!ٹaC.h)G4t-ΙxBBC6bE ӭKxK/Ƌ/w dʔ=iee/_gjZM9ع{O{I) J+/m[+}ݖ_B!}W'*6z?%ã{*l IDATחsooW*[/]6Jhz dq.mZ>{NH臜J0ҶuώaW$vѷULT(Wh {3tjߎgU:> tԪQ=r7WQԮY+++^xc'p:G4oךеg:oCj{ml}>RLs}l߱Юu+3o/1:2s,,,R"U*Wk?vBBN8}а~]T*Ξm;(\g)% `,:fϙGdTpѯe1u؞'Rp!ʗ+ٹ{A=˗#O\ uMPYXr mZЯWR6nJ I4kIpڐB`ƒ)Cl/1uRbut]Fcؐo\ozH-ɝ;'߸1c~ꓙǏg_vB& ɖ% aac+1aTVčXr5mZ6׏dԷ^f9#RF%ObԯSF 1C/n3`0XdaeSJeEyQ[x2=f@_O4ŃuȣOɓ'##˕xJ_ڐ#[6øqBA|yy}\qBF(~_4j,r/J(NŒ{xxzQzU2dHOhH(W&/sfgNr`R)c$nB!+1}N s %W=q>br8gߦ0z0 zx%tezLL.\`egN3 M4b Fx+VMS՚hCܹ<]_vDDFp]JGa0#WΜdHDXXA8|~[%1 eӖmJQq6޼}K Kܺ}ˊ)ݿS|YmENyCs~MAF Bشe"**nϰ!> )ŋ1{6K2)Б.m:*+LgyxaƬ9)#5w>=h8yS=Ys1rx'KFeؿIxIƁn;ҵS޼5UN-ұtJfxz#bpx۾}Mq6XYS&-7CG$tLիU? O62t_ O)xzy3c4 ǂy 9v ~ 6m5ҩC;֮=&3y ݻOt[3: (T* }b8ȲʊE R$Y2;zb._=OZ+X ?s<_|YƏ}~lک];wH-z /_*WT$j~@lٶwѐ1Czƌn4I8  KwR"Y0w6 O,Z Oʔ6͝6ׯZj aHh(_N玿|J,,\̘qIT'O.ՍKrT;gUQSx1_ׯ]8u:]kg(B{_ljMTUҹ};v7u) fM¤iҢ )SytMVLKL56j5>^x̜( ִk*ޓbccj ʦx0ȋ6A.lޔ7||̸Ȟ5+=[VΞEK6c:lٲ0szeZקɒ%ӗwܑ ҠIK;cO1{πٵkBBB̲fjP*aaa VkR,5HP(t:Zn߱s);r*˖z.]b"xvDbL?VhhDž$"i,_gݪV?Q <@8SFFM1mwEKپyB!_w2v6'NgRJ4jؠYYV "---5 Bceeupp޿_Vu|E(zNN |7`05jͺjl۾Aiܼ5bȰܸy+^}wg4nޚM[0u8_nΡGhӾMZf7ߗi3< G73gβg?8*ŏnB!*S$kV.Z*?)BBC2ԍHFNٰi Kvaa++y6Nxxs/Ύ:ӭKG޼} Wn< zÐa# zÀ~}p4FPQ<{~~L1!]5p}O=g߁t1 Ί0ŏn?]V]N?}+kk+f!B!~ɓ+**dɔe_F;wNpH }M@hXkmMX'x[Tl۴3336l̕['yd\཮\":tfv {L2w`4mنgy&\~N(Ve˖˔+[l{;;9/yܺ}^qئzߟJʳ~f^|Bof+W7'Oٙ}{1r8:oGF 0|,ٳbkR%J0Х/^ع;nxf՚uhӪv7Yn7o"<<2о]kʗ+kPWXb5‚ٳҷ7Ιgɲl޺I)Tg~zuaEwrҗvR _jUXfAΕ!]#޾ IL8%qe+VyCK;*V(WU:QQXreJӿo/'O/B!y'WΜ1 "##Yt9G۷dLn]^Ѷ}gFơGt ŋeܘ&+?EKx2111.T~{~e܄Itԁ͛y<  .|j._`{̾XELx/fmҗT)P(tSa81ʌ6\t0v$:pd[aH7H҆~~C֥~~6y*QQ&;".^L:=︹;'$4O1v"/^$wԭ]R׮3L;Qc)^]T* ,67qƢT*6ÓIS==3m.Z;ؾٲf#mGSLiznQz̟녿?cOdڵsB!{ P 9:y!ڵ)mX-K{ϝOЯwO4K ATfF\F|¯rI~<=~>0=ɝɿG|˔. :/o>ȕ37VeP@\Pl:uްm.:wlOV-(]$^b5,֥i8Р~]CGB!B!FPd \sΜ=+W>U?sT<560u*U*ѰAxu_afbbb1Z @i۾38LZ5}<ftO\^ZrS{CHh(p) T*!!IK~:2QٲmNT*%K#c &mu8q4~K̙{< N9gd)d˚'sL@ti38w> ?U*WdB"##CFkNtiOCB!B@wgmTXs.^mtJceE 4Z/]D5r;w8ڷ Ԩ^`ٗ{?NÄhrClٶ!\E7o0voqHC=Q(lݾ9]n naaa,[IYs8w"N2x ٳ3}_"pdJ@TRWH"E ʒ%KF?o,[aŚu변NNtYsrtjOΨT*6oW~7'ɿt:Opd͒v'֧OK3Wq#  0KNGhh>pnss!B!BWF5867ԪȠ\}Hܯx6#s)bbbH"UR 0 733c , tkr5(@揾v YB!M͚4ѣ 1Y3%~Z&#'Lkmϗ[ra 1SAS{KƌyAӧtdhl/qcOVjtl>~ti3fF|{`y\r&RhԠ> |O$9a\|rřgї=v˖5+=wC3,,-ʉ!:Zc0+&&s._ɑ={@qy#cw |ԩ擾|J_{M#!ٲfҒ#ǎ=vٲӄB!?P6lu=_VH!^zETT42f4!C$…vSc7$eʔL:FKTT\ϔRdq\ }١#GQ*.T nRha3c=Ahh,**B_Z4kρd" Hhټ)!3?ϞcYb%ɒ>eP6l̹ps}PTiv3c8ɭwҒiv dDFEݽ[nܼۨ1=~wR.\ dܘl޺ךv5 d굼x_0yڌx#m*7+Yng<ˤ)}:DB!}=L2l~q9ʔ.E…6b46mK;~%Xleu2Еpe:njY;~2uUܽGfe `m.`HF\Iܙ변pΔÇ2jxȟ//0'{lL4Aۧfj}:3f!886Zk sYshױ VV*WJF F<+ZicL:Ғ\9sRFum)U#2aTT*͚42dž ttښV͛~{_Jm;v[2fHϘQnF 'B!T*8~,Cd̞9TR1q;+Wa`c&W4k8Ikgg\/O/]B%cogGɖ-|ZXmӥM0x'Oc&׭~[әTf*53Nkx`mmEMbccͫWEF zׯtZdIȝ+v:> ޭ1smu$mv&w ]v,$$,k֬f~~~ Rij*R( Jөu:;+WR,}N&N[ө};7jC/B!FǣT2z!~8gr.^f׮ĩӟ4jؠYYV "---5 Bceeupp޿_Vu|MjB!B!ܑcǩUMB|&B!"Iï];`gk[#8mp!{Np}{SNլDy5ʕ*6twlB!.͟y_CG&(W yNpmT߱5:=K|}\JB!B!ĿLJU?_ܜNN?B!B!B!B!¨:sB!B!DґGB!B!(  !B!B$p$B!B!B!B!0&޼yK A%MSa`G>r,'@T{-B!ӴqK}}޵{&O|wepW^&WSv$K,Z-lcܹwrAȟ/~ׯ׸y+U(xʃ1_CmmMu޵3 n|un޼EFÙ 1ܾso\qm9ӫ{7 ,_g߁?변H4j@5ƌDgJ<9e)~Pk [5KTĽ!'N?UH!B!~fS>kǮ==wzuk.-7nfUܹ{ﳁpfzԮUX6mƯh71XgdvΤ:oB~I֑Is}K=.,,/onKcy wutdAjz KȘ!=^f)xzL!}ttї|yPBy(qYԪKҥKktɓuիUqlڲ-^X".Tj~J[n'88cgg @Hh(Wcvnggg=;033c՚uFG?ϝ`.!c )\qIڶnտ&c,Q Js}s\~iӊԧ3' IDATIwr~bEp= .hg8tڋ/iجS&c߁?8Ylllh٬)~i ܲm%V/m?u}9~$j}zQF5V]ϚuN tuXŵ79S&v@JuAxzys5 }ȑ0i66lʳϰV[ShƎ!B!B9NU{LɝpJPLiuGIPϛo YXX[fV%Kf޼yktH'Ont1Vf]ammM\9p=;۸`΍5g׮ YdT,_20?)Z>hPZU|/…K /̾X-&&+k+}JB@ ĵ ܽ{)bM)Y8%KMIm(!3<зw ;~"9gL !!!{d˖ sCP&Sr_ 5O)&ft 2 JŲѻ?kW.1 > t*Z4kB>=؉DEGKH!BFUtڙ-v0dH֬XB@Q]9M-3EDD$Xw|-OΕΞ@TT4Bٙ0vo;!>by*cjլnP)# %[M Os s-YZmMU(X ??ˤKȱ':xZߧ$pPvMj׬ʔ. * R`sJ,}_'Oٲa5\~CG?p.YmrdŋAݰ +Wcv!XU}B!B%ZvmZѼic ԬU;VZQnIGy+׬QzN:LN&FK[`PCFё!]P+ذq cokV7@K5}*aaaL:3gϑ)܆3G=Ͽ"p!ST*DEG'I66R--LiIttT;ݻ-kXa/\2y9޽@\_$cB!Bۧ[[[/Q._}]˗-)# z% }?2~TuhU)ܼu;Q: c˶,[)mhޤ1ݻuFP`Xl '٨KDDD`db4j֚e+V3r:/]Nҥȓ;^sزm#Fc&b__8jQ\|JmoϹYR+@.ýB!B Dw/QŕuJZ1'r-|{k6b4֦{&mjP(`( ZlNy5{d|_ҧwA:'000vA|tl_#s&>|dPZ-t>zDz''R$s&={nΧϞc֭Z iբVVV4oy/QHϮ"сFFKBpDՓ?_^z׮BBC9{ Ғ$MB! =VǷbmmEBdɬ_1s6ǎddebr{<|Ā!(Y8nC]'666^ٮ'wn蘆9tgԯwCB(\`L2x2SBTRط?ݔ.mZ>{NH臜J0³Ҷu }$ct\&8JΙٺ}#mZGRE-*X7R@~t=gQXY4ˑ'w.wnT,_s6-㒒J۲x "")S=v!B![) V]OLl,2d`˶<S'_GY~#l~#e !vSXr Yd!,,]ZJ>zLZ6? χJ_*YbE?Y0i*'Nf߮mL>+Emo eӖmJQq6޼}K Kܺ}ˊ)ݿS|YmENqps#LGTN-zm0iK=rcҴ4n++ujդequ1O/of̞FCX0oݺ`*6meLiCEH&;B!B&Mpgܻwt17C_G~7 HeDFFRnvhPǼ2t$:3K~edvvFJ"B!?'ﲯpejլ#eͺ ು_H^ l߹Axyz;aKd̘Q;oʐnIy%K˯];']XX8{$O͓+W-( C1\M[6 ޤwrⵟfb8KGCȝ+ʖ;p%>̉F/8]ޛ{l{1n-cc1j&5ico1|]W:H`eygwYvw{j>>/k(ڷ!!BGzvoN; Z:3KfM`Ed \n|F ٧[A1#o//Tv$m۾h.-bbXaݻv e/PTllG9=n:ETTƭ+^UСKw9vNs%PZU֭)??}hђet{;8 ے+2x@$ϘMpHmjÊ?J5o>;(f͙ǥW(ǣߧ\uY*:Bdd$%Kg?@}iӪ%)))lݾ$jӚqS,YRr%>#lml]:-^9 Jqw|4wb|`1ʒ>zкe ڳo?koΝѦUKzJb}|;;~ݸkkk:n>m 5k:uڏV& *4jXCabb{>m7PԔ-SCSDs#>Q#VP*U>3M?/ofӺmwf~}|l ڵzujaΊVq aqvM޵f7T-!! a4 [6臎3,&5\]\6dۼeoƽqtpcvtD,^}h4hތ"NK+㎝QD FεkYv=:] ?AѨ5,Y0O)WӾut؞k3y4J{ƚO|G1s\*W;δofЪes ~ZXHzu̙#GyM+85ժ:qhP.ݻv&2*icP?;wҬic\]\HNNf?c~Z ;;Ţh޵ ,z-ʂKHNNf/r[hM/GHH];#""077cXYZr~Zvl%;pAʎ;ٿ`z0g[1W6ʆ5??XV^˚uҩ^U+10'`/]_0_܊e:t$W&WINNaia5w>LM ųTIƍCT#7o1,}q-5mlPV J['խS [.^}h4f4mJ+pΜHgsQ#Xx)C8]B8OEDD2lz_jZFA7Ssa\b;q3gntP˷&wc݆M|:#}|DT*fV.]D@Xe+~0KQzFƍac)W @ڵ8vG{.q55']˗$6ݻvߚ5a!֯5lxU u;nꉫ3m> ԮE8xff9O;~йSkS,QD۷ڰk^}RT7l~>XXX0'ٹk7F w7p( uEa~٠}?/͛5%**u6ѫG7ߚ5HHH`굴nقɐjTFsulrHLLaooe_rt EQ5b̿N !BKQ:wlOoCĆ?3v̇DDFa/tY=I΃i3-U$''G8ihݲ5jTԔ/oysgxb/+W\":חeahZ+"N|?q:k*=ҠLVcnnR~xY[[ݬotLގoCPNN1lݒm,,,hܨA*S$=y4o"YydGZֻV=CBsvt|khPVzu7ww7)OFbb"]#kff }F>$]QC?4nߙGp nܸI G1UVFCիĽۙ;mvܹs;w<+H'sE&}9V-dRF~;vL9(=6L:e*uߧ1iZI$%%ѴI#uj`"#zdׅFA컪f'7 ,It}Mkr78/9Y!B'jzujsΟ@rr22M.%%Gb)89:2d\Ŷ{>~ۼG 7fgg˘>Iԩˠxp_ȩ~Olӳgϝgx2:KW[C4d%_U9( 9+O:nLN|5 MgR|"kִ1֬b/4111z Ç&66M]Ǯ 1AyVq4e˔y۰2XjiYzDEFA7 3ZA'=muxԞ,`gkkP.">*::|j:rvmbC1/XK JNN'-&11} C3&&Lz>ޜĒd,Q@ڵ}^|hHJz⻹ywO|ҥ|;뻴Ǔ ưǔm5j i1EFE0p{u!!n/s2!wk"}%bLr"kod܄IQ^]F !B);jdT5~xK@Um3j bbbo؄5o&J",4,ˏՐzv,-yȰgQJJ qqqYz"_~LhX џjU}٧?6n϶k[ʖaɲ~lcS~Ï+h.& }蔟K(StALVVV-RNZUpPTGD`$355Nm_8DoqA5lCLOl ЏZ5,vr]Lb0-ٳbIy6]N|p1󾛙Ƥt:r~FiFM_vڰK;@ddu[NәӧeH)ZGG?2xM<R?%RRoTӾٻWKQZlyFY:5䖻;7n2(}zާ'yqy6.E xƸqlۼ{Kw ۽9ھŒe+  W' jrQ7< !!ww[KY$6(?pFFFpW&r9~w睁XҞ;w>y -. iUA׮s,u wYŤ ƟA"..N_vsFx,3cjӳ$FFF=v\_( dXΩʕ+add@`ؘҞwObY^&^M4aY>B!Dut:sRo^re׮l׵JJG)?_3ˉ)r[|DWa3_PlF8;9ѽkg<<'t*/S0:GGT\)Z58saaSojrv܊q{x$$$p'netGD(O~JqV |'ŤN[Ǜ&ЭK'lݾ-[R;vw+f`oOoh2t\]\_>׋ЫG7,[App0>^(8_N;;[ڴne+pqq+mʵ7ru}M^uf̚ñ'u:| ss*T(gΞ[ zcn;Ͽ;n;'*:+WQ\ L۷-8];s6lNl|1-Ox_𑣨*xzֺe lqӱ};Tj5[n'**o=D;ߙ^G]S؉ NN/tlkѼ*a`ҤI .UѪRJƚNӚkSZm((v[nے '''sr B!B!DVj ?C۶ST**ZZ61666IV'YXXStAAATTI4iR>\Ȉ*+B!B!39B!B!DđB!B!Ȗ$B!B!D$q$B!B!%#!B!B-I !B!BlIH!B!BdKGB!B!"[FB! /NիW+PB sJ,Z-}^U\|E&&xx.%q$B' gGǂE!Dx0AA)]C/TС 88*efB!JH!^!Nt%+ɉmH!B!xe((RA*ϱ8B!B!ْđB!B!Ȗ UB!B!^ U{GB!B!+CF=i6Ϭ3l.?̌ӦdGsM5dO9"c/f}fv߷r4-wFɇ_Or)  gނEt+UԗWGbYZXPxB`구Z6Guݓw{| !xU9OQl|SBCC  z5B("KbeNsxV^KJ8Z~#+~XEڥ#:Aw}zaffOQ1s38jԠwBr=w׸GjUYlQAa`۵#Guh##!K,QF J{fTddF!xY|X|AknQ|h}M0x@||HLL,7 cZaUǵPӚ7Pv3s\-^9 Jqw|4wb|`1ʒ>zкe 6o[q}ؾ;B1fsf] Æ f/==سw?o4kz{xqޞBWbb"VVY34JJJj5㱷÷Fu܊7n$*:܊RVMLLLuo2=ILLjP}zu{:GppGG֩~H9Unny}X0c^e ʷmEKm:,,,g_L1hք56Nrex(\]]S3{pGQh,?#Xd)O$))J+2| J*7lon/ͬ۸_7K#:߰p2]gmYj>BXx8NhL~||<+~XŁCGd ؟ժDd^>ΰjZ122LiO1k׮3mL6]78d83OS(e||<+~E<>3P,,,(SړO|mm^`es}+IS3aXϜMHH(|kob|8j{٧?~{X[С};wo;'m|UGQ}CV-ܱ=׮gi,5cTTQep구Y.:U+,Ys , qμ :bl7&~9 k~gc8*WH"Y,!cᒥf mK!ɑWptt ccm:k^B©^+++׮=t6]s338{;C4h)So!E۷k^ҸQ4j5< &&F8R={P'*U+{];ajjB7QA FFF4m҈?w .K XG3+b܄TVJzu0gtA])쌏3.q( 㿘̵ݳ.E&Lbxw~V^})SړG#!1QΧ'Es/]`άh4[XbA2r);7Ɔ֭Z亭g9u ժz??8٣M7Ɔ\2~uj؉9rݺź գ>[ Z$쇷W ˶?iެKdzTIvĴof2g,YuNǴ3֥32B!DnկW{oA(Yƒ*+y6w6-quqݍȨ(Μq-Z7n˧6{prrU7CU]ORe ܾsieB! e7A vm㍭ Wޟaa9{}kN>2'kw{G#Ni;['@cSͷT*J,Auԡ>?#\*/@U/˯mfؐA:Vпo|kЗ}gϝۯFjKNY9]X˷&wc݆M|:#Tj5jS#ePӦL^֮Mkn:wl@JJ {}ZdHAQ?ߙ̞ ^U*nF~!SRE:o^Vh4-ԩoZAYRR|<G>h4z˞}i }ƍдIcԫ˥YnZ6q[9(,Y!R5Sr3t.rھ5Ofh4su%8$s/D& ک[3Njqpp $8ұZkmܚu0joB!󲵵cv٦>^h8u x޽>iݝPٱskob?~/De\t4!jBBaa+[V}o011œ!Q#3{7þ4>1ukrwSC4`]G冇;+,do޵3&fGTT6/_>i`eeEjU9wb )wQFNaooO[@r.سs<)WѲOlݪoj'%22o4q;>iηfuRӳgϝgt2:.K;SLbsr݊=V*YW U6<>^\,Uz3d@,[E`4ʜPJ's=Z6f5ʠV%11 ȨHyϠNz.8$<1| ĤGR'1tԨQMfxelΒEmR8!6ZKQ}B޻ /QZU㉋g?( ڴ.sJ]2fw-Y^!VG[no Kggg˵kןk{_ k8A7tFBTT4Od+[vSlڵo/62"<"m ;.do4#&&;dƟoҷOoeeE"Ez,ϩU;@HvxuZR$4,ßZj޵3OǣIJ`jVV)̴/'eRoז¾XO-BJDlKll,Z Cڲ74,J*+2 MK=\b[ mo?9T-*Wxgy-3 s=ݻhԠ~/(668\]~Drr26ԉS0166U͛9{yuRhذ>CR+"yyզ{H4nRADD$i=ʗap0._y(SNSGwA[_Qժzʿ;?x@BBbcw鲴g)v&Ĵof`ll62̓IHLV,>:99ҵs'<ݸyutL.v}Y||7E7M[QǛƎᳱcw+L^G66э%V p-_ė?ɲ "1㱼ۧW+y6)B˅PreᎫ  o//lILJ"$$ZEpq)i3]Ýs[:;wa_{(W RՅb\݀Bl9;6~&~߼~^:ɠΖ]bceȈeJg;i{R2ukΖlm&[e˔_1_Yg5;o~:lٺzuR(;vK11yvҫNZx{1i4zgRrߟFGڵq֥J˕4j `æ_XG=-3?M/&ӪesƜpjUVsss5Ϯ={iӪeiXrFFkgAN)Y$hۧ/ܜ aiasy6 з3ɄGDpw@j۫ o cيnogǗ_}Cw{hqj̽EK[SػGxrLiו9^>zmᮟi1yJ'fϜΪcm!kq N>C\\89:ФQC/*͛q,.^$6&7(Bھs$MuێV-?pFc !jU(_i*Vɉ4i0K,Y>Krr2;oζ҈C9|o֬@xDvv-[}lPTL2K`RX͜suLhhO.EG&٭ nc+~X/n&2* gg'Z RTLr׮cmbmmE2e WNN#G|'UZUoj2Vek-[o41XNm_vKodimvxܗ&v6oNhh(V֔)S-(TP?v?wD1W>p5WӷHII1G >+K+:ul.%@Axqє?DhhʗパҖ^w!ڳISanfFw{Ӻe\/9sJ{4i… `UttTR`&&&Fڤ$cTV[(b(ݖ۶.;{U?ộ :!gΞ~:Bg9!B!B<@/! {ǑB!B )T"=B!B!D$q$B!B"ѫ/ϱ UB!a0NB7}r 5WcؼeoƽqtpcvtxKYa\!66w77zFzu b}V6lhxӡ};Çtݗ)&PNm}(tч͛1_޽ǒ+9uڏd|9|hs6q8?kK.7!@w̠81V^[jpwscT\9B!BOݺuVеSGZ-+WĴ3?wA ӷO/FJRRVeͺ to*\`[?ݻwҦU 9"_N·fu> NԩN@NPs=d)0ىʳ!ѹ I3rG3066f݆xVXK<YMA%Y~&#n߾haa4emZd$&&Htg!B!uOGD0-Rs sODpHNzM4oꗣXazt=YV^O5k`{5W#4,?wOYzuk{Y:a޻e-^CeI:y%%%vY'oҸ!+~`(pwsg)6+)̞5VVVxULسw?Z6׷ۺesH=C[:VVVjs(¨QRg[Y!B!xG%K7H*Q`QUo/ΝHRRM42([u65qqq۰#G!a0IɤP2m;]F. iܨA'UaAYGF/Ȉo*KKߨa,Z'iؠ:CGw\;uڏիF֔/_Q\]\ yjwr7n*155 !B!⿟8ʘԻAjB'#ȨHyϠ\QCBf 8u d☛[; @Xx8`ooЎ ɜ<'B-JO\FxUhؠ~gAƏsQv5X79933Fr^3+/'vFMeXtWB!B+8z^i ӧeP(ZpF7s$١R6X?:r~JO~FIjҨ!.'>>Qd {럷rۧgu3'o֬ALL Od,ZO|' !B!6qTr%DbbVdNSd ܪ>}"R62eJv6ϼ8|(sqp1D=,,,hڤ1_䲿 mK!B!x#[zƒe+ u/^ˉjRJ+xr#^ݻ3zWS~۹4y0Rd)pw-dkcCUo._ITTnju5z ;ɉpN>C-ߚ4lP/ww;9|oq9w<5kwonb;/B!B^@^=prr[}6LMLpuƎs0fMi߮-=N4nԀа0.^XB!B<`oW!M;cQlmjZ!Bjֽd !B!Պ0ƶAB+-ՂA!B]SAB$q$]yA  :1?03_a*`le-D*2Bm+C]LBR1*hIV`$·YAK18x?瓘{)$M56v+55L9'PJ.R`1n*^Jd{QκP"!B!B u {agSzTf2;Kdqm:z1RRRNfd´jF+mI:N~h5^A'Bt,?n?_YxhmP2_W3DEHB-G -U|p"Gv푎E פXB!B!x}đ:7GSF*Ш0lj$ǂS8s;VI+{nL&*bGI#*ب3VV\nI#iCGeU܋SI#B!B!P'mfMP27cbںeuVdisYG@lCIidvt`yc5L6&*Iae`2S>E)ĸL25k۲7V5!}B!B!K6qRA=g K &ΜIgUdX~IRVj\UL'`kK#5 4a J a/B!B!DڙTU SC!qz\VA-' Q/wIZo =[(bID)3WaaVEIB{B!B+Y$\;cv*FUbΚQxÈn;1Φ*~rog5J!60D-T|X`[N IN¨ ZMRwdy,*۪Ĕh^vO.j_hOB!B! B;T `Υ$+eibSOad9NzߞObxy#[y0\"D;/=JV\"hY HK&חgy%uLNRq'#T=TlPR"gǠBd_yIwy_9I}ON!B!ċ+T%I:Ϛ]zKaoH|ɀ2.&Y}Y;e3:F0L)s[s.@xb+Lf3:˲ޙt:EA; CF~'=%oVO2&$$B!D*T#sfj%kry ( y֦x5T+rz^t˓f^98yEVR$$B!Dx/}A"/Ehh(j8m i$@ޛAHG bo EDE:"Mꋈ" ҫzK# lM6d!y>fܻ?}*hhmFAUU B!xQ`-&~l[MHsIIIFӣjXF !B(烣ݾH )ޒѓRpF!d+?tz^Jf !Bp烣$ $%I"O[7onEѠqRH!Bp烣U$B<=VلwW.t.z:-Ef !B0=hucIUUV+?>/]Lמ}f/ѥsG477qssc1zW^ ٹk7qӠ^]z膗u~7}%&6_<(^RR_g㦿1Sm ၌ `޸A;ڵj0~/tk_6>>>xyyၛzVk}$B!x8dPƶ/7}NbLR5'3 }<<=8{~f|3 |乯>xyk ^xAAA\~;wsמ wq6KpR?). шdbG!BIp9 rmް݉+ ˲n̚ ^^ԭSo2#W?6o!&&sg^}0um#B!B< nQhu68>3eлgwcǎ8z8.kAqWѹ[/>1?[ɠiڸK̲b4Ҭic^<Ͻ?KK&-DP > @jUo{}8˛j҄lZ(7o/8(1+L1={c1XC_Ln{dfΙƍPx! G*ڭX+Ws<==T<Θ5韫];3~NcK.Gg[Ыg74K> !B!xrM[<6oXǔ/'2*UU;~"FwlcX,>=^ЏmwñZ9nf7ߥl|:s>m;vtܑ+WڻTUeW_3h`0jU0|'^Nׯ[r0C{T|6ago.&&WxW>=xn;3ɪ^`'#)\ ~_=w_MJJt2Fh_^4m҈%l-Z@./8mdxJ*ɧٖ͘`!frhw/I!B!Õ+fFZnmo&Ob/#2*>ݝ7`sfNsX^̾,~zo)G7޾ mɘG7oñ,Ccqu? [~ȶ;SfڤV @jUٶc'm̢ߡOysq6msZPUb |/hLDFEuz<86C(22X<{vMxyyRr%kՒjU-^#&}nU|9:wlͲ\{)_Nf\|pFH/0zaƍ^'ɬ̝OUyݷU:&%~G$B!^gGڷccb2u;l!9б}o<Q NN<Ōsh߮ fus1jըfxyyraԪ6ijըf yRt){hms2*[6 #2*gPKXX(C^~i}}}OHq4^z331wZ4 ..Zl&&&OzZj'mkEZĻ gthnqzc<ٌk{&[;Z0/>.EUU|ghږK&ħsB!B<"8;vb9\v%CɟZ ktهdž6oVlUkXj W^%ߟ:̈8r,$&&B]͊Y'\ڷ׭re8,wL4c?a\p| ؟fd䄳PhH!H(fMyGlllY19i[U(o g+ڴr|hrShѬ)<ĕ(T0 o//ʕ-C=wssszo//0,mHytt !1EQ~ !B!]…L5:uD3wƎ7'9ft^ՃWd`?p:w@8~$3fÝmr\JyE3 a(W՗v:>Gٳo?O2G߻uʲ_UU|3yА,_F}¬S)ik?YO{M  mҥJn$''gٻ0%'mrʕ*^EҸQ o:60^\v?,KϤI vT(*+UPXQm*+^P(#Nl ^O"ٸi3Z.ڸNG"B!B!r'28q_N"vpgGrިQ<ʾϢ%ѭիU%%%`4n_*aoPvM^2艍e8$.\xݓҥJлgwɒ?;oJ2HʕLkBCBpwg㦿 dt<7~o@B|3gG%U:@V0b }B "Y }u}qf,͛QXQ,V /Q'uҙ?+Cɛ7XOiP?RZjRRE~oݺtHpnJhZ퍏ݻDUINNam }e0^^,ƚ_ײț7?Y>`HODu9v$?,^J{%B!y"B@Bۓ2~qCG0LOQ,#..oXd[n#z$&Bxj?F3йu6mptFs/̕*VȲm;^~8g׈Y7h 6L9SO?@Z5ye@4 ڙ IDAT@fE 3{T[EK@-7wxyywuk":&;vr ЏD2}df͙Ǵu+?*W@"^[(|6f4_+W%K؋>|T;@{^ b @L௿c`lǞ6=M-sEtLL,L!QNg#ի[,Qx_m9wִ,I'5~2:qcha Ϲu2ɽR!/XexKsehi:kCvmsuu˲ܙY5{ ͞ir~B!Bp<ѽJG3qX{PUo!K{$?_[OKȴLZu-cbb ϰ%ʎ%B!B!uAPٲet8y,?ٌh3}lf׮=m@xx! 4{v ypwwڵNoڜ^?be6JB!B!xGy||ѭ 3f!22ʣ_Б|`0{UUZn!B!B^ φ: -7s_Y`&|6&/rؾ;qL1Ŋ2ɷ=wޕCgۏB!B!xjth׆|CB!B!- .DbOkB!B!MrRztoh -=G$B!BHf !B!B$8B!B!NR'؞B!BX#/OIUUV+U*WẓBk}$&%7$P4Z,VNNCѠ(B!gTM!B!B8%B!B!pJ#!B!BGB!B!©\T5Hdni,_k#vʤG0sL]zȒ(R8mwG>aeG4B!B!BN11L4//qYưj׉z;ߨP~~]KعkzN<ߵ'l~F!B!3ֹ4zv^g9 sgMsh7qo d40sw̝==@J9rSNÃ6ҥ˔)U[ap1p߃?|$_NZ5_d:w@:عk,Gߵ{ ˲_UU>+F~CCXϼ0-KxsXpqʖaI\Ll 5WwԮU/`*FJX&nnnL?\k|`!;w&>.ԫKkϘ5/cժ2q:wIV-գ}0,_痕?f8GQd zʺǟ3[67wzFQc/tvwr) %K`'EKvz"#qa6[zt6oيjV }e0yX,=>??_ʗ+})P Kf9|Y~B!~=Ql fO|pw>H kLc:uhkߎgb/^"k %Ȭ9QfMYQQѬZ=84Ww @Չa8Ĥ$ΝxR_ʕ) ~}6,\XV&-._c1h49x1}}>>/ZBqwwWaz=8zN`A/Dٳ,]3[)_؃{ѬiJ/niJ._k א[:u;w)-#go/mFz믒b4ra!n,a zvtRȨh^Џ3g"pfhZv~4аA֙R̟;y?, :|<3ݘ5[ ե!|5e*G > ^Ⱦ?[qm0Z<, 7v:E~N:E:|Ν;O hȾ/99 &ӶMk}Z9熍4nܐ/lptt i9](֩C|d;`X(kհo1rNTsyB!BYa;d<7VC(gkop=2&˯ѣ |;e?,KaL];\? Ӷ3ic4ZsZ;)o4{'",ݺ`҄ll7QZdJ붝$''gy<ĀAҤyk,SNhҬaמ9;zHmBw} mF#_|9Ӻm':|W3Sg8lhP}ߖۈGjkUU<=<yyyVpuu,T>x/Τ^ 7!00@*_» g@>YB } 7o:le b8^y-j֨FΝV ӥsG*T('6c6j^رfF'y|匪Lk^<,YG~OKD9A3a׭͊9x05~NHH^2hf?<:Ric0i2C pB-Ly8ˋS >ܰw?y @dd$ݺt&ߏ7XϼpOlXn=_KhHVZY;ӰiK&c xW;=Ͽ6RF5<=kK9r࠼ܵ- *:a Џ:j۵nՂ%~nZ*YSϰzͯth ȟ3ʹ&$T^ʼ dl֭Zjͯ;~%җw6P(\87™m;ֵ3Zi3f3e4RԜ~^B!}OUpTB9z=ǎM&L&Cb2ض}' Ef}4in=َ7\z?6El˱6m*+%yxxbjp8ŗSxyK5M&϶1;,͹t:-dzpRzF=#/tF#G ?TP/e՚_پc͞iȨh:m G|>{]둑lw襾/Rz5vo|9>5s.Z‡Ba_ |7"Ξ#PAbccpZ*t'G=c=\+]$-?æ[غm;6}RfGҥ WtL 76}^K޼,_a{Nbbos?z 7B4^^97w[`ʛ}>uIe(Z0k92(LՕF̛;BYsl߾3G!B!SC=2u:׮]JJʹs9p}ABr,^#˕EEeߒlȏPb֩ݻKDPL)?( a|%#ս5w&˶re˰}n;-[4`o \9et:_|o…:{0&&:Y -!..^;,, Ez=~DFET/ԨVաypX]݇=HSF5ܰѾ}߃,XgK*S1uZ- eَh[M /R)VVBe(R[RUUys+h +Vs^,Y`+*bjԗR%Kp[o_*[LS[ ,_w>δobmy xe@z=wG 岽^* c l[FϋB! M޼,gWWW *ȳ 0{+lތΝ:M6M4"*:/Leԧ(W4:7l9ZYh6Q N>C|٧qaOv[~h8~lHQ*U,}ûgҧˎRQ(sͪhpu fl&&&,ǯ^.}̽s72L&}//Y3qޠIV+=w7 ӭл^~#?)/]̈́J-:r;u9VU寍W6.o2@ҥ8{nb9օ]_rh4:.^͛7D,88ڷUBN]Xr<=%mڌlgaоM{3c0dYOf4>K9!B!28 )sXz?|6u_Y/4vΝ,ySi5mW_OeϾTR%KOFЯfێТFj`2\z$zTR~93d;qYۣVml]Yo޲P\G=Epp}嘢[يo>|{quiZBB=vwD9-Z{?6ϵ7^r}i)6s&SQlUW]h4R,)ni-UUr*m,̊ ww78w.>'aog)["B!x:BB U8mj NGDC(V~U+߱lf-4mlА7ki3HJJ"00֐D.[&h2J(3,a ujմ;eJz|1i 7oB2swd{ϝ߭7X, mЮr'&9!B!=&^_ZjIV-J_-[4EWSҦMGNۛ _La#IJJbgcQ*/N``WbոP0,͚>)R83݂,Zhټ{vRK(( UDEEEOGT 3;~"ŊaԈa!+С}}?(W ~~}&3~'L9 ./8ASz]B!B!w .\YsxSGz=s/` |3yCoN^=xu˘L& -sT(_'N2c\=iټW\d<ۢC0qxիU`[kjTgϾ|>ԩS+~UU4{MBC |j> O`X2!B!BDG7n0 ΰFE`@]u IDATF h\+v||<,G.ժGM7tjDİuhKS& @Ue8$.\xݓҥJлgwɒ?;oB!B!Odp^=4(\Q ;x&ƍ8Q,#..oXd[n#z$&Bxj?F3йu6mptFxlo۾|zѹP֏8+1WXXυQ썶M vEY @-nk}c_@F7>uU/BQeu Zi½Xο{codvm_|Zh)9>gxy',;kQaZ^n\Ud4t QSѪr2A#&⌶FZ:$XKBLʖD1fH1=5hQf0g"B!Byyy9l=ht@C adT>>|T;@{^ b @Ll,plǞ6=M3Ӷ11^7# vSj̓&9>lQaaþ/RIC:D?-=8z y*d ?5s=Y%SCP-h&ƫN%:DK>7Y'od}\?7 TPK!"!Ȕeu:F_V϶( Np@I ZKm5\u,=kx^Wz,wTyŒY{+ywN}1֔DʎXkPB!? wj4qX||  BUU6W /]5|}Q2m;zݼuX3ld WwMԐh=/+a0aUnU^ّ&Ke~MU6{FRCQV]Uup#R9w+АǠ> 5N!U!԰=*k|B=| ΤkZRRO/^r<~-,'ڊAQPOØ숲ݴF1 Tg6fƌ Ǭ?B!? ʖ-NStL&F /?f]` <Kzu۟|}εkםߴo, [nbN J zix.Tǰ},KE? 84ʎj}SÅ /yضU!:\mKV_Bz8z)= [[h#])jI=12B&=ibo타 z(L;nFi.&lZ\DPPGP-:vFYqDg_1=4|w/-jga=uj+eei33W*$UX{ WLO -U寫"5{)ěTSR#/ٿzh+OQlK2*iFMab^ ؝3|0JQ6G#:R~* y>a !B!(=uaƬ9DFFRByT :rGGSl~Z2K2}lSR@]Dʗ/k{]>1(B%8ycWE!4VBTT4]:wYp .ό&F7LKеq[EѬ|Vh++۾V]mafݰRKC:*\I5RKNiVrBQ`P sN>L ۚ)GHaH Bʣk{n4ɧrʬf\zqèHap =sO8wK K"\MRedHbsfbRT B韕>E4ɧei3<v;/L+ M30[f0AZXT  דU*i^X[*O~:p"^%KE~-^L+]JRDBQX, 08>ّB}wB!"*8գXBXX(͚6y7tw6iLϱi{ ÷g1~$J*W3َ~:,~d( #ȗLYxG,^DUUg=$ai3Brl?yg$j(wqɿFvEe?ۗ[fʽ Xv K\@)cpdB{Nۂ)ʹ,W^K&+||hKuj#`3{2̎cm%BB::b[ewoXWDž0T2tz/ȌZycW J8ge+jerji2+!C%_m[:jr^ۙlY3n:U`?w% 2\S8RinϐewhX,DDD[oϴS~<< !B!`28*??~cK>8(l̡~Qf٘,acYݩ46`ڌ?o/ViL{vg]q.~Y쯡I?SC\Nr/CR;)kh+ +E*},.50+"y썱83?{KUHkTXj쉶R/Hk.GCB:< iW- =tC^$jwS37 r4;i%;3BR9~̆Ԡ`Y]hcQ[ \Vl҉x+֑dV!o$I8qYۣv8uvN@M'tkQU8r3\ORֵJ5U:b tuyS^9KM ے4KXz)=]O+GAaӵÅ[?#E  Ip|ܴrSJQR_A8>/]a>+j-1\~ɓ's_?6IsP!B!Eu\KRdu0 &4[@RSa 3gnZiO;7iv^ 9-w)Q+㪵z7ϩOK4,tH}='Sku*cgX1V 8oe_tqFl6yܹ3GxRoFʟ~!B!DȷWl-z\~8cfHI=7અQ썶$LTJP-BtXU.R<~.#]ut([ K#,Yj V 0%\G-.:M*UZsL:qLL89'Mh=Vesfڅf_;bUWk9t;U4x/SKq&NxN%Xȵc&'4>LGLʺfE8?ᐉt/GQ`w'̹8FG*~L&СǿL7([(!B!:vFR>DFF* J…H`޺uKcZzd\5^ZfUN:n!Ս]o(jshչ! A {ejj9RYΜ:Abb=DZL&NCUUڶmK|x-4ܿZsQȓ'>>>xyy^GӡhP$B!OFm\[EQbEIZd^oLLL4i4h4ZgΜQ@L2Qcq8"}!i5m@#!KҖ)}Qߌܘ3gM;j21<}bR2zC:EbM$B!C !NؖiZZے0jbXthZƍoXOLp$B!x|r:!wi4Z-z^ot:̘1?w$iwȟ!B!D䛃B<)b~҂wQT]ߙݔͦzBGH"*VAtT?Qn#t@6[fG#R!sΝ;#=w0i2B ) FDDDDD9.U#"zɒ M??UU(4 k׮E@-_(sovu,L8ϗsFR~d?p0=0E('~+ΘK.|xp.Tp%nG~[a c>j V}.^D޼ܡ:wlh,^G!!ӳԯ6`ːիcY7~ʕ*"00ϿmۄON)3(X|U ucibKmۢxXt)x{pFDDDDD o93f{N0| Λoi߷7|",\ujU QL9f[=8B˕CV-a0?;)!VMv`Ҕ%ԭ`qYzڅg(Z0VCeKxʈ1&I^ȵZ2e@4# OG&ۈG2pt ̟= 2l\Eppޯ鳍6q||,}z@>=`1ob=pԼiժYWa遣@zu1l @xXM]æ[:$9al!덊O?ҨexCD$ C`` @Q(Q*Yp9=ptjn;hl#:ᵰxin܈V,^?˗p(Y]N:];l㆙_!2>ϿǍFXͧiӧFDX`./1[/k5Ƥѡswj=uѽ56`/ͺYf(W zt[a꯱Yn}i,keIq+ļA,Z'Nd2l2xo0xUUŲiV^E`"wq˚uϜ"VJOѽyG+WhcЩC 8Zq8^fdB%!4n@oLٌK.gx?;?BjUM0u,p ,AY4`stRٚߣi(S~՚up"xe-O1Szĉ(Ud>#?z?]۔3Px1я~Ƈ^:H&|/WG.(_N8K࣑cp) zs-?¬SX(=Qi3+^*3Ͽ0q(FTTWF 0u,$ے莏FF*QNmݿ)9Ȳ p ϭ\$!H|f^E>.1y;#>!W0ĜZa5([w? zGf$IBw{/^-[iϿƍv;L.>(7q*RɓWv~i?7пqC-99'OE֭0xkz{,mwQݳqqװy6=pt8ۏ1Dnp@Mҝ;*~ygΞq2v0{{Xr5*V.h!4ʊw?Dlm_}ĩz ǣѪM;<ۢ5z{?91;g5+1nm_]ixwZcY"qӖХV6e+VѪM;)sۂMZ?B_Gfcrr2͜wA-g[nëo sۢUv2lNۭnǧSEѪM;L9N3[pT 7e䉓1fu0 L]_v#>>RkBdxө,X,_샧!TR سw_8*R3smKǭx=n[ ,}}ݎ;uhnҴIc|6}& 5Vl,]ߧ={z7xoxr[v Xd)&\Ӻyf6o$aؐA{fϝoaE %K\+ <"i\ҽڱsN^haNHpђ/4j9:uhʕ+ر=w>ѲEzM[Pp!˸y!O?B`x(Q`w?DѳGW*X۶#>sRpy4i Ķm;Cl,jz IDAT9g6mފzHBX~#v+KoФ[`Fo xՁh Հ}cXh)šhH ukZlF:(W,NK/9s L )Μ3Q=ǝ۷rl}v)0?x{{gkLÁZM*>|zu±`R(^ ݺt._vO_J1X^4j Ǜo `ױe6OBBDn]+P6DJh2bOQWbcct~{e{;M*+-&_e+;)A2.:еGع /ׯ_7|OWG4sgBɟMGreѼٳOe1|(YHi9z _@>v 70{<AXvc,?ŋDt$+O-ѿ%Lt JX,>}>`ѭ3Vv&ܣbPw?6}-7ln3)g{>;B?nղZl o3ۖc1\1IPJL5i۶@+DڵB7o`q||<W߁ܹ{GF#[,˰Xܳfp 4nʭ]4xzzH 5]╁?_0<<<0r8v@\\J]SYbb[,!ͻHD8^?3~ƌϷoСw MnMͥhѐO4gg]|vOTЄK!!E=PU3geѽ{vUʹvN̜=S>M`¤ϐo`zؽ{t.\%''SdBpݮ=pq `4p I D=իUKaͫH5ew۳bbNSJh0`&"#|!|> uky&X, ĂgaѭK~}2U+$I¾vKp8:%S 8z۵GK=O+fϻ<߸jFQ`ׂ]?RFo!vL;Wѐ"(^ݏۄqGbcCеKG D!IRˡ,TR KXE@Kԣ[;+UwUvݺ`jU@3g⯿1jYzCxx-TZC.:du+ G(;eJ?ٌKDpE;ۊs1{<,P k#ߙBN>7_O*[OWk}#Ӊ?&dVpa4k3gυjEPP^[IIVt@J1ƍ`يUe©ӈrBpp |9Ԭ4>< 7oނAQEճʉ( h(yGmhѼ lLn2v:Kv;b¤)xyS8Cg♺uO0}l"!Eг{;wa0i z_:K6xqqq1k.ƌe1xk۳GWŚfxzzhH5mdI¸cz5-SZb?YsѲu[ϗݺtLW՗C49m@PN8w턕d:s8Эsǻ^g>ܼy3ej.C?__|l%n޼ҥc ֛ȟ/oێ+W#o` oz6V#0}\L9BhVo*c?Ƽfoxyyh4`0@e'""""7ÇX)11Q*Q+L&֭[iFooo0e,!oظ>+7n=y<\ ^gՙpԗe5ۈA8pd#""""z5wxJϷ$$Il4IIIYfYjPP#, "22RK՞ !E ˑ0"""""""̰86e#""""""""CTny27cdl[^I3˞>_Ƃgxw{1z,b1F4C"""""""{(GF}~|uL9m_zBE zӻ/,^/=$I_~|@ef)WƺWǎǑ#G1TĞ0g\|e˔P`˗ѥ{/pla';^ `X~#.^hb}ߥrGbيU8z(R0w턺uja X+$$&Zx6YߣbP}e+&Mc>s(??^a5k""""""""ʶG2pt9̙۵h%K1fD̘:٭ߌsгG7@8/DԲ%TTǎ mFfM/^B2\0Lp4>5GFf~YsBV di:uӵ !0ml 6E šuA'7g&WFDDDDDDDm8$IB.So)?_>}ثW7ޯah|K8!!VB.ѽ+faٰ/QF tjv ۬\:kW_x:_۶uVgϝ˰x"|]랽Xr57DDDDDDDDtɌŊA#(Q 6=pTr%+wkYVB|||aZl*n^鄪(zݎӧѱC[qԯiƍx!U*;랻IDDDDDDDt?<#vڙn'xխݕ){*|8xwŋ7^B 0Oq3kwMbIslAܵkKDDDDDDDQN&??? t ^# @$$$&]8#[2<uxt*"""""""'_P!ODH">L&N'v,>f8Nw@?6L(^ro! ޸|JwK\UUn-S&{JDDDDDDDO,IDj={De[N;obccQr%gϜ_G0a4QB(ZC@`l[[N;a*U߰iL Iʕ-'Ofxn $HBX\N}F-Ҩez]L:1F|02@sM0u,p ,AYZ`#(Jj=(;^fz4_xcP=w۾2BܵkXn&B5f鿱hIzt(}9QeYXV(pxΎ2Pؾ e-}<nwEn*??&wnm_l/qk}]5sHZJaw6{Wt>|>  &4fo %M>F|B33jP^|||dY'7 ! _'Oa̩(We~͛6WaqX;('""""""OTlK/Wkݗa'|jTX!]hC1{g9hx<Өݟq9,Zg5Kwͺ D.=n׏? zqV8slXV|i3ׯ4OOO \]f5} &^6m;v܅G, lsxQ3 |uP6ѣ8ztk֭//o*>&璐EKfU7o{yy JeӉcoVX fS@@Jjђ/4j9:uhʕ+ر=w>ѲE3}Gt" v;z8l6խ< ,I?ѤQ,=sZ51W0u,,Z EDDDDDDDO,"ྛ[iy5pkVQV >>^/RAI|&;e&b-;z]TV4>2"IVC||<W߁'R+_P)((/˨>8t:YȒ"""""""zyyyhe3s ,Μ=YC⛒7e8}9n_֖e˔vK5~y74!PrEd2A4~IIIٺ/(QddÇ{߲,>5cK-MQa0a*UO]^^^xE3 =涳Zrr2-B`ԯWWoʋ/ǟݎ]Űv;yDuIdMV&HU0 0 e9ӥDDDDD "222#f=}-OH>;[ y )={v0xyyHCn]0{|\E*U g_5lg@p4 y^zeJ?k׮a| >0mWzu` [' 7~#0yxV57BRۈW =Z4oH2>6[|`;?wVǍFXͧѳGWŚfxzzhH5mx{{agU\>fTZ"?@Ѣ!ntj8x?qֵV}VSh텵7b%([ ̜zOa'~)>|Xbcc吐ʕ+"IA4d2i(¢iZ6ʍ[oOsaj ^gՙpռO#"]B󃟟|||ťjDDDDj 7aC#;o6,_$)QU$Yv.˲CLNNV3gΈ KHR0B~ """"""GC8L-7k֮+5m09sĊ(Y];pD~ kVt["""""""H$`0`㸸k8y*:wlʕ*Elss F=G,qsB˹ vz#8vԃ z9_ѡki _s/.^cwQqs|AU_ANQ~nWvxkhxq3t;vJ7נ PQ3 6Wei|*WE c1t{Xt!+z/(70 (`6{cȰr%Az6B XKfǼQMWf \,Ű!a5w 6oܓVslųد7* ?KGd ݻGrZ*Yp96֭ժ;hl#:peܸ %3kVhhTRu2,˨ZGk IBWkJUY3['͝BDDDDDDDt8$Id;AXkj <==QXQ<׼'3a^hf7Z4k^¶;>M7ո8L6Ƣbx{x罏2C1obhYvO;*c'|SbP@L7 ŋkBi2Pf)\~ٙṌ ֿ@wZzέ~QZ >Mrnǝ:Cv_M3qofre`xm>зWv{>4j~ҥKo(St.`ZbWhִ (p׾adxBQDaЯ`ʴ8v8̜ 8}oq"zt,I0DDDDDDD\ 9H$fP||ؾ\.p-¢%_do-K} F}!r* X4yr<ߜZhI*Viȥ^(\[l…'ϝ!X$ =u%'""""""r{5Cq$ѭ3Vv&1W^ }s>ӨYG$vx~\X1 2 ?\U*߱葙/1Mv&?'Qvsa+՟ IDATHe᪹(8zXX||зw~ܪe j"W.V4[ߎMݵߖ﷣XѐǵDʕX.by8p7N'TAB rJlfb^ٌҥKw!?1BN68vv܅G#olJ|2a8~$<==Ѱ~=xzx6}'M)1c\9WChDDDDDDDwB`0sG!A ? \t 3fr|+)ǵk'o ~& _.[@Ԓ0 v,\OBBb" 6=KcX|}X!`$sjM͛7cɔ@SZ51W0u,,Z E{?pCgAp#>_d7m} !&NW_Ŋe=`9)G\FN37DTܩ>3?n6Mɘҩ#J,V+XL:!!EШ3VCu: XU*UD.=xyS9v+C랩['[c?,=mՁ3~~Vh\F~Æ,+!Z5kdiDDDDDDD9j0EQ9K>bcSسgZ]-ZɄ_s8h93Ko;x7ԨQ]/ʕ-cOMTXn[uQlVVȉ^CErM;~C^z5('N-ϫZ=ݏ迖dFQk ,P$;!\5F$Pj֨r`LHVh0`ʧ!@Li̝ysfY87qjigkU^^f͞ŭ[o [w%)KcDJݱ8vN'$>> Sgv;p:{~,2,\7ѓfo/cF# dY2""""GoSϿN$A$q{]j G6 =w Spy[!4 μkpP>=+FoyoIB+U"?6oE|-T]L% ھvm_ĕ+غ̛ s͛fi+4_oLw?ci/ 0Y@rB6Y!)FHI )KXX}r{,<==nܸ)"dY0L"u\'kVտRzgǣ .3re.NJU_axE3HժbǏ7o^x{g ByVc_]ݞ+ϒW1lݮ|->``QRGHNN1UcY&g%ۓ=u/tUUڠ!8x[ߎ'c?&6s-~%Q8s,V1|-`q8;ʊ!E^#G̙W/Gb]ط6|-\o!""""""ʈ$IµL-7R5a2+f$):e"-^AujBűl*ԭ͎(w8x7n~~~񁗗A[5B07UUMRUf46M-\#, "22@EFFPEDGG p8eY8NWT}Sr%c,k$ өmEAL&iAMvUKLL, R5 *GDDDDDDDDi(Zv`IűA);vp8i(jnLOQU4UUUtj&IKJJz )::ejԉ*L&"˲͛9U㈈IaZa4a4 ITUh(qDDDDDBueɲYVP\\V&Rb HsÇH} a4Ej_MUUU$ht !.^C}#=l]ݎ[ǖ$#""""H0NUUC3LRb8B4qjw+풭h $nݺj&{{{k6M4!˲ĩX!\#?="k`ۑ ///xx((Q5MsJzzzIII,˪l+ejGz+hǎ bcca6i*$IEUU5A1lFj"WR*z*DD˗/+^^^LL#"""""7FѦCUUC … kZGimWc9&&ƍ @Rš*$IߺP$0JȲ,Ae!!ecן KEQɊH+$ ,UUe٫R*c=YeY !,BU$pm;*$I\KDDDD=ϭ?N~GjiMpJp:ј,Ip؍F?;l6_E4h@KD2 G "RM؅6B85MS \Mۗ1pDDDDD`لB (t0h*V^d5p:b8|0 mjURS$YQA]Fi3wՅ4M2+Cn+,+|;~܅ KO3p8:GBQ)L~턏  FRS+22R2Ǖ++66Vrr*L&a2D||eYx{{ eۢ%QX,q滞7 ˗/0x;b<rjMƢ%QXBao {wTw$mShKBA,Ђl# 2xUDP/*e;"*3R; u0l-4YG{bӅii?%'os \"#= :ṵ/kVؼ%+W= S ;w#u Oj*Zog@N׺׽)ZddD !0c,:ǤֽwMêK,}ic˸yHkc9{A^{MdgS&aXZX?#(Xl/ZY<; ;1m%0Lsv s>7y k}zKKK5M+ݻ'Ly cݚUPd9z>ݱ fōÇOxj3B=1w>mĽfjVme 4yYqtHuu 0 ;Ϭ^s|xrBn 84 GF¦-K1vh8O8xfraِ% ]>ZڜP`u K.?.^~7b @\q.W^{ f-.wyblڼ5װ;n_繜N4oV^YuiP*8Zit9|Lo Lq/n}SZMqcoFǵV"""""":1'+8Ɗ>m9***. `0(4M]`F=V{ښCe;sk:疦$,]4n;zl8RSSѱC|w`RB!\.L6֭ZEZnH$#GYնoiB Km}Ӎ1vywD"ػo?~h9_wp4u$9c*--7~iS9ޣGw(>ͱ[.'$I)vkBQ!FUf""""#CUDz+1{Xtaz-؏w*vjҚc@ @4zbqhZLGyW$׺@j0= z''#W*y( "vܲWsڷu8/q/ c%1ߡCDz,IMMCΒ """"_%G Ξg$˲,ñnj 5Vth{Z嶵:]f͚!x͸r :;blL$YpkqkQT۰|Jy5<^%{$Iv5,GMбӞ&2\úco$Iѽ y-Z@RR!Of76m?y⺆(ѵ+iaEx4Zk>¯ӝ;+wk6 ލ8No6ZmTl݆VYYvi`Yؚ-H4dv~n)0k0H$ S=oeþgGI"""""_ )))())#," A4{1y)<$=fmyy!.#n 0i:Zdfzqp1vڍ޽z≿,@rrUJ IDATr:vDJJ v9&^>`9kz".iXh? KZGː]DbrssװסGtly&1-SV<{ߍ%˖λA7 lyj—-O?-/{$ᑹaeh) @nNG@4lxU,̞u/]- `e/;mǗ{ m"k1~?.^<ܜ:ef͞S+Yg[`˯`3ѡùXhztyO)Hْ5MS"뺦(SQ$]S$IjП٣{:N[""j;v$(q8iv8#YYY糼^jDDDDDG LUU!i Yab85ƌ>""jdY,a Nk'rssx<QXX}.2(eY(b)bYwpDDYe)bU@Q4M8ΘJFDDDDDt% -~PUU E"뺰,Tl5,eiZaXYeee" 2D'""""j` G^WѝՄi( UU+W'DDưTUPEn[Tt:ErrUъai0a#":Y u4RUU$''[JIIaXDDDDD@%{ΑUnaK4˲,Su]Hqq17⪉!~Ȳu],t\f8t][u75JDDDDD'Hj@1^^gI^W|ieYBD"(N4Bs###NDԠ~?fzSsE)3M3iZD$Ce#^|U#""""":A C>Ir 233咒t*T$I.UU!*˲l"˲,,˒E1ㄼ4ք$*&I0MSH$dY$IBSa0$I%I (BG3ތp8l6o***<߿Ј%dp+T%(38UU,˲)iʊDC#8VpTxP%!E$I5GeYLӴ70,aD4M [FZ^W_a-!""""':tcU9N5(ʦiʪJB4MAeYDtRȲ @gہ, ð4M3QQEGݡ^Ynnسg?N'0Ȳ,Ke"˲@u],K4M+%j%QSP'ĬKeeYB!jUgYei*+O5$ vX]yTTT\.p((HD4M6MS2MS,Kr:RpjPz슣˲,ᰰiD,M,4M]P(dfff4""""": $avx֭[KvۚaR8$4 nJ0(JGÖTU`Ъ)4A0PHlǬ<Ȑ=* Èc;@""JvPjLcEl~QGh1PHlǬ< R 322$D"~Z5`""jhUM~x,-XiDDDDDx 4 5VeggKR0 HvDD~L`t:n" J#""""`i(HPHJ`IDDM".Kx<J#""""ÀiVy@@P($$5%`QbpԴT<;@AQSaE6+FDDDDDC<;@U rss҈q1`hb UU5P""J4v@TU*#Q`д(%5" M5"G":00"""""Jrc/#"""""""""""""""""zauIMIENDB`KDAB-hotspot-41e5de7/screenshots/timeline-filter-time.png000066400000000000000000004547421515036260400234460ustar00rootroot00000000000000PNG  IHDRL: pHYs+ IDATxw|]VWޛ% ,YقWEP8p( {2[iH6m6Pϛ6{.5<7p%""""""""wW(B"""""""";08"""""""""S )uen<""h ""^f7E,. fpDDDDDDDDT0Q1[C&w7P4(*. JJJbpDDDDDDDDTaP@@ UJ Î;,+뉈 F(//OP7m!&&^E In """;v5,*egg `0ӈ <==Q "uMv琵8=v!fee 4hd29nPP%"""""""OKIIqhZt:r9E+#[¡QRRh4$ llf@DDDDDDDDTFnH6)))^CBBb£[9iTJ1==]df`X^/bqY$I ?MR9 zjR,Ŷ[ʒׯyTYO#VPyzzE$IPdDDDDDDDDw5Pbc J*JUT*V {zzFQU䮞Ge f~{ZHHt*j(t:d2$I$I,˂NdYvi#"""""""SR#b4QJT*`0(ZV6NXJ 2H id24*Jh4bZ ˲{0Āȑ-P˃ZEQTDQTL&"VeY%wu ssT*J2Y,s^^EI7hBCCq9[8TjǑ]yF#fff(,ZhEщSK婟}%"""""""2MO^"V%$+"KFE()))z9r<`0AAABNN$I(*"*RT*(nDDDDDDDDTAPY,,ˢ,ˢ+Ȳ, A@Ɗpo&MJ ((ZmJ4JIr m;ڧLNZc.ofqƝŝ[}V;ls$Y.zOG~elRS?xF.^P=5kTgcǑUDQ_| Ōg9Wjm$\īW]Ux7 j[yi""x{{I0ԨV͍35UEPNm8y&:YKU*U$IJ%Ȓ$)JFFoooTRbClh4*N @W*"A RnP՘f\*~Vjԯ7nW>*ŷ`+WJs*EEW踹-UEhXq""x{{/z*mק}R+"YAelM;2SEEWQ s | =h`6Qj=3g]WYraQQY\bN9XrVq>pǹƺlfm驜< " 2n=4ʆ^㴬U`ʸoKnw|*LdDQl9EWLdl1BPk-IDDT.AXϸS{4i[ls(ڬ 臺kh2cXr}YΝ0Qx/]6l Ԭ^ Fd)k #ѬqCdfeaƭ^֯}Bzukױv>vСmk<=%}1x냏K]8O@lw7 ?Ğ?FDzp=) /^?eztC=+oڒm[m[0ѺEXlV ƄѣР~]$%`U9eؽ <=<Щ}[^ lޤ1FjUrU獿zv=ݏ gd``;~{Ax{!& ӺʧKE#DCNkXa3=3jw/?lغ Z6-1ᾨ^ ,+W?t2=';wl}Bddfb}Xq E)y@DDT@JjZm3SOm;,-C'!?qT 3OW,bEj;&""*3uh!וbkONxYYg>@XxyS8|o Nί#lj$\N(ع{^}9=-lvz/=3XRHN/ ¹Ϯ0[,hܰ><|'q,2?ނ,˰X,P-@իUŠ~f5j2GDհ!l۱ zsS&bs w_>\VgIw\L2{Ÿw})0mfsrmxؽ h>Tj5ŵʱ K=3q ӓC8#b@^8u,׭C`=`ض_;M1icKt"@v?Vo؄K c;<;y>zʵjUCC ܔg^,_ֆC='۴ Ǔ=hP \]ト icĞ)+e\ys#gF ]:}SO`7#[hSO8F8Urp$N#IJYݠW2C1n9""2]:=9a`رKf;|o_7%- 3md(P V^۱HrrsRl[ڶjZ5kǥK x÷mݳz'܃Q10S-s[w\gzuk#܅+JfUd*.?6bbOEXs$'bɲQ+ەc٧gw yX,f &}Ծ>ߧ'n؂U7GFC`p>Z‘> ?_=Q^[FQѳ}ctD19b8<6n~\} <_\}N'Oo_R_Xy+s}|ѝCELx|G+\A#Ux(ې+zWMŶ^6Λ_(YSm[t 6oZu]VC$("Ȳ, G,痏݄ﺯ%D `6@Q$ZO0<""aŜEk\Ll,_,_;>y $n횸ddi,:ڰ~]\K7hm]CCЮuK@VAE$$^qR㰣X+Wj_bvQumiKz,<,٬ͮ;e=''i plgn{yyt]9 Xn̛&@VcC;}yF#j׬[9U N=`ʄ1ԮUj-Ԟ=b(t: ƂxLBb"ܳg✖-9k0vCnw0})c(UIyQC#A0f54zw|HNצ?Qi QãԒ+(@ӣr[xW !x)EB#Nh,I#[#A]$|FHD(f]ײsrqoE^E{3rj !6,#7ao-:"e3:m+׬GB y`74oЯ3 2fζL?˾~1^dXJ*g;ި[3b@ZFFNn.Za0ٗYj5jX{Lffi r(ӤQ T8mYʕt.gz5jKy ߼Y`߇ظ8X,[t{9͛5GB7q8[gAmI]bAvmnoؾ .'{Y$ 4um1bρhҸԫ_ε䥄خ v}ł Jy|ѝ()%s?WgU(4Ih/9uBe!hHTK7DEǶ Nm M Q1Jm39viAʃX9"Y{A'ADDtY= G(6CNݒ_׽e4/>={!/!AAhۦ%,h+nlʱup<;Uq5L?dYGYW_l6#YBF Vgr@!* <$^ҺA9X7l۾>GC㸞n]Ea2!U\].Wҹ(r]9lC`#~VCV,ٰ@Ĝ: jT ӯl،&é38z"͛7GM^E9Ll 0tM6'_|c_?1*ڴBrj32*< 7hj*};lwwz='W^iSqq1ԯW–m#;sݩS+oX`hXS.S؎QVVӀٟvد[#kr,K@P p1#""ru_~}]N!/^.*&s?C>)B=̬F8`*> >yAvvmmPr|#&{ ;4nƎ7mڊCG]V=r|wŠczpt YXnVX󀈈lInQ'qDZ ^ ԶuK‰tuKBtt$$%%u_P eYj,{T*/EQ,zZSEXE5DE*._Hp>{m{{Ƶ!=Dt9IDDw ooD̜%%Iz |0HTA$IE`2L(EIUT.]!!!JXX#h"HU~%@P$HQD>'.кexeW..54U- As "A E05""|Jt{s&Y9/2<a߶k0 2$܍Q1N'nהU`GX"_DDT9'+DI""(Q8-&8bCDDDDDDDTn@DDDDDDDD'GDDDDDDDD#""""""""r9r厝*§Z pguDDDDDDDDA{VġjDDDDDDDD#""""""""r948$DDDDDDDDD$!::Zp9Ujp^GDDDDDDDDw 9Rp pS{>r=zs_$/³Ͽd_!EC0vd|0\zLl-|u8zx'?o[\vNlܷnFen:>DDDDDDDT|G}R^OL5k8,Ek5+Y%K/PL<^^OHŅPZ5ڷ_{9,_f+ڴn尼V p~tG[DhfN[׬]fc IDATh4 rS='bMn$ [&1 ,GbAV-1PF֮:F6j!^fVY+W"8(CCߺ =z<:r8;t9~^ܷбC;L4:'M3<[n$<노ᅩgc1{\2{tU̜vm`F^ǕW;׷72 & !+,p[Q̜.`PFul,Z%Ԯ]l9>T*|xe,{UYOOO!77WMTݻp{İ!xj.ۊX$|-ؘ v #3q%%R%t!L,]lƍ ء=F#~ z^^h4V @Rqy1׫'&Ta붿+W! oÊJxyyw޷qy({`;uPcg8cOG-XۗxKWgL/v]ٌWgL|̘ŶO!""""""v SA:u췫С][{hh֬)N9sӂ#̝3/\ľ}q"*6oŖwFሌlF8۩c,]222:ܮ^ccOStNzus澇BCnسw?V~c F6:wXZzA8{Eem5nԨɱKſ8,X,GzuQ^]< \KϾ[}223O<:yyy:VT0۩iis(iyc5j`eٯ9+j]܋>vfF&AeY.5*, 5%-&"""""";vQE} ŸW0jԨ#q2]h4`08,ء=:vh?p_~_/a`^GU+r(^c. `R^))գi:dp֫[))m ^ z:UY#""h!))I4h $%%ZV#ʲҘf-QE+f5~7bbNcтР~nM#)9Ne7 0H4AdYhLfQ޲dBBBs)z^ Q”p}bp ?.%?UwuhDDDDDDDDe?*##|223Ν:'fmԌ/Vv*+3Uvbe7nO )GDDDDDDDD#""""""""r9bpDDDDDDDDDN18"""""""""S )GDDDDDDDD#""""""""r9 $%]EQ*w5ł4( 󟑕@Ր"[)>>kתfPޝABB@?=*5TSRѬySVvSsSRpT U:EQk@RuԨQCDDDDePi! ( *IpPIfVx'"""TZpiDDD-y8 9bpDDDDDDDDDN߉wo܄L&Qx_UvxŌW_EUBBе˽?qxyzk֡n:hӺ}`o+@zjnk{ẙWo(rS>`-kϻ J,3d@Mmq֯@Hp0B7CnnV*5j wвE8 xWfwāCpuȲn}n.cӖ?q&.99hެ)<ԳL5_Dž߬1xcflupt&,}: !8t08r<ڵkAXp&,;1eg՚ux]OQJ;,Td'}K N٣j.'^}q"2 s̮fw?,Aѯwo#==GǼߩ&**:%. IDDDDw:8]K?FSI*e7lF  Ehf]Eff @[ږM;B6oy[A@;GÏ?E㝷"w2A*xLy`]6קv+O ,9yr2DƨC+u7v|#2<$"""m.`0UJe}1rPtr}ٶc?{OcmC(f|?-]TVƌF*U8t(п__t{]1] IϿ`Xp{1d Ĝ<FrJ*7j @c_w՚u8x{yy>t))xmlL8Ʃk zqgb3k{C^,--_-Xl6#,4<9 L4yr_[s!qׯV-Nxtx$a0߯/<1ohW7~~n91qOXr5^ZjeeVh-4l#=Z5o7fS#G!IڵiGGNWNjÆ>/^OC.eMسw?y+ gFxW^zL})b񒟑{:uMzb\W1_-[qEPjU<ܷC:[+VY 4kǏENv~Z _@H(խ밍;vb? 9%~~~x{7ѽ6Fڽ]:7ZvX8?pr" (u (c$tΝ` Bg0xl0Ŧcv8Bbu`!YzVdiHMcafqO+LeDǜ,9tũXYjѾm Zǂ.ŋqW>EQh߶ & YVǟR0ahҤ1W]wXwמFݻa붿XJK륥C=S0l`$^_~]m[战5 ]+xC={]nL& qqlܼHQ̜5ǎG'@NN^|Qz5 4KZ?-FNf:þ\ѸT[pL^ >2Xo._aC =3qqn=.1'Oa̜U$TE_ӧ`!4~, y|gHMKs(;遷#faƴw~Ykڬ)DQĹs]nKFbޞ; ">2 PThX $x>zoEw?X$`p/reQ^]yl~r2ZǂE#:&ơkװ~&Esyr|`!B5Äqchͷ9lo݆uJn <9];wUk{Ͼbt%fϊ1xDV-:cKQ|pB1i8ᛅS`HfE>5k 00Բׯ'cEQЯOotVハ> uGGZlȨh;vaBbNgbr&.0inn.XaǍqݸq#7x jTw9U&v݇u.'&R|<}^i3^uݪe L{9{!|94oЦuKz|Yn=.fΘ`|Z̘ŶO;auAODb$4m&{c"00C C 0~h̬,Ҡ~=*;L\B7C||Ξ;PšV͚,0,xb8xyY{I 0>3#t[,8˞{Izuvhf{z#«/OOK p}y`;KhPrrri˟xo x/Qٌu7:~,(==*fPJ:/6:cKQixՙ=;8ݗJHGj͗6?ۭZcV[8|(?pKul$IiҸ^5D7ΑrgNDFY&%e+~zK5hܨ!<ɾ, }닐2 """";NųO?ˉW3gbسw^ 7jT:[DYU,iz85o0OU0iUa6 jga$^()x?}X~#F Z{!$8M}K3ũ[EDr̞36ASbx@ף]6)╥9ڵkڵԮɄLMծU/ԯSoiptE؃Bhf;{֡lMV/]PLmh4S=8:},ZBt\BqY4na+5WFlmoZ{#J>밬V'!7شe+?4X,dYFBÝjT;p|-Ɯ9{h۴Ŧ-[^O RI)ȾZ-cNoy W_\}l,:?UhAμ7sȄ,ː$ ׯ'rSN#ysa_ިW.]wKJATPdT4?Pz~zk0x<(͛5J%RBBBt,p[G65kTG!))~8׮nji/QaXwqZ ̻7."sGb2cr*>%ڷk>zB Xpz}7t쀕hۦ5<S&nP}r-QZ5L*8Ν:"55 E߸ fYu<>Z1}ro2ݦJ,;N!IY5*)nfȀI[z\̫R@ #3\۶9-S[4jȨhȲAiAL&\G=<nu)|(A\~, NbЀQ:<=<=}ڡ&5ku"CvZzNÇ>ƙXf:(:s@^\yl~})h:c6_Ç<@h5,ZcړGqq$N^ KIME+/9~''q߱Y,QcADDDDw;"8*($$asʾL@*4?1xVı'caOjjolЦUKٷj|O\k\t ;uD``=V\ZZp7NKIIAXE"n6???=]dyfVV3#1 5`6OYŜ<YѠ~2q6vNwj,;xDzF:T\8w|!;7[u.ؗ 8yTDdCqQۤ*++ +X ??{8j[aEիUN[JHۆL$b8ԱX$DŔofa5ZKVj́еKg޻1ZVeyrc"z/ ._ ˉHNI)NI5m߿)Ȩhaqy?pBڵp&ǡ-v """m --:GHH <<6j\V㟝hݪ%Bk^;Zm ͛5Ŧ-[qnbOmM 0 ΝݤQ1̄"HrUSv&{&;DCS6<{:u'jת ^l/PhҸuwŲ~`]._ƯDq}] ⭹8~,T*_UT)koV-Znڰ} IDATz" 4:6oQ`neEQϿ={tGJj*VZە:(83{C$Jbާ澅aƴ`xW`XyjhZt'Zyᅨ6 =#~]GGua !nEww+R(m);my);CpMBG’ $ٹ3sޝܹ\)_ ڶGK.ժTfE3Gv)f0٭ ^ê~!,,L3пOH)U`/ZBXh( y&єBxx8͚`dI)]˗%K3 ަ-Y2g[d͒*ĩSejϵ%KdȈ$HEP\Y?+׮Ynص)^ks_ٹ>ʡ#G1L$uOB9޹gM?PPA<<<شy 7m! 0WWWrNۿ0HNYz{$Ԩ^}U] П˚< "Q"WgJԩު.bgkKcm?c {l9KlݝyrgAl 8-F29scx!cƌM@@d29::څ Flv1n[kL*K>#ƌ#[,hseJ|O4e>L4᝶߳w/CNą uDDDDDDD]&""""""""QRHDDDDDDDDgL&._Lgq#3dhp,pM4I4i\5ADDDDDDDqɒ93.U  THDDDDDDD$% 00֩5DDDDDDDD$J H8()p$""""""""QRHDDDDDDDDd xY=zhř-R1~ļ.^=ҡgqXoG'Ncd͚y`2㒗7 7#x892OG2,i3eHB ^XXw62sWgrq.{_!(($I(ZS9|׮]'888:UJ+%ϊU?%s&BBB [6;;~_lF&ud⸹%l#}_\]\(V0iR""""""""뽒y$K\BHHhyf3[ne K*H-x%_@@ZJ(Vlڼ-Ry93ujդVjܸy`kcKre(_ I`Վmw6M*/#۶"(((ȇog.UwcnȐ>-yr7nr]jլFJOOҦIͣǏ9q˕\Yb5IfIwvvTVy>GRWlD.]ڛ?_2e@J,]n4M %NF q}nݺw8v$/yѠ^$HwH %h\4i|ݻ?q V?zl8Jª`YEckkK)R`yri $=ױ}͛~RvvQ,ɚ%s&Fh@]HDDDDDDDDG""""""""%DDDDDDDD$J H8()p$""""""""QRHDDDDDDDDg#GDŽܿWՋ|T޿cBZ%2f7 """""""" 'GG2eA댳h$kqU8()p$""""""""QRHDDDDDDDDDI#G""""""""%DDDDDDDD$JqUqXXΝd6UDDDDDDDD>Fs`k9q8:w<Ҥ&Iq.^"kq ^%/ kyyysykeI]f24̙3b6}+ƑDI#G""""""""%DDDDDDDD$J Hl""""""""E=vȚ53 &[Bqy6:wZQa:wYA4e%yҍF%pԶCgc9f<~-[\6W^G~T]zuٛ`NAiު 7o-veT]q-2m 5ԧ!x{_@DDDDD_jW/oz>;wzzK^d|ާ?u~BFM0h(W^|meTUSPzmUp5={OW/Qu|Bv:;wAux*רX&O|c b|ҼUk֥s.Zr5->kGZhS Ç-KTZ[o[5㿴<~4kjՋ4{d?xA6p#{66n 2OؾcǏAjTbI3͌%˖fL;/' %޼L67oZq5/YF1d8d8aaa ɉֹ@@@}pdDDDDDD>>Ϟ=ٳg<|7ns+[ۘff&;c٢y.TccK[nSbyĠ}I(鏿ul߹Cx\eL"ٴeUC#W¿#G0h( :0h@_ O֬YL899mud-$O򾱌DGmN>m cG '}t 67n6.YFzu{<iYh $?ݬo,%/.]|ٿU3_N`0!CzJ,A pvvjJ8!\2@fkkkfZ|ڌ8Q"HYyIWx1:޽hެe2gҧ KLlӞm;vRj /1Ȟ Ҭe~Y;C%"""""R^#F Sfng6ԡ-c6w>BJhӺ6%u޳uk[CBB1t0IYjԨƨ1yߒqVɍgwlȞX)Q**i6|zuNթe2^uaN<,eE}WfЀ~\pܹrҸavK*h4bcn_BCC4I0p@_|2B-v&zv`ԞIq6MiSyOpgt]N(%cӖm6oFe"-]hŦlllH2%>VۥN4LAL8"_ %hB8zDDDDDD>z̘6Ӧ0u:koodɲo6wϋq۝w8y*-۴FTU[ns#iӦ (VD\ٺ};qGQڿsѓOMU];Fj\v y:̣GZRxձ'H4zX–š3eȩ1wBΞ;dTqa71ߗI4puu%c s{~0{.zvW0{.ǎx|L#&ϗ2n5_+m?k@U:b4~#.y]GΑqtt<*!!VinGj["="f$E'1W\}=1 ɝ`d ׭KFl6\IHH5Q"t@dppg)v%T U+WfӖm41vΎre^ $$I͓1Cze-[ɖ-+6o%xH2"1VUd"ATR@~}+VՕkr1WWgޒ͹>UڃO\9ӢU"QTE!"#H`Z* io ݼy^].{{=[Vrd}Ν`iǎ'O ;V..Ζ4+WsnH:5yrby`K/S;eɜM[b6W|9BBC7a-]xY{!M/uT'yOH6 ׮߈痞ݽ{ϒd9^vm7o}el?DYWtx;k^ɓŋ斘>>wj֨fF*,[relIčҮgF,ZL2*W@Ț%3#F}8&td0i԰~EDDDDDcd6!\x_+JȚ5 NNN,^p]&NjTILԨ^S:u*5:uh!$Yfa/Ȓ9U^)Ȑ!=ID>]:Uy #g[ۈCg00v4ϞYs %gL:)""""""1 cQ@Bɓ%q?*ٙ#s۰ ɓ'fM bTԈ+XB 0y8/ZIS#[֬TR*_ټu5U}23 3%˖B,Y,.r7 %U V&pE3й;..4m)r~EQGVFe8sCƌ >>>F{{{dstt F'b6~]טT|)+;Km: *{DDDDDD$\E,Ȏ]V-[7b>;N>͂gB֤)e {jˌiSr.^P6w(;o6{m<^: `xb2 ;;Pd 0y{{]\\\rGx;(&v+WDRwwʔ*M/7ob⥔+SņkopU6oF.9|ԁSaQLɠ/Eb&""""""_֬5kɑ=ݺ8puʗ+C9|ԑŊcˆn|t@_, O yR$OB4q8()p$""""""""QRHDDDDDDDDD)NՋ?McxDG-i(}os Z#""""""3/&:Cn.U()p$""""""""QRHDDDDDDDDD).fF-U_}+m}9`2g"%ѳwH 2]zJ""""""䯾mǮoooX Eqo 2"NްՋ~翢fc#CJGNk)[k_Γ!V [DXxY>^qzWef}{;WNm.{{3wBڷȋ=V'GVJ˚=ʼw=eOI鹡vRBF5Š;} ,׳ѧ[1lm<x8:t(E z2߸@1?IJd_z88D~󊈈DeQ3PZNkW=i\8PV6/=ay~™2%j%no4t$JWHr>s?0R|7kż li&Nz*W: 0qWl߹#PLE,g5`[?6;{QBU*Uqy;wRd9lNC(W:G IDATsCGljԪߘ[t*jkDuj7.N9KC^e+UUێڽ'ʼ/\M.*_Ob\.{_]n*_m:pAAA8UjRajۍСK*VEuѻX=n">oo')[]zVܽ}P|6lux'^[9q.ma0}(Nҷ[Xh'vQ…ճ3^=̣~z;gNN_Vԝk׮H]quq`!ѣ[gf|ݳ;_??tE,;r?fsr|o5Cjoԡ"4SCe3bncqp .ܼuYs)SF׭VODDDDD$ܺu\9rPv-9y4d/)QUFҴIc:o˚?p('Ct1oԭ]͛0ob A,YH8 f8|ys.m7nRjeRJIXhnCrղ'ΟΖi'b`Ϙ1j,d2w 9l666̚=gɕ+1̔P<i( ~:)K+]%$Cɺ (r d;KHoGςG'-),Y2g_E ى8:s}%\}la)cHy˗+ch\{y>]L%YlllH*Xn߾s_=NhXoܴ*;C@)8:siRҤImC+Q$5% /嫯%MTtܑʕb~kHZgЩ}H/oHIĉGYc;;{foGHHp-"""""&M#ҩ=2fɉ&q __e4qrr<~U>;{{B^ $$$}8Q"zg8880|XK? %$8"I#߭#iÇP|6nʵ3[RrHƓn2f0 ٳ:>i\y?zA ]m$odLi;xѡ#G 2غmU+W]Ϟ;oى~{үwO.yyljCYH&EFn_KEz.;<MDDDDDce2ؾs7n횖W2= 4iԷ-.^ƍ|3m S?~5[E-;g](Jq%<<&J9zNޡBV._gǞ,Y<9Y=fYݵ(FMiHBJO2epĩ{ }]՞eq< *mϒ93zvd2qfE;ۈup4svv)o:B;WNgς,i'ϛIDDDDD$ '44P8ef2cϟ;X7oyr=~yC ~E[2¥̞^/uJW dZdLykϒÉ%Ylƌ9VE>x8zA#" uN.^" +Vq鑝d?x0e ȑ-^媟9sW]ȩYjьАP>۟]6r,rTIݾPDDDDDȗ7+V|3K"5,[?¾bpn߹Kkgϊs/"((W1z%o1UL)ҥM˘q_r~~0eǎX %cѦ8ts Lf;goFIq!RiЖ$R('Nw$KOзk|s]ɟ'qחvMѵg)V0a1oy""""""om԰L<4ɑժҤqC)8+._ӓ)_#C}..L0i3RڤLAV-Xa[e4zL44'QD4nX?8lQe2 d6M3}Nт)ٶ 7^$d&}Č,ukr0?,8JŲɜ1%LԯaooྥH>v5pɓ'3|||6Fdhj$0Nfl6n1S.Y? aub١՛3}[ezmf{7֩g0 مP'''SHHHb0ʕVmX|k޳Uk^𪝻MT]m3X)ٳg,Z;w(XX;y1qݔh=*Vμ67}OzW^cђenJy_-[\}ϵ'OR'x]Q~//V_oz{ӬsTyɻ1?Vq9j 5k\vͪ ר)n;,*ާEHCp&L"g5 s;f7y,EKqΝX)ODvU-Ydz>{FXX{Clɕ3;3eQ~"ouԸQ'׮]MwV/ēGiRv43'`/{[njR6~~~-ђe_3z0jV0slKy e)R'N*y Q RXoGN؉q n~q~};|(\]з7E ~:3=NRLg|ly?^Y&َ 7~жqooFU>/&I)X ?k[)zh͈i]ް4eߘ6̗ aƯwP~)5H9; p3k֮{m;vbriݒE ӢySjת/?q5Wىpۛ'OpU?b xsѹS{ N_vY󄅅< ףN횴ؕ7otJ._ RH!ݻϴriv޾}r BBI*5[6LR?s8x0ʙn;1c b*2~(oɾqqvsvTP?5#$$+ЭKGƈ-[:m&e֜q&)Rеs-vu=u=w%;ԣQоS7rŰ_X1j,\aI Ae?ٰq3'Of-o۱e+Vqm$qfjj~eru|BmS%-< ٸq3!!+Sݻ0ah!((y 돽_bj~۸ __?Ț%`0ҸY  jɿ鷵s)nܼEtգ['Np2.^-Y2gWnK9?r(Y];w5]sW_eҥMÀ~}H:]ř-?M2 __+ϿCrA^=I:Um~kzEzGݨ]1].ʑC<|-[a3}$s19,\-[!iӤu-SʒgQ8;91dKeo:uyI&%nj;C蘐FѼYñ'Xh . Aʕ-MqppϏ6;SXjVFE,Qlxmq<*W4~w1gw|j_@`3ҤNM(]$qi muȑ=3V0}|\\K4_7֎㻸v:6mfԫ[Z<[oͺ ޵3jTf-WU˭ʻ3rɓs}$88ŊZ/V_o]kwpvv"޼|ѿ/AJX|%=[VEʔz=ߛʕ)ͬs޵z(s~~]Iu׮a0ɚ%3ݺt"Ct<1=c{LOH4RZ\|3WyD/ߎN W4cіU3Wf_ +fΚC-#!CqT0~:wj9yc e3/陂|/Y@y0 17nE>tԁ?s>{<dVjճGMN=b8+@5Ct܉_ w3 I$ ؟9s0aT~;ӭs'4nuٸivfoE^=yR*/QcvYd3CR%7z5Weٸ9l''']ٽg/[4oAK^4nւ)_}MD8nU[cr8Ȅ/#{6ƌFjUYt9΋v^ QgOff#^Ql۱O~QI>uؐKKf-fMeK3x`M&FֆA?o^N7zy<&t<&H!ã14[4oڄY݈_g~?0ze&3rx|ښ~Pb0?֩ŘH>=M`Q&|=I2f0Ȕ ah=v/#;#svsf|kɓ"yr @HH(F駭;kU?*-yo;"wb,?d%QD|ާ?91M\|:i2<}=b*m2|$ UjTg]>r'Or)Xϟ#c 8;k>}Bcq$60yinɓ;7<-NNHܒw~\eά,kdʘu*`0`41#666VBBBv$J]",.^b7ɑ=KmeZv~QoB%q…8x0v҅,??i3ʹ9sdV-8p+W}#Ǐ|jZ~r" fђe|[_)==Y4nXr_~-Mu,3Ѷu+*W闡?p E~ /VPVMXuL 0~Hqwg|֪/8t'O1}$@E}WfЀ~ɝzXV^vErI ,i/[VO?ё cGY1u d4b4y*mȞX~q,Q~ΎYɓyaz?Ӽ'thƒ^\YcڧL&gg~֊I=o)uT88swo0ܻz~MV(^:{^}h阎iґ?p%z{OFLHd= őP~(yY |!-iuj״?}֊_}MO[&u*|џ8~}>Yu^nC K\t)RޗHə9k4jH# УrRLieT)ɜ)UٳmS7[c(^4@HaB8YŊ@888Ã9[}I6 TA_g br_+Wct؎#GѣW_Whav#R Rz5jV͛ظy Y˼yeয়0}$ݿϗ"I7voٱkKF=*S]s/Tdϖ5F(Y2@re# V5iL&_S.{ӯ疁J.\XV3 *3:c5)ҴS_~}mllH2%>VuI2Ppuu%c p1JL_S[[[}џ.?sTZŪ H*% ֡jJބRlm+/Ys zQ),2KiV>|Hӧ\e"666\|9{#iRZ~ڌ6ظi f|73gW,}ATio]6}\ڴiF1 gݷ>Ny݇@^r̞;V-,}FbE6׶U_gț'7=w|2=}yPi4)U82<Z-//~꯿Fhz>-]ڴ6g Ag{`Ņ5⓷|>>:oݹ{r9`2 -뻊霎2ܼzYVPjaJV 3]b<XW֮[OvmȞ=Yh)Nt 7zvV"C*X3g<RJe:uhg|X>pDQ1 L8y 1u BBBȝ+'=w}]O= I$ғGNǏEyGrsK̕+W^cgg+ivv:lӣǏйU2J %5F*__n!!!D\a6br +.}~}_.;sv99BՖ+0GAtL 2 $QCÃZm}baaNոA*W%""}qLMMU:m[H خAc<%'443AApXnnn n x3ob]cՖiԘ_Ls'w\]K혻`sfNS{2ڴI#U‘c9p07oݍ*|)_Ơ9bppV`$ ۔4HuZuЮZDxGr )^(cFhin}ʼqS*9{ݺuiM=?{ ڸ_X3GHsWcF7?xx +J)ZZ;HW72*JkCBԮՐ^';_+oDY,6Z Z3xeZ}SxxDg ?ϴgyuǪOS/L]_6z6nOrN(J>|5pl**WƚK`9j2Kq㦿e:p4 9s/O7qU͈t56aJj]ʆM[xuxx7nLN9-(>>s._{E#o^tuuy)֚n&MN/OƌN.ݙ6s6ƏQKOr/8xdJRwpt3g~xN9..yj/_BRg>|u@KWvy$ y V,{|Ӌ.!\|9l0wrtDFEa5ڵ%$ K|2)vK*%M7ȱOݏ oT[v$RSg'G9J>)tsujMo',<\*?w<}\[xAzگ~o߽cmՂ%KЩk6oݮ") ץaܿp2/\Liooj֨:ԜG8uھN9BffhքKg~9 3'#S&GTIȞ6hӪW^L:C8Joۺ%CGfY)ͣOظy V=e-剁KUf9jzU#FSN->} `/u|#H(' I8:&""GO#MKf[ CC)?I<}Gѩ,K^|ׁ=lh抱n1i 9r8f&&ىF AXEF ,-XboV=նc{?a#Z22wQ I8xCӰ~]BXb5..jG,,5v<~mZÊkʖMu}/5Rd8EF JnUk(QhAww7޵'NC\VUO77LZ5Xz-Jܹ8q4wW+^ʻ$w+Z۷ٳw|ݽwPHanc#sکC;ΈS#CC>| ӫ;,-%˾N ^c|mږ{?.R[iGl۱ww(Yd11j7vv So߹… `hhm!d'.MR|̡G9t(1D-=.Yٳsa?x4^"uN㱱f|Qc܄~ꃋQwҬI#֮HTt4E ":& .ѽ[gLӭL7=y Rۃ~ϕ!OgXn&N5#ܺ}~ fr- u٤c(\O߼ y MWj @GW=.e!L͌͝ ՑPη̎=Δ3Yx>122§\Y6mKgx[(QپpԂEKhݲKx2NN={^u!}6pRK̙3‚ 790c zyk݊0th4~,Eb¸Q̘5ajjJՑ7U*( =W 4sgNg[xlmh٢P0N;2bqwscZ`?C"0rfΞ/neŘQñK=Z42+;wagʄ-|+ n޺Quqsuq,\ htCKJ*RXQ+6D"I/Qg=~̙iѬ WCCCƎμiҢ 66tґjF*DG0qtr9eJ{ӳ)}9~(֮{ .jsgjPDVV٘?g˖È!g/q1z, gjMy%T`?<6k Wm }{x zH\\"[6K&ٲm9sС][L}BB emY2q+VeidzC@¬3Lde8L2%Jk6B.{{*We| ͕{$Kgev?yETlؠ.\dҔ̟3SORTZU+]=!صg/!!_fİjzG.Xf-33~ztQ-zʑ#>j,ibKǂ1ukm`ʴ(J[Y%L`5+7OMT۲|!ueޏʸ ЗҼFFVn횜>sNΖ~mؽg+W%L1dDYҲySZ4k—@^M5$00a#GWP|Y7iĶԶ%H1tp~~[7WK|U߈SkӦU 2s^; ^Uwg._k] Gj~?`blCYh 5*͚4ciVj4w_s?7(J6. b/=V5QQ }ņS:}gJߜ~}zbe'OyvdF9spT_e|Tr:EJU+_~r?|.ǧO뇏Geԭ*5BBPdY.^ZV^#ZSb}Nmy||g]֗MZ|䱱-?  ަLE]}RTߔo 2W=i]Z zp&NQ${*Mhh(oUZ/Զ90 Uj~B ?Wƶ ˗, ͇>GEƪer3gch`G_ʟ95רVes%-YNTdݻv AAœܸ|׼ʵ?}.lF4kҐOYaoy*Rс~ՖmvK!oVo̰ذfjKU*6ֿpaGW]hB9'g| QԨӐ;wQR%9rZ J\G7rd2/oގ%)  SJoqFFxxF|۵CCCղtދPzannN]Mtj1c5bjjʃp27~ Umx= RuTLfؾsZ-vРIKJVlܼUc;WߠcLJҽ7/^TTJTR&Kj}b˻Ӧ}gUq6\|Em?rISgPb5*TɌ󈋋qcgkw bԪrUݝ޷jz4hwY_*WCϾ  < !$ Uj[&l.ydz`Ri@ɲ4mٖNEejY.)VBT Ujҽw?=WN5zD˾۰)e*Ts^u>ҳUVFڳ/;HɒB-h?/!_j?Ħ0̆T]Bѱ}[Sn$Q…գ+.W?XeCիDDD/YҢic Ç̙###jըWo ŊfdɸOɝ;ܭN9/_/_b҄/Rd [[m!ٻc+ff̚ҽKGlٶ}Oq* >PxPAҫ{LMLx VRtQ.[I.quChhW]'&&!1{^BЮwndOuGc9qwsm݂Ȩ(_iذqZڷoFՑeq ̩(Q*]z uJ, ЏL2֮{~l۴]/as,&>.1#si G?LMMX|1ubax Bk^>~U6@زm'ȡG4t$&Lio<<ܑ*+"˹!ߺMiGs:wlyAAںa#iܨ۵eǮ=8 kV;}7thjըFXr 331j`N=ǸS̟{;;^*|I\l}nlߴ sն<|.3LDIƘ1j,+.g} ""2ˉ$G:?8:80;w.Wxұ=KT/\{plݱg'GLML8v$aaԭj?'ׂ! IDATGa-Çg~*ZK(׬]Vth%#gUѼS|&W݀L3a`@Vݟ.*Jzt tґ;ws%VDPP0GN4mEPQ3CdT^`ʖ.#zP-RFL5G8!ѬI#UreKw!jTJ%_ղ+iK%_?H-8sFF*8J9{k\۰x͛iB'7LO2ebtl뜪|v؞%6}^Vٲ`aaA5vGdT111p2h@_`nI~np̥J,]2[ {)S&KWnݹRTAAwIm]@PмicԫX7nΚu9lpP(kӒJ0ϜNzꪺ.]$.\鳴iNԶSTI7ihX+;j8&&tGǮ=)l,9s3f$׮G E.3g" GBx2t&O#puifldDٙ9{͚4hBjQb۷R6Kg՚u|A# 4@4޽.Q\$B۷ՂL}.̚_g${ |E@GGrew~t[OO6- {c޾{GTd 8116ىw2ʔ)%Ozc##J/kS-ŋ9v_ZQQZSg'bcNsukw7<|bTO27G P{_Z,^V^שU:j^?~yl,>Wׇ>^>{Oسw?7o!OAA~>ЖJ-S*ͳH{(;}BK|uttV!ݻ,^w90E|k.6t cZZf3>ͥ+WY8w<.>3Y644D&90P-]R{=~TTmŮ=(V*P[ssJ%S˓kK()R^lfF]ɑ=;2eb~?P~| $k,Ln-^}1s$~LF)ص'4A۸Kˆ0v.yhשy4Z G]vs0UkԲc1qm/\Bw̾B?g&3i7gD trfBP`)%Y&,aj ՚1Ԏ;A% jiR)M5I|CG`RsRzU׻zӧ߸#[[}VJ|y5+ <̀TNNjϕ)ѱ][m(p8HxHrzȞ /τSEhѦ=s,|amS`p0ccc ՖD"ܾ͛{eo nG4nX/UyAAֺ@Pp}wppwy 930 Kߤf4 a}"#زmWa!/Z䧷4A/ZBjU܅Sd */kE(НF?;8v"]]]*HfM#QQxzCOONL&<Ruy=9QQѪeW]'4, o쌞nGܯ^㍊XmYb%mѺE3xzg''zB7Z|Rڻ$mZڜ0I[r?sUp!n߹K6ˬol)܅j8uTKKXutt֥#޽@BhNRK{I\8Ȧ-Q(} zzcͺRyAA_ֺ@ gΞ1[=:suZxk>V- 񓧿L9:'; D?:s7WWy /\_kJeup˰-~5hKΜC%_ll  gp@}ZdE|B T*y5eqڙ}Ы?ԮYLƭ[w(Z0Ee&޳}ӼIc`R<.Yœ51gsֆ[wsd2YHعZ5c3;wM@'OycblzݻбKʔD}122E{|Ԅ" ѳkgU~ɖ͒[eɕ˞jUEV-̼YXd9#F'L իU.7Ys0t3et=ͣэx]zA"KѶUKoڜiٜϟң+R0tU|ycvދ<6[kF 0.?xޡKgΜ6xZ6 SQaS ZiVjU,\% AY(\KN5fr|ʕ~S|z>d s/S^rQUhmڵi?Cs5-Ldlپl8ni6 z}kY8MMAACR0vLٳȑƑ;wߚ?SLˌPsdm2QяHRfMĄӨ۰)fff4WG~TjQ*.S*~NH& ,uwpg# I_ H_?n8|ρMmN:MpHR-07g!L5pUDx%OͨQ$ݓH$L&Ӊ* =CCCX/JJR4߽g۪)~a    C$ql?cUZwh&pƩ]fmD,H E'JFFF \oiixDiiiP5J#B8AAAA8AAAAc   CG?qJMZ5`   ^2ȗ#`n   !;?Gq$    hW[Gk:AAAA_%as0Dw216Y%ő        Z        ZeQg_z hش%*Wgμ>{JՐ忴/_zzJ7nS_ͺ ޻W^ՊUkTVmkS*4iJXvӨ5v|G|*U{#@?uХ{/N>"  Es-[>izϡ#GR7Pzp ; qvtiٟ;v}O=giЄZw ޻f˶t֓ZRV=:vΡ#G҄1|jԮOy jow~@tGXM`L4jJ_|Q(Zw؞cGѣkg ϴd{O-{>AI2~wEOO'   Bjݹyccۖ#S|q,^Qpp!88=1oobccg0ϫWɗ׃٭ ٭2m&VYj lZ" 1~T}-[+b3g2l?~z} @Z5H$dfɊ S|\.G&~z @iҼ{P-qvrĩqvR-?y4EM?->>R.w4j֊#NPH_޶   Bz۴z3 EJ 6\u]Fk7nʼ3Nϗzreԫ ~WrEtőǩ^2k cc#֮ɺ  ĄOr5֮\N 2l`tG&M؉T\yg3Nо]d29ʴ9m -tЎujq<ρّAq]M @Ū5psuaZbll5?| ((+WsAXeFE4m"""Xx\!,,s+R>j}"eYv=!HP(>{n;j?xȆM[xQвyJyT<5V(Ϻ  %"gt?~bܺ}s̴hTy=MOն͗PFϕ144~4mH#eKb|% ;?aђe<|,%Kr4}XI@@xVYǑ  ֆV-S7kmc_956 w.{/ @xx7b"(%  ӧ̜=/^ʊ.ShT'~t|Ϛӧϰe@>X3w"N91Z4jJ=~+$)yڹ#s٫Ҥw}Oy5TT[VPAϽ̟O062T-344@*dBHH2Tk жU Rs8aGԱOu鄛 s,bڕd gJҥSr}-8ɪЮ NNq?11r-B`V-G#EOO/ټ( >~V}CBB044Sv[֬@TT4ڵ`ђeܸOȚ5 {[?OTۛqC0Ond26lʀCY|I[@ҥ3r7olj2QJeULj162̔ Cn @hX8V7{z?[RI`P P[d vKqtͱ=ncG dϗUks YfÇHR>{NDDFFFܹ{wd/  k(JFH:n>j,K6UR*0U*Ѱ~]֮prt̔Ar%͘M^wlmlx|ʑ3G8~4=g͊gVm?CB ..==L/&8*YXh)۵AGG56`llO2jiJ%DGpU\?s啟P˓{ccN>KxxիUIM L1l@v+*JڴRkczjm[YeSJJ.EXX87o%88%ppM.g/p*pVDrt+DF-RNS)^in "ЁAAڶnI (^(?~d ,Q7WWtuu}.>r] *ӧϸwE{8:QwAA?/u RIu]*]+lڼj_J͚S, .y3FŸt ]P\hӪvJ/F+>{: ڝ^?E*b#P[cB’})3Oa4i sLO,Y>~.{ H_~[2e,5k5C\.gɲ!~ 8o92t2kGGv.QW)reXx)q5]TT6m܅| 6.xrʥNUHȑGX̩*$ls訶7)R*h  .Ŵ5w>7n¯MKrА;w[-zk%iBCP`ϚE}ٗ/zq/-@$;᮱ܜ"I%~Yf=3fݍٳM׿ӧxƏU:<<{? k֬ڪ̚5}=Q XYeh7W._Fttjٍil[YQvMN:ǏCOOSgΪ=}Nnry=af\CCC6mنuΜRAA~5%鑠P(p2..5Q_&Ii_T͌ &FAO˺ pwSu*o߽'<zz0oM 2ƲquqQM϶Qzڽm;wѭsG3SV V^R!w.N<{;7ůMK [p)U-AA!KK]C"uN㱱f|Qcl'3FFFY~mx'OKs]R_u1#Uu0heƏp?u|esɹx#sfNSKעM;8;1b`V=8dF"{>BCCY*ӢO+[٭¥\q`Zlꒇ`.^#gϞuK͞)ߑaG_miط Xs2_Հjvk=Xz-.y?gfݴq#`)\zvc܄ɪ4y=8r8@WW'GGL?c̘5022ķuksiڎD"a¸Q̘5ajjJՑ̟3+Wd ""#baW~s^=r1~mZj,Y0cD.YƸS$QD1v*ZXSZ LٵƢR4sΌXv=s,FV#{vNfffJ…8qo}ajbB,Y>rڛ>s[,mڴ <BUVUwps(>|iqwwWܽ{WV̙S4666 UT*#SSShc R4Sjj=r[oSp3`=x&B!B!~e DX3Yb' _ԯWBP(**022 V*fffX;;;BmggvttTD(St#!B!BHH!B!B蕢s !B!Gg ӫkV{$B!Bx..N(?Vi~ !D$p$B!"351gwCq$B!B!3%B!B!,1~dƑB!B!KGB!B!B/  !B!B$p$B!B!JŊ.([ʵ_>**u6ѲmGWNй;wMlllRpWE!Bk6s:wOVPo?G?ߐ2|Oѻ?~sfF,^gƀ=GTFZ:caZu_İQmF),^y"""3!ĥbUJ9W{CGQjc:g[ȸSq[]DmU*WTnAϾ|@h߶%we%& !B!ѻ?ӧcҸ1zK]ln=)SFƎYd9~̘:QS̹ػ Bt՗^k~CpTz{$Ïp%+ TRh]`;Oχ˓[]28{,>h% Bhϥ ͕x1Z%z}Q%ۻ79Ɯ qVS&+WMUGR1`P>B6ACxVݙSByvnH]YdVWѫ@lm<ޝ>=si&OuZ3ֹ#;nR۷oiۺ%Moxy=C4̝Aqk҈;{+{qH\&ѭg_bcc?f${t c0*JoZMCv&bܘеG||jݼm*edD#B!k>x &OCGћ3u1Ԩ^'-kVϒuRr%ƍJbѸ!#Qx1&LƳ|_kU&aMNzun9rMfӺU0}x9{~ܽ=}ٳie˚Rg ?ۨ(>['_h *ȳ/v&_{s9J/Jb_Y#إj<ۻGZU׻'eK"0=;ޭsE^҅s)!SY^zq5\SnԪ @ תڽc'NT4 /XL8Vގӹc2gYw鄳S=BuEU1^O3Glm144܌ k9w>{ }mͺ1 LLR>}:zȹ)_Yͩ3gɪ)XŋQn 2fHϠ}B!Põ벥Kӌ .ҪE34jWL)7k3rXR}\V*mZC 49{'N}Vtyʗsq;q~<[ңoboox؋ kV7OnMm`,,)JLMM I],9vVz)_#]:{F IGӠn*U,ώvannF*n,EchL;pMzOw`S:oUbrZ+Wccc sv*#ǵʊ^)SF޾ qߓa鿁hG%JXz<[Vq9r{H>o&&6\9sԭT{RI 8RqElq3m>ýY2eҌ^f+}%:&/^j;G욠@q<߸ݻdɜI4̧%_RKC L1];>=3fET&iyרZU+ʲ3c*L:)cFӟA%$?jViʭ>{\*jGcU* k"4ϚEGGkBR*Zh!B!~mStґ\9s`ff۹' +++޽KJ%fffFFXZj5c(zH4iۻҧ'UTr37.Oof;[$fiaAPX.66c͓!3wbvݏB^ZDEEacm Ukp.[p ~~ޱfl۴6I$KW1w" hS66( >{҂ 3w4s(0WzY',9u,VVyӿIҵrNs/RByz_?@mEeRnC!B RT;qARN-MyB  `kcw|/^2ot"[Ɔ{:~n`ٳegy?JJHS_ cccժGsWٽׯ4k3334jȼKx֗tO"^M F_ؘ9sygi.Uo${Z_YfI,--ɗ77o9OlY GD`an)=uN=##CM$;9`bukwAc4!t,  ܕ hz_s,8$WM!BKtt֪hT*Ϝñc<@{wXgϟ,((}{GS߸ Xo;WNXf]\_74gBZ6oZj?u)vѷoۚc'Ύ2eJq-Ξ20~&N9'J(NhӺyr"4,O ֥c׷WwzĠa#Z333pY QR%Kjz=N.\~ 6˞=.^ 3SSfɜ{ѭ w=ӣO֮I"qAc݃ŊҦUsvKiռXd9ܕB9cQ S3S֬ۈRI I~B!B_E bӖm.T5j_DDd֒2[fabbcɚ93;k7̜:1|zv̫ތ;QIQ ٲfe܄)>g~&{gɚLW]W?͝5K}5jXv0`0ڷi+oo֮HfM5lڂ1y;eƜy)TB+W9q4cF ՚Ƈ{ƪx9NX+G чt&'NFT/o^^WC&)+Q({|9g޵̙2b!-qRl%gl޶ŋҿOOT*=}2Z;}G4ȟ͒7T,Y0+W1nԨɐ>]H3J/F>=`&/On&wCZwĩ3c0Ù7k:NeK'LLRd6oGw ܹrүOO׭ ĭ]`s/bĘqNߧW  Oa̜; td颹2mP!B8Ø4m ̔]qk҈cOԝ4ޝf2d` ȑ‚i3kTC Ц{LJ%sfLa4lڂ4iФQZ7JR},S,S~fft9Z6I.66UkI9>eNk׮3v'Oq)Ҥ=)gcJa4/nMiU*,wϮJJSޱC;OJ݆ndʘ$#Ň/-w*|}}9s*|}}JJedjjjm V*fjBV[ڽgWR.|m9;%Zڍuk׳~- B!B,_Zoyls$F~ EBVT@QTXXXR633SEEE٩j;;;]'Bg}+7>޻bE`ll̍Xz-m[B!B!D"~ڵC?kB!B!)/8fY?B!B!8yZя= !B!5TPBo177xoӊ̙3ߟre|߽$uj paJB6o"<f WZ4o {Y*(WϺ$y8ȯ4 Cx%M5$o=tهS'?/cPj5!{lqKȖ5ϸbx=yxe9L72Ч@ˇsY^z&G IDAT͡#GY|~bS)vwM-8u,kiִjߘ2}& /h"+YӧP~Jiք_ݗ}M̯tw}{is*=~93)_S^jezτSYbj&L1 JSFjs&&{ܟkJsUʻ8-=Y[\5w_bB!ڳw?A,[+qVZ4s< :`1Zer`(wyܧX"u5Ovmpv*]fF&wQt2.cN*173cͺ !}tܽA(QXyrMMh5iwF"a)6pt vֆ ԡ=O]{ۻ;pU(lmmѼ|%侧'Ʃp.[];aii`Yt._!::ѵ39siѦ=ժT!,,'OR{=xHʖ)΁CPVĄmZ1vdMz6mիX[[QFuڴjBH{.o||h٦#Sܸy%3v)_{|j߸ITT$3em/璬gZZU""#9|(*.Neӫ;SBCCYO.^LppVVi)SbނEٷʮ٬ffxy3!Ne9|B!yg$,,,3ӦUsʹ8}.ҧKG(STm̜3G-kџ,31N>9m[Ԛ]qgP(͓ݺ#{6MgU  ߗ3heܺ}+n޷t*E *UuyޟCBllƈ111x(J,MPPx1vGLL dȐ^\H.]\[v*fqc7n cFKr_bc/Z]:t 䈉'eKֻ<y67'A3`Pbcc>d]:˗:b *JoZQcy=vaAo`j.TjsgMc)lڼʮ W7n;WNO\I5]P(ܼu[h.\Ĥ)qȟqcFR+kod,X%Krb:^{yѭKGƎE*yH3. Xpǻs5mؤ9dٟ\q]:3mڵJJ˛Vq*7k9^fu<|}yN!Bk~C|yз7ƌĩliN+״jNL*7f$Ydbx=kŭ:B 6d *cObʴ0t.̌YsyݫWReI>u~9y ǎaEj&Muy%[Nlݶ{}/^Iϑ%s& _LGQQQ)K {l+Z$XtFFFZm*5Kf n+n޺7pE RXd];us>QrgsywK~[addĴ471xH.]S2:m]IX4oݞ;{ΚӧOZJ%JO'|^󃇏,>!66֚zabbyr:J*IVLiٺ}'-&̪<~hvK4+]xri|B:{{;֩4{>f WTiSJe,,,051H[H6-WV^^O%oܚ\9sgə#B!|yds!ϻjj,Qwfm 4 IRմjٜʕ*6MBy'. S2\|gӢ۶:S23ΜAybU*# ֌1:kC?vp'OYx&Wk9i{g~?)JLMM II\tlٲ2uxd3C)isAܵ8[lA111ƦcDDDRfuʹ8g~T?^Ѽ1dy> F<|SWl_Zbx"|@%5fanΝ ܿVf J/Ɲi-ZiDOKe)),?X=~kƉ5U^RE6nފz$+{qNeK RA2dH;ܹr=RT dΜhVZW/Y|1+VaYMFyEdɜjO@@Ȟ!B_Gxx87o %:&XrdϮSeSJ\r5Y+ɊYf|yL3j ׮=QTeͪ%Xq#dʘQk̙2;WdÿAV'i<ص4kژl޲CGp,̰3n#w\ɝGkV( =v([4NGDFF%Jj?m5*** !B_Ϝ 9x(nM1c$/Y@Z5~>3yڴiOgċ,jaiUȈQQQ 6W֥f`ΕKS'l7F%t07'1Qll,:3ɖ-+E fuWfLċ/x=ɖ5+ ~flݶ _bbb=v2i&s6ltɒ˛u6uT<'NAV'1God]3() qȟKhv}Ϗ(T0nVF|yI*>Lk븙 BO Y&06ݳ/|y*1g_܅jM._⵬P(j7-ǯx._biǐݻcF/Y&O !$$TRdiCGfͺ6IM9gTy{]!BP՜>sZS+#k,Z.Z= h;5jXwnc+V%&&FE?uԮYCGq矻:߽LsȟK7nww6y}OMYHH(ׯr_3gʨ3{Ą]9}==EDDv,--5" +gNVZn?/FFFʙSgܜ<}CCC˛=&|IEp2%p>ʕ3'ݺtBRiАlٲr$FFFL;[k6oN֭t˜9WQ!B!**ZkyWLL W>KU*/\"|z~/>[X|דIISK4e.ivvdϖ@;k9Ǎڭ.!-i G?\qA#Qfu._ӧ4Ɏ?Wh܍4;ގaԬJBqzaC5eE #89ad̘;;ۯz&"RlQPĩSDF͠׻WSfִ{7Gѣ9ӽk'jը Mf?0yqr*C&_Əe,\h 880{$jVPT||S_ٯtʻb=:Ą93iv8Ŧ-ۈԔygP!ye² ذi 㝟&SXi'h9-ð!ٸi G*mZZlN-B`wf͙Ov~( jJOoX3sd-\)177íI#bccf(^;f̈́G`ooGʕhݢV K K=(DivK?&:rCG8QZ.j5 /KIXSަU ϚCVH!= It$t]q]"88X3gN 44TRLMMJLV[j]JʅoݾM=;i}ÇzwKZoнW?+¨Co{;`EC6_wEFO^5[w wd͊eTM!Bcɬ _ԯWBP(**022 V*fffX;;;BmggvttTD(St!C1gαb՚ݝ=iՂ=hfM%Ź,m[d%ުSX;E %h$B!RRx=gw_z%KUs7|}} XSdqt@֬Y%a|Z܌\Sl߹ OcmmE"iҨ!E3=y3pXSn-t1Gn\[^ ۶"UTZuX|%GdȐnMhҨ>oRAkT,_S'j^:rAuѵVCqdISgk>jpmDGEazȐiҨnxx=֢}ܹۖs ͛^$,0=ngܙr.N_]{Ѹ3  g-\XGB!B|;[[3']XX]{lFyyΟ;v.,;?VB*h^ԙ>k.[卵{v#%op :w޿.-(8>}:&ëׯYx15vԮUq֮Zhz5!=/_&}9uHlY54e)̞>L2Щk/ 8P|9^xٲa?d)6pt5J,8v$KhӪFj9)Q9g`ђeϒs"ɮUжuK^z}Z:ܔnϾKgP([[  !B!ZU#\B/jt}n3%iUCΜ٩[?ywһG7ڶnues78aVv 6Y!!Yvm[aan]s2.Mꮘ|jߐ!Cz6oΓ'Oٴn3fb_J+̭w!KL.XW^f_HͰIC_-E8;&56oݎ-tB;iK5l)V}OK\R.c'L/?QZrң>zU^#7,[^ީ|Iq6mKjt՗_$X'+v`l =VktJըZ.S"""B[ETO;@r{ Jh֪=.]ֺ3hӡ3+Wkm:t΍[ |O w+Rʹ"QQQ]!Bm9t]-pEͱpvOJF&&t؁W_s$~7|jӖmd˚6=^fuM"cv%+ TRh]`L3jF/)۵wժ1c>C~)PqcGӪ[W .Y{|u(::zP ##)vv8ϵ7qH\&zw~~tٗXƏI]9{}$j~pMŸ1# k>ժyTj5cɂ^R  W VGΌw "&&&{Wѫ@lm<ޝ>=si&O$?'O(\N3`kcs?6sJg Ϝ=Ϩ(XiSNM\a9Gj3fӧg7޾eJ1d(MkoMAGfMpq.KpP0YcF{vآ$B!:FFjL] JpTjǏNeKP(~O='6e͂Rg = aYPp0ϟ S 4 UXc'L&44T}C(_:di|SPA=7yڛgQx1T*.Oja'.UQ=l- ҧK`O|u126bptW IDAT7s/RNSgj/*Yui61Cz ^PT*5քY8wr _<4rkCGSfRhaLAt؁̙27(wΜzϑ'w.H۰vmZѳ$hժV|x ʖ$C+Dtt 7ƵK6 8ݣ?$Xٽ ;YݕV4&1p^LB!B|*V-iΖ-SZvFƌO !66ּET~{2qȟ;[[=uң7֭Ɔ/!*:Z:q7LJI^T*155!(8$Vn&׭ 7XzNe0{^xˈbҸ1@ϫ^Z-]&ul,_<BAt>A:TX܌U~NOD$Gq/>x4ul{>Д_qSKĢşNJt=\jFeK‚o'NKKKJ.[wIm\:{ss/d͚E4yGqתUK,~64||.M4:ܺuh%T õjebbbq_p!GFF6\[#FK'<]R!BUX^Rbr:hNtLGc!SN-ʖ[ϛMHH(vY߹oB*54_ޛJ='ZwLp =}{}\~Vǭb18)[Ftґ#GFs|!TZ.ѕA;\z]sUVC] eيU ۛPFGui{<| OD$U%D:_J!o$x7oh֨}'kZڊ ameSncmMPvnVi×Xioew$&~yYsqXUU7Wy!B0(ů՟Z6#,J%S֪g``~̙5m2?h(UkeqG!B}>F;?1ZLL ~~&0v93GvZ]YxfMO5RK Ǫ'S :@͚s[ZPhD%KZ*+hM܊Ukp.[Xz~~ޱjU~cqRR5]mE ؟& pEbbbt{ǽ{U:Ns/RBy}԰_7Em{0 zǯ* 8U1{u7T|ZMhX_@!! >#if*4Kf66( ><,TP]Ȭ3!'sNĄzujq)k,_4i, }~<q=y |͚soܜh2JIpM!ؘf%d>s'kD׮ڐ(JM[}??Ι͛bgk`Ȍ-8֠mޠ^-Xc'wq"**pEڷiEsօѧ?ukפX ?gAbEiӪ9vπjތAA,Z V 1x(zt턩)km@[DeM,\cjr+{wep7 i'v.v+vkwvkvڱbHH3dtA>u{{{Y3' ~Vٽ+ XtYdk 6W*q([ג7OnTj5y׻} aȈr)/_g1tYdPdȐ~,P@|DiӪEiaZbZ"#Qb8Y싹Rɯݺ0p&NUsǗʭ2%}Ƒ\S s;N++K8ELb_п!B! Xq3qqΙ޻yOݣ;7nE>h {By?yS5{&gظy+*aceœغ}'VV4oXSK5kEKrU8cnnNH[Ν/i>?d~M^G̞9UsX?һ ifϠcdu ٴu;c6<oUZ+E7o}aN`lM: ؉%Kt:oK¾P(oGhX.66x.5nҧZ)BӘ3!- &&ŋx^թ*T*V4U_]|ԫS^ xC9l7z$͠UNӶuKTq*<9d<\ńIP&[lT\II.?9W܅lWgJ_|V`˶l߹L)W ?LĄqXw<%]:K_Ooǩ?0{BBCðqw3f0/Z{~p9Q!BT2eSgd˖&/_^uz.` :r)˽QÇ@sĄM[m(J%Uk7,-2e˔b],\EdT)U^(Y&oRP:jTq'Ii*=>UɟacT93gcDJ3ڴn{ZⴞS?`Im^˂1'cMLiF գ&Yq /]]d$3ҾM+v^J ˝kһt)ө؍ٳ1y¸D"(>xxx(nݺP)""" T*QLL1TV+j{v%7n|5;e,^xI.)_΁)?8t$ykh88F !B!N>Ð:f֎%gΝT"4lPBV(a**222~]A*:::VCRTڪ+ЉLBsٳgcD8b?9J9P`vzѤq):o[&B!Zřn;2s<Ν#Ŀ^^/3'Qذ6!iM;B!B֥#ݺt?8_(TESB!B6疪 !B!BB!B!KGB!B!BQXxDB!B!HKf? Df !B!B$p$B!B!B!B!KGB!B!B9vR*Xʫj>y ҥpjќreuGGGsn;ɳ˗_SNmҥKzO>S8ccozQtl׆F kiݮs~Nvګ/֡nZ?v%BBB]G7E!B {ϏE}~=~^lڲ'O5fff-Sڐ3g|[Fue˪uK4SSSܪSϲ{>%Ja(^GzS/\;w035v-W:k1Yz-}bbb8r`N:z+ ۅ!_kJ#8$L)S]:u sf[M'NljW6]:uк%g"9|[͞;K Z5#&&ǎ3thI4y<|~~]˕V-p]._ QlڲbE5A#nYl95]k`hu%=~,#!B!#kkkgOvw 4ϞѬIc *@P`;w^}9} E Śu)^NZUTyog2'޻P#ݻv\ל8a5d)ϝ}z^0c\&OGl;`0 S٩"ϞБ\ "*͎Pt3;pniѼ&L9EK)]yr`5ciZdjUi֌/_M)ZN@NLL {``ZΕ+1{|Ξ;O՟Z}B!B6Z ΢h{M/5\wNg͊I͛UxCiLZ&9|XW$Hs={RυXZZM[h D{& [nO4py>)!!!Tw8[xL0N+_~|;w)Sn!Gl8-SEhG^pkk+uH48Z]R<ڱs664mHZN9~޻ЯOO"##w\k~hcc=?,]]__T=ܻbnnh{CX쵔.CE ;|JC144@w;ɕ3'-7 T=zcȞ]>cFƌ5vJ, Tk֭u+;-P(RT߱'144'u?# 66clķ5>zĸ#R&rivs첥K޽ ^KWhf%Gll,wRQoƚ"q}4> !Éc!tڙ .1|8T*2jcs&=ݻ3b"""?x(ޅJb̞9 ZM>}iw}qIƎڕȒٖ?^cX[3vpܻus̞@Su@#FSە S{_CvZŊD 00C~ޅcPz5_Nv_m߹ tXh>S'zpʟ[Qs}\Cݘ1uNQݥ dúUlX-'n!B!DQՌ4ի1ahr<)qVr%+;UBPs&J<`!47mFzUCGǏR,I˞>}Yi W( ~,;qͻwx1^V7Oʔ.ď'={|s/RT T*,ŽkDizѧ<  !66Vkeɜ @֫nڼ###fLْ%-CGTXA45eJeێlMnYfo/>  3L_C;jVVe+VQDq66 9mې={6nہ S&zh>`mj5͛6;[Ρ,;wc 2-sf " r:ߗwpPX[Y36nBACXk++BBGXbbb4\-- L+Rw<BgSp%)5=22d`͜ET{֮se'ݏ)ժʖ(?Bq !x4'~~5t^|-Zޣc9M?ff2wVC2V%Ko֌bjj4ܹsi#wϡlҥK߃uժj P@/;(0H'``iiIXX2AZI?ѣZiuBCCXh {i]͇@K`Pf&31cFh? .}*!hBCCYrDmҥFwOwV5eæ,"GtA"B!Bڿ[XX|2FX":eccc *%ɓyrs䄄5\(^Q 5&J33õg3[jN:SDyʓ'7yR%KPΡ,-t`4oXou7X kJٸn{gi^\^Uo,Χ )boK(00plɾp!ҧOŋpvҿ65(Je,zMwDˤ2[NTp,s=J'KTTgS|$HoKdnn>WNp> IDATǠ#]ӕ%@wr~ޅR%Kвya#мicBXr kS *X'ѥS{L2qV дI>˦-Xr5oi/-1ݺ0lƎDujߟ.0_o2֬ {`մtkׯYtlEh=?rȮ\S-ܚr DnX h֤7է JJȗ//?pReqgJ%>rLJ% )Tg]`No*:ʒgϞ{/4lPOSOU*Өa} *;U\P.^ @KdʕJzTMWͦodL0N3s!GM6y&׫]7-?lYFZ'%~,6._!2*p9 O4bcc\~wK6- ajfgٷ 66ԮN~7#kJ,GT${l$/DMAh"޳N}}zѠ~]2d`'8|(._^zwNX[[3{T<.g76R t蓮9BY쵌EKh"mzթU*T*NїeJ3{4AV5KMTʜٖ)=XŖm;ȑ=ݺtbƬZJeVZÓutx U8-VV,3 +YE\\s]֩W*^W@̘2Q/mf]@hh(Z4ל&B!~ cG`μ<|Y0c y1ɘfq68[Ąs~h{{+?xMΜ9Ș1#۽wN+еsG/A%ؽgV"*=(Y8 ki6g]{TѢYST/Ԩp8:>MNa7M)6J33fMEL633Sܚ5cZtf͙PkɄSj԰&+GP]ϲBٶÛ7n"22̙mRZlIVY乔];kԮM+fΞK6Ț-+cF ^Z<<<nR(vvvcct*(&&````Vjr=R7(F+zO23r%K~PTI:uhI{m;va͊_\&B!)uƎH=4vH˔f_^!\gΝbSU<|j1k.H%x坪sf[!B!:6;}FnfT&m;v_mL9-+MZkJ޿owwzϮԮϥˉb(.XD^TZNUIJ2x(֨M.<|sHZyyȚ5 S&,\J\l{'Z."{XQ{/k>Zz.]NtL4{~fFĆ+4y.AʙT|i6ptʟ8s-B!BL4\rj׫S_{c_ tkʀ00_hS+ff,[/_-[VM^KKK\=Ïc.BCCYfVVfz:oLo9++K؍B 8Z^=ܻ43íYV^Khh(ܹ˹پy7=>Ry kH)y6jF 27ou3c".uqٕ}w7{/+kg}>{~}&4lg:l߹KA7{-cߨ^UbiLܾsU\عk&ݻwoȱt!B!WRf|4JPDqB޾bٳkF J(l\\111IjG;`.uzMZ=9s< |H'O1lXAV-ݮM[affZs=lmŪuT̐T N>ÝZIbE(W qVvY#c#35ksz:6xKvfB^`a0hHwDٿZk>{ SѦU vSɔz)ԭ]Փ܆w >̶[-tղmGVZhԔlٲ2gBZtñ2?x@K7mE\kzܾsJԠ@wəZY-M҇23k|Nv8wh ԭS>=ݓLN|?ؐC:OVJ@,-:I&0+++t++KBCÒ]Sɜٖʕ*= 2k J>=Ƽ Lbvo7iMB!B%ul6`p\\j^w-bC\LL C"8$g`bb8WvD( ̙IYcei̩04LJ sǗg%K$˳])8qx&&&ACG9(H{aұfJ͓Ǐ2裡T*ɓHo>\d)"w\ܺ}KKK*acmMq'MF)ؘ+^mMZXx8.IR%RŊr"# tɒɮ‚EgFycP(sf[BBjvbccuǙD'100޾p,{NL<_۰)IeB!MIoGR%4}"#7h(11̟=3>5s<8}Y3.uJew8i'CCC;m떼'22 c## ';~###-gH N*p'8>zccc|ӽS҇8{];w{]VV]"ѷtЎ{qq"#8u {sef1w'Oѻ ʭymצ%118Nk>FHET1Eذxl=Бc4Gw(IF."(8nfyz#ҥca9wm;3o!5\JboG6ȗ7=wa鲕<|(E$B!oH,1c<&r/;qR [1b[ٶ.i xԴE,]Y~#m;v%004zʟ ?m7=g߁x˕8y4k֭xnօ.1qtΞkXn=-50ԤqCJͬ}ܚi-UΝȱ'!'N'y>y ֥E s~p(m-z4Qg2g"<&MD ܟi( ̜Ɯ 5o11,^ J|cqV'o̝lXB [q3xLʪeK.E%B!wK,1EVpεiqqqT`PiS2dHOE0o142x"ZVkͬښUkMJʗso_5E8;1a(VceeIҩ};.+xΟ1Ҍ6[޵V`Y|yX2n͚$?8~!!4i@fei#m|©S˕5IBCq-E@@",,Lagg0066NaRLLLbbb jZV-w޳+)_qgJ_5E5hF!%B!BqyJ %hؠ~CBP(T*UeddݻSSSUtttÇjRU+VLᡳF0.UB!B!?B!B!^iz`?p(׭"w\[xi˶zJ5kkB!B!Ŀ{WڷmlY[,;KDOʦB!B!+K݌B!B!D=B!B!^?tQXxDB!B!HKf? Df !B!B$p$B!B!B!B!KGB!B!B9vR*Xʫj>y ҥpjќreuGGGsn;ɳ˗_SNmҥKzO>S8ccozk>י{F&)TAAܽ_{e)/ @ddk֭x:#jUR潑//{*Vp{Θ+'!lZ̶S[Xx8 sf[ƌ˗Xr5qqqt)r8x(E Q=oL4]kZ+-[,?X6_˖m;=tڙnʹ5kҘG%yJ>wj۳w?aa,\lشV-0KxKK mBPe/,,,ؿ>>7ܱ=ff4nX7l$,, R=\|u}ۃ"Mqt&;vƚ\ک#5;pZ5N?d0x7aL9/'88fРIsjoa#yVV:r:.[kZif4oՎ3cWZG:?y&PaSL ϺZEVp}5:wCi@vؾ[}iOk.~bˌY.\r\I?уOкEs&z!o<=>Ք[n=,Źr%&KZx-_ɁC{ϏN3y8Vx-FVkT ^NbEuږ-kV>uʟ >3|@FLBy$gV;:~ 9e܄ɚW8"E 3ebG⧝Μ6lٲҨa}6[ņu(U.B!ZfԨ^ F+WxLc1ZʕT B+\0Çh~'O`mԪ׈Z1thM=qX!YOjV$ȕ3 >K:nݾMzpӀZK.Ɂ`מCifS nZR5wek!!ƒ9sOd̃3~޼HzMbddČȐ!Ç{2th.^Ltʜ=A)Z2KҲmG{7MެYзW  3L_RMsrey6=矫jt%|`o5A y%6maAaz:A IDATڶnIv}x=k֭vMWT*F Eif@?h(o`kcCdd$O=#_BVӯwOM=k걶0!fdqB!B?ZM5Ζs(Kشy+Æ 8F˜YoyCCCxB퇱(TV<}{-ʊj 66{ccd/WK 10.K```o7ont@9y6v3zM@rtЎֺ=r`DGGtJ 苁A2 =d=??>_~=);XN97ݻdJ%epZyK,S[3ܫ5uh?JVv~L)z^RgLrܻ7MLL .?W,Oy^ۏKέ  ZM&ssdnNPPkwCj99?|222ښ7ښܚ0y._!***v !B!ƹTTZy>z=vMW;дqCfMJD;v?MZo][næ'$4kҘfMSN{?|#{v&O9CCC+;ѧ篚B!B$gc ?|yShaex 1y&oܚ=UƏ_kkpxbDFF1|ԘdדV(מYGddL`llLŊճ%APP0[`Ѽل}˔i3;j8 ooGuj6|i>pt+ۻ ~9)CCCsebccu9 =\k`_ӧK8;_Cڊ``J2V\WSppHeBA۷Z!!!I*T*ɚ% S'׹ffM7`eZ zxDJAJJ*1X\tEKtÇ J}B!CB4_C%}BIޘ3s5g_@V=()4ˣǏtOz4Ɣ񓳳ևΩ B!Bĝ9{NgJŹ/Gƌ]ӕ?NYu177|od?Y :F{xO)\J3lvXcOtï*8}RSSToZZ)p2۶iCqA#U[&^V*Vp$&&OpeZt'Sv{4tkRD|`]_:¯ݻPd Z6_:l7mLhXWpa ?T `It&lܲt4mϲi6\ͮ5{KkݲSֆreq/.^?+W+U@ҥ6r -ݚ.#A::wlELme+t?w0nW%B}a׹ãǏqk޵3FaԮUccce˔ơlw7 就8ukɝ;/_bG2fH9011IrB!B( nI\\9s`Ͼg<]t; :fMQ`A齇>eqm5J%>rLJ% )Tg]`No*:ʒgϞ{/4lPOSOU*Өa} *;U\P.^S%l43t[\rVZRoSiӡ3}z :i(|3d(i&OCduzuὋQӺEs^gӖm4k3%~:j&+DFEcN9@Aɞ=a7jȖ- w`F=,C֚ "(8.R@~N>9Ixi6p|S(})ZĩS?#^Z'A3{7Gѣ|yޕ:̞1ϥ˙4u鍍T=ݻ%B`,Z"ϥPH6=I'U*T*rUwFPp0[ng.J,I_1~LLP(L޵7+)\uXT R]݉-ֱăzW2`p8w'2e$Es~~aW ]:uЙ_)\{u?2% dZs- 2Ysӥ{oh/TGjm8շFZM]Nw*=q̘=ݙ2eLLi֤V{"zgT*ms,%2q3q6p$yd͓ǎパ!eؐ*XP.ϜO8֭fiiaCXd9TwFʈħO޽{ OOO"{ OOOA``RRɕJZ6WVvoݾM=EɓX'Ž3Ŋ0vԈXgqVn6% i˶L8bEu6s6pUj!B!ğ0~}zjz׫g8{B( _BRFFF!AAAJ2Tnccz\mcc.PI'28ҧKǸ#8}$vu~:^kop=6lº i1 b }N6_N>KfB!B]Yڵi˸|jbWG{IzگRXQܛ%wCPP6SӺesZlUVfMٱsI>= !B!Dm[8B&d3MIjċly&O܉X#!B!B8TM!B!BčB!B!^8B!B!z%Gq]g/]'B!B!b'=B!B!^8B!B!zIH!B!B%#!B!BWN%j=ϿxC([V.=pJ%ҥ| s89c<<|ĪKqu\\Wq ɒsM'שς93)WO\ŋ燍MjVsv<ǬY7o珕%eJ]fs[wbr˯_֗3M~mVYݻ %k4_5@^7+WӼNʚӧWwez;qs/=wEl^m;$\:{"tZ fM:z ww(U8:w$K:齼Yv=g]ӋɓS`5i]2q.woKYq3uk$c :?zscLLL(Y# TzyfΝώ-04L B!sQ>ub%3g{Q߱:w tЖݺh a_OѼ>t.'g5pWZ.X?FHi 8u,vGZ5hצ%!?t0|@4n>otґp<| ygψs6Sgg3SSڷkMtiy̍ pEV,YHʔG`dFmIkcO/9J>8og/ԯ?ivϟ}߁CL2" 2h@_LML|*.;L0BIohh I{ѧ?7DԌ춶Z Dy7#oxyԍgS@~Mz/wj={68w"`f˚G!8()ZN(83'}L8>NBr,\]{WBӫ@ҥKԉyAwR`߸7ݙsqs{A2wPuѭ֏ill4S1w42fLO}(?+?Ȗ ~%(]DqIvK=hۺf{q4Rx1%PRE(p]I>]ؾMV˭D<>@j:M$E ֺ`iJW\60{B& DD'NF29mV$y:r,Q#$$JE``RY'k"ؘ=6m3fS\YfM]Tr%)(] j( MfWA>uDuP gZi*Uشe5i|4mٖs.X+Wѹ{oWCmG͜ϟc`vOʕF&)RЭsG޾{gzO>W.zE  }'c > j;!bdХC```\N}X&UjԡgqE^w|[w¥Z>sRjM֨KǮ=q6?~c#zD);{kuf*K$8*]Jp(44PFFF:ؤ@\&b齻;#8^V LӘXLIq?<БcL?[6.mZ4>xz- W߁xx|`A,Of%w]:2qh^~ӰG3i?xXpY^ݻ2i >>4To**_DJ5m ae:7\y _r%T*7oEsMrdϮFp2oBF <m1z<Ϝ6ϙ;a2c$f,\L+Zy,zt̎\ҧc10dh6h.:^RvhݹwRv<6]Ǘnn.TP+Ȝ9y +U?PowȗQÆ0y2ʗcĘ\x9}DW拓ٵgY9wV-Wo08ɬ\"3'5k&NSր!ùv&aнW?<<>X3Z53y2YdaѸxmWglRyzĩ8Ϙm}?xȗ/_l_I+U@TrzITvvecw\oߋo֜+SЧG7Lm]3a4%.\LI"9njd1͛^:.ZYs׻;olR 5V{=G`|̙̤ c)oW?,,YIǰ-g֖B 0s|||cNdȐԩRЏ9B!lyFs>Mje&Jbq8Mr1#)QgշC?lZ 9MҼR4t/^bۋp޽Wd2@,Q*xs NŪ5wd|p|ko{N9GPT̙~{9J$;T Gװ5_ߏ@H.O> '(8Uzle%KLtI+} vբ N_-+$$IN:qyvDžKI:ukın2gʨǗҷWwZ6o @ҥhԬV56bdl¹H"cMKC8w"+>,?GӸϓ;#z}ǚܡ];w\| aj׫==0223J.bHՇ6[X˶ҽk'ڷ8݃+WSbyRliDli߶WZg.:VwJu|ٻmx4pK*$KL^PT*5QvQx""Ԯu}+Qٵzzz!CqL>xbei D>sƔ-1xZ([^^ڳ/ۣܽǮ=8r8ժЯwO]l]Wþb@2Ú4ΜL9tdb86jƦзwGRѺes,`̟=C >ҷW]$wn._H5x)jh~+_[@.mZgSgx &&)0x8 37nަPZʙ{xB!Dt皨T{ IDAT*:Ch+KKOy1t 8um[qU4V<ӣk'LJIcx9ָ;WNrIm|~6?MHJD244~:-])s6mƋXt! i0vp&M%s0 Qپ" 33SU-uڒtϚ˔ ț'7V`[]Է/_}Z׹si(Ͱw޳ܾs/oTᄆɖ5Nۛ:} ̛52KFѓ'Pۗ+wAͶ{P\YM "nܼ};ށ,Y2kɘ!sރzG7o&$4իjm/_,׮Oz|?Bs|Ǐ>%$4Wwʜy uBBCy-CUV]%J4ilԡ-:[޻9g.K+gvmZҮMK ׻DRAؽ}HsKӄjʊGkA^P%hztهPhOUt MBBxZ^Zѽu{t^yJJ8޴1CzƌOG$%7LU@~酁Ҥ&潐 eʔۋґ,Y2:MzKDR*'',,,ڮw_IJ:k/oo amm_W{ҭ%^^>z Vm#3΁#Ԅw4o{666>'rk+s ZM@@NZ 7߷9TJezT@@@ aaaXXcheR{HH (Nhw{Ȉ% PDȐ>|Vg֙m155e\avt0- > *FFR>שJJ*kk={=.JJf9=w{ZP {wms`c cݗ 0_>ؘɣD&}$jY`L3ÙUk1p b_!x=v$aiٜɓ3g3fdg&Ȗ5 ih362/BD'>hy'#㈡Fƚmy511z,%"޶MvdanYx)Rxx8N;TZ)fcM(*Uk+[|y`2}fvͨضi%טp Ç 6 ### Ϲ  YˋRvMff^~Â93~+k++vlȵ7ٹg/Lgڌ9ԬQ Ǻuȟ/VƨV j*uTu|||57TxxV i||u5RZXx\ q\ :Dc 'ORp ZxQV^LJWl1ŷBgT( 1_ϵ㎋gػߟ 1sdʖrkZM`PŊz-nn/ͦGVsY2gʨV@VT;qk μ|z,^F_vh"ɨԩRqE\1>>Zבw40(Ho=}|}P|}}uV,vSӳ;5/X,Y2N>5|Sg΢R(5Sx1^/Rfh[\q9p@kb\-eJ M~}~}"~9+W@]Ȝ p1NcGEח)RhRE yCGҒNӦU |:B!D>gϿS%>%j`ٲfEy^zJJ sP*?o޾cl^ X{NhNhhVOX'ƎM,Yߧ'vmg 4 ]*̑]痳Akp5X4{}oE3UIT*Ϝ O\ܼu[w4> )_Oҙ&83+\W2"(V\9son[\19sPD1j5/_֝tXz߸+tP(8~ = ]IӧK˳nߴ)=|&}4651Nh۱+"M4xyyq1޹SfuhڤWDR3g9ƭw=}jQ4l$Nj{0Ug@+{#vM,^±{5sܽw{3yf~ΕɓMҦeL2}P^LML|;vhBi<Qp!6mFBQf%||O RU*WOvϞ}Ha<@m?q ŋBy;._ʞ}SByðcս &&Y͚jUȶžb2f=s>ɢ T*lشpdĎy=k8#PΩg9l0iӦӧ3CP*pݸ}.Uf͛ool/3YU(L8}Ӫ]'7O[[x 'Nfˆ5@¾oqdyd͚NcTAJ۫ a4p޺uҥJRT|oܼureIorq:F[-,,bCXL!y䦊}E Qc2? Ã+Wald>5]LiB)>h y~oɚ% 'Oc( L9Wg.7nҳ@ttuw93([TqlCּ}7ҲyS$o<8Orl;yuJ'OP*ȓ;w{w?1<\ŋ8v$Fƚ9&/Z ĄwwAʔ.IS\~G0e8ͶŊg~*Vc箽dʘ466:yϕdG">B }N=Η/2HЧX3c$_DH>۶fwS,y&oA [k}{g߁(`_۵e-46St<-\I,+1_-njbʴl ڴj*\{jX^Z,\/O/ ,clPuԞ4ilزnAɖ-+ujФ{ww>ʙVr5֮#*=3MR%Kl|V\P&}T,_N W(1&&&,]u9t(m ,, SSS^BM`-+ָjz8Yip,;lY 5c]5-6eJdѼY,uqe܄)$36&_<ԭS+ǥO9u,s/ϟԩSѨA}wI3vp,^F #a+fǗT+[[6u?Lr&8}5J%йB3Z|k~T*7kSϢQӖL&<_Uߞ*uԪ07g邹̜31N077u:+Ʌ ͜5/ȱN ԟfMpu&LIs)dP];wdKj4lqOhh({ϟ+iqkYyx_?Μe1 <@r4pI$vUB!xg_H 04@P* J|622 U*pjuNNN:?.4!Cz'9q),;RTܻv[%(>=)\#UdIZ/Usߝ{bLgdd I1lBCCS ET7nܢCV :W@N9g~INS6]!BP_T\:{"Q*;s!5ԮCLOTؿ[wo{͛=w܁;DCCB!DG#wΕ3B$#ϧ!w0SgDhyq##!B!I^Jb\)7F?B!B$y&&&$v5qc !B!BIG?5B!B!DRbnfU!H!B!B%#!B!BB!B!^8B!B!z%Q\~éZ_ͺ hߩ7n"444;x)@sͶN]{uUt{56VG fͺ e^xVm;!B!~лxO[i&MI_za#ؐ-ڰrZcȌs߸)Vp6lB]ؐ;|}}>_u5m>:M^w/^ڇ jwrDZRR*U .]LYn@̑]-S X[Yk?n/^fڴjA두2?f O̲eJ⺊XN"B!2l$i0v޿wgՄ8eϞ?oucM`( ֬M[hۺ%gY?? };J.6[V #B kٺ}Sgb"M]WSfu2fN$7(^o)/KL+SJqc,p}ԿNcIy1P(UÁvKH!B!سw?~,]%lܼ͛ar?kLrGyX[Y1h\NR%8~Uӡ]J*G/k>~H5n޼M033QGo܄?<~KWnՊuxI6pŕ:Pߝټu;~/Zƍ0th\]b-kr[ %EKr ]6Rnfvn߬ӧ̝nnKݻPt)/^˗/ԩkOʕ- Xlہ %\|ӓɓsY&O@ڎ˛ E-s9xzyP 7nǗyr3d`2dHϧO~4i#FkspNJ+|J?yJ\9|B!B_lܼLLhۺ餍-0k|V,[y xYdfdΔqhצk=r8{˗(JrIݴڍ["yx|`ܺ}++Kڴjg]|" iF+fn޺st*ɓ'lohXZZrUM',, SSj*Rv@ITh'ciR:kSpIvEҽ[gjzש3gYd*gXeʌYq |"ЯKsitlpwwg:yj5&;P2Ǐ!s挌uW5i߸II,Yu]l'9q5m@ҥ۫Wqݪқ'xG7lƾREz@ #88/!!\|3߷ad>><|}zi.R%ӱKhOViW#8ӔۮSW6ox)98leKIcc:>1.YdL @ڴi4Ǒ>*#anf@m0x^^ؤN VK6I=-=)uB!B<ժVz]Dq}|8pVObViݪU+`2% 'O\ +W /_l @3*Rehש+Μaovn9w"^tf>ٳӾS8? T*111? |zyݶuK>['zu4{=wt^k{m1{Z#s6\^P*l$8o2zPr}߯s77Z6oƾbk׳zzujQvMϞ]m reT*)_,\lŢs} IDATXa z>}:<=7fɢF q3Le{VyB!B:lܼ/а0ñ͖M'mlm(ж,#zڔ.UR2]ݝks}PT[}ny3dY)g:AVGBO|۾c.vCNț7Ϟ?gЭKx{ǎ$E+[Fk'ڶalmQx1Ξ WY݁n]:-[ME >>j,--[Ec:8TBPPc,^ J/"2Vהe%>ߢ!!!qhI )oB锩wUR*Ȉ_{^B!7ob߸Em͖w7oI[[*6=i"ENoanaCHHG"eJztB4iH̘)3u[|}֩WT~s33{{fffyVgq{Z4*VJK]h԰>6Si_S՜~7}4i(TeJbXfU_ė'?|Q)'?껛W@,1B!B$.Z3gؾ k ow6 vȕ3Y2gNP:5:l]2gά3Oԛ7oQdɜ)|Y2g۷vqWhzryx| $$D@9Pո}}[x)Ԭ@LyV-STTX76oGAodllm6Μԙ500Kww3a!/^ҤS\Ξ;oJ ț'f[#aDDZ_HLeO)݃L3!B!bFHH𮰰0D;Rlm_!g bH^$h*|yr5yW4ʔ.ɭw֑SSH*ɗ/_ڽ7nǏiӦ"& Ç6H҂ŋxlO>+kJ dG?4Ԧe N>e.\vv-nn-S\9sevRY[SK`Ͼ\~S2XIBe]\r'Af[ʟ?>MqE%K biHߥGo6nS9VV>rjuۋ:A !B! `]YsNڸ~ܹsajj n/^<}֐*oW̙21}\J,8xGg9ϗR%`jjJl޺UkqEoĪ)W i.r}E ٳWPKоm+q͓__.\gΜh >w"q#A#aݷ" 3tmZ`)\~ŋѧgwPY⊁U[GʧP(7z$s/ ҥMDd͚ERZW"W,ҩve՚u͓ ˗~|HC `+0d8aaaܻ^1oDTRLw"B!Ĝy iݾ&8TJ:="$.m_̌ Fd 7#m4jьC{_ 3o!mw‚uQhPըT*ToaT*UT 5cnf,X)fbffJ&uV GRim;jKx j2KѷOO@H6 Nd˶Hʚzukӡmx RJs| Ǻu4,--9l,' ըP5>KDO޽{ OOO"{ OOOA``RRɕJZ6WVvoݾM8D?yD%e)ٲC)0nt4E ӱ}>>lX򗭄6s6pF me !B!138{B( _BRFFF!AAAJ2Tnccz\mcc.PI'Bd%E\c=ܹ{ko0{|]A _-ٳ_n߹C j5erYZlB!B!IzZRcllGx-aaad˚(Z$a%K(N$S?svpR)ӓ~}zB!B!ğ fh,[ Dy&O܉] !B!/tqf͝n횿FBB!Bˑ?h߷!#!B!IIH#c !B!BQ\K !B!BI#!B!BB!B!^8B!B!zIH!B!B81{LjpyvKwTK_?~=.^N!B!ɐ)egO);{wf{p]6k7qi׼N);{n޺kpn/^ҫ@*TAm,uX2q4֨CmFǏZi&;|{&*iJٳU.4e*T!,, ??? Cmws77xy{S#߼S&JU~5ԩ <{Fzu*mm11IUB!B$:?)SZ$vUx~;t2ux޾{Ǣ.ӧWO2?,ZCGBI3Gvtj7C^ 9j-nA24ۦMS#-!.ޝذq cOfoK]_63eul&Q՚O8s33lXB!B$)>}R֗/_H,o)hǿcW` os33ܽDžK5} +:=++[ZʊjU*G[[lfvIҦMC…4ۢK||}Ufk7ٽ ff4kk‚q%ٲ!"6a3 wѨiKxWߠeێwmǮܾsڎlݾ#Ne2yQFp1[S;wsM7EKp}E-FTVr_vn=RjMԨC>ps{m}b_o܌>N7!G3jܷhoۻRӟ7oiΒ+۰ vlۑ'OiUq3RNrd”iB!B7oبF C y S/hӡ ._"v1}Z0{w 5*5PjM ծI3Sػ븨6A 1 UFPnQ\w]]sV:Y!}̩{ef9Vg-o(^L4^Յh._hiP|9msbX[s9*h!2bPRz >{Eʑc3n"E&a3j֨耑O}|_}V{u:9j'a|tT\JE\9ݣT,`8Idd$+SlYQ%=t.;WN,J>JHh(OM mg.tl[\8ʙ#}{N?̔1#M7䯽$p$B!O0>r8FFGN=ǥ+WY9ŋP\Y^|pmFu5ivR7k\,-c_*^( dԯ[;oAO`5M7d=T.G322,-!aɪ`T}#{6솓#AAlCF1 ʕ<8DlNɝ+ߺ}/^ҧgw^ݻ1a46l#ǎ&**3:,p%1ٜuFnݦbrڠ@*8ʛ'~ ssʕ-cҕzz8۷&F"g@ 1,{SgG\ DٴA#Y7Ke\3o!MEtgGe͚w|fB!?ؽظy\*3bqKW>*_ I+YD'5p2eKҥ`ܹ{/ف{rN:yI'IF+zkڴj_jZĊUk s%ʹwfiMHΒu֬'W.̱'YԭS}z&9 O J/ߟҥJꤥIlX,_ɪ=o!Yӳ;ժVIsx zt%g옛yv.488@/F8(M߄t_q50m( \+B!o|aaa4WGo0L@@ *QqG qEPp0:bTd?:z$2Q\Y{ߋRIHU* nϳz顡a355bx9JV V9t(~%ɍXi 2у|yеg_Ε8D[KokK@`NZDD nœ3tP<|ȆM[=ny>:jG3l@ԫMd}[W$z|B37`ge}ԇ0Mmjp;I͢M DP`țB!ӺE3?}ʀ!^@,dΜg3J3FYZRHazt9#Yth6pex{ӧ>:iϞ=GV)zN:sJϑ3jTsI* #f`go>+W7(M:pttԙX[[k7Z2/]@9uOFr}P<{51Iώ.ֹ#RI<^4M-\gNe},2vvx6-<<{FBʅ I?|(y@!BsS)0v4E !:ww.UҙׯI6'GGGrR%qo2إ;F|o$ s e"#codx{)_ W^әpLMMqv.hN:Mx gZFVN$|zm}7fyXYL钉wϜKpٛFIr,-'#m0t(N=odINTYq3g_K̜3sssݠ:S6=~c's~PHa6mن~LzϰhR.\׏%3cD6mUk 껥RsbXW^+M7sXӼYc.[9u,'qFB!?TR1mxrdF{UP%0x7mK9v%xy*ж5zg_{x2d9SS^xҧg9x܉6xPb.Z`˒}M7Did=vvFZhq֌t>.\ ʔfk/{`.XeJJӖm^n&uꆿ=hצ%[a#CNH֌B!B)gL%}0@;s* e rucyP>V;kGf(K% bnf߸mZһg7r*JQ|Y_ȴs)RgNO&Mj Ϟ>sW%sL,Y4Oos\8mms f@8r8AA4i@fcm5ow ]3vDPܺuK UȑCkdjjj{#Zmbfffm 1222h4JFc]; 97ks굯9vrT]];B!B?Wј6eʄq?+BtN9K"Eoؠ~CBP(Bj{ $ÇFFFꨨ(R,XPᡷOf !B!9FJ?+B/ wUB!BU_@0!qh.;hA4jP{u+Y^yKm̯V ǎ=B!Bғ !R" )\`6V߱7ɓ.=7$|w5s3!B!BHfffG,8gB!B!l-B!B!CgB!B!RGB!B!"^8B!B!B!B!B!B!D~؆ȓ;B!BdXh1?s\;pYsshoسc!ys,-]۷8z߿˛SϠV)[4*]:mYsg~K+g֬u=F6ҩ=.5[FPJPf̞իqptu0ٜeҽ7%k,_8B!B! uH2d}^~òQTt9Ѻ&OT,[1cdzpl \h߮N̙2j/d椓MعR%kƹɞ͉TbC+V%::ֲu&O2EWv4JRlʵk(VQTh4_!B!vCHh(Kamm@lܼ-[`o߾K1 `cm͐a#x K9kZYYQ闊 ''G'NΎB j9AAATuMv]:uœ ~&BCCQ*/n2HJX,^A]?;xLJ%Ks]bbTd`GF _/v[TT^ޤ> IDAT>r cccjTJ v߸?o`lݸNӣkgm[a=h󽼗saw}֬kO|.ɒ93111>z]Yr΋0vH,IΒW6ʝ_*u|j"""9#B!)oȗ7ujԔofL|h44&`-ڃDyy`б4 Lv4oژu61~ŕe:KF 35g> 0|LwRJ055eL>Eh?z>3u0Ƭ\p .j2<.u쳢P(xE=A,YArt:inߦVFT*rNN(WLm:s(~uqʔ.3+X"wŊsnrȎ‚cOJ:mS$O +pB/VT=ۻ s :vATTtکC;ʖC?yF iӣ;z$66ڴe+VQp!v6ʝDB!&nps ػo^y:c]y6܆ 1XmZRV1Սyr3x@? vvN:CV-tj#s :_??ҧs<~Tgc9rбKw?333BC26?lڹ#?3n&OTIg;A{s=^zEuһtlόhѦY5ܕ(d 俦8G -a0r~z6ss32ëo7mBt="&&FgJ+g7oXv=n?ZMLL /_)4 {eaa/)e˖f_{?~$*U*'؆FT,_ԩM,;?`L#ȝ;+g$ĉѕkX꽂zkgp[,[1Ƴyly!i%l255ER餩j"##>|ċX?y져/(/];StIoB!B_h8qٌ:::-Bт<dL 믐 y'ы/h48:'Xs/Rt9zv)`BT* EK=Fy]]su ,_իaos/`meE2\zMG_ E/4;JŊҲy޽%""\9s*U*N>-V9}Nv !<<\v=bbb#"@<7IMT;WNnGRdB!BR+&&/[>˛Ktqϛ/^M _TtI߸I@@6ȱ㘚Rhф*Idd$gϝצ]v ?FFѩ!<ӧϒ7Jw}6U$x:r8Y\x<|Ĺ\?RlKF>>pu_{s N>ȟ//iҤڊ:k彂K0Of(ViӲl*s <^0OܘvF"##yԇgLLL]9{cOS\|{2r8&܅B!"011pl߱@>k b:c7oҪEo/}Br83}\|`yz{\qjqEmkLtg_zuP*-=n<'Ofl޺,9kש+&O>.P ?J:3g"?G>sTҾs7V^زm;={' 0Poq TkĩST;ŵ˛h#_<ry|8y4Ŋ1b =)zڗ4ƆRiAbѭLQԬ\c##UsHlشE[̌,ZV:`oO=p-`,Ad̘6Z!Zx1̜1k.L3RliYZ~ !B!DJ6ls-m.Q S: cGd<~L32''oڿ/}JP0es-]ǮXZZҰ~]umh4j5Ofԟ?kFiaSYไfbaaNfM;* Z>jFVSt) I|yr0ISGx.?<aa Snm#hR¨^*ի$uD"PܺuK UȑCkdjjj{#Zmbfffm 1222h4JFc]; 97(j@In5sm훿1B!BsR&8ul 7T( "TV"LLL>|mddmnnR٩?~Q*;;;M5zTM!B!BX8B!B!J{֧Q?B!B!>qf͝`~}[w$p$B!"ūP K0;F8B!B♥MYڴ?Bߑ=B!B!D~#CoIo]'B!B!&3B!B!D$p$B!B!%#!B!B/  !B!Bxsb?3fϣs >>|W"**ʠZĢKj_~CvWm7}{-B!BSKUʱ=~UjgroZlݾSL*5] KR R.f %Xk*_ś%/.5Z># 0PyF{Pq Jzm6JjӱkO?yOZye'G"KYYy!B![ =~̲h4ߤAHh(}&<")ѡ]ko’AF{py\ dWn7CzjfΙum=vCakc`솵2'Oɓ-S xY⽜(vreJ3f$|%4[IHZ݁\t%pOD\;B!?Ҙ 22ԩSn|U;~IHH֬uBXv;Eiao ̚>JTƖ^rEʕ-S~oPQj>hҨnM7)7l@b?x(~]|=E&X,--sgΞ-qDbR kH?}ҢmGWF-Xr/_1r8֪O*5hӡ+GH͓PruobP#=o!u4|jԍ.%Z'4O0`0\jת5iѦ3ǩߺMnP:-v B!"Hhk?7oݞg7h҂K1e,֬G?yÁ-DF@_\(UqN=GjMzȋy8p0CFQj-;{e4k՞ѠiK6m٦[6Zk՚ܝcO+Wiݾ3*U}V29s<%ә T Q\|5ziӦbr4ŰLUPP0W2tP PÉS Kzcߏ>b s/GXXԎHZ .}~Sgp?B3cD׫ͲY-G}fIԮYocq5zӮu$V2lc̜693Ս> >WDGG3~hfϘJfMx;Fa ۋ?olRr'88 !B!RcQfufN#nyG۱-Xxׯ`ڌ9T(W}&m 3yоM+F ͛w׏YsPL6oXC^=^9Q׊̚6Ӌ?w{gpWfLD 1fg۷4 kM@u>H<#[6'4'Gx@-x}V{u:9=qv.s)[dΔ/PaSB9yLϧsqܽl;sRᣄҸad)bnh`>?ղ%+(W4cGbrDGǰ~f:oU:mLdT[zD5ݻԨBLL +R6{2~4G4x 6G˕ eanN̙;" 0GE njb]z[޾5oB!Br_Q׊ܺ}GL8_Lr.Z{I#{6m WΜS,{k7nM.:ʕ۷!ʝY&cTP%0x۵&wΜ;wallL]<'O2sjTs>+aaYB $͐sB!B܌ذi 1*O^~St3Ս-[zzŎ?nalL钘fmeEY۷pv.Fo̩051hlڲ" A[mӒ;w鵌Z[-\LT+װljܫK-]śv}ӤqC6o!Gҩ}[^~iݲR[/_^Np+S3fFTxz-p-.sL:H;qT&t@5>!C>б]morN>W*Oq1LMLbys3ݻvҞG3͓#ǎӣkg_ ?m0n4֬gϾXӵSv-֖Ks -DR`$5K,^0}1)%sgNelݾ__?ҥ@|n?0>֤eTR3sB!BL`V-[}֥#2رeolݾ4iҐ-uj{g1#2c܌5kТY9-)cF͚y ٰi YЯwO&Lsc<&TZжMKzvIRVu&Oǜ3!j 2l@1rPҥdͺ/ow;^rMB!B!GB!B!"^?tQhZN!B!"%QZ.|q$B!B!%#!B!B/  !B!BxIH!B!B+c.^nPY8Gҽ7VHзwbM9~.5M}N{LF\ja=jk9JLpp.5pv%&LJvqQꕉde4uR*J\S:yW]YDGGD݆My9o$9B!-X'ξV7яǔ>Ϟ3tHjoDVXzm]z=3fϥAkؔIS`7nRM[7 Jiش%n 9<44w kؔG'? M[ի$O$-e#D+SVQj޶1ٜ03Kg]K*U7|܌%w֬7o4m^ͅ5k7|I|G~*Br:|$Aغ}GA&Lƅߧ7C֝;;FWVVs Vui5[XY#<"B[Ɛ+V%::RٙSg/_55K$O$-B p5J+{"W^%Kݍo{[TTiҤ!Sƌߤm sV.[MFPpxX[[( n7n[^{s.ƎI]:}O@66_x&B!ݮ{ {"mP'{6nJ-HvoLKefȰ\tҥus7 +ʱ't"""3! e`>3sk7ҩ4nX7Rxu% ĤRGO}|Xt9w%&FE v4iԐХ{oxYq3&Ot)g޾}ǜ ~&Vkի,[+W}V{:k/+ޜph (@ɑ#;o޾MLG9se"K 2gD(STc.~߹oސ֖ҴI# vb}(T cF1GObbҤI`QQQ8u={sMKg?t(6mWXSVMڷm}ٺ7[7өWqsztRYr5{'2*JT^M었VZñ&{6'zts2]ݰNTY%ǿYX쵌Oҫ{W7j`P>®{xBaDܹӫٳ9%/iБ^?? ǐ .Ukܼuvǟy5+RCNy~2թ ptEq=@|g`Yj-:KQn߹KCN56A: 9ztƖ'O; 2}~3336m ,_ vvڶyzQ|9FrqLx!}z׬\ٜ[Fa% }Vv'Y剓Cnͺ ߸͚PHa+137v3l /S闊b>z(ʗ+Iuj?{|@ {|b}ȞᮃcT*F[>Oж Ydȱ3K=qtcFg~{-c2* kՠp %s(4FÜy ݳ;~|.ɒ93111>z]YrYJbh[O}|Xn];wȘUk6*v WBSP7mʲs6 +Weæ-4lPݺ爊Bia2oŊa/Vv#Gv;~Pr)6p_< {W:… PXQm-Saanԙ<~%ȕ39sc:+ 0 566mQQQ,Etx9点ϗ~UNz%KЧWR%9"ǎ`ځݻ8q^s7r6oن۰!z.$$ҮM+:oOKɚuQyiP.,"K,\fMiCGw~<|D\9ܡ=ժVAT=}Au.-ShnA-P L0N{MS2c\:oRs.r ΚN"(S^f歌6… RPA'ط  ޞڵjPz5@MPBi.:PTIm Wt*W tS4j m+ SΕvrQjըo ##>~y@Pp0nutI[J_Ю5Οgy4oք0y8,!<mZRV1Սyr3x@? 3ӹ 8u [ \V=rv+3hp|K1E033#44,zaaa.cS*->!eWm wD;;~߹ w,_I6'W?t؞ѢM2j+QQQx/_Nˤkr̩S.ڷ[?wqxN%KvmIx =x;w?oO۷|V9s۰ 7nBLjxN~rt,$/ nn}'4Qn]K]~hK>y=/1:[ܸy ڴ.o+..$-,t=_Dvu'u}jk]&ffv1WRYk[{{DEGxS""",)))A ETȀkr:uhX_X6-}k###up>\5}@TTf(הApYSD m,\ ]:u΅}5HMMw#mV2;܅F.|e[յjլgrLJF֭0xЀfcVGɞ$G$otc=JUTôsR(`g2Z[76!!ᵓ*z/,q}s$ sI%(Ur,P[+2BqhirZڹeKLJBjZR)J8^ M4KTbI0PT)H1c(Pr>^`eeEsO|BckcaPy=/ \˕CXx8:|ic(,Jeir*WTzG ׼6)b: ! o%1I(EKp9 r.dع{/BB2dɒyKn{= ksHl$5eaKEHII鉔?r9{O'N':i<^LV}bb"D"gWڑJ)ؾc,x̜=S&CŊQN7ʿb8+ z嗓#|'ODzz:]Ukaiߴ>mmq'T7SBb"l/rVS(z E,lmm-~d\z{Je=b7l޺ -7O5NØq(S4ڶi[tRZm[[[A$!6.NNllVRZuj5tڏVrJ JeH.LҘ5c:H[B#GCCTТYN]P+<.?yM3kFi+t)ύū7E,~z^߻..Xt9>Hf}LJһ˗066,Gְ%ެmbcc &DDDD@A9bd*/-c>X~ 3ra_S'''3g?3X%,w&&R#<.ϝcn@uQbL :S3~"FbtܱǭH$®s^pS|#::Fk,-,лgXWsqyls'LEƘ~/]52e0_oZ?OdI͙'Я_9ǹalݶ;~!Ĩ텒%Kb՚?[`ezh4)p,Z-7;9Q^ o/0w¥z ~s桲Ԯ sDWu;[[KUJe)ѱ,ڴje+VaǮ8"9%=sxW_qxW"6gΞCTt4Oi {߅è'+q(**J(*_(**J,JjZ"$*J X,6h4rFcwqzz:nݾ Z]DDDDDDDD!"K/> bE"QZN*H*X255U+ ;;;uDDF.k4UTt2G:m'"""""""XqDDDDDDDDDelRո{.SR  SSʻX>*R[ 55С;`"5sYXZZ1GDDD8:9C!"BEFDb ޑCRvށ(<|EO(WIL}@JCrràw(5%IRSҐVdd#""""""A;U1{^L^FDDDDDDhj~x㈈чhc8j<,^0GÝ0,Y{D߷Fdɒ9]A6}&R#""2аp\q Ő`o: Bx 3t(DDK1fD7mqD@JJ ؅6Z޾L>]'062B2eU  QDq5 '*bp2tUTʝ/ bK` 7nU_^ק;>T!W˨T"WZALL #Pwz$"4?ʖu*+eg[bͨZr[aѮmktjw#p %K, ĐCղ9fpqP1HiFOYq IDAT>xzk@i\oVXjв~f;Oh GDDƮ߸r.hڸPV<ԮHccNHDx{UGeOCQ`{G eZ4(JѠx V+.q|OZ /va̝/o"<.\0Qpr,EKD@ r3۶joؽw?=[t]:w|svˊq߰hrDܻ{{ 2ujz3=V-ޑ#"R\nSJKqOZpt,+Թp23F O۷vڃ-۶c-q}l,] c7_S/6" 0XڢMXzB||<\˹`𠁨UFr7nFhX8Q0ܻw3zX[Y ACcLzm./SSSf D||ʕshm ::X KKKm cP^qS|C"b>ucš~n9yd$zq?#G0sBiHqOb8GѾ]|٥6nފig[y[cܘpY̝UT> ߸[^ wBðbZLe: ˆq%>8u?wa3iy<ƏŘqPje)b da,]sf|}ǭ-n -!Jth4:|1XԪ \{8xtKK @RRAV$p 8xT7nb OzϞO\fM2eJcPj}if&Gꞿp vvh׶0A_Zojps+p/MSTxUFDDMasNwޟ E,\]jLf=Y QѰݫDe_g ̘+D"\]ˡQڹx9u0Pû:z`ؐo t4  :Su/]P{ rӧϰ;ƍ !Qv\zZ<=1s~YU8x0 #G>}]&Gh4=w!Wbޜ٨^*gϰƎjҩKE,c{TJR2JF GG~8r8ڶn%mִ1Z4ohܰn}~]n+4XC9CWu=E齜O l?N###up@Tt4PThѼV;u}ŋ('z'H$AtTӭKgH$ؼeκM[!H""7eii.:O۫:$Ƹ|;wEjj*g(Y4a!l޺k؀vr/:5-- E,+Us W2S^1olF ոqC?  T*EzuYH&zuUNNXb)͙ 6m7F !!soA);;!irj7 OΑQvC`mm%$paG8r/fH|wFmV_o<ĝQ.\D||<ڴj6r k++!iŧN-e[y\vX[oCV3c/.}XVH]Pz5?ox50AXj5_.F9JY8QbV7ìrsV=DRO 2BNV.*:cHlDӏ:[Ԯ]Sx1u6 +-,Iለ&`_FHܿǍPf "%5kؠFU8!wW()˼]{u><NZZD"P:###ddd>+Tx͛6'P0 >2븑@|zoB,۫0*L񝎝b@>P(bbee{'W6VlHll~A\V0\ Z+UāC^": o(jS||bs ُMHJJ_ m\?*V\LP(3ө1XaٓGCy&yK W\z2yus|_㱳 njٿbӺ5~sᰵ-}T d22/LLL ]:u> >x%KD&9M֗5)))=Wj~&|'OkF =S/66N+9 J%Cr>su\.Gҥ1k4ubћd*)PvSvmzz|K;G}+Obf(]fSW$ t9:uQQ8veJmÿ:dkŒ "ې6(Y,{W k++^mwu k,\0r0x{WϣC j*066FhX8t~EO&3aghڸQODDPv)HMIE,`ėHOO֏E0JU|ab0115y>&"M48%JnE G"5u=~SxXz(ܺ}Ge._FM=bgkgϟku|\bbbp\?DZR]P<>M@Ra9JĂ] o/DF@R ''GDzhgg_v#>zkŞEF eqOӧp7"BX~ ݻJZOtR< VAc0~uG{Ukox߼Nz8 dNexĨcѯoBo>n{Gҥ%J 997nނ{gg'88߃U:,TXڵj޾ C "s\v=qԮ#pw###DF@Y{-wDDWȕܱY,ͅ_@fa}ض}'6 *k\++K:|r9QbCժUEzuaeeQQػo'&nP.*U)~BVRH.; m5jX{ þLs n޺ ^ՅWuN>z|yDGvh(9E o/0=u[yW$%%NXFؿ^{wnsץs  bih׶5)߸5P7@&iF8t(>iVg]>񓦠{.puuErr2B`dd}{cedt)^c7_ L2 qqXwI,հe68;:BQc՚uz[[Y_f022ºQ[Xl=~UP+.8zG ;;[޳G 8;; |NL{4H<5oo؄F-֠^]ܻ %%2 v6h޴MH$B-r7nDrR2LLL`gg+L=spd lmѢySOpt,m[`?###CZvN;x*=Q/мYy3bZ|?z,q=z{-oP¦-*UD"fN+VaɲHOW'~R=}&Mu͛7Eݰc<܇/;vA|BJCWïD"f싍`+j%4j5j5G]j¬_a3R*U@V͵_E6tʳ ng w26oǞ!&&rsTX;~FOOwT*uCZ56j5222w}b ?ڥs..hݪ֮ۀ<=]ڲo:r gBV$m"Qę#ѫ-7nDˋR())IV%2LRJbSF#h4V{[@ro؄:""zO\z7tDDTNWyWRЩӨWXx)]+RT3g|DGo\DF@0ol;I[Ep-W.^H$Dj: @D"Q&''bTT*3\TRE뫓hz]4"""""""=>z{c:7GDDDDDDDô o<<|M7^˺kEgxݛU8*,^0(&F]uJ.=N~*E9z Q1f#""""""Rч=H/&>l+ǘCՈ(W2YIxR  /^@VRf0*Q/`gkkPF% lLQʻ!nB  S nn Cnn{  %KJ0)}2qDDDDŨT ""|i$$P ,--lL} b1 }@896el+R1\:R3 Cj$M > 8z.C+IžаpTXa}0BQW7J">MM ͼ,k&i"'37DDDDDDDDGDDDDDDDDGDDDDDDDDGDDDDDDDDGDDDDDDDD """""""CmM0У$$b#OK)Jc/hY̽aXr\˹:vlwݨo?#Μ;8oۦMDDDDDDNx2C%$ N ,*bp2tUTʝ"1&IR 8{<ݿzewqG#дq#aӧOw򷑖P|l)R:e1z %Ĺ|DF{%##ѳL0ǎDpԮUӦLٻdzakc.:KݼuNN#F hŰ{>o߁DBN/^D>1w2ԯ'k4tmZ7>}rpU#y̦NcOK0ѱѭ+`?m2}K|>s7nG CjU!""""""zGc5޵ $ ֮߀~sxf""""""{8ÂL '"*:vB͛?;z~}z|FZZo,$Zhڵj"F MѰA=|;bNZUcs|* NrrpMT*|K 7k5l xDQ<`HO9 իUE>pqkZh}hݪ 0>ujA.CVRD"<p5h4|2gS獏c'\˹h%ʗ+N𪮵ݵ7RТyS>u;`aalߎg" tddd~J%"Cn]iִq'j!$'ަ1~N}ߴIc,Y_@ V?kCPVM!ipGhXV(d`oƘugFQZU(QKDDDDDDD({ȼ+Bk9>!0hrF9/ZW0sL&{rFV;666oydo&gȽRAD"xHegcmժ4i!W"66͛O{ћ2p7SoBLh4 ôn5GX[YA$!!1QkE)+y`w#Gu(7me+W#55Ok98; rTR6gMԩ :s/`XrƍP'""""""X|UaT*JffBYzz:.\LJpu-ZϚPjƤc+V(6i ,C`iƗ]:i퍀 B"ck{ Efv&nվ>Fm{Ukox߼ND"AUc^T\h|j #Uu.WyW!a+0h48S$-dia^Xz-eѭ+8FAPX_A]:hҸaqqr@`)*U 68w"]:akc'O|ھ<GM@=agg{a(abgg'iR3v7zSSZlN>ɀ(͚6FBWoh:"""""zjca&HG SK e"  AN-%7](tPPڡS*No|ߠ!B>NMDDDDDDDDz1qDDDDDDDDDzѯǀohu5G S0vCADDDDDDDb8""""""""⃉#""""""""ҫXUڍXanܼd8;}Ѭicby 2hX^b_eZ̘=wBZS&#G }"lCع{""A$ӣF}?wLe"_Dᓶf(I±PHK!}bɓ ?Ư~A1nT9{^ISѮmk̙ \1zDܻ@8eZhNZƸS;};iIشeݸQFDDDDDDDTHuvmZi-7j5z}];w̬Wt `ڗZ}ЦUK%7@F t D>C jqң7?/t 5N\@ -^BRv:ؼ~ *UT~'狈0QrJ m؄A|t p+_^nkbM43 Cʹԯ+lYx%=} +Vk:#t<|XmWrB:dQLݸq Ne899j-b83.^_í+LMM}.^ ֩kmelee|K,TXH%ssV=T R P*ߨѰw#þL`tNLlddFZfegkc """""""*L6qVqI;ɨs&d(bc/M;ax1Λ5uBbb۲[wt&޵b;9vzFT*.Jwbl8q2P]V# T|1fBY<}mU"*:Z(KHH@hXJDDDDDDDmH*z5l'bb3f#5-UX,N>s?Ϟoi`ffUk#55w#aʴZCIpqvϿƋQB$Үw98u5ǩ3g .Zv7>>"""""""N -u߃3n"?x9kw\_gNKѲgid*-Xsg:} Owԯ[WF٣JVWZQk興cW8ﵖxo: $٧٧֮|fo# Nԩb:ka?tn:Xoo_}mjzlSVʈ X8"""""""""a∈*VCޅŒY~̏ߣaDDDDDDDDD>qԬI#TZ%VE Od2d2CADDDDDDDGT0R1\ߊ2(݉u5tSk/~4R+v#(~7c1h(e!wO9L1/齰NCseb#z4tT ż'=ƨcn0&(OdV:eb  matCZ˱F! U#"""""*Ć'&Hb1TMTgx<DEGc"`ÚZuC`_u:H$"(EH"` r" ,CQJeɱ!{'֬ۀ.:2iDDDDDDDDVHD"4mHX~)]m)ab"-֝;u6~2СX$Ĺ|DF{%##ѳL0ǎDpԮUӦLٻdzakc.:KݼuNN#F hŰ{>o߁DBNGPjX[wװc9VƣGa_ >ut{8z1Z]@"` 7Ӫxr#J߸[^ wBðbZLeh߶ ٳpOڵT*71Y/| ¢ѱ_C+hذNF0vpr,]{atZ.Nosʈ LasPtiT} ;[[^M {@>>uj#-- 7nG-[4_Z5PѦhؠ1 Pv-*bqƞG<[`@>קΞ;mb p{8r-"$|r(Q Z]~* -7*S[#>>HII:}Q/JOGFF\_GT"=tEfM8F5tϜ=6ޅ2q$˵LT*-,,*h4hXXc%|k9d2ܽ!!WXh4X[kcccgY1v75,Dz1 E2q_%̈́n2KC 0#G Hk++D"$$&jmcYˤ$Xd[V$UapvrJHOOR쿞?pᒰ,JZN联rpH1XYYB&!2'322t < vDDDDDDDDJYZXwXj \̹NL !dժV]{P"FyHMKjW=ρ8~28u,=x8D"<=wݮs^pS|#::=ulش}Tl݆Me)EDDDDDDDTP5ۻ'l{>޻%LL6Z uƎ/B~aj*C-Щ8$iִ1b ,] ~s桲9Ӧ3&b-h4DBH$IEweJϾ,h4P¼LVUFDDDDDDDT2qTw[[[i/St@m/ɾL̙=C|`Z]:u@N^,-5Ųr]*Uem>ЯO/rƦ >jŅ):w;v1t(DDDDDDDDb@zt*r""""""""*P)),kڴ6`DDDDDDDDD㈈b∈P5z-Bfv*gC˻;sQ} 8X!wO9k[֧lˢtCPl)oFKu!DBDDDDDő!8Z`Cb noSKEJ;Y}ҮwӮ\@rEmaΡrDDDDDDDDDDDDDGDDDDDDDDW&;ȳޘJ/k"L~ i `4N&$P%6Ԇ^'?{ H]-KBE BeHN QjOm K$E .,K׀ǁs,twGi5mB୕D 壕rH=mUBw)Dqʖ)IR IdYٝ}1 PA'NWheGWjz[??@wzbM$㸌OObhDT|}}F(DDDD0( zӈA4\Q2xj |eTJJQU'o}CoR ͋h^DBTe|BJzN?Rrjlj 'n'637=]IHNN`dL?`6_'""""ʏgj\7""YC^+F"p'A`f\0,lD&rh5h_ NjX/1Fлd(?kUt,08M.Â,eEDDѣ7wdʰ=8dpt?I:>Zo?,9MV0I`I}׬wzۄ#qyh3v%^G2;Fn]k j# !uID.!! T*T*j$"""" /wXFљDD¼|{zewyzt+r? NP =x[E\l||Ѣy3 :{ao9Nr,WӲ!\~#CpTt)zCF&oDDDDD$BXr ۳X>G҇A¡=;Y£8;;eO<3gbYzދ-Bfwpuu5m͛aȰ0cU{>DEEc҅(hi֥3F^:ᛱ.?[f3҇D{vlvQfbcc1~dԨQz˘;.\'/ y!z&|?BsaomVX6 EG 9??1\\vJCѰALwI\~(Mٲe+/c_#@@^S`? ш:ujcTɀLONN%˰k"\Z۸y+6nڂשQ c_'""""g k'fώm5}jQ !0qTz &22 #>& _9 /FCQI3s\`Fjv;:^=bæ-`BL#{ !?/C0zxeS7}/6{8s\SJewSƻ|{㓏>F"66|6*әIƏE@|>kܺuoe1k>_ߎ, 2hڶi*+!t Z>zڼ?bɨV f,^}Xy Ys"""""zpeI 7ς'͓=Z~S ۉP7{s koā1ᛱ(V굟CBh (^>K8tM4Q4 4lP]{jIys%޳J> } uj {{06oA|OxD$4j5||m^yPxxDSv- ?;vNzu믽Y] шӾ̀S&z?ށW۷0q)̚>RSF q}\/ 11X}{зo޺U h4(acVԓ,]F ?4i!ЯwOxzz9=kmilS::w mtSp!b}&>/~9'C:kf7+ ѼYY7.\DF ,`t:w9sM4Q4M5|bQZUKhe˔sTF5~>9୼gȠܱΜšGk^ z8~$4glUT ?oK@qؾcٳ06ߟW]G.۴nBpe4ng~ 7W...h4PՐe'peiŵ.L#*w۸iUh<~"ʖ-yfȨ(e{{{#.>>}#hHצ@,pvrjSTY шhf<9Çu4>kkHLLFcҹ#cg2b/b6/wjWYQBzyd|w~ѳekPy~n7'E`5T؄X# @L ƍ㾙6GDG` y` IDATjmAttǢ-brQծe;v}!Kj,S\]]о][>sJ$ 35=t%7nc>vAH:r;Tz"L 'O/V-^קWl߹ ݻb'Nqhb c7iuOG~>zBrHHHKRD>=UHJJB}`BsG``Ylw󇯯lXL2 -^lϫנ["""""z8DpѾCl͞9 [ :yb!T;oĐñd< ̲0eh4T!ds+W!)) q7@_—#?/fNs-7~''-6iY6OIGV|9,^0[BB?_r; :{&CiVpn!F'K?o̟3,ü__ԭS+9,In8,ioڌHxxPr%t7 6n歿Cu@5پ][9{0qqqۻ=$6iѣ>OB€~}0p@|?'""""g gҹsp)>>^*_.kZUBB(Uc0eYvBޛlݜwܑl9UM=oYskΨQ7u 6il9:Umŵ'Ԏzu',=;Yڞ l=?CJ2 NSՈ(SDfyJ}w$)ZxEQ$k4}bbAeMʵkׄNz"88X!fI/o{jVu ۥKqE|3DE (mDDDDDD"8ʋC`%x0 U*W§@ɒS?;wS_.ƍ iVlܼFҥa|<A`2ydDDDDDDDDV$̜>%⫯auNV-,qqqX~}za`& GJJ %8jӺ׫Ȩ(6Kp4}1>|o8Az_wdY{چ@B`V ``8x0B֬>""""""""ʿ" FP>(n=_Μ=֭ZX7jBBOO$%%aUH(?pFL&K^ǵѳGWqZhmp !<39:3\8x(1"t:zUul\,aY a4<<"?q rApuuqi@Tt47jL9gsOwCdTT"Gj4uDxzfSxq!g>|p5=$!.>mI %$|=**~~O\Ge l SաVq+([L/V ?FG\kZ+dWWW<|f{Z7LطTJDDDDDDDT‚EK0b+VBli[bemOΔ""""""""ʍgj ~ظi 6n g''-[ڶǘ6G8nnhۦ5:vgӲEsDFEaEG\~%7_#0XeEQrFDDDDDDDRꗕ`ܹsRxx//_^ Z*!!AVE1 Zβ, !tB[nɍ;HƖytk9E?i3ح.[bPys7'E,3!\4ve{BeHI<==FZ YmDftz'I%IW%@F'&&dY6)z\vMt:/W.3>yf9777t6lGDEAۻcOػ""""L=S{9^=r9,8ww7 rݾKh%;VDDDDDDDDdtHwD9^:|X<9DDDDDvjD#Q @~Ov'24. ]#[ǿ?ʸ 6vR8.?+1)m-$Y"VV!2$IwDDDDGE=#ܛ[]ٙWbpw)DDDDDDTQWio~c"=w~c8!7]oAB`PY(wCW^A`1=<4V6wB)=G*ٍp$„WJp;AtTk\O$|R_ sлu}eLa#cl\YBjᥕ;\=TYCn/OFMVDDDDDt18"|%`spzI 5@aas8v+A )Ci5 ]boA&GDDDDD9^GӖ/Zh6l܌a;kZ!T;W]G~o"d2T(_.˾GeC(VEEF32HLjiࡑC?a&%?sLLIIu쥏Pp ̄ 0ߟ5d=P6^᭕Jx1Y>x&r!#Z&\GFFaʴݳ;jתai,S=,FB^ Tx_gXH0"ǡQvl-U{FN(*G%oO} JQټlm~<}j,a oUGRpQ P*|~Lr I`|6O-on]2XB4wg«Ts2""E>njs:ѷu2RL,b@<נi1 ,jt5ZJJQEBQL TQT-oR%TFh_MXsYA#YѦUK;ckTj՞)))prr*8wLޥ0+e =t w*kB4&Y?cN]]-E*x2V˙äM8NƠj$Ҩt2Ye\NH0K5^eUCdx>i{Ì&VZ^2>4>PEFLݯq8nº}TPYgHu--%\7A@*Rp'|~owL\V]7]r] L$6q5 o9pUK<~S^9Hp8V FҥJ]{b7c8z85j'ۀuq}wnݳe3cي8wX,9-[4a X*ţAٽkj?PVM3~7od߇i}\DO]X~ՈJp4:^Ye׌Hb-Xu;G"%bjfN#[7X},T2JOGZEa`Us0+J)5u`T29|iykn=PUxd8{&xb jQ0q)X WWFMo_[j: EB 5f7S#KY54b30H2'-H.,eXwd 򜈈G7oпO/h4_ccyVNo ƧAoptO׻'>_/^Ĭ9憎^ܽ{իVEAũg豘>;4i}.L>=uAMp1|31|yv!a~= eJ#dz|:+ZȈ Xu}e)_p/Q/ 2 ̡'RT󔠑= ᡑ,aÝD(ǟ٠,?D(/1j2hZLeWp7:s/Y,:$ :2.eD%Is,RAgռded:4y3񭷭#yhB@5p,ϯ~DDDDD%E28yP抏?p+o֥:66W!oCФRRXd%8j߮7lHl%8ZТy3|@F ߷eIIyͳxY`AX cG"׍WGSPE UWpOКY g2~N|,aR2d#3)jJ6bΒ_~&Z/]k S[׆UbSֳ䡑ॕU,=3m쨔Z 2ЊѧqyNDDDDDϲ"/d b Quwi {U{&lJIIXb%vه`4`4P|yS\}{YRVGBYܠ~]ݷ?1Igv3F~M_?_q]ےVV]{ ""2q]=?st,bާIcNێuh7/L >JJx LV3򢘳yF!t7?89tMr~SQ&t(V%Z{.g6@eѓ9 dP4+Zִ FW8[CIID1p.^PIDDDDTXdpWӜYecOɀPwg,]̳@$Y?..>BGFFFr@ȑp8|=? }U +< G"${I b 7TA' HPUFO d2?cZLo&% uЩ  x\hZLeU~߄k.@LM+FbTM`CFb06fgTp:ZeG \U*zH0 Jqu7YN g&8$4+A ٪kFŇU5fBEzXh3n 0.5a |K} 3ծ]/]Bl 0 =c0paZ-*V(NM~G˶oo/6_{N o& E#98XrUX~f{U4* #\7""YC^+F"p'A`uGG]N.*xh$Dloš&<2? 9a«˼’_5;S :G 5FTX0e?Grjt(q+q[zu#b JJ) g;PSUi$irG(vހj*B^ !7,:t(Ř5a3^ DDDDDO3y{ya5g>> CzC7oԙ2[h5ԮU׬E5 0ǹHNIG0x`f֩fM_G߳AeԨ^/]ښ Iʖ)u6!,<Yt9-]] /e?lۻOR>´ wftkF/q;?bu}7Q7)Sf\̣Ǭ m=`J6[’fyϽDWW(: 3̖ ޱ3H6g| Ȗ$d2aСwcxDDDDDvLG(Vk֮G pvvFPP ^m'x(L~*:w 77Wr;wiۦ""#1}; 5kTjl5n,(eM<&}IW! SY^WEQ o%6nKs'QNDžQae& ׯ_'|8ƭ+CGeJ‘mfXz__%2}?tE,3~>|[V׽zt˰-i׶ f8NDtUR+.C !2ԕ6[mDDT$zܺu cƌA\\VcB~"""""͙54gnXfK!"|e@$zܻw'O 섾0%'ڻD""""$)0=QA(l(4jK`6HEQ,YzR߯V+ FcgQ^\k!hL P F(&#D/5ԨS>xz:@5d/iT*TEQ`2VgM4 ͛7<==g*GZ2#""""r ([*ЍF;G7r$HP^IDAT(&!4}ӻu ήG㌣,-eٲ\0IVCbܹ8s -Zt:£爈#"1IPI$I6&(BjZa Zg|bByJ=U--8J-6HСC6mOe˲TM$Kؔ޴%oDDDDDr$(Ij rjpTT*Ԛ½ Z :j4,wi!QڞDi4LPTP7nK/f͚Ζp(-(J?ˈ8DpѾCl͞9 [ :yb!T;oĐñd< ̲0e_d ;$2dO"Uj ` @TT ʕCJPR% >: ]p;w/\]]3aCh0/-Qј5gvիY˔׎bɲFgFT$e OUPupYR6guF7:m5ǟa괙ݵ-iףGEE Qa]@aQ:j5.{e˔ja4s+VBli[bemOΔ""""""""ʍ\-UPT"))IhZ(ӪЯqlܼNN([ ڵmc31mƏ;p0\ѶMku޳ҧe戌0y4TZ#>xO̶7ŊVAauŽ$I;KL#]ŋXGEQ v䨍-,$RD^2Tɒo6_u,Uŋg~xvVP|7!C7X]w}ɪ-iݲ-XNg8Es1oL;_ 7C]kFDDDDDDDR5G.;b݆M.(S W\9ADDDDDDDD+Gr Fh%/v"##spٔmp8ӈ?E?>GCFUrš;m > EȲ.Z@ {WADDDDDg38 8wåus QBءr4F{R|H)J9z/W.m>#ܛ[]9+1]CR u+ڻ """""eŗ >~c#bM/gϫ~ Ww]S RcY.#""""8FDDDDDDDD618"""""""""b^GӖ/Zh6l܌a;kZ!T;W]G~o"d2T(_.˾GeC(M!UHDDDDDDDsjONP˲Mg”i3ѻgwԮUX={*-X=34""""""""GcɊbƑ,hӪիZGJJ d:"Ν)w)DDDDDDDD*{s zۼw;wY^-ڴ46[xE[t׬̹dhx?mڽ7C knkygԮU>~#g`4m{?q[7oпO/h4_ccyVNo ƧA,\?,]1k|cWwCUѩk:iq|1z,OM7l߹ SDn]Ьi>r L.G9z -_l]_B`Y V,E<2"""""""\+Qtt ϛ77W|(X1Kv/F.,ױqXg ys&&Ǣ%,Qvm׸aDDDb_-ђ͛᳏G4j(,kOLJ[mn-;oFC ¾`U;zT.QɥjYB#XaxUuZ]<}z^jm޴Ic.ݵGN""""""""*HE28+iά1d@ (;w㳏GXYFi|}} Im iW#}##gQ EDDDDDDDTЊR]&4 .^Z-& 5y[Z5zZDFF!"2L)Vc [ށd޻[=dYFUqeY!!|hG`@ޖ>.Gffڦ7r^&IȾ}5x ǚnW۷ = {=u-}ڶiHL5NB/m [%ˠ( d:m0&}^L[+dy] EG(A8CqTt)ٿkP"@Z_^ɒ= ÇeuݫG7ͪ-i׶ f8NDtUR+.C !2ԕ6[mDDDDDDDDQ K L&䐻zvkڻ""""""")`Gd@ިV """"""""HeKU8r:ww5x  kоټ(k&I &8㈈lspR242Q偭`Of8吧*j\HK9Wߐm377[=r/E}jv"oo*8jBd20q(#N* EfWBP 9嗒]%Q0#8,FHIDjfP,iℷ`.os.虴RK """""YS} G1116J%dYjBGZ Er.58Drr2-yFI[5c:㨠S-""""""""ʹਠ2\$Z)))BeDaDDDDDDDDdGi,"%%%C^.Rg"e+WdYH$FPv\""""""""B(b%m% *>( MdُMx֤@&C9zU@.HVH AQ-/ G㱉mk(,q佷 "M|r !XQVUuM&8潷sRєoBS>[Fl4f3+D6OV7UM!tBIUSJIcZU. !i:J۶ϟ᧪l\ZUUy/`f)Oyu\>.74IpD6M&ͪwwwV=|VSJ9˲f"νoTι,˘R}kUU*cjOT;wQ餉t*Ȫo߾%U^zTޯJ{ѾOt)NUs. X,{áDɣwudR^Befs.oA\DDbӯq.s1>=3fD$:c_*H)˲D$H\m>|OݢxMϽvx;w{{뫪 ]ו"R}_j}-"s.473WSUB~u9K)gRR・($HUǢϟm4h4+}8퓷DD>~oooݟMYeQ{Thdf.0T%_ݱp9?N$-b,D~F8yz(VU6 DDDU9j!YQGh$ptSնշ?}$vwwu]Gbu]|4:냡{/^Pnz`00zmffEQXc^`4vuuujv˾qɣ_i|ѥ\]~$)%Ϛ!r G!oX,k].4F] {#Q^m[u倴EEQ|w\.UDd8|>gD#ޱɣzڶ""]9 D/PTUe""ڶզi\FًÑxt˥YN͛7$f`T׵4Mc6N\FKɣj޿/"";isqqa""Tmk4Dv㑈|>w""js9(yq~Z۶&"rI\?M䀴/%>>Bff&1;wAyHH@4L(*JV-L|9&""""""""WQTn*dXyyyV+FQ s ¡2G=l k%h4133SEQTEeXF(VE(*$+Cnz2Q$Z-L&YQY$h4*FIKKs!{ Arrr I)FQQQQJRAaw#""""""" bdYeY=<<\Ae! @0 1VGE{5kLT*h0DADQj-T*V$j]tDDDDDDDDT?hR$"ZVA$IiРb^G㨀NEL&@PE$:UV阢(,"LGTQ ,@N-jZ0ֆp"Y *D"""""""; mu͛`0!&.@8(N-,F$IeY$v4(dgg yyytk׮^rss$نI ʲEME >~c<7eREWUGDDtǪQ=ӧMؑC0d@_lL&>ezvDtlCN8ڵjC]xwCom`ǟ!rwE`k/cUq8ew`4qJSVM|>qYYKE||-fğ=gXX;Hr)W:]gP4m+նDDtijS&`P>U:4g45jըѰ^]:}&:Y+T*U$IJ%Ȓ$)JFF///WnZ^^-Ƃ j<vPJHf@!jGDDt6j5} Lf3rs _"_Pf 7msӫ*Uo0Pdr9gU+r\֖*~BPVM`%Vqw)^^xPzpe[W^܏?ENNnEA,˂ 2l6L;4SEEWQ s j!=ޥh`6Qz?<`[QEK`QQYRc9ܪrF'}.`{U8 P|z5x^!Mc y;,[X6a >R[{[J*Wpd2QwwwۜGFUH&@2C!%IDDT!XÏS4kޅ?n+Ңuh2yZې:w䱣'aPv-/ Pf Qg0ﳯ'njDzz nܰF ]뎫^[q)@vxz&}1pE2-;ًaϷbhrx{{aҘhԠǕ8mo|]{zUdO :kSb; dzS'a"Uh TĤ1Шa}SӰrDŞ=>ol=xԡDQsPl٬)ƌՃq9*[U=>]B`@32]Nzt{}{>o/O%U1u_*I%Կ/tWk؂#Oƍn?mok6m0 zQԬ $kuO<[dߧ'`PQiioTh M1?څ+w),z1>]th戊9]b39*$|J%YH@u\DDDVp3|/-Ic]{B[6ǫӟqv輽1lP?iݰhɏY?]8f$~^ɗS "v=_zOEc_;a6^AKL;/]I1tcpjq6A8w"vł♩s'b/1vP̘6dYbm' Y:ulZ!0qHԪY{зWw<7m2f5R~͋su~g<ӧMƾGxn<399608w?^Z Eqv\DB9v#phgpGѿo/loI8b0{5ر]8Ǝ;SmSƍWu^Ҩ5{LУCXf\JNI8~*o'jT狖5 s&cמXz45ԯ OzOm''?bѨ~= Zw\5A@H󦈍K(3eys#̌Djãt}y¯ۅGO=a;TtN8$IT*dY wrY7_ l4ZrDDDVp];p< 8|7l}{ck/#.,>{۶i7n`Oc͆͸O `ڍ8c$!'7ԴҮM+ԩ] o.%]\JJsem뾃G춋9 _<>hMfmitޘ|ۧo~ժapG_c^xgkhP.]qѡdaQſLtb?Q@l\<>h.Z=PXo(̙ۙs٧G7 y7XL8ЯOc+l 8ZAzj NFz*4pv*~P>ԯOeEA5zt}{8 NF!;;yyyX,vM?fBgߓCũvOT*lCVvN""{IcGdt,\Uz'Ǝ6a!?ӱ}?_-Px֢rvbAmۖKjHEQY-}%)AALfEGDDT5׵3q(|C^EAXJ21@dԯ[zcQh5=.%ݼkpѶl]EG{}xkAVAE$\qPmk_+WvmMݵNEض-X[עâ\QѶsrrp#=~m;`̹lܰrsޤGG67kj't^3Qv-lڶݮ#p&OB `pX`CXMgO:Vq"91#Bh,|eSRX{%$:,[{2`@ڵ,sQ'6W$uP>"" d{WF AQy !p@8+WYW7^y>?<^zhZxx[_}"^|fZ<<ܡպh4VpʥQA#A]$|FHD('V+e]㲳wーQ1n0jlCldYF;aZuZ5gd+s#=îF@HXn#S`CGef~ϙmQdؕ1egl ן|hh48,W5}*bU]9_jLddfAx{"/dkW2WϿOB$9~ WBVvSIFAaedd<=zAv[<;FCP;o!RӜv bP0U? x˵98k(JATOqTѫ,Y*(j-AdlbDNMDDU|ko5 ==r5 A^PgI=kJ5==+Vb~ձ}[,[+v9ٴZ_NoHA 2U^hl( ve̹"ەU)ZrnG=ԹLȀ]j Z77[r{og.?}/1ؾB_x9?Nkyb>:EAnnN秐Q18Oi1#bAN's ېe|t29䈈讖w?3_}׵iw?RĴШ0jz]o`+[p24!`g9 4ziJk0g׭b㨢|X5@P$k-A2BV,n'u-C[=xȶcHM,k мicl2*Z=}{'׭X(PVQkKVuXK yujSnٲ% +ӬI# U8lyʕ\۟SQ:g_SP-A1%&b)h٢)=f[Ҳp$.1: +znK{bR "ڷņ-7ѡ-.&%zY$ 4um1bߡhִ5_ιˈh;ۿbA e>nOK܏`o^|}VB#d 3RK!ǛA2~_)t"څۖ O]90cϔ;frUAsE2Q>Ov^{կ  i.:e?ٮ{?;xw0 yy @dF;]qsWNaxGĕbqeƎnlF\Y g!@C!V+ޏtEt yHzթm19Xؾcwc(}=?'q-5]M5l*TIw\iEI-ęۙsivt F [!~Zfffa[AExPfu4m \X<5e%(l 5Ez?f222]:157'm>%*=۶AH@Ph'cp#=Ճq_{O^/OS''аA=nY֞[%>n_{}%C# Ğtvc D'wmwVi&. *,Au3<k'P e k? r^|v yy{^[8 Mii8~2 Y9q?z*?SƏƼ ;;w -Ŕ {sk]ԡ唫e:0 ꏳ/b "+e*Xa6V?Qߴ}zv+qZIwU3Ϸ325:>K|8zSrZ<9i\m}&]OGGg0Lr{9p(|}|0f0<9y<ϝǒWⅧ47rtޔB_ 50apXb=enhڤoo/lؼ G@m0f0x{yFz޽n;ޓGOD?`c}@N fæ2DDtwӧV>0NEƉSo.*]xkNƩӷuuѾKH!&&F^ի'\vMA-˲MeJ(Ne:*Y YH4S 7{,W!""""""r;[ՐzbDԮ]n(Z󭀀Ԫ]*UTt4^zu`DRr2v.^B5C8nuCmxujׂK;.8 o!-[8|l#osk":@ IDAT~&B֏y|$,-Y~"""""""uGYO ?)LJ|{;~mZc3OV]9 x Xn\ <C `= lt㊕qJsFD!YY~`MFeEQ0sV$_cFV{.l, ԫ[ PZ0CT*,s6s~^#DDDDDDDUAeC *;i{0rP'$!88uAlFff&VcG„qc;h4bh^tFAoj^^KаA}<1y" 88ŶقV/ގJ;~`P/< vXs匢G:'Oᓏ?@֭Xۗr+VgRfx6e=ށ>nkntG/Lճ-9'б};[h>>>hѢ9nYpsf8p NE`mغO|;h* Qѱ0am;EtĊ"##ժ=a!v5kր^j[GtlMs澏G{DVavCnط Vƶ| B":Kn:v|||ШaCgpDDDDDDDw=EQ.%vGM4)qrdddb}v- <5eݲJl-_qժٕjqsڵja_0sV$j5r??YGďLܸޏ [/rW`7]`Mw\pT:BC0abEnZjc8r'?w/ As??gdح3M0 v":v@DC׋բoKvt:Ԩ^oD1ׯn 4GDDDDDDt/v6EɗݑKQ\x|={BV:֨a2ה"7oBeL{yy{řxڵm5h4irJ ϞCƍXsc萒""""""E. EUQ#a]x:d p ?~":ܒ~ͷףGn]&rrr׎H<{/L[ƎozmZCt) ѱ1g[uM[ϞF?P^]<|u֩ OO wc`Ѐ~Ч⧟VA>lފhDt\NI]أ]r*}6 ^9 F CF D&OW~|{.&OJ,C`6ѝq/~,ŢoGNn.7e1lnێ?6mAjZ*<=Pn̞5?5kcͺ pjQ^]L :&|L<>r8Ncނx?`sFDjo50wl|9+kW_{F5j{Ǘ_/BffЯoL?RUA9X ]iiѡyӦ:dP6_{w/EjZBZ/NZ}O*,ۑBLL녬,QF^T999,OOOlv.(:EQ֭߰UVli<+X͗h԰AU7Чޭ pC,Ysi4SnnYEl2 ܹsNSP%22R)ZXZ{òѦu{:4"""""""ap?*##|9223Ν:'fXMx@DDDDDDtDDDDDDDDtgbpDDDDDDDDD18"""""""""C !GDDDDDDDD#""""""""r9bpDDDDDDDDD18"""""""""C !uUl@!TU3iIIɨ[NU7b ( CNzPDg܋A;TٯDDDDTUۛ^ =݃RӮEP9L|jUuSPPVnC}k0Uծ( CT`@If-k?ݧʂ#O#""k?݇IC !GDDDDDDDDOijqf$%%d2M7c} 0 w;}&,ܶ,"|ѶM ݵoݨYZ4of[g4m_S]oz= z!|SSo[{p_Pj!OkoĦ-[Xo@l]-㊕և`'&O})nwl6cͺ {N$%_$I1d@ԬQ㶵e˶?O}۲KIIؼO$$&"'':-[4G=Ph* C opWnUx嵙|kfۏnwtpx,DF 1t k59v ))W!Qz0$I¥dl'0erճc.k۶XphҸqGw! ;'Ƕ㊟Q^=<@ۺڷ* OO{KIسo?vً~M7-j5|UT\^^^}m&Ϣw6t04j5_nǾ﫺đPfM~HOOǡ#G񂅘U2E߯^8N""""Ѯ/=Mۧ$I–ZfqFh԰mxd`P ֶ/iެ/F``ڷ m[ٖ#:v@ hxHL<U݌J['$bG#,4ĶĘGb݆{L&f܍t,]BCZ'Boa:r [wSY?ˣc:,$"""{W`@j>XUT刺 Fo[a[?w f+~FRR2j֨ Ơzp0V G'}]Vow$X,<2h bOƪ"5:6iIAmvͺ 8}j<=ѲEs :^^xclL<řxlNijg1v]}z|FVdp.33 10[,hܨF :k5lڲ6ihŧhʬ%~čh*ځ̬,4ncGB`<=W": ;;G$Ih6 /OBjMoAv$/2j[o5ҫa3O!,4vlނ̌L4hPnjFPPT=}+V3qq5n:7fϜ>}j*4 o7^L[ġvZxѼP<Xn֬ۀ+W"0 C!Jl`-[ѧWOШF!m>}|8w: r*|t:oO?t:mMDݐ]E`OnɗS0B>s5kO>ڗd0=r]R о:AJa!]fקb8IмYS>,gSe1.9β5:udC>t]Xֹ """{=9vq%lڲ镮OQ,~ :kC|Xt9T*&f͚bO+pkvٷ0z<ҭ+m~_F1z\JJ/Fz:z瞞aC!U,bm[*D䬙<꯿wDŒ_@s_*!"Ν;t[6iԴ4 Iɗa0X@F mx=zy (~XZᶗ&;;i+WѢy3t̙:q)) \qcFgBtL,"Cx}+j0v['|"<Х3h^fؼu[mOhBDDYQ_&M?,F.T1sƓӦŋx~u²%`_Gwѱf6=g.233ngYQv-Y5=":v)0q8x{yy 33effyq-5c)#;; >=wfXÊךҜ>} j0m$ <Oď~~\ѽqԫ#t֮߈7HׇQFrק( m[퍏?ØGڴn8qnBb7}jA@HHLwMj׮ 얛6m{-\Z5o~ݱC{<Ѓveԩ~z))C-Xhܬi=ʶ|T.OڰA@f[_[T*mgGgSeY翲 &Okzp_'4Μ:S#_}PFooodfe9ݖF @V!!,:vhDld=wa!HLLDڵzȲ'&MFz:\8Alƀ!};;E8,HvڷCؼe+":Gpp 55K^x ]&>Ҳ233b;z&:Lh4bh^۔ [o2www 'OarVa8\x ׷'NTg7_L7{(ѣF{79 oCGG3ҝ{@vmZaV8z8=Sul$I+/5 ٌSDGX+222QZ ~lV8\hƶOoSSQqJ\xY/Gml6< >!}8NS2y-5- 7ns琑 Y!I];3gҲݰ////4.%م% *,*:.;`r8֔$`KI(-[4J%Rr2u.pGGjתڵjzBO{1U(pww-5BVl6ۭ*Vs1--,ڷC^=@s_+t׬ÉЮm8>?tK&SM 00,N* m ]Q{͚BuáCGm z9~x}+S%ƹ^( DL&;,4olނ7n؆:kxgzk^^^hҸmaa 7Z5kyޜ=^k¾!Uh@ 4t """;=9׮[( RR»Ч~~HMM+PSd4aCĩSlQ]:#lٶ-7sjTWHJNY5lXo ler >sJ]|*'P?ӕ6i\'حOHDVvvSz۹˗SаA}N9W`)رݤ+++ ~_ jl=tmKpmӖ?ѸQC5j@uǖm0(X,Lf:VaaPՈOHDu/|7<<pKϖF+CGS{@]NI͛EWdeTtݰ8}.xyy^:HH<[kԨn ]}.wG8uq#": ((ARr2Fa+׶MܵmZ#(0{ǹV򤣷Cͱy6>z [L\k iׯcuء})Hw} IDATSQ<IIIػ dIsH_cn}8q$~]ò* 3gEb5,Zݻ=l7 `xqNEzF9ԴՅ6nڌC~Xf7d}zGOУ{7"## g*4چ]I>ٌ3qӫˎ6d|%Z;ii8y* c ?? """";Q`߁g>HO"ɩSо/}z@FFzdYFѷw/l߱ [of0|`Z?,uƴ'&9] h: *61+|UCM1p@? `3OUVbqxP 3>F cjZ|SX,t>4SuZ/<7b? ٻ(煉 zBI)ҥHSQQ X!HBBH%KBs3wsԁUm^^S~XFWTXQu%|ZV$կ[G 5k|%%&JJҩmJ)99YNNA*zujIfg.%Ks*Ulڞ}rE74Ç ф&[ϗ䨧6Q6jK=w~X~XFUq9MV^ hæJIIQUzU=4TXAfh *_\xW>8ü[T|u}6~Ԡ~]{zwZ*׵'WWW-70W+V-k_;.WWW;lVF+Vҵx2Jǧp:|lml5+~|HRҥ5tZ3od4*P>P7ƙAn2j(Á C VvvvֱV)))vFht[YY9ߕ,࣏UdIu)[˅o!ove}]tY/Uܣn3o/Otr* {;{V|n"!%%E'NPܵk9]Ŋg{ +rMptQxgNW@hhΜ=' ww<9]qrNdw +H׮=<==tUI+p(੸LȊ~\H2h4t%@(5-p\UhݘsktPQBbvlhq?)f̙y{{Oj)q]*ZO+fz>,<\ҜSS8ۯ^?KIUZՇޣǎ+AEEEJ..RUo9y؎;?/rH rڍu+]|YmdqxxOZ]:MӋ^O 4X ؏>ԹiJNJkv8yʕQ``vcq={kػ5hڶ/}0cN횒)f(!1A?Z?֢y3MeL2Mϵnc'k'N>h}w.*UR*WѨp;U*=2&8"ye=I|zqw<7 ]F ںlGHոQC-\Tqqqrtt4{n-*[ I>52'msVZ~}zK=SW;vЎfTlIR:Աk[ _O}-O9[jzm4IѽZ+++5m89IR`@YºapL1Wj٣\-.(689{J#ޑ`P5u"Ϛc v[ +gguN3Stt\]]umoXl;H Eo P£Th5_4qUVHNJJM9mI+{j:zlllT^0ḙsrr[uoP+Q Icic-XD*S~#.+-Y&__%svjfKC諉u!۫A:zsЫʛ>8gBZBCCҥKj{^#IRM$OrVT[o>,]G=ݲbccnF%$z-~}_ ұcɓ :pPII*T:^۶1üxr%$&Az{țʓ![V ZnպU *XஶVʕL$5kDgV-."!1Q;wրoִ>ߗ6N+--hnߪL?hB#IQC 1Qbbv['O*>>^nQ1ߝtE^>Ufut*Y_ :,Q=ڽGaG~թ]Knn7FEEi&WլYM>>{A'8w{#?T*5|j ^:rrr ԱC;2k R a)82hͫV-gڽWTrŻzQq5IWo8xHx|xD {GŋsU3f3!V4eMrՏ9jO"~)R%Kh-f-[%',R7uK(>>^=T666*[}N}TRD:|XmmYf[V3;w^M4a>x͚nvr`:Lc^}ʔ.?]ki7ŗ_eme%[;:~oZhNk5ZrY(d nBӦ|$IҴ5k|uIU*WÇͤrrrs7BáG`98833[~zsB4fmgW'kϿWW߯X 6gnçԮmnSϨE$tiI?gsJJJRt$-'Ѩ3!!*7@ժV֏?jUhT\]\~&EĨmgvPZx #!_YLF}#"UJ%(8~[^=oj1O]~]֫s :pP%KгVrJgۺ *F J/]Rllh4j*Y_t߰Y]:u\nlfl;fotWjX]/o+) L? FHH7jh}03U(zuFj:-YC (gvenZf`%kk뛯41lZbb:XK~k:w7EL6jX_Mn4_={X -QͲ\Vn Wo vkzQ'*11Q۴7־zVK.>c<UZ5Ə etWU[c,ԪYCZJutd4խkgӸ@UTI ~=5ܪ]vmۮ.;޷mc4ջ狦nD=_%Kk!]IF>s[MR ~Ϝ L<=<4ٽT>0P[H tQ=ݲ? IvM'#]7G(%%%3yeE׮US=^-[ w%aCԱk߸I-7ӑǶښWe߯PRR&4wbo߰cIBB]W|fGGGkђe޵zMR;)8>3YV*T^mh 4}wWǟԻ狦-jХK4w"(%%E#}}w[o+4,LwUKD^QRR fdkg_~ajISPA zsܾCсCUByuMwI  o㻥Wjq#8ZZ$zcի[GoبHTnr&_OWjC?_EEGk}حa *)"2ҬŽ;H?'OOlxf)\TKJL-XDgϝW\3bWuDZ4{WL[lScݩ(5i˸={f Ԩ^Uǎ$׾A1{> |2f&O*K뼕OaS#I.*^vi*W4p*U.ʕ+.+3+WԀ~}}ud(yT$}=a0^_~/O? 9tj֨fvZ*rqv^gbbOT?4j$9j>Jw'/֩{$_kKLLvӤuL#w\qJII$]tY1\ǎuU*ZN$U(gu:|D666zͳ:vtPFQū}r̹_ۅ_{>jl[hFΝ׹s1FŊiǶࡌǶ]z*fwsuuU2uرL9d;jݦ:w+Wiț_JLLT ͖Y._UTTb^jټ}+Rki>3NqJLLT[>5'̖/g6L`anǠ̷ρTv-WjT'I*]v٫ISizunC.wmZ=)!1Q͛51^vߏQrvrW!}yXDD׮U,/֟mw#ǎ)11QO5ilfmm&,d`ozsЫIl4zݳ[I@޼y]qceZ͛5M%Kke*_\5W?]njy}3i#}~ɗ/ڷmOTdkc]jMDŽ/()4J뫰p /ꗵp2͜=O~/I6[$ҥJfzٲ^N :m~@DG^JoVŊUR%v*]~[*UB f[EEE+z]*66N?,].WW=ۺzv_Nd,ݦELskd IDAT0$GD#jYY></Uf8ѝ  0=R'$hzgRKx2nnnqu5;"""e4vWn7F+3*AӺJHH /]o:r>B{UԖyZXڟ3O<=0@7m3O[dccc6˭SN4UN칤$8(WVt@!g)0|}7KQQu4hǭIMFQWƚ;cm9LH~O666xR󆅇bCnBWccrՏ3uUϫ5Ul2l|l+WR/d6=[rh˫_3guuUaCT%L˸r쵳UBp>+V7w{DJ=_vcglIʏڒ>R,^&+}0c3JeJRTj<-s)+++y{2:N6CZu->^3g3[h4F+u/^L*ύcȊ3y__nq CtfdIҠW_QJrD?_%%% *]Esddœ̸`0(2]+?VU%nsapYXDDYk;v7KӴq#}5q"""iUV',i'V秊ɓG%k_bڷ?HB``sʕ-ݩ/c|?OZA^MR`RO ڷmmrh6lܬ۫Zh&WS2ɉ$/Vlg]wtŸCB ƒK ,pғb:LTz5դ4et3 }F"#Z>`xK_ k;[/"""M:w;ҥZzM:] {֭2,8MKw=L;/qc?RRRvݧIS魷Ӛey]YvcV@=өSͦ9-R6KeMa²I-?]SN`0vIS陧[W۶%777իS[Rſ;{"[-ZDp^..j:rrN/'3{6=>{N<2KmfnS 01ղrzw0;|XM&mP;ۥG|ۭ&GuhΞ=%˾\bbؚde̵˦|.\asϛyI:{OTN/WϤ۪T#1z ,<ҥYc-vvvrqvVZ=<=mvt%%%eNNNjҸԫg/^\|g|T?9yIHLͩcӟеk7w蘘 1zv"EtF`akza}n9u7*V,/[[[>rDEeK_&W];Kf!3vTdIjfݹ+:kj= O[QvvvZ̜U7l2[QZly1}bivvw߫p(kvtL(JJJR|yM,{;;3Ywבr=kZ髬K5j٢ltࠪThje訆i ze ۓfjլJ+?PUX1cVͷS訲eKILYTΈF+Mq;vgggUP^/R)>sŦnnԫgwY[[k*P3øG׷SSյkmشa)+JѨG#GjUN-Sw// *:&F3fUҥMݸߊVZrttL==_ԈFkRuu1-^L۶y`ݬ<=<ӭ4o"E^ U()9Y:n0r _ZO x;[jZgۛ |;FiFrrtKk*p#ȫP!P߯Av*]$|@M<5Gő:0jh ::ujQgBBoPԯ-3J-X/ /̺=qwwӨ1^=dmmY`V8IN*[w~9WnsڴyAԨa}u~ݯINя?jҨ^YIn;)*:ZNW@>bXN..ڵ{N>7_K3U],^5kTfv[|zfT]tYUVhgwN<_~O5Oa]*0\\ʶ%I}zԀW_}O5Ѷ?Ҟ,gߪ_^u+[FںmJ*ޙn뉓-Yퟝ{PVF T"~rppP\\<$d.󕷷~m*V w|JHLTXX V i >)??_pQe5Uu*]ueRqVlٺM!!gսkgӴV#6i$IWN횦G_ dUMJ 5nڪTjTcejתu7E2iݼ ѨZhVIruqUɒ%d4UliZZ%&&yCիV1d [\]ԡ}[$'˨(Sh֜y P2WMwiKnF3VywժElP<"QRRF%)*sԡP5O5e }粷S55p@?XE|^ZO=wʔ.I|ykԻÇj}F˧];?𻁽1h ,~/&{{{ U`Ї￧/T`A}4jdom޴q#NթU3K-,T ?Ӽ_h4P]-`0l2~$'GG(rk|`9'MnfMc.+[f\5KqqJ*߿XZ?Rzt*ggUaՏa9t)u ?Xק㾐J*71F)ߩs^ѫQc2SbE4y4EG#~=t wKߗdggU?ѕ+Q)v5uUXAW&NVBB {{U@OM+}5qF|U^ ~5>X>0P+o o;S;+ZDOWw3f\2=}J/TZ|}R*Znz76777yϯ(,4L..^^r֓mgɛ^Urr^4X԰~=.Yj6_rR<|OZ#guI񔜜[ltV~6 +U,?)І奏>|ާqE^v?g/FWc*/5Uf҇FjujSk^]vMȯ Z hTӁ'{{{yzzƾ+ڵj诿զ-[]M7ԏk~R=|| Ufڹk6mC?IQJI11bL;2p p̨Q 0bbb ŋ7ZYZ:::&&&Irr2.FmkV?nsjլqOe|d@3tjsOJaa7'8.]֋j,bEfzukW5Aw _MT:pag~?tU'm7~BŸ9]{3[[e%4ڶ/UMW4|Yhܳm C`IIIokkhee䔒ltqq1zzzFGLHN:odikמ=R)c; :p@䔱kp;oxKky4a@[(}77~Μ Quͺhji7Wk1Z^we= Y]{ǎdڼyk3SSԽ]lKWZU}rc{!\K_op:L)X~9Y){`ouVLUeqA1a`efo{Æt G`Y E t;ZAcEQwx>xhrMpDc1\U^CCU<2 9]xl8:ˡ*P3<6.^,<Y^I&8/|2 `Udžq?ǏtUdžg:?@Vd{%'- ُ! {˗/ +++*Y"<&8{NWkEp`,"8EG"#XDp`, *">I/䜮 ggmr<'ip5}C[He s*^Wd'V _'s#XDp`,"8EG"#XDp`,"8EG"#XDp`,"8EG"#XDp`,"8EG"#XDp`,"8EG"#XDp`,"8EG"#XDp`,"8EG"#XDp`,"8EG"#XDp`MNWqq}3%r`jNW%\/r]`,"8EG"#XDp`,"8EG"#XDp`,"8EG>S5p_<.=9ߜ}G[d{ثG>sX ܱ kSL80ː8!9DrKx.2@=$nw"CZ~as羗x%ʩ Kl_ʼz{[q`UuM>H!I}ۖUZ'.ާE$Y *?+/Y }4z!8|*RNKրcy}8ysP2h̫5"MHC[\+O`ѯTQ_!++W֡H-YpdmmPJw%_KΎ0Tn^Oݷ<G/~eoYY62Z j`Ms԰X)!Q Wyy:K˒zq12#͛U -Z|"l~%^ny,.{!4NAt|<9nNGN_ф{jU%IrB+IR!>Gk<1Oqfѵ$:PA<*S,QӚ>jZ4o:r~b B*ApwnmuոD5F %;kIRbRrTѥkJHLVrQKy<'h+)%QzinK]6c@Gl17},҆*%ŨUgyWeKMyպ~Q!Qy>K:oz}K+:6!p[8yyI~ IDATm4vP"#XGd{םgyy2qukO/re:.qy|~nD,EswW'ɗCcOiU*Smp$Ivur pb{NW{|8=!8EuW'OYyuI)Q/DW`>G.Jd~S7hIRR5kͻ9GT2^^SO[pQt.[gj)19E/]4#l?rQۏ\Gk^BeԩNC#I Irѵ^Op|\u:"eB6{VS`_:]}޾9o@*Y=~燈zNڪ u}eukH@trhG"m-$rV]Ӣ#9j[3}4cϩoj=`_˩0{hv9:[VHQפx~w1!ؗVvr(d-g6N?a_Z ?쪃v]/ yoAUC+1:g{:ab$T t播La^xc]VJG|i|jucBQ\7R%s+qzdQ ~MÉjW7]P?DDDDDDD;V5mEF=uspTg9/w«kB"!Kk5Vwؼaxgqeb\33b"JvO&ߛuA@7 %mGZ>xM?a ˰tJDh Ώ- сX6oE=YxXV+AuS fEY}8s 䈙v`E%6G}\*ӳ`4"kҐ_Uވ jQWZdU_a&Bg0]9p^1+jG&FR|/nui %""""">Q! J&ǻU^0OK^ψ-58[8Wr박J-kz)eR>1t ꛰95u~*ª'PTL7<6m$rMr|?Y5ptb~Ln1Ĭހ@|F>jZµ ّDi}#<>v0DݦɞH=]X:Zt:L' 7[ؘ ހQ6gaȭwOdq%Z5QpAem̖`?ħ`)`?Ȗzs~lLmu8_OFec3p%b^3s'FD 1j|'e5P$28w رف*Ss意nim\q:=$.zhh}5[M3rAsEDDDDDDW~`0?i8j[q 4ZSqm؍QA>x(m7RpՑgC7@bangWh~)8:_8#qoH 8ʤO@]K+ 8|С>[3g{1Q >ۛ;Z ^ڟ8oh2ZzdWjZ]rsWAi]#ڟ^S/^O ^3 <)Ш}SV,D@7g爈~e`0CMO hfT5 mZZX},2,āx걦0S?g"NZlH4 `X(x2S01)cpǙGCp7Zf3g}s J r5g{> Y32?Tw|7pmK=5?|mt 4]JVsv<NU sƙ楡UN1PH%p;)dH"aDVހؓUSLw5V*Q e!~., /l*""""""Y*8 ps,q3" r)0H)-##L wO$C"abyjhp/pkjjpSQbΫkA+@5Z\zӵOkZyX(@yC3z=#|=l[۴L0mȖzc~lL1l0ȫw eW#(_wܽ7|{0Nyn,AN!)eըkio8""""""nJ0h|Tll$D#j?O ހ=YEf} Fa8^Xf~bA<]35kN:VN¦)+:mom~.MwәϴACN6銜Zq ,!*eRuF.p-Fޙ9epo7dW# 6 ᢔ`~m=wB$==1Q؛Uw8[UO`/{Mm"|1&85 i8_MəxsS1a,Gq8NDr, =Ą!> o}I6  o٨jjAuS yԴ˞Mwc [ǖϴ]ʪDNVYR#-lqLOGC q 464̊2; ݜSY(ZOGWGC źt톲&ԵjBdrjAؓUvCV?gG<>c4 =|=` AHD";a f,V:MYnn#lzd9c?r OQS,֕iPR׈n;VBbtJޏO+TC1-<v͏-m[2?~09l NV}hh`NTS ž$T5`d]qUdw"z qxC' DRQ9>sͭtsG7oTѡXi,'9Ɯ9{}㈈`Xe˖ ByyP__/"L&nll RjZH$RFhtݰqӆ)h\`S:mPƌ~և/X6Vbttp T Po0HRMSSV$iU*A=== FZm4FEE-[f<~UlbpDDDDDDDDDV18"""""""""U}68Ո. )yDDDDDDDD}Q %Q!qOv\ .L=㈈.#""""""""OoU J!ӷn?z^u.X8O}|2*Q7>Gk{=>]Wiu'^P{t{=e|{0<4:|-O2 O-WQTo75Sc}M'WOYǏOAo~wM`.[ÃRѽ]9yW.V8킾 L,ƗOMJ+ V<D֙a<]\q QU hh"b_.; +1^]Qu=ypur2 k qsGd .IYU6!~jpg,^3I1>xX7?炙4xhtv*~>n x8{n老#+~τyLŚ44k/j,"""""6"R0g?(ǰ0w>Ueu Ҫjc4a`EgnH(o⧝و u80) Ke\I$ߞNJԪCrv]I1>0N\Q.G̟zv!DY%GNcѤ,.8n[&ɃVgܱVN*×OOkSq"J.)3[F-|X<%swۿq \79Ȣקּ SxpQ$`|7v-œؗRfQWcGO"%3FahE^ޓ4dQ)‰Pߞ590k ĽͶt5@ۖe^.r0-sǵծ0舘J, Xz]eWjؓYqQ^/AF Ħ}0n9׵mÔ؛R oG5?`?5^g$44kt$UjSJ. 1`|~fm^kܜfD[bv0]\ןDza-D _G??g?q 0wխj]͡t5}}) 5͈ @񝟒M+z,54kq뢰795qWbH _l~7׫_ *Yc|H#"""""ЯmGoeF(\:>u0jW&QdQʛо#NX0N*2pV0a78#jup65פQ <8ʬ}WculYTܒQDaڙ3zlxCEQEڜGf4u&FMCQPֈYn5Ll*ǿW17*5)pTH0e/bV<7̧1"ôH)>Q7ܜ^onգn ׽]hQYjWR]ߊFUgn:=ɥ9rꚴmaph ˪W 5,C\R8 ZKMC74,_j:h4bB>jxO)x;|OxXaċ_7e Q T;b7Uf譇@7Vǰemǖy.l«ø(/~{i(G,_|/ AnypT9_toBC k&""""_Ga|7:{0`H3nyeg‰m>)}M+b v;2 kX CV j3bp q=L߫p *m:`?J}!n8Qa lo~@#^kiMc?ȱ;8hxXSs ?εu6w!l~c/c"R<{{Wc"p*M䤒I%<5#-qZ0ATֵYG )\=vU?'@zODDDDDD*8[ IDAT-U#L׮jvdPhuAb4C3@o0":ICFx$qz2# g[{vn m3nj;ս F$gW[<}ihVV2qsu.oWY3, [E~:Z9쵸AL診a-δ|ۙvR:H<˿AV͟X++ԪhNo4;UT`7HgC0wMZH%"C#-tjl|AWJ^/nAbb_lz)9putsI)HO3rڲp;][Ά "B8{FBo0hZ1_gnns̡-lgG)hlr۔by`ˁTյo |eED bhۙq%/8e,[rw^3{JI؟ZeX{&^ECp*[d^E #ǰ/w`B\;پG}/:S ,LJ?@RVd6[)8YFT[9%2YLPG^uRJO-MCLmj4؝TI%0((k$WZw>q8x uhnau|N՘;>:2 t)9\݂ xC?ViX'wE7`"<'O R;sP۠RO)u_-A,ףFARomO*lƛUa>dYS7\&QpՈ)>`H Pq=nWۅl{t+h|%LD$ WG op̫gЬqxtq`5FyO vZ%cdO Ʒ[3E% +~Du}+X41*CxIH8 xшn–yvS;Sjs:"\0|&7V^I_2#TD[yȱdQ`M|.F#Vroe0`|""""""1l2!55U(//념\$č" U*RV+ D*Ѩ66np1-т ܻn؅B?啯ऒ;mG[Ҁs(ɨobz {٦SpS[?Jsx%oe;%-HDDDDD\=}ƚ /ZzE*j"HR Fi6j1**ʸl2- j-3ð#4;# xqt8\R4P 1U[HɩcRhӾ|D04""""""V5Nx`aj|;\& w^,UֶЬ osIJ+ť+Z)ŃFvݐ%G%[bz+k=FDDDDD U Ȫ>jDDDDDDDDϞqt)GDDDDDDDz"""""""#!q`8cUs!z""""""" C2lu`1N=㈈.#""""""""EO2 \eu>}8ó{"""""""oj,p+-G0 huzv43ct@Ni VLEj~Z C0gd&ߍgoChsR*0cxV9b8E¥i"""""""ﶪ)$v\8V9f 3PZ/Z%cS0{D(>((4c;V~y-2}3 cH&v<$"""""""2GU=2сU6E)}vPl72 "oM-;  ıRL {#"""""""N.8R:H7t\&AF XPV^OvQApv T7t]~  mg hH7mrq5>RLAEmc9HͧWxw@DDDDDDDti+;q!=a+""""""""p쮴jupR:[4:$bEDDDDDDDD+-G06|9zMMc Z;Bil1=C.w ȂX0ޯ$! d_ -/Huu~WbO-2}(˷N:o_n9dNkO/gKDDDDDDDDqDDDDDDDDDV18"""""""""U *GDDDDDDDDdU !z"""""""+j.7.zUKz"""""""+igU z"""""""#@bߪ#P5N @0K """"""EM!uos308"""""""""]ݍYOYO:eYO>|p-]۴?}n,[uy7 .kwŠgcLMP)=\Uٸ/Y}n,[]iQOӇcw'9@.EgO钨"""""""jਇTԶ׶%SYmLٕ f?; X-;O*,GU|G*t "R ΀yn1+ǪtQ4 +#5uZ)xr 8gb"_>1yP:HHidÒvIrB3C9r]5yK-o忎ė[PRՄ W?$;6^X&a_jRT7Ucl78!?|ӱa_[ g_o 5v')hn]'oPZ݌>VEG!1k@\79%uvcXŖmg6Yl* BHHP^^.dF`*JVD"hTF 7mhaW-<`ECDDDDDDD$[=dn!u/^^MX P-B`h"J5MMMZHUTF4dggje\lŖ"qDDDDDDDDDV18"""""""""GoN' :B*|6[r}$&8z.G𾈈pYg#>Q? =TɥgN|K """"""Obn4.Z aXQe}ĥ. )ln/vȁCפ'@9.G]Gp Ge`K_9 H|츮=+Z=㈈.#""""""""EG:OGe Ȫ+j=e|9KTH3jG4Z=m^Q ߐX0#9 SP?'DF9ZgG`δAfc> _w>NdCbm0n@"""""""" QXR fGE R߾w n/ω(2S?kYyU߷ᬖcHq\=96E%6EDDDDDDD#3 m'сp"RuGb*ȵM3A]L2QO`ptw??B0$rIcͯ' ej  e0718:G+]: k7ijA0m\k |1l۝{nCx;1V|UMVۻ*#+&сhnbl|"yZl}>;y=5FﴽH´<r) #*-W )R~oFgG麥U䴲 |c8:of"5E-Ǒ(.HAHEG maQl/6g`L# \"""""""" 4Fs~j>&]XDDDDDDDD=gU Ȫ~U`0ͣwT"D]Mp{v DDDDDDDDWnU#""""""""H<|2ZQ&d_=S%vnUsf`~ %,u+∈z#""""""""YbǶf”hM?WEe%?Vj{zfzJKFВ-r?o?AqI)<=pݵ q_n =2^_fz`Ԉnsؼamy5B]۷rEk‚ys.x~~߶k~XѣbێowB$pڍ'~t헟"bHCDDDDD>Kf3j]Fӊ{vj5N櫯W@P޻ T?oKw|nv[mǛ}wv3ƎǓ ֱkcꔉu'nlٺ _Xt =#Gnd/W;z6EEx\T-DDDDDtyS)̮QYYgΰ7lByy9~Z-\ce/`cOc_]FC1jDr{wcPX~q8|4;vۥ [-2.\__j4] u>뷭 cF۷(~\5})4chNFqI G"-=Nj5n\|vmO^FAA!>s`тy6׳p\< ؾ3F@rJ*9W^zή̓;R8#-=}g9\]\L~f ?FꉓoSHUwtTE_6 H%лHEIo QHE:RBޛCzB#d&(!;;wܻIׯ3p0]}f,] 70F@dwܺ}VDDDAə3'A̜=woS[aa =X>9a#Gs^^jT5kd 0lֲT^k*oFXX8߮@RRv/ĘQùq&S"11A߷N ̚;.3~gM;ݫ;gUtL_aC1|hAMĈQcYk,k߮5-5eO?3~$] {ߛҾ [=lmm:c6}үc0ns4}%򑐐e+K#""""">lptI: m##TX'}ʩSg>k^n6s}#_}T6s| ,1h^W_III @LL w舽=ծɇQ$%%a0{{NA4_r>s۶e+viqʖ+ڱNZ/4jHR/\cv\666ɓ;[;\\MZ[#X0{>>x{yѫO_э\r͚u0Qf 8ID[6t +UVfuefe ̜=,8zaԯYs\-jVFR%zٶzt/?=ufxw֜k3{^kޔ_jlqL;4%~>oɪs_wkڱV)\]]X嗚PJeڵiE^} 6z7WW\]H97yr?qc'N2ӱԮU/O/z.vjU*[}X@Zj˥WL7 g3mڼooei;шhޞÆb0\.\`7k,G~V3x̑gKQ8aնC׃OfM׃Ls:Ֆ8~ Z%$&xrl[ILH ]sty8G SVtkOu'[lV˚ (W+ɕ+'.\$\9tT;/wxzz0c< (Gz[`يU\ObcH6IJJh4Bggg %qqN ,1Xxqx5gϝ'**54+O>8} E B#**1gW\xeJ[}QEM_{yP#k>sJiP>;;;N>c qf] {CC<ݻl۾7mllprrtRfۖ*Q-[h :c:uhg6(:&Df[ M{SbfNH Q?'1LBֹ#2|1ez)fMy'Kށpv2)>>77NYNziT֜//OVxD$.^fԓ W'E͞wϑe̘5FG`@YFܹr)82l$;烾}pvvf|4M#CR$@L'w0vZ^aaaVٚc];x dITT49ҽ9QQ)9xTdc6G6${(ɞb666Ρ5n޺E}\'tN<{_~#4,,KJZy}*99q5HCBx@UrvrΎ:Pn)es4!$$ҥK-m4tJ6 ,mq0[n}7W7}䄣#]EF^?c;v\rFMJRfUE3^aVy\Ck=v&...$&&g F#wȘB3,ֵr&pl%_^_J,iWvw\t)s 8uy}MSbcoy}}6tP n@`\x2K;jAlll~^x gggC#8q9YbEa;wpb<ǚ}Ys\3NJU| _7O quqן"9wldӳfjԮYiFƙMy?cOp̚c GGGvo3~dtХ$&&&/@Cٳw?W~EKy/d9L_ .^d\|iF3eILLƍܸq;wHJJނZ0 ,X.rU(SeKb짟-lݶ_Ӭ{v*WHHh(mDBB:5Z쏇; >rc'NfYgnQ6M /?OǗf2ANhN>CBBM06\YΜ @`@Y91t_0/$><ӹc{9Xj59}-j:K5t"-Z![lbЈiF4nX?+aoxy30b6Ě:ְX/k+U~ BLL hƀRޞ7k:Sd'$//ծ˽dɓ?ә>k.e˔毲s,;̞P!ժлWO}zO/2аpjT{O+W ԟsb EVky%..,[uÝu7d) p8NN4o2ijÚsAv0JXx8 bŒ΃\|6ou6+{tЎݺXoɕ+'ۛKd ٺqic0 MјLJ{v+ʇ0gW3+GCҧo}x)=yd6m6KSEDDDDbs#F؜8q&((Ν;6  2888FGG흜lh4Fu7;zeG;_|\y&-_kΛo<}[mg谏9w[ӧ4}666a666w8{{D윜p'ŋFWWWt#Fӷ̍8[{*W@ټua4i(KugDDDDDDD䟡Hq\w)^3~nH5ugDDDDDDD䟡Hx{y1cݝdo=seF#Eӹ[,Q8 +z ,GXooШA}H\n_-Zo?/NsLrC=QWسw۶&K㉈7zU*WҶ""""""OSuhߖus.UݷPV 6 ?yظ8܁X͜MjӠ~]޽˺ rJ{QLl,Y>f'cxڼվ-aaa|b S2*66PtG(_G///|}v.]EKhۺYVK/yꒊreFNIqttt8&}1We*/Ζ͑E_%w\rа0rIuyf%nܸɤ/p <=iM #>jjf QQQTXfM_!̛=B p-ZȇCcn9J9,6 ܸyo//Z4kJ毚a;+~:3oՕӳ{\]]Vm?~7}☷`!#""B ЭK'*V(oپc4jX\9>%+̘5SOt\9}hjSSu6|W`ccX"t\'L"(8"EPp(<<'tWO^8veC>dKr'%KIc.f̚-QRE~?vO?^i3о-{ 11xrZ֜re9sى&eiAj:^^GDj :i_N͕S>g2?eJޱ˴o_<صgisټe];u _={{Qx3x`9:r5cbLu{>ܸyb֙Ξ;ϝ;Q|LG٭+^ }};svvv9>l2cO`,֯V2{`,j[)#4¿p! O(_טg<k>""""""6OupĞ}W>4,HfΞG÷6шQ̝5 Xnނ$%%V~L0WWWʕ-Cvٶ}'/4n@LL G %'%>!hS=)S1l`~:i3gPTIƌz .=W(3Sg4]#WWf?_>J(FZl=O]Tl~c֭[W^~822WҶu+j2JJdzpSpd>g8l^\`[0lO?‘3yxƪU*s ._ɠw7ѽK'hJ+ЮCL3@TT4^΀~QLоժҾSWvǫT'(`.ZBwRʼyе;9{R%K??GzuxvMN>%3 }Ϧ|j2y&9r-ڼ> ȗ,GXf-=wKF}}\JeSϜ _ySY,A:x.):Վ>@Pp0>;::=r4޲|*t'd˖-NN ժfz<|NEDDDDDm/MLS0&޽hܰԴnߑ0_ lݾ5kwTP IDAT=t+V0]QDqΞ;gХ;!fmΚ3Ysծ)d9~$NDxڄGpb>6>L7mf?pMbcc1$%%3gΞ%| E1=NHH򕫴mY5kT(g$&&f6XJe._IDD$ٳgz;˹| w0SB?i)GVĎ{8IIIyy[[[jת3mىܹr1ml^oќ Fܸy^̉ %99$Oz 0F~~)#V 66}XU!0VyRω59JjULQzO!]]M+l2 3aȑ#öB0g)2r.6+O |qqqjW\<_6Z66Щk{ǔȈHiRSdHh(fuض ǎbނL )]oa8CrG.ʙGGF@BBY[iC4V[mS zYM/22/OL xxse2,Y!ΎZ5kлWL)wzu端Y|f"/;ujg%NNRF=}dIhHiYZܹsZ9yjX~:3͚i\ aLtш`gh7o +eJ˞EjR%͟˖|y} L7R'յh|GB1 \q#c۹kC֭LegΜ5g2lAΜ).<=;"Eɗ7I^e( gTDDDDD*Oƾ">>zu~*æxN<¦+W1THw{[lB` 'NeuKZrsfegϝ'999Ҋ%(H ^*^??]*(8sϛ;88P?L2΋_888X8\\B?dV>%L; Bn޺E||B>˗"qQm- |`oޜ۷#6.05tenܼiuؽg={+WLGl@~: /YBɨh:L2G8;;S0C>U/\Μ;N΋M3s!oX|%K'[l+Vggg^.:pMƎ]V9{/͠z*<|m;vMqLﯾghق;wһ~%^\|xy3jT9 ;)V`k0-:9v8U*Wˋ?_g=$e!^>HUM6'''-Hϥ%~~~v* iz 6C>͈sRxqӂߙ5S28üծuu޽KrrYYw͕WEbE0n4yr,n5vDm f̩@i_Nfނ̞3<= ,|\{ -km`qvrttÛo$$$ ݻTXw'cƛ0Lb ƌÝ6oqNvzUYvѳGWFÏm[ͷk dst/?>ѫ{WfΚ (_aCvE~IJJbwkqpp`#Xd)km 8$77W-j 3zvJd?j֨F7`o3=>www<=Yl!!P!0n]RNaC>s64oI\9iݪ%l{ˊ>b˖m  NN-^zL'S&Ƭ:cw/>ڵM0fHϚôIJJTɒL8.VPAg&2^^>gu,S$[mRߟOnjңV/?]:u`Xp%cڗbҧc1{.GWJ]1ǚϩȿͽfFas ;w.\&((`mHNNwrrOLLt gj4=֭߰XKvymkJ._oeV'W<}< n޺Evb(k5}666a666w8{{D윜p'ŋFWWWt#FӷT8f 'aa&eWڻݺu6ol888,^V-_d؇=c~`lmm)]$>s)]|iyZ͚DZ)8ze^mxzz0acϪܹrc'  """""""""E DDDDDDDD"G""""""""b#HXHDDDDDDDD,Rp$"""""""")8E DDDDDDDD"G""""""""b#HXHDDDDDDDD,{Wrr2.\ &6IwEDDgg' *1ϪN>C\\ܓˋc+8L]x|IwEDD۷p"Ey]gɗϗ>O+ 6xzz>}*fLE(4yCLL̓bc=|||'..S#DDDDDDDFFkG""""""""b#HSDDDDDDDF#{/F<3=kDFkCLb۶sLrce}#{3c1ln-w"""Os9~$ \]]͓*+b0<:{<{KtWDD:LAC->Ws|4tcƲ54jPOVﱱq,\2K=48Zl, ye 9"wCdϞ1 ySR2gC'թ]ׯPDqr6oXWTPsf""~vP0nTZ=""09O1+FΘŚKqvv~3~$iP..'44ŋѯ!""Z;̦CEEE+w >3}l~W)]wpB:/Ҝ{v&Me׬e銕^4'Osx2=v٫g>BQ?1oBvGDD [NTP޺"9|( -Q?}ɥK3~"˗,T+tދP>0m|}ǼfDDDR`uhvV63E3[ls_/C^↍ j|f-*Ym=[i߉A>`;~g'g7kʛonjۚ<,1|2fM^h-h2FC¸pcP&N2K~\h .k (W3g1k|2L9^=//+VaǣY+|8x  LRΕ%|0Ϛ̈́qc־DD-7Ϝۛ`hd턄QB \x[Ѣ ::8eN||<;hKf?qEK/r7.[ח`[DGG#ȶ(ZğҥKqmśoFl3%"KTTYYlQn~ؼ?y=T\Y{s9=r8|dƌ/&ʌ)ӳ{ ߴ̉}Ɵ;2M[(OjUprrPh42ҫ{7Xb%Yӳ<%h42)ޕ   iۺ q;(Υ.]L6Î]pΚ_,[9bU8g_i!|4388Pf ض}'-_knfӖʙrmRpd4:l$._]]{̜_|l߱ХSΝ(9B|BAC?"443fO: 矍֖Ͽplf̦w :0pϑ&/4r[sQ*K?NMV{9rз@+J>PZU țZ+iۺ)խR,\ uH@t܁ ϿF.-_c̸| zrr2cOUOdU5غ};vÃB([/W7y_|DDFr<_6Tsbɲŕի׃xB)F߿0yrxr:E9K dy'6}={h:eghhG?t퓜puIv^Sm<>ƆB RFu^kiK(XVm;zZzvse4ԡ=U*W2;Χc?R K~#GgǪU*s ._ɠ`c0`0v1)s/d5Z*ԫ-[yE3޽˶;y/}PF1GFF#~#Gg҄q+[Hy\qW0>s2KѢYSS_j֨fv,)K)?{fe o//|ЗVmbێ4nT:Wyj׬Oxr^h궬f42k\wBtGMeZ>N+Ul:5Mᴵ%/A;~DխcN*};GǴ }EpOͱc[t9o"""{Z4kK/@`@98t(]G\\ׯ {l(_߸ydJ-e+ 2Et FbEnE{78::Dtto{w/&MgV@ʴڵksS={@jU]3Fi{QY??fMg҄q8:8t6)<} 9}|L++Y'@``QB>)4JUJ%Ξ=ozܪkli׃d3܉…4n ӟM^h+W9s6eDϿFDDԷ9)4JUrEΝK9F~8s,$''ghgLUL/͕… rYz_rܼu,0нkf͙{<4J(Ga0̆Mtus5gooOBB"tY.(89iӮ`k%!ƆA>G>TTԩӬ[f|g`7OnSsnɉX? xlڲŊyVʑzQִ^DD$a4y|BclԠ>1|X+/ڷy$׭BCCӕdfZkڶ6<޵ CC#'GpN?b ax{^)ӻ^ޏd""",X'''S.quuF 3M]իdϞ:2~M̤&66^DD"\Y<=ٹ{{ OdGCL?MbjTۋRCdn888 1Vqss#$4,]]]ɝ+cGN2Zv/ }&/4boTߚ6MUsuu!WxD6S;͚L/̎]kEF"d֗sf!.Y2x,m{aCʢrtڙ/M= ,orUeʔΎ???Wo_~:k=ED-5J+&&X_Ν(pwa/G`W+WZGGG<9sS =WkgF4Kc͡C)[#>ܸyӬcOX  ᷃2}['d87.].../̖nHLLd̸ 888&fpmȟ?ٿ|y37o~qڵLN.v-SY\\.^P\x?ҥ˔(^̬ޞݻ\9sn䑕|`g;=M#smV̚3 a]x>,,@X֓_ѷ@j+""mko w\(GlوS44 IDATŊ_<^*1j ڴ¿paC8},~ժR>0C>U/\Μ;N|7̝Vx:GstȐ3tH^h{8IT(ujb˶B ˰XFZժV!0??{Eqlޅ{ `yE EtAQA"t)jBHG`eI%~srܽgf>{g(o* &>>888б}[>:J,+ϩtgD]&Eʲo(/9ۛұC[XKrOѣǘ:cիUe ~߰{XwXѧW{=$۶ߏď+V- mu;ǎ0|d֯Z}s&MǢ/O<1k|۟Dȗ|J.FDNbWVB&X~Z3j8\̸ p2(Jyz5;5n"cvߒCXd)WLDD+V^jRdqV^ê_`6ɛ'7}jJ$|)Sڣn+X=b`4j؀ ""%;=moiѷWYzG%{vЎk|W2DW 8`7)b7:999-d6gjZݭVVK ev*""ػojƍf h[L0 +#l߱… 9M (cX‫&)!>>l4ͮ$KHHo-]5000EYꉙq$P\Y*h$""""""8ʉOt'A#˴ָ 8u*:k-zxmŚ{Ǒܛ*L2E}rNzbe 3v8yxYBr5HDDDDDD1KG""""""""*DDDDDDDlgj"""&섅#f"""0\dv9;g#,<?NE`Ȱ1U84=U)c<.. ֮e;>s,%Kk׮%-$وȽrj+W2!eѽرs3…0Jɓ'7/\u7QoĞT\C|J~\s˫4-;x0K.#_!|kӒZ5kX;cbT<_iq7  U BgڭV+-Zqgҩ#gϞcDbb"ʗRbMo'''8QcxD ժV`Ӗ|>}&͚6ᙧ O7ؽ'J+Յ9)U6m+ԯ[(y|}xݞ899d8Ef?SϢk7yWw1z.LyC;bbc9}mi+Ο'ph^|9uLBBG{,""""""z GQ.1er ~"~~~&GGGd2ڶnIvmͧ]Ƣ/ G6g7^ʕ5 G_-^JygwVLTd~_.;M3g͡]Rv }vf3/7=E ׫ü_-ܰq3SEX$&&1i(W ۽oo\#5l$?UaTZwww\`2l`Zժ5<QB E  <ܾpT|9LuڟV%Kqr4\r%KmcNL$))IHH h]zukgxR t{KEm1RΕ|֩ʹٱsujbyV7DʕlE#J(`͛ɝo7؍x,/<׈re|+"""""""~$ :7;}inZxOO>|Sv.TqAAjc>Z Qzկ[rU6lL…(X swwʔ.EmR{k^UZjUǎ6s63fa@H|'[8*S4 >ƫil6`֖Ȯ] "(hݫolDY*U(Vh[N->6-[d?yWP[}MJgA=z_c<‘'m[d֜yS|9@P<Ĉa1L-S~XARbe\vV8h۪%cO\2oU/˼AV+lM^ ~B^TPsm{ -[Ɔ~?^mޔDFEg^V:k;jl9rÎ]TZ?__Μ=ˆM ŋ<@?㊕8gFiY[0iӡ.4|4m¦PխMDd$ga܄I*Y`љqYMbbbMqud#Ov}}|d-X9󉋏LJ S*ƍe|DGGשU3g//<۷y 48pn1)Rntrrr3Z,l6;Fj[V?\ J"zUVq4MDDDDDDqw4+O9ޥs4ϙ//7ij0 CbLxh4Z-!!!Vwwwt@i$""""""""O4DDDDDDDD$U*HT8Tp$""""""""RHDDDDDDDDR‘J#IcfM|}ԨQm۶eZi ޴SF ڵmƍyW2www:uDw{?'!!!̝7ETѧhNDDDDDDD$sdѕ+WXbnJXXf$ )׌F#jbǎw5՟^`䶧kspp o޼Ν;ǂ ؿ?$%%șgb*TV4lKn:H޼ymE#|d,]87dwnw`o|Rd,[8X,lڴw{k9j(˥Kb`N> 6X>>>r8E{Lt >>ȽȲc'%%a6wT7زewAɒ%jW^¹s:Vɒ% =ŋmm;vYpd2([,}DDD0n8[fFe,gǎ 2ӲUˇc@@| ^ʉ'햼W͚5_ ?Ǝ#<<Əޠ4߀۷vޝfۮ]DDDDDDD䉗e Gɉ֭Z.ҼyT׵ 4SN1j( *Pswwgȑ޽&/5a萡-vZFƎ @Vy/^jOWgŊbjfMՊȽR{~qܹ:/>>)ʕ '6 *8rjEcuV7;w4YzƑp^XΜtDDDDҔf< F#]vի|U7NJDDD$}hڵL{ HDDDt ۵kW._̋SH||}2;5;}VZ.]:Ͻ20GIII8q>hڼ:KNNDDD&}NCDDDh4DBBNbСDGGӮiKDDDDcc'00pCxx!&&PHCxx!..hXL...&8FWnZWrEz**Kj:vVbdv"""!5:r1"Ǐ [l̙={nޚ629Ky/Z͙0.;yΌ}-M_n`0D \5L fhvuu$$$$[BBBVkҥ[e#WSd&mc@bb"aaaL2Ν;۠\gR("""ȓՊ#L&b֬YF^{52;Uy©p$"""n-\26kXHJJƌCÆ r ٳg̴EDD ‘HQ$2888`4I8991}t8СCmHwMDD G""""FF`md2رc&Mbԩȑ''',Kf.ȸhȽSHDDD$(9::b4m&%%b$W}#[e+.0x`?1 * 'DDDD2XBp@qww`0`49tI+G/"ͨ6hmVߍV]KzH:u*Ǐǂuo`O)U}=t.nF} QQDDDrUf3fŢ""H3DDDD2XBȝ;77I@b˗"Y&f"""$G D͕+WHJJ d`^XSHDDD$9;;䄓&Gx-3~\y/""66ۛ oHDDL#Lpchdr.XVmDE\\ Vf%DDDD2/p шɄőjU~;gl۾9dte0h4}%<=<8r4g|]n*YظX~YE_.&))7kJU(Y8nn0wIѯN횴n#.>}̙p[///ԁU*Ι3gu݃ec208999Ҭ#%"""$5btpv4y_nO9KdTT&eoΛڱ 9$&ǏٙDztwx9:ck ;>+Ud8s,#?˂_R\YƎtAx:_-YQc8|?x='!!LRRm[I8yD )D-Xb%_/]?E4omvT^ݝ{u 7WWZl,#66.1VŨ_N}׫ň>3ظX p;e˔O?c5l߱b4W6>"""PHDDD$ yWE֯] |˜y R,U߯~~y5;uϗA{3n|޻,Q3g2qg9r63P IDAT@:Ŀ'=w~Knta[[\\;wUr}ZV4ظi3ڵBl4H,GGؽr=&&o3n<*T ~%Jp~X?c"""DDDD͍|2|h ef]|x N&]tOw)X?W>dm:t")) 葁.T//s4W1=9 @-ҩ#/7=AԩSvBCY8~]gZȟӭ֬]Ggjfm=^t؞rqΝ?ϞnBO~:jPD a5r/2f^Fqv.' G""""YHLL W1͜p<^’7C6L2gȜ9s93R<zT(_gرsyu nqqd"[l\v w77bccX,m1G}x ?Gn]8x 4dFܙHLLd)nn͓?yTislG؉OڊFN%ڱkmgPb"#lEv˾/v__ff0n[J2Ka>z cɨ6oø 7`+~3ɳ9=wDDDaq$""";6cS999遷Zawhիw9~@.v\1\/677EdϞ=L{ѭKg O?$sgNnZ~#U*WN횼'y6߻3gu}?mj:فɉ;ryƈڊ#WΜΝ eJJŋV+n#hNGS|9Zh={vL& wd9ޥs4ϙ/E^>&M C`X,qUɔo6fWWWKBBB%$$n.]]HDDDDDDDDR‘J#I G""""""""*DDDD@ukb899ev*r<==Xv5ժVΔ7k؏Ge_ʕ*fJ""qT8tyF߻3; <VŨ_Nf#""@#,btl߆bHLL$qLNBh@?hӞ([… 2o >p {6ɓRٙov^Zxzzrߓ̞;wiղ/<~~q48c'|¥KRY<3N]Ƿ8s}dP x,Ϗ;vګCL9O WΜ,rcOѳ ([ qqq||_/]fXquuoQZ5݈Ď]͗?m1o܈}zӥ[O>x]}BdBO᝞ݨW611|~u}睞Vthךc6'z43gӌzWEDѧ‘HSJeƌ_aI$$$Pl|}ǟ,{9?ט ڻ1R+ F pB|x gϞA5ɩP6Ovm3o!ǎNȖ}ƍ7].U$݋qGҡSWmzuϧd1TTˬ^]ǺYoQbf̞ŋLRs#GYf- )]a2hh ;wmw/4_֬]V ǎ}9&QFu =}Ns˝+C>b/2s<(Vww7[yn""xSHDDD$M>Cm3ܰc_ʕ-CN)UFcʿJ>W_iJ X,mf99hf3NN{7繝9{ACӦHbb"[ϧ4p$"""DG']`/7Y7TV |z1n 8hX,%LV\? ?6[:ry򯄄 y9\\p9'e8pȾ~7#"+76cf"ExWU$E߼yص˗" sQ~uԶ;S.ٽ-r<$b4ɛ7/89qttj銗^w>8o[oDDDnЌ#,f=1F˚_U4^[xQCV^õk:Ͷm=˾x \]](^I$/I\|<&6.R@~f̞k3fpmwڴ"44b@ddC1$%%\ m}Cb۳;vr 4lPO>blʤm'Nb#>>fך70Э[8gf,~myn{9ʖ)]q1"yPnVf>(F9ɝ;e˔Օ9x""up$"""{Lؿ/ f=u<רҩqje@ڵiMM%::#|r:DK{'3g2n$MF#MD{3w4bbb1S=y_FNLlt7nȈa¼Xz=źhYEbbǎÏ7+y#{x9ksժV_pΆX2]fg0h4}%<=<8r4g|]s6'=yW*XoE%pttBX8?,_ʟK8Ϗ?s;h/cMÃ{%sY&N#G+gN|1'-S8_VIKr4%[xi}!'hؠĐmm͛7spttulDwBTԥt7r/2f^Fquq}q OrL&vLR`~[+k2| tDRR^i3>j +U`}|2j>>|>""4hu&yLbc9{.T9r9?_ϚM||[5Kߍ˗f|mC\XB^mތPx~?m'_ԥK)YRR%nò%8;;ɔmowNLl,&lٲq5܈K;&&?_Xnɱb}ѱDDQHDDDT"L&6޴(=wٙWy~\ؾ-Kш#yMwqqpݻ?{OPJĿ'mE#6dǮ# Mn;bxUt)J+ݶ@tt4!X4 G+gѭJ(NXxhɅwlR?B_Km;Mw1ŗ@L@nق0jx7/g+IKDD<DDDD>3+n-DEEa0pssMpĸ1|r!,k4NNt`Z?p@{| qn.˳bbbS999|}|R-yzzPpmj׬aȕ+i<<{JRb;ukߗfq ߗ 6Qz5ʖ)25<*d1kNҥwoeμ̞;//OBOaĨ1l۾1=uqBK:?sIDAT. *K.IVoKLL,=w>g̓N>:ƍ2b`0o"V^f(z;?Lf I,+ !~Z). (Xw%  Z`V[[m_EYH$D&̽a >̉ss?s8Ǽ\ ++#=]e7kOrf+ۼYF]yp]=J95%k5}Ƌ:~ =R>_EKi֧.]T)3假t|řT__/qRV5sur~iJ6lؠyV~q/<[ei3N˾XnUYYYҸLUFj̨l[/УMKgp]>l;Q6n=4_=$VaaUZZjE"{Vii*<zz?$m0Ƅ19w3k5־=1FiiOz9?g8¶^`z!leee)+ ɶqVó)_1bXLLw6 ,ܲyUj~}uuuԶhFFW__y&Ru鼟6lܨ/;`PqQzԹes4G׳PVV;M|ؿ[b\83SSW`P^督.Mo벡赿u]M$鷷ݬ>G֣OL>=tםv#u۵| /qc;Z#{<]sMIi֋R?Z=]43.WB!/K/Ree.|^{ 4s$ Ag?::O5Nz`$'K.V}S1F|說\ >ڝ_1`+#≠7(C4b0uKt)j׮n8P[^S|D˖}8tlciiK$.Ҵ'V$$z!zOͿ%IJSSҥxk+/W>}gB,Ѓ?&Ij>G#.zT}i{zYmL8t Qctu蠃ԗkJ4Uv~=f;QHMs)';[EKÏju~`P#.NPVVVR}pv DNWGgֵW_vi˖-;}v k.!‹ yp5֭{z7uy颡L^9k6+;+K{&}\s$iٲ/˳4Eڰq\u|>~f3jQ4O1/OGqxlUWAJu.hB`",X~zokK.&U+Vk7[4i:kYaJ֮M{x$I뮽ZG*5YeYgb=‹Z~N]~))IyeiwkƋ3x:u!3:{=7,^_nU &*h&1^_ST[W](#=]4S4ozUIRyE$W/ÇsWeeU&ծ]X=Hm+y.]*YNuYR5IZfMҸ5%%:e]:kIƭMѩӾ|Z&i͚V"#@YiS$CzEz_&IZnc:UsIҽMMgɧiKӵnZ嗒g7^ٯO;UVovzo'ӞL_htQM^w/I=8u}\>PyۧN8v'I4~}u$i4SN~ɚ9Zzo%|*I7:uWC_ISOy{-룏&Hrr53륗gKΛ}GC/> ש>3IJj]VVSeU6~U<5*i9gԨ+FH*+toH ™L:>M+V7;wK}uY"LsץmCRCO69( %*w"JY/33ChTuu>Wj\i(##ao#UyE&M?Qѱc^ʱ/\__5J\I=>Iؽ?l~8XRk׭9kƋ3z!z7 rssTX4H$_}[n34[lQnf?/ۼYRÖ 6&>J֮UĻ#uňa |fxjıu%i\ɲ,)iW}uUEE~ݺvQI2ך{L9kΉmoP,S׮]>l4WWc>v[/# *i d~:ig`:sw:+?-۶~}{Hr_N:;=UG죴֔$$(77W,.V4U~'&? ZrejX,Eٯc<AIR4kR lƧBC6~3i} '^4\*,Zj{:O5VkGJKKӱ}I;WOegg'-FQ-^/=MNO/"eQqXh.Յ:~`\S{N˲4n *^Z/zEkİK>Hziժ|yzQzq, v**hU:z^}/eZǺګ!7j*Z|mo/N-n{ッ}GۛVv#%'Ҩ+/׸7hbyzc.8\rAbՉi_yU'wn͍sM.I.թ?:#bV\:>祗g)77WwG/Ï!+iCӟ%IZ|(~lO*Q4eYƶ#Q{ѽ[m Fv98m;dmkhRf8@J;9Ӥ(ƚRkGHEQ 0~|DRe۶,+ѹҲږ\뽒Jlkc,2{5rZ·3'鵒j[RVKٖuN~pG`dff"qqc۶U 0#iI`m $S[[`0k~{ٶm-ض |⹍8@ `Ғ¤|SPPlS="mۤ+O.@²,g,Kog3ƸbeEcX׺[nﯗsM6yp-j5ڥ{Viiz$_4 8fv$eYN,sV#Yٍ!qR AѶ\5_zmu=jk@y^]sњ5kL^^gfϞm;(8?.--Wyd{|mێyV<42X`(5Ee۶IX8yb1϶1&ւHݕG8p=ϳ`0(IDv,4v 8jSw...VǎMEEj/--ͭCU__o{g lV?4(`0h$c3z/a ٳ[5IͲ ƕG| X,fkٍ'q]j3. qg&--ͫB\hͰ4<< v}}Fxmo m|&kjjE倡a>""""""""w ?$7K9K} nE~rL滛0EDDDDDDD8WWs5},(LcX̘םd2ѼYwD&qww 33پs7F-.D(y:әl/nDq6jNDDD*}[aux{yuR/˾K=B|bby-ɓ&ҡm+V]_^{2{Pzw*k4ueK+> zΧ8;;V=Rv-INnnߵm@[p3szzWᇋRM:K1,`rdDDDԪ_ٷ N q6ma箽Engsw5C3dP-XRo.XK*Ӄ&=HhHFFԤ{gTh\M\ /;W/,L#""r9rtpjA|E?'F5 oYbV-S%Kd21aքϩSix{{n}!՘0fޙY/΅ulXrK9 9LDDD.U;rۘQ'~(!ՈOHYse; Onٝ@SRX,k;L6mf`m.ZFwxw4k܈oNj=w?Rp3]:W 38p0?Μ͑cLyITc >mw+i801x@_?+W3ob à}VsXmb7ݝ#ҲE8b|3gc%j;8~"ڿ77]?ȈpϏ3gshlRDDJ@ɤrޔȂHNcxiiSo歼|EdD8M*>ָa1`1./""RoƌϾqqՃテ_z'v@Ǣ?bթōï#33VUnm賯0`[qzԳw7zV\1ӟ1U f 'Dmxy)wc%j SFڃ0as##k-XΣ~ 7W7f̚m;Yq=yyyf F Bx8sI)Ѹa"#ALy=w Lnn Nח&33kG&Kq2)RDDR`2o҈sKiVP?oMyI'];[bw'$~ >fP.UiI;} bf+YTZDDD.dyo?_@\ӿӾ/OOЇy/fo زm;N vڞ3NTkYdJ|ЧY᧘_暹}X >c:o~l],]d ,i_{oژ~uN>6oёAzۢ%JKD,yy6խf FzM?NN|w$%0yܡ-+VMԫS^{dؽw^}Wd/{.EDD.3-Q;nb9 ĘG2"=2yEO*('yGշ/W'i6"m?@$ufM.]x 0,\QGDD"oص;vud`иa}XnM-QBdkUX$%'[K8|4ukbj׭ɤ$vl߱ SҹX,f^}}4FIL&nyX]4-QnQ䤉nzY ?L x >n]9ޕg_5c9LNO\ |}1 w~G4 5-g>#sMlӢyHKKc/I8yܜ\c;+\Pt[ ˰?ΜÂ%a@zz;vҕl)X|}|0LNJI!a3͘2v@?na'eoY=iחLJI=Ea="""ēL4no 2x=-#[X̙ >۶mҷ?d(xr2Q{j9=prgyyr0rA:]۶ͨ?_SR0HOKշ> --X' >yp@)>))xyxsrrźZ5^-I~D\|g~T~_[NoBbɟwwaax?ddd|?c&k``{8k MMZzyϥȥ&!!W|ɏ>؂-ʛ]PёɅ Ve cɓ&/bXJl3;+LOyɰɒMa.$"""ݡ]+-]/DܶU$;w`wt4fuje%Um??GHfMc20 &32j#8(ЦłM[L 'Oiȶq #לˡ#Gж5]iC֘f\0 9p<|U;̱8 Z0k#TFa,Z3xP?׫cND&,[yϥȥ(>1)o˻CO8`da2b&/ߞ?+&}/0׻'apD}zuߏAj)%0`DXhݩhg 8p>һ{Wnv-ZBP@7YHɰkӯs=#33 ) 6-#ټuY?q^î#!$+׬`?x/璙3X_=LDDғC?&| ?Ȉ9&}NJ;kr΅lX xƶͻQȇjӋ.&GL.`r(w"""R\Z5i*! ^8cs^Sܡ}{uxyynf8@6-qwwg56}ԬFv5wAuddf7f?C o֔fͥeDsvKoAÈEé46m4o֔AЯwvᣱB¿}8{[pxqt؞Z:_fϷ~;u* L^=ط7e?Z=mpunth̬ۚ,}ǎ[\E,cֵN_X/Mo*VN{ұmN/9vg;/\TL222+;O~:T WF: =Y>F1{R| ybWk8saPp 8⦃>ʢY0Y-;1p Â٣<͊ytڙ a̝Uv(bGw>?^yEDDDӓ'?FXRՏ=~_?KYӇG4 6T4T. ycAjɄɰ`qp"""֒ˋuam="""49V筻ykS?L K3&Äd_ar09|2)7&="""SiGDFӫ{WZ4ofWFf&۶d?5jY5`بrMҹu+wŢ3;beDDDDDDDD̬ʽJ.%"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""R]c߿Xqȹ̻73[c/>%"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""RUHgM77N徉[9sƾcbm "%%Lmv=|W DmcO<tpv'oǎ/S;֬e%̝Ϧ[_J@DDDDDDJTqۭԨfSg $,,"3lGyx8 w9Wp!BW/u[We Ϧ|~[)Y#B>ZFެYyٵżϛOZ~1?S틈 MNe|;{O?6c6i2ЋeeeW߰III^:L6ڶi}}^OHS̜5d7fkZZ:6 BNNO9s3{|?NP` # a@c777d>r3xmKthߖΝ:pr+!+;%KbˣkNLܬqlظ>X׫˃O=ǭ!Xj5|7CD5{ Th'33t붋3...$xx<<>\\\>{)bZ$;@vNͶaL~y8؛o",,͓O?~DZ~Aއ<>⎭i||?}%(( ppZF`|xxz0?ƏSii9r瞙 'Ç^Gcpp=k | |> <GkbL~yڶḯ;Ɠ˯Av<+ ؟'NNN{FsꔦȕB3'=  wjߟgl7-",s{E٬^[Λ2;'6gM:羹<$kᆛƲe W1v͗_˗_Kjt؁C&RSS>g4q @~``~x{{3CBNw兓^PnVU fXOkY^~uk1c/&  DDDDDDDty{SuZppݸi3۶&||||hڴ {ϙ\ζ1 ߚ)ԱC;ZyۯUH׫Ǯ{*,Ɣc^QYh 민LdE 77޽zqL>gRRRK<mCC`޽{;&|vlOuxqk ߗ6DDDDDDDTi԰9r.IJJ*`+mf3Gb?|vjJ*IIfMy^^^ɬB>>^L>;:MiՊVKPPHLmZdydgШa2{46}4lP#Go~F RžwbW3 ?&"9NNN͈aىb(/&MjppO\===ݫ'ۢvk """"""rd>nec!T dR6mctֵCsnՒ'?èAzg{^ֱ7 _mё/jӻW;ψO^ %==?-':f>p/~i~j>t;yS/XĊZjHڵXn=:vݝZ5kQxG  /3kOHCͿ/\̶(:oGP` GccY?\3]ΙMW0/I 0 V"iР^edbʋә3w> xӤQ#F z}֩C}oHHL$YSy  g` SVM{f2=]e7vM1{O=6%:o[xCWgʋ1Ϙԩ]}GʚH_.\Oz@4[ǎs%""""""r3eۡrToR١\vvMOR^GDDDDDDҀt r3Wp3 dGLK"ǡÇiB (#TyCRRSsǎs%OӻDDDDDDDD.qpHHHHHHTʹf0w2;|jլ0hfIyyxxWv8UҩS``{uj2L\ g2}\KD>ǑYQ\OҴY*;*-!1]{R=8C0 L pDDDD{ffVE!r0 C (0ÒWaH /"""r*SGSDDD,z|i1 *HI*HI*B,#Gf++]yѺeK\޲ZM[˲YO:u@pPb/|FDD~{-&>][ne*4//AXh(ڶfؐ :ksƂE7lPMz_z zf3˖9~"<iս{^ɕ.Jf?Mzz4kڄ}Zx/8x'7B --IO'78EDDDj{got o> O IDATc𡸹rD7n$6>v4r0BBaX8tS~2iӺuҰAJO\j}<)ƍr5eս(899sOޘ,Zo/dK6 B֟xh7U]X˖EK-v'n>|!fBUc3Yq\;h ]tqUX{ſf_ՅCcNf:ē4j؀n˺ٺm xzxЬiF'y[Y~vyx{{sOO9ͯskyUYxxx`ɳMY\sèY?u8,Zl>3L+id6% v/W~ORR2-e:Es(BUKeOf:rssiνwIuFr+}z"%%YbGxྻqww/s~3z]^=*o%K/aWNtW_~M|B}gpdM4ч$,,BOٷ /adge5ӺUKkKW1{={:;#--7aXhۺokQ\\5{;wbФq#Fыz-{gm///;vqV,cXvf9t...kӚ#Rs!""""Ur[b$''_p{a_ѮMknu,yy~%_};ƍ9~"fW4Փ%Kbs,Mn,߷3%qby&x zWucdgg{w*ڴjec| {eùֱdfeq2) &GpPzv՗^՗^ 2"ɏ? ;99B=jlݶy)/>+}043 <-۸ 6sMHH^:r(N"[D_}zOr9}|?}S?FxӦw .|6}?͜E- \չ3f忕Ӂ-Ӵ;0~ \{ /uYi_k9n3<ȃD*>'y8/LÞ=ԨF@uоw>[ނ'oJ_jj*6q ^͡C37ZDDpuTR `Ѐ/vˋ7y:ujshقmQټy }wON ҿ,sy۸[l5j|c =MsvmѽMݚ5kߪԩS:|#Kֻl7nԐ17noٺ ~֫[&_9b~8::N``u?X||m7oZb{/TmcgXn=]:uk_ߪ޳fMкU$ʬ_p]]w3}q\3...\X5m[ݳ[EѮmcؾc'ڷc4_"kԓ??lI)lq6ڷo֔oO']NģXHOJNa 3zݻuZp0/~p\3p rhNNn.,uXTrr \MvuKu* Æō#Gǟ2AQa0p@?(&ٶ}:?뱔UrJ2Kun"g 6YGd?X,LzpuLF yXv];~Z~6[miU,cx>ΙK ۭe~THppP΅T-vOp=wq4۶E7&Vb<4jذmhnzH~@T "錑E͛5YۦzH'mBnn.iiixѺ7:.&q1 }{Um7\?'''[ 7*qdM a%E|L&$ߚ YScbgY,PCB oK 7b۶֤OpwwcK[mI:kL+||qtt)Y#Yx l%)) B^^^j3*09]55foL fٚ.""lO?c{,}&I,5}*@{arY6sx,yy88R\oOZZ6ƲirłL'O{EcgS,cx.̴lTGY΅T-)*88Mٱc鎝|vV6o݊7ǎ&jN,|!Zd589;F4pԱ'l/v)V/ԩ2/Z",W? $Р킸))WٸisbIg$w!0 ذq#͚)͙L6l܌dQÆOشy f?z/aa&F8f<Ų(L:?xyOYT:qvv&j(L&,Sg>ddfO&ELJN=Çσk3)##LyzzҰA}_3}X_m[vBCK,q^{ `Mz-,ݶˇr>W0 bcUT?낱sʑ=egn32g֭ej㪮ٱs,iƥZ9@@zp2)Xddfs.6h`-st,ȆBmӞ5l@zz)߳7Sii4jho\|\@sXյREkִ)qܵZƍha>kl+d2kZ`rr2|քGic(qoGGGԮ3~Ir'.&łl!c6[:cjذNN.fz F}ƒXliڤ11W+>$ۢL5>Rk<==]&{c<,L\#}~+IItЎ`233Yn=Q7XnْCUs/y14kڄnFZE`=2Ѥqcٷo?wWABL>0 Z$-[NZ| 27WW-YɁ{Z;Օjxzzͪ5kёڵkM{jӺ55,OѿՄT#.>I5hӪM}> GGΛO@?ڵ;GK4nԐg_xǏ݃GF jSё<ψaC8ǴϿw%c֬ 3#Xd W^z|(m,^^ԯWۢEfM&-"oj/eNNN4lЀ?ZF0 ~4bЀ̚=II4mN'ٷ{qoCp!~}:u@F qrr"))kR苲N988Oӻ'O2k\ڷk{/Ǹ[nWߠKºHH!/ ׇu6Чw/HI9Ů=iѼ9mZ*ڽ8^pT>y\nn$$&e6n}#v=""""ryջ\kXJ !u-r@>'ˣ} ߏ˖;2iҸ#G c|ԪY w7*u&V^[l^{|}iҨCwwwk3_fa6iP>ʹ!~Ï?%;;ᅦs33gwl{o\6ɑG9~c:Hn66d0NN6BCҩ'9%2U4+/O?㣏a6ެ:Ղm^3pYYټoCn]x%a6y1LS#,A3lu+-o-Z.࿕K5R1~>Ͼ:Wlܴ._;h ~o-BЩc¤&Xnko //s]J}Qשn]͗|976[1jk׶ ,Z͛5e|<<~CfV>4mܘ5k]T)9N{4m҄G߃aHd U˙ ȟ&%,zgttO\<4izY:|jլdyrq ]ŎQ[n嚁sbſ+ -r*'~vᚁ+ÌIOOg+;JӰaLҀt r3Wp^,|( 8w^!yT匌PJQNN&xyDDDDDDDD.6%}ՕiS?0hǎᆴz*;DvdT>%}DDDDDDDD %}DDDDDDDD %}DDDDDDDD2-䜞^QqH@JfVvW %W*@[Uߖ[+;+N ntm[hRr ADDDDDDDD.0@ QwTAJTAeZ'//223+*+)o>j֪I XDDDDDDDDlo6ʔ6JPGDDDDDDDTLFF]Қ>""""""""U>""""""""U>""""""""U>""""""""U>""""""""UP.^{F}))888EXh(ڷ5ahYw6CvMl޲u7Ҹq#ZE 0HLLdo>ڶiu$}DDDDDDDD:&}^:ZְA}ڷkdgWge6qr%ˎ]3$999x{{+?sOnn.7l"f~CԬYZg Ǝ clܴ KNYOIIaſ+OۛQfM{JaVՂص{/1{:a?CV{5,^ktZlAWӹc{Yxi`5fP9EKprtgnэ@mXrjתE`ʲ)vsU._oW6-"G=vk',4ڵj-[٣BիÏ?s2)k7];wvпuZY:۪e 4@XhuaGҰLDDDDDDDreפ/# 8%67mah pws&| ծU}cǏiVmFߤ$}B۴ɓItKժU+6DDDDDDDD.Wv_d́el߱mZEfV_|~a\sRR2 .Azl;~K^^~6g-?d٦R#T֭uWWWЯos:;=_eV8 =gff!z˓]r.sL23qssFX(Na6`6[puquСRJ``0 ;Ǯ#}̛Oԩl߱hҸk",,22?rrsIHHDm Φ[طo?k"qn*uڵeђ,Z&Mȉq F0{%ɮI.:A6nBff&ҫGwtM}23puu%88@hΝ:j:z JG͚5ؿ/7nbptt$88F pEDDDDDDD.Yg^D/ 4)9`;lU]:_DDDDDDDD8\EH2?a H2 0y7Z7v]GDDDDDDDD. JTAJTAJTAJTAJTAJTAeJxx_Q\юaRADcOt]:<=x/} !ȁ$#B!BIG!B!"B!B!D$A!B!B(M[ !B!BS%¼ 쾗%WF(kaƟ;G8I4oՎ~|*Tɚ9{#ۉvƜ9{>z%B!PkmvW-g{گSԮJI=cϵ60qT%4ˏr"IzH<}Qq3z@xx8M&:׼ O A/4ϼ '{H[4lPZVw_<|_t,=O'B!1exb8y4,ؘ&`iaG|(HHviqu^}ڒ'eƬTZ# խ 0>os/+dt=ޟSgunZ<B!d``@>5q=? +[$&&h023rɑbEh:wl=ݓITTujפxF1hbogzK L&-#k;::'Q(Ah/ILc؈~u~?E[o8[-бkw~;p0پq/tE[0b<|H'?,,i3fѬU[5m1}?-B!B|dJKK$ޞz % ?OvRyΌ?c7fҸY+z)wtٗѩkvޛ9~-vc]1[H8::#gVbE)T+`nnWQl޺}{cll @dd$'Ofİ!roAiۺ%7oe(X ?VV|=j'9Ŝy *Qyuٰq3ztPa70X{h4o$CBد/lݾ#Gz2mB!B8q4oaYGѰ`RC r-ug0ɶ׬*]wf2͞Am151aæ-0H )xSRE~?ށPz5+Tin+qu%(8X^޼y,P[pmu*Jʕ-k7>mB!Bd###Λy3;_~cUYӧL5.{ѨiK4iΣGyHwww7@>X[[q?AN>C9wOTt4KR\õQs3g~:nm.^V\xOyI1S@~\ƪqj톆%MyJU?tuhLkYrÆ bؐAX /9Y{<|0aW >>ڵj՗ kz5QQQ$$|S6P(.]J;,?'8y*G4nXqJDxwg~z9=T0R1*UN o&4$H elK !B!>Jz-MJ[isJe :i CTI*1ccemMqvrԄig=oX[ohhHuoۆ?Z$9ɫ/S^6E淃(R08wRΝ6IXX8 4IWʕ  +[ʊf7G)2T*Z}?OQؿ|ӫO~}{룗=100`a=s/DRU8C `DDFл 4S{e߻wiT\]]ѩߪql#nCԬQ]Z՗)iҨV@9u,6ޤT*iSIY hݲ9[6'0(?au8JThxvy`01O.IA |*-o^&OGBBW]g՚u4mc~ =u+5122L^fu:ÇziaaᄇGD hP.~?+6{~W)E PhQy붶Lts.\HIz !B!{Ю_T^__?<}6楤W \4=&O키] ,iGQ$vPinMe˔gũpwsy͛G#۷ )7ORgRՏw)兑4bPUeKӾm+˫FFFܹ{O/nn3qMs ]G 4%R"6_hܨNF yvbggSٽ oёkPrE *)ҫuN Zj}B!BFgWsvG*I… aaaM[ݳ;B!B!9PrN y6?Z]B!B۟>oL>Js߽w]{~ <{# ֡155MZ{ܽ.~*Q\[.00&-կQ3̜ד^"t_MIG4S&4V[~{H@s,M(۞edK[S\xNTU =v'{0YTzeJ:KژDrSxJy(lSO0uj;(i*QWѾݽ dG]CMu[gsY(j3li0еD~2=d5%Ya3ݾ2{(2K[ 0jP~c _o޺MAV}4lʔo)Ͽ0^lˆM[}< jzmԔ)B!'i3@/;tݟ5ѶcWNz7+B!BVܱ=mZR nߙ 0iXٸyݺvfP>zNy<}-[i޴ ffil*h٢6Ȉf7Orlݾ?V-_}y(]$:ӦլQM<|, j s JɖW9qYWJTܭ,Pk4 }"1 FD.ך"P*ub ss3"o0K|tSÆ de:#z /^%2*;wѴI9T\IOJ.]S0Wq%00i(aTt47oݦ~::e|ʗАwKB!BқABAqM._J||<͚4Jnbb"QWLT11zNN ?]~;p;w1q}e-7zukSjǨsUΞb{E ¥,]=W眏eG3wN< $J3dkh^%R[5ܜq2ŌSW&8&駮ikYA2F#>6ϫQ=oȭ_OKuJ_0ΖHu344}u2w"rB!"c}w\|i?Rsfh8Yr޳<}oͤwn4{ש]i3fs|*KLF ~{bX[[Ѧe BHsǰȂ(dkbma3 Gh(U<& Lْ{OrL2iS&~$E6.ϿFIU9qͳwR?E +xs{YYB!B|#GiV ޥKallOl]KK KԾ<==y-c';{z0ϟ#SA>s8w=D&3-F{MRsqU+ YYWiΉG\y!4\]RrE.\3111\23u+EΈfk 1a_y&pU|*Ovhd~I퉈dيU(^,;2l|9QcӰ~],,,x)G>_!B!D) 6oNBb"y{O<~3ƚn]; ļrr1+e_nɏyㆄ_GyJz4\ IDAT /i3غq-==y9CFuj௣k)-gKL)s5;}S1~7̜3 s Tr%>8i|INlB"'^noGLB"?B06zp8_5f|7+ 5wGxZ[RN sCݽ lMM)hd _ PC~nVXs;4w@^*$tvЪesňc޵3B!B!9}B!B!r !B!B@B!B!ȁ̖83SƻtyiԠ~|ѥbμt_zjѦݻvE!B-ZwtdrJgΞGPp0sf~3szp~fy]2a*v}?zĘNv/]G3Smr10,,UvhM7|}q*Y1lQZeH[ّ-Yƍ7QtCCD"蓑?KנϩSgKcǏ7ӥSO)B!D quΐ3y ̓J8ؠJT'[jp8;3#(&-ʦFU0NzU8Nwp34/kmڦz> Rڒy65 RzDEG3rXy)֮#11>zdvD&>).NIfwZ}B!"t>j93y-7g`NfKiVs׏%|G2N: /ܢz^'r lKt- @)G[Z7;0tto+yDFE%9[cvXfEA?\[HHHɑV-3i66miSPkqi?yRIeЯ7JRvǮݩW6/^pQj5kV_~vIڷ}gt|L5JYhU3o"n޺KnMٗ?&]}?gb҄`aj% ؟Vi |K:iټ)?ƶM밲z=߸M[ѮM+J*;wYz-gO7 ?&0(oEK;f{??xоMkY~͒͜td х!4F>'@~k1>.4xX˧VVԮ7y1G=aiaAnggcG9.]ҋG|ܹ:H7nnf^)155&iaFC]&ޥKѺ}gN=G:SKdd$[Kt 剋c?0or(_,!?ܜN366fμF!B!2Fm4o9y}ض}'cFЖsvr_X[[1h@_MBquuygpΟonaθ A[V4kD{,ɓ$5,pOkK|r'[&^gswDQ/g&J#jbӷ2 *:KK@BܜYKdY2Sۛ~}{~ ݻzuœ,]=m[lonr56mن?Qh4 i՛AR>RSR׫+J  )v_^A||)N;8hU{ׄ2drӳLѐx"˒Amn``SYz_J«Dq @SQF5:k-гT*66߫훌Q.v_""O7H'U+(8kk+,^ʅٽ+077gמ}\tE['$4recnfه]B!F]BBCu\ry:V_o],m);g\r]YilxJ:Q L Vv$:ZwDObb"111z#ħ%}ugђ < U-o^&OGBBW]g՚u4m֧XS0x I^a3;Sh4}8C b>QQQ:i f@υB!Hpo܉~J+>LT2i]1 xHzcmY%d6/.x#4 ny3W"+a̲ތ3qcF9&###x}Vi1Eccc|Ns2J1~aZ뽋W snnz/PQMHH:m-R]xY B!Vs4E)ϩ:ǎc``@BL x]>@:;mR c#xMV%pi\ʧg[EE\r0m#G111tw9]J?VPf ͖m;)VrݍgQfffC2l޺MJt2;vNy˯s !vR?܁ʗ+9nn>6tԁwRhv&L1%J}(^ V|ظ8)eڴbz::kK`` +_QB!9;w!11y/32Q!0-,0W@Z56maæ-g݆Mlڲ-ٴ~ޣN&&rq!q&$׃g؈!L=u"vVXiܔzӼ?ʂBӿL t-WacjBKGa`@zӳٽw&MSǍeGngg<|t4jHll3fCRQZU)5 jZgZNUZjŪNګ㍍ڒī +ۮ;Gsi= x.=O1;+,Nl+;QZZ2wt-]δ]VtKfwMd84KGYj+mݻ]d9-һ=!B!ħc4iԀ.:fvWӵEof9< RI#<_lm[h9x P|i#Y~M!B!BvB!B!ȁr>Yš?3gHF >bB!lݸ. }>U+Sxmml>boB!B)G`nfYfwC!B!YG!B!"JHnCەg{/^\tkO!B!r*'$ŧGF!B!B@B!B!ȁ$#B!BIG!B!"$lE>vwr=]:C ,?bkkKmжu:^!BOǬ y6?Z_~cY>{zM[9ǟ<} %ʗo۴eM5 N-v:iuWq?;wSBڹVVVi~/ h6AFDSц5 UK#gp٢8Җ{${e*Xw;o #}S:C3{\ҒfMӷW 3k"}A1{BWJ˪5ƌGútww}`oO53B!BDJs/^o0ԾE&88vӵg_.Wļa՚ux*_kUn5w"EjUr`,--׏~3}4_CVq',S)h*Ql+AlGyTܓl/矅Yu,E{",6NݝA)G[mkYqM7eloVǗWv!_;3}3Gd$&$2x`D':Y''Gj֨'9 |#oz5ƙs9I !Bzt-Y=wcʥ|hܨ>{gm#FFDʟ߃:j1֥6v|ѥ'NOJ\\ƇυI+S_Z pS @Yg{zjgSݙ\FI#TTj~zE=Uo';mRh+ٽgl^;`YTt47lQZZfrEf5}U`J%ffڀ@LL ϣkB!f3@/;tݟ5ѶcWN<{Ov:H ߷W=~̑Aæ-4lԠBT*z* :$[-/_tgblLG 1aTjog3p޻)՘QNC&L6TQN`ᱪpi1q4|=rPM41JGyQs4exk>F3g"}A3swrUVtLLMұ}B!BhؠK>wwF?7n"..5'[fP(p++%׬`k;?ڎ)\6mjzTY!GjT\ !4 GK|9l0LGtt4ٳ@s-rŊlۼ(]M_} \_ h+K#?J:?< /K6sy.^-eԈaT\I/Ŝ>}sfB!BZMж5U*Wdvvbæ-%l}### BPTܸp*UCX4o68ňIHH9sܼuYӧҴI#j׬sHLLd뎝:e׫MVqtv0 (lxOWӴ,MtNRJT"P*ub ss3"><0&ObM6d /cؐ/J;^vh4̞MЦU |_?v'Px !B!5iP(Q39yZFAcF~wJ>TPNzs흦߸vi+++||sU˖}o{YٌW fM)N:((UԮWy]$3|#O"@/ڭܣ?'$$T[ms !B!2α-IoF?yR%&$$^xzzӃ[`ckO={o~q:i666i[VȂ(dV| k켢41FDQ1'J%yjX)DFjHLL,dw99gN'򹻣J~g\֍B!Bs /VSSS},ٺGGV]:wbb" G+ccJzSh4`ooPwXs.Ym/A =\ƫx\7BwoD4[@#.<移vO@j5PK| >$~Mȴ)sGiiɏ6RɧB|*㶍QB!#9ru@GVڥhycu7nԋe՚uX[[Qz1㗻;ũt&&sm|)V6S<`zU>rx,koh󣢣9s<ޥ[*+9g3\1βGHdvv؈~iQxN>JlүJ\xPm?cbbBre2g"}2ӻTH3ZhX^/i3ؿg'w10!B!BIHL=o^vO2ww2k %:h„}n7{:ffuulX[cddD"9z8[j8!;wΎ[jUF5:m͒e+|*իU?~ %]?JE=vœ`Pб]^YvGkYnci:FMHģBbIHO'Tru؈L:~bָZiܬ,(t}imIa;N& {`;ؚRVСG+hղ9vbtڙGOa:o+>qdi4j4ujwB!BNfܿ/...̹ IDAT-|sss_ p۸,,,Xr)%XL`ưh F||<' sssHJ}VA`֚;_}9ҥKs,^J" ֧K@g`%]Jy`岅Ky:4$4VŘt^ooV6JEVs#$Blb|U`N% ~Oxb,WG\֯Jd̞񓧢TZҹS{]$MR.a:KmW콍x)Ջ"FVoO!B=vQ_gWÓݕW$1X1+]sM W4n <@ @~rk!B!@jѧgwf[B2K!Bӫ;}zu^!DƐ>B!B!ٻ(.ÿ]wPX{Xch4^c{oQcI%,1^.F*yx̽w@p-B@B!B!ȁ$#B!BIG!B!"Dαqo>!w3 Ŋ !B!"orCȕ,K sC!#B!BIG!B!"B!B!D$I!B!B(9 }o2srr2Z}m% A1go;x7frv{(_,B['))Vm;`ϖ kuڏ=R<߽!G_[;[["˚3I ~\w>uW&"2 _5pdB!ȮEKqfKpÿgYj12};4n:}CJyF{֪9&LX9t՛͛ҳ{ gˍ\nLbll̔I_k##"Yt9ڷLR "7V}}u߸Q=zLxx8T*n Sv3cb,xhղv_"grv;}-ww7F'Bޞ}MO?{ ,JQxzԩEtv3n8Q#xO=VT,C)`CJakaQet)ΓD666WEs틹RΊdnD>.bmL:ǏNJ;W*LUNg_1[K~v>lbQ66K El\cƎɑI_EhCVJE:G*U}1l[=B! G.>FRR2_OJH={Ny}&/_e?贍{vհv6jpρ]i/O\&.%K;X㺘WޚG.rcZ)ox4o3ó< \3P((QR>115?؉SDGGS;r:yr7(BIb1)e{nݾeub Kd͘gǓ0f]<|U˗PH2[?\0h`?V-֫76;Zfέ@'H?@˗oe;ٵ{/))z;e+Vs'.Kg]P*cOuHKzE%%ksWK3mGp8(;k YiHKͣߣZX): & c#8Wh9w"˕&|ye݆M\zUNvBTe5^?JH=V^C=r8?z,]A*qr Xb=k2sd7k~CBCRDq1S&RF5͜ >:Obxzdl)N??JyxPTI_}}):k44?{N̘:…?q !!v?azL+ >j Q4Eܻw_'OPjem'3M>b\r!In=~By'-XgbgoD4E-Gag͢7hOi"מDeGd6?g_ ʃN;wKsmه($$Dǚk( C(*>ϻwNH1aT|k^|ܺv;&&[ӳ{W>jUĺ h޴ 9_ʕQjZoYÇ jDFDGJ%%KiI{G lmmX|;~Ԩ|·_տ?g6˕z9~m?nE 山؉ڞ*\Ə}'鎫P(P*zrɓh4tڙiC:t iܰ^n(WqG}=O{@-A*Vܜ%Wh>wj>_QW(sU#{E Yɑ֭Zp?1 xV^B 7 7t~ !"h4tЎ6[iϲm;t|*e6lb݆M>bE1y&TR|?ٹ{/!!,"`^dbl̬ӴϐO8~<,>?Z*}gϝԳ"UaѥZ~{$=)jEѰFĖd[( &}lI"xYh8WOIe`<)iCMt_-MHQITN|n"KTbffFll.I鉟EK3aܗ{A d/H{MO}nҧK\Ǘ_ZU6oNtt V$$$yvN9˓OHIMERi_HtSϫN҆xm۱TZK ̋addč̓0._VXp vÇ]~GVIMM=J:u<9zySPF,77WGqpn}b{{žԩPǸ[1TgJɓ'okЇ$$$hHMM%.. soP@mP|;keŋ $"2@zBR[G!9ۋWJ%5kpOE ˺RR-[4̞!#5W@̝KdyhU*Ut>4,R0{~ޯWB݉3ݘ8V4AZ!I)`a 46ϋR&]bOu ( I%s--F!yHHzOF,-ug766Ғ1/~6yr蘴.ٯѤur| /݋"133cמro Z`ogs^TIIܺ}__JJ{qW*(^~/11DFFѴ9z&bTf8Ї‚8RHHH$rI\a5 :H}a,Y4g~FÉ6dΰEP>mHK( _㺯dϥJ- %;;3izT*޺u{:m_W\Y8zZ4L}aSfˇ2xQZ􇟣NР=wՖݸqS7nN>hCMVIJJ,--h4?pExB!rȨ((^NWh>'2e7|3}J}hҖ-oKfY{j֕Qh@AA++u:CU3ݘ88DzsXݻwFk!E%_TzZ+ʔ)7nebbBjj*):rIMLL(ROK'633Haw.x7χp(u_j{T<="))Y/B >8\!"g;u{Z͙(Y"yʕ-ctsi{{g^V~̳> P]2YO }>_D4q)|dAK'*owCɗ':el076qɩ{N ժpkDD<ȱ㘘P|i)r:Id5=we5X;sپcҺ-S&""fϙGK=/zvq 9}/~={-].^ f/Uʃ(nқfTPq_Ob\̉YZ*Sŋܜ7D f͞74 ҆xܻǶUS'ooШY+μ8iq{\o}9{`в$T yѐG'&ݎOI 7<C ;+\MGCq녞=͊PŒ'.x Rڂy|ã&0VBq"'?E3QˣBX{'?SQ*t*;~jݪL2N}nnIvm2/rޕMs''=~͋+M5[܌F ЮMk8Sϫ,[(Q3mƷz,S9Gɒ:Ikk pPʼ̶BSٰi3{OXx8VV(VicUM}g޵3CR89:׫FU4 jK&T*jkۿM*V`w߸Gѐٙ5am6t[΄3zxT*U*Wd!v8 ogNeނ/VVViK3Wݏ1c$,_Iמq-T!0i,_{|#!Fy,a\U9_hp2g|Ҵ*g"hD%agzqxibsgb|7t^oc_TR1n^C!B!>dF$}|mu B!BB!B!D$I!B!BH>B!B!9P2do{voA޸퉓4t$ i˶̞3DRRRغc=>K݆Miӱ+[wz[a !B~>?~gXOXGwA-F4mٖSWo՚1uFZ^:_Щ3hHMjj'OSgΞTZˋ+We3z2-vnæݏ_6DZ^|=y3g1x(lW#wΊUkHLL|# bQԮ߄۳|T*C% ,˫w{BK dqcFqA(?@(Ʊ';4jPϰ !BarO2pޥ3%K',,vӫ.KҥHx5kP ;VF iPvX|ܗ_Эgl޺Ozv 11y _.jVr`aaAݰ07SL QQtI~Glڲkk+{prrīnm,--ʌ)bbcpժT~cY''Gy!0.ϜFȮmxWڜ3g%#B!r>F,_̀[r)e%wZ4oB~3q vn݀_-L^Y^ݍݺOkiڸ!Nq-1ь1G~֎ IDAT|7sۭZ4#زmGIЪE3._[k:-5Ȉw2qv6[-qq[O?遥#"ûieϛHO{$ KKKLM B!B6/J&}gt֋gҖ=MH`߁4WW'i~8vQQ4k!#JNNiZ~e}?kk,Xĝ@6oA>qvvҩwOBf] ?c'tDEG1mؔf۱væݬwńOre|.]a`2}|G{T*BיT6иaSRlȄI'ÜaIe}+SL9 &%B!"'?q ͚6{L3nw'))z^u3l[nmJ%>.ceeɺ5+1e"vmc߮md-xkg 9F{˗ѣsIF 7WWwSIX} ی:Y3i޴~~LZ5oƲy/ٺ_ou_?W>JŜ з7VVC^HLl,/]f˶iݒyÈsA.쮳R O{lz13b7c_GY^9w$B!DnVѭ ۷Ft҃73ex|3}wBhiPϋqcFXsX,-up)JL3PT} =}ނ9qSh4-MA ?n KyB!CUϫ{RW\өP( `ܘQ|ܪ5kTk,_4xvڣW7nP(?%x&|^J  doiټ)M5䇟2jdWF.҅:x /^doe9RF ^pRqGPPp0 B!lmummm 1|G+[Fmjj*88땽N")Z·;y(ImϚi=[4י'*:ZwPFlmtmm]G 9R%8~Nيk(Y2KDVJl\ff( -SjU+Ĥ3ٽ+%K.feiILv*9>o>,\qcF%w77,29_|al"3 !B{DFFj8>d 4a޵3%K'<:bt8gƤ3A|NWQGzLMͰr` <)\R?}9ajլGzk߮ [w⋱ݫCCYq3ݺt$}) 4j5~@V?+dB!B!9$}B!B!r I!B!B@B!B!ȁRSSw~;;?ƆоmB!EKqfKpÿ3gBk;9z8=‚J+лW *So4i:ٻ/377g׮g( (BicuU*9-eK_,P wŽnP0Kyh k~+pwwc~-S?: aђeaanAfMWcЄI-]N5hcnf(1l0BCٸyڷյΜeɲUCB!?gooOqYn4!Qr۷xbDGg~>2Q ۰2K%}NOkӦLL;wSno8˯|3c*eJҩߴq#֭  uN}=W-$.ݾK(Irr+#ɉ}J޼y KTTmǘqrrd_?ERѿgO$}ҕ+TPፏx\YA!u<#~Zyojr:wA>B!"WѭaOܺ} RʣvF <|3gfݚUeyYnxթu 5Wn7lP.;0bL9X[ZHfN` %K•{֡W]4pщ \x8HLl,/x6oN.xOM+W&Dz']XXj> ?'B!ćlђe >Jo[ 6fһ@Ν-KHHC[NҞ{AhCN9Ktt ˯&РI 4iArrNdjubaЀ~sk 5U!zvCY# k넅s;FD{;j>꒒•W 04IdC 8o?v˵O4 abbL}.!B!r Fôh԰ӧLյ (87HJJg {֪BkXYY|K6o~驲uNjKVm;~9>̿ Ϣ%˙0Kzu3ZKѰxrZ4oEA!y?ލB!}P۳{RgpQ%eb# ~_jeTHACy$Sfӥu4jP( Ypj_ kYK{_*WȃPl!IFȹ$ev)DDDRbƽBu{UB!ζ y4=zDRzmSSS .=u^Faw7nTdbbbٟɉeJkTD.=ع{ <˗_|yΜ=Gbb"3Dh9ބ*@"w9}ނKWrU i'p~Yyq-THfB!"tKEEEi[(^yM^9yht.YRP*3js*ɧ`3_ jJӄpss{5i4i_+*6-u}4 n xiٔ|>qU*WʰJJq,'B!+:}FZsکLMMi޴ 'N v߰ +++jJ8m@DrJN]K H$:(8_?**`oogZ766Ǐl~!HNk\y Eϥ:}.]Pkbrժpkڹ; ʗ7`ddxW6GiƏC'ϝ֍>B!BK R(T 9G9mNq׏cc/VOpHLndii kKKQG>Fr};-m>֝Spy>%~;|Jŷ3žQThD[gM~wZ5qɟ_/ҨY+:wlπ~}$Xg[No"""HLLST\ 333 P\YΟȹ4,O^V-ؽg&LF.}wұ}[B!B\ɳV >ٝKW-.9 B!BZz: !x'B!B!D$I!B!BH>B!B!9$}B!B!r,OerexB!B!!=}B!B!r I!B!B@B!B!ȁ$#B!Bey"gr olٶ022A 2S|k>8HȽ{ҭK'vB!3>˯̘=N}&$a'>‚U*1g۸y+-7`:hש?gaaǑcܽ7HJJ ЫGW|/'O//ң[g7mbrAx]\‚[`@ȓ'C$I󞷐u<ҩYf-`ܘQOk7Эk' qI_=3lB!Bcӧ 2`wLɒ `3 Rt)&zZ*+hҨ! nՙ;[wnOF 9wo/{Y3f+V‚^=aan<֥˕bbcpժT~cY''Gy!0.ϜFȮmxWڜ3g%#B!r>F,_̀[r)e%wZ4oB~3q vn݀_-L^Y~IgwgwN>Fא.))yfinjьχ`˶1{~&&&M`gg @l\oOz`iaaȜ>ٴp2mM'|=~%fڄ@BBqr!B!r.߸I~Y1ٿeOw I@3q8ETT4Z`Ȉ/ZˋHNNiZ0[ZOzt+316~罄"""4u v& nkCCRƫa3&M;IWl 8s*V&|7l@rJ >> 04IdC*1lp?lտ1zej3gaׄݺd\B!B$'NYxϚcM n~$%%QϫnmխRe,Yf%3Ld߮m۵ cCo܂gxk̰cHNIu_oAzg|3m2%Kh𞷐6[ұ}[Al߹S'Qۿ!B!>phW*xխ͙t꼮獂/7f5Qjڗ0h@,뺯?N V W^ө[R2uƷlޔ&:\-9^k/r8IC]=.>WN doh!B!r2;[[m[[[z8:}reMMM%<<,H-R7ȈmXx^vvܾ}GgMc{>zБc(Q:\ҒXUT* 2s.'ûނ}Xxƌ*w77,29_|alB!""#u###IR%ɛ7/N̰PT(WέRP*^L)[4g:FvzqGD`eeFW6r vxϚUĻSݍwu AVSDn IlJO6{XZXsjTayjUٹudhB!xcǟ'tj5'NN`fjǭZpqKHHdX[[U7mqZ#)9IJ; QB{N~))9v2=x1\ՖqʿY꿐ȈcIIIe>douaQtڙ%2q ,--ѽ 1th^[Aڐ/%3(6%}M_{PW2=qf !B!޽'OW;zd !Y]t;Xq@<$)@*~ʜ>B!B\ɫNmz˻ !DN ûB!V߷BwCz!B!B@B!B!ȁ$#B!BIG!B!"Dαqo>~[WB!B!CȐB!B!ȁ$#B!BIG!B!"B!B!D剜ŊeF:, TnQBv.n׮;w\0ha22(?y?ósϽ3s'Ԝ=7'1k6m@NҟGhuHFMɕi<{ATk5===&.Zecdϓ~'&*cޅ $긤6WWv^6Iv> Җc'5W8\û3Dƥ Q|576e +Aزr)~?9B!D2^}??[$x'S3r+@Mf8MU-[{4Zҭ=j(Lfs]>{"ðsHkbTSS3D ׯ8{;Odɑ$wX)W/ٰtEajFP˳HFY83GSLy*ש2"'1s0vJ*յdB-r>)H!Ⲵ>S3NKgNGzp_$\@!oasiNs-Rv}MyX1g:/&G8w3$avނnmی/&iҧZ}o:@a.NܸtCC2fFD|0?REFFgݸ(qT2k[;rs؁4^_!omXO0pT2gϩ)/Z<aɌHNZ +kކ*uh *iEcdl]½DiIHpp"8@M!ر*u05MErwZx:ϑ} cRfx])zzzDFFjʞ<ǁya!!8KGM(XNȧ`\ʍy y?ܻy=# qɜhp/Y)'q+Zߏ]gN&/YuO=[4^֔\mbMQ&OA7 jױ{yㅥ-עb:{ջYs}ϟ4ϟ2|x3l?y8~*-ճgاqaqo88yh?o^>GOO YҰuҹğ 1.־BJeRν7Z:e;Wn]D4 %Jgzߺ=P,;ruSvߜQ*<}p+bh%cܿuS\R@P` wlh"SP#c#ݽâi>h&Ye2޼N<{;xo_œq#U m샡c2f3'Vߓn^H#{ώDFe-NZu`Ϧu۶J=w>?~ȶ+0Q((Q& SZuC)X8nJrQ_=d?-].X]Al91dDӗḴVߓkcP#ooJX```B<80;PAcj6j @B gϦylrwLj[<4Nl\5Ibڵa y Ѫ[/򹹣T*9k;U6‚û 0м1{+ΤYǮX9צx?(Z<ϝ&OA7LImbQe\y9QCfNFM5=t&MVSE[@f9qh?7^ j\0{G.;M5⼟aFkhW4GtI!BZ揚u5sav-İ9c mmZI/bimiYXYjGq-D,Y+l”a1}6G⺔qTMSE5uKLJpATDdJ $?.`d˖ƪ&k Al94HBB>qV̙9 ؾ;J%H~19cfKj<H6}1| ']Kb˪}gNVTw}x6ʈK*W0o&( @d߲-w]e⠾98RYKc*i/)#"x*w/Y7*̽7_CK|sǏҪ[OM"'!O;)8iE˕ xXI9V'Z4aec~ky|.QTD*}ol~NzzzB!D}}}\݋r%: Gui~9Bn.P}s^4ù>|6+iϑW4 oNV(~_ZQZ󻹥Kk/ SSr͋XRYx>n^vuΈB}:{:l̦qH:ZRxXqQ%Ɩp~\BQt:.1bG;y:5^@H*5=gNJT5[V~5q]ֶHmAe~6,]勴)Je׏@߀p jC1av;`l3'ol^"B!_2k[ m僫hJ}?SzҺZX~nKXߏ↨F?׾ ,VUd$a!2s 'I$p5-^F?hzАsp%"#&g)3OϝI.ZKuk0ųmG#řuo܋'9/.p`&*oeie=O33ukٵ';ׯba5!VB'(עu &s˸=|޾ZK&Ե7)8X3gB!ė6_ng̚ #cc{eb{yju^ԺREFjz 9GNn]D#u|157XDʔ&]z޾zU5j49JWݷ;־]VTRM|^>{mHeD >(J%^3ѠU;T*ocV) gEP{kA={CCCM7ݜ pz>s zϧ@$=Z c153%S޹aa &ϟ9:| SpN;>!B~{NJɘ5;BW r O>:.,,cjn!bYSEj?x!o_$czWQ79s[ʈ?DM;>)875gX  M.>19ODr>{>nJRbe^_eD<+R!sh/+ύK <}xFm:QɈpdN̅Zf˪eabМgp/J ̑ä6Q!saiZa7H=w\ +7a_y * ׮F&fòz=9s֕Kws' N0Zl[ߓ3o~j5^_  k|?4%ڹV1cF WqTqsMͪy(T8?-T^[#r\8uICQnCmmy9zQfY{x&ς):pX+)3>ĕg+[j1Y0y,bPLJӬSx'9UY1Qw6k;o/͞J/9G ]}1i'Qd'pB!}"#qpZ;o -ZYk߻X2g%ϗ% ׬jjfNC\2gwܱk؋eX`b^kWm\݋Z+9L9)T܋!KVLKHmb[קB -ػy=nľ{Zogۿ:^WaaܼrsQB(Dj|"镩T#v3whm/JexW 'I= h-:w'K?gNj(45_x$W,a(dɑ~'NRRJz'$ߏES1c>X5{XMT%x9ϗ_N>ތГ\\g`z%įl׆5<}c'kj5z}OB!ŵ Y0y,Mw,.ߢSÕiYHe]!@8(MA98ҩ_\9W'w8BTk峧<HSvy*EVHȄBq(JFMٸl!\J!?#û~Q9p˞Cܜ=תHZ7B!KFM٨ir!?|Br\=im/L!B!/%B!BB!B!oH>B!B!Dcnfu>]LU܄B!B!$=}B!B!~CB!B! IG!B!7$I!B!BPLtM4?y{2<~4٬5s/lO66$utyv.^ӯ{YvCpr~!B s{)Y.IS/[J*5v]{Ikd?zƽxX?6mˢiѦe*Tz=w8SϞӵ{oJD՚Xx)Hf^Koy*/[zgSjըS+B!~ {;;s?~%VҮur߉>nj*˞-7oi6jTJ y7r56]i  kޤI#x s,&Rɟ];%wx"υK(̑!B!EV͓;*U㇩Plޝ[P(sϞ;~իS;vU˰ 0(UѪe3̒9B\RT`֜5?lc Vφc e%9z?2gH)QXSg%:}obaa{azwE9xo^˫Wvm}Fzy qpqvCV+[ZX<,_+0{^&((sq9x" Зf}n܋Uٵ7oaܾsO>Ņv[RL)'t1:sK4o!B!t2yL޻ϊ% )y1iЫG7J+_^#T??=R| Gg-Uyrk]̹̚///rح-! IDATAI.-5V}OƍΡpqg1@t۷ҤQx6Ԝ[+W6c6/^$sL +^RՄǙزUV ^xl)sR&G,Y˗;)GJxvgɖ9r8Sg̦Qz,Q /3zD:*>ѓ'oӊq#7 kV1 >>>l{;[|Xa3=5NeبԬ^:s=,_Ipp0=w3s3z{;;=~[//yetܝŋj!66:̚; .ӫ{7̱ӹC[y%E}Eu#} yrv25t3LXQKG`1ޕF >!B7h<5c6l߹~~r2e̠qVԫ˶MfL<#PXQٱei}.Ep2gӱ}[IDx8`54oIܹwbjj@@tooEXX~ycQT>}Fi٬ zzzs]dL1=AJ28ϳIT)*ɛYb eJ+9p谦Ιst*͢ K+ʫoXz-# `!Z.ZjS2gʤS< /XQ ŋdj ++K֬HXx82*:CCCLqrJwYkn߹Gը?pU+WBuE=yܟ.ࡿ5n"N -B!JYOԫ@"l1t^GGzt %}zutl߆bmmSG s5JSS}z(Oz5Zv[ҡ]k+BXX8K$}tiݰ SS3N(*!edd K,+++ڴjN\9豓̝`v1J9S&{ bn=K__„dJ R\KL:q3Gv._nRΣǏi٬Vi%}.^& x"f,_Oj5/^)ǏiH{xYYz-wޣx"\|R%iqXtׯɑ=+[ԔbE=p O!!\'O2"edS]`;paRJ%/B!֗W)S$gUpEE RwfV|2gʨ 1k,xN.}k7nA?k(V珕N۷Pd MOO"+ ʢoϺhݲ9 XL:gϞt<$D#v/+J)2QjG_JGTgٳ/+e&ؠ5wNxn];r'Mۀxu|E{MH^=0[2mӧkTe;'MKWܱY2gԔrKޣ;q {1B!粱nZ[[2_J cccЮsgF'^c 󋚿iZy++Kڧ?|y EIb<7O>#O\Z-Y1u"ٲfIsjjIHHL¥ȤυK5g>lmm$ShiiaSfM=q46֌6X3fWǏjV_XtׄҷWwGXa3CF&Gl8;Jőc'ߧR1T {a0¹3V(B!?G__vlӃoh7{F=:ѹ}jgk'22 V/[ljF L +t2fpٳZe/^DR1Cx)AW5KfL=Gs/۷^1֏3!iMvcdDY1#Gcddλvԙs'1a kbd˚ݻRx׍a$"" ssMYDD_=fO' ^",,,ѱ !Bs)*qr#"4GG__9s`d{'L(P FFFܻ?V7cunɝKWO\|ZI:s3fӣ[gͼ(^W^Ç7Hn)Or%|mՂQȵ%K¥Kw@N(VӢyeB`޽;ý+VRT .]ʺ O3`cO|2ܽ{kѤQ,-Hh֘]nn {{;?~4mHX2fRD1L \t إ;K Kk>LMMɕ#;cصcO&#vQ >6lB|yQf֜bjj9wB%{;;ϞN.2`0NcB!ďϺ PFF>=w[/MUij!^^̙Jk9aqVxTeʊZ0{B}ps+Z\y)bldSYSOüKhټ ^^̜3CCuKbfڄEK|8N;5OPB:ٓٲ9SFT*Nt؞ԩ}]FOqrJÑc5ǻ8'[֬ԫ[[g ZhoYv=M<.E%}dKTP>0c-`9DFFřm[%*.1nTħfOB kB˾x Ȟ93h*^2odܤ)ЪySډC1~T4l+ѨA==ǔ6gϠS 9cF$uB!?1#0y?ɉ)ǒ)SF:uk$$4cNeзfֹ[dΕ1d۶M[yvRNMƌѥ}ёS'2mmDtiK'Fu=ZJB=THdO!n9z="c 54DDDp};5o: ss̞:r f4kIm>XbNGԐ/}_kP`M߰f7H?xqb/^ԩU'F$B!_޾9CBN>:rcU88~keK$_<!B!_$#ӧK0RBBH0B!BK2B!B!o(=}^R_7'B!B4CB!B! IG!B!7$I!B!Bߐ$}B!B!~C)2=[ờU޶C,[]9f#njsĩӔTp(_.^Nk%ZZ޹kW]Os"򕪱gB!RsӭGxUj$ɵk#N2~'5~: sמdv`` u4|jx2YbQxIZ 7gDFF&wX"Ȥ 8;#t3VYJJsH¤ϯ[S<E$B֖i~ȹdwlj ker ߀A2l_4nԀ[|M$D/ʵkruMHNTp\ /]VL>D&BYAgږ(۴bNg~Y`.V~fx6]N\x)*h2:ul,IS{*V(ї9ӯwO /oohàQn޺)ԦIF@T=˔T & ЮMca9\qkk+7mg+Wb>zLԩ)S$];u UT|˲z:}}qtph㉌d~~8ef.UBޮ={ٹ{/o޼ЯRs=o̽)iѬ1%K? ? W̛=7o޲hr\Rĵ@~w+֮8n n=wUkK qNۑ/oD15iњPFFRTIw댉 7t@;k)V/_{OYaNNi(]$}Bfϝ5mh=bƬysV2|$>0_o Xb5!!ΕSS JŐA073M;wcogWli*/@R%skmZʘ0Q`ddDGo̹8%$$7s9#B$22L3&Õpw+IXXX3g<|`'>2f`T%uԚ_怒+j%)X 7#qkV,s!B|/SXQ.\UG6S|2e̠,ev|[w|2ZEŋTL韞Y~#UףVYP)2Bam!zh_$MǏI#666l+ `μ̝HR8tҪE3\ ܜw1yڌpǏZPQMËfΙǕiۺ2f@Pm.]` zSgƺWti2nma#144dtKK ދ1*1ƚ417 iPF',f[?iG/ {,--tj~BΣ013x{e& @ȧBCCň =$Rr/ǟ]4|~51?xmH |+[?ݻ) 0s :kC±F;~eмic;$*{EOO33S,-_OMVsiw* hS'œyrӪeXý0  p1 /}uz/c`5iR?x5֬c՚uZ.aɲڷ+ɯ)BQïl+؆L?BܩciikGG۰66j)JMgxR_Cbҽݘ4~OGDqvvZe^FV>N$Dκ:qfN'OchdBbʑ[lmm '_$}ɖ5 7oޢa+443s sO̙122S9}NGE0]VTVEuf! & 4:D}8;3мU;,,,]:Z te^SgVIHXZDuQmو>w "##)V=1vDԱ}[ٹ{~~8O(VNͱdǮ=ٻ s\ 0}jSvMN<9Ggڷmͮ{Yj 9sdgX3o X% [\]%K&\ڠ IDATmL9!GqcȜ)#gΞcbgkKjUhݲy ZJ"ÜU) tf?qݓT*!B1| f̚ÓHȐE^Bmڈ߫e۱cnvCTpqqR :a?f$,bKDvml!wEI>]I)/%o24w_'iٶ>qfÚ?7 Hk !B6"%lYdA#•r::8P EDL2R>B!B?Iti&w:M !B!JB!B! %ː%reB!B!~%G!B!7$I!B!Bߐ$}B!B!~CB!B! % &w?Ylأ1XF&B!DbMcnw1&cI~퇏mn.^TX-*UxSTlݾcOcjȑ=];'oܚz>>^A˔*I~ʩ3gٻ !00gg5iDʕ;L6ncnfFخ HF)2#ΎtB!̶pիU!S{kyW2>1}\*/K;Х;K%O\Z;wlG .m{uKIbeѢYLM9q4Gϟ& ;) 0{&#G7]He$vd>.][2GkkӪyr B!D~f[q }Y1V)K[/yIؼ^k S1[q+X~܍$cG^]Z:ٓ H'l֭߱Z5AAZV-anf5g&;=pqy6T? ^~C)]2M[{Z[[S|eiq Ъ))G5*TYsQ*^x(SgSTTUy Q]ft R.%Tػ밨7_RiPA[[vnD;^gڍ0?YG@a]<ιYv1q46.]BTRj1w: !B{xwݧCTRZ̹ lٶfS5mψDFF&W̙ xE %g>%y~Bsv>|H;\M[]K݆I@`ޏԠjz7௴|'|)\H[g]x1uzU7r#S)]b֜K+#~?yұ=QQQ̙ cjլN& Yn#^>#رez۷oiצ6V~ 7KcݝsǞ} ''Glc(\ r 7nի%q}ܱ۷]>~ ʴoӊAA[pFB! yIfMֹ#vk(W/9{6,^ʊUkI# c8'O!2*|;XGhҰAc= ؘUwLMMlkC,Yȗ7!\|(޽O~Ν#̼y OJ n!gޮHORF5lNvZS%}@Xx>vvcxDp̚%n{ۗɓb.ES ="3ص>T-]FZiW .!22Rdsr"O\|]ZZ}|H(RIGlmm7p0];w$kB!"9bcciݲ9M7lR4iޚk3r7>fFڷm{3)^a 4Wc#;ch԰L__֡lRd47ٰw?yʒsI[wRHaZh.C5104`Όeގ>=8s<*OQri.^1#R]|!!(Stuu166"8$TKQ৛'~&O{W%Im9>zʨ˲e6۷k~߃: PJu6igTsE}nU*k_ͭ ᮱=~~!)yٸy O>8ʝQFy%!B>OzZ"nDGGSnDU*N琡үwe_A6%_ZZZ0NjܨT<{usP߸ɥWl/o\\μy6oݾCre BLƍ-=b ԭ]33tH$T ܡIt#}Glnff AA\YTTGӻ UvmZbii4oA]XYYjomm E8t(nU\r_Կ/KbZ͜c,ޕjUQ >i3fk۷{cB!-,,x9~+kD~_W,_S'_GGG9d(>||׹ 3~2]:uY[O.:kƶXff4mԐn]:˻)Z$Жg߼w 0֮H93JpY'S&}.^¬9@y78u K F Q|F?`!dd.rg[kGpQr̡SSà}x矬۰#ǐ7OnU{vB εȔ B!";{Lq߽8E͒sկ2bxܹǒsMvLu/Z:wL9OvtuKfMiѬ)o޼e_,Y2SnmHp^@@ f]!>=w8Gt#{6'?~Q3bccɞ-g=MOhk!"<"Ɯ'Okɛ;7\2{bBű'9vdaΕ~}z133#o]AlN ~$B!DZ8~߱щخ-6nJfnK|yV…س/^D_Oyr3g/qK,¹X|cMB {*U(%B!DZ0vL㯿q#vwELl޲wannF}7&~NckkC-ҩ9 *Ķؾq̚C7fܙ̜3#ǐ1C*U,πSewR;QcG$),=6j, )[5{NMhٗEu 8~ҘXd.:{k+RuQnO!B!"r^΍;Yd2o<B0  ӏ*nM!B!B$}B!B!~5}Wдy$$oX''ǴM!B!"I$5׭JxtT4IwKB!B!%Id1km!B!B,B!B!PGjW!B!GRh;DH!B!B I!B!B}-aQ!B!BIqFF!B!B+>yrJ?a՚uT)KEFF2nd4n[:8u:"~.\CԨSN]{~w{} !BGFj{-v` Z,yqQ$Y7ըN:[:DEE}W;ɡRر:tNͺ h֪-gI~EҞ<}ƠԮאZa(Jm%,ŻwL=~̪5hӪzzz>oϾ\|/O,,,Ȝ! >LR B!"reJӧwO̴dڽ7On>q`olmm3W^dJJ%];wvxBu窟]\RMRJB_?.8gwlZ[ [ ]mEFF!a&B!g2f̈Kk{lݾüq\I{  aXXd 4,7Ӳy3Lv"ޭ?NLwVȦ-[y %sv^cŪ5% 1ml/999hY0gB^8~4AAA8gF.(Q7Uێ \N=b(-vfjDDFraT(W{1cF~-]k~R}z.\d tЎfMs]o{1ǬYiۺ+~}5KfuGR]v\xE >U\+j:_Huҧ ݻu{aPoLML077kx RlA,]{Pt) Yrz|ygxr^|C8w&RfuwĽXv=?~G.sU*&Lv֤km` ʙ3s3xL>B 5WtR\9٧?|(? SST*>G}wؘ 6c0KFƶQ*O!::&AxIHH3MB!"<}A}(Z0ރv?]Vd'6>th׆>z.ߺ}' eټ{cƳft@ %chh=UQ'Oaޕ ⾀~5N[=n"njtwɗ7/.fDEEQp!E6'o7 RݳgϨVE1ktttxVbCN@$~1KK uْe+(R#谍5^>iߦ53;`;;dccm1 &k(] lDGGy6Z6oyܼeJEV-p @&ssxx7On @e8"Oef_O K uϞ̛=P̥-t`U݆}_9,, /DGG3cd-B!GlRxqr%`-R2K+oA6~ŕ&h9{6t ~GI[dD E Uێ>rZ5z=Ɣ3ǝk˿|/Y8طOk<Rɲ2t8-Ph!jbllLHHAO߉s0˓ܹspuQ#2_oz%COO&/Gtt4=qܪ~fݿOR%eKOL|~\OO,3?{ب> ŋq5)h!! FOOiS&Q!B&߷JJ15?,-- xeJ豓eŊ&~_[`}}JW'|ȗ//ҳ{I!B4waaaԮU=2A~f山kqm4s)N9Q/&&##>ԙX[StfΙkԡ-ٳall;~B(:+gLMMxGԔP=J#_ǢۻzP(~vIbii>h`P$vZt_`|MܹXxR}x~ȨYfIpacm͙:y!! IddsHLL QQ(>åKWR:Rl2}ϳ/|}َ)S$o$ P]v q)ZT mKIH޵3.\dq8uW{>䭿?NNN@ܪwg_kؾ-/]wL.\ٰw7ŏ˗+Cܹ1z3xzEWO&-ѢYSƌȕ(b!B3gp99^߲\2s)p6oƕ8y KdթwfMQ*z͏G;m&'OI)dggc##m!B!B-B!B!R<'ېveݞB!B!B!B!B!B!$}B!B!$#B!BH(梕~zV&""#P比*ʑcǵR^~èר\k2KW&*::C跖DEEpMzD: \&MZaI|J㼨(֬@vVJn5ص'[@T&gɔ*ʶS**5뒼.=zwgޗ/={/ըK5i߹;׮Hnpp0jףTyW?y] !Bg^C)UޕR]ٺ}~f,[Z%χA*ʹkJwȱ*諭wN+g]WԬې hܬ /#"""M_z@_jP^c,^賏x_dJ:whPΝQð$K)QtCCCZl߼pR%3xPnϪڹ3s)fOАkoýE {MyGȜ ޽ԯWZp-[дqu?;~иa={Nz`oO]ɘ!>|ȇ_x)zzz?8J!BT<annPslmmp\BXv=/^baB>c˜x QһWwm'(]'}.^@%RMRJB__zdd$2dH>}F9X\uy?lZ5!&&̙ܡKV8fBdd$fQͭ ʖ`XYY2wt mulF}. ¥hauyjUiצ_Ј Rd ._;llHcyזdテѕ3fB!'QFH_y_&Ԫ>7oa7gE۶}'[ KK BBCYz۵Faj]W'&ҫ@nIZR޵z:̥Wݝ USv=&NWIll)RT#XYY9JGum_u|>֭cgg"B!HxIF3\`xxfΡN&wF]p{0ת>z{/^2g8ԨC%/zN9K*Ya7of5r՚ؕ'N}w?*Kt4 /NTFTt4W\bdBuҧt?#L;aogKWkk&E_;qSP\Y<`صuƥo%Vb,;[g̜:/lŪdrBjըFصu[6Lb{zCT2v07hpb̈a)T1kΞ=iӲ9ngɊ`8>J>ޞ9VfͺG,;w|%;wBɊ/<=Qp *RM!խOcv4-]w޳=~6P|r⊗!Q(4pbllDpHA/>3y ޻.r/ObgsHr=q/ǒyhBdq[k$ʕU'| B ݡ*{LƌTO|oRkسs ރQ|Y._JY!A,Z4SgdS&qJ{v#ggv6pF]dv(\ իˁG}}KmUŵ2=uLkZ^]o%/BwQŵ#|4/]:|2ܹy_xD=W^`L=B=v ֏_fZ6\k^>{~R˼Yә7k:{uˌ;Ak!3J|4Q~$w+L2i_w,}nttt$_}[dJX㵞^[L {=E$\҂`beQQ)ʊ Ӹa}>~HA^,\fMk \20HW3ggrpy%`,^0^yCySpH.\QzqB ptlk/K(gCP7 Ie#>}G#4zB!?+W u|C/)cc7%v ߾g8~Fc#_ϱ"6d\|:33&&&lܼZ\%ҥJ`gkQciӪ7E3S(|S*"?E+̚3/bi[]2DMOIy Zld=Q'QQڶ6|puwkT`?1+RH,_0d춞>}FYll,>R22Hzuٲ}'ukJ;=Nb.8x''G|{hԉasֆ .g/^#2d O\ ݸ5܇<>N!BFGW1#2{8d\fTlڲHɝ&*Y#ǎckc`T?)S&͞N}193|ɐ!1J%ј)6::s/bbbTlll_[P:C]{E+_ KrА%i9:M: xzOprruwD /_z#ǎk333T9ŵr?ѡgΌ0 +s8s<ƌ@aj ΐи W/d-Bg{,]8[[*V(G;mZ;gN>q=ѭwݮu˸ezU}\BUqM&s9ޑ5gOK I140hl;E BYsͤO>`ŒJPT*Yp7[ϛٳnf/W~|7j߷2p7ڶūW^]?LZ$| .+p,,_qPށJanƊslvhr NJ% 011wxϜCF24L 6,;s3t2f@зWRE޿̹-Zf{zFߚ6Z{>v062"[6G&M_edܙlܼgtttȕ3Ӡ^]6JEN?q7G8Q/^dБ :qd7Z611Y߷nC<^-%oB!OАiS&o dXZX0w"KWfm܌ѲyTʒK0Rf[HXXVV,^#ccc,̙?{{eqL;Qü0e* k1k֠Y9z1*KT&,)+VБڳ,3޳[wŏcP` |bب(n՜]:i;4e_Nf!nG/]>C٤ˣߞz_YB!Bxx 0zB syFE& ( b?Wl.B!y9z رkCBt?K!B@^ !HICMZ׉d׶?8Ľz['yZ_="}s{$B}llvB/%IthiInI5׭JI*l[o'B!BmZGc" 9i;d1km{$B!B[d!g!B!BO KzB!B!үHpTFZDKaj%#}B!B!$#B!B$I!B!B I!B!B)e= 9'GܹӢoz 'O]VJl޲ժ`*m !B!gt߽c E--;eԭ]6Z>sQ&NܽG74nJwLnݺ[2d@9Ю 8SZ/^`cmMK+%Kf6jHBe<}}&ԮUm[ЄIG[=~̪5hӪEbGj: , I!B!D^/WPV]Ow-K:([4?ؽ/E&BXq3-74n'.޿.afvϻw111!O c܄T]2o n߹{?5+m[bv<鳘1u.ǴoۚW9duwO~p !B^]xK[̓ǀ~d>8~4AAA8gF.(Q+9w/_LDbBӲmBPP0'N"FĵREȈN'ܑ3Eq\e+Vq:R/lLcPDDWbcmMUi߶u˗8xya?NRM {6251!C (?zH5,Q];-RLL4&&T)^?-RXZUkwƳʧU??u1VYGȝ+!!!\GddeKO̙+^&_<ԩUCCCw6MdQ.UBݾJb9ޕٳR(Q̅}3S=4]!B!D{9 ,y&|j&Le@}Q,66z 1<+++7OfMqCtt4!lپUl,5WUWqIOQHa)R7ܹ{qG N={FU*eYgϵHR-h2w sO}{ݻwB дq#uKLj|}_DqoINQTIu~EL}5!B!R&fUߏ3t(߽ښ/w3Nh)]/_~fx{FE ⷖmy ٳeSнk'pٍ#FӾmk2gvHgw\011asqL8%֭]3c<|([Ť2Ӻes̓Rԩ3,Y?ҹc{۶de0nHuNWW{{Llݻu#>r ]zǀ~,$4SSS2]]] RT"=HOqw y§KY3gv͒+P,AWۻ·~fN=[cbP*8gϞKd#B!H{ٳi|}\5?,-- xeJ豓7n7CSx)3A1T*1,)=S?իׄR!44 SS]J#ᓘ>;R@%(U/]+UDWW[ѪE3~B 6b4|'7Os`u`1/U*s}{ IDATn 7et^|@8SgԄ+QThWD#6$[׬^޳ 7cffF_б}ۯ~͜3׮өC[gؘwwC./B!B|{W @ͺ 4ƒ1cF{,' Vy>&&hl{LL .]IV?ڔ$B!RbEy Q89:jd͚D#9pD;{Ɨ'NFGG7|8LML~&O>g.89}lݾ%all# d˶,P*.^JDd$SP`a`POܹE!Bt\2s)pZ4kJ΄}ރҩC;sa݆M;qew:nK====|IyKWz=;R vvdvg]Op .E0jڶnA9x=wߧwxx0{Tl4؛xxLT2{qz!g8gˆ26gr:#C @\{)U8Vra:d+WqErNhhGq,Q̙0y*mZ5ʚ.pEzvZm;v2thZ5W߰q6nɷYiI+={ٽgQdɒ/۳99ҥSv͊Ukȗ7fs gΡuNSs`-]N/bbbؿ{iyB!BdaQY;)ț;7M7hzuEK;\9s0b7}$hnZDDD2w:QQQTT{'ܑ͛{ FTRD1ug܄0a(XŖ; ֆZ5%ڦ!njcP<0k2eDlll8J2YeU 'NfwQQmm 0 *a(]ݭnZW1zMtdtTY8{h4KK>=H5w&00;[[diYYY}6DadD\9߷7te͙2q˖b씚];SzoJdڤ ̞qTZRhټiB&UR ̽Q>w޽Y!B!~FZRrE6nС$Tz1e=ܗ /)ljπP €p |Fs!B!B'I!B!B$(+yR%3ߟB!w~ʄA!MI88س|ɂ[$}-!B!B)$}Ia!B!B$ 2B!B!D=} Y|.WvUB!B!I$}B!B! I!B!B$Af/II'O;X ={3fd.9 OжU UcVHgx3>4hҒE ӵsE!B$ &lݾ?/˗HґҲycL6JF*o ccM$_"X8:8&$s,[IN[K#wDqI{{C!B$&ߵg?U*wY{I7o2}\ʕ)EQlٶvt\rdϦWc6S::[7 cF˜)'O)_4i8RؾsfdH]fT(W.ϭ[̜3@/3`0||С]kRJɱ'=n"fffT,_mBnH:GgϘ`1|iWhբiBÅ%t12qlB B!l7_^ݻzWXҒ%V RG{^dؾireKSNCla̛<>&+[T KWB9*VőuIEKW%s&ƍ@E aU_-LMMy5W`~ԪQ bE }mNYjvvjZZ4oR"IyW(e>Nٽ E +e6mOCi3_^F nQVYˎ{x5J,Y21r`\Ɛ(T 9sdgŒ37~~8NMJi٬{_TW؅f1c\@6-p ]zpa̾gէFjmEXxk֠[\'xxfئH;w%>s=ڊխ3ֺ2TRw޳w %$O,*B!~=?M]<"3AA1&}LLL Y[YF``P{dކ3m~w9g>7oycnnNbE٭ 66ֱwZ8}R*I̜ݾѠnr g˶&z+-- jyIùɗC(_ K+*Y< )Q&}.u^tg4t ץ}Vl۱nr\Xx)+VA:ޥ#*N98A8x%KWХS{fLppa-\3ulo^B)9‚];ame,][^>V˄IS٭ һj)ߋm:0fPx[SS8=]1Cɿlj45ϞE3{ϜØtzM`O@` koG?a6W,k_Ʋ B!oG?u7Ƹ~2+.Tw>$}~W20k|ztlعeݱ@ФQ N&c#" 05k7ТYtl;|2qmEu>FqJJoL3Чg7v~/OJK͜mԾ-E JEL%OIP(-]+W~6Y!!!̙17jzzJ:}`e?KP`aJ$2S˓:$~>M&J_* J(ƹvYdۙ`1%J#Gqܽm;v߳gުhDDD737 /u WW "E \k!AA'Oɓ;v4Nz:G!BMVyRMM xRoR:GN_ظy+C2fgg˰tŋ!m48?g)Z=*k++^I P`vҥP+Xn#-7KU,_9r0 $[,ԭS3eN*+[ٰi 4jD<Cё33vdJJ/]Ta$j!ܡM$ʤ&~OB-qQlmm";SU*W$5knZoɟ]{1a4ڷig>-FH0Q(X[Y}Slѱ֯kqfsEM#Ci޴vvvEzƄm!B_ɯ^AǮ=tŊfԉp B@` 7h~=nm[F*/[&N1&}bg,:D&>=ʕ)ŁyDՎ8::K7jޚ%W2}>bL:dɒѪyS,^¥?9v$&G ̜;_>DڪjT*LKI4uJ4|? @p%MdO?_?,ҥ  ץa|0Ҥqz>r Һe3ݾ[޷?ge./^L਄B!į{Y2gbɂ+M|EFaqx{a¹J21sZJo*Nh5g /jZ[Lɘ!=?7tlǫ׾8;̙ szeɔSϢjc psu#}?A@Qg xy2npƍ(>'Nh8u.'7ڻ*UJZ4m ?65g=bTam=yLcjjr޽J{>y*n !B&W*-ȓK;6e,N>˴)tˌG>;^^ '2QOwlY:}Fș#;g_@z+_  #w8CL{C$KL7qCSo߾ƍqv28fmmM 155e5ΕS7STܺ?qJO)\\cБctד{Dɚ%sB#BPqIm;v ,)RТYcXJ… ;N:KcZ5it,-,ə3;VJ+r9Ûꆍ[(X KKK\]mwQZU8;}._{Ζ}fL{yb>rŋWX~B!Hz~T|lٶjU*'trʉC䰥2zD֯YNzww޼yC^jl?yJwJ7lk%wXXXp?wq*1'qyYܵҤap 9gheEǮ=Ȝ)h4?y?Lmu=vm;vQ`~g{_9{3ʡGy ?*ߋi1j[6с3gsyzvvM6lJh٬ =?ѨA=%>1#0y?ɉ)};СmklS`Ӗlݾ k,ֺsɶؾs7aKCfwwsKvl޶EK=[VV,Y@fMS^j b@^ >:N4lf[H.=Ø!o//wa;,22~HZ B!Gɣzw@'ʔc)U"rhFFZ@tG;/Sƌ[ \dM,oU*RtyFmBF׻&,;s3dhSXzu/˵豓޻Z Л(c ذi6%{=Bof瞽)ț'7Ç $c2ɒ%cެ[Jg'I5~k++̞:r VVJ4n@:4>aD/2 0soTMK^r5L,B!۽C[^ܗ@m 3 x0 4~Q$9}B!B!דB!B!Ddy%u4xT)yUׯYKNl1+[QÇNæx"cvڶ'G$B!B/IIlX*aᘚxB!B!I$}B!B! I!B!B$AIv/I̓8n׉… ЮME!B7it^2uE#N>C122imԬ%U+WiF?9|&M5ߥc{Z)gr7^ܜӲySrȮ;W\~#L4|y=hڲ Ϟ=;nii~y>0{|ny{TRRZ4kqB&oIҦq6B!BGZ>t޾~j<}J {,; w7WZ6oJ`P^=;w{ȞMoR%)^nD>F oALȰyKDVKE'Dfa B!"affa;###J/qBʖ)E9qnȓ;^Vy )V0z\x= aڦ mDQ&ŏ'Iսz*,[׾~àfx߾CggN,u.]. ̗Nbee+FZR|9޽ϡCGPk4-\];,Y~B!B$de|Y2ӷWt߽{Dz8q AAAҾmk<ՕK{Q+S`N:MZM֥#ɓ'3? -k͞C:}3Nd%zD&qvv؉ :.xdW,W;1h@_ O3!\X\Vsԡn0baؿs/ IDAT`T^ꝮMj8d8@ ɐޝW}{^'?LPV]ުTZ5hXG–;j4T,_6z?5^ mظ+`bbGtWt~o'OPL)}ҦȈO&HL"q->/C6^ ΜNʔjZzJUHƉvr=g }ɓ+'5㑏n1^͕[2#իUБB!@f͘BT`Ȱ ̘:I7\`<{u61_ T)Ю566tԞ!GѢYIaY.UJdVuۗё.:Ғ _}%V[ڴjWv,\ ҒGpԙ3)]$sSoD>Xh>vv?F!!(J}  BBB(*I|th i'GYVrws%|\>d q'&D~XG>>Fg_L|:=Sj^B!I. ׯ#>_0 xq)v\y=ՓV{ )g;p{ T*ZBCߠTZr5{>`*Qݻ@~/O{yK/B`Ӗm4nXɓ뎕)]lٲȞ}:|ӦL$KfY.IhF3Gκ +_^u]{hݲy`?q]1;`_XX>>7pJabd9OTXX$666&<<7W^k !BYYY:U*&epLa9״?K!,,웇?q2JҴqCݾ;wꕱ? ֺԮc iuK'4əb`ؘnn<|cpLRqEj׬dZ ?H.>{?Z-.&PT"1`Ȁ~ %| r&~R ?B!B$U˗Ktz?iӦ=~E'OȈ̙2`azGyJ+g_0???R(4/9gYbOhV:|(渹>V⦷7NS;s<߇Qt8]{<~0Q^\~ON < %Ӈ7)_^֮(RW]cm?=!B!… #adHΛ7os [61N횼|KWPtI|>..w ''r 8;fϾ\z;z@XX>ZSIGo 2FÙUZl9(۽g=ago?!y \]ґ1Czcg]`*[;[>`kkKվ:z*l۱!#FѸA=xɆM[Z( _گ)[&}GtЎ2it2fH!ҽWB&B!/ȈqGf:v܍Vdɔ:|]{jJ{SFED®.hۺ%;waŪ5d͒`O5jP???Z3/=waIz0~HXŖ; &eJG*U(mfff=з`fML)h4=cjuUB!B!I!B!B$A2B!B|~ʄA!B!B!H$#B!BIG!B!" 9} Y|/W3W#B!B c$KH_Kz!B!B$AB!B!H$#B!BIG!B!" ꉜYղ{~nɃ066&{,4o֘B c?x'O1CzVH16668Gz%5{{،BrV,Y'8dgO,ޮi6O/00Uj0{ *oJ wF%iX.3ϟ1#%pdB!}|{0gZ[5x+^hߦ..nU+W$^5)?zG`˶ܹ{pvrt4kkk~Qpp0kЄ`6_XPP0gsD#A=HF;qK K<ҵSRJ Fa\q^annFLжyr=|Ôi3MJjTB6~CH'?i*;wJ 4oڈp5uf%ThB!HI}]z1'ki6nϼYș#;*,[GI Rt ݶAi3faVJ/J]Q*-yvgL3!1ZxiI~#u鈕RUkԵ'Xejʗ!#(W4ڴ?EKӽw֮ZIGORliҤqFR}:wɐgnBnH:GgϘ`15];wHDO;z;v{4kHR3i3//n_[޷Y8wy>f++KyOXXW9x9g#>S> xqʟr-+]WqVʗ-CdLґ^lں}{%`tB!HjZhM]eyR-vd1lٰFd([TO<͆[ڹ-6/S$͛6tQ޿w}ѹc;Θwҟr&DΕu}n6n#Gqtt`aVVJ ɒ9 _B9*Vő%l۾`֮Z-!Z͛`T&p"Ȝ> læ-8::|Ki6 ]{^^'y=趽oߡC+]3juObr:[hrl߹Q4mԨChڲ-/epG>{_UD8z$zeF@YajףhrtڃǏ<EJ@db+PzmVYw )IXXn1hVNhܼ Op xTUQ&4hǏYr $p Qj5-j)YFZqhԮ׈e+ұknqks6ѽV<|T뉲e7iAђXp%ʖ)ep^28t!B1yLZdlۑSQ3Ξ;Vbמ})UB/`<9۴g8q AT^.=zڃ7!RFm6l"]4K(f.FL+]{sQCGg`JİQc~)gҤq0Oݹ{### 8]EʔqǤWDDzSDXYY`J$Y2sik~pE%|ʗ-CXx8/_IDB7e.uG 矛+RSS.ȞW߿O"bϏ]zV3b(:w̹_Ve¤tl׆mQDq4 ôh֘)ǒ!;=c<|BA%X\A<ܼəsX27"z3x6sU+Wӓe+VsX7k__ڴӣk'LKxⅮ̫Wh޴1'GNvt%=Tb( .}kk+V-[CuOXOR)Z a*vlM(>8xg_DxA)ss3Uje|?a /#O\dɜI܈ުT<hZR/c>B#f͙On)婷_ubHDDSLԩ^~ @ϭZS3S̘J>ԕn=r+DԾ-E ԝ{9 "߇I.r6XWБcʇ- xaccG)V^ߠ'=uf֜z=z>M?щe⛷)Z.P@~z^YOϼz7vd@" }c wx ʕؘKq޽O>66dʘz>8 g>?@@ )^.+Wѭg_ԬCRU'r<'Ot(wpʕ)|2ܹ{O/IK _~h̜66&&&>7n2ppUKŵknNOr#Mkk+c<_!"*Y\Bdbܼ֌M}{QZ *@uY0{oؼuWumRJ5 xq ^}~zYb5SRr1)YLciT*\׮`؉TX31f0˱d\&M0޷DoN5<)~/}yؖrMУϽx{{#{xY2n_?h/%8j B/KPZK":|ccc{#$42{\Hař)W5lAL. ÇڣʖyFad9c~{[[Z-eaaW&j_w͸6һ!;ܥ'+ŵqyaL; !B|ۊZT;Ε܈qB'&nww iOXkogHcxɺ1e3_v}ɓ'ܜcG1t5jD)]>wdϚ!eHN9r^bAErhԼ5Kd ?;k++CWSըT*7O̳f cg@d^_bjjJ9{]_rmT@lH,g]TU`o4=,tX[䔚Y&S|HkZ=ZF>3(O9ꗋ: OZQN>-# }?щj&ǥ<022B\Dٴe<ݍgt<ݷ*q'F5>c!uDžB!@ޗZlY177ĩT,_ܓϠhKӸP("Yfʙs.[3@ M,={Nxx8]{18֢M ,Sպvl^ϓO166!mgZHΜ?<֛ c(/LlllL a<ٯՅGy 7W xy2npƍU ( իlؼ؂EK F*$OZիg_!d9?$>b_  #w/Ɣ˓_{\]~\\pu^zMX8wO9w.ܽn'{>9O| O:UzD~y=z+RSg ʙ 'sƌ|8Y2g2y@`1۶bҸܹ/kmz<Ԕ]{OtiyC,4 !!!zq !B('Nh8u,9>,6a<95UCTw,YkJ~b4aʪjz߾G>d˖Eqz<~k ׭3G6^|?7o鎇rѮ֛dΜѠ߱}## [z ..My˛>י:u*os]4 NNѮ[nܸIg_RU>~1 bj%eKVj̞Rha9p0g_e&$޹c{nzߦs^TZy"8ܺ=ѭ3zЬICvC}iҰA_ٳźWG^hִ2d7x{ؘpQ,,,hԠzX{~NCF&9ŋWzEGP0cXͦ-xkgJuQ=~K$| ;f 9p.ݝjU*1o|_3gcT}>=ٻ  "9;Vjq~,[40mj5.hۺ:@]9w>#N K3V:ө]MJ~"W'>Eun' WtL;Roh4DD/`x߾útu9q #L`ŒZ@MM[u.llʗ̑GG]doʑGB!~cF2a4S&Mw‚ z:>5kҒF y Х=qt鰰`æ-cmeEbEұ͹ӧWwۙ9g>aaaqvr 4m3LdL5rFAѠdf&}h [ RtC4m?5DQ(lڲNaiaI\9ک=d̘6mF``vvdϖqG9SƟzO f`Y 9++%M7C H`05"rȗp  D{mZ+Wc8!w|]߳giަ=<?zDVJFW?{ze?A: X`n*p2r iZjmH;*i'B3<}~ҿOOr{>NaNOa 0LCmSo>0 4~t^'rvvb˜;~&t8B|Q}2O:VIȅB!ŋѮuKLŹ:!w2+3: !becca P>t=!BĦ]k2BC>1tPeR繓?!#EreJ%HB!B!>]B!B!I$}B!B! I!B!B$A_=OHx-P;{dΔ)B!Boa0!/+eB-#B!BIG!B!" B!B!D$I!B!B$'r?Nj9p0#ɒ93^[ֳr"\ҥXŎquu!G>ZMi׺%1%5W^cɬ_SSS}pҥMKʕY*FFFrWu ͙#;gLuN.TvmZI Dƚ|`~?5^V/Nku鄡!z3] }}}@p0aT\h߮-aaaxmcYl޶u7ҩ'66ؾs7CU˰EoAZDCRAܺsre|wg_Бctډ͚ ܪ2},[Iҥɛ盶 *ߟq+/ǎ>~ bEUdqrǩ#E fy+W5kdzOhXz$?LC%;w޼y2l$/^Gu (; |y3uLR-˟! l"tZd2jzTcGB6Z|}׬,?G$WsWL6kVjԏ˗'M}%vGiբY+lޔ+W};$GLg 9Ϟt؞EKݼu{0yX*;P-mu#4o3簴`ԈCCOW)TqqqlN%ӢM{vGX)M$(2zXrvهM5T֥c@ DS>~ ½F.]" W(4kɪ^Bحw;`056aӖ[X'V.}w 56Sמ\qSөkO޼}˦-޸yͣ6׮DSNcxԮO˶ٰi ]=y!èU! `ƬDFFtћuСsw^q>R^ٌ?]Daãv}^xq:`i4h҂ZҵG_(\?v$%KL;xqqrt2iQ |yٱkw?Ǿ7-P~cDžTصfLUg'!vsVߤM$N$D2eޭw+~y뇽 KK lν{E? kV+9=<$$$.΀rPψXZX0vpwą`>BK޵ׯBr8E̚>ٳѰA=l\ǖ(]FUNm"L7Z5<ذi +V℄2hp9l(ݺtʵk 5Ni+ .^Ơ}齉Ό?o8[Q44)A%w^vm[?鄄g`xAn0v ] Qs]/&*{3glU)WLce^'<"Bt-eIHHH|@"Կ/Ǎގ }ΰl*\4~ 61s0rxefQԩ]f(;k gs牏Oٳe\E'!!B`iTsweΝS4v{8RlM±2;w)޶uRnC1Z4F<]t-8ܽOP0>؋,ǮBy֮\FN~('OV'G&ty/Q7o߱k^"##y^(Q g\ DFF{;m[gRXoL}FԎ=0G3SSQ]{Jv\M]R:sn޴1=uQɄ`ffʤc@__Sg͑#;];ws\~O0e, NZ˫Ο_'j'!!BYF ѮSWa @֬Yޯ9AdT!@)\ y۶3`PVX9 iWIʖ)E˶ص{0&ZՅdp~111X];)S&qrAbb"O=HaA5_|Ѣ@ҥ;jfb+fI5iA@_ #CCr9oAo"w")}@? /c԰*HSNJoE!"E ӽK'QXrK8;9ȹ Kh<}}Di/Wmmm>._".xƍ\]'OX~OdWArP`dhEהq˖)+W-7UѢ Hٸ8U3#(; fs]IlJ#P(p9#&ɗ111l΅K <>l)kڶi%ϱHS@~?Ȫ^8:SHaG *Y{$齛&ץvY)W4w"<<SSSlQ9]E]XR4h"655eİ!rɓ'Hhʭw077SdW>JEbtԪQR%KI]S&U]Ea&U]2m&aaᘙk^^\[UyDDD 7OAIJ(X ?{@__ɝ+x"oUجiLxғ TU((|ԯ҃i}%;+>9vPӣ: o116C@@IHH\=RlIO9X ҵg?H4~Y˕IeKJ?sM[ΪO_Æ```UkYM=xR Wg'#XqN`iJ]y*&t/7;>Gw):::u~(Ȉ2it"*YBȝ rdђ,^Bto||hby&N.O#44 B(6OBBE>}ķI P2R6nU]8},*wI:*79I*;ZK *}$O[&YoR2nݾKˋ>嶩07L$J47Qџ9x0[cllLS ~FEG͗T>R8Iц|aid2̔+'J}4鵕ȈH©Q(<11QK9s`ql޺cƣCc*@lҬK܅ 4W3gE H.{K,(}hk)3mX}zuk[d rAquq+TƎӓ )qLzdɒ%er*|!**џNI.qqIHH9LMM[b;00lU'$$4ț7|4VIaf?+Q>w0m/_×/_Ȝ9321nHLIsG||\j b~BMtћ.抑! ~;3**]]?©Do"w")}@nݹÊkק` :::-k׉W?I4nT`vݯrmElMqv\.KpIVPܿ>/o._*bʊV-'OnEܹrѣkgoÈc4oۖvpfߠI~k+ʖ& 08o+WNUuŹJiUM|o߽-Y]*Q8:::twLF\ȑ#;W]O4Ί'O(,\/f>|;$#**7nRFF߅do> SV VZëW'OpuZl.Ҏr *i*QB051lҬ\H$w̰c;a2nKWؿO~R'On^}%;dB\9-/_Vɫe˔c{OF9qvrSnAF 0æe&>ra#ЬI#"?}b-RDU&{~ȝ+'$88D{NVb߮mI\~C2exӳ`e>TtZ4o)Lͱdдq#d2EYد/3feԪၾ~nݾÁCG(Y8͛6DWW%s>+WKlhE-:cVVT(_{pH$'-@_[ۢp}3g:::8Uqĩ#A=vN%K$mjyurC ( ,á7oic_?q`jؿAV+QLiCM)߆=}:БcJ_Uur At̙;op:\&&mݒDҥP\9}1Ǎָ쌌033SCB0xGT&4k҈C2vd֯KPp0n#S&=dZVηŋ/jn)Mr9/_WMBBA&cȕ3'& 0 qtGH6nHB eyÔ-0Ëk^*bfn۷ػ fff4_WxV4n؀UkC*Wv@_7o8r8mmqvrC% * ܱYٺ}ZZ4i0ްi 6mޝB޽6lboaGQQ T%'Y-ZX`̑##C=Q˕ԫ[y 3mlT&<"[aiice@OO-ka=hkiѸ7HF߇7 $ Gb?pg/0iJ)Dٸ83.$r PlΚΆM[9{ lJGtܩ};_ȨaI/,}8yGp,_J6-[qiLMiۺ%ڶZXX0w4\i3ɤC%zu*r*7z$,Wdf1ODIn.,fԬQ]8Ѐ0lXY207gѼ9XV@ܹLVNlظB!27Nl޺˖ =3x@?_*eA̝6;a`O5w75s&n}.vGR٣+&MEi mm9p0!N.'g 2; Vy,-lӊ[)/|CvvЯO/? BEN) ILHԅ4ozmE&1ex6n} ؈" 6x2K$2ԭ]Uur 9yڇ͚lh׶5VVٻ=9S&ɍG5 AXz- #>>R-Ott)X3N-LȞ-S&cU3y0l@ %R5yuWӏ,!!#;jDc7,Y?g&[YnA||<,7[':y+WNd®!+ѥSd}zudbe+VG٩FM|O4+VdJe-$-haLzرkdjE*k}8/nKNEUf( 8HDD$E b֌XX攐Pr /-*,տ_ߟއz@3rF' =~s=M@tt4Zy2e8π! 状aJxogٱ]d@Z{vdYABB=zLYbi'YsHLH)%$$N.^ קpܻ*|2 !:9جQѿ>_b8@_ / {l5s/fߝߌgiaQ|a܄~k&n޺ټu7oQz\" ?r=L:ҥJ+Ohhg]M?,8V],Z\xw reg-W$2Nؽwr<}غKWWg>%mZM,ɑڍ'""y >*ѳz^D>=UN+;iF'!!!_C'!!!!!!!!!!!Hۻ$$G%!!!!!!!!!!!!!!!!ː>A$ ;rtڏӓ&H>A$I#!!!!!!!!!!!!!!!DRHHHHHHHHHHHHHHHHɰ#gOe k>^|6Ŋgk*ďcێ]9v7oP@~ԪAW(oK ݁MΜ3Ǿ~[ S>g>jϜ@OO=gbrBXxxkgY8g$$$`&#WΜ4_͚Y?3_ưc1u"VfFẅ9%O˛=KSnfZֹ#͛6K>ܽw_m[7єS߼Řؿ{;zBX~#<"N.'o4_&VKKbE٦*oܜҹCT_ziKOvzoT{-=RQMæ-ԩU9r|s5._FACLGOWgO2a4?tlM^o*uu153ŶHԪAUWz)3t]{GD:uq4_ҕH)gR>xtM[9vRB9uH'g!)}L1}QڶB'0aCҴqC!nLz׫Mv!,d4m( };%XF040$ 2쇦}\DSmmؠ>+9ukĭ q; 'ӾmTRW:::̜6 ?a3=gM.\/G SOV?oԲiբHs1&NN%4/\qr}&O#IN=z$}iټiڟq% Oل>ySӶSOOVLR߭Ѥ+RӧL~c;N | ܅3r ի1y )ox5^i*%Nn횢CGQ }}}ڵił˨Sڛ=rtݟnќE ]ԍ% Px1 }9Q:u{μx؅#Ѐ/_!޾ϴI3 oߒ5.U022Ɐ7m݇L7wg$'zHlL8w߳xJӫΞoDRA\q ;S>gػ zM+!fꌟ49Q\Yl`z̬i@͜=gL&U])fk)ӱXmh۪Nՙ8e:-Br,_|a_6Dv٭KؾOadK^_?}ɱ2?$/dʔ釤QxMu.XL%hѬOCBB<)\%NUysq9{"\z$|Yl%O>c%]˃]z0z$vzoDG')RϜ=]]4rsu]\x!){Z/kz9L"kؽgl^ss3>EE~fڷkoΡ"% /˅EK}'VVjW{L&c݀luԫSKIʒeJ ѽwTf=&LFDDp#TRwѮS7]g@iQ4g"joBejЅngXم8!=RՃ:sp}Ul'iؔ S\Zkzmbe*VvkG'Ӱ)]ʳ#ϜUQV8נG*f(^̖$&& et){MLISgж$pמ}8T#**#ǎӥG<^} CwiKO*T~lݶ#QNj/7p(nupvAصg(NzҴ?oP]Sqs?Q݇Bc'hަ=]QQsV]Obbp=**fR^#ƙ6s4s߽w?wv½oܤs8VZzL5/_tmZyvѥrC%99rEQxbb"7aɲ)I5 }dvNæ8`hV-QHav+FR^#kٱ+gΞ9è-NnT"|500`!݃suQ162@WWg'G9{HHEJhʓ>İa\E ,Yֹ#޿̹ ˩8Q_-ɝ;)m cIyԡJUzgυiɞ? +K PR&?KRlAPݍ87oƜI$4H>vӿo/,ZJ2l#y1Rk>meeIbEy\鎍ű}iУw *Ȥqd|+ $Bз7 ߠy]:'W?qCu:c'N[Urdǹr:U*;rBj">k.} e&̜:&Oڍ83SSa>=ܭF+KK=·!Ǐi׶5Vyv&3_`6]{ű` `nnFL-Z;еS *c'>jOQ]]Μ^&=&NXO135Mhg]H.2?r5.j?x7'O`_I؞-5=3g;q.=z{3f5X뵑ZPlpr (>Sמ̚>WgTÆ u֬L7̙3?џ|k,M8^G̸fي5|LX[p%LL:׻j  }{ʒsW_GN|o1E9q3]]I߁CL `0a(@ga.U^=c&Z% Ӓ000 5%KĩӢz}^M\[qsuNWNmش+נCre4`I's#6nB!a`>a3{cuX[g7f|A/glݶV WQM7Onx5F<(~‰'uqeg/ :kT'~ttY4o6Yd5} +ʰBg."/^ƭ۬Xr_T;:{6lbB'OSB9̨dWc8􉋓3aH7z42ժRFu@iN{#xmXq7qql[SS'e˔v&x66XYZwFJOhh;v{Np|dZ/$:1!I];ѭW?>~ "kV+!^<11rEΜ;ţoSxxz 035iCHH(eo{w$ϩJel)34k(rdtЎ; Kllx ZZZhɾMR}w5K)׋Ҥ]ȳ/ؼ~ p4m9>|`Ƭa_Ilv581vp@x6mgLMMxȗukS3Yg^룧'*[VPL)_Y?vH9شư=C0e*qM<ĘGV}իl*ɛ'PN oݳҕ+ԪjzؗҥJҺes!@sL ߨ(wȑ#;'-R~T}8PsfN&2ebtstgXx87+J]{lt*rE>h֪ bxmL=R}/MH$;*u6=2e4 y20g*5ԴKONY* Jvrq#|062 {!Ȝ93ffdf-r޽!!lں)r5ɗWN sL /^ЖG MILLMJJiҢ 6ma¸7q| BKK+M9e_ۢE䵿?^7ӭW_n\_u*JI*+KFٺ}⦔=56ƴn. 27%'_]ZZZg!ST*wI HJ?$ό2a,EPjVR^iGqt>q=vˊ~@88~o6U]9z_|7OAIgxHS!s׊˱i7aa7nAP/JK;7hD IDATooj1O=#N.WwPs/"&P66D+IײbZwUWgU($˫'O JS>g"X{JbBx߼M3;'QM`׆MG`jjBTNHfh[-cWUgAecr)(2r%D\7'ffL7\9s'sZ6o׆MRTs*51Vz`llDpph0c8!!!)}#"R˗0ܫҮm+͑ɔF2|6ZP(K___'iU6.v&Pӣ:23g[6LMM[uw7v˗ljS '..>`jbBȞ-2ebICeQkO xҔcPPJd2͛嫙2}.UPP =+2 Q[7,UOeydٳ 酄P(D)P:LPpZmĜȝ+'w$ܚ5ws-]|<  #G? R&i:WLR8y7Wn޺Mhh3'PʓǾjk[jתATt4kfLLiڨ!ݺtDKKKzb'VVV;u|fiaF6f)NNpz-eL]VǐA^uh*u!eMrS契L)emǏR̘57nѣ[g ;k_"] elIoRƚ 㫤q@J,ro|| nd 20CSWWŋqUL/k-3g+*-RbiaAhhJxhhHI c#gϦJ_ \<~4 oB%ޱD[uPJR I2> '&&N@ikfn1##M:xu$ 2BBəۊHX2 ٲYuҝQʖ)Oqܽ@ )o޼eY"k:LN,V#[?Ì{,Y?YJLUSPݍ'OS@~ρy7hiiѲySZ6oJ`G8ș3S~/[5^fr g_ wDqtmX'w& RUPh"? S aB'ѾWwDN&Ƀ1&\||y124$11S>g:h &ʗޫX$s3HHBD4,,L_-JL8s<5{)fSz,QKW2H'M"K 9%$4TE4oy ˛W^ߐHyS$$OzI q Тy>~ {.kVF/ ܲdLzu8x(@PP0n)+u72JC˛G{|D]Yx^Z\|E#},ٳYkd哔/I" EsTꤻ]`AtuU|ڇ" ~5ZZZp'N&K, {R0NAr(]$ԏ|y'*/G-  $&}Vb'(8XKMեP<-޺vtuuS`AEbb"oBtuU-`)RwSIlqKjm-"<9|Ξ|2'MImY[g}͛_Bff;I4_===/_4HeiۄD7m, p2r\}9(Zk"?˔..IՏ߉RQ]gh4zzz,_ŊF݄05nہߓ_rS.NQZ&'ޫ >(- !I~\bb"_Q,Y_6}c}11_X c\.&T׏^ckMn 7lؼU%~\.Z-ypST׮! w? u]zfǓyTvĭw PiToH]H>V^Օp2xqqr;WF0գҫ@թ%8}^+[6-ٷ  MDDFt*M*T(_~ٶ  s4Mn9vjL㿉1œa#г{Ԥl٬Ux{3kduʰ/_1kB<+WN>E~fJ/F,ɒ%Fg'G3rZZ̘5LڙA`Uuc?6nU󦘘( zɑ%bC`[D9̗7{9e++KI߁C:b45=a``=w :+mZ`,Yvm[EK՞J)3*eK,`LMP,,'""RP(ON-^}J(nkQEⶂ~٬`&NN>?: T[,TPzgw]L,@JBAp?EZ={fgygGqUvK|,a}#J,AxD¿ߧ%j0x8M7˛y D߯ 0MX(^0N>135S+m[L5I333,9CXc0a4޾ dr=پM+F@(]$\a_=9wJ/ϜT} ȗיM[ 5j[H؇0}go+Zccc&h݄?~ #a"U*l3ebҨC֙[нW?7mcٲm'<<9m-Sgβi6J,Aj++<^dێ]X[Y)CBM5`%ܼyeJabl3NNslRraޥ#FFY=]]5n^r V)e_|%+W5̉c}{+gdCWW;wqaJ(F8^d~:l޶ѶU ^yzvF5i$ݻp|O'!qv9r8>D2ֈRdl޺CC&uj͟y 1z,)SLS2k$Z;܌܎4kJű'P%)eu [V>}Y* /'< 2@kρC 6 #Tt)QfŒ]RLm 3~9gc19mN0e: }h(sgNث{W ٺco̤c4N.yH6 oB635eq̜3 Uj.}:ڵj5vJ/JmHƆ-vuNRLI,vTZYYWM[(uTifbjfJ… WB2{d&NNF077a4q%;z֬XYYҡmk:k?;īׯ'g̛5M ԨVo3a4hӲ9=wHB,?e+W1vdԨI.=eJPJҦe̘= )czv41thkRW&\Ͽ h$L ={ٵgdΔF ՘Uе V֚>F*dȐUk1c\ajU>tƬF}{)tuɕ+'gLT x: c Z΅j׾?ctK nŎ]{177pJg2))> ӥG"""8w_=Fbu?ZBSB'+V(.`I8;f?pbh`9:qiNI=f0&NNF066Z4nXcO)yѣk'͒+ɝˑU%h݄8_*sI:B$qc4u?!}L<^Kc:r61˗,!)̙122bafjJ%ѵVPs@˗m;v1{Bɘ!=ժVeutt5m2gƜyDDD)KIK(uQQQB5**4ʖ.őcǕV3dGZ-\cfjʢ6s#njԄ͛h)<_!˗.:mݢ{~_t89%u~}ړ:Sp!&i~eΝgOO/j7h²E馱Bu3c${6CPP0+-u0'u6e͊%C5wޣs޶)f(Wa<6۳wk7nk{:sACG2x@_B WrfWJK Z'Bp >S"2 CL7'Np.B$;c4jȦ-g``Ix='=~`*v7nRjx掵"Du[S|/ɥLi:o˴swB߁tC)\ϞzF!Cnٌ-[w9W{6}^yz2bؠD#j3w.Gvn˳ה6m~Q_Mmԡm2B!~ #}5O|>q !,&&\Eg'w!b.B!'ݻB!B!~CB!B! IG!B!71}C%iՏW!B!?IOi#B!BB!B!oH>B!B!! !B!B$rdϞESNXbOiܼ'J ѻO)i38d7;fƌM\ƌS>/Z ~uq=͂͘Kܽ#FQ~c\+WZyxYsйԠwoƬ9TUnQB?3֬ۀZNm_qM[ҼU;"##cʯ$4456EBݏ#i֪-7nͅ/1f4oMҽG[V]OQMfiKhV| 6M&MΎ5d333(UJRT*j}U!nnܿTPrEvK5{E!M1u_#)csJ?h(wAvtdJ嘓r9V$+oYh>{[i֤1&tǓwZt]:wϔi3VX_? ǰ! bF د79sP]r5.kO/LM)TݺtԍŋҩC; IhJ ÇTٍ)S~y؍%E_{6n77޿%sLjєҥJ*y>sXx3fѣffЀ~dΔy sLMMhݲ9ժT'Xv=~H>Ȕ) 3XZZвyo*+p)SZk}2Yd=u50S%c+;[VR:::qD\)HlشW^ceeIUhբRk9e8-]΋/I.ݺtX"ڽgˋ4WG82ٲ}^^,]4 ssVZ7 m4TXfMǩ3g?q + !.灛)(YݺtLfMx];u^:rgXj 'O%00,vt؞B (yRn֪-]ĩgTp)S^=*Uxq\ʖ1\gMTT6ZzN^̑QÇa|bɝn/FNyr%+b+|ʹeͺ ܸySsH;̟.;|w[V-e+9g.ϩZ:juF5+/M7ڊl۱#R~eǮ=ԩU XaRkVG.Jڐ`qn;!_ڞ^8A144{=~ƎhBJ>ZV2c݆M=n"ٲ:`fnA9w"g)On2gʤÃ6С]tXf-CbʥV޿e~rZBBɝ1Qe x3uuy"8$+-;n߹K4Vr,]4?V??ý٧?cnjtq]/'OjJt7]ӵV;C'sܽQcƱll3foLɗ7,Y#c#7w"##k0L177 FFҹ&&|6F(^weŬ_]=]+? %=Ç "(8+W@WWW9ѭK'dSsMJ*uӧKW]W>WbrZ6lB5ұ=aappR0L5qsc!1, IDAT>!Sgbi̟34]Nڒ=[6v>& ͦ[ :HŜS!"xVФa XfsKV3|>{Fɐ!=Ob,_֟5Yj9o|0vdf]!WĔ:۷o㭫Ĭ7t_?|9y'_^g c/ZA&{ks/ruFgH,^J;; *g>mCB0XeO&A$;# "ǷEc>XO]_>;;߸g+|:ޠO[ӧW#ޝZMw{O"Gl zqVΞ""#QT.^T|#c  S?ӧOGYyNʕ.sɔ1ٲfMtYӟT2eJeugjʖ.!=VOkݓ#{v>|TP^rу5O_F>r.lܼ7wwkU >|}wSh6nJ``r~mm3\CxzzZ&22waN57.TSn߹}q oV17Ӿffxz}*ʗܹKdd$Uc&vJF||+Y:{~\Mq̙C+,B,Y4^28|<]Qha4bBj>R/ 7wmnʕ-C==ÃfPReml[/7k)~"ZIJT_|}.s-dϾXXX0k3{]Ib;vƍ[b"1b}5oia,-+++<5Rptttl]>krY144$8$W^3n=I-cNZhƤә6s6>K@Vkkˏk~?G6?zбK<11__%PbanU:̬9iӪԔ0uƬ>V 48?;]]] |{[ӗ+1cK wMt4J{`歘QfuڵiK!1ϭ RF|QQQʋԟ_*uVgHH]%(((gnܼŻwVR?߼aKqYfc1ʬ"ih R j$,In`Mi󣝻pK FٿyS6R4s-`ՌWj5ϜWn]vb@}H\A+k+ܵ[bc1вVy}-JBB) 5j|j C}S^|Ŧ-hҨ!*b9qɬ,:[}QY uj>c1wZ'OZ΅?[ϺU{VJ:::i׫?ɐ>=UTJvBԔti2ivt]V%? yGxxRwIUo!b_GG bXZXqڽg7nf_m$]̙xB#WDE} -011ֈ;?NZ\|### x/_♇ˋOq\9sK<k#bfoML5^:serqIH]`|qxð!qʝAC!)1t_DDF0y8i?wi-\LT'Rhan޺g'OahhH| şCZ| @o6mĩӔ,^7ou8<ߪzԪQn]> lA˜ 4* -kV{RHÇ9GQJ!]]]eu oRbLLy֎s<7xy{=>;w yԩ?|KSaa8u,E :߇bjjLѫƎILkצ#i3fSL)i6ԫLwѭFv ::dΔ={G .[-7eɲ?_^/s>cGZCV2ҧcܸqS#-=GB0226sf6jbQ4jP`\cΜZSIGG\9yֲ>{F+177yƬ۰а0.D؇?=bjbk5-Ȉ\116<ng355҂Ganj~B!Z(?Ciduݻ=|.۶NTYOOР^߼aUwQ^UJ/F|y3n"Z4%~{0~%mf:o˞Yf9s`,9u.g04Dbt)A -S6~$SRاѷ+_jۺ%ڳ}`ffJ|04n k5yrb? c _cpAdJBdd$j,!Ga1۰{燙)9gA@5U%,$<UyU*U!je+Vi-ۻs&&<~HjQԫf: 3LbEL< c7O-h"}JV._@ꀷmnV8~b| g_1ؿ{v#[7cVZMiѼiSm&7ol\CsϜ5ݻw4j֊ cGk1y TQ :H#^B!$ZF*l,"1MU+B/5/ x@ D}1}DHq.'`ds/JT¸y6iӦISnmܭpYZ4kv!B!$#DY)R RZ-лg7k+B!B6 n%mxt?llR'h!B!Uwke1}K,B!B!~y/B!BB!B!o(ݻO-%.߯~B!B!HK!B!Bߐ}B!B!~CB!B! IG!B!7$A$P@Z_VwtB*Tq8hrT݀L1v9lݾWi}H.\x)R(REW\%h˦-۾zNdb;I[amp9Sru>? Uy -B?JOжއdJ7iAITQ |KWZۨרFHIW<R ^-\"%]4ү\N.\qЮo)'OtIs&LFӖm)V<+iծ.RnCFF33d_ԨېвmGw:gtՏ+SV}-]JJbdٻDқ8e:{Ciݲ8t^}2d`?֯#Qr- SbؤNMp$BB4=}=12JQzU\˻C8ϜcGDЦe8<$o3amm|o)9gҒ*t*&B![1߿K>x<N&qt́?[wU,3<}ʲɟ7/3dVp-_Vlo?7o!}tJwH2%7oߡfjoA__ܹ֯G\2NN 5ϭwزu5kTyFe\~-Wcl=+011UfsY{oҬIyXiAtՏt2qh^~EKQEٽKrO$>VKWPpoƱ'ٽw?{tUfJz*3n"3fϣPgXБɝ<8tO kĄ-V}RTI*˓;wO)׏p =6xFziש}z B?۷c/ZG,_*ӶcWF{q,T(_.e3g‚[PrEw5U[oݾcHHx}+9Up-G8lڲM>sذfVVfڴnI2P$[۱IM nߩ9QzUʕ-ͱItݟR^#JTk>MW==(R҅[._z݆x[נ^3lh*TEi޺'NV/X-RƵ 56 R7iYzLKvRT,\uRҥ"ZSGF([ ]{+&_ʓ;^oR0d8.2Z7q -v֎]{(RwublݾM[Qҥ"4aӖm_=,{Uv_k77gΞ#,,%k;#ipo*B!D\+FZqEeP?kTܡ^鳼}HZѧREKxxxCuv;gTѸa=>{Ij5#A{-vPnCʸVa%T0_immȗ78*i|buv#)X T^%M>ߡhB?ܹ{%K```&5yr;r CGkyTHPPPܹ{/l__:tٍiSJE<>c~ [6gԉٍ'Oge9ɘ!g-ݱźy ~֫I`9}Fp fNĦuP1zoZlj5SϢw޾Ŋ0d(b_Y/_FH2zNN\|%޲!B$ְZ&֖CF?Çs)ʖFWW׮cffʚAqG*koTJ*W^}*ى>4w3GvΝ{@ܠ %c'N2}\ʕ-I㰳e~{|_#4=xN/zfFWWgq%2w<ӧWDu xKdd$Ҧ3OtxF)R V+Zss39F%4Gؤ`aTӀh#\e,,(QF@|T݀'O`oMcbb944Lc=mENWK˛e+WSL)%o*qcFafj @Nܽ7o&/2"|gqj׬ʕ\iX[7E ‚#OСmkv&ƌĚж5:db|βEWS*بjzuJ֙pEU?ঌٳnx"BQQQhD x"4h҂72z0|||H6McmmtuuI&:V=xr̉Mx<u֭ܽRuv"**SPAnݾSrsJ/ϗVZK Ŋ822s`oOwY.]ʄcjمKWW#Tkwib?S⁛~ щw/_PbPO%,L3@bgk|Ȟ-+wWAx*+ƕ(S7w 4TJm/^&h1="<"4+UtF>A?>c,Y U\'Mťliz誑pUiyuq%؉Rԧ@ԷnAJJ[ B9ͿgOhbKK^EfL IDAT< Imxֈ?i8B!\(ťlieIֻ9]:%i,;wl۱Kɓ;#JP;qΓoݾC 0<}}PByZl::?.1,5g4DVBT]C@}6W+"!3fŰj*UpeǮ=<} {,9vҥJ(iުFzho|| %Vw,==D_#>] 'hD!Bjiiml[y{zyڪ&22??RNDYpϢٹu~~xzz)uvrb՚DEEq9;ǹm??j5_[ʙ,[5}2ٳe57=$w.GFKgfjJPv*P'+W3o!C1gg``sܜpH>ܻժo;Jv&Z;tFO{7__ͣ@p1Y'pv% sXԙXZY2fp튗w?S}>/ L -]6 Kjkk;N:yS&Uy0[0wV _4;Nnfffь488}}}B!xsr$E<}*[:s(:JJ7o&2@\}7x" ]bX[[1@PP⧬O.[dp-kow VL4^^ ~,v'F xƇvh-[d9x-7nzts4ժQ.jL+>R>?G'W.=~RH.mZ)\3.hs#4, S洧Ng` K9e@O3GvUMrե GȱJR^=!_>g xF;[1g~mLxyu!BqԧI+8}yrG{Rv?qJWhhV ] ?hUTZ<ȕ+Fz>ggٻҵ Udϖ VАlYKcL5=:F$D>ܙ7*Y׮SGchhHBd"I;|oBrԭ]Sʔ*Axx܅mBБcѬI#RHss3?N:C4[[[1d(u鈞 ]T\Qc{0mJ*W9x#J1jєСkڶjMj?~4oژ" jz=N2r:6mN,v/JXVV4jX%V"[:r0cGT-vnf\ʔ|y}V]o7*TZsn޾ôIs`ڤ>%jllSv:/ʍB!Dba"U*l3ebҨ֙[нW?7mcٲm'<<9m ++K3ΜeӖm*YVVxxɶQze 朿/}{uX씇`llLVx}V;QTI.]¾{~j"%K>kT*/-,,s.c9rI-1wg8A0{I?Fn֙7ojǥLii@a}zM}eKc:r61˗,9On> ӥG"""8w3cdd Ԕ2Kңk',ڊ2kx9'wǨX<~~̚1'씛2th|(H**AiVk17_MV{>zLDDimڸ!_@j/\Eh,͜1055E&t+ڗxKx¼[ty!W7zb|Iׯ=iݡ3E b_e 6ΝgOO/j7h²EdL!>ש[O ,HN4Kbώ_!BhΜeБ W]!~+BDŽyM @8DQ#c2dHϤqc8~ ,OM:k{klmB!/Li:o˴s8.B$9*R=/Z[[}kԩU#&Bԡ-:MR!ď!Aþ'}t\>'F5i‚$ciB!"},B!B!~CB!B! IG!B!71}C%iՏW!B!?qr!VG!B!7$A!B!Bߐ}B!B!~CB!B! %z g-GߵZ#g<#g4k҈… jo RbqߵmԩU=2ݏө}[ʗwyv̙9 g6Zמi۵MkϜcxaaXZXDZ5]ӥWزmOy;P\YZ4kB)8f!Ed@-qʓ;s/Pjeڴj^rM$# fΞˁTѕcOO/\JSv]<$ݸ@yΜK4iPIZf`RˇWSf-Dhj|^h ҧǥLit/oVaw)EXb?f娤WJ?i kV,E__^suzNڟ5W%222QTj ,e~3jWҭK'*UptqV=?VV?B!JfMiԗ&K[:N9=ܱ=M7Xְ~=9z?Bu4>W芞>;waЀY5Up-G9y4YZ?@Pp0Kwظy+͚4N\x+$d %-vC4WWkYvm#~&}ZzԪ׈\Y~PV]4h”i3 7sYF@iڢ nOL|ǟg[>0{|ߘm#ZٻvQ.-t`=CBB|*n?U2*V(Q044}V߹T!ʜ)+9ϜeTYwZ;2xH8H^^pY=jq-|ݧg>!9ץ^f,b=o5<%Fܸu+4._ʈ(\C+WN8d8y1r#"Yj5X4PEKӵS:cypuq=zc z膃}A.YƦ⹟*/G.؝SR1r8٭+FFFl޺r.&OӓO~f8_DfMБ|.g* Zҙs-V\qW]g1T(W͚UkfR:*SSM5`L4|y`fn!fϝc!rdٰi M7h+WadlDҽPC %ރ\2d2nܼ[ ș#CCVYG pr,uvuO,\ kӓ߻BQ#016 /R{bzvBlYٺ}&Naˆ5X'N.ۓ5kV:ɓ- z1ݻvʚϞ4nj # !x=O!ruiXZ|XfuEre(y9:8pu)-AAR0y %{V cOsbȓR YozCg> mٺUk֣KEգ3?_N͋+&V'صZ5c`ٓ_PKxx;vATRZtϏ*4rdφL&㹟v=]sFo- ?!( 2fLz,oyixFܚիQzJJ!w+ɐ?Jfnn93eȫJcΞ;/MHߐQXn]{ѭ7C L8L[͎ܺ]{Xb)rcY=V'yDb҄˖ZMN3RƆa#Юu+f"gq9` PхK8{-7%<]]L/^rqLLL=v" ͖U7o)SFd4W@GP(4LF2I)H{؈̙2x 8EHHhy7i r՞dΜ#F[bcc2|w4s3ss"""j~%AA/WV\.\ܻkjKIק'5{L3c޽g>a*Tk]ԮH;ᔜOm)̚>.:p Ϛǽr%ϝ1/Xc'pAEBST)_F' z|G-nia._I27o5~n+'|  NtIDKKK"""4 5>h]r!N?ςOiifX|ۘT+ /cђ ԈZ,o{uK#Jm` fjt-uo#ׯ_XA AAX%2dȀ[U(Jbيl߹7n& ,Ϳ=\.#![` {"/NvVL&cƴIx^y󉉉ɱ}zZs3jx,,,(W EFFQ(AA,$4TPgӢ%qqq|:~A.]J*Ǐ 66DF7~5۸[6ϟW>!O<}#Gȑ#4^xJ"g+g w}a dמ}Zۼ֬CPH$djbB|y9t#$!\tEk ""#G--9[|}zk׮SIFz155%ܾM9]]]<|hlٲj5244fuw?.Ѭ[333iDW8YߋGc#dZJ(o^;tuu9wR8礔(V.%9{/VfM[)m==]d;7rI IDAT˗HaY2gfI<}ѩC;c~MlY* ';9Js/b_P=@jKzzA 3^T |ߨA}^`ێZ#O?Ivتe\*L,(%s&m·)ZnSקXBW9>[|*v,3_Jr%66c'NreZ4o*uLL6r #Ff}ŋ\8͛ 9&Uk/XR.I{Ǎ`I,,5ʖ)E;a2:Ј۶#בӨ2[N 9&SŽFF~.0_oRܜ-ӋoRhTs?0qh 9@保;u] I)??!޳~~L8N+ BU)A=edΔI/rTϕs^J:('ݳGU.D#k,0޿ט0<1͚6ɓ0͚bccgdиa4}}p2*Wr#[,DFFiv J4g\|ҥ\144$GlXYYҸQV[>ʕ(_DLL lݾ4^aAAHL&cő=[6sׯ;wPK+K^xɞ}^ݿcUPsoܢ\Ҙ.-%oE ŊaȑRm`ohծ#}zu&y6`qR} >*ѰS&RҹDwAC)??r@&sORG>>s\+k+C8|!_ҮeuŮ={5n-5?5[qwt$}ѷ4ؿ/ 9o?<}=E:s̜6Uk3ml(XժꕅΜ+pjm[[v``@Μ9iIBXsU{Аd8y[P(022brȞv[reΝ@Tt66TqDͤN9ܱ={`,<ݣT,_ᅎUSf ?X8oWbő3GvڴnޞFVVlڼ LMM(Q];wtlז9/` DEE1}$\]ֹ#3eb,Ya .Ĝ gɘӭ:wG;J ŸK&1v_ȓȜ)ǏX#5%!|*BЁ=dϞ CCCvKxx&&&-]kyطW)̾鵚XXSɉј[h̞7zajjBƍP*B]W)\7W*I)_LiN K,t؞Hqanf} Ғ 0z/΋(|S̘ƂK2}&&4mܐm[wքtU /9`"[jM/&;qzJuzݟŋ2fdW,֬-oϝx ۻW1th 0vTzg:t(ko`5{AA~ ?4Qebia^x D( Ԣ+ eɜ3:b?Sy䉴BDRʕ-M-Yx>WgsUmoo^Μyzƛ?{iռhAW/ |-1'Ux1:~Bfff :HZFKڵiE6~@K sd+Z$CQB9jH|vAA_$D W+Zew6ҝ9mZHl  ûAAAA~CGAAA7$}AAAA~C'ːrei-    GAAA7F˅    DOAAAAߐhAAAA F4\7Rw :u{u*UE>pr~kJԪRMO9ӡK$?m;vq50\ʺq¥4?p)FLLLJb ЬU{-YרQ1V|c _JGEs [U׮qyO+ ռ|J+MZRM㯲GO9xnhd'.e8ϿW]ǥoRVGz).exi;=}Δh޺=WsZqJ%Lq6TpN՚uw 7oN>gA: Yb%qqq-!Ffqm݂ tΚRdɥ+Wp-i?y=зWwڴj!ר^28(]\>z B<}p.mRC?X&&lݸ/ZʵֳOniǝ>̚y:kѡK_Ak뢋G\ŽZ5=h߹;Mbǖ&'OnT9cia {Gյ^ݺ}߷VWZUw NDdV\e4ª{{W;~y~DVv%<BqMuƛ5~[®ˇivuJMYj0끃(Z[Bdhˡ#Ǿx-AAy%5h߹;*UI6w}TĽRE#CCvW8QNz(aIr8~NGσP(hڸO=IT*ܥAxiԮߘ 8dA)Tߍ\u&&d`Uݹ)QP;1\z=s&7 \K:ӯOϯn˖AXȞoh>z \{e7WJxxxx߹s\7cdhDCd5shnuOm` ݃Y&SzU>c~ m[d̩݃'Oo0iɖ5+M7dέ۹ŋ&zKaV7ițǎ3iw'N2w46_JcO҈wZlXj.T*7h({CF 3s*ڶ&(8X5<2e8Ə9"88H]9{1&Tȁ&Q篚xZ4⥤\/_*uN._IuA0b8jTƬiɕ3'3_@ ÇTr辕*G.suLYnt4nT^nfUFJtxE ;cGEp 'x{=}Nxx8E$^oPbfND\98u_LP>* [REZ5;[gɝ`A9W(_F[s)4jd&f /ʔve်\cclشvmZIVr>* ~IvΟ?/7nI5AנT*iբt)5kź 7zo߾ so޾E.):Vt)W bkcY=yjixN(JŹn{S'BܺMҮRo"IZ 2eJ̿|lEKuO93;Wt'<"SS!\r##C# ' 7̘={HWKLr~}?ãjtttRY5Hr)5 ?_^h+\B㳋s  b]z H剹~&}VFT"#bbc^I#ZUw?xHdg[jȖU=?ϙU+4J,]z@YTRCGp^3_4~rr [$|^g)4h҂ )V?.טX=~LUw͕76v,$M|7YfIruJժlAjU\S'XȁACGs~zg뷔Ri>w;Jn)wKK tuu5A%#pqtttpq.!._ Vzff'3ӊ% ⤸O>wATR[`eeL/[YjbmiJ"22C iQމ%NBiצAL%x۔kx866IkLL  ܜ~}z%sf 3~R5((J1J]Ο\W_O?cKOD  o,--D{( XI]nx}ܺMPP0q ;9zJ%n{Sp$ӎ#Y'3H/,*EێxZܙ9g3SS#"4∊8Ot*.a,(X_@Ph= {ԪYPOv ۨVzh Ҟ-00E5‚Lu W707OXN9%njޮ~  &᧥:BBd|/E!KOõj **ɘV۔W0I{4MMcVd2i.x%l#""]]]#AA~m!!/BBBc!{ 83TVEkg΢T*)V$/C.DQ۷ɘV^=>p |%G:/S_/o?Kܹr,RϟT*ɝ+W{ 17v>x͚6͛lپSk+U(W-nܼś7oս S&_X.K<|$}~܏Gqc'Ni|>~4Y2gJQoΜ6sQ:uE6dвyS\J:z;A r:7oJ'w\w"ʕȈ<[YYҤq{BT/_^=[̙15y0CB4I,,~r-_ %1|8:oCx6>> <{j-w+NF:k8ݻtbL:nghs89:htָ.>\KA_\.g(ș=;FwܺM>hټ) f] eNA6xϺ hѬ>[|6NصN°iܰ~p)Tvjȗ7БR@;;U< |## ZF|s0CGȐݺP_)ο5^˗`R8rA(Y8EK?yctC#]:1el (̝}A}}}MHH(r`T(_6yT*Q( zr͚lڲp2eV335eI̝*"sthӊiX&\ +M7k7p,Ծ-:MqWrk JSƈHܥC֩NSAI6s?!K,̚>;v###V,]Ⱥ8|koDP`ll)XH#1#`2Gll,:J9022b˶cfjJeս [[[-kV^zE/V ;Ҩ$j1obOFaB ܟiċS*z"ť(,BBByˆ5cG|y177gێ]aeeI!{LG63SS.Ǭ=~&jLk]ϓpo!_r*$4Lc&"['5kMωY|ezgGH#\c5i57oAD  z5.3k|ΝAHsbxOʥ3ϞL>Km݂v!WH:;k  DtjON9 ߇'   ŸK AAAA$}AAAA~CGAAA7ꉜ#"ߥiWAAA8(GAAA7$}AAAA~CGAAA7$}AAAA~C' ȟ]fhۡ6JEVpSEKw@9{-ڴ xZ#|ͺ > 4hq IDATp=jqT3)7giַ:},!۳w?7>_vwZбKwh4t5ԧI֬ZNN&Rzy(?}.!!ꦾɚ52U8rБamm BGp3e߹CEGGܹradd )ӹc{e˪&mgˊek:5vqf̞#ztАoh20jPd27okZjTFP*{iݲ9:::v˦-ܱ=yrs>[>^Z5qXŊ(iy?JTd˶f!靽?RDd$ cF[ƌGN;{B:>ڍ(Vɐ!ĩ>'Oե$׮HuZ4K>xBy<|\.íbyܽKJ= cVy.M1+V6q49ı7o2oBJ0y8避Br(9(QjT`ϾU(AzUuLN}SÇq%+T(WMR@?+W173cd2\J:S^DPx1;@>=pNAbbbOli|V]]vːA5^ ? `EXZZlEˉ ߟhFWxѭkonqֹ#2 R3gսV' |}ȟݻb;g% pQfϝ¿p2<}J,Yѭ3.%ȕ3'&&ܹGݛE ;w)'O>* Bꆢp4i)puQעM{WJ9r8reJӷw2d u--YߋΕ~{h]8֬ %gm݊n&9uc˝Kz2mo~8!VPt)zt댙g5pW\8=uTe+8~:::xTBO.=(S^|*]BX"ٝYHq=Fa'G>8p_bbbȃ|ul߹;wK dʜ{%Ӹy+ %m?t`!!lӁ#qi߸II ﯫ׮x ^zEӓѾM$Yf=;slmlVvmyOuwTR } Oo޲"00ccc !yۛSgP:MHH6maæ-L29'ZƎҺEY  Yܓ^=~UoQAKYokZN,aaaEq.Q\Y6^pN 8*Or$fOg2O<}F.pXk~&!!dʘjU+ӢYSB&%?`9,]mCCPHa[E֮ȍ7)_l:NHObNoPX1u^RU\9CsP72Ki}U+1fp9} &$$PT`1ݺtdZ/J:`) ppݻ>wXG?yJTTwXs^tutXx&򕫬io1z,;Z5=8ux+WuN֩qɝ;7&O )@Aܻ\.'{PSγ==jqycU]K'yNA 28FBpGCTJҼiLGxQc5Zb%C֌6/_}DEd;/5s g ^g@^>pB]~GG2uۛlٲj4*Ɠd+[_焆JϿp)޿)K Cش~5֯x#h2\K:jRtly%w0rx2gĄ]LvJbPՅ>=a֯Sfu<|Ėm;x>)e 0kddLzu.Z]uʺ{%ttt>sLRA`7bP~F;VR1rx8IfM4~ sbq<⥤~ccc֭^sfp/X wJb Ю ׬\2bddH:i<cϾ7s7h(N5<]|[صZ5c`{jU+gٳ!x"r% oyϷ111ե$'NƱ'OtRҜk߶2KѶcN9KíRڹեS{/_ZwXa U3g wŋ]rdώY˝2f_8r]1ux_OOsKig:kCfM(]ʕׯ_v&ʖ)=ƽn{Sҹ=]\]JrXݵQ&!ˑ'ѠS!-[i^22th.^,5ԍ:XchҢ |}ɝ+!!8xn;Ҩa}J:M{IAW @ 5 m۱"Iove;~իߋZAAdɜ;>m ۋq0eLd2vv)_ 6L710x3j ! baajlmlOx A~!̟7K-126bԘwKqfϐ꺥\]xʟM[1| YLm֥#fѕQc'ЮM+flJEm5zgWnŋall̢ˤ߲~>3IiW UêBæ-br-HL>ArH\E42j|zV/^"K{ҭsGwM4@km]Q*( ^|l^>š5o?Bd%00Bd2 ݻ/Vw5֧xYdgwKiVQ'R䴕+UdDGG!C wFWfߺ}… r:oJVRҹ&ܺ͆M[xKxxËȝ+?FPyP|Y=u~}z+IY3ڦ|ص7pq.u {wwb~3`ee)u 'Nf/iLioA~5vsi<ȓ;7;XYYjOKIK@bPTO!*:i6ϚC-?6JE:"O@4|G]ʽl̚;kS((]E+NLL Fܜ];)cF 2m11\.@#LGCgKs,w6c YfB=.Աw| ? EE'\mIGGGc)`F=4Ƨ?[R|G (Z؉.]{t 8z>|4m0<''8(X4>?>gQTr@󦍱D&So?,+>?VNK(|IN䜜pN==Ùi+ J8񞍵5߼I2ׯ_me%r-BgϝgIܽ$_ssUWpH 20OñJzޓQnիUݻ ľբC6_:rban΀ g̛=\9s/cQ~>|'GG|l c2O,Sw}i} A%,=NHH(kkN0T*ϒ:>—r>¼hצŊ{̜3㱍Mw-޽{GҵiK'-SϤYϗB051!2RGO\\QQQZ=_Z'>iڍ,_E=^>_#C )ʎ]{^9Y=z̋0e[Kq]fAV]}kX[YI % M4>Y|wHH2LFRɑ-vp d2#C ,\7nP(prr<[Y[ XZX0| ͛Z1L.H f89][IqxEfæ-j/R8wٲfz(\e㉭,-g}#M333!{2%d2ԣQzy'NrfB'Y\Θ6r GGU2fۻ𨪭ߩ iJ @#E. HEiDQPDׂ`HB*'dyd!yy9m 3{Y{vtLuV^gHC2ٳ1y ٲu :3!!1OEED`*/s3fYg6y*?KwNz=>ҹSG{@={lst9''3Wj׮ ?O(S"""8rϲ0QZ%WrD o޴kۚ>{d>9-=xpӨQvͮ]4hYR^=o &xԫ[-۶,c6o-@5lg~ZZ5kz4j ,p9 bPJTX񢿨3_.ocVhTJII֯Iѵjju۶Ҋgfع+eR%"VlYɓ{n`> ?:LLc͏ٳ1z31l6O9sPn6lS~ek7%::Mv}^&+\9~Ud|iҊ2fiZZ 6m.lL:eJG+=]x=m^^ϝHz{~cW,ZB;PF }f\'"rySN<ɹsY:> ?Kod:L&V^N9III!(7by\;)lciԠ>&<6&ظӺյl۾3vfM7C>>0ԩS3Ky{ {% 3UeLBAAThӪe kfۈb[ }f -E}X{As.O͘m!((ի}ǟwgXdq,W#wQ1mS>X{z!f恷ʗ_}'[o&.>ߡ^ݺnwMf|l9?vmڰu6>ķVPhh)zr\Cdu)?VgΞe˖mnՒ;V.7,G< /b̸ ލe+56Ȱ4n܈vmZZSlހApp0Q28՚yuۭ7ŗ_3itéӧ`r9mӚfM0gs@j֨޻Qd^P~=ٶ}G㑴"U8}g\ۢ9TӘzl۱gcl^%o-\ŗ_ъ{}9 y"}&ڴnE%.K (營2) y>ʅqa>-}?0mӚ͚2ɧ8?5kT'11=a1?KgXxi,['xk:ћigvNiތkgnT /fV Nj2'yɌ$~{!ǟ %%_~񤦦fYrxuKx=F=8ujצjLf{Ӫ嵗O'vS^\'Oo| /_R(s 2AAL47E[P|w 7_=G???j֨a9r4˴+,>3G+VRb8/3_~gΪ՟KDJLz,S7nܐҤqFƍ߼Y8 v>/r:%r2e59潵nm (kM:A濹^E54 sGz͘qҦnA'O~JWgh;`1II)]f͚Pf{|}Ҵo?؅|l9s'!!ѻQ#|0?[K?lL CCS6xڵjz7fo.\̨q:|fU3x4͘67/ɧPJƏs L&}f ÊOVGXX9zt&Ұ~}>K|*Ud1?VkX{ԫ[_M6t}>2 0Qf ^6ψc8i*3ntt4'ufrr9_y3JM3.ua,.zǟxsT  ynT&M}O>k_A}&ԯc0d21c`)>фSvm,yퟁ'5%Ͽ8TОf3;'n@tt4=.k[4ga>L;)3Όi;a"c9fRT)n7.g[˕eyծm~q-_-KL"HA"N IDATHA"HA"(߅͛v+DÒ8pGnfDDDDD kkg~(޷?|(ѽkk0~~~9vYr?}`PNmyF x:E~߱uŒ?_XkT`ͻfs3پc''Svm

    ( ϥa>?TZ8\uJb[  䧵4u11 6vGō]nR$''gk:b .~5=q }t4*i;-\NÇ)I!RЧ{ """""W=p1̛߳{7Ym?Axxl+ϧ-Yߵ u +ViѼ9͚^=/OJDDe>z,[7c6Y8~ݻu{~~PЧ3E. @|Bw5ࠠBn#7m!hF_EJJ 6ṇrCw"99&Ȥ''0|czЉ/39(۶a4U>xv g,""""Rrݺ,Z%#G0)t"07, 6{yoҼY1ջ,,#<΃KJiղq+UYst{7m1 -@x*%""""nn-hӺ%>w_䧞lL }!w9a?ƮCCC9}:ȨSllݺm}|]~yc 97 Lw7}]:wb/{^Z̾DIHLdռ,Bb69KWp38yҠ~=zl)W,ʕ,~Y3+vfT\{rHNNVb} #K?vt IKڷke}!Z)$ъԭS%On7z?DDDDD`9{e2:gϞlZTɒD& "ufJ{n&MAd̟Kaynӟ;w1ɧӫo1Ҳv3f3g<o_@JwOʖ)Ù3gwYB2ۥQc)ʋMjOKB58pPA2TZÇ,;znjURJP,we̘:S'+B:ٺm;ժVr խsǸ'Gr ~Z'xsbNcOpaZ~}d{ji ||[]K`` leq\T\V³*U#EK%99mZOk3vB~YcV\E^=8s G&Q'aڌYbjTNbb"#F0KZ~Aa[s4iԐ5_~MV⚌<~o֬fHF  -[9r({X9x ^È1c:vVӺuKʖ)C3+NGG̔/ 떛ǘǟ;R~ws2s)Z^ۂs`M thߖ%Cرs-I'xs5j؀bӺUK+rժ2x*\dDDDDDJ>3f́ d y>BKɧ)Y2ki_.7w^ t/>?N{Gn7n;s6'O0i jתwдI#>X 7l")9r5xw>n'+qF\O?Tʕ4qڶ\ٲ̛ 'OϏ׵c2]ݻ1 oe~ApPjդdɒ|b%11.J1m2uj׺6`:g);ngvӤ?PԄgȗ={2&Sn޲EEDDDDDDD$ꋒ~0R%{Q@$pO#"""""""R(#"""""""R)#"""""""R)#"""""""R)#"""""""R)#"""""""RYC|BbnWݷ:ki۾ߧ\ֈȿ釾e RHHHHBΒU^8KcipлcϺ|.g[,~,=䋿\@sRFc7frQJP3MN19LJM5g% Yd`{رi73et P'L?InVs w g~I3eL &,=$26}|ɻ@CبWL\,;evˤ0)#Wܜ֧Q|}DDDD;jp:+)y+WV'.hS̘6Bl&V\4Lrq<٠ULs;m<Ǒ+6AVӛ9b0T*0sWM+\)SX<H;݄+LWDDDD{?`?ɢ' [ 7};C~=~I7 Uɒ%#ͮ7Od R}Ō&FXA7~:~\W‘ D,YMܞJL BVVqR*62&~rqsȍ縻]Af^iego+ v~˛i^B`.V'a}n>dϗV33[ؙ7x=KXᏭ[YZ_j<A\>?mNq$ԓy8O7S5ćH6Pv\f'׶ֱa5$5v6Gg<4LpŚ\daBc;rWN8l`5-;<}#|1S)g6nfG717tPĸ6ܿŚ63_OXq$jZؘ)Pg2к6Hu`aPu+pr MDP3~*."""Ř ǜ,KvңMpciְr[5+_b~%&Z5c7{U3.J_f}IMX!NXAR./' x;ܼA ir7ͳ:!f&f}M,&=AL&Ofʁ&֞}N20 0;)Ho!ݟ%֭u9{Ywi~:[E Yơf#?Q7E /a5+0>g0ei3t^?dsvX78EEDD3`Q'_m96~Z+JLR'G'׏ \>yqg υwo9&eРV*9zj65S)Sٹ v(Yf6{3aZNS}IHpnH q \k5cCg d\Ӭ{fm_IE|,O$[$i7ns-.fr0Z?ꕴlSt^ AYs*_խ/i&nl*0Fdd:N&6v{>2['I}cֳn\'-DrFvW`^mUw_+5""""W_OevE2>iRffO%;'' KPO6qG٩>^t I5x52XO9l0&l;}B}!&6E}a7 NO` UMn`lhkO禔DJjbg쏿zj]{XS"?N~`1}. OP^Lr)x G 6{\n,'<68NR R]5yIkyP Ove dlԱ`mՌOPm%Z VQJV_b!'>EDD;_iu0+VRff4{ov3m[F &6b7,\S6><1(٨sB}~lEI [ )obj3;ܼ} ,ᝍ.^mV_S_AVbSMPbMAKyu<F _s!n#KqᝎwBTmY?:]B@3 ceeK|!5T 01T,5ljVS/'U9d_hd1sQDadNHQUfɀ/i3f}eL&Fϐ(?P'̄ƞLel/sw>s)] P<6j< 2pA*HYJ4W 0a2yjH%Y3&@ڵ 5)P% u}*[[L%=3kXz]nicst=(?2,d|_g,ԷMBvxx7 JXu>|O|rI ,""""Mrf.g醮>钜8e:6Z0yklhbrSκ Og1%XҹÚO ƹKFzP3AV/ Lnjj'9|2r4s8AA9͠VB[Hu8\?>J "t`aSơfzU%"mvMm|r7BL  F5q$ʣNi[.y,M26FIv?\g0ȫqINXʻT71ꨓ'U}lʱd)<֞t47Ѻ78rzH]IN=qNFT0xDHeЯ I6QJi39 Vqr{u+Dh][{YԧaW% wQn}XF:2.ֹmpV3\l}2Kpa[ֲRXdAfTۧ6-cuԥ Wuѭ)M|vE aeo;4㱆vjy|/vʅˀazT匛3v]-3D o7EXxG\/):炷? AƸY5 gbY7ou0;a3RXJYs3X},cfFn8:M93)T:VM[`ʶ<(v! Nv@mK;t PT3Ry~V'sv- fnb+uӣLL&'̉t%"""RxfZJ@3Q)!G2]`\zIàOe+=+Ys8uZ̙:_|vf2<-%m&ʥM2oP Md" n9󆂙|ÅgLܒ},"Ԯ:>r-gǟ;9t5dYOع3x^3V-[B'R(#lHu8xuDʔ)S:_DZX-Ԩ^""""RkAAA9xAv &&Aߖ~|ņݫ+{/K}} 3|Uwϲ| ˾}4jԀ|͗ӺuK?y}OQ afZ]{uEΝy&e/>?=  bo\DDDDD2y~T""*{Ճds p+G lTٽAA,X6Ǐ !![L= \fy}OQM+̜.'N2b8w `5}cMv9x Cv1zov:b ko]?mbbbiٮ#OPDDDDB~й;c=y/s']ƍuJ+z>6n . Ñ6:4mCA+ ]SyQdzX,Wj֚3S&$8 *aa. """"R,Z;\Ǹ1#hۺgo}~^dž1mR;~$-]nM@z5WcZ 11,$sfͤm'*OH_ r -[\ͼѶM+&Mup8y}`J*H0 \m4遟^={7oٚ;wFQW 'MS󋈈-55еs'7vqRr2 [và:Ĕgwt%mHJNf܄ cG|1pw @mݳ; ϥr,Zn $<o3gÑvξحkgN'"w"rus*c9VlLlT1) 3΂yr`{)GgY{lt3ؼyKǎCBCM&SPVDDDDDDDDrt8NW_xON2 8g nO@v?|N.""""'DKd${z]%{z]w%.)xfJ7~晻\dS'dL۞6|>6f HHd.9'8=>]{Ln6+mcSδ)i˝i*GDDDDD3Dr3a2zdy|@gA Y3DDDDDDDDe'^'KvOf}2g8}OEF)Xy]nn|={t͜fA!\n|te)ޜم6>93}ole+/ASM,u~0'0teנ)EDDDDDDD`d9?'W (#"""""""Rx.BB! IENDB`KDAB-hotspot-41e5de7/screenshots/tracepoints.png000066400000000000000000007230321515036260400217430ustar00rootroot00000000000000PNG  IHDRa\ pHYs+ IDATxwSvWhG{F#H *hMOE`El^vg}?vgg>m׼ﷲsWMmG-    )z         F@AAAAA !FAAAAF    g#6D5kEu\dÝAAAAy*U~OF_mR}>Rf.~J}shς    mKU}N80BZ )`˶EAUYlƴ̈㛖 A2 Fc}FcݟpL0 tm'Gڶ;ل5w]Q,FӴ#j{9    ©aCm&hM`F XGC"ĩ9˶>EQuUq}߲:]ŧ"kqq#&&EE.~ Z剥k(~L21-c&mavDݹ4 UUhdt&Ө듪8d&`mwwN   plR\EZ(˲-:u*UUULr_}keYLTU4Uò,LIJ,tM4Mw[lnPaK4k!݅`!fNߺyW _0w:,:k:ey_~M(,,׿5Xa3Z'* . ''h竡7}]6&&)l_Ǣ"-   ©!@WPUݧs-73fƌÙgYgkFJj q?k.N&Lċ'2돳XnAC-§ZZύW^^κu11cm۶;꼂ф;\ƶm4.T=RXX/&;;~Gҷo_&L\uةcb1LDBEuc7䴡x„ lذ$kkk/~s=獗u]<$%'?XTU]0 ݍpB1^h߽49͛ǣ>zD}vRw](   >U\4L dƌ,_+WrJ&NO1rHt]>ۏa9~ ‚ x>m:;v \a*`0iĐÌ3;*@eXhtޝYftK.ƍ( 0 4M# gYr%eqsWiz+\wu%\ʋ/Hmm-_5O͵^K's 70d^:tHff&4nܘS&3~xO4y7xO_s&+Wd)).q2qD/22zl^]*3gQU7|.%Kp7OPXX(|gkw}ktލGeeiCq-xbx 8s(cQAL׬Yù8tUAaaFEL>￟|N@0-IIIf ӧW|Bm.մ̈>/:Zn!t Ⱦ}6m7n#Fq*Ҷ][:,tMNcn     uE]tǏG阆Ijj*,//?/ \hFuuuwmرc9soELrEEE94o}0}t,´L4U;1›y˲<[nL8WƾJ۷W7vᅲTFO},ƍSRRA'ayyDjOSO=7z衣7mڴYfZ/)S8**KIM[nc]8h>|8_5k֬{m۶㣏>"--DX2d^z Ͻ(BBB]tW_#66Զe'ܹNOEU:gJj i  iҤ kMqWXXDiѢ^RuF\\wu5bȐ!t_9@@OV7nLF~)6`LNN:csPhd\ۿ*E!77J1AAAA89`p nS۱coǶl233#8d6iDVZIQqi?|@Ϟ;g}tٱc111dzk.OJLL~W0rrqݟseҥE׳^ߌ 4]SN V&M|y,^ mڴ]vy0 ѧ~`ҥXڎ;Ķlի|tǰx74hzʀٛ 0F>{­uͭz:BGūJMu A#… C?W .0x׿?,yÇ**;ve4xG۶PB!n]QT#G$+;M5;wzؘAIq K.ŶmrrrXb9>=    '7G+js4Lg0!BQ2tf>ʞ={hԨC W^ " Jt̝8A#HJr NŴP+US멨IRLBǎ1MGeر|.Ǝu]SUda}EaL4[njJs=Ǯ]jՊyQNɳ> p5נkz4gMxļy̝;ڵk˽އgР\zɥ6?iӦaҥ qqqz#Fأ1x`'7T6[7|¿Ϙ19s0ebcc:u*:v@QcL:*M;yx>'_~;̘1;СCYR ԝVT!`0蜏ד$q=OйsgH7i:c<1i$ B0tAAACٹ+]'nrhQ>ѥ! Mˌ,]Ux^>WtNwsyt]\exC]p3g)]#c7. Ds隓;/4ѡw"BA]wkt4 0\aan_EKw4龈pp7\\u_/>vky?\|-}=}AAAèPh. %5UU=i.ʸ =\5RqCUUrF BR~~>6mB=׭[޽9tkcx[:\6C+tq1۶#E9mUS#- FnدaezEBߣ׈J̗[aЈs}_zSUsqkq'    >ѢG};ʢ~iՉ;nqh[6@(DuqC1-+g6?8].wܵ 2.n?ܶk=o9i    '/^ _}`.hq`]ta:sɅ>8cy&Q7DF-famy WXslo}"Vm;fu*bu:\X6 ['>~J}mAѡ   pp9sVÉh"W-h.:\8\ӑ{sPQ>ډ"كͻ~}nW}kd#m)   ©C G" qE=Nj{S}|AAAA8.Ǜx%x8ˉE?ZN)   9nD ' ũޏS±!.   '?=Ds2;Nhk˼   ɏ~މO)۱-'   ?}[m²* `pdK    QJ+lK9b 'Zx9SCZni9~q=_ 8K   b`$ ?~ۨ@eyJ ?O(SE:ߡcRHAAAA8i(1ZVmlƲLRm[?[Vt\ɮcsLSA¶l4M0 T-7L|>7"h'EF"AA?@l,H ԨgTqS2uja}͓\8*E?նlO?>mUQETۅDz-trﻜjH5QQa   Q,P&pX:np\OUհ|HuwX Lاi7/GhM;@+]&q ?j'7uqyoς   tU.T87o_~ 6 8:>tM0d로MmMeZ`މc6;$t;b`l,§,YfYdeeM۶mԩS!> 56-WvڶNa:WU4L={xs*A#UnQ^^޽9mۖΝ;{|>`W5IXY;)sMuW/̽ڐm}Ķl[vޅVp=wlZlA׮ݜ v:؍Gw?t֙;?W7_? mi|dgg;m ?I IDAT=۽{7YYYӥK>  pjrX0OSCmm-˖-c߾}^8)8Œ+!6l?8>E pı4wIU:4ٲ-l@/&|TG6شyENدy* UUUwXNCWHEk8݇{,4Q5'S*ji 6o[OA#XB vMyy9}Gl4((a]#Q4!U2=mۇ\/A#4ظq#>u\a]WuϞTUUӿȎ}=¯+ I>DBBt`U7?-_UUAFFEEEkSQgC޽{_~'A   aGoZfMϕ/,Ou=+( qqqhFNN|Iu_dzRW8kh;Sջv ;w45s⩪}|p4˕>WK~N$c 7CUU4MD4gFT[Utl&`#EQ5lrRއyO70Ê8:wIii)mB ;ƥܹA(gʔ)Yf%@^ ow~5SOؖͪU=Fc6;w0!;C,r.AaA!;vhAAqD(W[n};w֭-tBtAS[-[*\ve,_\t]_iiiwy,\0غu+{&%%}pD E!&&M2fƍwxǜ~sct]M6Qs}U^`iG*~GpR5FAff&@]f͚ҭ[w֭_Gmm-YYYlْ ]ٶ7oMSk.۷og^^BB֑ &z!'* %TUaÆuVODCiݻ7}ewo-[")9®!vBUӛoɫT0 9 v=wXnQ])0H裏Xz5w&Ù8q"P'=}!TLFQ4TU oEEwIaQazͪU,]vѢE> -//gɒ%lܸ"bӧ]4͈p@UT \7n!Y]mZr%ҷ_C۶--~ϯi 6m۷QTX,)]vUg~KN@AAA89hضBiI9-Σ͛7ӹsgΡN˲<\>iZb}ۻB{xnh{no۶+&vºLdG9oX-[=hF֭9sYlwi۶mcȑHxzo~Å^HMM ̙3vѳgw;v>@ ko0^%K6lDׅWtC[-: 4Ȁi8ExEEwl>h:N:US{X_`vv^4MoӣGmFq#6i҄={%c 55]ջ!?:ga4swڴiJ.]xօG4LFqVU4]c Yr%wu7|ry]*laYul׾iSO}6. wQSSX!Q9\ǞӦ ]77ܵjuIQUAQ᯾Ԝ4Mms=E!11={qFo[EQ|:eS]]_r;woETT{]t2:| #~Cak֮_~˒%K2e G|>;vM66wV-\i%ktu~Bomt֝oNQQ1m]/]_u͡  pr JeE5~cs:!|M7rW* F^SNsl۾4n6֮]˻Kuu5_|17p*w}[fݺug6@0@IOO'77믿;3;]i8&v2iWw/4iR݋1 jwV˖-;v,K.%++:Md׮]9?t]5_~nݚ}ѽvZz- h֬&MbРAݳz:R6崎_7k1ed ?E ٳg/11~9\?|O7no6 6>_xܜ\Zju^KtO\8\fϞ_̫mߏiӦ`QZZ9,ˢlvn`{͛)(,k,cp;]G}뭷Xc***ر#ӧOuz:es7r饗ƛoPZRJvmꪫiӦ'X0DnݚK'_mۼK])**_&##08p W]u{宻jǍ7Ȍ38sPx=z0d..E,YJzW^.碪RR\֭[ٳ'|:]ue[f&%%%aŹ hT\[j\a{oJә9s&Z"??ٳf,YZȸq|IOO;v_f޽0mtwQGUTnʺxIIIa[6;GUTܞyLtM‹|7<̳ر_vE_ ˗I\\k׮%>>s9/oMM }\8sA;xYY'4 dffҳgOo߆aՋM7Q\R՝O凙#cɒ%?+IMm˴x晧غ` H˖-kIkv"0֒(++SNwy?z ˲j*+?ZɌ3(Q^^Ws50|pIA2ꫯXJ֯~+.=շ~?OHLL`;,Xa >8-++#n]fwy?{|>_DJqu0@[RPP@^4͛7K/qUWsqOL6d{l.}S/J.]+xlc 6~aƌ9~o V⣏>rr_) 裏yn_C1FUرcs˜9s+Roʺc6FР-Ջ޽{m6|tZ G=9e[Aylws=G޽ htRn͛G3g555 w?nq#GMn5gbcc;w.O=вeKO4sl4 .‚ h4֭[2ku<|nV^zE 'Э[7yn6-[g}m9.e <\wn݊ 2UQ={QS5Zh53gof=g픕cO3yz!]*kl߾Gy|}ry뭷ϗͲ-,ˢԻ^݋luYziAAANIXT'|nݺ131c|)H+Lx0j(:weZ3+㴎ѩS'كDzLFyDۻ :X0rƪ*nVڵmKF9묳(,*$++ 4x1 RSw%Y%L\p܆͜rz7p~Ut eYd 'Ofԩ̙3)SЪU+EaՌ1kٓzǎPʑVL]ō7¨Qm͛3n8>Z]7n4mڔ3bRS  `^(♻^.B>? L82tnZU%Dj7GK]IUUVXĉHNIFQ*-^M&MK/a޽8|u[iѬY3|>5552uT7nL\lSL/s|WLp[R[[w~kpĈ .|zBcGg5L[kysN Ge˖-L>/iWNm?۶HHH@5Oaaw?<$%%ѡC8 5k( 4}a+--ѣGi 99-[xMuʊJZhe;ƹ9L6+ӧcƍGn݉Ų-i߾Ѿ}RSR)((pYqЮ]{:,֬Yi|:S|>zM&Mϯz"R$A|>_&Znb&QR\B ^˲d/hÀ-ۊe6i$&NH `޽<أrSRRBuݻoҤ N(+6y -9⒦i4k֔bO<1 f͚y4xO苉!h\n({\Y匴-gm$4i4"LDW#0&&u<-]uV4U{|78¡qMhpTq9P9 [PX@JJwi)))^nBUQHNJ>C||<6[jan8e[\{,GFJ))]VVF>}Xv-gy& 4.yf*R;ϪFc4>w*55.]i&LӤwdB}s@:kH;bh8N=z޹䖕h"vޅeTVTrs9sYs=]'kqq1{aƌ8*TTTxu !!;DŢE<ۿlhٲeD5kְ|rjkk=ǥb h ˮEӝb+8Eq:Rs~~duFLv9Pu[=9ƶm %o}:%%4iҤ;|W|'(^>-׵%,o&@uu5?zI&՛']?WfժUTVUKEeEC*~¢Be̙R]Ue[lj%hLF❿DwJA\5OGl޲UQҥ+ <۴̃   Vr\n(j @Q~9|#֭_G~}hImM-UU?z);HOOCt\&キ}Efڌi\pT3bĈ}r|oߎ 6x,/_/~ VXEmmFH9ʎD@@6m߯?6mbq$&&0f͚y"L o[BQ(,,@ <ҜZ1T5ͺ[O>%//=z8,'gZiI)iPT}$&&HMMSrJ2zfƍ^Z2ݫ 5 \ :<6HNJ{.|6mm_ZZ0UU|bBi+6+VUV6Ųl QqFgѢ ݻ{-%5]9#B՘32Ì /d4MRSS# e%jWXqE "{MrϚkBc[u}eJJJBHv^zfƟ?м躎j<4iٳ,})׭E^)9L⭹@ iZ}Y]qrnΝ |ǛS۲11پ};?|84[#G0  ƍӧQקhٲ%ڶ FѣGDtq4_xx;n%h깴Eu楠mkq*!G984PU'a{Xu`0ȠA?tyMvv6աFvV6 )**}C|ѣY oߎ*TTc0n5a8BW˶!))qSO~zʨd׮]TVVRVVF|xڷddde[ >{j*jjjf38^{}0 ʊJݟ{su֝͛7{K/'`FF.g~[   QLiTUV1gvڍe۴mӆ?#Æ ES5N_W.B4hw^<ü4IjYX#hE۹ݿm[$&&zEů`a9T C^p'׏bw{۶Yd l&MuYfζm7|ݲ-&L@ [n0 :usYСCwRR\B"*?G/ǶmѣgϦM6NH2k,,xYfyH//׀X 퇢(j;KLL$.#hiԄ֭[([s~խ>3ﳭZ".. py\CECQ4@0,EC5 `[ syYC9}V\D*%]gSUC5Yp!/Һuk/"j @5nv^}Uz)HHJf(4CCa2 >t=Wa&))ٓ}``ێٷ__v/L||<Cl]!_OHHudeei(ϫ[ }Q\\ڵkϵmۖ&M);]IJJ{e̞=Z5jęgIٹs{)jѺ3Fg3SGlݝȲL^>>>ԩ7%őcUQGևO_8rҿYf͚?m1K-5k¯lj=?yMVZ<@ގ_ci5yuAAAát`dB)15vkyX((΁Q6"j/9=BPILJ%<N!m0ܹsH_2 yJ///<3VZ1Q6WFpѿxQZ5!##EEEPScOOOxxx+TE5s($l`>'~M!m5pZ22a(2Evvv jԨGG2>l,`WX%F\4Qׯ5k"55iii=^jժ*U{L<:XxԨQ)))~Efeʕ9?-AAA<ٔj,)v&AzM'o]@^twvh9;u{huznҨ 7fZ]L*z}26G-%Ј-$JDidAsEfLQRE4DQ.'MFUL7 PeEV,kXZj_A;fE1fK+~;I4^Gaa!$I?_aY(|~ m͗,2h,TA&AAQ`&%j** v EwV$@QBO hI^pz6 e;y=   LOOOTT (qGR#    rHKKÞ={OOOxzz"??;wDZZDQ(eA@    (Gܾ}GGGGTV O=?ZAAe9nE$eayv"L>  ?.\@Ŋ| 888 ))DhHAQ @A.Xc˲W I 2$I$IfBAA 8;;CEHOO7;. AAUU( VTcڈL'2dY!AAēANNX?upp@vvv+?+V  r((**رcUUcȑy e6xP \l6mCAA,CۼE)AAӠeF+\^cǎE||<*V`ZiMF#( TU,`0p]mZL`0@h4&"dYѠAH͕YZ,#ˏ^Gaa!DQ^/Vgi`2AAeGTUiv"&$`  2h+W X{?={_勵.]̙32d}YdddɓxPL6 EEEӧOh߾=^|E9r?gϞ8w -Z ++h4r_0\ sDDN;h   iAA^rLXr%Qvm ???tXz5>cA3fɓѸqc899Cxx8 B\z ''G[o]b׮];v,6oތ*UyL:5٩/T~2.Oƍbܹx1eD|;w.6mL4 /O?,XÇǔ)S IFpDFF֭[HMM}\FAA܁4  JAkV1|m}+W7@Et:4k UT h߾=]}O>hѢ jԨ;v~^G:u I~ԬY;wLG\0ɐeh֬BF# $ vvvh֬ ;;;֭[ѽ{w4i,#00۷֭[p100PvmܹO=|||Y;AA! @  `̘1g "d,PGiFT\iiiGQQ$IBjj*z)Ȳ5D{{{ O?ѣGcݰ,OAAģL  'It:t:222WWW@ll,Yb4!2N:\@Æ yT$%%!66 .\$F# هi1`¼^z!..O,8|0ۇΝ;sbQQ F#Acp-QF  @AA((,,= )SO>Tzʕ+舋lB Xx1>s|GB %I/ `Ŋhܸq&"owEVVs~zqݘ|>,PZbw899A'`rM\ GGGOR  1(BE.   KjոY֛ƍpss+,    Qn]ܾ}f.]TUEaa!Qn]4 AAqߐ/AAă-Z@BBEQ<L?AAAAQ$ 5j@XX IPJ4oPUHHAAAAY!I\]]ϭ-E1 R@l$$    r$Ie΂HAx`@@    (gt: UUyEQlkCAAAAAnpmAAAA/AAAA/AAAA/, r     Ȳ̃theg养JEQxa    /"AwvqO|AAAAZZj~Y2L1%%EEExgaoo_.AAAAa UU^ZZoHZjwm,"TUիW *p៪<AAAAQa21wwwx{{#55\иF&fgggk!AAAAAKfda K6eY[r/S IyyДqQ,~~~|rE0.^ 00ǏԩSt2K Ksذaш1cgEhh(lقQF\F$J[ΔAAAxt߽ ‡=pLyT7Lv,cibmk4oukָ4m1m4̝;b֭6lXuWkM MٳdMK/y7#!!ၤŸ6_| &L@_ ::k<?GKO8|ypU4lwνe|즧#$$wޣDQ,ZǏ:.}]NŽ]???t w؁#FU_ԖyX|yzFi oKzk}C{?O:DPU9U;{,-Z'O"''x饗0dOߵcȲ Y!I_f IDAT Ij1e:hii&,ԯ7?gϢjժPUF$|eߨQ#(ᅦ^}UiӦ0FUU4it|111hРY>bccB###ժU`ZxL_{h~ܹhԨ֭["^oNX}ٳgbŊ7nվT*bݺuf @ժUy:' ""SNE˖-̄o0g_~A^^|||0e4nܘ˗#%%bͨZjc޼y8}4 7SN!22~!vZ, A`0x}YTVL-UնV<`MŮqm_Yy:<4{f͚WWWlc/+-Kײ2ifُA`Y,]F?ks:P|6jw-={6v YѫW/;V-,,ĬYg(^z᭷޲L:gϞ ЧOޗ1}t[׍$I]駟BE̛( oڡ,VͫZ 8KŶeIcֻm۶}e,5EYؚ3l57`pssĉaggg ,][Ne)j߭Z0Ƙ5vO?޽{=V]4g[?wY{6oNNNe֭Tbͫ6MXzV%'+`V{IV{}^ߣKAz$s@Bرc6lɓ'RJHNNNW2{aklqY. p}bA`c_| ,@=6eDRRF UUѼys~-ʲ.m}WY7iڐZO?,"y'7n̯s!5,},%''cС3++/D[[X!667nqdy#Ckm+6n܈^zKJ*puu5K-VY,}I"((5 7Wĉm6@\\ |G$.]Çcꫯ?ISf͚%ͫ;\\\gk(IpЎɒƏc?Y}kh4ƚ5kF#t:֭˅-}Vn-^,w+l fYKx!n´,0e,X.]¶m`00l0Y,ݹs"99[l:t(֭[~}OQ?믑aÆI&f̙3FB&Msfu-(pwwGJCTоyYTTdU -X?I=iK8TVWYDm|hҤ $[ҽCIBվXju[g֞TU?ք:`k0z.mfy}hi% mkrZ9U+wŋXlzU溰G5![Gvwss+բ(I&%>ڸ˲ִ6ϒ'-݊{=T! '6 }cǎ7\\\ @dffb„ h۶-ڴiwy<-ZܹsE֭[PSLAVо}{Z= ڵk :{"##yz .,HJJСCqet 2[p"** fϞΝ;#77'N… *~'L4 |Zn ̘1kܸq+WDhh(0gΜ7KkoڅܹsM6!<<ի1tP7YYY3f СC\Ҫ kcΜ9ر#nܸш/ СCqМ:u*1i$.|Yc<3ARRZha+V`̘1<=mڴA-пoo߾Cjj* 55'N@݋=?&& EׯGǎѦM\06ׯG^ IΝCr-[ЩS'"??>>>\ְaCVQQ {/^>}^Yˍ9sн{w &&eo'ODfxSU˗/o8pڶm,&-Z˗/chٲ%u놸8mb֭x={͚5ɓ'ϝ;֭[%IQNԮ]ߧ!& t:̞=-[D`F"((\GPTTǏO>h޼9:tI(ߵkWl/2.^h=~mlڴ SLA&M"|hժڴi3f͛W\Ahh(֬YPbG|m;~8x 8wF!==7xZBPP 7n0&N4ϗ'NX[nQR%#** ?UI||_kK,?6mژ;UU3fM6С֮] {{{>wF˗/#,, ((,,ļy >WC$mccc[oa̙hӦ #66aaaǨQ9ڷo-Zk׮8|0TUEll,wm"44}( ._^:t@@@F >_ +o'Nsv/VZcǎHHHܹs1zh^w{ 44ܹ37o_~III3f Zll޼o4qYDDD… L7=='NDvЪU+l֭֭+W@  ܷ 粳qY VM`ܸqpvvݻ۷ocƌ֬iFF3ې|g믿۷ykyvN:[r󯯿"77 C͛?~>}:j֬m۶aficѢEWf̘m۶ٙkšnݺػw/{n/PGŢEh">|~~~8tղNgܡ,XӺbWcǎEDDzxk׮ĨF;wo޽{uvz`ԩSӧOŋ#11k֬ѪU+DEE`0pԗ_~ ???>|;w.|I@ 0!Ÿ́B8rN],cҤIc|YѣpssK/kHKKqU1T3<_Ӗcgv(hٲ%:vYf&Míj^ '駟Ưo~wTUŲe_#11:tZZ l4,7k7nD޽ڹMرch޼9:UVaؾ};<=={aڴiHbxkעe˖qqqXr%:nnO> 4CХK,\'N-[ /eLOOǙ3gMi,XUU1cW_Ebb"&N>_b|嗘>}:N$IΝ;vZ=z͛7رczqҤIpuuE||3$$$` +_AĿ*_Q|k0cǎa„ 3|Ml߾7o޴-sNUUsNDEEKIo8;;_AsNx{{K.Ej+h3ӈ{zD兖-[E۷oG=P^=Hݻfӧ|}}Q^= em@50̄ZS$''̙37nA@Z={@3_lZFll,F777888pM8&4 Ddd$=d~*̞l7N>ݻw7nlVA! \(e$aprr?g7IO_cܸqݻ79A9s>,Vh_l޼Ν3DFzz:݋ b׮]رc4>S|G,ZS(cmZ[`14:~xnVeM/_^G*UYW^A=zyL[kbɞqYhV7ZA'v APfM;v(xФI5 6l9s{Aڵ1p@*Ux:** dbРAprr^GLL UbŊ߿?~&ѣG ...G{SO=Ν;C$SNܹժUC.] ڵk$$$@L>֭[ޞ7ooo={{(\)55Ƅ ɓ'c׮]\m+Vh''' c 33puuB ۷o dgg3a3۳'uV7o=]Att4F#ԩc'Fll,"""вeK@:u:00*U(h׮RRR}FFj`gg.]p-[>%U]BEx{{[n<Ϛ5 +W6n܈nݺ 22Opwwy|3SSS1|pMkMヸ89s_>e㚍+r*U2򎋋C=вeKH<7o,Y|K#,GNh۶-\\\pԫW8}4n޼ÇcĈعs'׆kժ/|ij~}4vvv1bE|BUUxyyCPU/PbEoLˍ)wwwܾ}k${{{9f͚Xr%RRRZjP?5j\\\P^{FE4h:u*6穪 ܼyY-ԬY-[O?EQpq6UpwwڷoFm۶?lق-[`e._~EEE@Ѯ];q9k拊֬YLpTzup bcUtt4:utE) gƌzڵfe6kÇCәt, 777']۸q#˿+"ԩ 3>j@YYY_veZ @ˏ'OǚpUիz4 HKKƍ6mڠW^prrBNNdYƒ%K= IDATK/O>x7/7onݺ5 iӦ[n8q"郣Gu$IftO:cǢo߾߿?:+Wf͚fBc6{lj6-ĴY[R"k׮8QFx 77ǎCpppt:Ȳʕ+[]_dggʲl6-a^[|VRG+{`f̘_~d SZw}'N]va0x@ʕ+_~8q"y_+Y>,Y`gT:u~z>}aaaO4hbbb "w7Nlpvv6[Z}G999HKKBS&ސe7nEvvvXj\]]ѧO7c%; +֭bέ֭[q_,^r(򗺝-UT$!'' m9BZ*7HMME5̄\ڂ OSSSʹg-le)ҲJ*ťeعs'݋}ȑ#\l( p%|_v J 6\۷/{{{Hfddd+Wb7o9TvvvffL`WRKW/^DRR{9]EQ3gLJ~ȟa <...ѣQPPSNEEE"o(.\$yyyAήDւׯ>d4i&ׯL}@ ʞ777YO>XnOHWWW9L7o͛ȑ#/xFS777|ؿ?<bfe9nիWHǙ@iӦ\x#Gॗ^2ˏ5ڶmUVa;w.?777qhVZ?y^x޼\Zs:u~ŋc8py\V&T/͛7ȑ#Xt)տ]aXlكE~C0SH֞L07:5kСCg8pQn],[ ۶m a|PUDQow}ƍ3Zz=X 4*n߾LK5??QQQh׮֮]k"((}ժUZ,`WF1yd(**skd@9rwFDDЪU+/8q#&败qV6nd ˈ䖸ڵk<yyylY>}:TuÆ 2dHƩJ]z읐{{{$IpwwGdd$< !!O//_]vaXv-Ku\g6NeVO+W67(2?ൄaklUU &`Ϟ=pqqqx՗YYY;E[}ڵk>æMp .m׮paܹ/KEQv]ǰ_0ii UTAAArrrabJJ , Xݻwr>Ocǎ(,, 8|0nܸu !!!9s& 5k֠cǎ%޽; _5:t___ٳ111-[ɓ's~X{X70 EmxN{oy3v兺urv7o%jԫWG5cTXGP, Q(dlڴO}uf̘7|&MBaa!{9æMF 3,**ڵkdҥ]ܦՆec{7oO333ϟ7'2q'*)) [n{'y:XW^̓n$%%qZj yyy]駟"???>"""x<`@Ϟ=tRsժUxy9N7ݻwˑ,[Gw?rCg} .D~~>Ξ==z`{/kVyR`kW ZZ!oxx8~'>W0shgYңGlذ'N(}033j>1`Z[bŊ˃`%KQYYYq ˖-Cff&b 888߿X#>+bӗ5#`X (777 77>lgg___Ҷ>88xIMM?l8;550zfn}z/[Y]1r0֮]-D/^z>>>hڴ)͛ХK`z8q`rP^=.LLL>! } Z1;v… q!Z!CC "++ :t@ΝYf4f͚m۶k׮2dy[^G':uꄰ0xzz v±?fN]+We˖~ݻCUU4h;wF.] v ?e9LO)WU줳SNĐ!CвeKݻ})LxѨQ#ԯ_ 6ĩS7oiEah72h%e-7wXTǿw)JQD`oQ D[H$hl55SQb/h`џ{?xg2{ݥhy|3g3gfQFΝ;z[6ݤt:Ə___tHNNƪU ?l`bWGz 1Fc裏еkWL0ޫjqEt>>>ڵ+BCC@ˊUЬY38::zbE5; WWWL8(bǎ,A߱h޼9Zj+++!&&oƔ)S "ڵk-[b֬YXh=h֬YPT@޽>}xN<++ f͂F䄲eƆ!n%g@b=t:AQaooX|ѣ&M0jްa_> ::wֻVd>}^^^ݻ7<<<\ ֖̱:ӦMƝ{>>>}CzNVI~'O @޽k׮a4'''̛7ꫯn:4n;vDJJ kȑ4h<==㫯2hƌ___DDDqٳ'Ο?O-2']\\W_aDll, zUcxxx 111԰vU:OMMEnТE AAA@ff&eRl=zN2777naaaW ߈1< `РAxw6mڠnݺ4h!H'Oʕ+ǘ1c0zh4iEM2!|Q>d{ >C"((/_/cј0a5jaÆÇxq]mGȑB1Hq@VO>8wٶm[\ILӧA h׮jժTR4^kkk:>XjAo۶ [ƌ?I&!&&ZBff&&LHt/1999 1a4nԛdkk oih4hZ@۶mѳgOxjբYXX-rF=lٲ Ey&#(Ñ߈˗ŋh"xxx`̙1bեڰkl=&ufʔ)pttDhh(`gg6m4^;wƨQн{w?֨FB ?>ΝK!C>>>裏0}txxx 887oVEDDݻ0DDDN:zJǍJ*!$$5j0 %ؾ}{ѣG ;wF@@FO }*$Nc;͚5C@@Z-"##yy͛C57Z/X_~%<==1qD#2ѣ 7н{wz ~ˆ-r#{ H'r2(†gȽC^IҴKeb#1q#H0^iGr߈#G`֬Yرc^rŦ)v϶1zz~ʉ=i䓫$\RjJa˵-i8,(\)`2R{ rjJ)SI\zSmR.RX݃[A`ۥ4 *Ҙf*,}R|Jc \`EϞ=;F=M9̜2a3o*^6>RbAڼ|%#\?'^)r[AT={6-t $߼y]vERRMҜ uB.<[sAIgp8ۏ(HOO׻8HLL'NYfHKKG7'N j׮ Ct2L` \QY{Kߕm#gQJR!={E.JȽϮ Xٍ)CrF_c<7hBP:.dOOWNv990)J锛ٺ&KetOpEC&rX^I4ͦryk8s *W gggkæ3IR/i=*|V3iڍOr”aה\r^hr}9c9lRAAˌũ4Ie uGɘ*WQAټz* ,YUT7yJ(J?Ke#Iq>g_RJ BT}0eKIst )rL񁍍 ^۷#** C\\:uD=s! W:.Obgll1ն8y[(v +rFJX/[s j999z[r(6O[6 % r.U͑Ȯ*#irY9䌩g9!s0i}0eSFI Di'F'y ie0epcab7d/3H3 3P [vژ.̙3Y+="_ cazQl{(iߕD Sr߾c=G_8?*J)\rhzG-Aq[E׍~Mߖߎ#s#<pL!-EM͑$0jiUgn%, u兒ܿě&1ɒ,%I>S۲ޔz$SI38ySy[tdE$ EMApiy7=eߛLIHkIp8yp8p8Gnp8p8pbp8p8yy+ Wc远vp8T  p8p8Ñ0yֈh㦤xT.QRFӽ8t7fmI); (m7999ڎrss-Zmu:-#>JEPmREzGF+)(sbgҸ ZFo聤p8Λſ-)DQ :j7 N<++"4ͫOc6?Io-,J|3o*JVjPt){NJ¿^Jc뀥eY[6oK, R$/)u_sV_`{a|k@~/):N3(Cs˛[2f\L7p8%!G'U^'z[ֳ+wBa= eU柴ÏdmTTٴeR'++;i 6V[6lH3gbҥE7oF޽~'%44G)tFn툈m4PnڶmG wǎ{b[b%.SL6 ˗/Še˖xEthذ!_9s&VXQH6mڄWۿ/=O@R6=z@jj")ЪUW"`ӦM۷ﳋ*ZDc IDAT | .\ %p8Xfs5 hР aby~iZdeeK T*tɭҊ#+Ҋ0ΦM !JJ²eШQ#:u .DnкukHba?KJR׫WuAZPV-ԯ_ΝVEdd$VZe(hРj֬:uN:pwwŋ ޾};n޼bŀhZ Vaټ!ϤtRԭ[ɘ8q"}.= F[SƏ,X;' \$ωwΝ;ѫW/*ĠA׹l2ڷoGw6_ ???{|wF^мys!##h(ŋ>|8мysڵK/ݢ(ٳhР'ͩj`ذaf7R&|1". .$͑0}t,ZͥwM\:&&wV Fg3!wvZmS峹^4reh,:p4l8{Zk֬APP<<<0bI\jиqc ><0ѣG[.jժEۺuf͚hӦ DQD^^OvKsԨQ_lS~SxHGNNgmxճ . 55UO>L)ZVP.cW}{乳3&O R)]DOVENz^ZYr&]Fw kl3PYti2Kl׮]xAx$Ls(;I߈#Pryٝ0ydŸy%TM ^gη” "RZN<6Q8/Qd ;؞>}xw? )) .aUR*@D9$HONGx.Q&Cv %(7oĊ+UZ/]&M4i777znH<6%"A? %%.\ٳgѸqc>+ZjÇ~!Cd`̘1F`` ֮]k0 EÇǥKdff"// ,@HHI@TT1i$4hЀNYZ- wwwTZW\;~-ƌxF͛{ 88ٳ'4hw޽3gΠCoٲ}FHH1edeeM~gtji&$$}x^xAԭ[nEnj3дiS 1kу/=OE̜9(WѰЯ_?۹sиqc ի1zh@RRZhA=ܹOOO=oU߿?|||бcGܹ-Z_σ}vtܹ3Μ9Cnܸ1=Z@R!%%~~~LA]Zj;2AOtRLI[ iiiǑ\t ֭(8}4zyf^|:t ?S6/DQ֭[ѡC#88}m;w.7o___P͛1qDDGG~~~m6iӦ1b^MjXp!:ĉȯo'&&Zj u[[[on޼=z@5`mm?ãG ۷#<<5kք Ǝ:F34h4XZZBV15>]~]t/ С<==uIR̙3ѣ6m ___l߾ ޽;V^M'[v~~~cHo ǣe˖Ô)SS:t@rr2ڴiC D.OOOoIII47n`Ȑ!Ə֓qaܸqO>Ň~񜑑ٳgc9s&BCCiXr%ڵk???mVaر.\h`x!:uꄟ~%oa31k׮Vů &`/O8<<<|6lЪU+lܸ>%O?D/trƬdt~~~U<::˖-֭[|lL:~~~F5)* 5jvGɟ>Z?>c=cԷ~ 4m}knn. wW^ BZZ~cǎDxx8Gp-nׯG`` <==ϣk׮@qU!!!x-[CFPP֬YN-Z9qԮ].m ܹ3ɓܹ;vDBB7o.穩۷/NGI&zcgФI`Xd  "44/ѢE b̜9>>> 4ؚN: ;vā3 . ""'N[lp8Ox G… ҥ*q`gg`xF]Gn?{ϟ+x}?۷oGbb"t:-[NǏcٳ'?c۶mQF {'FePF L>v킭J]Pzuoزe ޽{QL|HNN?ÇÆ CNN/X 4'Z5" ݂fh4$%%ɓ.VI&a8y$*VGhh(a! 8Q6qUڵ {AFF.\HAVVߏ.]m@O>둞8̜9޽;/̜9۷oGtt4>cZ322#,, Zٳd%oSNhժN';@{aСfo$m]G<X>CNN&MN:q 'f͚8r֬Ycp(o\lO?~GHQ/cR7nD=UӧOI&8v֮]~;wDŊhdeeaѢEpttD# :;w?G\֮]cǎiӦ7n&;;QQQ;w.i&N:w}Ė-[g:']8vf͚9s`Νضm9 ٳIϞ=۷c8u.]J~V\Gbƍ8vZjaÆlׯ]oXfM2ܺu ժU ;;;ܽ{WcDƍ]6@wvvF2e02Hީ۶m7|cǎm۶tL̦N ԩSG֭ ҟ!CбhӦM]reȑ#Xlϟt*C!>>xn^^.^D8p|8!ʗ/رcRRR ؄hxs1`aaÇرc#&N:u ** {=<<~z$%%!""qqq4}F-M_^< >}#FCx| ^"ϵZ- {hذ!T*RSSGݺuHٳg.)k>'O?7/7Çիx9UضmիDlݺ@bb"AoUVaHNNFƍyfM bcc˗cHKK`ڵ1bN :СC{Z\=ְC۶mqu}r R x*?Iܤ[H吝@O>h4pqq._ JsԻ(<<,Gvv6zڵkFhРv7Grߟz`M ى-񺔛nqAT\tDaW :Fdd$Z-5~ g$Iߛ7o… h߾=- M*US XYYǜd 4Add$KرpuuZf͚Eaٳ'<<< "ʔ)~a͈<<<7Yvv6nܸ_[n+V叴޿’%Ko>aرٜ9sD-k.aaaqC*L?~<\>6lluPѠ\rׯ7 8p *Tԩ._Ltz[q= *PoQ777t;v  EÆ 1rHlذ3g΄(t2շo_XYYB pppܥKj6l^*Z*;ܾ}eʔAJhеkWh48;;W\pVZAEDDD۷ uvvFff&3T\ 4e˖FAd{J*>|Nr ##S*UJA =zdWk(ӧʗ/ ӛT*ܨח MLLDʕѽ{wXZZիW;A@:u;wo+V{j...ƥK4dXXX ihTT J䄰0@˖-J˰t888aÆ{^,ZKjbǃUؿ?|gǬ鯛6m GGGT*l7nx|G*UDA`Ĉ"Җ|31.TR*Tm-ZoFu#FٳBJJ Qn]kGFRмys/_nj)Wj5YX流+G7l7oڵ :uBZRХKjժvzyPP=Ezrٳ|Y 3f j5*UPٳ tJ=<<PzuԩSnݢy:@RJ*ر#-_:u{0ȷ{aii www<枀C\"j8(U+W\z {xջbŊTqqqQ<lyRҘ'''ܨwtX^E888(*iiipuu +Pذa._k׮78ӎ5BJ'a HHH?lvz "''۷G@@Zl;wRQܻwH­P?~L'FUVY&I[||<ڴi+++,77{|өS'DGGcڵ O??UTћP?~hذOt=(ͬlիW7Ξ=Hx:ux%5T3C߾}<21#QߎmooJx%~P5z7ߠnݺWX S5gN*U }z'X5kDݺun:t(]4bŊɡt:-[V}Lܸq^¶1J2e~LV=Fr]nh^gdd<'ggg˗nݺpww'{=L8c*ܤH+WN|j޹-ۿ~sy-iiiIpuur-[z>} [[[T*'Ǔ'O`cc_j/_ϟ|e*~nQ\9tcǎMFF*VǑpwލwt{,5X2'G GGG=oBb#?x ܿE)))7nzꅞ={"))Ip_z= .,, 111XnZn͛76l:-[}GzD>%777nիWi]gK鹛ًD7 `>x1/l5ÇNI3<]:A ^ִ]A@ btMHHAE7\\\Xݻ "܋ IDATyΝ;iRRR0rH++^_AV߇#5B;.//t70JtpvZ,Z_~Y9 @d_J@yEW\GhӦ0`aii#G˗QjUdggSYNUxwNG&.]™3g-[e˖HIIi0m4DFF ,Y@CX{#y,JOO3z=}VᅬsR9.]+W 55={/_>Ç\,b4:$4gJ7o{ァҤBEdffMP\9/3gD^i&\zXo.6lF =ӧO>/^˗1|j2e 82e`رzc ,`Ĭzϰڵkc޼yt0 z޽{!^v 5jԀJһ}zzgjeddɓ'Y&mNUVMoqzz:}WBJuMr#N8Fr0epϞ=Sbܸq駟?L2L3`֩{I5ۣnݺHJJ±cpa;w}ENN"##燍7bÆ ' {nܽ{~lj޼9֭[Gfr$7`Ϟ=Xx16n܈ gxyXZZm۶|r-rur'mlOݻ kkk#11ǏG``l?ktqrr(ٳg4mrglDrMP:w Y $F(B"7lJ_c)WDQġC#G 99sAvv6lܸ?#h~8;;޽{zJ#R888{W\YQ^b&y 7탓&L@t>} >\o F#=zw)}9"";wDϞ=1`@!""[lABBїlr:'Oh^ +IT-?b^zQy/^p):5a]+W۷3ܼyV /Dvv6pBtЁ*MժUñcDoӦMڵw}'O ''|󍬇k@ ou}6lB k֬A233 {AJPPvA'{a4L <,_-[SNF&\}cΝj޽{~ģzpttDpp0␕ϥ,:u¼y󐖖,,]W݋-[`˖-ؾ};ԩɓ'#**J/.jo?^}YB\[#}ZFVVΜ9C 5j0Hܾ}(x1#-Çi@;| rssK| F1@/^\xϟ?Gvv6@Eܽ{NcJBٲeagg bɒ%^@SJR|r吚 JժUŋXYY!(('N+| O;waaa8uVD`5 qqqhӦ A1c 8/,N\bf͚> NNNӧUpѮ];S^pvUU :Ym֭[֭[8p Z-BBBУGY%L(uFi4hԨ,,,0o<̛7?h>N(&5H[5 .]ٳg#88(RJ(9ى 7n-ZΝ;#// 6Ċ+`iiI\օ7SNt[N6 SL ʔ)p\~("55zYYYcǎhٲ%۷NNNzy#4OE nݺ Bnn.1aa۶m?>GQ!!!X35ԩS1c k׎z,Znɜ={6bbbҥKsׯŋ֭t 7bcchPbEBҥ>yx'CRo${vv61c L:(_<|6l͛7Gۧ~0#((ȠN-]ӦMGI5덫V1m4̘1۶m-ڷo'N@oW֭M7M۶Ĺs0{lڢW^h۶-._իWӋc:u*-[ `(UON3FޠA,ZHP ڵkPը\2>3*'nAc#@~m9r:<)STFȑ#йsghZ4n+V5t:-wNkkk|嗘1c&OwyK, rssq jhڴ)fϞ ,Qnƍ1b >='bcc{:tEĖ=s|24 IJJd̟?~)lmmgEvUggg4m-[NGV2[YH?֤IԮ]AAAɡc1iҺիWc٘5kN:Xx1ʔ)qaX"*U]y?AZl&\zGFvv64 m `Ȑ!6m~WL6 }ŤIe"""BKb֬Y>}-8uT,^XhڵCǎkN|=YR_~8{,bbbPT)ݛn)ɓVϟի-–-[bR;;;dddѣ4hyᘋt #lVl[l_Bffx%|de'O.i %Gv-_Ř Wn{܄Y:7wlV 9w4&|6\Rdž+7Ro1cq*y0#l8Ju̜8|7,IH>ɵ cSir¦On S>rpZ-Go!5%ov=~>3֟aJ M s)ڂ6UeMajs껴 RruK.N6L_JuN}vIiˬdI) /$J}{3yzRJcNC޽m۶zߛBIwP:>DǦTĆ-0c\_Rʅ$7B-}A$$Gb֬YHHH0٤I߬lH1Eٵp8hpF2 [ Vhu:XHƬDzY'N@f͐PTN8Ԯ]PD2\H&cS \r1CSʪ )[il*rqHaM(-X]/9($嘝LFEEѭ3$:ׯ;T3HR\00gp)TV NNNĪUȵD5Z(MTRIR;Symd\ cc'35A/1pUnn w23y'(-H25IDgcqdda%ɥCwFw9c\$FuUI^si22lʅ'Or'0\PҸqchԨkJk9î9ܻRO/_ًR9KdRL<'VqӧOJ*|̕+W#侗CE9sΝ;eەԨM~7J'hc!oMr8S*4&w%%Zn[0G~'y\HQZenU4y+kiXr闛XC<rux*FޕlPBɠ)gxa$sڈRzqc3)c< WJIRI:~3MT bQT"ܑ2f0$CSz4ٗ_y*.9YꉒA?Ԙq E4>J7c"+yPDnA˗;*Tܹs 9;բdzפDb>@T[邠1XrqH-J J鐓)L8?FR닱c*~/Vf'eI^y0v^J%5Ie{ HdnK(jK8N`,- r8p8^)Nyڼ7bMɗJa/ I%d |U͓79mRQ֛u翈9d p8)>?t;){{oj!=ˑp8pJ|iYEQԻWz;߄=cmp8p^%h΁(Ron-jrn|aԻ˜|faF鲑76=ZJ){6SeZ\UY6!Wo" ^kp8RJ,`ǚ zW 9CMR2|7r#GBђ9bҥK?~{j5ϟ8;;>Õ+W۷z ѣryW\# ݻWnqy 11¶( kNbB$GӕpGh42KtXF qXΜ9K,AIItܙ]\\ FS&҂K/lmmѯ_2WT;_v-FAAF ooM lW]ȑ#GvУGW|x{{c,۷7vܩ,:t;o^nxGxx8͚5CӦMѸqc4mIII:{{{ :TP䞗]̾R,Wo*KrU8W}q.5wUDqe6uޤZ<{ܹsqj%%%P(S&N*UguۊZY蚗 KR^ƖKnxG\\$=o**,S6 V/m=z׷B/_8lEEEWEj())RJDldLy|Fڰuo,eXj>jh !?0p@CTuerUv&hjՊR*,s*En߾֭[<ϣf͚I3^"%%%[n ϟ?GժUĹK[W삇DNqq1S3QL#[?oɵ_~=z(Sڶm V+CIa$HOOGQQhj'۷ԩS11~x$%%AP )) oѾ}rwСC1n8,]S*(((iP^r" 2bffFSx#q>C^{?R8b+B{Xj5݋hZWII ѨQ#Y ] XXXh&OR~J+W 44-Zp2dώud|j߳g0~x̘1HLLرcqAɱLP E۶mb \v #G54h=== hӦ V\ׯcȐ!h߾=7n,I'q1cMJ#Fm۶6lJ%j5R:t%D^XecE +۬ު Va`` oRew<Z]fmVKy `.RvXUW:qoXFhhժdb}Kxʖ'7CDZ?KJܯk󽤤K壔#fQvE~}6֬Y2e<sssT^n:_FU*e"Yd3SlۤB!)姧G哕i]/eȐ!C 18={ccc(D P //k+׾61>w\㫯acckkkpG!44;v kӲlmmqe:)_~tF <<ر#o.i|c^^^ضm<<<СC 4FKi4dddo߾prrhpM 4YYY^10dܸqG׮]0DEE(uapvvf̘Z FBY>>>С͛ĈӃJ@fغu+vb8ps3f 7 * C ױ`tyyyPՈ@Νaggƍǎ;ٳLh֬ׯׯVpφ 0fr3j({r兌 999l;wqw܉>}۷o70ydz۷oGPPJ%"""Я_?jxҥ s:Ex9-+""gF[,\={=RyO8!$$ 999Dtt4<<<`kkAJڵ֭ѣPJ>|FϨjٳgpww2~=ddd`ѨR Zn oooҍ*Bݻw/UTA6mеkWɈ1idJ>GMDD\]]3fPwA@jt\(Jx |}}ѦMtW/\]]رcjjܹ3GGGٳ:>|8XjcРAɡ2ﹸ{4*8 7xxxիvESNظq#]aÆݻBpp04 ~w 6 )**P:>ccc-Zl\p[k׮+ßm… T222Fxzz"..ppp@@@Ο?zj 6-66ִy=~7L8?C \:z( gϨLRoP՘|8>|H D0p@<{L6 5 bbbER/Xv-₮]ɓL :vvv޽;^*= 2331rHܺu XG0a 'Oع,kZ  @v(-} .uܹW_}888O>Xx1:w [[[#-- Z'O'%]:c f͢VqI:' 06l@hhhgFŋѩS'ڢ[nHKKÏ?#GRݦhѣGӣ6mڷoS~CPPlll7nrFFt''' 0Ǐc„ T_N:N/=qv ???7n#2dȐ!֭KY1Z-/Ԯ]@b?y.]B``7c7ժUo><3f̠Żh8j@`…qk׮EpvލhZ,_Z0`qIl޼v֭[Ѹqc̝;ueRzj4l3f@rr2LMMn,ARR5jTرġCP(pQlܸQQQHKK N8!U"8CSƍCPP;kR/8y$~'Z { /_#<< .]4l۶ ǏGǎ1|pVdd$lll&S*ԡduIׯJ±cpiSGFAXX&NӧON:ya|EQQ_{b߾}x~㢢"8ph47n}:N>qa̘1x!EUV8q|}}qQ,\˖-CZZ7oqqԾ}{l߾ǏGpp0Ν+8¨cƌy W||<<<<ЬY3̜9CJJ Y&#)) /^Dz9Eaܹ8<-[Zj "WfY<?㴛6mʕ+qq8Ν;G!4nx"T*Zh] ]cI-0}t,YOƎ;SeȐ!CFX2-ZFaa!4iPx#ժU~wp_ڵ+8 ;vPIR\bT:uA޽RPn]8::ڵkdt 7R?ׯ=EEEٳ'7oƍ ^ʡ)CЯ_?q{B b%Bw hbٳÆ 9> 4:?KJJ`ggTR dq%t@i_񱰲ŋqA1:@ {8IJ>Ǿ}{AfPn]jFFFbɒ%7n} 011AHH0|ԫW:tq>#>>v˗iԩ.{.AJի#$$D@/q0`ݕ c#GHq%TvVZj[ntL<ǡf͚RDÆ ѣG߿cjժd;| UOO#FRDzТE tP*Ɲ;wh[98+q9>sԪU уbb.7oFvv6W:u8ܹhժ8#ܰ{nA} eR?@R&kF:_x}}}ZF!>}*C4̟RDj,؍"?Q _>qjժGGG\~JkР.\Yfe 4bKTiӦZaffpwwGvv6U__( !OOOXtwwG˖-qhooAR!>>hҤ  sM:PG~w>1c 899Iۉ|OxLLL`ee%%y Pqصkw{{{iӦ|cGŋajHAJٹ"B.]f͚AR!==N:QF!99ĉpttGTY.> ښ,-O_VoݱcG MѣG|`HIIA X[[|l}l?>RGHH._\y6_Νq]( ھcB__ffftHofggٳ0aT* 1vX$'' YxyyA6G ( |GhҤ U-ՠAS1ѣuϱm6 t3ٳ'Qvm֭[P(HMM%uR͛Ϗڄ|UF <{ 䂑m Ȓxyyr}}}ԬY͚5C.]`ii 7nR P*/pUdff"77gΜAXX `hhP޽Ԏ'_j֬M6055+eȐ!Cꊬ,| _^=@YaFҨ@!I9x#(/TTb֭ւ#3?ҥ ݋/oGnL999WT*Qvm^T*Q~}zu0رlj5 fffXv-̙ÇW^~+++CĉкuJ!NVu޽{ZLL }QFpppCGI7oތd}`4ߊ@`Ĉ066Ʒ+ 0eL8jբ"k֬Add$x(FSx;rIJeːAN IDAT,_ҹ8避S<Ǐf͚k֬)=R/yӧ4ZjGڵtR8qZ 8a >CI'ʆ022֭[jO>Ą~gSHX===:wvXz5[9~)>Clڴ Vz lB)Q(000@aa!Z-rrrM?֠Alٲ˗/ǪU#GJ*… 1tPٳ]vujZY9ֵjnn.E*UPjU2P(QB۷c #&MڵkKnȐ!C @>|ԩS}ShbbF!!!Œ,>}J l( :Dj"63398C^^N16H4;;;~!}Uf<_MWbetqKBѕ3D2HE@X`x LLL```_8|0N>M#Ȥ@@)ܹ#;775jԠrڕ`ǎD#Çr\]]qFpi|,|bbbгgJYyB@nn.]~ yŋܱcccc/ċ/pEԯ_EEExB3KFÇ_/^Rĭ[pY̚5 puuťK0uTL: ¥KKByMJG "9 f 8 .QQQ~:222 P>gY~BJӟ)HtcKx@ݿ5jԠ|as) dffR]Îb9s.\/-Z$X( $gZ֭þ}tR/ԙKh I)n.]͛7q̙rFD sSSS"%%0auWDK$=wK5*YD*7n?.]࣏>ŸIsi޴Çs7ШQ2Vd>DLUdd$Ν;W%3իWǃ8!իW1,HT/=XYYeլY}Çq1>|ϟG&Mf`ضm"""j„  W_}sN433Ø1cp!!,,F<:u¶m۰m6QQ`mFAtt41y2=,t'''={ٳcufgԩS>*Q,*/+ҷbL>1`K5\ĀMuk?&GHH;'Nرc8s 6m+VXt)n݊ŋSzjժϟ =zs . ={|YJZjI!zQ ennn駟l28y$J%5j  !!/^ҥKu:FHkǏ64n-Bbb"ҰvZ<Ν;ŋHKKCrr2¶I yyySjԨ"2++KV411Ahh(RSSaffF!C NNN֭ro.CCCqF^YYY(((@ff&n߾?PXXŋ[n4zA8q=B[>2w6mB~~>j5֬YCˑၬ,ܹ.Bׯ_O?@ӧ?+Q\\\sسgM~:CM|M"4 ݺ"*RB@Æ amm]wEnn BiݻcŊx1j56l@ 삊8>ҷNu4z8<=z_+WؘFBuQCtʕGVE^^&Op̝;.\@RR84Yrr2w)QF077fΜBͱ;wחyVVbbbP\\?;v-v(44ӦM̙3q۷-V+-vaw=XYYH븸8gYGH$#xSR=FC(,,qΝ;8}4> ֭[O?8ztp޽8ͅ `˖-4Wrr2cz4K.زe Ѿ}{(..FFFhΝ9j֬ [[[,]EEEt?Ϝ99s,U8v>} B+++ЗO?ŵkנhp#''VVV077P6sv GȎ?+W(qqqtѹÇTkZܹL}CϞ=ѡC|eҲU*ZjE&&&xhVQPPmۂJ:uCll,.]DϞ=X:u*n߾ 6HqqI}3qIU|wssCzz:BwwwO_>c"F7oÇ{Ϟ=6q[C-/^`Tf(KD>q ?wRyݺuq/^Plذ!̠VCiD&Mb jsY2[Ǖɓ'h4Xz54h AhӦ /^`ɒ%=T*(**¹sV MǏӜ2dȐ!CgOTOΨp  QQQx1f͢e̚5 {En0p@ k=~!|||:u࣏>:P*]TvժU_O>ѣy3]dÆܧT*iq9񼽽B߬JZ(JO>-[DӦMѢE >?lllТE 4k֌,#6@ +VӧO;;;5 eMG"Ht=ǏcÆ AF!r ۺu+} 6661yd!44.5 \B|:uD,~JLL,,,D\Fm֭ѢE xzz u ̙,pss ?Y ,RDǎ gggG2_AAAԩ 7@R5kքPJVVʐ=c"cs_={b„ ޽;]o۶ qfΜӗP*XlΞ= ;;;ݛP$jժT-lSbϞ=g}GGGMO?̑=V.X CBBpۣ۷/Ϳ<:t+W  _|///hZ$OYX;v,-Z;;;,X/Fݺufc5 ێ8|7ի8-Z777t{ٳjamm ???x{{#00F2@^hF1cƠM66l=zDN@oDD-[F#Y]ҽ{w NNNe6&qE^DZQ^=u:vH~!吲Wc2""Ŝ9s0l0ܲysTB_ "e,[ gΜm}+i&/K^6 |&Gu###Ѷm[̙3CJԫRPTT+;8uTL2Tп}E&MhLXx1~78;;#$$}ѩ I^<___:O,]puu70}t 3IdD#a_JEh@PP\\\wwwt yyy1b\]]gϞ/ϖFαQ8R"4TuܱlIW,yžMXr)*#6"Q ha˓rHAOxF#d%XоfEDbR4WW/1=o{#_l{*7-[Tۤx,տcyO" פx&U+wVR\>+RK+Tܦbׁ.[1}$Z8Hgv.9Y`$i%PՂs_~gxq_qJWośd3RmU/ʉTϋ 6[Xߊeb2CEsryz^f]cS EnmBb},c2*,`yWnemZgϞaڴiU,wEݑJߪ.U.H6YyQYB,wodȐ!C<_f͚oܔ888輞{{{ܿ_gʐEZZT͛Z]oָ`*XÆYA3IlI<I#R3'^{MP;8Q#edIPBP,iq`qƖ/vB~w)#] >/vxI97ʬhqA~QJijZӦMÕ+Wh97o$!7)j'klW'վܹs ׯ_;;;CBTVV|]N9A ^pEAXJ蒁ʴC1{/Rk9bIWRI7B//r?qV<>6(,Hu-kdy\u͕~~) )Ǟ>K] (Y]N,qH9b{MlF&vշbubSbTIsqNc卍XgtSeL""c IR9KjJ,vvv044ĭ[G 3~%s" &&&6y\bJ̓}7X'C 2x@Rd2 H;tRߤd~زe V1:śו9CȖm]2#C 2dW֎+TƩ:e|2_W}/Mu+W)Uy6𛢃"\yt&ۢu}od\YY|1M7W)Gݿr|ߴ~|4IL}BO)C 2?֛T)u/ _ïK?蒊z ^}_Mms/ԵwUVkچw+Oo-} 2dȐo[=o/[2nix2^ ob2*۞{ߦMs_Fgп^[dȐ!C%#eȐ!C 2dȐ!C 2dȐP 2dȐ!C 2dȐ!C0d 2dȐ!C 2dȐ!C a':e<<_n;2dȐ!C 2dȐ?!C 2dȐ!C 2dȐ!C4@ˍy_q^.VUjzD4*շ)c|_v㦸Qe婼zeV V[f`嵢9]Ah}Wtm++Q\\\F/뾭,4 ,YVUZR/*]>˳]'C 2d/w<tS1H{]AՂJKh8>RmPWxѣJO000/FSA$+=eOv;@eAP(P((La|*J#8{qq)o}RJVi㟰wHj(JmV"v6˳dȐ!C /~(v0?b*FBjW^D/)TyYH-+A\weBQ3 ض}Dod]cˌ Ҩl؍W}]:oޗyh42W$oRQ qTIM@*2]yTWj#k}\r}=S&lJo2dȐ!CNZ͛7.pxǝ;w駟cƌiӰ~J! 8p ~Erxƍxyy!!!_~%8ÇѲe˗*)33{͛6H8SLAdd$Z-ۇ/pnZ9o؁<VD 6!77[zg޼y󈋋C޽T.:"11#F ????~PRRRyjժW%%%É'I}C6mI]8ܹÆ { |駯 ? KyӅC"..D߽ ,_&LqGFPa֬YXfKEٳ'222q}Yp엶ȳ}idȐ!C oo,&kH]t +V@zz:PfM <2!<]$h4(,,,1ɱ/+q9;KTX h4ѦM@… 077())jz IDATdB~yˉٲeKhZz]__7o   < [nBzW">>:vލL:txj׮ /KXRRF#b51?ТE l۶<#o#b.̙3FFF7n{ȑlB#)OJ&ub۷6l ;gkk sss2WTT~]tAxx8;˗BAAׯӧښҷo>[YYYy )}:,,,УG8QeFQ6qqq I9>+:u/~ME*QXhn߾>s8H[srrd>|ŰDXXX2~AL8SLA```?ܧT*q:#w=z􀑑K$}$%b$IR^*ZDžX)S'Ǐŋ_ŋ/$74/]KFgذaz,8C`` T"w㳲2 N/kK}q(,,Ns\9r\=}!żjP*ҥKGӦMgX^$:ORW^VوDb;;ֈ}嗰*3t謈wW): MrWW^aU#C 2dxxm k={F~0qD"33zzz k(F$Xj())iHY91/>)eГXj>/؅իW1dڦvrʃݺQ!::Z*)X˛[nM6000Y&o>"`߼u 4g]8:xR\\PZi$`- ,Swajj*(S@;8QTT2Ny۷oǩScccDGGcHJJB@RR"""ߢ}OÝ;w0tP7K.-Q*(((iP^rbannAt7)0x: u- Dq-v"}׵WطomF%zqtAh'h#ۿoƚ5kTAʡT{rq̨rH9(R+//Ǐܹs={`8tP=-[bҤI055EBBF'N@__d^zV1))ʹ#֬Y6mP]ʏZӗG3qR'xd yRm9v|v(%R3@訬إ.GcP +URczzz:rR,ammM+..Vvd뭬C{cK<zFՖ"vv;NM+V[(%Rb} @XmѢGFwq]Ņ%jkEr {k7V^śnʲkRs 62dȐ!C?>sEpp0+XYY666t#cǎpqq_|Z-._LׯY`pTVcpqq;l"irxyya۶m@0h 3?+V󈍍ń 0g8993f̠oM8ׯ'lmm=K )===T*WY Xhv؁xxxxȑ#СC%Ǐc̘1ppp;6n(pGWbܹӧOQRRHx{{ G <<;v@XXlllgϞ2k4$''Yf_>_[[[=6l1c5j\\\`kk޽{S9BFFacc@NNΝ;'#عs' WWWL4 h۷#((J2dmbb"t邂<#tsӈ̞=۷}X,\={#&xؚ?W^nYb>Tjm۶Ⱥu0zhcбcG<~ [[[\rEw_~pttDݑ;(sOOO޽ppp@=p9Zw۶mijB˗/ٙ)qػw/6l i̙ XڵkjqM|̄'BBBh0|p 7or >:u+&OLuG||UVÇS-4n!!!011qDAAOȂAFXExNy;Aڈ)Sоr >3899;ﰨv,أQ4oT kآVh^cWhD`%j,5Ʈ{ݽ]0~޹3gΜ)̙3͚Yލ71qƼHR^؇*gqqqDFFoӴiS6mʔ)Sh,?СCׯϟyҲeK?+Bz~: 6ƍȊ+d>0~xiҤ }… v<^s]9Ohh(k׎]v7n$,,Yf!Ivk׮4i҄`,Y"瓓Ü9sϏ޽{3Z,"##=zt>ؑ#Gx q+V`@кukV^Mhh( 6dРAdffbZ-Z7ߔZ||e˖ڵ ț-ZĠA#$$/RK]aaa̜9ӎFq_$233iժW&$$F1d222۷.]2dƎ+˽h3IHKK_iӦ2|}WDFF2eʔ|'gѪU+:uj UF ?!!!vN, &LE4k֌^zqoN:ѰaCσ{ٹs'f"<<$I???53%Zjņ h۶- 4W_ԩS1ƍ͛I<^zѬY35k^zq]Zn޽{1L[,ZШQ#Zhիe: fҥtؑ+W޽{曄OϞ=W^avѣ+V`5h dʕlڴp5j$Ij*BBBhҤ 'NGƍ5y/GУG233 mաC:txjX޾}cǎѥK|;GÃySL}vFjwKYfq)IJJܹs<|!ׯ_ȑ#lٲ;v`Xp!6wү_?wξ}Қ5kQ3f̠bŊ$%%j*;zf3 .F$$$Ph| sNoHMMfDll,0`= ^f1vXڷoO׮]ٶm͚5af߾}XXRSS;|U[oErr2|'zjvE&Mxɑ S|Ӷm|L&٠&:$^t)f={~eCj%**qƱ~h x^<ӧIHH ))L>CYؾ};]tjop}V\IFF111̜9%J/O?1sLl”)S4i,ϙܼyBCC={|qPLzMhh(CƍD] GSy謿IdwJx"l;CNNQQQ 8P>` 225k{n.]/$I,Y FHHSNd/eI;%Ѷk׮[nvߨ*4hЀ{gfY&o< )))|@1j(89sxwy&Vooo^{5yj4}6s% emc8, l+o|l66mŋٻw/mڴQvNN{vMJJf Kȑ#)RIII$''@2e8p | >|xY]6;w믿&%%;vTY|9 3F6L&ƌCdd$xyy1rH*Uķ~˚5kٹs'CM$&&w^Ooƍ,^ŋˆXAϡCgƍݻ ҨQ#"""ٳ'l߾]6TXw}{'rUF#gݬ^tM&ˁȊÇ̙3Gn+ѮJ/VPȂlʕ+=z8RSS$O>L&MHOO6/NZZ;vF${l2 BZZӦMcʔ)ܸqۉeӰaCk7I˗9qݻ\,XdΝ; :w^ƍ' ʕcƌٳE1w\222d>mٲZjʆ ؾ};III$''駟KZZ 6 I#GB ۷UV駟f۳yfYbcc1 62f6o,G1cPn]&OLbb"mڴ 0nݺq-[_͚5k4OLvZVX!vJnHKKcѼ;NHĬYhٲ%{!%%E>ݡ^?L8QޠZrhg}ưa8pSNeƌܺu ȼyӧ9s=(fBJJf)W=z`ݺu2._̱ch׮&dػw/ӦMc֬Yl޼ 6sN^ʆ zpvAjj*̚5 ۷o3tPvJZZVbͬYF*ݽ{7NÒСC:~_*$?c4X"`oX,\z2vX7$))kaضmdɒ3x`0ɄbaĈA6m8{,m۶3`J*O^ o uJIDŊٳ'frϏ?hdtY.ر[ t֍ڵkSF |}})ÎbJW sxJ(ZG]/< aaaر`Gr(} <2eNZb=77#QR+pႼm!4iJ*=zիg8ՋF&'?9€puuH"ߟd}||}ꫯr4j7|lܸX;e뤦m6*W̛o){JYVgM 1cp)  f^tIALҥӧa`0Я_?ʗ/@N,)))?~WWWjԨbgСCl۶ !91w Ymժ 4 ((ҥKsE o0tPJ*%wmb]uAZn]rrrhӦ 7oȑ#@qpp0J`0PB"""0̈́F~(Rŋ'(((<8p@ nnnߟ$e˖cǎF*WL޽Y~'s=ǜ9so ,)L2%K^Q͚5ۣdɒ\|ޮUVѻwo,YB hfnGx{ ÏꋘUFҥIHHݻ˧J(A-4d2\Frquom6AqI DjXi]7rXfD`` ǏgTR_|W^yW^y^zi]"~ߺuEyʕ+v|2˗7rssi޼9͛7gTT_<СC:~=<`1ϱcDz|r>SY1p?UVח>li߾HV{h4bXX~}ζm۲b ݻGNN/TԱ0 redҥKy嗁<%Ν; ;B-j%'';S,O O]oGIa Iy1ҌF#UVN:? .]=%q;vȢEue˖a6( (QJ8|0x}۶m2O<){TTZ%Jcc,(߱c:tpxZ !B߿'|BV$8:u$+" fƌ9r[b0xHNNq]|||(S aaaĐ?̲ehѢ!XN:s X`aaa<$''G\\[lN:7h;ESPdCFn"11`M˖-?~_إvHjF8p@Vl֯_/)Z(j]al6ϟ'..6mPX1ܹ۷ <^޽.>0ܺuI&ɞ|G a>>>ٱcG6nȉ'l8p@sI /b$hтG6oLFF|\r͚5Z sEYvӧfzj GFiӦo߾-/;1& d2Q^|C}Yj֬ɇ~(ϟ?Ç}6 6d2q%*mETrJ233uUV#hR ̚5GaZ|l y&-Zȗ(-[ɓ's b=7oޔo,Y*UfL2;wh&4vEff,mڴ?ƍlyF)Y$̝;X;'K.Mnn.G=30D㻢=m67O?%00@ڵX,lݺƍ;'-rVZٳg$m۶q)p0D!oc̙3r K.bzݣxv5O m۶sy9ӧ@zԫWݻb|4_>dgguV>}ZqyeTeUIhZ ҥKlٲE޴uv$Ɏ?Zz!1Ͳf/t2\\\ ,[,, k23gs玼!#,5XLL ۷wʹFEEvv| 3@pp0W\aXөS';XIʻIUFRdL6={CСC:~[<R gѢE駟bZb„ TV3}tqssEvGz-~mnJѢEv.ba3|pbbbhݺ5#G G,.N݌wwۛ={ҥKjժE۶mر#*T`XPԁջfY~߲eK.^H~ZjՊnݺipı®];f5k }}v:TVX䪍;JN,Xٳ C$*UĔ)SdI5JѣG3o<:wLnn.'66WWW;JYXv-:u=%)ɓ?~%ϷlB&McKJ>K#DAnݺhBHHcǎ%77M61w\liӦB{ƌ9_L8iӦѶm[l6̛7OOOfϞiڴ)ŋsGnW-%W_ѣGt-3f(J~Qxq9'eJ/-'wvv6%J`ڴiL8WWW}\psb4:u*1,Xɓ'@%ر#?H"vʕd21ydMƦM(Z(ڵ#==!6ͮ]yW'`ݻ7f)R޽{[n]ڶmKv(_<6lRoX(VQQQ 2%JPzu2% c;wdxzz2{lΝ;d/&L`̘1dff2|jԨ$I\vyGQ?cMƸqa)Re^\ph^lJ*|Grl[WK1^8p.'vjßqk͖wҨQ0xzz]yt̜9@\\\ٳ'Fb„ 8ooo}Yt邛]X#/2͆F_~ddd˼yo2ټy5kaaa<|g}SRLFMLL _~%^^^tEK=<<;w.QF4h@gFFǏ'33WWW6lȀ0bm۶ڶm'<<ӠA .{ܹ3YYYԭ[+V`XQcǎ%**8%yäI(Z(DDDqEooahQ}pp07n$**J6aPRfԲeK~' Çi߾=]tc[x+K.͇~ȬY;v,k&88XT遁ӲeKʕ+GÆ i޼< W/.\@ʢutnSz*81hFJ6m*U7d̙YRJѹsg6my~G|DEE /0p@9b&h>|8QQQ|L<:ˬYxwW^`Z| 6ѯDZQOٞa0L,Y/?G}Ǐ"$$nݤ0JGFF2uTZhh_~iŎ;Ƽyݝ,Ӯ]Żk7(oW(bd2ڵkӲeKiժ|˗/g̙L:///wNn>"<;Ɛ!CΦhѢtЁ@ oH=C:tuas?cPZZv%kGF-2¤6ĨߩS+jڴhzDvvø`ZuRvpj>VJ@ߨŜ)Kh}e>d0e´_)z:] |kOo~IhOaZٳ7WQ8$6gc:֘.[ A_}$YZrѪ#ڴigr hCYPz>)K-:u*,hzcz-u;ÿO;j!sfg/ vlwğx 4`Ϟ=vͯ߫W&../P4fsV'uСC?$I"##eرit^|EnܸaDzz:Evڿ^ @-8Dr)nuZEKaߨvTr ZZJ*l1tUqșRE`p\ݑR[b}J9T>+ȐN3Y◖aTx+hrTn9ybhXrLYO53_ R:Gmӂ8ZZ5sK,I&>6ZNF2<*2;S㞣j~+U+尠pVOJ:dȑ9 jze*4NKkJ3y_G5V4)iWOZ9yU 82: cV 24U6=zQ^$ʼn#UIʿy(tG-̛COpnSUM퉡GHUő(}aZhJM\ۙҫ1§eSS`gjR"F -#% C3#bĉܹs5jy(R2(hSXï+tfLt١rLQg.S}mv*YИjU\g$-8oAmXpDWI8dxs≯<巎l@<}SZ@a.ފcԩdee+" j8jV?sgm_$I.3R͑Z<+]o7oWb2[.s>Z }ٳt֍֭[k~?}I:)wN^->?:tСofԚ*ʴXQÙqYdG8[LR8ҫ9RȔe(oA %-ˑO ׊{wŭgvV+pjh6;OϙwZ|Wf˧>_FڰGxEO~U8/+ qKVZexP%x wݧ]:P˃0벣C:t^gǺ~u,ﴐʦOLP-.xӡGb՞~]$i=סmiСC:t#{áxʏڋB+=8>[p+M9TOСCGoԷN%?:Z(;T):tСCǟ#R"V:o=!'X|׀#C?X4v*¿T:tСCBFe`xI(o=4 :P>eT)O:tsB1㏀X:tСC("$qM4`.lP{w4ʶ)XֿU V]GIOCaט+~ (oZWt(_ ,iP[z(7LV6=_``РA[WyYYY;BCCٴioW[2ʅ؅ ֭L6iOs4^EGG3|0`6/ϓgll۶!C1"_N:u:Μ9 G>}RRRhݺ5M4a֭WT/|)/sȑ?kXpn 6key;z.''I&1o޼l@sΤbԯ_saZ6mK,3(kr uuJzfxb"## U$K/l6\B-xo@o Iꫯ۷o+QuСC2~r>vÇ'00___Xt^KZFV+v =i-yh-$i֯_/0L,X___<Ȝ9s޽;v霕^J@SN{9{9իÇZߟ%KF$|}}Y&uԡN:ԪU~\͛駟HMMeǎꫯth/qo4hЀ}1aȍV=dp>}:|T%J@$իLoܸ1oFQ,Qv:McX!<SѨ9ߋrk;-uСC3:rezY,XzꊏnnnA'BFF~~~ \\\MTOA<ό3ꫯ(R -௺oi'1hwTS3g0zhj׮gΜaܹ|ԨQcǎѧO^|Eʖ-kW]vtR,YBJa̝;7_٢>*T=zW_}nQ\E``;Β$|jvee] uTTiŬTZsAdeqTS 9TKd7**Qn6*6&hb𩟉2eVUrFrss|c|E0zj5+hq&qE41Z㓐)QR<^o*ire˖JڵcoD).M6Gr,WjFT 'h,TG}-J:L;SQ>UO\*QZ:tСT.g̘A5jUTDRN ; 5kĉwǏSNѴiS;(}ė_~caaa#44Fѿ[jr zM&Mh޼9 ,jr˗ W^ {b@-**6mJƍ2e JVV/&<}`4z*-Z`ՄGugmРg1b$Ib޽\ƥK۷/tЁ[v-زe ]tqtܙC}8|4mclBB5jԠZjrSN?0m4 a…<|gmݽ{wb!,,>}P^=^Jff&Æ QFgɼwׯu@~_M6lڴ kbҬY3x:t@&M۷/Νۦ-pmNGܼyS### & &؍J$jL0nݺ">TR5kj~/I6m}ԬYEo}v>|/rD[9={VmNd3jՊݻwӯ_?5kF`` &LФ7###FOÆ ={6V/Jf͈$++ IX~=L>&M8:}4зo_Ξ=+*Zhѣvڼys,Y"'h &uK0`4mڔ˧l6{s4lؐhzKٳٶm.!!!$&&p yS!88 :܄kժ_5mڴQFꫜ9s#FиqcBCCٸq zEpp0AAAL09rܧ{Aff&ׯ__,'Nd… < ʗ_~)#NJPP!!!,]N:q|8~8}!((Ə~熻w /pq֯_OTT5"00?͛7?ݻrL&ONƍiڴ) .$;;[Y6۷oOJJqQׯr' P:t@p}6ǎK.GF)))$&&#L"W+$(zwj2gN>֭[IMM$++!ׯ_ȑ#lٲ;v`Xp!6Я_?wξ}Xr%6mb͚5ԨQ3fPbEXjBj6O^:SL!99%Kʻ[nLJT6l@JJ | Fݻw|r,X@zz:ݻW.kj04cѣy饗ر#;v ((H~e`6l۷+VKjj]… Z*ѤIOO~-AAAȊ|/8$С4RX,Kb6ٳg'::Z6tYV7nB H_MV(VX|%ٜ:u䣏>yҥ VѣGsm֯_Ça̙(Q_~~3geL¤Idy͛DDD*+ρ(S {&44C)}\vM4_nܸѣG`;&\w!''((#225k{n.]jr@гd.\HZZ!!!L:Վ,#N}ZZoe 0Yn<&''SJ֭ @||<5"==ӧ3k,HHH`dddf}ѰaCXjt֍ڵkSF K9eKxx8͚5#,,OaJw{F`g!,,L66( Hf9߱xL2epwwXV?}H"?;,kw(.E"5`, E@5*bk5`7QQ`4&X@Q챢b"E^.X;̙3g9s\\|:uP1ֺŋHMM899iaaahݺ5 4?{{I BCCC 8:~!lmme˖aŊ/y&&&1|١u8());w;wʕ+4Trrrpa^- vK,… )/cJ@| b|$* rDFF֭[Ϡ#FG * #<<\^0h X[[GFx瑙˗/#((ʾjXYYs8ڵ+RRRt  43r Brr28CBBwN#771H@CP 44[lwT{ ( ;7o۷J;00:x7h/^đ#GPRR>@ SΝ;'R{NOw#yd  K.ax vZ>\/_zYdٳg##,))p&ɼ0`LMMTduXZhBOOO4cz*N RZj<nnn899ѣGκu",, nݺ]68g}۷o޽{DO qA.HJJ\.!QV-lْfyb ܹs_u&annϟc(**=jժE7 :u055!߿Lٳ>}:LMMT*accb/--Ő!ChVغ.֑eo<www9s2 )))N:J4P#+++C`` Zl h۶-̐S;|pԪU 9rd%k2 b=ʒ?ݻ8~8֭`D# 42۴iSۣUVԮ]<P5x`FԖӦ/bu?O4mhhwwwpSSS8;;S;vѾ}{<>rNnݺڵ+ Ž;4#RVVCTpvvЬcvvvعs'Ν;===4i2 HOOT2d| e===Ӭ{y{СCajj ===3FkR$%%ҥK000@ƍ}Ebb"0*]vL&d2 (JÇn:vJ[nt"11]tEOOOj~HOOQ^^NO# 7l] $H ߄f T*dgg#dAB͚5N 2VZ4|/4Y6//O#hmm`,//#Ԩbgg\\⨼q@ $+PhT`$X!\͛7ٙ_GVHʕ+ѴiSj\ ={RlbR:H )?^.ښ!fn֨FP6;#$$fffXn1b|z{{{'`hh͛W+#݅Wհœ'Ow[n/!5lnnn8tQҍ7"%%022ڵk1`l۶ƌC7nٺ* #GRq1bPTTiӦaҤI׸8,[ <# gqȵ7apXw5п̙3111YFBJJ  L'''X#^ZZJUj5̴ "h⸊b[nE*L&)}ԩ48tЁKǎ;h3 ³P]O>ɓ'舆 kj׮M566)򠯯/:۵kGǍO>ƈCtt4FPdddf͚066}z|N-ψ odݸr Ə 6qHII!C>%@EO>9NI6X^kצg͚͛7c„ 055ĉѦMk={5jVZ ٚv %K@RꫯCf͚011x9 +w$(Ke``@O>jA$W5$LEf2N(,,cĮ/غu+^| ZM;uRnݺouѹTȽQZZJ'^8bd2oe=jdIJcabb|N[ IDAT`έ& <|:jYYYa 6oi j\|Æ C ЦMp}}} Ge֭իW,<ǏAdʢ{͛Թ$ן>}/^Dpp0͛EiUܶm.^ ŔW^ihnذ!brܻwiiiu̙qDGG#""Bh~FxʝB#qqqԩCy@' =`.Bܹ۷GFTR;|0O 4n7oޤ|)oc% !H-q C߾}m6DDDTP*a4iz )TwC__B<f aaa===VR 8ӧOG׮]P(0qD"G7mڄ}bÆ xݸqc|7x?QFL㭡qqqطo֮] KKKܽ{f011h_V#00G߾}ѢE Z_@Ld2R}XaggKKKڵ 999㏡T*1n8]vZMX>/sssk`!|q闥%> ™3goooj|gppp@ݺui2KL9)#"6^d144III6l?### xڵkGdeS--ɨaG @E0033SLԫWR{<r ɖ3RPP $GY=** 6lOppp3[իWX|9:wLׯ'N#۶mCz,4mmmѰaCpzW9XRRuT*5jgRm۶m>ujԨ͛Wkr9Zwbǎ8prrŋi`233:=ݺuÖ-[pyx"} }C-0$''(yMSo|{{{ԫWOc~s\EnVVj5n݊M6yܾ}pttze˖Xx1JKKQVVe˖SNYfњhB/tĴiӐ714i'OD^^j5?~ӧOI&s"| oߎ۷o˗Xr%<==aaaAߛl6byӧ ~Zl( e˖^ݻwQ\\Bhт)--O*s](--/Bqqqppp@zE dddEEEhѢ 233q1֦0117|X\pACj5jժ;;;|<oߦO(++֭[i`x9-@ƢN:hܸ1N?ϟ?ר|%{BOOZq? q())Arr2`fii)Ͷdh߾=}UG6 55d066GR!t;X~= QRRף\4`Nl\W?222cm=##OcӺnBJJJ{STݻڵCff&v܉2dddয়~eoy'MB<.^bd2hтq<QF ֱ6]ZFpp0hŸ8JΝCqq1 䄒j۷oGhh(_%sUΝ;q|{^}7nf͚!==@qoh֬>Ch8oIdGz ??puuŘ1cY$|$[+ ɷi]v~w!#~3$BT⫯”)SУGDEEQ\Rڵk޽;ѣG]vxǮ]KKJY PTcۼys4k  }ACRR}Y ܹs???aFFF&Nr-ʕ+qEA.{''ZCѵkWڵëW`( XZZN:PfMA$2e3HY&N"8$BT"::SNE^0at҅._p]L8a֬Yطo} \UV!-- ӧH}5̱ӧOǞ={}ݝfl߾={% yxx8ѦM 2aaah߾o`=Caa!c􈓧'N3gҷjn۶c֬Yh׮>|ѲeK<4 $$C 7n߾e˖Ѿ??( KOO2:} -- ڵr%2񍌌5kkk#,ȺB֣իWٳgT?3Ϟ=r7x`Vo@&ҥKpBnsa41> GT*M6 #F@hh(w!+l:> `d}8q"&O WWW,Y˗/htɕ+W ۷%,?NgA A VpQ\\ ݩSZ)SgΜֆF16Xכ=-rX>rm&kC-N °;ǬA>#η}%m'Ab`y;5sHF6ZQ }6&r /!F䇭#-4WW!; `Ϟ=2d]`?yb -,1"38jah۶-}7oDe@?!uVGV5b`:{ɕMRL0[tصl_X#>K7㬭X*5D^b:M8'7&aOL7!dl cUliu*h"c̙d?2*,rױt6LL:\(lb6'Zaڦ@1P9uEh4rW^UV8z(j׮-ڮ6Y8q"0ahY=T(?V $Hͥe<+ӧѦMdggӒO4ijh3gUUzb-[l BHb3ѡa$4"YThWet }pX'KsĂMCf \d3Yg c1څBǏm9%ڂ'τ2'\:}BGRvj5K\vCqJɗX?Y^ ge[̙渼8wի:u꠰ׯV]D!U+ 9BQ9?mרj|066F۶m$Χ0(i֦ׄF|]!/V=BX`%V׊!5b.M&LmG 6ybc hYt|~B~f?J^e'/?ŴV}6كiӦUjS+fuyIx IUf e>_m-[*fYb?^BUQ7`hh @VcŊhذ֗xX~9nݺ`Ϟ=,8rn\'\Wـ*+ $H ߂wd!͹ft1#asHXc˂!BcAHkeeeӣ߱yL(aֈQN['G?XíRQsָJ#'g\p<*@"4|E ̐( ̛7O%'-D@tf9}ut $HOşvBuoӦ䛴Wswm*u~Szw>ks]!ȿTu߻!?̾KQo#Umͪrb2l7i}KϰDu]+$H #m~W 1zU=sm?]}}u\|uͻ:{63h}mQv\~ר|v$H A  +D쾿P/Do?c5Zy_ dWgl8o7$CK*>!%`I A fޫ$H A $H _)'A $H A $HOC I A; $H A $H A b+sUx\5cjAAy vnU'i;,3'AL!,];;F2wu@6XZ18ٿ~g-|xWmW %lPI&,? ?om'*g>ϼ].m*>uM]+tϛ>M3 ߷1 A  @AAApBω1۷ok<gϞpqqq_bn f믿Y$Dqq1"##Ѷm[ 11GqG}Z>=x}􁛛͛g8L6 ˖-Z޽{1zhÇѼys?.1c.] Z]va#мysw͛իWyl߾} '.uׯĉYohY#kOhh(N:Kǯ Zm۶!<EN0c xxxTw/K,CPTT|Whڴ)o޽瑘H~:VXtp/:tdp  s~6hA&j72dz@[ƅ%'+ B#;ެNW_}KKKt eee=zPeH'룣1c hܣmވ?طo|||`dd$zZ֘;BGu2r׬YggglٲpyWҷxAOOڙ3bmQژ\)))vaa!+\x!&& %|N IDAT (..=L777=zK,ÇYfy:9((>@ϑ#GP^^YǎT*EBN6v F[@9$*="//ΝCh!x%KU/5F,+R&?GfDDƄ-v q(//L&CV`iiI \/2V kl/WP$Wb`u*;Bۆ+fܹs}\`uk&CCmøqtn1ӥsaRk&}O#6;$H A :.iii0i$ބ 12{<Z@w£B'\Td]g(F1tPڧ-[j{i1ga>6(޽{a``QNXXXT29Ĉ& ߻wC PQC6(Iii)uVQǑuX υcw^055hSh .\@II *;yo8un RǏGRRd2tR,\Zc >İas)QTT/vvv:baaa>ho1#EahmF>.I?,tʰw^/Z5jDk)T*iߗ/_"''͛7|ay_̏yu000D;᷶@6]N8ǀDω/!(s+|DEE\oFdd$4iR(++ï lܸGƙ3g*/̓?v؁H$''ڠBp}Q ZMhBɢI&@hӦC.*sm |8n߾CxƏ> ѣG?cذa~^^ƍ777bÆ 4<#G;w.r,[ puuŐ!Cn1c1qD8;;cϞ=R?y&\\\41n8>cƌA۶m>}P9իWѻwo8;;Ǐܹsp;v@~Ϲ///L<^F. rK.СC)owڅN:/_5k/_R.]sAVV% ի}0y̛7]vVPCxxxۅ ТE '~رcǏ7pqqkD# 0ҥ B{ntnnn֭Ν;GݢE ZZ@&ʕ+cqѠAԯ_GYfaHuAVS]RЧO9<#;;Ǐ'<==5bFFi&}rrrRlqбcG899!88f]zaaapqq֭[GO>EPP~WÆ Caa!xǨQp5*,,Ddd$bbb(O~'fϞӧcD* ˗/GvΝ;*t+h;ݻwE;vĒ%K#2e zU)PްaCL:d ˗/KF5%%\.GϞ=ahhIJOp2gKJJP\\#F۷oFۘ1c-[">,, m۶E۶m1ydcѢEE-㐙aÆ^^^0aJJJ/___j  BNNV޸q;w;HK&/_Ƨ~͛#;;xbxzz gƋ/&Ɣ)SOOO=v]ٶm:v| zݻb $&&CXp!ȑ#ի|||2,Xh40Ζ{„ ( dեҗ* mڴAzz:&Mω)o&Mٳgnnn={6ZkmڴAtt ږϔÇS8'ODnAa0a\#m?|Ç/<==E) 3gD۶m9sh2׭[G(N9J9s>>>>ɓ'b|,]puuEǎG%H Amx qd\|ݻwsIZj!55{˗/1sL;z* ;p .͛7g۷wŋ/Ҙt޽Zƚ5kVQPPAw8y$6n܈;wbhԨΝ [[[۷6mҠGP`͚5hԨ+$''F;$аaC9r;vCpaj۷k׮ڵkqi8;;ĉ}8fU(Bސj5йsgbh۶-Tѣaii'OvZ>|s;ԯ__~%RRR`bbX:u ?3= 1[lqitرRr*J#PVVF_~= ?3g`ƌ4ХR0qDL4 gΜ G(((ƕO2_RR[n!99ӧO|r*^н{wT*5 ϟ?ƍc޼yP*ٳ'߿yaݘ9s&MFӧ'|???,ZAFgFIr'O0|jfo$/RpwwGPPfϞRL8CGYp &>cǰ~J7yǺuf:u 5kRS$-[ЫW/{-[ĉyfٳ| ˱cĀ8L:8x ̘1\t III8vj5֭[===_2 7oFJJ ,--qa|7f888 ??Oq[۷o֭[QZZrܿعs'=  zj4jsT*52=VٳgQa`8 LFbػw/6l؀'NUVX'N+WĹssN$''t>rt;wıc`aaX ]۷HMM۷=bcc aǎHMMŝ;wK ƞ={pq 662 O>ȑ#1rH;wQQQHLL}FPPz: 55&MBaa!Jkmڴ vu MX~gl޼GPQ߱O>8{,"##1c J-^;vđ#GCVcÆ cǎĉ6m,--i [Gƹs?Trwܡq ь:1{ öm(͏?ƥKйsgzNٳpB$%%!)) )))M(v|V'P. cǎ!jժ:Ν;8Gz'8cРA>e 3Ŏڢ_~P(+58nݺ좮]ҿPRR^zI&hԨ)،L1Z @30*'a<,H +^|r%DFF8ԫW8x =Aas0|pXXXАfGcLh~._N:ѱu/^΄FS?CDDadd!C %%~g|ᇰ\.,X+Wbݻ7Zn abbpl߾χZn 㐝ܻw HLLĥKvZ e6++ ƪU~?-^ϯ4#Smm}qHFqM|gÈ#DѣGT NAA7n6H@┓iɓ'zhZammMEmmmѥK\QTz-33'NqP(T*^7vX~|%ٜ2   4hxtѠAcP(cǎ1 WjOBuF=z@ `։]6={~ EEE["""fffP(@II N:%*wmظb'xgggcܹ3gN@ xj֬طoQ=H2[=z˗/ڵkQN:&sss<۷oUV-'krttDq>#ɓ'*2 {{{Q+Wĝ;wwU _K3g@&aN>>y:t$H푔tr|ᇔ.]Ұ}Xvi֪;p}@RR 333`ܸqnGzz:?=#%H A?% * "feef͚'2VZ9&˃ 5x GiͅsfggG]yZkeggI$X!\͛7ٹҳ@rJ4mTc7uAgϞ:u+../CRO&ɓ'rX[[<_QcA43aLvZ]qaaݺuƈ#駟X!7o^lKBAđ*aaa5lnnn8tVZE۸q#RRR ###] ;rƍL&>°qF;V\eC/i5 g&..?o+CU k]լYaaa;w. QF!%% SLallLﷱAii)mWVL#lawJ-[hȘOɳe2LLL/aiigϊηLԬYS#_PP@sZg3\ آE ~^+++J'ԫW&TΉJYD ׯ[b͚5@hh( #;;uh;h몡Mwuj51tP=GXLTV:KԫW҆GU\:C3f-[L4R^F4I,pG^z,:]NOӧ4!9991cf͚$ɐիWl0{l'΍cӦMŚ5k1c޽{m6*vOtTvvv%r׮]۷Q֥t8x{{cɒ%PTؿ?f͚###F̐6zf``@_ggJv: <ȈꝜԭ[WڵkW:Mpe[x-`jj*ZÑ8ZC'%O|xbes^xgNNjժU~aPn]z /^6;;]6sM} u N β,J%rrrx'OP9G 4ěJբf͚˃Z2//|"˖-É'pU꽪T*in*҆'OT1+Fɬ,=4ǫ=ܹ+hҤ }"}qFL&C*U0j(?~Æ C@@'}58STg޽v 1P(ˣmz%^|+A VZ . !! 4|ܹPؾ};vM/"(++î]Ю];̛7լY3XFRR6oL-zU̝;ӦMî]/f͚T(J*IلJ%??q%2yWY7hJC6mンgҥKpww Hd^~";jBvv6ao5/"<(Ejܹ3v?b> 5ӗWV\… x"Ξ=Ke3ٳtH\C[AAlodee'33k +'~3 a8|p7* Zؾ};°zjE!5j>WTzcYnnnTZb\e1tP;v W^EII ueZMxPϸ2ɓ'Pvx), ;;;,_ǎCjj*6l :'$@ $Ho[a3f@TT""""ddd ==pttĚ5kRPZZիWo߾ԳO>˗!%O^zaxj5"##E=tɄ`^^^Dtt45LnٲPnzyXh4ԼqQzF\\~we  On}DƀeYakk ,[*'npy~zC`֭P(ر#;ts7{D֭(9vXE^^N:E֭[tlkk KKK[p Ϝ9~5 0j|6l@,O7$?Mpp0BBBh"o8vѼ~(,,D&M`cc,Y(((֭[+V@NNJKKlqqqFtt49̚5*b |8qg An0{l܍IѤIlذ@aݼwE Zvvvt#~!JJJBjhrtx!ѳgO5j6m~ZZʕ+ѻwoy7D ,--qMo d2T9,cHOOYYYvt:˗hӦ }799aU+ݺuѣG8/cժUիW4//͛7GժURpQVdddܹs`Yw z0S.] 33h4DTTo&oh]!ڵk˓Qոs ;իWHF"22==kԨPRRL?-ZҥKz0L7pLdd$4 JJJuVxzzBӡk׮BLL MGT(/;;KhԨxᆪ $HCX~=6n܈NO>aaaXp!<<<`ffooo̜9*~-;;v ժUC>} !_~%KG`_5/\l8i*Qvi;Nܸq#MvT*1b ۣW^Czs FrR G*,lBA֭=zhZtC Ux>h ( j( ڵnWX+V(WkL2*\ewL7FBp,]>>>`Y}ϟ/zJ6d vZeeehݺ56nSSS:M> )Ȳ!aٳQjUԨQ~~~4RZZ333C~ХKJϏ9WWW(OdBNˉ"-Z1c+W~ddnnn޽;`ѢEѦM̙3ի6Yv-jԨXt).\777Jq1vXcРA/Xh իo333v'uB/LJKKKbΜ90555C wFFFV\ L O>w ǼyKKKMP~QWYzr̛7Ajлwo$%%a8p yuG0j(\v K.EժU1j(:}zݺu EΝQjU*I< \>}:,X2ܹݻwӧOl4h6l@Fe,^χRСC1p@Z¿ȕuݻwGzz:P\\]SNɓ'r r9={Yf!77ptt0 K,BV]vظq#hݺ5 '{JJ Zl'"øLJg!00nݢ|caaիWcɒ%-6l@Vjj*S ~!Sx 8ZǏ_|Bsss,Z.O˗c(..=vލ@7uG}A^dyTR| ƎKY]~K%7nȑ#s(JL0͛7G`` .]ݻwtZ*֮]#G]vgϞaϧ5n80 ~ԩSpvvF޽1{l899uԁ+<==53gΤ}XRR-[bǎt~hӧOG`` oXhw666TY g禫+ϻeK.8prr( ]$rs0 WM6h۶^m $H ۷QRRBhLDtQ4lM"99z"&b9*J#&p}erOϕ)V/wS-אB8pcuBc߈AMƴgXr{ChX>%RXO8od|rZ-dޭ^asLp3u38rW~!ψ G_1,b@Ϟ=_k_YF7٘ B' \:yI1v=M^}c'C}&Vp1f4t}+b?1#F37Y3s$=}8RVի |_3n?z1z),K(wd&)<ǧ Ng%%%h߾=._\!OP> طoߏ]v}{.Pe]Ǝ$H eK/{W8s /ݎIIIԩrrrhw$TZ͛77>O$CʫP91է8 gCʀz*[Zm?RW0Wf_W9Wl3bȐ*2%a'*3Tbu*ncK0Jn嘻I [x NÎ;hln;X_2Kem11&tHII'|RϟcӦMpuu+';}1UN&]_bF)7brqG~'h2zž3o Gh\cweH˥.r勰8}}dO!i-]L+lwmj CFW}c-,KU1In^ ueYQ㟰%KTZP~'Y~ÅQLh\G9s簰@ǎ1m4F1!cR!nJ*3ꣁ̧$za^'bq#4 /^tlM?ׯ/f1C2^䌾z񂾱n,-y.1^ևX=!Z10 ep>  1$f`~oȰ)F8aL bu o EplWv D䷃bΜ9(++%.[k11X9c#ep_lLǫ,[1}tzZ?,bԨQx FùFQ!1P'0 WN23_$H A -uNI ˅V_=|' zrз9nhNjL3i7wM! {GwC}\ۢyw̝ס}2 А mFL~~e19y.('cߖ7]91&eVsmd}ϨfaoL>7ۮ\}6;O^oX:?Mcb $H9BH{]/oZ~tMueSNbB/cl^ŒNMz$#]e'b@cwp&Swwޕl A >" PS2` %B_1>i b Tj$$|(m_@e>b;i| {/ =u)$H gyCF>}G}WlB $H.!i*xډ)\w QNFSExߛQ̓ŐgLJ@ zJcbƒQ&$_'\ކWOwn_jZoIJ A 5$@ yeC>$㪡O?$p&aozр13";ہ%H 0}A_}d{P d $H }B0w}>Bῼ7M90!jxG»5f{ A $KHq `CK#H A‡ ! $H A8weY^ 2@N {HɽO$HOC2jCvC-A $H ῃhβ,58b'oZ z$2pFe#VpۣjSm bm{64*Ko!:%HCbpok7 Ce^f<~um'}HsW $HxS|xֿ[7)tS1@I#YCW_>Uqu"lse #^w>\pz "AwZ}кdx>lJ A V3NG.>Tn{\ט.o6?o ; }J1lh6Arlɾw] ݴp=u?!Õorُ|O_}ܾ'ɸzX+}z $Ho¿fУGt:j <]ʈNÇ1tPt7omF1 I&a߾}Rubƌpqqbbb0uT0 ,8::㍫(edd`Ȑ!pqqAhh2FzYHH'N #leeegիp)|rLvv6h/^u1zh5:DGGcԨQw.!9F6 RRRвe7k{Xۤ!;;-ZF{ΝRfa )0 c͛7k׮={_b ///goҥ qGGG)G_0kW\App0 -k .ĪUD%'<1$o'N`ȑSNL&ޒܐi}ݻ7.]dF%Knnn>|8nݺţĉ6l憼"x&Mnݺ… pzW^oE E@xѱN2ܿ10p\.d2LLLx9)EAPׯv&MФI\.P>L\.!F1cZ->|unݺ^:@PK@(+r7mBh,'ureѼys\pV²eTCϞ=CVp1$%%aԨQ6mj qDGG#11;vL&~zDDD 11666i3f@qEY/ݻw!pDDD`Æ HHHg\ GFF?$%%a޽gϞsnܸ@to۷L'MMMѯ_?Q#=w^&l.! ^cC.kbƍq=Q>ׯB+xpsv DŽ0 B+flBCHL&9 r A@ekbsY $H֫w]hiӦQF#0 0c t3g^xArrr͛7FΝ;pssmɢ^TTsسgDV}||/ :t㩷VEZZFWWWtjwƏLbȑ]`ĉ{.,Y>}ŋ Bxx8r[PP,Y7778;;ch4j(--Edd$|}}ѡC"@P?Ƃa'q+WĮ]///;w;vqD||pvv'xʣBVĉq,]{Faa!4 V\nݺcǎ;v,޽K7!!!8x 舣GV_"..ŝ;w{g֭͗_~ www899O?|ヴ4 :P믿Rh1 ۳gw.] 88zϞ=8p r9V\1c@Ѡݻ7P\\LhŴ+W"44۷xaÆ 2dkt!.^~~~U0zhd2dee;w0~xYu5k׎Po޼_}X˗A1'ƌǎCΝ󶷷79ǯJ۶m[\vMkqqO>^`~'4>""Ͳ,LLLj** .\b0 J3gRI&0A=p),X>'k׮pssÜ9sPTTĉyW_a˖-tضm|}} OOOhϟGTTѽ{we˖sSN{ ӦMÙ3gPXXG!-- _|V6mڠo߾<66C TiӦ!..Ϟ=NÇgf͚]6&O,jm&&&@,y[A1qD(X:u*/믿bȐ!h߾=\]]q0 gbpww'6oLxǺu0qD899[n_* ڵ+\]]/_(?pӧѭ[7 )) ~)зo_\tÇ1i$ӧO煵hZ"00q/_ĴiA=tRcիгgOiNNt;vի8@ӡ=|դSNETTc3fw}WWWPۡCZ^zz:6m]vubʔ)شi̚5 ,ʛQQQѣw!$$0X [.G8|0''' :Zwwwt;w4ʨl2z'$$>qqq5)F+WĥKw^((-^/FRR̙ ddd<ÁrRiӦ* |XW;;;Jg&MC,{e˖T*JT^=BFFJ%jԨA#BNS]6,,,QTx )M6P y\.Wv)++CJJ ;˗/Caƍ˗sŏ?d]prr•+W*&&&ؼy3d2كxԩSXx1-Z$̝;f۷+xd2dffRAa̙Xz5\{{{^g@| epeݻ?ݻҥKx"ƏOye_7oތʕ+ܹ36m쐐͛7c۶m<β,~ ϟǩS0ydxxxVZ8y$m0{l'NDժUq%۷vNȑ#;w.ӧOGAAt:"""={ 990aB={ $HOx,d2ԯ__Ah4Bjj*f̘333XXXoɓ'ɿba@siL4 5kքB_1 UTza:u 6D>}0 5j%&`(d_^=|P(_>\\\зo_A.zۣR0d4ovvvK9eƌ___Ǩ"}aHaаaC̙3BlHx)=> 666R ƏVKeeeر#FUVeYdddƍݻ7 hԨ_ӧOZjSG:̌g:thM67iܸqP(R Ǝ'N= {{{ԯ_Z ?#E2,ˢF=z48%KAСANNT*߿C!&&7oޤ^S;wሏG1m4v˖-%02}d[=p}:nBr r9q]|011ɓE?}дiS( ֖/oJIYeee9r$ԩSSSݻ?)S UVń  #w^^^hР>^::u\ mۖ.nڴ)r9틆 BP"s["&&: ܍ջO:  6D˖-ѷo_4j w^bu]*lmmq1033o z]YYƌz~~~P#ܸq_5 J%F-a4n'NkPZ54m@3R;vωif ヲ2L2r| 5kFy`kk L777ԩSd8p&OL- eee8{,] Kaiu{?$H A? _sB"''i"Mvv6WN7[dshPXX G~;&|nݺz>$H_Hcnn.J%+AԻ(d aN^SOb!bb\.Ǯ]HFHڵk Vѻwow%%%t6 FҠACݺuQXXH7:P8MѣGj !^H 4i?j֬M6a…)J*蝛K%DkVŦMpyT*j{G}~~>ƬO>۷i1LyūW鐖u!''r< eGGG[.Z- L'Ox1puoL \#6ycl޼n IDATÆ ̙:u`ؽ{7fΜ KKK̞=bЫ5 +Mڵʻܹ077ǜ9sо}{ 6 aaaFrr2lmmGRIy UVP6f͚Tt:Ԯ]'O{' t:_~3`aaYf~3rJJ 2<,ұdΦΝ;X~RR_=z­Ann.)wޥ4|<ͼEii)֭[OOO4ogΜCp!Ƣy5kBBBxCAhh`гxApt C1{l܍LѤI'˗ؽ{7oT*cjaggjؿ?KLLDjкuk_.#''NCFF7ptt9j5Aa(o1ʍr͛7S܏>n‹/0 RSSquZ7o>B^={ 44A7~-rrrj|3jooOWMs%''#!!={$%%ѲիN:aݺu(--[M?3o|^~ SÇhժ4 M6öm0h wBVcڵpww5䄰0T*ܸqG4 4{GPTT5k͍R) ӧrμyD=! z* nܸhܮ]"33˲(,,DNN={KKK… (((U ;c֭FqC֭[xT*BYYYHII2ZXX`駟ҨQFV=U $?j8x $pٲe())Z àf͚1sLȅn߾br\zT@Gxx֫W^Ĥ˗/ڵkprr= F(a7Ff?BѠ;wbhҽ{w߿z]%$$q:>} HĄF*Mիo^0֭߿P=ZJBǎirr2qpaSt-dMMMQJzIL&q!ܼy,"%%OF>}ĘJ&.!XEjj*=(kڴ) !ˑUV*B3y 4h{{{*˟?={W5pRϰadׯB;b!Ƅ5 Ξ=KS>}iiiҥ ?"##3jDEE۷[믿Rz۴iFZ\̞=:-A $/u0tሌDDDj5ݥ" ME$bl ҔF+DDlX1֨5KT("j(`[ b",o&{0_<>Μ9s̙3gXYahxyyАޚFʈƤI333t'4QaĈϴ"T*UcLĨ%N\r%[̚5 *UB>}Bnݺh۶-QZ5 CCCjttd.MEHHOT*`hԨʕ+%K`k9 Yob$B/..1114ѿ &OL' H4㸢͛`j888`ڵA&̽D!F͛3<_SNń `dd͛Pո~:[ UVtaFٳ߱# ooQ~}>>>HJJ¢E=k,ȑ#qaΜ9ydaaK| f̘OOO}ٳggXQ~;t * 3g*TЊ~a#"L&hZ ̜9'ND `ll ddd8lٲw… qOvZ4*J,_QQQpvvq Jor.zDTbɘ6mahh .]\@/^DLL ѻwoPbؘ-<<sƍaff;[XD6R&üAS"""j D`ii he˖۷֭sؽ{7?j``L<5kɓ'ѯ_?TT /ƭ[`hh[[[zJ1qD#;;_|/^ZjAӧ8}4ٳgcʔ)pssk4j7oޤ2wL4 ϟ?󰷷ǼyРA@__ڵC~<6lP 2^Bf0g*ӧOɓN:::^z!//7j˴~pqqaSJC`` HIIQre!F$94{$HVoRzu llltR,^ӧOf̘VZZ*6m 777yBY9zzzhܸ1֭6m͛7D( TT +Vܹs7(rZ ƈAPJؠSNŎMDFFbZ9o߾QF!??*T/ h8;;cٳ'"""SSSt &&&X̛78!!!IǡgϞ8<Ə8zzz"88;v)+J|l:ߟ:I!>sXXX Zv qXx1MFŰ0̟?At0F޽͛74,i[߾}vݻw1cH7+SzԨQ5kHҋ9Q +Us̙3P(ŋ GFamm [[[ ޽A!//m۶, ƍ3g"&&֭cGFFӧâE{e'| y׬ s2LǢE|B={`sss̛7+VDnn.ՑB[yۓԽdL6 Dq Vw^1J&&&3g=ܴiSe˖ZG F@/WƎsڵkZ*,YjժA૯P27n8:(z㐔ѣGCP .DŊS4r$ 2dT7n@^^[P(ggg|KjO.gNdvRhȼzRegȻb59Fc W]Ww! %Ax쎥5\YgclT H',ϤxO~# %a9ˆFB9{FD.`R4H–'x(%3cs]2L }-|^V't4oYYY022Bݺu?% ,&Z&B]0yFjru&F!9'\ {6 iHH?߄>"VKW=bN_R& @aYӈ8J+qgN(BPYעHj!,%4tʔrʜXhZڲh0e\~])]*"TH|}#s֖Zf u…$;bJ9bms<푺fcOl!X}ǾBXE:URP' ǧT1F gY>+?>{19&`FSL#T.ug6z![pm.pML&K3K9 B -Bb @{\ayJ^6}B{j5rss4hzzz8p222иqc*l`]vb O7J#ll?!YHOJn%}] ynb`;w`ii/^`Zy:Y]f LLL驓&v~ebϖ4΅Pl\ž!C 2>|p (! 5@Q'KF*삊ǾBXA@F @ +@A(rl] q2tAR=`!4}.\K9X@sPeZd ӂ#.l9By$ M:o~؂(KÃ姘J,Ν;H;vV[XX{/zV^u!??;)#BۗYy[ ZZsPE[J/e[;o)'l RIy~e%-$"ʲ`$ϲ;86ާmF 0!\jӁg)YX>G1yf:B7[PoZaJe &Rwa4-,Xuv]}#t vg1Ǯu]!t< }upo %r@ ιs0f}hժ=ZBJO9rQQQZ*,XPnpGNg[cSi^!/Jr0ʐ!C '> q*2u9'ߧ̿B!W+)⤬e/=:?4>Pt-G*CE_ie@W}1w޷NwEgz?L ۯ%!c}]2dȐ!G()JCkx)d~{ U:-7OzM<<.MYO?9)KQϧO =eAIs˿Aާ[wɐ!C ]NEcc'?}Cۿ(TXw9E/wL;刺wcr=2dȐ!CrZ2dB^,ɐ!C 2dȐ!C@vʐ!C>#2dȐ!C 2dȐ!㟁!C 2dȐ!C 2dȐ!@9Cq/vO`2d>!yɐ!CO@2dȐ!C 2dȐ!C 2d_My^.ۧWV:HxJHTIC|:v}h痪o?9P })_T;qSPP𷌣)>`V R`AB9}Z2dȐ!CFI<σ8IOh,G;4MZ94ڤPH_1hwޫO YVgd2*27:чƇ;qP(e]2PV;]J%? }Vφ(qOEޤ fT*?8d.&a;!5JR -S}Vr.,yY 2dU|VP@ 'Dk]خe6>>v'|&h4E闿Y1'AB%,)#cm;G ⃍ZK \ܱSQ*D.S0D*2~, >>4v~>.˻b:,ER`b#M]3-L!iES6][Ȑ!C E@@.\P{26ln׏<ҥ 0zhL2k֬)uݽ`֭dØ1c___$$$ ,, !;; 4(SyMCٳg ?:8äIh"h4$''#,, p}8::::pyGTT.\F={ 44Cff&ޙ={6bcc<ѽ{wNTTYp=t Θ>}?Md.z)4h B˖-ۿBipxo8L:G4iΝdD 29ϟ?wwwn.]pԩJyϟ?MNL2/k48::ҀFϟӳRX<}Qԝab QQQX $v IDATl4`H;reȐ!CƿdNPW\ȑ#j9v&r~H|]gP(袛5bڡdٱcGgGPGFp,^;wx(RB B҉٠AԫWkFڵѰaC\pjի<PV-ԫWC:upbu'&&޽{8r~W_~-vYް^XƢ~HKKCDD]Iݒ3gĢEt>F/$'%%[n>A(|4|8y򤨼|A@@УG_dt pssógt<_Ç طoV{zS*hѢZFAW/RFUZh.$SbҥPTPTN:! N?a,K#[_IrK'{{y,[ 6DZZ&L/j|,Z^^^pqqA.]p92РA<~X|DEENNN]SN!88M4Aqy< .aÆسg̙3ի充 jիƍcĈɡmKMMEpp06l`\xQmpQxxx >>^ !!G:uP~}:ԪU QQQ(,,i<1i$/_^k+C&5cIwǼ]%9~K3۷%ђ;#)C8~tqq~b4 +CCCQ^bؿrKJRzGqhO" uOa3,ݨ'JkRR^zUR6xisg LMMESbHɕ'6maÆ߈< m aBrdOjn/R!)!C 2dNBgϞE޽_`ӦMHIIŋѢE -8U' 5k4j 8w؁;7zKh^ppqq=:FFZZoߎ'O"((ᔮ$̟?8qN8SSSQܿC ?ǏuwR7o`ʔ)^βXXZZQ ^"H(B]8&u!9X'%oDNIN"!-.ᢤ m*,,󰷷_|A]OO:LF[ч"K82#+|}}P(t:ؾgd+++4iҤfǜP.!Di{.#!ž'6=^Ѵ2dȐ!Ch֬Y _5jW8óg"'N˗/iYNNNz*5222eh4CRaԩ4⧟~uqǏ[l75kjEK]v {+ZlXjܺu Ç^zi * ubbbЦMyላرc"""0sLӦMFqXf |||x,1OBcH ,Ν;/ǏǦM0dQ(''G n:-c<|pܸqf͂?rssQXXEQQQعs'ƍݻXj@:u`gg 899i=vZ=k9prrBݩڵk Vz1Ν;bڵ ={j|Əwi9~gt J .)oك/_۷o8ӣv}J5.\ƍk?#FHII'rrr=V$o߾hѢOOOErDt...СZy7 ^ 777ڧa߾}/>}tӡ@ƺxcƌpvv~ږBL0>>>pwwGnEr͛7S]l:RSSѡC8;;A˿z*z '''jՊ[T CFFfϞ ___DGGc߾}3g|}}ub񰵵qϑ%7ʕC۶m600 {b0555 ͛7kGOLLDPPZhY:bо}{899!00uܤf͚B@׮]ahh#GN:tѝ (@~~>:*TѣqA~CCCt˗DZcDidž `nn5ߕbm@e0+{nnݚǏXoР-gѢEA-жm[\xQk н{w8::UV4 9..Ǐ(SNEll, M6m n='gF-8$y׮]ƍѬY3L2ҥKڵ+5k`􄳳3ƍZ=z ++ ]tA@@>} J'ٳ'߿O:{,uƍe˖8x *U>}QQQѥV1n8DFFӨZ*"C4 gE瑟7ob߾}ؿ?={ŋS9x~Wtj#FWqFdgg#&&gφ tgFbb"MI&Qy~>}v| =,AtXZZwõ7x BCCKGUx#NOdz0E@tt4 0n8 <+V7q@Zp YXMzj|HKKoGXOOaaa!2&}m6tU"={M4S~zlݺ}QFHKKÊ+qF$&&('سgN:kkkXFܻw/_ƞ={p `ժUPx%!Cɓi4ڵ+Μ9#11?|rԮ]ӧOǾ}0m48::"** B*==իW;w]ȸy!ԩC߯U>|XFɓ'cHMMѺukp4 &&iii8q""##]gddvڔP~}:yGrr2߿Pz4H;III9s&xGPPΝ;]6m5qMUdlҤ N<7b۶mؿ?Çʕ+ؿ?#Fo߾8{,ƌpdggybΜ98y$VZŋkN[ <m۶ży'Oĉ:t(4 ֮] }v߿P*GRRRRR`ccC71bm۶֣ٙV#,, .DF N3 իWcĈ8wf̘hgΜ_EZҥKCݺuLiYtp|8u6lؠ( 1ɵkbذaHKKÌ30m4dee8|w;wΝ;(,,#uɟRڵkj*LJF<1cƠnݺHIIڵkx%FI.22GilmmcǎâEc xM$''#)) 7oě7oEUr+WB`ǎ8|0Tغu+; 0Zv<lڴ)RRR0{l̛7IIIHHHǑI$Xؿ?qƢ^z(((ԩS`8qv킷Dfffصk= j*:0bbW]N¶mOOO_P4'$$CP((,,Ķm۰~zCBBЭ[7#<<ӧOcl?ښx8Cll,SRRÇTrjy̛7[FJJ :([2dȐ!C>H x9 lllh/,T*?~gbر044DŊW_axhٺ}T^͚5qB~~>޽_~ |2V\fffѣX|9<ի㫯͛7111Zx\Fj,>ollđJ"SÑaÆAOOCPׇ948G*U۷:J'$9:Ex ]&yTRFV^F%EJ*h߾= $:<==Q\9jl:4j(\r۷CP*[.ڴiC=rjԨ <;;;IG+ɧ(t֒  &&.6%5M<!//`llL766,^~=>} z\}Νҥ 4hRIb0444h4+WN+8w>} b޼yց8|osN ʕPtWyP|yx޽+Vϋ;q! b{^~]*Ecu>Y@<Ӄ޽5nJNСC^:wX[[ fffP(hٲ%߿)ajj]- Br~-^Ϝ9QjUFJ F/h4U,,,h144͛7GXX;;;$%%044Dڵi%{\B*Gnnnx ʕ+SV\fffL 83f̀S1=.bQ[FӦM011G`oorx50b%lmmCoN9r:u@޽aaaCCCxzzP(hݺ5^|lZg֭QV-pWWWԮ]:/ KKQq^]12dȐ!CDtePʢF?1>J%233QBTX~okk J/^bŊZŌQ999Z*5+W,ץzzzGaeeE*xGDN:Rb`|8LLLq ///*UEY ooozt7ǂ͗<*T^za֬Y1b8}}}L0 61UV$NJ$9NO'Ȅm۶iɘOI EQs֡immgGsssVV gΜݺׯ8x+Wϫj*_h:ZǏӨU*U4 \ʋ IDATnQ%e[p'6l\\\hp%* HKK}N100壉  ^z+81T|yӦMXjt邦Mbĉ\2jժ^>RbEdffR˗zNT"""_}UZD/_D~_uָ}6F\LˉIFFF055+TZU*?D?/vAGY@sGȢzÆ Xb/_]",, FFFZ*lj%BuK:055в2Il4rVV]wwwJOJ%caE"q~ze˖M2۶mCDDLLL0~x4i҄ZƲeːB|lfг`y&&&l!=<#gaaU.yڲeK>}Ϟ=iZgj`.} *h9ūU&= CV2z͵4QTXbE dFV#''fffX".N挌 R^˗m۶QG>KITBZدt t[YYI^&VRbvdkk 6 ..}t1c7nիѭ[74o'OBXYYQ/_浥%%Y< 6`ڵ֭5j(XYYSNEff&.\> u֥c[VPA+lJ`ccoXW__UV5i>}t=z41qDLʖ!C 2Jr 0P4լY Z)P49YXX͛7ͥGP(@k1:NXpsssqΝ;3ge˖hٲ%^ɓ'c8p ^WR'7q>#΋իWc?>366v+++~yyyT<My&B)<s*Cѣ(!xGnnVnŬ,cDא߻wI&֭Ö-[пlNBԵϵxп͑x U&Ayӯ_? 0:u#GGG\z7oޤ+Bg%/5j@FF~C͚5E166_dXXX`ر3333m={,f͚xxxҥKH~zz:G:Jԩծf͚pm-ƭ[`oo/SgggG}^PҦP `8}V~KKKK<}T+B5kpaaXpawټ%˗ZBqV"}J+++8;;ĉɓ'ѻwo;wSLAxx8n݊-[̌ R֭[cӦMXbΟ?/_ٳ'ЫW/ 2o߾<&O /ʏm6 0iee'O, 1i$DDDע!_~Ms _uQ8s :G hV%*U͛7Z4?{L3R3!6rML׭[W^fT*aaawiy)y%NF!%%'ODjj*N>޽{ŋ |״=BmiiL.ZMBP(PR%;qx{{{cϞ=صk:t@F+&'EM!;;yVVVZ/@Ltݑ=z`Z 2d( .ƎuaժUx!^~{dݻwXx1M~}!;;v! mbÆ x% ?:?N AqCڵ:&׬Y.](rt;UZB`޽t1zHC\xɁfRPHS(CzR)Xe}CNNT*֮] }}}\F󤍄gt'D\p<ٳg8x ש&&&!Ypy5> IWtKAA^z+V> 6DDD"##QfMr 8uKܹoF^^; >>>{.8gdggUV7mT,Y ;v,?r\̙3.Nii$>h4x1\%G+޽]vxNh4صkWX:Tқ޽K/+`υv6mpM$$$$##o߾ųg`bbB?~\+J,k׮#<<\4ɹs琗CCC4ltobb+Wh9,ׯ###{{존޽{4/3A;w &NHu;!--~޼yV\vS(+(:|;w>>>P(5jA5j@ZJ\lܸQ,g?#uÒwxǓ'OJ%vNԬY˖-toڴI^j~~~y&M9˘1cXr%Zv<6oLwhQVbEL<С"""L߻r :u-ZChӦ ]lnuqqjQF"Kj_>燪U"<< '''$&&"66YYYbƍѤI,_FĐr$|RSSO>G۶mѦM8::do޼'+T*zۇhpDDD <<͚5d3)##7oޤ e˖aٲeh޼9֮]'qnܸCCCTT 5 `bbSSS|gƴiЪU+k*U,͛7ѣG044ҥKtR888`ڵX|9Mpu\vMT:qȐ!CvЮ];8::"44@ 9* 6GX7g K[w߽{u{FDs 믿Fjкukxyy|PB1g q۷/߿mۢW^UMB%2;~ɒ%v\]]ѧO5.|Ht7?w܉͛sE~~>ЬY3GHOO?Axx8lllOOOTV u)1c1l0Qӈ,d'>,%h4?n@AA |̟?bw^̜9򙔭eۓM 2YYYaXt)\\\I7CB,Xug4i|x{{Ķӣm244ҍ\D6G >]hB=z4\]]ѩS'xxx ==֭>;vO?TL^VK⿘,Λ7:u(Rw&d:]} lJh$>ꊐfb7zC (=c4Q-M4<'F u%2W ~v:dԼWy}䫴|5KzS&Bׯ1o333d{%RQzle--,=%뢇-S>!߱ϋG%AnOǛ7o0mڴb+4 0sLVv!(%%H2dȐ!\$ѣGѼysj,h޼9htnݺed|G\&w@/MlqVnI pE ` vhߴK öA>i Cr )RJ9z>H$]T.ҋXQQ@Aa*," ?T@HH $2'7!%y|03gNLQ~O4RO`6ոNz6};Rc{lEf:M^\'NĀ0` 8C~X1m?ŝSۡ=^xGoPp\4"=P/EAu e]N  c`CQi?\^sN\[.TvoԲQ^y6PxGEܽeWߋ*5p2EW޺^G#{GZVtǏ*9-^u:QwU/h1^\yUE]c"m/zqRt,.0%v: EztM*p۶mعshذ!U6[qC1_QQUGqQN6W\]xq}>z*8^nrss:~7,[ mڴE¶m꫈ be\( '2kz򖯸k@GDD*jBC)l6֭}Au97X8NYhj}hRoEe_5ՇoZò7&R:F-x- j,FCfP,n] 5eYn֑=)iCz`X#moLoZl:Kw#1>vtP.̡b[,Y'|999R n&t-l2/ǹP3G4vn.^u^O5ܻ|.m^sRHu#}Fԣ~Fo}DZCO1ǻ]Axﺼu[$?&x{j]}(P[n.RFz_U6y+=TV,O=Ly]=ν׸HA:^qCJJ bbbиqc9}cZ}fЫǁ&IL_˲ R19 4و2W9#D]WBzO x;vGzNS rƥZeɒ%0arssQjUr-rhH58/0~xԩS=\`0X臀HAS0s>̎8Q)R]㝈q$ z" QE~.DjA5PNLUu'#ZjnݺgD%Uh԰UT"":{/R5M+[ ITNq_Eo@Bq_bt+^ ^'uz1|:,HY+uP5A}U>Hdžѩ;߯D3޿tMDT>96oy^ ˲ xv&*Kw;ߏ?"SU_х;w"(dg[w2אַDT~T芾DDt~b ϶OaRJʒQ鉠mBll<A@qPN4 8x Abb"sl 0߿uEtt|ݶm8qxԮ]am2@u?~111PP*Qɩ񵸸8dffzאַ DDDDDDDDD0.` ab4]$jb5NFDDDDDDDDg:ȳau] (ˢQ Y`lh˲DDDDDY """8 6W_/ߏ. &MB:uʺxDDDDT0HDDDteff+~a À4Mf Âi2Pu:0}^,qYQ–!ʥò,ٕY,q&)3>aǎCnn.wߏ\wu2c+СCa&lFǎ1g\zx'РA|7زe 1qDlذ˗/G0D~0vXhV?M6!++ 7ɓQvm:tw|IL8>UVEn0l0$>|8w!C[3Q91ΰd4o?8ك@ gY̚DoG}ׯGp#::V‚ c˖-P={wźu됐se:tf+{ ’%Kdf={ep 2HDDDDDDDDg+/#G}݇7a2;Ptm۶-4iMЭ[78?uCƍk.[@۶muѮ];ٳG˲,7ɈF.]M6q\:t@bb,7_LDDDt9X}ݸ뮻j*<#>}:j8@ Mc꺎$]h~?Ǒ¼yeXLT^]8."`JУG,[ ]v>3F3 Q @"""3L i޽{㪫?˲u6;;`m.O= ^~e̟?Æ mۅ&!5kF~~>:uy@"""3l׮] ۶6mB͡iի~Av} dF&M vbm6ѤI̘1={DDDDT1HDDDteeea̙ի:tg}GF۶m: Ç#;;5i;pQ+~a;:t(ƌ^zD PDuᦛn?_ӲR=ѣmې?By| R?dq],Ye˖_yt[niiiHJJ:k눉Af͘HDDDDEiiix0tP9Y7LDDDD1b~7 8]v 1 0HDDDD}%0 AfGFDDDDum|z#""""""""1HDDDDDDDDtc @"""""""" DDDDDDDDD0.` ]$""""""""1HDDDDDDDDtc5MqI'YV;?׊+iBH۠Vgi%l_sqM"Ku]XeTtcv\ו˷m;b' Փma8,K.K,O|} 3IlXZ>q u]UO,ʊw;qaRM&g &B P!u=윈~0maA)0UrmS3MS`am[4Mu溮ap]PT,u]DEEA4Y" .yIW3YbYz*۲} 0)6 C+iK|,2DKUQQQrW@J@<\3>-&5CIQD`<ٶ-6=ѸWQjYI0 Cf:A+|i )5O4Yo"(h"'֡f((i&z:>a`uu]e-N~$²,|>YdF&wuEgZlcܹqYl`0*U˻,5*V+jl=۶H6.|> ҉uG u{Qm>/,KYF)݋ Yb >\HA@u'ˊA>uHuC*A.@fN: 0M3lNjaǑ?E-[iSNXz5򗿄(9+WD- e.*0ҹ: ѣGZ{"]+{ɨkr:vaոÎ[u;2ǵ<-O"|8pz;3DDDDTN;h6~;]tA6mлwo,X@66Ԡhxyǔr'xY2.?ކma]ɀCh{TRWbuX)N :ssYͲ:t4iR!YZ"x#6MS6Dq:fk=QQ?"f&zkکfuvgTXw0 s%(2̂S궫c,˒u vV"C DOC1 E7g bjd=jz/R3m贈UH]ڵ[NjP3E ::Z~_*5%ycL$??>/,}q=zT~tjƞzJ-+} zTZq(>[dddde""""*k駟0zh <cǎE5chh\ƙhԪDUGhF 84jYԆXhY7L͇}*nv.2l۶ ǏGÆ 1a$$$,:tSNŖ-[{ aᡇBϞ= /`Æ ؿ?v؁_5‹/XL"P6=.]`̙x饗X;0M7lڴ 1|pÁsᅦG˖-1m4ׯǬYFa̘1hժ :7t֬Y{q̜97FJJ z)l޼]vVSM +̞={E:u0rHt)+DA,Z.9ի@N㦛nŠ+u={bhذ!rrrK/?Gnn.."L< 6`k{!;;7Ƅ prXd rssQjU7mڴ ;>*U`Μ9aЖ-[bɒ%hԨ4MýދΝ;oن֬Y_~iiiŠApwqGF׮]~ӟÇcŔ)S?  "99?Pn]@^^fΜ?YYYhҤ &O u]̚5 k֬Aff&0x`z 33"+"-///lãG駟7|HNN3_5,BN0n8DGGz#Gb޼y8|04i{ ׿#!!{/[kݻwg; Ѯ];L0O_ >>k׮m۸#F xb[naY5K.x,"*o6lܸo*U &ॗ^ફ¬Y;uA߾} aY,Y'x&L@0Ça&ƎG}v~ ٶ .īʕ+cBJ? #o@@~i|>|g>iii1b֭N:Huf@ C[ot|'زe *U$/=~8t]GNNbcc]vΝ7|˖-K/rʥ9TjUL:k׆ixw1~x%;m44o*EL%ݻw㡇ɓѣGlٲ?,X?… 1{l4m-C=E~x뭷'xgƸqU|~; ̙3Q\)nFF6oތ~Au|>,ӌ7+WƪUl2⩧H0xb̛7W 6 7|3 {֭>ܹs#~~ȑ6m \Ebb"FO?˖-æMgʕ+?Wᅬua|Xnz-L>k֬A-w^ ЪUn |اF⿞={"&&FfA}gp]~->q4MTR ի8dYfѣcnݺ<B>ÇC4|HKK#<ߏjժa2ȷqFdff⡇BJѭ[7$Zf 7o.]0 r-7|ӻwo4nazꈏGff&{q|hժڴiT-鶪]iEWe˖+DϞ=a7oׯ/4Ʃ؇j{g!CyuuAeo߾Xd Pe˖a,]> W^y%4hYԘ|nV4m[nAZZv!sN85kQFatR۲8.u`zvez4c !!W]u̪۷/6n܈T8˗n@llFzl߾@G.,>z(>S5 5k 5nX%=== n o&;ƥv} cl]ב]vA4\~RJ:裏o"&&Ffp]/"Ґ"xϫ۠i*W oF>}0w\믅犢iRRR~DGG]v#qUVի}:bРAEʕ t㟐PЦM[6״8zLRRRQfM6n4 ?߹s?GERR"cʫ`6*U_S 5uC߾ijլ-=:֭ݻ7."DEEW^xd]lZBtIH LD||=@D0ho )oM3: /8N ֯dϤ, 0 ^zpJj}o'&ҏEbbuh0`;.{5j@FFFX0VZʖueqT^cK.'ڶmTlڴ G iWI3>,3E[r]vŴi/Ⱥܹ3, ryPC~bYxsXCeG:ZhcoرC U3u|L4 iiiҥ }QUN Xp f#e}_ `1 A]vM5cWvСC0aC7n",WQK.E^pעvژ={6.Ey / ömlot]O?,+R ~g >PFgQ&M9sni߿?Y釮0 pu8 CC6O~?/nCpJ.x+x:ժUDIzǯsR/jժ|HMMEjՐ/'OKKCtt4oZ`6233QR%|>$&%8ؘX$%%qC (0}>%ʽ7tQQQ?~c;8x ի'3ԩ}~` -- ͚]"]4M6>$%%a0 :DhdԬY˗-0 sbM[gz62\DHСvڨU,YM3dA5paxa²-ԨY)6===t91yOQJ0 )))hذ!\ő#G[2LdQq 7`ҤIa㟪f͚عsgDE@A"** ݺuҥKaw8躎$躎;ve˖aYf"$.^p INNѻWc NCS3g_ 曑^{M&2Xu]dee.b Zj bѢE(_V@ l$HIIM wׁ 5*QƟ:1n}^4M6as hժ.\@ ذaC] 3TdNٶ>_|˲o+eРAXx16m Xr%VZ^zzCn(c5M5#7MӐUV!//믿eZ} +eYAVV,P^=|, k׮޽{ mqw~]5MDZvZ4M\m_=RSS1{l;/RA)Ư uOHu]^{ شivߠ>ߏm۷-+2l."ڵK/E9E_111rc 4Nݻe Ð]1&dsrrŽo`W}2"M#ŽXN6l@ƛo χ.VXÇ#::Zk 3\MDam=+no>X~=lw.nF̝;Wv>r>3a:./_={ ''v*ݒ⼶,DDDDtyE#GKJ4{ǜ9sw^`ؽ{7Ѽys̜9ƬYЫW/|bQ% h۲O4B?>h'25Mc;F-.<Q.:Bl\}7^;wiXnv!G<Ӳb>wA*.:t1cУGVŃ< ^{5v]v̔yuԉJBK'LӔ˲ؾ};.]`ԩ8v\E||{n[N~_d}G۷/ڵke˖aڴiaѽ{wy\ =zø{mVm]vر#틫۷o:;@:u]ŌcƌAvp뭷M6ӧg"@Ga8| :w!C૯ O<oFB>}1cƄmgq^}Un ,O?֭[cԨQ2(KDDDDlv&:DWؘۑ'm}d6l؀ya֭^:F]"33< KƢk׮5j`&zIOLB6m:Ν~/{Zne˖n٫:x7ߟg ܵiIIx뭷;ZjhPԭ ߇{K?Z> ut<1 ԯ>ab7h"dgg믇81h ,[ sŢEdc]|8nv p#nxl]{М@ϗd,M,3Kzn uB݀Mӄ'^NẶ\::A^>ٸe{J\u"sL_F-ZoBۭvMUYC7tؖv8nAG 8nM(x+(sQNo4 :~? &#TEWf1ޞ>̟?6l/,y'F0 <2N94=#,VP5Q6/:vw%NuM= ^ŏ|@w,*ul)oRY&' БfS%*gn؃Z y-8 ӀmwSEҊ>M{פZ( eYV9nfA,*5睭tdb∉#ĵS,{W' -B^-oLVa%`HN5C[/OWNHuN~_fyyfJ7v*\S-Z/uY\V@o1ciuA~Yv;w~:ǡC F O`X"+p~%"""KQϫ@v#={@u4ih$&&b߾}HNNڗJ0a1PИ"(^dXFXO(_-:.Vˠh$ >/ 59P0&%5d۶h':WDCf|;+ߒ1P# cwHz{mĀK(ًlyqe`01:Taj"&E-]861:ˬ~XTBԽw4%^`m]+=AdF {`:ڥX[[ ,@ B}-8|fi˶dfG~@ߨǗFQvq]EʚZ@8jɨuEVVB \u`+K]](.0eEV@$"""":wLǣz2ҏEWӵU ]H0eE `Plu\Ө?'(DDDDDDDDDTہnrb]oLOd# NDDDDDDDDTfh\䶦:î:[]IU.g~RsD޿*t&u:gvMBWJl'"""ISu8#Gرc2*{vY4}ZEet럈*U hǎe)))mkbRrиEM"f\Q> )ga-[+5X """"*`:jԨS4^z``ilVH3GGEo@W/k+:.WO¾}mٰ|>_ N4]N k˶_E;?47@A+5Mi>f'"s""""""""" DDDDDDDDDR#w1ʇH:_v7,\z4M;ccNr\ׅ3a[6t#^lԙ\?ѩu[nÊ#++ q8 4 Я_?4mzI}A+qc,_0M#b<...{68' /_X6l~ahѢ5RzOTc;ЍP%A@M:.4MC ]w݅1cƠe˖g DDDDDDDDDe[6>^ӟ +hAC4a`hoDÆ dND0pXBD@۲q˭`=p]'=uzju]hԨt]mۥbpc[ yf<3홰i;7>c&"""""""":U9sP^=hqp]e^z뮻pBմocǎ~zHO@^^. bjj*r~H(,%|wkxqW:tm[L\E t CwutرDc7a"""""""":D%pqL4)b)Eέ:+im 3#n2221baDL+2!2 nȂ膎~aĉWc'+7"** ozۇߎ* xp1\޼9m**W hG7233DԮU;7Bf۱aD`'VذaTO?]4бCG?Co 33͚5Q^=茙;o.v 1uTԩSwygAw(1VV/ƽދI&aʔ)xѰACm[m;bPYE]i+? &bXf ͟+>Ʊcu\|7xi,۷CTT J-[b}'+ѻw/4j?6oÇ 3 jժ~Fŕطo`Uѣ\dHH?ADDDDDDDDk뺲ۯǔ)SPVмEtVP' ?Og}JD<'߶e#Z"t]G0aplIIB)>@04pAc͚5pЬ*"33Փ; i0}&>? /j*Fhd4ө""""""""DvXXA n'!(m8zwq;f̘ _/ #3fAbR-ۂaEupA4BSXذl+T'Aիe˖dDTtk +-ϔ3ض@0۶BGqc;lKTSKzIDDDDDDDDT]6|IWrb!T>}:ԯ]ב9sxPVn83(k e9{a ճLm_qeAV(gY6`Ve#::11r/(W>}0uT\{ݻp٥qlqqqطonIojޮ]W첪T=a-[5MIIIpؽk7\FJ m2MQDD@t9,BkcF6)R:ip\i±>/:v(+˯s߀i=Q^nF>gJDGcN٥rc""""""""S:zLD:Ud&$$w>oO>XhºӷO wXuV4i,˂KѝvlQqS88WT4MC0ia{7{ ^d7_9c ]GĩDL 4R{ъa9#ƒnۊK]Z @4e_M`Atu]7,S]nE`К15UO[獟݈.` ]$""""""""1HDDDDDD甘R4)+,3M*)&l3Xљ u] M+@"":V'24]?(QPހ@DDDDDD1ʞiaKĿfYKJ\l))Ju\hqw"-E7t1qú^."0 hV@(wQˉXWƍ/w}]Pr.aHHCvvv]Dy]n;CDDDDDta-g*:4Mmr S:,˒ib(ଧ DDDDDDP[M˚hGjM48#` . ɩODDDDDDDDgNtQmu|*'ia?,$DDDDDDD8+_#xmټpj\$&p{6g+p,Ri&_+z?\J4 ḱipN#^ m8 KξҌe~lWry_4 .Bnݗ]x]8kYS.% otpҠZADEE[cm8t]uǮʲiVd[}M0|tu hi ׵xۋM]av&UUqa~?lˆ0t, uaYVuDYɠk._/_$xۆ6\ kc6m ]ء ]Yt>3l\ĸ_j7ou]ZҦ,gvVGGoD;}ҥXt)Νtu]i XXO~~>L ۶nfK[KXVgvX}!#U|_](xMHR bYm4B1q`4M6 CI,*4Du뺎`0(}>Zz,E;ZJ,@qѠaZ 7pC@hkOV|&tq߿7nDFF~?U뮻rՊQO콀ge'\#"""""wuq]8X|pl',H']놂۲a4sY 6t@d֢5נJBV(dL{h" !!-ZɓU('&2jpN #c:fϞJb 8_bΜ9>}5k4ر>H4MXѶ jϱٰHC X: tCWڶ󎓢{f,9IQ@D@`$AND (F|3y?   ȉ%,+ag~TOϰ dLwUuMwuէa6TL$p)ȈsakvX#1Ǚn~uEYe{[ 62}niSfJ3;vN DLk°s#ؘ̆)|eZ%ֱEc)6d F4aQ3,tF]gܽ{7EJi&ͧ.P"`ر < &ʇ7i۶)S 5 Tݻw3k,^x^}U-Zt;wdڴiL8_|YfQXXR>%K /0o<6n[o?+ªUoΛoɋ/[oƍo]AA0Fq]/pmܥ3W&??ΝrJR?>{<ݻuq饗o>t n9-?nMp lܸ뮻K.-[k=۱q֭K˖-ʢN:uò}_3l0zŗ\kX-_ _?sw1h /^%\€,YnN:ѳgOfϙMaa!?#; q!}.믿4le8eոqٳ']vK.>x77ر .?۷i&FE^^yyy<#q֮]u]Dž^Hn3fL7p̙\r%tܙ={2ydƌØ1cضmGΣk׮\s5\uU褔kaܹQFѣG:w̵^C&f%K0x`:uĠA뵾}2c .2Yx1m2gƍG߾}={6ed*:uW\E]Ċ+:t(m۶eÆ Z|{L6{m{.ƍ[ntܙ~={֢]t{.{fk׎uC~~>;vdŊL21cpG޽yx۷/;wflݺꫯ?|.nbm3h 1b/2{!Y [n%K}fKr-}VԵ],Wdgg3qD?yRH0qD"W\~eO}c(*˗z̘1-[y1c˗gȐ!ߟ_]lZn͵^ٴik֬ oe\uUtܙݻw3}t6mo~ Dz\r%}aȐ!ԯ_sAAARBNIsy\2y5k/y>FҸqc}Y,^«ʻw}?c曼7u*'e[L0=^zi"ߨY&m݄KNٰa< [n-,ϭJ~5kO?4SNw ujє0a< _eByWh߮=pwSFu}/2 ~4jעe8vʥ8ly+oѢE̞=7|y3pgr饗oZ=K.{kq>Νȑ#CT A2eJ *[Km̜9?ѣGSrbݱ>|8W^y% .oncǎ(سg:< .k׮ロf͚1j({=wV'|°a5j;w \|GT^Hgz-Z0o9ҥ SL ʝ3gקyD"O9 {xx73g;v`ʔ)(xǸ >}:C ml­ʐ!C_ĉbɎ֚h4 7c=aE裏rM7YfZ*/B*֟R1c⭷bٲeotR~m^ |SV-MƔ)SXnec6mD۶mQJiƚ5kZDhڵkSPPTN:QLlfTP-ZF)[,YYYA_h"p=nܸ1AAA8RhOgnڷoY΢M6xMb1ifΘUW]ENdgӯ_?>SbZ_MVVhΝS6m;0^:L~;wreq]wM|gԪUnݺA\~?r3cao)Bĉ`ԩC~FT^J+~z,^СCʢnݺOz{wò-ߕaőRjժk.N޽{W999\xر/w}Zjѻwo,ˢsԨQO?48w @͚ܣG֬YS֚9sPNzRŋ+EVZkg8#uTRԪU#Gr[o8<FVZg9DQڵk9ʕ+5kVpkR~}RlڴEΝ;93S+VW(S>G/|ٲem!cAAA(mdggp}ڶmזx<_|A:uo7nZklC=C= FAYpnfmXf .n6&Nu__ 7nZjA=Zkj׮͛<6Z+:u o۾jժN`9&ܠ/<(/ӡCNQysY&/2&MgϞ\tE >qݻ7SLUV̞=n 袋X"'Ofܸq\wu׏|ʖ-Kc_+aaݺu 4(-c8 7i$&MįkZjѣ^:oٞ!C0`ʔ)Cywh޼93gdذaxG^Z*'NGeȐ!\|E aVZ'MM {eΝ+sjՂ,52ٺu+| =zbݻ;kذ!9999V"PF=56m{lٲ$ \ m۶VZ4yyy|ԪU+V0~̪Um3mVZ/}v֌=wy;3s뭷Ҿ}{mF͚5 +VdP\`-1b#Fo߾8ѣQJeCLrRJr- :'|ѣG3i$xSNA{ FÆ i۶-d\|ӵk۶mK۶m믹曩U;vGmjժѢE &M-,g&[h ߮vwR 3eGQʗ/Ϸk֠,j?aٲePXX{ƍҥ 7of鸞˺u_E/s=ԩz,^fz?dhbcY6§93~iӧQXX΂l#գy<ڽ ˶Xn[܊z,Z@(23:ׯDz,rss]6x5SOGo߾D"zjoߎyԯ_ʕ+SPP@z8x'駟b|ڵ|:,~g8NG<+S M45_yPJj* ZSn]rss)((u]֭KƍFD[j;wĶm֭KŊ.Ϻv7|oM<'H|rsa8pD"A"jժ,[,0L:Xr%o6X uYl{ ,'Şmہz6"hү_?{9~<㧟~bʕK^x/<7Ϝ9s>}:OKFDh4ʒ%Kصkиqcozj͛Rk$ T]efD"}<w}K{`͜&vfX:\RUT׿5zj8bmp q}Y֭֭ɯyflǏSJe܄??θq\2G)E +Wrӷo_֬6rJYI hذ!5kd֭t!EL~2' fϞȑ#a yx ~sӹs& cEiB*?@XMȒs Ex饗xnsi -k.٤mLvܯ2AAACkͼyhݺu8c+К4#BYw&MNXV̱)7g}MY3ӎ|K^m22G)żyvAd"X]W=waԩ+v$fmn®?4umeԝ&/ʳϲ ]QRo̘1'vK$Iӊ2$ 6n&TiL=F ~/|E3le܆`6 XX)Ӛ,8u/"t~> ;2̶pjah3ǏgϞ=3f>(ye(*ܹs^:M6=8 @3{ТeC:X~I+͙B]8v&2Mz3/Cx AAAGQ"4,x)r`Lϲ 6~QiKX4^D)%|,OiL(Y;'M1_<'N)Ok=,eY=Vk'xۃc3bRE6 /,T[8eh'#Oۘq ixu0X~ct5mt-*AH8^X05owy)SJ)nv>}ڜnnL4״9|~+Z(`#Z9묳PWf̙9ndn5auq}h4w:;pL\̶d8AAAW200XHSVz\e),eZ> ןYwZB"dqr2QEoڗf78Ŷ;8NĿL<~߰n:.R; DغˬMXex BM|ͬY/8Hj47(aa,܎r12,}33[Ѳ, m[fdbrur3wGq}QXXHŊ0`/sP=1ʄ}QwRܱWt q   YsjH!ّZr/ C&^D֐)ʄC;Tc O/B[v</R [4X)^_I Wis?~<.>V*   pW ''

    XyΊ(   #ޅ2;x%3GQVE%Q88s 57, ǚRLr#Eug ([k(   -TVh$ZvZkbDos P=d'l1i!H:@QY(   qdEJ)E,)F2m>I4$z프p?xcoqAA88N< A#IRYc}PPůc\JNRG'8J?RR’U_?AAAXs-Ďڡslߡf>9б:feJ/ѱKE!&*xp)?AA8x0P8ǡA8-c?@s .7mp\eZ6Toh̉6SQ~?AhCi=`AA8^8dNMz:qpMp prbUR,jfY@ pt*IwmT)W e%;ڟ,O+NnM|k9xrCPBHeiR O%c30ʇs B*]uvC-@ABjrz_@ӋC}_ɂurTN" p)byYmlPY xjzNoJ^sqRdRK'Zk,C8+n4 )FA0RháZ/Zl3] }ܹ/KR/K'n*[k6,$e|IP뉞|8qDGRYS&ږ3#J  qpm@~_-Z{([ĊVaԨQ:el}ZJ;STK4CAAA0 b(*`IAA8IͳgM|4!999ԬY5۶metЁSNJ堕c&LH88AA᠙8q"O?4燎qm6Zafl{EeYL2hyDPJ.eSޱ ~_~_/}\v… [.hVb1>cG2Yii//p>7AA;vdk˲μ)ʙ{F3ehI$k+f{˲׶mWA5k֐S˗_sV-'+4iAA`088m(?>=zH{pBv뺸˸q8ҥ cǎ{ロ|Ν;ӭ[7~W[o~W^ <8ا_~ѽ{w&O  'fn:rss/9ز,rs+ar,OAA8xg~[mtOgϞM޽Z3a/^ԩS6mk׮婧<83gNc޼y|GSOeԮ]3f0ydyX`_8@AA d+W.g9'álٲYۆ" fi D,>ZC; 䣏>ϦM6lْ^x}aڴifܹ 0lNɡ\r 0 `YYYYԪUbYkצ]vY5Om&ҨQ#^u6l@ʕ9SDAĄGɌl=HiGD|?<8Nf)LA8.ʓg %< .`ضM<'п~_w^>CիGFZeƎ˟/B*UD"b}c&/"'NWsFzPUARDʇR1AA1y&IРA֭˼yx0`@jժ<̙3? =L< '_X"r 3f̠rs=" pQ$g!YP#AA'rFK6m-wށ^^x<|/_@,+vr"77|oߎyb1KRdggsꩧgAA  B(iݺ5Dh׮=e_өS'ʖ-rz+&L7 TX_W4nܘH$8Ay$ 4iBݹKQ/ƍcժUDQ֭˘1ce  l̃Pd6ţvnߡW|?+jG1>b N?c Ac0qA8\Db$PJI:Vxa1( pFa>ۇϤJ&# pϧFk3yi֬ZaQq,b_ x\(Be'  X,p5U|/3]Q˜rlƲ,RA235ۄ#  >" X N< D=p]7h:ø@{boym' P '(^1-kJ.S-\8rS% L;cg>c|_ E  'fncBD@AF_)]R'yJ+g_IPg $1WAxDA8ȴ ԪhH*]@,jOAAA yM= o>OqSX̚!2ž,i¤+ BAA G\41YMⓙ oD(p 60vX/^LJ'׮] 8<ƌúu⋃1Ӕ?\rܙSO=… ),,wq ,umil<@)5AZ8H]֡ 1ĦAAAQF;*.a_2ĝB`ID=;iIA80BR1cЪU+z)V^M7駟NӦM1-bرTXpF;q~mf̘ArH$ :m1eʔ=]wG롔JqiYs=cѸZy.Y dt(PK 12n   @N9W^y%ڵk׮ : 6ak,]ON|,_Cg^Ȼ[>O?ѥK,O8(x׸q9s搛wN2e,h4$\m[2q`e3RfBf~-t=*9bW"?.孅Kؑ]"eX2cD)t1,|izI^^\r }lAAA~b 0 0e.2W~4?EnD~-ժU#''ѴiSϋ/=/òp]9sХKGeyf ٳ'eʔB t˲PJyꩧ۷/yyy\wuY&seŊ/XΝ;={?\s m۶eÆ b1ƍGС&oӻwo:tСCfϞ= >%K yYx1Æ 0m o,#t/K/j նk)瓜_Rc7a2)R|>_RhQMty+t:xG*mc6kC娌 43;d͚5D" y 3so,}x,XZjOh"^|E>ƎK$a…<3<,Xf͚1f̘˲fذa<,]4dƍǰaNwB-eaiQIK&$<u,q=Kw?(Kp&bOU#(<"H, EKnP.JrmeF{F IO1.HP>9?_Z,pJmY8;쐐lHʉpCɷ\?)8fSzV(WǧXE2䑷YU঱O3G(!&TVh'5jbӦMl߾=ꫯhذ!@_fԩ\xٓW_}S2h ؓI&MĕW^ī,U?n(F$8YgG!˕TV}].o߅;ZR ߂呰5n__-߈(93I\h,s=p},DN\[~ߊ&XJݲ~x#etOݜXϕP9grF>|8Æ c̙5qѾ}{6mD57H$BժUٺu7b۩,Rlٲ%(3H8myfϟٳvI51L,e˖y#GDkM,cѢE^z*iݻ77 F=Һ l؆4=t\#qoݠ)綬?/WҮm;RvwtH$k8Vԫg/buN 6ӾŨ[r)޾R GE@_{vعxDaAR ~'زm/q N% lG_3"NvZUHoC1m-,eכb űm2g\C+NY`$N_-'iCU˲)Ue>mu2ҕ #.3Z`}a֬YsϥJ*lܸf͚ns7oSN \@f˖-q\qtV6liӦ~QF ڶm_8XjՊ#G;v,[Ns;Ytta֠FimRYRhu_+9%+[(vp5hOauqrJy\$"+QDݻ ^"H9ؐ(Y8u,wk׮p7ӲeKR|ʕ<*WDQ&O̠A \ŵ֜}?2MVV}Yʖ-o%O6 jC{3nkHj['[̛7U/pFY&|p.6ڃm;o]wMlٲjՊ뮻#,|`s}^_ ,,e"(U~1VF5#]Tc)R?n<0q\o8XyvkRܩc拞.Լ[?`)B=?Mk }Qhzs03_ <Gkڵkٶm7&;;EtR8q"gy&+WW_L2i˲hР9gqZk|͠|6V4ƢG4oޜjժ_sӧO~ѡC7oN"`͚54mڔh4\Euu]Xd,z-@axIj/@t/VU U<,4 [Ɂ?qE[v$o~%?_J/!zİ]{ R<(mZa,YqÈsuKmt?Zs{tMƢg KaWt6w'7;v$B"^My37JAeUp%]=8c YK qh֤1SӦ;ӃtK͸~_!O}{h2 SI cK@r>vrtZa'qDJ&YJ  <ৃ1?+,PRPP1miRWoQ 3K~.鞂b288wgj^3 IDATڵh]6#GK. :B.28-[g!++ 5oӟ̙3ͥ[n,Y iĈ<\qڵ-[K/ѡCnx֯_OVVyyy;6p'>ܘvi&@f`CvǮ1~ W籕\hqZ 2J@3[#a9oήD@)Gy:)"%ř%~{8dghX,Ĉ~ZٔMİ`.D"vؔC%B?M ΓG2ºO^P^(\C饸ȼobYB͐_ox6 `ANz[,<~LKYf{p (W^(ϸ +cr.gqoF eZˈ#>|x&l'c$ 7o믿/`qJ渔Jfa{X[$i'{bO} q!w?Yƫ{ UR`O>Iy$?WѓGRK2v]h1:΂Bso>ȳϕVɠ\{*9'/5ޚyc2Grl'w[{h:;~3UR+Ƿ-f.<#2;^`L~`,cmJ fx)&$ljJf6cۈ;gn*qQd,z 2@;YJq7ot(,,Ķ,< 7Ɋq@' Q*iA*U$=3=|D2cm6M8Vil𓣸. 2)F;uЎL小orQ%ԒDl3[a&*M#$'m\JY} bqİ3֮2ɞMZk0V߉OI^͜Xѐ\թ2EL]z0 ´yU3}O_ tĎ%J['3N V_ B7qf;י"( ':sDzy'(`V.$czn Ǔ½p3-G\JO'`ò#(Y2UK;xZCJ=)MI#$K  3cpHI 1cLrd]''ƊJ+.t[VJ`=G>Q 6%0OyD_~c8X<}jbmr27d(RFy8]IQ;i`?ǨR7yxL+#n b'X" c^?.ER<n?c)4Ȯr[j/T ( B(q%(JMccnÎq;bb8ixzj%7bj_{wL{_[K" aP ͗yWj%:#X̐\3z`疿xВ9|'Do9C@̟+5r Q[ZקWۋ}nI*<U&?_f9i>Yaz~exT5xA/@и"Fج5ȿHS6p[(oo)4^fy"F64z}E.}/eytXJ:ZW֜hR 0Rvx1𮮩^wYasf*g.gX9Vb3rGI:_fE{(cR~hThs{G_f[s5[yboz=j1w¶,NA#LBdxɠ:֊jw˘k\Y~bAy׾I @ւ4;Ẃ%NEpƳZKIkq!X UzOy+u**nLXkN^pz|es49 㿞3(%Xy@վ}W +2m4Rlz:~; kꅻ [e'4ifZֹz"e󑲺ɿG?3/!@iNwY0֒?6qƳ댷|:kT< ɾ<[f y[DG[Hbllqeg~} ]?Dc? &>v'vYOPGL !.uHQzVB*3k@8<'=[4{zi_WR WOm]s|H:YOu(X012!<@g 6cHDR" :L"naT4vRCY_M?aZe zԴ֒$I]tZ*07j>(vzOL\,GV>NU~> R)l1&EI $pD63ϵq:^EJFMX* LSkЁ'dRy0(q2QaHwS Hp+}:s `9V|> TwA߸|!HV Rk RB)4!P c R}.7Jq(giK ւU4I3\@b Sd&6ӻk{8R`_ HE/HIJ~:'L֨#RbLbtv֢_ Hz)!2lfcu^シnOq@&DX5Y^]öEwJ{5L:e ab0Yn~ɑa}Y㺙f>o 'B+t ؤIԐfEBu}s;2z!  a₦O `Eitą- 6s$"| WH )++ҬZ>?;0pYǃ2Xg d৊ dGDI F@BE i_`E@UuԐPl vVX0ٿӹ⢖1 *Q(DQB BhtHڃU"-Xo.Y2XPWJ`޿}BOMm*,y^v%f(+H|sToI) CDZIȇ0+:l@_6ZƠ̂*<䙦)u|,k-v㓫PhH])9G,} T)&NAHxQ RXnd!sį33"r~Vt";w>NUzq CjF@i.JJlۢB%BPLr4A EA1 +;2PQT( Xke!(b9$NBb_PlQVX6fŵ<յh $g,\HAiERdhIBiAh)d^vmZ'<<89\w;EV&@KYgFzFڿ9ށT<Ń& RYBL!f@iA2Ƥ0(-pŘ >룕 HHL'D]# H1AIلȁR`!D.yB"(ߵ-_RJrAH3T++AT|ӧT]ch2y%uPqd/Bhmm LCH*- >r7pl$4Fsi~tjnG[o7|sq=kJMJ1aQ&_W/8NiƦxz&&'BuV 5JPtl̷2u~m ڻ|ǕUE!MS4ecIh(Ҹ#r<v/z 5Q:x(o?)P!ECJenr#+Vt8eeg< s8hiV> NX\p!_9l߾:$d׮LMp_O* @s +V7oҘV⭊]׊eL9N8qu,h[oaUtrtJpAJq۶M&8… (a 7mD },Ϩ2cc`ky|Zs&F'& Ð6bդAY?~.\:>ں-wR׫>ӿӓQ?^eazKX\={P(е~"]"ӧϠGDI1)Zz"Jmwku҅q̦e|HRyy . nv06Z%r?y)%+-,y7=jY3>Ήw}u065œofrjRD[7Zlt{q$ }l޼¸^ Xu֢u@$C$ŽG|2TR.y ,io 3E|3ZmtS*8u}ϟf Y&4`^.?A$)'\gw)=7OO9ў,]obfv>Rbɲ~e>9֯_G;s mk-WuV"w'翿s-8{$K{S[?KQKWpV_"Y.o[SkrK`Yh[˝SS3?Cu {p/~q'βizX2$$h$I: dbQjZpzkm _;qw_7ɭ̙vOHsms3܋6gfrΊL2ײ\c:Ok ?]*/ ^+tX([XԌoT[:葰T%dif7CC(642Ș£?~}瓵bIm]7K4F$;O?t8@y=#icpg-;Iɱ*nhG&ޓA ,"4slںC#Tk)B֒Zˣ?~}1J8$#Of"^Ǟ/x LM}h89ƹ+~BK G"3C4|qk;`SO R#t@:R`>N:˜HOxk8\°!DHu9W_x{` rP]K0 eu0=~v?Oa*4пr9J!L**cزڠ}y._ZTpƥr"3:iˆ.( I/ "sg?~oK.cS_]#kJpv> ,ex| $9FGaS6@۪8?Lj1 | pۚl| IDAT"^ƢTqФB39[YtaYكO<k͆׶Wm_uYZ22[+՘ZXֻ7O_iKc{#o\J K%ܽN\d࿷qȟ?GQDff)U1UxG'=_?sUW_ < oo BX*\< 7,C2osך.BX]{֯Q]3T8arf~Ƃ"<ÿ3>tg& 䯙ot( HeD(۶,e Mпa -L/sVJp<1xX"M#3?9_&F_'~xӯpt4Z @wP~s78 )۷/ DЀE ÑXg7ґBLOϲefC8x4nGnc?cq><{~>:xo>">4/Zv&dd@& 玞֞6 8UC1lZ &xHY+'Ϡ@:?}}~xC'HPB!G;~|. ekYk16,Zb [ C08ŭ=]9pnZrElքп>'vg,ȤHѤh~vN?o}IbKaQ9t<ݱ E?xǞ},>Vo.s-{-vhAIM-b$cú и5E3*0>'X|o4äZ d|Q+Q ⇵dDwba|bW.Lů>DsssЈ%>R\#;^;S٣LDXX/,k$BkN^mY3):LUHt$4m=]t8p@"ZJXH"K`ԍs^X_yj5($(Rk[6B>)*.mB~h/6H!Pei0BҤ%06XMc3[s˒ğ\ZIZf*47 Z 9tr.^ Sh1T,H&Lj $"$O#`H0a2 _ ZU_-S?|J#Ro&MR$CcJΜHBӖMrѰy. ;XO*TmIgpB20ԥ}|!C]efhg0Y|r>w4˄!tW/5w388LȱAИ4S5Ǵ?FjReqpŐ(x0dWه"$Nbe[kI LLX*@w-9GHtPdYנ)T V Q R`\n!X(4TH.\0; o/?D!t1RpQ?4_x&&(J|yRڗ,4,O8p~6%4-,R86t24i@2Eݍ1^L(OeͮF],|?)-쏠CLI#p@<5`mF+B,|+j+ri.~u^rA IB@؉q ~q~~"|x(aQRP ֮GxsK8tr*A =6BƒBdhjb3t~*UfỲ 06ssYvQ@#&&s9>@]TjTBuͮB{Ni ۹´,g(Dd8;F4C|9`d-k,Rj\mhᵅ/JPK2`/]z6`vmq0k~gk"aAq:t٨F?^`jb(&'p6A,eQ@ocK)-ʃkC L(1I>[7{]ZA#).{egݯjOql\ ҵ!v, NAlS.W`yY;1"1\90NRF\Hw(8>2%>E,&CFE ^;4Ta)}6Ғǟ[XrpQk$v<ǷC3v֬Ue'zȒJtRJSgTguВ`*hj$4!I'??1Njĸ*38%qJb9=G'gjڳKP(YƂfZimLX4/WW1րRR$B+yǦƩ3PRQM\>Y>8Uf, Tx(ϏLՒTpJdbRt "Rj %LbpiR;.k4Av88Ldf\@g^X+b߬wb%Cz'i()GIz%u0mԌ~nX@)lj&2[KImOE6>B,\Nq$ t6AkȦևf$B3pd}RsiR!VRP`@,$ /^ BR4~JV2`s[\eg'It4A(S&̮98ޣ'x{Og=AGIs9c(KuP(`(#Prh J@!FDXR,Ф@kYV&8qfVA36@ĥ35Ϗ6$ΞF "k$1尀r)ƠlmZ-ɓB! I_v"v?ɦME+39;ˬ24WgMZHR$)Y{>|+͗oڲ܃@eWD Ha J)1$|\ϛE-~+"5XR%II6㴼C@(U0[7Gdۚ|gHlKIøl$1~܂ X?[x`UN 6C>齬_e'卣Xm A\%lmBC(%A1)IY6{4 G1T$iĉ .&(r3J8qB!fպ<{CXք*)b#Eމ!Lj(4>-G‚?%%E=]# -E1BH>6+Һ~2@=]={ ;'6>·I'1j\%I@9h*q !IBҴʉUT.jh[ly_E8Tc!uF.A%I(76~*QŘ @*?9Yłf.J0 (f1߃~&-C̛6MIbIc|=ߧ=9cPٺDQ5>VR5QR#1œd1x-Zu.민Ro< C8h*2=2ȅKAW$}'C 'SQ~N*M~ikk5,ߴs >3͓?PZA!`b A81ZzGżC`IF45nС ֯_ǺK ~˦2"sZr5'Z?ܳ6.qix'v{1ZWcB-UJ&:D$bvY!7FUμuI>D{/צysٔq|弐EkR~}R)4J@PPByP Sh.Ʃ;E .Ɖئ|ok#|w07o&%_18a*<:rb|޻<(b4q%$bB%*VA4nEwLƖ]{g<݊۷5w|u@:a'Mav>>3Achc4(djpq 4)jB*HO&neDZʒ/?xcyxem۶y!5?}n*Fd5 (QR#HP8駹'VK$PW$xPn>֡47>+/Sco15ƀľ[y0)"h$z$`.$ "D 6bIpV-~4Z'GyyhU7o@tL|?4(l'ABj[Vei3cco'O^)( NCKXw!\ `Ai<ԧ3Ȍじve{d͚5!On8١gE&3 .))@.Avժ靓fOjY{ʩ,(!564CpE~l ભKn:p9^Wov<<_X?"q dIYu9Y3JnA~(Y}C+ҀĚ_)bɇQ~ q.w졬`0",u )RelI*gҟT8<&̃#G/=Xv-+ֵS,yg8w:f?XC\)Ex:K%t)@8.$@R-ep%j ](zJT'Kf WAmÇFGֵѿk\+eQgV.DǼߕY Iqg/&haUihkTX(@ʁqu^"l6(u8/:old͚8B' ?xvE(:5=stdCE% Dt t45Mϐ.kKY)9à~ lj *Y ɺ27{7@>=ʼnO˃yZlZlc5^u}e&J+Z&6rFd-%&g&Oj:;&hYXSRgI2Vcu|j?/|WrӍ(l<]~v4 o%Ѧ|%Rj6&PYbleJ*00>Ͳ" Kژ1Ixm FX!Svɥ TV5|&*fv9Ś5kO heYCwB'`t~{BŹk=+SU^&\"* OOB] ]1gt6vUd!lpP M-~Uήd˯1}|/oX_B]sjq{﹇V5 L-"2hfhhjD9P֠ !s Maqd L U`+\MJKν;Wqʲs,N[w$,m,5N+Lތj…qEoS(0'J8G!`f>ir1:ZŤWhmDަfb1K>CSTB"BF-e|k/Mh Za(jJ0Z`2q"JZH!]l=!$RA*Q$ c65ijJ 6߱VKInF,^<Ae@{IَʥH B8P &OXJxN$@!s, :M% )$`-ЀҞ` 9C@9Υs`acO}=705innk2D2Y%ZusdŒ+'%'/RP+WB2;C *0f-e٘:DO1uQ(i:. 4Q1{[}IwG3&scCcܸzMe\8y9ZIfi*hc ldطzSs.$1EhlidBUSڵjXr5JF{\xq hQw CͦX)h aEW b"Kp VPŹs !)Z$(EHlPe<^!T+5cct)"45L9:D)?#o4&әW6,K<Ѧ)ZJ4,m.a#. +8uaIRؽ(jAAet0'12GR֎CK"h jIR =CŊ:h& @!*,h U0.f_vͶ:0 6/Υ ƶn<8IVct| g2mMMd,Wdη)B{ӣRҶ5LΫ*oo9 \d|z Xq˖\дB,]SDICC#LOU(I:rFkYQvAgwTYb:1;M2>JMYb~FE[ $1y+/8vcPg/:X -El))fk^N +(IXӷ%19([ȳdɳkcPx\ۋ5>F{)Ԑ\$׹j !_m~}] EpI13_7%K^XX>ǤM}/K`s_6hBGs=<%xz5 kJAbF#Vw)n"ngU-D4_FY &nW<'40%VoRzHᇆ1C[XSd M 3/,#U^ m߇k|IdX}i6o4p֑w!o3 ̜z #Zj5Lh37UyzT|gub7x=iIHa&Nj[]OSS3?@"nDƲP!CIeR瞻&'~n uQttijۻ0-Y00$Sc07:/)ŤIѽ4pߟdsfl--Ņ:w&-䃅6T)oAdzӸϏmwcj1}*muX2L`cfn^|=/HBXuoEg2nA]}>OW1@HL0V)E55ӟDhL)|K|`75:y*I,3HBe18Xc⒱$ vb "A"^'ʄd@!RI=i~xr9=@BU )&7_/qqЄ~K @*],4ِ'}qrO=y"|!j3^m{;Aj<7 vvNRɓ'Qz| ]?AgOl6Kch܊})vvhz=7@}}=.Sx07a2L/(4545kyߜ'ہR7Zl#´GHG B{f:iMH9 '<?n&Lͫ1: UAroCyug8驔"۸{ISdC_Ǘۻ WO[[3NDpRIl(Fh4% F]]g̝G`ٓoOoT3{4FV(:Hk?yPU~Gk ,eSӧ!g8xD +_?ߛ`HB8ǎس.jwlBp/J"plS CCXσ?0c ݸ,|H+Z4~ k^{UzY.`0L?H9EJ!Te=sfFηz\P|/i&Z.@H'v8@ ]ϋS Ҟ] Y HKvq'IX pc؛r,I1 :r"2nzX'YdHw/>;rP"esy,$B(,R`C=fO$.j- Pm\,jQLy0<|tIH46p'ѥi+:qoA ۫ɷ.Đ 1Xkye-#&9 k8ZCiC547sZɴY 5QH' G(6S5mB)#{HOniJ%Fdr} V30_|2C6t4ԇNO 5:V3n"hѣyPlcyI.N$@FB%&B`F؎jƏ>MҍIK__/BR[ 3D)lRFÉLC'ANT~*d#8h_g3!M9Pm家^Σ۽GPc > 1+8dL>sі!i'Ln6!:c8~K%ࠎM~|bRtak K@ Imz%}h<" _@q.6Z ]Bc[}Ɯ0M#4*ڄ5r3ѸaJk4ֈȓf!%xsRvQ:=Nlh](!rvCJa%zES{ԁ7hQ6p(O#p;Z,LR, բ(BS5`]' 0@]{ 54Xc(5`sd,."Jf1&I5" %/E`1g-!A)yUvKBf bcmr\vi>61󍕿I@R{~EYMo1!lxGTYd@DŒBz2i*֋j4#p"¦MEvf\oמEP~n%1CW;HИ0pnK¾[O8ZQn?°YJjS4\4q4}w'blVDQ #{)#pS B'Ls!%| v"RzQ,£Gfq_4N+T\@hHxDoS8OPx%@"`cmfˏt Bk_OByoa%2rv ʃ!IQ D 1uH4 "8=fOJHBH8%3b#23A6&ʉ#z3)v$oƼ!&J*l=?]3uy_T(<b) |%]0#B4%K!}Izoo Bn,qU-ŐBt Q6@qF4^XqvRkP!kl/ŀBk*܆aS%!j'8,&شBXB%%UHWB8Q#5L ҅+^xj" IrgkR獠oݸ&XKB`"yRb}J:0 -hKFϽAeA[ihE0Ho|fٷS Hx h,O)t IX,z`T/l{IV$93(hS0QhXchVF٤60 7Mڻ;!2Dm< rYeƑ,j&Z&>JD 'qJ) hڳ0}ZkJa/4Yٿ;'\" PLe,UиiBsS!/C'SWW7@ ً$}*?VCFzcaW;aOJXQeI(\y {D5LYPo`i,xc4 Jqx-^?C}s Ho-h. _] @6%,]-y>6ܷ84%mpiH&h!dAH!B~4=!N27P H!)YO 77A:(: xY,&UY[pMn=pL1ljJklhk!*Y3RGhLD~CmhKLHlDcL47h,!B, qvػT 'v̓$TjOZ\=li?"U {.ǣ ƝV=Űy@IxcKeK@ilAyMT$H%@l0Kxeڢjxڷ?Ci# Dړ{~ߺze w lZVp¶)"H[ZZX~.m 0ۧDbEa%g6ti@úu\Hd"*}w6 )d"Mbg$ʇ ovOm(kkK,)nG1~TA P-5AvBQ2gjzzz( Â5h[~v5hmf::7vVUMTrR`90 C|e{y''Ǔ**2@_qN:,{~"ӏZK8a^\p.6P$";BFnkw2R__?BA[|IDrG?d wA(C.,vmd%,}AHOYn}x ц6lC?Z9>ljG^[oۇ) QJH6,m &܍ GoQBzזXEFBcֲs;1&dd&n7{7qØtvvM["!k7U}V]Y9[w]zh Xc:"/lp[0+"">2CRٹ&:&E~X{MҺ1G,7Xz+;b;{|> vXC((Atz~9𪙽xx>`X VFٕ㝡PBC2vYlk|q aBG`AzyrRֹk +)du4T:ux-'?d v/w*WERMmX_wv ~)`-:!ݳ2U&^T1xUN[ v`WA!3ȎD\Bʕ+>9&}vzq`QT«FNd 7.yօ%# ǟA};dsw?}%sRe[S]ax$J{"6!뙁":NBY{t8}\簦ly6tU`4G!f~5﹬"" ^ O!+\r?yٯ$b3^Ltń3{7H Da瞧ɸzR"J(%Yf F"A&|Lfbԕ{E1pqs x(CIhrW&# |7~O QDNa+}wtkXBJg&h>"|#ahzٕƸFKݵ \I(햍@m=[#ܛasCc#{)-)10}!ClM7ɓq$\%._s΀=\{{߿} A!2Hn,:i~{V.z : XP& K߻Cs4?&E\/[[xK]cyqIC*㮩OHHcS-{{at5rRJ,~|$U.dyHǤּjj"O~o=׀('/,|iOlY6~aX2 Se+_5F(Ϗd25{*Gv#i?>rpfbAkdƷ6&Dc +zd}ѧrB*Nm$}ea-TB< 8kc_ +viyzl#+rcMfՇ6*jcDž-<쯕 h\uw<z4KxrY^2NmH!5猯Wk]>Ƨ%zXVqm.: NXۇ5'QXo" |2~e(~ HdhiKLxhoR -k{ͮowXچ$\D[Z g+vIX{e!+%۷ ិ^o={> ~rxᕓzJ)JҀ ڕIufـxQI2nۭ[AC~k_oJ~@dkVyvlyִ'*54k46**-x8 (.?a0u O]YOۚR<R,l)~I=Sxط =WL<}B@WWVxJ `$7VbWRPTRrfy%7V`8|b6)RHL)xC`AnwoO=E};ރ%`omoSR]UKIgWc[y )g&y2E{q")Rx;# "Zs xrMݹ)RH~"R"=Z뷔]jKtS$ϿgX,y8>5d``a5Rg]~)RH"E)RQd1*O`M$PN@kJ )RuC:ˉ8X{B 0 ;p!d@L)qV`b³ckm:n)RH"E)RmتT0^w(^="E=;BD1f SCd a}chYf Gy$bR4,P , :-t<+}{a袋["q%SH"E)RHbG!a":^cH%Ї>̴i2e̚=</~څZ[;dRHf5Z'KeAK2r0DJm]oI=Z'a ޶,;*s{InLqI'Ja8(HI)RH"E)Rl/_>YA b| n9d 3ň̡?TmkroB|& 六\ eO1H% N.Rس}/Fڹ187J0$ဟub:!1{ce,g<:Zzcr\8vkgZq8nynee|)'¾/n\g2OԀqmL?+;c)`ٲe|ߥP(`% =:8q"&LPzRi <=X}@5"E)RH"Er  &@JECC"_ZΚ5p cO`ɒ%wy̚5?ɵ1<補}L:s?A&k='89O~n㤅'1{9n$Osr#8ù⋓Eѣ=ƻnux;x衇{qQG1󐙜r)<YSHl+v=jN;4Ν{{1q 7ZЇ) |c}{֭ X`_Wjke뮻89c9/~/~\|Ooo/_?>Gu\pk׮ .EBI)9~FOO83gNrQO={89_멧ιG9ŋ<￟+O<{)%K,=ywgu%K~C=^{-!bϻ88s3|N=Tn&8 -[B-?x͛_N__˖-ӟ4Vx|+_?1G99묳^q|;IpB:(]7%SH"E)RHc1d6lkqcʕ+w 7@cc#6l_"v+VC }lذ|#\r%\twwe||߼+s{=z4Gy$կIٸq#6[ߺN8neUH)ٸq#◾ O瓟${/˖-ogXWijjR).RGf#/iӦ b8d:.M.[/r]y5װxbn|ӟ4g>ç>)j~$}?6'N.cgńx뮻;13( {|aCaµwј"E)RH"E=\\qŕL~ .W_lXCX蠶?ό3O?!#G@r}1rHwQUUСCinnaemmmTWWsg? k-\. mfGɓ};)SB? 2eRr)? {i<"E)RH"E[]xǘ1cϹիWޞB0b֭[u5j%!,… illk&9쳷H^{]K`\룫+ȋ熘 яw&! $yva<\xᅌ?3gr'~SN9BR#`ܹ<|gԨQ̚5+nP(0tPf̘^2!r5lr,,&<ϣiӦq'mL' 8T\_OJھ>Lv0g H2*hYfMRV\ɜ9s>; IDAT1YfM RJ6mڴ\7ֈw1!)RH"E)R"p$HHrxw1ǰrJ-Z֚իWs7rg0w\^~env1tww5j4/M=XzZk}Q0 1~x6l܈'|"[:u*h eeWuH5=|-9-2.)R^^z)jkkX,"dĈL0+O<1 }AkMGGՄaȸqo+l2J7ofƌxǺuxG+LGT*qg??9/ׯG)EGG dc„ \uU ItR10rHkC6娣_dѢEJ% $ڪ3 /$=֘{g) xr'|1#&N8n&6l؀1G pB~rJ,k׮M¯ š5k1~z%K`{W_eܹ[ϼyY|9.]:f꥞"E)RH"E d"(鎅:?^^u]&=DpĈW_}5]vuuu|+_fH{;&G;CFe}/K,!'> J{$! M齗X@QEXdWDeQ`ADQ . *A@H̹̽3I统13sLaU^ٳf!99+`1c&иqc,X,N<)S A$&&]63fŔ6!s_piF{ }&NT,^O?4fϞ 4ѬY3<3HLLS溮#../ usz)tM0 C ARRƍs=o٨Q QF۷/n&\r%Xr%HMMł ?N:5kũo߾ؿ?ƌ,ˮBtrV\xdz""""" G:uBOX'SOip_MV eVU*ھ<^<䔻s"*O…wL}`S=222ЩS)WHOOի/UY*qCWW۫?O{x Ml`ea̙3޽; T\o.?ge]{1m4ԭ[sOpE9M6/WUyQH\DDDDD۩SPvBϯX͛7yiv4o^ZCвeKIeh>uͅ`qg+Mr]3#*[>B}X!N:KbҤIv &8@qϯ$Wav 9n{,@zOs9[P.|+WFbb".ᥗ^BÆ w^h(F7dr"""""V겤⸴* {1xqLDh~pݸ뮻w^xݻw?,֜Ջwq݋AwQ ?]jU]1RWjފm =:84is)9K{ps9 _` *@ZUz< v=QK/d>ф4G)ݵ_xb(v_ዔAbbbyBgίvf-yUҟ/5Y |"¡$WT%Qᩂ\$$$JCU"""""24?I&}AqEUZв<'A/(/E6Ž8!QtM:P^5a^:222Pvm$%%?Gs85on`fiOphY$Bdgg#33ժU ίÏ"1u! "xw\oqY"!Wvc~+D΍E*JHHH(S"0"5Q! TUs*t\8x V;; R T烽O!7 չP[*UPzu\.!`]:`Ó: %"""":u*7,X0W!]gl N>( h"*g Ha4u²,~C\o_?M9 Lj9QϹ/g3eGDDDDDB萖84gu",#"*;CR98)) =@Ji!يբ*sV$""""":[~9 f+`B*| VT৾+].YW{\*zWќm`>7s (j Qo\ΪJT{S=@, `9 U?"""""*iHRRR^4.DjNPJy_jobuzx\U 8;9QV fT EJ7Z-m5q)E|(, k\rǁs7"""""PGmL\_!s{r8T CGD#!@l*WU@᮶=^Y t c(8YTirqƆ 0gdggcҤIHMM z~ι+U\T_UQπp;]վ`:FQh^o/l|>\_E{XD X{'p}?G߾} -w1n8Dz,L>6li:t(,BVV 'x~9D{ō7h?Ǝ]G;v,ODE 7[KgV9Wx X+[ip7z 󈈈( |CcQ977 ~0S傔n۾ޢ 4 ǾrV7/Pegg#33:t=u}Y0 eL4 'Ni\}<f̘xYj*:tȯ!@FFnf̝;1cqE'ƋB84_Q! W-E}C|Wdl*<9Re3tvV>~""""" hws,PNL0۷5! &/ߺu+ϟK"!!cXx<0n8,]ǏGӦM1e4lBlٲs}PfM<+x#K.on:}X~=t]Lj#P^=<0 î?:N:RbԨQ8r9#F?@nn.nf<޽;>ɓ'q5{b&݋˗cܸqXx,--ͮ B[nظqclkDTl?,Tgӥ: ,P*p` TSdV54Umʔ9s&L:Um۶ fӱm6h]ѬY3{(.+VePre̟?&LUc⡇B_`ĉXz5WM3஻? )%n\yx7Qzu\ ꫯpW0 H)ꫯ⫯§~{ ǥ^[oo>xװrJ !ۍz=]*W˲믿b0`@l{DYG`>BU9u.w=Y V! Ġ"b;bڴix'SN`SNE֭n[hފU>[8p~G\tEHKKeYꪫPvm|wHKK:tj ֥s߾}hР;4}v4o{6m~TV֢EЩS'o Lī^xgΜAZZ 巁b-٬'D@ XUX1Fh*}LDDDDDT"Ю];L<s<!fΜylYI)D=z޽{ѳgO{݋. aϞ=hܸ1n]SfM;8, . v4T!W!;̜9OF||u &rb'r׮]X;]6ѩSB?D qMMMţ>V'33Ļヒ:uD(o+Uΰ(CvY$h?9ѹ-33k.+мysH-JQElkO;1OC0 -[~HB]8aníPac0d)%j׮駟ٳaFĹ泂_FQI(0uAlY#..Bx<azNš, ƠAOD`9%oB.X|za`͚54 B{nA9u!yu/u]LDXDDDDDDDM+؁P0$X=+ @)e 5M+CEy;7sI` ~;.oEp b}Lux<> 3 f8HR"""""ThK͍D2}#:{Ui FDDDDDD#xaoݺm۶|>jyyye}:DH8QI`LDDDDD^Ҫ9˲/!!!: `zhJ7 ,^;Uh] oЧnTIGǶQC&z?4輈(:2HkK")NѪd8$xt_DDDDDDDDZ;JD$ 'o9Ul``SBu]eIoد c"0[ "xBB_i̍DDDDDDDD[{~?ǸqvZԨQRJ<Ӹ;CuzHIIUPF sR/D^Y|9>s_3fyp%n+w(2tMӂ6HC AժU!رcc׮]駟p_~=zK/BC9r\H)a!~W4j,!c4k }v @AhIDDDDDDDDT<T!vͭY VRUTS{{sy<deeAJ MРAӧO#99f,\Fjo~ɓq_VTQQi(9 BYWJ&;j~=MӰn: buL4:Ҩ:7TT&@Vo3/T#*$NӴBA\`8WcۏBES!W 2gH CUƕF\`X.ieAӼ~HHMey *+$DDDDDDDDs%>80p+ !I` IDATP)obHig QgFY9yWt|(q""""""""* z2bz6qݱ9)p"z?&"""""""7gb|T:;RTA\YP"Eq?""""""""֍&,JX`hva+-ز\.H)n{<݆vw]""""""""Y'b6!D嚦T :4Mavx i0Mo~!apв,KHDDDDDDDDR+SeY, !eYvxW4,޷~x1\0IDDDDDDDDt.*1Č3пgϞ{p+}| zݻwA^vv6RSSn:t{-t"==DDDDDDDDt^҄&!dBs㼼<}U{!C _wApECuS۶h#GOw}[n裏}۶m8z(S(t3v.5RT$PFsUW4=r&U(ւC-^ @;?C\.`֭;oU t]<ӧNM"!!իWG^`F =˲?eo&La͚5k֬A=={oG޽ѫW/L4 }z7Lo^ ǃSbѢEqW 551CΝ1zh{(i0 M^H)DDDDDDDDDH'N̙31uThqqqֶm0k,L>۶mivŞh֬xeeea͘C~`Y>#\{0 BXx1ZnocǎEϞ=QV-,X[nK/ /BsgbU9 ("خ];L4 3gĎ;JSNE֭Ν;#%%)))ԩ_ܑ#G`.0oѣz쉗_~9Xg 4@u]GZZ> 6 >>)))4 ڵk}všaÆB`Ȑ! D~~>>3 8Bhkm۶]vE*UyyyXf F. _ߐgu0 VQESN:u*͛-[`֭9s&&O֭[@ỪaGjxpQ{ĉom۶sfjBCul-B~~>v_`ڵ߿?4Mix衇puaԩ1b6o ! M6СC/P~}h>^Z\.n7 CPvms>4yUnw,EC8q"&M|SLAa4^phݺ5>C;$\2jժ8: ,\?0&M;vvڡVZXv-6l؀뮻4MðaÐaÆFnn.ѯ_?|㏑}u^ݞOw~@YeqLDDDDDDDD T'[ ZpJ:`xꩧо}x@ox7h">|RJdee!''n"//~Μ94h6l.wy'{1n;8h"4hM4C[4 mڴeYvA駟b֭ ף/"9˲i&̙3e!773fx H)YHDDDDDDDD1gMj֎4Mʶvڅ\ lj\K.xWdBRR4hەt_~%wnd;v7ߌ{i:t(>C˸!_ `Ĉ`f|'uɘ1c*U!:vۍ;RJa_nlYaܹ[-[W^AFF6n V%G={؁!Q']va?phy;q甛k//azHJ4L>]v#rQdff}&VX͛C)TQznO;1OC0 -[DRK1 /r޽0dvJk CM] I)_G0c nY9.S] @DDDDDDDDDeŮV u-j\I\y`W9+# v. C@""""""""*K d&ScU̹)% [x^/XAHDDDDDDDD%PFF4!V%CH۾,ѹZAz+n`a_Y &"""""""s LJ]uVm۶T3弼R9O"Y1([CtT2 9'et^ ?uAVPʆh#""""""*Yᳯ ; pё|tl5d1H@΋|}g= wt֐[{DDDDDD{"gfl UTRyRt!qHJI+|aML ԡ`S#""""""*yi .$xB[!t~ [Ul%`)TȡDDDDDD{)tDh&t]k˲TCؕ͝WJ )=aݷXk``AT I`yM1t D?}5RX'Bu?53 1|%""""")us*?R|N{iH'r"*O<a/^GEʕѪU+L2 4+~=ve?#GbhҤ ++ ]wLSwAƍw 7`ȑ[JQ  *S_ ;?BDDDDDDV"XW9_Q>|8 ^xCvv6;\zveYJf0zh} -v 1 L~O* *@"""""":yzL 'u]~7BՑB`ԨQʕ+cÆ x7x#>#XRJO>HNNƮ]0|p\}֭&M- /#*Lps-5h?V,^Wz<lڴ j=U]bWeeeoŴi9+u]ٳ1b\p1c*W )%*9s}RRRk駟fB~0|paKC0Q$ev(\ ]q%؍=&O 6FѣGVuX!7o/'ODǎ/>>ᅬ|7Cn @'}hӦ= QyRcT՞뼅s9]ס:&OttgΜtvH*{=$$$ux8p ֭[8p Rbڴipc݇-{LDDDDDDDD+e5kyHOOôjժnݺE`DA4!p1Oc :_ V*G5(*d*|AkX`222 ĉ'˲v!iA^^Pn6l7nubر2e ,˂0M7|3,Xq*:,H)qF<, yyyx?4MZ ˖-_j.BDDDDDDDD+2T}W\q^u޽7pڶmT:u ۷aR/@Nжm[i#F~c̘1vСCKV]8|0nXe}RSSѽ{ws=5kT7n׿cǎA4ٳ۶mҞ C(ĉ]3sxo[T!sJnn.Hr9jC w}" e;?FSI!}o0QvBϯX&7o+ B#cUΟvb؟mK+6`HCZlY剀;bF 2漈*3'} YyQp  \~Q)*ǐҲQEc /TFmK0$""""")1c||C M@*dTP&Bt fAi>RDDDDDDT ̘G|.+-ǚ6˲NǺHHMe\*`|A.4IXW7+^PmI $u{7QCYHJ&5sfdeB4f݀4EhҭAP`nn'/ G||<|@ sȢ/`lK@@@har#DDDDDDD%C ̬bn9* RJ![e4_Wr#Q$3~Ъ!"""""LW>""""""""X ѹEuRPcÎbpqQwwN:>.4 i! Ծs>8 "mΊ@˲ !Ovj]]aYz D"-gPFDDDDDDDDyoاivpi< uNUI)is bG¿/nΝѣGtaYƍ;cǎٳ'nvlٲO>áCbڵvU`[s!""""""""4MQw%[x t?3#GQfMݻaؕ{/F,[C\\< ϲ,CaW !:LӴONU 0VQ* *Qf)AhBxo 40 ;i 4cǎEzf͚Yfp`5_rr2F'O` ߎ=z_~6m<*h u#"""""""":ר6 $4_`ЅB t~ܾ>4nqqqv0{Q[.ի<\O?4aÆ!//KDDDDDDDDjժ!'' -RӨUVhΠe> MQNiU_{""""""""LԮ];r+omʛ_OѼYs7 """"""""99LhEfy*BCUӍpZa`lUF9#Q(N*p ;# bG˲.DDDDDDDDDšae)_XHi,+.DDDDDDDDD ٺu+ڶm McXcJDDDDDDDDgGj4o(a!ϡ-i:*ެ60- """""""к6lO&i ʗ#ض#jD! ڳw0 b+bVf'R^)2%!šT%ӅD!]K[șb+r]lChBxOI˟JD$ 'D!DDDDDDDDE3 @@UmCPJ ˲^Ħi=vru;D6ȼj[YW49 -[iZzCKz|~M#"""""""Pʸ,,j*s|*xj[gb!,6@ hlY\yot)A|<""""""" /r`휁0"OuiW:8RJH)a*uhj8x<H)qqKU5jd(癚>}[n… QF O>;v>c pUWaĉp\6$""""""""Vz!ХK"c'NeYSNa€jo޼yxgΝ;cٲeAFCJ ǃcǎnݺРA*QJ3g"//III8pOsbE:QydHn1`9 ժUeY8z(j֬Yh=˲`YƏ/4P^-97СCcǎ_~8uHKKѷo_TT *U4lcƌ#<z>ՀDDDDDDDDT eCkZBdh|6mZh?j@6BЭnݺ8x LӴn7ߏڵk!ȯ:V^_~&LSO=6m`~ gΜA|||jBDDDDDDDDt<às`Uw\.{xװxb۷999طo+91x`X6l@vv6~w (nu)SgŞ={+/}.iIػw/z8p4ib6mܹs:u` ?レ6O?yRghUh3o}:w>  ; ZEy.êm"5BZL`EccK s'QQY"|&>Š2 ܅۷xZ*Gf t<>7/DDDDDDDDP)P"5jj%73\i{4!X廀We"x6f}A:$tX*5>.Ta.ݲ`oeMNϒfwFwB""""""""HCKJ ͑Yn<zL4*qX!yt -؋e 70@"""""""(!a5$k&%q$ @T՞MDh| VV ,xZhM#3 @""""""")|~tyvŚ !GB?ތNJY04iع7kV5jTj BX 4˗蘂$wF:u <)` @^^P_*v+,}`"""""""ɛKgϛIMM)PjUtJ,?NIENDB`KDAB-hotspot-41e5de7/scripts/000077500000000000000000000000001515036260400160225ustar00rootroot00000000000000KDAB-hotspot-41e5de7/scripts/appimage/000077500000000000000000000000001515036260400176055ustar00rootroot00000000000000KDAB-hotspot-41e5de7/scripts/appimage/Dockerfile000066400000000000000000000241101515036260400215750ustar00rootroot00000000000000# # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # FROM almalinux:9 AS intermediate ARG QT_VERSION=6.8.3 ARG QT_VERSION_SHORT=6.8 ARG KF6_VERSION=v6.16.0 ARG KDDockWidgets_VERSION=v2.2.5 ARG QCustomPlot_VERSION=2.1.1 ARG rust_demangler_VERSION=0.1.24 ARG d_demangler_VERSION=0.0.2 ARG KGraphViewer_VERSION=v25.04.3 ARG KDiagram_VERSION=v3.0.1 USER root # install dependencies RUN dnf update -y && dnf install -y 'dnf-command(config-manager)' && dnf config-manager --set-enabled crb && dnf update -y && \ dnf install -y \ glibc-langpack-en gcc-toolset-14 elfutils-devel elfutils-libelf-devel elfutils-debuginfod-client-devel flex bison file \ perl perl-IO-Socket-SSL perl-YAML \ gperf wget cmake3 which git python3 libzstd-devel \ polkit-devel libxslt-devel docbook-style-xsl \ # install Qt build dependencies, see: https://wiki.qt.io/Building_Qt_6_from_Git # qtbase libxcb libxcb-devel xcb-util xcb-util-devel mesa-libGL-devel libxkbcommon-devel libudev-devel \ libinput-devel xcb-util-image-devel xcb-util-wm-devel xcb-util-keysyms-devel xcb-util-cursor-devel \ mesa-libgbm-devel xcb-util-renderutil-devel libSM-devel libxkbcommon-x11-devel \ postgresql-devel unixODBC-devel pcre2-devel openssl-devel openssl cups-devel \ # gtk widget theme support gtk3-devel libcanberra-devel \ # kfilemetadata libattr-devel \ # kio libmount-devel \ # debugging nano \ # kgraphviewer boost boost-devel graphviz-devel \ # appimages fuse fuse-libs bzip2 rsync \ # elfutils libmicrohttpd-devel sqlite-devel libarchive-devel \ # wayland ninja-build meson expat-devel doxygen xmlto \ # sonnet hunspell-devel \ # kwallet gpgme-devel gpgmepp-devel libgcrypt-devel libsecret-devel && \ rm -Rf /var/dnf/yum FROM intermediate AS builder ENV LD_LIBRARY_PATH=/opt/rh/gcc-toolset-14/root/usr/lib64:/opt/rh/gcc-toolset-14/root/usr/lib:/opt/rh/gcc-toolset-14/root/usr/lib64/dyninst:/opt/rh/gcc-toolset-14/root/usr/lib/dyninst:/opt/rh/gcc-toolset-14/root/usr/lib64:/opt/rh/gcc-toolset-14/root/usr/lib ENV PATH=/opt/rh/gcc-toolset-14/root/usr/bin${PATH:+:${PATH}} # Set environment variables for locale ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 RUN . /opt/rh/gcc-toolset-14/enable # qt RUN cd /opt && mkdir qt && cd qt && wget https://download.qt.io/official_releases/qt/${QT_VERSION_SHORT}/${QT_VERSION}/single/qt-everywhere-src-${QT_VERSION}.tar.xz && \ tar -xvf qt-everywhere-src-${QT_VERSION}.tar.xz && \ mkdir build && cd build && ../qt-everywhere-src-${QT_VERSION}/configure -opensource -confirm-license -force-debug-info -separate-debug-info \ -xcb -xcb-xlib -bundled-xcb-xinput \ -skip qtwebengine,qtwebsockets,qtwebchannel,qtquick3d,qtdatavis3d,qt3d,qtdeclarative \ -skip qtmultimedia,qtquicktimeline,qtgraphs,qtlottie \ -skip qtcharts,qtdoc,qtserialbus \ -skip qtserialport,qtwebview,qtlocation,qtspeech,qtgraphs \ -skip qtmqtt,qtopcua,qtquick3dphysics,qtquickeffectmaker,qtvirtualkeyboard,qtscxml \ -skip qtremoteobjects,qtsensors,qtpositioning,qthttpserver,qtgrpc,qtconnectivity,qtcoap \ -skip qtactiveqt,qtlanguageserver,qtshadertools,qtnetworkauth \ -release -ssl -nomake examples -cups -I /usr/include/openssl11 -prefix /usr -linker gold && \ ninja install && cd /opt && rm -Rf qt # qcustomplot RUN cd /opt && mkdir qcustomplot && cd qcustomplot && \ wget https://www.qcustomplot.com/release/${QCustomPlot_VERSION}/QCustomPlot.tar.gz && tar -xf QCustomPlot.tar.gz && \ cd qcustomplot && cp qcustomplot.h /usr/include && \ wget https://www.qcustomplot.com/release/${QCustomPlot_VERSION}/QCustomPlot-sharedlib.tar.gz && \ tar -xf QCustomPlot-sharedlib.tar.gz && ls && cd qcustomplot-sharedlib/sharedlib-compilation \ && qmake . && make -j$(nproc) && mv libqcustomplot.so* /usr/lib && cd /opt && rm -Rf qcustomplot # rust demangle RUN cd /opt/ && mkdir rust && cd rust && wget https://sh.rustup.rs -O rustup.sh && \ chmod +x rustup.sh && ./rustup.sh -y && \ git clone -b ${rust_demangler_VERSION} https://github.com/rust-lang/rustc-demangle && \ cd rustc-demangle && $HOME/.cargo/bin/cargo build -p rustc-demangle-capi --release && \ cp target/release/librustc_demangle.so /usr/lib/ && cd /opt && rm -Rf rust # dlang demangle RUN cd /opt && mkdir dlang && cd dlang && \ # gpg is too old and cannot verify the signature, disable it temporarily mv /usr/bin/gpg{,~} && mv /usr/bin/gpg2{,~} && \ wget https://dlang.org/install.sh && chmod +x install.sh && ./install.sh -p /opt/dlang && \ source /opt/dlang/dmd-*/activate && \ wget https://github.com/lievenhey/d_demangler/archive/refs/tags/version-${d_demangler_VERSION}.tar.gz -O - | tar -xz && \ cd d_demangler-version-${d_demangler_VERSION}/ && \ # link libphobos2 statically sed -i 's/defaultlib=libphobos2.so/defaultlib=:libphobos2.a/' Makefile && \ make && mv libd_demangle.so /usr/lib/ && \ deactivate && mv /usr/bin/gpg{~,} && mv /usr/bin/gpg2{~,} && \ cd /opt && rm -Rf dlang # kdesrc-build dependencies RUN cpan YAML::Syck JSON::XS YAML::XS # kde frameworks RUN cd /opt && git clone https://invent.kde.org/sdk/kdesrc-build.git COPY kdesrc-buildrc /opt/kdesrc-build/ RUN ldconfig && \ cd /opt/kdesrc-build && \ sed -i -e "s/FULL_NPROC/$(nproc)/g" \ -e "s/HALF_NPROC/$(($(nproc)/2))/g" -e "s/%VERSION%/${KF6_VERSION}/g" kdesrc-buildrc && \ ./kdesrc-build --metadata-only && \ # fix compile error in kwallet ./kdesrc-build --include-dependencies qca && \ ./kdesrc-build --ignore-modules=gpgme --include-dependencies threadweaver kconfigwidgets kcoreaddons \ kitemviews kitemmodels solid breeze-icons \ kwindowsystem knotifications kiconthemes karchive syntax-highlighting kio kparts && \ # without extra dependencies ./kdesrc-build --revision ${KGraphViewer_VERSION} --no-include-dependencies kgraphviewer && \ ./kdesrc-build --revision ${KDiagram_VERSION} --no-include-dependencies kdiagram && \ cd /opt && rm -Rf /opt/kdesrc-build/ # kddockwidgets RUN cd /opt && mkdir kddw && cd kddw && git clone --recursive https://github.com/KDAB/KDDockWidgets.git -b ${KDDockWidgets_VERSION} && \ cd KDDockWidgets && mkdir build && cd build && \ cmake -DCMAKE_INSTALL_PREFIX=/usr -DKDDockWidgets_EXAMPLES=0 -DKDDockWidgets_FRONTENDS="qtwidgets" -DKDDockWidgets_QT6=ON -G Ninja .. && \ ninja install && cd /opt && rm -Rf kddw FROM builder AS stripped WORKDIR / RUN find /usr -type f -name "*.debug" -exec rm {} \; RUN find /usr -type f -name "libKF*" -exec strip --strip-all {} \; RUN find /usr -type f -name "libQt*" -exec strip --strip-all {} \; RUN find /usr -type f -name "libkd*" -exec strip --strip-all {} \; RUN find /usr/local -type f -name "*.so*" -exec strip --strip-all {} \; RUN cd /opt && wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod +x linuxdeploy-x86_64.AppImage && ./linuxdeploy-x86_64.AppImage --appimage-extract && \ wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage && chmod +x linuxdeploy-plugin-qt-x86_64.AppImage && ./linuxdeploy-plugin-qt-x86_64.AppImage --appimage-extract && \ wget https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage && chmod +x linuxdeploy-plugin-appimage-x86_64.AppImage && ./linuxdeploy-plugin-appimage-x86_64.AppImage --appimage-extract && \ cd squashfs-root && rsync -a usr/ /usr && rsync -a plugins/linuxdeploy-plugin-appimage/ / && cd /opt/squashfs-root/appimagetool-prefix && rsync -a usr/ /usr FROM intermediate AS kdesrc-build ENV LD_LIBRARY_PATH=/opt/rh/gcc-toolset-14/root/usr/lib64:/opt/rh/gcc-toolset-14/root/usr/lib:/opt/rh/gcc-toolset-14/root/usr/lib64/dyninst:/opt/rh/gcc-toolset-14/root/usr/lib/dyninst:/opt/rh/gcc-toolset-14/root/usr/lib64:/opt/rh/gcc-toolset-14/root/usr/lib:/opt/rh/rh-perl530/root/usr/lib64:/usr/lib ENV PATH=/opt/rh/gcc-toolset-14/root/usr/bin:/opt/rh/rh-git227/root/usr/bin:/opt/rh/rh-perl530/root/usr/local/bin:/opt/rh/rh-perl530/root/usr/bin${PATH:+:${PATH}} # Set environment variables for locale ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 COPY --from=stripped /usr /usr COPY --from=stripped /usr/local/lib64 /opt/rh/gcc-toolset-14/root/lib64 # set the entrypoint to the build script so that the build script will be run by github actions CMD ["/github/workspace/scripts/appimage/build_appimage.sh", "/github/workspace", "/github/workspace/build"] FROM builder AS debugcollector RUN mkdir /debug RUN find /usr -type f -name "libKF*" -execdir strip --only-keep-debug {} /debug/{}.debug \; RUN find /usr -type f -name "libQ*.debug" -execdir cp {} /debug/{} \; RUN find /usr -type f -name "libq*.debug" -execdir cp {} /debug/{} \; RUN find /usr -type f -name "libkd*" -execdir strip --only-keep-debug {} /debug/{}.debug \; RUN find /usr/local -type f -name "*.so*" -execdir strip --only-keep-debug {} /debug/{}.debug \; RUN tar -cjvf "/qt-debuginfo-x86_64.tar.bz2" /debug RUN cd / && wget https://github.com/cli/cli/releases/download/v2.49.2/gh_2.49.2_linux_amd64.tar.gz && tar -xzf gh_2.49.2_linux_amd64.tar.gz FROM intermediate AS debuginfo ENV LD_LIBRARY_PATH=/opt/rh/gcc-toolset-14/root/usr/lib64:/opt/rh/gcc-toolset-14/root/usr/lib:/opt/rh/gcc-toolset-14/root/usr/lib64/dyninst:/opt/rh/gcc-toolset-14/root/usr/lib/dyninst:/opt/rh/gcc-toolset-14/root/usr/lib64:/opt/rh/gcc-toolset-14/root/usr/lib:/usr/lib ENV PATH=/opt/rh/gcc-toolset-14/root/usr/bin${PATH:+:${PATH}} # Set environment variables for locale ENV LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 COPY --from=debugcollector /qt-debuginfo-x86_64.tar.bz2 / COPY --from=debugcollector /gh_2.49.2_linux_amd64/bin/gh /usr/bin/ COPY publish-qt-debuginfo.sh / CMD ["/publish-qt-debuginfo.sh"] KDAB-hotspot-41e5de7/scripts/appimage/build_appimage.sh000077500000000000000000000060261515036260400231120ustar00rootroot00000000000000#!/bin/bash # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # set -e srcdir=$(readlink -f "$1") buildir=$(readlink -f "$2") if [ -z "$srcdir" ] || [ -z "$buildir" ]; then echo "usage: $0 " exit 1 fi # workaround owner/permission issues resulting in: # fatal: detected dubious ownership in repository at '/github/workspace' git config --global --add safe.directory "$srcdir" gitversion=$(git -C "$srcdir" describe) . /opt/rh/gcc-toolset-14/enable mkdir -p "$buildir" && cd "$buildir" # KGraphViewer triggers strange crashes in the AppImage, disable it cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_PREFIX_PATH=/opt/rh/gcc-toolset-14/root/ \ -DCMAKE_DISABLE_FIND_PACKAGE_KGraphViewerPart=ON \ -DAPPIMAGE_BUILD=ON -DCMAKE_INSTALL_PREFIX=/usr -DQT6_BUILD=ON "$srcdir" make -j$(nproc) rm -Rf appdir DESTDIR=appdir make install tar -cjvf "/github/workspace/hotspot-debuginfo-$gitversion-x86_64.tar.bz2" \ --transform="s#appdir/#hotspot-debuginfo-$gitversion/#" \ appdir/usr/bin/hotspot appdir/usr/libexec/hotspot-perfparser # FIXME: Do in CMakeLists.txt mkdir -p "appdir/usr/share/applications/" cp "$srcdir/com.kdab.hotspot.desktop" "appdir/usr/share/applications/" # Ensure we prefer the bundled libs also when calling dlopen, cf.: https:/github.com/KDAB/hotspot/issues/89 cat << WRAPPER_SCRIPT > ./appdir/AppRun #!/bin/bash f="\$(readlink -f "\${0}")" d="\$(dirname "\$f")" bin="\$d/usr/bin" unset QT_PLUGIN_PATH LD_LIBRARY_PATH="\$d/usr/lib":\$LD_LIBRARY_PATH "\$bin/hotspot" "\$@" WRAPPER_SCRIPT chmod +x ./appdir/AppRun # include breeze icons mkdir -p "appdir/usr/share/icons/breeze" cp -v "/usr/share/icons/breeze/breeze-icons.rcc" "appdir/usr/share/icons/breeze/" # plugins # FIXME: kgraphviewer crashes when loading a file when compiled with this method # mkdir ./appdir/usr/plugins # cp /usr/plugins/kgraphviewerpart.so ./appdir/usr/plugins # TODO: further down also add: # -e "./appdir/usr/plugins/kgraphviewerpart.so" \ # tell the linuxdeploy qt plugin to include these platform plugins export EXTRA_PLATFORM_PLUGINS="libqoffscreen.so;libqwayland-generic.so" mkdir -p appdir/usr/plugins/wayland-shell-integration/ cp /usr/plugins/wayland-shell-integration/libxdg-shell.so appdir/usr/plugins/wayland-shell-integration/ linuxdeploy --appdir appdir --plugin qt \ -e "./appdir/usr/libexec/hotspot-perfparser" \ -e "./appdir/usr/bin/hotspot" \ -l "/usr/lib64/libz.so.1" \ -l /usr/lib64/libharfbuzz.so.0 \ -l /usr/lib64/libfreetype.so.6 \ -l /usr/lib64/libfontconfig.so.1 \ -l /usr/lib/librustc_demangle.so \ -l /usr/lib/libd_demangle.so \ -l /usr/lib64/libwayland-egl.so \ -i "$srcdir/src/images/icons/128-apps-hotspot.png" --icon-filename=hotspot \ -d "./appdir/usr/share/applications/com.kdab.hotspot.desktop" \ --output appimage mv Hotspot*x86_64.AppImage "/github/workspace/hotspot-$gitversion-x86_64.AppImage" KDAB-hotspot-41e5de7/scripts/appimage/build_appimage_in_docker.sh000077500000000000000000000007751515036260400251340ustar00rootroot00000000000000#!/bin/sh # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # set -e cd "$(dirname $0)" mkdir -p ../output/build-appimage docker run -it --rm \ -v $PWD/../../:/github/workspace/ \ ghcr.io/kdab/kdesrc-build:latest \ /github/workspace/scripts/appimage/build_appimage.sh /github/workspace /github/workspace/scripts/output/build-appimage KDAB-hotspot-41e5de7/scripts/appimage/build_docker.sh000077500000000000000000000007031515036260400225720ustar00rootroot00000000000000#!/bin/sh # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # set -e cd $(dirname $0) docker build --ulimit nofile=1024:262144 --rm -t ghcr.io/kdab/kdesrc-build --target kdesrc-build . docker build --ulimit nofile=1024:262144 --rm -t ghcr.io/kdab/kdesrc-build-debuginfo --target debuginfo . KDAB-hotspot-41e5de7/scripts/appimage/download_docker.sh000077500000000000000000000010161515036260400233000ustar00rootroot00000000000000#!/bin/sh # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # set -e echo "downloading docker image from ghcr.io" ghcr_user=$(pass show ghcr.io | grep 'login: ' | cut -d' ' -f 2) pass show ghcr.io | head -n1 | docker login ghcr.io -u $ghcr_user --password-stdin logout() { docker logout ghcr.io } trap logout EXIT docker pull ghcr.io/kdab/kdesrc-build:latest KDAB-hotspot-41e5de7/scripts/appimage/kdesrc-buildrc000066400000000000000000000063711515036260400224340ustar00rootroot00000000000000# This is a sample kdesrc-build configuration file appropriate for KDE # Frameworks 6-based build environments. # # See the kdesrc-buildrc-sample for explanations of what the options do, or # view the manpage or kdesrc-build documentation at # https://docs.kde.org/?application=kdesrc-build # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2025 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # global branch-group kf6-qt6 install-dir /usr # Where to install KF5-based software # Uncomment this and edit value to choose a different Qt5 qt-install-dir /usr # Where to find Qt5 # Where to download source code. By default the build directory and # logs will be kept under this directory as well. source-dir /opt/kde/src # These values should be set to the number of cores to use during build (if # in doubt, run "nproc" to see how many cores you have) num-cores FULL_NPROC # This is the same as above but used for heavyweight modules like # qtwebengine, though you can use it for modules yourself. A conservative # thumbrule is one core for every 2 GiB of total memory. num-cores-low-mem HALF_NPROC cmake-options -DBUILD_TESTING=OFF -DBUILD_DESIGNERPLUGIN=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=gold -DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=gold end global # Instead of specifying modules here, the current best practice is to refer to # KF module lists maintained with kdesrc-build by the KF developers. As new # modules are added or modified, the kdesrc-build KF module list is altered to # suit, and when you update kdesrc-build you will automatically pick up the # needed changes. include ${module-definitions-dir}/kf6-qt6.ksb # If you wish to maintain the module list yourself that is possible, simply # look at the files pointed to above and use the "module-set" declarations that # they use, with your own changes. options frameworks tag %VERSION% end options # It is possible to change the options for modules loaded from the file # included above (since it's not possible to add a module that's already been # included), e.g. options kcoreaddons cmake-options -DKCOREADDONS_USE_QML=OFF -DBUILD_PYTHON_BINDINGS=OFF end options options kwidgetsaddons cmake-options -DBUILD_PYTHON_BINDINGS=OFF end options options kguiaddons cmake-options -DBUILD_PYTHON_BINDINGS=OFF end options options knotifications cmake-options -DBUILD_PYTHON_BINDINGS=OFF end options options kjobwidgets cmake-options -DBUILD_PYTHON_BINDINGS=OFF end options options kxmlgui cmake-options -DBUILD_PYTHON_BINDINGS=OFF end options options kiconthemes cmake-options -DKICONTHEMES_USE_QTQUICK=OFF end options options kwindowsystem cmake-options -DKWINDOWSYSTEM_QML=OFF end options options kconfig cmake-options -DKCONFIG_USE_QML=OFF end options options ki18n cmake-options -DBUILD_WITH_QML=OFF end options options sonnet cmake-options -DSONNET_USE_QML=OFF end options options ktextwidgets cmake-options -DWITH_TEXT_TO_SPEECH=OFF end options options extra-cmake-modules tag %VERSION% end options options breeze-icons cmake-options -DBINARY_ICONS_RESOURCE=ON end options KDAB-hotspot-41e5de7/scripts/appimage/publish-qt-debuginfo.sh000077500000000000000000000012021515036260400241670ustar00rootroot00000000000000#!/bin/sh # # SPDX-FileCopyrightText: Lieven Hey # SPDX-FileCopyrightText: 2024 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # set -e cd /workspace # workaround owner/permission issues resulting in: # fatal: detected dubious ownership in repository at '/github/workspace' git config --global --add safe.directory "/workspace" gh repo set-default kdab/hotspot gh release delete qt-debuginfo || true gh release create qt-debuginfo /qt-debuginfo-x86_64.tar.bz2 --draft=false --notes "Qt and KDE debug symbols" --title "qt-kde-debuginfo" --latest=false KDAB-hotspot-41e5de7/scripts/appimage/publish_docker.sh000077500000000000000000000012711515036260400231420ustar00rootroot00000000000000#!/bin/sh # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # set -e echo "uploading docker image to ghcr.io" ghcr_user=$(pass show ghcr.io | grep 'login: ' | cut -d' ' -f 2) pass show ghcr.io | head -n1 | docker login ghcr.io -u $ghcr_user --password-stdin logout() { docker logout ghcr.io } trap logout EXIT docker push ghcr.io/kdab/kdesrc-build:latest echo "upload debug info" cd $(dirname $0) docker run -it --rm -e GITHUB_TOKEN=$(pass ghcr.io | head -n1) -v $PWD/../../:/workspace ghcr.io/kdab/kdesrc-build-debuginfo:latest KDAB-hotspot-41e5de7/scripts/appimage/run_debuginfod_in_docker.sh000077500000000000000000000015671515036260400251640ustar00rootroot00000000000000#!/bin/bash # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # set -e if [ ! -f "$1" ]; then echo "usage: $0 " exit 1 fi debuginfo_archive=$(readlink -f "$1") cd "$(dirname $0)" docker run -p 12345:12345 \ -v "$debuginfo_archive":/debuginfo.zip \ -it ghcr.io/kdab/kdesrc-build \ bash -c "echo 'unpacking debuginfo...' && \ unzip -p - debuginfo.zip | tar -xvj && \ echo 'starting debuginfod in docker...' && \ echo 'to use it on your host system, set:' && \ echo '' && \ echo ' export DEBUGINFOD_URLS=\"127.0.0.1:12345 https://debuginfod.centos.org/ $DEBUGINFOD_URLS\"' && \ echo '' && \ debuginfod -p 12345 -F /usr /hotspot-debuginfo*/" KDAB-hotspot-41e5de7/scripts/check_kallsyms.py000077500000000000000000000015551515036260400214010ustar00rootroot00000000000000#!/bin/env python3 # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # import sys import re prog = re.compile(r"([a-z0-9]+) (\S+) (\S+)(?:\s+(\S+))?") prevLine = None prevStart = None nextLine = None nextStart = None addr = int(sys.argv[1], 16) print("looking for", sys.argv[1]) for line in sys.stdin: m = prog.search(line) if not m: print("no match: ", line.rstrip()) continue start = int(m[1], 16) if start > addr: nextLine = line nextStart = start break prevLine = line prevStart = start print("best match sym:", prevLine.rstrip(), "diff is:", hex(addr - prevStart)) print("next sym is:", nextLine.rstrip(), "diff is:", hex(nextStart - addr)) KDAB-hotspot-41e5de7/scripts/check_mmaps.py000077500000000000000000000012511515036260400206500ustar00rootroot00000000000000#!/bin/env python3 # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # import sys import re prog = re.compile(r"\[(0x[a-z0-9]+)((0x[a-z0-9]+)\)") for line in sys.stdin: if not "PERF_RECORD_MMAP" in line: continue m = prog.search(line) if not m: print("no match: ", line.rstrip()) continue start = int(m[1], 16) length = int(m[2], 16) end = start + length for arg in sys.argv[1:]: if start <= int(arg, 16) < end: print(arg, "matched in:", line) KDAB-hotspot-41e5de7/scripts/compile-test/000077500000000000000000000000001515036260400204275ustar00rootroot00000000000000KDAB-hotspot-41e5de7/scripts/compile-test/BaseArchlinuxQt6000066400000000000000000000007111515036260400234740ustar00rootroot00000000000000FROM archlinux:latest # install dependencies RUN pacman -Sy --noconfirm && \ pacman -S archlinux-keyring --noconfirm && pacman-key --init && pacman-key --populate && \ pacman -Syu --noconfirm git make cmake gcc extra-cmake-modules \ libelf gettext qt6-base ninja wget \ threadweaver kconfigwidgets knotifications karchive syntax-highlighting \ kiconthemes kitemviews kitemmodels kwindowsystem kio kparts solid clazy python python-yaml KDAB-hotspot-41e5de7/scripts/compile-test/BaseArchlinuxWithoutOptionalQt6000066400000000000000000000006541515036260400265740ustar00rootroot00000000000000FROM archlinux:latest # install dependencies RUN pacman -Sy --noconfirm && \ pacman -S archlinux-keyring --noconfirm && pacman-key --init && pacman-key --populate && \ pacman -Syu --noconfirm git make cmake gcc extra-cmake-modules \ libelf gettext qt6-base ninja wget \ threadweaver kconfigwidgets knotifications \ kiconthemes kitemviews kitemmodels kwindowsystem kio kparts solid clazy python python-yaml KDAB-hotspot-41e5de7/scripts/compile-test/BaseFedora42Qt6000066400000000000000000000012311515036260400231030ustar00rootroot00000000000000FROM fedora:42 # install dependencies RUN echo "max_parallel_downloads=10" >> /etc/dnf/dnf.conf && \ echo "deltarpm=True" >> /etc/dnf/dnf.conf && \ dnf install -y cmake gcc glibc-static gcc-c++ libstdc++-static git ninja-build libasan libubsan wget \ qt6-qtbase qt6-qtbase-devel qt6-qtsvg-devel \ qt6-qtbase-private-devel extra-cmake-modules elfutils-devel kf6-threadweaver-devel kf6-syntax-highlighting-devel \ kf6-kconfigwidgets-devel kf6-kitemviews-devel kf6-kitemmodels-devel kf6-karchive-devel \ kf6-kio-devel kf6-solid-devel kf6-kwindowsystem-devel kf6-kiconthemes-devel \ kf6-knotifications-devel kf6-kparts-devel libzstd-devel KDAB-hotspot-41e5de7/scripts/compile-test/BaseNeonQt6000066400000000000000000000023461515036260400224440ustar00rootroot00000000000000FROM ubuntu:24.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y gnupg2 wget && \ wget https://archive.neon.kde.org/public.key -O /tmp/public.key && \ apt-key add /tmp/public.key && rm /tmp/public.key && \ echo "deb http://archive.neon.kde.org/unstable noble main" > /etc/apt/sources.list.d/neon.list && \ echo "deb-src http://archive.neon.kde.org/unstable noble main" >> /etc/apt/sources.list.d/neon.list && \ apt-get update && apt-get dist-upgrade -y --allow-downgrades && \ apt-get install -y qt6-base-dev qt6-base-private-dev qt6-svg-dev \ locales cmake libdwarf-dev mesa-common-dev \ libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev \ build-essential curl git wget autotools-dev autoconf libtool liblzma-dev libz-dev gettext cmake \ libzstd-dev ninja-build libdw-dev libelf-dev kf6-extra-cmake-modules \ kf6-karchive-dev kf6-threadweaver-dev kf6-ki18n-dev kf6-kconfigwidgets-dev kf6-kxmlgui-dev \ kf6-kcoreaddons-dev kf6-kitemviews-dev kf6-kitemmodels-dev kf6-kio-dev kf6-kparts-dev kf6-kcolorscheme-dev \ kf6-solid-dev kf6-kwindowsystem-dev kf6-knotifications-dev kf6-kiconthemes-dev kf6-syntax-highlighting-dev KDAB-hotspot-41e5de7/scripts/compile-test/BaseOpenSuseTumbleweedQt6000066400000000000000000000013031515036260400253140ustar00rootroot00000000000000FROM opensuse/tumbleweed:latest # install dependencies RUN zypper --non-interactive update && \ zypper --non-interactive install \ cmake gcc-c++ glibc-devel-static git ninja binutils gettext wget \ libzstd-devel libelf-devel libdw-devel libdebuginfod-devel \ qt6-widgets-devel qt6-base-devel qt6-svg-devel \ qt6-widgets-private-devel \ kf6-extra-cmake-modules kf6-threadweaver-devel kf6-kio-devel kf6-syntax-highlighting-devel \ kf6-solid-devel kf6-kcoreaddons-devel kf6-threadweaver-devel kf6-kconfigwidgets-devel \ kf6-kitemmodels-devel kf6-kitemviews-devel kf6-kwindowsystem-devel kf6-kparts-devel \ kf6-knotifications-devel kf6-kiconthemes-devel kf6-karchive-devel KDAB-hotspot-41e5de7/scripts/compile-test/BaseUbuntu20.04000066400000000000000000000023731515036260400230200ustar00rootroot00000000000000FROM ubuntu:20.04 # install dependencies ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get -y upgrade && \ apt-get install -y software-properties-common && \ add-apt-repository ppa:beineri/opt-qt-5.15.4-focal -y && \ add-apt-repository ppa:kubuntu-ppa/backports && \ apt-get update && \ apt-get -y upgrade && \ apt-get install -y qt515base qt515svg qt515x11extras cmake libdwarf-dev mesa-common-dev \ libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev \ build-essential curl git wget autotools-dev autoconf libtool liblzma-dev libz-dev gettext cmake \ libzstd-dev ninja-build libdw-dev libelf-dev extra-cmake-modules \ libkf5archive-dev libkf5threadweaver-dev libkf5i18n-dev libkf5configwidgets-dev \ libkf5coreaddons-dev libkf5itemviews-dev libkf5itemmodels-dev libkf5kio-dev libkf5parts-dev \ libkf5solid-dev libkf5windowsystem-dev libkf5notifications-dev libkf5iconthemes-dev libkf5syntaxhighlighting-dev \ libqt5svg5-dev libqcustomplot-dev ENV PATH="/opt/bin:/opt/qt515/bin:${PATH}" \ PKG_CONFIG_PATH="/opt/qt515/lib/pkgconfig:${PKG_CONFIG_PATH}" \ LD_LIBRARY_PATH="/opt/qt515/lib:/opt/qt515/lib/x86_64-linux-gnu" KDAB-hotspot-41e5de7/scripts/compile-test/BaseUbuntu22.04000066400000000000000000000015671515036260400230260ustar00rootroot00000000000000FROM ubuntu:22.04 # install dependencies ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get -y upgrade && \ apt-get install -y qtbase5-dev qtbase5-private-dev libqt5svg5-dev libqt5x11extras5-dev \ cmake libdwarf-dev mesa-common-dev libqcustomplot-dev \ libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev \ build-essential curl git wget autotools-dev autoconf libtool liblzma-dev libz-dev gettext cmake \ libzstd-dev ninja-build libdw-dev libelf-dev extra-cmake-modules \ libkf5archive-dev libkf5threadweaver-dev libkf5i18n-dev libkf5configwidgets-dev \ libkf5coreaddons-dev libkf5itemviews-dev libkf5itemmodels-dev libkf5kio-dev libkf5parts-dev \ libkf5solid-dev libkf5windowsystem-dev libkf5notifications-dev libkf5iconthemes-dev libkf5syntaxhighlighting-dev KDAB-hotspot-41e5de7/scripts/compile-test/BuildDependencies000066400000000000000000000006751515036260400237300ustar00rootroot00000000000000ARG BASEIMAGE FROM $BASEIMAGE ARG KDDOCKWIDGETS_VERSION="1.6" WORKDIR /opt RUN git clone -b "$KDDOCKWIDGETS_VERSION" https://github.com/KDAB/KDDockWidgets && \ cd KDDockWidgets && mkdir build && cd build && \ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/ \ -DKDDockWidgets_EXAMPLES=OFF -DKDDockWidgets_FRONTENDS="qtwidgets" -G Ninja .. && \ cmake --build . --target install && cd /opt && rm -Rf KDDockWidgets KDAB-hotspot-41e5de7/scripts/compile-test/BuildDependenciesQt6000066400000000000000000000023561515036260400243210ustar00rootroot00000000000000ARG BASEIMAGE FROM $BASEIMAGE ARG KDDOCKWIDGETS_VERSION ARG LIBDIR WORKDIR /opt RUN ([ -f /etc/local.gen ] && sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen) || echo "skipped" ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 RUN wget https://www.qcustomplot.com/release/2.1.1/QCustomPlot-source.tar.gz && \ tar -xf QCustomPlot-source.tar.gz && rm QCustomPlot-source.tar.gz && cd qcustomplot-source && \ cp -va qcustomplot.h /usr/include/ && \ wget https://www.qcustomplot.com/release/2.1.1/QCustomPlot-sharedlib.tar.gz && \ tar -xf QCustomPlot-sharedlib.tar.gz && cd qcustomplot-sharedlib/sharedlib-compilation && \ qmake6 CONFIG+=release CONFIG+=force_debug_info && make -j$(nproc) && \ sed -i '/QtPrintSupport/d' /usr/include/qcustomplot.h && \ cp -va libqcustomplot* $LIBDIR && cd /opt && rm -Rf qcustomplot-source RUN git clone -b $KDDOCKWIDGETS_VERSION https://github.com/KDAB/KDDockWidgets && \ cd KDDockWidgets && mkdir build && cd build && \ cmake -DCMAKE_BUILD_TYPE=Debug -DKDDockWidgets_QT6=ON -DCMAKE_INSTALL_PREFIX=/usr/ \ -DKDDockWidgets_EXAMPLES=OFF -DKDDockWidgets_FRONTENDS="qtwidgets" -G Ninja .. && \ cmake --build . --target install && cd /opt && rm -Rf KDDockWidgets KDAB-hotspot-41e5de7/scripts/compile-test/BuildHotspotWithPresets000066400000000000000000000002331515036260400251720ustar00rootroot00000000000000ARG BASEIMAGE FROM $BASEIMAGE WORKDIR /opt ADD . /opt/hotspot/ RUN cd hotspot && \ cmake --preset dev-asan && \ cmake --build --preset dev-asan KDAB-hotspot-41e5de7/scripts/compile-test/BuildHotspotWithPresetsQt6000066400000000000000000000002431515036260400255660ustar00rootroot00000000000000ARG BASEIMAGE FROM $BASEIMAGE WORKDIR /opt ADD . /opt/hotspot/ RUN cd hotspot && \ cmake --preset dev-asan-qt6 && \ cmake --build --preset dev-asan-qt6 KDAB-hotspot-41e5de7/scripts/compile-test/BuildHotspotWithoutPresets000066400000000000000000000005471515036260400257320ustar00rootroot00000000000000ARG BASEIMAGE FROM $BASEIMAGE WORKDIR /opt ADD . /opt/hotspot/ RUN cd hotspot && \ cmake -S . -B build -G Ninja \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=/usr/ \ -DCMAKE_CXX_FLAGS_DEBUG="-g -fsanitize=address,undefined" \ -DCMAKE_C_FLAGS_DEBUG="-g -fsanitize=address,undefined" .. && \ cmake --build build KDAB-hotspot-41e5de7/scripts/compile-test/build.sh000077500000000000000000000036661515036260400221000ustar00rootroot00000000000000#!/bin/bash set -e cd $(dirname $0)/../../ extraArgs=$@ toLower() { echo $1 | tr '[:upper:]' '[:lower:]' } buildBase() { distro=$1 tag=$(toLower $distro) docker build --ulimit nofile=1024:262144 -t hotspot-$tag-base \ -f scripts/compile-test/Base$distro $extraArgs . } buildDependencies() { distro=$1 kddw_version=$2 tag=$(toLower $distro) buildBase $distro suffix= if [[ $distro == *Qt6 ]]; then suffix=Qt6 fi libdir="/usr/lib" if [[ $distro == Neon* || $distro == Ubuntu* ]]; then libdir="/usr/lib/x86_64-linux-gnu/" fi docker build --ulimit nofile=1024:262144 -t hotspot-$tag-dependencies \ --build-arg BASEIMAGE=hotspot-$tag-base --build-arg KDDOCKWIDGETS_VERSION="$kddw_version" \ --build-arg LIBDIR="$libdir" \ -f scripts/compile-test/BuildDependencies$suffix $extraArgs . } buildHotspotWithPresets() { distro=$1 kddw_version=$2 tag=$(toLower $distro) suffix= if [[ $distro == *Qt6 ]]; then suffix=Qt6 fi buildDependencies $distro $kddw_version docker build --ulimit nofile=1024:262144 -t hotspot-$tag \ --build-arg BASEIMAGE=hotspot-$tag-dependencies \ -f scripts/compile-test/BuildHotspotWithPresets$suffix $extraArgs . } buildHotspotWithoutPresets() { distro=$1 kddw_version=$2 tag=$(toLower $distro) buildDependencies $distro $kddw_version docker build --ulimit nofile=1024:262144 -t hotspot-$tag \ --build-arg BASEIMAGE=hotspot-$tag-dependencies \ -f scripts/compile-test/BuildHotspotWithoutPresets $extraArgs . } export DOCKER_BUILDKIT=1 buildHotspotWithoutPresets Ubuntu20.04 1.6 buildHotspotWithPresets Ubuntu22.04 2.0 buildHotspotWithPresets ArchlinuxQt6 2.2 buildHotspotWithPresets ArchlinuxWithoutOptionalQt6 2.2 buildHotspotWithPresets OpenSuseTumbleweedQt6 2.2 buildHotspotWithPresets Fedora42Qt6 2.2 buildHotspotWithPresets NeonQt6 2.2 KDAB-hotspot-41e5de7/scripts/compile-test/debug.sh000077500000000000000000000002021515036260400220460ustar00rootroot00000000000000#!/bin/bash distro=$1 if [ -z "$distro" ]; then echo "missing distro arg" exit 1 fi docker run -it hotspot-$distro bash KDAB-hotspot-41e5de7/scripts/compile-test/push.sh000077500000000000000000000012031515036260400217410ustar00rootroot00000000000000#!/bin/sh set -e ghcr_user=$(pass show ghcr.io | grep 'login: ' | cut -d' ' -f 2) pass show ghcr.io | head -n1 | docker login ghcr.io -u $ghcr_user --password-stdin logout() { docker logout ghcr.io } trap logout EXIT pushDependencies() { tag=$1 docker tag hotspot-$tag-dependencies:latest ghcr.io/kdab/hotspot-$tag-dependencies:latest docker push ghcr.io/kdab/hotspot-$tag-dependencies:latest } pushDependencies ubuntu20.04 pushDependencies ubuntu22.04 pushDependencies archlinuxqt6 pushDependencies archlinuxwithoutoptionalqt6 pushDependencies opensusetumbleweedqt6 pushDependencies fedora42qt6 pushDependencies neonqt6 KDAB-hotspot-41e5de7/scripts/compile-test/test.sh000077500000000000000000000011331515036260400217430ustar00rootroot00000000000000#!/bin/bash set -e cd $(dirname $0)/../../ testWithoutPreset() { tag=$1 shift 1 docker run hotspot-$tag bash -c "cd hotspot/build/ && ctest --output-on-failure -j \$(nproc) $@" } testWithPreset() { tag=$1 shift 1 suffix= if [[ $tag == *qt6 ]]; then suffix=-qt6 fi docker run hotspot-$tag bash -c "cd hotspot && ctest --preset dev-asan$suffix -j \$(nproc) $@" } testWithoutPreset ubuntu20.04 "-E tst_perfdata" testWithPreset ubuntu22.04 testWithPreset archlinuxqt6 testWithPreset opensusetumbleweedqt6 testWithPreset fedora42qt6 testWithPreset neonqt6 KDAB-hotspot-41e5de7/scripts/create_tarballs.sh000077500000000000000000000032211515036260400215060ustar00rootroot00000000000000#!/bin/bash # # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # # SPDX-License-Identifier: GPL-2.0-or-later # version="$1" output_dir="$2" set -e if [ -z "$version" -o -z "$output_dir" ]; then echo "create_tarballs.sh VERSION OUTPUT_DIR" echo echo "e.g.: create_tarballs.sh v1.1.0 /tmp" exit 1 fi set -x cd $output_dir git clone --branch $version --recurse-submodules \ git@github.com:KDAB/hotspot.git \ "hotspot-$version" tar --exclude="*/.git/*" --exclude="*/.git" -cvzf "hotspot-$version.tar.gz" "hotspot-$version" tar --exclude="*/.git/*" --exclude="*/.git" -cvzf "hotspot-perfparser-$version.tar.gz" "hotspot-$version/3rdparty/perfparser" tar --exclude="*/.git/*" --exclude="*/.git" -cvzf "hotspot-PrefixTickLabels-$version.tar.gz" "hotspot-$version/3rdparty/PrefixTickLabels" zip -r --exclude="*/.git/*" --exclude="*/.git" "hotspot-$version.zip" "hotspot-$version" zip -r --exclude="*/.git/*" --exclude="*/.git" "hotspot-perfparser-$version.zip" "hotspot-$version/3rdparty/perfparser" zip -r --exclude="*/.git/*" --exclude="*/.git" "hotspot-PrefixTickLabels-$version.zip" "hotspot-$version/3rdparty/PrefixTickLabels" md5sum "hotspot-$version.tar.gz" "hotspot-$version.zip" "hotspot-perfparser-$version.tar.gz" "hotspot-perfparser-$version.zip" "hotspot-PrefixTickLabels-$version.tar.gz" "hotspot-PrefixTickLabels-$version.zip" sha1sum "hotspot-$version.tar.gz" "hotspot-$version.zip" "hotspot-perfparser-$version.tar.gz" "hotspot-perfparser-$version.zip" "hotspot-PrefixTickLabels-$version.tar.gz" "hotspot-PrefixTickLabels-$version.zip" KDAB-hotspot-41e5de7/scripts/run_clang_tidy.sh000077500000000000000000000012331515036260400213610ustar00rootroot00000000000000#!/bin/sh set -e if [ ! -d "$1" ]; then echo "usage: run_clang_tidy.sh " exit 1 fi build_dir=$(readlink -f "$1") cd $(dirname $0)/.. rm -Rf scripts/fixits mkdir -p scripts/fixits run-clang-tidy -quiet -extra-arg="-Wno-gnu-zero-variadic-macro-arguments" \ -j $(nproc) -config-file .clang-tidy -export-fixes scripts/fixits/fixits.yaml \ -use-color -p "$build_dir" "$PWD/src" if [ -s "scripts/fixits/fixits.yaml" ]; then echo "splitting fixits" ./scripts/split-clang-tidy-fixits.py scripts/fixits/fixits.yaml echo "fixits with auto replacements:" grep -l Replacements:$ scripts/fixits/*/fixits.yaml | xargs dirname fi KDAB-hotspot-41e5de7/scripts/split-clang-tidy-fixits.py000077500000000000000000000035101515036260400230660ustar00rootroot00000000000000#!/bin/env python3 # SPDX-FileCopyrightText: Milian Wolff # SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com # SPDX-License-Identifier: GPL-2.0-or-later import os import sys import yaml def fileOffsetToLine(message): ''' to ease manual inspection, translate FileOffset to a FileLine ''' if message['FilePath'] == "": return with open(message['FilePath'], 'r', encoding='utf-8') as sourceFile: numNewlines = sourceFile.read(message['FileOffset']).count('\n') message['FileLine'] = numNewlines + 1 inputFile = sys.argv[1] groupedFixits = {} with open(inputFile, 'r', encoding='utf-8') as mainFixitsFile: mainFixits = yaml.safe_load(mainFixitsFile) if not mainFixits: print("no diagnostics found") sys.exit(0) for fixit in mainFixits['Diagnostics']: fileOffsetToLine(fixit['DiagnosticMessage']) for note in fixit.get('Notes', []): fileOffsetToLine(note) diagnostic = fixit['DiagnosticName'] group = groupedFixits.get(diagnostic) if not group: groupedFixits[diagnostic] = [fixit] else: group.append(fixit) baseDir = os.path.dirname(inputFile) for diagnostic, fixits in groupedFixits.items(): diagnosticDir = f"{baseDir}/{diagnostic}" if not os.path.isdir(diagnosticDir): os.mkdir(diagnosticDir) with open(f"{diagnosticDir}/fixits.yaml", 'w', encoding='utf-8') as fixitsFile: text = yaml.dump({'Diagnostics': fixits, 'MainSourceFile': ''}) # sadly clang-apply-replacements doesn't like our additional FileLine # and we cannot add comments directly with pyaml # so instead we do this manually here text = text.replace('FileLine:', '# FileLine:') fixitsFile.write(text) KDAB-hotspot-41e5de7/src/000077500000000000000000000000001515036260400151225ustar00rootroot00000000000000KDAB-hotspot-41e5de7/src/CMakeLists.txt000066400000000000000000000072721515036260400176720ustar00rootroot00000000000000# enable more pedantic compiler warnings include(ECMInstallIcons) include(ECMAddAppIcon) include(KDEFrameworkCompilerSettings) # but allow signal/slot keywords remove_definitions(-DQT_NO_SIGNALS_SLOTS_KEYWORDS) include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(models) ecm_install_icons( ICONS ${CMAKE_CURRENT_SOURCE_DIR}/images/icons/16-apps-hotspot.png ${CMAKE_CURRENT_SOURCE_DIR}/images/icons/22-apps-hotspot.png ${CMAKE_CURRENT_SOURCE_DIR}/images/icons/32-apps-hotspot.png ${CMAKE_CURRENT_SOURCE_DIR}/images/icons/48-apps-hotspot.png ${CMAKE_CURRENT_SOURCE_DIR}/images/icons/64-apps-hotspot.png ${CMAKE_CURRENT_SOURCE_DIR}/images/icons/128-apps-hotspot.png DESTINATION ${KDE_INSTALL_ICONDIR} THEME hicolor ) set(HOTSPOT_SRCS main.cpp parsers/perf/perfparser.cpp perfrecord.cpp mainwindow.cpp flamegraph.cpp aboutdialog.cpp startpage.cpp recordpage.cpp resultspage.cpp resultssummarypage.cpp resultstopdownpage.cpp resultsbottomuppage.cpp resultsflamegraphpage.cpp resultscallercalleepage.cpp resultsbyfilepage.cpp resultsdisassemblypage.cpp resultsutil.cpp costheaderview.cpp timelinewidget.cpp dockwidgetsetup.cpp settingsdialog.cpp multiconfigwidget.cpp perfoutputwidget.cpp perfoutputwidgettext.cpp perfoutputwidgetkonsole.cpp costcontextmenu.cpp initiallystoppedprocess.cpp perfcontrolfifowrapper.cpp errnoutil.cpp recordhost.cpp copyabletreeview.cpp # ui files: mainwindow.ui aboutdialog.ui startpage.ui recordpage.ui resultspage.ui resultssummarypage.ui resultstopdownpage.ui resultsbottomuppage.ui resultsflamegraphpage.ui resultscallercalleepage.ui resultsbyfilepage.ui resultsdisassemblypage.ui timelinewidget.ui unwindsettingspage.ui flamegraphsettingspage.ui debuginfodpage.ui callgraphwidget.ui callgraphsettingspage.ui frequencypage.ui disassemblysettingspage.ui perfsettingspage.ui # resources: resources.qrc ) if(KGraphViewerPart_FOUND) set(HOTSPOT_SRCS ${HOTSPOT_SRCS} callgraphwidget.cpp callgraphgenerator.cpp) endif() ecm_add_app_icon(HOTSPOT_SRCS ICONS ${CMAKE_CURRENT_SOURCE_DIR}/images/icons/128-apps-hotspot.png) if(QCustomPlot_FOUND) set(HOTSPOT_SRCS ${HOTSPOT_SRCS} frequencypage.cpp) endif() add_executable( hotspot ${HOTSPOT_SRCS} ) target_link_libraries( hotspot Qt::Widgets Qt::Svg KF${QT_MAJOR_VERSION}::ThreadWeaver KF${QT_MAJOR_VERSION}::ConfigWidgets KF${QT_MAJOR_VERSION}::CoreAddons KF${QT_MAJOR_VERSION}::ItemViews KF${QT_MAJOR_VERSION}::ItemModels KF${QT_MAJOR_VERSION}::KIOCore KF${QT_MAJOR_VERSION}::KIOFileWidgets KF${QT_MAJOR_VERSION}::KIOWidgets KF${QT_MAJOR_VERSION}::Solid KF${QT_MAJOR_VERSION}::WindowSystem KF${QT_MAJOR_VERSION}::Notifications KF${QT_MAJOR_VERSION}::IconThemes KF${QT_MAJOR_VERSION}::Parts KF${QT_MAJOR_VERSION}::I18n models PrefixTickLabels KDAB::kddockwidgets ) if(KFArchive_FOUND) target_link_libraries(hotspot KF${QT_MAJOR_VERSION}::Archive) endif() if(QCustomPlot_FOUND) target_link_libraries(hotspot QCustomPlot::QCustomPlot) endif() if(KGraphViewerPart_FOUND) target_link_libraries(hotspot KGraphViewerPart) endif() set_target_properties(hotspot PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}") install( TARGETS hotspot RUNTIME DESTINATION ${KDE_INSTALL_BINDIR} ) if(NOT KDE_INSTALL_KNOTIFYRCDIR) set(KDE_INSTALL_KNOTIFYRCDIR ${KDE_INSTALL_KNOTIFY5RCDIR}) endif() install( FILES hotspot.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR} ) KDAB-hotspot-41e5de7/src/aboutdialog.cpp000066400000000000000000000022531515036260400201220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Volker Krause SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "aboutdialog.h" #include "ui_aboutdialog.h" AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent) , ui(std::make_unique()) { ui->setupUi(this); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close); } AboutDialog::~AboutDialog() = default; void AboutDialog::setTitle(const QString& title) { ui->titleLabel->setText(title); } void AboutDialog::setText(const QString& text) { ui->textLabel->setText(text); } void AboutDialog::setLogo(const QString& iconFileName) { QPixmap pixmap(iconFileName); pixmap.setDevicePixelRatio(devicePixelRatioF()); const auto maxWidth = 100 * devicePixelRatioF(); // scale down pixmap (while keeping aspect ratio) if required if (pixmap.width() > maxWidth) { pixmap = pixmap.scaledToWidth(maxWidth, Qt::SmoothTransformation); } ui->logoLabel->setPixmap(pixmap); } KDAB-hotspot-41e5de7/src/aboutdialog.h000066400000000000000000000012611515036260400175650ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Volker Krause SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include namespace Ui { class AboutDialog; } class AboutDialog : public QDialog { Q_OBJECT public: explicit AboutDialog(QWidget* parent = nullptr); ~AboutDialog(); void setTitle(const QString& title); void setText(const QString& text); void setLogo(const QString& iconFileName); private: std::unique_ptr ui; }; KDAB-hotspot-41e5de7/src/aboutdialog.ui000066400000000000000000000036401515036260400177560ustar00rootroot00000000000000 AboutDialog 0 0 96 102 75 true 0 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true true Qt::TextBrowserInteraction Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 10 QDialogButtonBox::Close KDAB-hotspot-41e5de7/src/callgraphgenerator.cpp000066400000000000000000000070421515036260400214750ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "callgraphgenerator.h" #include #include #include QHash writeGraph(QTextStream& stream, const Data::Symbol& symbol, const Data::CallerCalleeResults& results, float thresholdPercent, const QString& fontColor) { auto settings = Settings::instance(); const auto parentId = QUuid::createUuid().toString(QUuid::Id128); const auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont); stream << "digraph callgraph {\n"; stream << "node [shape=box, fontname=\"" << font.family() << "\", fontsize=\"" << font.pointSize() << "pt\", fontcolor=\"" << fontColor << "\", style=filled, color=\"" << settings->callgraphColor().name() << "\"]\n"; stream << "node" << parentId << " [label=\""; if (symbol.prettySymbol.isEmpty()) { stream << "??"; } else { stream << symbol.prettySymbol.toHtmlEscaped(); } stream << "\", color=\"" << settings->callgraphActiveColor().name() << "\"]\n"; QHash symbolToIdLookup; symbolToIdLookup.insert(symbol, parentId); resultsToDot(settings->callgraphParentDepth(), Direction::Caller, symbol, results, parentId, stream, symbolToIdLookup, thresholdPercent); resultsToDot(settings->callgraphChildDepth(), Direction::Callee, symbol, results, parentId, stream, symbolToIdLookup, thresholdPercent); stream << "}\n"; return symbolToIdLookup; } void resultsToDot(int height, Direction direction, const Data::Symbol& symbol, const Data::CallerCalleeResults& results, const QString& parent, QTextStream& stream, QHash& nodeIdLookup, float thresholdPercent) { if (height == 0) { return; } if (symbol.prettySymbol.isEmpty()) return; if (results.selfCosts.numTypes() == 0) { return; } const auto entry = results.entries[symbol]; auto addNode = [&stream](const QString& id, const QString& label) { stream << "node" << id << " [label=\"" << label.toHtmlEscaped() << "\"]\n"; }; auto connectNodes = [&stream, direction](const QString& parent, const QString& child) { if (direction == Direction::Callee) { stream << "node" << parent << " -> node" << child << "\n"; } else { stream << "node" << child << " -> node" << parent << "\n"; } }; const auto totalCost = results.selfCosts.totalCost(0); auto map = direction == Direction::Callee ? entry.callees : entry.callers; for (auto it = map.begin(); it != map.end(); it++) { const auto cost = it.value()[0]; if (static_cast(cost) / totalCost < thresholdPercent) { continue; } auto& key = it.key(); auto idIt = nodeIdLookup.find(key); if (idIt == nodeIdLookup.end()) { idIt = nodeIdLookup.insert(key, QUuid::createUuid().toString(QUuid::Id128)); addNode(idIt.value(), key.prettySymbol.isEmpty() ? QStringLiteral("??") : key.prettySymbol); } const auto nodeId = idIt.value(); connectNodes(parent, nodeId); resultsToDot(height - 1, direction, key, results, nodeId, stream, nodeIdLookup, thresholdPercent); } } KDAB-hotspot-41e5de7/src/callgraphgenerator.h000066400000000000000000000016131515036260400211400ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "data.h" #include "models/callercalleemodel.h" class QTextStream; class QModelIndex; enum class Direction { Caller, Callee }; QHash writeGraph(QTextStream& stream, const Data::Symbol& symbol, const Data::CallerCalleeResults& results, float thresholdPercent, const QString& fontColor); void resultsToDot(int height, Direction direction, const Data::Symbol& symbol, const Data::CallerCalleeResults& results, const QString& parent, QTextStream& stream, QHash& nodeIdLookup, float thresholdPercent); KDAB-hotspot-41e5de7/src/callgraphsettingspage.ui000066400000000000000000000040431515036260400220350ustar00rootroot00000000000000 CallgraphSettingsPage 0 0 400 300 Form Parent function backtrace Child function backtrace 1 3 1 2 Function color Current function color KColorButton QPushButton
    kcolorbutton.h
    KDAB-hotspot-41e5de7/src/callgraphwidget.cpp000066400000000000000000000114571515036260400207770ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "callgraphwidget.h" #include #include #include #include #include #include #include #include #include #include "callgraphgenerator.h" #include "settings.h" #include "ui_callgraphwidget.h" #include "util.h" #include CallgraphWidget::CallgraphWidget(Data::CallerCalleeResults results, KParts::ReadOnlyPart* view, KGraphViewer::KGraphViewerInterface* interface, QWidget* parent) : QWidget(parent) , ui(new Ui::CallgraphWidget) , m_graphFile(new QTemporaryFile(this)) , m_graphview(view) , m_interface(interface) , m_callerCalleeResults(std::move(results)) { ui->setupUi(this); connect(ui->costThreshold, qOverload(&QDoubleSpinBox::valueChanged), this, [this](double threshold) { m_thresholdPercent = threshold / 100.f; // convert to percent generateCallgraph(m_currentSymbol); }); auto oldWidget = layout()->replaceWidget(ui->graphPlaceholder, view->widget()); delete oldWidget; updateColors(); m_interface->setLayoutMethod(KGraphViewer::KGraphViewerInterface::LayoutMethod::InternalLibrary); connect(m_graphview, SIGNAL(hoverEnter(QString)), // clazy:exclude=old-style-connect this, SLOT(hoverEnter(QString))); connect(m_graphview, SIGNAL(hoverLeave(QString)), // clazy:exclude=old-style-connect this, SLOT(hoverLeave(QString))); // used to find mouseclicks in the kgraphviewer part qApp->installEventFilter(this); m_graphFile->open(); connect(Settings::instance(), &Settings::callgraphChanged, this, [this] { generateCallgraph(m_currentSymbol); }); } CallgraphWidget::~CallgraphWidget() = default; CallgraphWidget* CallgraphWidget::createCallgraphWidget(const Data::CallerCalleeResults& results, QWidget* parent) { auto part = Util::createPart(QStringLiteral("kgraphviewerpart")); if (!part) { return nullptr; } auto interface = qobject_cast(part); if (!interface) { return nullptr; } return new CallgraphWidget(results, part, interface, parent); } void CallgraphWidget::selectSymbol(const Data::Symbol& symbol) { if (symbol == m_currentSymbol) { return; } generateCallgraph(symbol); } void CallgraphWidget::setResults(const Data::CallerCalleeResults& results) { m_callerCalleeResults = results; selectSymbol(m_currentSymbol); } void CallgraphWidget::hoverEnter(const QString& node) { // cut of the node prefix m_currentNode = node.mid(4); } void CallgraphWidget::hoverLeave(const QString& node) { Q_UNUSED(node); m_currentNode = QString(); } bool CallgraphWidget::eventFilter(QObject* watched, QEvent* event) { Q_UNUSED(watched); if (!isVisible()) return false; if (event->type() == QEvent::MouseButtonPress) { const auto e = static_cast(event); if (m_graphview->widget()->geometry().contains(e->pos())) { if (e->button() == Qt::MouseButton::LeftButton && !m_currentNode.isEmpty()) { const auto symbol = m_symbolToId.key(m_currentNode); if (symbol.isValid()) { emit clickedOn(symbol); m_currentNode.clear(); return true; } } } } return false; } void CallgraphWidget::changeEvent(QEvent* event) { QWidget::changeEvent(event); if (event->type() == QEvent::PaletteChange) { updateColors(); } } void CallgraphWidget::showEvent(QShowEvent* event) { Q_UNUSED(event); if (!m_graphview) { return; } m_graphview->openUrl(QUrl::fromLocalFile(m_graphFile->fileName())); } void CallgraphWidget::generateCallgraph(const Data::Symbol& symbol) { if (!m_graphview) { return; } m_graphview->closeUrl(); m_graphFile->resize(0); m_currentSymbol = symbol; QTextStream stream(m_graphFile); m_symbolToId = writeGraph(stream, symbol, m_callerCalleeResults, m_thresholdPercent, m_fontColor); stream.flush(); // if openUrl is called before the window is open it will freeze the application if (isVisible()) { m_graphview->openUrl(QUrl::fromLocalFile(m_graphFile->fileName())); } } void CallgraphWidget::updateColors() { const auto scheme = KColorScheme(palette().currentColorGroup()); m_interface->setBackgroundColor(scheme.background(KColorScheme::NormalBackground).color()); m_fontColor = scheme.foreground().color().name(); } KDAB-hotspot-41e5de7/src/callgraphwidget.h000066400000000000000000000035501515036260400204370ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "data.h" namespace KParts { class ReadOnlyPart; } namespace KGraphViewer { class KGraphViewerInterface; } class QTemporaryFile; class QTextStream; class CallerModel; class CalleeModel; namespace Ui { class CallgraphWidget; } class CallgraphWidget : public QWidget { Q_OBJECT public: ~CallgraphWidget(); static CallgraphWidget* createCallgraphWidget(const Data::CallerCalleeResults& results, QWidget* parent = nullptr); void selectSymbol(const Data::Symbol& symbol); signals: void clickedOn(const Data::Symbol& symbol); public slots: void setResults(const Data::CallerCalleeResults& results); protected: bool eventFilter(QObject* watched, QEvent* event) override; void changeEvent(QEvent* event) override; void showEvent(QShowEvent* event) override; private slots: void hoverEnter(const QString& node); void hoverLeave(const QString& node); private: CallgraphWidget(Data::CallerCalleeResults results, KParts::ReadOnlyPart* view, KGraphViewer::KGraphViewerInterface* interface, QWidget* parent = nullptr); void generateCallgraph(const Data::Symbol& symbol); void updateColors(); std::unique_ptr ui; double m_thresholdPercent = 0.1 / 100.f; QTemporaryFile* m_graphFile = nullptr; KParts::ReadOnlyPart* m_graphview = nullptr; KGraphViewer::KGraphViewerInterface* m_interface = nullptr; Data::CallerCalleeResults m_callerCalleeResults; QHash m_symbolToId; Data::Symbol m_currentSymbol; QString m_currentNode; QString m_fontColor; bool m_callgraphShown = false; }; KDAB-hotspot-41e5de7/src/callgraphwidget.ui000066400000000000000000000023571515036260400206310ustar00rootroot00000000000000 CallgraphWidget 0 0 400 300 Form 0 0 0 0 Cost Threshold: % 0.100000000000000 0.100000000000000 KDAB-hotspot-41e5de7/src/copyabletreeview.cpp000066400000000000000000000036421515036260400212040ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "copyabletreeview.h" #include #include #include #include CopyableTreeView::CopyableTreeView(QWidget* parent) : QTreeView(parent) { } CopyableTreeView::~CopyableTreeView() = default; void CopyableTreeView::keyPressEvent(QKeyEvent* event) { if (event->matches(QKeySequence::Copy)) { QString text; const auto indexes = selectionModel()->selectedIndexes(); int row = indexes.isEmpty() ? 0 : indexes.first().row(); for (const auto& index : indexes) { const auto content = index.data().toString(); // if both indexes are in the same row -> " " else add newline if (index == indexes.first()) { text = content; } else if (row != index.row()) { text += QLatin1Char('\n') + content; row = index.row(); } else { text += QLatin1Char(' ') + content; } } QGuiApplication::clipboard()->setText(text); } else { QTreeView::keyPressEvent(event); } } void CopyableTreeView::drawRow(QPainter* painter, const QStyleOptionViewItem& options, const QModelIndex& index) const { if (mDrawColumnSpanDelegate) { auto span = index.model()->span(index); if (span.width() > 1) { const auto& background = (alternatingRowColors() && (index.row() % 2) == 1) ? options.palette.alternateBase() : options.palette.base(); painter->fillRect(options.rect, background); mDrawColumnSpanDelegate->paint(painter, options, index); return; } } QTreeView::drawRow(painter, options, index); } KDAB-hotspot-41e5de7/src/copyabletreeview.h000066400000000000000000000014221515036260400206430ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include class CopyableTreeView : public QTreeView { Q_OBJECT public: explicit CopyableTreeView(QWidget* parent = nullptr); ~CopyableTreeView() override; void setDrawColumnSpanDelegate(QAbstractItemDelegate* delegate) { mDrawColumnSpanDelegate = delegate; } protected: void keyPressEvent(QKeyEvent* event) override; void drawRow(QPainter* painter, const QStyleOptionViewItem& options, const QModelIndex& index) const override; private: QAbstractItemDelegate* mDrawColumnSpanDelegate = nullptr; }; KDAB-hotspot-41e5de7/src/costcontextmenu.cpp000066400000000000000000000027361515036260400211000ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "costcontextmenu.h" #include #include #include CostContextMenu::CostContextMenu(QObject* parent) : QObject(parent) { } CostContextMenu::~CostContextMenu() = default; void CostContextMenu::addToMenu(QHeaderView* view, QMenu* menu) { for (int i = 1; i < view->count(); ++i) { const auto name = view->model()->headerData(i, Qt::Horizontal).toString(); auto* action = menu->addAction(name); action->setCheckable(true); action->setChecked(!view->isSectionHidden(i)); connect(action, &QAction::toggled, this, [this, view, name, i](bool visible) { view->setSectionHidden(i, !visible); if (visible) { m_hiddenColumns.remove(name); } else { m_hiddenColumns.insert(name); } emit hiddenColumnsChanged(); }); } } void CostContextMenu::hideColumns(QTreeView* view) { const auto* model = view->model(); for (int i = 1, size = model->columnCount(); i < size; i++) { const auto name = model->headerData(i, Qt::Orientation::Horizontal).toString(); view->setColumnHidden(i, m_hiddenColumns.contains(name)); } } KDAB-hotspot-41e5de7/src/costcontextmenu.h000066400000000000000000000013021515036260400205310ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class QTreeView; class QHeaderView; class QMenu; class CostContextMenu : public QObject { Q_OBJECT public: explicit CostContextMenu(QObject* parent = nullptr); ~CostContextMenu(); void addToMenu(QHeaderView* view, QMenu* menu); void hideColumns(QTreeView* view); signals: void hiddenColumnsChanged(); private: QSet m_hiddenColumns; }; KDAB-hotspot-41e5de7/src/costheaderview.cpp000066400000000000000000000066341515036260400206530ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "costheaderview.h" #include #include #include #include #include #include "costcontextmenu.h" CostHeaderView::CostHeaderView(CostContextMenu* contextMenu, QWidget* parent) : QHeaderView(Qt::Horizontal, parent) { #if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) setSectionsMovable(true); setFirstSectionMovable(false); #endif setDefaultSectionSize(150); setStretchLastSection(false); connect(this, &QHeaderView::sectionCountChanged, this, [this]() { resizeColumns(false); }); connect(this, &QHeaderView::sectionResized, this, [this](int index, int oldSize, int newSize) { if (m_isResizing || !m_autoResize) return; const auto guard = QScopedValueRollback(m_isResizing, true); if (index != 0) { // give/take space from first column resizeSection(0, sectionSize(0) - (newSize - oldSize)); } else { // distribute space across all columns // use actual width as oldSize/newSize isn't reliable here const auto numSections = count(); int usedWidth = 0; for (int i = 0; i < numSections; ++i) usedWidth += sectionSize(i); const auto diff = usedWidth - width(); const auto numVisibleSections = numSections - hiddenSectionCount(); if (numVisibleSections == 0) return; const auto diffPerSection = diff / numVisibleSections; const auto extraDiff = diff % numVisibleSections; for (int i = 1; i < numSections; ++i) { if (isSectionHidden(i)) { continue; } auto newSize = sectionSize(i) - diffPerSection; if (i == numSections - 1) newSize -= extraDiff; resizeSection(i, newSize); } } }); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &QHeaderView::customContextMenuRequested, this, [this, contextMenu](QPoint pos) { const auto numSections = count(); QMenu menu; auto resetSizes = menu.addAction(tr("Reset Column Sizes")); connect(resetSizes, &QAction::triggered, this, [this]() { resizeColumns(true); }); if (numSections > 1) { auto* subMenu = menu.addMenu(tr("Visible Columns")); contextMenu->addToMenu(this, subMenu); } menu.exec(mapToGlobal(pos)); }); } CostHeaderView::~CostHeaderView() = default; void CostHeaderView::resizeEvent(QResizeEvent* event) { QHeaderView::resizeEvent(event); if (m_autoResize) resizeColumns(false); } void CostHeaderView::resizeColumns(bool reset) { const auto guard = QScopedValueRollback(m_isResizing, true); auto availableWidth = width(); const auto defaultSize = defaultSectionSize(); for (int i = count() - 1; i >= 0; --i) { if (i == 0) { resizeSection(0, availableWidth); } else { if (reset) { resizeSection(i, defaultSize); } if (!isSectionHidden(i)) { availableWidth -= sectionSize(i); } } } } KDAB-hotspot-41e5de7/src/costheaderview.h000066400000000000000000000013021515036260400203030ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include class CostContextMenu; class CostHeaderView : public QHeaderView { Q_OBJECT public: explicit CostHeaderView(CostContextMenu* contextMenu, QWidget* parent = nullptr); ~CostHeaderView(); void setAutoResize(bool autoResize) { m_autoResize = autoResize; } private: void resizeEvent(QResizeEvent* event) override; void resizeColumns(bool reset); bool m_isResizing = false; bool m_autoResize = true; }; KDAB-hotspot-41e5de7/src/debuginfodpage.ui000066400000000000000000000016001515036260400204210ustar00rootroot00000000000000 DebuginfodPage 0 0 491 236 Form debuginfod Urls: KEditListWidget QWidget
    keditlistwidget.h
    KDAB-hotspot-41e5de7/src/default-dockwidget-layout.json000066400000000000000000000245261515036260400231070ustar00rootroot00000000000000{ "allDockWidgets": [ { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": -1, "wasFloating": false }, "uniqueName": "summary" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": -1, "wasFloating": false }, "uniqueName": "bottomUp" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": -1, "wasFloating": false }, "uniqueName": "topDown" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": -1, "wasFloating": false }, "uniqueName": "flameGraph" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": -1, "wasFloating": false }, "uniqueName": "callerCallee" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": -1, "wasFloating": false }, "uniqueName": "byFile" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": 5, "wasFloating": false }, "uniqueName": "disassembly" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 0, "mainWindowUniqueName": "results" } ], "tabIndex": 5, "wasFloating": false }, "uniqueName": "frequency" }, { "lastPosition": { "lastFloatingGeometry": { "height": 0, "width": 0, "x": 0, "y": 0 }, "placeholders": [ { "isFloatingWindow": false, "itemIndex": 1, "mainWindowUniqueName": "results" } ], "tabIndex": -1, "wasFloating": false }, "uniqueName": "timeLine" } ], "closedDockWidgets": [ "disassembly" ], "floatingWindows": [ ], "mainWindows": [ { "affinities": [ ], "geometry": { "height": 769, "width": 1123, "x": 1357, "y": 367 }, "isVisible": true, "multiSplitterLayout": { "frames": { "2": { "currentTabIndex": 0, "dockWidgets": [ "summary", "bottomUp", "topDown", "flameGraph", "callerCallee", "byFile", "frequency" ], "geometry": { "height": 489, "width": 1121, "x": 0, "y": 0 }, "id": "2", "isNull": false, "objectName": "summary", "options": 0 }, "3": { "currentTabIndex": 0, "dockWidgets": [ "timeLine" ], "geometry": { "height": 239, "width": 1121, "x": 0, "y": 494 }, "id": "3", "isNull": false, "objectName": "timeLine", "options": 0 } }, "layout": { "children": [ { "guestId": "2", "isContainer": false, "isVisible": true, "objectName": "summary", "sizingInfo": { "geometry": { "height": 489, "width": 1121, "x": 0, "y": 0 }, "maxSize": { "height": 524326, "width": 524295 }, "minSize": { "height": 257, "width": 807 } } }, { "guestId": "3", "isContainer": false, "isVisible": true, "objectName": "timeLine", "sizingInfo": { "geometry": { "height": 239, "width": 1121, "x": 0, "y": 494 }, "maxSize": { "height": 524325, "width": 524295 }, "minSize": { "height": 238, "width": 311 } } } ], "isContainer": true, "isVisible": false, "objectName": "", "orientation": 2, "sizingInfo": { "geometry": { "height": 733, "width": 1121, "x": 0, "y": 0 }, "maxSize": { "height": 16777215, "width": 16777215 }, "minSize": { "height": 90, "width": 80 } } } }, "options": 0, "screenIndex": 0, "screenSize": { "height": 1440, "width": 2560 }, "uniqueName": "results" } ], "screenInfo": [ { "devicePixelRatio": 1.5, "geometry": { "height": 1440, "width": 2560, "x": 0, "y": 0 }, "index": 0, "name": "DP-1" } ], "serializationVersion": 3 } KDAB-hotspot-41e5de7/src/disassemblysettingspage.ui000066400000000000000000000074301515036260400224220ustar00rootroot00000000000000 DisassemblySettingsPage 0 0 600 240 Form 0 0 0 0 0 0 Source Code Search Paths: KEditListWidget::Button::All Show branches: showBranches Show hexdump: showHexdump Tab width: tabWidth <qt>The <tt>objdump</tt> binary that will be used for the disassembly view. Leave empty to let it be auto-detected.</qt> Objdump: lineEditObjdump <qt>The <tt>objdump</tt> binary that will be used for the disassembly view. Leave empty to let it be auto-detected.</qt> auto-detect KUrlRequester QWidget
    kurlrequester.h
    KEditListWidget QWidget
    keditlistwidget.h
    lineEditObjdump showBranches showHexdump tabWidth
    KDAB-hotspot-41e5de7/src/dockwidgets.h000066400000000000000000000016771515036260400176150ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) namespace KDDockWidgets { class DockWidgetBase; class DockWidget; class MainWindow; } using DockWidget = KDDockWidgets::DockWidget; using DockMainWindow = KDDockWidgets::MainWindow; using CoreDockWidget = KDDockWidgets::DockWidgetBase; #else namespace KDDockWidgets { namespace QtWidgets { class DockWidget; class MainWindow; } namespace Core { class DockWidget; } } using DockWidget = KDDockWidgets::QtWidgets::DockWidget; using CoreDockWidget = KDDockWidgets::Core::DockWidget; using DockMainWindow = KDDockWidgets::QtWidgets::MainWindow; #endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) KDAB-hotspot-41e5de7/src/dockwidgetsetup.cpp000066400000000000000000000042561515036260400210420ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "dockwidgetsetup.h" #include #include #if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) #include #include #else #include #include #endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) namespace { class DockingArea : public DockMainWindow { Q_OBJECT public: using DockMainWindow::MainWindow; protected: QMargins centerWidgetMargins() const override { return {}; } bool eventFilter(QObject* object, QEvent* event) override { if (object == centralWidget() && event->type() == QEvent::Paint) { // don't paint the line in the central widget of KDDockWidgets // TODO: fix this somehow via proper API upstream return true; } return QObject::eventFilter(object, event); } }; } void setupDockWidgets() { constexpr auto flags = KDDockWidgets::Config::Flag_HideTitleBarWhenTabsVisible | KDDockWidgets::Config::Flag_TabsHaveCloseButton; #if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) KDDockWidgets::Config::self().setFlags(flags); KDDockWidgets::DefaultWidgetFactory::s_dropIndicatorType = KDDockWidgets::DropIndicatorType::Segmented; #else KDDockWidgets::initFrontend(KDDockWidgets::FrontendType::QtWidgets); KDDockWidgets::Config::self().setFlags(flags); KDDockWidgets::Core::ViewFactory::s_dropIndicatorType = KDDockWidgets::DropIndicatorType::Segmented; #endif } DockMainWindow* createDockingArea(const QString& id, QWidget* parent) { auto ret = new DockingArea(id, KDDockWidgets::MainWindowOption_None, parent); // let it behave like a normal nested widget ret->setWindowFlag(Qt::Window, false); ret->centralWidget()->installEventFilter(ret); return ret; } #include "dockwidgetsetup.moc" KDAB-hotspot-41e5de7/src/dockwidgetsetup.h000066400000000000000000000006021515036260400204760ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "dockwidgets.h" class QWidget; class QString; void setupDockWidgets(); DockMainWindow* createDockingArea(const QString& id, QWidget* parent); KDAB-hotspot-41e5de7/src/errnoutil.cpp000066400000000000000000000006501515036260400176520ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "errnoutil.h" #include #include QDebug operator<<(QDebug out, Util::PrintableErrno error) { return out << std::system_category().message(error.errorCode).c_str(); } KDAB-hotspot-41e5de7/src/errnoutil.h000066400000000000000000000005721515036260400173220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once class QDebug; namespace Util { struct PrintableErrno { int errorCode = -1; }; } QDebug operator<<(QDebug out, Util::PrintableErrno error); KDAB-hotspot-41e5de7/src/flamegraph.cpp000066400000000000000000001262241515036260400177430ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "flamegraph.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "models/filterandzoomstack.h" #include "resultsutil.h" #include "settings.h" #include "util.h" namespace { enum SearchMatchType { NoSearch, NoMatch, DirectMatch, ChildMatch }; template class CustomWidgetAction : public QWidgetAction { public: explicit CustomWidgetAction(CreateInstance createInstance, QWidget* parent) : QWidgetAction(parent) , _createInstance(createInstance) { } QWidget* createWidget(QWidget* parent) override { auto widget = new QWidget(parent); auto layout = new QHBoxLayout(widget); layout->setContentsMargins(0, 0, 0, 0); _createInstance(widget, layout); return widget; } private: CreateInstance _createInstance; }; } class FrameGraphicsItem : public QGraphicsRectItem { public: FrameGraphicsItem(qint64 cost, Data::Symbol symbol, FrameGraphicsItem* parent); qint64 cost() const; void setCost(qint64 cost); Data::Symbol symbol() const; void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; QString description() const; void setSearchMatchType(SearchMatchType matchType); bool isExternallyHovered() const; void setIsExternallyHovered(bool isExternallyHovered); protected: void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override; void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override; private: qint64 m_cost; Data::Symbol m_symbol; bool m_isHovered = false; bool m_isExternallyHovered = false; SearchMatchType m_searchMatch = NoSearch; }; Q_DECLARE_METATYPE(FrameGraphicsItem*) class FrameGraphicsRootItem : public FrameGraphicsItem { public: FrameGraphicsRootItem(const qint64 totalCost, Data::Costs::Unit unit, QString costName, const QString& label) : FrameGraphicsItem(totalCost, {label, {}}, nullptr) , m_costName(std::move(costName)) , m_unit(unit) { } Data::Costs::Unit unit() const { return m_unit; } QString costName() const { return m_costName; } private: QString m_costName; Data::Costs::Unit m_unit; }; Q_DECLARE_METATYPE(FrameGraphicsRootItem*) FrameGraphicsItem::FrameGraphicsItem(const qint64 cost, Data::Symbol symbol, FrameGraphicsItem* parent) : QGraphicsRectItem(parent) , m_cost(cost) , m_symbol(std::move(symbol)) { setFlag(QGraphicsItem::ItemIsSelectable); setAcceptHoverEvents(true); } qint64 FrameGraphicsItem::cost() const { return m_cost; } void FrameGraphicsItem::setCost(qint64 cost) { m_cost = cost; } Data::Symbol FrameGraphicsItem::symbol() const { return m_symbol; } void FrameGraphicsItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* /*widget*/) { if (isSelected() || m_isHovered || m_isExternallyHovered || m_searchMatch == DirectMatch) { auto selectedColor = brush().color(); selectedColor.setAlpha(255); painter->fillRect(rect(), selectedColor); } else if (m_searchMatch == NoMatch) { auto noMatchColor = brush().color(); noMatchColor.setAlpha(50); painter->fillRect(rect(), noMatchColor); } else { // default, when no search is running, or a sub-item is matched auto background = brush(); // give inline frames a slightly different background color if (m_symbol.isInline) { auto color = background.color(); if (qGray(pen().color().rgb()) < 128) { color = color.lighter(); } else { color = color.darker(); } background.setColor(color); } painter->fillRect(rect(), background); // give inline frames a border with the normal background color if (m_symbol.isInline) { const auto oldPen = painter->pen(); painter->setPen(QPen(brush().color(), 0.)); painter->drawRect(rect().adjusted(-1, -1, -1, -1)); painter->setPen(oldPen); } } const QPen oldPen = painter->pen(); auto pen = oldPen; if (m_searchMatch != NoMatch) { pen.setColor(brush().color()); if (isSelected()) { pen.setWidth(2); } painter->setPen(pen); painter->drawRect(rect()); painter->setPen(oldPen); } const int margin = 4; const int width = rect().width() - (2 * margin); if (width < option->fontMetrics.averageCharWidth() * 6) { // text is too wide for the current LOD, don't paint it return; } if (m_searchMatch == NoMatch) { auto color = oldPen.color(); color.setAlpha(125); pen.setColor(color); painter->setPen(pen); } const int height = rect().height(); const auto binary = Util::formatString(m_symbol.binary); const auto symbol = Util::formatSymbol(m_symbol, false); const auto symbolText = symbol.isEmpty() ? QObject::tr("?? [%1]").arg(binary) : symbol; painter->drawText(margin + rect().x(), rect().y(), width, height, Qt::AlignVCenter | Qt::AlignLeft | Qt::TextSingleLine, Util::elideSymbol(symbolText, option->fontMetrics, width)); if (m_searchMatch == NoMatch) { painter->setPen(oldPen); } } void FrameGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent* event) { QGraphicsRectItem::hoverEnterEvent(event); m_isHovered = true; update(); } void FrameGraphicsItem::hoverLeaveEvent(QGraphicsSceneHoverEvent* event) { QGraphicsRectItem::hoverLeaveEvent(event); m_isHovered = false; update(); } QString FrameGraphicsItem::description() const { // we build the tooltip text on demand, which is much faster than doing that for potentially thousands of items when // we load the data const FrameGraphicsRootItem* root = nullptr; { auto item = this; while (item->parentItem()) { item = static_cast(item->parentItem()); } root = static_cast(item); } auto symbol = Util::formatSymbolExtended(m_symbol); if (root == this) { return symbol; } switch (root->unit()) { case Data::Costs::Unit::Unknown: return i18nc("%1: aggregated sample costs, %2: relative number, %3: function label, %4: binary, %5: cost name", "%1 (%2%) aggregated %5 costs in %3 (%4) and below.", Data::Costs::formatCost(root->unit(), m_cost), Util::formatCostRelative(m_cost, root->cost()), symbol, m_symbol.binary, root->costName()); case Data::Costs::Unit::Tracepoint: return i18nc("%1: number of tracepoint events, %2: relative number, %3: function label, %4: binary", "%1 (%2%) aggregated %5 events in %3 (%4) and below.", Data::Costs::formatCost(root->unit(), m_cost), Util::formatCostRelative(m_cost, root->cost()), symbol, m_symbol.binary, root->costName()); case Data::Costs::Unit::Time: return i18nc("%1: elapsed time, %2: relative number, %3: function label, %4: binary", "%1 (%2%) aggregated %5 in %3 (%4) and below.", Data::Costs::formatCost(root->unit(), m_cost), Util::formatCostRelative(m_cost, root->cost()), symbol, m_symbol.binary, root->costName()); } Q_UNREACHABLE(); } void FrameGraphicsItem::setSearchMatchType(SearchMatchType matchType) { if (m_searchMatch != matchType) { m_searchMatch = matchType; update(); } } bool FrameGraphicsItem::isExternallyHovered() const { return m_isExternallyHovered; } void FrameGraphicsItem::setIsExternallyHovered(bool externallyHovered) { if (m_isExternallyHovered != externallyHovered) { m_isExternallyHovered = externallyHovered; update(); } } namespace { int randInt(int max) { return max * QRandomGenerator::global()->generateDouble(); } /** * Generate a brush from the "mem" color space used in upstream flamegraph.pl */ Q_DECL_UNUSED QBrush memBrush() { return QColor(0, 190 + randInt(50), randInt(210), 125); } /** * Generate a brush from the "hot" color space used in upstream flamegraph.pl */ QBrush hotBrush() { return QColor(205 + randInt(50), randInt(230), randInt(55), 125); } template QVector generateBrushes(Generator generator) { QVector ret; std::generate_n(std::back_inserter(ret), 100, generator); return ret; } enum class BrushType { Hot, Memory }; /** * Generate a brush from the "hot" color space used in upstream flamegraph.pl */ QBrush brushImpl(uint hash, BrushType type) { // intern the brushes, to reuse them across items which can be thousands // otherwise we'd end up with dozens of allocations and higher memory consumption static const QVector allBrushes[2] = {generateBrushes(hotBrush), generateBrushes(memBrush)}; const auto& brushes = allBrushes[static_cast(type)]; return brushes.at(hash % brushes.size()); } QBrush brushBinary(const Data::Symbol& symbol) { static QHash brushes; auto& brush = brushes[symbol.binary]; if (brush == QBrush()) { brush = brushImpl(qHash(symbol.binary), BrushType::Hot); } return brush; } QBrush brushKernel(const Data::Symbol& symbol) { static auto kernel = QBrush(QColor(255, 0, 0, 125)); static auto user = QBrush(QColor(0, 0, 255, 125)); if (symbol.isKernel) { return kernel; } return user; } bool isInPathList(const QStringList& paths, const QString& subPath) { auto containsSubPath = [subPath](const auto& path) { return subPath.startsWith(path); }; return std::any_of(paths.cbegin(), paths.cend(), containsSubPath); } struct BrushConfig { bool isSystemPath(const QString& path) const { return isInPathList(systemPaths, path); } bool isUserPath(const QString& path) const { return isInPathList(userPaths, path); } Settings::ColorScheme scheme; QStringList systemPaths; QStringList userPaths; }; // construct brush config in main thread and query settings that then can be used in the background // without introducing data races BrushConfig brushConfig(Settings::ColorScheme scheme) { return {scheme, Settings::instance()->systemPaths(), Settings::instance()->userPaths()}; } QBrush brushSystem(const Data::Symbol& symbol, const BrushConfig& brushConfig) { static const auto system = QBrush(QColor(0, 125, 0, 125)); static const auto user = QBrush(QColor(200, 200, 0, 125)); static const auto unknown = QBrush(QColor(50, 50, 50, 125)); // remark lievenhey: I have seen [ only on kernel calls if (symbol.path.isEmpty() || symbol.path.startsWith(QLatin1Char('['))) { return unknown; } else if (!brushConfig.isUserPath(symbol.path) && brushConfig.isSystemPath(symbol.path)) { return system; } return user; } QBrush costRatioBrush(quint32 cost, quint32 totalCost) { // interpolate between red and yellow // where yellow = 0% and red = 100% const float ratio = (1 - (static_cast(cost) / totalCost)); const int hue = ratio * ratio * 60; return QColor::fromHsv(hue, 230, 200, 125); } QBrush brush(const Data::Symbol& entry, const BrushConfig& brushConfig, quint32 cost = 0, quint32 totalCost = 1) { switch (brushConfig.scheme) { case Settings::ColorScheme::Binary: return brushBinary(entry); case Settings::ColorScheme::Kernel: return brushKernel(entry); case Settings::ColorScheme::System: return brushSystem(entry, brushConfig); case Settings::ColorScheme::Default: return brushImpl(qHash(entry), BrushType::Hot); case Settings::ColorScheme::CostRatio: return costRatioBrush(cost, totalCost); case Settings::ColorScheme::NumColorSchemes: Q_UNREACHABLE(); } return {}; } /** * Layout the flame graph and hide tiny items. */ void layoutItems(FrameGraphicsItem* parent) { const auto& parentRect = parent->rect(); const auto pos = parentRect.topLeft(); const qreal maxWidth = parentRect.width(); const qreal h = parentRect.height(); const qreal y_margin = 2.; const qreal y = pos.y() - h - y_margin; qreal x = pos.x(); auto children = parent->childItems(); // sort to get reproducible graphs std::sort(children.begin(), children.end(), [](const QGraphicsItem* lhs, const QGraphicsItem* rhs) { return static_cast(lhs)->symbol() < static_cast(rhs)->symbol(); }); for (auto child : std::as_const(children)) { auto frameChild = static_cast(child); const qreal w = maxWidth * double(frameChild->cost()) / parent->cost(); frameChild->setVisible(w > 1); if (frameChild->isVisible()) { frameChild->setRect(QRectF(x, y, w, h)); layoutItems(frameChild); x += w; } } } FrameGraphicsItem* findItemBySymbol(const QList& items, const Data::Symbol& symbol) { for (auto item_ : items) { auto item = static_cast(item_); if (item->symbol() == symbol) { return item; } } return nullptr; } /** * Convert the top-down graph into a tree of FrameGraphicsItem. */ template void toGraphicsItems(const Data::Costs& costs, int type, const QVector& data, FrameGraphicsItem* parent, const double costThreshold, const BrushConfig& brushConfig, bool collapseRecursion) { for (const auto& row : data) { if (collapseRecursion && !row.symbol.symbol.isEmpty() && row.symbol == parent->symbol()) { if (costs.cost(type, row.id) > costThreshold) { toGraphicsItems(costs, type, row.children, parent, costThreshold, brushConfig, collapseRecursion); } continue; } auto item = findItemBySymbol(parent->childItems(), row.symbol); if (!item) { item = new FrameGraphicsItem(costs.cost(type, row.id), row.symbol, parent); item->setPen(parent->pen()); item->setBrush(brush(row.symbol, brushConfig, item->cost(), costs.totalCost(type))); } else { item->setCost(item->cost() + costs.cost(type, row.id)); } if (item->cost() > costThreshold) { toGraphicsItems(costs, type, row.children, item, costThreshold, brushConfig, collapseRecursion); } } } template FrameGraphicsItem* parseData(const Data::Costs& costs, int type, const QVector& topDownData, double costThreshold, const BrushConfig& brushConfig, bool collapseRecursion) { const auto totalCost = costs.totalCost(type); const auto scheme = KColorScheme(QPalette::Active); const auto pen = QPen(scheme.foreground().color()); const auto label = i18n("%1 aggregated %2 cost in total", costs.formatCost(type, totalCost), costs.typeName(type)); auto rootItem = new FrameGraphicsRootItem(totalCost, costs.unit(type), costs.typeName(type), label); rootItem->setBrush(scheme.background()); rootItem->setPen(pen); toGraphicsItems(costs, type, topDownData, rootItem, static_cast(totalCost) * costThreshold / 100., brushConfig, collapseRecursion); return rootItem; } struct SearchResults { SearchMatchType matchType = NoMatch; qint64 directCost = 0; }; SearchResults applySearch(FrameGraphicsItem* item, const QRegularExpression& expression) { SearchResults result; if (expression.pattern().isEmpty()) { result.matchType = NoSearch; } else if (expression.match(item->symbol().symbol).hasMatch() || expression.match(item->symbol().binary).hasMatch() || (expression.pattern() == QLatin1String("\\?\\?") && item->symbol().symbol.isEmpty())) { result.directCost += item->cost(); result.matchType = DirectMatch; } // recurse into the child items, we always need to update all items const auto children = item->childItems(); for (auto* child : children) { auto* childFrame = static_cast(child); auto childMatch = applySearch(childFrame, expression); if (result.matchType != DirectMatch && (childMatch.matchType == DirectMatch || childMatch.matchType == ChildMatch)) { result.matchType = ChildMatch; result.directCost += childMatch.directCost; } } item->setSearchMatchType(result.matchType); return result; } // only apply positive matching, resetting is handled globally once before // this way we can correctly match multiple stacks bool hoverStack(FrameGraphicsItem* item, const QVector& stack, int depth) { if ((stack.size() - 1) == depth && item->symbol() == stack.constFirst()) { item->setIsExternallyHovered(true); return true; } else if (stack.size() <= depth || item->symbol() != stack[stack.size() - 1 - depth]) { return false; } const auto children = item->childItems(); for (auto* child : children) { if (hoverStack(static_cast(child), stack, depth + 1)) { item->setIsExternallyHovered(true); return true; } } return false; } void resetIsExternallyHovered(FrameGraphicsItem* item) { if (!item->isExternallyHovered()) { // when nothing is hovered we don't need to recurse return; } item->setIsExternallyHovered(false); const auto children = item->childItems(); for (auto* child : children) { resetIsExternallyHovered(static_cast(child)); } } void hoverStacks(FrameGraphicsItem* rootItem, const QVector>& stacks) { auto matchStacks = [&stacks](QGraphicsItem* item) { return std::any_of(stacks.begin(), stacks.end(), [item](const auto& stack) { return hoverStack(static_cast(item), stack, 0); }); }; const auto children = rootItem->childItems(); const auto costAggregation = Settings::instance()->costAggregation(); const auto skipFirstLevel = costAggregation != Settings::CostAggregation::BySymbol; for (auto* child : children) { // reset everything first resetIsExternallyHovered(static_cast(child)); // then match all stacks if (skipFirstLevel) { // skip first level const auto grandChildren = child->childItems(); bool anyMatched = false; for (auto* grandChild : grandChildren) { anyMatched |= matchStacks(grandChild); } static_cast(child)->setIsExternallyHovered(anyMatched); } else { matchStacks(child); } } } void updateFlameGraphColorScheme(FrameGraphicsItem* item, const BrushConfig& brushConfig, quint32 totalCost) { item->setBrush(brush(item->symbol(), brushConfig, item->cost(), totalCost)); const auto children = item->childItems(); for (const auto& child : children) { updateFlameGraphColorScheme(static_cast(child), brushConfig, totalCost); } } } FlameGraph::FlameGraph(QWidget* parent, Qt::WindowFlags flags) : QWidget(parent, flags) , m_costSource(new QComboBox(this)) , m_scene(new QGraphicsScene(this)) , m_view(new QGraphicsView(this)) , m_displayLabel(new KSqueezedTextLabel(this)) , m_searchResultsLabel(new QLabel(this)) { m_displayLabel->setTextElideMode(Qt::ElideRight); qRegisterMetaType(); m_costSource->setToolTip(i18n("Select the data source that should be visualized in the flame graph.")); const auto updateHelper = [this]() { m_scene->update(m_scene->sceneRect()); updateTooltip(); }; connect(Settings::instance(), &Settings::prettifySymbolsChanged, this, updateHelper); connect(Settings::instance(), &Settings::collapseTemplatesChanged, this, updateHelper); connect(Settings::instance(), &Settings::collapseDepthChanged, this, updateHelper); m_scene->setBackgroundBrush(QBrush()); m_scene->setItemIndexMethod(QGraphicsScene::NoIndex); m_view->setScene(m_scene); m_view->viewport()->installEventFilter(this); m_view->viewport()->setMouseTracking(true); // fix for QTBUG-105237 view->setFont does not update fontMetrics only the rendered font m_scene->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); auto bottomUpAction = new CustomWidgetAction( [this](QWidget* widget, QHBoxLayout* layout) { auto bottomUpCheckbox = new QCheckBox(i18n("Bottom-Up View"), widget); layout->addWidget(bottomUpCheckbox); connect(this, &FlameGraph::uiResetRequested, bottomUpCheckbox, [bottomUpCheckbox]() { bottomUpCheckbox->setChecked(false); }); bottomUpCheckbox->setToolTip(i18n("Enable the bottom-up flame graph view. When this is unchecked, the " "top-down view is enabled by default.")); bottomUpCheckbox->setChecked(m_showBottomUpData); connect(bottomUpCheckbox, &QCheckBox::toggled, this, [this, bottomUpCheckbox] { const auto showBottomUpData = bottomUpCheckbox->isChecked(); if (showBottomUpData == m_showBottomUpData) { return; } m_showBottomUpData = showBottomUpData; for (auto& stack : m_hoveredStacks) { std::reverse(stack.begin(), stack.end()); } showData(); }); }, this); m_costThreshold = DEFAULT_COST_THRESHOLD; auto costThresholdAction = new CustomWidgetAction( [this](QWidget* widget, QHBoxLayout* layout) { auto costThreshold = new QDoubleSpinBox(widget); costThreshold->setDecimals(2); costThreshold->setMinimum(0); costThreshold->setMaximum(99.90); costThreshold->setPrefix(i18n("Cost Threshold: ")); costThreshold->setSuffix(QStringLiteral("%")); costThreshold->setValue(m_costThreshold); connect(this, &FlameGraph::uiResetRequested, costThreshold, [costThreshold]() { costThreshold->setValue(DEFAULT_COST_THRESHOLD); }); costThreshold->setSingleStep(0.01); costThreshold->setToolTip( i18n("The cost threshold defines a fractional cut-off value. " "Items with a relative cost below this value will not be shown in the flame graph. " "This is done as an optimization to quickly generate graphs for large data sets with " "low memory overhead. If you need more details, decrease the threshold value, or set it to " "zero.")); connect(costThreshold, qOverload(&QDoubleSpinBox::valueChanged), this, [this](double threshold) { m_costThreshold = threshold; showData(); }); layout->addWidget(costThreshold); }, this); auto collapseRecursionAction = new CustomWidgetAction( [this](QWidget* widget, QHBoxLayout* layout) { auto checkbox = new QCheckBox(tr("Collapse Recursion"), widget); checkbox->setChecked(m_collapseRecursion); layout->addWidget(checkbox); connect(checkbox, &QCheckBox::clicked, widget, [this](bool checked) { m_collapseRecursion = checked; showData(); }); }, this); auto costAggregation = new CustomWidgetAction( [](QWidget* widget, QHBoxLayout* layout) { auto costAggregationLabel = new QLabel(tr("Aggregate cost by:"), widget); layout->addWidget(costAggregationLabel); auto costAggregation = new QComboBox(widget); ResultsUtil::setupResultsAggregation(costAggregation); layout->addWidget(costAggregation); }, this); auto colorSchemeSelector = new CustomWidgetAction( [this](QWidget* widget, QHBoxLayout* layout) { auto label = new QLabel(tr("Color Scheme:"), widget); layout->addWidget(label); auto comboBox = new QComboBox(widget); layout->addWidget(comboBox); comboBox->addItem(tr("Default"), QVariant::fromValue(Settings::ColorScheme::Default)); comboBox->addItem(tr("Binary"), QVariant::fromValue(Settings::ColorScheme::Binary)); comboBox->addItem(tr("Kernel"), QVariant::fromValue(Settings::ColorScheme::Kernel)); comboBox->addItem(tr("System"), QVariant::fromValue(Settings::ColorScheme::System)); comboBox->addItem(tr("Cost Ratio"), QVariant::fromValue(Settings::ColorScheme::CostRatio)); auto setColorScheme = [this](Settings::ColorScheme scheme) { Settings::instance()->setColorScheme(scheme); if (m_rootItem) { const auto children = m_rootItem->childItems(); // don't recolor the root item for (const auto& child : children) { updateFlameGraphColorScheme(static_cast(child), brushConfig(scheme), m_rootItem->cost()); } } }; connect(comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [comboBox, setColorScheme] { setColorScheme(comboBox->currentData().value()); }); connect(Settings::instance(), &Settings::pathsChanged, this, [setColorScheme] { if (Settings::instance()->colorScheme() == Settings::ColorScheme::System) { // setColorScheme triggers a redraw // we only need to redraw the flamegraph if the current color scheme is affected by the changed // paths setColorScheme(Settings::ColorScheme::System); } }); }, this); auto searchInput = new CustomWidgetAction( [this](QWidget* widget, QHBoxLayout* layout) { auto searchInput = new QLineEdit(widget); searchInput->setMinimumWidth(200); layout->addWidget(searchInput); auto regexCheckBox = new QCheckBox(widget); regexCheckBox->setText(tr("Regex Search")); layout->addWidget(regexCheckBox); searchInput->setPlaceholderText(i18n("Search...")); searchInput->setToolTip(i18n("Search the flame graph for a symbol.")); searchInput->setClearButtonEnabled(true); connect(searchInput, &QLineEdit::textChanged, this, [this](const QString& value) { this->setSearchValue(value, m_useRegex); }); auto applyRegexCheckBox = [this](bool checked) { this->setSearchValue(m_search, checked); }; #if QT_VERSION < QT_VERSION_CHECK(6, 7, 0) connect(regexCheckBox, &QCheckBox::stateChanged, this, applyRegexCheckBox); #else connect(regexCheckBox, &QCheckBox::checkStateChanged, this, applyRegexCheckBox); #endif connect(this, &FlameGraph::uiResetRequested, this, [this, searchInput, regexCheckBox] { m_search.clear(); m_useRegex = false; searchInput->clear(); regexCheckBox->setChecked(false); }); }, this); m_backAction = KStandardAction::back(this, &FlameGraph::navigateBack, this); m_backAction->setToolTip(QStringLiteral("Go back in symbol view history")); m_forwardAction = KStandardAction::forward(this, &FlameGraph::navigateForward, this); m_forwardAction->setToolTip(QStringLiteral("Go forward in symbol view history")); m_resetAction = new QAction(QIcon::fromTheme(QStringLiteral("go-first")), tr("Reset View"), this); m_resetAction->setShortcut(tr("Escape")); connect(m_resetAction, &QAction::triggered, this, [this]() { selectItem(0); }); // use a QToolBar to automatically hide widgets in a menu that don't fit into the window auto controls = new QToolBar(this); controls->layout()->setContentsMargins(0, 0, 0, 0); // these control widgets can stay as they are, since they should always be visible controls->addAction(m_resetAction); controls->addAction(m_backAction); controls->addAction(m_forwardAction); controls->addWidget(m_costSource); // these can be hidden as necessary controls->addAction(searchInput); controls->addAction(costAggregation); controls->addAction(colorSchemeSelector); controls->addAction(bottomUpAction); controls->addAction(collapseRecursionAction); controls->addAction(costThresholdAction); m_displayLabel->setWordWrap(true); m_displayLabel->setTextInteractionFlags(m_displayLabel->textInteractionFlags() | Qt::TextSelectableByMouse); m_searchResultsLabel->setWordWrap(true); m_searchResultsLabel->setTextInteractionFlags(m_searchResultsLabel->textInteractionFlags() | Qt::TextSelectableByMouse); m_searchResultsLabel->hide(); setLayout(new QVBoxLayout); layout()->setContentsMargins(0, 0, 0, 0); layout()->addWidget(controls); layout()->addWidget(m_view); layout()->addWidget(m_displayLabel); layout()->addWidget(m_searchResultsLabel); addAction(m_backAction); addAction(m_forwardAction); addAction(m_resetAction); updateNavigationActions(); } FlameGraph::~FlameGraph() = default; void FlameGraph::setHoveredStacks(const QVector>& hoveredStacks) { if (m_hoveredStacks == hoveredStacks) { return; } m_hoveredStacks = hoveredStacks; if (m_showBottomUpData) { for (auto& stack : m_hoveredStacks) { std::reverse(stack.begin(), stack.end()); } } if (m_rootItem) { hoverStacks(m_rootItem, m_hoveredStacks); } } void FlameGraph::setFilterStack(FilterAndZoomStack* filterStack) { m_filterStack = filterStack; } bool FlameGraph::eventFilter(QObject* object, QEvent* event) { const auto ret = QObject::eventFilter(object, event); if (event->type() == QEvent::MouseButtonRelease) { auto* mouseEvent = static_cast(event); if (mouseEvent->button() == Qt::LeftButton) { auto item = static_cast(m_view->itemAt(mouseEvent->pos())); if (item && item != m_selectionHistory.at(m_selectedItem)) { selectItem(item); if (m_selectedItem != m_selectionHistory.size() - 1) { m_selectionHistory.remove(m_selectedItem + 1, m_selectionHistory.size() - m_selectedItem - 1); } m_selectedItem = m_selectionHistory.size(); m_selectionHistory.push_back(item); updateNavigationActions(); } } else if (mouseEvent->button() == Qt::BackButton) { m_backAction->trigger(); } else if (mouseEvent->button() == Qt::ForwardButton) { m_forwardAction->trigger(); } } else if (event->type() == QEvent::MouseMove) { auto* mouseEvent = static_cast(event); auto item = static_cast(m_view->itemAt(mouseEvent->pos())); setTooltipItem(item); } else if (event->type() == QEvent::Leave) { setTooltipItem(nullptr); } else if (event->type() == QEvent::Resize || event->type() == QEvent::Show) { if (!m_rootItem) { if (!m_buildingScene) { showData(); } } else { selectItem(m_selectionHistory.at(m_selectedItem)); } updateTooltip(); } else if (event->type() == QEvent::ContextMenu) { auto* contextEvent = static_cast(event); auto item = static_cast(m_view->itemAt(m_view->mapFromGlobal(contextEvent->globalPos()))); QMenu contextMenu; if (item) { auto* viewCallerCallee = contextMenu.addAction(tr("View Caller/Callee")); connect(viewCallerCallee, &QAction::triggered, this, [this, item]() { emit jumpToCallerCallee(item->symbol()); }); auto* openEditorAction = contextMenu.addAction(tr("Open in Editor")); connect(openEditorAction, &QAction::triggered, this, [this, item]() { emit openEditor(item->symbol()); }); openEditorAction->setEnabled(item->symbol().isValid()); contextMenu.addSeparator(); auto* viewDisassembly = contextMenu.addAction(tr("Disassembly")); connect(viewDisassembly, &QAction::triggered, this, [this, item]() { emit jumpToDisassembly(item->symbol()); }); viewDisassembly->setEnabled(item->symbol().canDisassemble()); auto* copy = contextMenu.addAction(QIcon::fromTheme(QStringLiteral("edit-copy")), tr("Copy")); connect(copy, &QAction::triggered, this, [item]() { qApp->clipboard()->setText(item->description()); }); contextMenu.addSeparator(); } ResultsUtil::addFilterActions(&contextMenu, item ? item->symbol() : Data::Symbol(), m_filterStack); contextMenu.addSeparator(); contextMenu.addActions(actions()); contextMenu.exec(QCursor::pos()); return true; } else if (event->type() == QEvent::ToolTip) { const auto& tooltip = m_displayLabel->toolTip(); if (tooltip.isEmpty()) { QToolTip::hideText(); } else { QToolTip::showText(QCursor::pos(), QLatin1String("") + tooltip.toHtmlEscaped() + QLatin1String(""), this); } event->accept(); return true; } return ret; } void FlameGraph::setTopDownData(const Data::TopDownResults& topDownData) { m_topDownData = topDownData; if (!m_showBottomUpData) rebuild(); } void FlameGraph::setBottomUpData(const Data::BottomUpResults& bottomUpData) { m_bottomUpData = bottomUpData; m_topDownData = {}; disconnect(m_costSource, nullptr, this, nullptr); ResultsUtil::fillEventSourceComboBox(m_costSource, bottomUpData.costs, tr("Show a flame graph over the aggregated %1 sample costs.")); connect(m_costSource, static_cast(&QComboBox::currentIndexChanged), this, &FlameGraph::showData); rebuild(); } void FlameGraph::rebuild() { if (isVisible()) { showData(); } else { setData(nullptr); } } void FlameGraph::clear() { emit uiResetRequested(); } QImage FlameGraph::toImage() const { if (!m_rootItem) return {}; const auto sceneRect = m_scene->sceneRect(); QImage image(sceneRect.size().toSize(), QImage::Format_ARGB32_Premultiplied); QPainter painter(&image); m_scene->render(&painter, {{0, 0}, sceneRect.size()}, sceneRect); return image; } void FlameGraph::saveSvg(const QString& fileName) const { if (!m_rootItem) return; const auto sceneRect = m_scene->sceneRect(); QSvgGenerator generator; generator.setSize(sceneRect.size().toSize()); generator.setViewBox({{0, 0}, sceneRect.size()}); generator.setFileName(fileName); if (m_showBottomUpData) generator.setTitle(tr("Bottom Up FlameGraph")); else generator.setTitle(tr("Top Down FlameGraph")); const auto costType = m_bottomUpData.costs.typeName(m_costSource->currentData().value()); generator.setDescription(tr("Cost type: %1, cost threshold: %2\n%3") .arg(costType, QString::number(m_costThreshold), m_displayLabel->text()) .toHtmlEscaped()); const auto oldPen = m_rootItem->pen(); const auto oldBrush = m_rootItem->brush(); m_rootItem->setPen(QPen(Qt::black)); m_rootItem->setBrush(QBrush(Qt::white)); QPainter painter(&generator); m_scene->render(&painter, generator.viewBoxF(), sceneRect); m_rootItem->setPen(oldPen); m_rootItem->setBrush(oldBrush); } void FlameGraph::showData() { auto showBottomUpData = m_showBottomUpData; if ((showBottomUpData && !m_bottomUpData.costs.numTypes()) || (!showBottomUpData && !m_topDownData.selfCosts.numTypes())) { // gammaray asks for the data to be shown too early, ensure we don't crash then return; } setData(nullptr); m_buildingScene = true; using namespace ThreadWeaver; auto bottomUpData = m_bottomUpData; auto topDownData = m_topDownData; const auto collapseRecursion = m_collapseRecursion; auto type = m_costSource->currentData().value(); auto threshold = m_costThreshold; auto brushConfig = ::brushConfig(Settings::instance()->colorScheme()); stream() << make_job( [showBottomUpData, bottomUpData, topDownData, type, threshold, brushConfig, collapseRecursion, this]() { FrameGraphicsItem* parsedData = nullptr; if (showBottomUpData) { parsedData = parseData(bottomUpData.costs, type, bottomUpData.root.children, threshold, brushConfig, collapseRecursion); } else { parsedData = parseData(topDownData.inclusiveCosts, type, topDownData.root.children, threshold, brushConfig, collapseRecursion); } QMetaObject::invokeMethod(this, "setData", Qt::QueuedConnection, Q_ARG(FrameGraphicsItem*, parsedData)); }); updateNavigationActions(); } void FlameGraph::setTooltipItem(const FrameGraphicsItem* item) { if (!item && m_selectedItem != -1 && m_selectionHistory.at(m_selectedItem)) { item = m_selectionHistory.at(m_selectedItem); m_view->setCursor(Qt::ArrowCursor); } else { m_view->setCursor(Qt::PointingHandCursor); } m_tooltipItem = item; updateTooltip(); if (item) { emit selectSymbol(item->symbol()); const auto costAggregation = Settings::instance()->costAggregation(); const auto skipFirstLevel = costAggregation != Settings::CostAggregation::BySymbol; QVector stack; stack.reserve(32); while (item && (item != m_rootItem && (!skipFirstLevel || item->parentItem() != m_rootItem))) { stack.append(item->symbol()); item = static_cast(item->parentItem()); } emit selectStack(stack, m_showBottomUpData); } } void FlameGraph::updateTooltip() { const auto text = m_tooltipItem ? m_tooltipItem->description() : QString(); m_displayLabel->setToolTip(text); m_displayLabel->setText(text); } void FlameGraph::setData(FrameGraphicsItem* rootItem) { m_scene->clear(); m_buildingScene = false; m_tooltipItem = nullptr; m_rootItem = rootItem; m_selectionHistory.clear(); m_selectionHistory.push_back(rootItem); m_selectedItem = 0; if (!rootItem) { auto text = m_scene->addText(i18n("generating flame graph...")); m_view->centerOn(text); m_view->setCursor(Qt::BusyCursor); return; } m_view->setCursor(Qt::ArrowCursor); // layouting needs a root item with a given height, the rest will be overwritten later rootItem->setRect(0, 0, 800, m_view->fontMetrics().height() + 4); m_scene->addItem(rootItem); if (!m_search.isEmpty()) { setSearchValue(m_search, m_useRegex); } if (!m_hoveredStacks.isEmpty()) { hoverStacks(rootItem, m_hoveredStacks); } if (isVisible()) { selectItem(m_rootItem); } emit canConvertToImageChanged(); } void FlameGraph::selectItem(int item) { m_selectedItem = item; updateNavigationActions(); selectItem(m_selectionHistory.at(m_selectedItem)); } void FlameGraph::selectItem(FrameGraphicsItem* item) { if (!item) { return; } // scale item and its parents to the maximum available width // also hide all siblings of the parent items const auto padding = 8; const auto rootWidth = m_view->viewport()->width() - (padding * 2) - (m_view->verticalScrollBar()->isVisible() ? 0 : m_view->verticalScrollBar()->sizeHint().width()); auto parent = item; while (parent) { auto rect = parent->rect(); rect.setLeft(0); rect.setWidth(rootWidth); parent->setRect(rect); if (parent->parentItem()) { const auto children = parent->parentItem()->childItems(); for (auto sibling : children) { sibling->setVisible(sibling == parent); } } parent = static_cast(parent->parentItem()); } // then layout all items below the selected on layoutItems(item); // Triggers a refresh of the scene's bounding rect without going via the // event loop. This makes the centerOn call below work as expected in all cases. m_scene->sceneRect(); // and make sure it's visible m_view->centerOn(item); setTooltipItem(item); } void FlameGraph::setSearchValue(const QString& value, bool useRegex) { if (!m_rootItem) { return; } m_search = value; m_useRegex = useRegex; auto regex = useRegex ? value : QRegularExpression::escape(value); auto match = applySearch(m_rootItem, QRegularExpression(regex, QRegularExpression::CaseInsensitiveOption)); if (value.isEmpty()) { m_searchResultsLabel->hide(); } else { m_searchResultsLabel->setText( i18n("%1 (%2% of total of %3) aggregated costs matched by search.", Util::formatCost(match.directCost), Util::formatCostRelative(match.directCost, m_rootItem->cost()), m_rootItem->cost())); m_searchResultsLabel->show(); } } void FlameGraph::navigateBack() { if (m_selectedItem > 0) { selectItem(m_selectedItem - 1); } } void FlameGraph::navigateForward() { if ((m_selectedItem + 1) < m_selectionHistory.size()) { selectItem(m_selectedItem + 1); } } void FlameGraph::updateNavigationActions() { const bool hasItems = m_selectedItem > 0; const bool isNotLastItem = m_selectedItem + 1 < m_selectionHistory.size(); m_backAction->setEnabled(hasItems); m_forwardAction->setEnabled(isNotLastItem); m_resetAction->setEnabled(hasItems); } bool FlameGraph::canConvertToImage() const { return m_rootItem != nullptr; } KDAB-hotspot-41e5de7/src/flamegraph.h000066400000000000000000000055331515036260400174070ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include class QGraphicsScene; class QGraphicsView; class QComboBox; class QLabel; class QLineEdit; class KSqueezedTextLabel; class FrameGraphicsItem; class FilterAndZoomStack; class FlameGraph : public QWidget { Q_OBJECT public: explicit FlameGraph(QWidget* parent = nullptr, Qt::WindowFlags flags = {}); ~FlameGraph(); void setHoveredStacks(const QVector>& stacks); void setFilterStack(FilterAndZoomStack* filterStack); void setTopDownData(const Data::TopDownResults& topDownData); void setBottomUpData(const Data::BottomUpResults& bottomUpData); void clear(); QImage toImage() const; void saveSvg(const QString& fileName) const; bool canConvertToImage() const; protected: bool eventFilter(QObject* object, QEvent* event) override; private slots: void setData(FrameGraphicsItem* rootItem); void setSearchValue(const QString& value, bool useRegex); void navigateBack(); void navigateForward(); signals: void jumpToCallerCallee(const Data::Symbol& symbol); void openEditor(const Data::Symbol& symbol); void selectSymbol(const Data::Symbol& symbol); void selectStack(const QVector& stack, bool bottomUp); void jumpToDisassembly(const Data::Symbol& symbol); void uiResetRequested(); void canConvertToImageChanged(); private: void setTooltipItem(const FrameGraphicsItem* item); void updateTooltip(); void showData(); void selectItem(int item); void selectItem(FrameGraphicsItem* item); void updateNavigationActions(); void rebuild(); Data::TopDownResults m_topDownData; Data::BottomUpResults m_bottomUpData; FilterAndZoomStack* m_filterStack = nullptr; QComboBox* m_costSource; QGraphicsScene* m_scene; QGraphicsView* m_view; KSqueezedTextLabel* m_displayLabel; QLabel* m_searchResultsLabel; QAction* m_forwardAction = nullptr; QAction* m_backAction = nullptr; QAction* m_resetAction = nullptr; const FrameGraphicsItem* m_tooltipItem = nullptr; FrameGraphicsItem* m_rootItem = nullptr; QVector m_selectionHistory; int m_selectedItem = -1; int m_minRootWidth = 0; bool m_showBottomUpData = false; bool m_collapseRecursion = false; bool m_buildingScene = false; QString m_search; bool m_useRegex = false; // cost threshold in percent, items below that value will not be shown static const constexpr double DEFAULT_COST_THRESHOLD = 0.1; double m_costThreshold = DEFAULT_COST_THRESHOLD; QVector> m_hoveredStacks; }; KDAB-hotspot-41e5de7/src/flamegraphsettingspage.ui000066400000000000000000000023241515036260400222060ustar00rootroot00000000000000 FlamegraphSettingsPage 0 0 445 402 Form User Paths: System Paths: KEditListWidget QWidget
    keditlistwidget.h
    KDAB-hotspot-41e5de7/src/frequencypage.cpp000066400000000000000000000156261515036260400204760ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ // NOTE: QCustomPlot still uses foreach #undef QT_NO_FOREACH #include #undef foreach #define QT_NO_FOREACH #include "frequencypage.h" #include #include #include "parsers/perf/perfparser.h" #include "ui_frequencypage.h" #include "util.h" namespace { struct PlotData { quint64 applicationStartTime = 0; }; class TimeAxis : public QCPAxisTicker { public: ~TimeAxis() override = default; protected: QString getTickLabel(double tick, const QLocale& /*locale*/, QChar /*formatChar*/, int /*precision*/) override { return Util::formatTimeString(tick); } }; } FrequencyPage::FrequencyPage(PerfParser* parser, QWidget* parent) : QWidget(parent) , m_plot(new QCustomPlot(this)) , m_page(std::make_unique()) { m_plot->axisRect()->setupFullAxesBox(true); updateColors(); m_page->setupUi(this); auto oldWidget = m_page->layout->replaceWidget(m_page->plotWidget, m_plot); delete oldWidget; auto plotData = QSharedPointer::create(); connect(parser, &PerfParser::summaryDataAvailable, [plotData](const Data::Summary& data) { plotData->applicationStartTime = data.applicationTime.start; }); connect(parser, &PerfParser::frequencyDataAvailable, this, [this](const Data::FrequencyResults& results) { m_results = results; m_page->costSelectionCombobox->clear(); QSet costs; for (const auto& coreData : std::as_const(m_results.cores)) { for (const auto& costData : coreData.costs) { if (!costs.contains(costData.costName)) { costs.insert(costData.costName); m_page->costSelectionCombobox->addItem(costData.costName); } } } }); auto updateYAxis = [this]() { const auto hideOutliers = m_page->hideOutliers->isChecked(); if (hideOutliers && m_upperWithoutOutliers) { m_plot->yAxis->setRangeUpper(m_upperWithoutOutliers); } else { m_plot->yAxis->rescale(); } m_plot->yAxis->setRangeLower(0.); m_plot->replot(QCustomPlot::rpQueuedRefresh); }; auto updateGraphs = [this, plotData, updateYAxis]() { m_plot->clearGraphs(); const auto averagingWindowSize = m_page->averagingWindowSize->value(); const auto selectedCost = m_page->costSelectionCombobox->currentText(); const auto numCores = m_results.cores.size(); quint32 core = 0; m_upperWithoutOutliers = 0; double sumCost = 0; double numEntries = 0; for (const auto& coreData : std::as_const(m_results.cores)) { for (const auto& costData : coreData.costs) { if (costData.costName != selectedCost) { continue; } auto graph = m_plot->addGraph(); graph->setLayer(QStringLiteral("main")); graph->setLineStyle(QCPGraph::lsNone); auto color = QColor::fromHsv(static_cast(255. * (static_cast(core) / numCores)), 255, 255, 150); graph->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssSquare, color, color, 4)); graph->setAdaptiveSampling(false); graph->setName(QLatin1String("%1 (CPU #%2)").arg(costData.costName, QString::number(core))); graph->addToLegend(); graph->setVisible(true); const auto numValues = static_cast(costData.values.size()); const auto valuesStart = costData.values.begin(); QVector times((numValues + averagingWindowSize - 1) / averagingWindowSize); QVector costs(times.size()); for (int i = 0, j = 0; i < numValues; ++j, i += averagingWindowSize) { const auto averageWindowStart = std::next(valuesStart, i); const auto windowEndIndex = std::min(numValues, i + averagingWindowSize); const auto averageWindowEnd = std::next(valuesStart, windowEndIndex); const auto actualWindowSize = windowEndIndex - i; const auto value = std::accumulate(averageWindowStart, averageWindowEnd, Data::FrequencyData {}, [](Data::FrequencyData lhs, Data::FrequencyData rhs) { lhs.time += rhs.time; lhs.cost += rhs.cost; return lhs; }); const auto time = (static_cast(value.time) / actualWindowSize) - plotData->applicationStartTime; times[j] = time; costs[j] = value.cost / actualWindowSize; numEntries += actualWindowSize; sumCost += value.cost; } graph->setData(times, costs, true); } ++core; } m_plot->xAxis->rescale(); const auto avgCost = sumCost / numEntries; m_upperWithoutOutliers = avgCost * 1.1; updateYAxis(); }; connect(m_page->costSelectionCombobox, qOverload(&QComboBox::currentIndexChanged), this, updateGraphs); connect(m_page->averagingWindowSize, qOverload(&QSpinBox::valueChanged), this, updateGraphs); connect(m_page->hideOutliers, &QCheckBox::toggled, this, updateYAxis); m_plot->xAxis->setLabel(tr("Time")); m_plot->xAxis->setTicker(QSharedPointer(new TimeAxis())); m_plot->yAxis->setLabel(tr("Frequency [GHz]")); m_plot->legend->setVisible(true); } FrequencyPage::~FrequencyPage() = default; void FrequencyPage::changeEvent(QEvent* event) { if (event->type() == QEvent::PaletteChange) { updateColors(); } } void FrequencyPage::updateColors() { const auto colorScheme = KColorScheme(QPalette::Active); const auto foreground = QPen(colorScheme.foreground().color()); const auto background = colorScheme.background(); for (auto* axis : {m_plot->xAxis, m_plot->yAxis, m_plot->xAxis2, m_plot->yAxis2}) { axis->setLabelColor(foreground.color()); axis->setTickLabelColor(foreground.color()); axis->setTickPen(foreground); axis->setBasePen(foreground); axis->setSubTickPen(foreground); } m_plot->legend->setBorderPen(foreground); m_plot->legend->setTextColor(foreground.color()); m_plot->legend->setBrush(background); m_plot->setBackground(background); } KDAB-hotspot-41e5de7/src/frequencypage.h000066400000000000000000000015021515036260400201270ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "data.h" #include #include class PerfParser; class QCustomPlot; namespace Ui { class FrequencyPage; } class FrequencyPage : public QWidget { Q_OBJECT public: FrequencyPage(PerfParser* parser, QWidget* parent = nullptr); ~FrequencyPage(); protected: void changeEvent(QEvent* event) override; private: void updateColors(); QCustomPlot* m_plot = nullptr; std::unique_ptr m_page; Data::FrequencyResults m_results; double m_upperWithoutOutliers = 0; }; KDAB-hotspot-41e5de7/src/frequencypage.ui000066400000000000000000000117471515036260400203310ustar00rootroot00000000000000 FrequencyPage 0 0 452 300 Form 0 0 0 0 0 0 0 0 0 0 0 Show cost: costSelectionCombobox <qt><p>The frequency value is computed by dividing the cost difference between two consecutive samples with the time elapsed between the two samples.</p> <p>Sometimes, for CPU cycle measurements, this can lead to unexpectedly large values that are unrealistic. This seems to be an error in the sampling frequency auto-adjustment code in the kernel, i.e. when you use <tt>-F 1000</tt> which is set by default. When <tt>-C 3000000</tt> or similar is used instead, this issue does not occur.</p> <p>By averaging the frequency value over a few more samples, this issue can be workarounded and we should only see realistic CPU cycle values within the expected ranges.</p> </qt> Averaging Window Size: averagingWindowSize <qt><p>The frequency value is computed by dividing the cost difference between two consecutive samples with the time elapsed between the two samples.</p> <p>Sometimes, for CPU cycle measurements, this can lead to unexpectedly large values that are unrealistic. This seems to be an error in the sampling frequency auto-adjustment code in the kernel, i.e. when you use <tt>-F 1000</tt> which is set by default. When <tt>-C 3000000</tt> or similar is used instead, this issue does not occur.</p> <p>By averaging the frequency value over a few more samples, this issue can be workarounded and we should only see realistic CPU cycle values within the expected ranges.</p> </qt> 1 1000 10 Hide Outliers true Qt::Horizontal 40 20 0 0 KDAB-hotspot-41e5de7/src/hotspot.notifyrc000066400000000000000000000003331515036260400204000ustar00rootroot00000000000000[Global] IconName=hotspot Name=Hotspot Comment=Linux perf GUI for performance analysis DesktopEntry=com.kdab.Hotspot [Event/fileSaved] Name=File Saved Comment=The processed data has been saved Action=Popup Urgency=Low KDAB-hotspot-41e5de7/src/images/000077500000000000000000000000001515036260400163675ustar00rootroot00000000000000KDAB-hotspot-41e5de7/src/images/background_bright.png000066400000000000000000002035451515036260400225640ustar00rootroot00000000000000PNG  IHDRP3sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxylUu66xeIe(NqQq NQ8D`L/%CDQTQEIyY>G5ϰ:u}R+{ﳶ pͦ:!|&cY'2(ȒF$|Z@DDdJ673;̾df;xtCY:Cbk$7p5/bi&KFDDdEjZ[ƯW57LUS MJDDdEJ)m?23}eYvɒJDDV*2cvfvɷq:ɺ@ HeYnifFXJ颔lu$Yj|ط~LX`i'"""8Iޯ\Q{(\Kri'"""T۸gcY\Γ\ H7DDDD).X躜?FuǤbYHnѩ \ymE)w8F/"""2]wמs·Η,+$wps}ꮏ{vvSc!P{knG""""KB䂻o\tqwܽJsΓ_.m"""rafKgffP;}YO#҃lۜv{nyTJI313DD%""")]3{}%)0InRZ㶜R,ˋZʲOsEeY=;;{ƄE(%P""x)5$/7ߒ) א\]y$I)uHΚٵv{R9'0Wo圯w_dy. e2_Di ,GmVkXԷȓu^5P'%Zi"I-7:'d[4ȔEO$@=}%OQNOIJ.jM;&Z]RJ{OiH)̬,'5;)ej)?1~~g,L`Q{,vm};մ]lwBrοP\u%OffXt"uDDd &]R}#Y]yb,O$wfёJzkde,9מ Iȓܖn)3SJW-hY')e#4o H3.<土df,K/(e*aP]J?d$mu,J\Ϛ=3npUZDDDd\Vlѿ:ވe])<YHnlf[M)qiDDDd+/bKÎ@AAôA :7m:FY>4%""E94`3̾R*L%P""25$s~9hGhIff)%Ҙv{n z6"l?j<""""9@u~Or&H^0$ EDDD$7pt$9ew z/FB ɝsgג'hϊiߑ@=DDDD`DtYFMӃ$l*6"nbApHθ#a紐M~>zGLms?J)nf|tY맔v1cfffG)kfYnU@DDD 9VNgxFیs=bԎKDDDd-$Sp)$W)%%Hv]:;DDDD,$&Ϭ?$&Ou= ] D\""""ffVŞ.0;x|b-&fB>ݓ&p^HB>߽ #zbB^I&X3/""""}#>OD˺H"j1z/&0$su$Ewk6p5/biifP|`?Gi&"""+pCUxXIXs~|qI4be. @dς ֟Hsұ֑,ﶘFQOӌODDD)H^h]$@=nq"gՎ=k\ 7'Uq'&bOűN36YfFRUUI\1ڨiqsb1bCri&"""D1B\/xc?OZ/4DDDdH8=w|È w"(_i%"""@$.DrI9 _N۴cuFd )lbR[K/v<"""=rm(2RmB-yQӎGDDDaū Ĕ\>p3;H>h1+Y{´cuGEjj+xr5Ƚ߈'HjY+N>]IsGC, zMkZMrί赽}I."""2qQ1e93cff+ .*?0EDDD(}cw<wk4ۺ~wL:H۠ȲWC\so$]DNr:7~ _M6z t:pm$OG8>~sum#Aqw8I."""2q$wpE$Kjvg$׫u$c6s%ŤADDDdbH>e,?p!S>hLWX= """21H>\wE2{|*?:s~s\¤b8-d%K*\G8="y J~ gM~I^%{ͤCDDDd"Hns>;lWrί?I0C툈,$79Iϱ$gjp=/b^6O[׮BDDDdBHnT_pB4/b>EDDD&,(\~U~SCmH"y:;A"9gn}F/"""2a$g|+SIn}MՂEj5%/r) 7bүHޫ5$]k$7_""""F H~Mr^8)ybmxZ-zzQLIL}{^x~-uMvDe"y#mn@8E"mSȄEHr.&|X\El|-y|#Z""""wHr.%y+bo -pHόkuwۣE'33'DR_^u:(\Gr~'G_YDDDDs"iUZMwJ?\_ɓ?<8GDDDdb=E1mԻ9Hjm<ۅYj>ifXܽgvEG@S*,I$뙮'yoEb9vSuL0sEDDDߏWEH._.ɓYw }"1R9AǾ qu$g886tD2?Ș(4:sHMm5D""""c$]Sk|5n&m$O{4y>YJIri"""" t: an^'gL\qu=mˢ75!>K4E#'նs9,|[ӎGDDD/v#(1J_j2yuTk\4j[KILqJߧ<8_kmNm屡0̌IMT_]}"M;&A<9_*nuP5<[W\?jjyq}Ȋő{x k'Gdfs~UUv)>bw\5DDDdHprXhޘޫOA5brI>0tQhfnki(f}2%gO9,VypMQyr#OX#a&䶵æ !IыscӪ*\OU03 ӎMDDD॑duMdLڧ7HntL$w>tۓFrs74JXIn5DDDd@$X8<פڈ \NM)߇lwjٝMvl"""2mBw`)-XDN&9>np#M؎˱@ȊP^Q^ ǻ|>~fkrη H>hjGig|$֎=#ӌMDDDkN=-y";~&|j}TY&08)0K5^*9pKDRt?H= E2K~*ut:k_ѧ֏'Vl"""2( 񅒧8wh|yZ񉈈b7 z%OffEQNGk^6J1s*|]}}OF&S0g9}?i'""" YmCXwt^8!۳ɘ[GQ`&P?g~¡Ƞ|*FumDr!j:.rΟQj[ۗoeLk\Գ8EQ ʥ$77y23sGOb3ܽZŜo|{}Y]֏' <=HdfkwEQ$\FukqfY?DDDd9WǗI&Off~kvv^w4Ui~?,QtL:>-\CrA'qqv:Ւ-51tFM-wqH|65h?#9r\1v'OoVI(?ǹ%Oq{#"1M|4{8bnfE\֞p)@}fI9T?KIUffeY.*ҮfV[l jdf9nW%""Tpk-bM4St{86mwH,ef5f"""bO?<EGHA'33;ĵ'6r·F|_3<|J+HofV_ıM3~ rs>,FN5A'33ȝNg^ɓGъ+}q:ы^|9_[x Q顣t4yp+Frί' Au(܉tje vf 6(ɓ1%:F9?<8˲<~<$9DDDd4O3mud O'n1lM9ZT%O<7$>EDDd-J1zT#nH| ;CmI$7pU5,9.FGM&j6}wi6^ N)h$*eq$V +FDDDKff$[E$w-q8Lrm=ԶFm %Off^?47bU"Y̳WRJeJ#fr=s~SJUt: ߛy cls638nV#T\2 EDDV ܈J^5m~izc?js1w{;QHj1qZw ڋNm6RBw]ם?5Q?Xt|u:}"ɓYcQEUJ!^In GݬkFLHx.>wfɓb9On93:_Frzv?E5FEDDa//v-6?u;T IDAT&|X|4'33bn;&g`ݫѧyGRX%+ iff$؅)R:^339u:[}fff[\efj&^L,g\aО?RjcJ>U!MidvFnp3ɍ5k5TqEOoĦ̝NA=]u=FsmъM#P""59g,cRJ瞔f93۰,˻33R*NSy23V5\Hnaf7[oQ67taJi⥙YYS%"rw}OյY&3SUbtguHfdfF*3,'@$ך#HxK @~SbϪ;=v0KjvSrʧ'/JD?1]2dGRDDD2wfsoli%OߎN pEX/։QVw.l&ZY(}GhUK-y2[ݤE|7V7玌sWmÎ^ȀFxA$_(k%OxC1wHrkڿSܞFDDdEuBrKxؤsZ 1$"^{l\}]3Jnph,Noቈn)%O)}f~qznW*3׸;9?62o943K)mnLm"""]W{#*&ANOqP[ź>pݨ,FYx9秛*_xB˔R>s~%GmaWk-x)fnX?RzYYll%""2~3_]AumBw?5FE(vw]E7'o1s@s|#-MM%"""M<}WOrΗϷlEWp(k խ1:u(ɭz~_qfy]H4~\ &yxY|ov<Pג78d*ψѩ'fg71}P?bͫcEQ.#sGm<|7j3ldv:.t/wߝs>>SlB}h̬(={9_ۻ DDD G8MitmIds>(u6UrίE&ׁʦ.N-= Ʉ=.6>qatN](O%}lb6s>@IrX?d_~NeȊ4]?{@/N[,D? sud6'_[ORvi8^t:ύH>H8EDDQe]=>:#j"ѻc697cECgg>c黮i N!E0(rBzke'#ؤjI.S#MsUEDDVaI$ E;[2 7ג)DEW5"y qdw?::M&x ѾȊ5ݠɓYѣx$\ݟ#\qOMs~j5H>6Ƹ?j,eDDDV(0ɓ>f5|t-Dx pb=,>?>4OW?jq!"""[l}M <G;>$7Iw~vI&"3H=>DDDVAFI̊#OWs{n/gfwg&_Fs 6}ޅ5y23#EpюOX-cࠆz|;~/InD Hg?"""+Jm/滦j mcjm8FH#F~m8rޮ]SSnt%OVI Q`>CT$Oh'Dø5DD&,˃lWRJ>tjN)%3c 38T (3[CVZ\J fu3[?zF<gH8t#Ykz1"kSmGϑ:wd< C =,I8|wD"""BwJ|,P?va5[p[ ӗ?&>ǯOO>8cDESx""7}7i;[7nR"ɯLY3i)H!C?lfVDDDFkn#O~_շ8{ё(ǃ#XěG><_λO_e$'33ODc~N*X Ew|1@"Qhh ODsnv]}O| oi^ZW,eAlg3k<;t m4@oቈ4IOڛDDDFUMS]18orBr9~^}9GM+uZLaɓo:8Z'z-tĺ+F QF5FY4'"VYor&6mffôݤ/t]L[M1 MD(e*l$WO)6M cdfj1"7$MHHT M1e7+LD҅fsor7{HNZFkAEt1y23K)`f'6Yu[ke,(+%P"lņ'ٟl6Ɯ9L0+ʲ9J:fi_[LeyĘc釦DDDErU_}u(NqR䋣ڂ"yOl~o]=xӎEDDdCr"n9wSyM-`{6mL#y)\xS'|3ZDDD_u9/{ 45Kh InڮO֔^E_DDdVda/%n#H.%CY]OrqǗs~M$Pw_""" ŗ cjNFy ~qϭ+ɓ]*{(c9Ϟ=W{8Yv8!SKns7smRdfFrx:H` َ{6Ԕ^MH_:^s^ӹ$PϮݷN%Oo${J6_U?>)?6ݶȲsi{^K.%y@u>J!\ɓ]r|Lqpm΍uJ/>Wk]eT'w7ώQWɓٝӑ35o_qئ8ÛhODDdbl$7{nF^"yzS1W!Γ "A$cJ #zm,dI-"Ҥ}H]6n2tWRJ{YoV9;I'`f7eYޑRn*˲0+I$5[fggo4̬Rpw4ZfvvkU)c$wO)u׬Z,D9GZ=#B2i4 Uf6;33siRⓓqm[`f%NJ)N$cYn7eYn!y+5Vڲ,;eY^ef^gf7-fviJ $9_ff8sgfOO)n{"433 ̎&UVmEJDoO)npc?|0\~_lnۘRJfSJe6$jkVh͍֬g;/ųkշ23#]3k/4RJ)nR AancH۪U&Lf[3K$i9O3yJ)d"k3Qz{-]X;VZQkk369os^jmcfٽZ=luJiH6&*osSY)6vJ,Zw 1.9r0gt_Sr'ٰSz?>X|6Q ;|ܽZPMEu- ${z9:{bma-sDDD/28rΟaܘN~j;~MuDts:AzĔ陋^rGw|u3[z*>"""+Z۽h1-y"9@Ir6̫޾WhSK RNswsym?@߅7<9x ""Bƭ;y23t:ϋ:weB푼O QٻJ2H>j/ϩU_wkHn z Szq͇}>m+yxHז$ڨk]S*)6s~U\s|kϔ?.dYqrgEzL\EQmZ7 %RQ}xa\/|BkH,b>5^%#}'`_;>BZ~׹}D`uM\Z9_o"نi7EX^]Ar!wJG,"""+Ց@9>S1]~=˲6qQI4Jۃ7JWfk??|"""+t)LX4Nht`WMWw[4_8f_})CDDD,/1WdftE7H>%Fzܼ<)H}솹 ~Tr·_2J["""+"KA'3,O\Z;m$9!|{E3#j>=4%""'\ n{)4?믉3Z tƦ:GS'ų.у_y%,-oDDDQovNO~߮+e1tj8mQ{jۘ] `<#$WnQPKm}1boEDDV76=u3LdfFH 3:x)U6*4\?1vwHgk%Ofw[ aY1Hn_g4ɓ/ǽ nݏn, {wNU]mJnrgGW_c$]'ODDdE!k|D{>5l_~{o$;.m(cLmyuF'3N& ""lK#5jm 2o4H{ɸ{NJ-.BQIqv%OG """+cJHH>9ڸ~[9y^1L@r: N-b_ܵ~W!O+Lt_FɓYFhCX*j|"/йE{r·Exvwj Yf%OqUb)S|2Gy#SuQ|f6b/ GgHn9TKmc6!6[Ůs {j~-dDDD$81FvƒhZɈ|"1M<:QM.Ĺ9kjss~y$olDDD w?@FQ' 5EQۛmcԒ@EQ<,FE}3nˆÈ,{{'Ook(G{'7^m=՟hoH(95tM䆵{v;kh<:e~G^k8QĒhs) (Yt%SͮkwpE|oEDDNz?׏+y23sjMYLSm.Q'Q9ׯt:#%mǿf^DDdI`|kǖ<<0olMcI. rInsk$:NEQSe勵 sF/""98hwji#tUJKrZwP97G7YǸ/w͸AAr* gOKA2w 'x$qX9Ϟmό3YL|Q>|wT{VU?Gw?}O6t!8yQ;ҫN[I=:IlD'hMccGU&]ϸEwީ"EqmznE8g(~Hpw?w"&"".q?īo3J}OiZg5n$[k{(ݒ/'vűVw߿OA ,{nAv'L#Ś.h#KB#{]WK":%ǣd,hƢ([1:Ύ؉4.^'ӪcNjϪPw_M9>6NH..#:8v5U׻o#""Ҹ(/c̦<'eBWr},,tOyV\nsU\3pwƱ+IlvsӉ<%?lUůnFld01}O{.[ o\{!]UFrwd&KDDdY9Z\Ke1eR}|TIn:~뜘s^5+v~H2x;6ByhO%""Ԧmb}t4 J>LߜGOܨ>N*1pu_ou(blU9~'Y\K7>;gEQD$m"<;>okFk<EDDyEQ5Wsο&w(^q Rwjtfsb(5QNkȒBrR?y}G!ߤ%|#.5:]@rl5ٮ?MbSDDd"w?w^L߅[bfu$s&"tN.CrYg[h$ 9(F{~9~s5׌ҎsHMŸ,8&ux_n,y93c*힓 T xU~IW9J#؈eEQ|WDY N_sgr*{O:qǗgWmy͸/GWHE˜.)*F$ٜOri!""2v$_x'XlMwUl-{<{Qt:Kro*ikȪ sGN+!~f}U sw_M(fm[N;{EFƺ6"EDDInp?6@rviǴ/bh#bY8_'c5"1>kO?rηGuibf>ErմciD(v\}TۤI9ė~ӴZL5ݸ;ާ'3d! x%H  UQ bTP&T E/fQHR HPHf`f`gh:TwW^癧Nj}YغeEV13a"Ծdn#הڭ}tJZ0XU`5{`VFZsr z"`1c1B8%%>D:I;RO;MWU邜FDL:[f/xYc7U0nlfSR]A:`\1Zo4YcC_U_;&c1f\D)i8WTn ~Q5P CW9bl,J TNvBjD,""c1cBfWѥKwVMPX*Ya"HJvhD`Fc*[n_$''tW;lxj+w,("}1.acwPzjgV 9ܟs.^= 13Yj1 8@DbS>h!݌qZfsX+"I`1c1;Ei5xz'ǝ([HbSvU݈oT!c+|=Xa1c1#?S?kwrܖ;wr܉0_U9Ʀ!~:xȿDFܱWB/HCDa1fӁcUkScNTZbs;۵<f)Q[Ul9B85%jWtkS.͞1pRx1 (%A <sBеC7DdT[,"Igwk!Ϧnc !LDWۧJO1=@D$"cc|+33c7yk"Rh7-7_`.vץZ;Uݍ%#TWh(cLߩjA&WF\!Yc DfK7M| kc?n:P62;G`qcR+ <YNA- O`}iBYo!Nݏʲ|a1LA"tD0[5֬MOX+?Ԉ+=yBD1Ƙ)&t Vϩ ZjGXCU9pZ-b>cWBtr`P#wc`t`ouu^É=U~eh4XUmAƭ­s:WȲ~Wc##T>GDM#pUKݤtjɤB,Os)r'y0g&1Ƙi(ymHE cA^s2UK}:1f84Չ+nIU1ƘI.p4* N,w˪GubLDM?Ӊ3WD1ƘILRzւUr'|ܠ_xSAjMSDK% "D|]j}VzMv1ƘIJD~mƶ!' DdEJ$.XSMKrޏNѵ4"sd1fҎVZ$"Z`.J\8|ҕLd/MC4[E!ֈcPT +_nɩ S윊F㮆 `Z>LSaOy<6Zi1fzh^QI7b0VD$ιZNa櫉DĪzjvZvijD|7Z氌1L!__i;yHDh40kmFն,1"liNgV\^l;&c15IW'U)+'q֟+*ɫngVIQ.r1cU7~!Hۿ U},sl'!|:_O+rd1&.׾{mb1F:@U6`PK-'k.V|TtUT=14<`Zthc(T*~kI!RmynfBOD5"6ƘKDNWbNyV>0݌͌ \ucLkD䁔 68U ON,w.[ھ۱S_Oc!cLqp!jӈlzAD.nKU50OneڣG?"CAb1+ҩ/ X=<ѽvE>%EhK٭"6Ӟ{<7' wu1Ƙ),SEiӯGz~ᖪ"6yݍEmUD,dB#;o1fAy"r_Ztp߶yU|f̩NeyHۆTDbb3Y,c2AirKq6!ϦC{q !RGkgd $Z%!"1cTm|ICmh4X5!Գ@U}8pHz"@Y;cLT&"14}_4x[/L3>^ -&PZ5IAc2U!@´X*Bkhµ鵾iǫRv "GH)"GcIjBحZB96iUiCD|>`~fJ~`,M6LwVLD04- DTS}"-w:3,[pf%9^IDE.~fKcPb)3ob5yDTks,{%133?g\Tu!wLb 1\AD" yiLfs(ky;V mB[3f-;Xc3NUXUCD2s)@c^f~^=)bfH38@H=^pb4lj9Sb7f{?`UwSrFq0K1}OD"ӷPW 3&34I &ۉ9ʴ:،:zet&"ѷRZM@cNDZ%'̼@#@D⽯>؅B!,'"X99UϏ12r"z%`EQJDUALZ-fizy<\oޭ+(-15%F7[sU>Y>;bGhkfXtZi*&ZZ͐5:=+ҿVKTVJS鹔N HcsJ8D@"ӓ31_0sxODyNjNb Af@&"~:Zqz~M&(cL !̗Z7gT;D4'X?1Ƙ!ȯirbF'"Iup:hn07M13_]%)8kMt,!6ҫ?B8@4ʲ.Y{1Ӣ4B;3`yѫ!ڨ*{i IDATZ^Xn*!N=:w<cx] {ONZTK""r)2skV1CDVOWg¥)y,SÃBxi^l1L-E5_;3P!g˪0hn;wNz/Krc1ܱt0}oXVtPa'T3,"hl;cKk,PnjNU[s zeY*iW3R, YR 1ƘiODIŌi'X7w< !<ޒHE#oJ~W?;cD wFXL{T}%w,Ikw{-8UDTY"HD1Ƙ'D1;505eytJHK;BUT!Uo;u<6"4 c!"Q:;3v%.;控]6S jVj `v 9;%Qc598iOUZD~;0/%Y֒HI"oK !;cR"N L !Rb3L3iM@k˲!w|^1L["ܱ@(-c(yEA9r6Yܱc̴BxY0>/w,=zVZ sCX:!B  OIf !;ce EVxl`^x: "]ik*P;"w:ocg_iޝO厥 >95pr77rfX1fZ*Oc1 !|8g玥R%7] C7LffHU\չ1ƘiIUoH4V"r9=UHTTrc̴HNiOᚔH,w,`#9J S"4p*Zz-ւ;cvl}5?Ո+R,w,9'" *YvzR1L;"4 KXL{Zi+:l;^(r4#(rc1ӊ>ŴGD~ks280A9䎭BJ?/sb1J:%LDnj)Rkdz mӌƩ0qz@u1Ur7Ƙsbڣ$#clRH2# `N:,HEHXfc!9`:^5>޳{r2Y+"9ED.u~4|l1L: ODVWfj0!`Ax&A `ܱuBF1VUU;w,=!dܱL!\Z3]7RDe61L 6I#w,="֔,T` s. !|x1L "r,˾8B#-&;w90psK"U|kaBɱ1$zc*iMX"r^X*pQ!$S:.k:Eu;51ƘDU-kmʐDVDXl#5-Ԋ,Ta)lcL#"EIscF`4ҁ1` pbaI˩=?zcW3"Nl1& !j% if^;X[Tœzbe4˵c=ˬ0;3˪+l}K !XD!U=z< CO\lWocL;rbFf+#1`TjD['B_v~1 OW#:PwUu"#91ˉH(R"zιs=+Vkƌ2s럳lUo̷t{cfիo1j+Gz~J@cLe"5|s;56uTu{71kjNsˈpjf1MU `rcz#U8?2-CD'y:.'3-2Ƙ h,TZFU7uέkcDD z1;b^}6ӍmFh 3̷9w 1ړ)_< (OK ȝι[s䎇(3v9ws̼u{[7o1meY?Ph4^ߗvtm ۘ@6Qf^:3X}?aGcѕEQODW2IzؽVWUu5}(w掩` 3 ৵Z|_K@cLDZf~t""~ιmR4gp1>m&i*rJhU z":{37ؖ+n̻^׿;VV1"]MD1[K1l7Dt'mMDsmCLH$I5V%U |+2C9 .o1aDt&5Ut;E+3_;̈1h~f9A"(c%K1{콈eDtx$UIy&y?LUd\?>쐢(~61B1ѬA #z5}6g,2Ƙ X|z}of;Ƹ30Y9H?3vLELy13)(>B3ˈ(vhfd"r0r})Կ$eYn̟fcx~0I ň)ni2@fDgU2naof{Z]"U}-w(46QOZe1mXl/橹,"#괜2VuoSS=1F'vY̳舢(ݕJz,SDnf ӵZܱ(cDkhWa6L$2\2K\03=˲su|~nkD)"ID^DU}Xf 1 RNCl2;8_ a)0zzVJQտQIlL׈DLD&"޿o\,2jRWۙ?03FZ4E L-w?̷Wwd棼_}Kr =c؊:6d楹c%PƘi-]Ew(#1ƺښ>Sʢ .\DDz3՜s?s9aYe6Rޗ{yWTZ4 1+EDD>\>)i%p-3HDEU9wfkg(1ED!EgMfϖ@c Txf Qګ3V)f^oe"k{F^\Wvg1f*cռ2V400Fq{DD1ƣzB@c>A"(8WUYDqI1VZ`Oxȷp"(=u"z5ەc>e1SNضV `UA,q2=圣nwwdmJ]W>^ՌbιpP-2LE8oe5Tu$0 J?p*j8"o 9˥@cys1UUgdRȹQw:e;35XU$"o<cwADEg8*Z3zr6 EQaWn"R|f~r6eY9[^/c(c2p?`-.]~ `K['3%03v3o#"+shS3WSڦ^9wvL[,@ʘBz5I~gϾce:3,Dm#m[ʼnԜGW77 @yUȜu 뿌1[y3 1aM:̼\>ҶiND^ޭ,2&@1C1ƃ)Zwx آyN씝bT޹bŊk޿1N3(tj݈(c;Dt$՘'6ydPO?7Ѻ3)FPK5 !3&XU66" j>Zϋ11YeL&ι3E#uc:=1B<t1FZAie] Kɪ(F+̼?3FD?p:%PSx  U sVX1XclYb溪^("dW0DT?Oi{iJDT(cy"9zp;IUMPY/vqw2=!XO˲|[&*:@_NjRDt/^:%PH_̏Eq -Yٿ7MLa(~cRUgZUqcƦYDDϘj@u٪zjOQs}w*Kɤ*c@#$PDD|+fmؼMsg7klHY+ )1M1o8!/P{@D ]TM(ci+""je"rdmD*" `j{>')(>L;w(>j!g1ƣY:%PSkFsd" 3ogMŪfdqtF3RfuvKf>7~OT;D|qL`cj [% ۘ"zx;Tx":"-y2DZX1/eٗ {-Ԭ41 Dacm:P#P"ڀ' )y:&ƸV,y2;Z9&")f~o,sNK!T(c2ivgnoVEU#cbZ!ge *""S.1CMv}YD9ι0MDtPa(ci{9b1_hܭFۜy r'cze&ʫ9}TŕDD]G{3K/LO%PdnKJQU%XN v6dLoԉS1s ˉ|"3飯XkjQYeL>m'P!h}"*v]JD/b|CJnɘ\BUu1ƫ;^c拈s/9pD#&PDDfq}OA5-EԞ,L>1Fvx9^(}ݧNHD1<m'o}ñʘ|jJ"OD˜s ~%hNv EQ7Ѻ<3y־y玩Pj*ܪV%"a-T>yPOYj 1 ;`s":HU2Rsŝlh UH1~`!u3/&? ~|``̼ z_iU_KɧDJUMJc\FDHUfXdTZ@US(ƸP3ߜsϦuKꓷM(c)bOKT=D-_FD۳pV-N5LUVDK IDATy"/s#+ 3/oO" j&=ZeL&y^~e`ϥoOaFNhk(1c$Q%Q1RU5D89R{fZ%Dt;E*9ɳʘJjY f~V|9U}؆j=YLc0T~zR3.fVj.iNТ(`wQsΪzKUt1^`njB {uRWg=EQRc0?xyh9w!3@m/+bKf~1 '#ɳʘJj.Zu̇ef^7:1fb9vŝ1,Wn&;fDC!{62s 5['(c*hcb2Sc$x)1؅%OA롎c携/1]OjѹDDiz,|,2&tpk^?m<㤅Dc\`W#bƍg1ƕTFld>E]}UQNMӫsCɳʘsUXfm_AD V{ZOՋ1}>ZK7xbwV#og 18U=3ߘy yl+i+l4oRG1D'"z6w(.bf^>y@I*V "r+pXcꨧʲ|!ck V,Әi$UMsZ:*g0\[1X !"Tj-2&f>)WU T|3!RuPs#E>D3J|^L4r[6oUTZ?;@D^IDѕEQV."0;l23puQc+\U]DDE`};c/fZ fz1uls y[f[l"ry1@s?n3ZEQlZf&=FD̼^KT{:s!X0Ծo'yi 3M#9H3,i}MYǨ”I>Agϩ$IóCk x,^X|1vs@y<ㄪzs?jODEQ \'"(0 óFœ@AS/$-q;ēa8(&I xƉ$IN~ 1 7֎qGDNC|f0 YuJ7I鏈E `c I0 ORݒ$ "Oc^#"`MxU{8rxLiιrqHD&gǮ :9wsGǁx y(5wgR۝s?\*UmUI%"gg3xMƥ}9r^,NKz4ܤlwLX, -jHTlXx<-T1h*GL {glrXl3fxǘT`cwD;|*mvO?_FR(`*SǥB-tMlz4;U-Wk;/<۹5 sl- <5.}'cƥ:[^@y<-:?&n{ *W׉1C0oa5*C3"&eHD PU/yZr:_Cl}xZ yuq#gc7h.rh蟾 G&MYU6y8N Oyxi%÷_:7!6oȂ-=p)y=am[`Z̴ï+H'4{,xvGss58x<-MR\~;nNI֬=-;pn;8vm߿V@;0]z pBVMSp6Z4 U UuORbAKU?æ{<7D/}/撬] @x¥sӕPؽmW߆tP8(4m 4SFku~O؃ZUD<S$9cX=> ]09t['½<eIqc9PD$鷵H#?A])Ucq+۶jxZ/l0 l9NPU\ 갫"!؍$< :6 l3'uS/"~÷wJ󧣎7MhCD䭵 NU_nқOKӝm19v[N kaFEނ9_i%l+f=i{O<~̪ PkMJ$I U=#~$Dd!x zȬyHwB@r(J|*O[[0A{^eR(N@DFPȼI,(QD֞iY zuxEa;t/V2Ik}J:n݌[}?L$CyK TAHu'1j3"2@U0YO3H<@o ^$\5d :}a3}8&}w_6\vzMWݛ<~^@y<9 @U_PO|$I3}ZimѭUVӅZMbxrk&ފ/-D^恚SxO#(@]$zD, "/ msgUtɷ vYIn:vn=!΅@t5x\0 "LUg׳Y-=OWq!2Yg&. v] -սUt}Ea-*!"'xm@y< fN]7b}P0 JVk (1h_yLn;/B. : H4L>"}MO$w]ޟA&HoP,Zjf45z/<* 0UqH=%Ѝ]q_v/LY b_՚}9W1RP4t @kgU/<}x6cWbSǑ9J/.8Kr/LNJw?ګ# yE⽀xf@D$IRǒ/~E`.ܚXssN {*B}ݺ?v=)=SdjB71f&i0STƯDzvbWW=,9 6>)13wi}aWWܒ `7Q9 r\)V3gDx  ~tPhЋkDDjSxRE&] mgy'ιZRE`EWrUZU>i!7b=PvsMTWնB*zPrOGK3Hn> IDATIi,^@y< 04ΪWy<@\u9p;nc?Qd9}֖I-lw[R\37* I@UxOC`=^UݵZT>z<ʳ#3!QĀU;K4i,VbO?gawbm%q/ "/ZPL<-![ i{ N筵ިxƛ02XShbӿ0L5SZa,"xQH0|*]0ZYFD~\4L i)G^'TPBqŽl[8. ֎G'CaY ^@y< )c1t7~ i=f:x4<[ &@LbAy GI6ކM[ݐj@DcxgEd ߀S8~U鸪)< dx*ѾvLn5D "Q0OA\VQ4M/iͳ9J~4܃ `Ĩ"P8bDD:g?RRvnq~bF0ZТI_qJbI+i(G*^RQz!{Ĉx5N`EBa\JIx<' Q#UOjpy=ib!Pe/LH 8ɖs2L =ڋ끪Tz/<!"c.Dd \.GQ+"Kuqܼz#"Uv]vKTI9GlbB3a@1QqvH_VST.l mz1hC|:7T$fYRN[z|^@y<#DD8 tY '(sR # Ó/^iU>gd,X:bh R,@C8=_ bXHTG)bv.YJ*8I*$mYF([we~ƣ +DD3BDV hd?Ƙ5ƴT1|>W:DQ("Uk]S4si$6HEO  Ptu+.(=]̮)*=E(B&bG!\bfq8IkBiRdqRpA2ARH3"=$ Qiwߝ= sUm7NkALD `YRj8 ɳccf.=ꁮG֕ ]]k;tmw =Bw# cUT E!ܭ+ÉC f̨< .̣Ae؄?!mݻ֎z@u"j9ax6* 'kjx 6bsTu-%IrOG~ g- !N~Z;A$0" bGX!-Bqvi^ H3#!Ȭ"1!T<A2ψ)3{n+)!UhhB[[Az.7"km]O@$/ `<ȾꩪP,N$eɉǃ 'I 0/I@yvxM }]La#ۻUQb]zڼcLH):o  dG;e/|U׹e0$DNa&\TtE5!U  `<ڸZp/1߀n`3O$I2xʦ<祱O^xHIx>L # xB0 eSC_1t^l,E1+5׮s_Ҷxm㧟jo]Q8 EQj 0|iV2ι[?i>U#ˠ=f͟| ߦ=G-r&1i3b;b  8bmeQԥH9v=qg?1fu_@LJ?]W' AkшH ?LuZM+djrK+!qNAW8 J LiyKc9& JBdbs,u\sNg]"/AO!~z \;Q=Q$IrpmGPOZy@URy#0>P%jZ&ү gB F|ݬdooF:'x&A A$HQT!xʄҠ"@_NbI-K˿hZs b̖:Ю kNTos-@_`lIV$ιb}xƯƃ 8PD֍q<Rng. ֬ A΁SfSxT @Ld~vaD=d3+Q4ڗCpckęm9v:rwo!f#Zz M2Z&Fr=݀Y@TMSپEٴiߞ}OX])@ lH?=I.a$IΔRf`1z@饝| ])zvAp=r>!TΗPc0Y}I&Ki?;'6WYvV`*kD 8bR5Ep] >Ela{ނ =H TпqxUNoFu6ޞ;_ƹ2x+%^pipHt'ejl18zw~Av٫ER|?i5&k:/+0ZS_O~JO뮻qӦM_wY t {s-T1Yq?.z3Jf{ f㐉fl!kYR0 hcTUW/n6SUm!(щIaQ,C2Wy.B︧9/ڶc m2eۆ 9U~\J鸛Ink34>j?oNM:RvcJ;Sˀ8%{S͛7w5Eћ+y^ lIk CWZk.w؇~w3C4ITs!Ў.L>c'Ip晟) ~ /y~,^ , nڵkyǹpW]kg[V1eq|;w.rʨ)p/~1ϨE0C]7\ק@:? GedgYXlFw?3$yJii0/ jW>p+9DSM%NC~z@L[lYx !7UkACT)Qul_^OߠrY.%;{p4濫c^Qw"Gn^ıޤ\C%a$7GA tSGfpIP(rV^UwQG}oU$d窜iVs?路־_~e*׆]@DW9l;3+z U-^^xISS#17WaF5QDsO@LosU ZH=CaO"r)s+5 IDAT-#}/iRۇi;(c7F*(7xPH-"X^V\ɛF6mXN;;;yOA}?;*0u4N>dnbɽ|A=Yf̟S|+lb%\z1k|9/v>CoPTX4Z2[`@~9BvWڗACwOi0^[Vѻ\ϥ{ 5Mx݋ݗPa':s;ty1xC ͙Ҳe&cLiZr$F+XP՞(Fps7lٲVg˖-u3<[oUO- 2>]=Gg \T~jW,@TѨjNծq9ePdEͮP [lA*Z\w3kpCU(AC/%s%TPNQ$&*.H㮖4?O%+DdܧgN!JK;::~[rٯ~rv%p 74ˑOnꋃ?>^{/yIcjC/[k>أ>LЊl"&\hDڧ?MO>=5KmM RJ|eݴOv$&NZyUk;o`a槓$yƣP3 i`w|o>@PXEToTۑx˕( Е$ɛ;97ч>chB{~1c_~9K4dƌ\z*+Zy0W?dUWAvK"c85@P.}_vP nd4^)Ezi<Ӵċj%^V~S1agSuaɸ0w࿐+T4OxIƲ/>8?yU6Fs։6wBc.`6(3dƌyq:[vO9EWœ9s/~Y쳿>;.?)_*Jr"Ӧ$E%~OUD\Uc|`:hkg'J73A9ͦ7L蘼k,N2yPmA4,x9^@Ugo*z`'Y_$|i kXnW Y3< 6cɄS.A`y gΜ^q47-֮]>?~\pAqg_8wT\I}Y ͛wPHy$St3ϺaUOP[T4ʊ O+b a1y8(fo&wK/9*WܝI syt_Yi;ˮjr EƘ1k֬WoiN. EaID X:l}me{wQAӦMnX>яxqV yQM8{'Tٺr&]U<5U'xʏAX*oST0Wo6gg1?eP鸲1;Lu5X1N( ̣r*f5ifM:p%JqYkJ` `EE?j)"%"A{aFev֭{nӟ[;{ߟz3gNS'>b}og)f$$8P6'$=&]m)herq@UǨ0 ~ȉTfh?rHWᕘOS_bB%jJ$"K$91z;D0 Ap4ӥ+)6lr| '|;ɬY}5~_am#<>ϹL2YYfXDٔME7 |UpW|QP";33̾dv[GUNwIw'zӟ骺Ut:9瞓и,Üܰ#uE*D4!x0YHEUA>Ԧ[$;QZͼ״ˀR9az;cGJydj ,x)) X'.)`QʊmW"1g |Z Ezzz@[[[v֣#<O<ѷ}f܎B8,YwycK/q"PqO%/pQ0gnw*׋3滥0TfG}cT_U͉G1dHr#̅^.>?e l2WjUB[k־=  ihh\ȳU+YnkGQshV'K&) ~ľ6pQ*>ʉBx!iAE. LѤ*yZ/*xfEԋ4y|"bcI&yſ/7ː`{`:2>;EvX4`Ej\{ kjժb3f>o)>܆r>E% nAFg{kveyn^TI8 .~O?PPir>D96j$I鿸D/ő̓ cLCֺ{o/jY㎯CQZ'jVkR;T5İJ6짂(75ZmZr29P.x$ץ>J&)]JQP@խaFK$9fߓ'(.Gºh9>dp 57bɒ%Eۛl2UԞV3GzeĦJP'JiqSfW:^g11RRpq4$6 )"r"@bRTuvP0`۱gĬ.&6M)R1v|t$.~OR“8s<FE]|[ATs;V*13g| RhtRTy^ӧQD)PJ\-hWxQ2CxiROTᄁrs F1ੵi;L r1Ĭ^}Uρ@U#S|z^9Jmj$P$~ \ |$0$7D }xDH]r9T7FQ0 &'|N+={캵*)nj*4d:~7ݨJzEHqkɄBP(? D6|疈i(TNX x!%'VoԀ1 JL Rԗ^pn-+EU{OBx KM59 8|Uw'H-.Ov. $M{jr47|OxԞR1: Bu#=hX``Bf!sR67e ^WP1kQb[Tu{=_9s'K=Pؖa8YVT pI^I)~՟ԧU"l-. HE5zkvirք""#Ԁ~**?a M?<;f{,cT! xW eP͓IDP^QJQDic. aB, AT&7"##"?7T/*5[Uz+;z2}pބ OG?$|DaG|r">3g<ӦM#_\S>(q|y&*v5&|AcThSIrR׋Iv#R |Ŝyorw/! ޤ:ފ+jmm]ZQ*HzzW4穱q<~L<̔fII"u>9~3,M ^ƉM5z0q#Fq/ !J C(9vH)_aKc:W\K{{U#XqhQH*>} YT?kJKW o"C$RېY^x0 <_s˪C yt! }QdϚ+TG$9W9Tu#dv/ix0P@eo:3U-o/nM7 ,ua91. ҥdNX؞L@ z@<~eS%u 5iBHJ5;Ƹ\^;k=jsqZ t`~GDCVN;0v'gM&>c= ?~f?A my \mV+vq'V{|vءȌҴ$!ҳ:GwӒQbgp=BOeYd|@F£x*{*ۻsާ@FL,H,}K3k lRXq_'DdGr\WI* o]&yyDDJ?RvTƸ#K.v֬ԺPz!"X[ +J~]{ veAFgܼy*nNC Qг޲V%bD݂w:Qdah{ W8`_ic>OeC|ŨZX+eNwe1+.5*"rJ;՚g0r"rUZT1l.V%ۥfs,XpR_eO- BAP$Jz!:: U۞?>1"DgNat[|!a^kXr zV;c#Uug0 <5X&d{zQ wW1>ihhx#ڢIɜZr;@p`(׿Y;JyY_?c&)-wXz-]m9^c&=+b 1>Š _j(a!a^CKUD ݕxzwy9 y:#eMwk^V'|z>?s 1{$k"RT-Px`$ fFo#)c1jvzUlBAsm_w]]? sn ^м0S= =녎XsO+nW/ɊM=O1} cy_EP}B9z&'Zl/z L0ފQ?TUwn jS ܻ}{dj ?V2QcLWKeԎ\.ԩS {bk'"r;LDg}\{"WyKT>:Z391 oYa_J u8N5$"JqzJHs (O/*w8<ӌM(8} 3m[xJ6}SgVqj }题"25_Ŋ~,p|vpMlyڳ*/>ZmXvrmS+?pTdl}Ho0dJw$MLaM>ظ!4x*=sb ]u/7a7kk mKW%9_]aV9#Ed{0 o/7&Pyoۿb㜵kc1gyKC;"[ƽ{n>:Y2nɱ>Y}2R}T.!S'VI+Y(t ff) Y4ŭ]`G9_Os 1fz erq*ϷKϣ>aFpfvdB6l#:^H7 }oyQ}ۏ>(\RCen&mtAA01!v$?*iHJC(s.Cm=!k j@ ImSra)ѻ[T(aT949GD^4.P[e: l/co`ލ׽u9wJگZzjQM38Kr޾O>oZ׿ڰ1΃ fi zOƩgXhGk^̱pSK]J1snhQƪ|n=Js FEo"i1fL@U@ac3e59Ť.͌ 7<.nS/j<*"aX,X'ܷrJ=Xs5 _">lyjrѣຓ*q9i 2'7*Қ]f;Nq+T$OGWպ9DK$"]Te v3pu '&񀭯cr9@4l<)1Ɯ+ip_b=۾[g?۟@[EorwaGoT}ތGNn-F,h|ibf$J2נҘ O+>; c6r}"c-z|XLڢ_j1z IDATq$ 4L@ ΏIL/['j758sfTK(ܹsG@>/_6y!"wȓ"B~aCC^z3gw饗pq3ș'cN=TZ477se2*sf D9J*CyPA4ATVUaكY[VͶY5O]m9V,io8lBDjXsU@vX358 |Uy󀻀\4`/tȨۓՔOnkc~>Ԩꗀz뭹?1uj=W\TTZ`,Xh~7+WzRA6:oZhnka5R,yZGҦWHU*;8TD3|wR25O=m/98_+ӹij j=iߣ}MWo}Tu{ ܭ@&Ml.y\s5\sM?>n;s2mT0smmm,Yg}lqNc wַ†cGwfzZ9;XlvbA S bCU꨸fA h} ᩂxԁB?6!Dl6wmYâȰ-|U{} Dmvs-axH?f!:mRr|IGxgx2j+$GCǵ#O{y8 tASTby w3:R_mu#cUojj⬳c>9|#1==܈+"]SNe]wK36-u:/~l)kJ|h.-cbDLˁA07̳:@ek1h8*NptX|mœ bct]‹OϺﱻw:i>DQtpZ{QU&9X=!%7%VyWν:^^dj \1Ƥ_217,־ZD֔{p]qg.ps9J>?*gCV~ 6}³Xlu AL8MzhihP! )DPLpF0$N>NywYV?=[RMf~Kv-~i>{=v9U{8 \ڔEQ6$tKءTF89w9A_nޯ?kƱ9m+Q,?llVlNqZ3йUM'Z?t;v `i]~Fs0vإ6U /V&22!:-;BU rkHVnaך;=1&\36^4X㘫bDY -^8anͳZzETL1A2& !^aO1ObbKē k3WT 0cf)3x֎/O O_ȉ"r>n#)?<Onȵ21Nq\OAr q_H^{~n36^|g'Os`e3%Lz;23" rFxLIA1%up!f:4~x6ݬZ=_Ux饙KV-?u#GUszP7UsBs[kw >221ιU0 ,YE$.ӬUiYMTxfzY/CFvhd+2)"79݄AoMJKGJ˸w7ނQȸsMSȯjLQf5 Y^|~փ+:# TLAUzQչz`o531Qͼq1Sr5̓zZibu1zPսsP^FQYqΙzw4MpYfLs`FD<S0D@oAמ{U#ݫȯ͡ cL5X{{#/4뢼}~}UEU_=g: 짪kcqL@edss.Sǃ #m@\x.`okvq?n u1x)K3"W\I39#ܬZfUQc8Q&;CyC9mj5 U˧v.Y<{=yGbOaGD>ci-慤Ϟ~ZIL@edL By Ǣ(|]D>mekAXaxWyYizcti6oyc 2eZu|~66FjUYSWWϺmoz%{eU.p@uU([6kkDz\|322PMPތ8ߔ{,7? 8"iI&Z<}ף.#,Y'LI(`ٲVVGS<[l|DZtٌ+[[}W.U{i35wV482Ș 8\ZGBwι_7ZkY|L@edLPRW$ E1k.c(\xޟ87DA}ďދ] ڤH\dTM^/>B:{70j(1j 8QV@ULrE9wޱ wf0,craxRxO===QsnU}L lz-dIn.ݝ#"ΪO,'+־V=U5ιEdЦ'򌉍Аw uUm_|Z?53\f=֟em[F$@D^V|nhqj=NUt8׉C"B11FhllO=]<xS݀k1hΟF0@edL"_P1IDt:hPշaxG͍#ROԽ":U%\10ADc("DA)ιO?^J{t/wIVܽ^DW{rdkky$ۭ% Dqz\[1%DH1(OcLE@wGB<9QsuC% @edL:T)Tu{ WEяDDڷȄ퓒z&"d63&%U-ӼͨQ';koj9mZF$CD1{Jc poS0a8 Eא,fedT$ ^9AeFfZ|>'Ist SoȘ"U=dIQ_a\d=x8{ZY NJـZkð&eda!1v; z5\ққ;c"" ՞s8d!Is}jkDrTUG vV|>)cO{W7edԍdlְ)XBZwe5S-wT[a~$#c~CU zDEQPU}D^׋眻^De2F.xc"r:5lҖ){744/h҈IK<8oV݁?Zk/"7ˁȘ3?\UmA\!"_fzW955 RcUJYFFU ðMD9viK L9{c*~p'TFFӶ-z/4Z{&`jk"0|~IG`Fu(L'g;c6m#AUq`kBkiH~)fd C.W{Z_'4ULf者x$[HӍwN*#c9bCU?ʍSMsȎڏ1EUt4HîGDg=6isqUTuNP{YUhOUnn~ 47=GsC8粰FN#N ܒ~?(Og?5 X\aDTFFW~9 74{VSckRDHEѤI&%SՏax{lK S3 ÿWk|>[x bk'c >su rJID3ƼCDVڠ;9.צı\&&; K\g(""WT N TFFFTR8o*DȢZ[;T8/Ry"c j *"&!DjIk-֚3"rvmFU7ӽCDdy5抢JM묵GH{57QYDfXkXɻqgU} ok"U gMkDID K8k_g]mP^s GHG5J\4w 8u2{31lzzzvCZAlV&K;\U[D+}A Wcήo1&&-Z9!JUib$"KzF1"Tu_v.ZkHsHʍ sKWx9݉\+5bLQU[ku @~ 4A^{2U=m`1:+DU}2CDJsGp%ѵ[qeB1KSqꫀ1&}H?^I keD mb|~PU[K?=T`2i.!1"|>zcU$O|NƩec=D PLoq_,t0I~/c7UzEU82Ƽ: ~V" b& &UUcbUZK($9w _z4bJUzB&222Ƅ(+J{zzv 2UX |*jeDEUq9PUwV-H8+ZqWhQwR`Z&"; rY_#'iCg& HǟUMF~d*##cH?]凊Ӄop}+m^lK'Y=Q-(z1f_BUg^ ǪR7er >4'@Qͥ "s߹\h{%RF[U{k࿀.RvOTFFƘ5IZzos(l79C|,q03SUUI[*&Y!"kUuXD^?<J AUMǟW?Zk?)"z(CƘc=D%PcNn7EbHJ€6[:綌x3TD65ƈ'"M:%}ZUUDq0ƬUWK6pBU{X|.K0OsB}^_Veddd ;s+sꜻYU7(v-JY&gdl8rέI.R՘'Ͽ{P:+Q\y&ɗw1IENDB`KDAB-hotspot-41e5de7/src/images/background_dark.png000066400000000000000000001560761515036260400222340ustar00rootroot00000000000000PNG  IHDRP3sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxnײ5Qs77 u۵ o<@웕q$:d]SjQ.ѮPW^.((""Ivĥ9 V".gzI'˱ +PDD*05ב N Ei PDD*j@9N~"KxDD&SCA j/W<ؘh P;yDH(""Ao5žܤotwQS"y5(e Im蒩`X""]eG!G) PDDM?E?z^7 6vRR]9D~܍ ~DF "㜫qA@D̝x @NǸैf53@+@Ѯ}M0@+ PDDkj13 1@΁""=!}7.t>@ΰs{WPTպN0 TR=TM@DD;Q^^wz}n"{7hEDDIև#Hd)H*TMUmTgA+PDDT~twMH]# VnD.˥- $ ˜Vjq|l/E@QjIEiʑCUH[ȉl鮆dnjxu5sU/4@& "r. NSkZU$--umw"r5`{p8"jFghRxh@Q)i7AHB㘹O$VcmhwEDDe2)V3+Ow4`xBmU`eug\)m;VLH~>re2\ "Lxs.Q-rvH⹁|/^ $JM_QT1\ >!Sw"rR)EDDt2^(<r"""*7;жc89fb-Yy¯Z @w4{hca{kޥTյܯr=Tn@F5 $6x@8~h3h. ""ʂ9N2X2UւTEѠhp|M%<""Z 8H:Lzl`fD _@sV(jux*< -w47(""ʝUwz / QKw _ ISiw1@QT@HB t[i97w3-U,qMT2 PDD Uja 9ADrY*|yN3!;ZeNUv=z|||kv3Zz>@q&ͅc (Sz(xѦap#" ^75UNLn|{N0 eBU*D.uMV|GDDD맪{ڴ|Z~W:wkִf򋋋{~)"Vh56kG2y)"|%2Mnb8j~|hn""XUba٬.C9%5 h@l)0!m*s7p(wrQX""Ak /_X?j/@]^^"yY|D юQ=O =7(\q< p Q=\IhAIM{ι7;l01(v?眫A H`}vwh `1ԃpVUmU=M,ן|=Umq|f!hg6sxi@RMlB? :=Y\UHz\A &ZADTbV) O&wOM_uD;JS/Ax:AE|OTɌFs"""PՊ6/..խpjknm%<"QJE;z!O"ܾo PDDba^v:GIs9L^y\ 6l-L&O|#wuu VJWu'$4W޿?K@^mZHtG4s\*<<GXQ&xԬ'Es@X""~Zc|xZ?J0~F("!}}$բTE2qm^yX0@m)U 0%5ߋI `"Z+PDDu~~ϰ4q"hfG1@-Tz|||ɛ4@a\ ιsNy| |GDTL'ACcÍVsGni'g>$@ 9€h~ PDD6:3&?j1ucN("jɏ0OD a""ڼc$?L93HzVu \yJ|5U gD$Z6hq<=yZt+" PE)-ȉ6Ԃ {)"w'3q:e(" 8六($K 9(" 8hz.//GJ'"?QCc8f#6cl8$C$G OP+%F&oBDDY& 3^li/@HU,elW_D~iUND&ݞhl"'"ZtϾ-H~Nqx2~4CHG8_n*Aه' 䇰82}~T@Hud\89W GxJ=r!0 ("5F=U}<Pq=zwyyYύ h ~CvMRaUuΡ K\*ι#~{6+PDDD۪6Tm;&R3][Ukn8۪>EU1;ObQl[qӫ)^#mi@ `_}^h4|~TL\#"H͔۝"A$|O}ܙd4 Ix{MѨx D PDDq܇'dh-{T~٧O..ʪO*JVnTl PDD9Q=>s("q0q|dswOQ*aV(S9GG(Ͳ_"" ~'"76!<.?|/?DҬ/FYEFREDi“!cPQ[@nOUl \1@ekldvk7?j^jݎy|GkEDIgTf9i6@{8h ""8$_j݄ 5G#g5mǟŷuD?8܈vNjK릅'ݙpm[7@U|t8϶sÄNDqs,!A7λE`K{[p:i{%h Vq|djwn H|2gh+jle#Bm;Ni%"Zh xkR= Mwލ{! [?>J]_DTznkIr{{{U5,ߍVޖj?ӘD\#"Z5M@xϹ BxY"}ymVADT@ a\ǏW9Δ 硎>Ó-v6|^d ~%!|YI_O {.]*,<|)t2(;xݚvQ_vVf' cO#/}d[;S lk@>gx @ROc“8 "7RUCDT4U(EFS lAHi4ml+bECDT4Ɏ~ YI4<ȴXv|U"lw^_U.//DN+"C9]bݨ̖OUfQƑ}78O nv8h>韗V2 PK'y}m;, OzI!"*U\ >`("K?-R(smO OƟ/~D^ԁ)ʪ'O'ǹ⥯W^'~Rt:E])"$gς2VZ(<~B<OVތTqR~2?QQ>^MV|[8@e駟R9B9?ݥo0Dn PDDmU:GYe`]|'@FzƆ's $CB96(CDTpg^痕B-|Cx |nv=."̪>eYJqgHx Ur Oˍ>5brcS>QA0@M6nλs-ٸ*<Ƿ[jf91NWO("1,DdY^[Cx7qYF1h6.ߍXd\wk O~rǹ~,&XS}Rz쁢1@7m "^|5kH'߲2tmyয়~zƊWF4шYwiF:* Ec6`&sy Q V97( PDDoͳ|V5m 't:־Y7viC@^;*("n7 Po4`bTxVFY' Ddn$ Q^ s,ߥkx OMHMWܧ(DNc""zm;o`Mk.T  Ts3O﹫Oiz}# Qw=q܍<2<@Xg;U=FTD߼ P{(w{"Xxx =U T^Ed86" >~vJ'o'+PDD2^$4#zMU= }$8M/էIOT4@N:+-ߍ!JxXz^CRu9RU_Tuj]KxBIx㘻h-X"]9O|TD/"w ձ|Njcթϟ?jP}C&oO,߅aoE:("iY쾛0$sNYȃ8! jKUU=kǏs@Yy9|Ql"u,U8jq/|7e*`b3YyUR}9UK}OYL_'#g- IDATv*"":OJC`fNj^P*z{2> hg|7vq,sVDTDD^wts䜫">"靪ꑪ.qVz@/cWqaCBۢb"eg{0p8f9[D=+$H$`1 qky }wAd^} `]i1@Ѯ_fݼ H/IYUDZD:zHQs5NNa8 y^|V<4hh'-|Hx`0~)jIRc$8/>(U4=BǧB1@Yfn޽[9scIsFE-U= 08n3/.<"E [&<4n,Gؙw^'튱w9'`jhZƻի>lG_Ƚ)#h-hWY[Cx6Oxι!›>mʍJoݚdx(Es/ `0!{hZ[cx6 O^^UZ՟fmEDyn XsZ5<޿A峵W.//}wHYgxBjQ?o3 O>yv6Q}jl"؛}"b)%iY$nrߦ{DNb/C_ŗҷdt DEDe kWm"<9AN]9},̎STxr PyPmTcױ@Z0@Q<79`F￳ro0"*-Um Cw"'Tع ?^WA<w?Jšty #$&+aTr@QU`!vꙪ:2@3-uۂ2 PO@sC{("n6盾EDd;v}xqA\WP OU Tu?,fwydYQ{ϟ٢Bbʪ fs0Cey v>xeii O)Nia|qӗ@%EDe ǽQDTD Fc@KUv-5 "S# = (OD"z=;S giEO^HzǞGX%W*kn'("* S'"f؎ w-Wd&-][u;QiҤ`"Rt:U@M#"O"0cOUWٱ7w*`x]9jOD45{6&rR՚k oy+$4XOmƻ3W*bxJyܫ )";<^\ңb"PYiIGD,Hٱ&uU]tUL98@%="""{^3YzԟvdgKVBUvoN/mI/كzdy8DcJfc/C<^yJv-PU iKz5,鱉ւhYR;zxٱw`գ 6j'`JRP~j{B2kkKzl"\1@Q<{_OرPTnax q(_y[Kz_|CMEDݻ,M""7A\CrXq^Z} w$*sIWWX(W#Q=W΁ZgV =h4?uYgm~zwߝn7Tur@o"%== 0ay(+ PDT: VLN9p7j߾}>ppꃚ́jX#X"9xb09Zu'h]T @_Dzs(G튈H^~nsNl`5r Z~ioZ>y84HDn?h-Tlɬ ц^nԔ;!]-LV`Aϕ?"?zѠgcn˥]{3&.饖 (W PDT*\p/"כtxxa^"2PZ;i4>)E҄~P4vl!fT_Z,"ng]zI/DdloQ f;MMc`uds?/hjӧOS7I5m1-7鬳9x+PDT*1/'oIDT "rZf 51W#J]ozwaiK{Ѥ v^X^[tI(ZVT>| Ԅ_NxU%"dpe*uJbϵE8>΍sNs㎁/pDc"XRdK(Y)"2g#^ɬeY?v+ 568Nx~G P FD!fj`dRU0zw jjn^o4׋nHeheYKzED@ED>w]9-亄7ox2f0  tSthj3Ę$|{@TpKz_Bxb"s@-RMSm2u'Y]k㫈Xc}JU)M69Lz];; { Lr P Vv穈 tQhaI5-yqJ*8kaοX6'R:I;Č"rwuuUÖOKH4 | x= ף}h7EDvex^?Ol>4m̈́m_1y^9H/YC߱w'(g PDT f$G,~YɥD*nʀ؀N$+!v{;Eݻw'r1DT z$txLÓ}Lݓ5ZgFU: U[k~*Z@4("z #<_A0^ U8]]؀N$Eq"9t߾ B=믿j%@+P("* t:Hx0o |[蜸"Aj@-^}Umo v90@QTjZlZ$+* :DUko K<o1c"2kA .//^eT*g M}N:t:u_AI:b>s2EDe03@ngs e_/=l~9ul֢(ja6dӇ`Z3wQn *o PO@Oi$ϟ*V(j.NvP " Jz უ(眃s.4ǏEDD4JUwdڪ۱(Z8>ekCm#6T ;7ǽh@QWuU? uVVB5 褏 ۵sN_~=?|_8.DAC) PDT?9<ΣY;j*nEeճ{" _|"r~w'z?y5CFjێ[˲]_ZGQՆ;N=ʂ~Yn첛EQԲۄ~^jKzbߺpض" h4F*OPս?Mr fU( uб&> xKaس:"y^BwQ. hN# 6!z2^CU^([JkeiVDϸǏ aNr,0@%㺅K(m;sl OFk?jhG'H~=,ODTDbιD}cL1@Ѷ?SzӖ U%E*fk7As$9WT PD}pl eM-$Kjpl6{|(sà]~:8$!jA Eo&"v8??' &"Nf<7Xs kfmlTdőH9˪\ƣ0@Ѷ{߯(m-UuWTb|| JDV  bK0{$]>QfDD/m&Ҭ2 kBsE$ZObᭇ$4Ր4pDb"mg_|w̺mly2X s›F%İFr\#VEDncbcOi?ýȅ-ٵ`u:Gl2 A%$5"A PDTy}('Ѫ sꍻM3G!"Fx EDeww 9"h{уB PDT?_v|r=m;T"oZHZrDHD45O| w?ük$}PzFHS-J bB&2:wYIUι^|?9l*;o^/q󍷢v݃V}sMu$3ېEYM u DǨhڋl6m=&8~4+PDT&Aɏ+nt:Gpqo;(A%EDqqqgpOViڼ*Dz4|D~7ӂ43 > 8(&[pl ~e)dI>". ~4l)cHD6FsBK5BoLL?M r`$M7g|>4朼o߾|[f< r`"24@}O3΄5X>l2ec%SDL2 PGGGEx@pbkLnp^/KSJ[9ѦWoN"]q Xj.Ҩ"?@7kR?"r}M?NDmlY6D=VϵX"R ` ~*gIDn[[ IDATsB,啕}_Eq*""BQ*6WG򓤱UL&?i/]yn Խ|\j=}$SCX"ɪjcO;O]_{]{^( KG$!;MV?5޲g[Nfpyy3$#s`"Y9@YXko= Y:@K[{6wN^n-Y 7c"ɢ埴=id39y'N*$?t=͏&Y7JgsG윻Vtvf oԿ$}Q~^z/56wuJ^ºsP$"/p˷iZECdCb`f ԺŇ'h͆?(շ^TC\^UED%;hٟo` sea^L9yʻ.WI b$˼5YhXTaZ Jdi#gUuv[\lAA36}]J'"sl FTUsM+Zhq \›` &0@Q åFg|iQ5Pq'!t)'"rAXU("*`ԢU 'U o^ 963+z=@M` zzts^|tRcE*ICl0o,uFCN-lMnxEDes.n5<@𳙪952jN'KxKa1"joo/nð@ LXz^8&̓sF3"*QUUdy24ƞ2:˯TAsDz^e>\;Vg_Ţ ;6s8fd郈m"x3>t:w-g!U2:ZD **ۡgj>=t:+?mޮ[p}N-gjeO׿tdaKyʁs<8 PDTVs/_dgO(4bD ("*'6/v@oWw:H/sVB)X2"F2PUyZi-O, Y݈P@ʁ}FH~qEQxj"@әs<\5>JUYAwr v"U 0@QY RL9ډK$~@pDII...)#|MAEDd[uZͅ_nKL}"N9h\*> w3X#ҊX0l$K 4BDU1DV6@DUudV-XJ+ !h'Um)w|W,F" Co<("*;ڡ3a; /6q8~Gż0ٴQ ?}/_,YA ]y["C/ zm%<"*tӴ&p; 8޹3kVѣ-bE <tz> 8 nKDv cѲD~ADDeqFڲOajɂͳPUI-YV- JU%]s VYygy'-A< 8vN?xWxxA;Ku~sN?Y`Aʈ8D2}s<=vq}"f"F~~M=tt[A PDTvx5h6lҲ99B}(ЊASʂn4@MjEP׫ vyOjk fO:Ng1@Q=IOw5'\n/(U~@UUTU^i;YR%x9f_zV=*8Er'?Sa7A&z@...\@GdϖTTnl _$9'A0߸. 85 !snߪbe"RǏ󻣣0 +H^ 5ϸ[?[aj9Y?{NZT*FCs E( {d\kEA^>JmVl)Ol }@!"$U`t:3(^s ثj2^ y=WWvWd$;,&r"*=+@omo!6_䧟~Faԏ9~y\X ܡ[i6Hc$G,m%("HxlL(Ր1@S;uxd 5b^ߜDDF^8"9? cܙڡEl|?8tL5u+lE-jYx#ǻtEd{s#K|On)y\\\vɲw(&w"%H~qmBh:X u}qAtM믡-nk|_7VhgvmoFUPvK3r 0Dl^ e!;DRiܚ+PDKLmwGbOȽtHFs lk.{$_ _B?{%K^Չ#UUΩ>`w+мQ@Ǒ10U>`)QkE^*xQTZrZ[ǡϩ:YU}_TEeeVfVfVFT}?kժ|DF="rѩan~o/E C**@FYL͂A04gĉ&":m)qdLT@<7\8`ekkl)&DD/]/2%"!Uzj QE^GNB^?c~w*ZlAtD$ o@ѩyMIREd8K#@)bQմ8e@֤Y8#Fmq.bd à&?uR[_gThy1dekk++j3EDRdX/={67m /9y׻-"aPDt*q/Y̬KDfxm!ڋuMIb2emuVIpN8KS fa6aU gTƜ'"ޕ+W=l":T`5%@$kwif AF*h+~b89ctGDޟ(f4 dJ݂$/"8*- (f_Q gj3(":8/ADDm g67sm\|y@YV2>S j5V8GDj&Kqض}m=Lcb!^,g%U"ӎk%H*<%q|[TիWYp>5ѡXe?,j nAaT l$OD?!j8Nx06 'D0ђ> j"J b Kb4 ZbAD|ٶmYg2e,8H<"yYYYlؘi/Qikz[plh|ێ8sʋ8"ќu89-|>3ӽjX.sUG ?EI "n47k"k UμSUeb!E3?woF690I"ܖbQx3P09hb13J {q-̫v(""웍f/ c\e,`NJfmLYA=ܱ1%"BP %?B1BKb30j˵ZmX Ԕ-3""a S`sn@X,3=Pb*ѶF"9RՕz:dPUKUWlj*KQUkcc6Ǚ PՌݬBD4'hN6I3̵zc9*ZP3@j9,k h6TUP 964Ɯev˱ 1EDCUxDxHOS73"7jg+2+G0+ok2EDtɓ'* Ekԭ`dNpa̬&R|(A '\`T2 \h!Ҙ^^vx&D4x+++YQZBPceBN;U=}T/ǣ :Nj-˧1Yd8ڶ5 ,&O0h:xH1Yĸsωά޴m[l((">¥]AXL2!ҿlx&# 0ٙ4gc"Y3EDԇyض-p f]8\""ǁ,րێ9x'=!DDVA!y{Comys}U- 2@A.g@0kMs@ ` }qrl&S5` 9v,Ҙ3\KVLc`i.!۶mlifTJRAv&+'dI#A{i'j̓h"ɞl{h8&B#2OK4M6'LkE]S61fa R'eX)7Ɯ9 ƜKن]CyS`_qd4Z"=T 2ie ؟t"huMvlN@ Ap%K)7e7LcN1'eU]NJ0 Hٓn0bqI(;i:* My{oi@&d*!lf5Es"'Ҙsqu0I]# "F`dRI8Z'Ad\9UuAT18yU ]D|UTlUefFnjF70eO1'N"9EUT:R)~8؈b%\`AA8E),/`H1}¬.PFLHwSahD{73(]3B'1TlaoI {Fd(ö$cm1ED4&\ %d+++́ NLcd{\U~5Edg1ED4cUA5 N'Ԝ:mS'cZLmAΨji?o#^\'K$"1K`gP3RsڙB% Xb8R}#3PDDk+hv&O 9O854[X,ZbED4&Q۶[0=o?4pi}E1mYTݘs^,O{"iX 056_"⩪yh#fV\KޘSDTUDTС lf6b܌ODDjuYUW?$"̲"&{H JR2UU]gT0:O~͉̀viBÅzɥ~ذwUÂmM >T>^8s,vH{s(`>1MA#nVKR }W"" !L :!Lp (fHVJ%q /fbhBrgٶmH]i~"Ap&i>w[5ֺH8{=_2""Ȃ\*$"K4D1aKЗy\6nMRlL` lێ?.>AF+"5PDDSiZ)oBPT*)˲raNĎmWU-p %":>Af^Jq7WpU*rGB z 8eOq>Gn5m/>ns`}ݝ]W3Yc\2e}/8wGmn"(:מǧMUB&10 eR86 Lל#][__wT^ë6l&XeL`T@0hyEPDDSoFy!)XgttòhAL[BDfWu9ɶr9nƜ;a_TJ ,R]pHJahr,Pӌfxq#;b Ĝt2zfr,jHP!˥] ,WpgED4sEf{~e4C*^0aj.//WYZ%@/"yϨT5h&h\&hb)< P)ָY]q)ً[&%‚sPDD#0EaДF,mۧiކSQ3S]bW|ERZ__o^wu;sڥ1"" RӔE0L 0!TgzFfN"ac Z/{ΣDԡ?tQFA1xR˜Sm(":UT5STWWWM=O r$<ʕ+ ǾcHomm-TOTNU=߁(":L<"ۏe IDATM6QTT gDPdnd^`nB D30u 0="-@j"˻DdVB0mW賟l֜<0DOEeWTuqh{oɇH^gy(":QT5]T +++ifhdvح|66f̼X59eED'iG`J4khz)#"vQ8Z,En߭l={66("J4sZ@EhlԚwY5]Ц4:eEDZV(Jqc;wʕ_I63EF:("J/`Uazq+Q>c=$jA+5ϙyGDb$Vo:{)q(ViU]{("JW (v3!$l[pYeA 1"f(T2Ktf;V 'k>,uڙZ'ur"Y'dFt2qEDz=a2 8m (^zKD&Tn։E\=K”ba]Vy&w>PD@p][[K :N"3uxZ.sHo8HS. z\T1cE4gmotԻ`)fĉJ!Sy)8>02]vZ8vK?tm zhB u.:8Ng1 +ߕxm`ee%{OՉ(Ĭ*NIQ[D0drOt:ҳY9T|>4(z*aE4?m f ]zW A)':= Xj|N v"4 W:z\,ԉZ pb։NLTVU=U.LZ]P؞@4Y z$"_,q70ؖeqȎ^rbrzHh8lM3eE4'kkkUf>:Eǁy1x" EQG"DījT*%aqHA:$Nĉ1OD/bB`ꝸQ?}f蝨 J6d2˻dl wԚfq!h~fB" *> j&(ڶ!;!uQf=,ID ד}1[αS/(gEo@nViY1C6шzˋK|fkkk ^~â anQ3`Hz]@͊oy~٧5\S޾LscD4:sU`GDCPtGmۮw,;yK" 4 ,Th40 x"RQUsW7<`ԘN'8 >& 3C'EaPh:z2Q=̗(; Lמּ٧}:$GfM6a-bqx^!huk۶,R|hfδiקDG4?#g"g s L:AniS@hVʓQXPbѭ8Y8&DQr9F3^L4HAa ;7Ϭ5zuNx)Q,q] xi[DwbVBi-R%Jyfݼ{'w-Z"d jcN&b\E ݦp8YA `p"l[:&w`RYnO9oޑcE4?rQjX{ā`)#O:,IDD=s%8)mUj۶ *:ܷNI2#9X !)Y3XDP.,'J83\. MT~;gu0jO-PDsߗ2"=34˂Q"E[+N ʥKsaKRT9oF 3H@Qopbh4A=PXTL{=%\͚N'>]q#\LI;jø1"#۶^>[[[E)}+`D|a|B$v]2ifmAN(9rb]WrxL%2ŦK;dߩx{YYY9bLj1"#۶qF-$:P&θ#:qzKsܕYZKDmo!-,#8]'uض U]Dp<*ƌ^L1[*RG h脊AK$] qsy^gȗ(9* S;]rGta<3&G:iuO,':uNdkgώU̙3uN(0G@-HE"ꚟ5".lhźp ̑afd'S%JUs=6iDDm"_q DUa|XQ#y fD݁ \2lA1yx_QjZs5-b[hRe:LAt2}" 20G*0fM3ɚ vN\Rܷ 2Ḱ qH8j N1q * &Ċ#dͦGZ`F^##k!"MBЗewCs%U=voynX8o`x†Λ#'L?sZ"R1-b"JSic | d{f2W QS;U{59 ^̡<3kn =n/T7qVlE0E4a٧ADzXܼ {Sg2~dltY0F'"mmr(ce4_n7*kMY"R)^vgIdroȤV \EUekk `d|[Ν8{ 6+U]FP^™`٥+-Lü g Cg&|v8Kw0_%3PDdROO*O A/hHvzo ,11NOn8nUU-TeU]T.VD).LDc9 ;ujv8|YPDIU*OR%U]p@9q5WEyJ4 `#(rz{lE,FN ([iXYY94Jd f4ŢyN4]|3Q`;>h.\(`o*ivXA4c~$m9ɘڨ;vm\f4Wdn#h+{ )VXlo@af@*Jlkh\aqpb)l3Rk#f+X3-b6L=ԢSne+?8Nj5.BD3,5Մt@͈٧ ) (n 8 TX,- U׳m[J%g":A{ݏ8׈\eBȠ5Baj̉EFݦlQh< m#H@X0Dtmc=ƗLl {K_M5dE4;a`*"R]w\*p|4=I/_=90v":s.?k| ?׉\ͤ$r`}}QŒըmS|w{^p!<9m nվc|٤f\f "lIp(YwDk1-e9׊6Lbte@%(Ủ@dNjuOnʜAt;_eRB6B& hd9]Y^P@%hѸm~ }":E<@z>[EV? pXrWShF@X4sJ D4ON|sܥDeժg۶Lk&(Y^^9&( 4[C6O>74O;w{?s8YSryx fg 9ͷlyl8h2?}K[adx|p^c,/ {\Lu&(8~WOD??~W梷__hʒf}~߻GT5w#cJ(ΊH9Wq"{m>@|+?"_׽|0~9?[o^0+++,"'9mLDZͷmiI""V5=~%o~O=~W -k׽c=- bO̾! Yj#v8aL@j{AVuMDGD1a5_{>{?}ŏo]z{f8\"`rSQ.=SuT foh<¬$WwE d}װo7z6XwhLCMaE4L;/^ Va%O~Yxn my3~h[$Pa lSnŋljN~]RJnZ^}ҏ}ޭ7M0"A5PqCc@oJ\C,@jyY3@٥KPZBp̍iW"f?7-\{O} O7dEgwy'`ccpE쥷"2nhQRԳ߄Vr>m`9Coyߤ=Ø ; PD%pYU\r1,ӯzujmr݆+|S$fKlj5&0"  s7-{G`)m|֯Ao~BH.Y=OS:(7( 3Py/"#n+5DtΞ[XP t 7üoZ2oyyK.MgE4{t ;?ճX)MpyH.HHa r~8.Q8Q>y@ f#ZHyPSD4]ԙd֢c-Ҿ>F]Sh6ԝpiξ#J/'kBh}įW/R#y߹m;:E  ˰(nD`QS٪*zJ0g]{0>_8|`(ʹY^}{m ijf fb*qxgMr"J}w ܚ{'ܓy$ŕjuݑZXWb;>]qpى<^͈tT 9 HWҙoGWoywoEiφ{\nsmg6YyD#Jp(/|ꭙ~A~ ޿7νshw`eH*>MZֶžgT踨cEĭT*q4y|%Lݿ|b"3m^dՑ(#gb"uP"&c,UuL+++;`-z2rJQygdI drM{n[#oE_A}oh5Ի*vs$bYe۶ c׈& .?OU[,`|g?%o/5z={w к}C:C~?f}BsAqL]0s(adqR<ͷ!}h͟f)6,oJ\fLO]H@ ad?E___o!s_ZDt޽΍hl: :7~2yly"1жc[5Ow֖&h^qċF')((ZX `ٿ|[Y,v 2O} 8Keem/DzZΚ%.|lQjG(YrTR"m7>i*~`eԅG"}8<)HJsP /K`n\ߟq@y 3s( ޽}j%o".vkh=o(k 08p%PD34hX gBFD ۾[Rwj5tッ'mY/jޟl,2؈noccpwycIxLODZZpԈݯ @;m{݁k@>ugnϞ=!Ox)J/kM땈h޽,? ɎP:BܗvM.3"}q8kX9VгpVDKMsL2"J_ V~dZ?濕ށC[CMffl6a-T4 +Lө~r= Hvp% w_q:8g%=ĝے :4 ʻzN,SǻKV B;),#X#OW;Ï KUUJ4${_ q L$BQ?(oOwvtf~SߵM~kHp&^Vվ_|ym0":ą ŒP677Z7("f8tev"̹W>m5`nάA.w4^4k:4TT**~˗/hFc8ȁؓ IDATVWW>buuuAAc;b,^͏AroS].tcտ @! .\8s@nw϶mATO"#^Sh zt?EEY/uݻ\0*ᦠS _#_?=ۉZ$y`Etj#>|=uBDq "1y=Kx=R(e~ģN~CuZ=GV vW߻$=; )1w"1̠[B޶b*{{1#}&v "Ώ_7Jߋb~qq9kgpqabEUŶm`l,۶€(!|߻-O < F[?PF'fxo/q念£/4=ɮY<9DPDn)&TuAE5L=IAt)!5Xe*}s ($4&Nԁx&_ MDI~12u ʧdǑ{lP_"Y)|owW_ZH6\gȆb-Nx&bkkk"ҭjrFuj{(QtoXL.GԀgm[ Bl?RjHeS_lq@͐T*çL\7A;}~|9~;uԇtbuG(]kkkoѴT9)6WfDt8o Y>4/_=dMH0ڋ{PnuW# äY(cp3-DY(>TN,Dtege{CF;?. 3O&Vmw-,;(9j:f<%ʤ]bL^3$;F'w? Ϫ  pDDmnb,(-`݂ϕ͏![ާuy>?waE4gM$Y(PD "-&mum"{R'w4?ޏ:?5.ABG^ĝ` [[[ψj,Ĭw)/޴=Px;fͶ>Ot;ۆ"&> Z^A8 wg(}^ˑv]>ołm"@!.]}M/}놿h<.T &dP 3d1tZ ^Th+ko#% vi@yΌ9_( WL"ȎFM7\H(!b wqލ%W-m:mxpo5?ڝbaZ2"QԌr1㒦&鳖MbTȞ?r+++;NQ\.m"($po}Nn!/x oKב#\^Z_mٳ2PDcP"ax  A7q/x -R\[UyUOccѹdѬJ%oꭈ4j {= ^fB˰?xqp"nx+^y|߶?G WLc+R[nerf"nJw Y<2g;H>N&i: oooxc˸ P:VD2ED 2F BKw RՏYj}}/|t68>.G fy9p()\xX >hMeQM+3{!0L6, ʻ|*m"͗KɅ B ٙ~Ayĵ~ͯEؽ8KO&@AD:B\p!.'"cywwz$x;O¯ol[3p̅A0":Dm0`(o'"ӓԣ7M<2{Fwz4>X`yyye ©@njԡ<@%z`|JS(,(uz4~$;F˕10)X__gh|j "p(wVez/N?/Sd;!3!v ڱpZk>< -#^=bGv!IY@4ԗFq+W>& j*- "+L7Zb1`"Jyk~*Vd/h.a4O$|k},FdLA [W}ˋmq0iۀ)I}aW*P,YpQbiא0j nHt/8ap[iE )X\f6v]蕇W>mۍCrO?1WPDM-7m|kB"Ӏ i@`UxTQH6!LdSvv ?vY@KT@ 7 D T*KZ-'"S? i:2Jce,TNgFNCy ޚy+,{u?$MmBXMxV@0"([YYNyDtLG>p"CmzC4$d5u\h_OeS Z&}2":";r%"zҥm(JieQYŵUꗕtyn"?}X) > OW ہlwm @ !PA$ DvNuN}L+,0d@6?Y Xt'|4LmhT7/ I_尠f(D&12R|-.?4<4 iHXpy;Lҩ\D*g2a FӮm;I?d}Mz Wx>) +li9տN* Mt*#Pׅ[ϭw򸿛Z65NPDpwPf`gN4E䚈l#Z8#Wmv.y~0u*\Wws]P T)|3r*,w'J H\B|pgQ'9`Z}&hLKϲԤkmM YPf@EDv@U`A@]DvS&\ I?Onkf]_Pݡ=U5sUXT :(V*ϒ`2%TʇL{4U!~VUR9akZ3ߎœ{pE:2E40hu] H5<Ep;uu@ @@h46h͖mVf|Ňb@*Ut_p. Qs/ E/(9q͛L(É{ܵEdO 0D{4o7; ـzpRb꾥=VW/˩{V/}ٜ zVch jV:BѕCCLSX~3nWVJ+?}w D;Oэ"H5(Xkm;vYht坋/kND3qmnv>\T{iH n^@֐#MA:E6͹]S4,RhB~5__|XP?8t i׮h ?ٳg ;|]Ggٶ=i9D'Q3E^~qig[F=k5MZ.T d Hi  [A j>;XٷCKY>n黿矎ԧmPDcP>Fpj_oࣧX6dx DӔxohnwCޯ[kg=`/i<ɒMLm~+R!%Aa|mYdu3UNZ-е|-Q"sS%{lçqQq{7=K-9C@*  v3UsO|6Rf5‡' _얎t4n}~>}]XGnr3'Q,T) )dK?LŸҟ,^K}q/xwXZ3O՛nmt,]GW|tpP4M+ctotqא*}<5{RI0BvPD; *\BE^Ϸm{ zwW?7k}+](x+D1q0Oְ {nd}Y)p'=A^k)\˅k(O4CE>,R.֞}xo5f@Rz>H40Tx,mv%(*,gNOWM ?~]ϯow8N^Zt{KAf`(v 'EH?+xK{htl} X>0d;}A9 " ĥ78B J")n'c)\_,{o]ԇbiߚ%)k6*G bAP /Hen;IӠn馛 &Ӳ h)7k~c}Zj H~q˲R7xwhYւM-˲uʹ*MFT<@qW} Kxgyςs!?0`h7#d&jF|!N{ ¯}>?˞L½@& u} 7leAupTqؘ]|;"YX?b/2"|I  pq}G)Hcf;yD{?U wx:;a\_D7_cMvC$AXD$T"/A9"A rHEBHfٝ{f|>kzẓ]u|jUsWdz`9NR[C^2뮬eyH8 wQu̖ JK&ڶ]e| dd y1#DmGWPǸ(1*sg"S7YXt P; 7O8ZQz5 %m:1B1Q^Nx3~b5\a Y>{NXcLصfqgYoq }Bq]/袾i*6܏]~vLF" &4 .q]###7 ڋoyeYfoq]]UC ?ba~r{$/p!45]eЖ!bu5YGwFcDٌtɆ#|Y\Çu %tu5KEl./?ͯ}q^.`_9"~#wC9-AG= 5j$1K=?2ϵS.pz=_ְX]|%#\hX,Hs*֯ -Эd vFxdߺIJD&!y[+1!DAD8v۶ض}1K!Ŷ^@tό~\.Z]Z$ϭa)H;o"vgeݼt͎'_*ݶrHoi MWlAm)JL+Xhk{Y2S3+7@2˸qG|"D,-bJ F%o!S6VdWG@j 3Q o6_!?nW4$2p IDATܦ/(7SҬ|$kzy@D:CD0#!œ.nZ ̶0Lw j݋ v;6"| JD]Ǣ0@|)^9 Cfpg`]"z^*헕J#?JCRͫqT* ^\\ToF_|+Rёσ{(v˓ BQnFT8սh A W<S`{{*: N4f"4I}UAQO puK@ާkIf~;Fx %D?JDLD'x26 sOa.mkDGV[٧L6]Յ?ѯB /V +LfqT*ԋ'_rBS3jP(|aiiRof=% Ŀ5g*+X:Wq"Kћϱ |DV0heNzP+)TCh8^,;񋰓BnZAMf }4jzBNGGeP⾗}1 |?-K': >-|q mck- GDUuVN!y|/]m;\@š}זZ+ WV dzqC{%$YH'ld;wb|U/%^NcM,qx[ NQRm q+ U%t+ Lu Gvg5xΧ>f9)`c a鞫-p}Hrs61z}Y8ǞG -->h?AlP׶mE_jRyxO@l,í(4\\0+QdE&El;Vq0xuPx3׋v5o"uqy*At_tg`d2B?(qr|+eYT*LWC"w3q߂ ;: hji: (^qufN*bZ@sHg,Pĵ:9(-+!0rvr"x q.K P,,]xE&s Wt}|n{t8x C H&K8~o9bHa0H$6#b>3?չY츸 Ġ.(ZZЁppïk[A^Վ-kX|"ȵ keF{BV(L@all촲6 viV {AL&(ȶ:+qCdbJt:FSwV`!ؖ LCinj5:ɶƺ *) '2(B22[uQ#O:F@i0v>q1ó9pBf>+T?yeiZ,+x !}nm?}PcوЩS!=@>d Nu(΅k*:UYUU`sB&+cbNA~*my7g_(, \tUH}NeP_PD T.݉DboeY{wCcRֿl]CJg'ɃL85XhŒ ׍O|݌(FP{ r%Q8dZJ 0rF@yRh{E4?e 'm.oST[Ug#CqDU~5留6mED"܍HSK7ߥ/v--8-lk5eZ%Js^|* E[3*&0[Ս{<`T=kH T!WO 3?&QTݥf͖k$:~GvB*:h0̱~v2|dӕ pu;ę?{ )90z@վ!S)Yu"Q'C[X f1 v4W1w%BVY#\>LDI#A dgn!3N;ry[Y.|aӕeY8!Dx,2TfOM¾>KDGbEBDhDoԾVkV"  EFsF|9u7AĂ`IO~pPcCkX=*(|ob_`7%uz3Dg}\.sD.Py(òágr+._^i^{ԁh;Q r~$ثiQː wL|0bF<Yy| e[Z!~b h.L>ADAƘze曙4!m>x"[07X{# 34[qx ]W*|qW}yxTXP,3(˔,3?k  A3_SDtkh%HUbmBaYV])f!D]5tf2l8zjVcTJ(=B =?+sYkZ^ԯ22dEi%*XVn QukT0!x Gn(U8:B鰀z 6ovW8^%TN)6/gV`D[eUb![|c*d0yr"@,_ C3J b YB_m}"[!|Z c2 i"z#=эwOfgg#]} f| + f\>>1YZBoz3|{bUN*U?W\ hk%dvu7?f@ j-݁~~5;ɰF;ɚPdA3(l+ |%o4AAD 9~=KCS|BOLNN^KDXWxKkbxwche[X_Cmp檁GyoK@Y fID b!7 ɄvVU֨-Q^Cم6aH2WHfE@D4_g&'P_#y0!O'@4fGܯ ( ٛUo[AoBNx>3m @&0<g9؊5!g箱,+lqZ#y%J`.p onjOl <"HX,qL2&J^XYTHZ%H_k;}`[7Bw# j8`1`2MXp,hOQ%(]0(w|/f&aGKX@x|1zwX /cW]C~koR]U ;뺃.P'H[QxoL>!d>RJ|ldҊV‰UM #dYVv•/,:ʇ%D vb% !T* $(+L^TcyFJCA<'Ec.^a.4{3t0 "CJ m_Op3_p//x5dݧnU;~D41DaYVx ܨXdU1;O^Q,X*A(K`Pb&>WL" | ,X&@-t\ j:V(zyޮ9mʌU[}ՂÊDDXV8_Xix5D~f07c3?#7?k2;.Ij% .ֳl:4@DsC 9]jYdd ǃ0lAA$̽*a鰃3bqKHҍlbEN܊ZY"b ռ2ՐիX 8s™Aē2dlzhԢuU雙 AD M_pV טDtt`"^*|~(f$B]D4 |[U~aN3i.e}r)D%X= ՊSp LŰm- 4 ҉ B-NNOrBĖAHI xHESgӰ%76pѦnoOdCmp&3ۅB!@l۶ʍG`}]l_W] !3չgſ5dC0>>>Lr @uجB5{wO5 ]=﹗Ț|sAyBiP]P-\q;9*Y ?!P-|Ax rh®1~-eKI6,j5BZ[KŠ`N9_jy,߿Pדz ^7d\հ9Yl3 EՆE5gnb?B]ڢ$lㄈ-PJb{0Sߋz/(-ڨ,[-T,-~C^=@fzu7%}Ҷ[t5[ְ}H05` 6 eJ`[JM4`yTO0s**틽D w 8# lh/h8Vr/zـ'B6L&O@B>پl]&'p/(/(m,88IO'++% C˚X"]wg`XL j5 "ƫws'pWwpjhf࠶:PyꋍްYzm4Ra_zs)}޶h(a~94i-1׿hpR! ݔ7#($PS[MQ-GXn; LȟrPJ3&ĀW0{V@fP{ʚ^PH9j /A}jGO  kVoc.|*z$~+TT ŶiW׋beO-Y7St`p!Nf)jPb թU)U];c'K[hznfN mQ_=CPߣ=ڢ݅DĮVJC,DtKcu3wb{mZxd]ANʿ`Rq@X6!b[O< >$@B'+h,̱r׍e"ֈ=i+=V=7*"6=RW`(FDt8zUÐp hjA7T* Lx}?f1g IM$/" eHW{ˮSTS`B=1)'9;!Ŧc=6R]Mۿgua}JB-@#{~wu|CwxCVT*phqY[ Z:3ROyJ*PR^IV)9T *ZXSm>y!-GgR?8Z3j!t-,"cN=4}K!yQ Z^43 ^-Dt]a&3c3|+p% .İfR[[ː~#m<jZ^^mڢe2ZC4_T5Hvݟ!:ܭI,6%W!/h ӍE4['duj2xb7OEoRଳ 2#/b>8P}ުpA>$DTiP {D1e+MD~y7ϣ7!ZggX|߯T+Ա,7FGG_ r]ݖeQ[yޕj$D걏X[ΪOΌ Kʲd Aa1Ʉ& Vf(Um\0CxoGyW} hS1`ok-y,= 0'&&:]e{%{_c1s[N`3|dD=^AD<66Xe*J^ @(~=e:>{dd!Cʾ￲X,w1s?5J&ґ*8(l-!y73w۵\Ѩ=sIDATm9n;fU G38s-;"dA8v('qG_(QG` ԗ6f.3_33?-xM;?a023s3op;s^HD@_ MaRYX, ॐEw]}O*ں;3&w7e##~ϽLvk=ͤQ(.&P]Q؇ԍj*V/jF5RնU AX(I؍[*YPs9udlid}xX0ʽOp CyUw>zNRҕInHKĿX[&"ݸH|If*3^;F G1,Cgx640trL9rg/f* 7V5RrOT*93f/w]oR:3Bis,1uf(ϤP[(.ڨ-T2([֊b>T7Z&N_HR< VJ[]d2Uצ9'd}Of BZ9ւLrK>W؍!.ǫ1 cF1 lɡn 'a1&|ؙȚ\!9·7xmT) " ===E{7@.2siجDTef@u] fTzgd2x-V)"qC !(XUB$D@PgUUw_Y,7bΤwnlOgwuiiO`1ò19EA+;rD呯9BL`Xf@x VTœ8S,n3}S7 K[ԗ>v`j\xbNYp!O iAxo@ }.:O "qe$2\=ߕ#) V}B*V 3 «xZ|{YZM#;R7@a36(,TALCeukTOBO}X 36TK\pyL+.b|q7mݥ^B%c/ h cq0y^>2<',Vb - x-Dto#fF PaSnFNNR1{lٶsϋ ?u-{hO;;pLR\ca9u֭[Ӑ!z3-B,1nFDN]_s,q̞,1h wc>RY_ZR +)`'%ʲ_7܀bWIUZ<™Q- 0e {6O=8~ɓ -K\P,031 @~-w# uGq ͲC'r煺 4]w=Y݌2 w:ru=Y8w8>R0g4QIGJHkeIADtW]M1'L <) c(6w jLL.aO"V>y,tO־gԬ>򞙙qlْBN1`XH\cΊ+م/3"0N_{HysNl۞ݳ w~fCM?3='{϶{89N`9s3==]ܾ}{CvA(AZdABX3< lDa,|T/{9dG!R Wh epZB2#bieF"Er32 bVe#9KDzIˆ;-y&gg~?| *pB0JDe0c=r]!HP(LCfAq7ƕgXIL+?t/d<n* `T"V,a bX$ET, *P:FL y\Nȥ{; m 3Z\LCSXۿ ;p<޳L# u.,,\<777>>>,WQ~]3[҈(@ywKű&Fa1(J X),Y?AxDņXr}&lݚǮݳzO3)wxnv'Y$؊fjV&e0 +A+O8,Q:RgX/|UFtͮg&, ‰㘞Ao[9*>iu*p5X|2 o=wӏ>7f[ҐyfNrL=ںRcOzN>-&d߃c={8k>\ # !BK h."O^_طoՆLi׾1߹mث&sn]ZNʕDAHELN,I66 `&.s_ɗRo|=sU u׃.o0Djb4kMb5Lx(z蟼GzﶱL(|7-/f_b\IvUOJ"F:]H wdBi} 3snyاrƣ;.h<PÐ80rںaBo8 eX_z{Υ[MM,XJTIV-T<Bh} $  [IȤH9Z>0_`~aЙV8ɧÁPڵEԪF@ CHTZv aDPw]Q:6{^'̍,ʹv)PX _RӾK71111 2 e0 )p̜0Ѕ#y|>u=d2Z:uKV*0DfB`q9-K{k`0U cǎ7Xs]w -,,)PܐU&c0l'@<ِuR!nA>4ںjh/a=uW5j؇: e0 ֽ}P!Z"@\e0lTf]P( t!MJ5ZhҰD6!KkO(xB^b(a@DEtʴBaD9Z2lBi~궩t>)-V=!cqFa\xCA a`yaFOCz; 7a`x.:@LB=!CoQ(Xn*\տU"dA>dS) x:(a. c+{uk|*`QmmJ@Í`XwbЖi~+Ƒ]-J# #GqNm =ԨtZ ,# pۗ8nJ$֮X4@  ^P(MVE6 1ZQ?&.ʰ> ? C>t-{Ul `,PF e%$"uݼ,VCJ^|7( }+D4;d)Y(b8B JI<F@ u)s-DTu* cl>Ԩ89bn`FH'O!eq؊*+ J.Jƅg0l-+8,b2DžvK.Agu 3[|~|ll:qΝ;j U6_26 RƤ*#/ YraҪ;A2xH̴0,A}oh4??O`2aI8e"-̜( 9)Co ^hiݢ+\xce5m9ln# !(ulAiՠaޘ ra2QU jg^@rnni߰AD.dBpk`uZ"< ÈH6`0t*U0V(u|ƥzlejjj]t%E"XfQqC y166:U̡OPæFs]eF"77(9S(FtKRVDd1IG+sй;269D^x(c2%"Hފ<z2t 01PæGU+_|["+3d}3o"D4VGBO]Fиt6`0N/-ZR cڜ:o%9iC]~b`ѥ f<kPe[0BjcuFq$u ݞK:V`ADEK\ w^P),r*aADrKƵщ(KP;cӪ* 9kҰ'X Cݘ57WP/f|u 3Ud/C7Z߿?o߾~'z.# C$B:QjQiʶݢn ,FL # 6pjE23۱fC !ҡCPPkV\`u]* ` "Bf0⿌kox>+♙dfOF@9E03~}?֠0(*Qдw^.jCve Sk#BnZNP.dC6lP-@^|ĉ;wlzӔggg+CW o-֨8AX(19͈SШL;52;(̜Tm_Z^XXr66h+:}Ȗ-[FHGT(n2o" b,F@ *[AMDB. 'l03??O3b4Am۶-oTH8V7L]+~ "yRDXY<\X BTM`(QB"c&漉MamQ#~w) M6(5L9eQiz?":ExȌhcjMhR.:a^véSFnݚrzµ\F@ U)֔.:%J>cccIJLe Ŕl=#ڊ2pڔ>i-M:!kP֠ЃӦw@ 5ADSSSl7PO\ %J@r* f֘aR6kBB췾_ H MҺe0zB_e]6 ) ā.M$ M*ѵ|jdlM@ya5HYE# CQ̅y(Q@UB2 @͉ J4As`3P}F!_a`)1-mt׀Q-1G}/V`+Ůy!?cg 'ݷ۹袋FeW.0F@ H?A;333[n̞QwKm۶]pզm&d>ޢ,o.p7l>O`fv3oarvyRm3d M 3y͍+1Տ$y<}N?,.6IENDB`KDAB-hotspot-41e5de7/src/images/hotspot-logo.png000066400000000000000000001266251515036260400215470ustar00rootroot00000000000000PNG  IHDRZ@sBIT|d pHYsnu>tEXtSoftwarewww.inkscape.org< IDATxwdWyڻR#i4F $D |Mⵏeõ/ c &1 P( iRO j{wWw㧘i5.IgsYfk,Z,)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZRB %-)!hH A @JZ͞PAXԞ'=h8֎PǟxS$OZ=ٸZWp$i`v7<|/hwWgݕ6ħMA `ݱUrIZX\VG5qFXZV`gڻI3L'tj׾,k I홬-9m%AP9U\<_vhRFE `Qo#IZWս}6Mp0f?C~^{򺺧_v C,=ndH}*>x^k;yWCsk+\M*Z*z1VЮi=uo9ܰQӜ"0c-y3|:W+>'I~^?1Nz˯ VVmpJGrQ(Iʟ{:^i ZgW A `N`X$l.Y2dtm$ե '6W`h 3x?T|Nفc]D[f<_BruuvRCnx@7 YR>0q&A s͞ń~ >h.&獧_rϺ`֯2BE ]QϼKCC\V.u{R Y$Le M4#OI8 Z'iH'-@:lOU#}G$ϗ"IK>'Is0{i-۷W\2TU=K`f9 񃊟G +:tXLMNNKf-YG=Ky'`(dr!&'-_I0c#_;&ӾLvE;$NeNڤWɳA `F dU|lHѮm^2u%CXZZ6*JITErO< 8!UsY0-#[/$\Afsޮо=~*eN;YSаeng\h8V轕s]޲ʞfLh*@cG$y+ˮؤ{Ò 2mײlKO,u.X~=$E2B3 4-);?Ȑ3.ti7I%!KU;0?.o rd:lPo=\"pj& 4A `Rѽ)z.dɿՊ=;&lvkڻ9]s660[-쁝 $[A|őOi|ne=5'ci hURX$yOÓ>^/ɦ?!x'o>?Ɖ~ E,I2˥)o9Wd| -8:9Wdu-Y_sB#7~]'@JZ5+"׷7 Y򶜯h32vu_j\ckҟӕ(K=,L'X8 J-ϓݻKśPW*wo+\G+#eVϗY6gl:.oU*v$Y#yeCO:Uުpj OccsRgjcsfąLgxu アr[{\(޷s3RR*ZSWMg$oMz!0Wh%,z&}cM"I.EфgO;GJvN!;8 Y;y=x$d2A ,QndP'4>pKE?#l>l^jŽϨx-raYN̪xg%%!Zyɘٍ X»V~skur)ڳUEQܻM_$9'Irᤪe~&'LIy'`#h%_uy+ w-{ʿ<],8+7@&'sY$Yd?$A{>qub=;jC,m*~j`DnhAKxr: -80/|!h%(Dʞ~^5+ȴ-SoWi$˅vo׎ Y$E3)MP}A ,AC}T u-\V#vWeN}r/|IBT2ptFs艬8,- I❿H3/\7=kd+Ud6ůRi~ERңe-7L^` h%&у`DvSʜrIUz%ISPVwwrʰE +Z'|7'yg4.0Z`x۽2YO-ϕiګ̆S{Kۡ76VQli\:c`4{cw<"{hwɁ~o[#P6e mʞ|w)xi-۱GOb u UX:EXBj U+C-ϑ1F3Γ=GO;G$;g,fEP&*ZAykO׳F [rGdǓ9AHCE X"Gdz7nPԻMc(d$z!oe,#`#h%"_ި_), zX|aVrA(׷CJ A ˆLC׼O=WՄ,H6F ?1mKq(4<#hG-zِɷ+Rxss(1yhۣ=:)d5Z"InH< hݛ-&߮T?}. w=&k~8ɤ[%-6GT`#ho(M(߮ܛ>dwO'Ab mR6'+F.َ޼Y򭼮8haѝ?IB7D?X^zN|@y7xL՟ߕ{mRT`#h?xro[~$s)e&ix|k.cu|.sL4Y +dZT=BH47u-_)ӵ\}ߤx墰v^D|jPтZUqHWN+d$`ʆuW(޻cE=пtΠ%yzZTx뷔}}K|;"5u2+:iRV|?<_T`#hoK>*Wܣ|Nً(yϙpX^uQc ,T:aIR24tƮCXZUPrN7k"YW9U>A:A)לՔ{o$ydz& A {d8RUޟ?Yj?tngqy=52Nn?7\.IֿJKƪaO-XZٝ=)*^1e.z '4xT޲Ѡ%qNQpm3:‡8wwed 3N!hF-}r+5e_v^^nI_Z:t2'ݿU5VrS\Mٟ V31W8a#hz **7IƓi+(sʜ|F6%;CW{廿2Η2#),G-N~!TvpOS34rUM'܈*zqoHJ:X-T A w rRhb+d'gҎΥ}ҩ_eӾIޟ/-%&YJ!,p-Ђ=o_66 XT WC%7zoISݒɯe A  N̦ o>G?{ɁǴ24Q.A 6h5I6#S/oŒT[ \RaYFWU/Uo:H [\0J`@wL/5r.TveV^Ϫq8GnlߡY<|N?K'+ D{0Zݏ6|o挗? od#In{ lwIr.YVlNx>hO :ՄB,˅hh1v ݗ9ey›>W Y݄FwWuuL=+-+I26V_\,s7}@cSh"h1)ɜRT 7(2v ^\\&ru2o+IƓKŧ -bܑIgx_Oք,dl?򺺧9I*XT?p)y^9yڒ.39Z=v`k^ UMgj{Q%E 26?w *[eó~70Zxmiwl IDATE$x&#IO]KV YǽoMz`^-{D-M\pkġ;=7ieA@wuO[k-Rf3M3d)Oߠϗwne8gud(ZgLpXcn(1f1G/}G~70ZX&33h$mQ.jEj|m׫oV|@:ɟF2eCǃ!e3ʬ0}h3HS^pӍ?!h%/O͉}4oTgggEZY) Z\H5\,%Z0ZNឝ}U=,p-bLj|Ǹg/!d)~D{k=,`-ЂVLV6!$UadqRE([ҁ:7{*XZyOWM2YH[,kBk75wQ+=,@-Ђ3j&,$9AcĬU}Q?͞ hAޚ3kĐ$"RvƸ CK=Yﭻ&hAڳTNP4?K{,!KYd̘ᤡ[?ya $@K2kd ]P"obiI89 v5R8նhu-Т̚3%y,emeʢhlR#VG-;K\ 0h")iƸ ɘdJr2K.`[YF@7 UCP(9y_ddJNY9Ibɕ>NI9ӡt&a>@Nxn,e]=.ɥS26@1y(.'Y_zr @'//}  ,6-ТL cф,dVL2axd22qJ~bT$@t??ܾ N̝YSGOWv)iF峣y+_⪞ X{Qi =y~Nj?}H:Ls0*5U-:._ht0OhmhVԦc|s1׫K䙪'Ə__C2FlܶdLd )4 ?hk=haDŽ\3j޳U,uOt,5̘[JaP#T2~s:'0YBth+6j>,sH tTUd"y&c2Y)8rq,'?~Ja&Mi"h%[s̊- .jzT_>,,w:<_oI5qnBFu39 U-dzU,ukq~CQ^~Mq_LNƹIa 9it߻1'Z` xӘCsӇEc96lkS9ܡ87yɛ>.J6$}K yQ#h%,(o}۩X36xIl>Y^4ˊH :e "FKTtʭ &/.lɥĹʖG˿?7#h%&s\5&L$9#9䜓uF6)N%\غؙd{zngLsҦe2r\&'7.J]+9XjʜC'Yk*IdUc['Wrb;'뒐%N+IQU ccɺee|My拉q_jkRY:/;6A ,A-R XJڪ$qRŒܗ"تO)`qs.|MKT i&?%\&~IeWf$g|L>LzCǡ$uWj_6.A ,Aʬ;4P[8璐DII'HrEK2![^vTT)v4)7ι伒%qIj<~5Js] 3dC9OEQ?)h,8px@9R?ksIɋd)?S(qx0j _-W$c*J:E66T)rJ,JRUJ1PJK=ZBWjIj4[n[V:r'$#[A'U-Rz"%[BSQ}\<5lQK:_l*lT9ȕC [{˱6:iג|KzҹRJ!T"#sI9yHI3J13fwry*Uƫ4)UƸd܅TLܙީS~p8?L-ęB:}Q*UB)bQ)) 00*IK1F%( bkaS( (RKy;TjRoE(I;YY9/>\bdG͏ eLF/R:wHndHG~t'!)(R@9Q2$K\V5-8'to C,/ ;a$x)?W^V5 㤉ofu7';'kluI*jˉT3-+~u*sv_eߓHqH[4)Po׮뿙TҒ yOuP2Ee4"HRS5eHSd lAEW< *84(t&<,2Fr[#&ˌ/.it_(ڝ+׺dl)U1I]1/;;ޯޏ}Fxҗd!U?V`n&YG @dWqh@BN=jȪ-;L2N<ѯʱv*\+r4ivkp(Ա_b|FKO=3S%ĮCGdoD'{6 ݫFy98*rVVN"JߝbdXND%B;l)nL #?UEޮj/R3S.,-ȗzWͶƦ 4қe%Dˇj1=ǖkϝlK8'O222sJ=\ˈdAc&M[RlYѿR[^ޢݗ~MqYuthekkOgH-Ђ܁_^&_QdY7dFYj*_fP%&?'MڲɐyRdbE)4VB3ZW~Tu+9'k)l9VR<ϴorY/% -J=-{{drnh|QTi|h2٧R#3= V'^NT>u mU^Q\8Y*Ep%MiS4Ug4' b:ʷ*ObxD/KRYcDr*]AuwcMĨvy=;z.Ca)1$KrF~Rr{AJˈ g>K'}\Lc]qLozN:=+g79Xroṵ%jS&ZQs49ϗNSωR%MoqE NhKz6Znb`] ȢU'c’" kmSD0/Q+`9qAkMlxb#JY}((onYJ$ L%*J38ְlDV@ $uJEVsA'!   h@q ]06-6 ڏwE*X5X⊽CTAMx‰Em.`k9`@ȓPYm$rĘ|RZ&& Kk <܂ߜfgr6)OKG   6,-I7~oxM πG<,֦ #LH#\/ cX|u>!x_|'4B,73)H.&b99v7b-iA^li  -AAAmD-2T>9zF"*1 Xcˊ}*E"[, escǖ959U5TdV q3O KI*,"|-< \DXZt=& yӏ)OK   6|Ne93Ѵ42Ćg߹^dEtXMb "fa IDAT$Il/67UO#3A.@yZ wfN̙M5:? hޛrWDոxVZD7}BAAFYˆGEu5"?GKl\hF0ȒrH%؄-phG(+R|2ڕǒ,]8fp -!)E$V8*DY'=.@4Ѹ ޓ4hzvq[>Dq!   "0-xFhXw@'=!+!dS$h={닫G[bTd,ic‰Blؒ2OZ[cxOp"B@B AAAD`//D~C== h:'1%MX@D2ZIJzMl_vqga Og03)b%DYDWAehiBi+% Z   @送9|{ֲVbϢJfjc'7Bבf CɲW$mq٢,}UB!6rOFOlā+f03q3 -9T00$+-aWēpܓ`Uh(ݺ"#1   6y.b1[z +oDd`Ɉ[$"ҏ-BW6Otqk87/qPĬ2 p99Z[q`{7˅\8%<08v($AAAHx&~y5 !RBx>@?,4ي/D$K椎#& {^GjaPڱo-*'fYZ+Ӵ#sJQi_1C3Z)KL Dk #k2-#3'%xBAAyF4 Liٿ z?DcB.Q+ITOɨpPu{U޵ݾǥO~iQ(n9lT$,70 a!"}ͼ|_sCBK   "xŵ;?x_ce-/ $^UlI"7lb"\T˃"[r+n ݚ$Qjljv   |$C!zU@Z&d־7SDK2gklD6-g$MИ,8 S`ޒ=yP9< Գp&Ap8-[`hhh@8FSS #}Q]]]d "۷vŽ;܌X,H$r! ݻ7BP]&v!c۶mشiߏ&aDQ@II ~?гgO <}DǁBK`p ;40`R\5H qDe;Vƶ.H$|IZ35(oNRص` "c3k;$ЃJд5 m73A$ygX~~akע)֣G3Hu">|~zڵ+y0l0q8q"`7KUWbظqc|ϡRԠ2oj8/?ħ~@ Aĉ1~.WVZH$Rl7ڍR~v##BѢ J͈8JzIJ[*K%!f?NDs)ClIC؅.dr@ڊ Bd4fY #!0Mq`, GuS(UBKCIÄ(so.sC-GmcƌXn]mҤIӟT$:.a… l2[Ε#Gbʔ)>}:.hlݺ~zhW;<̙3n!VX _~P(cҤI4iƎ ]~bnks|>`ذa:t(FqCoswuXf ^~e+N!YgiӦaԨQr)ۻnѣGcv##o.n5h2lZM_8nF3t%*j!>hql؅;^&٢\̞&,s"}cZ}c5oz נC&tnia|-HQ?=Q=ެ童p Ef݋'|>,8ꫯ0o<<8?~| cŘ?>6lЮ XbVXYgӧnsw58v؁;v`/`ǏǩSN9/h4^xiK>}v^q0 [x뭷p1+ ( k׮w܁?(߻w/z)!Tr]z ,eK0K; oy}D%k =km BDVڵ 7x#~mO~?Ǝ1h jBH$UhƍXjV^q}=|Mq8㲺iID qV] W_}uƿ Cwq8PSˎ[nW_} 6|EE&Na477lOqEaڴi3gNu(~<3\4c #GđGqa3i;c '|2."L0!FXz5VX7|Qaٲe۷o^[ Tp~~߹s'6oތ 6*yyAa޼y*={2VDc#Ĵip駣gϞy9ꫯbѢEO3:u*Ν!2o/w؟|IL8u<6?Ŗo#\~fT3lIkm=mcmf}YE(l%c4ݚVfKq'8%=3\.t'4h`B["jAޫmw%8s?1}0awy7bٲex]E-['? |v{;*9.rת7~p饗by_~ p`xGtRed͢Ei&@^=)p4v~Tdz ʮyV ݖH?v鱛a>vL>e;H^5q \BĘ vKW\*Łұ_|7pRdk.ke&1x_G}CU}quyΟAn!pcZBxg =zh\wux7Ca;wWe5k^y啌+={vιI:#}.BWeԩXd nvY3<.\c=V?ƅ^nGs8b@k r\]sXc6_~*Dd:͢K]GSՆ%z?-[EC&*GxXIZpeѢE曕7?<.r;Nj/.H^W_M7)A_]{[,AutI3fLQ4 '|2^|E\{(c666?yAK.ACLpB{JݻomgE]T`Bi."a ]Xl0= &n:̞=;da(jcH +bK&\ܢZ}lr,-2d͛L=o޼{Tnvees9wygL:^UUGyǏŢE 1\>m JHkPpi ["ZQe~^/""ף+kFHɣRV%`O;4I@ pFYQk̙3 Qv <>t}~KK ZYd iӦ&c&&ƍìYm|Arǝ_~/Nޡ˿B!7</Q+  YeCB\0f߸e; Xv-}Yiی3:Mo}[{_ׯ_z^˗K? QKe؛^{fѸ{;R"xEt&"|^s(;u\c~üLP+g2QDxUD[Wٹ69(*9._ H L%D` CVBK)ie$ZHaniuaÆWUʝN:IL38Ê ⋥mK.2%xٳa/))|{Bt4zI&IVZU`oC=$p 0 T>82 26 9˗/Gss~A᠃*G퇦i83mK,)7DgW^ğ6d>AtdQ/ݻwK+&麎O?/gyN hV_"ąD!ΈDv[ }TNܻ nQ_!#m =GX7Uh'XBݜwyGjW}L2EjW())СC/;v(GDGC&ė;cVİq1Ǡ/'tg}#byʨo-H/;64JCҖ<ٮ+g2./9[\EM1ţ̶DHTb`eLtG1&iC-Ńoۅu@~ҥ 6l޽{UYB`EHX,気b ]Ħ+ qQG9a=fnmGd&}A49RR O\;Q/i,پ,'|l9"2,wE&Z$痜>v3l2$RoL|=uRѿ+@B Atc6m$-AZYY1cG4C N9駟C@۳g{vJ]&Ft&N(gD/+saiNKG}T`O}۶m_L!CؓSWW]ҵUUU5jT<* @d|W8x<ђx- p%U'u*)n@*4\oZ?)WBA(287!{ugТq~`ى>IKvJnJ8smO<^y{Dtjkk( ?~|9Ax]x@ʕ8gFbKԂ[FR 0K&.xdq-mي,RTm.vBI!7%C SlIfNQDV|@$IDFTBKW0+*1ںuI .Bi2P9n,[^fR^`ONwLuÆ sأ(6nXx^^;ToqFbKft 7A8I‰Dlk%J}_^pe4nO gtMdq@)xD HdfIZ -эQ}9k,//G޽"C()++Í7(mb裏s.Ct=Xi5f.(rLwLHD"RtVlԱGbaYJb[M< n͍lOalGČ=] *djOل/²Qd (V*(lѨ& % sPRd_Т!8h"@B AtS{nA)8՗o3<3gΔq?ϰy{F?[nuU::6mڻ2b믿.#D%пm_O>-X#`41OD\-t-yO>`!DB0##y\|,^D׈ F/Ul^Dez^LKʾXX# Yc_(n.G"  -Mٹs>h 鲚 ʯ/dΜ9n{=L:w}7W@ψBsIg}v=\`O 3A RjslVhWh!`DXbc,Uȹb9 ,"!r!Ս J*HE /,:5wc?L"KYdC&F HD$1bb6@E*eCˆ -MQ-իW=) 2 -Df|>~cԩ>X O>$N;4u]ҨsyfK{YYǥ` @EEE<*,@d"0pk{xFla%=ikK-  sEF)} 3I D"n2E 8ZJڱ<.XEgҘ,HvlS"eP6" +ңY$צHh! '޺f f3%,Z4p\c |"9<3J&#x3[R%DM.xTs)Ν:,B/aD/EDŽ9Ҥ%K1n24miwGrD!Gu0b.ݻWjW ] ՗jY\N8~;{=e_0l2,[ }9眃s9[,<xw\pEٳGjݏА!f ꄜc= hc`Lqpi4A0aVIfFeH, 0 eh*`8JcB()ZNjKiEH 튾^Exb?Vh7D[x=QqJ,uK>%%K8g^^`"B;S.^Ma.++U T1ӟK/7RLcN?tyLŋz뭝2"]>TR`O^UfX ޸w" i3 Lg4kZE n&0s" ޢc'B#P^Lg`qMqh &䢋A&*Gxdm+. K5o9k]&"TҼ;If?;$D7%J@u6 SN3())O~꫸qG{Rټy3͛38/ƍq7㬳o-3i$w>w&TE|*"E!yڴ>XDC,b-Fi0f .̊A#QA(Venq ;y= ` c0fo1+ XrD M8O1n*(]D끛,Spe_ x43 .g`B3As)vZ\ht]QP:S1j(Bb5_|E| ~}8쳱yf,X ,b^u6l.}ٝS[[~ ֬Ywԩ;]+Ou({(Cx5/A0tt_2O\fKs];ޮ.As]S9R\wu9sfg VX$2h]M~Q FPCd>U̲ Mu~| "n?yUX0rVj t7``H%^5 H>7g~׈ICTgX*coЖQd `C-+\7,O4sҤI:.ݽW*&MG_Dtăz!g n*<䇡y[!Y@ a$ ēTש$/eVV4'xTCPD AtSz%ٳݻwKBB4x8~z}HKu޽ A3f ~̚5 İa3g8.^v|4MCyy9sVyy9zj 0#GqAuۥ"555uJwLPJ{ӲZ`0Ģ`8n]A403bHH2 w%S\Seb?FdQF /(`ץ8L-Yˆz(  -MQ}yT}jK53f }Q,YwuwzSoSAu555Kp)B D6Tp<o` nF!xB`| Y00@O=>ඵP&\#ZrXm~v;󲨗^OƄPkp`{'䰄bN!UG,~ِ9+DB9Zܨ+'AuL2/">hi7t{FtTmݺUjL dh(k#nb5n-Ad]we1V\,,a#l"*Pleab+;' E挀Q+F\wS7kwk%YDDn5e۷??BݔP(~9 _4"_}>lذ:BYRSS?>}=⦛nr,!L-#E@0t{BtzN9s߸#>Y f cYM%*:^dl9,GDxbmKw#,}Y\YnS=?RAP ]})7nt~?FQPsLrڒuXa .(h"qF&dU)HKdB,6e!J|t9s]%А|fBorH n|%ێozϏr(2$D7fԨQRի IaYfԮz`%J(ܹsamm-VZUΊJh裏 IaٰaZ$IMGFjz`qђ:X"JFXP!Vlm2͟f6>ck4OEd6R p .м/!hB5QTߞʾaKY@`@Z3~x/'>ڏ8{Bmgر8Smz!:3C/;wĦMQavg$A$ &\HT5U`\'yb̋8+Nm^Y dNEnoYk!8gؽ|DkE!ȒH!쨭B]X`BݘH޽|M<* _c4iR!}Oj_bE=!:;'OUuW@umsL=!:#}~T/ Y IDAT9ĸAL&buhVl+^M_2JHqYlm | !0$1A0dNv2H8v s~':$D7Gz0_vrG^z#h;wtƍτzx<+W:캮BxǷOBȑ*\6_LUl',3kXI!|RG}>"i벘U"}7ٺ\ `ܴ s3(a$%Ȳ֐ӟw ZsJK,)'W^U :PH3v%D8H-'BAߊ&7XqfG[ꓬݾocM^EA&$&󲘗ag J)p1FVf!TCU J{1(uXBݜ?իm۶"xԾ|; ˰aävC$AQG將a.CJ|2eJ=!:3gM)HRR_\kq k0p@xO /"CGU[?&$%bLJIYd~V\aǚsr۴nu, W3nc ^uDGB!vi?QGI>|8ƍW"~}ojj*'Dgϖ.\X`Oڗfk8묳Ya>ǹzcFq < _xkdܴ/JyK֞)-M21Md;V$$0EKКVvy-XC-Y]!\$" /bx'vDg" I]0QN?t韧˗/"ɓ'O>E#8h``āx 0bb$fdKJ@<=#E‰ s[dc\Ib_:ov!R&KkkְcM"33`tUƃ"8Î9(<$: C qwܩ lI|ʊ-љP(---'Dg\tF'|ιZ+~ lV!7=Ah3ŖgqZb-h5xTv@1> ie}Q'D1p377ma߿jZZ!Gnkk/*Y h/+>(x=?>ʴiЯ_"xDeϞ=R,Ad/&]p!lRŋyf}ذaᅚIR5a$0qfFQA$D!К@!_)L@pSf dŒoY$VE qoy6asn?b ?kq&p@3gtN8BsADnVǗ_~au\rI<"Z1hР{BtF)""x?ZZZpK.R^`.aD K/h`bQ#Qxb$@Teh1^0#9̞/kDnY)mQ*%C=z2вj f0SAB A%4?Ϥmþ} Q~B;Fq>|x"k.TșYf1g݌K/Gaرc>p@L6]GՉǧل` zCY" C3E* 󦥀ϗ8'PH|),y^Rz#j|ynVIyf\e.먩kf} &-R\\~J${5\7[wwVZ5̛}k:xT; FleYַٳg}~Fo뮻q?촥e_w'8fm"%kWRٴ\_8%luZe19ÊL imCWg`R=bϙ+,™, g<ϖrY[kg(/ Ot xժ䔖L88(hWRp_kk>O_Qn?+WK.Qc͚5z ;묳tiMp8+--߯d2>uu-衇:#Y:?y?/…,¤i aݻ@*Ռkخ#%Xʦ-iK\Ɩ/#/|m|0yhA#]PpS!?)4esר C&+_ŗ\ /kkf->%%)ik*Cŋuq h0˗6GW֚5kNs=.L7o.s18%A{՚5k /))w1ţ‘`Xpcu7c-LM۸q.r=744衇*ZD\s(/@usO[SabrwY-nFʥÙ-~67G 2}M=#͊B1c~X?n /k)qctTiYz\'uw$9a.t+uuy֬Y+V7ߜ⑅t-nP{{{c>{8S<:vҵ^Gydc7ɴl2F?Ӻ袋SOMBlvH#rG#Uuk@h vc J[]I:#:;e,|7x{~jQ +*s =f&Y,:5<_ ulfmYKMV*hť5s\d3[c/J-M7Tpʕ馛vK{{{@{ވ7hy]qo~T4doպ袋pd8uY~u-hʕz$d2zGuy:rOI0T՟Ѵ?C^`^$+(g)g+?%ߍHm}/>a+،< m! muE8k[ pK*ʖ\ Ðe"_sW!ϳ5)ႶkQCCn6?=3zgl2]tE:sTRbyzOg)غeYZz"`_ кun:EQ-[LgyN>d-\pһWuuu'У>m۶zg?Y^zR;묳co뮻N_ .x'7|SOj׮]{g뮻R728,K w}CoxOݝm*-:KښdHWr2 RėKY/k "'n,9H=(|l&@[I OZKw-y9[ӕ`MI9w)s%-hֿ|_cCA 1;sT__[ouZ(AhڵZvN-^XK,ҥK5|ztZ7o֟g_^֭J}_g=kK/饗^ _hN:$-ZH̙3e0y6mڤu饗^+\.79[oW\1k5o<߮?#{}ݧEiҥZt.\1_u]m߾]_'+h4UVkMHY}^'4tl;ohW_OTʳ%Ow^V G~/q$ْX !Kƈ‡BH?O& JBᬖ&\R&Qʥoѳ;T6o!$m<]ӿm}`׿֏~#=ãMz/l+++ӬYTUUx<2ٶ-ӣL&6m߾]߅^/}K*W_ի:l{$Quujjj4c b1%I% b1qR)uuu |ljjҖ-[ USS[zIEE|A=w3j^uO~"IJ$SmmɤJJJF2۵c555qOԝwީL)Z0OU~Ca~dZ]تLP=9RDGA>m|z D%ǗlG [$/pkа?]7\*zZj}R^vBʙ=9;+ qɅumZ[, 7ܠ;O9^A͟?_k֬o|P?۸N9ZJgy^G}Cڵkv!תU4w=`J}_W_GyD/ Luuuꪫ|rvj}_5[L4oQ6Q-3v+Ԥ%~|Hԗ&n_J(e 'k6?s "Y2}K pŷ\7lq덨ikkecnVc,A vqPKK~i={-0Fg}/_?~Ү444Vkk^xڰav6%buK/Umm^*vms鷿^yI +uy /ŋÂCe_ƫ*-*jfut$IGa`|ϖFm/?"9$[-g ,k 2UV9{n~q#Ld-YD'x"W&{ァ'xb+WT]]|NK*-ݙ<{#^*Ec" _XH4Dّfˈdababߤ8C{%QG8rڴ~VUTӦV+k($ dU|FFјh<|ؑ \Ja}\;_'ʇ.]aSY0_q94 |+jwʇ+ uW0TQ`wyl9K鎨6+mn[,jc254Oh$d9mj+>eQQ`ؒFycz{bsᘧ>+9Q_@"9`vmabY.֐:*[-%FˎdC }_Z,#Ujkm(4T8y TX E/Qn^M# A -zkUkUY`ϷeLTVSOiف-v4P4Ȏr@~ɶ¯˒ek( ^, YC( d5,X 0 |Kɒ"4QȳnmwGVL{h"Ieei͝"go=Җ-GTՊK8H]xGUV ۷s4^>ugR|E+2MO+-#ّ@p ?eH"iXb Y4~K8kEEo%?_"dsm[ݙTkrf̘٭ǴˤT`S69u*?}٤ ?8xz[5mSY=l_wWBm;>,.(ZU4H,?ePnXC rˊAEL  ; t ~~P~KQHt@{Iŵ{|PENʸph hjWY~TG1I.goϘԥD8"+K",p9Q^K>` ݢau[  kes0XY-G] er{&{,anJJ>8\9;P@?:|Ӣ IDATHdxm6]79: ,I WNҕS*V*pÙ-N~ʐVaKRDXrqe;u䧧cOeE) )z;:zkʮj4Eo!jOmj}_dnؾlѶm^|FUt̓e}91Ovܗm"h|q[ϵ%ϒgG^cNm`8fշiԘN;r$86XT1w;uk2]Vs8ѬYmu[4MEkwHY$8錶}yfյɶ29M.':Tfڥp>[7ݢY*Zsj:}ezv6LOhSmn͜]mskkێJKkA boZS5՝u\2y>3\"NUWuʱ~QD}+v'q8\gWm>W5(S0ϳV2eG^ x(k,ҮRuv'"K*/Ռݪ(!IJ4C//ޠx]$#8ZvhzegsD} r%YUV4[;s*}zkQpG O;:{HM*+9LTm*RO_쐛R̨GzL )<;t&]Ӕ= ͺF.>yr#A f2;*Um*)N<ϳՕJ;T*-NWeeE =OwORͻ:*=D#őS;*騙T2Bܑd]GIJE՛)3uQWDVEɬJӊr~@VE(Us}R9  h^zvm#{qUUg\b|[}bJgclnD9ϑsVHS$)D"񬒉Q2bj]TA2U_GGܮvooiZnfNRtKoFkDol!~Ⱥ;JԞVT*S%ЪACA aSReY*Sr}w\DIu:5󒏪ϒ?jEGfg+m*+R*/3EpYJ&H O*>|*VVLߦKu*KT^ҫdv5] LLݽ uu>aM*[r,9#Z{zzչvvJ}EwTK(Qq"_uqzJkS%*]|ݩTM"hӫ6*[JzKvŭ^bbNNјXU4ʱ9vႷ,y-g+( GgT$蹊3WE6E*[|Ғ)~&&m٥Joߡ̶rvuNJKȒ/[aw@,SRhŴ1B Ūg(9k%> C !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0CZ !h0ĖA|[c"l>dڰ,IENDB`KDAB-hotspot-41e5de7/src/images/hotspot_logo.png000066400000000000000000001733551515036260400216330ustar00rootroot00000000000000PNG  IHDR:X*bKGD pHYs%_%_-tIME9+/ IDATxw|\Ͻw-Mrdٖ.SL3=M#f@zew%Ydͻ$)K !`6qqQr}duid#[;sι9O9B6.051^u g -Wmj("tpz c⚢^&F e OEDtߗ_Rq1 n؝Ԕ=DDj5::A8c[ G Fc+cz;tϗVO2NN8QR7qb1 aggs~U %B'cMmok ePL$B'cmTDl+d "t0PkDgǦ8 `NNzH]Ȳ(U,# :GwqAcpIN,뜲m %e!s%Tm`\!b[~^yOb0:A{P3󶞿xXKN$2UR oZ"t0x~TMtR8ҫj"t081iYb5:A39Ϲ:kI.W ^WzrC[)TW.cYeukZo)P(R(V NEssqϧ1-j[j7;JD'ǖRQ֢|4&~\,) ,^)7Z=յ XR":Ai^;w^sZ=Nj'P's BoO:iMsHmqRl(B' 2tW1Ӽz, }y ar;~"VNMZPݧOKŊWł Bc,e)Xh;]=sF=(Nr_qT`3&$r!YܙbH:Ae#́ԊD2,}K[_{nl-vdӹꆙ)~4:=d7EGzY:}F_yD0ȭhy @o7:Mbk IrS #rDa@ͦ4\5e%)^HZsu)Gg{eVS8`/wPRWA m4|p yIUoݱPXo'v}~RWNmZom4y?e|Cן@D̻D:!#?Cm /Ht(h+$b=oK&!QEֺ }[7s pA,U@I9={1n& VkVT<SN=|>{ҺnN!ye T7nՁP+O5QT9AN Ku1O)XјYѩV a$tݡf 4Cb|{o7돥7ߣSYtV1eb@A":!8z 7d58V0JARSOV  c<7ѥַ~eꆺ/Dن:1 {5`tv04pIC,(IbkDJAc폽 "tBo3j1p.`Oe,pX (YPXQUI![Ů ]0H9݊~( $U?K  94yV+sԦϞ3OZe۠5Fz88xD1 [l5Mj5wR@U^E2Zm_VjjROb7' 9@5[*]->be0.O(EMe<`iهR."'H* F5t~Ş6'.rZc-7[La:!\%TƠ ǣWx=۟&LyfI]A7?tRçII,`:T *Ş:c?pL,+ 916ѷ_FYn׬ќ]dR"GB[dARWaQJa $ypnSωc&&SUESE@+G>%D脜{Kmw+L`\Hr^c{˪* EAB47ybYAN /!:hlz+E3Hny(䡂*%VcJ)&AN]n ={"kQz @W ^@W0Nѝ5t7"DQ%~S5Ex2#W)b3krGO)p:`{ZXSYXbeANUTlnبR̔yğ} ᮑ\=]힝*O2KXFyusPo"r>V$^xDAE"X&)1E' diɛ/hj LCn,tW*r>"v*, t[XXbN&a/XC1֮")r_@0xH, B(k{"*.4x={ɃHn~ GzOWs ɗAN[ٗhUZ^2U:3~:G+HGU8H[lT4K7}l8 BwzGu5sRM5%1Eg_M0ĩt5eaeayl.x҉(2qа$Jݿy)3I0`1{<;V@kB9}s2(6T#.6%HD'%nmDן:bVmkLWSjEtp*)=9|[%9p eyw.USQ;qU<d+{;PEm`pžR-͔)vZG3ӈlqݜ/էǚR>UZE]Cp T-:Dנke/pLw<*!НF4Yv:G)5q:aMl#X 2!kIJrup5竰Zhd8`Ę:_[ǁ`WU2x‘\*?78Аvh=XDl(k8 ݘn @H{ FP'I < c4vXՒjQ|CӀE㭕A Z2tT S>cR*Sv[Olcm!i]Mꗄ@yWS8]R>%ktV 5a9i[֪^ԡ˨K1N=hZWs6O8oϛD|/*i.ݚPNj Y;N4}JE@#Q 6/ӴOObU.%7T$Hn7bb-*%ig}9V~Yz?wэU J/.뜮\sմ1͍x ^bCZ~mU)v)'U<~7М_UUjoP2"tcT"uUFq%Z \n?k `b-4~vZ{5$]*&v &L4dk;*ʱ՚ѧDg_)tҶ}> |uYo#]ؓg܅qr$7oD־Ъ+'`} p~Z7e"Iv|UF~՜t*]m%x_`^A?g+Vq)*PN4ZHZ:hMjLgMj k|ّ\?\C7vYiP|ZFkshynĂ/nZx1-~ݐڔ*@4VW)0L{> ]A;$Z)ΉoM'{9~DA茌~<7\\R._=Z9TL~f`` W=t}).CXynN]*(vH %B'HD7(giXWs?&tPWaN }*:D75 mɗea 6Cx%/‘㺹%3G{91x q] u(Us} ]Ը 'AM+lLK#V~QrQAH2ý>1Dtcj Jf˹]ʥ諘c`wu`M߿k襘:,8p̨~)}}ft{/"={I$gp.z/V9~vxvD{3"t+_N?ZбhFu65vMWAnP7R }WkQs=x7xV!1DG $,Ʃ%'Ǐ@2UHhڤSBȅ5j }P 4D?AgEO/>gڎ̪?~4k"\xnz}( AG&o޺PŝUҨ5! ;]R#4kUY\&0MFis ]ᥫ %O=92BFq#mOV05rb]"* QFNu~A+nPs/Da*Rj$yK .'!t1pNE&b̈ ]];9 (2Q+2#cuXӺn5v SxR& @bO}<[3*k˧Ot5AT^|ErFN?r}oI3:SC21P\tڥğmt%Sz֢8U;VAI]ݶ sb^- 5nMϡB5KXp6_Kt^/?^ #[SW;S^|#&3r:CXESjUM@w]_#%z[4Vu>;dGԄ.nme* -_Mv9O8E=Sh/E>Qٖ *취hgb %B'8&oƙVK|{Lui0^s?~whoZ a'l[#?V#]Hk$[ #LmՀ)jl̡m8ERY`XG@U$ㄖ_Dpjb }h;:4"BѪ5*NRyz,{j5}>ǸIBK/$\X*wX3)ٷ9Okۯ*^", I-UUfu9^x`kne&ַ:kV^DavdUZVz a .+-Kܢ{lϻbcކdvy5=Z+Ѝ=ϥ/!0o >y:s,8#6ږ%]rEg AMָ)$V\B`rS|.5cR#YZU%=7I?7 I]L_oZ )nVaV^QA 'MMyvtXE8Ft֖IٰCmAC9i "t9R=0f̑m_Z2' F:5{f/"8o ?rKa|cL^q;?*B'p4w[up@)޽ g4UFW!ts$Sg$pN2XiϬȵEu!FDA?U)!-/iJY='B!+h= V| t̤]Kss>^^[|f{Fs(DriP&SU}j>δj/l?q$ &CXsYXiY+4% B'_ߓ10'`WB T/HEr_@7eBZ t5BY 6QmՃ "t@+ʹ|tZ>,뤦[=~~s3δjxqc(;Ya]U:!*B'Ѝ9n CwA,îY/_FO`ZvM:7K2(r`(1''z(0DrEӇ憁+-t́-8kPNwfLSȕ`S`|N%ywmSꉧ>(Be3Z BS8ޅ@~{ 45dgt?M3'6V;TS`]npK=ɨY~5tKK-el! IDAT5gdg;E }pʉ "tMGjHM+ȹX&Wmy{Z{I3E;+eQz9 B7hhPBg Vi֢5Oe7Zk>`"z 偠FpN)B'ЍZ$_/(bM>T(P(\Lk3FcZZJ=a/iEtb+2WY|kMe77?5,MOv Y\!Ic0M$7\e4Xnj>DtݨSƚ4 w>;)Kb3t"V5%AiiGğѠ#3X*Q3"mwQ(0@2^Zx>vgE8=SQ< "tA7DNM=?&Q Jέ39ks*>WwS',Ѝun~/ Zc,cCyQk*\ -FQ: TD$DF5}6B/5 rG;5:PkVSLR֟r(/ܱDM JUΜ>?  &W㬸_FFdvK2ԹIuqSW1">*Ogr`EYiгE=U|.W) 8FPm>uCi_+7gMJ+DFh@6dwiU1f_"jƍFJ, e[]Gn :MiH?? 9NmթTˁd+jlEkH>!T Q(Q#߲PuT=_ܚOXPy^6/[vo>(>j ˩]r:eXL%+bЙRY° B7R .}!TҌX!~E E'A*E77$AoByXğztGvSgcYaW6ƠڜNPzV2Ԑgk Wƚy5|?zt9֭ dߨ:דR45:]I8 B7R˺/ g q_C(֬}T$90ơ;M>p秶Z]on@ "t٦#4}ty+H>2&FcEȈ &OJLc5m+7/WJ "t&ۡ,kkI싙 AE'L߻}i7.ޯs *϶m?\(N(e5]mrI$y!V(N7cP|qex x*OGnU{&.∂]v&1Ȯ^?{T9Q !.xo&ʲ_rxǁ[TDzݐzH dU kp7O蚏`ϘL>h+p"e `m2Dz;PXNȩ !Z:"ɧk$BkoŮZL$RkW *()JWPVfeGr–oN 4UČTHH@'eߠJ]x=P!"| kBL1a#Ob+K hn^Yx{.b?)T޹(3r "t#u-LS~tOPERQPF)hGO3-6"g2Fge.R:M6ěºb$F"tY|8UtWYfR 'B`j~U8' ǰǕa* 5V~δj/mDYY_k}UP533 "tYkaڙn]`YՍ{6;\qVXZPjDga@w7^,ktHƻi-e/cOXS,/?JW^.?K.j]~HeTQmv !O]cBW6$-Ig`{X~㓅⍂]npU|>WT>*ryތqx&㢷Ï&?uק#o'w+`M5L,#B'eOVp6i6kb5n#?)>`m,m7~w]?&=:m<3چ;M&VvɈ8 BIO7&'&&p$*Xz@seӦg95EhfNk/8|ZS"ZYBSJ1qLA.-CKW]yWowlد,EY4M?ZПJk9n~~ 41ۀMWCgNcOxr'>_܍Q[b1}HSP 2ׇ}U:{"폦U5 gRXG7K:о|Ү3sΉ4vu'yy pA BԬ^jᥫ2uNI.{9mQݹy1o n~Q>NJn?G|Sd2yx~]nh2ѵ0V7_}uOb[ȵ B^VY))e@+Sgc̫|S;{{+hL[Ѵk׺1j B⟘\FMĩAXʣ.;[X#8*)[?߶_ݹjze͋P oAnh9P12)~v Da=%ע[r:]SW\5FCNϙRmX~JiD?Qu/njz)̈́fY5^rX~p9UGDlHFf?26|EW` J j`pU>r^ټsQ1D⨂p+8Bg@es?keSGeVgT7fEZ$(,& "tm^ˈBzJ~̖9F| ljϟ>yTye⥂pǬlYV,_uy5%njV3Q+_3e⧂ݰt"lg53Y)~{;ѳcWvxhתzf;WMgYjd\`OCMWu#`~s|f/Z#>+B' :rN"raf~԰FW3ssq]ٹj80(NLGj(@(se)9kK?|=p0Y2?s>'͜4yIW3ҵqUܱj*#FcG7sx1l@ej2g Hlعjgk4a:! 92u&GAreEFD=N USjzUӟ۹jz #"tB7IpqP^ƆIQ~8 JB~$78Xs *˞Ug'B'+]/ ҹ8*+0};2i[UNέޙ|h~U~EډНQk8ɖT: 3?g*Mm =Oh\|Kf\\3Dq,7n a:B$QVr[$##cXNscĮU3ny,i"tyL I! #qI-<,0g۰yeӻxkE:x1i*tƎqP(B0?T~ȌXQFDrݞZ߸낙QН~hDJ FaXYa"sod5iEU++ΞaНfM3T*3N6mF Ը$8_ O<&:Ըދذ=UMDN Cьm=#mX(;]UE]w*?7} `bӆd[3hFA'קYXISuVSn5F5Ơ={7>/77Ɏs(B7j!PU-@ {ARN`g]Ɇ͇]:70WV"B7S6C9G% քP.֮;9Xy.R>+J{OՇbD7 6b7#wxP ";kbƮ*y~"5tbhu ͬKNiA'^}W.nb n$Bؾ:,LdS+K :D?W^1V88pYҘDr?=Lj},+v۲)oLni|Ug}WH +BӎKAW62)P㲟&NG"NJ)yKnw傅K{Y6A?}˖41=B3⨠K ӛ^鏽%9sʘ4&+# <8g<r nw|mfلG.J_d2h4[_݂33hʊYMܾT|L6OKX$7 Ts$2+ $ +h|oKv:c̻ozD&+MS(G`mѦ[[ʭ](?z `o' w>t(y׮]F|bֆ)+Bޛq﷪=jޒeklKe0! !`oN!HB,aoBN8c<Q<[ej}GZ]]ê꽷G[U5~c LQp ,K =iV.4wu0Wv_]{jx]ڄ4OyW9[bGfe*y21$U 5,R c7ln|׊[JŻ|J]fץ_]'Xo5Zp07Bl#0;q1@ѥ'r?>~J,0G<{@[ F^7V@Bϝr{[|g|ʔ3N6fO#%e.&8A5$ Zmŭ~y(}pO| b%%&!&md,q@S6mrŝVovG2xK8>5O6%0t8QRqeV°v53x;%=M3\9u4iJԔ#j;vLrlEJjœ Ox[}zK2|L#trt\,e1>Z ˂諁e@sVھ-l}ݦ ͋퍌.-?S\ XQ}+88v`lԕM/q٠R Z+zbŶ;g`mP`~l7?:CGwрGlԖNmBɲ *J //k4{禩}p5-HH$CNG9%j2c mADRFKof ~w7? =B.v̨"CNJL6rZJe7" |k7Zu}e=./Sx.QR3 #Ep3|vS3&ʎG*RuY^O֦?`z FVܺ 9y]躼 cQ5ʻdD77ӹ9gDM$ ;(W@KE:a)lޣ=-X9rS0ÙK&* \\۷jD>j5Pœvm}Vp!a{@7 G~kF25 RBE2H$ڮ-iv&Js&x69,5nX]'stӵqG2u~Reyth;s5bU@JS~!4^.7>sV:%li)ݜ |0πmtf125d M$Po\.UP**5*t\p~7pͦ{ubi";5oVfs]386Tmu9+t7VTNd"Opm,L4-S!6w*&q@ed ࢤ`7xFUremz+aۂo|MkV6]ϭ4_.>Oآkw]DM"}Tbh-TrpƩRunSUYgpѝ b;/8:,d r\$z7CfǍC~N;Jk7X\~?gs 3plp3"}#\G%̂2% |Tvt{j;J~7]=;ݖOïciI'SxRA.%WA%l̲L2jJ1;E ?+} q淟?ӿ4e8p#Nȗ(.\?fw, mX!.q (R%O~cgѝN';?~ {s1 Kbq&YE(Ν1 ̰.CY. Tjo _G4nڇ_bI2:207IU .nD#r(״SNZL]?m9DfndJwυ(˛ ĭKuQ>B;jS5䅫6 WN .R0Օ trԇ3"6 I'kFu>˽,ϲ\Y[t;v=_3:=eE38.jp~\1\ɒ07LCO~W*v% i]>7c=;/xS ap2=JCr9t0a"Ko$ĀE \;9R̜&lwts2S0[{1g-Q@v†Z1p\7E(+H귈%g`Բ>˵cql_TD: ؙYp?3V߾+=;oGI:a8 0X a܊o Fѿ'F0QITiD1_p@Rg RfjoO!d{7N*` `$t 5w3+7!}9K920q1A=B"A?$0iҋIx߁^H@2i#{ay Ob5.Ux t#ħ z@7 ɿ['4l"2;y`#_/%OPd|mu۝{2hPv޹,cj{f;,jM .Ub`F4m9']Opa&y9̮2H5kr*h69 jRX"Z DTo#n 8$$Q~yZ-idJ.uIѝ&ˑOoe)qQL͑MF΀b-vd,S5%Z%Ig5oE P (pokmz?|+{@w/AW~PĞ3Azl +5}PVy+0"j9 (t`̰G꠪WQjoǭUzmsgTgO9ƄOSJZU;/9u]#Զ+K@O6CTm ZZdk*iNfHd"O(U!f~0}jL@:b^ְ=W: SPqqSկ/r WjB[L޻]7=q81dK,P-] Fy8ēpD2ԺueIL-Uel 2t#!URP}$Pp0]˛G>xqcn}x=Fw/'>3t)1>"IZIchd/|B Y|ڼ#qr~X!*pχBbi;((gtv)tȘSá`}Pz3!N;@byӓYtM/.d Xz^Lv<@z'[@}G U`J삈.I=P44iIBDŴ|kC Lk`'7GE .تzc @oZsz@w,7IOf۔'֬R o %QI;lvBL Ϟ(O=Ȅ4|$ HI} *Yqyz"ψI;휽y!GEEp~5w'5:32<P)UA#ȃVI]xP\K,38_ d\&WI(.944Gu 8d??nY7IRreyZ@Z`(1֭k׳E_A1y:o0GMnڗr&8 * p qH}v[r:Z)C-[VJ-G}_~GI᠟{=؍T$mctaCU$3;G'%A:α B]m OkZ&eR -覰T^_`;]=)-lc+9(|)= Em_O?r$eB@ievJQ !H !M* NIx64'v.`wrTY>;%’V6 d[C|xgU$%7]]ztbaJx '>3c'p06 Y٘ݙ,ID$>Et VRFD+m;0ޒ$4KXY'YEױ)<;3G pvt&ޥ% zKt$^R9Rslݱ'ܺr,pH^R>SR[tX&PRe[}͕.ݾMx9v:J`0KppC ` UYmAmCsp- FNC H "S?)>a~퇏D Pc: K 2#IsX`&v$&G;7Q&( ltZ'e-":}{'sI o*~{ 'K&%iMuu] _}/؂Wx<3/F޵sW]oAѝ ݰϝ]pdjNYԤZ\U*@bY.,5C Z>i[*xijrY7mm3mBL6H,lVݓUB!;>']0=o)= t~TM4d }ꃜTA3' Dh4⬘ |,Cu ̈́` xɦj#=Fw/0_ۇ'>?NbKDWe{0*d_,en,( |@yj'ٙ"(YEhɁ%"~\g*UhVh!ewk+ +4F }ڟy{7vs^+q+emzu$ EaY{·{@w/*a?.Z#rMEV 4ԏ a A tetn_0CּC'Xz49E—Y KRB4G P8x|te!'|q{-iT)fVG_rN> WZW\c4k5J'v0%†)~BC_ _cbx4O&X2CBBmRHc}4`XK1 | '@N+ Fmh8)ьR5Č@ϫV^B^~&b&C악8*\{55Vђ楝) ZȯvJւI}GZ &e83>Q 4&19kx#gf[w=;`whI.f06"Z-EG+ IDAT:2nݨsZ EIz.r:8zq$pt$l {YclO%By=67븵(,5kpWđտ,D2ėk|+oWiڥRA{J/GlKOIļ+HwfG!sy."^-Ǥcn:lN?l!hRЖU\a镑r@ڀc3[ꊆp$x#pH8Tz~׈y[_<1ub{GwcsNg{ߜ{}$D1}]s8 "}'RO׏ͤ},b_0U S iXtjKWX:@fUc3_/ /Ú hkV$&?.xv;BeEh?}ULXc1p`۞ӻ+6Շ{uЎ%gm 6e#&Dl'3˓$ցNDžp6JxtmyBt1Dz@̓e\s ISR! 2عEe(DɗƊTB q&T5葏V ߁ҋ-,zڻwYf>hௌ86fdVQ/Æ  6!lCpSM`AC`jZ#&7U p`׬H) 2p( )^I,|߯b֧{\g g_rXr77Ě|']Lc L},{:NyZ$da6$t\2!TEaE* y} $R^2{}fIz}!-OIVUʭB-I){+{>h#3L?Dwy? 6'?|?Ϻef1q1Y@tEܗ恮C{V)F=UD65aӝm#pZOxXÿz$}ktd gLƑ .bc+pÖ!#R9r$$nX⤲9S h`R5j2 k"4{ ֫u8n| meeT$E޶t^8ۗe 1qL)M-%U)UFM*o'g9暵'${u͎ be VVWp䶧v&yKՕgM16Ot=./ut=ϜRM-qoh Ԩ 8&erFc@NGE0'ۧuvi(gs$#!G_K^7M2H܇pmP  @C^nm vD8/Z_ò_\9]+ĸ|wNMI-~[{RJcɰCBvY͇d ҃\۪}$fF?hqAQ2`mǼ"k8ukƤI+U5oモ$mnnVBQ_xcŮ΀by(=x0(Uasu2挰T lY[[ϡ౓J׿{6@mR*J 'nCDPP}-sȾH$c +3͙e`wqv,N xm$nO 6MOPa'*rO &JR5~ש#" F=r8gSkL@ C׹c^jʞSǘBm~E/F]"4_ރcǀZ?bq!'XAiO={7g'^]l=bo@W~^4nZ:DvYθI/bI ;L0),/ց is Hf \d,pl`*/@|M/u\'yAne  wW ; tjt3e(/N T==XG`mu^$-lYpu;*! 'ɣ4xiNQL/.+:iHƁYRC n(*y[.±:l36:^ta HN'$ƅvRP7D52FhJ,z^mPi`[h4 :K-Pf+e'`j^4fM(;㇠x 夀+]ecUZO_=гGRQuepuPY<l # {+Ctew2Oz*3t_@1z'jTq#s~ѕqΈjO&`NXFf`goF .up5ʎ'trcҏ ı6uK’%0Ә:rqy<dsov@V%u$xɘ,+@R۷K M+9_= 1:]W&OCxb}x9Ĕ إ `zI%Q&0Xgvο{2.r~ʱ֊D> X'/wAʠZ]ם8zDp.ʮ;&VKВ 1Y(K^wsǎ"cmrIΈT;]B$8o>fm E-ǎwmN2-`ȝH rL*<> I\z͸9dyg?UvNh"&f\1,cMRJ4ea6F:bҵV'Ÿyt193 qo$)+}^2GbxH;H".") `ީXpO@ߠ1T1O/"ꈵT_WD/>uM ‘g@c<ѰUǂKꮇkH*UFb[~7_/Unq+~}wh[W*/up/],-Wcel DS[%J p~BfR[e;vHq0{qC%o1^1K-V-'!H3#r@Jipܺ<[۴f (LٙNQ_D2VqO@ľ^ubky Gq'n.gzQ٩9;Ns1-vïDG1xk]K=g4˯GB _REe<8;F6I؏f0CzJ#cqz1L\2..^f q:B(s", ˮtzr4 ALK1w +aDPXiWBuAhk&>#WsΡ3lS׀ȵA>pC (w/29i/֑@鶦CM*lZTe##CIڷ֗斐y]1ҿoOB*~ oaK ^N8'UȉAK, KԁRGޯL\]d`1^.[kmgW׀.aaΜ9zI}k|Tߏp 4 $b&L#D@rfPA$[xEv3`I@mҽQs }sm\|i@zt[E3򁐲R61Xl6lTv%nHnJW;Л4%MPNkt$yprd}"|S亱3%S&rzX8q׸%++Н76(`_~:fKe3bǁ(WJd@ĵB_V0:h`t5sTY~>WaoYvYd &:IfJ11=b(6S , zhKSuƺ M(318!Dy9ɽL/ēKXafz#0*K8[e $ wgtҶ1l9ƶ^Y7}=`n}d 1d6qdHks!s8ll2X2&g~zRm*Dd,S5 $6adE`5h֯rh5!UNmx$`k,4eѡ4 _;%W,$]iۿW? PbJ,Xgz յ$J" k?ci/ Mt,0j`e.yY]2—NX]6yK8#gWYkw*o͟Ł;gmDYUIvn+i:P-K`P)}jl]YB4^ޗb撖D;sJ7{?>:5hd˟:Ue}g`86D܁4(u_㢚JԜ m"‚X~A-% =86+V9#8"܄;~(peV['.9B_| ^njqtBDOD~77`Q! hl8^3zZMjME.Rr|ubdd♂ dh`F,6rMXXR)ֲjR#RJwEFáQ?dA6D=.@aMXtY$l'/нgyԋOGgoB[ށksXCCpG}6:%HjqT\V ba;~p+4^( Gc:MEn }/mOTZP[u8З?@Xzms5q7P bR$eWKcyiIg1ğ{,Rdi9)sv1Q B֤ߍ򞎤/:]SEBM8'ēc~?a߻3+`E[}lb=^.+9_%̌guʸCVƚtY p`aGmr>:uDUT3x\P_J4Lk;4S/۲P7/>x>GrOkP;wmd7r4fb4ӆwT&]鎊e̤@ {lCwےp86뇙P`'~iE%2`U͘jUg4#=W_ncsA‚T@;}L?Ns~?}a8r.~Y-ͫ%{ҡqe#f7XE (Xz,2&;I^aC6ȍcv#^ӒYyY7"]ޒ`r_9()qs4O]iq.{spO oer@>M[=7F;zf VШ;@/$-gn3n8ɤG$,Y?AY4aǼA&_~i̘alwt}V?ǽsPUB_BTBܟ/{}c/cɳtHld{8(ֵ14x[@'\4XdПT0=6d ٺ>- KXڛs@JǖZO?^ؾqAX_R DieScgjn+$ פ-^f)tz1'ɫ*"d;R̄! mK!np.#a$,+p#E#o@(?ʍލxY*.\3N2f#r:x6Ҝ 0ԥM {K2Ʋ1|B]G%j'hϜࠖ"BMra1K$P `.y@V}"\['I]f܀7~kq+~% %nM-1J.ƺ΀0g<gl@%"J 7<8"~KA$v'śŞZ%Zr,Lv.߆3n,u5M=-!j4SXAb|rd]fZR>09Hu~ccMWu%釐H'Z^wD(pN'%vlG##3~xΉygng!0 oƱ#8x :ƻxG Xf eR=_Ul@,TE QN6TN}άJd! KN4CXúĜ]~JX5m]@$u}q" ,p0L;ިH /S$Gϸ]rۧz[i$鹰CXqGgqAgl|*4$󖴑v:A:T\ͳ!*1g%Iv .޻n!-w`EhNKE#gMܹʴ\R ?KY'S@4r[Qqz^%9'\[皠mΫLw:(g Y-* 9(9Yܬ@Wl}ϲ!3)jH&J>.^faxQ'i\I(P ~C6?Ad>/M4ܔ r $,6=182$9C/^*Lg Zz k !y)E9RFפąV(UXxzU;9i̳mJ\9ej51JCPNcrY}!u8eN$[j VU-}a#0I 3 /{0Xؓ܁9FT~۰n9r@ .yݻtSLҔc&w@gViJQvS0(3PnRfHq 4'kx\eU݄9|e7iWLȦC_N7-wΝo%IRpy"fIc6e`žHp u=g'2`Ya)/=zKPxz Ҧ+S:@K^<5a{m^w>2@gq Yb(9IT>3s9xX,agKr-`_~D{jjZ*F ( /vG3ՈG2֙W|, q?i ij$O`ub쪨in 8! q%xvaË9`)dŠE`c{YeIm]'!V Yr.[G@f=U<˃>[ diim9 o B. -߽)Jfy\y^3 Sv(̚ݍL_ń@J6墨{!<*Zȅd.'dU&'Tf*<=71w2:ľZVgd{rRxL%K-|O*{st8CIԁMT|']Y Cj'~qOKԬ :dr/&Cg$H5ej J2BͬwIWzeK| 06[Du{5Y<dVfs.R~E IWJx@ ۹pO֬W[nψ脵wu`&Yy^5.ߔ ٞ}8*D_$5K#-Ø.d ɜks_!;V2"P0G2?xo= /*G:Up$Ř2<;f!8Oa +\8c l ;qc;ɵYG?jT,o\!R*166K!lVIBe f f AU  v^Z}V1d,w@+@eHFw"@UW {Re"c:+peilE7h, YCnf2Yn`߿kkΑ!{e1Xs> aME:1u! Ps"#lCn%HH?/P4cY5PʪF0O[9vp+'B,DvmLpbbk IDATsvp> #iEZ{`XJ=&\AӚm L >kR DodnV^S2ō6̥uiKv2f / *5E;T kIC^|ɞ|Wt_t+" Q<`sPQ7kkz.&tM[\] [K$IPdd&"4$(@ .d@܅DIwaN$}N\7߹tql|ǏG% %rR ((fձ&)*R]Wyp܈-%Ze팈5pNP֑\TnR_0t|n+ r9=Z+-`%okCCێG;&.I%X!$( 3]p]Pܓ3p#QnacpL8L@.1L(WI3-I5}X׻d2k>װ̻"FͲ:)x?8 V 1xybTWj)~ ! B(/N2S }1\?HG] ]%H9@I-Ld t⤦MH}e.u =q kV<\LHH{85A5q:r8%NS| ]}-zTP(p3 M&FmW J]5$' JkZN_;c/cu%VA9:g cQ^+62yvzw! .4*,W: X3Л9uKti:9"S/`s]3PLǬbc$tmsmYۈ+9) bVⵀ-_S2|tȕuUU#rDvX=f?y*N {loJ_m9á4(]b?T^aѺhAݡ&GuԒpv)%̕Ȫ"۰c>i h^19%gXorE93Pѱg nz玱/:e\MĀ PDI2mz6+,֡%ZǴy6Ta `5K?ҧ^/g`JSHHB-QL * %դ}=z}wС.A:wUi<=+Cx VȩRu)I(/ƹFϱ;'j LKLvA[GDHH tkXsgF&WO&J2]a =A4 gV'Q?-`|+ l޿<OQ`~ By"4oUcěxekpeť4ʼnv'=l9/@X/ֺh4~/B}[]_kpRJ fj:$Kp%A:W^'r/Lm@0!EW'HC]xmO2 HIP 2p\QhX)A"@Lkx$c5/!ODz\C;ŊꨪYW6%Ѵ<Ր{UUVE|ߺ9kBHG`u.c_@p9O%6xنu!AtN tͭChގ "8or8>^} ~ie3^<肒UQPG/7:& bW ui!$4OO&XgB<® AE%g| XG Wz0Q?Y tI.ٜg:>Z!dܔ4l-oM>ΐ!%&k\ V^ K').PL(|탮IJwoyb5*ӟΩ㣗*-Sס YV}"K='7He}+'/ݔ䋈uF~t3=|]b*":+1>ɊKeea~浦vEbP@1(DFsn딻?tH$4Frʼnt+4A&,.$Y.%tvGW#;^YzS<cC^r9!^\8h=4z: M;wH58W+2g׷caw#I=̦c4;/WO^ְzbשUߧʦqd'SpnM`~2h lX~؅?[k 8PgguL@BEÑqpZQ Ya&&KQD Y#b~A.~ 6f:84ܐWFch7+"#:zVt z@b(Y%U*@J$AJ0`',!%]F%4ї`<@2NtDI_tP[ 5Zk-[^)9h"ng uZc*k\xl@" 9E~DTUVA׭?<*)Y(@߉lؕ-n J^Gq᥮ғHVl,Yz?Թ~="xVl@V<  գVPE[:X4\qVbDaD\@.չh^IU-,!7 UC\vΧ!XnD7'x`WQ#TЅ:CNLGUuQX?gy2U?`\6n)P^M Ƌ9y٬)gf*tm)%fQTc`LFz[=AdnIV_o\CՋRWV91Cy\ prlt%6@Y7:4cY)*HA~Tpy-\4WCf.v#$qYjmbmHO8CCB\{2+(ꢍՅ,&ř. cєh\e=~!p.{"R[\^VWϳq=wx)~Q؀ufB$_/*R8 7#P|Vg<`$6( aEΊoҞRaL稊+lr݃.Ky,ڱ˗75:PQ K\ IJV,`%;r!0SÎO')Z t * @ (gF'vnWc1. ֻ.-qBjA3FJDp:7 ծڥFK6_Tt: tBl#×${4׿{.jfTr݋]a-ACqE \ kɿp=yH'#0nպHH"l$ i|n:߉BI7J3=*``B/ @.ƆfQIŽa٪ZY@LdFj; +J"' tܠNDX+*J \a"#<.03,!lB+ߚ-~NqNZnR&MA<$ `=Xu{6Cu wHJ>= Z2=5WSGMoMﲸ~{@.8Y'D1_I ۰A:w03?]cc WsVR^A.8}&P:Xce {Iу AqmҒ NJKp.Z%'@Fz1~~0`a]`k2 ߜAz(cv5e}EwY:l rN#!Ir$1@/b4 3uϯSu޺wCл `立zKR9Lbxԍܭ\^7|?>z L4>6$"=7n qq5ߝ7uz')13Jb5 nZayV^Q hta疑+] - {~@7|N\'KT4nS MQm ' -pZ]+>`N? #a䘄^d1R۳O>*% K/ `(ץYRrEmDy7K9ԬFSFfSԄ. X6*:ݏD3'쭭܈/ b*+\E2&vpuз}r:r /%Gphk'Q(! IDAT_t t@ v_S%y]?c6bHLد݇9$.fAA$*G%EIiӀ[=AC?H5My.G̡5aOzQAGſui VaYܱ47s귏_(=: #L;+2]Iۼo` CP ]u:=գA7lH26t=mm3]٪ltBb}A>NpD.\pb sK>$LeWgz'yu)!ė).P4[[$*_g?̭>*b" I†(&~ună>G^_oH) .4ImIiCíM:>g"-N4kkw_9JQqRN ~U7iSdWHsW 3@v`2aU\y8bӹ//&QZgX1>@p1yy):G0\db 鵏q'JFʜ`aĐvf\ij3\/Ga9 X*byysIb}C:si+3Y66ݑk>͋N߼ $~MtR*^$(&TcYW@(́.{-6mn8ں8],)ȵg rTҥ F>' O^cem:N 姧JlW%IiC SG )L§zd#grqRษj 9pIƊ d)L\wWض^=x~",ձ t0t2 ~ f:&Fn%:ӀpsR,$ OYIT26Jکoff n'k]\$m Ƽ.Y9VK-1d桘1kct!lHy8\C_lU d-T襮JqPtZ=G-rFiF&(@&qSz'iHt.H+sk9pK6]azu1v#槺17ѳ*]]pWuTM#e O Uc+hɉ',Y^7N߼ fkAڐ^T4sg .]`Dz@t fM`,jkb]SK>' Ք  v]Q^0k;^ZXòO>Di%DO]SݼԵ1\8:R; ]n0~DurB$(ɺ!„K~eVqX鐨+7I 8X|p}I :R /g񹼘jwq+l\gGKYCJљ9^LtaA?r\<:K=7xt|@OtVbi8J]"#WP gÂѡd1"lH9|V^iOREqM6հ=htwz/dRV\مNY囝>G.6{bߜCi"PtaRWą?ڍ=Osb"j>#bݤVgr80N!tu@N`!#ᵣ30?ݍ.(GMtd(5\Wuņh J9 7jmrpx&ua*ʲ ީSXSN:jJQI]\\IN$5GU83gĥmFov!%asvYk+]a 6ƛN^ WǞ 0aEo_J뚾 Fn1o899<<鉈2&~iթ8(HfŔwk)jij>/FZ-""`rhcCavqMnѩ7>umO51Q 3E^wҵB`U,"M!.~+Xs8^Z#Ԍ#kFҖi/W KrٰIR3w[4MH HJEL^nu/o$VmVNV/6WRЍ>ik8׹.ݝ`KqtJ qm<Ԋ) GgRX+: _ۯ#胕4mZ^ٖ/RN E帀bGրNΏb"Ov]OJC&P(]9)B(<sa> Gn]l݉q q~P^=+ Fn,HϹ~P ^Jɜ(|JϷVOOnP4NWzR䈣2╉XܒviDc gf1gyq?l[#yY[z/M=#' cՋP@WO=5u\Uta.@[pz,@`ad@KUlR&/}mmOxo +'p|LNv1yB0K(/;^|f~dczV׵ݤS7F\8r_z>K'1"!O<">8_0}@߶2vYQQ\UI$b4UJ@z]W'9!d#r iŴeԔQj6KU:3}590ҫsd%  ?@yX؅8um.[i) %r`.co/&}uuY\>JwKxVObM:sلuTmi0,X< \,;(85p< x6 7ӋR_ ry>K;/mJzWy(Lx,[a k##k,%ip9vп[ǞGy咅Ҥ{`ryjgX9g9s5m3AĀ0 -Dvd6Z‡ F`Y1LU#O aa yzmp ` fnyg&xZkF`%٩#?QXC@N:KgEmS1ӥ+A:^{XPP-c,hϝZ(: s̪hȭU(?y:{UѾh/gIPLxql[xoH{134G!5v ض݇tȝΕX+}/z}Ў,Md`絯LTg, YBuDv;dffe{Լ7'{H%a.WEC?!$G7[1asΤ-@ܹ/fz.]957|ݚ I,VK9,tEBi!]t7C-䍾N Co_nbDΉvEcP8Cm[K&}q? 5kJ̏_;M'w,=C_Տ[ڦ,+&V@WNw,wcn{"_~ žXk緿ӏƿûu!r;_ZrB@O7Q'*HK^hA&T'C]ηv K#8׃㌞~eY-6i*E@C3e4/>m kmOau:"b<<Aoͱ tk/# [DRhۭR>ٍsSݐ+6\p+Z8xvNkB:2c׈CXn]ތXO)eg7J`YK~NDxN/ ue(slXr} uYocj|DnnD/}b,- 97;p(6ڶՋ8$N߾8 (]b>+¾Wk>)=%&cRXsMz zOft4JhxvTVSs#qZy3I `ThTUR"RJisC֭g` \`L #pH!s0`q[w1Oo+ɚ="b(&\=2*k`Y1 VQVvDMl~]A=DX#l*(9u85;CZRTpQ36Ċ|C sueU,=kɱ{=J(+ oNaoV<8>}{pO"J+A{}6⬩~h `W骬K;4+WT/U& (j Jή;h?a}3") Cbߠ%|K}cV @B>؅\~M:›e+$lKnFC㬜£{ԍ tFcq^:: ƣOAnve46gEatj{i ADl Dm}sp'afܩ&AM)0@kU5\M'rAU)]}Zn ?oYޝ]BS7FC'qEl;ͣq{5UD^cy3% s]/& -*#?ʯ2B^'{?e5QSyY98}kn^\bRؙN` s3ݰlqu v WPZf3Ͱl+lkd'B0b ad(@~&LQpEZ(AK%X!(&BC!@WB3TZ7xEqДk|}܏ŇPсŦ~;'mcs=Č/U,;vcMm8;wx ι|kgon]wϢ\^/Ã'Fw' {^Gս:݈y :-(lz0 K eM,2`ǦDxTh,RG1V qe޻=Ͻ5LelMlĝ:yC PSܼ =y>GOOcۺN膻bqܲ-d-,vʦX]pn%s<2mca;e,Wb콟EiE3L3Eg4Ŏ&yNؽ>  o-=ӈdorQ[٩ <{7NiX?6lDW}Ʃ~=eqDC>N)'wk1؀E*&rĖ9i,wv^Zݶ*quƵmw-ioΪgsdWp$9|66RVefG<#Uݖsw6?~|Af)D,q^(E_} mtuS݇هCit7ޚlxIE,.7-"`. ! K?[ <|$ k\>n!lߟ4v ,E\$Rb9n0F*JR4 ^֑(v ptu~ :0ܦۣ8x}0}IVc'wcvR 11PF.8[*=YB=rQУH6U =h; P +lxج5Z-FmB'F%*uoWQ5_VzpJVtcQ/+=C`&ض&_tZ0=?E`|)o?2t㼃Fm/ubH1 *za< OF=9 { )@X2?uK¤Iw Wr o欖B@gRJR( ~ڴ)ص⤪'+UBvI!87N4OFLŹ'ar GXzY2S0đwXCܿ`Yp޻sGÉ뗶n]@ =O-ؽlnU1ۉ2 vVUi0Nx'lHG#;Fap [=J:ǂ_/R4>3":EXk݂ BZ`x;(l4yX6ӷFFy?:4Eۿ'  skK`V`,*(X|#K䧱#aHt$H7z魞a#̒UUw14A>~A_7_ïz"9A86 a %dm <8 !8ӹbܺKs-` 3GodUqWw:X5F(symGl/h{ +s*AeDXq2Fq` `DB GxoFUZU{Cʖڋ৥^ kL L:|mWqqJzVf&oܝ8sP*X&3Rp{J;.8Sw/⳼mGQ;4|\*_s]=z'!azocLk2 Tt!z /L+dR^WNH莢\?Hɶ^ƙ3( ΪfLFHO1&G?&pwBi <3EnWfoߜ6u2 E l Hؙ~a|Q|7| |q1?ǃ{;7؅DX}.V/JX"k ,<}/|Xx2'B_*oYTM ) \]Q 2Ȉ~5IjW^[dY`iJϺrcGD&00P}PýOv,?ޝŏ 1|+l 8.8$̑OSixG,"nz H(r @]%Uqx""\5Xsso7hP =67 jNU )jknMcSԋ= vz=uH* K0=ahya tj%'a5<"#}sL";9NYtr~Uդv!W-8 y8 6sT jc3app}~ ֲ ޔ ,R)GcvgZ3G6Ì-k}p8xw]E~Wgw߼Ns,"nxis59W]@BP G"%#)T=y2%7FJE!tP!.RE ;p-,?胳CYR ?2d! EܹRZǿf'7"D*{pgCC?_)~sg_{t1岅Or~sc) ݎ)Tn Ae%* D?pgOm|t g1LD7(f xY=Ͷcj>!gn.\xs>ŷF/x_,~md$9WGu+O_ =Ԛ;=͊L\ ˅*H1")m4}娻1T1 6Lܒ w)w1g1vqM=޾} :|!rW0Wx`fz+|/[yݹCxQ&zv_;x9zKMD@Ã;1? !gx Ǡ+=.D f{? D*聥T-Q0h'98K6rlAVb567'08-c!^TrD/3~9L|oC8>:8]:Ɓ ڵ-NL<}F&˅(Jn _x Mz%nI@l n)j_!UUoNw3+E'얶;>:xglܷ >3wF!o%)*5)ۖJϟ@Բ3|^zA"+sy(y{ƺ"Qd)h]?;XFK(,-N/t Kg}e Ҿ. v_r zO 7 }:ߪ@W}8t b !}xhvڶhR8Krw?ރR)D~읱io]Ggn['Ό~i<7Bm8-KR11ُɩ~6xk6zصk{v-Uf 'uM bbcKgPpI:8s{:F_\xs}=em8J=ށ@{}l^e߾ҜvpX'RL7/u%w ඀.{.I*}&X JOllBle ^}yb%0$wbj__ n EwoG0QTYVi bIKBi5g07׋Nii(RB GI(!]><}uUwG8/~ƽ㶀`IP!80-m%s-0GDZ\ǟ+U)}s3عc 9[j 3URG8JOWyu.Ã'qExm1ZJ*Vx}=wgHmEi5Vlmu7ۖ/sgP,2u%VWm<}e!(~26 Kx_l-v;wpyC'aI߻s^7|^& NjoMg۷/aǶ%rҏڄ`m<T?\).YBówG9oqq[@T ǾŁy݊r$s<RSx1V[6WZb2 ~zIxh'f8s"Q~wG7N⋟lqq[@F7U{>8pJ]EЁ'(T( +?ډ""Hڮf>rĞ/9HWd>Z0Sn||&⯞;Nݑt}i֏Kmؿz{VJQw>B+ !]]Y)`qٹ^NRڶe )HyZx>5XZ.N Zٻ#m-|͓n" ޽s"^7"P*11ُV mSJB>ӽcے$~OZmRTl{d^~Ot{s;8ӤMT4j=6M4 ]ĢKVRĖX;6J nBӊ]HCE;3wf8!M+Ys3w{9;yWݻM81\^biJ>n˷6V!\Z`=1&Ī»KxaԬ1k;r5xWC;qbh1RgBDO &@zHYGU)# .5XZR,ĔK!ՁARe}})L\`Z*勵Rxnva80Oɉfͳ28Fx]kwBm][!$WV #gNmxQ38FmSvGe."I,Nʓp\xم|!';kZxA'ijJQu5vlgvC\0F"vۧ.hi4 4),hR)T"*bL"FISsS=8I*,V{͌ .0FGxGy$/ {_G"J~LgS,Ex6׷LwG-M x%qjqy iW= gRc8fɐHxS.l,?rj$ft,wr)ҏ%B6ҵ W7ŚfezH'6 xn%U[j\:jl=wو7ϝ[Nt9ޟҞ4:}ĥjۚT}ʰMKIbYYV,$v9yZ~p**r|$NgG_˨<#>S,$ WS)w>8r6%}WYi4YR"=*_pNJ;ػgRdu,sk&TbIRghw.;µF965 rva͟;;W ]sx4"̦L9ORȶ6Ձ6"H؂ۨwjޔf5Fň XoiZNvǿhZ=];>|QD㦐og]"9xG =Z29/ʈor32`PK1Snm,:zDPU֬qo ,Y[}~#OIsq[$8{|vDIE&Rg&`pM)bP"JK }m>^%=:O+ bN56Ծj^0捑 _,_|5 9qtl'6M=>6틤EU)FZUHh0\m14T\{;m,̍(sm Ij ]Q^5x.$3Hr1xqbÛQ&G3KUR RQʬ?:t(})~%׽GȒ>Q%ȧ;oM1Z^@8O,νՏx'&94Zqr#/ >9^ OSyXa'^ecKϦ6X$ʹt}ZخlCjIbHRKZKx8' yGK%1ZM_So3޾aJ$ .GNtw585S( (:J٩Dt"{}G ]!!¦=n4:ٱ92p2p"BSЦ-T[4A"Hsa~rllIENDB`KDAB-hotspot-41e5de7/src/images/icons/000077500000000000000000000000001515036260400175025ustar00rootroot00000000000000KDAB-hotspot-41e5de7/src/images/icons/128-apps-hotspot.png000066400000000000000000000161521515036260400231660ustar00rootroot00000000000000PNG  IHDR>a pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxy}?cqAAHu8$DYK(JюcN+a.ƶJ]SI9K[Q$9+DM)Gx)AI ,kf~؝z;߭ޙ>f}EUƅu6[l`c$&686 IKClp% ǃǎܙo7?uyVR0{v1b& |EYi.z@R2ț{]&.eYiluokO*ĞuyV1 ^=46 :p-uDuyV.D}\ZG~E[ilZE8w9<`[1OPWq}k6޷/N=. /xW .Xw(O=lszvn|Wο 坢}|y%%;^Jcc}0k{ơdn{z]ƍ?:.'^ؘ܇$Ӂr6d P>5'f`3:@+l8 soA7:{]^a@mEFv텙AO|/,w?:,jcCr w]6 RC3}ܽV`c>CD/>zW!Ax4е-\uщU.br~eګO?n݅I-oW1<\ulT~75su 5*|Gĸ-fw@Iډ"AV sڨcRψ5XniWo9P4R0Dn~}5Ш87#_sL#fWe@'B|o@e;mPF} j(8g^UD@q? `uMD]}br=I^e79Px4hƍK4j~\)؀.оJ![ #FH8ԓwן|_[}MJih@a.AξJ;n`]E34vkk/x>b@{ɖdo5fKD IXi4m$vD-]%@c)i/Sbە ĠMS/`#]jdU #-DC\F8uRdp(m 8Aq-X=M .!~a Vo?StP&=*fShdp! WHޗ?2@c_-/DZmH8ۢ΁髒} c*D@J{v$_;Jvo2f]ߛm3*Mɠ {WyС/ 07ĭ}g6PKwu NRrGZ 8k5=,fd9?A=GK`)::fp 8Paiu^}eK;%0 .Yt3  C:! R+V/ w'ƾ %F.;^{e/%:w+/q[Vk}I\ `@F½0]@/[IZ,d$A Dq~\l ':*sЗĞo`$ۅil_4S1M(EĻ:ɺu[aI$["CG*^cG9u?װ/ x$p \ך]ڹ|o:#'#zHd$FQWdB/])&廎3-q u?[; eIz#|WK~o$!_@Ժv\W}K1[tyQ1!b B`=p,Al/znLxHg:,3輪9(?= tHDޜ?f[ jxTBݶ ?'hz>#*` /!/֎;dZA7ĐsAm/mQQt"I\\*zaЕG_ɟ"$M/r>-Kfyt0b|$(B¥&T!N]o@_`31B6B|/"?l!&3欣&O޸z*nڽKK֢tJ'61i~8 I>^|=K*:IVJ `X$8MYnYVAP?@"x]`#W/} lov{1U8UAg37^j<0y0( \ޏ K^x|j%HH֠Zj5T*TjPPA#x{jX4Jv8zFFkIWY' J'0`?H|O[bQBoIX@lq uKL5ٓW/}7u9h"P[ R(64F]z!3Bx q1l H8Sbx4vi&aOמK 1ޥ!i9.À 8%Q~a̪?n{r:_ -M ђs sI~J?-}blaa̡ d/-gޗDmس/a!It ~j\Jαqܹv _D ԭffyx/lBT뛖Б֐/ܣ;'sLƋ& 3(xW@E>D .Z~ǡ7o?:nI>;)ͣxr@!<`@B^$L7'HM͵ݷeΏxnbIp8u0ECgq1LOsE ;DuAӻW#Ѯ71xNLa& z5?&t 3po{ؘ̖KB$HڛQ~q v-n.zwruv`]C_U J_87ٹg&%u(ki = L蹆$R+v5ߋ^vܓ8sٚgf-ĩ/ Ӕ'w^ dб.TZ3r>w@ L Oj֛N]AE$pZgYO.|OPz׍%K\ ع -=O``tPCmgU{~jSAf$6_cACקZ d[L%d$ztnVƒCEIZhLyX3uS׏<wD9{I5&(p*L_Mv kHc|~fAvg51L53 (707M @Y;X$C{BF7nCr[gt&X|=(ԧJ.X_ZdB'4*&ZN HjFYbk TNp. RbX_`x!-Јz' Ц_s-Y?HS*yxyaA`tfB-L;33-4kEEWͬMzKQ -,Pp*K¨EU.Wk~~[ݙB$6[/lHMw̟g>2 $P>jRP($TVe W_kVdK5G88J}t@L{'h#F ZSePV S Oӑo ]IC_|GȒnLSPYQF.t8?^z zN%-$h}fn2'.)µwX)G½6c^ %fjI4icmJ[׎jm-"Bm{4Wp-mo1+YÚ%skg=XnPFZWiNfEh\YB-đg釂8( &K,u^\k6"?V?͞ / % %HgfdҦù,dmZ˙ tKQ &!J:V$/g{.5^Y pw{e&玏-OD ^ꦝFP06l_,l!E'J~? 4EXJX Ymǚ%@ }Ys!yC0f_FUkm/,z,^1.M GLj3[*]5ŋ&n)B=2&Ӷ] T;ba. u9Khj 3iP*犕ޓ+Zi5m$?k@IQ\8>cSDIT%[ L|9O_( T8@C 2 V_b3n.Ś&>p:[~nF9Z2wdW}%$`ք%i\'4vBt^/(\4a˥2mQl=1{gXUTfFղsghdaƧ>/$0ծфPo#6@ˊ- !gl(=tL<;7UbG.ǓȰ}W5^=d|Im5K _F3w 5`P=ʉ]8YWke_ϟ飏?^e a7Kq0j)h&{uvH V .B5EDP4QvY2U;c[lQn=Nh?7zQoú" O:w͡[r^Thfdsyf䥺6סu`^3]0̜.q]I勃1>© yfM>zW_;օrX9IYXqb/ 33R΂Y<5 %x7/ihj|μ4Ϋ'' H$F,gcjv}WX=y{zl2\.Egxk%(X@4j@#::$ B`L:7N/o8Cw^;5Ws3S3á+'@޾uwKca/q!-gQ ħ(_Ecs塯+۱a _;x0Fw$QF]8=: b$&68?<7MDTIENDB`KDAB-hotspot-41e5de7/src/images/icons/16-apps-hotspot.png000066400000000000000000000111321515036260400230730ustar00rootroot00000000000000PNG  IHDRaeXIfII* (1 2iGIMP 2.10.382024:06:04 15:12:04RmGiCCPICC profilex}=H@_?U;8dNvQZ"TB&~A$Qp-8XupqU?@]%1ݽ;ߨ0 Ut2!dsBb}L}NS_.Ƴ9@gaolZ:}+I 9A$~~12yP`YPQ?yZ= yme4G" BʨBViOxGH.\e0r, ݚI7)^lc ͺmv<WZ_mZ.ۚ\OdH/30t qd pp){={IrtC.: xiTXtXML:com.adobe.xmp {FbKGD pHYsodtIME IDAT8˕=hQ}fvffnL$"qĤFADPP4J:&X60HPDS؈&nV̼ٚ$~s|`Ht5܏ |$H tРG~60|bkٜe}gJ 8 & ޴ aVUsq.Hu76өy0XhcYԈ#SXY+WYu#H`K BA%a#JN;]D.\%0r, Z /)^c|;N?Wz_3ZZ.[\COlʮ)}Sz׼ޚ8}U88 ={%r: xiTXtXML:com.adobe.xmp bKGD pHYs & &Q3tIME)Pc39IDAT8˥Oh\Uyy3I3mڒZ(MH AܹBHXP\ ]B,("J ըElX)5$656Lͼ?qnpq,?vpߣ o]=}8x'yFɮaR}ffԄmg@vן=XW@<@O2&ݿ]m19Rdi类(n@'TMwWK^J[^e|kɾ]_7U+c3ż[Кt‚6c,xNDoLl>nfZUV* Cz;e#~2RL2RaԦo̞32{s?c6ۼ+Bm`:qݣ6ﳧ;Z/\>wY1 p\Og,N[kFRqfsOnlV'sNu+IENDB`KDAB-hotspot-41e5de7/src/images/icons/32-apps-hotspot.png000066400000000000000000000175121515036260400231010ustar00rootroot00000000000000PNG  IHDR>a pHYsodtEXtSoftwarewww.inkscape.org<IDATx{uvg}=3;A`gv{z{ns=ܻ\ą \Dwqg'62\$bT|v95. Qw|֫8׸H3n\4t,~ olvY5.Z3@)Nu, p{}#w Pn\"NAJ%/t< pZm)ӵq_vi5.:AlXRbsqA9~`O=}s\M7'شhN}$}y.fWj 0֋?p}뭝H9{L/m Xr.*GkAUKG޵\y"~O{{[KFWV;jt_W}z/87r9dh_t#2 -tP33{đeFfm݇e4U7 `!VJW?C/mRFQ~"xwbOGK)}kYVZNu$"x[v⦎sD'&N6Xwz荮E>,e;qbJyFn5ke*q /V1E4/݊*|[̠Ǹ.YuX=w7ـ>*L6񐬩sI{ ޯ*EDPg _=]$u|ţ޵zj̰j^ !Xf5RAteM|װ:y1373&bMqAWPܯǪ @) ҡ=uqδEϐ}<g*`ƷΞj_7$zSИ?#C ]XI:fv3LƏ | L w:N=yDP8tUAOhy?fv=&oB°nVdH!Cx꙰  O@UKFQ@ƥY㮢,Ͽ`X{,~ 0N~N heᜠN_@P8^/x'Ji(UZV< Z H ax5>΁sD33ߵ=0%wD8o]x zMppPLGg-J|Ƛjܻ-@mo Ѱ/H:Cq7?:k^Ϸ_;oU| LUSi)5瀨n+xˮo*(u` h8y+l(/͋ck`R _z+>9xâA}&FܪLP#8+wm< BkGi'(ρ벩ޣT;>z ۃX@iUEy [%I(yL DmɃwsU^Ŋ'hW] *(Ҟ$?F?w˟8r-gbKÓ88ny%i|(42!]1clunTjgwV<Tݱx1ʠE㾡5^0\Wwտ;(V<Dw:$EH_kqG {*Z7_mgU̫\Pt_"yH smg,!PQlX G}c=O;82.*|o$$X{\n oٵV<luMπH[9fhҢpk}\sBˌOzuѲo3B5I ğM=%<iH4P;[{=Wy}O8t0)dSm 4rmr*hƂWEM",i!Qk?}+w\aU@bw.sJhBh!BZ ]sD(!BƳI|xS9%bqןZQVGNZFJ5R*V)GJ2_wRM)Յ0Wيcj6QB5* *BrBo0 |xX_RX^)i9=G%jWSD>bMDD9/`$͂"I"_ɮUijB%b-D.X$FjLOD"/G?!FH,筇c'߽Yb@#E_r[=z8'14 4vW@DƼ!l r@ ȉ9O?7@18${6}v#/NˍUEAX' тcO.(9/3ۅP sUa5D]8_G<#䌐Cđ{BN91XP 5)]Eéu_ȹxٰRSA -즧 O7u@N4}NMF>QhC( ro֣.[}V>$AmFTWKffML ux'BPҜ@P0 'MC`_5)?;n{J+˓h d>7VJ4ohP" (aP('$&Aj E!`èE{Wle%r KGj?]DFH d4_Oc4&tJuZ:ٔ7B1!B1!B3oV`E_/5Bbם攟|#붇MA:y=1ɤ̗$ _{li$'H`[.|m64%&I{)(yuu4u /?+*!i 2dCӜ$^qG‚ PdKQc DUGchij4jyVSS-G@x2;$Ij&{D3XSE >%Cϱcb5DS lph,#z{o 7m۸[*[jfG,,0 ?i 钤rɖFZLP-IgvVjҰvp*qZҶ,g`I2\hVZVm[KcNQTfP&%4Ą$%{m֟k9bGDbh6wIMb\h@~,Cj,4f@S5p2%NQ?':+4Zm"t(;`&mc]6%XIh<1xi 8KU-zqE2ƧURrPl۳j'm!]L3E{@gمO^6˰~(n5AJ3M 5dtT l!_ kHT5UmS[өZɱ*6SSѥc6~Vdfrb!-\7ߗ@*-^"6A38\u,v]zr'\kMI\笋Eql-Cld%g&{tUAUi+X1:sO^x6g Kh]hsX(ZBjDE o'x~7۷%02`G5Z,F- k.;N+>/.kF3$ؔ'.x:+${lk}5bm] B'\.~D, @ETf^Set{7?}xqO;k6Ӹ.\hx-pV@efr&˸x480SN⾝;xaȅDGkbXecMm:Ȟۚ|_V˯ NzWjU)ܬ0Z 7 :<t0 Cw}6OD's:}mk:X|'B4 ,̗<<_A 40Z=ct8@&^2sZsNn|*[6o5iyIAfXH?^:^ ]'x:rۅ  Bo|v.{m'-.v2(\4D,^{Ϟ׾j9F O7GWeē;x?}u-hDo'" ̖dZfxJ=F\d~WOǪ9 cuL up;|K+41C39H 'wAm%Mw"C \]*5x. S/{ ~mxc~aZ×=nw2-8So~8j&^CHe'.K]'b)-Zecj_|=s7w"E`B54A!@U9J1 CQK SNJY]]oPc}Ϋ1P?6L8c/ZTk33e|>dTs59®'>|`z-Ul(aM804Ub-vVDZwh^$ip-LW\ETφӍbӬ,1m8dV6 @gB (+}#! ;/ ߱#gp ջ(zwSUX%z~64Ӱ N2A#dWvi|kgb9:.T_bzcV\Mo]۱G@K?oS'q||ĉa"\78t`d̦ 5;~|x/ǻG?7mX?Kf` Y?&q)ٹbtlb*?rGˬ`X@l \ck֔~stt߈RLM1;\u-֕ˇ T,32TnzUaj>=3g~;[hmFO}t쯏>(^j_Z"x}PDPd BKmI[I3Lv.{>L/9?,6{sXwo*fAx߮ƼP޷/.{ށoޅt\x칣'|;y]=eϽwlK:z0VB~=I5jj#7ONYSYTzC_36\ ~ȍkgml/X(D(qW.V܏B-L%t>{ۇpb$FX3#_)kI.= !F|nYD 7ܴ<5=R ii>޺]cL(;m稘vv* R H @:~&z)kJ,!)'x!xb`8?Sy-SiSwH1 4''+R =4@S̷ZJHe-$k2TAiUb 1*aGmˋF5$m %pF#I@@N+R .l[f#{^EKnb 11;/ö4Z8Az8A ][ 𠹿_Z2 &8FtSi,qdRQ}Wc[b[W:2W}e)X8UR4JA,J0Id]$oV=^cJflK Dоxວ^J,K/{L"5T!(>8.]Ww .U.Pv`E+*"[v}}$r<*N>*& HZݴCL3>K x%j(C;^uXb/d(zPڱNa8vmDPFoZ'pdΣBD [wEFoz b C1RA%4F7J'ЛsԮ *7 ȇtj Bd H-[U=̍v%yP4Qφ~Tb#5`lrK +`JG>/92G3kjMb͜{@))rreu'0\ōʁ!܊6ʖV_C&ϡ=trAm\q;%"Dz5oȔ黃P?;֙Z@B"(bi ,n@1"!Wؽw\B٠lᑼ+\xS'ұu5ЃEӁ8~ict2.>bٲt:s* uN4=2MT , xLh|Y2}fڍ)o$=qib;uNi1.eYg ^]OcȺyޚ(@EZ3: AS&Z-Be6yk"3nnuh1U._?<Ŭot)A[M%hZ4(z_b6_w??1t|3nțU fZ3Æ@.faHs) 'w=s2/;Ӯu;;63[cBuQ|v٩'w*S;3vֻ_$ QϒWy/ ݪWһ_utIENDB`KDAB-hotspot-41e5de7/src/images/icons/64-apps-hotspot.png000066400000000000000000000057341515036260400231110ustar00rootroot00000000000000PNG  IHDR@@iq pHYsaaøtEXtSoftwarewww.inkscape.org< iIDATxk]Ukyϸv^įIL8$Д*B ѴR#R*>! PH(NNmw̽ssù3vTb=`IKsxSE{{\0Ox"E{c "P3衽.>3Svؤ "}_|:z÷>oо׎׌||h'fKooXȾW_m E /x-vZS`Ez5=zVw7v\}KNRLVP]u$r0 Crt≇4΋$t0\Y$Pۛ?>9wfC{0zZ4„CO2FH |lK /bsخ+j B"~fv/ X*a@5D[cL-UP1`UɒS?[!Dj63z)DitQZ3pWŠG+ ꠓKQLKg[եe2f`v.^ep7)[+"h>t-nVo85ٱ#IkP̮jQ9;њώ.ui# uGnᓙW8ûl2y+ 'z ̹sjO2t [h2#;_lc_"C}e]_X{,ħP&cRT}#T<% L?q5LJ0&? e.Io-$&>'%U)[Zz]Y yH`!#~[}A!^g^~`#q(\&??RNeyP ]<蒗@` ˛Ag. EA.'xeϩOGW:`*X!yhB)@"aozn  {Ym,I5_މSvuP?n!y&:{&0d|&'h%A_oLթ/U[欇k cAB6ESb{D yi=&~!{pyf0n1ehN!(Ԇoq2~kD-hNhwrWGɯAL>;jDTxT")m JiS p&Tpds;s8nh@A+_Vݖ*RSFoX?{׆'-nI&iͺ@{S!uuV~m8Ɔl9Hō߰ٷo䩉 LV;'nC+VK\DX#g`D!Uu$"G7*qKq*[cn~ {_ބK}u_:hQ[GƻEqTgAY+xwFuu~]._''8g*E䆱*vjȫ]1\j*d]Z򸵟ɣ(Cu"r_k"-UTk/1Nk.D k\ʧgWkј VX BeͣK}q}Su%2;:@My꽩k[P.E!, U/F/>v)GWuq $+D iNZ^ʙREQtKRh/{ }#ͩCT\ RـR *w3 yTUٿ+>9){f O/wyEhK[fgFY r۶E&7YZ,?wn{zk`PS#w~f| Ƽz}il_)W;~ MZ핀$}u)ۦV\4xq߁2;ݳwl/nVݫ0L+peqy;{kص2#"'[#KQ2ZoD4!Ie%S0a"j++/~CEya }ߝ??^ AߦHU$3qxg4xR>{ߛ)P׊ih 6o*IENDB`KDAB-hotspot-41e5de7/src/images/icons/hotspot-hidef.svgz000066400000000000000000001364071515036260400232050ustar00rootroot00000000000000}WwL+8{nfm9;9t3 l L T  K(gΦmP(]=^uȯ۪_[+W/fVVr]wz.j*]???;v6t?\z~^tމJmnS}^8Onn+[NVkgLv&"a~~N=V\:-8x?Bjt]*=No{?׫;9DHsw#_7Te8O}%?dCs]*9 ܯڮcKNQA3}黭]e}os~Wj;k?N J/~޺zOT/_oi݆ځՌ_8[ic7`Qu0g0fo+fӭ@ϥap^y;s sVp1{oj&? m7q$ra7)'nL¬BDFCMc޷,(qH߉+옔(8Q,e(B&ez=£bLyb4ȣ(aDj0}&IHM:.Q#aBHMV6pI4\nS'2d+"p.ie¦)HOF6-a4@LKdF&}[<4 Pcb_`@+N,\ЙDҬff]$ч}Qy}֕v~[Oh!I#>c CO;afeH G)0DΪ![cDcS>Nl97.q=MFH}af+LPAw7MͿ|zVU53=/޿:08>x3d$pn .Xk #js}uK}N U OsT=8OK8maӄ&}l/934NΈ8d8cq=F]8pӹ7,{H?d \Q 1+.)UaLI 5V96G Gu)?T3$elTl753ZUUm5QMU4F4ǖ$'ZU@e1N]dОNZ"zZHiᓈle6wN ȑ-j)Y9NM!k%ZjM2Lf1djVR"VDbĩT-LynR-iD"8fÔVۘ^le8 m&Keؒ ϬGdK-k/V)L%mԳi|0M$|vҔtXa^"qd蔈C,Z&EDbTi;ǥۭ߾og |Bu+OY78 %4Z5vPY %/22HߦovUw;{Dw]ׯ? ^t,S/,x"ñatW &,e8A0UT`tT"#30lc>_F$}O";3.G9dJP`րX:mVRýtxfnD)%" |1xӄlzı!cj\8JՇ­Z0 T[qtɴC%Ӡ5Wnf<&?Vfc)rROt-zv_~wg`srnbjy*1-W8#!E>!9iVt;1פN;FR!@+NNjL Z 蘒e\\Q񣭄OŬ$mp#(_^ Yt[_1V⹴#`Jaߎ`GBvw:[V-Jni o F;0WAW[o8g`}%'}zoC m ø<1vcw%D3Q넦ӡSKlM$,TC~9pŖ`|Ccr- 86^ CFY'6n(Ӄ8 tiG)C<46 IG@z.“TSÖ\l2d<.W(Z jV~_bC?xɉDq<f51pBO#Du(/dxp'q2 >03 n$26ISbKMӆ &\q-=px elif]E9LR g~I4$ƀ7[Ó23WWeH'UqU [C󎲌- pHg`&- Ոv.;RsfA;,ܕE;t,$jFx4wIfhQGG=\HP2 $eHAT'}l!3"ht/װe .H}Z)c@4"*Ko~b!r$vaQq4Y~cWb1Prbk6C5+l؈6Wpr$Dqv\*s ,*sB[ʱ# IDڀ%b1 6l.P"N70#ږv3z,D1.M>I LDe .DhaKO4"A- Z'F` N 2=|eީTo#,(3imE͈_>ͨSxxtCpV}£L0"'>!d <><"*Y%DD&ake .D󘷬YlFMO1z$.ӲHġPSLj5k q?+Y%( D# gM%P>Fȱ6)UW6S2H.DE`@4xֳ89X:qs_r7 dS3οrkLp7Y `HIQDX̷,fq ",n[,ųE u$ @go0g̴ .@Sy DÅH8[! g%Q(7ؒ5ME  Օ-;h%0ZqN Wa[g|ƣU t7ZF WƭC8XR-DtW!kD$%N.e 4d=CCYuƲl\-ix+)N4>-8gV ܭ*8>x7La5RO6Y`[ӲPەL0]^OuAJxhNaVEDoH4I,˵\3_ɳe*|M'8JM$#ʃ:?d*5M'<% Z/!ZN,sM2[51yh:!ڥ "LiyKSKY´tf ةd\α@}\dҷxb.I hCrX%\SϘ50ua? hFLy( z=Np J+ 9A ny[N&R,v5)~j,RJX7 fܝUv q  yY bRM s^Fڼzzkl 3ʣb#o U\( ? \m'YZuN/8Jx3h_Ow;cYcQu":|b>nn\Y B/ 1gsYpڲݸ_|Uw\0CM?%dYfýAA ~OTC)UR&%ʽD"q+o@yC 9И)5ert΃_࿙KA D8P{Vy(~ZÊL@0.GJqzq(aC-q!dms+]X!F. f|F̲qƘP+ůotWU9³r+GL|,j\, (W]8(6˚;R䲁YJ V\j#;܃)wxu.}z7'j2ϬtPcK{߉^WI }H S˹w\QeH?AX l҆{ę*9^FnN?<+Q*Dë)[D{LAH;N3D_c`x w&+yur8˖9 {5P3`3:dQ,d̼^> ߷ GVo6ͿOh <hݕʠT.!<xuJ0´E@O$+|&AEKkL35~A ]L˖Y:#a+ѻ* p̝0TpWDer㜷$(.d@' Ը ىa$RR7e}*G:t3*8f2\MI(rY~SolzLoݪz"*T>6`kOycync"oK$1oqiV6֢ARI:nz0g5toa'#`1#p%/|Y(eD9Fg =wu$&PRbId* bړ@F02B t(֛@Փ- ~` I-TD2GrHޑE$C{OI̍ { .Qm)r"b5(I0/4a"X&e`@/1xKlj6uX,"uSyűY̩3*b|J[5eoK5TJcrVaPP_B5^F IhT$,\>Igb{©AƑXƂJVt_CCf])v@Ԟh$Q@"&Qd1*x..iz{4$U :&TLÙq:ol.acD za;31yamm &xI[\ v aE!7p3^8xaY*tP}{T0 OU!:5fxqﰙ0qͱLz|0.MFDr.%|쪑&1sbFIx]Hqߧ[7`a P$pI3FYNq,`Vαo>ozT "|8SzjW +=T*gwj;p#?VbH8?sқ,h`k.4X[ICSKx+ R9Mg8}p0 Ufa@[1Spwi17ys-KT4n]`psbO, &,8;qxWvR׼,9| vM>;狀7'uzu<.ZN٘ )c8wcH<`5`HVϪi| Dc򬇓IʜԔ4$nM]JfZ >L(>#h&߈k}t} 6Êm6G8dm%89pts}6J`\iMӔH2 U* {Y`w nr_^yWwH!Xގ *mZUz+CvuxZݕ0@oTj,Mv8Xm;pO#eO4&@1%lN$|^C7˸hm7[gX`ū'g[R桏__w u7$;5"XDIS ~z, Բ@m͇K{80Wxe8R}ν5dAWiwkPH%\CBH]"5N4TE7$zT8 Fe /+eKNe1 \1q=܋Vb\9%k Ku\9έ /q|,/r7XG-3Iz/ ϯW}p.L{0J_(=bHA ޒg8:[~y~$%*CBoiǵ,FO!Kdn9X22hlkڎDz3-},r J+0C&u\u/.k"9IqЅDp8߲ 1P4t5aQ2v{{} % & E%lBQ Ʉ{"9.3:jx_KLb (kGBR^#L]"^2,e{1ܑ[yU4IH^8<&;|ICCIDQLdӅO-v𴾷 |DPs1oLҏơv7JBX.ѿeurXQ(V'zt3hm.+.D\D-{сU@2ݘcIT2=M JWو`kF ~ 0 \۩p3Ƃ (F@vQ#x[9nd3*ETM3qg)aYqənt2 봍554[{1-MQ1pv;|TLkqcA-j,Ln1bFEꌥ<d-t.ނN8&v7 Χ xmҗɪLgΎ2ntc q[p;tPxU=f> WZܷF(n7ĢƂlQ>\̨Qg1ewc~twȗ =<pt#c-ҍ[n:1~M:f?n,L[M@d=mg7ZxMԴoId vPN DLGlRPy)")|C!#;eFd=m=Ee,J` (ZD\AH4aVИqo$A>m 6ȗ p66c4XFg^ KYYmELbh~͙1+2(i+L&c+*g !3rg_&dG+)&F&0R醔Ǘc ou[Ŗ |$͔ma~ ["7D-2/̔&a3O"ܛ)U-Y-*,>46Њz۔։WND7fM'NU)`+( ̭k৵FlP(I~-M '$Ŗи"2ȇH{_tb_r%k1pAvQ(Xҍ dh"Ȧ\sfBm-Q4G!Nels[ pcg@Pŝ`t: ·~롓3VO7j[">M!6Sb%-tR"-n%fH7J["gĴe a*-("(["v*ӉSbK$x͑NCV^1Sf•KQ5lLP,e'/܈O2ta"\FXuQEg$KrF xQT 䘭9N=rXMgkaߤS4?A](T]B4ω<u65uvFfG.tJwVuRfh 9$Rfh d+2C̟6f3;a nLV2#n =N9 z2<Nin2 S΀2q;eNx^21/!iR[_)eJbK'RMȆENSV[E6KiʕhɡD@YʄrrJm,v-Zr(#Q7Aa65~u_6Ƣ|_j*Vsi c ѠY#, H 1G5/Mm7h "=TpPL! F8c "pXPsBh|&Qqp}Ua=OPJ<Bs>kY s06`_((#Pۈk0+ ~#o̼$bSahAσqykj;ܼܞNԷ W{ xE3i\# |RS}&x-ZETq[\)b45>0oe6d$IhbD8FYPv92b(hC?~BogGK$lbsоC0 :KLpETz"/8 8mpDϚ!50R5e#e:&0$ǔ , .A-w-N |Od |-|Oѫ?z[>hg=|W^ѫwG~-|W^?z{G~oW_W%ao|g_Kwɤєiu,\ii|ע/E^wD b|.Uk-/E^|O@/qHM8b$u.'7è6W! 8TJs괮7w4GpY3 ]YDs5j?`h%8DQVtp…+0xBE]HIF>C^{RC ?jR8SH ]Bt+SwSS=1&Wrqn4h@ǀJX3)2ZMJpnЀ J)}nyK)/QQ:ђޗh^5F-fk+zԿ{O, _w7Slt[pM?+Wnnm7+j7q >ڷ# A]o}noUKR[cC?VZtAv9>ku(aMhQJ8ǴW V[8L׻j#9 ǘ۠3T1 gIbP0c)07@2L1R8K`R1AJɅ愁3j՜c*P*<+Ը6(L;ĵA54% 1   D';[nj>Wv\.ca C+9Znr)Hky޲8B9w̮G34"43Ejf jfzNL9lciWͬQ7E%D3S`< Pi*ft#7敖$J3r/HՉ+0C <Vi B9|S1(%/yM-Oa ±*Ex<,`X ˆpXe.`)GqP `4Kؗ2p` j:B!Z5?H[,C(7 npm@=wzhU8,2A 3` k < jC+_(F3 ֍Ia=*KM'{H8\/3 m>^-Z?w7H`{!i˼.ϫndH0`}:+Kj> oo0Cӑ`;!"/YH&I~[F(_iؐ8a_VɁS}y|QL@b85&Z9\c/Z97@&vc. +19yVp&FI ʀ JÇ億PmZ32Bs GlTcf'N̉*KT+|4c1,-9J3+a`lp)f~'q+Xi))goT?կcHl,2Yc%%6XZ&4SKKCZ`2ȅkq9!נb8 &7"+6RJZvp$,FFLmMTfJP_n"$2BXܱcOJx X-:Rq]a88`bA1!BS)}%<j]̆1I GK-O[񥁽,lt/~" .~J[i3AŠ_xq8O%j+"4FcĬxLF:oIm+C($ 33_54/ˆr>C#in-=̲l;6~ m_g+ΩZHl^sCqI3M.ioofFyΕ&5Z2&X$so `ICҁ~dziKb hK#{44S tZp30&mUm:-sV'(GRmRc aXM.E'JHtpV0Z1~H$3`㾽k59M̯νLxL&Yp/p")ԯRIQgc1U$/Ǐ5GWd/:N\D';uL6CRF&j i؝lmey@rnRF 6.- .$N5\KƼWz_Jn>˔K)ݺXԼr[uo zNAzx$83Q ;'&O^xf?O'r1O+`˧[ ]n:m]+w~w>tN{ 7fsכM=?"۹|olN f6_rvvۃC+w kysu22[w}}?į8^ sOES",BjCsߟvA^` t ?b|_'8F& W\X<~퇈MoVsadڪZoܽ4nON߼-7{gVez}P˩z7|4|_ԛvҏjcuR^^Ӆs4ѫuN\%ZV#U5; <]/vۻUq|߱ Nhs&99=ӭmawśupu\k=޷Ik_uے֗ڻڨ?O6w~|ygT??a5p{FsūaX4O˓8I"rUٽV[nv#;P_X֟N\m)ltJgוvy|4uZ/vkFwQx߬nVFmpst=X:MO=/m\ŎpmFW{n,lVo׏Z}(z}wX^rm^wy]YzZz\=Cnp|7:}>O*1;zZ5_޳LWvX(?_O(W>߻?#)>.;tuq{\l5R<~gtFK]y$wDp||yF;Nnm_KU^l5o {q^Xos:\gWC~W_m>M<|:j=VjU;?ڽXn,_'y[?:>nk3U]xRt;+#_fXGZ?lv;> jus yvO_Nk#qֺ\rFqKZ0U/՚OusF[|i['iyznW8kbyzX rtykZl֏i{8lu7wy-7Oy]7*i\%׵ϝ†a]7m?*Vmjes{-SݽC|⧥޻8.kynur@O y=ݭw뻴u7k=Tj;'OGuT?->r[M?zn)4wևsQ|:v7;}y;va;Ozx>IasUS^ +rtk|e}޸Y=;?-C?bg?ַG_j/3<{ubx~uU8զO+O<99x(;/uIەVT9 ^?*f1ԛŗTly#ՋSXj=uE_JV޿:0Y|mf^;VFÍK M:;o;cwX~qJ|xtT>{qP['G4ZxoT[md/lH ;{JKLdGSG).6U繼=unwth.v ;\TNn:]57d7Mn)*.n8;XjԜ"ݫo˽fx<WtnԨ4D$7 wa2zj_n@4N\jrּYۺ`OȽ>RwūߩYZ3;Wy{1XMx`ͬOw # yxxD/ʵfꑾl[jKj]5^ȢQBv.ˏbwqrƷMEij;{WyZ?_7$3O`Ol6 r/.g|- Wva .ior3hUoD桃=_\6N*^Bo^yTJyrkIwHfoDnow7/JqX5+ͣ#%tfjIܬVܦܺshD֌v+꾱8n=W\R{߬ݻw"W/(?V+򋩔oJ[wU|Փ*/[Nd{ʪ -޹Ο/w&_VZ]:r7tF1A~#/+ݭ]:4{UZggmYYuVYruVZ?ܳAͮUq$*g=u=>;ٹ l  5n<4Cy|Fit{`kP:]+W#SèwTF"HKܓNXц<lvE M˜W'u7zCK}S,><%8*4:jsسK~u1psKB,s.ڦ֢K-[gist{'[vt|TJM /b-BuupSTߴݑZXal Y諓FKUݍ61\7 zbNfi ?n"4nN~< mtjLZ[~݌J :!}#LvċۼG9CæT فۿ8WDžWMZjuUs`RJn׽Y𛳫y<]7=[?[,Y6= }YZw7';FwwS}Çrvp*O맏'm-*@?>\Or4M~Ձ9=xy o^4 VM`T~K}k`+<ܼnlx)6LzDۭ\ںl=ncjq-hMEhȢĝuT !l<(a/@r`_1$w2H( N=8N@"UUWb:_aʤp<T^}ɡFN+9Rbji@'^K .aJ V"Z|L# .!U_LG U-i ZԼ_ TIB25rC3P1!Z#g*O 8U5H՘dE{98HV֏tQ)E cy#=P/oAy/6(#7Ȋn<.m@+2uQxcAqU;=󓙎?db|ׯ,4bc њkdJ"Uowf.n?smRET#bS6SSqPnMYBYS6#* Gr[wP;tlWܸ& R6*iv xSmܳ-;no{.uw4ʭN߮yRpꅯj{ǧ9 ?ΝA}l1JF[ë3.Nŝ(")k޴9'5>ҟP"Kfr܃( S]ocLyOM fs(&4E5%֮p GHM8pkmSyO3ƺ*>2nwax$u)Z$RC2k Aj b3ߍb$B#dV/.Z}7LDc* mOhsqRvt]YUNK!Ě"|9x!zx9^>ȕxaJ >3)!7u'LkJYyt/3% ~K)DC)-Q7 D,N721eBNEQ@/2s7Kjgl t\q[ɛ>jRXTx% ^kHXq 9C03Ed軜31#>n$f'+Y@V@dTҏJ-! hC$%8ra9ATr•0:puxC,;V[bT5ѻIp1vY*pKMu3q)u yv64].dTR&C,98XCޑ'{}zW#-%*3#GAɚygso֘D3\KC?sLc[[V"}!^H\*8( b▼EhQ!zHzu@ݕ/A?F@-;fŇSF)_Щf] +dUqHlyozD}W:#T|#yOɽC$]Wk0QMLlW(kS#ioTH_0Z!]JͶU>]"6 0TSJƹxR}TP>sɠƚ_[t0ΣHKbdkq$eBwMse~mTT;v;sl3]*/^L .y(m2H tV3Xiʵއ߲ W6]"ڔ)"d|HN˕"=1i4艣jk]r(?6 jkXo2 Z<_OYc5 9kyln2,DY`'H߿t+,t.5::!"+&ieGR/a)y^z{]/5i#=,K{>xϔt>F{|1xY2+J*ԗ#roTƈ'Xp̈_d<>/\ʧswDM$M\Kl5_;FBᴺfH(qC%sLq+㨰?ƴ9@ȷP't)[7ӉgX9%F+Š%٦<$i4Da-bfpK.b XK_-1Yp0_!˩\o]W$,_eP? 謕<+"´%ӀeXknyݵƚÛNYE) cu!~&#Y@$+,Eդ1rઐW2Je7S>֣x̱pVq',L2F"s0oic?^s߶ۀа+ŋ@ xl2BY+t$b駯xɶ9j,I-g}:F@!ud $͙MZoKσdy)nu#U}I_>}%YFRo}>-NԢlj0;fY']L{,8Dd(koA5=$lNti=c¬5~jtO#R 6ӊ,|.n`M +Ix*-*@ΞVoIPפd`+ qa!` OvYI-!{م{?}jʒi Hg27dHw3 l2K:\t(4c+:BP@@?Unč (, hFoi-wv qU߳!틡J!=^ΔfMc˄'p/0jU0)5q~d4 50LC l͑t6gڲyHq`b[P_7 vn𺍐m' c,+_A5`<nvoz[=8+FyM7\}ti+Lch_v!!%P"@1^;Z7V3br2b>4EFlVtTKL!ڴ]']1'l 7:MWmʽg jKީ\ }#X\_DSj?AWd9˷X-aRpe-p\Kܐۅ)\< AiqVn+mŸk,rwziFN9B8$'5uOְ6y ._%p6|^?A̖yr:s|5;d2.shD35.Hj.Imۙ6 ٚBYhq^xG|'ix lLyJ[ _Ci mYy߇%Q?d$- -v^\27kL Hd' Sh s~BUj[0"6g$A ?V{u2Ô־'(/3wN;Лr`G7R[eσbKt`i3Tm,ָ=6鳅:\nG%Q)=Xf a1+Ti:[>&OAIЈt㛢/נNfZصGG*ckDzҼ%#>#b L!J=+,L?p'X _Thςl upG*Tud?u̓}=hEHH}A|/JxЀT~hV{6@YZ{J#бlPҮz(FM^#nCA 94BcOKVb~N!Hb]O =ȸ3Z2r5ç?,sm'=!n?Ml,1hRt9xbC- EE;" lT<>R^g|*AkɓBr4Av7V|g9puKyEeY|wS&?v2F}} Ri҆H71⡲miiDh5!U> |Y?;uTOZv4|Dbq@jCk{[rIy(("ӛ]39-"w1pt;m/!r6BZNMrԃ!3{Z ;:o|Ҭ)/x\y\ѰM(&XR+lБrn8.VhѦ7 8P]mtvMJxvsɫz: 1*ãbOօڌ `l:V6pN* TSMM'O$Y[WIF5SOC9 0>}c/xDtJ9%uȒ{ԮB%RyFGaeFeߣ~F?p,іݦSmx$m&r=!^ثV=k.О/히*;*?~+GmZTd>tڮzx^4#mkw#4QSTķ/Q̤y׽BFS'H ۮ\`{w -i@HI{{; z c`{\*"vRI:nUDWR+KJԠo,VzI4TRT@N<'sUk8!FwLSN$j@sxX?r7*D z46 mM0 vj? 5Ju7Z&m{'~6^sC RoGg>z%u;C&)k`RcXiR-P LZ`Tv{0REZ%|ry Ncp`s.MTL@cC &:']cB?( if$E1B)[[xpL7{_ԢEDf[R $CXYB~!0vסaY D?44L *OEt\8mZZFى7.X2*NT%(ULe~``Ҡ3aA̟v #rU=E߸ZD_/nBH@˳s] ʠ;zILl KBC.y@5 )Uv]\b!{BӚC+L#^Z;ޮҝ޼DRm+ZIq T{sqwn٭{9>5KW-AG\gLVM aOՋ6 sU& !ygk>eH#!ȬF1 W> C|Qw΂^Hm۔UgNbh#^| r͈vl>6>{Ѻh%uVTeą'М&)!"L^I~;+MzqHUiW>KvQZE <'aك{<`Cu$OB _Ʒric/R Eߑ ;g Q#;œGp5y6x/|Vݢm1Qq0%b3O~0gڶ̶~EgUeoSQfۂzk>O`w,ҜY:4~\4\XSDG~ѹK2,|=ކ\vtZ^'䮡V_E\K sjjOjzk]誔;!{AΖ/2Q*6dVUt/y='P>e?~5n[z߾YTK8r4`W%mzSΓAw=6=*[ ;-]Sa5`dRJ0٠q2 AҮo?qVO5 sQq/wTTn3kR)x*mD;>BU_.}K!=Y3%g˂X}6N>-7B]+~[NY 1V$s3ɂ+>>`$I\#%,[Bv.,CoGTUC³Vb(;D47ow{hfGI Ik]>_.Ԓa6>B]eUMA/UO>K_ #,coN6aA[m泪6?>UgZgle`>{>uH N5]"@+^ɣyax6y8Æ#sܾ?^ k;GT?wK5All:@{1!Tk/!B+CʼP__\uL%hH)o"Iexݐ%+yA7 /:GO .%|׿| wiv{y]B{w֠[bxhWC7S8e'#<{EU#] o[ v>EݾrH˹TcofG8kt&׌U'¿PGoWn 9'7{eoP \84w]F=m||7鼤Y~<MLETduC5m/ʮV<ۖ{ga=j\g2<`){OnK$ a~dZ 7{ ?g ~Nj٧Q ޑ jK zÛcE2)~@DZ //# }!m-ٸ#dUdK2 ߎ~cjCqn /NOi%m"e-1SV6/l6w86ޏGX)rUb)SЫ}vbfd~+*|*ڑ۷b.W\l:zZDJ s™OaoF!4̣ ra`Hs7!gۋ^f #ty _?ƓYQ 8OسORsA12"k_[{(XcS w]@+@d*_}qӋbr('.:X|\uү4wvϩF 5So| >ʩPImDz(;kE7EBٷW sxxa}@{9!oC q _~`ccpފdlp"Hո^+SKgV&^?K;66n ٴ<{FHE!7,UƏE[8''8u?3Rb\ &$3yJUڹ^_? zYTO?2ްL7XxP=緩 +ݖ1p{zףZhuh?y w:oM*xrUelqfMtތl.vk0z|أ!wfR:1ZϊGPP:~gJU}ogJ#4`FNnj)u-~sHndfZsWMѼ^gm^k='p/ ԝ=ǵ!]YĄ{mjT(؅c-IXD%Yn~N-?x݄Dq׽8$ [uV_17vԓͯw|AsQKģ**?o"\zd=v=}n{.XOMKF٭*3U{>,+1E?\C#}M_J#`&htOQb2~":O5ː5!{LgyYVvxnyy<{7z&_pXϙ UA"`\rhT9x<@/*5/XExɔ# `E|7kluTKxxb y؎g﬊dDN^BZ?+̯oxχ*ʙO5;AC+)ONT"J")zsND\?_'aI~q -5;3GV=+!Q^ng:j_ ~H‚{W6b b5l;,NI`BauH$o ~Hu!6^nU).3=U^~6Za5`ŋٶ* |d$%rzƙ@a^~*KYYh8t?g7w;jk# < A@bԛs6 W<-_\V@Ytوu4<soHġz(kF\SSTtB#”:Ŋ@ q`\]ߗfEQBd>Y5 7wrE9Vfp̼1م%/&+\|̖G(r06Z&JݫzXӞc1L3_bE )vʽ GBxv\kzSeV*9[? Em)Po"(36|׊wi3qIt1ˆe%hO⯿6O;R0m:mR9)Dq5vOBfLz$Z5Ӛ)bف6VS[G2G,1fK.dX_dɼFo OCg}JV %.0P6d0w/tl&_x<e Vj0Rnl=WJR3Kh^[W袤6/&[x^r hg5^)O%~7#|'8HYiʻ1JptAsWV_tB=*f}&6˸ʒ!s =3ʿITvk] Ë`e⑧ ,a5Ä'XᏏ[&81̥~T_[_q`&LR !D./ .6^nK>tap>!o;l^V݉>T2Uxj]BX=XRG q&独| ~B&!ZUO姌u$t.;Pm!1Ezlfg ,; -|n|G ՘q+mV,;exCNP.}= /D6}xn4j#X,]d-KI} ov}A}9f&4L[H)st#Cϟo-^1O9`Z%Xn H=cpC4(FEr}#a#f1L{t"^%o=2..[[Dhfb8G@ުs( e*c13B5fI 3^3FStTYP~HL6.ϑ\0X}zd6g-Ko/T$ 78n"gEo~0)6^vG\~^6((5'&>^"wMN oG IAɵpq|itzkrH}v*/Ҿ0 Jjy c@b^B1j0nO`/Y1)eR4h{T3QBtzJ\5PBk憐1.;ao#zAk3rr.m>*8zʯu7?w?tz(%XsXU#LkjNT+\o]GsHf0P\E'B&$n Avt"4FyJ0T Rp-@7t+ c b_Ҹ>WSޤ'237m>ht]3^/d 9N8|]Cm:4;fȗVQFs1 "@a;$LPxOߊ$jG r1O\&<0Ӿ%u@R5Fpi8u ky)k-EVH RܬZy~B@s)YGG<~Av[Nw^Qk5<R! ?_+(dFY+i $v@l@|&B^v+,B#>P)QRw(%HՈ @qjR Žb W}mQ)=9r_p%iLy m5 ƀ8FgZJY@ovSQH!b xڍ t+2/nIDr,sSWp~\&%O"&20|1̝3Inm4v|Og~~ӽ8voᎄY S{XXg97o/ ^z8RiΝJi;9= )5&^_fX: K*nd-Cxnn4= CefXa4~!iK?ne!uuӳ\9Wv'tC<鏻~!XG4*uۄN%_z߮>43\Z^bN̪'zRexPzZ*e|q)}zu=&〹zY=(hf'4= ղY`tl~.Mo}Q_u?_txs?m]{S7BV?IjyWձd -:-&Yi4R0QtCnqSs'^sOd:If6>۱mUOk=a׶{}ck>|>^NɴӨ-0XW[NLn[Z E}u.[DfY}J!\ c߷t{SJu3(!{ˇΌNj IWt]nMDzi<.7Ηg +4`1Cq})ա^7ƷA*$Y.ާZ[h.Ǚrsn!7R,ՋP6 í^enp-tOFs <0[`7 .Xt$VeeLĠ*d׼nT6tS^:Yt/hosWbݺfrשѲهfT)!bmx; ٚV8Ӄz*9,]e\\e3/{Z/=Щߜ 9=ݶpewelymlzdkMiA;^v[Vu>L55 NOV??IJ>7a'rH-Jp3^>ͲGOjcT{qȍ]T;@iЭm2R:ܘa{{(oUwҜQ4_sb+o=n56>ȅG2oYRgOpQփ!fk}u{\ҍUZ6klK6^<WԱ;өJnPdo+Ǭhj2l#v]ՑͅWlZ[6ÄHTpdjnŌ-v7GW?NJE}>9WڰxS3cwbm3qM 6d7O/Z]Mmf{8{_Y\FQWWSd,_N191Z[95+j*Ϟ3r^-"  S_,oƭiҭMFhAH9$"zxSRM/{|D'/v!1w&[3TN獺a,H,mkK1rjneKEhpl&]ayio*Yntk4--Z'ɼkXvx1s:o>OӹW ,=\p i皬/u)O}:Loʇմ-'sؼn֙N5םJܭЌkSMkgnևy>Owr\+fF-w*CKm 2W"P8v-:N6G{:rw؟Jau\Hb[Fn9L۩]39>\ǠgdQe4JTkms W|-d(ӒfJWh}](d[&IoA鉇xٜ;;>fj*N>lB gfc'1^j֬R͘ t6v׊[@Yו-Nv{Rc䱶il攝TlY +rm8/0N'7e;2;-_WsVs,nINgzYPK ^`3[d<"\ڕy̗ٽYmK۝꫞,&M)Ʀ_+#㫜w>onDÐ*j?uoOi<kR]Ңݶy<]NYV(>0CӪ+2wvYm}FKxjsPY4YsuqbmY}!<+p=axww2{,~϶%W}>7JʼnZN&UzŠ6QrAM頱[&WT}TMr]+7S |y My.6|A[ӥPZ`6,܊-kt(B>\.6mw) ta/w ^'&.]|ɃT])hth4iծw0y0ٶn1[9[xw>=$^Vm.?XeRY!߈ D874{y媖7OQT]ՔΙݢf@\۵t_m{sOuӣb>o2Jӻf i+ vWO:w颜oVe^u:UYTjᚒ0nə^foZ7'#  [BEN/ 1z/yVioK8ՙm>zq\w~;©3i9.M$E"(:xv27Ylrh7/ݙ ߸;FwbTҬoz%\o%U=*fr}mbA=d)R䬔N RQ_rx{1|f?J7 `{"IAMДޱOKm~\0|RڢuT=w~>)\^xKaYmT o`~f7=}Jy~+z>kP`?`l{T??^([__=d!d?/<}# w_;$_WO}4?05x0ʛ?RdLC?•SQ!siYn?ݗ+$V{;SE#rk8ǟK_>\ )'"łi*VQy#D2\3% )Up\*e,È8OOki,YpEm\B2VFjnsw81莐Ji C`#JtT5ԆC7NmB9Hq6L` DҜy6g 8y;{%!8i1OJ'A4Ny㟧0`|ʣ Zyx t*O_C~D<ǜ`g< #,G'ЕE)!&>_T>_e9rr &|LJ\ <ˢBl0z~m!!w2ro>z~Vs߂_ǧo=g _wh78CP_᳷/|l}E؃ ,td#c5:A >" 3F`?"tT+ƷЦ }Dq,x/+c"p!â )(y""E}`jaQ"x]3RE,L Rdv@L,LU` =蓡5 ʜ{:#al/uHRSX21m&BE,BWi0B*8 4Gp+1pP2f,J"0̯5MA6 Q4 i0}P_j#AHǿ|52euK"`k5Bo \\w;YСKªUJBW{Nz>+K0i"܃`A_A-Ji6f]adD&8=E`1%?6p wyLt<"e b_]se:"B'hc K6Jlm3R<>AA}x2POЬQ p`~AwG!(x#P߇6D0MԄPJWP q21! mmjCA  RFN\G> B, }6}Gs rlo.R Agy ( ͢dS c ڐH<: 7h@DC/% FH@SJYZ|i0*5QzzZƉ; giڝ 85>ᚒ*XhenPDBFm}8 /?G;NXU  ؑ0&L ef %9iEEkM؄')ꦔ-=U2 +)Mt`eI` "(E%7>63߃Ç#c@)Ka vt| N8Bfce!PҦu`FP{ Wh SGpQ}x'G-cmI /r"L >2E}JEp8x F P_(Cˆe<hIrH6>A%ALH8]&T|n5uAIVlo4uĆG4A(`p ddѤ 2? ~n#F&jRpAy#c6 c.B~BI9J\mD̋ blG)(:4yJ?1q(iC`44"uJr,㗌Aj R b#%@!*v6ƱG2bC)@)dd_" ]翛~=M(;j ۔*Bf~huv#YMGkh"v iմ1چEҼ9wv ԀaF/a.j?Ή3K~P'zwFAoG0I|I: (m1dE~tώ kƏ7~vΉ²q5#W4q<ķ  °wwEQ!N ̧]>j ^@CF/G;5}vK[htBGE{喁B+O}#|3v'Gn܄Isl=h_ p.b&Gdxu:Jw 6 'hFKJ!t^THfǓYӻY†NڬieV /\sS=&Xws2fWHӶjig9cT )Czmԏ,`^:Ez‹wt@P7(H^HNy9%4tI]XkhKOq&?d|q?!~/}7Wep7;1Dg餬[%5Ut}r`kKGg6~>.oF:I* tOݰG$-So"Q?70+_:ե;ե; ^ҕ tV9:NYҩ[`&ܡ^3MK^u")WlK ./Qg Hڵ2}9$dp|a uy߫_W\Dg)0te *`G#9Jy| _@:_(v$g|[QY Tz L9} '1~Bo۱g Qx%0zaK7}ɂIH'mO{Jw|{/^] _3-G9VFGJ[A[ t/Uz &WwƠ=~aAg . F8%'\E3J^޶[|=. Z*yit 'A%xoԷ-Ga[Q+3#/ePk:F(%Swp_3<^߆޼XG1]mg!uph[M'ah!`=Fä?1/?usotBGQTsʣ=tt.VS1CjkpA n*ZmeqJ ǃ6Ou*(CgTIUڄ zC}99& }O(*6{Z8oɠ :I:(ݟo%'V1*੾5&tDhTcTkL[a+&(H4Q/ӅtY?@_\E7NSGg昤{p jyã[nRꖊ+Im"F(T0(%#1j#TQ ˄&vRf&'(T&Fك0iyASϸjΠ nٴ& CWdS,ͣjQ:Tt>0[.hUҒntᑁHKhYF9 ð O%AJI%1|r 29i'/i #p΄DҭBZx$mZJEu=W;XSRc01o8 `ZG~1 UxTN}To,Ȱ_.jh7d`:%SEρ\Q>~=52JCE Pa(\A[3I(R6`;< Ff4#PsQWaZl/ .(J57rp8ՖPZ"Aސ2TWє*~a1vK T4mT>C Z0jPA3ʼn( D<KΨ. R0hy^VgR#"N{*lhDW^3jm%&r5 Qy xZ2/[pG4d&١bFQP` 7Pi?W]$"e>"&T@qqVy ?7_Y%h'W?hFPOíR)[g1 x)̡C2R"?z*I[R1A3%!w<}ÍrT$eP|*Gsw p|xP!q8<V<ن9z_0o*te98 ER^QvN'6b dMKDAB-hotspot-41e5de7/src/images/kdablogo.png000066400000000000000000000751201515036260400206640ustar00rootroot00000000000000PNG  IHDRI]4BsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxw]G}￿9wWދmٖmlYlw!az G%^b`SC bBs{oKw]i=9s-{W{̜ߙ7j))ZadJdJZ-5ՠ;OUOɔLɔ0or1r S2%Sno(Er󮟒))()GλPx>d kJdJd<$b7@$E.s LqJdJ&^RaYn\j DrJdJRd=p$g?&,I/ ]`LɔLɔL֡k5j(Vs*u͈d1cYnXS2%S2%!v!]@V{R2d^ J RׅzSnLɔ! ˈ{ݎuքddJdV@u穄,Њ,$(5,C{{JdJ&Bz+vcݚ]U-ЊԠ4qeׁ!,HY] LBXPl#ʉ@9'{iPG"d+7*6/@N`ix~bUi#I "[f A,w1HBSAcmyςoijEA)"a.VKP2!- [@:P7uJ2Bͬަ( /s'RL nw8u@zab^/߳M d2h?VXnV[=^"E3^:v*&q VVI"߹>d̳mQ 5fRgI?m"(A=bje ()fqN#N Ϙb"D%U%72_2\WZSї<#F鶮~%I " &@R&RB nA9VSd6o;:*f/H{"@ Hdm+mO^i$@ j<,=Iy5Szb&?zyi7lj/ɕxB!Eq˝?)a1wەTd )\ΒLlvޫ y`53io&kRu9ےeV@քZ>͕FZ!k]z#?nf@hrZY#Ml #"3fo%g.h\ ɻbNο5R8|tbrP?ȴfdl&ybIFj0^/ r/e3)PJH5VS]52zBv(q5jI5H#019:'*fp$S0j,kOrPtKq7BP6ώI@qQj:P0RVje=>5򞽓2ZU D)ZNyeBP.ޭ{(`G{oB{q>(F K)95F.6oP&FRĨw tR[Mj`PH=BNGYAD9z1b@Y4Ip+s28@Y{U9)AL͐^Ou$ (F|H 6̄7u@wB ʆ )+?ݽe(&cM6P?nƂQPM^PH#'cD*Jri6 ) ËP꾍A٘% !5,yPΤe1 o@LT2@Hd.e@P& A~@j[>|" )$3Q,1b!0}@_ :c< \yAFLݷ)(I-UY+(]S@ 8cK9gs/P̵ &䟮^1l  ty!@銣J#ضe! 2(P6Ȧ.D;YAb@z}@@c>ٸԱjo=AdHQPd/:H- 2y% J_:VPL*Mܡ8%l$)5 43%N /׵(k*i t2k ?vݠle֚[ QƢCu([`I폵J'V@RSSC]m ʈ1dP i,k_P$elIZ_(zYFXe&veU@6d^m AdVr=~ݏ;1 cr"`,@6YZJ41"y$.@6 Eu{0(C@TBƄHJ`|A٦4Ax@" - 3Cc@9>"dr?;5PXTm Hy?PF"k ih(mr^c(6ZHoOP$r FRcu ID(( F]& \DP;p/q3 mŀlr P/$eGRK3A98%-m敞S1R. ŵKX9$f .kNP]9,PfM53:V2^@h=(R6|j-@2VP ( 2tWAcҍZ@PN$12H-Uqe,$~)g^;$JYQ1,&Re801XHc> dgRK#&2&R- AbP6I`̠lNr$@j(IH-c9 n&7Z,HHĭQ\2/IH-cc;zoH4 M/6h2RIÃtEcnzG@Pי2l۫8 ZZ*Y`pI4Y]@f߱} Zj[դQ^iOH+_;X>keI*E5Io /VM2@j+܁%I޾Ju-y H-52o߅'z$P(p/z2Zdu?gεnE, &) J~IWڷC2'- Jk) I /ibR'(sE.Ȣ' J86Nz-ϽZB+X^)5"#o\$췙 !8}z(-?LlckH=Hj"masn09U_[YW΀$PJ;p vN<+je$ âsqPf4jM'BADV2"R ZaqGv$Μn;Y lޛ9 (kp^;IERS9sH?>#{Q:̑St$|S;pRRz6HO\Й/! u9d_c_9I@ՒvN "$Oj<@Nx@sgDǩzj2N5/<Ҩ~΄$S[uDkvâ{S2bqsޭ`ʅ#y4:! d ǿZ` &U?t'D3;\ ]mL99 eNOQ 7cfHYx9{ -˚r;Xڛ*:B@FAw> ,r7v2s&wy\ԅyʪMb! ʚkaςT" V3 rXy4{$Ǔ=hpF{}ŽՆy3t8S dl`Rْ*ut-I@1vC@z3LAD> Ρs3MdnrJ ]S3v+xbpJ(u&2b3 UsH@-c߬$H0l7SUOV 3?9zK*uOyr @[͵?W%spC$ H]bLl#oIR.{'Gqf妰vȢ_nI9qNBrOI|ms׻a@q#7^%YHu?׃c37j-U;l4H,H&/m}"2= -1B@;WUYpY3zzeǨޱI#`i^J2jpJ:I3Z3_K /헅H|^NbIE-H{( z_9i@@`fò]2:$Ngn?H6ֻ4x+-(hsP *oyc70_4CA,@99ר$sd~Ϲ,;AY m jB@PpEXv8([ HdKnuK@<]#뾐|ׂ٪ql* DželgrQeiH {c5zp9?y@Y Fʦ2/W^<$ 95lZ;Ù,>7@װ#y L4$dfp4jsX kRCcJG4`#͔6x2厥 'F&(x@9fLdlfZ4,'6xܙ9;z#'wO]t'3?;p8Ve}|Qb2{k傕MH{]Qm#ܿ qxA ԖF$ ʳhv y59MϺT%w^vnʮ v18\F2.N^hH` 0 Uk,WvW[? Nt |ы=I抑=)rI93ؿG8;s]ʌwo5wm؂]#u%',B@+OYܨ^sڒ?Iŕr\׶n [-o wɶSڃq4+RlyY+ §޺o{ъ> xzHSvkGcRN8mBƲoa/8`Y1kSX:13[>?ZHxs]m-9m)G[Yʚ|K%zl]@9;3J1-zjL\>]wGs vx@c({Pe1 J_{Z9F^w6# VVL0:=13zKxQ ғҋNZwܣ?^?! D\@&0]ЃWşVڌ((#۷oz`#[4i"93]Ogz4C_@dN^Z=~qu@=uo4t[Ⱦi ~O7o‹>rRKC˸↧>{+?+~C1Y:'kţ5=9@v a̵Ksi`ޱgqdHj{ǮQ|wq_r3ᠥ}mHT@qi!!%އ H5۬ŀinN.?>MjÚ>Pj18Oy"7ӎX: r>:F@v%Wmk-[6e؅;QPGIrSV ɟ>/ }@3 "g[gҀ1t/8a VmaD_3(Zt!ʹl~)8yPGpgoh959-@ wۿx;7s@i ch7+{7H9,Yٱ?a#.q9frQOfy3c'5s?{w>3Ƌ[h+@M$;! Ϝ_]|LL$2o؎^QZ6i8|Y0}; Εo(mup&ဎ21@zH>=j;{a>ͺ òFPJG@";b/z> y3pԊ h@ Cv2 }߮Z8 ؚ->\Y*4:h~Ӱ|qv]ʌ}N|Y SV+k(x'oJB>}@Аwi%,ՍfF^M=\a\&Ol(xk&3GJ{;vTbGiދm 4M2dX[k0j9%2 ^ d3+ ?#,3-sr7~|׏Wd+ݓwAI\uf|҇rkE=]JG$ ^yt%4^v3}]vC]HZa>l&(x*vV_d]5vy^hؒJ x#sى$9.L% 3g~i|҇d8‹ vqJ!W'ҏI&Qcp5Zq=?P/}yz0e{pK 04a7H-9}i&Mq=܁'7g{թ@ff;9Y0r۵$M8FNzUvI s33[Z$NdzDž~IKZƛ?w+9.-_.̊AGL/Zo{܈?ܶ97F$üWi9S.k٘xod4~Hn3ƛޏ֊AIyL^>#/mB%˽<{ܨΚeQNľcq3e H hv? $а%D G٩)(_|\|@↧qohENωiq39قPE.M::Hz2őA< 3jAJJPgN=b+9@:5"(6ye]nxͩ\Df+i9-,0ԇ1Q ҾH"Mu0H8NJs'ÇjO@cO^ yO-_J-ˇe|KP ZcoXae9<9o/@W<S1!)_vm ;/?y1YJ'! IDATv+䴒OBr{?>;ۉ\cbVo) ʆA:'Hh s:$ |j*s2 s|hCv6O$ˎ%y22 GӞLO^HDk7m_t-oq%gvH<04:pѻл^"z-n z2 TL>םǘbEfi<` +nܔ浕>ȅz߂ cnE{Q1oF)m2íB=\v3{^rBc%7niVlaIYWZxMѧ'X7.+c',ps|icuG?U䤥wk6_MaK׬PMU{QfOxzi~#^?*h q ʂo_qE7?ԟ'6Ǻa ,Hd\t#}f2O fwl|!LVʉHȸBI!~"t95ݾx+)㖿  XY7hEj O^/{M! 23SlE`x)еmy&DEzpǎWŧ~'ކݣ]G'ٮv&0rM~Ճ~dϔ3pfP9l>+O^Gy+"է,6qA9V`ϵ$)$ !i9& 4UL6Sf:9^.ƚNBCOG @.%H.NԬ2ѭ| %8ӗyca؃u{CwA,6ޗvezeρVdʈi@D%.Y}h|ްM[8$^ Eh6_,/;uUx~tz7A-\ʀ6r5Ou׆Mg<+f^~fO0wҫK[hEbaىPZbI66 "߾[̾vU@u֣.) «N?,'ۜ$թq}; H5ˊM#y BhJJB8[³Π箞qjO׏4Ѽl fܔF/E|iz$隧iJ_%DSu8iZSK_΢KkU֖ B^cL:׎0pԖHݛEЗ.Ca ]7H| 2a2K7ڿ-ثW ̛_; eFi{[0}in^,?[ r}Yiܒ4<:L. _q2|뷌WY0ݥ,+\JC+D_봐va uAMFw⍟oz`I ~@H}y)H&2 D$#F$:0 Ʌsa'~׵^;sgd-;ۉ6 gm<7<ЏSWv !`6@E<)މo\{@r}Ci,{;6Ni&ϼy% oX6>gk6HwA !Id,d6և!z F&um \@ZQ^f|`_J1Tm1-1i$5ىG}Ƴ"Վ=|}aιW?flŏ|up͏W߆{𽫞u b2:zד+t'2o7ֻZE11|+@xճ3o^kA*eӷ$Vd=f]'}"bc oUB¶ZT &jAP{ \3GMnj!XضHKLfKq-g@Y)3bq\KC1ÝJfumǶQA?7&N7ߵ /<&W'! Teٗ ƣ:1{urYqdrcpels;zLNʭ 3YNa?ifD>Utq]%YP6RfSfꀔ@G}NP0bi`<J b!}YGlh?޽P, ~8w``(Soy(To"90^}\ن$Sfޗ* _}3%?:*&cu_MenQI03nT[,*Kxk T&4?>}i-XEg oݖ{Jh6hA(:֣lt8ڒV%f`ΊCk}@B0uchwF+?{v>狂/;a[t"q9/+xdANH b̌oq3?9]"2kIIgk:>1ezI/ꉮu`7q_Ί1ۮ.ok]s{U&V‘u/صp;W#YDRXPzj.!@^Nr#,m2vٹ߮HH/Et4YѰm`)!t_)"+ogE:jU}qVt%y'LNth]\PZ=sHXPVR79X= fOW͟iqv#A#`=9Ҷ/܅EZOc=yVN+kZmxla0+^;K+9'g cRAi>PY ˹ύO>Q M[]W[$6+;_WB89o\cvۛ6mkNߊ.͗/7?p$'Qw/O&zF6 ;I *VM,w8e|gq)t\۝|Nx_1RcԿLL Cw\7H)h\dЎ;pzn]?,ゎ[X0BjT 57?VߴW}֠\H9E 7A@Jv3ʇ(2A/!˰S(M^QB4Cի~##0:p:~tTtuO7; 8[5ˁ 9 05/d"+:*v %!!LǴ.a3᪦EO|pXY2*)ӗ>Ck =G`,:VR[,q-XzPI=Bȕ'6hkhѸ(%kx]8},H]FeL9kXOkݱrCcQGwE,2~ /k"fU<,J%(Vpѱ`[]_m6ӽR8sp$--#Ҹ9} ^uRճ0T,ڝ뱄KTy SQa *?a. :⯳w|<]Iz.@Z"T%8 IX"Qc#?fvnY?CerLB !ӧ%8k͜]z.=mF!XS:fJb[]d>nT YvE TN"k]0-wzO2*$bo3\}2K2O\[v×?p$+퇸D Νхo~Hӷ/ve#C~P:P3 ڸjP2u(!$DTJҽ}8Aiʪ,!(I$̵ gIP^!STg@Y6~{|J{RV֖d li T*5o\#}O[?Ȭ<"J£FCb^QNSJS^jnw!_3(>81>붠$"-IrZ~Ǎn2F IHw>|C)"H~vRn-o jP|A-)JAB;,kk%Vw?* ȁDOL1Dn03(e١SI _u׶hxt8;^t.%YmAuI3߂v,Vhwϛ4w/ B'^q<П߳GIOcwD2@$t^7[u  T*rʨT1ZIQ0F"(AftG>?quk^3zGkǺ_БD]t./e.k2WP!-$]׭P-%;86} ..N1/~ zrt98l8GvWpq_pԿGZ;VI+ .ۍon7CiE| hsKZw= "1gH> V3S$j>9s;YwjHS@6at£(dû[rt0(83M wz 03#85b97 L(S rKq!6] EcQRȃ~aoߍ]CD+c=ТH~z˅ƢGx9CA۶xte,'-K6iany^s+Fz'А(ݚ9~^7@g)j])y?}8{Hp53w3;vQ "I2bQfԝg7cw @HTǂ R 88+]@9eF9TSlY3z$@0˯&ݜ ~2o~' ,QhI& ,LW]lq9e$]0S #@b0e'P$z@ 1hk"q^r_=7OW>ŧ.3Jq;pM~2q`[eKgrH]2!V#7f@U{T/_}tԊJ_ԋ]xsncQ9l-l(^_Z$3gt'Hloqk-H! za-#7 񍫶r? WP)pѵ7Q# PVW+Ifnʒ6O7=<7%ųp!qT[[AkUHoXDI,-T&ߒ4Ϣ-Hw g{<9X03[T$V?V9i'd6 IDATq$P (jR04clgK^yme^%ss]IwR* 3FXN:nsZ(g;s]$Aͬ֩Ă(+]._/~*Z}{WхCR\XG2|]iI)}e7]Be.  ڒTebx+DoywB]+]4Ƹ$ᠽ[o509UNUUAx$+=QaǗ/cafa @2r2c=m۠-;1!5:~D:ژ}ȅΰzUAK ao8=52e$ThQ3$"P eeC.}XjukN`eWP;K ^2.ȣm[!Y40"5]t_Ut·Cgw2PTMtd(˪&BJ2DFdK&$qL\X8pM \|ڳy&aA$rFn|qe8tUp*8{v#Rc#a7m;Y}]5*TJ߂,hP0!+]AvHZeO.\d)`VG_/fhܿmvTTۻzdr @)i#' M`$A898ٴB%eUƃO b݃|ףɤA[88tв>L`xOe.\/iNM}νNKSH@)S Q{"X|U/;G%j)}5-PBWkvҕJ JDY^ !&2j%s%8g$xx鱳ϼ6fWӛv^c'4(g&/o՟7P `^lg0潱yUe2HHi*0xًr V9W@59 $RxNZm+a"r鳿yz 3dspY [Gp-[߷n [G< 2#K:>|j.rxf{_kDA գe2oVՐ8p&/;Į;6JQӴJ$Е0gI %̤Q?כL4ޯ'<kEWWFˌg3_~NXD PXjYXOkh(XXzdY P3䳳jҒR')tL ?q EuJ`<\qv^-)׬`e:HrA 2-ȅ%B:g1 '?ʄ\t3ضU^jOSey('@EIr0-Ȇa=g4xl:}2,߃7/.8k_\uv~`w1gz .Q+fI+ `is͚[K8hRn%Uv//~k/0zW!+#Jv7&He'/Q=$ˠ(E[ }K gua.,ۅ>crF5Qٶsű#k*G.S c\yvTabNZW {`@^a-JߣM(nHy`{=*;kվ}aݴ%NQO)>GЇ95WI>WNNW aອ;lpYN6('Vzwj "SJ߾zpԊY8jŬ1T [; `,(/%%16lۍ]t/}h,;t>wqEZ"W3Ui1 $^m)3~n;5\RB+ƪvΑ(3[*$DKyI+KR5jϚea:B( ~r&@N/]% I"5spQPSPMԺiʎ@cl&;* .( pRk2('jK#/g:83+}!rvPwuf6?kP戮Yf)ét9 l .I5@Öv77A\~\p?m F#L>p4 8{hw<>G7AL'fിwzZ92%O05QRn/iêsENl96X?)mfƑ^ a s뽐6uTc5HXZ|כ W@sƲBXulƎQTR9ӰcZ\a<.x\V dtGzՀf #]]f.aMjv2PAs^3/@/najgVvy[h=yOP߮&0A8cKכ#ӱ! Ա4 _ 08RA9F+=J̾'(ǂlmIVL?^zRvEW4+osV-Ha6vZѓ(CS]Ʈ=)6mxxY?TXij Na5ihMS ._3%* ߨ#N{^G~fj/Ŝ.xj6ÆU)Е @uw ,Ӎ%*c(FFSe))|g&eMSf NQ%c})$.L\D%~Jۂ `;UL TZcVԌR"0*}ZHz NG:Ncl2Z)BW"TZ_`g.Y}cH%[r>XW먩40S'OJכn۔Us kQĸ69crGW$J HI2uhhlCΒJWRKx@I95p*"Ri*tovΙ050ݴj0>ױKN:0FQ+CnIjh)U"GfA#0k/!1ZIF* f<$qy^fb`dT|;l-: )C.x A$LEƩYcZi*A)-JZθb O;E60],R*)@iHB~^ihjI=ͧ)ȉ/իi85t zpt%UJ0 6K~n>#T@bF3uG,J6(+=F* 9'e/`1 ^_^&J*|dTZz&5=]]-~̵(}0r@my2ԢV%Cci-DFg7UKGK;JȌWB̂lLƤ-mn$ak8`3+Jr3|JbǂdQ 9)kѩ^يԑy4U)v;ˋzAf)H rXY% aDHmez(vf $J m90..,KxḯN5U3ԹV\w (յ6Ph'R%eB9U+@* d ]uHL3Rf֥>C[ζ|m9V@/GpTfHB@RC.g Җ,$ U(YOƂ4td7S[c:J`i4Z2Ƽo džeӚŀR H6\ sl@`&J kR2Զ0HM9^V:wӉֵ (ϸ1ҪfM*0pM*3|PBm^ $`&Wh7JH6*<o`Abn^:1(ѻ2b:qʦ_ݓ}_n4o-z!됶kȀRo0s[X9_f ՔcWl 2aUg@` KcA6"!(e@H9[]5XZ.jeH!.L,kok0i 3N7"K_O@gGc {ӀQSJrݚʞ:~=fG^-Aj,.;zbF~t~HF6۬+YJ5P ( 6$VT!avS[lz FTieeU\^4d ^A j,0!_KA q*)U$puP2bP tb\ZǢ1N1N]Pj;T3T0$;V* <Kmc$`$R{bJ H5@mIyPW!!w6-(e]qln9-ZqRBV \%l'nkxM P{;֋ @`L?6$12 D;CG:l6 LG&Р0<@LI@2g:AY4u gѰ_.BГb@,l:p4jWӕz5*6zrPk?ξڈB2ձ9rLe(FKBX:\kx#EjjDvqO}OC wn0cx'K֢tLsjQmnލz*1yHiQ:zd<-9.\c&Y!["ʅE9\8d} mȷt\pGN8jܹg3O(apN>B[`HlB{jYu.5ODeD/w(+wҜL HAI9@@&@}BT48Hp2X@:\z_ ֊ -I IZmU$fAxPH^,B@vU,3)@{Vf{4t786MIwDɠH߭ ߍ@!= 3CQtlt e* vP >:6U0bvmcT*4@y궅du@b>[NNq;$:2,[Ѐ9juȜ?P65H1P jQ Ome݀MR1Lȍ{MDC; c`{5-E7dfgY6mu@? %xVB-e"6̇Pf\e9s]e4J 0f2}\e ej@۹l) mHnuI[@:  \5/ߝeei+.4w16P s Xu.<ԍ}Xh([x{r!9V@%>?`dYf@[$ -`kAfwqP,H@˾P/{mLN$0l Nezio10"fYledL@"r(s_=,Jk}@;B@*24#M Un[PzPXsC ,/(Qz@)/P6d-qAkˌ_(\P汥co H6Ho/j" \C2(mN/}9YVhc;e sZLJK@;)d+n&`0y{o͠RflL|K6%8WtPuGv%&ș9ˋXOD`Ww>cT:Uyms@9ϼ 2{H`-YTk\w,\@:k6 Œga:0Z-J';єԖ z$6eӝZ-J@Ŕ?COƞ/K-z$3.1x4E{a_Iv(&Rڇ'.vt☇R}c,f,HL {R21Q5A&0QBz~1Eo>I* G9 8$'Hb v*۷.ʽ? ez>F7闹UcϑEYDН§d.N, dhnKhwwAMR+jkvnz)yx[Rm_2=v IDAT;r$5[dZt$ɩ;- ӗ#ȱgMb%&E%VaWv3AN˲cpsQWӸdz}>V)! r>dh_ W8(S rڸ'ľ e'AK[ Kv+rcOoۍR }L2M5QBvK*< J 9 Kf$H+d($˾]ri y 2]QFQywHpj yǭR78WTe5& sd_za I8(rDPғZ] TEbRoo[ T[K~!*JEGnTx4ו3Ja)92q7Ld.^ R_I,T;\G53=A)ȄGHϳ 9; ~ڈ%YI$S$WgiF/ۦ}xCQ[ 1/A{KR_R=FEY5ftB|a8,ex0)N.jMMc RE4FI>p?eWAo|=B$Yt9RH(ˉ{[_ݲIAusdhׂ9ja_ tܸ(b<Drĩ2N$p.j,"kdbgQ"C Ea}wD宺(AYo@E1z*]P^)g(YS9Cx(3WA&ب6ҵ[ޙTvy"r Qf:CU%$Ҟf%H`_IaX|)^ 7%QF+O. uqY|p 21*JI5Iw)r ev>Wu.M,sdbZ1Rs6wԍ%:BD:9,YܕMhR/WB;gGg]gv;x/`bݏx7W%>o!J"]$ T8)K@\0cdBB$f EwN Qi}D8e(1@| A '痤\t s"GSf?9[q2}@,mC]+ZjK_5/pAe9D)ɖDv9BtEһy] uQ.L7~>V=c[h*QWĉtRY༐7v~V_9F^.BBs҇[%kEБ8G2ʒ8 JMvATy^{߻o WS}H'Q"uv'dY.q| o҄T.Dy׉HJ+)7(>Ћg#F=.:ipc+.VjS N]L/~D֩?&9jteL㐳l: %Dp1t |ʏgsjzvZv[n=.ڏ(Si oKhT:;6"cr=E&\Ќ>N!7@ O5?)Þ Ip ,XL!!D`DG:˓ɐ= =Bdz':wFTmd8WŅ5H`A:"1|rɤO^r/I)/G`[s+ fs0 ?2F=.\Y0\@qq@%Ae:P.IdG(-=/D HKr#–![r( tp:HxvV'xL-)@Hqn> @z9"h 4f G9p yN PєCj/9ͽ(fKIUs-8B"&dY^6GAUυk9 EpFr0T@>kB)8Pg!lJ87Z 6cC&c#P XXHw:it:DsҖ>شaZZ6xlHn;V:Dž@l %D+A".6Jye%n\G*N79Y>fBĐMy!YnNp.0X4r)"j]l"QNrxI7/)K!􀗖Q$:rbpu1=/p!"w฀"QI 웮,fRJ^oC.\ !M{y/)*o'6xuw/{C9G[88,p!Å,)!kN_Uw:眨mQ$Fn[mԡe,2eaOq) wfyŻͧ}2g! &")DZF'2]c$zB eITv.Q[u0&r8\pBV;aͧ=ha"]KIc9,LFT6P%65J>{p!H"VW(s rGbHr,+`F5+j=M SchRjZedLr^hL:u.$ 㖨]cei(ĺn CI wn,WBSQw-Jmӈ3?(Ϋi O>©+cI 7Ճ_|y^"H& OHC\(d;ӏ MqI^FE \(G]eOrj)cMS4VQc3bIj(yєEM cjc4 0IjI8(cy'{V0qH2s(y+DE/ו5;.ȱ}a̜%rEYd%b4g#Ge?(K{&r r\=ŷozҘ 8$qQMXyi>6RĈ `z a\8$pTQNz#ddrl`4t&J﯋(w ({yt'Hn4+㴒n.JD-~ _]US 9$5Q(NjN뭂dMv51! 8$#RMcE;; Qػ*n4+|'Jt(GA~NT_la\$(Ãrz Duj1cwSYC] j8$iQf_m(%硢1叀:`?drLca\,#I`\AevPVB XF k#=i, 0ۓ$"9=_'ʴ)E!:%MM$+Aj !Lqܮ$ĶEYr9] :9s|ALqK(CsB0E-߈4ݾ`ju5, *$ QƢFNDoܸ]hEvUs4slIc4gyJPC9(4.f!BXN(4P(l| k# gr '(f,"AapbEH曯V_Q~L22Hx$ع yhwp"AnBzru4Ղ,Y6A3% @*g%BB ؂h7w_l>y1Z=iFf6"EIrB[@ZmЮ_~_D 0In[N?"fi CHn_FA>F} a[q$H]l,BB?x Hl_~s?Q 03d)HUYt"P ,͓o{Q rx|p 0,%9$iaՆvdދ 8<QdjSD i߼# ØdVj-8Bd^>_6X;Ha;1IŸ*G]/WA*j3iLaleMz2q:t ^ǿL|ڵ&H0z$ d( Y~/4 GSM}LalV#IUI@ǫ?l~G4&H0"ɡ QdbwYԂ,#ɱҔr4A1ɭDuAF u|{Go~YF 0 I i>1*ioe4 l50fwGo}-+hLaIr"-9Z^䶚laG,IA}A6ս$MaKr ٯGUAN6AqTN*rnYM8VccB 8)' X؟a(Dza 0qiA: um4aGP65A- MaJr SmdgJDas^$ͩi4 `IՍ"d(Q6& 0s`$ 9 9 kC øu$u78++o{/=m u 0 f1_2t/Vն$ a" Y, 'W rLZ:]w&La̎1!:םݡߥ̖FIQdi,n{tlNr-ZHaX;$B_ }Y~鋗e ø8ƚeSDe۲P= ø(v«$$K!r4Aqq$kj]Y >\b{03IR+)a̞2\.jbuabdyM%S0 b&mfbL&H0.]"ƛl 0 0 0gAL kIENDB`KDAB-hotspot-41e5de7/src/images/kdabproducts.png000066400000000000000000000041561515036260400215700ustar00rootroot00000000000000PNG  IHDRQ jRbKGD pHYs B(xtIME!Ew{IDATh{pT?}I @@y EFc;C)؇؂m2bP[U)PhQ@"#)IH@B^dw=c$8i7s=~{{ONJvG!1 b A_?K\lⷢt &yvF*;5RӤu#3lk3W($hBBtT{8qfj%ySR(pQTJW<@y z8|I| J ˢ"Sx DpvTEZn E!)M<5i`ݞz0G3(f/ϠB$]s3c*keu7a3-7nGn@ʢRZNc=R+}$A|Tilj .6gکm2EU)&AE~6ލmIT5Q%{b[XFa@*PU*ժhO9Gg00ŒJ4]rzjwnx, IwsOƢy%ˆ0sL>>OP۔CS'aa +&E0by'&fo-@Iu; 1&[*_K-&9P$ɊrC6gXRYmѨixfR2'p-!`x8hivH#;5Cͪ]WYUf_kb+DMZXΈaUX,).Yp.}; 4֣KƲm@<[4Mc %&Rc?d!)jc PC԰5Tzi'=NBǯSxW}D?%DsؗyY~~E[/Drc&J ̈t+'/cf N9𶇮oEʴixPߔ#W4\Ua\VK[h騁fE Ibf*mOoA)'2;^1Qxj9Hʯ@ÿjMN4 _މ HPhn3_ T!Op;ѥKo6,y=h ^]2(…Wٶp ]tmsD$F8^JMVyo\ ƮiA\^oR(w{1$_mG*'"5_=J^mgd Y_hrcjE}:[̂M9$FYu&dGh$-`TVr1)'[֕TA;I+IfdY)JGtŨLY_s3X9=_4CuGsf/´W*8Xr۩9*  U Zݢмy-T p:wDCc0 IEp2~QBO_~VJu`u`gYvSlrcz$y `XMH2kwy/ NU]n>I (=ig Іɢ>l W ex|kAqUvB@{ɨ8pe1J N:j1 K`S"{7aFFp}ZkRײzz*;bs3+[R !LnӗLY>d֘o>6Cšְ؁D8Kc2'iq*ySp6m[fE0zU9 fٔJT{r_t. ϻ(8@/xuɸ!|VdŎ+~`Ysd!n$Zq ?CBsvO hMtY `VK ^WTU ]x Lr5C5љttE ٢3 %vm;% >y:=+{3KİA 1l FzIDATx[{lSe?}[ܘN X!$e3&:LCcDcLհDCČ FL# lvkﻺǽ]=M{9wdAE" R&%cwя^n Ixb3 VIl<re V5VW eJ#:G0 [ hv˓b;,Sg4_黖vAY +ruc 9@\wOXQu]d5z 8M9YEyEp[ erx ]OsҚw%›J4NuF<\]%k`i#*UyEp 6N$|49tq7Jc5r5vSo4>F:?i4oCR[6VY:' CKt2rsZ:l:"g=w|BpJR_TXQx):,\. MUt1n:\y"s7NpJ 0'ߋLu f7R&\ u9٘K0MV $8_Q59o+YCgHzTJ% >ވq:g!"[Jbp/a" (;\N]-&`R3DVB:56ֳWĜ _,罗-RI+`fpuTE;Ii n] ~^p'·~>Ƿoe[P3 #'hRռI" ,pzLd;ACQ="3)H =/gpi[sma882#\M }!'q7yՁnp&y|a?SGӎ61b %+B{2|3=c!Ns}yaDFcoFkn jl +ҵX|JUdC_8Vh*)sP0}wcNuk+l;8ΌitȄ#Y` ,j c ;v"OrTТ5hEuG^UP0]lv&#(+7Twaа9 ̏?N;< SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include "errnoutil.h" #include "initiallystoppedprocess.h" #include #include #include #include #include #include #include #include #include #include #include namespace { Q_LOGGING_CATEGORY(initiallystoppedprocess, "hotspot.initiallystoppedprocess") void sendSignal(pid_t pid, int signal) { if (kill(pid, signal) != 0) { qCCritical(initiallystoppedprocess) << "Failed to send signal" << signal << "to" << pid << ":" << Util::PrintableErrno {errno}; } } } InitiallyStoppedProcess::~InitiallyStoppedProcess() { kill(); } bool InitiallyStoppedProcess::createProcessAndStop(const QString& exePath, const QStringList& exeOptions, const QString& workingDirectory) { kill(); // convert arguments and working dir into what the C API needs const auto wd = workingDirectory.toLocal8Bit(); std::vector argsQBA; std::vector argsRaw; auto addArg = [&](const QString& arg) { argsQBA.emplace_back(arg.toLocal8Bit()); argsRaw.emplace_back(argsQBA.back().data()); }; argsQBA.reserve(exeOptions.size() + 1); argsRaw.reserve(exeOptions.size() + 2); addArg(exePath); for (const auto& opt : exeOptions) addArg(opt); argsRaw.emplace_back(nullptr); // fork m_pid = fork(); if (m_pid == 0) { // inside child process // change working dir if (!wd.isEmpty() && chdir(wd.data()) != 0) { qCCritical(initiallystoppedprocess) << "Failed to change working directory to:" << wd.data() << Util::PrintableErrno {errno}; } // stop self if (raise(SIGSTOP) != 0) { qCCritical(initiallystoppedprocess) << "Failed to raise SIGSTOP:" << Util::PrintableErrno {errno}; } // exec execvp(argsRaw[0], argsRaw.data()); qCCritical(initiallystoppedprocess) << "Failed to exec" << argsRaw[0] << Util::PrintableErrno {errno}; } else if (m_pid < 0) { qCCritical(initiallystoppedprocess) << "Failed to fork:" << Util::PrintableErrno {errno}; return false; } return true; } bool InitiallyStoppedProcess::continueStoppedProcess() { if (m_pid <= 0) return false; // wait for child to be stopped int wstatus; if (waitpid(m_pid, &wstatus, WUNTRACED) == -1) { qCWarning(initiallystoppedprocess()) << "Failed to wait on process:" << Util::PrintableErrno {errno}; } if (!WIFSTOPPED(wstatus)) { m_pid = -1; return false; } // continue sendSignal(m_pid, SIGCONT); return true; } void InitiallyStoppedProcess::terminate() const { if (m_pid > 0) { sendSignal(m_pid, SIGTERM); } } void InitiallyStoppedProcess::kill() { if (m_pid > 0) { sendSignal(m_pid, SIGKILL); if (waitpid(m_pid, nullptr, 0) == -1) { qCWarning(initiallystoppedprocess()) << "failed to wait on pid:" << m_pid << Util::PrintableErrno {errno}; } m_pid = -1; } } KDAB-hotspot-41e5de7/src/initiallystoppedprocess.h000066400000000000000000000024771515036260400223010ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Zeno Endemann SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include #include class InitiallyStoppedProcess { Q_DISABLE_COPY(InitiallyStoppedProcess) public: InitiallyStoppedProcess() = default; ~InitiallyStoppedProcess(); /// @return the PID of the child process, or -1 if no process was started yet pid_t processPID() const { return m_pid; } /// this function stops any existing child process and then creates a new child process /// and changes into @p workingDirectory. The process will be stopped immediately. /// After receiving SIGCONT it will run @p exePath with @p exeOptions /// @sa continueStoppedProcess bool createProcessAndStop(const QString& exePath, const QStringList& exeOptions, const QString& workingDirectory); /// wait for child process to be stopped and then continues its execution /// @sa createProcessAndStop bool continueStoppedProcess(); /// send SIGTERM to the child process void terminate() const; /// send SIGKILL to the child process void kill(); private: pid_t m_pid = -1; }; KDAB-hotspot-41e5de7/src/jobtracker.h000066400000000000000000000035761515036260400174340ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include class JobTracker { public: explicit JobTracker(QObject* context) : m_context(context) { } bool isJobRunning() const { return m_context && m_isRunning; } template void startJob(Job&& job, SetData&& setData) { using namespace ThreadWeaver; const auto jobId = ++m_currentJobId; auto jobCancelled = [context = m_context, jobId, currentJobId = &m_currentJobId]() { return !context || jobId != (*currentJobId); }; auto maybeSetData = [jobCancelled, setData = std::forward(setData), isRunning = &m_isRunning](auto&& results) { if (!jobCancelled()) { *isRunning = false; setData(std::forward(results)); } }; m_isRunning = true; stream() << make_job([context = m_context, job = std::forward(job), maybeSetData = std::move(maybeSetData), jobCancelled = std::move(jobCancelled)]() mutable { auto results = job(jobCancelled); if (jobCancelled()) return; QMetaObject::invokeMethod( context.data(), [results = std::move(results), maybeSetData = std::move(maybeSetData)]() mutable { maybeSetData(std::move(results)); }, Qt::QueuedConnection); }); } private: QPointer m_context; std::atomic m_currentJobId; bool m_isRunning = false; }; KDAB-hotspot-41e5de7/src/main.cpp000066400000000000000000000274121515036260400165600ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include #include "dockwidgetsetup.h" #include "hotspot-config.h" #include "mainwindow.h" #include "parsers/perf/perfparser.h" #include "settings.h" #include "util.h" #include #include #include #if APPIMAGE_BUILD #include #include // FIXME: patch KIconTheme so that this isn't needed here void Q_DECL_UNUSED initRCCIconTheme() { const QString iconThemeRcc = qApp->applicationDirPath() + QStringLiteral("/../share/icons/breeze/breeze-icons.rcc"); if (!QFile::exists(iconThemeRcc)) { qWarning() << "cannot find icons rcc:" << iconThemeRcc; return; } const QString iconThemeName = QStringLiteral("kf5_rcc_theme"); const QString iconSubdir = QStringLiteral("/icons/") + iconThemeName; if (!QResource::registerResource(iconThemeRcc, iconSubdir)) { qWarning() << "Invalid rcc file" << iconThemeRcc; } if (!QFile::exists(QLatin1Char(':') + iconSubdir + QStringLiteral("/index.theme"))) { qWarning() << "No index.theme found in" << iconThemeRcc; QResource::unregisterResource(iconThemeRcc, iconSubdir); } // Tell Qt about the theme // Note that since qtbase commit a8621a3f8, this means the QPA (i.e. KIconLoader) will NOT be used. QIcon::setThemeName(iconThemeName); // Qt looks under :/icons automatically // Tell KIconTheme about the theme, in case KIconLoader is used directly KIconTheme::forceThemeForTests(iconThemeName); } #endif namespace { QStringList findPerfDataFiles(const QDir& directory = QDir::current()) { QStringList files; for (const auto& filename : {QStringLiteral("perf.data"), QStringLiteral("perf.data.perfparser")}) { if (directory.exists(filename)) { files.push_back(directory.absoluteFilePath(filename)); } } return files; } std::unique_ptr createApplication(int& argc, char* argv[]) { const std::initializer_list nonGUIOptions = {"--version", "-v", "--exportTo", "--help", "-h", "--help-all"}; // create command line app if one of the command-line only options are used for (int i = 1; i < argc; ++i) { if (std::find(nonGUIOptions.begin(), nonGUIOptions.end(), argv[i]) != nonGUIOptions.end()) { return std::make_unique(argc, argv); } } // otherwise create full gui app #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true); #endif return std::make_unique(argc, argv); } } int main(int argc, char** argv) { KLocalizedString::setApplicationDomain("hotspot"); QCoreApplication::setOrganizationName(QStringLiteral("KDAB")); QCoreApplication::setOrganizationDomain(QStringLiteral("kdab.com")); QCoreApplication::setApplicationName(QStringLiteral("hotspot")); QCoreApplication::setApplicationVersion(QStringLiteral(HOTSPOT_VERSION_STRING)); auto app = createApplication(argc, argv); // init Util::appImageEnvironment(); #if APPIMAGE_BUILD // cleanup the environment when we are running from within the AppImage // to allow launching system applications using Qt without them loading // the bundled Qt we ship in the AppImage auto LD_LIBRARY_PATH = qgetenv("LD_LIBRARY_PATH"); LD_LIBRARY_PATH.remove(0, LD_LIBRARY_PATH.indexOf(':') + 1); qputenv("LD_LIBRARY_PATH", LD_LIBRARY_PATH); initRCCIconTheme(); #endif QCommandLineParser parser; parser.setApplicationDescription(QStringLiteral("Linux perf GUI for performance analysis.")); parser.addHelpOption(); parser.addVersionOption(); const auto sysroot = QCommandLineOption(QStringLiteral("sysroot"), QCoreApplication::translate("main", "Path to sysroot which is used to find libraries."), QStringLiteral("path")); parser.addOption(sysroot); const auto kallsyms = QCommandLineOption( QStringLiteral("kallsyms"), QCoreApplication::translate("main", "Path to kallsyms file which is used to resolve kernel symbols."), QStringLiteral("path")); parser.addOption(kallsyms); const auto debugPaths = QCommandLineOption( QStringLiteral("debugPaths"), QCoreApplication::translate("main", "Colon separated list of paths that contain debug information. These paths are " "relative to the executable and not to the current working directory."), QStringLiteral("paths")); parser.addOption(debugPaths); const auto extraLibPaths = QCommandLineOption( QStringLiteral("extraLibPaths"), QCoreApplication::translate("main", "Colon separated list of extra paths to find libraries."), QStringLiteral("paths")); parser.addOption(extraLibPaths); const auto appPath = QCommandLineOption( QStringLiteral("appPath"), QCoreApplication::translate("main", "Path to folder containing the application executable and libraries."), QStringLiteral("path")); parser.addOption(appPath); const auto sourcePath = QCommandLineOption( QStringLiteral("sourcePaths"), QCoreApplication::translate("main", "Colon separated list of search paths for the source code."), QStringLiteral("paths")); parser.addOption(sourcePath); QCommandLineOption arch(QStringLiteral("arch"), QCoreApplication::translate("main", "Architecture to use for unwinding."), QStringLiteral("path")); parser.addOption(arch); const auto exportTo = QCommandLineOption( QStringLiteral("exportTo"), QCoreApplication::translate("main", "Path to .perfparser output file to which the input data should be exported. A " "single input file has to be given too."), QStringLiteral("path")); parser.addOption(exportTo); const auto perfBinary = QCommandLineOption(QStringLiteral("perf-binary"), QCoreApplication::translate("main", "Path to the perf binary."), QStringLiteral("path")); parser.addOption(perfBinary); const auto objdumpBinary = QCommandLineOption(QStringLiteral("objdump-binary"), QCoreApplication::translate("main", "Path to the objdump binary."), QStringLiteral("path")); parser.addOption(objdumpBinary); parser.addPositionalArgument( QStringLiteral("files"), QCoreApplication::translate("main", "Optional input files to open on startup, i.e. perf.data files."), QStringLiteral("[files...]")); parser.process(*app); ThreadWeaver::Queue::instance()->setMaximumNumberOfThreads(QThread::idealThreadCount()); auto applyCliArgs = [&](Settings* settings) { using Setter = void (Settings::*)(const QString&); auto applyArg = [&](const QCommandLineOption& arg, Setter setter) { if (parser.isSet(arg)) { // set a custom env when any arg is set on the mainwindow // we don't want to overwrite the previous one's with our custom settings settings->setLastUsedEnvironment({}); (settings->*setter)(parser.value(arg)); } }; applyArg(sysroot, &Settings::setSysroot); applyArg(kallsyms, &Settings::setKallsyms); applyArg(debugPaths, &Settings::setDebugPaths); applyArg(extraLibPaths, &Settings::setExtraLibPaths); applyArg(appPath, &Settings::setAppPath); applyArg(arch, &Settings::setArch); applyArg(sourcePath, &Settings::setSourceCodePaths); applyArg(perfBinary, &Settings::setPerfPath); applyArg(objdumpBinary, &Settings::setObjdump); }; auto* settings = Settings::instance(); settings->loadFromFile(); applyCliArgs(settings); auto files = parser.positionalArguments(); // remove empty arguments that may be added by tools calling HotSpot files.removeAll(QString()); if (files.size() != 1 && parser.isSet(exportTo)) { QTextStream err(stderr); err << QCoreApplication::translate("main", "Error: expected a single input file to convert, instead of %1.", nullptr, files.size()) .arg(files.size()) << "\n\n" << parser.helpText(); return 1; } auto* guiApp = qobject_cast(app.get()); MainWindow* window = nullptr; if (guiApp) { QGuiApplication::setWindowIcon(QIcon(QStringLiteral(":/images/icons/128-apps-hotspot.png"))); setupDockWidgets(); window = new MainWindow(); } const auto originalArguments = QCoreApplication::arguments(); // remove leading executable name and trailing positional arguments const auto minimalArguments = originalArguments.mid(1, originalArguments.size() - 1 - files.size()); while (files.size() > 1) { // spawn new instances if we have more than one file argument const auto file = files.takeLast(); MainWindow::openInNewWindow(file, minimalArguments); } // we now only have at most one file Q_ASSERT(files.size() <= 1); if (!files.isEmpty()) { auto file = files.constFirst(); if (QFileInfo(file).isDir()) { // search for common perf data files in dir and open the first one found // if none is found, hotspot will complain, that `file` is not a file const auto perfDataFiles = findPerfDataFiles(QDir(file)); if (!perfDataFiles.isEmpty()) { file = perfDataFiles.first(); } } if (parser.isSet(exportTo)) { PerfParser perfParser; auto showErrorAndQuit = [file](const QString& errorMessage) { QTextStream err(stderr); err << errorMessage << Qt::endl; QCoreApplication::exit(1); }; QObject::connect(&perfParser, &PerfParser::exportFailed, app.get(), showErrorAndQuit); QObject::connect(&perfParser, &PerfParser::exportFinished, app.get(), [file](const QUrl& url) { QTextStream out(stdout); out << QCoreApplication::translate("main", "Input file %1 exported to %2") .arg(file, url.toDisplayString(QUrl::PrettyDecoded | QUrl::PreferLocalFile)) << Qt::endl; QCoreApplication::exit(0); }); auto destination = QUrl::fromUserInput(parser.value(exportTo), QDir::currentPath(), QUrl::AssumeLocalFile); QObject::connect(&perfParser, &PerfParser::parsingFinished, app.get(), [&perfParser, destination] { perfParser.exportResults(destination); }); perfParser.startParseFile(file); return QCoreApplication::exec(); } if (window) { window->openFile(file); } } else { // open perf.data in current CWD, if it exists // this brings hotspot closer to the behavior of "perf report" const auto perfDataFiles = findPerfDataFiles(); for (const auto& perfDataFile : perfDataFiles) { if (window) { window->openFile(perfDataFile); break; } } } if (window) window->show(); return QCoreApplication::exec(); } KDAB-hotspot-41e5de7/src/mainwindow.cpp000066400000000000000000000567531515036260400200220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "mainwindow.h" #include "recordpage.h" #include "resultspage.h" #include "settings.h" #include "settingsdialog.h" #include "startpage.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if KIO_VERSION >= QT_VERSION_CHECK(5, 69, 0) #include #endif #include #include "aboutdialog.h" #include "parsers/perf/perfparser.h" #include namespace { struct IdeSettings { const char* const app; const char* const args; const char* const name; const char* const desktopEntryName; }; const IdeSettings ideSettings[] = { #if !defined(Q_OS_WIN) && !defined(Q_OS_OSX) {"kdevelop", "%f:%l:%c", QT_TRANSLATE_NOOP("MainWindow", "KDevelop"), "org.kde.kdevelop"}, {"kate", "%f --line %l --column %c", QT_TRANSLATE_NOOP("MainWindow", "Kate"), "org.kde.kate"}, {"kwrite", "%f --line %l --column %c", QT_TRANSLATE_NOOP("MainWindow", "KWrite"), "org.kde.kwrite"}, {"gedit", "%f +%l:%c", QT_TRANSLATE_NOOP("MainWindow", "gedit"), "org.gnome.gedit"}, {"gvim", "%f +%l", QT_TRANSLATE_NOOP("MainWindow", "gvim"), "gvim"}, {"qtcreator", "-client %f:%l", QT_TRANSLATE_NOOP("MainWindow", "Qt Creator"), "org.qt-project.qtcreator"}, #endif {"code", "-g %f:%l:%c", QT_TRANSLATE_NOOP("MainWindow", "Visual Studio Code"), "code"}, {"codium", "-g %f:%l:%c", QT_TRANSLATE_NOOP("MainWindow", "VSCodium"), "codium"}}; const int ideSettingsSize = sizeof(ideSettings) / sizeof(IdeSettings); bool isAppAvailable(const char* app) { return !QStandardPaths::findExecutable(QString::fromUtf8(app)).isEmpty(); } int firstAvailableIde() { for (int i = 0; i < ideSettingsSize; ++i) { if (isAppAvailable(ideSettings[i].app)) { return i; } } return -1; } } MainWindow::MainWindow(QWidget* parent) : KParts::MainWindow(parent) , ui(std::make_unique()) , m_parser(new PerfParser(this)) , m_config(KSharedConfig::openConfig()) , m_pageStack(new QStackedWidget(this)) , m_startPage(new StartPage(this)) , m_recordPage(new RecordPage(this)) , m_resultsPage(new ResultsPage(m_parser, this)) , m_settingsDialog(new SettingsDialog(this)) { ui->setupUi(this); m_pageStack->addWidget(m_startPage); m_pageStack->addWidget(m_resultsPage); m_pageStack->addWidget(m_recordPage); auto* layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_pageStack); centralWidget()->setLayout(layout); auto settings = Settings::instance(); connect(m_settingsDialog, &QDialog::accepted, this, [this, settings]() { settings->setSysroot(m_settingsDialog->sysroot()); settings->setAppPath(m_settingsDialog->appPath()); settings->setExtraLibPaths(m_settingsDialog->extraLibPaths()); settings->setDebugPaths(m_settingsDialog->debugPaths()); settings->setKallsyms(m_settingsDialog->kallsyms()); settings->setArch(m_settingsDialog->arch()); settings->setObjdump(m_settingsDialog->objdump()); settings->setPerfMapPath(m_settingsDialog->perfMapPath()); }); connect(settings, &Settings::sysrootChanged, m_resultsPage, &ResultsPage::setSysroot); connect(settings, &Settings::appPathChanged, m_resultsPage, &ResultsPage::setAppPath); connect(m_startPage, &StartPage::pathSettingsButtonClicked, this, &MainWindow::openSettingsDialog); connect(m_startPage, &StartPage::openFileButtonClicked, this, &MainWindow::onOpenFileButtonClicked); connect(m_startPage, &StartPage::recordButtonClicked, this, &MainWindow::onRecordButtonClicked); connect(m_startPage, &StartPage::stopParseButtonClicked, this, static_cast(&MainWindow::clear)); connect(m_parser, &PerfParser::progress, m_startPage, &StartPage::onParseFileProgress); connect(m_parser, &PerfParser::debugInfoDownloadProgress, m_startPage, &StartPage::onDebugInfoDownloadProgress); connect(this, &MainWindow::openFileError, m_startPage, &StartPage::onOpenFileError); connect(m_recordPage, &RecordPage::homeButtonClicked, this, &MainWindow::onHomeButtonClicked); connect(m_recordPage, &RecordPage::openFile, this, static_cast(&MainWindow::openFile)); connect(m_parser, &PerfParser::parsingFinished, this, [this]() { m_reloadAction->setEnabled(true); m_exportAction->setEnabled(true); m_pageStack->setCurrentWidget(m_resultsPage); }); connect(m_parser, &PerfParser::exportFinished, this, [this](const QUrl& url) { m_exportAction->setEnabled(true); auto* notification = new KNotification(QStringLiteral("fileSaved")); #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) notification->setWidget(this); #else notification->setWindow(window()->windowHandle()); #endif notification->setUrls({url}); notification->setText(tr("Processed data saved")); notification->sendEvent(); emit exportFinished(url); }); connect(m_parser, &PerfParser::exportFailed, this, &MainWindow::exportFailed); connect(m_parser, &PerfParser::parsingFailed, this, [this](const QString& errorMessage) { emit openFileError(errorMessage); }); auto* recordDataAction = new QAction(this); recordDataAction->setText(tr("&Record Data")); recordDataAction->setIcon(QIcon::fromTheme(QStringLiteral("media-record"))); recordDataAction->setShortcut(tr("Ctrl+R")); ui->fileMenu->addAction(recordDataAction); connect(recordDataAction, &QAction::triggered, this, &MainWindow::onRecordButtonClicked); ui->fileMenu->addSeparator(); connect(m_resultsPage, &ResultsPage::navigateToCode, this, &MainWindow::navigateToCode); ui->fileMenu->addAction(KStandardAction::open(this, &MainWindow::onOpenFileButtonClicked, this)); auto openNewWindow = new QAction(QIcon::fromTheme(QStringLiteral("document-open")), tr("Open in new window"), this); openNewWindow->setShortcut(tr("Ctrl+Shift+O")); connect(openNewWindow, &QAction::triggered, this, [this] { const auto fileName = queryOpenDataFile(); if (!fileName.isEmpty()) openInNewWindow(fileName); }); ui->fileMenu->addAction(openNewWindow); m_recentFilesAction = KStandardAction::openRecent(this, qOverload(&MainWindow::openFile), this); m_recentFilesAction->loadEntries(m_config->group(QStringLiteral("RecentFiles"))); ui->fileMenu->addAction(m_recentFilesAction); ui->fileMenu->addSeparator(); m_reloadAction = KStandardAction::redisplay(this, &MainWindow::reload, this); m_reloadAction->setText(tr("Reload")); ui->fileMenu->addAction(m_reloadAction); ui->fileMenu->addSeparator(); m_exportAction = KStandardAction::saveAs(this, qOverload<>(&MainWindow::saveAs), this); ui->fileMenu->addAction(m_exportAction); ui->fileMenu->addSeparator(); ui->fileMenu->addAction(KStandardAction::close(this, qOverload<>(&MainWindow::clear), this)); ui->fileMenu->addSeparator(); ui->fileMenu->addAction(KStandardAction::quit(this, &MainWindow::close, this)); connect(ui->actionAbout_Qt, &QAction::triggered, qApp, &QApplication::aboutQt); connect(ui->actionAbout_KDAB, &QAction::triggered, this, &MainWindow::aboutKDAB); connect(ui->settingsAction, &QAction::triggered, this, &MainWindow::openSettingsDialog); connect(ui->actionAbout_Hotspot, &QAction::triggered, this, &MainWindow::aboutHotspot); auto* prettifySymbolsAction = ui->viewMenu->addAction(tr("Prettify Symbols")); prettifySymbolsAction->setCheckable(true); prettifySymbolsAction->setChecked(Settings::instance()->prettifySymbols()); prettifySymbolsAction->setToolTip( tr("Replace fully qualified and expanded STL type names with their shorter and more commonly used equivalents. " "E.g. show std::string instead of std::basic_string")); connect(prettifySymbolsAction, &QAction::toggled, Settings::instance(), &Settings::setPrettifySymbols); auto* collapseTemplatesAction = ui->viewMenu->addAction(tr("Collapse Templates")); collapseTemplatesAction->setCheckable(true); collapseTemplatesAction->setChecked(Settings::instance()->collapseTemplates()); collapseTemplatesAction->setToolTip(tr("Collapse complex templates to simpler ones. E.g. QHash<...> " "instead of QHash<QString, QVector<QString>>")); connect(collapseTemplatesAction, &QAction::toggled, Settings::instance(), &Settings::setCollapseTemplates); { auto* action = new QWidgetAction(this); auto* widget = new QWidget(this); auto* layout = new QHBoxLayout(widget); auto margins = layout->contentsMargins(); margins.setTop(0); margins.setBottom(0); layout->setContentsMargins(margins); auto* label = new QLabel(tr("Collapse Depth")); layout->addWidget(label); auto* box = new QSpinBox(widget); box->setMinimum(1); box->setValue(Settings::instance()->collapseDepth()); connect(box, QOverload::of(&QSpinBox::valueChanged), Settings::instance(), &Settings::setCollapseDepth); layout->addWidget(box); action->setDefaultWidget(widget); ui->viewMenu->addAction(action); } ui->viewMenu->addSeparator(); auto* restoreDefaultLayout = new QAction(tr("Restore Default Layout"), this); connect(restoreDefaultLayout, &QAction::triggered, [&] { KDDockWidgets::LayoutSaver serializer(KDDockWidgets::RestoreOption_RelativeToMainWindow); serializer.restoreFromFile(QStringLiteral(":/default-dockwidget-layout.json")); }); ui->viewMenu->addAction(restoreDefaultLayout); ui->viewMenu->addSeparator(); ui->viewMenu->addActions(m_resultsPage->filterMenu()->actions()); ui->viewMenu->addSeparator(); ui->viewMenu->addMenu(m_resultsPage->exportMenu()); ui->windowMenu->addActions(m_resultsPage->windowActions()); setupCodeNavigationMenu(); clear(); auto config = m_config->group(QStringLiteral("Window")); restoreGeometry(config.readEntry("geometry", QByteArray())); restoreState(config.readEntry("state", QByteArray())); KDDockWidgets::LayoutSaver serializer(KDDockWidgets::RestoreOption_RelativeToMainWindow); const auto dockWidgetLayout = config.readEntry("layout", QByteArray()); if (!dockWidgetLayout.isEmpty()) { serializer.restoreLayout(dockWidgetLayout); } else { serializer.restoreFromFile(QStringLiteral(":/default-dockwidget-layout.json")); } const auto restored = serializer.restoredDockWidgets(); m_resultsPage->initDockWidgets(restored); } MainWindow::~MainWindow() = default; void MainWindow::closeEvent(QCloseEvent* event) { auto config = m_config->group(QStringLiteral("Window")); config.writeEntry("geometry", saveGeometry()); config.writeEntry("state", saveState()); const auto serializer = KDDockWidgets::LayoutSaver(KDDockWidgets::RestoreOption_RelativeToMainWindow); config.writeEntry("layout", serializer.serializeLayout()); m_parser->stop(); KMainWindow::closeEvent(event); } QString MainWindow::queryOpenDataFile() { const auto filter = tr("Hotspot data Files (perf*.data perf.data.* *.perfparser *.perfparser.*);;" "Linux Perf Files (perf*.data perf.data.*);;" "Perfparser Files (*.perfparser *.perfparser.*);;" "All Files (*)"); return QFileDialog::getOpenFileName(this, tr("Open File"), QDir::currentPath(), filter); } void MainWindow::onOpenFileButtonClicked() { const auto fileName = queryOpenDataFile(); if (fileName.isEmpty()) { return; } openFile(fileName); } void MainWindow::onHomeButtonClicked() { clear(); m_pageStack->setCurrentWidget(m_startPage); } void MainWindow::onRecordButtonClicked() { clear(); setWindowTitle(tr("Hotspot - Record")); m_recordPage->showRecordPage(); m_pageStack->setCurrentWidget(m_recordPage); } void MainWindow::clear(bool isReload) { m_parser->stop(); setWindowTitle(tr("Hotspot")); m_startPage->showStartPage(); m_pageStack->setCurrentWidget(m_startPage); m_recordPage->stopRecording(); if (!isReload) { m_resultsPage->selectSummaryTab(); } m_resultsPage->clear(); m_reloadAction->setEnabled(false); m_exportAction->setEnabled(false); } void MainWindow::clear() { clear(false); } void MainWindow::openFile(const QString& path, bool isReload) { clear(isReload); const auto file = QFileInfo(path); setWindowTitle(tr("%1 - Hotspot").arg(file.fileName())); m_startPage->showParseFileProgress(); m_pageStack->setCurrentWidget(m_startPage); // TODO: support input files of different types via plugins m_parser->startParseFile(path); m_reloadAction->setData(path); m_exportAction->setData(QUrl::fromLocalFile(file.absoluteFilePath() + QLatin1String(".perfparser"))); m_recentFilesAction->addUrl(QUrl::fromLocalFile(file.absoluteFilePath())); m_recentFilesAction->saveEntries(m_config->group(QStringLiteral("RecentFiles"))); m_config->sync(); } void MainWindow::openFile(const QString& path) { openFile(path, false); } void MainWindow::openFile(const QUrl& url) { if (!url.isLocalFile()) { emit openFileError(tr("Cannot open remote file %1.").arg(url.toString())); return; } openFile(url.toLocalFile(), false); } void MainWindow::reload() { openFile(m_reloadAction->data().toString(), true); } void MainWindow::saveAs() { const auto url = QFileDialog::getSaveFileUrl(this, tr("Save Processed Data"), m_exportAction->data().toUrl(), tr("PerfParser (*.perfparser)")); if (!url.isValid()) return; saveAs(url); } void MainWindow::saveAs(const QUrl& url) { m_exportAction->setEnabled(false); m_parser->exportResults(url); } void MainWindow::saveAs(const QString& path, const QUrl& url) { m_exportAction->setEnabled(false); m_parser->exportResults(path, url); } void MainWindow::aboutKDAB() { AboutDialog dialog(this); dialog.setWindowTitle(tr("About KDAB")); dialog.setTitle(tr("Klarälvdalens Datakonsult AB (KDAB)")); dialog.setText(tr("

    Hotspot is supported and maintained by KDAB

    " "

    KDAB, the Qt experts, provide consulting and mentoring for developing " "Qt applications from scratch and in porting from all popular and legacy " "frameworks to Qt. We continue to help develop parts of Qt and are one " "of the major contributors to the Qt Project. We can give advanced or " "standard trainings anywhere around the globe.

    " "
    ")); dialog.setLogo(QStringLiteral(":/images/kdablogo.png")); dialog.setWindowIcon(QIcon(QStringLiteral(":/images/kdablogo.png"))); dialog.adjustSize(); dialog.exec(); } void MainWindow::openSettingsDialog() { m_settingsDialog->setWindowTitle(tr("Hotspot configuration")); m_settingsDialog->setWindowIcon(windowIcon()); m_settingsDialog->adjustSize(); m_settingsDialog->initSettings(); m_settingsDialog->open(); } void MainWindow::aboutHotspot() { AboutDialog dialog(this); dialog.setWindowTitle(tr("About Hotspot")); dialog.setTitle( tr("Hotspot %1 - the Linux perf GUI for performance analysis").arg(QCoreApplication::applicationVersion())); dialog.setText(tr("

    Hotspot is supported and maintained by KDAB

    " "

    This project is a KDAB R&D effort to create a standalone GUI for performance data. " "As the first goal, we want to provide a UI like KCachegrind around Linux perf. " "Looking ahead, we intend to support various other performance data formats " "under this umbrella.

    " "

    Hotspot is an open source project:

    " "

    Patches welcome!

    ")); dialog.setLogo(QStringLiteral(":/images/hotspot_logo.png")); dialog.setWindowIcon(QIcon::fromTheme(QStringLiteral("hotspot"))); dialog.adjustSize(); dialog.exec(); } void MainWindow::setupCodeNavigationMenu() { // Code Navigation auto* configAction = new QAction(QIcon::fromTheme(QStringLiteral("applications-development")), tr("Code Navigation"), this); auto menu = new QMenu(this); auto group = new QActionGroup(this); group->setExclusive(true); const auto settings = m_config->group(QStringLiteral("CodeNavigation")); const auto currentIdx = settings.readEntry("IDE", firstAvailableIde()); for (int i = 0; i < ideSettingsSize; ++i) { auto action = new QAction(menu); action->setText(tr(ideSettings[i].name)); auto icon = QIcon::fromTheme(QString::fromUtf8(ideSettings[i].app)); if (icon.isNull()) { icon = QIcon::fromTheme(QStringLiteral("application-x-executable")); } action->setIcon(icon); action->setCheckable(true); action->setChecked(currentIdx == i); action->setData(i); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) // It's not worth it to reimplement missing findExecutable for Qt4. action->setEnabled(isAppAvailable(ideSettings[i].app)); #endif group->addAction(action); menu->addAction(action); } menu->addSeparator(); auto* action = new QAction(menu); action->setText(tr("Custom...")); action->setCheckable(true); action->setChecked(currentIdx == -1); action->setData(-1); action->setIcon(QIcon::fromTheme(QStringLiteral("application-x-executable-script"))); group->addAction(action); menu->addAction(action); #if defined(Q_OS_WIN) || defined(Q_OS_OSX) // This is a workaround for the cases, where we can't safely do assumptions // about the install location of the IDE action = new QAction(menu); action->setText(tr("Automatic (No Line numbers)")); action->setCheckable(true); action->setChecked(currentIdx == -2); action->setData(-2); group->addAction(action); menu->addAction(action); #endif QObject::connect(group, &QActionGroup::triggered, this, &MainWindow::setCodeNavigationIDE); configAction->setMenu(menu); ui->settingsMenu->insertMenu(ui->settingsAction, menu); ui->settingsMenu->insertSeparator(ui->settingsAction); } void MainWindow::setCodeNavigationIDE(QAction* action) { auto settings = m_config->group(QStringLiteral("CodeNavigation")); if (action->data() == -1) { const auto customCmd = QInputDialog::getText(this, tr("Custom Code Navigation"), tr("Specify command to use for code navigation, '%f' will be replaced by the file " "name, '%l' by the line number and '%c' by the column number."), QLineEdit::Normal, settings.readEntry("CustomCommand")); if (!customCmd.isEmpty()) { settings.writeEntry("CustomCommand", customCmd); settings.writeEntry("IDE", -1); } return; } const auto defaultIde = action->data().toInt(); settings.writeEntry("IDE", defaultIde); } void MainWindow::navigateToCode(const QString& filePath, int lineNumber, int columnNumber) { const auto settings = m_config->group(QStringLiteral("CodeNavigation")); const auto ideIdx = settings.readEntry("IDE", firstAvailableIde()); QString command; QString desktopEntryName; #if !defined(Q_OS_WIN) \ && !defined(Q_OS_OSX) // Remove this #if branch when adding real data to ideSettings for Windows/OSX. if (ideIdx >= 0 && ideIdx < ideSettingsSize) { command = QString::fromUtf8(ideSettings[ideIdx].app) + QLatin1Char(' ') + QString::fromUtf8(ideSettings[ideIdx].args); desktopEntryName = QString::fromUtf8(ideSettings[ideIdx].desktopEntryName); } else #endif if (ideIdx == -1) { command = settings.readEntry("CustomCommand"); } if (!command.isEmpty()) { KShell::Errors errors = KShell::NoError; auto args = KShell::splitArgs(command, KShell::TildeExpand | KShell::AbortOnMeta, &errors); if (errors || args.isEmpty()) { m_resultsPage->showError(tr("Failed to parse command: %1").arg(command)); return; } command = args.takeFirst(); for (auto& arg : args) { arg.replace(QLatin1String("%f"), filePath); arg.replace(QLatin1String("%l"), QString::number(std::max(1, lineNumber))); arg.replace(QLatin1String("%c"), QString::number(std::max(1, columnNumber))); } #if KIO_VERSION >= QT_VERSION_CHECK(5, 69, 0) auto* job = new KIO::CommandLauncherJob(command, args); job->setDesktopName(desktopEntryName); connect(job, &KJob::finished, this, [this, command, args](KJob* job) { if (job->error()) { m_resultsPage->showError( tr("Failed to launch command: %1 %2").arg(command, args.join(QLatin1Char(' ')))); } }); job->start(); #else if (!QProcess::startDetached(command, args)) { m_resultsPage->showError(tr("Failed to launch command: %1 %2").arg(command, args.join(QLatin1Char(' ')))); } #endif } else { QDesktopServices::openUrl(QUrl::fromLocalFile(filePath)); return; } } void MainWindow::openInNewWindow(const QString& file, const QStringList& args) { auto process = new QProcess(qApp); QObject::connect(process, &QProcess::errorOccurred, qApp, [=]() { qWarning() << file << process->errorString(); }); // the event loop locker prevents the main app from quitting while the child processes are still running // we want to keep them all alive and quit them in one go. detaching isn't as nice, as we would not be // able to quit all apps in one go via Ctrl+C then anymore' QObject::connect(process, qOverload(&QProcess::finished), qApp, [process, lock = std::make_unique()]() mutable { lock.reset(); process->deleteLater(); }); auto allArgs = args; allArgs.append(file); process->start(QCoreApplication::applicationFilePath(), allArgs); } KDAB-hotspot-41e5de7/src/mainwindow.h000066400000000000000000000040761515036260400174560ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include #include namespace Ui { class MainWindow; } class PerfParser; class QStackedWidget; class KRecentFilesAction; class StartPage; class ResultsPage; class RecordPage; class SettingsDialog; class MainWindow : public KParts::MainWindow { Q_OBJECT public: explicit MainWindow(QWidget* parent = nullptr); ~MainWindow(); public slots: void clear(); void openFile(const QString& path); void openFile(const QUrl& url); void reload(); void saveAs(); void saveAs(const QUrl& url); void saveAs(const QString& path, const QUrl& url); void onOpenFileButtonClicked(); void onRecordButtonClicked(); void onHomeButtonClicked(); void aboutKDAB(); void openSettingsDialog(); void aboutHotspot(); void setCodeNavigationIDE(QAction* action); void navigateToCode(const QString& url, int lineNumber, int columnNumber); static void openInNewWindow(const QString& file, const QStringList& args = {}); signals: void openFileError(const QString& errorMessage); void exportFinished(const QUrl& url); void exportFailed(const QString& errorMessage); private: void clear(bool isReload); void openFile(const QString& path, bool isReload); void closeEvent(QCloseEvent* event) override; void setupCodeNavigationMenu(); QString queryOpenDataFile(); std::unique_ptr ui; PerfParser* m_parser; KSharedConfigPtr m_config; QStackedWidget* m_pageStack; StartPage* m_startPage; RecordPage* m_recordPage; ResultsPage* m_resultsPage; SettingsDialog* m_settingsDialog; KRecentFilesAction* m_recentFilesAction = nullptr; QAction* m_reloadAction = nullptr; QAction* m_exportAction = nullptr; }; KDAB-hotspot-41e5de7/src/mainwindow.ui000066400000000000000000000056231515036260400176430ustar00rootroot00000000000000 MainWindow 0 0 1123 769 MainWindow true 0 0 1123 30 &Help &File Setti&ngs &View true Window :/images/icons/128-apps-hotspot.png:/images/icons/128-apps-hotspot.png About &Hotspot :/images/kdablogo.png:/images/kdablogo.png About &KDAB :/images/qtlogo.png:/images/qtlogo.png About &Qt Settings KDAB-hotspot-41e5de7/src/models/000077500000000000000000000000001515036260400164055ustar00rootroot00000000000000KDAB-hotspot-41e5de7/src/models/CMakeLists.txt000066400000000000000000000015371515036260400211530ustar00rootroot00000000000000add_library( models STATIC ../settings.cpp ../util.cpp byfilemodel.cpp callercalleemodel.cpp callercalleeproxy.cpp codedelegate.cpp costdelegate.cpp data.cpp disassemblymodel.cpp disassemblyoutput.cpp eventmodel.cpp filterandzoomstack.cpp formattingutils.cpp frequencymodel.cpp highlightedtext.cpp processfiltermodel.cpp processlist_unix.cpp processmodel.cpp sourcecodemodel.cpp timeaxisheaderview.cpp timelinedelegate.cpp topproxy.cpp treemodel.cpp ) target_link_libraries( models Qt::Core Qt::Widgets KF${QT_MAJOR_VERSION}::ItemModels KF${QT_MAJOR_VERSION}::ConfigWidgets KF${QT_MAJOR_VERSION}::Parts PrefixTickLabels ) if(KFSyntaxHighlighting_FOUND) target_link_libraries(models KF${QT_MAJOR_VERSION}::SyntaxHighlighting) endif() KDAB-hotspot-41e5de7/src/models/byfilemodel.cpp000066400000000000000000000075171515036260400214160ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2024 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "byfilemodel.h" #include "../util.h" #include ByFileModel::ByFileModel(QObject* parent) : HashModel(parent) { } ByFileModel::~ByFileModel() = default; void ByFileModel::setResults(const Data::ByFileResults& results) { m_results = results; setRows(results.entries); } QVariant ByFileModel::headerCell(int column, int role) const { if (role == Qt::DisplayRole) { switch (column) { case File: return tr("File"); } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return tr("%1 (self)").arg(m_results.selfCosts.typeName(column)); } column -= m_results.selfCosts.numTypes(); return tr("%1 (incl.)").arg(m_results.inclusiveCosts.typeName(column)); } else if (role == Qt::ToolTipRole) { switch (column) { case File: return tr("The name of the file. May be empty when debug information is missing."); } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return tr("The aggregated sample costs directly attributed to this file."); } return tr("The aggregated sample costs attributed to this file, both directly and indirectly. This includes " "the costs of all functions called by this file plus its self cost."); } return {}; } QVariant ByFileModel::cell(int column, int role, const QString& file, const Data::ByFileEntry& entry) const { if (role == FileRole) { return QVariant::fromValue(file); } else if (role == SortRole) { switch (column) { case File: return Util::formatString(file); } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return m_results.selfCosts.cost(column, entry.id); } column -= m_results.selfCosts.numTypes(); return m_results.inclusiveCosts.cost(column, entry.id); } else if (role == TotalCostRole && column >= NUM_BASE_COLUMNS) { column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return m_results.selfCosts.totalCost(column); } column -= m_results.selfCosts.numTypes(); return m_results.inclusiveCosts.totalCost(column); } else if (role == Qt::DisplayRole) { switch (column) { case File: return Util::formatString(file); } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return Util::formatCostRelative(m_results.selfCosts.cost(column, entry.id), m_results.selfCosts.totalCost(column), true); } column -= m_results.selfCosts.numTypes(); return Util::formatCostRelative(m_results.inclusiveCosts.cost(column, entry.id), m_results.inclusiveCosts.totalCost(column), true); } else if (role == SourceMapRole) { return QVariant::fromValue(entry.sourceMap); } else if (role == SelfCostsRole) { return QVariant::fromValue(m_results.selfCosts); } else if (role == InclusiveCostsRole) { return QVariant::fromValue(m_results.inclusiveCosts); } else if (role == Qt::ToolTipRole) { return Util::formatFileTooltip(entry.id, file, m_results.selfCosts, m_results.inclusiveCosts); } return {}; } QModelIndex ByFileModel::indexForFile(const QString& file) const { return indexForKey(file); } int ByFileModel::numColumns() const { return NUM_BASE_COLUMNS + m_results.inclusiveCosts.numTypes() + m_results.selfCosts.numTypes(); } KDAB-hotspot-41e5de7/src/models/byfilemodel.h000066400000000000000000000022731515036260400210550ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2024 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "data.h" #include "hashmodel.h" class ByFileModel : public HashModel { Q_OBJECT public: explicit ByFileModel(QObject* parent = nullptr); ~ByFileModel(); void setResults(const Data::ByFileResults& results); enum Columns { File = 0, }; enum { NUM_BASE_COLUMNS = File + 1, InitialSortColumn = File + 1 // the first cost column }; enum Roles { SortRole = Qt::UserRole, TotalCostRole, SelfCostsRole, InclusiveCostsRole, SourceMapRole, FileRole, }; QVariant headerCell(int column, int role) const final override; QVariant cell(int column, int role, const QString& file, const Data::ByFileEntry& entry) const final override; int numColumns() const final override; QModelIndex indexForFile(const QString& file) const; private: Data::ByFileResults m_results; }; KDAB-hotspot-41e5de7/src/models/callercalleemodel.cpp000066400000000000000000000132051515036260400225430ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "callercalleemodel.h" #include "../util.h" #include CallerCalleeModel::CallerCalleeModel(QObject* parent) : HashModel(parent) { auto prettifySymbolsHelper = [this]() { if (rowCount() == 0) { return; } emit dataChanged(index(0, Symbol), index(rowCount() - 1, Symbol)); }; connect(Settings::instance(), &Settings::prettifySymbolsChanged, this, prettifySymbolsHelper); connect(Settings::instance(), &Settings::collapseTemplatesChanged, this, prettifySymbolsHelper); connect(Settings::instance(), &Settings::collapseDepthChanged, this, prettifySymbolsHelper); } CallerCalleeModel::~CallerCalleeModel() = default; void CallerCalleeModel::setResults(const Data::CallerCalleeResults& results) { m_results = results; setRows(results.entries); } QVariant CallerCalleeModel::headerCell(int column, int role) const { if (role == Qt::InitialSortOrderRole && column > Binary) { return Qt::DescendingOrder; } else if (role == Qt::DisplayRole) { switch (column) { case Symbol: return tr("Symbol"); case Binary: return tr("Binary"); } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return tr("%1 (self)").arg(m_results.selfCosts.typeName(column)); } column -= m_results.selfCosts.numTypes(); return tr("%1 (incl.)").arg(m_results.inclusiveCosts.typeName(column)); } else if (role == Qt::ToolTipRole) { switch (column) { case Symbol: return tr("The symbol's function name. May be empty when debug information is missing."); case Binary: return tr( "The name of the executable the symbol resides in. May be empty when debug information is missing."); } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return tr("The aggregated sample costs directly attributed to this symbol."); } return tr("The aggregated sample costs attributed to this symbol, both directly and indirectly. This includes " "the costs of all functions called by this symbol plus its self cost."); } return {}; } QVariant CallerCalleeModel::cell(int column, int role, const Data::Symbol& symbol, const Data::CallerCalleeEntry& entry) const { if (role == SymbolRole) { return QVariant::fromValue(symbol); } else if (role == SortRole) { switch (column) { case Symbol: return Util::formatSymbol(symbol.prettySymbol); case Binary: return symbol.binary; } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return m_results.selfCosts.cost(column, entry.id); } column -= m_results.selfCosts.numTypes(); return m_results.inclusiveCosts.cost(column, entry.id); } else if (role == TotalCostRole && column >= NUM_BASE_COLUMNS) { column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return m_results.selfCosts.totalCost(column); } column -= m_results.selfCosts.numTypes(); return m_results.inclusiveCosts.totalCost(column); } else if (role == Qt::DisplayRole) { switch (column) { case Symbol: return Util::formatSymbol(symbol); case Binary: return symbol.binary; } column -= NUM_BASE_COLUMNS; if (column < m_results.selfCosts.numTypes()) { return Util::formatCostRelative(m_results.selfCosts.cost(column, entry.id), m_results.selfCosts.totalCost(column), true); } column -= m_results.selfCosts.numTypes(); return Util::formatCostRelative(m_results.inclusiveCosts.cost(column, entry.id), m_results.inclusiveCosts.totalCost(column), true); } else if (role == CalleesRole) { return QVariant::fromValue(entry.callees); } else if (role == CallersRole) { return QVariant::fromValue(entry.callers); } else if (role == SourceMapRole) { return QVariant::fromValue(entry.sourceMap); } else if (role == SelfCostsRole) { return QVariant::fromValue(m_results.selfCosts); } else if (role == InclusiveCostsRole) { return QVariant::fromValue(m_results.inclusiveCosts); } else if (role == Qt::ToolTipRole) { return Util::formatTooltip(entry.id, symbol, m_results.selfCosts, m_results.inclusiveCosts); } return {}; } QModelIndex CallerCalleeModel::indexForSymbol(const Data::Symbol& symbol) const { return indexForKey(symbol); } CallerModel::CallerModel(QObject* parent) : SymbolCostModelImpl(parent) { } CallerModel::~CallerModel() = default; QString CallerModel::symbolHeader() const { return tr("Caller"); } CalleeModel::CalleeModel(QObject* parent) : SymbolCostModelImpl(parent) { } CalleeModel::~CalleeModel() = default; QString CalleeModel::symbolHeader() const { return tr("Callee"); } SourceMapModel::SourceMapModel(QObject* parent) : LocationCostModelImpl(parent) { } SourceMapModel::~SourceMapModel() = default; int CallerCalleeModel::numColumns() const { return NUM_BASE_COLUMNS + m_results.inclusiveCosts.numTypes() + m_results.selfCosts.numTypes(); } KDAB-hotspot-41e5de7/src/models/callercalleemodel.h000066400000000000000000000237171515036260400222210ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include "../settings.h" #include "data.h" #include "hashmodel.h" class CallerCalleeModel : public HashModel { Q_OBJECT public: explicit CallerCalleeModel(QObject* parent = nullptr); ~CallerCalleeModel(); void setResults(const Data::CallerCalleeResults& results); enum Columns { Symbol = 0, Binary, }; enum { NUM_BASE_COLUMNS = Binary + 1, InitialSortColumn = Binary + 1 // the first cost column }; enum Roles { SortRole = Qt::UserRole, TotalCostRole, CalleesRole, CallersRole, SourceMapRole, SelfCostsRole, InclusiveCostsRole, SymbolRole, }; QVariant headerCell(int column, int role) const final override; QVariant cell(int column, int role, const Data::Symbol& symbol, const Data::CallerCalleeEntry& entry) const final override; int numColumns() const final override; QModelIndex indexForSymbol(const Data::Symbol& symbol) const; private: Data::CallerCalleeResults m_results; }; template class SymbolCostModelImpl : public HashModel { public: explicit SymbolCostModelImpl(QObject* parent = nullptr) : HashModel(parent) { using Parent = HashModel; auto dataChangedHelper = [this]() { if (Parent::rowCount() == 0) { return; } emit Parent::dataChanged(Parent::index(0, Symbol), Parent::index(Parent::rowCount() - 1, Symbol)); }; Parent::connect(Settings::instance(), &Settings::prettifySymbolsChanged, this, dataChangedHelper); Parent::connect(Settings::instance(), &Settings::collapseTemplatesChanged, this, dataChangedHelper); Parent::connect(Settings::instance(), &Settings::collapseDepthChanged, this, dataChangedHelper); } virtual ~SymbolCostModelImpl() = default; void setResults(const Data::SymbolCostMap& map, const Data::Costs& costs) { m_costs = costs; HashModel::setRows(map); } enum Columns { Symbol = 0, Binary, }; enum { NUM_BASE_COLUMNS = Binary + 1, InitialSortColumn = Binary + 1 // the first cost column }; enum Roles { SortRole = Qt::UserRole, TotalCostRole, SymbolRole }; QVariant headerCell(int column, int role) const final override { if (role == Qt::InitialSortOrderRole && column > Binary) { return Qt::DescendingOrder; } else if (role == Qt::DisplayRole) { switch (column) { case Symbol: return symbolHeader(); case Binary: return ModelImpl::tr("Binary"); } return m_costs.typeName(column - NUM_BASE_COLUMNS); } else if (role == Qt::ToolTipRole) { switch (column) { case Symbol: return ModelImpl::tr("The function name of the %1. May be empty when debug information is missing.") .arg(symbolHeader()); case Binary: return ModelImpl::tr("The name of the executable the symbol resides in. May be empty when debug " "information is missing."); } return ModelImpl::tr("The symbol's inclusive cost, i.e. the aggregated sample costs attributed to this " "symbol, both directly and indirectly."); } return {}; } QVariant cell(int column, int role, const Data::Symbol& symbol, const Data::ItemCost& costs) const final override { if (role == SortRole) { switch (column) { case Symbol: return Util::formatSymbol(symbol); case Binary: return symbol.binary; } return costs[column - NUM_BASE_COLUMNS]; } else if (role == TotalCostRole && column >= NUM_BASE_COLUMNS) { return m_costs.totalCost(column - NUM_BASE_COLUMNS); } else if (role == Qt::DisplayRole) { switch (column) { case Symbol: return Util::formatSymbol(symbol); case Binary: return symbol.binary; } return Util::formatCostRelative(costs[column - NUM_BASE_COLUMNS], m_costs.totalCost(column - NUM_BASE_COLUMNS), true); } else if (role == SymbolRole) { return QVariant::fromValue(symbol); } else if (role == Qt::ToolTipRole) { return Util::formatTooltip(symbol, costs, m_costs); } return {}; } int numColumns() const final override { return NUM_BASE_COLUMNS + m_costs.numTypes(); } private: virtual QString symbolHeader() const = 0; Data::Costs m_costs; }; class CallerModel : public SymbolCostModelImpl { Q_OBJECT public: explicit CallerModel(QObject* parent = nullptr); ~CallerModel(); QString symbolHeader() const final override; }; class CalleeModel : public SymbolCostModelImpl { Q_OBJECT public: explicit CalleeModel(QObject* parent = nullptr); ~CalleeModel(); QString symbolHeader() const final override; }; template class LocationCostModelImpl : public HashModel { public: explicit LocationCostModelImpl(QObject* parent = nullptr) : HashModel(parent) { } virtual ~LocationCostModelImpl() = default; void setResults(const Data::SourceLocationCostMap& map, const Data::Costs& totalCosts) { m_totalCosts = totalCosts; HashModel::setRows(map); } enum Columns { Location = 0, }; enum { NUM_BASE_COLUMNS = Location + 1, InitialSortColumn = Location + 1 // the first cost column }; enum Roles { SortRole = Qt::UserRole, TotalCostRole, FileLineRole, }; QVariant headerCell(int column, int role) const final override { if (role == Qt::InitialSortOrderRole && column > Location) { return Qt::DescendingOrder; } else if (role == Qt::DisplayRole) { if (column == Location) { return ModelImpl::tr("Location"); } column -= NUM_BASE_COLUMNS; if (column < m_totalCosts.numTypes()) { return ModelImpl::tr("%1 (self)").arg(m_totalCosts.typeName(column)); } column -= m_totalCosts.numTypes(); return ModelImpl::tr("%1 (incl.)").arg(m_totalCosts.typeName(column)); } else if (role == Qt::ToolTipRole) { if (column == Location) { return ModelImpl::tr("The source file name and line number where the cost was measured. May be empty " "when debug information is missing."); } column -= NUM_BASE_COLUMNS; if (column < m_totalCosts.numTypes()) { return ModelImpl::tr("The aggregated sample costs directly attributed to this code location."); } return ModelImpl::tr( "The aggregated sample costs attributed to this code location, both directly and indirectly." " This includes the costs of all functions called from this location plus its self cost."); } return {}; } QVariant cell(int column, int role, const Data::FileLine& fileLine, const Data::LocationCost& costs) const final override { if (role == SortRole) { if (column == Location) { return QVariant::fromValue(fileLine); } column -= NUM_BASE_COLUMNS; if (column < m_totalCosts.numTypes()) { return costs.selfCost[column]; } column -= m_totalCosts.numTypes(); return costs.inclusiveCost[column]; } else if (role == TotalCostRole && column >= NUM_BASE_COLUMNS) { column -= NUM_BASE_COLUMNS; if (column >= m_totalCosts.numTypes()) { column -= m_totalCosts.numTypes(); } return m_totalCosts.totalCost(column); } else if (role == Qt::DisplayRole) { if (column == Location) { if (!fileLine.isValid()) { return ModelImpl::tr("??"); } // only show the file name, not the full path return fileLine.toShortString(); } column -= NUM_BASE_COLUMNS; if (column < m_totalCosts.numTypes()) { return Util::formatCostRelative(costs.selfCost[column], m_totalCosts.totalCost(column), true); } column -= m_totalCosts.numTypes(); return Util::formatCostRelative(costs.inclusiveCost[column], m_totalCosts.totalCost(column), true); } else if (role == FileLineRole) { return QVariant::fromValue(fileLine); } else if (role == Qt::ToolTipRole) { return Util::formatTooltip(fileLine, costs, m_totalCosts); } return {}; } int numColumns() const final override { return 1 + m_totalCosts.numTypes() * 2; } private: Data::Costs m_totalCosts; }; class SourceMapModel : public LocationCostModelImpl { Q_OBJECT public: explicit SourceMapModel(QObject* parent = nullptr); ~SourceMapModel(); }; KDAB-hotspot-41e5de7/src/models/callercalleeproxy.cpp000066400000000000000000000034241515036260400226260ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "callercalleeproxy.h" #include "callercalleemodel.h" #include "data.h" #include namespace { bool matchImpl(const QRegularExpression& pattern, const QString& haystack) { return pattern.match(haystack).hasMatch(); } } namespace CallerCalleeProxyDetail { bool match(const QSortFilterProxyModel* proxy, const Data::Symbol& symbol) { const auto pattern = proxy->filterRegularExpression(); return matchImpl(pattern, symbol.symbol) || matchImpl(pattern, symbol.binary); } bool match(const QSortFilterProxyModel* proxy, const Data::FileLine& fileLine) { const auto pattern = proxy->filterRegularExpression(); return matchImpl(pattern, fileLine.file); } bool match(const QSortFilterProxyModel* proxy, const QString& file) { const auto pattern = proxy->filterRegularExpression(); return matchImpl(pattern, file); } } SourceMapProxy::SourceMapProxy(QObject* parent) : CallerCalleeProxy(parent) { } SourceMapProxy::~SourceMapProxy() = default; bool SourceMapProxy::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const { if (source_left.column() == source_right.column() && source_left.column() == SourceMapModel::Location) { const auto left = source_left.data(SourceMapModel::SortRole).value(); const auto right = source_right.data(SourceMapModel::SortRole).value(); return left < right; } return QSortFilterProxyModel::lessThan(source_left, source_right); } KDAB-hotspot-41e5de7/src/models/callercalleeproxy.h000066400000000000000000000030241515036260400222670ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include namespace Data { struct Symbol; struct FileLine; } namespace CallerCalleeProxyDetail { bool match(const QSortFilterProxyModel* proxy, const Data::Symbol& symbol); bool match(const QSortFilterProxyModel* proxy, const Data::FileLine& fileLine); bool match(const QSortFilterProxyModel* proxy, const QString& file); } class SourceMapModel; template class CallerCalleeProxy : public QSortFilterProxyModel { public: explicit CallerCalleeProxy(QObject* parent = nullptr) : QSortFilterProxyModel(parent) { setRecursiveFilteringEnabled(true); setDynamicSortFilter(true); } protected: bool filterAcceptsRow(int source_row, const QModelIndex& parent) const override { Q_UNUSED(parent); const auto* model = qobject_cast(sourceModel()); Q_ASSERT(model); const auto key = model->key(source_row); return CallerCalleeProxyDetail::match(this, key); } }; class SourceMapProxy : public CallerCalleeProxy { Q_OBJECT public: SourceMapProxy(QObject* parent = nullptr); ~SourceMapProxy(); protected: bool lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const override; }; KDAB-hotspot-41e5de7/src/models/codedelegate.cpp000066400000000000000000000056631515036260400215300ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "codedelegate.h" #include #include #include #include Q_DECLARE_METATYPE(QTextLine) namespace { QColor backgroundColor(int line, bool isCurrent) { const int degrees = (line * 139) % 360; return QColor::fromHsv(degrees, 255, 255, isCurrent ? 60 : 40); } } CodeDelegate::CodeDelegate(int lineNumberRole, int highlightRole, int syntaxHighlightRole, QObject* parent) : QStyledItemDelegate(parent) , m_lineNumberRole(lineNumberRole) , m_highlightRole(highlightRole) , m_syntaxHighlightRole(syntaxHighlightRole) { } CodeDelegate::~CodeDelegate() = default; QSize CodeDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { const auto line = index.data(m_syntaxHighlightRole).value(); if (line.isValid()) { return {static_cast(line.width()), static_cast(line.height())}; } return QStyledItemDelegate::sizeHint(option, index); } void CodeDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { const auto brush = painter->brush(); const auto pen = painter->pen(); painter->setPen(Qt::NoPen); if (option.features & QStyleOptionViewItem::Alternate) { // we must handle this ourselves as otherwise the custom background // would get painted over with the alternate background color painter->setBrush(option.palette.alternateBase()); painter->drawRect(option.rect); } bool ok = false; const auto sourceLine = index.data(m_lineNumberRole).toInt(&ok); if (option.state & QStyle::State_Selected) { painter->setBrush(option.palette.highlight()); painter->drawRect(option.rect); } else if (ok && sourceLine >= 0) { painter->setBrush(backgroundColor(sourceLine, index.data(m_highlightRole).toBool())); painter->drawRect(option.rect); } painter->setPen(pen); painter->setBrush(brush); const auto line = index.data(m_syntaxHighlightRole).value(); if (line.isValid()) { const auto textRect = line.naturalTextRect(); auto rect = QStyle::alignedRect(Qt::LayoutDirection::LeftToRight, Qt::AlignVCenter, textRect.size().toSize(), option.rect); painter->setClipRect(option.rect); line.draw(painter, rect.topLeft()); painter->setClipping(false); } else { if (option.features & QStyleOptionViewItem::Alternate) { auto o = option; o.features &= ~QStyleOptionViewItem::Alternate; QStyledItemDelegate::paint(painter, o, index); } else { QStyledItemDelegate::paint(painter, option, index); } } } KDAB-hotspot-41e5de7/src/models/codedelegate.h000066400000000000000000000013771515036260400211730ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include class CodeDelegate : public QStyledItemDelegate { Q_OBJECT public: CodeDelegate(int lineNumberRole, int highlightRole, int syntaxHighlightRole, QObject* parent = nullptr); ~CodeDelegate(); QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; private: int m_lineNumberRole; int m_highlightRole; int m_syntaxHighlightRole; }; KDAB-hotspot-41e5de7/src/models/costdelegate.cpp000066400000000000000000000037111515036260400215560ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "costdelegate.h" #include #include #include CostDelegate::CostDelegate(quint32 sortRole, quint32 totalCostRole, QObject* parent) : QStyledItemDelegate(parent) , m_sortRole(sortRole) , m_totalCostRole(totalCostRole) { } CostDelegate::~CostDelegate() = default; void CostDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // TODO: handle negative values const auto cost = index.data(m_sortRole).toULongLong(); if (cost == 0) { QStyledItemDelegate::paint(painter, option, index); return; } const auto totalCost = index.data(m_totalCostRole).toULongLong(); const auto fraction = std::abs(float(cost) / totalCost); auto rect = option.rect; rect.setWidth(rect.width() * fraction); const auto brush = painter->brush(); const auto pen = painter->pen(); painter->setPen(Qt::NoPen); if (option.features & QStyleOptionViewItem::Alternate) { // we must handle this ourselves as otherwise the custom background // would get painted over with the alternate background color painter->setBrush(option.palette.alternateBase()); painter->drawRect(option.rect); } auto color = QColor::fromHsv(120 - (fraction * 120), 255, 255, ((-((fraction - 1) * (fraction - 1))) * 120) + 120); painter->setBrush(color); painter->drawRect(rect); painter->setBrush(brush); painter->setPen(pen); if (option.features & QStyleOptionViewItem::Alternate) { auto o = option; o.features &= ~QStyleOptionViewItem::Alternate; QStyledItemDelegate::paint(painter, o, index); } else { QStyledItemDelegate::paint(painter, option, index); } } KDAB-hotspot-41e5de7/src/models/costdelegate.h000066400000000000000000000011671515036260400212260ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include class CostDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit CostDelegate(quint32 sortRole, quint32 totalCostRole, QObject* parent = nullptr); ~CostDelegate(); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; private: quint32 m_sortRole; quint32 m_totalCostRole; }; KDAB-hotspot-41e5de7/src/models/costproxy.h000066400000000000000000000020171515036260400206300ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "callercalleeproxy.h" template class CostProxy : public QSortFilterProxyModel { public: explicit CostProxy(QObject* parent = nullptr) : QSortFilterProxyModel(parent) { setRecursiveFilteringEnabled(true); setDynamicSortFilter(true); } protected: bool filterAcceptsRow(int source_row, const QModelIndex& parent) const override { Q_UNUSED(source_row); const auto* model = qobject_cast(sourceModel()); Q_ASSERT(model); const auto* item = model->itemFromIndex(parent); if (!item) { return false; } return CallerCalleeProxyDetail::match(this, item->symbol); } }; KDAB-hotspot-41e5de7/src/models/data.cpp000066400000000000000000000350101515036260400200210ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "data.h" #include #include using namespace Data; namespace { ItemCost buildTopDownResult(const BottomUp& bottomUpData, const Costs& bottomUpCosts, TopDown* topDownData, Costs* inclusiveCosts, Costs* selfCosts, quint32* maxId, bool skipFirstLevel) { ItemCost totalCost; totalCost.resize(bottomUpCosts.numTypes(), 0); for (const auto& row : bottomUpData.children) { // recurse and find the cost attributed to children const auto childCost = buildTopDownResult(row, bottomUpCosts, topDownData, inclusiveCosts, selfCosts, maxId, skipFirstLevel); const auto rowCost = bottomUpCosts.itemCost(row.id); const auto diff = rowCost - childCost; if (diff.sum() != 0) { // this row is (partially) a leaf // bubble up the parent chain to build a top-down tree auto node = &row; auto stack = topDownData; while (node) { auto frame = stack->entryForSymbol(node->symbol, maxId); const auto isLastNode = !node->parent || (skipFirstLevel && !node->parent->parent); // always use the leaf node's cost and propagate that one up the chain // otherwise we'd count the cost of some nodes multiple times inclusiveCosts->add(frame->id, diff); if (isLastNode) { selfCosts->add(frame->id, diff); break; } stack = frame; node = node->parent; } } totalCost += rowCost; } return totalCost; } void add(ItemCost& lhs, const ItemCost& rhs) { if (!lhs.size()) { lhs = rhs; } else { Q_ASSERT(lhs.size() == rhs.size()); lhs += rhs; } } ItemCost buildCallerCalleeResult(const BottomUp& data, const Costs& bottomUpCosts, CallerCalleeResults* results) { ItemCost totalCost; totalCost.resize(bottomUpCosts.numTypes(), 0); for (const auto& row : data.children) { // recurse to find a leaf const auto childCost = buildCallerCalleeResult(row, bottomUpCosts, results); const auto rowCost = bottomUpCosts.itemCost(row.id); const auto diff = rowCost - childCost; if (diff.sum() != 0) { // this row is (partially) a leaf // leaf node found, bubble up the parent chain to add cost for all frames // to the caller/callee data. this is done top-down since we must not count // symbols more than once in the caller-callee data QSet recursionGuard; auto node = &row; QSet> callerCalleeRecursionGuard; Data::Symbol lastSymbol; Data::CallerCalleeEntry* lastEntry = nullptr; while (node) { const auto& symbol = node->symbol; // aggregate caller-callee data auto& entry = results->entry(symbol); if (!recursionGuard.contains(symbol)) { // only increment inclusive cost once for a given stack results->inclusiveCosts.add(entry.id, diff); recursionGuard.insert(symbol); } if (!node->parent) { // always increment the self cost results->selfCosts.add(entry.id, diff); } // add current entry as callee to last entry // and last entry as caller to current entry if (lastEntry) { const auto callerCalleePair = qMakePair(symbol, lastSymbol); if (!callerCalleeRecursionGuard.contains(callerCalleePair)) { add(lastEntry->callee(symbol, bottomUpCosts.numTypes()), diff); add(entry.caller(lastSymbol, bottomUpCosts.numTypes()), diff); callerCalleeRecursionGuard.insert(callerCalleePair); } } node = node->parent; lastSymbol = symbol; lastEntry = &entry; } } totalCost += rowCost; } return totalCost; } int findSameDepth(QStringView str, int offset, QChar ch, bool returnNext = false) { const int size = str.size(); int depth = 0; for (; offset < size; ++offset) { const auto current = str[offset]; if (current == QLatin1Char('<') || current == QLatin1Char('(')) { ++depth; } else if (current == QLatin1Char('>') || current == QLatin1Char(')')) { --depth; } if (depth == 0 && current == ch) { return offset + (returnNext ? 1 : 0); } } return -1; } template int startsWith(QStringView str, const std::initializer_list& prefixes) { for (const auto& prefix_ : prefixes) { const auto prefix = QLatin1String(prefix_); if (str.startsWith(prefix)) { return prefix.size(); } } return -1; } QString prettifySymbol(QStringView str) { int pos = 0; do { pos = str.indexOf(QLatin1String("std::"), pos); if (pos == -1) { return str.toString(); } pos += 5; if (pos == 5 || str[pos - 6] == QLatin1Char('<') || str[pos - 6] == QLatin1Char(' ') || str[pos - 6] == QLatin1Char('(')) { break; } } while (true); auto result = str.left(pos).toString(); auto symbol = str.mid(pos); int end; if ((end = startsWith(symbol, {"__cxx11::", "__1::"})) != -1) { // Strip libstdc++/libc++ internal namespace symbol = symbol.mid(end); } const auto oneParameterTemplates = {"vector<", "set<", "deque<", "list<", "forward_list<", "multiset<", "unordered_set<", "unordered_multiset<"}; const auto twoParametersTemplates = {"map<", "multimap<", "unordered_map<", "unordered_multimap<"}; // Translate basic_string<(char|wchar_t|T), ...> to (string|wstring|basic_string) if ((end = startsWith(symbol, {"basic_string<"})) != -1) { const int comma = findSameDepth(symbol, end, QLatin1Char(',')); if (comma != -1) { const auto type = symbol.mid(end, comma - end); if (type == QLatin1String("char")) { result += QLatin1String("string"); } else if (type == QLatin1String("wchar_t")) { result += QLatin1String("wstring"); } else { result += symbol.left(end); result += type; result += QLatin1Char('>'); } end = findSameDepth(symbol, 0, QLatin1Char('>'), true); symbol = symbol.mid(end); // Also translate constructor/destructor name const auto constructorDestructor = {"::basic_string(", "::~basic_string("}; if ((end = startsWith(symbol, constructorDestructor)) != -1) { result += QLatin1String("::"); if (symbol[2] == QLatin1Char('~')) { result += QLatin1Char('~'); } if (type == QLatin1String("wchar_t")) { result += QLatin1Char('w'); } else if (type != QLatin1String("char")) { result += QLatin1String("basic_"); } result += QLatin1String("string("); symbol = symbol.mid(end); } } } // Translates (vector|set|etc.) to (vector|set|etc.) else if ((end = startsWith(symbol, oneParameterTemplates)) != -1) { const int comma = findSameDepth(symbol, end, QLatin1Char(',')); if (comma != -1) { result += symbol.left(end); result += prettifySymbol(symbol.mid(end, comma - end)); result += QLatin1Char('>'); end = findSameDepth(symbol, 0, QLatin1Char('>'), true); symbol = symbol.mid(end); } } // Translates (map|multimap|etc.) to (map|multimap|etc.) else if ((end = startsWith(symbol, twoParametersTemplates)) != -1) { const int comma1 = findSameDepth(symbol, end, QLatin1Char(',')); const int comma2 = findSameDepth(symbol, comma1 + 1, QLatin1Char(',')); if (comma1 != -1 && comma2 != -1) { result += symbol.left(end); result += prettifySymbol(symbol.mid(end, comma1 - end)); result += prettifySymbol(symbol.mid(comma1, comma2 - comma1)); result += QLatin1Char('>'); end = findSameDepth(symbol, 0, QLatin1Char('>'), true); symbol = symbol.mid(end); } } // Translates allocator to allocator<...> else if ((end = startsWith(symbol, {"allocator<"})) != -1) { const int gt = findSameDepth(symbol, 0, QLatin1Char('>'), true); if (gt != -1) { result += symbol.left(end); result += QLatin1String("...>"); symbol = symbol.mid(gt); } } if (!symbol.isEmpty()) { result += prettifySymbol(symbol); } return result; } void buildPerLibrary(const TopDown* node, PerLibraryResults& results, QHash& pathToResultIndex, const Costs& costs) { for (const auto& child : node->children) { const auto path = child.symbol.path; auto resultIndexIt = pathToResultIndex.find(path); if (resultIndexIt == pathToResultIndex.end()) { resultIndexIt = pathToResultIndex.insert(path, pathToResultIndex.size()); PerLibrary library; library.id = *resultIndexIt; library.symbol = Symbol({}, 0, 0, child.symbol.binary, child.symbol.path, child.symbol.actualPath, child.symbol.isKernel); results.root.children.push_back(library); } const auto cost = costs.itemCost(child.id); results.costs.add(*resultIndexIt, cost); buildPerLibrary(&child, results, pathToResultIndex, costs); } } } QString Data::prettifySymbol(const QString& name) { const auto result = ::prettifySymbol(QStringView(name)); return result == name ? name : result; } TopDownResults TopDownResults::fromBottomUp(const BottomUpResults& bottomUpData, bool skipFirstLevel) { TopDownResults results; results.selfCosts.initializeCostsFrom(bottomUpData.costs); results.inclusiveCosts.initializeCostsFrom(bottomUpData.costs); quint32 maxId = 0; if (skipFirstLevel) { results.root.children.reserve(bottomUpData.root.children.size()); for (const auto& bottomUpGroup : bottomUpData.root.children) { // manually copy the first level auto topDownGroup = results.root.entryForSymbol(bottomUpGroup.symbol, &maxId); // then traverse the children as separate trees basically buildTopDownResult(bottomUpGroup, bottomUpData.costs, topDownGroup, &results.inclusiveCosts, &results.selfCosts, &maxId, true); // finally manually sum up the inclusive costs for (const auto& child : std::as_const(topDownGroup->children)) { results.inclusiveCosts.add(topDownGroup->id, results.inclusiveCosts.itemCost(child.id)); } } } else { buildTopDownResult(bottomUpData.root, bottomUpData.costs, &results.root, &results.inclusiveCosts, &results.selfCosts, &maxId, false); } TopDown::initializeParents(&results.root); return results; } PerLibraryResults PerLibraryResults::fromTopDown(const TopDownResults& topDownData) { PerLibraryResults results; QHash pathToResultIndex; results.costs.initializeCostsFrom(topDownData.selfCosts); buildPerLibrary(&topDownData.root, results, pathToResultIndex, topDownData.selfCosts); PerLibrary::initializeParents(&results.root); return results; } void Data::callerCalleesFromBottomUpData(const BottomUpResults& bottomUpData, CallerCalleeResults* results) { results->inclusiveCosts.initializeCostsFrom(bottomUpData.costs); results->selfCosts.initializeCostsFrom(bottomUpData.costs); buildCallerCalleeResult(bottomUpData.root, bottomUpData.costs, results); } QDebug Data::operator<<(QDebug stream, const Symbol& symbol) { stream.noquote().nospace() << "Symbol{" << "symbol=" << symbol.symbol << ", " << "relAddr=" << symbol.relAddr << ", " << "size=" << symbol.size << ", " << "binary=" << symbol.binary << "}"; return stream.resetFormat().space(); } QDebug Data::operator<<(QDebug stream, const FileLine& fileLine) { stream.noquote().nospace() << "FileLine{" << "file=" << fileLine.file << ", " << "line=" << fileLine.line << "}"; return stream.resetFormat().space(); } QDebug Data::operator<<(QDebug stream, const Location& location) { stream.noquote().nospace() << "Location{" << "address=" << location.address << ", " << "relAddr=" << location.relAddr << ", " << "fileLine=" << location.fileLine << "}"; return stream.resetFormat().space(); } QDebug Data::operator<<(QDebug stream, const ItemCost& cost) { stream.noquote().nospace() << "ItemCost(" << cost.size() << "){"; for (auto c : cost) { stream << c << ","; } stream << "}"; return stream.resetFormat().space(); } QDebug Data::operator<<(QDebug stream, const CostSummary& cost) { stream.noquote().nospace() << "CostSummary{" << "label = " << cost.label << ", " << "sampleCount = " << cost.sampleCount << ", " << "totalPeriod = " << cost.totalPeriod << "}"; return stream.resetFormat().space(); } Data::ThreadEvents* Data::EventResults::findThread(qint32 pid, qint32 tid) { for (int i = threads.size() - 1; i >= 0; --i) { auto& thread = threads[i]; if (thread.pid == pid && thread.tid == tid) { return &thread; } } return nullptr; } const Data::ThreadEvents* Data::EventResults::findThread(qint32 pid, qint32 tid) const { return const_cast(this)->findThread(pid, tid); } KDAB-hotspot-41e5de7/src/models/data.h000066400000000000000000000655741515036260400175100ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include #include #include #include #include "../util.h" #include #include #include namespace Data { QString prettifySymbol(const QString& symbol); struct Symbol { Symbol(const QString& symbol = {}, quint64 relAddr = 0, quint64 size = 0, const QString& binary = {}, const QString& path = {}, const QString& actualPath = {}, bool isKernel = false, bool isInline = false) : symbol(symbol) , prettySymbol(Data::prettifySymbol(symbol)) , relAddr(relAddr) , size(size) , binary(binary) , path(path) , actualPath(actualPath) , isKernel(isKernel) , isInline(isInline) { } // function name QString symbol; // prettified function name QString prettySymbol; // relative address quint64 relAddr = 0; // size of frame quint64 size = 0; // dso / executable name QString binary; // path to dso / executable QString path; // actual file path QString actualPath; bool isKernel = false; bool isInline = false; bool operator<(const Symbol& rhs) const { return std::tie(symbol, binary, path) < std::tie(rhs.symbol, rhs.binary, rhs.path); } bool isValid() const { return !symbol.isEmpty() || !binary.isEmpty() || !path.isEmpty(); } bool canDisassemble() const { return !symbol.isEmpty() && !path.isEmpty() && relAddr > 0 && size > 0 && !isInline; } }; QDebug operator<<(QDebug stream, const Symbol& symbol); inline bool operator==(const Symbol& lhs, const Symbol& rhs) { return std::tie(lhs.relAddr, lhs.symbol, lhs.binary, lhs.path) == std::tie(rhs.relAddr, rhs.symbol, rhs.binary, rhs.path); } inline bool operator!=(const Symbol& lhs, const Symbol& rhs) { return !(lhs == rhs); } inline uint qHash(const Symbol& symbol, uint seed = 0) { Util::HashCombine hash; seed = hash(seed, symbol.symbol); seed = hash(seed, symbol.binary); seed = hash(seed, symbol.path); seed = hash(seed, symbol.relAddr); return seed; } struct FileLine { FileLine() = default; FileLine(const QString& file, int line) : file(file) , line(line) { } bool isValid() const { return !file.isEmpty(); } QString toString() const { return file + QLatin1Char(':') + QString::number(line); } QString toShortString() const { auto slashIdx = file.lastIndexOf(QLatin1Char('/')) + 1; return QStringView(file).mid(slashIdx) + QLatin1Char(':') + QString::number(line); } QString file; int line = -1; bool operator<(const FileLine& rhs) const { return std::tie(file, line) < std::tie(rhs.file, rhs.line); } }; QDebug operator<<(QDebug stream, const FileLine& fileLine); inline bool operator==(const FileLine& lhs, const FileLine& rhs) { return std::tie(lhs.file, lhs.line) == std::tie(rhs.file, rhs.line); } inline bool operator!=(const FileLine& lhs, const FileLine& rhs) { return !(lhs == rhs); } inline uint qHash(const FileLine& fileLine, uint seed = 0) { Util::HashCombine hash; seed = hash(seed, fileLine.file); seed = hash(seed, fileLine.line); return seed; } struct Location { Location() = default; Location(quint64 address, quint64 relAddr, FileLine fileLine) : address(address) , relAddr(relAddr) , fileLine(std::move(fileLine)) { } quint64 address = 0; // relative address, might be 0 for locations in the main executable quint64 relAddr = 0; FileLine fileLine; bool operator<(const Location& rhs) const { return std::tie(address, relAddr, fileLine) < std::tie(rhs.address, rhs.relAddr, fileLine); } }; QDebug operator<<(QDebug stream, const Location& location); inline bool operator==(const Location& lhs, const Location& rhs) { return std::tie(lhs.address, lhs.relAddr, lhs.fileLine) == std::tie(rhs.address, rhs.relAddr, rhs.fileLine); } inline bool operator!=(const Location& lhs, const Location& rhs) { return !(lhs == rhs); } inline uint qHash(const Location& location, uint seed = 0) { Util::HashCombine hash; seed = hash(seed, location.address); seed = hash(seed, location.relAddr); seed = hash(seed, location.fileLine); return seed; } struct FrameLocation { FrameLocation(qint32 parentLocationId = -1, const Data::Location& location = {}) : parentLocationId(parentLocationId) , location(location) { } qint32 parentLocationId = -1; Data::Location location; }; class ItemCost { public: ItemCost(std::size_t size = 0) : m_cost(size) { } ItemCost(qint64 value, std::size_t count) : m_cost(value, count) { } ItemCost(std::valarray cost) : m_cost(std::move(cost)) { } void resize(std::size_t newSize, qint64 value = 0) { m_cost.resize(newSize, value); } std::size_t size() const { return m_cost.size(); } ItemCost operator+(const ItemCost& rhs) const { return {m_cost + rhs.m_cost}; } ItemCost operator-(const ItemCost& rhs) const { return {m_cost - rhs.m_cost}; } ItemCost& operator+=(const ItemCost& rhs) { m_cost += rhs.m_cost; return *this; } ItemCost& operator-=(const ItemCost& rhs) { m_cost -= rhs.m_cost; return *this; } qint64& operator[](int index) { if (static_cast(index) >= m_cost.size()) { resize(index + 1); } return m_cost[index]; } qint64 operator[](int index) const { if (static_cast(index) < m_cost.size()) { return m_cost[index]; } return 0; } qint64 sum() const { return m_cost.sum(); } auto begin() const { return std::begin(m_cost); } auto end() const { return std::end(m_cost); } private: std::valarray m_cost; }; QDebug operator<<(QDebug stream, const ItemCost& cost); class Costs { public: enum class Unit { Unknown, Tracepoint, Time }; void increment(int type, quint32 id) { add(type, id, 1); } void add(int type, quint32 id, qint64 delta) { ensureSpaceAvailable(type, id); m_costs[type][id] += delta; } void incrementTotal(int type) { addTotalCost(type, 1); } void addTotalCost(int type, qint64 delta) { m_totalCosts[type] += delta; } void clearTotalCost() { m_totalCosts.fill(0); } int numTypes() const { return m_typeNames.size(); } void addType(int type, const QString& name, Unit unit) { if (m_costs.size() <= type) { m_costs.resize(type + 1); m_typeNames.resize(type + 1); m_totalCosts.resize(type + 1); m_units.resize(type + 1); } m_typeNames[type] = name; m_units[type] = unit; } QString typeName(int type) const { return m_typeNames[type]; } qint64 cost(int type, quint32 id) const { if (static_cast(m_costs[type].size()) > id) { return m_costs[type][id]; } else { return 0; } } qint64 totalCost(int type) const { return m_totalCosts[type]; } QVector totalCosts() const { return m_totalCosts; } void setTotalCosts(const QVector& totalCosts) { m_totalCosts = totalCosts; } ItemCost itemCost(quint32 id) const { ItemCost cost; cost.resize(m_costs.size()); for (int i = 0, c = numTypes(); i < c; ++i) { if (static_cast(m_costs[i].size()) > id) { cost[i] = m_costs[i][id]; } else { cost[i] = 0; } } return cost; } void add(quint32 id, const ItemCost& cost) { Q_ASSERT(cost.size() == static_cast(m_costs.size())); for (int i = 0, c = numTypes(); i < c; ++i) { ensureSpaceAvailable(i, id); m_costs[i][id] += cost[i]; } } void initializeCostsFrom(const Costs& rhs) { m_typeNames = rhs.m_typeNames; m_units = rhs.m_units; m_costs.resize(rhs.m_costs.size()); m_totalCosts = rhs.m_totalCosts; } QString formatCost(int type, quint64 cost) const { return formatCost(m_units[type], cost); } static QString formatCost(Unit unit, quint64 cost) { switch (unit) { case Unit::Time: return Util::formatTimeString(cost); case Unit::Tracepoint: case Unit::Unknown: break; } return Util::formatCost(cost); } Unit unit(int type) const { return m_units[type]; } private: void ensureSpaceAvailable(int type, quint32 id) { while (static_cast(m_costs[type].size()) <= id) { // don't use resize, we don't want to influence the internal auto-sizing m_costs[type].push_back(0); } } QVector m_typeNames; QVector> m_costs; QVector m_totalCosts; QVector m_units; }; template struct Tree { QVector children; const T* parent = nullptr; static void initializeParents(T* tree) { // root has no parent Q_ASSERT(tree->parent == nullptr); // but neither do the top items have a parent. those belong to the "root" above // which has a different address for every model since we use value semantics setParents(&tree->children, nullptr); } private: static void setParents(QVector* children, const T* parent) { for (auto& frame : *children) { frame.parent = parent; setParents(&frame.children, &frame); } } }; template struct SymbolTree : Tree { Symbol symbol; Impl* entryForSymbol(const Symbol& symbol, quint32* maxId) { Impl* ret = nullptr; auto& children = this->children; for (auto row = children.data(), end = row + children.size(); row != end; ++row) { if (row->symbol == symbol) { ret = row; break; } } if (!ret) { Impl frame; frame.symbol = symbol; frame.id = *maxId; *maxId += 1; children.append(frame); ret = &children.last(); } return ret; } const Impl* entryForSymbol(const Symbol& symbol) const { const Impl* ret = nullptr; auto& children = this->children; for (auto row = children.data(), end = row + children.size(); row != end; ++row) { if (row->symbol == symbol) { ret = row; break; } } return ret; } }; struct BottomUp : SymbolTree { quint32 id; }; struct BottomUpResults { BottomUp root; Costs costs; QVector symbols; QVector locations; // callback should return true to continue iteration or false otherwise template void foreachFrame(const QVector& frames, FrameCallback frameCallback) const { for (auto id : frames) { if (!handleFrame(id, frameCallback)) { break; } } } // callback return type is ignored, all frames will be iterated over template const BottomUp* addEvent(int type, quint64 cost, const QVector& frames, const FrameCallback& frameCallback) { costs.addTotalCost(type, cost); auto parent = &root; foreachFrame( frames, [this, type, cost, &parent, &frameCallback](const Data::Symbol& symbol, const Data::Location& location) { parent = parent->entryForSymbol(symbol, &maxBottomUpId); costs.add(type, parent->id, cost); frameCallback(symbol, location); return true; }); return parent; } template const BottomUp* addEvent(const Symbol& rootSymbol, int type, quint64 cost, const QVector& frames, const FrameCallback& frameCallback) { auto parent = root.entryForSymbol(rootSymbol, &maxBottomUpId); // propagate cost to rootSymbol costs.add(type, parent->id, cost); costs.addTotalCost(type, cost); foreachFrame( frames, [this, type, cost, &parent, &frameCallback](const Data::Symbol& symbol, const Data::Location& location) { parent = parent->entryForSymbol(symbol, &maxBottomUpId); costs.add(type, parent->id, cost); frameCallback(symbol, location); return true; }); return parent; } private: quint32 maxBottomUpId = 0; QHash tidToBottomUp; template bool handleFrame(qint32 locationId, FrameCallback frameCallback) const { bool skipNextFrame = false; while (locationId != -1) { const auto& location = locations.value(locationId); if (skipNextFrame) { locationId = location.parentLocationId; skipNextFrame = false; continue; } auto symbol = symbols.value(locationId); if (!symbol.isValid()) { // we get function entry points from the perfparser but // those are imo not interesting - skip them symbol = symbols.value(location.parentLocationId); skipNextFrame = true; } if (!frameCallback(symbol, location.location)) { return false; } locationId = location.parentLocationId; } return true; } }; struct TopDown : SymbolTree { quint32 id; }; struct TopDownResults { TopDown root; Costs selfCosts; Costs inclusiveCosts; static TopDownResults fromBottomUp(const Data::BottomUpResults& bottomUpData, bool skipFirstLevel); }; struct PerLibrary : SymbolTree { quint32 id = 0; }; struct PerLibraryResults { PerLibrary root; Costs costs; static PerLibraryResults fromTopDown(const TopDownResults& topDownData); }; struct FrequencyData { quint64 time = 0; double cost = 0; }; struct PerCostFrequencyData { QString costName; QVector values; }; struct PerCoreFrequencyData { QVector costs; }; struct FrequencyResults { QVector cores; }; using SymbolCostMap = QHash; using CalleeMap = SymbolCostMap; using CallerMap = SymbolCostMap; struct LocationCost { LocationCost(int numTypes = 0) : selfCost(numTypes) , inclusiveCost(numTypes) { } ItemCost selfCost; ItemCost inclusiveCost; }; using SourceLocationCostMap = QHash; using OffsetLocationCostMap = QHash; inline LocationCost& source(SourceLocationCostMap& sourceMap, const FileLine& fileLine, int numTypes) { auto it = sourceMap.find(fileLine); if (it == sourceMap.end()) { it = sourceMap.insert(fileLine, {numTypes}); } else if (it->inclusiveCost.size() < static_cast(numTypes)) { it->inclusiveCost.resize(numTypes); it->selfCost.resize(numTypes); } return *it; } struct CallerCalleeEntry { quint32 id = 0; LocationCost& source(const FileLine& fileLine, int numTypes) { return Data::source(sourceMap, fileLine, numTypes); } ItemCost& callee(const Symbol& symbol, int numTypes) { auto it = callees.find(symbol); if (it == callees.end()) { it = callees.insert(symbol, ItemCost(numTypes)); } return *it; } ItemCost& caller(const Symbol& symbol, int numTypes) { auto it = callers.find(symbol); if (it == callers.end()) { it = callers.insert(symbol, ItemCost(numTypes)); } return *it; } // callers, i.e. other symbols and locations that called this symbol CallerMap callers; // callees, i.e. symbols being called from this symbol CalleeMap callees; // source map for this symbol, i.e. locations mapped to associated costs SourceLocationCostMap sourceMap; }; using CallerCalleeEntryMap = QHash; struct CallerCalleeResults { CallerCalleeEntryMap entries; // per-binary map of per-IP (relAddr) map for disassembly QHash binaryOffsetMap; Costs selfCosts; Costs inclusiveCosts; CallerCalleeEntry& entry(const Symbol& symbol) { auto it = entries.find(symbol); if (it == entries.end()) { it = entries.insert(symbol, {}); it->id = entries.size() - 1; } return *it; } LocationCost& binaryOffset(const QString& binary, quint64 addr, int numTypes) { auto binaryIt = binaryOffsetMap.find(binary); if (binaryIt == binaryOffsetMap.end()) { binaryIt = binaryOffsetMap.insert(binary, {}); } auto it = binaryIt->find(addr); if (it == binaryIt->end()) { it = binaryIt->insert(addr, {numTypes}); } else if (it->inclusiveCost.size() < static_cast(numTypes)) { it->inclusiveCost.resize(numTypes); it->selfCost.resize(numTypes); } return *it; } }; void callerCalleesFromBottomUpData(const BottomUpResults& data, CallerCalleeResults* results); struct ByFileEntry { quint32 id = 0; LocationCost& source(const FileLine& fileLine, int numTypes) { return Data::source(sourceMap, fileLine, numTypes); } // source map for this file, i.e. locations mapped to associated costs SourceLocationCostMap sourceMap; }; using ByFileEntryMap = QHash; struct ByFileResults { ByFileEntryMap entries; Costs selfCosts; Costs inclusiveCosts; ByFileEntry& entry(const QString& file) { auto fileIt = entries.find(file); if (fileIt == entries.end()) { fileIt = entries.insert(file, {}); fileIt->id = entries.size() - 1; } return *fileIt; } }; const constexpr auto INVALID_CPU_ID = std::numeric_limits::max(); const constexpr int INVALID_TID = -1; const constexpr int INVALID_PID = -1; struct Event { quint64 time = 0; quint64 cost = 0; qint32 type = -1; qint32 stackId = -1; quint32 cpuId = INVALID_CPU_ID; bool operator==(const Event& rhs) const { return std::tie(time, cost, type, stackId, cpuId) == std::tie(rhs.time, rhs.cost, rhs.type, rhs.stackId, rhs.cpuId); } }; using Events = QVector; struct TimeRange { constexpr TimeRange() = default; constexpr TimeRange(quint64 start, quint64 end) : start(start) , end(end) { } quint64 start = 0; quint64 end = 0; bool isValid() const { return start > 0 || end > 0; } bool isEmpty() const { return start == end; } quint64 delta() const { return end - start; } bool contains(quint64 time) const { return time >= start && time <= end; } TimeRange normalized() const { if (end < start) return {end, start}; return *this; } bool operator==(TimeRange rhs) const { return std::tie(start, end) == std::tie(rhs.start, rhs.end); } bool operator!=(TimeRange rhs) const { return !operator==(rhs); } }; const constexpr auto MAX_TIME = std::numeric_limits::max(); const constexpr auto MAX_TIME_RANGE = TimeRange {0, MAX_TIME}; struct ThreadEvents { qint32 pid = INVALID_PID; qint32 tid = INVALID_TID; TimeRange time = MAX_TIME_RANGE; Events events; QString name; quint64 lastSwitchTime = MAX_TIME; quint64 offCpuTime = 0; enum State { Unknown, OnCpu, OffCpu }; State state = Unknown; bool operator==(const ThreadEvents& rhs) const { return std::tie(pid, tid, time, events, name, lastSwitchTime, offCpuTime, state) == std::tie(rhs.pid, rhs.tid, rhs.time, rhs.events, rhs.name, rhs.lastSwitchTime, rhs.offCpuTime, rhs.state); } }; struct CpuEvents { quint32 cpuId = INVALID_CPU_ID; QVector events; bool operator==(const CpuEvents& rhs) const { return std::tie(cpuId, events) == std::tie(rhs.cpuId, rhs.events); } }; struct CostSummary { CostSummary() = default; CostSummary(const QString& label, quint64 sampleCount, quint64 totalPeriod, Costs::Unit unit) : label(label) , sampleCount(sampleCount) , totalPeriod(totalPeriod) , unit(unit) { } QString label; quint64 sampleCount = 0; quint64 totalPeriod = 0; Costs::Unit unit = Costs::Unit::Unknown; bool operator==(const CostSummary& rhs) const { return std::tie(label, sampleCount, totalPeriod) == std::tie(rhs.label, rhs.sampleCount, rhs.totalPeriod); } }; QDebug operator<<(QDebug stream, const CostSummary& symbol); struct Summary { TimeRange applicationTime; quint32 threadCount = 0; quint32 processCount = 0; QString command; quint64 lostChunks = 0; quint64 lostEvents = 0; QString hostName; QString linuxKernelVersion; QString perfVersion; QString cpuDescription; QString cpuId; QString cpuArchitecture; quint32 cpusOnline = 0; quint32 cpusAvailable = 0; QString cpuSiblingCores; QString cpuSiblingThreads; quint64 totalMemoryInKiB = 0; // only non-zero when perf record --switch-events was used quint64 onCpuTime = 0; quint64 offCpuTime = 0; // total number of samples quint64 sampleCount = 0; QVector costs; QStringList errors; }; struct ThreadNames { QHash> names; }; struct EventResults { QVector threads; QVector cpus; QVector> stacks; QVector totalCosts; qint32 offCpuTimeCostId = -1; qint32 lostEventCostId = -1; ThreadEvents* findThread(qint32 pid, qint32 tid); const ThreadEvents* findThread(qint32 pid, qint32 tid) const; bool operator==(const EventResults& rhs) const { return std::tie(threads, cpus, stacks, totalCosts, offCpuTimeCostId) == std::tie(rhs.threads, rhs.cpus, rhs.stacks, rhs.totalCosts, rhs.offCpuTimeCostId); } }; struct Tracepoint { quint64 time = 0; QString name; }; struct TracepointResults { QVector tracepoints; }; struct FilterAction { TimeRange time; qint32 processId = INVALID_PID; qint32 threadId = INVALID_PID; quint32 cpuId = INVALID_CPU_ID; QVector excludeProcessIds; QVector excludeThreadIds; QVector excludeCpuIds; QSet includeSymbols; QSet excludeSymbols; QSet includeBinaries; QSet excludeBinaries; bool isValid() const { return time.isValid() || processId != INVALID_PID || threadId != INVALID_PID || cpuId != INVALID_CPU_ID || !excludeProcessIds.isEmpty() || !excludeThreadIds.isEmpty() || !excludeCpuIds.isEmpty() || !includeSymbols.isEmpty() || !excludeSymbols.isEmpty() || !includeBinaries.isEmpty() || !excludeBinaries.isEmpty(); } }; struct ZoomAction { TimeRange time; bool isValid() const { return time.isValid(); } }; } Q_DECLARE_METATYPE(Data::Symbol) Q_DECLARE_TYPEINFO(Data::Symbol, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::FileLine) Q_DECLARE_TYPEINFO(Data::FileLine, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::Location) Q_DECLARE_TYPEINFO(Data::Location, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::FrameLocation) Q_DECLARE_TYPEINFO(Data::FrameLocation, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::BottomUp) Q_DECLARE_TYPEINFO(Data::BottomUp, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::ItemCost) Q_DECLARE_METATYPE(Data::CallerMap) Q_DECLARE_METATYPE(Data::SourceLocationCostMap) Q_DECLARE_METATYPE(Data::OffsetLocationCostMap) Q_DECLARE_METATYPE(Data::Costs) Q_DECLARE_METATYPE(Data::TopDown) Q_DECLARE_TYPEINFO(Data::TopDown, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::CallerCalleeEntry) Q_DECLARE_TYPEINFO(Data::CallerCalleeEntry, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::ByFileEntry) Q_DECLARE_TYPEINFO(Data::ByFileEntry, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::BottomUpResults) Q_DECLARE_TYPEINFO(Data::BottomUpResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::TopDownResults) Q_DECLARE_TYPEINFO(Data::TopDownResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::PerLibraryResults) Q_DECLARE_TYPEINFO(Data::PerLibraryResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::CallerCalleeResults) Q_DECLARE_TYPEINFO(Data::CallerCalleeResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::ByFileResults) Q_DECLARE_TYPEINFO(Data::ByFileResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::Event) Q_DECLARE_TYPEINFO(Data::Event, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::FrequencyData) Q_DECLARE_TYPEINFO(Data::FrequencyData, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::PerCostFrequencyData) Q_DECLARE_TYPEINFO(Data::PerCostFrequencyData, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::PerCoreFrequencyData) Q_DECLARE_TYPEINFO(Data::PerCoreFrequencyData, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::FrequencyResults) Q_DECLARE_TYPEINFO(Data::FrequencyResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::ThreadEvents) Q_DECLARE_TYPEINFO(Data::ThreadEvents, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::CpuEvents) Q_DECLARE_TYPEINFO(Data::CpuEvents, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::Summary) Q_DECLARE_TYPEINFO(Data::Summary, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::CostSummary) Q_DECLARE_TYPEINFO(Data::CostSummary, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::ThreadNames) Q_DECLARE_TYPEINFO(Data::ThreadNames, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::EventResults) Q_DECLARE_TYPEINFO(Data::EventResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::Tracepoint) Q_DECLARE_TYPEINFO(Data::Tracepoint, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::TracepointResults) Q_DECLARE_TYPEINFO(Data::TracepointResults, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(Data::TimeRange) Q_DECLARE_TYPEINFO(Data::TimeRange, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(Data::FilterAction, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(Data::ZoomAction, Q_MOVABLE_TYPE); KDAB-hotspot-41e5de7/src/models/disassemblymodel.cpp000066400000000000000000000217621515036260400224610ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Darya Knysh SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "disassemblymodel.h" #include "search.h" #include "sourcecodemodel.h" DisassemblyModel::DisassemblyModel(KSyntaxHighlighting::Repository* repository, QObject* parent) : QAbstractTableModel(parent) , m_highlightedText(repository) { } DisassemblyModel::~DisassemblyModel() = default; void DisassemblyModel::clear() { beginResetModel(); m_data = {}; m_offsetMap = {}; endResetModel(); } QModelIndex DisassemblyModel::findIndexWithOffset(int offset) { const auto address = m_data.disassemblyLines[0].addr + offset; const auto& found = std::find_if(m_data.disassemblyLines.begin(), m_data.disassemblyLines.end(), [address](const DisassemblyOutput::DisassemblyLine& line) { return line.addr == address; }); if (found != m_data.disassemblyLines.end()) { return createIndex(std::distance(m_data.disassemblyLines.begin(), found), DisassemblyColumn); } return {}; } void DisassemblyModel::setDisassembly(const DisassemblyOutput& disassemblyOutput, const Data::CallerCalleeResults& results) { beginResetModel(); m_data = disassemblyOutput; m_results = results; m_offsetMap = m_results.binaryOffsetMap[m_data.symbol.binary]; m_numTypes = results.selfCosts.numTypes(); QStringList assemblyLines; assemblyLines.reserve(disassemblyOutput.disassemblyLines.size()); std::transform(disassemblyOutput.disassemblyLines.cbegin(), disassemblyOutput.disassemblyLines.cend(), std::back_inserter(assemblyLines), [](const DisassemblyOutput::DisassemblyLine& line) { return line.disassembly; }); m_highlightedText.setText(assemblyLines); endResetModel(); } QVariant DisassemblyModel::headerData(int section, Qt::Orientation orientation, int role) const { if (section < 0 || section >= m_numTypes + COLUMN_COUNT) return {}; if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return {}; if (section == AddrColumn) return tr("Address"); else if (section == BranchColumn) return tr("Branches"); else if (section == HexdumpColumn) return tr("Hexdump"); else if (section == DisassemblyColumn) return tr("Assembly / Disassembly"); if (section - COLUMN_COUNT <= m_numTypes) return m_results.selfCosts.typeName(section - COLUMN_COUNT); return {}; } QVariant DisassemblyModel::data(const QModelIndex& index, int role) const { if (!hasIndex(index.row(), index.column(), index.parent())) return {}; if (index.row() >= m_data.disassemblyLines.count() || index.row() < 0) return {}; if (role == Qt::FontRole) { if (index.column() < COLUMN_COUNT) return QFontDatabase::systemFont(QFontDatabase::FixedFont); return {}; } else if (role == Qt::TextAlignmentRole) { if (index.column() == AddrColumn) return static_cast(Qt::AlignRight | Qt::AlignVCenter); return static_cast(Qt::AlignLeft | Qt::AlignVCenter); } const auto& data = m_data.disassemblyLines.at(index.row()); const auto& line = m_highlightedText.textAt(index.row()); if (role == AddrRole) return data.addr; if (role == Qt::DisplayRole || role == CostRole || role == TotalCostRole || role == SyntaxHighlightRole || role == Qt::ToolTipRole) { if (role != Qt::ToolTipRole) { if (index.column() == AddrColumn) { if (!data.addr) return {}; return QString::number(data.addr, 16); } else if (index.column() == BranchColumn) { return data.branchVisualisation; } else if (index.column() == HexdumpColumn) { return data.hexdump; } else if (index.column() == DisassemblyColumn) { if (role == SyntaxHighlightRole) { return QVariant::fromValue(m_highlightedText.lineAt(index.row())); } return m_highlightedText.textAt(index.row()); } } if (data.addr == 0) { return {}; } auto it = m_offsetMap.find(data.addr); if (it != m_offsetMap.end()) { const auto event = index.column() - COLUMN_COUNT; const auto& locationCost = it.value(); if (role == Qt::ToolTipRole) { auto tooltip = tr("addr: %1
    assembly: %2
    disassembly: %3") .arg(QString::number(data.addr, 16), line); return Util::formatTooltip(tooltip, locationCost, m_results.selfCosts); } if (event < 0) return {}; const auto& costLine = locationCost.selfCost[event]; const auto totalCost = m_results.selfCosts.totalCost(event); if (role == CostRole) { return costLine; } else if (role == TotalCostRole) { return totalCost; } else if (!costLine) return {}; return Util::formatCostRelative(costLine, totalCost, true); } else { if (role == Qt::ToolTipRole) { return tr("%1
    No samples at this location.
    ").arg(line.toHtmlEscaped()); } else return QString(); } } else if (role == DisassemblyModel::HighlightRole) { return data.fileLine.line == m_highlightLine; } else if (role == LinkedFunctionNameRole) { return data.linkedFunction.name; } else if (role == LinkedFunctionOffsetRole) { return data.linkedFunction.offset; } else if (role == RainbowLineNumberRole && data.addr) { return data.fileLine.line; } return {}; } QSize DisassemblyModel::span(const QModelIndex& index) const { if (!hasIndex(index.row(), index.column(), index.parent())) return {}; if (index.row() >= m_data.disassemblyLines.count() || index.row() < 0) return {}; const auto& data = m_data.disassemblyLines.at(index.row()); if (data.addr == 0) return {columnCount(), 1}; return {1, 1}; } int DisassemblyModel::columnCount(const QModelIndex& parent) const { return parent.isValid() ? 0 : COLUMN_COUNT + m_numTypes; } int DisassemblyModel::rowCount(const QModelIndex& parent) const { return parent.isValid() ? 0 : m_data.disassemblyLines.count(); } void DisassemblyModel::updateHighlighting(int line) { m_highlightLine = line; emit dataChanged(createIndex(0, Columns::DisassemblyColumn), createIndex(rowCount(), Columns::DisassemblyColumn)); } Data::FileLine DisassemblyModel::fileLineForIndex(const QModelIndex& index) const { return m_data.disassemblyLines[index.row()].fileLine; } QModelIndex DisassemblyModel::indexForFileLine(const Data::FileLine& fileLine) const { int i = -1; int bestMatch = -1; qint64 bestCost = 0; const auto entry = m_results.entries.value(m_data.symbol); for (const auto& line : m_data.disassemblyLines) { ++i; if (line.fileLine != fileLine) { continue; } if (bestMatch == -1) { bestMatch = i; } auto it = m_offsetMap.find(line.addr); if (it != m_offsetMap.end()) { const auto& locationCost = it.value(); if (!bestCost || bestCost < locationCost.selfCost[0]) { bestMatch = i; bestCost = locationCost.selfCost[0]; } } } if (bestMatch == -1) return {}; return index(bestMatch, 0); } void DisassemblyModel::find(const QString& search, Direction direction, int current) { auto searchFunc = [&search](const DisassemblyOutput::DisassemblyLine& line) { return line.disassembly.indexOf(search, 0, Qt::CaseInsensitive) != -1; }; auto endReached = [this] { emit searchEndReached(); }; const int resultIndex = ::search(m_data.disassemblyLines.cbegin(), m_data.disassemblyLines.cend(), current, direction, searchFunc, endReached); if (resultIndex >= 0) { emit resultFound(createIndex(resultIndex, DisassemblyColumn)); } else { emit resultFound({}); } } void DisassemblyModel::scrollToLine(const QString& lineNumber) { bool ok = false; auto addr = lineNumber.toULongLong(&ok, 16); if (!ok) { emit resultFound({}); return; } auto lineFound = std::find_if(m_data.disassemblyLines.cbegin(), m_data.disassemblyLines.cend(), [addr](const DisassemblyOutput::DisassemblyLine& line) { return line.addr == addr; }); if (lineFound != m_data.disassemblyLines.cend()) { emit resultFound(index(std::distance(m_data.disassemblyLines.cbegin(), lineFound), 0)); } } KDAB-hotspot-41e5de7/src/models/disassemblymodel.h000066400000000000000000000046221515036260400221220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Darya Knysh SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include "data.h" #include "disassemblyoutput.h" #include "highlightedtext.h" namespace KSyntaxHighlighting { class Definition; class Repository; } enum class Direction; class DisassemblyModel : public QAbstractTableModel { Q_OBJECT public: explicit DisassemblyModel(KSyntaxHighlighting::Repository* repository, QObject* parent = nullptr); ~DisassemblyModel() override; void setDisassembly(const DisassemblyOutput& disassemblyOutput, const Data::CallerCalleeResults& results); void clear(); QModelIndex findIndexWithOffset(int offset); int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QSize span(const QModelIndex& index) const override; Data::FileLine fileLineForIndex(const QModelIndex& index) const; QModelIndex indexForFileLine(const Data::FileLine& line) const; HighlightedText* highlightedText() { return &m_highlightedText; } enum Columns { AddrColumn, BranchColumn, HexdumpColumn, DisassemblyColumn, COLUMN_COUNT }; enum CustomRoles { CostRole = Qt::UserRole, TotalCostRole = Qt::UserRole + 1, HighlightRole, AddrRole, LinkedFunctionNameRole, LinkedFunctionOffsetRole, RainbowLineNumberRole, SyntaxHighlightRole, }; signals: void resultFound(const QModelIndex& index); void searchEndReached(); public slots: void updateHighlighting(int line); void find(const QString& search, Direction direction, int offset); void scrollToLine(const QString& lineNumber); private: HighlightedText m_highlightedText; DisassemblyOutput m_data; Data::CallerCalleeResults m_results; Data::OffsetLocationCostMap m_offsetMap; int m_numTypes = 0; int m_highlightLine = 0; }; KDAB-hotspot-41e5de7/src/models/disassemblyoutput.cpp000066400000000000000000000361161515036260400227200ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Darya Knysh SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "disassemblyoutput.h" #include "data.h" #include #include #include #include #include #include #include #include "formattingutils.h" namespace { Q_LOGGING_CATEGORY(disassemblyoutput, "hotspot.disassemblyoutput") QByteArray objdumpHelp(const QString& objdump) { QProcess process; process.setProcessChannelMode(QProcess::ForwardedErrorChannel); process.start(objdump, {QStringLiteral("-H")}); if (!process.waitForFinished(1000)) { qCWarning(disassemblyoutput) << "failed to query objdump help output:" << objdump << process.errorString(); return {}; } return process.readAllStandardOutput(); } bool canVisualizeJumps(const QString& objdump) { return objdumpHelp(objdump).contains("--visualize-jumps"); } bool canUseSyntaxHighlighting(const QString& objdump) { return objdumpHelp(objdump).contains("--disassembler-color"); } DisassemblyOutput::LinkedFunction extractLinkedFunction(const QString& disassemblyWithAnsi) { DisassemblyOutput::LinkedFunction function = {}; const auto disassembly = disassemblyWithAnsi.contains(Util::escapeChar) ? Util::removeAnsi(disassemblyWithAnsi) : disassemblyWithAnsi; const auto leftBracketIndex = disassembly.indexOf(QLatin1Char('<')); const auto rightBracketIndex = disassembly.indexOf(QLatin1Char('>')); if (leftBracketIndex != -1 && rightBracketIndex != -1) { if (leftBracketIndex < rightBracketIndex) { function.name = disassembly.mid(leftBracketIndex + 1, rightBracketIndex - leftBracketIndex - 1); const auto atindex = function.name.indexOf(QLatin1Char('@')); if (atindex > 0) { function.name = function.name.left(atindex); } const auto plusIndex = function.name.indexOf(QLatin1Char('+')); if (plusIndex > 0) { bool ok; // ignore 0x in offset const auto& offsetStr = function.name.mid(plusIndex + 3); function.name = function.name.left(plusIndex); auto offset = offsetStr.toInt(&ok, 16); if (ok) { function.offset = offset; } } } } return function; } QString findInSubdirRecursive(const QString& path, const QString& filename) { // find filename in path // some distros (Ubuntu) use subdirs to store their debug files auto filepath = QString(path + QDir::separator() + filename); if (QFileInfo::exists(filepath)) { return filepath; } QDirIterator it(path, {filename}, QDir::NoFilter, QDirIterator::Subdirectories); if (it.hasNext()) { return it.next(); } return {}; } QString findBinaryForSymbol(const QStringList& debugPaths, const QStringList& extraLibPaths, const Data::Symbol& symbol) { // file in .debug if (QFileInfo::exists(symbol.actualPath)) { return symbol.actualPath; } auto findBinary = [](const QStringList& paths, const QString& binary) -> QString { for (const auto& path : paths) { auto result = findInSubdirRecursive(path, binary); if (!result.isEmpty()) { return result; } } return {}; }; auto result = findBinary(debugPaths, symbol.binary); if (!result.isEmpty()) return result; result = findBinary(extraLibPaths, symbol.binary); if (!result.isEmpty()) return result; // disassemble the binary if no debug file was found if (QFileInfo::exists(symbol.path)) { return symbol.path; } return {}; } bool isHexCharacter(QChar c) { return (c >= QLatin1Char('0') && c <= QLatin1Char('9')) || (c >= QLatin1Char('a') && c <= QLatin1Char('f')); } } // not in an anonymous namespace so we can test this QString findSourceCodeFile(const QString& originalPath, const QStringList& sourceCodePaths, const QString& sysroot) { if (QFile::exists(originalPath)) { return originalPath; } QString sysrootPath = sysroot + QDir::separator() + originalPath; if (QFile::exists(sysrootPath)) { return sysrootPath; } for (const auto& sourcePath : sourceCodePaths) { for (auto it = originalPath.begin(); it != originalPath.end(); it = std::find(++it, originalPath.end(), QDir::separator())) { const auto path = QString(sourcePath + QDir::separator() + QString(it, std::distance(it, originalPath.end()))); const auto info = QFileInfo(path); if (info.exists()) { return info.canonicalFilePath(); } } } return originalPath; // fallback } DisassemblyOutput::ObjectdumpOutput DisassemblyOutput::objdumpParse(const QByteArray& output) { QVector disassemblyLines; QTextStream stream(output); QString asmLine; QString sourceFileName; QString currentSourceFileName; int sourceCodeLine = -1; while (stream.readLineInto(&asmLine)) { if (asmLine.isEmpty()) continue; if (asmLine.startsWith(QLatin1String("Disassembly"))) { // when the binary is given with an absolute path, we don't want to interpret // that as a source file, so clear it once we get to the Disassembly part sourceFileName.clear(); continue; } // skip lines like these: 0000000000001265
    : const int colonIndex = asmLine.indexOf(QLatin1Char(':')); const int angleBracketIndex = asmLine.indexOf(QLatin1Char('<')); if (angleBracketIndex > 0 && colonIndex > angleBracketIndex) { // -l add a line like: // main(): // after 0000000000001090
    : stream.readLine(); continue; } // we don't care about the file name if (asmLine.startsWith(QLatin1Char('/')) && asmLine.contains(QStringLiteral("file format"))) { continue; } else if (asmLine.startsWith(QLatin1Char('/')) || asmLine.startsWith(QLatin1Char('.'))) { // extract source code line info // these look like this: // - /usr/include/c++/11.2.0/bits/stl_tree.h:2083 (discriminator 1) // - /usr/include/c++/11.2.0/bits/stl_tree.h:3452 // - ././test.cpp currentSourceFileName = asmLine.left(colonIndex); if (sourceFileName.isEmpty()) { sourceFileName = currentSourceFileName; } auto lineNumber = QStringView(asmLine).right(asmLine.length() - colonIndex - 1); const auto spaceIndex = lineNumber.indexOf(QLatin1Char(' ')); if (spaceIndex != -1) { lineNumber = lineNumber.left(spaceIndex); } bool ok = false; const auto number = lineNumber.toInt(&ok); if (ok) { sourceCodeLine = number; } continue; } // a line looks like this: // [spaces]addr:\t [branch visualization] [hexdump]\tdiassembly // we can simplify parsing by splitting it into three parts auto firstTab = asmLine.indexOf(QLatin1Char('\t')); if (firstTab == -1) { firstTab = asmLine.length(); } auto secondTab = asmLine.indexOf(QLatin1Char('\t'), firstTab + 1); if (secondTab == -1) { secondTab = asmLine.length(); } if (firstTab == -1 && asmLine.endsWith(QLatin1Char(':'))) { // we got a line like: // std::__cxx11::basic_string, std::allocator >::_M_local_data(): // pass them to the disassembler since this can be used for inlining disassemblyLines.push_back({0, asmLine, {}, {}, {}, {currentSourceFileName, sourceCodeLine}}); continue; } const auto addr = [addrString = QStringView(asmLine).mid(0, firstTab).trimmed(), &asmLine]() -> uint64_t { const auto suffix = QLatin1Char(':'); if (!addrString.endsWith(suffix)) return 0; bool ok = false; auto ret = addrString.left(addrString.length() - 1).toULongLong(&ok, 16); if (!ok) { qCWarning(disassemblyoutput) << "unhandled asm line format:" << asmLine; return 0; } return ret; }(); // format is the following: // /- a5 54 12 ... // | 64 a3 .... // \-> 65 23 .... // so we can simply skip all characters until we meet a letter or a number struct BranchesAndHexdump { QString branchVisualisation; QString hexdump; }; const auto [branchVisualisation, hexdump] = [branchesAndHex = asmLine.mid(firstTab + 1, secondTab - firstTab - 1)]() -> BranchesAndHexdump { auto firstHexIt = std::find_if(branchesAndHex.cbegin(), branchesAndHex.cend(), isHexCharacter); auto size = std::distance(branchesAndHex.cbegin(), firstHexIt); auto branchVisualisation = branchesAndHex.mid(0, size); auto hexdump = branchesAndHex.mid(size); return {branchVisualisation, hexdump.trimmed()}; }(); disassemblyLines.push_back({addr, asmLine.mid(secondTab + 1).trimmed(), branchVisualisation, hexdump, extractLinkedFunction(asmLine), {currentSourceFileName, sourceCodeLine}}); } return {disassemblyLines, sourceFileName}; } DisassemblyOutput DisassemblyOutput::disassemble(const QString& objdump, const QString& arch, const QStringList& debugPaths, const QStringList& extraLibPaths, const QStringList& sourceCodePaths, const QString& sysroot, const Data::Symbol& symbol) { DisassemblyOutput disassemblyOutput; disassemblyOutput.symbol = symbol; if (symbol.symbol.isEmpty()) { disassemblyOutput.errorMessage = QApplication::translate("DisassemblyOutput", "Empty symbol " "??" // note: using string concatenation to prevent -Wtrigraph " is selected."); return disassemblyOutput; } if (symbol.relAddr == 0 || symbol.size == 0) { disassemblyOutput.errorMessage = QApplication::translate("DisassemblyOutput", "Symbol %1 with unknown details is selected.") .arg(symbol.symbol); return disassemblyOutput; } auto findObjdump = [](const QString& objdump) { if (!objdump.isEmpty() && QFile::exists(objdump)) return objdump; return QStandardPaths::findExecutable(objdump); }; const auto processPath = findObjdump(objdump); if (processPath.isEmpty()) { disassemblyOutput.errorMessage = QApplication::translate("DisassemblyOutput", "Cannot find objdump process %1, please install " "the missing binutils package for arch %2.") .arg(objdump, arch); return disassemblyOutput; } // NOTE: make sure to declare `output` before `asmProcess`, as when the latter gets destroyed it might // emit `readyRead` which then needs to access `output`, see also: // https://github.com/KDAB/hotspot/issues/542 QByteArray output; QProcess asmProcess; QObject::connect(&asmProcess, &QProcess::readyRead, [&asmProcess, &disassemblyOutput, &output]() { output += asmProcess.readAllStandardOutput(); disassemblyOutput.errorMessage += QString::fromStdString(asmProcess.readAllStandardError().toStdString()); }); // Call objdump with arguments: addresses range and binary file auto toHex = [](quint64 addr) -> QString { return QLatin1String("0x") + QString::number(addr, 16); }; auto arguments = QStringList {QStringLiteral("-d"), // disassemble QStringLiteral("-l"), // include source code lines QStringLiteral("-C"), // demangle names QStringLiteral("--start-address"), toHex(symbol.relAddr), QStringLiteral("--stop-address"), toHex(symbol.relAddr + symbol.size)}; // only available for objdump 2.34+ if (canVisualizeJumps(processPath)) arguments.append(QStringLiteral("--visualize-jumps")); else qCInfo(disassemblyoutput) << "objdump binary does not support `--visualize-jumps`:" << processPath; if (canUseSyntaxHighlighting(processPath)) { arguments.append(QStringLiteral("--disassembler-color=color")); } else { qCInfo(disassemblyoutput) << "objdump binary does not support `--disassembler-color`:" << processPath; } auto binary = findBinaryForSymbol(debugPaths, extraLibPaths, symbol); if (binary.isEmpty()) { disassemblyOutput.errorMessage += QApplication::translate("DisassemblyOutput", "Could not find binary %1.").arg(symbol.binary); return disassemblyOutput; } arguments.append(binary); asmProcess.start(processPath, arguments); if (!asmProcess.waitForStarted()) { disassemblyOutput.errorMessage += QApplication::translate("DisassemblyOutput", "Process failed to start: %1 %2 returned %3.") .arg(processPath, arguments.join(QLatin1Char(' ')), asmProcess.errorString()); return disassemblyOutput; } if (!asmProcess.waitForFinished()) { disassemblyOutput.errorMessage += QApplication::translate("DisassemblyOutput", "Process not finished: %1 %2, stopped by timeout.") .arg(processPath, arguments.join(QLatin1Char(' '))); return disassemblyOutput; } if (output.isEmpty()) { disassemblyOutput.errorMessage += QApplication::translate("DisassemblyOutput", "Empty output of command %1 %2.") .arg(processPath, arguments.join(QLatin1Char(' '))); } const auto objdumpOutput = objdumpParse(output); disassemblyOutput.disassemblyLines = objdumpOutput.disassemblyLines; disassemblyOutput.mainSourceFileName = objdumpOutput.mainSourceFileName; disassemblyOutput.realSourceFileName = findSourceCodeFile(objdumpOutput.mainSourceFileName, sourceCodePaths, sysroot); return disassemblyOutput; } KDAB-hotspot-41e5de7/src/models/disassemblyoutput.h000066400000000000000000000036631515036260400223660ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Darya Knysh SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "data.h" struct DisassemblyOutput { struct LinkedFunction { QString name; int offset = 0; // offset from the entrypoint of the function }; struct DisassemblyLine { quint64 addr = 0; QString disassembly; QString branchVisualisation; QString hexdump; LinkedFunction linkedFunction; Data::FileLine fileLine; }; QVector disassemblyLines; quint64 baseAddress = 0; // due to inlining there can be multiple source files encountered in the disassembly lines above // this is the file referenced in the debug infos QString mainSourceFileName; // if the source file is moved this contains the path to the existing file QString realSourceFileName; Data::Symbol symbol; QString errorMessage; explicit operator bool() const { return errorMessage.isEmpty(); } struct ObjectdumpOutput { QVector disassemblyLines; QString mainSourceFileName; }; static ObjectdumpOutput objdumpParse(const QByteArray& objdumpOutput); static DisassemblyOutput disassemble(const QString& objdump, const QString& arch, const QStringList& debugPaths, const QStringList& extraLibPaths, const QStringList& sourceCodePaths, const QString& sysroot, const Data::Symbol& symbol); }; QString findSourceCodeFile(const QString& originalPath, const QStringList& sourceCodePaths, const QString& sysroot); Q_DECLARE_TYPEINFO(DisassemblyOutput::DisassemblyLine, Q_MOVABLE_TYPE); KDAB-hotspot-41e5de7/src/models/eventmodel.cpp000066400000000000000000000331671515036260400212650ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "eventmodel.h" #include "../util.h" #include #include namespace { constexpr auto orderProcessByPid = [](const EventModel::Process& process, qint32 pid) { return process.pid < pid; }; enum class Tag : quint8 { Invalid = 0, Root = 1, Overview = 2, Cpus = 3, Processes = 4, Threads = 5 }; const auto DATATAG_SHIFT = sizeof(Tag) * 8; const auto DATATAG_UNSHIFT = (sizeof(quintptr) - sizeof(Tag)) * 8; quintptr combineDataTag(Tag tag, quintptr data) { return data << DATATAG_SHIFT | static_cast(tag); } Tag dataTag(quintptr internalId) { auto ret = (internalId << DATATAG_UNSHIFT) >> DATATAG_UNSHIFT; if (ret > static_cast(Tag::Threads)) return Tag::Invalid; return static_cast(ret); } Tag dataTag(const QModelIndex& idx) { if (!idx.isValid()) return Tag::Root; else return dataTag(idx.internalId()); } quintptr tagData(quintptr internalId) { return internalId >> DATATAG_SHIFT; } } EventModel::EventModel(QObject* parent) : QAbstractItemModel(parent) { } EventModel::~EventModel() = default; int EventModel::columnCount(const QModelIndex& parent) const { return (dataTag(parent) == Tag::Invalid) ? 0 : NUM_COLUMNS; } int EventModel::rowCount(const QModelIndex& parent) const { if (parent.column() > 0) return 0; switch (dataTag(parent)) { case Tag::Invalid: case Tag::Cpus: case Tag::Threads: break; case Tag::Processes: return m_processes.value(parent.row()).threads.size(); case Tag::Overview: return (parent.row() == 0) ? m_data.cpus.size() : m_processes.size(); case Tag::Root: return 2; }; return 0; } QVariant EventModel::headerData(int section, Qt::Orientation orientation, int role) const { if (section < 0 || section >= NUM_COLUMNS || orientation != Qt::Horizontal || (role != Qt::DisplayRole && role != Qt::InitialSortOrderRole)) { return {}; } switch (static_cast(section)) { case ThreadColumn: return tr("Source"); case EventsColumn: return tr("Events\n\n"); case NUM_COLUMNS: // nothing break; } return {}; } QVariant EventModel::data(const QModelIndex& index, int role) const { if (!hasIndex(index.row(), index.column(), index.parent())) { return {}; } if (role == MaxTimeRole) { return m_time.end; } else if (role == MinTimeRole) { return m_time.start; } else if (role == ApplicationStartTimeRole) { return m_applicationTime.start; } else if (role == ApplicationEndTimeRole) { return m_applicationTime.end; } else if (role == MaxCostRole) { return m_maxCost; } else if (role == NumProcessesRole) { return m_processes.size(); } else if (role == NumThreadsRole) { return m_data.threads.size(); } else if (role == NumCpusRole) { return static_cast(m_data.cpus.size()); } else if (role == TotalCostsRole) { return QVariant::fromValue(m_data.totalCosts); } else if (role == EventResultsRole) { return QVariant::fromValue(m_data); } auto tag = dataTag(index); if (tag == Tag::Invalid || tag == Tag::Root) { return {}; } else if (tag == Tag::Overview) { if (role == Qt::DisplayRole) { return index.row() == 0 ? tr("CPUs") : tr("Processes"); } else if (role == Qt::ToolTipRole) { if (index.row() == 0) { return tr("Event timelines for all CPUs. This shows you which, and how many CPUs where leveraged." "Note that this feature relies on perf data files recorded with --sample-cpu."); } else { return tr("Event timelines for the individual threads and processes."); } } else if (role == SortRole) { return index.row(); } return {}; } else if (tag == Tag::Processes) { const auto& process = m_processes.value(index.row()); if (role == Qt::DisplayRole) return tr("%1 (#%2)").arg(process.name, QString::number(process.pid)); else if (role == SortRole || role == ProcessIdRole || role == ThreadIdRole) return process.pid; else if (role == CpuIdRole) return Data::INVALID_CPU_ID; if (role == Qt::ToolTipRole) { QString tooltip = tr("Process %1, pid = %2, num threads = %3\n") .arg(process.name, QString::number(process.pid), QString::number(process.threads.size())); quint64 runtime = 0; quint64 maxRuntime = 0; quint64 offCpuTime = 0; quint64 numEvents = 0; for (const auto tid : process.threads) { const auto thread = m_data.findThread(process.pid, tid); Q_ASSERT(thread); runtime += thread->time.delta(); maxRuntime = std::max(thread->time.delta(), maxRuntime); offCpuTime += thread->offCpuTime; numEvents += thread->events.size(); } const auto totalRuntime = m_time.delta(); tooltip += tr("Runtime: %1 (%2% of total runtime)\n") .arg(Util::formatTimeString(maxRuntime), Util::formatCostRelative(maxRuntime, totalRuntime)); if (m_totalOffCpuTime > 0) { const auto onCpuTime = runtime - offCpuTime; tooltip += tr("On-CPU time: %1 (%2% of combined thread runtime, %3% of total On-CPU time)\n") .arg(Util::formatTimeString(onCpuTime), Util::formatCostRelative(onCpuTime, runtime), Util::formatCostRelative(onCpuTime, m_totalOnCpuTime)); tooltip += tr("Off-CPU time: %1 (%2% of combined thread runtime, %3% of total Off-CPU time)\n") .arg(Util::formatTimeString(offCpuTime), Util::formatCostRelative(offCpuTime, runtime), Util::formatCostRelative(offCpuTime, m_totalOffCpuTime)); tooltip += tr("CPUs utilized: %1\n").arg(Util::formatCostRelative(onCpuTime, maxRuntime * 100)); } tooltip += tr("Number of Events: %1 (%2% of the total)") .arg(QString::number(numEvents), Util::formatCostRelative(numEvents, m_totalEvents)); return tooltip; } return {}; } const Data::ThreadEvents* thread = nullptr; const Data::CpuEvents* cpu = nullptr; if (tag == Tag::Cpus) { cpu = &m_data.cpus[index.row()]; } else { Q_ASSERT(tag == Tag::Threads); const auto process = m_processes.value(tagData(index.internalId())); const auto tid = process.threads.value(index.row()); thread = m_data.findThread(process.pid, tid); Q_ASSERT(thread); } if (role == ThreadStartRole) { return thread ? thread->time.start : m_time.start; } else if (role == ThreadEndRole) { return thread ? thread->time.end : m_time.end; } else if (role == ThreadNameRole) { return thread ? thread->name : tr("CPU #%1").arg(cpu->cpuId); } else if (role == ThreadIdRole) { return thread ? thread->tid : Data::INVALID_TID; } else if (role == ProcessIdRole) { return thread ? thread->pid : Data::INVALID_PID; } else if (role == CpuIdRole) { return cpu ? cpu->cpuId : Data::INVALID_CPU_ID; } else if (role == EventsRole) { return QVariant::fromValue(thread ? thread->events : (cpu ? cpu->events : Data::Events())); } else if (role == SortRole) { if (index.column() == ThreadColumn) return thread ? thread->tid : cpu->cpuId; else return thread ? thread->events.size() : cpu->events.size(); } switch (static_cast(index.column())) { case ThreadColumn: if (role == Qt::DisplayRole) { return cpu ? tr("CPU #%1").arg(cpu->cpuId) : tr("%1 (#%2)").arg(thread->name, QString::number(thread->tid)); } else if (role == Qt::ToolTipRole) { QString tooltip = cpu ? tr("CPU #%1\n").arg(cpu->cpuId) : tr("Thread %1, tid = %2, pid = %3\n") .arg(thread->name, QString::number(thread->tid), QString::number(thread->pid)); if (thread) { const auto runtime = thread->time.delta(); const auto totalRuntime = m_time.delta(); tooltip += tr("Runtime: %1 (%2% of total runtime)\n") .arg(Util::formatTimeString(runtime), Util::formatCostRelative(runtime, totalRuntime)); if (m_totalOffCpuTime > 0) { const auto onCpuTime = runtime - thread->offCpuTime; tooltip += tr("On-CPU time: %1 (%2% of thread runtime, %3% of total On-CPU time)\n") .arg(Util::formatTimeString(onCpuTime), Util::formatCostRelative(onCpuTime, runtime), Util::formatCostRelative(onCpuTime, m_totalOnCpuTime)); tooltip += tr("Off-CPU time: %1 (%2% of thread runtime, %3% of total Off-CPU time)\n") .arg(Util::formatTimeString(thread->offCpuTime), Util::formatCostRelative(thread->offCpuTime, runtime), Util::formatCostRelative(thread->offCpuTime, m_totalOffCpuTime)); } } const auto numEvents = thread ? thread->events.size() : cpu->events.size(); tooltip += tr("Number of Events: %1 (%2% of the total)") .arg(QString::number(numEvents), Util::formatCostRelative(numEvents, m_totalEvents)); return tooltip; } break; case EventsColumn: if (role == Qt::DisplayRole) return thread ? thread->events.size() : cpu->events.size(); break; case NUM_COLUMNS: // nothing break; } return {}; } void EventModel::setData(const Data::EventResults& data) { beginResetModel(); m_data = data; m_totalEvents = 0; m_maxCost = 0; m_processes.clear(); m_totalOnCpuTime = 0; m_totalOffCpuTime = 0; if (data.threads.isEmpty()) { m_time = {}; } else { m_time = data.threads.first().time; for (const auto& thread : data.threads) { m_time.start = std::min(thread.time.start, m_time.start); m_time.end = std::max(thread.time.end, m_time.end); m_totalOffCpuTime += thread.offCpuTime; m_totalOnCpuTime += thread.time.delta() - thread.offCpuTime; m_totalEvents += thread.events.size(); auto it = std::lower_bound(m_processes.begin(), m_processes.end(), thread.pid, orderProcessByPid); if (it == m_processes.end() || it->pid != thread.pid) { m_processes.insert(it, {thread.pid, {thread.tid}, thread.name}); } else { it->threads.append(thread.tid); // prefer process name, if we encountered a thread first if (thread.pid == thread.tid) it->name = thread.name; } for (const auto& event : thread.events) { if (event.type != 0) { // TODO: support multiple cost types somehow continue; } m_maxCost = std::max(event.cost, m_maxCost); } } // don't show timeline for CPU cores that did not receive any events auto it = std::remove_if(m_data.cpus.begin(), m_data.cpus.end(), [](const Data::CpuEvents& cpuEvents) { return cpuEvents.events.isEmpty(); }); m_data.cpus.erase(it, m_data.cpus.end()); } endResetModel(); } Data::TimeRange EventModel::timeRange() const { return m_time; } void EventModel::setApplicationTime(Data::TimeRange timeRange) { m_applicationTime = timeRange; } QModelIndex EventModel::index(int row, int column, const QModelIndex& parent) const { if (row < 0 || row >= rowCount(parent) || column < 0 || column >= NUM_COLUMNS) { return {}; } switch (dataTag(parent)) { case Tag::Invalid: // leaf / invalid -> no children case Tag::Cpus: case Tag::Threads: break; case Tag::Root: // root has the 1st level children: Overview return createIndex(row, column, static_cast(Tag::Overview)); case Tag::Overview: // 2nd level children: Cpus and the Processes if (parent.row() == 0) return createIndex(row, column, static_cast(Tag::Cpus)); else return createIndex(row, column, static_cast(Tag::Processes)); case Tag::Processes: // 3rd level children: Threads return createIndex(row, column, combineDataTag(Tag::Threads, parent.row())); } return {}; } QModelIndex EventModel::parent(const QModelIndex& child) const { switch (dataTag(child)) { case Tag::Invalid: case Tag::Root: case Tag::Overview: break; case Tag::Cpus: return createIndex(0, 0, static_cast(Tag::Overview)); case Tag::Processes: return createIndex(1, 0, static_cast(Tag::Overview)); case Tag::Threads: { const auto parentRow = tagData(child.internalId()); return createIndex(parentRow, 0, static_cast(Tag::Processes)); } } return {}; } KDAB-hotspot-41e5de7/src/models/eventmodel.h000066400000000000000000000043761515036260400207320ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "data.h" class EventModel : public QAbstractItemModel { Q_OBJECT public: explicit EventModel(QObject* parent = nullptr); virtual ~EventModel(); enum Columns { ThreadColumn = 0, EventsColumn, NUM_COLUMNS }; enum Roles { EventsRole = Qt::UserRole, MaxTimeRole, MinTimeRole, ApplicationStartTimeRole, ApplicationEndTimeRole, ThreadStartRole, ThreadEndRole, ThreadNameRole, ThreadIdRole, ProcessIdRole, CpuIdRole, NumProcessesRole, NumThreadsRole, NumCpusRole, MaxCostRole, SortRole, TotalCostsRole, EventResultsRole, }; int rowCount(const QModelIndex& parent = {}) const override; int columnCount(const QModelIndex& parent = {}) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QModelIndex index(int row, int column, const QModelIndex& parent = {}) const override; QModelIndex parent(const QModelIndex& child) const override; using QAbstractItemModel::setData; void setData(const Data::EventResults& data); void setApplicationTime(Data::TimeRange timeRange); Data::TimeRange timeRange() const; struct Process { Process(qint32 pid = Data::INVALID_PID, const QVector& threads = {}, const QString& name = {}) : pid(pid) , threads(threads) , name(name) { } qint32 pid; QVector threads; QString name; }; private: Data::EventResults m_data; QVector m_processes; Data::TimeRange m_time; Data::TimeRange m_applicationTime; quint64 m_totalOnCpuTime = 0; quint64 m_totalOffCpuTime = 0; quint64 m_totalEvents = 0; quint64 m_maxCost = 0; }; Q_DECLARE_TYPEINFO(EventModel::Process, Q_MOVABLE_TYPE); KDAB-hotspot-41e5de7/src/models/filterandzoomstack.cpp000066400000000000000000000204271515036260400230210ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "filterandzoomstack.h" #include #include #include FilterAndZoomStack::FilterAndZoomStack(QObject* parent) : QObject(parent) { m_actions.filterOut = new QAction(QIcon::fromTheme(QStringLiteral("kt-remove-filters")), tr("Filter Out"), this); connect(m_actions.filterOut, &QAction::triggered, this, &FilterAndZoomStack::filterOut); m_actions.filterOut->setToolTip(tr("Undo the last filter and show more data in the views.")); m_actions.resetFilter = new QAction(QIcon::fromTheme(QStringLiteral("view-filter")), tr("Reset Filter"), this); connect(m_actions.resetFilter, &QAction::triggered, this, &FilterAndZoomStack::resetFilter); m_actions.resetFilter->setToolTip(tr("Reset all filters and show the full data in the views.")); m_actions.zoomOut = new QAction(QIcon::fromTheme(QStringLiteral("zoom-out")), tr("Zoom Out"), this); connect(m_actions.zoomOut, &QAction::triggered, this, &FilterAndZoomStack::zoomOut); m_actions.zoomOut->setToolTip(tr("Undo the last zoom operation and show a larger range in the time line.")); m_actions.resetZoom = new QAction(QIcon::fromTheme(QStringLiteral("zoom-original")), tr("Reset Zoom"), this); connect(m_actions.resetZoom, &QAction::triggered, this, &FilterAndZoomStack::resetZoom); m_actions.resetZoom->setToolTip(tr("Reset the zoom level to show the full range in the time line.")); m_actions.resetFilterAndZoom = new QAction(QIcon::fromTheme(QStringLiteral("edit-clear")), tr("Reset Zoom And Filter"), this); connect(m_actions.resetFilterAndZoom, &QAction::triggered, this, &FilterAndZoomStack::resetFilterAndZoom); m_actions.resetFilterAndZoom->setToolTip( tr("Reset both, filters and zoom level to show the full data in both, views and timeline.")); m_actions.filterInBySymbol = new QAction(QIcon::fromTheme(QStringLiteral("view-filter")), tr("Filter In By Symbol"), this); connect(m_actions.filterInBySymbol, &QAction::triggered, this, [this]() { const auto data = m_actions.filterInBySymbol->data(); Q_ASSERT(data.canConvert()); filterInBySymbol(data.value()); }); m_actions.filterOutBySymbol = new QAction(QIcon::fromTheme(QStringLiteral("view-filter")), tr("Filter Out By Symbol"), this); connect(m_actions.filterOutBySymbol, &QAction::triggered, this, [this]() { const auto data = m_actions.filterInBySymbol->data(); Q_ASSERT(data.canConvert()); filterOutBySymbol(data.value()); }); m_actions.filterInByBinary = new QAction(QIcon::fromTheme(QStringLiteral("view-filter")), tr("Filter In By Binary"), this); connect(m_actions.filterInByBinary, &QAction::triggered, this, [this]() { const auto data = m_actions.filterInByBinary->data(); Q_ASSERT(data.canConvert()); filterInByBinary(data.value()); }); m_actions.filterOutByBinary = new QAction(QIcon::fromTheme(QStringLiteral("view-filter")), tr("Filter Out By Binary"), this); connect(m_actions.filterOutByBinary, &QAction::triggered, this, [this]() { const auto data = m_actions.filterInByBinary->data(); Q_ASSERT(data.canConvert()); filterOutByBinary(data.value()); }); connect(this, &FilterAndZoomStack::filterChanged, this, &FilterAndZoomStack::updateActions); connect(this, &FilterAndZoomStack::zoomChanged, this, &FilterAndZoomStack::updateActions); updateActions(); } FilterAndZoomStack::~FilterAndZoomStack() = default; Data::FilterAction FilterAndZoomStack::filter() const { return m_filterStack.isEmpty() ? Data::FilterAction {} : m_filterStack.last(); } Data::ZoomAction FilterAndZoomStack::zoom() const { return m_zoomStack.isEmpty() ? Data::ZoomAction {} : m_zoomStack.last(); } FilterAndZoomStack::Actions FilterAndZoomStack::actions() const { return m_actions; } void FilterAndZoomStack::clear() { m_filterStack.clear(); m_zoomStack.clear(); } void FilterAndZoomStack::filterInByTime(Data::TimeRange time) { zoomIn(time); Data::FilterAction filter; filter.time = time.normalized(); applyFilter(filter); } void FilterAndZoomStack::filterInByProcess(qint32 processId) { Data::FilterAction filter; filter.processId = processId; applyFilter(filter); } void FilterAndZoomStack::filterOutByProcess(qint32 processId) { Data::FilterAction filter; filter.excludeProcessIds.push_back(processId); applyFilter(filter); } void FilterAndZoomStack::filterInByThread(qint32 threadId) { Data::FilterAction filter; filter.threadId = threadId; applyFilter(filter); } void FilterAndZoomStack::filterOutByThread(qint32 threadId) { Data::FilterAction filter; filter.excludeThreadIds.push_back(threadId); applyFilter(filter); } void FilterAndZoomStack::filterInByCpu(quint32 cpuId) { Data::FilterAction filter; filter.cpuId = cpuId; applyFilter(filter); } void FilterAndZoomStack::filterOutByCpu(quint32 cpuId) { Data::FilterAction filter; filter.excludeCpuIds.push_back(cpuId); applyFilter(filter); } void FilterAndZoomStack::filterInBySymbol(const Data::Symbol& symbol) { Data::FilterAction filter; filter.includeSymbols.insert(symbol); applyFilter(filter); } void FilterAndZoomStack::filterOutBySymbol(const Data::Symbol& symbol) { Data::FilterAction filter; filter.excludeSymbols.insert(symbol); applyFilter(filter); } void FilterAndZoomStack::filterInByBinary(const QString& binary) { Data::FilterAction filter; filter.includeBinaries.insert(binary); applyFilter(filter); } void FilterAndZoomStack::filterOutByBinary(const QString& binary) { Data::FilterAction filter; filter.excludeBinaries.insert(binary); applyFilter(filter); } void FilterAndZoomStack::applyFilter(Data::FilterAction filter) { if (!m_filterStack.isEmpty()) { // apply previous filter state const auto& lastFilter = m_filterStack.last(); if (!filter.time.start) filter.time.start = lastFilter.time.start; if (!filter.time.end) filter.time.end = lastFilter.time.end; if (filter.processId == Data::INVALID_PID) filter.processId = lastFilter.processId; if (filter.threadId == Data::INVALID_TID) filter.threadId = lastFilter.threadId; if (filter.cpuId == Data::INVALID_CPU_ID) filter.cpuId = lastFilter.cpuId; filter.excludeProcessIds += lastFilter.excludeProcessIds; filter.excludeThreadIds += lastFilter.excludeThreadIds; filter.excludeCpuIds += lastFilter.excludeCpuIds; filter.excludeSymbols += lastFilter.excludeSymbols; filter.includeSymbols += lastFilter.includeSymbols; filter.includeSymbols.subtract(filter.excludeSymbols); filter.excludeBinaries += lastFilter.excludeBinaries; filter.includeBinaries += lastFilter.includeBinaries; filter.includeBinaries.subtract(filter.excludeBinaries); } m_filterStack.push_back(filter); emit filterChanged(filter); } void FilterAndZoomStack::resetFilter() { m_filterStack.clear(); emit filterChanged({}); } void FilterAndZoomStack::filterOut() { m_filterStack.removeLast(); emit filterChanged(filter()); } void FilterAndZoomStack::zoomIn(Data::TimeRange time) { m_zoomStack.append({time.normalized()}); emit zoomChanged(m_zoomStack.constLast()); } void FilterAndZoomStack::resetZoom() { m_zoomStack.clear(); emit zoomChanged({}); } void FilterAndZoomStack::zoomOut() { m_zoomStack.removeLast(); emit zoomChanged(zoom()); } void FilterAndZoomStack::resetFilterAndZoom() { resetFilter(); resetZoom(); } void FilterAndZoomStack::updateActions() const { const bool isFiltered = filter().isValid(); m_actions.filterOut->setEnabled(isFiltered); m_actions.resetFilter->setEnabled(isFiltered); const bool isZoomed = zoom().isValid(); m_actions.zoomOut->setEnabled(isZoomed); m_actions.resetZoom->setEnabled(isZoomed); m_actions.resetFilterAndZoom->setEnabled(isZoomed || isFiltered); } KDAB-hotspot-41e5de7/src/models/filterandzoomstack.h000066400000000000000000000037101515036260400224620ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "data.h" class QAction; class FilterAndZoomStack : public QObject { Q_OBJECT public: explicit FilterAndZoomStack(QObject* parent = nullptr); ~FilterAndZoomStack(); Data::FilterAction filter() const; Data::ZoomAction zoom() const; struct Actions { QAction* filterOut = nullptr; QAction* resetFilter = nullptr; QAction* zoomOut = nullptr; QAction* resetZoom = nullptr; QAction* resetFilterAndZoom = nullptr; QAction* filterInBySymbol = nullptr; QAction* filterOutBySymbol = nullptr; QAction* filterInByBinary = nullptr; QAction* filterOutByBinary = nullptr; }; Actions actions() const; void clear(); public slots: void filterInByTime(Data::TimeRange time); void filterInByProcess(qint32 processId); void filterOutByProcess(qint32 processId); void filterInByThread(qint32 threadId); void filterOutByThread(qint32 threadId); void filterInByCpu(quint32 cpuId); void filterOutByCpu(quint32 cpuId); void filterInBySymbol(const Data::Symbol& symbol); void filterOutBySymbol(const Data::Symbol& symbol); void filterInByBinary(const QString& binary); void filterOutByBinary(const QString& binary); void applyFilter(Data::FilterAction filter); void resetFilter(); void filterOut(); void zoomIn(Data::TimeRange time); void resetZoom(); void zoomOut(); void resetFilterAndZoom(); signals: void filterChanged(const Data::FilterAction& filter); void zoomChanged(Data::ZoomAction zoom); private: void updateActions() const; Actions m_actions; QVector m_filterStack; QVector m_zoomStack; }; KDAB-hotspot-41e5de7/src/models/formattingutils.cpp000066400000000000000000000013531515036260400223460ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "formattingutils.h" QString Util::removeAnsi(const QString& stringWithAnsi) { if (!stringWithAnsi.contains(escapeChar)) { return stringWithAnsi; } QString ansiFreeString = stringWithAnsi; while (ansiFreeString.contains(escapeChar)) { const auto escapeStart = ansiFreeString.indexOf(escapeChar); const auto escapeEnd = ansiFreeString.indexOf(QLatin1Char('m'), escapeStart); ansiFreeString.remove(escapeStart, escapeEnd - escapeStart + 1); } return ansiFreeString; } KDAB-hotspot-41e5de7/src/models/formattingutils.h000066400000000000000000000007211515036260400220110ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include namespace Util { // escape character also known as \033 and \e it signals the start of an ansi escape sequence constexpr auto escapeChar = QLatin1Char('\u001B'); QString removeAnsi(const QString& stringWithAnsi); } KDAB-hotspot-41e5de7/src/models/frequencymodel.cpp000066400000000000000000000040341515036260400221340ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "frequencymodel.h" FrequencyModel::FrequencyModel(QObject* parent) : QAbstractTableModel(parent) { } FrequencyModel::~FrequencyModel() = default; int FrequencyModel::rowCount(const QModelIndex& parent) const { if (parent.isValid() || m_frequencyData.isEmpty()) { return 0; } return m_frequencyData[parent.column() / 2].values.size(); } int FrequencyModel::columnCount(const QModelIndex& parent) const { if (parent.isValid()) { return 0; } return m_frequencyData.size() * 2; } QVariant FrequencyModel::data(const QModelIndex& index, int role) const { if (role != Qt::DisplayRole || !hasIndex(index.row(), index.column(), index.parent())) { return {}; } if (index.row() >= m_frequencyData[index.column() / 2].values.size()) { return {}; } if (index.column() % 2 == 0) { return m_frequencyData[index.column() / 2].values[index.row()].time; } else { return m_frequencyData[index.column() / 2].values[index.row()].cost; } } QVariant FrequencyModel::headerData(int section, Qt::Orientation /*orientation*/, int role) const { if (section < 0 || section >= m_frequencyData.size() * 2) { return {}; } if (role != Qt::DisplayRole) { return {}; } return m_frequencyData[section / 2].costName; } void FrequencyModel::setResults(const Data::FrequencyResults& results) { beginResetModel(); m_frequencyData.clear(); int coreIndex = 0; for (const auto& core : results.cores) { for (const auto& eventType : core.costs) { m_frequencyData.push_back( {tr("CPU %1 - %2").arg(QString::number(coreIndex), eventType.costName), eventType.values}); } coreIndex++; } endResetModel(); } KDAB-hotspot-41e5de7/src/models/frequencymodel.h000066400000000000000000000016551515036260400216070ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class FrequencyModel : public QAbstractTableModel { Q_OBJECT public: explicit FrequencyModel(QObject* parent = nullptr); ~FrequencyModel(); int rowCount(const QModelIndex& parent = {}) const override; int columnCount(const QModelIndex& parent = {}) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; void setResults(const Data::FrequencyResults& results); private: QVector m_frequencyData; }; KDAB-hotspot-41e5de7/src/models/hashmodel.h000066400000000000000000000052351515036260400205270ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include template class HashModel : public QAbstractTableModel { public: explicit HashModel(QObject* parent = nullptr) : QAbstractTableModel(parent) { } virtual ~HashModel() = default; int columnCount(const QModelIndex& parent = {}) const final override { return parent.isValid() ? 0 : numColumns(); } int rowCount(const QModelIndex& parent = {}) const final override { return parent.isValid() ? 0 : m_keys.size(); } QVariant headerData(int section, Qt::Orientation orientation = Qt::Horizontal, int role = Qt::DisplayRole) const final override { if (section < 0 || section > numColumns() || orientation != Qt::Horizontal) { return {}; } return headerCell(section, role); } QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const final override { if (!hasIndex(index.row(), index.column(), index.parent())) { return {}; } const auto& key = m_keys.value(index.row()); const auto& value = m_values.value(index.row()); return cell(index.column(), role, key, value); } QModelIndex indexForKey(const typename Rows::key_type& key, int column = 0) const { auto it = std::find(m_keys.begin(), m_keys.end(), key); if (it == m_keys.end()) { return {}; } const int row = std::distance(m_keys.begin(), it); return index(row, column); } typename Rows::key_type key(int row) const { return m_keys.value(row); } protected: void setRows(const Rows& rows) { beginResetModel(); m_keys.reserve(rows.size()); m_values.reserve(rows.size()); m_keys.clear(); m_values.clear(); for (auto it = rows.constBegin(), end = rows.constEnd(); it != end; ++it) { m_keys.push_back(it.key()); m_values.push_back(it.value()); } endResetModel(); } virtual QVariant headerCell(int column, int role) const = 0; virtual QVariant cell(int column, int role, const typename Rows::key_type& key, const typename Rows::mapped_type& entry) const = 0; virtual int numColumns() const = 0; QVector m_keys; QVector m_values; }; KDAB-hotspot-41e5de7/src/models/highlightedtext.cpp000066400000000000000000000257201515036260400223040ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "highlightedtext.h" #include #include #include #include #include #include #include #if KFSyntaxHighlighting_FOUND #include #include #include #include #include #include #include #endif #include "formattingutils.h" using LineFormat = QVector; #if KFSyntaxHighlighting_FOUND // highlighter using KSyntaxHighlighting class HighlightingImplementation : public KSyntaxHighlighting::AbstractHighlighter { public: HighlightingImplementation(KSyntaxHighlighting::Repository* repository) : m_repository(repository) { } ~HighlightingImplementation() override = default; void formatText(const QStringList& text) { if (m_lines != text) { m_lines = text; } m_formats.clear(); m_state = {}; for (const auto& line : text) { m_formats.push_back(formatLine(line)); } } virtual LineFormat format(int lineIndex) const { return m_formats.at(lineIndex); } virtual void themeChanged() { if (!m_repository) { return; } KSyntaxHighlighting::Repository::DefaultTheme theme; const auto palette = QGuiApplication::palette(); if (palette.base().color().lightness() < 128) { theme = KSyntaxHighlighting::Repository::DarkTheme; } else { theme = KSyntaxHighlighting::Repository::LightTheme; } setTheme(m_repository->defaultTheme(theme)); } virtual void setHighlightingDefinition(const KSyntaxHighlighting::Definition& definition) { setDefinition(definition); formatText(m_lines); } virtual QString definitionName() const { return definition().name(); } virtual LineFormat formatLine(const QString& line) { m_lineFormat.clear(); m_state = highlightLine(line, m_state); return m_lineFormat; } protected: void applyFormat(int offset, int length, const KSyntaxHighlighting::Format& format) override { QTextCharFormat textCharFormat; textCharFormat.setForeground(format.textColor(theme())); textCharFormat.setFontWeight(format.isBold(theme()) ? QFont::Bold : QFont::Normal); m_lineFormat.push_back({offset, length, textCharFormat}); } private: KSyntaxHighlighting::Repository* m_repository; KSyntaxHighlighting::State m_state; QStringList m_lines; // for reformatting if definition changes LineFormat m_lineFormat; QVector m_formats; }; #else // stub in case KSyntaxHighlighting is not available class HighlightingImplementation { public: HighlightingImplementation(KSyntaxHighlighting::Repository* /*repository*/) { } virtual ~HighlightingImplementation() = default; void formatText(const QStringList& text) { m_formats.clear(); for (const auto& line : text) { m_formats.push_back(formatLine(line)); } } LineFormat format(int lineIndex) const { return m_formats.at(lineIndex); } virtual void themeChanged() { } virtual void setHighlightingDefinition(const KSyntaxHighlighting::Definition& /*definition*/) { } virtual QString definitionName() const { return {}; }; private: // stub implementation necessary for testing virtual LineFormat formatLine(const QString& line) { return {{QTextLayout::FormatRange {0, static_cast(line.length()), {}}}}; } Q_DISABLE_COPY(HighlightingImplementation) QVector m_formats; }; #endif class AnsiHighlightingImplementation : public HighlightingImplementation { public: AnsiHighlightingImplementation() : HighlightingImplementation(nullptr) { } ~AnsiHighlightingImplementation() override = default; void themeChanged() override { m_colorScheme = KColorScheme(QPalette::Normal, KColorScheme::Complementary); } void setHighlightingDefinition(const KSyntaxHighlighting::Definition& /*definition*/) override { } QString definitionName() const override { return {}; } private: LineFormat formatLine(const QString& text) override { QVector formats; int offset = 0; QTextLayout::FormatRange format; constexpr int setColorSequenceLength = 5; constexpr int resetColorSequenceLength = 4; constexpr int colorCodeLength = 2; auto lastToken = text.begin(); for (auto escapeIt = std::find(text.cbegin(), text.cend(), Util::escapeChar); escapeIt != text.cend(); escapeIt = std::find(escapeIt, text.cend(), Util::escapeChar)) { Q_ASSERT(*(escapeIt + 1) == QLatin1Char('[')); offset += std::distance(lastToken, escapeIt); // escapeIt + 2 points to the first color code character auto color = QStringView {escapeIt + 2, colorCodeLength}; bool ok = false; const uint8_t colorCode = color.toUInt(&ok); if (ok) { // only support the 8 default colors Q_ASSERT(colorCode >= 30 && colorCode <= 37); format.start = offset; const auto colorRole = static_cast(colorCode - 30); format.format.setForeground(m_colorScheme.foreground(colorRole)); std::advance(escapeIt, setColorSequenceLength); } else { // make sure we have a reset sequence Q_ASSERT(color == QStringLiteral("0m")); format.length = offset - format.start; if (format.length) { formats.push_back(format); } std::advance(escapeIt, resetColorSequenceLength); } lastToken = escapeIt; } return formats; } KColorScheme m_colorScheme; }; // QTextLayout is slow, this class acts as a cache that only creates and fills the QTextLayout on demand class HighlightedLine { public: HighlightedLine() = default; HighlightedLine(HighlightingImplementation* highlighter, const QString& text, int index) : m_highlighter(highlighter) , m_text(Util::removeAnsi(text)) , m_index(index) , m_layout(nullptr) { } QTextLayout* layout() const { if (!m_layout) { m_layout = buildLayout(); } return m_layout.get(); } void updateHighlighting() { m_layout = nullptr; } void setTabWidthInPixels(int tabWidthInPixels) { m_tabWidthInPixels = tabWidthInPixels; m_layout = nullptr; } private: std::unique_ptr buildLayout() const { Q_ASSERT(m_index != -1); auto layout = std::make_unique(); auto option = layout->textOption(); option.setTabStopDistance(m_tabWidthInPixels); layout->setTextOption(option); auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont); layout->setFont(font); layout->setText(m_text); layout->setFormats(m_highlighter->format(m_index)); layout->beginLayout(); // there is at most one line, so we don't need to check this multiple times auto line = layout->createLine(); if (line.isValid()) { line.setPosition(QPointF(0, 0)); } layout->endLayout(); return layout; } HighlightingImplementation* m_highlighter = nullptr; QString m_text; int m_index = -1; int m_tabWidthInPixels = -1; // qts default value mutable std::unique_ptr m_layout; }; static_assert(std::is_nothrow_move_constructible_v); static_assert(std::is_nothrow_destructible_v); HighlightedText::HighlightedText(KSyntaxHighlighting::Repository* repository, QObject* parent) : QObject(parent) , m_repository(repository) { } HighlightedText::~HighlightedText() = default; void HighlightedText::setText(const QStringList& text) { const bool usesAnsi = std::any_of(text.cbegin(), text.cend(), [](const QString& line) { return line.contains(Util::escapeChar); }); if (!m_highlighter || m_isUsingAnsi != usesAnsi) { if (usesAnsi) { m_highlighter = std::make_unique(); } else { m_highlighter = std::make_unique(m_repository); } m_highlighter->themeChanged(); m_isUsingAnsi = usesAnsi; emit usesAnsiChanged(usesAnsi); } m_highlightedLines.resize(text.size()); m_highlighter->formatText(text); int index = 0; std::transform(text.cbegin(), text.cend(), m_highlightedLines.begin(), [this, &index](const QString& text) { return HighlightedLine {m_highlighter.get(), text, index++}; }); // this is free since we currently have no text rendered updateTabWidth(m_tabWidth); m_cleanedLines = text; std::transform(m_cleanedLines.begin(), m_cleanedLines.end(), m_cleanedLines.begin(), Util::removeAnsi); } void HighlightedText::setDefinition(const KSyntaxHighlighting::Definition& definition) { Q_ASSERT(m_highlighter); m_highlighter->setHighlightingDefinition(definition); #if KFSyntaxHighlighting_FOUND emit definitionChanged(definition.name()); updateHighlighting(); #endif } QString HighlightedText::textAt(int index) const { Q_ASSERT(m_highlighter); return m_cleanedLines.at(index); } QTextLine HighlightedText::lineAt(int index) const { auto& line = m_highlightedLines[index]; return line.layout()->lineAt(0); } QString HighlightedText::definition() const { if (!m_highlighter) return {}; return m_highlighter->definitionName(); } QTextLayout* HighlightedText::layoutForLine(int index) { return m_highlightedLines[index].layout(); } void HighlightedText::updateHighlighting() { if (m_highlighter) m_highlighter->themeChanged(); std::for_each(m_highlightedLines.begin(), m_highlightedLines.end(), [](HighlightedLine& line) { line.updateHighlighting(); }); } void HighlightedText::updateTabWidth(int tabWidth) { m_tabWidth = tabWidth; auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont); const auto tabWidthInPixels = tabWidth * QFontMetrics(font).horizontalAdvance(QLatin1Char(' ')); std::for_each(m_highlightedLines.begin(), m_highlightedLines.end(), [tabWidthInPixels](HighlightedLine& line) { line.setTabWidthInPixels(tabWidthInPixels); }); } KDAB-hotspot-41e5de7/src/models/highlightedtext.h000066400000000000000000000027271515036260400217530ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class QTextLayout; class QTextLine; namespace KSyntaxHighlighting { class SyntaxHighlighter; class Definition; class Repository; } class HighlightingImplementation; class HighlightedLine; class HighlightedText : public QObject { Q_OBJECT public: HighlightedText(KSyntaxHighlighting::Repository* repository, QObject* parent = nullptr); ~HighlightedText() override; void setText(const QStringList& text); void setDefinition(const KSyntaxHighlighting::Definition& definition); QString textAt(int index) const; QTextLine lineAt(int index) const; QString definition() const; bool isUsingAnsi() const { return m_isUsingAnsi; } // for testing QTextLayout* layoutForLine(int index); signals: void definitionChanged(const QString& definition); void usesAnsiChanged(bool usesAnsi); public slots: void updateHighlighting(); void updateTabWidth(int tabWidth); private: KSyntaxHighlighting::Repository* m_repository; std::unique_ptr m_highlighter; std::vector m_highlightedLines; QStringList m_lines; QStringList m_cleanedLines; bool m_isUsingAnsi = false; int m_tabWidth = -1; }; KDAB-hotspot-41e5de7/src/models/processfiltermodel.cpp000066400000000000000000000034321515036260400230200ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "processfiltermodel.h" #include "processmodel.h" #include #include ProcessFilterModel::ProcessFilterModel(QObject* parent) : QSortFilterProxyModel(parent) { setRecursiveFilteringEnabled(true); m_currentProcId = QString::number(qApp->applicationPid()); m_currentUser = KUser().loginName(); if (m_currentUser == QLatin1String("root")) { // empty current user == no filter. as root we want to show all m_currentUser.clear(); } } bool ProcessFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const { const QString l = sourceModel()->data(left).toString(); const QString r = sourceModel()->data(right).toString(); if (left.column() == ProcessModel::PIDColumn) return l.toInt() < r.toInt(); return l.compare(r, Qt::CaseInsensitive) <= 0; } bool ProcessFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { auto* source = dynamic_cast(sourceModel()); if (!source) return true; const ProcData& data = source->dataForRow(source_row); if (!m_currentUser.isEmpty() && data.user != m_currentUser) return false; return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); } bool ProcessFilterModel::filterAcceptsColumn(int source_column, const QModelIndex& /*source_parent*/) const { // hide user row if current user was found return m_currentUser.isEmpty() || source_column != ProcessModel::UserColumn; } KDAB-hotspot-41e5de7/src/models/processfiltermodel.h000066400000000000000000000015171515036260400224670ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include // A filterable and sortable process model class ProcessFilterModel : public QSortFilterProxyModel { Q_OBJECT public: explicit ProcessFilterModel(QObject* parent); bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; bool filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const override; private: bool lessThan(const QModelIndex& left, const QModelIndex& right) const override; QString m_currentProcId; QString m_currentUser; }; KDAB-hotspot-41e5de7/src/models/processlist.h000066400000000000000000000036371515036260400211410ustar00rootroot00000000000000/************************************************************************** ** ** This code is part of Qt Creator ** ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (info@qt.nokia.com) ** ** ** GNU Lesser General Public License Usage ** ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this file. ** Please review the following information to ensure the GNU Lesser General ** Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** Other Usage ** ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** If you have questions regarding the use of this file, please contact ** Nokia at info@qt.nokia.com. ** **************************************************************************/ #pragma once #include #include struct ProcData { QString ppid; QString name; QString state; QString user; inline bool equals(const ProcData& other) const { return ppid == other.ppid && name == other.name && state == other.state && user == other.user; } }; Q_DECLARE_TYPEINFO(ProcData, Q_MOVABLE_TYPE); inline bool operator<(const ProcData& l, const ProcData& r) { return l.ppid < r.ppid; } inline bool operator==(const ProcData& l, const ProcData& r) { return l.ppid == r.ppid; } QDebug operator<<(QDebug d, const ProcData& data); using ProcDataList = QVector; ProcDataList processList(); KDAB-hotspot-41e5de7/src/models/processlist_unix.cpp000066400000000000000000000114321515036260400225270ustar00rootroot00000000000000/************************************************************************** ** ** This code is part of Qt Creator ** ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (info@qt.nokia.com) ** ** ** GNU Lesser General Public License Usage ** ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this file. ** Please review the following information to ensure the GNU Lesser General ** Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** Other Usage ** ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** If you have questions regarding the use of this file, please contact ** Nokia at info@qt.nokia.com. ** **************************************************************************/ #include "processlist.h" #include #include #include #include #include QDebug operator<<(QDebug d, const ProcData& data) { d << "ProcData{.ppid=" << data.ppid << ", .name=" << data.name << ", .state=" << data.state << ", .user=" << data.user << ", .type=" << "}"; return d; } namespace { bool isUnixProcessId(const QString& procname) { return std::all_of(procname.begin(), procname.end(), [](QChar c) { return c.isDigit(); }); } // Determine UNIX processes by running ps ProcDataList unixProcessListPS() { #ifdef Q_OS_MAC // command goes last, otherwise it is cut off const auto format = QStringLiteral("pid state user command"); #else const auto format = QStringLiteral("pid,state,user,cmd"); #endif QProcess psProcess; psProcess.start(QStringLiteral("ps"), {QStringLiteral("-e"), QStringLiteral("-o"), format}); if (!psProcess.waitForStarted()) return {}; psProcess.waitForFinished(); const auto output = psProcess.readAllStandardOutput(); // Split "457 S+ /Users/foo.app" const QStringList lines = QString::fromLocal8Bit(output).split(QLatin1Char('\n')); const int lineCount = lines.size(); const QChar blank = QLatin1Char(' '); ProcDataList rc; for (int l = 1; l < lineCount; l++) { // Skip header const QString line = lines.at(l).simplified(); // we can't just split on blank as the process name might // contain them const int endOfPid = line.indexOf(blank); const int endOfState = line.indexOf(blank, endOfPid + 1); const int endOfUser = line.indexOf(blank, endOfState + 1); if (endOfPid >= 0 && endOfState >= 0 && endOfUser >= 0) { ProcData procData; procData.ppid = line.left(endOfPid); procData.state = line.mid(endOfPid + 1, endOfState - endOfPid - 1); procData.user = line.mid(endOfState + 1, endOfUser - endOfState - 1); procData.name = line.right(line.size() - endOfUser - 1); rc.push_back(procData); } } return rc; } } // Determine UNIX processes by reading "/proc". Default to ps if // it does not exist ProcDataList processList() { const QDir procDir(QStringLiteral("/proc/")); if (!procDir.exists()) return unixProcessListPS(); ProcDataList rc; const auto entries = procDir.entryList(); for (const QString& procId : entries) { if (!isUnixProcessId(procId)) continue; QFile file(QLatin1String("/proc/") + procId + QLatin1String("/stat")); if (!file.open(QIODevice::ReadOnly)) continue; // process may have exited const QStringList data = QString::fromLocal8Bit(file.readAll()).split(QLatin1Char(' ')); ProcData proc; proc.ppid = procId; proc.name = data.at(1); if (proc.name.startsWith(QLatin1Char('(')) && proc.name.endsWith(QLatin1Char(')'))) { proc.name.truncate(proc.name.size() - 1); proc.name.remove(0, 1); } proc.state = data.at(2); // PPID is element 3 proc.user = QFileInfo(file).owner(); file.close(); QFile cmdFile(QLatin1String("/proc/") + procId + QLatin1String("/cmdline")); if (cmdFile.open(QFile::ReadOnly)) { QByteArray cmd = cmdFile.readAll(); cmd.replace('\0', ' '); if (!cmd.isEmpty()) proc.name = QString::fromLocal8Bit(cmd).trimmed(); } cmdFile.close(); rc.push_back(proc); } return rc; } KDAB-hotspot-41e5de7/src/models/processmodel.cpp000066400000000000000000000110231515036260400216050ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "processmodel.h" #include #include ProcessModel::ProcessModel(QObject* parent) : QAbstractTableModel(parent) { } ProcessModel::~ProcessModel() = default; void ProcessModel::setProcesses(const ProcDataList& processes) { beginResetModel(); m_data = processes; // sort for merging to work properly std::stable_sort(m_data.begin(), m_data.end()); endResetModel(); } void ProcessModel::mergeProcesses(const ProcDataList& processes) { // sort like m_data ProcDataList sortedProcesses = processes; std::stable_sort(sortedProcesses.begin(), sortedProcesses.end()); // iterator over m_data int i = 0; for (const ProcData& newProc : sortedProcesses) { bool shouldInsert = true; while (i < m_data.count()) { const ProcData& oldProc = m_data.at(i); if (oldProc < newProc) { // remove old proc, seems to be outdated beginRemoveRows(QModelIndex(), i, i); m_data.removeAt(i); endRemoveRows(); continue; } else if (newProc == oldProc) { // already contained, hence increment and break. // Update entry before if something changed (like state), // this make sure m_data match exactly sortedProcesses for later Q_ASSERT check. if (!newProc.equals(oldProc)) { m_data[i] = newProc; emit dataChanged(index(i, 0), index(i, columnCount() - 1)); } ++i; shouldInsert = false; break; } else { // newProc < oldProc // new entry, break and insert it break; } } if (shouldInsert) { beginInsertRows(QModelIndex(), i, i); m_data.insert(i, newProc); endInsertRows(); // let i point to old element again ++i; } } // make sure the new data is properly inserted Q_ASSERT(m_data == sortedProcesses); } void ProcessModel::clear() { beginRemoveRows(QModelIndex(), 0, m_data.count()); m_data.clear(); endRemoveRows(); } ProcData ProcessModel::dataForIndex(const QModelIndex& index) const { return m_data.at(index.row()); } ProcData ProcessModel::dataForRow(int row) const { return m_data.at(row); } QModelIndex ProcessModel::indexForPid(const QString& pid) const { for (int i = 0; i < m_data.size(); ++i) { if (m_data.at(i).ppid == pid) return index(i, 0); } return {}; } QVariant ProcessModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return {}; if (section == PIDColumn) return tr("Process ID"); else if (section == NameColumn) return tr("Name"); else if (section == StateColumn) return tr("State"); else if (section == UserColumn) return tr("User"); return {}; } QVariant ProcessModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return {}; const ProcData& data = m_data.at(index.row()); if (role == Qt::DisplayRole) { if (index.column() == PIDColumn) return data.ppid; else if (index.column() == NameColumn) return data.name; else if (index.column() == StateColumn) return data.state; else if (index.column() == UserColumn) return data.user; } else if (role == Qt::ToolTipRole) { return tr("Name: %1\nPID: %2\nOwner: %3").arg(data.name, data.ppid, data.user); } else if (role == PIDRole) { return data.ppid.toInt(); // why is this a QString in the first place!? } else if (role == NameRole) { return data.name; } else if (role == StateRole) { return data.state; } else if (role == UserRole) { return data.user; } return {}; } int ProcessModel::columnCount(const QModelIndex& parent) const { return parent.isValid() ? 0 : COLUMN_COUNT; } int ProcessModel::rowCount(const QModelIndex& parent) const { return parent.isValid() ? 0 : m_data.count(); } ProcDataList ProcessModel::processes() const { return m_data; } KDAB-hotspot-41e5de7/src/models/processmodel.h000066400000000000000000000027261515036260400212640ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include "processlist.h" class ProcessModel : public QAbstractTableModel { Q_OBJECT public: explicit ProcessModel(QObject* parent = nullptr); virtual ~ProcessModel(); void setProcesses(const ProcDataList& processes); void mergeProcesses(const ProcDataList& processes); ProcData dataForIndex(const QModelIndex& index) const; ProcData dataForRow(int row) const; QModelIndex indexForPid(const QString& pid) const; ProcDataList processes() const; void clear(); enum Columns { PIDColumn, NameColumn, StateColumn, UserColumn, COLUMN_COUNT }; int columnCount(const QModelIndex& parent = QModelIndex()) const override; int rowCount(const QModelIndex& parent = QModelIndex()) const override; enum CustomRoles { PIDRole = Qt::UserRole, NameRole, StateRole, UserRole }; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; private: ProcDataList m_data; }; KDAB-hotspot-41e5de7/src/models/search.h000066400000000000000000000037171515036260400200330ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include enum class Direction { Forward, Backward }; /** a search function that wraps around at the end * this function evaluates searchFunc starting from current and returns the offset from begin. In case end is reached, * it calls endReached and starts again at begin * * return: offset from begin * */ template int search_helper(const it begin, const it end, const it current, SearchFunc searchFunc, EndReached endReached) { // if current points to the last line, current will now point to end -> wrap around const auto start = (current == end) ? begin : current; auto found = std::find_if(start, end, searchFunc); if (found != end) { return std::distance(begin, found); } endReached(); found = std::find_if(begin, start, searchFunc); if (found != start) { return std::distance(begin, found); } return -1; } template int search(const it begin, const it end, int current, Direction direction, SearchFunc searchFunc, EndReached endReached) { if (begin == end) return -1; const auto size = std::distance(begin, end); current = std::clamp(current, 0, static_cast(size) - 1); const auto currentIt = begin + current; if (direction == Direction::Forward) { return search_helper(begin, end, std::next(currentIt), searchFunc, endReached); } int resultIndex = search_helper(std::make_reverse_iterator(end), std::make_reverse_iterator(begin), std::make_reverse_iterator(currentIt), searchFunc, endReached); return resultIndex != -1 ? (size - resultIndex - 1) : -1; } KDAB-hotspot-41e5de7/src/models/sourcecodemodel.cpp000066400000000000000000000214631515036260400222730ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "sourcecodemodel.h" #include #include #include #include #include #include #include #include #include #include "search.h" #include namespace { Q_LOGGING_CATEGORY(sourcecodemodel, "hotspot.sourcecodemodel", QtWarningMsg) } SourceCodeModel::SourceCodeModel(KSyntaxHighlighting::Repository* repository, QObject* parent) : QAbstractTableModel(parent) , m_highlightedText(repository) { qRegisterMetaType(); } SourceCodeModel::~SourceCodeModel() = default; void SourceCodeModel::clear() { beginResetModel(); m_validLineNumbers.clear(); m_highlightedText.setText({}); m_selfCosts = {}; m_inclusiveCosts = {}; m_mainSourceFileName.clear(); m_prettySymbol.clear(); m_startLine = 0; m_numLines = 0; m_lines.clear(); m_highlightLine = 0; endResetModel(); } void SourceCodeModel::setDisassembly(const DisassemblyOutput& disassemblyOutput, const Data::CallerCalleeResults& results) { beginResetModel(); auto guard = qScopeGuard([this]() { endResetModel(); }); m_selfCosts = {}; m_inclusiveCosts = {}; m_numLines = 0; if (disassemblyOutput.mainSourceFileName.isEmpty()) { return; } int maxLineNumber = 0; int minLineNumber = std::numeric_limits::max(); m_validLineNumbers.clear(); m_selfCosts.initializeCostsFrom(results.selfCosts); m_inclusiveCosts.initializeCostsFrom(results.inclusiveCosts); m_mainSourceFileName = disassemblyOutput.mainSourceFileName; const auto entry = results.entries.find(disassemblyOutput.symbol); for (const auto& line : disassemblyOutput.disassemblyLines) { if (line.fileLine.line == 0 || line.fileLine.file != disassemblyOutput.mainSourceFileName) { continue; } maxLineNumber = std::max(line.fileLine.line, maxLineNumber); minLineNumber = std::min(line.fileLine.line, minLineNumber); if (m_validLineNumbers.contains(line.fileLine.line)) continue; if (entry != results.entries.end()) { const auto it = entry->sourceMap.find(line.fileLine); if (it != entry->sourceMap.end()) { const auto& locationCost = it.value(); m_selfCosts.add(line.fileLine.line, locationCost.selfCost); m_inclusiveCosts.add(line.fileLine.line, locationCost.inclusiveCost); } } m_validLineNumbers.insert(line.fileLine.line); } if (maxLineNumber == 0) { qCWarning(sourcecodemodel) << "failed to parse line numbers from disassembly output"; return; } qCDebug(sourcecodemodel) << disassemblyOutput.mainSourceFileName << minLineNumber << maxLineNumber; Q_ASSERT(minLineNumber > 0); Q_ASSERT(minLineNumber < maxLineNumber); m_prettySymbol = disassemblyOutput.symbol.prettySymbol; QFile file(disassemblyOutput.realSourceFileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return; } const auto sourceCode = QString::fromUtf8(file.readAll()); m_lines = sourceCode.split(QLatin1Char('\n')); m_highlightedText.setText(m_lines); m_startLine = std::min(m_lines.size(), minLineNumber - 1); // convert to index m_numLines = std::min(m_lines.size() - m_startLine, maxLineNumber - minLineNumber + 1); // include minLineNumber } QVariant SourceCodeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (section < 0 || section >= COLUMN_COUNT + m_selfCosts.numTypes() + m_inclusiveCosts.numTypes()) return {}; if ((role != Qt::DisplayRole && role != Qt::ToolTipRole) || orientation != Qt::Horizontal) return {}; if (section == SourceCodeColumn) return tr("Source Code"); if (section == SourceCodeLineNumber) return tr("Line"); section -= COLUMN_COUNT; if (section < m_selfCosts.numTypes()) return tr("%1 (self)").arg(m_selfCosts.typeName(section)); section -= m_selfCosts.numTypes(); return tr("%1 (incl.)").arg(m_inclusiveCosts.typeName(section)); } QVariant SourceCodeModel::data(const QModelIndex& index, int role) const { if (!hasIndex(index.row(), index.column(), index.parent())) return {}; if (index.row() > m_numLines || index.row() < 0) return {}; if (role == Qt::FontRole) { if (index.column() == SourceCodeColumn) return QFontDatabase::systemFont(QFontDatabase::FixedFont); return {}; } const auto fileLine = Data::FileLine(m_mainSourceFileName, index.row() + m_startLine); if (role == FileLineRole) { return QVariant::fromValue(fileLine); } else if (role == Qt::ToolTipRole) { return Util::formatTooltip(fileLine, m_selfCosts, m_inclusiveCosts); } if (role == Qt::DisplayRole || role == CostRole || role == TotalCostRole || role == SyntaxHighlightRole) { if (index.column() == SourceCodeColumn) { if (index.row() == 0) { return m_prettySymbol; } const int lineNumber = m_startLine + index.row() - 1; if (role == SyntaxHighlightRole) { return QVariant::fromValue(m_highlightedText.lineAt(lineNumber)); } return m_highlightedText.textAt(lineNumber); } if (index.column() == SourceCodeLineNumber) { return fileLine.line; } auto cost = [role, id = index.row() + m_startLine](int type, const Data::Costs& costs) -> QVariant { const auto cost = costs.cost(type, id); const auto totalCost = costs.totalCost(type); if (role == CostRole) { return cost; } if (role == TotalCostRole) { return totalCost; } if (!cost) return {}; return Util::formatCostRelative(cost, totalCost, true); }; auto column = index.column() - COLUMN_COUNT; if (column < m_selfCosts.numTypes()) return cost(column, m_selfCosts); return cost(column - m_selfCosts.numTypes(), m_inclusiveCosts); } else if (role == HighlightRole) { return index.row() + m_startLine == m_highlightLine; } else if (role == RainbowLineNumberRole) { const auto line = index.row() + m_startLine; if (m_validLineNumbers.contains(line)) return line; return -1; } return {}; } int SourceCodeModel::columnCount(const QModelIndex& parent) const { return parent.isValid() ? 0 : COLUMN_COUNT + m_selfCosts.numTypes() + m_inclusiveCosts.numTypes(); } int SourceCodeModel::rowCount(const QModelIndex& parent) const { // don't show the function name, when we have no source code if (m_numLines == 0) return 0; // 1 line for the function name + source codes lines return parent.isValid() ? 0 : m_numLines + 1; } void SourceCodeModel::updateHighlighting(int line) { m_highlightLine = line; emit dataChanged(createIndex(0, Columns::SourceCodeColumn), createIndex(rowCount(), Columns::SourceCodeColumn)); } Data::FileLine SourceCodeModel::fileLineForIndex(const QModelIndex& index) const { if (!index.isValid()) return {}; return {m_mainSourceFileName, index.row() + m_startLine}; } QModelIndex SourceCodeModel::indexForFileLine(const Data::FileLine& fileLine) const { if (fileLine.file != m_mainSourceFileName || fileLine.line < m_startLine || fileLine.line > m_startLine + m_numLines) return {}; return index(fileLine.line - m_startLine, 0); } void SourceCodeModel::setSysroot(const QString& sysroot) { m_sysroot = sysroot; } void SourceCodeModel::find(const QString& search, Direction direction, int current) { auto searchFunc = [&search](const QString& line) { return line.indexOf(search, 0, Qt::CaseInsensitive) != -1; }; auto endReached = [this] { emit searchEndReached(); }; const int resultIndex = ::search(m_lines.cbegin() + m_startLine, m_lines.cbegin() + m_startLine + m_numLines, current, direction, searchFunc, endReached); if (resultIndex >= 0) { emit resultFound(createIndex(resultIndex + 1, SourceCodeColumn)); } else { emit resultFound({}); } } void SourceCodeModel::scrollToLine(const QString& lineNumber) { const auto line = lineNumber.toInt(); const auto offset = index(0, SourceCodeModel::SourceCodeLineNumber).data().value(); auto scrollToIndex = std::clamp(line - offset, 0, rowCount() - 1); emit resultFound(index(scrollToIndex, 0)); } KDAB-hotspot-41e5de7/src/models/sourcecodemodel.h000066400000000000000000000045051515036260400217360ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "data.h" #include "disassemblyoutput.h" #include "highlightedtext.h" #include #include #include namespace KSyntaxHighlighting { class Repository; class Definition; } enum class Direction; Q_DECLARE_METATYPE(QTextLine) class SourceCodeModel : public QAbstractTableModel { Q_OBJECT public: explicit SourceCodeModel(KSyntaxHighlighting::Repository* repository, QObject* parent = nullptr); ~SourceCodeModel() override; void clear(); void setDisassembly(const DisassemblyOutput& disassemblyOutput, const Data::CallerCalleeResults& results); int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Data::FileLine fileLineForIndex(const QModelIndex& index) const; QModelIndex indexForFileLine(const Data::FileLine& line) const; HighlightedText* highlightedText() { return &m_highlightedText; } enum Columns { SourceCodeLineNumber, SourceCodeColumn, COLUMN_COUNT }; enum CustomRoles { RainbowLineNumberRole = Qt::UserRole, HighlightRole, CostRole, TotalCostRole, SyntaxHighlightRole, FileLineRole, }; signals: void resultFound(const QModelIndex& index); void searchEndReached(); public slots: void updateHighlighting(int line); void setSysroot(const QString& sysroot); void find(const QString& search, Direction direction, int current); void scrollToLine(const QString& lineNumber); private: QString m_sysroot; QSet m_validLineNumbers; HighlightedText m_highlightedText; Data::Costs m_selfCosts; Data::Costs m_inclusiveCosts; QString m_mainSourceFileName; QString m_prettySymbol; int m_startLine = 0; int m_numLines = 0; QStringList m_lines; int m_highlightLine = 0; }; KDAB-hotspot-41e5de7/src/models/timeaxisheaderview.cpp000066400000000000000000000171451515036260400230100ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Koen Poppe SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "timeaxisheaderview.h" #include #include #include #include #include "../util.h" #include "eventmodel.h" #include "filterandzoomstack.h" #include #include #include #include namespace { auto xForTimeFactory(Data::TimeRange timeRange, Data::TimeRange zoomTime, int width, int pos) { const double oneNanoSecond = 1.0e-9; const double start = (zoomTime.start - timeRange.start) * oneNanoSecond; const double end = (zoomTime.end - timeRange.start) * oneNanoSecond; const double resolution = (end - start) / width; return [pos, start, resolution](double time) { return pos + static_cast(std::round((time - start) / resolution)); }; } } TimeAxisHeaderView::TimeAxisHeaderView(const FilterAndZoomStack* filterAndZoomStack, QWidget* parent) : QHeaderView(Qt::Horizontal, parent) , m_filterAndZoomStack(filterAndZoomStack) { setMinimumHeight((3 * fontMetrics().height()) + s_tickHeight); setStretchLastSection(true); connect(filterAndZoomStack, &FilterAndZoomStack::filterChanged, this, &TimeAxisHeaderView::emitHeaderDataChanged); connect(filterAndZoomStack, &FilterAndZoomStack::zoomChanged, this, &TimeAxisHeaderView::emitHeaderDataChanged); } void TimeAxisHeaderView::setTimeRange(Data::TimeRange timeRange) { m_timeRange = timeRange; emitHeaderDataChanged(); } void TimeAxisHeaderView::emitHeaderDataChanged() { headerDataChanged(this->orientation(), EventModel::EventsColumn, EventModel::EventsColumn); } bool TimeAxisHeaderView::event(QEvent* event) { if (event->type() == QEvent::ToolTip) { auto helpEvent = static_cast(event); auto zoomTime = m_filterAndZoomStack->zoom().time; if (!zoomTime.isValid()) zoomTime = m_timeRange; // full const auto xForTime = xForTimeFactory(m_timeRange, zoomTime, sectionSize(EventModel::EventsColumn), sectionPosition(EventModel::EventsColumn)); const auto oneNanoSecond = 1e-9; for (const auto& tracepoint : std::as_const(m_tracepoints.tracepoints)) { if (zoomTime.contains(tracepoint.time)) { if (helpEvent->pos().x() == xForTime((tracepoint.time - m_timeRange.start) * oneNanoSecond)) { QToolTip::showText(helpEvent->globalPos(), tracepoint.name, this); return true; } } } QToolTip::hideText(); event->ignore(); return true; } return QHeaderView::event(event); } void TimeAxisHeaderView::setTracepoints(const Data::TracepointResults& tracepoints) { m_tracepoints = tracepoints; update(); } void TimeAxisHeaderView::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const { if (painter == nullptr) return; // Draw the default header view (background, title, sort indicator) painter->save(); QHeaderView::paintSection(painter, rect, logicalIndex); painter->restore(); if (logicalIndex != EventModel::EventsColumn) return; // Setup the tick labels auto zoomTime = m_filterAndZoomStack->zoom().time; if (!zoomTime.isValid()) zoomTime = m_timeRange; // full if (!zoomTime.isValid()) return; // bailing out, no valid range to show const double oneNanoSecond = 1.0e-9; const double start = (zoomTime.start - m_timeRange.start) * oneNanoSecond; const double end = (zoomTime.end - m_timeRange.start) * oneNanoSecond; const auto xForTime = xForTimeFactory(m_timeRange, zoomTime, sectionSize(EventModel::EventsColumn), sectionPosition(EventModel::EventsColumn)); const int fontSize = painter->fontMetrics().height(); const int startY = rect.height() - s_tickHeight - (2 * fontSize); // Width of a tick label that is prefixed, this is at most 4 digits plus an SI prefix. // This includes a minus sign for ticks to the left of the prefix value const int maxPrefixedLabelWidth = painter->fontMetrics().horizontalAdvance(QStringLiteral("-xXXXms")); const int targetNbTicks = rect.width() / maxPrefixedLabelWidth; const PrefixTickLabels pfl(start, end, targetNbTicks, QStringLiteral("s")); const QColor tickColor = palette().windowText().color(); const QColor prefixedColor = palette().highlight().color(); if (!m_tracepoints.tracepoints.isEmpty()) { const auto scheme = KColorScheme(palette().currentColorGroup()); const auto tracepointPen = QPen(scheme.foreground(KColorScheme::LinkText), 1); painter->setPen(tracepointPen); for (const auto& tracepoint : m_tracepoints.tracepoints) { if (!zoomTime.contains(tracepoint.time)) continue; const auto x = xForTime((tracepoint.time - m_timeRange.start) * oneNanoSecond); painter->drawLine(x, rect.height() / 2, x, rect.height()); } } // Draw the long prefix tick and its label if (pfl.hasPrefix()) { const auto placeholder = QStringLiteral("xxx"); const int prefixWidth = painter->fontMetrics().horizontalAdvance(pfl.prefixLabel(placeholder)); const int prefixCenter = xForTime(pfl.prefixValue()); QRect placeHolderRect(prefixCenter - (prefixWidth / 2), startY, prefixWidth, fontSize); if (placeHolderRect.x() < rect.x()) placeHolderRect.translate(rect.x() - placeHolderRect.x(), 0); // Leading QRect bounding; painter->setPen(tickColor); painter->drawText(placeHolderRect, Qt::AlignBottom | Qt::AlignLeft, pfl.prefixLabelLeading(), &bounding); placeHolderRect.translate(bounding.width(), 0); // Placeholder painter->setPen(prefixedColor); painter->drawText(placeHolderRect, Qt::AlignBottom | Qt::AlignLeft, placeholder, &bounding); placeHolderRect.translate(bounding.width(), 0); // Trailing painter->setPen(tickColor); painter->drawText(placeHolderRect, Qt::AlignBottom | Qt::AlignLeft, pfl.prefixLabelTrailing(), &bounding); painter->setPen(prefixedColor); } else { painter->setPen(tickColor); } // Draw the regular ticks and their labels for (const auto& tickAndLabel : pfl.ticksAndLabel()) { const auto x = xForTime(tickAndLabel.first); if (pfl.hasPrefix() && std::abs(tickAndLabel.first - pfl.prefixValue()) < oneNanoSecond) { painter->setPen(tickColor); painter->drawLine(x, startY + fontSize, x, rect.y() + rect.height()); painter->setPen(prefixedColor); } else { // Keep text within the header Qt::Alignment hAlignment = Qt::AlignCenter; QRect labelRect(x - (maxPrefixedLabelWidth / 2), startY + fontSize, maxPrefixedLabelWidth, fontSize); if (labelRect.x() < rect.x()) { labelRect.translate(rect.x() - labelRect.x(), 0); hAlignment = Qt::AlignLeft; } if (labelRect.right() > rect.right()) { labelRect.translate(rect.right() - labelRect.right(), 0); hAlignment = Qt::AlignRight; } painter->drawText(labelRect, hAlignment | Qt::AlignBottom, tickAndLabel.second); painter->drawLine(x, labelRect.y() + fontSize, x, labelRect.y() + rect.height()); } } } KDAB-hotspot-41e5de7/src/models/timeaxisheaderview.h000066400000000000000000000020271515036260400224460ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Koen Poppe SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "data.h" class FilterAndZoomStack; class QEvent; class TimeAxisHeaderView : public QHeaderView { Q_OBJECT public: explicit TimeAxisHeaderView(const FilterAndZoomStack* filterAndZoomStack, QWidget* parent = nullptr); static const int s_tickHeight = 4; public: void setTimeRange(Data::TimeRange timeRange); void setTracepoints(const Data::TracepointResults& tracepoints); protected slots: void emitHeaderDataChanged(); bool event(QEvent* event) override; private: Data::TimeRange m_timeRange; Data::TracepointResults m_tracepoints; const FilterAndZoomStack* m_filterAndZoomStack = nullptr; protected: void paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const override; }; KDAB-hotspot-41e5de7/src/models/timelinedelegate.cpp000066400000000000000000000653041515036260400224220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "timelinedelegate.h" #include #include #include #include #include #include #include #include "../util.h" #include "eventmodel.h" #include "filterandzoomstack.h" #include #include #include namespace { QPoint globalPos(const QMouseEvent* event) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) return event->globalPos(); #else return event->globalPosition().toPoint(); #endif } } TimeLineData::TimeLineData(Data::Events events, quint64 maxCost, Data::TimeRange time, Data::TimeRange threadTime, QRect rect) : events(std::move(events)) , maxCost(maxCost) , time(time) , threadTime(threadTime) , h(rect.height() - (2 * padding)) , w(rect.width() - (2 * padding)) , xMultiplicator(double(w) / time.delta()) , yMultiplicator(double(h) / maxCost) { } int TimeLineData::mapTimeToX(quint64 t) const { return time.start > t ? 0 : int(double(t - time.start) * xMultiplicator); } quint64 TimeLineData::mapXToTime(int x) const { return quint64(double(x) / xMultiplicator) + time.start; } int TimeLineData::mapCostToY(quint64 cost) const { return double(cost) * yMultiplicator; } void TimeLineData::zoom(Data::TimeRange t) { time = t; xMultiplicator = double(w) / time.delta(); } template void TimeLineData::findSamples(int mappedX, int costType, int lostEventCostId, bool contains, Data::Events::const_iterator start, const Callback& callback) const { if (events.isEmpty()) { return; } auto it = start; if (contains) { // for a contains check, we must only include events for the correct type // otherwise we might skip the sched switch e.g. while (it->type != costType && it != events.constBegin()) { --it; } } while (it != events.constEnd()) { const auto isLost = it->type == lostEventCostId; if (it->type != costType && !isLost) { ++it; continue; } const auto timeX = mapTimeToX(it->time); if (timeX > mappedX) { // event lies to the right of the selected time break; } else if ((contains && mappedX > mapTimeToX(it->time + it->cost)) || (!contains && timeX < mappedX)) { // event lies to the left of the selected time ++it; continue; } Q_ASSERT(contains || mappedX == timeX); callback(*it, isLost); ++it; } } namespace { QColor toHoverColor(QColor color) { color.setAlphaF(0.5); return color; } TimeLineData dataFromIndex(const QModelIndex& index, QRect rect, Data::ZoomAction zoom) { TimeLineData data( index.data(EventModel::EventsRole).value(), index.data(EventModel::MaxCostRole).value(), {index.data(EventModel::MinTimeRole).value(), index.data(EventModel::MaxTimeRole).value()}, {index.data(EventModel::ThreadStartRole).value(), index.data(EventModel::ThreadEndRole).value()}, rect); if (zoom.isValid()) { data.zoom(zoom.time); } return data; } Data::Events::const_iterator findEvent(Data::Events::const_iterator begin, Data::Events::const_iterator end, quint64 time) { auto byTime = [](const Data::Event& event, quint64 time) { return event.time < time; }; auto it = std::lower_bound(begin, end, time, byTime); // it points to the first item for which our predicate returns false, we want to find the item before that // so decrement it if possible or return begin otherwise // if only one event is recorded, it will point to end it->time which will cause asan to complain return (it == begin || (it != end && it->time == time)) ? it : (it - 1); } } TimeLineDelegate::TimeLineDelegate(FilterAndZoomStack* filterAndZoomStack, QAbstractItemView* view, QObject* parent) : QStyledItemDelegate(parent) , m_filterAndZoomStack(filterAndZoomStack) , m_view(view) { m_view->viewport()->installEventFilter(this); m_view->viewport()->setAttribute(Qt::WA_Hover); connect(filterAndZoomStack, &FilterAndZoomStack::filterChanged, this, &TimeLineDelegate::updateView); connect(filterAndZoomStack, &FilterAndZoomStack::zoomChanged, this, &TimeLineDelegate::updateZoomState); } TimeLineDelegate::~TimeLineDelegate() = default; void TimeLineDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { const auto data = dataFromIndex(index, option.rect, m_filterAndZoomStack->zoom()); const auto results = index.data(EventModel::EventResultsRole).value(); const auto offCpuCostId = results.offCpuTimeCostId; const auto lostEventCostId = results.lostEventCostId; const bool is_alternate = option.features & QStyleOptionViewItem::Alternate; const auto& palette = option.palette; painter->fillRect(option.rect, is_alternate ? palette.base() : palette.alternateBase()); // skip threads that are outside the visible (zoomed) region painter->save(); // transform into target coordinate system painter->translate(option.rect.topLeft()); // account for padding painter->translate(TimeLineData::padding, TimeLineData::padding); // visualize the time where the thread was active // i.e. paint events for threads that have any in the selected time range auto threadTimeRect = QRect(QPoint(data.mapTimeToX(data.threadTime.start), 0), QPoint(data.mapTimeToX(data.threadTime.end), data.h)); if (threadTimeRect.left() < option.rect.width() && threadTimeRect.right() > 0) { if (threadTimeRect.left() < 0) threadTimeRect.setLeft(0); if (threadTimeRect.right() > option.rect.width()) threadTimeRect.setRight(option.rect.width()); const auto scheme = KColorScheme(palette.currentColorGroup()); auto runningColor = scheme.background(KColorScheme::PositiveBackground).color(); runningColor.setAlpha(128); auto runningOutlineColor = scheme.foreground(KColorScheme::PositiveText).color(); runningOutlineColor.setAlpha(128); painter->setBrush(QBrush(runningColor)); painter->setPen(QPen(runningOutlineColor, 1)); painter->drawRect(threadTimeRect.adjusted(-1, -1, 0, 0)); // visualize all events painter->setBrush(QBrush()); if (offCpuCostId != -1) { const auto offCpuColor = scheme.background(KColorScheme::NegativeBackground).color(); const auto offCpuColorSelected = scheme.foreground(KColorScheme::NegativeText).color(); const auto offCpuColorHovered = toHoverColor(offCpuColorSelected); for (const auto& event : data.events) { if (event.type != offCpuCostId) { continue; } const auto x = data.mapTimeToX(event.time); const auto x2 = data.mapTimeToX(event.time + event.cost); const auto& color = m_selectedStacks.contains(event.stackId) ? offCpuColorSelected : (m_hoveredStacks.contains(event.stackId) ? offCpuColorHovered : offCpuColor); painter->fillRect(x, 0, x2 - x, data.h, color); } } const auto selectedPen = QPen(scheme.foreground(KColorScheme::ActiveText), 1); const auto hoveredPen = QPen(toHoverColor(selectedPen.color()), 1); const auto eventPen = QPen(scheme.foreground(KColorScheme::NeutralText), 1); const auto lostEventPen = QPen(scheme.foreground(KColorScheme::NegativeText), 1); int last_x = -1; // TODO: accumulate cost for events that fall to the same pixel somehow // but how to then sync the y scale across different delegates? // somehow deduce threshold via min time delta and max cost? // TODO: how to deal with broken cycle counts in frequency mode? For now, // we simply always fill the complete height which is also what we'd get // from a graph in count mode (perf record -F vs. perf record -c) // see also: https://www.spinics.net/lists/linux-perf-users/msg03486.html for (const auto& event : data.events) { const auto isLostEvent = event.type == lostEventCostId; if (event.type != m_eventType && !isLostEvent) { continue; } const auto x = data.mapTimeToX(event.time); if (x < TimeLineData::padding || x >= data.w) { continue; } // only draw a line when it changes anything visually // but always force drawing of lost events if (x != last_x || isLostEvent) { if (isLostEvent) painter->setPen(lostEventPen); else if (m_selectedStacks.contains(event.stackId)) painter->setPen(selectedPen); else if (m_hoveredStacks.contains(event.stackId)) painter->setPen(hoveredPen); else painter->setPen(eventPen); painter->drawLine(x, 0, x, data.h); } last_x = x; } } if (m_timeSlice.isValid()) { // the painter is translated to option.rect.topLeft // clamp to available width to prevent us from painting over the other columns const auto startX = std::max(data.mapTimeToX(m_timeSlice.normalized().start), 0); const auto endX = std::min(data.mapTimeToX(m_timeSlice.normalized().end), data.w); // undo vertical padding manually to fill complete height const auto timeSlice = QRect(startX, -TimeLineData::padding, endX - startX, option.rect.height()); auto brush = palette.highlight(); auto color = brush.color(); color.setAlpha(128); brush.setColor(color); painter->fillRect(timeSlice, brush); } painter->restore(); } bool TimeLineDelegate::helpEvent(QHelpEvent* event, QAbstractItemView* view, const QStyleOptionViewItem& option, const QModelIndex& index) { if (event->type() == QEvent::ToolTip) { const auto data = dataFromIndex(index, option.rect, m_filterAndZoomStack->zoom()); const auto localX = event->pos().x(); const auto mappedX = localX - option.rect.x() - TimeLineData::padding; const auto time = data.mapXToTime(mappedX); const auto start = findEvent(data.events.constBegin(), data.events.constEnd(), time); const auto results = index.data(EventModel::EventResultsRole).value(); // find the maximum sample cost in the range spanned by one pixel struct FoundSamples { uint numSamples = 0; uint numLost = 0; quint64 maxCost = 0; quint64 totalCost = 0; quint64 totalLost = 0; int type = -1; }; auto findSamples = [&](int costType, bool contains) -> FoundSamples { FoundSamples ret; ret.type = costType; data.findSamples(mappedX, costType, results.lostEventCostId, contains, start, [&ret](const Data::Event& event, bool isLost) { if (isLost) { ++ret.numLost; ret.totalLost += event.cost; } else { ++ret.numSamples; ret.maxCost = std::max(ret.maxCost, event.cost); ret.totalCost += event.cost; } }); return ret; }; auto found = findSamples(m_eventType, false); if (results.offCpuTimeCostId != -1 && !found.numSamples && !found.numLost) { // check whether we are hovering an off-CPU area found = findSamples(results.offCpuTimeCostId, true); } const auto appStartTime = index.data(EventModel::ApplicationStartTimeRole).value(); const auto formattedTime = Util::formatTimeString(time - appStartTime); const auto totalCosts = index.data(EventModel::TotalCostsRole).value>(); if (found.numLost > 0) { QToolTip::showText( event->globalPos(), tr("time: %1\nlost chunks: %2\nlost events: %3") .arg(formattedTime, QString::number(found.numLost), QString::number(found.totalLost)), view); } else if (found.numSamples > 0 && found.type == results.offCpuTimeCostId) { QToolTip::showText(event->globalPos(), tr("time: %1\nsched switches: %2\ntotal off-CPU time: %3\nlongest sched switch: %4") .arg(formattedTime, QString::number(found.numSamples), Util::formatTimeString(found.totalCost), Util::formatTimeString(found.maxCost)), view); } else if (found.numSamples > 0) { QToolTip::showText(event->globalPos(), tr("time: %1\n%5 samples: %2\ntotal sample cost: %3\nmax sample cost: %4") .arg(formattedTime, QString::number(found.numSamples), Util::formatCost(found.totalCost), Util::formatCost(found.maxCost), totalCosts.value(found.type).label), view); } else { QToolTip::showText(event->globalPos(), tr("time: %1 (no %2 samples)").arg(formattedTime, totalCosts.value(m_eventType).label), view); } return true; } return QStyledItemDelegate::helpEvent(event, view, option, index); } bool TimeLineDelegate::eventFilter(QObject* watched, QEvent* event) { const bool isButtonRelease = event->type() == QEvent::MouseButtonRelease; const bool isButtonPress = event->type() == QEvent::MouseButtonPress; const bool isMove = event->type() == QEvent::MouseMove; const bool isHover = event->type() == QEvent::HoverEnter || event->type() == QEvent::HoverMove || event->type() == QEvent::HoverLeave; if (!isButtonRelease && !isButtonPress && !isMove && !isHover) { return QStyledItemDelegate::eventFilter(watched, event); } if (watched != m_view->viewport() || !m_view->isEnabled()) { return QStyledItemDelegate::eventFilter(watched, event); } #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) const auto pos = isHover ? static_cast(event)->pos() : static_cast(event)->localPos(); #else const auto pos = isHover ? static_cast(event)->position() : static_cast(event)->position(); #endif // the pos may lay outside any valid index, but for the code below we need // to query for some values that require any valid index. use the first rows index const auto alwaysValidIndex = m_view->model()->index(0, EventModel::EventsColumn); const auto visualRect = m_view->visualRect(alwaysValidIndex); const bool inEventsColumn = visualRect.left() < pos.x(); const auto zoom = m_filterAndZoomStack->zoom(); const auto filter = m_filterAndZoomStack->filter(); const bool isZoomed = zoom.isValid(); const bool isFiltered = filter.isValid(); if (isHover) { QSet stacks; stacks.reserve(m_hoveredStacks.size()); if (inEventsColumn && event->type() != QEvent::HoverLeave) { const auto results = alwaysValidIndex.data(EventModel::EventResultsRole).value(); const auto data = dataFromIndex(m_view->indexAt(pos.toPoint()), visualRect, zoom); const auto hoverX = pos.x() - visualRect.left() - TimeLineData::padding; const auto time = data.mapXToTime(pos.x() - visualRect.left() - TimeLineData::padding); const auto start = findEvent(data.events.constBegin(), data.events.constEnd(), time); auto findSamples = [&](int costType, bool contains) { bool foundAny = false; data.findSamples(hoverX, costType, results.lostEventCostId, contains, start, [&](const Data::Event& event, bool isLost) { foundAny = true; if (isLost || event.stackId == -1) return; stacks.insert(event.stackId); }); return foundAny; }; auto found = findSamples(m_eventType, false); if (!found && results.offCpuTimeCostId != -1) { // check whether we are hovering an off-CPU area found = findSamples(results.offCpuTimeCostId, true); } Q_UNUSED(found); } if (stacks != m_hoveredStacks) { m_hoveredStacks = stacks; emit stacksHovered(stacks); updateView(); } return true; } const auto* mouseEvent = static_cast(event); const bool isLeftButtonEvent = mouseEvent->button() == Qt::LeftButton || mouseEvent->buttons() == Qt::LeftButton; const bool isRightButtonEvent = mouseEvent->button() == Qt::RightButton || mouseEvent->buttons() == Qt::RightButton; if (isLeftButtonEvent && inEventsColumn) { const auto data = dataFromIndex(alwaysValidIndex, visualRect, zoom); const auto time = data.mapXToTime(pos.x() - visualRect.left() - TimeLineData::padding); if (isButtonPress) { m_timeSlice.start = time; } m_timeSlice.end = time; // trigger an update of the viewport, to ensure our paint method gets called again updateView(); } const bool isTimeSpanSelected = !m_timeSlice.isEmpty(); const auto index = m_view->indexAt(pos.toPoint()); const bool haveContextInfo = index.isValid() || isZoomed || isFiltered; const bool showContextMenu = isButtonRelease && ((isRightButtonEvent && haveContextInfo) || (isLeftButtonEvent && isTimeSpanSelected)) && index.isValid() && index.parent().isValid(); // don't show context menu on the top most categories (CPUs / Processes) const auto timeSlice = m_timeSlice.normalized(); if (showContextMenu) { auto contextMenu = new QMenu(m_view->viewport()); contextMenu->setAttribute(Qt::WA_DeleteOnClose, true); const auto minTime = index.data(EventModel::MinTimeRole).value(); const auto maxTime = index.data(EventModel::MaxTimeRole).value(); const auto threadStartTime = index.data(EventModel::ThreadStartRole).value(); const auto threadEndTime = index.data(EventModel::ThreadEndRole).value(); const auto processId = index.data(EventModel::ProcessIdRole).value(); const auto threadId = index.data(EventModel::ThreadIdRole).value(); const auto numProcesses = index.data(EventModel::NumProcessesRole).value(); const auto numThreads = index.data(EventModel::NumThreadsRole).value(); const auto isMainThread = threadStartTime == minTime && threadEndTime == maxTime; const auto cpuId = index.data(EventModel::CpuIdRole).value(); const auto numCpus = index.data(EventModel::NumCpusRole).value(); if (isTimeSpanSelected && (minTime != timeSlice.start || maxTime != timeSlice.end)) { contextMenu->addAction(QIcon::fromTheme(QStringLiteral("zoom-in")), tr("Zoom In On Selection"), this, [this, timeSlice]() { m_filterAndZoomStack->zoomIn(timeSlice); }); } if (isRightButtonEvent && index.isValid() && threadStartTime != threadEndTime && numThreads > 1 && threadId != Data::INVALID_TID && ((!isZoomed && !isMainThread) || (isZoomed && zoom.time.start != threadStartTime && zoom.time.end != threadEndTime))) { contextMenu->addAction(QIcon::fromTheme(QStringLiteral("zoom-in")), tr("Zoom In On Thread #%1 By Time").arg(threadId), this, [this, threadStartTime, threadEndTime]() { m_filterAndZoomStack->zoomIn({threadStartTime, threadEndTime}); }); } if (isRightButtonEvent && isZoomed) { contextMenu->addAction(m_filterAndZoomStack->actions().zoomOut); contextMenu->addAction(m_filterAndZoomStack->actions().resetZoom); } contextMenu->addSeparator(); if (isTimeSpanSelected && (!isFiltered || filter.time.end != timeSlice.start || filter.time.end != timeSlice.end)) { contextMenu->addAction(QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Filter In On Selection"), this, [this, timeSlice]() { m_filterAndZoomStack->filterInByTime(timeSlice); }); } if (isRightButtonEvent && index.isValid() && numThreads > 1 && threadId != Data::INVALID_TID) { if ((!isFiltered && !isMainThread) || (isFiltered && filter.time.end != threadStartTime && filter.time.end != threadEndTime)) { auto action = contextMenu->addAction( QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Filter By Time Of Thread #%1").arg(threadId), this, [this, threadStartTime, threadEndTime]() { m_filterAndZoomStack->filterInByTime({threadStartTime, threadEndTime}); }); action->setToolTip(tr("Filter by time, from the start to the end of this thread. All other threads " "will still be visible.")); } if ((!isFiltered || filter.threadId == Data::INVALID_TID)) { contextMenu->addAction(QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Filter In On Thread #%1").arg(threadId), this, [this, threadId]() { m_filterAndZoomStack->filterInByThread(threadId); }); contextMenu->addAction(QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Exclude Thread #%1").arg(threadId), this, [this, threadId]() { m_filterAndZoomStack->filterOutByThread(threadId); }); } if (numProcesses > 1 && (!isFiltered || (filter.processId == Data::INVALID_PID && filter.threadId == Data::INVALID_TID))) { contextMenu->addAction(QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Filter In On Process #%1").arg(processId), this, [this, processId]() { m_filterAndZoomStack->filterInByProcess(processId); }); contextMenu->addAction(QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Exclude Process #%1").arg(processId), this, [this, processId]() { m_filterAndZoomStack->filterOutByProcess(processId); }); } } if (isRightButtonEvent && index.isValid() && cpuId != Data::INVALID_CPU_ID && numCpus > 1 && (!isFiltered || filter.cpuId != cpuId)) { contextMenu->addAction(QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Filter In On CPU #%1").arg(cpuId), this, [this, cpuId]() { m_filterAndZoomStack->filterInByCpu(cpuId); }); contextMenu->addAction(QIcon::fromTheme(QStringLiteral("kt-add-filters")), tr("Exclude CPU #%1").arg(cpuId), this, [this, cpuId]() { m_filterAndZoomStack->filterOutByCpu(cpuId); }); } if (isRightButtonEvent && isFiltered) { contextMenu->addAction(m_filterAndZoomStack->actions().filterOut); contextMenu->addAction(m_filterAndZoomStack->actions().resetFilter); } if (isRightButtonEvent && (isFiltered || isZoomed)) { contextMenu->addSeparator(); contextMenu->addAction(m_filterAndZoomStack->actions().resetFilterAndZoom); } contextMenu->popup(globalPos(mouseEvent)); return true; } else if (isTimeSpanSelected && isLeftButtonEvent) { const auto& data = alwaysValidIndex.data(EventModel::EventResultsRole).value(); const auto timeDelta = timeSlice.delta(); quint64 cost = 0; quint64 numEvents = 0; QSet threads; QSet processes; for (const auto& thread : data.threads) { const auto start = findEvent(thread.events.begin(), thread.events.end(), timeSlice.start); const auto end = findEvent(start, thread.events.end(), timeSlice.end); if (start != end) { threads.insert(thread.tid); processes.insert(thread.pid); } for (auto it = start; it != end; ++it) { if (it->type != m_eventType) { continue; } cost += it->cost; ++numEvents; } } QToolTip::showText(globalPos(mouseEvent), tr("ΔT: %1\n" "Events: %2 (%3) from %4 thread(s), %5 process(es)\n" "sum of %6: %7 (%8)") .arg(Util::formatTimeString(timeDelta), Util::formatCost(numEvents), Util::formatFrequency(numEvents, timeDelta), QString::number(threads.size()), QString::number(processes.size()), data.totalCosts.value(m_eventType).label, Util::formatCost(cost), Util::formatFrequency(cost, timeDelta)), m_view); } return QStyledItemDelegate::eventFilter(watched, event); } void TimeLineDelegate::setEventType(int type) { m_eventType = type; updateView(); } void TimeLineDelegate::setSelectedStacks(const QSet& selectedStacks) { m_selectedStacks = selectedStacks; updateView(); } void TimeLineDelegate::updateView() { m_view->viewport()->update(); } void TimeLineDelegate::updateZoomState() { m_timeSlice = {}; updateView(); } KDAB-hotspot-41e5de7/src/models/timelinedelegate.h000066400000000000000000000042301515036260400220560ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include "data.h" class QAbstractItemView; class QAction; class FilterAndZoomStack; struct TimeLineData { TimeLineData() = default; TimeLineData(Data::Events events, quint64 maxCost, Data::TimeRange time, Data::TimeRange threadTime, QRect rect); int mapTimeToX(quint64 time) const; quint64 mapXToTime(int x) const; int mapCostToY(quint64 cost) const; void zoom(Data::TimeRange time); template void findSamples(int mappedX, int costType, int lostEventCostId, bool contains, Data::Events::const_iterator start, const Callback& callback) const; static const constexpr int padding = 2; Data::Events events; quint64 maxCost = 0; Data::TimeRange time; Data::TimeRange threadTime; int h = 0; int w = 0; double xMultiplicator = 0; double yMultiplicator = 0; }; Q_DECLARE_METATYPE(TimeLineData) class TimeLineDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit TimeLineDelegate(FilterAndZoomStack* filterAndZoomStack, QAbstractItemView* view, QObject* parent); virtual ~TimeLineDelegate(); void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; bool helpEvent(QHelpEvent* event, QAbstractItemView* view, const QStyleOptionViewItem& option, const QModelIndex& index) override; void setEventType(int type); void setSelectedStacks(const QSet& selectedStacks); signals: void stacksHovered(const QSet& stacks); protected: bool eventFilter(QObject* watched, QEvent* event) override; private: void updateView(); void updateZoomState(); FilterAndZoomStack* m_filterAndZoomStack = nullptr; QAbstractItemView* m_view = nullptr; Data::TimeRange m_timeSlice; QSet m_selectedStacks; QSet m_hoveredStacks; int m_eventType = 0; }; KDAB-hotspot-41e5de7/src/models/topproxy.cpp000066400000000000000000000030071515036260400210150ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "topproxy.h" #include "treemodel.h" TopProxy::TopProxy(QObject* parent) : QSortFilterProxyModel(parent) , m_costColumn(BottomUpModel::InitialSortColumn) , m_numBaseColumns(BottomUpModel::NUM_BASE_COLUMNS) { sort(m_costColumn, Qt::DescendingOrder); setSortRole(AbstractTreeModel::SortRole); } TopProxy::~TopProxy() = default; void TopProxy::setCostColumn(int costColumn) { m_costColumn = costColumn; invalidate(); sort(m_costColumn, Qt::DescendingOrder); } void TopProxy::setNumBaseColumns(int numBaseColumns) { m_numBaseColumns = numBaseColumns; invalidate(); } int TopProxy::rowCount(const QModelIndex& parent) const { if (parent.isValid() || !sourceModel()) { return 0; // this is not a tree } return std::min(5, QSortFilterProxyModel::rowCount(parent)); } bool TopProxy::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { if (source_parent.isValid()) { return false; } if (!sourceModel()->index(source_row, m_costColumn, source_parent).data(sortRole()).value()) { return false; } return true; } bool TopProxy::filterAcceptsColumn(int source_column, const QModelIndex& /*source_parent*/) const { return source_column < m_numBaseColumns || source_column == m_costColumn; } KDAB-hotspot-41e5de7/src/models/topproxy.h000066400000000000000000000014641515036260400204670ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include class TopProxy : public QSortFilterProxyModel { Q_OBJECT public: explicit TopProxy(QObject* parent = nullptr); ~TopProxy() override; void setCostColumn(int costColumn); void setNumBaseColumns(int numBaseColumns); bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; bool filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const override; int rowCount(const QModelIndex& parent = {}) const override; private: int m_costColumn; int m_numBaseColumns; }; KDAB-hotspot-41e5de7/src/models/treemodel.cpp000066400000000000000000000223041515036260400210720ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "treemodel.h" #include "../settings.h" #include "../util.h" AbstractTreeModel::AbstractTreeModel(QObject* parent) : QAbstractItemModel(parent) { } AbstractTreeModel::~AbstractTreeModel() = default; BottomUpModel::BottomUpModel(QObject* parent) : CostTreeModel(parent) { auto prettifySymbolsHelper = [this]() { if (rowCount() == 0) { return; } emit dataChanged(index(0, Symbol), index(rowCount() - 1, Symbol)); }; connect(Settings::instance(), &Settings::prettifySymbolsChanged, this, prettifySymbolsHelper); connect(Settings::instance(), &Settings::collapseTemplatesChanged, this, prettifySymbolsHelper); connect(Settings::instance(), &Settings::collapseDepthChanged, this, prettifySymbolsHelper); } BottomUpModel::~BottomUpModel() = default; QVariant BottomUpModel::headerColumnData(int column, int role) const { if (role == Qt::DisplayRole) { switch (column) { case Symbol: return tr("Symbol"); case Binary: return tr("Binary"); } return tr("%1 (incl.)").arg(m_results.costs.typeName(column - NUM_BASE_COLUMNS)); } else if (role == Qt::ToolTipRole) { switch (column) { case Symbol: return tr("The symbol's function name. May be empty when debug information is missing."); case Binary: return tr( "The name of the executable the symbol resides in. May be empty when debug information is missing."); } return tr("The symbol's inclusive cost of type \"%1\", i.e. the aggregated sample costs attributed to this " "symbol, both directly and indirectly.") .arg(m_results.costs.typeName(column - NUM_BASE_COLUMNS)); } else { return {}; } } QVariant BottomUpModel::rowData(const Data::BottomUp* row, int column, int role) const { if (role == Qt::DisplayRole || role == SortRole) { switch (column) { case Symbol: return Util::formatSymbol(row->symbol); case Binary: return row->symbol.binary; } if (role == SortRole) { return m_results.costs.cost(column - NUM_BASE_COLUMNS, row->id); } return Util::formatCostRelative(m_results.costs.cost(column - NUM_BASE_COLUMNS, row->id), m_results.costs.totalCost(column - NUM_BASE_COLUMNS), true); } else if (role == TotalCostRole && column >= NUM_BASE_COLUMNS) { return m_results.costs.totalCost(column - NUM_BASE_COLUMNS); } else if (role == Qt::ToolTipRole) { return Util::formatTooltip(row->id, row->symbol, m_results.costs); } else { return {}; } } int BottomUpModel::numColumns() const { return NUM_BASE_COLUMNS + m_results.costs.numTypes(); } TopDownModel::TopDownModel(QObject* parent) : CostTreeModel(parent) { auto prettifySymbolsHelper = [this]() { if (rowCount() == 0) { return; } emit dataChanged(index(0, Symbol), index(rowCount() - 1, Symbol)); }; connect(Settings::instance(), &Settings::prettifySymbolsChanged, this, prettifySymbolsHelper); connect(Settings::instance(), &Settings::collapseTemplatesChanged, this, prettifySymbolsHelper); connect(Settings::instance(), &Settings::collapseDepthChanged, this, prettifySymbolsHelper); } TopDownModel::~TopDownModel() = default; QVariant TopDownModel::headerColumnData(int column, int role) const { if (role == Qt::DisplayRole) { switch (column) { case Symbol: return tr("Symbol"); case Binary: return tr("Binary"); } column -= NUM_BASE_COLUMNS; if (column < m_results.inclusiveCosts.numTypes()) { return tr("%1 (incl.)").arg(m_results.inclusiveCosts.typeName(column)); } column -= m_results.inclusiveCosts.numTypes(); return tr("%1 (self)").arg(m_results.selfCosts.typeName(column)); } else if (role == Qt::ToolTipRole) { switch (column) { case Symbol: return tr("The symbol's function name. May be empty when debug information is missing."); case Binary: return tr( "The name of the executable the symbol resides in. May be empty when debug information is missing."); } column -= NUM_BASE_COLUMNS; if (column < m_results.inclusiveCosts.numTypes()) { return tr("The symbol's inclusive cost of type \"%1\", i.e. the aggregated sample costs attributed to this " "symbol, " "both directly and indirectly. This includes the costs of all functions called by this symbol " "plus " "its self cost.") .arg(m_results.inclusiveCosts.typeName(column)); } column -= m_results.inclusiveCosts.numTypes(); return tr("The symbol's self cost of type \"%1\", i.e. the aggregated sample costs directly attributed to this " "symbol. " "This excludes the costs of all functions called by this symbol.") .arg(m_results.selfCosts.typeName(column)); } else { return {}; } } QVariant TopDownModel::rowData(const Data::TopDown* row, int column, int role) const { if (role == Qt::DisplayRole || role == SortRole) { switch (column) { case Symbol: return Util::formatSymbol(row->symbol); case Binary: return row->symbol.binary; } column -= NUM_BASE_COLUMNS; if (column < m_results.inclusiveCosts.numTypes()) { if (role == SortRole) { return m_results.inclusiveCosts.cost(column, row->id); } return Util::formatCostRelative(m_results.inclusiveCosts.cost(column, row->id), m_results.inclusiveCosts.totalCost(column), true); } column -= m_results.inclusiveCosts.numTypes(); if (role == SortRole) { return m_results.selfCosts.cost(column, row->id); } return Util::formatCostRelative(m_results.selfCosts.cost(column, row->id), m_results.selfCosts.totalCost(column), true); } else if (role == TotalCostRole && column >= NUM_BASE_COLUMNS) { column -= NUM_BASE_COLUMNS; if (column < m_results.inclusiveCosts.numTypes()) { return m_results.inclusiveCosts.totalCost(column); } column -= m_results.inclusiveCosts.numTypes(); return m_results.selfCosts.totalCost(column); } else if (role == Qt::ToolTipRole) { return Util::formatTooltip(row->id, row->symbol, m_results.selfCosts, m_results.inclusiveCosts); } else { return {}; } } int TopDownModel::numColumns() const { return NUM_BASE_COLUMNS + m_results.selfCosts.numTypes() + m_results.inclusiveCosts.numTypes(); } int TopDownModel::selfCostColumn(int cost) const { Q_ASSERT(cost >= 0 && cost < m_results.selfCosts.numTypes()); return NUM_BASE_COLUMNS + m_results.inclusiveCosts.numTypes() + cost; } QVariant PerLibraryModel::headerColumnData(int column, int role) const { if (role == Qt::DisplayRole) { switch (column) { case Binary: return tr("Binary"); } column -= NUM_BASE_COLUMNS; if (column < m_results.costs.numTypes()) { return m_results.costs.typeName(column); } column -= m_results.costs.numTypes(); return m_results.costs.typeName(column); } else { return {}; } } QVariant PerLibraryModel::rowData(const Data::PerLibrary* row, int column, int role) const { if (role == Qt::DisplayRole || role == SortRole) { switch (column) { case Binary: return Util::formatString(row->symbol.binary); } column -= NUM_BASE_COLUMNS; if (column < m_results.costs.numTypes()) { if (role == SortRole) { return m_results.costs.cost(column, row->id); } return Util::formatCostRelative(m_results.costs.cost(column, row->id), m_results.costs.totalCost(column), true); } column -= m_results.costs.numTypes(); if (role == SortRole) { return m_results.costs.cost(column, row->id); } return Util::formatCostRelative(m_results.costs.cost(column, row->id), m_results.costs.totalCost(column), true); } else if (role == TotalCostRole && column >= NUM_BASE_COLUMNS) { column -= NUM_BASE_COLUMNS; if (column < m_results.costs.numTypes()) { return m_results.costs.totalCost(column); } column -= m_results.costs.numTypes(); return m_results.costs.totalCost(column); } else if (role == Qt::ToolTipRole) { return Util::formatBinaryTooltip(row->id, row->symbol, m_results.costs); } else { return {}; } } int PerLibraryModel::numColumns() const { return NUM_BASE_COLUMNS + m_results.costs.numTypes(); } KDAB-hotspot-41e5de7/src/models/treemodel.h000066400000000000000000000221171515036260400205410ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "data.h" class AbstractTreeModel : public QAbstractItemModel { Q_OBJECT public: explicit AbstractTreeModel(QObject* parent = nullptr); ~AbstractTreeModel(); enum Roles { SortRole = Qt::UserRole, TotalCostRole, SymbolRole }; }; template class TreeModel : public AbstractTreeModel { public: using TreeNode = TreeNode_t; TreeModel(QObject* parent = nullptr) : AbstractTreeModel(parent) { } ~TreeModel() = default; bool hasChildren(const QModelIndex& parent = {}) const final override { if (parent.column() >= 1) return false; auto item = itemFromIndex(parent); if (!item) return false; if (m_simplify && item->children.size() == 1 && item->parent && item->parent->children.size() == 1) return false; return item && !item->children.isEmpty(); } int rowCount(const QModelIndex& parent = {}) const final override { if (parent.column() >= 1) { return 0; } else if (auto item = itemFromIndex(parent)) { if (!m_simplify || item == rootItem() || item->children.size() != 1) { return item->children.size(); } else if (item->parent && item->parent->children.size() == 1) { // simplified return 0; } // aggregate all simplified nodes int numChildren = 1; item = item->children.constData(); while (item->children.size() == 1) { numChildren++; item = item->children.constData(); } return numChildren; } else { return 0; } } int columnCount(const QModelIndex& parent = {}) const final override { if (!parent.isValid() || parent.column() == 0) { return numColumns(); } else { return 0; } } QModelIndex index(int row, int column, const QModelIndex& parent = {}) const final override { if (row < 0 || column < 0 || column >= numColumns() || row > rowCount(parent)) { return {}; } const auto* parentItem = itemFromIndex(parent); if (!parentItem) { return {}; } auto tag = const_cast(reinterpret_cast(parentItem)); return createIndex(row, column, tag); } QModelIndex parent(const QModelIndex& child) const final override { const auto* childItem = itemFromIndex(child); if (!childItem) { return {}; } auto* parent = childItem->parent; if (m_simplify && parent && parent->children.size() == 1) { while (parent->parent && parent->parent->children.size() == 1) { parent = parent->parent; } } return indexFromItem(parent, 0); } QVariant headerData(int section, Qt::Orientation orientation, int role) const final override { if (orientation != Qt::Horizontal || section < 0 || section >= numColumns()) { return {}; } return headerColumnData(section, role); } QVariant data(const QModelIndex& index, int role) const final override { const auto* item = itemFromIndex(index); if (!item || item == rootItem()) { return {}; } if (role == SymbolRole) { return QVariant::fromValue(item->symbol); } else { auto ret = rowData(item, index.column(), role); if (role == Qt::DisplayRole && m_simplify && index.column() == 0 && index.row() > 0 && item->parent && item->parent->children.size() == 1) { auto text = ret.toString(); text.prepend(QStringLiteral("↪")); return text; } return ret; } return {}; } bool simplify() const { return m_simplify; } /** * When simplification is enabled, long call chains get flattened until they branch the first time */ void setSimplify(bool simplify) { beginResetModel(); m_simplify = simplify; endResetModel(); } const TreeNode* itemFromIndex(const QModelIndex& index) const { if (!index.isValid() || index.column() >= numColumns()) { return rootItem(); } else { auto parent = reinterpret_cast(index.internalPointer()); if (m_simplify && parent->children.size() == 1) { int row = index.row(); auto item = parent->children.constData(); while (row) { Q_ASSERT(item->children.size() == 1); item = item->children.constData(); --row; } Q_ASSERT(!row); return item; } if (index.row() >= parent->children.size()) { return nullptr; } return parent->children.constData() + index.row(); } } private: QModelIndex indexFromItem(const TreeNode* item, int column) const { if (!item || column < 0 || column >= numColumns()) { return {}; } auto* parentItem = item->parent; if (!parentItem) { parentItem = rootItem(); } Q_ASSERT(parentItem->children.constData() <= item); Q_ASSERT(parentItem->children.constData() + parentItem->children.size() > item); int row = 0; if (m_simplify && parentItem->children.size() == 1) { while (parentItem->parent && parentItem->parent->children.size() == 1) { ++row; parentItem = parentItem->parent; }; Q_ASSERT(parentItem->children.size() == 1); } else { row = std::distance(parentItem->children.constData(), item); } return createIndex(row, column, const_cast(parentItem)); } virtual const TreeNode* rootItem() const = 0; virtual int numColumns() const = 0; virtual QVariant headerColumnData(int column, int role) const = 0; virtual QVariant rowData(const TreeNode* item, int column, int role) const = 0; quint64 m_sampleCount = 0; bool m_simplify = true; friend class TestModels; }; template class CostTreeModel : public TreeModel { public: using Base = TreeModel; CostTreeModel(QObject* parent = nullptr) : Base(parent) { } ~CostTreeModel() = default; using Base::setData; void setData(const Results& data) { QAbstractItemModel::beginResetModel(); m_results = data; QAbstractItemModel::endResetModel(); } Results results() const { return m_results; } protected: const typename Base::TreeNode* rootItem() const final override { return &m_results.root; } Results m_results; }; class BottomUpModel : public CostTreeModel { Q_OBJECT public: explicit BottomUpModel(QObject* parent = nullptr); ~BottomUpModel(); enum Columns { Symbol = 0, Binary, }; enum { NUM_BASE_COLUMNS = Binary + 1, InitialSortColumn = Binary + 1 // the first cost column }; QVariant headerColumnData(int column, int role) const final override; QVariant rowData(const Data::BottomUp* row, int column, int role) const final override; int numColumns() const final override; }; class TopDownModel : public CostTreeModel { Q_OBJECT public: explicit TopDownModel(QObject* parent = nullptr); ~TopDownModel(); enum Columns { Symbol = 0, Binary, }; enum { NUM_BASE_COLUMNS = Binary + 1, InitialSortColumn = Binary + 1 // the first cost column }; QVariant headerColumnData(int column, int role) const final override; QVariant rowData(const Data::TopDown* row, int column, int role) const final override; int numColumns() const final override; int selfCostColumn(int cost) const; }; class PerLibraryModel : public CostTreeModel { Q_OBJECT public: explicit PerLibraryModel(QObject* parent = nullptr) : CostTreeModel(parent) { } ~PerLibraryModel() = default; enum Columns { Binary = 0, }; enum { NUM_BASE_COLUMNS = Binary + 1, InitialSortColumn = Binary + 1 // the first cost column }; QVariant headerColumnData(int column, int role) const final override; QVariant rowData(const Data::PerLibrary* row, int column, int role) const final override; int numColumns() const final override; }; KDAB-hotspot-41e5de7/src/multiconfigwidget.cpp000066400000000000000000000065641515036260400213650ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "multiconfigwidget.h" #include #include #include #include MultiConfigWidget::MultiConfigWidget(QWidget* parent) : QWidget(parent) { auto* layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); m_comboBox = new QComboBox(this); m_comboBox->setEditable(true); m_comboBox->setInsertPolicy(QComboBox::InsertAtCurrent); m_comboBox->setDisabled(true); layout->addWidget(m_comboBox); connect(m_comboBox->lineEdit(), &QLineEdit::editingFinished, this, [this] { m_config.deleteGroup(m_comboBox->currentData().toString()); saveConfigAs(m_comboBox->currentText()); m_comboBox->setItemData(m_comboBox->currentIndex(), m_comboBox->currentText()); m_config.sync(); }); connect(m_comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this] { selectConfig(m_comboBox->currentData().toString()); }); m_copyButton = new QPushButton(this); m_copyButton->setText(tr("Copy Config")); layout->addWidget(m_copyButton); connect(m_copyButton, &QPushButton::clicked, this, [this] { const QString name = tr("Config %1").arg(m_comboBox->count() + 1); saveConfigAs(name); m_comboBox->addItem(name, name); m_comboBox->setDisabled(false); }); m_removeButton = new QPushButton(this); m_removeButton->setText(tr("Remove Config")); layout->addWidget(m_removeButton); connect(m_removeButton, &QPushButton::clicked, this, [this] { m_config.deleteGroup(m_comboBox->currentData().toString()); m_comboBox->removeItem(m_comboBox->currentIndex()); if (m_comboBox->count() == 0) { m_comboBox->setDisabled(true); } else { selectConfig(m_comboBox->currentData().toString()); } }); setLayout(layout); } MultiConfigWidget::~MultiConfigWidget() = default; QString MultiConfigWidget::currentConfig() const { return m_comboBox->currentData().toString(); } void MultiConfigWidget::setConfig(const KConfigGroup& group) { m_comboBox->clear(); m_config = group; if (!m_config.isValid()) return; const auto groups = m_config.groupList(); for (const auto& config : groups) { if (m_config.hasGroup(config)) { // item data is used to get the old name after renaming m_comboBox->addItem(config, config); m_comboBox->setDisabled(false); } } } void MultiConfigWidget::saveConfigAs(const QString& name) { if (!name.isEmpty()) { emit saveConfig(m_config.group(name)); } } void MultiConfigWidget::updateCurrentConfig() { if (m_comboBox->currentIndex() != -1) { saveConfigAs(m_comboBox->currentData().toString()); } } void MultiConfigWidget::selectConfig(const QString& name) { m_config.sync(); if (!name.isEmpty() && m_config.hasGroup(name)) { emit restoreConfig(m_config.group(name)); } } void MultiConfigWidget::restoreCurrent() { if (m_comboBox->currentIndex() != -1) { selectConfig(m_comboBox->currentData().toString()); } } KDAB-hotspot-41e5de7/src/multiconfigwidget.h000066400000000000000000000020061515036260400210150ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class QComboBox; class QPushButton; class MultiConfigWidget : public QWidget { Q_OBJECT public: MultiConfigWidget(QWidget* parent = nullptr); ~MultiConfigWidget(); QString currentConfig() const; signals: void saveConfig(const KConfigGroup& group); void restoreConfig(const KConfigGroup& group); public slots: void setConfig(const KConfigGroup& group); void saveConfigAs(const QString& name); void updateCurrentConfig(); void selectConfig(const QString& name); void restoreCurrent(); private: KConfigGroup m_config; QComboBox* m_comboBox = nullptr; QPushButton* m_copyButton = nullptr; QPushButton* m_removeButton = nullptr; }; KDAB-hotspot-41e5de7/src/parsers/000077500000000000000000000000001515036260400166015ustar00rootroot00000000000000KDAB-hotspot-41e5de7/src/parsers/perf/000077500000000000000000000000001515036260400175355ustar00rootroot00000000000000KDAB-hotspot-41e5de7/src/parsers/perf/perfparser.cpp000066400000000000000000002421151515036260400224170ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "perfparser.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "settings.h" #if KFArchive_FOUND #include #include #include #include #include #endif namespace { Q_LOGGING_CATEGORY(LOG_PERFPARSER, "hotspot.perfparser", QtWarningMsg) struct Record { quint32 pid = 0; quint32 tid = 0; quint64 time = 0; quint32 cpu = 0; }; QDataStream& operator>>(QDataStream& stream, Record& record) { return stream >> record.pid >> record.tid >> record.time >> record.cpu; } QDebug operator<<(QDebug stream, const Record& record) { stream.noquote().nospace() << "Record{" << "pid=" << record.pid << ", " << "tid=" << record.tid << ", " << "time=" << record.time << ", " << "cpu=" << record.cpu << "}"; return stream; } struct StringId { qint32 id = -1; }; QDataStream& operator>>(QDataStream& stream, StringId& stringId) { return stream >> stringId.id; } QDebug operator<<(QDebug stream, StringId stringId) { stream.noquote().nospace() << "String{" << "id=" << stringId.id << "}"; return stream; } struct AttributesDefinition { // see perfattributes.h enum class Type : quint32 { Hardware = 0, Software = 1, Tracepoint = 2, HardwareCache = 3, Raw = 4, Breakpoint = 5, }; qint32 id = 0; quint32 type = 0; quint64 config = 0; StringId name; bool usesFrequency = false; quint64 frequencyOrPeriod = 0; }; QDataStream& operator>>(QDataStream& stream, AttributesDefinition& attributesDefinition) { return stream >> attributesDefinition.id >> attributesDefinition.type >> attributesDefinition.config >> attributesDefinition.name >> attributesDefinition.usesFrequency >> attributesDefinition.frequencyOrPeriod; } QDebug operator<<(QDebug stream, const AttributesDefinition& attributesDefinition) { stream.noquote().nospace() << "AttributesDefinition{" << "id=" << attributesDefinition.id << ", " << "type=" << attributesDefinition.type << ", " << "config=" << attributesDefinition.config << ", " << "name=" << attributesDefinition.name << ", " << "usesFrequency=" << attributesDefinition.usesFrequency << ", " << "frequencyOrPeriod=" << attributesDefinition.frequencyOrPeriod << "}"; return stream; } struct Command : Record { StringId comm; }; QDataStream& operator>>(QDataStream& stream, Command& command) { return stream >> static_cast(command) >> command.comm; } QDebug operator<<(QDebug stream, const Command& command) { stream.noquote().nospace() << "Command{" << static_cast(command) << ", " << "comm=" << command.comm << "}"; return stream; } struct ThreadStart : Record { quint32 ppid = 0; }; QDataStream& operator>>(QDataStream& stream, ThreadStart& threadStart) { stream >> static_cast(threadStart); stream >> threadStart.ppid; return stream; } QDebug operator<<(QDebug stream, const ThreadStart& threadStart) { stream.noquote().nospace() << "ThreadStart{" << static_cast(threadStart) << ", ppid = " << threadStart.ppid << "}"; return stream; } struct ThreadEnd : Record { }; QDataStream& operator>>(QDataStream& stream, ThreadEnd& threadEnd) { return stream >> static_cast(threadEnd); } QDebug operator<<(QDebug stream, const ThreadEnd& threadEnd) { stream.noquote().nospace() << "ThreadEnd{" << static_cast(threadEnd) << "}"; return stream; } struct Location { quint64 address = 0; quint64 relAddr = 0; StringId file; quint32 pid = 0; qint32 line = 0; qint32 column = 0; qint32 parentLocationId = 0; }; QDataStream& operator>>(QDataStream& stream, Location& location) { return stream >> location.address >> location.file >> location.pid >> location.line >> location.column >> location.parentLocationId >> location.relAddr; } QDebug operator<<(QDebug stream, const Location& location) { stream.noquote().nospace() << "Location{" << "address=0x" << Qt::hex << location.address << Qt::dec << ", " << "relAddr=" << location.relAddr << ", " << "file=" << location.file << ", " << "pid=" << location.pid << ", " << "line=" << location.line << ", " << "column=" << location.column << ", " << "parentLocationId=" << location.parentLocationId << "}"; return stream; } struct LocationDefinition { qint32 id = 0; Location location; }; QDataStream& operator>>(QDataStream& stream, LocationDefinition& locationDefinition) { return stream >> locationDefinition.id >> locationDefinition.location; } QDebug operator<<(QDebug stream, const LocationDefinition& locationDefinition) { stream.noquote().nospace() << "LocationDefinition{" << "id=" << locationDefinition.id << ", " << "location=" << locationDefinition.location << "}"; return stream; } struct Symbol { StringId name; quint64 relAddr = 0; quint64 size = 0; StringId binary; StringId path; StringId actualPath; bool isKernel = false; bool isInline = false; }; QDataStream& operator>>(QDataStream& stream, Symbol& symbol) { return stream >> symbol.name >> symbol.binary >> symbol.path >> symbol.isKernel >> symbol.relAddr >> symbol.size >> symbol.actualPath >> symbol.isInline; } QDebug operator<<(QDebug stream, const Symbol& symbol) { stream.noquote().nospace() << "Symbol{" << "name=" << symbol.name << ", " << "relAddr=" << symbol.relAddr << ", " << "size=" << symbol.size << ", " << "binary=" << symbol.binary << ", " << "path=" << symbol.path << ", " << "actualPath=" << symbol.actualPath << ", " << "isKernel=" << symbol.isKernel << ", " << "isInline=" << symbol.isInline << "}"; return stream; } struct SymbolDefinition { qint32 id = 0; Symbol symbol; }; QDataStream& operator>>(QDataStream& stream, SymbolDefinition& symbolDefinition) { return stream >> symbolDefinition.id >> symbolDefinition.symbol; } QDebug operator<<(QDebug stream, const SymbolDefinition& symbolDefinition) { stream.noquote().nospace() << "SymbolDefinition{" << "id=" << symbolDefinition.id << ", " << "symbol=" << symbolDefinition.symbol << "}"; return stream; } struct SampleCost { qint32 attributeId = 0; quint64 cost = 0; }; QDataStream& operator>>(QDataStream& stream, SampleCost& sampleCost) { return stream >> sampleCost.attributeId >> sampleCost.cost; } QDebug operator<<(QDebug stream, SampleCost sampleCost) { stream.noquote().nospace() << "SampleCost{" << "attributeId=" << sampleCost.attributeId << ", " << "cost=" << sampleCost.cost << "}"; return stream; } struct Sample : Record { QVector frames; quint8 guessedFrames = 0; QVector costs; quint32 tracePointFormat = std::numeric_limits::max(); quint32 tracePointData = std::numeric_limits::max(); }; QDataStream& operator>>(QDataStream& stream, Sample& sample) { return stream >> static_cast(sample) >> sample.frames >> sample.guessedFrames >> sample.costs; } QDebug operator<<(QDebug stream, const Sample& sample) { stream.noquote().nospace() << "Sample{" << static_cast(sample) << ", " << "frames=" << sample.frames << ", " << "guessedFrames=" << sample.guessedFrames << ", " << "costs=" << sample.costs << "}"; return stream; } struct ContextSwitchDefinition : Record { bool switchOut = false; }; QDataStream& operator>>(QDataStream& stream, ContextSwitchDefinition& contextSwitch) { return stream >> static_cast(contextSwitch) >> contextSwitch.switchOut; } QDebug operator<<(QDebug stream, const ContextSwitchDefinition& contextSwitch) { stream.noquote().nospace() << "ContextSwitchDefinition{" << static_cast(contextSwitch) << ", " << "switchOut=" << contextSwitch.switchOut << "}"; return stream.space(); } struct StringDefinition { qint32 id = 0; QByteArray string; }; QDataStream& operator>>(QDataStream& stream, StringDefinition& stringDefinition) { return stream >> stringDefinition.id >> stringDefinition.string; } QDebug operator<<(QDebug stream, const StringDefinition& stringDefinition) { stream.noquote().nospace() << "StringDefinition{" << "id=" << stringDefinition.id << ", " << "string=" << stringDefinition.string << "}"; return stream; } struct LostDefinition : Record { quint64 lost; }; QDataStream& operator>>(QDataStream& stream, LostDefinition& lostDefinition) { return stream >> static_cast(lostDefinition) >> lostDefinition.lost; } QDebug operator<<(QDebug stream, const LostDefinition& lostDefinition) { stream.noquote().nospace() << "LostDefinition{" << static_cast(lostDefinition) << "lost=" << lostDefinition.lost << "}"; return stream; } struct BuildId { quint32 pid = 0; QByteArray id; QByteArray fileName; }; QDataStream& operator>>(QDataStream& stream, BuildId& buildId) { return stream >> buildId.pid >> buildId.id >> buildId.fileName; } QDebug operator<<(QDebug stream, const BuildId& buildId) { stream.noquote().nospace() << "BuildId{" << "pid=" << buildId.pid << ", " << "id=" << buildId.id.toHex() << ", " << "fileName=" << buildId.fileName << "}"; return stream; } struct NumaNode { quint32 nodeId = 0; quint64 memTotal = 0; quint64 memFree = 0; QByteArray topology; }; QDataStream& operator>>(QDataStream& stream, NumaNode& numaNode) { return stream >> numaNode.nodeId >> numaNode.memTotal >> numaNode.memFree >> numaNode.topology; } QDebug operator<<(QDebug stream, const NumaNode& numaNode) { stream.noquote().nospace() << "NumaNode{" << "nodeId=" << numaNode.nodeId << ", " << "memTotal=" << numaNode.memTotal << ", " << "memFree=" << numaNode.memFree << ", " << "topology=" << numaNode.topology << "}"; return stream; } struct Pmu { quint32 type = 0; QByteArray name; }; QDataStream& operator>>(QDataStream& stream, Pmu& pmu) { return stream >> pmu.type >> pmu.name; } QDebug operator<<(QDebug stream, const Pmu& pmu) { stream.noquote().nospace() << "Pmu{" << "type=" << pmu.type << ", " << "name=" << pmu.name << "}"; return stream; } struct GroupDesc { QByteArray name; quint32 leaderIndex = 0; quint32 numMembers = 0; }; QDataStream& operator>>(QDataStream& stream, GroupDesc& groupDesc) { return stream >> groupDesc.name >> groupDesc.leaderIndex >> groupDesc.numMembers; } QDebug operator<<(QDebug stream, const GroupDesc& groupDesc) { stream.noquote().nospace() << "GroupDesc{" << "name=" << groupDesc.name << ", " << "leaderIndex=" << groupDesc.leaderIndex << ", " << "numMembers=" << groupDesc.numMembers << "}"; return stream; } struct FeaturesDefinition { QByteArray hostName; QByteArray osRelease; QByteArray version; QByteArray arch; quint32 nrCpusOnline; quint32 nrCpusAvailable; QByteArray cpuDesc; QByteArray cpuId; // in kilobytes quint64 totalMem; QList cmdline; QList buildIds; QList siblingCores; QList siblingThreads; QList numaTopology; QList pmuMappings; QList groupDescs; }; QDataStream& operator>>(QDataStream& stream, FeaturesDefinition& featuresDefinition) { stream >> featuresDefinition.hostName >> featuresDefinition.osRelease >> featuresDefinition.version >> featuresDefinition.arch >> featuresDefinition.nrCpusOnline >> featuresDefinition.nrCpusAvailable >> featuresDefinition.cpuDesc >> featuresDefinition.cpuId >> featuresDefinition.totalMem >> featuresDefinition.cmdline >> featuresDefinition.buildIds >> featuresDefinition.siblingCores >> featuresDefinition.siblingThreads >> featuresDefinition.numaTopology >> featuresDefinition.pmuMappings >> featuresDefinition.groupDescs; return stream; } QDebug operator<<(QDebug stream, const FeaturesDefinition& featuresDefinition) { stream.noquote().nospace() << "FeaturesDefinition{" << "hostName=" << featuresDefinition.hostName << ", " << "osRelease=" << featuresDefinition.osRelease << ", " << "version=" << featuresDefinition.version << ", " << "arch=" << featuresDefinition.arch << ", " << "nrCpusOnline=" << featuresDefinition.nrCpusOnline << ", " << "nrCpusAvailable=" << featuresDefinition.nrCpusAvailable << ", " << "cpuDesc=" << featuresDefinition.cpuDesc << ", " << "cpuId=" << featuresDefinition.cpuId << ", " << "totalMem=" << featuresDefinition.totalMem << ", " << "cmdline=" << featuresDefinition.cmdline << ", " << "buildIds=" << featuresDefinition.buildIds << ", " << "siblingCores=" << featuresDefinition.siblingCores << ", " << "siblingThreads=" << featuresDefinition.siblingThreads << ", " << "numaTopology=" << featuresDefinition.numaTopology << ", " << "pmuMappings=" << featuresDefinition.pmuMappings << ", " << "groupDesc=" << featuresDefinition.groupDescs << "}"; return stream; } struct Error { enum Code { BrokenDataFile = 1, MissingElfFile = 2, InvalidKallsyms = 3, }; Code code; QString message; }; QDataStream& operator>>(QDataStream& stream, Error::Code& code) { int c = 0; stream >> c; code = static_cast(c); return stream; } QDataStream& operator>>(QDataStream& stream, Error& error) { return stream >> error.code >> error.message; } QDebug operator<<(QDebug stream, const Error& error) { stream.noquote().nospace() << "Error{" << "code=" << error.code << ", " << "message=" << error.message << "}"; return stream; } struct TracePointFormat { StringId systemId; StringId nameId; quint32 flags = 0; StringId format; }; QDataStream& operator>>(QDataStream& stream, TracePointFormat& format) { stream >> format.systemId >> format.nameId >> format.flags >> format.format; return stream; } QDebug operator<<(QDebug stream, TracePointFormat format) { stream.noquote().nospace() << "TracePointFormat{" << "systemId=" << format.systemId << ", " << "nameId=" << format.nameId << ", " << "flags=" << format.flags << ", " << "format=" << format.format << "}"; return stream; } using TracePointData = QHash; QDebug operator<<(QDebug stream, const TracePointData& traceData) { auto s = stream.noquote().nospace(); s << "TracePointData{"; for (auto it = traceData.cbegin(), end = traceData.cend(); it != end; it++) { s << it.key() << "=" << it.value() << ", "; } s << "}"; return stream; } void addCallerCalleeEvent(const Data::Symbol& symbol, const Data::Location& location, int type, quint64 cost, QSet* recursionGuard, Data::CallerCalleeResults* callerCalleeResult, int numCosts) { auto recursionIt = recursionGuard->find(symbol); if (recursionIt == recursionGuard->end()) { auto& entry = callerCalleeResult->entry(symbol); auto& sourceCost = entry.source(location.fileLine, numCosts); // relAddr can be 0 for symbols in the main executable auto& addrCost = callerCalleeResult->binaryOffset( symbol.binary, location.relAddr ? location.relAddr : location.address, numCosts); sourceCost.inclusiveCost[type] += cost; addrCost.inclusiveCost[type] += cost; if (recursionGuard->isEmpty()) { // increment self cost for leaf sourceCost.selfCost[type] += cost; addrCost.selfCost[type] += cost; } recursionGuard->insert(symbol); } } void addByFileEvent(const Data::Symbol& symbol, const Data::Location& location, int type, quint64 cost, QSet* recursionGuard, Data::ByFileResults* byFileResult, int numCosts) { const auto& key = location.fileLine.file.isEmpty() ? symbol.binary : location.fileLine.file; auto recursionIt = recursionGuard->find(key); if (recursionIt == recursionGuard->end()) { auto& entry = byFileResult->entry(key); auto& sourceCost = entry.source(location.fileLine, numCosts); byFileResult->inclusiveCosts.add(type, entry.id, cost); sourceCost.inclusiveCost[type] += cost; if (recursionGuard->isEmpty()) { // increment self cost for leaf byFileResult->selfCosts.add(type, entry.id, cost); sourceCost.selfCost[type] += cost; } recursionGuard->insert(key); } } template void addBottomUpResult(Data::BottomUpResults* bottomUpResult, Settings::CostAggregation costAggregation, const Data::ThreadNames& commands, int type, quint64 cost, qint32 pid, qint32 tid, quint32 cpu, const QVector& frames, const FrameCallback& frameCallback) { switch (costAggregation) { case Settings::CostAggregation::BySymbol: bottomUpResult->addEvent(type, cost, frames, frameCallback); break; case Settings::CostAggregation::ByThread: { auto thread = commands.names.value(pid).value(tid); bottomUpResult->addEvent(thread.isEmpty() ? QString::number(tid) : thread, type, cost, frames, frameCallback); break; } case Settings::CostAggregation::ByProcess: { auto process = commands.names.value(pid).value(pid); bottomUpResult->addEvent(process.isEmpty() ? QString::number(pid) : process, type, cost, frames, frameCallback); break; } case Settings::CostAggregation::ByCPU: bottomUpResult->addEvent({QLatin1String("CPU %1").arg(QString::number(cpu))}, type, cost, frames, frameCallback); break; } } struct SymbolCount { qint32 total = 0; qint32 missing = 0; }; QProcessEnvironment perfparserEnvironment(const QStringList& debuginfodUrls) { auto env = Util::appImageEnvironment(); if (!debuginfodUrls.isEmpty()) { const auto envVar = QStringLiteral("DEBUGINFOD_URLS"); const auto defaultUrls = env.value(envVar); const auto separator = QLatin1Char(' '); env.insert(envVar, debuginfodUrls.join(separator) + separator + defaultUrls); } return env; } } Q_DECLARE_TYPEINFO(AttributesDefinition, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(SampleCost, Q_MOVABLE_TYPE); class PerfParserPrivate : public QObject { Q_OBJECT public: explicit PerfParserPrivate(Settings::CostAggregation costAggregation = Settings::CostAggregation::BySymbol, QObject* parent = nullptr) : QObject(parent) , stopRequested(false) , costAggregation(costAggregation) { buffer.buffer().reserve(1024); buffer.open(QIODevice::ReadOnly); stream.setDevice(&buffer); if (qEnvironmentVariableIntValue("HOTSPOT_GENERATE_SCRIPT_OUTPUT")) { perfScriptOutput = std::make_unique(stdout); } } void setInput(QIODevice* input) { this->input = input; connect(input, &QProcess::readyRead, this, [this] { while (tryParse()) { // just call tryParse until it fails } }); } bool tryParse() { if (stopRequested) { return false; } const auto bytesAvailable = input->bytesAvailable(); switch (state) { case HEADER: { const auto magic = QByteArrayLiteral("QPERFSTREAM"); // + 1 to include the trailing \0 if (bytesAvailable >= magic.size() + 1) { input->read(buffer.buffer().data(), magic.size() + 1); if (buffer.buffer().data() != magic) { state = PARSE_ERROR; qCWarning(LOG_PERFPARSER) << "Failed to read header magic"; return false; } else { state = DATA_STREAM_VERSION; return true; } } break; } case DATA_STREAM_VERSION: { qint32 dataStreamVersion = 0; if (bytesAvailable >= static_cast(sizeof(dataStreamVersion))) { input->read(buffer.buffer().data(), sizeof(dataStreamVersion)); dataStreamVersion = qFromLittleEndian(*reinterpret_cast(buffer.buffer().data())); stream.setVersion(dataStreamVersion); qCDebug(LOG_PERFPARSER) << "data stream version is:" << dataStreamVersion; state = EVENT_HEADER; return true; } break; } case EVENT_HEADER: if (bytesAvailable >= static_cast(sizeof(eventSize))) { input->read(buffer.buffer().data(), sizeof(eventSize)); eventSize = qFromLittleEndian(*reinterpret_cast(buffer.buffer().data())); qCDebug(LOG_PERFPARSER) << "next event size is:" << eventSize; state = EVENT; return true; } break; case EVENT: if (bytesAvailable >= static_cast(eventSize)) { buffer.buffer().resize(eventSize); input->read(buffer.buffer().data(), eventSize); if (!parseEvent()) { state = PARSE_ERROR; return false; } // await next event state = EVENT_HEADER; eventSize = 0; return true; } break; case PARSE_ERROR: // do nothing break; } return false; } bool parseEvent() { Q_ASSERT(buffer.isOpen()); Q_ASSERT(buffer.isReadable()); buffer.seek(0); Q_ASSERT(buffer.pos() == 0); stream.resetStatus(); qint8 eventType = 0; stream >> eventType; qCDebug(LOG_PERFPARSER) << "next event is:" << eventType; if (eventType < 0 || eventType >= static_cast(EventType::InvalidType)) { qCWarning(LOG_PERFPARSER) << "invalid event type" << eventType; state = PARSE_ERROR; return false; } switch (static_cast(eventType)) { case EventType::TracePointSample: case EventType::Sample: { Sample sample; stream >> sample; qCDebug(LOG_PERFPARSER) << "parsed:" << sample; for (auto& sampleCost : sample.costs) { if (!sampleCost.cost) { const auto& attribute = attributes.value(sampleCost.attributeId); if (!attribute.usesFrequency) { sampleCost.cost = attribute.frequencyOrPeriod; } } } if (static_cast(eventType) == EventType::TracePointSample) { quint32 eventFormatId; TracePointData traceData; stream >> eventFormatId >> traceData; tracepointData[eventFormatId].push_back(traceData); qCDebug(LOG_PERFPARSER) << "parsed:" << traceData; sample.tracePointFormat = eventFormatId; sample.tracePointData = tracepointData.size() - 1; } addRecord(sample); addSample(sample); break; } case EventType::ThreadStart: { ThreadStart threadStart; stream >> threadStart; qCDebug(LOG_PERFPARSER) << "parsed:" << threadStart; addRecord(threadStart); // override start time explicitly auto thread = addThread(threadStart); thread->time.start = threadStart.time; if (threadStart.ppid != threadStart.pid) { const auto parentComm = commands.names.value(threadStart.ppid).value(threadStart.ppid); commands.names[threadStart.pid][threadStart.pid] = parentComm; thread->name = parentComm; } // check if perf-$pid.map file exists perfMapFileExists |= QFile::exists(QDir::tempPath() + QDir::separator() + QLatin1String("perf-%1.map").arg(QString::number(thread->pid))); break; } case EventType::ThreadEnd: { ThreadEnd threadEnd; stream >> threadEnd; qCDebug(LOG_PERFPARSER) << "parsed:" << threadEnd; addRecord(threadEnd); addThreadEnd(threadEnd); break; } case EventType::Command: { Command command; stream >> command; qCDebug(LOG_PERFPARSER) << "parsed:" << command; addRecord(command); addCommand(command); break; } case EventType::LocationDefinition: { LocationDefinition locationDefinition; stream >> locationDefinition; qCDebug(LOG_PERFPARSER) << "parsed:" << locationDefinition; addLocation(locationDefinition); break; } case EventType::SymbolDefinition: { SymbolDefinition symbolDefinition; stream >> symbolDefinition; qCDebug(LOG_PERFPARSER) << "parsed:" << symbolDefinition; addSymbol(symbolDefinition); break; } case EventType::AttributesDefinition: { AttributesDefinition attributesDefinition; stream >> attributesDefinition; qCDebug(LOG_PERFPARSER) << "parsed:" << attributesDefinition; addAttributes(attributesDefinition); break; } case EventType::StringDefinition: { StringDefinition stringDefinition; stream >> stringDefinition; qCDebug(LOG_PERFPARSER) << "parsed:" << stringDefinition; addString(stringDefinition); break; } case EventType::LostDefinition: { LostDefinition lostDefinition; stream >> lostDefinition; qCDebug(LOG_PERFPARSER) << "parsed:" << lostDefinition; addRecord(lostDefinition); addLost(lostDefinition); break; } case EventType::FeaturesDefinition: { FeaturesDefinition featuresDefinition; stream >> featuresDefinition; qCDebug(LOG_PERFPARSER) << "parsed:" << featuresDefinition; setFeatures(featuresDefinition); break; } case EventType::Error: { Error error; stream >> error; qCDebug(LOG_PERFPARSER) << "parsed:" << error; addError(error); break; } case EventType::ContextSwitchDefinition: { ContextSwitchDefinition contextSwitch; stream >> contextSwitch; qCDebug(LOG_PERFPARSER) << "parsed:" << contextSwitch; addRecord(contextSwitch); addContextSwitch(contextSwitch); break; } case EventType::Progress: { float percent = 0; stream >> percent; qCDebug(LOG_PERFPARSER) << "parsed:" << percent; emit progress(percent); break; } case EventType::DebugInfoDownloadProgress: { StringId module; StringId url; qint64 numerator = 0; qint64 denominator = 0; stream >> module >> url >> numerator >> denominator; qCDebug(LOG_PERFPARSER) << "parsed:" << url << numerator << denominator; emit debugInfoDownloadProgress(strings.value(module.id), strings.value(url.id), numerator, denominator); break; } case EventType::TracePointFormat: { qint32 id; TracePointFormat format; stream >> id >> format; qCDebug(LOG_PERFPARSER) << "parsed:" << format; tracepointFormat[id] = format; break; } case EventType::InvalidType: break; } if (!stream.atEnd()) { qCWarning(LOG_PERFPARSER) << "did not consume all bytes for event of type" << eventType << buffer.pos() << buffer.size(); return false; } return true; } void finalize() { Data::BottomUp::initializeParents(&bottomUpResult.root); summaryResult.applicationTime = applicationTime; summaryResult.threadCount = uniqueThreads.size(); summaryResult.processCount = uniqueProcess.size(); byFileResult.inclusiveCosts.setTotalCosts(bottomUpResult.costs.totalCosts()); byFileResult.selfCosts.setTotalCosts(bottomUpResult.costs.totalCosts()); buildTopDownResult(); buildPerLibraryResult(); buildCallerCalleeResult(); for (auto& thread : eventResult.threads) { thread.time.start = std::max(thread.time.start, applicationTime.start); thread.time.end = std::min(thread.time.end, applicationTime.end); if (thread.name.isEmpty()) { thread.name = PerfParser::tr("#%1").arg(thread.tid); } // we may have been switched out before detaching perf, so increment // the off-CPU time in this case if (thread.state == Data::ThreadEvents::OffCpu) { thread.offCpuTime += thread.time.end - thread.lastSwitchTime; } if (thread.offCpuTime > 0) { summaryResult.offCpuTime += thread.offCpuTime; summaryResult.onCpuTime += thread.time.delta() - thread.offCpuTime; } } { uint cpuId = 0; for (auto& cpu : eventResult.cpus) { cpu.cpuId = cpuId++; } } eventResult.totalCosts = summaryResult.costs; // Add error messages for all modules with missing debug symbols for (auto i = numSymbolsByModule.begin(); i != numSymbolsByModule.end(); ++i) { const auto& numSymbols = i.value(); if (!numSymbols.missing) continue; const auto& moduleName = strings.value(i.key()); summaryResult.errors << PerfParser::tr("Module \"%1\" is missing %2 of %3 debug symbols.") .arg(moduleName) .arg(numSymbols.missing) .arg(numSymbols.total); } } qint32 addCostType(const QString& label, Data::Costs::Unit unit) { auto costId = m_nextCostId; m_nextCostId++; if (label == QLatin1String("sched:sched_switch")) { m_schedSwitchCostId = costId; } Q_ASSERT(summaryResult.costs.size() == costId); summaryResult.costs.push_back({label, 0, 0, unit}); Q_ASSERT(bottomUpResult.costs.numTypes() == costId); bottomUpResult.costs.addType(costId, label, unit); byFileResult.inclusiveCosts.addType(costId, label, unit); byFileResult.selfCosts.addType(costId, label, unit); return costId; } void addAttributes(const AttributesDefinition& attributesDefinition) { qint32 costId = attributeNameToCostIds.value(attributesDefinition.name.id, -1); if (costId == -1) { const auto label = strings.value(attributesDefinition.name.id); auto unit = [&] { if (attributesDefinition.type == static_cast(AttributesDefinition::Type::Tracepoint)) return Data::Costs::Unit::Tracepoint; return Data::Costs::Unit::Unknown; }(); costId = addCostType(label, unit); attributeNameToCostIds.insert(attributesDefinition.name.id, costId); } attributeIdsToCostIds[attributesDefinition.id] = costId; Q_ASSERT(attributes.size() == attributesDefinition.id); attributes.push_back(attributesDefinition); } Data::ThreadEvents* addThread(const Record& record) { Data::ThreadEvents thread; thread.pid = record.pid; thread.tid = record.tid; // when we encounter a thread the first time it was probably alive when // we started the application, otherwise we override the start time when // we encounter a ThreadStart event thread.time.start = applicationTime.start; thread.name = commands.names.value(thread.pid).value(thread.tid); if (thread.name.isEmpty() && thread.pid != thread.tid) thread.name = commands.names.value(thread.pid).value(thread.pid); eventResult.threads.push_back(thread); return &eventResult.threads.last(); } void addThreadEnd(const ThreadEnd& threadEnd) { auto* thread = eventResult.findThread(threadEnd.pid, threadEnd.tid); if (thread) { thread->time.end = threadEnd.time; } } void addCommand(const Command& command) { const auto& comm = strings.value(command.comm.id); // check if this changes the name of a current thread auto* thread = eventResult.findThread(command.pid, command.tid); if (thread) { thread->name = comm; } // and remember the command, maybe a future ThreadStart event references it commands.names[command.pid][command.tid] = comm; } void addLocation(const LocationDefinition& location) { Q_ASSERT(bottomUpResult.locations.size() == location.id); Q_ASSERT(bottomUpResult.symbols.size() == location.id); QString file; if (location.location.file.id != -1) { file = strings.value(location.location.file.id); } bottomUpResult.locations.push_back( {location.location.parentLocationId, {location.location.address, location.location.relAddr, {file, location.location.line}}}); bottomUpResult.symbols.push_back({}); } void addSymbol(const SymbolDefinition& symbol) { // empty symbol was added in addLocation already Q_ASSERT(bottomUpResult.symbols.size() > symbol.id); const auto symbolString = strings.value(symbol.symbol.name.id); const auto relAddr = symbol.symbol.relAddr; const auto size = symbol.symbol.size; const auto binaryString = strings.value(symbol.symbol.binary.id); const auto pathString = strings.value(symbol.symbol.path.id); const auto actualPathString = strings.value(symbol.symbol.actualPath.id); const auto isKernel = symbol.symbol.isKernel; const auto isInline = symbol.symbol.isInline; bottomUpResult.symbols[symbol.id] = {symbolString, relAddr, size, binaryString, pathString, actualPathString, isKernel, isInline}; // Count total and missing symbols per module for error report auto& numSymbols = numSymbolsByModule[symbol.symbol.binary.id]; ++numSymbols.total; if (symbolString.isEmpty() && !binaryString.isEmpty()) { ++numSymbols.missing; } } qint32 internStack(const QVector& frames) { auto& id = stacks[frames]; if (!id) { Q_ASSERT(stacks.size() == eventResult.stacks.size() + 1); id = stacks.size(); eventResult.stacks.push_back(frames); } return id - 1; } void addSampleToFrequencyData(const Sample& sample) { auto& lastTime = m_lastSampleTimePerCore[sample.cpu]; auto updateTime = qScopeGuard([&]() { lastTime = sample.time; }); if (!lastTime) { return; } if (static_cast(frequencyResult.cores.size()) <= sample.cpu) { frequencyResult.cores.resize(sample.cpu + 1); } auto& core = frequencyResult.cores[sample.cpu]; for (const auto& cost : sample.costs) { if (core.costs.size() <= cost.attributeId) { const auto oldSize = core.costs.size(); const auto newSize = cost.attributeId + 1; core.costs.resize(newSize); for (int i = oldSize; i < newSize; i++) { core.costs[i].costName = strings.at(attributes[i].name.id); } } auto& costs = core.costs[cost.attributeId]; auto frequency = static_cast(cost.cost) / (sample.time - lastTime); costs.values.push_back({sample.time, frequency}); } } void addSample(const Sample& sample) { addSampleToFrequencyData(sample); auto* thread = eventResult.findThread(sample.pid, sample.tid); if (!thread) { thread = addThread(sample); } if (static_cast(eventResult.cpus.size()) <= sample.cpu) { eventResult.cpus.resize(sample.cpu + 1); } auto& cpu = eventResult.cpus[sample.cpu]; for (const auto& sampleCost : sample.costs) { Data::Event event; event.time = sample.time; event.cost = sampleCost.cost; event.type = attributeIdsToCostIds.value(sampleCost.attributeId, -1); event.stackId = internStack(sample.frames); event.cpuId = sample.cpu; thread->events.push_back(event); cpu.events.push_back(event); const auto attribute = attributes.value(event.type); if (attribute.type == static_cast(AttributesDefinition::Type::Tracepoint)) { Data::Tracepoint tracepoint; tracepoint.time = event.time; tracepoint.name = strings.value(attribute.name.id); if (tracepoint.name != QLatin1String("sched:sched_switch")) { // sched_switch events are handled separately already tracepointResult.tracepoints.push_back(tracepoint); } } } addSampleToBottomUp(sample); addSampleToSummary(sample); if (sample.frames.length() > 1) { m_numSamplesWithMoreThanOneFrame++; } } void addString(const StringDefinition& string) { Q_ASSERT(string.id == strings.size()); strings.push_back(QString::fromUtf8(string.string)); } void addSampleToBottomUp(const Sample& sample) { // TODO: optimize for groups, don't repeat the same lookup multiple times for (const auto& sampleCost : sample.costs) { addSampleToBottomUp(sample, sampleCost); } } void addSampleToBottomUp(const Sample& sample, SampleCost sampleCost) { if (perfScriptOutput) { *perfScriptOutput << commands.names.value(sample.pid).value(sample.pid) << '\t' << sample.pid << '\t' << sample.time / 1000000000 << '.' << qSetFieldWidth(9) << qSetPadChar(QLatin1Char('0')) << sample.time % 1000000000 << qSetFieldWidth(0) << ":\t" << sampleCost.cost << ' ' << strings.value(attributes.value(sampleCost.attributeId).name.id) << '\n'; } QSet recursionGuard; QSet fileRecursionGuard; const auto type = attributeIdsToCostIds.value(sampleCost.attributeId, -1); if (type < 0) { qCWarning(LOG_PERFPARSER) << "Unexpected attribute id:" << sampleCost.attributeId << "Only know about" << attributeIdsToCostIds.size() << "attributes so far"; return; } auto frameCallback = [this, &recursionGuard, &fileRecursionGuard, &sampleCost, type](const Data::Symbol& symbol, const Data::Location& location) { addCallerCalleeEvent(symbol, location, type, sampleCost.cost, &recursionGuard, &callerCalleeResult, bottomUpResult.costs.numTypes()); addByFileEvent(symbol, location, type, sampleCost.cost, &fileRecursionGuard, &byFileResult, bottomUpResult.costs.numTypes()); if (perfScriptOutput) { *perfScriptOutput << '\t' << Qt::hex << qSetFieldWidth(16) << location.address << qSetFieldWidth(0) << Qt::dec << ' ' << (symbol.symbol.isEmpty() ? QStringLiteral("[unknown]") : symbol.symbol) << " (" << symbol.binary << ")\n"; } }; addBottomUpResult(type, sampleCost.cost, sample.pid, sample.tid, sample.cpu, sample.frames, frameCallback); if (perfScriptOutput) { *perfScriptOutput << "\n"; } } void buildTopDownResult() { topDownResult = Data::TopDownResults::fromBottomUp(bottomUpResult, costAggregation != Settings::CostAggregation::BySymbol); } void buildPerLibraryResult() { perLibraryResult = Data::PerLibraryResults::fromTopDown(topDownResult); } void buildCallerCalleeResult() { Data::callerCalleesFromBottomUpData(bottomUpResult, &callerCalleeResult); } void addRecord(const Record& record) { uniqueProcess.insert(record.pid); uniqueThreads.insert(record.tid); if (record.time < applicationTime.start || applicationTime.start == 0) { applicationTime.start = record.time; } if (record.time > applicationTime.end || applicationTime.end == 0) { applicationTime.end = record.time; } } void addSampleToSummary(const Sample& sample) { ++summaryResult.sampleCount; for (const auto& sampleCost : sample.costs) { const auto type = attributeIdsToCostIds.value(sampleCost.attributeId, -1); if (type < 0) { qCWarning(LOG_PERFPARSER) << "Unexpected attribute id:" << sampleCost.attributeId << "Only know about" << attributeIdsToCostIds.size() << "attributes so far"; } else { auto& costSummary = summaryResult.costs[type]; ++costSummary.sampleCount; costSummary.totalPeriod += sampleCost.cost; } } } void addContextSwitch(const ContextSwitchDefinition& contextSwitch) { auto* thread = eventResult.findThread(contextSwitch.pid, contextSwitch.tid); if (!thread) { return; } if (!contextSwitch.switchOut && thread->state == Data::ThreadEvents::OffCpu) { const auto switchTime = contextSwitch.time - thread->lastSwitchTime; thread->offCpuTime += switchTime; if (eventResult.offCpuTimeCostId == -1) { const auto label = PerfParser::tr("off-CPU Time"); eventResult.offCpuTimeCostId = addCostType(label, Data::Costs::Unit::Time); } auto& totalCost = summaryResult.costs[eventResult.offCpuTimeCostId]; totalCost.sampleCount++; totalCost.totalPeriod += switchTime; qint32 stackId = -1; if (!thread->events.isEmpty() && m_schedSwitchCostId != -1) { auto it = std::find_if(thread->events.rbegin(), thread->events.rend(), [this](const Data::Event& event) { return event.type == m_schedSwitchCostId; }); if (it != thread->events.rend()) { stackId = it->stackId; } } if (stackId != -1) { const auto& frames = eventResult.stacks[stackId]; QSet recursionGuard; QSet fileRecursionGuard; auto frameCallback = [this, &recursionGuard, &fileRecursionGuard, switchTime](const Data::Symbol& symbol, const Data::Location& location) { addCallerCalleeEvent(symbol, location, eventResult.offCpuTimeCostId, switchTime, &recursionGuard, &callerCalleeResult, bottomUpResult.costs.numTypes()); addByFileEvent(symbol, location, eventResult.offCpuTimeCostId, switchTime, &fileRecursionGuard, &byFileResult, bottomUpResult.costs.numTypes()); }; addBottomUpResult(eventResult.offCpuTimeCostId, switchTime, contextSwitch.pid, contextSwitch.tid, contextSwitch.cpu, frames, frameCallback); } Data::Event event; event.time = thread->lastSwitchTime; event.cost = switchTime; event.type = eventResult.offCpuTimeCostId; event.stackId = stackId; event.cpuId = contextSwitch.cpu; thread->events.push_back(event); } thread->lastSwitchTime = contextSwitch.time; thread->state = contextSwitch.switchOut ? Data::ThreadEvents::OffCpu : Data::ThreadEvents::OnCpu; } template void addBottomUpResult(int type, quint64 cost, qint32 pid, qint32 tid, quint32 cpu, const QVector& frames, const FrameCallback& frameCallback) { ::addBottomUpResult(&bottomUpResult, costAggregation, commands, type, cost, pid, tid, cpu, frames, frameCallback); } void addLost(const LostDefinition& lost) { ++summaryResult.lostChunks; summaryResult.lostEvents += lost.lost; auto* thread = eventResult.findThread(lost.pid, lost.tid); if (!thread) { return; } if (eventResult.lostEventCostId == -1) { eventResult.lostEventCostId = addCostType(PerfParser::tr("Lost Event"), Data::Costs::Unit::Unknown); } Data::Event event; event.time = lost.time; event.cost = lost.lost; event.type = eventResult.lostEventCostId; event.cpuId = lost.cpu; thread->events.push_back(event); // the lost event never has a valid cpu set, add to all CPUs for (auto& cpu : eventResult.cpus) cpu.events.push_back(event); } void setFeatures(const FeaturesDefinition& features) { if (features.cmdline.isEmpty()) { summaryResult.command = QStringLiteral("??"); } else { // first entry in cmdline is "perf" which could contain a path // we only want to show the name without the path auto args = features.cmdline; args.removeFirst(); summaryResult.command = QLatin1String("perf ") + QString::fromUtf8(args.join(' ')); } summaryResult.hostName = QString::fromUtf8(features.hostName); summaryResult.linuxKernelVersion = QString::fromUtf8(features.osRelease); summaryResult.perfVersion = QString::fromUtf8(features.version); summaryResult.cpuDescription = QString::fromUtf8(features.cpuDesc); summaryResult.cpuId = QString::fromUtf8(features.cpuId); summaryResult.cpuArchitecture = QString::fromUtf8(features.arch); summaryResult.cpusOnline = features.nrCpusOnline; summaryResult.cpusAvailable = features.nrCpusAvailable; auto formatCpuList = [](const QByteArrayList& list) -> QString { return QString::fromUtf8('[' + list.join("], [") + ']'); }; summaryResult.cpuSiblingCores = formatCpuList(features.siblingCores); summaryResult.cpuSiblingThreads = formatCpuList(features.siblingThreads); summaryResult.totalMemoryInKiB = features.totalMem; eventResult.cpus.resize(features.nrCpusAvailable); } void addError(const Error& error) { if (!encounteredErrors.contains(error.message)) { summaryResult.errors << error.message; encounteredErrors.insert(error.message); } } enum State { HEADER, DATA_STREAM_VERSION, EVENT_HEADER, EVENT, PARSE_ERROR }; enum class EventType { ThreadStart, ThreadEnd, Command, LocationDefinition, SymbolDefinition, StringDefinition, LostDefinition, FeaturesDefinition, Error, Progress, TracePointFormat, AttributesDefinition, ContextSwitchDefinition, Sample, TracePointSample, DebugInfoDownloadProgress, InvalidType }; State state = HEADER; quint32 eventSize = 0; QBuffer buffer; QDataStream stream; QVector attributes; QVector strings; QIODevice* input = nullptr; Data::Summary summaryResult; Data::TimeRange applicationTime; QSet uniqueThreads; QSet uniqueProcess; Data::BottomUpResults bottomUpResult; Data::TopDownResults topDownResult; Data::PerLibraryResults perLibraryResult; Data::CallerCalleeResults callerCalleeResult; Data::ByFileResults byFileResult; Data::EventResults eventResult; Data::TracepointResults tracepointResult; Data::FrequencyResults frequencyResult; Data::ThreadNames commands; std::unique_ptr perfScriptOutput; QHash numSymbolsByModule; QSet encounteredErrors; QHash, qint32> stacks; std::atomic stopRequested; QHash attributeIdsToCostIds; QHash attributeNameToCostIds; qint32 m_nextCostId = 0; qint32 m_schedSwitchCostId = -1; QHash m_lastSampleTimePerCore; Settings::CostAggregation costAggregation; bool perfMapFileExists = false; QHash tracepointFormat; QHash> tracepointData; // samples recorded without --call-graph have only one frame int m_numSamplesWithMoreThanOneFrame = 0; public slots: void stop() { stopRequested = true; } signals: void progress(float percent); void debugInfoDownloadProgress(const QString& module, const QString& url, qint64 numerator, qint64 denominator); }; PerfParser::PerfParser(QObject* parent) : QObject(parent) , m_isParsing(false) , m_stopRequested(false) , m_costAggregationChanged(false) { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType("Data::CallerCalleeEntryMap"); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); // set data via signal/slot connection to ensure we don't introduce a data race connect(this, &PerfParser::bottomUpDataAvailable, this, [this](const Data::BottomUpResults& data) { if (m_bottomUpResults.root.children.isEmpty()) { m_bottomUpResults = data; } }); connect(this, &PerfParser::callerCalleeDataAvailable, this, [this](const Data::CallerCalleeResults& data) { if (m_callerCalleeResults.entries.isEmpty()) { m_callerCalleeResults = data; } }); connect(this, &PerfParser::byFileDataAvailable, this, [this](const Data::ByFileResults& data) { if (m_byFileResults.entries.isEmpty()) { m_byFileResults = data; } }); connect(this, &PerfParser::frequencyDataAvailable, this, [this](const Data::FrequencyResults& data) { if (m_frequencyResults.cores.isEmpty()) { m_frequencyResults = data; } }); connect(this, &PerfParser::eventsAvailable, this, [this](const Data::EventResults& data) { if (m_events.threads.isEmpty()) { m_events = data; } }); connect(this, &PerfParser::tracepointDataAvailable, this, [this](const Data::TracepointResults& data) { if (m_tracepointResults.tracepoints.isEmpty()) { m_tracepointResults = data; } }); connect(this, &PerfParser::threadNamesAvailable, this, [this](const Data::ThreadNames& threadNames) { m_threadNames = threadNames; }); connect(this, &PerfParser::parsingStarted, this, [this]() { m_isParsing = true; m_stopRequested = false; }); auto parsingStopped = [this] { m_isParsing = false; m_decompressed.reset(); }; connect(Settings::instance(), &Settings::costAggregationChanged, this, [this] { m_costAggregationChanged = true; }); connect(this, &PerfParser::parsingFailed, this, parsingStopped); connect(this, &PerfParser::parsingFinished, this, parsingStopped); } PerfParser::~PerfParser() { using namespace ThreadWeaver; auto queue = Queue::instance(); if (!queue->isEmpty()) { queue->shutDown(); } } bool PerfParser::initParserArgs(const QString& path) { // check for common file issues const auto info = QFileInfo(path); if (!info.exists()) { emit parsingFailed(tr("File '%1' does not exist.").arg(path)); return false; } if (!info.isFile()) { emit parsingFailed(tr("'%1' is not a file.").arg(path)); return false; } if (!info.isReadable()) { emit parsingFailed(tr("File '%1' is not readable.").arg(path)); return false; } // peek into file header const auto filename = decompressIfNeeded(path); QFile file(filename); file.open(QIODevice::ReadOnly); if (file.peek(8) != "PERFILE2" && file.peek(11) != "QPERFSTREAM") { if (file.peek(8) == "PERFFILE") { emit parsingFailed(tr("Failed to parse file %1: %2").arg(path, tr("Unsupported V1 perf data"))); } else { emit parsingFailed(tr("Failed to parse file %1: %2").arg(path, tr("File format unknown"))); } file.close(); return false; } file.close(); // check perfparser and set initial values auto parserBinary = Util::perfParserBinaryPath(); if (parserBinary.isEmpty()) { emit parsingFailed(tr("Failed to find hotspot-perfparser binary.")); return false; } auto parserArgs = [](const QString& filename) { const auto settings = Settings::instance(); QStringList parserArgs = {QStringLiteral("--input"), filename, QStringLiteral("--max-frames"), QStringLiteral("1024")}; const auto sysroot = settings->sysroot(); if (!sysroot.isEmpty()) { parserArgs += {QStringLiteral("--sysroot"), sysroot}; } const auto kallsyms = settings->kallsyms(); if (!kallsyms.isEmpty()) { parserArgs += {QStringLiteral("--kallsyms"), kallsyms}; } const auto debugPaths = settings->debugPaths(); if (!debugPaths.isEmpty()) { parserArgs += {QStringLiteral("--debug"), debugPaths}; } const auto extraLibPaths = settings->extraLibPaths(); if (!extraLibPaths.isEmpty()) { parserArgs += {QStringLiteral("--extra"), extraLibPaths}; } const auto appPath = settings->appPath(); if (!appPath.isEmpty()) { parserArgs += {QStringLiteral("--app"), appPath}; } const auto arch = settings->arch(); if (!arch.isEmpty()) { parserArgs += {QStringLiteral("--arch"), arch}; } const auto perfMapPath = settings->perfMapPath(); if (!perfMapPath.isEmpty()) { parserArgs += {QStringLiteral("--perf-map-path"), perfMapPath}; } return parserArgs; }; m_parserArgs = parserArgs(filename); m_parserBinary = parserBinary; return true; } void PerfParser::startParseFile(const QString& path) { Q_ASSERT(!m_isParsing); // reset the data to ensure filtering will pick up the new data if (!initParserArgs(path)) { return; } m_bottomUpResults = {}; m_callerCalleeResults = {}; m_byFileResults = {}; m_tracepointResults = {}; m_events = {}; m_frequencyResults = {}; auto debuginfodUrls = Settings::instance()->debuginfodUrls(); const auto costAggregation = Settings::instance()->costAggregation(); emit parsingStarted(); using namespace ThreadWeaver; stream() << make_job([origPath = path, path = m_parserArgs[1], parserBinary = m_parserBinary, parserArgs = m_parserArgs, debuginfodUrls, costAggregation, this]() { PerfParserPrivate d(costAggregation); connect(&d, &PerfParserPrivate::progress, this, &PerfParser::progress); connect(&d, &PerfParserPrivate::debugInfoDownloadProgress, this, &PerfParser::debugInfoDownloadProgress); connect(this, &PerfParser::stopRequested, &d, &PerfParserPrivate::stop); auto finalize = [&d, this]() { d.finalize(); emit bottomUpDataAvailable(d.bottomUpResult); emit topDownDataAvailable(d.topDownResult); emit perLibraryDataAvailable(d.perLibraryResult); emit summaryDataAvailable(d.summaryResult); emit callerCalleeDataAvailable(d.callerCalleeResult); emit byFileDataAvailable(d.byFileResult); emit tracepointDataAvailable(d.tracepointResult); emit eventsAvailable(d.eventResult); emit frequencyDataAvailable(d.frequencyResult); emit threadNamesAvailable(d.commands); emit perfMapFileExists(d.perfMapFileExists); if (d.m_numSamplesWithMoreThanOneFrame == 0) { emit parserWarning(tr("Samples contained no call stack frames. Consider passing --call-graph " "dwarf to perf record.")); } emit parsingFinished(); }; // note: file is always readable and in supported format here, // already validated in initParserArgs() QFile file(path); file.open(QIODevice::ReadOnly); if (file.peek(11) == "QPERFSTREAM") { d.setInput(&file); while (!file.atEnd() && !d.stopRequested) { if (!d.tryParse()) { // TODO: provide reason emit parsingFailed( tr("Failed to parse file %1: %2").arg(origPath, QStringLiteral("Unknown reason"))); return; } } finalize(); return; } file.close(); QProcess process; process.setProcessEnvironment(perfparserEnvironment(debuginfodUrls)); process.setProcessChannelMode(QProcess::ForwardedErrorChannel); connect(this, &PerfParser::stopRequested, &process, &QProcess::kill); d.setInput(&process); connect(&process, static_cast(&QProcess::finished), &process, [finalize, this](int exitCode, QProcess::ExitStatus exitStatus) { if (m_stopRequested) { emit parsingFailed(tr("Parsing stopped.")); return; } qCDebug(LOG_PERFPARSER) << exitCode << exitStatus; enum ErrorCodes { NoError, TcpSocketError, CannotOpen, BadMagic, HeaderError, DataError, MissingData, InvalidOption }; switch (exitCode) { case NoError: finalize(); break; case TcpSocketError: emit parsingFailed( tr("The hotspot-perfparser binary exited with code %1 (TCP socket error).").arg(exitCode)); break; case CannotOpen: emit parsingFailed( tr("The hotspot-perfparser binary exited with code %1 (file could not be opened).") .arg(exitCode)); break; case BadMagic: case HeaderError: case DataError: case MissingData: emit parsingFailed( tr("The hotspot-perfparser binary exited with code %1 (invalid perf data file).") .arg(exitCode)); break; case InvalidOption: emit parsingFailed( tr("The hotspot-perfparser binary exited with code %1 (invalid option).").arg(exitCode)); break; default: emit parsingFailed(tr("The hotspot-perfparser binary exited with code %1.").arg(exitCode)); break; } }); connect(&process, &QProcess::errorOccurred, &process, [&process, this](QProcess::ProcessError error) { if (m_stopRequested) { emit parsingFailed(tr("Parsing stopped.")); return; } qCWarning(LOG_PERFPARSER) << error << process.errorString(); emit parsingFailed(process.errorString()); }); process.start(parserBinary, parserArgs); if (!process.waitForStarted()) { emit parsingFailed(tr("Failed to start the hotspot-perfparser process")); return; } QEventLoop loop; connect(&process, static_cast(&QProcess::finished), &loop, &QEventLoop::quit); loop.exec(); }); } void PerfParser::filterResults(const Data::FilterAction& filter) { Q_ASSERT(!m_isParsing); emit parsingStarted(); using namespace ThreadWeaver; const auto costAggregation = Settings::instance()->costAggregation(); stream() << make_job([this, filter, costAggregation]() { Queue queue; queue.setMaximumNumberOfThreads(QThread::idealThreadCount()); Data::BottomUpResults bottomUp; Data::EventResults events = m_events; Data::CallerCalleeResults callerCallee; Data::ByFileResults byFile; Data::TracepointResults tracepointResults = m_tracepointResults; auto frequencyResults = m_frequencyResults; const bool filterByTime = filter.time.isValid(); const bool filterByCpu = filter.cpuId != std::numeric_limits::max(); const bool excludeByCpu = !filter.excludeCpuIds.isEmpty(); const bool includeBySymbol = !filter.includeSymbols.isEmpty(); const bool excludeBySymbol = !filter.excludeSymbols.isEmpty(); const bool includeByBinary = !filter.includeBinaries.isEmpty(); const bool excludeByBinary = !filter.excludeBinaries.isEmpty(); const bool filterByStack = includeBySymbol || excludeBySymbol || includeByBinary || excludeByBinary; if (!filter.isValid() && !m_costAggregationChanged) { bottomUp = m_bottomUpResults; callerCallee = m_callerCalleeResults; byFile = m_byFileResults; } else { byFile.inclusiveCosts.initializeCostsFrom(m_bottomUpResults.costs); byFile.selfCosts.initializeCostsFrom(m_bottomUpResults.costs); bottomUp.symbols = m_bottomUpResults.symbols; bottomUp.locations = m_bottomUpResults.locations; bottomUp.costs.initializeCostsFrom(m_bottomUpResults.costs); bottomUp.costs.clearTotalCost(); const int numCosts = m_bottomUpResults.costs.numTypes(); // rebuild per-CPU data, i.e. wipe all the events and then re-add them for (auto& cpu : events.cpus) { cpu.events.clear(); } // we filter all available stacks and then remember the stack ids that should be // included, which is hopefully less work than filtering the stack for every event QVector filterStacks; if (filterByStack) { filterStacks.resize(m_events.stacks.size()); const auto threadCount = queue.maximumNumberOfThreads(); const auto jobsPerThread = m_events.stacks.size() / threadCount; auto filterStack = [&filter, &filterStacks, this](int start, int stop) { for (qint32 stackId = start, c = stop; stackId < c; ++stackId) { // if empty, then all include filters are matched auto includedSymbols = filter.includeSymbols; auto includedBinaries = filter.includeBinaries; // if false, then none of the exclude filters matched bool excluded = false; m_bottomUpResults.foreachFrame( m_events.stacks.at(stackId), [&includedSymbols, &includedBinaries, &excluded, &filter](const Data::Symbol& symbol, const Data::Location& /*location*/) { excluded = filter.excludeSymbols.contains(symbol); if (excluded) { return false; } includedSymbols.remove(symbol); excluded = filter.excludeBinaries.contains(symbol.binary); if (excluded) { return false; } includedBinaries.remove(symbol.binary); // only stop when we included everything and no exclude filter is // set return !includedSymbols.isEmpty() || !filter.excludeSymbols.isEmpty() || includedBinaries.isEmpty() || !filter.excludeBinaries.isEmpty(); }); filterStacks[stackId] = !excluded && includedSymbols.isEmpty() && includedBinaries.isEmpty(); } }; for (int i = 0; i < threadCount - 1; i++) { queue.stream() << make_job( [filterStack, i, jobsPerThread] { filterStack(i * jobsPerThread, (i + 1) * jobsPerThread); }); } queue.stream() << make_job([filterStack, threadCount, jobsPerThread, this] { filterStack((threadCount - 1) * jobsPerThread, m_events.stacks.size()); }); } if (filterByTime) { auto it = std::remove_if( tracepointResults.tracepoints.begin(), tracepointResults.tracepoints.end(), [filter](const Data::Tracepoint& tracepoint) { return !filter.time.contains(tracepoint.time); }); tracepointResults.tracepoints.erase(it, tracepointResults.tracepoints.end()); for (auto& core : frequencyResults.cores) { for (auto& costType : core.costs) { auto frequencyIt = std::remove_if( costType.values.begin(), costType.values.end(), [filter](Data::FrequencyData point) { return !filter.time.contains(point.time); }); costType.values.erase(frequencyIt, costType.values.end()); } } } queue.finish(); // remove events that lie outside the selected time span // TODO: parallelize for (auto& thread : events.threads) { if (m_stopRequested) { emit parsingFailed(tr("Parsing stopped.")); return; } if ((filter.processId != Data::INVALID_PID && thread.pid != filter.processId) || (filter.threadId != Data::INVALID_TID && thread.tid != filter.threadId) || (filterByTime && (thread.time.start > filter.time.end || thread.time.end < filter.time.start)) || filter.excludeProcessIds.contains(thread.pid) || filter.excludeThreadIds.contains(thread.tid)) { thread.events.clear(); continue; } if (filterByTime || filterByCpu || excludeByCpu || filterByStack) { auto it = std::remove_if(thread.events.begin(), thread.events.end(), [filter, filterByTime, filterByCpu, excludeByCpu, filterByStack, filterStacks](const Data::Event& event) { return (filterByTime && !filter.time.contains(event.time)) || (filterByCpu && event.cpuId != filter.cpuId) || (excludeByCpu && filter.excludeCpuIds.contains(event.cpuId)) || (filterByStack && event.stackId != -1 && !filterStacks[event.stackId]); }); thread.events.erase(it, thread.events.end()); } if (m_stopRequested) { emit parsingFailed(tr("Parsing stopped.")); return; } // add event data to cpus, bottom up and caller callee sets for (const auto& event : std::as_const(thread.events)) { // only add non-time events to the cpu line, context switches shouldn't show up there if (event.type == events.lostEventCostId) { // the lost event never has a valid cpu set, add to all CPUs for (auto& cpu : events.cpus) cpu.events.push_back(event); } else if (event.type != events.offCpuTimeCostId) { events.cpus[event.cpuId].events.push_back(event); } QSet recursionGuard; QSet fileRecursionGuard; auto frameCallback = [&callerCallee, &recursionGuard, &byFile, &fileRecursionGuard, &event, numCosts](const Data::Symbol& symbol, const Data::Location& location) { addCallerCalleeEvent(symbol, location, event.type, event.cost, &recursionGuard, &callerCallee, numCosts); addByFileEvent(symbol, location, event.type, event.cost, &fileRecursionGuard, &byFile, numCosts); }; if (event.stackId != -1) { addBottomUpResult(&bottomUp, costAggregation, m_threadNames, event.type, event.cost, thread.pid, thread.tid, event.cpuId, events.stacks.at(event.stackId), frameCallback); } } } // remove threads that have no events within the selected time span auto it = std::remove_if(events.threads.begin(), events.threads.end(), [](const Data::ThreadEvents& thread) { return thread.events.isEmpty(); }); events.threads.erase(it, events.threads.end()); Data::BottomUp::initializeParents(&bottomUp.root); if (m_stopRequested) { emit parsingFailed(tr("Parsing stopped.")); return; } // TODO: parallelize Data::callerCalleesFromBottomUpData(bottomUp, &callerCallee); } if (m_stopRequested) { emit parsingFailed(tr("Parsing stopped.")); return; } const auto topDown = Data::TopDownResults::fromBottomUp(bottomUp, costAggregation != Settings::CostAggregation::BySymbol); const auto perLibrary = Data::PerLibraryResults::fromTopDown(topDown); if (m_stopRequested) { emit parsingFailed(tr("Parsing stopped.")); return; } m_costAggregationChanged = false; emit bottomUpDataAvailable(bottomUp); emit topDownDataAvailable(topDown); emit perLibraryDataAvailable(perLibrary); emit callerCalleeDataAvailable(callerCallee); emit byFileDataAvailable(byFile); emit frequencyDataAvailable(frequencyResults); emit tracepointDataAvailable(tracepointResults); emit eventsAvailable(events); emit parsingFinished(); }); } void PerfParser::stop() { m_stopRequested = true; emit stopRequested(); } void PerfParser::exportResults(const QString& path, const QUrl& url) { if (!initParserArgs(path)) return; exportResults(url); } void PerfParser::exportResults(const QUrl& url) { Q_ASSERT(!m_parserBinary.isEmpty()); Q_ASSERT(!m_parserArgs.isEmpty()); using namespace ThreadWeaver; auto debuginfodUrls = Settings::instance()->debuginfodUrls(); stream() << make_job([this, url, parserBinary = m_parserBinary, parserArgs = m_parserArgs, debuginfodUrls]() { QProcess perfParser; QSharedPointer tmpFile; const auto writeDirectly = url.isLocalFile(); if (writeDirectly) { perfParser.setStandardOutputFile(url.toLocalFile()); } else { tmpFile = QSharedPointer::create(); if (!tmpFile->open()) { emit exportFailed( tr("File export failed: Failed to create temporary file %1.").arg(tmpFile->errorString())); return; } tmpFile->close(); perfParser.setStandardOutputFile(tmpFile->fileName()); } perfParser.setProcessEnvironment(perfparserEnvironment(debuginfodUrls)); perfParser.setProcessChannelMode(QProcess::ForwardedErrorChannel); perfParser.start(parserBinary, parserArgs); if (!perfParser.waitForFinished(-1)) { emit exportFailed(tr("File export failed: %1").arg(perfParser.errorString())); return; } if (writeDirectly) { emit exportFinished(url); return; } // KIO has to be run from the main thread again QTimer::singleShot(0, this, [this, url, tmpFile]() { auto* job = KIO::file_move(QUrl::fromLocalFile(tmpFile->fileName()), url, -1, KIO::Overwrite); connect(job, &KIO::FileCopyJob::result, this, [this, url, job, tmpFile]() { if (job->error()) emit exportFailed(tr("File export failed: %1").arg(job->errorString())); else emit exportFinished(url); // we need to keep the file alive until the copy job has finished Q_UNUSED(tmpFile); }); job->start(); }); }); } // helper for extracting files from archives namespace { #if KFArchive_FOUND // create archive reader from mimetype auto getArchiveFromMime = [](const QString& filename, const QMimeType& mimeType) -> std::unique_ptr { if (mimeType.name() == QLatin1String("application/x-tar")) { return std::make_unique(filename); } else if (mimeType.name() == QLatin1String("application/zip")) { return std::make_unique(filename); } else if (mimeType.name() == QLatin1String("application/x-7z-compressed")) { return std::make_unique(filename); } return {}; }; auto extractFromArchive = [](const std::unique_ptr& archive) -> std::unique_ptr { auto extractFile = [](const KArchiveDirectory* directory, const QString& filename) -> std::unique_ptr { auto extracted = std::make_unique(); extracted->open(); auto fileToExtract = directory->file(filename); if (!fileToExtract) { return {}; } auto fileToExtractHandle = std::unique_ptr(fileToExtract->createDevice()); const int chunkSize = 1024 * 100; QByteArray buffer; buffer.resize(chunkSize); while (!fileToExtractHandle->atEnd()) { const auto size = fileToExtractHandle->read(buffer.data(), buffer.size()); extracted->write(buffer.data(), size); } extracted->flush(); return extracted; }; if (!archive->open(QIODevice::ReadOnly)) { qWarning() << "Failed to open archive:" << archive->errorString(); return {}; } auto dir = archive->directory(); auto entries = dir->entries(); if (entries.size() == 1) { return extractFile(dir, entries[0]); } for (const auto& file : {QStringLiteral("perf.data"), QStringLiteral("perf.data.perfparser")}) { if (entries.contains(file)) { return extractFile(dir, file); } } return {}; }; #endif // KFArchive_FOUND } QString PerfParser::decompressIfNeeded(const QString& path) { #if KFArchive_FOUND KCompressionDevice compressedFile(path); QMimeDatabase mimedb; // extract perf.data file form archive, on success set m_decompressed to that file // otherwise return the archive path auto extractArchive = [this, &mimedb](const QString& path) { const auto mimetype = mimedb.mimeTypeForFile(path); auto archive = getArchiveFromMime(path, mimetype); if (!archive) { // we don't have and archive -> return original file return path; } auto extracted = extractFromArchive(archive); if (extracted) { m_decompressed = std::move(extracted); } return m_decompressed->fileName(); }; // uncompressed file -> check if it is an archive (tar for example) // extractArchive returns the original path if it couldn't open the archive if (compressedFile.compressionType() == KCompressionDevice::None) { return extractArchive(path); } if (!compressedFile.open(QIODevice::ReadOnly)) { // we failed to open the compressed file qWarning() << "Failed to open:" << path; return path; } // we now have a compressed file that could be an archive -> decompress { auto decompressed = std::make_unique(); decompressed->open(); const int chunkSize = 1024 * 100; QByteArray buffer; buffer.resize(chunkSize); while (!compressedFile.atEnd()) { const auto size = compressedFile.read(buffer.data(), buffer.size()); decompressed->write(buffer.data(), size); } decompressed->flush(); compressedFile.close(); m_decompressed = std::move(decompressed); } // if m_decompressed is not an archive, this will return m_decompressed return extractArchive(m_decompressed->fileName()); #endif // fallback return path; } #include "perfparser.moc" KDAB-hotspot-41e5de7/src/parsers/perf/perfparser.h000066400000000000000000000060311515036260400220570ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include #include class QUrl; class QTemporaryFile; // TODO: create a parser interface class PerfParser : public QObject { Q_OBJECT public: explicit PerfParser(QObject* parent = nullptr); ~PerfParser(); void startParseFile(const QString& path); void filterResults(const Data::FilterAction& filter); void stop(); void exportResults(const QUrl& url); // used when directly exporting without parsing for visualization purposes void exportResults(const QString& path, const QUrl& url); Data::BottomUpResults bottomUpResults() const { return m_bottomUpResults; } Data::CallerCalleeResults callerCalleeResults() const { return m_callerCalleeResults; } Data::ByFileResults byFileResults() const { return m_byFileResults; } Data::EventResults eventResults() const { return m_events; } signals: void parsingStarted(); void summaryDataAvailable(const Data::Summary& data); void bottomUpDataAvailable(const Data::BottomUpResults& data); void topDownDataAvailable(const Data::TopDownResults& data); void perLibraryDataAvailable(const Data::PerLibraryResults& data); void callerCalleeDataAvailable(const Data::CallerCalleeResults& data); void byFileDataAvailable(const Data::ByFileResults& data); void tracepointDataAvailable(const Data::TracepointResults& data); void frequencyDataAvailable(const Data::FrequencyResults& data); void eventsAvailable(const Data::EventResults& events); void threadNamesAvailable(const Data::ThreadNames& threadNames); void parsingFinished(); void parsingFailed(const QString& errorMessage); void exportFailed(const QString& errorMessage); void progress(float progress); void debugInfoDownloadProgress(const QString& module, const QString& url, qint64 numerator, qint64 denominator); void stopRequested(); void perfMapFileExists(bool exists); void parserWarning(const QString& errorMessage); void exportFinished(const QUrl& url); private: bool initParserArgs(const QString& path); friend class TestPerfParser; QString decompressIfNeeded(const QString& path); // only set once after the initial startParseFile finished QString m_parserBinary; QStringList m_parserArgs; Data::BottomUpResults m_bottomUpResults; Data::CallerCalleeResults m_callerCalleeResults; Data::ByFileResults m_byFileResults; Data::TracepointResults m_tracepointResults; Data::EventResults m_events; Data::FrequencyResults m_frequencyResults; std::atomic m_isParsing; std::atomic m_stopRequested; std::atomic m_costAggregationChanged; std::unique_ptr m_decompressed; Data::ThreadNames m_threadNames; }; KDAB-hotspot-41e5de7/src/perfcontrolfifowrapper.cpp000066400000000000000000000073311515036260400224340ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Zeno Endemann SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "perfcontrolfifowrapper.h" #include "errnoutil.h" #include #include #include #include #include #include #include #include namespace { Q_LOGGING_CATEGORY(perfcontrolfifowrapper, "hotspot.perfcontrolfifowrapper") QString randomString() { return QUuid::createUuid().toString(QUuid::WithoutBraces); } int createAndOpenFifo(const QString& name) { const auto localName = name.toLocal8Bit(); if (mkfifo(localName.constData(), 0600) != 0) { qCCritical(perfcontrolfifowrapper) << "Cannot create fifo" << name << Util::PrintableErrno {errno}; return -1; } auto fd = open(localName.constData(), O_RDWR); if (fd < 0) { qCCritical(perfcontrolfifowrapper) << "Cannot open fifo" << name << Util::PrintableErrno {errno}; return -1; } return fd; } } PerfControlFifoWrapper::~PerfControlFifoWrapper() { close(); } bool PerfControlFifoWrapper::open() { close(); // QStandardPaths::RuntimeLocation may be empty -> fallback to TempLocation auto fifoParentPath = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation); if (fifoParentPath.isEmpty()) fifoParentPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation); const auto fifoBasePath = QLatin1String("%1/hotspot-%2-%3-perf").arg(fifoParentPath, QString::number(getpid()), randomString()); m_ctlFifoPath = fifoBasePath + QLatin1String("-control.fifo"); m_ackFifoPath = fifoBasePath + QLatin1String("-ack.fifo"); // error is already handles by createAndOpenFifo m_ctlFifoFd = createAndOpenFifo(m_ctlFifoPath); if (m_ctlFifoFd < 0) return false; m_ackFifoFd = createAndOpenFifo(m_ackFifoPath); return m_ackFifoFd >= 0; } void PerfControlFifoWrapper::requestStart() { if (m_ctlFifoFd < 0) { emit noFIFO(); return; } m_ackReady = std::make_unique(m_ackFifoFd, QSocketNotifier::Read); connect(m_ackReady.get(), &QSocketNotifier::activated, this, [this]() { char buf[10]; if (read(m_ackFifoFd, buf, sizeof(buf)) == -1) { qCWarning(perfcontrolfifowrapper) << "failed to read message from fifo:" << m_ctlFifoPath << Util::PrintableErrno {errno}; } emit started(); m_ackReady->disconnect(this); }); const char start_cmd[] = "enable\n"; if (write(m_ctlFifoFd, start_cmd, sizeof(start_cmd) - 1) == -1) { qCWarning(perfcontrolfifowrapper) << "failed to write start message to fifo:" << m_ctlFifoPath << Util::PrintableErrno {errno}; } } void PerfControlFifoWrapper::requestStop() { if (m_ctlFifoFd < 0) { emit noFIFO(); return; } const char stop_cmd[] = "stop\n"; if (write(m_ctlFifoFd, stop_cmd, sizeof(stop_cmd) - 1) == -1) { qCWarning(perfcontrolfifowrapper) << "failed to write start message to fifo:" << m_ctlFifoPath << Util::PrintableErrno {errno}; } } void PerfControlFifoWrapper::close() { if (m_ackReady) { m_ackReady = nullptr; } if (m_ctlFifoFd >= 0) { ::close(m_ctlFifoFd); m_ctlFifoFd = -1; } if (m_ackFifoFd >= 0) { ::close(m_ackFifoFd); m_ackFifoFd = -1; } if (!m_ctlFifoPath.isEmpty()) { QFile::remove(m_ctlFifoPath); m_ctlFifoPath.clear(); } if (!m_ackFifoPath.isEmpty()) { QFile::remove(m_ackFifoPath); m_ackFifoPath.clear(); } } KDAB-hotspot-41e5de7/src/perfcontrolfifowrapper.h000066400000000000000000000022001515036260400220670ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Zeno Endemann SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include #include class QSocketNotifier; /** * Wrapper for the control and ack FIFOs for perf record. * * For more information, refer to `man perf record` and search for `--control=fifo:`. */ class PerfControlFifoWrapper : public QObject { Q_OBJECT public: using QObject::QObject; ~PerfControlFifoWrapper(); bool isOpen() const { return m_ctlFifoFd >= 0; } QString controlFifoPath() const { return m_ctlFifoPath; } QString ackFifoPath() const { return m_ackFifoPath; } bool open(); void requestStart(); void requestStop(); void close(); signals: void started(); void noFIFO(); private: std::unique_ptr m_ackReady; QString m_ctlFifoPath; QString m_ackFifoPath; int m_ctlFifoFd = -1; int m_ackFifoFd = -1; }; KDAB-hotspot-41e5de7/src/perfoutputwidget.cpp000066400000000000000000000006671515036260400212600ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "perfoutputwidget.h" PerfOutputWidget::PerfOutputWidget(QWidget* parent) : QWidget(parent) { } PerfOutputWidget::~PerfOutputWidget() = default; KDAB-hotspot-41e5de7/src/perfoutputwidget.h000066400000000000000000000012671515036260400207220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include class PerfOutputWidget : public QWidget { Q_OBJECT public: PerfOutputWidget(QWidget* parent = nullptr); virtual ~PerfOutputWidget(); virtual void addOutput(const QString&) = 0; virtual void clear() = 0; virtual void enableInput(bool enable) = 0; virtual void setInputVisible(bool visible) = 0; signals: void sendInput(const QByteArray& input); }; KDAB-hotspot-41e5de7/src/perfoutputwidgetkonsole.cpp000066400000000000000000000100231515036260400226360ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "perfoutputwidgetkonsole.h" #include "util.h" #include #include #include #include #include #include #include namespace { QString tailExe() { static const auto tail = QStandardPaths::findExecutable(QStringLiteral("tail")); return tail; } KParts::ReadOnlyPart* createPart() { return Util::createPart(QStringLiteral("konsolepart")); } } PerfOutputWidgetKonsole::PerfOutputWidgetKonsole(KParts::ReadOnlyPart* part, QWidget* parent) : PerfOutputWidget(parent) , m_konsolePart(part) { auto layout = new QVBoxLayout(this); setLayout(layout); addPartToLayout(); } PerfOutputWidgetKonsole::~PerfOutputWidgetKonsole() = default; PerfOutputWidgetKonsole* PerfOutputWidgetKonsole::create(QWidget* parent) { if (tailExe().isEmpty()) { return nullptr; } auto part = createPart(); if (!part) { return nullptr; } const auto terminalInterface = qobject_cast(part); if (!terminalInterface) { qWarning("konsole kpart doesn't implement terminal interface"); delete part; return nullptr; } return new PerfOutputWidgetKonsole(part, parent); } bool PerfOutputWidgetKonsole::eventFilter(QObject* watched, QEvent* event) { Q_UNUSED(watched); if (event->type() == QEvent::KeyPress) { auto keyEvent = static_cast(event); const auto key = keyEvent->key(); // ignore ctrl + c and ctrl + s (stop output) if (keyEvent->modifiers() == Qt::ControlModifier && (key == Qt::Key_C || key == Qt::Key_S)) { return true; } if (!m_inputEnabled) { // eat all key events if input is disabled return true; } else { if (key == Qt::Key_Enter || key == Qt::Key_Return) { emit sendInput(m_inputBuffer + QByteArrayLiteral("\n")); m_inputBuffer.clear(); } else if (key == Qt::Key_Delete) { m_inputBuffer.remove(m_inputBuffer.size() - 1, 1); } else { m_inputBuffer.append(keyEvent->text().toUtf8()); } } } else if (event->type() == QEvent::MouseButtonPress) { auto mouseEvent = static_cast(event); // prevent the user from opening the context menu if (mouseEvent->button() == Qt::MouseButton::RightButton) { return true; } } return PerfOutputWidget::eventFilter(watched, event); } void PerfOutputWidgetKonsole::addOutput(const QString& output) { if (output.isEmpty()) { return; } m_konsoleFile->write(output.toUtf8()); m_konsoleFile->flush(); m_needClear = true; } void PerfOutputWidgetKonsole::clear() { if (!m_needClear) { return; } m_inputBuffer.clear(); if (m_konsolePart) { m_konsoleFile->deleteLater(); m_konsolePart->deleteLater(); } m_konsoleFile = nullptr; m_konsolePart = createPart(); addPartToLayout(); } void PerfOutputWidgetKonsole::enableInput(bool enable) { if (enable != m_inputEnabled) { m_inputEnabled = enable; } } void PerfOutputWidgetKonsole::setInputVisible(bool visible) { Q_UNUSED(visible); } void PerfOutputWidgetKonsole::addPartToLayout() { Q_ASSERT(!m_konsoleFile); m_konsoleFile = new QTemporaryFile(m_konsolePart); m_konsoleFile->open(); const auto terminalInterface = qobject_cast(m_konsolePart); terminalInterface->startProgram(tailExe(), {tailExe(), QStringLiteral("-f"), m_konsoleFile->fileName()}); m_konsolePart->widget()->focusWidget()->installEventFilter(this); layout()->addWidget(m_konsolePart->widget()); } KDAB-hotspot-41e5de7/src/perfoutputwidgetkonsole.h000066400000000000000000000021711515036260400223100ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "perfoutputwidget.h" #include namespace KParts { class ReadOnlyPart; } class QTemporaryFile; class PerfOutputWidgetKonsole : public PerfOutputWidget { Q_OBJECT public: PerfOutputWidgetKonsole(KParts::ReadOnlyPart* part, QWidget* parent = nullptr); ~PerfOutputWidgetKonsole(); static PerfOutputWidgetKonsole* create(QWidget* parent = nullptr); bool eventFilter(QObject* watched, QEvent* event) override; void addOutput(const QString& output) override; void clear() override; void enableInput(bool enable) override; void setInputVisible(bool visible) override; private: void addPartToLayout(); KParts::ReadOnlyPart* m_konsolePart = nullptr; QTemporaryFile* m_konsoleFile = nullptr; bool m_inputEnabled = false; bool m_needClear = false; QByteArray m_inputBuffer; }; KDAB-hotspot-41e5de7/src/perfoutputwidgettext.cpp000066400000000000000000000040421515036260400221540ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "perfoutputwidgettext.h" #include #include #include #include PerfOutputWidgetText::PerfOutputWidgetText(QWidget* parent) : PerfOutputWidget(parent) { auto layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); m_perfOutputTextEdit = new QTextEdit(this); m_perfOutputTextEdit->setReadOnly(true); m_perfOutputTextEdit->setPlaceholderText(tr("Waiting for recording to start...")); m_perfOutputTextEdit->setFontFamily(QStringLiteral("Monospace")); layout->addWidget(m_perfOutputTextEdit); m_perfInputEdit = new QLineEdit(this); m_perfInputEdit->setEnabled(false); m_perfInputEdit->setPlaceholderText(tr("send input to process...")); layout->addWidget(m_perfInputEdit); connect(m_perfInputEdit, &QLineEdit::returnPressed, this, [this]() { emit sendInput(m_perfInputEdit->text().toUtf8() + QByteArrayLiteral("\n")); m_perfInputEdit->clear(); }); } PerfOutputWidgetText::~PerfOutputWidgetText() = default; void PerfOutputWidgetText::addOutput(const QString& output) { // this regex finds ansi escapes static const QRegularExpression regex(QStringLiteral("\\x1b\\[[0-9;]+m")); QTextCursor cursor(m_perfOutputTextEdit->document()); cursor.movePosition(QTextCursor::End); QString cleanOutput = output; cursor.insertText(cleanOutput.replace(regex, QString())); } void PerfOutputWidgetText::clear() { m_perfInputEdit->clear(); m_perfOutputTextEdit->clear(); } void PerfOutputWidgetText::enableInput(bool enable) { m_perfInputEdit->clear(); m_perfInputEdit->setEnabled(enable); } void PerfOutputWidgetText::setInputVisible(bool visible) { m_perfInputEdit->setVisible(visible); } KDAB-hotspot-41e5de7/src/perfoutputwidgettext.h000066400000000000000000000015131515036260400216210ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "perfoutputwidget.h" #include class QTemporaryFile; class QTextEdit; class QLineEdit; class PerfOutputWidgetText : public PerfOutputWidget { Q_OBJECT public: PerfOutputWidgetText(QWidget* parent = nullptr); ~PerfOutputWidgetText() override; void addOutput(const QString& output) override; void clear() override; void enableInput(bool enable) override; void setInputVisible(bool visible) override; private: QTextEdit* m_perfOutputTextEdit = nullptr; QLineEdit* m_perfInputEdit = nullptr; }; KDAB-hotspot-41e5de7/src/perfrecord.cpp000066400000000000000000000220671515036260400177700ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "perfrecord.h" #include "recordhost.h" #include #include #include #include #include #include #include #include #include #include #if KWINDOWSYSTEM_VERSION >= QT_VERSION_CHECK(5, 101, 0) #include #else #include #endif namespace { void createOutputFile(const QString& outputPath) { // elevated perf will obviously create a root-owned output by default, but testing revealed that // perf will write into a pre-existing file if it is empty (without changing ownership) const QString bakPath(outputPath + QStringLiteral(".old")); // QFile::rename does not overwrite files, so we need to remove it manually QFile::remove(bakPath); QFile::rename(outputPath, bakPath); QFile(outputPath).open(QIODevice::WriteOnly); } } PerfRecord::PerfRecord(const RecordHost* host, QObject* parent) : QObject(parent) , m_host(host) { connect(&m_perfControlFifo, &PerfControlFifoWrapper::started, this, [this]() { m_targetProcessForPrivilegedPerf.continueStoppedProcess(); }); connect(&m_perfControlFifo, &PerfControlFifoWrapper::noFIFO, this, [this] { emit recordingFailed(QStringLiteral("Failed to start process, broken control FIFO")); }); } PerfRecord::~PerfRecord() { stopRecording(); if (m_perfRecordProcess) { m_perfRecordProcess->waitForFinished(100); delete m_perfRecordProcess; } } bool PerfRecord::runPerf(bool elevatePrivileges, const QStringList& perfOptions, const QString& outputPath, const QString& workingDirectory) { // Reset perf record process to avoid getting signals from old processes if (m_perfRecordProcess) { disconnect(m_perfRecordProcess, nullptr, this, nullptr); m_perfControlFifo.requestStop(); m_perfRecordProcess->kill(); delete m_perfRecordProcess; m_perfControlFifo.close(); } m_perfRecordProcess = new QProcess(this); m_perfRecordProcess->setProcessChannelMode(QProcess::MergedChannels); const auto outputFileInfo = QFileInfo(outputPath); const auto folderPath = outputFileInfo.dir().path(); const auto folderInfo = QFileInfo(folderPath); if (!folderInfo.exists()) { emit recordingFailed(tr("Folder '%1' does not exist.").arg(folderPath)); return false; } if (!folderInfo.isDir()) { emit recordingFailed(tr("'%1' is not a folder.").arg(folderPath)); return false; } if (!folderInfo.isWritable()) { emit recordingFailed(tr("Folder '%1' is not writable.").arg(folderPath)); return false; } connect(m_perfRecordProcess.data(), static_cast(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus) const auto outputFileInfo = QFileInfo(m_outputPath); if ((exitCode == EXIT_SUCCESS || (exitCode == SIGTERM && m_userTerminated) || outputFileInfo.size() > 0) && outputFileInfo.exists()) { if (exitCode != EXIT_SUCCESS && !m_userTerminated) { emit debuggeeCrashed(); } emit recordingFinished(m_outputPath); } else { emit recordingFailed(tr("Failed to record perf data, error code %1.").arg(exitCode)); } m_userTerminated = false; delete m_perfRecordProcess; m_perfControlFifo.close(); }); connect(m_perfRecordProcess.data(), &QProcess::errorOccurred, this, [this](QProcess::ProcessError error) { Q_UNUSED(error) if (!m_userTerminated) { emit recordingFailed(m_perfRecordProcess->errorString()); } }); connect(m_perfRecordProcess.data(), &QProcess::started, this, [this] { emit recordingStarted(m_perfRecordProcess->program(), m_perfRecordProcess->arguments()); }); connect(m_perfRecordProcess.data(), &QProcess::readyRead, this, [this]() { const auto output = QString::fromUtf8(m_perfRecordProcess->readAll()); emit recordingOutput(output); }); m_outputPath = outputPath; m_userTerminated = false; if (!workingDirectory.isEmpty()) { m_perfRecordProcess->setWorkingDirectory(workingDirectory); } QStringList perfCommand = {QStringLiteral("record"), QStringLiteral("-o"), m_outputPath}; perfCommand += perfOptions; if (elevatePrivileges) { const auto pkexec = RecordHost::pkexecBinaryPath(); if (pkexec.isEmpty()) { emit recordingFailed(tr("The pkexec utility was not found, cannot elevate privileges.")); return false; } auto options = QStringList(); options.append(m_host->perfBinaryPath()); options += perfCommand; if (!m_perfControlFifo.open()) { emit recordingFailed(tr("Failed to create perf control fifos.")); return false; } options += {QStringLiteral("--control"), QStringLiteral("fifo:%1,%2").arg(m_perfControlFifo.controlFifoPath(), m_perfControlFifo.ackFifoPath())}; createOutputFile(outputPath); m_perfRecordProcess->start(pkexec, options); } else { m_perfRecordProcess->start(m_host->perfBinaryPath(), perfCommand); } return true; } void PerfRecord::record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges, const QStringList& pids) { if (pids.empty()) { emit recordingFailed(tr("Process does not exist.")); return; } QStringList options = perfOptions; options += {QStringLiteral("--pid"), pids.join(QLatin1Char(','))}; runPerf(actuallyElevatePrivileges(elevatePrivileges), options, outputPath, {}); } void PerfRecord::record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges, const QString& exePath, const QStringList& exeOptions, const QString& workingDirectory) { QFileInfo exeFileInfo(exePath); if (!exeFileInfo.exists()) { exeFileInfo.setFile(QStandardPaths::findExecutable(exePath)); } if (!exeFileInfo.exists()) { emit recordingFailed(tr("File '%1' does not exist.").arg(exePath)); return; } if (!exeFileInfo.isFile()) { emit recordingFailed(tr("'%1' is not a file.").arg(exePath)); return; } if (!exeFileInfo.isExecutable()) { emit recordingFailed(tr("File '%1' is not executable.").arg(exePath)); return; } QStringList options = perfOptions; if (actuallyElevatePrivileges(elevatePrivileges)) { if (!m_targetProcessForPrivilegedPerf.createProcessAndStop(exePath, exeOptions, workingDirectory)) { emit recordingFailed(tr("Failed to prepare a stopped process for %1.").arg(exePath)); return; } options += {QStringLiteral("--pid"), QString::number(m_targetProcessForPrivilegedPerf.processPID()), QStringLiteral("-D"), QStringLiteral("-1")}; if (!runPerf(true, options, outputPath, {})) { m_targetProcessForPrivilegedPerf.kill(); return; } m_perfControlFifo.requestStart(); } else { options.append(exeFileInfo.absoluteFilePath()); options += exeOptions; runPerf(false, options, outputPath, workingDirectory); } } void PerfRecord::recordSystem(const QStringList& perfOptions, const QString& outputPath) { auto options = perfOptions; options.append(QStringLiteral("--all-cpus")); runPerf(actuallyElevatePrivileges(true), options, outputPath, {}); } QString PerfRecord::perfCommand() const { if (m_perfRecordProcess) { return QLatin1String("perf ") + m_perfRecordProcess->arguments().join(QLatin1Char(' ')); } else { return {}; } } void PerfRecord::stopRecording() { m_userTerminated = true; if (m_perfRecordProcess) { if (m_perfControlFifo.isOpen()) { m_perfControlFifo.requestStop(); m_targetProcessForPrivilegedPerf.terminate(); } else { m_perfRecordProcess->terminate(); } } } void PerfRecord::sendInput(const QByteArray& input) { Q_ASSERT(m_perfRecordProcess); m_perfRecordProcess->write(input); } QStringList PerfRecord::offCpuProfilingOptions() { return {QStringLiteral("--switch-events"), QStringLiteral("--event"), QStringLiteral("sched:sched_switch")}; } bool PerfRecord::actuallyElevatePrivileges(bool elevatePrivileges) const { const auto capabilities = m_host->perfCapabilities(); return elevatePrivileges && capabilities.canElevatePrivileges && !capabilities.privilegesAlreadyElevated; } KDAB-hotspot-41e5de7/src/perfrecord.h000066400000000000000000000036721515036260400174360ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "initiallystoppedprocess.h" #include "perfcontrolfifowrapper.h" #include #include class QProcess; class RecordHost; class PerfRecord : public QObject { Q_OBJECT public: explicit PerfRecord(const RecordHost* host, QObject* parent = nullptr); ~PerfRecord(); void record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges, const QString& exePath, const QStringList& exeOptions, const QString& workingDirectory = QString()); void record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges, const QStringList& pids); void recordSystem(const QStringList& perfOptions, const QString& outputPath); QString perfCommand() const; void stopRecording(); void sendInput(const QByteArray& input); static QStringList offCpuProfilingOptions(); signals: void recordingStarted(const QString& perfBinary, const QStringList& arguments); void recordingFinished(const QString& fileLocation); void recordingFailed(const QString& errorMessage); void recordingOutput(const QString& errorMessage); void debuggeeCrashed(); private: const RecordHost* m_host = nullptr; QPointer m_perfRecordProcess; InitiallyStoppedProcess m_targetProcessForPrivilegedPerf; PerfControlFifoWrapper m_perfControlFifo; QString m_outputPath; bool m_userTerminated = false; bool actuallyElevatePrivileges(bool elevatePrivileges) const; bool runPerf(bool elevatePrivileges, const QStringList& perfOptions, const QString& outputPath, const QString& workingDirectory = QString()); }; KDAB-hotspot-41e5de7/src/perfsettingspage.ui000066400000000000000000000020771515036260400210410ustar00rootroot00000000000000 PerfSettingsPage 0 0 400 300 Form Perf Binary: perfPathEdit perf KUrlRequester QWidget
    kurlrequester.h
    KDAB-hotspot-41e5de7/src/recordhost.cpp000066400000000000000000000266151515036260400200140ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include #include #include #include #include "recordhost.h" #include "settings.h" #include "hotspot-config.h" namespace { QByteArray perfOutput(const QString& perfPath, const QStringList& arguments) { if (perfPath.isEmpty()) return {}; // TODO handle error if man is not installed QProcess process; auto reportError = [&]() { qWarning() << "Failed to run perf" << process.arguments() << process.error() << process.errorString() << process.readAllStandardError(); }; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert(QStringLiteral("LANG"), QStringLiteral("C")); process.setProcessEnvironment(env); QObject::connect(&process, &QProcess::errorOccurred, &process, reportError); process.start(perfPath, arguments); if (!process.waitForFinished(1000) || process.exitCode() != 0) reportError(); return process.readAllStandardOutput(); } QByteArray perfRecordHelp(const QString& perfPath) { QByteArray recordHelp = [&perfPath]() { QByteArray help = perfOutput(perfPath, {QStringLiteral("record"), QStringLiteral("--help")}); if (help.isEmpty()) { // no man page installed, assume the best help = "--sample-cpu --switch-events"; } return help; }(); return recordHelp; } QByteArray perfBuildOptions(const QString& perfPath) { return perfOutput(perfPath, {QStringLiteral("version"), QStringLiteral("--build-options")}); } bool canTrace(const QString& path) { const QFileInfo info(QLatin1String("/sys/kernel/debug/tracing/") + path); if (!info.isDir() || !info.isReadable()) { return false; } QFile paranoid(QStringLiteral("/proc/sys/kernel/perf_event_paranoid")); return paranoid.open(QIODevice::ReadOnly) && paranoid.readAll().trimmed() == "-1"; } QString findPkexec() { return QStandardPaths::findExecutable(QStringLiteral("pkexec")); } bool canElevatePrivileges() { return !findPkexec().isEmpty(); } bool privsAlreadyElevated() { if (KUser().isSuperUser()) return true; auto readSysctl = [](const char* path) { std::ifstream ifs {path}; int i = std::numeric_limits::min(); if (ifs) { ifs >> i; } return i; }; bool isElevated = readSysctl("/proc/sys/kernel/kptr_restrict") == 0; if (!isElevated) { return false; } isElevated = readSysctl("/proc/sys/kernel/perf_event_paranoid") == -1; if (!isElevated) { return false; } auto checkPerms = [](const char* path) { const mode_t required = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; // 755 struct stat buf; return stat(path, &buf) == 0 && ((buf.st_mode & 07777) & required) == required; }; static const auto paths = {"/sys/kernel/debug", "/sys/kernel/debug/tracing"}; isElevated = std::all_of(paths.begin(), paths.end(), checkPerms); return isElevated; } RecordHost::PerfCapabilities fetchLocalPerfCapabilities(const QString& perfPath) { RecordHost::PerfCapabilities capabilities; const auto buildOptions = perfBuildOptions(perfPath); const auto help = perfRecordHelp(perfPath); capabilities.canCompress = Zstd_FOUND && buildOptions.contains("zstd: [ on ]"); capabilities.canUseAio = buildOptions.contains("aio: [ on ]"); capabilities.libtraceeventSupport = buildOptions.contains("libtraceevent: [ on ]"); capabilities.canSwitchEvents = help.contains("--switch-events"); capabilities.canSampleCpu = help.contains("--sample-cpu"); capabilities.canProfileOffCpu = capabilities.libtraceeventSupport && canTrace(QStringLiteral("events/sched/sched_switch")); const auto isElevated = privsAlreadyElevated(); capabilities.privilegesAlreadyElevated = isElevated; capabilities.canElevatePrivileges = isElevated || canElevatePrivileges(); return capabilities; } } RecordHost::RecordHost(QObject* parent) : QObject(parent) , m_checkPerfCapabilitiesJob(this) , m_checkPerfInstalledJob(this) { connect(this, &RecordHost::errorOccurred, this, [this](const QString& message) { m_error = message; }); auto connectIsReady = [this](auto&& signal) { connect(this, signal, this, [this] { emit isReadyChanged(isReady()); }); }; connectIsReady(&RecordHost::clientApplicationChanged); connectIsReady(&RecordHost::isPerfInstalledChanged); connectIsReady(&RecordHost::perfCapabilitiesChanged); connectIsReady(&RecordHost::recordTypeChanged); connectIsReady(&RecordHost::pidsChanged); connectIsReady(&RecordHost::currentWorkingDirectoryChanged); setHost(QStringLiteral("localhost")); } RecordHost::~RecordHost() = default; bool RecordHost::isReady() const { switch (m_recordType) { case RecordType::LaunchApplication: // client application is already validated in the setter if (m_clientApplication.isEmpty() || m_cwd.isEmpty()) return false; break; case RecordType::AttachToProcess: if (m_pids.isEmpty()) return false; break; case RecordType::ProfileSystem: break; case RecordType::NUM_RECORD_TYPES: Q_ASSERT(false); } // it is save to run, when all queries where resolved and there are no errors const std::initializer_list jobs = {&m_checkPerfCapabilitiesJob, &m_checkPerfInstalledJob}; return m_isPerfInstalled && m_error.isEmpty() && std::none_of(jobs.begin(), jobs.end(), [](const JobTracker* job) { return job->isJobRunning(); }); } void RecordHost::setHost(const QString& host) { Q_ASSERT(QThread::currentThread() == thread()); // don't refresh if on the same host if (host == m_host) return; emit isReadyChanged(false); m_host = host; emit hostChanged(); // invalidate everything m_cwd.clear(); emit currentWorkingDirectoryChanged(m_cwd); m_clientApplication.clear(); emit clientApplicationChanged(m_clientApplication); m_perfCapabilities = {}; emit perfCapabilitiesChanged(m_perfCapabilities); const auto perfPath = perfBinaryPath(); m_checkPerfCapabilitiesJob.startJob([perfPath](auto&&) { return fetchLocalPerfCapabilities(perfPath); }, [this](RecordHost::PerfCapabilities capabilities) { Q_ASSERT(QThread::currentThread() == thread()); m_perfCapabilities = capabilities; emit perfCapabilitiesChanged(m_perfCapabilities); }); m_checkPerfInstalledJob.startJob( [isLocal = isLocal(), perfPath](auto&&) { if (isLocal) { if (perfPath.isEmpty()) { return !QStandardPaths::findExecutable(QStringLiteral("perf")).isEmpty(); } return QFileInfo::exists(perfPath); } qWarning() << "remote is not implemented"; return false; }, [this](bool isInstalled) { if (!isInstalled) { emit errorOccurred(tr("perf is not installed")); } m_isPerfInstalled = isInstalled; emit isPerfInstalledChanged(isInstalled); }); } void RecordHost::setCurrentWorkingDirectory(const QString& cwd) { Q_ASSERT(QThread::currentThread() == thread()); if (isLocal()) { const QFileInfo folder(cwd); if (!folder.exists()) { emit errorOccurred(tr("Working directory folder cannot be found: %1").arg(cwd)); } else if (!folder.isDir()) { emit errorOccurred(tr("Working directory folder is not valid: %1").arg(cwd)); } else if (!folder.isWritable()) { emit errorOccurred(tr("Working directory folder is not writable: %1").arg(cwd)); } else { emit errorOccurred({}); m_cwd = cwd; emit currentWorkingDirectoryChanged(cwd); } return; } qWarning() << "is not implemented for remote"; } void RecordHost::setClientApplication(const QString& clientApplication) { Q_ASSERT(QThread::currentThread() == thread()); if (isLocal()) { QFileInfo application(KShell::tildeExpand(clientApplication)); if (!application.exists()) { application.setFile(QStandardPaths::findExecutable(clientApplication)); } if (!application.exists()) { emit errorOccurred(tr("Application file cannot be found: %1").arg(clientApplication)); } else if (!application.isFile()) { emit errorOccurred(tr("Application file is not valid: %1").arg(clientApplication)); } else if (!application.isExecutable()) { emit errorOccurred(tr("Application file is not executable: %1").arg(clientApplication)); } else { emit errorOccurred({}); m_clientApplication = clientApplication; emit clientApplicationChanged(m_clientApplication); } if (m_cwd.isEmpty()) { setCurrentWorkingDirectory(application.dir().absolutePath()); } return; } qWarning() << "is not implemented for remote"; } void RecordHost::setOutputFileName(const QString& filePath) { if (isLocal()) { const auto perfDataExtension = QStringLiteral(".data"); const QFileInfo file(filePath); const QFileInfo folder(file.absolutePath()); if (!folder.exists()) { emit errorOccurred(tr("Output file directory folder cannot be found: %1").arg(folder.path())); } else if (!folder.isDir()) { emit errorOccurred(tr("Output file directory folder is not valid: %1").arg(folder.path())); } else if (!folder.isWritable()) { emit errorOccurred(tr("Output file directory folder is not writable: %1").arg(folder.path())); } else if (!file.absoluteFilePath().endsWith(perfDataExtension)) { emit errorOccurred(tr("Output file must end with %1").arg(perfDataExtension)); } else { emit errorOccurred({}); m_outputFileName = filePath; emit outputFileNameChanged(m_outputFileName); } return; } qWarning() << "is not implemented for remote"; } void RecordHost::setRecordType(RecordType type) { if (m_recordType != type) { m_recordType = type; emit errorOccurred({}); emit recordTypeChanged(m_recordType); m_pids.clear(); emit pidsChanged(); } } void RecordHost::setPids(const QStringList& pids) { if (m_pids != pids) { m_pids = pids; emit pidsChanged(); } } bool RecordHost::isLocal() const { return m_host == QLatin1String("localhost"); } QString RecordHost::pkexecBinaryPath() { return findPkexec(); } QString RecordHost::perfBinaryPath() const { if (isLocal()) { auto perf = Settings::instance()->perfPath(); if (perf.isEmpty()) perf = QStandardPaths::findExecutable(QStringLiteral("perf")); return perf; } return {}; } KDAB-hotspot-41e5de7/src/recordhost.h000066400000000000000000000063611515036260400174550ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "jobtracker.h" #include enum class RecordType { LaunchApplication, AttachToProcess, ProfileSystem, NUM_RECORD_TYPES }; Q_DECLARE_METATYPE(RecordType) class RecordHost : public QObject { Q_OBJECT public: explicit RecordHost(QObject* parent = nullptr); ~RecordHost() override; // might be false when async ops is ongoing internally bool isReady() const; QString errorMessage() const { return m_error; } bool isPerfInstalled() const { return m_isPerfInstalled; } QString host() const { return m_host; } void setHost(const QString& host); // TODO: username etc. pp. QString currentWorkingDirectory() const { return m_cwd; } void setCurrentWorkingDirectory(const QString& cwd); QString clientApplication() const { return m_clientApplication; } void setClientApplication(const QString& clientApplication); QString outputFileName() const { return m_outputFileName; } void setOutputFileName(const QString& filePath); static QString pkexecBinaryPath(); QString perfBinaryPath() const; // async query options struct PerfCapabilities { // see all virtuals in PerfRecord can* bool canProfileOffCpu = false; bool canSampleCpu = false; bool canSwitchEvents = false; bool canUseAio = false; bool canCompress = false; bool canElevatePrivileges = false; bool privilegesAlreadyElevated = false; bool libtraceeventSupport = false; }; PerfCapabilities perfCapabilities() const { // reset member to default all = false when host or perf binary changes return m_perfCapabilities; } RecordType recordType() const { return m_recordType; } void setRecordType(RecordType type); // list of pids to record void setPids(const QStringList& pids); signals: /// disallow "start" on recordpage until this is ready and that should only be the case when there's no error void isReadyChanged(bool isReady); void errorOccurred(const QString& message); void hostChanged(); void currentWorkingDirectoryChanged(const QString& cwd); // Maybe QUrl void clientApplicationChanged(const QString& clientApplication); void perfCapabilitiesChanged(RecordHost::PerfCapabilities perfCapabilities); void isPerfInstalledChanged(bool isInstalled); void outputFileNameChanged(const QString& outputFileName); void recordTypeChanged(RecordType type); void pidsChanged(); private: bool isLocal() const; QString m_host; QString m_error; QString m_cwd; QString m_clientApplication; QString m_outputFileName; PerfCapabilities m_perfCapabilities; JobTracker m_checkPerfCapabilitiesJob; JobTracker m_checkPerfInstalledJob; RecordType m_recordType = RecordType::LaunchApplication; bool m_isPerfInstalled = false; QStringList m_pids; }; Q_DECLARE_METATYPE(RecordHost::PerfCapabilities) KDAB-hotspot-41e5de7/src/recordpage.cpp000066400000000000000000000752441515036260400177550ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "recordpage.h" #include "ui_recordpage.h" #include "processfiltermodel.h" #include "processmodel.h" #include "recordhost.h" #include "resultsutil.h" #include "util.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "multiconfigwidget.h" #include "perfoutputwidgetkonsole.h" #include "perfoutputwidgettext.h" #include "perfrecord.h" namespace { bool isIntel() { using namespace Solid; const auto list = Device::listFromType(DeviceInterface::Processor, QString()); if (list.isEmpty()) { return false; } const auto& device = list[0]; if (!device.is()) { return false; } const auto* processor = device.as(); const auto instructionSets = processor->instructionSets(); return instructionSets.testFlag(Processor::IntelMmx) || instructionSets.testFlag(Processor::IntelSse) || instructionSets.testFlag(Processor::IntelSse2) || instructionSets.testFlag(Processor::IntelSse3) || instructionSets.testFlag(Processor::IntelSsse3) || instructionSets.testFlag(Processor::IntelSse4) || instructionSets.testFlag(Processor::IntelSse41) || instructionSets.testFlag(Processor::IntelSse42); } RecordType selectedRecordType(const std::unique_ptr& ui) { return ui->recordTypeComboBox->currentData().value(); } KConfigGroup config() { return KSharedConfig::openConfig()->group(QStringLiteral("RecordPage")); } KConfigGroup applicationConfig(const QString& application) { if (application.isEmpty()) return {}; return config().group(QLatin1String("Application ") + KShell::tildeExpand(application)); } constexpr const int MAX_COMBO_ENTRIES = 10; void rememberCombobox(KConfigGroup config, const QString& entryName, const QString& value, QComboBox* combo) { // remove the value if it exists already auto idx = combo->findText(value); if (idx != -1) { combo->removeItem(idx); } // insert value on front combo->insertItem(0, value); combo->setCurrentIndex(0); // store the values in the config QStringList values; values.reserve(combo->count()); for (int i = 0, c = std::min(MAX_COMBO_ENTRIES, combo->count()); i < c; ++i) { values << combo->itemText(i); } config.writeEntry(entryName, values); } void restoreCombobox(const KConfigGroup& config, const QString& entryName, QComboBox* combo, const QStringList& defaults = {}) { combo->clear(); const auto& values = config.readEntry(entryName, defaults); for (const auto& application : values) { combo->addItem(application); } } void rememberApplication(const QString& application, const QString& appParameters, const QString& workingDir, KComboBox* combo) { // set the app config early, so when we change the combo box below we can // restore the options as expected auto options = applicationConfig(application); options.writeEntry("params", appParameters); options.writeEntry("workingDir", workingDir); rememberCombobox(config(), QStringLiteral("applications"), application, combo); } } RecordPage::RecordPage(QWidget* parent) : QWidget(parent) , ui(std::make_unique()) , m_recordHost(new RecordHost(this)) , m_perfRecord(new PerfRecord(m_recordHost, this)) , m_updateRuntimeTimer(new QTimer(this)) , m_watcher(new QFutureWatcher(this)) { { auto* layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); auto* scrollArea = new QScrollArea(this); scrollArea->setFrameStyle(QFrame::NoFrame); layout->addWidget(scrollArea); auto* contents = new QWidget(this); scrollArea->setWidget(contents); scrollArea->setWidgetResizable(true); ui->setupUi(contents); } connect(m_recordHost, &RecordHost::errorOccurred, this, &RecordPage::setError); connect(m_recordHost, &RecordHost::isReadyChanged, this, [this](bool isReady) { ui->startRecordingButton->setEnabled(isReady); }); connect(m_recordHost, &RecordHost::isPerfInstalledChanged, this, [this](bool isInstalled) { if (!isInstalled) { ui->startRecordingButton->setEnabled(false); ui->applicationRecordErrorMessage->setText(QObject::tr("Please install perf before trying to record.")); ui->applicationRecordErrorMessage->setVisible(true); } }); connect(m_recordHost, &RecordHost::clientApplicationChanged, this, [this](const QString& filePath) { const auto config = applicationConfig(filePath); ui->workingDirectory->setText(config.readEntry("workingDir", QString())); ui->applicationParametersBox->setText(config.readEntry("params", QString())); m_multiConfig->setConfig(applicationConfig(ui->applicationName->text())); }); ui->compressionComboBox->addItem(tr("Disabled"), -1); ui->compressionComboBox->addItem(tr("Enabled (Default Level)"), 0); ui->compressionComboBox->addItem(tr("Level 1 (Fastest)"), 1); for (int i = 2; i <= 21; ++i) ui->compressionComboBox->addItem(tr("Level %1").arg(i), 0); ui->compressionComboBox->addItem(tr("Level 22 (Slowest)"), 22); ui->compressionComboBox->setCurrentIndex(1); const auto defaultLevel = ui->compressionComboBox->currentData().toInt(); const auto level = config().readEntry(QStringLiteral("compressionLevel"), defaultLevel); const auto index = ui->compressionComboBox->findData(level); if (index != -1) ui->compressionComboBox->setCurrentIndex(index); connect(m_recordHost, &RecordHost::perfCapabilitiesChanged, this, [this](RecordHost::PerfCapabilities capabilities) { ui->sampleCpuCheckBox->setVisible(capabilities.canSampleCpu); ui->sampleCpuLabel->setVisible(capabilities.canSampleCpu); ui->offCpuCheckBox->setVisible(capabilities.canSwitchEvents); ui->offCpuLabel->setVisible(capabilities.canSwitchEvents); ui->useAioCheckBox->setVisible(capabilities.canUseAio); ui->useAioLabel->setVisible(capabilities.canUseAio); ui->compressionComboBox->setVisible(capabilities.canCompress); ui->compressionLabel->setVisible(capabilities.canCompress); ui->offCpuCheckBox->setCheckable(capabilities.libtraceeventSupport); if (!capabilities.libtraceeventSupport) { ui->offCpuCheckBox->setChecked(false); ui->offCpuCheckBox->setText( tr("perf doesn't support libtraceevent, you may need to build perf manually to support this")); } if (!capabilities.canElevatePrivileges) { ui->elevatePrivilegesCheckBox->setChecked(false); ui->elevatePrivilegesCheckBox->setEnabled(false); ui->elevatePrivilegesCheckBox->setText( tr("(Note: Install pkexec, kdesudo, kdesu or KAuth to temporarily elevate perf privileges.)")); } else { ui->elevatePrivilegesCheckBox->setEnabled(true); ui->elevatePrivilegesCheckBox->setText({}); } }); m_recordHost->setHost(QStringLiteral("localhost")); ui->applicationName->comboBox()->setEditable(true); ui->applicationName->setMode(KFile::File | KFile::ExistingOnly | KFile::LocalOnly); // we are only interested in executable files, so set the mime type filter accordingly // note that exe's build with PIE are actually "shared libs"... ui->applicationName->setMimeTypeFilters( {QStringLiteral("application/x-executable"), QStringLiteral("application/x-sharedlib")}); ui->workingDirectory->setMode(KFile::Directory | KFile::LocalOnly); ui->outputFile->setText(QDir::currentPath() + QDir::separator() + QStringLiteral("perf.data")); m_recordHost->setOutputFileName(QDir::currentPath() + QDir::separator() + QStringLiteral("perf.data")); ui->outputFile->setMode(KFile::File | KFile::LocalOnly); ui->eventTypeBox->lineEdit()->setPlaceholderText(tr("perf defaults (usually cycles:Pu)")); m_perfOutput = PerfOutputWidgetKonsole::create(this); if (!m_perfOutput) { m_perfOutput = new PerfOutputWidgetText(this); } ui->recordOutputBoxLayout->addWidget(m_perfOutput); connect(m_perfOutput, &PerfOutputWidget::sendInput, this, [this](const QByteArray& input) { m_perfRecord->sendInput(input); }); auto saveFunction = [this](KConfigGroup group) { group.writeEntry("params", ui->applicationParametersBox->text()); group.writeEntry("workingDir", ui->workingDirectory->text()); }; auto restoreFunction = [this](const KConfigGroup& group) { ui->applicationParametersBox->setText(group.readEntry("params", "")); ui->workingDirectory->setText(group.readEntry("workingDir", "")); setError({}); }; m_multiConfig = new MultiConfigWidget(this); connect(m_multiConfig, &MultiConfigWidget::saveConfig, this, saveFunction); connect(m_multiConfig, &MultiConfigWidget::restoreConfig, this, restoreFunction); m_multiConfig->setConfig(applicationConfig(ui->applicationName->text())); ui->launchAppBox->layout()->addWidget(m_multiConfig); connect(ui->applicationParametersBox, &QLineEdit::editingFinished, m_multiConfig, &MultiConfigWidget::updateCurrentConfig); connect(ui->workingDirectory, &KUrlRequester::textChanged, m_multiConfig, &MultiConfigWidget::updateCurrentConfig); auto columnResizer = new KColumnResizer(this); columnResizer->addWidgetsFromLayout(ui->formLayout); columnResizer->addWidgetsFromLayout(ui->formLayout_1); columnResizer->addWidgetsFromLayout(ui->formLayout_2); columnResizer->addWidgetsFromLayout(ui->formLayout_3); connect(ui->homeButton, &QPushButton::clicked, this, &RecordPage::homeButtonClicked); connect(ui->applicationName, &KUrlRequester::textChanged, m_recordHost, &RecordHost::setClientApplication); connect(ui->startRecordingButton, &QPushButton::toggled, this, &RecordPage::onStartRecordingButtonClicked); connect(ui->workingDirectory, &KUrlRequester::textChanged, m_recordHost, &RecordHost::setCurrentWorkingDirectory); connect(ui->viewPerfRecordResultsButton, &QPushButton::clicked, this, [this] { emit openFile(m_resultsFile); }); connect(ui->outputFile, &KUrlRequester::textChanged, m_recordHost, &RecordHost::setOutputFileName); connect(ui->outputFile, static_cast(&KUrlRequester::returnPressed), m_recordHost, &RecordHost::setOutputFileName); connect(ui->outputFile, &KUrlRequester::urlSelected, m_recordHost, [this](const QUrl& url) { m_recordHost->setOutputFileName(url.toLocalFile()); }); ui->recordTypeComboBox->addItem(QIcon::fromTheme(QStringLiteral("run-build")), tr("Launch Application"), QVariant::fromValue(RecordType::LaunchApplication)); ui->recordTypeComboBox->addItem(QIcon::fromTheme(QStringLiteral("run-install")), tr("Attach To Process(es)"), QVariant::fromValue(RecordType::AttachToProcess)); ui->recordTypeComboBox->addItem(QIcon::fromTheme(QStringLiteral("run-build-install-root")), tr("Profile System"), QVariant::fromValue(RecordType::ProfileSystem)); connect(ui->recordTypeComboBox, qOverload(&QComboBox::currentIndexChanged), this, &RecordPage::updateRecordType); connect(ui->recordTypeComboBox, qOverload(&QComboBox::currentIndexChanged), m_recordHost, [this] { m_recordHost->setRecordType(ui->recordTypeComboBox->currentData().value()); }); connect(m_recordHost, &RecordHost::clientApplicationChanged, this, &RecordPage::updateRecordType); { ui->callGraphComboBox->addItem(tr("None"), QVariant::fromValue(QString())); ui->callGraphComboBox->setItemData( ui->callGraphComboBox->count() - 1, tr("Do not unwind the call stack. This results in tiny data files. " " But the data can be hard to make use of, when hotspots lie " " in third party or system libraries not under your direct control."), Qt::ToolTipRole); const auto dwarfIdx = ui->callGraphComboBox->count(); ui->callGraphComboBox->addItem(tr("DWARF"), QVariant::fromValue(QStringLiteral("dwarf"))); ui->callGraphComboBox->setItemData( dwarfIdx, tr("Use the DWARF unwinder, which requires debug information to be available." " This can result in large data files, but is usually the most portable option to use."), Qt::ToolTipRole); ui->callGraphComboBox->addItem(tr("Frame Pointer"), QVariant::fromValue(QStringLiteral("fp"))); ui->callGraphComboBox->setItemData( ui->callGraphComboBox->count() - 1, tr("Use the frame pointer for stack unwinding. This only works when your code was compiled" " with -fno-omit-framepointer, which is usually not the case nowadays." " As such, only use this option when you know that you have frame pointers available." " If frame pointers are available, this option is the recommended unwinding option," " as it results in smaller data files and has less overhead while recording."), Qt::ToolTipRole); if (isIntel()) { ui->callGraphComboBox->addItem(tr("Last Branch Record"), QVariant::fromValue(QStringLiteral("lbr"))); ui->callGraphComboBox->setItemData( ui->callGraphComboBox->count() - 1, tr("Use the Last Branch Record (LBR) for stack unwinding. This only works on newer Intel CPUs" " but does not require any special compile options. The depth of the LBR is relatively limited," " which makes this option not too useful for many real-world applications."), Qt::ToolTipRole); } ui->callGraphComboBox->setCurrentIndex(dwarfIdx); } { for (const auto size : {1024, 2048, 4096, 8192, 16384}) { ui->stackDumpComboBox->addItem(QString::number(size)); } // select 8196 (perf default) ui->stackDumpComboBox->setCurrentIndex(3); } connect(ui->callGraphComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) { // these elements only need to hide if the user changed the callgraph method // the default is DWARF const bool isDwarf = ui->callGraphComboBox->itemData(index) == QLatin1String("dwarf"); ui->stackDumpComboBox->setVisible(isDwarf); ui->stackSizeLabel->setVisible(isDwarf); }); connect(m_perfRecord, &PerfRecord::recordingStarted, this, [this](const QString& perfBinary, const QStringList& arguments) { m_recordTimer.start(); m_updateRuntimeTimer->start(); appendOutput(QLatin1String("$ ") + perfBinary + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')) + QLatin1Char('\n')); m_perfOutput->enableInput(true); }); connect(m_perfRecord, &PerfRecord::recordingFinished, this, [this](const QString& fileLocation) { appendOutput(tr("\nrecording finished after %1").arg(Util::formatTimeString(m_recordTimer.nsecsElapsed()))); m_resultsFile = fileLocation; setError({}); recordingStopped(); ui->viewPerfRecordResultsButton->setEnabled(true); }); connect(m_perfRecord, &PerfRecord::recordingFailed, this, [this](const QString& errorMessage) { if (m_recordTimer.isValid()) { appendOutput(tr("\nrecording failed after %1: %2") .arg(Util::formatTimeString(m_recordTimer.nsecsElapsed()), errorMessage)); } else { appendOutput(tr("\nrecording failed: %1").arg(errorMessage)); } setError(errorMessage); recordingStopped(); ui->viewPerfRecordResultsButton->setEnabled(false); }); connect(m_perfRecord, &PerfRecord::debuggeeCrashed, this, [this] { ui->applicationRecordWarningMessage->setText(tr("Debugge crashed. Results may be unusable.")); ui->applicationRecordWarningMessage->show(); }); connect(m_perfRecord, &PerfRecord::recordingOutput, this, &RecordPage::appendOutput); m_processModel = new ProcessModel(this); m_processProxyModel = new ProcessFilterModel(this); m_processProxyModel->setSourceModel(m_processModel); m_processProxyModel->setDynamicSortFilter(true); ui->processesTableView->setModel(m_processProxyModel); // hide state ui->processesTableView->hideColumn(ProcessModel::StateColumn); ui->processesTableView->sortByColumn(ProcessModel::NameColumn, Qt::AscendingOrder); ui->processesTableView->setSortingEnabled(true); ui->processesTableView->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->processesTableView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->processesTableView->setSelectionMode(QAbstractItemView::MultiSelection); connect(ui->processesTableView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this](const QItemSelection&, const QItemSelection&) { const auto selection = ui->processesTableView->selectionModel()->selectedRows(); QStringList pids; pids.reserve(selection.size()); for (const auto& item : selection) { pids.append(item.data(ProcessModel::PIDRole).toString()); } m_recordHost->setPids(pids); }); ResultsUtil::connectFilter(ui->processesFilterBox, m_processProxyModel, ui->regexCheckBox); connect(m_watcher, &QFutureWatcher::finished, this, &RecordPage::updateProcessesFinished); auto updateOffCpuCheckboxState = [this](RecordHost::PerfCapabilities capabilities) { const bool enableOffCpuProfiling = (ui->elevatePrivilegesCheckBox->isChecked() || capabilities.canProfileOffCpu) && capabilities.canSwitchEvents && capabilities.libtraceeventSupport; if (enableOffCpuProfiling == ui->offCpuCheckBox->isEnabled()) { return; } ui->offCpuCheckBox->setEnabled(enableOffCpuProfiling); // prevent user confusion: don't show the value as checked when the checkbox is disabled if (!enableOffCpuProfiling) { // remember the current value config().writeEntry(QStringLiteral("offCpuProfiling"), ui->offCpuCheckBox->isChecked()); ui->offCpuCheckBox->setChecked(false); } else { ui->offCpuCheckBox->setChecked(config().readEntry(QStringLiteral("offCpuProfiling"), false)); } }; connect(ui->elevatePrivilegesCheckBox, &QCheckBox::toggled, this, [this, updateOffCpuCheckboxState] { updateOffCpuCheckboxState(m_recordHost->perfCapabilities()); }); connect(m_recordHost, &RecordHost::perfCapabilitiesChanged, this, updateOffCpuCheckboxState); restoreCombobox(config(), QStringLiteral("applications"), ui->applicationName->comboBox()); restoreCombobox(config(), QStringLiteral("eventType"), ui->eventTypeBox, {ui->eventTypeBox->currentText()}); restoreCombobox(config(), QStringLiteral("customOptions"), ui->perfParams); // set application in RecordHost if it was restored m_recordHost->setClientApplication(ui->applicationName->text()); ui->elevatePrivilegesCheckBox->setChecked(config().readEntry(QStringLiteral("elevatePrivileges"), false)); ui->offCpuCheckBox->setChecked(config().readEntry(QStringLiteral("offCpuProfiling"), false)); ui->sampleCpuCheckBox->setChecked(config().readEntry(QStringLiteral("sampleCpu"), true)); ui->mmapPagesSpinBox->setValue(config().readEntry(QStringLiteral("mmapPages"), 16)); ui->mmapPagesUnitComboBox->setCurrentIndex(config().readEntry(QStringLiteral("mmapPagesUnit"), 2)); connect(m_recordHost, &RecordHost::perfCapabilitiesChanged, this, [this](RecordHost::PerfCapabilities capabilities) { ui->useAioCheckBox->setChecked(config().readEntry(QStringLiteral("useAio"), capabilities.canUseAio)); }); const auto callGraph = config().readEntry("callGraph", ui->callGraphComboBox->currentData()); const auto callGraphIdx = ui->callGraphComboBox->findData(callGraph); if (callGraphIdx != -1) { ui->callGraphComboBox->setCurrentIndex(callGraphIdx); } m_updateRuntimeTimer->setInterval(1000); connect(m_updateRuntimeTimer, &QTimer::timeout, this, [this] { // round to the nearest second const auto roundedElapsed = std::round(double(m_recordTimer.nsecsElapsed()) / 1E9) * 1E9; ui->startRecordingButton->setText(tr("Stop Recording (%1)").arg(Util::formatTimeString(roundedElapsed, true))); }); auto* stopRecordingShortcut = new QShortcut(tr("Escape"), this); stopRecordingShortcut->setContext(Qt::WidgetWithChildrenShortcut); connect(stopRecordingShortcut, &QShortcut::activated, this, [this] { ui->startRecordingButton->setChecked(false); }); auto* startRecordingShortcut = new QShortcut(tr("Ctrl+Return"), this); startRecordingShortcut->setContext(Qt::WidgetWithChildrenShortcut); connect(startRecordingShortcut, &QShortcut::activated, this, [this] { if (ui->viewPerfRecordResultsButton->isEnabled()) { ui->viewPerfRecordResultsButton->click(); } else if (ui->startRecordingButton->isEnabled()) { ui->startRecordingButton->setChecked(true); } }); showRecordPage(); ui->applicationRecordWarningMessage->setVisible(false); } RecordPage::~RecordPage() = default; void RecordPage::showRecordPage() { m_resultsFile.clear(); setError({}); updateRecordType(); ui->viewPerfRecordResultsButton->setEnabled(false); } void RecordPage::onStartRecordingButtonClicked(bool checked) { const auto recordType = selectedRecordType(ui); if (checked) { showRecordPage(); m_watcher->cancel(); ui->recordTypeComboBox->setEnabled(false); ui->launchAppBox->setEnabled(false); ui->attachAppBox->setEnabled(false); ui->perfOptionsBox->setEnabled(false); ui->startRecordingButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-stop"))); ui->startRecordingButton->setText(tr("Stop Recording")); m_perfOutput->clear(); ui->applicationRecordWarningMessage->hide(); auto perfCapabilities = m_recordHost->perfCapabilities(); QStringList perfOptions; const auto callGraphOption = ui->callGraphComboBox->currentData().toString(); config().writeEntry("callGraph", callGraphOption); if (!callGraphOption.isEmpty()) { perfOptions << QStringLiteral("--call-graph"); if (callGraphOption == QLatin1String("dwarf")) { perfOptions << callGraphOption + QStringLiteral(",") + ui->stackDumpComboBox->currentText(); } else { perfOptions << callGraphOption; } } const auto eventType = ui->eventTypeBox->currentText(); rememberCombobox(config(), QStringLiteral("eventType"), eventType, ui->eventTypeBox); if (!eventType.isEmpty()) { perfOptions << QStringLiteral("--event") << eventType; } const auto customOptions = ui->perfParams->currentText(); rememberCombobox(config(), QStringLiteral("customOptions"), customOptions, ui->perfParams); perfOptions += KShell::splitArgs(customOptions); const bool offCpuProfilingEnabled = ui->offCpuCheckBox->isChecked(); if (offCpuProfilingEnabled && perfCapabilities.canSwitchEvents) { if (eventType.isEmpty()) { // TODO: use clock event in VM context perfOptions += QStringLiteral("--event"); perfOptions += QStringLiteral("cycles"); } perfOptions += PerfRecord::offCpuProfilingOptions(); } config().writeEntry(QStringLiteral("offCpuProfiling"), offCpuProfilingEnabled); const bool useAioEnabled = ui->useAioCheckBox->isChecked(); if (useAioEnabled && perfCapabilities.canUseAio) { perfOptions += QStringLiteral("--aio"); } config().writeEntry(QStringLiteral("useAio"), useAioEnabled); const auto compressionLevel = ui->compressionComboBox->currentData().toInt(); if (perfCapabilities.canCompress && compressionLevel >= 0) { if (compressionLevel == 0) perfOptions += QStringLiteral("-z"); else perfOptions += QStringLiteral("--compression-level=") + QString::number(compressionLevel); } config().writeEntry(QStringLiteral("compressionLevel"), compressionLevel); const bool elevatePrivileges = ui->elevatePrivilegesCheckBox->isChecked(); const bool sampleCpuEnabled = ui->sampleCpuCheckBox->isChecked(); if (sampleCpuEnabled && perfCapabilities.canSampleCpu) { perfOptions += QStringLiteral("--sample-cpu"); } if (recordType != RecordType::ProfileSystem) { // always true when recording full system config().writeEntry(QStringLiteral("elevatePrivileges"), elevatePrivileges); config().writeEntry(QStringLiteral("sampleCpu"), sampleCpuEnabled); } const int mmapPages = ui->mmapPagesSpinBox->value(); const int mmapPagesUnit = ui->mmapPagesUnitComboBox->currentIndex(); if (mmapPages > 0) { auto mmapPagesArg = QString::number(mmapPages); switch (mmapPagesUnit) { case 0: mmapPagesArg.append(QLatin1Char('B')); break; case 1: mmapPagesArg.append(QLatin1Char('K')); break; case 2: mmapPagesArg.append(QLatin1Char('M')); break; case 3: mmapPagesArg.append(QLatin1Char('G')); break; case 4: // pages, no unit break; default: qWarning() << "Unhandled mmap pages unit"; break; } perfOptions += QStringLiteral("--mmap-pages"); perfOptions += mmapPagesArg; } config().writeEntry(QStringLiteral("mmapPages"), mmapPages); config().writeEntry(QStringLiteral("mmapPagesUnit"), mmapPagesUnit); const auto outputFile = m_recordHost->outputFileName(); switch (recordType) { case RecordType::LaunchApplication: { const auto applicationName = m_recordHost->clientApplication(); const auto appParameters = ui->applicationParametersBox->text(); auto workingDir = m_recordHost->currentWorkingDirectory(); if (workingDir.isEmpty()) { workingDir = ui->workingDirectory->placeholderText(); } rememberApplication(applicationName, appParameters, workingDir, ui->applicationName->comboBox()); m_perfRecord->record(perfOptions, outputFile, elevatePrivileges, applicationName, KShell::splitArgs(appParameters), workingDir); break; } case RecordType::AttachToProcess: { QItemSelectionModel* selectionModel = ui->processesTableView->selectionModel(); QStringList pids; const auto selection = selectionModel->selectedIndexes(); for (const auto& item : selection) { if (item.column() == 0) { pids.append(item.data(ProcessModel::PIDRole).toString()); } } m_perfRecord->record(perfOptions, outputFile, elevatePrivileges, pids); break; } case RecordType::ProfileSystem: { m_perfRecord->recordSystem(perfOptions, outputFile); break; } case RecordType::NUM_RECORD_TYPES: break; } } else { m_updateRuntimeTimer->stop(); ui->startRecordingButton->setText(tr("Stopping recording...")); ui->startRecordingButton->setEnabled(false); stopRecording(); } } void RecordPage::recordingStopped() { m_updateRuntimeTimer->stop(); m_recordTimer.invalidate(); ui->startRecordingButton->setChecked(false); ui->startRecordingButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start"))); ui->startRecordingButton->setText(tr("Start Recording")); ui->startRecordingButton->setEnabled(true); ui->recordTypeComboBox->setEnabled(true); ui->launchAppBox->setEnabled(true); ui->attachAppBox->setEnabled(true); ui->perfOptionsBox->setEnabled(true); m_perfOutput->enableInput(false); } void RecordPage::stopRecording() { m_perfRecord->stopRecording(); } void RecordPage::updateProcesses() { m_watcher->setFuture(QtConcurrent::run(processList)); } void RecordPage::updateProcessesFinished() { if (ui->startRecordingButton->isChecked() || selectedRecordType(ui) != RecordType::AttachToProcess) { return; } if (!m_watcher->isCanceled()) m_processModel->mergeProcesses(m_watcher->result()); QTimer::singleShot(1000, this, &RecordPage::updateProcesses); } void RecordPage::appendOutput(const QString& text) { m_perfOutput->addOutput(text); } void RecordPage::setError(const QString& message) { ui->applicationRecordErrorMessage->setText(message); ui->applicationRecordErrorMessage->setVisible(!message.isEmpty()); } void RecordPage::updateRecordType() { setError({}); const auto recordType = selectedRecordType(ui); ui->launchAppBox->setVisible(recordType == RecordType::LaunchApplication); ui->attachAppBox->setVisible(recordType == RecordType::AttachToProcess); m_perfOutput->setInputVisible(recordType == RecordType::LaunchApplication); m_perfOutput->clear(); if (recordType == RecordType::AttachToProcess) { updateProcesses(); } } KDAB-hotspot-41e5de7/src/recordpage.h000066400000000000000000000032441515036260400174110ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include #include "processlist.h" #include "recordhost.h" #include class QTimer; class QTemporaryFile; namespace Ui { class RecordPage; } class PerfRecord; class ProcessModel; class ProcessFilterModel; class MultiConfigWidget; class PerfOutputWidget; namespace KParts { class ReadOnlyPart; } class RecordPage : public QWidget { Q_OBJECT public: explicit RecordPage(QWidget* parent = nullptr); ~RecordPage(); void showRecordPage(); void stopRecording(); signals: void homeButtonClicked(); void openFile(const QString& filePath); private: void onStartRecordingButtonClicked(bool checked); void updateProcesses(); void updateProcessesFinished(); void recordingStopped(); void updateRecordType(); void appendOutput(const QString& text); void setError(const QString& message); std::unique_ptr ui; RecordHost* m_recordHost; PerfRecord* m_perfRecord; QString m_resultsFile; QElapsedTimer m_recordTimer; QTimer* m_updateRuntimeTimer; KParts::ReadOnlyPart* m_konsolePart = nullptr; QTemporaryFile* m_konsoleFile = nullptr; MultiConfigWidget* m_multiConfig; PerfOutputWidget* m_perfOutput; ProcessModel* m_processModel; ProcessFilterModel* m_processProxyModel; QFutureWatcher* m_watcher; }; KDAB-hotspot-41e5de7/src/recordpage.ui000066400000000000000000000561411515036260400176030ustar00rootroot00000000000000 RecordPage 0 0 1120 967 Select recording type Qt::Horizontal 40 20 Go to start screen Home .. Launch Application QFormLayout::AllNonFixedFieldsGrow Path to the application to be recorded App&lication: applicationName Path to the application to be recorded Optional parameters to pass to the application being recorded Parame&ters: applicationParametersBox Qt::NoContextMenu Optional parameters to pass to the application being recorded Directory to store the perf data file while recording Wor&king Directory: workingDirectory Directory to store the perf data file while recording Attach To Application QFormLayout::AllNonFixedFieldsGrow Filter the process list by process name or process ID Process Filter: List of processes. Select at least one to attach to. Processes: processesTableView List of processes. Select at least one to attach to. true false true 0 0 0 0 Filter the process list by process name or process ID Regex Search Perf Options QFormLayout::AllNonFixedFieldsGrow Optional perf event type flags to use while recording perf data Event &Type(s): eventTypeBox Optional perf event type flags to use while recording perf data true When enabled, hotspot will temporarily elevate the perf privileges via pkexec. This allows you to access advanced perf features such as kernel tracepoints required for Off-CPU profiling. Elevate Privileges: elevatePrivilegesCheckBox When enabled, hotspot will temporarily elevate the perf privileges via pkexec. This allows you to access advanced perf features such as kernel tracepoints required for Off-CPU profiling. Record scheduler switch events. This enables off-CPU profiling to measure sleep times etc. This requires elevated privileges. Off-CPU Profilin&g: offCpuCheckBox Record scheduler switch events. This enables off-CPU profiling to measure sleep times etc. This requires elevated privileges. Advanced QFormLayout::AllNonFixedFieldsGrow Path to the file location, where perf will write its output to O&utput File: outputFile Path to the file location, where perf will write its output to Preferred unwinding method to use while recording perf data &Unwinding Method: callGraphComboBox Preferred unwinding method to use while recording perf data Record the CPU where an event occurred. This enables the per-CPU event timeline. When this setting is disabled, all events will appear to be associated with CPU #0. Per-CPU Events: sampleCpuCheckBox Record the CPU where an event occurred. This enables the per-CPU event timeline. When this setting is disabled, all events will appear to be associated with CPU #0. true <qt>Use asynchronous (Posix AIO) trace writing mode. Asynchronous mode is supported only when linking Perf tool with libc library providing implementation for Posix AIO API.</qt> Use AIO: useAioCheckBox <qt>Use asynchronous (Posix AIO) trace writing mode. Asynchronous mode is supported only when linking Perf tool with libc library providing implementation for Posix AIO API.</qt> Set the event buffer size. Increase this value when events are lost during recording. When a byte units is selected, the size is rounded up to have nearest pages power of two value. The number of data pages gets rounded up to the nearest power of two. Buffer Si&ze: mmapPagesSpinBox 0 0 0 0 Set the event buffer size. Increase this value when events are lost during recording. When a byte units is selected, the size is rounded up to have nearest pages power of two value. The number of data pages gets rounded up to the nearest power of two. automatic 999 Select the unit of buffer size. When a byte units is selected, the size is rounded up to have nearest pages power of two value. The number of data pages gets rounded up to the nearest power of two. 2 B KB MB GB Pages Qt::Horizontal 40 20 <qt>Compression using zstd will drastically reduce the size of <tt>perf.data</tt> files. It is recommended to keep this option enabled. The default uses a fast compression level which already yields very significant space savings. If desired, you can select a slower compression level to save more disk space.</qt> Compression: compressionComboBox <qt>Compression using zstd will drastically reduce the size of <tt>perf.data</tt> files. It is recommended to keep this option enabled. The default uses a fast compression level which already yields very significant space savings. If desired, you can select a slower compression level to save more disk space.</qt> <html><head/><body><p>Free-form entry field for custom perf parameters. Use this field to set advanced options (cf. <tt>man perf record</tt>).</p></body></html> Advanced Options: perfParams <html><head/><body><p>Free-form entry field for custom perf parameters. Use this field to set advanced options (cf. <tt>man perf record</tt>).</p></body></html> true true Stack Dump Size true false KMessageWidget::Error true false KMessageWidget::Warning Start recording perf data Start Recording .. true true false View the perf record results View Results .. true Record Output KUrlComboRequester KUrlRequester
    kurlrequester.h
    KUrlRequester QWidget
    kurlrequester.h
    KCollapsibleGroupBox QWidget
    kcollapsiblegroupbox.h
    1
    KMessageWidget QFrame
    kmessagewidget.h
    1
    KDAB-hotspot-41e5de7/src/resources.qrc000066400000000000000000000007471515036260400176530ustar00rootroot00000000000000 images/hotspot_logo.png images/icons/128-apps-hotspot.png images/kdabproducts.png images/kdablogo.png images/qtlogo.png images/background_bright.png images/background_dark.png images/icons/128-apps-hotspot.png default-dockwidget-layout.json KDAB-hotspot-41e5de7/src/resultsbottomuppage.cpp000066400000000000000000000076121515036260400217640ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultsbottomuppage.h" #include "ui_resultsbottomuppage.h" #include #include #include #include #include #include "parsers/perf/perfparser.h" #include "resultsutil.h" #include "models/treemodel.h" namespace { void stackCollapsedExport(QTextStream& file, int type, const Data::Costs& costs, const Data::BottomUp& node) { if (!node.children.isEmpty()) { for (const auto& child : node.children) stackCollapsedExport(file, type, costs, child); return; } auto entry = &node; while (entry) { if (entry->symbol.symbol.isEmpty()) file << '[' << entry->symbol.binary << ']'; else file << Util::formatSymbol(entry->symbol); entry = entry->parent; if (entry) file << ';'; } // leaf node, actually generate a line and write it to the file file << ' '; file << costs.cost(type, node.id); file << '\n'; } void stackCollapsedExport(QFile& file, int type, const Data::BottomUpResults& results) { QTextStream stream(&file); stackCollapsedExport(stream, type, results.costs, results.root); } } ResultsBottomUpPage::ResultsBottomUpPage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QMenu* exportMenu, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) { ui->setupUi(this); auto bottomUpCostModel = new BottomUpModel(this); ResultsUtil::setupTreeView(ui->bottomUpTreeView, contextMenu, ui->bottomUpSearch, ui->regexCheckBox, bottomUpCostModel); ResultsUtil::setupCostDelegate(bottomUpCostModel, ui->bottomUpTreeView); ResultsUtil::setupContextMenu(ui->bottomUpTreeView, contextMenu, bottomUpCostModel, filterStack, this); connect( parser, &PerfParser::bottomUpDataAvailable, this, [this, bottomUpCostModel, exportMenu](const Data::BottomUpResults& data) { bottomUpCostModel->setData(data); ResultsUtil::hideEmptyColumns(data.costs, ui->bottomUpTreeView, BottomUpModel::NUM_BASE_COLUMNS); { auto stackCollapsed = exportMenu->addMenu(QIcon::fromTheme(QStringLiteral("text-plain")), tr("Stack Collapsed")); stackCollapsed->setToolTip(tr("Export data in textual form compatible with flamegraph.pl.")); for (int i = 0; i < data.costs.numTypes(); ++i) { const auto costName = data.costs.typeName(i); stackCollapsed->addAction(costName, this, [this, i, bottomUpCostModel, costName]() { const auto fileName = QFileDialog::getSaveFileName(this, tr("Export %1 Data").arg(costName)); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::Text | QIODevice::WriteOnly)) { QMessageBox::warning( this, tr("Failed to export data"), tr("Failed to export stack collapsed data:\n%1").arg(file.errorString())); return; } stackCollapsedExport(file, i, bottomUpCostModel->results()); }); } } }); ResultsUtil::setupResultsAggregation(ui->costAggregationComboBox); } ResultsBottomUpPage::~ResultsBottomUpPage() = default; void ResultsBottomUpPage::clear() { ui->bottomUpSearch->setText({}); } KDAB-hotspot-41e5de7/src/resultsbottomuppage.h000066400000000000000000000021251515036260400214230ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class QMenu; namespace Ui { class ResultsBottomUpPage; } namespace Data { struct Symbol; } class QTreeView; class PerfParser; class FilterAndZoomStack; class CostContextMenu; class ResultsBottomUpPage : public QWidget { Q_OBJECT public: explicit ResultsBottomUpPage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QMenu* exportMenu, QWidget* parent = nullptr); ~ResultsBottomUpPage(); void clear(); signals: void jumpToCallerCallee(const Data::Symbol& symbol); void jumpToDisassembly(const Data::Symbol& symbol); void openEditor(const Data::Symbol& symbol); void selectSymbol(const Data::Symbol& symbol); private: std::unique_ptr ui; }; KDAB-hotspot-41e5de7/src/resultsbottomuppage.ui000066400000000000000000000052331515036260400216140ustar00rootroot00000000000000 ResultsBottomUpPage 0 0 256 199 Inspect the profile data samples in an aggregated view, showing the bottom-up call-graph tree. 0 0 0 0 0 0 0 Aggregate cost by: costAggregationComboBox Qt::Horizontal 40 20 Filter the call graph tree. Regex Search true true true KDAB-hotspot-41e5de7/src/resultsbyfilepage.cpp000066400000000000000000000113401515036260400213560ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2024 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultsbyfilepage.h" #include "ui_resultsbyfilepage.h" #include #include #include "costcontextmenu.h" #include "parsers/perf/perfparser.h" #include "resultsutil.h" #include "models/byfilemodel.h" #include "models/callercalleemodel.h" #include "models/callercalleeproxy.h" #include "models/filterandzoomstack.h" #include "models/hashmodel.h" #include "models/treemodel.h" #include #include #include "hotspot-config.h" namespace { QSortFilterProxyModel* createProxy(SourceMapModel* model) { return new SourceMapProxy(model); } template QSortFilterProxyModel* createProxy(Model* model) { return new CallerCalleeProxy(model); } template Model* setupModelAndProxyForView(QTreeView* view, CostContextMenu* contextMenu) { auto model = new Model(view); auto proxy = createProxy(model); proxy->setSourceModel(model); proxy->setSortRole(Model::SortRole); view->setModel(proxy); ResultsUtil::setupHeaderView(view, contextMenu); ResultsUtil::setupCostDelegate(model, view); view->sortByColumn(Model::InitialSortColumn, Qt::DescendingOrder); return model; } } ResultsByFilePage::ResultsByFilePage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) { Q_UNUSED(filterStack); ui->setupUi(this); m_byFileCostModel = new ByFileModel(this); m_byFileProxy = new CallerCalleeProxy(this); m_byFileProxy->setSourceModel(m_byFileCostModel); m_byFileProxy->setSortRole(ByFileModel::SortRole); ResultsUtil::connectFilter(ui->byFileFilter, m_byFileProxy, ui->regexCheckBox); ui->byFileTableView->setSortingEnabled(true); ui->byFileTableView->setModel(m_byFileProxy); ResultsUtil::setupHeaderView(ui->byFileTableView, contextMenu); ResultsUtil::setupCostDelegate(m_byFileCostModel, ui->byFileTableView); connect(parser, &PerfParser::byFileDataAvailable, this, [this](const Data::ByFileResults& data) { m_byFileCostModel->setResults(data); ResultsUtil::hideEmptyColumns(data.inclusiveCosts, ui->byFileTableView, ByFileModel::NUM_BASE_COLUMNS); ResultsUtil::hideEmptyColumns(data.selfCosts, ui->byFileTableView, ByFileModel::NUM_BASE_COLUMNS + data.inclusiveCosts.numTypes()); ResultsUtil::hideTracepointColumns(data.selfCosts, ui->byFileTableView, ByFileModel::NUM_BASE_COLUMNS); auto view = ui->byFileTableView; view->setCurrentIndex(view->model()->index(0, 0, {})); ResultsUtil::hideEmptyColumns(data.inclusiveCosts, ui->sourceMapView, SourceMapModel::NUM_BASE_COLUMNS); ResultsUtil::hideTracepointColumns(data.selfCosts, ui->sourceMapView, SourceMapModel::NUM_BASE_COLUMNS); }); auto sourceMapModel = setupModelAndProxyForView(ui->sourceMapView, contextMenu); auto selectByFileIndex = [sourceMapModel, this](const QModelIndex& index) { const auto costs = index.data(ByFileModel::SelfCostsRole).value(); const auto sourceMap = index.data(ByFileModel::SourceMapRole).value(); sourceMapModel->setResults(sourceMap, costs); if (index.model() == m_byFileCostModel) { ui->byFileTableView->setCurrentIndex(m_byFileProxy->mapFromSource(index)); } }; ui->sourceMapView->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->sourceMapView, &QTreeView::customContextMenuRequested, this, &ResultsByFilePage::onSourceMapContextMenu); connect(ui->byFileTableView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, [selectByFileIndex](const QModelIndex& current, const QModelIndex&) { if (current.isValid()) { selectByFileIndex(current); } }); ResultsUtil::setupResultsAggregation(ui->costAggregationComboBox); } ResultsByFilePage::~ResultsByFilePage() = default; void ResultsByFilePage::clear() { ui->byFileFilter->setText({}); } void ResultsByFilePage::onSourceMapContextMenu(QPoint point) { const auto sourceMapIndex = ui->sourceMapView->indexAt(point); if (!sourceMapIndex.isValid()) { return; } auto fileLine = sourceMapIndex.data(SourceMapModel::FileLineRole).value(); if (fileLine.isValid()) { emit openFileLineRequested(fileLine); } } KDAB-hotspot-41e5de7/src/resultsbyfilepage.h000066400000000000000000000017641515036260400210340ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2024 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include namespace Ui { class ResultsByFilePage; } namespace Data { struct FileLine; } class QSortFilterProxyModel; class PerfParser; class ByFileModel; class FilterAndZoomStack; class CostContextMenu; class ResultsByFilePage : public QWidget { Q_OBJECT public: explicit ResultsByFilePage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent = nullptr); ~ResultsByFilePage(); void clear(); signals: void openFileLineRequested(const Data::FileLine& fileLine); private: void onSourceMapContextMenu(QPoint point); std::unique_ptr ui; ByFileModel* m_byFileCostModel; QSortFilterProxyModel* m_byFileProxy; }; KDAB-hotspot-41e5de7/src/resultsbyfilepage.ui000066400000000000000000000066321515036260400212210ustar00rootroot00000000000000 ResultsByFilePage 0 0 768 391 Show the profile data in a flat table view aggregated by files. 0 0 0 0 0 0 0 Aggregate cost by: costAggregationComboBox Qt::Horizontal 40 20 Filter the call graph tree. Regex Search Qt::Vertical true false true true Qt::Horizontal true false true true KDAB-hotspot-41e5de7/src/resultscallercalleepage.cpp000066400000000000000000000305131515036260400225170ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultscallercalleepage.h" #include "ui_resultscallercalleepage.h" #include #include #include #include #include #include "costcontextmenu.h" #include "parsers/perf/perfparser.h" #include "resultsutil.h" #include "models/callercalleemodel.h" #include "models/callercalleeproxy.h" #include "models/disassemblyoutput.h" #include "models/filterandzoomstack.h" #include "models/hashmodel.h" #include "models/treemodel.h" #include #include #include "hotspot-config.h" #if KGraphViewerPart_FOUND #include "callgraphwidget.h" #endif namespace { QSortFilterProxyModel* createProxy(SourceMapModel* model) { return new SourceMapProxy(model); } template QSortFilterProxyModel* createProxy(Model* model) { return new CallerCalleeProxy(model); } template Model* setupModelAndProxyForView(QTreeView* view, CostContextMenu* contextMenu) { auto model = new Model(view); auto proxy = createProxy(model); proxy->setSourceModel(model); proxy->setSortRole(Model::SortRole); view->setModel(proxy); ResultsUtil::setupHeaderView(view, contextMenu); ResultsUtil::setupCostDelegate(model, view); view->sortByColumn(Model::InitialSortColumn, Qt::DescendingOrder); return model; } template void connectCallerOrCalleeModel(QTreeView* view, CallerCalleeModel* callerCalleeCostModel, Handler handler) { QObject::connect(view, &QTreeView::activated, view, [callerCalleeCostModel, handler](const QModelIndex& index) { const auto symbol = index.data(Model::SymbolRole).template value(); auto sourceIndex = callerCalleeCostModel->indexForKey(symbol); handler(sourceIndex); }); } } ResultsCallerCalleePage::ResultsCallerCalleePage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) { ui->setupUi(this); m_callerCalleeCostModel = new CallerCalleeModel(this); m_callerCalleeProxy = new CallerCalleeProxy(this); m_callerCalleeProxy->setSourceModel(m_callerCalleeCostModel); m_callerCalleeProxy->setSortRole(CallerCalleeModel::SortRole); ResultsUtil::connectFilter(ui->callerCalleeFilter, m_callerCalleeProxy, ui->regexCheckBox); ui->callerCalleeTableView->setSortingEnabled(true); ui->callerCalleeTableView->setModel(m_callerCalleeProxy); ResultsUtil::setupContextMenu(ui->callerCalleeTableView, contextMenu, m_callerCalleeCostModel, filterStack, this, {ResultsUtil::CallbackAction::OpenEditor, ResultsUtil::CallbackAction::SelectSymbol, ResultsUtil::CallbackAction::ViewDisassembly}); ResultsUtil::setupHeaderView(ui->callerCalleeTableView, contextMenu); ResultsUtil::setupCostDelegate(m_callerCalleeCostModel, ui->callerCalleeTableView); connect(parser, &PerfParser::callerCalleeDataAvailable, this, [this](const Data::CallerCalleeResults& data) { m_callerCalleeCostModel->setResults(data); ResultsUtil::hideEmptyColumns(data.inclusiveCosts, ui->callerCalleeTableView, CallerCalleeModel::NUM_BASE_COLUMNS); ResultsUtil::hideEmptyColumns(data.selfCosts, ui->callerCalleeTableView, CallerCalleeModel::NUM_BASE_COLUMNS + data.inclusiveCosts.numTypes()); ResultsUtil::hideTracepointColumns(data.selfCosts, ui->callerCalleeTableView, CallerCalleeModel::NUM_BASE_COLUMNS); auto view = ui->callerCalleeTableView; view->setCurrentIndex(view->model()->index(0, 0, {})); ResultsUtil::hideEmptyColumns(data.inclusiveCosts, ui->callersView, CallerModel::NUM_BASE_COLUMNS); ResultsUtil::hideEmptyColumns(data.inclusiveCosts, ui->calleesView, CalleeModel::NUM_BASE_COLUMNS); ResultsUtil::hideEmptyColumns(data.inclusiveCosts, ui->sourceMapView, SourceMapModel::NUM_BASE_COLUMNS); ResultsUtil::hideTracepointColumns(data.selfCosts, ui->sourceMapView, SourceMapModel::NUM_BASE_COLUMNS); #if KGraphViewerPart_FOUND if (m_callgraph) { m_callgraph->setResults(data); } #endif }); #if KGraphViewerPart_FOUND m_callgraph = CallgraphWidget::createCallgraphWidget({}, this); if (m_callgraph) { ui->splitter_2->addWidget(m_callgraph); } #endif auto calleesModel = setupModelAndProxyForView(ui->calleesView, contextMenu); auto callersModel = setupModelAndProxyForView(ui->callersView, contextMenu); auto sourceMapModel = setupModelAndProxyForView(ui->sourceMapView, contextMenu); auto selectCallerCalleeIndex = [calleesModel, callersModel, sourceMapModel, this](const QModelIndex& index) { const auto costs = index.data(CallerCalleeModel::SelfCostsRole).value(); const auto callees = index.data(CallerCalleeModel::CalleesRole).value(); calleesModel->setResults(callees, costs); const auto callers = index.data(CallerCalleeModel::CallersRole).value(); callersModel->setResults(callers, costs); const auto sourceMap = index.data(CallerCalleeModel::SourceMapRole).value(); sourceMapModel->setResults(sourceMap, costs); if (index.model() == m_callerCalleeCostModel) { ui->callerCalleeTableView->setCurrentIndex(m_callerCalleeProxy->mapFromSource(index)); } #if KGraphViewerPart_FOUND if (m_callgraph) { m_callgraph->selectSymbol(index.data(CallerCalleeModel::SymbolRole).value()); } #endif }; connectCallerOrCalleeModel(ui->calleesView, m_callerCalleeCostModel, selectCallerCalleeIndex); connectCallerOrCalleeModel(ui->callersView, m_callerCalleeCostModel, selectCallerCalleeIndex); ResultsUtil::setupContextMenu(ui->calleesView, contextMenu, calleesModel, filterStack, this, {ResultsUtil::CallbackAction::OpenEditor, ResultsUtil::CallbackAction::SelectSymbol, ResultsUtil::CallbackAction::ViewDisassembly}); ResultsUtil::setupContextMenu(ui->callersView, contextMenu, callersModel, filterStack, this, {ResultsUtil::CallbackAction::OpenEditor, ResultsUtil::CallbackAction::SelectSymbol, ResultsUtil::CallbackAction::ViewDisassembly}); #if KGraphViewerPart_FOUND if (m_callgraph) { connect(m_callgraph, &CallgraphWidget::clickedOn, this, [this, selectCallerCalleeIndex](const Data::Symbol& symbol) { const auto index = m_callerCalleeCostModel->indexForKey(symbol); selectCallerCalleeIndex(index); }); } #endif ui->sourceMapView->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->sourceMapView, &QTreeView::customContextMenuRequested, this, &ResultsCallerCalleePage::onSourceMapContextMenu); connect(ui->callerCalleeTableView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, [selectCallerCalleeIndex](const QModelIndex& current, const QModelIndex&) { if (current.isValid()) { selectCallerCalleeIndex(current); } }); ResultsUtil::setupResultsAggregation(ui->costAggregationComboBox); } ResultsCallerCalleePage::~ResultsCallerCalleePage() = default; ResultsCallerCalleePage::SourceMapLocation ResultsCallerCalleePage::toSourceMapLocation(const Data::FileLine& fileLine, const QString& binaryPath) const { if (!fileLine.isValid()) { return {}; } SourceMapLocation ret; ret.binaryPath = binaryPath; auto resolvePath = [&ret, &fileLine](const QString& pathName) -> bool { const QString path = pathName + fileLine.file; if (QFileInfo::exists(path)) { ret.path = path; ret.lineNumber = fileLine.line; return true; } return false; }; // also try to resolve paths relative to the module output folder // fixes a common issue with qmake builds that use relative paths const QString modulePath = QFileInfo(binaryPath).path() + QLatin1Char('/'); resolvePath(m_sysroot) || resolvePath(m_sysroot + modulePath) || resolvePath(m_appPath) || resolvePath(m_appPath + modulePath); return ret; } ResultsCallerCalleePage::SourceMapLocation ResultsCallerCalleePage::toSourceMapLocation(const QModelIndex& index) const { const auto fileLine = index.data(SourceMapModel::FileLineRole).value(); const auto symbol = ui->callerCalleeTableView->currentIndex().data(CallerCalleeModel::SymbolRole).value(); return toSourceMapLocation(fileLine, symbol.path); } void ResultsCallerCalleePage::openFileLineRequested(const Data::FileLine& fileLine) { // TODO: how should we try to find a symbol here to resolve relative paths? showSourceMapContextMenu(toSourceMapLocation(fileLine, {}), {}); } void ResultsCallerCalleePage::onSourceMapContextMenu(QPoint point) { const auto sourceMapIndex = ui->sourceMapView->indexAt(point); if (!sourceMapIndex.isValid()) { return; } // fetch current symbol from callerCalleeView to check if we can disassemble it const auto symbol = ui->callerCalleeTableView->currentIndex().data(CallerCalleeModel::SymbolRole).value(); showSourceMapContextMenu(toSourceMapLocation(sourceMapIndex), symbol); } void ResultsCallerCalleePage::showSourceMapContextMenu(const SourceMapLocation& location, const Data::Symbol& symbol) { if (!location) return; QMenu contextMenu; auto* viewCallerCallee = contextMenu.addAction(tr("Open in Editor")); connect(viewCallerCallee, &QAction::triggered, this, [this, location] { emit navigateToCode(location.path, location.lineNumber, 0); }); auto disassemblyAction = contextMenu.addAction(tr("Disassembly")); disassemblyAction->setEnabled(symbol.canDisassemble()); connect(disassemblyAction, &QAction::triggered, this, [this, symbol, location] { emit jumpToSourceCode(symbol, {location.path, location.lineNumber}); }); contextMenu.exec(QCursor::pos()); } void ResultsCallerCalleePage::setSysroot(const QString& path) { m_sysroot = path; } void ResultsCallerCalleePage::setAppPath(const QString& path) { m_appPath = path; } void ResultsCallerCalleePage::clear() { ui->callerCalleeFilter->setText({}); } void ResultsCallerCalleePage::jumpToCallerCallee(const Data::Symbol& symbol) { auto callerCalleeIndex = m_callerCalleeProxy->mapFromSource(m_callerCalleeCostModel->indexForSymbol(symbol)); ui->callerCalleeTableView->setCurrentIndex(callerCalleeIndex); } void ResultsCallerCalleePage::openEditor(const Data::Symbol& symbol) { const auto callerCalleeIndex = m_callerCalleeProxy->mapFromSource(m_callerCalleeCostModel->indexForSymbol(symbol)); const auto map = callerCalleeIndex.data(CallerCalleeModel::SourceMapRole).value(); auto it = std::find_if(map.keyBegin(), map.keyEnd(), [&symbol, this](const Data::FileLine& fileLine) { const auto location = toSourceMapLocation(fileLine, symbol.path); if (location) { auto settings = Settings::instance(); const auto colon = QLatin1Char(':'); auto remappedSourceFile = findSourceCodeFile(location.path, settings->sourceCodePaths().split(colon), settings->sysroot()); emit navigateToCode(remappedSourceFile, location.lineNumber, 0); return true; } return false; }); if (it == map.keyEnd()) { emit navigateToCodeFailed( tr("Failed to find location for symbol %1 in %2.").arg(symbol.prettySymbol, symbol.binary)); } } KDAB-hotspot-41e5de7/src/resultscallercalleepage.h000066400000000000000000000043641515036260400221710ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include namespace Ui { class ResultsCallerCalleePage; } namespace Data { struct Symbol; struct FileLine; } class QSortFilterProxyModel; class QModelIndex; class PerfParser; class CallerCalleeModel; class FilterAndZoomStack; class CostContextMenu; class CallgraphWidget; class ResultsCallerCalleePage : public QWidget { Q_OBJECT public: explicit ResultsCallerCalleePage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent = nullptr); ~ResultsCallerCalleePage(); void setSysroot(const QString& path); void setAppPath(const QString& path); void clear(); void jumpToCallerCallee(const Data::Symbol& symbol); void openEditor(const Data::Symbol& symbol); void openFileLineRequested(const Data::FileLine& fileLine); signals: void navigateToCode(const QString& url, int lineNumber, int columnNumber); void navigateToCodeFailed(const QString& message); void selectSymbol(const Data::Symbol& symbol); void jumpToSourceCode(const Data::Symbol& symbol, const Data::FileLine& line); void jumpToDisassembly(const Data::Symbol& symbol); private: void onSourceMapContextMenu(QPoint pos); struct SourceMapLocation { inline explicit operator bool() const { return !path.isEmpty(); } QString path; int lineNumber = -1; QString binaryPath; }; SourceMapLocation toSourceMapLocation(const QModelIndex& index) const; SourceMapLocation toSourceMapLocation(const Data::FileLine& fileLine, const QString& binaryPath) const; void showSourceMapContextMenu(const SourceMapLocation& location, const Data::Symbol& symbol); std::unique_ptr ui; CallgraphWidget* m_callgraph; CallerCalleeModel* m_callerCalleeCostModel; QSortFilterProxyModel* m_callerCalleeProxy; QString m_sysroot; QString m_appPath; }; KDAB-hotspot-41e5de7/src/resultscallercalleepage.ui000066400000000000000000000104031515036260400223460ustar00rootroot00000000000000 ResultsCallerCalleePage 0 0 768 391 Show the profile data in a flat aggregated caller/callee table view. 0 0 0 0 0 0 0 Aggregate cost by: costAggregationComboBox Qt::Horizontal 40 20 Filter the call graph tree. Regex Search Qt::Vertical true false true true Qt::Horizontal true false true true true false true true true false true true KDAB-hotspot-41e5de7/src/resultsdisassemblypage.cpp000066400000000000000000000673251515036260400224410ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Darya Knysh SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultsdisassemblypage.h" #include "ui_resultsdisassemblypage.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "resultsutil.h" #if KFSyntaxHighlighting_FOUND #include #include #include #include #endif #include "costheaderview.h" #include "data.h" #include "models/codedelegate.h" #include "models/costdelegate.h" #include "models/disassemblymodel.h" #include "models/search.h" #include "models/sourcecodemodel.h" #include "settings.h" namespace { template void connectModel(ModelType* model, const ResultFound& resultFound, EndReached endReached) { QObject::connect(model, &ModelType::resultFound, model, resultFound); QObject::connect(model, &ModelType::searchEndReached, model, endReached); } class ColumnSpanDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit ColumnSpanDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) { } ~ColumnSpanDelegate() override = default; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override { auto opt = option; opt.index = index.siblingAtColumn(DisassemblyModel::DisassemblyColumn); QStyledItemDelegate::paint(painter, opt, opt.index); } }; class BranchDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit BranchDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) { } ~BranchDelegate() override = default; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override { const auto jumps = findJumps(index); if (jumps.data.isEmpty()) return; const auto top = option.rect.top(); const auto right = option.rect.right(); const auto bottom = option.rect.bottom(); const auto left = option.rect.left(); const auto horizontalAdvance = 3; const auto horizontalMidAdvance = 1; const auto ymid = (top + option.rect.height()) / 2; // we merge horizontal lines into one long line int horizontalLineStart = -1; QVarLengthArray lines; auto x = left; for (int i = 0, size = jumps.data.size(); i < size; ++i) { const auto xend = x + horizontalAdvance; const auto xmid = x + horizontalMidAdvance; if (xmid > right) break; auto verticalLine = [&]() { lines.append({xmid, top, xmid, bottom}); }; auto startHorizontalLine = [&horizontalLineStart](int x) { if (horizontalLineStart == -1) horizontalLineStart = x; }; auto topRightEdge = [&]() { if (!jumps.fromSibling) { lines.append({xmid, top, xmid, ymid}); startHorizontalLine(xend); } }; auto bottomLeftEdge = [&]() { if (!jumps.fromSibling) { lines.append({xmid, bottom, xmid, ymid}); startHorizontalLine(xend); } else { verticalLine(); } }; const auto c = jumps.data[i]; switch (c.toLatin1()) { case ' ': break; case '|': verticalLine(); break; case '-': startHorizontalLine(x); break; case '+': startHorizontalLine(x); verticalLine(); break; case '\'': case '\\': topRightEdge(); break; case ',': case '/': bottomLeftEdge(); break; case '>': if (!jumps.fromSibling) { if (i == size - 2) { // jump target ends with "> " } else { // branch intersection verticalLine(); } startHorizontalLine(xend); } else { verticalLine(); } break; default: qWarning("unexpected jump visualization char: %c", c.toLatin1()); break; } x = xend; } if (!jumps.fromSibling && horizontalLineStart != -1) { auto lineEnd = right; const auto arrowSize = 4; if (jumps.data.endsWith(QLatin1String("> "))) { // jump target lines.append({right - arrowSize, ymid + arrowSize, right, ymid}); lines.append({right - arrowSize, ymid - arrowSize, right, ymid}); } else { // jump lines.append({right, ymid + arrowSize, right - arrowSize, ymid}); lines.append({right, ymid - arrowSize, right - arrowSize, ymid}); lineEnd -= arrowSize; } lines.append({horizontalLineStart, ymid, lineEnd, ymid}); } auto pen = QPen(option.palette.color(QPalette::Link), 1); pen.setCosmetic(true); const auto oldPen = painter->pen(); painter->setPen(pen); painter->drawLines(lines.constData(), lines.size()); painter->setPen(oldPen); } private: struct Jumps { QString data; // when we take the jumps from siblings, we only want to draw the vertical lines bool fromSibling = false; }; static Jumps findJumps(QModelIndex index) { bool fromSibling = false; // find row that might have jumps (i.e. has valid addr column) while (index.row() > 0 && !index.data(DisassemblyModel::AddrRole).toULongLong()) { index = index.siblingAtRow(index.row() - 1); fromSibling = true; } return {index.data().toString(), fromSibling}; } }; } ResultsDisassemblyPage::ResultsDisassemblyPage(CostContextMenu* costContextMenu, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) #if KFSyntaxHighlighting_FOUND , m_repository(std::make_unique()) , m_disassemblyModel(new DisassemblyModel(m_repository.get(), this)) , m_sourceCodeModel(new SourceCodeModel(m_repository.get(), this)) #else , m_disassemblyModel(new DisassemblyModel(nullptr, this)) , m_sourceCodeModel(new SourceCodeModel(nullptr, this)) #endif , m_disassemblyCostDelegate(new CostDelegate(DisassemblyModel::CostRole, DisassemblyModel::TotalCostRole, this)) , m_sourceCodeCostDelegate(new CostDelegate(SourceCodeModel::CostRole, SourceCodeModel::TotalCostRole, this)) , m_disassemblyDelegate(new CodeDelegate(DisassemblyModel::RainbowLineNumberRole, DisassemblyModel::HighlightRole, DisassemblyModel::SyntaxHighlightRole, this)) , m_sourceCodeDelegate(new CodeDelegate(SourceCodeModel::RainbowLineNumberRole, SourceCodeModel::HighlightRole, SourceCodeModel::SyntaxHighlightRole, this)) , m_branchesDelegate(new BranchDelegate(this)) { // TODO: the auto resize behavior is broken with these models that don't have the stretch column on the left auto setCostHeader = [this, costContextMenu](QTreeView* view) { auto header = new CostHeaderView(costContextMenu, this); header->setAutoResize(false); view->setHeader(header); }; ui->setupUi(this); ui->assemblyView->setModel(m_disassemblyModel); ui->assemblyView->setMouseTracking(true); setCostHeader(ui->assemblyView); ui->assemblyView->setDrawColumnSpanDelegate(new ColumnSpanDelegate(this)); ui->sourceCodeView->setModel(m_sourceCodeModel); ui->sourceCodeView->setMouseTracking(true); setCostHeader(ui->sourceCodeView); auto settings = Settings::instance(); m_sourceCodeModel->setSysroot(settings->sysroot()); connect(settings, &Settings::sysrootChanged, m_sourceCodeModel, &SourceCodeModel::setSysroot); auto updateFromDisassembly = [this](const QModelIndex& index) { const auto fileLine = m_disassemblyModel->fileLineForIndex(index); m_disassemblyModel->updateHighlighting(fileLine.line); m_sourceCodeModel->updateHighlighting(fileLine.line); }; auto updateFromSource = [this](const QModelIndex& index) { const auto fileLine = m_sourceCodeModel->fileLineForIndex(index); m_disassemblyModel->updateHighlighting(fileLine.line); m_sourceCodeModel->updateHighlighting(fileLine.line); }; connect(settings, &Settings::sourceCodePathsChanged, this, [this](const QString&) { showDisassembly(); }); connect(ui->assemblyView, &QTreeView::entered, this, updateFromDisassembly); connect(ui->sourceCodeView, &QTreeView::entered, this, updateFromSource); connect(settings, &Settings::tabWidthChanged, m_sourceCodeModel->highlightedText(), &HighlightedText::updateTabWidth); connect(settings, &Settings::tabWidthChanged, m_disassemblyModel->highlightedText(), &HighlightedText::updateTabWidth); m_sourceCodeModel->highlightedText()->updateTabWidth(settings->tabWidth()); m_disassemblyModel->highlightedText()->updateTabWidth(settings->tabWidth()); auto createContextMenu = [](QTreeView* view, auto* model, auto&& addEntries) { auto gotoMenuWidget = new QWidget(view); auto layout = new QHBoxLayout(gotoMenuWidget); layout->setContentsMargins(0, 0, 0, 0); auto label = new QLabel(tr("Goto: "), gotoMenuWidget); layout->addWidget(label); auto edit = new QLineEdit(gotoMenuWidget); layout->addWidget(edit); auto gotoAction = new QWidgetAction(view); gotoAction->setDefaultWidget(gotoMenuWidget); connect(edit, &QLineEdit::returnPressed, gotoAction, &QWidgetAction::trigger); connect(gotoAction, &QWidgetAction::triggered, view, [model, edit] { model->scrollToLine(edit->text()); }); view->setContextMenuPolicy(Qt::CustomContextMenu); connect(view, &QTreeView::customContextMenuRequested, view, [view, addEntries, gotoAction](QPoint point) { const auto index = view->indexAt(point); QMenu contextMenu; addEntries(&contextMenu, index); contextMenu.addAction(gotoAction); contextMenu.exec(QCursor::pos()); }); }; createContextMenu(ui->sourceCodeView, m_sourceCodeModel, [this](QMenu* menu, const QModelIndex& index) { const auto fileLine = index.data(SourceCodeModel::FileLineRole).value(); if (fileLine.isValid()) { auto* openEditorAction = menu->addAction(tr("Open in Editor")); QObject::connect(openEditorAction, &QAction::triggered, this, [this, fileLine]() { emit navigateToCode(fileLine.file, fileLine.line, -1); }); menu->addAction(openEditorAction); } }); createContextMenu(ui->assemblyView, m_disassemblyModel, [](auto&&, auto&&) {}); auto addScrollTo = [](QTreeView* sourceView, QTreeView* destView, auto sourceModel, auto destModel) { connect(sourceView, &QTreeView::clicked, sourceView, [=](const QModelIndex& index) { const auto fileLine = sourceModel->fileLineForIndex(index); if (fileLine.isValid()) { destView->scrollTo(destModel->indexForFileLine(fileLine)); } }); }; addScrollTo(ui->sourceCodeView, ui->assemblyView, m_sourceCodeModel, m_disassemblyModel); addScrollTo(ui->assemblyView, ui->sourceCodeView, m_disassemblyModel, m_sourceCodeModel); connect(ui->assemblyView, &QTreeView::doubleClicked, this, [this](const QModelIndex& index) { const QString functionName = index.data(DisassemblyModel::LinkedFunctionNameRole).toString(); if (functionName.isEmpty()) return; const auto functionOffset = index.data(DisassemblyModel::LinkedFunctionOffsetRole).toInt(); if (m_symbolStack[m_stackIndex].symbol == functionName) { ui->assemblyView->scrollTo(m_disassemblyModel->findIndexWithOffset(functionOffset), QAbstractItemView::ScrollHint::PositionAtTop); } else { const auto symbol = std::find_if(m_callerCalleeResults.entries.keyBegin(), m_callerCalleeResults.entries.keyEnd(), [functionName](const Data::Symbol& symbol) { return symbol.symbol == functionName; }); if (symbol != m_callerCalleeResults.entries.keyEnd()) { m_symbolStack.push_back(*symbol); m_stackIndex++; emit stackChanged(); } else { ui->symbolNotFound->setText(tr("unknown symbol %1").arg(functionName)); ui->symbolNotFound->show(); } } }); connect(ui->stackBackButton, &QPushButton::pressed, this, [this] { m_stackIndex--; if (m_stackIndex < 0) m_stackIndex = m_symbolStack.size() - 1; emit stackChanged(); }); connect(ui->stackNextButton, &QPushButton::pressed, this, [this] { m_stackIndex++; if (m_stackIndex >= m_symbolStack.size()) m_stackIndex = 0; emit stackChanged(); }); connect(this, &ResultsDisassemblyPage::stackChanged, this, [this] { ui->stackBackButton->setEnabled(m_stackIndex > 0); ui->stackNextButton->setEnabled(m_stackIndex < m_symbolStack.size() - 1); ui->stackEntry->setText(m_symbolStack[m_stackIndex].prettySymbol); showDisassembly(); }); ui->searchEndWidget->hide(); ui->disasmEndReachedWidget->hide(); auto setupSearchShortcuts = [this](QPushButton* search, QPushButton* next, QPushButton* prev, QPushButton* close, QWidget* searchWidget, QLineEdit* edit, QAbstractItemView* view, KMessageWidget* endReached, auto* model, QModelIndex* searchResultIndex, int additionalRows) { searchWidget->hide(); auto actions = new QActionGroup(view); auto findAction = KStandardAction::find( this, [searchWidget, edit] { searchWidget->show(); edit->setFocus(); }, actions); findAction->setShortcutContext(Qt::ShortcutContext::WidgetWithChildrenShortcut); view->addAction(findAction); auto searchNext = [model, edit, additionalRows, searchResultIndex] { const auto offset = searchResultIndex->isValid() ? searchResultIndex->row() - additionalRows : 0; model->find(edit->text(), Direction::Forward, offset); }; auto searchPrev = [model, edit, additionalRows, searchResultIndex] { const auto offset = searchResultIndex->isValid() ? searchResultIndex->row() - additionalRows : 0; model->find(edit->text(), Direction::Backward, offset); }; auto findNextAction = KStandardAction::findNext(this, searchNext, actions); findNextAction->setShortcutContext(Qt::ShortcutContext::WidgetWithChildrenShortcut); searchWidget->addAction(findNextAction); auto findPrevAction = KStandardAction::findPrev(this, searchPrev, actions); findPrevAction->setShortcutContext(Qt::ShortcutContext::WidgetWithChildrenShortcut); searchWidget->addAction(findPrevAction); connect(edit, &QLineEdit::returnPressed, findNextAction, &QAction::trigger); connect(next, &QPushButton::clicked, findNextAction, &QAction::trigger); connect(prev, &QPushButton::clicked, findPrevAction, &QAction::trigger); connect(search, &QPushButton::clicked, findAction, &QAction::trigger); connect(close, &QPushButton::clicked, this, [searchWidget] { searchWidget->hide(); }); const auto colorScheme = KColorScheme(); connectModel( model, [edit, view, colorScheme, searchResultIndex](const QModelIndex& index) { auto palette = edit->palette(); *searchResultIndex = index; palette.setBrush(QPalette::Text, index.isValid() ? colorScheme.foreground() : colorScheme.foreground(KColorScheme::NegativeText)); edit->setPalette(palette); view->setCurrentIndex(index); if (!index.isValid()) view->clearSelection(); }, [endReached] { endReached->show(); }); }; setupSearchShortcuts(ui->searchButton, ui->nextResult, ui->prevResult, ui->closeButton, ui->searchWidget, ui->searchEdit, ui->sourceCodeView, ui->searchEndWidget, m_sourceCodeModel, &m_currentSourceSearchIndex, 1); setupSearchShortcuts(ui->disasmSearchButton, ui->disasmNextButton, ui->disasmPrevButton, ui->disasmCloseButton, ui->disasmSearchWidget, ui->disasmSearchEdit, ui->assemblyView, ui->disasmEndReachedWidget, m_disassemblyModel, &m_currentDisasmSearchIndex, 0); ui->assemblyView->setColumnHidden(DisassemblyModel::BranchColumn, !settings->showBranches()); ui->assemblyView->setColumnHidden(DisassemblyModel::HexdumpColumn, !settings->showHexdump()); connect(settings, &Settings::showBranchesChanged, this, [this](bool showBranches) { ui->assemblyView->setColumnHidden(DisassemblyModel::BranchColumn, !showBranches); }); connect(settings, &Settings::showHexdumpChanged, this, [this](bool showHexdump) { ui->assemblyView->setColumnHidden(DisassemblyModel::HexdumpColumn, !showHexdump); }); #if KFSyntaxHighlighting_FOUND QStringList schemes; auto definitions = m_repository->definitions(); schemes.reserve(definitions.size()); std::transform(definitions.begin(), definitions.end(), std::back_inserter(schemes), [](const auto& definition) { return definition.name(); }); auto sourceCodeDefinitionModel = new QStringListModel(this); sourceCodeDefinitionModel->setStringList(schemes); QStringList assemblySchemes = {QStringLiteral("None")}; std::transform(definitions.begin(), std::partition(definitions.begin(), definitions.end(), [](const KSyntaxHighlighting::Definition& definition) { return definition.section() == QStringLiteral("Assembler"); }), std::back_inserter(assemblySchemes), [](const KSyntaxHighlighting::Definition& definition) { return definition.name(); }); auto assemblySchemesModel = new QStringListModel(this); assemblySchemesModel->setStringList(assemblySchemes); auto connectCompletion = [schemes, this](QStringListModel* definitionModel, QComboBox* box, auto* model) { auto completer = new QCompleter(this); completer->setModel(definitionModel); completer->setCaseSensitivity(Qt::CaseInsensitive); completer->setCompletionMode(QCompleter::PopupCompletion); box->setCompleter(completer); box->setModel(definitionModel); box->setCurrentText(model->highlightedText()->definition()); connect(box, qOverload(&QComboBox::activated), this, [this, model, box]() { model->highlightedText()->setDefinition(m_repository->definitionForName(box->currentText())); }); connect(model->highlightedText(), &HighlightedText::definitionChanged, [box](const QString& definition) { box->setCurrentText(definition); }); }; connectCompletion(sourceCodeDefinitionModel, ui->sourceCodeComboBox, m_sourceCodeModel); connectCompletion(assemblySchemesModel, ui->assemblyComboBox, m_disassemblyModel); connect(m_disassemblyModel->highlightedText(), &HighlightedText::usesAnsiChanged, this, [this](bool usesAnsi) { ui->customAssemblyHighlighting->setVisible(!usesAnsi); }); #else ui->customSourceCodeHighlighting->setVisible(false); ui->customAssemblyHighlighting->setVisible(false); #endif } ResultsDisassemblyPage::~ResultsDisassemblyPage() = default; void ResultsDisassemblyPage::clear() { m_disassemblyModel->clear(); m_sourceCodeModel->clear(); } void ResultsDisassemblyPage::setupAsmViewModel() { ui->sourceCodeView->setItemDelegateForColumn(SourceCodeModel::SourceCodeColumn, m_sourceCodeDelegate); ui->sourceCodeView->header()->setStretchLastSection(false); ui->sourceCodeView->header()->setSectionResizeMode(SourceCodeModel::SourceCodeLineNumber, QHeaderView::ResizeToContents); ui->sourceCodeView->header()->setSectionResizeMode(SourceCodeModel::SourceCodeColumn, QHeaderView::Stretch); ui->assemblyView->setItemDelegateForColumn(DisassemblyModel::BranchColumn, m_branchesDelegate); ui->assemblyView->setItemDelegateForColumn(DisassemblyModel::DisassemblyColumn, m_disassemblyDelegate); ui->assemblyView->header()->setStretchLastSection(false); ui->assemblyView->header()->setSectionResizeMode(DisassemblyModel::AddrColumn, QHeaderView::ResizeToContents); ui->assemblyView->header()->setSectionResizeMode(DisassemblyModel::BranchColumn, QHeaderView::Interactive); ui->assemblyView->header()->setSectionResizeMode(DisassemblyModel::HexdumpColumn, QHeaderView::Interactive); ui->assemblyView->header()->setSectionResizeMode(DisassemblyModel::DisassemblyColumn, QHeaderView::Stretch); for (int col = DisassemblyModel::COLUMN_COUNT; col < m_disassemblyModel->columnCount(); col++) { ui->assemblyView->setColumnWidth(col, 100); ui->assemblyView->header()->setSectionResizeMode(col, QHeaderView::Interactive); ui->assemblyView->setItemDelegateForColumn(col, m_disassemblyCostDelegate); } for (int col = SourceCodeModel::COLUMN_COUNT; col < m_sourceCodeModel->columnCount(); col++) { ui->sourceCodeView->setColumnWidth(col, 100); ui->sourceCodeView->header()->setSectionResizeMode(col, QHeaderView::Interactive); ui->sourceCodeView->setItemDelegateForColumn(col, m_sourceCodeCostDelegate); } } void ResultsDisassemblyPage::showDisassembly() { if (m_symbolStack.isEmpty()) return; const auto& curSymbol = m_symbolStack[m_stackIndex]; // Show empty tab when selected symbol is not valid if (curSymbol.symbol.isEmpty()) { clear(); } // TODO: add the ability to configure the arch <-> objdump mapping somehow in the settings const auto objdump = [this](const QString& objdump) { if (!objdump.isEmpty()) return objdump; if (m_arch.startsWith(QLatin1String("armv8")) || m_arch.startsWith(QLatin1String("aarch64"))) { if (auto aarch64Objdump = QStandardPaths::findExecutable(QStringLiteral("aarch64-linux-gnu-objdump")); !aarch64Objdump.isEmpty()) return QStringLiteral("aarch64-linux-gnu-objdump"); } if (m_arch.startsWith(QLatin1String("arm"))) { if (auto armObjdump = QStandardPaths::findExecutable(QStringLiteral("arm-linux-gnueabi-objdump")); !armObjdump.isEmpty()) return QStringLiteral("arm-linux-gnueabi-objdump"); } return QStringLiteral("objdump"); }; ui->symbolNotFound->hide(); auto settings = Settings::instance(); const auto colon = QLatin1Char(':'); showDisassembly( DisassemblyOutput::disassemble(objdump(settings->objdump()), m_arch, settings->debugPaths().split(colon), settings->extraLibPaths().split(colon), settings->sourceCodePaths().split(colon), settings->sysroot(), curSymbol)); } void ResultsDisassemblyPage::showDisassembly(const DisassemblyOutput& disassemblyOutput) { m_disassemblyModel->clear(); m_sourceCodeModel->clear(); // this function is only called if m_symbolStack is non empty (see above) Q_ASSERT(!m_symbolStack.isEmpty()); const auto& curSymbol = m_symbolStack[m_stackIndex]; const auto& entry = m_callerCalleeResults.entry(curSymbol); ui->filenameLabel->setText(disassemblyOutput.mainSourceFileName); // don't set tooltip on symbolLabel, as that will be called internally and then get overwritten setToolTip(Util::formatTooltip(entry.id, curSymbol, m_callerCalleeResults.selfCosts, m_callerCalleeResults.inclusiveCosts)); if (!disassemblyOutput) { ui->errorMessage->setText(disassemblyOutput.errorMessage); ui->errorMessage->show(); return; } ui->errorMessage->hide(); m_disassemblyModel->setDisassembly(disassemblyOutput, m_callerCalleeResults); m_sourceCodeModel->setDisassembly(disassemblyOutput, m_callerCalleeResults); #if KFSyntaxHighlighting_FOUND m_sourceCodeModel->highlightedText()->setDefinition( m_repository->definitionForFileName(disassemblyOutput.mainSourceFileName)); m_disassemblyModel->highlightedText()->setDefinition( m_repository->definitionForName(QStringLiteral("GNU Assembler"))); #endif ResultsUtil::hideEmptyColumns(m_callerCalleeResults.selfCosts, ui->assemblyView, DisassemblyModel::COLUMN_COUNT); ResultsUtil::hideEmptyColumns(m_callerCalleeResults.selfCosts, ui->sourceCodeView, SourceCodeModel::COLUMN_COUNT); ResultsUtil::hideEmptyColumns(m_callerCalleeResults.inclusiveCosts, ui->sourceCodeView, SourceCodeModel::COLUMN_COUNT + m_callerCalleeResults.selfCosts.numTypes()); // hide self cost for tracepoints in assembly view, this is basically always zero ResultsUtil::hideTracepointColumns(m_callerCalleeResults.selfCosts, ui->assemblyView, DisassemblyModel::COLUMN_COUNT); // hide self cost for tracepoints - only show inclusive times instead here ResultsUtil::hideTracepointColumns(m_callerCalleeResults.selfCosts, ui->sourceCodeView, SourceCodeModel::COLUMN_COUNT); setupAsmViewModel(); } void ResultsDisassemblyPage::setSymbol(const Data::Symbol& symbol) { m_stackIndex = 0; m_symbolStack.clear(); m_symbolStack.push_back(symbol); emit stackChanged(); } void ResultsDisassemblyPage::setCostsMap(const Data::CallerCalleeResults& callerCalleeResults) { m_callerCalleeResults = callerCalleeResults; } void ResultsDisassemblyPage::setArch(const QString& arch) { m_arch = arch.trimmed().toLower(); } void ResultsDisassemblyPage::changeEvent(QEvent* event) { if (event->type() == QEvent::PaletteChange) { m_sourceCodeModel->highlightedText()->updateHighlighting(); m_disassemblyModel->highlightedText()->updateHighlighting(); } } void ResultsDisassemblyPage::jumpToSourceLine(const Data::FileLine& line) { if (line.isValid()) { ui->sourceCodeView->scrollTo(m_sourceCodeModel->indexForFileLine(line)); ui->assemblyView->scrollTo(m_disassemblyModel->indexForFileLine(line)); } } #include "resultsdisassemblypage.moc" KDAB-hotspot-41e5de7/src/resultsdisassemblypage.h000066400000000000000000000044661515036260400221030ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Darya Knysh SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "data.h" #include "hotspot-config.h" #include "models/costdelegate.h" #include #include class QStyledItemDelegate; namespace Ui { class ResultsDisassemblyPage; } namespace Data { struct Symbol; struct DisassemblyResult; } class CostDelegate; class CodeDelegate; class DisassemblyDelegate; struct DisassemblyOutput; class DisassemblyModel; class SourceCodeModel; class CostContextMenu; namespace KSyntaxHighlighting { class Repository; } class ResultsDisassemblyPage : public QWidget { Q_OBJECT public: explicit ResultsDisassemblyPage(CostContextMenu* costContextMenu, QWidget* parent = nullptr); ~ResultsDisassemblyPage(); void clear(); void setSymbol(const Data::Symbol& data); void setCostsMap(const Data::CallerCalleeResults& callerCalleeResults); void setArch(const QString& arch); void jumpToSourceLine(const Data::FileLine& line); signals: void jumpToCallerCallee(const Data::Symbol& symbol); void navigateToCode(const QString& file, int lineNumber, int columnNumber); void stackChanged(); protected: void changeEvent(QEvent* event) override; private: void setupAsmViewModel(); void showDisassembly(const DisassemblyOutput& disassemblyOutput); void showDisassembly(); std::unique_ptr ui; #if KFSyntaxHighlighting_FOUND std::unique_ptr m_repository; #endif // Model DisassemblyModel* m_disassemblyModel; SourceCodeModel* m_sourceCodeModel; QModelIndex m_currentSourceSearchIndex; QModelIndex m_currentDisasmSearchIndex; // Architecture QString m_arch; // Map of symbols and its locations with costs Data::CallerCalleeResults m_callerCalleeResults; // Cost delegate CostDelegate* m_disassemblyCostDelegate; CostDelegate* m_sourceCodeCostDelegate; CodeDelegate* m_disassemblyDelegate; CodeDelegate* m_sourceCodeDelegate; QStyledItemDelegate* m_branchesDelegate; QVector m_symbolStack; int m_stackIndex = 0; }; KDAB-hotspot-41e5de7/src/resultsdisassemblypage.ui000066400000000000000000000334241515036260400222650ustar00rootroot00000000000000 ResultsDisassemblyPage 0 0 768 391 0 0 0 0 true KMessageWidget::Warning 0 0 0 0 0 0 0 KSqueezedTextLabel Qt::ElideRight Qt::Horizontal 40 20 .. true .. Qt::Horizontal 0 0 0 0 0 Search reached the end true QAbstractItemView::ExtendedSelection QAbstractItemView::SelectItems false true true 0 0 0 0 0 Search: .. .. .. true 0 0 0 0 0 Syntax Highlighting: true .. Qt::Horizontal 40 20 0 0 0 0 0 Search reached the end true QAbstractItemView::ExtendedSelection QAbstractItemView::SelectItems false true 0 0 0 0 0 Search: .. .. .. 0 0 0 0 0 Syntax Highlighting: true .. Qt::Horizontal 40 20 KMessageWidget QFrame
    kmessagewidget.h
    KSqueezedTextLabel QLabel
    ksqueezedtextlabel.h
    CopyableTreeView QTreeView
    copyabletreeview.h
    KDAB-hotspot-41e5de7/src/resultsflamegraphpage.cpp000066400000000000000000000071111515036260400222130ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultsflamegraphpage.h" #include "ui_resultsflamegraphpage.h" #include "parsers/perf/perfparser.h" #include #include #include #include #include #include namespace { QString imageFormatFilter() { QString filter; { QTextStream stream(&filter); const auto supportedFormats = QImageWriter::supportedImageFormats(); for (const auto& format : supportedFormats) stream << "*." << format.toLower() << ' '; } filter.chop(1); // remove trailing whitespace return filter; } } ResultsFlameGraphPage::ResultsFlameGraphPage(FilterAndZoomStack* filterStack, PerfParser* parser, QMenu* exportMenu, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) { ui->setupUi(this); ui->flameGraph->setFilterStack(filterStack); connect(parser, &PerfParser::bottomUpDataAvailable, this, [this, exportMenu](const Data::BottomUpResults& data) { ui->flameGraph->setBottomUpData(data); m_exportAction = exportMenu->addAction(QIcon::fromTheme(QStringLiteral("image-x-generic")), tr("Flamegraph")); m_exportAction->setEnabled(ui->flameGraph->canConvertToImage()); connect(ui->flameGraph, &FlameGraph::canConvertToImageChanged, m_exportAction, [this] { m_exportAction->setEnabled(ui->flameGraph->canConvertToImage()); }); connect(m_exportAction, &QAction::triggered, this, [this]() { const auto filter = tr("Images (%1);;SVG (*.svg)").arg(imageFormatFilter()); QString selectedFilter; const auto fileName = QFileDialog::getSaveFileName(this, tr("Export Flamegraph"), {}, filter, &selectedFilter); if (fileName.isEmpty()) return; if (selectedFilter.contains(QStringLiteral("svg"))) { ui->flameGraph->saveSvg(fileName); } else { QImageWriter writer(fileName); if (!writer.write(ui->flameGraph->toImage())) { QMessageBox::warning(this, tr("Export Failed"), tr("Failed to export flamegraph: %1").arg(writer.errorString())); } } }); }); connect(parser, &PerfParser::topDownDataAvailable, this, [this](const Data::TopDownResults& data) { ui->flameGraph->setTopDownData(data); }); connect(ui->flameGraph, &FlameGraph::jumpToCallerCallee, this, &ResultsFlameGraphPage::jumpToCallerCallee); connect(ui->flameGraph, &FlameGraph::openEditor, this, &ResultsFlameGraphPage::openEditor); connect(ui->flameGraph, &FlameGraph::selectSymbol, this, &ResultsFlameGraphPage::selectSymbol); connect(ui->flameGraph, &FlameGraph::selectStack, this, &ResultsFlameGraphPage::selectStack); connect(ui->flameGraph, &FlameGraph::jumpToDisassembly, this, &ResultsFlameGraphPage::jumpToDisassembly); } ResultsFlameGraphPage::~ResultsFlameGraphPage() = default; void ResultsFlameGraphPage::clear() { ui->flameGraph->clear(); delete m_exportAction; m_exportAction = nullptr; } void ResultsFlameGraphPage::setHoveredStacks(const QVector>& hoveredStacks) { ui->flameGraph->setHoveredStacks(hoveredStacks); } KDAB-hotspot-41e5de7/src/resultsflamegraphpage.h000066400000000000000000000023521515036260400216620ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class QMenu; class QAction; namespace Ui { class ResultsFlameGraphPage; } namespace Data { struct Symbol; } class PerfParser; class FilterAndZoomStack; class ResultsFlameGraphPage : public QWidget { Q_OBJECT public: explicit ResultsFlameGraphPage(FilterAndZoomStack* filterStack, PerfParser* parser, QMenu* exportMenu, QWidget* parent = nullptr); ~ResultsFlameGraphPage(); void clear(); void setHoveredStacks(const QVector>& hoveredStacks); signals: void jumpToCallerCallee(const Data::Symbol& symbol); void openEditor(const Data::Symbol& symbol); void selectSymbol(const Data::Symbol& symbol); void selectStack(const QVector& stack, bool bottomUp); void jumpToDisassembly(const Data::Symbol& symbol); private: std::unique_ptr ui; QAction* m_exportAction = nullptr; }; KDAB-hotspot-41e5de7/src/resultsflamegraphpage.ui000066400000000000000000000020731515036260400220500ustar00rootroot00000000000000 ResultsFlameGraphPage 0 0 0 10 Visualize the aggregated call-graph profile data in flame graph. 0 0 0 0 FlameGraph QWidget
    flamegraph.h
    1
    KDAB-hotspot-41e5de7/src/resultspage.cpp000066400000000000000000000360151515036260400201710ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultspage.h" #include "ui_resultspage.h" #include "parsers/perf/perfparser.h" #include "settings.h" #include "costcontextmenu.h" #include "dockwidgetsetup.h" #include "resultsbottomuppage.h" #include "resultsbyfilepage.h" #include "resultscallercalleepage.h" #include "resultsdisassemblypage.h" #include "resultsflamegraphpage.h" #include "resultssummarypage.h" #include "resultstopdownpage.h" #include "timelinewidget.h" #include "models/filterandzoomstack.h" #include #include #if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) #include #include #else #include #include #endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) #include #include #include #include #include #include "hotspot-config.h" #if QCustomPlot_FOUND #include "frequencypage.h" #endif namespace { void showDock(DockWidget* dock) { dock->show(); dock->setFocus(Qt::FocusReason::NoFocusReason); dock->setAsCurrentTab(); } CoreDockWidget* toDockWidget(DockWidget* dock) { #if KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK(2, 0, 0) return dock; #else return dock->dockWidget(); #endif // KDDOCKWIDGETS_VERSION < KDDOCKWIDGETS_VERSION_CHECK } } ResultsPage::ResultsPage(PerfParser* parser, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) , m_contents(createDockingArea(QStringLiteral("results"), this)) , m_filterAndZoomStack(new FilterAndZoomStack(this)) , m_costContextMenu(new CostContextMenu(this)) , m_filterMenu(new QMenu(this)) , m_exportMenu(new QMenu(tr("Export"), this)) , m_resultsSummaryPage(new ResultsSummaryPage(m_filterAndZoomStack, parser, m_costContextMenu, this)) , m_resultsBottomUpPage( new ResultsBottomUpPage(m_filterAndZoomStack, parser, m_costContextMenu, m_exportMenu, this)) , m_resultsTopDownPage(new ResultsTopDownPage(m_filterAndZoomStack, parser, m_costContextMenu, this)) , m_resultsFlameGraphPage(new ResultsFlameGraphPage(m_filterAndZoomStack, parser, m_exportMenu, this)) , m_resultsCallerCalleePage(new ResultsCallerCalleePage(m_filterAndZoomStack, parser, m_costContextMenu, this)) , m_resultsByFilePage(new ResultsByFilePage(m_filterAndZoomStack, parser, m_costContextMenu, this)) , m_resultsDisassemblyPage(new ResultsDisassemblyPage(m_costContextMenu, this)) , m_timeLineWidget(new TimeLineWidget(parser, m_filterMenu, m_filterAndZoomStack, this)) #if QCustomPlot_FOUND , m_frequencyPage(new FrequencyPage(parser, this)) #endif , m_timelineVisible(true) { m_exportMenu->setIcon(QIcon::fromTheme(QStringLiteral("document-export"))); { const auto actions = m_filterAndZoomStack->actions(); m_filterMenu->addAction(actions.filterOut); m_filterMenu->addAction(actions.resetFilter); m_filterMenu->addSeparator(); m_filterMenu->addAction(actions.zoomOut); m_filterMenu->addAction(actions.resetZoom); m_filterMenu->addSeparator(); m_filterMenu->addAction(actions.resetFilterAndZoom); } ui->setupUi(this); ui->verticalLayout->addWidget(m_contents); ui->errorWidget->hide(); ui->lostMessage->hide(); auto dockify = [](QWidget* widget, const QString& id, const QString& title, const QString& shortcut) { auto* dock = new DockWidget(id); dock->setWidget(widget); dock->setTitle(title); dock->toggleAction()->setShortcut(shortcut); return dock; }; m_summaryPageDock = dockify(m_resultsSummaryPage, QStringLiteral("summary"), tr("Summar&y"), tr("Ctrl+Y")); m_contents->addDockWidget(m_summaryPageDock, KDDockWidgets::Location_OnTop); m_bottomUpDock = dockify(m_resultsBottomUpPage, QStringLiteral("bottomUp"), tr("Bottom &Up"), tr("Ctrl+U")); m_summaryPageDock->addDockWidgetAsTab(m_bottomUpDock); m_topDownDock = dockify(m_resultsTopDownPage, QStringLiteral("topDown"), tr("Top &Down"), tr("Ctrl+D")); m_summaryPageDock->addDockWidgetAsTab(m_topDownDock); m_flameGraphDock = dockify(m_resultsFlameGraphPage, QStringLiteral("flameGraph"), tr("Flame &Graph"), tr("Ctrl+G")); m_summaryPageDock->addDockWidgetAsTab(m_flameGraphDock); m_callerCalleeDock = dockify(m_resultsCallerCalleePage, QStringLiteral("callerCallee"), tr("Ca&ller / Callee"), tr("Ctrl+L")); m_summaryPageDock->addDockWidgetAsTab(m_callerCalleeDock); m_byFileDock = dockify(m_resultsByFilePage, QStringLiteral("byFile"), tr("&By File"), tr("Ctrl+B")); m_summaryPageDock->addDockWidgetAsTab(m_byFileDock); m_disassemblyDock = dockify(m_resultsDisassemblyPage, QStringLiteral("disassembly"), tr("D&isassembly"), tr("Ctrl+I")); m_summaryPageDock->addDockWidgetAsTab(m_disassemblyDock, KDDockWidgets::InitialVisibilityOption::StartHidden); m_disassemblyDock->toggleAction()->setEnabled(false); m_summaryPageDock->setAsCurrentTab(); #if QCustomPlot_FOUND m_frequencyDock = dockify(m_frequencyPage, QStringLiteral("frequency"), tr("Fr&equency"), tr("Ctrl+E")); m_summaryPageDock->addDockWidgetAsTab(m_frequencyDock); #endif m_timeLineDock = dockify(m_timeLineWidget, QStringLiteral("timeLine"), tr("&Time Line"), tr("Ctrl+T")); m_contents->addDockWidget(m_timeLineDock, KDDockWidgets::Location_OnBottom); connect(parser, &PerfParser::callerCalleeDataAvailable, m_resultsDisassemblyPage, &ResultsDisassemblyPage::setCostsMap); connect(m_filterAndZoomStack, &FilterAndZoomStack::filterChanged, parser, &PerfParser::filterResults); connect(parser, &PerfParser::summaryDataAvailable, this, [this](const Data::Summary& data) { if (data.lostChunks > 0) { //: %1: Lost 1 event(s). %2: Lost 1 chunk(s). ui->lostMessage->setText(tr("%1 %2 - Check IO/CPU overload!") .arg(i18np("Lost 1 event.", "Lost %1 events.", data.lostEvents), i18np("Lost 1 chunk.", "Lost %1 chunks.", data.lostChunks))); ui->lostMessage->show(); } else { ui->lostMessage->hide(); } m_resultsDisassemblyPage->setArch(data.cpuArchitecture); }); connect(parser, &PerfParser::parserWarning, this, &ResultsPage::showError); connect(parser, &PerfParser::exportFailed, this, &ResultsPage::showError); connect(m_resultsByFilePage, &ResultsByFilePage::openFileLineRequested, m_resultsCallerCalleePage, &ResultsCallerCalleePage::openFileLineRequested); connect(m_resultsCallerCalleePage, &ResultsCallerCalleePage::navigateToCode, this, &ResultsPage::navigateToCode); connect(m_resultsCallerCalleePage, &ResultsCallerCalleePage::navigateToCodeFailed, this, &ResultsPage::showError); connect(m_resultsCallerCalleePage, &ResultsCallerCalleePage::selectSymbol, m_timeLineWidget, &TimeLineWidget::selectSymbol); connect(m_resultsCallerCalleePage, &ResultsCallerCalleePage::jumpToDisassembly, this, &ResultsPage::onJumpToDisassembly); connect(m_resultsCallerCalleePage, &ResultsCallerCalleePage::jumpToSourceCode, this, &ResultsPage::onJumpToSourceCode); connect(m_resultsSummaryPage, &ResultsSummaryPage::jumpToCallerCallee, this, &ResultsPage::onJumpToCallerCallee); connect(m_resultsSummaryPage, &ResultsSummaryPage::openEditor, this, &ResultsPage::onOpenEditor); connect(m_resultsSummaryPage, &ResultsSummaryPage::selectSymbol, m_timeLineWidget, &TimeLineWidget::selectSymbol); connect(m_resultsSummaryPage, &ResultsSummaryPage::jumpToDisassembly, this, &ResultsPage::onJumpToDisassembly); connect(m_resultsBottomUpPage, &ResultsBottomUpPage::jumpToCallerCallee, this, &ResultsPage::onJumpToCallerCallee); connect(m_resultsBottomUpPage, &ResultsBottomUpPage::openEditor, this, &ResultsPage::onOpenEditor); connect(m_resultsBottomUpPage, &ResultsBottomUpPage::selectSymbol, m_timeLineWidget, &TimeLineWidget::selectSymbol); connect(m_resultsBottomUpPage, &ResultsBottomUpPage::jumpToDisassembly, this, &ResultsPage::onJumpToDisassembly); connect(m_resultsTopDownPage, &ResultsTopDownPage::jumpToCallerCallee, this, &ResultsPage::onJumpToCallerCallee); connect(m_resultsTopDownPage, &ResultsTopDownPage::openEditor, this, &ResultsPage::onOpenEditor); connect(m_resultsTopDownPage, &ResultsTopDownPage::selectSymbol, m_timeLineWidget, &TimeLineWidget::selectSymbol); connect(m_resultsTopDownPage, &ResultsTopDownPage::jumpToDisassembly, this, &ResultsPage::onJumpToDisassembly); connect(m_resultsFlameGraphPage, &ResultsFlameGraphPage::jumpToCallerCallee, this, &ResultsPage::onJumpToCallerCallee); connect(m_resultsFlameGraphPage, &ResultsFlameGraphPage::openEditor, this, &ResultsPage::onOpenEditor); connect(m_resultsFlameGraphPage, &ResultsFlameGraphPage::selectStack, m_timeLineWidget, &TimeLineWidget::selectStack); connect(m_resultsFlameGraphPage, &ResultsFlameGraphPage::jumpToDisassembly, this, &ResultsPage::onJumpToDisassembly); connect(m_resultsDisassemblyPage, &ResultsDisassemblyPage::jumpToCallerCallee, this, &ResultsPage::onJumpToCallerCallee); connect(m_resultsDisassemblyPage, &ResultsDisassemblyPage::navigateToCode, this, &ResultsPage::navigateToCode); connect(m_timeLineWidget, &TimeLineWidget::stacksHovered, m_resultsFlameGraphPage, &ResultsFlameGraphPage::setHoveredStacks); connect(parser, &PerfParser::parsingStarted, this, [this]() { // disable when we apply a filter m_contents->setEnabled(false); repositionFilterBusyIndicator(); m_filterBusyIndicator->setVisible(true); m_resultsDisassemblyPage->clear(); m_disassemblyDock->toggleAction()->setEnabled(false); }); connect(parser, &PerfParser::parsingFinished, this, [this]() { // re-enable when we finished filtering m_contents->setEnabled(true); m_filterBusyIndicator->setVisible(false); }); connect(parser, &PerfParser::perfMapFileExists, this, [errorWidget = ui->errorWidget](bool exists) { if (exists) { errorWidget->setText(tr("Perf Map file detected. Consider exporting in the perfparser format or copying " "it to another location to keep all backtraces")); errorWidget->show(); } }); { // create a busy indicator m_filterBusyIndicator = new QWidget(this); m_filterBusyIndicator->setMinimumHeight(100); m_filterBusyIndicator->setVisible(false); m_filterBusyIndicator->setToolTip(i18n("Filtering in progress, please wait...")); auto layout = new QVBoxLayout(m_filterBusyIndicator); layout->setAlignment(Qt::AlignCenter); auto progressBar = new QProgressBar(m_filterBusyIndicator); layout->addWidget(progressBar); progressBar->setMaximum(0); auto label = new QLabel(m_filterBusyIndicator->toolTip(), m_filterBusyIndicator); label->setAlignment(Qt::AlignCenter); layout->addWidget(label); } connect(Settings::instance(), &Settings::costAggregationChanged, this, [this, parser] { parser->filterResults(m_filterAndZoomStack->filter()); }); } ResultsPage::~ResultsPage() = default; void ResultsPage::setSysroot(const QString& path) { m_resultsCallerCalleePage->setSysroot(path); } void ResultsPage::setAppPath(const QString& path) { m_resultsCallerCalleePage->setAppPath(path); } void ResultsPage::onJumpToCallerCallee(const Data::Symbol& symbol) { m_resultsCallerCalleePage->jumpToCallerCallee(symbol); showDock(m_callerCalleeDock); } void ResultsPage::onJumpToDisassembly(const Data::Symbol& symbol) { m_disassemblyDock->toggleAction()->setEnabled(true); m_resultsDisassemblyPage->setSymbol(symbol); showDock(m_disassemblyDock); } void ResultsPage::onJumpToSourceCode(const Data::Symbol& symbol, const Data::FileLine& line) { onJumpToDisassembly(symbol); if (line.isValid()) { m_resultsDisassemblyPage->jumpToSourceLine(line); } } void ResultsPage::onOpenEditor(const Data::Symbol& symbol) { m_resultsCallerCalleePage->openEditor(symbol); } void ResultsPage::selectSummaryTab() { m_summaryPageDock->show(); m_summaryPageDock->setFocus(Qt::NoFocusReason); m_summaryPageDock->setAsCurrentTab(); } void ResultsPage::clear() { m_resultsBottomUpPage->clear(); m_resultsTopDownPage->clear(); m_resultsCallerCalleePage->clear(); m_resultsByFilePage->clear(); m_resultsFlameGraphPage->clear(); m_exportMenu->clear(); m_disassemblyDock->forceClose(); m_filterAndZoomStack->clear(); } QMenu* ResultsPage::filterMenu() const { return m_filterMenu; } QMenu* ResultsPage::exportMenu() const { return m_exportMenu; } QList ResultsPage::windowActions() const { auto ret = QList {m_summaryPageDock->toggleAction(), m_bottomUpDock->toggleAction(), m_topDownDock->toggleAction(), m_flameGraphDock->toggleAction(), m_callerCalleeDock->toggleAction(), m_byFileDock->toggleAction(), m_disassemblyDock->toggleAction(), m_timeLineDock->toggleAction(), #if QCustomPlot_FOUND m_frequencyDock->toggleAction() #endif }; return ret; } void ResultsPage::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); repositionFilterBusyIndicator(); } void ResultsPage::repositionFilterBusyIndicator() { auto geometry = m_filterBusyIndicator->geometry(); geometry.setWidth(width() / 2); geometry.moveCenter(rect().center()); m_filterBusyIndicator->setGeometry(geometry); } void ResultsPage::showError(const QString& message) { ui->errorWidget->setText(message); ui->errorWidget->animatedShow(); QTimer::singleShot(5000, ui->errorWidget, &KMessageWidget::animatedHide); } void ResultsPage::initDockWidgets(const QVector& restored) { auto summaryPageDock = toDockWidget(m_summaryPageDock); Q_ASSERT(restored.contains(summaryPageDock)); const auto docks = {m_bottomUpDock, m_topDownDock, m_flameGraphDock, m_callerCalleeDock, m_byFileDock, m_timeLineDock, m_disassemblyDock, #if QCustomPlot_FOUND m_frequencyDock #endif }; for (auto dock : docks) { auto dockWidget = toDockWidget(dock); if (!dock || restored.contains(dockWidget)) continue; auto initialOption = KDDockWidgets::InitialOption {}; if (dock == m_disassemblyDock) initialOption = KDDockWidgets::InitialVisibilityOption::StartHidden; m_summaryPageDock->addDockWidgetAsTab(dock, initialOption); } } KDAB-hotspot-41e5de7/src/resultspage.h000066400000000000000000000053241515036260400176350ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include "dockwidgets.h" class QMenu; class QAction; namespace Ui { class ResultsPage; } namespace Data { struct Symbol; struct FileLine; } class PerfParser; class ResultsSummaryPage; class ResultsBottomUpPage; class ResultsTopDownPage; class ResultsFlameGraphPage; class ResultsCallerCalleePage; class ResultsByFilePage; class ResultsDisassemblyPage; class FilterAndZoomStack; class TimeLineWidget; class CostContextMenu; class FrequencyPage; class ResultsPage : public QWidget { Q_OBJECT public: explicit ResultsPage(PerfParser* parser, QWidget* parent = nullptr); ~ResultsPage(); void selectSummaryTab(); void clear(); QMenu* filterMenu() const; QMenu* exportMenu() const; QList windowActions() const; void initDockWidgets(const QVector& restored); public slots: void setSysroot(const QString& path); void setAppPath(const QString& path); void onJumpToCallerCallee(const Data::Symbol& symbol); void onOpenEditor(const Data::Symbol& symbol); void showError(const QString& message); void onJumpToDisassembly(const Data::Symbol& symbol); void onJumpToSourceCode(const Data::Symbol& symbol, const Data::FileLine& line); signals: void navigateToCode(const QString& url, int lineNumber, int columnNumber); private: void resizeEvent(QResizeEvent* event) override; void repositionFilterBusyIndicator(); std::unique_ptr ui; DockMainWindow* m_contents; FilterAndZoomStack* m_filterAndZoomStack; CostContextMenu* m_costContextMenu; QMenu* m_filterMenu; QMenu* m_exportMenu; DockWidget* m_summaryPageDock; ResultsSummaryPage* m_resultsSummaryPage; DockWidget* m_bottomUpDock; ResultsBottomUpPage* m_resultsBottomUpPage; DockWidget* m_topDownDock; ResultsTopDownPage* m_resultsTopDownPage; DockWidget* m_flameGraphDock; ResultsFlameGraphPage* m_resultsFlameGraphPage; DockWidget* m_callerCalleeDock; ResultsCallerCalleePage* m_resultsCallerCalleePage; DockWidget* m_byFileDock; ResultsByFilePage* m_resultsByFilePage; DockWidget* m_disassemblyDock; ResultsDisassemblyPage* m_resultsDisassemblyPage; DockWidget* m_timeLineDock; TimeLineWidget* m_timeLineWidget; FrequencyPage* m_frequencyPage = nullptr; DockWidget* m_frequencyDock = nullptr; QWidget* m_filterBusyIndicator = nullptr; bool m_timelineVisible; }; KDAB-hotspot-41e5de7/src/resultspage.ui000066400000000000000000000022171515036260400200210ustar00rootroot00000000000000 ResultsPage 0 0 744 510 0 0 0 0 true KMessageWidget::Warning KMessageWidget QFrame
    kmessagewidget.h
    KDAB-hotspot-41e5de7/src/resultssummarypage.cpp000066400000000000000000000223071515036260400216060ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultssummarypage.h" #include "ui_resultssummarypage.h" #include #include #include #include #include #include "parsers/perf/perfparser.h" #include "resultsutil.h" #include "util.h" #include "models/topproxy.h" #include "models/treemodel.h" ResultsSummaryPage::ResultsSummaryPage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) { ui->setupUi(this); ui->parserErrorsBox->setVisible(false); auto bottomUpCostModel = new BottomUpModel(this); auto perLibraryModel = new PerLibraryModel(this); auto topHotspotsProxy = new TopProxy(this); topHotspotsProxy->setSourceModel(bottomUpCostModel); ui->topHotspotsTableView->setSortingEnabled(false); ui->topHotspotsTableView->setModel(topHotspotsProxy); ResultsUtil::setupCostDelegate(bottomUpCostModel, ui->topHotspotsTableView); ResultsUtil::setupHeaderView(ui->topHotspotsTableView, contextMenu); ResultsUtil::setupContextMenu(ui->topHotspotsTableView, contextMenu, bottomUpCostModel, filterStack, this); auto topLibraryProxy = new TopProxy(this); topLibraryProxy->setSourceModel(perLibraryModel); topLibraryProxy->setCostColumn(PerLibraryModel::InitialSortColumn); topLibraryProxy->setNumBaseColumns(PerLibraryModel::NUM_BASE_COLUMNS); ui->topLibraryTreeView->setSortingEnabled(false); ui->topLibraryTreeView->setModel(topLibraryProxy); ResultsUtil::setupCostDelegate(perLibraryModel, ui->topLibraryTreeView); ResultsUtil::setupHeaderView(ui->topLibraryTreeView, contextMenu); ResultsUtil::setupContextMenu(ui->topLibraryTreeView, contextMenu, perLibraryModel, filterStack, this, {}); connect(ui->eventSourceComboBox, static_cast(&QComboBox::currentIndexChanged), this, [topHotspotsProxy, this]() { topHotspotsProxy->setCostColumn(ui->eventSourceComboBox->currentData().toInt() + BottomUpModel::NUM_BASE_COLUMNS); }); connect(ui->eventSourceComboBox_2, qOverload(&QComboBox::currentIndexChanged), this, [topLibraryProxy, this]() { topLibraryProxy->setCostColumn(ui->eventSourceComboBox_2->currentData().toInt() + PerLibraryModel::NUM_BASE_COLUMNS); }); connect( parser, &PerfParser::bottomUpDataAvailable, this, [this, bottomUpCostModel](const Data::BottomUpResults& data) { bottomUpCostModel->setData(data); ResultsUtil::hideEmptyColumns(data.costs, ui->topHotspotsTableView, BottomUpModel::NUM_BASE_COLUMNS); ResultsUtil::hideTracepointColumns(data.costs, ui->topHotspotsTableView, BottomUpModel::NUM_BASE_COLUMNS); ResultsUtil::fillEventSourceComboBox(ui->eventSourceComboBox, data.costs, tr("Show top hotspots for %1 events.")); }); connect(parser, &PerfParser::perLibraryDataAvailable, this, [this, perLibraryModel](const Data::PerLibraryResults& data) { perLibraryModel->setData(data); ResultsUtil::hideEmptyColumns(data.costs, ui->topLibraryTreeView, PerLibraryModel::NUM_BASE_COLUMNS); ResultsUtil::hideTracepointColumns(data.costs, ui->topLibraryTreeView, PerLibraryModel::NUM_BASE_COLUMNS); ResultsUtil::fillEventSourceComboBox(ui->eventSourceComboBox_2, data.costs, tr("Show top hotspots for %1 events.")); }); auto parserErrorsModel = new QStringListModel(this); ui->parserErrorsView->setModel(parserErrorsModel); connect(parser, &PerfParser::summaryDataAvailable, this, [this, parserErrorsModel](const Data::Summary& data) { auto formatSummaryText = [](const QString& description, const QString& value) -> QString { return QString(QLatin1String("") + description + QLatin1String(": ") + value + QLatin1String("")); }; QString summaryText; { const auto indent = QLatin1String("    "); QTextStream stream(&summaryText); stream << "" << formatSummaryText(tr("Command"), QLatin1String("") + data.command.toHtmlEscaped() + QLatin1String("")) << formatSummaryText(tr("Run Time"), Util::formatTimeString(data.applicationTime.delta())); if (data.offCpuTime > 0 || data.onCpuTime > 0) { stream << formatSummaryText(indent + tr("On CPU Time"), Util::formatTimeString(data.onCpuTime)) << formatSummaryText(indent + tr("Off CPU Time"), Util::formatTimeString(data.offCpuTime)); } stream << formatSummaryText(tr("Processes"), QString::number(data.processCount)) << formatSummaryText(tr("Threads"), QString::number(data.threadCount)); if (data.offCpuTime > 0 || data.onCpuTime > 0) { stream << formatSummaryText(indent + tr("Avg. Running"), Util::formatCostRelative(data.onCpuTime, data.applicationTime.delta() * 100)) << formatSummaryText(indent + tr("Avg. Sleeping"), Util::formatCostRelative(data.offCpuTime, data.applicationTime.delta() * 100)); } stream << formatSummaryText( tr("Total Samples"), tr("%1 (%4)").arg(QString::number(data.sampleCount), Util::formatFrequency(data.sampleCount, data.applicationTime.delta()))); for (const auto& costSummary : data.costs) { if (!costSummary.sampleCount) { continue; } if (costSummary.unit == Data::Costs::Unit::Time) { // we show the on/off CPU time already above continue; } stream << formatSummaryText( indent + costSummary.label.toHtmlEscaped(), tr("%1 (%2 samples, %3% of total, %4)") .arg(Util::formatCost(costSummary.totalPeriod), Util::formatCost(costSummary.sampleCount), Util::formatCostRelative(costSummary.sampleCount, data.sampleCount), Util::formatFrequency(costSummary.sampleCount, data.applicationTime.delta()))); if ((costSummary.sampleCount * 1E9 / data.applicationTime.delta()) < 100) { stream << formatSummaryText(indent + tr("WARNING"), tr("Sampling frequency below 100Hz")); } } stream << formatSummaryText(tr("Lost Events"), QString::number(data.lostEvents)); stream << formatSummaryText(tr("Lost Chunks"), QString::number(data.lostChunks)); stream << "
    "; } ui->summaryLabel->setText(summaryText); QString systemInfoText; if (!data.hostName.isEmpty()) { const auto format = KFormat(); QTextStream stream(&systemInfoText); stream << "" << formatSummaryText(tr("Host Name"), data.hostName) << formatSummaryText(tr("Linux Kernel Version"), data.linuxKernelVersion) << formatSummaryText(tr("Perf Version"), data.perfVersion) << formatSummaryText(tr("CPU Description"), data.cpuDescription) << formatSummaryText(tr("CPU ID"), data.cpuId) << formatSummaryText(tr("CPU Architecture"), data.cpuArchitecture) << formatSummaryText(tr("CPUs Online"), QString::number(data.cpusOnline)) << formatSummaryText(tr("CPUs Available"), QString::number(data.cpusAvailable)) << formatSummaryText(tr("CPU Sibling Cores"), data.cpuSiblingCores) << formatSummaryText(tr("CPU Sibling Threads"), data.cpuSiblingThreads) << formatSummaryText( tr("Total Memory"), format.formatByteSize(data.totalMemoryInKiB * 1024, 1, KFormat::MetricBinaryDialect)) << "
    "; } ui->systemInfoGroupBox->setVisible(!systemInfoText.isEmpty()); ui->systemInfoLabel->setText(systemInfoText); if (data.errors.isEmpty()) { ui->parserErrorsBox->setVisible(false); } else { parserErrorsModel->setStringList(data.errors); ui->parserErrorsBox->setVisible(true); } }); } ResultsSummaryPage::~ResultsSummaryPage() = default; KDAB-hotspot-41e5de7/src/resultssummarypage.h000066400000000000000000000020111515036260400212410ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include namespace Data { struct Symbol; } namespace Ui { class ResultsSummaryPage; } class PerfParser; class FilterAndZoomStack; class CostContextMenu; class ResultsSummaryPage : public QWidget { Q_OBJECT public: explicit ResultsSummaryPage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent = nullptr); ~ResultsSummaryPage(); signals: void jumpToCallerCallee(const Data::Symbol& symbol); void openEditor(const Data::Symbol& symbol); void selectSymbol(const Data::Symbol& symbol); void jumpToDisassembly(const Data::Symbol& symbol); private: std::unique_ptr ui; }; KDAB-hotspot-41e5de7/src/resultssummarypage.ui000066400000000000000000000244031515036260400214400ustar00rootroot00000000000000 ResultsSummaryPage 0 0 721 523 Summary of the profile data analysis. 0 0 0 0 QFrame::NoFrame true 0 -84 700 691 0 0 0 0 Errors occurred parsing the data input. You may need to change the search paths to resolve errors for missing ELF files. Parser Errors false true true Summary summary text true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Qt::Horizontal The hotspots found in the profile, i.e. the code that contributed the most samples. Top Hotspots 0 0 0 0 Qt::Horizontal 40 20 Event Source: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 150 true false true Top Hotspots per File 0 0 0 0 Qt::Horizontal 40 20 Event Source: false true System Information system info Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse KDAB-hotspot-41e5de7/src/resultstopdownpage.cpp000066400000000000000000000054251515036260400216050ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultstopdownpage.h" #include "ui_resultstopdownpage.h" #include "parsers/perf/perfparser.h" #include "resultsutil.h" #include "models/treemodel.h" ResultsTopDownPage::ResultsTopDownPage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent) : QWidget(parent) , ui(std::make_unique()) { ui->setupUi(this); auto topDownCostModel = new TopDownModel(this); ResultsUtil::setupTreeView(ui->topDownTreeView, contextMenu, ui->topDownSearch, ui->regexCheckBox, topDownCostModel); ResultsUtil::setupCostDelegate(topDownCostModel, ui->topDownTreeView); ResultsUtil::setupContextMenu(ui->topDownTreeView, contextMenu, topDownCostModel, filterStack, this); connect(parser, &PerfParser::topDownDataAvailable, this, [this, topDownCostModel](const Data::TopDownResults& data) { topDownCostModel->setData(data); ResultsUtil::hideEmptyColumns(data.inclusiveCosts, ui->topDownTreeView, TopDownModel::NUM_BASE_COLUMNS); ResultsUtil::hideEmptyColumns(data.selfCosts, ui->topDownTreeView, TopDownModel::NUM_BASE_COLUMNS + data.inclusiveCosts.numTypes()); ResultsUtil::hideTracepointColumns(data.selfCosts, ui->topDownTreeView, TopDownModel::NUM_BASE_COLUMNS + data.inclusiveCosts.numTypes()); // hide self cost columns for sched:sched_switch and off-CPU // quasi all rows will have a cost of 0%, and only the leaves will show // a non-zero value that is equal to the inclusive cost then const auto costs = data.inclusiveCosts.numTypes(); const auto schedSwitchName = QLatin1String("sched:sched_switch"); const auto offCpuName = PerfParser::tr("off-CPU Time"); for (int i = 0; i < costs; ++i) { const auto typeName = data.inclusiveCosts.typeName(i); if (typeName == schedSwitchName || typeName == offCpuName) { ui->topDownTreeView->hideColumn(topDownCostModel->selfCostColumn(i)); } } }); ResultsUtil::setupResultsAggregation(ui->costAggregationComboBox); } ResultsTopDownPage::~ResultsTopDownPage() = default; void ResultsTopDownPage::clear() { ui->topDownSearch->setText({}); } KDAB-hotspot-41e5de7/src/resultstopdownpage.h000066400000000000000000000020561515036260400212470ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include namespace Ui { class ResultsTopDownPage; } namespace Data { struct Symbol; } class QTreeView; class PerfParser; class FilterAndZoomStack; class CostContextMenu; class ResultsTopDownPage : public QWidget { Q_OBJECT public: explicit ResultsTopDownPage(FilterAndZoomStack* filterStack, PerfParser* parser, CostContextMenu* contextMenu, QWidget* parent = nullptr); ~ResultsTopDownPage(); void clear(); signals: void jumpToCallerCallee(const Data::Symbol& symbol); void openEditor(const Data::Symbol& symbol); void selectSymbol(const Data::Symbol& symbol); void jumpToDisassembly(const Data::Symbol& symbol); private: std::unique_ptr ui; }; KDAB-hotspot-41e5de7/src/resultstopdownpage.ui000066400000000000000000000052201515036260400214310ustar00rootroot00000000000000 ResultsTopDownPage 0 0 728 638 Inspect the profile data samples in an aggregated view, showing the top-down call-graph tree. 0 0 0 0 0 0 0 Aggregate cost by: costAggregationComboBox Qt::Horizontal 40 20 Filter the call graph tree. Regex Search true true true KDAB-hotspot-41e5de7/src/resultsutil.cpp000066400000000000000000000257251515036260400202400ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "resultsutil.h" #include #include #include #include #include #include #include #include #include #include #include "models/costdelegate.h" #include "models/data.h" #include "models/filterandzoomstack.h" #include "costcontextmenu.h" #include "costheaderview.h" #include "settings.h" namespace ResultsUtil { void setupHeaderView(QTreeView* view, CostContextMenu* contextMenu) { view->setHeader(new CostHeaderView(contextMenu, view)); } void connectFilter(QLineEdit* filter, QSortFilterProxyModel* proxy, QCheckBox* regexCheckBox) { Q_ASSERT(regexCheckBox); auto* timer = new QTimer(filter); timer->setSingleShot(true); filter->setClearButtonEnabled(true); filter->setPlaceholderText(QCoreApplication::translate("Util", "Search")); proxy->setFilterKeyColumn(-1); proxy->setFilterCaseSensitivity(Qt::CaseInsensitive); auto setFilterNeedle = [filter, proxy, regexCheckBox]() { auto useRegex = regexCheckBox->isChecked(); const auto needle = filter->text(); proxy->setFilterRegularExpression(useRegex ? needle : QRegularExpression::escape(needle)); }; QObject::connect(timer, &QTimer::timeout, proxy, setFilterNeedle); if (regexCheckBox) { #if QT_VERSION < QT_VERSION_CHECK(6, 7, 0) QObject::connect(regexCheckBox, &QCheckBox::stateChanged, proxy, setFilterNeedle); #else QObject::connect(regexCheckBox, &QCheckBox::checkStateChanged, proxy, setFilterNeedle); #endif } QObject::connect(filter, &QLineEdit::textChanged, timer, [timer]() { timer->start(300); }); } void setupTreeView(QTreeView* view, CostContextMenu* contextMenu, QLineEdit* filter, QCheckBox* regexSearchCheckbox, QSortFilterProxyModel* model, int initialSortColumn, int sortRole) { model->setSortRole(sortRole); connectFilter(filter, model, regexSearchCheckbox); view->setModel(model); setupHeaderView(view, contextMenu); view->sortByColumn(initialSortColumn, Qt::DescendingOrder); } void addFilterActions(QMenu* menu, const Data::Symbol& symbol, FilterAndZoomStack* filterStack) { if (symbol.isValid()) { auto filterActions = filterStack->actions(); // don't include symbol-related entries for binary-only symbols (like in Top Hotspots Per File) if (!symbol.symbol.isEmpty()) { auto symbolFilter = QVariant::fromValue(symbol); filterActions.filterInBySymbol->setData(symbolFilter); filterActions.filterOutBySymbol->setData(symbolFilter); menu->addAction(filterActions.filterInBySymbol); menu->addAction(filterActions.filterOutBySymbol); menu->addSeparator(); } // don't include binary-related entries when we don't have this information if (!symbol.binary.isEmpty()) { auto binaryFilter = QVariant::fromValue(symbol.binary); filterActions.filterInByBinary->setData(binaryFilter); filterActions.filterOutByBinary->setData(binaryFilter); menu->addAction(filterActions.filterInByBinary); menu->addAction(filterActions.filterOutByBinary); menu->addSeparator(); } } menu->addAction(filterStack->actions().filterOut); menu->addAction(filterStack->actions().resetFilter); } void setupContextMenu(QTreeView* view, CostContextMenu* costContextMenu, int symbolRole, FilterAndZoomStack* filterStack, CallbackActions actions, const std::function& callback) { QObject::connect(costContextMenu, &CostContextMenu::hiddenColumnsChanged, view, [view, costContextMenu] { costContextMenu->hideColumns(view); }); view->setContextMenuPolicy(Qt::CustomContextMenu); QObject::connect(view, &QTreeView::customContextMenuRequested, view, [=](QPoint point) { const auto index = view->indexAt(point); const auto symbol = index.data(symbolRole).value(); QMenu contextMenu; if (callback && symbol.isValid() && actions) { if (actions.testFlag(CallbackAction::ViewCallerCallee)) { auto* viewCallerCallee = contextMenu.addAction(QCoreApplication::translate("Util", "View Caller/Callee")); QObject::connect(viewCallerCallee, &QAction::triggered, &contextMenu, [symbol, callback]() { callback(CallbackAction::ViewCallerCallee, symbol); }); viewCallerCallee->setEnabled(symbol.canDisassemble()); } if (actions.testFlag(CallbackAction::OpenEditor)) { auto* openEditorAction = contextMenu.addAction(QCoreApplication::translate("Util", "Open in Editor")); QObject::connect(openEditorAction, &QAction::triggered, &contextMenu, [symbol, callback]() { callback(CallbackAction::OpenEditor, symbol); }); openEditorAction->setEnabled(symbol.canDisassemble()); } if (actions.testFlag(CallbackAction::ViewDisassembly)) { auto* viewDisassembly = contextMenu.addAction(QCoreApplication::translate("Util", "Disassembly")); QObject::connect(viewDisassembly, &QAction::triggered, &contextMenu, [symbol, callback]() { callback(CallbackAction::ViewDisassembly, symbol); }); viewDisassembly->setEnabled(symbol.canDisassemble()); } contextMenu.addSeparator(); } costContextMenu->addToMenu(view->header(), contextMenu.addMenu(QCoreApplication::translate("Util", "Visible Columns"))); contextMenu.addSeparator(); addFilterActions(&contextMenu, symbol, filterStack); if (!contextMenu.actions().isEmpty()) { contextMenu.exec(QCursor::pos()); } }); if (actions.testFlag(ResultsUtil::CallbackAction::SelectSymbol)) { QObject::connect(view->selectionModel(), &QItemSelectionModel::currentRowChanged, view, [=](const QModelIndex& current) { const auto symbol = current.data(symbolRole).value(); callback(CallbackAction::SelectSymbol, symbol); }); } } void setupCostDelegate(QAbstractItemModel* model, QTreeView* view, int sortRole, int totalCostRole, int numBaseColumns) { auto costDelegate = new CostDelegate(sortRole, totalCostRole, view); QObject::connect(model, &QAbstractItemModel::modelReset, costDelegate, [costDelegate, model, view, numBaseColumns]() { for (int i = numBaseColumns, c = model->columnCount(); i < c; ++i) { view->setItemDelegateForColumn(i, costDelegate); } }); } void hideEmptyColumns(const Data::Costs& costs, QTreeView* view, int numBaseColumns) { for (int i = 0; i < costs.numTypes(); ++i) { if (!costs.totalCost(i)) { view->hideColumn(numBaseColumns + i); } } } void hideTracepointColumns(const Data::Costs& costs, QTreeView* view, int numBaseColumns) { for (int i = 0, c = costs.numTypes(); i < c; i++) { const auto unit = costs.unit(i); switch (unit) { case Data::Costs::Unit::Time: case Data::Costs::Unit::Tracepoint: view->hideColumn(numBaseColumns + i); case Data::Costs::Unit::Unknown: break; } } } void fillEventSourceComboBox(QComboBox* combo, const Data::Costs& costs, const QString& tooltipTemplate) { // restore selection if possible const auto oldData = combo->currentData(); combo->clear(); for (int i = 0, c = costs.numTypes(); i < c; ++i) { if (!costs.totalCost(i)) { continue; } const auto& typeName = costs.typeName(i); combo->addItem(typeName, QVariant::fromValue(i)); combo->setItemData(i, tooltipTemplate.arg(typeName), Qt::ToolTipRole); } const auto index = combo->findData(oldData); if (index != -1) { combo->setCurrentIndex(index); } } void setupResultsAggregation(QComboBox* costAggregationComboBox) { struct AggregationType { QString name; QString tooltip; Settings::CostAggregation aggregation; }; const AggregationType types[] = { {QCoreApplication::translate("Util", "Symbol"), QCoreApplication::translate("Util", "Disable grouping and aggregate costs over all threads, processes and CPUs."), Settings::CostAggregation::BySymbol}, {QCoreApplication::translate("Util", "Thread"), QCoreApplication::translate("Util", "Group events by thread id and aggregate costs separately for each thread."), Settings::CostAggregation::ByThread}, {QCoreApplication::translate("Util", "Process"), QCoreApplication::translate("Util", "Group events by process id and aggregate costs separately for each process."), Settings::CostAggregation::ByProcess}, {QCoreApplication::translate("Util", "CPU"), QCoreApplication::translate("Util", "Group events by CPU id and aggregate costs separately for each CPU."), Settings::CostAggregation::ByCPU}}; for (const auto& aggregationType : types) { costAggregationComboBox->addItem(aggregationType.name, QVariant::fromValue(aggregationType.aggregation)); costAggregationComboBox->setItemData(costAggregationComboBox->count() - 1, aggregationType.tooltip, Qt::ToolTipRole); } auto updateCostAggregation = [costAggregationComboBox](Settings::CostAggregation costAggregation) { auto idx = costAggregationComboBox->findData(QVariant::fromValue(costAggregation)); Q_ASSERT(idx != -1); costAggregationComboBox->setCurrentIndex(idx); }; updateCostAggregation(Settings::instance()->costAggregation()); QObject::connect(Settings::instance(), &Settings::costAggregationChanged, costAggregationComboBox, updateCostAggregation); QObject::connect(costAggregationComboBox, qOverload(&QComboBox::currentIndexChanged), Settings::instance(), [costAggregationComboBox] { const auto aggregation = costAggregationComboBox->currentData().value(); Settings::instance()->setCostAggregation(aggregation); }); } } KDAB-hotspot-41e5de7/src/resultsutil.h000066400000000000000000000077271515036260400177070ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include "models/costproxy.h" #include class QMenu; class QTreeView; class QComboBox; class QLineEdit; class QSortFilterProxyModel; class QAbstractItemModel; class QCheckBox; namespace Data { class Costs; struct Symbol; } class FilterAndZoomStack; class CostContextMenu; namespace ResultsUtil { void setupHeaderView(QTreeView* view, CostContextMenu* contextMenu); void connectFilter(QLineEdit* filter, QSortFilterProxyModel* proxy, QCheckBox* regexCheckBox); void setupTreeView(QTreeView* view, CostContextMenu* contextMenu, QLineEdit* filter, QCheckBox* regexSearchCheckBox, QSortFilterProxyModel* model, int initialSortColumn, int sortRole); template void setupTreeView(QTreeView* view, CostContextMenu* costContextMenu, QLineEdit* filter, QCheckBox* regexSearchCheckBox, Model* model) { auto* proxy = new CostProxy(view); proxy->setSourceModel(model); setupTreeView(view, costContextMenu, filter, regexSearchCheckBox, qobject_cast(proxy), Model::InitialSortColumn, Model::SortRole); } void setupCostDelegate(QAbstractItemModel* model, QTreeView* view, int sortRole, int totalCostRole, int numBaseColumns); template void setupCostDelegate(Model* model, QTreeView* view) { setupCostDelegate(model, view, Model::SortRole, Model::TotalCostRole, Model::NUM_BASE_COLUMNS); } void addFilterActions(QMenu* menu, const Data::Symbol& symbol, FilterAndZoomStack* filterStack); enum class CallbackAction { ViewCallerCallee = 0x1, OpenEditor = 0x2, SelectSymbol = 0x4, ViewDisassembly = 0x8 }; Q_DECLARE_FLAGS(CallbackActions, CallbackAction) void setupContextMenu(QTreeView* view, CostContextMenu* costContextMenu, int symbolRole, FilterAndZoomStack* filterStack, CallbackActions actions, const std::function& callback); template void setupContextMenu(QTreeView* view, CostContextMenu* costContextMenu, Model* /*model*/, FilterAndZoomStack* filterStack, Context* context, CallbackActions actions = {CallbackAction::ViewCallerCallee, CallbackAction::OpenEditor, CallbackAction::SelectSymbol, CallbackAction::ViewDisassembly}) { setupContextMenu(view, costContextMenu, Model::SymbolRole, filterStack, actions, [context](ResultsUtil::CallbackAction action, const Data::Symbol& symbol) { switch (action) { case ResultsUtil::CallbackAction::ViewCallerCallee: context->jumpToCallerCallee(symbol); break; case ResultsUtil::CallbackAction::OpenEditor: context->openEditor(symbol); break; case ResultsUtil::CallbackAction::SelectSymbol: context->selectSymbol(symbol); break; case ResultsUtil::CallbackAction::ViewDisassembly: context->jumpToDisassembly(symbol); break; } }); } void hideEmptyColumns(const Data::Costs& costs, QTreeView* view, int numBaseColumns); void hideTracepointColumns(const Data::Costs& costs, QTreeView* view, int numBaseColumns); void fillEventSourceComboBox(QComboBox* combo, const Data::Costs& costs, const QString& tooltipTemplate); void setupResultsAggregation(QComboBox* costAggregationComboBox); } KDAB-hotspot-41e5de7/src/settings.cpp000066400000000000000000000244571515036260400175020ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Erik Johansson SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include "settings.h" Settings::~Settings() = default; Settings* Settings::instance() { static Settings settings; Q_ASSERT(QThread::currentThread() == settings.thread()); return &settings; } void Settings::setPrettifySymbols(bool prettifySymbols) { if (m_prettifySymbols != prettifySymbols) { m_prettifySymbols = prettifySymbols; emit prettifySymbolsChanged(m_prettifySymbols); } } void Settings::setCollapseTemplates(bool collapseTemplates) { if (m_collapseTemplates != collapseTemplates) { m_collapseTemplates = collapseTemplates; emit collapseTemplatesChanged(m_collapseTemplates); } } void Settings::setCollapseDepth(int depth) { depth = std::max(1, depth); if (m_collapseDepth != depth) { m_collapseDepth = depth; emit collapseDepthChanged(m_collapseDepth); } } void Settings::setColorScheme(Settings::ColorScheme scheme) { if (m_colorScheme != scheme) { m_colorScheme = scheme; emit colorSchemeChanged(m_colorScheme); } } void Settings::setPaths(const QStringList& userPaths, const QStringList& systemPaths) { if (m_userPaths != userPaths || m_systemPaths != systemPaths) { m_userPaths = userPaths; m_systemPaths = systemPaths; emit pathsChanged(); } } void Settings::setDebuginfodUrls(const QStringList& urls) { if (m_debuginfodUrls != urls) { m_debuginfodUrls = urls; emit debuginfodUrlsChanged(); } } void Settings::setSysroot(const QString& path) { m_sysroot = path.trimmed(); emit sysrootChanged(m_sysroot); } void Settings::setKallsyms(const QString& path) { m_kallsyms = path; emit kallsymsChanged(m_kallsyms); } void Settings::setDebugPaths(const QString& paths) { m_debugPaths = paths; emit debugPathsChanged(m_debugPaths); } void Settings::setExtraLibPaths(const QString& paths) { m_extraLibPaths = paths; emit extraLibPathsChanged(m_extraLibPaths); } void Settings::setAppPath(const QString& path) { m_appPath = path; emit appPathChanged(m_appPath); } void Settings::setArch(const QString& arch) { m_arch = arch; emit archChanged(m_arch); } void Settings::setObjdump(const QString& objdump) { m_objdump = objdump; emit objdumpChanged(m_objdump); } void Settings::setPerfMapPath(const QString& perfMapPath) { m_perfMapPath = perfMapPath; emit perfMapPathChanged(m_perfMapPath); } void Settings::setCallgraphParentDepth(int parent) { if (m_callgraphParentDepth != parent) { m_callgraphParentDepth = parent; emit callgraphChanged(); } } void Settings::setCallgraphChildDepth(int child) { if (m_callgraphChildDepth != child) { m_callgraphChildDepth = child; emit callgraphChanged(); } } void Settings::setCallgraphColors(const QColor& active, const QColor& inactive) { if (m_callgraphActiveColor != active || m_callgraphColor != inactive) { m_callgraphActiveColor = active; m_callgraphColor = inactive; emit callgraphChanged(); } } void Settings::setCostAggregation(Settings::CostAggregation costAggregation) { if (m_costAggregation != costAggregation) { m_costAggregation = costAggregation; emit costAggregationChanged(costAggregation); } } void Settings::setLastUsedEnvironment(const QString& envName) { if (envName != m_lastUsedEnvironment) { m_lastUsedEnvironment = envName; emit lastUsedEnvironmentChanged(m_lastUsedEnvironment); } } void Settings::loadFromFile() { auto sharedConfig = KSharedConfig::openConfig(); auto config = sharedConfig->group(QStringLiteral("Settings")); setPrettifySymbols(config.readEntry("prettifySymbols", true)); setCollapseTemplates(config.readEntry("collapseTemplates", true)); setCollapseDepth(config.readEntry("collapseDepth", 1)); connect(Settings::instance(), &Settings::prettifySymbolsChanged, this, [sharedConfig](bool prettifySymbols) { sharedConfig->group(QStringLiteral("Settings")).writeEntry("prettifySymbols", prettifySymbols); }); connect(Settings::instance(), &Settings::collapseTemplatesChanged, this, [sharedConfig](bool collapseTemplates) { sharedConfig->group(QStringLiteral("Settings")).writeEntry("collapseTemplates", collapseTemplates); }); connect(this, &Settings::collapseDepthChanged, this, [sharedConfig](int collapseDepth) { sharedConfig->group(QStringLiteral("Settings")).writeEntry("collapseDepth", collapseDepth); }); const QStringList userPaths = {QDir::homePath()}; const QStringList systemPaths = {QDir::rootPath()}; setPaths(sharedConfig->group(QStringLiteral("PathSettings")).readEntry("userPaths", userPaths), sharedConfig->group(QStringLiteral("PathSettings")).readEntry("systemPaths", systemPaths)); connect(this, &Settings::pathsChanged, this, [sharedConfig, this] { sharedConfig->group(QStringLiteral("PathSettings")).writeEntry("userPaths", this->userPaths()); sharedConfig->group(QStringLiteral("PathSettings")).writeEntry("systemPaths", this->systemPaths()); }); // fix build error in app image build const auto colorScheme = KColorScheme(QPalette::Normal, KColorScheme::View, sharedConfig); const auto color = colorScheme.background(KColorScheme::AlternateBackground).color().name(); const auto currentColor = colorScheme.background(KColorScheme::ActiveBackground).color().name(); setCallgraphParentDepth(sharedConfig->group(QStringLiteral("CallgraphSettings")).readEntry("parent", 3)); setCallgraphChildDepth(sharedConfig->group(QStringLiteral("CallgraphSettings")).readEntry("child", 3)); setCallgraphColors(sharedConfig->group(QStringLiteral("CallgraphSettings")).readEntry("activeColor", currentColor), sharedConfig->group(QStringLiteral("CallgraphSettings")).readEntry("color", color)); connect(this, &Settings::callgraphChanged, this, [sharedConfig, this] { sharedConfig->group(QStringLiteral("CallgraphSettings")).writeEntry("parent", this->callgraphParentDepth()); sharedConfig->group(QStringLiteral("CallgraphSettings")).writeEntry("child", this->callgraphChildDepth()); sharedConfig->group(QStringLiteral("CallgraphSettings")) .writeEntry("activeColor", this->callgraphActiveColor()); sharedConfig->group(QStringLiteral("CallgraphSettings")).writeEntry("color", this->callgraphColor()); }); setDebuginfodUrls(sharedConfig->group(QStringLiteral("debuginfod")).readEntry("urls", QStringList())); connect(this, &Settings::debuginfodUrlsChanged, this, [sharedConfig, this] { sharedConfig->group(QStringLiteral("debuginfod")).writeEntry("urls", this->debuginfodUrls()); }); m_lastUsedEnvironment = sharedConfig->group(QStringLiteral("PerfPaths")).readEntry("lastUsed"); if (!m_lastUsedEnvironment.isEmpty()) { auto currentConfig = sharedConfig->group(QStringLiteral("PerfPaths")).group(m_lastUsedEnvironment); setSysroot(currentConfig.readEntry("sysroot", "")); setAppPath(currentConfig.readEntry("appPath", "")); setExtraLibPaths(currentConfig.readEntry("extraLibPaths", "")); setDebugPaths(currentConfig.readEntry("debugPaths", "")); setKallsyms(currentConfig.readEntry("kallsyms", "")); setArch(currentConfig.readEntry("arch", "")); setObjdump(currentConfig.readEntry("objdump", "")); setPerfMapPath(currentConfig.readEntry("perfMapPath", "")); } setPerfPath(sharedConfig->group(QStringLiteral("Perf")).readEntry("path", "")); connect(this, &Settings::perfPathChanged, this, [sharedConfig](const QString& perfPath) { sharedConfig->group(QStringLiteral("Perf")).writeEntry("path", perfPath); }); connect(this, &Settings::lastUsedEnvironmentChanged, this, [sharedConfig](const QString& envName) { sharedConfig->group(QStringLiteral("PerfPaths")).writeEntry("lastUsed", envName); }); setSourceCodePaths(sharedConfig->group(QStringLiteral("Disassembly")).readEntry("sourceCodePaths", QString())); connect(this, &Settings::sourceCodePathsChanged, this, [sharedConfig](const QString& paths) { sharedConfig->group(QStringLiteral("Disassembly")).writeEntry("sourceCodePaths", paths); }); setShowBranches(sharedConfig->group(QStringLiteral("Disassembly")).readEntry("showBranches", true)); connect(this, &Settings::showBranchesChanged, [sharedConfig](bool showBranches) { sharedConfig->group(QStringLiteral("Disassembly")).writeEntry("showBranches", showBranches); }); setShowBranches(sharedConfig->group(QStringLiteral("Disassembly")).readEntry("showHexdump", false)); connect(this, &Settings::showHexdumpChanged, [sharedConfig](bool showHexdump) { sharedConfig->group(QStringLiteral("Disassembly")).writeEntry("showHexdump", showHexdump); }); setTabWidth(sharedConfig->group(QStringLiteral("Disassembly")).readEntry("tabWidth", DefaultTabWidth)); connect(this, &Settings::tabWidthChanged, [sharedConfig](int distance) { sharedConfig->group(QStringLiteral("Disassembly")).writeEntry("tabWidth", distance); }); } void Settings::setSourceCodePaths(const QString& paths) { if (m_sourceCodePaths != paths) { m_sourceCodePaths = paths; emit sourceCodePathsChanged(m_sourceCodePaths); } } void Settings::setPerfPath(const QString& path) { if (m_perfPath != path) { m_perfPath = path; emit perfPathChanged(m_perfPath); } } void Settings::setShowBranches(bool showBranches) { if (m_showBranches != showBranches) { m_showBranches = showBranches; emit showBranchesChanged(m_showBranches); } } void Settings::setShowHexdump(bool showHexdump) { if (m_showHexdump != showHexdump) { m_showHexdump = showHexdump; emit showHexdumpChanged(m_showHexdump); } } void Settings::setTabWidth(int distance) { if (m_tabWidth != distance) { m_tabWidth = distance; emit tabWidthChanged(m_tabWidth); } } KDAB-hotspot-41e5de7/src/settings.h000066400000000000000000000135621515036260400171420ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Erik Johansson SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class Settings : public QObject { Q_OBJECT Q_DISABLE_COPY(Settings) public: enum class ColorScheme : int { Default, Binary, Kernel, System, CostRatio, NumColorSchemes }; Q_ENUM(ColorScheme); enum class CostAggregation : int { BySymbol, ByThread, ByProcess, ByCPU }; Q_ENUM(CostAggregation); static Settings* instance(); bool prettifySymbols() const { return m_prettifySymbols; } bool collapseTemplates() const { return m_collapseTemplates; } int collapseDepth() const { return m_collapseDepth; } ColorScheme colorScheme() const { return m_colorScheme; } QStringList userPaths() const { return m_userPaths; } QStringList systemPaths() const { return m_systemPaths; } QStringList debuginfodUrls() const { return m_debuginfodUrls; } QString sysroot() const { return m_sysroot; } QString kallsyms() const { return m_kallsyms; } QString debugPaths() const { return m_debugPaths; } QString extraLibPaths() const { return m_extraLibPaths; } QString appPath() const { return m_appPath; } QString arch() const { return m_arch; } QString objdump() const { return m_objdump; } QString perfMapPath() const { return m_perfMapPath; } int callgraphParentDepth() const { return m_callgraphParentDepth; } int callgraphChildDepth() const { return m_callgraphChildDepth; } QColor callgraphActiveColor() const { return m_callgraphActiveColor; } QColor callgraphColor() const { return m_callgraphColor; } CostAggregation costAggregation() const { return m_costAggregation; } QString lastUsedEnvironment() const { return m_lastUsedEnvironment; } QString sourceCodePaths() const { return m_sourceCodePaths; } QString perfPath() const { return m_perfPath; } bool showBranches() const { return m_showBranches; } bool showHexdump() const { return m_showHexdump; } int tabWidth() const { return m_tabWidth; } static constexpr int DefaultTabWidth = 4; void loadFromFile(); signals: void prettifySymbolsChanged(bool); void collapseTemplatesChanged(bool); void collapseDepthChanged(int); void colorSchemeChanged(Settings::ColorScheme); void costAggregationChanged(Settings::CostAggregation); void pathsChanged(); void debuginfodUrlsChanged(); void sysrootChanged(const QString& path); void kallsymsChanged(const QString& path); void debugPathsChanged(const QString& paths); void extraLibPathsChanged(const QString& paths); void appPathChanged(const QString& path); void archChanged(const QString& arch); void objdumpChanged(const QString& objdump); void perfMapPathChanged(const QString& perfMapPath); void callgraphChanged(); void lastUsedEnvironmentChanged(const QString& envName); void sourceCodePathsChanged(const QString& paths); void perfPathChanged(const QString& perfPath); void showBranchesChanged(bool showBranches); void showHexdumpChanged(bool showHexdump); void tabWidthChanged(int distance); public slots: void setPrettifySymbols(bool prettifySymbols); void setCollapseTemplates(bool collapseTemplates); void setCollapseDepth(int depth); void setColorScheme(Settings::ColorScheme scheme); void setPaths(const QStringList& userPaths, const QStringList& systemPaths); void setDebuginfodUrls(const QStringList& urls); void setSysroot(const QString& path); void setKallsyms(const QString& path); void setDebugPaths(const QString& paths); void setExtraLibPaths(const QString& paths); void setAppPath(const QString& path); void setArch(const QString& arch); void setObjdump(const QString& objdump); void setPerfMapPath(const QString& perfMapPath); void setCallgraphParentDepth(int parent); void setCallgraphChildDepth(int child); void setCallgraphColors(const QColor& active, const QColor& inactive); void setCostAggregation(Settings::CostAggregation costAggregation); void setLastUsedEnvironment(const QString& envName); void setSourceCodePaths(const QString& paths); void setPerfPath(const QString& path); void setShowBranches(bool showBranches); void setShowHexdump(bool showHexdump); void setTabWidth(int distance); private: using QObject::QObject; ~Settings(); bool m_prettifySymbols = true; bool m_collapseTemplates = true; int m_collapseDepth = 1; ColorScheme m_colorScheme = ColorScheme::Default; CostAggregation m_costAggregation = CostAggregation::BySymbol; QStringList m_userPaths; QStringList m_systemPaths; QStringList m_debuginfodUrls; QString m_sysroot; QString m_kallsyms; QString m_debugPaths; QString m_extraLibPaths; QString m_appPath; QString m_arch; QString m_objdump; QString m_sourceCodePaths; QString m_perfMapPath; bool m_showBranches = true; bool m_showHexdump = false; int m_tabWidth = DefaultTabWidth; QString m_lastUsedEnvironment; int m_callgraphParentDepth = 3; int m_callgraphChildDepth = 2; QColor m_callgraphActiveColor; QColor m_callgraphColor; QString m_perfPath; }; KDAB-hotspot-41e5de7/src/settingsdialog.cpp000066400000000000000000000324771515036260400206630ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Petr Lyapidevskiy SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "settingsdialog.h" #include "ui_callgraphsettingspage.h" #include "ui_debuginfodpage.h" #include "ui_disassemblysettingspage.h" #include "ui_flamegraphsettingspage.h" #include "ui_perfsettingspage.h" #include "ui_unwindsettingspage.h" #include "multiconfigwidget.h" #include "settings.h" #include #include #include #include #include #include #include #include namespace { KConfigGroup config() { return KSharedConfig::openConfig()->group(QStringLiteral("PerfPaths")); } QPushButton* setupMultiPath(KEditListWidget* listWidget, QLabel* buddy, QWidget* previous) { auto editor = new KUrlRequester(listWidget); editor->setPlaceholderText(QObject::tr("auto-detect")); editor->setMode(KFile::LocalOnly | KFile::Directory | KFile::ExistingOnly); buddy->setBuddy(editor); listWidget->setCustomEditor(editor->customEditor()); QWidget::setTabOrder(previous, editor); QWidget::setTabOrder(editor, listWidget->listView()); QWidget::setTabOrder(listWidget->listView(), listWidget->addButton()); QWidget::setTabOrder(listWidget->addButton(), listWidget->removeButton()); QWidget::setTabOrder(listWidget->removeButton(), listWidget->upButton()); QWidget::setTabOrder(listWidget->upButton(), listWidget->downButton()); return listWidget->downButton(); } QIcon icon() { static const auto icon = QIcon::fromTheme(QStringLiteral("preferences-system-windows-behavior")); return icon; } } SettingsDialog::SettingsDialog(QWidget* parent) : KPageDialog(parent) , perfPage(new Ui::PerfSettingsPage) , unwindPage(new Ui::UnwindSettingsPage) , flamegraphPage(new Ui::FlamegraphSettingsPage) , debuginfodPage(new Ui::DebuginfodPage) , disassemblyPage(new Ui::DisassemblySettingsPage) #if KGraphViewerPart_FOUND , callgraphPage(new Ui::CallgraphSettingsPage) #endif { addPerfSettingsPage(); addPathSettingsPage(); addFlamegraphPage(); addDebuginfodPage(); #if KGraphViewerPart_FOUND addCallgraphPage(); #endif addSourcePathPage(); } SettingsDialog::~SettingsDialog() = default; void SettingsDialog::initSettings() { const auto configName = Settings::instance()->lastUsedEnvironment(); if (!configName.isEmpty()) { m_configs->selectConfig(configName); } } QString SettingsDialog::sysroot() const { return unwindPage->lineEditSysroot->text(); } QString SettingsDialog::appPath() const { return unwindPage->lineEditApplicationPath->text(); } QString SettingsDialog::extraLibPaths() const { return unwindPage->extraLibraryPaths->items().join(QLatin1Char(':')); } QString SettingsDialog::debugPaths() const { return unwindPage->debugPaths->items().join(QLatin1Char(':')); } QString SettingsDialog::kallsyms() const { return unwindPage->lineEditKallsyms->text(); } QString SettingsDialog::arch() const { const auto sArch = unwindPage->comboBoxArchitecture->currentText(); return (sArch == QLatin1String("auto-detect")) ? QString() : sArch; } QString SettingsDialog::objdump() const { return disassemblyPage->lineEditObjdump->text(); } QString SettingsDialog::perfMapPath() const { return unwindPage->lineEditPerfMapPath->text(); } void SettingsDialog::addPerfSettingsPage() { auto page = new QWidget(this); auto item = addPage(page, tr("Perf")); item->setIcon(icon()); perfPage->setupUi(page); connect(this, &KPageDialog::accepted, this, [this]() { auto settings = Settings::instance(); settings->setPerfPath(perfPage->perfPathEdit->url().toLocalFile()); }); perfPage->perfPathEdit->setUrl(QUrl::fromLocalFile(Settings::instance()->perfPath())); } void SettingsDialog::addPathSettingsPage() { auto page = new QWidget(this); auto item = addPage(page, tr("Unwinding")); item->setHeader(tr("Unwind Options")); item->setIcon(icon()); unwindPage->setupUi(page); auto lastExtraLibsWidget = setupMultiPath(unwindPage->extraLibraryPaths, unwindPage->extraLibraryPathsLabel, unwindPage->lineEditApplicationPath); setupMultiPath(unwindPage->debugPaths, unwindPage->debugPathsLabel, lastExtraLibsWidget); auto* label = new QLabel(this); label->setText(tr("Config:")); auto loadFromSettings = [this]() { auto settings = Settings::instance(); auto fromPathString = [](KEditListWidget* listWidget, const QString& string) { listWidget->setItems(string.split(QLatin1Char(':'), Qt::SkipEmptyParts)); }; fromPathString(unwindPage->extraLibraryPaths, settings->extraLibPaths()); fromPathString(unwindPage->debugPaths, settings->debugPaths()); unwindPage->lineEditSysroot->setText(settings->sysroot()); unwindPage->lineEditApplicationPath->setText(settings->appPath()); unwindPage->lineEditKallsyms->setText(settings->kallsyms()); unwindPage->lineEditPerfMapPath->setText(settings->perfMapPath()); const auto arch = settings->arch(); int itemIndex = 0; if (!arch.isEmpty()) { itemIndex = unwindPage->comboBoxArchitecture->findText(arch); if (itemIndex == -1) { itemIndex = unwindPage->comboBoxArchitecture->count(); unwindPage->comboBoxArchitecture->addItem(arch); } } unwindPage->comboBoxArchitecture->setCurrentIndex(itemIndex); }; loadFromSettings(); auto saveFunction = [this](KConfigGroup group) { group.writeEntry("sysroot", sysroot()); group.writeEntry("appPath", appPath()); group.writeEntry("extraLibPaths", extraLibPaths()); group.writeEntry("debugPaths", debugPaths()); group.writeEntry("kallsyms", kallsyms()); group.writeEntry("arch", arch()); group.writeEntry("objdump", objdump()); group.writeEntry("perfMapPath", perfMapPath()); }; auto restoreFunction = [this, loadFromSettings](const KConfigGroup& group) { ::config().writeEntry("lastUsed", m_configs->currentConfig()); auto settings = Settings::instance(); const auto sysroot = group.readEntry("sysroot"); settings->setSysroot(sysroot); const auto appPath = group.readEntry("appPath"); settings->setAppPath(appPath); const auto extraLibPaths = group.readEntry("extraLibPaths"); settings->setExtraLibPaths(extraLibPaths); const auto debugPaths = group.readEntry("debugPaths"); settings->setDebugPaths(debugPaths); const auto kallsyms = group.readEntry("kallsyms"); settings->setKallsyms(kallsyms); const auto arch = group.readEntry("arch"); settings->setArch(arch); const auto objdump = group.readEntry("objdump"); settings->setObjdump(objdump); const auto perfMapPath = group.readEntry("perfMapPath"); settings->setPerfMapPath(perfMapPath); loadFromSettings(); }; m_configs = new MultiConfigWidget(this); m_configs->setConfig(config()); m_configs->restoreCurrent(); connect(m_configs, &MultiConfigWidget::saveConfig, this, saveFunction); connect(m_configs, &MultiConfigWidget::restoreConfig, this, restoreFunction); unwindPage->formLayout->insertRow(0, label, m_configs); connect(this, &KPageDialog::accepted, this, [this] { m_configs->updateCurrentConfig(); }); for (auto field : {unwindPage->lineEditSysroot, unwindPage->lineEditApplicationPath, unwindPage->lineEditKallsyms}) { connect(field, &KUrlRequester::textEdited, m_configs, &MultiConfigWidget::updateCurrentConfig); connect(field, &KUrlRequester::urlSelected, m_configs, &MultiConfigWidget::updateCurrentConfig); } connect(unwindPage->comboBoxArchitecture, QOverload::of(&QComboBox::currentIndexChanged), m_configs, &MultiConfigWidget::updateCurrentConfig); connect(unwindPage->debugPaths, &KEditListWidget::changed, m_configs, &MultiConfigWidget::updateCurrentConfig); connect(unwindPage->extraLibraryPaths, &KEditListWidget::changed, m_configs, &MultiConfigWidget::updateCurrentConfig); } void SettingsDialog::keyPressEvent(QKeyEvent* event) { // disable the return -> accept policy since it prevents the user from confirming name changes in the combobox // you can still press CTRL + Enter to close the dialog if (event->modifiers() != Qt::Key_Control && (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return)) { return; } QDialog::keyPressEvent(event); } void SettingsDialog::addFlamegraphPage() { auto page = new QWidget(this); auto item = addPage(page, tr("Flamegraph")); item->setHeader(tr("Flamegraph Options")); item->setIcon(icon()); flamegraphPage->setupUi(page); auto lastUserPath = setupMultiPath(flamegraphPage->userPaths, flamegraphPage->userPathsLabel, nullptr); setupMultiPath(flamegraphPage->systemPaths, flamegraphPage->systemPathsLabel, lastUserPath); flamegraphPage->userPaths->insertStringList(Settings::instance()->userPaths()); flamegraphPage->systemPaths->insertStringList(Settings::instance()->systemPaths()); connect(Settings::instance(), &Settings::pathsChanged, this, [this] { flamegraphPage->userPaths->clear(); flamegraphPage->systemPaths->clear(); flamegraphPage->userPaths->insertStringList(Settings::instance()->userPaths()); flamegraphPage->systemPaths->insertStringList(Settings::instance()->systemPaths()); }); connect(buttonBox(), &QDialogButtonBox::accepted, this, [this] { Settings::instance()->setPaths(flamegraphPage->userPaths->items(), flamegraphPage->systemPaths->items()); }); } void SettingsDialog::addDebuginfodPage() { auto page = new QWidget(this); auto item = addPage(page, tr("debuginfod")); item->setHeader(tr("debuginfod Urls")); item->setIcon(icon()); debuginfodPage->setupUi(page); debuginfodPage->urls->insertStringList(Settings::instance()->debuginfodUrls()); connect(Settings::instance(), &Settings::debuginfodUrlsChanged, this, [this] { debuginfodPage->urls->clear(); debuginfodPage->urls->insertStringList(Settings::instance()->debuginfodUrls()); }); connect(buttonBox(), &QDialogButtonBox::accepted, this, [this] { Settings::instance()->setDebuginfodUrls(debuginfodPage->urls->items()); }); } void SettingsDialog::addCallgraphPage() { auto page = new QWidget(this); auto item = addPage(page, tr("Callgraph")); item->setHeader(tr("Callgraph Settings")); item->setIcon(icon()); callgraphPage->setupUi(page); connect(Settings::instance(), &Settings::callgraphChanged, this, [this] { auto settings = Settings::instance(); callgraphPage->parentSpinBox->setValue(settings->callgraphParentDepth()); callgraphPage->childSpinBox->setValue(settings->callgraphChildDepth()); callgraphPage->currentFunctionColor->setColor(settings->callgraphActiveColor()); callgraphPage->functionColor->setColor(settings->callgraphColor()); }); connect(buttonBox(), &QDialogButtonBox::accepted, this, [this] { auto settings = Settings::instance(); settings->setCallgraphParentDepth(callgraphPage->parentSpinBox->value()); settings->setCallgraphChildDepth(callgraphPage->childSpinBox->value()); settings->setCallgraphColors(callgraphPage->currentFunctionColor->color().name(), callgraphPage->functionColor->color().name()); }); } void SettingsDialog::addSourcePathPage() { auto page = new QWidget(this); auto item = addPage(page, tr("Disassembly")); item->setHeader(tr("Disassembly Settings")); item->setIcon(QIcon::fromTheme(QStringLiteral("preferences-system-windows-behavior"))); disassemblyPage->setupUi(page); auto settings = Settings::instance(); const auto colon = QLatin1Char(':'); connect(settings, &Settings::sourceCodePathsChanged, this, [this, colon](const QString& paths) { disassemblyPage->sourcePaths->setItems(paths.split(colon)); }); setupMultiPath(disassemblyPage->sourcePaths, disassemblyPage->label, buttonBox()->button(QDialogButtonBox::Ok)); disassemblyPage->lineEditObjdump->setText(settings->objdump()); disassemblyPage->showBranches->setChecked(settings->showBranches()); disassemblyPage->showHexdump->setChecked(settings->showHexdump()); disassemblyPage->tabWidth->setValue(settings->tabWidth()); connect(buttonBox(), &QDialogButtonBox::accepted, this, [this, colon, settings] { settings->setSourceCodePaths(disassemblyPage->sourcePaths->items().join(colon)); settings->setShowBranches(disassemblyPage->showBranches->isChecked()); settings->setShowHexdump(disassemblyPage->showHexdump->isChecked()); settings->setTabWidth(disassemblyPage->tabWidth->value()); }); for (auto field : {disassemblyPage->lineEditObjdump}) { connect(field, &KUrlRequester::textEdited, m_configs, &MultiConfigWidget::updateCurrentConfig); connect(field, &KUrlRequester::urlSelected, m_configs, &MultiConfigWidget::updateCurrentConfig); } } KDAB-hotspot-41e5de7/src/settingsdialog.h000066400000000000000000000031051515036260400203120ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Petr Lyapidevskiy SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include namespace Ui { class UnwindSettingsPage; class FlamegraphSettingsPage; class DebuginfodPage; class CallgraphSettingsPage; class DisassemblySettingsPage; class PerfSettingsPage; } class MultiConfigWidget; class SettingsDialog : public KPageDialog { Q_OBJECT public: explicit SettingsDialog(QWidget* parent = nullptr); ~SettingsDialog(); void initSettings(); QString sysroot() const; QString appPath() const; QString extraLibPaths() const; QString debugPaths() const; QString kallsyms() const; QString arch() const; QString objdump() const; QString perfMapPath() const; void keyPressEvent(QKeyEvent* event) override; private: void addPerfSettingsPage(); void addPathSettingsPage(); void addFlamegraphPage(); void addDebuginfodPage(); void addCallgraphPage(); void addSourcePathPage(); std::unique_ptr perfPage; std::unique_ptr unwindPage; std::unique_ptr flamegraphPage; std::unique_ptr debuginfodPage; std::unique_ptr disassemblyPage; std::unique_ptr callgraphPage; MultiConfigWidget* m_configs; }; KDAB-hotspot-41e5de7/src/startpage.cpp000066400000000000000000000102551515036260400176230ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "startpage.h" #include "ui_startpage.h" #include #include #include #include StartPage::StartPage(QWidget* parent) : QWidget(parent) , ui(std::make_unique()) { ui->setupUi(this); connect(ui->openFileButton, &QAbstractButton::clicked, this, &StartPage::openFileButtonClicked); connect(ui->recordDataButton, &QAbstractButton::clicked, this, &StartPage::recordButtonClicked); connect(ui->stopParseButton, &QAbstractButton::clicked, this, &StartPage::stopParseButtonClicked); connect(ui->pathSettings, &QAbstractButton::clicked, this, &StartPage::pathSettingsButtonClicked); ui->openFileButton->setFocus(); updateBackground(); } StartPage::~StartPage() = default; void StartPage::showStartPage() { ui->loadingResultsErrorLabel->hide(); ui->loadStack->setCurrentWidget(ui->openFilePage); } void StartPage::showParseFileProgress() { ui->loadingResultsErrorLabel->hide(); ui->loadStack->setCurrentWidget(ui->parseProgressPage); // Reset maximum to show throbber, we may not get progress notifications ui->openFileProgressBar->setMaximum(0); } void StartPage::onOpenFileError(const QString& errorMessage) { qWarning() << errorMessage; ui->loadingResultsErrorLabel->setText(errorMessage); ui->loadingResultsErrorLabel->show(); ui->loadStack->setCurrentWidget(ui->openFilePage); } void StartPage::onParseFileProgress(float percent) { ui->loadStack->setCurrentWidget(ui->parseProgressPage); const int scale = 1000; if (ui->openFileProgressBar->maximum() == 0) { ui->openFileProgressBar->setMaximum(scale); } ui->openFileProgressBar->setValue(static_cast(percent * scale)); } void StartPage::onDebugInfoDownloadProgress(const QString& module, const QString& url, qint64 numerator, qint64 denominator) { if (numerator == denominator) { ui->loadStack->setCurrentWidget(ui->parseProgressPage); return; } const auto format = KFormat(); ui->loadStack->setCurrentWidget(ui->downloadDebugInfoProgressPage); ui->downloadDebugInfoProgressLabel->setText( tr("Downloading Debug Information for %1 (%2 of %3)") .arg(module, format.formatByteSize(numerator, 1, KFormat::MetricBinaryDialect), denominator == 0 ? QStringLiteral("?") : format.formatByteSize(denominator, 1, KFormat::MetricBinaryDialect))); ui->downloadDebugInfoProgressLabel->setToolTip(url); if (denominator == 0 || denominator > std::numeric_limits::max()) { ui->downloadDebugInfoProgressBar->setRange(0, 0); ui->downloadDebugInfoProgressBar->setValue(-1); } else { ui->downloadDebugInfoProgressBar->setRange(0, static_cast(denominator)); ui->downloadDebugInfoProgressBar->setValue(static_cast(numerator)); } } void StartPage::paintEvent(QPaintEvent* /*event*/) { QPainter painter(this); const auto windowRect = rect(); auto backgroundRect = QRectF(QPointF(0, 0), QSizeF(m_background.size()) / devicePixelRatioF()); backgroundRect.moveBottomRight(windowRect.bottomRight()); painter.drawPixmap(backgroundRect.toRect(), m_background); } void StartPage::changeEvent(QEvent* event) { QWidget::changeEvent(event); if (event->type() == QEvent::PaletteChange) { updateBackground(); } } void StartPage::updateBackground() { const auto background = palette().window().color(); const auto foreground = palette().windowText().color(); if (qGray(background.rgb()) < qGray(foreground.rgb())) { // Dark color scheme m_background = QPixmap(QStringLiteral(":/images/background_dark.png")); } else { // Bright color scheme m_background = QPixmap(QStringLiteral(":/images/background_bright.png")); } m_background.setDevicePixelRatio(devicePixelRatioF()); } KDAB-hotspot-41e5de7/src/startpage.h000066400000000000000000000022221515036260400172630ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Nate Rogers SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include namespace Ui { class StartPage; } class QMenu; class StartPage : public QWidget { Q_OBJECT public: explicit StartPage(QWidget* parent = nullptr); ~StartPage(); void showStartPage(); void showParseFileProgress(); protected: void paintEvent(QPaintEvent* event) override; void changeEvent(QEvent* event) override; public slots: void onOpenFileError(const QString& errorMessage); void onParseFileProgress(float percent); void onDebugInfoDownloadProgress(const QString& module, const QString& url, qint64 numerator, qint64 denominator); signals: void openFileButtonClicked(); void recordButtonClicked(); void stopParseButtonClicked(); void pathSettingsButtonClicked(); private: void updateBackground(); std::unique_ptr ui; QPixmap m_background; }; KDAB-hotspot-41e5de7/src/startpage.ui000066400000000000000000000252731515036260400174640ustar00rootroot00000000000000 StartPage 0 0 1081 697 0 0 0 2 <html><head/><body><p><span style=" font-size:28pt;">Welcome to Hotspot,</span></p><p><span style=" font-size:28pt;">the performance profiler for Linux!</span></p></body></html> Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 0 2 0 Qt::Horizontal 40 20 0 0 Record perf data Record Data .. true 0 0 Configure hotspot settings to properly load data files from embedded systems or remote machines ... .. QToolButton::InstantPopup Open a perf.data file Open File .. true Qt::Horizontal 40 20 Qt::AlignCenter Loading Results... Qt::AlignCenter Qt::Horizontal 355 20 0 -1 Stop the parse process and go back to the start page. .. Esc Qt::ToolButtonIconOnly true Qt::Horizontal 40 20 Qt::Vertical 20 40 Downloading Debug Information... Qt::AlignCenter Qt::Horizontal 341 20 0 -1 Qt::Horizontal 341 20 Qt::Vertical 20 40 KDAB-hotspot-41e5de7/src/timelinewidget.cpp000066400000000000000000000231351515036260400206440ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "timelinewidget.h" #include "filterandzoomstack.h" #include "models/eventmodel.h" #include "resultsutil.h" #include "timelinedelegate.h" #include "data.h" #include "parsers/perf/perfparser.h" #include #include #include #include #include #include #include #include #include namespace { template void scheduleJob(Context* context, std::atomic* currentJobId, Job&& job, SetData&& setData) { using namespace ThreadWeaver; const auto jobId = ++(*currentJobId); const auto smartContext = QPointer(context); auto jobCancelled = [=]() { return !smartContext || jobId != (*currentJobId); }; stream() << make_job([=]() { auto results = job(jobCancelled); QMetaObject::invokeMethod( smartContext.data(), [results, jobCancelled, setData]() { if (!jobCancelled()) { setData(results); } }, Qt::QueuedConnection); }); } } TimeLineWidget::TimeLineWidget(PerfParser* parser, QMenu* filterMenu, FilterAndZoomStack* filterAndZoomStack, QWidget* parent) : QWidget(parent) , ui(new Ui::TimeLineWidget) , m_parser(parser) , m_filterAndZoomStack(filterAndZoomStack) { ui->setupUi(this); auto* eventModel = new EventModel(this); auto* timeLineProxy = new QSortFilterProxyModel(this); timeLineProxy->setRecursiveFilteringEnabled(true); timeLineProxy->setSourceModel(eventModel); timeLineProxy->setSortRole(EventModel::SortRole); timeLineProxy->setFilterKeyColumn(EventModel::ThreadColumn); timeLineProxy->setFilterRole(Qt::DisplayRole); ResultsUtil::connectFilter(ui->timeLineSearch, timeLineProxy, ui->regexCheckBox); ui->timeLineView->setModel(timeLineProxy); ui->timeLineView->setSortingEnabled(true); // ensure the vertical scroll bar is always shown, otherwise the timeline // view would get more or less space, which leads to odd jumping when filtering // due to the increased width leading to a zoom effect ui->timeLineView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); m_timeLineDelegate = new TimeLineDelegate(m_filterAndZoomStack, ui->timeLineView, ui->timeLineView); ui->timeLineEventFilterButton->setMenu(filterMenu); ui->timeLineView->setItemDelegateForColumn(EventModel::EventsColumn, m_timeLineDelegate); m_timeAxisHeaderView = new TimeAxisHeaderView(m_filterAndZoomStack, ui->timeLineView); ui->timeLineView->setHeader(m_timeAxisHeaderView); connect(timeLineProxy, &QAbstractItemModel::rowsInserted, this, [this]() { ui->timeLineView->expandToDepth(1); }); connect(timeLineProxy, &QAbstractItemModel::modelReset, this, [this]() { ui->timeLineView->expandToDepth(1); }); connect(m_parser, &PerfParser::bottomUpDataAvailable, this, [this](const Data::BottomUpResults& data) { ResultsUtil::fillEventSourceComboBox(ui->timeLineEventSource, data.costs, tr("Show timeline for %1 events.")); }); connect(m_parser, &PerfParser::eventsAvailable, this, [this, eventModel](const Data::EventResults& data) { eventModel->setData(data); ui->timeLineView->sortByColumn(EventModel::ThreadColumn, Qt::AscendingOrder); m_timeAxisHeaderView->setTimeRange(eventModel->timeRange()); if (data.offCpuTimeCostId != -1) { // remove the off-CPU time event source, we only want normal sched switches for (int i = 0, c = ui->timeLineEventSource->count(); i < c; ++i) { if (ui->timeLineEventSource->itemData(i).toInt() == data.offCpuTimeCostId) { ui->timeLineEventSource->removeItem(i); break; } } } }); connect(m_parser, &PerfParser::summaryDataAvailable, this, [eventModel](const Data::Summary& summary) { eventModel->setApplicationTime(summary.applicationTime); }); connect(m_parser, &PerfParser::tracepointDataAvailable, this, [this](const Data::TracepointResults& data) { m_timeAxisHeaderView->setTracepoints(data); }); connect(ui->timeLineEventSource, static_cast(&QComboBox::currentIndexChanged), this, [this](int index) { const auto typeId = ui->timeLineEventSource->itemData(index).toInt(); m_timeLineDelegate->setEventType(typeId); }); connect(m_timeLineDelegate, &TimeLineDelegate::stacksHovered, this, [this](const QSet& stackIds) { if (stackIds.isEmpty()) { ++m_currentHoverStacksJobId; emit stacksHovered({}); return; } const auto& stacks = m_parser->eventResults().stacks; const auto& bottomUpResults = m_parser->bottomUpResults(); scheduleJob( this, &m_currentHoverStacksJobId, [stacks, bottomUpResults, stackIds](auto jobCancelled) -> QVector> { QVector> hovered; hovered.reserve(stackIds.size()); for (auto stackId : stackIds) { if (jobCancelled()) return {}; const auto& stack = stacks[stackId]; QVector symbols; symbols.reserve(stack.size()); bottomUpResults.foreachFrame(stack, [&](const Data::Symbol& frame, const Data::Location&) { if (jobCancelled()) return false; symbols.append(frame); return true; }); hovered.append(std::move(symbols)); } return hovered; }, [this](const QVector>& hovered) { emit stacksHovered(hovered); }); }); } TimeLineWidget::~TimeLineWidget() = default; void TimeLineWidget::selectSymbol(const Data::Symbol& symbol) { if (!symbol.isValid()) { ++m_currentSelectStackJobId; m_timeLineDelegate->setSelectedStacks({}); return; } const auto& stacks = m_parser->eventResults().stacks; const auto& bottomUpResults = m_parser->bottomUpResults(); scheduleJob( m_timeLineDelegate, &m_currentSelectStackJobId, [stacks, bottomUpResults, symbol](auto jobCancelled) -> QSet { const auto numStacks = stacks.size(); QSet selectedStacks; selectedStacks.reserve(numStacks); for (int i = 0; i < numStacks; ++i) { if (jobCancelled()) return {}; bool symbolFound = false; bottomUpResults.foreachFrame(stacks[i], [&](const Data::Symbol& frame, const Data::Location&) { if (jobCancelled()) return false; symbolFound = (frame == symbol); // break once we find the symbol we are looking for return !symbolFound; }); if (symbolFound) selectedStacks.insert(i); } return selectedStacks; }, [this](const QSet& selectedStacks) { m_timeLineDelegate->setSelectedStacks(selectedStacks); }); } void TimeLineWidget::selectStack(const QVector& stack, bool bottomUp) { if (stack.isEmpty()) { ++m_currentSelectStackJobId; m_timeLineDelegate->setSelectedStacks({}); return; } const auto& stacks = m_parser->eventResults().stacks; const auto& bottomUpResults = m_parser->bottomUpResults(); scheduleJob( m_timeLineDelegate, &m_currentSelectStackJobId, [stacks, bottomUpResults, stack, bottomUp](auto jobCancelled) -> QSet { const auto numStacks = stacks.size(); QSet selectedStacks; selectedStacks.reserve(numStacks); QVarLengthArray frames; for (int i = 0; i < numStacks; ++i) { if (jobCancelled()) return {}; frames.clear(); bottomUpResults.foreachFrame(stacks[i], [&](const Data::Symbol& frame, const Data::Location&) { if (jobCancelled()) return false; frames.append(frame); return true; }); if (jobCancelled()) return {}; if (frames.size() < stack.size()) continue; const auto matches = [&]() { if (bottomUp) { return std::equal(frames.begin(), std::next(frames.begin(), stack.size()), stack.rbegin(), stack.rend()); } else { return std::equal(frames.rbegin(), std::next(frames.rbegin(), stack.size()), stack.rbegin(), stack.rend()); } }(); if (matches) selectedStacks.insert(i); } return selectedStacks; }, [this](const QSet& selectedStacks) { m_timeLineDelegate->setSelectedStacks(selectedStacks); }); } KDAB-hotspot-41e5de7/src/timelinewidget.h000066400000000000000000000024131515036260400203050ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include namespace Ui { class TimeLineWidget; } namespace Data { struct Symbol; } class PerfParser; class FilterAndZoomStack; class TimeLineDelegate; class TimeAxisHeaderView; class QMenu; class TimeLineWidget : public QWidget { Q_OBJECT public: explicit TimeLineWidget(PerfParser* parser, QMenu* filterMenu, FilterAndZoomStack* filterAndZoomStack, QWidget* parent = nullptr); ~TimeLineWidget() override; void selectSymbol(const Data::Symbol& symbol); void selectStack(const QVector& stack, bool bottomUp); signals: void stacksHovered(const QVector>& stacks); private: std::unique_ptr ui; PerfParser* m_parser = nullptr; FilterAndZoomStack* m_filterAndZoomStack = nullptr; TimeLineDelegate* m_timeLineDelegate = nullptr; TimeAxisHeaderView* m_timeAxisHeaderView = nullptr; std::atomic m_currentSelectStackJobId; std::atomic m_currentHoverStacksJobId; }; KDAB-hotspot-41e5de7/src/timelinewidget.ui000066400000000000000000000056711515036260400205040ustar00rootroot00000000000000 TimeLineWidget 0 0 744 200 0 200 0 0 0 0 Configure event filters Filter .. QToolButton::InstantPopup true 0 0 <html><head/><body><p>Search event timeline for threads by name or thread id.</p></body></html> Regex Search Event Source: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter true false true true KDAB-hotspot-41e5de7/src/unwindsettingspage.ui000066400000000000000000000142501515036260400214050ustar00rootroot00000000000000 UnwindSettingsPage 0 0 564 656 Dialog true Path to the sysroot. Leave empty to use the local machine. Sysroot: lineEditSysroot Path to the sysroot. Leave empty to use the local machine. KFile::Mode::Directory|KFile::Mode::ExistingOnly|KFile::Mode::LocalOnly local machine Path to the application binary and library. Application Path: lineEditApplicationPath Path to the application binary and library. auto-detect List of paths that contain additional libraries. Extra Library Paths: Qt::FocusPolicy::TabFocus List of paths that contain additional libraries. List of that contain debug information. Debug Paths: Qt::FocusPolicy::TabFocus List of paths that contain debug information. Path to the kernel symbol mapping. Kallsyms: lineEditKallsyms Path to the kernel symbol mapping. auto-detect System architecture, e.g. x86_64, arm, aarch64 etc. Architecture: comboBoxArchitecture System architecture, e.g. x86_64, arm, aarch64 etc. true auto-detect x64 ARMv7 (32 bit) ARMv8 (64 bit) Custom perf-$pid.map directory: KFile::Mode::Directory|KFile::Mode::ExistingOnly|KFile::Mode::LocalOnly KUrlRequester QWidget
    kurlrequester.h
    KEditListWidget QWidget
    keditlistwidget.h
    lineEditSysroot lineEditApplicationPath extraLibraryPaths debugPaths lineEditKallsyms comboBoxArchitecture
    KDAB-hotspot-41e5de7/src/util.cpp000066400000000000000000000366311515036260400166140ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "util.h" #include "hotspot-config.h" #include #include #include #include #include #include #include #include #include "data.h" #include "settings.h" #include #if KCOREADDONS_VERSION >= QT_VERSION_CHECK(5, 86, 0) #include #include #else #include #endif #include namespace { std::pair elideArguments(const QString& symbolText) { QChar quoteChar = QLatin1Char('"'); int numQuotes = 0; int depth = 0; int endEliding = symbolText.length(); int startEliding = 0; // this loop tries to to find the opening and closing bracket of the arguments // it does this by counting the number of opening and closing brackets from the back // it also has some basic string checking, so that string arguments like "(" of "\')" // will not be counted for (int i = symbolText.length() - 1; i > 0; i--) { auto c = symbolText[i]; // detect quotes and skip those if ((c == QLatin1Char('"') || c == QLatin1Char('\'')) && numQuotes == 0) { quoteChar = c; numQuotes++; } else if (c == quoteChar && numQuotes == 1) { if (symbolText[i - 1] == QLatin1Char('\\')) { continue; } numQuotes = 0; continue; } if (numQuotes == 1) continue; // mark opening and closing brackets if (c == QLatin1Char(')')) { if (depth == 0) { endEliding = i; } depth++; } if (c == QLatin1Char('(')) { depth--; if (depth == 0) { startEliding = i; break; } } } if (endEliding - startEliding == 1) { // don't elide if we have () in symbol return {symbolText, {}}; } return {symbolText.left(startEliding + 1), symbolText.right(symbolText.length() - endEliding)}; } QString formatForTooltip(const Data::Symbol& symbol) { return QCoreApplication::translate("Util", "symbol: %1
    binary: %2") .arg(Util::formatSymbolExtended(symbol).toHtmlEscaped(), Util::formatString(symbol.binary)); } QString formatTooltipImpl(int id, const QString& text, const Data::Costs* selfCosts, const Data::Costs* inclusiveCosts) { Q_ASSERT(selfCosts || inclusiveCosts); Q_ASSERT(!selfCosts || !inclusiveCosts || (selfCosts->numTypes() == inclusiveCosts->numTypes())); QString toolTip = text; auto extendTooltip = [&toolTip, id](int i, const Data::Costs& costs, const QString& formatting) { const auto currentCost = costs.cost(i, id); const auto totalCost = costs.totalCost(i); toolTip += formatting.arg(costs.typeName(i), costs.formatCost(i, currentCost), costs.formatCost(i, totalCost), Util::formatCostRelative(currentCost, totalCost)); }; const auto numTypes = selfCosts ? selfCosts->numTypes() : inclusiveCosts->numTypes(); for (int i = 0; i < numTypes; ++i) { if (!inclusiveCosts->totalCost(i)) { continue; } toolTip += QLatin1String("
    "); if (selfCosts) { extendTooltip(i, *selfCosts, QCoreApplication::translate("Util", "%1 (self): %2
      %4% out of %3 total")); } if (selfCosts && inclusiveCosts) { toolTip += QLatin1String("
    "); } if (inclusiveCosts) { extendTooltip( i, *inclusiveCosts, QCoreApplication::translate("Util", "%1 (inclusive): %2
      %4% out of %3 total")); } } return QString(QLatin1String("") + toolTip + QLatin1String("")); } } QString Util::collapseTemplate(const QString& str, int level) { if (str.indexOf(QLatin1Char('<')) == -1) { return str; } // special handling for fake section symbols of the form <.SECTION+OFFSET> if (str.startsWith(QLatin1String("<.")) && str.endsWith(QLatin1Char('>'))) { return str; } auto isSpaceOrAngleBracket = [](QChar c) { if (c == QLatin1Char(' ')) { return true; } if (c == QLatin1Char('<')) { return true; } if (c == QLatin1Char('>')) { return true; } return false; }; // QLatin1String does not work with … const auto elideString = QStringLiteral("<…"); QString output; output.reserve(str.size()); const auto operatorKeyword = QLatin1String("operator"); const int size = str.size(); int depth = 0; for (int i = 0; i < size; i++) { const auto c = str[i]; if (c == QLatin1Char('<')) { depth++; if (depth == level) { output.append(elideString); } } else if (c == QLatin1Char('>')) { depth--; } else if (c == QLatin1Char('o') && QStringView(str).mid(i, operatorKeyword.size()) == operatorKeyword) { i += operatorKeyword.size(); output.append(operatorKeyword); int j = i; for (; j < size && isSpaceOrAngleBracket(str[j]); j++) { output.append(str[j]); } // str[j] now points to a char that is not a space or angle bracket // -> need to rewind back i = j - 1; continue; } if (depth < level) { output.append(c); } } return output; } QString Util::elideSymbol(const QString& symbolText, const QFontMetrics& metrics, int maxWidth) { if (metrics.horizontalAdvance(symbolText) < maxWidth) { return symbolText; } const auto argumentsElided = elideArguments(symbolText); const auto fixedWidthLength = metrics.horizontalAdvance(argumentsElided.first) + metrics.horizontalAdvance(argumentsElided.second); QString elided; if (fixedWidthLength < maxWidth) { auto elidedArguments = symbolText.mid(argumentsElided.first.size(), symbolText.size() - argumentsElided.second.size()); elided = argumentsElided.first + metrics.elidedText(elidedArguments, Qt::TextElideMode::ElideRight, maxWidth - fixedWidthLength) + argumentsElided.second; return elided; } else { elided = argumentsElided.first + QStringLiteral("…") + argumentsElided.second; } auto templateElided = collapseTemplate(elided, 1); if (metrics.horizontalAdvance(templateElided) < maxWidth) { return templateElided; } return metrics.elidedText(templateElided, Qt::TextElideMode::ElideLeft, maxWidth); } QString Util::findLibexecBinary(const QString& name) { QDir dir(qApp->applicationDirPath()); if (!dir.cd(QStringLiteral(HOTSPOT_LIBEXEC_REL_PATH))) { return {}; } const auto info = QFileInfo(dir.filePath(name)); if (!info.exists() || !info.isFile() || !info.isExecutable()) { return {}; } return info.absoluteFilePath(); } QString Util::perfParserBinaryPath() { auto parserBinary = QString::fromLocal8Bit(qgetenv("HOTSPOT_PERFPARSER")); if (parserBinary.isEmpty()) { parserBinary = Util::findLibexecBinary(QStringLiteral("hotspot-perfparser")); } else { parserBinary = QStandardPaths::findExecutable(parserBinary); } return parserBinary; } QString Util::formatString(const QString& input, bool replaceEmptyString) { return input.isEmpty() && replaceEmptyString ? QCoreApplication::translate("Util", "??") : input; } QString Util::formatSymbol(const Data::Symbol& symbol, bool replaceEmptyString) { QString symbolString = Settings::instance()->prettifySymbols() ? symbol.prettySymbol : symbol.symbol; if (Settings::instance()->collapseTemplates()) { symbolString = collapseTemplate(symbolString, Settings::instance()->collapseDepth()); } return formatString(symbolString, replaceEmptyString); } QString Util::formatSymbolExtended(const Data::Symbol& symbol) { auto ret = formatSymbol(symbol); if (symbol.isInline) { ret = QCoreApplication::translate("Util", "%1 (inlined)").arg(ret); } return ret; } QString Util::formatCost(quint64 cost) { // resulting format: 1.234E56 return QString::number(static_cast(cost), 'G', 4); } QString Util::formatCostRelative(quint64 selfCost, quint64 totalCost, bool addPercentSign) { if (!totalCost) { return {}; } auto ret = QString::number(static_cast(selfCost) * 100. / totalCost, 'G', 3); if (addPercentSign) { ret.append(QLatin1Char('%')); } return ret; } QString Util::formatTimeString(quint64 totalNanoseconds, bool shortForm) { if (totalNanoseconds < 1000) { return QString::number(totalNanoseconds) + QLatin1String("ns"); } auto format = [](quint64 fragment, int precision) -> QString { return QString::number(fragment).rightJustified(precision, QLatin1Char('0')); }; const auto microseconds = (totalNanoseconds / 1000) % 1000; if (totalNanoseconds < 1000000) { const auto nanoseconds = totalNanoseconds % 1000; if (shortForm) { return QString::number(microseconds) + QStringLiteral("µs"); } return format(microseconds, 3) + QLatin1Char('.') + format(nanoseconds, 3) + QStringLiteral("µs"); } const auto milliseconds = (totalNanoseconds / 1000000) % 1000; if (totalNanoseconds < 1000000000) { if (shortForm) { return QString::number(milliseconds) + QLatin1String("ms"); } return format(milliseconds, 3) + QLatin1Char('.') + format(microseconds, 3) + QLatin1String("ms"); } const auto totalSeconds = totalNanoseconds / 1000000000; const auto days = totalSeconds / 60 / 60 / 24; const auto hours = (totalSeconds / 60 / 60) % 24; const auto minutes = (totalSeconds / 60) % 60; const auto seconds = totalSeconds % 60; auto optional = [](quint64 fragment, const char* unit) -> QString { if (fragment > 0) return QString::number(fragment) + QLatin1String(unit) + QLatin1Char(' '); return {}; }; if (shortForm) { return optional(days, "d") + optional(hours, "h") + optional(minutes, "min") + QString::number(seconds) + QLatin1Char('s'); } return optional(days, "d") + optional(hours, "h") + optional(minutes, "min") + format(seconds, 2) + QLatin1Char('.') + format(milliseconds, 3) + QLatin1Char('s'); } QString Util::formatFrequency(quint64 occurrences, quint64 nanoseconds) { auto hz = 1E9 * occurrences / nanoseconds; static const auto units = {"Hz", "KHz", "MHz", "GHz", "THz"}; auto unit = units.begin(); auto lastUnit = units.end() - 1; while (unit != lastUnit && hz > 1000.) { hz /= 1000.; ++unit; } return QString::number(hz, 'G', 4) + QLatin1String(*unit); } QString Util::formatBinaryTooltip(int id, const Data::Symbol& symbol, const Data::Costs& costs) { return formatTooltipImpl(id, Util::formatString(symbol.binary), nullptr, &costs); } QString Util::formatFileTooltip(int id, const QString& file, const Data::Costs& selfCosts, const Data::Costs& inclusiveCosts) { return formatTooltipImpl(id, Util::formatString(file), &selfCosts, &inclusiveCosts); } QString Util::formatTooltip(int id, const Data::Symbol& symbol, const Data::Costs& costs) { return formatTooltipImpl(id, formatForTooltip(symbol), nullptr, &costs); } QString Util::formatTooltip(int id, const Data::Symbol& symbol, const Data::Costs& selfCosts, const Data::Costs& inclusiveCosts) { return formatTooltipImpl(id, formatForTooltip(symbol), &selfCosts, &inclusiveCosts); } QString Util::formatTooltip(const Data::Symbol& symbol, const Data::ItemCost& itemCost, const Data::Costs& totalCosts) { Q_ASSERT(static_cast(totalCosts.numTypes()) == itemCost.size()); auto toolTip = formatForTooltip(symbol); for (int i = 0, c = totalCosts.numTypes(); i < c; ++i) { const auto cost = itemCost[i]; const auto total = totalCosts.totalCost(i); if (!total) { continue; } toolTip += QLatin1String("
    ") + QCoreApplication::translate("Util", "%1: %2
      %4% out of %3 total") .arg(totalCosts.typeName(i), totalCosts.formatCost(i, cost), totalCosts.formatCost(i, total), Util::formatCostRelative(cost, total)); } return QString(QLatin1String("") + toolTip + QLatin1String("")); } QString Util::formatTooltip(const Data::FileLine& fileLine, const Data::Costs& selfCosts, const Data::Costs& inclusiveCosts) { return formatTooltipImpl(fileLine.line, fileLine.toString(), &selfCosts, &inclusiveCosts); } QString Util::formatTooltip(const Data::FileLine& fileLine, const Data::LocationCost& cost, const Data::Costs& totalCosts) { return Util::formatTooltip(fileLine.toString(), cost, totalCosts); } QString Util::formatTooltip(const QString& location, const Data::LocationCost& cost, const Data::Costs& totalCosts) { QString toolTip = location; Q_ASSERT(static_cast(totalCosts.numTypes()) == cost.inclusiveCost.size()); Q_ASSERT(static_cast(totalCosts.numTypes()) == cost.selfCost.size()); for (int i = 0, c = totalCosts.numTypes(); i < c; ++i) { const auto selfCost = cost.selfCost[i]; const auto inclusiveCost = cost.inclusiveCost[i]; const auto total = totalCosts.totalCost(i); if (!total) { continue; } toolTip += QLatin1String("
    ") + QCoreApplication::translate("Util", "%1 (self): %2
      %4% out of %3 total") .arg(totalCosts.typeName(i), totalCosts.formatCost(i, selfCost), totalCosts.formatCost(i, total), Util::formatCostRelative(selfCost, total)) + QLatin1String("
    ") + QCoreApplication::translate("Util", "%1 (inclusive): %2
      %4% out of %3 total") .arg(totalCosts.typeName(i), totalCosts.formatCost(i, inclusiveCost), totalCosts.formatCost(i, total), Util::formatCostRelative(inclusiveCost, total)); } return QString(QLatin1String("") + toolTip + QLatin1String("")); } QProcessEnvironment Util::appImageEnvironment() { static const auto env = QProcessEnvironment::systemEnvironment(); return env; } KParts::ReadOnlyPart* Util::createPart(const QString& pluginName) { #if KCOREADDONS_VERSION >= QT_VERSION_CHECK(5, 86, 0) #if KCOREADDONS_VERSION >= QT_VERSION_CHECK(6, 0, 0) const auto prefix = QStringLiteral("kf6/parts/"); #else const auto prefix = QLatin1String(); #endif const auto metadata = KPluginMetaData(prefix + pluginName); const auto result = KPluginFactory::instantiatePlugin(metadata, nullptr, {}); return result.plugin; #else KService::Ptr service = KService::serviceByDesktopName(pluginName); if (!service) { return nullptr; } return service->createInstance(); #endif } KDAB-hotspot-41e5de7/src/util.h000066400000000000000000000055511515036260400162560ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include class QString; class QProcessEnvironment; class QFontMetrics; namespace Data { struct Symbol; struct FileLine; struct LocationCost; class Costs; class ItemCost; } namespace KParts { class ReadOnlyPart; } namespace Util { /** * Find a binary called @p name in this application's libexec directory. */ QString findLibexecBinary(const QString& name); /** * Find the perfparser binary and return its path. */ QString perfParserBinaryPath(); // HashCombine was taken from Qt's file qhashfunctions.h struct HashCombine { typedef uint result_type; template Q_DECL_CONSTEXPR result_type operator()(uint seed, const T& t) const Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t))) // combiner taken from N3876 / boost::hash_combine { return seed ^ (qHash(t) + 0x9e3779b9 + (seed << 6) + (seed >> 2)); } }; QString formatString(const QString& input, bool replaceEmptyString = true); QString formatSymbol(const Data::Symbol& symbol, bool replaceEmptyString = true); QString formatSymbolExtended(const Data::Symbol& symbol); QString formatCost(quint64 cost); QString formatCostRelative(quint64 selfCost, quint64 totalCost, bool addPercentSign = false); QString formatTimeString(quint64 nanoseconds, bool shortForm = false); QString formatFrequency(quint64 occurrences, quint64 nanoseconds); QString formatBinaryTooltip(int id, const Data::Symbol& symbol, const Data::Costs& costs); QString formatFileTooltip(int id, const QString& file, const Data::Costs& selfCosts, const Data::Costs& inclusiveCosts); QString formatTooltip(int id, const Data::Symbol& symbol, const Data::Costs& costs); QString formatTooltip(int id, const Data::Symbol& symbol, const Data::Costs& selfCosts, const Data::Costs& inclusiveCosts); QString formatTooltip(const Data::Symbol& symbol, const Data::ItemCost& itemCost, const Data::Costs& totalCosts); QString formatTooltip(const Data::FileLine& fileLine, const Data::LocationCost& cost, const Data::Costs& totalCosts); QString formatTooltip(const Data::FileLine& fileLine, const Data::Costs& selfCosts, const Data::Costs& inclusiveCosts); QString formatTooltip(const QString& location, const Data::LocationCost& cost, const Data::Costs& totalCosts); QString elideSymbol(const QString& symbolText, const QFontMetrics& metrics, int maxWidth); QString collapseTemplate(const QString& str, int level); // the process environment including the custom AppImage-specific LD_LIBRARY_PATH // this is initialized on the first call and cached internally afterwards QProcessEnvironment appImageEnvironment(); KParts::ReadOnlyPart* createPart(const QString& pluginName); } KDAB-hotspot-41e5de7/tests/000077500000000000000000000000001515036260400154755ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/CMakeLists.txt000066400000000000000000000001371515036260400202360ustar00rootroot00000000000000add_subdirectory(test-clients) add_subdirectory(modeltests) add_subdirectory(integrationtests) KDAB-hotspot-41e5de7/tests/integrationtests/000077500000000000000000000000001515036260400211035ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/integrationtests/CMakeLists.txt000066400000000000000000000033441515036260400236470ustar00rootroot00000000000000include_directories(../../src) include_directories(../../src/models) include_directories(../../src/parsers/perf) ecm_add_test( ../../src/initiallystoppedprocess.cpp ../../src/perfcontrolfifowrapper.cpp ../../src/perfrecord.cpp ../../src/recordhost.cpp ../../src/settings.cpp ../../src/util.cpp ../../src/errnoutil.cpp ../../src/models/data.cpp ../../src/parsers/perf/perfparser.cpp tst_perfparser.cpp LINK_LIBRARIES Qt::Core Qt::Test KF${QT_MAJOR_VERSION}::ThreadWeaver KF${QT_MAJOR_VERSION}::CoreAddons KF${QT_MAJOR_VERSION}::WindowSystem KF${QT_MAJOR_VERSION}::KIOCore KF${QT_MAJOR_VERSION}::Parts TEST_NAME tst_perfparser ) if(KFArchive_FOUND) target_link_libraries(tst_perfparser KF${QT_MAJOR_VERSION}::Archive) endif() set_target_properties(tst_perfparser PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}") add_executable( dump_perf_data ../../src/models/data.cpp ../../src/parsers/perf/perfparser.cpp ../../src/settings.cpp ../../src/util.cpp dump_perf_data.cpp ) target_link_libraries( dump_perf_data Qt::Core Qt::Gui Qt::Test KF${QT_MAJOR_VERSION}::ThreadWeaver KF${QT_MAJOR_VERSION}::KIOCore KF${QT_MAJOR_VERSION}::Parts ) if(KFArchive_FOUND) target_link_libraries(dump_perf_data KF${QT_MAJOR_VERSION}::Archive) endif() set_target_properties(dump_perf_data PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}") include_directories(${LIBELF_INCLUDE_DIRS} ${LIBDW_INCLUDE_DIR}/elfutils ${LIBDWARF_INCLUDE_DIRS}) add_executable( elfwalk elfwalk.cpp ) target_link_libraries( elfwalk LINK_PRIVATE ${LIBDW_LIBRARIES} ${LIBELF_LIBRARIES} ) KDAB-hotspot-41e5de7/tests/integrationtests/archives/000077500000000000000000000000001515036260400227075ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/integrationtests/archives/test-multi-files.tar000066400000000000000000000240001515036260400266220ustar00rootroot00000000000000test_foo0000644000175000017500000000000414702162515012146 0ustar lievenlievenfoo perf.data0000644000175000017500000000001414702161763012175 0ustar lievenlievenHello World KDAB-hotspot-41e5de7/tests/integrationtests/archives/test.bz2000066400000000000000000000000701515036260400243020ustar00rootroot00000000000000BZh91AY&SYr/W@@ " Ɉi("(Hl9KDAB-hotspot-41e5de7/tests/integrationtests/archives/test.gz000066400000000000000000000000401515036260400242220ustar00rootroot00000000000000HW/I啰 KDAB-hotspot-41e5de7/tests/integrationtests/archives/test.tar000066400000000000000000000240001515036260400243720ustar00rootroot00000000000000perf.data0000644000175000017500000000001414702161763012175 0ustar lievenlievenHello World KDAB-hotspot-41e5de7/tests/integrationtests/archives/test.tar.gz000066400000000000000000000002131515036260400250110ustar00rootroot00000000000000A 09Ay uJJA)f3zn4&YNxe̋a/jԋ?ocIG?u̥ 4'Q(KDAB-hotspot-41e5de7/tests/integrationtests/archives/test.txt000066400000000000000000000000141515036260400244220ustar00rootroot00000000000000Hello World KDAB-hotspot-41e5de7/tests/integrationtests/archives/test.xz000066400000000000000000000001141515036260400242450ustar00rootroot000000000000007zXZִF !{T( Hello World "u?8>, }YZKDAB-hotspot-41e5de7/tests/integrationtests/archives/test.zip000066400000000000000000000002641515036260400244140ustar00rootroot00000000000000PK TKY啰 perf.dataUT ggux Hello World PK TKY啰 perf.dataUTgux PKOOKDAB-hotspot-41e5de7/tests/integrationtests/custom_cost_aggregation_testfiles/000077500000000000000000000000001515036260400300765ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/integrationtests/custom_cost_aggregation_testfiles/by_cpu.txt000066400000000000000000000210771515036260400321270ustar00rootroot00000000000000 CPU 0 __schedule __schedule schedule futex_wait_queue futex_wait do_futex __x64_sys_futex do_syscall_64 entry_SYSCALL_64_after_hwframe __futex_abstimed_wait_common __pthread_clockjoin_ex std::thread::join()::__gthread_join std::thread::join()::__gthread_join std::thread::join() main __libc_start_call_main __libc_start_main_alias_2 _start do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone CPU 2 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone futex_wait_queue futex_wait do_futex __x64_sys_futex do_syscall_64 entry_SYSCALL_64_after_hwframe __futex_abstimed_wait_common __pthread_clockjoin_ex std::thread::join()::__gthread_join std::thread::join()::__gthread_join std::thread::join() main __libc_start_call_main __libc_start_main_alias_2 _start CPU 1 __schedule __schedule schedule futex_wait_queue futex_wait do_futex __x64_sys_futex do_syscall_64 entry_SYSCALL_64_after_hwframe __futex_abstimed_wait_common __pthread_clockjoin_ex std::thread::join()::__gthread_join std::thread::join()::__gthread_join std::thread::join() main __libc_start_call_main __libc_start_main_alias_2 _start do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone CPU 3 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone futex_wait_queue futex_wait do_futex __x64_sys_futex do_syscall_64 entry_SYSCALL_64_after_hwframe __futex_abstimed_wait_common __pthread_clockjoin_ex std::thread::join()::__gthread_join std::thread::join()::__gthread_join std::thread::join() main __libc_start_call_main __libc_start_main_alias_2 _start CPU 5 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone CPU 4 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone KDAB-hotspot-41e5de7/tests/integrationtests/custom_cost_aggregation_testfiles/by_process.txt000066400000000000000000000031411515036260400330060ustar00rootroot00000000000000 cpp-threadnames __schedule __schedule schedule futex_wait_queue futex_wait do_futex __x64_sys_futex do_syscall_64 entry_SYSCALL_64_after_hwframe __futex_abstimed_wait_common __pthread_clockjoin_ex std::thread::join()::__gthread_join std::thread::join()::__gthread_join std::thread::join() main __libc_start_call_main __libc_start_main_alias_2 _start do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone KDAB-hotspot-41e5de7/tests/integrationtests/custom_cost_aggregation_testfiles/by_symbol.txt000066400000000000000000000030531515036260400326370ustar00rootroot00000000000000 __schedule __schedule schedule futex_wait_queue futex_wait do_futex __x64_sys_futex do_syscall_64 entry_SYSCALL_64_after_hwframe __futex_abstimed_wait_common __pthread_clockjoin_ex std::thread::join()::__gthread_join std::thread::join()::__gthread_join std::thread::join() main __libc_start_call_main __libc_start_main_alias_2 _start do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone KDAB-hotspot-41e5de7/tests/integrationtests/custom_cost_aggregation_testfiles/by_thread.txt000066400000000000000000000273271515036260400326130ustar00rootroot00000000000000 cpp-threadnames __schedule __schedule schedule futex_wait_queue futex_wait do_futex __x64_sys_futex do_syscall_64 entry_SYSCALL_64_after_hwframe __futex_abstimed_wait_common __pthread_clockjoin_ex std::thread::join()::__gthread_join std::thread::join()::__gthread_join std::thread::join() main __libc_start_call_main __libc_start_main_alias_2 _start threadname0 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname1 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname2 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname3 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname4 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname5 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname6 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname7 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname8 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone threadname9 __schedule __schedule schedule do_nanosleep hrtimer_nanosleep common_nsleep __x64_sys_clock_nanosleep do_syscall_64 entry_SYSCALL_64_after_hwframe __clock_nanosleep __GI___nanosleep void std::this_thread::sleep_for >(std::chrono::duration > const&) void std::this_thread::sleep_for >(std::chrono::duration > const&) std::__invoke_impl >::operator() std::__invoke_impl > std::__invoke > std::thread::_Invoker > >::_M_invoke<0> std::thread::_Invoker > >::operator() std::thread::_State_impl > > >::_M_run std::execute_native_thread_routine start_thread __GI___clone custom_cost_aggregation.perfparser000066400000000000000000000374421515036260400370350ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/integrationtests/custom_cost_aggregation_testfilesQPERFSTREAMsched sched_switch common_type common_flagscommon_preempt_count common_pid prev_commprev_pid prev_prio prev_state next_comm next_pid next_prio > sched:sched_switch > B@)Sparrow5.17.5-arch1-15.17.gf443e374ae13x86_64(Intel(R) Core(TM) i7-8650U CPU @ 1.90GHzGenuineIntel,6,142,10d /usr/bin/perfrecord --call-graphdwarf --sample-cpu--switch-events--eventsched:sched_switch-c1000000/tmp/cpp-threadnamesHˍ;hrnhGi)/lib/modules/5.17.5-arch1-1/build/vmlinuxH8RJJIe`Jf[vdso]0-70,41,52,63,7d\0-7softwarepoweruprobe uncore_imccpu cstate_core uncore_cbox_2 breakpoint uncore_cbox_0 tracepoint cstate_pkg uncore_arbkprobe i915 msr uncore_cbox_3intel_pt uncore_cbox_1 ? ?` ?} ?s ? ?# ? ?s ? perf-execcpp-threadnames ?K` ?* ?@ ?ŋT ?Ő ?ŕ` ?Ŧ ?@ threadname1 ?K ?P ?V ?_( ?t ?w ?z$` threadname7 ?~ ?< ??z ?B ?F ?IF threadname8 ? ?` ?:  threadname0 ?̠ ? ?֐ ?-` ?ݿ ?ۛ ?۞ ?ۡ ?ۥ ?c@ ?fw ?i ?m` ? ?5@ ? ? ?` ?. ?}@ ?ƀ ?] ?_( ?`v ?b ?Ӡ ?" ?p ?ƹ ?%@ ?' ?(j ?*` ?, threadname2 ?.K ?^ ?玭 ?` ?D ?瓓  threadname6 ? ?>@ ? ? ?$` ?\ ?]Ϡ ?_ ?ag@ threadname4 ? ?` ?Ư@ ? threadname9 ?+ ?, ?.@ ?0 ?1@ threadname3 ?5 ? ? ?  threadname5 ?` ? ?c ?` ?B&B&B&B&R3 YB&B(R3 =B& B&B(R3 .$[kernel.kallsyms]_text) __schedule&)6)schedule&)[)tfutex_wait_queue&)t )t futex_wait&)t#)tcdo_futex&) te) tkP __x64_sys_futex& ) tk ) ! do_syscall_64& !) < ) 8'"entry_SYSCALL_64_after_hwframe&") |# libc.so.6$/usr/lib/libc.so.6)~PB&%%__futex_abstimed_wait_common&%#$$)~QZB&Z)~B&&__pthread_clockjoin_ex&&#$$)~B&'libstdc++.so.6.0.29%(/usr/lib/libstdc++.so.6.0.29r)i/usr/src/debug/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h<*3/usr/src/debug/gcc/libstdc++-v3/src/c++11/thread.cc)~ *B&k W7+std::thread::join()&+'( W 2()~0*B&p)~0)B& W7,,#std::thread::join()::__gthread_join&,'( W 2()~0)B&&,'( W 2()~7)B&! W7-/tmp/cpp-threadnamesN.E/home/lieven/KDAB/hotspot/tests/test-clients/cpp-threadnames/main.cpp)U.B& /main&/-`-)U.B&)~B&0__libc_start_call_main&0#$Ґ$)~B&)~@B&"1__libc_start_main_alias_2&1#$@H$)~B&)U0B&2_start&2-0&-) UTB&TB&B&R3 4   xx  swapper/0  cpp-threadnamesB& B&B&R3 QB&B(R3 n)!73 do_nanosleep&!3)"8E!)#s 4hrtimer_nanosleep&#4)$s!w#)%s5 common_nsleep&%5)&s%)'s "6__x64_sys_clock_nanosleep&'6)(s'))~9B&7__clock_nanosleep&)7#$ $)*~:UB&) U)+~B&8__GI___nanosleep&+8#$ 1$),~B&+ 990/usr/include/c++/11.2.0/bits/this_thread_sleep.h2:)/usr/include/c++/11.2.0/bits/std_thread.h)-U:B&c;Zstd::thread::_State_impl > > >::_M_run&-;-p:-).U:B&-)/U:B&.L<Cstd::thread::_Invoker > >::operator()&/<-p:-)0U:B&/)1U:B&0N=Estd::thread::_Invoker > >::_M_invoke<0>&1=-p:-)2U:B&1.>%/usr/include/c++/11.2.0/bits/invoke.h)3U>B&Z2+?"std::__invoke >&3?-p:-)4U>B&`(3)5U>B&<46@-std::__invoke_impl >&5@-p:-)6U>B&=$5)7UB&6BA9std::__invoke_impl >::operator()&7A-p:-)8US.B&#7)9US9B&F8Bzvoid std::this_thread::sleep_for >(std::chrono::duration > const&)&9B-p:-):US9B&F9&:B-p:-);U9B&R:)<~*B&O+C"std::execute_native_thread_routine&<C'( T4()=~*B&R< T)>~B&D start_thread&>D#$f$)?~B&>)@~@B&E __GI___clone&@E#$%@_$)A~ՃB&@%B&B(R3 n"$&( *,;=?A xx  swapper/2  threadname0B( B&B(R3  B&B(R3MB&B(R3 B&B&R3B&B)R3qB&B&B&R3:   xx  swapper/1  cpp-threadnamesB& B&B&R3 B&B)R3B&B)R3.B&B)R3\"$&( *,;=?A xx  swapper/0  threadname1B) B&B)R3 B&B)R3}B&B)R3  B&B&R3~B&B*R3 ~>B&B&B&R3 (y   xx  swapper/2  cpp-threadnamesB& B&B&R3  B&B*R3 B&B*R3]QB&B*R3"$&( *,;=?A xx  swapper/3  threadname2B* B&B*R3 B&B*R3q/B&B*R3  B&B&R3B&B+R3B&B&B&R3E   xx  swapper/2  cpp-threadnamesB& B&B&R3^ B&B+R3!B&B+R3B&B+R3 "$&( *,;=?A xx  swapper/5  threadname3B+ B&B+R3-  B&B+R3# VB&B+R3#) B&B&R3#B&B,R3#ڜB&B&B&R3#   xx  pulseaudio  cpp-threadnamesB& B&B,R3#L B&B&R3#QB&B,R3#\B&B,R3#:I"$&( *,;=?A xx  swapper/4  threadname4B, B&B,R3# B&B,R3)FB&B,R3) B&B&R3)h.B&B-R3)#7B&B&B&R3)#Γ   xx  swapper/2  cpp-threadnamesB& B&B&R3)$5 B&B-R3)$vB&B-R3)$6B&B-R3)%%"$&( *,;=?A xx  swapper/5  threadname5B- B&B-R3)%I B&B-R3/9B&B-R3/_ B&B&R3/65B&B.R3/+#B&B&B&R3/+b   xx  swapper/2  cpp-threadnamesB& B&B&R3/,>~ B&B.R3/,d!B&B.R3/,B&B.R3/-#e"$&( *,;=?A xx  swapper/3  threadname6B. B&B.R3/-}X B&B.R35$B&B.R35% B&B&R35&fB&B/R353UB&B&B&R354e   xx  swapper/2  cpp-threadnamesB& B&B&R354b B&B/R354ȎB&B/R355;B&B/R355"$&( *,;=?A xx  swapper/1  threadname7B/ B&B/R355ּ B&B/R3;-BB&B/R3;.u; B&B&R3;/ B&B0R3;;B&B&B&R3;<   xx  swapper/2  cpp-threadnamesB& B&B&R3;=/ B&B0R3;=9B&B0R3;=B&B0R3;=b"$&( *,;=?A xx  swapper/1  threadname8B0 B&B0R3;>Z B&B0R3A5UB&B0R3A6 B&B&R3A6B&B1R3A<B&B&B&R3A=F   xx  swapper/3  cpp-threadnamesB& B&B&R3A= B&B1R3A=ݤB&B1R3A>B&B1R3A>;"$&( *,;=?A xx  swapper/4  threadname9B1 B&B1R3A>jk B&B1R3G5;,B&B1R3G6V B&B&R3G7xTB&B&R3G> SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include "../testutils.h" #include "perfparser.h" int main(int argc, char** argv) { QCoreApplication app(argc, argv); auto args = app.arguments(); args.removeFirst(); if (args.isEmpty()) { qWarning("missing perf.data file path argument"); return 1; } int runningParsers = 0; for (const auto& arg : std::as_const(args)) { auto parser = new PerfParser(&app); parser->startParseFile(arg); ++runningParsers; QObject::connect(parser, &PerfParser::parsingFinished, parser, [&runningParsers, &app]() { // clazy:exclude=lambda-in-connect --runningParsers; if (!runningParsers) app.quit(); }); QObject::connect(parser, &PerfParser::parsingFailed, parser, [&runningParsers, &app](const QString& error) { // clazy:exclude=lambda-in-connect qWarning() << error; --runningParsers; if (!runningParsers) app.quit(); }); QObject::connect(parser, &PerfParser::bottomUpDataAvailable, parser, [arg](const Data::BottomUpResults& data) { qDebug() << arg; dumpList(printTree(data)); }); QObject::connect(parser, &PerfParser::summaryDataAvailable, parser, [arg](const Data::Summary& data) { qDebug() << "summary for" << arg; qDebug() << "runtime:" << Util::formatTimeString(data.applicationTime.delta()); qDebug() << "on-CPU:" << Util::formatTimeString(data.onCpuTime); qDebug() << "off-CPU:" << Util::formatTimeString(data.offCpuTime); }); } return app.exec(); } KDAB-hotspot-41e5de7/tests/integrationtests/elfwalk.cpp000066400000000000000000000067311515036260400232430ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include namespace { struct DieRanges { Dwarf_Die die; struct Range { Range(Dwarf_Addr low, Dwarf_Addr high) : low(low) , high(high) { } Dwarf_Addr low = 0; Dwarf_Addr high = 0; }; std::vector ranges; std::vector children; }; // see libdw_visit_scopes.c bool may_have_scopes(Dwarf_Die* die) { switch (dwarf_tag(die)) { /* DIEs with addresses we can try to match. */ case DW_TAG_compile_unit: case DW_TAG_module: case DW_TAG_lexical_block: case DW_TAG_with_stmt: case DW_TAG_catch_block: case DW_TAG_try_block: case DW_TAG_entry_point: case DW_TAG_inlined_subroutine: case DW_TAG_subprogram: return true; /* DIEs without addresses that can own DIEs with addresses. */ case DW_TAG_namespace: case DW_TAG_class_type: case DW_TAG_structure_type: return true; /* Other DIEs we have no reason to descend. */ default: break; } return false; } void walk_die(Dwarf_Die* die, DieRanges* parent, int depth) { if (!may_have_scopes(die)) return; if (dwarf_tag(die) == DW_TAG_subprogram) { DieRanges ranges; ranges.die = *die; Dwarf_Addr low = 0; Dwarf_Addr high = 0; Dwarf_Addr base = 0; ptrdiff_t offset = 0; while ((offset = dwarf_ranges(die, offset, &base, &low, &high)) > 0) { ranges.ranges.emplace_back(low, high); printf(" %lx - %lx\n", low, high); } if (!ranges.ranges.empty()) { printf("%6d: %x %s %lx\n", depth, dwarf_tag(die), dwarf_diename(die), dwarf_dieoffset(die)); parent->children.push_back(ranges); parent = &parent->children.back(); ++depth; } return; } Dwarf_Die childDie; if (dwarf_child(die, &childDie) == 0) { walk_die(&childDie, parent, depth); Dwarf_Die siblingDie; while (dwarf_siblingof(&childDie, &siblingDie) == 0) { walk_die(&siblingDie, parent, depth); childDie = siblingDie; } } } DieRanges walk_cudie(Dwarf_Die* cudie) { DieRanges ranges; ranges.die = *cudie; walk_die(cudie, &ranges, 0); return ranges; } void walk_cudies(Dwfl_Module* mod) { std::vector ranges; Dwarf_Die* cudie = nullptr; Dwarf_Addr bias = 0; while ((cudie = dwfl_module_nextcu(mod, cudie, &bias))) { ranges.emplace_back(walk_cudie(cudie)); } } } int main(int argc, char** argv) { if (argc != 2) { fprintf(stderr, "ERROR: missing arg\n"); return 1; } const auto file = argv[1]; Dwfl_Callbacks callbacks = { &dwfl_build_id_find_elf, &dwfl_standard_find_debuginfo, &dwfl_offline_section_address, nullptr, }; auto* dwfl = dwfl_begin(&callbacks); dwfl_report_begin(dwfl); auto* mod = dwfl_report_elf(dwfl, file, file, -1, 0, false); if (mod) walk_cudies(mod); else fprintf(stderr, "ERROR: failed to report elf: %s\n", dwfl_errmsg(dwfl_errno())); dwfl_report_end(dwfl, nullptr, nullptr); dwfl_end(dwfl); } KDAB-hotspot-41e5de7/tests/integrationtests/file_content/000077500000000000000000000000001515036260400235545ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/integrationtests/file_content/perf.data.broken.gz000066400000000000000000000002021515036260400272330ustar00rootroot000000000000001 0DԞ"'$x@T,JBDo-fj >y9ky\}ںƘFʹ1$Ջ,4.Ƹ_<P-(KDAB-hotspot-41e5de7/tests/integrationtests/file_content/perf.data.true.v1000066400000000000000000000231501515036260400266470ustar00rootroot00000000000000PERFFILEhXpXH%H H'hcyclesP[kernel.kallsyms]_text/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/md/dm-mod.ko/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/md/dm-log.ko/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/md/dm-region-hash.ko /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/md/dm-mirror.koh./lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/ata/ata_piix.koh._/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/ata/ata_generic.ko_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/ata/pata_acpi.koo@/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/scsi/vmw_pvscsi.ko/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/cdrom/cdrom.ko.ko/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/scsi/sr_mod.ko.kox_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/lib/crc-t10dif.koo/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/scsi/sd_mod.koxp /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/jbd2/jbd2.komox /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/mbcache.koomox /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/ext4/ext4.komo/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/pci/hotplug/shpchp.ko/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/i2c/i2c-core.kohp/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/i2c/busses/i2c-piix4.koo/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/misc/vmware_balloon.ko/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/arch/x86/kernel/microcode.koo /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/scsi/sg.korocode.O/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/net/e1000/e1000.ko`/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/parport/parport.ko/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/parport/parport_pc.koP/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/char/ppdev.kot_pc/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/input/misc/uinput.koP/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/net/tun.kouinput. /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/net/macvlan.kout. /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/net/macvtap.kout. !O/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/drivers/vhost/vhost_net.koxp" /lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv6/ipv6.kos,O/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/sunrpc/sunrpc.ko`1//lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/sunrpc/auth_gss/auth_rpcgss.ko2_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/nfs_common/nfs_acl.kor2_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/fscache/fscache.kokorxP4/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/lockd/lockd.kox 6/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/nfs/nfs.ko.ko=/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/fs/autofs4/autofs4.kox>/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/llc/llc.kofs4x ?_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/802/stp.kofs4?/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/bridge/bridge.ko`A/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/ip_tables.koB_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/iptable_filter.kopB_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/iptable_mangle.koB_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/netfilter/xt_CHECKSUM.kongle.0C_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/ipt_REJECT.ko.C/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/netfilter/nf_conntrack.koko.E_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/netfilter/xt_state.koF_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/nf_defrag_ipv4.ko`F/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/nf_conntrack_ipv4.koF/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/nf_nat.kock_ipGo/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/iptable_nat.ko0H_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv4/netfilter/ipt_MASQUERADE.koH/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/bridge/netfilter/ebtables.ko.0I_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/bridge/netfilter/ebtable_nat.koI/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv6/netfilter/ip6_tables.kok@J_/lib/modules/2.6.32-220.2.1.el6.x86_64/kernel/net/ipv6/netfilter/ip6table_filter.ko(kkperfHkk@ /usr/bin/perferPkk@?/lib64/ld-2.12.so`kk? /usr/lib64/perl5/CORE/libperl.soPkk?p/lib64/libc-2.12.soE/liPkk?0/lib64/libm-2.12.soE/liPkk@? /lib64/libdl-2.12.so/liXkk?p/lib64/libpthread-2.12.soXkk?/usr/lib64/libslang.so.2.2.1Pkk?p/lib64/librt-2.12.soo.2Xkk@?0/usr/lib64/libnewt.so.0.52.11Xkk?`/lib64/libresolv-2.12.so2.11Xkk?0/usr/lib64/libelf-0.152.so11Xkk?/usr/lib64/libpython2.6.so.1.0Pkk?p/lib64/libcrypt-2.12.soPkk?/lib64/libfreebl3.sosoPkk@? /lib64/libutil-2.12.soPkk?`/lib64/libnsl-2.12.so@kk[vdso]l(kktruekkf»4Hkk@P/bin/truekk:-»4Pkk@? "/lib64/ld-2.12.sokk@»4@kkЖjЖj[vdso]kkNh»4Pkk?:/lib64/libc-2.12.sokk»40kkkk%»4kk'»40kkkkX.»4kk.»4h&KDAB-hotspot-41e5de7/tests/integrationtests/file_content/perf.data.true.v2000066400000000000000000000537441515036260400266640ustar00rootroot00000000000000PERFILE2hhpLp/7 hP[kernel.kallsyms]_text/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/md/dm-mod.kop/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/md/dm-region-hash.ko P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/ata/ata_generic.koop`/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/md/dm-log.koic.ko/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/md/dm-mirror.koko /lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/block/floppy.kokop/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/input/serio/serio_raw.ko/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/i2c/i2c-core.koo_p/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/scsi/vmw_pvscsi.ko0/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/ata/libata.koi.ko /lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/net/vmxnet3/vmxnet3.ko P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/crypto/crct10dif_common.ko.ko /lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/gpu/drm/drm.ko.ko`/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/gpu/drm/ttm/ttm.kox`/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/lib/crc-t10dif.kop/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/ata/ata_piix.ko /lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/gpu/drm/vmwgfx/vmwgfx.ko0P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/crypto/crct10dif_generic.kox.koP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/ata/pata_acpi.kokp/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/arch/x86/crypto/crc32c-intel.ko@/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/scsi/sd_mod.koint/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/cdrom/cdrom.kointxP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/lib/libcrc32c.koo p/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/scsi/sr_mod.kox/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/xfs/xfs.kor_mox%`/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/binfmt_misc.ko&`/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/input/misc/uinput.ko`&P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/nfs_common/nfs_acl.ko.&/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/sunrpc/auth_gss/auth_rpcgss.ko'p/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/i2c/busses/i2c-piix4.koko ( /lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/misc/vmw_vmci/vmw_vmci.ko@)/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/ip_tables.koo)/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/sunrpc/sunrpc.ko_tablxP.p/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/nfsd/nfsd.koc.2/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/pci/hotplug/shpchp.ko3P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/cpufreq/mperf.kop3/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/parport/parport_pc.kox4/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/lockd/lockd.ko6/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/scsi/sg.ko6P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/input/misc/pcspkr.ko7/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/parport/parport.koo7`/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/char/ppdev.kot.ko 8`/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv6/netfilter/ip6table_filter.ko8P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/hwmon/coretemp.ko8/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/vmw_vsock/vsock.kokop9P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/misc/vmw_balloon.ko9/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/vmw_vsock/vmw_vsock_vmci_transport.ko@:/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/fscache/fscache.kok_vmx@;/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/nfs/nfsv3.kohe;P/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/iptable_filter.ko@</lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv6/netfilter/ip6_tables.ko.</lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/bridge/netfilter/ebtable_filter.kox@=/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/nfs/nfs.kofiltA/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/bridge/netfilter/ebtables.koxA/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/llc/llc.koiltx BP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/802/stp.koiltpB/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/bridge/bridge.ko0DP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/ipt_REJECT.koDP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/netfilter/xt_conntrack.kokoD/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/drivers/net/tun.konntrackPE/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/netfilter/nf_conntrack.koFP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/nf_defrag_ipv4.ko@G/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/nf_conntrack_ipv4.koGp/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/netfilter/nf_nat.konn@HP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/iptable_nat.koHP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/nf_nat_ipv4.koHP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/ipt_MASQUERADE.ko0IP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/ipv4/netfilter/iptable_mangle.koIP/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/net/netfilter/xt_CHECKSUM.kongle.xI/_/lib/modules/3.10.0-123.6.3.el7.x86_64/kernel/fs/fuse/fuse.ko_C(nnperf(nntruenn\s  Xnn[ [stack]nns `nn@`Q #-/usr/bin/truenns  `nnP` PQ #-/usr/bin/truenns hnn& " _U1(/usr/lib64/ld-2.17.sonn s  hnn'  _U1(/usr/lib64/ld-2.17.sonn#s  Xnn''//anonnn7s Xnn_ _[vdso]nn"@s  Xnn''//anonnns hnn&< _U1(/usr/lib64/libc-2.17.sonnMs  hnn& ` _U1(/usr/lib64/libc-2.17.sonns  hnn&`` _U1(/usr/lib64/libc-2.17.sonns  XnnP&PP&//anonnn-s  Xnnp' p'//anonnn)fs  XnnP'@P'//anonnnts  b&nns ('p'A&&]Ю]b&F3+('(' ] ]&&/& ]p]x]]]]&]&'f&Ȃ&&I&@ &xP'('H'jgq]&''dq@W'ش] @@@6& &@&]]&8&1&&]]]]]]] ]]]]]<]R]a]n]~]]]]]]]]]"]3]V]e]]]]]]4]T]p]z]]]]]] ]]7]O][]v]]]]]$]6]K]]]x]]]]]]+]I]i]~]]]]]],]I]V]h]~]]]]]]]*]:]M]w]]\]i]{];]J][]j]{]]]]]]!_d@@8 & @ mmi]]y]]V6O ^ys!=x86_64trueTERM=tipfeREMOTEUSER=rjnREMOTEHOST=ciscovpn249HOME=/home/rjnUSER=rjnSHELL=/bin/tcshPATH=/usr/libexec/perf-core:/home/rjn/gnu-cobol-4.0/bin:.:/u/tipsrc/bin64:/u/tipsrc/bin:/usr/local/bin64:/u/tipsrc/scripts:/usr/local/BerkeleyDB.6.2/bin:/opt/mssql-tools/bin:/usr/bin:/usr/bin:/home/rjn/bin:/u/tipsrc/bin:/u/tipsrc/scripts:/home/rjn/gnu-cobol-2.0/bin:/usr/local/bin:/usr/share/libtool:/bin:/usr/bin:/sbin:/usr/sbin:/home/projects/hud/bin:/home/projects/hud/ecl:/usr/local/easysoft/sqlserver/bin:/home/oracle/product/12.1/bin:/home/oracle/product/12.1/binMAIL=/var/spool/mail/rjnLOGNAME=rjnXDG_SESSION_ID=182991XDG_RUNTIME_DIR=/run/user/201HOSTTYPE=x86_64-linuxVENDOR=unknownOSTYPE=linuxMACHTYPE=x86_64SHLVL=1PWD=/home/rjnGROUP=inglenetHOST=centos7HOSTNAME=centos7LS_COLORS=CVS_RSH=sshKDEDIRS=/usrQT_PLUGIN_PATH=/usr/lib64/kde4/plugins:/usr/lib/kde4/pluginsLANG=en_CA.UTF-8LESSOPEN=||/usr/bin/lesspipe.sh %sPERL_HOMEDIR=1PERL_LOCAL_LIB_ROOT=/home/rjn/perl5PERL_MB_OPT=--install_base /home/rjn/perl5PERL_MM_OPT=INSTALL_BASE=/home/rjn/perl5PERL5LIB=/home/rjn/perl5/lib/perl5QT_GRAPHICSSYSTEM_CHECKED=1QTDIR=/usr/lib64/qt-3.3QTINC=/usr/lib64/qt-3.3/includeQTLIB=/usr/lib64/qt-3.3/libCOBOL=cobTARGET_OS=CENTOS7REDHAT=-DREDHAT=7 -DINTUNSETENV -DORACLE12LINUXCOB=cobCOBDIR=/opt/microfocus/cobolDEVSRC=/u/tipsrcIMG=/u/ARCSRC/IMAGES/2.3STAGE=/home/stagePROSPECTS=/home/prospectsPROJECTS=/home/projectsCURPROJ=hudTIPSITE=/home/projects/hudTIPHOMEDATA=/home/projects/hud/dataKENWTRDATA=/home/projects/ken/dataPROJPATH=/home/projects/hud/bin:/home/projects/hud/eclPROJLIB=/home/projects/hud/libTIPSRC=/u/tipsrcTIPROOT=/u/tipsrcTIPDMS=/home/rjn/dmsTIPDMSLOG=aqkt,9MTIPIXDMS=/home/rjn/dms.logOUTDIR=/home/rjn/junkCOBCPY=/u/tipsrc/include:/home/projects/hud/cpyGCBRANCH=trunkGCTARGET=gnu-cobol-4.0GCDIR=/home/rjn/gnu-cobol-4.0GCTOOLS=/home/rjn/gnucontrib/trunk/toolsBDB=/usr/local/BerkeleyDB.6.2RCDIR=/home/rjn/gnu-cobol-2.0rcTIPBIN=/u/tipsrc/binMANPATH=/usr/man:/usr/local/man:/usr/X11R6/man:/usr/share/man:/usr/local/share/manDMSSCH_DSN=mytestFCSRDMS_DSN=mytestKENDBI_DSN=mytestCOB_NO_ASM=noCOB_SCHEMA_DSN=mytestMSTOOLS=/opt/mssql-tools/binTIPTERM=N000DMSSCH_UID=systemDMSSCH_PWD=MustTrust1DMSSCH_SID=orclORACLE_TERM=vt100ORACLE_HOME=/home/oracle/product/12.1ORACLE_CLIENT=/home/oracle/product/12.1/libORACLE_SID=orclORACLE_UID=systemORACLE_PWD=MustTrust1RDMSUSER=systemRDMSPWD=MustTrust1ODBCPATH=/usr/local/easysoft/unixODBC/binODBCLIB=/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/libOPATH=.:/u/tipsrc/bin64:/u/tipsrc/bin:/usr/local/bin64:/u/tipsrc/scripts:/usr/local/BerkeleyDB.6.2/bin:/opt/mssql-tools/bin:/usr/bin:/usr/bin:/home/rjn/bin:/u/tipsrc/bin:/u/tipsrc/scripts:/home/rjn/gnu-cobol-2.0/bin:/usr/local/bin:/usr/share/libtool:/bin:/usr/bin:/sbin:/usr/sbin:/home/projects/hud/bin:/home/projects/hud/ecl:/usr/local/easysoft/sqlserver/bin:/home/oracle/product/12.1/bin:/home/oracle/product/12.1/binTIPRPGLPP=41TIPRPGSTARTREAD=YLD_LIBRARY_PATH=/usr/local/BerkeleyDB.6.2/lib:/usr/lib64:/usr/local/lib64:/u/tipsrc/lib64:/u/tipsrc/lib:/home/oracle/product/12.1/lib:/usr/lib64:/usr/lib:/usr/local/lib:/home/projects/hud/libTARGET_MODE=64COB_LDFLAGS=-m64TARGET_BITS=64GCHOME=/home/rjnGCBASE=/home/rjn/gnucobol/trunkGCOPTS=--includedir=/usr/local --oldincludedir=/usr/l  hnn&@` _U1(/usr/lib64/libc-2.17.sonns  `nnP`PQ #-/usr/bin/truennZs  hnn' _U1(/usr/lib64/ld-2.17.sonn#s 0nnnnT+s nn<-s 0nnnnyAs nnwBs DHNDNDNDODXO`ODODOOXHQRR\HS$lTx@centos7@3.10.0-123.6.3.el7.x86_64@3.10.0-514.2.2.el7.x86_64.debug@x86_64@Intel(R) Xeon(R) CPU X3430 @ 2.40GHz@GenuineIntel,6,30,5,@/usr/bin/perf@record@--call-graph@dwarf,8192@truepp/7 @cpu-clock@0-1@0@18/؏@0-1@cpu@software@tracepoint@breakpoint@@@Data@32K@0-1@@Instruction@32K@0-1@@Unified@256K@0-1@ @Unified@8192K@0-1KDAB-hotspot-41e5de7/tests/integrationtests/file_content/perf.data.true.v2.gz000066400000000000000000000103171515036260400272700ustar00rootroot00000000000000 Deperf.data.true.v2\kudW{S+Nc'\]&\rĥŗ9\yUYqhəp6E QS>62`kMNiJ#4- $z3l{oc9s93CnA(Kghe~p>e __"{K[ޢ'ZG}*p~Y?RukaleҎ%r~y5K|C4O"P8NB!>Z&yʕbZ|WAtYhE|1p,rvQ9 ~QM1UKWz QחTAo7vS?q+|z?;G{T5i~JfMvaAʺca`ɖʯ6K*>+=9D" ~p>za ^dsݰu WԪ$덆a˻e!Cwmr 5>ƃbjx(|;㔡kޓςkX9c?8v?99a)N+pu~l5592…8m=~q=xaU$$Oo_z~W`tP{f]|8mR k=#Z=0[ K"KVmRC=c~NC̛o+u?U-iY&>#n8!̗vMZ,zZx >gގ奦e)4>޿yjCV['CTQG5V'IUۊ]^BW{v&qq|a'0s"7(.FOI|`rף>#~Mzsj\3zmdD6US97 $ߙLiP2<}v[g0ʾDv(TP:[S>#^e?_㦷|ms-&oef`\~yeև3>G<#S&[ix3>\EG ?#.#>οNx.VɃ2pn>=xMlO< H~ɱde!4f#dml׃C>]zg^Aso`Χ1m| |7GS~( s/9"ْk=æGNE& @=F[^;^@TY^p;u3/tRN$su65o9$(m*tӇO-xR^]FY[oo%˿&qq!K-}E}9pݴA%: 6Iv96$fg˽ ,ڹ˧.z!{_x[ޣl`NWtMs.7K/8=S_k/ޚ 8o9v/.?政֦Ǐ"zySvsw㺴9آm"!Kwo;sS>H||=VQxZ.79^~BVQNV,tC=wck~w&]'\3}|}KrK^^כN0Ŝ\}Q>g8_|׽ף]Vr=>Ackh@gɻ5)}.n|Y&gU}.~~o}+z./&_Pd|pct^}r0ƅIyǿDkr8؇~eO}^:ki:~}tk=-_W O< I@_{|@~Һ[?Y|bW@]a}@~?c_qQ? {1rOGC? ^z8w@/3nwl_;S+b}?+Fo \SvN);e씝SvBb6fFUB6_D3jPϋZjh#|>+Px<5\2} [5/ؓUeMyhr~Yk% GCG&Lק&.]ݖlm9)RW֓sP oXֹzզ>iH2tQf䖘VZTfG;8[amI S?ȶךG"םܔnUGssUqL7r\_i6"{l<yD3|։d\Y>_L$Qt>'Lȑi-.J %o65$,*pJ' \Ndkj+~^C+ŋ)$XBȕ4^8}Nd:WZȉBIȝ@|1(I-B !8 U6.7-h.)XZ\:µx1t6D>b:D_VB1/DI6e{tw%+v6WJtIuozE#^{t] KE!+F`VԢnempu%r4:[YaVȩVCG%50Tח5VY0J& 'یIyD6ֹTb%c(.S jT1WBnV|>#e]MI]n.Ɍ#LqŞLPL*KbaeWiU#TJPV#-&楤5mŲcQ Vr.lAry).fcNj;dEДG4#yI.3!P$AV;lӲK&VMdtKЪAőx96*I#W{1o!+tȊuH2'CIdMM]II"!=32 g'iN,2Bl2cONr$Ih:Vm8:f L>Bzu[_@wXTt cXfd85Aj !uhD-ɳc/(ȺY4?`zp,ohezh&r$zrna2@5PTA[6)l><Jc4Ieg~|ZF80-#bk5dڷml-oMC;3L2<=\{~ #Lc"z|׶f!"۪3i'|mASrAӈirƨs tJLun /WKDAB-hotspot-41e5de7/tests/integrationtests/file_content/true.perfparser000066400000000000000000000064441515036260400266360ustar00rootroot00000000000000QPERFSTREAM cpu-clock mcentos73.10.0-123.6.3.el7.x86_643.10.0-514.2.2.el7.x86_64.debugx86_64$Intel(R) Xeon(R) CPU X3430 @ 2.40GHzGenuineIntel,6,30,5, /usr/bin/perfrecord --call-graph dwarf,8192true0-101/80-1cpusoftware tracepoint breakpoint ? ?Z ? ?Q ?*H` ?P ?6@ ? ?q` ? ?w` ?Y` ?ٱ ?“ ?j @ ? k` ?^@ ? ?Ug@ ?*H` ?@ ? ?͑@ ?K% ?q ?@ ?X ?6@ ?Ү ?ӄ@ ?@ ?o[ ?? ?շ ?֢ ?} ?Հ ?AN ?Z ?ِ8 ?mD ? ?ɓ ?;r ?% ?ݞt ?S perf true ?޷ ?Q@ ?M@ ?M ? ? ?>+ ?U1 ? ? ?v ?` ? ?nnnn sݢ\Could not find ELF file for . This can break stack unwinding and lead to missing symbols.Could not find ELF file for . This can break stack unwinding and lead to missing symbols.Could not find ELF file for . This can break stack unwinding and lead to missing symbols.Could not find ELF file for . This can break stack unwinding and lead to missing symbols.Could not find ELF file for . This can break stack unwinding and lead to missing symbols.Could not find ELF file for . This can break stack unwinding and lead to missing symbols.Could not find ELF file for . This can break stack unwinding and lead to missing symbols. ld-2.17.so 64/ld-2.17.so-$/home/simon/centos7/lib64/ld-2.17.so)&WPn_dl_relocate_object&P)&bn¤)&ndl_main&0W)&בn7)& n_dl_load_cache_lookup&k)&5nn56 nn sАnn s-<nn sBwKDAB-hotspot-41e5de7/tests/integrationtests/file_content/true.perfparser.xz000066400000000000000000000017741515036260400272770ustar00rootroot000000000000007zXZִF!t/ #](F[Z \u(2:l f=@ZjjǣC`H (,W!˒-QB43`Og/I ḻAҬ9!;Jv;-XE$ (u7q 4pcg~RD*L"#b0;Ԇoo )8T%{Ε@ Sڠ 4:w5b^0C^~kdxzhVvl{-/j6^DgIgS]mjǔD-x=OOyH xYIBL=' Gj"H>PqS1_ !"ŻU@si2 ~,ӀPF&gDw zfaf1~GŸ=!άd3tfa&d?9Ʋk]vFn|L*]_NN$r5m%$-[=[QGpn- \."([yF: 1?/z 8HWL̘>J@_8n"鯅eg}y-b2CDXwº |5BG z_H!þaS9*PTrc꜔ e8JRJWr\iXV|jZ<'_ {%!d3\iɆ}yˎ"z=+ :SM<9ʋ;sF#sJ̯9&U¦(4uˁ\lmf2WE9Ce)Þ<V $@1RQF3+F ʋQ! P>V Q1VIRe8#Re8#Re8# QL@QxQ@mPI}Q8$@/Q@mPxQ1QPP@mP'ŋQPνPV@V@mP6QL@ Q@QxQ1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! p!.ג}!}!۷5eh`L` 8`.גk#p4Y`1RQ >V $@1RQF3+F ʋQ! P>V Q1VIRe8#Re8#Re8# QL@QxQ@mPI}Q8$@/Q@mPxQ1QPP@mP'ŋQPνPV@V@mP6QL@ Q@QxQ1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! p!.ג}!}!5eh`O`Z`.גk#p4Y`1RQ >V $@1RQF3+F ʋQ! P>V Q1VIRe8#Re8#Re8# QL@QxQ@mPI}Q8$@/Q@mPxQ1QPP@mP'ŋQPνPV@V@mP6QL@ Q@QxQ1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! p!.ג}!}!B5eh`;3#`{}`.גk#p4Y`1RQ >V $@1RQF3+F ʋQ! P>V Q1VIRe8#Re8#Re8# QL@QxQ@mPI}Q8$@/Q@mPxQ1QPP@mP'ŋQPνPV@V@mP6QL@ Q@QxQ1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! !E}!}!345eh`#Yd`` EY;q3i#p4Y`1RQ >V $@1RQF3+F ʋQ! P>V Q1VIRe8#Re8#Re8# QL@QxQ@mPI}Q8$@/Q@mPxQ1QPP@mP'ŋQPνPV@V@mP6QL@ Q@QxQ1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! 8!^Q}!}!,5eh`ԼH%`.`PxQ{V0$@P$@^QF3+{VpQ`JPP`$@ hQQ@ P7PQPL@PpQ QxQ&PP]YQ$bV7PPxQQ)QxQQxQ#L~Q̢QQPQvP?PPV`:Q$@@WP07QQQPSKQGP@ PP QPiPUuKQ QQȔQ`}V$@Ad oC.AQxQ`yVSKQ QL@xQ QxQ?QĉQ AQ0AQЈ$@?Q-AQ VxQՓQQlQ-AQ@;QP^QP^Q V-AQL@P-AQ VxQ-AQßQ V-AQ-AQxQ3Q-AQcQV<7QVMV#njQ`$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 !8!}!!}!5eh}!}!5eh`8!}!!}!^>eh}!}![>eh`8}!u!}!u!&/hoh}!}!c#/hoh` !X}!}!dF5eh`^"`m` X EY;q3i#p4Y`1RQ =V $@1RQF3+F ʋQ! @{P=V Q1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! !X}!}!d5eh`h`=A` X EY;q3i#p4Y`1RQ =V $@1RQF3+F ʋQ! @{P=V Q1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! !X}!}!u5eh` `h` X EY;q3i#p4Y`1RQ =V $@1RQF3+F ʋQ! @{P=V Q1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! !X}!}!95eh`ڽ0`ێ` X EY;q3i#p4Y`1RQ =V $@1RQF3+F ʋQ! @{P=V Q1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 ! 8!tQ}!}! 5eh`Ž`P` $@$@tQ3+F@{P=V Q1P Q@EP}Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 !8!}!!}!5eh}!}!5eh` x!L}!}!o$0eh`y``L8ؒk#p4Y`1u( :6(61u( :F3+F ĶU66LUU6`UP6UDGBdv709rrp7ϬU9p7UU/t|Z :ќUUPMP7Z :UpUPM7Z :AUUPM7Z :qU0UPM8Z :QUUPMP8Z :ᑊUUPM8Z :UUUUU񍊩UUPM9Z :!UUPMP9Z :QUUPM9Z :!UUPM9Z :QUUPM:Z :U PUPMP:Z :၊U UPM:Z :1U UPM:Z :~U @~UPM;Z :|U|UPMP;Z :q{U ˷UU!UZ :0=0<BdPMUR巧U asenameUpU˷UjU!UU0=<BdjUR巧U ameUpUUd?S" :d?S" :UQU0U`UԷUR巧U@>US" :??S" :?S" :`UQUxUU5 :U@>UU " :PUUUU0U+U0UkUBdiUUMUkUUUpEUU`UpoUUTU/UpEU0UUoUUpUpEU0UpEUUUpUUpUpEU2UjUPUpUjUBd@>UEUpEUg୧U@>U:U4>U`US" :S" :Bd;UUBdUݷU`UUHUUVUU0I`UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j;jOjjjjjjk&kFkUkvkkkkk ll,l=lUlflllllll+m3mEmPmammmmm=n$o2ohooooo!@3d@@U8 ? : 0uU   yUoU Bd$ѥ/Xx86_64 ! x!L}!}!`$0eh``:`L8ؒk#p4Y`1u( :6(61u( :F3+F ĶU66LUU6`UP6UDGBdv709rrp7ϬU9p7UU/t|Z :ќUUPMP7Z :UpUPM7Z :AUUPM7Z :qU0UPM8Z :QUUPMP8Z :ᑊUUPM8Z :UUUUU񍊩UUPM9Z :!UUPMP9Z :QUUPM9Z :!UUPM9Z :QUUPM:Z :U PUPMP:Z :၊U UPM:Z :1U UPM:Z :~U @~UPM;Z :|U|UPMP;Z :q{U ˷UU!UZ :0=0<BdPMUR巧U asenameUpU˷UjU!UU0=<BdjUR巧U ameUpUUd?S" :d?S" :UQU0U`UԷUR巧U@>US" :??S" :?S" :`UQUxUU5 :U@>UU " :PUUUU0U+U0UkUBdiUUMUkUUUpEUU`UpoUUTU/UpEU0UUoUUpUpEU0UpEUUUpUUpUpEU2UjUPUpUjUBd@>UEUpEUg୧U@>U:U4>U`US" :S" :Bd;UUBdUݷU`UUHUUVUU0I`UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j;jOjjjjjjk&kFkUkvkkkkk ll,l=lUlflllllll+m3mEmPmammmmm=n$o2ohooooo!@3d@@U8 ? : 0uU   yUoU Bd$ѥ/Xx86_64 ! x!L}!}!c$0eh`C`^`L8ؒk#p4Y`1u( :6(61u( :F3+F ĶU66LUU6`UP6UDGBdv709rrp7ϬU9p7UU/t|Z :ќUUPMP7Z :UpUPM7Z :AUUPM7Z :qU0UPM8Z :QUUPMP8Z :ᑊUUPM8Z :UUUUU񍊩UUPM9Z :!UUPMP9Z :QUUPM9Z :!UUPM9Z :QUUPM:Z :U PUPMP:Z :၊U UPM:Z :1U UPM:Z :~U @~UPM;Z :|U|UPMP;Z :q{U ˷UU!UZ :0=0<BdPMUR巧U asenameUpU˷UjU!UU0=<BdjUR巧U ameUpUUd?S" :d?S" :UQU0U`UԷUR巧U@>US" :??S" :?S" :`UQUxUU5 :U@>UU " :PUUUU0U+U0UkUBdiUUMUkUUUpEUU`UpoUUTU/UpEU0UUoUUpUpEU0UpEUUUpUUpUpEU2UjUPUpUjUBd@>UEUpEUg୧U@>U:U4>U`US" :S" :Bd;UUBdUݷU`UUHUUVUU0I`UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j;jOjjjjjjk&kFkUkvkkkkk ll,l=lUlflllllll+m3mEmPmammmmm=n$o2ohooooo!@3d@@U8 ? : 0uU   yUoU Bd$ѥ/Xx86_64 ! x!L}!}!$0eh`&7`ʂ`L8ؒk#p4Y`1u( :6(61u( :F3+F ĶU66LUU6`UP6UDGBdv709rrp7ϬU9p7UU/t|Z :ќUUPMP7Z :UpUPM7Z :AUUPM7Z :qU0UPM8Z :QUUPMP8Z :ᑊUUPM8Z :UUUUU񍊩UUPM9Z :!UUPMP9Z :QUUPM9Z :!UUPM9Z :QUUPM:Z :U PUPMP:Z :၊U UPM:Z :1U UPM:Z :~U @~UPM;Z :|U|UPMP;Z :q{U ˷UU!UZ :0=0<BdPMUR巧U asenameUpU˷UjU!UU0=<BdjUR巧U ameUpUUd?S" :d?S" :UQU0U`UԷUR巧U@>US" :??S" :?S" :`UQUxUU5 :U@>UU " :PUUUU0U+U0UkUBdiUUMUkUUUpEUU`UpoUUTU/UpEU0UUoUUpUpEU0UpEUUUpUUpUpEU2UjUPUpUjUBd@>UEUpEUg୧U@>U:U4>U`US" :S" :Bd;UUBdUݷU`UUHUUVUU0I`UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j;jOjjjjjjk&kFkUkvkkkkk ll,l=lUlflllllll+m3mEmPmammmmm=n$o2ohooooo!@3d@@U8 ? : 0uU   yUoU Bd$ѥ/Xx86_64 ! x!L}!}!$%0eh`3yXu``L8ؒk#p4Y`1u( :6(61u( :F3+F ĶU66LUU6`UP6UDGBdv709rrp7ϬU9p7UU/t|Z :ќUUPMP7Z :UpUPM7Z :AUUPM7Z :qU0UPM8Z :QUUPMP8Z :ᑊUUPM8Z :UUUUU񍊩UUPM9Z :!UUPMP9Z :QUUPM9Z :!UUPM9Z :QUUPM:Z :U PUPMP:Z :၊U UPM:Z :1U UPM:Z :~U @~UPM;Z :|U|UPMP;Z :q{U ˷UU!UZ :0=0<BdPMUR巧U asenameUpU˷UjU!UU0=<BdjUR巧U ameUpUUd?S" :d?S" :UQU0U`UԷUR巧U@>US" :??S" :?S" :`UQUxUU5 :U@>UU " :PUUUU0U+U0UkUBdiUUMUkUUUpEUU`UpoUUTU/UpEU0UUoUUpUpEU0UpEUUUpUUpUpEU2UjUPUpUjUBd@>UEUpEUg୧U@>U:U4>U`US" :S" :Bd;UUBdUݷU`UUHUUVUU0I`UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j;jOjjjjjjk&kFkUkvkkkkk ll,l=lUlflllllll+m3mEmPmammmmm=n$o2ohooooo!@3d@@U8 ? : 0uU   yUoU Bd$ѥ/Xx86_64 !8!}!!}!i8*0eh}!}!V6*0eh`8!}!!}!EI0eh}!}!I0eh` x! [}!}!S0eh``U` [גk#p4Y`1u( :P321u( :F3+F ĶUh@UP3P3LUP3`UUCBdU35rr3ϬUqUp53 ԷUR巧U/t|" :4646S" :46S" :@UQUxUS" :??S" :?S" :@UQUxUUUUU@U۶UUX" :ഌU@>US" :5 BdUݷUUpEUVUޭUUUpUUUUౌU HMULMX" :U@>U5 BdpUݷUUEUpEUVUU4>U᭧U˷UௌUUௌU:0UR巧U honUUUS" U@pUBd UUݷUௌUԷU˷UUVUR巧UUjUFU@>UkU%U4>U`UHEU@U/DUX" :U;U5 UBdUpUݷU@UUHUUVUU0I@UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j ! x! [}!}!8?T0eh``Y:` [גk#p4Y`1u( :P321u( :F3+F ĶUh@UP3P3LUP3`UUCBdU35rr3ϬUqUp53 ԷUR巧U/t|" :4646S" :46S" :@UQUxUS" :??S" :?S" :@UQUxUUUUU@U۶UUX" :ഌU@>US" :5 BdUݷUUpEUVUޭUUUpUUUUౌU HMULMX" :U@>U5 BdpUݷUUEUpEUVUU4>U᭧U˷UௌUUௌU:0UR巧U honUUUS" U@pUBd UUݷUௌUԷU˷UUVUR巧UUjUFU@>UkU%U4>U`UHEU@U/DUX" :U;U5 UBdUpUݷU@UUHUUVUU0I@UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j ! x! [}!}!^T0eh`?`^^` [גk#p4Y`1u( :P321u( :F3+F ĶUh@UP3P3LUP3`UUCBdU35rr3ϬUqUp53 ԷUR巧U/t|" :4646S" :46S" :@UQUxUS" :??S" :?S" :@UQUxUUUUU@U۶UUX" :ഌU@>US" :5 BdUݷUUpEUVUޭUUUpUUUUౌU HMULMX" :U@>U5 BdpUݷUUEUpEUVUU4>U᭧U˷UௌUUௌU:0UR巧U honUUUS" U@pUBd UUݷUௌUԷU˷UUVUR巧UUjUFU@>UkU%U4>U`UHEU@U/DUX" :U;U5 UBdUpUݷU@UUHUUVUU0I@UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j ! x! [}!}!O|T0eh`&oO`_` [גk#p4Y`1u( :P321u( :F3+F ĶUh@UP3P3LUP3`UUCBdU35rr3ϬUqUp53 ԷUR巧U/t|" :4646S" :46S" :@UQUxUS" :??S" :?S" :@UQUxUUUUU@U۶UUX" :ഌU@>US" :5 BdUݷUUpEUVUޭUUUpUUUUౌU HMULMX" :U@>U5 BdpUݷUUEUpEUVUU4>U᭧U˷UௌUUௌU:0UR巧U honUUUS" U@pUBd UUݷUௌUԷU˷UUVUR巧UUjUFU@>UkU%U4>U`UHEU@U/DUX" :U;U5 UBdUpUݷU@UUHUUVUU0I@UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j ! x! [}!}!T0eh`3X`d` [גk#p4Y`1u( :P321u( :F3+F ĶUh@UP3P3LUP3`UUCBdU35rr3ϬUqUp53 ԷUR巧U/t|" :4646S" :46S" :@UQUxUS" :??S" :?S" :@UQUxUUUUU@U۶UUX" :ഌU@>US" :5 BdUݷUUpEUVUޭUUUpUUUUౌU HMULMX" :U@>U5 BdpUݷUUEUpEUVUU4>U᭧U˷UௌUUௌU:0UR巧U honUUUS" U@pUBd UUݷUௌUԷU˷UUVUR巧UUjUFU@>UkU%U4>U`UHEU@U/DUX" :U;U5 UBdUpUݷU@UUHUUVUU0I@UU`>UmgUHRRPoU0IU#!/bin/sh # Modern Linux and macOS systems commonly only have a thing called `p@@1BdHRRC :غUм :0RXU@@HRHR_4IKRC :غU_2_20?HRBd :XUغU"C :0uU@RUuU8R; :iiiij j jj)j ! 0}!}!python3}!}!`0eh`  h}!}!//anon}!}!`0eh`  h}!}!"@[stack]}!}!?&a0eh`  x}!}!VP˥q&H/usr/bin/python3.11}!}!Ka0eh` x}!}!V˥q&H/usr/bin/python3.11}!}!3a0eh`  x}!}! V ˥q&H/usr/bin/python3.11}!}!-a0eh`  x}!}!0V ˥q&H/usr/bin/python3.11}!}!1a0eh`  }!}!QP:{E/usr/lib/ld-linux-x86-64.so.2}!}!a0eh` }!}!Q`:{E/usr/lib/ld-linux-x86-64.so.2}!}!2b0eh`  }!}!PQp:{E/usr/lib/ld-linux-x86-64.so.2}!}!/Ib0eh`  }!}!Q@:{E/usr/lib/ld-linux-x86-64.so.2}!}!ab0eh` h}!}!@%@ [vdso]}!}!ͤb0eh`  h}!}!%@@[vvar]}!}!b0eh` !}!}!xc0eh`T`kV` *?Y`$@$@GGrpQ$@$@l Q3+'d @Q$@QQQwQ@V V$@>Q$@ $@Q"QXQHQɩ$@ک$@$@$@$@ $@$@$@,$@>$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64/usr/bin/python3/home/the8472/workspace/rust/x.pytestui--stage1--force-rerunSHELL=/bin/bashWINDOWID=29360131COLORTERM=truecolorXDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0GTK_IM_MODULE=ibusPREFIX=/usrI3SOCK=/run/user/1001/i3/ipc-socket.1397FT2_SUBPIXEL_HINTING=2GRADLE_HOME=/usr/share/java/gradleXMODIFIERS=@im=ibusDESKTOP_SESSION=i3GTK_MODULES=canberra-gtk-moduleXDG_SEAT=seat0PWD=/home/the8472/workspace/rustXDG_SESSION_DESKTOP=i3LOGNAME=the8472XDG_ !  x}!}!Q֙H/etc/ld.so.cache}!}!_d0eh`  h}!}!Q Q//anon}!}!Le0eh`  }!}!`Q\q&H/usr/lib/libpython3.11.so.1.0}!}!ze0eh` }!}!nQ$q&H/usr/lib/libpython3.11.so.1.0}!}!0e0eh`  }!}!ГQ(3q&H/usr/lib/libpython3.11.so.1.0}!}!e0eh`  }!}!QBq&H/usr/lib/libpython3.11.so.1.0}!}!f0eh`  h}!}!Q Q//anon}!}!aNf0eh`  x}!}!AQ :{E/usr/lib/libc.so.6}!}!f0eh` x}!}!@DQ`:{E/usr/lib/libc.so.6}!}!@g0eh`  x}!}!YQ :{E/usr/lib/libc.so.6}!}!fg0eh`  x}!}! _Q`0:{E/usr/lib/libc.so.6}!}!g0eh`  h}!}!_Q_Q//anon}!}!cg0eh`  x}!}!Q#:{E/usr/lib/libm.so.6}!}!/Kh0eh` x}!}!Q#:{E/usr/lib/libm.so.6}!}!kh0eh`  x}!}!Q#:{E/usr/lib/libm.so.6}!}!h0eh`  x}!}!Q #:{E/usr/lib/libm.so.6}!}!"h0eh`  h}!}!Q0Q//anon}!}!bi0eh`  x}!}! _Q@0:{E/usr/lib/libc.so.6}!}!5k0eh`  x}!}!Q#:{E/usr/lib/libm.so.6}!}!k0eh`  }!}!QBq&H/usr/lib/libpython3.11.so.1.0}!}!0eh`  x}!}!0V ˥q&H/usr/bin/python3.11}!}!׭0eh`  }!}!Q :{E/usr/lib/ld-linux-x86-64.so.2}!}!ނ0eh`  h}!}!pVpV[heap]}!}!i0eh`  }!}!Q.ڂ:{E/usr/lib/locale/locale-archive}!}!fJ0eh`  h}!}!pV pV[heap]}!}!>0eh`  h}!}!1Q1Q//anon}!}!䩥0eh`  h}!}!Q@Q//anon}!}!0eh`  h}!}!QQ//anon}!}!0eh`  h}!}!QPQ//anon}!}!0eh`  h}!}!pV0pV[heap]}!}!Ϳ0eh`  h}!}!pV pV[heap]}!}!)1eh`  h}!}!PP//anon}!}!w*1eh`  h}!}!pV pV[heap]}!}!"P1eh`  h}!}!pV pV[heap]}!}!pA1eh`  h}!}!pVpV[heap]}!}!t1eh`  h}!}!pVpV[heap]}!}!1eh`  h}!}!QpQ//anon}!}!|2eh`  h}!}!pVpV[heap]}!}!e 2eh`  h}!}!pVpV[heap]}!}!%12eh`  h}!}!P P//anon}!}!g<2eh`  h}!}!pVpV[heap]}!}!BD2eh`  h}!}!pV pV[heap]}!}!i2eh`  }!}!@QPq&H/usr/lib/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so}!}!pq2eh` }!}!PQq&H/usr/lib/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so}!}!Mq2eh`  }!}!`Q0 q&H/usr/lib/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so}!}!q2eh`  }!}!pQ q&H/usr/lib/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so}!}!q2eh`  }!}!pQ q&H/usr/lib/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so}!}!a#v2eh`  h}!}!QpQ//anon}!}!u2eh`  h}!}!pVppV[heap]}!}!q2eh`  h}!}!pVpV[heap]}!}!/3eh`  h}!}!pVpV[heap]}!}!!3eh`  h}!}!P0P//anon}!}!'13eh`  }!}! Q 8q&H/usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so}!}!93eh` }!}!PQ08q&H/usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so}!}!H93eh`  }!}!Qp8q&H/usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so}!}!e93eh`  }!}! Q 8q&H/usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so}!}!y93eh`  }!}! Q8q&H/usr/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so}!}! ?3eh`  }!}!Q q&H/usr/lib/python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so}!}! F3eh` }!}!QP q&H/usr/lib/python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so}!}!F3eh`  }!}!Q` q&H/usr/lib/python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so}!}!F3eh`  }!}!`Q0 q&H/usr/lib/python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so}!}!NG3eh`  h}!}!pVp&pV[heap]}!}!95eh`  }!}!Pq&H/usr/lib/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so}!}!35eh` }!}!PPq&H/usr/lib/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so}!}!35eh`  }!}!P`q&H/usr/lib/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so}!}!35eh`  }!}!pP q&H/usr/lib/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so}!}!45eh`  }!}!pPq&H/usr/lib/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so}!}!*45eh`  }!}!0P!q&H/usr/lib/python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so}!}!YM5eh` }!}!pP@!q&H/usr/lib/python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so}!}! M5eh`  }!}!P!q&H/usr/lib/python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so}!}!M5eh`  }!}!P P!q&H/usr/lib/python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so}!}!M5eh`  }!}!PP!q&H/usr/lib/python3.11/lib-dynload/_socket.cpython-311-x86_64-linux-gnu.so}!}!\T5eh`  }!}!0P2q&H/usr/lib/python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so}!}!c5eh` }!}!pP`@2q&H/usr/lib/python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so}!}!@c5eh`  }!}!гP`2q&H/usr/lib/python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so}!}!vVc5eh`  }!}!P 2q&H/usr/lib/python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so}!}!ic5eh`  }!}!P2q&H/usr/lib/python3.11/lib-dynload/array.cpython-311-x86_64-linux-gnu.so}!}!-i5eh`8!}!!}!W5eh}!}!V5eh` !}!}!Q3eh```oZZZr´?MY`QQQ@f$@xb$@*Q3+Q PQP@F@FP`SSP`  ``j$@7 DQ QQY_QQe$@Qe$@k$@e$@d$@ЉV̟VKQ̟V`Qiӝ7iEb  7V(j_Qf$@KQi7iEbd$@ɐVɐVJQJJV`j$@@f$@f$@ɐVLQPf$@d$@(g$@PɐV@PQb$@ q qoeC7?Se9ke?l@P@PQɐVfQf$@f$@g$@WPL@ VXQɐV $@@{V@ELF>@h@8 @@F@FPPP``` U Uppp%@&@@$$Std@@PtdQtdRtdppp0GNU GNUblN{ݵ*9k km$@Q@PQIQ($@h$@̟V/Qk$@m$@@PXQl$@-QQQl$@Qm$@l$@H|>QPl$@ k$@m$@i]d~XQl$@-QQi%iEbiOf~(-Q̟V T0#QL@i l$@n$@-PQQo$@m$@QQp$@o$@0l$@m$@@P($@Qm$@Qm$@n$@m$@Qm$@|l$@m$@i]d~($@-QQi}(iEbiOf~1aBj]Qm$@Qp$@Q`Qm$@Q0/WQm$@-Q@P-Q($@h$@L@ Qp$@o$@o$@p$@*QpPiJQh$@L@o$@Qpo$@iJQp$@p$@*Qpo$@|n$@o$@i}/iEbo$@p$@*QpPi},iEbiOf~PE QxQdPXo$@:QxQ)QQ QxQL@0}QP@Po$@Q(0Pp$@o$@L@ QdJQPQUs$@kQRL@Pp$@*QjJQ@PQ-QpPL@@P-QpP_"}QL@@VpP@?QcPہQ5QPyInit__datetimeL@`q$@mPxQpPq$@ Q$Q`r$@L@ r$@# snxQq$@pPq$@Q[88|Jg@PP# snL@ r$@pPpPcPpPPpP CQ0 s$@`r$@L@PVQpPcPQQ Q@PpPr}QL@@P@PVpPPpPL@pP PcPpPP\Q@PcP*Q:QP@:QxQ:QP Q$QL@QxQQPyQP~Q̢QQȚQЦQQxyQsPQt$@|Qt$@@:Q@@QL@VrPVjQ@;Q:Q6Q QI6 }Q:QxQ6QQy$@HQ QV Q QQQL@8QQ6QxQQv$@QQiVv$@6QxQv$@v$@QQB}Q(0w$@v$@ ~QpP0:Q@2QQ QL@nQ:Q6QxQ QQQQ QQQ6Q 0w$@v$@L@Q0PpP0:Q ;QQQr}QJM0P ;QL@xQxQ5'QpPPpPPpPQxQ9Q@;QQPP`+PQxQL@ QQxQXQ Q6V0:Q~Q̢QQPQyVV81VPP^Q0Pj_QpPQKQPy$@@2Qy2Qz$@#QL@oPQ0|$@Pz$@y$@Ad oC+"~Q(-QRϚ;˚;L@L@PQxQ,PĉQy$@L@z$@,PP0VxQcPlQP@;QPP0VL@gQQPP0VB,QDX^SL@HkQ[PHkQQvyQL@xQ:QcPyQ:8QQxQQxQQcP~Q̢QQȖQЦQQxyQ*PQ0|$@ P:Q@R1Q֋0PRQjQ@;Q:Q1@h@8 @@F@FPPP``` U Uppp%@&@@$$Std@@PtdQtdRtdppp0GNU GNUblN{ݵ*9k km$@Q@PQIQ($@h$@̟V/Qk$@m$@@PXQl$@-QQQl$@Qm$@l$@H|>QPl$@ k$@m$@i]d~XQl$@-QQi%iEbiOf~(-Q̟V T0#QL@i l$@n$@-PQQo$@m$@QQp$@o$@0l$@m$@@P($@Qm$@Qm$@n$@m$@Qm$@|l$@m$@i]d~($@-QQi}(iEbiOf~1aBj]Qm$@Qp$@Q`Qm$@Q0/WQm$@-Q@P-Q($@h$@L@ Qp$@o$@o$@p$@*QpPiJQh$@L@o$@Qpo$@iJQp$@p$@*Qpo$@|n$@o$@i}/iEbo$@p$@*QpPi},iEbiOf~PE QxQdPXo$@:QxQ)QQ QxQL@0}QP@Po$@Q(0Pp$@o$@L@ QdJQPQUs$@kQRL@Pp$@*QjJQ@PQ-QpPL@@P-QpP_"}QL@@VpP@?QcPہQ5QPyInit__datetimeL@`q$@mPxQpPq$@ Q$Q`r$@L@ r$@# snxQq$@pPq$@Q[88|Jg@PP# snL@ r$@pPpPcPpPPpP CQ0 s$@`r$@L@PVQpPcPQQ Q@PpPr}QL@@P@PVpPPpPL@pP PcPpPP\Q@PcP*Q:QP@:QxQ:QP Q$QL@QxQQPyQP~Q̢QQȚQЦQQxyQsPQt$@|Qt$@@:Q@@QL@VrPVjQ@;Q:Q6Q QI6 }Q:QxQ6QQy$@HQ QV Q QQQL@8QQ6QxQQv$@QQiVv$@6QxQv$@v$@QQB}Q(0w$@v$@ ~QpP0:Q@2QQ QL@nQ:Q6QxQ QQQQ QQQ6Q 0w$@v$@L@Q0PpP0:Q ;QQQr}QJM0P ;QL@xQxQ5'QpPPpPPpPQxQ9Q@;QQPP`+PQxQL@ QQxQXQ Q6V0:Q~Q̢QQPQyVV81VPP^Q0Pj_QpPQKQPy$@@2Qy2Qz$@#QL@oPQ0|$@Pz$@y$@Ad oC+"~Q(-QRϚ;˚;L@L@PQxQ,PĉQy$@L@z$@,PP0VxQcPlQP@;QPP0VL@gQQPP0VB,QDX^SL@HkQ[PHkQQvyQL@xQ:QcPyQ:8QQxQQxQQcP~Q̢QQȖQЦQQxyQ*PQ0|$@ P:Q@R1Q֋0PRQjQ@;Q:Q1@h@8 @@F@FPPP``` U Uppp%@&@@$$Std@@PtdQtdRtdppp0GNU GNUblN{ݵ*9k km$@Q@PQIQ($@h$@̟V/Qk$@m$@@PXQl$@-QQQl$@Qm$@l$@H|>QPl$@ k$@m$@i]d~XQl$@-QQi%iEbiOf~(-Q̟V T0#QL@i l$@n$@-PQQo$@m$@QQp$@o$@0l$@m$@@P($@Qm$@Qm$@n$@m$@Qm$@|l$@m$@i]d~($@-QQi}(iEbiOf~1aBj]Qm$@Qp$@Q`Qm$@Q0/WQm$@-Q@P-Q($@h$@L@ Qp$@o$@o$@p$@*QpPiJQh$@L@o$@Qpo$@iJQp$@p$@*Qpo$@|n$@o$@i}/iEbo$@p$@*QpPi},iEbiOf~PE QxQdPXo$@:QxQ)QQ QxQL@0}QP@Po$@Q(0Pp$@o$@L@ QdJQPQUs$@kQRL@Pp$@*QjJQ@PQ-QpPL@@P-QpP_"}QL@@VpP@?QcPہQ5QPyInit__datetimeL@`q$@mPxQpPq$@ Q$Q`r$@L@ r$@# snxQq$@pPq$@Q[88|Jg@PP# snL@ r$@pPpPcPpPPpP CQ0 s$@`r$@L@PVQpPcPQQ Q@PpPr}QL@@P@PVpPPpPL@pP PcPpPP\Q@PcP*Q:QP@:QxQ:QP Q$QL@QxQQPyQP~Q̢QQȚQЦQQxyQsPQt$@|Qt$@@:Q@@QL@VrPVjQ@;Q:Q6Q QI6 }Q:QxQ6QQy$@HQ QV Q QQQL@8QQ6QxQQv$@QQiVv$@6QxQv$@v$@QQB}Q(0w$@v$@ ~QpP0:Q@2QQ QL@nQ:Q6QxQ QQQQ QQQ6Q 0w$@v$@L@Q0PpP0:Q ;QQQr}QJM0P ;QL@xQxQ5'QpPPpPPpPQxQ9Q@;QQPP`+PQxQL@ QQxQXQ Q6V0:Q~Q̢QQPQyVV81VPP^Q0Pj_QpPQKQPy$@@2Qy2Qz$@#QL@oPQ0|$@Pz$@y$@Ad oC+"~Q(-QRϚ;˚;L@L@PQxQ,PĉQy$@L@z$@,PP0VxQcPlQP@;QPP0VL@gQQPP0VB,QDX^SL@HkQ[PHkQQvyQL@xQ:QcPyQ:8QQxQQxQQcP~Q̢QQȖQЦQQxyQ*PQ0|$@ P:Q@R1Q֋0PRQjQ@;Q:Q1@h@8 @@F@FPPP``` U Uppp%@&@@$$Std@@PtdQtdRtdppp0GNU GNUblN{ݵ*9k km$@Q@PQIQ($@h$@̟V/Qk$@m$@@PXQl$@-QQQl$@Qm$@l$@H|>QPl$@ k$@m$@i]d~XQl$@-QQi%iEbiOf~(-Q̟V T0#QL@i l$@n$@-PQQo$@m$@QQp$@o$@0l$@m$@@P($@Qm$@Qm$@n$@m$@Qm$@|l$@m$@i]d~($@-QQi}(iEbiOf~1aBj]Qm$@Qp$@Q`Qm$@Q0/WQm$@-Q@P-Q($@h$@L@ Qp$@o$@o$@p$@*QpPiJQh$@L@o$@Qpo$@iJQp$@p$@*Qpo$@|n$@o$@i}/iEbo$@p$@*QpPi},iEbiOf~PE QxQdPXo$@:QxQ)QQ QxQL@0}QP@Po$@Q(0Pp$@o$@L@ QdJQPQUs$@kQRL@Pp$@*QjJQ@PQ-QpPL@@P-QpP_"}QL@@VpP@?QcPہQ5QPyInit__datetimeL@`q$@mPxQpPq$@ Q$Q`r$@L@ r$@# snxQq$@pPq$@Q[88|Jg@PP# snL@ r$@pPpPcPpPPpP CQ0 s$@`r$@L@PVQpPcPQQ Q@PpPr}QL@@P@PVpPPpPL@pP PcPpPP\Q@PcP*Q:QP@:QxQ:QP Q$QL@QxQQPyQP~Q̢QQȚQЦQQxyQsPQt$@|Qt$@@:Q@@QL@VrPVjQ@;Q:Q6Q QI6 }Q:QxQ6QQy$@HQ QV Q QQQL@8QQ6QxQQv$@QQiVv$@6QxQv$@v$@QQB}Q(0w$@v$@ ~QpP0:Q@2QQ QL@nQ:Q6QxQ QQQQ QQQ6Q 0w$@v$@L@Q0PpP0:Q ;QQQr}QJM0P ;QL@xQxQ5'QpPPpPPpPQxQ9Q@;QQPP`+PQxQL@ QQxQXQ Q6V0:Q~Q̢QQPQyVV81VPP^Q0Pj_QpPQKQPy$@@2Qy2Qz$@#QL@oPQ0|$@Pz$@y$@Ad oC+"~Q(-QRϚ;˚;L@L@PQxQ,PĉQy$@L@z$@,PP0VxQcPlQP@;QPP0VL@gQQPP0VB,QDX^SL@HkQ[PHkQQvyQL@xQ:QcPyQ:8QQxQQxQQcP~Q̢QQȖQЦQQxyQ*PQ0|$@ P:Q@R1Q֋0PRQjQ@;Q:Q1@h@8 @@F@FPPP``` U Uppp%@&@@$$Std@@PtdQtdRtdppp0GNU GNUblN{ݵ*9k km$@Q@PQIQ($@h$@̟V/Qk$@m$@@PXQl$@-QQQl$@Qm$@l$@H|>QPl$@ k$@m$@i]d~XQl$@-QQi%iEbiOf~(-Q̟V T0#QL@i l$@n$@-PQQo$@m$@QQp$@o$@0l$@m$@@P($@Qm$@Qm$@n$@m$@Qm$@|l$@m$@i]d~($@-QQi}(iEbiOf~1aBj]Qm$@Qp$@Q`Qm$@Q0/WQm$@-Q@P-Q($@h$@L@ Qp$@o$@o$@p$@*QpPiJQh$@L@o$@Qpo$@iJQp$@p$@*Qpo$@|n$@o$@i}/iEbo$@p$@*QpPi},iEbiOf~PE QxQdPXo$@:QxQ)QQ QxQL@0}QP@Po$@Q(0Pp$@o$@L@ QdJQPQUs$@kQRL@Pp$@*QjJQ@PQ-QpPL@@P-QpP_"}QL@@VpP@?QcPہQ5QPyInit__datetimeL@`q$@mPxQpPq$@ Q$Q`r$@L@ r$@# snxQq$@pPq$@Q[88|Jg@PP# snL@ r$@pPpPcPpPPpP CQ0 s$@`r$@L@PVQpPcPQQ Q@PpPr}QL@@P@PVpPPpPL@pP PcPpPP\Q@PcP*Q:QP@:QxQ:QP Q$QL@QxQQPyQP~Q̢QQȚQЦQQxyQsPQt$@|Qt$@@:Q@@QL@VrPVjQ@;Q:Q6Q QI6 }Q:QxQ6QQy$@HQ QV Q QQQL@8QQ6QxQQv$@QQiVv$@6QxQv$@v$@QQB}Q(0w$@v$@ ~QpP0:Q@2QQ QL@nQ:Q6QxQ QQQQ QQQ6Q 0w$@v$@L@Q0PpP0:Q ;QQQr}QJM0P ;QL@xQxQ5'QpPPpPPpPQxQ9Q@;QQPP`+PQxQL@ QQxQXQ Q6V0:Q~Q̢QQPQyVV81VPP^Q0Pj_QpPQKQPy$@@2Qy2Qz$@#QL@oPQ0|$@Pz$@y$@Ad oC+"~Q(-QRϚ;˚;L@L@PQxQ,PĉQy$@L@z$@,PP0VxQcPlQP@;QPP0VL@gQQPP0VB,QDX^SL@HkQ[PHkQQvyQL@xQ:QcPyQ:8QQxQQxQQcP~Q̢QQȖQЦQQxyQ*PQ0|$@ P:Q@R1Q֋0PRQjQ@;Q:Q1$@R$@$@$@$@Ԫ$@$@$@"$@5$@U$@d$@$@$@$@$@$@$@($@;$@L$@d$@u$@$@Ȭ$@߬$@$@$@ $@:$@B$@T$@_$@p$@$@$@$@ҭ$@L$@3$@A$@w$@$@$@!@%@3d@V8 Q V   Y$@$@i$@ mL@nbOx86_64 !  }!}!Qq&H/usr/lib/python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so}!}!fc3eh` }!}!QP@q&H/usr/lib/python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so}!}!d3eh`  }!}!@Q`q&H/usr/lib/python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so}!}!Rd3eh`  }!}!Q q&H/usr/lib/python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so}!}!yd3eh`  x}!}!P֙H/etc/ld.so.cache}!}!K e3eh`  x}!}!`POJsF/usr/lib/libcrypto.so.3}!}!e3eh` x}!}!kP1 JsF/usr/lib/libcrypto.so.3}!}!zf3eh`  x}!}!P@<JsF/usr/lib/libcrypto.so.3}!}!Ff3eh`  x}!}!PIJsF/usr/lib/libcrypto.so.3}!}!zf3eh`  h}!}!P0P//anon}!}!qf3eh`  x}!}!PIJsF/usr/lib/libcrypto.so.3}!}!N9o3eh`  }!}!Qq&H/usr/lib/python3.11/lib-dynload/_hashlib.cpython-311-x86_64-linux-gnu.so}!}!o3eh`  }!}!Qq&H/usr/lib/python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so}!}!,83eh` }!}!Qp q&H/usr/lib/python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so}!}!3eh`  }!}!pQ@q&H/usr/lib/python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so}!}!ˏ3eh`  }!}!Q q&H/usr/lib/python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so}!}!*3eh`  }!}!Qq&H/usr/lib/python3.11/lib-dynload/_blake2.cpython-311-x86_64-linux-gnu.so}!}!P3eh`  h}!}!pV@pV[heap]}!}!13eh`  }!}! Qq&H/usr/lib/python3.11/lib-dynload/_json.cpython-311-x86_64-linux-gnu.so}!}!B43eh` }!}!@Q` q&H/usr/lib/python3.11/lib-dynload/_json.cpython-311-x86_64-linux-gnu.so}!}!93eh`  }!}!Q@q&H/usr/lib/python3.11/lib-dynload/_json.cpython-311-x86_64-linux-gnu.so}!}!eį3eh`  }!}!Q q&H/usr/lib/python3.11/lib-dynload/_json.cpython-311-x86_64-linux-gnu.so}!}!3eh`  }!}!Qq&H/usr/lib/python3.11/lib-dynload/_json.cpython-311-x86_64-linux-gnu.so}!}!3eh`  }!}!01QFq&H/usr/lib/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so}!}!2#3eh` }!}!P1Q@ Fq&H/usr/lib/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so}!}!X3eh`  }!}!1QP`Fq&H/usr/lib/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so}!}! m3eh`  }!}!1Q Fq&H/usr/lib/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so}!}!$3eh`  x}!}!P֙H/etc/ld.so.cache}!}!3eh`  x}!}!/Q JsF/usr/lib/libz.so.1.3}!}!>3eh` x}!}!/Q0 JsF/usr/lib/libz.so.1.3}!}!r3eh`  x}!}!0Q JsF/usr/lib/libz.so.1.3}!}!X3eh`  x}!}!1Q p JsF/usr/lib/libz.so.1.3}!}!Y3eh`  x}!}!1Qp JsF/usr/lib/libz.so.1.3}!}!3eh`  }!}!1QFq&H/usr/lib/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so}!}!3eh`  }!}!/Qq&H/usr/lib/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so}!}!3eh` }!}!0/Q q&H/usr/lib/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so}!}!3eh`  }!}!P/Q@@q&H/usr/lib/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so}!}!&3eh`  }!}!p/Q Pq&H/usr/lib/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so}!}! 3eh`  x}!}!P֙H/etc/ld.so.cache}!}!X3eh`  }!}!P02*<^9/usr/lib/libbz2.so.1.0.8}!}!3eh` }!}!P 2*<^9/usr/lib/libbz2.so.1.0.8}!}!3eh`  }!}!P@2*<^9/usr/lib/libbz2.so.1.0.8}!}!y3eh`  }!}!P 2*<^9/usr/lib/libbz2.so.1.0.8}!}!3eh`  }!}!P2*<^9/usr/lib/libbz2.so.1.0.8}!}!b3eh`  }!}!p/QPq&H/usr/lib/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so}!}!3eh`  }!}!@Pq&H/usr/lib/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so}!}!14eh` }!}!pP@0q&H/usr/lib/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so}!}!4eh`  }!}!PPpq&H/usr/lib/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so}!}!_4eh`  }!}!P q&H/usr/lib/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so}!}!^4eh`  x}!}!P֙H/etc/ld.so.cache}!}!A4eh`  }!}!P0NPG/usr/lib/liblzma.so.5.4.5}!}!4eh` }!}!PP@NPG/usr/lib/liblzma.so.5.4.5}!}!4eh`  }!}!`PPNPG/usr/lib/liblzma.so.5.4.5}!}!l4eh`  }!}! P NPG/usr/lib/liblzma.so.5.4.5}!}!J4eh`  }!}! PNPG/usr/lib/liblzma.so.5.4.5}!}!y4eh`  }!}!Pq&H/usr/lib/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so}!}!Q4eh`  h}!}!pV` pV[heap]}!}!:| 4eh`  }!}!pPp6q&H/usr/lib/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so}!}!S4eh` }!}!P 6q&H/usr/lib/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so}!}!`S4eh`  }!}!P@06q&H/usr/lib/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so}!}!2S4eh`  }!}!P @6q&H/usr/lib/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so}!}!S4eh`  }!}!P@6q&H/usr/lib/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so}!}!c&W4eh`  }!}!Ppq&H/usr/lib/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so}!}!+Z4eh` }!}! P q&H/usr/lib/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so}!}!5Z4eh`  }!}!@P0@q&H/usr/lib/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so}!}!HZ4eh`  }!}!PP @q&H/usr/lib/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so}!}! \Z4eh`  }!}!PP@q&H/usr/lib/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so}!}!}Z4eh`  }!}!pP?q&H/usr/lib/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so}!}![4eh` }!}!P0 ?q&H/usr/lib/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so}!}!\4eh`  }!}!P@P?q&H/usr/lib/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so}!}!10\4eh`  }!}!P p?q&H/usr/lib/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so}!}!C\4eh`  }!}!Pp?q&H/usr/lib/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so}!}!\4eh`  h}!}!pV#pV[heap]}!}!lm4eh`  }!}!P%q&H/usr/lib/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so}!}!4eh` }!}!PP0%q&H/usr/lib/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so}!}!4eh`  }!}!P`%q&H/usr/lib/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so}!}!:4eh`  }!}!PP %q&H/usr/lib/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so}!}!= 4eh`  }!}!PP%q&H/usr/lib/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so}!}!/4eh`  }!}!Q`7q&H/usr/lib/python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so}!}!Β4eh` }!}!Q 7q&H/usr/lib/python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so}!}!bȳ4eh`  }!}!Q007q&H/usr/lib/python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so}!}!۳4eh`  }!}!Q 07q&H/usr/lib/python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so}!}!4eh`  }!}!Q07q&H/usr/lib/python3.11/lib-dynload/grp.cpython-311-x86_64-linux-gnu.so}!}!Q4eh`  h}!}!PP//anon}!}!Nt4eh`  }!}!.QPq&H/usr/lib/python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so}!}!]]4eh` }!}!.Qq&H/usr/lib/python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so}!}!b4eh`  }!}!.Q0 q&H/usr/lib/python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so}!}!ޫ4eh`  }!}!.Q q&H/usr/lib/python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so}!}!4eh`  }!}!.Q q&H/usr/lib/python3.11/lib-dynload/_bisect.cpython-311-x86_64-linux-gnu.so}!}! 4eh`  }!}! Ppq&H/usr/lib/python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so}!}!$4eh` }!}!@P q&H/usr/lib/python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so}!}!N4eh`  }!}!`P0@q&H/usr/lib/python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so}!}!Nc4eh`  }!}!pP @q&H/usr/lib/python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so}!}!v4eh`  }!}!pP@q&H/usr/lib/python3.11/lib-dynload/_random.cpython-311-x86_64-linux-gnu.so}!}!4eh`  }!}!P q&H/usr/lib/python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so}!}!4eh` }!}!P@  q&H/usr/lib/python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so}!}!_54eh`  }!}!P0` q&H/usr/lib/python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so}!}!jG4eh`  }!}!P ` q&H/usr/lib/python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so}!}!Y4eh`  }!}!P` q&H/usr/lib/python3.11/lib-dynload/_sha512.cpython-311-x86_64-linux-gnu.so}!}!;r4eh` !*?}!}!!`'/eh`?`` *?aLɍ=TWp4Y`/HUl l|l8|l/3+|l't"2 ! !*?}!}!''/eh`:`^B` *?aLɍ=TWp4Y`/HUl l|l8|l/3+|l't"2 ! !*?}!}!'/eh`<`l` *?aLɍ=TWp4Y`/HUl l|l8|l/3+|l't"2 ! !*?}!}!'/eh`]`Ȗ` *?aLɍ=TWp4Y`/HUl l|l8|l/3+|l't"2 ! !*?}!}!(/eh`*` ` *?aLɍ=TWp4Y`/HUl l|l8|l/3+|l't"2 ! 0}!}!x}!}!4Q(/eh`  h}!}!//anon}!}!Lz(/eh`  h}!}!`[stack]}!}!δ(/eh`  p}!}!@Uzq&H/usr/bin/bash}!}!(/eh` p}!}!PUp zq&H/usr/bin/bash}!}!;")/eh`  p}!}!U zq&H/usr/bin/bash}!}!:)/eh`  p}!}!кUpzq&H/usr/bin/bash}!}!mQ)/eh`  h}!}!@U@U//anon}!}!d)/eh`  }!}!? :P:{E/usr/lib/ld-linux-x86-64.so.2}!}!Į)/eh` }!}!? :`:{E/usr/lib/ld-linux-x86-64.so.2}!}!)/eh`  }!}!PB :p:{E/usr/lib/ld-linux-x86-64.so.2}!}!_*/eh`  }!}!B :@:{E/usr/lib/ld-linux-x86-64.so.2}!}!A"*/eh` h}!}!@ [vdso]}!}!j*/eh`  h}!}!@[vvar]}!}!E*/eh`  x}!}!; :֙H/etc/ld.so.cache}!}!,/eh`  h}!}!; : ; ://anon}!}!U--/eh`  }!}!`6 :pzq&H/usr/lib/libreadline.so.8.2}!}!^-/eh` }!}!7 :pzq&H/usr/lib/libreadline.so.8.2}!}!-/eh`  }!}!: :@0zq&H/usr/lib/libreadline.so.8.2}!}!(./eh`  }!}!0; :zq&H/usr/lib/libreadline.so.8.2}!}!hZ./eh`  h}!}!; :0; ://anon}!}!./eh`  x}!}!@ : :{E/usr/lib/libc.so.6}!}!K//eh` x}!}! :`:{E/usr/lib/libc.so.6}!}!&//eh`  x}!}!@0 : :{E/usr/lib/libc.so.6}!}!//eh`  x}!}!5 :`0:{E/usr/lib/libc.so.6}!}! 0/eh`  h}!}!5 :5 ://anon}!}!C?0/eh` p!>q}!}!`0/eh`μ,` `>qs!p4Y`A :@HDCxCA :F3+'DF 3@ :'D6C 7 :C :; :; :-i@ :@D&C :"C :&C :ELF>@`f@8 @UU```i4i4tsts   DpL P P P@@$$Std@@PtdrrrQtdRtd   p?p?0GNU GNUOF?p*Ky<u@ j(@'1!8 :i0&BA<LJN 7 :; :@ :H; :? :I@ :JI@ :I HH; : 7 :; :t"C :"C :@?@ :H; :N 7 :H; :u @ :U ; :u @ :U; :Iu @ :"C : I I@IPJ I"C :IPJ6 :; :6 : 7 : ; :PJq@ :C(C :S0hAAv@ :C(C :8M4M|B : O= NN(C :vA :PM-hwcaps/wA :PMrA :mB : :O.C :N5uA :B : B : N.C :.C ::|B :ONON"C :@QPA :i(C :C :#ȗW"C : O7ua@@(B@@ @@@@@@@@@@@@@@@@@@WPC :? :FA :P@@1@A :C :? :? :0RӌA :@@U 0uUR>A :Q@R? :"C :X? :HA :iiiij j jj)j;jOjjjjjjk&kFkUkvkkkkk ll,l=lUlflllllll+m3mEmPmammmmm=n$o2ohooooo!@3d@@U8 ? : 0uU   yUoU Bd$ѥ/Xx86_64 !  }!}! :p@/usr/lib/libncursesw.so.6.4}!}!1/eh` }!}!0 :@`@/usr/lib/libncursesw.so.6.4}!}!H1/eh`  }!}!p :@/usr/lib/libncursesw.so.6.4}!}!;1/eh`  }!}! :P @/usr/lib/libncursesw.so.6.4}!}!ǩ1/eh`  h}!}! :0 ://anon}!}!7@2/eh`  x}!}!5 :@0:{E/usr/lib/libc.so.6}!}!3/eh`  }!}! :@ @/usr/lib/libncursesw.so.6.4}!}!5/eh`  }!}!0; :0zq&H/usr/lib/libreadline.so.8.2}!}!Lq8/eh`  p}!}!кU0zq&H/usr/bin/bash}!}!t:/eh`  }!}!B : :{E/usr/lib/ld-linux-x86-64.so.2}!}!P:/eh`  h}!}!UU[heap]}!}!Џ SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include #include "data.h" #include "perfparser.h" #include "perfrecord.h" #include "recordhost.h" #include "util.h" #include "../testutils.h" #include #if QT_VERSION < QT_VERSION_CHECK(6, 3, 0) // workaround issues with string literals in QTest that we cannot workaround locally // this was fixed upstream, see: https://codereview.qt-project.org/c/qt/qtbase/+/354227 // clazy:excludeall=qstring-allocations #endif namespace { template bool searchForChildSymbol(const T& root, const QString& searchString, bool exact = true) { if (exact && root.symbol.symbol == searchString) { return true; } else if (!exact && root.symbol.symbol.contains(searchString)) { return true; } else { for (const auto& entry : root.children) { if (searchForChildSymbol(entry, searchString, exact)) { return true; } } } return false; } bool compareCosts(const Data::TopDown& lhs, const Data::TopDown& rhs, const Data::TopDownResults& results, int costIndex) { return results.inclusiveCosts.cost(costIndex, lhs.id) < results.inclusiveCosts.cost(costIndex, rhs.id); } bool compareCosts(const Data::BottomUp& lhs, const Data::BottomUp& rhs, const Data::BottomUpResults& results, int costIndex) { return results.costs.cost(costIndex, lhs.id) < results.costs.cost(costIndex, rhs.id); } template int maxElementTopIndex(const Results& collection, int costIndex = 0) { using DataType = decltype(*collection.root.children.begin()); auto topResult = std::max_element(collection.root.children.constBegin(), collection.root.children.constEnd(), [collection, costIndex](const DataType& lhs, const DataType& rhs) { return compareCosts(lhs, rhs, collection, costIndex); }); return std::distance(collection.root.children.begin(), topResult); } } struct ComparableSymbol { ComparableSymbol() = default; ComparableSymbol(Data::Symbol symbol) : symbol(std::move(symbol)) , isPattern(false) { } ComparableSymbol(QString symbol, QString binary) : pattern({{std::move(symbol), std::move(binary)}}) , isPattern(true) { } struct Pattern { QString symbol; QString binary; }; ComparableSymbol(QVector pattern) : pattern(std::move(pattern)) , isPattern(true) { } bool isValid() const { if (isPattern) return !pattern.isEmpty(); else return symbol.isValid(); } bool operator==(const ComparableSymbol& rhs) const { VERIFY_OR_THROW(isPattern != rhs.isPattern); auto cmp = [](const Data::Symbol& symbol, const QVector& pattern) { return std::any_of(pattern.begin(), pattern.end(), [&symbol](const Pattern& pattern) { return symbol.symbol.contains(pattern.symbol) && symbol.binary.contains(pattern.binary); }); }; return isPattern ? cmp(rhs.symbol, pattern) : cmp(symbol, rhs.pattern); } QVector pattern; Data::Symbol symbol; bool isPattern = false; }; char* toString(const ComparableSymbol& symbol) { if (symbol.isPattern) { QStringList patterns; for (const auto& pattern : symbol.pattern) patterns.append(QLatin1Char('{') + pattern.symbol + QLatin1String(", ") + pattern.binary + QLatin1Char('}')); return QTest::toString( QString(QLatin1String("ComparableSymbol{[") + patterns.join(QLatin1String(", ")) + QLatin1String("]}"))); } else { return QTest::toString(QString(QLatin1String("ComparableSymbol{") + symbol.symbol.symbol + QLatin1String(", ") + symbol.symbol.binary + QLatin1Char('}'))); } } ComparableSymbol cppInliningTopSymbol(const QString& binary = QStringLiteral("cpp-inlining")) { // depending on libstdc++ version, we either get the slow libm // or it's fully inlined return ComparableSymbol( QVector {{QStringLiteral("hypot"), QStringLiteral("libm")}, {QStringLiteral("std::__detail::_Mod {{QStringLiteral("fibonacci"), binary}, {{}, binary}}); } void dump(const Data::BottomUp& bottomUp, QTextStream& stream, const QByteArray& prefix) { stream << prefix << bottomUp.symbol.symbol << '\n'; for (const auto& child : bottomUp.children) { dump(child, stream, prefix + '\t'); } } class TestPerfParser : public QObject { Q_OBJECT public: using QObject::QObject; private slots: void initTestCase() { qputenv("DEBUGINFOD_URLS", {}); RecordHost host; QSignalSpy capabilitiesSpy(&host, &RecordHost::perfCapabilitiesChanged); QSignalSpy installedSpy(&host, &RecordHost::isPerfInstalledChanged); QVERIFY(installedSpy.wait()); if (!host.isPerfInstalled()) { QSKIP("perf is not available, cannot run integration tests."); } if (capabilitiesSpy.count() == 0) { QVERIFY(capabilitiesSpy.wait()); } m_capabilities = host.perfCapabilities(); } void init() { m_bottomUpData = {}; m_topDownData = {}; m_callerCalleeData = {}; m_summaryData = {}; m_perfCommand.clear(); m_cpuArchitecture = QSysInfo::currentCpuArchitecture(); m_linuxKernelVersion = QSysInfo::kernelVersion(); m_machineHostName = QSysInfo::machineHostName(); } void testFileErrorHandling_data() { QTest::addColumn("perfFile"); QTest::addColumn("errorMessagePart"); QTest::addRow("missing file") << QStringLiteral("not_here") << QStringLiteral("does not exist"); QTest::addRow("not a file") << QStringLiteral("../..") << QStringLiteral("is not a file"); QTest::addRow("permissions") << QString() << QStringLiteral("not readable"); } void testFileErrorHandling() { PerfParser parser(this); QSignalSpy parsingFailedSpy(&parser, &PerfParser::parsingFailed); QFETCH(QString, perfFile); QFETCH(QString, errorMessagePart); QTemporaryFile tempFile; if (perfFile.isEmpty()) { tempFile.open(); tempFile.write("test content"); tempFile.close(); tempFile.setPermissions({}); // drop all permissons perfFile = tempFile.fileName(); } parser.initParserArgs(perfFile); QCOMPARE(parsingFailedSpy.count(), 1); auto message = parsingFailedSpy.takeFirst().at(0).toString(); QVERIFY(message.contains(perfFile)); QVERIFY(message.contains(errorMessagePart)); } void testFileContent_data() { QTest::addColumn("perfFile"); QTest::addColumn("errorMessagePart"); const auto perfData = QFINDTESTDATA("file_content/true.perfparser"); QTest::addRow("pre-exported perfparser") << perfData << QString(); #if KFArchive_FOUND QTest::addRow("perfparser, xzipped") << QFINDTESTDATA("file_content/true.perfparser.xz") << QString(); #endif const auto perfDataSomeName = QStringLiteral("fruitper"); QFile::copy(perfData, perfDataSomeName); // we can ignore errors (file exist) here QTest::addRow("pre-exported perfparser \"bad extension\"") << perfDataSomeName << QString(); QTest::addRow("no expected magic header") << QFINDTESTDATA("tst_perfparser.cpp") << QStringLiteral("File format unknown"); QTest::addRow("PERF v1") << QFINDTESTDATA("file_content/perf.data.true.v1") << QStringLiteral("V1 perf data"); QTest::addRow("PERF v2") << QFINDTESTDATA("file_content/perf.data.true.v2") << QString(); #if KFArchive_FOUND QTest::addRow("PERF v2, gzipped") << QFINDTESTDATA("file_content/perf.data.true.v2.gz") << QString(); QTest::addRow("no expected magic header, gzipped") << QFINDTESTDATA("file_content/perf.data.broken.gz") << QStringLiteral("File format unknown"); #endif } void testFileContent() { // setting the application path as the checked perf files recorded a `true` binary which commonly // is not available in the same place (and we don't get the any reasonable parser output in this case) // the same place as the tests are run Settings::instance()->setAppPath( QFileInfo(QStandardPaths::findExecutable(QStringLiteral("true"))).dir().path()); // add extra paths to at least allow manually including the matched libc.so/ld.so during a test Settings::instance()->setExtraLibPaths(QFINDTESTDATA("file_content")); PerfParser parser(this); QSignalSpy parsingFailedSpy(&parser, &PerfParser::parsingFailed); QSignalSpy parsingFinishedSpy(&parser, &PerfParser::parsingFinished); QFETCH(QString, perfFile); QFETCH(QString, errorMessagePart); QVERIFY(!perfFile.isEmpty() && QFile::exists(perfFile)); parser.startParseFile(perfFile); if (errorMessagePart.isEmpty()) { // if we don't expect an error message (Null String created by `QString()`) // then expect a finish within the given time frame QTRY_COMPARE_WITH_TIMEOUT(parsingFinishedSpy.count(), 1, 2000); QCOMPARE(parsingFailedSpy.count(), 0); } else { // otherwise wait for failed parsing, the check for if the required part is // found in the error message (we only check a part to allow adjustments later) QTRY_COMPARE_WITH_TIMEOUT(parsingFailedSpy.count(), 1, 2000); QCOMPARE(parsingFinishedSpy.count(), 0); const auto message = parsingFailedSpy.takeFirst().at(0).toString(); QVERIFY(message.contains(errorMessagePart)); QVERIFY(message.contains(perfFile)); } } /* tests a perf file that has data with PERF_FORMAT_LOST attribute, see KDAB/hotspot#578 */ void testPerfFormatLost() { PerfParser parser(this); QSignalSpy parsingFailedSpy(&parser, &PerfParser::parsingFailed); QSignalSpy parsingFinishedSpy(&parser, &PerfParser::parsingFinished); parser.startParseFile(QFINDTESTDATA("perf.data.PerfFormatLost")); QTRY_COMPARE_WITH_TIMEOUT(parsingFinishedSpy.count(), 1, 58000); QCOMPARE(parsingFailedSpy.count(), 0); } void testCppInliningNoOptions() { const QStringList perfOptions; QStringList exeOptions; const QString exePath = findExe(QStringLiteral("cpp-inlining")); QTemporaryFile tempFile; tempFile.open(); // top-down data is too vague here, don't check it try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppInliningTopSymbol(), {}, tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); // we don't know the on/off CPU time QCOMPARE(m_summaryData.onCpuTime, quint64(0)); QCOMPARE(m_summaryData.offCpuTime, quint64(0)); } void testCppInliningCallGraphDwarf_data() { QTest::addColumn("otherOptions"); QTest::addRow("normal") << QStringList(); if (m_capabilities.canUseAio) QTest::addRow("aio") << QStringList(QStringLiteral("--aio")); if (m_capabilities.canCompress) QTest::addRow("zstd") << QStringList(QStringLiteral("-z")); } void testCppInliningCallGraphDwarf() { QFETCH(QStringList, otherOptions); QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf")}; perfOptions + otherOptions; QStringList exeOptions; const QString exePath = findExe(QStringLiteral("cpp-inlining")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppInliningTopSymbol(), {QStringLiteral("start"), QStringLiteral("cpp-inlining")}, tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); QVERIFY(searchForChildSymbol(m_bottomUpData.root.children.at(maxElementTopIndex(m_bottomUpData)), QStringLiteral("main"))); QVERIFY(searchForChildSymbol(m_topDownData.root.children.at(maxElementTopIndex(m_topDownData)), QStringLiteral("main"))); } void testCppInliningEventCycles() { const QStringList perfOptions = {QStringLiteral("--event"), QStringLiteral("cycles")}; QStringList exeOptions; const QString exePath = findExe(QStringLiteral("cpp-inlining")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppInliningTopSymbol(), {}, tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); } void testCppInliningEventCyclesInstructions() { QFETCH(QString, eventSpec); const QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf"), QStringLiteral("--event"), eventSpec}; QStringList exeOptions; const QString exePath = findExe(QStringLiteral("cpp-inlining")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppInliningTopSymbol(), {QStringLiteral("start"), QStringLiteral("cpp-inlining")}, tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); QCOMPARE(m_bottomUpData.costs.numTypes(), 2); QCOMPARE(m_topDownData.inclusiveCosts.numTypes(), 2); QCOMPARE(m_topDownData.selfCosts.numTypes(), 2); QVERIFY(m_bottomUpData.costs.typeName(0).startsWith(QStringLiteral("cycles"))); QVERIFY(m_bottomUpData.costs.typeName(1).startsWith(QStringLiteral("instructions"))); int bottomUpTopIndex = maxElementTopIndex(m_bottomUpData); qint64 bottomUpCycleCost = m_bottomUpData.costs.cost(0, m_bottomUpData.root.children.at(bottomUpTopIndex).id); qint64 bottomUpInstructionCost = m_bottomUpData.costs.cost(1, m_bottomUpData.root.children.at(bottomUpTopIndex).id); QVERIFY2(bottomUpCycleCost != bottomUpInstructionCost, "Bottom-Up Cycle Cost should not be equal to Bottom-Up Instruction Cost"); int topDownTopIndex = maxElementTopIndex(m_topDownData); qint64 topDownCycleCost = m_topDownData.inclusiveCosts.cost(0, m_topDownData.root.children.at(topDownTopIndex).id); qint64 topDownInstructionCost = m_topDownData.inclusiveCosts.cost(1, m_topDownData.root.children.at(topDownTopIndex).id); QVERIFY2(topDownCycleCost != topDownInstructionCost, "Top-Down Cycle Cost should not be equal to Top-Down Instruction Cost"); } void testCppInliningEventCyclesInstructions_data() { QTest::addColumn("eventSpec"); QTest::newRow("separate-events") << QStringLiteral("cycles,instructions"); QTest::newRow("group") << QStringLiteral("{cycles,instructions}"); QTest::newRow("leader-sampling") << QStringLiteral("{cycles,instructions}:S"); } void testCppRecursionNoOptions() { const QStringList perfOptions; const QStringList exeOptions = {QStringLiteral("40")}; const QString exePath = findExe(QStringLiteral("cpp-recursion")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppRecursionTopSymbol(), cppRecursionTopSymbol(), tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); } void testCppRecursionCallGraphDwarf() { const QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf")}; const QStringList exeOptions = {QStringLiteral("40")}; const QString exePath = findExe(QStringLiteral("cpp-recursion")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppRecursionTopSymbol(), {QStringLiteral("start"), QStringLiteral("cpp-recursion")}, tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); QVERIFY(searchForChildSymbol(m_bottomUpData.root.children.at(maxElementTopIndex(m_bottomUpData)), QStringLiteral("main"))); const auto maxTop = m_topDownData.root.children.at(maxElementTopIndex(m_topDownData)); if (!maxTop.symbol.isValid()) { QSKIP("unwinding failed from the fibonacci function, unclear why - increasing the stack dump size doesn't " "help"); } QVERIFY(searchForChildSymbol(maxTop, QStringLiteral("main"))); } void testCppRecursionEventCycles() { const QStringList perfOptions = {QStringLiteral("--event"), QStringLiteral("cycles")}; const QStringList exeOptions = {QStringLiteral("40")}; const QString exePath = findExe(QStringLiteral("cpp-recursion")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppRecursionTopSymbol(), cppRecursionTopSymbol(), tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); } void testCppRecursionEventCyclesInstructions() { const QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf"), QStringLiteral("--event"), QStringLiteral("cycles,instructions")}; const QStringList exeOptions = {QStringLiteral("40")}; const QString exePath = findExe(QStringLiteral("cpp-recursion")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeOptions, tempFile.fileName()); testPerfData(cppRecursionTopSymbol(), {QStringLiteral("start"), QStringLiteral("cpp-recursion")}, tempFile.fileName()); } catch (...) { } QVERIFY(!m_bottomUpData.root.children.isEmpty()); QVERIFY(!m_topDownData.root.children.isEmpty()); int bottomUpTopIndex = maxElementTopIndex(m_bottomUpData); qint64 bottomUpCycleCost = m_bottomUpData.costs.cost(0, m_bottomUpData.root.children.at(bottomUpTopIndex).id); qint64 bottomUpInstructionCost = m_bottomUpData.costs.cost(1, m_bottomUpData.root.children.at(bottomUpTopIndex).id); QVERIFY2(bottomUpCycleCost != bottomUpInstructionCost, "Bottom-Up Cycle Cost should not be equal to Bottom-Up Instruction Cost"); int topDownTopIndex = maxElementTopIndex(m_topDownData); qint64 topDownCycleCost = m_topDownData.inclusiveCosts.cost(0, m_topDownData.root.children.at(topDownTopIndex).id); qint64 topDownInstructionCost = m_topDownData.inclusiveCosts.cost(1, m_topDownData.root.children.at(topDownTopIndex).id); QVERIFY2(topDownCycleCost != topDownInstructionCost, "Top-Down Cycle Cost should not be equal to Top-Down Instruction Cost"); } void testSendStdIn() { const QStringList exeOptions = {QStringLiteral("40")}; const QString exePath = findExe(QStringLiteral("cpp-stdin")); QTemporaryFile tempFile; tempFile.open(); RecordHost host; PerfRecord perf(&host); QSignalSpy recordingFinishedSpy(&perf, &PerfRecord::recordingFinished); QSignalSpy recordingFailedSpy(&perf, &PerfRecord::recordingFailed); perf.record({QStringLiteral("--no-buildid-cache")}, tempFile.fileName(), false, exePath, exeOptions); perf.sendInput(QByteArrayLiteral("some input\n")); QVERIFY(recordingFinishedSpy.wait()); QCOMPARE(recordingFailedSpy.count(), 0); QCOMPARE(recordingFinishedSpy.count(), 1); } void testSwitchEvents() { const QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf"), QStringLiteral("--switch-events")}; const QString exePath = findExe(QStringLiteral("cpp-sleep")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, {}, tempFile.fileName()); testPerfData(cppInliningTopSymbol(QStringLiteral("cpp-sleep")), {QStringLiteral("start"), QStringLiteral("cpp-sleep")}, tempFile.fileName(), false); } catch (...) { } QVERIFY(m_summaryData.offCpuTime > 1E9); // it should sleep at least 1s in total QVERIFY(m_summaryData.onCpuTime > 0); // there's some CPU time, but not sure how much QCOMPARE(m_summaryData.applicationTime.delta(), m_summaryData.offCpuTime + m_summaryData.onCpuTime); } void testThreadNames() { const QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf"), QStringLiteral("--switch-events")}; const QString exePath = findExe(QStringLiteral("cpp-threadnames")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, {}, tempFile.fileName()); testPerfData({}, {}, tempFile.fileName(), false); } catch (...) { } // in total, there should only be about 1s runtime QVERIFY(m_summaryData.applicationTime.delta() > 1E9); // and it should be less than the total sleep time QVERIFY(m_summaryData.applicationTime.delta() < m_summaryData.offCpuTime); // which is about 2s since the main thread sleeps most of the time, and every one of the others, too QVERIFY(m_summaryData.offCpuTime > 2E9); // there's some CPU time, but not sure how much QVERIFY(m_summaryData.onCpuTime > 0 && m_summaryData.onCpuTime < m_summaryData.offCpuTime); QCOMPARE(m_eventData.threads.size(), 11); quint64 lastTime = 0; for (int i = 0; i < 11; ++i) { const auto& thread = m_eventData.threads[i]; QVERIFY(thread.time.start > lastTime); lastTime = thread.time.start; if (i == 0) { QCOMPARE(thread.name, QStringLiteral("cpp-threadnames")); QVERIFY(thread.offCpuTime > 1E9); // sleeps about 1s in total } else { QCOMPARE(thread.name, QStringLiteral("threadname%1").arg(i - 1)); QVERIFY(thread.offCpuTime > 1E8); QVERIFY(thread.offCpuTime < 1E9); } QVERIFY(thread.time.delta() > thread.offCpuTime); } } void testOffCpu() { if (!m_capabilities.canProfileOffCpu) { QSKIP("cannot access sched_switch trace points. execute the following to run this test:\n" " sudo mount -o remount,mode=755 /sys/kernel/debug{,/tracing} with mode=755"); } QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf"), QStringLiteral("-e"), QStringLiteral("cycles")}; perfOptions += PerfRecord::offCpuProfilingOptions(); const QString exePath = findExe(QStringLiteral("cpp-sleep")); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, {}, tempFile.fileName()); testPerfData(cppInliningTopSymbol(QStringLiteral("cpp-sleep")), {QStringLiteral("start"), QStringLiteral("cpp-sleep")}, tempFile.fileName(), false); } catch (...) { } QCOMPARE(m_bottomUpData.costs.numTypes(), 3); QCOMPARE(m_bottomUpData.costs.typeName(0), QStringLiteral("cycles")); QCOMPARE(m_bottomUpData.costs.typeName(1), QStringLiteral("sched:sched_switch")); QCOMPARE(m_bottomUpData.costs.typeName(2), QStringLiteral("off-CPU Time")); // find sched switch hotspot int bottomUpTopIndex = maxElementTopIndex(m_bottomUpData, 1); QVERIFY(bottomUpTopIndex != -1); // should be the same as off-cpu hotspot QCOMPARE(bottomUpTopIndex, maxElementTopIndex(m_bottomUpData, 2)); const auto topBottomUp = m_bottomUpData.root.children[bottomUpTopIndex]; QCOMPARE(ComparableSymbol(topBottomUp.symbol), ComparableSymbol({{QStringLiteral("schedule"), QStringLiteral("kernel")}, {QStringLiteral("__schedule"), QString()}})); QVERIFY(searchForChildSymbol(topBottomUp, QStringLiteral("std::this_thread::sleep_for"), false)); QVERIFY(m_bottomUpData.costs.cost(1, topBottomUp.id) >= 10); // at least 10 sched switches QVERIFY(m_bottomUpData.costs.cost(2, topBottomUp.id) >= 1E9); // at least 1s sleep time } void testOffCpuSleep() { const auto sleep = QStandardPaths::findExecutable(QStringLiteral("sleep")); if (sleep.isEmpty()) { QSKIP("no sleep command available"); } if (!m_capabilities.canProfileOffCpu) { QSKIP("cannot access sched_switch trace points. execute the following to run this test:\n" " sudo mount -o remount,mode=755 /sys/kernel/debug{,/tracing} with mode=755"); } QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf"), QStringLiteral("-e"), QStringLiteral("cycles")}; perfOptions += PerfRecord::offCpuProfilingOptions(); QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, sleep, {QStringLiteral(".5")}, tempFile.fileName()); testPerfData({}, {}, tempFile.fileName(), false); } catch (...) { } QCOMPARE(m_bottomUpData.costs.numTypes(), 3); QCOMPARE(m_bottomUpData.costs.typeName(0), QStringLiteral("cycles")); QCOMPARE(m_bottomUpData.costs.typeName(1), QStringLiteral("sched:sched_switch")); QCOMPARE(m_bottomUpData.costs.typeName(2), QStringLiteral("off-CPU Time")); QVERIFY(m_bottomUpData.costs.totalCost(1) >= 1); // at least 1 sched switch QVERIFY(m_bottomUpData.costs.totalCost(2) >= 5E8); // at least .5s sleep time } void testSampleCpu() { QStringList perfOptions = {QStringLiteral("--call-graph"), QStringLiteral("dwarf"), QStringLiteral("--sample-cpu"), QStringLiteral("-e"), QStringLiteral("cycles")}; if (m_capabilities.canProfileOffCpu) { perfOptions += PerfRecord::offCpuProfilingOptions(); } const QString exePath = findExe(QStringLiteral("cpp-parallel")); const int numThreads = QThread::idealThreadCount(); const QStringList exeArgs = {QString::number(numThreads)}; QTemporaryFile tempFile; tempFile.open(); try { perfRecord(perfOptions, exePath, exeArgs, tempFile.fileName()); testPerfData({}, {}, tempFile.fileName(), false); } catch (...) { } QCOMPARE(m_eventData.threads.size(), numThreads + 1); QCOMPARE(m_eventData.cpus.size(), numThreads); if (m_capabilities.canProfileOffCpu) { QCOMPARE(m_bottomUpData.costs.numTypes(), 3); QCOMPARE(m_bottomUpData.costs.typeName(0), QStringLiteral("cycles")); QCOMPARE(m_bottomUpData.costs.typeName(1), QStringLiteral("sched:sched_switch")); QCOMPARE(m_bottomUpData.costs.typeName(2), QStringLiteral("off-CPU Time")); QSet eventCpuIds[3]; for (const auto& thread : std::as_const(m_eventData.threads)) { for (const auto& event : thread.events) { eventCpuIds[event.type].insert(event.cpuId); } } QVERIFY(eventCpuIds[0].size() > 1); QVERIFY(eventCpuIds[1].size() > 1); QVERIFY(eventCpuIds[2].size() > 1); } else { qDebug() << "skipping extended off-CPU profiling check"; } } void testCustomCostAggregation_data() { QTest::addColumn("aggregation"); QTest::addColumn("filename"); QTest::addRow("by_symbol") << Settings::CostAggregation::BySymbol << "by_symbol.txt"; QTest::addRow("by_cpu") << Settings::CostAggregation::ByCPU << "by_cpu.txt"; QTest::addRow("by_process") << Settings::CostAggregation::ByProcess << "by_process.txt"; QTest::addRow("by_thread") << Settings::CostAggregation::ByThread << "by_thread.txt"; } void testCustomCostAggregation() { QFETCH(Settings::CostAggregation, aggregation); QFETCH(QString, filename); QFile expectedData(QFINDTESTDATA(QLatin1String("custom_cost_aggregation_testfiles/") + filename)); QVERIFY(expectedData.open(QIODevice::ReadOnly | QIODevice::Text)); const auto expected = expectedData.readAll(); Settings::instance()->setCostAggregation(aggregation); m_perfCommand = QStringLiteral("perf record --call-graph dwarf --sample-cpu --switch-events --event " "sched:sched_switch -c 1000000 /tmp/cpp-threadnames"); m_cpuArchitecture = QStringLiteral("x86_64"); m_linuxKernelVersion = QStringLiteral("5.17.5-arch1-1"); m_machineHostName = QStringLiteral("Sparrow"); const auto perfData = QFINDTESTDATA("custom_cost_aggregation_testfiles/custom_cost_aggregation.perfparser"); QVERIFY(!perfData.isEmpty() && QFile::exists(perfData)); try { testPerfData({}, {}, perfData, false); } catch (...) { } QByteArray actual; { QTextStream stream(&actual); dump(m_bottomUpData.root, stream, {}); } if (expected != actual) { QFile actualData(expectedData.fileName() + QLatin1String(".actual")); QVERIFY(actualData.open(QIODevice::WriteOnly | QIODevice::Text)); actualData.write(actual); const auto diff = QStandardPaths::findExecutable(QStringLiteral("diff")); if (!diff.isEmpty()) { QProcess::execute(diff, {QStringLiteral("-u"), expectedData.fileName(), actualData.fileName()}); } } QCOMPARE(actual, expected); } #if KFArchive_FOUND void testDecompression_data() { QTest::addColumn("filename"); QTest::newRow("plain") << QFINDTESTDATA("archives/test.txt"); QTest::newRow("gzip") << QFINDTESTDATA("archives/test.gz"); QTest::newRow("bzip2") << QFINDTESTDATA("archives/test.bz2"); QTest::newRow("xz") << QFINDTESTDATA("archives/test.xz"); } void testDecompression() { QFETCH(QString, filename); PerfParser parser; QFile decompressed(parser.decompressIfNeeded(filename)); decompressed.open(QIODevice::ReadOnly); QCOMPARE(decompressed.readAll(), QByteArrayLiteral("Hello World\n")); } void testArchive_data() { QTest::addColumn("filename"); QTest::addRow("uncompressed tar") << QFINDTESTDATA("archives/test.tar"); QTest::addRow("gzip compressed tar") << QFINDTESTDATA("archives/test.tar.gz"); QTest::addRow("zip file") << QFINDTESTDATA("archives/test.zip"); QTest::addRow("tar file with multiple files") << QFINDTESTDATA("archives/test-multi-files.tar"); } void testArchive() { QFETCH(QString, filename); PerfParser parser; QFile decompressed(parser.decompressIfNeeded(filename)); decompressed.open(QIODevice::ReadOnly); QCOMPARE(decompressed.readAll(), QByteArrayLiteral("Hello World\n")); } #endif private: Data::Summary m_summaryData; Data::BottomUpResults m_bottomUpData; Data::TopDownResults m_topDownData; Data::CallerCalleeResults m_callerCalleeData; Data::EventResults m_eventData; QString m_perfCommand; QString m_cpuArchitecture; QString m_linuxKernelVersion; QString m_machineHostName; RecordHost::PerfCapabilities m_capabilities; void perfRecord(const QStringList& perfOptions, const QString& exePath, const QStringList& exeOptions, const QString& fileName) { RecordHost host; PerfRecord perf(&host); QSignalSpy recordingFinishedSpy(&perf, &PerfRecord::recordingFinished); QSignalSpy recordingFailedSpy(&perf, &PerfRecord::recordingFailed); // always add `-c 1000000`, as perf's frequency mode is too unreliable for testing purposes perf.record( perfOptions + QStringList {QStringLiteral("-c"), QStringLiteral("1000000"), QStringLiteral("--no-buildid-cache")}, fileName, false, exePath, exeOptions); m_perfCommand = perf.perfCommand(); QVERIFY(recordingFinishedSpy.wait(10000)); QCOMPARE(recordingFailedSpy.count(), 0); QCOMPARE(recordingFinishedSpy.count(), 1); QCOMPARE(QFileInfo::exists(fileName), true); } static void validateCosts(const Data::Costs& costs, const Data::BottomUp& row) { if (row.parent) { bool hasCost = false; for (int i = 0; i < costs.numTypes(); ++i) { if (costs.cost(i, row.id) > 0) { hasCost = true; break; } } if (!hasCost) { qWarning() << "row without cost: " << row.id << row.symbol << row.parent; auto* r = &row; while (auto p = r->parent) { qWarning() << p->symbol; r = p; } } QVERIFY(hasCost); } for (const auto& child : row.children) { validateCosts(costs, child); } } void testPerfData(const ComparableSymbol& topBottomUpSymbol, const ComparableSymbol& topTopDownSymbol, const QString& fileName, bool checkFrequency = true) { PerfParser parser(this); QSignalSpy parsingFinishedSpy(&parser, &PerfParser::parsingFinished); QSignalSpy parsingFailedSpy(&parser, &PerfParser::parsingFailed); QSignalSpy summaryDataSpy(&parser, &PerfParser::summaryDataAvailable); QSignalSpy bottomUpDataSpy(&parser, &PerfParser::bottomUpDataAvailable); QSignalSpy topDownDataSpy(&parser, &PerfParser::topDownDataAvailable); QSignalSpy callerCalleeDataSpy(&parser, &PerfParser::callerCalleeDataAvailable); QSignalSpy eventsDataSpy(&parser, &PerfParser::eventsAvailable); parser.startParseFile(fileName); QVERIFY(parsingFinishedSpy.wait(12000)); // Verify that the test passed QCOMPARE(parsingFailedSpy.count(), 0); QCOMPARE(parsingFinishedSpy.count(), 1); // Verify the summary data isn't empty QCOMPARE(summaryDataSpy.count(), 1); QList summaryDataArgs = summaryDataSpy.takeFirst(); m_summaryData = qvariant_cast(summaryDataArgs.at(0)); QCOMPARE(m_perfCommand, m_summaryData.command); QVERIFY(m_summaryData.sampleCount > 0); QVERIFY(m_summaryData.applicationTime.delta() > 0); QVERIFY(m_summaryData.cpusAvailable > 0); QCOMPARE(m_summaryData.processCount, quint32(1)); // for now we always have a single process QVERIFY(m_summaryData.threadCount > 0); // and at least one thread QCOMPARE(m_summaryData.cpuArchitecture, m_cpuArchitecture); QCOMPARE(m_summaryData.linuxKernelVersion, m_linuxKernelVersion); QCOMPARE(m_summaryData.hostName, m_machineHostName); if (checkFrequency) { // Verify the sample frequency is acceptable, greater than 500Hz double frequency = (1E9 * m_summaryData.sampleCount) / m_summaryData.applicationTime.delta(); QVERIFY2(frequency > 500, qPrintable(QLatin1String("Low Frequency: ") + QString::number(frequency))); } // Verify the top Bottom-Up symbol result contains the expected data QCOMPARE(bottomUpDataSpy.count(), 1); QList bottomUpDataArgs = bottomUpDataSpy.takeFirst(); m_bottomUpData = bottomUpDataArgs.at(0).value(); validateCosts(m_bottomUpData.costs, m_bottomUpData.root); QVERIFY(m_bottomUpData.root.children.count() > 0); if (topBottomUpSymbol.isValid()) { int bottomUpTopIndex = maxElementTopIndex(m_bottomUpData); const auto actualTopBottomUpSymbol = ComparableSymbol(m_bottomUpData.root.children[bottomUpTopIndex].symbol); if (actualTopBottomUpSymbol == ComparableSymbol(QStringLiteral("__FRAME_END__"), {})) { QEXPECT_FAIL("", "bad symbol offsets - bug in mmap handling or symbol cache?", Continue); } QCOMPARE(actualTopBottomUpSymbol, topBottomUpSymbol); } // Verify the top Top-Down symbol result contains the expected data QCOMPARE(topDownDataSpy.count(), 1); QList topDownDataArgs = topDownDataSpy.takeFirst(); m_topDownData = topDownDataArgs.at(0).value(); QVERIFY(m_topDownData.root.children.count() > 0); if (topTopDownSymbol.isValid() && QLatin1String(QTest::currentTestFunction()) != QLatin1String("testCppRecursionCallGraphDwarf")) { int topDownTopIndex = maxElementTopIndex(m_topDownData); const auto actualTopTopDownSymbol = ComparableSymbol(m_topDownData.root.children[topDownTopIndex].symbol); if (actualTopTopDownSymbol == ComparableSymbol(QStringLiteral("__FRAME_END__"), {})) { QEXPECT_FAIL("", "bad symbol offsets - bug in mmap handling or symbol cache?", Continue); } QCOMPARE(actualTopTopDownSymbol, topTopDownSymbol); } // Verify the Caller/Callee data isn't empty QCOMPARE(callerCalleeDataSpy.count(), 1); QList callerCalleeDataArgs = callerCalleeDataSpy.takeFirst(); m_callerCalleeData = callerCalleeDataArgs.at(0).value(); QVERIFY(m_callerCalleeData.entries.count() > 0); // Verify that no individual cost in the Caller/Callee data is greater than the total cost of all samples for (const auto& entry : std::as_const(m_callerCalleeData.entries)) { QVERIFY(m_callerCalleeData.inclusiveCosts.cost(0, entry.id) <= static_cast(m_summaryData.costs[0].totalPeriod)); } // Verify that the events data is not empty and somewhat sane QCOMPARE(eventsDataSpy.count(), 1); m_eventData = eventsDataSpy.first().first().value(); QVERIFY(!m_eventData.stacks.isEmpty()); QVERIFY(!m_eventData.threads.isEmpty()); QCOMPARE(static_cast(m_eventData.threads.size()), m_summaryData.threadCount); for (const auto& thread : std::as_const(m_eventData.threads)) { QVERIFY(!thread.name.isEmpty()); QVERIFY(thread.pid != 0); QVERIFY(thread.tid != 0); QVERIFY(thread.time.isValid()); QVERIFY(thread.time.end > thread.time.start); QVERIFY(thread.offCpuTime == 0 || thread.offCpuTime < thread.time.delta()); } QVERIFY(!m_eventData.totalCosts.isEmpty()); for (const auto& costs : std::as_const(m_eventData.totalCosts)) { QVERIFY(!costs.label.isEmpty()); QVERIFY(costs.sampleCount > 0); QVERIFY(costs.totalPeriod > 0); } } }; QTEST_GUILESS_MAIN(TestPerfParser) #include "tst_perfparser.moc" KDAB-hotspot-41e5de7/tests/modeltests/000077500000000000000000000000001515036260400176605ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/modeltests/CMakeLists.txt000066400000000000000000000042371515036260400224260ustar00rootroot00000000000000include_directories(../../src) add_library( fib SHARED disassembly/fib.cpp ) set_target_properties( fib PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_EXECROOTDIR}/tests/modeltests" ) ecm_add_test( tst_models.cpp LINK_LIBRARIES Qt::Core Qt::Test models PrefixTickLabels TEST_NAME tst_models ) set_target_properties(tst_models PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}") ecm_add_test( tst_timelinedelegate.cpp LINK_LIBRARIES Qt::Core Qt::Test models PrefixTickLabels TEST_NAME tst_timelinedelegate ) set_target_properties( tst_timelinedelegate PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}" ) ecm_add_test( tst_disassemblyoutput.cpp LINK_LIBRARIES Qt::Core Qt::Test models PrefixTickLabels TEST_NAME tst_disassemblyoutput ../../src/settings.cpp ) set_target_properties( tst_disassemblyoutput PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}" ) ecm_add_test( tst_callgraphgenerator.cpp ../../src/parsers/perf/perfparser.cpp ../../src/callgraphgenerator.cpp ../../src/errnoutil.cpp LINK_LIBRARIES Qt::Core Qt::Test KF${QT_MAJOR_VERSION}::KIOCore KF${QT_MAJOR_VERSION}::ThreadWeaver KF${QT_MAJOR_VERSION}::WindowSystem models TEST_NAME tst_callgraphgenerator ) if(${KFArchive_FOUND}) target_link_libraries(tst_callgraphgenerator KF${QT_MAJOR_VERSION}::Archive) endif() set_target_properties( tst_callgraphgenerator PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}" ) ecm_add_test( tst_search.cpp LINK_LIBRARIES Qt::Test TEST_NAME tst_search ) set_target_properties(tst_search PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}") ecm_add_test( tst_formatting.cpp LINK_LIBRARIES Qt::Test models KF${QT_MAJOR_VERSION}::ConfigWidgets TEST_NAME tst_formatting ) set_target_properties(tst_formatting PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_BINDIR}") KDAB-hotspot-41e5de7/tests/modeltests/callgraph.perfparser000066400000000000000000000173551515036260400237230ustar00rootroot00000000000000QPERFSTREAMcpu_core/cycles:u/ B@cpu_atom/cycles:u/ B@ dummy:HGu  B@ archlinux 6.4.7-arch1-26.3-2x86_64#12th Gen Intel(R) Core(TM) i7-1260PGenuineIntel,6,154,3( /usr/bin/perfrecord --call-graphdwarf-c1000000--no-buildid-cache(./tests/test-clients/callgraph/callgraphq9XGv[eJ/home/lieven/KDAB/hotspot/build-dev/tests/test-clients/callgraph/callgraph_.snuJo2?V4/usr/lib/ld-linux-x86-64.so.2} xt>;'[vdso]?Aw\O."/usr/lib/libc.so.60-15 0-12-34-56-789101112131415(Wgl0-15 intel_pt intel_btssoftwareuncore_imc_free_running_1 uncore_arb_0cpu_core uncore_clock uncore_imc_1power uncore_cbox_4uprobecpu_atom cstate_core uncore_cbox_2 breakpoint uncore_arb_1 uncore_cbox_0 tracepoint cstate_pkguncore_imc_free_running_0kprobe uncore_cbox_5 uncore_imc_0i915 msr uncore_cbox_3 uncore_cbox_1  perf-exec ?@ callgraph ?@ ?"1 ?Z ?e ? ?# ?-I ?]W ?L ?` ?Dc ?h` ?m ?ݱq ?; ?⧽ ?? ?v ?^D` ?E ?-I ?` ?M ?neld-linux-x86-64.so.2&/usr/lib/ld-linux-x86-64.so.2)\&)\§&)] &)]&)]Ǣ&)]&)]w&F nD9SJ/home/lieven/KDAB/hotspot/build-dev/tests/test-clients/callgraph/callgraphF=/home/lieven/KDAB/hotspot/tests/test-clients/callgraph/main.c)V !`  idle& `)V !h h) V !  parent3& ) V !" ) V !% parent2& ) V !' ) V !* parent1& )V !, )V  @/  main& @ )V  O2O libc.so.6/usr/lib/libc.so.6)HO&)H__libc_start_main&8L)I 9 )V  `_start&`&)V  J n* )V !ttJ n )V !child2&)V ! )V !child1&)V ! )V ! test&)V ! )V !" V n!A  V n$z  )V !V n'+  V n+  )V !R n.^   ?R n1  ) V !N n5]   N n8O   )!V !' F n;!F n?59!)"V !, B nB{"B nEŠ")#1fflush&#!^)$1#!libstdc++.so.6.0.32%/usr/lib/libstdc++.so.6.0.32XO/usr/src/debug/gcc/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/streambuf_V/usr/src/debug/gcc/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/ostream.tcc)%4{@{std::ostream::flush()&%{@)&4{%)'4{&{G>std::basic_streambuf >::pubsync()&'{@)(4{'&({@))4{$({B9/usr/src/debug/gcc/gcc/libstdc++-v3/src/c++98/ios_init.cc)* {%std::ios_base::Init::~Init()&* +)+,,#* ,#), __cxa_finalize&, )-,).* __do_global_dtors_aux&. )/*G. G)0\0&0)1\oM&1)2e&2)3ѐ  exit&3  )4ѯ3)5HV&5Z nI}* $)+-/01245nJKDAB-hotspot-41e5de7/tests/modeltests/disassembly/000077500000000000000000000000001515036260400221775ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/modeltests/disassembly/fib.cpp000066400000000000000000000001441515036260400234420ustar00rootroot00000000000000int fib(int i) { if (i == 0 || i == 1) return 1; return fib(i - 1) + fib(i - 2); } KDAB-hotspot-41e5de7/tests/modeltests/disassembly/objdump.indexed_start_internal.txt000066400000000000000000001574511515036260400311450ustar00rootroot00000000000000 /tmp/gnucobol-bug-hunting/libcob/.libs/libcob.so: file format elf64-x86-64 Disassembly of section .text: 0000000000042ed3 : indexed_start_internal(): /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3868 42ed3: 55 push %rbp 42ed4: 48 89 e5 mov %rsp,%rbp 42ed7: 48 83 ec 50 sub $0x50,%rsp 42edb: 48 89 7d c8 mov %rdi,-0x38(%rbp) 42edf: 89 75 c4 mov %esi,-0x3c(%rbp) 42ee2: 48 89 55 b8 mov %rdx,-0x48(%rbp) 42ee6: 89 4d c0 mov %ecx,-0x40(%rbp) 42ee9: 44 89 45 b4 mov %r8d,-0x4c(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3869 42eed: 48 8b 45 c8 mov -0x38(%rbp),%rax 42ef1: 48 8b 40 30 mov 0x30(%rax),%rax 42ef5: 48 89 45 f0 mov %rax,-0x10(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3872 42ef9: 48 8d 4d dc lea -0x24(%rbp),%rcx 42efd: 48 8d 55 e0 lea -0x20(%rbp),%rdx 42f01: 48 8b 75 b8 mov -0x48(%rbp),%rsi 42f05: 48 8b 45 c8 mov -0x38(%rbp),%rax 42f09: 48 89 c7 mov %rax,%rdi 42f0c: e8 34 a0 ff ff callq 3cf45 42f11: 89 c2 mov %eax,%edx 42f13: 48 8b 45 c8 mov -0x38(%rbp),%rax 42f17: 66 89 90 80 00 00 00 mov %dx,0x80(%rax) 42f1e: 48 8b 45 c8 mov -0x38(%rbp),%rax 42f22: 0f b7 80 80 00 00 00 movzwl 0x80(%rax),%eax 42f29: 98 cwtl 42f2a: 89 45 ec mov %eax,-0x14(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3874 42f2d: c7 45 d8 00 00 00 00 movl $0x0,-0x28(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3875 42f34: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3877 42f3b: 83 7d ec 00 cmpl $0x0,-0x14(%rbp) 42f3f: /-- 79 0a jns 42f4b /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3878 42f41: | b8 17 00 00 00 mov $0x17,%eax 42f46: /--------------|-- e9 f3 08 00 00 jmpq 4383e /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3880 42f4b: | \-> 48 8b 45 f0 mov -0x10(%rbp),%rax 42f4f: | 8b 55 ec mov -0x14(%rbp),%edx 42f52: | 89 50 60 mov %edx,0x60(%rax) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3881 42f55: | 8b 45 ec mov -0x14(%rbp),%eax 42f58: | 89 c2 mov %eax,%edx 42f5a: | 48 8b 45 c8 mov -0x38(%rbp),%rax 42f5e: | 66 89 50 7e mov %dx,0x7e(%rax) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3884 42f62: | 8b 55 ec mov -0x14(%rbp),%edx 42f65: | 48 8b 45 c8 mov -0x38(%rbp),%rax 42f69: | 89 d6 mov %edx,%esi 42f6b: | 48 89 c7 mov %rax,%rdi 42f6e: | e8 44 a5 ff ff callq 3d4b7 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3885 42f73: | 8b 45 dc mov -0x24(%rbp),%eax 42f76: | 89 c2 mov %eax,%edx 42f78: | 48 8b 45 f0 mov -0x10(%rbp),%rax 42f7c: | 89 90 80 00 00 00 mov %edx,0x80(%rax) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3887 42f82: | 83 7d ec 00 cmpl $0x0,-0x14(%rbp) 42f86: | /-- 74 33 je 42fbb /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3888 42f88: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 42f8c: | | 48 8b 00 mov (%rax),%rax 42f8f: | | 48 8b 00 mov (%rax),%rax 42f92: | | 4c 8b 80 48 02 00 00 mov 0x248(%rax),%r8 42f99: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 42f9d: | | 48 8b 50 08 mov 0x8(%rax),%rdx 42fa1: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 42fa5: | | 48 8b 00 mov (%rax),%rax 42fa8: | | 48 8b 00 mov (%rax),%rax 42fab: | | b9 00 00 00 00 mov $0x0,%ecx 42fb0: | | be 00 00 00 00 mov $0x0,%esi 42fb5: | | 48 89 c7 mov %rax,%rdi 42fb8: | | 41 ff d0 callq *%r8 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3890 42fbb: | \-> 48 8b 45 f0 mov -0x10(%rbp),%rax 42fbf: | 48 8b 10 mov (%rax),%rdx 42fc2: | 8b 45 ec mov -0x14(%rbp),%eax 42fc5: | 48 98 cltq 42fc7: | 48 c1 e0 03 shl $0x3,%rax 42fcb: | 48 01 d0 add %rdx,%rax 42fce: | 48 8b 00 mov (%rax),%rax 42fd1: | 4c 8b 80 48 02 00 00 mov 0x248(%rax),%r8 42fd8: | 48 8b 45 f0 mov -0x10(%rbp),%rax 42fdc: | 48 8b 50 08 mov 0x8(%rax),%rdx 42fe0: | 8b 45 ec mov -0x14(%rbp),%eax 42fe3: | 48 98 cltq 42fe5: | 48 c1 e0 03 shl $0x3,%rax 42fe9: | 48 01 c2 add %rax,%rdx 42fec: | 48 8b 45 f0 mov -0x10(%rbp),%rax 42ff0: | 48 8b 08 mov (%rax),%rcx 42ff3: | 8b 45 ec mov -0x14(%rbp),%eax 42ff6: | 48 98 cltq 42ff8: | 48 c1 e0 03 shl $0x3,%rax 42ffc: | 48 01 c8 add %rcx,%rax 42fff: | 48 8b 00 mov (%rax),%rax 43002: | b9 00 00 00 00 mov $0x0,%ecx 43007: | be 00 00 00 00 mov $0x0,%esi 4300c: | 48 89 c7 mov %rax,%rdi 4300f: | 41 ff d0 callq *%r8 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3891 43012: | 83 7d c4 07 cmpl $0x7,-0x3c(%rbp) 43016: | /-- 75 5b jne 43073 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3892 43018: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4301c: | | 48 8b 50 08 mov 0x8(%rax),%rdx 43020: | | 8b 45 ec mov -0x14(%rbp),%eax 43023: | | 48 98 cltq 43025: | | 48 c1 e0 03 shl $0x3,%rax 43029: | | 48 01 d0 add %rdx,%rax 4302c: | | 48 8b 00 mov (%rax),%rax 4302f: | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 43036: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4303a: | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 43041: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43045: | | 48 8d 70 78 lea 0x78(%rax),%rsi 43049: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4304d: | | 48 8b 48 08 mov 0x8(%rax),%rcx 43051: | | 8b 45 ec mov -0x14(%rbp),%eax 43054: | | 48 98 cltq 43056: | | 48 c1 e0 03 shl $0x3,%rax 4305a: | | 48 01 c8 add %rcx,%rax 4305d: | | 48 8b 00 mov (%rax),%rax 43060: | | b9 07 00 00 00 mov $0x7,%ecx 43065: | | 48 89 c7 mov %rax,%rdi 43068: | | 41 ff d0 callq *%r8 4306b: | | 89 45 fc mov %eax,-0x4(%rbp) 4306e: | /--|-- e9 b4 00 00 00 jmpq 43127 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3893 43073: | | \-> 83 7d c4 08 cmpl $0x8,-0x3c(%rbp) 43077: | | /-- 75 58 jne 430d1 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3894 43079: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4307d: | | | 48 8b 50 08 mov 0x8(%rax),%rdx 43081: | | | 8b 45 ec mov -0x14(%rbp),%eax 43084: | | | 48 98 cltq 43086: | | | 48 c1 e0 03 shl $0x3,%rax 4308a: | | | 48 01 d0 add %rdx,%rax 4308d: | | | 48 8b 00 mov (%rax),%rax 43090: | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 43097: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4309b: | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 430a2: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 430a6: | | | 48 8d 70 78 lea 0x78(%rax),%rsi 430aa: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 430ae: | | | 48 8b 48 08 mov 0x8(%rax),%rcx 430b2: | | | 8b 45 ec mov -0x14(%rbp),%eax 430b5: | | | 48 98 cltq 430b7: | | | 48 c1 e0 03 shl $0x3,%rax 430bb: | | | 48 01 c8 add %rcx,%rax 430be: | | | 48 8b 00 mov (%rax),%rax 430c1: | | | b9 0f 00 00 00 mov $0xf,%ecx 430c6: | | | 48 89 c7 mov %rax,%rdi 430c9: | | | 41 ff d0 callq *%r8 430cc: | | | 89 45 fc mov %eax,-0x4(%rbp) 430cf: | +--|-- eb 56 jmp 43127 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3896 430d1: | | \-> 48 8b 45 f0 mov -0x10(%rbp),%rax 430d5: | | 48 8b 50 08 mov 0x8(%rax),%rdx 430d9: | | 8b 45 ec mov -0x14(%rbp),%eax 430dc: | | 48 98 cltq 430de: | | 48 c1 e0 03 shl $0x3,%rax 430e2: | | 48 01 d0 add %rdx,%rax 430e5: | | 48 8b 00 mov (%rax),%rax 430e8: | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 430ef: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 430f3: | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 430fa: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 430fe: | | 48 8d 70 78 lea 0x78(%rax),%rsi 43102: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43106: | | 48 8b 48 08 mov 0x8(%rax),%rcx 4310a: | | 8b 45 ec mov -0x14(%rbp),%eax 4310d: | | 48 98 cltq 4310f: | | 48 c1 e0 03 shl $0x3,%rax 43113: | | 48 01 c8 add %rcx,%rax 43116: | | 48 8b 00 mov (%rax),%rax 43119: | | b9 1b 00 00 00 mov $0x1b,%ecx 4311e: | | 48 89 c7 mov %rax,%rdi 43121: | | 41 ff d0 callq *%r8 43124: | | 89 45 fc mov %eax,-0x4(%rbp) 43127: | \----> 83 7d c4 08 cmpl $0x8,-0x3c(%rbp) 4312b: | /-------------- 0f 87 db 03 00 00 ja 4350c 43131: | | 8b 45 c4 mov -0x3c(%rbp),%eax 43134: | | 48 8d 14 85 00 00 00 lea 0x0(,%rax,4),%rdx 4313b: | | 00 4313c: | | 48 8d 05 e1 d3 03 00 lea 0x3d3e1(%rip),%rax # 80524 43143: | | 8b 04 02 mov (%rdx,%rax,1),%eax 43146: | | 48 98 cltq 43148: | | 48 8d 15 d5 d3 03 00 lea 0x3d3d5(%rip),%rdx # 80524 4314f: | | 48 01 d0 add %rdx,%rax 43152: | | ff e0 jmpq *%rax /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3900 43154: | | 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 43158: | | /----------- 0f 85 a7 03 00 00 jne 43505 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3901 4315e: | | | 8b 7d dc mov -0x24(%rbp),%edi 43161: | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 43165: | | | 48 8b 40 18 mov 0x18(%rax),%rax 43169: | | | 48 8b 50 08 mov 0x8(%rax),%rdx 4316d: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43171: | | | 48 8b 70 78 mov 0x78(%rax),%rsi 43175: | | | 8b 4d ec mov -0x14(%rbp),%ecx 43178: | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 4317c: | | | 41 89 f8 mov %edi,%r8d 4317f: | | | 48 89 c7 mov %rax,%rdi 43182: | | | e8 b0 a3 ff ff callq 3d537 43187: | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3903 4318a: | | +----------- e9 76 03 00 00 jmpq 43505 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3905 4318f: | | | 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 43193: | | | /-- 74 5b je 431f0 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3906 43195: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43199: | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 4319d: | | | | 8b 45 ec mov -0x14(%rbp),%eax 431a0: | | | | 48 98 cltq 431a2: | | | | 48 c1 e0 03 shl $0x3,%rax 431a6: | | | | 48 01 d0 add %rdx,%rax 431a9: | | | | 48 8b 00 mov (%rax),%rax 431ac: | | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 431b3: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 431b7: | | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 431be: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 431c2: | | | | 48 8d 70 78 lea 0x78(%rax),%rsi 431c6: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 431ca: | | | | 48 8b 48 08 mov 0x8(%rax),%rcx 431ce: | | | | 8b 45 ec mov -0x14(%rbp),%eax 431d1: | | | | 48 98 cltq 431d3: | | | | 48 c1 e0 03 shl $0x3,%rax 431d7: | | | | 48 01 c8 add %rcx,%rax 431da: | | | | 48 8b 00 mov (%rax),%rax 431dd: | | | | b9 0f 00 00 00 mov $0xf,%ecx 431e2: | | | | 48 89 c7 mov %rax,%rdi 431e5: | | | | 41 ff d0 callq *%r8 431e8: | | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3910 431eb: | +--|--------|-- e9 1c 03 00 00 jmpq 4350c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3908 431f0: | | | \-> 48 8b 45 f0 mov -0x10(%rbp),%rax 431f4: | | | 48 8b 50 08 mov 0x8(%rax),%rdx 431f8: | | | 8b 45 ec mov -0x14(%rbp),%eax 431fb: | | | 48 98 cltq 431fd: | | | 48 c1 e0 03 shl $0x3,%rax 43201: | | | 48 01 d0 add %rdx,%rax 43204: | | | 48 8b 00 mov (%rax),%rax 43207: | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 4320e: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43212: | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 43219: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4321d: | | | 48 8d 70 78 lea 0x78(%rax),%rsi 43221: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43225: | | | 48 8b 48 08 mov 0x8(%rax),%rcx 43229: | | | 8b 45 ec mov -0x14(%rbp),%eax 4322c: | | | 48 98 cltq 4322e: | | | 48 c1 e0 03 shl $0x3,%rax 43232: | | | 48 01 c8 add %rcx,%rax 43235: | | | 48 8b 00 mov (%rax),%rax 43238: | | | b9 17 00 00 00 mov $0x17,%ecx 4323d: | | | 48 89 c7 mov %rax,%rdi 43240: | | | 41 ff d0 callq *%r8 43243: | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3910 43246: | +--|----------- e9 c1 02 00 00 jmpq 4350c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3912 4324b: | | | 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 4324f: | | | /-- 74 5b je 432ac /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3913 43251: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43255: | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 43259: | | | | 8b 45 ec mov -0x14(%rbp),%eax 4325c: | | | | 48 98 cltq 4325e: | | | | 48 c1 e0 03 shl $0x3,%rax 43262: | | | | 48 01 d0 add %rdx,%rax 43265: | | | | 48 8b 00 mov (%rax),%rax 43268: | | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 4326f: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43273: | | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 4327a: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4327e: | | | | 48 8d 70 78 lea 0x78(%rax),%rsi 43282: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43286: | | | | 48 8b 48 08 mov 0x8(%rax),%rcx 4328a: | | | | 8b 45 ec mov -0x14(%rbp),%eax 4328d: | | | | 48 98 cltq 4328f: | | | | 48 c1 e0 03 shl $0x3,%rax 43293: | | | | 48 01 c8 add %rcx,%rax 43296: | | | | 48 8b 00 mov (%rax),%rax 43299: | | | | b9 0f 00 00 00 mov $0xf,%ecx 4329e: | | | | 48 89 c7 mov %rax,%rdi 432a1: | | | | 41 ff d0 callq *%r8 432a4: | | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3924 432a7: | | | /-----|-- e9 5c 02 00 00 jmpq 43508 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3914 432ac: | | | | \-> 8b 7d dc mov -0x24(%rbp),%edi 432af: | | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 432b3: | | | | 48 8b 40 18 mov 0x18(%rax),%rax 432b7: | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 432bb: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 432bf: | | | | 48 8b 70 78 mov 0x78(%rax),%rsi 432c3: | | | | 8b 4d ec mov -0x14(%rbp),%ecx 432c6: | | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 432ca: | | | | 41 89 f8 mov %edi,%r8d 432cd: | | | | 48 89 c7 mov %rax,%rdi 432d0: | | | | e8 62 a2 ff ff callq 3d537 432d5: | | | | 85 c0 test %eax,%eax 432d7: | | | | /-- 74 5b je 43334 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3915 432d9: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 432dd: | | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 432e1: | | | | | 8b 45 ec mov -0x14(%rbp),%eax 432e4: | | | | | 48 98 cltq 432e6: | | | | | 48 c1 e0 03 shl $0x3,%rax 432ea: | | | | | 48 01 d0 add %rdx,%rax 432ed: | | | | | 48 8b 00 mov (%rax),%rax 432f0: | | | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 432f7: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 432fb: | | | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 43302: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43306: | | | | | 48 8d 70 78 lea 0x78(%rax),%rsi 4330a: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4330e: | | | | | 48 8b 48 08 mov 0x8(%rax),%rcx 43312: | | | | | 8b 45 ec mov -0x14(%rbp),%eax 43315: | | | | | 48 98 cltq 43317: | | | | | 48 c1 e0 03 shl $0x3,%rax 4331b: | | | | | 48 01 c8 add %rcx,%rax 4331e: | | | | | 48 8b 00 mov (%rax),%rax 43321: | | | | | b9 17 00 00 00 mov $0x17,%ecx 43326: | | | | | 48 89 c7 mov %rax,%rdi 43329: | | | | | 41 ff d0 callq *%r8 4332c: | | | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3924 4332f: | | | +-----|-- e9 d4 01 00 00 jmpq 43508 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3916 43334: | | | | \-> 48 8b 45 c8 mov -0x38(%rbp),%rax 43338: | | | | 48 8b 48 28 mov 0x28(%rax),%rcx 4333c: | | | | 8b 45 ec mov -0x14(%rbp),%eax 4333f: | | | | 48 63 d0 movslq %eax,%rdx 43342: | | | | 48 89 d0 mov %rdx,%rax 43345: | | | | 48 01 c0 add %rax,%rax 43348: | | | | 48 01 d0 add %rdx,%rax 4334b: | | | | 48 c1 e0 02 shl $0x2,%rax 4334f: | | | | 48 01 d0 add %rdx,%rax 43352: | | | | 48 c1 e0 03 shl $0x3,%rax 43356: | | | | 48 01 c8 add %rcx,%rax 43359: | | | | 8b 40 0c mov 0xc(%rax),%eax 4335c: | | | | 85 c0 test %eax,%eax 4335e: | | | +-------- 0f 84 a4 01 00 00 je 43508 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3917 43364: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43368: | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 4336c: | | | | 8b 45 ec mov -0x14(%rbp),%eax 4336f: | | | | 48 98 cltq 43371: | | | | 48 c1 e0 03 shl $0x3,%rax 43375: | | | | 48 01 d0 add %rdx,%rax 43378: | | | | 48 8b 00 mov (%rax),%rax 4337b: | | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 43382: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43386: | | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 4338d: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43391: | | | | 48 8d 70 78 lea 0x78(%rax),%rsi 43395: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43399: | | | | 48 8b 48 08 mov 0x8(%rax),%rcx 4339d: | | | | 8b 45 ec mov -0x14(%rbp),%eax 433a0: | | | | 48 98 cltq 433a2: | | | | 48 c1 e0 03 shl $0x3,%rax 433a6: | | | | 48 01 c8 add %rcx,%rax 433a9: | | | | 48 8b 00 mov (%rax),%rax 433ac: | | | | b9 12 00 00 00 mov $0x12,%ecx 433b1: | | | | 48 89 c7 mov %rax,%rdi 433b4: | | | | 41 ff d0 callq *%r8 433b7: | | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3918 433ba: | | | | 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 433be: | | | | /-- 74 5b je 4341b /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3919 433c0: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 433c4: | | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 433c8: | | | | | 8b 45 ec mov -0x14(%rbp),%eax 433cb: | | | | | 48 98 cltq 433cd: | | | | | 48 c1 e0 03 shl $0x3,%rax 433d1: | | | | | 48 01 d0 add %rdx,%rax 433d4: | | | | | 48 8b 00 mov (%rax),%rax 433d7: | | | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 433de: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 433e2: | | | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 433e9: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 433ed: | | | | | 48 8d 70 78 lea 0x78(%rax),%rsi 433f1: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 433f5: | | | | | 48 8b 48 08 mov 0x8(%rax),%rcx 433f9: | | | | | 8b 45 ec mov -0x14(%rbp),%eax 433fc: | | | | | 48 98 cltq 433fe: | | | | | 48 c1 e0 03 shl $0x3,%rax 43402: | | | | | 48 01 c8 add %rcx,%rax 43405: | | | | | 48 8b 00 mov (%rax),%rax 43408: | | | | | b9 0f 00 00 00 mov $0xf,%ecx 4340d: | | | | | 48 89 c7 mov %rax,%rdi 43410: | | | | | 41 ff d0 callq *%r8 43413: | | | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3924 43416: | | | +-----|-- e9 ed 00 00 00 jmpq 43508 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3921 4341b: | | | | \-> 48 8b 45 f0 mov -0x10(%rbp),%rax 4341f: | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 43423: | | | | 8b 45 ec mov -0x14(%rbp),%eax 43426: | | | | 48 98 cltq 43428: | | | | 48 c1 e0 03 shl $0x3,%rax 4342c: | | | | 48 01 d0 add %rdx,%rax 4342f: | | | | 48 8b 00 mov (%rax),%rax 43432: | | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 43439: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4343d: | | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 43444: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43448: | | | | 48 8d 70 78 lea 0x78(%rax),%rsi 4344c: | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43450: | | | | 48 8b 48 08 mov 0x8(%rax),%rcx 43454: | | | | 8b 45 ec mov -0x14(%rbp),%eax 43457: | | | | 48 98 cltq 43459: | | | | 48 c1 e0 03 shl $0x3,%rax 4345d: | | | | 48 01 c8 add %rcx,%rax 43460: | | | | 48 8b 00 mov (%rax),%rax 43463: | | | | b9 17 00 00 00 mov $0x17,%ecx 43468: | | | | 48 89 c7 mov %rax,%rdi 4346b: | | | | 41 ff d0 callq *%r8 4346e: | | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3924 43471: | | | +-------- e9 92 00 00 00 jmpq 43508 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3927 43476: | | | | /----> 48 8b 45 f0 mov -0x10(%rbp),%rax 4347a: | | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 4347e: | | | | | 8b 45 ec mov -0x14(%rbp),%eax 43481: | | | | | 48 98 cltq 43483: | | | | | 48 c1 e0 03 shl $0x3,%rax 43487: | | | | | 48 01 d0 add %rdx,%rax 4348a: | | | | | 48 8b 00 mov (%rax),%rax 4348d: | | | | | 4c 8b 80 88 01 00 00 mov 0x188(%rax),%r8 43494: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43498: | | | | | 48 8d 90 a0 00 00 00 lea 0xa0(%rax),%rdx 4349f: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 434a3: | | | | | 48 8d 70 78 lea 0x78(%rax),%rsi 434a7: | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 434ab: | | | | | 48 8b 48 08 mov 0x8(%rax),%rcx 434af: | | | | | 8b 45 ec mov -0x14(%rbp),%eax 434b2: | | | | | 48 98 cltq 434b4: | | | | | 48 c1 e0 03 shl $0x3,%rax 434b8: | | | | | 48 01 c8 add %rcx,%rax 434bb: | | | | | 48 8b 00 mov (%rax),%rax 434be: | | | | | b9 10 00 00 00 mov $0x10,%ecx 434c3: | | | | | 48 89 c7 mov %rax,%rdi 434c6: | | | | | 41 ff d0 callq *%r8 434c9: | | | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3926 434cc: | | | | | 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 434d0: | | | | | /-- 75 39 jne 4350b /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3926 (discriminator 1) 434d2: | | | | | | 8b 7d dc mov -0x24(%rbp),%edi 434d5: | | | | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 434d9: | | | | | | 48 8b 40 18 mov 0x18(%rax),%rax 434dd: | | | | | | 48 8b 50 08 mov 0x8(%rax),%rdx 434e1: | | | | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 434e5: | | | | | | 48 8b 70 78 mov 0x78(%rax),%rsi 434e9: | | | | | | 8b 4d ec mov -0x14(%rbp),%ecx 434ec: | | | | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 434f0: | | | | | | 41 89 f8 mov %edi,%r8d 434f3: | | | | | | 48 89 c7 mov %rax,%rdi 434f6: | | | | | | e8 3c a0 ff ff callq 3d537 434fb: | | | | | | 85 c0 test %eax,%eax 434fd: | | | | \--|-- 0f 84 73 ff ff ff je 43476 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3929 43503: | | | | +-- eb 06 jmp 4350b /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3903 43505: | | \--|-----|-> 90 nop 43506: | +-----|-----|-- eb 04 jmp 4350c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3924 43508: | | \-----|-> 90 nop 43509: | +-----------|-- eb 01 jmp 4350c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3929 4350b: | | \-> 90 nop /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3941 4350c: | \-------------> 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 43510: | /----- 0f 85 ee 00 00 00 jne 43604 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3941 (discriminator 1) 43516: | | 83 7d ec 00 cmpl $0x0,-0x14(%rbp) 4351a: | +----- 0f 8e e4 00 00 00 jle 43604 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3943 43520: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43524: | | 8b 80 80 00 00 00 mov 0x80(%rax),%eax 4352a: | | 89 45 e8 mov %eax,-0x18(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3944 4352d: | | 8b 45 e8 mov -0x18(%rbp),%eax 43530: | | 48 63 d0 movslq %eax,%rdx 43533: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43537: | | 48 8b 48 78 mov 0x78(%rax),%rcx 4353b: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4353f: | | 48 8b 40 20 mov 0x20(%rax),%rax 43543: | | 48 89 ce mov %rcx,%rsi 43546: | | 48 89 c7 mov %rax,%rdi 43549: | | e8 02 04 fd ff callq 13950 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3945 4354e: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 43552: | | 48 8b 48 28 mov 0x28(%rax),%rcx 43556: | | 8b 45 ec mov -0x14(%rbp),%eax 43559: | | 48 63 d0 movslq %eax,%rdx 4355c: | | 48 89 d0 mov %rdx,%rax 4355f: | | 48 01 c0 add %rax,%rax 43562: | | 48 01 d0 add %rdx,%rax 43565: | | 48 c1 e0 02 shl $0x2,%rax 43569: | | 48 01 d0 add %rdx,%rax 4356c: | | 48 c1 e0 03 shl $0x3,%rax 43570: | | 48 01 c8 add %rcx,%rax 43573: | | 8b 40 0c mov 0xc(%rax),%eax 43576: | | 85 c0 test %eax,%eax 43578: | | /-- 74 22 je 4359c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3946 4357a: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4357e: | | | 48 8b 90 a0 00 00 00 mov 0xa0(%rax),%rdx 43585: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43589: | | | 8b 40 44 mov 0x44(%rax),%eax 4358c: | | | 48 98 cltq 4358e: | | | 48 01 d0 add %rdx,%rax 43591: | | | 8b 00 mov (%rax),%eax 43593: | | | 89 45 d8 mov %eax,-0x28(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3947 43596: | | | 8b 45 d8 mov -0x28(%rbp),%eax 43599: | | | 89 45 d8 mov %eax,-0x28(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3949 4359c: | | \-> 48 8b 45 f0 mov -0x10(%rbp),%rax 435a0: | | 48 8b 90 a0 00 00 00 mov 0xa0(%rax),%rdx 435a7: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 435ab: | | 48 89 50 78 mov %rdx,0x78(%rax) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3950 435af: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 435b3: | | 8b 40 44 mov 0x44(%rax),%eax 435b6: | | 89 c2 mov %eax,%edx 435b8: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 435bc: | | 89 90 80 00 00 00 mov %edx,0x80(%rax) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3951 435c2: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 435c6: | | 48 8b 00 mov (%rax),%rax 435c9: | | 48 8b 00 mov (%rax),%rax 435cc: | | 4c 8b 88 78 02 00 00 mov 0x278(%rax),%r9 435d3: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 435d7: | | 48 8d 88 a0 00 00 00 lea 0xa0(%rax),%rcx 435de: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 435e2: | | 48 8d 50 78 lea 0x78(%rax),%rdx 435e6: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 435ea: | | 48 8b 00 mov (%rax),%rax 435ed: | | 48 8b 00 mov (%rax),%rax 435f0: | | 41 b8 00 00 00 00 mov $0x0,%r8d 435f6: | | be 00 00 00 00 mov $0x0,%esi 435fb: | | 48 89 c7 mov %rax,%rdi 435fe: | | 41 ff d1 callq *%r9 43601: | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3954 43604: | \----> 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 43608: | /----- 0f 85 c2 00 00 00 jne 436d0 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3954 (discriminator 1) 4360e: | | 83 7d b4 00 cmpl $0x0,-0x4c(%rbp) 43612: | +----- 0f 84 b8 00 00 00 je 436d0 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3955 43618: | | 8b 45 c0 mov -0x40(%rbp),%eax 4361b: | | 25 00 01 00 00 and $0x100,%eax 43620: | | 85 c0 test %eax,%eax 43622: | | /-- 75 51 jne 43675 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3956 43624: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43628: | | | 8b 90 80 00 00 00 mov 0x80(%rax),%edx 4362e: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43632: | | | 48 8b 48 78 mov 0x78(%rax),%rcx 43636: | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 4363a: | | | 48 89 ce mov %rcx,%rsi 4363d: | | | 48 89 c7 mov %rax,%rdi 43640: | | | e8 77 ed ff ff callq 423bc 43645: | | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3957 43648: | | | 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 4364c: | | +-- 74 27 je 43675 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3958 4364e: | | | 8b 55 ec mov -0x14(%rbp),%edx 43651: | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 43655: | | | 89 d6 mov %edx,%esi 43657: | | | 48 89 c7 mov %rax,%rdi 4365a: | | | e8 0d a3 ff ff callq 3d96c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3959 4365f: | | | 48 8b 45 c8 mov -0x38(%rbp),%rax 43663: | | | 48 89 c7 mov %rax,%rdi 43666: | | | e8 8f a2 ff ff callq 3d8fa /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3960 4366b: | | | b8 33 00 00 00 mov $0x33,%eax 43670: +-----------|--|-- e9 c9 01 00 00 jmpq 4383e /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3963 43675: | | \-> 8b 45 c0 mov -0x40(%rbp),%eax 43678: | | 83 e0 10 and $0x10,%eax 4367b: | | 85 c0 test %eax,%eax 4367d: | +----- 74 51 je 436d0 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3964 4367f: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43683: | | 8b 90 80 00 00 00 mov 0x80(%rax),%edx 43689: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4368d: | | 48 8b 48 78 mov 0x78(%rax),%rcx 43691: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 43695: | | 48 89 ce mov %rcx,%rsi 43698: | | 48 89 c7 mov %rax,%rdi 4369b: | | e8 34 ec ff ff callq 422d4 436a0: | | 89 45 fc mov %eax,-0x4(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3965 436a3: | | 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 436a7: | +----- 74 27 je 436d0 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3966 436a9: | | 8b 55 ec mov -0x14(%rbp),%edx 436ac: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 436b0: | | 89 d6 mov %edx,%esi 436b2: | | 48 89 c7 mov %rax,%rdi 436b5: | | e8 b2 a2 ff ff callq 3d96c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3967 436ba: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 436be: | | 48 89 c7 mov %rax,%rdi 436c1: | | e8 34 a2 ff ff callq 3d8fa /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3968 436c6: | | b8 33 00 00 00 mov $0x33,%eax 436cb: +-----------|----- e9 6e 01 00 00 jmpq 4383e /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3973 436d0: | \----> 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 436d4: | /----- 0f 85 2f 01 00 00 jne 43809 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3974 436da: | | 83 7d ec 00 cmpl $0x0,-0x14(%rbp) 436de: | | /-- 75 2d jne 4370d /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3975 436e0: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 436e4: | | | 8b 40 44 mov 0x44(%rax),%eax 436e7: | | | 48 63 d0 movslq %eax,%rdx 436ea: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 436ee: | | | 48 8b 48 78 mov 0x78(%rax),%rcx 436f2: | | | 48 8b 45 f0 mov -0x10(%rbp),%rax 436f6: | | | 48 8b 40 28 mov 0x28(%rax),%rax 436fa: | | | 48 8b 00 mov (%rax),%rax 436fd: | | | 48 89 ce mov %rcx,%rsi 43700: | | | 48 89 c7 mov %rax,%rdi 43703: | | | e8 48 02 fd ff callq 13950 43708: | +--|-- e9 fc 00 00 00 jmpq 43809 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3977 4370d: | | \-> 8b 55 ec mov -0x14(%rbp),%edx 43710: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 43714: | | 89 d6 mov %edx,%esi 43716: | | 48 89 c7 mov %rax,%rdi 43719: | | e8 cc 9a ff ff callq 3d1ea 4371e: | | 89 45 e4 mov %eax,-0x1c(%rbp) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3979 43721: | | 8b 45 dc mov -0x24(%rbp),%eax 43724: | | 85 c0 test %eax,%eax 43726: | | /-- 7f 2c jg 43754 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3980 43728: | | | 48 8d 3d 22 cb 03 00 lea 0x3cb22(%rip),%rdi # 80251 4372f: | | | e8 5c ee fc ff callq 12590 43734: | | | 48 8d 35 c5 cd 03 00 lea 0x3cdc5(%rip),%rsi # 80500 4373b: | | | 48 89 c7 mov %rax,%rdi 4373e: | | | b8 00 00 00 00 mov $0x0,%eax 43743: | | | e8 58 fb fc ff callq 132a0 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3982 43748: | | | 48 8d 3d 29 cb 03 00 lea 0x3cb29(%rip),%rdi # 80278 4374f: | | | e8 3c fa fc ff callq 13190 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3985 43754: | | \-> 8b 45 e4 mov -0x1c(%rbp),%eax 43757: | | 48 63 d0 movslq %eax,%rdx /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3986 4375a: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4375e: | | 48 8b 48 20 mov 0x20(%rax),%rcx /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3985 43762: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43766: | | 48 8b 70 28 mov 0x28(%rax),%rsi 4376a: | | 8b 45 ec mov -0x14(%rbp),%eax 4376d: | | 48 98 cltq 4376f: | | 48 c1 e0 03 shl $0x3,%rax 43773: | | 48 01 f0 add %rsi,%rax 43776: | | 48 8b 00 mov (%rax),%rax 43779: | | 48 89 ce mov %rcx,%rsi 4377c: | | 48 89 c7 mov %rax,%rdi 4377f: | | e8 cc 01 fd ff callq 13950 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3988 43784: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43788: | | 8b 40 44 mov 0x44(%rax),%eax /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3987 4378b: | | 48 63 d0 movslq %eax,%rdx /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3988 4378e: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 43792: | | 48 8b 48 78 mov 0x78(%rax),%rcx /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3987 43796: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 4379a: | | 48 8b 70 28 mov 0x28(%rax),%rsi 4379e: | | 8b 45 ec mov -0x14(%rbp),%eax 437a1: | | 48 63 f8 movslq %eax,%rdi 437a4: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 437a8: | | 48 8b 40 60 mov 0x60(%rax),%rax 437ac: | | 48 01 f8 add %rdi,%rax 437af: | | 48 c1 e0 03 shl $0x3,%rax 437b3: | | 48 01 f0 add %rsi,%rax 437b6: | | 48 8b 00 mov (%rax),%rax 437b9: | | 48 89 ce mov %rcx,%rsi 437bc: | | 48 89 c7 mov %rax,%rdi 437bf: | | e8 8c 01 fd ff callq 13950 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3989 437c4: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 437c8: | | 48 8b 48 28 mov 0x28(%rax),%rcx 437cc: | | 8b 45 ec mov -0x14(%rbp),%eax 437cf: | | 48 63 d0 movslq %eax,%rdx 437d2: | | 48 89 d0 mov %rdx,%rax 437d5: | | 48 01 c0 add %rax,%rax 437d8: | | 48 01 d0 add %rdx,%rax 437db: | | 48 c1 e0 02 shl $0x2,%rax 437df: | | 48 01 d0 add %rdx,%rax 437e2: | | 48 c1 e0 03 shl $0x3,%rax 437e6: | | 48 01 c8 add %rcx,%rax 437e9: | | 8b 40 0c mov 0xc(%rax),%eax 437ec: | | 85 c0 test %eax,%eax 437ee: | +----- 74 19 je 43809 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3990 437f0: | | 48 8b 45 f0 mov -0x10(%rbp),%rax 437f4: | | 48 8b 50 30 mov 0x30(%rax),%rdx 437f8: | | 8b 45 ec mov -0x14(%rbp),%eax 437fb: | | 48 98 cltq 437fd: | | 48 c1 e0 02 shl $0x2,%rax 43801: | | 48 01 c2 add %rax,%rdx 43804: | | 8b 45 d8 mov -0x28(%rbp),%eax 43807: | | 89 02 mov %eax,(%rdx) /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3995 43809: | \----> 8b 55 ec mov -0x14(%rbp),%edx 4380c: | 48 8b 45 c8 mov -0x38(%rbp),%rax 43810: | 89 d6 mov %edx,%esi 43812: | 48 89 c7 mov %rax,%rdi 43815: | e8 52 a1 ff ff callq 3d96c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3996 4381a: | 83 7d ec 00 cmpl $0x0,-0x14(%rbp) 4381e: | /-- 74 0c je 4382c /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:3997 43820: | | 48 8b 45 c8 mov -0x38(%rbp),%rax 43824: | | 48 89 c7 mov %rax,%rdi 43827: | | e8 ce a0 ff ff callq 3d8fa /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:4000 4382c: | \-> 83 7d fc 00 cmpl $0x0,-0x4(%rbp) 43830: | /-- 75 07 jne 43839 /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:4000 (discriminator 1) 43832: | | b8 00 00 00 00 mov $0x0,%eax 43837: +--------------|-- eb 05 jmp 4383e /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:4000 (discriminator 2) 43839: | \-> b8 17 00 00 00 mov $0x17,%eax /mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c:4001 (discriminator 1) 4383e: \----------------> c9 leaveq 4383f: c3 retq KDAB-hotspot-41e5de7/tests/modeltests/disassembly/objdump.txt000066400000000000000000000627341515036260400244140ustar00rootroot00000000000000 /home/milian/.debug/home/milian/projects/kdab/rnd/hotspot/build/tests/test-clients/cpp-inlining/cpp-inlining/1e80c02c17c9d5f0f0dfb1795949574b1267c8c4/elf: file format elf64-x86-64 Disassembly of section .text: 0000000000001970
    : main(): /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:16 1970: 48 83 ec 18 sub $0x18,%rsp /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:19 1974: 66 0f ef c9 pxor %xmm1,%xmm1 1978: f2 0f 10 2d 20 ee ff movsd -0x11e0(%rip),%xmm5 # 7a0 <.LC2> 197f: ff 1980: f2 0f 10 25 30 ee ff movsd -0x11d0(%rip),%xmm4 # 7b8 <.LC3> 1987: ff /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:16 1988: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax 198f: 00 00 1991: 48 89 44 24 08 mov %rax,0x8(%rsp) 1996: 31 c0 xor %eax,%eax double std::generate_canonical >(std::linear_congruential_engine&): /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:20 (discriminator 1) 1998: bf 80 96 98 00 mov $0x989680,%edi std::linear_congruential_engine::seed(unsigned long): /usr/include/c++/13.2.1/bits/random.tcc:125 (discriminator 1) 199d: ba 01 00 00 00 mov $0x1,%edx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 19a2: 66 0f 28 d1 movapd %xmm1,%xmm2 19a6: f2 0f 10 1d 22 ee ff movsd -0x11de(%rip),%xmm3 # 7d0 <.LC4> 19ad: ff double std::uniform_real_distribution::operator() >(std::linear_congruential_engine&, std::uniform_real_distribution::param_type const&): /usr/include/c++/13.2.1/bits/random.h:1909 (discriminator 2) 19ae: f2 0f 10 3d fa ed ff movsd -0x1206(%rip),%xmm7 # 7b0 <.LC5> 19b5: ff std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:143 19b6: 48 be 05 00 00 00 02 movabs $0x200000005,%rsi 19bd: 00 00 00 double std::uniform_real_distribution::operator() >(std::linear_congruential_engine&, std::uniform_real_distribution::param_type const&): /usr/include/c++/13.2.1/bits/random.h:1909 (discriminator 3) 19c0: f2 0f 10 35 e0 ed ff movsd -0x1220(%rip),%xmm6 # 7a8 <.LC6> 19c7: ff double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.h:1909 (discriminator 3) 19c8: f2 44 0f 10 05 ef ed movsd -0x1211(%rip),%xmm8 # 7c0 <.LC0> 19cf: ff ff 19d1: /-------------------------------------- e9 45 01 00 00 jmp 1b1b 19d6: | 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) 19dd: | 00 00 00 /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 19e0: | /-------------------> 66 0f ef c0 pxor %xmm0,%xmm0 19e4: | | f2 48 0f 2a c0 cvtsi2sd %rax,%xmm0 std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:141 19e9: | /--|-------------------> 48 69 ca a7 41 00 00 imul $0x41a7,%rdx,%rcx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 19f0: | | | f2 0f 58 c2 addsd %xmm2,%xmm0 std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:143 19f4: | | | 48 89 c8 mov %rcx,%rax 19f7: | | | 48 f7 e6 mul %rsi 19fa: | | | 48 89 c8 mov %rcx,%rax 19fd: | | | 48 29 d0 sub %rdx,%rax 1a00: | | | 48 d1 e8 shr %rax 1a03: | | | 48 01 c2 add %rax,%rdx 1a06: | | | 48 c1 ea 1e shr $0x1e,%rdx 1a0a: | | | 48 89 d0 mov %rdx,%rax 1a0d: | | | 48 c1 e0 1f shl $0x1f,%rax 1a11: | | | 48 29 d0 sub %rdx,%rax 1a14: | | | 48 29 c1 sub %rax,%rcx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1a17: | | | 48 89 c8 mov %rcx,%rax std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:143 1a1a: | | | 48 89 ca mov %rcx,%rdx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1a1d: | | | 48 83 e8 01 sub $0x1,%rax 1a21: | /--------|--|-------------------- 0f 88 99 01 00 00 js 1bc0 1a27: | | | | 66 45 0f ef c9 pxor %xmm9,%xmm9 1a2c: | | | | f2 4c 0f 2a c8 cvtsi2sd %rax,%xmm9 1a31: | /--|--------|--|-------------------> f2 44 0f 59 cd mulsd %xmm5,%xmm9 1a36: | | | | | f2 44 0f 58 c8 addsd %xmm0,%xmm9 /usr/include/c++/13.2.1/bits/random.tcc:3367 1a3b: | | | | | f2 44 0f 5e cc divsd %xmm4,%xmm9 /usr/include/c++/13.2.1/bits/random.tcc:3368 (discriminator 1) 1a40: | | | | | 66 44 0f 2f cb comisd %xmm3,%xmm9 1a45: | | | /-----|--|-------------------- 0f 83 95 01 00 00 jae 1be0 double std::uniform_real_distribution::operator() >(std::linear_congruential_engine&, std::uniform_real_distribution::param_type const&): /usr/include/c++/13.2.1/bits/random.h:1909 (discriminator 2) 1a4b: | | | | | | f2 44 0f 59 cf mulsd %xmm7,%xmm9 /usr/include/c++/13.2.1/bits/random.h:1909 (discriminator 3) 1a50: | | | | | | f2 44 0f 5c ce subsd %xmm6,%xmm9 double std::_Norm_helper::_S_do_it(std::complex const&): /usr/include/c++/13.2.1/complex:948 1a55: | | | | | | f2 45 0f 59 c9 mulsd %xmm9,%xmm9 std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:141 1a5a: | | | | /--|--|-------------------> 48 69 ca a7 41 00 00 imul $0x41a7,%rdx,%rcx /usr/include/c++/13.2.1/bits/random.h:143 1a61: | | | | | | | 48 89 c8 mov %rcx,%rax 1a64: | | | | | | | 48 f7 e6 mul %rsi 1a67: | | | | | | | 48 89 c8 mov %rcx,%rax 1a6a: | | | | | | | 48 29 d0 sub %rdx,%rax 1a6d: | | | | | | | 48 d1 e8 shr %rax 1a70: | | | | | | | 48 01 c2 add %rax,%rdx 1a73: | | | | | | | 48 c1 ea 1e shr $0x1e,%rdx 1a77: | | | | | | | 48 89 d0 mov %rdx,%rax 1a7a: | | | | | | | 48 c1 e0 1f shl $0x1f,%rax 1a7e: | | | | | | | 48 29 d0 sub %rdx,%rax 1a81: | | | | | | | 48 29 c1 sub %rax,%rcx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1a84: | | | | | | | 48 89 c8 mov %rcx,%rax std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:143 1a87: | | | | | | | 48 89 ca mov %rcx,%rdx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1a8a: | | | | | | | 48 83 e8 01 sub $0x1,%rax 1a8e: | | | | | | | /-------------- 0f 88 0c 01 00 00 js 1ba0 1a94: | | | | | | | | 66 45 0f ef d2 pxor %xmm10,%xmm10 1a99: | | | | | | | | f2 4c 0f 2a d0 cvtsi2sd %rax,%xmm10 std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:141 1a9e: | | | | | | | /--|-------------> 48 69 ca a7 41 00 00 imul $0x41a7,%rdx,%rcx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1aa5: | | | | | | | | | f2 44 0f 58 d2 addsd %xmm2,%xmm10 std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:143 1aaa: | | | | | | | | | 48 89 c8 mov %rcx,%rax 1aad: | | | | | | | | | 48 f7 e6 mul %rsi 1ab0: | | | | | | | | | 48 89 c8 mov %rcx,%rax 1ab3: | | | | | | | | | 48 29 d0 sub %rdx,%rax 1ab6: | | | | | | | | | 48 d1 e8 shr %rax 1ab9: | | | | | | | | | 48 01 c2 add %rax,%rdx 1abc: | | | | | | | | | 48 c1 ea 1e shr $0x1e,%rdx 1ac0: | | | | | | | | | 48 89 d0 mov %rdx,%rax 1ac3: | | | | | | | | | 48 c1 e0 1f shl $0x1f,%rax 1ac7: | | | | | | | | | 48 29 d0 sub %rdx,%rax 1aca: | | | | | | | | | 48 29 c1 sub %rax,%rcx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1acd: | | | | | | | | | 48 89 c8 mov %rcx,%rax std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:143 1ad0: | | | | | | | | | 48 89 ca mov %rcx,%rdx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1ad3: | | | | | | | | | 48 83 e8 01 sub $0x1,%rax 1ad7: | | | | | | | | | /-- 0f 88 9b 00 00 00 js 1b78 1add: | | | | | | | | | | 66 0f ef c0 pxor %xmm0,%xmm0 1ae1: | | | | | | | | | | f2 48 0f 2a c0 cvtsi2sd %rax,%xmm0 1ae6: | | | | | | | | | /--|-> f2 0f 59 c5 mulsd %xmm5,%xmm0 1aea: | | | | | | | | | | | f2 41 0f 58 c2 addsd %xmm10,%xmm0 /usr/include/c++/13.2.1/bits/random.tcc:3367 1aef: | | | | | | | | | | | f2 0f 5e c4 divsd %xmm4,%xmm0 /usr/include/c++/13.2.1/bits/random.tcc:3368 (discriminator 1) 1af3: | | | | | | | | | | | 66 0f 2f c3 comisd %xmm3,%xmm0 1af7: | | | | | | | | | /-----|--|-- 0f 83 f3 00 00 00 jae 1bf0 double std::uniform_real_distribution::operator() >(std::linear_congruential_engine&, std::uniform_real_distribution::param_type const&): /usr/include/c++/13.2.1/bits/random.h:1909 (discriminator 2) 1afd: | | | | | | | | | | | | f2 0f 59 c7 mulsd %xmm7,%xmm0 /usr/include/c++/13.2.1/bits/random.h:1909 (discriminator 3) 1b01: | | | | | | | | | | | | f2 0f 5c c6 subsd %xmm6,%xmm0 double std::_Norm_helper::_S_do_it(std::complex const&): /usr/include/c++/13.2.1/complex:948 1b05: | | | | | | | | | | | | f2 0f 59 c0 mulsd %xmm0,%xmm0 1b09: | | | | | | | | | | | | f2 41 0f 58 c1 addsd %xmm9,%xmm0 main(): /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:21 (discriminator 6) 1b0e: | | | | | | | | | | | | f2 0f 58 c8 addsd %xmm0,%xmm1 /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:20 (discriminator 1) 1b12: | | | | | | | | | | | | 83 ef 01 sub $0x1,%edi 1b15: | | | | | | | | | | /--|--|-- 0f 84 ec 00 00 00 je 1c07 std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:141 1b1b: >--|--|--|--|--|--|--|--|--|--|--|--|-> 48 69 ca a7 41 00 00 imul $0x41a7,%rdx,%rcx /usr/include/c++/13.2.1/bits/random.h:143 1b22: | | | | | | | | | | | | | 48 89 c8 mov %rcx,%rax 1b25: | | | | | | | | | | | | | 48 f7 e6 mul %rsi 1b28: | | | | | | | | | | | | | 48 89 c8 mov %rcx,%rax 1b2b: | | | | | | | | | | | | | 48 29 d0 sub %rdx,%rax 1b2e: | | | | | | | | | | | | | 48 d1 e8 shr %rax 1b31: | | | | | | | | | | | | | 48 01 c2 add %rax,%rdx 1b34: | | | | | | | | | | | | | 48 c1 ea 1e shr $0x1e,%rdx 1b38: | | | | | | | | | | | | | 48 89 d0 mov %rdx,%rax 1b3b: | | | | | | | | | | | | | 48 c1 e0 1f shl $0x1f,%rax 1b3f: | | | | | | | | | | | | | 48 29 d0 sub %rdx,%rax 1b42: | | | | | | | | | | | | | 48 29 c1 sub %rax,%rcx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1b45: | | | | | | | | | | | | | 48 89 c8 mov %rcx,%rax std::__detail::_Mod::__calc(unsigned long): /usr/include/c++/13.2.1/bits/random.h:143 1b48: | | | | | | | | | | | | | 48 89 ca mov %rcx,%rdx double std::generate_canonical >(std::linear_congruential_engine&): /usr/include/c++/13.2.1/bits/random.tcc:3364 (discriminator 1) 1b4b: | | | | | | | | | | | | | 48 83 e8 01 sub $0x1,%rax 1b4f: | | | | | | \--|--|--|--|--|--|-- 0f 89 8b fe ff ff jns 19e0 1b55: | | | | | | | | | | | | 48 89 c1 mov %rax,%rcx 1b58: | | | | | | | | | | | | 83 e0 01 and $0x1,%eax 1b5b: | | | | | | | | | | | | 66 0f ef c0 pxor %xmm0,%xmm0 1b5f: | | | | | | | | | | | | 48 d1 e9 shr %rcx 1b62: | | | | | | | | | | | | 48 09 c1 or %rax,%rcx 1b65: | | | | | | | | | | | | f2 48 0f 2a c1 cvtsi2sd %rcx,%xmm0 1b6a: | | | | | | | | | | | | f2 0f 58 c0 addsd %xmm0,%xmm0 1b6e: | | | | | \-----|--|--|--|--|--|-- e9 76 fe ff ff jmp 19e9 1b73: | | | | | | | | | | | 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 1b78: | | | | | | | | | | \-> 48 89 c1 mov %rax,%rcx 1b7b: | | | | | | | | | | 83 e0 01 and $0x1,%eax 1b7e: | | | | | | | | | | 66 0f ef c0 pxor %xmm0,%xmm0 1b82: | | | | | | | | | | 48 d1 e9 shr %rcx 1b85: | | | | | | | | | | 48 09 c1 or %rax,%rcx 1b88: | | | | | | | | | | f2 48 0f 2a c1 cvtsi2sd %rcx,%xmm0 1b8d: | | | | | | | | | | f2 0f 58 c0 addsd %xmm0,%xmm0 1b91: | | | | | | | | | \----- e9 50 ff ff ff jmp 1ae6 1b96: | | | | | | | | | 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) 1b9d: | | | | | | | | | 00 00 00 1ba0: | | | | | | \--|--|-------> 48 89 c1 mov %rax,%rcx 1ba3: | | | | | | | | 83 e0 01 and $0x1,%eax 1ba6: | | | | | | | | 66 45 0f ef d2 pxor %xmm10,%xmm10 1bab: | | | | | | | | 48 d1 e9 shr %rcx 1bae: | | | | | | | | 48 09 c1 or %rax,%rcx 1bb1: | | | | | | | | f2 4c 0f 2a d1 cvtsi2sd %rcx,%xmm10 1bb6: | | | | | | | | f2 45 0f 58 d2 addsd %xmm10,%xmm10 1bbb: | | | | | \-----|--|-------- e9 de fe ff ff jmp 1a9e 1bc0: | | \--|--|--------------|--|-------> 48 89 c1 mov %rax,%rcx 1bc3: | | | | | | 83 e0 01 and $0x1,%eax 1bc6: | | | | | | 66 45 0f ef c9 pxor %xmm9,%xmm9 1bcb: | | | | | | 48 d1 e9 shr %rcx 1bce: | | | | | | 48 09 c1 or %rax,%rcx 1bd1: | | | | | | f2 4c 0f 2a c9 cvtsi2sd %rcx,%xmm9 1bd6: | | | | | | f2 45 0f 58 c9 addsd %xmm9,%xmm9 1bdb: | \-----|--|--------------|--|-------- e9 51 fe ff ff jmp 1a31 1be0: | \--|--------------|--|-------> 66 45 0f 28 c8 movapd %xmm8,%xmm9 1be5: | \--------------|--|-------- e9 70 fe ff ff jmp 1a5a 1bea: | | | 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 1bf0: | \--|-------> 66 41 0f 28 c0 movapd %xmm8,%xmm0 double std::_Norm_helper::_S_do_it(std::complex const&): /usr/include/c++/13.2.1/complex:948 1bf5: | | f2 41 0f 58 c1 addsd %xmm9,%xmm0 main(): /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:21 (discriminator 6) 1bfa: | | f2 0f 58 c8 addsd %xmm0,%xmm1 /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:20 (discriminator 1) 1bfe: | | 83 ef 01 sub $0x1,%edi 1c01: \-----------------------------|-------- 0f 85 14 ff ff ff jne 1b1b std::ostream::operator<<(double): /usr/include/c++/13.2.1/ostream:223 1c07: \-------> 48 8d 3d 32 23 00 00 lea 0x2332(%rip),%rdi # 3f40 1c0e: 66 0f 28 c1 movapd %xmm1,%xmm0 1c12: e8 e9 fb ff ff call 1800 <_ZNSo9_M_insertIdEERSoT_$plt> 1c17: c6 44 24 07 0a movb $0xa,0x7(%rsp) 1c1c: 48 89 c7 mov %rax,%rdi std::basic_ostream >& std::operator<< >(std::basic_ostream >&, char): /usr/include/c++/13.2.1/ostream:572 1c1f: 48 8b 00 mov (%rax),%rax std::ios_base::width() const: /usr/include/c++/13.2.1/bits/ios_base.h:756 1c22: 48 8b 40 e8 mov -0x18(%rax),%rax std::basic_ostream >& std::operator<< >(std::basic_ostream >&, char): /usr/include/c++/13.2.1/ostream:572 (discriminator 1) 1c26: 48 83 7c 07 10 00 cmpq $0x0,0x10(%rdi,%rax,1) 1c2c: /-------- 74 26 je 1c54 /usr/include/c++/13.2.1/ostream:573 1c2e: | 48 8d 74 24 07 lea 0x7(%rsp),%rsi 1c33: | ba 01 00 00 00 mov $0x1,%edx 1c38: | e8 d3 fb ff ff call 1810 <_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l$plt> main(): /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:25 1c3d: | /----> 48 8b 44 24 08 mov 0x8(%rsp),%rax 1c42: | | 64 48 2b 04 25 28 00 sub %fs:0x28,%rax 1c49: | | 00 00 1c4b: | | /-- 75 13 jne 1c60 1c4d: | | | 31 c0 xor %eax,%eax 1c4f: | | | 48 83 c4 18 add $0x18,%rsp 1c53: | | | c3 ret std::basic_ostream >& std::operator<< >(std::basic_ostream >&, char): /usr/include/c++/13.2.1/ostream:574 1c54: \--|--|-> be 0a 00 00 00 mov $0xa,%esi 1c59: | | e8 c2 fb ff ff call 1820 <_ZNSo3putEc$plt> /usr/include/c++/13.2.1/ostream:575 1c5e: \--|-- eb dd jmp 1c3d main(): /home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp:25 1c60: \-> e8 cb fb ff ff call 1830 <__stack_chk_fail$plt> KDAB-hotspot-41e5de7/tests/modeltests/disassembly/objdump2.txt000066400000000000000000001150541515036260400244700ustar00rootroot00000000000000 tests/modeltests/libfib.so: file format elf64-x86-64 Disassembly of section .plt: 0000000000001020 : 1020: ff 35 ca 4f 00 00 push 0x4fca(%rip) # 5ff0 <_GLOBAL_OFFSET_TABLE_+0x8> 1026: ff 25 cc 4f 00 00 jmp *0x4fcc(%rip) # 5ff8 <_GLOBAL_OFFSET_TABLE_+0x10> 102c: 0f 1f 40 00 nopl 0x0(%rax) 0000000000001030 : 1030: ff 25 ca 4f 00 00 jmp *0x4fca(%rip) # 6000 1036: 68 00 00 00 00 push $0x0 103b: e9 e0 ff ff ff jmp 1020 <_init+0x20> 0000000000001040 <__asan_init@plt>: 1040: ff 25 c2 4f 00 00 jmp *0x4fc2(%rip) # 6008 <__asan_init@Base> 1046: 68 01 00 00 00 push $0x1 104b: e9 d0 ff ff ff jmp 1020 <_init+0x20> 0000000000001050 <__ubsan_handle_sub_overflow@plt>: 1050: ff 25 ba 4f 00 00 jmp *0x4fba(%rip) # 6010 <__ubsan_handle_sub_overflow@Base> 1056: 68 02 00 00 00 push $0x2 105b: e9 c0 ff ff ff jmp 1020 <_init+0x20> 0000000000001060 <__asan_version_mismatch_check_v8@plt>: 1060: ff 25 b2 4f 00 00 jmp *0x4fb2(%rip) # 6018 <__asan_version_mismatch_check_v8@Base> 1066: 68 03 00 00 00 push $0x3 106b: e9 b0 ff ff ff jmp 1020 <_init+0x20> 0000000000001070 <__ubsan_handle_add_overflow@plt>: 1070: ff 25 aa 4f 00 00 jmp *0x4faa(%rip) # 6020 <__ubsan_handle_add_overflow@Base> 1076: 68 04 00 00 00 push $0x4 107b: e9 a0 ff ff ff jmp 1020 <_init+0x20> Disassembly of section .text: 0000000000001080 <__asan_report_load1_asm-0xd0>: 1080: /----------> 48 8d 3d 11 50 00 00 lea 0x5011(%rip),%rdi # 6098 <__TMC_END__> 1087: | 48 8d 05 0a 50 00 00 lea 0x500a(%rip),%rax # 6098 <__TMC_END__> 108e: | 48 39 f8 cmp %rdi,%rax 1091: | /-- 74 15 je 10a8 <__ubsan_handle_add_overflow@plt+0x38> 1093: | | 48 8b 05 36 4f 00 00 mov 0x4f36(%rip),%rax # 5fd0 <_ITM_deregisterTMCloneTable@Base> 109a: | | 48 85 c0 test %rax,%rax 109d: | +-- 74 09 je 10a8 <__ubsan_handle_add_overflow@plt+0x38> 109f: | | ff e0 jmp *%rax 10a1: | | 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 10a8: | \-> c3 ret 10a9: | 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 10b0: | /-------> 48 8d 3d e1 4f 00 00 lea 0x4fe1(%rip),%rdi # 6098 <__TMC_END__> 10b7: | | 48 8d 35 da 4f 00 00 lea 0x4fda(%rip),%rsi # 6098 <__TMC_END__> 10be: | | 48 29 fe sub %rdi,%rsi 10c1: | | 48 89 f0 mov %rsi,%rax 10c4: | | 48 c1 ee 3f shr $0x3f,%rsi 10c8: | | 48 c1 f8 03 sar $0x3,%rax 10cc: | | 48 01 c6 add %rax,%rsi 10cf: | | 48 d1 fe sar %rsi 10d2: | | /-- 74 14 je 10e8 <__ubsan_handle_add_overflow@plt+0x78> 10d4: | | | 48 8b 05 05 4f 00 00 mov 0x4f05(%rip),%rax # 5fe0 <_ITM_registerTMCloneTable@Base> 10db: | | | 48 85 c0 test %rax,%rax 10de: | | +-- 74 08 je 10e8 <__ubsan_handle_add_overflow@plt+0x78> 10e0: | | | ff e0 jmp *%rax 10e2: | | | 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 10e8: | | \-> c3 ret 10e9: | | 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 10f0: | | f3 0f 1e fa endbr64 10f4: | | 80 3d 9d 4f 00 00 00 cmpb $0x0,0x4f9d(%rip) # 6098 <__TMC_END__> 10fb: | | /----- 75 33 jne 1130 <__ubsan_handle_add_overflow@plt+0xc0> 10fd: | | | 55 push %rbp 10fe: | | | 48 83 3d 7a 4e 00 00 cmpq $0x0,0x4e7a(%rip) # 5f80 <__cxa_finalize@GLIBC_2.2.5> 1105: | | | 00 1106: | | | 48 89 e5 mov %rsp,%rbp 1109: | | | /-- 74 0d je 1118 <__ubsan_handle_add_overflow@plt+0xa8> 110b: | | | | 48 8b 3d 1e 4f 00 00 mov 0x4f1e(%rip),%rdi # 6030 <__dso_handle> 1112: | | | | ff 15 68 4e 00 00 call *0x4e68(%rip) # 5f80 <__cxa_finalize@GLIBC_2.2.5> 1118: \--|--|--\-X e8 63 ff ff ff call 1080 <__ubsan_handle_add_overflow@plt+0x10> 111d: | | c6 05 74 4f 00 00 01 movb $0x1,0x4f74(%rip) # 6098 <__TMC_END__> 1124: | | 5d pop %rbp 1125: | | c3 ret 1126: | | 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) 112d: | | 00 00 00 1130: | \----> c3 ret 1131: | 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1) 1138: | 00 00 00 00 113c: | 0f 1f 40 00 nopl 0x0(%rax) 1140: | f3 0f 1e fa endbr64 1144: \-------- e9 67 ff ff ff jmp 10b0 <__ubsan_handle_add_overflow@plt+0x40> 1149: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 0000000000001150 <__asan_report_load1_asm>: 1150: f3 0f 1e fa endbr64 1154: ff 25 4e 4e 00 00 jmp *0x4e4e(%rip) # 5fa8 <__asan_report_load1@Base> 115a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0000000000001160 <__asan_report_load2_asm>: 1160: f3 0f 1e fa endbr64 1164: ff 25 36 4e 00 00 jmp *0x4e36(%rip) # 5fa0 <__asan_report_load2@Base> 116a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0000000000001170 <__asan_report_load4_asm>: 1170: f3 0f 1e fa endbr64 1174: ff 25 16 4e 00 00 jmp *0x4e16(%rip) # 5f90 <__asan_report_load4@Base> 117a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0000000000001180 <__asan_report_load8_asm>: 1180: f3 0f 1e fa endbr64 1184: ff 25 36 4e 00 00 jmp *0x4e36(%rip) # 5fc0 <__asan_report_load8@Base> 118a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 0000000000001190 <__asan_report_load16_asm>: 1190: f3 0f 1e fa endbr64 1194: ff 25 16 4e 00 00 jmp *0x4e16(%rip) # 5fb0 <__asan_report_load16@Base> 119a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 00000000000011a0 <__asan_report_store1_asm>: 11a0: f3 0f 1e fa endbr64 11a4: ff 25 0e 4e 00 00 jmp *0x4e0e(%rip) # 5fb8 <__asan_report_store1@Base> 11aa: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 00000000000011b0 <__asan_report_store2_asm>: 11b0: f3 0f 1e fa endbr64 11b4: ff 25 0e 4e 00 00 jmp *0x4e0e(%rip) # 5fc8 <__asan_report_store2@Base> 11ba: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 00000000000011c0 <__asan_report_store4_asm>: 11c0: f3 0f 1e fa endbr64 11c4: ff 25 ae 4d 00 00 jmp *0x4dae(%rip) # 5f78 <__asan_report_store4@Base> 11ca: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 00000000000011d0 <__asan_report_store8_asm>: 11d0: f3 0f 1e fa endbr64 11d4: ff 25 be 4d 00 00 jmp *0x4dbe(%rip) # 5f98 <__asan_report_store8@Base> 11da: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) 00000000000011e0 <__asan_report_store16_asm>: 11e0: f3 0f 1e fa endbr64 11e4: ff 25 9e 4d 00 00 jmp *0x4d9e(%rip) # 5f88 <__asan_report_store16@Base> 00000000000011ea <__asan_check_load_add_1_RAX>: 11ea: 49 89 c2 mov %rax,%r10 11ed: 49 c1 ea 03 shr $0x3,%r10 11f1: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 11f8: 7f 11f9: 45 85 d2 test %r10d,%r10d 11fc: 75 01 jne 11ff <.check_load_add_1_RAX> 00000000000011fe <.return_load_add_1_RAX>: 11fe: c3 ret 00000000000011ff <.check_load_add_1_RAX>: 11ff: 51 push %rcx 1200: 48 89 c1 mov %rax,%rcx 1203: 83 e1 07 and $0x7,%ecx 1206: 44 39 d1 cmp %r10d,%ecx 1209: 59 pop %rcx 120a: 7c f2 jl 11fe <.return_load_add_1_RAX> 120c: 48 89 c7 mov %rax,%rdi 120f: e9 3c ff ff ff jmp 1150 <__asan_report_load1_asm> 0000000000001214 <__asan_check_store_add_1_RAX>: 1214: 49 89 c2 mov %rax,%r10 1217: 49 c1 ea 03 shr $0x3,%r10 121b: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1222: 7f 1223: 45 85 d2 test %r10d,%r10d 1226: 75 01 jne 1229 <.check_store_add_1_RAX> 0000000000001228 <.return_store_add_1_RAX>: 1228: c3 ret 0000000000001229 <.check_store_add_1_RAX>: 1229: 51 push %rcx 122a: 48 89 c1 mov %rax,%rcx 122d: 83 e1 07 and $0x7,%ecx 1230: 44 39 d1 cmp %r10d,%ecx 1233: 59 pop %rcx 1234: 7c f2 jl 1228 <.return_store_add_1_RAX> 1236: 48 89 c7 mov %rax,%rdi 1239: e9 62 ff ff ff jmp 11a0 <__asan_report_store1_asm> 000000000000123e <__asan_check_load_add_2_RAX>: 123e: 49 89 c2 mov %rax,%r10 1241: 49 c1 ea 03 shr $0x3,%r10 1245: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 124c: 7f 124d: 45 85 d2 test %r10d,%r10d 1250: 75 01 jne 1253 <.check_load_add_2_RAX> 0000000000001252 <.return_load_add_2_RAX>: 1252: c3 ret 0000000000001253 <.check_load_add_2_RAX>: 1253: 51 push %rcx 1254: 48 89 c1 mov %rax,%rcx 1257: 83 e1 07 and $0x7,%ecx 125a: 83 c1 01 add $0x1,%ecx 125d: 44 39 d1 cmp %r10d,%ecx 1260: 59 pop %rcx 1261: 7c ef jl 1252 <.return_load_add_2_RAX> 1263: 48 89 c7 mov %rax,%rdi 1266: e9 f5 fe ff ff jmp 1160 <__asan_report_load2_asm> 000000000000126b <__asan_check_store_add_2_RAX>: 126b: 49 89 c2 mov %rax,%r10 126e: 49 c1 ea 03 shr $0x3,%r10 1272: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1279: 7f 127a: 45 85 d2 test %r10d,%r10d 127d: 75 01 jne 1280 <.check_store_add_2_RAX> 000000000000127f <.return_store_add_2_RAX>: 127f: c3 ret 0000000000001280 <.check_store_add_2_RAX>: 1280: 51 push %rcx 1281: 48 89 c1 mov %rax,%rcx 1284: 83 e1 07 and $0x7,%ecx 1287: 83 c1 01 add $0x1,%ecx 128a: 44 39 d1 cmp %r10d,%ecx 128d: 59 pop %rcx 128e: 7c ef jl 127f <.return_store_add_2_RAX> 1290: 48 89 c7 mov %rax,%rdi 1293: e9 18 ff ff ff jmp 11b0 <__asan_report_store2_asm> 0000000000001298 <__asan_check_load_add_4_RAX>: 1298: 49 89 c2 mov %rax,%r10 129b: 49 c1 ea 03 shr $0x3,%r10 129f: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 12a6: 7f 12a7: 45 85 d2 test %r10d,%r10d 12aa: 75 01 jne 12ad <.check_load_add_4_RAX> 00000000000012ac <.return_load_add_4_RAX>: 12ac: c3 ret 00000000000012ad <.check_load_add_4_RAX>: 12ad: 51 push %rcx 12ae: 48 89 c1 mov %rax,%rcx 12b1: 83 e1 07 and $0x7,%ecx 12b4: 83 c1 03 add $0x3,%ecx 12b7: 44 39 d1 cmp %r10d,%ecx 12ba: 59 pop %rcx 12bb: 7c ef jl 12ac <.return_load_add_4_RAX> 12bd: 48 89 c7 mov %rax,%rdi 12c0: e9 ab fe ff ff jmp 1170 <__asan_report_load4_asm> 00000000000012c5 <__asan_check_store_add_4_RAX>: 12c5: 49 89 c2 mov %rax,%r10 12c8: 49 c1 ea 03 shr $0x3,%r10 12cc: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 12d3: 7f 12d4: 45 85 d2 test %r10d,%r10d 12d7: 75 01 jne 12da <.check_store_add_4_RAX> 00000000000012d9 <.return_store_add_4_RAX>: 12d9: c3 ret 00000000000012da <.check_store_add_4_RAX>: 12da: 51 push %rcx 12db: 48 89 c1 mov %rax,%rcx 12de: 83 e1 07 and $0x7,%ecx 12e1: 83 c1 03 add $0x3,%ecx 12e4: 44 39 d1 cmp %r10d,%ecx 12e7: 59 pop %rcx 12e8: 7c ef jl 12d9 <.return_store_add_4_RAX> 12ea: 48 89 c7 mov %rax,%rdi 12ed: e9 ce fe ff ff jmp 11c0 <__asan_report_store4_asm> 00000000000012f2 <__asan_check_load_add_8_RAX>: 12f2: 49 89 c2 mov %rax,%r10 12f5: 49 c1 ea 03 shr $0x3,%r10 12f9: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 1300: 00 1301: 75 01 jne 1304 <.fail_load_add_8_RAX> 1303: c3 ret 0000000000001304 <.fail_load_add_8_RAX>: 1304: 48 89 c7 mov %rax,%rdi 1307: e9 74 fe ff ff jmp 1180 <__asan_report_load8_asm> 000000000000130c <__asan_check_store_add_8_RAX>: 130c: 49 89 c2 mov %rax,%r10 130f: 49 c1 ea 03 shr $0x3,%r10 1313: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 131a: 00 131b: 75 01 jne 131e <.fail_store_add_8_RAX> 131d: c3 ret 000000000000131e <.fail_store_add_8_RAX>: 131e: 48 89 c7 mov %rax,%rdi 1321: e9 aa fe ff ff jmp 11d0 <__asan_report_store8_asm> 0000000000001326 <__asan_check_load_add_16_RAX>: 1326: 49 89 c2 mov %rax,%r10 1329: 49 c1 ea 03 shr $0x3,%r10 132d: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 1334: 7f 00 1336: 75 01 jne 1339 <.fail_load_add_16_RAX> 1338: c3 ret 0000000000001339 <.fail_load_add_16_RAX>: 1339: 48 89 c7 mov %rax,%rdi 133c: e9 4f fe ff ff jmp 1190 <__asan_report_load16_asm> 0000000000001341 <__asan_check_store_add_16_RAX>: 1341: 49 89 c2 mov %rax,%r10 1344: 49 c1 ea 03 shr $0x3,%r10 1348: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 134f: 7f 00 1351: 75 01 jne 1354 <.fail_store_add_16_RAX> 1353: c3 ret 0000000000001354 <.fail_store_add_16_RAX>: 1354: 48 89 c7 mov %rax,%rdi 1357: e9 84 fe ff ff jmp 11e0 <__asan_report_store16_asm> 000000000000135c <__asan_check_load_add_1_RBX>: 135c: 49 89 da mov %rbx,%r10 135f: 49 c1 ea 03 shr $0x3,%r10 1363: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 136a: 7f 136b: 45 85 d2 test %r10d,%r10d 136e: 75 01 jne 1371 <.check_load_add_1_RBX> 0000000000001370 <.return_load_add_1_RBX>: 1370: c3 ret 0000000000001371 <.check_load_add_1_RBX>: 1371: 51 push %rcx 1372: 48 89 d9 mov %rbx,%rcx 1375: 83 e1 07 and $0x7,%ecx 1378: 44 39 d1 cmp %r10d,%ecx 137b: 59 pop %rcx 137c: 7c f2 jl 1370 <.return_load_add_1_RBX> 137e: 48 89 df mov %rbx,%rdi 1381: e9 ca fd ff ff jmp 1150 <__asan_report_load1_asm> 0000000000001386 <__asan_check_store_add_1_RBX>: 1386: 49 89 da mov %rbx,%r10 1389: 49 c1 ea 03 shr $0x3,%r10 138d: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1394: 7f 1395: 45 85 d2 test %r10d,%r10d 1398: 75 01 jne 139b <.check_store_add_1_RBX> 000000000000139a <.return_store_add_1_RBX>: 139a: c3 ret 000000000000139b <.check_store_add_1_RBX>: 139b: 51 push %rcx 139c: 48 89 d9 mov %rbx,%rcx 139f: 83 e1 07 and $0x7,%ecx 13a2: 44 39 d1 cmp %r10d,%ecx 13a5: 59 pop %rcx 13a6: 7c f2 jl 139a <.return_store_add_1_RBX> 13a8: 48 89 df mov %rbx,%rdi 13ab: e9 f0 fd ff ff jmp 11a0 <__asan_report_store1_asm> 00000000000013b0 <__asan_check_load_add_2_RBX>: 13b0: 49 89 da mov %rbx,%r10 13b3: 49 c1 ea 03 shr $0x3,%r10 13b7: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 13be: 7f 13bf: 45 85 d2 test %r10d,%r10d 13c2: 75 01 jne 13c5 <.check_load_add_2_RBX> 00000000000013c4 <.return_load_add_2_RBX>: 13c4: c3 ret 00000000000013c5 <.check_load_add_2_RBX>: 13c5: 51 push %rcx 13c6: 48 89 d9 mov %rbx,%rcx 13c9: 83 e1 07 and $0x7,%ecx 13cc: 83 c1 01 add $0x1,%ecx 13cf: 44 39 d1 cmp %r10d,%ecx 13d2: 59 pop %rcx 13d3: 7c ef jl 13c4 <.return_load_add_2_RBX> 13d5: 48 89 df mov %rbx,%rdi 13d8: e9 83 fd ff ff jmp 1160 <__asan_report_load2_asm> 00000000000013dd <__asan_check_store_add_2_RBX>: 13dd: 49 89 da mov %rbx,%r10 13e0: 49 c1 ea 03 shr $0x3,%r10 13e4: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 13eb: 7f 13ec: 45 85 d2 test %r10d,%r10d 13ef: 75 01 jne 13f2 <.check_store_add_2_RBX> 00000000000013f1 <.return_store_add_2_RBX>: 13f1: c3 ret 00000000000013f2 <.check_store_add_2_RBX>: 13f2: 51 push %rcx 13f3: 48 89 d9 mov %rbx,%rcx 13f6: 83 e1 07 and $0x7,%ecx 13f9: 83 c1 01 add $0x1,%ecx 13fc: 44 39 d1 cmp %r10d,%ecx 13ff: 59 pop %rcx 1400: 7c ef jl 13f1 <.return_store_add_2_RBX> 1402: 48 89 df mov %rbx,%rdi 1405: e9 a6 fd ff ff jmp 11b0 <__asan_report_store2_asm> 000000000000140a <__asan_check_load_add_4_RBX>: 140a: 49 89 da mov %rbx,%r10 140d: 49 c1 ea 03 shr $0x3,%r10 1411: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1418: 7f 1419: 45 85 d2 test %r10d,%r10d 141c: 75 01 jne 141f <.check_load_add_4_RBX> 000000000000141e <.return_load_add_4_RBX>: 141e: c3 ret 000000000000141f <.check_load_add_4_RBX>: 141f: 51 push %rcx 1420: 48 89 d9 mov %rbx,%rcx 1423: 83 e1 07 and $0x7,%ecx 1426: 83 c1 03 add $0x3,%ecx 1429: 44 39 d1 cmp %r10d,%ecx 142c: 59 pop %rcx 142d: 7c ef jl 141e <.return_load_add_4_RBX> 142f: 48 89 df mov %rbx,%rdi 1432: e9 39 fd ff ff jmp 1170 <__asan_report_load4_asm> 0000000000001437 <__asan_check_store_add_4_RBX>: 1437: 49 89 da mov %rbx,%r10 143a: 49 c1 ea 03 shr $0x3,%r10 143e: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1445: 7f 1446: 45 85 d2 test %r10d,%r10d 1449: 75 01 jne 144c <.check_store_add_4_RBX> 000000000000144b <.return_store_add_4_RBX>: 144b: c3 ret 000000000000144c <.check_store_add_4_RBX>: 144c: 51 push %rcx 144d: 48 89 d9 mov %rbx,%rcx 1450: 83 e1 07 and $0x7,%ecx 1453: 83 c1 03 add $0x3,%ecx 1456: 44 39 d1 cmp %r10d,%ecx 1459: 59 pop %rcx 145a: 7c ef jl 144b <.return_store_add_4_RBX> 145c: 48 89 df mov %rbx,%rdi 145f: e9 5c fd ff ff jmp 11c0 <__asan_report_store4_asm> 0000000000001464 <__asan_check_load_add_8_RBX>: 1464: 49 89 da mov %rbx,%r10 1467: 49 c1 ea 03 shr $0x3,%r10 146b: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 1472: 00 1473: 75 01 jne 1476 <.fail_load_add_8_RBX> 1475: c3 ret 0000000000001476 <.fail_load_add_8_RBX>: 1476: 48 89 df mov %rbx,%rdi 1479: e9 02 fd ff ff jmp 1180 <__asan_report_load8_asm> 000000000000147e <__asan_check_store_add_8_RBX>: 147e: 49 89 da mov %rbx,%r10 1481: 49 c1 ea 03 shr $0x3,%r10 1485: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 148c: 00 148d: 75 01 jne 1490 <.fail_store_add_8_RBX> 148f: c3 ret 0000000000001490 <.fail_store_add_8_RBX>: 1490: 48 89 df mov %rbx,%rdi 1493: e9 38 fd ff ff jmp 11d0 <__asan_report_store8_asm> 0000000000001498 <__asan_check_load_add_16_RBX>: 1498: 49 89 da mov %rbx,%r10 149b: 49 c1 ea 03 shr $0x3,%r10 149f: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 14a6: 7f 00 14a8: 75 01 jne 14ab <.fail_load_add_16_RBX> 14aa: c3 ret 00000000000014ab <.fail_load_add_16_RBX>: 14ab: 48 89 df mov %rbx,%rdi 14ae: e9 dd fc ff ff jmp 1190 <__asan_report_load16_asm> 00000000000014b3 <__asan_check_store_add_16_RBX>: 14b3: 49 89 da mov %rbx,%r10 14b6: 49 c1 ea 03 shr $0x3,%r10 14ba: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 14c1: 7f 00 14c3: 75 01 jne 14c6 <.fail_store_add_16_RBX> 14c5: c3 ret 00000000000014c6 <.fail_store_add_16_RBX>: 14c6: 48 89 df mov %rbx,%rdi 14c9: e9 12 fd ff ff jmp 11e0 <__asan_report_store16_asm> 00000000000014ce <__asan_check_load_add_1_RCX>: 14ce: 49 89 ca mov %rcx,%r10 14d1: 49 c1 ea 03 shr $0x3,%r10 14d5: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 14dc: 7f 14dd: 45 85 d2 test %r10d,%r10d 14e0: 75 01 jne 14e3 <.check_load_add_1_RCX> 00000000000014e2 <.return_load_add_1_RCX>: 14e2: c3 ret 00000000000014e3 <.check_load_add_1_RCX>: 14e3: 51 push %rcx 14e4: 48 89 c9 mov %rcx,%rcx 14e7: 83 e1 07 and $0x7,%ecx 14ea: 44 39 d1 cmp %r10d,%ecx 14ed: 59 pop %rcx 14ee: 7c f2 jl 14e2 <.return_load_add_1_RCX> 14f0: 48 89 cf mov %rcx,%rdi 14f3: e9 58 fc ff ff jmp 1150 <__asan_report_load1_asm> 00000000000014f8 <__asan_check_store_add_1_RCX>: 14f8: 49 89 ca mov %rcx,%r10 14fb: 49 c1 ea 03 shr $0x3,%r10 14ff: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1506: 7f 1507: 45 85 d2 test %r10d,%r10d 150a: 75 01 jne 150d <.check_store_add_1_RCX> 000000000000150c <.return_store_add_1_RCX>: 150c: c3 ret 000000000000150d <.check_store_add_1_RCX>: 150d: 51 push %rcx 150e: 48 89 c9 mov %rcx,%rcx 1511: 83 e1 07 and $0x7,%ecx 1514: 44 39 d1 cmp %r10d,%ecx 1517: 59 pop %rcx 1518: 7c f2 jl 150c <.return_store_add_1_RCX> 151a: 48 89 cf mov %rcx,%rdi 151d: e9 7e fc ff ff jmp 11a0 <__asan_report_store1_asm> 0000000000001522 <__asan_check_load_add_2_RCX>: 1522: 49 89 ca mov %rcx,%r10 1525: 49 c1 ea 03 shr $0x3,%r10 1529: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1530: 7f 1531: 45 85 d2 test %r10d,%r10d 1534: 75 01 jne 1537 <.check_load_add_2_RCX> 0000000000001536 <.return_load_add_2_RCX>: 1536: c3 ret 0000000000001537 <.check_load_add_2_RCX>: 1537: 51 push %rcx 1538: 48 89 c9 mov %rcx,%rcx 153b: 83 e1 07 and $0x7,%ecx 153e: 83 c1 01 add $0x1,%ecx 1541: 44 39 d1 cmp %r10d,%ecx 1544: 59 pop %rcx 1545: 7c ef jl 1536 <.return_load_add_2_RCX> 1547: 48 89 cf mov %rcx,%rdi 154a: e9 11 fc ff ff jmp 1160 <__asan_report_load2_asm> 000000000000154f <__asan_check_store_add_2_RCX>: 154f: 49 89 ca mov %rcx,%r10 1552: 49 c1 ea 03 shr $0x3,%r10 1556: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 155d: 7f 155e: 45 85 d2 test %r10d,%r10d 1561: 75 01 jne 1564 <.check_store_add_2_RCX> 0000000000001563 <.return_store_add_2_RCX>: 1563: c3 ret 0000000000001564 <.check_store_add_2_RCX>: 1564: 51 push %rcx 1565: 48 89 c9 mov %rcx,%rcx 1568: 83 e1 07 and $0x7,%ecx 156b: 83 c1 01 add $0x1,%ecx 156e: 44 39 d1 cmp %r10d,%ecx 1571: 59 pop %rcx 1572: 7c ef jl 1563 <.return_store_add_2_RCX> 1574: 48 89 cf mov %rcx,%rdi 1577: e9 34 fc ff ff jmp 11b0 <__asan_report_store2_asm> 000000000000157c <__asan_check_load_add_4_RCX>: 157c: 49 89 ca mov %rcx,%r10 157f: 49 c1 ea 03 shr $0x3,%r10 1583: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 158a: 7f 158b: 45 85 d2 test %r10d,%r10d 158e: 75 01 jne 1591 <.check_load_add_4_RCX> 0000000000001590 <.return_load_add_4_RCX>: 1590: c3 ret 0000000000001591 <.check_load_add_4_RCX>: 1591: 51 push %rcx 1592: 48 89 c9 mov %rcx,%rcx 1595: 83 e1 07 and $0x7,%ecx 1598: 83 c1 03 add $0x3,%ecx 159b: 44 39 d1 cmp %r10d,%ecx 159e: 59 pop %rcx 159f: 7c ef jl 1590 <.return_load_add_4_RCX> 15a1: 48 89 cf mov %rcx,%rdi 15a4: e9 c7 fb ff ff jmp 1170 <__asan_report_load4_asm> 00000000000015a9 <__asan_check_store_add_4_RCX>: 15a9: 49 89 ca mov %rcx,%r10 15ac: 49 c1 ea 03 shr $0x3,%r10 15b0: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 15b7: 7f 15b8: 45 85 d2 test %r10d,%r10d 15bb: 75 01 jne 15be <.check_store_add_4_RCX> 00000000000015bd <.return_store_add_4_RCX>: 15bd: c3 ret 00000000000015be <.check_store_add_4_RCX>: 15be: 51 push %rcx 15bf: 48 89 c9 mov %rcx,%rcx 15c2: 83 e1 07 and $0x7,%ecx 15c5: 83 c1 03 add $0x3,%ecx 15c8: 44 39 d1 cmp %r10d,%ecx 15cb: 59 pop %rcx 15cc: 7c ef jl 15bd <.return_store_add_4_RCX> 15ce: 48 89 cf mov %rcx,%rdi 15d1: e9 ea fb ff ff jmp 11c0 <__asan_report_store4_asm> 00000000000015d6 <__asan_check_load_add_8_RCX>: 15d6: 49 89 ca mov %rcx,%r10 15d9: 49 c1 ea 03 shr $0x3,%r10 15dd: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 15e4: 00 15e5: 75 01 jne 15e8 <.fail_load_add_8_RCX> 15e7: c3 ret 00000000000015e8 <.fail_load_add_8_RCX>: 15e8: 48 89 cf mov %rcx,%rdi 15eb: e9 90 fb ff ff jmp 1180 <__asan_report_load8_asm> 00000000000015f0 <__asan_check_store_add_8_RCX>: 15f0: 49 89 ca mov %rcx,%r10 15f3: 49 c1 ea 03 shr $0x3,%r10 15f7: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 15fe: 00 15ff: 75 01 jne 1602 <.fail_store_add_8_RCX> 1601: c3 ret 0000000000001602 <.fail_store_add_8_RCX>: 1602: 48 89 cf mov %rcx,%rdi 1605: e9 c6 fb ff ff jmp 11d0 <__asan_report_store8_asm> 000000000000160a <__asan_check_load_add_16_RCX>: 160a: 49 89 ca mov %rcx,%r10 160d: 49 c1 ea 03 shr $0x3,%r10 1611: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 1618: 7f 00 161a: 75 01 jne 161d <.fail_load_add_16_RCX> 161c: c3 ret 000000000000161d <.fail_load_add_16_RCX>: 161d: 48 89 cf mov %rcx,%rdi 1620: e9 6b fb ff ff jmp 1190 <__asan_report_load16_asm> 0000000000001625 <__asan_check_store_add_16_RCX>: 1625: 49 89 ca mov %rcx,%r10 1628: 49 c1 ea 03 shr $0x3,%r10 162c: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 1633: 7f 00 1635: 75 01 jne 1638 <.fail_store_add_16_RCX> 1637: c3 ret 0000000000001638 <.fail_store_add_16_RCX>: 1638: 48 89 cf mov %rcx,%rdi 163b: e9 a0 fb ff ff jmp 11e0 <__asan_report_store16_asm> 0000000000001640 <__asan_check_load_add_1_RDX>: 1640: 49 89 d2 mov %rdx,%r10 1643: 49 c1 ea 03 shr $0x3,%r10 1647: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 164e: 7f 164f: 45 85 d2 test %r10d,%r10d 1652: 75 01 jne 1655 <.check_load_add_1_RDX> 0000000000001654 <.return_load_add_1_RDX>: 1654: c3 ret 0000000000001655 <.check_load_add_1_RDX>: 1655: 51 push %rcx 1656: 48 89 d1 mov %rdx,%rcx 1659: 83 e1 07 and $0x7,%ecx 165c: 44 39 d1 cmp %r10d,%ecx 165f: 59 pop %rcx 1660: 7c f2 jl 1654 <.return_load_add_1_RDX> 1662: 48 89 d7 mov %rdx,%rdi 1665: e9 e6 fa ff ff jmp 1150 <__asan_report_load1_asm> 000000000000166a <__asan_check_store_add_1_RDX>: 166a: 49 89 d2 mov %rdx,%r10 166d: 49 c1 ea 03 shr $0x3,%r10 1671: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1678: 7f 1679: 45 85 d2 test %r10d,%r10d 167c: 75 01 jne 167f <.check_store_add_1_RDX> 000000000000167e <.return_store_add_1_RDX>: 167e: c3 ret 000000000000167f <.check_store_add_1_RDX>: 167f: 51 push %rcx 1680: 48 89 d1 mov %rdx,%rcx 1683: 83 e1 07 and $0x7,%ecx 1686: 44 39 d1 cmp %r10d,%ecx 1689: 59 pop %rcx 168a: 7c f2 jl 167e <.return_store_add_1_RDX> 168c: 48 89 d7 mov %rdx,%rdi 168f: e9 0c fb ff ff jmp 11a0 <__asan_report_store1_asm> 0000000000001694 <__asan_check_load_add_2_RDX>: 1694: 49 89 d2 mov %rdx,%r10 1697: 49 c1 ea 03 shr $0x3,%r10 169b: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 16a2: 7f 16a3: 45 85 d2 test %r10d,%r10d 16a6: 75 01 jne 16a9 <.check_load_add_2_RDX> 00000000000016a8 <.return_load_add_2_RDX>: 16a8: c3 ret 00000000000016a9 <.check_load_add_2_RDX>: 16a9: 51 push %rcx 16aa: 48 89 d1 mov %rdx,%rcx 16ad: 83 e1 07 and $0x7,%ecx 16b0: 83 c1 01 add $0x1,%ecx 16b3: 44 39 d1 cmp %r10d,%ecx 16b6: 59 pop %rcx 16b7: 7c ef jl 16a8 <.return_load_add_2_RDX> 16b9: 48 89 d7 mov %rdx,%rdi 16bc: e9 9f fa ff ff jmp 1160 <__asan_report_load2_asm> 00000000000016c1 <__asan_check_store_add_2_RDX>: 16c1: 49 89 d2 mov %rdx,%r10 16c4: 49 c1 ea 03 shr $0x3,%r10 16c8: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 16cf: 7f 16d0: 45 85 d2 test %r10d,%r10d 16d3: 75 01 jne 16d6 <.check_store_add_2_RDX> 00000000000016d5 <.return_store_add_2_RDX>: 16d5: c3 ret 00000000000016d6 <.check_store_add_2_RDX>: 16d6: 51 push %rcx 16d7: 48 89 d1 mov %rdx,%rcx 16da: 83 e1 07 and $0x7,%ecx 16dd: 83 c1 01 add $0x1,%ecx 16e0: 44 39 d1 cmp %r10d,%ecx 16e3: 59 pop %rcx 16e4: 7c ef jl 16d5 <.return_store_add_2_RDX> 16e6: 48 89 d7 mov %rdx,%rdi 16e9: e9 c2 fa ff ff jmp 11b0 <__asan_report_store2_asm> 00000000000016ee <__asan_check_load_add_4_RDX>: 16ee: 49 89 d2 mov %rdx,%r10 16f1: 49 c1 ea 03 shr $0x3,%r10 16f5: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 16fc: 7f 16fd: 45 85 d2 test %r10d,%r10d 1700: 75 01 jne 1703 <.check_load_add_4_RDX> 0000000000001702 <.return_load_add_4_RDX>: 1702: c3 ret 0000000000001703 <.check_load_add_4_RDX>: 1703: 51 push %rcx 1704: 48 89 d1 mov %rdx,%rcx 1707: 83 e1 07 and $0x7,%ecx 170a: 83 c1 03 add $0x3,%ecx 170d: 44 39 d1 cmp %r10d,%ecx 1710: 59 pop %rcx 1711: 7c ef jl 1702 <.return_load_add_4_RDX> 1713: 48 89 d7 mov %rdx,%rdi 1716: e9 55 fa ff ff jmp 1170 <__asan_report_load4_asm> 000000000000171b <__asan_check_store_add_4_RDX>: 171b: 49 89 d2 mov %rdx,%r10 171e: 49 c1 ea 03 shr $0x3,%r10 1722: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 1729: 7f 172a: 45 85 d2 test %r10d,%r10d 172d: 75 01 jne 1730 <.check_store_add_4_RDX> 000000000000172f <.return_store_add_4_RDX>: 172f: c3 ret 0000000000001730 <.check_store_add_4_RDX>: 1730: 51 push %rcx 1731: 48 89 d1 mov %rdx,%rcx 1734: 83 e1 07 and $0x7,%ecx 1737: 83 c1 03 add $0x3,%ecx 173a: 44 39 d1 cmp %r10d,%ecx 173d: 59 pop %rcx 173e: 7c ef jl 172f <.return_store_add_4_RDX> 1740: 48 89 d7 mov %rdx,%rdi 1743: e9 78 fa ff ff jmp 11c0 <__asan_report_store4_asm> 0000000000001748 <__asan_check_load_add_8_RDX>: 1748: 49 89 d2 mov %rdx,%r10 174b: 49 c1 ea 03 shr $0x3,%r10 174f: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 1756: 00 1757: 75 01 jne 175a <.fail_load_add_8_RDX> 1759: c3 ret 000000000000175a <.fail_load_add_8_RDX>: 175a: 48 89 d7 mov %rdx,%rdi 175d: e9 1e fa ff ff jmp 1180 <__asan_report_load8_asm> 0000000000001762 <__asan_check_store_add_8_RDX>: 1762: 49 89 d2 mov %rdx,%r10 1765: 49 c1 ea 03 shr $0x3,%r10 1769: 41 80 ba 00 80 ff 7f cmpb $0x0,0x7fff8000(%r10) 1770: 00 1771: 75 01 jne 1774 <.fail_store_add_8_RDX> 1773: c3 ret 0000000000001774 <.fail_store_add_8_RDX>: 1774: 48 89 d7 mov %rdx,%rdi 1777: e9 54 fa ff ff jmp 11d0 <__asan_report_store8_asm> 000000000000177c <__asan_check_load_add_16_RDX>: 177c: 49 89 d2 mov %rdx,%r10 177f: 49 c1 ea 03 shr $0x3,%r10 1783: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 178a: 7f 00 178c: 75 01 jne 178f <.fail_load_add_16_RDX> 178e: c3 ret 000000000000178f <.fail_load_add_16_RDX>: 178f: 48 89 d7 mov %rdx,%rdi 1792: e9 f9 f9 ff ff jmp 1190 <__asan_report_load16_asm> 0000000000001797 <__asan_check_store_add_16_RDX>: 1797: 49 89 d2 mov %rdx,%r10 179a: 49 c1 ea 03 shr $0x3,%r10 179e: 66 41 83 ba 00 80 ff cmpw $0x0,0x7fff8000(%r10) 17a5: 7f 00 17a7: 75 01 jne 17aa <.fail_store_add_16_RDX> 17a9: c3 ret 00000000000017aa <.fail_store_add_16_RDX>: 17aa: 48 89 d7 mov %rdx,%rdi 17ad: e9 2e fa ff ff jmp 11e0 <__asan_report_store16_asm> 00000000000017b2 <__asan_check_load_add_1_RSI>: 17b2: 49 89 f2 mov %rsi,%r10 17b5: 49 c1 ea 03 shr $0x3,%r10 17b9: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 17c0: 7f 17c1: 45 85 d2 test %r10d,%r10d 17c4: 75 01 jne 17c7 <.check_load_add_1_RSI> 00000000000017c6 <.return_load_add_1_RSI>: 17c6: c3 ret 00000000000017c7 <.check_load_add_1_RSI>: 17c7: 51 push %rcx 17c8: 48 89 f1 mov %rsi,%rcx 17cb: 83 e1 07 and $0x7,%ecx 17ce: 44 39 d1 cmp %r10d,%ecx 17d1: 59 pop %rcx 17d2: 7c f2 jl 17c6 <.return_load_add_1_RSI> 17d4: 48 89 f7 mov %rsi,%rdi 17d7: e9 74 f9 ff ff jmp 1150 <__asan_report_load1_asm> 00000000000017dc <__asan_check_store_add_1_RSI>: 17dc: 49 89 f2 mov %rsi,%r10 17df: 49 c1 ea 03 shr $0x3,%r10 17e3: 45 0f be 92 00 80 ff movsbl 0x7fff8000(%r10),%r10d 17ea: 7f 17eb: 45 85 d2 test %r10d,%r10d 17ee: 75 01 jne 17f1 <.check_store_add_1_RSI> 00000000000017f0 <.return_store_add_1_RSI>: 17f0: c3 ret 00000000000017f1 <.check_store_add_1_RSI>: 17f1: 51 push %rcx 17f2: 48 89 f1 mov %rsi,%rcx 17f5: 83 e1 07 and $0x7,%ecx 17f8: 44 39 d1 cmp %r10d,%ecx 17fb: 59 pop %rcx 17fc: 7c f2 jl 17f0 <.return_store_add_1_RSI> 17fe: 48 rex.W 17ff: 89 .byte 0x89 KDAB-hotspot-41e5de7/tests/modeltests/tst_callgraphgenerator.cpp000066400000000000000000000054441515036260400251310ustar00rootroot00000000000000#include "callgraphgenerator.h" #include #include #include #include #include #include "../../src/parsers/perf/perfparser.h" #include "../testutils.h" #include "data.h" class TestCallgraphGenerator : public QObject { Q_OBJECT public: using QObject::QObject; private slots: void testParent() { auto results = callerCalleeResults(s_fileName); QVERIFY(!callerCalleeResults(s_fileName).entries.empty()); auto key = Data::Symbol(); for (auto it = results.entries.cbegin(); it != results.entries.cend(); it++) { if (it.key().symbol == QLatin1String("test")) { key = it.key(); break; } } QString test; QTextStream stream(&test); QHash lookup; resultsToDot(3, Direction::Caller, key, results, {}, stream, lookup, 0.4 / 100.f); int parent3Pos = test.indexOf(QLatin1String("parent3")); int parent2Pos = test.indexOf(QLatin1String("parent2")); int parent1Pos = test.indexOf(QLatin1String("parent1")); QVERIFY(parent3Pos < parent2Pos); QVERIFY(parent2Pos < parent1Pos); } void testChild() { auto results = callerCalleeResults(s_fileName); QVERIFY(!callerCalleeResults(s_fileName).entries.empty()); auto key = Data::Symbol(); for (auto it = results.entries.cbegin(); it != results.entries.cend(); it++) { if (it.key().symbol == QLatin1String("test")) { key = it.key(); break; } } QString test; QTextStream stream(&test); QHash lookup; resultsToDot(3, Direction::Callee, key, results, {}, stream, lookup, 0.4 / 100.f); int child1Pos = test.indexOf(QLatin1String("child1")); int child2Pos = test.indexOf(QLatin1String("child2")); QVERIFY(child1Pos < child2Pos); } private: Data::CallerCalleeResults callerCalleeResults(const QString& filename) { const QByteArray perfparserPath = QCoreApplication::applicationDirPath().toUtf8() + QByteArrayLiteral("/perfparser"); qputenv("HOTSPOT_PERFPARSER", perfparserPath); PerfParser parser(this); QSignalSpy parsingFinishedSpy(&parser, &PerfParser::parsingFinished); QSignalSpy parsingFailedSpy(&parser, &PerfParser::parsingFailed); parser.startParseFile(filename); VERIFY_OR_THROW(parsingFinishedSpy.wait(6000)); COMPARE_OR_THROW(parsingFailedSpy.count(), 0); return parser.callerCalleeResults(); } const QString s_fileName = QFINDTESTDATA("callgraph.perfparser"); }; QTEST_GUILESS_MAIN(TestCallgraphGenerator) #include "tst_callgraphgenerator.moc" KDAB-hotspot-41e5de7/tests/modeltests/tst_disassemblyoutput.cpp000066400000000000000000000432771515036260400250730ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Darya Knysh SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include #include #include #include #include #include "../testutils.h" inline QString findLib(const QString& name) { QFileInfo lib(QCoreApplication::applicationDirPath() + QLatin1String("/../tests/modeltests/%1").arg(name)); return lib.canonicalFilePath(); } class TestDisassemblyOutput : public QObject { Q_OBJECT public: using QObject::QObject; private slots: void initTestCase() { qRegisterMetaType(); mObjdumpBinary = QStandardPaths::findExecutable(QStringLiteral("objdump")); if (mObjdumpBinary.isEmpty()) QSKIP("cannot use disassembly without objdump binary"); } void testSymbol_data() { QTest::addColumn("symbol"); Data::Symbol symbol = {QStringLiteral("__cos_fma"), 4294544, 2093, QStringLiteral("vector_static_gcc/vector_static_gcc_v9.1.0"), QStringLiteral("/home/milian/projects/kdab/rnd/hotspot/3rdparty/perfparser/tests/auto/" "perfdata/vector_static_gcc/vector_static_gcc_v9.1.0"), QStringLiteral("/home/milian/projects/kdab/rnd/hotspot/3rdparty/perfparser/tests/auto/" "perfdata/vector_static_gcc/vector_static_gcc_v9.1.0")}; QTest::newRow("curSymbol") << symbol; } void testSymbol() { QFETCH(Data::Symbol, symbol); const auto actualBinaryFile = QFINDTESTDATA(symbol.binary); symbol.actualPath = actualBinaryFile; QVERIFY(!actualBinaryFile.isEmpty() && QFile::exists(actualBinaryFile)); const auto actualOutputFile = QString(actualBinaryFile + QLatin1String(".actual.txt")); QFile actual(actualOutputFile); QVERIFY(actual.open(QIODevice::WriteOnly | QIODevice::Text)); QTextStream disassemblyStream(&actual); const auto disassemblyOutput = DisassemblyOutput::disassemble(mObjdumpBinary, QStringLiteral("x86_64"), {}, {}, {}, {}, symbol); for (const auto& disassemblyLine : disassemblyOutput.disassemblyLines) { disassemblyStream << Qt::hex << disassemblyLine.addr << '\t' << disassemblyLine.disassembly << '\n'; } actual.close(); QString actualText; { QVERIFY(actual.open(QIODevice::ReadOnly | QIODevice::Text)); actualText = QString::fromUtf8(actual.readAll()); } const auto expectedOutputFile = patch_expected_file(actualText, actualBinaryFile); QString expectedText; { QFile expected(expectedOutputFile); QVERIFY(expected.open(QIODevice::ReadOnly | QIODevice::Text)); expectedText = QString::fromUtf8(expected.readAll()); } if (actualText != expectedText) { const auto diff = QStandardPaths::findExecutable(QStringLiteral("diff")); if (!diff.isEmpty()) { QProcess::execute(diff, {QStringLiteral("-u"), expectedOutputFile, actualOutputFile}); } } QCOMPARE(actualText, expectedText); } QString patch_expected_file(const QString& actualText, const QString& actualBinaryFile) { bool jmpPatch = !actualText.contains(QLatin1String("jmpq")); bool nopwPatch = !actualText.contains(QLatin1String("cs nopw")); if (!jmpPatch && !nopwPatch) { return actualBinaryFile + QLatin1String(".expected.txt"); } auto file = new QTemporaryFile(this); file->open(); auto text = actualText; if (jmpPatch) { text.replace(QLatin1String("jmpq"), QLatin1String("jmp")); text.replace(QLatin1String("retq"), QLatin1String("ret")); text.replace(QLatin1String("callq"), QLatin1String("call")); } if (nopwPatch) { text.replace(QLatin1String("cs nopw 0x"), QLatin1String("nopw %cs:0x")); } file->write(text.toUtf8()); file->flush(); return file->fileName(); } void testCustomDebugPath_data() { QTest::addColumn("searchPath"); const auto lib = QFileInfo(findLib(QStringLiteral("libfib.so"))); QVERIFY(lib.exists()); QTest::newRow("file in dir") << QStringList(lib.absolutePath()); QDir parentDir(lib.dir().path() + QDir::separator() + QStringLiteral("..")); QTest::newRow("find file in subdir") << QStringList(parentDir.absolutePath()); } void testCustomDebugPath() { const Data::Symbol symbol = {QStringLiteral("fib(int)"), 4361, 67, QStringLiteral("libfib.so")}; auto result = DisassemblyOutput::disassemble(mObjdumpBinary, {}, {}, {}, {}, {}, symbol); QVERIFY(!result.errorMessage.isEmpty()); QVERIFY(result.errorMessage.contains(QLatin1String("Could not find binary"))); QFETCH(QStringList, searchPath); result = DisassemblyOutput::disassemble(mObjdumpBinary, {}, QStringList(searchPath), {}, {}, {}, symbol); QVERIFY(result.errorMessage.isEmpty()); result = DisassemblyOutput::disassemble(mObjdumpBinary, {}, {}, QStringList(searchPath), {}, {}, symbol); QVERIFY(result.errorMessage.isEmpty()); } void testCustomSourceCodePath() { QTemporaryDir tempDir; QVERIFY(tempDir.isValid()); QDir parent(tempDir.path()); QVERIFY(parent.mkdir(QStringLiteral("liba"))); QVERIFY(parent.mkdir(QStringLiteral("libb"))); auto createFile = [tempPath = tempDir.path()](const QString& path) { QFile file(tempPath + QDir::separator() + path); file.open(QIODevice::WriteOnly); file.write("test"); file.close(); }; createFile(QStringLiteral("liba/lib.c")); createFile(QStringLiteral("libb/lib.c")); // check if the correct lib.c is found in sourceCodePaths QCOMPARE(findSourceCodeFile(QStringLiteral("/home/test/liba/lib.c"), {tempDir.path()}, QString()), tempDir.path() + QDir::separator() + QStringLiteral("liba/lib.c")); // check if fallback is working if it is not found QCOMPARE(findSourceCodeFile(QStringLiteral("/home/test/liba/lib.c"), {}, QString()), QStringLiteral("/home/test/liba/lib.c")); // test if relative paths are working QCOMPARE(findSourceCodeFile(QStringLiteral("./liba/lib.c"), {tempDir.path()}, QString()), tempDir.path() + QDir::separator() + QStringLiteral("liba/lib.c")); } /* tests for check results via error messages, note: as they are formatted and may be changed later, we check for the components separately */ void testDisassembleChecks() { const auto libName = QStringLiteral("libfib.so"); const auto lib = QFileInfo(findLib(libName)); QVERIFY(lib.exists()); const auto libPath = lib.absoluteFilePath(); QString message; // test for empty symbol message = dissassembleErrorMessage(mObjdumpBinary, {}, 4361, 67, libPath); QVERIFY(message.contains(QLatin1String("Empty symbol"))); QVERIFY(message.contains(QLatin1String("??"))); // test for unknown details message = dissassembleErrorMessage(mObjdumpBinary, QStringLiteral("fib(int)"), 0, 67, libPath); QVERIFY(message.contains(QLatin1String("unknown details"))); QVERIFY(message.contains(QLatin1String("fib(int)"))); message = dissassembleErrorMessage(mObjdumpBinary, QStringLiteral("fib(int)"), 4361, 0, libPath); QVERIFY(message.contains(QLatin1String("unknown details"))); QVERIFY(message.contains(QLatin1String("fib(int)"))); // test for missing objdump const auto badObjdump = QStringLiteral("banana"); message = dissassembleErrorMessage(badObjdump, QStringLiteral("fib(int)"), 4361, 67, libName); QVERIFY(message.contains(QLatin1String("Cannot find objdump process"))); QVERIFY(message.contains(badObjdump)); } void testDetectBranches() { if (!supportsVisualizeJumps()) { QSKIP("--visualize-jumps is not supported"); } const auto lib = QFileInfo(findLib(QStringLiteral("libfib.so"))); auto [address, size] = findAddressAndSizeOfFunc(lib.absoluteFilePath(), QStringLiteral("_Z3fibi")); const auto symbol = Data::Symbol {QStringLiteral("fib(int)"), address, size, QStringLiteral("libfib.so")}; const auto result = DisassemblyOutput::disassemble(mObjdumpBinary, {}, QStringList {lib.absolutePath()}, {}, {}, {}, symbol); QVERIFY(result.errorMessage.isEmpty()); auto isValidVisualisationCharacter = [](QChar character) { const static auto validCharacters = std::initializer_list {QLatin1Char(' '), QLatin1Char('\t'), QLatin1Char('|'), QLatin1Char('/'), QLatin1Char('\\'), QLatin1Char('-'), QLatin1Char('>'), QLatin1Char('+'), QLatin1Char('X'), QLatin1Char(','), QLatin1Char('\'')}; return std::any_of(validCharacters.begin(), validCharacters.end(), [character](auto validCharacter) { return character == validCharacter; }); }; auto isValidHexdumpCharacter = [](QChar character) { const static auto validCharacters = std::initializer_list { QLatin1Char(' '), QLatin1Char('0'), QLatin1Char('1'), QLatin1Char('2'), QLatin1Char('3'), QLatin1Char('4'), QLatin1Char('5'), QLatin1Char('6'), QLatin1Char('7'), QLatin1Char('8'), QLatin1Char('9'), QLatin1Char('a'), QLatin1Char('b'), QLatin1Char('c'), QLatin1Char('d'), QLatin1Char('e'), QLatin1Char('f')}; return std::any_of(validCharacters.begin(), validCharacters.end(), [character](auto validCharacter) { return character == validCharacter; }); }; for (const auto& line : result.disassemblyLines) { QVERIFY(!line.branchVisualisation.isEmpty()); // check that we only captures valid visualisation characters QVERIFY(std::all_of(line.branchVisualisation.cbegin(), line.branchVisualisation.cend(), isValidVisualisationCharacter)); QVERIFY(std::all_of(line.hexdump.cbegin(), line.hexdump.cend(), isValidHexdumpCharacter)); // Check that address is valid QVERIFY(line.addr >= address && line.addr < address + size); } } void testParse_data() { QTest::addColumn("file"); QTest::addColumn("mainSourceFileName"); QTest::addColumn("numLines"); QTest::addColumn("minAddr"); QTest::addColumn("maxAddr"); QTest::addRow("objdump.txt") << QFINDTESTDATA("disassembly/objdump.txt") << QStringLiteral("/home/milian/projects/kdab/rnd/hotspot/tests/test-clients/cpp-inlining/main.cpp") << 227 << quint64(0x1970) << quint64(0x1c60); QTest::addRow("objdump2.txt") << QFINDTESTDATA("disassembly/objdump2.txt") << QString() << 505 << quint64(0x1020) << quint64(0x17ff); QTest::addRow("objdump.indexed_start_internal.txt") << QFINDTESTDATA("disassembly/objdump.indexed_start_internal.txt") << QStringLiteral( "/mnt/d/Programme/Entwicklung/GnuCOBOL/code_repo_fix/branches/gnucobol-3.x/libcob/fileio.c") << 654 << quint64(0x42ed3) << quint64(0x4383f); } void testParse() { QFETCH(QString, file); QFETCH(QString, mainSourceFileName); QFETCH(int, numLines); QFETCH(quint64, minAddr); QFETCH(quint64, maxAddr); QVERIFY(minAddr < maxAddr); auto dataFile = QFile(file); QVERIFY(dataFile.open(QFile::Text | QFile::ReadOnly)); const auto parsed = DisassemblyOutput::objdumpParse(dataFile.readAll()); QCOMPARE(parsed.mainSourceFileName, mainSourceFileName); QCOMPARE(parsed.disassemblyLines.size(), numLines); auto checkForMultiLineInstruction = [](const QString& lastDisasm) { // some instructions translate to multiple lines // like 66 41 83 ba 00 80 ff 7f 00 which translates to: // 0: 66 41 83 ba 00 80 ff cmp WORD PTR [r10+0x7fff8000],0x0 // 7: 7f 00 const auto multiLineOpcodes = { QLatin1String("movsbl"), QLatin1String("compb"), QLatin1String("movsd"), QLatin1String("%fs"), QLatin1String("movabs"), QLatin1String("cs nopw"), QLatin1String("cmpq"), QLatin1String("cmpb"), QLatin1String("cmpw"), QLatin1String("lea 0x0")}; return std::any_of(multiLineOpcodes.begin(), multiLineOpcodes.end(), [lastDisasm](const auto& opcode) { return lastDisasm.contains(opcode); }); }; QString lastOpcode; for (const auto& line : parsed.disassemblyLines) { if (line.fileLine.file.isEmpty()) { QCOMPARE(line.fileLine.line, -1); } else { QVERIFY(line.fileLine.line > 0); } if (line.addr) { QVERIFY(line.addr >= minAddr); QVERIFY(line.addr <= maxAddr); QVERIFY(!line.disassembly.isEmpty() || (line.disassembly.isEmpty() && checkForMultiLineInstruction(lastOpcode))); if (!line.branchVisualisation.isEmpty()) { QVERIFY(std::all_of(line.branchVisualisation.begin(), line.branchVisualisation.end(), [](QChar c) { return QLatin1String(" |\\/->+X").contains(c); })); } lastOpcode = line.disassembly; } else { QVERIFY(line.branchVisualisation.isEmpty()); } } } void testCanDisassemble_data() { QTest::addColumn("symbol"); QTest::addColumn("canDisassemble"); QTest::newRow("normal symbol") << Data::Symbol(QStringLiteral("main"), 0x1159, 0x32805, {}, QStringLiteral("/some/path"), {}, false, false) << true; QTest::newRow("relocated symbol") << Data::Symbol(QStringLiteral("printf"), 0, 0, {}, QStringLiteral("/some/path"), {}, false, false) << false; QTest::newRow("inlined symbol") << Data::Symbol(QStringLiteral("main::memcpy"), 0x1159, 0x32805, {}, QStringLiteral("/some/path"), {}, false, true) << false; QTest::newRow("unkown binary") << Data::Symbol(QStringLiteral("main"), 0x1159, 0x32805, {}, {}, {}, false, false) << false; } void testCanDisassemble() { QFETCH(Data::Symbol, symbol); QFETCH(bool, canDisassemble); QCOMPARE(symbol.canDisassemble(), canDisassemble); } private: struct FunctionData { quint64 address; quint64 size; }; static FunctionData findAddressAndSizeOfFunc(const QString& library, const QString& name) { QRegularExpression regex(QStringLiteral("[ ]+[0-9]+: ([0-9a-f]+)[ ]+([0-9]+)[0-9 a-zA-Z]+%1\\n").arg(name)); const auto readelfBinary = QStandardPaths::findExecutable(QStringLiteral("readelf")); VERIFY_OR_THROW(!readelfBinary.isEmpty()); QProcess readelf; readelf.setProgram(readelfBinary); readelf.setArguments({QStringLiteral("-s"), library}); readelf.start(); VERIFY_OR_THROW(readelf.waitForFinished()); const auto output = readelf.readAllStandardOutput(); VERIFY_OR_THROW(!output.isEmpty()); auto match = regex.match(QString::fromUtf8(output)); VERIFY_OR_THROW(match.hasMatch()); bool ok = false; const quint64 address = match.captured(1).toULongLong(&ok, 16); VERIFY_OR_THROW(ok); const quint64 size = match.captured(2).toULongLong(&ok, 10); VERIFY_OR_THROW(ok); return {address, size}; } bool supportsVisualizeJumps() { QProcess process; process.setProcessChannelMode(QProcess::ForwardedErrorChannel); process.start(mObjdumpBinary, {QStringLiteral("-H")}); if (!process.waitForFinished(1000)) { qWarning() << "failed to query objdump output"; return false; } const auto help = process.readAllStandardOutput(); return help.contains("--visualize-jumps"); } QString dissassembleErrorMessage(const QString& objdump, const QString& symbolDeclaration, const quint64 offset, const quint64 size, const QString& library) { const auto symbol = Data::Symbol {symbolDeclaration, offset, size, library}; return DisassemblyOutput::disassemble(objdump, {}, {}, {}, {}, {}, symbol).errorMessage; } QString mObjdumpBinary; }; QTEST_GUILESS_MAIN(TestDisassemblyOutput) #include "tst_disassemblyoutput.moc" KDAB-hotspot-41e5de7/tests/modeltests/tst_formatting.cpp000066400000000000000000000211241515036260400234300ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include "../testutils.h" #include #if KFSyntaxHighlighting_FOUND #include #include #endif Q_DECLARE_METATYPE(QVector) class TestFormatting : public QObject { Q_OBJECT private slots: void testRemoveAnsi_data() { QTest::addColumn("ansiString"); QTest::addColumn("ansiFreeString"); QTest::addRow("no ansi sequence") << QStringLiteral("[30m A B [0m C") << QStringLiteral("[30m A B [0m C"); QTest::addRow("color codes") << QStringLiteral( "\033[30m A \033[31m B \033[32m C \033[33m D \033[0m\033[34m E \033[35m F \033[36m G \033[37m H \033[0m") << QStringLiteral(" A B C D E F G H "); QTest::addRow("complex ansi codes") << QStringLiteral("\033[40;1m A \033[41;1m B \033[42;1m C \033[43;1m D \033[0m") << QStringLiteral(" A B C D "); } void testRemoveAnsi() { QFETCH(QString, ansiString); QFETCH(QString, ansiFreeString); QCOMPARE(Util::removeAnsi(ansiString), ansiFreeString); } void testFormattingValidAnsiSequences_data() { QTest::addColumn("ansiStrings"); QTest::addColumn>>("formatting"); QTest::addRow("no ansi sequence") << QStringList {QStringLiteral(" A B C D E ")} << QVector> {{{0, 15, {}}}}; // only default formatting QTest::addRow("one ansi sequence") << QStringList {QStringLiteral("\u001B[33mHello World\u001B[0m")} << QVector> {{{0, 11, {}}}}; QTest::addRow("two ansi sequences") << QStringList {QStringLiteral("\u001B[33mHello\u001B[0m \u001B[31mWorld\u001B[0m")} << QVector> {{{0, 5, {}}, {6, 5, {}}}}; QTest::addRow("two ansi lines") << QStringList {QStringLiteral("\u001B[33mHello\u001B[0m\n"), QStringLiteral("\u001B[31mWorld\u001B[0m")} << QVector> {{{0, 5, {}}}, {{0, 5, {}}}}; } void testFormattingValidAnsiSequences() { QFETCH(QStringList, ansiStrings); QFETCH(QVector>, formatting); HighlightedText highlighter(nullptr); highlighter.setText(ansiStrings); for (int ansiStringIndex = 0; ansiStringIndex < ansiStrings.count(); ansiStringIndex++) { auto layout = highlighter.layoutForLine(ansiStringIndex); QVERIFY(layout); auto format = layout->formats(); QCOMPARE(format.size(), formatting[ansiStringIndex].size()); for (int i = 0; i < format.size(); i++) { auto& formattingLine = formatting[ansiStringIndex]; QCOMPARE(format[i].start, formattingLine[i].start); QCOMPARE(format[i].length, formattingLine[i].length); } } } void testFormatTimeString_data() { QTest::addColumn("nanoseconds"); QTest::addColumn("shortForm"); QTest::addColumn("formattedString"); QTest::addRow("123ns") << static_cast(123) << false << "123ns"; QTest::addRow("1.234µs") << static_cast(1234) << false << "001.234µs"; QTest::addRow("12.345µs") << static_cast(12345) << false << "012.345µs"; QTest::addRow("123.456µs") << static_cast(123456) << false << "123.456µs"; QTest::addRow("1.234ms") << static_cast(1234567) << false << "001.234ms"; QTest::addRow("12.345ms") << static_cast(12345678) << false << "012.345ms"; QTest::addRow("123.456ms") << static_cast(123456789) << false << "123.456ms"; QTest::addRow("1.234s") << static_cast(1234567892) << false << "01.234s"; QTest::addRow("12.345s") << static_cast(12345678920) << false << "12.345s"; // 123.456789203s = 120s + 3.456789203s = 2min 3.456s QTest::addRow("123.456s") << static_cast(123456789203) << false << "2min 03.456s"; // 1234.567892035s = 1200s + 34.567892035s = 20min 34.567s QTest::addRow("1234.567s") << static_cast(1234567892035) << false << "20min 34.567s"; // 12345.678920357s = 12300s + 45.678920357s = 205min 45.678s = 3h 25min 45.678s QTest::addRow("12345.678s") << static_cast(12345678920357) << false << "3h 25min 45.678s"; // 123456.789203574s = 123420s + 36.789203574s = 2057min 36.789s = 34h 17min 36.789s = 1d 10h 17min 36.789s QTest::addRow("123456.789s") << static_cast(123456789203574) << false << "1d 10h 17min 36.789s"; QTest::addRow("short: 123ns") << static_cast(123) << true << "123ns"; QTest::addRow("short: 1.234µs") << static_cast(1234) << true << "1µs"; QTest::addRow("short: 12.345µs") << static_cast(12345) << true << "12µs"; QTest::addRow("short: 123.456µs") << static_cast(123456) << true << "123µs"; QTest::addRow("short: 1.234ms") << static_cast(1234567) << true << "1ms"; QTest::addRow("short: 12.345ms") << static_cast(12345678) << true << "12ms"; QTest::addRow("short: 123.456ms") << static_cast(123456789) << true << "123ms"; QTest::addRow("short: 1.234s") << static_cast(1234567892) << true << "1s"; QTest::addRow("short: 12.345s") << static_cast(12345678920) << true << "12s"; // 123.456789203s = 120s + 3.456789203s = 2min 3.456s QTest::addRow("short: 123.456s") << static_cast(123456789203) << true << "2min 3s"; // 1234.567892035s = 1200s + 34.567892035s = 20min 34.567s QTest::addRow("short: 1234.567s") << static_cast(1234567892035) << true << "20min 34s"; // 12345.678920357s = 12300s + 45.678920357s = 205min 45.678s = 3h 25min 45.678s QTest::addRow("short: 12345.678s") << static_cast(12345678920357) << true << "3h 25min 45s"; // 123456.789203574s = 123420s + 36.789203574s = 2057min 36.789s = 34h 17min 36.789s = 1d 10h 17min 36.789s QTest::addRow("short: 123456.789s") << static_cast(123456789203574) << true << "1d 10h 17min 36s"; } void testFormatTimeString() { QFETCH(quint64, nanoseconds); QFETCH(bool, shortForm); QFETCH(QString, formattedString); QCOMPARE(Util::formatTimeString(nanoseconds, shortForm), formattedString); } void testMultilineHighlighting() { #if KFSyntaxHighlighting_FOUND const auto testfunc = QStringList({QStringLiteral("int test() {"), QStringLiteral("/* A"), QStringLiteral(" * very"), QStringLiteral(" * long"), QStringLiteral(" * comment */"), QStringLiteral("return 0;"), QStringLiteral("}")}); auto repository = std::make_unique(); HighlightedText text(repository.get()); text.setText(testfunc); text.setDefinition(repository->definitionForFileName(QStringLiteral("test.cpp"))); // get formatting for line 2 (first commented line) const auto formats = text.layoutForLine(1)->formats(); Q_ASSERT(!formats.empty()); const auto commentFormat = formats[0].format; // ensure all other lines have the same format for (int line = 2; line < 5; line++) { const auto formats = text.layoutForLine(line)->formats(); for (const auto& format : formats) { QCOMPARE(format.format, commentFormat); } } { // ensure that the last line (return 0;) is not formatted in the comment style const auto formats = text.layoutForLine(5)->formats(); for (const auto& format : formats) { QVERIFY(format.format != commentFormat); } } #else QSKIP("Test requires KSyntaxHighlighting"); #endif // KFSyntaxHighlighting_FOUND } }; HOTSPOT_GUITEST_MAIN(TestFormatting) #include "tst_formatting.moc" KDAB-hotspot-41e5de7/tests/modeltests/tst_models.cpp000066400000000000000000001255651515036260400225570ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include #include #include #include "../testutils.h" #include "search.h" #include #include #include namespace { Data::BottomUpResults buildBottomUpTree(const QByteArray& stacks) { Data::BottomUpResults ret; ret.costs.addType(0, QStringLiteral("samples"), Data::Costs::Unit::Unknown); ret.root.symbol = {QStringLiteral(""), {}}; const auto& lines = stacks.split('\n'); QHash ids; quint32 maxId = 0; for (const auto& line : lines) { auto trimmed = line.trimmed(); if (trimmed.isEmpty()) { continue; } const auto& frames = trimmed.split(';'); auto* parent = &ret.root; for (auto it = frames.rbegin(), end = frames.rend(); it != end; ++it) { const auto& frame = *it; const auto symbol = Data::Symbol {QString::fromUtf8(frame), {}}; auto node = parent->entryForSymbol(symbol, &maxId); VERIFY_OR_THROW(!ids.contains(node->id) || ids[node->id] == symbol); ids[node->id] = symbol; ret.costs.increment(0, node->id); parent = node; } ret.costs.incrementTotal(0); } Data::BottomUp::initializeParents(&ret.root); return ret; } Data::BottomUpResults generateTree1() { return buildBottomUpTree(R"( A;B;C A;B;D A;B;D A;B;C;E A;B;C;E;C A;B;C;E;C;E A;B;C;C C C )"); } Data::BottomUpResults generateTreeByThread() { return buildBottomUpTree(R"( A;B;C;T1 A;B;D;T1 A;B;D;T2 A;B;C;E;T1 A;B;C;E;C;T1 A;B;C;E;C;E;T1 A;B;C;C;T1 C;T1 C;T2 )"); } } class TestModels : public QObject { Q_OBJECT public: using QObject::QObject; private slots: void testTreeParents() { const auto tree = generateTree1(); QVERIFY(!tree.root.parent); for (const auto& firstLevel : tree.root.children) { QVERIFY(!firstLevel.parent); for (const auto& secondLevel : firstLevel.children) { QCOMPARE(secondLevel.parent, &firstLevel); } } } void testBottomUpModel() { const auto tree = generateTree1(); QCOMPARE(tree.costs.totalCost(0), qint64(9)); const auto expectedTree = QStringList { QStringLiteral("C=5"), QStringLiteral(" B=1"), QStringLiteral(" A=1"), QStringLiteral(" E=1"), QStringLiteral(" C=1"), QStringLiteral(" B=1"), QStringLiteral(" A=1"), QStringLiteral(" C=1"), QStringLiteral(" B=1"), QStringLiteral(" A=1"), QStringLiteral("D=2"), QStringLiteral(" B=2"), QStringLiteral(" A=2"), QStringLiteral("E=2"), QStringLiteral(" C=2"), QStringLiteral(" B=1"), QStringLiteral(" A=1"), QStringLiteral(" E=1"), QStringLiteral(" C=1"), QStringLiteral(" B=1"), QStringLiteral(" A=1")}; QCOMPARE(printTree(tree), expectedTree); BottomUpModel model; QAbstractItemModelTester tester(&model); model.setData(tree); } void testSimplifiedModel() { const auto tree = buildBottomUpTree(R"( 4;3;2;1 5;3;2;1 9;8;7;6 11;10;7;6 12;7;6 13;6 14 )"); QCOMPARE(tree.root.children.size(), 3); const auto i1 = &tree.root.children.first(); QCOMPARE(i1->symbol.symbol, QStringLiteral("1")); QCOMPARE(i1->children.size(), 1); const auto i2 = &i1->children.first(); QCOMPARE(i2->symbol.symbol, QStringLiteral("2")); QCOMPARE(i2->children.size(), 1); const auto i3 = &i2->children.first(); QCOMPARE(i3->symbol.symbol, QStringLiteral("3")); QCOMPARE(i3->children.size(), 2); const auto i4 = &i3->children.first(); QCOMPARE(i4->symbol.symbol, QStringLiteral("4")); QCOMPARE(i4->children.size(), 0); const auto i5 = &i3->children.last(); QCOMPARE(i5->symbol.symbol, QStringLiteral("5")); QCOMPARE(i5->children.size(), 0); BottomUpModel model; model.setSimplify(true); QAbstractItemModelTester tester(&model); model.setData(tree); QCOMPARE(model.rowCount(), 3); const auto i1_idx = model.indexFromItem(i1, 0); QVERIFY(i1_idx.isValid()); QCOMPARE(i1_idx, model.index(0, 0)); QCOMPARE(model.parent(i1_idx), QModelIndex()); QCOMPARE(model.itemFromIndex(i1_idx), i1); QCOMPARE(model.rowCount(i1_idx), 2); // simplified const auto i2_idx = model.indexFromItem(i2, 0); QVERIFY(i2_idx.isValid()); QCOMPARE(i2_idx, model.index(0, 0, i1_idx)); QCOMPARE(model.parent(i2_idx), i1_idx); QCOMPARE(model.itemFromIndex(i2_idx), i2); QCOMPARE(model.rowCount(i2_idx), 0); // simplified const auto i3_idx = model.indexFromItem(i3, 0); QVERIFY(i3_idx.isValid()); QCOMPARE(i3_idx, model.index(1, 0, i1_idx)); QCOMPARE(model.parent(i3_idx), i1_idx); QCOMPARE(model.itemFromIndex(i3_idx), i3); QCOMPARE(model.rowCount(i3_idx), 2); const auto i4_idx = model.indexFromItem(i4, 0); QVERIFY(i4_idx.isValid()); QCOMPARE(i4_idx, model.index(0, 0, i3_idx)); QCOMPARE(model.parent(i4_idx), i3_idx); QCOMPARE(model.itemFromIndex(i4_idx), i4); QCOMPARE(model.rowCount(i4_idx), 0); const auto i5_idx = model.indexFromItem(i5, 0); QVERIFY(i5_idx.isValid()); QCOMPARE(i5_idx, model.index(1, 0, i3_idx)); QCOMPARE(model.parent(i5_idx), i3_idx); QCOMPARE(model.itemFromIndex(i5_idx), i5); QCOMPARE(model.rowCount(i5_idx), 0); const auto modelData = printModel(&model); QTextStream str(stdout); for (const auto& l : modelData) str << l << '\n'; const auto expectedModelData = QStringList { // clang-format: off QStringLiteral("1"), QStringLiteral(" 2"), QStringLiteral(" ↪3"), QStringLiteral(" 4"), QStringLiteral(" 5"), QStringLiteral("6"), QStringLiteral(" 7"), QStringLiteral(" 8"), QStringLiteral(" 9"), QStringLiteral(" 10"), QStringLiteral(" 11"), QStringLiteral(" 12"), QStringLiteral(" 13"), QStringLiteral("14"), // clang-format: on }; QCOMPARE(modelData, expectedModelData); } void testTopDownModel_data() { QTest::addColumn("skipFirstLevel"); QTest::addColumn("expectedTree"); QTest::addRow("normal") << false << QStringList {QStringLiteral("A=s:0,i:7"), QStringLiteral(" B=s:0,i:7"), QStringLiteral(" C=s:1,i:5"), QStringLiteral(" E=s:1,i:3"), QStringLiteral(" C=s:1,i:2"), QStringLiteral(" E=s:1,i:1"), QStringLiteral(" C=s:1,i:1"), QStringLiteral(" D=s:2,i:2"), QStringLiteral("C=s:2,i:2")}; QTest::addRow("skipFirstLevel") << true << QStringList { QStringLiteral("T1=s:0,i:7"), QStringLiteral(" A=s:0,i:6"), QStringLiteral(" B=s:0,i:6"), QStringLiteral(" C=s:1,i:5"), QStringLiteral(" E=s:1,i:3"), QStringLiteral(" C=s:1,i:2"), QStringLiteral(" E=s:1,i:1"), QStringLiteral(" C=s:1,i:1"), QStringLiteral(" D=s:1,i:1"), QStringLiteral(" C=s:1,i:1"), QStringLiteral("T2=s:0,i:2"), QStringLiteral(" A=s:0,i:1"), QStringLiteral(" B=s:0,i:1"), QStringLiteral(" D=s:1,i:1"), QStringLiteral(" C=s:1,i:1"), }; } void testTopDownModel() { QFETCH(bool, skipFirstLevel); QFETCH(QStringList, expectedTree); const auto bottomUpTree = skipFirstLevel ? generateTreeByThread() : generateTree1(); const auto tree = Data::TopDownResults::fromBottomUp(bottomUpTree, skipFirstLevel); QCOMPARE(tree.inclusiveCosts.totalCost(0), qint64(9)); QCOMPARE(tree.selfCosts.totalCost(0), qint64(9)); QTextStream(stdout) << "Actual:\n" << printTree(tree).join(QLatin1Char('\n')) << "\nExpected:\n" << expectedTree.join(QLatin1Char('\n')) << "\n"; QCOMPARE(printTree(tree), expectedTree); TopDownModel model; QAbstractItemModelTester tester(&model); model.setData(tree); } void testTopProxy() { BottomUpModel model; TopProxy proxy; QAbstractItemModelTester tester(&proxy); const auto data = generateTree1(); model.setData(data); proxy.setSourceModel(&model); QCOMPARE(proxy.rowCount(), model.rowCount()); QCOMPARE(proxy.columnCount(), 3); for (auto i = 0, c = proxy.rowCount(); i < c; ++i) { auto index = proxy.index(i, 0, {}); QVERIFY(index.isValid()); QVERIFY(!proxy.rowCount(index)); } } void testCallerCalleeModel() { const auto tree = generateTree1(); Data::CallerCalleeResults results; Data::callerCalleesFromBottomUpData(tree, &results); const QStringList expectedMap = { QStringLiteral("A=s:0,i:7"), QStringLiteral("A>B=7"), QStringLiteral("B=s:0,i:7"), QStringLiteral("BC=5"), QStringLiteral("B>D=2"), QStringLiteral("C=s:5,i:7"), QStringLiteral("CC=1"), QStringLiteral("C>E=3"), QStringLiteral("D=s:2,i:2"), QStringLiteral("DC=2"), }; QTextStream(stdout) << "Actual:\n" << printMap(results).join(QLatin1Char('\n')) << "\n\nExpected:\n" << expectedMap.join(QLatin1Char('\n')) << "\n"; QCOMPARE(printMap(results), expectedMap); CallerCalleeModel model; QAbstractItemModelTester tester(&model); model.setResults(results); QTextStream(stdout) << "\nActual Model:\n" << printCallerCalleeModel(model).join(QLatin1Char('\n')) << "\n"; QCOMPARE(printCallerCalleeModel(model), expectedMap); for (const auto& entry : std::as_const(results.entries)) { { CallerModel model; QAbstractItemModelTester tester(&model); model.setResults(entry.callers, results.selfCosts); } { CalleeModel model; QAbstractItemModelTester tester(&model); model.setResults(entry.callees, results.selfCosts); } { SourceMapModel model; QAbstractItemModelTester tester(&model); model.setResults(entry.sourceMap, results.selfCosts); } } } void testDisassemblyModel_data() { QTest::addColumn("symbol"); Data::Symbol symbol = {QStringLiteral("__cos_fma"), 4294544, 2093, QStringLiteral("vector_static_gcc/vector_static_gcc_v9.1.0"), QStringLiteral("/home/milian/projects/kdab/rnd/hotspot/3rdparty/perfparser/tests/auto/" "perfdata/vector_static_gcc/vector_static_gcc_v9.1.0"), QStringLiteral("/home/milian/projects/kdab/rnd/hotspot/3rdparty/perfparser/tests/auto/" "perfdata/vector_static_gcc/vector_static_gcc_v9.1.0")}; QTest::newRow("curSymbol") << symbol; } void testDisassemblyModel() { QFETCH(Data::Symbol, symbol); const auto actualBinaryFile = QFINDTESTDATA(symbol.binary); symbol.actualPath = actualBinaryFile; const auto tree = generateTree1(); Data::CallerCalleeResults results; Data::callerCalleesFromBottomUpData(tree, &results); auto& locationCost = results.binaryOffset(symbol.binary, 4294563, results.selfCosts.numTypes()); locationCost.inclusiveCost[0] += 200; locationCost.selfCost[0] += 200; DisassemblyModel model(nullptr); // no disassembly data yet QCOMPARE(model.columnCount(), DisassemblyModel::COLUMN_COUNT); QCOMPARE(model.rowCount(), 0); DisassemblyOutput disassemblyOutput = DisassemblyOutput::disassemble(QStringLiteral("objdump"), QStringLiteral("x86_64"), {}, {}, {}, {}, symbol); model.setDisassembly(disassemblyOutput, results); QCOMPARE(model.columnCount(), DisassemblyModel::COLUMN_COUNT + results.selfCosts.numTypes()); QCOMPARE(model.rowCount(), disassemblyOutput.disassemblyLines.size()); } void testSourceCodeModelNoFileName_data() { QTest::addColumn("symbol"); Data::Symbol symbol = {QStringLiteral("__cos_fma"), 4294544, 2093, QStringLiteral("vector_static_gcc/vector_static_gcc_v9.1.0"), QStringLiteral("/home/milian/projects/kdab/rnd/hotspot/3rdparty/perfparser/tests/auto/" "perfdata/vector_static_gcc/vector_static_gcc_v9.1.0"), QStringLiteral("/home/milian/projects/kdab/rnd/hotspot/3rdparty/perfparser/tests/auto/" "perfdata/vector_static_gcc/vector_static_gcc_v9.1.0")}; QTest::newRow("curSymbol") << symbol; } void testSourceCodeModelNoFileName() { QFETCH(Data::Symbol, symbol); const auto actualBinaryFile = QFINDTESTDATA(symbol.binary); symbol.actualPath = actualBinaryFile; const auto tree = generateTree1(); Data::CallerCalleeResults results; Data::callerCalleesFromBottomUpData(tree, &results); SourceCodeModel model(nullptr); QCOMPARE(model.columnCount(), SourceCodeModel::COLUMN_COUNT); QCOMPARE(model.rowCount(), 0); DisassemblyOutput disassemblyOutput = DisassemblyOutput::disassemble(QStringLiteral("objdump"), QStringLiteral("x86_64"), {}, {}, {}, {}, symbol); model.setDisassembly(disassemblyOutput, results); // no source file name QCOMPARE(model.columnCount(), SourceCodeModel::COLUMN_COUNT); QCOMPARE(model.rowCount(), 0); } void testSourceCodeModelSourceCodeLineAssociation() { const QString binary = QFINDTESTDATA(".") + QStringLiteral("/../tests/test-clients/cpp-recursion/cpp-recursion"); // use readelf to get address and size of main // different compilers create different locations and sizes static const QRegularExpression regex( QStringLiteral("[ ]+[0-9]+: ([0-9a-f]+)[ ]+([0-9]+)[0-9 a-zA-Z]+main\\n")); QProcess readelf; readelf.setProgram(QStringLiteral("readelf")); readelf.setArguments({QStringLiteral("-s"), binary}); readelf.start(); readelf.waitForFinished(); const auto output = readelf.readAllStandardOutput(); QVERIFY(!output.isEmpty()); auto match = regex.match(QString::fromUtf8(output)); QVERIFY(match.hasMatch()); bool ok = false; const quint64 address = match.captured(1).toInt(&ok, 16); QVERIFY(ok); const quint64 size = match.captured(2).toInt(&ok, 10); QVERIFY(ok); Data::Symbol symbol = {QStringLiteral("main"), address, size, QStringLiteral("cpp-recursion"), {}, binary}; SourceCodeModel model(nullptr); QCOMPARE(model.columnCount(), SourceCodeModel::COLUMN_COUNT); QCOMPARE(model.rowCount(), 0); auto disassemblyOutput = DisassemblyOutput::disassemble(QStringLiteral("objdump"), QStringLiteral("x86_64"), {}, {}, {}, {}, symbol); QVERIFY(disassemblyOutput.errorMessage.isEmpty()); model.setDisassembly(disassemblyOutput, {}); QCOMPARE(model.columnCount(), SourceCodeModel::COLUMN_COUNT); QCOMPARE(model.rowCount(), 11); // check source code boundary QCOMPARE(model.index(1, SourceCodeModel::SourceCodeLineNumber) .data(SourceCodeModel::FileLineRole) .value() .line, 19); QCOMPARE(model.index(7, SourceCodeModel::SourceCodeLineNumber) .data(SourceCodeModel::FileLineRole) .value() .line, 25); QCOMPARE(model.index(10, SourceCodeModel::SourceCodeLineNumber) .data(SourceCodeModel::FileLineRole) .value() .line, 28); // check associated lines QCOMPARE(model.index(1, SourceCodeModel::SourceCodeColumn).data(SourceCodeModel::RainbowLineNumberRole).toInt(), 19); QCOMPARE(model.index(7, SourceCodeModel::SourceCodeColumn).data(SourceCodeModel::RainbowLineNumberRole).toInt(), 25); QCOMPARE( model.index(10, SourceCodeModel::SourceCodeColumn).data(SourceCodeModel::RainbowLineNumberRole).toInt(), 28); } void testSourceCodeModelSearch() { QTemporaryFile file; if (!file.open()) { QSKIP("Failed to create test file"); } for (int i = 0; i < 10; i++) { file.write(QStringLiteral("Line %1\n").arg(i).toUtf8()); } file.flush(); DisassemblyOutput output; output.mainSourceFileName = file.fileName(); output.realSourceFileName = file.fileName(); DisassemblyOutput::DisassemblyLine line1; line1.fileLine = Data::FileLine {file.fileName(), 4}; DisassemblyOutput::DisassemblyLine line2; line2.fileLine = Data::FileLine {file.fileName(), 8}; output.disassemblyLines = {line1, line2}; SourceCodeModel model(nullptr); model.setDisassembly(output, {}); QCOMPARE(model.rowCount(), 6); // 5 lines + function name QCOMPARE(model.data(model.index(1, SourceCodeModel::SourceCodeColumn), Qt::DisplayRole).value(), QStringLiteral("Line 3")); QCOMPARE(model.data(model.index(5, SourceCodeModel::SourceCodeColumn), Qt::DisplayRole).value(), QStringLiteral("Line 7")); // check if search works in general QSignalSpy searchSpy(&model, &SourceCodeModel::resultFound); for (int i = 0; i < 5; i++) { model.find(QStringLiteral("Line 5"), Direction::Forward, i); auto result = searchSpy.takeFirst(); QCOMPARE(result.at(0).value(), model.index(3, SourceCodeModel::SourceCodeColumn)); } // Check wrap around for (int i = 1; i < 4; i++) { QSignalSpy endReached(&model, &SourceCodeModel::searchEndReached); model.find(QStringLiteral("Line 3"), Direction::Forward, i); QCOMPARE(endReached.size(), 1); } // check if no result found works searchSpy.clear(); for (int i = 0; i < 5; i++) { model.find(QStringLiteral("Line 8"), Direction::Forward, i); auto result = searchSpy.takeFirst(); QCOMPARE(result.at(0).value().isValid(), false); } // test backward search for (int i = 4; i > 0; i--) { model.find(QStringLiteral("Line 7"), Direction::Backward, i); auto result = searchSpy.takeFirst(); QCOMPARE(result.at(0).value(), model.index(5, SourceCodeModel::SourceCodeColumn)); } // Check wrap around for (int i = 4; i > 0; i--) { QSignalSpy endReached(&model, &SourceCodeModel::searchEndReached); model.find(QStringLiteral("Line 7"), Direction::Backward, i); QCOMPARE(endReached.size(), 1); } // check if no result found works searchSpy.clear(); for (int i = 0; i < 5; i++) { model.find(QStringLiteral("Line 8"), Direction::Backward, i); auto result = searchSpy.takeFirst(); QCOMPARE(result.at(0).value().isValid(), false); } } void testEventModel() { Data::EventResults events; events.cpus.resize(3); events.cpus[0].cpuId = 0; events.cpus[1].cpuId = 1; // empty events.cpus[2].cpuId = 2; const int nonEmptyCpus = 2; const int processes = 2; const quint64 endTime = 1000; const quint64 deltaTime = 10; events.threads.resize(4); auto& thread1 = events.threads[0]; { thread1.pid = 1234; thread1.tid = 1234; thread1.time = {0, endTime}; thread1.name = QStringLiteral("foobar"); } auto& thread2 = events.threads[1]; { thread2.pid = 1234; thread2.tid = 1235; thread2.time = {deltaTime, endTime - deltaTime}; thread2.name = QStringLiteral("asdf"); } auto& thread3 = events.threads[2]; { thread3.pid = 5678; thread3.tid = 5678; thread3.time = {0, endTime}; thread3.name = QStringLiteral("barfoo"); } auto& thread4 = events.threads[3]; { thread4.pid = 5678; thread4.tid = 5679; thread4.time = {endTime - deltaTime, endTime}; thread4.name = QStringLiteral("blub"); } Data::CostSummary costSummary(QStringLiteral("cycles"), 0, 0, Data::Costs::Unit::Unknown); auto generateEvent = [&costSummary, &events](quint64 time, quint32 cpuId) -> Data::Event { Data::Event event; event.cost = 10; event.cpuId = cpuId; event.type = 0; event.time = time; ++costSummary.sampleCount; costSummary.totalPeriod += event.cost; events.cpus[cpuId].events << event; return event; }; for (quint64 time = 0; time < endTime; time += deltaTime) { thread1.events << generateEvent(time, 0); if (thread2.time.contains(time)) { thread2.events << generateEvent(time, 2); } } events.totalCosts = {costSummary}; EventModel model; QAbstractItemModelTester tester(&model); model.setData(events); QCOMPARE(model.columnCount(), static_cast(EventModel::NUM_COLUMNS)); QCOMPARE(model.rowCount(), 2); auto simplifiedEvents = events; simplifiedEvents.cpus.remove(1); auto verifyCommonData = [&](const QModelIndex& idx) { const auto eventResults = idx.data(EventModel::EventResultsRole).value(); QCOMPARE(eventResults, simplifiedEvents); const auto maxTime = idx.data(EventModel::MaxTimeRole).value(); QCOMPARE(maxTime, endTime); const auto minTime = idx.data(EventModel::MinTimeRole).value(); QCOMPARE(minTime, quint64(0)); const auto numProcesses = idx.data(EventModel::NumProcessesRole).value(); QCOMPARE(numProcesses, processes); const auto numThreads = idx.data(EventModel::NumThreadsRole).value(); QCOMPARE(numThreads, events.threads.size()); const auto numCpus = idx.data(EventModel::NumCpusRole).value(); QCOMPARE(numCpus, nonEmptyCpus); const auto maxCost = idx.data(EventModel::MaxCostRole).value(); QCOMPARE(maxCost, quint64(10)); const auto totalCost = idx.data(EventModel::TotalCostsRole).value>(); QCOMPARE(totalCost, events.totalCosts); }; for (int i = 0; i < 2; ++i) { const auto isCpuIndex = i == 0; auto parent = model.index(i, EventModel::ThreadColumn); verifyCommonData(parent); QCOMPARE(parent.data(EventModel::SortRole).value(), i); auto numRows = model.rowCount(parent); QCOMPARE(numRows, isCpuIndex ? nonEmptyCpus : processes); if (!isCpuIndex) { // let's only look at the first process parent = model.index(0, EventModel::ThreadColumn, parent); verifyCommonData(parent); QCOMPARE(parent.data().toString(), QLatin1String("foobar (#1234)")); numRows = model.rowCount(parent); QCOMPARE(numRows, 2); } for (int j = 0; j < numRows; ++j) { const auto idx = model.index(j, EventModel::ThreadColumn, parent); verifyCommonData(idx); QVERIFY(!model.rowCount(idx)); const auto rowEvents = idx.data(EventModel::EventsRole).value(); const auto threadStart = idx.data(EventModel::ThreadStartRole).value(); const auto threadEnd = idx.data(EventModel::ThreadEndRole).value(); const auto threadName = idx.data(EventModel::ThreadNameRole).value(); const auto threadId = idx.data(EventModel::ThreadIdRole).value(); const auto processId = idx.data(EventModel::ProcessIdRole).value(); const auto cpuId = idx.data(EventModel::CpuIdRole).value(); if (isCpuIndex) { const auto& cpu = simplifiedEvents.cpus[j]; QCOMPARE(rowEvents, cpu.events); QCOMPARE(threadStart, quint64(0)); QCOMPARE(threadEnd, endTime); QCOMPARE(threadId, Data::INVALID_TID); QCOMPARE(processId, Data::INVALID_PID); QVERIFY(threadName.contains(QString::number(cpu.cpuId))); QCOMPARE(cpuId, cpu.cpuId); QCOMPARE(idx.data(EventModel::SortRole).value(), cpu.cpuId); } else { const auto& thread = events.threads[j]; QCOMPARE(rowEvents, thread.events); QCOMPARE(threadStart, thread.time.start); QCOMPARE(threadEnd, thread.time.end); QCOMPARE(threadId, thread.tid); QCOMPARE(processId, thread.pid); QCOMPARE(cpuId, Data::INVALID_CPU_ID); QCOMPARE(threadName, thread.name); QCOMPARE(idx.data(EventModel::SortRole).value(), thread.tid); } auto idx2 = model.index(j, EventModel::EventsColumn, parent); QCOMPARE(idx2.data(EventModel::SortRole).value(), rowEvents.size()); } } } void testPrettySymbol_data() { QTest::addColumn("prettySymbol"); QTest::addColumn("symbol"); QTest::newRow("string") << "std::string" << "std::__cxx11::basic_string, std::allocator >"; QTest::newRow("wstring") << "std::wstring" << "std::__cxx11::basic_string, std::allocator >"; QTest::newRow("basic_string") << "std::basic_string" << "std::__cxx11::basic_string, std::allocator >"; QTest::newRow("vector") << "std::vector" << "std::vector >"; QTest::newRow("map") << "std::map" << "std::map, std::allocator > >"; QTest::newRow("nested types") << "std::map>>" << "std::map, std::allocator >," " std::vector, " "std::allocator >," " std::less, std::allocator, std::allocator > > > >," " std::allocator, " "std::allocator >," " std::less, std::allocator," " std::allocator > > > > > >, std::less," " std::allocator > >, std::allocator," " std::allocator > const, std::vector," " std::allocator >, std::less, std::allocator, std::allocator > > > >," " std::allocator, " "std::allocator >," " std::less, std::allocator," " std::allocator > > > > > > > > >"; QTest::newRow("standard type") << "int" << "int"; QTest::newRow("custom type") << "TFoo" << "TFoo"; QTest::newRow("custom nested template") << "TBar >" << "TBar, std::allocator >," " std::allocator, std::allocator > > > >"; QTest::newRow("custom template") << "TYou" << "TYou, std::allocator > >"; QTest::newRow("mystd") << "mystd::TFoo" << "mystd::TFoo"; QTest::newRow("mystd template") << "mystd::TBar >" << "mystd::TBar, std::allocator " ">," " std::allocator, std::allocator > > > >"; QTest::newRow("function pointer") << "std::string (*)(std::vector)" << "std::__cxx11::basic_string, std::allocator >" " (*)(std::vector >)"; QTest::newRow("pair") << "std::pair" << "std::pair"; QTest::newRow("list") << "std::list" << "std::__cxx11::list, std::allocator >," " std::allocator, std::allocator > > >"; QTest::newRow("set") << "std::set" << "std::set, std::allocator >"; QTest::newRow("multiset") << "std::multiset>" << "std::multiset >," " std::less > >," " std::allocator > > >"; QTest::newRow("multimap") << "std::multimap" << "std::multimap, std::allocator >," " std::__cxx11::basic_string, std::allocator >," " std::less, std::allocator > >," " std::allocator," " std::allocator > const, std::__cxx11::basic_string," " std::allocator > > > >"; QTest::newRow("deque") << "std::deque>" << "std::deque >, " "std::allocator > > >"; QTest::newRow("stack") << "std::stack >" << "std::stack > >"; QTest::newRow("array") << "std::array" << "std::array"; QTest::newRow("forward_list") << "std::forward_list>" << "std::forward_list >," " std::allocator > > >"; QTest::newRow("unordered_set") << "std::unordered_set" << "std::unordered_set, std::equal_to, std::allocator >"; QTest::newRow("unordered_map") << "std::unordered_map" << "std::unordered_map, std::equal_to, " "std::allocator > >"; QTest::newRow("unordered_multiset") << "std::unordered_multiset" << "std::unordered_multiset, std::equal_to, std::allocator >"; QTest::newRow("unordered_multimap") << "std::unordered_multimap" << "std::unordered_multimap, std::equal_to," " std::allocator > >"; QTest::newRow("bound function") << "std::__function::__func const&," " std::string const&, std::string const&, std::string const&" "), foobar::map::api_v2::DeltaAccessImpl*," " std::string const&, std::string const&, std::string const&," " std::weak_ptr const&," " char const (&) [1], char const (&) [1]," " std::string const&" ">, std::allocator<...>," " bool ()>::operator()()" << "std::__1::__function::__func, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::weak_ptr const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&" "), foobar::map::api_v2::DeltaAccessImpl*," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::weak_ptr const&," " char const (&) [1], char const (&) [1]," " std::__1::basic_string, std::__1::allocator > const&" ">, std::__1::allocator, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::weak_ptr const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&" "), foobar::map::api_v2::DeltaAccessImpl*," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::basic_string, std::__1::allocator > const&," " std::__1::weak_ptr const&," " char const (&) [1], char const (&) [1]," " std::__1::basic_string, std::__1::allocator > const&" "> >, bool ()>::operator()()"; } void testPrettySymbol() { QFETCH(QString, prettySymbol); QFETCH(QString, symbol); QCOMPARE(Data::Symbol(symbol).prettySymbol, prettySymbol); } void testCollapseTemplates_data() { QTest::addColumn("original"); QTest::addColumn("collapsed"); QTest::addRow("operator<") << "Foo operator< (Asdf);" << "Foo<…> operator< (Asdf<…>);"; QTest::addRow("operator>") << "Foo operator> (Asdf);" << "Foo<…> operator> (Asdf<…>);"; QTest::addRow("operator<<") << "Foo operator<< (Asdf);" << "Foo<…> operator<< (Asdf<…>);"; QTest::addRow("operator>>") << "Foo operator>> (Asdf);" << "Foo<…> operator>> (Asdf<…>);"; QTest::addRow("operator <") << "Foo operator < (Asdf);" << "Foo<…> operator < (Asdf<…>);"; QTest::addRow("operator >") << "Foo operator > (Asdf);" << "Foo<…> operator > (Asdf<…>);"; QTest::addRow("operator <<") << "Foo operator << (Asdf);" << "Foo<…> operator << (Asdf<…>);"; QTest::addRow("operator >>") << "Foo operator >> (Asdf);" << "Foo<…> operator >> (Asdf<…>);"; QTest::addRow("operator< 2") << "Foo> operator< (Asdf);" << "Foo<…> operator< (Asdf<…>);"; QTest::addRow("operator> 2") << "Foo> operator> (Asdf);" << "Foo<…> operator> (Asdf<…>);"; QTest::addRow("operator<< 2") << "Foo> operator<< (Asdf);" << "Foo<…> operator<< (Asdf<…>);"; QTest::addRow("operator>> 2") << "Foo> operator>> (Asdf);" << "Foo<…> operator>> (Asdf<…>);"; } void testCollapseTemplates() { QFETCH(QString, original); QFETCH(QString, collapsed); QCOMPARE(Util::collapseTemplate(original, 1), collapsed); } void testSymbolEliding_data() { QTest::addColumn("maxWidth"); QTest::addColumn("elidedSymbol"); const auto w = monospaceMetrics().averageCharWidth(); QTest::addRow("no eliding") << w * 108 << "asdf_namespace::foobar::blablub(someotherreallylongnames) const"; QTest::addRow("elide arguments") << w * 77 << "asdf_namespace::foobar::blablub(someotherreallylongn…) const"; QTest::addRow("elide templates") << w * 54 << "asdf_namespace::foobar<…>::blablub(…) const"; QTest::addRow("elide symbol") << w * 27 << "…obar<…>::blablub(…) const"; } void testSymbolEliding() { const QString testSymbol = QStringLiteral("asdf_namespace::foobar::blablub(someotherreallylongnames) const"); QFETCH(int, maxWidth); QFETCH(QString, elidedSymbol); QCOMPARE(Util::elideSymbol(testSymbol, monospaceMetrics(), maxWidth), elidedSymbol); } void testSymbolElidingParanthese() { auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont); font.setPixelSize(10); const QString symbol = QStringLiteral("Foo<&bar::operator()>::asdf(blabla<&foo::operator(), ')', '('>)"); const auto metrics = monospaceMetrics(); QCOMPARE(Util::elideSymbol(symbol, metrics, metrics.averageCharWidth() * 54), QStringLiteral("Foo<&bar::operator()>::asdf(blabla<&foo::opera…)")); } private: static QFontMetrics monospaceMetrics() { auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont); font.setPixelSize(10); return QFontMetrics(font); } }; HOTSPOT_GUITEST_MAIN(TestModels) #include "tst_models.moc" KDAB-hotspot-41e5de7/tests/modeltests/tst_search.cpp000066400000000000000000000062271515036260400225320ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Lieven Hey SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include class TestSearch : public QObject { Q_OBJECT public: using QObject::QObject; private slots: void testSearchEmpty() { const std::array testArray = {}; QCOMPARE( search(testArray.cbegin(), testArray.cend(), 0, Direction::Forward, [](int) { return false; }, [] {}), -1); QCOMPARE( search(testArray.cbegin(), testArray.cend(), 0, Direction::Backward, [](int) { return false; }, [] {}), -1); } void testSearch() { const std::array testArray = {1, 2, 3, 4, 5}; int maxOffset = testArray.size() - 1; for (int offset = 0; offset < maxOffset; offset++) { QCOMPARE(search( testArray.cbegin(), testArray.cend(), offset, Direction::Forward, [](int num) { return num == 2; }, [] {}), 1); QCOMPARE(search( testArray.cbegin(), testArray.cend(), offset, Direction::Backward, [](int num) { return num == 2; }, [] {}), 1); } } void testEndReached() { const std::array testArray = {1, 2, 3, 4, 5}; { bool endReached = false; QCOMPARE(search( testArray.cbegin(), testArray.cend(), 1, Direction::Forward, [](int i) { return i == 1; }, [&endReached] { endReached = true; }), 0); QCOMPARE(endReached, true); } { bool endReached = false; QCOMPARE(search( testArray.cbegin(), testArray.cend(), 1, Direction::Backward, [](int i) { return i == 4; }, [&endReached] { endReached = true; }), 3); QCOMPARE(endReached, true); } } void testArrayIsEmpty() { const std::array testArray; for (int i = 0; i < 2; i++) { QCOMPARE(search( testArray.cbegin(), testArray.cend(), 0, Direction::Forward, [](int) { return true; }, [] {}), -1); } } void testOutOfRangeIfCurrentIsEnd() { const std::array testArray = {0}; QCOMPARE(search( testArray.cbegin(), testArray.cend(), 1, Direction::Forward, [](int i) { return i == 0; }, [] {}), 0); } void testSearchOnIterators() { const std::array testArray = {0, 1, 2, 3, 0}; for (std::size_t i = 0; i < testArray.size(); i++) { QCOMPARE(search( testArray.cbegin() + 1, testArray.cbegin() + 3, i, Direction::Forward, [](int i) { return i == 0; }, [] {}), -1); } } }; QTEST_GUILESS_MAIN(TestSearch) #include "tst_search.moc" KDAB-hotspot-41e5de7/tests/modeltests/tst_timelinedelegate.cpp000066400000000000000000000064411515036260400245640ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include class TestTimeLineDelegate : public QObject { Q_OBJECT public: using QObject::QObject; private slots: void initTestCase() { qRegisterMetaType(); } void testXMapping() { QFETCH(TimeLineData, data); QFETCH(int, x); QFETCH(quint64, time); QFETCH(Data::TimeRange, timeRange); // make sure the mapping is within a certain threshold const auto relativeErrorThreshold = 0.01; // 1% const auto timeErrorThreshold = relativeErrorThreshold * data.time.end; const auto xErrorThreshold = relativeErrorThreshold * data.w; auto validate = [&](quint64 value, quint64 expected, double threshold) { const auto actual = std::abs(static_cast(value - expected)); if (actual > threshold) { qWarning() << value << expected << actual << threshold; return false; } return true; }; QVERIFY(validate(data.time.start, timeRange.start, timeErrorThreshold)); QVERIFY(validate(data.time.end, timeRange.end, timeErrorThreshold)); QVERIFY(validate(data.time.delta(), timeRange.delta(), timeErrorThreshold)); QVERIFY(validate(data.mapXToTime(x), time, timeErrorThreshold)); QVERIFY(validate(data.mapTimeToX(time), x, xErrorThreshold)); } void testXMapping_data() { QTest::addColumn("data"); QTest::addColumn("x"); QTest::addColumn("time"); QTest::addColumn("timeRange"); QRect rect(0, 0, 1000, 10); auto time = Data::TimeRange(1000, 1000 + 10000); TimeLineData data({}, 0, time, time, rect); QCOMPARE(data.w, rect.width() - 2 * data.padding); QCOMPARE(data.h, rect.height() - 2 * data.padding); QTest::newRow("minTime") << data << 0 << time.start << time; QTest::newRow("halfTime") << data << (rect.width() / 2) << (time.start + time.delta() / 2) << time; QTest::newRow("maxTime") << data << rect.width() << time.end << time; // zoom into the 2nd half time.start = 6000; data.zoom(time); QTest::newRow("minTime_zoom_2nd_half") << data << 0 << time.start << time; QTest::newRow("halfTime_zoom_2nd_half") << data << (rect.width() / 2) << (time.start + time.delta() / 2) << time; QTest::newRow("maxTime_zoom_2nd_half") << data << rect.width() << time.end << time; // zoom into the 4th quadrant time.start = 8500; data.zoom(time); QTest::newRow("minTime_zoom_4th_quadrant") << data << 0 << time.start << time; QTest::newRow("halfTime_zoom_4th_quadrant") << data << (rect.width() / 2) << (time.start + time.delta() / 2) << time; QTest::newRow("maxTime_zoom_4th_quadrant") << data << rect.width() << time.end << time; } }; QTEST_GUILESS_MAIN(TestTimeLineDelegate) #include "tst_timelinedelegate.moc" KDAB-hotspot-41e5de7/tests/modeltests/vector_static_gcc/000077500000000000000000000000001515036260400233455ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/modeltests/vector_static_gcc/vector_static_gcc_v9.1.0000077500000000000000000037257601515036260400277170ustar00rootroot00000000000000ELF>@@@0@8@'&@@,M ,M M ]L]L0f8~@@DDQtdM ]L]L pRtdM ]L]L`B`B GNUGNU?d>)T`L%aCL%cCL%pyAL%yA L%0WC(L%VC0L%aC8L%P`C@L%`CHL%pVCPL%dCXL%0`C`L%VChL%`bCpL% cCxL%UCL%cCL%pWCL%dCL%GL%0GL%GL%GL%pHL%HHH HtH5 % % h% h% h% h%z h%r h%j h%b hp%Z h`%R h P%J h @%B h 0%: h %2 h %* h%" h% h% h% h% h% h% h% h% hp%ښ h`H|$ HtH)g g g g.g"g.g/1HCPtsHIL1LcLcHsHLL.uiH- L1LHtTg,H/HHH HHgc#HpHg.g.Hgag#Lg!g-g& gK,HT(H5 HH HHg"Pg,H/H5 HHn HHg"Pg+H'H5 HH HHg"Pg+H(H5 HH HHgW"Pgw+H (H5 HH HHg""ATIUPg<+LHgp HHg:H=4H5 Hg!IHgm+LgATIUPg*LHg HHg:H4H5x Hg!IHg+LgATIUPg*LHg HHgx:H4H52 Hg!!IHg*Lg(ATIUPg"*LHgV HHg::Hc4H5 Hg IHgS*LgATIUPg)LHgHHg9HE4H5 Hge IHg)LglH4H5v Lg5 Lg)LgCATIUPg=)LHgqHHg9H3H57 HgIHgn)LgATIUPg(LHgHHg9H`4H5 HgIHg)LgATIUPg(LHgHHgi9HB4H5 Hg"IHg(Lg)ATIUPg#(LHgWHHg+9H$4H5e HgIHgT(LgPg'H$H5= HHc HHgvg'H$H5% HH[ HHgFgHHHugjgDgsgC'H|$H5́ HH HHgHHHuggHHHuag(HHPH HH=l gqH3HgpH3 g g(goLg4gg*(g(Hg(Hg\HgS)LgJHgA)Lg8Hg/)Lg&Hg)LgHD$HxH;=, t!H= t P Ht$g!ZLgPJHgw'gHg'HgHg.LgHg.LgHgn/LguHg\/LgcHg/LgQHgx/Lg?Hg/Lg-Hg/LgHg/Lg Hg/LgHg/LgHg/LgHgz0LgHgh0LgHg0LgHg0LgHg0LgyHg0LggH$H% H$H% H$H% H$H% H$H% H$H% H$H% H$H% % H$H% gggggzgtgnghgbg\gVgPgJgDg>g8g2g,g&g ggH|$z1H(dH%(H$1dH%H9 tD=4 t 5 u #5 tH= HHĀHԻ ʻ =ϻ u6û HHHt H1ҿH $   v x uAHc = t K u " A tH=8 H<HĀ{KdH%H9 tF1=+ t 5 u #5 tH=ݺ HHĀH˺  uGH$1& HHHu1ҿDŽ$菤=x ul J=[ u O =G u; !Eu?Hju2HB=) t u tH:HHĀLu?Hju2HB= t u tH:HHĀL_u?Hju2HB= t u tH:HOHĀLu?Hju2HB=< t u tH:HHĀLEu?Hju2HB= t u tH:HHĀLqEu?Hju2HB= t u tH:H`HĀL!AEu?Iju2HB=K t u tH:HHĀLPu?Hju2HB= t u tH:HHĀLwRMgGgAH= `AVAUE1ATU1S1H@ݍ dH%(HD$81Lt$HD$ HD$(HD$0YEHHl$(A@ tqfLl$0A*#D$f*DT$f(f(dDcD$I9uH|$ LLHl$(A@ uDH|$ H9tPfHf(XHH9uE1f/AHtHD$8dH3%(uH@D[]A\A]A^ff(?HfHH H! ) ) g$H HtH HH@HHۭ H AWAVAUATUSH H/ H1HIM~+LL%^ E0HL%a HR LHHU H HtHH~+HH- @0HH- H HHH H HuHؙ H@HHH H[]A\A]A^A_Hu 1Hu붿D-4 CI6I)HHE1A5 A~|E1E1AAyDtZu%@t%AAAMLAAlE1A5 H~t HHHHEuEtLMcHIILHH H"谖I裖H薖1IM~+=wd։ǁt%u[LŁvtS. f@%A ǸLHHI떅룾A[A E1A@!ωE 1A!ȍ<A D΅tGDDNt.t*u@tAACAAA!AAEABAtw u EDA7&H HcH>@4AtKAAAAA!ڃAu1E}1EAAAAA!1I^HHPTLH OH=xgff.LH=LtHl HtLff.@LHLHH?HHHtH2 Ht LfD= u+UHzH= t >Kg ]@H=܁ t"UL>KHg^]XKff.HAWAVAUATUSHLgLLL)HH9IHHIL)HIH4H9LHT$L$ L$HT$HIALLM)OfLHBMtpHDI@x(MHHBHLH@LDMMHDDHBfDDHBLcHBLHBrHE11DHMAIM ExEfDHE11DHMAIM Ex?A@IIM HDG(dH%(HD$1AD<tkvAHH<uJHwHWHD_H$HL$dH3 %(uGHfDu>HH<tH6H1gfAUHATUHSHHHOHT$ILd$@11@AUIHЃHH ƄxHt%HLHHtH[]A\A]H1[]A\A]@tzHp<0t]w< u/HH雹f.<@u,HH0`  fATISHHk HtH= k IIL$L% HCHHMt9H5 fDHrMt!I$LMd$H9wH)Hw-L&LbHtH=z tk HL[A\ÐH< LgHHH H>f.H=e Ht HgfHK HfDffffff.UHHgHt4HxHLHH@xH)1HL]HHug_ffffff.H HǀH9vH H9s; fHpg Ht3IIxL1IHI@hH)pHLHÿpIHugffff.H H9vH H9s  ffDSHtHg=HԼHHv gD@H{gfDHGSHgHKHԼHLHvMu;HL[{غ)WH։S؃hI9tLCHLC[LgfHgH8Ht(HԼHWPHw6W(xtBtRW(HDuHO Hf.HHPHlHW HPHHTgffff.Hg@HDHgb@Hf.ff.HeX HHHA @HA @UHgH]UHgH]tff.UHgH]Dff.UHgH]ff.'fDff.fDHffffdH%HHHffffdH%HHHHҌ ÐHŌ @HH5o@ ggff.HH5m g豎gff.HW HH驇UHgH]UHSHH(I9tH{HHH@@H([]DHHqH9t-?*tLD$HL$HT$e HT$HL$LD$uH([]f.AWAVAAUATIUHSLH(LIt$HL$`HT$hI9tzEIA*t4HT$LHL$LL$D$e D$LL$HL$HT$t9H9ttI}IHHHT$hDHL$`LH@8H([]A\A]A^A_HDrHx$H1H9DBH(1[]A\A]A^A_ÐHuBߐIqI9t7A*yHT$LHL$L $Vd L $HL$HT$LDr f.AUIATIUHSHHg蠆u$H{LLHHH@0H[]A\A]@H[]A\A]ffff.ff.1f1fUHgH]dHHvH9t"1?*tHYc HÐATUSHdH%(HD$1=U H g*HHh1HL$}*D$11HHg(0H3l IH=|j H gBT$H3t8Hg@H H=< gUBD$@Lg@DHk -H=Hj HgBHk H=6< HgAgHGHGUHHdH%(HD$1H=T HHHGHxH;=a u%HgHD$dH3%(u?H]fDH=ha tPHt$g*PJHggUHgRH]HS HH)UHgH]HS HHUHgH]IHS HHUHgH] HuS HHiUHgH]UHHdH%(HD$1HES HHHGHxH;=_ u%HgHD$dH3%(u?H]fDH=_ tPHt$g(PJHg觨UHgRH] HR HH)UHgH]HR HHUHgH]HR HHUHgH]IfDATUHHHHQ HHGg=H]A\IDSHgHP HH[fSHgHP HH[fSHgrHQ HH[fSHgRH Q HH[ATUHHHHQ HHGgY<H]A\IKDSHgHP HH[fSHgHQ HH[fSHgrH Q HH[fHdH%(HD$1H;=9] uHD$dH3%(uBHf.H=\ tGHt$g &GPWgH5O HHHHG@;ffffff.ATIHHg <LA\HN HHHFHGH HHFfDATIHHgLA\H]O HHHHG:ffffff.ATIHHgi;LA\H O HHHFHGH HHFfDATIHHgyLA\ÐATUHHHdH%(HD$1HM HT$HHGgDHD$dH3%(uH]A\gFIf.SHgHM HH[fSHgbHM HH[fSHgBHM HH[fSHg"HM HH[ATUHHHdH%(HD$1HM HT$HHGgCHD$dH3%(uH]A\gVIf.SHgH{M HH[fSHgbHM HH[fSHgBHM HH[fH6HVEffffff.H HHffff.8fDHdH%(HD$1HL$g>HD$dH3%(uHgRf7fDATIg8LA\ff.HdH%(HD$1HHxH;=X uHD$dH3%(u;HH=X tPHt$g!PJHg觡HHH~ HHATIgALA\ÐATIH dH%(HD$1HH|$PHt$LHVgDHD$HxH;=X u$HD$dH3%(uGH LA\f.H=W tPHt$g PJHg跠IgfAUIATAUHSH^HIJ<#rW uI|$kW IT$HXH@HPHHLMW I]H[]A\A]H%f%.W fD%W fDHgH=HHP%V HGHGDAUIH50 ATIUH dH%(HD$1HHgHLV LgHLLgHgHHD$dH3%(u H ]A\A]g(IAf.AUIH510 ATIUH dH%(HD$1HHg:HLU LgILgHLLgHgHD$dH3%(u H ]A\A]g|IHgHHVDUHgH]%hU HgRHHAUIH51/ ATIUH dH%(HD$1HHgHLT LgHLLgHghHD$dH3%(u H ]A\A]g舝If.AUIH5. ATIUH dH%(HD$1HHg HLQT LgILgDHLLgeHgHD$dH3%(u H ]A\A]gܜI+HgHHDUHgH]%S fDAUIH5- ATIUH dH%(HD$1HHgJHLqS LgpHLLgHg(HD$dH3%(u H ]A\A]gIif.AUIH5- ATIUH dH%(HD$1HHgHLR LgILgHLLgHg|HD$dH3%(u H ]A\A]g\IHgrHH6DUHgH]%HR fDAUIH51, ATIUH dH%(HD$1HHgHLQ LgHLLgHgHD$dH3%(u H ]A\A]g舚I f.AUIH5+ ATIUH dH%(HD$1HHgJHLQQ LgILgDHLLgeHgIDpC HHt,LLHaC tMHD$H{H)I9wHHuIHL[]A\A]A^A_H9HHCIDL)IH6HNffffff.AUIATIHUH5B LHL]HA\A]fffff.ATISHHHCH9s!H)H<@HfB HH)HLEHL[A\fDAUATIUSHL/IEH9w?H)HHH9HFIHt'K|%HHB tID$MtIHuHL[]A\A]fIH6HNpffffff.AUIATIHUHA LHL]HA\A]/fffff.HHHyHt!HGH9HGfD@84t HHuHtcAVAUATIUHSL/HMu DAtHL@ Hu!HI9w[H]A\A]A^H[]A\A]A^Hfff.H6HNpffffff.AUIATIHUH? LHL]HA\A]/fffff.@fAUATUSHL/IEHtVHHtNHHH9HFI IItCt%HH? HtHL[]A\A]fHI[L]A\A]ff.H6HN`ffffff.AUIATIHUH> LHL]HA\A]fffff.@fAVAUATUSL/MuL9sHIHHHu(HL9t'AtHL> HuH[]A\A]A^@[H]A\A]A^H6HNffffff.AUIATIHUH> LHL]HA\A]?fffff.HHHH9rfDHH9t@84tHDHAUATIUSHL/IEHt7L`HHI9LGHt!Ct%HH= Ht IIuHL[]A\A]f.H6HNffffff.AUIATIHUH< LHL]HA\A]?fffff.HHHyHt!HGH9HG@HHt@84tUSHH?H6H_HnHH9HFHt < u H)HHMH[]USHH?H_H9wWH)LH9HGIhHH9HFHtHL~< u H)HHMH[]HHH5; 1H= D gUSHH?H_H9wiHHhI9wyH)H9HGL)L9IGHH9HFHtIHL; u H)HHMH[]HHH5 1H=kC gHLH5} 1H=OC gfAUATIUSHL/H: I]HH9HHFHtLL1; u H)HHMH[]A\A]fAVAUATIUSL7I^H9wbH)IHH9HG?: H9HHHFHtK<&L: u H)HHM[]A\A]A^HHH5k 1H==B gUSHH?H_H9wSH)LH9HGLL9HFHtHH": u H)HHMH[]HHH5 1H=A g+ff.H7H_ @GDGG@G@H;= 9 ufGH7D7HGH?SH9wrHH9vDH6H9HBHS9HvCH9v>HH)H9HGH{f.HgHX@[HHygYH= gffff.HuH^ L@LATU1SHg/IL@Ht*L@HB8 IL;%7 u[L]A\fD@hfAD$I$ADff.SHH11g[H[fDSHHHg9H[@@#fATIUSH1H)HghHL@Ht+LHL7 H;--7 Iu![L]A\A$H;- 7 EtELH]D[]A\gfDH=6 tG~GPWffff.H;=6 ufH=X6 tGfGPWDHdH%(HD$1HHxH;=26 uHD$dH3%(u;HH=5 tPHt$g PJHg~USHHdH%(HD$1H@H~6H-[ HxH9uNHEHHD$dH3%(ujH[]HPH;m5 t@H@H= 5 tPHt$gEPJHg~ffffff.AWL2AVIAUI)IATUHSHH(dH%(HD$1HL`HpMM)I9w@HHpL|$L$LLgHL$HLHt2H3LHH LD$LHH$04 LD$H $IH3MuDH-Z H~H9L H9HD$dH3%(HH([]A\A]A^A_ÐJ|-LHILL$LH $3 H3LL$H $LMt&H9t!HK4I<)IL3 L H-Y IIH9bfDAAMqC1Ff.AH3M IfH3H=3 t6FLL$LH $g"LL$H $@FPVDH-&Y L IIg{fHHPH;2 tLHIt&L% IHPH;% u[L]A\A]A^Ðf@Hh(LH5 H=- 1g6fDAUATIUSHHtxHIH?HXH)I9HLH;XH9w HPHH9vIHLgI<$HItOLH$ I$HPH;$ uRHL[]A\A]@H)LHgI<$HHIuE@~Hg@HXH=|g:ffDATIHUHH&$ HHL]HA\ATIHUHH# HHL]HA\fDAUATIUSHHtfHIH?HAH)H9wuH,H;iwA~ HLgI<$HIt1L# I$HPH;# uHL[]A\A]fD@@Hh(H=Dgf.H?HH@H9w2H9w!rfDH)1H f.H)H=Pg融fD1@AUATUSHHHLhMeL;`w@~ LHgyHHP@,HHPH;" uH[]A\A]@L`BD(H[]A\A]@AUATIUSHHLhImH;hw@~ HLgI$HPI$HPH;" uHL[]A\A]@HhBD(HL[]A\A]fGHWxH;=! uHG1H=h! t؃Gf.SHHdH%(HD$1HHxPx&H;=G! u-HHD$dH3%(u8H[@Ht$1gcԐH= tHH@@gifff.ISHHIPHxxH;= uH[fD1gH[H=x tHH@@fATISHHdH%(HD$1H9t0CH{HSxCHF H9I$HzH9uFI$HD$dH3%(HL[A\Ht$1gKHHAF H= tBHt$gBHJDH= tbDCTghffDAVAUIATIHUHSHdH%(HD$1 HE LIHCI$HEHpLgLLLgHLgHD$dH3%(uHL[]A\A]A^ggHI<$HH9t Ht$HgaAUATIUHSHL-D dH%(HD$1IEHHHpHgKӾLgZHLg>HD$dH3%(uHL[]A\A]g:gHI<$HL9t Ht$LGJ4L9wHHgH[LH5kH=v$ 1gfffff.SHHH>dH%(HD$1LGLH)H9HGHHL9w*LD$HLg$HHD$dH3%(uH[LH5H=# gdgdfffff.ATHL@L9wIgULA\LH5H=# 1gfDSHH>LOLH)H9HGHHL9wHLgmH[LH5<H=G# 1g迧ffffff.SHHHHg)H[@H9tHtmDHA HH=e# PgLfffff.SHHH4HgH[AVIAUATIUH8H7dH%(HD$(1HNI9H?IM)I9LGH)LI9HL9v=LLLHg;IHD$(dH3%(LH8L]A\A]A^DHI9wFHK J H9K,HI9raI)MMM)LD$LLHLgH}LD$J47LIIM`L7 Rf.Lt$LLD$LH|$ LgLD$LLHL$ HgIIHD$ HxH;= H= tCPLgfDMI) DIPJHgaH=dgMLH5TH= g.HHD$ HxH;=o tLHg4[@H LAffffff.H MLYMM)M9MGM9w LLPLH5H=" 1g蚤f.AVIAUIATIUHHH HLLLHI]A\A]A^fff.H)H+7H H)H+7LAfAUIATIHUHSHH  HLLH)I+$HIH[]A\A]H)I)H+7~ffff.H)I)H+7^ffff.H)H+7AH)I)H+7.ffff.H)I)H+7ffff.ATIUHHSHHtH* HtLHgiH[]A\ÐSHHH4HgHH[SHHHHg)H[@HH9fHH9fAUATIUHSHHL.H5gu=GenuuugL-H5LgI$Ht7H[]A\A]@H5HgXtH5HgDtH=) gL-@tI$UHH5SHHHdH%(HD$1gquZH  DHLHHH1HielHHHpuHǃpHD$dH3%(u9H[]Hm1HHg}t H$:uH=A gge]DHGHGHGHGHVHLLLc0fHGHH1fff.HGHVHLLL#0fATIgqLA\ff.LHI9tL(ffffff.HGHHHFH9t)HHVHWHVHHFHWFfDoFGDATISHHCHH6H?HSH9tlIL$H9tBI4$IL$IT$HSIT$Ht8H;HKHCLH[A\fI4$IT$HSIT$HHfDHtHt%g HSI<$IT$H;fCHSI<$H7HwHHGHGHwHHw0HGH;ÐH?H>H9w:H9v+HH9s#H9vH@HDHHHH=Pg:|fLHI9tLffffff.H?ԐUSHHHt$Hw6H?HHtHtE@HX HD$H;HCH[]ÐHt$1gHHHD$HCf@/HD$H;HCH[]fDdHHHOHH9wH= VHH1g fH?HH+wH9rHPgzff.HGH)H9HGffff.HAH9w HGH9ADffffff.HtHu% f.f.HtHu% f.f.IHtHuDL% @DH)HtHuD% ff.H)HtHuD% ff.H)HtHuD% ff.H)HtHuD%j ff.H)HHMff.AVAUATUSHdH%(HD$1H9t2L/LwLfHHM9HWL9rXMu3LcCD%HD$dH3%(H[]A\A]A^HuItfLL L+DHL$$HgH;II9tgH$L+HCMxfYfDAEL+Ng[Vff.AWIAVMAUATLgUHSHH(HOdH%(HD$1HIHD$I)LH)HHD$L;'HWL $Ht$HgHL $It!H3HL $HH} L $MtMtIfAA@fD`fDAA@Z(ItLLL[ fD(fDM)It?MtLLL# ILK41K<)L)HtHC 8AA%AH=g=gDLNMI)I9LGHL9wH1HWLPH5(H=r 1gf.HI1HWf.ATIHI1HWgLA\ffffff.HI1HWf.ATIUHHHv HUHLHI]1A\Kf.LOLH)H9HFL9w!HPLH5H={ 1gATIUHHH HUHLHI]1A\f.IHOH9w H1HP1H5H= g{ff.LAL HOHH)H9HFH9w LWHP1H5RH= g,fff.HOLBL H9w L1HP1H5 H=m gAUIATIHUHSHH IL$HH)H9HGH9wHLH[L]IA\A]HH5H= 1gqAUIATIHUHu IL$H9wLHL]IA\1A]CHH5AH= 1gfLWIL+H)LL)H9HGM9w LLPLH5H=O 1gDžLWIL+H)I)LL)H9HGM9w LLPLH5H= 1gt@LWIL+H)I)LL)H9HGM9w LRLPLH5LH= 1g$@LALIH)HOL+HL)H9HGI9w LLLPH5H=X 1gЄLWIL+H)LL)H9HGM9w LLPLH5H= 1g臄LWIL+H)I)LL)H9HGM9w LbLPLH5\H=1g4@LWIL+H)I)LL)H9HGM9w LLPLH5 H=l1g@AUIATIUHHSHL)H HMLH+uIHHH)H9HGH9wHLH[]A\A]HH=1H5ghIHOH+7H9w H1SHP1H5NH=g(HLYMH MM)M9MGM9w#LOLLH)H9HFL9w&HLLH51H=Cg轂HLH51H='g衂HLRILH)H L9LFM9wLLOL9w(1HuLLH5[1H=gHHLH5T1H=g,fff.ATISHHOH+7IH9wHH1gHH[LA\HH=]1H5g΁fffff.ATISID$HLOH?IH9t]ID$H9w3HtLHtU I<$I\$LH[A\IHL1Lg\I<$fDfI<$DHVH6Pffffff.HVH60ffffff.LNH6LH)H9HFL9w HHLPH5H=%1g蝀ffff.H?H+GH9wH=Pgm^DATIUHHHf HH?H+EH9rHLH]A\^H=Zg^ATIUHHH HH?H+EH9wHLH]A\H= g]H?H+GH9wH=Pg]DH?H+GH9wH=Pgm]DATLgIHL9w7I)I9LGMtH7ItLLO LA\ÐALA\HLH51H=~g~H9taHHOHLFH9tTLOI9t{HHHFHGLNHFHWHGHVFHGHFHHGDI9tCHFoWVHHWLHGHFHGHVo^_HHHHFt-oGHtoNFHWOHFXf1HDofgHFHGHHFDHHHAWAVAUATUSHHGHIH9vtIHL,H)HL$H<I9wYL)HHtID6ID HHt*LLH tOH{LH)I9wHHuIHL[]A\A]A^A_H9HHCIDH+\$IfDHNH6ffffff.AUIATIHUH LHL]HA\A]fffff.ATISHHGH9s$HH)@H<H HH)HLEHL[A\fDAUATIUSHHGH9wBH)HL/HH9HFIHt'K|%HHv tID$MtIHuHL[]A\A]fIHNH6pffffff.AUIATIHUHu LHL]HA\A]/fffff.HOHHt$HAH9HGHfD@84t HHuHtcAVIAUATIUHSHLo!DIHL4] Hu HI9w[H]A\A]A^H[]A\A]A^Hfff.HNH6pffffff.AUIATIHUHU LHL]HA\A]/fffff.@fAUATUSHHGHtYHHtQHL/HH9HFI IItCt%HHT HtHL[]A\A]fHI[L]A\A]ff.HNH6`ffffff.AUIATIHUHU LHL]HA\A]fffff.@fAVAUATUSLoL9sKL7IHHHu'HI9t'A4HL^ HuH[]A\A]A^D[H]A\A]A^HNH6ffffff.AUIATIHUHu LHL]HA\A]?fffff.HHWH9s H HH9t@84tHAUATIUSHHGHt:L`L/HHI9LGHt!Ct%HHO Ht IIuHL[]A\A]f.HNH6ffffff.AUIATIHUHe LHL]HA\A]?fffff.HOHHt$HAH9HGH@HHt@84tUSHH_HnHH9HFHtH6H?c u H)HHMH[]USHH_H9wWH)HiH9HGH9HHFHtH7HH1 u H)HHMH[]HHH51H=guf.UHHSHHXH9wfHiI9wyH)H9HGL)L9IGHH9HFHtH1H8LL u H)HHMH[]HHH5 1H=gUuHLH51H=g9ufAUIATIUSHH_H/ H9HHHFHtI<$L u H)HHMH[]A\A]ÐAVAUATIUSH_H9whH)IIHH9HG H9HHHFHtI}LL u H)HHM[]A\A]A^HHH51H=g$t@USHH_H9wVH)LH9HGLL9HFHtH7HH u H)HHMH[]HHH5O1H=!gsff.H7H7AVAUATIHUHMt$SHm AD$LID$HsIM4$HgwH?I+D$I9w+LHLgDHSH3Lg4[L]A\A]A^H=%gPHI<$I9tgeHg(fff.AULoATIUSHHHGGHBL/HpgIt$DŹ1Lg`HSH3LgHL[]A\A]HI<$I9tg eHgS(ATH)UIHSHHdH%(HD$1H$HwNH?Hu5L$$H;LcB'HD$dH3%(uNH[]A\Ht"fH1gHHH$HCLH L$$H;g-fff.HGH0ffffff.ATH)UIHSHHdH%(HD$1H$HwNH?Hu5L$$H;LcB'HD$dH3%(uNH[]A\Ht"fH1g%HHH$HCLH L$$H;g,fff.HGHVHLLL#fATIUHSHHdH%(HD$1Ht HI)L$$IwPH;Iu7EL$$H;LcB'HD$dH3%(u_H[]A\Mt%fHH1g2HHH$HCLH L$$H;H=gLg+fff.HGHVHLLLfAUATIUHoSHHH/HVLLLgHSH3LgbHL[]A\A]II<$H9tgaLg%%DHGHffffff.ATIUHSHHdH%(HD$1Ht HI)L$$IwPH;Iu7EL$$H;LcB'HD$dH3%(u_H[]A\Mt%fHH1gHHH$HCLH@ L$$H;H=pgJg\*fff.LFHGHHL9wIH4LLPH5,H=71gmffffff.LFHGHHL9wI)H4I9LGJLPH5ԻH=1gWmLFHGHHL9wI)H4I9LGJRLPH5H=1gmHGHHfff.ATHGIHUHHHHtH HTHHL]A\ff.HGHHfff.HGHffffff.ATLFL9w-HGI)IHHHI9LGHJgJLA\LH5H=1gkff.HH9fHH9fSHH HdH%(HD$1HH$HHD$HHD$P0D$E1u H$AHHD$dH3%(u H D[g'ffff.1I9Dffffff.HU HHzUHgH]pAUATAUSLHHoLl$HL;D$@tHtEDG(D;G,};IcAL @HG J@DG(0HPHHHtHu1HGRt OtHDOHA AIRtHOHH1HGDMDAIAff.HUH HSHH;Pw,HcH>HC8u\4=~#H[]@H[HuDH[fHsH4{HsHo4H[]Ð4l=fHAUL,ATUHSHHH,f.HHHHD$DL9t>DeH=uHƃHH@1@H[]A\A]Dff.@HHsLHt8/t1[]A\HsLHuH[Hu@1ff.fAUIATIUSHHHBHjRHDH9w4u$H{LH;L HLHCLcH[]A\A]ÐuHt/HH9wH;HgVruH}I~HU:tLRLU:_uDXE1As<$ABkLCLHkL1ɾCHHH$HtHS:tHJHK:E>D1HL$dH3 %( H[]A\A]A^DH1HK HHtHCH߀8FtgHEHHt H$wHJHBHEH$HMH$HwS8;S<kHK0HcHS8WDHEHfaHz K(HcHH;K,#HcHH<@HC H@K(HPR'SHHsHxH$@HS8;S<HK0HcHH$S8HHkH$}IuSPHwS8;S<kHK0HcH1ɉS8EI<wHHkHMHH$HH$PF0HHHs.1ɾ%HHH$HHHs#H$IHC8IGHL!HHH$HHHs1ɾ(HHH$pHNHKF<_0<  HfDHHHC8WЀ vIS(I);S,HcL H{ N$AD$S(EI$IL$ED$VH_HHHKL*HHH$HHHsIHXHHHDL+HH$[C(;C,( HcЃH RHS H,1EC(H,$E,F0< fUw H{{H,$H/HEH$HxH{SHCt HPHSsH$fPS(;S,{HcƒH @HC S(HH GHHH@JS(;S,<.t:D.DATUHHHG8Jt]t9HIHtFEHЀC\DtE1AHAHEE(;E,HcЃHHKpH@EHHHKH1H@Et\@u1[_t3H1HHSHS EuHHS[1DHPHSHZt1)NjK(;K,}nHcLvHs NA@K(~MII@AxLDHHS z@H@H@)CHfDE11ff.@AWAVAUATUHSHdH%(H$1HD0E A2IԃP?H=HcH>ID$89NIT$HBHxc9<IL$DHYID$82?H@Hcu BluBIT$HRu :~@DHuXIT$HBHiu=xxk=xa=Hu/ƅHHH@HDžHDHHPHD[ƅ[ID$HPBHu/ƅHHH@HDžHHPHD]ƅ]ID$82uwH@xumH@8>udHu/ƅHHH@HDžHHPHD)ƅ)f.H$dH3%(?H[]A\A]A^A_HBHwHH AH SHH9H Dž0@H(HD$ HD$ Ld$(H(H D$0HD$8IT$DH/ADt$0E'HD$ H(E,H  L(M0LDHuHPz595HHuf.Dž0IT$DH@HA1HPH=u+HƅHH@1HD.ƅ.Mt$A>G4LDH@3IT$1ۃ:'i/HHHH=u0HƅHH@IT$1HDHD(ƅ(?HH=D3HPHD)ƅ)A<$>3l2IT$DHQ?l@IT$Ht DH3?I|$GLIv/BD5LHHH@E1HDžHGvA,HK0DLIHLD|DH9<%D;IuƅHHA1H@H uIT$DHLd$(H(D$0HD$ HD$ H(H HD$8>DD$0E 1HD$ H( I|$8u E15L(#$A9$$$LD$ RIT$DHHuL{A =H/@HHHDtDI9D3HH=uHƅHH@1IT$DHHrL{A[=H1fDHHHHDtDI9D3H=uHƅHH@1It$H1yH88/n#Hxc#H@HuID$HD$CL%sD$fDAA9SD<HT$DH<D9|$~HLmsA,.HHIHDtDM9tE0H=uLD$HHƅH@LD$1ҸHrHAnL{3HHHDtDL9D3HH=uHƅHH@1H*rHAtL{1fDHHHDtDI9D3HH=uHƅHH@1HpHAnL{1fDHHHDtDI9D3HH=uHƅHH@1HrHA{Ls 1fDHHHDlDI9D+HH=uHƅHH@1HoHAtL{1fDHHHDtDI9D3HH=uHƅHH@1Mt$Md$A2$48HHPH=u+HƅHH@1HDHD(ƅ(IV8HHPH=u+HƅHH@1HD)ƅ)LDHRMMIT$DH}L8HoHAoL{1fDHHHDtDL9D3HH=uHƅHH@1HoHAoL{1fDHHHDtDI9D3HH=uHƅHH@1Ml$HvnHAoL{Ee0DHHHDtDL9D3HH=uHƅHH@1IT$Md$Ht DHv6HHPH=u+HƅHH@1HDLHD{ƅ{6HHPH=u+HƅHH@1HD}ƅ}HӘHAtL{2HHHDtDL9D3HH=uHƅHH@1M|$H(HDž(M-Lt$@1E1L LHGEIAHAILLW4wHHHH(A*AuHD$ LT$ H L|$(IT$DHDD$4A?DD$u HD$ H EE`IM f.IED$EuaHHPH=u+HƅHH@1HIT$DHD ƅ 4ID$M9uH(ID$8;>H@8<1IT$IL$DHIID$I\$H5kLpH@LxL`HCH86 0LDHpHHDHGLDHTHHH5jLDH2H-DIT$DH2IT$DH2H}jHAjL{ 4fHHHDtDL9RD3HH=uHƅHH@1AID$\LchHMaHI,DHHHHDdDL9)D#H=uHƅHH@1HiHAgL{1fDHHHDtDI9D3HH=uHƅHH@1HOiHA{L{1fDHHHDtDI9D3HH=uHƅHH@1HyhHAdL{ 1fDHHHDtDI9D3HH=uHƅHH@1H2hHAgL{1fDHHHDtDI9D3HH=uHƅHH@1HfHATL{1fDHHHDtDI9D3HH=uHƅHH@1HeHAcL{1fDHHHDtDI9D3HH=uHƅHH@1HweHAgL{1fDHHHDtDL9D3HH=uHƅHH@1fA|$= IT$HwP H9BDH".HHBHu+HƅHH@1HD ƅ fA|$HeA_Lk+HHHHDdDI9D#H=uHƅHH@1Lt$@Ld$HH(H L(IHL$@LHD$XLD$PMuY+DPEu<#oڃH)D@oHHL@I H()LP@HHtHPvIT$DH,DL$PL(EHIƃtIVDHI -uH(IT$DH=[HbHAvL{,HHHDtDI9 D3HH=uHƅHH@1H{bHATL{1fDHHHDtDL9D3HH=uHƅHH@1HaHAjL{1fDHHHDtDI9BD3HH=uHƅHH@1EH(AA  IT$Ht A@!IT$DHt4HaHAhL{0DHHHDtDL9. D3HH=uHƅHH@1H`HArL{1fDHHHDtDL9 D3HH=uHƅHH@1IT$DHp)8HE_HAaLs.HHHHDlDI9D+H=uHƅHH@1H$IT$H5^1HgUHڋ H!%tDHJHDщHH)HL$+@HHHHDlDI9iD+H=uHƅHH@1HA\$HPH=u+HƅHH@1H\HpL(LpHDž(IT$At:u z"DHq'< HHPH=u+HƅHH@1HDHD<ƅHHPH=u+HƅHH@1HD>ƅ>L(HpH\HAtL{3HHHDtDI9 D3HH=uHƅHH@1H2\HAtL{ 1fDHHHDtDI9 D3HH=uHƅHH@1H[HAcL{1fDHHHDtDI9 D3HH=uHƅHH@1H [HAVL{1fDHHHDtDI98 D3HH=uHƅHH@1HZHAvL{ 1fDHHHDtDI9D3HH=uHƅHH@1HHPH=u+HƅHH@1HDHD~ƅ~IT$#IT$DH#Ml$HM H7[A{Ls0DHHHHDdDI99 D#H=uHƅHH@1Mcl$I\$MHI0fHHHHDdDI9D#H=uHƅHH@1AIcT$I\$ HHL,-fDHHHHDdDI9ID#H=uHƅHH@1HD$ HWLD$ H(H Ld$(D$0HD$8Hu@IT$DH!HHPH=u+HƅHH@1HD]ƅ]jIT$DH:!HHPH=u+HƅHH@1HD]ƅ]IT$DH IT$H$H5V1H߃gMHڋ H!%tDHJHDщHHH)tfL$'@HHHHDlDI9t9D+H=uHƅHH@1HPH=u+HƅHH@1HD}ƅ}IT$DHIT$DHIT$DH{IT$DHfIT$DHQlI] QwNHPH=u/HƅHH@I]1HD ƅ McB|+ uEl$McMHI.HHHHDdDL9D#H=uHƅHH@1IT$DHPkIT$DH;VIT$DH&AHpHtH HD$(HT$ HT$ H IT$:V DHHpHD$ H IT$DHIT$DHHTL{A H(HHHHDtDL9t9D3H=uHƅHH@1IT$DH/IT$DHIT$DHIT$DHIT$DHIT$DHIT$DHIT$DHHHPH=u+HƅHH@1HD)ƅ)K8IT$DHH TA)Ls8H*HHHHDlDI9t9D+H=uHƅHH@1AT$H$H5^Q1H߃grHHڋ H!%tDHJHDщHHH)tkL$,fHHHHDlDI9t9D+H=uHƅHH@1HPH=u+HƅHH@1HD}ƅ}IT$DHeIT$DHHqPL{A-?H-fDHHHHDtDI9t9D3H=uHƅHH@1IT$DHIT$DHIT$DHIT$DHLDH"LIT$DHH@VH9@iL9\ILLMMH A1 L ID$HD$A<$/L( IL$I9wmf.HHPH=u+HƅHH@1HDlDHI9LD+H)H~A_u{_u{UuLsM9s10HHIHM9VAHЀ vۍH7HQOA_Lk1fDHHHHDdDL9D#H=uHƅHH@1H>OAtLk0DHHHHDdDL9aD#H=uHƅHH@1H$DH5L1HgCHڋ H!%tDHJHDщHHH)tdL$%fHHHHDlDI9t9D+H=uHƅHH@1HPH=u+HƅHH@1HD}ƅ}LchHXMHI/HHHHDdDI9D#H=uHƅHH@1It$H#HH8/[H DHHH 2H FIT$H$H5J1H߃gBHڋ H!%tDHJHDщHH)HL$.HHHHDlDI9D+H=uHƅHH@1HtIFHƒau SduSA $u 9s{ZSLHҚHuHxtH@Ht8/tH$1H5IHg@1HHHHHIHI'HHHHDlDL9uD+H=uHƅHH@1LDHn'g{s{LDHsu{Pu1Ҁ{tfDMd$M A<$/ ID$H 8KuHpHu1Hu@HxtH@Ht8/t럃s{t {HH=u&ƅHHH@1HPDHHLD(ƅ(HH=u&ƅHHH@1HPHD)ƅ)HRDHHpt HD$ H H HHPH=u+HƅHH@1HD>ƅ>HBXWMD$A8o>LDHUlHHcH>H5GHBH5GHΎ)Hu/ƅHHH@HDžHHPHDlƅlHu/ƅHHH@HDžHHPHDuƅukH5FHRf'ID$x=H@<0<1H5}FH蚍DHDA:L{0DHHHHDtDI9\D3H=uHƅHH@1HHu&HƅHH@1HBHD ƅ HQEHA_L{/@HHHHDtDL9~D3H=uHƅHH@1IT$DHhIT$HDH_ zHHu&HƅHH@1HBHD ƅ LDH HH=u&ƅHHH@1HPDHHD[ƅ[IT$ HH=u&ƅHHH@1HPHD]ƅ]hƅHHH@E)ƅ)A<$>HDžHHPHD-ƅ-vL(Dž0E1IT$DH HuƅHHH@HDžmH:AHA{L{ 'HHHDdDI9t=D#HH=uHƅHH@1AFH$H5@HߍP1g7Hڋ H!%tDHJHDщHHH)tbL$#HHHHD|DI9t9D;H=uHƅHH@1H@A}L{'HHHHDdDI9t9D#H=uHƅHH@1MvMEAG|EAIHLEHL4HHHAfo_HGILWGfoWELM)EHH(H AI)_4v`Dž0)HD$ DHHL$ H(H Ld$(HD$8D$0HD$ D\$0H(EHu/ƅHHH@HDžHHPHD H(ƅ XHPZFHHHDfDHH96H;:uHHHHuKfL9uH9uH@H2HH9uHwHE1蒎HHF/<(HH`H(Dž0Hv c<DHHu/ƅHHH@HDžHDHH>L{A>HPHD<ƅHu/ƅHHH@HDžHHPHD(ƅ(ID$靿MMEoIT$:IL$9)LDxl2x3#HB8)t Dž0HRDHfH55:HgI~thLDHHu/ƅHHH@HDžHHPHD ƅ LDH*MALDH3.gIT$DHLDHJ;\}wHcƃXHH HH8HHHchDlHH1L`LVhIHMPLH6LHA9Dž0wIT$DHG|$PHDž(LM9cHV<_NHu/ƅHHH@HDžHHPH\L=HHu/ƅHHH@HDžHHPHD-ƅ-MD$E駾H57H~5LDHgfUHSH(dH%(HD$1HtjBHӃ_4QH$CHH4HHD$HHHXHD$HHk4Dž0HD$dH3%(uH([]g1AWAVAUAATIUHSHMwHHcH>fDLHDH[]A\A]A^A_@H7HA Lk1fDHHHDdDI9D#HH=uHƅHH@1H6HA Lk1fDHHHDdDI9)D#HH=uHƅHH@1H&6HA Lk1fDHHHHDdDL9D#H=uHƅHH@1IT$QfDHH|HBH Ƈ 8HHBHHD ƅ L%e5&Ml$,fHHIH\M9A$H=uHƅHH@1먐HHPH=HD ƅ IT$G@AuNHHPH=u(HƇH@1HD*ƅ*H[]A\A]A^A_D(tNHHPH=u(HƇH@1HD ƅ IT$DHH4LkA:xH2HHHHDdDI9=D#H=uHƅHH@1HH=HPHD&ƅ&H[]A\A]A^A_H3HA L{1fDHHHHDtDI9D3H=uHƅHH@1H2HA L{1fDHHHDtDI9MD3HH=uHƅHH@1H<2HA L{ 1fDHHHDtDI9D3HH=uHƅHH@1H/@H1HAcLk1fDHHHDdDL9D#HH=uHƅHH@1H1HAiLk 1fDHHHDdDI9iD#HH=uHƅHH@1Hn0HA Lk1fDHHHDdDL9D#HH=uHƅHH@1IT$HHHH=u0HƅHH@IT$1HD(ƅ(DHHHHPH=u+HƅHH@1HD)ƅ)H[]A\A]A^A_IT$fƇHE H@HƇH@1HƇH@1+HƅHH@1'AVAUAATIUHSHHsHH r^HB<HcH>fH t%H=AHPH Hƃ H=HPH1LD(L(Hƃ(Hǃ(tHH= HPH)ƃ)HHBH(ƃ(HUHtDHHH=AHPHDLH)ƃ)L([]A\A]A^HH@L(L1DHǃ(HHHH=uHƃHH@1ҸH $fDL1ɉH9HHt!HBH)ƃ)fDƃHH)H@AUATUHSH:2tH[]A\A]HBLchHXMtoHI&HHHHDdDL9t=D#H=uHƅHH@1@H[]A\A]ff.fAUAATIUH1vkHHPH=HDLHD(ƅ(HHPH=t@HD)ƅ)]A\A]HCHs]LA\A]CHƅHH@1HƅHH@1,HBH:f0AWAVE1AUATUSHHHL`LhA<$<d<ǃ<D$BH=uHƃHH@1ҸH DfDLHL HƃHH@1kHƃHH@1UHAWAVAUIATISHHdH%(HE1_TH=LE1u7AD$$<;w*HHsAD$ HDžHHeH<L1AL@1ɃDUaLIL= ILA$MHLLPHDžPLƅXH`LhHDžpHDžxHEHEHEHEHEHEHEHEca}EHcUEHLHE…HNHEH)ԅNHHULHHH)HeHPHHhLƄ5P`EE1ɅALHEdH3%(^HeD[A\A]A^A_]f.ZAA|$ ZI 1LLLP{H_tkE1qHdIHfE1A|$ _qE1p<f(fT <>f/w&@u.HD$dH3%( H([]fDf(Y@t\$D$` É\$T$@=_?-~%= <f(fTf/ f(;H~ ;f(<fTf(Xf(fH~ ;\Hc\4ʍHHcfD(f(DYf(;AYAY\;AY\ ;Y,ʍHAYHcHX ;XAYXYf(fT=<YX,YXY\XXfTfVf(u=h@%~%< 5;f(-:fT\f(ff/w-::fTHp}f(f(fT=P<Xf(fH~\:pHHcHc\Xf(f(YYY\w:Y4ʍHHHcXYY \P:Y\L:YXH:YY\f(\f(XfTfVf(E=!A=: ::YXf(fH~\Y\9Y\9Yf(\\f(\9Y~%:\\L$\f(fTXT$9f/f~=:f/rfW9f(H {Xf(fH~-9\HcDr\58HcfD(f(DYAYAY\58AY\-8YrAYHcHcX-8XAYXYYXY4XAY\Xf(fTAXfTfVƨfW9wDf( 7fYYX 7Y\ 7YX 7Y\ 7Y\YXXT$f==^ff/vfW9 n7f(H zXf(fH~\zrHcHc\X;7f(f(YYY\'7Y XrHcHcYY\ 6Y\ 6YX 6YY\\XwfHt$H|$!\$L$uff/vfW 8f(fT7 _6H yf(Xf(fH~\zrHcHc\rHcHcX6f(f(YYY\ 6Y XYY\ 5Y\ 5YX 5YY\\Xhf.Hd!Df(D5%5YYYX05Y\,5YX(5Y\$5Y\YXX~%64f(fTf/f~=z6f/rfW4f(H mwXf(fH~\Hcr\54HcfD(f(DYAYAY\54YrHcHcXYXYXY4fD(S4AY\N4AYXI4AYXYD\fA(Xf(fTXfTfVf(3%4YYYX3Y\3YX3Y\3Y\YXXNwff.USH(dH%(HD$1fH~\$\$H %ڀ柉T$9 31=?>=_?f(2fT4Hu 22fTf(Xf(fH~\2pHHcHc\Xf(f(YYY\2YXʍHHHc YY\z2Y\v2YXr2YY\\X@mHD$dH3%(HH(f([]fD=h@U~-}32 1fT\f(X\f(D$fTX 1f/T$Of~=33f/A 1f(H&tXf(fH~1\HcDʍH\5R1HcfD(f(DYAYAYAY\521\:1Y ʍHAYHcHX!1XAYYXXYX Y4AY\Xf(fTAXfTfVy=!A%0 0%0~-2YXf(fH~\ 0HYY\ 0Y\f(\\\%0Yf(\\T$\Xf(fTD$/f/f~=l1f/rfW%/f(H_rXf(fH~/\%/Hc\fD(f(DYAYAYAY\%w/\/Y4pAYHcXk/DpHcHXAYYXXDYDXY$YfA(\XXf(fTfTfV΃fW o0f. (/\$D$` É\$T$qfDT$=?>~Ľaf.==rf(^DfWff/vfW/&.f(HpXf(fH~\xpHcHc\X -f(f(YYY\ -Y$pHHcX YY\-Y\-YX-YY\\XfHt$H|$\$D$Hff/vfW.fT.Hof(-f(Xf(fH~\xpHcHc\X,f(f(YYY\,YpHHcX YY\,Y\,YX,YY\\Xxf( $,%l,YYYX ,Y\ ,YX ,Y\ ,Y\YXXfH~Hd!nf( +%+YYYX +Y\ |+YX x+Y\ t+Y\YXXf(w~-, +f(fTf/f~=,f/rfW +f(HmXf(fH~\Hcp\5*HcfD(f(DYAYAY\5*Y pHcHXYXYX Y4fD( *AY\ *AYX *AYXYD\fA(Xf(fTXfTfVNf( *%J*YYYX )Y\ )YX )Y\ )Y\YXXm@fX t&uLu$LLLDLLDL&LDX t&uLu$LLLDLy LDL/LDHL$$X9$~%[*;)f(L$fTf.rHf.fTf.rfTf.rHd"fff.SH@5(%)dH%(HD$81Yf(Yf(\\fH~\H4%=-LVhHcHiҫ*H")Hc @A D{(=c(fL~fL~H AAA)LH H I HfHn1 YYY HH0uHLL$fEH-'Hf(X\\DXBI9uL@HffDXJ(HI9uf($fH~D'XH4\X\$X\$X\$\X\$ X\$(DX\fA(fD(AXDXA\A\D\XفKLcMiҫ*I"A)DGRAD)AHcA fL~I L MfHn1 @A YYY HH0uff(HX\\X@I9uffXA(HI9uf($X\XT$XT$XT$\XT$ XT$(\XfA(f(X\XfA(XA\\~'fTfTf/DXfA(XhD\DXf/ v% %\DXfA(5r%DQ%A,D%XXXfA(ڃXYf(\AXf(\X\AYfA(YY|$\Yf(Xf(YAYYX\XXXX\XHt$8dH34%(}H@[f $1 $1Ld1D$f/v$XD\\DX hffff.U1SH(dH%(HD$1\$\$؀䟉D$9a~~H %=O>oG#(T $/w%@u)HD$dH3%(H([]DY@t\$T$%` ЉD$T$D=_?~%$"(T/[W5"="HxeIK0"X\~Hcȍp\ʍHHcHcɃHYѩ=K#Yə="ѩ=9#ѩ="XY(T=#љ,,ѝ XTV(@=h@=!A:"( %"~%m#\~ ,"""((\ "\l$(TXT$n>!/,W~ "/rW5F!{F!H cX\~Hcz\rHcHcHcYb!Y{!b!b!XCYɩɹ(TXTVƨ,W)"@~%"( Hc- 5e T\ TqK0 2 X\~Hp\HcHcʍHHHcXY5 Yѹ-(T5o!- -Y,,ѝ XTV()fDY \ [ *  Y   XDT$==^W(W %H aXIKP\~rz\HcHc XY%hYVYrHcHc XfHt$H|$\$T$=W(WTH `(QK@%X\~rz\HcHc XY%yYgYrHcHc Xf.>Hd!+DYY(XLD~%h (T/W/~ NrW5{H A_X\~Hcz\Hc,Yb2Y{qb boXCYrHcHcɩ,ѝɹ(TXTV]YY%ٛX_fDUSH(dH%(HD$1~\$\$H %ڀ柉T$9 1=?>=_?W%9H]TaK  X\~Hp\HcHcXY%Y   Y ʍHHHcX@HD$dH3%(H(([]=h@%~-}T\X\L$X(T/D$W~5/%{H\X\~Hcȍp\HcYbwY{bebXCYʍHHcH(٩TٹXUV(=!A e(Ph-h\~>:H(\(ٝ\(T$ٝ~-9TXL$sc/W~5/rW%k{kH[X\~Hcx\pHcHcHYbY{)bb'XCY٩(TٹXUV(΃*W JD \$D$` É\$T$@T$=?>~ýf==^W:W(W  HYXQK@%\~px\HcHcXY%Y  v Y pHHcXf.Ht$H|$\$T$HW(W%2THXqK(X\~px\HcHcXY%YY pHHcXYDCAY%qٛXD~Hd!YY%ٛXD~-8 x(T/W~5"/rW%x{xHWX\~Hcx\ pHcHcHYbY{6bb4XCY٩(TٹXUV(Ye[Y%ٛXWU1SH(dH%(HD$1\$\$؀䟉D$9~~H %=O>o(T /w%@u)HD$dH3%(H([]DY@t\$T$%` ЉD$T$D=_?~%-m(T/sW5/=HUIK0]X\~Hcȍp\ʍHHcHcɃHYk=pYkp=(k=pk=$pXY(T=k`4k,`{ ak XTV(@=h@=!A~%yk  \~i{i{i{i{-0\i{\l$i{0(TXT$/IW~ /rW5{ H |S{X\~Hcz\rHcHcHcYckXYkckLckXCYk Hd!+DY% k @kP k~ kD Y oPkX1~%  (T/W/~ rW5 { H N{%! X\~Hcz\HcYck Ykck ck XCYk0r=_?WY 5 HBMT - aK  w X\~Hp\HcHcXYk% `4Yk@k Pk J Y ʍHHHc{`{y{0X@HD$dH3%("H(([]f=h@%~-=  u T\M X\L$X(T/D$W~5 /%M { M HK{N X\~Hcȍp\HcYck Ykck ck XCYkʍH~ýf=="^W:W(W kH IXQK@-Z\~px\HcHcXYk%P-4Yk@k P,k !Y pHHc{P{a{ XHt$H|$A\$T$HW(W*-THHqK(dX\~px\HcHco(T /w%@u-HD$dH3%(H([]D(Y@t\$D$` É\$T$f=_?-~%] (T/(_HPD G(T(X(~ \Hc\4ʍHHcy((;Y(MSYcY\CsY\ FY,ʍHsYHcHX -XsYXY(T=YX,YXY\XXTV(xD=h@%~%% (-IT\(/w-#cTHC((T=X(~\7pHHcHc\X((YYY\Y4ʍHHHcXYY \Y\YXYY\(\(XTV(F=!A- YX(~\Y\Y\Y(\\(\hY~%\\L$\(TXT$/~=J/rW(H =AX(~-\Hc{r\5jHcy((3Y{YKY\5QSY\-TYrSYHcHcX-:XSYXYYXY4XcY\X(T{XTVƨWU{( YYX xY\ tYX pY\ lY\YXXT$==^/vW (H ?X(~\zrHcHc\X((YYY\Y XrHcHcYY\ Y\ YX YY\\XfHt$H|$\$L$u/vW(T H >(X(~\zrHcHc\rHcHcX((YYY\Y XYY\ Y\ YX YY\\Xuf.Hd!D(%,YYYXY\YXY\Y\YXX~%0p(T/~=/rWp(H =X(~\Hcr\5BHcy((3Y{YKY\5)YrHcHcXYXYXY4y({Y\{YX{YXY;\y)X(TXTV(^%YYYXJY\FYXBY\>Y\YXX`P=USH(dH%(HD$1~\$\$H %ڀ柉T$9 E1=?>=_? (iT9HR; IT(X(~\pHHcHc\X((YYY\UYXʍHHHc YY\)Y\%YX!YY\\X@\HD$dH3%(2H(([]D=h@U~-- MT\(X\(D$TX 7/T$?~=/1 9(H9X(~1\Hc{ʍH\5Hcy((3YsYKYcY\5\Y ʍHcYHcHXXcYYXXYX Y4kY\X(TsXTV}f.=!A} }%~-YX(~\ XHYY\ FY\(\\\%6Y(\\T$\X(TD$j/~=/rW%r(H8X(~j\%NHc\y((3YKY[YcY\%)\1Y4pcYHcX{pHcHXcYYXX;Y;XY$Yy)\XX(TTV΃W % \$D$` É\$T$@T$=?>~ýqf==r(^0DW/vW(H6X(~\xpHcHc\X ((YYY\ Y$pHHcX YY\sY\oYXkYY\\XfHt$H|$\$D$H/vWTpH5((X(~\xpHcHc\X((YYY\YpHHcX YY\iY\eYXaYY\\X( %,YYYX Y\ YX Y\ Y\YXX~Hd!n( T%YYYX @Y\ <YX 8Y\ 4Y\YXX(~- (T/~=/rW (Hu3X(~\Hcp\5Hcy((3YsYKY\5Y pHcHXYXYX Y4y( _sY\ ZsYX UsYXY;\y)X(TXTV]( %YYYX Y\ YX Y\ Y\YXX3fAUfI~fH~fH~ATI UASfH~H H(D9}fH~fH~DAAHLH H I H D)fInfHn=10_1A#f(\f/Xɍf(LH H fWQfHnfHnfHn\YYY\f(YX\\Q҅t+7?H fHnYf/vf(YH(f([]A\A]Hf(f(H fWfHnfHnX\YYY\\Qtf.fInH(X[]A\A]f(fInfInHl$XLd$T$aT$<t$f(DT$t$D u L$f(AA f(fAfH~f(A H-fHnYYfH~fH~H H A͉9AfH~f(ΉfHnfD%A%EHH I LH fInH ŸXfHnfD%fH~-XA%HىH H LfHnfH~H H fHnQDHfH~H3H?H9fI@PtWH< .XH O<HcH>fLHBMtpHDI@x(MHHBHLH@LDMMHDDHBfDDHBLcHBLHBrHE11DHMAIM ExEfDHE11DHMAIM Ex?A@IIM ff.@tjHp<0tew< u'HH<@u4HHV`V1Hf.11A4$IHHH @x11A4$IHHH @xHXHwHHH@H8M9v5L411A4$IHHH @xIM9wHe[A\A]A^A_]11A4$IHHH @xHwHH@L 11@A$IHЃHH ƄxIS11A4$IHHH @x11A4$IHHH @x?w@ DHXHHH@H811A4$IHHH @x11A4$IHHH @x11A4$IHHH @x?w@t HHH HXH(<11A4$IHHH @xH011ɐA$IHЃHH Ƅx?w@t HHH HXǃ@H(11A4$IHHH @x11f.A4$IHHH @x?w@vDHXHMHH@H8711A4$IHHH @xHwHH@L 11@A$IHЃHH ƄxI11A4$IHHH @xH(11A4$IHHH @xH0ǃ@o11A4$IHHH @xH011@A$IHЃHH ƄxH(ǃ@ 11A4$IHHH @x11fA<$IHHH @xHHH@H011A4$IHHH @xHr11A4$IHHH @xHGHD611A4$IHHH @xH11A4$IHHH @x11fA4$IHHH @x^fD?H`HHHfDƒ??HDufDE1Ƀ?1Ƀ?A4$IHHI @xLX@0HH@LL811ǃ@fDA$IHЃHH ƄxIpLLE}6}LHMHLEIHEHHGH`LgHHH}GH`LgHHH_MLM )HHHH 2H )HHHL IGH`LgHHHHHH }HHH HPHD$HifDe _ Y S M G A ; 5 / ) #       @AW01AVAUIHATUSH8HIDžIDžIH$IHIH?H|g <IHIMFHHIcFI)M` ML A eI\Aw@11 HHHH DŽxH`11IHHЃHH DŽx?w@t HHH HX11@HHЃHH DŽxHhƅqA$E1A<Mrqa11DA$IHЃHH ƄxM<4@AHLLIt1H8[]A\A]A^A_A hHMg HHxfDIYHhDHpfD;LLL$|$ HL$|$ HSH/LL$HHD$(HPufD<bJADtIJH8[]A\A]A^A_@IMXH8[]A\A]A^A_M@DLDLHL$(DHIHD$(ID1fDHHЃHI xƅrAD$IIT$IQ@LbHL$(LHHD$(II8HHH9PIHHDž@HDž0HH)EH)HuHH(HH(H)H)HuHHHH0H)H)Hu HHHH8H)H)Hu0HppHHH@H)H)Hu@HphHHHHH)H)HuPHpxHHHPH)H)EHHHXH)E(E8EHEXEhHu`DžDžDžDžDžDžDžHHH`HH)H)DžH1HDžHDžhƅsQA DAD#{SH;I\HII@t u Ix81L0 'fDHtA<FH2HHAII4FAuH@H@tH9tA s$t>@:ttft H>HH:H|H| HzHH)H)HHe@1A@t AuIy8tOHÀ=F IEHD$A@tAƀHD$I@8>:tt I@8A@t Au= EHI+IvAWAVAUATUSH(HL$ H9AHII׽L-P*L .I@L%H.@L[B<(EIcDL>fD11A;IHHH @x?w@t HHH pDHcMMt AuH <DMI‰L@LSH fD?uDoHcLT I9+YDHcHD H([]A\A]A^A_fDP*DHcMMtArH> <CMLoDRЉLZfC}HcHcLT HL @C@IcL>fDC}HcLT #@sC@IcL>11A3IHHH @xILHCH\CHSHcH| H[HBUELHcHHL Ht Ht HL `ESHKHH9BH)ЉHLT $BELHLT }BLjBELHLT {L|$ 0|$ HSHL$HLT$L *I@HBMULۍEHcHcHHt LT H| LT H| Ht gLcSHDDSH5LSH%DSHLSHDSH+CHS<<EHf.HHILMLLLH?I1I)uILjLvL11HHЃHH Ƅx11f;HHHH @x?w@t HHH Hcփx@HcMMt A7uH <L@MI‰L11fHHЃHH ƄxHcփ@HcMMt A7uH( <?M\LE11@HHЃHI „x?+@"HHI LE11HHЃHI „xILILILILI1LI9LAEI9LAEI9LAEwI)LlL1LHIYLLMLLHHI:I9LAE'I LI9LAE I9LAEI!LEH<u EH<uMH@>;>6>f.AWAVAUIATUSHfofoOfoW fo_0Ht$fog@fooP)D$ fow`fop)L$0fofo)T$@)\$Pfofo)d$`)l$p)$)$)$)$)$)$HfofofoH>)$)$)$s $u H|$XA@tAƅHD$IE8@u\HD$H0fH;11fHHЃHH ƄxHHLXH5 B<>v";DHH5 HB<>;CƄ=KDIHIXIH\$HH?stHH?IH[]A\A]A^A_f.H;11fHHЃHH ƄxHHLH@IR$H@HHI,CƄ=DHHc€u(H@HD If.:H@HT H$tH~fDH5 <Q:H_=w I5:HD$$@tƄ$HD$HD$X:AU1ATIUHSHHHLl$HLH$HH@H9H=0 H5SH=  ur= 9Ld$@tƅHD$LHDŽ$PHE8HDŽ$@HDŽ$8HHĘ[]A\A]@=9 u0 * $                ff.UHSHH?HhHH|uHǃH[]K8HH@t uH G <!8HHH[]ff.AWIAVAAUATIUSHHICH$PHt I$ILЃthuIudLHILH1HAHH?H)I9L$@EtHĈ[]A\A]A^A_M7H7ff.AWAVAUIATIUSHHGLwHT$H\$H$`@H$MML Ѕu}H$`Ht#I$ML AǃtpuMHLH HLADžtu'I$AuH$MMLЅtAHĘD[]A\A]A^A_HD$H(fDH/6HcH@t 7uH <26HHff.H@H5HcH 0@t 7uH <5HHf.HHH@HH?H@H@H@H@H(HHg#HHED$H(ff.fH@H@U1ISIHHxIH$LHHLL$H@H$$0H1HD HHHt*QtuHHHT HHuH$HEH$ fH$XfH$HEH$hHEHxH[]Hx1[]@ff.UHAWAVL`IHuAULL@ATLPSRPHhHU>fo`fopfofofofo)Pfofo)`fofo)p)fofo)fo )fo0)fo@))))))) )0:u\HEHtIMLЃtAu4LLLLVuH]LeLmLuL}fo`HIFLfoHLL)PfopfoH?fofo)H))`fofofofoI^)pfofo0))fo))fo )))))) fo@)0LLHHH&1HHt&H@ HH-H=wHHHtHEHL HUH]LeLmLuL}HmHYUHAWAVLAUIHuATILSHRPHHUfoLfofofoMl$Lfo fo0LI\$fo@foP)Hfo`)fop)fo)fo)fo) fo)0fo)@)P)`)p)])e)m)utH]LeLmLuL}LLHhH`HR1HHt,HH=vHH-H=wHHHtHEHL HUH]LeLmLuL}HmHYUHAWAVHuLAULATILSRPHHU5foLfofofoHLfo fo0)fo@foP)fo`fop))fofo)foI|$) fo)0fo)@)P)`)p)])e)m)uRe-LLHhH`1HHt9HHv$f.HHHwHHHtHEHL HUH]LeLmLuL}HmHY~WfUHAWAVAUATISRPHHuH]LeLmLuL}HULHuLL3HL<HLL9,LLHhH`HV1HHt,HH=vHH-H=wHHHtHEHL HUH]LeLmLuL}HmHYff.HGHHtfff.@UHAWIAVIHuAULPATSH`HHxHU fLHAׅu(At(LHbLHAątЃtAHxD[A\A]A^A_]HJH9Nwf.AWIAVAUEATIUS\ H(Ht$D9|mfDMTL$LLIHD$LT$LT$L$xUMHcHD$LLIH3ЅyEIHH\-IA9~0HcÍkHM4MD9|@M MH([]A\A]A^A_ÐAWAVLrAUIATIUHSHHBHHD$AHx!fDELLLuD|$AIcE~1@HTHEA1LLHULHDHH[]A\A]A^A_ff.@tZH@t=v@u H@u6Hf@t(Df1(@tJHp< t5v#<0uHFHfDfLHBMtpHDI@x(MHHBHLH@LDMMHDDHBfDDHBLcHBLHBrHE11DHMAIM ExEfDHE11DHMAIM Ex?A@IIM ff.AVAUIHATIUSHHo f@HIUHImA|$ HSLHL$f@NH\$H9$wH[]A\A]A^ff.@UHSH_ HHj MHD} ztE1HD[]DHxxfDHHxxf.HxxH] fHxxU Hl$RuAfDLuSHHRt%Pu8HPH1HMRuDH[]DHB8A"xHff.AWAVIAUATIUSHHH(o Ll$f@E1IDžuADHCHSHD$HT$HtLH)H9H\HcCtAF t/HSH)L9t#HH$*L}H$IIЅtDHSLLDLD$D $1HL$HƒD $DLD$Hw HHHD$H @Htt \@Htt118ff.@uDUH0g?H11H]USHHH- HHVHNH~HF Ht H=U  H Hy HC(_ t#HtHH=# []% H[]Ð. @11cUH0g=>H11H]=ff.fATUSHHH-+ Ht H= ! H HtMH @IL$(Ht6HPIH@(H9uHHt H=G  L[]A\fL%Y MtTHM H;tcID$(Md$(Mt4I|$AD$ uH9uIT$(HE1[]LA\DHt H= ^ g(IT$(HgCJff.fuDHHH;Cf.AWAVAUATIUSHH8Z H$HH=HD$HD$HD$HD$ D$(gjL|$ MtHD$I$HD$ID$HD$ID$H8L[]A\A]A^A_fL5) Mt H=  H- HufDHm(HtwH;]rHHIHt^MHEI$HEID$E Dm fAEHDqHIWDHH$ID$6L- fH- HHE(HHH H ILHtHMfHB(HR(HtH9 sHU(H(Mt/DE1H=i  fDIcGIH)HD#MH=(  fSHHtXIIɸ     AƒA?h= ~!1   } = ~$ v t r p 56 1Љƒ=t  1؉k H\  LD$H|$D$@AA =f.DЉtGA@t?At(IHArtGA@AӋ$D$t @H HĈ[Atp` у U  t F 9 t '  t  t   %=w f у Eщ t  t y @t  @t n $ t Y t J  t 5  t $ t  @t  @t @ p AV1AUMATMUHSHHT$H H|$t$ Ht 1a HcD$ H\$H|H$H= H/ HHuH=8 u0H Ht$fx68HP H@8H H )H=j }1D$,D$0D$4 Genulntel`ineI1111ZK t t  D$,Ht$@H!v D$0p D$4j }1Ht$HlHD$H1Ht$PHd OHD$P1Ht$XH7 2HD$X= Hs H `Ht$`HrHt$h HHt$p0HH SHIH;v #{%L3tH=`әAuthJcAMD>entiHL$4HT$9H=ʰ ?t5w&<w% h@^ ZEvM|$4B t4* 뢅vPTHygo@Ɓuine@:nGen)D$0`R  ;fAT1AUSHdt HĐ[]A\Hd8 u1HltADH=QtHD1H1t9u0HuD$%= u H9\$(tfDff.fH1<-Hf.AWAVAUATUSH(H L%@ HH HH)HH9rH8H98uLH0L@ @ALx(LpHt M4$I@LD$IC1LL$IDHHHH H%LL$HH >HHLLD$H!MLIEKD1HHHIH)HLLHL$I$HLL$H=Y LD$HQ HL$H# H4HFH6HvLD$LL$tH=賑H9 M$8Hr H[ M$0ID?M$ HM$(H L% IDŽ$PL-R H-; Hз @H H H H([]A\A]A^A_@Hё E1E1E1@Hp?HHH@ HE1E1H >Hp?1HHfDHLM@L)wfAWL=CAVL5:AUM)IATIUSHIt1DLLAHI9uL=| L5| M)It1DLLAHI9uH[]A\A]A^A_ff.UH| H-u| SH)HHtHXTHHuH[]gffffff.AVIAUAATIUHSLH dH%(HD$1H= t 1HoHH H|$EMH5gH o:HDHt$ VHAVP1S aH HT$H5o11dH=` ht$ E1AH "1!Ɖt$ HcHHbD$ Ht$H{BHH= H;7/H5ݴHfHfAUAպATIH5NUHH=}SHH.IDLHHZff.AE111]ffff.H1ffff.ATUHSHtf5H{HE1HAL[]A\fDH{HHHH\uH{H}IċCtbtmH{HaHŋC w&HdHcH>fCIlt E1[]LA\fLcQMtA:M1H{HE1HAI9AEHL1HILI9AEI9AEI9AEI9AEI9AEI)IHtL1HIo;Hc,Hf.UHSHHH~ tYHv8H} H}8t:u'H3H}uHsH}uE+CH[]H}8f.Hv8f.AUIATIUHSHHqI;s*HLLHHt1HxH9rHL[]A\A]Iff.UHAWAVAUATISHxH}DWHhpL`dH%(HE1EHELpM{AF(I~`ELLHÉE;FAvX1EVhLeDF1AMF`HEDzD)EEAωEA)EE@DEAE؅9]IF0ENH<؋E9EYwIΉDtHLxH}LxDtEHEH;]HH+EHIFPHPHHUHEpH`HMHB=[ t * u " tH= HHĀ@HEHEdH3%(+ HEHe[A\A]A^A_]f.EE1HEIM9sIF0K/A~HI6THЅtȉHLxkL{M9roCC4'D9}GAIf+EHMHIFHH9vDtHpLxuIX9EwIwA bfDIF8AvM>H؋BȉLHEBHE[HhHHLxM;H=+ t I%IVxI)@IIFpLKTmL$I<$MuH= t IH=؅ t IMVxINpH]KRHxLHHTHEI%fDI}LMHI)HuHEHxIH]LUHpH^)LUIM]MfpLLU=HDLeH}LE1I$HhH^ID$HEiHHH\H5fHGLxH5fLLHH@HH)L\$ILL]ML]LUHEH1H/HuHMH=y H)H"HH)HD$HIIHHPHuHILH/I uL)H  HHH)Ht$HHHIHBIEuIIT$LUID$IFxfH=X t IJI|$LID$HHHH HHHHMHED: L=+ MHdHHLLHEBHEHHH %H Hͮ = t ͮ u " î tH= HHĀHEH=*dGIHt 8L=V T $= t 5Q u #5F tH== H HĀHEH]E1L}H HEH HHE\AH AiHLcLL-ƭ )&HHɭ IUHHHH H HEHvEHEL]HMHuL]I|$MLDLa&HEHEEWH4 H>H2 AH% HSH]O=# t 5 u #5 tH=ݬ HHĀI|$=߼ t u " tH= HHĀID$HHPHHUIHtHULHgL=( HLUIH= zIHEHUH H]HH)HqH0It$HH̫ H)HHH HH =߻ t u " tH= HHĀID$H H= t IH}z!1H}O/HtjI@/Mt6HW9}A~@,(ID$HID$:H@/HPH HD$H/IHTRANSLIT@/H HP^PPHD$H/HID$ff.UHAWAVAUATSHHhH8HL@DLdH%(HE1HDžpH3A AHH} Id,HtH= ޽H= ޽HhMLD5 HEHELLuljE֐H HEHt H= :޽H}HH5 CH=} H0t H= ޽H0HtH 9HL%I MHH`HcLHD,HHI8CHxLLIH LIDHH)HD$HHHX/LLf8Hx_H.moHHH)LL$IMf.<:CfA7A?Cu ALH=]tfHXH`LLpIHtHhLxLHǹLPLPHMIHHpH=?{ tH=6 1ܽH= %ܽH,dH@tHLhHEdH3%(HeL[A\A]A^A_]ÐM$$MIt$L`uID$8/H`11IH/H`HpH1H5s\MLHpH`|fDDHE+H@L8fDH=\|?Hl8HE`HLDHHt<:u et /LHI} HsE1HHhLMLM@HIK| HAMHLDPHuDHLh(EH=x tH=ۤ ٽH=O ٽH,dDE1E1MIHcPLMT HpL`H0L`H0 HPHxLP Lh(HP0H,dHuhH=x H= ؽH=v ؽHLLHH0H@ LH@HxIIzHxLH@IvHh!H LxHH|:L]L`HIHhLHx8HcHLIHLH HLL`M<$H=v I\$AD$ MT$ AD$HxMl$(ID$0tH=C Lh׽LhH9H5 LLhSH=v LhHtH= s׽LhHt L9#-LLhLh螾fffff.AWAVAUIATIUHSHHHdH%(HD$81H=u t H= ֽHHE11jHPMHSH= jjjLH0H=u It H=d ֽMAv~nI~t'HD$8dH3%(HHL[]A\A]A^A_ÐI~ HtI^ HHxuH{HHtOLLLLHD$Ht0HLxLIHWHt$LH>HL$ HT$LHt$LL$0LD$(]$AǃH=t t H=P սH#HDHjHPH=d St$0t$Pt$PLL$PLD$@H0H=Dt It H= 3սMtAV~vI~t/H|$tLA~H|$0{ofDI~ HtI^ HHxuH{HHtGL*LLzff.AWAVAUATUSHdH%HXH4$dH%(H$H1H9Y tD=ï t 59 u #5. tH=% HIHĀH  D[P EH;CHCH11ۣŃnH$ƿ<D$0GL$I/5E1AL1褦IHPE7AAtD$0.IHL8@HCD$0Ml$AD$AGAT$ID$ A=AOAL$(AO ɉLIL$0AOɉLIL$8AOɉL$AL$X'ID$`AT$hAAD$@ID$HID$PH=nq ID$pID$xtI$1;ҽH4$H1HJL$HHI$I$- C uAHܝ =M t ĝ u " tH= HHĀH$HdH3%( HX[]A\A]A^A_DHuHd8BP T@1D$0LL HC=wAOAL$(AO LIL$0AOLIL$8AOL$AL$X(AOAT$hLIL$`%Ao$AGD$ AG [@LL]SAOAT$hɉLIL$`AG$ȉŅAGȉD$ AG ȉ|$ MLD$IHD$ 1LD$L7QDXl$4f.I7xIDI HBI9cHADA4HLAt ɉLN<Pu1ɀxRuxIup@d@@i@ @o@@l$ @u@|$(@ @Xt @VH813S1ɀx2+x!@dU |$V |$( @ @x @XhH OfL IH3IMLLٟHII)uQE7AA L3 7I1$IH *D2H )D&H DH DH CH @AH CH CH CH CH CH CH CH CH CH yC~H aCrH YCfH KCZ@6Px 4Fx <@d|$m|$(V@A@x+@X[H B1ɀx 6x @d|$|$(u|@uk@xtY@XH Bx @d|$up|$(u]@uL@xt:@XH cB]H YBQH @BEH (B9H 5B-H B!H BH A H A1H AH AH AH AH AH >H AH AH AH {A~H >rH ^Af@6\x 4Rx H@d|$m|$(V@A@x+@XlH @1ɀx 6x @d|$|$(@@xtQ@XH @x u}@dtk|$uX|$(uE@u4@xt"@XH o@iH `@]H Y@QH @@EH (@9H @-H @!1H @H ?H @=H ?H ?H ?H ?H =H ?~ytoje`[VQLGBfH6H?HZ zf.UHcHHAWAVAUATSHdH%(HE1HB%HH)Ld$ILHlgH5>LHagP[gfP .:HINjL0HDž(€΀AfDLL]Ht^ LM0HHdH0HDV t@AT$IHDV ut<#HtuAtL4H(tH5 H= H 4!HEdH3%(QH(He[A\A]A^A_] LHuLL]Huq@AD$I\$u #tHCHDV tDV tf.SHHDV uCHSu.BHtD~ t<  fH H HHʇ H9LH:HHPH'HL LPL-& IHLHHHw H9HJ4HLHLHBLHLLLIHL9H5 LHLHLL k LԆ H5S ML K<HLILILHLHLIELL躾H H(IEHHHHN H7 HuI@AdH= HHH HL- #L,HHHDž(H HHL)L IIH8HxHI9uL%1軠ff.AW1AVAUATUSHH= t 5[ u #5P tH=G H3HĀH= YL= H-U MH5 1t[HFH:u@HH:tHGDHHt:uH9wmutH5q E1=ד t u " | tH=s H菞HĀHL[]A\A]A^A_fDHH5 H)HL= M H E1HD$ftLMt$M9O$7HHIMILl$IuyMH8H MEfAWIAVAAUATUSI_HHH|$LHt$ $LD$LL$ ջAHEH|$ 軻Lh$H1ۃD$(tH$虻HX$I1D$0tH$wHh$LE1D$E1ɾ1 HKt0H ACHI9u݅uiHHt{IL!O 1DA HHHI9v(|D{u@0 wH@8HI9wL[]A\ÐHIHtisoH@E1[]LA\DfIHtAisoIA륐AWAVAUATULSH(HHIIH><_tUtQH@<@tCHstx<_ttH<.uH9t(E1<.<@uHCH{t AE1HHt D8DDHEHt D8DDH(D[]A\A]A^A_H9t<_HHFuCHt<.uA<.`H{EH}CAHfIHuLL$H9tMHHL$H)HT$LL$IIHtoH}HyHT$HL$tAGAELHL$EHT$AGHT$HL$EHHE1Affff.HtOUHt%tt$H]fHH}H}H]|@AUAATUSH_AHHcHf.Ht7H|uH|HJuH1[]A\A] vHtD DhHTHTHuH[]A\A]ÿ BHtDhH[]A\A]AW1E1AVEAUL-GATL%USHHH|$0L$dH%(H$81HD$`fL$`D$IHD$L\$HD$IcA4 |$ZT$~HcD$HRƃ6[HcAT59JH˰D40EMD$D$HID$HD$8IHfDrHjITH9L)IIIwHt$ H'/H=''LD$(HFHH|LD$(HILHUHHT$ M_Ht$LHHT$ LD$(L;D$HT$ ItLHT$HD$ LT$ HT$HLM\IDH9LT$MA sLE1fDHHЅ|$uED$u7LASfH5ID4EL9t.HMHIA t6wHA|tL9uAH;l$tHH$8dH3%(jHHD[]A\A]A^A_@H AHc<)HHcI < H=HcH>D$1IKHMٿD ,IIMYDЃ6wHfAtf9HcH+D48fDIISLD$(AsL\$ HD$HHT$@HT$@zL\$ LD$(HUHAMKlDD$HD$0HtYHH t tDDL$DJAr1L"EOc M>AH=QD4H|$0D$H1=HD$8D$IHI}IHT$@LD$(L\$ HD$@wL\$ LD$(HUHAMKiISIKILD$(HT$HHT$@L\$ HL$@HD$PL\$ LD$(HUHAMK ISILD$(L\$ HT$@HT$@HD$HGISILD$(L\$ HT$@HT$@HD$HIKMKHUAIHH|$0MKHUAHGo11LD$(L\$ @L\$ LD$(HUHHMK[IAHA"111LD$(L\$ L\$ LD$(HUHAMKH|$0D$H8T$0DOHcA w#L H@׃08HcJJDOA vH|$0HT$8D$H :WuHGH|$0HHD$0D$H81HH#T$8HH|$0HT$8D$H =H|$0D$!H [=HH#T$8H H|$0HT$8D$H=IHH#T$8HHH#T$8HH|$0HT$8D$HHH#T$8HHH#T$8H봀=EHH#D$8H HD$8HD$0HD$H8aHH#T$8HALALAHM<H&HcDHHHI)H)yHH#D$8H HHH#D$8H HD$8HD$0HD$H8HH#D$8H Jf.AVAUATIUHSH0dH%(HD$(1HH5&I販H5%LI蠩MH~HX @ trHdH DCHtTDQ u0< wCHt$ HH9\$t*HEIH|$Ll$uHD$I$@H I$HEHD$(dH3%(u H0[]A\A]A^+ff.HHt7t'HHHHtHH!H1u1ffff.1WDHAA1dH%(H$1IH$HH$LʸHDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$HDŽ$'HǸD¸H=w=AA1LοH$dH3%(u$DHDHAd/ffff.AWHAVAUATUSHHH)H8LHH|$LHt$ HT$(N,HvHHvH|$HLHD$HHLp LxH$HPH@HT$H!H|H Ld$ uq@HtH$LLHhHT$(HD$H|$ H)H$Hp H8[]A\A]A^A_:f.IEHIIIHtHtHD$LLLЅI$HI͐Ld$ HAu2XIEHIIIHLH+IuI<$LHD$ЅI$HILd$ u,fAEHIAIHHHD$LLLЅA$HIfLd$ Lt$HL$LLL4$LHL$~>H$LHILH+$I9v@HHHI9wHRHu0H$LHIu4LLHAL,$IH HLHD$LLH$LLHL$$IUHAWMAVIAUATSHHhH}HudH%(HE1H HIIHDžxIIL)HD$HHELuHEH]L}I wXHEL AHUHv HuH}JHx~HEdH3%(THe[A\A]A^A_]@HEL}H4II7HEI9HULDHHPLH9EwHuHUHEHEHH}HEH]fDHELHEH9E8HEM$I9tH}LH薡LmHDIL1H+ELII=f t A0uA0tI8HOqHĀLMPA@LH Au?Hju2HB=Vf t u tH:HqHĀD[ff.HHT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1H$H$HD$HD$ D$0HD$HL$dH3 %(uHKqff.UISHHHT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1H$HHD1 HD$HD$ HD$$D$0%uVHdL%L9Bt<=d t2u2tH:H$oHĀHLBBktHLH߉CtktAu Hjt"HD$dH3%(uFHD[]DHB=c t u tH:HnHĀoffffff.ATUHS AąuHjHH(' H)' HH)H)H91HSH}HtH2WH9-s/ tH9-b/ tH9-Q/ tHD[]A\;SEĀu[HdL%L9BtA1=b t2u2tH:HamHĀHELBB HBUAāfDHB=Yb t u tH:HmHĀH1=b t 5b u #5a tH=a HlHĀH{HQHE=a t a u " a tH=a HlHĀhf.&/I,f.HUSHH%uVHdL%L9Bt<=/a t2u2tH:HkHĀHLBBHH$ H$ HH)H)H9vpHU`E1AAu?Hju2HB=` t u tH:HfkHĀHD[]D+gc%IWfDHGtt4t/H A HC HOHHH0ff.AVAAUATIUH(SQHHH11HHHILB ]HD HH=DLHHAHtNCtt4t/H@ H/C HOHHH0[L]A\A]A^HE1UOH [L]A\A]A^E1ff.fAUATUHSHHIċ%uVHdL%L9Bt<=^ t2u2tH:H+iHĀHLBBucǃLH! H! LH)H)H9LHHAU8AI9ut%HD[]A\A]@tAuHjuHB=] t u tH:HhHĀHD[]A\A]"\I˔ff.AWAVAUATIULSHMIIHH%uVHdL%L9Bt<=] t2u2tH:HgHĀHLBBǃLHe Hf LH)H)H9LLHAW8HHAu?Hnu2HF=X\ tutH>HgHĀI9tEtHIHL[]A\A]A^A_fDLuHnu E11E1H1IIfD 2IZff.HSgAWI׺AVAUEE1ATIUHSH1HdH%(H$1IHDŽ$LcYAtuH< EH$1IHHLI)L=pHDLLLsHT$(H$dH3%(u*H[]A\A]A^A_H@ H$ffHE1HHATAUSHHHdH%(HD$1HU At/Hcȅ~(HCH+CHHHHVHHFTfDHSIH$HMHHXHxLHHpXHH`HKWHp8UZYt2t=HHFH1HT$dH3%(u#H[]A\@ fDHSueDAWAVAUATUSHhdH%(HD$X1HHHH;PHWHOLH9LH0HpXHxHT$8Hp`HpXLLHWLp8LD$HAT$HSHt$HHSHHsAXH AYH;Jt^HSH{8H)螁HC8HSHH+SHCHSHCafDHL$XdH3 %(!Hh[]A\A]A^A_DHdT HG8HGHGHGH?HC0HC(HC HHx0L- L+- L8$ ALʼn%uMdL%M9QtH=W t A1uA1tI9HSbHĀML# MQAAAEuGHju:HB=KW t u tH:HbHĀH1L|$8qJHHP0HHPHPHP(HP HPEDLsLCI)L9DLD$IUH|$@LLLD$LCLCLLH+O L9NHsHS@HH)AVpHL[HIL[Ht HHLHsIPXIHMPXIP`HsHMHHQLAp8LMLAT$ZYLD$81LHHsHJ0H9J'nSHH|$@LH)uoHELC@H u!Hǃ HHdTf.H)LH"~;fDL\$@HL$(H)M4+LT$ H9LLD$HGL\$HT$~LD$HL$(LHT$MHQHAp8L\$ HMLT$0LLAT$^_HLD$8LL)HHHsfDLLe}HCL)sHC@>MLH+ L9LAWfHx@Ht #HH{HHt #HLKHC8HCHCHCHfD Hd L >H +s"H5H=>_IAfAWIAVAUATUSHdH%(H$1HAHH HPHHXH9X2D$H99LAEIHx0&AAu^ML-X HY LL)L)H97Ht$0LAD$H%=Hl$`E1@LxIAHt(It!uIO8HI+wHH9~ H9L- H L).IW8IG@HHH)H)H!H)H9MLL)H9MHL$1LAIH*HL$H2IHL)H9L|$H@pHIw8uIW@H)HL$LHL$IHH9IG8LLD$IGHHIG(IG IG0IIWHP0IOHPHHPHP HPHP(nLD$A'HMMH9D$AHx0HxHt 芶A'LGIG8IG(IG IG0IGIGIGIHP0HP HPHP(HPHHPAIHS IHHQH+HHH)IGI+GH)IHt HE1L- H L)LZMLL)H9DHLAHtIIW8A'IIWIWIWIW(IW IW0IHJ0HJH HJHJ HJHJ(H$dH3%(H[]A\A]A^A_fHx0uHh HXׁ|$H9vWtSMH H LH)H)H91LAH>IAIL(LpCM9Lh@LpPLl$MLAT$ H9#IOLHcI+OL)HHHH)H@H1SfDIIOHIWHF`LHXL+FHIS0IOHcHIGIH0HpIGH)H)H)fDHnH)AHD1IHH9HdHf.E11fDH@HD$fIHM LmHL)HHHDD$IG(EtkI+G HaIH H HH)H)H91LH* HHSLH0+f. Hd eXTAWAVAUATUSHHXdH%(HD$H1HLO(Lo HILL9O0CHD$(LD$ HD$HD$0HD$DLl$HD$@Ll$(Mt$HHJLPHwXLLD$AVLHAXZHT$(L)r(HT$ LD$HH)HI)EtH9AMt-LK(Lk HLL)HZLL$(HC@^@HHJ0HJH HJHJ HJ%u1HJ8HJ(Ht$HdH34%(HX[]A\A]A^A_fDHJ(1M9LLL)'tLK(Lk H1MHJ0HJH HJHJ HJ_VRfUHSHupHHxHLH8L9HwL@HHH HHLH(LL@Hu(Hu Hu@H}Hu0ցH}uHHP H;P8HJHH UtAHpHH)HHtH[]t tH[]DH d H[]fHH(K HHHpHP H[]H)H~vHpHH)HcBHHP DHu HU(HH)]% fHw8HH0HwIHHHHOfHu HU(HH)%DH HH} HH0HHHHHt>LH8HuIH}UHu HU(HH[]H)$H;HHu8UHLH8HuHL@ff.AUATUSHHHHP HpH9v. H)HHH(LhL9tvLLAT$ ~~L)HcHHHHJ HK HH)H)H9HHHHHPHCHCHǃH1[]A\A]HHKLHSHF`LHXL+FHIAT$0HSHH H+SHKH4HHw HW(H) #H[]A\A]Hd8THt$Ht$ff.H#AWAVAUIATIUSHHAUL IF(I~ H)E1HHH9HFHHH1HqAHHH9uHHII~ HH)HEt#IHP HpH9tH)LHHH[]A\A]A^A_fIF8E1H)HH9LH H: tWI9rE1-f.1DHHLL'H)H`@LHM$yIF 5L)AHHBf.UHDFt%uYLdL%M9Pt>=@ t A0uA0tI8H-KHĀLMPA@HE(H;E0s|HHHM(Eu?Hju2HB=-@ t u tH:HJHĀD]DHF(H;F0s.HHHN(@8D]fDDH%4A{DHD] 4IwAWAVAAUIATIUSHdHdH%(H$1HJIHE11ɺLHDŽ$p=HdHHN% LH$^TLDLHL$$H$HH$KWAąHD$ HL$0Hl$(Lt$8H)H)HLmHL9wGLLܦHHtb(H$dH3%(uiHD[]A\A]A^A_LHHHtHLBgLJHHuHD$8HH|$8&IAvfD1UDff.@UHAWAVAUAATSHHhHUHMLELMdH%(HE1HEEHEHEHEAD#AE1D|E1ESfDHHx%Rgt %uxsuA%t:HHH)HH AFHT$HH2HJLjD#EtILcI두{suE/ƒHUEH2HHHpeHpHHcI1HHHH)H\$HJ3II@IuIMHMmLH0HHLL9uAHDDHt|HEdH3%(He[A\A]A^A_]Ë|tHUHBHEH=0!Ht 8O H=$1b0Aǃ6+HR E1ɺ1I HAH!I͹"L@3IHtBD(HxJ\3IT$I4$IeHL9uLH=, Ht73oGff.UH-SHH@HH1@H= tPH=1 @|ATUHStxHӃA Aă߉HcHHA E1HuA D#[L]A\ tHE1d9 uDIE1LÐIUSHHHH H HH)H)H9v HHx)HH[]@T$ H4$T$ H4$Hp4-@SH4HtHC8HC0HC(HC HCHCHCH[ff.fH H  SHHHH0@4Ht+HC8HC0HC(HC HCHCHCH[f.HH  HH d H0[ff.AWAVIAUATUHSHHLL= L- LL)M)t{HLJI9HLHAT$xIHt fHC8HCHCHCHC(HC ~gHC@HC0HL[]A\A]A^A_DHWHw H9tL9svH)HߺA$E1HtLHLL)IufDHS8fK@fDHs HSxff.zAVAUATUSHoHWH;WH8L% H- L)Ls AMʼn%PMdL%M9QtH=6 t A1uA1tI9HAHĀML  MQAAAAEuIj(H)LHs8LHsL)HsHsHs0Hs(Hs H9&HS@HH)AUpH~3HHCHt HHHC[]A\A]A^Hǃу HEщ[]A\A]A^D[]A\A]A^@.MLL)H9LAVHHHt 肛#H,DHB=Y5 t u tH:H@HĀ+Hs8fLT gf Hd IfmSHH8Hs@H)-HC@{pHC8[(ff.@ATUSHHLH, dH%(H$1H LH)H)H9HHA$AąuD$%=H{8Hs@AH)i,H HU HC@HC8HOHCHCHHHCH0H$dH3%(7HĠD[]A\@Hl$0H[*H{8HHIHTHHK@IH4L!L!H9rkH/HS@HHCH{H+CH)HH9}[HHSH1H{{pIHC@H+C8L9 5HH)5+H{8Hl$0H/HS@fHSHS^fD1<HHhHl$0HC8H(HS@4H?>ff.@p$@SHGHHH+w8H;Gtp1HHCH+C8H9uHCHHCHC1[fD [fDUSHHHH dH%(H$1Hd HH)H)H9HHuD$%=tZH H HOHHH0H$dH3%(HĨ[]f.Ht$0HtHH9}HuDCpE1ɹ1(HHeHt$0{p1Ht$0H9t(H)Hǃ4fDHT51HH'HHkHDHH HDHCHD$0HHH Hk%<DUHSHNHH H HH)H)H9vHC HH[]@HC HH[]@AUIATIUHSHHHn Ho HH)H)H9v!HC@HLL[H]A\A]{fAWAVAUATUHSHdH%(H$1%AHG(HW IH_H9_E1H9Hm"H}8AAHL5 H HL)L)H9Ht$H D$(%=Ld$@H9^AfENH}8^H}Ht JeH%HE8HE(HE HE0HEHEHEA%HEH+EI)HH9IE1H!HEHt-H}t&u!HU8HH+MHL9~I9 DL5Y HZ L)HU8HE@MHH)H)L!I)L9HHL)H961HHHMHHL)H9PH@pHu8LEuHU@H)H $HI9;H $HHU8eHIHHULmHEHU(HU HU0L}fMAHtI)AH7LLL)H9RDLHAHt'HU8eHHUHUHUHU(HU HU0H$dH3 %(Hĸ[]A\A]A^A_@H8HG(HO H9HH H HH)H)H91HHHtfHHE(H+E I2LE1D1fHE1HtPLHHdHf.HH9 HEH+EIHH H HH)H)H9?1HHHlf.L5q Hr L) f.LHUH)HU(HHU HHU0HMEHHH H HH)H)H91HL+fDHt$H$Ht$H$@WH+EI@H$H$fDHL$H$HL$H$HEj5f.Hwp|ff.AUIATUSHH~HIHsHx.H)HH~SA}pHHAEttHyAM LH)IHx HIH[]A\A]@LH)1@AWAVIAUIATIUHSHLH_L)H9s(u:Hu~L}H]L)L9sJMHuALL)H[]A\A]A^A_HLLI)QHI4L}H]L)I9wL9LLIGHLQH]IHH M)H HH)H)H9vLLHS@Lgff.@AWAVIAUIATUSHHH8MM]fHC8HHK@H)L9HCHCHCHC(HC HC0HL1MHI)HH H HH)H)H9LLHUpH+HII)Ht HHMHsHkH)L9H(LHI):PHkIHoDHCHCHCHC(HC HC0MHaM)HL[]A\A]A^A_f.fDHHHt #HDELLNLcM)у HEщzfDATUSHHHLH H LH)H)H91HHA$HHK@HS8HHSH)H98HHSHS#HH[]A\HG@H+G8HpHKHKfDHGH+GHHHHWH+W[H)]A\fNHdH|HpHGH;Gs fDUHSHuHEH;EsDH[]fHH H HH)H)H9v HC HH[]fDMfDDGpGtDuZf.ff.AWAVAUE1ATUSHHt]HIH(HӋE% = tZHE0H9vqH)E1HHtcH9LIHFILMM)HE(MuBL)IHL[]A\A]A^A_HU@HH)H9E1Hu@ILH H LH)H)H9HAUHM@H+M8MHv L1HI)MuPIM[K4HL9uD HʹIHH{H5,cFHHGLx,LFL)HxI'|IH LLH=FAU`L LLE1L I@%f.CHFWHLJCCf3wMIL AIu/uAA/AH뢀ɀHMt@MtMtAA@cf<+AHAuHHdD#dD#@E1A./HFu/)HHOHA}u(H 1fHTATHuHLLπH|$H|$Ho o o HPH@Xo o% HHPo- o5 HP Ho=" H@`HHPhHH$@ho Hxo HǀHI$HǀHL$ǀHSXHHǀHHǀ ǀHH0HADŽ$AE11HL0HdAE/IEL$H 8CH5NH=ghOH 8BH5/H=2IOfUHSHptW~cHHpHP H)HE@u,HH, H- HH)H)H9v7HHH1[]6fDHw HW(H)fD#ATUHSHW tPHgHW(H9U@HBHE(Et []A\DHHW*Hu@H9HMHMHMHU(MHU Hu0laHU0]Hu [H]A\H)@Hu HU(HH)mWPf.~FHHHpHP H)HuHU(DHU8HUH'Hu HH)fH HU8EHUHUHULeHI)a HULHHH+M8HHL9HGH‹EHU@ Hd YUSHHHW(Hw H9v6HHpHP H)H}HsH+st?HH` Ha HH)H)H9v[HHt/HCHCHǃ1H[]H)뉐Hd8t̸@Ht$.Ht$fDAWAVAUIATIUHSH(LGHwXHG`LHM)IM)LHHHcJHH9HOHuLH)L9wBI)K<7HH9H}PDf)PHHu1H([]A\A]A^A_@HBdHt$HLD$HT$H$sIHHHT$LD$HHdHI4"=HLHL$"zLuHL4$L+eHE`LuXHL$MHMPHT_HHHH HH)H)H9vHCH[Dt$ H<$SHCt$ H<$H[UHSHLJEHEHUH9Et+HMXHUXEHUHEHHMHUHHEHEH9wbH}`tCHuHudHH] H^ HH)H)H9vhHC HH[]H}HtHqH[]fD4H!D#두UHSHLJEHEHUH9Et+HMXHUXEHUHEHHMHUHHEH9w~HEH}`tCHuHwuTHH= H> HH)H)H9vpHC(HH[]H}HtHQDHPHUH[]fDHpDfAUIATIUSHHH8Htt(ƒLk8Lc@E‰H[]A\A]fDnH8t@ATUSHt ~aHH H HH)H)H9vfHUhu*H{8LHHtt.Hk8Lc@[]A\@LHmffDUSHHHH] H^ HH)H)H9v(HU tHCHPHSH[]cѐHAWAVIAUIATIUHSHWHH)HtzIH H HH)H)H9vlA4$M|$LSt?HMI~(I^0H9sH)H9HFHvLHIe0IF(I)HL[]A\A]A^A_f1fDAHH9uHII~(11ff.fSH HH H IH)I)L9vHC@H [fHT$Ht$H|$HC@HT$Ht$H|$H [fAVIAUIATIUHS fDHu[I)MtFL[t6IuIEH9sH)I9IFHHvHH/I]HfM)[L]A\A]A^ÐH1HyTHHH9uHHIurff.fAUATIUHSHHLH H LH)H)H9HAU`H{8MteHt`LHttkLc8HHk@HC0HC(HC HCHCHCH[]A\A]@HLHtu/j#LfD1@SH HH H IH)I)L9vHCHH 1[DL$Ht$H|$HCHL$1Ht$H|$H [fATUSH cHtFH{8HL HttHk8Lc@[]A\fDKi[]A\fDB u*H - Ht@HtH@hHu Gt7tGt1HG8fHHG@HGHGHGHG HG(HG0HGhHGHHGPHGXHG`HtHH@ff.@7LJHLJHLJfDLJHLJHLJfDADExxHHA0HA8HAHHAHAHA HA(HA@HAHHAPL0HLJHLJHLJf1fUHH8HtEtIHE`HtH@HHuH}HHt fHEHEt H]+]fDfHE@HE8fH@USHHHGH;Gv@8pt;HH H HH)H)H9v0HU0t#H[]HHG@f.t$ t$ USHHHGH;GvHPHW@#H[]HHz H{ HH)H)H9vHU0uH[]fDfHcHH H9 tH9w:fDH)ȃÐAWAVAUATUSH8L- dH%(HD$(1MdH1H5#dH%H93 tF1= t 5 u #5 tH= Hq HĀH  Hf E1P HZdL$%HHpH9p v?LH H LH)H)H9HAWDDtLuDHju7HB= t u tH:HHĀDH H[hHH tV%uMHL9bt<= t2u2tH:H-HĀHLbBHC H9C(fDn e uAHZ = t B u " 8 tH=/ HHĀMt H1]!HD$(dH3%(u?H8D[]A\A]A^A_HD$HhH$FifAW1AVAUATUSH8dH%(HD$(1L- AMH1H5 dH%H;[ tF1= t 59 u #5. tH=% HHĀH  H P HEdL4%ǃH[hH+u⋓tHHt>L;r1=d t  l=O u [LHվ H־ LH)H)H911HAWX~111H1(HHjHB= t u tH:HsHĀ  tMMt H1HD$(dH3%(H8D[]A\A]A^A_fDHM = t 5 u " + tH=" HHĀmf.H H HHC8H{fDHD$HPH$T{rfDB)HLp@ $@fAUATUSH8H- dH%(HD$(1H2H1H5qdH%H9 tF1= t 5 u #5 tH= HWHĀH  HL P H3dL$%@HL9bt<=O t2u2tH:HHĀHLbB%=tu?Hju2HB= t u tH:HHĀH H[hHtbH %4uLH8 H9 LH)H)H9HAUIfD~ u uAHj =+ t R u " H tH=? HHĀHt H1mHD$(dH3%(u7H8[]A\A]fHD$HH$諻?UHSHHHwu-HCt+CEHC`HEHk`H[]+CHff.HWHB`HtH9uH9tHHHuH`HH@G+FDHGHt$HPu+PG)fD+PG)øfH9~HcFցx@HOt$HwXHWHwHWXHWHHOHHWHHHG1f.HOuHwHHWXHOXHOHWHOHHHHwHG1f.f.H`tHG`HHtff.@AWAVAUATUSHHD/LgLwD%M9v1ID$HCAl$@H[]A\A]A^A_L{M)K ?HHL$SIHHL$LLIM)ILL ZHL$LkLcPILknAD$9HHtcLHHKD+LcXHCHHCHHt/LLcXHSALcD+HSXHCHKHDRHt&HLHSPIfDILgfH@fDH@1ffDff.H @1fHGhHdH%H9 tF1=| t 5 u #5 tH= HHĀH| q ff.-Y uAHP = t 8 u " . tH=% HHĀÐH H DHG(HWH9vHGH‹΁ tHGH9s%fHGHO0HO(DfAWAVAUATUSHRH HW(Ls8Lc@1HM)H+K LH9(O|$dM9LbPIHMtLLHLVHC8LK|%1L)KT=LH߹HCHS(Lk L)L)LLHCHCHS(L)LHCHCL)LHCHC@HC0tHBHC(@*HS(H9SsHSH[]A\A]A^A_fHWHGHW(HGfD1H[]A\A]A^A_fAWAVAUATUSH(Lo8T$HW@L)H9D'HAtAH(D[]A\A]A^A_fDHG HNdLw0HHHT$HD$HL$NIHtMHL$t%HT$LHL UHC8HL$ILHL+t$ D$trHC L{L)LHC HC(L)LHC(HC0L)LHC0HCL)LHCHC@HCL9HK<71L)E1HCL{ L)LHCHCL)LHCHCL)LHCHC(L)LHC(HC@HC0L9|HK<71E1L)cH H5H=$ff.@AWAVAAUIATUHHG(HO Ձ~H9UH9GHCGHOII)EMAoLHL9(HL)L9MM9LHGHOfDH9HOPHOHGHGu,LgI)HL]A\A]A^A_fDH9wuHOH9GHCGIII)@%tEAHW(HG II)H)HL)I9I9-%MM9HG LHG(RfHO8$fDHOfDLgI)@HLML)HI9aMMp11E16@LH|$H|$u)HOJ9:1LH|$H|$ Ia&fDHId/fDtu =DfUHH8HtEtHE8H1]fDPfAUIATIUSHHHuT1LH1HLHLc LcLcMt>Lk(Hk0LkHǃH[]A\A]@HHH9HBDLc(Lc0Hkf.ҸHHcJf.ҸSHH1Hc$ [ff.@HG(H9GHCGH+Gf.HH=vH) C ff.H#  H Hе H fHӵ H HH ÐHH ÐHH=w-H HHvHHHHPH HHwH| ff.HHj ÐHHHWHAIH IA1ҺADDHHLBHJAIELGHH9v'@HH)HIGH9IDЈH)H9rD0ff.@@LGHOMLH IHA1HADDH1 IHI!MZItBMZIw5MZIÿt(MItMID@HuWHOLH)HH HuBHBI A8u&DHJH9wH)I D8HuE1Lf uL M9wMLV M9sHvuADtu HOuLH)υtnHGHH9uHI A8u%/HHH9kH)I D8t HuRfDЈHCH;H9=Ѳ v"fIff.UIE1HwSHG`HE1H`HhHHHHtHPH@AHIHuHH9uLLPHGH9tHPH@HHH9uHI9uHACEKAs)AK ACHJ AECH9t[]Ë [AC H Ak$]ACAC@HO`HPHfH@H@HH9uH H9tOGHO`H` fDHAIIH HH H5:WPHE11ARC~H= H ff.HtHHtHHHH H5H=]ff.fATSHL% MH1dL= t 5f u #5[ tH=R HFHĀL%0 Mt2I$xI$H IDŽ$L=J t u " tH= HHĀMt<1= t A4$u A4$tI<$HHĀdL#HL[A\H YH5_H=` fHHH5b1薤fDH H H9t:HPu2HHHv%t o uH HH H9uHH=fAUHATUSHH HHH= HDHH!HtBE1A"@1ҾqHN IHttlHE111A"@-HLIMI$I)H- HL)HLI\$LI\$H[]A\A]f.fDHHE1[L]A\A]DE1A"@1Ҿ1\IHtũ^L룐LH&HHWH HHtUH7IHHH!I)HLH H!HWH!H uI ʬ HHH̬ LHhH Ѽ H5ކH=AH=4@ATH_ USHWL'HHIHHHWLM)H!MI I!HJH!I H\0HLH!H91HHLUHN AM9 t(H G H5H=HyfHH)L)HI@HH HH H9v H u[L]A\ÐH - H5H=I[]LA\DH=@H QE H5nH=E1ff.UH=x HdH%(HD$1HH dH87HHHHHH{H4HgHHSHIfID$pI\$pHXHvHC HC(HT$HHCHH{HSH,+HtHHCILI9HHKHL4+M~Iu&HH)HH{HH9uIHH $-H $M9t$`>LHHkI\$`@LH $LH $!H=ydH==XATUSHHi HB HuHn H-HF HH99L%* M1 M$pH I9(=o tA $A $uH1dL=C t 5 u #5 tH= HHĀLH H HHu-HxI9HxHHHtH H5SH=DH9) Ht$H<$]H<$Ht$,Hʥ HH @H91=9 t2u2tH:HHĀI@L%! L%z TDHI$= t u " z tH=q HHĀdL#I$pH HL[]A\Hp5@HJHd<%tH Ť H9t4H H DH H fH5 HIHM` M LI@IIǀIIItH)HLI1H)ЉHHBHdLdL A@ = t 5 u #5 tH= HHĀH٬ IL%ˬ =4 t u " tH= HHĀމ= t 5 u #5 tH= HHĀL= t a u " W tH=N HrHĀމ= t A4$u A4$tI<$H HĀH5Ң  IH/d<%tH E1~fATH' UHHH9tz= tMuMtH}HHĀ1= t 5բ u #5ʢ tH= HEHĀHH]A\I=v tMuMtH}H7HĀ[HuHHL]A\D@tBH& H H-Hx H/H H{*H AWAVIAUATUSHdH%(H$1Hҡ HD$hL$HD$H$L$HD$`HD$XHD$PHD$8HD$HHD$0HD$@D$$HD$(D$$H5{LƒD$$1袿H\$1= t3u3tH;HHĀE1LD$(HsLE15fDHA1HAHHQH HHQL9tDHHtHx1HH@HHuHHyIHHQIHGHHD$LL$E11LT$H|$(M$ LH`*fDH1L_H HILL9IQHHGHGHGHtL9tA1HE1DHBHRIH9HGH9HBLMRL9uHGLGH7HOHdVfDHD$H5 H9HDŽ$HDŽ$HD$xHt$=> tutH>HHĀHt$H$Ht$0E1Ht$Ht$8LIH\$@Hl$HHH\$pHÐLHLLI t&Mt!ILLH5WH1(IIuL$HH\$pLIMsLl$IILH5IIHD$PHT$XRPHL$(1HT$ 輼XHT ZI9OH$H\$xL1L$H5١HH~H\$`Hl$hLH=xH qHD$HpHD$H9f t$hH5;Lt$ht$ht$h5V P1LL$xLD$pHL$hHT$`H0H$dH3%(H1[]A\A]A^A_H@`111HD$pH%fDHPHHHH@HuHT$xH$H$L$H5L1H$H$`_H\$H5L1HH;HHD$`HD$hH ATUSHXHHCH9v/H H)HH!Ht1 IHݜ HI9t 1[]A\fDHH H Hu81 HtI)tH L)L)% HHXfD@AWAVAUATUSH8dH%(HD$(1HFHHHHH9H@HdH %IHt7LCLHH9=F v#LNH;NL9L;: LH; LDI@HIHI;$7 AD$s= IHHH9 HMHhHttHA9HD$(dH3%(H8[]A\A]A^A_H t AID$`LlH9AD$IEIIHM9$5 Eu#HEH)HHUHH9HM9l$`{CD=IeID$pIT$`H9PiHEHUHaIl$pHhHHHEH\HE={ t A $uA $tI<$H:HĀfDHyI;HHMHP@HULH@@49IH=s\@H=sL@u~Ѓ= t A4$u A4$tI<$HcHĀI@Hwe= t A $uA $tI<$HUHĀGH=7f.HE HE(1HI;$@@H=st@It,fHMHd<%tH.H9HH9uH=ѝ,@AD$sHԗ I9MT$`LHL9eZH KH5pqH=rLHHHEIl$`H=ٝ@HKHuHHljHEHD=H}HH)H@LLH u H5pH=q1Ht@Hu[H6HNI9uH=PH=@HPHHI9$H=H=ќ@HSH}/fDLHE H L= I9AJL: MoH]HsHFH<H)HHxH ˥dH5oH=+ID$`H@HH;4 #H=/ 1= t A4$u A4$tI<$HHĀE1H=FH=H+IH@IILL_I>L_u.MICH=vH jH5nH=jMLH)LH9HEI)$HH9Y HHL$LL$HT$L$LL$L$AHT$HL$AA9KL HsHH9t>H ?wH5mH=,H gH5mH=mIHC ML$`MMYHI9IBHH9q H$\H!HOH9FH)IL!7L}I)I&= LT$J|=HBLT$H$L}I)$H)HIBH >vH5lH=M+ HT$LL\$L $HL$HT$AL\$L $H <E1A1ҹ2H茽HGL}LT$GD- D- Eu#H=ʚ1LT$)LT$y= Ht$'LT$D$G|$LT$H~ E1|$'2ALT$D- 謸LT$DAWAVAUATUHSH8L% HH9= HoE1LM|,LS`HI!Lk`IEIIO\5M9uMt I ID$IHE H$L9H H9H$MIL)H H MYHLHH!J HIyH9MHIIL)HLL)HHIMH9sHI@HH9$rHH I (H)HH9HK`HEHIHIhHAfH U H5jH=6 9, LMl<HI!L9A`@Ml<IM!L9E11A"L׺HL@QLHHHP  9~  uML% MH I9v L%w uH8L[]A\A]A^A_H [ H5~iH=Hd E1DH5 H}@LT$DD$LL$)DD$LT$HH*LL$HpHI LA ILHHLC`HH HHHq(INIt HFIHHI}HH ! H5hH=HκLT$H)LDD$LL$L\$(HL$ LL$DD$LT$HL$ L\$(LC`II DKD5IHHLMu(HLC`H M|$ItIHCL)L!L\$HHt$x Ht$L\$HIH HH; H T HH1H M93@*IL֍ IMu5fL!dHHBH9rVHÕ L EHLC` uK>HL!1L SE1A1"L\$Ht$XHt$L\$HIo H 0H[H HH=3 tMH A-H VR H53fH=˕S MtM9MtLL)HH LH)ILHD$HI0IH)M!IMLy HHH LD$HL)L J9HI@H+ LH! M\I ILHIMKD5KD5I-LH=R =E1LD$L0MA@tLD$1 HHLD$E1E1;H ٚ2 H5dH=eLD$Ht$L\$LD$LD$HL$HL$LD$H=E1A1"L H5MI9w APE1A1"LL$˴L$Hff.AWAVIAUIATUHnSHHHHL9MAAH;-` AGIH5XH=JZNfDt|II(LJ HJ(II(L9I IQ(HJ(LHQ LFI9p&H u H5~XH=iYIT`:IqH H5BXH=YHKLl$ HH9IHHL$I)HL$IIVpH+L9b8L`HPIFpHBHwIFhIvH@ H@(H} I9HH HHSLHHPL< E LC7WH} HL I9tHKH H5EWH=H=XH=EH A H5WH=WqLHLl$ IHe H  H5VH=6X#H=H| H)I (Ll$ I9IN`HIHH HIPHA*  @Ll$ HZ(H[(HSIIL9wH9Xt HCH;PHDLHH)HL$HL$HvvIVpH+L9bu\L`HPIFpHBHvH@ H@(H{ I9HH HHSHHHPJ ;H=1H{ JL;I9 H=҆ff.fHUH1=P t 5f{ u #5[{ tH=R{ HָHĀHuH=/{ I= t { u " { tH={ H踸HĀHL]EDHd 1ff.@HUdH(H1=} t uuutH}H HĀ@HHHH=5 tMuMtH}HHĀHt4dH%Hz1HHHǂ8H)@H]@HHj1@@HHHHu+HtfDH@s@HHsHHX&fAWAVIAUATUHSHZHHHHH9bZHH)H9GHt+ LIHte1HpHHu|HFuOHHS H9sBH)H x LLHHI9HEºHI@HFH H^LHL[]A\A]A^A_1 A@HMl,HI!ILH)Hw ILH)ID$III)σH=Jx LI9t HHLIUKL=IT$H H кID$L9wVMe1LHHuELDHE1d fIL$IMeIMM}fDH чH5nQH=~ATIUHHHvRHH9/HH)H9HGH H t#@HH9wfD H1= t 5v u #5v tH=v HiHĀ-IT$HH=v 9I= t v u " v tH=v HGHĀHLL]A\fDHL1]A\Hd H1]A\HdHHI1=ۨ t 5u u #5u tH=u HaHĀ1LHH@uNH=u =v t u u " u tH=zu H.HĀHf=9 t Pu u " Fu tH==u HHĀHHH=ORfHtfff.@AWAVAUATUSHHHVHHHIH9IA6L4IIvHHH9HH9stL9w`ADHuLBIH}H@I9)I@HHH9vH ʃ!H5MH=OZIT$M4H؃H)HwAHs I9ŸLEH L I\$INMD$HL[]A\A]A^A_H s I4,I9t HAHHLH ӺL I\$HFINn@H H56MH= OfHH9LHD$HD$IT$M4HLHSIt$LD$LLLD$H=yN$@H=N@H HE H9QHHr MD$H9׺LEH I,L ID$HH)HW`HHBff.AWAVAUATUSHdH%(HD$1HIHHEH,1= t 5r u #5 r tH=r H脯HĀHLIŃ= t q u " q tH=q HpHĀMLuH]IH A M}1I=H t 5^q u #5Sq tH=Jq HήHĀAELL1HL`= t q u " p tH=p H襮HĀHL3$IIw I9?Hd 1HL$dH3 %(H[]A\A]A^A_f.LLLH=kp vIHFH$E18@IGL9'HH=,p HHtLIWHILu1G@1HV4蜮H=K o 1= t 5& u #5 tH= HHĀLxo AE1L@DDȃ=; t2u2tH:HͬHĀHpL9ufZn ~~H5 o H=١ t u tH:H蝬HĀHpH9uʃ= t : u " 0 tH=' H[HĀm H dHHt HǁH֖ H5Gn 11HH9tHǀHxHHpH9u@tH y HUK Hm HH HOHm H!Hm fATHm UHSHHGH1Ҹ H9OGHXdH%IIHL9%l  ?HH=m IHH@I@Hl H%H9H _| H5FH=,yHH8d<%\L9%5l JdH%H8DJLB@M"HIHJ@B, I@[L]A\fDE1[]LA\DHE1d L[]A\Ht$[]A\DHdL M1= t A4$u A4$tI<$H3HĀHLqIH=^ t A $uA $tI<$HHĀM%I@ H:k t I@H%HL9H z H5DH=wAIHS1HHHIIHu+MpfDLHHHIIMEfDH z H5NDH=9E豸i HKj xfHH|$¾H|$H@AUHj ATIUH HHvXHH9HH)H9HGHS H t%f.HH9wfD Hwm LHH=i IHtuH@uNtJI@Hfi H%H9t4H x H5CH=yv|@HE1d ]LA\A]fD]HA\A]kE1]A\LA]@]A\A]HE1dDHdL(M1= t Auu AutI}H#HĀLHLIH=K t AMuAMtI}H HĀM2I@H'h t I@H%HL9H Nw H5AH=u.ٶIHQJ|% 1LHHI@IHu(MlLLtLHHIIMDHf.Hf H7g yHt$H<$ŻHt$H<$HT$Hff.HHi HutHtgHGHwu3dH<%tH=f t HH%H81HDVf uH;'f vH=v%HHHHt$HDHHe HHe ĐH<$d<%nHt$H<$Ht$HGRATUSdH,%HtNd%H]@L@dH%HHH;HuHL9uHHdHdHH1= t 58 u #5- tH=$ HHĀHHteHHuH H Hx=, t Ӎ u " ɍ tH= HHĀ[]A\H H5>H=@1AWAVAUATIUHSHHd HHH HHWLwE1HHHHL9AIL$A HM9A9" LHLLLD$4IHH@LD$Hc 8I9H @s H5=H=qHHI[DdH<%Lc LHLfDLL腶LhHtHL[]A\A]A^A_f.HCIL9sLIHtHSHHL荵HE1d DHT$HH[]A\A]A^A_E1oHH[]A\A]A^A_"fIEH%HfDd<%D$HUD$f1=R t A0uA0tI8HHĀLLHLLD$ELD$IŃ= tAuAtI8HȟHĀMtLIEHa t IEH%HI9cH q H5;H=oLLD$LD$HI&HSHLLD$NLD$1LL\H=B=蛱ff.` H+a Ha x 7HHt$H<$莵Ht$H<$H ff.H$` UHxHT$H=:j H]f+f_ SHxVH=i HLD$H?H)H9rHHtL[HH!(Hd 1[fD賴룐AUHATH IULSHH9v HH_ HdH<%D EH-+` L-_ H]HLLIHtyHPt05z * HL[]A\A]fDHi_ t I@H%HL9tBH nx H59H=ms= t ME1  HuI@H9uH9HBHHHOII@I@H''I@I@ H7 I@(I@0HGI@8I@@fL1HH9MHE1d fH am H57H=+:QHt$(LL1HHH[]A\A]fDd<% HdL(M1=~ t Auu AutI}H HĀIm`Hi] H]HI9HHHRH)H9HBL1NIfDLLLHIIMt/=؏ t AMuAMtI}H藚HĀMIPQ #L1L胫IH1LmIH11M`HRJff.AWAVAUATUSH8l[ H|$ D$ L- \ AMD1=׎ t A0uA0tI8HgHĀLL$TL=5e L$IDMWMO/1һM``IfD9~IkuIl$I9tHuHL9v1J| HE0L!H9r4HD5H9HH)H)I9HmI9ufH 7H54H=i1LH0I? 3LH [I)LH nILHwILHI HGȃ|DH &7H5.4H=6i葨L!LL$(LT$ L$L$хLL$(LT$ L$L$D苮M9tS T$ =֌ tAuAtI8H蘗HĀMpM9D$ H8[]A\A]A^A_H|$LD$$ܼ$LD$ HtGHGHOHH=ށ Ht1Ht H@HDHHE1DIHH IA1ADD1HHDTA8ttHrH9wH)A8uHPH=gDAVIAUATUSH0dH%(HD$(1W HD$ fIAH-X )$)D$HfDD1=D t3u3tH;H֕HĀLH4= t u tH;HѕHĀHpH9uHD$ fo $foT$IF AAVHD$(dH3%(uH0L[]A\A]A^Ð;qAWAVAUATUSHHL5/W dH%(HD$81V EHV L%hW 1L|$LHtʉL$ PtDfIG 1A)A)G= t3u3tH;H蔔HĀLHH=V 1H53;uT$H=U 1H52"uT$,H=U 1H52 uDl$Dt$,=x t u tH;H<HĀHpL9H vU H=2+H=YU D1H5b2tH=AU D1H5c2xtU H=#U 1H5v2]tHU 1H=U H5s2AtHT L$ HtHD$8dH3%(uHH[]A\A]A^A_@+0aUSHcHT xg1=Y t 5oU u #5dU tH=[U HߒHĀH=AU ̫E wTH)HcH>蛩fE1w+t HcHHH} A DA= t T u " T tH=T HkHĀHD[]f.A~HS DS AS E1HvHS AS Z@HS AS :@HiS AS @AHSS fD^| Aff.@SHHHHHHBH!HH u)Ht$HT$JH¸ HtH1[fD[fu(R UHx*HH=/+'H]"ff.苧fHS|HHDHÐH H# | HHH9t{ @H7H#HEff.H H#{ HHJ8H9t)H#{ u7{ HH%HEff.H H#[{ HH:H9t)H^;{ uz HHHEff.z HBHAHEfATUHH蝭L`LHtHLHH]A\GZ1]A\HH H#z H9HH0HDff.H H#[z HHzH9t3y tHj-z tH:HVSHEÐSH5AAE1H IIAI)K H9s0LC8rLAIAK H9rLE1ɹAI!fHIAL)K H9s,NGD8wtGMAIK H9rIHI9rHL[M9tI1fI9tIDMAfMAqfE1fDAWAVIAUATIHUHSHHHhdH%(H$X1HT$HpH$PH$HD$PHHH9uHt.H|HHtf.HH)HHLPH9uHD$HH$HHtHD$oH $E1L{IHE1HD$ H)HD$0HALMHD$8HH+D$LHD$(Ht H9D$HGD$(I1OdM9v.Ht$ J<1LD$HL$1HL$LD$IM9BD!HDPHuH$J)H9HCL9r%DHL9s4@8ttLl$0zfHt$8H$H}HLH)HH9rHPH9t[HDL0HPD8LtHH9FH\$(Ll$$1H$XdH3 %(0Hh[]A\A]A^A_HH $HLkH)H9HBE1HHD$ HD$HHHD$H)HHD$IIL9v$Ht$K<&HL$HL$IL9YADHDPHuH4$K>HI9w&fDHI9v<@8|tL|$DH<$HGIHt?H)HuLf.HHt|@8|tL|$ CJ)K>fAWIAVAUATIUSHX6dH%(HD$H1@tp諨IHtcAt\LLHI¨II9VLLLt$IvNLLLLIf.HD$HdH3%(HXL[]A\A]A^A_f.HT$@LLHHD$@HI4HD$ wE11HIH)HD$HL$HMHL$(LH+L$ HL$0LILI9HIICI9wHI94@84tI9H\$1HITL9H$vHt$K<4HL$uH$HL$IL9v@E1LA /I_H)H9L$HBE1HHD$0HD$@D$I,HD$ IGMHD$8H)HD$IHD$(JD=L$LHx:tt$蒦HiIHxL+|$ HEI9w zfHI9toHW8Tt1K4H9vL)II9vNHL$N 9M<KT=I9H$nHt$(K<4PH$IL9PK4H9wHEJ 8HH)Ht$8L HHt~T8TtL|$0yfHt$(HyHHLL)LI9wHpH9t7HDDHpD8DtHH9w"Hl$0H\$ MHI;ff.q H.H3HDfHH H#qq H9HW|HwHDff.Hp H#5q Ht/HuH&HHEf.@tHp tp H<0u]H@H#p HtKt\p H?H9@HD@2p tG uBHHQHE@HIu p HCH'DHDfo H;Hk<HDfDp HOIu^H@H#o HtKo %o tHFJHJHDf.HIHHHEH8uJo H~KHKHDfzo H/;0u]H@H#Yo HtKtn H>H>HD@n tG uBHXHHE@HHun HnBHBHDfn HB:H:HDfDH H#n HHH9t)H n u'n HHHEff.H9Nn u3m tHk4n tHNHpHE n H90u]H@H#m HtKtm H =Hi=HD@bm tG uBHHHE@HFu:m HAHWAHDfm H8H9HDfDHH H#1m H9HzHvHDff.HH H#l H9HH`HDff.H?H?0wK0wFfffOfVfftftffсHHff.HHE19t&wAБHLHI)L'Oc O >AfofftftffDAD)>HIffo foftftffсHfo foftftffсHf.ffofoftfsftffDAD)fofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs|ff.ffofoftfsftffDAD)UfofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs<ff.ffofoftfs ftffDAD)fofHALWIIfIfo fofofsfs fftftffсHfoIPfo fofofsfs fftftffсXHfokff.ftfufIJfo fsfsff.ffofoftfs ftffDAD)fofHALWIIfIfo fofofsfs fftftffс^HfoIPfo fofofsfs fftftffсHfokff.ftfufIJfo fsfs ff.ffofoftfs ftffDAD) fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffс Hfokff.ftfufIJfo fsfs| ff.ffofoftfs ftffDAD)U fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffс Hfokff.ftfufIJfo fsfs< ff.ffofoftfs ftffDAD) fofHALWIIfIfo fofofsfs fftftffс HfoIPfo fofofsfs fftftffсX Hfokff.ftf€ufIJfo fsfs ff.ffofoftfsftffDAD) fofHALWIIfIfo fofofsfsfftftffс^ HfoIPfo fofofsfsfftftffс Hfokff.ftfufIJfo fsfsff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs |ff.ffofoftfsftffDAD)UfofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs <ff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсXHfokff.ftfufIJfo fs fs ff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffс^HfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs ff.ffofoftfsftffDAD)fofHA LW IIfIfo fofofs fsfftftffсHfoIPfo fofofs fsfftftffсHfokff.ftfufIJfo fs fs |ff.ffofoftfsftffDAD)UfofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсHfokff.ftfufIJfo fsfs<ff.ffofoftfsftffDAD)fofHALWIIfIfo fofofsfsfftftffсHfoIPfo fofofsfsfftftffсu\Hfooff.@ftfufIJfo fsfsftfffID H<H4EtHff.H )1ff.)1f %=tooftffftfHtH)fowo^oo ftoV fftog0ftfoF0fftftfHfftH H fHH0H uHW@fEHH)HHHցH)HHf.H@H@HHvooJfofoXftoj ftfor0ffoP ffoX0ftftffffftfȅtftoftfoftfftftffDfHI fL H H0H H )M1II?M)fBofBoLBoBo\ftfBol ftffBot0fBoT Bo\0ftftffftftftftffDfHI fL H H0H LH?HHH )f8uHH@# u1)ffff.H?H?0wK0wFfffOfVfftftffсHHff.HHE19t&wAБHLHI)LgOc O >AfofftftffDAD)^HIffo foftftffсHfo foftftffсHf.ffofoftfsftffDAD)fofHALWIIfIzfo fofof:ftftffсJHfoIAfofftftffDAD).NLM9OMFMHIfff.ffo foftftffсIHfo foftftffсIHfDffofoftfsftffDAD)UfoNLM9rMiMfHALWIIff.@Ifo fofofsfsfftftffсIHfoIVfo fofofsfsfftftffсnIHfoWftfu IvfI4f.fo fsfsff.ffofoftfsftffDAD)foNLM9MMfHALWIIff.@Ifo fofofsfsfftftffс>IhHfoIVfo fofofsfsfftftffсIHfoWftfu IvfI4f.fo fsfs|ff.ffofoftfs ftffDAD)UfoNLM9rMiMfHALWIIff.@Ifo fofofsfs fftftffсIHfoIVfo fofofsfs fftftffсnIHfoWftfu I vfI4f.fo fsfsff.ffofoftfs ftffDAD)foNLM9MMfHALWIIff.@Ifo fofofsfs fftftffс>IhHfoIVfo fofofsfs fftftffсIHfoWftfu I vfI4f.fo fsfs|ff.ffofoftfs ftffDAD)UfoNLM9rMiMfHALWIIff.@Ifo fofofsfs fftftffсIHfoIVfo fofofsfs fftftffсnIHfoWftfu I vfI4f.fo fsfsff.ffofoftfs ftffDAD)foNLM9MMfHALWIIff.@Ifo fofofsfs fftftffс>IhHfoIVfo fofofsfs fftftffс IHfoWftfu I vfI4f.fo fsfs| ff.ffofoftfs ftffDAD)U foNLM9r Mi MfHALWIIff.@Ifo fofofsfs fftftffс I HfoIVfo fofofsfs fftftffсn I HfoWftf€u I vfI4f.fo fsfs ff.ffofoftfsftffDAD) foNLM9 M MfHALWIIff.@Ifo fofofsfsfftftffс> Ih HfoIVfo fofofsfsfftftffс I HfoWftfu IvfI4f.fo fsfs| ff.ffofoftfsftffDAD)U foNLM9r Mi MfHA LW IIff.@Ifo fofofs fsfftftffс I HfoIVfo fofofs fsfftftffсn I HfoWftfu IvfI4f.fo fs fs ff.ffofoftfsftffDAD)foNLM9MMfHA LW IIff.@Ifo fofofs fsfftftffс>IhHfoIVfo fofofs fsfftftffсIHfoWftfu IvfI4f.fo fs fs |ff.ffofoftfsftffDAD)UfoNLM9rMiMfHA LW IIff.@Ifo fofofs fsfftftffсIHfoIVfo fofofs fsfftftffсnIHfoWftfu IvfI4f.fo fs fs ff.ffofoftfsftffDAD)foNLM9MMfHA LW IIff.@Ifo fofofs fsfftftffс>IhHfoIVfo fofofs fsfftftffсIHfoWftfu IvfI4f.fo fs fs |ff.ffofoftfsftffDAD)UfoNLM9rMiMfHA LW IIff.@Ifo fofofs fsfftftffсIHfoIVfo fofofs fsfftftffсnIHfoWftfu IvfI4f.fo fs fs ff.ffofoftfsftffDAD)foNLM9MMfHALWIIff.@Ifo fofofsfsfftftffс>IhHfoIVfo fofofsfsfftftffсIHfoWftfu IvfI4f.fo fsfs|ff.ffofoftfsftffDAD)UfoNLM9rMiMfHALWIIff.@Ifo fofofsfsfftftffсIHfoIVfo fofofsfsfftftffсurIHfo[ff.ftfu IvfI4f.fo fsfsftfffID H<H4EtHff.HI)v  )1f)HGHIIӉH?H?0wU0wPfffOfVfftftffсIHHff.HHE19t&wAБHLHI)LZOc O >AfofftftffDAD)>NLM9_MVMHIfff.ffo foftftffсIHfo foftftffсIHfDffofoftfsftffDAD)efoNLM9MyMfHALWIIff.@Ifo fofof:ftftffсIHfoINfo fofof:ftftffсIHfogftfu IvfIDf.fo fsfsff.ffofoftfsftffDAD)foNLM9M MfHALWIIff.@Ifo fofof:ftftffсfIHfoINfo fofof:ftftffсIHHfogftfu IvfIDf.fo fsfsff.ffofoftfs ftffDAD)foNLM9MMfHALWIIff.@Ifo fofof:ftftffсI HfoINfo fofof:ftftffсIHfogftfu I vfIDf.fo fsfs<ff.ffofoftfs ftffDAD)foNLM92M)MfHALWIIff.@Ifo fofof:ftftffсIHfoINfo fofof:ftftffс>IhHfogftfu I vfIDf.fo fsfsff.ffofoftfs ftffDAD)foNLM9MMfHALWIIff.@Ifo fofof:ftftffсI@HfoINfo fofof:ftftffсIHfogftfu I vfIDf.fo fsfs\ff.ffofoftfs ftffDAD)5foNLM9RMIMfHALWIIff.@Ifo fofof:ftftffс I HfoINfo fofof:ftftffс^ I Hfogftfu I vfIDf.fo fsfs ff.ffofoftfs ftffDAD) foNLM9 M MfHALWIIff.@Ifo fofof:ftftffс6 I` HfoINfo fofof:ftftffс I Hfogftf€u I vfIDf.fo fsfs| ff.ffofoftfsftffDAD)U foNLM9r Mi MfHALWIIff.@Ifo fofof:ftftffс I HfoINfo fofof:ftftffс~ I Hfogftfu IvfIDf.fo fsfs ff.ffofoftfsftffDAD) foNLM9 M MfHA LW IIff.@Ifo fofof: ftftffсV I HfoINfo fofof: ftftffс I8 Hfogftfu IvfIDf.fo fs fs ff.ffofoftfsftffDAD)ufoNLM9MMfHA LW IIff.@Ifo fofof: ftftffсIHfoINfo fofof: ftftffсIHfogftfu IvfIDf.fo fs fs ,ff.ffofoftfsftffDAD)foNLM9"MMfHA LW IIff.@Ifo fofof: ftftffсvIHfoINfo fofof: ftftffс.IXHfogftfu IvfIDf.fo fs fs ff.ffofoftfsftffDAD)foNLM9MMfHA LW IIff.@Ifo fofof: ftftffсI0HfoINfo fofof: ftftffсIHfogftfu IvfIDf.fo fs fs Lff.ffofoftfsftffDAD)%foNLM9BM9MfHA LW IIff.@Ifo fofof: ftftffсIHfoINfo fofof: ftftffсNIxHfogftfu IvfIDf.fo fs fs ff.ffofoftfsftffDAD)foNLM9MMfHALWIIff.@Ifo fofof:ftftffс&IPHfoINfo fofof:ftftffсIHfogftfu IvfIDf.fo fsfslff.ffofoftfsftffDAD)EfoNLM9bMYMfHALWIIff.@Ifo fofof:ftftffсIHfoINfo fofof:ftftffсurIHfokff.ftfu IvfIDf.fo fsfsftfffID H<H4EtHff.HI)v  )1f)HHIӉH?H?0wE0w@oofftftffсXIbHHfDHHE1f9t2wAБHfofoLHI)LCOc ftO >AfoftftffDAD)NLM9MMHIHffof:cHRv.Ifof:cHRvI|fDnI)eHL )ÐfsftffDAD)foNLM9"MMHALWIIHIZfof:Df:c I HI,fof:Df:cb I HfIfoDfsf:c:L9! w DfsftffDAD) foNLM92 M) MHALWIIHIZfof:Df:c I HI,fof:Df:cr I HfIfoDfsf:c:L91 w' Dfs ftffDAD)0 foNLM9B M9 MHALWIIHIZfof:Df:c I HI,fof:Df:c I HfIfoDfsf:c:L9A w7 Dfs ftffDAD)@ foNLM9R MI MHALWIIHIZfof:Df:c I HI,fof:Df:c I HfIfoDfsf:c:L9Q wG Dfs ftffDAD)P foNLM9b MY MHALWIIHIZfof:Df:c I HI,fof:Df:c I HfIfoDfsf:c:L9a wW Dfs ftffDAD)` foNLM9r Mi MHALWIIHIZfof:Df:cI HI,fof:Df:cIHfIfoDfsf:c:L9q wgDfs ftffDAD)pfoNLM9MyMHALWIIHIZfof:Df:cI*HI,fof:Df:cIHfIfoDfsf:c:L9wwDfsftffDAD)foNLM9MMHALWIIHIZfof:Df:cI:HI,fof:Df:cI HfIfoDfsf:c:L9wDfsftffDAD)foNLM9MMHA LW IIHIZfof:D f:cIJHI,fof:D f:cIHfIfoDfs f:c:L9wDfsftffDAD)foNLM9MMHA LW IIHIZfof:D f:c IZHI,fof:D f:cI,HfIfoDfs f:c:L9wDfsftffDAD)foNLM9MMHA LW IIHIZfof:D f:c0IjHI,fof:D f:cI<HfIfoDfs f:c:L9wDfsftffDAD)foNLM9MMHA LW IIHIZfof:D f:c@IzHI,fof:D f:cILHfIfoDfs f:c:L9wDfsftffDAD)foNLM9MMHA LW IIHIZfof:D f:cPIHI,fof:D f:c"I\HfIfoDfs f:c:L9wDfsftffDAD)foNLM9MMHALWIIHIZfof:Df:c`IHI,fof:Df:c2IlHfIfoDfsf:c:L9wDfsftffDAD)foNLM9MMHALWIIHIZfof:Df:cvtIHI0fof:Df:cvJIHf.IfoDfsf:c:L9swf:csBI)v=HJ|Et)H<H4EtHHI)v  )1f)HIӉ1 %=ottȅL9)wH L9_)wÐH@L9?)wÐH`L9)wÐow t^ t˅uoo@og`oF`tV@ttʅztȅuHHH)HI)HHցH)HIsHH€gv:ooX t"tJ oP@oX`tj@tr`tȅttt I9 )wDI tɅt*H I98:)wff.I@tͅt*H@I9y8:)wff.I`VtH`I9= )wff.@E1HуI)ʃ@}_ġ~oġ~o\ ġmtġetL ttH H1HHtHI9 )wfġ~oT@ġ~o\`ġmtl@ġett`ttH H1E1@~HAȾHHLLH@I)vE )w)u"cL9s u)wfD1wf.)w@HHI)L9s)w=,o ttȅu L9s=~=)o ttȅuL9]=7~ ~ttȁNL9=1n nttȃL9L9 )wfnΉf`H f`Ƀ?fp0w8oftfHHHHH@PHfoftftH)HH@HHH)HH@bffoftffoWftf…fo_ ftfÅfog0ftH@fąH?tpH@foftffoWftf…}fo_ ftfÅxfo_0ftfH@/HH?HfH@fofoWfo_ fog0ftftftftffffH@tH@ff…fo_ ftftO0fÅfHD0 ~[foftffoWftf…fo_ ftfÅftO0f1à foftfu]ftOfuW1@HD8HfHD8HD8 H)v8H@H)v(HDfH)vHD fH)vHD0f1ffff.fHnHf`f`H?fpH0w-oftfHHOff.@HHfoftftHHff.Hff.foftf<foWftf…7fo_ ftfÅ2fog0ftH@fąH?t`foftffoWftf…fo_ ftfÅfo_0ftfH@HDfofoWfo_ fog0ftftftftffffH@tH@fuIf…uQfo_ ftftO0fÅuKfHD0ff.HD8HfHD8HD8 HVn}x? w@tH &H HHHZfHttH9HHw@HH H)H HttO tO@tO`HǀHvWHHHff.@ttW t_@tg`ŅUHǀHwŃ@~`ttO tO@ tO`1wff.@tu! tO u1wDH9vgHwH9vWH Hwff.H9v7H@Hwff.H9vH`Hwff.w1f.HwDH HwÐH@HwÐu…uÅuąH`Hwn}x? w)tH H@ff.HttHHwff.fH tuptO ustO@uvtO`HǀHH@ttW t_@tg`Ņu9HǀHwDH HwÐH@HwÐu…uÅuąH`HwHHH)II It7IH)It7ItwH9uoIt7It[H9uSItHH7It=HH9u4oo7ftf1t?H )H9t!II)IHHHH)1IIIIt%oo7ftfсaIJ|H_Hto7ftfЁ*HMIL9H t:o7ftfЁHo7ftfЁHMIL9sqo7ftfЁHo7ftfЁHo7ftfЁuxHo7ftfЁu_HI9uMIL9s7o7ftfЁu5Ho7ftfЁuHI9uI)zMfH4MIL9sHtfo7ftfЁuHI9tMIH t6fo7ftfЁuHfo7ftfЁxHI9fo7ftfЁRHfo7ftfЁ5Hfo7ftfЁHfo7ftfЁHI9uMIL9fo7ftfЁHfo7ftfЁHL9uI) M)fH otƒH@tHHotoV tW o^@t_@of`tg`}H|HtotoV tW o^@t_@of`tg`}1wff.otƒuH|Htotƒuw)wff.88H H 8|8tH H H)t ff.@ɊDL)D)1ff.ftrrksF~~t-+H|Ht~~t-Dot-H|Htot-otƒHH H)H)HotoV tW o^@t_@of`tg`}HǀHƀHHsH H@otƒH H otƒH|HtotƒH H otƒwƒu*ÃuAăD`T`)wfDD T )wff.D@T@)wfff.fHOw2HtHHLIc L> )ooff8V HHHH)H)HHHH@off8 oWfVf8 oW fV f8 oW0fV0f8 H r6oW@fV@f8 oWPfVPf8t H H H H@H@HHL Ic L> H+HHoff8A oWfVf8$ oW fV f8 oW0fV0f8 oW@fV@f8 oWPfVPf8 oW`fV`f8 oWpfVpf8f HƀHǀH@nH r4off8} oWfVf8` H H H HHLIc L> Hoff8) oWfVf8 oW fV f8oW0fV0f8oW@fV@f8oWPfVPf8oW`fV`f8soWpfVpf8Noff8#off8off8off8off8qoff8Coff8off8HHHHH@qH r4off8oWfVf8cH H H HHLIc L> fL1MIML9wwH@offoo_f^fog ff foo0fn0ff8H@H@H@sH@HHLHIc L> H@offoo_f^fog ff foo0fn0ff8AH@H@H@sH@HHLIc L> fDHH@foff8 foWfVf8foW fV f8foW0fV0f8H r6foW@fV@f8foWPfVPf8lH H H H@H@HHLIc L> H3H&Hfoff89foWfVf8foW fV f8foW0fV0f8foW@fV@f8foWPfVPf8foW`fV`f8foWpfVpf8^HƀHǀH@nH r4off8uoWfVf8XH H H HHLIc L> ff.Hfoff8foWfVf8foW fV f8foW0fV0f8foW@fV@f8foWPfVPf8|foW`fV`f8]foWpfVpf88foff8 foff8foff8foff8foff8[foff8-foff8foff8HHH:H@cH r4foff8jfoWfVf8MH H H HHLIc L> L!MIML9wwH@foffofo_f^ffog ff ffoo0fn0ff8H@H@H@sH@HHL8Ic L> H@foffofo_f^ffog ff ffoo0fn0ff8s5H@H@H@sH@HHLIc L> f.HHf8HHf8HHf8HHHHHHHHHHHHHǰHưpHǠHƠ`HǐHƐPHǀHƀ@HpHp6H`H`,HPHP"H@H@HHHHHHHGHNH9= HGHNH9, 1fDHGHNH9 NG9 1ff.oOoVff8 oOoVϲff8 oOoV߲ff8 HGHNH9 HGHNH9 GV)fHGHNH9b HGHNH9Q 1ff.GN9A GV)oOoVff8oOoVβff8oOoV޲ff8HGHNH9HGHNH9GN8%)ff.@HGHNH9rHGHNH9a1ff.GN9QNG8b%)@oWoNff8oWoNͲff8oNoWݲff8HGHNH9HGHNH9GN91ff.HGHNH9HGHNH9q1ff.GN9aGN9S1ÐGN9JGN)DoWoNff8oWoN̲ff8oWoNܲff8oWoNff8NG91oNoWff8moNoW˲ff8RoNoW۲ff87oNoWff8HGHNH9&1oNoWff8oNoWʲff8oNoWڲff8oNoWff8HGHNH91oNoWff8moWoNɲff8RoWoNٲff87oWoNff8HGHNH9&1oNoWff8oWoNȲff8oWoNزff8oWoNff8HNHGH91oNoWff8moWoNDzff8RoWoNײff87oWoNff8HGHNH9&GN)oNoWff8oWoNƲff8oWoNֲff8oWoNff8HGHNH9GNfDoNoWff8MoWoNŲff82oWoNղff8oWoNff8HGHNH9GN91foNoWff8oWoNIJff8oWoNԲff8oWoNff8lHGHNH9vNG9t1foNoWff8-oWoNòff8oWoNӲff8oWoNff8HGHNH9HGHNH91ff.@oNoWff8oWoN²ff8roWoNҲff8WoWoNff8<HGHNH9FHGHNH951ff.@oNoWff8oWoNff8oWoNѲff8oWoNff8HGHNH9HGHNH91ff.@oWoNff8sQoWoNвff8s:oWoNff8s#HGHNH9u1HGHNH9u$1fDHH HH9u HLHD9uH H f9u8u%)@%)fH9#HH@H9HHOLwMc HHM>A f@8~[oHHHIH)HH)H H9I'IH ıL Oc O >A oDHLDHHHH1H)H)H `H9I,(IRH cL Oc O >A fDHfoHfHHAwNH@r*(&(N(V (^0)')O)W )_0H@H@H@HHLIcI> @H;ѰHRfo&(N(V (^0f')O)W )_0H(f@(nP(v`(~pH)g@)oP)w`)pHsHH|2fo&H@foNf'fOfof foN0H@fg fO0H@HHLIcI> ff.@fofoNfoV fo^0fof@fonPfov`fo~pHHffOfW f_0fg@foPfw`fpHsHH|2foH@foNffOfoF foN0H@fG fO0H@H rfoH foNH ffOH HHLIcI> HfoNHfOHHAwLH@r,(F(N(V(^)G)O)W)_H@H@H@LIcI> fDH;HRfoF(N(V(^fG)O)W)_H(f(n(v(~Hv)g)o)w)HsHH|4foFH@foNfGfOfoFfoNH@fGfOH@LIcI> @foFfoNfoVfo^foffonfovfo~HvHfGfOfWf_fgfofwfHsHH|4foFH@foNfGfOfoFfoNH@fGfOH@H r foFH foNH fGfOH LIcI> fDM(H9(NrMHR>A H@(V(^(f/(n?fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHL-IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f.(n>fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@AL?IcI> f.M(H9(NrMHR>A H@(V (^(f-(n=fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V (^(f,(nA )gHR@)oHAHL=IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V (^(f+(n;fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALOIcI> f.M(H9(NrMHR>A H@(V (^(f*(n:fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V (^(f)(n9fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLMIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M&H9(NrMHR>AH@(V(^(f((n8fof:Hv@f:f:H@f:fofW)_r)g)o>A DHR@)gH)oHALIcI> DM(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@AL_IcI> f.M(H9(NrMHR>A H@(V(^(f'(n7fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f&(n6fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHL]IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f%(n5fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHL IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALoIcI> f.M(H9(NrMHR>A H@(V(^(f$(n4fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f#(n3fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHLmIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f"(n2fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f!(n1fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@AL/IcI> f.oFoNLFLNLVL^HNGOLGLOLWL_HOoFHNLFLNLVL^HVGHOLGLOLWL_HWDoFLFLNLVL^HNGLGLOLWL_HOff.fHNLFLNLVL^HVHOLGLOLWL_HWff.@LFLNLVL^HVLGLOLWL_HWLNLVL^HVLOLWL_HWff.@LVL^HVLWL_HWL^HVL_HWff.@HVHWoFoNHNLNLVL^LFVGOHOLOLWL_LGWff.foFoNLNLVL^HNVGOLOLWL_HOWDoFLFLNLVL^HNVGLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐVWfoFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foNLFLNLVL^HNVOLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐfVfWoFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFLFLNLVL^HNVGLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐfVfNfWfOff.@oFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFoNLNLVL^HNVGOLOLWL_HOWDoFLFLNLVL^HNVGLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐVWfoFoNLFLNLVL^HNHVGOLGLOLWL_HOHWff.oFoNLNLVL^HNHVGOLOLWL_HOHWoFLFLNLVL^HNHVGLGLOLWL_HOHWDoFLFLNLVL^HNHVGLOLWL_HOHWfLFLNLVL^HNHVLGLOLWL_HOHWff.@LNLVL^HNHVLOLWL_HOHWLVL^HNHVLWL_HOHWff.@L^HNHVL_HOHWHNHVHOHWff.@VNWOoFoNLFLNLVL^HNHVGOLGLOLWL_HOHWff.oFoNLNLVL^HNHVGOLOLWL_HOHWoFLFLNLVL^HNHVGLGLOLWL_HOHWDoFLNLVL^HNHVGLOLWL_HOHWff.fLFLNLVL^HNHVLGLOLWL_HOHWff.@LNLVL^HNHVLOLWL_HOHWLVL^HNHVLWL_HOHWff.@L^HNHVL_HOHWHNHVHOHWff.@VNWOoFoNLFLNLVL^HNHVGOLGLOLWL_HOHWff.oFoNLNLVL^HNHVGOLOLWL_HOHWoFLFLNLVL^HNHVGLGLOLWL_HOHWDoFLNLVL^HNHVGLOLWL_HOHWff.fLFLNLVL^HNHVLGLOLWL_HOHWff.@LNLVL^HNHVLOLWL_HOHWLVL^HNHVLWL_HOHWff.@L^HNHVL_HOHWHNHVHOHWff.@VNWOoHvAfHHpooNoV o^0of@onPov`o~pHHffOfW f_0fg@foPfw`fpHsHH|2ooNoV o^0Hv@ffOfW f_0H@H@HHL(IcI> oNHvAfOHHpoFoNoVo^ofonovo~HvHfGfOfWf_fgfofwfHsHH|4oFoNoVo^HvfGfOfWf_HH@LNIcI> fH9#HH9rHOvvHOLwMc HHM>A fDoHHHIH)HH)H ևH9I'It|H ݇LOc O >A oDHLDHHHH1H)H)H H9I )IRH LOc O >A fDHfoHfHHAwNH@r*(&(N(V (^0)')O)W )_0H@H@H@HHLIcI> @H;HRfo&(N(V (^0f')O)W )_0H(f@(nP(v`(~pH)g@)oP)w`)pHsHH|2fo&H@foNf'fOfof foN0H@fg fO0H@HHLIcI> ff.@fofoNfoV fo^0fof@fonPfov`fo~pHHffOfW f_0fg@foPfw`fpHsHH|2foH@foNffOfoF foN0H@fG fO0H@H rfoH foNH ffOH HHLIcI> HfoNHfOHHAwLH@r,(F(N(V(^)G)O)W)_H@H@H@LkIcI> fDH;HRfoF(N(V(^fG)O)W)_H(f(n(v(~Hv)g)o)w)HsHH|4foFH@foNfGfOfoFfoNH@fGfOH@LIcI> @foFfoNfoVfo^foffonfovfo~HvHfGfOfWf_fgfofwfHsHH|4foFH@foNfGfOfoFfoNH@fGfOH@H r foFH foNH fGfOH LIcI> fDM(H9(NrMHR>A H@(V(^(f/(n?fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHL IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALoIcI> f.M(H9(NrMHR>A H@(V(^(f.(n>fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V (^(f-(n=fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLmIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V (^(f,(nA )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V (^(f+(n;fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@AL/IcI> f.M(H9(NrMHR>A H@(V (^(f*(n:fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHL}IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V (^(f)(n9fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHL-IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.M&H9(NrMHR>AH@(V(^(f((n8fof:Hv@f:f:H@f:fofW)_r)g)o>A DHR@)gH)oHALIcI> DM(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@AL?IcI> f.M(H9(NrMHR>A H@(V(^(f'(n7fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f&(n6fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHL=IcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f%(n5fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALOIcI> f.M(H9(NrMHR>A H@(V(^(f$(n4fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f#(n3fof: Hv@f: f: H@f: fofW)_r)g)o>A )gHR@)oHAHLMIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf: f: f: f: )O()WH)_r )'>A )'HR@ALIcI> f.M(H9(NrMHR>A H@(V(^(f"(n2fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@AL_IcI> f.M(H9(NrMHR>A H@(V(^(f!(n1fof:Hv@f:f:H@f:fofW)_r)g)o>A )gHR@)oHAHLIcI> M(H9(NrMHR>A @(VH@(^(f(nHvf:f:f:f:)O()WH)_r )'>A )'HR@ALIcI> f.oFoNLFLNLVL^HNGOLGLOLWL_HOoFHNLFLNLVL^HVGHOLGLOLWL_HWDoFLFLNLVL^HNGLGLOLWL_HOff.fHNLFLNLVL^HVHOLGLOLWL_HWff.@LFLNLVL^HVLGLOLWL_HWLNLVL^HVLOLWL_HWff.@LVL^HVLWL_HWL^HVL_HWff.@HVHWoFoNHNLNLVL^LFVGOHOLOLWL_LGWff.foFoNLNLVL^HNVGOLOLWL_HOWDoFLFLNLVL^HNVGLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐVWfoFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foNLFLNLVL^HNVOLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐfVfWoFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFLFLNLVL^HNVGLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐfVfNfWfOff.@oFoNLFLNLVL^HNVGOLGLOLWL_HOWff.foFoNLNLVL^HNVGOLOLWL_HOWDoFLFLNLVL^HNVGLGLOLWL_HOWoFLNLVL^HNVGLOLWL_HOWff.@LFLNLVL^HNVLGLOLWL_HOWÐLNLVL^HNVLOLWL_HOWfLVL^HNVLWL_HOWÐL^HNVL_HOWfHNVHOWÐVWfoFoNLFLNLVL^HNHVGOLGLOLWL_HOHWff.oFoNLNLVL^HNHVGOLOLWL_HOHWoFLFLNLVL^HNHVGLGLOLWL_HOHWDoFLFLNLVL^HNHVGLOLWL_HOHWfLFLNLVL^HNHVLGLOLWL_HOHWff.@LNLVL^HNHVLOLWL_HOHWLVL^HNHVLWL_HOHWff.@L^HNHVL_HOHWHNHVHOHWff.@VNWOoFoNLFLNLVL^HNHVGOLGLOLWL_HOHWff.oFoNLNLVL^HNHVGOLOLWL_HOHWoFLFLNLVL^HNHVGLGLOLWL_HOHWDoFLNLVL^HNHVGLOLWL_HOHWff.fLFLNLVL^HNHVLGLOLWL_HOHWff.@LNLVL^HNHVLOLWL_HOHWLVL^HNHVLWL_HOHWff.@L^HNHVL_HOHWHNHVHOHWff.@VNWOoFoNLFLNLVL^HNHVGOLGLOLWL_HOHWff.oFoNLNLVL^HNHVGOLOLWL_HOHWoFLFLNLVL^HNHVGLGLOLWL_HOHWDoFLNLVL^HNHVGLOLWL_HOHWff.fLFLNLVL^HNHVLGLOLWL_HOHWff.@LNLVL^HNHVLOLWL_HOHWLVL^HNHVLWL_HOHWff.@L^HNHVL_HOHWHNHVHOHWff.@VNWOoHvAfHHpII)I9s HH9ooNoV o^0of@onPov`o~pHHffOfW f_0fg@foPfw`fpHsHH|2ooNoV o^0Hv@ffOfW f_0H@H@HHLIcI> ff.ooNoV o^0of@onPov`o~pHH))O)W )_0)g@)oP)w`)pHsHH|.ooNoV o^0Hv@))O)W )_0H@H@HHL%IcI> oNHvAfOHHpII)I9s I9oFoNoVo^ofonovo~HvHfGfOfWf_fgfofwfHsHH|4oFoNoVo^HvfGfOfWf_HH@L:IcI> D@oFoNoVo^ofonovo~HvH)G)O)W)_)g)o)w)HsHH|0oFoNoVo^Hv)G)O)W)_HH@L}IcI> H9HH@H9sHHs@@8vHHLIcI> L¶IcI> ff.f@8~[oIHHIM)L)LIIH \H9#LHOc M>A H [HH9}HHoFLGIIL1L)L)IILºHOc M>A fDIIIL; [Hffof(V)W(^ )_ (f0)g0(N@)O@(VP)WP(^`)_`(fp)gpHHHsAH€HHLIcI> H(N)O(V)W(^)_(f)g(n)o(n)o(n)o(n)oHHHvsAH€H)H)L״IcI> fH(N(V(^(f/(n?(vO(~_D(FoD(NHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(fE:D)GHHHvoAH€H)H)L^IcI> fH(N(V(^(f.(n>(vN(~^D(FnD(N~HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL۴IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(~fE:D)GHHHvoAH€H)H)LޱIcI> fH(N(V (^(f-(n=(vM(~]D(FmD(N}HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(}fE:D)GHHHvoAH€H)H)L^IcI> fH(N(V (^(f,(n<(vL(~\D(FlD(N|HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL۱IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(|fE:D)GHHHvoAH€H)H)LޮIcI> fH(N(V (^(f+(n;(vK(~[D(FkD(N{HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D({fE:D)GHHHvoAH€H)H)L^IcI> fH(N(V (^(f*(n:(vJ(~ZD(FjD(NzHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHLۮIcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(zfE:D)GHHHvoAH€H)H)LޫIcI> fH(N(V (^(f)(n9(vI(~YD(FiD(NyHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(yfE:D)GHHHvoAH€H)H)L^IcI> fH(N(V(^(f((n8(vH(~XD(FhD(NxHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL۫IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(xfE:D)GHHHvoAH€H)H)LިIcI> fH(N(V(^(f'(n7(vG(~WD(FgD(NwHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHL[IcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(wfE: D)GHHHvoAH€H)H)L^IcI> fH(N(V(^(f&(n6(vF(~VD(FfD(NvHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHLۨIcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(vfE: D)GHHHvoAH€H)H)LޥIcI> fH(N(V(^(f%(n5(vE(~UD(FeD(NuHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHL[IcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(ufE: D)GHHHvoAH€H)H)L^IcI> fHfoN(V(^(f$(n4(vD(~TD(FdD(NtHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HkAH€HHLڥIcI> D(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(tfE: D)GHHHvoAH€H)H)LޢIcI> fH(N(V(^(f#(n3(vC(~SD(FcD(NsHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHL[IcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(sfE: D)GHHHvoAH€H)H)L^IcI> fH(N(V(^(f"(n2(vB(~RD(FbD(NrHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHLۢIcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(rfE:D)GHHHvoAH€H)H)LޟIcI> fH(N(V(^(f!(n1(vA(~QD(FaD(NqHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(qfE:D)GHHHvoAH€H)H)L^IcI> foAfHHHH CH9wHH)HIIL9vHH1HHooNoV o^0of@onPov`o~pffOfW f_0fg@foPfw`fpHHsHH€HHHooNoV o^0of@onPov`o~pffOfW f_0fg@foPfw`fpHH{H€HHLIcI> fHHoFLGIHI)L)L)H "BH9wHH)HIIL9vHH1HHoNoVo^ofonovo~DoFfOfWf_fgfofwffDGHvHsHH€HH@@HoNoVo^ofonovo~DoFfOfWf_fgfofwffDGHvHsAH€H)H)L4IcI> ff.@FGFGFGFGFGFGFGFGff.@qqFGFGFGFGFGFGFNGOff.@HVHNHWHOff.@rrFGFGFGFGFGFGFNGOff.@HVHNHWHOff.@ssFGFGFGFGFGFGFNGOff.@HVHNHWHOff.@ttFGFGFGFGFGFGFNGOff.@HVNHWOÐuuFGFGFGFGFGFGFNGOff.@HVNHWOÐvvFGFGFGFGFGFGFNGOff.@HVNHWOÐwwFGFGFGFGFGFGFNGOff.@HVNHWOÐxxFGFGFGFGFGFGFNGOff.@HVHWyyFGFGFGFGFGFGFNGOff.@VNWOzzFGFGFGFGFGFGFNGOff.@VNWO{{FGFGFGFGFGFGFNGOff.@VNWO||FGFGFGFGFGFGFNGOff.@VWf}}FGFGFGFGFGFGFNGOff.@fVfNfWfOff.@~~FGFGFGFGFGFGFNGOff.@VfWFGFGFGFGFGFGFNGOff.@VWFpGpF`G`FPGPF@G@F0G0F G FGÐFGFoGoF_G_FOGOF?G?F/G/FGFGHVHHWHÐF~G~FnGnF^G^FNGNF>G>F.G.FGFGHVHHWHÐF}G}FmGmF]G]FMGMF=G=F-G-FGF G HVHHWHÐF|G|FlGlF\G\FLGLF<G<F,G,FGF G HVHHWHÐF{G{FkGkF[G[FKGKF;G;F+G+FGF G HVHHWHÐFzGzFjGjFZGZFJGJF:G:F*G*FGF G HVHHWHÐFyGyFiGiFYGYFIGIF9G9F)G)FGF G HVHHWHÐFxGxFhGhFXGXFHGHF8G8F(G(FGFGHHfFwGwFgGgFWGWFGGGF7G7F'G'FGFGVWDFvGvFfGfFVGVFFGFF6G6F&G&FGFGVWDFuGuFeGeFUGUFEGEF5G5F%G%FGFGVWDFtGtFdGdFTGTFDGDF4G4F$G$FGFGff.FsGsFcGcFSGSFCGCF3G3F#G#FGFGfVffWfÐFrGrFbGbFRGRFBGBF2G2F"G"FGFGffFqGqFaGaFQGQFAGAF1G1F!G!FGFGf.H9gHH9r'|$HLIcI> Hs$HHLIcI> f.oIHHIM)L)LIIH !1H9(LHOc M>A ff.fH 0HH9HHoFLGIIL1L)L)IIL”HOc M>A fDIIIL; 0Hffof(V)W(^ )_ (f0)g0(N@)O@(VP)WP(^`)_`(fp)gpHHHsAH€HHLIcI> H(N)O(V)W(^)_(f)g(n)o(n)o(n)o(n)oHHHvsAH€H)H)L׎IcI> fH(N(V(^(f/(n?(vO(~_D(FoD(NHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(fE:D)GHHHvoAH€H)H)L^IcI> fH(N(V(^(f.(n>(vN(~^D(FnD(N~HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHLێIcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(~fE:D)GHHHvoAH€H)H)LދIcI> fH(N(V (^(f-(n=(vM(~]D(FmD(N}HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(}fE:D)GHHHvoAH€H)H)L^IcI> fH(N(V (^(f,(n<(vL(~\D(FlD(N|HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHLۋIcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(|fE:D)GHHHvoAH€H)H)LވIcI> fH(N(V (^(f+(n;(vK(~[D(FkD(N{HfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D({fE:D)GHHHvoAH€H)H)L^IcI> fH(N(V (^(f*(n:(vJ(~ZD(FjD(NzHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHLۈIcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(zfE:D)GHHHvoAH€H)H)LޅIcI> fH(N(V (^(f)(n9(vI(~YD(FiD(NyHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(yfE:D)GHHHvoAH€H)H)L^IcI> fH(N(V(^(f((n8(vH(~XD(FhD(NxHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHLۅIcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(xfE:D)GHHHvoAH€H)H)LނIcI> fH(N(V(^(f'(n7(vG(~WD(FgD(NwHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHL[IcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(wfE: D)GHHHvoAH€H)H)L^IcI> fH(N(V(^(f&(n6(vF(~VD(FfD(NvHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHLۂIcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(vfE: D)GHHHvoAH€H)H)LIcI> fH(N(V(^(f%(n5(vE(~UD(FeD(NuHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHL[IcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(ufE: D)GHHHvoAH€H)H)L^~IcI> fHfoN(V(^(f$(n4(vD(~TD(FdD(NtHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HkAH€HHLIcI> D(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(tfE: D)GHHHvoAH€H)H)L|IcI> fH(N(V(^(f#(n3(vC(~SD(FcD(NsHfE: D)OpfD: D)G`f: )Pf: )w@f: )o0f: )g f: )_f: )HlAH€HHL[~IcI> fD(N(Vf: )O(^f: )W(ff: )_(nf: )g(vf: )o(~f: )wD(FfA: )D(sfE: D)GHHHvoAH€H)H)L^{IcI> fH(N(V(^(f"(n2(vB(~RD(FbD(NrHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL|IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(rfE:D)GHHHvoAH€H)H)LyIcI> fH(N(V(^(f!(n1(vA(~QD(FaD(NqHfE:D)OpfD:D)G`f:)Pf:)w@f:)o0f:)g f:)_f:)HlAH€HHL[{IcI> fD(N(Vf:)O(^f:)W(ff:)_(nf:)g(vf:)o(~f:)wD(FfA:)D(qfE:D)GHHHvoAH€H)H)L^xIcI> foAfHHHH II)I9s I9H9wHH)HIIL9vHH1HHooNoV o^0of@onPov`o~pffOfW f_0fg@foPfw`fpHHsHH€HHHooNoV o^0of@onPov`o~pffOfW f_0fg@foPfw`fpHH{H€HHLxIcI> ff.HHoFLGIHI)L)L)H II)I9s I9H9wHH)HIIL9vHH1HHoNoVo^ofonovo~DoFfOfWf_fgfofwffDGHvHsHH€HH@@HoNoVo^ofonovo~DoFfOfWf_fgfofwffDGHvHsAH€H)H)LuIcI> ff.FGFGFGFGFGFGFGFGff.@qqFGFGFGFGFGFGFNGOff.@HVHNHWHOff.@rrFGFGFGFGFGFGFNGOff.@HVHNHWHOff.@ssFGFGFGFGFGFGFNGOff.@HVHNHWHOff.@ttFGFGFGFGFGFGFNGOff.@HVNHWOÐuuFGFGFGFGFGFGFNGOff.@HVNHWOÐvvFGFGFGFGFGFGFNGOff.@HVNHWOÐwwFGFGFGFGFGFGFNGOff.@HVNHWOÐxxFGFGFGFGFGFGFNGOff.@HVHWyyFGFGFGFGFGFGFNGOff.@VNWOzzFGFGFGFGFGFGFNGOff.@VNWO{{FGFGFGFGFGFGFNGOff.@VNWO||FGFGFGFGFGFGFNGOff.@VWf}}FGFGFGFGFGFGFNGOff.@fVfNfWfOff.@~~FGFGFGFGFGFGFNGOff.@VfWFGFGFGFGFGFGFNGOff.@VWFpGpF`G`FPGPF@G@F0G0F G FGÐFGFoGoF_G_FOGOF?G?F/G/FGFGHVHHWHÐF~G~FnGnF^G^FNGNF>G>F.G.FGFGHVHHWHÐF}G}FmGmF]G]FMGMF=G=F-G-FGF G HVHHWHÐF|G|FlGlF\G\FLGLF<G<F,G,FGF G HVHHWHÐF{G{FkGkF[G[FKGKF;G;F+G+FGF G HVHHWHÐFzGzFjGjFZGZFJGJF:G:F*G*FGF G HVHHWHÐFyGyFiGiFYGYFIGIF9G9F)G)FGF G HVHHWHÐFxGxFhGhFXGXFHGHF8G8F(G(FGFGHHfFwGwFgGgFWGWFGGGF7G7F'G'FGFGVWDFvGvFfGfFVGVFFGFF6G6F&G&FGFGVWDFuGuFeGeFUGUFEGEF5G5F%G%FGFGVWDFtGtFdGdFTGTFDGDF4G4F$G$FGFGff.FsGsFcGcFSGSFCGCF3G3F#G#FGFGfVffWfÐFrGrFbGbFRGRFBGBF2G2F"G"FGFGffFqGqFaGaFQGQFAGAF1G1F!G!FGFGf.H9S<HH@H93<HH L H]HHrob|Hb|HNb|HVb|H^b|Hab|Hib|Hqb|Hyb|Hb|HOb|HWb|H_b|Hab|Hib|Hqb|HyÀr7b|Hb|HNb|HQb|HYb|Hb|HOb|HQb|HYÀ@r)ooN oQoYO ~Q~YÀ rooI~IooIzIÀrH6HIH7IIÀr 6I7AIÀrf6fIf7fAIÀrLL9HBV@@@@QQb|Hb|HNb|HVb|H^b|Hfb|Hnb|Hvb|H~bq|HAbq|HIbq|HQbq|HYbq|Habq|Hibq|Hqbq|Hyb|Hb|HOb|HWb|H_b|Hgb|Hob|Hwb|HbQ|HAbQ|HIbQ|HQbQ|HYbQ|HabQ|HibQ|HqbQ|HyH9^Ibq|HAbq|HIbq|HQbq|HYbq|Habq|Hibq|Hqbq|HyV@@b|Hb|HNb|HVb|H^b|Hfb|Hnb|Hvb|H~HV@@b|Hb|HOb|HWb|H_b|Hgb|Hob|Hwb|HHL9JbQ|HbQ|HIbQ|HQbQ|HYbQ|HabQ|HibQ|HqbQ|HyHbq|HFbq|HNbq|HVbq|H^bq|Hfbq|Hnbq|Hvbq|H>QQ@@b|HAb|HIb|HQb|HYb|Hab|Hib|Hqb|HyHQQ@@b|HAb|HIb|HQb|HYb|Hab|Hib|Hqb|HyII9Gbq|HGbq|HObq|HWbq|H_bq|Hgbq|Hobq|Hwbq|HH9b|H&b|HnIIHHǀI)L)L@@bHobHoNbHoVbHo^b}Hb}HOb}HWb}H_HHHHpb|H#b|Hkb|Hab|HiMIM)L)L)M@@bHoAbHoIbHoQbHoYb}HAb}HIb}HQb}HYHHIHnb|H`b|HhHdHDff.HxH?H?fo-Efo5Mfo=U00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс+!HHHHE19t&wAБHLHI)LWbOc O >AfofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)T HIfff.ffo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсTHff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсxHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8Hfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)ofofHALWIII&fo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfs ffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс(Hfoff.ftf€ufIfo fsfs|ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)_fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfslff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)OfofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs \ ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)? fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs L ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)/ fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсx HfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs <ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсhHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs ,ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW III&fo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсXHfoIfo fofofs fsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHHfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIII&fo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс8HfoIfo fofofsfsffDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffff.ID H<H4EtHff.H He )1ÐHe )f.HdHDff.HxH?H?fo-fo5fo=00fffOfVfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAfftftffс; HHHHE19t&wAБHLHI)LG@Oc O >AfofftfofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)dHIfff.ffo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfo fofDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсdHff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfs fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftf€ufIfo fsfsff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс Hfoff.ftfufIfo fs fs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD) fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0 HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHA LW IIIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof: fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fs fs ff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsff.ffofoftfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffDAD)fofHALWIIIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffс0HfoIfo fofof:fDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftftffсHfoff.ftfufIfo fsfsfDofDofDofDofDdfDdfDdfDdfEfEfDfDfAfAftffff.ID H<H4EtHff.H HD )1ÐHsD )f.HdHDHxuH?H?fo%fo-fo50w|0wwoofofDofDofDofdfDdfDdfDdfAfEffDffAfftftffсHHDHHE1f9t2wAБHfofoLHI)L;Oc ftO >AfoftfofofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)HIHfDfofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvhfofo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHRvKff.&HL H A)ff.ffsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)ffoHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c<H#IfoDfsf:c: f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c:  f.fs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)&foHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cnHItfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#ff.IfoDfsf:c: {f.fs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c\H#IfoDfsf:c:  f.fs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c&HIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c:  ;f.fs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)FfoHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c:  f.fs fofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c HIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c| H#IfoDfsf:c: f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cF HIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c H#IfoDfsf:c: [ f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)f foHA LW IIHIfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c HIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c< H#IfoDfs f:c: f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD) foHA LW IIHIfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c HIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)&foHA LW IIHIfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: {f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foHA LW IIHIfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c\H#IfoDfs f:c: f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foHA LW IIHIfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c&HIlfof:D fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfs f:c: ;f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)FfoHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cH#IfoDfsf:c: f.fsfofDofDofDofdfDdfDdfDdfAfEffDffAftffDAD)foHALWIIHIfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cHIlfof:Dfo fofDofDofDofdfDdfDdfDdfAfEffDffAf:c|H#IfoDfsf:c: fo fofDofDofDofdfDdfDdfDdfAfEffDffAf:cfsZHJ|EtH ))H<H4Et HH H( )1ÐH( )f.HdHDHxţH?H?o%o-o50wl0wgoodqdidid9A)9)ŹũttсHHff.HHE19t2wAБHooLHI)LOc tO >Aotodqdidid9A)9)ŹũtyAD)HIHoo dydqdqd9A)9)ŹũycHRvAoo dydqdqd9A)9)ŹũycHRvfHL H &)ff.fsdqdidid9A)9)ŹũtyAD)oHALWIIHfIoyDo dydqdqd9A)9)ŹũycHIUoyDo dydqdqd9A)9)ŹũycHUDIoDsyc:9[f.sdqdidid9A)9)ŹũtyAD)poHALWIIHfIoyDo dydqdqd9A)9)ŹũycHIUoyDo dydqdqd9A)9)Źũyc~HUDIoDsyc: 9 f.s dqdidid9A)9)ŹũtyAD) oHALWIIHIoyDo dydqdqd9A)9)ŹũycHIWoyDo dydqdqd9A)9)Źũyc0HUIoDsyc: 7f.s dqdidid9A)9)ŹũtyAD)oHALWIIHfIoyDo dydqdqd9A)9)Źũyc/HIUoyDo dydqdqd9A)9)ŹũycHUDIoDsyc: 9kf.s dqdidid9A)9)ŹũtyAD)oHALWIIHfIoyDo dydqdqd9A)9)Źũyc HIUoyDo dydqdqd9A)9)Źũyc HUDIoDsyc: 9 f.s dqdidid9A)9)ŹũtyAD)0 oHALWIIHfIoyDo dydqdqd9A)9)Źũyc HIUoyDo dydqdqd9A)9)Źũyc> HUDIoDsyc: 9 f.s dqdidid9A)9)ŹũtyAD) oHALWIIHfIoyDo dydqdqd9A)9)Źũyc? HIUoyDo dydqdqd9A)9)Źũyc HUDIoDsyc:9{ f.sdqdidid9A)9)ŹũtyAD) oHALWIIHfIoyDo dydqdqd9A)9)Źũyc HIUoyDo dydqdqd9A)9)Źũyc HUDIoDsyc:9+ f.sdqdidid9A)9)ŹũtyAD)@ oHA LW IIHfIoyD o dydqdqd9A)9)ŹũycHIUoyD o dydqdqd9A)9)ŹũycNHUDIoDs yc:9f.sdqdidid9A)9)ŹũtyAD)oHA LW IIHfIoyD o dydqdqd9A)9)ŹũycOHIUoyD o dydqdqd9A)9)ŹũycHUDIoDs yc:9f.sdqdidid9A)9)ŹũtyAD)oHA LW IIHfIoyD o dydqdqd9A)9)ŹũycHIUoyD o dydqdqd9A)9)ŹũycHUDIoDs yc:9;f.sdqdidid9A)9)ŹũtyAD)PoHA LW IIHfIoyD o dydqdqd9A)9)ŹũycHIUoyD o dydqdqd9A)9)Źũyc^HUDIoDs yc:9f.sdqdidid9A)9)ŹũtyAD)oHA LW IIHfIoyD o dydqdqd9A)9)Źũyc_HIUoyD o dydqdqd9A)9)ŹũycHUDIoDs yc:9f.sdqdidid9A)9)ŹũtyAD)oHALWIIHfIoyDo dydqdqd9A)9)ŹũycHIUoyDo dydqdqd9A)9)ŹũycHUDIoDsyc:9Kf.sdqdidid9A)9)ŹũtyAD)`oHALWIIHfIoyDo dydqdqd9A)9)ŹũycHIUoyDo dydqdqd9A)9)ŹũycvrHYfIoDsyc:9o dydqdqd9A)9)Źũycff.sZHJ|EtH )H<H4Et HH H] )1ÐHC )f.fnΉ%f`=fafpioffoftftfftH@80HEDoGfoftftffoG foftHftffoG0ftH ftH ffH0H Hff.fHH@fo/foWfo_ ffog0fff/ffWf_ ffg0ffftfŅtfo/foftftfftftftffHfDfI L H H0H HH@80HEff.HfHfofofoftftffDfoZfoftftfffoZ foftHftffDfoZ0ftI ftL L ffH0H ȉ(HHKfDfnΉ%f`=fafpIoffoftftfft HÐoGfoftftffoG foftHftffoG0ftH ftH ffH0H Hff.fHH@fo/foWfo_ ffog0fff/ffWf_ ffg0ffftfŅtfo/foftftfftftftffHfDfI L H H0H HHHfHfofofoftftffDfoZfoftftfffoZ foftHftffDfoZ0ftI ftL L ffH0H ȉ(HH[fDnA1}x? w4~o}t5tVH HMfH~o}t5ttH1H@:0HEwDH }o}t5t}oG }t5t}oG@}t5t}oG`}t5tHǀHHo/ow o@}oG`ttt}tŵtŵtŵtA5tŽŅuwHǀff.1H@:0HEwff.1HD @:0HEwf.1HD@@:0HEwf.u…uÅuą1HD`@:0HEwfff.nA1}x? w4~o}t5tVH HMfH~o}t5ttHHwff.@H }o}t5t}oG }t5t}oG@}t5t}oG`}t5tHǀHHo/ow o@}oG`ttt}tŵtŵtŵtA5tŽŅuGHǀff.HwDH HwÐH@HwÐu…uÅuąH`HwffffHHHHwfo ftfԅtHftHftP ftX0ffDfHHL H H HH1HHHt~HfHftftHftP ftX0fffDfHHH L H H HH1HHHtHff.fff@fo@@f@Pf@`f@pftfЅu0Hfof@f@ f@0ftfЅuff.H@fftftHftP ftX0fffDfHHH L H H HHH)@H? w+tH HBff.HttHHH)wf.H ttO tO@tO`HǀHHooW o_@og`tŅueHǀff.HH)wfH HH)wff.H@HH)wff.tut…utÅutH`HH)wfHH@HtHtV ҅KofH)H ooT tH o\ tH od tH t$oT tH UoT tH 6o\ tH HHt HH)H)o&on ov@o~`tӅuMHǀHƀgo&oon wov@o~`tӅttхtɅtхt'o w@H`H`>ooV tхu&tхu`H$@HH҃ .twH H fDH΃ )ff.'H H uff.'o H@H@PfwfDfGwfwLLwHLLHLLwff.oo\\woo\\wHHtكHHuIff.HHIM}I1M IurHHHHIMs\I1M IuQHHHHIMs;I1M Iu0HHHHIMsI1M IuHHstHˆ"t HHH@HHtكHHuIff.HHIM}I1M IurHHHHIMs\I1M IuQHHHHIMs;I1M Iu0HHHHIMsI1M IuHHstHˆ"t HHH@HH9yyyyyyyyy y y y y yyHqHfL L ftLILJfH)H HHRHH)H)HHHHsAHH*H`HHHM  H  H  H 9H oH H( (Q) ftfHvH7(\1)2ftfHvH(d1)2ftfHvH(L1)$2ftfHvH(T1) 2ftfHvH(\1)2ftfHvH)2HHL1HH)H)H@(((i(Y ((y0fffftfHR@HI@Hu)b)j)r)zftfH'ftf)bHHvftf)jHHv)rftfHv(I(Qftf(Hf:)(QftHRfHI(Hf:)(QftHRfHI(Hf:)(QftHRfHIHf:)HIHRHHH)HIH)(IfD(Q(Y((a/((i?fffftf(f:Hf:f:HI@f:()j0)b )Z)HR@oIHJ(I(Qftf(Hf:)(QftHRfHI(Hf:)(QftHRfHI(Hf:)(QftHRfHIHf:)HIHRHHH)HIH)(IfD(Q(Y((a.((i>fffftf(f:Hf:f:HI@f:()j0)b )Z)HR@oIHJ`(I(Q ftf(Hf:)(QftHRfHI(Hf:)(QftHRfHI(Hf:)(QftHRfHIHf:)HIHRHHH)HIH)(IfD(Q (Y((a-((i=fffftf(f:Hf:f:HI@f:()j0)b )Z)HR@oIH J (I(Q ftf(Hf:)(QftHRfHI(Hf:)(QftHRfHI(Hf:)(QftHRfHIHf:)HIHRHHH)HIH)(IfD(Q (Y((a,((ifffftf(f:Hf:f:HI@f:()j0)b )Z)HR@oIHJ`(I(Q ftf(Hf:)(QftHRfHI(Hf:)(QftHRfHI(Hf:)(QftHRfHIHf:)HIHRHHH)HIH)(IfD(Q (Y((a-((i=fffftf(f:Hf:f:HI@f:()j0)b )Z)HR@oIH J (I(Q ftf(Hf:)(QftHRfHI(Hf:)(QftHRfHI(Hf:)(QftHRfHIHf:)HIHRHHH)HIH)(IfD(Q (Y((a,((ifooVftfHujftfHuQHH@HHHLWIc I >@HHL:Ic I >HHHLIc I >fHHHH)LIc I >HLݪIc I >f.H'HHLIc I >ff.H'oH H L|Ic I >f7ff.ffffffwfDff.wfVfWVWDHHfHwHfDHfVHfWÐHVHWHVHWHHVHHWÐHHVHHWÐHHVHHWÐoow@ofNfOff.@oNOÐoNOÐoNOwff.oHNHOff.@oHNHOff.@oHNHOff.@oHNHOwff.oHVfNHWfOoHVNHWOfoHVNHWOfooV W ff.fooVWff.fooVWff.fooVWff.fHH?H HHffftfHHGftFfHuo ff.H)Hfo (T ftfHH(\ftfHH(dftfHH(L$ftfHHu(T ftfHHV(\ftfHH7HHtHH)H)(((n(^ ((~0fffftfHuKH@H@g(foo(nf(^ w((~0ffftfHtfftftffH H!ftftffH8H'ow H0H0LIc I >fooVftfHujftfHuQHH@HHHLIc I >@HHLIc I >HHHLeIc I >fHHHH)LCIc I >HL-Ic I >f.H'HHLIc I >ff.H'oH H L̤Ic I >f7Hf.ffHGDffwHGfHGwHG@fVfWHGff.@VWHGÐHHHGDHwHHGfHfVHfWHG ff.fHVHWHG ff.@HVHWHG ff.@HHVHHWHG ff.fHHVHHWHG ff.fHHVHHWHGff.foHGowHGofNfOHGff.oNOHGff.foNOHGff.foNOwHGf.oHNHOHGff.oHNHOHGff.oHNHOHGff.oHNHOwHGoHVfNHWfOHGoHVNHWOHGDoHVNHWOHGDooV W HGfooVWHGfooVWHGfooVWHGfH@HtHtV ҅NoDH)H ooT tH o\ tH od tH t$oT tH UoT tH 6o\ tH HHt HH)H)o&on ov@o~`tӅuMHǀHƀgo&oon wov@o~`tӅttхtɅtхt'o w@H`H`>ooV tхu&tхu`H$@HH҃ N%tHwDH H fDH΃ )ff.'H H uff.'o H@H@PfHGwffGHGwff.HGw@LLHwff.HLLHLLHwoo\\Hw@oo\\Hw@fnHf`Hff`ɃfofpH)foHftftff!!u8u0foHfoftftff tfӅu H1Htlu5ՀuިuѨ  uĨ@@uHGfhukunuHG@xuQfT  B@@0HGff.GECHG DtL @HGff.@ @HGff.Hff.HGff.HGff.HGff.HGff.HGff.HGff.HGff.HG ff.HG ff.HG ff.HG ff.HG ff.HGff.HHH0sHHDooftfHHvH1H)HщH1փsGY`gnu|      HPHIsF1foftfoVftWffH Hv HHff.fo1ftH foVftWfH ffofoF foV0ftG ftW0H Hv tfH}H ffoH Hv HHDHPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv HHHfDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H ffoH Hv HvHHHPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv HHHfDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H ffoH Hv  HvHHHPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv  HHHfDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H  ffoH Hv  HvHH HPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv u HHHv fDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H  ffoH Hv  HvHH HPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv e HHHf fDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H  ffoH Hv  HvHH HPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv U HHHV fDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H  ffoH Hv  HvHH HPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv E HHHF fDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H ffoH Hv HvHH HPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv 5HHH6 fDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H ffoH Hv HvHHHPHIЉsTfoNfof: ftfo^ f: ft_ffH Hv %H HH&fDH foFf: ftfo^ f:^ ft_fH ffofo^@f:^0 foF0f:F ftG Hv ft_0H tfH}H ffoH Hv vHv HHwHPHIЉsTfoNfof: ftfo^ f: ft_ffH Hv H HHfDH foFf: ftfo^ f:^ ft_fH ffofo^@f:^0 foF0f:F ftG Hv ft_0H tfH}H ffoH Hv fHv HHgHPHIЉsTfoNfof: ftfo^ f: ft_ffH Hv H HHfDH foFf: ftfo^ f:^ ft_fH ffofo^@f:^0 foF0f:F ftG Hv ft_0H tfH}H rffoH Hv VHv HHWHPHIЉsTfoNfof: ftfo^ f: ft_ffH Hv H HHfDH foFf: ftfo^ f:^ ft_fH ffofo^@f:^0 foF0f:F ftG Hv ft_0H tfH}H bffoH Hv FHv HHGHPHIЉsTfoNfof: ftfo^ f: ft_ffH Hv H HHfDH foFf: ftfo^ f:^ ft_fH ffofo^@f:^0 foF0f:F ftG Hv ft_0H tfH}H RffoH Hv 6Hv HH7HPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv HHHfDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H BffoH Hv &HvHH'HPHIЉsTfoNfof:ftfo^ f:ft_ffH Hv HHHfDH foFf:ftfo^ f:^ft_fH ffofo^@f:^0foF0f:F ftG Hv ft_0H tfH}H u6ffoH Hv uHvHHff.@fDAt HvHDHƄu7uBuMuXuc un@uyGV)ff.GV)DGV)DGV)DGV)DGV)DGV)DGV)DHHvuuuuu u@uGV)f.sK\)*hsK  .   UsKaR7 sKV}$(sK !C"#$t~%&sff.(tI)*+>,t-.Y@GԋN9G؋N9G܋N9vGN9hGN9ZGN9LGN9>GN90GN9"GN9GN91GӋN9G׋N9GۋN9GߋN9GN9GN9GN9GN9GN9GN9tGN9fG:Fn1fDGҋN9BG֋N94GڋN9&GދN9GN9 GN9GN9GN9GN9GN9GN9GN891ff.GыN9GՋN9uxGًN9unG݋N9udGN9uZGN9uPGN9uFGN9uVt5:Pu=1#f(H:LuLu1fI@I!uo_ fog!foftftoG0ftffoo_1ftftfftfffH fDI0I tKIH8t*Vt!:Pu)1DH:LuLu1HDI@I!uIIfHDfo_@ow?fofffDoWPffAo_OfDffDoO`fAfAfDfDoGpH@fogfAfDffAfoo/ffAffftfhf7fg fo0ftftffDoGftoGfDfAofftftH fDtI0fH fDI fAHI IH91Vt$:Qu,f.H:TuTuHAIHL)L9|I@I!u@HHfHfoo`fDofohftfDtftfofo`ftfDfofoh ftftfofAfo`ffoftfoh0ftfDftftfo`/ffoIftftfDffI M I ȉf)H0I IIH8tbH9t=Vt(:Pu01ff.H:LuLuHI@I!u;fff.1ffff.HIH H1HHff.t( Ht Ht HH uHBff.H8 t!H8 tH8 t H8 uHHHHH)f>fof:c:HtOHH ~Hcofof8f:crf:c:H)9~HcfDHfof:c@@tHcHH)@IHcH }IofAof8f:c:)9FfAo@f:c:ȃB+o" jf:c:HcHH)~H9sLnH4HqHHb}HHr8b|Hb|HWb|HWb|HWb|HVb|HVb|HVb|HVÀrb|Hb|HWb|HVb|HVÀ@rb|Hb|HVÀ r VFÀr F~rNÀrffNÀrH H9Hwpb|Hb|HWb|HWb|HWb|HWb|HWb|HWb|HWb|HVb|HVb|HVb|HVb|HVb|HVb|HVb|HVHb|HHH@b|H)b|H)Wb|H)Wb|H)WHH9rb|Hb|HVb|HVb|HVHHǀb|Hb|HPHb}Hb}HWb}HWb}HWb}HWb}HWb}HWb}HWHH9rb|Hb|HVb|HVb|HVb|HVb|HVb|HVb|HVfff.HH @HHH ?LL@H9IHHtEH+ff.@H9sIHHtHH9r t HH9rH|Htff.@HH @HHr>H w~LLH;M<H9rtL L9cHÀssw&rHLH6HLH7ËL6L7L6fLf7HwHwpH@rGNV ^0dlt|OW _0dlt|NT\OT\H9(&lt|DDIHLIIIL)L)LH;;NV ^0H@H@))O)W )_0H@H@w)qyDAA#&nv ~0DDL\HLMMIL)M)L)H;:IQYH@H@A)A)IA)QA)YI@H@w'ow 0ELL9'NV ^0H@H@ffOfW f_0H@H@w)qyDAA#LM9DI@IQYH@H@fAfAIfAQfAYI@H@w'ow 0EHH @HH H@ooLLwff.fHH @HH rIH@ooLLwH;8%H9rtL L9HÀss's3w;rooLLHLH6HLH7ËL6L7L6fLf7HlHHrZooN oV@o^`odoloto|O W@_`dlt|wooN oTo\O T\wH9o&oloto|~oDIHLIII L)L)LH;i7ooN oV@o^`HƀHO W@_`HǀHw)qy~A~#wo&on ov@o~`~oDL\HLMMIL)M)L)H;6ooIoQoYHH}}I}Q}YIHw'o w@`A~wLL9@ooN oV@o^`HƀHO W@_`HǀHw)qy~A~#wLM9@ooIoQoYHH}}I}Q}YIHw'o w@`A~wHH @HH@HbHobHoLbHbHLwfHH @HH@rTHbHobHoLbHbHLwH;4rH9rtL L95HÀ ss/s?sKwSrooLLwooLLHLH6HLH7ËL6L7L6fLf7H OHHrzbHobHoNbHoVbHo^bHodbHolbHotbHo|bHbHObHWbH_bHdbHlbHtbH|wbHobHoNbHoTbHo\bHbHObHTbH\wH9bHo&bHolbHotbHo|bqHoDIHLII?I@L)L)LH;2?bHobHoNbHoVbHo^HHbHbHObHWbH_HHwbH)bHqbHybqHAbH#wbHo&bHonbHovbHo~bqHoDL\HLMMI?L)M)L)H;2>bHobHoIbHoQbHoYHHbHbHIbHQbHYIHwbH'bHobHwbHbQHwLL9@@bHobHoNbHoVbHo^HHb}Hb}HOb}HWb}H_HHpbH)bHqbHybqHAbH#wLM9@@bHobHoIbHoQbHoYHHb}Hb}HIb}HQb}HYIHpbH'bHobHwbHbQHwHHf8HfnHfp"f.fnHf`fafpHH DfH9#<HuHH@HHfnHf`fafpHH w DHwH@wGDDHO@HDGDG DG0DHHH9tffAfA fA0H@H9ufH~sswrHLHÉLfLffHnH}Xf.nH}xH H@wgDwfwH@HHfnH}xH H@wDwHwHwG DDwHHDG DG@DG`DHHH9tA A@A`HH9uwÀs~s s'w,rwDwHLHwÉLwfLfwÐHnHyXbHY@nHyxbHYH@1Hw{bHDbHwDwH@HHfnHyxbHYH@HwbHDbHwHwHw!bHbHGbHDbHDwHbHHbHDbHGbHDbHGbHDbHGbHDHHH9tbHbHAbHAbHAHH9uwÀ s!s*~s.s5w:rwDwDwHLHwÉLwfLfwff.SHH=v9сpH5'hHcH>D1[@=vÉH5h Hc H>€[HD[%@[ЁHD[1g[%ÐH5g ƒHcH>DѸ[HE1[%H[ø`[ø@[ø0[ø [ø[ø[ø[Í 1[%É[1%H H5H="`ff.@AUMATUSHӍGHcHiVUUUHH )D @MHLg@EA @@@t=IuA uA<$urA}ukAADE1 DIM9vKHI: t rLPJD9xu1H[]A\A]ÐA 1ø1ƒt1AEt)At:DƒtAƒt҃EEuƍGD)tLHC[GD)tRtB9B0؉ڃ ‰ځBu A`u A QA >@H HH5H=,^H GH5|H= ^ff.fAWAVAUATUSH(dH%(HD$1=D$ALl$D$Ld$D$  AָT$AωAu @0D$ L rLLMAHL QLLMAHueL 2LLDMAHuEL t$LMALyHu$AVD9t$ Mv*f.H\$dH3%(u#H([]A\A]A^A_ÐD$HH2~tt1f{H9t7HJp1HEt!DIB+tf1ffff.H3OH5HHDHdLfffff.UHo(Ht:HG(HuHG H}lH}HulH]]fDSE1HH dH%(HD$1HL$HT$iu>Ht$HD$HwH3H\$dH3%(uH [DHhl1@1g0UHAUATSHHdH%(HE1H=t H=LHH{( IHA{4C4L /MHIAH LDHH1fH/H uH)H wITHH)Ll$ILIHHBHuHLIT$H=fI$HtmIT$H5vLIID$HHLc(HC H=t H=GHEdH3%(?He[A\A]]I|$uLHyHC(/HtIRBH@/HPM'DAsjAtALfDI<$H{It$)jl@I@HH)HD$H/I|I H HH DIt Ht HH)I)Dr1M9L89riAAD D VAD fD F-ff.@USHHHdHH(HE(Ht<ooHHH8Kt@HCH8t@H[]f.HHH9tHHE(ff.@UHWHSHH=.HAHHtHSH5 HE1HCHtHD[]fHsH;hAfff.AWAVAUATUSHIHt$HH|$dH%(H$x1HC(D$XHD$PHL$`HH(H}H](t HdH3%0HD$H|$L8L|$0HD$Lt$(Ll$0HD$@HHD$HHD$@HD$Hu#ZM9u^A|$tVHT$HH)HHtELIHMd@jHMjE1Ht$LL^_L|$0H|$@ttHL$HH+T$HL9IשuOu(HHT$`HL$HIP… ʄtIwgHs\H$xdH3%(wHĈL[]A\A]A^A_ÍP„uH H5H=Q4U@HIdTfLLd$pLt$(GLl$0IDE1HD$HD$`HHD$8HD$8HD$`H$pHD$HHD$@HD$fDHLd$@ ?jMLjE1HL$ HHt$HL$PAYAZHL)HI׃tDAEH ^H5H=*=TDHHJH9\HHt$HC(Ht$AE1rY)H H5H=SH H5H=Sff.IA<fD׉H=w"DH=vdAf.dAUHAWL==AVAUATIH=>SHdH%(HE1HdD(HtHIEHLEHLIHDHH)HE6_LH/POSIX_VHHx fPIVEHH0HHdD)H?HHudH34%(uHe[A\A]A^A_]'ff.fAUATUSHHdH%(HD$81GA"~JuOH=H%jHfHL$8dH3 %(UHH[]A\A]ÐiӁH[HcH>fDu1H=1AŸAtLd$fDHd8LDHHtDHj HLDH$L9H 4f9@HAEH$HHHHGH C1H=1{AŃHl@i^fDD xHdH.fD  H=pH=_@HcxndZHNDH8"H,H  ] H1H%!k!H@ fH$#H=sHdHff.H(dH%(HD$1H uH$HT$dH3%(uH(fDH:#f.AHHAw-H=wDHdfDHdfff.AHAw.H=wfDHdfDHdfff.ATAAUHHhHT$@dH%(HD$(1A@uY%A=AtKMuoDHH=HL$(dH3 %(Hh]A\H$D$DT$@HD$HD$0HD$ tDT$ DT$ DHAH=w4DljD$ !D$ nfHdOHdB!fVu1H=wVDH(HT$Ht$|$) HT$Ht$A|$1H=w0DHD$_ HD$H(DHdHHdHuH=wSfH(HT$Ht$|$HT$Ht$A|$H=w-DHD$HD$H(fHdHHdHH=w@HdH@AWIAVAUATUSHHdH%(H$1Hu=H =MHcHH4$sH4$HHu'fHtHHOH=LH ڀ}/IMD$:HBHdAEH\$ID$LLT$ H4H$LT$L+T$@LD$L)LH8LD$H $HD$@LD$HL$ HL$@LHL)H8HH@A/HL$HD$@H9L$HuHL$XH9L$P'HD$XHD$HD$H$xfx.vfDHl$ L|$0H\$(dAEL$( $MdAUH|$:LE1tHtdAED$E1%A=At-H=wFHL$dH3 %(uIHXfHD$`$DT$8HD$HD$ HD$fDHd1H=wHdH@H=w@HdH@I1҉.1H=wHdfffff.ATSHHL%MtFuLM&HIHNHJL@H NHJHVHVH HVLBMtWMA@tMLHAHMHEHrH`IcHJH΃HHpH HBHH HPfHHJIcIDHHH;xHPH HPAE(@HHVHHVHLHIAC@HPHHpx1 HtHuÐ1)fHtfffffff.AWAVAUIATI UHSHHL:|$ ILL$M)L%&Ht0HXH]IEH9L9HL[]A\A]A^A_M9tH;$uLLLg%IEHڋ|$ LH+EIELeIuH)AHIE IEL}HHL)L%H]H $HL)H@HHBHIHIL)IEDMe|$ LLHHx5MuH¾ L!%A I]I]HuH9$tL}E1L}H wH5|H=2UHSHHcHvvfHvHwHHv@HHHuH[]ff.fU1HAWAVAUATSHHdH%(HE1HEHHH9- 4H=HHH H H)1Ll$ILH]H]EǃLML}ILLLLuE1QIHiDL L`H}IL9D?-I AHUE)C AH9v5HIdH0DII9tIDF uI9r}M=MpfDH=1H]H]5AƃE1LML}fDLILLDLM`LMHt 8cDD%OHEHHEdH3%(#HeD[A\A]A^A_]L LHEL H}LMIL9}Txppxuf@0 A)D%EXH=1AAƒ!E1LML}L5 LALLDILLMDUDULMHHuDfAUH=#ATE1USHdH%(HD$1IHH@HHtSxufxcpuxuuHX LH諆HtH$H9t8HA=HuHXHD$dH3%(u"HD[]A\A]f. AHdH%(HD$x1H-HD$xdH3%(ut$hH|$ HĈXHdH%(HD$x1HHD$xdH3%(ut$hH|$(HĈcdDff.HtGUSHHH.Ht)H/Y HPHHEH-/HH-H[]fDffffff.IʸH=sHdHcH=sHdHff.dH%HHH=wdH%HHHHF1H9ARRM1Һ9uЇuZAZfVRZ^@d%AAA9tdD%uAA tHdH%0d %dH<%'fDu'd%AAdD%uD؃ tdH<%M1Hd%HH=}fff.HH5v1 f.ATL%pUHS/f.HHHt)HH5I1˵uLDLHHff.ff.HHtHHUHHDhHxt=Ht0HH /Hx HHH HHHPHuH=@Gt(Htv&H;WrH;WwHW G(fHw H;W|H;WHW G(UIHHuG(HLH]f.L1wLD$HD$f.HcHH)HfDtVHHt$8tDAI8AuM9f8=uEtA@uMcHLMJL)H<<=C1|LLB@uLH$IHH$HBHDAHHuI/DH\$Et0@A:t1D1A=u$DH<=t<:tuM>M D1@tLDA8<:1@t @:u @@tHA<(@:uLէE1I3DҸu^fDt HTtC8tII8IuI(Lf.8KH\+Df=umJH5>L)ȋT,I(LÃuL+D$JH$H KtL).H<6H$mDALILMHL@uA@8uyHH@t*uHFHHt?A:L@uf.8=uHHPHHPHuHHuA@MQI(L@IT(H tHH uJH=1L)ȋT,HMuM>M1H=`t =E1M>Mh@H HH)HD@H@ Aw>Eu9HH)|(H4tHtH|1 fHHH=HAWH5E1E1AV E1E1AUL[H|0L=L-ATE1U-SH2Ht$؋5ǪH\$Ht$H5`H\$L$H D$D$D$D$D$D$f\$1Ht$1HL$1fDHHwHcH>@HGD$HD$fHGHHuEEt-tL-)EtL=%Et HD$H|$t HD$H|$t HD$Hn|$t D$f|$t HD$H|$tD$D$I|$t HD$HZu'1A U[]A\A]A^A_fHGHD$HD$HHDHGHD$HD$HHDGHD$D$D$HHofGHD$fD$HHJ}DoHGHAH&YfHGHD$HD$HH-DHGHAHD$HH@3wHGHH@3wHGHH@D3GHGHHpD3GHGHHPHGHLEиDEHGHH#VfDLHGHAH0LoHGHHL @ff.@AVAUATUSHKHHHHf1H=H H Hq1Ht1Ҁ8H= dH5sE1E11ɺH?HH<H=1HG w8HfHHu)RHH8H9t+uHPHH8HSHPHfH9uHH+ HPHXHHSHHH HSHHs@HAoAoAoIHA2A"pLH)HHHBHHt>H"vLH)Hvԍ<AArDD)HHBHHuHHS`1Ht(HHzHBHHtHeHC`HsXHt)HcH=IHHH>H:H~HHzHSXHshHt)HcH=HHH>H:H~HHzHShHspHt)HcH=HHH>H:H~HHzHSpHsxHt)HcH=HHH>H:H~HHzHSxHHt,HcH=~HHH>H:H~HHzHHHt,HcH=FHHH>H:H~HHzHHHt%HH5HJHHH2HHH0HHHt Hx\H{xtHHx$H0Ht.HPtHtHtHHxHt+Hp@dtHxHH(t HǃHU:HHS(ǃ@HHHtBHShHhHjHo L`LCHHLH HS8HCH1H:HHH=ElHQH H=:HlHt1Ҁ8H=!l1Ht1Ҁ8H= lHt1Ҁ8H=nlHHt8uH'HH HEHt.H-'H,DH0H1 HhH9rHnHt 8@H=kHHE11Ll$LHhH=HT$H9Ht{2@t@.u|ٍ HI @tZHHZDH;HPuHHP(H;PrHP@OH;XBHX6@I MtD%AH=Ht 0 HyHZHt3H VHt'1DHH8H9t8Qtdu@RH[]A\A]A^DHLH)H wHHH(A@LH)H -HHJ(1H= cwH 4=H5+H=1H5H1dH hH5H=m`H I{H5H=&AHU@AWAVAUATUHSHHXdH%(HD$H1H=Xt H=L=kD%lMI#fDH@LAƅuMMtsI(HH$HGHD$8HD$HHD$fD$HHD$ L)HD$(HPHD$0HtvHD$8zf.E1H=t H=̵'HD$HdH3%(uHXD[]A\A]A^A_`rtÐSJ3AD9t[fDC,9fHH<$mH=HtH<$fmfDffffff.AWAVAUATUH-$%SH$HL'E,$EtEA,tAME,$EuH[]A\A]A^A_@HM|$HwHcDH> H5Lc H5Lvp H5LA Tl 6 A WMA-C H5LV%MA-5H5L @MA-H5QL%7MA-H5Lm8%vMA-iH5L5+%AMA-4H5RL% MH5֌LA-u[ MH5xLA-!g [MH5LKcA-"L =MH5L€A-E‰MH5lLA- MH5LhhƒA-E‰SzMH5LC[)ƒA-E‰;MH5]LA- @MA-H5L MA-H5L%aMA-q H5qLHS>V%G A 2 H5LH%A H5L%H5aL8%7H5Lz%A}%Gn%8_%)P%A% 2H5Lƒ߃ A-E‰H5L% H5LtX H5L%dA H5LQu$%^%$A IH5L%A  H5|L%N H5L%{H5Lr%AuH5LA%MH5L%"H5sLu@%xH5 L%MAH5!L%,H5DŽLk%tH5L@%IH5L-%H50L!%tA H5لL%A H5L%H5L]u%fH5L2uF%? H5LLA %A H5Luc%jH5Lud%KAH5Luh%H5uLYq%>eH5LA+C%4H5kLu% H5ILu%gH5'Lu %H5L%sf.SHH?H5Tu[@H;H5q$u[@H; H5Eu^[Qff.SHH?H5uǃ[@H;H5тu[ǃ@H; H5Tu[ǃff.ATUSHH|$@GH$E11QЀ wXWHw0z@ w HLJz@ vAH~ Ȁ.uAuH[]A\AtHD)[]A\fD1H=΁1Aąx;HǺ@HDHLH~H??HHM,'s@AVAUIATIUH(HғH-gL%PL-)|2H2_H$H 'HuHD$PHHHHHH1@t<@qf=f;=~ m轧c%H=uu~IH=HD$L،HLH=HHDdH3%0HH觌LLdH3%0HHkѦH(]A\A]A^H #H5BH=kfff.UHAWAVAUI/ATISHHHUMdH%(HE1HtHx/Ht xE1L}/LlHtHx/YHt xJA<$/u A|$/A}/uA}/tYDEHULLL3HEEHEHMHHEdH3%(zEHe[A\A]A^A_]A}uHdHHHHHuHuHH@HH)Ll$ILe//f@K@A|$-HdHHHHHuHuHH@HH)Ld$IL//f@L}KHHzI,H}HEIHyHx1HxLL87MMn8E1E1`fLuIFL9HEA]BiD THcHHu/,IEHHuII0IhHIEM9R}MmtHEHH5vJ| tH\$H[HITHH([]A\A]A^A_HIIwMHD$H@HI|jE111P^_u$IO$1fHH0H9T$sH|$]H([]A\A]A^A_H([]A\A]A^A_H =+H5yH=y H IH5yH=fffff.AUATUHSH_HLgL/@CuH;H0Ht).CtH.HLL[]A\A]fDH6H?!UHSHHH6H?uHuH{H[]fDH[]ÐHu@HU@USHHH?HtCku2Hk@HdH3,%0HtH7HH;蚂HH[]@H{@tH H5QxH=UxfUHAWAVAUATISHHxHhHXL@LMdH%(HE1HHEH`HHXH}HHEH5BHEHEH`HEHHH@LxL:HPHELrHHHRHUL,ILK\/MIƋCHKuoH{HtfKHH HHL` H@(HC0Lc8HK(HC@IdL3$%0MtLHALc0dL3$%0ILc0IHhIrE1EH@HD$HIHPHXIHH@LIFH\$IFHIFIF IF(L#KHCHCHC(HCHC HC(I^(HHE1EE1LPELp@EA9F|Mv(M:EfD;etHwHtM>DH[0HtH3LtYyH[ HhHtHLtkD9euM9MDH[(HdEfLkA}-u A}LD`HxAFLCDcE"zHpH IDM(MI7LuE9gD9e\ME9NEILPfI7LtqM(MuH@LHT$HL*I]EgIGEI_AGHHMw IG(L8IG(HH@EDeEE9gEA9GI_HPMw H(HtAHGHtHW pHHBHtHR pHHBHuwOH(HuHpH&}DEDD9}9DDH@(Ht,HpHH QIVNPH9}H@(AȉHuԉ}DE@EA9GOEI_Mw EgAG4H@LHT$HL*IEgIGEI_AGHpMw IG(LpLpMIE(HtAU9Pju AU9PLLIE H`E1DH@ MIHuKIHeD[A\A]A^A_]H`HUH}H H5HEHEHE萺HzH@LHD$HL HHPHCHCHC(HCHC HC(HHLXH@E1E1HHEHAA1I]dH3%0HID$@HEH9LDEE1E1&#H}#H}#HEDEHH@HfIIE H1YIHu;HEE1E1AHH@HL"DEKHEE1HLE1E1u"H}l"H}c"HEAHH@HcLHUMkIIL9v KvMIIHHhzI9uADAUATUHSHH8dH%(HD$(1HT$ HHnu#D$ HL$(dH3 %(H8[]A\A]Ll$HHl$IH55L HtHL`MLDLHPH\$H5߷HHtHHxHHDLQmAWAVIAUEATIUHSHH8dH%(HD$(11=̺t 5u #5tH=HRHĀELHLH7ntbA=xt cu " YtH=PH0HĀHD$(dH3%(H8D[]A\A]A^A_H=L|$HLd$H5L蒶HHtHHHLHHL$H5Hl$cHL$HItHLxAMILLHA=t ru " htH=_H?HĀEE1H;A=1t u " tH= HHĀALHHL$taMHL$tLLHL$tCHHHHL$t&MHL$HLHL$=tt _u " UtH=LH,HĀADAT1IUHS=t 5u #5tH=HHĀMt"KdIH\ŘH8HHhH9uLHAp=t u " tH=HbHĀ1[]A\@UHAWAVAUATSH8L=0dH%(HE1ML-MPLHLHH@HEHB'HH)H|$HH}H51:HPHp1BfB BԢIHKHHMHEHHMHEH}:^IHA f.IAFIOI9tA^AI|$:MHuHcL}EFIcHIcLHH<H}LHEHH}HLuH5fgHLHL<ɋIHH]E1fDL;A8/t'M^HULLLEKLE/LxLLEx/t/HHH+H;3HSvH&LH5f1LxAH.IHrHEMcILHH@HELH߳HEdH3%(He[A\A]A^A_]H HHELd$HEIHEI$bLeAD$VLefAD$ GAD$E1 IHEHEHEHEH H5eH=eH H5teH=zeH H5PeH=genH}HEff.AWAVAUIATUSHH-HL'AHrH] H0HIH+HtZHuLuM}fDHuLtHH](Hm(Ht#HuLwtH](Hm(HufDL+H[]A\A]A^A_fDEA9E|t EtL'EA9E}HE HIE HE0IE0HE(IE(L+H[]A\A]A^A_HUSHHHt1HfH[0HtH3HtyH[ HuH1[]@H[]@UHAWAVAUIATSHHhHuHMH5sdH%(HE1DV DIUIHDV uH sMAD$A${HLIDV tHPLHDV t@HWHHDV uMu1AAAFHIMHIDV tAIVIHDV uLʄtnfDHIHBAtRHD~ tHHu LLMHM7L9uHMELMt EfHJEAGUH}]LHHMH"HHHHMHsLmL5hH!MI8M9t1IHH5LHE莨HuL1I8 M9uL%1LM;1LhL-LHL`uLLL{uHldHIL9 wof.A<$aliaA|$s@HHADG uHHlFHHHADG tHBHIADG tfHAHIADG uIEu+?HYlHIAD$HtADG tI9HpA$H`HpH`IT$@fA|$le ܠHUHuAˠf1Lm˵ff.H=mtH5[H=?ιntDH/ THAUIATIH5%[UH-gS1Hf.HuH Lt,HH uH +FH5[H=HYgHID$8HID$@HCI$ID$ID$(HCAD$XID$0CAD$HCAD$LCAD$PCAD$TH[]A\A]D@@Hff.AWIMLhAVAUE1ATUHSHHHLL$D$dH%(HD$81HF0HD$FuHhLt IdL3,%0E4ML؋$HDH8HCH$|HK DDƒtmM HEHcL9s+At -Ht$HHHEp@tI9uH AHGAGAGAG!HD$0L\$IHD$ L|$(MI6H $LH)H)H9HNHHHHIH1ʉHH9uHHH,I6AL9tHEH9$EAAH|$CCH9vjHLHD$0$HE1PjLL$(HT$0Ht$ H|$8AZYt&HT$0H9}H;AtLMAu$HD$8dH3%(HHD[]A\A]A^A_fHL\$I+LIML3HHH)I)_MHC E1HCwL$11E1LPAVLL$(Ht$ A_AXACAAD ‰/HULH)HLHK HBHqL9s6HED@HHHDFI9uA)ҋAA DE1H  H5WH=WsLMAH ^H5WH=WFH ?/H5WH=W'肰fAWIMAVE1AUATUHSHHhLL$ D$dH%(HD$X1HGhHD$0HF0HD$(FuHhLt IdL34%0EMLHsLl$HHDӹH|$ LDHHt$HD$H$H{ DEAMHMMcLI9v3At5Ht(HHHMDaDd7I9uLHGHBGBGBGBDACDHt$PL\$Ht$8H}HL$MII)H)L9IOHLILIItOE1IAHIM9t,ɅyMtwIIEHM9uDH}AL9t[IGH9D$EAAH|$tGL\$M;HD$XdH3%(XHhD[]A\A]A^A_H}AH|$uCCL9syHLLT$HD$P$E1LPjLL$0HT$HHt$8H|$@AZYLT$t+HT$PL9HCf.At勄$&AHULH)HHK HBHqL9HED@HHHDFI9uA)ҋA DHt$ HD$HL;HqLH)H)M?IAMHC E1HChL$11E1PAULL$0Ht$8H|$@A_AXA2AAD Ɖ7NI)ALHME1&H  H5ESH=fSH H5&SH=3SA~H /H5RH= S@AWAVIAUE1ATUHSHHXLD$D$LL$(dH%(HD$H1HGhHD$ HF0HD$FuHhLt IdL3,%0E4Ht$D$HHHDH8HCHD$EHHD$@Ll$8MIHD$0HI4$HT$HHAH)H)H9HNHHPHIHHI$II;,$tH@H9D$EAAH|$QAFAFQI9vjH\$8IHHD$@蟿$LE1PjLL$8HT$@Ht$(H|$0ZYt"HT$@L9 I$@AtLMAu$^HD$HdH3%(HXD[]A\A]A^A_fHK DDƒHIHcH9s(At *Ht#HHIp@tH9uHAHGAGAGAG!7HD$L(<LML+f.LH)I) $H|$HC E1HCL$11E1PATLL$8Ht$(H|$0AAYAZAAAD ‰I6HH)HHH{ HHWH9s/fHHIHJH9u)A ЉT1zH  H5aOH=OH /H5BOH=OOLAMH gH5OH="Off.@AWMAVE1AUATIUHSHHXLL$D$dH%(HD$H1HGhHD$(HF0vHD$ @uHhLt IdL34%0E+MLLl$8$HDH|$LHCHD$8HD$LDHK 9MHEHcI9v4@u8HHHt!HEDHHDLI9uHyAIA@AA@AA@AA@9LT$s9fDLT$HEHT$MMI)L)L9IOHLJLIItK1҃@HAHII9t,yM}HIEHI9uHEI9sHI9VIGH9D$_H|$AtCELT$M:HD$HdH3%(-HXD[]A\A]A^A_HEAH|$uCCM9sqHLDT$HD$@vHT$@E1L$PjLL$(Ht$0H|$8AZYDT$t#HT$@L9LsfAtEA7$(HULH)HHK HHqL9HHHEx@~L9u)Ћ ЉDADAH|$HD$8L;EH^LH)H)M1MAMHC E1HCaL/$11E1PAULL$(Ht$0H|$8AAXAYA*A 8A1H  H5JH=JTH H5JH=J5萣H YH5JH=JARH b/H5PJH=]Jf.AWMAVE1AUIATUHSHHXDFLL$D$dH%(HD$H1HGhHD$ HF0HD$AuHhLt IdL34%0E"MLHT$8LcHDH|$H8L4$HEIUL\$HD$8HD$(H9HwI9HIAA)f.H@AIHH9tNIvI9H„yHt$(HEH@HAHH9uf.H|$IUCCI9H<$HHD$@踶HT$@LE1$VjLL$ Ht$(H|$0HD$ZYtvHT$@I9FIUH;DCH9HH|$IAIU`L\$EM3,A5DA%DAtEHD$HdH3%(HXD[]A\A]A^A_ÐIAfL3H\$EHD$8HLH)HQHIHI)U(MuMHC E1HC|L{$11E1PATLL$ Ht$(H|$0A^_AGH H55GH=BG*AfAWIAVAUATUHSHHDvH|$@D$L$LL$dH%(H$1HGhHD$ HD$(HF0HD$0Au%HHhHD$ tHdH3%0HD$ EH<$HL$hD$ILmHHHDH|$L HD$hHEHD$8EHT$pMALd$xH9tPAHJH9M9>KIOHL$xAHD$pL|$xHPHT$pH9uH<$IEEM9kLt$ HED\$LT$LHD$x苳HT$xE1L$PjLL$(Ht$@H|$8AZYLT$D\$HT$xL9ALeIDufHT$pH<$AIEH$LEHH$dH3%(HĘD[]A\A]A^A_fDHT$pAqH|$88EHT$pE]AfDA*"AJHE 0HD$HHT$pLd$xL$H|$HcE1LD$BDCIL9uHH)HH9RHBL$AM9HD$pxIIHC<IwL9wHD$HD$p$;IT$Ht$HT$xA$HD$pHHD$pH9)H)Ht$6H9H)ILd$xIHHD$Du0fHt$LHD$hEHMH$AI2HH)H8H} HHWH9HHIHJH9u) ЉfHL$pHIHt$@H|$PIL$LT$9^_L|$xLT$AHT$pL|$xlsDHL$pHGHD$8HAHT$pH'LH)HI)H<$xHE E1HEH\$ H躯$11E1PATLL$(Ht$@H|$8[]AIH9sHL$HHHT$pBAH9uAcHT$pA}=tNH|$8t;Au^AHD$A&Ht$8HHD$pHHt$H9AH$HD$p1'HD$LT$XHL$pHL\$PHt$@H|$PNL$LD$X7AXAYALT$XHD$pAt'H;D$LD$HL\$Pt%Ht$H+D$6AG0AuxH$I9SHD$LދƒH)HcI2I9IwKHt$D ؉HD$I9HHHHHD$pHJI9ujEH mH5 @H=ZoEH  H5?H=?&H /H5m?H=z?H H5N?H=[?H H5?H=fnH ҭH5q?H=nH H5M?H=snH H5.?H=,ngAWAVAUATUHSHHD~H|$HD$H$LD$LL$ dH%(H$1HGhHD$(HD$0HF0HD$8Au%HHhHD$(tHdH3%0HD$(E3H$H|$HT$`LmHL HHDH|$ L0HD$`HEHD$@$>MMMDLl$pMLAL\$xI9tMAHPH9M9CHIT$HT$xA$HD$pLd$xHHD$pH9ufH4$H|$HEEM9L\$QL|$(HEDT$LHD$hHT$hE1Lዄ$PjLL$0Ht$HH|$@A^_DT$A,LT$hL\$M9E4H$L]D}L(@HD$pH4$AH|$H=HD$L H$dH3%(t HĘD[]A\A]A^A_fDHD$pA(po1ɩHI I9rA$HL$xfDH?ʀA HuA$˃u[?H I9uHt Lt8(v*LX1HI>H9vA>uHuH\$@Ht T$MHD$L0I9H eH5,H=},譯ȃ<"AH\$L3L9uI9DH|$ ID$ E1HAD$L|$L蜙$11E1PSLL$8Ht$HH|$@AAXAYAD$HLʃAdAcHIL9Al$Ht$rHt$PHHt$A>t$\+DHD$HLD$PIL9D$bHL$PABAAA?I L9uLD$HHLt}(=vpA:DAH9v HL) HHH9t tH9HL$PE1IJH9D$vB@tLD$HH9t$"Ht$xH9t$McHAL)IHt$L6A|$\wAH9\$v"IA I? L9T$uH+\$Hߍ D Aɉr(=A:DA΃@AmHD$@Ht$HLHH H5n(H=(觫H pH5O(H=MW舫H QH50(H=WiĀȃ<A[ʃuAʃA\iH /H5K'H=X'AH vH5$'H=W辪ƒ>H 7H5&H=`'H H5&H=&`΃@uMAD@uLDƒuN΃@uAAyD@u5DKZA8D@DAWAVE1AUIATUHSHHXD^LD$D$LL$dH%(HD$H1HGhHD$HF0HD$ AuHhLt IdL34%0EH|$HL$0$IULeHHHDH|$LHD$0HEHD$(EL4$MfDH9tjHBH9IpML9AAPLH(fAIH9t0HPH9IvI9.HMHADH|$IEEsM9 H<$HEHD$8P$HT$8E1QLjLL$ Ht$0H|$(HD$ZYHT$8I9TLEID]@H|$(HEHA f.H|$IA2HD$EL0HD$HdH3%(;HXD[]A\A]A^A_f.ADAREM$tAuIuHH)HrH} HHWH98HHIEHJH9u) ЉOLARf.HE DEAHCA]HL$FAHHֈL$GH9FIxI9.2@t FL$F(fMADIEAMcA^L)AL4$D]HMIUD @MHAwH|$HD$0LuEMH@HABHr5@LH)HH?HHI)H|$HE E1HELq$11E1PATLL$ Ht$0H|$(A_AXAAI]H9sHH)H)H4 H@tH9uAfH|$(tAu AMH|$(H1H !H5 !H=OYH ҹ H5 H= :H H5 H= MA H /H5W H=d LyH H5 H=:Oͣff.fAWIAVAUATUHSHHDnH|$@D$L$LL$dH%(H$1HGhHD$ HD$(HF0HD$0Au%HHhHD$ tHdH3%0HD$ EH<$HL$hD$ILuHHHDH|$L HD$hHEHD$8E#HT$pMALd$xH9t`AHJH9IwI9JT(fAIHHt$xHL$pH9ufH<$IEEM9kLl$ HED\$LT$LHD$x{HT$xE1L$PjLL$(Ht$@H|$8AZYLT$D\$HT$xL9LeIDmfHT$pH<$AIEH$LEHH$dH3%(CHĘD[]A\A]A^A_fDHT$pAH|$8t:E_HT$pEAfDH|$8t EHT$pADAAHE 0HD$HJHT$pLd$xL$H|$HcE1LD$BDCIL9uHH)HH9fML$HBAL$M9HD$pxIIHC<IwL9wHD$HD$p$=8(fA$LL$xH$HD$pH9HD$H)ʃILd$xDmI0HD$8HAHT$pHHD$8HL$pHAH@Ht$LHD$hEHMH$AI2HH)HH} HHWH9oHHIHJH9u) ЉHfDHL$pHIHt$@H|$PIL$LT$C^_L|$xLT$A\HT$pL|$xHL$pHLH)H I)mH<$hHE E1HEH\$ Hn$11E1PATLL$(Ht$@H|$8[]AXIH9sHL$HHHT$pBAH9uA'=H|$8AAHT$AHD$8HHT$pHHD$H9tPH)HD$0H|$8AAH$HD$pHD$8HQAwHD$LT$XHL$pHL\$PHt$@H|$PNL$LD$XwAXAYHT$pLT$XAt.H;T$LD$HL\$Pt,HD$H+T$01AuxH$I9RHD$LۋƒH)HcIL9IwJH\$D ؉HD$I9`HHHHHD$pHJI9u;*`H sH5H=G˛H $H5H=講H 5H5TH=*G荛H H55H=FnH ǰ H5H=OH /H5H=0pH H5H=F H H5H=Fff.fAWMAVE1AUIATUHSHHXD^LL$D$dH%(HD$H1HGhHD$HF0HD$ AuHhLt IdL34%0EMLHL$0IEHDH|$$LeLHD$0HEHT$( LT$H9HPH9IpML9ABLJf(fv5AIH9HBH9IwI9H@H|$(t E?LAH|$IUEEXM9HELDT$HD$8衃HT$8E1L$PjLL$ Ht$0H|$(AZYDT$HT$8I94rLEIED]H|$IUA\ELT$M:HD$HdH3%(PHXD[]A\A]A^A_fADAtEӋ$tAuIuHH)HH} HHWH9XHHIEHJH9u) ЉWfDHM D EAMyAQT$FAQHƈT$GH9IxI9g0@tFT$Ff(fAD IEAIcAH)ALT$D]HIED ?HD$(HH9{fDADMHAH|$HD$0L}EHxHA\Hp@LH)HH?HHI)UMHE E1HEL$11E1PATLL$ Ht$0H|$(A_AXAMHAI]H9sHH)H)H4H@tH9uANH|$(tAu A5H|$(Hj1H H5H=]AH ٪ H5H=(衕H H5H=肕AH /H5H=[jH /H5H=@7AWIAVAUATUHSHHDnH|$@D$L$LL$dH%(H$1HGhHD$ HD$(HF0HD$0Au%HHhHD$ tHdH3%0HD$ EH<$HL$hD$ILuHHHDH|$L HD$hHEHD$8E#HT$pMALd$xH9t`AHJH9IwI9JT(ffAIHHt$xHL$pH9uDH<$IEEM9sLl$ HED\$LT$LHD$x}HT$xE1L$PjLL$(Ht$@H|$8AZYLT$D\$HT$xL9LeIDmfHT$pH<$AIEH$LEHH$dH3%(CHĘD[]A\A]A^A_fDHT$pAH|$8t:E_HT$pEAfDH|$8t EHT$pADAAHE 0HD$HJHT$pLd$xL$H|$HcE1LD$BDCIL9uHH)HH9fML$HBAL$M9HD$pxIIHC<IwL9wHD$HD$p$=8(ffA$LL$xH$HD$pH9HD$H)ʃILd$xDmI0DHD$8HAHT$pHHD$8HL$pHHfHt$LHD$hEHMH$AI:HH)HLE HGIPH9nIpHHH@rH9u)A AADHL$pHIHt$@H|$PIL$LT$^_L|$xLT$A\HT$pL|$xHL$pHLH)H I)mH<$hHE E1HEH\$ Hy$11E1PATLL$(Ht$@H|$8[]AXIH9sHL$HHHT$pBAH9uA'=H|$8AAHT$AHD$8HHT$pHHD$H9tPH)HD$0H|$8AAH$HD$pHD$8HUAwHD$LT$XHL$pHL\$PHt$@H|$PNL$LD$XAXAYHT$pLT$XAt.H;T$LD$HL\$Pt,HD$H+T$01AuxH$I9RHD$LۋƒH)HcIL9IwJH\$D ؉HD$I9`HHHHHD$pHJI9u;*`H H5 H=P9;H ԡH5 H= H UH5 H=8H 6H5 H=K8ތH w H5% H=F 迌H X/H5 H= 蠌aH ԠH5C H=i8|H H5$ H="8]ffff.AWAVAUMATUSHL(H$H|$(Ht$0HL$PLL$HHD$XdH%(H$1HH?HD$tLHdH3%0IHdHH0(HD$HHD$HI9H0H$L8LHHD$@H@HD$`H$HD$8H$H|$@1HD$HHD$ AIHD$'B#AHI99t܅HD$I9B#A9HD$ HD$H<$H9|$mHdHH0`H|$PHhH?H|$?L9l$tf.H$dH34%(HĨ[]A\A]A^A_fHD$ HH$buf.Ht$ HD$`\$pDd$tLd$HH$Lt$hMLl$xIAI4ID1DHDHHEuI$LHL$H$H$tjE1LjLD$HHL$Ht$@H|$8A^_DAHŅuHcD$pHt$MDd$tLt$hHLl$xH>DH1i`7H|$HWI9xHh?~HD@LD9vZPuz[\$ptIH$Ht$HH4Ht$PHcHHHD$XH19yr1)ÉqH L9{|HXH$HD$HLHH$rH$jHLjE1Ht$@H|$8L$AZY>HD$XHHD$PH1%PHXHt$HFH$I9c1L9D@.HD$Ht$PHHHD$XH1 \AWAVAUATUSH(L5GH|$AFEfHt$HD$A^1ҋ=GsA1AF)lj|$j3;D$sHt$H|$LytAADD)D9FADIM<A7fuH([]A\A]A^A_DAWH|$HH([]A\A]A^A_@UHAWAVAUIATISHHdH%(HE1"yLIyLLLxIDHH)HyLLHxH AHHtkHPL` HCE1H@(HC0Lc8HS(HC@HC`IdL3$%0Mt&LHpHAAHC0dH3%0HHC0HEdH3%(uHeD[A\A]A^A_][@HE@ATH=~UHdH%(H$1HMH11H=11QCŃHT$ƿ7vHt$@HgE1A1H5=E FH9EHAH=!E?$ uIH EWH9s9OH9v0Wft'HH9rW H9vW E1H9s0fDuFH5DJFHDAH$dH3%(HĸD]A\@諳aDHYDHHT$HMDHtQHT$E1fDH)DIL9vIH"DL)J4 7HuH=D2HC@A<DCXff.ATUSH dH%(HD$1H=Ct`IHt$HHt+LHu1HL$dH3 %(u1H []A\Ht$LkuHT$+T$Ƹ>Xff.AWAVAUATUSHhL%CHT$dH%(HD$X1MIHHt$HHEt$E|$ Du%HD$HLD@AD$ ILH;BLD$v.AHD$XdH3%(:HhD[]A\A]A^A_fLHt$PAŅuHD$PAt$ HL@HHH;56BwMHt$HLD$ILAMKlHHH|$P]fyRHL$葪HL$HIHD$1LL%L8HyLbBLLHB`HB AIƀ?LyHADu ff}fyDHL$ɩHL$HI@HD$}L%ML8ELHLMg IGEAGIG`?MLLHL$HL$HHH|$PHHcЉHkhLHL$0H|$MHl$(Dl$ HL$H\$8聯Ht$HHL$H0f}H|$PLLHL$訟HL$`fDHL荟wH9A6fDA%tLD$MD$LD$ͮD$AAT$ LD2L?Afu.HvMDPAfHcHRATPH9uHkhH3HL$ LD$ܧHT$LD$HHD$HL$ HDDMHT$MP1Hl$(MDl$ IMH\$8MLLD$HL$0*LLFHD$IhI9~RAA~I\$H@LE AFAD$ID$`K\ M\I\$ ?uLLDl$ USDH=4>t ]DH6H?qpttfSHH9=CtPw Ct[~$C[@H{HtHC[H hH5SH=WA}AUHcH5=ATUHH|$H|$6CH L MoAD$IT$HI<$GID$HH4H5ZID$H,I|$H5;I|$H5ID$ %IT$AD$dH3%0HdH3%0HIT$IT$ ID$(LdH3%0HIT$ H]A\A]HtHƒAD$HL]A\A]@Hl$HnHx1LhIHtLHx0LH?nHH5!<LI$AD$ID$c@HLHE1L]A\A]fH=;H5L%;E1GMH frH5QH=f?{ff.@H=};H=~;H5WBGfAWAVE1AUATAU1SHH4$bD9tsH#N,LpmIHN'B0HlLEtH$H0L9tLE1MmAA t1IItuH$N,H$L(EtkH$H5@H(HltAH5THlH HL$HD$H[]A\A]A^A_f.HHD$fHHD$HHE1L%H-ƑL-"<DA9tKOtC4H}HHQH5&`LsuAF4AF0AF0@A<$/H;HEHtGHuDIHHELeL5XLszHEL5yXL#LerDH;/[`x/HxDH/uH)H IHLMLELjHUARuuuMH0MHHDE1C|<.oC|<.cA|$.CA|$/7DHsH}gZfH{ HtWL{ IHPHu$IIHt7GuDfDHC IH!HC @H VH5H=Okff.@n0HcHu@~t3H2HH;ptfH@H9xu@H@rfffffff.AWAVAUATUSHHHՉI t  5 D9LcHEt$N;4JH9J<@`HL`HhH@ H@(H@0Dp8MtV1LeAHA|HH9r NcI>AHv4@HhHd1H[]A\A]A^A_HwOA<t-HxH|@p8HH9wH wOA<uDuHp4>t@Hv{HvpHveH-vZHvOHr=Hc.uHU[KH TH5H=hff.UHAWAVAUATASHHdH%(HE1GHGH?&L0ƿAL>H%=@8HE1E1H`d(Z)IHtaD %Mt.H`LD"H9HPHCHEdH3%(KHe[A\A]A^A_]@Hd8&L`L蠐H HtdIMI)IMqLLD&HH H(˖H(HuHdD$=D$L LL YIcL HHzHtIH~HDH)H5~L|$ILIL(LYAVL(/SYSHH@_sXtA0@pL1s$AƅrLƿ @I0HpI|0H|1Hx LHH)H)Hf.H(Dd"H`H DH1fH`L'A0pADD&ADfD:UHG HHtЋEt6uHuH}4'Et H}ÔH]麔f.H}觔EfUHAWAVAUATSHL.HdH%(HU1H%HuaLLuWHHtELsM9uHLcL(N|HEdH3%(UHeL[A\A]A^A_]Ð.LWHt @L=%M<L5%M\LVAHPLJ (fA HAH9uDE!AFA~HAH1҃IHH1HLbOdJHHILHHHt$1fHH9 A: tI@t_H=H IfDApI@t8F< v1HH9tEE8tH9vDwt<@~LLLHѨD$3IIƺ fI1fHHT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1H$1HHD$HD$ $D$0HD$F,HL$dH3 %(uHfHD@HAHQBЃ wSHQAA)C D)9ALAHH0 wExA ~AfDff.AWAVAUATIUSHHB$<}vHL[]A\A]A^A_DILHM HPE1E1LpHDž`HhHhKDLLIHLHKLs IA>tNL9`uH)AHHhH88HHH`DL9pLHCpHHHIHIIH`E@M<L@Ɖ@5M; HhKDH LLIM%DAV4IcF0AAV@IcF0IHM9t[IcF,tAIcF(tAIv8HtHtIcV0McNLIHH HH LBM9uIH HtU@L`1L5HH@A Ic L>IcG0HH`HE@Ag HHHHhHH4L x/\!)9HdKH0Ht HpfAHH;@tpHH;PtpHEdH3%("HeD[A\A]A^A_]Z/σH~H?HHI<HH9HcEHHI9HHhLL0HHHHHL\Icܾ LHH9\)D9D㉝\H}(DD cD DE1IM: A AS  HcLD W)D DžHAE)D D  Eu9D\E)IHHHH)H)H9HLLQ8H9\)HH9DD\Et $DL`d7IcG0H`HHH I+ DžE1DžXƅ xƅ D1HLπ XDDDLH8A LAD"DIHDtStJL(HHLHDDLDDIEt?HLLDHDLDDILM)I9L)HڅDDD))MtXuQEʋ D   EIF(I;F0HPIV(-\=_\MtuulXtcIF(I;F0HPIV(0\IF(I;F0 HPIV(@0\=\˅\|IHTHUHH)H)H9' LLLS8I9\)HL9bÉ\DEtDE DIcG0H`HHE<Hc\HIcG0HH`HxE@Ag HHHxLHhHH4,IcG0H`HL$IcG0H`HEL MwDž E1fDX/MreHA@0Lhƅ E111EgIF(I;F0 HHIN(-\=A\MtyupXtgIF(I;F0HHIN(0\TIF(I;F0\ HHIN(@8\=#A\DDA)D D\EIHzH{HH)H)H9C LLLS8I9D\D)HL9Aŋ D\6Lc LLGI9XA D)9,AD\IF(I;F0 HPIV(%\=\DžIcG0HH`Et?DžLE1DždDžDž DE DžEDžMsXutLIUAE0II)L)HHHыӅE1L DH)ƅ xIDžXHIܻDžTHD HHHpD ?HVH!HL11HDH &HH3DHSDHHL=HDu H_HBHH)Ld$IH LLDDL-DHLHDLZH4Ha\fMc LLI9\\)D9D牽\jL-LLC@%LDAg #H ZH %LDMDDKDDHH0/A9FHcH H0HmAg AG4.L #LDILIDL+ LQB0L]f-L3D LDHHD0LDHHDsfLQ+Ls/DL+DH L4_fDLIcH L L DH0Lm'LOH H5H=H H5H=w1H H5aH=vQH=蕭H n H56H={&HDHIHH DDžm1HGIHeHDDžH H5H=H H5H=pH H5aH=QH u H5=H=R-ff.fUHAWAVIAUIATISH88dH%(HE1Hd$LJA$!M'AA/AoIF%LHH0HH<Dž<I$H=H+=sHH+iH(H9H0LLL)HP8H9HHHAـ:2HSHHH=CH=}DžDž HDžHBHHDzAGH9( HHLLDP8HH9DADD)HH9yELc LDL I9sDAAE)A9 HZƅ LSC01ۋˉ)؉@HutIBHAB0H)IHH)HH؋A؅))؉]fD/ƒIVADžDžHDžAA1LjE1DEu) EI$HH+H9( DLLLLP8L9DLD)HL96Aمt  VLD2D;HDžDEID$(I;D$0HPIT$(+ HcӾ LDHDDLH HH9iDHLDADsD)9A1LD蜐HHDfHDm1DIcо0LDHLHD-HH9DADHD)LD9+E:Lc0LDLLH谄I9DA=HLD)9ADHDžƅ ID$(I;D$0zHPIT$(+IVHBIFNDE/lƒIVADžE1DžHfDDž HDžHDžINHAIF7ID$(I;D$0AHPIT$( fHH)HHAfDg/+ ƒIVALf.IVHBIF/ ƒIVAHD@AF=ƒIVAF`IVHBIFKAF=6ƒIVAF` IvHFIFIƅ 11|DLpHHDžE`McDLD-DuDAwDžIGHH)LD$MILLHpHDLjLDHID Dž ILAAIVHBIF</ƒIVADžE1DžHDLDLiDALC{jHpHHHp@0 fA/ƃIvAIAMD95 H AMcDI_ HDD?HDDLXDvI HDžHCHH)HD$HHHHD8@IVHBIFH AA$d 9HdHHHxPHpHH'<>HEHaALeyDLAS|HPyHHDžHpyID$(I;D$0W HPIT$( GIc׾ LLHg~HH9DAt LD)D9sE-IVHBIF/ƒIVAHDtIVHBIF?IVHBIF^IVHBIFVDE/ƒIVALc,Ic߾ LDHj}H9DA~ AE)E9EHc LDLH }HH9jDA LD);DcHHDDٮDLUDA%DLHH?DLHHDLHDLHcHc LDLH{H9,DALD)9DIVHBIFIVHBIFnIvHFIFLDDTLHphDDH=ʅf.HDžJHcӾ LDHzHH9"DAD)9AHpH11DLH^IHHLDIWHHDHLp`HDHu H_HBHH)LD$MILHDL説DLHHAdxDHLdDHLLDH0LDHH/ƒIVAHfDIVHBIF)IVHBIF/ƒIVAL]D-DLHLܲHLDDfD-DLHL臲HLDD}DHpDD"DLQDBHp8$2%LDԱDd11m11HHDLLHHDDHH lH5mH=ܜLIHDžDH lH5~mH=ÜnH H5_mH=OH mH5@mH=U01|H rmH5mH=_ ?1HIHHDDžHH mH5lH=l@AVAUATUSHH0!dH%(H$(!1LJH$ H|$ H$HD$HHD$@H$ !HD$PCtDŽ$$H{D$ HDŽ$H$H-C{AHH5HH۸%HD$HH+D$@AŅLHzHzLH)H)H9<Ht$@IcHAV8A9ŸDEu?Hju2HB=Ͷt u tH:HHĀHt H1۸H$(!dH3%(H0!D[]A\A]A^ÐHdL%L9Bt<=Nt2u2tH:HHĀHLBHD$HH+D$@BAŅAQ@HH\$H$~zHHJHJ00 w[HA+f.D)9|ȋ HH0 w!x= ~HHR0 vH7f.AVIAUATU)SE<}v[L]A\A]A^HILiEH)HH4HH9r7fH9sL9tVEt$AmML$@~wA@t4IM̋FHML$AD$tH9rrDAmѐHLH)b[]IA\A]LA^M@ff.AWAVIH=hAUATIUM)SHH8dH%(H$(1Ll$ .HHH,D$LH|$HD$ Ll$HD$覆tpL|$LLLoHHL9HHdL @HzЃ vbHuuHI9vL)LpIIIH|$L9tbH$(dH3%(u\H8L[]A\A]A^A_f.I9HcҋT@׃,u.T$ET$ pDIξff.AUATIUSHHHP HpHH)HHHVvHWvLH)LH)H9vzHcHAU8HH9I$L,H)HzHJ4/莛I$HP L)HP H9P(vEHJHH *H[]A\A]fDH|$vI$H|$HpfHL[]A\A]Lt@먐UHAWAVAUATSH8 HE HHHHLuHHE0L0DH dH%(H]1H8HHDžHHHDžHDžXH E&EH8E1E1LXHDž@HHf.HHLLLKDIHH^Ls IAtML9@uH蘂 HHHH88HHH@@L9XLHCXHHHIHIIH@E@M<L@Ɖ@ M? HHKDH(LLIM%DAV4IcF0AAV@IcF0IHM9t[IcF,tAIcF(tAIv8HtHtIcV0McNLIHHHH LBM9uIH(HTU@L@1L5H0@A bIc L>IcF0DHEH@H HDžA AE&HpAEHA@0HHƅ L1ҋNHDžIH~HH H;H(pHqHp -QAHtvAuptgIHHx Hp(H9}HOHH 0H9HqHp 0AIDA)E#MHpHpLH)H)H9L0LLLAT$8L0I9ugAD)HI9GDEFIc׾ LH0gH0H9u& A)E9HdKHHt HaAHH;tEHH;8t0HEdH3%(h!HeD[A\A]A^A_]/dσH~H?HHI<HH9HcEH(I9+ HHHLLHHH(HL4ËAF EN Mc&‰A@։@AA։ƒ։ƒꉵDAA׉‰IcV,Av@Av0H@HD<E-E~IcF(tH@HLc$EE&E9DAM=x DHcDHH贴HDDu H4HHH)HD$HE9IcHHDžHH0HҨHtLcJHm0 Z#Iv8HHH)H|$HHt0EF0L@11AHLHύJHH9wIHHP Hp(H9HJHH %AV H9HQAHP #AV @IHHP H;P(HJHH +AV A t0IH/HP H;P(!HJHH -AA~0&AF t0IHHP H;P(HJHH IAIc~HI@HHIHHHHH)HH54HHA7H wI90H@fDHP H;P(s@HzHx 2>A1AI9{A7IIHuLiu@~AWB/H~HOHN?HHA<FL VMYHHA<N σH~NHHA/σH~?HHA<f.H~HOHNDEH=3kH~HOHHyH~)HHA<WfHdHHX`H@PH ]8t<HDž fH~HOHN3H~HOHNH igH51ZH=!σH~]H=)H5>$AEAąuKEtFIc׾ LH0v`H0H9)D9DIcF0H@H4IHHP H;P(HJHH 2_StCEt>Mc LL_I9%$)D9DHMH hH hLH)H)H9IvIV LH)HAT$8IV I+VHH9)HcH9H(IHH(H9^AxfHHDžHfE~AIDDžA߃ E~AF IcHTIv8HHH)LT$IHtCDA~011L@HLIʍJHH9wHDJDLLLDDDE)9 HmD){g;HjH81E1HHHAdKIcF0H@HLM ` 0SS LhAmIcLHH?H9DL$H0LIH0vDžIIL)LD$IHpLHhHDžpL{IH0LD+0 DEuMHdHdLH)H)H9ZLLLLAQ8L9HAD)HL9$D0LEt iDELiH}(tDžIDEtDEpIcF0H@HH HcHhIcF0HH@H`E@Af H(H`LHHHH4"H 'H5SH=AEAąu E`IcF0H@H<pIH LvasIHOHP H;P(AHJHH %/$AIcF0HH@DžHDžDžIcF0H@HH H E. DžADžDž0xƅ E1䈅@H H5"0XHtHEA qAGA+LMcHDH1IIAHHL9s〽HlHIM)LHHL96L⋵H)¸HHAԅA)ωA)HtAu AWDE A IH HP H;P( HrHp -HtrAultcIHHx Hp(H9HWHP 0H9HrHp 0xEEfMH_H_LH)H)H9 H0HLLAT$8H0H9)HH9IcF0HH@HhE@Af H(HhLHHHH4fAoA `HAutIRAB0H)IILLHH)HH֋AԅA)ωA)ADEDžDžƅ ULHHIIHHHHI)BAHHH wˀHtADE8H LDHHDtDDIA PEGHLDHDILHDHIAHHHwH? IHw HH H;H(i HqHp + pE[Ic׾ LHHDLSHH9LDH)D9DE1HLHIAHHHwAIcԾ0LLH0L#SH0H9nY)D9DLLDNσH~NHHAA$Mc0LHLL0RI9)D9HL0D> MHZHZLH)H)H9 LLLAW8L9b)HL9B0BIH HP H;P( HrHp +tDžDžA-A#Dž0E1LADž0A>EIHZ HP H;P(L HJHH .A`HIc>AI@HHIHHHHH)HH5T4HHA7H wI90H@fDHP H;P(s@HzHx 2AAI9bA7IIHuLWu@;IHZ HH H;H(L HqHp  LA)HDžHA)AuBLLLDž0I:AL^DLIcLL茾LDž0IH@ H\5IH2HP H;P($HJHH  H~HOHNHcI|Ic LHH(HH0H)HH|$HHI<Ic ATH0H(LZLH)HHADžHA wAHP H;P(HJHH 'AV A0AvtBIHHP H;P(HJHH 2AA)D9DE1IHHP H;P(HJHH 0ADž0ALDžHAH5ƅDžDžDž0xlFIH2HP H;P($HrHp  L蓺HHcHɅHDIc׾ LLHPLHH9)D9qLDLL0ULL0H-DLLSLDH f.D-HLLLRLLHDPDMc LL0L.KI9AA)E9TL0DGIc׾ LH0JH0H9,+)D9DU%LQf%LQAV IH#LQAV A IH'LfQcHL0SHL0LL˸LH4ˑfLLmSLLf0LHLLPLLH@0LHLLfPLLHSGIHZHH Hp(4Af AF4D+HLL0LHLOLH;0LHLOLHuIHsHP Hp(H+DL Af [.LOfAj-LNf.ILNDL$QL++LN@DsDDHHsE9IcHHH LND HLLH DLHH Hp(0LMLMf.IcH1LhIHgDžH0LEE1萖H YH5!?H=fnH :H5?H=nE1H H5>H=mH=H=mH ɬH5>H=mH H5r>H=mbfUHAWIAVIAUATISH(HdH%(HE1Hd4YA$~My#LuYtE,$D AoIG%LHryAH@HXDLDžLI$HLH+LHH+LH8H9H@LLL)IILP8I9HH9HXH=lH=fH=rDžDž0DžHDžZHBHXCZH=E1E111ALUH=)'DžDž HDžDžDžDžDžHDž(Dž H=HKbH5 HLܫA$DžLNI$dL%L9Bt?1=t2u2tH:H豑HĀI$LBBDDžDž0HDžHHEL LLLPP4PHP0@PH@AA$uI$jDLEHEdH3%((HeD[A\A]A^A_]HXXHHHXCZ/HdfDH(tH(fA5DH1IDHB=it u tH:H-HĀHDž(XHLLL )A@HLHfDH(IH(HAdKWH IAH H1HDDLD D LDDW H8$G  H(H3H& uZA/ƒIWAI$2HBHP H;P(4HzHx 2AAt  D0H(SHX%HXHHXdsHXE'&I$HH+FH98H)HLHHQ8HXHH)HH9D)HcH9D AEl0A/ƒIWAL MxESLA<IcLJHH?H9HHHmHu Hl$HHH)1LD$IMHLHHDžL4\HHLAD) E%I$HH+-EH98C"H HLLDS8H H9DD)HH9E@4HDTDE1Is@HtDE AE/ƒIWAHIcHL@A/ƒIWAHHAHE1ۻxDžDžDžEADž IcHHXH HEȋ oHcHMfDH1IHAHHH9vHtDHLLHDLDLI u7t-LLLDLDLILHL)HHHH9 II)¸LHEЅ )D)HAtu AB@DEЋ D A "EI$HxHP H;P(jHrHp -AgAHt}uttjI$H=Hp Hx(H9,HVHP 0A H9HrHp AACE I$HH+%AH98H HLLS8H H9D)HH9 DfDH΃ DD@րADž B     A fD&IGHHHPIW(۽pHpHhLHHhknAD)9 AH΃ DD@րADž B     A  A fDIGHHHPIW(۽pHpH`LHH`hD@HXHp@HX0H H5$HXXHpHX*N CE1 CZ{H=4H$fDHXDDLD@D= LDDHc =~{HDHDD}HDDDvHCHH)HD$HLHX$CZHH=4HN$EI$H HH H;H( HqHp -A AHu}DEtqI$HHp Hx(H9HNHH 0AH9HqHp Ay AHӋ HAD)Љ EEI$HH+5H98 HLLP8H9ADD)HH9A݋ WHcӾ LH,HH9AoAE)A9ID DHDž3Hbu@tIALAA0H)ILHѸHI)LHEЅ )D)AEg/ƒIWADžDžHGHXDDL肺LADD=DHdKE A$Hd ADHeDEUDž MJAB0E1ҋy HHD)ЉAA)HMfDHIAHHHwfDHMfDHIAHHHw[fD1AAE1L ~1D Eu, E&I$HH+A2H98< HHLLDLP8HH9ALDDD)HH9DEEt  LDZI$H HH H;H( HqHp + EDIcҾ LHH DDLD(H H9ADLDDH$D)D9EE1@H(1HXH(H(HMH@HIIHHHHI)BAHHH wH0DE Icо0LLHDc'HH9kADLD)D9EHcӾ0LHH L&H H9ALHD)9xAI$H HP H;P(q HrHp +/ƒIWADžE1DžHfDIWHBIGHDžDž fDLI)LHEfDIWHBIGI$HU HH H;H(G HqHp  vAu7LL1YLHAzAL zDLIcLL1/LHA@DIWHBIGcIWHBIG;E/ƒIWAHD(7AG=ƒIWAGpAG=ƒIWAGpEh/:ƒIWAHIwHFIG+HADž HfIWHBIG /ƒIWADžE1DžH5DDž M1E1AL .}fHp@HX0H A/?ƃIwA6IA MA9s H( AIcDHDH߉D(qD(DDu HHDž(HCHH)HD$HLHXfIWHBIGHdHHx`H@PH@<@uHDžyI$HIHP H;P(;HrHp  6HcӾ L爍H u!H H9}A D)9AML!HHAdIWHBIG-/ƒIWAHD(_/ƒIWAHc2IWHBIGIWHBIG IWHBIG#L爍 ' t@L-HDLL'LDHLDH-DDL L''L DDHVDHc LLHHDxHH9ADHD); LD RHL(HLHL (HL JIWHBIGIWHBIGe%L%{DHcӾ LHHH9AD)9AHc LLH*HH92AALE)D; D IwHFIGLDD 跌LH4e DDH=FF'fHLHD'HLHD/7ƒIWAHfD(IWHBIGBIWHBIG/ƒIWAHML$HDDL蓫LDD"H8$@L+HDLH+DDL 0LLHDL#LDHLAI$HLLHDL"LDHLHLHDDL Z"L DDH0LHDDL "L DDHAI$HDHP Hx(v11,11;LHD $LHD IWHBIG:IWHBIGEIWHBIG IWHBIGHDDDDHH(DDH(LHXH DDL eL HDLH(DDDDDDHH Hx(4iiHIHHH MlH5H=AœH轼DHH(DDlH(L H lH5mH=@]H H5NH=@>H6DHH(DDH(L7H ^mH5H=+@֒E13EE1H &mH5H=?螒ff.AVAUAATIUHSHH`dH%(H$X1+ODLH|$ HH$H$8H$H$PH$ H$H$PH$(CtDŽ$$HCD$ HDŽ$H$dL- AMH5iHH%H$HP H+PHՅLH HLH)H)H95HpHcHAV89ŸDEu?Hju2HB=Zt u tH:HTeHĀMt H1~H$XdH3%(H`D[]A\A]A^@HdL%L9Bt<=Zt2u2tH:HdHĀHLBH$BHP H+PHՅHIhH\$H$|H$fDAPeHD@HBHB0 wSHAA)C D)9ALAHH0 wExA ~AfDff.AVL_AUATIUHSHHB0fb L\$B WЃ0 0Hm <)w1HcH>@K @IL\$AuC tC C,CA<*0E1 C(A;.3HWc HISHT$AL<.w H mHcH>IӀK ISHT$AH=VC@SWBHC8s07xH nHcH>C0@K K @K K K H|$tCL\$@K ICIHDISHT$AC<* 0 .IMkLl$AC0 Dc,MILl$AIIH|$t7HT$:$u-LZL\$tHH9EHCEK0HEBL\$AEyHC8H|$HLH{ H{H[]A\A]A^C <0C4ufDDc0If.C C4H|$tL\$bA{hICK IHK A{lTInC4H|$jH{%$HC HL[]A\A]A^C4H|$uDc0IDC4C4C4C4@MsLt$AC0 :Dc(IMILt$zDH|$tHL$9$S,L\$E1*@H THHHK@HS4HЋSHcHK8q{0HEAH<H|$H_L\$t C41C C4PH9EHCES,HEHHL$ISK IH|$t HL$9$tS(@t%PH9EHCES(HEHHL$ʋS,닋S(fHHJHJ00 w[HA+f.D)9|ȋ HH0 w!x= ~HHR0 vH7f.ATLOIUHSHHB B0B f%LL$fB GPЃ V1HiD )wHcH>fDxLL$C tC C,CA*0E1 MC(A9.HPc HAIQHHT$.w+H5iHc H>AyhrK AAIQH=`PHT$CC@t =WPHC8s07H iHcH>@K @AAIfDC0K fK @f.K f.K f.K f.LL$fDH|$vtCLL$@K IQAAAAMYL\$0 wk,MHAL\$HDAAIQHT$* 0 I*IH|$t7HT$:$u-LJLL$tHI9ICK0IBgDLL$ACTf.HC8H|$HLH{ H{H[]A\S 0ҁS4u@k0IS C4f.H|$tLL$/H .OHcLMHS4HK@HAHcЅCHS8m{0'HfIрK IQAK AAIQIlC4H|$H{%>HC HL[]A\C4H|$uC4C4C4C4DAAMYL\$0 k(IMHL\$ H|$t HL$9$t~S,fLL$E1A H<HH|$HBZt,LL$t C4 1C ‰S4HD$HPtPI9ICS,IHHL$`K IQ AAH|$t HL$9$tS(@t"PI9ICS(IHHL$͋S,뎋S(k0I;ATUHSHdH%(H$1GpHH H HH)H)H9HHxqD$%= }H\$8HCH=wLH|HHtQHHBH$dH3 %(HĠ[]A\ H+HHu@HD$(HH H% -wMPDH}pdD#LdD#u+;WUHSHHG8HtRHU@H)HBHEHEHHsHHt3HH* H[]fD3HE8DH[]fff.AWAVAUATUSH(Ht$T$HHHˋ H% H}t HD$H8u#HD$xHx譩HEHLCLsM)ME1@HD$O$7H}It$HH9s5HH9HCHt$Ht$HHHEHD$LCH0LLLrLsMFHN>5LCLsMM)Ƌt$LLLD$rLD$IL)HMLEHL)I97HdKIĀu?Hju2HB=Ht u tH:HSHĀH(L[]A\A]A^A_f.HdL%L9B=Ht2u2tH:H,SHĀHLBB I0HEB  IX@H<LCLsM)B IHIdI鳀f.AWIAVAUATIUSH(Ht$DD$LL$MtAA$.MKLt$=L9LIGHpHHu|LHLI)pII\$Mt>Ml$I\$L)HL<9IAIMuLH+D$H([]A\A]A^A_fHŋD$LH+\$L)x HHHLLHL$|oHL$HDIL$H([]A\A]A^A_Ht$LH+D$HtyD$~A.I]ADŽ$FLE718E1T@AWIAVAUL-iATUSH(dH%(HD$1 t1L-h0t#HHD$fH@8HH9uIӃ~TH-P E1H+-> $@LLAV8IHu^~ MLH+ H9wE E1~2IHHHH)H)H9v1HcLLU8IHD$dH3%(uH(L[]A\A]A^A_ Pfff.AWIAVAUL-^ATUSHXdH%(HD$H1 t0L-V^0t"HHD$HH8H9HH)H)H9v+HU0t#H[]fDHHDt$ 7t$ ƐUSHHHHH;Pv#HJHBt#H[]f.HHHHH)H)H9v HU0fHcH H H8 tH9w:fDH)HAff.fUHSHHHwuEHHt&H+AHEHC`HEHk`H[]H+AHfDH@HGHt1HHuGH+QH)@GH+QH)øff.H9~HcVH΁x9L@t$HpPHHHpHHPHH@L@@HHIIH1L@uHpHHPHx@L@PIHHIHxHp@H1f.f.H`tHG`HHtffffff.HWHJXuBL9BHEf.1fHGH@L@AWIAVAUATMUSHH(LoHdH%(HD$1HD$`Lt$hLOPI}Im(HT$HGXHwpt HdH3,%0HSHT$jLjHsPE1LLL$HT$ I$HSPIZYtB0HL$dH3 %(u,H([]A\A]A^A_fDft>@AUATMUSHHLdH%(HD$1HI}Im(HHt HdH3,%0HSj11jHE1LLL$HI$ZYtB0HL$dH3 %(u,H[]A\A]f.f=@AWIAVAUATMUSHH(LdH%(HD$1HD$`HT$I}Im(LHLt$hHt HdH3,%0HRHT$jLjHE1LLL$HT$ I$HIZYt@.HL$dH3 %(u*H([]A\A]A^A_@f<@UIHAWIAVAUIATSHH(LwHdH%(HE1I@HUHHwpMf(H)HHGPLI>HGXt IdL3$%0LQjE1LjHUHsPLLMAHEL)HMdH3 %(uHe[A\A]A^A_];DATUSHH0dH%(HD$(1x'uu7HT$(dH3%(kH0[]A\fuݸHHELehLHEHEHEXHE HHH@` H|$H|$1LHHkHL$HDžHEpHpHExHuHHHH9HHHH-HH$DžHHDžHPXH0HDžHHDžDž HH:H \xH5H=dH =wH5H=f}dffff.AVLwAUATUSLoHL'Kl-M9t4I9wWHLHHtlH Hk[]A\A]A^HHtHLLHmVHHd LZL31HCL#1ffffff.HATIH LUH SHtHu=L9cs*H;HkH9tLiHtULcH[]A\HL1HH9tH?HkH9t诒HH+HCd 1[]A\H+HCfATUHH}VHxIHtB HLHH]A\2UZ1]A\ff.AWAVAUIATIUSH(dH%(HD$1xZ9=DHcH H4HH=>bHL$dH3 %(H([]A\A]A^A_H5ZH=nbHITHt$Hc1Hź D$L9LLHFLITL9H]-HxI9vLHD$LH)L)H9HG TCD%L=H5H=`aHIT1Ht$HHú D$)I9HLIFLIaTHI9oMty6fHH H# H9HGH HDff.HH H# H9H H HDff.AUIATIUHHtYA<$tBLL7TIA<$t-LLrSL8tHHEL]A\A]fDLeE1]LA\A]L"ff.SH5AAE1H IIAI)K H9s0LC8rLAIAK H9rLE1ɹAI!fHIAL)K H9s,NGD8wtGMAIK H9rIHI9rHL[M9tI1fI9tIDMAfMAqfE1fDAWIHAVAUIATIULSHH8dH%(H$(1HT$pH$ IHD$ HHH9uHkI<LI4,HtHH)HHL H9uLD$LLK4L$QLL$H)߅IF11HD$M|-L)L)HtI9HGH1H9AHD HuI9HMLICH9w !HH9vEE8tHLT$M\$MLIM)MI9v/H$@LHH9LBTLHA8TtH$HL9LHH9Q1H$(dH3<%(H8[]A\A]A^A_L)AL9IB1M)HS HH9wIL5)HD HuLL9wHH9vA8tLIFL0HtDM)MT$MDHHt(B\A8\tHH$IID)H!1AWAVAUATIUSH8dH%(HD$(1HtfHIH9'IH*2HHNIIHt1It+H)H)I9LLLNu:f.HD$(dH3%(UH8L[]A\A]A^A_f.HT$ LL`LL$ HHKt L $7NHL)L $M11H)LSM)L$H9HI4HCI9wHI9 DE8\tI9H1HH9vE1( ILAlH)H9AHB1HHD$IHD$H)HD$fHLHxD: t-HȉH $H)H,MHsH $HHxH+T$HsI9IEH)DHI9tDT>D8T0tI9vmHT$HH9vM$LIuII)MH9w"DLXH9twLFD LXD8DtHL9wbH<$LfDHCH<HtBH)IuLfDHHt&DL8D8LtHT$ZIM$.fAVAUAATIUHSHKHuHE1I$[]A\A]A^LpLHEHt}HfDDHHt)DDE9uH9s0yt*HHuMt#[1]M4$A\A]A^@If.HHE˸ X@AVAUIHATAUHSHJE1Hu[D]A\A]A^@HuLpI}LĉIEHtaHEHf@2HHt(3D9uI9Us.zt(HHuE1[LuD]A\A]A^IA gffffff.fnH%f`H=fafpoffoftftffHt&HBH1H!HHff.ogfoo_ ftftoG0ffoftftftHfDffI H ftH HfH0HL H fH0H H tHHH1H!,HH7HHH@fHfDHHEHEH@fo_ ffoW0fofogffo/ffftffoftfDfoftffoftHfDfoftI L fDL I0L …rftftftffDftfDI HfDL L I0L L@I1L!HEHEHH1ff.@1@1ff.fHfHo(foo`ftftoX ffooP0ftftffoftftftHfDfDfI I ftL H0fDH fH fHH0L L H Ή)HHH&HBH1H!6HHfffff.fn}x? wUottH uH1yf=HH]ff.fHottH u!ff.@H4fotH t uTotH t u8otH t uotH t tuHHDwʅuH^ff.AAA1D!tHDwHωAAA1D!tHDwff.1wf.HuH1HIIIffffHHHHwpHftftHftP ftX0fffDfHHH L H H HH1LH)HHt}HHHfHftftHftP ftX0fffDfHHH L H H HH1LH)HHt HHt"HHHHtHff.fff@H@I9t'fof@f@ f@0ftfЅuhfDI9t=fftftHftP ftX0fffDfHHH L H H LHHH)ff.@fftftHftP ftX0fffDfHHH L H H HHH)HsIH? w?tH 5H HHH YHttH9HHH)wÐHH H)H HttO tO@tO`HǀHv[HHHff.@ooW o_@og`tŅHǀHw@~\ttO tO@ tO`Lwf@tu! tO u+Lw@H9vwHH)wff.fH9vWH HH)wfH9v7H@HH)wfH9vH`HH)wfLwf1ff.fHH)wfH HH)wff.H@HH)wff.tut…utÅutH`HH)wfHH H#A H9Hw H HDff.H?H?AUATUSHhdH%(HD$X1ǀtTHdHH(Le(M I$H8Hh0t HdH3,%0I|$uMHtHH6I<$HL$XdH3 %(Hh[]A\A]fHD$W\$WLl$HD$HD$ HD$ HD$HHD$HHD$@I$Ll$(H8HX(D$8HD$0t HdH3%0HG6HD$LE1Ht$ jI<$jHHLL$(Y^@v $D$ fHYL%H9HLe( ATUHSHpt$ dH%(HD$h1HH HD$0HDD$8HT$@H0HHl$ dHHLc(HHD$(MID$H8HX(t HdH3%0DD$ Eu\H$5Ht$ E11I|$j1jLL$ ^_Pt[HdTHLHD$ HHD$4HD$HT$E1Ht$ I|$jjHHLL$ ZYuHD$ H)HL$hdH3 %(ugHp[]A\fDHD$ HPHT$ DD$ Hl$PfDHL%H9HLc( H \bH5H=Ifff.AWAVIAUIATUHSHxdH%(H$h1H HHD$@HDHD$HHL$PdHHHC(HL`I<$I\$(t HdH3%0IUHLHH$ItH 1H,@Hd1?tH 1H@Hd1HtU/h]WHdSH1=t sustH{HI HĀ;11gHC HCHCC(=atKuKtH{H" HĀ[fAU1ATUSHHIdE,$=t sustH{H HĀHCHk0 IAPHIPI8HCHS u=L@0H9CwHS;HKH~HCA01uCdE,$E1=otKuKtH{H0 HĀHL[]A\A]E1dA<$ufffff.ATUHdH%(H$1ILxeD$%=@uG1ƒt@tBL1nH$dH3 %(u5HĨ]A\Hd1fDHd1A ?H=sHdHff.f@k@h@l@AHHAw-H=wDHdfDHdfff.AE‰HHAw0H=w HdfDHd@HXdH%(HD$H1H0HT$HdH3%(uHX fffff.H8ITdH%(HD$(1HH=w~Au]H$T$!I@$oD$A@,IHD$fAP!T$#I@D$AP#A@D$A@0%A@A@4A@8HD$(dH3%(uDH8fHAd  H=wH.H9w)1fDHd1HfDHd @@AUATUSHHdHL(I;tPI1HH&H\;t2HL&uAHDIDH[]A\A]H1[]A\A]ff.Ht*;VstN#N H u f.#NH AWAVAUATUSHH=HHH4$H5VdH%(HD$81蔝HHŋL$$€΀UHD$HD$  HD$(Lt$ HD$Ll$5f.H9L9II)MEH LLRHHt$H|$IHD$(H;D$HxH|$(8-Ht$0HT$0H;T$(teHrHt$0: uWH $H4 L9gH9^HzH|$0zru.HzH|$0z-uL9H9wQI)ME1HhH|$aMtQHL$8dH3 %(uCHH[]A\A]A^A_DMI)DHdt u@fff.AUATUHSHHH#;{It8HHHr$uB#Ѓ߃A<wME1HL[]A\A]@H{HHI6$E1uB|+}uHMe[L]A\A]DB< v_ufHUHHHH)Ht$HHuIHHt(O^AT$JfSf^fA|$>8jAT$@It$(HH)HH 3H9JHEH 0HH9;HIE1LHH8H)IH9;uLc IvLC0IvI@HuLKK H;6IIID$HH)Ll$I1LDHMLULELLDuLELUL9HMLIx H"IHIEMMH3L3 I MAEAEAMHAM9 @HL 3dD8H7ELEȀ}uHHUE11jDD`LmLMLLHPHHH)H|$HLHVH]LMHELFI9T$fDA|$fDAEEMHMH!LML$H!L9wI)I@HC1DHH)HL$HHMHMHDHHMH9AT$@HH)HcDHEN,Q@_LLHMLMLEWIHHMLMILEL eE1L QI$A L /L p#E1E1L  LTHL &dD8E1A|$ L A|$L zAT$tL AT$twtE1L I|$H5L ADž[E1L ̣Lff.UHAWAVAUATSHHH H(HLLHHH(HDž0H4HDžHDHH)HD$HIHL0@AIV IvLE11 Iŋ4%H@HH9qA|(gHLHHVHPH0H(H HL)H8HM 4E1LHAAD(aAwAD(At5utHA6fDH8D4KHD4HH,H8LHD4 D4HeD[A\A]A^A_]ÐHDƿDDu YYD5HdLKLH9yEtHd tu0HHD 0L0M0A5A AHH}tYHEH H@0HHHt5AHfDLH=1_mf.H8H(LLHHDAEu)X1@@DDAD(H IFHH;IFHH=HHXHQHHH)1lLHIEHLLf.HH;HHP HpH_H=IHCE1H8FfDH;8@EHَH=>HHE1E1lIL;=s8IEB|(tLLHH{HPH0H9uDIEIH/LLHtxH8uHHHHHEHHHH=1kHHHfD;/HH=o1kHPu9HHH9H\H9HAH8 NDof.UHAWMAVAAUEATSHHu H 1H0HCH@DH(H@HHHHHHE HHL$MtxHHMd$MtVA$ uI;$uI;$uDHMI|$8H HeL[A\A]A^A_]ËE @H(@OƅLM DELDH H=IH H0HG Hw(I$GL|7fG@HfA$H)HH3H;A$HH@HH)HT$HHH8HHH)HII9! ƅE1LL-HDžDMIcTL>H HS0HqHH{LCHIM)IHKvMNII!HH8LL[ IH{(LLZH!L!HzHrHJ IvH2H9rغE@K@bQsK4vMHH8T1(HH8H)IH9MDM fRHKDREH8HH=LHHDD,(L H)H!HDHLHI$HIHHH)؀I$PI$tFKRHH8LHH<Ht1H)H,L8 A$@H8AtHCI$I$XI$HKLCL9v8I$H5عIHHHM\0I!L9LFM9L9H0KRHH8H9HsHDk(H9fH)LK I$EHǹDLnLH0L HS(HI$0HC0I$8HKHPH!HHEI$@HC I$ I$(A$<YsI$PA$lHSI$[H0HL  A$-H{ "HSIT$HS(HfA$f.Qtdt0RtdHSI$`HS(I$hsHfH(@ƅHU H H=1cbHC1DHH)L|$HDILH9L 4RDL HtCH(MDHH 1HL ȖE1dHDž(f.DL ID$HHCM$JIT$H:HIL$@HooIA2A"p fLH)HHHBHHH"vHH)HvЍ4AAv9DD)HH=FZH yH5H=HH)H :oH)H tHHHH0ZMtyID$`HtLPID$XHtLPID$hHtLPID$pHtLPID$xHtLPI$HtLPI$HtLPI$HtLPI$Ht*Hxt#H {H5H= @I|$xt0I$Hxt!H H5H=߾fI$0Ht3HPA$tI$tI$tI$I$xHcHPA$@tI$xI$I$(t IDŽ$@t E`I$HI$I$H#9I$ Ht I$I$ DbI$M$LI$2@ L2EuI$<A$ tL%5HH=VI$HI$Hu L53HE1BD L UHdAL1LHL)LLLLHHHJ(HL$0HAH ^H)I HfDL 8C//IL<$MHD$(IHXL[]A\A]A^A_HAH U11 ?ff.@AWHcAVAUATUHSHHD@HLHHWhHIHLoLJHA9u"HEH1[]A\A]A^A_fLLIHv1L1@<:HHuH<u0IHIMLHHHL^L6I?L}EH[]A\A]A^A_DHH[]A\A]A^A_f AM0f.L@8t\@pWHH@8uCu@@:@H:u0@uuffDL5qL5H L11 6H _ff.fUH ԑHՑHAUATISHH5H=+DH.HHHIHHOHHHHhHHDHD$HpHP0>uHjpH0HhHHDHH=>1AT4Y^HD$HH0H=i1<5Lt$XAdž$HD$L9A|$8HIH|$(HIHD$(MJIH>1BHIH'L9uLt$XYH|$`tOH\$H9\$htCH$H\$XIHHD$PHD$H9D$Xt HL$PHD$XLt$Lt$XH|$H\$LKLH\$HtQHsHMHgHE€>tHHl$`HLPH7H1YA\HhA]H1kHgHMHDHnH2H>fHHDH=Ug13Lt$XaMtJEEEtDAPIEIT HH9t,L90uH 9H5gH=VgrE1IpHD$0$D$(H=stH=DD$84ԷDD$8HD$HH@0HHHHu9fH@H#L9uHHD$0I;pAukH|$D$<HD$D9H|$DHLtHAD@H=rH='BӷD\$(EQd%@H={rD$(U$LPDL$(LD$HL$0HT$Ht$ AXAYIH=(rAmT$({1d%u!dH<%E1HH=qtH=IDD$<_ҷDD$uHjH0HtH=m1/H5^bH|$HHI9pzHqHL HH9H9u t,T$ H<DD$ DD$T$ HIDE@AMtEEHD$HLHEH ^!H5bH=ӕHD$Ht]LHH|$HpMtHD$LbLM>tPHl$`HbL1H0THbH1_fL9HH|$MtHD$LTbLMtH*iH0HuH5`L GE11A9(DIt1H9D6HA<9wAHxHD$DD$0HHL$ HHpHD$nDD$0HL$ AL pGH /`ff.HHtXHHAqD@AuiDLAH)I ILHHHfDHG`Ht"H@HHHHPH $H5`H= fff.UHSHHH=@mt H=ͷHH OHHHHtpHH@HuHU HjHHDHHpHH=lHtHH=[]jͷf.H[]fH*ff.AWAVMAUAATUHSHH(H|$HDD$HPHIHT$cIHID$(HT$HxHI$I$I$ID$8!HT$ADŽ$I$L HEAID$A$A E$KH~I$HI$`Mt$0HI$IDŽ$HHI$`HZDHHHuyHHI$ɈL$I$H|$1PL$IH@HD$Iƀ/uJfHd8"WLIHILHH.HsHL)ߒHtHH!%tDHWHDH/t/HHT$Ht$'HH8/uH9HDI$@H(L[]A\A]A^A_ADŽ$PLHH9D$t7I$hf1H}LDI$`fDI$hpH@HHt$H*LDHH :H1ff.HHH8H;5 H#HjH)H=vqH@L0H- IL9rUHL)H)H1HHH)HG(H ҤHHtH{1HÐ1fDfDSHHHt )u[HsH 811`ff.@ATH(L0H dH%H+HI)HL1A\H{ff.H5zSHH`HHHHhH!H!H9u[DH)HxyHHsH r1d8H_ATHcUHHSHBHcH4PH0ILNH gw,ڃ@Hu1LP1^HPPPP PPtUHAWAVAUATSHHH(ȢIAԃ EAIHHIChIH@H@d EtWICXHPHBH (LZH= H#HHBIH( ICxf)E)E)E)EH HPI1LxIJ<:HtHpIt=IHHICPH@LI9uI)I<Eu H9 HMHEDmHEAL1HPHEMD,H HMHHxgE11H9Hx,HLHIHLHH9v$Hp%uIHuHHH9wDHtCL9w>M HL9w/{%uL+,HCIMuHIEL9vHP HPH; (M(AHIhgHe[A\A]A^A_]HkE1oH=H$IIHBHNH @IOpL;=dHyH vHHhtM'I@IH`HjH`H@H`H9xHDž0HDž8LXfDLkEA%H`LHhH HXH;4FH@HpL4ILuII&M%AVAFyM;TIzIpID$HAI$A EI[DȃIDDȁEHvMLMtAHLDA>jHULHHH@jHMIIIXZE1HI%oH=XJcH>fDHELPHpLSLfHH9x_H8LXHL0L9MHL9HC%uH`H L+I GHhH@MLLUARkABWM;MALJHILMtEHELDA:jHUE1jHHLH@Lx*HMLxII_AXH HCIIEHELPHpLSH5nDI9IGhAHHHFZHHSHHD1QHCIHpH8LeM#IT$HpLI9VIFVIFI9D$wD%›EH56TfMIPHpHHEHIHHJHwH@HpH)HCHt@HUHcHpHCHBHL@HCHpH)IIcDI9(H59@HEHk IHHJH H@HpH)HCHFHNHH9HPLH&t HHPHLHH9wMLLQM 6fy+,M9tqAteuaHXIGhH5QMCIOLHELHHDLHH51LLLALII%f1DLH8H0H8HpHCIHrfAIAQHI+H qH f.HPHHpHxHgfDLLу )fy,H0LYHxI9t]tQuLIwhH=PHwVLpL@IOHE HHDLN1H5q LpHxL@IHEHPIH59LH4LHe[A\A]A^A_]fIIHBILfD@H>H >HEHBOIfD11E11fI$A19IMHM)fDHDž8H9xxLXfLkEA%7HXHHpLHhH H@L4LuII&MAVAFM;4IIID$HAI$A EI}DȃIDDA>EE1LMHHHUjH@j}HMIIIXZE1H*I%PH5ѰJcH>HELPHpLSLfHH9xH`LXHL8L9MHL9HC%uH HhL+H@LMLUARABM;A:MLE1HHH@HUALJjE1jLxH=-F1LxLxLsIGPHI1H@ LxHz1H HHLxI0H~HKIKHHgH5>{1upDHM܋SHsH;H[HuM)QA19eHpKH0HCHHDHCHpHGH\AHEE IIHMoLLLHEIH!LLLHEIHcH'HBH=HYLLxLx;LӋ/9OEE=IIHMH 0H+HDHBmLL0&L0HEIH9LL0L0HEIHHDžH bH5~xH=xMH pwHIs1d8FHCMH wUHAWIAVHEAUATSHH} HuHHU1HEHM莝H]Hۀ1MHEH!H]I1ɾIHZs HBHHHHHHLuHCHiDHMQLEE1IfDIH8M9*>uLv0I IFHuH~(IHVH vLA M^ HMVI)!fDLMH!LH!HJ H9szDjuكuԁz GNUuA vILEHu L!E1HLpLzHHHH)ċBI䉅xHHEH4LeH H UH`HUKD/LpI9syH]ILELeMMDxDI^HLAML$DLI|$MHHUHHBLtM9rMH]LELeMIvH]E1HLMMMH]sgIcHuHHI~DEHxHHEHsLc}LXHuAH@H`LHEI$IHUHuHOLuH/H It1DDHHtLHITI4/HxIuHUL/HxHuH`LXHx1fHHHIDH9wH}LpAHHDHcMt6LLHHHtLRLOHHOL LJHuHuHHuDlMI~ AHMcI9tFHLDHHHHHHHH9tHuHHHHHH9uI)ILNjUHMHHcHHHHHGHuIFH]HHeL[A\A]A^A_]HHs1DHHHIL HT H9uHH?wCCH)HHu+NH)HuHx!HXHIHuMH v<11 ?HmLXIT$It$HUI4$/Hxޭ/Hx HUI4$HXH8HxH@貭H]/HEHIFHIA<$pHcӋHHe[A\A]A^A_]f.I9CHHHzLbtE ?HcAHHDŽ LA$?HcHHDŽL<%/B<0HJA A<*<.LH؄LDL[E1HtLH>[H1 DIHufAAffffff.UHAWAVAUATSHLxAIHH)HHLHHDž`gmonDždHDžhDžpÓL5Tw1DžHsecondsLfHƅƅs謠L=vIL蚠LID!HH)Ld$ILL/Hx LH.profileH0B@1kAǃHƿ`w%=aLXHHHPIHHL9E11ELOnHHX.DiLXHPHMDDMy@I@LnHn7pfo`AAfofoAAHAIA8AIAQ(A@HHHPL@LXLXL@HH6nHPn nAL 0L n9sAnHtMHILI@5mHyVHmHH9rHvH)H>H9vHL;D1s1ATIUSHhHPDH)HCHt4HHH9vHgHPHHLcHS[]A\f.HuGHCHHgHPHtELF|HHLH>HFHH H5x H= %HNgH /W1H5|  #@AUYH=^ ATUSHHH=wW~S$[tJ/HHHY8/كuIHto/fA$jH-AfHtTHHxIXIHt8LHHrIT$H9wfDHH9tx/t @IHL[]A\A]ÃHcIHtHcHLH ;V/H5VH=D軜ff.ATUHHdD$%EuHD]A\@L%eMt\I$H1wHPI$I|E1eI$HtHI$I|I$HuADHeHtHhE1H`AeHA[GfDH5;'SHHHH#;]uH[ ;fH[dH H$HD$HHHHcH$LD$LL$HL$Ht$ H|$(Hl$0HC0HD$8)D$@)L$P)T$`)\$p)$)$)$)$f$f$f$f$bHD$bHL$bHT$bH\$bHd$bHl$bHt$ bH|$ $$$ $0$@$P$`$pHHS0Hs(H{ LCZIHCH$LD$LL$(D$@(L$P(T$`(\$p($($($($by)$yt $bHoD$D$@bq)$yt $bHoL$L$Pbi)$ yt $@bHoT$T$`ba)$0yt $bHo\$\$pbY)$@yt $bHod$$bQ)$Pyt $bHol$$bI)$`yt $@bHot$ $bA)$pyt $bHo|$ $f$f$f$f$LSMyHL$Ht$ H|$(HH$H0AHs8IILL)HHHHOHw H(AHcHHHHQ)A)I bHPbHffy0y@HSHs(H{ H$HT$(D$(L$ y)$u bHo$Pq)$u bHo$f$f$l$@l$0HH$H0fH H$HD$HHHHcH$LD$LL$HL$Ht$ H|$(Hl$0HC0HD$8)D$@)L$P)T$`)\$p)$)$)$)$f$f$f$f$$$$@$$$$@$$$$ $0$@$P$`$pHHS0Hs(H{ LC|IHCH$LD$LL$(D$@(L$P(T$`(\$p($($($($by)$yt $o$D$@bq)$yt $o$L$Pbi)$ yt $@o$@T$`ba)$0yt $o$\$pbY)$@yt $o$$bQ)$Pyt $o$$bI)$`yt $@o$@$bA)$pyt $o$$f$f$f$f$LSMyHL$Ht$ H|$(HH$H0AHs8IILL)HHHHOHw H(AHcHHHHQ)A)I APffy0y@HSHs(H{ l|H$HT$(D$(L$ y)$uoD$Pq)$u o$f$f$l$@l$0HH$H0H H$HD$HHHHcH$LD$LL$HL$Ht$ H|$(Hl$0HC0HD$8)D$@)L$P)T$`)\$p)$)$)$)$f$f$f$f$HHS0Hs(H{ LCxIHCH$LD$LL$(D$@(L$P(T$`(\$p($($($($f$f$f$f$LSMyHL$Ht$ H|$(HH$H0AHs8IILL)HHHHOHw H(AHcHHHHQ)A)I ffy0y@HSHs(H{ -zH$HT$(D$(L$ f$f$l$@l$0HH$H0SHHH@H$HL$HT$Ht$H|$ LD$(LL$0D$@HsH{uIL$@LL$0LD$(H|$ Ht$HT$HL$H$HH$HASHHH+%OH$HL$HT$Ht$H|$ LD$(LL$01H$@H$HH$PH$XH$`H$hH$pH$xd$@HsH{tIø1l$@LL$0LD$(H|$ Ht$HT$HL$H$HH$HAfSHHH+%OH$HL$HT$Ht$H|$ LD$(LL$01H$PH$XH$`H$hH$pH$xd$@HsH{2tIø1l$@LL$0LD$(H|$ Ht$HT$HL$H$HH$HAfHH5G1:ff.@AWAVAAUIATL%UHSHHtHI諀LpL蟀LxK<7HHt7LLH LLH>H]HEH]H[]A\A]A^A_H=HEHEHGHEAWAVIAUATUSHhH<$HL$HLD$PLL$XHHIHHLxHL$H$D$HD$ HD$0HD$(AH\$(LfIHЄtcUHu<%uxxPl_sCD$/ ƒD$HH:HQIEufDML菵HHH$D$IHhHhH$HD$ HD$0HD$(Au%kI9EMHAEMutH<%uAFMndHHȉedfo DžxE։`h Džd HHHH81@  DÉHOH@<}HHH?H9PHc HH99L,L):u I4DžIIL)HD$HHHD`L`Et dfDpHML`J\ LIAGI9u닽KDH8C uDE LxE1Dž@D9@D9 ~FHx{LAISAGu 0rD9@D9 A_; uA_L0@ǃ5@@ u!HxHH}{ٽZZf f f#4f.@@A9AID9}A0tEu'H8@ u A9GMf.HH 9t)Dž@<}LcLcLK4MH)IK<4H_HOL4D>fL)fHHHA J9uGHHHIMLDF<~wH9rCIHAAAM9wO HHIM9uH0XEHu8 HP H;P(s>HJHH 2,F4;E)IHIAt$HuH \H DH0HrHHlHH)H)H9 HDž HC8sfDL0MEHu/fHPIU(@0LC>L)D)HIIE(AwI;E0rLtuDAEDHJADEH0HH HP H;P( HrHp  fDHAd"AHV HZXHS@HHV @PڃH8\L=F0H HcPHdHPHE0f%HgLDHDH0HG(H;G0G H0HpHw( iLpHuyHgI|tU1?LpD)HA9McLKtDL)LMmHEhL)HxHBH@E1DMQH0HF(H;F0 H0HPHV(+ <DžsDždfDž DLc@D 0H0ELD L9wD@IHEI9DzfDHcHHzHx 2VFD5E)II$HsHuLhE1E\AD$ @6t$HH HP H;P( HrHp +Ift$(HHL$@HL$@HE(H;E0OHPHU(0AD$HU(H;U0HrAHu(AD$ uA|$0uD$X1HE(H;E0@t$PHPHU(AV@0D$ qAD$ eAD$DT$pE0HHHx H;x({LGL@ 7|$0DL$-EHH]Hx H;x(OLGL@ 7HD$`IA׍JLpLHLd$ I:fHP H;P(s?HzHx 2F|5IA)HHt8I$AuHuL/fLLd$ AD$ QAt$0CD$X7DD$HcHHEvH9}D|$XHL$(Ld$Pt$ HcD$ H\$HAI)IM)L9LNMLl$ IML|$HLd$(A-f.HxH}(@0ALE)H)ELeHHE(sH;E0rHufAD$pHE(H;E0*|$0HHHM(@0-HE(H;E0-HHDjHM(@0H\$HD$`IIHLd$ ELl$DHPHU(@0AE)EI9t'HHE(sH;E0rH%u Ld$ 6fDHE(H;E0HPHU(-Zf.LT$OHHKHP H;P(=HrHp  Ll$ Ld$(LDML0HHL$(DD$ HL$(DD$ L9BA;fD$ H(t$L HH ,dHDPAXf%HLDHDHH L dHXf%HݶLDH ʶHDTf=Eq`f= NW4fHE(H;E0HPHU(+fLLd$@LLl$ L+l$(MvL0HHL$(DD$ DD$ HL$(fHL$-LD$ H LD$ HL$@cHL$hfHHL$hüHL$hS0HHL$h螼HL$hPAD$pHHtHP Hx(t$PHHL$hVHL$hU?+|$0D$0a@wq"aDG0DGqЃ|$ OHcH9|$P9HHD$PdH HƃDjHL$+LD$ 1HL$ LD$ HZCLCtRMt&H=LHCH$Ht$dH34%(H[]Mtԋ;L$XHsH=SH&HSHIIH ݌H.:H5HE1耆LCH=ƳL-H$HCC>*H+H=H5VH=HHH=ct=~HHHyfDLƺH=<%HSHH ϋIHH5:HE1oH$DBH[H<JL`TLPT&fDLMt@SHLH=Tu [LTH[UHHHSH=/t=1]?]fDH=ATIUHStxH5H=JHFHH{Ht{u>HCHSHsILH{1҉HCHS[]A\#S뻐HuH=H5 H=nuzHHVH=t=6HH5 YHHtfDHCHW0H[HCH8[Hs1[&@Hs[&H@H{[HCHHPH[Ð1HPu$HSH[H o111艦f fH8dH%(HD$(1H|$H=t$HHT$H $HT$(dH3%(uH8sSH?uIHW wHHHL QDTHHDH51$ HCXZ[H 11觥H8dH%(HD$(1H<$H=mHt$HT$HL$ 7A1EuH|$sH|$HD$HT$(dH3%(uH8f.AT11US]Ht[]A\HH5dD#Ht[]A\)fHHHdD#Hu[H5]H=A\HHgHEfATSHL'MtHLrL8tHHHL[A\DHHL[A\fffff.HIH H1HHff.t( Ht Ht HH uHBff.H t!H tH t H uHHHHH)f>udfof:c:IHcH#Io fAof8f:c)Hc9f:c:9IHcH #IofAof8f:c:)fo9vfAoHf:c:ȃf[oR1DHf:crDHf:csHcHH)f.I@f.~!HLεH HH!H9u#H@LH!HHLELff.H=w@HdH@'@HH+HH? HHHHHHHHH;s HfBff.AUATIUSHHmdH%(H$1HHHAHt61H5M,1H5G-HH-HH$HL%D-DŽ$HD$ HD$ fHHH9uH迿HD$HA@BAH>HHD$foD$)$MH$dH3 %(uXH[]A\A]Ht1H5Lx 1ҿH56H뜸DSIHvHHGhHxIH@LIBpIpIH@HH HIHIHT$HÃBMMt,I@H%H @ILȸEHELDd %L\$ALIjPHL-Id%Y^u8HT$1HtMtIHBR tduHH[Ð1d%udH<%E1HfDd%DfH PH5H=ff.fAUATULSHH0HgIHHHËC%HHGhLAHPHvIHpHGpHH@H LIJHD$@LMt,Ip NH4IHLApLDd4%DLL\$jQHAILLL+Id%ZYHT$E1Ht 1MtIHBIB< |uL+C fDL+HELLJoHL[]A\A]@IHI[]LA\A]Lh@L/< ufDAIyDd%f.1d%dH<%E1HH H5H=}ff.AWAVAUATUHSHHKHPH41HH<HЃH9uLe0L-OHH$LHHLD$I_Id%LDK䋝HIDDpLB0HrH= 1L`2fA|L$IH=L$HHt8I0DL$H L$IEp1W[IGHE8H 1ҿ H0T@ATSHH=etKL%HMt<@I9$Hw$I9$PvA$@u)HL~'uMd$MuE1HL[A\fI|$0u HL[A\H H5H=ff.AWAVAUATIUSHh@H=ѠIHEMt H=B]HHCHHT$ Ll$PIH$H5LLd$ l$(L|$0HD$8H\$@Dt$HHD$XYAaH|$Ht$@1@H=&t H=HD$8Hh[]A\A]A^A_@H=t H=oH 1Lt@H 1LZf.H|$8HttF Ht$@18Pu9H=yt H= 1LD讖fDH ygH5H=nHH 1ҿ賖H DpH5H=9@AVIAUAATUSHwHW0>uHH0HHHD1H=ǟ[]IHIcL%mH<H,fD1DH=]IH(BtI1HHHp>uHH0HID1H=W|]IH(9Zw1H=&HAV]IH<(l[H=]1A\A]A^~\H=1p\ff.U$HAWAVAUATSHHHL7GLErH!H{L=IHMDL{ Iu M|$0L{ L1DELK 1ɺLLA HCIH!EE@AIHADE111LE1A\BAuOAE9v;IDHHx(Hu11ABTE9wfHs 1@LkE̋gƁuȅL1HP(H@HuHHeE1HHH)LIHP(u DAIH@Hu11DLpAEM4Et+DmI>1DH4LII9uAEE1AՅuAfDE1uI0 ]AAD9IDLA uIHH4I1@LH9tLqJHuHIH9 JHIIH RDLu:HK8HS0Ls(PE_@!HeHe[A\A]A^A_]fD}tHHHqD9wAE9wIDL$A$f%f=uI$0tA$LyA$tH H5`H= %ECL{ I/LI*H@LLElLEEAE9EDfDEH H5H=g LpE1M`H'HELI9JHMLELMHUlLELMHUHMHMIM9t'LHUHMLEnLEHUHMIHEI`@EtAuLHs 1ppH H5H=K6 fD1LMH5eWVHuH4HHHMLELMHu2LMLEHHuHMHH t1ҿ H5謎@AIW0H=v1IwUIW0IwH=W1Uff.UHHSH)HHHH9r&HvHtmHuKH}HYDHHHPHt$H9PH5,H@HVHPH9=tH[]utH HHSHHHEH)@H4:HHHH|uH9wH1[]H5H PH5MH=cXH ;H5.H=29fHUHAWAVAUATSH@uHpVủHH!HHH9D*EHpH 3HEHv0HHuHHt HHH4HuHEHxDhIEMHHH)IH)JHHHH)Ā}HetHpHEHH HM1fDHHAH@HuA9i 1LL1LHE IHu1$LMA9Hcǀ<uH HUH#L9CAHǁHtHPH@Hu<DA9v@A<uAHD@9ANHBHH[HctyH TH5єH=2[@_ He[A\A]A^A_]fDEE12A9vDA<uAA9xLA;MTIctyH H5-H==8HXHA<A9hHMDHL)HdH} EE1LeLmEMEEED}f A t:<IH8IHt IHBAA <Ẽ]E9F؉]ID9eHEDN4M;n0AHuƒB<&LuIMA1IH$IrMHE1H0L;p $tHHAHtI9uHHIHuEI`HEIcHEIL9O1$DHtHHKD 1HHHt3L K I9t $uHHHKD HVHuHML9ULeEEƈEHEIIHtt IdžE9FI]D9eD}D}Le=HxfDLxI I6H@LHPL<։]LIHHI9u]zIHPDEH<LXH`HhHE*HhDEHH`ILXHPLH 1ҿ H5ɐSHIdžAdžIvLH=b1'MIHu/MAIH?^DEBHyPH<HuVHMHAIIIH8AHEHxEHu1^@HE>M d%2H=st H= uA9HMEoEIA)HEL4IDHEIfDHII9;uM&A$ƒnI$0E}t=H=ӌt HHmHEH@HHH=t HHFLN }gIT$ H:ID$-HBHtHP I$.I$@Htm.I$`.i@rI|$I.M|$8fMtLMGu(.MuI$.I$I$`H9t-A$I$ Ht-I$Ht-LHI-I9wH=t H=}t0H;HH0RHEH9?u HEH2HEH8HE@I$2-@HMHQPH@HHH H9'HxtL;`uH@HiXIT$0It$H=Ⱦ1YIqH5eHtI$P1҉I$HuHP@uHrHuHtZH9tUHuHI+$0H9uH H9"H9u@uH;E!HEHUDHI+$0H}Huu@uHE1pHpH=Hp1]HHHr|HEHpVH>D@LNA tuȅuFUu }uHHH8HHHHHHH|+HHugM9t11LA u9tANσH9w܉YHxwH]HH;ESHEHDCH pH5H=.H Q H5ΉH=HEH@@LHujH}HdHuHEEHUH5EH H5ZH=eDHEEȈEH}rEHEH %H5H= H=cH= H EH5ˆH=xH &H5H=FfDH5<GݥH mH5cH=шnff.H=UHt H='But/1HH=}tH=]fD]fDH=Xt H=ϘHuH 11}fDUHAWAVAUATSHxH}uHpMǃH1E1HHHhAHBHHH)HH})HMCMEEHEH1HxADHEN PA}fEfAHEJDAD;l$ \$(D|$.Dd$/Ht$H|$HuH HLHIHL)HLHHtcI9~I1I9tHHIHHLHH9wuH9vHL)HLsILLN1LHrLVHvHGMLILOff.LLF1LLNHvHrADMLLML^LGMLFLOMLNLWHHHsMLMLGILOffff.Ѓu"LL^1LLFHvHHs(L1LHrLVL^HvHsILu4LLN1LHrLVHvH>MLILO@LLF1LLNHv HrADMLVLMLLGMLFLOMLNLWH H HsMLMLGILOffff.UIHAWAVIAUIATSLHXH}dH%(HE1IvMu)H]dH3%(He[A\A]A^A_]H H{8HHM~fHHH9u1ZfLLeLHHLMLxLL)HD$HIHE<MLMLI)MO$L9L)L]L|$LMILuILKMHEHHEfLEHULLLHHLL3H}H]1HSH@HHHuI~HHHHHBHHuM)LmM9~ML]ILMLLuMHELHDRH}LMLMHMNJLyH HMaH]L!IIIL9}I $HvLLL3DHEI~HH9.1f.H H HH9 f.H9HHfLLLLo2Uf.L}MLLHL]LLUHLLL/2L]LUILLO LHPIIMHuYH9IzI1H4H4HL9uVf.HHHHHAHuIu)HHM1fDITHHI9u1 f.SM1HHHILHt2tYBIuHJtJ|IM11IJIbJ4J|IM1IHYJtJ|IHIWJtJ|IM11IJDI\NIJIAHNLIHJDHNDHIJDHJ\ALIJDMIHIxNILNLLH[AWIAVAUATIUHSHHH HHJM~HHH9u1N,N4+HII~EHtAJ+HHI9t HMHvLLHH0fDH[]A\A]A^A_ÐLLHHo/DLmM_1DIHHI9uBfAWAVIAUIATULSHHHH4$HT$t|HYHHT$H4$HL|$L$$IlHHI Lu/LLHIHIHMDI Q/KDHH[]A\A]A^A_DIHT$L$IJHHD$IHHT$L<HD$(I.HT$LLLLT$ LT$ H4$LLLT$ 5LT$ LEH$LL6 D$ Ht$H|$LHL$MT LHt$HT$LLT$t$ LT$ILLLHLT$FMLT$~1f.IIHI9K&LLLM\LT$8LL\$0;-L\$0LT$8HD$D$ LLLHL\$0LT$ EHt$LT$ L\$0H)Ht$IHT$H4$LHL\$ LT$(LT$(LHLLL$,HD$L$L\$ M~HDIDHI9HT$LLLHg,HIHII1!fDI|HWITHHL9uLLLLT$ LT$ HLD$(HT$LHH4$L\$ ILT$0LT$0LHLLL$+HD$L$L\$ IIIL$1"I|HWITHHH9uLLLHL\$0LT$ 5+HD$L\$0HD$LT$ .@HD$(LLLHLT$LDLT$rfDHT$Ht$LLT$LT$!H4$LLD$ @IIff.@AWAVIAUIATUSHHHHHHM~fDHHH9u1N<JInHO$>I >fDtAHJ;HI9t HMHvLLH*fDH[]A\A]A^A_ÐLLHH)DCpfDH_1I H HI9uBfAWAVIAUIATUHSHH8H$tyHZHHL$LHO,&IIML)L<$LLIHHLMLDIMI)JDH8[]A\A]A^A_H$IHIHD$LJ HL$L<ILLLLLD$LD$LLLLD$LD$LLLHLD$LD$ILHLMLD$HD$L|1fDIIHI9H$LLLLD$ LL\LL\$('H $LLLHD$Ht$LD$ L\$(H)IHt$gHL$LLLLD$(LL\$ H $LLLn'HD$L\$ LD$(t II[IDHDHI9HT$LLLLD$L"'LD$H2IHI"L4$1I#I|HWITHHL9uLLLLD$5LD$(H hH$LLLLD$ LL\LL\$(q&Ht$H $LHD$L|5LLH|$LD$ L\$(H)H|$LLLLD$ L\$H $LLL&HD$L\$LD$ t2IIs*IL$1DItHVITHHuH9uMsfDHD$LHLIL0LD$tfDLLLHLD$LD$#UIHHdH%(HE1H9tMH~7HHHH)LD$IHEdH3%(uMf.fH HrHLHHH)HL$HaJf.M1LLHtHTH|HكtH|tIOIMMHI.I\IMMBMLWLDLLMLTLTL\MLDLDLLMLTLLMLHISUHHHLH|H4Hr$LHDH*HHLHL HHLHL HLHDH*E@HM)LHMLTLL HHM)LHDILLTH*IHxHM)MLWHLM)HLHLWI)LWH][DfH~fH~H?1fH~HH4H!H0 H7uHu%fH4H7fHθH? )HH7I|$Ht$|$D$Ht$D$H%-?HI0fuHu,HufufDH?HtHH?HI)ȉÐHI)D$IHL$foL$Ht$HH?AHȉH0%-?fH H7H fHGfuHu!Hu\H0HGÐHu;HH?A~kHHHHwѿD)f.L@II?AD)IDHHL H7HGD)I)IH1HLWH7@SwuEHWHH?H:7L DHHDH5ҏ1HCXZ[úH5`H=SN111HUUDH8dH%(HD$(1H<$H=]t$HHT$A1EuH|$(SH|$>HD$HL$(dH3 %(uH8?ffffff.gHHH=yHf.SHHWHwH?8HC[fATH0dH%(HD$(1H=\HT$H<$Ht$t H=o2HH=HDD$H=n\It H=nHD$(dH3%(u H0LA\>fffff.SHHOHWHwH?tHC [ff.ATH0dH%(HD$(1H=[H<$Ht$HL$HT$t H=Bn]HH=HDD$ H=[It H= n(HD$(dH3%(u H0LA\if&H=sHdHff.H7⟃ HHtYATLgUHSHrHZHt `t HsHHuI)LH[]A\@LM$f.ff.@SHH?KHsDC LO0ƒD HC [DUBH@HHAWHAVHAUATSH0H)HPLL$DIhII IyMAIIA B4@GLAHH@HHILAHAA AD9uBMqHD@IHXHXHDžH@HHHHdHdL(LH(MM%E1I~HIIDžhMtlhID|XH=IH L0L<LHxL臽hLLIHHDLH=ȁ1 H;LG5D4L(8wDžh)H Ӏ1L1wCHPH 1ҿ HpYCH ҬH5NH=p:IvH 1ҿ#CH H5bNH=oH }H5CNH=FNAuE1Hp1D{BH D)H5 NH=q謽H m1L1BHH;tHPH 1ҿ HpfBH 1L1SBHPH 1ҿ Hp5BDAVAUIATIUSHHwHHtr{}H@LHLHHt;HHHXHRHt!BLtfDLLHI9u[]A\A]A^@HHttt.1H=LfHHr\:HCH0H;HHDff.AWAVIAUIATIUSHH@LHH=HHtMuUAXt8HfIH<u LL_HHuH[]A\A]A^A_MIEtuVIHCAWHXL<HLLHI9ubDuH׃5Iv>uHBH0HL:HHDH=_K1vfDAWAVAUATUSHHGht$DT$@H0LhHH`HpHD$HH|$8HH@HEE1f8HD$ L,$HD$ H=ZD`HE0L$$HHHHufH[HHL(tL$@HD$ H\$Hl$D`IAD$El$L,$A$fD$HD$Lp(HD$Hh}uHcAH(H 9HHDIFhLX+IpHHPH$If:u?Lt$(MMHl$0LAHD;kC#Hf;tLt$(HD$c:1Ht$c @IvH>uH@H0HV8HHDHl$pH}1HM+HIH1|=@C H4LgcMAD$%A9DBAD$ MIE1H|$8HĘ1[]A\A]A^A_ËtKE1AD;s6HDLHH45tHHHH H5HH=HT$D6IvI>uHw?H0HHl$pLH|1H*DIVIN0:2HD$ILL\$(H={LH01}L\$(H|$8L,$t1HD$8HPHU HB%A9DBBuEAH|HHHZHH@H8HD$HH#HxH}WHHBAAfD9v/f%DH IH ΉA BDALHGLHAB uG HH=HH5HHDHl$H|$ G HH|$ IMHl$0Lt$(D$D$DKIvMI>uH=H0HuHl$pLHz1H,(HD$8H,H@HEH@u,H Px HRHLzH HBPuB D$c81Ht$c =HuH>t"Hl$pHx1Hz'11H9H<H0HI4HHDIvMI>uHv<H0H 4HHDHl$pL1HyH'Hu>uH7<H0H3HHDHl$pHyH*& XH53H yXH5DH=D5H53ffAUATUSHHtUHAE1 H[Ht*uHDH[A HuHD[]A\A]HE1[D]A\A]SHH7E1ɋCHW(HHjPLCHXZ[ff.fAVIAUEATIHUHSHHpdH%(HD$h1HD$ԞHHHD5SMItwHT$jE1MAUI$LHHXYHL$1HtHtHQHA H\$hdH3%(\Hp[]A\A]A^H95 SHtt@HHHuHT$VHjHE1Md^_Hjf.d%uTAHHT$jAUfDYHtH9Hw H9PuH >w1116AHD$Hl$8Ht$0Lt$@Dl$HHD$Xd%Hl$HT$0H5H6A1d%u!dH<%E1HH|$HT$0u1HD5裆IH(HdH%(HD$1EL$D$ MAHAHILȄtiHHAHtYHHAHtIHMHHAHt5DHIHHHH1A u%E1HD$HD$HT$dH3%(uH(A襅DA1ffffff.M1LLHtHTH|HكtH|tIOIMMHI.I\IMMBMLWLDLLMLTLTL\MLDLDLLMLTLLMLHISUHHHLH|H4Hr$LHDH*HHLHL HHLHL HLHDH*E@HMLHMLTLL HHMLHDILLTH*IHxHMMLWHLMHLHLWILWH][DH8)$)L$\$,HD$HT$HH $H|$IH0I!H!H0%u?MI AHH$Dg#H$H8f.HuCIE1I AEH=usL tnH/I@ADH=LH H1Hu#H E11EEH8HDE1II tH=HHafHt1HuH tHIt)HtPfDADE1HE1H 1L tH tE1GAVUSH0)$)L$\$,HD$H$HHt$IIH?IHD$I0I!HH!H?H0Au`LH AHL1H HII  1HugfEH0[]A^fDHu[HE1H AEILH uNH HuHH t I9IHHILE1H tAH$Dg:H$H0[]A^DE1HHE1LH A1EH HfDHH uLH ۅPHHM#f.Ht'E1 HH 'HH tE1I9~Hul@nI9H9vI9r H9stMHIE(1!@tf^D$@tt$fL$d$؛@tq^aD$@tt$fL$d$؛@tt$fL$d$؛ t,^(D$Ð@tzHp<0t]w< u/HH rf.<@u,HHqū` fLHBMtpHDI@x(MHHBHLH@LDMMHDDHBfDDHBLcHBLHBrHE11DHMAIM ExEfDHE11DHMAIM Ex?A@IIM ff.AWAVAUATUSHhHL$L$D$uufDHh[]A\A]A^A_@L<$LgoHHt1Mt LgoHD$0LkDH4$DLHL$8DHIAEIuD$X<U11HHЃHH DŽxHH|$HLf11ɈD$YA4$IHHH @xLHt$H|$PH<$gn|$HHL9d$PL|$Lt$ Ll$(fDl$Y1LLH*l$Y1IĉLLH Dd$Y1HDfDLHHIfIA|$xHD$HD$0H9IHD$ H9w/L9d$Pd/HD$8HD$HHD$(HHD$8IH$HT$1Hgl1ҾHglLHglmUSHH-GnHt@HHEH}H)nH9t7H}.H&H-nHuH=3H$<H9tH5H=]pH-]H]Ht HHmH-]HuH[]ÐUSHH-^Hu 3HH}Ht/H}H]rHjHuH[]fffff.ATIHUSHH9t]I|$xtM1H}Ht豤HI9\$xv.IT$pH[H,H}H}HGHwI|$pH=^0t I$7I|$ AD$t$I<$It$d[L]A\f.I<$w[L]A\kff.SHdaeaHt'H4HH6aHu[ffffff.AUIATUSHHHWtO11HH~2H8t,L`@IdL3$%0MtL行I}HAIUHHhI9mwHt/HzIEH@HIUHHxzI}qHL[]A\A]_ff.@SHH HtH{0Ht fDHtHH[(HG8/uHu[H>H=iHt H5mH=iHtuH=naHtH5HymfHff.H=]iHtH4H9t oaH=au#HtH5abf.#UHHHt!H]HH=`H5lH`HDAVHgAUATIUSHcH,H9tKH)L-HH<tHV)ITHHtHL5I|L9t lMtHu0HH}Ht I9tJ:H}H]=H5Hu[]A\A]A^H=-StHHCdHH0"H=,tHH1dHH0H=,tHH4 dHH0H=,tHH dHH0H=,tHH" dHH0H=a,tHH9 dHH0XH=@,tHHdHH0/H=,tHHGdHH0H=+tHH dHH0H=+tHH5 dHH0H=+tHH dHH0H=+tHH dHH0bH=FHH9t HF[ ffff.ATL%3^USMtW@L1M$$H}@HHtH|HtHG HtH| uHMuH^H]HtNHg^H9uGs H;Hi^^H[Ht#HH[H}u ^H5Hu[]A\H tH5JH=Q茜fff.H3KH5H=]hH]HSHHH?Ht=Ht0H;H7Ht31HH9tHHH|t1H[D$gHD$H[DUSHH_dH;xdtfDHH%H9^duH=;tfH- <HtPfDHE8HXH@HtHH[GuHuuRHDžHmHuH=;uBHMdHxH=%dHdH[]HlHs; 5;9HuH!;H8HHX;;fH=%cHtOU1SHH/HtHHHuH=bHHuH[]HH?@@vector::_M_realloc_insert0123456789std::bad_allocstd::bad_caststd::bad_typeidstd::exceptionstd::bad_exceptionpure virtual method called terminate called recursively ' what(): basic_string::copybasic_string::comparebasic_string::_S_createbasic_string::erasebasic_string::_M_replace_auxbasic_string::insertbasic_string::replacebasic_string::assignbasic_string::appendbasic_string::resizebasic_string::basic_stringbasic_string::substr/dev/urandomdefault/dev/randomrbmt19937basic_string::_M_createbasic_string::_M_replacestring::string(anonymous namespace)string literalstdautodecltype(auto)[abi:::{default arg#%d}::JArray[]auto:vtable for VTT for construction vtable for -in-typeinfo for typeinfo name for typeinfo fn for non-virtual thunk to virtual thunk to covariant return thunk to java Class for guard variable for TLS init function for TLS wrapper function for reference temporary # for hidden alias for transaction clone for non-transaction clone for _Sat _Fract_Accum, operatoroperator >(qu : new ulllullfalsetruejava resource decltype (...{parm#thisglobal constructors keyed to global destructors keyed to {lambda()#{unnamed type# [clone restrict volatile const transaction_safe noexcept throw&&complex imaginary ::* __vector( ((......)_GLOBAL_std::allocatorallocatorstd::basic_stringbasic_stringstd::stringstd::istreambasic_istreamstd::ostreambasic_ostreamstd::iostreambasic_iostreamaN&=aS=aaad&anatalignof azccconst_castcl()cm,co~dV/=dadelete[] dcdynamic_castde*dldelete ds.*dt.dv/eO^=eo^eq==fLfRflfrge>=gsgt>ixlS<<=le<=lioperator"" ls<<lt<mI-=mL*=mi-mlmm--nanew[]ne!=ngnt!nwnewoR|=oo||or|pL+=pl+pm->*pp++pspt->?rM%=rS>>=rcreinterpret_castrm%rs>>sPsizeof...sZscstatic_caststsizeof sztrthrowtwthrow signed charboolbooleancharbytedoublelong doublefloat__float128unsigned charintunsigned intunsignedlongunsigned long__int128unsigned __int128shortunsigned shortvoidwchar_tlong longunsigned long longdecimal32decimal64decimal128halfchar8_tchar16_tchar32_tdecltype(nullptr)xeon_phihaswell../csu/libc-start.cFATAL: kernel too old /dev/full/dev/null: %sOUTPUT_CHARSETcharset= %s/%sLANGUAGEPOSIXodiluldulolXlxXxIrce/usr/share/localeplural=nplurals=cxa_atexit.cl != NULLfunc != NULLwfileops.cstatus == __codecvt_partialLIBC_FATAL_STDERR_/dev/tty,ccs=fileops.cfcts.towc_nsteps == 1fcts.tomb_nsteps == 1strops.coffset >= oldendarena.cresult->attached_threads == 0%s malloc: top chunk is corruptmalloc.cchunk_is_mmapped (p)aligned_OK (chunk2mem (p))prev_size (p) == offsetcorrupted size vs. prev_sizecorrupted double-linked listp->attached_threads == 0 free(): invalid pointerfree(): invalid sizetc_idx < TCACHE_MAX_BINSinvalid fastbin entry (free)heap->ar_ptr == avcorrection >= 0chunk_main_arena (bck->bk)chunk_main_arena (fwd)tcache->entries[tc_idx] > 0bit != 0malloc(): corrupted top sizerealloc(): invalid old size!chunk_is_mmapped (oldp)realloc(): invalid next sizerealloc(): invalid pointera->attached_threads > 0nclears >= 3Arena %d: system bytes = %10u in use bytes = %10u Total (incl. mmap): max mmap regions = %10u max mmap bytes = %10lu mtrim../sysdeps/x86/cacheinfo.c! "cannot happen"offset == 2TRANSLITINTERNALANSI_X3.4-1968//TRANSLITmbsrtowcs_l.cresult > 0__mbsinit (data.__statep)/usr/lib/getconfGETCONF_DIR/proc/sys/kernel/ngroups_maxILP32_OFF32ILP32_OFFBIG/proc/sys/kernel/rtsig-max..GLRO(dl_pagesize) != 0*cp <= *re/proc/stat/proc/cpuinfoprocessor/sys/devices/system/cpucpubuffer overflow detectedstack smashing detected*** %s ***: %s terminated GLIBC_TUNABLES/etc/suid-debugglibc.malloc.trim_thresholdMALLOC_TRIM_THRESHOLD_glibc.malloc.perturbMALLOC_PERTURB_glibc.elision.triesglibc.elision.enableglibc.elision.skip_lock_busyglibc.malloc.top_padMALLOC_TOP_PAD_glibc.cpu.x86_shstkglibc.cpu.hwcap_maskLD_HWCAP_MASKglibc.malloc.mmap_maxMALLOC_MMAP_MAX_glibc.cpu.x86_ibtglibc.cpu.hwcapsglibc.malloc.arena_maxMALLOC_ARENA_MAXglibc.malloc.mmap_thresholdMALLOC_MMAP_THRESHOLD_glibc.cpu.x86_data_cache_sizeglibc.malloc.tcache_countglibc.malloc.arena_testMALLOC_ARENA_TESTglibc.malloc.tcache_maxglibc.malloc.checkMALLOC_CHECK_LD_WARNsetup-vdso.hph->p_type != PT_TLSget-dynamic-info.hout of memory LD_LIBRARY_PATHLD_BIND_NOWLD_BIND_NOTLD_DYNAMIC_WEAKLD_PROFILE_OUTPUTLD_ASSUME_KERNELAVXCX8FMAHTTIBTRTMAVX2BMI1BMI2CMOVERMSFMA4SSE2I586I686LZCNTMOVBESHSTKSSSE3POPCNTSSE4_1SSE4_2AVX512FOSXSAVEAVX512CDAVX512BWAVX512DQAVX512ERAVX512PFAVX512VLAVX_UsableFMA_UsableAVX2_UsableFMA4_UsableSlow_SSE4_2XSAVEC_UsableAVX512F_UsableAVX512DQ_UsablePrefer_No_AVX512Fast_Copy_BackwardFast_Unaligned_LoadFast_Unaligned_CopyPrefer_No_VZEROUPPERPrefer_MAP_32BIT_EXECAVX_Fast_Unaligned_LoadMathVec_Prefer_No_AVX512Prefer_PMINUB_for_stringopSlow_BSFPrefer_ERMSFast_Rep_StringPrefer_FSRMonoffpermissive/proc/sys/kernel/osreleaseLINUX_2.6__vdso_clock_gettime__vdso_getcpuIGNOREgconv.cirreversible != NULLgconv_db.cstep->__end_fct == NULLgconv_conf.cresult == NULL:elem != NULLcwd != NULLaliasmoduleISO-10646/UCS4/=INTERNAL->ucs4=ucs4->INTERNALUCS-4LE//=INTERNAL->ucs4le=ucs4le->INTERNALISO-10646/UTF8/=INTERNAL->utf8=utf8->INTERNALISO-10646/UCS2/=ucs2->INTERNAL=INTERNAL->ucs2ANSI_X3.4-1968//=ascii->INTERNAL=INTERNAL->asciiUNICODEBIG//=ucs2reverse->INTERNAL=INTERNAL->ucs2reverse.sogconv_builtin.c../iconv/skeleton.coutbufstart == NULLinend - *inptrp < 4gconv_simple.c*outptrp + 4 > outend../iconv/loop.coutbuf == outerrch != 0xc0 && ch != 0xc1GCONV_PATHgconv_dl.cobj->counter > 0found->handle == NULLgconvgconv_initgconv_endLOCPATHLC_ALLLANGfindlocale.clocale_codeset != NULL/../loadlocale.ccategory == LC_CTYPEloadarchive.carchmapped == &headmap0123456789libcCto_outpunct(nil)vfprintf-internal.c__mbsinit (&mbstate)(null)iofwide.cUnknown error wcrtomb.cwcsrtombs.cdata.__outbuf[-1] == '\0'/proc/self/mapscannot allocate name recorddl-load.clastp != NULLfile too shortcannot read file dataELF file OS ABI invalidELF file ABI version invalidnonzero padding in e_identinternal errorinvalid ELF header:%s
    search path= (%s from file %s) (%s) trying file=%s cannot close file descriptorcannot stat shared objectcannot process note segmentcannot map zero-fill pagesr->r_state == RT_ADDORIGINPLATFORMLIBlibsystem search path:;nsid >= 0nsid < GL(dl_nns)RPATHRUNPATH wrong ELF class: ELFCLASS32dl-lookup.c (no version symbols), version protectednormalversion != NULLrelocation errorundefined symbol: %s%s%ssymbol lookup error [%s] (lazy) relocation processing: %s%s tlsdl-hwcaps.cm == cntcannot create capability listdl-misc.cniov < NIOVMAX! "invalid format specifier"%s: cannot open file: %s %s: cannot stat file: %s %s: cannot create file: %s %s: cannot map file: %s ../elf/dl-tls.clistp != NULLidx == 0dlopen/proc/self/exelinkval[0] == '/'/etc/ld.so.cache search cache=%s ld.so-1.7.0glibc-ld.so.cache1.1GLIBC_PRIVATE_dl_open_hook_dl_open_hook2%s: %s: %s%s%s%s%s DYNAMIC LINKER BUG!!!^[yY]^[nN]SunMonTueWedThuFriSatSundayMondayTuesdayWednesdayThursdayFridaySaturdayJanFebMarAprMayJunJulAugSepOctNovDecJanuaryFebruaryMarchAprilJuneJulyAugustSeptemberOctoberNovemberDecemberAMPM%a %b %e %H:%M:%S %Y%m/%d/%y%H:%M:%S%I:%M:%S %p%a %b %e %H:%M:%S %Z %Y%p%t%g%t%m%t%f+%c %a %lISO/IEC 14652 i18n FDCC-setKeld Simonsenkeld@dkuug.dk+45 3122-6543+45 3325-6543ISO1.01997-12-20NANINFnaninfSuccessOperation not permittedNo such file or directoryNo such processInterrupted system callInput/output errorNo such device or addressArgument list too longExec format errorBad file descriptorNo child processesCannot allocate memoryPermission deniedBad addressBlock device requiredDevice or resource busyFile existsInvalid cross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentToo many open files in systemToo many open filesText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeNumerical result out of rangeResource deadlock avoidedFile name too longNo locks availableFunction not implementedDirectory not emptyNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedInvalid exchangeInvalid request descriptorExchange fullNo anodeInvalid request codeInvalid slotBad font file formatDevice not a streamNo data availableTimer expiredOut of streams resourcesMachine is not on the networkPackage not installedObject is remoteLink has been severedAdvertise errorSrmount errorCommunication error on sendProtocol errorMultihop attemptedRFS specific errorBad messageName not unique on networkFile descriptor in bad stateRemote address changedStreams pipe errorToo many usersDestination address requiredMessage too longProtocol not availableProtocol not supportedSocket type not supportedOperation not supportedProtocol family not supportedAddress already in useNetwork is downNetwork is unreachableConnection reset by peerNo buffer space availableConnection timed outConnection refusedHost is downNo route to hostOperation already in progressOperation now in progressStale file handleStructure needs cleaningNot a XENIX named type fileNo XENIX semaphores availableIs a named type fileRemote I/O errorDisk quota exceededNo medium foundWrong medium typeOperation canceledRequired key not availableKey has expiredKey has been revokedKey was rejected by serviceOwner diedState not recoverableout of memory%s%s%s%s%s%s: %s_dlfcn_hookunsupported dlinfo requestinvalid namespaceUnknown error../elf/dl-runtime.ccannot extend global scopedl-open.cns == l->l_nsinvalid mode for dlopen()object=%s [%lu] scope %u: %s no scope mode & RTLD_NOLOADcannot create scope listimap->l_need_tls_init == 0dl-close.c! should_be_thereold_map->l_tls_modid == idxidx == nloadedimap->l_ns == nsid calling fini: %s [%lu] tmap->l_ns == nsiddlcloseimap->l_type == lt_loadednsid == LM_ID_BASEimap->l_prev != NULLshared object not openmprotect legacy bitmap failedlegacy bitmap isn't availableshadow stack isn't enabledcan't disable CETinvalid mode parameterdl-deps.ccnt <= nlist calling init: %s calling preinit: %s dl-version.cneeded != NULLdef_offset != 0version lookup error(J?\3&<\3&T㥛 ?YZ~{>*??UUUUUU?B/)?UUUUU?9kV?5UUUUU??-DT!?m0_?8CX!?pc`0_dAA࿸*UUUUUUſUUUUUſ5UUUUUz({zzzaaaaX{{{znot enough space for format expansion (Please submit full bug report at https://gcc.gnu.org/bugs@@@@@@@@@@@@@@@@[[[[[[[[[[[[[[[[ ZZZZZZZZZZZZZZZZGNUSt9bad_allocSt8bad_castSt10bad_typeid__gnu_cxx::__concurrence_lock_error__gnu_cxx::__concurrence_unlock_errordeleted virtual method called terminate called after throwing an instance of 'terminate called without an active exception %s: __pos (which is %zu) > this->size() (which is %zu)basic_string::at: __n (which is %zu) >= this->size() (which is %zu)basic_string::_S_construct null not validrandom_device::random_device(const std::string&)basic_string::_M_construct null not validtemplate parameter object for std::basic_string, std::allocator >std::basic_istream >std::basic_ostream >std::basic_iostream >__ehdr_start.e_phentsize == sizeof *GL(dl_phdr)Unexpected reloc type in static binary. FATAL: cannot determine kernel version cannot set %fs base address for thread-local storage%s%s%s:%u: %s%sAssertion `%s' failed. %nmessages/locale.alias__new_exitfnFatal error: glibc detected an invalid stdio handle %s%s%s:%u: %s%sAssertion `%s' failed. replaced_arena->attached_threads > 0munmap_chunk(): invalid pointermremap_chunk(): invalid pointercorrupted double-linked list (not small)malloc_consolidate(): invalid chunk sizecorrupted size vs. prev_size in fastbins free(): double free detected in tcache 2free(): invalid next size (fast)double free or corruption (fasttop)double free or corruption (top)double free or corruption (out)double free or corruption (!prev)free(): invalid next size (normal)corrupted size vs. prev_size while consolidatingfree(): corrupted unsorted chunkschunksize_nomask (p) == (0 | PREV_INUSE)new_size > 0 && new_size < (long) (2 * MINSIZE)new_size > 0 && new_size < HEAP_MAX_SIZE((unsigned long) ((char *) p + new_size) & (pagesz - 1)) == 0((char *) p + new_size) == ((char *) heap + heap->size)/proc/sys/vm/overcommit_memory((INTERNAL_SIZE_T) chunk2mem (mm) & MALLOC_ALIGN_MASK) == 0(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)(unsigned long) (old_size) < (unsigned long) (nb + MINSIZE)break adjusted to free malloc space((unsigned long) chunk2mem (brk) & MALLOC_ALIGN_MASK) == 0malloc(): memory corruption (fast)malloc(): smallbin double linked list corruptedmalloc(): invalid size (unsorted)malloc(): invalid next size (unsorted)malloc(): mismatching next->prev_size (unsorted)malloc(): unsorted double linked list corruptedmalloc(): invalid next->prev_inuse (unsorted)malloc(): largebin double linked list corrupted (nextsize)malloc(): largebin double linked list corrupted (bk)malloc(): corrupted unsorted chunks(unsigned long) (size) >= (unsigned long) (nb)malloc(): corrupted unsorted chunks 2newsize >= nb && (((unsigned long) (chunk2mem (p))) % alignment) == 0(unsigned long) (newsize) >= (unsigned long) (nb)!victim || chunk_is_mmapped (mem2chunk (victim)) || &main_arena == arena_for_chunk (mem2chunk (victim))!victim || chunk_is_mmapped (mem2chunk (victim)) || ar_ptr == arena_for_chunk (mem2chunk (victim))!p || chunk_is_mmapped (mem2chunk (p)) || &main_arena == arena_for_chunk (mem2chunk (p))!p || chunk_is_mmapped (mem2chunk (p)) || ar_ptr == arena_for_chunk (mem2chunk (p))!newp || chunk_is_mmapped (mem2chunk (newp)) || ar_ptr == arena_for_chunk (mem2chunk (newp))!mem || chunk_is_mmapped (mem2chunk (mem)) || av == arena_for_chunk (mem2chunk (mem))(char *) chunk2mem (p) + 4 * SIZE_SZ <= paligned_mem(char *) p + size > paligned_memmalloc_check_get_size: memory corruption__libc_calloc_mid_memalign__libc_reallocdetach_arenaget_free_list__libc_malloc_int_reallocmremap_chunkmunmap_chunkheap_trim_int_freesysmalloctcache_gettcache_put_int_malloc_int_memalignhandle_amd((wchar_t *) data.__outbuf)[-1] == L'\0'status == __GCONV_OK || status == __GCONV_EMPTY_INPUT || status == __GCONV_ILLEGAL_INPUT || status == __GCONV_INCOMPLETE_INPUT || status == __GCONV_FULL_OUTPUT__mbsrtowcs_l../sysdeps/unix/sysv/linux/getcwd.cerrno != ERANGE || buf != NULL || size != 0__getcwd../sysdeps/unix/sysv/linux/getpagesize.c__getpagesize../sysdeps/unix/sysv/linux/getsysstats.c/sys/devices/system/cpu/onlinenext_lineglibc.elision.skip_lock_after_retriesglibc.cpu.x86_shared_cache_sizeglibc.cpu.x86_non_temporal_thresholdglibc.elision.skip_trylock_internal_abortglibc.malloc.tcache_unsorted_limitglibc.elision.skip_lock_internal_abortglibc.pthread.mutex_spin_countinfo[DT_PLTREL]->d_un.d_val == DT_RELAinfo[DT_RELAENT]->d_un.d_val == sizeof (ElfW(Rela)) WARNING: Unsupported flag value(s) of 0x%x in DT_FLAGS_1. setup_vdso../sysdeps/unix/sysv/linux/x86_64/init-first.clinux26.hash == _dl_elf_hash (linux26.name)outbuf != NULL && *outbuf != NULL__gconvgconv-modules/usr/lib/gconvcnt < sizeof (map) / sizeof (map[0])(state->__count & 7) <= sizeof (state->__value)inptr - bytebuf > (state->__count & 7)inend != &bytebuf[MAX_NEEDED_INPUT]inend - inptr > (state->__count & ~7)inend - inptr <= sizeof (state->__value)nstatus == __GCONV_FULL_OUTPUT/usr/lib/gconv/gconv-modules.cache   headmap.len == archive_stat.st_sizeANSI_X3.4-1968(mode_flags & PRINTF_FORTIFY) != 0*** invalid %N$ use detected *** (unsigned int) done < (unsigned int) INT_MAX(size_t) done <= (size_t) INT_MAX*** %n in writable segment detected *** _IO_fwide__wcrtombdata.__outbuf != (unsigned char *) dst__wcsrtombscannot dynamically load executableonly ET_DYN and ET_EXEC can be loadedELF file version ident does not match current oneELF file data encoding not little-endianELF file version does not match current oneELF file's phentsize not the expected sizecannot allocate memory for program headercannot create shared object descriptorobject file has no dynamic sectionshared object cannot be dlopen()edcannot enable executable stack as shared object requiresobject file has no loadable segmentsELF load command address/offset not properly alignedELF load command alignment not page-alignedcannot change memory protectionsfailed to map segment from shared objectfile=%s [%lu]; generating link map false && "TLS not initialized in static application"type != ET_EXEC || l->l_type == lt_executable dynamic: 0x%0*lx base: 0x%0*lx size: 0x%0*Zx entry: 0x%0*lx phdr: 0x%0*lx phnum: %*u (l)->l_name[0] == '\0' || IS_RTLD (l)cannot create cache for search pathcannot create RUNPATH/RPATH copycannot create search path array file=%s [%lu]; needed by %s [%lu] file=%s [%lu]; dynamically loaded by %s [%lu] find library=%s [%lu]; searching cannot open shared object file_dl_map_object/usr/lib/version->filename == NULL || ! _dl_name_match_p (version->filename, map)symbol=%s; lookup in file=%s [%lu] version == NULL || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_GSCOPE_LOCK)) == 0symbol %s version %s not defined in file %s with link time reference%s file=%s [%lu]; needed by %s [%lu] (relocation dependency) binding file %s [%lu] to %s [%lu]: %s symbol `%s'(bitmask_nwords & (bitmask_nwords - 1)) == 0_dl_setup_hashcheck_matchcannot allocate memory in static TLS blockcannot make segment writable for relocationcannot restore segment prot after reloc%s: Symbol `%s' causes overflow in R_X86_64_32 relocation %s: Symbol `%s' causes overflow in R_X86_64_PC32 relocation %s: Symbol `%s' has different size in shared object, consider re-linking ../sysdeps/x86_64/dl-machine.hELFW(R_TYPE) (reloc->r_info) == R_X86_64_RELATIVE%s: Relink `%s' with `%s' for IFUNC symbol `%s' %s: out of memory to store relocation results for %s pid >= 0 && sizeof (pid_t) <= 4%s: file is no correct profile data file for `%s' Out of memory while initializing profiler cannot allocate memory for thread-local data: ABORT result <= GL(dl_tls_max_dtv_idx) + 1result == GL(dl_tls_max_dtv_idx) + 1listp->slotinfo[cnt].gen <= GL(dl_tls_generation)map->l_tls_modid == total + cntmap->l_tls_blocksize >= map->l_tls_initimage_size(size_t) map->l_tls_offset >= map->l_tls_blocksizecannot create TLS data structures../sysdeps/unix/sysv/linux/dl-origin.c_dl_get_originFatal error: length accounting in _dl_exception_create_format Fatal error: invalid format in exception string out of memoryerror while loading shared libraries%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%NISO/IEC JTC1/SC22/WG20 - internationalizationC/o Keld Simonsen, Skt. Jorgens Alle 8, DK-1615 Kobenhavn V../stdio-common/printf_fphex.c*decimal != '\0' && decimalwc != L'\0'__printf_fphexResource temporarily unavailableInappropriate ioctl for deviceNumerical argument out of domainToo many levels of symbolic linksValue too large for defined data typeCan not access a needed shared libraryAccessing a corrupted shared library.lib section in a.out corruptedAttempting to link in too many shared librariesCannot exec a shared library directlyInvalid or incomplete multibyte or wide characterInterrupted system call should be restartedSocket operation on non-socketProtocol wrong type for socketAddress family not supported by protocolCannot assign requested addressNetwork dropped connection on resetSoftware caused connection abortTransport endpoint is already connectedTransport endpoint is not connectedCannot send after transport endpoint shutdownToo many references: cannot spliceOperation not possible due to RF-killMemory page has hardware errorELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT_dl_fixup add %s [%lu] to global scope no more namespaces available for dlmopen()invalid target namespace in dlmopen()_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENTopening file=%s [%lu]; direct_opencount=%u _dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENTTLS generation counter wrapped! Please report this.dl_open_worker_dl_open closing file=%s; direct_opencount=%u (*lp)->l_idx >= 0 && (*lp)->l_idx < nloadedjmap->l_idx >= 0 && jmap->l_idx < nloadedimap->l_type == lt_loaded && (imap->l_flags_1 & DF_1_NODELETE) == 0 file=%s [%lu]; destroying link map TLS generation counter wrapped! Please report as described in . failed to mark legacy code regioncannot allocate dependency bufferDST not allowed in SUID/SGID programscannot load auxiliary `%s' because of empty dynamic string token substitution empty dynamic string token substitutionload auxiliary object=%s requested by file=%s cannot allocate dependency listmap->l_searchlist.r_list == NULLcannot allocate symbol search listFilters not supported with LD_TRACE_PRELINKINGmap->l_searchlist.r_list[0] == mapunsupported version %s of Verneed recordchecking for version `%s' in file %s [%lu] required by file %s [%lu] no version information available (required by %s)unsupported version %s of Verdef recordweak version `%s' not found (required by %s)version `%s' not found (required by %s)cannot allocate version reference tablematch_symbolRTLD_NEXT used in code not dynamically loadedN9__gnu_cxx24__concurrence_lock_errorEN9__gnu_cxx26__concurrence_unlock_errorESt9exceptionSt13bad_exceptionN10__cxxabiv115__forced_unwindEN10__cxxabiv119__foreign_exceptionEN10__cxxabiv120__si_class_type_infoESt9type_infoSt11logic_errorSt12domain_errorSt16invalid_argumentSt12length_errorSt12out_of_rangeSt13runtime_errorSt11range_errorSt14overflow_errorSt15underflow_error?N10__cxxabiv117__class_type_infoE       xxxxxxxxxxxxxxxxxxxxxxxxxxxxhhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*4444*EE444444444444444*44444444444444*4444*44444*E4444444444444**444***44**jS<Y x  a D 6    x x x x x x x x x x x x x x x x Mx x x x x a = D   $  I= f um}e`A@#@#.)P>=N=P*P)7485 849a9@"""p"p"p"p"p"p"p"%%p"p"1`: 96%5%$$.P-,H,0#++* 0#00#0###00;;32320#)(N(H'&p"*&p"p"RRzRaRQSepcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpccddcdd(eXee0fgHiXiipcpcpcpcfpchpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcXjpcHhgkkklllllk`m`m`mkkllllk`0_dA[A)5ACAnA@lhA'bA@PA`,oA`{eA6hA7BAtPA lAuGAC2jA`oA)d?( v<R?}=Y :nT/6R>?N3tOa ?e>b<>ݸ?8Ua<ͧä?<K&3?,0 ~<)?Xz9s?F5B&?W 6T_?/< = ?k#x?6g~-U:? N+t<(P?+ȀnBvUq?ζK1fY?5mwdTv@@>?e?7KC6bο? 9p<K?aw4< 4?P;1Z|1?ˉ0`~)f}rP?+Հ<2?BzRl? *P??l/8~傚?19<@?~ua<.J?:+d<gw?&X=M^ }Ɵ ?b4^Hjd?b[?#Yѳz?P3?łKt?}c<1?ctJ]A?H?_=ey!,?$Uݎxvo?%4dP @06--66-----6-----6-66---------------------------------------__libc_start_mainUnexpected error. /usr/share/locale$ )-$__internal_atexit_IO_wfile_underflow_IO_new_file_fopenenlarge_userbufremove_from_free_list__malloc_arena_thread_freeresintel_check_wordelf_get_dynamic_info__vdso_platform_setup__gconv_release_step__gconv_get_path__gconv_get_builtin_transinternal_ucs2_loop_singleucs2_internal_loop_singleutf8_internal_loop_singleinternal_utf8_loop_singleinternal_ascii_loop_singleucs4le_internal_loopdo_release_shlib__gconv_find_shlib_nl_find_locale/usr/lib/locale_nl_intern_locale_data_nl_archive_subfreeres_nl_load_locale_from_archive/usr/lib/locale/locale-archiveprintf_positional__vfprintf_internal__vfwprintf_internal0000000000000000 _dl_map_object_from_fdadd_name_to_objectexpand_dynamic_string_token_dl_lookup_symbol_xelf_machine_rela_relative_dl_important_hwcaps_dl_debug_vdprintf_dl_add_to_slotinfo_dl_allocate_tls_init_dl_next_tls_modid_dl_profile_fixup_dl_find_dso_for_objectremove_slotinfo_dl_close_worker_dl_map_object_deps_dl_check_map_versions5~n^N> uYuYVUVEVhThThThTsUWVoVWWWWWWWWWWWWWWWWWWWWWWWWWWWW|WWWWXZXWXWX"W"W"W"W"W"W"W"W"W"WWW;XXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW|W                       7s:d:::::::|::::::::::YtNO4O$NNNNN$NM`acHdefhHijkmHnopr_Hwhxyz{|~(HhȄv8(xXȮ8hظHX8(xhXxh: XH8})yyy )Yv^^^~>_CCCc#H(((HhX8H(h(HxXXXhHhH(h((XXXhH8H8(xh  X hXH8 ( x 9x;X=8?ACEG9h;H=(?ABDF9H;(=?@BDFh9(;=>@BDF89:<>@xBxDxF9:<>h@8B8D8F8:h(@ACE8H:(<>?ACEH8:;=?xAxCxE89;h=X?(A(C(E#h$%'X()*H,-.8012(4x5 #$(&x'(*h+,.X/01H345Vmshsrrrq8qpXpoxoon(nmNmsNsrnrqqqp>po^on~nnmDmsDsrdrqqqp4poTontnnm:ms:srZrqzq qp*poJonjnmm0ms0srPrqpqqp po@on`nmm&ms&srFrqfqpppo6onVnmvmmssrΓtt$DԖd4ējڙj:ʖZz *`Й`0Pp VƙVv&F֕fLLܘl<̕\| BBҘb2•Rr88ȘXx(Hؔh(h؏X؎X؍X،X؋XȊ8ĐD44444:***** z 0 p&f |\rRxxxxxh؉H؈xhhhhhXȉ8kl8no8qr8tu8wx8z{8}~8k8mn8pq8st8vw8yz8|}888HXhxȱسHHHHHHHHHHHHHHHȿH(hH(hH8(x h  X8UUUUUUUVV(V8VHVXVhVxVVVVVVVW(WHWhWWWWWX(XHXH[X[h[x[[[[[[[\(\H\h\\\\\\](]H]h]]]]]^(^H^h^^ 8HpxȘ ƗƗƗėƗėėݘė֘ϘȘ||||ǘ  @     @ @@@`!@"@ #@ %@ )@ @,@0@9@:@;@<@=@>@?@A B C D E  F@ @G@ H @0I@@J @ `K@ L @ M@ N@``@@f@ g@@h@x@y@z@{@|@}@ @@     @@@ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ H.f HXXXXXXXXXXXXXXHHHrX|HHH>>4xʦXXXHHXXHHHHHHHHHHHHHXXHXXXXXXʧ֧ \HXXH( ʦ(ʦ4HRHԦHXXHHHXHHHHHHHHHHHHHHHXXHHXHHHHXHHHHHHHHHHHԦHHHHHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXXԦHxHHHHH @@@@@pP(@@@@@0X@@@@@@0/var/tmp/var/profileGCONV_PATHGETCONF_DIRHOSTALIASESLD_AUDITLD_DEBUGLD_DEBUG_OUTPUTLD_DYNAMIC_WEAKLD_HWCAP_MASKLD_LIBRARY_PATHLD_ORIGIN_PATHLD_PRELOADLD_PROFILELD_SHOW_AUXVLD_USE_LOAD_BIASLOCALDOMAINLOCPATHMALLOC_TRACENIS_PATHNLSPATHRESOLV_HOST_CONFRES_OPTIONSTMPDIRTZDIRLD_PREFER_MAP_32BIT_EXECi586i686haswellxeon_phisse2x86_64avx512_1c.Ti*g"ooHHDHMHH?UCS4//ISO-10646/UCS4/UCS-4//ISO-10646/UCS4/UCS-4BE//ISO-10646/UCS4/CSUCS4//ISO-10646/UCS4/ISO-10646//ISO-10646/UCS4/10646-1:1993//ISO-10646/UCS4/10646-1:1993/UCS4/ISO-10646/UCS4/OSF00010104//ISO-10646/UCS4/OSF00010105//ISO-10646/UCS4/OSF00010106//ISO-10646/UCS4/WCHAR_T//INTERNALUTF8//ISO-10646/UTF8/UTF-8//ISO-10646/UTF8/ISO-IR-193//ISO-10646/UTF8/OSF05010001//ISO-10646/UTF8/ISO-10646/UTF-8/ISO-10646/UTF8/UCS2//ISO-10646/UCS2/UCS-2//ISO-10646/UCS2/OSF00010100//ISO-10646/UCS2/OSF00010101//ISO-10646/UCS2/OSF00010102//ISO-10646/UCS2/ANSI_X3.4//ANSI_X3.4-1968//ISO-IR-6//ANSI_X3.4-1968//ANSI_X3.4-1986//ANSI_X3.4-1968//ISO_646.IRV:1991//ANSI_X3.4-1968//ASCII//ANSI_X3.4-1968//ISO646-US//ANSI_X3.4-1968//US-ASCII//ANSI_X3.4-1968//US//ANSI_X3.4-1968//IBM367//ANSI_X3.4-1968//CP367//ANSI_X3.4-1968//CSASCII//ANSI_X3.4-1968//OSF00010020//ANSI_X3.4-1968//UNICODELITTLE//ISO-10646/UCS2/UCS-2LE//ISO-10646/UCS2/UCS-2BE//UNICODEBIG//internal_ucs2reverse_loop_single__gconv_transform_internal_ucs2reverseucs2reverse_internal_loop_single__gconv_transform_ucs2reverse_internal__gconv_transform_internal_ucs2__gconv_transform_ucs2_internal__gconv_transform_utf8_internal__gconv_transform_internal_utf8__gconv_transform_internal_ascii__gconv_transform_ascii_internal__gconv_transform_ucs4le_internal__gconv_transform_internal_ucs4le__gconv_transform_ucs4_internal__gconv_transform_internal_ucs4cannot apply additional memory protection after relocation0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +3?HP[hwLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIMELC_MESSAGESLC_PAPERLC_NAMELC_ADDRESSLC_TELEPHONELC_MEASUREMENTLC_IDENTIFICATIONn- ~}}}}W}~}}}W}&}}    V. upperloweralphadigitxdigitspaceprintgraphblankcntrlpunctalnumtouppertolower8HHHHHI( (xx>>~~~~     !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~     `     ` (C)<<-(R)u,>> 1/4 1/2 3/4 AExssaeIJij'nOEoesLJLjljNJNjnjDZDzdz'^'`_:~ -------'','"",,"+o...... ``````<>!!/???!!? C=RsEURINRa/ca/sCc/oc/ugHHHhIILlNNoPQRRRTEL(TM)ZOhmZBCeeEFMoiDdeij 1/3 2/3 1/5 2/5 3/5 4/5 1/6 5/6 1/8 3/8 5/8 7/8 1/IIIIIIIVVVIVIIVIIIIXXXIXIILCDMiiiiiiivvviviiviiiixxxixiilcdm<--><-><==><=>-/\*|:~<=>=<<>><<<>>>NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSIDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUSSPDEL_NL(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)(0)-|+++++++++o::====== =(21)(22)(23)(24)(25)(26)(27)(28)(29)(30)(31)(32)(33)(34)(35)(36)(37)(38)(39)(40)(41)(42)(43)(44)(45)(46)(47)(48)(49)(50)hPadaAUbaroVpcpAnAuAmAkAKBMBGBcalkcalpFnFuFugmgkgHzkHzMHzGHzTHzulmldlklfmnmummmcmkmmm^2cm^2m^2km^2mm^3cm^3m^3km^3m/sm/s^2PakPaMPaGParadrad/srad/s^2psnsusmspVnVuVmVkVMVpWnWuWmWkWMWa.m.BqcccdC/kgCo.dBGyhaHPinKKKMktlmlnloglxmbmilmolPHp.m.PPMPRsrSvWbfffiflffifflst+___,.;:?!(){}#&*+-<>=\$%@!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzACDGJKNOPQSTUVWXYZabcdfhijkmnpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABDEFGJKLMNOPQSTUVWXYabcdefghijklmnopqrstuvwxyzABDEFGIJKLMOSTUVWXYabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789 %,37:>BFJNRVY]aeimquy} !%*/49<AFILORUX[^adhknqtw|  #',269=BEHKNQUZ^aejptw{  "',16;@EJNSX\`dhlqtx}  &,28>DJPVZ^bfjnrvz $).38=BGLQV[`ejoty~ #(-27<?BEHKNQTWZ]`einqtz "(-15:>BFJNRVZ^bgmquy} '+/37;?CGKOSW[_cgmquy             " % ( + . 1 4 7 : = @ C F I L O R U X [ ^ a d g j l o r u x { ~          # & ) , / 2 5 8 ; > A D G J M P S V Y \ _ b e h k n q t w z }          " % ( + . 1 4 7 : = @ C F I L O R U X [ ^ a d g j m p s v y |          ! $ ' * - 0 3 6 9 < ? B E H K N Q T W Z ] ` c f i l o r u x { ~          # & ) , / 2 5 8 ; > A D G J M P S V Y \ _ b e h k n q t w z }   "%(+.147:=@CFILORUX[^adgjmpsvy|  !$'*-0369<?BEHKNQTWZ]`cfilorux{~  #&),/258;>ADGJMPSVY\_behknqtwz}  "%(+.147:=@CFILORUX[^adgjmpsvy|  !$'*-0369<?BEHKNQTWZ]`cfilorux{~23IRS                    " $ % & / 5 6 7 9 : < D G H I _ ` a b c !!!!! ! ! ! !!!!!!!!!!!!!!!"!$!&!(!,!-!.!/!0!1!3!4!9!E!F!G!H!I!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!!!!!!!""""#"6"<"d"e"j"k"""$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$#$$$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%% %%%%%$%,%4%<%%t*u*v*00Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2222222222222222q3r3s3t3u3v333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333) MNOPRTUVWYZ[\_`abcdefhijk  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    !"#$%&'()*+,-./0123456789;<=>@ABCDFJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~              " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ ^ ` b d f h j l n p r t v x z | ~              " $ & ( * , . 0 2 4 6 8 : < > @ B D F H J L N P R T V X Z \ ^ ` b d f h j l n p r t v x z | ~ 0123456789?(nil)SunMonTueWedThuFriSatSundayMondayFridayJanFebMarAprMayJunJulAugSepOctNovDecMarchAprilJuneJulyAugustAMPMNANINFnaninf0.0001UUUUUUUU?33333333*$I$I$qqqE]tEUUUUUUU;;I$I$I8885P^Cy 0 0 0 袋. ,d! p= ףp= ؉؉ %^B{ $I$I$ =B!B|PuPuPqq>        6D6DD???DD       (null)|||||||||t||d||||||||||||||||||||||||\`lllllllllllll?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz 0@Ph 62 kg SP)E7J G |l'5$5NjJjiT d'o#ſt[Am-jd8n헧?O>. 8/t#ڰͼ3&N|.[Ӿr؇/PkpnJؕnq&fƭ$6ZB<TcsUe(U܀n_SlgrwFo]:FGWvyuD;s(!>p%"/.Q]OᖬW2Sq$^c_䭫*sf\wI[iCsFEHis 84c)r+[[!|nN5 }L,D4fl}C}Ο+#U>#`e!Q4\Ycɟ+1*ZibBtz["؊4س?ŏmk1Ke6ukG܉ـ( f13j~{j6h߸\A)\='_Djzp؊4|ElݾV}*@|gu "Ωo$po?b(UxI>Nkw};u  #6'0q'"(\؄t.z-TMеub <4 9Ԣ7.~2!'{n $-PԓX+1"#+%? D~br*~xxކzos{'~j=jr1|òAv09&Ѷ~j2=_+0cm-X%<|b 7w ʐ,5P6xPnx [4? E,W8 9qIHۚ풴lMP#*wg:8-ñj@?F[$GtJL0s-o|;#o`Is{Kҵ65m1 k?f%(炸r;v=4tPw?j&ATN4 @SZ E3TɤAc+;={CpfU,ie.O\Oߢݭ9^2XX%-VNqv4§v=ЉMOT+}\ IA?7߻D!WDGn®8pp;3,f%k;ܑyٸZNh.ltH Ic/~=otgx!RJݼ-ݎW5YAV9 T<!{>;b.w_ W5ƶ(NT ]=!̇odI@BuhؖҋcU4ph{3'"2I%% dKE)0bd&R4cIdSP{)I/ExCk; -_dts; 9?%kDs,zy '-H+r:J5~"ZzY8<{jnQ7Ң ƞ|ǙQX dCTrұz[\C;-Ck= 29$8  aѠ]3hwBAض P)qT&)h@ZcR!W5s#1-1ݛH%Mx7@.,j WjA 2zbUj.ߣ氋4}v!ѯ*u}( 08/VO<@QXPpxGŭTo(LGfnȕ^t(2=g<{O++DľĶ.cMjrB jJBūM+I K RB pCv0eUkJLvH$N{sq 7Hgdt#$~r<!ngϮs41Bw<\toN CX lA/xKDZ~;EƖQv 4j=6Zn1I`I"}ZSW91e˘' N2>]4%C(#4\ QPaצ6~W^DŽ.Sյh݄t_JSURH.Ezpnwi6g%/&lhd?:cBGXzZ W$?!koN>=?+ٛXZ1JI8s8A%{ hϥ.p LhȬ`]60~Gǰ-6:X6k5Q?q^==spq g~I*_@8[qh9BY<" s"_{VŒzQ W5 ia94^af.< v45tWYfěZ9mDgr+Ʌ65Tp9Rbu#%RyE28bU}cL]' PbItYYzZ }f6Q"U757"_ W0aWGSCPs&5KDϤ$&oZ JJ $0*t4ÆL8qH_PEt\wq_m몱TԅzW8ʑ*ģV:R/,bJHeS;JG(r#>IPJ6 (EjB3F7f9Du0єA Aa6kyM} GQ8$]Y@P _c ZerTa ]Rgc@ C&2GDS'6M.ijYe AFTdUt K8ӧa*)_NLGBs .ξw|ȾT*ީ#`R(;v3AF2:ãD04%%;oo3bEj3 , qgr9RIh$XPLQM?/_c>֟Z َo= ]7[n0Ԁ%2vM_+vf \RG ](9$ CȟjvH馔,̭L;)@`k"΋9N%tǚm¹k$>.U+No T4R #a7qd4NA@bU)~4\uk4USj68{[P`xJ3]GmaG]us&`cmOf.L3F. 幱!=&uHiWzI u4]=JcdrGk_ P6ՅPuu48瞀x"R\z{DQdI#g~HH]1c鐂XdM ~3 Y2p'8=pZ|<oPJ.ZM&{ Cпiݶ%b lGx`˃F%4go4b i)G"챙?4pvϵwsQNM?]P4ݙNxiO^LGݦn81ܘT^E6g?!d~UzR!r)hVB̖{I P~jPh]`|x~7 wutBB_m]L} /#` ?V[;IV'PvTA3V a#AuVvtN!oCb6'@MW&f*5U9$i8hLddKR X^LdXnk (/ Wn) k1d5LJ ֟okiB;)!Ӌk@'|UE<,Ӡ:7pyM댢M4q>vOy;+3S]l*Cʑ0m_dISoy}hgVlw!H˘F YDn/>?Y1Y4FV2 ѷjّ[@$><9*qx?] HzJ|7?s"h7Ӝ%CρnVBH(5Yϋ~خ u#29С~G?k̀*R!RbVp3-;'NG̼ɃOuT~Vi!N`urF5d= +1\ޏ1.!?ݱBv84otDHlLɉq`׷_ynS?q}>ٍ__5pw-eFuled6uM!Hxt Wם&+!l'֌"Doe`6P̦Xa'uYLuPP @5zW5N=Ols5h͂ /Qwl1a=Q^y/woB|oÀc nN}hk sJhct Rʚ U3D=8yexK>k)(c~UzGk Rͽγ rrARbrS)KE~1'T %{~ܾE2@ ._Yl؍w;_w#ȇKP"W1bZ1dz~K(=+gtYfn>E<=V> >9?suxmEpgb􇞐j(LBЕivìx`9 I[Lm~smA9{&iJRr`n۱5)TMs IHX׼[݈@B%,ri?("%#T^$nw[Aͳ{ITesQ' tʊ=?ډu TXm;v%l-b%W@qÏccOMJ m_ka2R &~wqioqZڱ?`B?u/v$ #.vˎ\\_@c _ VGWw~" 4Ŧ/U1-r[NCfᐡLXV_ivm \Ew l[ϙDi9n̳(Pqk WFYa, r3+tv"fjH R`9 7J̅r/ZXk?I=xvԉ[dNA)z~\V =Lwc"7#aEZ(KXbr1hTsN+?+}B iS{w1ᗶ_QUUU02DMV0RfRhɩWJ9KMܠ.Vjnw/o5ķo왨'wuHA}7ϸhNiW*=tLP|LU /aSy11Hƹkw+BVHh݌`n >0Kuv %[կ٪7]9 9 ޾Uյs'nrxvf8R lrG3e7>@ג<2yAeuAr%!/ĄN,%:ShD;Im6(_YQЩ;.V$!< tYЏD Jɩ@^JDAE<-ȬG&.!' BWP%]hfV2 ~"X*%X%6g.}3 \Cgֈ[ x ^Vs@3Idʿ\~|;-"V"2h& g/T7B@G0/D(E鴯 e*1b<= 5~ `́M*7{-oKb&ĭO"\x46k_<CN}lP*V΂((nf{p?}juFZAO3KQujIgfq t<}cXX Կ?J40FTZػ ,bB#۬!@52" HvU͚Vx9ꖖ(M@>SXy6,اnV[mǁdէP]SO]W$Oݠ^tB8: {=>l/'X;F(5c3Y kݪ=Z=G?RUt" dpl5mu9Ѱe=1~DW&#c ŧEK/CfNf{qQ$mA l` [It rJ@ԬٰHMD}9[t{{}}VnCm_" a[/ DJs y<滩?^ MvH o A t yH t D FN  (HV , DHJ\EM|HJPHJXEMHJEMHJEM<(HJT0EMtpHJxEMxHJHJEMHJEM4PHJLXEMlXP H @8 0*_H(b`,h!D&\&t+&&&&(%@ 84@LHdP|H @H@8 0 8$0 <( T l  $\$oOr G J A $`-<xFN\xFN|xphL`FBB B(A0A8DP 8D0A(B BBBD ,,2FEG SEB$\JFHD qDB<0yFBH A(D0O (D ABBC p,x2FEG SEB 9T$tKBB D(D0r (H BBBI D(A BBBA|,2FEG SEBLFBA A(D0O (D ABBJ D(H DBB,(,D02FEG SEBt@L8pFBB A(A0H (A BBBE A(H BBBX,`2FEG SEB$p84<fFBH A(D0G(D ABBt,2FEG SEB9$XEAD KAA,HEAD ` AAA ,,EAD r AAA 4\8 nFBD A(D0V(A ABB<p FBB D(A0f (A BBBA , EAD \ AAA 0 ( 4 L d |    Og A , bAE s DBG  ET4 EVT 4l yBDA z DBI eAB  3@ ;h yH t D ,  EAG0H AAI L<h >FFE H(A0D8G` 8A0A(B BBBB $XQUU F WIQM$-EDD ZDAQM$46FDD aDB\+YM$|:FDD hAB$2EAD bDA,EEDD c DAA IFi A $ H4EHG ZDA$D `?QFD ^DALl xPBG A(D0@ (D ABBI F (D ABBA   'I] 9c$ !8ELG ZDA4!DkL!Hd!PL|!XdFED G(G0h (D ABBB J(D ABB,!x ET s FN I DC !XFN"XCm$4"0FGG JGE$\"0FGG JGE" 4"yEGD0A IAM V DAE " "Fp,#2FED YBB4# L#(>dd#P64|#xEDG H DAC jAA,#EAG@c AAF <#FBD A(D0Z (D ABBD $$  <<$FBE A(A0u (D BBBB <|$FBD A(D0 (D ABBE $h $$`0FGG JGE$$h0FGG JGE$%p <<%hFBD A(D0o (D ABBG |%ZT%0 L%(|FBA C(G0C (A ABBD U(A ABBL%XFBD A(F0D (D ABBH U(D ABBL&F$d&EG ~ AE $&8^Ha G L D ,&pFDD0` DBD &@ 4&(KAD zDBHX 4'EVT'2ll'BEc A $'EG W AA 'P:FZ A 'pQEr A 'EV(2l,(EWL(d(Fm4|(HDFEE D(J0J(P BBB(`(X4(`IFEG D(G0Z(G ABB)x4)L)d)|),)?FDK fAB)EW)EV**<4*FBD D(G0F (A ABBE ,t* EKJ0v AAA * * * *!!+ !K,+X!FDK N ABJ L+!d+! |+!+! +! +! +!+! ,!^X$,"!<," 4T,"ECG0} AAB wAA,h" ,`",X",P"'Y,h"%_-"-"!4-"&L-"&d-"+|-"&-#&-#&-0#&-H#%D-`#FBB A(A0D@_ 0A(A BBBI L<.($`FEE B(E0D8G` 8A0A(B BBBB ,.8%nEGG C AAH .x%.%.%/%K/%Z4/&!L/(&FN,l/(&FDK O ABI /&/&/& /& /&0&,0&D0&\0&t0& 0&0&0& 0& 0&1&D1&FDA G0  AABD o  AABE d1'|1' 1' 1' 1'$\1'$\1' 2'$2'<2'<T2'wFFD C(D0o (D ABBA <2 (wFFD A(G0m (A ABBE 2`(FN,2`(FDK N ABJ $$3)yH [ E ^ J O A $L3X)/EIG TDA4t3`)TEDG b ADI NAD<3) PBH A(A0 (A BBBE 3*4*54* 44*L4*$F]l4*6`$4*5EMI TDA4+Ah4@+$4H+3EKI TDAL5`+PBB E(D0A8DP 8D0A(B BBBJ T5-Fpl5.5.!FZ5 .$5(.6FDJ NJD5@.=d$5h.6FDJ NJD$6.5_<6.DnT6.9c<l6/oFEG D(G0a (G DEBF ,68/WFEG ] EDF 6h/Ip6/Ls 7/Ls$70Pz<7H0IpT70Lsl70Ls<70xFED G(J0m (G ABBF 7018b7X1Hy F 71tHn F ,82RFDD d AEA ,L8H2FDI B ABH |828282Cm83+e,83PFDJ ` GBF , 983PFDJ ` GBF <9X3+eT9p3+e$l93hFx B K A 93949494L94FBB B(A0A8DP 8D0A(B BBBH D:P5,\:X52FEG SEB$:h5JFHD qDB<:5yFBH A(D0O (D ABBC :5, ;52FEG SEB<;59TT;6tKEB D(D0p (H BBBH D(A BBBA;86,;@62FEG SEB;P6L <H6FBA A(D0O (D ABBJ D(H DBB\<6,t<62FEG SEB<6L<6pFBB A(A0G (A BBBF A(H BBB =6,$=62FEG SEBT=684l=6fFBH A(D0G(D ABB=07,=872FEG SEB=H79$>p7XEAD KAA,,>7EAD ] AAA ,\>8EGD l AAA 4>8oFED A(D0T(A ABB<>8FBB D(A0i (A BBBA ,?09EAD \ AAA 4?9L?94d?:FDG G0L  AABH ?X;4?`;FDG G0L  AABH ?;4@;FDD G0^  AABI <@<T@=4l@=FDD G0^  AABI @=Ak@=Is@0>Is@h>$Ap>EFOG ZGB,A>DA>\A>UFu A |A>A>$A>EG0l DA A@?AH?BP?ERL$BP?FBD A(G@@ (C ABBD H(C ABB,tB?MFAD ~AB\B?}FEA D(D0{ (A ABBK D (F ABBA D(C ABBC@mCX@T<4C@JKG u AAE D AAB V<tC AKFA D(G0w(A ABBFCAC8BYBC K HCxBGAr E N$ DBgNF D DD4DBSA C ,TD0D[BDA PABD`Dr F F$D`FsAz E d D DFKDFrUf E qEPG7ExG.44EGsGDH v ABD `<lEGFED A(G0A (A ABBB dEhHnBBB E(A0D8D` 8D0A(B BBBD h 8J0A(B BBBE FpPBBB A(D0Q (D BBBJ F (A EBBH A (A BBBH a (A BBBH  (D BBBJ $FV|eH uAEP DFVBDA D0  AABA t  JABE  GW#<$GWzBAD = DBF  ABF LdG]BBB B(A0D8D` 8D0A(B BBBA DGPcd BBB A(A0G@ 0A(A BBBF DGxmAAG g AAF x AAF  AAA ,DHnAAD0 AAD LtHo;BEB B(A0A8JP 8D0A(B BBBD 4HqzBAG q LBG W CBD $HqAi F L D D$I`rBAD P ABF  GBN  AEI $lIvqR D lDHLIx>DBBB B(A0D8Gj 8A0A(B BBBA ,IADD@ AAA Jp@ BBB E(D0D8D@h 8G0A(B BBBI  8A0A(B BBBF  8A0A(B BBBH  8A0A(B BBBI <J=BBE D(D0_ (A BBBI LJHBBB B(A0A8D 8A0A(B BBBA L:AK ' AA Dp?Dj B Ld @XBFB F(D0A8DPf 8A0A(B BBBG l0ABAA D0L0L0ZL0W  DABH ,L0L0pL0rL0iL0D$EBHG fL sL G ABD dL NGBl8FMpF@BBE B(A0A8G$%L$%L$$A$R$H$y$N$D$D$F$A$_$^ 8C0A(B BBBA , KIAA C ABG lDK BBB B(A0A8Dp8 8A0A(B BBBH 9LpLprLpLpLT%BBB B(A0D8Dpn 8D0A(B BBBD L\BBE E(A0E8G 8D0A(B BBBJ ,TkOvLBLG,k>HwLzLz E LlBBE B(A0D8H@ 8D0A(B BBBD T`nxFDD L FL D GBK D FBL R CBI 4\oDvLWLD C jLG E PpLXpuBBB B(A0A8GP  8D0A(B BBBH lrFBB B(A0A8DPeLPxLPfLPMLPI 8A0A(B BBBK ltEL}LHu~LvLuą@vGd܅xv/FHD Y DBG D AEF U ABH F ABG @L zL D@y<d S\\hyBID  EBG A EBH D BEE A BBC XL }L {BH u,Ԇ|H F J b F D D I G <|OFAA L XL A ABI D}FBB B(D0D8DPp 8D0A(B BBBK Y 8A0A(B BBBE T 8D0A(B BBBG iLP~LPԇЀTt [ 7KW N $$0oKr S Q G \LxFJG E(D0 (D ABBG  (A ABBK `L0L0\FBB B(A0A8DpRLpLpX 8A0A(B BBBA  XT$FEB A(A0D`rL`iL`} 0D(A BBBB \|ȈFBB B(A0A8DL|L 8A0A(B BBBE <܉xECG }L L D DAK (WED G F$<hGOZWdHV|EЌUUĊ`4܊h@FAG Z JBE ACBp5,_DJA H LdGBBE B(G0D8M 8A0A(B BBBA LFEB B(D0A8D 8D0A(B BBBK 54iLd|8U(HČ`܌505 XI$<(iT?lYiH̍ #0 (M,D\>t1 1 1 1)Ԏ[ [x+  4 L؆*d |+  ď ܏? &"$<6!T'l&B|BbX*̐Z \$^`,XbDc\Xgt0hi#ԑXc4PLQlh? t ̒,  ,1D \t 3 ԓ > 4Ld7| Ĕܔ. $<;TlU`AZ E | L C M C e D D N J l L O I D A F A F A F A F A F A F A F A I L F Q L JEA A(Z0 (A ABBB HC0L\XBBB B(A0A8D`& 8A0A(B BBBB -LĖ@AFBB B(A0A8D@ 8A0A(B BBBA C, D"\(JEw L A$|XyEJ0J AF ,EC Ez I ,ԗPEAG F AAK ,tEHN v DAJ l4eFBB B(A0A8GHQA 8D0A(B BBBA HYBX,HAC BMK A <FBA C(Dpx (A ABBB ,%DVH0y G d T|hT,.FGGi ABH ęd0FZ00d0IW0,LSFEB B(A0A8J 8D0A(B BBBE l*H x H `WH`I A ĚH`` H 0H`N J ,,424LFAG C DBI yDBp1RJH0| A ,ND]AHXH%`%x%,4BED Q BBH ,dPADG ] DAJ $bAf AG LX`FBB B(A0A8D`0 8A0A(B BBBA L hqFBA A(D0E (D ABBD D(D DBB,\EC P G LBBB E(I0D8DPF 8D0A(B BBBA $ HSADF EAA,4EE M H <dpFID A(D@ (D ABBK MKx E Ğ@MKx E p,xQJAG uAAG,(D%\H$t'BAaB$AAXAğZtܟX]H H$]FHD DK\t|X M$ FAJ Y AK ̠ !L FBE B(A0A8DP[ 8A0A(B BBBA 40mTLYON ^(D0G8 0A(B BBBC  DPFBB A(A0D@  0A(A BBBF ( L 0FBB B(A0D8G 8D0A(B BBBA TNQ` G t0(!L@ FBB B(A0H8K@q 8A0A(B BBBE $&En E _ Q _$X'En E _ Q _DD' FAA Gw  AABA R  DAEI <(FBE D(FPL (A BBBA ̣1 E,)EC FJH A @.FBB B(A0A8D`hEpNhA`i 8A0A(B BBBD hhQpChA`x 8A0A(B BBBA D 8F0A(B BBBA 4/ZFBA D(H0t(G ABB/4ȋFEA A(D0(D ABB4PIAGTeHJ N D4tp/?EDG [ AAK DAAx/ ĥp/ ,ܥh/~EAG D AAE , / AC HK A <<:FBA D(G`E (A ABBA t|H;FBE E(D0D8GpHLpFLpX 8D0A(B BBBD LpJLpLp4=FKD lL \L CAB,,8>AC M~ A \)dtABBB E(A0A8D@ 8A0A(B BBBG @ 8A0A(B BBBE 4ܧ8B\AAD A CAE DFA,`BQAC FF  C LDEBEG A(K0N (D ABBO D(A ABB,EEC MS H Ĩ0JM|P4`JFEK H(F0(A ABBKl4 KFLB E(A0D8GBXAd 8D0A(B BBBJ tBNBlNFHE B(A0D8G 8D0A(B BBBH HBXABSBlRFBE E(A0D8GABWA` 8D0A(B BBBJ BTBl0VFEE B(D0D8G! 8D0A(B BBBA MBSA-BTBlZFEE E(A0D8GzBWA 8D0A(B BBBB tBSAd0]YFEB B(A0D8JBSA 8D0A(B BBBG 1J[ABRAD]Bd FBB B(A0D8JBSA 8D0A(B BBBG BUA)D\B3D[AD]Bl`p FBB B(D0D8GJBWA} 8D0A(B BBBA ATBl|FBE E(A0D8GEWA 8D0A(B BBBK BSBFEB B(A0D8JBSA 8D0A(B BBBG J[ABRAD]BlXFEE E(A0D8GBSAq 8D0A(B BBBJ BSBFEB B(A0D8JBSA 8D0A(B BBBG J[ABRAD]Bl$FBB E(A0A8G 8A0A(B BBBC HXALGYA=\BBB B(A0A8D` 8F0A(B BBBF Q8A0A(B BBB, AC FED A <x ,TpFHG@ DBE 4`FAA D@T  AABD LȟFBB B(A0A8D 8D0A(B BBBC  X$`<xEU\x+Hb$t Qc D K E W A TxFPA D0  ABBH [  DBBE r  GBBC 0d 8BBE B(G0C8FP 8A0A(B BBBK  8G0A(B BBBE <tBIB D(A0(A BBBLFBB B(A0A8J 8D0A(B BBBA M$$EA BD ,LxAEC DEF A |QLFBB B(A0A8D@ 8A0A(B BBBA ,]EC HI E ^E| O ,4EC P B 4dpFHA  ABA z ̴(08@T,QH C A Lȿfd 4EM F [`K D  4H2LԵpFBB B(A0A8G  8A0A(B BBBK D$EC HDeLLc F L4lYFBA n BBE TBBL@0FBA A(D0fL0`L0F (A ABBH , HsLJLF E $0Hg<TldFBE E(D0A8D` 8A0A(B BBBB  8A0A(B BBBG XPK A $tL<XJBBB B(D0A8GPQ 8D0A(B BBBF LXBBE L(D0A8G a 8D0A(B BBBA LܸFBA D(F@ (D ABBK \ (G ABBH ,,X&AC I D <\|/EC DEEKL B LT+_BBB A(A0JBXCLBm 0D(A BBBB {CLB -vL -BEB A(D0H (D BBBH  (A EBEA L\.rBBL B(D0D8J 8D0A(B BBBK LH/FBD C(D@ (A ABBG l (F ABBI ,0'AC P D <,W-EC BELKL H L\lXBBE D(I0JwLm 0D(A BBBE {L̻t\FFB D(D0G@ 0A(A BBBH  0D(A BBBA DvL\FHD G0  AABD   DABA 4_FAD G  AABD 4EDD M FAG TFAdFEB B(D0C8D` 8A0A(B BBBJ G 8A0A(B BBBA @ L8$FEB I(A0A8D` 8D0A(B BBBA L$FEB I(A0A8D 8D0A(B BBBA L<0BEB E(D0D8D` 8A0A(B BBBE ؜45(5<ԾPlFED C(G0s (A ABBF LFEB B(A0C8DPy 8A0A(B BBBF dEW L 4`oEAG E AAD D FAE 4uFDD u DBG ]DBLFDB B(A0A8DP 8A0A(B BBBE DXYX G Td?Eo D FrLX D `gEaDZEAD  DAB U FAD M AAA D ȢZEAD  DAB U FAD F AAH LTFEE D(D0v (D BBBH D(A EBB,EAG0J AAG ,ФwEAG f AAK  3,HlEDG u AAI LDd|X!p& TxFEB B(D0A8G`VhEpbhA`f 8A0A(B BBBG D4FBD A(G@NHFP`HA@f (A ABBK T|FEB B(D0A8G`bhEphhA`f 8A0A(B BBBE ,PEG BGF A 4FAA GPz  AABC <<FFB A(A0y (A BBBH <|(IKE @ ABD } ABA 4EFAG _ JBE ACBLFBB E(D0A8F`` 8A0A(B BBBD D5\(5<tPuFED F BBG H EBA JA H LBHB E(D0D8J 8A0A(B BBBA L$FBB B(D0A8Dp 8D0A(B BBBK LtFBE D(D0` (A BBBD ^ (C FBBE L0FBH D(D0Q (D BBBE f (H BBBD ,DP\Xt`5  LxFHA A(D (A ABBI FLAT ؿFAD DDHAaBLAc  AABG ldpFBE E(A0D8GEVAe 8D0A(B BBBD HXBE8 @Hg4L(dB| < FED C(D0 (D ABBJ ,BAGj ABI P9MPx9MP4-JJ$TEmLKLAL|(FIA A(G0oL0L0D (D ABBA ,FCNu ABA x% , D \x tpT\BH`t A 0H@ C \( L FBA A(D0\ (A ABBH D(C ABBd`ML|FBB B(A0A8N 8A0A(B BBBF LXBBA D(J0w (D ABBE e (E DBBF ,JN  H ` H ,LAC BGJy H L|BBA D(G0o (A ABBK K (A ABBA 4vBEE E(D0D8D@DLHD A(G0 (A ABBD P,LxAE FEI  K ,|8&AC P  B ,8DAC BEEM A LXFGB D(A0K (D BBBG j(D BBBL,}FEI E(H0C8GP 8D0A(B BBBF d|BBB G(D0K (D BBBJ \ (G BBBG i (C BBBA LBBB B(D0A8Fq 8D0A(B BBBA |4BEB B(A0D8D@F 8C0A(B BBBJ  8A0A(B BBBF K 8A0A(B BBBC 4EQ DH D  A hFBB B(A0A8G 8D0A(B BBBK FFASRBB[sIBB`fQBDS'PDA[lIBA^f MBFR LHFBB E(D0D8D` 8A0A(B BBBH LBEJ A(H0 (A BBBD K (A BBBF lH BBB B(A0A8GNLHBDAa JMADAa` 8D0A(B BBBA p" FBB B(D0A8GKDHGAIt 8D0A(B BBBH fJAHDALKFAiDSI K`B4EDG x HAO D AAJ L  5FBE E(A0D8G`T 8D0A(B BBBA \"Lt#1EW A #EFw#hLf F $@$FDH UP4$EC P I f J ,4`<EC BU2 A ,dCAC P K <0IFGH A(OP (D ABBB IK JKJK440KiEDG I AAE DCAlhKN$KQH H O A <LEC Ps E  G  F 4HTPEA AF hH$$`V<AFG kAALxV!IdVd G pWeWLWFAA D0  AABH V  AABF D CABLPXFBB B(A0A8DP/ 8A0A(B BBBE TZ1HN J ILtZFED A(D0M (A ABBI L(A ABB [}4[FDA G ABK <@\EFSA A(G  (D ABBA ,TP]FAG W DBE ^PR] Q L@k!ILXkFBH E(H0D8D@] 8A0A(B BBBA d kFBE B(A0A8D 8A0A(B BBBF  8A0A(B BBBA tpo*Edo48pEC I? H l D u@d[v u4uRD`iTSvUPk$tv>EfF JAAvD@S A 8wtH@f A w1HP B x,Z{AL I AI YA,DxEN0K8B@O8A0T AA $tx9E^I JAA$y:E_I JAA y ,ZEAD  AAL  xtH@f A ,HyCE}LxyvH@h A 4lyBGJfHCDI`zJHzWEID $zFG EE 4{jFDG J@E  AABA $<{H@THBPNHA@j A ,d@|e     ~ }|{|h}jH@Q G L}OBAG Z DBF  DBF [ DBG PDBL~BBE L(D0A8G a 8D0A(B BBBA lG,P)EF PX E <FAA HL HL A DBI $ L<^FBB B(D0D8G 8D0A(B BBBH ,X`QCD @AALxFAA B ABC CL L A DBG D FID A(  ABBB I FBBDTPFID A(  ABBG I FBB,EvL]LD D DwLORi,zEAD0 AAI $,hII^ I PHT:Eg L A,teNDD k ABD (H_ '< Ew D H H G I J F L L V B T A L]H@O A $liEzF LAA A  vH@h A DFEC K ABD X HBN ^MI4RFAD i DBF KDBLQl/U, TD@FBD A(G. (A ABBH , ,DEM (A0W(A y AB \tHFBA D(D@HAPfHA@k (D ABBE P (D AEBD L,BBB B(A0D8DP 8C0A(B BBBD 4<FAD \ DBC L DBA Lt@ FBB B(D0A8D 8A0A(B BBBE <2FEE A(A0 (H DBBE ,EH I G 44'AGJ o FAH H CAD ,lOC PW G $XM@ K A G ,EC M \`FBA A(D@^ (A ABBF ~ (A ABBD HBPLHA@Tf^a I DtLDFBB B(A0A8Dp> 8A0A(B BBBF LFBB E(D0D8GP 8D0A(B BBBB ,{D;L\8FBB B(A0A8G" 8A0A(B BBBG ,EF DEFF H  EL,FEB B(D0D8G@ 8A0A(B BBBB L| FBE E(A0D8Gz 8A0A(B BBBF L FBE E(A0A8G@ 8A0A(B BBBB LFBE E(A0D8Gpt 8A0A(B BBBD $lXEF J K xPp$ x{E{F LAA A 4qH@c A T0 l(&HX8EX$8FD@} EA "E\$FD@ EA 8%44PiED n ABE Xl;Eu,ER X H <h(BBE D(C0 (A BBBE LH):FBE E(D0C8D@r 8A0A(B BBBA LL8*FBB B(A0A8GL 8C0A(B BBBA L0yFBA A(D0I (D ABBH D(D DBB$03E]A MAAl0BEE G(D0GBHWA@ 0A(A BBBH eIOAp BH 2K0 D p3x34$4 H@} K  A D6FAA DP  AABG   AABF \9,t9LT P K M b F GL$9BOHaJ F L;~FGB B(A0A8Dj 8A0A(B BBBE $FJ w?;*3$",zRx   4L$zRx  , D)zRx G4;Ldv|vdR $zRx $0zRx 4PDwH8DH K DD8   D4THyH8DH [ DD8  D4LH8DH 7 DD8  D$NE C l DD$OE C  DD$OE C  DDzRx  4zRx  $$zRx @,$zRx P,$zRx p,$zRx ,8D&$zRx ,$zRx ,n$zRx ,$zRx ,$zRx , $zRx ,F zRSx|} ww( w0 w8 w w wwwwwwwwwwwwzPLRx%j L$@FFAD  ABH JL hL @L L DtBNAG DL L DDAFH dDfVFBA D(G0LL0n (D ABBE FL0D (D ABBI \$FFBB B(D0E8D@YL@L@Q 8D0A(B BBBG pI>FBB B(A0A8DrFdE] 8A0A(B BBBF LhLGOA*G\A<a05EYL`LD F Y G _ E \j PBB A(A0L0 (A BBBI c (A BBBF A (D BBBE L0nH0\VFBB B(A0A8D`L`D 8D0A(B BBBK L`$zPLRxf ,OP|L$zPLRxf  ,ON{L $zPLRxMf  ,2P|L $zPLRxf 0,O{L0,zPLRxe 04wQ}L0,zPLRxme @48OD{L@,zPLRxe `42OY{L`,zPLRxd 4P|LzPLRx=d D$IBBE A(C0Fp 0D(A BBBA LlFBB B(A0A8G 8A0A(B BBBK 4SoFBB A(A0GpcH$ >^gFIA $4t^KFIA $\^/FIA $^FIA $^FIA $ EC BL$M^FIA $$^FIA $L^FIA $t^vFIA ,[AAG  AAE ,KBDD  DBB $a~I@~IC~IF~II~IK~IN~IQ~I:|IT~I:|IW~I:|IZ~I:|I]~I`~Ic~IMzIf~Ii~Ik~IlzIn~Iq~Iu~Ix~I{~I~~I ~I~I~I~I~I~I~I~I~I~I~I#~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I~I{I~IIII III"I%I'I*I-I0I :I0I =I@I LIOIWIOIZI]IcIfImI mI yI~IIIIII I III I I I III IIII I IIII I IIIII $II,I I6I6I:|I:|III II SI SI ]I ]I hIhImImIuIuI~I~III JJ LL`/J.J,J0J.J+J+J+J`+J+JI +JIV`HJ`>J`8J`DJ1J1J2JI`@J`:JHT׏IُIۏIݏIߏIIIIII$J,J4JF>F>F>F>F>F>F>F>F>F>F>F>F>FoFFFFFFFF%F=FFFF>F>F>FFFFFFFFFFFFp GFFPGGGGGxGFG@FFFFPGFFFFFFFFFFFFFFFFFPGGGGGxGFG@FFFFPGFFFFFFFFFFFFFGFFFPGGGGGFFFFFFFFFFFFFFFFFFFFF G Gp G0FPGGGGGxGFG@FFFFPGFFFFFFFFFFFFpG G Gp G0FPGGGGGxGFG@FFFFPGFFFF G@ GGG G GGGpG G Gp G0FPGGGGGxGFG@FFFFPGFF0G1G1G1G1G1G1G1G1G1G1G1G1G1G1GIhIJIhIIIIIIՙIIII8IGIUInIIIIƚIIII II/ICIUIcI|IIIIכIIII I3IFIIRImIIII0IPIIIIIIIÜII0IIII9IQIPIoIIIIIIIƝIII@IpIIIII&IDI^IpIIIÞI؞III II2IMI]IrIIIII@@0@0@@PLpI@LLP/@p/@@/@PLI@L@L/@/@/@PLI@LL/@0@/@PLI@LPLI@LL`0@0@@0@؍L0@0@P0@PLIPLI@LPL IPL@I@L06@6@`6@PL@6@6@p6@hL7@xL7@PLI(L(L 8@@8@:@:@0@0@ :@8@`8@PLIL:@:@:@:@:@:@PLI@LPLILPLILPLILPL0ILPLPI@LPLpI`LPLI`LPLI`LL`<@=@@<@L =@@=@@<@L`=@=@@<@0L=@=@@<@HL=@>@@<@`L >@>@P<@xL>@?@P<@L ?@@?@P<@L`?@?@P<@PLIL(L@@:@:@0@0@@ @@II@GFII DF2FкIAI]ItIIIII‡I߇IIIII-I;IQI@IpIbItIIIIIɈIIII0IIdBIZImIL*I3F:I6FTIp;FfI`?FIOFI[F2FIhFȍI@nFI DF2FI@GFI wF/I|FFjL~L@LL}L|LLL`L LLLjL~L@LL}L|LLL`L LLL`IJ`:J`@JIIIIIIIIIIIIIAA@p@@L`@@@@@@0@LL`LLAIf@v@@@@@@@@@@@&@6@F@V@f@v@@@@@@@@"@)@;@@LILjI`L LL@LLL LL`LLL LLLL`LLL@0ACPGC0>CLUC@@xIxI0vH7H`L L LLxI LLL(LLLL LxIII*III:IIJITIJIIfIIxIIxIIIIIIIIȍI؍IIII؍II IIII I/IjL~L@LL}L|LLL`L LLL`IJ`:J`@JIIIIIIIIIIIIIpHH`H HAI@BIBI`CIHpHHH`HmI oIpIpI qIqIuI0vIPwIBBBB`B BBBpBpB`BB`BpB@B`BPBBBBBBG@GBгB0BpBB`BPGB B0BBBBBBB0BG@GBгB0BpBB`BPGB B0BBBBBBBBG@GBгB0BpBB`BPGB B0BBBBBB`B@BBBBB@BpBBpBGB B0BBBBBB`B BBBBBBpBB@BGB B0BBBBBB`BBBBBгBBpBBpBGB B0BBBBBB BBB`B BBBpBpB`BB`BpB@B`BPBBBpB@FBBB BBBpBpB`BB`BpB@B`BPBG(GBB@GGGBpBpB`BG`BpB@B`BPBBGCC: (GNU) 9.1.0hn8 bGostd*'D 8A2A479 YZ;-0"<-08>&_08r)C/_0_Tp0Z__v0 F9 5YZ;-0"<-08>08r)C3!0_Tp0Z__v0 +N-Ff50 F[  [A; e#L \e#L+50 ip)O5q/\ v  Ur_TpK/3KJKD]<2 ^/4 L+O =Q 1s+S^" 1 1&U 6< 1&!V PV 18X # 1nt1+`O! 1+bQ( 11+e5 1+iE 11'f-v $1 11'f-z$1,7 11.DLW 1[04lw 1$1t,>01u:*11 I9vE5S 19  [ \ ^g<01 w!bHAh0HK-l=q ux-u > 3HHH 1 1 n3 3 3 3 3 3 4 34 J4 f4 4 4 4 4 4 5 5 ;5 [5 {5 5 52q(55B66"6]6y_V2"2"u ) 6 * x6@ >7 6 8 9 "9 C9 _9 {9 9 9 9 9 9 : F: c: : : : : ; !; H; i; ; ; ; ; < $< ?< Z< u< < ^= t= = = = > > => Y> y> > > > > ? 4? U? v? ? ? ? ? @ &@ E@ d@ @ @ @ @ A 'A=>H;!;$;(@)A*'A/ 30 31 32 *34 A5 A6 A7 A9 xA: A; A< A> PB? 8BA HAB TAC `AD lAF BG BH BI ,BK AL AM AN AP \BQ DB5 hB6 C7 Cb 8c De AEf TEg jEh Ei Ej Ek El Em Fq #Fr IFt iFu Fv Fx Fy F~ F F G *G =G UG {G G GzD D2 D)82 2 R GS GT 6\ Ge Hh %Hi ;H:,4 ]  9FQ \ QH\ <7!WH ; ~ QH00_ E# QH^H_ F#a? QHdH$s+M0 jH$Q20 jHs+c+! , QH0f<A L QH0$f-iBpHe p QH0$g8pu2pH QH0$Bw)pH QH0$<~ pH QH0$QI.pH QH0{f-%$pH % QHvH$- $4\ > D jHM4\ _Tp0 . ;I"  /? |H <"H 1E |H00  |HvH< #  |HdHs+3 0! ' Hb'0A G Hs+[+] h |H0W~ |H0f-YFH |H0g8H |H0B $JH |H0<-H|H0QI!H7B|H0`f- %=H]h|H^H- M$a HN4P _Tp0 b ;) V  [=H <Y'H ]PH{0{0 h>)HvH k:?JH^Hs+s9F{0djHw#D{0Hs+H{00-H{0f-qBHH{0g8LH H{0BH0;H{0<V)HU`H{0QIJHzH{0`f-%1HHdH- $AHN4_Tp{0 L` p yO*o; {<Ho; F,7HH|f-  IQ\HH} :  $mH[0 :$   H _/IO5  K F IJ 61a(+I"u"FIh>aI" 0m.aChH_Up0*+0IHI < Q V9XsZ x[ xP8\ x&V9^( I&V9c;-8 I+I&'j2LW I1I~*Br= g I7I V -B}QPP&B=I&BK=IHI&B$=INI&B =ITI&B>4(8=ITINI5r8E=I[0'T@- Q$k !ZI{`I$k j&HIkIO5 $#EHkIbg_`Ig"[  `IvIg'"-`IFg,!BR`IFvIbg1Ihs`I|Ig5F`ITIg89`I|IvIgE.`IvI|IJp-`I[0N0Q$)Tox$/`IF>[(DT`IxF;dju`IF_Tp0 < ; #  /   b O,0;.0:. 0 )xr# ]   I;'/Q ]r    I:D?    Ic70I<7/HII O5 <7H-/?I?I KF ?7YDh}I?II "0 }7&fJIIc79?II7<III7Fm#III;7J8MIII:7\9csIII7n30I#Iw5EI[0'f-IIIf->JIIIf-/I(I#7IO$>NI?I7I6doI# F.=`-93(e1oI L6/931IEend:AoIEendCx+ I 0#.L=2 39I 5"#.U79agI9J^  I9Jg,9I8qk*Iz[6I,\I9I;>8)9!'Is4=?AGI"'&?agIk)V>}I?k)u3I?I IAV?Iy!#0 IB*I? !2-"*R]I? 7'-"" ]I?+$I?EatAB*I?EatS ]I?S^0*ISiB]39I t*SYI w,]syII"HIIHHI"HII"DII)@E1I'] o0@II]  oZjII] ;oI#] 46 oI?I,+oI,"o  I40$( 3 IIh7I O I 6ue u I?I @\  I?C IFI371 Io?Ic  !I?H0"!(!I)+T):oB!R!IIool!|!IIF=?!!I?P1d1?!?Id?!I.5>!"I 'o"("Io'voA"Q"Ioo`4f"v"II;` ""II:2%""*"+0IoI?m}""*"+0II_Tp0< 9t>9F9;5A %$OMx:I<x4a#l#IIf-4;I##IIf-:I##II I##IB7vI##IB7'#$$I[0 o `$U#+/+H!+H 7H:9 $0_TpH:8K $0_Tp0:, $-H_TpH' $6$%_Tp0_Up0HHHIE 6H<% 7HH%H% )H 3H HHHIk7L%_Tp50LL5L%_Tp50LL6. JsI%_Tp0wUQm~& 3HHH c){W;&_TpHHH& /I^&_TpIQ & 3H_Tp0HHI>VE0& )`-_Tp0`-`-0& Y'#' '# J[0 ><X['#[0X[kYK0''_Tp0^H,V'#K' I /n'_Tp[0[0 +/'_Tp[0[0g"c:80'HRM7>HU/ 0D 8A2A']F# ,F-/ 3 7 9( :o01I ;o0 ?07 @c0 d h0 2 5 5 6 "6 B6 ]6divJ2(t0t0 @ A 'At 7 ( :c01I ;c0 ?07 @c0 d [0D d 9)GE gc0 j0^ kc0' lc0 d 0L3 d )GE gc0 j0^ kc0' lc0 d 0 d )GE gc0 j0^ kc0' lc0 d {0E 7 * :<01I ;<0 ?07 @c0 d 50  7 U* :K11I ;K1 ?07 @c0 d D1eC 7 * :V01I ;V0 ?07 @c0 d O0L?: A,P**HS***HH Y:*+H[0=?H'!\n+*+5+H5+=!AH=sF@H'!`B+h+s+Hs+=BH' f:,+++H+61=K=Fw++H++'" +++HC ',7,_Up0*',+0HHI_Tp0 * !2 `-!2 !2 !2 !2 +P~ 9!a(,HQ!d|?,II>!g*0>6!j6%0>!m2@0>C!pI0>!s"=0"!:5a ,!;5!!@5I!A5I'!wV-!xAn_Tp0 <;@ /MH$*""--I<$*&--II !2J$ 3---I  2>$C7%-..IB7;I0.6.IB7BL`-P.[.I[0CG Iu.{.ICN`-..I[0"Sg0-..I. U#82$g8W7BI..I.[9`-//I.B_BI7/B/I.c/`-\/g/I.nFgI//I 7H  `-9[2"1 /@"20h91./ 7H pMpMC'0 7H pMpM,.F 504b= O0int [0 h0') 0*m 0  5-:J 0" i^!8 0:f#50*  (   <1 D1 D1 K1 P1 0 0 0#F$;1b8$< [0Grem$= [0D$>u1F$C!1b8$Dh0Grem$Eh0n3$F1F$M2b8$Nt0Grem$Ot0G!$P1-4%%H0%&'08%'O0$%(.0LH%)[0 A2'%* 06%,h0#5%-50F/%42 %526%6)2%752D%8A2!%9R2?%:^21%;j2C+%Hh0?%I50%h0:%h0I&2G>&)25&A2VH&^2?D1F3H50#$%S3 Y3[0n36161O>$P [033 3A$UA[033U'03P1$i[03P1$nh03P13( 14616100F3div$Q134[0[0 $w>1J4P1$S1f4h0h02<$ [04P10TC$04[1P10#)$ [04[1P103q,$; 4 100F3J$l 4[0e $ [03A$ 5 0<$u055P155 >1<$h0[5P155[0$50{5P155[0-$  [05P1"$05>1a10N $ [05>10$W25t0t0?$ut06P1_$t0"6P155[0 $A0B6P155[0<${0]6P155@$~{0x6P1551)0)0f3) [0J*6I)* 0I* 0I-* 1I4* 19+ 0F,@27,7g, 0g3, 63>/,[0,6',6 -27 >7 .[75/18'/3[0n/6 >1BC/7 >1!/8 >1g/9 >1 F/: >1(*)/; >10N+/< >18[</= >1@`/@ >1H8/A >1P{/B >1X</DD`/FDhC/H[0p!/I[0tp$/J 2xB/M.0E?/NH08/OD;/QD/Y 2./[DP</\D(/]D7/^ 1!-/_ 0./`[0"/bD20[7 11>69[0h1699 O7D1[1C9[1[09E16_909D1 [0{9a19b1= [099[01D [099a1491 [099a14H1699e161I0:P10: >7n1(0F:[1P10:71$ [0]:]: J7zD1Q0:[1:0: P1116:0916:01N [0:[10a1471 W[0;a1a1416!;69"1V [0B;9a1B; 6F1 [0i;9a1B;1c [0;[10a1B;"1 [0;a1a1B; 1^ [0;a1B;B1 [0;a1B;C1-0 <>10:~@1a[1$<[1a11j [0?<a1a11 [0Z<a1a1o1W[1u<[1a110<a1a1=1A0<[10a1< Y=tm82Y=x62 [02 [02 [032 [0 (2 [0E2[0+72[0 2[0 2[0 2 h0(B2P10 <<10t=a1]C1e[1=[1a101m [0=a1a1031\[1=[1a1061W0=>1=0: a1,10>a1a11y07>a17> [171~0Y>a17>81[1y>[1a17>1h0>a17>[0QK150>a17>[0710>[1a10)1D[0>61 [0?a1a10'1[14?[1a101 [1U?[1a101[1v?[100I1K [0?a14{1 ,1[0?a14 1 a1?a10 1 [1?[101a1@a1a11[1&@[1a1 1 a1E@a10 1 [1d@[10"1"a1@a1a1"1"[1@[1a11a1@a1001[1@[100 1{0Aa17>G51t0'Aa17>[0z1A0HAa17>[0 32>5352C3R2=3j204+v284,24-2Y"4.2 0412 422432 4424:H0-4<h0?34=h0F4>h0<4G'0D4I50N4J504K50h,4Wh0GI4Z50<14e2)4f2 C`53C.57 >1;58 >1>I5> >1O5D >1=5E >1  5F >1(5G >10T?5H >18e5I >1@T5J >1H-5KD1P<5LD1QE5ND1R65PD1S5RD1Tr5TD1U+5[D1V5\D1W5_D1X"5aD1Y 5cD1Z{%5eD1[5lD1\C5mD1]85z>1C[0P1S5}C hB?>1CH50!6C!A6 [0!6h0!,6C!H6 [0!6h0fC6 [0'7 hD7 2>7 27 87@D/+Ti }D [7?D1DH50 tDT DT D?D1DH50t 8ThD D!8D 8!2F8D![=8D!\9 [0?V1E!9E! 9 [0!?9E38 TED8 [0jED.08 [0ED =8 [0EDJ8 [0EDC8 [0ED8 [0EDE D84>1F>1[0Di;8D#FP1P1F80IF 100DxK8DiFP1P1DA>8 [0FDh0[0.%8 [0FDF D"8h0FD8 [0FDS.:/[03 ,8 FP18 [0GP1.8 [0*GP1P13I<8 =GD3/80 UGD>1(-84 [0{GD>1[00S@8Dv8>1G>1B8 [0G[0D!;->1!O.;.>1<&504=0G M2(I< [0 H6G =76%H6Gy;=4G;HP1w<GQHP1 . p@ ] . ] b |H(  Hb  0  * HA, 0 H A, H0 00  Hy, -  I(s  =I]((QQ  `I  kI(]  I#( # I(}j '# I'# `- IH / I`-(0@$S@/UI'4 (U(x(@#)&VZj)4V)D@6*)@@|$'*U})b*~V=n*$J_Tp0_Up064H'H< HIA>//%K 7H5H+&K0K "H+HK__a&I<%K )H 3H 64!H9H<H/+I+KK "H%__nf+61KK "qI!L__a)IA RA4R<0%GL_Tp50%__aL%__b$L.L64 / <? /I;L__a I__n/%L_Tp50%__aL%__b$L'LL "IGM M "IKM64 , << /I YMpM "fI__nTF//M 7H ?pM8pM|!MM "I__n?__s/P1A|IM+N2N_Up0*N+0 "H%__pHhI"aNp@bT*aN+0"Ii "o5NI5|IM&"5a 5& 5//M,(5ZJ xp5@ iY'5IjX,Mp@ PM2.M~zM-WM/L@@ OLPBL,L@@-OL L6@')U wI,KMh@pPYMbM-p"L@W! L L"K@ KK K6@ph)U~,T@'QU?U5/,U"M@N+N  Nl j , M@@"R=M 0M #M9 5 Mu o -@"GL@@xL kL* & ^Ld ` QL "HK@@K KU Q zK mK "J@@J  J | J J -@WJD@6L@|h)Uv)Tw, M @p"S=M0M #MM-p"GL @pxLldkL ^LQL"HK @pKNFK zKmK"J @pJ0(J JJ-pJJ6@h)T})Q|,X@T XX Xwq-MVZ@Z@_ WVqVdVUZ@Z@ UUUA?0b@hYh@h@3YfdWh@h@)/,W #W{FU_Up0*U+0__aI__p&H2I"cUwU*cU+0 "IhnI$%U_Tp0%__t J8wUTU 3HHH+UU "H%__pw++g/UU "I V!V "I__xI%MV 3H164H19H V__a"I__p/__n>*VV "H#VyAVV V-VV "I.VV "I/W 7H @pM9pM-#W:W "I__i&*I#WGKWVW #W ,W#dW{W "I3I(n$&W_TpH%__t cH#WW "I#WW "IK#WW "I__x(I#W{#XX W W;&2X_Tp%__r /I^&lX 3H_Tp0164H19HIbzXX "fI/XX "fI__p[x__n[)F*XX "H ^Hc0#X0XX XXY "&I#XYY X+Y5Y "H#Y'FYLY +Y&Y )`-_Tp0164`-17`-1@C0YY "I}YY "I&Z '# J[0 ><X[64 Y '#__n Y/[08< Y?X[jAY ` [0':Z_Tp0__zk^H''[Z __x,IiZ|Z "I ^Hc0#[Z^5ZZ iZZZ "fI ^Hc0#Z ZZ Z\ZZ "H ^Hc0#ZCZ[ Z[[ "CI#[6,[2[ [{ [0fv 8+ :"\XU r[[w[ X[[(X[XU [[w[[[ X[U [[w[X[[w[[0G__i 9[0r)0[ [ w[i[0jkx 0ky 0sum  0B+g @  +]9g"Zg @ hg"[ @ [%#BX @\XMK7Y @ @+Yus7V @ @ $VBY+@ <`YY-! Yl Z`W Z,VW@ b _mWdWRJ"U@ V V2&"FU@ pUcU3'BT0@s^U?U,U"M0@N:8+Nb`N.Y@@y^YW@@;0,W #W6@2N)U)T})Q~"[@@ b[-@J\l \@J \J\. g@@ _g\Z.f@@ _f.g@@ _ h g gZ@p  ,Z0h@@k8 :h.:Z+@+@ `MZW+@+@-2W WX+@+@#%X.Y@@ TgZg 9ghgrg "fI#Zg3gg hg8}gg "CI ^Hc0#gAgg ghgg "H gh "H__r)0__i;0#gCD h0h g g h'Hh__zc$H-,!9 1phF%__pA 1R"-,}C. !CBR;C.msin(mcos&COCC''Cz.II4: ; 9 1B: ; 9 I : ; 9 I8 .?: ;9 nI2 <d.?: ;9 I< &I  I /I I4 1/I.?: ;9 n2 <d I.Gd .?: ; 9 I< : ; 9 I?<.G  : ; 9 $ > : ;9 I: ;9 I.?: ;9 nI<: ;9 .?: ; 9 nI<1RB X YW .?: ;9 n<d.?: ; 9 n2 <d: ;9 I : ;9 I2 !4: ; 9 I?<"1RB UX YW #.1nd$.?: ;9 nI<d%: ; 9 I&.?: ; 9 n<d'.?: ; 9 nI2 <d(B I)B*+/I,1RB UX YW - U.1RB X Y W /1RB X YW 011: ; 9 I2:: ;9 3.?: ;9 <454: ;9 IB6171RB X Y W 8.?: ; 9 nI<d9<: : ;9 ; : ;9 <.?: ;9 n2 <cd=: ; 9 I2 >.?: ; 9 nI<?I@4nG A4: ;9 IB1RB UX Y W C.?<nD9: ;9 E.?: ;9 nI2 <dF : ; 9 nG : ; 9 I8 H!I/ I : ; I8 J41K/L : ; 9 M : ;9 I8 2 N : ;9 I8 OI8 2 PI8 Q.?: ; 9 n<R.?<n: ; 9 S.?: ; 9 I<T<U4nG V4nGW41BX.4<dY : ; 9 I?<lZ0I [9: ;9 \.?: ; 9 n<c d]9: ; 9 ^9: ; 9 _.?: ;9 n<cd`.?: ;9 nI2 < da.?: ;9 n<b.?: ;9 n< dc.?: ;9 n2 < dd.?: ;9 nI2 <e.?: ;9 I<f4: ;9 I?<g : ; 9 Ih: ; 9 i: ;9 IBj k4: ; 9 Il 1Um.?<nn% Uo9: ; p4: ; 9 I< lq : ; 9 r/s.?: ; 9 n<cdt.?: ; 9 nI2 <cdu.?: ; 9 nI2 <dv.?: ; 9 n<w4: ; 9 nI?<x.?: ; 9 n<y9: ;9 z9: ;9 {.?: ;9 nI< d|.?: ; 9 nI2 < d}.?: ; 9 n2 <d~.?: ; 9 n<d.?n4<d.?: ;9 nI</I.: ;9 I<9: ;9 .?: ; 9 nI<.?: ;9 nI<$ > 4G:: ; 9 ; &I.?: ;9 I<.?: ;9 < : ;  : ; 9  : ; 9 : ; 9 !4nG4nG.Gd@BI4B: ;9 : ;9 .?: ; 9 IU@B4: ; 9 I.4<d.I4d 4I44: ; 9 IB1RB UX Y W 1X Y W .G: ; 9 d .?: ; 9 nI p@@U@'@S'@1@U1@@S@@U@@U@@Sp@@T@,@]1@@]@@T@@]d@w@,t##-(@@,t##-(d@w@X@@Xd@w@s@@sd@w@}x8@@}x8@(@V(@1@U1@d@Vw@@V@@V@ @0 @@vq"#1@L@0Z@d@_p@@Q@@_@d@Qd@w@_w@@Q@@_@@Q@@Q@@_p@@ wI@@ wIp@@1@@1p@@U@@S@@U@@U@@T@@U@'@S'@1@U1@@S@@U@@U@@S@@U@'@S'@1@U1@@S@@U@@U@@S@@RO@@ROd@w@S@@Sd@w@,t##-(@@,t##-(@@0@'@S'@1@U1@d@Sw@@S@@_@d@Qw@@Q@@vq"@'@S'@1@U1@d@Sw@@S@@_@d@Qw@@Q@@vq"@'@S'@1@U1@d@Sw@@S@ @V1@L@V@ @]1@L@]@ @X1@K@XK@L@w@'@S'@1@U1@d@Sw@@S@ @V1@L@V@ @]1@L@]@ @X1@K@XK@L@w@'@S'@1@U1@d@Sw@@S@ @V1@L@V@ @]1@L@]@ @X1@K@XK@L@w@'@S'@1@U1@d@Sw@@S@ @V1@L@V@ @]1@L@]@ @X1@K@XK@L@w@@q81@K@q8 @'@S'@1@UL@d@Sw@@S @@vq"# @@]L@Z@]w@@] @'@S'@1@UL@d@Sw@@S @@vq"# @@]L@Z@]w@@] @'@S'@1@UL@d@Sw@@S @@vq"# @@]L@Z@]w@@] @'@S'@1@UL@d@Sw@@S @@vq"# @@]L@Z@]w@@]@@ sx8Z@a@ sx8@@ sx8@@XZ@a@X@@XZ@a@ sx8Z@a@XZ@a@ sx8Z@a@Xd@d@Sd@d@S@@a @+@ @+@ @+@ @+@ @ @ @ @+@@ !@)@ @@ +@-@0-@@\@@S@@\!@)@\@@\+@-@ -@>@^@@^!@)@^@@^-@>@^]@@^]!@)@^]@@^]-@>@^@@^!@)@^@@^-@>@@@@@U@@!@)@@@-@>@^@@^!@)@^@@^-@>@@@@@U@@!@)@@@-@G@-@G@^-@5@-@G@-@G@^-@5@@@@@-@@Q]@)@Q]@@Q]@@S@@s+@+@+@+@+@+@@@@@@@@@@@ @@a@@ @@@@@@U@@P@@p@@P@@U@@@@@@U@@@@@!@@@@@@!@@@ @u8@@U@@@@ @u8@@U@@@@ @u8@@U@@@@@@@@@@@@U@@@@@@@@@@ @u8@@U@@@@ @u8@@U@@@@ @u8@@U@@@@@@L@p@b@Ip@z@@@@@@@@@@@h@@@@@@@@@@@@@@@@@ @8@L@ @@L@Z@@@@@Z@h@@@@)@@@@@@@@@@@ @ @@+@@@@@@@@@ @ @@+@ @@+@0@0@@@@@@ @@0@0@0@@@@@@ @@0@0@0@>@@@0@0@0@5@@@@@@@@@@@@@@@p@@@)@ /usr/include/c++/9.1.0/bits/usr/include/c++/9.1.0/ext/usr/include/c++/9.1.0../../../manual/clients/usr/include/c++/9.1.0/x86_64-pc-linux-gnu/bits/usr/include/c++/9.1.0/debug/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/include/usr/include/usr/include/bits/usr/include/bits/typesvector.tccstl_vector.hstl_algobase.hnew_allocator.halloc_traits.hnewstl_uninitialized.hstl_iterator.hvector.cppallocator.hmove.hstl_algo.hcmathcomplexstl_numeric.hstl_construct.htype_traitsc++config.hstl_pair.hstl_iterator_base_types.hdebug.hexception_ptr.hcstdlibalgorithmfwd.hcwcharcstdintclocalecstdiobasic_string.hcwctypepredefined_ops.hnumeric_traits.halloc_traits.htype_traits.hstddef.hstdlib.htypes.h stdint-intn.h stdlib-float.h stdlib-bsearch.h math.hwint_t.h __mbstate_t.h mbstate_t.h __FILE.h struct_FILE.h FILE.h wchar.hstruct_tm.h stdint-uintn.h stdint.hlocale.htime.h__fpos_t.h stdio.hsys_errlist.h stdio.h errno.hwctype-wchar.h wctype.hfunctexcept.h p@ u yt2<t<<A 0K)s<}) <}ft^X|t^X{X=KKX J<|t^|} #f|tX{  tX  @ /J </< ./  ./J ~~  F/fX  | "aX}XG  ! 4]?    | J  ~ {4z+ afwXlzXX  ! ]lXz/JIX |X} X @  X @||XX} X @_ZNSt6vectorIdSaIdEEC4ERKS1_RKS0_int_p_sep_by_space~_Vector_implfgetcint8_t_ZNSt7complexIeEC4Eeesize_t_ZNSt6vectorIdSaIdEEC4EOS1_RKS0_St17integral_constantIbLb1EEfgetstm_hour__is_signed_ZNK9__gnu_cxx13new_allocatorIdE7addressERKd_ZNSt12_Vector_baseIdSaIdEE17_M_create_storageEm_ZNSt6vectorIdSaIdEE4dataEv_ZNSt6vectorIdSaIdEE15_M_erase_at_endEPd_Vector_base__numeric_traits_integermbrlensin_M_fill_assign_IO_codecvt_ZN9__gnu_cxx24__numeric_traits_integerIiE5__maxEuint_fast64_tsigned char__uint_least8_t_S_nothrow_movecomplex_M_deallocate_ZNSt7complexIeEpLEe_ZNKSt7complexIdE5__repEv_IO_save_endint_fast8_t__off_t_S_on_swaplldiv_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEC4ERKS1_wcscspnlocaleconv_S_check_init_len_M_addref_M_get_ZNSt7complexIdEdVEd__int64_tstrtold_ZSt7nothrow_Categorystrtoll_IO_write_basetmpnam_ZNSt6vectorIdSaIdEE12emplace_backIJdEEEvDpOT_~_Vector_basevector >_ZNSt20back_insert_iteratorISt6vectorIdSaIdEEEdeEv__lhs_ZNSt12_Vector_baseIdSaIdEEC4Em_lockat_quick_exitint_curr_symbol_ZNSt12_Vector_baseIdSaIdEEC4Evtm_gmtoffnew_allocatorenable_if__lastcend__throw_length_error_ZNSt6vectorIdSaIdEEixEmint_p_sign_posntypen_cs_precedes_ZNSt7complexIfEC4Eff__compar_fn_t_ZNSt6vectorIdSaIdEE17_S_check_init_lenEmRKS0__IO_save_basembrtowc_ZNSt6vectorIdSaIdEE8_M_eraseEN9__gnu_cxx17__normal_iteratorIPdS1_EES5__Args~atoi_ZNSt7complexIdEpLEd_ZNSt6vectorIdSaIdEE4backEv_ZNSt12_Vector_baseIdSaIdEE17_Vector_impl_dataC2Evwcsxfrmatoll_ZNSt6vectorIdSaIdEED4Ev_ZNSt15__exception_ptr13exception_ptrC4EPv_M_currentstring_literalsmovefgetpos__pos_ZNSt6vectorIdSaIdEE7reserveEmwcscollclearerr_ZNKSt17integral_constantIbLb1EEcvbEv_ZSt11__addressofISt6vectorIdSaIdEEEPT_RS3__cur_columnuint_fast32_tsys_nerrpositive_sign_ZSt7forwardIdEOT_RNSt16remove_referenceIS0_E4typeE_ZNK9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEE4baseEv__wch_M_finish__uint8_tback_insert_iterator_M_starttype_inforebind__relocate_a_1atof_ZN9__gnu_cxx25__numeric_traits_floatingIdE16__max_exponent10E_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEmmEi_ZNSt6vectorIdSaIdEEaSERKS1_atolconst_reverse_iterator_sys_nerr_ZNSt6vectorIdSaIdEE14_M_move_assignEOS1_St17integral_constantIbLb0EE_ZNSt6vectorIdSaIdEE21_M_default_initializeEm_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEmmEv_ZSt8_DestroyIPddEvT_S1_RSaIT0_Ecomplex_ZNSt7complexIfEmLEfwcsrchr_ZN9__gnu_cxx13new_allocatorIdE9constructIdJdEEEvPT_DpOT0___niter_base_ZNSt12_Vector_baseIdSaIdEEC4ERKS0_mon_decimal_point~new_allocator_ZNSt12_Vector_baseIdSaIdEE12_Vector_implC4EOS0_long int_ZNSt6vectorIdSaIdEE13shrink_to_fitEv_ZNSt15__exception_ptr13exception_ptraSERKS0_memmove_ZNSt6vectorIdSaIdEE6insertEN9__gnu_cxx17__normal_iteratorIPKdS1_EEmRS4_tm_isdst_Vector_base >nothrow_t__numeric_traits_integervwprintf__position_M_default_initialize_ZNKSt6vectorIdSaIdEE2atEmallocator_traits >wctomb__digits10_IO_markerfpos_tmainint_n_cs_precedeswcschrtowctrans_M_fill_initializerand__alloc_traits, double>__diffmaxwcstold__FILEmbstate_t_ZNSt12_Vector_baseIdSaIdEED2Ev__rep_ZNKSt7complexIdE4realB5cxx11Evnullptr_tinsert_Value_M_get_Tp_allocatoruint_least64_t_ZNSt7complexIfEC4ERKS_IdE../../../manual/clients/vector.cpptm_ydaystrtoull__swappable_detailsuint8_toperator*operator+_ZNSt6vectorIdSaIdEE4rendEv_M_allocate_IO_FILEaccumulate<__gnu_cxx::__normal_iterator >, double>__timezoneremovemin_IO_wide_data_ZSt3cosIiEN9__gnu_cxx11__enable_ifIXsrSt12__is_integerIT_E7__valueEdE6__typeES3___valuewctype_t_ZNSt12_Vector_baseIdSaIdEE13_M_deallocateEPdm__isoc99_swscanffgetwc_ZNSt12_Vector_baseIdSaIdEE11_M_allocateEmcosgetwchar_M_default_append__uint_least16_tshrink_to_fit__numeric_traits_floating_ZN9__gnu_cxx25__numeric_traits_floatingIfE16__max_exponent10E_ZNSt6vectorIdSaIdEE14_M_fill_assignEmRKdbooln_sep_by_spacefclosewmemchrchar16_t_ZNSt12_Vector_baseIdSaIdEE12_Vector_implC4Evreverse_iterator<__gnu_cxx::__normal_iterator > > >int32_t_ZN9__gnu_cxx24__numeric_traits_integerIsE5__maxE_ZNSt6vectorIdSaIdEE14_M_emplace_auxEN9__gnu_cxx17__normal_iteratorIPKdS1_EEOd__isoc99_fwscanf7lldiv_twcscmp_M_emplace_auxswprintf_OIter_ZNSt6vectorIdSaIdEE14_S_do_relocateEPdS2_S2_RS0_St17integral_constantIbLb0EE_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEppEi_ZNSt15__exception_ptr13exception_ptr9_M_addrefEv__tznamewcspbrkrethrow_exception_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEppEv_ZNSt6vectorIdSaIdEE8_M_eraseEN9__gnu_cxx17__normal_iteratorIPdS1_EEvalueallocator_S_do_relocate_ZN9__gnu_cxx13new_allocatorIdEC4Ev_ZNSt6vectorIdSaIdEE11_S_max_sizeERKS0_char_S_max_size_S_propagate_on_swap_Destroy_Allocatorldivoperator std::integral_constant::value_type_ZNKSt6vectorIdSaIdEE8capacityEvwctype_ZSt8_DestroyIPdEvT_S1_back_inserter >wcstoduint_least32_t__rhs_ZNK9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEdeEvwcsncmp_IO_lock_t__uint16_t_ZNSt17integral_constantIbLb1EE5valueE_ZSt13back_inserterISt6vectorIdSaIdEEESt20back_insert_iteratorIT_ERS4_n_sign_posnwmemmovewcstol_chainlong double_M_range_checkother__builtin_memcpy5div_ttimezonegetcimagallocate__mintm_min_ZNSt6vectorIdSaIdEE5eraseEN9__gnu_cxx17__normal_iteratorIPKdS1_EES6_clear_IO_read_ptrwscanf_M_erasemon_thousands_sepungetwcfp_offset_ZSt3maxImERKT_S2_S2__ZNSt6vectorIdSaIdEEC4EOS1_RKS0_St17integral_constantIbLb0EE_ZN9__gnu_cxx24__numeric_traits_integerIiE5__minEwctrans_t_ZNSt16allocator_traitsISaIdEE37select_on_container_copy_constructionERKS0_iterator_ZSt12__relocate_aIPdS0_SaIdEET0_T_S3_S2_RT1_stdinoperator-__builtin_unwind_resume__closure_ZNSt6vectorIdSaIdEE17_M_realloc_insertIJdEEEvN9__gnu_cxx17__normal_iteratorIPdS1_EEDpOT_sys_errlist_ZNSt7complexIeEmIEeint_p_cs_precedespointer_ZNSt16allocator_traitsISaIdEE8allocateERS0_mPKvreverse_iteratorint_least32_t_ZNSt6vectorIdSaIdEE17_M_default_appendEm_ZNSt6vectorIdSaIdEE14_M_move_assignEOS1_St17integral_constantIbLb1EEwcstoulldeallocate_ZN9__gnu_cxx25__numeric_traits_floatingIeE16__max_exponent10E_ZNSt7complexIeE4realEe__builtin_cabs_ZNSt20back_insert_iteratorISt6vectorIdSaIdEEEppEi_G_fpos_t__uint_least64_t_ZNKSt6vectorIdSaIdEE5frontEv_M_move_assignwcscpy_ZNSt20back_insert_iteratorISt6vectorIdSaIdEEEppEv_ZNKSt6vectorIdSaIdEE5beginEvvswprintfreserve_ZNKSt7complexIfE4realB5cxx11Evintegral_constantstrtouloperator std::integral_constant::value_type_ZNSt7complexIdE4imagEditerator_traits_ZN9__gnu_cxx13new_allocatorIdE10deallocateEPdmabswmemset_ZNSt15__exception_ptr13exception_ptr10_M_releaseEv_ZNSt15__exception_ptr13exception_ptr4swapERS0__ZN9__gnu_cxx13new_allocatorIdED2Evnegative_signfwideselect_on_container_copy_constructionfwprintf_ZNSt7complexIdEC4ERKS_IeE_S_nothrow_relocate__normal_iterator > >_M_shrink_to_fit_flags_ZNSt6vectorIdSaIdEE19_S_nothrow_relocateESt17integral_constantIbLb0EE_ZNSt6vectorIdSaIdEE18_M_fill_initializeEmRKdprogram_invocation_name__cxa_exception_type_offset_ZSt14__relocate_a_1IddENSt9enable_ifIXsrSt24__is_bitwise_relocatableIT_vE5valueEPS2_E4typeES4_S4_S4_RSaIT0_E_M_check_lenfront__niter__old_start_Destroy_ZNSt6vectorIdSaIdEE6insertEN9__gnu_cxx17__normal_iteratorIPKdS1_EEOd_Containerputwchardouble_t_S_propagate_on_copy_assign_ZNSt15__exception_ptr13exception_ptraSEOS0__ZNSt6vectorIdSaIdEE5eraseEN9__gnu_cxx17__normal_iteratorIPKdS1_EE_ZNK9__gnu_cxx13new_allocatorIdE7addressERdwmemcmpconst_reference_ZNSt6vectorIdSaIdEE6insertEN9__gnu_cxx17__normal_iteratorIPKdS1_EERS4__ZNSt7complexIdEC4ERKS_IfE_ZNSt6vectorIdSaIdEE15_S_use_relocateEv_ZNSt12_Vector_baseIdSaIdEE17_Vector_impl_data12_M_swap_dataERS2__ZNSaIdEaSERKS__ZNK9__gnu_cxx13new_allocatorIdE8max_sizeEvgetenv_ZNKSt6vectorIdSaIdEEixEmuint_least16_tbacklong unsigned int__builtin_memmove_ZNSt12_Vector_baseIdSaIdEE19_M_get_Tp_allocatorEvlldiv_t_ZNSt15__exception_ptr13exception_ptrC4Evemptyreference_M_release_ZNSt12_Vector_baseIdSaIdEEC4EmRKS0_nothrow_flags2address__gnu_debug__uint_least32_t6ldiv_t_IO_read_baseoperator[]_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEC4Evcomplexint_least64_t__complex_abs_ZNSt16allocator_traitsISaIdEE8max_sizeERKS0_vfwprintfpush_backthis_Znwmchar32_t_unused2wcsstrwcstombsmax_sizeftellvswscanfvalue_type_ZNSt6vectorIdSaIdEE14_S_do_relocateEPdS2_S2_RS0_St17integral_constantIbLb1EEdifference_typepiecewise_construct_t_ZNSt20back_insert_iteratorISt6vectorIdSaIdEEEC2ERS2__ZNKSt15__exception_ptr13exception_ptr6_M_getEv_ZNKSt6vectorIdSaIdEE5emptyEv__float128_ZNSaIdED4Ev_ZNSt7complexIfEaSERKS0__ZNSt6vectorIdSaIdEE4swapERS1__ZNSt6vectorIdSaIdEE6assignEmRKd_old_offset_ZN9__gnu_cxx24__numeric_traits_integerIcE5__maxE_ZNSt17integral_constantIbLb0EE5valueE_ZNKSt6vectorIdSaIdEE14_M_range_checkEm_ZNSt12_Vector_baseIdSaIdEE12_Vector_implC4EOS2_fsetpos_ZN9__gnu_cxx14__alloc_traitsISaIdEdE27_S_propagate_on_move_assignEvint_n_sep_by_space_ZNK9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEptEv__relocate_a >_ZNKSt17integral_constantIbLb0EEcvbEv_ZNKSt6vectorIdSaIdEE8max_sizeEv__addressof >_ZNKSt12_Vector_baseIdSaIdEE19_M_get_Tp_allocatorEv__builtin_cos__old_finishgenerate_n >, int, main():: >_ZN9__gnu_cxxneIPdSt6vectorIdSaIdEEEEbRKNS_17__normal_iteratorIT_T0_EESA___args#0_ZNKSt7complexIdE4imagB5cxx11Ev__uint32_t__stack_chk_fail_ZNSaIdEC2Evlong long int_Tp_alloc_type__mbstate_t__enable_if_t__max_exponent10wmemcpy_M_copy_datacomplex doubletm_mon_ZNSt12_Vector_baseIdSaIdEE17_Vector_impl_dataC4Ev_ZNSt15__exception_ptr13exception_ptrC4ERKS0__ZNSt16allocator_traitsISaIdEE10deallocateERS0_Pdm__builtin_sin_freeres_list_ZN9__gnu_cxx14__alloc_traitsISaIdEdE17_S_select_on_copyERKS1__InputIteratordoublembtowc_IO_write_end_ZNKSt6vectorIdSaIdEE5crendEv_ZNSt7complexIeEmLEeresizeoperator()_ZN9__gnu_cxx24__numeric_traits_integerIsE5__minEuintmax_tpiecewise_constructwctobgp_offset_ZNSt7complexIfEmIEf_ZSt4moveIRdEONSt16remove_referenceIT_E4typeEOS2___normal_iterator_ZN9__gnu_cxx24__numeric_traits_integerImE8__digitsE_ZNKSt6vectorIdSaIdEE6cbeginEv_ZN9__gnu_cxx14__alloc_traitsISaIdEdE27_S_propagate_on_copy_assignEvfloat_ZN9__gnu_cxx13new_allocatorIdEC4ERKS1_decltype(nullptr)exception_ptrp_sign_posn_M_insert_rval__intmax_t_IO_buf_base_ZNSt7complexIdE4realEdreal_ZNKSt6vectorIdSaIdEE3endEvfalse_type_ZSt3sinIiEN9__gnu_cxx11__enable_ifIXsrSt12__is_integerIT_E7__valueEdE6__typeES3__ZNSt7complexIfE4realEfperror_ZNKSt6vectorIdSaIdEE4rendEvoperator new_ZN9__gnu_cxx13new_allocatorIdE8allocateEmPKvintptr_tqsort_ZNKSt6vectorIdSaIdEE4backEvwcsspnoperator booleraseunsigned intcomplextznamecrbegin_ZNSt6vectorIdSaIdEE19_S_nothrow_relocateESt17integral_constantIbLb1EE__pad5setvbuf_ZNSt7complexIeE4imagEe_ZNSt6vectorIdSaIdEEC4EmRKS0_operator=_ZNSt12_Vector_baseIdSaIdEED4Ev_ZNSt7complexIdEmLEd__int128 unsigned__destroysystemint_fast16_tint_frac_digitsoverflow_arg_arearenamerbegin_ZNSt12_Vector_baseIdSaIdEEC4ERKS0_OS1_forwarditeratorprogram_invocation_short_namerebind_alloc_Unwind_Resume_ZNSt7complexIfEdVEf_S_use_relocate_modeoperator delete~exception_ptrdecimal_pointunsigned chargetchar_codecvt_ZNSt6vectorIdSaIdEEaSESt16initializer_listIdE__elems_before__count__int_least8_t__gnu_cxx_ZNSt16allocator_traitsISaIdEE8allocateERS0_m__exception_ptr__alloc_ZNKSt17integral_constantIbLb0EEclEvsetbufoutput_iterator_tag_ZNK9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEmiEluint_least8_tfeof_ZNSt6vectorIdSaIdEEC4ESt16initializer_listIdERKS0__ZNK9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEixElint_least8_t__unknown___M_implcomplex long double_ZNSt6vectorIdSaIdEEC4Ev_ZNSt6vectorIdSaIdEE5frontEvbtowc_ZNSt7complexIeEaSERKS0___isoc99_wscanfintmax_t_ZNSt6vectorIdSaIdEE8pop_backEv_ZNSt6vectorIdSaIdEE5beginEvfloat_tputwc_ZN9__gnu_cxxmiIPdSt6vectorIdSaIdEEEENS_17__normal_iteratorIT_T0_E15difference_typeERKS8_SB__ZNSt6vectorIdSaIdEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPdS1_EEmRKd_ZNSt6vectorIdSaIdEE6rbeginEv__enable_if_ZNSt7complexIfEpLEf_ZNKSt7complexIfE4imagB5cxx11EvFILE_ZNSt12_Vector_baseIdSaIdEE17_Vector_impl_data12_M_copy_dataERKS2__M_realloc_insert__numeric_traits_integer_Distancebeginint_fast32_t__numeric_traits_floatingldiv_t_ZNSt6vectorIdSaIdEE6resizeEmRKdtm_mdaywcsncpysigngam__wchb_ForwardIteratorbsearch_ZNSt12_Vector_baseIdSaIdEEC2Ev_ZNKSt17integral_constantIbLb1EEclEv_ZNKSt7complexIfE5__repEv__int8_t__first_ZNSt12_Vector_baseIdSaIdEE12_Vector_implC4EOS0_OS2_size_ZNSt20back_insert_iteratorISt6vectorIdSaIdEEEC4ERS2_long long unsigned int_M_valueswapreg_save_area__allocmax_ZN9__gnu_cxx24__numeric_traits_integerIlE5__maxE__it__uint64_t_M_erase_at_enduint16_twcstollallocator_type_ZNSt6vectorIdSaIdEED2Ev~vector_ZNSt21piecewise_construct_tC4Evmax_ZNSt15__exception_ptr13exception_ptrC4EDn_ZSt17rethrow_exceptionNSt15__exception_ptr13exception_ptrE_ZNSt12_Vector_baseIdSaIdEE12_Vector_implC2Evconst_iterator_ZNKSt6vectorIdSaIdEE4cendEvtm_sec_ZSt12__niter_baseIPdET_S1_wcsrtombs__int_least16_tp_sep_by_space_S_propagate_on_move_assign_ZNSt6vectorIdSaIdEE6assignESt16initializer_listIdE_Iterator_freeres_buftm_wday_M_fill_insertoperator++_ZSt20__throw_length_errorPKc_ZSt3minImERKT_S2_S2__ZNSt6vectorIdSaIdEE5clearEvmbsinitswscanfvector__digits_ZNKSt6vectorIdSaIdEE6rbeginEvwcstofintegral_constantwcstok__cxx11int_least16_t__fpos_tcomplex_literals_ZSt13__complex_absCd_M_end_of_storagequotoperator+=_ZNSt12_Vector_baseIdSaIdEE12_Vector_implD4EvGNU C++14 9.1.0 -mtune=generic -march=x86-64 -g -O2cbegin__int16_t_IO_backup_basesetlocale_shortbuf_S_select_on_copy_ZNK9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEplEl_Vector_impl_dataoperator- >remove_reference_ZNSt6vectorIdSaIdEEC4EOS1_RKS0_fwscanfwint_t_ZnwmPv_ZNSt12_Vector_baseIdSaIdEEC4EOS1_RKS0_~allocator__int128__off64_t_ZNSt6vectorIdSaIdEE14_M_insert_rvalEN9__gnu_cxx17__normal_iteratorIPKdS1_EEOdcontainer_ZNSt7complexIeEC4ERKS_IdE_ZN9__gnu_cxx13new_allocatorIdED4Ev_ZNSt20back_insert_iteratorISt6vectorIdSaIdEEEaSEOd_ZNKSt15__exception_ptr13exception_ptr20__cxa_exception_typeEv_ZNSt20back_insert_iteratorISt6vectorIdSaIdEEEaSERKdfopenallocatorwctrans_ZNSt12_Vector_baseIdSaIdEE17_Vector_impl_dataC4EOS2_thousands_sep_M_create_storage_ZNSt6vectorIdSaIdEE6insertEN9__gnu_cxx17__normal_iteratorIPKdS1_EESt16initializer_listIdEmblen__gen_Generatorrewind_wide_data_IO_buf_end_ZNSt9nothrow_tC4Ev_ZNSaIdEC4Ev_markerswcslen_ComplexT_ZNSt7complexIfE4imagEfstrtodoperator*=strtof__resultuint_fast8_t_Allocstrtol__debugfrac_digitsferrorcurrency_symbol_ZN9__gnu_cxx14__alloc_traitsISaIdEdE15_S_nothrow_moveEvstderrshort int_Destroy_aux_M_exception_objectuint64_t_ZNSt7complexIdEaSERKS0_wcsftime_ZNKSt6vectorIdSaIdEE4sizeEv_ZNSt7complexIeEC4ECe_ZNKSt6vectorIdSaIdEE12_M_check_lenEmPKc__state_ZNSt6vectorIdSaIdEEC2Evcrendfseekint16_tatexit_ZNSt6vectorIdSaIdEE6resizeEminitializer_list_ZNSt12_Destroy_auxILb1EE9__destroyIPdEEvT_S3__ZNSt7complexIeEC4ERKS_IfE_ZNKSt15__exception_ptr13exception_ptrcvbEv_ZNSt6vectorIdSaIdEEC4EOS1___int_least64_t_ZNSt7complexIdEC4ECd_vtable_offsetmon_grouping_ZNSt7complexIfEC4ERKS_IeE_ZN9__gnu_cxx14__alloc_traitsISaIdEdE10_S_on_swapERS1_S3__sys_errlistnew_allocator__uintmax_templace_back_ZNSt6vectorIdSaIdEE11_S_relocateEPdS2_S2_RS0_pop_back_ZN9__gnu_cxx14__alloc_traitsISaIdEdE20_S_propagate_on_swapEvcomplex floatwcscat__type__new_finish__normal_iterator > >tmpfile__init11__mbstate_t_ZNSt6vectorIdSaIdEE3endEv_ZNKSt7complexIeE5__repEvback_insert_iterator > >_ZN9__gnu_cxx13new_allocatorIdEC2Ev_ZNSt12_Vector_baseIdSaIdEE12_Vector_implD2Evptrdiff_tsrand__swappable_with_details__daylightcapacitytm_zone_ZNSt6vectorIdSaIdEE2atEm_M_swap_data_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEpLEl_ZNSt7complexIeEaSEeungetcoperator-=_ZNSt7complexIfEaSEf_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEmIEl_Vector_implmemcpyvwscanfwcrtomblconvoperator!= >_ZdlPv_IO_read_endcabsmbstowcswcsncat__numeric_traits_integergetdate_err_ZNSaIdED2Evoperator--uint32_t_S_always_equalint_n_sign_posnconstructoperator->_fileno_Referenceuint_fast16_tfputws_ZNKSt7complexIeE4imagB5cxx11Ev_ZNSt7complexIdEC2Edd_ZNSt6vectorIdSaIdEEC4EmRKdRKS0_mbsrtowcs__numeric_traits_floating_S_relocate_ZNSt6vectorIdSaIdEE9push_backEOdfgetws__int_least32_tliteralsdiv_t_ZNSt15__exception_ptr13exception_ptrD4Evget_allocator_ZNSt7complexIdEC4Edd__max_digits10_ZSt10accumulateIN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEEdET0_T_S8_S7_fputwcp_cs_precedes__numeric_traits_integertm_year_ZNSt15__exception_ptr13exception_ptrC4EOS0_short unsigned intstdout_ZNKSt7complexIeE4realB5cxx11Ev_ZNSt7complexIdEaSEdbaseconst_pointerfreadint_fast64_t_ZNSt7complexIfEC4ECf__opsvfwscanf_IO_write_ptr_ZNSaIdEC4ERKS__ZNSt12_Vector_baseIdSaIdEEC4EOS0_reverse_iterator<__gnu_cxx::__normal_iterator > > >/home/milian/projects/kdab/rnd/hotspot/3rdparty/perfparser/tests/auto/perfdata/vector_static_gcc_ZN9__gnu_cxx17__normal_iteratorIPdSt6vectorIdSaIdEEEC2ERKS1__ZNKSt12_Vector_baseIdSaIdEE13get_allocatorEv_ZNSt6vectorIdSaIdEEC4ERKS0___int32_tint64_t__in_chrg_ZNSt16allocator_traitsISaIdEE9constructIdJdEEEvRS0_PT_DpOT0_daylight_ZNSt6vectorIdSaIdEE9push_backERKdgetwctrue_type_ZNKSt6vectorIdSaIdEE4dataEv_ZNSt6vectorIdSaIdEE16_M_shrink_to_fitEviswctype__maxassigngroupinguintptr_toperator/=_ZNKSt6vectorIdSaIdEE7crbeginEv__lenwprintf_ZNSt12_Vector_baseIdSaIdEEC4EOS1_data_ZN9__gnu_cxx14__alloc_traitsISaIdEdE15_S_always_equalEv_ZN9__gnu_cxx24__numeric_traits_integerIlE5__minEfflush_ZNSt7complexIdEmIEdrend_ZNSt6vectorIdSaIdEEaSEOS1___new_start_ZNSt6vectorIdSaIdEEC4ERKS1_quick_exit_Pointerwchar_ttypedef __va_list_tag __va_list_tag_ZN9__gnu_cxx3divExx_Sizeconst_void_pointer_ZNSt7complexIeEdVEe_ZNSt12_Vector_baseIdSaIdEE12_Vector_implC4ERKS0_remove_referencewcstoul_ZSt3absIdET_RKSt7complexIS0_Efreopensize_type GNUgold 1.16" >K5LB@W@j@L،L0@L0L@@,@BU@@ @ @ !@F@y!@@ %@@ )@<[@0f @)1@@L@ @R 02@: @Rm0@z LL> @A @` @ @ @ @Gc @"! @B @ @ @  @3 @ @@@%'@z9@K@]@ o@h @ @ @ @` f@y f@y g@3 @m  @T0 @I @@Y @i @Y| @G `@g @S 0@[ @ ]L @s 0@K @r @7, @@.N p@sZ @} @n  @ 0@ 0@ @q @d `@ @| @@# p@z @ @z( @;8 @H eL@e @q `_L` @ @A>D ZA YA DA XA 0EA@ VA pNA==QAHNP^AnpyA[zyA[ ȣI IX УI I xI I I hI I I0ABx@A ~@&AJ:@S`A|mLA@pA@AV@ pA(@ 0AuBLU@l A~@A@A@@A*@>@]AsAAAh@AX@`AX@AB@A.A"?AqRPAnLL LL@AAKA+A pI$L0@CAfL(sLLLB I0 BL I @!B-mI6hL;`LIBvRBegXLr@L8LPLHLL8LL8L!L, @AABOAB_ Io LtLxL0LL(L8LLQB @J7 I J J7 J J WI  SI J J ! J PL'`L-@^BCpLQhLa I z ILsBm2@P@O@O @OB `LB' 0IAo@PZB7y0Bo@PB@BpBR@QB1@BZ%B7BgRBg PI oIALL`B@BLLBLL2LdLw@L8L`L8LL8B pILp4LBB&L1B>BJP8L`BRp@BC} I BG(L H0L IBB^`BLB' XI ABeN HI h B:}`B0BXCLLL I LpC-C%L;3CF06CT1CxcC@x C C  8 xI  I  hI LPC% I ,C8 I R I l-C> /C ȸI2C3Cu 8I  (I @0>C<p>C- IG0ACBY Is IPGCT طI ]IUCEVCUpVCUVC0WC5pWC_"WCJ9 YCGM0`CaP`C5n`Ci{aCaC`bC cCUcCHcCdC5dC5 E  ظI - pEE  @J T  In EX @ @L  Lh Lh  I E  I  `I !pE!EP$!PEbB!pEL! I f!ESw!PL!L!EM!EF!Lx! Lx! L! J," I " I8"`LM"Lb"Lw"(L" I" I"poI"0pII-pIe"0L"F?# 0I#pF L,#$F=# 0IP# PIj# I-pI)z#'F#(F\# )FQ# FI#,F#-F# I#L $ @"J$8L+$0 H0H91PH:1H 1uI{'1H-0vI81`L @LF1HR1 h]1 ;Ik1 I{1 J1 J10HO *H10HG1@(L1 I1@-PwI`1,L0LHL4L1L 2pHO2H:2DL2`L +2HL+$@L62@HIH2@M2LhZ2Hf2His2Lw2pH2HU2pHT2HL2@L2PL2XL2 L 2L2 I 2 J3H,!3 0J;3IJ3 I d3 I~3I'3 PJ3`L3 `J30AI{30BI 3pBI30CI"40DI4DI;%4 J?4TIP4 Ji4 @I 4`^I34^IhI @@iIB@4 (ML4p@40@4wI4L4L4L 5AD5A (5AY65@A D5PAV5pA d5A 5A 5A#5A 5A 5A5 A/6PA%60A46AN60A!f6`Ax6A6A!6A/6A6A 6A#7A#.7A F7 A&Y7PA3j7 B67 07BW7BF7`B7 I7 L7 I 8BD 8 B"8L818(BA8mIR[8p+BYk80nI}8PBY8QB6 8 [B8jL 8@\BS8\B 8\B8@"8@L9@aB. 9pdB 9dB9`eB+9tL=9hBB9 hBO9pLc9@iB%u9pjB9(L9jB9jB9jB9oB9oB9qB9PrB9tB :`uB: vB(:0LD:zBO:zBV:@{BBi:{Bz:|Bf:|Bf: ~B: ~B:B:B>:0B:B:B:`B;B; L2;LG;LW;ЛBl;B{;PB,;B;B;B;B ;B3;L; L;B<0B <B-<B;<гBK<B%Y<Bi<йB'<0B< B<лB&<B<B<B<`B <pB=`L=B&=Ba2=BI=BN^=Bpi=@Bu=`B'}=BY=B=B_= B=@Bn=B=Bj=PB9=PB*>pBw$>B2>B/D>@BR>PBm>B!>B>B >B>B >B>Bd>PBO>B>@L ?L?L"?ȧL,?B^>? BO?B_?`Bq?L?L?8C?9C?:C?:CG?;C/ @AC@`BCO6@CCE@GC U@SCd@UCw@ UCE~@ VCU@ pVCU@ VC@VC@@ 0WC5@ pWC_@p\C@ 0`C@ aC@ aC@ cCH@ dC5@eCI@`yCA|Ci AC?.ACY=A CiMAC]ApClAC#zAC ACACMACACAC>A C A@C)A )Dx+ BTD BTD*4BD+IBD hBD?BD?BpD&"BD6!BDBEbB0(E*C`*E Cp,E$#C.E4C0EBC02EPC3E^C`7ElCP8EzC@9ECPECiE#C0oECuECyEC|EcC0EDИE!DE?1D JFDКEtdDPE }D`E,DEDНE1DНE1DE D ED EE`E,3E E KE0E3cEpE EEEEE0E3E`E EpE>FE &FEFFEeFpE>FЪE7F EF@EFPE.FEFE GЭE;$GE9G0EUXG`E-hG`LGpLGhLGxLG@LGPLHHL'HXLDHLhHLxHE HE"H0EJHEyHEH jL HйEH`EtIEeIPEXIE IE%.IEV>I0ETFI0ETPIETYIETdIE.kIE.wIE.I EI EI EIEIEIEI`E,I`E,IESIE*I EIEWJE JE0JEDJEVJ`E,fJE,wJE2JE2JE2JEJE1JEJJ0EJ0EJE%JE%J@E%JE`J EqKE K0EKPEK P`C5&K`E3KEEK`EMVKEMiKEuK EQKE(KE%KEHK0E'K`EKEZKE]LL(L@E3LE]HLEWLE|lLEyLLLELE LE0L`E!LE LFM F!M F 8MLNMxLZMhLfML{MLMp FMFM FZMFM@LMPLMF~MFNp F(NtL5NP#FMN`LaN1FMsN1FNFNpFNFN0FNFNFOЖF&O I >O )J UO *JhOFrOL8O`rIOpFAO@LhOLhO IOFQO F P F]PF^,PFIPtI`P uPjLP `HJP `>JP `8JP `DJP 2J\P 8JHQ 7JH)Q @7JHDQ 6JD_Q 6JL{Q 6JDQ 5JLQ `5JLQ 5JDQ 4JLR @4JLR 3JL8R 3JSR `2JnR IR IR IR IRLRFR`LRFTR`FQRF SpF4SF2$SF5S0FY>SF0ISFTSFiSF{SFSFS J#S `JSFSFSF|/SQG-SGTG"TG_6TГGGTpG STG$\TG4nTPG5TG5TКGlT@GTGTGoTGuTGUGXUG?6U0GrNUGgdU GZmUGZzUGUФGU{LUGUPGUGEVPG V G5V 0G5VpGu*VG3VG:VGLVG[VpGjVpGyV@GV`GVG VG VGVGVGVGVGVGgVGW GWGBW0G "W@G .WG9:W@G9DWG-OWG[WPGgWPGqW`G}W G%WPG W`G WpG WG WGTWGTWG\WG\WPGBWGWpG\WG XpGMXG&XL3XHAXH}TX HcXHrX&H" X@1HX2HX2H5X6HX6H1X7HEYP7Hh!Y7H4Y8HHY@PH]Yp]HxY^HY^HYp_HY`HiY`HNY`HQY0bHYlHZmHeZ0nH,ZrH}BZsHVZtHEeZPuHtZvHwZ{HyZHZHZHZЂH[H [H6[pH@G[H Z[Hp[Hs[`Hu[Ht[ H1[`H[Ht[ HC[pHv\HJ&\HW7\`HK\FfW\@Hjg\Hu\ \|Lh\}L\~Lp\@L8\LX\Lx\`L\ Lh]LP%]L=]LN]PHX]Hc]Hjo] `)J$] )J$] K] @K]H)]H]0H]PH^xL^L3^pH^B^LZ^Hz^PH^L^ HD^L8^ wI^Hz^He^@H(_pH "_H',_H]5_`Hv?_ pHF_HRO_HRZ_Hh_H/w_E_E_0E_ HU_0H,_0H,_`H _H_pH `H``H `pI2.` I?`II`0IW`Iv`If`I`0ID`"I`%I{` `&I;`@&Ia`*Ia+Ia,I%a0I1a1IKa2I\a`7Ivap8Ia =Ia=Ia>IaP?Ia@Ia Kha K5bAIq b@BI&bBIb`CI$bDI%0bEIDbUI:Mb0WIdb]Iy{baIbbIbcI beIbeIb hIbjI~bLbccL'cL8c،LKcL\c@icLc@c0@c Lc Lc Lc"DI%c`IcaIcpg*0G5Eg*G5Mg"PGXg"GE`gG!tgЦGgGDgGlgХG3gPGwg"Gg"GgG gGgGEgG5hG$ h HDhG&h"F2hF"u@"t@2"pt@F$"`t@ n"r@y"r@ "r@0"pr@0" r@C"r@"p@  "p@d'"`p@\"@p@"o@D"o@8"po@9"@o@'" o@"n@""Pn@?W"n@4"m@I"pm@E"0m@2"l@:"l@+"l@6"`l@"0l@-"l@"k@"k@Q$"Pi@>8"h@F"h@yP"h@yZ"g@;y"f@"f@"f@"f@"f@"f@"pe@"`e@ 7"@e@ `"0e@ ~" e@ "e@ "e@ "d@ "d@ "d@-"Pd@C"c@X"@c@nk"b@"a@"a@X"Pa@9"a@2"`@"`@f%"@`@8B"`@2a"_@"p_@p"`_@" _@2"_@"p^@ "`^@"" ^@2="^@Y"]@tu"@]@9"]@2"\@"`\@y"\@J"[@2"[@`Ci"Z@"Z@ "Z@."Z@="Z@N"`Z@Z"Y@ok"Y@y"Y@"`Y@$"PY@ "@Y@"0Y@ " Y@"Y@ "Y@ "X@"X@"X@ "X@."X@<"X@L"pX@ Y"`X@h"@X@{"@X@" X@" X@"X@"X@"W@ "W@%"W@&"`W@&"0W@&`"W@&"V@+"V@&"pV@&"@V@!" V@ "U@(("U@*="U@ N"U@a"U@ q"U@ "pU@PU@0U@0U@T@@T@S@S@S@S@ S@*S@|S@pR@pR@ PR@&0R@@0R@ZQ@Q@P@P@0P@PP@lP@P@O@O@FPO@dPO@0O@O@O@pN@#pN@sM@M@M@M@M@L@NL@PL@PL@0L@L@L@5pK@pK@J@J@J@:J@UJ@pI@I@PI@-PI@J0I@h rI@H@H@PH@PH@^G@z G@G@ G@ `G@(PG@ = F@G@ e u ~ F@~F@E@E@E@-@E@yE@E@y] E@xE@ E@ D@>"@D@>D@ D@ .D@FD@^D@y@@D@`D@@D@ D@C@fC@6pC@PPC@n0C@"Ї@?B@fB@pB@*pB@*PB@! B@!= B@!Y"0Z@-hB@A@*A@*"}@A@A@!A@!A@y5! IM! Id! pIx! PI! 0I! I! I! I! I@@@@6@@S@@p@@@@`@@;`@@;@@@@@@ @@- @@H@@g@@?@?@?@;"|@?@;?@!L(0`?@K@?@e!ؑL(| ?@?@!L(>@>@!L( >@ >@8!`L(M=@e=@}!8L(=@=@!L(`=@@=@!L(( =@@=@W"pg@ vL !L(`<@P<@ @<@ B0L0dAzeA+4!L@E!LV! I g:@9:@:@:@:@0@H0@}:@:@!(L!(L!! I%J@M :@S8@6`8@v@8@  8@5@\ 8@7@% dI7@;@-!L((7@%;!؎L(_!L(p! @I$! I ! I!@LX! I P7@ )@7@F07@ a 7@y7@6@6@6@6@>6@c6@|6@p6@ `6@ @6@06@6@ 5@'4@ ? R g |! I)! I'P4@.3@c3@10!؍L]!L"e @5"0@+"0@+"0@@!L(m"0@"`0@!L("`0@"P0@ P"@0@ ! I0@/@/@ ! I /@/@/@ &!@L7!@LX`! pI q00@ yp/@06@P/@@/@ -@ ,@"!L:`?@U`D@r @^!L ?@@D@ @^!xL>@+ D@DK @^a!`Lw >@C@f @^-@j+@ #!HL8=@PC@jf @^!0L=@pC@!L`=@PC@"@^D!LY =@q0C@L@^!L`<@B@f"B@^!L(%!L8/@N@5h!XL(x!@L/@@5O@5@5!L(!L P/@7@ 6;C/=7@ O)@Jl3@.P)@L0)@(@L(@,(@O`*@S]P5@m*@My!L(@6@@3@a!PL`7@  )@P(@S(4@n:!hL^`)@p!xL)@4@:AC"@`E"0zA *yA[*pyA[ @^*cC@ !*@4'"p@b LB wI L@IB@@/PBAinit.cstatic-reloc.ccrtstuff.c__EH_FRAME_BEGIN____TMC_LIST__deregister_tm_clonesregister_tm_clones__do_global_dtors_auxcompleted.6832__do_global_dtors_aux_fini_array_entryframe_dummyobject.6837__frame_dummy_init_array_entryvector.cppmain.cold_ZL16get_adjusted_ptrPKSt9type_infoS1_PPv_ZL28read_encoded_value_with_basehmPKhPm_ZL28read_encoded_value_with_basehmPKhPm.cold_ZL15get_ttype_entryP16lsda_header_infom_ZL15get_ttype_entryP16lsda_header_infom.cold_ZL20check_exception_specP16lsda_header_infoPKSt9type_infoPvl_ZL21base_of_encoded_valuehP15_Unwind_Context_ZL21base_of_encoded_valuehP15_Unwind_Context.cold_ZL17parse_lsda_headerP15_Unwind_ContextPKhP16lsda_header_info__gxx_personality_v0.cold__cxa_call_unexpected.cold_ZN10__cxxabiv111__terminateEPFvvE.cold_ZL23__gxx_exception_cleanup19_Unwind_Reason_CodeP17_Unwind_Exception_Znwm.cold_ZSt24__throw_out_of_range_fmtPKcz.cold_ZN12_GLOBAL__N_14pool4freeEPv.constprop.0_ZN12_GLOBAL__N_114emergency_poolE_ZN12_GLOBAL__N_14pool4freeEPv.constprop.0.cold_ZN12_GLOBAL__N_14pool8allocateEm.constprop.0_ZN12_GLOBAL__N_14pool8allocateEm.constprop.0.cold_GLOBAL__sub_I_eh_alloc.cc_ZZN12_GLOBAL__N_110get_globalEvE6global_ZN12_GLOBAL__N_113__new_handlerE_ZZN9__gnu_cxx27__verbose_terminate_handlerEvE11terminating_ZN9__gnu_cxx27__verbose_terminate_handlerEv.cold_ZNSt11logic_errorC2ERKSs.cold_ZNSt13runtime_errorC2ERKSs.cold_ZNSt11logic_errorC2EPKc.cold_ZNSt13runtime_errorC2EPKc.cold_ZNKSt3_V214error_category10_M_messageEi.cold_Z35_txnal_cow_string_C1_for_exceptionsPvPKcS_.cold_ZGTtNSt11logic_errorC1EPKc.cold_ZGTtNSt11logic_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt12domain_errorC1EPKc.cold_ZGTtNSt12domain_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt16invalid_argumentC1EPKc.cold_ZGTtNSt16invalid_argumentC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt12length_errorC1EPKc.cold_ZGTtNSt12length_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt12out_of_rangeC1EPKc.cold_ZGTtNSt12out_of_rangeC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt13runtime_errorC1EPKc.cold_ZGTtNSt13runtime_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt11range_errorC1EPKc.cold_ZGTtNSt11range_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt14overflow_errorC1EPKc.cold_ZGTtNSt14overflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZGTtNSt15underflow_errorC1EPKc.cold_ZGTtNSt15underflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE.cold_ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag.part.0_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag.part.0_ZNSs4_Rep10_M_disposeERKSaIcE.part.0d_make_compd_ref_qualifierd_count_templates_scopesd_append_bufferd_number.isra.0d_number_componentd_compact_numberd_template_paramd_source_named_abi_tagsd_substitutionstandard_subsd_call_offsetnext_is_type_qual.isra.0d_discriminatord_index_template_argument.part.0d_lookup_template_argument.isra.0d_find_packd_growable_string_callback_adapterd_exprlistd_operator_named_unqualified_named_expression_1d_expr_primaryd_typed_template_args_1d_template_argd_template_argsd_encodingd_named_bare_function_typed_cv_qualifiersd_function_typecplus_demangle_builtin_typesd_type.coldcplus_demangle_operatorsd_parmlistd_print_comp_innerd_maybe_print_fold_expression.isra.0d_print_subexprd_print_compd_print_expr_opd_print_modd_print_array_type.isra.0d_print_function_type.isra.0d_print_mod_listd_demangle_callback.constprop.0__sin_ifunc__cos_ifunctm600toverpt576tm24bigbig1mp1hp0mp2hp1read_encoded_value_with_baseread_encoded_value_with_base.coldbase_of_encoded_valuebase_of_encoded_value.coldexecute_cfa_programexecute_cfa_program.coldinit_dwarf_reg_size_tabledwarf_reg_size_tableuw_frame_state_foruw_frame_state_for.colduw_install_context_1uw_install_context_1.coldexecute_stack_opexecute_stack_op.colduw_update_context_1uw_update_context_1.colduw_init_context_1once_regsizes.9495uw_init_context_1.colduw_update_contextuw_update_context.cold_Unwind_RaiseException_Phase2_Unwind_RaiseException_Phase2.cold_Unwind_ForcedUnwind_Phase2_Unwind_GetGR.cold_Unwind_SetGR.cold_Unwind_DebugHook_Unwind_Resume.cold_Unwind_Resume_or_Rethrow.coldfde_unencoded_compareframe_downheapframe_heapsortsize_of_encoded_valuesize_of_encoded_value.coldbase_from_objectbase_from_object.coldbase_from_cb_database_from_cb_data.coldfde_single_encoding_compareget_cie_encodinglinear_search_fdes_Unwind_IteratePhdrCallbackframe_hdr_cache_headadds.9407frame_hdr_cachesubs.9408_Unwind_IteratePhdrCallback.coldfde_mixed_encoding_compareclassify_object_over_fdesadd_fdessearch_objectterminator.9251marker.9145search_object.cold__register_frame_info_bases.part.0object_mutexunseen_objectsany_objects_registeredseen_objectsget_common_indices.constprop.0__PRETTY_FUNCTION__.11911check_one_fdstatic_slotinfoerrstr.12307__assert_fail_base.coldplural_evalfree_memroottransmem_listtranscmpplural_lookup.isra.0lock.11588output_charset_cached.11636output_charset_cache.11635freemem.11595freemem_size.11596tree_lock__elf_set___libc_subfreeres_element_free_mem__lock.11204_nl_loaded_domainslock.10730_nl_load_domain.coldalias_compareread_alias_filealiasfile.10113nmapmapmaxmapstring_space_actstring_spacestring_space_maxlocklocale_alias_path.10082new_expyycheckyypactyytranslateyytableyydefactyyr2yypgotoyydefgotoyyr1plvarplonestagemsort_with_tmp.part.0pagesize.8671phys_pages.8670__PRETTY_FUNCTION__.7988__PRETTY_FUNCTION__.7957initiallocked_vfxprintf_IO_new_fclose.cold_IO_fflush.cold_IO_fputs.cold_IO_fwrite.cold_IO_str_chk_overflow_IO_str_chk_jumpsadjust_wide_data__PRETTY_FUNCTION__.12230_IO_wfile_underflow.cold_IO_wfile_underflow_maybe_mmap_IO_wfile_underflow_mmapfputc.coldbacktrace_and_maps.constprop.0_IO_file_seekoff_maybe_mmapnew_do_write_IO_new_file_underflow.coldmmap_remap_check_IO_file_sync_mmapdecide_maybe_mmap_IO_file_xsgetn_maybe_mmap_IO_file_xsgetn_mmap__PRETTY_FUNCTION__.13400buffer_freefreeres_listdealloc_bufferssave_for_backupflush_cleanuprun_fplist_all_lock_IO_un_link.part.0stdio_needs_locking__elf_set___libc_atexit_element__IO_cleanup____elf_set___libc_subfreeres_element_buffer_free___IO_stdfile_2_lock_IO_wide_data_2_IO_stdfile_1_lock_IO_wide_data_1_IO_stdfile_0_lock_IO_wide_data_0enlarge_userbuf__PRETTY_FUNCTION__.11517mp_perturb_bytemem2mem_checkmem2chunk_checkmain_arenaint_mallinfomalloc_init_stateglobal_max_fast__malloc_assertdetach_arena__PRETTY_FUNCTION__.12632get_free_listfree_listthread_arenafree_list_lock__PRETTY_FUNCTION__.12664malloc_printerrtop_checknew_heapaligned_heap_areamunmap_chunk__PRETTY_FUNCTION__.12930mremap_chunk__PRETTY_FUNCTION__.12942ptmalloc_init.part.0unlink_chunk.isra.0malloc_consolidatearena_get2.part.0narenas_limit.12704narenasnext_to_use.12683__PRETTY_FUNCTION__.12675list_lockarena_get_retrymalloc_checkusing_malloc_checkingfree_checkrealloc_checkmemalign_check__malloc_info.part.0systrim.isra.0.constprop.0_int_freetcache__PRETTY_FUNCTION__.13249__PRETTY_FUNCTION__.12967__PRETTY_FUNCTION__.12625may_shrink_heap.11566sysmalloc__PRETTY_FUNCTION__.12885_int_malloc__PRETTY_FUNCTION__.13181__PRETTY_FUNCTION__.12972tcache_init.part.0_int_memalign__PRETTY_FUNCTION__.13301free_check.part.0_int_realloc__PRETTY_FUNCTION__.13284__PRETTY_FUNCTION__.13008tcache_shutting_downmalloc_hook_ini_mid_memalign__PRETTY_FUNCTION__.13069memalign_hook_ini__PRETTY_FUNCTION__.12738__PRETTY_FUNCTION__.13041realloc_hook_ini__PRETTY_FUNCTION__.13112__PRETTY_FUNCTION__.13315strchr_ifuncstrcmp_ifuncstrcpy_ifuncstrcspn_ifuncstrlen_ifuncstrncmp_ifunccritical_factorizationtwo_way_long_needle__libc_strstr_ifuncmemchr_ifuncmemcmp_ifunc__libc_memmove_ifuncmemset_ifunc__mempcpy_ifunc__stpcpy_ifunc__strcasecmp_l_ifunc__new_memcpy_ifunc__rawmemchr_ifunc__strchrnul_ifunchandle_amd__PRETTY_FUNCTION__.10289intel_check_word.isra.0intel_02_known__PRETTY_FUNCTION__.10219handle_intel.constprop.0init_cacheinfostateto_wcto_mb__PRETTY_FUNCTION__.10319__sysconf_check_spec__PRETTY_FUNCTION__.8663__PRETTY_FUNCTION__.10158trecursetdestroy_recursemaybe_split_for_insert.isra.0next_line__PRETTY_FUNCTION__.11445sysinfo_mempagestimestamp.11450cached_result.11449do_tunable_update_valtunable_initializetunable_list_dl_main_mapdyn_temp.10773unsecure_envvars.10815__PRETTY_FUNCTION__.10776__PRETTY_FUNCTION__.10767__compound_literal.3__compound_literal.0__compound_literal.1__compound_literal.2__PRETTY_FUNCTION__.9104__PRETTY_FUNCTION__.9486free_derivationfree_modules_dbknown_derivationsderivation_compare__PRETTY_FUNCTION__.9659find_derivation__gconv_get_pathdefault_gconv_path__PRETTY_FUNCTION__.12696empty_path_eleminsert_moduledetect_conflictadd_module.isra.0gconv_module_extadd_alias2.isra.0.part.0__gconv_read_confgconv_conf_filenamebuiltin_modulesbuiltin_aliasesmodcounter.12676once__PRETTY_FUNCTION__.8996__PRETTY_FUNCTION__.10548__PRETTY_FUNCTION__.10693__PRETTY_FUNCTION__.10830__PRETTY_FUNCTION__.10976__PRETTY_FUNCTION__.10865__PRETTY_FUNCTION__.11166__PRETTY_FUNCTION__.11277__PRETTY_FUNCTION__.11386__PRETTY_FUNCTION__.11622__PRETTY_FUNCTION__.11505inmask.11747__PRETTY_FUNCTION__.11880__PRETTY_FUNCTION__.11758__PRETTY_FUNCTION__.11996__PRETTY_FUNCTION__.12106__PRETTY_FUNCTION__.12218__PRETTY_FUNCTION__.12328__PRETTY_FUNCTION__.12440__PRETTY_FUNCTION__.12550__PRETTY_FUNCTION__.12662__PRETTY_FUNCTION__.12772cache_mallocedgconv_cachecache_sizefind_module_idxfind_moduleknown_comparedo_release_allloadeddo_release_shlibrelease_handle__PRETTY_FUNCTION__.9692__PRETTY_FUNCTION__.9684new_composite_namefree_category_nl_current_used_nl_category_postloadstripslashdot.10247codeset_idx.10272__PRETTY_FUNCTION__.10277_nl_category_num_items_nl_value_types__PRETTY_FUNCTION__.9745_nl_value_type_LC_CTYPE_nl_value_type_LC_NUMERIC_nl_value_type_LC_TIME_nl_value_type_LC_COLLATE_nl_value_type_LC_MONETARY_nl_value_type_LC_MESSAGES_nl_value_type_LC_PAPER_nl_value_type_LC_NAME_nl_value_type_LC_ADDRESS_nl_value_type_LC_TELEPHONE_nl_value_type_LC_MEASUREMENT_nl_value_type_LC_IDENTIFICATIONarchloadedarchmappedheadmaparchive_statarchfname__PRETTY_FUNCTION__.9821__PRETTY_FUNCTION__.9861translit_from_idxtranslit_from_tbltranslit_to_idxtranslit_to_tbl__restore_rtenvlocklast_environknown_valuesread_intgroup_number_i18n_number_rewrite_IO_helper_overflowprintf_positional__PRETTY_FUNCTION__.13748jump_tablestep4_jumps.13752nullstep3b_jumps.13572step0_jumps.13537buffered_vfprintfstep4_jumps.13573step1_jumps.13568step3a_jumps.13570step2_jumps.13569__PRETTY_FUNCTION__.13533_IO_helper_jumps__PRETTY_FUNCTION__.13772step4_jumps.13776step0_jumps.13563step4_jumps.13599step1_jumps.13594step3a_jumps.13596step3b_jumps.13598step2_jumps.13595__PRETTY_FUNCTION__.13559_IO_getdelim.coldblankszeroessave_for_wbackup.isra.0do_encodingdo_always_noconvdo_max_lengthdo_indo_unshiftdo_outdo_length__PRETTY_FUNCTION__.13765__strnlen_ifuncstrrchr_ifunc__wcslen_ifunc__PRETTY_FUNCTION__.10313__wcsnlen_ifuncopendir_tailis_dstis_trusted_path_normalize_dl_process_pt_noteadd_name_to_object.isra.0__PRETTY_FUNCTION__.11206lose.isra.0add_path.isra.0.constprop.0open_verify.constprop.0expected.11384expected_note.11390open_pathmax_capstrlenmax_dirnamelenncapstrcapstrenv_path_listrtld_search_dirs_dl_map_object_from_fd.constprop.0__PRETTY_FUNCTION__.11339__PRETTY_FUNCTION__.10875expand_dynamic_string_token__PRETTY_FUNCTION__.11193fillin_rpathcache_rpath.part.0system_dirsdummy_bucket.11485__PRETTY_FUNCTION__.11467check_match__PRETTY_FUNCTION__.11172do_lookup_x__PRETTY_FUNCTION__.11400__PRETTY_FUNCTION__.11428errstring.10940msg.10946__PRETTY_FUNCTION__.10782__PRETTY_FUNCTION__.10435_dl_debug_vdprintf__PRETTY_FUNCTION__.10585primes.10636runninglog_hashfractionlowpctextsizefromlimitnarcspdatatosfromidxfromsnarcsallocate_dtvoom__PRETTY_FUNCTION__.10305__PRETTY_FUNCTION__.10364__PRETTY_FUNCTION__.10403__PRETTY_FUNCTION__.10169length_mismatch_dl_out_of_memorycachecachesizecache_newdo_dlopendlerror_rundo_dlsymdo_dlvsymdo_dlclosefree_slotinfodo_dlsym_private_dl_open_hookfatal_errorcatch_hooknot_availableconversion_ratecollseqmbcollseqwchack_digit__guess_grouping.part.0__printf_fp_l.cold__PRETTY_FUNCTION__.15365__printf_fphex.coldnext_bitpa_next_typeinitfree_key_memkeylast_resultstatic_bufcheck_free.isra.0fini_dlfcn_hooksdlinfo_doitdlmopen_doitbufstrspn_ifunc__wmemset_ifunc__profil_counterpc_offsetpc_scalensamplessamplesotimer.8643oact.8642__PRETTY_FUNCTION__.12117__PRETTY_FUNCTION__.12197add_to_global__PRETTY_FUNCTION__.12216dl_open_worker__PRETTY_FUNCTION__.12294__PRETTY_FUNCTION__.12234remove_slotinfo__PRETTY_FUNCTION__.11847dl_close_state.11860__PRETTY_FUNCTION__.11874dlopen_doitdlclose_doitdlsym_doitdlvsym_doit_dl_build_local_scopeopenaux__PRETTY_FUNCTION__.10390call_init.part.0__PRETTY_FUNCTION__.9255__PRETTY_FUNCTION__.9233call_dl_lookupdo_sym__FRAME_END___dl_relocate_static_pie_init_fini__dso_handleDW.ref.__gxx_personality_v0DW.ref._ZTISt9exception_Unwind_GetGR_Unwind_GetCFA_Unwind_SetGR_Unwind_GetIP_Unwind_GetIPInfo_Unwind_SetIP_Unwind_GetLanguageSpecificData_Unwind_GetRegionStart_Unwind_FindEnclosingFunction_Unwind_GetDataRelBase_Unwind_GetTextRelBase__frame_state_for_Unwind_RaiseException_Unwind_ForcedUnwind_Unwind_Resume_Unwind_Resume_or_Rethrow_Unwind_DeleteException_Unwind_Backtrace__register_frame_info_bases__register_frame_info__register_frame__register_frame_info_table_bases__register_frame_info_table__register_frame_table__deregister_frame_info_bases__deregister_frame_info__deregister_frame_Unwind_Find_FDE__libc_check_standard_fds__libc_errno__assert_fail_base__assert_fail__dcgettext_nl_default_dirname_nl_current_default_domain_nl_default_default_domain_nl_find_msg__dcigettext_nl_state_lock_nl_find_domain_nl_finddomain_subfreeres_nl_load_domain_nl_unload_domain__gettext_free_exp__gettextparse__gettext_extract_plural__gettext_germanic_plural__hash_string_setjmpraiseabort__abort_msg__qsort_rqsortgetenv__run_exit_handlers__exit_funcs_doneexit__new_exitfn__new_exitfn_called__internal_atexit__cxa_atexit__exit_funcs__strtoul_internalstrtoul____strtoul_l_internal__strtoul_l__correctly_grouped_prefixmbsprintf__asprintf__vfxprintf__fxprintf__fxprintf_nocancelDW.ref.__gcc_personality_v0_IO_fflushfflush__fopen_maybe_mmap__fopen_internal_IO_fputsfputs_IO_fwritefwrite__vsprintf_internal_IO_wfile_underflow_IO_wfile_seekoff_IO_wdo_write_IO_wfile_overflow_IO_wfile_sync_IO_wfile_xsputn_IO_wfile_jumps_maybe_mmap_IO_wfile_jumps_mmap_IO_wfile_jumps__vasprintf_internal__libc_message__libc_fatal_IO_vtable_check__fgets_unlockedfgets_unlocked_IO_file_close_IO_file_setbuf_IO_file_jumps_IO_file_jumps_mmap_IO_file_underflow_IO_file_seek_IO_file_seekoff_IO_file_stat_IO_file_xsgetn_IO_file_read_IO_file_xsputn_IO_new_file_init_internal_IO_file_open_IO_file_attach_IO_do_write_IO_file_close_it_IO_file_fopen_IO_file_finish_IO_file_overflow_IO_file_sync_IO_file_jumps_maybe_mmap_IO_un_link_IO_link_in_IO_switch_to_get_mode_IO_free_backup_area__overflow__underflow__uflow_IO_setb_IO_doallocbuf_IO_default_uflow_IO_default_xsputn_IO_sgetn_IO_default_xsgetn_IO_default_doallocate_IO_enable_locks_IO_init_internal_IO_default_finish_IO_sputbackc_IO_adjust_column_IO_flush_all_IO_flush_all_linebuffered_IO_unsave_markers_IO_default_pbackfail_IO_iter_begin_IO_iter_end_IO_iter_next_IO_iter_file_IO_list_lock_IO_list_unlock_IO_list_resetlock_IO_list_all_IO_stderr_IO_stdout_IO_stdin_IO_str_underflow_IO_str_overflow_IO_str_seekoff_IO_str_pbackfail_IO_str_jumps__libc_malloc_initialized__malloc_fork_lock_parent__malloc_fork_unlock_parent__malloc_fork_unlock_child__malloc_check_init__libc_malloc__libc_free__malloc_arena_thread_freeres__libc_realloc__libc_memalign__libc_mallopt__default_morecorestrchrstrcmpstrcpystrcspn__strdupstrlenstrncmp__strstr_sse2strstrmemmovememset__strcasecmp_l__rawmemchr__strcmp_sse2__strcmp_sse2_unaligned__strcmp_ssse3__strcmp_avx2__strncmp_sse2__strncmp_ssse3__strncmp_sse42__strncmp_avx2__memchr_sse2__rawmemchr_sse2__memchr_avx2__rawmemchr_avx2__memcmp_sse2__memcmp_avx2_movbe__memcmp_sse4_1__mempcpy_ssse3__memcpy_ssse3__memmove_ssse3__mempcpy_ssse3_back__memcpy_ssse3_back__memmove_ssse3_back__mempcpy_avx512_no_vzeroupper__memmove_avx512_no_vzeroupper__memcpy_avx512_no_vzeroupper__strcasecmp_l_sse2__strcasecmp_l_ssse3__strcasecmp_l_sse42__strcasecmp_l_avx__strchr_sse2__strchrnul_sse2__strchr_avx2__strchrnul_avx2__strlen_sse2__strlen_avx2__strcpy_avx2__strcpy_sse2__stpcpy_sse2__strcpy_ssse3__stpcpy_ssse3__strcpy_sse2_unaligned__stpcpy_sse2_unaligned__stpcpy_avx2__strchr_sse2_no_bsf__memcmp_ssse3__strstr_sse2_unaligned__strcspn_sse2__strcspn_sse42___m128i_shift_right__memset_avx512_no_vzeroupper__mempcpy_sse2_unaligned__memmove_sse2_unaligned__mempcpy_erms__memmove_erms__memcpy_erms__mempcpy_sse2_unaligned_erms__memmove_sse2_unaligned_erms__memcpy_sse2_unaligned_erms__memcpy_sse2_unaligned__mempcpy_avx_unaligned__memmove_avx_unaligned__mempcpy_avx_unaligned_erms__memmove_avx_unaligned_erms__memcpy_avx_unaligned_erms__memcpy_avx_unaligned__mempcpy_avx512_unaligned__memmove_avx512_unaligned__mempcpy_avx512_unaligned_erms__memmove_avx512_unaligned_erms__memcpy_avx512_unaligned_erms__memcpy_avx512_unaligned__memset_sse2_unaligned__memset_erms__memset_sse2_unaligned_erms__memset_avx2_unaligned__memset_avx2_erms__memset_avx2_unaligned_erms__memset_avx512_unaligned__memset_avx512_erms__memset_avx512_unaligned_erms__cache_sysconf__x86_raw_data_cache_size__x86_data_cache_size__x86_raw_data_cache_size_half__x86_data_cache_size_half__x86_raw_shared_cache_size__x86_shared_cache_size__x86_raw_shared_cache_size_half__x86_shared_cache_size_half__x86_shared_non_temporal_threshold__x86_prefetchw__wmempcpy__mbsrtowcs_nl_cleanup_ctype__wcsmbs_getfct__wcsmbs_load_conv__wcsmbs_gconv_fcts_c__wcsmbs_clone_conv__wcsmbs_named_conv__mbsrtowcs_l_exit__sysconf__sched_yield__get_child_max__xstat__xstat64__fxstat__fxstat64__open__libc_open__open64__libc_readread__read__libc_writewrite__write__lseek64__lseek__getcwd__close_nocancel__fcntl64_nocancel_adjusted__fcntl64_nocancel__open64_nocancel__open_nocancel__openat64_nocancel__openat_nocancel__read_nocancel__write_nocancel__getrlimit64getrlimit64__getrlimit__sbrk__getpagesize__getdtablesize__mmap64__mmap__munmap__mprotect__madvise__tsearch__tfind__tdelete__twalk__tdestroymemchr__get_nprocs__get_nprocs_conf__get_phys_pages__get_avphys_pages__getclktck__init_misc__mremap__sysinfo__libc_alloca_cutoff__lll_lock_wait_private__lll_unlock_wake_private__libc_enable_asynccancel__libc_disable_asynccancel__libc_multiple_threads__chk_fail__fortify_fail_abort__fortify_fail_dl_debug_initialize_dl_aux_init_dl_random_dl_non_dynamic_init_dl_get_dl_main_map__dl_iterate_phdr_dl_mcount_wrapper_check_dl_tunable_set_hwcaps_dl_tunable_set_x86_ibt_dl_tunable_set_x86_shstk_dl_discover_osversion__libc_multiple_libcs__libc_argc__libc_argv__vdso_clock_gettime__vdso_getcpu__gconv_open__gconv__gconv_close__gconv_alias_compare__gconv_alias_db__gconv_modules_db__gconv_release_step__gconv_compare_alias__gconv_find_transform__gconv_lock__gconv_close_transform__gconv_path_envvar__gconv_load_conf__gconv_get_builtin_trans__gconv_transliterate__gconv_load_cache__gconv_compare_alias_cache__gconv_lookup_cache__gconv_release_cache__gconv_find_shlib__gconv_release_shlib_nl_category_name_sizes_nl_category_name_idxs_nl_category_namessetlocale__libc_setlocale_lock_nl_locale_subfreeres_nl_find_locale_nl_C_nl_locale_file_list_nl_default_locale_path_nl_remove_locale_nl_intern_locale_data_nl_load_locale_nl_unload_locale_nl_load_locale_from_archive_nl_archive_subfreeres_nl_current_LC_CTYPE_nl_C_LC_CTYPE_nl_C_LC_CTYPE_class_nl_C_LC_CTYPE_toupper_nl_C_LC_CTYPE_tolower_nl_C_LC_CTYPE_class32_nl_C_LC_CTYPE_width_nl_C_LC_CTYPE_class_upper_nl_C_LC_CTYPE_class_lower_nl_C_LC_CTYPE_class_alpha_nl_C_LC_CTYPE_class_digit_nl_C_LC_CTYPE_class_xdigit_nl_C_LC_CTYPE_class_space_nl_C_LC_CTYPE_class_print_nl_C_LC_CTYPE_class_graph_nl_C_LC_CTYPE_class_blank_nl_C_LC_CTYPE_class_cntrl_nl_C_LC_CTYPE_class_punct_nl_C_LC_CTYPE_class_alnum_nl_C_LC_CTYPE_map_toupper_nl_C_LC_CTYPE_map_tolower_libc_intl_domainname_nl_C_codeset_nl_POSIX_name_nl_C_name_nl_C_locobj__current_locale_name_nl_global_locale__ctype_init__setfpucw__libc_sigaction__sigaction__sigprocmask__add_to_environ__setenv__unsetenv__clearenv__libc_secure_getenv__strtol_internalstrtol____strtol_l_internal__strtol_ul_rem_tab__strtol_ul_max_tab__strtol_lfprintf__vfprintf_internal__vfwprintf_internal__parse_one_specmb__parse_one_specwc_IO_file_doallocate_IO_getline_info_IO_getline_IO_padn_IO_least_wmarker_IO_switch_to_main_wget_area_IO_switch_to_wbackup_area_IO_wsetb_IO_wdefault_pbackfail_IO_wdefault_finish_IO_wdefault_uflow__woverflow_IO_wdefault_xsputn_IO_wdoallocbuf_IO_wdefault_doallocate_IO_switch_to_wget_mode_IO_free_wbackup_area__wuflow__wunderflow_IO_wdefault_xsgetn_IO_sputbackwc__libio_codecvt__libc_scratch_buffer_grow_preserve__libc_scratch_buffer_set_array_size__strndup__strerror_r__strnlenstrrchr__strtok_r__memmemmemmem__argz_create_sep__argz_add_sep__strrchr_sse2__strrchr_avx2__strnlen_sse2__strnlen_avx2__wmemcpy__wmemmove__btowc__wcrtombwcrtomb__wcsrtombs__wcsnlen_sse4_1__wcsnlen_sse2__wcslen_sse2__wcslen_avx2__wcsnlen_avx2time__alloc_dir__opendirat__opendir__closedir__rewinddir__readdir64__readdir__fdopendir__uname__getuid__geteuid__getgid__getegid__lxstat__lxstat64__fxstatat__fxstatat64__isatty__tcgetattr__brk__syscall_clock_gettime__towctrans__readonly_area__stack_prot_dl_dst_count_dl_dst_substitute_dl_init_paths_dl_map_object_dl_lookup_symbol_x_dl_setup_hash_dl_add_to_namespace_list_dl_new_object_dl_try_allocate_static_tls_dl_allocate_static_tls_dl_nothread_init_static_tls_dl_protect_relro_dl_reloc_bad_type_dl_relocate_object_dl_important_hwcaps_dl_sysdep_read_whole_file_dl_debug_printf_dl_debug_printf_c_dl_dprintf_dl_name_match_p_dl_higher_prime_number_dl_strtoul_dl_start_profile_dl_next_tls_modid_dl_count_modids_dl_allocate_tls_storage_dl_tls_get_addr_soft_dl_add_to_slotinfo_dl_get_origin_dl_scope_free_dl_runtime_profile_avx512_dl_runtime_profile_avx_dl_runtime_profile_sse_dl_runtime_resolve_fxsave_dl_runtime_resolve_xsave_dl_runtime_resolve_xsavec_dl_cache_libcmp_dl_load_cache_lookup_dl_unload_cache_dl_tlsdesc_return_dl_tlsdesc_undefweak_dl_tlsdesc_resolve_rela_dl_tlsdesc_resolve_hold__libc_dlsym__libc_dlvsym__libc_dlclose__libc_dlsym_private__libc_register_dl_open_hook__libc_dlopen_mode_dl_signal_exception_dl_signal_error_dl_catch_exception__sigsetjmp_dl_catch_error_dl_vdso_vsym_nl_current_LC_NUMERIC_nl_C_LC_MESSAGES_nl_C_LC_MONETARY_nl_C_LC_NUMERIC_nl_C_LC_TIME_nl_C_LC_PAPER_nl_C_LC_NAME_nl_C_LC_ADDRESS_nl_C_LC_TELEPHONE_nl_C_LC_MEASUREMENT_nl_C_LC_IDENTIFICATION_nl_C_LC_COLLATE__longjmp_itoa_word_fitoa_word_itoa_lower_digits_itoa_upper_digits_itowa_upper_digits_itowa_lower_digits__printf_fp_l__printf_fp__guess_grouping__register_printf_specifier__printf_function_table__printf_arginfo_table__printf_fphex__printf_modifier_table__handle_registered_modifier_mb__handle_registered_modifier_wc__printf_va_arg_table__funlockfile_sys_errlist_internal_sys_nerr_internal__dlerror_dlerror_run__libc_register_dlfcn_hook__dladdr__dladdr1__dlinfo__dlmopenstrspn__strsep__strsep_g__strspn_sse2__strspn_sse42__wmemset_sse2_unaligned__wmemset_avx512_unaligned__wmemset_avx2_unaligned__wmemset__getdents64__getdents__getpid__profil__profile_frequency_dl_fixup_dl_open_dl_show_scope_dl_close_worker_dl_close_dl_sort_maps_dl_tlsdesc_resolve_rela_fixup_dl_tlsdesc_resolve_hold_fixup_dl_unmap_dl_cet_open_check_dl_addr_dl_addr_inside_object_nl_current_LC_MONETARY__mpn_cmp__mpn_divrem__mpn_lshift__mpn_rshift__mpn_mul__mpn_mul_1__mpn_impn_mul_n_basecase__mpn_impn_mul_n__mpn_impn_sqr_n_basecase__mpn_impn_sqr_n__mpn_sub_n__mpn_submul_1__mpn_extract_double__mpn_extract_long_double__mpn_extract_float128_fpioconst_pow10__tens__dlopen__dlclose__dlsym__dlvsym__setitimer_dl_map_object_deps_dl_init_dl_check_map_versions_dl_check_all_versions__mpn_add_n__mpn_addmul_1__unordtf2__letf2__lttf2__sfp_handle_exceptions__gcc_personality_v0__TMC_END____preinit_array_start__preinit_array_end__init_array_start__init_array_end__fini_array_start__fini_array_end__ehdr_start_GLOBAL_OFFSET_TABLE___rela_iplt_start__rela_iplt_end_end__bss_start_edatasetitimer_dl_vsym_dl_sym__mpn_mul_n_dl_find_dso_for_objectprofilgetpidwmemsetstrsep__pthread_setspecific__pthread_getspecificstrerror_sys_nerr__sys_nerr_internalsys_nerr_sys_errlist__sys_errlist_internalsys_errlistfunlockfileregister_printf_type__register_printf_typeregister_printf_modifier__register_printf_modifierregister_printf_function__register_printf_functionregister_printf_specifier___printf_fp_dl_exception_free_dl_exception_create_dl_call_pltexit_dl_profile_fixup_dl_deallocate_tls_dl_allocate_tls_dl_allocate_tls_init_dl_get_tls_static_info_dl_rtld_map_dl_exception_create_format_dl_rtld_di_serinfotowctranswctransbrktcgetattrisatty__GI___fxstatat64_lxstatgetegidgetgidgeteuidgetuidunamefdopendirreaddir64readdirrewinddirclosediropendirwcschrnulwcsnlenwcsrtombsbtowcwmemmovewmemcpywcslenargz_add_separgz_create_sepstrtok_rrindexstrnlenstrerror_rstrndup_IO_unsave_wmarkers_IO_seekwmark_IO_wmarker_delta_IO_init_wmarker_IO_adjust_wcolumn_IO_sungetwc__getdelimgetdelim__wcschrnul_IO_fwide__wcsnlen__wcslen_IO_wpadn_IO_funlockfile__wctrans_IO_fprintf__fprintfstrtol_l__strtoll_lstrtoll_l____strtoll_l_internalstrtollstrtoq__strtol__strtoll_internalsecure_getenvclearenvunsetenvsetenvsigprocmasksigaction__sigjmp_save__ctype_tolower_loc__ctype_toupper_loc__ctype_b_loc__libc_tsd_CTYPE_TOLOWER__libc_tsd_CTYPE_TOUPPER_nl_postload_ctype_nl_current_LC_IDENTIFICATION_nl_current_LC_IDENTIFICATION_used_nl_current_LC_MEASUREMENT_nl_current_LC_MEASUREMENT_used_nl_current_LC_TELEPHONE_nl_current_LC_TELEPHONE_used_nl_current_LC_ADDRESS_nl_current_LC_ADDRESS_used_nl_current_LC_NAME_nl_current_LC_NAME_used_nl_current_LC_PAPER_nl_current_LC_PAPER_used_nl_current_LC_MESSAGES_nl_current_LC_MESSAGES_used_nl_current_LC_TIME_nl_current_LC_TIME_used_nl_current_LC_NUMERIC_used_nl_current_LC_MONETARY_used_nl_current_LC_CTYPE_used_nl_current_LC_COLLATE_nl_current_LC_COLLATE_used__gconv_get_cache__gconv_transform_internal_ucs2reverse__gconv_transform_ucs2reverse_internal__gconv_transform_internal_ucs2__gconv_transform_ucs2_internal__gconv_transform_utf8_internal__gconv_transform_internal_utf8__gconv_transform_ucs4le_internal__gconv_transform_internal_ucs4le__gconv_transform_ucs4_internal__gconv_transform_internal_ucs4__pthread_once_IO_getdelim__gconv_max_path_elem_len__gconv_path_elem__gconv_get_alias_db__gconv_get_modules_db_dl_start__fpu_control_dl_mcount_dl_mcount_wrapper__pthread_mutex_unlock__pthread_mutex_lock_dl_argv_dl_use_load_bias_dl_profile_dl_inhibit_rpath_dl_profile_map_dl_origin_path_dl_load_adds_dl_initial_searchlist_dl_x86_legacy_bitmap_dl_x86_hwcap_flags_dl_x86_platforms_dl_init_static_tls_dl_inhibit_cache_dl_initfirst_dl_debug_fd_dl_correct_cache_id_dl_make_stack_executable_dl_make_stack_executable_hook_dl_wait_lookup_done_dl_scope_free_list_dl_load_lock_dl_load_write_lock_dl_stack_flags_dl_platformlen_dl_profile_output_dl_dynamic_weak_dl_bind_not_dl_lazy_dl_init_all_dirs_dl_all_dirs_dl_nns_dl_sysinfo_map_dl_debug_mask_dl_verbose_dl_cpuclock_offset_dl_fpu_control_dl_sysinfo_dso__libc_enable_secure_decided_dl_hwcap2_dl_auxv__tunable_set_val_r_debug_dl_debug_state__stack_chk_fail_local__pthread_unwindsysinfomremapprogram_invocation_nameprogram_invocation_short_name__progname_full_dl_clktckget_avphys_pagesget_phys_pagesget_nprocs_confget_nprocstdestroytwalktdeletetfindtsearchmadvisemprotectmunmapmmap64mmapgetdtablesizegetpagesizesbrk__curbrk__GI_getrlimit__GI___getrlimitgetrlimitgetcwdlseek__libc_lseek__libc_lseek64lseek64open64open__libc_open64_fxstat_xstatenviron_environsched_yieldsysconf_Exit__gconv_btwoc_ascii__gconv_transform_ascii_internal__gconv_transform_internal_asciimbsrtowcswmempcpy__memset_chk_ermsbzero__bzero__memcpy_chk_erms__memmove_chk_erms__mempcpy_chk_erms__memset_chk_avx512_no_vzeroupper__strcasecmp_avx__strcasecmp_sse42__strcasecmp_ssse3__strcasecmp_l_nonascii__strcasecmp_sse2__memcpy_chk_avx512_no_vzeroupper__memmove_chk_avx512_no_vzeroupper__mempcpy_chk_avx512_no_vzeroupper__memmove_chk_ssse3_back__memcpy_chk_ssse3_back__mempcpy_chk_ssse3_back__memmove_chk_ssse3__memcpy_chk_ssse3__mempcpy_chk_ssse3strchrnulrawmemchr__new_memcpystrcasecmp_lstpcpymempcpy__libc_memmovebcmp__memchr__libc_strstrstrdupindexmalloc_info__malloc_infoposix_memalign__posix_memalign__malloptmalloptmalloc_stats__malloc_stats__mallinfomallinfo__libc_mallinfomalloc_usable_size__malloc_usable_sizemalloc_trim__malloc_trim__calloc__libc_calloc__pvallocpvalloc__libc_pvalloc__vallocvalloc__libc_vallocaligned_alloc__memalignmemalign__realloc__free__malloc__after_morecore_hook__morecore__memalign_hook__realloc_hook__free_hook__malloc_hook_dl_tunable_set_mallopt_check_dl_tunable_set_tcache_unsorted_limit_dl_tunable_set_tcache_count_dl_tunable_set_tcache_max_dl_tunable_set_arena_test_dl_tunable_set_arena_max_dl_tunable_set_trim_threshold_dl_tunable_set_perturb_byte_dl_tunable_set_top_pad_dl_tunable_set_mmaps_max_dl_tunable_set_mmap_threshold_IO_str_count_IO_str_init_readonly_IO_str_init_staticstdinstdout_IO_2_1_stdin__IO_2_1_stdout__IO_2_1_stderr__IO_seekmark_IO_marker_delta_IO_marker_difference_IO_remove_marker_IO_init_marker_flushlbf_IO_cleanup_IO_flush_all_lockp_IO_sungetc_IO_default_seekoff_IO_init_IO_old_init_IO_default_underflow_IO_switch_to_backup_area_IO_least_marker_pthread_cleanup_pop_restore_pthread_cleanup_push_defer_IO_new_file_sync_IO_new_file_overflow_IO_new_file_fopen_IO_new_file_close_it_IO_new_file_attach_IO_file_init_IO_new_file_init_IO_new_file_xsputn_IO_file_seekoff_mmap_IO_switch_to_main_get_area_IO_file_write_IO_new_file_seekoff_IO_new_file_underflow__strchrnulvasprintf__vasprintf_IO_new_file_setbuf_IO_file_close_mmap_IO_new_file_write_IO_wfile_doallocate_IO_file_setbuf_mmap_IO_new_file_finish_IO_new_do_write_IO_file_underflow_mmap_IO_file_underflow_maybe_mmap_IO_default_imbue_IO_default_showmanyc_IO_default_stat_IO_default_seek_IO_default_write_IO_default_read_IO_default_sync_IO_default_setbuf_IO_default_seekpos_IO_str_finish_IO_vsprintfvsprintf__vsprintf_IO_str_init_static_internal__new_fopen_IO_fopen_IO_fopen64fopen64_IO_no_init_IO_fclosefclose__new_fclose__stop___libc_IO_vtables__start___libc_IO_vtablesasprintf___asprintf_IO_sprintf__sprintfstrtoul_l__strtoull_lstrtoull_l____strtoull_l_internalstrtoullstrtouq__strtoul__strtoull_internal__libc_tsd_LOCALE__stop___libc_atexit__start___libc_atexit__exit_funcs_lock__call_tls_dtorsqsort_r_quicksortgsignal_nl_normalize_codeset_IO_new_fclose__libc_tsd_CTYPE_B_IO_new_fopen__pthread_rwlock_destroy__pthread_rwlock_init_nl_explode_name_nl_expand_alias_nl_make_l10nflist__stpcpy_nl_msg_cat_cntrcalloc__mempcpy__pthread_rwlock_wrlock__pthread_rwlock_unlock__pthread_rwlock_rdlock_nl_domain_bindings__gettextdcgettext_dl_pagesize__progname__pthread_setcancelstate_dl_tls_dtv_gaps_dl_tls_generation_dl_tls_static_nelem_dl_tls_max_dtv_idx_dl_tls_static_align_dl_tls_static_used_dl_tls_dtv_slotinfo_list_dl_static_dtv_dl_tls_static_size_dl_ns_dl_osversion_dl_platform__nptl_nthreads__nptl_deallocate_tsd__libc_enable_secure__libc_init_first__pthread_initialize_minimal_dl_x86_feature_1__libc_setup_tls_dl_hwcap__tunable_get_val__tunables_init__libc_init_secure_dl_phnum_dl_phdr__libc_stack_end__environ_dl_starting_updl_iterate_phdrpthread_once__hypot_finite__issignalinghypothypotf64hypotf32x__ieee754_hypotcabsf64cabsf32x__hypot__cabscosf64cosf32x__cos__cos_avx__cos_fma__cos_fma4sinf64sinf32x__sin__sin_avx__sin_fma__sin_fma4_dl_x86_cpu_features__cos_sse2errno__branred__sincostab__sin_sse2__gcclibcxx_demangle_callbackrealloc_ZTSN10__cxxabiv117__class_type_infoE_ZNK10__cxxabiv117__class_type_info12__do_dyncastElNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE_ZN10__cxxabiv117__class_type_infoD0Ev_ZN10__cxxabiv117__class_type_infoD1Ev_ZNK10__cxxabiv117__class_type_info20__do_find_public_srcElPKvPKS0_S2__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4nposE_ZN9__gnu_cxxeqIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEbRKNS_17__normal_iteratorIT_T0_EESE__ZN9__gnu_cxxeqIPcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEbRKNS_17__normal_iteratorIT_T0_EESD__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6substrEmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IPKcvEET_S8_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IPKcvEET_S8_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ESt16initializer_listIcERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ESt16initializer_listIcERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_mmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_mmRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_mRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_mRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IPcvEET_S7_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IPcvEET_S7_RKS3__ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_SA__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPKcS4_EEEEvT_SB_St20forward_iterator_tag_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IN9__gnu_cxx17__normal_iteratorIPcS4_EEvEET_SA_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IN9__gnu_cxx17__normal_iteratorIPcS4_EEvEET_SA_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPcS4_EEEEvT_SA_St20forward_iterator_tag_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EES5_RKS8__ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC1EPcOS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC2EPcOS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC1EPcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC2EPcRKS3__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmRKS4_mm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEmmRKS4__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareERKS4__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findERKS4_m_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13get_allocatorEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4dataEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4swapERS4__ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4copyEPcmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmRKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmRKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPcS4_EESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_NS6_IPcS4_EESB__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S9_S9__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_St16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_RKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_S8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_PcSA__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_m_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmRKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmRKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSESt16initializer_listIcE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_mm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_mc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEmmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8pop_backEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPKcS4_EE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9push_backEc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4backEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4backEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5frontEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5frontEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE2atEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE2atEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEixEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEixEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5emptyEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5clearEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13shrink_to_fitEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8capacityEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8max_sizeEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6lengthEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4sizeEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5crendEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7crbeginEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4cendEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6cbeginEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4rendEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4rendEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6rbeginEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6rbeginEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE3endEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE3endEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5beginEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5beginEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EOS4_RKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EOS4__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EmcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EmcRKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS3__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_eraseEmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_S_compareEmm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcPKcS7__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcS5_S5__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcS4_EESA__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS5_S4_EES8__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_S_assignEPcmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_S_moveEPcPKcm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_S_copyEPcPKcm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_disjunctEPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_limitEmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE15_M_check_lengthEmmPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_checkEmPKc_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_get_allocatorEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_get_allocatorEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE18_M_construct_aux_2Emc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructEmc_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_destroyEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_disposeEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_is_localEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_set_lengthEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_capacityEm_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_local_dataEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_local_dataEv_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_M_dataEv_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_lengthEm_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_M_dataEPc_ZNSt12__sso_stringaSEOS__ZNSt12__sso_stringC1EOS__ZNSt12__sso_stringC2EOS__ZNSt12__sso_stringD1Ev_ZNSt12__sso_stringD2Ev_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4__ZNSt12__sso_stringaSERKS__ZNSt12__sso_stringC1ERKS__ZNSt12__sso_stringC2ERKS__ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag_ZNSt12__sso_stringC2EPKcm_ZNSt12__sso_stringC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag_ZNSt12__sso_stringC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZNSt12__sso_stringC1Ev_ZNSt12__sso_stringC2Ev_ZNSs4nposE_ZNSs4_Rep11_S_max_sizeE_ZNSs4_Rep11_S_terminalE_ZNSt13random_device14_M_init_pretr1ERKSsfopen_ZNSt13random_device7_M_initERKSs_ZN9__gnu_cxxeqIPKcSsEEbRKNS_17__normal_iteratorIT_T0_EES8__ZN9__gnu_cxxeqIPcSsEEbRKNS_17__normal_iteratorIT_T0_EES7__ZNSsC1IPKcEET_S2_RKSaIcE_ZNSsC2IPKcEET_S2_RKSaIcE_ZNSsC1ESt16initializer_listIcERKSaIcE_ZNSsC2ESt16initializer_listIcERKSaIcE_ZNSsC2EPKcRKSaIcE_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_St16initializer_listIcE_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm_ZNSs7replaceEmmPKc_ZNSs7replaceEmmRKSsmm_ZNSs7replaceEmmRKSs_ZNSs7replaceEmmPKcm_ZNSsC2EPKcmRKSaIcE_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag_ZNSsC1IPcEET_S1_RKSaIcE_ZNSsC2IPcEET_S1_RKSaIcE_ZNSsC1ERKSsmmRKSaIcE_ZNSsC2ERKSsmmRKSaIcE_ZNKSs6substrEmm_ZNSsC1ERKSsmm_ZNSsC2ERKSsmm_ZNSsC1ERKSsmRKSaIcE_ZNSsC2ERKSsmRKSaIcE_ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE_ZNSs12_S_constructIN9__gnu_cxx17__normal_iteratorIPcSsEEEES2_T_S4_RKSaIcESt20forward_iterator_tag_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8__ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6__ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6__ZNSsaSERKSs_ZNSsC1ERKSsRKSaIcE_ZNSsC2ERKSsRKSaIcE_ZNSsC2ERKSs_ZNSs4_Rep7_M_grabERKSaIcES2__ZNSspLEc_ZNSs9push_backEc_ZNSs6resizeEm_ZNSs6resizeEmc_ZNSs6appendEmc_ZNSs6appendESt16initializer_listIcE_ZNSspLEPKc_ZNSs6appendEPKc_ZNSspLESt16initializer_listIcE_ZNSs6appendEPKcm_ZNSs6appendERKSsmm_ZNSspLERKSs_ZNSs6appendERKSs_ZNSs13shrink_to_fitEv_ZNSs7reserveEm_ZNSs4_Rep8_M_cloneERKSaIcEm_ZNSs4_Rep10_M_refcopyEv_ZNSs8pop_backEv_ZNSs6insertEmRKSs_ZNSs6insertEmPKc_ZNSs6insertEmRKSsmm_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEESt16initializer_listIcE_ZNSs6insertEmPKcm_ZNSs6assignESt16initializer_listIcE_ZNSsaSEPKc_ZNSs6assignEPKc_ZNSs6assignERKSsmm_ZNSsaSESt16initializer_listIcE_ZNSs6assignEPKcm_ZNSs15_M_replace_safeEmmPKcm_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc_ZNSs7replaceEmmmc_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc_ZNSs6insertEmmc_ZNSsaSEc_ZNSs6assignEmc_ZNSs14_M_replace_auxEmmmc_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2__ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE_ZNSs5eraseEmm_ZNSs2atEm_ZNSs4backEv_ZNSs6rbeginEv_ZNSs3endEv_ZNSs4rendEv_ZNSs5beginEv_ZNSsixEm_ZNSs5frontEv_ZNSs7_M_leakEv_ZNSs12_M_leak_hardEv_ZNSs9_M_mutateEmmm_ZNSs5clearEv_ZNSsD1Ev_ZNSsD2Ev_ZNSs4_Rep10_M_disposeERKSaIcE_ZNSs18_S_construct_aux_2EmcRKSaIcE_ZNSsC1EmcRKSaIcE_ZNSsC2EmcRKSaIcE_ZNSsC1ERKSaIcE_ZNSsC2ERKSaIcE_ZNSs12_S_constructEmcRKSaIcE_ZNSs4_Rep9_S_createEmmRKSaIcE_ZNSs4_Rep10_M_refdataEv_ZNSs4_Rep26_M_set_length_and_sharableEm_ZNSs4_Rep15_M_set_sharableEv_ZNSs4_Rep13_M_set_leakedEv_ZNKSs4_Rep12_M_is_sharedEv_ZNKSs4_Rep12_M_is_leakedEv_ZNSs4_Rep12_S_empty_repEv_ZNSs12_Alloc_hiderC1EPcRKSaIcE_ZNSs12_Alloc_hiderC2EPcRKSaIcE_ZNKSs7compareEmmPKcm_ZNKSs7compareEmmPKc_ZNKSs7compareEPKc_ZNKSs7compareEmmRKSsmm_ZNKSs7compareEmmRKSs_ZNKSs7compareERKSs_ZNKSs16find_last_not_ofEcm_ZNKSs16find_last_not_ofEPKcm_ZNKSs16find_last_not_ofERKSsm_ZNKSs16find_last_not_ofEPKcmm_ZNKSs17find_first_not_ofEcm_ZNKSs17find_first_not_ofEPKcm_ZNKSs17find_first_not_ofERKSsm_ZNKSs17find_first_not_ofEPKcmm_ZNKSs12find_last_ofEcm_ZNKSs12find_last_ofEPKcm_ZNKSs12find_last_ofERKSsm_ZNKSs12find_last_ofEPKcmm_ZNKSs13find_first_ofEcm_ZNKSs13find_first_ofEPKcm_ZNKSs13find_first_ofERKSsm_ZNKSs13find_first_ofEPKcmm_ZNKSs5rfindEcm_ZNKSs5rfindEPKcm_ZNKSs5rfindERKSsm_ZNKSs5rfindEPKcmm_ZNKSs4findEcm_ZNKSs4findEPKcm_ZNKSs4findERKSsmmemcmp_ZNKSs4findEPKcmm_ZNKSs13get_allocatorEv_ZNKSs4dataEv_ZNKSs5c_strEv_ZNSs6assignEOSs_ZNSsaSEOSs_ZNKSs4copyEPcmm_ZNKSs4backEv_ZNKSs5frontEv_ZNKSs2atEm_ZNKSsixEm_ZNKSs5emptyEv_ZNKSs8capacityEv_ZNKSs8max_sizeEv_ZNKSs6lengthEv_ZNKSs4sizeEv_ZNKSs5crendEv_ZNKSs7crbeginEv_ZNKSs4cendEv_ZNKSs6cbeginEv_ZNKSs4rendEv_ZNKSs6rbeginEv_ZNKSs3endEv_ZNKSs5beginEv_ZNSsC1EOSsRKSaIcE_ZNSsC2EOSsRKSaIcE_ZNSsC1EOSs_ZNSsC2EOSs_ZNSsC1Ev_ZNSsC2Ev_ZNSs12_S_empty_repEv_ZNSs10_S_compareEmm_ZNSs13_S_copy_charsEPcPKcS1__ZNSs13_S_copy_charsEPcS_S__ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4__ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2__ZNSs9_M_assignEPcmc_ZNSs7_M_moveEPcPKcm_ZNSs7_M_copyEPcPKcm_ZNKSs11_M_disjunctEPKc_ZNKSs8_M_limitEmm_ZNKSs15_M_check_lengthEmmPKc_ZNKSs8_M_checkEmPKc_ZNKSs7_M_iendEv_ZNKSs9_M_ibeginEv_ZNKSs6_M_repEv_ZNSs7_M_dataEPc_ZNKSs7_M_dataEv_ZGTtNSt15underflow_errorD0Ev_ZGTtNSt15underflow_errorD2Ev_ZGTtNSt15underflow_errorD1Ev_ZGTtNSt15underflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt15underflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt15underflow_errorC2EPKc_ZGTtNSt15underflow_errorC1EPKc_ZGTtNSt14overflow_errorD0Ev_ZGTtNSt14overflow_errorD2Ev_ZGTtNSt14overflow_errorD1Ev_ZGTtNSt14overflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt14overflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt14overflow_errorC2EPKc_ZGTtNSt14overflow_errorC1EPKc_ZGTtNSt11range_errorD0Ev_ZGTtNSt11range_errorD2Ev_ZGTtNSt11range_errorD1Ev_ZGTtNSt11range_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11range_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11range_errorC2EPKc_ZGTtNSt11range_errorC1EPKc_ZGTtNKSt13runtime_error4whatEv_ZGTtNSt13runtime_errorD0Ev_ZGTtNSt13runtime_errorD2Ev_ZGTtNSt13runtime_errorD1Ev_ZGTtNSt13runtime_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt13runtime_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt13runtime_errorC2EPKc_ZGTtNSt13runtime_errorC1EPKc_ZGTtNSt12out_of_rangeD0Ev_ZGTtNSt12out_of_rangeD2Ev_ZGTtNSt12out_of_rangeD1Ev_ZGTtNSt12out_of_rangeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12out_of_rangeC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12out_of_rangeC2EPKc_ZGTtNSt12out_of_rangeC1EPKc_ZGTtNSt12length_errorD0Ev_ZGTtNSt12length_errorD2Ev_ZGTtNSt12length_errorD1Ev_ZGTtNSt12length_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12length_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12length_errorC2EPKc_ZGTtNSt12length_errorC1EPKc_ZGTtNSt16invalid_argumentD0Ev_ZGTtNSt16invalid_argumentD2Ev_ZGTtNSt16invalid_argumentD1Ev_ZGTtNSt16invalid_argumentC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt16invalid_argumentC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt16invalid_argumentC2EPKc_ZGTtNSt16invalid_argumentC1EPKc_ZGTtNSt12domain_errorD0Ev_ZGTtNSt12domain_errorD2Ev_ZGTtNSt12domain_errorD1Ev_ZGTtNSt12domain_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12domain_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt12domain_errorC2EPKc_ZGTtNSt12domain_errorC1EPKc_ZGTtNKSt11logic_error4whatEv_ZGTtdlPv_ZGTtNSt11logic_errorD0Ev_ZGTtNSt11logic_errorD2Ev_ZGTtNSt11logic_errorD1Ev_ZGTtNSt11logic_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11logic_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE_ZGTtNSt11logic_errorC2EPKc_ITM_memcpyRnWt_ZGTtNSt11logic_errorC1EPKc_Z28_txnal_runtime_error_get_msgPv_Z26_txnal_logic_error_get_msgPv_ITM_addUserCommitAction_Z20_txnal_cow_string_D1Pv_Z23_txnal_sso_string_c_strPKv_ITM_RU8_Z23_txnal_cow_string_c_strPKv_ITM_memcpyRtWn_ZGTtnam_ITM_RU1_Z35_txnal_cow_string_C1_for_exceptionsPvPKcS__ZNKSt3_V214error_category10_M_messageEi_ZNSt12__cow_stringaSEOS__ZNSt12__cow_stringC1EOS__ZNSt12__cow_stringC2EOS__ZNSt12__cow_stringD1Ev_ZNSt12__cow_stringD2Ev_ZNSt12__cow_stringaSERKS__ZNSt12__cow_stringC1ERKS__ZNSt12__cow_stringC2ERKS__ZNSt12__cow_stringC1EPKcm_ZNSsC1EPKcmRKSaIcE_ZNSt12__cow_stringC2EPKcm_ZNSt12__cow_stringC1ERKSs_ZNSt12__cow_stringC2ERKSs_ZNSt12__cow_stringC1Ev_ZNSt12__cow_stringC2Ev_ZNSt12__sso_stringC1ERKSs_ZNSt12__sso_stringC1EPKcm_ZNSt12__sso_stringC2ERKSs_ZNSt15underflow_errorC2EPKc_ZNSt14overflow_errorC2EPKc_ZNSt11range_errorC2EPKc_ZNSt13runtime_errorC2EPKc_ZNSt12out_of_rangeC2EPKc_ZNSt12length_errorC2EPKc_ZNSt16invalid_argumentC2EPKc_ZNSt12domain_errorC2EPKc_ZNSsC1EPKcRKSaIcE_ZNSt11logic_errorC2EPKc_ZNSt13runtime_erroraSEOS__ZNSt13runtime_errorC1EOS__ZNSt13runtime_errorC2EOS__ZNSt13runtime_erroraSERKS__ZNSt13runtime_errorC1ERKS__ZNSt13runtime_errorC2ERKS__ZNSs4swapERSs_ZNSt11logic_erroraSEOS__ZNSt11logic_errorC1EOS__ZNSt11logic_errorC2EOS__ZNSs6assignERKSs_ZNSt11logic_erroraSERKS__ZNSt11logic_errorC1ERKS__ZNSt11logic_errorC2ERKS__Z27_txnal_cow_string_D1_commitPv_ZTSSt15underflow_error_ZTSSt14overflow_error_ZTSSt11range_error_ZTSSt13runtime_error_ZTSSt12out_of_range_ZTSSt12length_error_ZTSSt16invalid_argument_ZTSSt12domain_error_ZTSSt11logic_error_ZNSt15underflow_errorC1ERKSs_ZNSt15underflow_errorC2ERKSs_ZNSt14overflow_errorC1ERKSs_ZNSt14overflow_errorC2ERKSs_ZNSt11range_errorC1ERKSs_ZNSt11range_errorC2ERKSs_ZNSt13runtime_errorC1ERKSs_ZNSt13runtime_errorC2ERKSs_ZNSt12out_of_rangeC1ERKSs_ZNSt12out_of_rangeC2ERKSs_ZNSt12length_errorC1ERKSs_ZNSt12length_errorC2ERKSs_ZNSt16invalid_argumentC1ERKSs_ZNSt16invalid_argumentC2ERKSs_ZNSt12domain_errorC1ERKSs_ZNSt12domain_errorC2ERKSs_ZNSt11logic_errorC1ERKSs_ZNSsC1ERKSs_ZNSt11logic_errorC2ERKSs_ZNSt15underflow_errorD0Ev_ZTVSt15underflow_error_ZNSt15underflow_errorD2Ev_ZNSt14overflow_errorD0Ev_ZTVSt14overflow_error_ZNSt14overflow_errorD2Ev_ZNSt11range_errorD0Ev_ZTVSt11range_error_ZNSt11range_errorD2Ev_ZNSt13runtime_errorD0Ev_ZTVSt13runtime_error_ZNSt13runtime_errorD2Ev_ZNSt12out_of_rangeD0Ev_ZTVSt12out_of_range_ZNSt12out_of_rangeD2Ev_ZNSt12length_errorD0Ev_ZTVSt12length_error_ZNSt12length_errorD2Ev_ZNSt16invalid_argumentD0Ev_ZTVSt16invalid_argument_ZNSt16invalid_argumentD2Ev_ZNSt12domain_errorD0Ev_ZTVSt12domain_error_ZNSt12domain_errorD2Ev_ZNSt11logic_errorD0Ev_ZNSs4_Rep10_M_destroyERKSaIcE_ZNSs4_Rep20_S_empty_rep_storageE_ZTVSt11logic_error_ZNSt11logic_errorD2Ev_ZNKSt13runtime_error4whatEv_ZNKSt11logic_error4whatEvfputcstderr__cxa_demangle__cxa_current_exception_type_ZTVSt9type_info_ZTISt9type_info_ZTSSt9type_info_ZNKSt9type_info10__do_catchEPKS_PPvj_ZNSt9type_infoD0Ev_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv_ZNSt9type_infoD1Ev_ZNSt9type_infoD2Ev_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj_ZNKSt9type_info15__is_function_pEv_ZNKSt9type_info14__is_pointer_pEv_ZTIN10__cxxabiv117__class_type_infoE_ZTIN10__cxxabiv120__si_class_type_infoE_ZTSN10__cxxabiv120__si_class_type_infoE_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE_ZNK10__cxxabiv120__si_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2__ZN10__cxxabiv120__si_class_type_infoD0Ev_ZN10__cxxabiv120__si_class_type_infoD1Ev_ZN10__cxxabiv117__class_type_infoD2Ev_ZN10__cxxabiv120__si_class_type_infoD2Ev__cxa_deleted_virtual_ZSt7nothrow_ZSt15set_new_handlerPFvvE_ZN9__gnu_cxx27__verbose_terminate_handlerEv__tls_get_addr_ZTVN10__cxxabiv119__foreign_exceptionE__cxa_pure_virtual_ZTVN10__cxxabiv115__forced_unwindE_ZTVSt9exception_ZTSN10__cxxabiv119__foreign_exceptionE_ZTSN10__cxxabiv115__forced_unwindE_ZTSSt13bad_exception_ZTVN10__cxxabiv117__class_type_infoE_ZTSSt9exception_ZGTtNKSt13bad_exception4whatEv_ZGTtNKSt13bad_exceptionD1Ev_ZGTtNKSt9exception4whatEv_ZGTtNKSt9exceptionD1Ev_ZN10__cxxabiv119__foreign_exceptionD0Ev_ZN10__cxxabiv119__foreign_exceptionD1Ev_ZN10__cxxabiv119__foreign_exceptionD2Ev_ZN10__cxxabiv115__forced_unwindD0Ev_ZN10__cxxabiv115__forced_unwindD1Ev_ZN10__cxxabiv115__forced_unwindD2Ev_ZNSt13bad_exceptionD0Ev_ZNSt9exceptionD0Ev_ZNKSt13bad_exception4whatEv_ZNKSt9exception4whatEv_ZNSt13bad_exceptionD2Ev_ZNSt9exceptionD1Ev_ZSt19uncaught_exceptionsv_ZSt18uncaught_exceptionv__cxa_get_exception_ptrpthread_mutex_lockpthread_mutex_unlock__pthread_key_create_ZTSN9__gnu_cxx26__concurrence_unlock_errorE_ZTSN9__gnu_cxx24__concurrence_lock_errorE__cxa_free_dependent_exception__cxa_allocate_dependent_exception_ZN9__gnu_cxx9__freeresEv_ZTIN9__gnu_cxx26__concurrence_unlock_errorE_ZTIN9__gnu_cxx24__concurrence_lock_errorE_ZN9__gnu_cxx30__throw_concurrence_lock_errorEv_ZN9__gnu_cxx26__concurrence_unlock_errorD0Ev_ZN9__gnu_cxx24__concurrence_lock_errorD0Ev_ZN9__gnu_cxx26__concurrence_unlock_errorD1Ev_ZTVN9__gnu_cxx26__concurrence_unlock_errorE_ZN9__gnu_cxx26__concurrence_unlock_errorD2Ev_ZN9__gnu_cxx24__concurrence_lock_errorD1Ev_ZTVN9__gnu_cxx24__concurrence_lock_errorE_ZN9__gnu_cxx24__concurrence_lock_errorD2Ev_ZNK9__gnu_cxx26__concurrence_unlock_error4whatEv_ZNK9__gnu_cxx24__concurrence_lock_error4whatEv_ZTSSt10bad_typeid_ZNSt10bad_typeidD0Ev_ZNSt10bad_typeidD2Ev_ZNKSt10bad_typeid4whatEv_ZTSSt8bad_cast_ZNSt8bad_castD0Ev_ZNSt8bad_castD2Ev_ZNKSt8bad_cast4whatEv_ZTISt9exception_ZTVN10__cxxabiv120__si_class_type_infoE_ZTSSt9bad_alloc_ZdlPvm_ZNSt9bad_allocD0Ev_ZNSt9exceptionD2Ev_ZNSt9bad_allocD2Ev_ZNKSt9bad_alloc4whatEv_ZN9__gnu_cxx15__concat_size_tEPcmm_ZN9__gnu_cxx26__throw_insufficient_spaceEPKcS1__ZTISt15underflow_error_ZNSt15underflow_errorD1Ev_ZNSt15underflow_errorC1EPKc_ZSt23__throw_underflow_errorPKc_ZTISt14overflow_error_ZNSt14overflow_errorD1Ev_ZNSt14overflow_errorC1EPKc_ZSt22__throw_overflow_errorPKc_ZTISt11range_error_ZNSt11range_errorD1Ev_ZNSt11range_errorC1EPKc_ZSt19__throw_range_errorPKc_ZTISt13runtime_error_ZNSt13runtime_errorD1Ev_ZNSt13runtime_errorC1EPKc_ZSt21__throw_runtime_errorPKc_ZN9__gnu_cxx15__snprintf_liteEPcmPKcP13__va_list_tag_ZSt24__throw_out_of_range_fmtPKcz_ZTISt12out_of_range_ZNSt12out_of_rangeD1Ev_ZNSt12out_of_rangeC1EPKc_ZSt20__throw_out_of_rangePKc_ZTISt12length_error_ZNSt12length_errorD1Ev_ZNSt12length_errorC1EPKc_ZTISt16invalid_argument_ZNSt16invalid_argumentD1Ev_ZNSt16invalid_argumentC1EPKc_ZSt24__throw_invalid_argumentPKc_ZTISt12domain_error_ZNSt12domain_errorD1Ev_ZNSt12domain_errorC1EPKc_ZSt20__throw_domain_errorPKc_ZTISt11logic_error_ZNSt11logic_errorD1Ev_ZNSt11logic_errorC1EPKcgettext_ZSt19__throw_logic_errorPKc_ZTVSt10bad_typeid_ZTISt10bad_typeid_ZNSt10bad_typeidD1Ev_ZSt18__throw_bad_typeidv_ZTVSt8bad_cast_ZTISt8bad_cast_ZNSt8bad_castD1Ev_ZSt16__throw_bad_castv_ZSt17__throw_bad_allocv_ZSt21__throw_bad_exceptionv_ZTVSt9bad_alloc_ZTISt9bad_alloc_ZNSt9bad_allocD1Ev_ZSt15get_new_handlervmalloc__cxa_get_globals__cxa_init_primary_exception__cxa_free_exception_ZSt14get_unexpectedv_ZN10__cxxabiv120__unexpected_handlerE_ZSt14set_unexpectedPFvvE_ZSt13get_terminatev_ZN10__cxxabiv119__terminate_handlerE_ZSt13set_terminatePFvvE_ZN10__cxxabiv111__terminateEPFvvE__cxa_rethrow__cxa_end_catch__cxa_throw_ZTVSt13bad_exception_ZNSt13bad_exceptionD1Ev__cxa_allocate_exception_ZTISt13bad_exception__cxa_get_globals_fast_ZN10__cxxabiv112__unexpectedEPFvvE__cxa_call_unexpected__cxa_begin_catch_ZTIN10__cxxabiv115__forced_unwindE_ZSt10unexpectedv_ZTIN10__cxxabiv119__foreign_exceptionE_ZSt9terminatev__cxa_call_terminatefree__gxx_personality_v0__stack_chk_failcabscossin_ZSt20__throw_length_errorPKcmemcpy_ZdlPv_Znwm_ZNSt6vectorIdSaIdEE17_M_realloc_insertIJdEEEvN9__gnu_cxx17__normal_iteratorIPdS1_EEDpOT__ITM_registerTMCloneTable_ITM_deregisterTMCloneTable__gmon_start____data_start__libc_start_main_IO_stdin_useddata_startmain__libc_csu_init_start__libc_csu_fini.init_array.fini_array.debug_abbrev.text.got.comment.got.plt.rela.plt__libc_atexit.init.tbss.bss__libc_freeres_ptrs__libc_subfreeres__libc_IO_vtables.debug_aranges.debug_ranges.debug_str.data.rel.ro.debug_info.note.gnu.gold-version__libc_freeres_fn.data.rel.ro.local.fini.note.ABI-tag.debug_line.eh_frame.gcc_except_table.tm_clone_table.note.gnu.build-id.debug_loc.shstrtab.strtab.symtab.tdata.rodata.data(@ n@$DB@X\0@0IP@P'@g mIm "wIw wIw  L9K9 Bp>K> ]LM b]LM P]LM / ،L| L| L}  -L ;L L ( ^L L H`L` h NLȳ hLг  mLг (20г  h I' "J PSJ 6cO 09X Kģ  h%H+sKDAB-hotspot-41e5de7/tests/modeltests/vector_static_gcc/vector_static_gcc_v9.1.0.expected.txt000066400000000000000000001445201515036260400323140ustar00rootroot000000000000004294544 418790: f3 0f 1e fa endbr64 4294548 418794: 55 push %rbp 4294549 418795: 53 push %rbx 4294550 418796: 48 83 ec 28 sub $0x28,%rsp 4294554 41879a: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax 4294561 4187a1: 00 00 4294563 4187a3: 48 89 44 24 18 mov %rax,0x18(%rsp) 4294568 4187a8: 31 c0 xor %eax,%eax 4294570 4187aa: c4 e1 f9 7e c0 vmovq %xmm0,%rax 4294575 4187af: c5 f8 ae 5c 24 08 vstmxcsr 0x8(%rsp) 4294581 4187b5: 8b 5c 24 08 mov 0x8(%rsp),%ebx 4294585 4187b9: 48 c1 f8 20 sar $0x20,%rax 4294589 4187bd: 25 ff ff ff 7f and $0x7fffffff,%eax 4294594 4187c2: 89 da mov %ebx,%edx 4294596 4187c4: 80 e6 9f and $0x9f,%dh 4294599 4187c7: 89 54 24 10 mov %edx,0x10(%rsp) 4294603 4187cb: 39 d3 cmp %edx,%ebx 4294605 4187cd: /----------------------------- 0f 85 ed 03 00 00 jne 418bc0 <__cos_fma+0x430> 4294611 4187d3: | c5 fb 10 0d c5 1b 08 vmovsd 0x81bc5(%rip),%xmm1 # 49a3a0 4294618 4187da: | 00 4294619 4187db: | 31 ed xor %ebp,%ebp 4294621 4187dd: | 3d ff ff 3f 3e cmp $0x3e3fffff,%eax 4294626 4187e2: | /----------------------- 0f 8e c9 00 00 00 jle 4188b1 <__cos_fma+0x121> 4294632 4187e8: | /--|----------------------> 3d ff 5f eb 3f cmp $0x3feb5fff,%eax 4294637 4187ed: | | | /-- 0f 8f dd 00 00 00 jg 4188d0 <__cos_fma+0x140> 4294643 4187f3: | | | | c5 f1 57 c9 vxorpd %xmm1,%xmm1,%xmm1 4294647 4187f7: | | | | c5 fb 10 1d e9 1a 08 vmovsd 0x81ae9(%rip),%xmm3 # 49a2e8 4294654 4187fe: | | | | 00 4294655 4187ff: | | | | c5 fb 10 25 39 1b 08 vmovsd 0x81b39(%rip),%xmm4 # 49a340 4294662 418806: | | | | 00 4294663 418807: | | | | 48 8d 15 d2 5d 08 00 lea 0x85dd2(%rip),%rdx # 49e5e0 <__sincostab> 4294670 41880e: | | | | c5 fb c2 d1 05 vcmpnltsd %xmm1,%xmm0,%xmm2 4294675 418813: | | | | c5 f9 54 05 a5 1c 08 vandpd 0x81ca5(%rip),%xmm0,%xmm0 # 49a4c0 4294682 41881a: | | | | 00 4294683 41881b: | | | | c4 e3 61 4b d9 20 vblendvpd %xmm2,%xmm1,%xmm3,%xmm3 4294689 418821: | | | | c5 fb 10 0d 0f 1b 08 vmovsd 0x81b0f(%rip),%xmm1 # 49a338 4294696 418828: | | | | 00 4294697 418829: | | | | c5 fb 58 d1 vaddsd %xmm1,%xmm0,%xmm2 4294701 41882d: | | | | c5 eb 5c c9 vsubsd %xmm1,%xmm2,%xmm1 4294705 418831: | | | | c4 e1 f9 7e d0 vmovq %xmm2,%rax 4294710 418836: | | | | c1 e0 02 shl $0x2,%eax 4294713 418839: | | | | 8d 48 02 lea 0x2(%rax),%ecx 4294716 41883c: | | | | 8d 70 01 lea 0x1(%rax),%esi 4294719 41883f: | | | | c5 fb 5c c1 vsubsd %xmm1,%xmm0,%xmm0 4294723 418843: | | | | 48 63 c9 movslq %ecx,%rcx 4294726 418846: | | | | 48 63 f6 movslq %esi,%rsi 4294729 418849: | | | | c5 fb 10 14 f2 vmovsd (%rdx,%rsi,8),%xmm2 4294734 41884e: | | | | c5 fb 58 c3 vaddsd %xmm3,%xmm0,%xmm0 4294738 418852: | | | | c5 fb 59 d8 vmulsd %xmm0,%xmm0,%xmm3 4294742 418856: | | | | c4 e2 e1 a9 25 a1 1b vfmadd213sd 0x81ba1(%rip),%xmm3,%xmm4 # 49a400 4294749 41885d: | | | | 08 00 4294751 41885f: | | | | c5 fb 59 cb vmulsd %xmm3,%xmm0,%xmm1 4294755 418863: | | | | c4 e2 f1 b9 c4 vfmadd231sd %xmm4,%xmm1,%xmm0 4294760 418868: | | | | c5 fb 10 0d e0 1a 08 vmovsd 0x81ae0(%rip),%xmm1 # 49a350 4294767 41886f: | | | | 00 4294768 418870: | | | | c4 e2 e1 a9 0d 8f 1b vfmadd213sd 0x81b8f(%rip),%xmm3,%xmm1 # 49a408 4294775 418877: | | | | 08 00 4294777 418879: | | | | c4 e2 e1 a9 0d de 1a vfmadd213sd 0x81ade(%rip),%xmm3,%xmm1 # 49a360 4294784 418880: | | | | 08 00 4294786 418882: | | | | c5 e3 59 d9 vmulsd %xmm1,%xmm3,%xmm3 4294790 418886: | | | | c5 fb 10 0c ca vmovsd (%rdx,%rcx,8),%xmm1 4294795 41888b: | | | | 8d 48 03 lea 0x3(%rax),%ecx 4294798 41888e: | | | | 48 98 cltq 4294800 418890: | | | | 48 63 c9 movslq %ecx,%rcx 4294803 418893: | | | | c4 e2 f9 ad 14 ca vfnmadd213sd (%rdx,%rcx,8),%xmm0,%xmm2 4294809 418899: | | | | c4 e2 e9 9d d9 vfnmadd132sd %xmm1,%xmm2,%xmm3 4294814 41889e: | | | | c4 e2 e1 9d 04 c2 vfnmadd132sd (%rdx,%rax,8),%xmm3,%xmm0 4294820 4188a4: | | | | c5 f3 58 c8 vaddsd %xmm0,%xmm1,%xmm1 4294824 4188a8: /--------|--|--|--------------------|-> 40 84 ed test %bpl,%bpl 4294827 4188ab: | | | | /--------|-- 0f 85 e7 02 00 00 jne 418b98 <__cos_fma+0x408> 4294833 4188b1: | | | >-----------|--------|-> 48 8b 44 24 18 mov 0x18(%rsp),%rax 4294838 4188b6: | | | | | | 64 48 33 04 25 28 00 xor %fs:0x28,%rax 4294845 4188bd: | | | | | | 00 00 4294847 4188bf: /--|--------|--|--|-----------|--------|-- 0f 85 f3 06 00 00 jne 418fb8 <__cos_fma+0x828> 4294853 4188c5: | | | | | | | 48 83 c4 28 add $0x28,%rsp 4294857 4188c9: | | | | | | | c5 f9 28 c1 vmovapd %xmm1,%xmm0 4294861 4188cd: | | | | | | | 5b pop %rbx 4294862 4188ce: | | | | | | | 5d pop %rbp 4294863 4188cf: | | | | | | | c3 retq 4294864 4188d0: | | | | | | \-> 3d fc 68 03 40 cmp $0x400368fc,%eax 4294869 4188d5: | | | | | | /-- 0f 8f 25 01 00 00 jg 418a00 <__cos_fma+0x270> 4294875 4188db: | | | | | | | c5 fa 7e 2d dd 1b 08 vmovq 0x81bdd(%rip),%xmm5 # 49a4c0 4294882 4188e2: | | | | | | | 00 4294883 4188e3: | | | | | | | c5 fb 10 15 7d 1a 08 vmovsd 0x81a7d(%rip),%xmm2 # 49a368 4294890 4188ea: | | | | | | | 00 4294891 4188eb: | | | | | | | c5 fb 10 1d 15 1a 08 vmovsd 0x81a15(%rip),%xmm3 # 49a308 4294898 4188f2: | | | | | | | 00 4294899 4188f3: | | | | | | | c5 f9 54 c5 vandpd %xmm5,%xmm0,%xmm0 4294903 4188f7: | | | | | | | c5 eb 5c c0 vsubsd %xmm0,%xmm2,%xmm0 4294907 4188fb: | | | | | | | c5 fb 10 15 ed 19 08 vmovsd 0x819ed(%rip),%xmm2 # 49a2f0 4294914 418902: | | | | | | | 00 4294915 418903: | | | | | | | c5 fb 58 ca vaddsd %xmm2,%xmm0,%xmm1 4294919 418907: | | | | | | | c5 fb 5c c1 vsubsd %xmm1,%xmm0,%xmm0 4294923 41890b: | | | | | | | c5 fb 11 4c 24 08 vmovsd %xmm1,0x8(%rsp) 4294929 418911: | | | | | | | c5 fb 58 c2 vaddsd %xmm2,%xmm0,%xmm0 4294933 418915: | | | | | | | c5 f9 28 d1 vmovapd %xmm1,%xmm2 4294937 418919: | | | | | | | c5 e9 54 d5 vandpd %xmm5,%xmm2,%xmm2 4294941 41891d: | | | | | | | c5 f9 2f da vcomisd %xmm2,%xmm3 4294945 418921: | | | | | | | c5 fb 11 44 24 10 vmovsd %xmm0,0x10(%rsp) 4294951 418927: | | /-----|--|--|-----------|--------|-- 0f 87 93 04 00 00 ja 418dc0 <__cos_fma+0x630> 4294957 41892d: | | | | | | | | c5 e1 57 db vxorpd %xmm3,%xmm3,%xmm3 4294961 418931: | | | | | | | | c5 fa 7e 35 97 1b 08 vmovq 0x81b97(%rip),%xmm6 # 49a4d0 4294968 418938: | | | | | | | | 00 4294969 418939: | | | | | | | | c5 f9 2f d9 vcomisd %xmm1,%xmm3 4294973 41893d: | | | | | | /-----|--------|-- 0f 83 bd 02 00 00 jae 418c00 <__cos_fma+0x470> 4294979 418943: | | | | | | | /--|--------|-> c5 fb 10 25 ed 19 08 vmovsd 0x819ed(%rip),%xmm4 # 49a338 4294986 41894a: | | | | | | | | | | 00 4294987 41894b: | | | | | | | | | | c5 7b 10 05 ed 19 08 vmovsd 0x819ed(%rip),%xmm8 # 49a340 4294994 418952: | | | | | | | | | | 00 4294995 418953: | | | | | | | | | | 48 8d 15 86 5c 08 00 lea 0x85c86(%rip),%rdx # 49e5e0 <__sincostab> 4295002 41895a: | | | | | | | | | | c5 eb 58 dc vaddsd %xmm4,%xmm2,%xmm3 4295006 41895e: | | | | | | | | | | c5 e3 5c e4 vsubsd %xmm4,%xmm3,%xmm4 4295010 418962: | | | | | | | | | | c4 e1 f9 7e d8 vmovq %xmm3,%rax 4295015 418967: | | | | | | | | | | c1 e0 02 shl $0x2,%eax 4295018 41896a: | | | | | | | | | | 48 63 c8 movslq %eax,%rcx 4295021 41896d: | | | | | | | | | | 8d 70 03 lea 0x3(%rax),%esi 4295024 418970: | | | | | | | | | | c5 eb 5c d4 vsubsd %xmm4,%xmm2,%xmm2 4295028 418974: | | | | | | | | | | 48 63 f6 movslq %esi,%rsi 4295031 418977: | | | | | | | | | | c5 fb 10 1c f2 vmovsd (%rdx,%rsi,8),%xmm3 4295036 41897c: | | | | | | | | | | c5 eb 59 fa vmulsd %xmm2,%xmm2,%xmm7 4295040 418980: | | | | | | | | | | c4 62 c1 a9 05 77 1a vfmadd213sd 0x81a77(%rip),%xmm7,%xmm8 # 49a400 4295047 418987: | | | | | | | | | | 08 00 4295049 418989: | | | | | | | | | | c5 eb 59 e7 vmulsd %xmm7,%xmm2,%xmm4 4295053 41898d: | | | | | | | | | | c4 c2 f9 99 e0 vfmadd132sd %xmm8,%xmm0,%xmm4 4295058 418992: | | | | | | | | | | c5 7b 10 05 b6 19 08 vmovsd 0x819b6(%rip),%xmm8 # 49a350 4295065 418999: | | | | | | | | | | 00 4295066 41899a: | | | | | | | | | | c4 62 c1 a9 05 65 1a vfmadd213sd 0x81a65(%rip),%xmm7,%xmm8 # 49a408 4295073 4189a1: | | | | | | | | | | 08 00 4295075 4189a3: | | | | | | | | | | c4 62 c1 a9 05 b4 19 vfmadd213sd 0x819b4(%rip),%xmm7,%xmm8 # 49a360 4295082 4189aa: | | | | | | | | | | 08 00 4295084 4189ac: | | | | | | | | | | c5 eb 58 e4 vaddsd %xmm4,%xmm2,%xmm4 4295088 4189b0: | | | | | | | | | | c4 c1 43 59 f8 vmulsd %xmm8,%xmm7,%xmm7 4295093 4189b5: | | | | | | | | | | c4 e2 c1 99 d0 vfmadd132sd %xmm0,%xmm7,%xmm2 4295098 4189ba: | | | | | | | | | | c5 fb 10 04 ca vmovsd (%rdx,%rcx,8),%xmm0 4295103 4189bf: | | | | | | | | | | 8d 48 01 lea 0x1(%rax),%ecx 4295106 4189c2: | | | | | | | | | | 83 c0 02 add $0x2,%eax 4295109 4189c5: | | | | | | | | | | 48 63 c9 movslq %ecx,%rcx 4295112 4189c8: | | | | | | | | | | 48 98 cltq 4295114 4189ca: | | | | | | | | | | c5 f9 28 f9 vmovapd %xmm1,%xmm7 4295118 4189ce: | | | | | | | | | | c4 e2 d9 a9 1c ca vfmadd213sd (%rdx,%rcx,8),%xmm4,%xmm3 4295124 4189d4: | | | | | | | | | | c5 c1 54 fe vandpd %xmm6,%xmm7,%xmm7 4295128 4189d8: | | | | | | | | | | c4 e2 e1 9d d0 vfnmadd132sd %xmm0,%xmm3,%xmm2 4295133 4189dd: | | | | | | | | | | c4 e2 d9 b9 14 c2 vfmadd231sd (%rdx,%rax,8),%xmm4,%xmm2 4295139 4189e3: | | | | | | | | | | c5 fb 58 d2 vaddsd %xmm2,%xmm0,%xmm2 4295143 4189e7: | | | | | | | | | | c5 c9 55 f2 vandnpd %xmm2,%xmm6,%xmm6 4295147 4189eb: | | | | | | | | | | c5 c9 56 f7 vorpd %xmm7,%xmm6,%xmm6 4295151 4189ef: | | | | | | | | | | c5 f9 28 ce vmovapd %xmm6,%xmm1 4295155 4189f3: | +--|-----|--|--|-----|--|--|--------|-- e9 b0 fe ff ff jmpq 4188a8 <__cos_fma+0x118> 4295160 4189f8: | | | | | | | | | | 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 4295167 4189ff: | | | | | | | | | | 00 4295168 418a00: | | | | | | | | | \-> 3d fa 21 99 41 cmp $0x419921fa,%eax 4295173 418a05: | | | | | | | | | /-------- 0f 8f d5 01 00 00 jg 418be0 <__cos_fma+0x450> 4295179 418a0b: | | | | | | | | | | c5 fb 10 0d 65 19 08 vmovsd 0x81965(%rip),%xmm1 # 49a378 4295186 418a12: | | | | | | | | | | 00 4295187 418a13: | | | | | | | | | | c5 f9 28 d8 vmovapd %xmm0,%xmm3 4295191 418a17: | | | | | | | | | | c4 e2 f1 99 1d 50 19 vfmadd132sd 0x81950(%rip),%xmm1,%xmm3 # 49a370 4295198 418a1e: | | | | | | | | | | 08 00 4295200 418a20: | | | | | | | | | | c5 fb 10 15 68 19 08 vmovsd 0x81968(%rip),%xmm2 # 49a390 4295207 418a27: | | | | | | | | | | 00 4295208 418a28: | | | | | | | | | | c5 fb 10 2d 68 19 08 vmovsd 0x81968(%rip),%xmm5 # 49a398 4295215 418a2f: | | | | | | | | | | 00 4295216 418a30: | | | | | | | | | | c5 e3 5c c9 vsubsd %xmm1,%xmm3,%xmm1 4295220 418a34: | | | | | | | | | | c4 e1 f9 7e d8 vmovq %xmm3,%rax 4295225 418a39: | | | | | | | | | | c4 e2 f1 bd 05 3e 19 vfnmadd231sd 0x8193e(%rip),%xmm1,%xmm0 # 49a380 4295232 418a40: | | | | | | | | | | 08 00 4295234 418a42: | | | | | | | | | | 83 e0 03 and $0x3,%eax 4295237 418a45: | | | | | | | | | | c4 e2 f1 bd 05 3a 19 vfnmadd231sd 0x8193a(%rip),%xmm1,%xmm0 # 49a388 4295244 418a4c: | | | | | | | | | | 08 00 4295246 418a4e: | | | | | | | | | | 8d 48 01 lea 0x1(%rax),%ecx 4295249 418a51: | | | | | | | | | | c5 f9 28 e1 vmovapd %xmm1,%xmm4 4295253 418a55: | | | | | | | | | | c4 e2 f9 9d e2 vfnmadd132sd %xmm2,%xmm0,%xmm4 4295258 418a5a: | | | | | | | | | | c5 fb 5c c4 vsubsd %xmm4,%xmm0,%xmm0 4295262 418a5e: | | | | | | | | | | c4 e2 f1 bd c2 vfnmadd231sd %xmm2,%xmm1,%xmm0 4295267 418a63: | | | | | | | | | | c5 f9 28 d1 vmovapd %xmm1,%xmm2 4295271 418a67: | | | | | | | | | | c4 e2 d9 9d d5 vfnmadd132sd %xmm5,%xmm4,%xmm2 4295276 418a6c: | | | | | | | | | | c5 db 5c e2 vsubsd %xmm2,%xmm4,%xmm4 4295280 418a70: | | | | | | | | | | c5 f9 28 da vmovapd %xmm2,%xmm3 4295284 418a74: | | | | | | | | | | c5 fb 11 54 24 08 vmovsd %xmm2,0x8(%rsp) 4295290 418a7a: | | | | | | | | | | c4 e2 d9 9d cd vfnmadd132sd %xmm5,%xmm4,%xmm1 4295295 418a7f: | | | | | | | | | | c5 fa 7e 2d 39 1a 08 vmovq 0x81a39(%rip),%xmm5 # 49a4c0 4295302 418a86: | | | | | | | | | | 00 4295303 418a87: | | | | | | | | | | c5 e1 54 dd vandpd %xmm5,%xmm3,%xmm3 4295307 418a8b: | | | | | | | | | | c5 fb 58 c9 vaddsd %xmm1,%xmm0,%xmm1 4295311 418a8f: | | | | | | | | | | c5 fb 11 4c 24 10 vmovsd %xmm1,0x10(%rsp) 4295317 418a95: | | | | | | | | | | a8 01 test $0x1,%al 4295319 418a97: | | | | | | | | | | /----- 0f 84 73 01 00 00 je 418c10 <__cos_fma+0x480> 4295325 418a9d: | | | | | | | | | | | c5 fb 10 05 63 18 08 vmovsd 0x81863(%rip),%xmm0 # 49a308 4295332 418aa4: | | | | | | | | | | | 00 4295333 418aa5: | | | | | | | | | | | c5 f9 2f c3 vcomisd %xmm3,%xmm0 4295337 418aa9: | | | | | | /--|--|--|--|--|----- 0f 87 81 03 00 00 ja 418e30 <__cos_fma+0x6a0> 4295343 418aaf: | | | | | | | | | | | | c5 f9 57 c0 vxorpd %xmm0,%xmm0,%xmm0 4295347 418ab3: | | | | | | | | | | | | c5 fa 7e 35 15 1a 08 vmovq 0x81a15(%rip),%xmm6 # 49a4d0 4295354 418aba: | | | | | | | | | | | | 00 4295355 418abb: | | | | | | | | | | | | c5 f9 2f c2 vcomisd %xmm2,%xmm0 4295359 418abf: | | | | | | | | | | | | /-- 72 04 jb 418ac5 <__cos_fma+0x335> 4295361 418ac1: | | | | | | | | | | | | | c5 f1 57 ce vxorpd %xmm6,%xmm1,%xmm1 4295365 418ac5: | | | | | | | | | | | | \-> c5 fb 10 25 6b 18 08 vmovsd 0x8186b(%rip),%xmm4 # 49a338 4295372 418acc: | | | | | | | | | | | | 00 4295373 418acd: | | | | | | | | | | | | c5 7b 10 05 6b 18 08 vmovsd 0x8186b(%rip),%xmm8 # 49a340 4295380 418ad4: | | | | | | | | | | | | 00 4295381 418ad5: | | | | | | | | | | | | 48 8d 15 04 5b 08 00 lea 0x85b04(%rip),%rdx # 49e5e0 <__sincostab> 4295388 418adc: | | | | | | | | | | | | c5 e3 58 c4 vaddsd %xmm4,%xmm3,%xmm0 4295392 418ae0: | | | | | | | | | | | | c5 fb 5c e4 vsubsd %xmm4,%xmm0,%xmm4 4295396 418ae4: | | | | | | | | | | | | c4 e1 f9 7e c0 vmovq %xmm0,%rax 4295401 418ae9: | | | | | | | | | | | | c1 e0 02 shl $0x2,%eax 4295404 418aec: | | | | | | | | | | | | 48 63 f0 movslq %eax,%rsi 4295407 418aef: | | | | | | | | | | | | 8d 78 03 lea 0x3(%rax),%edi 4295410 418af2: | | | | | | | | | | | | c5 e3 5c dc vsubsd %xmm4,%xmm3,%xmm3 4295414 418af6: | | | | | | | | | | | | c5 fb 10 04 f2 vmovsd (%rdx,%rsi,8),%xmm0 4295419 418afb: | | | | | | | | | | | | 8d 70 01 lea 0x1(%rax),%esi 4295422 418afe: | | | | | | | | | | | | 48 63 ff movslq %edi,%rdi 4295425 418b01: | | | | | | | | | | | | 48 63 f6 movslq %esi,%rsi 4295428 418b04: | | | | | | | | | | | | 83 c0 02 add $0x2,%eax 4295431 418b07: | | | | | | | | | | | | 48 98 cltq 4295433 418b09: | | | | | | | | | | | | c5 e3 59 fb vmulsd %xmm3,%xmm3,%xmm7 4295437 418b0d: | | | | | | | | | | | | c4 62 c1 a9 05 ea 18 vfmadd213sd 0x818ea(%rip),%xmm7,%xmm8 # 49a400 4295444 418b14: | | | | | | | | | | | | 08 00 4295446 418b16: | | | | | | | | | | | | c5 e3 59 e7 vmulsd %xmm7,%xmm3,%xmm4 4295450 418b1a: | | | | | | | | | | | | c4 c2 f1 99 e0 vfmadd132sd %xmm8,%xmm1,%xmm4 4295455 418b1f: | | | | | | | | | | | | c5 7b 10 05 29 18 08 vmovsd 0x81829(%rip),%xmm8 # 49a350 4295462 418b26: | | | | | | | | | | | | 00 4295463 418b27: | | | | | | | | | | | | c4 62 c1 a9 05 d8 18 vfmadd213sd 0x818d8(%rip),%xmm7,%xmm8 # 49a408 4295470 418b2e: | | | | | | | | | | | | 08 00 4295472 418b30: | | | | | | | | | | | | c4 62 c1 a9 05 27 18 vfmadd213sd 0x81827(%rip),%xmm7,%xmm8 # 49a360 4295479 418b37: | | | | | | | | | | | | 08 00 4295481 418b39: | | | | | | | | | | | | c5 e3 58 e4 vaddsd %xmm4,%xmm3,%xmm4 4295485 418b3d: | | | | | | | | | | | | c4 c1 43 59 f8 vmulsd %xmm8,%xmm7,%xmm7 4295490 418b42: | | | | | | | | | | | | c4 e2 c1 99 cb vfmadd132sd %xmm3,%xmm7,%xmm1 4295495 418b47: | | | | | | | | | | | | c5 fb 10 1c fa vmovsd (%rdx,%rdi,8),%xmm3 4295500 418b4c: | | | | | | | | | | | | c4 e2 d9 a9 1c f2 vfmadd213sd (%rdx,%rsi,8),%xmm4,%xmm3 4295506 418b52: | | | | | | | | | | | | c5 f9 28 fa vmovapd %xmm2,%xmm7 4295510 418b56: | | | | | | | | | | | | c5 c1 54 fe vandpd %xmm6,%xmm7,%xmm7 4295514 418b5a: | | | | | | | | | | | | c4 e2 f1 bd d8 vfnmadd231sd %xmm0,%xmm1,%xmm3 4295519 418b5f: | | | | | | | | | | | | c4 e2 d9 b9 1c c2 vfmadd231sd (%rdx,%rax,8),%xmm4,%xmm3 4295525 418b65: | | | | | | | | | | | | c5 fb 58 db vaddsd %xmm3,%xmm0,%xmm3 4295529 418b69: | | | | | | | | | | | | c5 c9 55 f3 vandnpd %xmm3,%xmm6,%xmm6 4295533 418b6d: | | | | | | | | | | | | c5 c9 56 f7 vorpd %xmm7,%xmm6,%xmm6 4295537 418b71: | | | | | | | | | | | | c5 f9 28 ce vmovapd %xmm6,%xmm1 4295541 418b75: | | | /--|--|--|--|--|--|--|--|--|----> 83 e1 02 and $0x2,%ecx 4295544 418b78: | +--|--|--|--|--|--|--|--|--|--|--|----- 0f 84 2a fd ff ff je 4188a8 <__cos_fma+0x118> 4295550 418b7e: | | | | | | | | | | | | | c5 f1 57 0d 4a 19 08 vxorpd 0x8194a(%rip),%xmm1,%xmm1 # 49a4d0 4295557 418b85: | | | | | | | | | | | | | 00 4295558 418b86: | +--|--|--|--|--|--|--|--|--|--|--|----- e9 1d fd ff ff jmpq 4188a8 <__cos_fma+0x118> 4295563 418b8b: | | | | | | | | | | | | | 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 4295568 418b90: | | | | | | | | | | | | | /-> c5 fb 10 0d 08 18 08 vmovsd 0x81808(%rip),%xmm1 # 49a3a0 4295575 418b97: | | | | | | | | | | | | | | 00 4295576 418b98: | | | | | | | | | | \--|--|--|-> c5 f8 ae 5c 24 04 vstmxcsr 0x4(%rsp) 4295582 418b9e: | | | | | | | | | | | | | 8b 44 24 04 mov 0x4(%rsp),%eax 4295586 418ba2: | | | | | | | | | | | | | 81 e3 00 60 00 00 and $0x6000,%ebx 4295592 418ba8: | | | | | | | | | | | | | 80 e4 9f and $0x9f,%ah 4295595 418bab: | | | | | | | | | | | | | 09 c3 or %eax,%ebx 4295597 418bad: | | | | | | | | | | | | | 89 5c 24 04 mov %ebx,0x4(%rsp) 4295601 418bb1: | | | | | | | | | | | | | c5 f8 ae 54 24 04 vldmxcsr 0x4(%rsp) 4295607 418bb7: | | | | | | \--|--|--|-----|--|--|-- e9 f5 fc ff ff jmpq 4188b1 <__cos_fma+0x121> 4295612 418bbc: | | | | | | | | | | | | 0f 1f 40 00 nopl 0x0(%rax) 4295616 418bc0: | | | | \--|-----|--|--|-----|--|--|-> c5 f8 ae 54 24 10 vldmxcsr 0x10(%rsp) 4295622 418bc6: | | | | | | | | | | | 3d ff ff 3f 3e cmp $0x3e3fffff,%eax 4295627 418bcb: | | | | | | | | | | \-- 7e c3 jle 418b90 <__cos_fma+0x400> 4295629 418bcd: | | | | | | | | | | bd 01 00 00 00 mov $0x1,%ebp 4295634 418bd2: | | | | \-----|--|--|-----|--|----- e9 11 fc ff ff jmpq 4187e8 <__cos_fma+0x58> 4295639 418bd7: | | | | | | | | | 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1) 4295646 418bde: | | | | | | | | | 00 00 4295648 418be0: | | | | | | | \--|----> 3d ff ff ef 7f cmp $0x7fefffff,%eax 4295653 418be5: | | | | | | | | /-- 0f 8e e5 00 00 00 jle 418cd0 <__cos_fma+0x540> 4295659 418beb: | | | | | | | | | 3d 00 00 f0 7f cmp $0x7ff00000,%eax 4295664 418bf0: | | | | | | | /--|--|-- 0f 84 1a 02 00 00 je 418e10 <__cos_fma+0x680> 4295670 418bf6: | | | | | | | /--|--|--|-> c5 fb 5e c8 vdivsd %xmm0,%xmm0,%xmm1 4295674 418bfa: | +--|--|-----------|--|--|--|--|--|--|-- e9 a9 fc ff ff jmpq 4188a8 <__cos_fma+0x118> 4295679 418bff: | | | | | | | | | | | 90 nop 4295680 418c00: | | | | | \--|--|--|--|--|-> c5 f9 57 c6 vxorpd %xmm6,%xmm0,%xmm0 4295684 418c04: | | | | | \--|--|--|--|-- e9 3a fd ff ff jmpq 418943 <__cos_fma+0x1b3> 4295689 418c09: | | | | | | | | | 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 4295696 418c10: | | | | | | | \--|-> c5 d9 57 e4 vxorpd %xmm4,%xmm4,%xmm4 4295700 418c14: | | | | | | | | c5 f9 28 e9 vmovapd %xmm1,%xmm5 4295704 418c18: | | | | | | | | c5 f1 57 0d b0 18 08 vxorpd 0x818b0(%rip),%xmm1,%xmm1 # 49a4d0 4295711 418c1f: | | | | | | | | 00 4295712 418c20: | | | | | | | | c5 eb c2 e4 01 vcmpltsd %xmm4,%xmm2,%xmm4 4295717 418c25: | | | | | | | | c5 fb 10 15 0b 17 08 vmovsd 0x8170b(%rip),%xmm2 # 49a338 4295724 418c2c: | | | | | | | | 00 4295725 418c2d: | | | | | | | | 48 8d 15 ac 59 08 00 lea 0x859ac(%rip),%rdx # 49e5e0 <__sincostab> 4295732 418c34: | | | | | | | | c5 e3 58 c2 vaddsd %xmm2,%xmm3,%xmm0 4295736 418c38: | | | | | | | | c4 e3 51 4b c9 40 vblendvpd %xmm4,%xmm1,%xmm5,%xmm1 4295742 418c3e: | | | | | | | | c5 fb 10 25 fa 16 08 vmovsd 0x816fa(%rip),%xmm4 # 49a340 4295749 418c45: | | | | | | | | 00 4295750 418c46: | | | | | | | | c5 fb 5c d2 vsubsd %xmm2,%xmm0,%xmm2 4295754 418c4a: | | | | | | | | c4 e1 f9 7e c0 vmovq %xmm0,%rax 4295759 418c4f: | | | | | | | | c1 e0 02 shl $0x2,%eax 4295762 418c52: | | | | | | | | 8d 70 02 lea 0x2(%rax),%esi 4295765 418c55: | | | | | | | | 8d 78 01 lea 0x1(%rax),%edi 4295768 418c58: | | | | | | | | c5 e3 5c da vsubsd %xmm2,%xmm3,%xmm3 4295772 418c5c: | | | | | | | | 48 63 f6 movslq %esi,%rsi 4295775 418c5f: | | | | | | | | 48 63 ff movslq %edi,%rdi 4295778 418c62: | | | | | | | | c5 fb 10 04 fa vmovsd (%rdx,%rdi,8),%xmm0 4295783 418c67: | | | | | | | | c5 e3 58 c9 vaddsd %xmm1,%xmm3,%xmm1 4295787 418c6b: | | | | | | | | c5 f3 59 d1 vmulsd %xmm1,%xmm1,%xmm2 4295791 418c6f: | | | | | | | | c4 e2 e9 a9 25 88 17 vfmadd213sd 0x81788(%rip),%xmm2,%xmm4 # 49a400 4295798 418c76: | | | | | | | | 08 00 4295800 418c78: | | | | | | | | c5 f3 59 da vmulsd %xmm2,%xmm1,%xmm3 4295804 418c7c: | | | | | | | | c4 e2 f1 99 dc vfmadd132sd %xmm4,%xmm1,%xmm3 4295809 418c81: | | | | | | | | c5 fb 10 0d c7 16 08 vmovsd 0x816c7(%rip),%xmm1 # 49a350 4295816 418c88: | | | | | | | | 00 4295817 418c89: | | | | | | | | c4 e2 e9 a9 0d 76 17 vfmadd213sd 0x81776(%rip),%xmm2,%xmm1 # 49a408 4295824 418c90: | | | | | | | | 08 00 4295826 418c92: | | | | | | | | c4 e2 e9 a9 0d c5 16 vfmadd213sd 0x816c5(%rip),%xmm2,%xmm1 # 49a360 4295833 418c99: | | | | | | | | 08 00 4295835 418c9b: | | | | | | | | c5 eb 59 d1 vmulsd %xmm1,%xmm2,%xmm2 4295839 418c9f: | | | | | | | | c5 fb 10 0c f2 vmovsd (%rdx,%rsi,8),%xmm1 4295844 418ca4: | | | | | | | | 8d 70 03 lea 0x3(%rax),%esi 4295847 418ca7: | | | | | | | | 48 98 cltq 4295849 418ca9: | | | | | | | | 48 63 f6 movslq %esi,%rsi 4295852 418cac: | | | | | | | | c4 e2 e1 ad 04 f2 vfnmadd213sd (%rdx,%rsi,8),%xmm3,%xmm0 4295858 418cb2: | | | | | | | | c4 e2 f9 9d d1 vfnmadd132sd %xmm1,%xmm0,%xmm2 4295863 418cb7: | | | | | | | | c4 e2 e1 bd 14 c2 vfnmadd231sd (%rdx,%rax,8),%xmm3,%xmm2 4295869 418cbd: | | | | | | | | c5 f3 58 ca vaddsd %xmm2,%xmm1,%xmm1 4295873 418cc1: | | | +-----------|--------|--|-----|-- e9 af fe ff ff jmpq 418b75 <__cos_fma+0x3e5> 4295878 418cc6: | | | | | | | | 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) 4295885 418ccd: | | | | | | | | 00 00 00 4295888 418cd0: | | | | | | | \-> 48 8d 74 24 10 lea 0x10(%rsp),%rsi 4295893 418cd5: | | | | | | | 48 8d 7c 24 08 lea 0x8(%rsp),%rdi 4295898 418cda: | | | | | | | e8 e1 ed ff ff callq 417ac0 <__branred> 4295903 418cdf: | | | | | | | c5 fb 10 5c 24 10 vmovsd 0x10(%rsp),%xmm3 4295909 418ce5: | | | | | | | c5 fb 10 54 24 08 vmovsd 0x8(%rsp),%xmm2 4295915 418ceb: | | | | | | | 8d 48 01 lea 0x1(%rax),%ecx 4295918 418cee: | | | | | | | a8 01 test $0x1,%al 4295920 418cf0: | | | | | | | /-- 0f 85 8a 01 00 00 jne 418e80 <__cos_fma+0x6f0> 4295926 418cf6: | | | | | | | | c5 f9 57 c0 vxorpd %xmm0,%xmm0,%xmm0 4295930 418cfa: | | | | | | | | c5 f9 28 cb vmovapd %xmm3,%xmm1 4295934 418cfe: | | | | | | | | c5 e1 57 1d ca 17 08 vxorpd 0x817ca(%rip),%xmm3,%xmm3 # 49a4d0 4295941 418d05: | | | | | | | | 00 4295942 418d06: | | | | | | | | c5 fb 10 25 32 16 08 vmovsd 0x81632(%rip),%xmm4 # 49a340 4295949 418d0d: | | | | | | | | 00 4295950 418d0e: | | | | | | | | c5 eb c2 c0 01 vcmpltsd %xmm0,%xmm2,%xmm0 4295955 418d13: | | | | | | | | c5 e9 54 15 a5 17 08 vandpd 0x817a5(%rip),%xmm2,%xmm2 # 49a4c0 4295962 418d1a: | | | | | | | | 00 4295963 418d1b: | | | | | | | | 48 8d 15 be 58 08 00 lea 0x858be(%rip),%rdx # 49e5e0 <__sincostab> 4295970 418d22: | | | | | | | | c4 e3 71 4b db 00 vblendvpd %xmm0,%xmm3,%xmm1,%xmm3 4295976 418d28: | | | | | | | | c5 f9 28 ca vmovapd %xmm2,%xmm1 4295980 418d2c: | | | | | | | | c5 fb 10 15 04 16 08 vmovsd 0x81604(%rip),%xmm2 # 49a338 4295987 418d33: | | | | | | | | 00 4295988 418d34: | | | | | | | | c5 f3 58 c2 vaddsd %xmm2,%xmm1,%xmm0 4295992 418d38: | | | | | | | | c5 fb 5c d2 vsubsd %xmm2,%xmm0,%xmm2 4295996 418d3c: | | | | | | | | c4 e1 f9 7e c0 vmovq %xmm0,%rax 4296001 418d41: | | | | | | | | c1 e0 02 shl $0x2,%eax 4296004 418d44: | | | | | | | | 8d 70 02 lea 0x2(%rax),%esi 4296007 418d47: | | | | | | | | 8d 78 01 lea 0x1(%rax),%edi 4296010 418d4a: | | | | | | | | c5 f3 5c d2 vsubsd %xmm2,%xmm1,%xmm2 4296014 418d4e: | | | | | | | | 48 63 f6 movslq %esi,%rsi 4296017 418d51: | | | | | | | | 48 63 ff movslq %edi,%rdi 4296020 418d54: | | | | | | | | c5 fb 10 04 fa vmovsd (%rdx,%rdi,8),%xmm0 4296025 418d59: | | | | | | | | c5 eb 58 d3 vaddsd %xmm3,%xmm2,%xmm2 4296029 418d5d: | | | | | | | | c5 eb 59 ca vmulsd %xmm2,%xmm2,%xmm1 4296033 418d61: | | | | | | | | c4 e2 f1 a9 25 96 16 vfmadd213sd 0x81696(%rip),%xmm1,%xmm4 # 49a400 4296040 418d68: | | | | | | | | 08 00 4296042 418d6a: | | | | | | | | c5 eb 59 d9 vmulsd %xmm1,%xmm2,%xmm3 4296046 418d6e: | | | | | | | | c4 e2 e9 99 dc vfmadd132sd %xmm4,%xmm2,%xmm3 4296051 418d73: | | | | | | | | c5 fb 10 15 d5 15 08 vmovsd 0x815d5(%rip),%xmm2 # 49a350 4296058 418d7a: | | | | | | | | 00 4296059 418d7b: | | | | | | | | c4 e2 f1 a9 15 84 16 vfmadd213sd 0x81684(%rip),%xmm1,%xmm2 # 49a408 4296066 418d82: | | | | | | | | 08 00 4296068 418d84: | | | | | | | | c4 e2 f1 a9 15 d3 15 vfmadd213sd 0x815d3(%rip),%xmm1,%xmm2 # 49a360 4296075 418d8b: | | | | | | | | 08 00 4296077 418d8d: | | | | | | | | c5 f3 59 d2 vmulsd %xmm2,%xmm1,%xmm2 4296081 418d91: | | | | | | | | c5 fb 10 0c f2 vmovsd (%rdx,%rsi,8),%xmm1 4296086 418d96: | | | | | | | | 8d 70 03 lea 0x3(%rax),%esi 4296089 418d99: | | | | | | | | 48 98 cltq 4296091 418d9b: | | | | | | | | 48 63 f6 movslq %esi,%rsi 4296094 418d9e: | | | | | | | | c4 e2 e1 ad 04 f2 vfnmadd213sd (%rdx,%rsi,8),%xmm3,%xmm0 4296100 418da4: | | | | | | | | c4 e2 e9 bd c1 vfnmadd231sd %xmm1,%xmm2,%xmm0 4296105 418da9: | | | | | | | | c4 e2 e1 bd 04 c2 vfnmadd231sd (%rdx,%rax,8),%xmm3,%xmm0 4296111 418daf: | | | | | | | | c5 f3 58 c8 vaddsd %xmm0,%xmm1,%xmm1 4296115 418db3: | | | +-----------|--------|--|-----|-- e9 bd fd ff ff jmpq 418b75 <__cos_fma+0x3e5> 4296120 418db8: | | | | | | | | 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 4296127 418dbf: | | | | | | | | 00 4296128 418dc0: | | \--|-----------|--------|--|-----|-> c5 f3 59 d9 vmulsd %xmm1,%xmm1,%xmm3 4296132 418dc4: | | | | | | | c5 fb 10 15 44 15 08 vmovsd 0x81544(%rip),%xmm2 # 49a310 4296139 418dcb: | | | | | | | 00 4296140 418dcc: | | | | | | | c4 e2 e1 a9 15 43 15 vfmadd213sd 0x81543(%rip),%xmm3,%xmm2 # 49a318 4296147 418dd3: | | | | | | | 08 00 4296149 418dd5: | | | | | | | c4 e2 e1 a9 15 12 16 vfmadd213sd 0x81612(%rip),%xmm3,%xmm2 # 49a3f0 4296156 418ddc: | | | | | | | 08 00 4296158 418dde: | | | | | | | c4 e2 e1 a9 15 41 15 vfmadd213sd 0x81541(%rip),%xmm3,%xmm2 # 49a328 4296165 418de5: | | | | | | | 08 00 4296167 418de7: | | | | | | | c5 fb 59 25 71 15 08 vmulsd 0x81571(%rip),%xmm0,%xmm4 # 49a360 4296174 418dee: | | | | | | | 00 4296175 418def: | | | | | | | c4 e2 e1 a9 15 00 16 vfmadd213sd 0x81600(%rip),%xmm3,%xmm2 # 49a3f8 4296182 418df6: | | | | | | | 08 00 4296184 418df8: | | | | | | | c4 e2 d9 9b d1 vfmsub132sd %xmm1,%xmm4,%xmm2 4296189 418dfd: | | | | | | | c4 e2 e1 b9 c2 vfmadd231sd %xmm2,%xmm3,%xmm0 4296194 418e02: | | | | | | | c5 f3 58 c8 vaddsd %xmm0,%xmm1,%xmm1 4296198 418e06: | \-----|-----------|--------|--|-----|-- e9 9d fa ff ff jmpq 4188a8 <__cos_fma+0x118> 4296203 418e0b: | | | | | | 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 4296208 418e10: | | | | \-----|-> c4 e1 f9 7e c0 vmovq %xmm0,%rax 4296213 418e15: | | | | | 85 c0 test %eax,%eax 4296215 418e17: | | | +--------|-- 0f 85 d9 fd ff ff jne 418bf6 <__cos_fma+0x466> 4296221 418e1d: | | | | | 48 c7 c0 c0 ff ff ff mov $0xffffffffffffffc0,%rax 4296228 418e24: | | | | | 64 c7 00 21 00 00 00 movl $0x21,%fs:(%rax) 4296235 418e2b: | | | \--------|-- e9 c6 fd ff ff jmpq 418bf6 <__cos_fma+0x466> 4296240 418e30: | | \-----------------|-> c5 eb 59 da vmulsd %xmm2,%xmm2,%xmm3 4296244 418e34: | | | c5 fb 10 05 d4 14 08 vmovsd 0x814d4(%rip),%xmm0 # 49a310 4296251 418e3b: | | | 00 4296252 418e3c: | | | c4 e2 e1 a9 05 d3 14 vfmadd213sd 0x814d3(%rip),%xmm3,%xmm0 # 49a318 4296259 418e43: | | | 08 00 4296261 418e45: | | | c4 e2 e1 a9 05 a2 15 vfmadd213sd 0x815a2(%rip),%xmm3,%xmm0 # 49a3f0 4296268 418e4c: | | | 08 00 4296270 418e4e: | | | c4 e2 e1 a9 05 d1 14 vfmadd213sd 0x814d1(%rip),%xmm3,%xmm0 # 49a328 4296277 418e55: | | | 08 00 4296279 418e57: | | | c5 f3 59 25 01 15 08 vmulsd 0x81501(%rip),%xmm1,%xmm4 # 49a360 4296286 418e5e: | | | 00 4296287 418e5f: | | | c4 e2 e1 a9 05 90 15 vfmadd213sd 0x81590(%rip),%xmm3,%xmm0 # 49a3f8 4296294 418e66: | | | 08 00 4296296 418e68: | | | c4 e2 d9 9b c2 vfmsub132sd %xmm2,%xmm4,%xmm0 4296301 418e6d: | | | c4 e2 e1 b9 c8 vfmadd231sd %xmm0,%xmm3,%xmm1 4296306 418e72: | | | c5 f3 58 ca vaddsd %xmm2,%xmm1,%xmm1 4296310 418e76: | +-----------------------------|-- e9 fa fc ff ff jmpq 418b75 <__cos_fma+0x3e5> 4296315 418e7b: | | | 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 4296320 418e80: | | \-> c5 fa 7e 2d 38 16 08 vmovq 0x81638(%rip),%xmm5 # 49a4c0 4296327 418e87: | | 00 4296328 418e88: | | c5 fb 10 0d 78 14 08 vmovsd 0x81478(%rip),%xmm1 # 49a308 4296335 418e8f: | | 00 4296336 418e90: | | c5 f9 28 c2 vmovapd %xmm2,%xmm0 4296340 418e94: | | c5 f9 54 c5 vandpd %xmm5,%xmm0,%xmm0 4296344 418e98: | | c5 f9 2f c8 vcomisd %xmm0,%xmm1 4296348 418e9c: | | /----- 0f 87 cb 00 00 00 ja 418f6d <__cos_fma+0x7dd> 4296354 418ea2: | | | c5 f1 57 c9 vxorpd %xmm1,%xmm1,%xmm1 4296358 418ea6: | | | c5 fa 7e 35 22 16 08 vmovq 0x81622(%rip),%xmm6 # 49a4d0 4296365 418ead: | | | 00 4296366 418eae: | | | c5 f9 2f ca vcomisd %xmm2,%xmm1 4296370 418eb2: | | | /-- 72 04 jb 418eb8 <__cos_fma+0x728> 4296372 418eb4: | | | | c5 e1 57 de vxorpd %xmm6,%xmm3,%xmm3 4296376 418eb8: | | | \-> c5 fb 10 25 78 14 08 vmovsd 0x81478(%rip),%xmm4 # 49a338 4296383 418ebf: | | | 00 4296384 418ec0: | | | c5 7b 10 05 78 14 08 vmovsd 0x81478(%rip),%xmm8 # 49a340 4296391 418ec7: | | | 00 4296392 418ec8: | | | 48 8d 15 11 57 08 00 lea 0x85711(%rip),%rdx # 49e5e0 <__sincostab> 4296399 418ecf: | | | c5 fb 58 cc vaddsd %xmm4,%xmm0,%xmm1 4296403 418ed3: | | | c5 f3 5c e4 vsubsd %xmm4,%xmm1,%xmm4 4296407 418ed7: | | | c4 e1 f9 7e c8 vmovq %xmm1,%rax 4296412 418edc: | | | c1 e0 02 shl $0x2,%eax 4296415 418edf: | | | 48 63 f0 movslq %eax,%rsi 4296418 418ee2: | | | 8d 78 03 lea 0x3(%rax),%edi 4296421 418ee5: | | | c5 fb 5c c4 vsubsd %xmm4,%xmm0,%xmm0 4296425 418ee9: | | | c5 fb 10 0c f2 vmovsd (%rdx,%rsi,8),%xmm1 4296430 418eee: | | | 8d 70 01 lea 0x1(%rax),%esi 4296433 418ef1: | | | 48 63 ff movslq %edi,%rdi 4296436 418ef4: | | | 48 63 f6 movslq %esi,%rsi 4296439 418ef7: | | | 83 c0 02 add $0x2,%eax 4296442 418efa: | | | 48 98 cltq 4296444 418efc: | | | c5 fb 59 f8 vmulsd %xmm0,%xmm0,%xmm7 4296448 418f00: | | | c4 62 c1 a9 05 f7 14 vfmadd213sd 0x814f7(%rip),%xmm7,%xmm8 # 49a400 4296455 418f07: | | | 08 00 4296457 418f09: | | | c5 fb 59 e7 vmulsd %xmm7,%xmm0,%xmm4 4296461 418f0d: | | | c4 c2 e1 99 e0 vfmadd132sd %xmm8,%xmm3,%xmm4 4296466 418f12: | | | c5 7b 10 05 36 14 08 vmovsd 0x81436(%rip),%xmm8 # 49a350 4296473 418f19: | | | 00 4296474 418f1a: | | | c4 62 c1 a9 05 e5 14 vfmadd213sd 0x814e5(%rip),%xmm7,%xmm8 # 49a408 4296481 418f21: | | | 08 00 4296483 418f23: | | | c4 62 c1 a9 05 34 14 vfmadd213sd 0x81434(%rip),%xmm7,%xmm8 # 49a360 4296490 418f2a: | | | 08 00 4296492 418f2c: | | | c5 fb 58 e4 vaddsd %xmm4,%xmm0,%xmm4 4296496 418f30: | | | c4 c1 43 59 f8 vmulsd %xmm8,%xmm7,%xmm7 4296501 418f35: | | | c4 e2 c1 99 c3 vfmadd132sd %xmm3,%xmm7,%xmm0 4296506 418f3a: | | | c5 fb 10 1c fa vmovsd (%rdx,%rdi,8),%xmm3 4296511 418f3f: | | | c4 e2 d9 a9 1c f2 vfmadd213sd (%rdx,%rsi,8),%xmm4,%xmm3 4296517 418f45: | | | c5 f9 28 fa vmovapd %xmm2,%xmm7 4296521 418f49: | | | c5 c1 54 fe vandpd %xmm6,%xmm7,%xmm7 4296525 418f4d: | | | c4 e2 e1 9d c1 vfnmadd132sd %xmm1,%xmm3,%xmm0 4296530 418f52: | | | c4 e2 d9 b9 04 c2 vfmadd231sd (%rdx,%rax,8),%xmm4,%xmm0 4296536 418f58: | | | c5 f3 58 c0 vaddsd %xmm0,%xmm1,%xmm0 4296540 418f5c: | | | c5 c9 55 f0 vandnpd %xmm0,%xmm6,%xmm6 4296544 418f60: | | | c5 c9 56 f7 vorpd %xmm7,%xmm6,%xmm6 4296548 418f64: | | | c5 f9 28 ce vmovapd %xmm6,%xmm1 4296552 418f68: | +--------------------------|----- e9 08 fc ff ff jmpq 418b75 <__cos_fma+0x3e5> 4296557 418f6d: | | \----> c5 eb 59 ca vmulsd %xmm2,%xmm2,%xmm1 4296561 418f71: | | c5 fb 10 05 97 13 08 vmovsd 0x81397(%rip),%xmm0 # 49a310 4296568 418f78: | | 00 4296569 418f79: | | c4 e2 f1 a9 05 96 13 vfmadd213sd 0x81396(%rip),%xmm1,%xmm0 # 49a318 4296576 418f80: | | 08 00 4296578 418f82: | | c4 e2 f1 a9 05 65 14 vfmadd213sd 0x81465(%rip),%xmm1,%xmm0 # 49a3f0 4296585 418f89: | | 08 00 4296587 418f8b: | | c4 e2 f1 a9 05 94 13 vfmadd213sd 0x81394(%rip),%xmm1,%xmm0 # 49a328 4296594 418f92: | | 08 00 4296596 418f94: | | c4 e2 f1 a9 05 5b 14 vfmadd213sd 0x8145b(%rip),%xmm1,%xmm0 # 49a3f8 4296603 418f9b: | | 08 00 4296605 418f9d: | | c5 e3 59 25 bb 13 08 vmulsd 0x813bb(%rip),%xmm3,%xmm4 # 49a360 4296612 418fa4: | | 00 4296613 418fa5: | | c4 e2 d9 9b c2 vfmsub132sd %xmm2,%xmm4,%xmm0 4296618 418faa: | | c4 e2 e1 99 c8 vfmadd132sd %xmm0,%xmm3,%xmm1 4296623 418faf: | | c5 eb 58 c9 vaddsd %xmm1,%xmm2,%xmm1 4296627 418fb3: | \-------------------------------- e9 bd fb ff ff jmpq 418b75 <__cos_fma+0x3e5> 4296632 418fb8: \----------------------------------------> e8 a3 57 04 00 callq 45e760 <__stack_chk_fail> KDAB-hotspot-41e5de7/tests/test-clients/000077500000000000000000000000001515036260400201135ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/CMakeLists.txt000066400000000000000000000015411515036260400226540ustar00rootroot00000000000000include(CMakePushCheckState) # Check if static linking works at all. For example OpenSuse 42.3 with clang # doesn't ship a static libc++.a, making static linking fail. cmake_push_check_state(RESET) set(CMAKE_POSITION_INDEPENDENT_CODE On) set(CMAKE_REQUIRED_LIBRARIES "-static") set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") check_cxx_source_compiles("int main() {}" STATIC_LINKING_WORKS) cmake_pop_check_state() set(CMAKE_BUILD_TYPE RelWithDebInfo) if(STATIC_LINKING_WORKS) add_subdirectory(cpp-minimal-static) endif() add_subdirectory(cpp-inlining) add_subdirectory(cpp-recursion) add_subdirectory(cpp-locking) add_subdirectory(cpp-stdin) add_subdirectory(c-syscalls) add_subdirectory(cpp-sleep) add_subdirectory(cpp-threadnames) add_subdirectory(cpp-parallel) add_subdirectory(c-fork) add_subdirectory(callgraph) add_subdirectory(cpp-libs) KDAB-hotspot-41e5de7/tests/test-clients/c-fork/000077500000000000000000000000001515036260400212745ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/c-fork/CMakeLists.txt000066400000000000000000000000521515036260400240310ustar00rootroot00000000000000add_executable( c-fork c-fork.c ) KDAB-hotspot-41e5de7/tests/test-clients/c-fork/c-fork.c000066400000000000000000000013211515036260400226160ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include int main(void) { pid_t child = fork(); if (child == 0) { double sum = 0; int i = 0; for (; i < 1000000; ++i) { sum += cos(cos(i) * cos(i) + cos(i * i) + cos(cos(i))); } printf("sum is: %g\n", sum); } else { printf("waiting for child\n"); waitpid(child, NULL, 0); printf("done waiting\n"); } return 0; } KDAB-hotspot-41e5de7/tests/test-clients/c-syscalls/000077500000000000000000000000001515036260400221705ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/c-syscalls/CMakeLists.txt000066400000000000000000000000541515036260400247270ustar00rootroot00000000000000add_executable( c-syscalls main.c ) KDAB-hotspot-41e5de7/tests/test-clients/c-syscalls/main.c000066400000000000000000000013441515036260400232620ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include int main(int argc, char** argv) { (void)argc; FILE* file; long fileSize; char* buffer; int i; for (i = 0; i < 500000; ++i) { file = fopen(argv[0], "rb"); if (!file) { fprintf(stderr, "failed to open file %s\n", argv[0]); return 1; } fseek(file, 0, SEEK_END); fileSize = ftell(file); rewind(file); fclose(file); } (void)fileSize; (void)buffer; return 0; } KDAB-hotspot-41e5de7/tests/test-clients/callgraph/000077500000000000000000000000001515036260400220505ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/callgraph/CMakeLists.txt000066400000000000000000000000531515036260400246060ustar00rootroot00000000000000add_executable( callgraph main.c ) KDAB-hotspot-41e5de7/tests/test-clients/callgraph/main.c000066400000000000000000000014011515036260400231340ustar00rootroot00000000000000#include __attribute__((noinline)) int idle(void) { int k = 0; for (int i = 0; i < 2000000; i++) { k += i; } return k; } __attribute__((noinline)) int child3(void) { return idle(); } __attribute__((noinline)) int child2(void) { return child3() + idle(); } __attribute__((noinline)) int child1(void) { return child2() + idle(); } __attribute__((noinline)) int test(void) { return child1() + idle(); } __attribute__((noinline)) int parent3(void) { return idle() + test(); } __attribute__((noinline)) int parent2(void) { return parent3() + idle(); } __attribute__((noinline)) int parent1(void) { return parent2() + idle(); } int main(void) { idle(); printf("%i\n", parent1()); return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-inlining/000077500000000000000000000000001515036260400225025ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-inlining/CMakeLists.txt000066400000000000000000000000601515036260400252360ustar00rootroot00000000000000add_executable( cpp-inlining main.cpp ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-inlining/main.cpp000066400000000000000000000011231515036260400241270ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include using namespace std; int main() { uniform_real_distribution uniform(-1E5, 1E5); default_random_engine engine; double s = 0; for (int i = 0; i < 10000000; ++i) { s += norm(complex(uniform(engine), uniform(engine))); } cout << s << '\n'; return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-libs/000077500000000000000000000000001515036260400216245ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-libs/CMakeLists.txt000066400000000000000000000003521515036260400243640ustar00rootroot00000000000000add_executable( cpp-libs main.cpp ) add_library( cpp-libs-static STATIC staticlib.cpp ) add_library( cpp-libs-shared SHARED sharedlib.cpp ) target_link_libraries( cpp-libs cpp-libs-static cpp-libs-shared ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-libs/main.cpp000066400000000000000000000011411515036260400232510ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "sharedlib.h" #include "staticlib.h" #include #include int main() { std::uniform_int_distribution uniform(100000000, 200000000); std::default_random_engine engine; StaticLib staticLib(uniform(engine)); SharedLib sharedLib(uniform(engine)); std::cout << staticLib.foo() << '\n' << sharedLib.foo() << '\n'; return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-libs/sharedlib.cpp000066400000000000000000000013321515036260400242640ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "sharedlib.h" #include #include namespace { double asdf(double a, double b) { return std::norm(std::complex(a, b)); } } double SharedLib::bar(unsigned long max) const { std::uniform_real_distribution uniform(-1E5, 1E5); std::default_random_engine engine; double s = 0; for (unsigned long i = 0; i < max; ++i) { s += asdf(uniform(engine), uniform(engine)); } return s; } double SharedLib::foo() const { return bar(m_max); } KDAB-hotspot-41e5de7/tests/test-clients/cpp-libs/sharedlib.h000066400000000000000000000006521515036260400237350ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once class SharedLib { unsigned long m_max; public: SharedLib(unsigned long max) : m_max(max) { } double foo() const; private: double bar(unsigned long) const; }; KDAB-hotspot-41e5de7/tests/test-clients/cpp-libs/staticlib.cpp000066400000000000000000000013321515036260400243050ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include "staticlib.h" #include #include namespace { double asdf(double a, double b) { return std::norm(std::complex(a, b)); } } double StaticLib::bar(unsigned long max) const { std::uniform_real_distribution uniform(-1E5, 1E5); std::default_random_engine engine; double s = 0; for (unsigned long i = 0; i < max; ++i) { s += asdf(uniform(engine), uniform(engine)); } return s; } double StaticLib::foo() const { return bar(m_max); } KDAB-hotspot-41e5de7/tests/test-clients/cpp-libs/staticlib.h000066400000000000000000000006521515036260400237560ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once class StaticLib { unsigned long m_max; public: StaticLib(unsigned long max) : m_max(max) { } double foo() const; private: double bar(unsigned long) const; }; KDAB-hotspot-41e5de7/tests/test-clients/cpp-locking/000077500000000000000000000000001515036260400223215ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-locking/CMakeLists.txt000066400000000000000000000001511515036260400250560ustar00rootroot00000000000000add_executable( cpp-locking main.cpp ) target_link_libraries( cpp-locking Threads::Threads ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-locking/main.cpp000066400000000000000000000015751515036260400237610ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include using namespace std; mutex g_mutex; double worker() { lock_guard guard(g_mutex); uniform_real_distribution uniform(-1E5, 1E5); default_random_engine engine; double s = 0; for (int i = 0; i < 1000; ++i) { s += norm(complex(uniform(engine), uniform(engine))); } cout << s << endl; return s; } int main() { vector> results; for (int i = 0; i < 10000; ++i) { results.push_back(async(launch::async, worker)); } return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-minimal-static/000077500000000000000000000000001515036260400236065ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-minimal-static/CMakeLists.txt000066400000000000000000000001601515036260400263430ustar00rootroot00000000000000add_executable( cpp-minimal-static main.cpp ) target_link_libraries( cpp-minimal-static "-static" ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-minimal-static/main.cpp000066400000000000000000000011701515036260400252350ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ double __attribute__((noinline)) asdf(double a, double b) { return (a * a) / (b * b); } double __attribute__((noinline)) bar(unsigned long max) { double d = 1; for (unsigned long i = 0; i < max; ++i) { d *= asdf(0.1234E-12 * i, 12.345E67 / i); } return d; } int __attribute__((noinline)) foo(unsigned long max) { return bar(max); } int main() { return foo(123456789) > 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-parallel/000077500000000000000000000000001515036260400224675ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-parallel/CMakeLists.txt000066400000000000000000000001531515036260400252260ustar00rootroot00000000000000add_executable( cpp-parallel main.cpp ) target_link_libraries( cpp-parallel Threads::Threads ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-parallel/main.cpp000066400000000000000000000016741515036260400241270ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include using namespace std; double worker() { uniform_real_distribution uniform(-1E5, 1E5); default_random_engine engine; double s = 0; for (int i = 0; i < 10000000; ++i) { s += norm(complex(uniform(engine), uniform(engine))); } cout << s << endl; return s; } int main(int argc, char** argv) { const int numTasks = argc > 1 ? stoi(argv[1]) : std::thread::hardware_concurrency(); vector> results; for (int i = 0; i < numTasks; ++i) { results.push_back(async(launch::async, worker)); } return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-recursion/000077500000000000000000000000001515036260400227045ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-recursion/CMakeLists.txt000066400000000000000000000003621515036260400254450ustar00rootroot00000000000000add_executable( cpp-recursion main.cpp ) set_target_properties( cpp-recursion PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${KDE_INSTALL_EXECROOTDIR}/tests/test-clients/cpp-recursion" ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-recursion/main.cpp000066400000000000000000000012571515036260400243410ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include unsigned long long __attribute__((noinline)) fibonacci(unsigned i) { if (i == 0 || i == 1) return 1ull; return fibonacci(i - 1) + fibonacci(i - 2); } int main(int argc, char** argv) { if (argc != 2) { std::cerr << "Usage: cpp-recursion N" << std::endl; return 1; } unsigned i = std::stoi(argv[1]); std::cout << "fib(" << i << ") = " << fibonacci(i) << std::endl; return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-sleep/000077500000000000000000000000001515036260400220035ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-sleep/CMakeLists.txt000066400000000000000000000001451515036260400245430ustar00rootroot00000000000000add_executable( cpp-sleep main.cpp ) target_link_libraries( cpp-sleep Threads::Threads ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-sleep/main.cpp000066400000000000000000000014071515036260400234350ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include using namespace std; void burn() { uniform_real_distribution uniform(-1E5, 1E5); default_random_engine engine; double s = 0; for (int i = 0; i < 1000000; ++i) { s += norm(complex(uniform(engine), uniform(engine))); } cout << s << endl; } int main() { for (int i = 0; i < 10; ++i) { burn(); this_thread::sleep_for(chrono::milliseconds(100)); } burn(); return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-stdin/000077500000000000000000000000001515036260400220145ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-stdin/CMakeLists.txt000066400000000000000000000000551515036260400245540ustar00rootroot00000000000000add_executable( cpp-stdin main.cpp ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-stdin/main.cpp000066400000000000000000000006631515036260400234510ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include using namespace std; int main() { cout << "waiting for input..." << endl; string data; cin >> data; cout << "Received data:" << data << endl; return 0; } KDAB-hotspot-41e5de7/tests/test-clients/cpp-threadnames/000077500000000000000000000000001515036260400231665ustar00rootroot00000000000000KDAB-hotspot-41e5de7/tests/test-clients/cpp-threadnames/CMakeLists.txt000066400000000000000000000001611515036260400257240ustar00rootroot00000000000000add_executable( cpp-threadnames main.cpp ) target_link_libraries( cpp-threadnames Threads::Threads ) KDAB-hotspot-41e5de7/tests/test-clients/cpp-threadnames/main.cpp000066400000000000000000000011201515036260400246100ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include using namespace std; int main() { for (int i = 0; i < 10; ++i) { thread t([i]() { pthread_setname_np(pthread_self(), ("threadname" + to_string(i)).c_str()); this_thread::sleep_for(chrono::milliseconds(100)); }); t.join(); } return 0; } KDAB-hotspot-41e5de7/tests/testutils.h000066400000000000000000000221561515036260400177140ustar00rootroot00000000000000/* SPDX-FileCopyrightText: Milian Wolff SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include #include #include #include #include #include #include #include #include #include #define VERIFY_OR_THROW(statement) \ do { \ if (!QTest::qVerify(static_cast(statement), #statement, "", __FILE__, __LINE__)) \ throw std::logic_error("verify failed: " #statement); \ } while (false) #define VERIFY_OR_THROW2(statement, description) \ do { \ if (!QTest::qVerify(static_cast(statement), #statement, description, __FILE__, __LINE__)) \ throw std::logic_error(description); \ } while (false) #define COMPARE_OR_THROW(actual, expected) \ do { \ if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__)) \ throw std::logic_error("compare failed: " #actual #expected); \ } while (false) template QString printCost(const Data& node, const Results& results) { return QLatin1String("s:") + QString::number(results.selfCosts.cost(0, node.id)) + QLatin1String(",i:") + QString::number(results.inclusiveCosts.cost(0, node.id)); } inline QString printCost(const Data::BottomUp& node, const Data::BottomUpResults& results) { QString ret; for (int i = 0; i < results.costs.numTypes(); ++i) { if (i != 0) ret += QLatin1String(", "); ret += QString::number(results.costs.cost(i, node.id)); } return ret; } template void printTree(const Tree& tree, const Results& results, QStringList* entries, int indentLevel) { QString indent; indent.fill(QLatin1Char(' '), indentLevel); for (const auto& entry : tree.children) { entries->push_back(indent + entry.symbol.symbol + QLatin1Char('=') + printCost(entry, results)); printTree(entry, results, entries, indentLevel + 1); } } template QStringList printTree(const Results& results) { QStringList list; printTree(results.root, results, &list, 0); return list; } QStringView symbolSubString(const QString& string) { auto idx = string.indexOf(QLatin1Char('>')); if (idx == -1) { idx = string.indexOf(QLatin1Char('<')); } if (idx == -1) { idx = string.indexOf(QLatin1Char('=')); } return QStringView(string).mid(0, idx); } inline QStringList printMap(const Data::CallerCalleeResults& results) { QStringList list; list.reserve(results.entries.size()); QSet ids; for (auto it = results.entries.begin(), end = results.entries.end(); it != end; ++it) { VERIFY_OR_THROW(!ids.contains(it->id)); ids.insert(it->id); list.push_back(it.key().symbol + QLatin1Char('=') + printCost(it.value(), results)); QStringList subList; for (auto callersIt = it->callers.begin(), callersEnd = it->callers.end(); callersIt != callersEnd; ++callersIt) { subList.push_back(it.key().symbol + QLatin1Char('<') + callersIt.key().symbol + QLatin1Char('=') + QString::number(callersIt.value()[0])); } for (auto calleesIt = it->callees.begin(), calleesEnd = it->callees.end(); calleesIt != calleesEnd; ++calleesIt) { subList.push_back(it.key().symbol + QLatin1Char('>') + calleesIt.key().symbol + QLatin1Char('=') + QString::number(calleesIt.value()[0])); } subList.sort(); list += subList; } std::stable_sort(list.begin(), list.end(), [](const QString& lhs, const QString& rhs) { return symbolSubString(lhs) < symbolSubString(rhs); }); return list; } inline QStringList printCallerCalleeModel(const CallerCalleeModel& model) { QStringList list; list.reserve(model.rowCount()); for (int i = 0, c = model.rowCount(); i < c; ++i) { auto symbolIndex = model.index(i, CallerCalleeModel::Symbol); const auto symbol = symbolIndex.data().toString(); const auto& selfCostIndex = model.index(i, CallerCalleeModel::Binary + 1); const auto& inclusiveCostIndex = model.index(i, CallerCalleeModel::Binary + 2); list.push_back(symbol + QLatin1String("=s:") + selfCostIndex.data(CallerCalleeModel::SortRole).toString() + QLatin1String(",i:") + inclusiveCostIndex.data(CallerCalleeModel::SortRole).toString()); QStringList subList; const auto& callers = symbolIndex.data(CallerCalleeModel::CallersRole).value(); for (auto callersIt = callers.begin(), callersEnd = callers.end(); callersIt != callersEnd; ++callersIt) { subList.push_back(symbol + QLatin1Char('<') + callersIt.key().symbol + QLatin1Char('=') + QString::number(callersIt.value()[0])); } const auto& callees = symbolIndex.data(CallerCalleeModel::CalleesRole).value(); for (auto calleesIt = callees.begin(), calleesEnd = callees.end(); calleesIt != calleesEnd; ++calleesIt) { subList.push_back(symbol + QLatin1Char('>') + calleesIt.key().symbol + QLatin1Char('=') + QString::number(calleesIt.value()[0])); } subList.sort(); list += subList; } std::stable_sort(list.begin(), list.end(), [](const QString& lhs, const QString& rhs) { return symbolSubString(lhs) < symbolSubString(rhs); }); return list; } void dumpList(const QStringList& list) { QTextStream out(stdout); for (const auto& line : list) { out << line << '\n'; } } void printModelImpl(const QAbstractItemModel* model, const QModelIndex& parent, const QString& indent, QStringList* ret) { for (int i = 0, c = model->rowCount(parent); i < c; ++i) { const auto index = model->index(i, 0, parent); ret->append(indent + index.data().toString()); printModelImpl(model, index, indent + QLatin1String(" "), ret); } } QStringList printModel(const QAbstractItemModel* model) { QStringList ret; printModelImpl(model, {}, {}, &ret); return ret; } inline QString findExe(const QString& name) { QFileInfo exe(QCoreApplication::applicationDirPath() + QLatin1String("/../tests/test-clients/%1/%1").arg(name)); VERIFY_OR_THROW(exe.exists() && exe.isExecutable()); return exe.canonicalFilePath(); } #define HOTSPOT_TEST_MAIN_IMPL(TestObject, QApp) \ int main(int argc, char** argv) \ { \ if (!qEnvironmentVariableIsSet("QT_QPA_PLATFORM")) \ qputenv("QT_QPA_PLATFORM", "minimal"); \ \ QApp app(argc, argv); \ app.setAttribute(Qt::AA_Use96Dpi, true); \ TestObject tc; \ QTEST_SET_MAIN_SOURCE_PATH \ QTest::qInit(&tc, argc, argv); \ int ret = QTest::qRun(); \ QTest::qCleanup(); \ return ret; \ } #define HOTSPOT_GUITEST_MAIN(TestObject) HOTSPOT_TEST_MAIN_IMPL(TestObject, QGuiApplication)

    Please visit https://www.kdab.com " "to meet the people who write code like this." "

    n琚ⱇdtp_ fWT>;N|tmqCC#|k~WlQ*_QXvfu3M7,3]?t5wtD/$v=}eǫkMೇ/rDo~Ŷ-2< MܶsQDq8po=SƖʹ.|õ-ҹɂsP,:ɽa:֮Kʉ{!377[رq5YG=WnYU1j"@15îp$osĽS#<y%·篩X$K͊ #dX^i.Udv|f\]7P4)d>pG*vR70*bkUQb~bv_x_9HmBp"""e߮~9gk>'k*&7;FF\HS\6-b9'0Ms9׾tj0?oe6=ygvlNkI&W7lڦ\wa>^A4vnL!1w~Ȱ#7՝4 #s Fug- x}|޷_:ar$Eݪ |li 7J̲n^g%5uY]'14>+nC;$0[g} ~$[Zi\'k)gH3@C9jmW?U>LUY~֖<eb IDAT-1sURŲ bvsUTpm^<L뮠'8|'6Te Fؾj/Uq8/[8]\4)p|*ZVelJjc8>s| bps虜پ!N:ش&Vg!웟]e*g8/l.Ţ;sgS.im A扉>^ڥ\. K`.dB>|KѲB UlXY~:hmZ]"`.bFZf (a*cek3C3\c 츢2ώtbrbaWQqƛZLsMF.[q&^ggv rnh >Ѳ[Bu$ Q~;Biz/ :cym3\Nu;)R(;w/j: 69C- +L(Gxu/F.v({NfaK{- A|?l,54pzy$e]G >,4y%Ó %]r.׮bBY@ew޳[6n/珅h+ 2eJ[ o5 4ό%?MeTG$3LZ9FF΄ټ|pc#$ _F^BCL,FW KMEM9 ֙?^i I*r%['""'wrd1u;>0!V[RmQ2%/OR\(1L/!x:nmu9ʞZ<'G۹v}#])NepڹT ኖ KPbf[8UA7>0cf2L-LB?SA|$P(XRhe+W5 \Vmb9v?"""""""""""Ky;&z=F#>(.yce hɉkq]S;:)']v{篝仫Wk6pCGAw#U(޿(Pdl8d"H2ݷ{t)crYgN˯r kb""""^>dpv ;ad&\ZzA*JS}Y.TId_Ixl!\&|iZ_@$} l 0=FVpd$M.GC<<(`^Ù}'CߐdY[ٹA_&Fi\LYʣqbp(BcELlg P(v/TͲ2\Dւ,}Y,ץwScgӌY.N>CYm2BM|ppUwNkm\H-M1kxg޻h M3rqyFk Ue4~󆨍Ua1M7uH8;)YLnukKc$hֱ-x=惙Ĥu|?znwpu#[ z %o57XϷ8|c#x6[wT悪{ʩ;xxqE)""""""""""rS_.H$9!aTdqIS (+ .|C E;ƿ&ך:3EGX"² AWZ(GLsK45;R+7=h.̛͟m,L~ϛ^]lgvcxI˸{EL4"""r^F,DM؇םv4՛;S|)_B[ڡbcdyܒJ?eE!'X>1<Tmld9ixL\ K̶勘ꋾYE <615 ǃkgQ80q\lu-rE yOB |w-}_i-pBťP,:%KMM5Eg^,bAiy8VC^/<ɂXxx8L_L)"""#@|RO_?U֭yo? Ͽo֭oڨ x00_yĎp5\g{{Ba6r. nlakfεkd ܻ8_p hm`U0d5ڃ~1{7 X;U`Y8_%ᒞgt"Gvu4_Arzo<2/JS:H寫`ӊ2ʊQ&8fc8=\R4y$R ST6.g+XjƗKílnr|̞+[q#|s XUN}f'˾N csK.e:yj IˆpbO7/4Wyj@kvq<8-ՊJ֬0_MYýSt,E,fDlXIm8ͣpt̹n!xe Kd]j5l:LI顢6HnAf%]4) \ [a{~O0]x'/.tuDVO \Ŝ>7<`aP04ֱ%cEm++c:]Xr Lc8WE:o>pۊA}]-7/gƙȞgs bUeXG`dge*2ȑ=U/4H8dq, lCj35#s:jYU;w׷e״PY,p*/EN+r(ams-MNɥ7s7?ccZ_Gk,_`׫<5MoR$_kd"d> <8 ./oO ̱[dIYreg1~Rzm9^xQ^N,S)9KGEdlgo,%1gT~˃ȄVpZNլ,{/~OdLvGʷv3;Uk(rx#/ĻXe>}hbf.(OM2Wڙ{0׍δBC'9xGkf"""""""""""xg:yٹ3-j(rTGnȐ/ךJK{u@pp]twV--QeP~2-ѯw>#CKŁ=[UƊ"~NAc:x7rcz`)HGiƅeJdwo^VEmc[FҶc*Z\!2=xj:^~~/UYPfbB=:jѧ?\eXYU~S9_U EM[cc:3Բ5U1S\Wޢ#=OG[^wu{sp2q3K7Ը _ck|dBGui̢m٭we:m~YZՉy5ÊtKt-z'~E#S:9T>R>Vzh^嫖*SK`PͫʥZwJ"s  ]_أrPlVT*dG/mW1q~Xִ/͛56Эj:9:zT a_^̛lCR]'nAFVtCc*]{Wժdkj'!=䏴o_ZQUdͻ{kSb&tTyY}M?>!GvAhM^iֱOLh[cZ²삆F1j-kr.ӳK^+BڻϪ"İv:cFG0Ov=>ú{"U:MH5R:S}qkB-J+w42p\/ޮ#BZc ERUj[ܤdUoxXoL^|J9:k6kbV^?zV*?6,֧c{=zzoLCʱjZHRQ$pFyXŪՏ'0$עUUz-҆5Q}Ș"eeZ"3ua~§R5V-#Բw!}30$ו/g*>Q]w뻎2$nU~֥gp8 srTW?!ӐUJ?)Efުpuܥ7;w8Ѹ޾P%s{9Cd>ڲG_][LC24,fu66(fm߮O& }v}fxRzWCj 2FLG6L+ǑRՍ7ͧ&@3UZDј+ڿߐir\),Ս :/khLmzzmeȔ+GJUzo,9+0-oЯz+zjUYE< 'W˚v}vmqT2գە/[u i% W;W]9ٶcgGossa*]PjߡǞwuLf %ZXjk jVSͭiզ _Mj);V5 v?upRKn֗;e +_[w=qU2LV6ŭ^mʐ+׊hMۍZV<F2*{7VૻTp]lS [ktԒw2}ڲ}6t; %r%57W;djo*ZSyJ$K{ztW@Ս'Y̱hb}Q}WeHfP-+S'Mޝ&=G|[[ef}䁇7sQ"n*?ӿiw[GJ+[z@T)xƃkyCZJp&552庎̪ !òː4gB 9Mr K9y O x_zyvb25.ӯSO{{$k5۪ߩ]LT^ݬ"6}ǻ+qQJT__/Is?wy`_ibYE)53q[f(Sx P`^҈) IDATF R0ґ+݃x\Gc}:1AUTkHRIET_s:ToNP"WmyJ\2yuOh8#aV9<&s|J%_ zG'5weJ%b/kƹqfҔjY )XP4SM*uwWल)2R`79Mj,ߛ\Wىz&5udJDUY^N6]IDDUQůĹuRwOF@X j[[*uhoeyW٩ u O)oUN*uhwi~XA#cJj#MWG~Eoz^Ugq\B[lQgqh咤Tr > NA}]e3"7T^R7qWѬ ]o O/M)]ͼ}n.7s&CҨsa*QԲ<򫺡Lބa*^W,͜!8EA]K -h`pRlJ CrgP0Vi,sT$Sc,I\ShVY{ CX\هd*dʛ9?0o< c 5޸E Ni0=䚆ŌHKS!:P<ޫ-40Tns $Nx )i T8ӢݷL r*xSP,PO`()ra ,}Mo0LKDRDқ$SpF9oLd4Dк~f(kqtkfJJ.Yj.ATƛ*W,Lwx\YneTO(|cL0\%gm\M /c{g0EU)dZ'+,}{?>7qp\x y+o/ n`(OU.K/5z0Ԭ[QU_# Ͳ2=^SvJLK +0K+ɑdJ4hJUra\B+3L Cui=KT91=dNka*^QnU m雾s2XL.a(QR65~s4qϘO)iݽanzVS:kjp0M4=wK#oZ^=32 5ޢ_,{3o0L%KkU8)A}eeI:[z *yO d&i)>7Ŵޘ7zWcR7 ϊi͚VƯ"F$V +Ѹn1 sT'socWȷv7 Pz2xPxPxPxPWW|NٜrQ.jnNLYoڸYo^mrOw\ڶ]5Sn|Kxmص5b|\.}yWi[ޛ698̩ uGýi)Ɵ3hs&Iw>BFC)r5:֧>#+0Q•neɸ.Xz?w?VYxܢ::)zs-g~p[SW=S%qv\!S:*p,> Cau]9#)h(E Cau5Ut [,<{ T$RHuFq9d ב* ʺ>뺲GbAEY }|Њ+ǙoT4f2 !uUt]I,cfǑ-2L;+)j2oKOa%85.Pq'9Źښ6}lѕS4tllו S1}= ->Ifzܓ8 rL>Kq5r<٭c ȐdfO]+ם>N^~|于lwzCTS2`y[G Qb|\!zOWШޮÓڶ*=li(h}]/+cKug}|bF¨~ouO*r\SzsuelLt^ܬ3u߮զ$wJ_C+5tX|ew E#eMҲHMa,~p{wkt4󩼬F[QXqzN]#]+_ U zdRswޥbmZ8\gJ|i=)ч׭,9~DsX&w\9 Ǵta~y"-(tC޹_&u`(z6Ns:өw=]VPȚ%4)ԟҮbMQ}}48)U %zdYZby>vЦ MӋQ5,oZ;aMc?=ݩ;=;r]Gf u[s+ii?s\~{ONmMkGypJ9F{m=5 wT_zޣߨ=b|\1SoնpPUɅz6BfHvu;_ұ)rS Fk𲨬v⸬w_\ЯBvL{N/i.Ulfn`.a`QUU=KSK {wƇ:_ަ٨6,^_v>quۮ6NtEgGhQIP'ljWw0;5:h(R]WrO>}Ž:j&zQ9 ڮϟk=!I˟a_.^!mܧzDuF=ʔe&uތeoB쬎]xApR-{:W#}?ݡfhYB>q8,INp\-ڞ ZM1$KK"Gryב)KK.ւxHA']'꾝ok Y뵃g%F`ZnQjԶ7'ܜrI=&LN^|^m+775oIC'_xU{tޭU}zLQQN-6_n\nH^qXi6 cޮv'wկ,TgHr56ԡ:ݣYG-oY?}bNy$?ڤGW{;T;{kn DּRM>EC $Gg^΁u7hACO;(?=DȝԞݱlW.`(]Z[*+T_u 2OTjU- ReN+Fsl0|NUq_̰T+$WS:KPeBaXVDDQsձ HrĐ V.][f %Ǵ~5jC˒eJ1=1-!8w߭]cun/S0Y:{u$4Pp٣'BQTnk)ė$C҅z!uczjTy[0S/IfH+j_;SΤÕSd*UZw72tWg2 CAOᪿK򧯛 "߼xSHLձ7 %))Uk*L>|5$GR*gY(W T483P2DT 5-çϒm; IվQgs*ʍ*/uٮS>$yϧerleo[҉놺؛rI5-m(ނښzUݫkן?ۣ tעj++vư3P{=[J+G¸ƅP K+km׀kߡ?; u:-K*k9Qa1K4|Njؕz)ҠXTƕo 2ZrjE|jL'RnrNc [iEIToz)ouauMd4^(*pAϕ=Ka.PktzapypRegZ<XӠ[ݪ 騂$YjhXe{j_-*ײPFh 趦zUd*oӪv˞c^~oV46둕<))ͫh %!EϊHDN/q?g@@ӔiWܭUk{:>d>-YФnQ[2(-jjrHOn߮;4TBJCMW#9GFWƹ~.*~%uUr?'==fgÐ0$ޤ$ro0%tuij8vGv[w}1%%5n@s=zݷ0Sa)/׃ڼ}HvÓ[Wjm2 eJre;gy_ߚѳrͻkӲ *ʳ”zWKrSkU2yR?<>YAשjjXGGZ[|˿"ڰ|{hs&O襁qMR$Pu419sTg&&5r0TJ((WCp;2@2%V|a>pJGǧNwzͩ^T8]\B|Ir\[7s0(Ǽ4U(H289*ғ*-pձbZVSjc:Y8-dvgFY\ el2q_ E2U\eSIӧ:sB?҄ZQPT>P8EG+jq?ҫ}ʝqv~L[kS_Y@æFz: My ][agWOuN({p|PcEKKV삋]eO_ipBKʒ*lI!C˔],hPԙ%T:sȞ.*i2bPвdEMzs|W1C*հ:;Z>sj>g*3ƅZw_v+n9ҋd[[}>{偌*#AL)]r⺽4ujЍx,Ue|KEko39;=*q^d8DHC2Uz`IvГ;wԪ1Shw67O1um]z|VM5/Pk"*ϩlTZ E/֭z,ߠ%vNGOv]c 6葦E`c؉4*P:Wp515;5l&uWYH$ӲTL*|dP=JR%`R5^8ҡ`6Ý/✦Yt21^QU޲\"1i'['WzTdR^YP>yw"yw ;jw$1jYH.RTNaB IDATSF@ɐO>T wU6F7$ɧKKzQIQ V{*c޳V-_oDz0] e.#K},YNAC9G}mn^*ܨ^{Lݎ_%!L./+꾊$ɴjZФw3c ҲuieKԾ6ٮae+nXܢU7:=M=ڮyqK*Q+PyI{oI~t.ң}@gw)}pF(( k!ׄSi4ƒ25,'@R32"u-睐ZOu!-Z?+_D*gzi#7ܣ[ ~5`~/XO$uNNd[AU&j*M(/SC䩁-.\-iM^Dښ;+urlB}2 ET.SYYR2VIȧY{*#ggbr׊z` +&W]"6ƵDuQC+}F#?[VS];S5 ET"P%I+w-Quk6TWRCfػՁyQxPxP\u%?wf[|.=;qOswxS^\.~w׎nW 괼ڒ$9&b$ɞG~MJ?qsL-BaIr5G:r*Y@.59i  ̀.сheTkʐjh^/ߢ%5 ok{t.ѪUKM<_϶gUҤZ9҉n׭qW*ؠ_^)*|F*:E ;-{2]^ %'y٦? ƶ^=&Ojѳ_y]8-jQ}^_9:^m9kk_l7~2ќwٻ0=yz޵jWeջd[bM1 @ H $&؀)vp66$[VqWeW۴|U{VdKu].{Μy?|%whN }X_,㹝/䩭Co]V2N|O˭ eEDDDDDDDDD\V7+rz96=l^J2simCcgp[pgS:pغyWyɱocmd)^MR({*fZ?Y<g˞,ޙdL)gR';WiO]^Uݬ.^_)3=ps\aZ\r MLo? i㑻),N1xEyO Ři|x$ș/#]+ʴG/#]B·&ޙɡkpvfLum[ۙtmaQz >𞩔x).q7XLwvsacs"Ƕ\> hVlhwqI-~wbA2A Gf'ĒprN$$ |~ ;ٵk#L؆}`9M ;YY)qHDc %L!A1Rw aCݣ |dNX,n7Q䊼=˱\&!oj`gm/ǛuD,N±z ÍgaClΚ^&7%:3,r3qbQ8s&<ڑ$V0'3vb|9G~n | 5C$M _ţ/vs儙sE7^[ByNcSΒGw.m \.}D8(r/=G-No8\I\4&oGNuKl˅i.K,&ӀhG//c-hw |!]T/=CמFe#WO3{ȋ]s?ٱm˒gymc)E~U!W`W.$xX!)cg,_|v>Gogoo W8ȌwM+%+:Klemw&1|>VU1!|8 t:^XJmK$&0UM)fLIQn̫r`'c"9ȎMllv7{u)rydY-{؆E87)q0(?-ײ+I}RY\ATa%ol`\/-_ȼgo~??^bKZ\ nxy\?[Eۿu?O/]͍fWǯ- /@\=QlsÓq~"Û2?ߵ_n?c3sT>L]B}͟;V]nS.REIw'ֲ=u%p Ycp ]KID e13~YO>W~y~zR<߳*pR dg:Y:xd'DMO<Χ.r-⪿__ҏ}pVtM ]Q -S(8x'I<+><.a17_1Ӗ|$""""""""""ttF0϶MIAN~:vtEqwɦ|o=P@ݼ~:N Q^#1-=QomGxbddQ]+Տ_8lK_}L;8-FaL'JPg줦+ŷf<ËJH];ȯiIKWb x$ێ[K.㿖 a=pvRA905ɣ[NfJxkkW⶚>z~>$!c*N희mKqgd/"Ro]oײ w8euX9a|Arm,}!s$HH^x:`[}7_QCmMr[{R5fO|ZTO.!5Ďg++7R8E'(8}䯭n&1}nvnC {ٴpЁ9 'C|;W̙X]lް۾D{|df5k[<~q-+kf0lڲ/p%]M-<%g8#ϰ鬩c͆0S{oJty} COUMeQUOyvsOT '$w<ߌ|x쮁.6m/|d#yS18 twD~/v}u-sZzn;WwAg K( Co!ρͮQfW1iVR n%]~fpߝgg=dfӮOc0!2X_M3eU3WBYvI>SKb>ߋvN}gSw>8߉n$?"ϝ6ŕ^, 58DkCp .؃'b___5m\0LY;>`;pY6ne#/>y\?']|kX~n#gx|'FM='Yln,`x{6rsrn[/w6"""""""""""""""rX` [ \@{!~DSSb[Y9}ɧ"4'wUỸGM\t֧'upb3ȯCAh 'm__Ū;{U<W.>__KF.>=rsջ+JX8 b1ӘZpb{XWO`|p͌L<weg:mO?Sm>.M痧32)v-;cTۿ(fOC7'żoǂ0"<;K ^~jB=CVB&d@W^zy>;l`xg/1s||a?s Pw`|b.%ÅeR49I n_eX.ŕL qX7&.ȵ `XT>@,ESTe3i\_ ь Xp8)0}AλqmC%"""""""""""""""{MO,.pgrM3um)c"NGob.1,hK 9LYFH!>+]aDtMK0R|Z>1 GS'nF܎w?=%~i@Z9,rL.0C\'Oa`I#b36#gQ29 axcc\@s7pIϝς Fq_!>Eټ{Z#5Ƀ(:9 LJMWEDDDDDDDDDDNղ"03/I܇[)ˠ^6E>.R^ί̤$oGfqPooMa|߾QsGii7N$jG#eēaMeJUdC7S Y8sܝD!Zۢ &'l[M96CO90aJxdAvE/Y&iRV!먆EvC7!Dc)Ah,LwLC<"uBsbg1;U/-"8a,Ӳ<>q1vjcOoV.[X)%+; -ݴu 1IH쭍LH϶墋O08RriDRÖ}*0м P\RC/$Es ^b ?Ivpɂ fL+<ׇu覱xD^zOW鿏bqTϸS{WVF|bp(gwRw{`cOs3yST/FCgxn~ ?FOa+J"}EF iz9T*+ʘ[~"v'e+,]!cL_z0L^B79uGH9XyA򎵻cӷ^Z8mb4Cfz0d1` x78*_gv04zM,RG;kװi:8AEDDDDDDDDDDDDDDDf&e%G)8b5O~ x{XIc`2W]> #1j׬ѧ!Q IDATcD;:;%yf"f <YE,wl "i 'S9~ֱ弶l2)\w*‡Iϭei fy\X C29l l?~OZ$#>(i&֍Acoh"5tvxȹ.l>ᅨ} k dVOe^mx6^]M'^~;յ7ٜ'2bDyD,``()ϒr(x{ (qq vp-ia`c}zTdv~sW-|nP5|<&Vj%wm/w::F"""""""""""""""pƑ68ߏc|ʺUyܷn'׶/_!^@7!^Gft2M.+xoz <L48η:o q۟0[nIE=XcoM򑈈C_8qYĉLdqA LJ/C_o Ѭ7`4?eX|8Vi-&}h45=-M-cnM """""""""""""""2 ^N#tp*K `^.Srk'_YQZE7A\ŋ-&糆O3wk-R}4fyD8dT*Jo_fEfa=\_Ý?|=o䶏+6|vׯ xN ;w3Vz4} .w c3ñ9nfc}}N=m51R AFU.vv}=&(?\AuȠoOp1rBz2@$1aH!>@;:9dD;sU0="̪u,j9{"tE]䗄(*W8]v(9/A2'cF b4G=7IxN.i"sYϺu@裡ja1B顏p/ޫ]4M;/J@P_1Wb&Dn)!9 jٵsRl۸:,􇟡\an\[xyfp=ßMDDDDDDDDDDDDDDDpfEObF6Cz|:ۀx_߽Dzy[= Q}.,!gF}L, q-̥ mullaQ<6>vnc /yT,epqȝQ`ov{j0m_LzxO\776n/W\׾82oSbֵ | r0&6_)_zйv=(bRI?+^KRU3|#/7@гƗ ;G=^3tR77__gmc 0=q>rGb{{FygxF?t2dgY5Sȴ2ƚFAz?Sg4"g9J&wLyO/m1so{ r\r4oekٲ,HI'f~`._׾Ml=O~KnK~:u+r( :t  +顏pS1e8SO{(2q)wz1YLa_hHqF~ YI[譨?Dfq^V/q~̡!Lr? efhQwV}vVd3g^.O"""""""""""""""r3Ȟ|߿~Ln R6s2w$>1v.fJU /C4bP23YMm\a-fr5}G!1țyym0k^!e>N$1r29E. EAYc&vzY{o~A&ʥ80e픃S5; >#q*1-&Ƕ73$pS2Y TT7lzƄX1at>v".)d*y v"΢zfGCa ؉$I$c7enEܾrq ,1+`JB&Wf1q,/œ&\ ^΄1A\vA'9ƯG/(#dr%dabVVpEP2,|F^#L9d@~2vbDŽz-p`s.`Q^sS;'Yļ:60!0d <N6䔍«O/bFξ>`A.3 {0S)\1sZ *)-tCr|,g"}JXy̞WNeQa>(xF?D"NğǜyL:tD$Nl玧"ׅLe0yf%Tg6XwA1MdR 0v\>AHm\L/ˇoy̚YLx.d؋4vy+9vx ?n ,+/Z,###L~~}/e=NRV6\K4 g x7abq tD ESnIla'Ls[XG l''q,@؍R)l$ԻIGw"1nMqR6xnB tHF.nܧ[!yLNJCWpRRqlM(c.D$J`&^`B c$ W;9$cq  ޣ=1d a?bj`e<<!18 ϱsND$Iaz,Lq{aK96.pȃ(8Gw&qlQ#S:v9RnWC QܞI鷜z{{o`i70fL SvuN`?`ޟ6p DzA \{^#8o˨&_% CkHs*n"3?nEfΑﵼnov1/?'|G' qd4a2NB?On縑=C?96llNo;*r od`c'P`Q2{*n,#^'qx/wU0=z=+OZv9zȩЙLo8RX~(yC)RXyKс]>$k0v rlH1h]=EDDDDDDDDDDDDDD'G1Ny00C1F!O{1#q~6сA:;?D`ex`'uOoFqHi`/6<~0p2#msyoiz8$X&Þ3J& m_z9n8'yTǜO9פlenL1p[a[YQK~Om3ǒx,x/2[IrphodYMqx8!a`yum-/7ӛpL(/₊}鋊}}~:)L03Ɨ0l!}g/7< 87U%L %پ4Q^_7pťgj6 d{C;{h |~?\PGIC_'wY^|ۚxɤULIZ_7+*=ӆͮYxZbW'  B5R+I}c3j:K2]rRdgӞ6662'ʋh|6}Gҧhkkg.pay&a l;;8*LwC32<M,: nJRȒ'08Ht }4 hakgcɂ)e/pū;[1@  3kX.( óٽyϵxaf?y\8u C'"""""""""""""""rsmnbI]qR|.rODYS[%I&A\0ΟbGmoɦ(um aQ8[*31x<6ֵtS?e0 WS?`qϺfc`K]+zLX̜:Ho=76|AFA9TeX)b|9Gش56zr\H1ײyǃ$]QŅcЦ^S5=t%-H+H7yc~LNW+"/L&06\xyyTV"miQnpՔlF[w˕{1d'h$i l8o:byzNRo54%MBnDAuu<`x&v6WN&0\mfT/-[ٛ4Iz n+z&~CwԱq*W'ذf3?}քL^;NkO74ҹ|iv.!ǦVՐo]:\I6ƣ\y]A?.|MWV4˪os ܷj벳^k@?#it h[=iݸI wwzn oS}-[7 u,#/"""""""""""""""g4'Wk I "z^VSO)*GO uW6-?c.(C1"|ZQl;E,"cb&&(8xE~ۛ[TYWnOu Îvj{g]unwzh4jIV$ wlm84-Ydf-f $`0lc 6&nے%KzQMCmtex{{C5TɝϾ/vxi'B._Bq4F!rl Ԕ"LqWp|^.9|>7g4D=R(M m26#s_׬qL3'$P(شv)_OD>bӔjqJ\yn.u>[UO$I$I$4270LqU3ynϨI`u./ԑLʃz8O\y.5ioQdC!Fк?@eQR4$DɤՐa4vtpK6h47Onf3}.r%{@ّ[NiHE!IvH sk:q{>;xfêBU Dkhd~wN$ulϮ(_hli r}/7LKٝ 媱齋g桐 {V\#|-cìOwᅿy։|fI$I$I$I^ Vv@Q3.?E;|v^Oo7?Ug8G!d6ԥtfzkc&A@*dT]hjhẆZ3F/ l$GUgs}_TqRQ B:yz$I$I$I{+ !RěF|ߔb6*P۽43;Q-\e| ,ݙ/_N'O`w=aaqjSUpL'_xL O/`K \ȗC"[3֏|J%b4ㇹaI#"Y.~HQ857=' OF7\H$I$I$Iz ˔Z4: HGd,=?/Gsq\>Y-u5! +xvu~ PBRap\ dԐRz:B$I$I$Lf_oE=`D(\ h 6?5goa,^ O.Z3WNc26oƒ&kaj[3MɠE/a{F}ߧRĢGSZ[ƯwǙ;Iu4$/rl>"A@(tjD)A܂x>T=$I$I$I$* ý DHD3[ <҄p8f O‚-;yvB^V3壳16~2}"3MLK'H"nͳl\} A4J0oS$I$I$Lf_oaHžBB0! HK 䀚ǟ eog r6}a.X̮x_{{bur]og/drϰ8=B*^)1P8%(mzwxV|e .\B/Mo Z ?^?Č '1>Ib說b3]"I$I$I4yN!TXWxd/PHg,BԷ5I;:tv "hd>u$&'ʬ^m JAr.֞A \>uٟe$] I*͒4sÌV lΓ?na{գvU3&*`pa!r|9.%wBB,T`[ ;F^BDJHp ٶ~18y5#)jTՓ$I$I$I:b '̦e|kr(FE \l6<> 9mkS=˿_e,㽝Jц&oouytD\eQ})]S=ӓۙc-zdaRgI$I$I$Iןcke9LXE :1/W+6P@,7coȬ#1Ν>?O5< z!P̜ZV4swhW?R !9?b87ns&ɫvfF61&Okݑ$i/_fҵDoj#8b;ޓ[hJDh,ZʵqFܢ.VȦ 9ӚxwGa|Kܐx:"m衻'RkcLm(@4 W!qג_"QFn7ó}[~=H&ҒW PPB|bqZj)&;v|\ N3Q=axZF׎ N[K!KDin#ڿā+V<Aα3J}} Z4T$I$I$I$Izy!/], "ᏯŹ, &GLh':Ǝn>ţ; FtMZ{no׼,Ϳ h@O/ob.VL3yϨ~ih9+hzuI{۪׵WaI$I$I$N'Gՙlwo_vZ[[?~<>k|d[ K"~]g!vC25H̱kDO0!E;@ (s(@*&A)lS&hO1ne>PMڐ$䆳l,$֝m*O r;syv dt}$I$I$I$IpS?'<ċOJcPr4Ik&I 9TH6c{6O4-$v 1ZkSd" .P֞y,G'I$I$Iq(ZJ!v۫{_}}}tumd?>]]`Y456ݯsG!KDyoggXq@R3RQ[=Ukn> J}] #NylɊž>6.[C"ddÊ&t&HҌK_w\uHZG2U}Gdn Tr,[uE[vrWf)Ʀ﹑$I$I$I$Igl{=Ē ff{ wSt6<[6bo(XDs, N3!}|Ob7k" Hё8=#ד$I$I$I:= WV(0r q yRLZO@!ʵoHsaGhRUwCAY'z?Wc.2Dō$WSG1J$I$I$I(%Xw"5-Dk0"RMqQzD0ncZhv$I$I$I qxEX3n>{?PSWCi~jT ?s=ڊ␨%=9Si.hge4xnre/sjH>FI$I$I$ItՍcW5=ڄhui^>Ae LӞ$I$I$IұX" w4W~Ec4TFimilhkm hhi⼱:3j{I$I$I$Iti&_3̬n$I$I$Iҩ`_Q.Jmu$I$I$I$I$I$I$IN_$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$JA:i m[%I$I$I$IJ@5U$I$I$+-ҫf_DwQT,I$I$I$I$uLHdZ`w[$I$I$.-[W0N訉d%I$I$I$IRX+WwI$I$I)nNa|2A|K$I$I$I$!n$I$I$IY0NB%_n$I$I$I$I>aHi{C/) O$I$I$I[ a8zmcqԓ$I$I$I$INDHH% 9̔r)-kY?PPaRnX$8wӧ3Puz$I$I$I$I҉08^ζ<#!|J,yoL|g+xlUagL4O]έ#^)|-ݕ@H1-q_ {>,1?ِ΋ߟW'VC}iu$I$I$I$Iqs[G{%JH\&)c۲ۗcQobl3?^C:D[8 ` |{:>֫*q$I$I$I:#,fyiJv^:j1NT`||'Vnj?@|۹ܔgrSV&&s\}yd+Õ 'I$I$I$I$ˣ_G eօ1C20ϲu`t]x$v MSʽĺhn<4S  #)uN㦆z10/gkI70axZ.ٺFnu.(Ԗ \;9N1km4yz:L$I$I$8<3G.GWw?;z>vdnZ?^*(TњQǺy'$3gO)_+cEyQjbDΛύxcVOvrˌiݿ#DHXdZ'rU* ٖi`\Zwd=Mő85({fLYmzw0ԁr=lLpaCtd_ߞzKW.;xz$I$I$Io&uHhMϟX'~'A$I$I$I$I$/Yλ/hxk5_ςe]/2&~ԙ2 oޅa~{NC{"J n>Ͳ$I$I$It\>R#FL-^1?%|Mul_[= p9v~%O}(q$f6 anM} 'I$I$I$I$ZL Nw<.ojfBL[9xp7vW6&t2foXdWÏSAaHXUO$I$I$09CxtM bA F}&BPbǮ,JH%I$I$I$Ic s;+ ӜL[2a;sL? =ӻ[ɯ}^b&Ra21̆_uᇋCֵ- {#K: W>d,=~ZUov҉2$I$I$0hH <:b!L5\2&IW^g= uxgZxӘFX%J@ر|spU[3/I$I$I$ID49l]Aa '3&2: pєykڸU#D"|s*2y7ѳh1ϯ^ 4NC' n\hԿݸ{}s*!I$I$I`,/\f -?G5^sF*KJ1KNLbl/Bյf̜@Sc:nNDOO|uA!NАM$lClH4J&GUu! D"73G$I$I$I$Ir@_@io"QjIX i&TsA$Nk]3u=&ӐdLU{@pȖ-dQ$I$I$Ia|r K ]=/^J$I$I$I$I3N_ZT۸0 \$I$I$Ig0rڋquӘ~Fb1M3/I$I$I$IױtΤ79 06IC$I$I$IgzںVI$I$I$I$鬳'Z,I$I$I!W$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IƗ$I$I$I$I$I$I$I$a|I$I$I$I$I$I$I$IĪn$I$I$I$I.A*,˺v 73+y[`Jsع~1O>4VmdAD͓F&Bgqy;.bT:sx[_DnG4~Vy;xJݿ0~y]-2{lo8~%?;My#s;HUi]ff$I$I$I$I$I$I3k)=_o︟͑vW> 6>~k?a</-v}=,0ʴJ5o|{<Ȥ9s:*/rO`n uG }w_=1]1zC!Z?uThoF%g_dM _ۙ\7+e6x_ڝs&_kB?s3Β$I$I$I$I$I$Iu/'̜[8ʶ|?InKIǠŃ;oS͏"d,{[>t% }[x~&Lf=s`i;[ܽ7M\{E⌿?ꍤ Aèü6!C7AɴMZz6=wVnе3iHd{r_1O:s&q ɽw=?Wyl`NKMXrXMrzT},=ܳv&.0oQؿ~p//8 RbCP7_skߠHy-οagY΍/<9ų:ػdQDLms+WBg=Osɜ+bl!={FX\G$I$I$I$I$I$I|KKoYX/|hq>6 uSg3Dcc僟|?vDx<ٲn /ń{qmM4646~oCOv[?au9Jt=CŌ~'x1tVti^TXvן??y&kײ{Sj{q7B#GoYa{੅ɖ (q~27&C+>V~<&5ӹ֋CDO߿+/T ,^ȑyn3|M/1~l9_??//5n| fOuu6,6?z%Dkwu|sc'|?k}mH'_}K70[o͓).:L{u9,|\_` mTƝWxߴ+(؂elR'p;?~&5%7Kz~M1&^>sǼTZ=6w?ͽhs;wv/xǶx\K9v[?5̓eĨiĵ,m^9׷6  ?L~/k#yǏ^Xq>GnM <{|Ǐb[r$Nˤyяgt힕>rm+;Ϟ\¶c5su]s.}`$٣sӜhxlZaK-#.e`F4:@k\CW?Iq%ݫZO2(}۶ދOPsv,fpSEKZIyd_8. lk/wQ,/~v5Osm5-!nϥ; Ci+О],zהV_3Tkr{ ͇:vwϓgi^J`S13`%o&ֿ85D]6R(kGIQ(N%̤-w>7m 6I6Z cŤv|x~ ~Xt};v韞f7ec1:k۽ o=CK@ 3 Sחֳinja\z$BNnbdeEܒ5~rWcMh&|_YH3IRGUـAm_i8'gW֐=z]Uˑ=ۙ4nCN~Y>/ b˘fo8&Z]SIm+fjpOᤱS3.׌lgN&|Ͻ{;aDv0Z0:^VWceƕI]Tagxp=eGWKg7T6)!h$NNjTC6iVeSWSI܆Z졙LlPrx/[ nOa}M^]h4q67H LJ i*dyqA,)Xԟ(`yP9/ωJRj?m-v4F`6JWbiع4 5qun%o2>TAeqxj=]h>Jws=ƘaL禵vO^^'0u&a15M M(F^`$$ĊFÁڂBёh3qt{|a'"3y3/Crp_t\v#t}d<|M=J픡 $p??EE?߾Ě02_k|qc&7<50V{G:u.%Nh1pod o`9_?X kʏ6|a0*\YDKGYYXU}^|G2Y0`|$Gaѫ|o$oš&uC<ndWx%~W3śkȾ>~y,L(C_oe݊/7|D`٫`y_>dkGz`5O=kg_>D@UwsaVzqc6[N5&;S]ٷO<Ur}rbοkj`UE!$'FEn IDATh rMOPe%{qQto`N`}3ըno%yʃȯuc/M?>; ^!9<~YJҨ{3%]}o-%Cu,NwP~\"KE'q9ĩ\92T{ꏲlb6t#֩ěU(zf?Β#:yo Vl+.FI9;/~3=мN8䙏ԣWCݡ/xWwz(.uQS~=d_cS 5P1[Ά/vƍf؈l_9kؼtKwԐ:nxzDP:i*-MᲗNGz$}c%& rqtV \ I=ӑDu+-( 6[Ͷfο6$>GGGyG3H3ʋ>GֲvFL<ଧIs9ebR *Wӹ<m`ƾzɡY\D2fat11r~s1Qu }C'jdX0E!B!B!B!B!B!B!VŦe"Y_Pt*p'iŅPvjimi>Ϋ^ؤ L,Zfm͔?d"욊䗠i,ONF3=SO'~hmlmyigywKm|>cO 4\NNprUh2ǃůƧ޳_GI<\a,W}~v>EB#$ -Hc]#WǢ g'f8O##.YFî)5x:WL dMF `MwsA|_WcKt%I03Ml';ln7<P! 49qf1< >B`d iX[;\WK {[.ӧ%9ΊJDLHQ\r5o]MXryA|!Ss kmluHf~#;L5kJ)O-:"rfs%j;O㹼ElK#+dX`$6FKFVգK-W?=V>o@qݭ0J(nn [+0r",3I!3**Sess4vW`i 2"-o_*`<,x%Fu~k( `Pq/B[`,/A|50)Å.J|c-h(LFWi?̡Eb<5O|,L|jg@! vWNNSQ^˹|}NkJ#vU̚iض/33őP0G6 {#mgZF!B!B!B!B!B!B!!e,ĿO)ݱWz\26@÷\*XR&pET$[Ehp j 4+,`ٱ< #8(1dfP^]KpU{7R&w_7#ON`E&0$(7E Rd"$"8! sJg^ vi5?( mv~n)!\-OHg1~H.K?st[R^T@^A uM.ڪ8TC:8z! غzD])=O'#{()=V9ox2ݏwpp? 沿[e MSvFƨDdזr8/[8Uݯ48sXaXa=^_9HŖ.mm4C]s .J (t+D003 ~`S8ޛ:C2f@虫  O$.xQÆɧFFtPKsMc1)Du=-Nܮ&v6hh9eT+%4w<=?XtDA~!'Qܤlrzln0 х3(`R, q쒌ZcoU ɩ5'UԻHC|੔~/8oz.6`E pRi3G]$_~-#UQSUN][(㇤/6B7x+(/wRRT_6 dx>SNeXN+pήOR ηDhClr,=/8Ek*`q7) d4QCtk-e9e63UxfFiS&~৽GSTVMSk;NW3EN!B!B!B!B!B!B!7=fBGvcOLp!dOƲi)!%gijս,QI*L? c7[sHꅣ`t4eV/&TOyfλ;8E;'O" a̛ȝzrd{=Xf.M=;9>/A<\s~g h@h(3~u\1:aЀλ%犓žϫ2~:39+2Fpl`s] Vrܳ-5Gxs,!9w´1]/:3E|QEQY xDsڂSMhhh<@ zT")ۢOfmΊ|8OQ7Kw"+,EhW-\o#5 4x}C닢z^@ڴ_WWEUQASQvٮ g̮_P7c.AQS7_ٹ%˜'u~{׳:( ZzΚ?쭪 ^/s)y<ǍGNw{ǺgnIi_S̘0;/g4QTŀgwҙΝkXS.A]UPz=?#}l6{VR{;Wg:/뼧1ϥۻt(v=-zZաPXv#\xmz)o}/|<=MCFkW_̨n7\~?9^/3D#.^w] bd-kŇ= _/xx0!b !EgANGׁǍWyq{h{I^m[EQS?q)5lx=K !B!B!B!B!B!B!?Mg!2"ʊ *U;}8ZꩬA?n΀x޹UMXOel죂r2y}yq>0t!)8#uXQQM[uTSAyu=>A$9t+VlV&/%ӵ7zq#?ɘP߇WfTI9huu44Q{յO*B`lኆ gOPp/P"kStd\M]Si), aX;WЩ#}hrJ]h`i9a3xS 1I *yX>k"q.w Cu.۲8bS^rF1 x+ٻs^e哉쬺b2U@IiYlD[-(8ܦNIQTtHr/?/:caY %N ܥ||nc 3f '[i@v5/^Kiщ)H!($ ZJ6uR Sq9J(.u:db6*)(r 6^k_s>с RG34,XRWJj3aĆ0_|л~}Ol=qCOpxeh5Kd )q'4q#]ᢦSSJU #3k F@!htfkq=oaՎF̡ dG3z A os5QttG˻3h{w}&x*^Jq]ϖVN5܍G.΍.|.ʰ\kq͇NdžfRd@Ɇvv qT`ۡZzq\-VB 'OBcAhtwi7Kp,#{ltϯ}\N<+S2F2!JGsN6٥*^sȹI H&Lg}8y<}+pviRwsWn%$4lz0[:G}1j~vJŶsdO;v^LϖI՞l.yOш{*!2弯T q:hJ{ #8?I1FjR$5;uAuǘ=qq0>[|gֱ\:&7 &)%8/7l`yS|x}SԘ, H гoqWsz8 jdOLfˁۣarbC׫PD))1O5GaPK"+5ҭ,VD[Bk`fTh9u[qtPsQV҈Jbpf$*v;n("9/'@mm~EA5y9C7*\O&0$;C1略ۄzvV⏞*:ꢥՉwzh^. _@#S\Q̡47B!B!B!B!B!B!{e8GzK(6KϣVb2Upqp D! v".~~5w8<}4Wr΀i떳jG9GebFD`R@3jv2>P|4ɲn{dwUC8C'O$5gW!eO1Q}`dl~>x/É ],|kܩtpbVG1G{uĀY]@M4k[Y̊_%P94!NaC|di`8lk#HE IPdXQ\ o;I?2:ǽJօ()" \ԟ0=;%$=ūuzV4X\B!,9X};FD7Dx8}/~΂_#dXQ=-[ˊ͞ W"Z(9\:,О? ֔\OǮW17^3 t>'-u"1l" d izfHnXױh$a(.8C?NLeNhv.#r R}< rޓ´Ʉ[:jJ 5w-Cnjv]ִbmX z[EaOMfje픴0H"A'CS&%Ŋ,֑pԐ"V6aV$5,I^=Ḃ#P7Ѡc\s˽Lܠ6&a{i8—OQ`^|)bu\HdhFՇN´7B]׳6F!-X¨GOS$IJMK`uF0EͰIӘ.}m..HIuKs1 ﺊ1'PDb ke5ӑGH@c/ZK@Rvo.]B!B!B!B!B!B!B||ԕPVWq\Ưپ\v0[ 2w֚=yUTh;uQt\5{ݟ܁%e ! ;.tpΛy:'m!MյRs㜛%n sy%Kf p7RErr͓ u'ɹ̺b[żJXێɗ1+b5_.^hy,6` 5s:2z}>Y*M>f>[Ӄ9i _⅏w/sV:/xӯl#Шq0}yb[OL :Ā'(y8c$p詻+ь2YU,[l%,Nv.rSG3GvAI`__"!.yGKX3/#ĬcwjČ쑝5V^7o IDAT+ڳۉYQ<.ɑ?LEE%buw;Mx&p%NyLrpXYਧAs۵L4!}?0/<8xqi2/_z ѿ~ƺw^h,p* q# z_/Q$c2s.ɋ|ߟ.')Bdt~xF'Xȹnsyo:>`Tw utmH?^Gs96CMbbS%kyo9hkWv MDK^@č : .v?n`~W;vo $ʜ;`1?x͟Ghn#(~ n`0Ũn=oim<ȆŴ b-q;YٿU3[Ģ/Y7BƄ˸ OytfՋAC|s#MXpz/5r=7rì w]>j%0+&G[sNC+r;{Ig&!g/ż Kxp _1%/dƮüa(^b&u'6#t|ҷgkD Ԅ/0i7m tM i8.po-_Ɵ_Etkx+zl.9Tg_WaQp8|DLdqtKO!B!B!B!B!B!B!IƦf-$֮[υS&w6-y%f30531KŒ=fh+-Gm7[EDjraCAaKi-6DRy}?4wo'u ֻ*)]`F'rNOMV_|TL =#BM=cFJPXRFUA|r2j<;q6P|GQkb%=3i9nb`V2!^9J*1ddd`<>?;ƯEj~Zk+D^IgƶWL{&?|Y^=b>63 ۛJE1 K)npHLL!5)txmU$23i_{>;SQc#T5AvvQf J&DGhx?ġcXlL6DsG%;)**xy5FK(Qq $$MЩ>p6WROr~lqe "'#{h$=8^k?sPSZı㔖UVF$Bg74#+] 2>,2#9Zx5n6S$nu 'NiA KltaIΠ CJ{jJ9p0U53q:š|QY׊f !:.L2ú= ?zsw kj.Ũı50hP ;HkP"Y)=hxZk(.,8umx l d DF|S%qG^͸>>uSR\FM LL|geE5q6q 榡ťWh7GB| Y*~\u=JɉJ[puXBHLJ$55[ CyE+J@̀<s'f"bII$?7@NF$~jDqE%%U6Œ2`b 2v +HXTIɩdf$zוQPTBii95MT#$$LՄysXY̡CG(lg &~$ gNh,JO&3ڱ$M[)[w⳦0lDjo]ub DaHRp?wQWZH^ +b#=grb;DTQBAa1%4{tXãILI'3= cqyh<Αy;QKDbNMYGj!:9 S|,"+qTrhG$Rw!B!B!B!B!B!B!?͔1dH۷o8 @Xh#>tKrhƤx5U^Gw2͏@a0НYt#`}^x(nW^dMAo0Ñ~mOɣ?GBX,;YF8kf^+n_`j~/΀Lm5ހ^x}^=,<=>sO׋ϯuwL͇PUzy?OCg~˸Rz :Jsgma}Z:Q0 _w_qOWC1ឝT抎wYoyx|h}+^'Vz/Ӊ7iLh<<>͡=4wLJrsH?4Njܝtz]:L'禾{=x~4tz3vIyq{}ɏ~Imïze')9#B!B!B!B!B!B!Bo0}]7d< h:7ПsQQPuv&e6~VkVzֶ` "%== Ec4cuVdJD *:&ݹD4]JQuOo~ :]/99"򛵞gO3k`f޳/׿_{Q{\_r6"A|nyf47l!)wI:7|@A9[ StzLgӹigj?K!B!B!B!B!B!B!wHJoѼNG-Mdءd&FjQi:ymn2&a.V7+p_'s# 6i:ů*Ld_x13Fg%|ܻ3$0zDiQ4cFbӿIG֐+4lwyZns^m q .B!B!B!B!B!B!B|G$'( KW p=|Έip73:t/}ۃOUob g7mEV5:A5 g;CuMSt[ 4PP$ ʏMyFťT4y03h5̹~&ﺣB!B!B!B!B!B!BwI_oQt&]348c5ћD&1$wq֞S&STVMckN/!D'e1lXpXeڏ~FƔ KhhBLr&Ӱ{>v#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02>#02># IDAT02>#02>#02>#02>ľ ?hd|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F`d|F ,_oN!z !@Qxs(ꍊbA<"]HGH!A$I ZJ"xX<#_5kf|E P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ P 1>@b|(@ Rd%8r{lj Zttv#a1E?@kkKy㿁 <סP 1>@b|(@ P 1>@b|(+.uVSTIMmMJqx])SM)5uޒÿNrx$iUѓ7uwJw֤RJ}cSR*fM{I}cs^}+sMgʥ446nBZIwOERSk})wwM-imnxmV+HGgWʕjJ ٠% 7yv>umoӝjR[[YYݖy C{dTM\N\MM}]jK\(n-u7OJm3vQzoFKru% b署i(STβSÓ3m3YYރgmN;l_W:d<#2,H -GmGo_cjfOȕ7LIwa/|Y sR~g^R8(V{ڳhy2yY^J#2fǝ#QznJOV-'fɼ˲g}&mGw\w>on?[uu<.;e6?^ev]Neнyhakvcl65otLf~u[W8i,fùSb2I IDATxQf:xXOQqa~t38;|4jٓŏޔκ8^zou*erM~ҡd_N̟rg.=~ZȐuYw_'#ms?ϩvO^f#WݚRK ʰuTҙg]CgPK5K&ܘk:|sԇvϐu]-gsEgy` 0 .1?K+fOδg2r?1l~ӫɌoݲNޜS2yɻ)ITjw2fl:ٺV.̔OvtOO%Kg?G+g•&++fg}so] J<2iz*Gëkwiͼ%/ϐ]?*lT+ \϶SMٙ>> k=ܝtD>\3Oϵ}n:">,/|k\_O~gw .No2zehfcDն'rYge/g7es]72yɇ2iF)c>>&lgҹrgGeR99y fΕJL;vbv? ƯfG2r9|@}o<8b7'r%G ~9zTࡻsۣs/|_o|ږY:77.W]CW27 FI_<-utiJRy{EYGN˙Wޓ9+1?>-t[/=;'I*Y 9Ϗ˚Rcm96zhgisjNaϟjNm7˸dSϥZJSߡ7c&,|WO٠>I'ݽAyrg)4e{tm4f3gEkie}9/~_SuMfqeξL:?k*5i50[oxG3vxtO=?GlѣsF3r9)fM&7{Nr]z\qS6}y|]Y+qdZU>qG_fdWg=䩅+]MyAQ5%նg3KreƲN/MI},ovʫgn?Zߒ۾-:9#Uk\O73~vnn|`VVtץsa_gڅ ϒRZ6*{|D:plլrWn<;mi.e7ܓ'v&MC'c̑9=ӫL˯?Q4I覔R'e]q?EkʩmlF>}h>mӧuU2Wߘ,OOmKlrMT~x%b\[ʩIsm=FJ:^|f&=;G#RR]qW}3w{!;4$]22)[|^}ߓT;/~G.OO.f}W>lڗ;Wfmݔ\RZ̻d8d {MYM{s S`uwRӐ>7[ޱ_>}k_-4&7/)䑋sK5~IR}M뻭睗k'Nˢ|ddo5m3&dj.\?"YmS\/:{&5`}aOݨ55I۞\qk.nJm)9d@3rM暛34p;d48 =Y<\p݄T|L݄TӢB;)WjڲNX>'fNujUKSS}j 3[3`@t? R$Ϸ}Uh)}SmpSxͩrV~*ϵ7Nu4ls幥+Rٴ)wEI}ޞ]6KwG{˕TSJm]+gkz=+.{ɓyxmM[ҫ6ISnan_![!Y3F.acɃ3V7T #G;d-65e܇sWi2fF)I̙5=O1?0ÇC[R[tx"}y_[6jtޱt"q97Ƿ6vgs75Ũl79+=s<]}&NzqSm/o.5K7[޵SծSS8suc62_ֆRV66O ӷ)I]3sN6[W?I^x|9⃣ҫ5ܞ86ϭƛ̮;oҲٹc};,p[*] rϷ. dlRs d΢$5Ikgcɋ~geAl)GޙӾ=5瞐o}z xMKfg3cWdXڐe}UJgzOre[f6Nc<\~ԲG5+f3KSOm))m;7R6zfwWů窧C7vcK1O9wWš;ƗۖfӲ3-cSYt~wN?}c8LfDL6%,;'6I*rɳAȠY5㖜ϥlVk_ fʎ udZ}Er%=߃r5m!zƔ*;|4"l;KgY֙Rm1AzkAns̥S2di队SnIG=Y',wԦOOʹ?aE>{< 2ə3˞x%ߜ cvV@Ϫ̝1=3;OۋTVҸhez^9jzNͅ?:1")`tUjSJR^[Nr{-F ds/΄SjH)I#O kdy}ߟĊ4 U=i/7lMmjӿ/fLU+:_KiY~oIydlN<2czw29fJV-9󗧦)uNKث!mm\w-=矒osGΦ1,;3_xb}`ZN}վ(f-L%)w ؚRҿW5zr7dA&;f@C{L | nӯok*;sNګngX^3/O>:=rV._jM4MY0Y:BmjzږgEYݵ&+WS}~?:v4,}q|*X6/OL}< am!rxVlOGWJVwVR)}ʬX|4njO>4i^)& ׯwSWfEۚgdq6Co|W05-NymoxL>?}eTW '_Xmr~ȷrޟM{&<~I7_]lRJsYgښy>S&Źgꎞ}5ۿ|oazPOݛ3tb.po&W8$;~g^sʑGͱ}) }WW屻e7>R3z)UyrqfQz4鉹9e~Iz/8{7T;3s=d|; J}J,mW^/ưUyv3oOMz%ɼ{WsŹa-nTӘ]?uB>`@q6MJV<|_fͻ7~K>ͿOtcz~{ؗ[\q)rfmv;|}Y$Yuwu|yQc;oMO|?\JsQ'9ܛsމ𽿔ݯ.)cםo~-w6d[{ùc3|}^<啳2rk2o_=0[$rWJgM}Z[{wmMM7?u_peE,Ns|39Y3\r5yxir!oO$\: ^ίTͩNK]/N|vXT2/ '{SG<;{RyW/-^^%f&/=2{ҳ}߯{irYs GÛSJ5m+&- K]W=_TVSoC8w 2+zK&/n}.9b4>#^9Kz=i; ϗ/Z~|cXx<r1RJ5mOݔ;.wz}i&ն럯>3=I˲fٜ򻗖x[Wդ#uEPYSSƤ+ݩT+Y0o~*d[sy] jg嘣<=ܮ+ Tߚ[mg粦c] e{?IJ|?U]kdж?{gUOsiQ*K-wcNBpoI.! H8`crdT5Ѵ33I3,'pz^{kѓo⥴^~-W=(`֕#g<[^#/=}0gڅ܆7 ` Oݤf_g?U=bf#մ0zP BQ]#ӦOm 62x\Eo?ȶZAP% YɢW]f.ײaD_}l~y^v+Π5}xo3/A w QR% 93cՃ?ǵËn`."s8ֿ"/S˵/ DRT<;׽{}ݙz.ՃA| ASY1ĮG턄CKwТ'P9*޷>~B- i2VxoxvD 'K F@p}%}>^ȅa.ve+dbc%y1>""鲉 >@@ dq1k+g O?Yqa(isRھ]S$I$I$I$I$I$I~KTV|7ǽ̠,x)Ul;/wLDʒYwneGoei2|ιl^w7BE woeGgbcdOσ9 X\~l 3$.:u2QM]~:`Ӧ-CԐd{س}3Cȧk İN`j1B:::eػy7^{\|lR;y?[o7~ga۶iNutǁ-z d\n{ּ/SLmĺC{sh3xfVʾ ƜR8jDk8nx/y|H<OBze|%>:lۺpnJ{g'ϸQSgRo@]lڴ{߷?O67XCƚD" SlװrDcǾ uVf΄!I&/n;?qt,ٽٰc]XZqaI*&T72D4/n;صc2!an=[ٸy;Н0п73?*l_y1OO8$ZxYi{up-}=FUiH$Gwcٟ[(:UĨvY 83myP0+}?+A0A ";O_5ûAxh0#u4..`򵰆yg}1_Y/˲#<,^o`.4dz;ز'  ڳHRX>$H12oo> JqeyoD2"aH~=5ohmy|QѐLD}}C@ꚲCGIi>Ȩ^z#?{`]tHScmJwX` c,/7p svȒ˅M@ey5ecxE%c1:-%* 5KA@z31C7b DbģYA! m6BȆ0AY5 ؐGہؠA~ᨵ>vo\ŋ#:r4l;Xt +~;;ځ<*j(@؛4A] ޵_gkN_!D)7?Gyw3噇i̬p9+X0ၗ7HVkn{)/0>zKTP  *Kfz9q,e3P@s˄Ih=a9s2 x}̢2%2:al==tu+.jDvOۇ>^}nn1VmIGtx,KtE/$I$I$I$I$I$I$ 3FK)6oJw!@W~^ztL=B.>e&ec b.G./ X53m=EYr-'C(yƟ拾i׸sݚ3X\3z/A#}pF@%  "lҼp4ⶻGz'WnK~VzTu-A @6s#\葿ׇy/S91a~=M$I$I$I$I$I$I$ c7X-!y]0G6uՓl_2{*q 3)y8:K9lT6G\իߤl Ɨ WuK'=Ľ> $}L;~ I "QJ&Pv`n&52!=]{ش*Kir3pn7Hz4tO$7 G^9>A5 C'/v~@~u5ڷ,ÐtHrG$bߎd)ƙm_1GPP[KYa&|Lf|JK$}l۲uBtwxm3?_OJa|hG '+,Wsq*&0s`pH+*)B2' գR{BDlcsoO-Oׁ hs![6+L20BHn8ini-#<O`ql;Z,5clxQۺ7BF}K~\oj<JF'# aa2Dq㚩/^`{{Q}mJz[ - [1 sÊ1D Eup+̰ސ H4s5(gvsDf;<ڨg;Һz7yI] 9ӖOFsdͽ/SV5ɓj} ϣyg,i;_D,}GJ!fFNh<HfK+yzvz[Y`rND2h SXMcUa̾l\}#&E$I$I$I$I$I$I:ֿz׋VP[8dIh% ~??K󟻌C[~bgh@=y?G6Rw'z{`?m=djɳ?߽u sNI IIM %î>$0&(Ӄ9z۶׆X$yYHFa&5Q]t8ݱ \G0ͦ'o޿9'xT3Ҙ[[ Ek*nJY"%Txcjz5&̯ N?]yv0'Bi](랹V528F$Ը|;yOʏ`Bq a?n~\tʎaJ߉?{Y:%=JZV^M$cQ_ {`?=yULl01x~Q|\ʿ>(s9JOz udh !_~5:w6a.od(V=R|g{^Gs|#G7D0Oo~6Oyhg뼺:JG!b㏳uzx偀֫ä JxUu=Lt.6B:DeU,^v |n65mྛn-Y\v9KFQRRNi>^zEVO$FɧI$I$I$I$I$I$IcE*̰٧Xu'm/K9>=u$1ضu;2W,­aO =ƾ0Am7dpU2Ww-}% }G5eaӨ Ytt𓛾k)ٹn-ES98kxH0}ww-?|Fϩ̧w盬Ks=bTN`-_^ˌD{Ֆc¬Y9q4^)5M3?=I|l ⳿ϛu=W4Vi>XvTnwkV>˧w$_g,۱;;m}?_Z(#WF4W&ɴeb wyqK7 N6?mnrSXt *b<=D 86ѫ_yn78ٳg?y3峿?<5n{|q#Lh(#$3/OLj%J}{|'i<)lҟ~0~KS<eD:)z ]y%'Zəýȧ={:țt:W,nl.rϳrxbמnJf͵gw$.<1uߝdzc!e-'q{/e^]'|޾qc7}>7V͆HT}C.u~UzwɌ_ܩ#qzѕlo'}O47dnZ=: |$ ʘuI{=|䙔F53s/qLjcBV|#Ps|ƏwՍ$lO;w#><{-,_ J)NtºM>L^5:lE#chTq5]?[=¸>|6^w*(dv~pǣOK||溺 Nޔܧv䆿c7D;֯cgS/k.;@=__$}4ՖѶc ڡdPqX'lSk~A]Qܜ[鋎g+_ߘECA[NSvw\k6'+߷ ?m',z>]I&H5g>N8%~{6=B}Qv_2yO%xᣓ$I$I$I$I$I$I$2F$QFt:MqqDDϟäbbDI%C2 |&(6d5,c94TQZG"/,;|8ObB}%%hN<".TWR4Y)HF!H40mdUSNOQʙ_ɲ]n&ɀHIӘ>e*ns[Y/a:f̝Fcu)yT7 [L]q>M1}b ×[D4LIM4UQR)sXDQ^m󃟾AqIc^\*kd)gresΉ(E4oUUTKSZ%gqUs|S f14j6a8SR[AYIxª&/;,7W5s3HT0yx**)/J*(g̞DI^ YL$M"jO:|.@ ^RY8jDx< HW0y\n1AAiYp2Źn$y)?@Hzf̘BsSE)jd“Xd1JHHlw=(O#.gRej{D)ifRY&.a"O\gXO4 RĤ iBu1JH )ϬŧpypR B2 J ɋň%ӔI+e2SHsނƮITUVR"]T΄9r3)KV0uG+e &OGCM) ˪ieNb1*'aFˊɋIV0qމs\ur&!]\FMm5yc1"'aYr%˙\?7)BMTKQPZÔyY\|orɢ֙4U~:,Zļo}׃d4.KK J+i@Me X:̉̚$# *3wkOHKh:λduKT8yE4ϜOqT7<ڲ"t).K/e4 CU1m|fNhX$I$I$I$I$I$I[nB*+|KNӻ)mQQQNcccоai\?]K߇9IDAT)1U CO_ ]&}-0OOWtɷ)#륻) RQ Fn.zBb| S}Il?==d HEX}/ceTzTl?"Ur%}>|CsHd3twҟX2E~:9Kn.2y4y ' /'reU=$顳;C.' ;MoHY9{#s) Փ!&O o@g/HSV;;d#$S)0g{% '}?8wcI$I$I$I$I$I$gyM6S__Ǵ3(-)6.}@"I++GHta1Ǐ IInx "q҅%|b4E (#UP-I~6>9: Jpf$:y=눧oO~< F7-#]4lܻ_WwћaQAh2MqDrE G7!D/:j,'(H,IA1. B"UHH (̰ys\rByK']t&ޓ#, ,(Ӟɳˆt 7ꂣ"$HU*|oCx2MW2OF bys!*2$ HQ_$(c bO߀h"MqX{$I$I$I$I$I$I$JoOέZX~<4Pнu|TI}rQKEcDz _r%0oy&$I$I$I$I$I$I$7a|])sj~ΒͅaHD,4 n7dr9Hh4Aq?μ_[ѹys]1ĒN?e "Dc1|wdqݢcǽh#$i{{L/>Y$I$I$I$I$I$I$mJZA,kn+Wo`v2YRM͉'/4>+t3<+ν$ +h%M#EOs^7dvz!QXit,ꋓ9̚@.ޡ's 9,Y5_}I$I$I$I$I$I$I?mPQQ>U$I$I$I$I$I$I$Iү˺uٻw/ L6Ғbr~z֯_?$I$I$I$I$I$I$I_D"9 "N>,I$I$I$I$I$I$I$lm>w1A$}>@fI$I$I$I$I$I$I$IA@qQ1E[.f7Hк@HcŊ)36>A5 /|묰otR̜^b%))ɨR dddds߰\skl<3)^gϞ=)#>@gtV8k0v=t /<{SAuxOHH;<<}\gN-[r1KHHnp:FHH!INO3˕kpnVkIJJdՂIIIPwLL;Z:\ΜlǏ[-Np\FPP! N``gكkIMMXV'--pUTUP3̜6bccpˡCVI~n.p\6 ۝k bSplX<ZIKKl6wFF; -yZGP3v$?jMOO[%+~+V7& ++3==]~~~n OΠvn$g,!uy9-rn0,rY e3<7:OUVaCҩ?-0 q\nv.+o!:ofN;j p\6p8,.x:NVtg.x<.IN۝r2Rzٝ-i0Y `Zm0 Z,XVnے8I@gfNw;vݙQmZ]et:].Wj>Cj A|͜ZARMA:R6 ;sZҼǭjU j 8u(@Qt:\.MjfddX,!!!XKZZ!IFddds̵(""B2$Infx<6m PYVj;NGzz3 ̜؝aDDDhϞ=Y!igNg1ϠIIIFrra a8N#+P{<1E7 jXnq:0vlfuPgfaaa$\.#00p8eq:V0EaViu\a 4\.t:0o8W ͳ#""cNRVbZ-..~Yyp ꠠ #$$LGDD())Ɉ56:_נbx<n c\.bp ji\.vn3=0ev[<͇FFFufPgv ŒR3.bFքnKϏz&[jj%+Cy] YY6ɏgPgߐ՗_Tڠo3>_LŊi`jѼBCKD ܹ[&114i#s^gnM|wb ԘƚÇ_\RL^}E= O6lܨ}S.G'3`#Y+܆a$Xbr:-^On{n9N}tiᡃUZ5=H!Q| т"aё*QN8WP^3wIWgPd6u sɆ|n5n@>=RSR\9 2PqU`tg[ DkkiᄑAkzu5oo]}:q.X Qٲzz ->!I1c=? {MiȠz7bJv}oթSK}V׎%ߩm;5ժM.>[)۵QP5OTlY%%'g J7lCFIj֨.;PklpOjGU+b[V6x mHsquA;`Η[7[|4oT4ÏII1cv-΂3et},jBsGVb{;_Wjov`nӺ(mݶ]ᅦ!լ^Mt駟QtVnmظٻPPPU"%$&j?+P:%I-5U@`1/LuO?]vk꿴q&nRnz5nt2n@3?DԓbQF ~F\,P9_Vsy-:͙s;0u^;kaan9eWhGzHR:uPJ[mXt8lrix2 Cu""sOД|rQcuhLٮ,I $ +uQ|Ə~*] ++U/XH?VmѺ瞻Or]Z<}zPւi̥FӨgRppJ*UիUUF ߽]צ$|^zd9# -)_|w V0 C.˰Xoy+#=CqqiјX?ǩ\r>reÇ%e^{y=g֠#4tc>ŋhK/hjܰLu4&V3?T,_a$mAx_{mٲUCkEyӦ}?].*צ~}עj5T2*Ix:v84/>_VPAe^ a /s֥~}դq3]԰~=5ovl$-Zn&تes\]:.>Q%BJDcV˯?nYkגbQU^xzuUZUY,+9%Y $$Z|^wԮ{-^,T>=O^O"-@WT$mڼUv_kK֮[;vPR 8pafչ<@6ʄQO?[KBAg}u~kēh`dT ,8ZOs{8q++UbbdYvks/oza2 Cg_|%Iڻo>1UVU/^6Gm6o?s>_k|J9vIRҥذ^6\NC;w&R<; O!?Xf~ ,nvddm111ڈ+Vjl6hZ<O.Z(\oVK_ϝgEִPu<\BY;X,0\.WbIvxԾJHH0_07Yk9\uUWi'3CIIڳoc/YԴl{\ڵm}\$zE^vy@{]m;[.y[=wߥ5x`hZW}'9.ܻQl\^|^Fݻ<nAʆvk}` .Q>xo-ђeKӇ}f}a0xlj {,ϰj][S]:wVuZ2Tiںm]-_an?ݺ_^去"P_}՚{JLEb3OmݢuQ/5__>2TWдwDԮ7_Uyhڽ[VUjPT\&Lz׼%eW沏{;׈tA͙;_>jܨ"N~7n"P۾s*3ou^vvCԆ g^vLlF֭ں>ۭZT5ˊ_}!kto/W_Ѥ4էB뢴w>sz}[4z>;5O԰~l{\|6Mv\umMonumM>LZ#_}xT[=8?E&.^$I4n}Fjr:ڰq|0nϘ:E5kd]-ϜA劉QΝ} j߱$W!t]lڻo>3p}zduhwZ4o.ӡ iڇ3Un] 2HժV? uQWztUPA7n@mذQ'N*yy^/yUC W]cǎkμgqy&w'}!ƍk$IŊuMZ2TGcbh+nY,-^0Osׇ},)s?P[jSKkϝUޝ}}.SJwvh˖h9>|Ļ`պuK]Y$t֗󯿽=M4W^O>mVf7ph%OU'"BCWj{S~wI|5׷׭'_v?|X,~mݶ=G8t?:;ըA}ūjۡVA};gͦ/дgB jբiæ͚ҼiSKӦk:kCeQY|~t}nF]ue9ݿ>3Z'Taٴk.?mz>9ZPjUKָwW-sn>rwY]t:5q>tL F*WRRRuvT8p ^yӲysUիWҚ5k5)9o^EC lwީg~R_~5G{1[:i箝z{DC٧GRŊuoZwjݲ}d٣5bz)_f}1[vhN5P4mLYzx ܳ:ԵTIk֮+#=]5P=NIRK'%IGՀ~}վ][Bjr]c=~VPl bQտokSG c~FE~E)'πA:|z9h7ޔ$grmQ}%IaVR4eN$'vmz>r$٧ԯ+Ӌc^Qիgwljݲf}խKg6e`Wo^P9G~*R\#o.=z*?WpP{D}C{M[)Þd;j* 4P_aխS[?XvMULO,ۭ6qހq3Tښ  RJj*^qʕ-c&y^5" ܨg4ftzȧ x`RZzz_*wGb&՗_ԳG꯿2,#G<1UԽ[ljټˣ_Ptr)\Czg$:" IDATꞻ#Fj>5WTh->\~>KSޟb%I*VTԺezjգBCCs,޳[7_H}VHzGԳ@JuWꫯ*9%E1#սW?%$&f;⹻Q#ey^%òXjvzW4Qy>N$8xPo{G))jwO:lnkk.S\\BBBԡ][M2Y]{5.=H2},o^X͚^?^ |!cǎŗ_ќ/?WvvjAIM[$I~W>={ENGNðҒ2Cƍͷio%IF6:AJ11Z^?4XP ҟu-7^zZj5lx2?I޺MLݞ>#]ue>y>;vҐe7t׬U2j߶MiAAzpn~IҠ}ǟxZDU^xQ $Ͷƒ9:v*u{<ޟiYG-&|f1ƣ6lP޽4cG>?8 ;1T6wi޾%J#n۶CD͛ݠKe*66V.<ޙ_Lx._C*99E ̟fL}_}zSkIU ΤRŊ暫_;Xb rx˧hٺ[3fᇆ~Ӌ/of}ܣ/fsh)2[G|MW:utuլYSv-zg)^z޽sn8e5Ir:>K8Dmظ'ٳ/ʖԡٽnhDe'"???D{ZYD]wޮO}'4.(/>"0TLi=б~cyq8pPLl\\oP-ׯ;w,!ve2h|s~ + %NgsZ6GڽgDD.<_Gk׮IҟQB l$Y,$eIǟW~yEխ5kשAzz{x S jj5n@w1s2jr+[7#G{SOSٽjT2 :t1fz)R7T)o8-IWNSe$IVU 4oxA{Sڵ|m;vxiI'TlJ*ӳj֬2aa2P.˓jUF ͢pZ@Rd,qqqf}xVF ۩u9f v=~·maϱÞyL_RıQR4o~guC4| 8ٗ%1W?+VC;oZlҥKi7_7/vs-ի҂շWO󪂃dXs݄լysQD T%+/PvN5#)[q]X,$j$M3._?0s󕞞.gOHʖ ;瀺\r2yI*RBiii>!$%$/")zj԰UD Eߠn$5lP_/ $)55gu>}ݷ\Ux2?nvܭS>ѣrխԩmnϱЉ^.ա}[OjjbJbcb%emݺM>>R4x@_*Ug\ʜb+/P@voHӒUN8rDk2;.#&&F+_/zYeqھsOzWGto[f{;}>cV5yKJN:ѹiݲVffvnӕ 0Yz՗57:~\nxm|oIВ/!uҙu<#jF5j@ǎӞ{uqCn: ,KA(8(H/],T\.-{;͇Tr %i:v츚7kϿ[ONN-K'%'PUxj][S^xQWZƍu|veʄi߾s`XnZjnrnZ4k`H9-RNo}7K:y;RJvZz PkEy -YRǎ~o;xKlMϠ7zG[n5J'Wkh}j%++:zNMLLnWŊ3;% Z`̙I>[ngl6oޢvkjܰ|r,QB*Πt8ڼenFC2e԰A}Ee^uVa w7FjSKZ,q-:prm]zU(_N}g/^\MoA6m tckj*R7|~-۷ݪD>sv^ԬQ]ztמ={K8_ޜUw~n7ȖQQumMjܻ]}tjS@9.`DH6h8NZȑ:x`n͞3OhΗb2$ojg;KV-}+U*_\aKG~aBBBԪE IR` 9NsZ"D6nԚ԰A}9rDq;Z4SRrt+驑#|E*+ֵ5%IŊ))^:&z6%%%A9hLLEKDM 7ҥ?jϾ̥kTvPll~e̥o-_NSal\m#.)66Nzt+!IѭjS-XP#} RuUByʜa{o4wY?H~S̛KC͚ۻoFZPl\N$%kZzNڸivvޣ9]6z7̏uDڷG+W󑣽ǽ-ȼqoWh} +;ޫ@MyY ̝ŋkEߚ[/<_ݳw>jR7nq&\L\s7o&aQhh֯oQq z.rwY޵Qf]?:L%JԮݻu}t߽5wf^]dXԠ~}}I!jԆ jݲ6oޢ"4sr( O}z_~2azGvf왼?u&KyK .VLQ(QB5WjՔw=gU 7V)!>AAAA^խ={waSj[$I]T6F>1BnͻS>Дw'j 7=%KfZ]ΪU˖U9><4n$>LM~XÇ+87joQϽ0Zvf}xZ4o׬Uk8yF=3RAAZbN$tX5luQ(ZL@=7JKMWV-ԩSGl׏?SO|W#VSOԘ^׬E#V}(\n߰QϽ>tW+Q*V~^\/?Vւߨgn*cj߱#5t =Pk}/׳\c|8 S~Ծm*UJڴi^|imaE_Zaa'7 e_]~ H=0 O'NДi>}ӡ};uhNNSIIIڻo|0M, <N߫В:g,+-IR\\J. 3%iݺjݲeZ[v٫W^S{vWW|B/Y{E̥ }#ջg G!ŋcڹs,Zlnv5浱?t]wwn VJjv٫?d-ݮ^aCҬOg*--]Zw|G0ky +'G WpP6nޢI+ٖh7@ݻ5dرcھc-0@5nPǘNkocuY;uTɒ%۶/iK=\tF>BBJh?ig:}OW]ȑY7\k0N|DFFFlldTRňl6kJJv;b%x~d弤 BY;hFNoOMMuX,Gppn{񄄄x=k=:sl jꪫTF˹iyl׽E^Sʇ#U}:zy@!)_V;w|~җ_AෘLkӒ!??>&KrnE(\A]Ev}V4W.}ywH*#Y,./pV$.)N)3EÌnG!QueKR\T؁Xaplܩʖ 7ё#Gv>D8Qd ѣ_MM"PйSG֭CgTvm=ع>,y8'UnF~I4b7BjpI+_:oƼj*47J۶Б#GC04h`?~*UozE]ר++Uf]+1!ѼW@@^7J*UOG՟,P\|$iWtR$ۭmٺM}<$I5ɧ~&}dYt}ޙ0<$M?,^`.p!}kޝ0N[[p([6zmhIӣ7u]|ښ5U^J(Դ4m߾C}ƾSeZ韙TLLR6K=[wѵݣjsFJ!B! sr5̜>sW[&&Z=iF\xCL#[n]zu+xEDD$77w\MB| *HVၓ ujo5qxzooǴkۆ?/`I\q5j0j0MpP0֮k_h.dز%G.R+[MwSameM"E(^X *O IDATB!Bs|ۿzS:%l;_?_L&8!uv(^JeGԖY[[ckkÅ M4E 3iT\tEtʂCCqn˗q>oJeQG #888M9#gg7y{k dRJ%nݺPpnܺMӦYv=:lϜ۟ 1nH߼ɬ9 tF=~%vcjYr9m۴bT* cJ'ɿsʕ*2q{~z!Jo3zzyꌆ;{xhˁ PT9eP(?a"aaahO4i(Ӫuzր@э-[opUmرcuu}._Oɀ:>$倐f GeKŕ m~1)T Wߴ0)ܾs(^w44hSI۸k͟?^+jWXF@` .^bP_ ?^X^zŐiټ9 ^c(qǴbЀ4lXk|w Ӷffd0z=3mrȤIo;uK(XH]ooNgn ʕ-/\" 0ݻнW_ *Ȱ!舉 >>lݶSFz0ڴS2~(ʕ-CPPnąi߶5zvG,Z 7w$rs"~=bEƁٵO:N:CSnm._Syx<|]"@Zj,S֮ҙcvL;7P ~vlnzv'!!%V~R_D>dVzuܩK2}8q4K/q Q077ŕUL_reOR011"00ׯvo6%K`~Tꀉ1Oz?ҝj>3=zB就&$4ȸ$ӴgakkCXxx 8<2K"(q|?G 5g>CDR%Y2cff|=x M7چ7o8v$Ӿ.kyskۚZ5kk7Xn=)mKILLd<݋(O]NmJHLTqV\αZ5FN011" .l 5jȲ%زyv={žK+KfΘNMŋ,]ؤ-SS]Ȋȗ7{{{ZmOPP5bЀ+_Dn޺+xGe/.JBB<}رc'Gƍ1z. ~YnLOek@\ M |&3Upa{l2`?Y/# :+KK&NoP8llil?x?Gn&^b)/^dيDEGӮ,i'MaΟ?/QQQkL4ӂ/[=۶[ԯKann΄cYW<=0161g``?RRؼO//jժAckfx6nŠk)]ӧ}GLLEKڵxLHH~Ujd/˹O)ÆWy5eiӉPBTP[̟;ӧ xTY\v?΢t 6h-_n;v5kGDFұC{fΘ_b͘3l6_G/Iz1clk162TR䲴yJ*RD lNdd$_Òŋԥ AA@gz,--Yvaa,J… 7}DDFЯ@*-[[[)WTB@7K\DFF̋8,,qH_pa,R0fffpT*yrcDDDr "#&O<:͓[[[Q*VՁ/Z}]%B!B]p@qU!U8_qet!u&&' 0oN׎RrqqcӻK 0(ȨHjOy^q@:44L<=yj( 0P((^(ƍAVsjJObڑtʸxΞ׳gL9[fefu(V(#njSh`bjLptGƲaFƌΪuӄԕ*U֥ ۚ097|7}&I_ZXXЧWΝȲ}.A0{4ns FT漋H{t[ ɋ/M 뺕 zPz_#\طg?okG/0i8C`Ї Ȉ.p)ʖ)E}8v[G%$$pڷk5IAb-P*p)2{^:9PhjUr1u錅8Vs੧Qz{gbei_HwCfݷ_}'g П73smh?s&:m;(Y8luvT,Æ "22}o}.Vߗ}~ڶo|Qy. 7l@:YfftܑE2f$`|cccV^eU3<&jTFuj,]B|016S')G9q-5VV~Q#G M@cƎ8tO  (]XJ8v\3D\\,AA._eh~|… EVig^Xd)ǏŋL1S[ҹS'mNժU d56酥vt<@ΉciҸ1.LO^=Aw>HLx46֚ӓgI-<"%kkkҌHNzwc,]cccN>={RlI^SorM,,rQNmԩMTT4_:֮RϑG/^[.ԬQi x%/f;ޭyr&0Hs( 8u qq)6kڄx:OzVqp}(Q8ӿ(R!B!BӠF&S7H[9*5ic##*UHזL5'?VH2c#,sYhof)l;de2暈<|(MHg/۶IS=֌J*Ь3ooɫ_vM}|xNkWcmeEE߾yjzƌN*&kf;-e-Xq'3~@~?bEP\YLMM9sv\ՌqHUUxSNfڙs(R ܾsW{?<";9LͧK\ڛV7 @::}ccc5mhMs֭td6hLv yY( V+/)%Kƚ'66V TR?'Xp3A)Y`kkèC:G1jP,-sackN4a3o*U7esP Wu.\Q\q*U*jvkV.sFc:#3gjլ׳J}'݋2:&qy ϞS~9 U}}X<;SJΜ9Op=jԨ3gmۆif / sNsn֝jrŊX[sXxx4syaάiԨVV:퓹kiP ׼fxǡjUtX.\L{aP8kb;dz;v}N|Ѧ-.ERݷ߲aïҹS'N0o115h=ʾy6(QvmhBp<{,Ef>>)jBAժUڥ c׃ڥ 66v S B g ԆQQQۖ?B!B!{|#3̬9 aTfɆQ@Y=iɫ20GP>8$re˦)O}?gu;wĈa)_:1v7IU`~29 ،J&(07:#\׵3Py~]Fۧ{L5R",>cm ŋ1i :sss`9k0&gӗsӧ^:޼uѯi!VVkYMV {kVVV}_ NZGҊ]ӌ$W'wӤe洩ԫ[G[}.~c Ta:4Mظ8,yZ弹uv}<LJV-[r1թ5Ҍ|yyNy'Z2ŊLJ`]\WmzbNGDd$ ԯJ"!$8ɟP(7Glmmٴy >>ωU*SG XbN޼ S8n,ffx=furĘNӾ][14T`hhBH-X__lmm޵:#kk+?Z푑if蘤ڊ4O$VIIɢRĄD 0240ʊX#"(rʅvzԂSx0b(}O>e\KdVޔxͱ329vzS0ޜ4!+W2ct֕ ֭,Y o6MT>㙞,%fo;;{)aTiF6lPW7mmHּzkK=eoNΓy~o>boRO?,ZA8EGG JR1O ]v6%%aY?m#;vdHR 7O^m]4(D7 173\;9@ܚp2 DߩSg6t0E  Kw#xԓ W)祏sCBpttx"ܿYCgZ}ނ^hӜԯ[k'>oPp!*V(30N͚ZȝjDwh3lmm MZF#=QQQ$&&grMhXJ ΤMȈʕ+,Yzj˜#9P7'\=y_8rV͚7%Kѭ{T[[V45XΐY!!!PTirBA%x ###+wȒ婻vܹ1|&Dԭ;NNτǏӨal 3\393m>X=zL޼y*5ۗAsA@epswE['o(Ujr]]!B!9WoE?YfS3]n<6[KqsIF\'wprNb(qqu޼=LJk7nҹc4ӆ V-[ӣǏE&Uh LǛܼ}%NT4( ],XA3@&=&..͚kܰ&&:(11I;uh||>qus޼ьK>O7M{6O:Om\nѼ)!f$:wJE.Wg/\θ6I:/Ӝ祓 5k8P*h(UM5ѣiF{ȈM󾟬dT(_x=!!WWw6oێ1E&!!{X*~~i^>m8o;[[:odܹsR%KPG/o^ښŋj98hnMu[hJݶn݊ӧMM.Uʕ*+-Z4i7o>j֨{K899_166xb(4#M>`yݍp;-xXѢY}x&svqJJ:#PNT4v=jIS_ԛ6}]rJE/Ж) ڴ'Ou= qy>>v)Yl)UWi9TeK177ׯ(lm^ ;O^`DDDȘ8>@Rtf?)]tB!B!9i(#?It/?w؛ X|<)K|v7 ,c,]ϞɅx%E͉ԙwOÛZ\\lg!,i>/]"6NVo6_pڵ 9x0-7% ~={)ŊSH%CeȇmO111!v_k)R0SO.]},ڶHxD~x{?А]R]/X`lNDD۵D̚3_8lΈaCX<.]Ll\U&quuOM_bnn |F e՚LM%ݻء`zoвyS/^Ȟ}yS-Bj|;-弼͚6FRiC>OgDDDPݱw~Ώ#V^˸#u*:}??_r岤H IDATc54nȏ5}b[Y|4ajjJ_fsO/~^>{P-@2h 9~MѼi]?tޅp?y rbV.[CGy5ʖАKLr:=G?|$}#|Ѳ?ϛÎ]{ڊ|j""#x gٵOlm=r*ջ/Hcgwb̨XY[5kбC;:B@;/aoعm+GWXZZQVMZlo[իVz vރ)C|R[e ZK닅}!,, JnЗڽ޽z2{Bx L)k 'sn"#"3\zʹlт_/cmX[[3zHx)emܹYn-Ge֭˗,IP~}ʕ $((I#}طo?C'mӆ1~$cVF >>zҖݾ}CRё/_Ѿm,MbbbXz5&Mdei.rZE[wnۺ5Qx{{1EL2x񂰤7nޤct7w7"#055%o<(q/_bxIɒ%)_\]͛7ԩ#;uٙHȓ7//g†Z5kRzuvEDD$ }۶\xOL!B! !%ܩ?PW,_wt2u:ŴSHLTWhhN[4iҘfM`hϟ׮gM2}ӵs'ƌB׏M[kwt9ILL,&NW}ܩy&**/^pbcx{nnjʳg>LnwRH۲mtО֭ZɹM:k'ŋc)r%nq1鉕!t՗PNC3zPMYs s<=rr'Oң[Ww鄵511Sj1+%a;F`P giKн{w7o%AA\zu7=Z2s<Qc$GddgΜa _Q}Gb̞qJ.^/Й‚ŋch?@o4K\q&h/]FXx8ݺtonj1udV^3ՍK1wl,,,8wlKŕK StMJ(AJ@XX8wNyL^= "##y8 ז!^B!B!2 ~0pww700(UA@@0**JR-,,M3BKV[jCխS7Sֳի[Wadl_ekcMPpk~, zs5y { g9e/awO]\quɛʕ+R͛clo3kӊ{WgW =Ȋk9x~qx/ڶo'ӱsWBB>|ɊOU@T8ݸItHMW!B!Ӑ Vf B "T*UkllW(rR)ļy󪼼VVVy+U5kVQ7@xjG6J]{ҫWZ}Bٱs/FiIB̫UvOӐ2f0kwB!B!9'P̑[WeTjoIbmV`hdBTBdG!ȼYg92klB!B!9ݧPg{#|[P0/7s1^yB!@i!B!B|J=e!({B!B!B!B>ɀ:ޟB!B!B!B}S|916iH㞑CB!B!B!DIQQQ͓.o޼DEFVWHHHĄ8R355%!!!$AB!B!B!rO2vswrŊ*UB꣋CwXYYaiKKLL$4,2Q$^Я_˸JsT~_!"[EGGQ ٤@DGG!B!Be9'P.nn$&10{JPWP( Q)f ,´H*!T~Dn! 8Bd(S$*TЯBd(z>/NCW!B!"sO4 VN{N U"[fKh.DN 8Bd/J'BHW!B!B>ـZdNN ͅB!B!B!] !B!B!B! B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bl!B!B!B!Bla_XZc9b=!B!B!B!HEG_cr:B-%_U,*hs⏮]iVDaع?Gv~Sk[8'|l*6- Ș~'* { @-i?s޷.q P\Jm͵_^L2(]%|mPa+M_ psFCf@2N.>+JL`UYfa/W@R|d;Q!A)I؛Wۥߜ<%͘Y|douۂŹfqDfx^;uu)Uϊ}ߗv_jtg'rj_GfB!B!B!9N5&,_F`fmOF_NLA*NSnS6#|l8\N ϫM25 b?CR ,N#w mHLxv*w! Ccc^W9:4[S8 ~9M.o<=tԏencGɺp>CN'Un``@Zyq*/w xԾLӕZv6NGP@жZtƾXiLy{6qMdةNs~4mw@y)o4 5JX/LTHlށ?m슖b'86w,+פBX"3LIBR}F,ljUo@LX0׷ǙC |ǗOpEz[i}f)3#L8H{ y5{ 2O9`])Z.5"_ʘYGpc*hOX+А%qׅۄbή_f[B!B!B!j%t8| =.7eXm( ض5 { 8{L(ۨ5LaȎ(#M6/غ\RSo,w-[u#&,ge ~Ctp5 $'/]nVpfy \\ݸT͛ל-:Ibu򕩄Ba#'4 w ]^!KMp;f7 X%9dݦx8υsӶ5eE!9l )}-Sgg= 1RV[@|lO #T=nn_ oj@jFͤJ/nR eti Pptqi(eq9 p܏'M"uG`acu`6(4@3YMPVͅU|C*500Լ)Y@OLX(K٠ڹWC^?ۻ}2-<{B!B!B!H߿.ojS#'m9Ofp;k׻8>5h:q"޼N3ZXޕ2K[Du<[uԆFƔo3njN.L-EEu<8l\Lo߈ isן-\/&L s{'Ovbv]bBSous*ѡFQn46^Q3aS( m`$ymJ=M UEϻhx_JLD,3m@3*jڱ[kSѡA[ԣ#޽g/j$@B^xL%N HD>NYV[tTSwJi'ӆy:d&ـPA+Y:m_8Fñ[;{թM kl7 WE:M)^FͤrԛDe4)YA> _Dg) FF)uL,h4d e+SuvǮp EJX F=voQ^L-wιJ榖+ڟ߼Fee{Nu<接@9B}uV:Ubr䕖ZT2;{7PVc.ם}TM=+R:M@UglL슖4TU* sgj6s;ש+Y?PGEm j%NN(틕`Tn-U+ڶ'U}S6E2w~~ӗ0rc `^ħs1BzeToJ#gWp !.GQI[JrUYsږqz4 6-B!B!B!Ń/[Q%&WeoJ8\On1n8_>$Sl  =r/@lٌX clfAl汢Â}-;s{hۚuC-΢df\X7OOq9c_ 065#_>X6zq}>ܾH~c ,2Џ`T2GNju"M3xoB!B!B!!/5Oˋ7@QzuvdـL'nݒT4\9űc ݴZh_3-K~ci7ё<<7(߼蜱4u@l'2(Bgᆪ>7@B J((@TTPQU< +vA@z%N $gCn2b}֚Ŝr9ؖ|ӽŤ3t|2=%"""""""""""""Y>{$["""""""""""""u !]y%e+ca9.{HDDDDDDDDDDDDDR.%?=nH uQ7?sn=$\ j}! e]=$'\{PC j9/Ԡ߃\jfg}u/{p5/\o ,VnL[?LeCg[/PB]~˞*1: xf;ܞ4c{۽؞sH 3غ voո;waꆧ 8zh3߾eQZJ3o:6y椓O=!xy6rIO4]?Wy9Z{HDDDDDDDDDDDDDJ5/qhqh*TkEb&V5Rj5G7S*9iڿXp;?Pn.f~5@`8k=}RVDNhD^?+>a=+] NZ;| 4r"""""""""""""rnA} i`,lB3֌nf׌^;ٺ+V{ _@*GtڧlPqSϯ#7'^rJL?LDzlPGTɑ.HY,Viݞ%ϙɾs sϠ._9c9݃o"""""""""""""r1PrS p4>SWgI \V, e&)a;%+=X*,r۽mk5# ;<R9-$&lؑ4R;Lw3K3'EDDDDDDDDDDDDQғHMEP%)|hrBԠn;؀eph ׹j#bC+KL?sYd?D/Uj]ǵ}d뚯̴#l^5&ЪTَo}ITjk٭*Ӿ$|3:rp=5bg1qQNW6X5"?/mOt9 WӪC+Z//_)f;u5ejO_DDDDDDDDDDDDDszЪ3\xy0ٳ=.Jzl/?LQf,]7meer/Ѵa,S<γ)Qqj37+9zxG]Qy,I Mڏ`W%uZ_uq {w/ ~øqX#11HKK3DWFFr8N_pbfxZv[c'~L{2,fK-:ٓW ))T4I-߫aɆa\ '733p8AAAHݻ͐322Ҍ1'L`ϧ%EDDDDDDDDDDDDDPZDDDDDDDDDDDDDD΋Kj6]c^IVD{*Oȶ_%B=8Y>%{XDDDDDDDDDDDDD.Tzo7ho9/.>>]K|{HDDDDDDDDDDDDDDJA=)w=$"""""""""""""rj y`#`2!9ރZDDDDDDDDDDDDDD.jPya4=n%Z Sٿr)}6ujv$$nf `÷_S _iJ?aN$eOW~!hr }ߙNkk+RqU?'f_i A7:Kwi,N^v#K}5}ٿV:Wͺ>edz"9mZZ A-%AS##{oZ=-""""""""""""rNA}4;Y>,~kWUj6'az*4h؍l)i2&}<Ŗ9wԠ>zc)kyJӖ'Hݞ VY+?۪x#>5;owlNVJ5vxyn I/߳q[5C\Ɩfo/Kpd$Gp(v#Q:rD^YgvgW'mav#kD@=>`tM ,ǡk6W|q u,r^NGT&̦_!\=Q^k^:BF [{qV!{x9m>eK㭱_H)6?,wطl1a/[ wz#GwgSoAXcGIKWmފmAt|b<3?Ζ_EDDDDDDDDDDD ivkty-} /`Sݥ'Mo?{ C82x|u]jA Z ꠲k;r8zZG=Aڕp>'8=_}Aʁ}~~8j5#GoA|н0MKVW^,-_eڤfFڑ}3a3$7#܌tky)m}([+oKػtW᪻gFp`rV|׍Ht8=ϋjvǽ_Ԛw"KӰ-,~{#pd[,? 4سhSi:<4}ώ\ظ{mDxwXDvIq4Mm@uTu<Ʃq(+ob9]TGgofZpPV+^:]}È%,j-[X:Ҫ/{,SrnF:'f@lҲ tS67H޻[?@fMx#6T]˽KK+ݿrV-;NZ^~\ijl""""""""""""SOon]Ww{)['HeVt/@nzAe"8NM!n*m/- akN汣soXKdX–JG竻wY];\=W\< x+;%c{vӣ)p<*vc_}8p=6㹨B wb\wV|v ^{ |Ni_udܝ=EDDDDDDDDDDDҥ% QJVm޾Tn҂#J ^#c?}O}9 Bݥ'>)cͰQDD_cϜIuy'5+~jrsicTjԌ y4WOFfWqSQM{Z A~>j͟"WԦ۟PnDHDbD""""""""""""r c8{' ~qffo=ŪirԺ5ntm46oeVBhVA<ϣ2:rjD`owl1lۏOѥSLE^'>OC<ĺHXjֹYg}#h7r ;wh#Vٖch#Կ?qkWR;;Ϻ>eK!i}ô~D|Y?7nKOrp?[4nV~+ |f4mN0 wnhEf{?_~AwPW_j,}{\NZ;ƽi޲oQg񇯈jw =<גvȥ80n8#66HLL4Ҍ(#11땑p\>>Nw8Ai|VLǩMҴ%~ġ؍ \j$""${Rq<'^a$r2lLprss###]w6CBBH3&&Ɯ0ai?B j9/.=o"//{؃3+ {$ |#Z=|/.g=!5'XMjSi9{$bUlTzք'a9^0$y^x1{ϙtZ[DDDDDDDDDDDDDD΋Ah\PcEPu6! n*p7V&iz#2!9ރZDDDDDDDDDDDDDD.jPyu7MnAhh{괼|2}hOXeաM#JrW6c֣YG%-o,]gtgaE×5:oK_/jM/Qs.{SDDDDDDDDDDDJ˺AB eO]RTIxyqXR%W#;d%FhhЏ5?iOiVjM.)bPut`.{SDDDDDDDDDDDJ˺A-%[38Ғ0MӞ.1w{6qt{ T݆S")Lodžߦs{.,d5.݀nGIOv GxHD%n2ͳ>!uO'aqf3IڻNǟ&a߰Pwֶj4j7g8RMZ<[!!vK?#5g,;`y4Va^f[q諺?(5;cYєR|g6/`/QHéѢ aeL9¾UX?kQ.ޕ3YX(Ґ ffr#N{ٯt~*$%n=m9׬8 ?Bvc_$e7> g3pSOWE?e} \넖ʲ^1R gV{}o՛^op8)q;XmZlb2u '3̚sJ7 P 1GڳBݛ"""""""""""R2]r jP:Fy}&&YɪחY;+/XX6. 7;ݪ ,E>ysaeh{?-Ӓ=YqX[+G ?Ka|c{{=g姵`xSEZ |3BW縯IOc'w:i~<>މ<'f͌qھ#N*Ĵ }OjN\uFwmIjuں9o' 41UkA{^dorto,W7 /_=9Xҏ Uw:wOUj #;-RѬ(Y:^85JWNi߇)U iqVMqrV6v7 cڹ~cF6sN_uD^n6 %/' \[TnЖPEg^фY\ U6!fgil'v{C^N&%f#{^ٱV:q38 ts~'O/\I_*]_'F$moTo'>v7.L:4q5x󬏭c.?4z ePvK8;? {3鷢+IO MصGnX@xk+yʿSq k|߽@%Mí5ɼw д#&j83칐L\;i916]Oj|WjuH=jN\Hs`/߇ÖLwܙANvyv&>~AEΚu[spDJ.To4](zO|MBR6u]gRkv&5pxjppB+WT5Yi 0p/2PHeiK`X9r2pS'J;FPXY{fQ 0ZZ.rvE*C .XB>0IivZ՜X )t+T5 a{ZJ南9Zcid;d gV&&Ln: ,ZzVT gxbS C­{;+ >#o^#qFΦ yoHt5Rm]41vL?,^_ 9iS_3a{&z/mZLƱEcV\%E`n@ή5dNly1:ݒU|uËrW4]xR(]G/0c|u7 ٙ_3Nȳ-[y'jL崺i8ys to ._O|*$d)81?8 ڱpl_6l_N=>.L ,lm=Md'9;~?ST@ˁc%5a?~i)g*[ 7EDDDDDDDDDD.Mǿnʶ3Wa.6fJn a9m;|O@h,Pw3UhT>¡ա3\NKjuOpDE{2S)]ͽT]n{ӽKQH(:58"m?`+CJfjEA>yvl^dm{6PV3 _3q+y !TkzȆakZh$5Rvx{ןPl3)Y]yWiqdP~نBS/Cw)~JB~NIԄ=x'zP5㤽fDT+IPl+RG`X=\j>r3>u] @ϗ[8ÿZ눹6N{yW4A{QRMKAiXTc{rnEjkwTӂ+z$>v dqu:$f#B+F{4,Z4J^J}iOpb?Ȩ жyW|'+Rn+: ?|N}Φ '>=9uJu[ݺmz<@C^ TZ4=]F%B "isxBVJ"Q;HX(Z x3FUqᕮ b4Ɖח}M{^ITnЎnYtSG|Pg[~_LQV\%'r#dodKG~#O!}W{g-oynOLן??e'?^VwgL9ºߢVfoӸꖧÛ=+`ӰP{)cn7sΞq|I;@Ʊc{#MW^=l9s~9i{ 8^kv -_FOcoYn"k\{X΂SOå"^=,"""""""""""rVij9/.ʤ@{HDDDDDDDDDDDDDR.%! n0FE۠L{XDDDDDDDDDDDDD{WS""""""""""""""r^A-""""""""""""""""""""""""""""r^\ R0h{pl 3%W:gϔlMؾz#W0}>#DŽ0zxd>EDDDDDDDDDDDD.;w:$cQ%Ũsq67nuM{\״T{䈎~0|Þ|}qenPKɖ qqiڳ%qݰilbO`c=elP7mp^cF?zYicwzpg[uF~cS,gbi/ʈAC{S@Jܯa38V7]`,]uZwb|<С8lw7%x՚ٹU@+0y}6l4Z0ߴ)-0n08,]ߧ=e)5U0cf+Wxu2FD 186ǺObԫcj0<{`g_Iy=#""""""""""""rٸԡ8ļ^̟¨T*1ҽtc_(U 9b`9^G9oUgT㫯1*V| ̇ Džի1qJqw Za|Y>'7 Q:#af6^^u8>c@?ügĨ 077̱cOm4k+Wzի!?m;{JDDDDDDDDDDDDm\j^~֭sǖ.IOw? =^FƸy`>'Ͳ>oիa>1,hGBѣ'‚ ם[Ɔu0oF^oU+NX/~itdgcw/deaж-4;w&Mp  ͱ7z^Ѱ!aΘ{ڭQcχOw/4jdψ\6.ƾXۗ:u0+lNE*lו51ޞ`>n[ډyF:fzyf֜Mlp޵ bvp5_sDžyUyʦL ,+f.\x"[CZGs(N ƇO?ke˳gN| lY{TDDDDDDDDDDDDq5ͤ$\AzƋ/ᘿGrfҿe8v3h HL).x_WXtgȃZByC @@ߝv?BK1 g`4l 0lO{S-""""""""""""rX ׽C7ic)jw򌌤D]3Ryy`xƌ@@qbΙ9m=CS'Ν1/ XQtFxZFXEfo'hѲXˤ3gb>2#!cH%!6^)P*=PY"""""""""""""s4%χ+0""3bj3ԍ]ss,T Fvn}W*IJˆux-i' <\^}طϽwǡC+bL|0/S^GOg a0ƍЬ3ڵ;`%K!$QT{ksWvv?FD=sj5L]z k:bM1Zĸ&A0-ӳ65%pAh4 3K+F9M'btnx8]WtjB ={Axۢm6pp{Fxt4gm:T㣏{6m0݌нǔ!>sdΆQ#1 c=ֹ2xcD8Ec@1ltѩwUraMb\{FMm`Ѣº?~5k0^qmb7\XW3רGJO>ebZ^קbTaj=%""""""""""""rٸƾ91Fœ?s#Rѣ1q|)g iiwQ5p,\㽩 Ȝ=i8| ǟsQ̏?`ۇp8mڅoa;810fL GF3}͛1_Hkde1&o1j͛1nRƘ1K|$/݃0? c@w>֬:;0_yk;zy?ߞl'ƍgFZZe$&&:|}}222.'00t#44Ӳ =c: dhv=,rnx1\Wgã?g&$BCZ- ]QmmubYZAH^!$${2 yPVRPPPj6KKJJAAA6___[PPcǎ^zf:7Zb͛-#7S)[fS"""""""""""""e+3CWEW؞3 ~1*>8~1tEq5Dwؾ'ҥƐYl_Gˮ8]R@-"""""""""""""r9*Ru1[3W,M-"""""""""""""";c1$""""""""""""""+@ *R\I[gC""""""""""""""܎|û `cEDDDDDDDDDDDDDg6DDDDDDDDDDDDDDD.EDDDDDDDDDDDDDPZDDDDDDDDDDDDDD.?tKA˜:-Wx1bm1?/_)CQTg#L}l1|^]مذ==݇1U'o^\gm"F2ѕyaxxcטZ?IӾ،pדxS""""""""""R@=>4.es gӪw)B]مTQsuu7ˇ}`ڏӵya[bard+f?H<1^cJDDDDDDDDDDW*; @qa!#"UxDps$nbJ F&M[cض#Rc+8߈^ʮM_6j>G?KYi{k>=geVWZ IDAT0a{`65^#;# Ɗ9coo@c:7]Zhw:>;Wꛧ\5ăyifYi٩;ڜɡ ":]-""""""""""Rչg=>)G軇A7rٳm.^C&NU?URhaeُӀc^pš`5ϳsӗg,ND6#YCFG?pxJ"9>ܽY诎v&)~#+=Cii1vi뾧-EDMbϲbsNm{x3֏9ƒˠ36p_ֵa-)"Y7\ %]nlNxJ {kY1: r&K)l^Ǔc>6ᣜ}Z:vD=PBa~P737/V.xNߡlAEf֊fU(̜@iEᰠb7huw~ENV2w1֏1X&`RyNo&E/f&J0RRQ2:};g;|P߼}͓Ц]YB)oV27sxJG&%G6UsAqf˚8~t'Iڔ;! 3J.,=d.nD~o*I#ӻ>ݯgS\ @l6ĭlq=G>ŲOȘ>&acևO3+ǾܰVф̈́6F.j,dO;Okv}+vȖp4~#XSK.4kӟnhf 9٩vs*$Յl& +#-$o$q'F66=BWQA&y٩㯪^V^ϧQXx.=۾eXN.6 7+4lvuFꛧ\ Ӏ^WGaA&W{ogN"?#_XZuj HUs% qkY?®_r<9j԰Y@UZ8:1M,1|1\k eoGs[l؞-kJƩ:t@V}طU™'YR=1p:!M:dcS]j ŗC-//#)~#MZՃ[\ųq{0i$'nng%EXg/Z]yӸeoQΙvV9Orýs4KobTTŮ_kW4iKǮ?qziDggyafU^(rUyg:5 2\7kOzy݉VO4@a~1Rn~HR y't0!׾7HMnl~F;A*x<<|{mK=,^;ڜIX(]Fȫ:cIw ŅN"vmY<'失ndgimFy5@QWXXQVRٻ_-.5Lqf^ʱLAfsQ烧?mGҪ0ŕlѫy9HH6Z׉Ʉ⇻W7 %y`+7(7/T<rk!cyWߔ2[).aǘ4kzDOgq*W*ţ󭈈-u@ م&]tͳ9 i,0]h3+,rU..NMcqx6[c3l|;s"%׀=t|B;:,~NR\LvXx0)dguݝUej Pb%kY _3FMFIqbc^)qv6yj0Vm'e%Nۭ:uaMQOi\za<א#qkY:$ĭV^qp>o^YUQae^> 08+In5_OKů~3BHH*- $Bw64nޓn 5*G`Z 3NiNSn-#~ru2v]Ƃb^(VneټO=7hF=FX}+')ذӶ'Ӵ޾5 wlVnV E7r~Bª)XS|lY>sýs^W+8;ڼO*^iI7NNFY針rN 媱/ۆY}2dkcōw|m.Cs8 WX>L}M̊46dSߴX}3ٜfߵ+0晸o#Wɯ~)EDDDDDDDDDnsӾ8š}ts Go6uhqay9LjLH˧#g1pxzק~pz S{pָy})''3xF3VkY }=Bhn4T\ٱ37ɠk^it=n`).X C2&b$Ew zudg$vhy,mGgwru[4oMȫNc3# %m;]W&֢S-Xˊ=W7 1bN;X_"_G5.26u(.eצfft#Ǔwa/TՕlj>U8q!0-ݴ1nGMV}67Eͮ)l\6eE,MZ[ߩ.dWſFe<}t7/m:@A^:aY7s{˷6vO 9YɸY8y"ktUu"9a1,""""""""""uTzW쓉[=Oxz7 񗷍MX6)xS>߰zw3p3 sضC}N.c,)zy,? ǚ6}&f:vOaIM+_gb=媱/6New= dИIMI^1c&g5_d$vq͍:7 ;ʀO`KعKLsNfo "{DAIvot7u~'wwO\sivi5ǓwsSmf+ge|af}t#In1LZr ?@`hp2Vk)ilZ6z#[8vtx܋M}͸E4oͺ%77/q\5rR1p:W}tȲbW6~v7{:b""""""""""R* {L-[.r7///Rwb6m6f -7\Rd ;p;r nԑw'fXYD.+o3[8vt1-W#I|3s1%"""""""""R'|rHz}U~Z\ƙLLɔ[^^RookPPPy||dر^΍KH$+=O [H]TWffandrxm"g?nLHw>dxp뗽il&"Y]WMǨz`-+6 ߈+͑5Ɣa*PY5o;Ìj/i_O/1-"o`˪ư\ARcIK5EDDDDDDDDDSZ**2ES+Ɛ\)?[c e.PZd \r]֣1wEƊ^ZDDDDDDDDDDDDDD*PE\*P&L汝qxSŅLSٷacXDDDDDDDDDDDDDR7/v~1M)wbL\4*PoF̏sS$lXGtp1%"""""""""""""rԩ]V1pưCռ!~Vgֽ1wkݽl '&e8qJ*bGCGɹܢssH?x)nm =CpcL\pu@s;=lV^NACNN"-n? #;s;~ai;l$k'۾%]{zqOj`Mq^.@aمѯA}[8y(ΑߢǺ O@qEϞ~|oL]hfSNNTC;uQZDDDDDDDDDDDDD.:5soqAָZ,'B;HAI zs[Cp]lX(Nȗ_c8dbI7Qa(NqCxQi WSf'(Ę(Wb`q))'43 C9&Q=1ى߶ @QVV՛S7O/ssr'9mפ~ݾ?(v* S0L70ӹМwaZRb WSnR^VØ(Tj%u.Fv}K~фGމc$&9nojTnC̽1g? ?>f PXQ ɔ9╲SCEYX|3qͭZ\DDDDDDDDDDDDDbSS|}ЈN4ݏuk_.oߟ;8g7-GW)-Gs"v/eeN*$?8_yF1n#yMqP?kq8_&p5""""""""""""""BA s;M';(G8v }\ǺG[^wދt56XC{ß(/Y`u-_BJˁ)'pdz 23)΍.]9m6 []ia!_{寽dLU3>Ɛ]sgk,Xq^.ONqÇ{6p 238tcƳoQͅnπ'6DDDDDDDDDDDDDD.:7hoӤgu0~TNeƔEuxY,}l61%"""""""""""""rԹ)bd 9l'ƐE""""""""""""""rQ@-""""""""""""""]e e^[Ɛ\[C""""""""""""""܎.|û `cEDDDDDDDDDDDDDwEA-""""""""""""""WEDDDDDDDDDDDDDPZDDDDDDDDDDDDDD.?Di<6SŘaNBt9zkn0'g415cw6cc"]1|Qu&cn|>:өwxWx~9õխcxoؘhrl֘rhi4}t՘hں1вUt,?g,"u&xX1ڿ0_:&9>f|=xt1\?DDDDDDDD=|5|5ӗ~A.:OQA1LNV1|-Yx6~ߘS8x^>ݥg}#6~S76#bv#$,)̴xzD?=&@Qa6K3d27 }ؘ5=~TSɴCưFPH;zFߍ1%t糰fQ7dcqxXNr7aHIɂdÊw[ȮGhܲYrd;f?v;s-k>k[ 23@DDDDDDDNZVBNV*9Ymƴ\d~p;2V n wy'J\@Xrh.>B:ǘl7q$~sv􈾋Ғ5fw_㈾b%(-M[4~V@s}.s̴!RKL2k #`#0-Ƒ̧ A:bvqhVmsܓ]ðNߵ=H<ߢ 9LϿRb& 3s1夶""""""""@]оz  %&nRc\\-'Zw9IlY v/r nԑ˜O lYqWt"z\ ְjk4K@PKyfQͮ$'le7>fQxX|MP /?5fql?6}Yx4 zԓ4kݗ|vlѮ&m‡X4h։x'1ϫ&]x떽Ŏ _Tiq=_>EF"ig2ٴj&w w>Mgϝn?/)Mg;jځq\*@ iCYIcWv?(+-2fLl[OUFgMj[}ԧf y |aNŬnDj,G6 ǒ~[O9>1\5yZUW} IDAT/%~GK[v-(KgomW{wU~+`?>G=IR^HDo0yi,$'Rjξz=~t7?  D2vЩ]n}FIM)WUnv*A ;5:93=YJ.cٸr&6[1 3@DDDDDDDD`:YCǽȁ݋Ygšvf 2gwLm(kY1b16?ͺ͊_ۻ?̐qϳnjMȿ~S)9YXeD [&{:'/V-|L4QNmzo"&~~` ~O\QѮ#&F6Z:%<0rRm01|iwX 4;7sP9 &7dtʊy/c]  [9NIq:|S/ ,#{Fጽ]bjktጘWƮ`O!faټ rv_{& cY'mC:="~_]mSY2Iҏѹ獌|p=icYh>n iIfZaey?O}_EQfY>F7wo,Y]\?Q6IiqθZV smS/M#'36#ƷJO0}Vfr,yWɂ}]rGYi!&ʈI`g1QФUo]Ht],\{ۇLW)+-{\{|u5.`22_Tg:vώs4a !a %%1ʽ]m+~| W7ZuFa7PZb!DAa) Afo)++ϐo޺?% XurshԬWSm_f+A6r$iSUcc$hw,i?|zGskms= ZNwLϿGӭ6l􃊪j """"""""u@o 9Y),,l$\_f0Ѧ#ZwU9F9!mdvc)KF'lFfC5h:6[9;1rxJ S\@̅U'& wbgM);سfKK򱖗x1<$,fQ,"*:yehy6b!{eӪ>{o,a #;3Va-+U;E0wٷg &g/.e7زC2ڨTfPn-cזYxy7G]߽ă9͝-IHWͤm(?^w@ȑlVbfNūna'ȩōQ @txctg⡍xz5MfR\lL&3kx2Y4=۝ՙt| A 1M؟[`H[zʲyn>lv!(~jLخ(~(aͣԚmk?{i9q.*-u:\e ;1JK݇d;W%vC1 Y3w-`ydMiBq[ApfO8~t7Iф%Nϧ=.gy'(.>˱n2~[o`u÷^H?vt(PӢ]4;7}븛6Q?i4񣻘B"Ov}jص/ӸEO~?9QlZ5xzc]5xϤ6烂 輜c=OLf6oGqq/:yG/~ gJ>FDMY9Ne9 9) "{L/ L~ſ dŧנ),⪱7{ΡJ?f/J7ly53@DDDDDDDDԁ!Hxp}xh= c#o2Nr& Tiuv[HzGq3 m_e-l<Gd6L- i@R/i;O;/Gbl9r.>5] Y[m>"Zu戵 k)-)8 lؖGQa..q- vL[)9a &N󥤤l6DžUiInUr,9Ԇ=5]JvVc(kI`v4;]S;\*;3kY>DCkhlRk9Ϊg9OQ_iL]RiO}VU|9~سqqui{p`GFᔕ9M\A;b/AwI`29t4a~ wɅ:T9;þtI>=?1~i?jB+sleH2Ц]01~(.Ni^x3_q/Sɗ0^q|8q|v=󯪰 l6})'g :wSU%_ /dc2uƢjM ?OO?ڄ6Jn p֣4^ 0?M'fƦgd vϸo늒i3mrLU.6qxjڄg߄mټ#Gs=E?>vEQOxֻ^1t~T\9.Wn|:Ҿϩ~mc„5N[lp`UWzNڰʫB s9~号w >\0](+|>^43J9S)rŝrk!{nYf-L͂ذQVZwu4%d{2EܽL?/?ũhZ9 [}Bdvs,g=4mهVӦ0Nsaйρy4hFJz }(.:GgōO-w`9[6{gWɅT`ՑshkQcd$tx3I7֢'C ~x#O?,^~xzѴUo|v'E9,~FؼC|~Slsyr+2\9gչuaAnN1PXrNczfr+%&W\FEXӅW#9oxMh>|\8t(}ܜc|IH;fbY7&lz3*X< }qTu]݊/׏u<=c޿؝?ɱFda^ [;x,W\зx9=*gբZ*pwPVvdz Hg?6::|>(h5zXwsybG.`,jֺ?\C(?՞k9LفBh IFL+s8#:yci>h7k?qjS\ӹρUs~! Y ,OJ!Rn ӲιΗO^VgC+\7 !/ԏ V.x^&.f1Y sakN;u+bGHNFY渏Jg:¹=W7 ..n~ at}=_Rl3$,iD^oֺ/'s\,]ej65N]?cUf#}mʪ +%Lpd$Wȓs~k? zGeWRz{N[/@|0rmH»h2#wOHHc겗xh=E986È(g*/znZ9̴ÌWǨx riԦq@Q/8wquQհmaK Sde$a|h,_?3 >:]T6LrSiںSy뾔[˜fA^Ӵ.4hخI˧Ud8-@Ma--^ff}ց#7j폶j8t76~7dL017k9;^̨ ?zߺͫ?VȬx>œ5[IINo nP`V\d)48Ϊg@ :_Pci~n^ŜD\,4ji@PvՖ7{-?/U?СXG.84eq.[Fm_UPh{{Zs~ v=@hӮTPRǒ9OҸywG?ɮ<6MZvnצoI817;8rNwt./ `.}&g C5p)ҩ ۹FͺҾ5NmrR8iE6,]A^:'Oѩ ;;}=Ƴrk)WO~mk?;>Wϡ+kI:4 N:&ܴ}_:ms(.ׯ#nϲjÇq] LBT)gr\UtuQHIIJvFr+'Rc9C$'3|3\L?|p0v9֊BFG1h Ǐ6+o`\\NlؑbZڲZK9o%{\o 떿픯qfdg/0V-+6[9ka׾ Rf-~` Zwby]}dXpwS\ZM&Ǿ(.]#uM~~5 o~a-+?g|meV Zơ_8 ~tz-^l2p]O<k}NرK|AW?CU4 'ul7&|;$78=]46[9?%%44^dlJrf"&Х-݉Qm'1~Gl_9xzקQ(J XNFc(;ɚ%o8j돶j+9q;aχƑ1줶ٰQ$釪MlM_G rI#ܨ#q{4o;n9ܬ|BFR_吗snH(\ *F68Tπ𨉴 ;sݹrum?T.Pyn,jYJ!2`#K64^qˈ:۩mUq{Ѣm4G>Aʑdg%3-=`Ԓc1z԰!M"{wsF=df+ilM4|?JBiy .I|s~yn\ϡ}XMr2Sps $>BH;:C}+qs"'+W7 )I;kwshU} Gvej """"""""u@_G0'DZmݧ||oCts+K=3X>jS.Cǽ1WJO`Ƿ{}Dz77 99e~'S?"N$0goE3ٻt3D~bs{NҵO@`3vTD o&\m,cqdq4~1](#VCpp- p`"rvFf+';( q?@Dm.`džnٿr7q=Enf2 g?AF!c3r|wL&>ysy/fiLvIq?~G^D~n:~cr+ص[0A7бX 2ؾK6zϩ5אko\vnͧ~o#qG=>15h:O˻KazHNjmց%޾T'{C<ŕcƔ=:Gq{ҼvvF"V+ߋw} 2I[ƕZ0qu{,]mUvьWXDj,>)WHMIh.5.QZRȼ/G4)f3S2{V-|Ц]6U~:gᆪ*)KBw"HJWOED"(!B% fd޴ ""9-{L}hؿjЗƒLTh 6:Sj5JeʡqhgӷGh? c4eQЂ|Q`nx0h&b"|r-UjKOزz(}A|l(یC9$'Fr2w͡S7'/ԆdWֆr;}B!B! ̛7&& &+W6PYXX&%%ZyFF`Rl첲J$fVi~S&};3뾆!UBC^F5ϖ{4_V *tzQQ4&*SFMí+slaQ:!,Rt9. c(Ua}=k88ws cڳm1oe]1hc!B!B/pJ*Edd0FO@ſҴIIVMRӓ3T*U6===Q{޽,;;,GGǬZje-X KgBB(WJpoU5_iXZS~]Řc6h1 K[ ELd >7Ӡe/5)e*4ӞmC9fÉ qe^Q!B!BN-/}[+3sc6w~슗±Qf婠cZZ|"~1H.Z ajsz`!^FYL,iLPA?mha矒} +׋zEB!B!$@-^Hfer.*3 teue2c5;wl (*WY2Y|v5VD>pԔx.\L˒#|r2_CL &>~ x#/oa5)=' -= YB!B!x!"2Y@؞$QfB!B!BZChB!B!B!Bg_kLB!B!B!BWO>seB!B!B!BԿ:@ !B!B!B!^R7e{2?_ᕥLB!B!B!BWA-B!B!B!CB!B!B!B! P !B!B!B!x.jږ-QdeVLx,SfКGn}YmK*sÌUS&_ IDATHY@FQr3e_Vr3fHhlfW&([Zlޙi3TUץރ 3yXZ+TfG&NލZ=S9+*qOӆ9:UyqyޟjU&YF_(1=zc̄_ﻔ͌R2wO!ÿWfT*mA,Ҫ[dgCOVIaIMcYaki3[pkvt5I0uQ\Zm,ԳB!B!u-[`EMT}exx\ʺU;ʬ<5h<*_ aެ[5u~.ZHD<7H/J}kPn/,- .yf^7Hϋ9NdjҔ٤qumODNNUij,fʬN\”a ֭@ ʬv^XYsA#kv2H(WZiEmk?FMbczjE2Kg<έ8}jh3slӶ4^Ѐc~ޝJe,ԳB!B!?/᱇_~L/$HHTfh4DžFVVsZNܸKFN3ejN6l%.ekcb)᱇zn}ݕSq~e 8:U :|h GL/x]ۘz.5׭_תmڷ88MqCcI\m j\&))y}E2k`jjƉt [0|Ln{1_񕤤)L=3B!B!{KLzjNPL ʥ_=dm~|W?v^RvѕPNZMWp)SBCo+ʕOb.]%!>\L L?aFF*˗vT]Vm'k,ڴL刎 σ(MWV/"33Cmeז?6oKx/Ŋ<ʌۜ:aLLTt!do51QѰ3IIQ\W(`zѩ˻v(۽+M[ܪ훸VmU1"sJ.쫰z0uQ.]s?^ʌm[ \a?7h8X?jT=6KRևyױ-EXyO` ޅn:ȹ3>ݔ}nm~!< ;@jmi~2ysϯkPާ֋xs#[~H]t<2ekDES :w{ym2[[_] --IFXmCx^}PTfGLx6=TP{fLjff=ܼSV &؇Tc~Mz,﹩9-ZzNؔ$-%nHKK/T~ӟ?_Ի*)ھI:=07(iJj Uے;wORFcw%t+[.FfrO|V vlimSS'W&3S޶ҞC%++1PN\xG&6bmKRNwJThH6qtrEI'N[FRRLQ%+Ѯ8:U%!>WSyy&l xSEbbťl k1eQ,RnOΞ^kmtVvGLLp-W1̭kflɹ:CnSiy^,'c}!B!B--xuЗ_g߮deeQڹ&\enxvvymJ j-51ؿ{.6%5Cl*4Swv\z͎agYp nz&&&4i>{H{y='++ _4i6 pYvիw &&X67d`MF*Mbl\?"ϩcMLTt9ש];tA]>\ࠫ8MvHKO֍_ߵgEܙն-_33  ]gϬ ~ELT `\={""nXEK?̼9Tщ}p)S@WWӭG>mC+FS{=dy׶sJԤyqXXpȓ9ejjFێ8{z-iɴl3~`4Qy0>UJ}xSlLMQ3IJK8f)==GTi-)[Tf|z01Q< Y1j&wNrs7!deePӱq|gƴM^PV7Ξ\JZ[bQ*Tlmn%o1ˁgϛ6{8-QQٖµj-?.LMh~2?m''a!?PzNt`L`m[=?"ѝްz|.HF9}{ΝYOŊM#B>QZ{ KK;醫Uo tQ+ |[44v(Q#VჟI x~\7,W71QQRk+RSt'~ѩ*-A'{w}UqZ{W/eƱy!ii[7=,$6f-cfHKKXZ-M&,5MҪ7=A~YN9_q8:\ tB#M;FckCSͼt͌7C"vo?g᱋>SŵQg9 !B!B.@]Te,,lx'BzxՠLzz<aaaþ] FuΉp"Hj33 *Wm+[VŜ F>ńI;qkj@ {Ρ|Flu%+PϽmܙ\ʪ[$@v8ƶ-&%]il/gRffjϋSjsKڝjzđo ..E w(Os 5FPU/ae]7=F3ǖ{FD]ǰpOERT:/lRfKK{&: bоtbCkvd5QLy(9= CD DXOrq3U\[QnO܇׭g6n R?@ZrAY&c~EFF*I;.?IL<4w.%9\uԜs@Pe&LyL煅l=[ht(+5y9JSpږ[7R62Pں8,#==4-Z'+K˶߫P/ƽΑ:zQ^omJr9b 낃r;-->~FJMAycܾy~ԡFM_0o:Mģ;yR65kwaώ(J}J i j[۞e+=)qХlS?EԮۃާCܾur ;v͌7 X2TlO枵ƁƑK# 'IؘĈ\89W~YS^}qZšp/sutr%(A!%t!{{g.bjjS 1fT=pr*ھOEae]SS3S^gN2̎3 N$'bm]SӼ x-ѭs[gxK=0i5tSg,]Ҳ@YA"#Ћ:n=iv\ӑGF5X[7,6* G'WG+_-FR6ffjesF%0h@63ydL%-he?*ωQbΏHHxOKKK NC甒KVV6O^)$؃?,f^8GjgPcJ[a̘~Lz6{v|Шp*Tl #Ή=琜k@>^Ǻ}tYϲ !B!BIRR4{&Fҥl,, ưq@֘@ҿV52{*DI}-QbS9Mk0*E%55^9[ZJ<69^A'-[O))a0r쓑Π cĄյ*M)4\S25D/'2הoԔ8'y)/4i-6R^Oێos ^pIS1Vzǣktlj+;,C&&*j[j+{OEo d>+q҈B녱'33#W5[v@ʘv%w;VRfGjKڄrx>ﱟ_ô8ڵck[؇]SUϬ׳i=h8{z-gOڦnӼ8C4 rvݵPG/+ߓ4Lƶ-#صm^i½4ܻsK7J'q?Ԫݍib,B*FdL{VX aEZus_ؖrt5ebdeiճgKN dd`ti{LJOiŴ.5 >dLVP׭OQ))q\ZTё0B۶dKOOAI'$>F3Rޤ"3]>>GhnO!W)|ӢxǙu7VƵes9Ft=}@t}nzKٔ,UЇ17ST.em4n2pߟþce]H,%OxDcnTɉQDGާaa$ǒJlLHB#\+7#..&=}== 흩S7VVp/  rAʖwV=KҾ;twORn_.tɉQDFܥ~A>MOSVbnnEzF2-Z#)1*x5;xĄTT!. XT.ej[:$'FQڥ&޹GRꃙG _#|mi8s,i{i kCMu35i 9.lƶ$[~糾}|Σ0}dRvOh23HJ == ]p0_CJ$?B)Xۖsxt;~'ϔU1}={"=-`ck8:U֍lږ}XB"-`_0߿ve+5ju/v7ӺDF5X(}@:HJQuƁ+~U#$ n}ixDI>~38ăj5;baak _{KdeePU1] {cJ1\LN[N\\(f$'GcgDxx^A붓HOO),teDE=zTX/B!B!t^ult0LZu RRbckHbb2©t5llԱ,=SS3*Tj[Y=2* (܏p#Zs ʣptʌ;'8v~=|5;аk `9< ,JlLǏ|CCʔ}>W?anaM> 1"EnR=Z{__ w m.oc%&CڈUj&'-'&*_6Me t<33KxPo. 'ySعu-Lgdfp"'-Cԗ+Jp7ԫߏf-ʾsx{q.L#)Att?;;'hq:\[/ڳmTmIP\k_1 :y+#6&_H6zQQ\8UGyl0G!>.f-Х$%Exҵ4l4WԩUr2B!B!`yܾ}$""$!!r&* Ӥ$V56Ȱ,U*MVV]VVV=-[WPf\3nx*V!Jbmx^Υ ׳-RBc~0JeF̖wr컐u~r¨?o肺9 vn{W%xA5K+{vl*c3cc+.Lf0Ћzzfl/B!B_?ԒRJi,(>=v q0eS4kbbcbbjTss JaccMOOttt޻w/.1VZY ,}Xc3y5&uB!B!B!B#=ĕ 5QԞu:/xz2mB!B!B!B/2A!B!B!B!;HZ!B!B!B!s!j!B!B!B!υB!B!B!B<B!B!B!B\HZ!B!B!B!s!j!B!B!B!υB!B!B!B<B!B!B!B\)^4ŋch֬ fܺ}߯! 0P_f:*)f_D|ٴW}|s-oYYje?Ƙ޸qC|qoevլY]gB!B!B 655eO(Yҁ5k7ȰC%8Yq.]tM;w!&6%JЫG7]ޙbϹ0/^6H 7mӊ-m嶏/e\\9b(j/tЎ?eSVMmr`IR1qXةNC/--3@DzzŸ\ M\xo """~xx1#o"]t"%% gϹGK L[ueNUi''ìuixv]6-[;w+O`P2ڸi3˾a2[!B!B! n߮ U]qunx旍2d ߭ԍ9~$O̹)GgtѨݻ9y2YBM9pO>=99wgNZܺ!ܶu+:wOsԓ}ܵGY&/_Ч4M߷0W_7]9ufwHJJb3*U*s7L:k֓2loHtL2dbbO^E˕IBe^˃e^v}=zE,āCpГ>~d@,_J-B!B!OPh֌}p :*k@X4 LÑ1 SA*03UR7HO$r}]}pZR:k3QVќ=WS5ЫG7^0x_fbbQEVIOO'++ = \9k͟Gtҹ[~/xjMV/W 6 GWT'QFuطÇLjogǔIiѢYYY?'N' ̞'Kg/'NRbEƾ>0Ν#7nꏣR9|(zv_?˿5RBW9l(ujעxbDEEsUDV}jU]'S?qE?xߟoѱoN{z?-$?v Tډd|XnAdOάգ;͛7E}ذquj7QRE>d5\o}On_ޔtp AKWbogGѪU3#4,;wg~e\tێEf/^8<z'Vϟ7nk9F/.Ό=oonF'T*j׬?3eDu팥%ǟpŊ\`IMMŹ>ؑ333wc ҍ=lVVV۽+KK9v6hp= K!==WzzB< #=ۧ˿[E޽޽8AL i4n{дIB..<aaT4m܈ŋy _scY3~Txbo0^*׮Çlޜ~hܰ;|/FIYl)!|l9I֕})oxW.9|([~իר\2e''GEpjp.]a O2̞;E搚>75Mw/=C3zp~۶KPZ5>Y8/edzbwM%hذ$V-˯DEFakgGYRF{hєΘs%waCP[ЪE X^4E 2thGFfIMIeA|`KK5,_ y@L< s3sܥDʊe_A ~޼RXqZ6oœ4cOyE Gg_Ƥ)&\ɢK3}>q;s:nW03SQbEmsfx ?IJᄃJŊ|$LaPP[|z-Ŋcqr}1~q=II9y>S~o] h|!{goӫ>U]^~܄)oG˴wok1CQ̜6޾DDD2l`ӎJ/?Z̚6=ugWmK/_`U'&ЧgU* xA2.TuͻO0g^.3@ߎԨQ {{{n4= Ek7nDzz:~~ƞ퀱u~F ʞ}2mVVV|L7S~M:j0xIɘ*oOUk mVL<rEhB~w&'N \ǎ`mwgNCu;7nRlƽ>g̙{'/F c̨w3P\Yƽ>jU] 4 =nƸXXIOOb 8(Azz:տHW͍N) B!B!PL&1A5x(dBt#?=7gx2Q1Ѹ8;3h@>t!7E˥L}kK>Dvs/ҏ‚N:&! sއxܸI b <[*(`Zݻs~شW޽ʄƍѷO/2}{F>甜=y4VLxs Q˥̘6۶̃] iiiL<ϝ;j?LLLr||*KѧW{__\9^v?mȹ)֥aw,ZuOJ(A 1'R63=}|*[aC=w>V 4nÏ^eh2>u~_^|UٓaTuDGENZZoCzz{xfs.JEf i㳃1@Mtl.רSgϲf\p w77 xoM]ظa-M6mU*>l qq~ 5r8sl׻7/Ϥ)ojsFh򞍡>/_)o0\vѣ?M/~޸C^c7 mӈ ::>תYhnAvE{>hN. cF 'C>Pos4dffeihZZkA[^^luȰcIKӍ`i*YJ>d`Y;>=֮fTB5Zm{j>+^ߘҥ+]^Nߘ0dLR;9ذh\8;3uƻ ԪQ{ۮ׮Q\;cvrx:?޾~6x|ʗ+Kpȃ"swZj6fnnVp7v[tlN.J׮ۭ2c4\T{Ԩ^;lxk׉fт9Tꊟ{Աfk8v$_/[fޜٴmӊNp ,,̩S׮{^ #pwK)[ yCq!B!B!^^/tJV'RՓ?]~l0Ue^,ZlĉSvcG2P3.]:v||qqvf|f?tT&Ѧff|0I0ӓ_6q`RSx vۏ "" ,Yظ8Eqp۝>s0ƏC& F *1xX{%{xW_0p@?аp`@ͩR2>%1} uѣV\wl\嚺? C ]cC5ضc1~lcƽL=vBF'cbyKҽTu~$''gKX \lpȨH:uee,f2@zus j9rƾCIqW{sR0홹WɒgcJkffffyVNRamZ熢/}0 ЍpyP~.~zG~Wgh3> Q(B~ZvifLF͚5s7c.^Lff&uk3@]ZUj5G=y9 t/fVG 08껻s' ݸqGojܸa !B!B2{ )Ζ3(vY~ڰ ^gF˗ڹGWTC|*vu<w˾{ٻĤ$Z-!!SRj*n>`xgT,-ܻ \RmaF$2s1ƏCj P֭ۄSzUeZf[k?Ι E.X0ckj4%RfՄGj5l(uҗs(j( %K !!1͘rbb _œ}zѫgsooӛ>sN">>L2馯 DDF見x1t֙N_}`e_?֩GcFtJ~ 11Z7f2)35ՊŒkt]%_޼dɓEjŵt f[8+^^LӘDEGS}s(2 iْ~je߾|5cfP܊)<Ւ`7DDF:7EvLL9Ŝ2_[W-x'K?OBbY۲Lwrn(5ق+~)?sKdi?^^^>^nկTk4i:HN7`r~nq@rr27gURRbbؿ?u]=%$$b?Ʀ`܌ۍ&7~76E:J|jZ9xjU*c0\OJؕ+_U'19DDDDDDDDDgt@}\U\x]r57ٳ(YsS8>)*+QreVYa/"""""""""['Ow;ț//իUKضԔYhyl2\pɹɁsѶu?Zlٌ])_,룛m"Ck>>TPcOk, ܟqss8w D pe=jatӡgm5x!f=q"iۦ%SMl $YbI%1T~TZ5C/U\9 \5Hի=h9ԟ~I7bXطUT0BCB3=Ξ=dSO8<E|(vxb6$$$PFuk8=ώ1cl)^<3njT)'*YE ۟StwCbEfz}BCBvg^J/FwfSOz Preӆ_RGB:d2cj},Gnt Y`{9{(RC-\JJvVd=*V@./?1Qx`!}X8x(vmې7_^~sȃAa&^|96s^III_t(Hg͏s3}Y˄ISxӋIXX^tОL3K+[?\m:oD  jVƓO<}سg_n]rG:we\`L.U͛ 2ګoo)8p m[S4iܐ O8˕ʹ.ӷO/ztſ@~^:TǑ{,}6|~gSRxvZ s6II_?ztB|BD<׮ X3hYm˗S4ozkΝ;GfDzDDFǥKoxr >}Ptiz(Ȍ /#Xa#CϓfM駞ݝ}k^^ߗzug~ʕ)!r ;ǟ0%$Bɝٹݒ%iܰS&~ƂE9s,.(ժTf{8obdrm܈O?//Oԫ˔_wĄOmR<<{^==uiۦ%&~}{nt~L)ݺ%Kcc6__;sf_5lo{#GswjqfڷkÁ\tեYF]o=e}{C1/3}4{W c[Ĭ? LfMiyⷥhY>cghղŊcq~×S>g_p RL,׹^t9Vk_` 7\+[Klkg:@ôjь|y}}zgv9Zߩ+_v[5+ʮ۹.HUyu`?vMգ+lTiTZ7Dƒj!`Aթ͌Y\ȼ_ң[ض/}zSl޲74$(W0@^¡k7>TZ ?泉YVEDDDDDDDuOԩ }C}pss𑣌lz[oIG]ʰޡKN4j؀/v &&&ի1 ~-kՅc')$$4ݺ'OL =v7~>ulظMc0Srڻ:5kҪE \\\t~_aokU;@ x^=<=sǟBt6 ࡇx꓾ʛav~D\W RhQf|3'V>'нkg^|y"X9}'>:,>>7~0❷Igr)m8aG4?;w3kӈșg0hݻv>5&\`,_a˼]hӲ/<ߞ'OϘ6e FM:'`t1rHiS&[?.{M\lظgx_ C LJ3g2/? _%3)3ѮUK*sB5c˖$| :__΅2iocپ}ݻv!_$&%1ڹm۴ƿ@~Lgym[эۏW9p k >=vw"5J`!>1.֬5!6.ӾSi԰F}t[OMtUvw?~ÍC3z8zFN/ſed~2fNMz`ܘqsse|1k>C}Oy 2/OO>?~#mY ϡÇHdhtFgE_kޤ_^:9{F>à!ӫg7777®z {stJR:xOxxQN6lt|d}W+Xeg8{n︝ϹuksqFY]s]&ѮM+>>i]r3a8Lhߦ +aܵȨ̿פq/Ѿu+5mL\|<7lb\"4j؀}k>;aY $""""""""r?1\{85j!((n3(QntwwwIHH0yyyfw hZV5o\RR?롇=t~#-mJמ}n9N }9(fUf֩͸2;~¹Yn᫩ 1;7HiL}|}(^za۽:"aÝn*ׁ{Pd9_˯fMtrik0 C\ZZZb2F흖viZBѣ3MO|O]ΊЩKe@A>lսkg.\KaҬYʕ-ÛG8kڸ^ Օjիҡ};2 ˗+KZ5 :vJ,A;r0iڸi ^z<wr]i/7TX#Go\-`ͺ{PG0gڵi翲P-Z HϮ]ȟ?VӼ7r43L  Kfw,\w*11U*Ӿ]s[ͷ;wϰ= i̝]#"I:7ߔϹd>897d,S| """""""""""""""""""""""""""""#PHP@-""""""""""""""9B""""""""""""""#PHP@-""""""""""""""9B""""""""""""""#PHP@-""""""""""""""9B""""""""""""""#PHP@-""""""""""""""9B""""""""""""""#PHP@-""""""""""""""9չ """"""""""F#%K˹I0%$pҜJvno%x8087kP]QdI·%rs]P0%Kp)&yTPK/sPs}롇X%htqnW(SS.]Lrey@x{{qJsYvJ,NŊݹߡ5EDDDDDDDDDDDD {(^s">PHP@-""""""""""""""9B""""""""""""""#\ w.ezO'~W_|ΫCq1.9u>xٳtݻtYMwU޵s9K?3?sYDDDDDDDDD{GZ SH;uڶ%!!5k:7}L޳#>p.瘀yicV\EdTss&~t׭K@At2318or:{5{YΞ9P;C_0_`L&8{IIz߻br.$Ĺ|uڙM[8~ EDDDDDDDDSti4˗ٽ{)裏RH{2)1 ';v.娀ѽkgvuˀݍ'PߟKWp2^ޔ(^&2<(uft">s,޴eW%***S+KWt.u΅и3]AFpܽT\WcXw⒡ŅT<,fs9I5)R>)Sz7X9\ \]]1M"rɱ:ʗ/0ŷ;XW_ϗV͛={leq>_3د/o3¹IDDDDDDDDDswsjUp:sX/_^jլE\\]d\t'o޼TV SγkM6}/cc&_ԬQBωؿ}{bERfMrիع 4A4j؀`XuWWW7.6ni_2^݋͛cJJ,Add-]@ݺ7CO¾m> ?O+gڶ}V .>dl/?}Dzu_X'0`8 WS'y][.O'a&խC:Pd)X _;uy *U%3}"r(xbޅʕ#W\] gͺuy>ytaJtwwkY@Ϻ+׫KLDBBC>s6ǎpڣo .`!~azN@@A>56n_3xM1&"""""""""r/F%Z wm˖[II1S\YZhe 7>sd||}Z*͛=˒#+W.6l܈ɔHZZM'Ϗ 8l_y`` ))TTg6a_ILLt+q>>URRRHI1z:ڷkC5پcNZz: OOO zglHzŋc'dO`p93gTG'--A1{w:zݺLn]XwΘţ>B)S sᳫF1DFEaIMUf :;v0$&&RT ,h߮YӦPoN/3eg76͞e 沫TLs6WyB.U e+Vy?Wg?Wӓ'7_><Ν'uv2]ЦUKf~33Ce|3W.>h cTPz#{ 2Å\{]Pf iPPkݚ" 3`N `{ѵK'._qG[9z8bܘ)#@exIcz&,uڷȈ(Ǝ2Kq)wbԮ]/Os9uy#)f3 ^;{_;vMڵ] &.^F#שU3WkCyԨ^Uږi =Ohyv\:<<w F׬%9iP̒K_ŋtw.)S1_&MOJSN],YzyyXaN`DEF1I֭ߘaʇ?+ٱsc{>߯7[G|j>r?̦egYYIKK7Lj}7&tFlYŋسw[6w[lCؖ[m߮ fАa?wLBrع+oc.ĬoeP~L13SH]B9{΅{]=k{#uFHyjժs! zwK"C/^ CَVY`ݤRbEZlڴ|zhۦ?kG+Xx1;w&<>ԭ]5뮇GS IDATe9![81]+~_ /u1bxzw|t@2`zu7of)rezve*"))əX..T\7YjeTXŊJbŨP0#9-&6T6sjs31c歌|bӖz7$''q ɛ'aW`Mr19heJHP] oͤYrn+W9x0=ÊWѤqC90e]^hFT3 ͓X[{9e r?~SM>O㎣I$[nљL&, 7^ 0g4nȲ;̺mv) 4sjek33?By^`)SUеݷ nNssNڳŊbMM%4$4#99S:vً %KtL!.?jJe{Rq hբs'r2V!\bX0gA;Gmz vC(_Cfvc˔Je?Sdي s=Ef$L={ظX\xG(U\5cNڴnC6m8t<<={t`6oM nZٸy3۵@a._ҬI_RRx}0~H0(Us* -&997_Ӌ[G|V2f&aCӢYSZ{PlYdf|9 q% (]Wٲe 6`\xuƍlG2WNۏ'ei;[ǟys`J/F`a̩|ao =τ8t'IH0QLiV/KyN0}spԉII ~mvD6/ٰys, s׹|[&L'iټ۴b1v%y펤ʁCxs8U+W{.""""""""""vRX1*T(711ٻEEEے%ԬQ:k)1hl?NV1]f5mf"Xl5ku1 !'>f/ѥGosSb"۶ٸy+ z3YFFqqL5:H 0tӏАPݿERfu~I|#Q>3ǹG֭hִ1q߰srm6g0xƍ77WvӾÑ?VC^aIMܹ~5kK/氡C8~┽hh4bڂw(^:{vc`Wpss#J8YܕҰa\܄)1AI\;r}*$9T&LShټ9۶b1s9,gJо=\?&rw=5d7J(a7$$$ܼf;h4z[V_՚7.)uDDDDDDDDDDDUR͛6:E7At`S;vr.߶JZxs7RSSE9uf۶97˥`6 qiii @[d2FwZJJJӧVk G4@A-""""""""""""o+_,ŋ& En@\wʤ Xi_snsv)mEtF炈'g;rW@-""""""""""""""9B~ -""""""""""""""dIM } ~b'粈2Kq)粈ܣʔ.3pncyWg0)2ܜ5sEDDDDDDDDDDDDDDE19PK""""""""""""""#\ """"""""F3 v.{^c ٦YrQ""""""Q@-"""""""9ƔȄDFE;rT@޵3;vR@-"""""/R@-"""""""9b6iV粈< P='g75N vh7C +0s4k֔BgM|3RRU~<#>efԬQdm3fLݺ7CO"ѽO?BCBybEzF%pww%""m}EDDDDD${PH1vBJ;wG ܹY:Ciؠ> .`!~azN@@A>5aCtJ+Cb3goAƎF 网9s,qccǍ'))B)SEDDDDD${PHee;_lfӦ-4jЀ搖3 c4Yn#ʖ&,ZԶ}b(S'NwXlY @TdZMg0}lRREEq9,̾]Ed7zfu>""""""} EDDDDDD$ǘL&9ڹ˗_n=[Fj޽&r!#"k֭osnRSSTC@} K͗777fC[FBBIJJfXb%n;} EDDDDDD$X,r.;8r$ /ҴQ#vˣys`Z:jTK*WWx}k3g5[v]DDDDDDnAs֮@;+M5"99-[cbcIMMekC0f&6&ƹtǎ;#Jreұ#cG}@vsw sADDDDDDDn[v<ԓ4nܐ-[cJLڳJ,AhHhGLLlZSuÇaϸQG-hW77?sSR}iK.sp{u@L:-Co8zV捡)Q8Z(Xzuj3clBB;ls3CϓJͱbb6s9W E퉍uXZDDDDDDG/OOF}0¹ŋңCmͺu>5ٻoCI_pd0-7}6X,f®s"Tl\S}M/ҨaF##$$4ݺ'OL =v7~ظ8݈-(1vxƎ\+`?vV%Kdr&ݻҰi 2+X?V9n>sIDDDDDD֠ZDDDDDDDDDDDDDDrj EDDDDDDDDDDDDD$G(ZDDDDDDDDDDDDDDrsA}j֠(V(^DF]S\s."""""""""""""rOP@Ӵq#y >wH||<UuV@-""""""""""""",1/tx. qssFJٹ,wl6[ZDDDDDDDDDDDDD c|| uә͎aqUѵ KĒơC5;Μ=k3ol_}=U+fwEһ-7eqݓ%uLK|}ٽ+׫KsFwۈŊ1mg/9#"lǔ/WkssseЀˠEDDDDDDDDDDDD%Jc oӓ?5kٷ_`cF:t?̡SǗ|T{rsscWֹ% .̠!8z츽a&I||<6II޽_M˝1C{_=4/`Ѐ Пigh$S4?&*2N~ͷ;~'x~B.[\B96nb""#8Hʕۑ5|C8 ժVe˖mpj׎C.YҬiF7#*:2K;%>>!%,C-#ooohۦZphsq1h$--͡Mn.p:]zH""""""""""""rQ@}5k)_, c7_^˛X\.z@\\sd2ʊXls3`-dp0^eR?۴s]REq.PdI0=J=J:l]Å ٟTٳg/%|rMX,?@*|9АL}f+2N>"""""""""""""9I#c<(l˗Ihܸ!;v"'&|:oKA/c60omذ7 3ٳw?K+Z>7drm܈O?//Oԫ˔_όYsrD<%KWp%< ???ʔ. gvޭ܇P̜5z֭ZP@>ǹ_o@x];of%0KV]CywO~uN7cJLaoѻG7:o_n?^@S9{нk^_\`,_G_)ٴe+lu.8M i PzED:(EE"JEQ,HWi { 5461CvH~%..=;Ϥkعv`ۙf;!LƔb? O¼d8u k 3EDDDDDDDDDDDDD$[h@-""""""""""""""BjPHp7DĵɓݻQVM<=w_MPs-h%?(s&)f7Qޝs?ܨm[HPQ\/?`ۍС]4Gذi isFM?Lu(_, |*FȜ@ҥJ7*/G||<7nbD_fNdG}\|||hcԩŋc~d t롬U{]x)T U,X3 C|}\*R'F]9sú+PZONqcV9̗'b9 {j=)whך'O^ʎ]O\b aaûCFqf+PVj=IV/ )(vqC+8_#W!̓Ѥq#͹sǟ%T!gk{cTP'@FyrneG}rr`!+ҀZą1v˗Ss/qcʫ\||ݻS-M3l; zw(۶rޝsׯWdUL6ӹc{r3rKϽnjHÆdێ4yap|NfqѵsG+koMrr{Fv\Jо}֯ha y/ŸCYf aݜ9{I7\;\ v0W!p>=j>D^$oeTrnm}>¼?8Ď}uNȞkDXo:ur9L_d`vk\R#px~4lPpa ]ۗX<{!!!pkC |ڵb8r5ϋ~1\ze64{`fξ{(;9j{9\".F (So|;ww9^z/d:y'3o-[޵񅛳ywnݽkg?`|jx{㧟s#7))5sѻFԫ_i/b2ݡDEEp52CߥnZN}Cv\N66bI_}˭Z: `]Rp{.j IDAT_7uc>H 2=L}R_Rvrs:AVNȾrC), *U$4,R=tSzI=dZB<ԓt񍂫PfI=Էwv[yg.C'UNE}jTΒ_͍gbcF\ʔ)'·3j0jԨݞ̞={bdN\Q*W4kքܽLjr'r~?Eسg/pBtЖ@ʝC( IĄJf.C(UN졻{9IjC9".׏SaE_7e}-X??\^Z%ΕSq/ ڷeW8ɹS]'7UBB"  n}ƒ5jS-(S4}jR\Y>Ö+koH=FJU?}Vk/VgjPZ>J`zꡪ+ɸeW kWCuj5Хy=L} ì]3gϣMл+ i3?=5yеsGnF;;qcܭQ.C\ ,H*~|reT#p;]{2dH㜮C\N|PbUXqrFs{n.`sz)g?Y=":>-# 8syi"..`ѯ{^"".ܩ, SoFe?;Rf 6on9zoڵi;w9nj䬬2սRRz&=uEz:#JQ}@=t}-ry{Qb%Z,5PeVpk}z1kw~-U{@^/_F 1Bst@\,֔?F=rY>?}t9[#p2{Y,-[WreT#pұ͚5fi:|… ѡ]Ƽ?7 &1!{șkЎ8u ];BD8G5x9+5Cwp6/-WfdEVjjt!"2)TJF׈oʱTr6/+W}0Y|3+j֬w'Ne䦲ByѦt֙ #Xj9_s75rի\z!qJٰiC<սPOF\UÇe6|1vCC'#CfGh">q )^Ei\#Gվ.C'#9>q|z9 {jz~aI,;6{eCiUR… 1g|KPZQF=TTʇ<=?rɔ\QF=pYzG``~|}|9},uk0SsjCw`sz)g듑zdPN q)7o& of@ٰ!Sm޼ NӇ6bV&R^Fط3-b͹CC8{M<Y&$&&uv#?ihVnu24'C||<%6Mb-b\R#W존m֘VU{(j=te*+PPVj=VDENξ{(;ꓓFξ{i@-nܸAҳ{Wzt;ḋsOZV'8h|9yr3 [dWVRžLmɓ'11Khh͚4&_q|8_L,qvW졬U{(+\"'Н'<"gȓ'vǏYrS#W!={b;CԱ='>!mvyC|\ׯw\,Yܼdpj=t xk mۼLGҋ/1}l.]djeFCQѴh8Ύ>s0#n5=Ա}[Ub~EslќDkO>ξ{(;ꓓFξ{Y`СX""",і%KZ"""6-&&j==mjINNKNN|Tژafe˔:""""""""""""r*[4'ObP/Y}b1@GBllljM'$$ ?~SnOɜjt{OTS}2ݞs{OTS}2ݞ9T̩FdN5=T̩F9""""""""""""""-4lnkH6t2?Q}2ݞ9T̩FdN5=T̩FdN5='s>SnOɜjt{>swr:?? :rKDD%::RdIKDDfXvGbb Z>~q7ϗw=@uvi4_A-""""""""9[t=_s^X߸CDDDDDw4,k]JeaS>9?1cTƎm;ء=ׯ5batѼdhڤ1+/3^Ϛ9ڦɀR%K} 4_!'[`6mXǒᵾ}r(W,_Okװϥ`iTZ_ņuYb9cF`4/<۷n;+Uk """"""""""""" ws@$#W\phڴ Ŋe%C 9x .U?!|y h߾=K`ΝFU,]&Q<8n]:p &Ma 6ܹsjӭ{X&~chu}f*WkV|yʕ+nnߝq`*̙3DG oIxyyo`Xv]LX~=ido 4kvR2v2sGXQ롚|23aMѢ%{DٲeΞ=O'~bŊQl9ujCW{su:thѮCG9˸2p`Nag!fcx:=zb?w%gKN,\N+7#eQk5*V?ԩ4lАwݺvzjשE||}wZ?E?pLUؾu3;t2f-Z4'<[m7b)4@BB"%K O<Ӧa9q%K4bi%'PDˋoIx1!?$ڷuk3sl󲈈=ELӇ:vjl/mSX,}oW^O>5ޭ+>0D,Yޯ"\zkț7ɓB.݈`NI׎]7kpi *HhXU+Wƍ^ss{p+W:5 +0'Ocܽ#G/_> `՜ uloϔSd[oAʖ/lI۹r*6 mEDDDDDDDDDDDD5.3N;xvD\xTQ˗ʕ-ˬ]7AenΜ9kseILLtJ(Aܹ<11l _`>oK:yl$&޺5vZժUcW*h8а0~4Of$%%1w<y.]@dT刺_CSb~~:oN`@v? ͛Y~=֨A\\?/nX,|OH$!>8o||q6#&""""""""""""r/r!)) nhQ 0K.; f3;q$]n즊"_|0RY;vk.qqq̚9\à _ހ4Yoʠ6_E7޻ y]u_?֭7~)Y?9..w‡@aM,!e+WpJLTV%XvC|ƌ̙3bEED={9JR s#;e|ADDDDDDDDDDDD^m$%%}5i_O&&&Ɯb(W,!!!v6Gi_Jiٽg;;wSw [V{aa\t k;w>v{2oV ob}Ѩa +WһEdz%QQDFE~~YKDZм,YϿ >}aZאL` Lp"AA;jt<) IDAT{ԙL 3OeNPP˗g1F^DE>1_OLLL,mۼL@@^&O&ٜsƼy晧 L2({J,A&٧jݻ5ko>wtҴn 9N*Uxys dڽy%&c[W\EDDDDDDDDDDDD5Pgctܕ=__Ãoyڵޭ $To#GQ3._Bnۧ7oǏY^CZ?d jaڴ,4h0k}?b8׮kGzy"5777Y!ÆPnmNv8 /f\WR?p>}_cygΜᕞxk>֬YgMfsB ѨQC<= ;Ƈ>f”DP”,Qao{j9p%""m)Y%""jbbbv#11xYVd4|فTgǎӦ~2/9p6Uַ>4>sS 4!t{yɥuܑ|go0 wgdUt=_ZjAZI< MDDDDDŋ4f5|x|Z͉͛'pp嗘:mzioN姅 Z*{5/$//OZ|}ᴈ %[ѦMk-Ϝ/7… NܹK.pP?KDDDDDDDDDDDDDIPtJyEWdpXri'氈=jtܑ}!ҀZDDDDDDDD 5OS׼9$"""""h@} p4OO>It܇tٛXKɖ-b·??tSǶ|iDDDDDDDDDDDDDMP~_ߗ,5K/~ݼd([,dl6;˚ub֛]ѱ}[vbbU*WȾ}hr+,V+JTTW#1]֮ж q0:̔g>q˯_`ؐL6WEDDDDDDDDDDDD)P;DH:jxyy~!?WRc8pg~|yri&}3[q6/+ ӽkgw6v6 ESev fVzY [neoד!o޼4i0^?xO?n_??z|:uj̦M[Xz Ϋ)-S2Ko PL)~^ r̹sv-e|; ˓e.7bŊחɄMЯϫ4WPש]-[i6Cݺu _pɓ_A !7%nN||<͚6ae{ԙ(]$L ""(T2K;լQoooL8^~% Jޯ J3OƑ_}MԵhz9#X~5<iΒABBGپ;ogL%(zwӬ|sޯ5kքܽLjyxHLJ4b)CBBȝ۟CV _{.Sҵw_Ϟ=@:}cۍS]ީuz9 @XX/j޿q O֭@ةӦ#=ڬ a{os 6n̾}YnE5hN0[,Ë޽xyzګpww|s@:hOzZO2恟6"""""""""""""P0mڵy'[4`lܼU#..5fm<ڴ )ySo{ Dll,III/߼t|C+W充o9 `7QY{b_♻st ~~z_gf1?n,ժV1^ݿogN}!ؼyOUJ .ĜyKL+GDE<<z`œyw?>pVzujϠhP^kÌ3rAz4m #dɟې R7{YcXfyATt4QX,|/ ,]~sKMШA};z__6llJH4m!L:X7KjrQ *H $&$8EDDDDDDDDDDDD5Pgb|'L0 AB)[,|:ȻxcFg\ ϒ'wf.ٜsO1;ic8JNŊh֤1,]Ʀ[/H ٽwWDR`loo:KU|9u|ȽHL}_{ΝӫG7<<<?oA pa6nLvm(3gxw}qUџWv՞q24gƛ[K;{ i-ZvjSdݫt l޲L㝁og8 Nqf]!~cÚjFGԬYSo;_.޹rdY5UOp z;w9;wg ؟6nד:CԭSO'gΞf—הS:tVϏ8ȷ $$8Lu܋,p0tPˁ,hKɒ%-Vc6j$''%''DXd>_*߁?rv`#s_ٱc9.^x~ni~ST"0/$OOO}I&Nᴈ %[$$ *;gϝg,X95]/2z\VBaϬ\Ƽ$""""""""""""rOҀվCr6h^Β50BCa{7j#;X!ҀZDDDDDDDD=B&5[4E搈s_7Gҧ=EDDDDDjɲz†z4 """" 4;׺V ʘky4x5VzrFFݺuؾu3Tv5P<ʕe7NO8p0 sSӤqcߌXpp0~~[.M&[Ə42b 7`p`ڵ\vFn^TR]vi͹sh#FtL68֌nܴ8Z4¼$""""""""""""rԙ([ ӾٳgSX1ʕ-WNm|||jo_N8uȑ#G猼y:e2 xgXl)5l1TG^{uy]p] 2D#j\Y.mns䨜e9eL-Z8q➀YpQ88>}~yݺvaʕtڍ<?n 7W:u6z&N|*+3} ҸQcyQ۷S#w+)Qr®atz^iӚ/c.feHnӯR|9uT6O&$$Ĩl6c~ni)b!++Zjbɗ)_W&|F@5,XLxPqe}  nDV4iܘ7Bӧ7Kٲe+QN,XaԣΒIX[^ZnoBIIFOĤ$KϧDPJe\\\ח%c)P))))`¸,_iӧSJztJ%ݧNGѡKF-""""""""""""_71nk=箮}V˻=j9¶'jwsqqã]Gu B}(\0y^/?  ] &撹v3:{DDFRZ5233#6lS@@\| gܩ{˱cϗ7 &m;..+W({NV2eT_`!_ %K !1K,[}='Ogg;;Gγ[ۻP1"""""""""""""\222صk7-tyo M7r7mNΜ (̄w'ҡ+̝;.С+t .y={ShӦ5iiio!' ?qW5X͛hPq5@ *Hh&#--'Os֭ $$FZZ*5 ׯCŃ8iiNuF;b̛ e⯸x"AAATT3bb.3m|lSr{|}=\o{_^||m>ә=g de9[@JJ j׎v?ϕ+q|Ւ[#CPb i3"""""""""""""<8~ 3oY;kY%Ξ#[m v3X{yE,XxNOKC9ROHLcjիD }':lꖀ:33ǚ57W+q{?~Zg.;ƶ{ȑz \Kt2sI'ܹsl7"""""""""""""jG<ٺ5>uW+= ڿy4⋹snrjԨ%ww7^l/NS[DDDDDDDDDDDD$R@-T^~%Kfq6:3?%K̭uR njPBV ,<$""""""""""""/)ط׾Eo7dͥS9}괹,""""""""""""oY-<\VSR@-"""""""";9³yrk=DDDDDjo?sIRbsIDDDDDD$g]y\[.\\?G3G sɉko沈PRmUn ttj.7(jGCޟ86>>˗;]KxcGZy<_gXdTl %K4iܐA5sX|S&8?5=aas-ys#1)6_k/WzJy6>=WVB.RR3صg/>MLe3O1o\=l;TS+{p9|JYB|"?IF/w߭2*/cpuuLp0s%MTx_/R4oԞm4ƆCp%KS t #2,ޟݻvT YYYTP&O3|4nt؁LG~c[G HNNco?]:w?vɏPKg~\x_/~\f2T(_GR&'zRRRݴ٩VݝÆqV#$vqqssLz轚̠}V E,V+#Cbb"  =xˤ1t(#d>|(s>ɳm6v;wsΓ[)ϿT_'Ǝy 4&""""""""""""(΃2ty#5Wݝbuz*;P9Сô})8}Ͽώ^gԩU Ι5[e93~}h٢c&ˎn9flѼcq>6._^ԯYYYl۶2q8Ç۩P˕e; P|Ya5= \ƍ/ߒ%JU [m ¶3_={w4ma$''ӠA=#\0igp%=GC.\ϿRL ŃQ\9ÃGz-/qco 'N羼aGSHϸO?#jO?ٚcb܄lܼr6FxZ53x9jnqұC{~X~S@F11ok}=o9D;Gz<ك%==c7s *f<VQˏ78۬e\fϟ͖Wzupzspp0 yÙȈ\]p8$tifr==#WWtJ*b1ݍF em:|ZDDDDDDDDDDDD=wѳG7o`x齹Vw'OBB.OfͦvZtzeFp}y\ۧ)S.={ wby]'ƍ&(0+y 3qXJ(NhjTuj1nDx={K ywRR%""ȸ55zv+͚=ƣw7?nw 2*:4C`ѢԬ^%Kp8zt9233R?^kԫT @!oo {g8@RU'Gի*Yxb XVkXb6  f˯!N8ϵc-""""""""""""_71n3箮ԪQU68Fcݴhԩv>ՊG;S]F58";~=vߏĄ<ק8BC{r[pz>wEu6*+p8slܼ9Oae"##hb;Sæ[:kͱX,N{\ƯӢY3qJ,A=q8FlX a #~}Xط.8n=x b.;->!݆1"""""""""""""}P޽\-o?s\]]n611?__\\\WlfNsoSܼp=9dȸ5.U ooo.*4@;mv;$%]e qq6-GmUZ z*$&&5hټ&;ϜƠiHJJ\{Zß@8z"-5W[8 :$&%R\fYA1tsc asԨ^be!RSxgL) sFO .>2ZVJ*ŖmλƗ,]ƊoWQ<($.^fޜYrq޹y8f<^EDDDDDDDDDDD$S@222ػo?5nI1έ\J*imhذ>k<{NTnaJM:Mܕ8<Vp85,V?>tVG3h裹,",?X\fG(PF>JMy{xޝ0u~eӖ;ϝ>rHOOM!'II$&%aX4io//ctG`AOl 3rqiZ4oJp̙醖͛q ^,(/]zzyHDDDDDDDDDDDD$_Q@}e1kT._ILL EP}<{1bRg)â_z[U?3yһ,XIIIy7aї5~j ʒaW`} y} ^>GzPj솻߼?<6[˕ 9:wr))B@¬W!pssqlٺݼySʅ=Lՙ="""""""""""""8y4N.Zl6/r#Gٺ5W_y"19qˋxJ]ۻ63-vw^:ޯdԈu6>|ӽ)) (Jq},?5Dž~]}2}*1/3v!'y_ٍ6O / T 2iP?"==v/_Vt֕E0]:ݻyFMDDDDDDDDDDDD$?S@-yX?W^aOHII1*W/WΑGzYwZ7v ~5Bbz]yFդ$F 5ko>vyAdL~ƍGh(=wZj*}ի%yv̛ZjRdI|{4?#|ӦMUL;&?O?ElDDDDDDDDDDDDD3eCXl֭1s1ũu6RSSiIH~wQBy}1s1\x%KRBEIvډNW;s{ ??_ΙML#yg9)5L?>}+Nuʕ+ҵ x0~o"tlL.U*WfDEqƼ9֣o^GHKK3oWRDq];j#6kӦ5/^b]Ff~=ݨ_ $,>>>rԩm8N:MHHQl)S&BVVw$2*zJl,.\F<ݦ _/= p4ŋH~.Orr2v7޹k , o=x>c[=3t{ˋ"9s-[E *N2Ygg3).UHj׮=#i]Ѣy3cޝTZӧϐabА!m6hՊ&3F=stf)[l ""*4CPbԩ] p8zTY233^+V~kԫWS3 1)ɑDppiV2RDqv;  %%4cW_Z;=F/H~u8z: N'pݭNw:vZ9z)Dv8[ py ~~3\\,tփKڽ YIjЛǃlذ!Ou@@qq2gNsNs/ǎ??_~g""'i$5HIIa?d'طo?oTpi Dff&0b)^|Ǝ捡C3w.n 6 csr&K@Œ.ztGS~-qqvo9\DDDDDDDDDDDD$?os^yzzJ̥-%s1{*h|5p:9G!ooϙ^ۛׯy !ePP!f"4@rsyc nYCۇfnv;ׯz4vn5kٳU w l "2<f3b9 IDAT~ M6%e^f׼q?H@w? 06m̃u뒚 m:ux}GN<dxwddү__[O6ޛ=nDDDDDDDDDDDDD&;ȠH"[K  6S0{gнG/qs#!12~@v}/kص{{IMMeK;bcbr |suY|b^ SԹ3~o1_2M6kצx,\tSSSyL` Eŋ6^Ё+ʕ8޸:j%LB7:,X_C%HHL$&˖.a߾FO09wh;ޅ~Oܔ]iټa'+V 88x4mڄܽڵkoǝٽJ+\=VVZIll=`eL!sWp\\\hҸSiӦNwrLAAe&;_ap_CWt)/3k @6IKK_39IHL$]Jޯƚ47mD5lWABC7ii8yKn!!!,uu+Rb\Z/ؽxP/\ =-ͩ.""""""""""""h]L1ys`,^/]$((J*1q{F_LeM>Mrr _n|myˋo/mۧ9c:!!!mKِ9r,[aCje{w^v[oO!"#hܨ15knqٻg>q|9@TT]]ta˖;vb)5k6zhѬzw|?D+*V(xzzҨѣ,Zĥ^/ܞ7zUʞ=~?M];~.]ӻw/^} 6 /fZlܸ=zXȨHƱcV_^\G=п_nS {cP@¶pꋎW>>h Ǎ!5-ЍL6G=9*4iw77""CFLpizmuڙgzgo煷O]"""""""Gң 7SuSM<¶ih"""""ﱻZl\}9sbX,I#Hl)))׭VuOOOGzzzf@@ԩSY^^^YYUT7n͝7h#lON:͕|_bw ;V.F߿<|_rwwvbiNZiirJ(flt43f~WK[oҥFGBCbAA,Y5?yHDDDDDDDDDDDD$_R@йk7smst_;}4O6EDDDDDDDDDDDD- """"""""""""""ߠ""""""""zK""""""I3wР CRx60WEDDDDDP\\ɻ5yw5sADDDDD… K({hd.5ÂhsYDDDDDc EDDDDDDDo*\2z#EDDDDe5DDDDDDDDDDDDDDDP?B#t!OQoF}LJˌyvڱ#Ʊc'3oÍJ+0uҹc狈G %4M7x nyP|9;+e<.1nDz2s~lۧ56ʼ(Y:X`S_,(}Qg޵3J`7b|4yN჏fwS|ݘ`! x]jco?]:w?6Jُ~u?Nʵk!C8|!em?q©'%%Mj>l7m5Bb:w?Τޫ ߗjժ~_b21$&&1oѠ#l޺ W;LjZC"99G2糙,N(_,fhn9_ 4nww7~7VD d:a[vKGuz}N#@999 uʕN>s/F@]r%NOή={xEs 4ֵc.h٢9K-7EDDDDDDDDDDDD#wQlӧ~ȅ\xP1ʗ+Pݺxxx0t(Rv;n Sܗ>>h יg$^M'[3~[0y_CƨoPFu#G-N:vhko` (707y7GRBy>3shP;{sֹ}`.AAŌc5 ~GclٜsQٲj\ϸn_~P!o|}|8 .ml6WgʖNRX,deea~8]jRti3228t?TW{ gn\KI߀{s9V Nz]̚MZˌ;⹶OSȧ]z&*2 ;v1tȾx¸0ѣ|1o<b&Kʼn:MyN-Mhg>|}}iҸ1NVDDdFnsYx~=~'÷߭bDFEf,Zիd2Q>Gff&U*WkzJ( d HJjHzR%KQTXj|-B+V FwwR]#22JNwRF58";~%wOk)NS8 sC"ER8:wA߉ae"##9qE fpN>lڼ'Oq)Sxes,)׮4{ mZˋ*U*ӷwO0[,<ë~X}t>TÆ#+?zc(JLJ];S6 p׊OHne EDDDDDDDDDDDDf{̥3>Օ1:nv;hŅL}ʆ0k4O2ZVJ*ŖmλƗ,]ƊoWQ<($.^fޜYg)#l^z3%s ۇNq:gt||F_`<ָ,&ŴS8reC(Yq,na:|~`)wo_8R%KV+͛6!l4qWo[װXo#XV_ϸѣ꺳ȳ<`]s)M@w=(-Z41xwX֭M[>oٌt~drDbR! --y$4io//ctG`AOl 3rqiZ4oJp̙s~%KV-Xz-wq ,KToP9sG̚>WC``Q*TGO7.ބq_k{Y| hWޖnw_b8yEP0~whܨ![n#99< @M)Bddԫ0jTgFФQC&;oۋn]:s!nP .Cd9TR͛Ͽ-l0Q:t*]ѫgw"lNf17Gqǀ8֭aQY:1J:8z.Qg2hذ ; ]&Oy#ǎ1|[ڳש >t8_ɨCIMKgm|\їL4_72Y^}\xnsxʕ8֬E_.!5E .]uGNƌc9t%&&ƒd XvKrrp<<e2ywY Ϝs1|L~~"_soWNmoa.( tC_MdT<ݾn]_msg;{QXz<\x9/tz% wG\%sIDDDDDDmB:?\6lo~qϚDDDDD*PQQQ:b5WF2 >[,%n'^^^iV5מb?q\cٖR j%?Дז5o _й};}Y _6Y:LRl[<ׯF?!~ V,fϳyծxۼ]zVĠwiزz2U` y/+c_7j$K4ANY4goI.=U*V`o)P.""""""""""""r4Drs9&[M(V\ *V(Gl钌jK ;pK }6-];w6O=[`򕌟4ŋѥ.L}ukVv?tŊo^c,+~23~W0vm;v#*:eZ?~ǡ#xf|4tݟM[a/u`QcEDDDDDDDDDDDDnW m-f-ѡ],[NbbyPBy8@2l:r̥'!1׺orzgܭsGŻCW\QZUvY?2e:U*Y5oڄ㍾l޺]{3t:< | @; ҺL1Sa|7i<=_js,⣡r·D_lEDDDDDDDDDDDDnGZ eJgŸۯ̝1; yG7p+֬ܿL6Cݚ5x7wuVrn^s-=ȓ'/CeAgQby|9gҸA}}O޻$%%W͚F"mض^|9.FeNjRS(]KeJq'NҰ=ɓ$ʔ,Izz:ϸ;qҥJqԙY"""""""""""""+7땮$$$[w\ۧ8beaY6];wt;>Պ<%Naf~ݻd^/H¼أq0&|cFŊv jT;p; }Zʜ #==zv[aXp8.c"""""""""""""L@]Nms)G_eIZ5L! IDATFi֭h̥v>yLu8tKlYJzt{ƺ} A0v4:ҋȨ(sKr|:"pv իT"ng .}+Wu+),өSk\[vÑc "(0?֬Tx@8?b%זHLLbxf޻Rx1 v;v,FlXppL/`'66<,""""""""""""r۷0rg|OOO"#4,6>\"66@<</Dژ=aҤa}MTiB 6ѧ܍o܅ ܍vq12IS3wc~(-nFJJ*V6_I.IIIᗥnh͆qWZFy\56 nMjM9z$/u" sRS?\DDDDDD/pnPUByv<3/&6"͠1/0qL#"/Z˗g'Ȩh>!_};$o0yZ'Z≯Q#0yqzeJ!Fא釹,V|7rSvÖ; 7OU 7y==_Ӌ/˒e.}{dt؞Bw$^?#ǎ>w\Ë=z.l^^?[g Fא՜ȰװZ-|;m妼3hokvÁ73 |^\Lko$99e/yX}gm~0zɩ kܐypR!&&jazُ[.YC2}=)3Kgdd㍾2wˋ{3Ï/%0>N{ٸyK_h;(]$}9.""""""r+d|ʔ)+ ЉԤd"""""ꗋAY8`[J.ml6nʛ7WZZ Zp'g7/_\թSw9ɾLj,"` w+^{+O>M[uLCuZx<ٮv<|]>6sIDDDDDDmq|)78Ïc`Xӧ ܍l<+Zmu2qJi:b5WF2 >[,%n'^^^iV5מb?q\cٖRrK<`3ZzjpϝuJڵ~?̽a8 0it*W@jW|iI3i>#}}ê=EDDDDą["%5ڴXxyyq&cČ[st12$y?pBaK2v>ScGQ>8l3EDDDDI_=ͥo|ZZk.ߔmN 0sYDDDDDD.==#F0h z1op(--""""""""T Bht4ÁAC Wi! 1\0tP>Z }%3VH-"7â5DDD-PM Ely6lW2Gp8P<-"0biM- EDDP%K撈q؍E+..w}Ç,SMW$"n'~~X̥A-""""""""7`(\_Чw/͞9rr83ͳEDDA<T\|\UHHzOF)T?-kX--"""""""">z"ӿ՚9g:uD_享u_wEfHm"""="""""""" >`w3X("\9k89VP-""rS@-""""""""As:}sr{Ӹs <&ֈȭd䰡ibh"xȇ!óm[y桿b1ٰi33f6ФqCzO`Yfc*Yo&|i 875oN֭ -L\|WfHMM1z*UȣzV"Uo^WjqۯK뒥-YbII!Cr9xKfc.=YޥLJouILLarϳsn>>轒@ݩZ2bY|ʕ*Yפʖ~mN?̩Ҷ|Foga)Ud5_|T.]l{\hXX8p/Gҵ+L5>޽{INNVJ$"X ytN5R@R%KҩTV.\+ns8?JpPgΞIٲeqwnFhhaԙ5kb8fa&]jҼYS -[e[fc/j$x}x{!>|,_0OWQ=86m0tut9)_,ʖq/ P\-X8sy\I0ue׸QC||YrVhQظ,iٝF urQ{tN\ĎhP^snٶ7{?h9~!̀<< 6&N]1ԮSE ͜3]M;Bjۊ([4cFz##)Zre˺U.y;INJٶp ^ǎ>wO?!5=q_~Eܕx{CX~5dټmjVoϷ{,Gɓ'~A{=ʗp6"{f9K.|wVMAeJ׌͚7(vmԼ5ӌ@Zdɒ.uw,YK8u{<>>$%'+==q]uPȭȌ3 VsiJLL,wXDDN,Z{P@./H^KdfZ-|8|$q|1~j֤ 17VOP;Q*3g2k222\" .2+V _@QsW?Ϙ\MǎVO`Xpdp@DDDDDD/e48g&Ȫ-B[V3&R8-"),j&SO{zzRz5/{=z3mݾfMwݨj7oܖ^*Gw v;WKN5g>j72hϞ.(X0gRREv;7.;vzĘ;g$?ۦ5{??o1`X\HLJ+hִ)g -VtnwVW慿?qqDDDDDDDnt5_9-"3gwK9 d|7o^<==ґ`#(0222-S>wok.]2P\|<~2~~7+%5﫯4{y/"3Tʕe/V)(S ן.c\QjUye J,nl9~YJ*EP`~38wK[ΦͿ~oSbw3f(Z(?lfgرk'}%K1c.]MɚIiE-""rDbb"(XCbEVo3g|2|e,VsQ4kv? CgɒXw9f6oJjj*֬3'.>}zoܱqf4j@Z5رӹx`P ujEM+\.\HZjyHDDDDDDou-6Qߔg݁m噧[̀ACp1Jvfę3y[VۍzFz[m鞠 ڿ,Wfw3rJŋ cʕ4n-IJN6M./um+s׮,]NK.sܽL+) ag2~hf8H gchF iILHO?_~Ml xhL6xZ>%KdaFאi8vzu90vמ{ٱs7oyΜPJ%g ހٷ-"(0K;و=ۖʱ'`AB `oq.`ۛƍa&rl҄&o޼{Ԭ^>mF5L`l6o7t'O2nXj <Պw7S@gېQ#$$rJ2vo[blw {;3rlghL5K^϶ķ݌Yq_Fɛ={2)xбC;*WDbB".Yf,C׏Z=A:bTKƊ\MYj.^bT} iĹ4g7nsjbwd?wN;1qq͓<o;m9YX< ~幺{-mZI  ?Gɒ%s׸xqI&}-Q׶+_O?$%K1l߹O%+,̷@ ?qsrp1e;M:ƍs ٳ 4cO>w\ot ^^6N1h߸s` ;{b2clsM0z2ݺʄIns 3mܸn-v]njRv-]+~ui 7O,5V<9BwmsOL%g{]jLl}gt}'dGݱ.˗?ڲlAjj|ܨJ(W]%j,\5nDaDfЃ ?͔HOŎQ5[?ז3gϰsbooo_?~^/PRe:<OO# ⥹nPdql6"ykTZ>{6"Ι7V *Dg&l{Lx3/J6m%K/_g#뮺o5rԴ}?]Cs]٥Q7h&66ƌ3 3c,Y =RZU.#$mv.p*, }e'eUddpnǑÌݬ9B~V޳Onj%O?$Mw_i|)~[ìh3Bzr1ΝwLp3b٘1{vGb̧4/}~Tgosr%#G菱ZDDZn4%O>>7zϾ(PGz %~s5ֳoSo8Xb{goظCKU\fEU(_!,\}2\KFz{3{% 1qq9|Ξs9 r%"Ν#5%/ufU]+ҝ"gmQ$4o'~ZNR+W\>z()(^̨e:r(d6͚Ӽk6l3LR 3כ;@*)X0ertt4Wc޶c^^6ڵ}5k7^w 6SZU+ʁC4w/ǎ6+ڬQzy3f%)9)LԴlSNlΏ>Ar尘6nOWuVtV67w֭HJJ4kq'xxxRL)[u5h&"""_"""""""""^TxLiiixzz`={QhvEu9hwr UrcJ*`8qQ:R ؼm\xѨyX=t8פ ǎw0پ}5jTsר^+W \+ժU%--KcbIs*y 둖[֭`ܿJFF:G pBϥ덉ȭ""""""""rs&<]  AV )ٳQΞ=Ã7ѣ~:{g|ҥ9s// r |h#uRf0tW;o{vuFy.\nXѢ4jԀV\mQi;B*S6dF_JL4{=ٷ}ЩϗsםTXi4~G)U$%66?.eʔf˗+ ϷcDE]7/Cřf>lug]vؙm̬Q\|}]wu'};v&** <?nڵ{7+VG[Kl\=^{%0ÑfZ`I[!usÍ1Z*F_ñ]IÖ*n"""""ߤZDDDDDDDDl&IDD䶥ZDDDDDDDDDDDDDDn """"""""r49QDnw9%""r{R@2vg71\vѱC{6_k.S&ӹsGMY|qB.}U*Wb5t?(?$'4Drsr 'N4ofX̞yPRE8'e˔aq.=/ow\j۷lRl߱èiӚxK1)^]^Dhh9֪EZ V_߼XV3BBB3fWӹS'&|%m۽@TT$͛7Cۊ̚5n4Dn/o8y. a_JDDDDDD_MiҸmKF>543ڕ*V\,X(k[W[8sy*_|'44f V\S~=mLjU]z*UH Y9X:gPWTgԕMâE(Q֭]֭_@5n|=5":NDEEeV4nl"""\i .q6C\7m"99-q?Ә9rM#((o&N 5-OF}J\|O=$|<~7f { l6C nڼ:+97/vܹsEː9b/h !+Ubر>}ƍ;ٗɽ!%%X;y?ͥh"2 ۶l}NFxmֲe .\ȖیFjZQHMMt2.uw)]'/~q6l@>>Ln&ccȟ/UTERRy||n?cE?:jb4WFvz/]Fڵx6\p[qy{п/~p!ϟJtx,]ʗWWص{??>OO_槞xǬ~ٳ͓2K'M򲑖J"Eȗ/iiTP{PRE~ߺ5 5nH2n^]_̞{j$ Y?^7=xs7jDn!&Sۯ-+I:aΜ} pa#tδyxaڍ<<<țf&SnTת]Cv%Kѣ(P!(( _N/v!2%Gw.tM\BwNU`k˃\ҭ:$$1eN<@ٱk'G%88@V\ͩpV-[>b,{$&&Wq}7999-M,yyz!B!Bdzkˋvaذ9s..΄GС}6h`L(J8\aڗD<^qܾ}J+R%**ʔkֆn]pIӋ_Wԩ]ppp}4m҄s>6\]]iҸ< e=+y gϙ^,oXf-`l>idޜ27LFRq-0Y1[^oP?nhXC=+Uz,BYB!B!?+S^xAOfQpQڵiôd_сjz223-:JV- Tj*U/ .`]|4ˁCqtt^0[KI3;wNfv}|eނk11$'Sߏ=j:[wJʊݻsr WYCKm?5rrr =KQ-5j4hPTSR]yB!ݤ@]we[%/-CYz}!"#6]p/hblV5kMVܜheY$ʇ3gŦL~t""3$##_OE :N]n֭ eo߾+e3grq\|>Ibb2l/˥٫ќ( !B!YDFEѵS'˹ꈊ˥|&Y̙7ٽ+GRRS En^²srg ߗ]:BffcrSޭ۷Y2 _>$&&R 7oݦi ʊ}hn݊B3B|ރRj` G_^8:ʤ)SU@R XIͶnj7XP}s IDAT"B!⿓Yf)qqq4EqqqJZm*{{{U^^U*Ac0\ӲuBgl#zFG_i&\׵@^2}FɅ/ӻ7<k5-7grUڛ/[d-lmmع};XYJ!B!0;M [sBqwVG y yDPd / ?__P(AF xRqȥq!Om$>>2x?NAaUBP(z}Rr333Je>77W᡿A<<< ٳg@fPINN6F*Ȩ(Z ~2Xq̜5gggˡJFj&B!B!B!?ŵ.NY>rGZʑ,Cj?a!B!B!B!!B!B!B! 3B!B!rrJrdMW!B!ēIZ!B!B.6}  B!B&j N.n!!'&'ZB!B  c 62s-/HKMFP P)Bw*We迎B!B!Zc[okk/tdiSZjkނGۧ7/[.}|3zxV\"x~h7lIc'XffWF=SG Y9<'܅TĂyiOH+ܵ ƍCNxMw8{Im괜>s,gҊCvh4cbرc'/_LUۇ *‘~e*^d·(x{{<}dDj ?G9VZñ'Mc5j`@gR~h;v]9999f!BSHZ!B!BeF J^=XRRR4e*˗g!GVŎt8{ll0~s';3{lܼ CѲy348~WSgڴ6 ̰E wŨQ=jYq:_dTe;wң[W<ʹ)ǧ*Pp ]`EZ|7_wzO>]@hܸ!ZGԮU\ٛXmDpH 2ھքyVBn2+F P*9u)79} #ţ\9B@tޕ s)SٕaC+QS*>Jdd{Qޠ'95{;;SNx{{pWT(]oRj2o؈#ڷގؑ/r!nnn_:;8΃P}YYI!xRB!B!]bemEއƢޛAN˺ ?Ayck,Y .-j5;v!)1 :ww'%|6lI SLVl۶pի!puqax2Sߞ >e}/pAԬQO|@r ]ߟwZr(@zZ%kU<w s^uYTj͚4a/HIIO9eoLfZ/˛fGLCV]KfVڷc;o1w|7|xixqiu<1_:2X".>oOOەGFEq7?^x>Ɉ=) ^ΜeÏ,ءoLĀXKNM[~6T1m[`N-Xgg g%RR9|8V'4??_oT\ĤDc/řӪU T*nͲ 38;;1i+ԩSrhZ""#ٺ}G0֩͢?o !B!$dfd?v4xvObh.\Tɬ@pU,-[Aߗpq9F*]:g~{693#deg銼FK66688k9T"k+klmlVQv-zEjj*7o`=^zddfɧ|^~d@|K @I*2[8=8{xZ/o;/BQReJXxeoѱC{<پ}IZ5C5||f9bc=wY `!TVxW8z+׬7cFRŊfF Ѱ~}n޺BCAk¬lǸ݊dd3rp}/ 888ʑLjCmcv|t\]غxn޺k{~4bqB!B!+&4,ܬޠs  Ʌ(IޕJ*(PY[QREթ]3g>u ]tNZEJcggBQ]zIFCMjZnW\GFpssJi?ǎ7+ \F]MgrqQ$ Pr 0NPr cnjb]$&&Zj옑ܺu.[kͺ8:JΝxgHFP0N M6f葀GJ%9˖B ` jTnp-g(B=1q zBпj A70 !BE@5z.Çȑcd'vڄܼ @j>*ܽkɉ_ e;oqdf1r)7=#7^zq#lcOY|?:ulO56}.^6̏kV2|[cxkڻwe_X2za*Ph{r IIB!B!3ް]XJJ*%5lțoLcl߹ttykdT*ez)25qnٵetmԦ7)4 .^Fӑ@ry qŭ;lem^3QƖtZ3[ t:GkNt,J@ieU1$-=;;"9Z̘xzT**ljS7Տ_-66E~O5lЀ3y}mmmPۛ?+\=w2a7A,HHH !reT*5#^PPPݸLATmV.iakkc^x)ﳽ=j8IIIx6MJH\ڵjRf \j`Ǯ݀qCvpaS7GGN13sko@4mZ"1)THLH嫴mT.^'!9lxwʦƖZB!B! ,æXZF+mӊ0֬[owh̶"=="G'g_c@Yh uDdA4nFCZZ֡'NM5\\.%++ N'9x0`4B f񽼼Qxioo/s imjJTXo*ڱn완Gs,Ze3-xn5/6/(Tl9TDPZh bij ^h>fISXz +W=ðaCHHJ|.B!wu)j֨ΒE_C}=qqxyVV͚fy-5ޞGvV6#YL4 L,k^Y夦ѯOo|߀C>Z{3ѨA}3,Š9]{2iT1-f}>6ٔRv-]Q<Ӻ5SxУmV=vܴ۶mi |-e~8@ڥ˿]a]-Ι狼o+Vqce^Fno'' իU3[mwr#wZX MfBGEEeNE.H0iƻ5fÇ2Q79xwgE> !B!QQ1(ٽ;!//9BTnEFF::ˋ%K1ƍq=(|x~ }.#qtt$,"ҵsG>JbӯE$g;z$=~~h\Hxxxp-j5-[n]?oTzQQQtlߎDzFqqi؏0z#!1GGGTETi݊Wƿ2[R|BG>A6mZ2YYO[2%^@jޥ3{9`j^ܚUT<-8xwf@bbbu=|[A~s I)ɄGG9:k=w ߗj>>ܺ}4GZ4oFٺ}yy5#32d`rrrj>>݋ /QS&Ms;w)qc;w.\D.b)J-}R  q="^ann\]YJE|]/:!{/zSێy ?!B5K ڔ=ǙSdz` KMM+++t:Pz^Yn/L0|IbmPJXnCfۺ3[B^*Z*jRuYƸT}RSSK-NtڅP-Y ʆ7&Objl۱)r'lYq,(I/66X]ʧ~;Zf℗ط9[p !B!ޠgX+ 66/~c6=[ncmfqˢ~o -̌yaeUkZJu}~SL{Ep<,$%% ͗/b_S{D1o-f~;},&<}ύQQ|0kw]yeS^൉QԄ1kǜ*^LYyc$J%~dT|}Zj}ƔJ%͚4fނТE3#"K,Nk vv?sBF ln޾w?+fy>U0b+V"|ت}0qK2%T*kn0fk~_HZ<N'RRS TB|VeB!B!B!B)5k"88XHKKST^]TVJ^W[R`045-[9F􌎖\ӦMteXN.nR}dq|4!3exy‹<۫' :1*xCjFw<7%zpR-CB!B!DQ CߥDb0r9JPZClo!+r) %o"?l,.BW(W >eDck_P$)4^dTO?'r_b uGB!B!Qya˖C `ܹc9@m8iПj[oE#=SZjkieҠ~=yM}QÿOժ>5˥Wظi K99i9l5DemwٰaQfyMzu"-[4,nptcF761l(u^k :}}ck߶-?C#%%7ٱs7IE;5_~^OTt FpHeB!)P ^lsiʚS?y2TN_NXXeX!B! ̶|ӫ*Pʗ+{!:&~CY"s}`^ib[Sqqq[̤ogyiG$$Y<24lЀu뒗g9T* Ljr Ql,zڵk0x իWc񒥦3lSnyqBndSre\\M9B!O"j!B!B!UkZQBEKHOO --)_iF\|V-Sjg!׃u. 3g M eƍO?!fceܨ^JmM5a,4 It:=;Gѐf/qtW_';x{{'̢]Cj*V$%&s~ܴгX2B!٤@-B!B!~kޠ7 U6(lKĬfӲnÏgfХcGޘK.3elظhZ4oƘ#y˕W̲+ˣgnxzV2=N^G-e~n޺M <r,xtԑ?m!2:{;{jT=9L}{: ?]rI ?ɯNΆ5$)%''իZeMV289s#hhڸjVy8yYƌ9\{88}n>|D]?Ǝ5NL4׮~Oh4F JiExd|aCPl gggSdXY[ѩC{f!:Z0 ɠ2+r~٧dfeGsL1K''"kH z4ż*S(("2F`kcc*WRn]0yyKbccøFŶ /LPVPۨQݺt䯧L7HfkcʊJ+2| ,Tl]QѴhь}͕ĄD>fTj& Gctԁ^OUm;R2" W_ϜO[o˖GrTjzl!B*ÿLjreHIN.n!!B!œy^ړJ6 `eE_J+%J =fm,ݸ'sf2|P.]1[J%j֬ݻ8r8۷m\ @ݱwYsIJ6Cnf[z5:o 9p0A!7IMI)Q:Bè]׃8~@PRiEvVi)`z”J%5k`u@cGxyyyܻߔsESR֎[qq1 |}}E]f칄r [ 't 1rZ5~Ÿٳ縷^]9FbR"QQ8v`;+ǐAټe+_n{aPV\M yy/]țzuj3gǛ?XM#9s%JZHo7 _k_CG*T퓯?wWZU~}Q =LIKKp(ܜ=s[ѣ$~x{'$y{eo*M'ѣr:zm<ܺ/7}O||=0IIIc{Bb"sعFtt˚jea&]#GLqM pyoUxcGvCdel< ~=ȡÎlٺ/a)S$M4+Zθ羿zNECHH}yfWwv!22 OOOZnŵk<fn"3gCM+ K5ڼdճ>Kqn:[`^e5-Zh|V\Ţş=+Ւύka_b c{׮*] >dIIFOyC{VrIG3֝<lٻω'gȗr߻U哏?"""""""&t4={3?`ǮQ)Sٽ KB\kbӻ7ŊҩKw"##ohѢ|ӲwĉoN|ڳDDDDDD_(==Zz:{>?c'M7Jt7g= µkטt¾abK)N:˩&""o`s74y-&?n.|}Mlj;k~8u^Q[JR%wޞ ;mGFxmֶ\xmw5ǷFrYH)WpG8y\4n $!!OOOF}I34jԀEDDDDDD6 dQUeK%s'u۬o0E]rBkQ@G>㥝4dXx1\z{{﹇~}eK#o/?:=4~~~<թ N`Ӧ|" x ݩoS2$}θ8pY~d\<{6ޝJ2e N:W^Fmm߁?-[47ޗwWS:|86ڴn̓M22#5c_~M6vm%[ ,r }ҨQ:.Ψר]pa_<f. P9bbb曥έ9:|]:wbn? DDDDDDDvi#Ɍx]D %""r;czK9ڹsݝ{o6BL[l6m\jyUe=1u.!nV0p -ZWǸYL_"".[rsw 3/~aԬ^4֮z|ԁ\z\Sу]{vsQc굜 ;k, ?9_~呇۰w>VZMre>l(iii7ۙ%ʬS;lHKK3/gsUl6DGGEDDDDDDvƆic -"rs r茢iP;퍻;r)::\"::܌1*+h|41,ٳe.)))~)\0|p .5Nl+Pbcc=CCg6))ڹU̞ @Z53x6/KT l2Ejj*Kf͚inSLt >>>2NQF+ ǧnX,|| BrRD 5HA1%." sU[p$$$LR[ oF\\y)@sbDE]v f;y}ef!hL@?ov=1l,ZDED9ujL4>AHݺY;Ǽc^͸<#ذaQTNJ,E9ݜȫwRX1.^̓]۬uIԮe.SB0/\0{W.ժҦMkS'Y>4j}ÇDDDDDDDr9ڒe>Wv!NJ(NB) 7>LD$IHHɓӎ 9&t(""" בʎ;iբ%<8sJʔ+WmhAs[} ٻ连];wӻwOʕ-kZn݊p K|ݞKÇaXXKx{#ߏ6mbA ЬY3ܝ:F e& Cx6 kvm0IIIcyEtL 11_MRR?-O֯EfԿm@@@}j8lٲ /]tY+ \vU,#Ίy,`seNҁqMZK]~1<7r4_)4vْUp2_"""r[Q@3g2o,?ŋ?⥋[&}L.2xu팟?|tW|M1k fϙCtt whO їg`ZY`޽mwګRHaOӴISjլh_ԻvCvNvuݧwo6m̑#G)Q8ŊO?sYӳ-7gݺ\mڴJJ<7M<@u? #n'͛='Xݻve|'\K^HLLdn{3]&(%^nvP;Y0E< X!  ,`XdTLѓq/0)=ۅs sȒJ8tT̵wOp{/P@#Gѻϳ/8.\O?_~}R]g؈8rMWxo?Ȱb8~/<}}g~t{Fj0os =FΐIOOgM̘57&ڵ^~4~1?,i }3f86j=^^^S_WrO{x'8ʠCزuK_pL<ɥy=Yp>p`^2C};n ,D 4;#dB\BjűhB%=3.2jLJD@|;3~5%ũ2;{kZTXAA=wcǎccdbرPKDD%66ll68nHIIV;=='==/615AtRhwW.;ws;L̛K9jyE~CCv4o\Q/W7/EGooY"""""""P;ɱ aUFxs5[291ӹ "X;%Ng2˪j׳[4 +W"|yډ'Y6hZM~\6xX,W,Kn=<j%ya8y$Կ^ty >;~C͚5ٷoyY;>Ŵo8a9,DZG:=wόjF:x%e\f ED;J~y-""r9m]/P-H׮](]$9{>/0ҥƌO…KwAA|ŗ 󒈈?&#θȊ-Ȓ?[);E.= oٮ3z{A 0r7)󌹔/Zj5+W6oȪk̥;'9y⤹,""""""Em!+Cvސ; ֌(+Ʃ9"r{?kxe .]o՟EDDS@-""""""""7Œ\f.gfY.3o&"wl?fh!""""""""N([pΪM[^8d9Y?^r^"""+""""""""rc2BjOmnHH/m:^:FʎD:rΫCᴈKosIR撈ȍJtGl `'(;EѢEͥ""""""""rS xey{%i""""""""r^n.07*k:[ȿj9˅,G8m`,{ED$(WS@-""""""""79&:g&ZdwS@-"""""""")_ѳB';)oM`+V>1HMxӼdܩ#=uuvb>by6fi>5u6o1wƵkc&yuVh6\V:S9v!U*3mKdTSDDDDDDLjAjɷ1˷ăMPd̼d\"ݝ1y.=/]bķ\jO?$˲g>֡c zyVYǼ(]=uD.A~թUbwAc͙SzfϙG\5tĴSxD]rmlݺݥvEGسw{uww=)|[SOjKʕ*s!˗fc.=۰ѥVӓ/ g0Wn޳7&M1z1tW|w|c1RjC6R RD%JPbE܃#FBbB";uc?pqf_"|o*ɩ)cb#3ak7n l6^2k`K8x谹E.Y < 2}U0yT\Os4jЀaC9%w{s *a\OjY1jՂHvk<<))F %q]\9z~+W#O:ק' Fwn #GYp1wrz'zտGs/v;Q@~}!!>w;V oNBtt |4:kӣ{Wƌx}x(\0timg3:c*^A^2{=y քq.UgRF խo#wދ6ml/7w~TÝ⁆ Lz_m3Ou~]wQFuX.gϑF!,g^-*}}Z~!sk(Sm֭ۉrŋLzsmc'xX,]DDDDDDDDDDDDqqJp:vczK9:zݝ5kǟ{1ѣnj9;iټK->ՊWAT׬YǎvҷOo3)ヘjaDFE[ro_.]X@N9K!v6nv;~|Ez @xcGr;;~??aM9Ӫe7@|BZEٿ7lTRƎFn_ύșA{k3#[@}5:bb\%""""""""""""wΑ#GsL|cꝦȹ-oݝȈ(funnnyUGl~g>>>\8us+ao!RSR e˔ח?w8 rf kٞʕCg3GQfロ ?FjNjќЃ>}Ya(6t0|r4n˗yŧL!B@NƲevӲV% OJvP -""""""""""""rcOjj*E5/eP4\"0(\q f ?_rY7bcc3/@tl =Þ} II,[sMO!KLl eMB5G C_3-[L5kԠD|%xcfEÃOt`{߈aԪ~Lrex9qss3jdIMMe}<Դ ^^^e+SLifqㆄ<ԕw_Bb"p{Sbʔ.eԬV+-=3gr =w/ct~IM =x ԛCHz^bŒw׾b q>9{F :8y}5~~\rŨ=w.;uv?]ŊX(;Ihڤ16I\\g|hьˋ v=uW.g=)L܁lhΝoeRsEDDDDDDDDDDDDnG pIy>{}Vẃl޼ݻR,03g ;~ի 6À}q*,`}g˖=X|s [ |y,evf:WGk@i-$&&\֬V+ԭ[o@~uiƍU k}5:kXG8t#GƎ]]ʕ)_qe^ϙ7%Q#GF~|gpgL~]3:B5y!..%8AA%pw ̙;o~onQDd$yU]|VYg^-) /Z~#ko4oȺ ',,1j"""""""""""""# """"""""""""""Oji;X%\)jQsYDDDDD$W Mb^6D'7DDDDDDDn̎s%;8Q@-""""""""7%B OlxlfɢZDDDDDDDDnZե'% """"""""""""""OP@-""""""""""""""j%P̜Cy8 IDAT>3go.-̛˔ɓez`-aXX`>}2/ZhΪ+E ӣ{7\۶I.=ږo|ɟ6/?2d t^:cǼK`ۖrug~~~L7ի`̚9`sʖeXlڰoZOw4VX]"""""""""""""/wsA$7W\ĉ-Ѳe J.Œ%_ !UC8zwww*V̙\z.\Q]j=zbܵ˨=tG^>_G|BeLo\qO:ԭSZx{{kܘ9}1c׮ҧwof!t'22R2?Ȩ(\.]dPI=BsN/'iEDDDDDDDDDDDDnW %ߖ-_β'ޝ~xjHU?@l:|إ'..U׸ ,qcYfqqq#L~_?ɫ1z2jԪU{Yh1S&Of~gZ $  fmٻe/gn4[|1<_ 116.~=oOć~DTe󲈈mE#Bpy{1jy_3ݺves| 6pKnDR%2ykVd,^M|3#ٸ~3(m[ֵ+C _aݚU̚1 /ǏcݚU]ѨQCvlB]zͪPJe~]5;'!!U=A]jgϞ%6+͛?lʖ-op 7мكFnI&DE]6iHm΃MڵkSBEΛObb"VkߦD>yIDDDDDDDDDDDD䶣y\>ùs .^@ҥRK_ IHHgL{w*{ȑ7ܗ~̝311<ѡSߙ¨ѯ; l6'zuy؟+97ҥK bL{2zzMUʌ39} M4GmAIJJ2w;ụ*UҸ~Nczmfm>ŋض}Qp|k$$5+BpyN>"4n $!!ڵkfgT"׮űr*ޟ> _ӨQ.v])AWgw4u92^ {ϽC2⥑7ܗz???ԅSNif|`}B Է)Tg>gz8?2?=iNl2SN/#G6N۶?-Ms)RSSK >mZMzϚ1/Z¦M ;6CPԭS >} iiiԨQo~gkTw.RQ/___N 3ׇ n3q8f)g̠jj}J \tb!==eMDDDDDDDDDDDDvr5rs.㵻;ԫ~{ݳ>lΙlmڸsss˫zncԭ͡Ç]Bdo`(Z(W^31qsDD\2h3g(^.éY:iii]5` r գȑǚk9=vֶ#X,~r Ͽ#a}Z22|PҰo3b.bbZ#Guv,п?F+WlmEDDDDDDDDDDDDn7wL@<痷7D\0/ec.M@?nnneԮWre-~_Fs2QQǎݔ|?Cp.\s>w8 |et(@@`ٞ!rΡYhԪUOfvDGGN;ϸ޵km0IIIcyEtL G#5^p`^2C};nB3[@||TyLȒرc-Kll%88alnqqqV呒bJ':bc'oY"""""""7+BT]z\`q/cc44[4_&e[;rb8 #9>>>jx{{ۓ'NHI LVZj%ya8y$Կ^ty >;~C͚5ٷoyY;>Ŵo8oP@-DRR"]vtxxxpYfϿܚK"3v< 6/ݱJ_+K"""""""""""""%^}1r߾E+Wf YztG;y$'O4EDDDDDDDDDDDDn[VsADDDDDDDDDDDDDD䟠""""""""r2DDDDDDrZDDDDDDDDn'6hT\ɕj"%Sn`.M+ZZDDDDDDDDnu{ʳ沈ܡPM,\2|(R["""""r """""""""""""""""""""""""""""rK([BgPLyk"#_yݴiDDF2n›%CN٭۶3/, ̘Ʀ?K<ش1COѬ[%|k/W?4^3[׭[鎏TV^dT£!Jeʔ.+yscY"߯/_wG9fo(wzG;t$..*6u {%2*&""""""""""""rQ@-}5psxiJ  +US\9f:ϥKK 駞$|Yg:A/<5똷pKGΔ(^%ȯ]:j#Y.h9sssc[o9󈋻FΝ6u >7Ql۾#bF pG^x]EDDDDDDDDDDDDnG %~w~wsԓZr϶m;F߳}[66Saa,K6K_^`fZ2Zl؉omێl#=l6~>)h p!ޟ>.a`h~ϭZIoga<sRRE*UYT?,p \m|=M4ӳ+ҥJSwaUǟ9( gͭL-WZV6m2gf9*g,^iVZfT\( .62?[-ڷ~|sz[n?~>v5['+#Mp}KTt1߹&ƀ:'=Ԇdlݷdڶi5kj"""""""""""""y\)9K|BSƿ4U*Wvkܨ=kIt҉7'M`А>t}]sߙEJZ*>գW8ɎQXQ DhH({cGs߯1;xxx0exKbȗ'NpRzL:kӰA=&Mjl}!yE3]:!K? ͕Vg7Ϙ_|_@HhX JnZZi%tXөY:h5WOBBϛc_g-5ǟ%N';bX0EDDDDDDDDDDDD ;f@ݰasSg_RNm͟} piciӪSWjݽS=mԩũg7€}!.6.](=/anG/\@~f8vrv|ێP%&&"kN>3Axx]wq Cm[cXHv6mMVe-Wp8wv;@~6G8.&6݆'qqοDDDDDDDDDDDDD ;f@s#b>#gWf7...yUsiqv\x,Q\"*/V|4@i+mv;_s:m6u,Y5kpmV;v73C67F HKK㋯6мYSydz9gJJ(AڵœSp)HLL$--%K7-k-NTt`6PS<9ۧq># Iɬ^DFFYiP}%.>"ٳfPNmQ#xe:q'g^#RvmJ.ŧ1HJJi33%<<F`יϾgC[ns]+pʕmwvCj䆴4:̃-n.;\)rvf?uw-)G>9t(*+Q\Y#ZnÈwyCCO˷?Z_;]&80ͮ={AFMٹy,m[?t5xR%| ))撈Hy`s}fuSTIV;1""#>eK 1~bE|'ٞri3OGQBE&Mj|k22 Us^a_Cp<9vMkd6q.@:<oo<u¯3A,Qx1,윸Ѣy3vMBBg|nݒN&^̜5GbE[;s%/v-eϞ;g l3O=ɫ_a$$$ЭkgXf,k߿4屒Fj2.""""""""""""Ri@3Ag2E fqJM[.vٞ)0^0gn/?cb:rA f¤7رƊCv7lđ`İ!XV>YrK&1!/)˺^x ![\ Z\)p,?N&L`9v%<<o [vKBBpmvjOJ_o~^"c˜߮aȫ9sfoKNwxn`?:oGǧzv#Q\F4\uօjK>q8򟊋2G"""""""ΟZC̱Na撈܆ŋqǿ/\96xrybD[,xÑ$lT՚HIIIsexzzfeԬY3cҤI7mhۺ +':r<+Vb}wM=f.ߑxG<#RRʅXh k}inQxDft*U$[K"""""""""""""hr߾_m;-ٺoBppۨ4Vs """"""""""""""w jmY̑H4fiysl{MDDDDDLPD#%b>HDDDDDDfNruPm9I!vhAdҀZDDDDDDDDnat^[Xd pX́AjGh@-"""""""""""""" ̝.sk+.^Č̱b׎maXXt }6w IDAT mZb?˗-W:R@%ݓyfN=ځ?e| 67BN=jbXz{⻍y{{3y6o~a9(U$&gع}cws3zY۶W"۝"""""""""""""9Mtt AAg?M֔+WիטK5sq\]]\sstnjuzEJw#ܹ/?#~1+T`@>;=Q4_ǎcZp7jٹ0wcΜy\O>}t֓p *݃EKp%իC~})Y$S cٿ???DDDDDDDDDDDDD 2 %o ;=۳'=撡F < @ʕqSOBB6oq .̤ؼe+ @0m~^}}{5>1_nݺ:t+?a̘>:6kۦ5իWcau/:/=xԫW۷oϷ8ڶa餧/9c|!QH-R@%ޚ9M?[YcԳѽ;YJIV-[ӧeڱ˗Ңyss[`fZ;z4;m5?v77C1|(?|-[lbޜ7zy1eDn/fʤ4mzVZNf5WZ|sRz5\A]FuˆjYV(T7n4 *m۳u;h#s8yDFFiZ02@llb8ev&))?┋DZAUx.\wp%ʕ+G՜^ۛ'Or_~xh|RRS;O0;X)wbۙ2y6^ ۇuѧo? vg ̘>z=SI53w.iѼy4^u-[Ƹ~klUطwc :tx˗}FfeHIM12T*9Q).޼E3gh~ .̵kuosɥKSu?3VOq$0MlE*nJ< :zol/۾.X,xbbbxwQ#ϨGr_~ty3<ӥΝ`]d9` EY3)_~3g=ʼ>4??oϢBP~}Fk|O{ۇmZ2Mkq9%Fv@>7g~;w64_K; =Ozz:ku_yZ-jds昸xX,3=v;^^^7m .""""""""""""R1Օ+Mbcbl˜W_UYlS?M:m뜥aa1Q@|C]wQhQ/X4@B;Jg~Q9vRS3Mݺux|խCllliGnϑG 1,vƌ~qcǐ>e˖DFD9zѰAt3t ̗7p6VIٍLDDDDDDDDDDDD cԷ#!!4J,a.QϏ(l^}gϝnظ8|c|}}þ8AFIRRW^ iP㝭+w1qx)b4hpce_cYO(oaYׯO2eX<糛x|k%J6wƺol_gΞ~Jx׮]j*,YghT4*@LADDDDDDDDDDDD !--}Ӷu<<Mի0yomyںm4ҸqcrcȈ(\]]VԪy2\td\DDDDDDDDDDDD <̙;ŋl"VW.Oՙ:m{棏瓐H]aٞl:v|ys0bcxT Ę㌾C5kp8(ZYtoooԯ@I??nhAΜ 2ǟٽ;S&O?xMRR˲Vtօz˗sjתE] <H@V9pַi@Nӧo z_f|qSߑ@m(U$!!2'O߀ :/ns&(_/[}}>|tƌja[2v8FzÆ;3ooLի v'۶m'))f7j...qcO}Mp.8O> |M?5lO=c:l8{~p]̘>)˺,]ܪ}Ȱa8|8#fqa&Ltaݗ_g*+WX3.]FFF_4w{sLDDDDDDDDDDDD\80aرcpK||% n. VaswwځBV###3##;>)yM1_paoװaV.]W0zXsI~Ç 剎ӪCe1Ud.>Ou‘Jt3bgܮpV1,GvMDDDDDnJ8ؿ/\96xrybD[,xÑ$lT՚HIIIsexzzfeԬY3cҤI7V^^xqplY\m4u¢KN,\/׭N:>|\#*FN0ny8-""""""""""""AjG$''ѽ{7ʕ-f|Xs}'V[stJ8'LhѢ?V}?h.HP(}F?oϛ6[istG;tAgͱHe5"""""""""""""""$9ɑ""""""""r[ aQ<+""""""9Ӏī9W2G"""""""9Rxqs?GjmvȉkaXDDDDDPP_rԾkcڴ9;4""""""""""""""CfLq*sfoK]:lX,?g6;wUehьÆ|8=n굟=wUȢf̮={vmҹӓ&.>7’+III6zjԨΣz/W(˨gWXQ 6j#1>p>炃hԨ!nv'Oa 4zWY3{)4|#8$#hќ2e撡jʜ8y WWWX ;\rIS:ey*FDl޲˖SlYzJRԢnq$.+= \\\1 |}}`1 Wֵ g͠sÃwyBXtq[~J{WYџ݃4JJ2U8Xl1]<| #t bz=X}q3;&Ǣˈ6rH|bE<ۃ:kQP!._ MXIVYc;v?%ݻxN~niKz fOٹ{S_^`fZ>ڶiń)owロW|4!>>>n 8z}o./]6ɐAq}ݿ闭L{crNVLʕxo^[sTR6| ds%^M0uݬEf*Ə?ldʖųHv5['+#Mp}KTt1߹&ƀF$$$8m睒ʾxMk0k}$''ӶMkVYk􋈈DPr~K/ NT\٩qF3j8%ѵK'ޜ4ACsL-wb}g)i##3ykL2m;v,vqc^^ڌ|y 8anqң[W6|!FRpaƼ^3z^u,ժVpM0rlO=4"%%׷nE6'Ox-[6- 76k۶5l4RR 55bŊNy~TXH:w{mLBJ_'TV+*TxZZǎ7ҀZDDDDDDDDDDDD < 0p@?%&2dHc{YV oNAll8ѫgwOr}d(Z(}"4${ࣹP )_CGl<?qK`䉔+[aԩ] 1iTc{-  %--\bImj 8_zƴ77BBòf(U$ukb5N+.NF#YE,xzs5*E4Dv8탏qq~bEyX sK>t}BPD ?BχQFu;v9o;mǎ| }c \ܵs' }.V;v8X,N{$^O6ѦU+mNʖ+Aq8;Gؑqs';R).nӓ8["""""""""""""3޿9ʑW1kwww\]]֑`Ӂ*W y9۴Ը?;OOO.]qsaWORʗˋe+>p !1:Jg7Woz蜇fvj}7Kv͚9hۺǎ'+͍Æ0r0 4o֔(s{,2WNÍԡØ8MF҅zu_~E$2erJ2n"""""""""""""3QDqs&}~ʼnvʰ_vY6x 6>G8|$!#9)k?7ܖh<=8 3ϼQ3{ ֩m\2ja\g?=nDkYԮMҥ5IIɼ1ms}@⾄G`l:ٷlpukmb._µ$#^tM2dddp>@bb"gg;*hpVs 7qalwwwsIJ+_θm4kvǎ+kII=͡CT\ju=FtT-_g2v~\-ǎj8:7!)]9f;1pV~W0pBxD+V~j\>hڶ"%%-[KN :{ Ӌ~yKصg>4_ȼ}iؠ>;w:o۵'|eӾ]6~Mgq.UW┋4ZA 1wplV]Gxx8Jjժ/"2S&d '(VW|iˏ/o1sڛ,] tx+TdҔF_~!W&#/`XY:uD%+^3Ή-7c$$|w-@HH(4iթY}+V3WrbѢYsV[l噧ѯhrֵ3III^xq_|<BχlͿOjT!9"""""""""""""y8t!_o^l6O+hq]l|XM3A՗11 9elv3aucEn~!6Hw0b,V+Zmn%ߘʐ繁!#=yu+ڵd6~SjҨA}| ƍzO͚5Žpa1AlL,ɓtX<^e]/Xk̭G}Al=otwzZ:~^DEEXr׮9*Y*тENHAdq2a˱c,xK@@%<%s10{.x-EDDDDDDDDDDDD?h@-d:=$r%,Zu_[soi.ݱJ*b撈Ha/m;es|KnkbEDDDDDDDDDDDD ,9;heY̑M4fnZk<+""""""7Ӏ$.&+y1G"""""""n5sr3TDDDDDӀZDDDDDDDDn[E_R;Z@ """"o%?yms:*Nmx&""""""Vs """""""""E% IDAT"""""wЀZDDDDDDDDDDDDDDP?B!s91c4sصc9GX,-]B߾%C֭eKճGP}{iެScv`Oٽs;5Ç ͭSOڵ05֬^=nz___FE ٹ}+\6\\\8?Xrhswض?NHAjDrCPYshӦ5ʕe5撡z?vWWW*Wܹz.]1c2^zQ]?p:w/?ȇL ЯNhT> XV<<܍ZvKӶm?ΡGh|O#s).Z'N9cGd==v2MDDDDDDDDDDDDD  %o 9=۳'=撡F < @ʕqSOBB6oq .̤ؼe+ @ }yFxƌ~ur!W0c4Ծcmg뀺Tt˗dEܹ˗1tc@ /9c|!QF.""""""""""""Ri|PfNgO?sV}~{tΆ_{vVk)e˖ail3vlchܖ;YVƎ͎m[ϼŷ͍}{У{wF }-7=>^^L4[6柙2i"MǾ{USYթV*xcT^c3WPרQ0㯚nֺU+ *ƍB xyz}l}Z|oM32}O*/]wMRR~DDDDDDDDDDDDD *CժUXp.\`s|ʕZjN}Mk/ µkx^~{=ɓn/?||Y`>)zx' ƌg;dL||}hӺq_nj]gϑf.1⥗lo׎Z`9sܹ KA,]ishyө]k\]hQ#o"!!qqF='Nҭk, N5P7lh׮4j؀5g8q:gٳWnyp\\\pw/Tm ljNCdȐ/Pxqbbb>>#\\,7+?xgz@Va F$))+V[nKdx$Nz_l]ųHs>A+ǿ_͸:ŗF}#R~}ʔ)ò9ݜīg[(Q/_fѽ[7}~cAAR|y񕮟{t&fcr""""""""""""" iii۷a.;V*+V4v;-[>#Fy]vrTV*j]yKzfzCӻWOs ŅZ4w[lts/cTɢEKxz[\EoCINNǟ~6qi^Aϓ7~knٹc'=ddV\x1[7K$';"""""""""""""VPaܹ,^eKb'\rWiӍޛ6})yM1_paoװaV.]W0zXsI~Ç 剎ӪCe1Ud.>Ou‘Jt3bg:-V|VqocǣvAMDDDDDnZ0_:Isl,bX,#Hl)V5Ñ ˨YfƤI2 jG<ø{s6,6Wsݺva%y.ZėRN>l.ߑ rsg{<#޽ʖfq>,>Ṷ9r%&QhQsUߟU>~4DDDDDDDDDDDDD $ zgr߾7mM-ٴy9 :٠XDDDDDDDDDDDDVP_XK}{oрZDDDDDDDDn[!4vgK'V *n\8wyn]ZTRx{ VejL6"2*ҥ'"""""""""""")<#4,\-kތ%斡r;~wwwʕ-\ 'd$@'|2Q{ "7ldE*Y>Mb\kRV-;Ŋ˪XѢs?CG_y/Ҫ6G}Yz]s[DDDDDDDDDDDD$Q@-yêj|[<[+W-CJ9r(˕nq]fٸyKӓ#i6pss[g>^<՘Y:_Ǐ}ժY;vǟ|j:s{Ç 칳||ve<'s7"88_Au e'uvj2x@?ڴnɸosk[>1jy?:rwߛɟ.e@>4nN'۷º72ʑ#rv*WHxoV[sTToW|d|94u͚R%K[۶e!&F@p8\fr9]HNNMV,r-""""""""""""(E 1m.\}LxD%SbE6ۛ#ǐt%!;`0q¿P!f3Tf!qyL*!'iV n1fԭ]#Fq1gy߯dxyy1a{^?ȘyT\4iԈCfyJ!)))}wV,Kppqz¸Wta;`Y6do͖W#5-ըf\-[֥#G EDDDDDDDDDDD$S@޽zr%1KdfZ-1y*qԫ[ua7<u| ҽw_΄`]p&/ny}&%X1a !9)%K2ܔh|} 37qq1>m*uj2_>13ϟ3v<;v4jתE/-y}Tfz…fGY]Ƴ___bzZDDDDDDDDDDDD9ב}y3/XLipV+TRvvMsCޒ}ORTIcjU8sї_~/b_XVm8ٽfYhY̴w˓fK-xmޘ8U~b֌3mZ†-qcX SXuKŊr1<ԔsKDDDDDDDDDDDD$_Q@s2w`t,]FDDŊrʼ c.2*)Ch1 Wģ*XE?7W`xs,X)tx-e˔%d$c.t:Կϖd88`|9{9"""""""""""""\qD]b/l6#X #Gm E8{ayfs:4q!evc.+q;2hO?[b!^Ā~/ҧ t_<^rqmvLWV+ cқop ;s4@ӦMb՚1ԫ[;<9Uv2Wtiƽ6ƥy=g|–,iPk7#ǼfԻu}e:IIImGzE)[ ΙkDDDDDDDDDDDDD+/ƍ>|a/_an VaOt:}N|Rr25Gg.4{l 0rӉd7-ySݓr[k8 X`5jTСÃGy>sᴈj-RRc?/0g|.=zt3 [d5ܳY&B ڹ#ǯfM?P.[7;+T`Y.3.^`.5]RB9vc:wĈaXz |˔WOK/DNO0"M IDAT#޽_ĉo"""""""""""""(<[bWd:sϱU$&&[jUq!*Unc.3 [Eq߰ӻ7+5f/3jԩS}OYh1SLv|VMv .^@RR\ƍ_\r8~ E@?s&%5ioC\|?(ޚʨcy}LvBhؠ>/sҳGw-[F=fB8Ns]3&Aj՘1s&gΜy2ڭӨHNN6ۯQd 7d®;|w#6С=/]FfbRRR(_KH%u_ --ҤI#.X-""""""""""""_)ŠIHH[ݵ4W_KLL .w5lH^/0|ˋ쌿?O> O`m|"gy} 7)\ϽC1gf(S4aaԫW{Fi篻 u}9U&NfU1aðlkۖ7g{֌|n@h虬~z,Xe3gIOOV|k^fjB aIOOg񧟙[;vg~ ł4EDDDDDDDDDDDD;&nРݻ߻ӰA}} p1#tδc/oqprMuu9zKp8Xj pчY޳l ٳ+Vа0j׬Izz:?ok{p) ":&\tڕ=φ?s:4b}YÏ<ؾgݺ.[aCÙor_yUΟ?onnϏXs[DDDDDDDDDDDD$߸cs^NDxu8sXpss#==jsU*Wf.{51Ϫ]XFE]Ϗ=ujk8 `vа0s7ߚΨ/3f(XhтH?gt<&Oa6IxxM oFBBiii)ZܺFPPD .͝:}zq雃Lqq4 2y] :$-2~k2W_6͛LգD,\IIIX|kEŋ6< ˾kJ瞥o>λ|ͷ1򃈈H~:صk7mZg`1TRemvZduʕ+o1={v{)[ZjҶmBˆ;,Y%ÆbXXCx{#<5ofA ТE,S9;}:ƍL|c^^^lǰ#xwXwߐn9@INNfOk-qqehcӝ;3h|dDp0^@Jr%""""""""""""(Ō37cΟşr1"TZIs7m>h6 !^7׫ @Ѡ lq?qezʕhԨ+Euńhða/q`BÌ{ٱfs[؋n sqt}ᥗcٸp"߯\2wA6mL^(V(ag:|Ǐt)z3h4'O2Qq1wꫯt3jHV -0ܐѣ0|0d˖̘5'pWuoڴ$۔o/w鹹qw3vx7i?|}?6h?Ç8h0;~2W\9NR˼Yp5L/;8h8Ԫ]]ODup/WwߛeJDDDDDDDDDDDD$\r1n8Ç-xK-V`u86ooo[jjZ>Nt'&Y5Gg.4 r1g5斈H֣]֛7d S:y\ɷ悈?A+EDDDDDDDo;X\jiع>MQ\;jBȿR\%sIDDDDDD}/ """""rS .l.sKjN1G`sɅ{s沈ܡnI@-""""""""wCut^Z\N'\;\'(Bb8-\:&0rkӉd7-OugmG̭b3u>l }͛2d:>fƍY+c\ٲ̝qm l۱ønۦ ;=FppqXg/dcZ<`;VLR}'j3ӥTZ cy ;e`A?}*U*S804Μ=˲oe\*>m*uEdTd'O7PGEE9===qsss^ri۝<&R1q˷}͛QD0|2TTcONey1{9!!Sfu< K/2Vi իU1:v8? y(ǀ?hwоF@Qc0wB.EGgCDDDDDDDDDDDD$Q@ʖRVM<==Oɧ[Mgn}:>=w>ΝuF =_.vӡ,sn2;YVG-7 vu6ˇ?& V-ÃCG{3Ey~ ۇƍd_XF&BC9r$#XNJTyknJ*{/'ռYS<==XZVdI| `_L0d`@^p8ۥs.iӺK\oPb̘6.^>&<"ũT cHOu⍐q08ysy_3ߙFJZ*<`{&شe+wd3e֮8ryų<͊W2`P0ƽ /d̼hTGsry4j!<%gwՐ_ݾ;O%8q=aܫY~0۬MVDDD}FfjRS3˖-R'l6(P͚K5xst49=w7T@-""""""""""""^CQLg||׻WO$&2`Pc{YLV7&O%66~0zu.?ⱎSPA˙3ܹ9䅞ݍ:O Kpb :x9v-0/Z̤ )UgΞvZ4_݇?5ojܗUv4s1cCi~m8_zWΜzXѢԩUϖ|ܹ󤧧SZUV|ҨWZ ~~FSOs] zf:I#_DDDDDDDDDDDDfEEE9}}})7hР6wwwnZ,} pFݻiݲK-9ՊK?mk׮ɉp kL  .6._ &Vi\ϟ@"A9{ժp8زuM[),HLL @XXOw_l%Yh ⲽ7@+n[ClڼJҿooڮ;~\{~Pۤ,_W`nח8?["""""""""""""Iʕ+sݻK+`|퍻;QY&\"..HOOrX<zϥߺCYrϿy})#+KZjZߡLpy]ӯtw>t6llmVF /Zիk8 ЦUK>™׮16 !HKKoWЬi.]d#`mmv~W%%%٘K՟y*3fODDDb.ٷ'yS ryeBVOH>g5BBBիWwpw~o ooosE )Uqmhڴ12ܕ$:}RbJ*iԬV+ZǙ爾}C7˙Bw}S9jƍ\:'ag)^̴wޣw|.ӻz@Dd$?ܸ޿VhӒ6lln\NHG$'zිz_K]w5 %%Hŋbx8)).u-((YzugHHHYVPb|>1%KAbE\2;Øb/ZLb:=( bO<-sy<ޜ }J||<lK2e 8ɘ;dvw8b%ٯ0Ϋg>4??_Ξ;OFFjll_ʨs 3m۶dVʥgZiX| nHؙ 6m3^:===j^IIIIZN3-)))H"顡"E8ŷ mZۋ0ݩW.O<ڑO>[k8 X`5jTСÃGy>sᴈj-RRc?/0g|.ɝjiiꤵ§uKK"""""rS@ms\W+`.ܸ]W̕kߠ"""""rji0r-)eu5V2ӉkyCm-""""r """""""""""""""""""""""""""""r[(iɭ3sƻ̜|K,7S&.=ߕm[6˷ba2nՒuk׋Χsf +k5m2CXso̪cxxxԬUqc_%s6~\¥)00C`lݼ];wPTI5x1vqskTƖM *RɯDGp)shݺJdɒ/-CjU9rTP3g\xFvJ ؽgQܹ# c5|G.S^=Q^=>jeU<8mڴȑ#jhF…пQQQaݼb/&N|wnI@bqZtA3W`WӞ9VDsPj5<@=ve&!!u7Լ?6}z]y嵱xF|:uo>}) -`ԮUØôi'씧zal۾;իU5Y79u2QQmVD9*[oNaOٺy#˾=҅˿azZQIDAT,7n)y%K`lXm[6x7kf̬V+Gd˦3om`<ۥ Cd?q:fx`cCƳq:~^!iҤ1vf.fժVJSjXA]ZUΝ;G|eԵZl'+W4jeʔח͛6g[в}Fp_O^25mz/nޙeض};IIIth%""""""""""""Vՙ .^@RR\ƍ_\r8~ E@?s&%5ioC\|?(ޚʨcy}LvBhؠ>/sҳGw-[F=fB8Ns]3&Aj՘1s&gΜy2ڭӨHNN6ۯQd 7d®;|w#6С=/]FfbRRR(_KVd|GDFFۆ4}[٧߿P (ޤDp zcun]緽?~@ٰgN`ҡÃX,ϲ7@bb"+۷c߾[e0lq8olQjUԉz!==ܾFtt v???bccm.nnnΛ]8y7YݝXg.K``nnnFИ\ʕYpKFM * qysKw(_ dN$$WQ@`P ׼CԥCg3ԌsRN>=ujk8 `vа0s7ߚΨ/3f(XhтH-3jH~i-łoSRIIN6擓5jlN6^= \.}s)6.2@F}#kCĢşGnJTD.A=@`[ #jS_+Ǿ*c_{ո<aټyQT^=J(Eٟݜ+ͷQH.^n3ϰ쫿*/Gh׮ņukOyFͯ1򃈈ߑbb8f;s[d 4iiiڵ6ZᇳIHH0TLٲev;-Zǁ:w~۷Ϙ=ҽ-SX-lZi۶ aaDEE,ɈaCZ,,!͍73ΠhѢE>JFe&1 ///Z߂c;;ooeC$''槵斋ظ8b2e4|[f!XVZ}(S #GbE^`peUȭGj///g\NvsssZVgRRvyu[3g2o,?ŋ?bEZ*&O1"""yo|ly0{Ybt0f`9أPF1r)#ʂ #7d޽u $, ͛5NW"'{ю`l_pLY=wgm?~ŊQH}sfnْ7qrg|kז*+qT(>>>4kv/ 'dFOzu(Ó-?Nl5YR5rH.ߌL1{ϵ[׬Y=EDDDDDDDDDDDDp&%%i6-s`l6.^+]<ȦMݫŊ%LC75.EӳWo З`IF<7n4Y}2tFja޼2zAp:lٲf._M6D{.=777nƎ@&8zpۛgC y8t0 f/;]ʗ+)]j׳> .ؾc qEp/Weo[%3UY%qY>l[ʗ/ovjX,@w%-ǽ}-!۷IܽG5hPݻ bx8#G6\uN1x@-[?9ۙƌEeէuGѣ<>މʯPY"""""""Go]MeEƧIil[%MDDDDDn%22\i:w\~sbDNgfKҀ%KLmRJX,|0X/ع߻'/1bԧf_txx:::$F#?;;,s!,ݻgB[esڶ``lnf>k}xԏfW6c2Yc\scf<|>cuI~OJ!HA[u? (%i0$x<80{j0szoo/\\\b$iZPÇ xtUU.Iu]h4l;􊁺uzXO>I...ӇkۨZ`F.ILu]x<-qax$$f5mfk}.I[􆁺wcZPчM%8}\$$zӶp x}޴ӽŷml6/{}n <{T(~ut/n%֤kxg5U?`^IENDB`KDAB-hotspot-41e5de7/screenshots/record-attach.png000066400000000000000000003337301515036260400221320ustar00rootroot00000000000000PNG  IHDR}8Q$ pHYs+ IDATxwU3{K!BDPz EAWEyDQTłґ&P%l>[;ɶf7es},ٹ9>3\{ιADDDDDDDDDDDDDDDDDDDDDDDDDD8/""""""""cLjXCS ߋ,1F%O DDDDDDDDdl48&H ߛmHb= ׁþp͝aOwAt4uBMYvO cXa]Ͽk5|L~"verMO398f-X$XmYɛ׭zᎉF! 6ҧoV>1IDDDDDDDxpPz  5 Mٻud?;>e0}رQpӻ ~Y}5>;=cR`gǚ>?M8?X1LL&f|G~pf43.l[Ϛu0F c%<'4O[;}'iv4alDDDd/9ҋ8SHJL5kc>7w?e1sQGihMsGfCX緐KמñG~ FSﭾ9$$_i_9,l_l6+Y,Z8>__' czW1M1~01cR=yqI,#X|«W_3K. OWrcIOKe̙9['-S3d{u-=dgp>Ers0B[xgV]m299g՚u#F= h|dfd[^0 =o~b_[%N<9OKkYy\|z K;D6UG>Rrru:gNjyK9> U۫GKUZƦQ1s4fn+.c!d?_NRR"gNgx>W -EDDƓMӅwjYrQ\se;'-M[()*`[ߏUR\bw+ ? -]\a2|׿f0v{jrFKkw>~t5|z-a#;,f3NsQq.?SOZJ#Ǟ~Os3[ B =TOʣO=KSs nS'J_ sWF0d2q핗vȓWNXsK}dbASXaӐ_b9&Vnff ~II\}e?E?}W\5 /,{-~ 7 ?eㅗ3k:_^0 |<+<٪5ج6N "٬6~{FwOX| ]? 3?)O>[ŝ7ߦ@0HGG:G:w,L6χwgrYwV~IK/J=w^oP(RFIq!}}cw(xa~}-,Z89()*'?-En=? K;G|fؾfv|z-=ԀLd2q33s:JJOu뮊gw;g洃=dvT "|~<'dwGDDd<߷׮H7r와ɥXVc>[O<|>֖aʤb>|R|bEocZTFzg|S&JIl6cXة+*~6-N==H(5Jۯe6YV r{WpSR\kZGAWW'^KM)[}kQB^>Ņ465EMkoogL\H})""/{WùgF?& >?^߿GVǞ o<,~pսOce9m ~~Lw|@tp k|w{LV"@7ց""""}ka@bb^%ZrZ}? =gWJ2׭:ȴ( | #O>o^v i`TQV+KO<~gy za@{{k7 U ]R1LDOji J {{3N+',sΤÓ><JIeZ-mۗ"""OC#}/7^5,{CŜ3{6,=7YJ> ?]cT#e le`Od2A()ԃuso)IIQB\)4akgw7OCcO Ę4ujaG/*#;3;=q } T~nk^o? 0hnn0 RMNJ0OGG??yx\y%TVnF9ܹ6m)aINN1l_knkwۜY3_VcX/yɨiUaOr1pWsÏn! XfwW`>߹r`]twuF2H5 ba혂݄@( ; ;d66l` x?oXmKyexz6Ʉ__9 /: 65XݙqlÔw۶pޡ%@0tJ`!ܕUxEAM}=`AaAUʤ ?_{|JK"S< xaRDDd_ihර~ů~~+MCAY~}N% ~z=$}!`;^~\ߗgfL.LF83}{xZWx&!""2 `ɱGcu,>Hn|`܋/sYb0ŔIw*r띶PQk{9S˯gYHJ::;9+'?#3#o~:;̝k3s:+?_EgW7uu19tY#~| hJJ 9%#J~qGzz:;]'+?j[5!#@gg[#巴r7/g^  rmhda)w'yήnN>q ~}ؾ Ⱦm;Q | 7wͷމ>mmAÝ;ݲͷ}%M9x*54ĎE &-"""3/`6ٸiKu6¢9أ8t,蓕Ul`98N^ATy,(O?b,? Cɦ-地yO?ǜ3X~[+)+dGr٧3{t^|ߤ$gZO㤥YrQ߰1;> Ay|bWײ5S̑dg_g^#8c)-)捷%';rGpޡtvuqQ]Sy./ >T?9rkzV1';%aRW C֗+IGGnư=^JsQGP\T0ผ,;H<¿b|6[8 ~ P׀5켰 0~x1_eBBALesh3!$hM"""2#˿z!~[{)2%]~ׯvSDDDd | fgt|um7 |19v.dd`"HȰFK&LFٮEDDC֒Kdam="""*ͷɕ̞9+?_}|`[A ad 11LV yȨ)|1{t9̚qp^Z7zWt!0N?wTӻDDDDDDDDtq]CܹsWcc;kO%O""""""""Mg޽Kn%"""""""2)L@ }DDDDDDDD& >""""""""аw=ʳ)Æ>7궈pML@ }DDDDDDDD& >""""""""B HGDDDDDDDdg'r쒓 F޴zZn983opPS[KWltg_o??0vK^k׭ıKNuʜH#""""""2ެYe~ܨmfs8gJKK#77Տʪիg\KwSmom**sY!tIg{2'j{~^.n\59dlmΏo8[s:k)]O?e~{zxFZnf=/ކ~;QS[ͷI'.˿NOO7mmzl7t3\|?1(,(5~;X,׿{72~~*?z|YgptO=M 䗿III̞5/ NXz`gqf_$33[ Z[[y's X`>s%$%%fD+ ۇPR\e~ NI"ϓO?֛obOo#RƖr o_dఅ vbk`0+?{9gUWcO\o>}8y78aFDDDDDDD\sՕFgfd|'d 99ibMq-?W_/+;n)gd~=樨s[G{VRRǤ=3gLz<ްa#-\ |hQ9%Er9q̞53jzx5xDJRSݑa o [~A~~hdJKJXaB9k3e!rIKK+o.p:?().-k<ȯy'--\?ߊ:0 <^>ΨyԄ+%%Îӹ㼼\nǹ񦛱Z|_+ve@Uնǭ-455˧FmB#SC>ɉ464""""""">IRr3gL璋/'`<>^ ɽA]w>hh˴vΨm gaN)IIIdge~2`dƁNCC3fso_rsho?o-e\sՕRRs91U^[~# xyw$-54 ࣏98N 󈏏U{>t^|e'?S>ad/^a,\04WW'.>]?Cns9I%wa&,f ~!MMusqW/b$+3@DDDDDDd߳φ>n~w=qB{Girl&M*z9 ^y5^|e ^qN M7r_w瓑3>3Ͻ@AaaK9fDZzZohmmegK/u/?ߟo 捪9vˏƛn}ZFҒb]~Z[HOK+'W/pjL&nf#< xHNN)S8ӆ=/ކz?B_F910st\.[3g L--JBB<;oe{Y"""""""iz>n4ӻ{""""""""2L@ }DDDDDDDD& >""""""""B HGDDDDDDDdR#"""""""2)L@ }DDDDDDDD& >""""""""B HGDDDDDDDdR#"""""""2)L@ }DDDDDDDD& nzzzX~]]]{)%Aaa.yώ'P Ƴl&>ξW%3=co7exغm;`"55u=O]xxV#r@hPȁSn`2xB!;`g5"8voC!"""""2ݳwp\C0BdN/L L@{] """"""ҧݷpC:DDDDDDD_Zfbw5}Ƴ=OCv=0kÏdGkooRTT1oOm]7lȅ IDAT#rVU {LͬYFݮ+W 8icN>##=1+sKY===TݻӮ=mbvV|R***";SVVƼO:LBB";> x<]);>!mh!==}ef @ZZ֭["..nPy۶j221c\n۫_dČe;$'%DMm o6F*8Uoss3[0$&&2y lڴ6(--vKC3 J8b@WoE0`h19RtuuQVVNss3"bIQSUUtw`ZHLL䠃f(+/@ nNeʔp㧩Yff**+|X22)--Z# Ζ2&M5rl(=o?>wq;}aX7,^?۫IMus Ks#^y5嗿[(,,CA~wHJL ĥKxRS[KzZg~*g~jk02&.=!zh󵑜LnzGY@)#336S**HIIfZEvk֬s:ʹccJJK;-͑}#"""""˕2`k/@ ̓>]lC,?^[ϓO?ù&%9>-㘣3\L2k[|ĻǹΦG [&Z`>,4ږ@MM5Vk8s:Qu{٢_@7mn Ʉ7(>Vܙ+EIiɀ3(e28b2Rwnw$@ASpe~-EWpDsGOaF.~XFoXm`5~9:zə.ǟ)s 9#_Z%w>tqβe; @M l'%yQC+z-[hin,V ۫iii v۰j„b:l6aÞ7RzƎ}6 .))ҒbL&eEK`_/E\a`1*++`0@MMU۶aZɡRnJUU[pQ\\ P9^[la˖CFn>&.>JJ{Cb*()- >"Ə'>Sp / '))9g nƦ& ~zlZ{;())1\JO V.UQRFa.;smя:h>C,\{t ]CMM >wjhhh233cK}؁wMF/!>>_"j2ed~ `ʤI0gT#"""""eWcɾco>;p,_iiic^ȾFyvC^WDDDDDDDR- 8DƐTH4KDDDDDDD_@4KDDDDDDDg>ב>nxV#r@l1c2vSDDDDD@g>'%%V|>xV#r@0-99vSDDDDD!#=}o7ezq_kr]]ݚ'L&qq\.n@&M*lKee{)%g\{fRSSdz GnI4c/]"""""""Ҁ%"""""""2)L@ }DDDDDDDD& >""""""""B h\o xY>fټ݌kSmp<Ո쓺xdef5f 8BDDDDDDDdp8{n#"""""""2)L@ }DDDDDDDD&q{͛7SW_ϤIʊ ^]MfFqqqx(,(tww̚9ڵk=l6Ǣ{81)s0 ߰Elx465ӕ+Iu)**DDDdGDDd?b x=O(DUUB* 1L{̓ILH`AE7P[[IZ{<v|>x| b?}HGGǀnӺDDDdGDDd?D BsK ===6@ |Swj*vmLx"""`0Hcc#YYY8HLL/l̙=>SDױlPV^μs1L@cX().bIUU`0UXVtվ2.SLJpfpM̤6m{nKhtRRRb2xBO+++c8NkjX~=rH@555dgg3CaÆ l)+c)1_uhoo ?Gwvu3.P(U7w.6B]])rCN]c{u57l`y;ۉ~G"""Ʀ&BdS^QAgW{6G~GxJJJvTj<l߾P(Ĭ3# RR(-- -5ֶ6v;ZU&Ovc۷o'///Ҧx^, nٌm۷GK_v: PJcc#̘>=jMv~'~lV+fWޠZDDDdߤGDDd?xp8`"7z珺ܺ:j" aaZvQSUPvr/m۶0 HKMLHO/;i,%%eE9‹E4`ۇ6EUUmm~]f_DDDO }DDD@f"fx<}RVFaA))جVشy3!ĴXӀ&F(4vw{ijn&v#%''c6xBoZ#ull6ӳqC ЗPkb(..&l6qFBؗw&i-M&.)""">"""ޅkjk֩%==~Quj8F=nEkhh$j d==F7܎@ @(cή.M5r( T~w"""21^DDd?zq:L]3a[KBBc~/ [0)墮?w궳P(DcSdgeE蠬斖 SLjll$TR WJ 555477:+d:::~m1͑XCm߉ġGDDdCKK EB/z)**jbcZ1L$&&Fn]SSbt:Iq%+38jhii*?/7êի ߽ rTXPټy3iii|>mNnNΐU DU)^U۶xBqqCNg2XntuwSYYIFzzL@xQ攔o{WOOm>JKILHbPUUEQQ]]]lܴiݹNhhhp`66C"""8ohACc#mm$'%1ed**+Yz5aq:RS[K֭$%%1{,a5bRiiԔ(Y0p:t񒚚)SڶzFA~{^>nөgRASӦMe}Blܴ 0HKMܱ,VO֭[p8cZ6m~!<Ƞ[ˋmmwNDDD& ͽ_9M-SդN""""㪾[E=+ڭ;ȁ@~vRN>z?B_9ňN5}DDD䀖YSg8;#"""""""2)L@ }DDDDDDDD& >""""""""B HGDDDDDDDdR#"""""""2)L@ֽcڊ  fټQ#Vsk+ $$8vSDDDDDDdjoFJrn^ %2F}w*DvwgΜ9w wz<6`@Q I 糖ײDiWUw=B!Al϶}B!B!! !B!BB!B! 7Zxk\6Ohx=?O<⊢L6Ah4+,1r:R, Dv"kv(P|>hE>'(VbZ\*-b8r^WM#H qzrVj22< @TDpؙxMK؝뼵ueR)dt:FFt=ZL˗dP(N*h428G[[w3z_B٧O𷵩QΎvF|B!B4{ϭ MLEQx2=^`0H$xBWg'##d3CT*FGF(+z=##ØL&ru(''9X,Dc1y7XVKtuu1:QVz:ZMVtS˙m|^/|H$@?HdZW/A ߹tGG)^<{|$ˡcj@w;Z&r۫~hEtZ?f>mvNCb6 q]j0l21xL!yU*^/,RxlN͏D"I.woa`_~:ۯw L&W{6Z >ia,jUB!Bq\§V3cnnn $Akj5F)58`YZ\.Y= d|SE&Q 4^v[ӛ7+tvvvnRݽ=-m8M sssM5* l=l6׋Ǵ띶rj4x64@q&bi X>7kr|)] oI$~E!u$B!juZZZP?_z/ \Ch4b6/M6R l>ϺMk)˔J%6}(رX, YX\B`0NZaooP$`? *RX,/ӇT*\X*a4]#ӹfrZBXx+F'NS*hH.!B!C>рOF# gpi =fW||>* dM667DCoObh4J0b#O &vUt8Xh4ޮd4d/R~ 5uk8joZưml%!B!׸8nyO>Ut=jvb]+XFl0re񰻻KZx/zvdZ*&}}rrzz=|?V{ih N719Rf-:NltP,1L@eO6gd0p8ݯ@xX \.u4GZeiy3xm>lV++kLMF۵K"KtקiǓLLe4xle%B!P Pc/}@[[ӓSa1 00Я.c2s6A76QP.>}v(.bU޳%vx"rHwWCNߧVSX-LNNt:::HF\aϟ=c{{շ(lޮ( B!B!}B!B!! !B!BB!B!}B!B!! !B!BEBܓQ يdԛ"\6aԛ!B!estv- c|^߽y_{xEB!B:\;HG!B!B!B!#$A!B!BGH>B!B!}B!B!!b;V?FN'#XOeB!B!I3h y5߾|^/YPBHDl4q: >[(bggϿ׿Կk5Z Fv>v#z=4P*("B!D> m>jz~x_nq F:o y-R)j*V~?jXrfcdx׫H$ 8=9E`Zv?X*q8LMNb4m 9JPj Q,04|fH"ҏ9fZEwW{{AN] D$azz'B!}>CBӐdQ'z D7++tuv222L6a{;DRatdboB322d"ˑ?[(,,.qrcp`B4caq|j%_(LWWj52,JhP!r,TT*۫WF&j"^/o_hޛ?O}ch]R׏b6ݝ] /^Ym֦@DV#1qihd2|>Gmm+&Q 4^oެفFө:쎳n@[p:MT*i$4׿^ ?&ZM0yY(2>>#Z]z{{1 ns]tYՎPab|\Qw>fqt& R9e}m|u>{<JMXAYh40ngŘ#ytD2jq\LMMiL&B!V0ХN:RG'AπVٳ94[KㅠMTBK4>Zk)˔J%6}(رX, YX\B`0NZaooP$`4 rX,?Q{PjJAl4hzZ-n''9ǚ Dvvfx^4^t:hT> ^X,XYYpﳽ"XvWʽv3p5jDbH(J`[5HgBXoUTrz<4 \N>B!B|bnK?z+A c4Pl8ka0.-sl637;{|>>JR&Sh4z{zP,F Xtvv7p\ ^Jx_E 2v1hsU\E Ue\.S.׿o^AA}p{2=M$4Z m6FFv Dvv0 >p]&C/K$lllNf#>nNMS1^߼/ZF?\&jJbB!ӻ[QI jb1Eb8Z `^r'^]>>&^dCNNOub1L&SUZ.ynr@e0)^p ff<'׋RpttD0Epk0twwS,blo0͗&PGGGX֏>}GG;HKK$⌌4cv?m ~6jxB!lll1$}`C,,--L6K(G qurR[o/>}m6**LF >L&#(zEoO/&RD*ߛ~]]dVf'x=֘pxxuvGVnY-pɐ^L&z{{FSlwo\.'8Z^ZZMi B)B*uNw[^ns| !B!al H$kkkczrP8!Fu1|9 (jepp(}P]"ALZvx"F˒HwW]t>jarrBh4Ջ nRV1x<|_PWO1e,y:6,zOooXyz{{1wn|>n%z{{lTUzm``CzFtuuuىp:kjq-ڂ[[T5nАFX\Z ^GP L2::n-B!