color-eyre-0.6.2/.cargo_vcs_info.json0000644000000001360000000000100131210ustar { "git": { "sha1": "6a9b70b44d11e0540b9dbc325149bab2a5d505b6" }, "path_in_vcs": "" }color-eyre-0.6.2/.github/workflows/ci.yml000064400000000000000000000063510072674642500164610ustar 00000000000000on: push: branches: - master pull_request: {} name: Continuous integration jobs: check: name: Check runs-on: ubuntu-latest strategy: matrix: rust: - stable steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} override: true - uses: actions-rs/cargo@v1 with: command: check test-features: name: Test Features runs-on: ubuntu-latest strategy: matrix: features: - - --all-features - --no-default-features - --no-default-features --features issue-url - --no-default-features --features capture-spantrace - --no-default-features --features track-caller steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: toolchain: stable override: true - uses: actions-rs/cargo@v1 with: command: test args: ${{ matrix.features }} test-versions: name: Test Versions runs-on: ubuntu-latest strategy: matrix: target: - x86_64-unknown-linux-gnu - wasm32-unknown-unknown rust: - stable - beta - nightly steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: target: ${{ matrix.target }} toolchain: ${{ matrix.rust }} override: true - name: install test runner for wasm run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh if: ${{ matrix.target == 'wasm32-unknown-unknown' }} - uses: actions-rs/cargo@v1 with: command: test target: ${{ matrix.target }} toolchain: ${{ matrix.rust }} if: ${{ matrix.target != 'wasm32-unknown-unknown' }} - name: run wasm tests run: wasm-pack test --node if: ${{ matrix.target == 'wasm32-unknown-unknown' }} test-os: name: Test Operating Systems runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macOS-latest] steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - uses: actions-rs/cargo@v1 with: command: test fmt: name: Rustfmt runs-on: ubuntu-latest strategy: matrix: rust: - stable steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} override: true - run: rustup component add rustfmt - uses: actions-rs/cargo@v1 with: command: fmt args: --all -- --check clippy: name: Clippy runs-on: ubuntu-latest strategy: matrix: rust: - stable steps: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} override: true - run: rustup component add clippy - uses: actions-rs/cargo@v1 with: command: clippy args: -- -D warnings color-eyre-0.6.2/.gitignore000064400000000000000000000000340072674642500137260ustar 00000000000000/target Cargo.lock .vscode/ color-eyre-0.6.2/CHANGELOG.md000064400000000000000000000062270072674642500135610ustar 00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] - ReleaseDate ## [0.6.2] - 2022-07-11 ### Added - Option to disable display of location section in error reports ## [0.6.1] - 2022-02-24 ### Changed - Collapsed backtrace help text into fewer lines ## [0.6.0] - 2022-01-12 ### Changed - Updated dependencies to match newest tracing versions ## [0.5.11] - 2021-04-13 ## [0.5.10] - 2020-12-02 ### Added - Support custom themes ## [0.5.9] - 2020-12-02 ### Fixed - Bumped color-spantrace dependency version to fix a panic ## [0.5.8] - 2020-11-23 ### Added - Exposed internal interfaces for the panic handler so that it can be wrapped by consumers to customize the behaviour of the panic hook. ## [0.5.7] - 2020-11-05 ### Fixed - Added missing `cfg`s that caused compiler errors when only enabling the `issue-url` feature ## [0.5.6] - 2020-10-02 ### Added - Add support for track caller added in eyre 0.6.1 and print original callsites of errors in all `eyre::Reports` by default ## [0.5.5] - 2020-09-21 ### Added - add `issue_filter` method to `HookBuilder` for disabling issue generation based on the error encountered. ## [0.5.4] - 2020-09-17 ### Added - Add new "issue-url" feature for generating issue creation links in error reports pre-populated with information about the error ## [0.5.3] - 2020-09-14 ### Added - add `panic_section` method to `HookBuilder` for overriding the printer for the panic message at the start of panic reports ## [0.5.2] - 2020-08-31 ### Added - make it so all `Section` trait methods can be called on `Report` in addition to the already supported usage on `Result>` - panic_section to `HookBuilder` to add custom sections to panic reports - display_env_section to `HookBuilder` to disable the output indicating what environment variables can be set to manipulate the error reports ### Changed - switched from ansi_term to owo-colors for colorizing output, allowing for better compatibility with the Display trait [Unreleased]: https://github.com/yaahc/color-eyre/compare/v0.6.2...HEAD [0.6.2]: https://github.com/yaahc/color-eyre/compare/v0.6.1...v0.6.2 [0.6.1]: https://github.com/yaahc/color-eyre/compare/v0.6.0...v0.6.1 [0.6.0]: https://github.com/yaahc/color-eyre/compare/v0.5.11...v0.6.0 [0.5.11]: https://github.com/yaahc/color-eyre/compare/v0.5.10...v0.5.11 [0.5.10]: https://github.com/yaahc/color-eyre/compare/v0.5.9...v0.5.10 [0.5.9]: https://github.com/yaahc/color-eyre/compare/v0.5.8...v0.5.9 [0.5.8]: https://github.com/yaahc/color-eyre/compare/v0.5.7...v0.5.8 [0.5.7]: https://github.com/yaahc/color-eyre/compare/v0.5.6...v0.5.7 [0.5.6]: https://github.com/yaahc/color-eyre/compare/v0.5.5...v0.5.6 [0.5.5]: https://github.com/yaahc/color-eyre/compare/v0.5.4...v0.5.5 [0.5.4]: https://github.com/yaahc/color-eyre/compare/v0.5.3...v0.5.4 [0.5.3]: https://github.com/yaahc/color-eyre/compare/v0.5.2...v0.5.3 [0.5.2]: https://github.com/yaahc/color-eyre/releases/tag/v0.5.2 color-eyre-0.6.2/Cargo.lock0000644000000456210000000000100111040ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "addr2line" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ "gimli", ] [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ansi-parser" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcb2392079bf27198570d6af79ecbd9ec7d8f16d3ec6b60933922fdb66287127" dependencies = [ "heapless", "nom", ] [[package]] name = "ansi_term" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ "winapi", ] [[package]] name = "as-slice" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0" dependencies = [ "generic-array 0.12.4", "generic-array 0.13.3", "generic-array 0.14.5", "stable_deref_trait", ] [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" dependencies = [ "addr2line", "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", ] [[package]] name = "bumpalo" version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "color-eyre" version = "0.6.2" dependencies = [ "ansi-parser", "backtrace", "color-spantrace", "eyre", "indenter", "once_cell", "owo-colors", "pretty_assertions", "thiserror", "tracing", "tracing-error", "tracing-subscriber", "url", "wasm-bindgen-test", ] [[package]] name = "color-spantrace" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" dependencies = [ "once_cell", "owo-colors", "tracing-core", "tracing-error", ] [[package]] name = "console_error_panic_hook" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ "cfg-if", "wasm-bindgen", ] [[package]] name = "ctor" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" dependencies = [ "quote", "syn", ] [[package]] name = "diff" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" [[package]] name = "eyre" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "221239d1d5ea86bf5d6f91c9d6bc3646ffe471b08ff9b0f91c44f115ac969d2b" dependencies = [ "indenter", "once_cell", ] [[package]] name = "form_urlencoded" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", "percent-encoding", ] [[package]] name = "generic-array" version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" dependencies = [ "typenum", ] [[package]] name = "generic-array" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309" dependencies = [ "typenum", ] [[package]] name = "generic-array" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" dependencies = [ "typenum", "version_check 0.9.4", ] [[package]] name = "gimli" version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" [[package]] name = "hash32" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc" dependencies = [ "byteorder", ] [[package]] name = "heapless" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74911a68a1658cfcfb61bc0ccfbd536e3b6e906f8c2f7883ee50157e3e2184f1" dependencies = [ "as-slice", "generic-array 0.13.3", "hash32", "stable_deref_trait", ] [[package]] name = "idna" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "indenter" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "js-sys" version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" [[package]] name = "log" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ "cfg-if", ] [[package]] name = "matchers" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ "regex-automata", ] [[package]] name = "matches" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "miniz_oxide" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg", ] [[package]] name = "nom" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" dependencies = [ "memchr", "version_check 0.1.5", ] [[package]] name = "object" version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" dependencies = [ "memchr", ] [[package]] name = "once_cell" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" [[package]] name = "output_vt100" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" dependencies = [ "winapi", ] [[package]] name = "owo-colors" version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20448fd678ec04e6ea15bbe0476874af65e98a01515d667aa49f1434dc44ebf4" [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project-lite" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" [[package]] name = "pretty_assertions" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0cfe1b2403f172ba0f234e500906ee0a3e493fb81092dac23ebefe129301cc" dependencies = [ "ansi_term", "ctor", "diff", "output_vt100", ] [[package]] name = "proc-macro2" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" dependencies = [ "unicode-xid", ] [[package]] name = "quote" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" dependencies = [ "proc-macro2", ] [[package]] name = "regex" version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "regex-syntax", ] [[package]] name = "regex-automata" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rustc-demangle" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "scoped-tls" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" [[package]] name = "sharded-slab" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" dependencies = [ "lazy_static", ] [[package]] name = "smallvec" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "syn" version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] [[package]] name = "thiserror" version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thread_local" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" dependencies = [ "once_cell", ] [[package]] name = "tinyvec" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tracing" version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" dependencies = [ "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tracing-core" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" dependencies = [ "lazy_static", ] [[package]] name = "tracing-error" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ "tracing", "tracing-subscriber", ] [[package]] name = "tracing-log" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" dependencies = [ "lazy_static", "log", "tracing-core", ] [[package]] name = "tracing-subscriber" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d81bfa81424cc98cb034b837c985b7a290f592e5b4322f353f94a0ab0f9f594" dependencies = [ "ansi_term", "lazy_static", "matchers", "regex", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", ] [[package]] name = "typenum" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "unicode-bidi" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" [[package]] name = "unicode-normalization" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] [[package]] name = "unicode-xid" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "url" version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna", "matches", "percent-encoding", ] [[package]] name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasm-bindgen" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" dependencies = [ "bumpalo", "lazy_static", "log", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" dependencies = [ "cfg-if", "js-sys", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ "proc-macro2", "quote", "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" [[package]] name = "wasm-bindgen-test" version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96f1aa7971fdf61ef0f353602102dbea75a56e225ed036c1e3740564b91e6b7e" dependencies = [ "console_error_panic_hook", "js-sys", "scoped-tls", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test-macro", ] [[package]] name = "wasm-bindgen-test-macro" version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6006f79628dfeb96a86d4db51fbf1344cd7fd8408f06fc9aa3c84913a4789688" dependencies = [ "proc-macro2", "quote", ] [[package]] name = "web-sys" version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" color-eyre-0.6.2/Cargo.toml0000644000000060300000000000100111160ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2018" name = "color-eyre" version = "0.6.2" authors = ["Jane Lusby "] description = "An error report handler for panics and eyre::Reports for colorful, consistent, and well formatted error reports for all kinds of errors." documentation = "https://docs.rs/color-eyre" readme = "README.md" keywords = [] categories = [] license = "MIT OR Apache-2.0" repository = "https://github.com/yaahc/color-eyre" [package.metadata.docs.rs] all-features = true rustdoc-args = [ "--cfg", "docsrs", ] [package.metadata.release] dev-version = false [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = "Unreleased" replace = "{{version}}" [[package.metadata.release.pre-release-replacements]] file = "src/lib.rs" search = '#!\[doc\(html_root_url.*' replace = "#![doc(html_root_url = \"https://docs.rs/{{crate_name}}/{{version}}\")]" exactly = 1 [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = '\.\.\.HEAD' replace = "...{{tag_name}}" exactly = 1 [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = "ReleaseDate" replace = "{{date}}" [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = "" replace = """ ## [Unreleased] - ReleaseDate""" exactly = 1 [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = "" replace = """ [Unreleased]: https://github.com/yaahc/{{crate_name}}/compare/{{tag_name}}...HEAD""" exactly = 1 [profile.dev.package.backtrace] opt-level = 3 [dependencies.backtrace] version = "0.3.48" features = ["gimli-symbolize"] [dependencies.color-spantrace] version = "0.2" optional = true [dependencies.eyre] version = "0.6.1" [dependencies.indenter] version = "0.3.0" [dependencies.once_cell] version = "1.4.0" [dependencies.owo-colors] version = "3.2.0" [dependencies.tracing-error] version = "0.2.0" optional = true [dependencies.url] version = "2.1.1" optional = true [dev-dependencies.ansi-parser] version = "0.8.0" [dev-dependencies.pretty_assertions] version = "1.0.0" [dev-dependencies.thiserror] version = "1.0.19" [dev-dependencies.tracing] version = "0.1.13" [dev-dependencies.tracing-subscriber] version = "0.3.0" features = ["env-filter"] [features] capture-spantrace = [ "tracing-error", "color-spantrace", ] default = [ "track-caller", "capture-spantrace", ] issue-url = ["url"] track-caller = [] [target."cfg(target_arch = \"wasm32\")".dev-dependencies.wasm-bindgen-test] version = "0.3.15" color-eyre-0.6.2/Cargo.toml.orig000064400000000000000000000044450072674642500146370ustar 00000000000000[package] name = "color-eyre" version = "0.6.2" authors = ["Jane Lusby "] edition = "2018" license = "MIT OR Apache-2.0" description = "An error report handler for panics and eyre::Reports for colorful, consistent, and well formatted error reports for all kinds of errors." repository = "https://github.com/yaahc/color-eyre" documentation = "https://docs.rs/color-eyre" readme = "README.md" categories = [] keywords = [] [features] default = ["track-caller", "capture-spantrace"] capture-spantrace = ["tracing-error", "color-spantrace"] issue-url = ["url"] track-caller = [] [dependencies] eyre = "0.6.1" tracing-error = { version = "0.2.0", optional = true } backtrace = { version = "0.3.48", features = ["gimli-symbolize"] } indenter = "0.3.0" owo-colors = "3.2.0" color-spantrace = { version = "0.2", optional = true } once_cell = "1.4.0" url = { version = "2.1.1", optional = true } [dev-dependencies] tracing-subscriber = { version = "0.3.0", features = ["env-filter"] } tracing = "0.1.13" pretty_assertions = "1.0.0" thiserror = "1.0.19" ansi-parser = "0.8.0" [target.'cfg(target_arch = "wasm32")'.dev-dependencies] wasm-bindgen-test = "0.3.15" [profile.dev.package.backtrace] opt-level = 3 [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] [package.metadata.release] dev-version = false [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = "Unreleased" replace="{{version}}" [[package.metadata.release.pre-release-replacements]] file = "src/lib.rs" search = "#!\\[doc\\(html_root_url.*" replace = "#![doc(html_root_url = \"https://docs.rs/{{crate_name}}/{{version}}\")]" exactly = 1 [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = "\\.\\.\\.HEAD" replace="...{{tag_name}}" exactly = 1 [[package.metadata.release.pre-release-replacements]] file = "CHANGELOG.md" search = "ReleaseDate" replace="{{date}}" [[package.metadata.release.pre-release-replacements]] file="CHANGELOG.md" search="" replace="\n\n## [Unreleased] - ReleaseDate" exactly=1 [[package.metadata.release.pre-release-replacements]] file="CHANGELOG.md" search="" replace="\n[Unreleased]: https://github.com/yaahc/{{crate_name}}/compare/{{tag_name}}...HEAD" exactly=1 color-eyre-0.6.2/LICENSE-APACHE000064400000000000000000000251360072674642500136740ustar 00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.color-eyre-0.6.2/LICENSE-MIT000064400000000000000000000017760072674642500134100ustar 00000000000000Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.color-eyre-0.6.2/README.md000064400000000000000000000212350072674642500132230ustar 00000000000000## color-eyre [![Build Status][actions-badge]][actions-url] [![Latest Version][version-badge]][version-url] [![Rust Documentation][docs-badge]][docs-url] [actions-badge]: https://github.com/yaahc/color-eyre/workflows/Continuous%20integration/badge.svg [actions-url]: https://github.com/yaahc/color-eyre/actions?query=workflow%3A%22Continuous+integration%22 [version-badge]: https://img.shields.io/crates/v/color-eyre.svg [version-url]: https://crates.io/crates/color-eyre [docs-badge]: https://img.shields.io/badge/docs-latest-blue.svg [docs-url]: https://docs.rs/color-eyre An error report handler for panics and the [`eyre`] crate for colorful, consistent, and well formatted error reports for all kinds of errors. ## TLDR `color_eyre` helps you build error reports that look like this: ![custom section example](https://raw.githubusercontent.com/yaahc/color-eyre/master/pictures/custom_section.png) ## Setup Add the following to your toml file: ```toml [dependencies] color-eyre = "0.5" ``` And install the panic and error report handlers: ```rust use color_eyre::eyre::Result; fn main() -> Result<()> { color_eyre::install()?; // ... # Ok(()) } ``` ### Disabling tracing support If you don't plan on using `tracing_error` and `SpanTrace` you can disable the tracing integration to cut down on unused dependencies: ```toml [dependencies] color-eyre = { version = "0.5", default-features = false } ``` ### Disabling SpanTrace capture by default color-eyre defaults to capturing span traces. This is because `SpanTrace` capture is significantly cheaper than `Backtrace` capture. However, like backtraces, span traces are most useful for debugging applications, and it's not uncommon to want to disable span trace capture by default to keep noise out developer. To disable span trace capture you must explicitly set one of the env variables that regulate `SpanTrace` capture to `"0"`: ```rust if std::env::var("RUST_SPANTRACE").is_err() { std::env::set_var("RUST_SPANTRACE", "0"); } ``` ### Improving perf on debug builds In debug mode `color-eyre` behaves noticably worse than `eyre`. This is caused by the fact that `eyre` uses `std::backtrace::Backtrace` instead of `backtrace::Backtrace`. The std version of backtrace is precompiled with optimizations, this means that whether or not you're in debug mode doesn't matter much for how expensive backtrace capture is, it will always be in the 10s of milliseconds to capture. A debug version of `backtrace::Backtrace` however isn't so lucky, and can take an order of magnitude more time to capture a backtrace compared to its std counterpart. Cargo [profile overrides](https://doc.rust-lang.org/cargo/reference/profiles.html#overrides) can be used to mitigate this problem. By configuring your project to always build `backtrace` with optimizations you should get the same performance from `color-eyre` that you're used to with `eyre`. To do so add the following to your Cargo.toml: ```toml [profile.dev.package.backtrace] opt-level = 3 ``` ## Features ### Multiple report format verbosity levels `color-eyre` provides 3 different report formats for how it formats the captured `SpanTrace` and `Backtrace`, minimal, short, and full. Take the below snippets of the output produced by [`examples/usage.rs`]: --- Running `cargo run --example usage` without `RUST_LIB_BACKTRACE` set will produce a minimal report like this: ![minimal report format](https://raw.githubusercontent.com/yaahc/color-eyre/master/pictures/minimal.png)
Running `RUST_LIB_BACKTRACE=1 cargo run --example usage` tells `color-eyre` to use the short format, which additionally capture a [`backtrace::Backtrace`]: ![short report format](https://raw.githubusercontent.com/yaahc/color-eyre/master/pictures/short.png)
Finally, running `RUST_LIB_BACKTRACE=full cargo run --example usage` tells `color-eyre` to use the full format, which in addition to the above will attempt to include source lines where the error originated from, assuming it can find them on the disk. ![full report format](https://raw.githubusercontent.com/yaahc/color-eyre/master/pictures/full.png) ### Custom `Section`s for error reports via [`Section`] trait The `section` module provides helpers for adding extra sections to error reports. Sections are disinct from error messages and are displayed independently from the chain of errors. Take this example of adding sections to contain `stderr` and `stdout` from a failed command, taken from [`examples/custom_section.rs`]: ```rust use color_eyre::{eyre::eyre, SectionExt, Section, eyre::Report}; use std::process::Command; use tracing::instrument; trait Output { fn output2(&mut self) -> Result; } impl Output for Command { #[instrument] fn output2(&mut self) -> Result { let output = self.output()?; let stdout = String::from_utf8_lossy(&output.stdout); if !output.status.success() { let stderr = String::from_utf8_lossy(&output.stderr); Err(eyre!("cmd exited with non-zero status code")) .with_section(move || stdout.trim().to_string().header("Stdout:")) .with_section(move || stderr.trim().to_string().header("Stderr:")) } else { Ok(stdout.into()) } } } ``` --- Here we have an function that, if the command exits unsuccessfully, creates a report indicating the failure and attaches two sections, one for `stdout` and one for `stderr`. Running `cargo run --example custom_section` shows us how these sections are included in the output: ![custom section example](https://raw.githubusercontent.com/yaahc/color-eyre/master/pictures/custom_section.png) Only the `Stderr:` section actually gets included. The `cat` command fails, so stdout ends up being empty and is skipped in the final report. This gives us a short and concise error report indicating exactly what was attempted and how it failed. ### Aggregating multiple errors into one report It's not uncommon for programs like batched task runners or parsers to want to return an error with multiple sources. The current version of the error trait does not support this use case very well, though there is [work being done](https://github.com/rust-lang/rfcs/pull/2895) to improve this. For now however one way to work around this is to compose errors outside the error trait. `color-eyre` supports such composition in its error reports via the `Section` trait. For an example of how to aggregate errors check out [`examples/multiple_errors.rs`]. ### Custom configuration for `color-backtrace` for setting custom filters and more The pretty printing for backtraces and span traces isn't actually provided by `color-eyre`, but instead comes from its dependencies [`color-backtrace`] and [`color-spantrace`]. `color-backtrace` in particular has many more features than are exported by `color-eyre`, such as customized color schemes, panic hooks, and custom frame filters. The custom frame filters are particularly useful when combined with `color-eyre`, so to enable their usage we provide the `install` fn for setting up a custom `BacktracePrinter` with custom filters installed. For an example of how to setup custom filters, check out [`examples/custom_filter.rs`]. [`eyre`]: https://docs.rs/eyre [`tracing-error`]: https://docs.rs/tracing-error [`color-backtrace`]: https://docs.rs/color-backtrace [`eyre::EyreHandler`]: https://docs.rs/eyre/*/eyre/trait.EyreHandler.html [`backtrace::Backtrace`]: https://docs.rs/backtrace/*/backtrace/struct.Backtrace.html [`tracing_error::SpanTrace`]: https://docs.rs/tracing-error/*/tracing_error/struct.SpanTrace.html [`color-spantrace`]: https://github.com/yaahc/color-spantrace [`Section`]: https://docs.rs/color-eyre/*/color_eyre/section/trait.Section.html [`eyre::Report`]: https://docs.rs/eyre/*/eyre/struct.Report.html [`eyre::Result`]: https://docs.rs/eyre/*/eyre/type.Result.html [`Handler`]: https://docs.rs/color-eyre/*/color_eyre/struct.Handler.html [`examples/usage.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/usage.rs [`examples/custom_filter.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/custom_filter.rs [`examples/custom_section.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/custom_section.rs [`examples/multiple_errors.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/multiple_errors.rs #### License Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. color-eyre-0.6.2/examples/custom_filter.rs000064400000000000000000000031740072674642500170110ustar 00000000000000use color_eyre::{eyre::Report, eyre::WrapErr, Section}; use tracing::{info, instrument}; #[instrument] fn main() -> Result<(), Report> { std::env::set_var("RUST_BACKTRACE", "1"); #[cfg(feature = "capture-spantrace")] install_tracing(); color_eyre::config::HookBuilder::default() .add_frame_filter(Box::new(|frames| { let filters = &["custom_filter::main"]; frames.retain(|frame| { !filters.iter().any(|f| { let name = if let Some(name) = frame.name.as_ref() { name.as_str() } else { return true; }; name.starts_with(f) }) }); })) .install() .unwrap(); read_config() } #[cfg(feature = "capture-spantrace")] fn install_tracing() { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(ErrorLayer::default()) .init(); } #[instrument] fn read_file(path: &str) -> Result<(), Report> { info!("Reading file"); Ok(std::fs::read_to_string(path).map(drop)?) } #[instrument] fn read_config() -> Result<(), Report> { read_file("fake_file") .wrap_err("Unable to read config") .suggestion("try using a file that exists next time") } color-eyre-0.6.2/examples/custom_section.rs000064400000000000000000000034100072674642500171610ustar 00000000000000use color_eyre::{ eyre::Report, eyre::{eyre, WrapErr}, Section, SectionExt, }; use std::process::Command; use tracing::instrument; trait Output { fn output2(&mut self) -> Result; } impl Output for Command { #[instrument] fn output2(&mut self) -> Result { let output = self.output()?; let stdout = String::from_utf8_lossy(&output.stdout); if !output.status.success() { let stderr = String::from_utf8_lossy(&output.stderr); Err(eyre!("cmd exited with non-zero status code")) .with_section(move || stdout.trim().to_string().header("Stdout:")) .with_section(move || stderr.trim().to_string().header("Stderr:")) } else { Ok(stdout.into()) } } } #[instrument] fn main() -> Result<(), Report> { #[cfg(feature = "capture-spantrace")] install_tracing(); color_eyre::install()?; read_config().map(drop) } #[cfg(feature = "capture-spantrace")] fn install_tracing() { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(ErrorLayer::default()) .init(); } #[instrument] fn read_file(path: &str) -> Result { Command::new("cat").arg(path).output2() } #[instrument] fn read_config() -> Result { read_file("fake_file") .wrap_err("Unable to read config") .suggestion("try using a file that exists next time") } color-eyre-0.6.2/examples/debug_perf.rs000064400000000000000000000024140072674642500162300ustar 00000000000000//! example for manually testing the perf of color-eyre in debug vs release use color_eyre::{ eyre::Report, eyre::{eyre, WrapErr}, Section, }; use tracing::instrument; fn main() -> Result<(), Report> { #[cfg(feature = "capture-spantrace")] install_tracing(); color_eyre::install()?; time_report(); Ok(()) } #[instrument] fn time_report() { time_report_inner() } #[instrument] fn time_report_inner() { let start = std::time::Instant::now(); let report = Err::<(), Report>(eyre!("fake error")) .wrap_err("wrapped error") .suggestion("try using a file that exists next time") .unwrap_err(); println!("Error: {:?}", report); drop(report); let end = std::time::Instant::now(); dbg!(end - start); } #[cfg(feature = "capture-spantrace")] fn install_tracing() { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(ErrorLayer::default()) .init(); } color-eyre-0.6.2/examples/github_issue.rs000064400000000000000000000033520072674642500166220ustar 00000000000000#![allow(dead_code, unused_imports)] use color_eyre::eyre; use eyre::{Report, Result}; use tracing::instrument; #[instrument] #[cfg(feature = "issue-url")] fn main() -> Result<(), Report> { #[cfg(feature = "capture-spantrace")] install_tracing(); color_eyre::config::HookBuilder::default() .issue_url(concat!(env!("CARGO_PKG_REPOSITORY"), "/issues/new")) .add_issue_metadata("version", env!("CARGO_PKG_VERSION")) .issue_filter(|kind| match kind { color_eyre::ErrorKind::NonRecoverable(_) => false, color_eyre::ErrorKind::Recoverable(_) => true, }) .install()?; let report = read_config().unwrap_err(); eprintln!("Error: {:?}", report); read_config2(); Ok(()) } #[cfg(not(feature = "issue-url"))] fn main() { unimplemented!("this example requires the \"issue-url\" feature") } #[cfg(feature = "capture-spantrace")] fn install_tracing() { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(ErrorLayer::default()) .init(); } #[instrument] fn read_file(path: &str) -> Result { Ok(std::fs::read_to_string(path)?) } #[instrument] fn read_config() -> Result<()> { read_file("fake_file")?; Ok(()) } #[instrument] fn read_file2(path: &str) { if let Err(e) = std::fs::read_to_string(path) { panic!("{}", e); } } #[instrument] fn read_config2() { read_file2("fake_file") } color-eyre-0.6.2/examples/multiple_errors.rs000064400000000000000000000027430072674642500173620ustar 00000000000000use color_eyre::{eyre::eyre, eyre::Report, Section}; use thiserror::Error; fn main() -> Result<(), Report> { color_eyre::install()?; let errors = get_errors(); join_errors(errors) } fn join_errors(results: Vec>) -> Result<(), Report> { if results.iter().all(|r| r.is_ok()) { return Ok(()); } results .into_iter() .filter(Result::is_err) .map(Result::unwrap_err) .fold(Err(eyre!("encountered multiple errors")), |report, e| { report.error(e) }) } /// Helper function to generate errors fn get_errors() -> Vec> { vec![ Err(SourceError { source: StrError("The task you ran encountered an error"), msg: "The task could not be completed", }), Err(SourceError { source: StrError("The machine you're connecting to is actively on fire"), msg: "The machine is unreachable", }), Err(SourceError { source: StrError("The file you're parsing is literally written in c++ instead of rust, what the hell"), msg: "The file could not be parsed", }), ] } /// Arbitrary error type for demonstration purposes #[derive(Debug, Error)] #[error("{0}")] struct StrError(&'static str); /// Arbitrary error type for demonstration purposes with a source error #[derive(Debug, Error)] #[error("{msg}")] struct SourceError { msg: &'static str, source: StrError, } color-eyre-0.6.2/examples/panic_compose.rs000064400000000000000000000021570072674642500167510ustar 00000000000000use color_eyre::eyre::Report; use tracing::instrument; #[instrument] fn main() -> Result<(), Report> { #[cfg(feature = "capture-spantrace")] install_tracing(); let (panic_hook, eyre_hook) = color_eyre::config::HookBuilder::default().into_hooks(); eyre_hook.install()?; std::panic::set_hook(Box::new(move |pi| { tracing::error!("{}", panic_hook.panic_report(pi)); })); read_config(); Ok(()) } #[cfg(feature = "capture-spantrace")] fn install_tracing() { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(ErrorLayer::default()) .init(); } #[instrument] fn read_file(path: &str) { if let Err(e) = std::fs::read_to_string(path) { panic!("{}", e); } } #[instrument] fn read_config() { read_file("fake_file") } color-eyre-0.6.2/examples/panic_hook.rs000064400000000000000000000020100072674642500162300ustar 00000000000000use color_eyre::eyre::Report; use tracing::instrument; #[instrument] fn main() -> Result<(), Report> { #[cfg(feature = "capture-spantrace")] install_tracing(); color_eyre::config::HookBuilder::default() .panic_section("consider reporting the bug on github") .install()?; read_config(); Ok(()) } #[cfg(feature = "capture-spantrace")] fn install_tracing() { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(ErrorLayer::default()) .init(); } #[instrument] fn read_file(path: &str) { if let Err(e) = std::fs::read_to_string(path) { panic!("{}", e); } } #[instrument] fn read_config() { read_file("fake_file") } color-eyre-0.6.2/examples/theme.rs000064400000000000000000000035150072674642500152330ustar 00000000000000use color_eyre::{config::Theme, eyre::Report, owo_colors::style, Section}; /// To experiment with theme values, edit `theme()` below and execute `cargo run --example theme` fn theme() -> Theme { Theme::dark() // ^ use `new` to derive from a blank theme, or `light` to derive from a light theme. // Now configure your theme (see the docs for all options): .line_number(style().blue()) .help_info_suggestion(style().red()) } #[derive(Debug, thiserror::Error)] #[error("{0}")] struct TestError(&'static str); #[tracing::instrument] fn get_error(msg: &'static str) -> Report { fn create_report(msg: &'static str) -> Report { Report::msg(msg) .note("note") .warning("warning") .suggestion("suggestion") .error(TestError("error")) } // Using `Option` to add dependency code. See https://github.com/yaahc/color-eyre/blob/4ddaeb2126ed8b14e4e6aa03d7eef49eb8561cf0/src/config.rs#L56 None::> .ok_or_else(|| create_report(msg)) .unwrap_err() } fn main() { setup(); println!("{:?}", get_error("test")); } fn setup() { std::env::set_var("RUST_LIB_BACKTRACE", "full"); #[cfg(feature = "capture-spantrace")] { use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(tracing_error::ErrorLayer::default()) .init(); } color_eyre::config::HookBuilder::new() .theme(theme()) .install() .expect("Failed to install `color_eyre`"); } color-eyre-0.6.2/examples/theme_test_helper.rs000064400000000000000000000034540072674642500176330ustar 00000000000000//! Nothing interesting here. This is just a small helper used in a test. //! This needs to be an "example" until binaries can declare separate dependencies (see https://github.com/rust-lang/cargo/issues/1982) //! See "tests/theme.rs" for more information. use color_eyre::{eyre::Report, Section}; #[rustfmt::skip] #[derive(Debug, thiserror::Error)] #[error("{0}")] struct TestError(&'static str); #[rustfmt::skip] fn get_error(msg: &'static str) -> Report { #[rustfmt::skip] #[inline(never)] fn create_report(msg: &'static str) -> Report { Report::msg(msg) .note("note") .warning("warning") .suggestion("suggestion") .error(TestError("error")) } // Getting regular `Report`. Using `Option` to trigger `is_dependency_code`. See https://github.com/yaahc/color-eyre/blob/4ddaeb2126ed8b14e4e6aa03d7eef49eb8561cf0/src/config.rs#L56 None::>.ok_or_else(|| create_report(msg)).unwrap_err() } fn main() { setup(); let msg = "test"; let span = tracing::info_span!("get_error", msg); let _guard = span.enter(); let error = get_error(msg); std::panic::panic_any(error) } fn setup() { std::env::set_var("RUST_BACKTRACE", "1"); #[cfg(feature = "capture-spantrace")] { use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(tracing_error::ErrorLayer::default()) .init(); } color_eyre::install().expect("Failed to install `color_eyre`"); } color-eyre-0.6.2/examples/usage.rs000064400000000000000000000021040072674642500152260ustar 00000000000000use color_eyre::{eyre::Report, eyre::WrapErr, Section}; use tracing::{info, instrument}; #[instrument] fn main() -> Result<(), Report> { #[cfg(feature = "capture-spantrace")] install_tracing(); color_eyre::install()?; read_config() } #[cfg(feature = "capture-spantrace")] fn install_tracing() { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(ErrorLayer::default()) .init(); } #[instrument] fn read_file(path: &str) -> Result<(), Report> { info!("Reading file"); Ok(std::fs::read_to_string(path).map(drop)?) } #[instrument] fn read_config() -> Result<(), Report> { read_file("fake_file") .wrap_err("Unable to read config") .suggestion("try using a file that exists next time") } color-eyre-0.6.2/pictures/custom_section.png000064400000000000000000004063460072674642500173600ustar 00000000000000PNG  IHDR.[RUsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|ellz'@hiܝȝ?{9vwz*W{* [ B d7%_}!B!B!2P`B!B!BB(O!B!B! !'B!B!B B!B!B!C !B!B!!B!B!BB}B!B!B!d>!B!B!2P`B!B!BB(O!B!B! !'B!B!B B!B!B!C !B!B!!B!B!BB}B!B!B!d>!B!B!2P`B!B!BB(O!B!B! !'B!B!B B!B!B!C !B!B!!B!B!BB}B!B!B!d t!GB(?3P!B!B!ݡ>!?aOp?uQik7G P!B!B!ݡT<B!B!BB}B!B!B!d>!KaHJbB%n!B!NJrBRHxpٽPHx?2E"^W2~ݞtp2Дr1fXA=>X_*@B!BHQ`P Ěw ^xpx`YdBѨX2/ e"5Q Zãh0|>g/4t1 !B!_CH3*qܕIvOJnǫބҿ3&*) C[ ǑY0,9U"[qVw޾f|TQ%1bx /7XYCJe 2|Q&R4Іix*)TJ)~T+f/ PZoq\rB.O|' }?8 e4%"2T >!d`\9q>f3}ljn|!6<OtocoDd 0nÁF^/."ANcHVȡ `[xXA6Le⺅H &L0i`.^j|}uP;pvL"VUE2}Bvq=&qbrmmGE h08,žr >>%GQDf$ZqYiZtrh4 _/2/ʆKِ eNE :v:bT9(a`zHU*T ]@\a}^׀5uXBg+iN}'O]^. ]DRda"!D",j6MԂ_a0KBѠ7o2RLܑHZ%d & W4ㇼ2q Ɓ..!/'Lٹ/w9jخ+ԏHlx ND!8T[<,}205B#׊jQxUEw͎   )܄/R'Dz+2pL$Ĩ A'4TX9H0ejB䝩-Wl$BOe"ceNcUN;~Q͡}hwk;/B!Bax~5gW?y ˷.jjWZqD#ުʼn:qHC.eGE!L*q8Ҍ mH8d DGA-q(jm;mm8"`|3BM ݹ2&#~E"E"+XյV݃8/[ 8{,nۮw^^@xܳ|"xw~.!! 7"SǏDM1  UHR:YT7fLCa9U X9߂HiilOE}ZW. Z ~  R"A뀅V4a~j°$ց/j.j/I.A+祪śo (((OT7\k#!V :p@D ˭p:\!=FhĈːCq}UG+ޗqshg'[9pô,޻ ?@mU2f`3@3ef,ZBߓ ~{0ţR)&`4[,xgYwTch#QQ&Sjkjxh{HkcCm1XY'4tǙ D نBP5Ugy"#$tw9x ki>3E#~.pWD!Y!wӗxjx:@ф\&yS; v"dUwj7]æZ؇`+F|']TbUYX<' 1aP64[^ tbĥˡor1Pb8VuՃ ;9pr:==Uq&倪_f2"BUȉL= mXwZP?Cqr1H.@UVĩ<'Lē&D~l{gv;Azs;Ճa<d'q[\vCS;ո2&*k"P/"5voK3Ж@.{X̲β0 be2]-ڻjgZ-h1ZGR[O;O9DBȏݠB!Cp-nJ2F$Z دXy#/8+ⱌT.V hKDVazN*b"USKNTB5bgȡu}'BW,Jn7̊4'Ռn\e0 9,ǓX{HG:׋=j.%BN2MiJ't5V࿧Tx^9ᓥȍ\oX!q8(7X(Y*8f jVCt1w~͆J f3T*,4 6Z-H=6*|%ɖM6;8k4dH=fXa*\ л@xي/kQh41 EGbAaF,BDZkzgLBg7~8^%y{ҴF+ù Bnk3 #G@X&ԎrÙ? {IF"{ τBݎF@065mz"Y'ƻo{(ܳSr3w6I)0h,э[Pv"?Q#=sb2iq[ZQu,Nڃ3>bϿBpa$q/w[_r<>}ٯP5j=:6 5558p֭[]dvZ|嗘>}:.]4( TVVb֭lmIR5ABDR mh6ly*=:>F#cڈIȌKV9b2<ڇg\8ʙLDC*jFy}%.Sfr3fnwSmF-oc>_巈޺=SNr6f4ha;h04dI9f\ŹWj?=;3GME. 6 i,07*fίXlC)WPi7k,;_ƍ{# 444ݻQQTdO2sf%@"oqܩ+9:<`6@`,.iƜO@J<nGR<6 >;I] Xe.Ql;VXUf,OONccW2C'󢵑Fb8Px]eir;瘨*Hˆ,\7jP:"ܹL3=)2I ?n61:&=^"`be<O'864a6 F|Y]'`fYDFFLjj1b/_{w0l6ApЊ mx"AQ] R*f3;lfS?ih*O`?\"NH. ;{ax`]gŊSO$217}CzB8yZGEBi1)'^+/! _𫻑9uRJ >e5ǎv'ˢAuyF̙wSr!IO/؏ʄ*\s!uevtb4,d UVof36mڄBd2L6 SNJ /_ݶ>}:ƏsaΝ0 … !0ouG"X(KWw{K e"+!e'eL"_sϕbRքn%I c %wc].'Ip_u~{xx}y +f. }k`T)9XQebg}#!tE0%9>`gClΡђjXr}FFyc̜97 زe Ο?FÇc 1eԕZ=׬0ŀ^ub?KGr"r0X\9? YstOO0)lO1B!|^+4p| 2;TBSV;v &Lɓ!H` pWK%R#B.w7H418_S!7Z'Ȥ 0{FR)yKfHd.>wr>*3uP8WFGBs:f>0V__;W8'YnH'X`Y|9ÇOvo"+9 sy&b!5>A}B!7?b A"4VTB Ba)>;̻'Z[cy)Hq忼ajMZPsк-㔔Vc>cy(; ap ?=/edϞjΡ87#`>9ǷyO6=-z{|_q7F#֬Y +V=T5krǏǎ; /Slڴ ǏǓO> Xpu*gcn,cRsجb&.nCBԘLȄY{OP?B>KNad'fb\z0fXffL/AEqp P C03% O*3mF|];tZQYVԸ߇!UW]p8{Q^^ΛuV̙3^XW`d*8xRXug*Lkj P>P2=7Ng1Jb?xV{~՚- ŨviN^x`G {QR؝륷k.L0r.7k,spguرcoٲ[lkDo}oj"/V8lavJ$r8- hP F02br #B ~X/sAJJ~`dh/du}؄r>>0x`jGU}PIJ,<z\(ޮZYp7נ=SG_w ÐIf2GpL5V;d` d-E!o|  KM絨*`*~m_roZى|l+@pxBnx cޏ>=TYo^'/?rB(c+x~?W_cҫ1er/ ޵So|' IcFm`W̟?݄?CM\O>CFFrss)YL&^}U<;vw܁hdggu?z#5&: _ᧅ:Uz|l-EBߐ߷_~I |Eչb«1(ԧ<-mHm;/o۰a9Qσ9c i%7`]x},~{PH]^Df=?r}v |5}0j-'Rz* /wJPn[~%$;,%q9k)@das08"`d]bXO`Wo.%VK2-Ty-~ZgtJPA|{t yY.ָtwؗH$d(> 'mG3f< ?ojަfi1$!XP;[x1>c| IDATO{PA%>ޖ JΦc~:ƺ16 -m搕B~J|D$C͛__W4W[DCX' qֻMU8q o86E5\8rrd!ue]:uGL婈p >ݴNy⠎ٳWYLS֡lW ~<۷oy@ q. Xi={uEGG Ŧ_ąSId>ֵ6 ݗG whjme72y8T2O%ކ ,vO>'LrT"uQil'5uXj ~6E'#"spw;7&f^[MPpT[7>`|Q^ nBG2SZω=ev:yKxƄX^Po:DR[GڨKӕNЩ.p`ڀz=]NOV\8{w^Ap_IEMv(StS3ڠ912Žƴ@Wp`?7ֆG1.zrd;|k2 &cǎL繹]Y7JKKh; dJ,m"{Iaaxܹr8#nx v+-B#|6@fW",8:dR L !Y.~aWqvXh|A0 <wձ;u*t,1i eh}R]tŵ&: r 9M.%6}g3=6Y?x{k+¢<7Q)hkht765)$_l0 2T$n`Wqhh.,,tp9p!GVW[(v6XJCY}"pU"^oE}܉JjxS۟c8qTuMM彯om@fϢd@/%: 4#-C{T:J{_V_p} H*߄Wuz8 ,>UX,Ԃ`PGQ0X F݌uU5(mY%'ȲP_ 80tYm{IO6yyyHNNZ?>yyy6`;/΅vlW1 N^3 *9jp[[9Y\.NZ w BDCKz̪3 r]jMxgGƮV7Ha׾2 0%ކ/7Whea,sayY[wHǣR0aϿ휆'P` ǕW^ǻ}qg z[vV;rujİTc@-O;^#,F @kx0{bJ̆ Hs #u Qes ܡ݌VIv񚚥ۆFoE\{P#-(BY'.>UE> t*nib+ğ`BQ ;0p:x,juU@t=gr Waw>WrҢ۰m9:R' {o(-]MHhi NNڠ<%e8Hò=ޣu:k;S&!H^ ~Fʅ[_u77yb2N'ҹ5Pu=0 /CU+ʞ(+GrT{D$\LT5`w^l?v7ئU{Z0<~=*9?Ue!?hOe-u>CJe`<'g|'09 LYBKK?Jqtƿ^~U[ 0jN?ǏjٳgQXX眀 \<+j}?oeð|n,ujoV8/Y}_opr\`Æ w ~n=$B`ZjUF!S`s†2@R' /m ji,kFs)xx:E"Lq;|p_zJe, 6ƉŨr8ZBfF mBN Jƍ{rz0 xrLUɑQV֡fRNM!jkԋ \w^ N{;Li=̬WeG[Z FaՃQ01!E&Z"Kqw[ n {bOh e:jd'½du=PP\Fw2Kf ǒYU4aݎSxwqX?{NB ڄī-چ#@kcuc"R/RI.Xt<&OTEE"y(µR`ץ \w-;NHiΟ>[!\S7>'- ꛭf?ءt:/^rV cr2O@']\֡ {rq=%]n`|㰱(<[Hr:dKR-@ihhwމ͛7lv}VRFK/>O-Y0iWLA$dpO,*]/+/#)y__:-; T^wlzԉ -B R ݎ 6m݆UV_}{&`m("&&$x.Gu]0 n"w  wo;ͳuN>߅G"Q:8iᩄqqxH"2u 4|a0,Λ~$v88'nKN}i)ݩɼ 睊+6.Y'x*럔P?Dž>!//yysܹO嵭X-w3B&Ʋ}X~=oYo x*Dz~>B '`3[x%u F$@$We/E{`.z*'Á{ݢ3"k3{~ ~]*eݭ3;L sN掠`j2@ɕ"%:g~}k/|*/q;T6Vm%p FW ˥6E"@"/vR?fǖzyvtbsMQ-ag B#f?<555ᥗ^W_իW_ǁ`8rLL ^yƆ,;+/ya+F`9QZIstŲvp!..)<-iV;Kנ$-sPy[hw/ !c?X &4,>R-ƪ ~ٮ]j{z̙\ix~u7C(eYxWo>CI8JE"lFY[¤RDE /"S^ FD=z/D Ja8ZV @pW(hixBxMpt˸OIptq T^~Խ85^O`BYwFϵ_lM7<}&xnB~j|.L-ɉ`Le{os4QQ>LM-~tqz (aP'zim5yX7 eqvM(RB#2wC(&LL%K{HqiaVA%8mÊs!B`Ly\aZq*Gixuu\8Rr)9ŻbjqhqzF6XݻwH$ٳqaBL>pС<pE@V#V,31_p}Z$)e^"!RG 08҂/m#Ce2ycb|`sẗ́aR bOʽOWAY{`BU|aZQ]]7|<T*{1<Ãb7 R)~q *09fKϯٞ{ykhl=u!d03>ϣh:]^jΝ'& 2ŷ5p֌u]n=+b3jU\vA=W ")RlY^>!TŮ1z}'?>rEjL 3}w,l'/ɓ˔aĆ=W83>G=9-STB 1]nGGt5~y8$E%,ב۾CmK}C7`$;5OO+ǁkuÊ*LE9{V__~c✮~FBNG_#- D/:oK號:11Wu pcPt}عgƍqa pv {6eT"36|w+X -AŚBzJ^_RZsY>+kozHV=Oè)zoS mlPgU:]U+y]vh0X}]n=wERtTB`q;>NcoOJtfda[uxb9]~ ?Z3ha: ߒ}ԕ?@֭W!#>ghm$o݈ :=w*" J"WRWC#o zX3̡G*Yb^]M=H#d$eWd7] P fse]'e`ߋs::`Y:>lj?;يIZ8ݚ0+f'w#г-Ww,JxxuH;w5!]$\&&<;a0 V,N~'o{NѣGc/ O11s΅^8?XB!b!J*Ÿp=XIɈT(a`dg2hju:  C W+)~qtFbx/յՉGwr{ޑNeR<ሖJ}f "0#AؾPn`>?&kl p%{X$unft>MdV_-͛^p[(\q 2sNoܻnsOXߠ94W@ "l͚5شiJKe˖;{lp>!.8?t948R AIbt}ΰZJa)7v1.iƱ1r'R [p0v9"?jAY+CB̏^Y`cQhre_f ^ƪXl[=zpvލx"_~9Mt%%%HIIAnn.222PTT[&33C^ !Weh6C&`jDL$Q9lbQ B,V*H qT(- ĭ[-H~&b;mZq0J~hzD8yny%J Z?eN/ӉFfT @TW]8m5TP \UU#F :: zW}:}QHR75kB6_vJ$}Y0[(mE \-2}9^X32_;CPR ՁHqYPǡg;Bz]ܩoCQASAlVߖ-R'^9iژhh`ln5H8=M`M7;w0Z3K$@LqXdO0,$R?x[,u)oJ›oM62 SNuWLm6 H9{+",gZ)tR5jfrΟg1") i`pDsuY;FAF\*/{O (+GrKkjL RcRx}{ o=W 3%{"d>r.k7xr '9=-Z:qFo?V T7D Qnfˀ"J;Gέl|Zfyo/^˗FII ۡ1eL4 ]? j *@.`n{+NO9@ɉuP%B CP|S,uy'S%`{q<*r,}WR%4=ed"&?TYcш#G`ҤIꪫv쾷`/<B!^{5_EEE3f .\apyJzELjj u',~m6+ڭK\xuz툕w2 ,Vd 8Ѐ54Z$ݎI[}G`; woAD@.@x壗u}V׀kb8߿xPRR^ VUUU>ן[b̙2e j*^ T̤{*m!VhT2s.;S~}B 3뛘fDμ]cv8gj IDAT98b>iB6{8Kg{1Pz-ThN/3u2a6t={~Ч~!t::rp >˘L&wCYYYH,b%R]Tyş>[_.&e>;*PW&\>zzC;}]'7qוbbƸv'sj_H}ir\[mx,^sO~;nv޴;vgYc w;ommmxꩧu`Xߟ6b|-ƦH, [ }׷iq'95a1ab)0B盻>*o5x~v{[ؤ i G/~6,*=~]vaҤI޽g|ߴiFyA&aʕ t:] Pn0`#0XtxHE"V(bH BՂ oƈP²sGD Z&ëȓHbCᤡ }{[m azb{qr㛺 f;wĵ^G/((իz\_z%;P/~Ok{[w|SB Xkr,vw|sf!~D6TzR)lf3+Qw S [^~ Is={:2j044,/y_oG[C17࿏]) ,2nZb2'f@\"@وZ 8W囊dΎݘ=j:3S K`YPTNawl?]^'{sBVB:"Î69)٘1b 2ҠQЄ~tO:P>Ԍ6ը1\BB0s,V7aWC,_tM0arss(H$fظq#ZZB߃p[q[jw D&!ā8c±v]`roH )Zwd5FbT =OQaŸmL;f&Zr2(ib9Sdjc[Qd$#W;;ZkaoQn1-ك|?x`q}Y߿W_}5 J؈g,Ə`adqSQ)ҒL}14 qqq=@t:gϞeժUl߾I~~>ƍ3[0ƍGxx8Ξ={XrK-M9?|{Yks=u]7u ٙ/~zV^NƩ!Gtt48;;ѣGYf ǎ3'9\xz4suVjmvϴi())g̙׏|V\O׮]>}:zkײl2żyxwغu+'NdĈRTTU8|Z Zݐ?իdeeپ};iii3yݻoZ̔)S,ay?Y&5scڟСCMo-bڵh| !B!DTg}WNw7e~/(. ٳ0ZnggGϞ=ٳ'<O</^_OxxxЫW/yٽ{wfooOBB6ZH`` EEE̟?0ᄇgYSN5ss/4XÔ)Sxu֍)Sн{wz-5a֬Y-eȑ9˗'777y1g6m ,;?233YpɲNmmmYp!:uLJ)SP^^Σ>PC“O>IVV֭xNNN|+aȐ!|,_ԔZ?< #3;;;Fņ طo_Əρ3gN`|׮] 2Zƈ#HMMeڴiF_~?eC^^^L4 BMFjjf„ |XnjsS4ڵkǬYh43c N8aիYh<3lܸ)r뭷ҩS'^~ex %=wСCXbLjŋw^>~ٙSҽ{w쨨0y,OOOoNBBR6o֭[L:]vY-Z2vX***:u*s_ӑ^k5יvf}ngP>7Ӿ}~A!B!h;LNkhWN.' G>ֶ]UsҮ];;P}!pW\i2Xwqeqdd$GyWMOMMeFyZ};/_ntѯb eTsTTWM9?PTTŋk]7mDFF={z9ZҥKkՠShZFmXTTTK/T >}:OO?5[&5۩hg* sTo&ɓ'|~~~ׯc4Zkt:[nj9@YTjg5skj| !B!DaQۋ)Tw'֯Æ G}nߔ ϟ?Tj5gٲeZ}dd$Pkmۨ48DDD(7nXvuV <֥[gSNСC,R>|8P.%%E ۷N:_|T|yWpuuzKĖӪ*cÉ& )"'':)}y9gK뗯oi`MYTjg5skj| !B!Da6^NY9kӯ,yVlAr P}Ԕ۷&"".]憽m մk׮~Ou HOO߿cMvv6YYYunwIqs!Z#YM+FeeeUJ.]̤CHݺ|7DEE΋/^tNˍ~3LKJJL.׏5E2TUUaccIYj g59rD3soȑ#VKIczլϭ=(B!mE}Y9pgglllx8ПI9Ί#߼TMuKXe'''hd}A}:T_Л Gdfff=Xs) =?RTT?u)))9rĪrJ^J~m ={XfEWּ0h0%6o*6NjjꫯF~E'DΦ[[[u SggҸ\屷m̮ ΍}S#oDqqq-z ÆVʴyf틷7g'Nk2wZ:ZZWS?{EE$''j*|||xW0`{V55?JJJ8{,ݻwoT~xe͌:h4۷qm%ZvչP΍X%:4#[nQ6 .n6j)OOO^yYp!UUU2cƌ:mmݻ׹.88XMoq`ck|^MF 333y7g5Z~jYB!BXt%=ܻ=ݜ6U'5uV: as#G;B^-G6lX*:ӯСC -nTFGPP]tib9ˈ#|_~OOO*++;w.׮]c؝wirN ׏ۛ\7|p=];xgHK Mퟡy{YY2IƸ7jl KγYzXSc?wG!B!D h5Z-;k͗r{ 뮻Lngggɓ 2Z^VVFjj*QQQڷ{ ܌D /Pk"AOOO&O\q~Weĉڵkm&L{rʕ*M}f-Q6TR̘1: `DFF\ǠAړ.]4ONǎk۩!{{{OF1Zʸq=dcƌ j~^jij iӦS&%=uEǼtP*00Т}ϠyV>Qkj箖\B!B46#܆SVNbz^82g̙FW^ᮻbΝdff@PPÆ ח;w:?̙3h4,YQ'( IDATlmm۷/cƌƆ={0p@GeFAPP| k֬Ю];/yquueҥ$&&rI3nܸ-KK3f fͪ|okՋ?EvZ)O3~ü:?aaa,Yhu5/www}QСZVY7eNNN_;32h{Z-˖-ח{5k4O>^ZZ!BXJ u{7Ѡ}(hh׮YYYO-]!h777>#[(חl~gU_}c]7{n:t >>h|}})++… lڴD***,;vwӇ>}Э[74 _ѣG8B!D[$}!M7KӶw}tԉSNIGqzݻٴiyyyH(0rHn}ojgwww&L~"w|ݻǏӳgOz)^f/C[믿Lһwozѣ5kW^zYy}Vs!~+|iTׂi}B yyydfft1D=222Xt)S^XGH={6:]SUUe]URRemǃ>3$&&X9|Mn6nΞ=bekmOcu҅صkٙzABB3f̠ҪяDо}9BVI`tJf_3MqQE*)l#ydggbŊ.G/oooRSS[$/Z2ȶmZnݻwSXX+?o赶(AO?ZYzj-ZDϞ=۷/#F`ӦMV-Ozz:?Gʕ+̞=QFqBJM^Ȣmb!7s}o4k.`!(/7tPؼysm۶1vXF|kH2h Ν;7|cE'wpX;qF6nj#BUoA3N:׹غcưBvgg<"ۺrg_aÚ?L/jyvD֍^v/N(/%j19|Ԕ,t:naAD O7ߗ^p/_"uk7nTUVQWBlLӳۑ!# Fc?؜̩?2,zjcyRYYɹsغukN\\LNNGe͚5;v~K@u ~3:[+**Ϯ{f۽s=u]{ ٙ/~zV^mѰ0ƍGxx8Ξ={XrQQQ̛7wy[2qDF/EEEZÇ<}uݻw7Y2e}JBBu-bZ3m4JJJxǙ9s&#??+WӵkWON^(((`ڵ,[*ˣ{ѷo_">>6m7KLL -RЯ 5j;v'NfO~LOѣ DqYVZۙ?>+kR}կA˦Lb6eGSD~^Mdd$t''' t{|ɓh41{Ν;Dff&Ga͚5>}1ԨzmjrrrN7G_{͒EFFgY|-[0vXZ-v6lhp5?j !-Mm}'ns{ a Ձ R};r6ZÈ=XF.WǑ;)-}_Z;&<IyJ./r|kOΈᇯZٳ0X111̚5h-9#G|re;v0c 4 C5wtt$** ꠾5M2|hYnݘ2e ݻw筷2ԩS&U_pp0{シ0/0d>S/_ހwײlmmYp!:uLJ)SP^^Σ>P`z'bݺu-Yd5oE_ё%Kz;2p@{>CX̟?0ᄇgY uij5믿ǧr<<<ի޽AǶ'!!( #)**W>D~W< #-}GsF}B!Zۘt7=ٞ2!MձS;;y\g}_cݻ Akz666؏߈^{5%tΦK.#X4m$$$h`˖-:tRח'˪UСC 0h(++3ZhZRbbblݺ|BCC3f vvv5 6o>O8Q ɓ'qttdȐ! <WWWΝSO=U﨣OOO?Ά ((( $$8Z-< .\`ǎFeffC-[h={W_}kKkdt|Me7Fܹs'@ /P\\Oii)=ƚ Uy)9oMڵ+*ֹ]S۩ZF[Z՚~a<==9uׯ'?? prr… OJ4##krecdgg{ڗ^S3g>S\]]9xrwޣsKSjt:;ƱcHKKWWWzɝwމ+ L:s1x`JKK9piiiBxx}ԪMmjgCz+vv՗{'NXv׭߮AYngΜvѣGbbb,UVVƹsZ}"WCQK.]ǩunw~ZY!hio"o?W^z{m>mZGpvvP;൥:Urt_J":^{uvb5##^G+TpLekԭ=}#;ѱS;ɣ}HUe㠭} GI#[n ׭׏ǀnqhUq1ݽhl6 <~8_&C[~=}fӮ];f͚F3fԺO3<ƍ3~c899Ν;MСC576mܹs[9|0g`̘1&/4iL6f„ ёg}7Zmb̰0FTMFa>c#kRCUS>XXnij˖-cӦM&\n֭Sw&M|v`8p9s wڕ ejg5ڻِGǏoоcǎU0uTOׯoopN8App0...tԉ7՚ՃmkFʹiHOO;Fw:vhF֬B!DKjmFc?[}O?|u. ~gهƷ2klѯFyj)pL6iyN֟O|h׊L6<ȷOZme{;ٹ4;~M%qӚvĻI[^Fd/ ^@Q`ɒ%9|gʄjK.59 Ձѣk}vbFh8`t}3)**bŵnڴjѻ;I/_nrT֊+QQQQ-Oyyw;;;&_7̙3ڵ+Ϡ^;UhZ[jw}V;=sc;v[k,}}5,>s9MWbYr;?x yWMOMMrDlnݮȬO`` ϟs_Nר;0 etܕOqh9s&nnn0yd...V+Skd,B$ 1%}Ay~:9bu]5R؄VA^j*+)dPr gw 旲%hmNQ^vFUT~Q%]Oy ?aPˀrJm޼[T_un\4??CՓ /0 EEE))In[NC&GDD(7nXk?t999&~N:UUUWP1m2zh%yf)TjjmUkW ;v+W\gNo8M T<}M۶mkӔ~U-oFVF-[֠UԪhj2߇zz`kMkka&Z Sew3f}B!Zic.Nw":(d,wX/7œWű9y42-GUU?b8:*Kȕ.f_u'@KΝ$j1uV7nnn SȨV[WWW%'ӧI/5񸺺2`+U@?R}@Zј[n;N]ɓ'5d>}*lllnˍ1簤r(ҵkWfΜ @ZZ2کZZ.\h5_5|o2;wNZ}J SNQUs"SPP@zz:&[KSUXnڷowMDD]t {{{:;;sMvY>ZZ]M~Vʹ9rD̙7|Ñ#G|S 2ިZCSNcɒ%Q9Yjm_Uך%o8Iݲ @y{{+#xʕ+-z.mƌ3h4 :(ogg޿MG0N?<33kn.UZZLlؐ-J 6ưZZ-oZ2x SvVV~5RQQA^^۷' + T7_U5fKo1 Gl&&׮ߵ>_}ۛ"""(--ԩSܨamILL4\w3f}B!ZۘʚpZ?["ܱݸ0"t)ȫƼ/I;{ԏ`Oy}#ݖ\:s.((DFF idd$ixvRF9 R߱;΍vuk1cEyjjjٲee[nEcŊrheүVjôՏ?5t(kmI޽={6r֭[GRRF$..x򾹡ԪjjҧfiLYxgy'9r$NNNhZ #>>t<1Bʹv-a IDATQQQ]?7D[d,B$ -ěN;5:srO7DYYPcT-.͓"QNrH裏\~HׯoG?i6tʅ[C>ws:_첆ѣG3fzjS ԕz̘1J`_W|ZsjI3*W\?Okc-4iNnj38v s[TPP@ǎj7`/^Lի{{{xwy'|5 7n aZzz:klo5j+UB$}a5R8R}1hxQ}quRwO*+?ezS]Ֆ{}//s_k۷3c 6lG}n4<[ۺ7@<1i8l}֤j GץKf̘ԟWߐZT~jj}DzSRjjc秾Uk?ٳΠ>4Djgkw5eddн{wM5V INNfժU+0`{Æ ;2wC׮]뜗%88Xy6KZ#BђBEEeJ󶑙~}d Y'3/B-Y]sKFCzw0J%؋vsK}NNW^.KHH۹@.,,… XJ`Ȑ!ż~ɯќ GS[nQΞ= TBCCgΜ1{L)J{п9)͙FjIHHѢjjmUkW|;֭T;UQKMչ-F5wqqQr j4۴Z@l} ;wnұ effo(l݆e aޑ#GǷzk/}nvMB!DKPU@OnFcjtQoiΜȤ-^@/~w6hyjjF<2:%߁mz2ȑ#eĈM$<\ys ϫ_ZT~jjXX1l^~Lloo:Æ i5֨1as#G6jgkwPĉ={6X5)6tQ}YHKKS\7]5뮻Lې디z'{駕?mQSBђnΫVw?Oz^k.AֹQ<.n?)#܅.^w{Lx*TUAfurk{hGwc{?#b{2"'>r+S^Ϋ 2>xid(mwxfuNl-ׯWW~~~L4Jj3fQL>Hܾ}2dp`~$YTTTV_Uɏ;qD%Xlh„ J9˕+Wޞӧ+#~BCC7nPϗ`ΥK]cפV;UhZsh_Zq}Ev]k_D /Pk2NOOO&O\q*kϭQc2RSSuJyT+g}ԪhÇzѠ}MfO/hZ}EIKVɯ-G${z=aXnXmk]C*ɼ\_`g 4={'vZrrrܹ3qqqgw!!!.\޽{ٻw/YYYhZ:uD~ݻFnrرcn4+h4/^Lbb"iiix{{3f8rH/駟ՕKɓ'qttd)eee|377Cd6l@aa!!!!) ~$%%1j(ϟW_}Ejj2nii0R+EMwwZa͚5\|xڵkGZZ@dkkjF59s&%K?-}e̘1ذghV}F{Ɵ皊9x QQQ)["66xRRRؿ?\v /// |N׮]kЏʏ;wx?5࣏>[oɉ~={~\\\3fR9–-[^777&L`,((Hykϝ;͛vkg!I`_iu.^_q:]%."ɢ} Kj-}_]RtW->xYp!tܙiӦ_l=zwdΝ;={6pww'**(ۖQPPTF H֬YÈ#ѣ...ZѣG=߾}ɀZDZV}B!ZR`kShG;O'*)*(҅;p{D?%|r%NhUTRTXJfzphzIw;¹,bF16pիWcB >GxW"{X,xgL< P*())#G_ ;;}qdz;`b̘1Ϝ9Dzz:RRRBNc޽X~xs( !O͛u“݋s⮻!Cш{n3m\Ϋ+g^3f/X>b`:=NQ{""j[l6_~GPPT*qI駟`XڻbAAAA{WSx&"""Nu5DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD+@\s@r8mߝlI&!44& }L&S{W:?Ȼ1Oԁ:u T*]%""""L""""TCm*Q'l2l߾ׯ礦bؾ};L"r楗^aqqq]=" i~DDDDލ3ہ _p\Z %5xGα6!u$;wĿoSnŋpBյ;vV(6mرc]68Qǫ J% B5۞'=Cq.>Z3wdO<ՠv$Hpw.];wsyC"qtd&a`K|A?ߔ3'oDkC \v-r/DDDDDD^>6ݵ{F=0J~޸~snv?&\Pa51EXA#z 4Bь3'`c(*rXoNQlb"1zRo$e%58¾]岼>dl߾Ǐǣ>R!C`РAHIIATTj5p%۷_}˛U+W"113gd2Fɓ'#..jEEE8r֭[ӧO7*C&!33ǏGLL f3Ξ=kIJe0h TVVbʔ).L 2Eii)aݺu8zngW@uu5&6mnVĠΝ×_~m۶mG f̘c"** :'Oĺugǥw֭[pz 'OL8:~bGZ_j{!((/^ܹsQ[[pߡC⥗^l۶ K,iOkӧc< Ě5k#>>?8郪*_~!,]YxW/2mۆYfaGMM ;kjgu^bʔ)ӧBCC(,,?"??߭:3@Voǐ!C za޽o.)y >>'-- Zػw/֬Y&'5}8ofIf>p|~ >HHH/.^ 6/̴DDDD^]`_lせ>Bԁ1HŅb#w7dG! ;n@JZd⣏>BXXX>}`x{%K ##ĠQ`_RaٲeHMM{?-- iii>|8-ZZxx8ƌ1c?ƻۢ%dxiжFeлwoSSSfR|r\!P(0x` <96ns8ZeeexWtRDGGcxW?"k".Jk!66G}FwBBBXo$j^=裏"99/hu'""" ZfED7dzվ>fF[@=2.o+>1сӊF;{,yF9P*08z(=|@Ѡw޸[hd̟?999ͮ? z8pJHJJBZZc? AB_/_Fnݐ9s4Z,ӑ ,Y2 & [nšCI&!<<fBYY֮]kw̌3Xs:k/CVVJJJн{wdffb̙zн VllذHHH@ff&j5noiFOLKKv޵k0ydL4 ?sSO=`X,,]#P( K/!,, > d2{1t:[xI& `>j8q6n܈*$%%!33Jo~6o ΋#G J|w8s jjj^zaP*nճKB&>_sNAR!11r VݪWs}ľ>Ϛ5Kt:deeԩSPT6l222hK/aܹNg}^XPb={KJJ?-k>|8 ӧOc۶mDJJ &L\cbƍ_Z\W"""" {C{iH--fsK>L:Ru}JR%r|}7ߖnAk5vj>v^%ע[\Pl6{5p[S>Cl޼eee}w|r( ̞=/nVAAA6m8K6 #!!T= ({;g ĢE ɠOIO_|^u7 6mڄ멮ngG1j(-[5p@ :p <8ܰaA:+8ӐVݻxblق-[߆Jo[lڴɮbk8_~ş'< qo^rZ'17|t v$ /bHNN\.wVŏ?%K؍m۶ ?>vbz?>.\`}Æ x뭷0r׳3@&l6W_ņ kqZ#9$$g`Mk` ۿ[̘1<J%,XE9-Obb^vx@ ͛K/ /++ &L``w*ѡx 7v+u8Ͻ}X:erәb}]UWki}|2K۱Bߒb IDATx[px]њ5k8qB`ԩ >g9 qo̙3-WKx}ZjܸqP(>clիW ===Nh-1Yơ?=]7oތBh:DJj$nHF,삾9UUYCO/D56+G,'>1|WMuł& utϟ`aN\W>4hk٬;ve9r ~rrr?U???!Pf0r ?p-[K=zW\q6htM7,5?_bsvv6VZnO? F^xA9-݌Jm*k9tJKKn?'_vG&Y7<{S7mtmR &ϋ}cG:rжK.'|#GKK!`]Pݲ]j+jwԷMII˴FN^7L#WOZb8 WD#&ɠP(u {17etǞmqMUuf ;_r짒$jU:[n׬]~JKKf%66/|S9KJJfCCC!XGÍ7ވ5k4mA&;`~Mc;s_=>d2*qĝT;_h4֧T:>`(fJյUzaߖ<1b| b0`z=q)ٳnQ ۝qXsקTjjζqW5~cuLZb8 WSStMDDDD0%^~z*t78wdr-qA9>[9Ѧe;ijYM5"/L&hw}={.Nff&OMq3iJj{l֖dpѣG ^Ylj^{OSu߮Ry&Xw˓㰬 eeeB`X_<bc/ ~=`Ϟ=_]󽵚;~<DW_śod M7DFF7>˗/7Y;t:S7Fl57P-vl6d2A.aۦޮ5,y-tCDDDDsOrPQv?*2F;Σ0sm0mgu~6̳ 'wv ݻihEʄס. qqi @RR/lv qS,\.pW&P}Gg;"iT;2 %C*b.\RRy*/'& ǏڵkOc̙BJS6Y?ǢVb>Q?Ᶎpv\tXtCDDDDb` Muع)㓡T5~d4 A3y|?bnp(cA}ޖ<',YXXt?LoulR!8t?FH۫HKKsj)wڹYX~}+--Eyy9>G\f=>NC|Fmg/1ߣG? _hgV~PPP^{ /2, O:=\Ds4~}⠹3=yh=p=i΂c-99u.8OÝܿ>׷MHHu鯼YsYBqؐ[""""jԾA_{=QgW7X Wjp@"`8;js9vx$`>v2Y?h1K\:njӢέ/ls\5jTm۶1zhN;ۊGzz:`Æ -Z\8:O>3fLOjj*n[}lH,(ݻX^kKvӟV:Kz*ߏoVznvvԟ>ђ8n8b0E0}q\nr3fhxis}{}>xzܸqNfXpС}jN;y^1j㇈#TΈ_~ʵ{o$اڹt 5{v,=h$v v}wC EF4ڧ{$]'~H.[nٿ47P.]i1tcVϦdee {F iZ̙3r+a'| pott4q 4rig[w}7$ vaF###1{&Dd2<z ;Xwnt^f=:* O=TKS%f;gffbСkȑ#¶+V ??#**x?h`ʔ)!.:a„fAZ`w!,^_ ?f̘':O.cΜ9HHh@vkr}Z) ?:Q~<~sbe%W1=Vx ؽ판Jo6O7Ol:wVEU{1?rrNz#_liqm6L6 7p<?G}qYYYHKKرcRp=m7Lx7j,+ ,, Ƃ /_C ALL Ν;xbF@@Ӆt  fp}Y̋/^{ )))k>~!z {O>1cЫW/?|N_nF^zn,f,[ }m2`(Zr/Rd‹/hC駟 7܀Vz}&M>}8L3{ i ?o$h;ֈj*СCx'ۻ:M?xg?smW^.8:'.KLArK|Rz/4y|gR BliE2T*XkN`!QT H}&d-lRTT˝֝={6d2bǛ6mj˪eذa]VyL"oqHDDDDDy1O2=S3%~7LF9s`׮]8x rssa0c7ܹs\ۦO5jT{Wha78$"""""'mgۓ] V1f3={7hZQGCDDDDDDDފ}f䝽HPi( 7*Ο./;!?Jn ٌ~!>>AAAPT(//ɓ'?য়~é1"""""""fHF%:۷[{+CDDDDD>Q'2PXX(Bmȓ'""""""""""@]"""""""""""j>::::y7z{E|GXrh""""""""""""8ci4c˗m۶& 9|h""""""""""""\BDDDDDDDDDDDM`*""""""""""}\Ŝ9s 0zhL<qqqP(**‘#Gn:>}ڣ夦bʔ)HKKV`@AA݋5k֠MQsI`ߖ,Y cbbf-g뮻S(HLLDbb"Ng}l}v~e˖DDDDDDDDDDy`FFFz=8|HR$%%!--ͣ̚5Kt:deeԩSPT6l222hK/aܹoEDDDDDDDDDDJ0m48pK.EIIx$$$x̞=P]]  77WbƌxGT*`,ZMQS\ dƙSgyz\`7 ;իWcرHJJBzz:qʕ6^DDDDDDDDDDDMiT<~෧0`zӦMN۴i Jѿlܸ#qdժU뜜VEDDDDDDDDDDKu& mڵYNϞ=%%%(..vߩS-I# 92E\R+--EUUU(**rmпOԇҶv)G&A.0 .MV=R"""""""""""wi`]10L ,R^t:ԇ]moO06:[tٳg!!!vRRRgΜxZ⹝1h q駟:oܸqłCY`޼y'ObΝmDDDDDDDDDĎ~F0k,7gƌHJJ۷W\i* :M?:3f;SXX,* %%%x1o[To߾۷/ƏEӋ|=Ԉ`܎5CT}"B*(D,ļvRݻcɒ%P]vaĉ^zaɒ%x'QWW5֪0?}QӁ TLXy>SMM)5B@n3RyR w+WG}$l/zv IDATw޸1zhl޼JDD"u;Xon)*ZDDDDDDDD"mz!&&C;w|vN_]nR91}""""""""efgdd7l0NNNrrrd-n*1'`ͥX\ FJL+zcGq˙ }5A !>>PHЙPl0xU5~*)E촌 Ƅ`6! uu8UKq߿%d2 *PI2p*~*.YV`I$b*,Oܫ:vr{bx XWǫE%z"FZ=fT" "BB*Aш35Wkim9e Fh BB ,cGq)WNbPJDȭ_7XU5vhtYFkƏXrqxn~90{òV_%eNOC~F6J,Zl/.*<ڳ;zkPc6cѱS..ؿׇvÇ$e˖&޾}oŲeܯȌȌ@J/\tz_S4r4r5}ո%,XeAyO&@Z%'_>l+. [ܗb?チAMWJG,wtl\&CZ #BXy>5R?D 5pJ%t:x _bgL=Wm~O__E}n"av\ 4r2 }ƭX}EN{mR)CO__|o;صC w]xt3gccc=Y%.qWMf1XD@++ 'A:u ^\U\1Pk6C}-P8((jpAW>C/ギ{Qc2#Z`(RZ=v{9DłȮ΂phqᡨ4#09vgw*T[wr/4: AY}]~.)]-|RhLKΠ8IS"łU(6 V#1bXnBPPo%0T`Dh0Ɔwoc!Hgj*PHVpS`|P\ۧ!Ok?k΍EI PˤȮSitǫʊQN%K F,-CPF㶈0T0DDDDDDDu~dd$kc(((_WإމjUK 955 HrXX啨r]Zݥx2!rƁh[r9VVa|!@}J,LB*Ŕ/A%1d R:,?{^R8 S"KYj J iQ,h+>rLfq&mR.-ØLD;#sy-/cDkᅋhT)Rٽ'f1{ipõ _hsewY9$dx .2ŧ/ccYW0)2}O\akC]J ׯ'nMO__(砳F-{8|"ȕ.xBZP 5… $̙3n;y]Aٌ/Az*X|t": ;U'0`hl`łF/j,k? iň`ɬJ\(H Xk3}$k` ({Oc< ^* ֛1 ~'F[JkKIO^R]P*F|WTHk  r{7t*ʝ,iho  ` :JsAW+4Sxq[YI$v^5 xoeF#r,{|wFb&wT3O~0 UmDDDDDDD9tf3/_~.kժUU \ul,H H`r cVd/"Jeކ\࿬l@&JwRD\+;V&nDV \H}Mi^F*<<`5 'm"<_ρr9|͌w5kfQx~X[(OWv(O1? G.V:1Wfm~'""""""ΣKkmE>63=e&R"ԙպSo9 {֓K])w%`m\c2#GM\w)|P_D?_<;YǩmRy4pg&ZULm O)_ 㧵oa^R*M&ED``0d2A.uv55S'xwZMҚg{bvl4ׂn{Jq#% ƨ`>`Q}pO!Lf)ʚad dׂMH}l 7Ec>~ .xJm*t$uaLbǫA _8$HUn om@u鈪M6 j?lҊԘ;0+V5l4Q@yیJIX5)`:m75ڨ߉2#Gto16xtDm3#:߳R0sCNՖW_bֱA m`4:xd ƄUFg?b9y}r$:ܧ`W,$"""""""eؽ{7G9svZ  ?^ew}¿CSf:\Q)0Gj?үʍ&yfƬbfs8;9V]ݢZTL"ёzjn`iɄUM{zPq@dC? ΈD PwuDoښ V\xD"剪j^byoYzzF9׃>d9b5W `L"mavp㰳,)^O U\r9n ojQ'Х_B~V1o<&L<[nm6ϩA/• ,NNJ K$^?!7W`v3mKsXRQI$x21?!_W D/_ FMʬ2{`Oi9fĨ ŵ'/|.͎3z\EO?_ 78\Q);P[WFUL("vJ&ÂqǫjPa4B!"Ld??63r? EC: """"""Kϟ?{_h0l0 6nSNo<'<=5~Pˤ`b+[VѺ\R?_ B*ml/7;J1ё{}v2HL] <@/~»q_l7dAo'dઇuPE%F\ FO_5B ̊f=>MW/cTh0R)F;HRk6?y%x~E,qj" ~,oR8_5zk|q1eHE1&'7:iQNO 3W82>Pť GBZDDDDDDDt>ݻs]w݅!C ,, Fyyyشi`2yfqYOљy `XPj0Tu vmYw*1,Dh>R)*&%fiX\ Š@+|CUd g_cY9LC/f>ZYNFFpkRZ[MdU ~RłgrqKXT@%6{Y` .`-4ahjl+.[hm9uf3^?}#C BRłKz=pE%ډWJ/Rf(>Y!\{%_Vj:5&>bPA`qq^SZRPF`Y|VN4$ʮ>6E[, 7UphE>+.֮b{T &      XԈ(;Z;.N`}H~6uq;<^ՐNN7 }ѨQtyӀdX$I?O_wq ,9QkkiaqWx/iеzT`޼y;ᾗ[WV / [? V 7o'Ţ.* S%I]\֣z77믿֙3gdM>lC  ]G?}]] ڭG{٬>6E[}SZO uk.ONNwH7ѐ(*uژ_(5¦MU{*Nm.({gQɤ)I ^rɥS0P"X4%9QD+YWBV%jՃC)jQ~u;pX5uu^=/6Fw'IDf\2ӽ'NisAQ#10է.앬0kRSt/EZ,g@2Mhk`]Fei67y>>,L4.>Nך3^[po9'ug~J}SJfEY,)$֡WO4_'Xu~q?R^ bѦqvE >5WRFؔէED'B)+&mJkhtfJ;+>WhEHG^IzX)) xyLܨ$cڳȘhٿ, }URZJEq *d $I սe14ouzdj\O,MLLQkIA:c הDMOIV8ݖ.$˥ϋK\5u.ҤŇiFJJm2R}RXK4)1^_jwIiunL0\^:~BN7{O qӁJɪ*=}kZlDHq܏TT肸XJ SQ+3eD~9RQdYFcbc4,:J'*Ne#uqB,&%i{QjGseJ;V]WO tJafFFktl"-= C;h`yΕ>Qz_L&FSo[ccTrioikjdA>60xuq1`sө:QY:EY-ʌ i٤:K+*uBgjjTt*!<>>Nfn징xeNz#՞ d}~&>ʉS%6fB'rmi0MLI;Æf뛪Y~t6F}ԓU|KQ~5xb,WfIuuZus"t`2"#>YY;n[Ѳ邸XIҿ ZWSWšqm ˥š:W25['X{vw3*:g`^?¿Y`:^EGiGYsRu uIakA4I҄N w4(IRQm}L궳\2@6r:t{UZw>GML4p܁PaTqw\y&'ꏣGhM0-%5B)rU٘#T3,&sȞ>+_f2Z-Og8!^7vm};?O5 B$ǫ>"A܆r٬sr`g#՞ t}?|>lcUr5qvY6g?7_rS`jDP79UՊm%pR\[01Qe׍i}dnn>u FO#ʴG*C.&Iâݣ= FZ–;p#kogkR!ys>= \ՏOK$՜S> y6NQ*fb]2|, aVMLHhRm6٭w I,cD{6s3;~ oo!?MYCeOΘSK@JY#05{p]"-v\z -2P ?Ψ ޘn(9<\55LedҰhwNŀL>9tT)OŭLv\$Q3)1^fAל*,o]fnHWx]>9XZGQVâKИXeU-koy,&, mh?VYFϬ]n/hs`߼y6~nxuYC8pXNXfhkݮ˓UXSHZ/M憋F[ Mi kjUN.KJɉW=Ǩl`;~it5)zZɽ e!@o:mضnr^ILJFOšZ:fUFd>/> 9n+FB;%N_uO;U&$WQ cR;Zǫ֡WrN'N)#2BH(YM&%g3lat\,$˥Uuǹ s&?//K=Ǩl`;~+urd2WS6ذVF>Ũh]T?rgY Rժizlav'؎$eWVjLX;ΰ(չ\WV&Ŭb4,:J{#!4qnwSp*.̪V&h?govzl!{ y#xI#:RQMj~z_ V٬)I  OZ?Ǟ2A}IJɛ=QK6ǻ%ў  xlm𩦮N'rP|֡>׋X:%Q醺eo6bVWRWO_KRBXnhuԭd\q_df Ghe*u[V.~Lswވduqa^har`n6L{ yBx:9}R!=4lv.l2iPTThr{ _[e#ڳQ/'O0 dҴ^IO{$Ia#؄NECćil\l7?bV\.tś $Ic4>!i0~iHahbb,&֗Vy55mwj֪]/-w?ߐƛƾt,t>-U}ڐW\F:*gshO?`Dcc<"獢s"JPo[0Q٨`}|'v?.(TyCitIIֻ"}&mEgݏMmk61^=*gLLn& 4x֬Y9rD6lWN/;;d$!^ΖꬣVa&Fta|´lIʲLߔiTl}B8JD-:|znLWŢE3milmfihTD%I<R#lӧ$TUiN=~R_~ԯ<|YEs{փbQbxu/ߔi\|h{fguZ :;( ^SWU0UչHҷe,9]׾:tf(b/'E:^Y0Yc5:6FR}͓]\bDX,uuVtV|䕤:r1%פ]UWVSUժSժbc4a*gWO?*( i}d1tH9U2Imw_SZ.W #I u]޲LL}RX3Պ `y7_QaڳQ؏7s̙3GD`_&5%؎W"#\NO 4(ʮqq 7q\ljSZyBU=RK29].sJ"[ ;ʈ?Fg>N=*}[V{@5*6F}l6EY-sLM铂B:ZJS+eI [\.NVWkc^<[3Zs.)=X_71abRQC++\_-q>)Jo`;uDmu5*6Fe:RIY.V4&6Fm0iߑilHy$%HO੦N+4$:JNK+;o\ǫ;rIzd<[ɉ mW*GK5L U+Olk1ʰG(>,La&\ʭҞ2m.,rOpS7%e4)Ai6*u`y6xef$=vp?GjfJ.U|XNeWTjC^TTj@I?Fg#?Nn n_|6mڤ5ktuQkK 'L3gjĈJJJlVQQW_i֭:x_;R\\oRxz׿ք -KIIQJJ&Lo]<^yVwtuש_~ڿ?}کY`j4rHI*))I#GԨQd6e:Tgvk=#:sLhܹ |)$/3fHF^_xm 5 8Pt!A}Ouuu͞KMMիuCjӦM߳͞g.\軠V̙+R骫ӑ#GojƍSllt%(--Mv]믵zj޽ۯ==]*//+ ov|kZCǎڵkUPPLeeei޼y*..n\&MҥKeXp8K_|񅪫Yf)%%EWQQ^u]wݥI&Z;wTNNf 1ctvSG}믿^E=}YmڴI~ot*77sR}sdܸq8q$o/~&eYn~i%$$8-^XE{w&Zr ;C|Ξ=j5gܹS˖-SAAAנA:m;̷/N8!IJNN<5khŊ .@Vks5׸Z\ ngΜ9$=S͂T^^+VHl6fΜW㕛|Y0^aÆNj/--բEGl7n,X'xBonN?n8Iҙ3gglذ$ Iwyzӧ%I|饗tWC ϻ> </**?L͘1CcǎСCeX$է[4m4Wr7Zrrbbb$I^IIN>>}x]LI~Իwo]VFlxAAŜ:Gs={N6MGĉuWno߾zGums)>>[jO>2LGk~Bk UZZ׺@,/ڱcVZ[n=J2eJ@ ~\SSj|ڿs kj,z#H."mڴrIj {c|.p?~WOwpZt_~?׷~~dHaUTT>}.k=]fw/m-M$w\(,,Tqq$iȐ!>׋U޽}./++ӱc$IcƌiRvBIwff_/Kݏ1Nlle$ܹSԻwo9:ӦMk5XqFIRJJNڦ2o7y.@͢?ϴrJ?K/Twq?==[?i\Z`Ay뭷ܓ{;vu\ǏovM80s/"]tEח_~֪W^5jT8ꎶnݪӧK/__|Q٪T?Qncӎ;eM8Q#Fг>5k֨PRllsEEEK***J?o߮۷+??_6MӅ^QFInE~NN."L&%''޼{Z|_;ڸq̙;O}d={pB}GkذaТE,饗4|VGo޼YK,#=ÝRF;ܺ:~ԯ_?߿-[h:{{ѣGhJW+Μ9t]x/(aw uu}%IZdNg{2O>zJNTPPv5k}t=` dIRvv6A2 ݨb.LqqqMFXmAG0@1wuKjkk$:2'tڃ@cGGFFk%\+>>^:v옶mۦ~[^_kt%h6lHɓھ}z-{}:t6m={h…~eذazg.8qpBwb;$-uXeeeK.QZZv _kڽ{w#{.]u[+WԚ5k:T z6Zuu>eeei?m=Z5f%$$Fڶm^{5CE{3rHh|>}Z;vG}lO>V^u_={$ꫯVeeeey\'OVVV $ݮ'Nhݺuz7~'Q[oUESNٳHi׮]Zz<dZ5g]yJOOW]]97|S7nkFӞFuu;<<^y3o=2?n8-YDMZ1bFy?N8_իWf+>>^#Gܹs裏j˖-{x|w|N/: IDATowP۶mz}'Oŋ+::)))6mM_~Y>l˃s~[YYYׯ?|ڵ۸{MVkk?7-뮻tM75{>--Miii袋4o<͚5S#u3fp??WytL`@ǹ̙XISO=,x IZb zJ=oذA UW]f̘4_ni}ʄ bH}IOO$=zYP;wGuoT^^'xYӒ, l=+>>^zM 6-h&IVjY^x! W{cy#8p~M澣lִiطo_1=*|K=Ϥ.:zj sj򗿔dҮ]xtWH;>;p;wU|'LZׯ6;v|sefY^xa;Kt )))n۷oWYYe$ݻm;K~¸q$IgΜ:T.1tc;lБؤ|.B.0^Iʟرcy]nCkhFW^;S&IuuuzG[LI[M=޽{G2?`k׮յ^L3F_}Ui<(??z%ޣѮ]}sٲe]vuI~etoXﯧjWW\PLNNVLL.DySRRӧOO>UfR?F@7:"uwjj̙ھ}{ixNg#ܩZ::W\PTT_[= zݏfnm52LGk~1z>xݫÇk~SE嵸g05/jҤIJNNرc5vXUWWkڷonݪ/SF\9j[z =4y' wY`cd y#k˖-2e&O,ݮ IwLN2ERN9zL9225j,Y"ŢZںuN>dwVVΝ+I_ y׮]SN'|bncޮokIt[bXﵵ};6m"##e4zh=ZsUnn.]o6e1<恵ӓtWݿ|s \RWgkk~qh`n֭Ӕ)Sdte'ȽK04\kJ,X "ө{Ww^mmm_|ŋ+11Q_{Wvy{4~R~Mzb=_^ .nUW]͛7\tpj6 y(Zbx :T#GuE),,L:uT;`_]u3ۖZ?F`:os;ܶm3gixJKK'{ڮL[PPA֮mxNPm6f;"l2UWWԩSzꩧ$]xϠgqr8'sUUn&mܫWp8g5o<رCR}k}zE~t:%Gz5kָƍӜ9sLǎ$3#yIі=׬Y#I߿;m<%%%6lC (e??qRsy6m)Zܟy]wֿQXXbIҐ!C|Rl?:o{]0w}WR{1cNNDu/NqFI9Vo6TM6Ցqj<66:{"IR*_z~8j;P}ֹ}f:s挱=ǢEZ _wu0U]]GDD藿_ym=aݺu?OOMMՂ :Xfd y낽6/5йzR˖-ӲedXtꫯ͛p 4H_~RRRNdobѪU[o2:uUWd2i۶m.֭[5}tI/*;;[UUU_?{@ճ7֭e]'jĈ?^|&.](=ھ}o߮|l6O^xF%Q,**Yϻ bccl5cǴ{nwy8qy}^Gvzn͆ t=Ƥ@/nvEGG멧ڵko>EDDhҤIK%_ ӟϚ5KsՁceggBIII8qVTT_bOEzT`_uz衇1ch̘1֫mڵk5fM>],w867nܨ9sS>}t7Yg-\텺@ճ/+V?G?֭[.޼y,Yx@0a&Lu{555*--pm֬YO~sycOׯ~Vb ZJ1112eL^vfm5ڰa_JHH~EFFoNyy~߸sPRc !C]ZZ~ɄZzNÇ+**Iw:Z|F׼=wW[2ʣ>\Æ SFF-ZdK/ÇxGD O{~>ot{]0ò2}Gv ;W%>M7ݤYfK.р?~\۶mڵk.KuV͞=[ fSAAvڥ7xC-Ҧ29Nw};w&O yk@ճ/z'dYV=C;TSSd-[覛n5\n;111r8:s8>L7ov該u]wi?~n=׬YW`riժU_cƌQBBjkk[^k<͛qi„ 6lRRRJ=zT۶mӚ5kxR[[Or.rKgϞ՞={+hϞ=Qym]{/{QVVf̘~N믿?P˗/bFG{;ܵk;wIHTWW@[|Əjeeen\=s886۷{M6}[֮]ťzc@˒4h vMs/щ'8@gJMMuuu!nӦMƿ/xa4@'!#@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!@!}GU}N/ɤ )NB ((( 6Wֆk/(  %%4Lyd03$I2<a`ȍ0ODDDDDDDDDDF'""""""""""r# DDDDDDDDDDDn}"""""""""""7>a`ȍ0ODDDDDDDDDDF'""""""""""r# qwWѣGcƌHHH/B!ʐSNСCp}{\؈*\|GŖ-[PYYP4 6m4رcx[G$a׮]srrpB?xg'NĪU-zSL1C.[mЀJ\t ¶mPSSq:>T*L>)))'Ob8w~]w{>c_u$""""'""".V3`VѣGcɒ%xwg|D )) ,/orr9h ÇBVuaaa1bN8ѮzwT ???aXp!^x?~<{1X.~xgo>%""""k'""".!K/aN}!''UUU1h Bd6֭[?K$#%%2 jW#իWj̟?mO>j֬YXb@P*vk\?UUU5knyG|p 6Rϭ йͣ444tDDDDDԄ}""""EEELccc䘖wZm""" unn.]נ#.^h'6mykRa"""""}""""?#S5k`ƌd.;^hhyY4I-iˑG6ڟ8q"juU&O F())Avvm;>נ9uDDDD%>#HMMūŋcN9yD"@zz:JJJlnۜJgΜ1/?~s{Fڵ 555H$9sfGbX`x > :>^^^A{5 {m_ """"99޽{ DDDD}ڤIZ^UUVXG}&Ld29#GĢEPQQT|vSX Ƃ ?K$#%%6N;csJZLzq B77ov,"##1m4$%%!..<^{)S?<ߞ0,]jK8}cƌ12 TVV… Cbb"d2Á͛7[oEdd$SN9_W' //>Fsoݻw]]]SGDDDD0ODDDD]ʕ+X~=֯_L!C`ر5kJ%BBB?zt:TUU!++ ǎÖ-[PVVfw= IDAT{{=zqqqdHLLDž pY 0sNÿ/r tM(,,|jhV JACCCgN iw"""""wDDDDԭq1[sy~TTnV=z(&Md7uT̛7>(>V"cƌ`ee\󎲜D9ݕt:6l؀ 6?[o ~@ ŋ[YS^^n!"""""KODDDD=FII y^貜 Z` 8uvsN,[ J3g;ZUtx饗0h ᡇQ]]mҥK DDD˝; """""}""""Y~gWL38}]]v={vJx4;ln9{#U&cGDDDD1BcOݞ^Ǜoiwbׄ̚5˼υ >Fjj*̙( {ҥK!0qDpx➈QOcDDDDԻDFFʕ+mn7~x|(@zz:=z7n>##..sTIaӦMxR0w\|l|;v F7~ߚG,Cu䈈!""".#`ڵ5jmƏK޷oKb9#GZ6??999ۻ]JMM 6tThZw\n^Yn9Ph"̟?fʕ+9* ODDDD]&11(..FZZrrr 4moߎsι=FXXuVk.,_ Cuujlݺv4 n|>xWOB(bŊ;w.:(J"11ROnxXdIv6ovDDDDD}""""999HLL@ Njwm۶W^qI= @fff9r~;hZ-vգ&mqF̝;Bwy'6mXٶm裏 aaa?$'$$ .l^ Q>u_6l@JJ (B,Cբضm222\V#GB,6|1 6IKKCCCR)ڝ>55GO?n/nf}~?~f///466"//iiiz@DDDDԗ ] """""""""""r '%""""""""""r# DDDDDDDDDDDn}"""""""""""7>a`ȍ0ODDDDDDDDDDF'""""""""""r# DDDDDDDDDDDn}"""""""""""7>a`ȍ0ODDDDDDDDDDF'""""""""""r# DDDDDDDDDDDn}"""""""""""7>a`ȍ0ODDDDDDDDDDF'""""""""""r# DDDDDDDDDDDn}"""""""""""7>a`ȍ0ODDDDDDDDDDF'""""""""""r# DDDDDDDDDDDn}"""""""""""7>a`ȍ0ODDDDDDDDDDF'""""""""""r# DDDDDDDDDDDn}"""""""""""7>a`ȍ0ODDDDDDDDDDF]"T`eL4`Cn>usU~vZvٱx lڴˎnyr%\ѣO,/SU*7QàX*5(ȼЩѝpڲHenhg{ֿ;Lj'?>dggcΝؼy3t:]wW3*卍8PZա.N[OgK)aS)C(JÕZ-ULe.;7o4 vwu2|9h!.: iÈ3EYg~5lTjԔ̮޿+a_v/"""r>=z4}YT*2LAaРA1cz) Po02)jzUZN[OGF? D Z-[#p'WTά۹3DHd2COg8ěg|O4/uqa3+$: Fw+LjڣO###j*( p1(J̚5 0`VZG}kLDR؈_dj6D]/J0 \EQ}tF#B2ī< Hv2F5dddtsmRMYˇQj1lH1ko {v gsUq19 C{=T`9~z|u_}֮] 6 'OΝ;Dd:**ju:..AZy%tr,J,BB >SLII 6lՠ.(c0 apV;ה[U-""".% t0;pe|-kZ]o~.+mVW2/XYUP0+0<[ӕ#4T04r$>]LDDDԇF7y֭6dff"33& 1 *ePh4pU8PZF"r!˼X\j‚1o%]Q?)~ވV(J`4Q٨Cic#V E VH%X5 f 9 hI~>=$ ^8ww#CZ{KAr BR^%eVX%Pv!? V'B.JÅZ+.ťvH?tua6m2xl_C=՘Pr 8\VK2ǖ־*,||5'**1-I^HqF%ȬqV_oNWTh @ @LqFСCxꩧORaذa9L8VڵkjAAAm޽{gdd`ٲe=%%CT*[⫯ GaȴcjjQYT‘(/hJ3 :q84A@s8me\E5\8 ljOFA̹$r9M #Iե?ˤ1 Æ _<!P_Skv ~l e 2/⋧v3쇝^1jk>S~־ {< 7=fY{ֿ;tڙO 69--viii5k׮6˶+vEA%X.T R?x"vƭr@?~2)T'Ϲn ~>-E")DSq7_VtB+E")% 1/8:o @N.Ye``i>wx_gId"!VD#T$yjC5j ѨmA!4ˁ$ΐ & >>]ř딞IJeˬƲe^xK1~otV5 |@$͝w?j9G%bڲ*-|}?~,Ǐű~}ECcÿSbT@`L?ȹBy5P5=4TCFPly_~> tJ3Կv [֮5DDDQ}&iew4)<<ܕUrj )q*PPPOxJĐ(XlFm68TZ\m xET(0S v=*uxlQ)T:ujF8O3 TR:HB Ta sn  L#x$ H ؘWC$Xo;͆xqDF#~.4J0^ R^;Cg_X{YPO5Uȭ P*0[@)+/nwvtO~PŸRr ozX! 1'(u8H7ݛum3g`„ F@@ ~`Ń'=t.ϱXzu***j?`K.>6~^JJ pٳ̙3!1uTl۶ Gu3f9_W]?(*jPU~#!n-aBu:d<354+8L#FmEҶlw9ggXۗVC3ο~˞,rPy!=G ~Q;^e2e DLATDPL? a{|cF-CVcڲ% h+]l)mv̓q5Ƞӣe?0MFu$L^A:#Px)jyUq 6>@iny7"mhklW<H{Ymw/1kݑSq~AVTZ#DѷwbFMmlqYgW[N \=jP7t -Wzy9vi^KRzUMD"\2 jw׿GԷnGӈ]E%6)u^\uVf6Kc}Eбٮ L.@%<_- P(w`TgG8o7UPz|'bA"`X38"*|s# Jp+ڧ2/zek밿|# N偳MܕB(Č[@Zuyt:b 0 0V#ܹ߬K.E`` \^MS,7*`0 e >r ϭOPŮK0arYjl p4yl߾۷o(JZm~4<=ّ#GP]m~:| ؈04]KҎM7.)Ȕ]7$`|۶N-Tc+Ip95:rN7.CKk[ ߻ ۙ:OطEcݺuxQPP?eΫX;rfk\iZdPDx0:; qe)iZҔwQVF [X)Fc?u-]gDggmgPSWOq!#'384o5), Z%{\+jsGtWOOsUkzj` icw6-Ú-2/== '&&0=JJJ2O`o;ؿ|ze }  J[ ,p܌s L9O/}~9p>tR PӃ+PziZݾj?_xu酗 V$2"L^&^ q"‡ wh*줦(@+i}'itޅ[zӰD`"& yfl޼ŶRlunS"6mP/]kEQC##^x !U@Ӷ[7<OaYr׍|;{I%t81JNs Y~ ? ,~wrE4[: S$yi0'(p䵱GeddoZFHH 1tP466B" 11*鐙Z=JM2,\v92CAW߀¬,^B։8k7Я6LJzT[dnҰ'Qzi h';Swso땲NgP o>߻ۙ}#`V۟H@AS,RԷ0J:^μ PP~J%)҆F';fNwg 5O[FT:2rDŝmgcoagWWpB!d @Z}=uK(Y0`0`( lٲ&L@RRRmSsd}XSVϟzc~s'C"C,"$>!q~tTck.Y/wlOb>Ƽ% GP(^Cƞu$JZa:c*4'wwr8 MGܸ1|t߻ۙOaaah4g'\?"*u,'_#B!GR q*H%x_$^< %.J?77iMZc2>id:Ζ#w:\]/qǙ=<HK" P؈.ewYؽ{9aj9 IDATp  Ennyľ;ij+|(C!<"~٧Bea\u>9u kLwHp=͇ h񶨴)Fϟ P^W䟳^>z3W]_Z(5,xHrL^dEMk~iDDD }&̓]/&&ի]RΨlh4B EVgTV3h7qV˵Z-.Da!VA*_NRC#ëH,h/0ۑvL1tY+>qM*|(ȄBxҕ6S*9[FFRRRADz?~OJJBuu5L)~OPye;T>ޘD  L&[-\*L2C$_[^PMP&VvnZ{z5ԯ,,?ǍKCi˖_9ro{39CZ뀓'O?>vÆ OO`0 )yBm^J Q\1}w;*F"Ls`n8ZךNSi,}8YgpP<>$=|4Zܜ6U5HP&텝E(o 䥙յ:FOH;(@xI$HxXyE~x^wgq<)\TeUq3O1*'Mp;Wm='KO],in7>^*AkJ"Wڵu _}R) D3(/U{o13uVM,EGGn^P`ʕ7lp<… Ǝ þRs)HKH M1h4@uMB! u,!&'t4TܔG*iW_;|TUM&ftF;XRmS 7imIqGH9{=gu;;~=;hH9jg~XrF #$FF(H`zCV`R$HˤwU\gϞ5;ǎ3?z(j5f͚_~yyy@s*?w5a ~جiÅlnsjN44=E`{1lHu+ȼh

3by > K,ABB;̜9ɓ'{nz>Q Xdo/B!rFxy["IQ%㶐@OHTZzxI$Ojjl>|1Wu8W]z 1SM(-w+14wy|_Xz46 FsRE[aNP"O%eD(OxFF|g=jrF;Wt8;GA.aEHRUT46B*_&A&~h].Ay]rEHizUK?t: x.+Vo@B|n/0u_D9OGT Եz=}%n>QQj}OTa-Gfjۯ(,Z,$?ȄBL8fuz=-y;Y| !V!+:6& m~h}۟tpNP@3pdZm[8}c3Ͷc7 D)|w?HՓr"H6z+\LxS8qÇw܁dرc6o Ku ?q>^FL# QUJJQn#W4` u fa^ uzdjkh;\&TV!B)D@zuuȨ2T7bnPO5eRȅB&o3*iHFj: HJug*<Uˠ7Q֨UgjpҜǞCK[8}cG7`˘OHp{Kq?{y;w.7Ù3g0|pt:?KrJ̟?)))R1t0"E@(}} JѨCinu`nÏc䉈1 ᡐyxף}*7hK\|1f\ ''}򴩭LDa \}:q gv0h4bۺwu$ORԔ#sHۺ0[U'^W7MGQI T$W]/{jʱ0C$cٓB@WUgDDDQ f/%""*,||5KFDDDDDDDUoQ>a`ȍ0ODDDDDDDDDDF'""""""""""r# cwW[7t`e:6DDDDDȆ:]o;6DDDDD] T.tZ N kEFtT86DDDDDDDDDDDDDDDn9DDDDDDDDDDDn}"""""""""""7>wwYcǎ{Evvv׈o֮]nQ>4oG 7 //>  _#==OFaa!~iL:[!"""""'>'997`0tsz;v`ǎ="""""^@&!99FB||}6m™3gl{^^^ߏ:ێ;k֬ٳVڦ<|Xuuu{rJ1/_ ** ? 裏`4[5zhسg,Xɓ'# 555HOOƍp[;CG [n׮]ñc?"''Cu뮻زe) |HNNFTTP__l>|~-ǻ x7i&?c3g`֬Yjvq\C (((Ç_v} κ/Cg_'k"55:WJJ ͛CT"77[nW_}^߮u,w}D>3g΄X,ԩSm6=zu|ƍC}}=?BbС6q!/{>;wDYYպ-[`˖-XnR)-Z~6zVSu]A੧H$Vţ>g϶櫯ڵkKbǎ*뭷'x/6u6m&NذaN8aNmgKp@HHn&?_ P*X|9 lV2_]vaϞ=,_pY g^o-_W^m~֭x71a„v3 &M`j#[isV;<?%3d$#}DPPԪT+sy WRmmZ-(nX6qAYEf$}df2?'dr]9<,'p>,իO… \ji(9ޣ{Zŋ'0|}Qz=/gz>%EK)-J_M&Sc"##t<(ٹs'Vr~-[p5yƌgΜ9|\:ݻq !B!m]r`ɓ'GZ}Μ9n:`@EE3^ge2X|9~i ##^{2)YϮO>|=Ϝ9Sl443ͼnATg븸8 -d{ugϺV+wnr9ovlwyǧcnذa`*+©S\g4_N୷ުuظq5Sr\hoP JקΝ; igu dffk.xB!BѾPٳg{~nhʔ)=H'x/==qM$--T 3gdɒ%FjjjXb"3}gVgFniieee׎'6`ψ#)})^vQ4DppsC||:f[,n{AWOs$'';_ر~mj &EK)QJdq8ptjiii6x71LM:_}ΟoF !B!h= ̙3INNGq_5Fzg76+7//XFo~mFŐ!Cxꩧ3׭[q'JԳl{MMB;fzVyfCRѫW/uQgݮ\~Gٳ1 }Ƴ/1EJkW4n Lk|)(?.ZhP J8MѠМƻFB!BKW)SOZmnhT*`t\HHHkkky?h`>/T=/:m$jb&ɹPx ƎKtt4$''c2HKK#55}qȑ&4 v`:tȧ㢢)[~1c>//\YJji=+9.c?Tǡ6ק7v[KaaaM|՞ƻB!B}GxEҥKh4fnʾ}ܹͭs7o3^9fU7/A"}_ӱu=7tf:)VWJW~~>?0> SN%((^뮣SN=g\ux[G4Fqac}u(y-ki=+9.c?l)7 o^ƻB!BGߏFjOpqV.YUVV:_oذW_}Us?twɾ}8vXǵzn,chBV^/L߾}0`#Gdx.^cΝ>_7F\V~jbXjAu޵[\C{B!B!Y<s]Hp^v6kڅh;zN IDAThΝ ]GVtR ~O{=7TGzޙ:_y^`Oǒ¦MXd w}3N`` rKHNN&11I)+ f|;נ#' COp)޸9P7WKQJ[w!B!;`­^h4 :Ivn=;w!C4UDDK, ''^zFLL O 7Xֳ FddmSLqo=WQQuCߵ>۫!555E0}QOxiZϟs̸v Rݻ7=zh]5~;޿;믿~m6Ç73+_YqD?,\3~Vl_4gC^B!B!'LFL7o߾h/\StڵEl?йOCQ :3fRؿ?^{ݷoӦM_7 33ӹdre˖K/ā8pzuưa8p yFzBB?{&+WvZկ~?LmzVBQQ&Mbڵl۶r;wsQʿ/nɓsqq Ę1cX|9_}sfoEEJY7o:tL*++b̘1?]"##3}krJV\Faɒ%xٳ뮻~\YV^|Eh`_qՒ[omFPPsMWug(]5g͚ţ>/vɊ+RR1["44 x>}:JG!B!fl6+V`߾}̞=޽{)((ѣ{q6V'|y1~xw`¨ݻnѣGӳgOBBBX,\tt<Ȟ={)/~a믿NzzY~=^{-{8pvճ***Xhs'O&66 RRRشiS<־Ggȑ-i/ロ#F0j(AQUUٳgٿ?7ok9z=r 'NĉMO<]wŬY-44Ο?ٲe yyy7<{Lg}F!B!H`_!D֧O\J#B!BB!B!B!:ɱ/B!B!Bt B!B!B!: !B!B!B!B!BDBē}z1"{ ڸD[ԫTX;))>hϾɝ~zٶ@sg0|(!Qhu:w.''=o}x/(.g5%9.w5_[;v7zK$aP|.\!B;wf 4AѳgO4 ?۸“ё5f),nV".g{WsF~~>q[5t4CB(,ۺ8-ѥ3yd;'NkGy,uΩ73o QGRџB!:*wu1D3L$F|Ux"Bxv](gPxiRn:_d_@wL~"vz+ݺu#--M~4tw+"o 6i_Թ0;vEiz;rTi>O!B4UwwC) !tf3^ Ӈ%BgX,v6 ֬4g\-u~X)rssYn)))m\!ZTK妢PR\Ϟo 'OT՝LQU^ެB!uUsrrx9q=.]bҥL6&]ym] !`}A}qZ ظqc[CEGPuA~T=WݖO*B!hG;رcG[C!hڞ B4V@Y'g!Bј*5ЫՌ g`΁zZ-ZrM5(+bJf?xB_z<];3.2kYz gPal6f f3?Wp<БKxnA2*^8,m0`3)e/y6HnGMm-+RO1kg TZkٝ_gy깽K VR>skn=0!:A!F:j,2***MH_Ӝ~t_C=zܶ1"{ |>א&FGHF%S "E3ʒ^t biPT$2.*XZE̩J/$<-:!Fn$* ZMRrШTL`TD8t:lظh2E~!6zR\O}Cƚ3PWJ (yiM6;}xg|>h4eT*7nt4i˖-xܚ5kؼys王cÆ ۗ?-ZSǏܹsݻ7l>S{=~c`nyiv{q,(L\L;ѭJsi: J 4z=JJr/q1mEUiC;E?q[L~usO]{ӈ]P 9|G?afɝ~q[蝥Ip{#f̝{~OZ/@!ӧs5Š R9mS[\(Y}Fd=kk~C= !B\i$`'mR~`Z z!&iŠtaZoTDuDu5s}(~y"կpKZA2!*fV^jŽz/XS9 CVsS\ % {R<$, R0FR>s.5ZDq5s,u^@=s;-0 kPwoaog]X@R`  ~^O^O.uwD?uRgWF6CS:E,NzX0y@{=V4ןHIIaĉ$%%5鸾}R8q?-;^Ϟ=Yh}eŊV];ݝ=r8F c8 /O6pBPhqvtU2;̈́{bجuދ֕ EL}UV{ }31Y5{p_StCQ$CҸ1cϻ.zB! _!y8AS+-lFVPB./ׄ8V+ ɮ`AA  A\Pw{ ZBu5N,_293tӧygݎ1{xǓLFFw領$f̘Veڴil۶\֖y8/P]QALBLVc̝(̺z<^ \LMb5UU ߄q nz9["/~{sϝ^vL׈tv;/kLƍOZb!}`!sNɈ9,)M.G뜫SBnz S= !B\i$0h4=OEy(oɹĬ Csy6fcM.՛b޽5a!jQXS7@Qkslm[C *?K ELŜαTǫgy=;9,0&2I%p TK݃\VCK/Jr^ʋ yt α,*C C%šSEi~S$9TT›Y7.,"0*2CZ&DEZ^)` X=%<R!<;JŌN ~`]~leZx{mٹs'Vro˖-9rK0cƌV  S}B̷]x3i{RY+e%39|uZ)ͫv6sj-|m@Re+sd8 ƹO@x\l>ԁC\:~Y~~?ܻaG>FM盛f'kIuj̐28A!!\h!jsu5yrOMw%ػn'T%uS/w8[Yʼn7{9%UĦ 9u`inQ["-- >ӯ_:j5:Hix***xܹ\{zZy _ g~g=~AHd Cni2S2U#O)R,>ݎ7~ #nOLep!5 iT~E.Jg{ :I @։lye, FPd6eoKuEۓnwojjjȰ/@Y?پ};.^CBBܹ3=;pwZZ͛1Y'NRښuo i: >OS==JC j1\!->oD鼗Cxvo'NЯ_?MdvԽБf9>[֡~h4t:j *SlT*zx_"8<S&m"h Fi h&R gyH1h`u^t{%MǸ@Ra)F@D\^Y a _^PHHtO%,BBTG77a!i$I2SS[KVu5*9QZFz+Eō,*X쒺#K~T|s.GX޿OvV*AP!OkKi| 7fKVd?] imT!?YC"fR[*%%nt… j 2L@@Çw [,:uRQ}?>m檢6UB<8fS~4\RI\Y _^|Rw|ǿ4xLHT,:E=zB!? wpzYbCrx(zZM/^#)1sYs*+ER\?H.t PqK9Pݼ 4r޶~R?WFxWW 6pxԗo+,DY95f̶51*L5Uc鄩m IDATjWzkY… ׏ nĉINNט;P`mHݙk 6@}GQX-RvIᣔI2d4yZ'=־=g{e*;Z:L{ؼulZЕBY!$\Oz?}qPRd]t !!FѪTDEL;MlXm6gZ1v42-gי bn5\ ?%1ѨU*6kOerˍCKATZ mAvWBNNDFFg} ߿&L@||<)~{md=}pysPZ繘 x4u2]:7ش8p:qCX@&?tY)?PQsۼ=omlg H= !B;RřS RBopE&6g*8SYhkѩLk@b%,@Kx#pmN= h٥@~\--) O)+l=\*6R0/yE㔼(%%%;Çj:ɔtQpdmZΞc;*#ǼB(iH3n\(vg{9r^cϿ70eO~B>Z".)ꃢeB!Ovp5\Ӽ[P ̋:K9\^찹y6˙5uÅ˳ ẻ{n`qӎ—z֒{ 6(mR涻RӚAjɊ3>*P~LW?5o\M\SU}LG)2p@RSS)//1™Z7ovE{+JSZpb:ji^sj'y#]ѕTm͟esy9w8݇ b S=cE'S+w@]I= !B_&-\~`Ϟ=Fbj(6\j9jj3yΉHe}Ai0N+Y##ٙqa}&}F{K=..aFl'H PqI?O~X_s])̎q>[YűҲyC~XihAFgP^Έ0"u$0?9"L<qʷ[J^3sLZ- 77, ƩSҥ_|UYig[ׁ C'|}7P,.tzFޤ2T{`I)/gW};_ VDgb=9w8sK{Q݂1*cG{N~U%ס1\:}Ƨ㤞B!Kf+`Ο1cƴUPH|S;E1:4*3c;>l9g\ vS3޷umH碤} _ hRΠ 1Qt0s}j(=YVNQYQzȹ8g2Gu%O~X_s])@Ri%fb O0?Mrd%-~.N]m2+5 A9%?JϟCtz;We*ɵ߬ "s\^otN?ֿmIkהo0RXl C|UN)&|ԳB!]U3CBBYwݻYk9s]vZZy8{vatD8GK( PgXx(uuja1vERx|]X%'4@KFE%} gld8_UMjy9Mjk j€˳ભ|SXwM/jjm OsCFS}zuA竪 Pjdph` }VW{D=Y,\6JF^=8YVNJY%f3:NrWx |UPDVU5*)ee(-g` ͞BJ-V:&FGbh(XNqQ_ 600Oq>NkkI^J^`28}4R^^^'xΝK\={q &$${QQQסs8TUUQR cڴi⋼dffR}9dr;ʒɼbJbz0d44S]}zǶ`Ÿh_]eIʞӽ5C|.S$OҘx# -55˓Ͽϵ#I>>1w6>%lߙ==g|OEaZαt8}px_SCg"^4 Twsm.\bj:I>7;zB!h/:NDB,Xӧ/}zuQwN>}W_JC S;l'"= ;H7/+Vq6g7.)eBe$ ADtӵK확U j^:PmsΜR|bA.k41KbQ@O~誹>.29cwv\L3Kx\۾Wjio_;0tjukدcd_$Dm0lA@b:nR7R> A7v?J6d_N0$4!?tϋz*yQ‰'HLL- 7C95k>Xpa~;wdŊ m̙3Aѹsg,YRg{JJ -j͡>fI%&.}O=sK"izO`J`Fz3rtf}NOV@Clqٌɏ72hd/1wc̝꼗g/־?_7{d2G&;e?K~+B!ڋ:Y^~Hgld8CC`qr.(lxfg2=&aaPnYYŮ|TV3s}WRg42 HwC TjmTWRVΞ¢:ycX{*)B^GZSkޅ2>2F!Z-ZN;2zie { 19PAjQdp*8VRLMKRڀesqQ P)5[ȨWU3=&멲ZYqQ'Ffqdbw^!GJJY=bpcl' j|J^Zĉ̙3_ߡǏs5`XHKKkYZ<̛7ӽ{w 4#w.gĜH=NTV9ƶy(N&:;Zb.Lȧ۹t:ܤ2Z6zL&"3 Y^TdFŏ%ZoÙoO3I$ JTxZrL&玝ԁo)eVv !4q!,B8V/B!z -> uqڸDB!B1ui^B!B!B!UHB!B!B!D"}!B!B!B!B!BсH`_!B!B!@Tqqq.WCs FO2ޅiB!W+ ->GUm-5fJ#'Bqeѽ0UTP_@iB!JB!B!B!D"9B!B!BDB!B!B!D"}!B!B!B!B!BсhۺBj*ƌq}ǹsZDBh/`͚5l޼K$B!B\$/<;w.aaauq￟x{'Nqچh3}t"##t|W|X,dž0qDFEbb"QQQT*9y$۷oofWB!BE£[onݺ&+ի t>gn6,Qt̙3'N\A}~vO?ݶ%$$iXp!n~,\^-&&&Mw}{=B!W:QIZ 7@DD7nlѱn:RRRڸ4_j5o?~<VǏsiV+Ջx߿3_UUűcl6ӳgOh4 >_|G}!B!I`_qQTq\p={q U`֬YΠ~FF˗/ٳn׏sSRRXh_ëPΝѣ`0PXX|=/桇cƌaժU޽e˖z7o/'|aÆQZZʻ;CBB?8 ͛7o- 8j(^xyv=u]GLL 8qM6qZ m7̀\:ė_~IVVVxwP^^֭[}>.((nѣG@xx8&sα~>cݎKJJ+{=ѣ gSy믿Z +B!. _өS' g̛7{{A o<3:0uTN[owcxXr%,^իWK/,JճZ楗^[ntԉEa6Y`QQQFƒ>H~~~砠 ^y|O1~xƍk[ox%\=#u]nù5kVطo_ G}fO}#F`ҥVߟロx&)Y?c-ӧ}[n7 }s(=.T=+5.}C(\-ZșjˡgϞ,Z}b ,[cyk׮tڕ }w9| /bnj=vg5db9B!BёI` ?~,***0ߟnȲexHOOs|^^sÚ5kҥ OguLO+mر,[ Fb>ØL&vʬY{M6oa˖-̞=Yf_ݟz)"##l\rii=;t:4 VSN<h4~_PUUş'L&<̚5}GDD'Od۶mܹs?ܹs|WMS&N buVN:EEEaaa׏;_l`XΜkeʕh4;ƞ={#00>}0e"## jV|Qzs=ΠlUU[l!55@ƍرc1ZzbEK)в~t۷Y|yuRa$''ݻ)--%))3fj6m۶mM.kK=#;ķ~KVVjD _"11ӧOSUUERRw}7 "44"{>#;֢ϊr$B!BtTؿܹ"m[ne֭]NҥKcZq{ZCXX< *x ~:{Y$~ӟc9}?s5Э[7~_8:\L4 7raeji=z9p]ta̙T*`0x۷/Z\|,[nvb>(zŋ3x=㢥JC&1M:?ܹUV9ߖ-[8rgBCCXn[0 ™ZG3}t2L,_BDDO?4`Ok`gOvvgΜ)6 f^~e}jj3u\\Æ zRv 0b9Xf۝y[ `Æ `g NjrŸT_sV[oU'(qFg5j111^ϧh)%Yq?`OOÝ;w @(}ӄó>d׮]n﷗hO_Fî]xXjF۝wܹsYF >zB!B!j^buz-7s{䘭WQQ'|utgƑ7ݓ4֯_S5̜9%K`4aŊm6[ .YVV|yra =ns 17hEK;g:tcbftW4Grr;ئV`Rz\hoP JxM@lllS7|Ԥc5ׯ_o5ȑ#,_˗uVmիyꩧ7Uz!\%K8~^W!B!t ̙3INNGq_5Fzg76+7//XFo~mFŐ!Cxꩧ3׭[q'JԳl{MMB7#XIFF6 JE^JѣGurJ~m=/g`0Ͼ t[ZZ)_)((h0Qjjt#hֳ=C%(Otx7FNӗZ/57}U />mGm6fΜhdܹϹ0a۷o?nR9B!j"+)Sx iלQtt4* ^}w}:.$$~kl IDATัZ }Z(QEDDDDDD /5gϞX|9d2 كcǎ͛!iӦlj˕$_QQľXY$?GyG?J%z޽{cڴi+pYkԨQ`*>5ޜ?d5l(mLjq2OYqSފ7Z GRƻNdn8yuCk"X/$ ._e˖5DDDDDD}7w\d2L&,^O`h▹Rx}v'Dǎ1c;_~q-*Gb7Waa!֯__ HJJ€зo_!::~aܸq=,%?SJx#\MT?0L0 Ơmmp>mF(((r111n| ۤ^Zնš=b'1e}۸B8liJkׄJ&ܹsg]())3<\KDDDDD0[o޼p?LnQֱn=£N ҥK999ذa֬Y Vŋ;<֛,kxeā3qßg!>]Y:[vjUWW `}oGlg;[ K.nʝ־ wNLL^Z%sba]=]gΜ^;[ĸSNkg3ah4TTTgUƇcb߇vѣިs[h45C`;j(s!44555Xz5*++qI|g,}4vXzЧO6rH?๊>k]b_/gzfCccc/Zr9OK:6Ii[nܹ[՘rw~mf?Sޣrba]= 3o]}Pc?~r9?؝ɪbHR駟v=b}߾}SfBlll}O.|ǏL 1Yq!F?g~G7;JOOǹsXcƌ.܈)--ѣG 6 &&F/rDDDDDD.>c,Y2 6m§~ HRvm7n$ pw|cǎ h_nydee ru:򆢢"Y+V@`` 6l؀ǏχRDǎѧO鱱›oYkNêUi&_ĢEVg1aشi݋r#55UX{dϕ+Wpi  ʕ+qaafoEEb]/8q"M s%,,LH0=zV}(//ǪUj*d2,]ǏǑ#GBnݺaĈj8r۷qqqdxױ{ndgg#""ƍCxx8N:`9'ǖ㽠۶müyVe޽ϟJ1dd7ov=-,+m{땔}ZI{⧪^}?bx͛kA._İap ԠgϞ̛7o^w?OBٱL zr}Q'ʈ}{n$''c̘1PT1cFFBCCp>x L^z]vB}zt̟?_ȑ#G|r h4HIIʪԥYX|9J%F#^}Z5gF^0glݺ>g1{8q"Too+֯_M6!((Æ ðaÄm7o<^V֒5v2K(kԩ۷ow+_DHH\o?PO>FBX+L&֭[={6ly2} >U?[~k\ġ-wĉO:<ċW^okxc{_իsATb>|x}f3~mݻ9Z{޽{{&`bǙf+8v^t J8u>#\psiyM&,YiӦaСԩ0==|As=8p t邠 F"##'N#GV?8۶mCFFٺu+cΜ98~8Ӆg1TTT`5kF(TTT ==;wUYYYx'0w\ 0!!!._wO̙3ѿ 11Z UUU|2Ұk.;lRɓX|]]'N>' M@իHKKݻgx%K`Μ91b"##QRR"XJOOfm;#Fx7شiL4  `@NN;;v\RN~c\XyZ|kxc{8{,LhZZ%""""""qH"j]fk,Xhॗ^·~-"""""""""%VE*bڴi,Rkȗ0ODʐ!CعsP`}"jU>#F4w33|DDDDDDDDDDD>DmnFСC믿_CDDDDDDD'""9pMZCDDDDDDD}L'""""""""""!L&|DDDDDDDDDDD>D "j ]$ k7p[Dn~DɄϜo2j#S0$aKTY98މkS yHIIA||qB)"jzՁo]Ά'8މk3}|oֶx[!!!ԩS6SKHl%#4w3ȉ?ܨv;pQ'm4m۶%KowuWS6͓K-[bR7DDDDDDDNI[J%KHRt:}ݤFSJAjS)aMg]a1J³];Bѡ9}m`f3J F 8W^K_/9L*!}_ `~ʍ&Ǎ}+JS D}4bQe2HA)\WLaaFRT28_(gN}on )(j{? aQI#z4S,*ܨaՅ H/X!ᡈR*JPl0්J|_k:4R)FJQeA^r.(tzd "%4 0No cq)w@TLxy~j l{Wm̼Kvb@naH V@^]Cٮ;6U!:F[ СC/֭eNj^&s?:c6.:S v^ρƌ0(,ԫ}O٪&vDٌKq3 ? EFh!Osš=:Tx,ӾGJ!Qk:P\J qGh0d xQ1κTm&BoM f3Ε#_@t {Xq'l*\D^j B/b^ؘy W硎텤MG Qb4Raa@y/.|KkպzcnIqg_wL~5guh'$ ),Bހ ÄH1ocȑÇ7cK'@&Cb XZv$wbb/'*c21r=b츞ۃٌB}25f6L"U&^- 7lJ|_Xё. ~ 8<߇rp27\Aa!f.hTI%>UJRz XʞRlx딹8TP׵3:0]NT?iy@_SB異;~ QE%x7:jn"dTT`n@JX&r  {J$bUJĨT~'fť(tcqX%FouW׭ .WV᯿e`3/*Ƴq]FLKvfۜcw @ߐ`@N3/ʦ\ZQ b""""""fmZٳ㏛E@,Áz9*[O=T%jn!Jp-IJ:WjK$|6}wWlI$^M"~OoܬLj o͜Hb\-, vz:YT"$2c%j qJ>`KjN8<_h7ou gnݜh7ni;JL_s b<;74zN> sxeള[.]K7@iI[ 322%& rZg\*'K5 DdE%NDxu flr J߫e27~wN]Fހ08_?ZZAJ/@急~ &Sm&in5*ŌCWT됬 B*E\VK@@,P\i9Y{ O\R1&DDDDDDD0`̙6l`߾}umbY*+W햦hj啈R* .Un>2+*VƙJKߔ(q`qo)R?e2a ƚ_lh{xR)nNv:qUl$Tjq(1Fyɒ`I$K$bɑ="<pɢuV?9"Ahr0S. pkf& 7ruw5|!O.r"]е:n%5f! l`ė7po2낣EZU ?5j5;h69.%ˌFw* vٲrU`B*E r뺟/{.Ж]%!NR*@&Cv9 FHZiIĊo 1=d pA!f Þse8SZ5:ciB7)(DфhwF!@&CX+IZY~?oH0bUX@o@"(!OoUkoj3}YvݻwG<>,\:uZ.Ct7͵:\P~!tJ&Ud67%пľu!ގ*tt0+dۗQlПJJ12 ]P`VgUVaC%~ #" J1Nj o_&b/exr6fwl@ = i4Qirqh>$,SE9<䌭%vZ}[k4bт"t @`(z%kLf3>vAr>lz vF' >3*j,x?B~;9H!Rh5@mk3ly|.BSvJ%2j^V(6o4.nmkr YU8KUxQA3]FRTD]9H/+Ǒ"aJWfl- ##Ñ BRTRc3,ɘKJ14,a1РǙr/Nb2\%vhR"@&lFUU8WV_JJ)xabȇ0ODDDDDDDDDDC"j>WƠAn{衇pʕ&n$lܸvjnL]F~~>>nW̝;?0`8sL3ypM޽{ߎ0@nn.233qa=zF12 h{mٲ|(&"""""j-'N;… LbׯJ{ʔ)EMGP`ʔ)3gδ٤>V;3﮷-663f ͛LQ޳@&Lau%Ԓ7vXgy͛زe ==[C"J/cСɄӧOŋ0LB׮]cxٌ?.פIVQ]]GZ &͑H$xׯ_Ǒ#GED7ڀ' IL\/__ݑW555?|7DDDDDDD 8:uܹ555""M.Gcɒ%:wG5~xH$}<:Qk~+T*1p@ 0h׮QVVׯOQ\\lhl߾:t1|1?C8p bbbBOpiDž7BBBp5<裨AzjbŊzxӦM… Q]]zK,A>}PZZ;v?Dll,-Z$a׮]xwa6k+%%k׮YĬY0j(hZTTT̙3عs'~gZ ^zI&!)) ,ɤ7oɓoVg̘(//Ǟ={\>sX@ʕ+HKKz%&&+>q$Ru5ޭINNFhh(z=rrr;v4ɸPqb_Ç7b׮].쏯C"55ݺuC@@]/}L&S扷z qqqd25 {/:uԩSO֤/nJB\O^y""""""_~+{!22CBB$L6 *fhjZ-FѣGǛoYآ"]VBLL .\OgaÆ v"V?KRlذ;vDFFb0 ={6Xn$<#w|͛'NP`С2dz-'O͞˗ -+\=zG9s&~a\vj o;,XPoeB8ax饗?://OlqFo/^IJe꽧`gcŊd0O?AӡC8q"Z-f͚"ܹ9;޽{/&NGK? lƪUP^^n=BL&ի~2 O= :O<4 &N4C!44gϞ޽{QVVxBTÕ+WpF~q;Xسg~7TTT 88ݻwСCT*jFZ 2 /ȑ#˃JB\\F0.Wy?bYf I٪*޽ϟJ!C0x`j^>Yb Ob 8;vrJ}aXc5tP8x JKKqA.c̘1ػw/N8z'? ;;RHNN{#>>pETUU!113gD^hPTT_}~g„ {zn"""""֊VwQTTTo۞={glڴ skc2Sw%Yw[S?L*,^^ޏ>7nDbb"{1|W())wߎ;?,u뮻0|p|O믿Ǐڷo &@"_>c@@@,XrF ŷ~+V8xО Z 1={ ,իWkm/ wyg۩j1b>W6 ,[ 2 & ׯǗ_~Yo7o^X=<<s`)kpBdee ۿ L>O>$J%.\#ơ:1aaa:?~_~ؿ?V^-|ݻwǍL2?VZZcccѭ[zydggcx Ol߾oFC`Ȑ!,\"N㉈Z!is7dee~RƻL& s=L`ڵXz5>sFی3;vp93$˗/$fnF /!$kupn Ra„ Xt)j5z=^yQff֌\m,++^[zO(,,6ӿZ>1:hZQK _O$:v(3p1/NkP9vo%q ~zHHH@RR }xƍ `)Q^{ƈ-Wb;L&F#ry1h[ܶO[:OYqqBCKvuqaÄhbDDDDDD0ۅ&[,e"""D; 8χT*˅=-RJy.`)ǒ;wbҥ9sPFGRa _~|ǍJ 7>mRnj[1֘> m\b}xwYq!V4m%~ڵkkg%lP?~ex\ľ nyd2nFZǺ9 ''';M*44K.`Æ Xf f3Z-/^Xonŋ< r$//teA`ljڵQW]]-[BBBel-.]u~+wp[&<s=P`ըɓ'gرc~C>}fwȑ#?C***^;u}" ;EJJ /tkJg>}z, 8k$nݺsnVc? .YfOzʕ~s\u5/ϼy󄟡C6{l;{ wynV&Ln|q>azYYY܈XJtvO?\x1pߘ,Z =55 ܹNmٲE myE Z%&&bҤI,ekgl_7nmz-\i{ԩ¢.\pڮx555عsgCî>L(1}Z%#lr;U ŐJO?R{+w}]ǏGnnoNbB8}!~fϞ-X4%owϕs$וֹںۅ18zsJ$odj(DDDDDDmq1,YLM6O?EFFR)n67iii;\>cDŽ[z:NH yCQQ֬Y+V 006lqqCTcǎӧz X`y7߬]aժUشi/bѢEBi+o0|plڴ {Eyy9㑚*,Jgʕ+8}4zAaʕ8|0YL8ӦMCFFN<,TVV"<< &$=Z>tccժUXjd2.]ȑ#˃B@n0bhZ9ryۇ8d2ؽ{7q!<<NjXc^PPm۶a޼yPزe vލCRa2d ͛7Ԟ@~s\ܽJJ>h=SUUU>~kxc{bx /bذa8qjjjгgO}M͛7C;=_߾}XkMADDDDDD1vލd3* 3f̨h4^ChhhĔ)SЫW/kNOo9r/_^x)))BYz}2+r˗/RhīZUzz:bի̙[[,{'NDRRm-pi&aذa6l-33ͳ{Z&>>PVV^zihԩ۷ow+_DHH\o?PO>FBX+L&֭[={6ly2} By_ V?5.qЖ}ĉx'Z+۷ƏX1=믿bxT*1|p >>fo6h.qf ;{ݺuRDAAN:>.\9su^Ʉ%K`ڴi:t(:uꄀ.j|s.] ((F'p?8mۜ.ȷuVqǜ9spq ۽b1ko IDAT,1QQQ@zz:vY+O`ܹ0`BBB\\/3gHIIAbb"Z- pea׮](..vRɓ',h裻N8|'N>F^իWݻw#//K,9s0bDFFD.vF˓n6i&|74i ;v ;v쨵~/Vơ=ZG,:pΞ=)S %%ZrCWU㊊ 2!"""""I"j]ft#55-KoEDDDDDDDDDDԪHRL6 eqP%"""""""ֆ}"jU Ν;DDDDDDDDDkQra1ADDDDDDDD5ODDDDDDDDDDC'""""""""""!hss7]_5x"""""""&>8QVV7o""""""""cbȇ>abȇ0ODDDDDDDDDDC'""""""""""!L&|DDDDDDDDDDD>}""""""""""">abȇ0ODDDDDDDDDDC'""""""""""!L&|DDDDDDDDDDD>}""""""""""">abȇ0ODDDDDDDDDDC'""""""""""!L&|DDDDDDDDDDD>}""""""""""">abȇ0ODDDDDDDDDDC'""""""""""!L&|DDDDDDDDDDD>}""""""""""">abȇ0ODDDDDDDDDDC'""""""""""!L&|DDDDDDDDDDD>}""""""""""">9>؆>؆wlIII8t:I&5ws;#{ СCHJJr\իWz/۟N:yZD?RSS9~qADDDDMElcz!HdRT ~F^֕j+qc BEaNG{auve\ -""""P`Ԭ7 N  ]:Z&ܹՂO B'GPT47ϧ#;U6Rc.0-z ܬ+eѿծ sf]w`F\{^K<Z-l%Fei}?]# PVVǏ h/,􄧧'郉'"..Nq͘1/2???̘1AAAXt}---rJ*On0|:Y...*E"D"BBB0~x|HNNklMTTz-*-wuuELL bbb?/lۦ-EG>R裏l2xzzb̙Xjv׿Տi5 }6xr^LMMzjx{{\\\0c bҤIpvv / j """"QIޥ:_Q$ qa~͇CgWGhAoPmOLMM!H Hjj rwCϘ'`섾cp=Kأ}Ird?7QsVv]8AqyQ16Μ,p슂7GkUJ$ߗlRy.>xzf?"(UUHO:W0Zk 5,i(~Om`5Í >c„ J֬Y\z>:|1h TWWɁ)D"ARRƍ???(k׮$H8 СCIR$$$ʕ+u놨(&IIIQ@,YqEEE!""8pJKKQF ÇݻqI/X@Î;pxxx >>SNUUB!R)ӑTTTݻwȑ#akkŋ7DVV˞dj+Wc6l-Μ9>HeM뽭 ŋC @"`8{,典8ouVġvE[C}ϭz?~8v܉1c ..ǎS1o<899˖-Cyyxu^}v}izmm=/ 1Kh뼰@ iӦA `֬Y'|jL>S7JbJ)~zLMM1fi SNBRS#8Arn}}['Gceg3SSSVU@ޕkJۜK܃q-kW? zy\>2agzD KVNpg"#6"{Y@R޼XC3)DM3 2;ViL|4{d/=r>l'R)rssU${uJ$aر8}4-[ҲD71?bgԗ4H$x7qMO0t&˩V''6$,_\Q;wĹsh"Q&jBCC @6̙3('>s=ueӦMHJJBqqʺ$$$`ݺu)SQԝG6q=6Gx뭷 PYY9sҥKJXf ꫯb޽wO9mv-Pskh?S X`MhĈ6L}ٳg5ƤK[ mkyaHǏ_ڎG׋k"55ѣG_5~Md5|ML!]/HL/Hm:9b䛯 w/WH7TLO*>&d< ~bquQNhX>xUPs`fanC-3\]]SPԶ?rgv&* ]'&ˬ__}H]>Y-_ݮH\;j{!b۷OiYVV\@ P1112._ pu$T*Ł6wD[UTT`ڵ*"'%%!//н{wO>DWdAA-Gܴ-[M]xQѻ322*jرcaooX~JW!2B!bccU1dm9/yjޫdH$8::bdC}̞= 6⭨0kyёDW^Uݰ]033S8\/!_d8Xf&@ܳobd="""T[1|[c qL@Νծ KkU{!`uٍ^]^|X,ra-rP\ya:9Cvpc~߅/79s"𫢸E{OpL㶅7s4qd*@`ni d0Zs")) :x\N> T*޽{>vvvXl~G{ANz@ 4 2335ceeeͅnFgnɝƬQTT،-|||z67C~~>:wl,Z{^4ԑC]?~!,, S<~zb>Z !gig5+5l4Z見zqTII 1dDEEl4sq(SNNxx8lҢƢ\G;uUuuuW_'NmEM>ZQQ\o/0Rv%8A5z$J ˾ Cb*{m.snnHzVPiz\%1dB :T1A2c4W^~e B 㑛ŋEsBki8ϊ>Zlhȵ=԰-{\DDDDPU?^=CZ7ib;I ˙5^[V=9~fGseDE=z\|>]:aon~_ORI05(&դ\bj$N8b8::"66VėSVVc4o-MaժUXv-HpssiӦΝ;:m&(-C_cDO2RsAzzj'i~E6oތ>1L8eV„ HII-ahCx """zhΪ7#ArGձ$ML4^NeDw6MLr/cq֐J$ƹ=}j|q^0 6"Z+1m|lYU ի\]]࠘5))I/C49aM?yOH$֭[pBL8N&ij>ۺa#XgO&Zݻ7ٍ!MT퓞>\?:qz0`CAALMMhѢGnWgC5ľZՄ_mޥB[c:{k?6ְwqy9Q|[K˳{gmEH }CFma o b9Ww`I5a!b1bgkʇO45櫟%(>]<}(**R$5ngkk 77vkbbҼ< <cаǸUˆv+//Ǎ62,,^=1]tQXp! 77WƊ+P__WWW̙3ͯ muU_x0ǐOkKg&\ڷ\EMչ$\'f_6>?$J 9d선AܶZ[Ab iufñg q;zʸnLش}3[X,ƥK1bbX˗/%|)Mkjjj痾'Dl'OӔ|'c@MHƠSrWWWDG[َ8lY`8::˗/q)dȑ#:КYe C?~ji-C^vdMKx^+]WJim$55()%'\|qB!_l{4m2,'ZvpVIyW;m:bشv){Ullp/.3Dإ# }o|=U3)p# IndCDxyi~zE_ =P]]We|J---1o޼5s&o7NDBfff+#֯;w*5kDy:u^bX, ((fK<ƠᤛFj~۷oWL=gad IDATDDDhgV َ8lYmݺiiiuׯGNN`pww[Hs[#^/ i1C zADDDDڥv\!bʸOJ6V9bV_. (*"Ԗ# kqB: oBmUlD"EO0@MeHcL Ϧ!8Jk;(̹Iu y! k+X(d#z8w-]묭V/WQ\ԭ1pxtwa&_D/Z*%%Ç\}b1L(\]]̙3C[5{A@@֮];w"'':u¨Q쌴fՈ㑕SNA,pvvѿ^z2lllTj^pee%=K.\#::/m6ܹsx$&~7̝;֭ۑSSScԨQ011'1U߸qٳ'%Kȑ#8{~Xb/^ ^HMMEAAB!ѻwo!| w]ivLWa{/mջ/^u'KXl֭[={bh9mhkK}"fhOc}~i+C` """".~InzN$:C_i\~w@g?XX[3R7}}[gGx+No0P'Pʹz vFx ^ZTW]'GfICصfĽMJNEܬ+eѿU&MX 1pxe&cT=X9أS#aniq=SkW"Os<8cǢgϞpwwW_+3f-r9rDvZZUK۶mCtt4uLJXr%zlb_>O``^PVV_i¹oh| N %%%aҥM}\\\ OOO̜9Siu0`xyy5Xi;w",, ÇR]!+>c8::Ub_j*[vvv2d XRѣGh"۰G~Я_?ԠMW]jvLWa{/nffEA(B"?TA.##?&M={bظq67֖E< F<=DDDD]*řڷzt'lD"ARUCGu¥ -Yq p@?:9 YWpzGrlm G!pCT8G"><c^#z|{BI(/,kb8V طKXO kW_9;A`a*ݺ,m:-?=]## K+NX}}=o)':"݂`-rV|Ϟǹ]?ΤR)Ν#** ]tuNxHٳG_[[sbx'{)^fM8q"~!88@ee%_'N`ǎ())ûҞ*D||w;㰽ߗ\[^C@oYYY_gƍ߿?1yd"##C'Is[ꫣ^/=~ 2xPDDDD]&nnn6LZN^"~v/X\F||Γä}7n/Ξ=9sw8DDDDDDDDe +{;v:t(NǏ̙3Ũbccؽ{7].Eb--abȈ0ODDDDDDDDDDdD'""""""""""2"L&DDDDDDDDDDDF}"""""""""""#>abȈ0ODDDDDDDDDDdD'""""""""""2"L&DDDDDDDDDDDF}"""""""""""#>abȈ0ODDDDDDDDDDdD'""""""""""2"LקܰQIENDB`color-eyre-0.6.2/pictures/full.png000064400000000000000000007711330072674642500152630ustar 00000000000000PNG  IHDR$ $sBIT|dtEXtSoftwaregnome-screenshot> IDATxw|TUw$IHD$A((*"ZV모+")JU)}&d!Hy^s{r{>y#@ @ D@ @ LTm@pIЙ#8H @  !, 7?o>i @ @ p@ @ 6!%*6C @ CKA$MAPv9jtm<9aW%THm@ @GXC&ruF&wwW} \t*&zF^õÒض6S @ YҡwDg0[$\^p8>C)(m;*QIM=_:pjo cj&wVΩ~k3f`ڴi_g}O j&N HK 'ȠA[E0zh2zIJfi}-GtlrJ= 9 |@ ڃXZA.ݙ>&o͙Lqe ۏ:HY_g3e5h@`צqۄnt!AP)γRxFR`$a 7T1bg'ظwX;Z"Ni%BmU Ȋ1*6\D8d'4;"".r:ocPpE<:omIۙMrDB]P23JRuZNVY,Tb!w$J%݂ 50Xz (`љnCVXw%&xs+x//߳$2500` E6UPǏ02*=zj5FVPy5t0;w9o}n$ 2/wDtH7eYwZXZZPD@׺ f@tWVVriJJJ.Ym!ĠaʸtNFN4;6v:dJN[)8jnu{'HoX&wrI6[ojH vrgZn̰0eI{Kng`O4m5;N(;[=_>O]Fu)R~ r8x8*Pr$.4|c1TeXA\-ˬ*- I94"~R丘I .M+JJ:r"y7/5s"¹9!ƷpadѓX֞@ C/_~ݳ}0nFZ#\?qjFͯsn˭Ȳ9sh"|q^mvmv: %KdɒKfk1e\]B!(2%yV YYH:T=Dޡ:3;+#bǻX%>#7fSH!:jaeź~*>@:!l9,7n[[XO(yw֑W5.^Ut`a柹nOxg4l>AFRBEȎpHL Z m<M}Z9*˘v@ FLv;Qxny@c-G&"J n-X^Ane5e6^N  @TrUhkJmؘ(u,߼335{i`X(?ܤ@ $DAd &:% ]jK8c{Vh>Fr}PSVU +)+&wo[3uD%uFRa,Іd>$4zlfJNM#r]B٠z_qMlؕ,>/rrr8q"zٱc-ԩٳg… YhӧOgDDDPZZ7||ٱ-EPޟO߀$10vnmGv2sܝJRW[W2w@]Rz3k#b Aa[9[VĮ{Y;j&mz]Jh1Q][͑u|;ę\y<}#^'xvm$1[C{ ")3zɢ<6na72~XNw#Rzs]hD'R`-,E)I$ ,_vl+Vp -MVrۅIߖ,>oC=t*QIVOSm ƥXw|Zj[cMkCfxNGGys׶6\cg^~ѣGrJ̙㳌R>#$${5kx8p &55j5eeeرŋ| yH@rH0g4NZ'FKNNYS;<#:~dMʼ#8wҚ2-.nZZ5=qBNNJ@ϲfAf ,jb[JvVAD։oC$盄60yN=ym7a#[:z)j={^5p2 &}H6,bpghF}׶⻥NVu}냃ܷ7{| V+5e޷ν{=MkPt^Zr~fҤIl6رc5j>,7oyVe޼yt:Q*2}tBBBxbcs(/t`hAmvz"Sۯ#gq=hxu\5I]RIO&W6ԘwaPaB" &40Q)KXjZ?LA^^ۃz'wR럿~lt9Vm1aѤ'`$BT*yigOqqqDG,̙36w{IUUt ⥗^򏑲 @#\Lg JZz";PjP~\eVrGZ%ښJNţQvtaAK'ޫZ=R&A:r~w=!CRp8c#$$ʦMͶn?xkkkex7ngf:MթI 5 2;XY|:#IY~pH2džvc8+louBstt4999_eG{hU Zi:{(YkTMPjFRIJ a !5ۖf @E{3?Y槟~h4b0lRfĈXItܖ߃`լY={`4qtM<۷sdBjTVba W#%ITTUEJ2jFP䴐@J6=U RZEFCA04S:.%:F I*_cj/a)꫼ν֖_[lu1~PUXX3<âE cҤI;Mj̚5<JKKyꪫtߟիWѫKwrٿѝxvcXlVf- ]yW9?C8}9BYcudf zvnWlYIB^OBD<3?gWp0.dwovW?tT(e$⧕VK$4*5nfuWUk9QDk<#*s9KgϞHDII .W\\Dzh4N2:8[ %^M`fBx,&(:gAx3NkKӡs%WY-EzTfV0olצXxv]0efo)Rq%U{֋M `ӦM;#F4J%C`ڵh5˗/gٲݛT }6.Q5&`GM5k+ PBlgROO%%w:Ȋ@Jpthrm.#(Rӡ#O(Յ)%ZO ^#I76Q 6Lprgz9$[jeYyw[>^~)1dR#5ouY@44>2YOXkk1UTppfvٸ/Ml#u.͋caJ$aqdOcS \2D{ρu/hDžίvpRSJ_|Ef# 4gvJF?@|||l<yuYt?J ٲzjpU6L,HMbl(~5Fku+ ]= @Snx)C:_vW弆U|Su.'7,bkw}Zp(Z c%{>meJ| !j5'LAjt=%h?X9ZBBY^ 5x e;(;Reio)tC_ 0V)`PBPLFfzZ焣j./ѵ!Xȹ- FCEu΀o߾a6駟|jLe> @bb_-I8eRARAJ]P29Oll9VSmvRR(= 2AWV`h ݻqfRjN#?n=opkm!9A;t2m̙3g|n///k8ù,X?N3О bRGstq8݃dagwokFҨUzuNd]*n!XI"2S2wvþSٟwvO=]< 8oNW~s{G'^Ϥh>+(H@ydM~V+W_}˗c/NA/OSXfaq&L>\qN4jQ\q)nmH'䮻b& |QnQq-#,>or㲾3Dn4oNMM AAA 0-[x >M6y7Att4SL!338>|z..PF`PJ̫0Aڄ RʿWp1s,qZ1!I9Cܞ4C nKP1|Ap nCF?}l #"Ր&NT#• +M`re ݂c,k:5UT"dM9'2-j7*)57ІvBImF/GQ:}naublMiLKί=v/./_yIePێ -/~';]M<Ź_-/od |9qi c'iw=-9V:ڳBVQXQ~ùc䯽Ie{/7Xԛ3vH/Qi=| +ڭNS8|9&} d2yy1FSO=N㧟~bܹf„ ~"jN"52)6ȯ$,817oxO3l"r#pmk;rDAM-gJF!IbHx8Ŵ'd亰 +ut\E-Ih~&!  z2CCy*.eEaIJA9TJNgP)[^ KEaHw8MX|\*jHPhl0WW7)#;_<^DasuC_޻ϽتnDԛQ(胂wzb4rj ђk~RIPPOPw[RеT][ۍ IDAT߼:̮$t,;]N}1[09|Qa`ĆE=1Aݮ[]l.1G/eg`wC퓹mJ^왁J[]{ymߨ`ҥ,]4xz͌3믛Fl 6hxHShteNr+<  ]hc6\98QZh{\7@!*رJBCC߿?۶mqFv٧Oñl̚5,saaa~i $aqh$iZ-04d@.)UԛS>uN(.{D&KX-Il0, !16K@6UT:6  xϻR>/Hp;l3FLp1rY.[ FqFTRJN6ͳ< LUOxxG都0wd;,0,b_~^[س;j}ѱDsŤ$5b5Pk80**۹sMl:GO^;[K}m 3E%RIϞ=^ŚRHRIޒP鰴21yUU2P58L=5La50 C ʺgiΙ'$FbΪjAs>+KYJQv6[2꺶z[%I݃_ 5@ &o6n$k_ۏ 59Xl7y7_:SE%d8SeA!N,E"R1#)xp+#xZ=Lk>&Z , {/:C$?Js$ɓ_^!rlAYhǒ.c;im/8Y$)IZY b[kNj!=̦3L]B/6{B ^GU>lsCGuth_56"qK$@ 5*.(敵vZ&NСCYf FF`y'NnƯBC4 G7* 2xe_EJbp0],Km+VZ Z1Q { h664*u #;H0YYm>N5t".lowu NQ%fdFRGTʭ&˶zN [j]Wm_۫0;<#&LfFGEiwVulx@ ~4y(M#p_߾шU#.+;[O?Ù1c~!f}Qϴ˖-k!"8InE;Ț~t'=t܃'0?؂FapEQXVNQ^S$I&0͡3g;[^axMݔ}Pcv ˋxwՇҴxR}O7$! ڒ2ÃټW= SWx3 4_쮪?ΰ>RM3liv@ &’,|LxOe4$Vf' #2|ĉ;}"d~\۳!Vj.߾6~٦ j|Cr9ܰ~]Oo%ZV^M~?~<ӦMcԩf u`Μ97fk0vMS/۽32ɨˉuY=wK^Cz?Ey|{};q}϶l:߼gxBZOA It^HR6>, qqY߾}y׼>Þ$Idgg @MM 3xo#8{GŠWS^WΪm ^_;\.֭[ɓIMu'f>_\[~{l=QFQ]]M`` *-[PPPIv^$旗Fq{*$BEO p.!8xjVx|fʖ^,NGL"d5Xl7'4\i?@ X|[F>>4nMsu 5ekq|I2#J\]CMs55fuXM&]?ΉG{[Lrf LLj !\.j+0Wpz>oͥl:mᲴ`۶mL0 t:ܹEyb\F;]N^\:_5nYĄFp:8Y|ol57+,}'IIFTbb Ba[/+d\Z|h/nW^kKl5gߵC$%.`\.'U*;(.gzILLL!!!zh$rUWLdd$j|v?Np,nfC(Up zF5܋dYlFX,sPbV[T\ 'j*6}wJ{^a],Uqqv2E&kOj%fvZ&O @UU;vhl[}r-j9u~-K,͗v;D?šQ*\ZAZ-CUtBnd~ːee&bwތw.#oK}HBvR%Yqy},s6sDZ,X[78 idVVefFFQ*q2N;kM>śp>A4WT_:EDٳ״0N T.D$>4۳~`F ehZg:0vp_0J,X{®1XKpҝ\^vO%C(bKꩶAI@6LlTVSpHi)I". !S%)0|PcDNBv-@ _"BX MCPD$y[VUqp+ ,Ñ2,3IRHȲNmut|+jJ&yL7Tqn'FRJܜ>q8Zܿ**S/@ ~a2$8&΍h;w1@ xw k*sLU“'v'|=T͙JkeY3}b,yKf]GN'5&.UʖjY&x" xCq\xE@ K!WMHt8(;S;wwe,z%uڶ-\ \Zz+Z$@ ’@ @ M(.\D @ @ h@ @ mBK@ @ 6!%@ @ A’@ @ M:@$IbҤI?Ν;hظq#O?t>k}ʕ̙3 _>!@pѡRvvZ >ٳ^ܹso~É'qs=`X7n>B1c3f iiiRYYIQQ;v`8pYs;kqJ5k4t:|w|8f_h4r7p8.~FF'NDDD`X(**b˖-XBƌSO=1M2 ̝;TYnv[1wy' m^b >ȑ#/Xguu5'N`r뭷rs,))uvvYOHH 22'~9@ e@JJ )))L0 6n^Ϝ9sׯH"##ٳ'ӦMcҤITUUMT* #33Lƍc=Fmmp`0ׯ۶m;osSNEhj9sft⋤R\\C=İaZx-KG˥o/,|A>M7tю}B ʣ­ DBR>[{ ),,D$"""bƌ30m4?L~l,ZիWS\\F!==/?UV5筷"!!/~~_;maܹ|j"##k;իwy'׿|[/,_)S}^宻o`͚5|'8qZMFF]w:ujj={RQQ?LQQQ3!!ޞRy'r5~WQI @ 4 NWqDYCIB<xQ{q:"KN:żyh47 FʳfKnn. ,d2yl&u 6z6\.O8NΜ9ûKRR999 6̧L\\gΜ/`ʔ) <7xg;IIIq|^V+۷og^Ns(Jf͚EVVFG}ӧO϶^/_\.%|je|I@ / p_|^1?TlݻrIMMmw}H,|w͖GMPsWζm8y$ő3'ɓQTTVV'??vI?СCX,<=z.ZrtT\lfϞMNNN&=7ywq .dֻxbz-~ IKKcʔ)ӇHdYԩSlܸe˖Q]])8p &55j5eeeرŋsԩfz:t(-kaʔ)$''#2gϞ?gŊcT*SNeرPUU?>իcɒ%Maĉddd)//gǎ,Zv֞_[-Zӧ3|p"""(--o>8o+D~_Idd$Vcǎ_f/ì,^z%N'wiӘ1c}TVVm̙Cvv6/Ç_~={Oн{wxWرcؗ_~Li&fΜI>}P*;vO>uuh? ƤIHKK`0P]]MII Zcǎyo}=K՟@ \| K?:7K?!qR?`hۦ(J-~h4+ڛ###h^2d'k۶m7!CP ZmknOo߾6.ttT\lN8AHHCѣJL~Ɏ0Ù>}:wu5L(JIOOK.>xƍٳ[4(1cӦMږ_^T*0`3 L< ݾ̤Io6fر5g}͛7ZOKίhZ͛GJJ NRIll,ӧO'$$^{/tcǎGEr?kkk o߾ۗ2g}۶m,Y[nz3gb7|IKKcȲ̜9s<~RDTٳ)++#99Ibb"f[n[oE@@FFC^ի~gG1sLDN*OH~zz:AAAK^Ǵמ˕ҟ@ :fwy[No`"WOay8RzɌҥ QQQma1s=WԗnFCtt4'N$++ ŋ7)Fnp:[neܸq < znFN'_.\z~i)UvGz<ۣOxgɄ >}:+V>p8uM7u`լY={xrswpM7Oo>JK'8s z, 9 ॗ^bո\. O?ؘQFyD b6G!++'|ӧζk/&LɃ>ȰaØ8q" .o]*?ŋ)//G2|pxZ9ߦ2sL|MxꩧPT,Y[zמرc<Ä{NmmgVөS'z0n8N:ٳ9vz[oӧuVayIHH`ԩ̟?O>s/&''&ǵ˕ҟ@ : ;HM`I)3yu*'nLXX=z/S_~e-((`ժU33p@{v޽{Ba.z!z!m.ݻwxb6nl {ڶm,ӭ[7¨𔏏,=۶\ZSN$޼yO.-^:_z%K0o<ϲNkqk׮em뗂Nַl2Ν???y5/_βe˚W^^믿N޽IMMeȐ!,_XtiӧO{b*3_V\)qFϟИuBq ygXhaaaL4wyY;JKhZf͚KKKyꪫtߟիWKߏB`VoJc=ƭ՟v|rıcݤ\ׯpP\\́bq#77N:ѹs&’b֬YI̿/0`r _܏?/5={D$JJJ|(..mr@ e&vz֣b=E1?gҥ $&&b] IDATXx;K.tͯ~+׿l2|Mƌs^BAdd$>7#TOUUGEPUq֋JC_~mz~t,p8F8\8oX,>|plnzo^z,>ѕ+W=q.#m^l4hyl+-9?k׮&^FǏ"Bjj*8N')>>h}'O'$cĈL<s=$ w]7{šo>a"mo^J, ΙԜ/kJO@ y=vm9M߁~q>6[OSpti&^z&`y1b wѳgOzɘ1cxꩧ|_j^yϗ@RIDDÇ緿-=!!!|&wn(ږ-[HKKc^35=y^{5FE^xǹ/ s륣e<oiܸqmjC<ݻwíHfʔ)dffG@@@osٹs]vk^OMM EEEymONN,:tg'-9?p<} ]As\ ͖)Mqq׾e˖qWz]7W/7~YV79^8#Gxڋjr~yؿ?VٱcGi߯+?@ t<-AJF5JͿ_;"T*)))w} 2Bٻﰨa`dA{*hB4H5dh􍻖"lv)5Xؒ`M^5 :Rsqf)<wn9ss=w,Q+ k $&&L&~׏N:ѲeK ƒ%K9%jܺuד̈́ :t([n0FDDZ̙3&9r!CТE  `?%$$qF=JBBUVeԨQ|Gvml-//:o,3}MEDD0{ltܺuK.IpZS! ?/// =|vFVWWW<<<dQ[Y{`ϝ1?pK,aN6O6Lvܹ]Bӧٸq}8RTUK,mkl/vaYYYp!Ǐ'$$Djȑ#ОgoRSAW\2s&[]:呛Knn.Of,[^z>}HQcz.\9sh4t֍ݻtm6T*yٶmxIJ~ ?Aj8y1}|2+W7W^a=m)/Pzb ___JM>,l 9x ׿HKK3Yg„ ѣe&†YqsL奜ٳR|8{ĠP(j׮mǒ3uAlٶ8LINN&&&&MJ@@m۶m۶,^d:iOAA^EjX'?]78B,y_~%SLaذal۶Mz6'_ ˍERRݺu//277ܽ{s6 d$jJj@~:<ۛƍx)֭˻oQe */OKf͚5%}dPГϖaaaˌ3LKqdec k [.eגaTㄕr6nܸb00=ԩѣ?~f͚˨Qt6fzuF~r}=6n(2kРM4a}m~)A*t@zhվ_pbM]y&*KˍExxxX0taHo~Wd2tt6hzMLLς `_K/dS0QK St:ToZyyZidhl^& w;[=<u5orƍ;-ԕ+WRR6lhq߆) (g卡lVTڵkۼB 66Bƍyr ueft6lqy ̴:\ig .0eZ- uJ{_J#?AA( lXHA:-kSiZiHS߾}QT@~-[m'h޼9`RִoO)@[j?DZ HMfʫX4=%Q9s ~-=z(4ߝZyy ;weJ4I&foݣkժeӱ >Օ7|z{HC+Nqij52.]}ޡC1޽ŋ{IR}vA(gͅ t#F(pT͖=:up>srrr5k޽{rYXHHƉN:(XUz庠l2Lߍ'[F~ PvذԡgxIoYsGjۆ9ѣGT*1L;d뇯/ԬY)Sshnϟŋ޽;իWGPR !66Vk֭%zr  wwwVJݙ6m_:v]v7oʚ5kFӧӰaCJ%3eE }~wKd&K4rSG F2HƏoC:uн{"Rw;[dgg_ЫW/&NH``y`` _?iɓ'ӓw}W T*۷/cƌ)RU^^ o#=EFF2b4mڴiå^̜9___h̙3:@ Xd23MHR) BeYP͊DwzsܩJ$Xff&= $&&ҥKiذ!M6eر;d;^ϲe8~q+Ð1YX,ٻwo3qYۑAll,999T\YVPX#GеkWZjŲeˤ_~%J~Ѯ];ڵkgi-a̟?~mϟ_dyٽ{wKHH7o.𸯽WBrr2-[d 0@>zhZ ǥKؾ};:ubĉ;V"`le*Uİa޽;ݻwGV#˥QZ,]zӮ];իWӬY3ÉCV/GEPjݮ]hڴ)ݻwgС <,FaΜ96ϊl(gÇ;w.'Nuִnݚl4I/:c~~~L<+Vp9}Y^xPNʤIR vAtt4K.EV!5WX֖zžtЫÇHM|~/%  ]_k\qN +?WQ%&&jwia„ ̛7'NVjܹsݻw;b ܹs!C#GsFí[ػw/ӦMcV&VÇIIIaҥkRC/CׂXׯoX׳h"ƌ۹q ++Hxs%] ._̘1cHII!..NaU[ [);v`ٳWRڵklݺ7|U{#KI  eJ*f hD^@~qxD& [f UVeҤI:t#E`"""XdS X0'AAecJm{4z?hA|5jԠjժh4 3EAg0tzG?2Y JqƱsNNe2z"!!;vHڬYzkך՝w1{D֭e'N$))bٿ5e P=s=w$0ȻH&,˅nsxKV\ g\Ò <+Ν;ǤIJ;OȥKl~P>W^h[IOlQC쫯bb9qb9Ɠ3GeԨQbŊb+/iiiڵN:ѣG6nX,yᥗ^bƌ?^hZ0`111ۤ ։%;x e[nER,۳giΜ9DEE1o<ڴiCӦM~:'==)SШQ#n޼… 9vCZƌ-\l-Q'N$:: ]og)zҶ#GiӦ￳ave-+SN={HHH`ܹ'|[O{҆ L޷oӦM3[$9R/yxxвeK^|EׯO`` nnnܹscǎnݺo֬Ynݚ/_~}RNz=ׯ_c֭6~p6Noǎ駟慱^z={ҠAT*<=z;wju[^ORRK.ְT Ν;F#Gpj֬ILLSJxAnX*i^>z/ nҲͪQ /=e=͎N> /aQcPy?~Sl- +CFsaUL$q x+BnM_ɠ-oZr{O*Rɼy  ''///zMhhhA7;uĤI1xzzJoZlɜ9s/?3۷UVZwӦM!''ػ'R'|BݺujrT°a?6;={!dee@Nh׮8pjԨŋPjBAhh(,[JZ&_&CBBpss?0{KiSPUV% Hy2zhr9rڵkϝ;wSZ5j0c O^^C{!5j&3bk#gP(bIƂOQTj !$$z;\]];w.͛7 77JE>}hذղ`{=q%|||!RGꗒHԭ[7ƗLz=ժUZjtܙ"5>C, k׮RÒ#ڠQFT*4 gΜ)49kZ222P(+p'OdhLV,J?UV9~85k֔קx3ʋ ByL7,)]cG<9~q qqʒ@.w!/O\ZIj/LjTᏋܹM!Z͊TU>EMVC.w)0}_knҨ({w2T 9)SfXNk|޽{hӦ SLڬY3&O 7|úu{.J6m;бcGN>-9x jJEdd$~ /ez,=HKKcԨQ={ƍK/+ªUsqCavUVzjR 'N$22S2l07;w˗'55^u İa8tв{nkȲeˊ5ewKa֤2aXl~~~dffҫW/4 T^P^KӼ?8p !!!jM>\QYQ:pUqE:t(Ce$''pǐ!Ch޼9yk.t:Zbڴi&Ξd˖-~\2ׯ`hR4 vԩSR/ ???^}UzԩSIII)`Ϟ=lذ?"##F$s?8Z_.^XhCAPP !!ד@@@RcNA X>>>ԪUXg5jH_zJEZ8s :NZ^zuq0;gvIII|7gsVyA(\ _(wF&OswK?ٶ]X!swc?9z'g$/;ןdYSG,pnnrFmˏ|f}iBM}.2kV]Vl?/}bmQ pxkkďmב:X*JzO!{nt::!.c7g3 IDATƌŅUVgI5999رCf2h iF#B24 n(zWRdƌ={t\.Yf&޽)fʍ7>}:CRIOt̘1Cjg}ѣGd߿NكF֭[ǁPdggsQj֬YnҸqcF ~ȍ7L>\;r%]O̘1/c8x`U]ml߾V^g߾}$$$r~ym޼Yf/ {.x"JVZH6mDll,Ǐ'==WqFʋ#5f Ҹqcd2ofժUR#[HLLdŊݻܻw@]4)Wݻxxxl2-Z$5HT:UXQjT!CH/"P^= K%ꥻ9p~?wϼ}=r qkU@5on^{ևy{.9&iWw;7Nggh5:Z?$"';L-{qV#qasy0Kl=5iOOOz=۶m3~@3?f_>ZuYܷMjjLZn- 0ח,:qW\1YV߁|1~@L:Oʒɼ bmhٲe=ˬƽϿ;73f@.n:X$k{4 sI1C:"""[^7|vl'iWP^/s{sX_|a3C{ˋ3Gf,JPfCoa{^sh?š$?www\9qlǾ:r4KFA=Сot:9s&rsFyA(p%&?M͸:ΕR/Lf՘:gNq[\fQ CFe=0(͐ps|g&Q.go8tUڵ7J<0ÇܼySo`x={bp- ?pÇy&CڴiMxEi [:uH;wv3<8=… xzzRre:kj=77WZf gdpiy-G6k$4䙇 //7kJ0ֻP]]]^CClիDz1n4p3fK=a/g/eA@@}%""URB?^ {g0 'oR裏ؼy3ǎ+=S+VyVߓeҥK8pMj*uC,5<_tO>k׮1n8ԩCVسg3ˋ ByL7,ΊOJ.q `3I,}{_|#w7Pfv[lZ}7ǏۚN/*o%Aͣ!M"4~+!/f_ o/8o4 {[niFjXrqqf2m;- o]\7DNxxxx=X{ mۻT7|( 2 Xrm}du֙SƏMO}Ҩ' G 鳗aGA=9yRO.""ٳgN֭[\tIσ/n~zDz8~p!֤pBƏ/ˇ:r9|pkxaq%RZfԩ&q4dqo 2ZliҰ"P= Kѝ[j>ѤEuoJUğ<~cT47E~ Daxul2CuҥK@~l oooD 3zUTIb V+uŅ^z xz,dNcaÆ1,K&88 iaHq A+M...L6J*qq-\{UOR'u^^׮]sʕ+[l,PTTR?%QKw5Jrƍ;-]g`}}ew]p)SjQ(ԭ[]]]45RMZ\ǰԩSOrT>95AJ4,3Ӵe \L/tFH~ÍDX?PEa'RnnrzmBݕ>57KN:ZF&YѥK1.\ =l1éTjob֤I󋊊iǺ{Gf{xxо}{兄X|XԩVL>z4x׉ݻ[drm}TVf=ѰaC#t:tsߞ>}Z:.]}ޡC2}QKYR!cS{,[^q?+t݂d2t~.WnnnhZRRRlHmbx֡CT*gԬ3))>7ocĉN?G\߾}*/ UYjի[1Q?֢g}ԎWz¨1 ђo=Ϥ:KC.+8JQ~6nʌّ|ғvdث1*@LvM_I^!?= oYƹS^I]׿-} xy7nh"t:Zb̙&޴k׎?I&Yɓܹs+2f eFt#G/G LFdd$Ǐ;7|ό7|pi `deei&ۻ'=3j(7o^gVm[nOW_E2sLiJa)׎GeAi28Rd<]d}{ۼ<x7###1bSS/4^:y$yyyxzzJCJ%}e̘1N)/`}} Ta=(Ü9s1:Dll,2{YԠQF:fYn:X"qqq"gʔ)@1\#K*T@-hѢE9^ӦMYr%:PR%BCC8q"GgN|s2qDZnM֭Fј!;~t:vM>}Ƨe@JJ ɴlْ0`ijYa׮]4mڔݻ3tPLVV9sXζcYt)j!_}Uo7mDΝY&k׮%--MRh"/TTI0"<}=;sD\\#F ::ooon޼?7|Ì3~sazAÆ qww'==Ǐ_Jy˗3f ÇI&qY֯__`z/!CиqcW.u]2kƍ 4ۇ[Tg rx x&S!>>bi׮]c̘11Mh8<~-?mo8qeeeHBB .̧./zi͚5ѿׯRرDƎԴ[^˓lB&Mh߾} K;v 33-ZPNqssڵk;vkךLJ4 ۷o/p]{o޽=W_}&MRy&gŊNjmRRRXx1-Z ((ooo<<qC9sb,_ O=???6l`|̙3R$$AA~a^KW-բ~Í?38}~V+ EԩSYx1GӜ;wJERRG%qf{tܙ]v1k,$&8qq̠ K1EvAAxpSTFUf$ދAV p}{=1c*ߟaÆQVbLa|}|7H3Mm>|ȸq㤟{v"  , KNTzv2bmf_r_ؕ+W6mL4#O߾}quu\xS|6AAvb(NFƽLT^F}`4Zxl][bʣǏKoI=D~>uwAA6a<-<fo7 QxU+zFvV^>L[]nʣyp"*_~Pl^('s ]7VJ Գ ?2I5{&Fx gUtJF]]{ؘB՚z:S~;vf˦Mƾ}=<_n/6̑䧭ɼyj5boC2|p޽˛oCyѦM6mי?>L2FqM.\ȱcǤm,X@DDK,a90r9_ݻwKٓ Rxoѣܹ"H'ԃ%U   KNpoC%gqg{1xTxqjTÂ;:uHg FѺuVfĤhR^wjum`!!!awͤ%33^OjըV;w&>>HÇgС&˂ڵ԰ܹsi}аaCdN:1i$\]]zzzNxx8-[dΜ9Ø#b+P*̛70rrrwބhv~ƂOQTj !$$zz~ElϗÇHy9r$yyy4ha̙3GjTѣG#ˑԮ]xܹC:ujԨQ3fп@~ŋPjBAhh(,[Z{ȑ#_V%##BApp0xyy1o޼B_n/{iu/LAAphXrJ^Yyde>_܅<-nnri'^IKoa-]?..x2 ¤QIӣ鑻֢M-.w6yYv-,[!Fî]9uju~㣟*{fԩnu?DDDg6lC!Ch޼9yk.t:Zbڴi(Jo֬'OF׭[ݻwQ*iӆwy;ri;ŒvQrenݺ?lq^{0rrrmڴaʔ)( :pUqE:t(Ce$''ϒ䧽_ЬY3ׯȑ#Yh WWW9tRSS0a~~~,[ ???233իWNhhٵܹ3/_&>>T<<wmǫ\A5+J_̿maۛ8c6yff͚/"=Lܽ{\xRIV Odd$6m"66ǏիWٸq#qqqiO˗}vZ-z}` 1cpqqaժU|gܽ{ci8̠Aj{)Jz_~ݻtt:~9z~zd IDAT3fHþIHHng G%'؟/yyy̚5'5n[Ԯ]TكF֭[9sVѣԬYl[Nnj3!ZYYY|g=zLF ɢ7?7nL&۬ZJjuXHi(u纗LAY$Suۀ0insot]^MCL}=]qӸ!cOe>EձuIr( f9?NVVVԫWȏ}dnCn޼IժUM:fϞmuZ\N@@n*0-2ؼy3ש]63fY… @~ի[l(*{%EOg˦Mx牊z}惽qﹹ~wssI'4|^oFNN*>͛7s1SGiu/  ³J4,9BJ!>r<Ab6iFok xnv*ZF&ѥK;t耋~fĈի[bM׮]XfM:uJ:Ν;}ޥKb; Z|7СC&Sze4ib~GEEY#{h=:up>srrr5k޽{e~IBBB,62t dê Nj*gA2Lfڳ}t{K>AAl'}Wɸג^?ߓt'~Q/P4u)UoGA"E ^C;wo<Ҵ?Ыxz.8ùs׹[n|8?<#GG LFdd$Ǐx~`{~:/QQQVٳ`ϟgL<٤`Ņ8qݝQFѼysz=ׯ!u:u޽{{g>}3g111&ȂE&q=s)^  `; N&_ciHWt) ?, )7A`ОVAnCq)+]񰽇̇5Bձ6o7w7=ܩ4 {<$ΘNi&:wL͚5Yv-iiiEq ưK[oѾ}{ڵkǃՕdٳҶzj5kFxx8qqqjѣ( BCCͶ;|0seĉnݚ֭[FAzOOO ?4kH[>I#׽43AAvǒtz{-]:W9+jt<|ͯ?ΪſVr ޝ7UgotIPJ[ U(,_dUAmсyAEdGKoiG5i.I4y=SnMNι=sT_W !mC.W"A?[S77ѕ߿ ٳJ@xx8 n߾+W͛7 @?ŋK\lڴ P(عs',Y0СCx{nb"//Oƺu|rرc憂477waF]]~';zѬ 0| n|7fʕؽ{7*** QTT:4̭ώ ’%K۷oo5x?R>R >}:ZWZ999?>Ξ= @S7oʕ+VYz5lق"x.b'XHYi=Z B # 5558taoLqor>#B!K&7MRZL%s2mTB"`ڵkа@fGjj*3S-llٲL$aNQ}>v!Bq8lW mP"f1~x? ppp`Ć lZcǎ3sڏ8=!B8"h A?& XXl\TJ5jkS.PhnnR@ ;\.k.|hllu1 ~5fʕ+~C:B!Bɻ !B!BY(y7!B!B1 !B!BY(D!B!BBB!v,44l9Quu5m\" !]PnB!Ď8p"sN_%"]ڝB!X"b3oMŤIl\"ۉij>>} \'q[3}߾}pqq1QVVfnj30x`@(m0СCbƍ.NX,L<&L@PP|>ԩSXtɓQSSc{vse޼y={6N8˗]G"`׮]>UVY Xw}( "33{ũSl]GcΝ&k~f{}]p8#Gp {9n߾{vA1O>$ZܿOFSSl6 OOO|ף7nݻwR>???~~~̓͛&HHH@DD$ {p9d2ђrZH^^^pttRDEEݻ˗/`Çc'pלӜvv0Թ0$|qӋkOjx/P*UzƼwY<ծm\{JƠ^ ACmM2n]K/?\T .m]VM6 "ǎCvvcTjj*x<0aRRR}9k,kz&XYY٩:^r9әms. DDD,Z.\2%))h@Ÿr vڅBQ=W&{, $lsvxGRATIII7|Zr1|x<ELL {TWWwIZcinwe;ؒ}b}qrAV>}1`hbĦu r}F .磤DlllUH'vOOO#gGp\5FF݋nu7}tx{{6d)mϻزe jʄ_/k_]],X2ee$֭P(D`` {9!M`GGG"44'Nć~'OںXVў̞h1XF@@D" lDDX, $0ap8dgg_~Amm-0i$`ҤIضmv, ӦMqYddd@*B$~~~V-B@QQQTTgymƎ d28pPTO? Xɓ'oi9-ٮl6x<*++q5䠮BHJJN͛7CRqA/˭VVsOKڽOǡיl$$N8< w`7=qdfZ{Eכ *]CꞛlD@S_L3O'=Yb+**/BTk &tVH'v_lرc׿ㅴC?]Z8;;fD4,;w:\tfc޼y=zتHzQ\\ www$$$`޼yXlfϞR[b~G۷޽{hLl ,%&&磱wf5k\f>} ۷oGQQZCCJJJY֭c.09Z^zN< |߿/<Ӓ̡T*w^ܹsG拉rԄdxzz"88YYYFC*vZ?-ilKȚȧViQެDCF]*R񆇷%[(o3FL(̭_]a93*xpr`P?dލѠkbvϷQIo+eՋq lXӔJ%s,))׃cرغuKIZCߣ]dNNbccK"q ^|>!!!ի z… fшCNNonڼN/_Fjj%7oFEEѻwoR/_ *uZ LX, ^/,,Dqq1|||n9d;s(Jܾ}7n@rr2Mn#cbiIwe;0fJ_<1,w\xXTҪ(ǽ%㋨x^}U 6XLa1bgggTUUϟǾ}PWW^ƍp8::رc^VСCpppl۶ xѷo_X,\z6l00X9,, ǎc2Qwn+!?^}UŁΝ;شizeZwi4dv79fڵk Oƫhp8dff  0`|I<z*v؁mMz,[tƎ;w. wwwСCol۪M2Rd-SmaXd QZZ  ̙3믿ZĨI^tmy wg7n@ee%$ Œxx5kF ɓm&7g?ӝT`۶m:/q\<3f QSS'N`ƍXzu6%J{!::ΨC޽bpcs@sRRpss뇽{ JOOG\\b435nzA#]pwwG@@3qgggL&3 >>>5>xh}/X2 * l6 d@/>%&sOkHqh (9ztϡQ>1a$)SM0_~rJnnnHLLDbb"ƌe˖%3gf̘a"ĸqo+KNN7& cƌADDDSE">C-􄧧'>yc(DEEaO?$jllZ0vXzA2^摑x6 _P*p8ܹs?a722neN)s5l6_[ *3.kNNNALL  UVY&z4ﴽ|}}eqyZӕb >XX@̜4xXf hѝ1eDEEdd?ybՈDxg8Dߣ丗;w &&{ŋѧO455!;;h`IR֭[u H$cĉ(,,d^^^۷/Ξ=kQQQ`X(--eZK;SGyjY.HbV \r pwwRDII 6 : IDATp-g)I@e ^^^dX`B!MΝ;8.?VWӄiEG33weߴ3±,{9zp8x\/%%Ef%%%fzR$&&b… (..Fyy9 K/> fomt 1c-, +W4*rT*u2͟?_/Rbl6?9\.2LF0ˮ_μwpp0sԤe*⨨(&kudRJSOoDKѕn K0رc x1k,̝;/^ԻR(8z(~W\~7D9s`ʔ)Xd n޼rMz7?yvL&N"s<<<` 2&M·~o-r }u|&cEEnܸaG[͸dN}f{a&J{cTVVB `ذaaѸq絇/fNwY,/X;ЙzOOOhͭOs^xѐd裏dÆ ŋ[ Ԓ#%@*.. k֬ѣGR0h ,]T:qe2Tܹs~~~~ɞW^5E\=zBXX^ʼ~5$''#::z߾DƆtXS_~θy&r!ɘ z :III4Q]> Ç-.';>Pht6x '4Sҗ2OX,FRR"##?XeZLsOj9w, QH޳C?/ia;9k~|eM ϓu(89 +l6~޽ppp@\\,""BwΝ; *fΜ @cO^v W\իW nzfΜ7x0|p=99Y/Gɓ'駟bwŠAZfJ℄OJ___aO>vzxVrJHEEEظqލ^rrޓO?ywu|Ek`` zm4w۷4ܿ ZL}3|Æ >|xz46440f̙O`I;>^7o4: ÈcIm]޻waaaLZkIOO7Q__,DFFZ}bdXHIIqPVV ]k!,, J;v0^ǏǢE//Gbغ^tU8\x,}&ZJo>9'''j:t`_~zy)** PFg>|0|Mʳe >YWKwAll,fI#$$]([vJ@DDNڜ YYYLO K,Kyy9߿ 9s`C***~浦&=z^^^ BBBKuuu{.zC*ݻPTѣ IԺ#KМ VJKK3XVVV_5j<==ѫW/ZS5IBwa(ʭ6ZsO:kHcBLӧfcŊ_hh(wBBRRRf9\]]Q^^wEZZ^"kׯ_7p0޽{3zøL߿ &Z N>ݮKKK jvvHJJ+Tk>[%qOOO y///L:e^hn/cZ;鉷{nA%L~J&O+qu 33={X{gROƚ5krgGmʘRPRR)yO;r^ҶoYYݙ?{j`)77pttݻw[SAVeeeŢX,|鈈@>}$R^X[K6F F]Au^zh M{9r ;v ƍBx,{haƌzA/r gggXX2wҩl}& qI= mje\';i׷&ZlFb9tiڄ?nw Cݡ:~x;XM{7ؓr A[̵+i뼸@0`ѢEzSQQvat81e.wqqa&>>?JRY* ǎO. &!++ G1رǎXI^O"#|׈Ĝ9seݮ8[׋-[._6p[jhh_ŋcܹ8tgn}{4QYЧX "]݌;J7Q~fCӥk@wr=z09F&ts*&Ni+-sUo-TgcigmnP8nlldhF8N>W{-8&jeް/%]jwwwsH{V/ [KXX^?dffv۠ѣGQRRHӧ3ͭOs0-ZdeePD"Qr {9UK 8?ʱӵTUU|p8L4 <%%%VaX۷\h^Tj&!|D6Ù!Vb̙9s&ƍׅ%옎aFAA~6 %ו܄Lkn9?v?bXhk_]mr35H<qx"Ӯ@W$>0  /۷3SYb<<<?$$O=ϻz*@ o B/锄֩, 8üyv?z^xׯy|;tgX?>s3gN/rfY)))V/J˩'Md2В HԮCF/njpsj{$xyymI&{Cfn;v,X>uٳ/_aiedd07᯼J\Ǵhg53ݹ:-J7uT{[ׯ_G}}=X,ƍ9nܸɨQE9^?{fG3yyyP*7nRSS$zꩧ$~IOOG@@%툋/pttĔ)S/x駙rsΡ_~  ̄B b.t/-%Z7gP4O<<|^Z,[ ΝC^^34'Į]ԡiGGG$&&@80uegg = 8-Z2vhSbXr%}deesE\\j5~Gfk׮A. -:L0oFfE{.zꅧ~yY>uj|'شi0|]y}Æ Xz5 >7ndzX 119/> G{L0?ɇѶ㴵:=8PSSc+֝;w0j(|T*ܺuS__`o7O]]g]UU>cǢo߾۷ŋMNi3g2A6]cƌag}Cl6"##uj;wW\Z-%uD"aDlnkX!C\3ݴ%U` b0`H':iNo;9lSi򌾧%,oc>}e |ﳐ5J}VX0˜,h(ÙA3f`;wh}MM ,^Y `#--]wZʕ+G1a.-Cׯ;s3pJj6lٳgZގpqqiux^H JT⣏>?OD"sHJJbeG}4KRaӦMxwezy$tNp :6mbin޼ɬ[]]M6^Crr2FZ899… (**ɓ[={`ر ?"&(a[ug֪ϖJKK /ĉq;wDccYi7 &&x@ `Z Xg?GLL V\zrb\r|>_:VV A;wHLL\.***pM\xm\.Gvv6ÑeZݻ['D`` ӧȎR 0 J(..իWT2WMM N<={B,C yyy|2 l7_Ehh(b1B!x<d2JJJp-ܼyӢ̞=zL&[o5bHNNƨQHjŋؽ{6Xt)Fq!<<BUUUHOO?N)oW}6^{5߿?x<.\}E@@dk-ԣiÇ1d <-Ÿ'&CpuL6 ezh_p5fOWWWokÇV^"3^^^@c:lU/al=!9v܉SSLarSxwbFMM 8W6HII+T*Ν;qF|gl{M<^ǟ=ct3[oPݻww( !B̩̓t ͛ϝ;W/k">>_}^oBHz+ i3gKDleŻヒ/ں8V&###^@TBn@())aD2D/hg C'B(Jf(ے%Ko>աՉ/!]gprrf͚,U$b{BЛmSM`Æ άF!#kxנP(PUU.Q ɣF&1b <<-jΝX~-Gyh7X~!t@  55׮]c*3g IDATb43jg#56,M>pttsyB <جӸ\^f{ɓ6(c֬Y|$%%1{քC <۶m×_~z SNEHHj5 o>8p* :&MBDDB!*++qUl۶ 999V/'!B!BѰz`I׼y0{le?~|nocR T ///3#Gq3$$7oaΜ9m~!B!BȣKሏlj'k.C("!!qqqo7rH&テT*RRR%K`ܹ(//z9 !B!Bw&KQQQ8v w܉כ|=!!wX,T*Ş={َHLLDbb"bbbB!B!dHݻՍ_xZPqQb„ ={6}YHRD"JVBYYMG!B!ˡpZ~).]'"""(//GZZmۦB!B!XGmBB!B!cB!B!ۣ!B!B1 !B!BY(D!B!BB%B!B!b ,B!B!P`B!B!KB!B!,X"B!B!f!B!B1  A"/%e]۸Gp竪m^Ha!ub+uql`OJqb᫜Fz#BWr&0eS| #`WyVk+$b9 !`QP^}#YxG ]ZZ}ťss0w P(oTE%TVmdXb7H<4(H%7W<$7*%f\Ɋ*4(t=۵2ɽݫF@-kOndOw+V/0޽ pdM+͕ J)-ǑrT*H<<" ?eOK ,BZMNTTI";91[/c=*+DLWg Wg 1[`;SYåel֔C0w D\?_G%e@ǖTژZy37;{F{yY'<.rR"\JF?WgnG;B!B]ubJBl޼6lŋUUg@GGGxl66!Q mnU*Y, .*/7j YX&x,~9(x8[ZJeUn8*k7X,U`OQ s-WqJyJ~xsVSť=̕S,Ɯ|)r8.nmY:' Q(P*kƉJlg3>_x,>59Z Z+՚z6>I^U؞_\֌ ][~=Sg竪TfRX?G!B!2Lxzjz2uBihhSp)\tKl (5-TLǃ?\~Yjo|6JQSwZ4C"DNP+s; tJoeF׹ZkHPgpq nd*.Ukz<5L>},Os"'8p8PPeX/*C0EGJ[ \eFuJNp|g* {]۞B!aCX-<3go`S7WXti ʚShz8H b<$,; csm憹|f9łbGü<*\OVbA硪W `XZ.]ך2^6XZ_|Fe7*74G\i4gUA)hB!Bi.KR7Xd:&#=pS olU7h9@ljT(lA6.w4j/gfXsj{"Fyb j5M3sX,6@Un"˒4gqzX/xJ[1|ǎ䱲FuJv3p^@!B!-e`I? $ adhll4x+tdYXuXx!|6걣xfbDbrXgxMN`LL$@ٙKg1-,iB!8Kti,H^P v\eyÜBV| GSsƈtkP$Svl;ۏb1_Z֋Rzo2>_0w;KK-gkB!b vX*//GQQ 66:ׯ_rTpWaIk@0pEPKb!x"s-mޖ ,m2鶆e7h25yIK[Iu >eAbn}>̯%8y ,<$th5^\vp6ܻyB!b2'N5 "N $1>vƚ5kfXUrk"Rd8-9 @fb(HdDfO G! oŸn3HdOjuW'$Ŗ*5mFV@T.LG/`Y[gRiJ ]%n -uJ%8,2P'k/gFHv(6~b!B!d;v@* +W7X,bbbxb@zz:M#QVL&(/ ł9#ӡwF(j8p8x>g1CgF(z0=l6&x"Yw~_j5NkOĺ:Lqn.~լRa_Q)`g㜪Nu; l Ȣ,EY{bUw{nmjW֊XiEEPfa&$3d=? &$D^Ç|>sryyl\\\oJ%0zɔ'EP\lʊ+,M&"""""JL կ~G}SLkP(ynRk(jPn|\WZ;F2CX_[ r1bd -42䂀C4,Av\n\d4?FGk8 Ć}h1oD5m>ltcń q]a~,o_b\Ru7`|㳌":]η%3* @l(؛5qurܠ  s1/X "VV<{Ҟ\/1Bp?*+J&H஬aR+r0j d`M!ð5[4hVnC]}t,`݁r#:^VPA1 B#/azv:"""""6lݺs/_q`0۷oK/E>yX̘f1HJ&'ɖމiz~\mEV ͇].76;0>?~Sw sQn#$8چONXL(PER)Ν>otxK .Y1hEeQf5D|SX!z-rUXDI_ff,(j p8b!-AJ{J^'Nc~ ӬfXJxA|ta} -:~PWM͘m&pgZu8:˄7DN/c^c((x6zZLT'ޫcyHC(| "zbl*;qQX""r*T*Dyňҍ%" |# z:$UòbFwl&D"""""tKDD2 `ՌV3Bg M^چ7p)ی%" E[kG^|!QDU[dn"""""SLMDDDDDDDD0IIIIIƏJ0dGvޫ,a _Bxteban6b <1zd7&-x:b(xΤѷ׭%b*yC7bՌ?^w@H , cbر袋0fl6O<7p fV܁ =|!Q[hCK< _8夞 r\)Lycޖ9*%LJe%l+tr9p77t 5L3Pچ *QZ S&5QUàP Q˦flq87#XLXM͝e ,z^zc& I&mluc@s0W tP?|̶YS(-KO_<J6K |  C{?<>z$Tr2e:-fXx8h%3fZ-Ґ$`%|8|0<Ç㗿@K32N.I|r!s }S0s<B4 "d2}~htNj@MF,FJ;੣'FX̸<NJ N/(#el`bF T.QraQ;(9j}Mͧ~Y$֛a0% $Xs{)DM[ZB!\WB# zjN< ?l # z|O(cK(ƂJ`{C#bՂx&#fZ-(i ∧٬(j Nj].7[.vo[I]`N:JEu>?P(v W`) &@7ݑ\?I%~j(he}9W¼F0)"[۰{z˪'^w`Ɉvޭc9 slVj8lkpS+2*rlf1êR ˦fW[v?Ks47ۊ ;mN˒%>Nj?8tgX zlq8zMm-;rA4ճRۥTIΤ^R( ;;ݱYV4$n¼.X"""t:t(֬YX5pe^.~>n**e/aQOaV*1bds^<]ds 7;vK2FoipZ.Cрz}\z0^ыMF,/)~~?(UylmCuE5ZL负խmLsH0RۥOHtLtHNtl\riLODDD'vglK?ls7Z{lb?NW9V.,[!:-Dz3|dwrpbC;T264ժ08|~QS7z閯$ZB!8pFɞ/7{C!hjDSY8퉵j%pv>}t`K7J}7 ۞l)d|n'ZԮ5Xp"""o :4v8]XI@  j,/@ 1TP]ȃ7|$HaT*bǕ9xps}VFDjψt^$tGU wq/7tabȺZ,{j_PFt7B*ҟt'~n{]_TgH)4r54bS}C D3%"""< ,3o(}&L10lfg؜:-u(d6aل tZG V:vߎ3Ͻ [o{EC8&"+ z 4:0LJ@ޏRۥ/]I}B7eŤT`R q^5k%фh0s, HB˒$m~ B _C֮`4i59tO=ʿ4?Syda2qIc)s-J.!I*??GuEQ^IߦZ"Iw}+=/zyL]z{ߕRe#\{![f\YmuaDDDD}p5m>j5(j:_a@i4my ӭ rV,7Җ&ˤ2ϮD[Tʄט^.E9T_:>Ghp}jd&_c4Ra|1ܙ'.W_Kw])>!U_ir; 5x^; :XO?~<@{{t n Qr=3A&L)"_55<]=T z tIq:a6v61bŅ0?Og}Ru7`|㳌b\чT)Նz0\ÏJJ&hπqz#hÉK,fUyE9X;YScsӥyn EPd"~\ N`N Иt]"+U'ʄKZ= W£#NL(Kn[CcZU̴YPB%qF{CZlt-FрB& Ao 6;`Og4/LY+h ¦(-@S3d[1BI?ƙ6|'͆ԟtq=GNS}w5$/U5pbE*J)tFrX vu>n`o*(X}40jE7ħNqвۥF*/Qu?~ ss0DEJ(y@w8oo2P'/mkh0S-.KvI+U'ʄK:r4Eld`2߳Bxt>~L\ϩ)f۬({M骁.$c. &rxC!觤AQĆzt .϶",X_[?!"""%""j,-$[L[ΡߏVKY.lBZn|]""""ɘcT1[`󮅢 G*p8u:` JY  ZC!`]M-Z30;Q:,pDDD-DDDDDDDD$ s,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$ ,$. n2 , P^^^˅:ݻ~):Qc<#+#"^/c[pI;yd7x<|E0޼yp7" ŭ3eZ pWbXrenCQQ|Nﵴ_||Mt|F²epf uuuعs'}Mtijj²e˺]| ,QRZO>$&N<;;;v,nV\}]@ TTTW_}5 GM3`'Nݻ _|//^oK B8u?wq 0}N={TUUu]3fCihhɓQTT~N,~Xl_]]֯_ӧOcPTXh^zN~C oFz>{={^׫'!"""-&&""F A "&]t(7PGovuEEE{޽N@AA~{=0< 1bDuz[k .+aOv]ӈKDDD\.ɍRҺoǃ`̙3 64˓Y~=B-ZR"J{/:m̙غu+|>_ZJDDD y:4cܹ=~xwމ4ۚT:@$ԑbAEEB صk-Z3f`ڵIt:}v̞=sFYYrrrgΜ~o뗟ꫯ{`%"""Jٳظq#,X%K`ڴiؼy3ۇI򾯹Çǽ7}td26TLMDDDr8Xn~aٲe;M+VtQzq]+V4 nh4x<8tP{{L:d`^Դw/_ ⪫ʕ+qA̜9R>\@,/UoaI/{,QG'D0ŋd zϟ7~?~?<ǚ5k0k,\{Xn]RW[[{I1`JNDDD}oXx1L&FcJ AcJeugΜe` y̟?˖-?/\z/Ċ+aÆجwRWSS&deeaرIR눈.\DDDDuSWyy9DfK4ҥKqK/ ]:pNc~ 7܀5kH~[l%K0k,^9h`%"""J`0M'3|@}}}gT3g:u*a @vvvE.`ɒ%)7BPlu] [B0͸뮻(-u """)(!VUVÒ%KP\\ J1cGE~k?wޤTWW%ߕ7 )7֯_ k@j;~8^}U`?QFAVCc„ xC%ܯL&d?\хCለ(mcƌ1cuV+)+''IfϞ=ꪫ0s0d<6mڄŋTjiiq7n'|r^|Ej\7o͛i#G$1c;tyn gΜjDDDDqcjhh-܂^x{ACC v;n݊z?0`Jj#"큙#F 77}o֭C(hO? g}{/>C Gڵk#]g$""""""""J=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@z_G 0obÙ .Y0jAF ʤ-ls7$e)xbN?otameMZ?q[e<#i/~ ̞=k׮ /g~/qz=|u]\ZTR 8 _L.+%;V9}2{c5KqHl;-?6l|T[.K[1~x vl߾/23K3`1/'WZC!!@S0aǼ-sTJt_͛7ԩS]AcU q{_yrوwFG^l}Z/% ñMy0X-)'R^,͚5 >(H5Bp7bܹO~1$s ubk`  bP6k \.*++Q__mnɓ ,upE0fPY5hKxB7篿Q'Mj65US 3yNNj7~dﹷ/ODDDD ,l6g?Bݻj*axᇑ~w@(#r[.wJр͎)X[n֭˜X4p=30,"Ri}|}|WE#"""M}7BrCmm-DQė_~'8aL0aKJ|J$D IDATR{$ ۅhKglܸ'={̙3(--ܹs_D?*+Dx֞7୳uޟ`22%Z 42ZB!AxFuk[j 2HUBpŦz'|9 p R o(}&_g=C˺LVa^ zJDխmЈ=җ,+x[k$sج(Ԩ!pħNWv_*A!c4V`_65ڞ|'Nu;:{בxwv+WᅬUV} J}cʕ?졇¶mGaŊ3gl66l؀_~Pۺ5Jƍŧ{b7h(2+qlǮN)5Ma/FvY)rl)6P!}&^pK}]UĮ/YKBo6؈Clî7E8M"U{L$Rڳ;L{QM7~$uf 1iɕ(7z!8}GzYImZ[9] ,eggo߾۷?~| :k֬TVVb/l bAn6 ,CPd(jP@'/Ug㶙n5m0DVmUaŌ9S}䂀 -HEhe2ɶT鲜X̸hP #:0h˕I 5j<8r8QHݮݒ|'7'nYVVK\`IJ ae<DZmV NJm[)"! `N 8mAGAVN6>Nĝu_}ΝFۮ݁> 77}njRSNON|j5V^aÆ! A.#??+Vd3Ϥ>XG|L#Pi5@T`T9 Fc7މ[D6S^.Ly=2l<Ƹ#G@PYU֦M[S *C.-A8L.GVN6. dhɜUը6Fr#gCC|gUuvRڳ+LePip]?<V1(S?%"]Pjm)+.DDDDUFJJJb++## p!bq_r*̏ޫcdV*1dFy$cHW{h ER*lζ"< wD r1ҠGHjYvE3"( F8T߀8B)h j1DK 54RQ`р}flipZ.Cрz}l=z`^8+keSdfËMF,/)ptX_WEzB 2S3Uh t=O^/u1\v|;zkO'~א5k-ҥKqY}8|0q}a֬YXl֮]=w5spR%]Iˮ%7\3`l G>݁G70eh>{julǮ-6xLΟ&{=^c;~sn_S'c+m:]PA?nY#P(E^ g9$vkՂw~{xLJ{&#̿T̚4Tl Gm ؚ)ĺZ 7QQc\!.\ u|x~w3SzttMAA; "v5|rl*Ta4`KWמ[>'w(I9JAl[~>7&J\S6$uzX*++FZƣ>3g">Á_ט:u*4 .b|i;o-ֆmaCPr\xgchSx]nl(=e:bSR߮FcMgوϽ?^ZⱣͶwP=O?džg[/=prO^HW{ y?FϹ gc ̺dvN\'O!S(0aҫXK]/DDDD}-#wk4f|>!''2iҤIsZmx^l۶ ۶mѰNReP%-HWδ렓!4; {|i(jE}Vj ݌f$ҒݳHo# I9 zhagv;yzȑ#Άj-衇[oa…e y/cAv'Nxg::I$Sلq:}DQ)%I[CĂJ--h8 8X=~1sgEJ*aP)9CJw:y)/χ l"""s2ǒpp'OO?ĉvN$nC]ASp-_G&aeQO ; JƢTbNFlJr9@K\G<%3M[>4( !IE2aN{BvpㅯR_oC~4 pm' 9cǢ~)r9f̘NK/}s:(UUU ;=pq>GtxJfE;c -@ɁRt/W"@+PGڞ߱" { JPc'X}I!:o+ 9XjmmVx<~Ð2;_jB i1TWBك8ܹ(w )J&(h QC{%GI\vD٫9|$O0y c4YB0Baoz^5C*K<$ *Kt:ꫯKGNC]]&OXS:^:\{Zזͱj> ]2n,AVC hnh@CeUlV6S~ V 2$EDHG{d >?j^w5NL&\@ј*/7ۅ蜌 ,O OaPy|>ZZZlU*杍njbsTbلIf:[ԟT!* _7{Z4~3.[[Z4Qo7PۮHCݦL`05k??0b=d e'x}؜(Ryw vv}{ҤIؿ?mۆP()S@&AT:pWYƄ5C/:aBQЛM෫:mc RN՞Ύ}/_>SY׽^{/Ւh7, 99pHB։'&\}\' l|XlmOV"$P 5,Ⱦ>`\0T9yM[ĬT& .i岄< I4)(,SH_R& .rXߞR{up8`a20d3vÇ1y>8;tHX6x" HtWm] L.G',2M b_^LvF [h$b(gP4Pw=tBk""" 'nlٲ7t,X7ydFp6oޜtyyyxuuuXjU>j^ ]e)I`I. d!i>xY (i$ p5V.å >>o歩s!"UmmiP\<2lhj5 R{őY~Zu6zڮ/C+aŌRky%7<+7t vsNr-pG{+6+RMYu>[Šb :z.11o \[ c۩d2Ͷ¼ "6Gsp)+6thҼܤAAE2!%q=Jr9&Mo\\42Fmc^ttmRy<,D"yk&8?3FOO$RQcF7At\gip:8~8`׮]PT3go,^V5OA&dF+j\vM(h DQľ֭> B T:-# ϪB+bm7ǂF];ɯ59Л~@IW{v$"6 \Y İaS&a'`șGļ~zXgVRẂ K~_څ+cկ裏bʔ)x bv<\Jष=m4l.϶!$ 45#$M`lc"9KZB!h "V|<\L0bBK(L P .u#=Fu0bFG<^(:-pTe,#0Bmh!H_*aC]=FuGe%t* e !Co;[t_A[w 5m>ltcń q]a>|,0Y{R{OÇ YYYhjjBUUUv<l6[Hk„ xgֽƢEPZZ^{ gϞlv,/~&O?K jul7#b65ckob-7be1rhxj!W(phc܂+<7a`),g&{=[_~_ "jy?`OE//}3E\q : æNBC8Zwnƪ>I\1+7P4f{uz)̄PY[bL혽>?8غ.DDDD}-cKuVs=X|9ƍ:l߾/;L}=| Kr1B@;.lolt-FрB*Ϗ#lwwz~\mEV ͇].76;0/񂢈gOZLT'ޫc2H3F;?:*( en)f6ո|tq-.V֌9ecZjK.[+ ("_N|?uos_|CʞTuud"169Ϋ׋p˖W~!Ǜ|{1auK-SPJLG%M[pn^TuuOt5LYѣG}6nnn48~LСC4iB+רH|jK;v<4i҄@cʕ.]Ғ&cw<ܯ593OXnݖkV|$xsj۶-=z 44OOO_NRR;v`ڵ('ӓcǎ}\'NHv?>gwE9sf㴥-\\\xgF\v72{lNJXX3f`ɒ%l5i$ڴi 5k<z"88,Ν;NJ+Xjv8x RfMeYYYFRIDDDDDX*v?U͛dee@@@]taĉVI$э7ՕSNq5uQ0j(\\\X-cÉbʔ)Ɨ۷do!C̈́2`2eTX 6 ggg bĉ\|`f3kf'4ڵk3sL*UDjj*nnnƜ9si1d?`6vnnn4hЀ PreMv㻸лwoxF+ԩSiѢoӓz b2~sY5hЀ]Z%̙3xy K.ٴ(T233Ynׯg޽ُٳ':7mذW_}E53gNh޼9*XhɸӾ}{йsgNJ+f͚E aȐ!|G@7x,Y¯ZbqqÜ9s͛ĉ9~t IDAT8+V׏믿rZj30{l/^Lzz:իW]vTT@1tؑjժȏ?Xq>,-Z 33iӦn:ܹC֭y7qww3N[^4h@DD7ndҥ={+i$^NNN`2y 4N*m۶w˗/gҤIƗhȮgcǎN֭%K8991|>cBk֬1Aj &MDzz:{6,qq>\+yٸq#$&&rA~'RSSu;vN:sǏ7cL&})ˋI&L&?\HLLdɒ%̛7@1ŋc6-sܹsl6͛={v#l{oaܸqڵK.ϲe˘0a=YX.\ѣٳ=*(T6&++#GS%$$f3-sHWnԩSd21fyꩧ}6ovhPrʕ\?brWj\߿SNj **Ӫ (֭[@v-Fă>HzHMMoy?5N[=,,ʕ+{Ν;ڋz]CZZfsYd=ƍl޼͛7YO8ʉ'lއ?4T^^zA͚5TR䅇ˮ٣y&OzfgggWNbbղo|VZ#1ıEaFgK,;zq<1[|8pt<==>}:˗/gΝ2gܼywY~_>]{,gR"%%/*4m뺨vEZZ=׳G'&&o*m۶3DEEѿ͛s=%YDD'OB ܹsDN8m*Uϵkr%u]Źs =(f3 ,[m۶3rHN8ac"""""R~)T,+T/|Fn݊<:СCm>::777 RAAAyX*Rmz>ccc$M6%,,իӡC:t̙3E׬Y˗m~^ gQ^S( Sn/ lڴG}^z)$"""""wKŨYfpmƏK4]Y WV}3l0عs'7H4geT ׋t {+Wl2&NO? /޽{W\9j֬Iv⫯q,#K wl~bf~(i%%%Pn9]J,#K18oN4iL*r'T܌$Ҳe3f gΜ^z 6,:/hРAܼyR{"*\󙗣Gka6qss^zyO֭[9}=kc6d5(q"ժU3鉿臒V~xF򉈈HR1>>yzѺuk>|EDDDD>R1ڳgxxx0zhc;z⥗^2Fwcr9>#ܹC֭y/UTcǎ|ᇌ5jVZѳgOf3'O6j9rsꫯZmb '''&L`PCEdeex|O'3aa|ꩧ2e VӞjժŸq0L\r%ϧwww<Ȟ={ t>~7 ;2l0*Wd"22W^y%~%N[=##%K0p@$Qdd$/yik?TR%ZlI˖- TEExiժQ0q 03flγ'^^^xyyYM!XўD)T]z?_|G};ru<<"""""R~)T.\ӧ!!!si֬YÒ%K>|=q1׿ҤI2,߳w^zMDD5jŅxΜ9öm/¯:#22>}Oyӧy饗-֬Y͛7iٲ%JBB;w䫯">>>ױt邷7 V 0a/ڵJ*\xիW_2~<5N[=###G3йsgjԨAZZK,aټynJ[laܸqlْ ヷ7;w;vl2Ν;g㉈Hf9"{GDD~)_|ñ+'''͛G`` ӧOg-\5k2j(~WG#"""""rP%2M6r5{GSj׮M͚54'""""""%CSD8'''ΝѣG卻;#F`ڵٳ d'ƍڵk'ωHPbI+Hmɉ]ҵkW233p*TǏG98JK"Rݾ}O?p^:fG_gn)^*-""""""""6Qn))]"""""""K""""""""b%DDDDDDDD&J,MX8:ЩS'^{5nݺŅ ضm'55ѡYJ,3<<۷9}47ofҥmŊݻ7۷'00ą ؼy3 .,Idvڅ7ԫW +8:42 >Ybs9Fɹsڽ  33l+))^zb=..bN> ?ׯ.\(cGT899N||SF۷ܹ㌋GVիm=zڵk%HYV4I|}}ywe|{U F=h۶-{nϟOƍM偻;> ~~~dffrI_n<;%ʩ*U{QV-~gLbQOzz:-bѢE .]׏:ILLttH"""""""ej,C{o1~"qwwG_~Wzj%DDDDDDDlR9SBʾ}x7}v/KjjQ p"""""""Rx W1eˆwww\޾}4uPP?|SN9602L%/TZ&MΙ3gرc}3ODDDDDD($kײvZG!""""""RƒD%K""""""""b%DDDDDDDD&J,MX($""""""""6qqtb_DEEѰaCԩ$$$ekRRR>44{f͚Ibb"[l]?A̝;|'''3j(?kY۶m?~<..Fٌ3ҥKw\\Ų?X*gN<ٵk.\ 998p ߟ c;___^u\\\ؾ};./^Yf;ի3vXFw'"""""""F,G7n̙33f [n5 6}rU{9RSSe{1ݻw=6X){T>rAcR͚5kkZ%~7Μ9(#"""""""GHhh(VDӮ]ެYbRDDDDDDD X*pqqd2C4hTڶmnڵnݺsFɉ'8piii[9%i}$!!M6ЫW/R? 'm-uӹyf1F)"""""""eK$֭kYOp"""""""(t k&]t九}޽J,#>>>廼^znÇ[-۸q#:ujYDDu ..ΎHYR9ExiժjϏƍ3`f̘ fKZmh"f„ ԨQDxx8wfݎxk"""""""R U0ԩo]IOOgڴi[.ײm2~x\\h6qvv 11^zɨdoPŲ?%ʑJ*I˖-iذ!>>>x{{sرc˖-ܹs#44MIRR[la޼y[J,=J,IĒH٣K""""""""b%DDDDDDDD&J,MX($""""""""6SDDDDDDDD&$""""""""6QbIDDDDDDDDltWNNyǫWr%G$"""""""j,IVZ'K,aƌHDDDDDDDJX*֮]kzdD$O<ȑ#soܸq9 ")iO,mۖ͛ӨQ#Z*f$<ȷ~ˮ]rmEdd$͚5#<EDDDDDO,7.ר SN,_ӧ[ӽ{w$Cu(n߾Ν;ڲضm=1sLΝ;@JJJ1EZr0`~S"l9+o&:tCBO,D=عs'qqqęL&"##ؽ{7lÇsʕ{g>|}'lV'/^ŋ88q'֯_ѣG9r\~*U͠ApvvJ,eeeqYvΝ;8p c:u8sL^BBBZ* jբVZlݺ!q8<=W[JJ _|=M6Ν;V,\ybO>\8cPq5j?xÇ3|p0`"LYT *`֮]СCiҤ &;wGq\zxxлwoZnM`` nnn\~d֭[矍'NHv_#G0d!C? :uDV۷/!!!r%֮]ܹsaҥ>+V0^ϝ; ~&N3ׯ/Gݺu>M61fZlIJJ _~%K,d2ѡCtBhh(rQbccr}l釢O'~ɉ*UЦM6lh~dl.L&aaa/߳rJN>]b1_hkӦ !!!*!ǿ/j֬i||| !<<*do={dĈVmj2E=.];Çg߾}:t *0az!}y{{ӲeKZlILL cǎ֭[y0 """"""R&Ծ}{z\wa…tcd'{wٳ+Va222v}d2uY@ǎqqq!11(mILʕ+޽xfLC,(K\鸻tԉUVmC 1JYYYݻ N:I~_رcܸqxX:th_aq1V&p;tz衇9rUR\x5jPJ _իYz5AAAFboe…x{{ 裏|<۷}vUF SLa͚53}tL&n% IDAT3g --C|`kذ!>%Kٙ!Cзo_ {4_|g§`)""""""''Gp7|GáqXFԼٓ &?TO?>}9ȑ#0pKVVvرc2S֭KŊ:usk˗/G!55K.f}ˤ[~x";wh0m dYfqM {zfV$$''i&GIFFqqqMǎA4oޜ+WXUĒ%-g#Y-;pիW,^[}vvAbbbǛ0wN/m+۷oms9FmNNN?W^(57npI ͛BӟJEb)W3>>>v bI";wTTzJIIzmmO?*W dyG`~h{*5u\\?>>>F[ժU}bE~S """""""EQjKիRzpvv.ѧB iӆ.]мys"יFk׮ժ- WrOOO~G^{b}zZqHHH`РA>ڵkбcG#XJzbUu~)lq{z*5j`ǎ+vݿ94Krrr_s'sN)>%et%?+V`JVKll,4lؐ ֯_Off&3jl޼x|RRRHYYY9s3gΰb NJTTO*;I9j=>|ؘؠA*W5_Bj5EIO)Xٳ'۷k׮<ƺG*\fM*T`vww7~R k׮iQ޽uEVZw}gTGqe~mƎKhh([eɟg>̦M٪t~~pyصk]cqn2C,[ }~zwdz8uꔱN`` :tgϞ1n5J|Hp<\o…VnjcLmҶm[E9sf4Ϭ\_X󸸸дiSvi7o}5ԤI bՖs_tt1R ;HǬ_>O?4n$%%a2hԨzws3gΐn$ @tt4׮] >>H*++ݻw%K`6qvv&33(mwf˖-nN̝;7np5r*)""""""Kr͛dž ܹsYn.]*5io5dLʙl*U䛤)`9]rnǮPB>r+WsYFF| }5,S\5l`"##9;;}viǏ7xxxPK:""""""R84d㉌$88UEFFݻ+VpGɗ_~YdzLK"l۱cGSf̘ATTCŊIKKԩSlܸ˗ߵ'|ر#uv͛oɠA "557'y\^nܸ?LΝiԨܹsdرc6m">>ޮ.)""""""~TYv->|Iy5` ƍ7ncQ‰}|'O=T<9aV""""""""rTrm۶89Ov}ܟiذa$8DDDDDD)$""""""""6T8KR*0DDDDDDDX($""""""""6QbIDDDDDDDDlĒD%/L&|IfϞ͚5k&MrthŒ3wŲ[o1q|1kfqOcƌ!..6mڔiĉ1x`G"ȑ##::ѡH1+M3[>ZJZhh(cǎe…qG ATT 6N:xyyNBB[l믿&%%%v<<۷9}47ofҥ9~/JRRɎ K 8/##ݻwkժ_[Xգs;v-[wxzzǩS]iӆ޽{+/_СC,\#G1K|~XrKY#PbE0`ׯ_wtH""R9sIoή]pxxxߦddd䄻;^;v7ڵg% ɓ'3x`feT\___֬YS*KK,aɒ%ŕ+WJhՕ^xȾV>SqssUVܸqʕ+O>|7>,.\d2Kdd$jժ;{DGy߰>Xk]gCݺuرcJ""(T[ڒĉ̜9"""غu+'N#,99'N &""m۶)9Gf}u@\\\O%TT lذx"hт~!9l6ŋ|>}3fF.]7or, ׵RJ\vJ,GE\\}+5_}] ۷#99BBB\{a}}ֲ|ѢE̜9H^c'|kya9^:Ev޽; 64|ܹ wduVrT#(ttRqfgg2[ɓƓ:\]]iܸ19S~sݙ1c3΅? ˋ?bV;?r~ɒ;vXt]tL8ǏSbEO~0`+0ַ7l`hꫯQs)41G} ?gҤI 4~sZj30{l/^Lzz:իW]vFrӢ߳|anݺXY֭<<ܹ+ViӦύuRZ5Μ9cϻ-KIc=FnݨU_Xrer(ufQ;v4J/ -- FIdd$: RduV""RԩSs={qD~8q{[e;Ǐ7t?hٲ%*Ty[ǍdٲeFr[K/Oύt֬Y G_~V-_o&q?IӦM u,_>O>$}?#ժU}N@ck?ԨQ# UAݹs_iР-ZO>VS lw{p稠\\\hӦ wà &0|pAiҤ &$ϟo,11 >{\rUҸqR|ҥ,]x#|ߛ( K0OgJ,G8ɓIHH(6t̐r{۽{wELMMĉ4nܘb9nZZfse|HH!!!f-Z6l`Pzu3wϬ,9BHHk6ڛ6mYYY|[zIQ!' Sty~yEDEEYM (7n5dOy뭷x衇,< ۷ogŊv_~-Lb(wG_/ӓuFPP{ڵ|wڵ@Gr̩^PrיEa~?h4֭[G>}x衇X*}qJ Kֶmۈ6jDEEѿ͛󭹑S=z4=x޽v}4⚶k׮{s'Ow=KMYzuzEDD5k֤RJL&m=<<-_|nJJ /^*?(j?XXjIGɳѣ@vUVHnE%&&*nO}u̟?׳yf5kFnطoƺ'`̘1lݺ'ӧOgܹ^D~RRRgHvNll,ԪU]CTTQQQ2eʔb;-[6mW^j/KqZ`UT|w_ޘn[Ps*ufQÇ繝=y)}J>ػ㯻^MqPKERDeќrFK'&:c?h6K-˘I-K9"* "p{ {Y!{>||΁yM 5%mnq& 6mDJJ V"..3gԘSaݺuX_,*++6ŋ7\YNGDD wqqQdҥPYYINNiii_:t耿06X䧺~垞--u݈Veʔ) e4Ayy9K,'< [,򰜗o3^z%Ǐ|F G!neXjC2221b111uxcM3QL8y򤒧!x饗pqq筷ު`޼y;HW֥p"_am[Q׮]ٳ5O>?~i/^Ozoׄ~Ο'q;ow}H[sn~V#~7ϦOsaر#DDDܴ/BGRcMҥK{zzӡC[-[VgL#Q郯/,\PQOeJ ,vȍy|[fk,\=hmܸ?ϒ%Kٳ'.\ƺlڴM6Э[7~iÙ1c۷os@K3[s4ܹs]FVӯ_?Fw߭`p[ne6Oj{=^xOΎ;#Ά{nvM׮]?~>'O˃>ȇ~Ȋ+3fLylZگ{knM̙3ux^CYK'ݫ.$Bn!_k eРA@...t֍ǏK/)9 Dv)3g;cǎזLZ7ƍ}1QT5GwQ~,L- IDATIoױgϞV:d JJJiaM-((sSSS)((@0{Zl2f3aaa*L J\i U/htL&N8lϪU@`` YYY\X.\} dR&Ġw[ejxxxEEE54~v=[gyy99fb̙|gѫW/7or-l_ʿ̢1?IMM`رʸ2bZ4%Tk)('d*TCڼ9L&y~߳f͚ZS۶m())A3qDe׻2 cǎ̞=T*giP6~V#Sx׈7$55@-Aد̢1?Ceƌ}AAA,Yؼy#hx?k [iԮB8 o1crHtܙ}ЩS'>:k.^yVZ䳸z*FQ'TˬZ'x#F0|p\;Z233?~|}GDDDЧO/^$tvvV[~oI ,P*"""j%7oթiiiܹh3g2%_g߾}ʺrss9vDEE5hURRC aժUF>W{{ڽ͛73j(:w̺uT֭XBy0Ylݺ ~a ưa(..FV+u=;v?8oP5$**(*Z ƾN-ny]w_:|۶i-JKKٶm'O&66DJKKmm/'N %%2yd&Of~L& R4~V#gii)[la˖-ulZүOɳ=9Y4Tww2f~aNJYY/Ȳe˔o~BI`~,Xѣx{{c0x"bӦM- XѴvcǘ4ij9<Ν#%%={(vZ233%,, gggIJJ"119sXWEEcԩ9 xoC^zTkWQ/>>>L T^l-O-p[Έ#@ΓO>Ɍ3`0pI6l@rrrmmRSSC=D^رrFrJ;bbbۛ28;سg[?={?Dii) $$t:>|uqzˋHF#;wtmZà &]E1sL 'l߾O? 6Xs?hY_{7>?֬Yr~f؟`ر8r|I\L~f\!Iծ];3gfذa-Z!Z'''6l؀'SN%++z: 1aΝKrr2-jQKCگ̙äI桇%^\"? /@tt4;wdٲe-]!hqcI!Z >#T*SLi[FaҤIL&V^ªwy'P5V*wwӎBGBB7oŋ3Y&n}{/:t`zͭ1A[^'44,vaoEg $&&|y-KB F^}UG`` yyy-]%q yٺukKWCz5>hK...{ﵧ p#66=zVU !D[#%!h=ѣG[_th_&?W[ f/?/k#B!QdĒw}-]!B!M@w !B!BH`I!B!BDKB!B!&XB!B!63fŋe*w\$INNW^i7?Orr2n骴J˗/'99I&ջ^sfknyUW /p8B!y+-&22ңG:wddd~PTTrB<< @~~~>SNlڴ~QeCCC9r$߿u t:2fػw/ ,nTT˖-R8t7nŋh9Mٯ ?}{ ј~]ѣ9s&h46K}B!D&[SO=E׮]k,sss[nt֍q1|N>ru|2ϟWed|ᅬlnb֬Yj>f2vX^y&osh~l 9/EEE̝;W~ܹL0 7LvEtt4cǎeӦM-]%!B H`Ɓ8rYYYNDD>(~~~,YGy`w9:%&&,VT ap=z!PTѿf̘_xi7g͞~}+[Mll,7on׻B!hX,??syᄈeee-X;v,ɘL&ۏdRͶmHOOg8991j(>&ۿԯӉ'&88~qB!haXjC~g :7y9Ѽ>3z}e7ʙxb š5kO>}:CϏ>޽{|r_r^fdLѣX 駟 77ѹфB!D%6[nt:򚼜h^ǎ ,_PL&v1}tj=T(z Tfٳ?SVVF`` > 74;@c4N/䌎fhURe:jDDdٲe5<sQ/--l6Lpp0Fb|W5LBB}&L@޽MܜLO~@3qDzJjž~my-Q=ʔ)S0`*ApwwWxyI!B ,ݢj5ZJ/}C)))-'Z^הϘ1~eǎKff&fɓ3w\nƍǚ5kt钲իذa_}cÕҚ5k)++]vѿ^|EO %Y;v '''%إK8~MtB@@ΝY߾}yOY~=8;;3tP~iF3ڵݻws1WO6 &/rĉ}oJ2C /Tq4g?{衇ׯFvEee% _1]l`yi,[K.VmB!-Z~,X@yyCˉ3 .Tyyy0`...ۗ]vٽSW_՘r_>|||?~<;K 3oom~}||ٳ'fA۶mΓO>nժUrj<<5[la͵w cРAlٲjw{5F3ٳ?51L*oe{ٹs}r[:??oK`I!m=Cܲ~'{9Μ9,5Xi`Q=֭[k}^VV~ֻ Fէ~Jrr2lڴKҩS'^ʒ%KP #,, n 1Ū)Hf_~c;f;v*}v*++w Ԙ~ֻwo<<<0͵q;wlzfG|2Pu]7DZZÆ cذaL6I$B!ZXE0l0%yGy7ZN.\`ue%w=BBBY]Dz֔(S’;ʕ+ .H'!!Ay 񩬬dҥu$ $''GYHLL o77Zݕv @NNsQTTDvvv$oL?ۀDZ(EEEx{{;|B!"[d"##M6ªU̙3O/'nN;,,#B%n,eҺjquu5 j('[M6lZ-̚5AQYY… ktDDDp...ב,]*++!--MIޡCk;`+,,lMcR4U=[3{#YF 6B!CKmHFF_5#F &&"[ a#ReK`%Ҕ TTTpq{9V^wĉILLUɓJprr⥗^Ņz̛7cZ}{ZS-)h_[h먮`B!h;$R T9 aah X:G+$&&d:[F4G`z%%%J2ӧ,,ok>}KEE .T׳TL 5LoԳw *[YY&B!Z7 ,1F04E9!,'ѣu,o'O{F厱JNڵlz=r˫G aIʜիWk}hիWiiiJyt<==,scXK@@^]v]&c\zGjJ`r]5D=B!![GƚP Llk9!#??TƎ[sWWWF_ﶼmTRcǎp7#L&e \LL2jԩSJg̙o;v|mh7nKǎJŨQj}>zhԲǕz=w_4tTőn6t:&'N4F_O!B:n_z(%qoϞ=>}:˗/Gb2ظqhO?C2c \]] bɒ%PVV͛ٸq#3glGjGKٶm%%%z&N,_b 4%Ky?ѣ ygIOZAe0شi2d* Z=c=DG8A = 6L ߟ3gb4[uꍈcƌ7hfKq;ӧO7*ϙB!5I[7111Xe䈽D`-ӽ"""xk;o޼{ ߵkwy'cƌfԩ)wF#˖-SFo8Rnn.ǎ#<<(l}Hii)۶mcƒHii) >>8z*FF>#G(__|UVO0bΕ+WpwwGՒBff&ǏU>ŋ)//RVAu>cKDD-ɉ޽{۵GpyIKKcΝDGGǜ9s͊+Zm֭[U{キj$B!ZXXB\OA׮]d2q≻B!h$$Z , !B!7 , !B!BHn!B!Ba , !B!BH`I!B!BDKB!B!&ږ/,P7Ws1NQ|ׇv.hU*n:ˍm@^= !B!h6Rիzw???.]_|5B4o@e +FcKVK!B!ڜ6[B0ٹ|劌&r+l04]B! iK`/\]pQ)5l0Kq ?\.$jjAg|ЪT *.awn>VQo|(18r e0;KIG;^:TF*iJ3t_߬y{2ϗ`g@^}&rr=>{AR1<>:(1J[r\ՅNGLvyG JLZe`\qV)2YL71ﯚ*1c _'x ^QNRt׻`4qUKgWzovlHJ\4jswg\ vqS^6ZbLj,!קF`ɖ㳵t*Ov6w7 f3 C| qs4!A 2ɄZRZ;g?Q̔BȬ IDATTro>^Dz{^])?Z֕`Lf3 _'php1YW iT*B\H+)z+J0LI5~N:|t{!B!hKt`5 pvbĵ֬i?:wzyV*g29pp2SUOH;YFa]lfL\.l&˃G:u@ge_<Ա=s/e%T*$6|8SZʾK=GB=G {)8kgk; 6w7**+E~NV(|}?*Mev_QU'g'K *%䑔Gye%N:vhzu f/gj߯&ki1C;xz0χ< Hܖ U#uZ\ϳ甯Ƕ d>^B!BQ+p`$)'F.yɫUnߥ>8+EJ0H,2S+iT*y|_pٌE[r+1}*؜<f~((T 8z{9U\BHNy{Y}gK;T*\ |ˑ+ff3._:^Nj5^+,s"KHaUʯ +/Pd4p㹞NfUyK(4Xs.J*ݪ=׃B!B5m:TRR¾}طoh`QԈM2=9< 73M~QE)LLGW*f̭8\X5ɩ)HeJqcWVLK~{ϖvM˵vH)\w=z{qh0l'pUlu™NKg׮gye%.WMU-pV]jq 5UVqj*Ӎ5[!B!hT^~單UiW ¾K*.ʴt v=~:-M._6YEVL ]潐ky*ǻv>f3j ' .7N(lb5] 2T&ʮŵ*WѹViM{ggkKz׭.z??m7'[!B!ht`5+4EL+!n(1_Q1r(zw 'LūXB(N:t:4_C⋌u&{VuJEص L}3بΞ㳧 Xk{x誎Z]l_ hT*ZA"U^ԒSlB!-R :Jmnۋ~^lKZ?tꀓZOEŬREFvl _>Zj 7T]cLg2B!B{H`=~O޼|^ :#͍.2j$ O{j$V2׿:w+Y y77#[vpgr(24ˮZM:jI&S[[!B!hZܤ[T7Y F-Η]i1hU*]~as-qNy`F"͵&{tV]5j<[RGK\:73[vqY .k4XJ/:ή.xugWtv|Y%z=!B!D[ԦKAAA$$$@\\\2*ݵ֨ޞxQ=UHEh feFZhc5u2S%*>_?]zUy.Mu$qu.) S;g+)P]PY}k}[_`W)5ШT<.\5*\( . _j{{pJClB!-Kz///T*˽,ƀ0`MRU A]{3zth:eVT%;;1KGTTM:WԒRf3. u V9 ebpfr5=.^Jv=ck۔l&Ӄ];ۺqQCzw\QÖ㳧0]wzyT*= تfpS;kIǘvL ~˓qInj.j)KsSzB!BαOϞ=k-gxgGMYע7R~.*=q&Jű+EpGrjST\ͯa7ͬ9nĶ\Ʒ>^LhT*~.*RVF$MNuH_KЪTq}E||!Ӄ>TTVb2q;U\″l9>{aGv.antR9դV.Vc~^:-כ|)3P_{˅5\H7;wz32П~TTM&53|-SKys< 4wcm]kLr=z=!B!D[sSn]`lP ^k5 |ݹ޹2)\5Ur`gM+Rvc%ͮ<.UTp/\]ЩTd]-˅$318f3+Τ3">^:9Qn|f0' ՜A\ti)CNF"r~**+ve˯@_o|t:JFɿ̶ftic<;cWK^:+OE|wV.rA~>tvuIhTq _\tus1]!ݭƲ!"{!B!hKTڵ9It"׃B!BTs,섟&-4PB!B!:w ]yT=D?ڥjdꏸ B! #9j(_o|1 8Tx]K|QvY-\K!\B!B0^+!Z JZNF"YI$*m\B!Bqc[؛wTb}k#B!B!B!$B!B!6B!B!B!B!M$$B!B!lm ZqZwɲeZFB!B!D"I$''sٖNa0;t耿 v?/ ~vv6SLi !B!Z ,bcc "--MKͨs*ϝ; &`lψ#O[65xꩧڵkennnt֍nݺ1n8ϟӧm3gPK!B!@KBbbbj8pԖh8pG!++|݉GϏ%K#`0ꫯ8p@tvv?Ņ۷7ס!B!Z3vX@F+_,??syh4RXXX6qqqʕ+|7MVw!B!D"&뮻 #((NǥK8|0ׯ'==FI&1gΜZ۲0/o>շSNL2H)//lݺݻwc6uOBB&YfY 3c yǸ|2`yYlQQQ$$$0tPN.^kF^^/wqټ>|X)ɻyӧӧOa+G[guw}7Ǐ[nz\Bnn./h1cƠIMM:d 25kְr:?_~=-Z-SN%:: ٻw/+W$>>޽{|rkl+0x`>s=CHHf/>F9G=~g :7<ݻ1MU=!B!D+#&b6 &88QFxAI{NٳF 7?>ZVezLDDdٲeCHLL$66^z\6Э[7OlfٲeJPb1{l4 ]xb.]DHH&N:pBbcck nnnD޽ݻ7W>hiDaa!NNNtޝݻABB j4i4lj_~TTT8q"=z@RYO[Qf̘?\cYݹkmV^ 6mM֭:ر#}ipB!B1XjbF]v{n;Fqq1P*iӦ1a^|EN8<}W5׭[GPPWnQ5}ׯ'??gggO?ȑ#9~8r۷/aaa+<> ӧO~য়~j١CN ʕ+ٰa2dTÇ@NN{C=D~0$$$k.*++4h/2Vik;8J݉d޽lܸ .J 8CVjQTҷo_{1*ҠXF+9s_~B!B^ꖮn˖-+|C4T3Njj* 4k O>$j5k|IJJRA=5 ^y˙4iOеkWN>ͿZݻHNN?3| \zCйsZe+++Yp2:tJElllϝ5^zRe͚5Jp ''D> 6`2qXvӖv>gΝL&f3cʕuXl޼ p8<6mbѢEzl/));wvZ}Yp>lzE0j(v: !B!Z7 ,5טf:uj*FXX&[]2R*88={T*y ĉ`ɒ%}祠GX*{ Ξ=[kΝ;8p`ӪžyU*Q]p7 m6S[iKfcٹs'ۯV?sDo>Wn䧟~̙3 Z_|a~B!7' !22V+xBUy.]Zz& FC`` 9995>ۼy3oRFbıTEaBYfڒ':uJٟe9?z|MlÇ]-[PZZj͞z6o6*XEQQٵM;_ȑ#p=G{NN/rꗒ°ah4k׎#oJ.neo}B!6 ,5H.] 䐖VСJb Tb"""n['''?ΦM܆=kˬ+y垞v9yyy<3S rA>F޽;}h4qF>ӖvT]Z%Gk{\xA9a2`ӦMj*8sL90` IB!h$Ԅ, ]\\y뭷̬μy;vӯɓ̚5Æ zT׮]XjҘMqm=;wTFӻwo{{yw(ItKcioh]]hH" {Q2221b111FFo&B!h}$RӧTTTpZ`=Ps$4y!!!̞=ÇqvvfJgK=mmǏS\\Jbѵ>Ugo "!!\ECk[2h չ-RSSB!BGKMѣ ygi,O*AXx#KaŊTVV2h ,YR#y?~rQQQL0ҥK2 >=\z;BVh"e䇋 f͢_~f6lPgYK䐐ƌc5aa8q"˖-cذa5=uЁ R(((v &?ѣGt><TVfϞ*3v7 $&&裏2l0%HԿfΜY4,[ۡ:777 {cyꩧRٓӧ|rZ-& 2JB!Bu ]|UVO0bΕ+WpwwGՒBff&Ǐw;7ofԨQtܙu֑L%Zb?u=p1x`իW1ze#G(_sݰvZ~һwo^|EϟlvyERRC aժUF>ĉuMKKcΝDGGǜ9sd:Sֵ|B蔨(eWQQjwww*ꫯ 8991aᣕN8AJJ dL<ɄFaL&%`o=i?}E(..`0áCprrw޵v7111XRSS~Nh4k.I!BqsR[v-3$%%Ȝ9snT?CѫW/:v쨌qd2;vp1&MDdd$AAAhZΟ?ϹsHIIaϞ=@Ճ/7?3k֬=7{=OllV+G[O2c 1 -(--eN###Çn:Ο?_k_FۛޝUY8("+*J憚K[e:d9:-Sj:3j3gJ+wp 2s-A 7w/'Pvv\z_\:늋IpDŽ x饗h۶-$&&~z-ZlS8 z3f >,]tZjdΝˇ~gVY;wdܸqlْ`|||&==xˉ6S.wիWNի>"e|@hh(saǮ/g\!5j0vX~GG#"""""P%RM6sڵ#>>4k֌CIݻwٮI&Z OOO∉aѢEyMXSbjѢSLɵ<66qƑg;ooo5k矧SN="Y98KѣGyŋOٵk ܾ}~iKj՘4iÆ b8 zx">(st("""""""G!Ǽy/&66'|Ả'l?q?ܹsL^ݻ~:?8*UӜ;wFFF0o/_N||M#G0{lZlI͚5͍N<ɖ-[.SwL֘rp$"""""""Keȭ[ضm۶m{vׯ_g,^"+y*V۷Hi޼Q<66ш^$-Z@Ξ=DDDDDDDJ1%PR%6lHZZϟg߾}|KDDDDDDTSbI 7ndƍCDDDDDDLQ%)%DDDDDDDD@XQbIDDDDDDDD D%)%DDDDDDDD@X1;:PVZxyyF\\;wdҥܸq흝޽;:u" *ɓ'ٸq#[n-W#"""""""%zYBg޼ydƎӧs=iγٳgSbbbh߾}l_DDDDDDDO#ʘ3gΰg8@BBTX Bʕ4i/"F;Opp0,X;vp5|}} w_4iРg7d׮]s:uwΝ;kF,>*9v1JF6e˖{RIDDDDDDDJ'%"AAApec7 ::!HKefɄ͚5cС@vRiƺuɉ4Ξ=Kxx8VZs)V^͛rDDDDDDDRbjѢSLɵ<66qƑf,R p:t(֭[TXMҴiSBBBHpGo/,P^^^>ٌgF)"""""""K$j׮m,˙Lʳ]60)uXz`2e\rGy$vժU ==ׯq"""""""R(TP\>H֭8~<++;ww~Ωk׮9rbϰEDDDDDDRb eżꫴjՊ5kK d̙f, ˖-ih", kFPPK,)%"""""""%}y{{aS;4NʩSl2zh:uDNHKKXoaǎEի]YJ *ТE ZlIpp0>>>x{{N||DDDDDDDľXA%G5DDDDDDDD@XQbIDDDDDDDD D%)%DDDDDDDD@tW8)XQbIDDDDDDDD d );xU._DDDDDDDQ%Ӛ5kpww`ɒ%̜9HIKeƍqqqɵo߾$''; ")Kz1cr-߶mƍs@D""""""RXz'i֬חJ*aXHJJرc]شm^8p`Q^l:w7|MvO}"t0ܹmeee{ncpƍ"i<޻w!P?;СC:tP!H R~ݛmSSSP12Lh@˖-8~8W\v<=z Zy$&&@ݺu8K7oɓ8qd_'۷gС8;;O9*W̴iӌIFVZ8|Su֥RJԬY5kk.%"""""""?\nܸ xiܸ1)))乽'x;33u:Ə?ӧOzjbbbQCEeر<ӹ9#G,$22sq{nÆ /_ qFFAÆ 1L߿Yfq\m+VH~hݺ5+Wׯ̑#Gصkĉi۶mq?y| nl5fY͚5dfa ;_ڵ+!!!2rH>? @0a?Ͷiٲ%-[$<|TСCJݺuUV9s/// <}:& M$BCC.\Ȝ9sl@m}-Z5c :Xpuue,_xʗ/OiҤIs/+<̞=.&?b5jG}?thd3Çg@h y f͚E޽ﻮ;O>8:: aQ3m4Ä X,xzz2`ϟӍVΩ'NwAV;FTTYYY8pSNYGXY@ڵqssyٳ̛7H]r%׿8q)))\|h>Cl_%--ͦ{bb"˼$}b'p- {zfV(1#Ð!CpvvF<3b6yINNfwmNrk׮-8Ӊ!&&ooo:vHxx8]rfOAL,YH9vL`@vr$((=zUvŞ={طo]jcO90vAYG޹sXf;g#뱩_ɉsy. """"""R%&tMΜ9d_ر>(tE>\,^JLL }45oϺ,%%8nܸa^#̙Chh(@N:Sˌ3lFSVVVd6g }||e*U۬6UA΃Haoeee~z#*.JV˗M6tڕf͚0dqF\\\l*^η~ [oUwO+ qqq :Ӿ}{Uhh(3gd\~X,vd/:HEDDDDDD&v䅳3믹Y֭[FŞh޼9;wm۶j]xkײn:())ӧG#дiS:vh$===۷oZzu~ysUU}_b틈؛CK+W&999gff٣:t`<޲e o߶kÆ k׮yXj{W~pqq!886oLFFF;vOJJ*~)++syVZŔ)S ^GӻbFU_rekpqcczȳCvʲTqoߞoÇGjj*>>>tޝ=z8q¦UP8-_~/_xȚ5kXn]# ziӦʤIxw "--{/W4ӟپ}yuvv)0}aM4mڔ5ƛ7ormwЁ˗s ^~e{S͛7ӫW/ {4ԤI裏8{?:tO>5n5xHp ]﫯syipO.;Y,{V^͏?Xyf37`f͚Tjذ!ÇYs_퍑Rׯ_w->}Q ۷9~8IIIL&ׯlypuu 22s5.\`$ *++cPF ,Ybٙ =qWtVXe֩@XpBZha35ٙ={kO{?㍩+V3dVuc.^Hǎ]6+V{m;0tPHIIa۶m|̞=ۮwoO<]t~x{{Irr2III۷۷s8-իo؃(7n??~IYIdd$۶mcܸq HDDDDDDE 'ۗdF#eA=3fmDDDDDDDD䡡peؓO>Sw}g׻ézZѣG7%DDDDDDDD@4NDDDDDDDD D%)bbbqt"""""""XQbIDDDDDDDD D%)%DDDDDDDD@XdgaܹDGG;:2a̙Я_?GPgÆ #&&'S|MbbbhӦ=3f 111o߾x1moC7k)xwꫯ"&&///G%""̎@+440U^^^Ν;Yt)7nȳlW^tؑڵk9qk֬ajΠA@JJ III$'';2,)cJS? K.:u;ws Э[7^z%vAFFF1EYjՊɓ'Z~-طo˖-#>>^zz:4׬Y__N~pww'&&g1{++3{qT?+*U777n߾ӧIMM-QNDD$X*c^}UlUP իcǎӹ֙6m 4 33T*Uc=c=FTTT_lK#H̛7,G$eQAիWp႑*#Fɉ/q^xM6NϞ=Y|y1EYzTP@ٳ'Kerƍ5x}:QQQ޽;ڵoց<<<\2J*I(L?[d K,)rSaaa\r徣:V^Mxx8gŊz?< L&*WL-6l*Uwe\ta>4jV?+j׮ }TRO5ʘ{3gcN:Err2.\`͚5j`͚5YH:]z>Zn]h:0)JS?ٳ'111X,|9rѼy ԰ IDATX,X,222HLLdڵnrڵ#|~~V6TPk׮98ӈȱcHOOŅ5j>UVfv<$44___8}4Wf͹~}wss#,,'xuRZ5\\\_ٿ?/ܹsy Aҥ իWڵkl߾sXVPP4i___8w;v`Ŋy۶m[zEpp1`,\0W^~I]wwwe۶mcܸq<fg}pUƵkضmseʔ)4jԈ3gulK.lٲ)++HnػwoiӦܹp8|0PnI޽ ݝׯľ}ظqc)9u^S/fمzcȑ{;رぶ_reuFŊs=_E? eΜ9ܹÇӤI9}4| [nkLk  ggg9*NDDA) ˗/}hRSSR Æ z?K:n]J}|ݡgϞ\x#F?˨Qx'ի_{#44m۶l2bccqssE645koEXx1ɸҮ];^{5tÇYj.##M6yf:DJJ }^x>}osd{4iBZZ?bڵ㭷ޢ\rv?={$22_dߩO>x{{۴رqq3|,X@jj*իWg̘1hт~\V>}{^Syyi޼9L:M6I֭yw5К3n߾]\/Dquue˗/-[R|y5kƦM-Z|\#c.\`s+w>όiiiDGGc6_ʠAlڭ\+Vorr2iܸ1u֥u֬\>< ~͗o*U?>W|y+裏lc̙K֋[LIHHwe…TT޽{駟گ{~fs#**xnǎ̝;7)"U~} A%''s*UD JeXl駟橧Yf4k֌+Wn:֬Yŋ411b]v:}6lDRRϷK{Q gϞkmٰa=e_MQ3LƏoTR^=7oNms*DI&}LDD4RѣGy7_r=gX5k__]\\bŊoIr\ϯH'|siu֥nݺX,/^䏟{Mĉ@TƍSbEذaCvׯ'33>j 222l.~ի9k5!55H =ynQ=?5jYYY.$uw+hY1)Pr1MF߾}(1VDD4ӈ2jݴoި Ƌ/_|s}ߧnݺ̟?h~Wj׮СCܹ3͛7^[vrQZ'33YkUZVUV%""PjԨA rəT GFU(ƍ$&&*_'Nms ;~xXU[ wzQĕ+Wr=` U]߸q h"--(Y&ݻw'<<0ˆbE;w2uT'}{Qpwwg\[/\OOO n:6olLͯޯ(:y$C*Ut]>w焓UT^RJܺu+_DDDJ:%8B\\˗/g|g3_~Ŧ& f6ub?o_x饗0a^c˺uDH^R!>>XQwqq!$$/_;44˓ɥK8skp͚55 xxx`v]Kֻ&%%廍5L"l6"Q=?`^8wTٯmƌy9s`|o'..-[PBzꅳ12^x12bZnmL%90˗/ Ƀk׮w^֭[Ǟ={?^r͛7m۶N*NIU\n19{zzr%|ZPT;wo̜9DDDJ%"qqql߾N:a$iܸ1֭bn:FE6mprrT'ۃ^矍:Q\9Q|y~>\$FMϞ=󼻘#T};:3ύ75.ݒp%;;w{ oӃ "==;wp>oΓO>I߾}}[(cdjƍiԨUVCtЁٳg?k]ԩSyghܸ1ӟ>|8vbڵ+Sr.~v//-CE9R Rj+""K눏ڵkˬSN0)euZ@դI|||sǏϳ0uPN֑J֩&yT܍u3yzn3##ئ\؋&)_}Eí#rNg2c """2e ?3>>> 4/YfѣG9sD6gsuTϭ[~ωm۶>DDDKek[^iݺ5`[T3痻\L&;wk{U(Xɓԗ^z,WZ5~ӫW`ǎy[b]vVZ|\xј;k,#rJV\yAqSU*::mg5ˑg%sBDD4Sb ٹs'ƍe˖ヷ7dzo>/_-|ϟ?Odd$'WWWWkײm6*ɯ 6p!Ghh(ժUl6sΟ?ݻom|W\xSn]\]]9w,Y#G湯;w0zh}YtBjոvk֬O?eʔ)E͛w}G߾} rʤqq~, v>}5j111L0QGq#Gү_?y5  eΜ9FJ筷"<<(&OpDDD E5DDʠGy5jaLO;w_b28p}L~X,| YĮ_7mȞ&\JRbcch޼yF퉈J,RYfFN*77w+VO={G:PfM֯_@c)nѯ $!! 66dyH|SJ,Yœ9s9sM+B5DDJ)'''wN !!ЧOf֬YVFF?i޼9UV\޼y^ЯA(GNIIC SB=L:u06?J,RwaΜ9@ժUX,2fdd`X]6kצK.+\t^̛7|z*.\0yqF25>}.1bNNN|~}UY= A\xM6NϞ=Y|C;Rb9s {$$$LŊ aȐ!T\I&/n=z4Bƍy7Y&ƍcȑ|u"Aʕ~$Ȓ%KdjթS0\rJUY= V^Mxx8gŊ/""""eKe{wkYrr2.\_~aʮ]Vmڴ?r!}fϞMF !RZ:0ӳgObbbX,ExKގ9Bbb"~~~4oޜ{::$%"ǎ#==jԨa,oܸ1& .[GĉԫW֭[+TM6,\O>zԩCVVZ5kش{G8p ӧYz57o5͍0x ֭Kjpqq_e,^s  K.T^k׮}vH=M8mZyU^f 6[{}ШQ#=s ^^^@vBA@艜:{lB ԨQU5*yȩ~cNJ$Ƃςqrr7߼gRA|UV222ػ;ٲ'd'@ lBQZ >j+)Rxaik[Vi}?ۺ";n,@X!!dOf20LfM&{9;4;|χ~>f˖-5\{%%%!A˗cĉp:۷.b[N\=V{9焄+￿֭[')HKއ~B![kllāz=mFD"HvZ,XǠR,s ΕlKw`@fff@< ,RSN?<N@`83f ..nZL4uTlܸO$$$;M0އ KKK]UB~/_DqyDe]z? *h2祩 0L(,,d`h w9x ֮]'Nl߷o|>`…a&M\T*Ppo[}yyy˃/`'555dNoSX~?= ເ$je˖rKs NimmmB4Kw `Xp!__ ;.V9ڜ- 0ZFFF;wbܹJHNNqM7?ةǶm0w\Xضmn7N@/tvػwo+R|><=z!J*nOLLĒ%KP\\h4ZV9++ `Z#kooG]]]Hbs`CP0O= ynժUb7F *lvhhx04y^TUUaƍعs'6l؀իWĉ8xx? `͚5Xf߱zj\!_Ɯ/#r9&M*J> T*|>V+g#-- !z=\`i0`~`I4Kw]tN'J%/_m۶2Xhsљ9 ۷odɒRKK ~ӟ⪫œ9s Ӊo/mw}}p5k>|?O}B/KT*|WxQSSr=܃EELo >tގx1wT]]իWCaa!^g?1=_gpJ| ,c̰}N/rK,L4rWJHHP'l6rW:;;Î N*8R)8e+sqzL`n-ڵkQ]]X~= l2kϊ/4:<|5k~߆düyO}߾}pjXf8ETbɒ%Xr%v{X]n7nz뭸袋 $ .r-C{gݻٸ+{ EsoFM#}^zCf!==+W )s6eǏ='"""s,2FK,s"ut:#4dL&üy0o޼2~/x!i3 ݻwի1{l̞=xj'ĺuh"|/Ħ?τ ̙3񐜟Kg}xӦMCAAf3F#n7_cƍ p"-- Zطo6n܈ љe߿K.Eqq1 p)TTT`ΝOBDMM :AT>^}Uu]r\{p 7`HJJBkk+~m_?>?IIIa CRyQSS. ┭Hpmڴ EEE?YX^{aΜ9={6֬Y+VŢ?H}΢a0P\\ ǃ{/'"""#$''sovMsvd  p 7vDkpwc֭=!"""b%"Qr^ 8!Xoҥzx熻9DDDDc ,"oqW">>~CK/iiixwQ^^>!"""c%"Q#LD444 wcӦM """"̱DgX"""""""y8bZ|ATvڅ{7ƭъQ8bDDDDDDDD(* ,QTX""""""""0DDDDDDDDDQa`E%"""""""" KDDDDDDDD(* ,QTX""""""""0DDDDDDDDDQa`E%"""""""" KDDDDDDDD(* ,QTX""""""""0DDDDDDDDDQa`E%"""""""" KDDDDDDDD(* ,QTX""""""""0DDDDDDDDDQa`E%"""""""" KDDDDDDDD(* ,QTd""":;IR|Ga۽^/p |'xwz{|>qEee%6l؀,\tE3gNRvv6RRRPYYM6aɒ%9s&|Ɉdeeaٲe^{-8Ӊ={`Ϟ=!HRWԩSa_N\.\g^W엺:l޼xꩧP(pGX3/>_CDDD4PLMDDDQ jZmQ9wɓ'ЀdggGW4Bj(ֆm*֭[j""sܹsc~NBD,^SNaǙL&7^| `׮]1sL!'''`0Avjx^w c-33 /Ccj*Z*dþ}/cǎaef̘Dn7nL&SSSşj 7 &#kL&'? jo7o;n8e„ ^}U7GFJJ85m(,[ ,W\ Yp=DL=\Q%"""ږ-[T*qۃӽZ-lق>@(Jejkkş7xP^^.Zx1Lvrс`ڵZ3gڰ㇫_ʰMDDD4n74 1c\.Y_$nkkC\\Ə-[ m/ΝY+V)qvׯǺup7c˖-lΞ~ KDDD5AV[رck0wܰ{1^Am۶ 0g(AGCrr2A>CA-BDDDK ,QԊUN8 0N@}}=Koz<_UUBǏ'@PGAAJ%Z-&Mu։dz>5kN=7onNs- gH$ ^J1v""": [%"""9n}DBBƎ 7=ٳg ̚5 =}P*Xt)͛y慕=zht:cGEbb"N<.l޼?puO?~),,ěok˗/GEEE_FDDD#h@^/QRR 6`8tF~ݻ,yyyHLL~ W99#>3q Hd2؛[PYr߼MU!u,^ YS&݀ !pZjԌﭼy9ho>ʒCa4&cʕ Q4Z ^ '+p࣭8ٗ=ʝ^]L(5tl56ALITU`5ȻpF#l8z-ްxhB'yT&ÔW9O'v}$057Pb`, ,I Uz@*!ylh)|]5UVy/klKK/K/t!)Dwll]a石z 1ib˘t^SVbO+dyƥ\FZ8C鿅5fz>vr$d!1' J>e >gD*E\B<.Xz5T:>}25ARYLտR<.TZ-&^6)c{ D[>D/DDD4X"""@k2"9/'69$$Ra؛QoLşufn<\bNL(DWoh\D H_(xqd8>|N{@k4`51Xv-W /?7~0Ԇ8Ck4po׋ )H)+ZJ?_ټV ]0߲ D͑'b]$/ſ^7'yLBwsfǿ5ꎗAg6[!wZ1\ol%[IyK1E}3HӅ Ȼ`R<墽X8Sw""ш%"".ϟ"p>y/Q4Wݻ:l{KM-SblQ4[7t9 T׆>ƾ? +ooiŶ_Dy@v!j7lM-=Pg/\ԩ`LI)5E ,Y#;_{3$qpxd[1e!L A`kjƮBaklwޏz!S(ΟBsuMf|̳ȕJ?Gv|1:&]6ſ_ v식Y̘솘]~L}މF#p7lT&ԟ8u;7*bgܝW":=~?'NLa;ZAhmؚh lHʀ7D@pĐ2 *%dJEIJC1x@{nHJtШqan/>E[n0!LK$yn IDAT'""8b(]]5MH$'#sD\j,ɳ',:[T_-t1q< W B1nɨr?O~]y݁ӱRs~W|>H$,f74<. -1ں;ZA3J5:#:mN a -7t&%3y'""X""": |>YQ~aT%jZ~7h<ݐ+holDJqT!9 : R4Kضh(@`q}Mndy\zH'&5w86T;Яk)H?\ $kl9mah >~!""b`(i,„?=eg:ߵg`rh:'R r{@>Ko_t4G?/ÿsxgΘ|AoA ?lSuTo\!KWy'""X""" cR$dˋ `JK=uVy xOOt Q.:iPvˇvˇL\H-p1iqxL}і}.y'""8(-O}i|2<9 $G:@`UD*Er~^=v@`x˘g^HrďIyϤS#8+N%)y'""X"""܌c_ bH3 g=-9a%nP\ ̸~i8cJ*tRY/%;P>|.9$}m܇6w""ю%""&#rxRzx̟q7"k$5<6\w >HdR|>|僘?ԪB N )p,GL/#g| 1?B,:̻}EH⵫0b; m/; ^G7KwTA"`ƴ}nCy'""DDD\?EZ8|'1?:N `{\.|P"u5G[;uP0{g]N R GE߻4fuV/v3rMAδ)p;yPj4q$LB֔IA"B|xbh\~K\-K~.؍>,[H+qbq|ukIy9aE[.0܆NDD41DDDA$Sk'1qs1񠵮>Dk5u){ڌ6k=&2$df@P/nQ}:Riv477p\J0L̄RsΈGXoG ?h {ra׿&8 cK= TWovѣ0LPTX, PVVǴ> rf#bL&b,]GHLL`޽{. ^gMMMX9ǃ;vwsiRwIII4'<fÔ)SVa6(X?h… 1a<Nfd[60Fl 1ɠlc*$txhq{pfǮVT9:CWJ$8OCQi*%JdVlv|T߄E 'Xp\׋-mxΊfg4:Q tZr~T9:Yc3 pP-s &ڀjb3RUJ4؄ϛZB sdy L7aVaxm[;6Նu]$ۑw?<j4d[oɻcalĒdN~P ެtWTaok[H9 7<~? .7#CK&#nHON*yZ uxTU/*%N~{_m+pYb3̦R4} Vd"WJqŌlO/D, 5j@]vF;FXr8`3ViӦꫯUo4$ ?|t,r;v,xF Nkkkk @2ى 1WS_%x 8K8ʥ;+^kFrr2'^2 FFxnZbd2x<H$1V [--pXhmm i[ T*;C՟j ו^p!$J}1CVCV#99|7Kwq {32DLIP*0tPiS[IF z"LҊ=-m8n pYB<.7cyF;ڥ|^V~iL=LEiqcz F|Ј6rAdcKM4'::9}4c*uڎmMv:J0NC~h/pyRr|>p߶FMoc٘4ȺLWu@]%(ᷧG*=[Q6w+dD,8{A{{;J%Ǝx"彺yyyHIIWzP*ΆJBGG"֗\G;*jjjP^^HZ4q$UhZ10=f4QPP ?u\.$ 0vX$%%5d*`PRR T dff"##MMMb @HnR3fJJJzlnGrr2ӡh=*VzϞ>#6W V(0L(шYfA~:p8P__ TpX]]Z[[6) dff"-- w Q҄ pW`޽ضmp7'4jZo ͓vG;=‹uۃWk"MDQN| .9ػu }$Ꚕ$-l2cWs+db^xa[c^:YvF{} " vm}h[`qMJR`$iϙT*EII8"tØ1cR) CH * G~~8Z񠲲'O#`0 %%---!J#iUii@ 6 ! Bتl>uuuH$(((1cz 0y^Al6####$4@Ӊlz18z3AwJ& 'N p8PRRHσZFFFo߾ifQUU1rp1 t:X,GDDDD#6$J~O=TTرcuCݧWJ%PH$NX?TJ$)@#ͭ}Wi*%*~|\VimǏҁx&F9>k |h[5GxOEsruZN߇/_6İ09xߏǏ!#J$ r8 +A0vX~*bL&ɓ'{<@(jUp){ߏS"ߪGAAjv1Umm-fwi0+Wr3Vp\dBzz:RSS<[b@P'mmm8tGؾNzh4HIIAZZT*Əz],{C|D"""s݈ ,-YشiӀ^Zbܲ( בHpWN&v46ᘭ# sw&Ǜ1NE.R*EPJ]4UV3txhra6-&t ۳2zlD`RD~ovCGg^@C S {)=݇.Vϙ I_єr@%ӫT*1at:TTT. HJJh޽{CΝNꈁ탞Bv'N]5SoKwE=ӵK$A%fd2:::p!1HxPZZ Nш! ,՟= Nkll3y{SSn*lFVVOG|itnGii)Ǝ Vx_bqߣT*.hpF_W Xbl6֯_?n7UYSQ#[XH _4p{VN۳@!AuJB\7힞ytgOq.iXq-ez07)>v#9ž52ގ:999())xʂ )I}WT(**T*Euuuđ)Ah󜑖?nȴHN3xV+F#=B*g$ fs`:@v~8TUU ӦMCAAv{:UWW###JfY ,d„ Nv]OQڨO"""6"Kwqj5~Any8\Z Lr9 b4`cM>o IB"v^EcS0lށ*pҁ7 }Fs6W^/}xJ(-- J%&MR 甭vٳg3 O>iSp } gW)))n} &NJJBzzzWlP*bI$wyJhjjѣGdAHMMe`(Fd`)55rJ\{9/gy挴;l;=K{`[CǨUXeS :NӞ N.ʈyGd=Ea_pڜq.^`CpR$ʍv9不D @PtBR$HzwӦMX)r'NZFcc#>c`'X@V뮧]GZl zؕ` ?# N1v j9}  |>JJJ"&?Sm!""": QyzHe/˧k)x~^ MNW`TQm L%T'1\Ut/ghoG .iR'LԵuԟJ,_B&0i$hZ477qJRV:)])Cz y~?fڟs I!x}`8A%AB>Qȷ;S}EEEx'+V5HRRV^ M>ۆBW : / $!zf 2A[YfS {^R .4aTvvӉTz\ -QfקF5\getXhoPZ"t44>Tͧ\%1j&VϙJB~~> p\v礤$\Frs ]v<{<q]u_N*:mmm8p@AV^k4z=t:]X`466$ЀT*Z[[cR_4]pf5B: <zt1ݿY|NJ%$Iur9G,i4L6 ӦMäI#ˉJ%IM`:0-=$jbO2p!.W ܜ)B!.wC%TB"x3MMXA''|C8uo^EI=6(N2D+hݹY!=>RI$8Oy:-v"}ȏrer&}1ONk.Gl`GJ}bIRffL~3r.0fqZFaa8Ң2&uz^8qqeggcر6D" 8:tr_tJ4448qbĩV!۷?!|>>\tGpȑOj=M\FYYrrr{v!J!HԄN1G#KgJ,JJ$C2)n|ԂqsF?w68*% U58]8jG :W$..7#M\PĮVlmhµIxD9'X0dYlmh¦Z+9jn\b1@I.T`uPt` ߴoQ470lI.M-\gO3%)KY>S+"O{/UV&Lr9_6B`utt`׮]HOObFD"fCMM{,>Pp8HOO^D"AGGPYYk{""""9,9|=s, :;DqI LB!B!iX8j4?M<ܕ/AikJ|3bX$B!BKXi4Dz"ҫ%%d'h̿˕uH!B!iX@\Fu]HqI I;qB!B!_2yC\>?gO !B!x]ve˖-L<&a/:tH~BU̟,UԪn" QQʃ(+,,6mO<'dffk.kn߾mо\\\X`k={֒BG@\\~~~={& K>>>t%KXUr%ܹ۷o3rH#GҫW/3zFu\~mUn[n"z*QQ]ʃxЛoIƍuLpp0=z`ќ>}zהF%!.aI{} LJN>ڵkٺu+%%%f1c]nyEwak_lg.>KϞ= Ãׯ~6o\i 2dz)9s +Wd˖-:iD8p~}'پ}Aqi guj]KW +Mqq qtt^z׭[7BBBHIIƍBX4,YK/PGII ӵkW&Nssvu/7o#Ν#''GgmNx[;gggf͚E`` Sn]@oӳgOחh:uDRR?Cx qL87n@qq1 6dtGf88f<sV 997K˅ tΕ Ÿ'4rrrprrI&4i҄5j0m4֯_> rssqtty4oޜ'|ʺׯW^ %%˗SPP>EEE)+ dddSN€0`cϞ=JJƌ_M]n)ZM4!,,;vrJ.^+Å)[KLL @iﳅ rUSppp`Ŋ:Ss?溩յkWΟ?ĉ9}4 4}?/Ri|Bm|z+KMk(Tj,GjZ͙ưF[_J٣wCɌ3*I!Uv@uf&Ȍ? @ߜ:u gggڵkgPקO/_^P6-gggƏω'ҋ?O޽=[Y_{3}vRRRʕ+77o}Z)jZgʐ|~4 qqqĤƧ9%K^ՆSMr3g9RnQxx86m"--w}.^Ȼᆱ^|E<Ȏ;&! a*&\RRoPz$00\ۇ!.\,773g,"((kזW~~2?O?]7oٷtڡk (( Ylk{NW:x޽ fޯqYŰ0+=͛)**A4o\g`7nLQQC2$BBBQ%%%zIKK=G[Pf$S HjԨAQQsέpÌLeY2M?U 9?kܹs|gh4}:v+½{4i O{,رc;w4"""Ln7%>U/Y6j]ϜH-C3s;wعs';w||}_xoSRRReBT'2 |}}%,,zV&FO&j͚5=t/]}U;r@@_Uve*6H{)˴׎w>ܿ)STxڹ*_~>c֬YÁ*<Uf4h<ڵ:3|B;ݻu1$|ItUZoիNi+j^/`j~1ҬY3~7scjd,sϒnJinY7V^G"##}F-^76\U/YnJ8Mw?s# ̑׮]?4*|{cǎ\ 4 .66'|kVx$Ձ4,YXXXSLŅs5Ξ=u_>>>>::lI&nݚ"V\i6=h߈_5j(ݾ}988sQ-Me8JoVEr5ReeewyGtJ'Q޷oׯ-^E^v6֯_Oԩ(**ޞN:7|"C͚5sHNNNkX2%]tB*ej~11uquojd,st9s޺pΜ9: ;?k:ԩSYt)NNN=zUVUS'nUQZvy͚5Mj`0%>Q/Y6j]\gAiZff&VbϞ=̝;DΜ94שS^{\ E!ӚQ i'tqq᧟~O>:5*5׋vޏM6Ysփqz z֊K,)oBCC חٳgW%ސ=?3YYY3ϰcé]67odݕtx0Ɣ|on5_ &^Ԥ9gtƝySױcGǒ'-jzɜws֟럩Ɣw[]OΝU+~C{f !ģN,e˖xyyq=Ə/K|T^=())aҥ9vI{{{jԨmkMEEE&ǫS}X#^L}\ _z͛7Yj<88zPذaC OOOE>iiiߟhvA.]9Y*Ƙts/ΪZVE-cE;Ø?]/Yxe9uM?M)ưv=ooPRRiݺ5III 6Lg~@+2G|_YMw?sYzTmF)˴>ÇWyXl29BdffEݏ^}Uٽ{7ϟ1NnشiShW6ׄ_qƪaxyvVC&>tjhuIƌCqq1NNN]O;s,RիG큇ʘt:u轹nݺjʭ X'^eI&:1Wdhv=9O֮M=III899j*}.\@`` oFu?F&M.yyy;5<#dhdlbSmY"͘9i!&iX i___{Y=z0 ;w1oPfM^|E+';;[0&&ﮮt@l)N<ٳg>Yf@qqqBKX[n1w\JΝԩ;888g._LϞ=+իڵ+O<K.JO?CV'''zXWΖ-[xꩧ޽; _~+=HNN6Nٻw/SN%11Ӿ}{޽KQQNlgx)ٳMbb"#FPϘ1;w*;v={ʫ|x׮]UH۷S>[\XXG}T ͛$%%\\\\tF+|w6-ZD֭iժ&L 77Bj׮qrr"$$vIIIx{{+k6jՊ3g;j(cLv>U~ڵk&>>ݻӽ{wrssWpnݪ9%cʭA֟eSޭNL񼼼xX`N~iBBB;v,Gljlڴ(ΝKnn._rر 5? Zۛ~W~'oQ/Sn],˘npό9FaرԪUǏZn/ <<8V渟P >BCC),,ĉ,_noLyP~j%SݚtW{˻5zd]vD۶miڴ)^^^ԪUB.]Yj.]2Q[n޶*;;;,X@ YfT%;^VXǏgf ё5kV'̟_}cfۯ1'RZޭMYf̘AXXsaѢEYIWBCXoߞ cy/U挗5k*l^v{uԉ5kî]*\RaÆԫW"K8 O?nmO{WBC ?>'OT&GGG =999#6m z[ΖA)mh{o]z/uuueÆ @DW\Eӧ9rX a.¼Pǁ\BXX}+**̙3,YM68dEڵ?M{3gZqR\\ɓ'IOO믿;qt.B#?!$=B!B!*2y lB!B!iXB!B!HÒB!B!PEB!B!*Ұ$B!B!T%Xh4ˤi&eɓ':h¬YHOOwٿKHH =='VƌcxtڷoocĉIOO'!!A@bb"tAV3 %_ k fܸq|W%6` #""MOIAAڵ۷oÃΝ;?`jժŽ{8<;wdʕ,o߾ :\_@vv-% d+,,СC+00.]p)ve?L޽ ==s:8fվ}{zMpp0ܸq'NW_oY֌Eѭ[7Ν;)**H-ʕ+߿+Wr%tlUލr\J:u+wW|'$ K̛oIƍuLpp0=z`ќ>}Zٙgggh͚֬5㥗^"11h{|̟?HCmݺu !J۷o3rH#GҫW/°aðcU2ٳg1zꥤQQoߦnݺԫWÇ[aɚyelBtt4111Zʢ{H`` 111L<23[wcG1_W|f.uՕlm$!)iXfΞ=޽{9x W\!;;wwwZjk7&MbРA`gg3lذs5jժETTߟ)S@qq45jM6UɇvQ1SoŊXRA3"""yfT]9::2x`4̙3Ν;6]hXzԃ@r oooIHHvڌ7p5[󱡦|QF߿_iXv[MFFgΜaݻҷ'Nd۶m:7aٜ9s\FA@@aaaٳjc e{fU}!bbbHOOr%QXXg}{ؾ}Cg^ǎիӦMg \qqW^o̚5 '''vʂ lLJzQגϪ777rrrl!a1rq qtt^zB KKKcĈ@Dbĉ*|ʕ:ܹ?v,^x:t耷7YYYlܸ ɴoߞŋsK@@%%%\toulװaCCXX>>>pi֮]֭[˽uuu%""gy 9e8e80:::ҷo_tBݺu'%%Ŭq`ݺuxxx,۱cIIIfP]t\̘10̙î]2d-[ޞӧO|r "jҽwJ=P?;w ʑ=qrr2ggϞٿ?7olT[ON>}֭[y>}2!{l=Jvv6^^^]Gmy7&H_=}ٲe̞=ۤ6Wy7ݺuݝ~7,뇱D>S{}ЊG4mTu/^\}W/gUa1 ++ܹCqq1줄gϞUH́ҷeϩ1̚5@%.֭K||<̜9baOHH`:˚4i‹/ѣqp(-yyy0VZArrMK/sSGII ӵkW&NXٙiӦѲeK Qz"$$Ĕ;rf^z5lRe5k 8~Alذ!g͍\ !$$y_꬯&ݯ_3 pqttܹsVהry`ō18s |o;d?=rrrprrI&4i҄5j0m4e}sgYe>|>}жm[4Mx@ !<<7| 67pEIigWCj˻̝?kaaaуvaoo_azP*kCX"~={*חh:uDRR?Ca|V !xIR5egg///Zn믿><'T̜8q"4)~c7Π/pe Ɖ'aȑ<уTnܸap7i҄0vʕ+x"ӦMe֭[{d-[Fvv6tЁz.]pQe"l֭[9r@'H^;v,ǎiL˖-)((2h3f NNNfSүg䚓t(KXw)v8q"OՕAѷo__դu.]3xʑ1Νɓy|C_> %%˗SPP/QQQJ㦖9SzAvOOO5jT%&ω! W_}W_}7[FFS.\MmyW_͜ӓnݺCƊ~kFM=UX"i{}ԩҨʢEϧnݺ$&&رc%!|V !ҰTm3ur/^HRRrk}p>l0>J?~r×?Oڶm [f˖-f?nxx8V*ד###CrʗsΝ,/((`ӦM888ҷo_֬Yի7;;߄DvXf P/2_|߶mۨS_PVf̀*Cݿ+PI&iӆ8jlU @>L0#F(:H-h4\~T߮]f '͛7]6͛7+WdʕH{9ZnM֭y&ׯgݺu5B'Æ Jc[uԖw[kiժ111tA-Ɇ ظqcjA+b|eA}v!W\aܸq,^ڵkӳgO MmdPOhBL# SL!33m:vHN(..?~dۡCʽE̙34o7???\onAAAQ\\̲e}v}]U8SYzoDÆ 塡SRRƍmaяSҡ,رczhӦ :CBԤ9Rܹ̯qu J駟fʔ)jՊ=z[o1c u4h@ڵ9woݻ@UV0ȭ[]6^^^jǏ?cǎ⋴lْӯ_?7|Ï?h,YwݻwINNֹvRm_,Ãhbbbhܸ1Pyf֯_ PSUU5X/is}(;Ǔdlٲ8~JL ezJWz' ؅BHRg:vaAX`qsnOݎ9b`WYò԰>ta|Cgʔ)O___bcc ^zhtuwwW}XvO޾}WL805sI~M'OWNL)G׮]+719Ѯ];RSSٺu+;we˖pQҔuKyٽ{7 xxxf8`OROTԪU˜A2HKK~DGGADDiii$''[vbڴiܺuKg)Œ/^L͚5_Y~=[nUJM=XVUD>2믿NR/ZuaԮ]<Bǁ4,Usdffj*ܹsILL̙3:cT^=Nk֬aҥV u͞måK#Zz...˜2e ...ܿk׮qY^Q& QP NNcװdJ:aïʪ~5kT8Ԥ9ت=}PMPPPI;éStiEſ/y7o< o>֯_޽{-~CꉊhTQ~43g-saѢE'33777z聽2իWqpp 00aÆѮ];e(6iŒ͛7ٺu+;v0Q~˲FVZL˘~}qAzWW LLaz^>P>z(f2c8BQIc$33Ν;Ò7ӧOۛ[Zgr 8q2O!pqq᧟~O>)7Q)ד16tm||||SK7Sӽ:jܸ1ޜ;wN!|g[L8Cΐ4hhh(!!!3{ ʔT|VQ_U //Hpp0Pm6iaa!޽{=z{y+HmyD~ uڴi˄׿!C{n6lݻ dj=X5Ye*/渾[{l8@:uhРjB4,=fs4jH5kdƌԯ_dg#~QP-[ˋ{1~xeޏj׮]nv>sRҾE6恪IK7^isrJڶmKdd$>&My\x7o{MVZŪU歷"446lPa/[3sbȑFocggG6m֭>҃ŋ] 6&e;w_0fٸqhnl~^+j ֭[ٺu+7gϞ oߞۓͦMX~},\,ό>hkooO5WYm[EYO۷}ĉy7ؿ2P!gBWߍ3f̠q۷'[O+{{{+(uqޞ-Z[~Ye7Z5kT]hb8;;WtxJؤI˵omFe msm裏q۷O?U?ɓ'3f 899XẶOUl^z,YӧөS'ؾ};Fb,]JZ[lիxxx,7Wy/aEoBjFcPah} cs9s&L:'NE߾}Y`~)ݻwp^55|ݴiS埵Y2s}8s{E]nl]OرC 1Q# KՈF@ڵkŅ>`=|Q 'O*78{{ kL7=z}rssh4tڵݺuV_{X/?- $ c>tDGGk6Mݹs@fi~~~L6iӦh}:u7oboooQ)))!((SN)L F拱v|B)..رcV;neΝ˟g|}}r )))1~xg!ФX<<<ʻZxC͟_aÆ1x`֭[G~~>-Z 11QFNM=&_OgmgZ\9u111quusOQ gU!Uz !DUP}aaa,[7|He͛ϬYppp+W*999LHHOOr\]]mx"~)ߧ]vL4I&f͚tԉ3g2zheÇ),,ݝw}W:Lll,ÇWn*,,T< =s=Y+N@+m4S:tPО_vvvL0A°ahӦ %%%,_\YWm?H8K/Ynnnmۖm41;w.]ta„ 4lP=((nݺ)u5ki{WHNNcǎ:CwׯORR7oVu&~|4k (Kʐ4b~}?Znȡ}ܹs^ye6h4hЀ7x5jhw1( 2G|www|I '|2$22(xwww1>th-g3+SUꫯNJ+S]cǎg"""xWyWڵb*=c곲̙?Xf k֬@M=&_z;is}zݻ3`G~~r"odh>Bo5kJΝ z:<Ç'!!P 9q˗/'==jӽSNӢE 4hġ9hg )))޽XBCCUݻ7m6BCCOٳ'۶mСClڴ<ڶmK@@>>>8::ɁXt)IXXEEE}jUՇ+VK5ի-ԕwS˄ 6l0sBX1|A`` W\aƍY<&mFaa!uaŊ̙3Yf{%cI!">#ڴi/YYYFϟڵkm !*el=&_ϛLx"F"..M21B},ۉ֭[ddd(–_2|JJJr\5  ,J8 $00&OoZ󙵩׆۷9rȑ#իi˗/eaժUB!a9{,{\rliժL4AQXXhvjZb+VʱjԨ76mҍJDDDp͇V2Er oooIHHvڌ7p5ZϬ͔|]eڵDGGիtyB!! Kr˲̙3̞=ؽ{ ???߆!y)..q_zo3k,ڵ+ ,|mMǎիӦMg !B),,ёzY|;a]֭CgL8q"QQQxbСdeeqF.\XF݃V\Ν;˭E=hڴ)dggs/^9m988ХK;2G%;;///ӰaCCXX>>>pi֮]֭[quu%""gy pttƍ8pe˖Uۗ.]Pn]rrrIII<Ϡ4Gtt4~~~cRRR:u*!!!̚5,=LjTs())!==>}Э[7|}}y뭷~s !BK#8::eu9r777ի:;;3k,)..ޞugg 6P4o(PvBsΕ;oMϞ=Ҟ=MNHJJ~0 ѬY3<<<(**f߿! 'vv?ѣqp(ᨭZ"""dƂ^z#F(QRR?tڕ'}vc9;;3m4Zl @AA5jԠW^T:)5󙃃SNM6ܻw^y6mF1؆0%_/j/raC۶mh4] cFF$B!lG);;;h4xyyѺuk^uqhϞ=fN^ϔ'$$0` 6'Nȑ#ygѣܸqCY޼yԩ7n\_ԩҨʢEϧnݺ$&&رc7{#ԩSȑ#899)ݸqGUըQ#ԩ t~kݺ5K,aٲedggLx뭷ҥ GoQ+**b˖-lݺ#G ~~Ջcr1L˖-)((2x3f NNN5YiӦ EEEL6-[p}ڵkLJ~3\k0-^6h 4jHoCB!x|HR5ԩS-x"IIIu;hsvvfJGVV?i۶-...nݚ-[|~}v!WW\aܸq,^ڵkӳgO WVf̀҆%C;:Fv4oޜaÆA~:ÇWT7w\eyAA6mw}}4YիW;fvv6 %((vڱf4_~e L۶mN:5 eL>sppP6|ҔܹZE|͛7- KB!1D/{ql'*׋&77WIsQvnkז=??_iTx+׽{B _999o֒%KHOO'==UV1e6lݻw4iʺAAAQ\\̲eO3Ī!H%%%o@\{yu_aϝS]]2t =bʕ+[-oI4` 9s 11m{HR ###%%%.EMM $QGYLL [犊ngO)555NeQRg6m۶?T8uQ>>BC7@aa3fHN駟zΘ1)))=^OL&lɓ'UF"Qwyf,]&M1 ,ڵk!Ja6uN#ꨏ>pRcŊGCC>6vZlݺ=P}1矣jg['OƊ+zh4L:k֬O?-L?~8F#T*yah\.ǜ9sxb9F#mxpuA$A,nE[1FQ-\IIIBex衇`2YEJOO`{"-f̝IÇ\pCyΈob>FaΜ93g ^}UHgQϰ|rýfyz)ݐݻ [p=`hhhzL&KB O*--ʼn'0zhL4 ۷o:9͛o[lA}}=ӱj*bʔ)2e a21eff +++?01uTTWWCRA*(,,ĬYZcƍǘ1c-(eje8vi&;xQ[[ dddF:<%;;v´iӐ%Kyux5\o]ƱwaGQRr,_&L@\\z=t:F# m۶#9r$[Lj-ICWFzz:fΜ8( !33|S.&O۹s'Fd[9sv6mꫯp ̝;T*ťKÇӲ>Coǐ!C qE޽%K\֡ O=ϟn g}cժU.uw;3HMMugCClقxej*bڴi0` yi/jɄ]v~x=^/""""QHHH}^3iii$փ6|h4?>]%?xqoW_O -- /b-YsEqq1>5c%"7qFD"qޮu A $ ߣ%H0w\f{*6 A%"""%"W>S[nA``Cmxg0vXH$aA|r={'Q׺//^lw9Zh᫯70+& /2ƍUVb|͸a2PTTB!/\uyˆ sō7E5"""""oc%cH$;Ht:f!-- |ww ,QQɻ- ,[T8"""s!~? s,QgAVlقkzFDDDD}{,c;vFl۶ k֬q{Yj6mVř3g#x]bɒ%;w.zk#F`>|8t:Rۥճ?zvlW_}B;ﴻl`` >Cd2x纪ZgK_uw{a$"jK}̵^cb ?f3JKKqi|lײ /骪L2fBll,T****pQ?ANNNV]⦛n())uyKXXx x*Mz qtWw2ڵ r &MI&~uf=t'wۋZFJJ &O!C pvڅ c#"Xc/_L4M*"<<HII믷???,^+J[niڀ0c `ʕ%뎉̙39998p@gX`ѣ}5%%)b@}}E]뾾}]Owu0c H$,YGd6=tpکj#>>\s /_2IDKЬY?"--y/^ uܹs[IR?/z|wu$ [^&|2>f/ֈwjؓ鬠0a{zZ=ۋFT2L0͐´)SotO""ޮy_7|K.wߍ3gƻtsz5״qa]Vwٲ#\OxԄu!55_~0]&a…_^_X,]+pTQQQk7gbMz:^駟bѢEHIIi; 8qGDR/VSSM6ꫯѣe^xꩧ())xo .`ΝHKK` ~~~ EBB`*H^xIII´M6wm17,$>~8._U*Νɓ'#<<>>>Fyy9N<:,_뮻|MΝâE?s ł`ݺumֱ9&Qw4dvtzˢEp]wF#RRR0i$q2dd2ʰglذA('p7b鈍ZFmm-Ο?]voiq=äI0ydDDD@CR8x n݊vm/3fСCr;v 7o=Z>oi/)))rm=y={Gȑ#!?bݺu(,,lQ6,, -¸q pDLL x aYfE^?o yᡇ°aԄGwEAASYw·?G £>1c\q߿& R#F@LL .\!H_]lǧׯǾ}&L@MM >#lٲE(sѿ^:{nuS# .D~~ǏԩS?~<#"/Xb14 L8a]} Cq^{5!$0j(5 K.W_};wv`رNw޽{Xd9r$92}QҖ-[\`„ Ǐ@ u1d{,?D´iӦ!..?S#99Yx /orۜnMc [P_W_4NÄ 0aL6 ӟ(|~b޼y-֩V1b13f>JsO˗cʔ)N L:֭'|uyJ{ڋ'7t*3e 2w!QQQ-MHH믿]q=9 n$&&C^^0'h4osZtTWW .[Ə%7ӦMC`` xg0}tضdO8s ώ?Gi/uґRVVr? &okvW$"MX꣮zn1b?t_iȐ!;؂RQQ"##ؾ͝r9 rdvvZᳬ, /]$jXlӗjH\Fv 422RF={VywgO HxTRuu5,0a~߹i4QTT2"$$Pxt{q]x7oBXt) <֕ ;vLx?j(!M{M:R)JHHRRRg@?)d6aX p 7\q]~:|{Mi4wCjjj29{'uG$"MXGbccn:ؾ}gg]>q֬Yɓ'cڴi8q"$ 4 ͛yĦMnș=7`KH\/Jrp7C,߻w/V^M^wz*#DP*hhh8k !FW^֭[̡t۷_bPΛnI?a{f3y̜9D4iXڿ?b1FC_hAAAr5 QVVkKrrS/իW 'Nz 4Æ POWzB;R{ӧOc׮]Ldee $ ~ᙯ֭CRR맣L|lOzwb c 7r!xtadeeaȐ!+CB"xa/_`@nn0&)N^{bvuxzvS%w;E"ॗ^J999Xl***,2K. B" 44?$&&B*bٲe(//Ǿ}xGTwш4Aaԩ6mG~ر`` _:3=lܸ$v_ԩS0`[?Dzz:222PRRf[ ؾ:#Fff-{uN^OOom֭[]N9_b1^x6-?~L,9OWjjj"]7avp'gG]GڋgW:6퓈7a`Cvv67RK<  CݶCee% Hk&8p 4۲t6pʙqn"11QxZFrr0ѣXfӯrƷ7l5}WOOoljb^_[}BxGGG_nS9)--myYY,y/wtyJ{ڋ8,_mQuL&TUU ǻ烧w|ގ$lsԑY{?O]/:jO{qL"u@[zR$" ޮuՊ/Rx- `i&QZZoiiix=Z7Bd^7oc=&L& # u?OO? Əou;|ؾ}nXvS\lޙ[I*l[mowCaHJJj'PD^qpUԷj{|#Cg{#wKgg^w~s8iO0#"cqP"@ӵdJbƍCJJ y //Hŋ1n8_ z>sL0kߕ'N`ٲex0uT&٬wYt/--믿7x BBBN*h4={vs A5Ǽv=]wOOjύGeeO>ٮeۇ/4dU[zO{q<])00PcC3zJPϑ"Wvȝ망ܰqEejCO`!ض'<-SQGڋ'g9 Obl;v ==GLDNO JNN͛)))kш'O\NVVL&y\{A`` .\uֹ, *#Պ\bǎXj&N9_t=t"""؞>R/jZ!)S8So5rrgv]}gϞs挐8:""NL2lڒb]OsO<&>t_dd= 9H{뙧K;w/,<?>"Cn 7n< @ll,x DΝT>35kB}a֬YXvm9w\Rqq1֯_yO9 R>|ܹs1~x;p@슋eٳrj/T <]y0uI[%ӴֆA5,8n[s?Z.cٲeP(P*x'8.)) <+uDggg_ j5VXE=->Cb@DŽGEEnp>Owt]ݻ*L=z4n᳼<-(!xb@${mW^?5 χL&Ctt4-Z={>8s*%OOQGKw_Ccj4=6l6~Ν;qȑ?71 ׿%K}vd2{k6m7 NDe˖aҥ.~BO#Gܘ̛78{,JKK!0|p 8Pرc.:JY`vy%^J֓_"h4B&kTݟ=ٱcpGBB6l؀:TUUA so \Vzt]aΝ[n6oތm׭[ }w9rdP!IIINÂ?V?7LXresʕ2j(̘1弎I'N(t+oB@||<1uTsaΝ.F|N"##xUUU4D"D"A^^vuzϞ+>4MRa-J;w:8z=͛YfAR$;okvtz:޼YV]?G筻4k7tNłr"##roL&;ԩSшcͨr4ґvԄSNŌ30tP(JTTTرc_ۣx`رdƿo95lllt\?;w˖-#<8444 ==ׯGaa0_gG}۷]NKo=_ID  GDv!1d/׈kM2GHHSkӧOޟ:ul֬Y0_ioYwO""X""x7Rs=^ Q ?>{]vaŊNIۓO\s.^[zF=ۋMwO"1yŋxb9=M2e[***pIצuT*EPPP۷oǾ}XOL& 'Ŧ 'QX""9{@mǭrGO?ڴԳIOO͛1j(CjgΜ_|~|Ta^6o/lDDc`rrr[ou˺Ξ=nYyk/DD} G=BZZ Q/DDDDDDDD- ,[X"""""""""p/Ccc#pavՈz-DL8qqq&;;DQQˡR " +V}آW^yСC"##X"""""""rK}̟q%x뭷0p@$&&-5LꎪzUUUR]""""""^OGN>-R rmjbDDDDDDD]u? L(++ks^R ڈuQbR"zcǎT:|rcƌ;hHKKG}ir>jXjUyyyX|9 r:}XXn$''㩧B^^^Էه*J/ׄb`9uV\b8x ؈p7ٳ+VlB=111:tBDDDDDDkIjޮy^~~>6l؀7bõ^;8wΝQ^^&X,TVVèW_ \p/^x},XذaǗݚ믿QQQ())Aqq1mDDDDDDD}wqfضm/^ ɄT1ؾ}{ĉ]Un7ॗ^BEE{9|gHKKVvՈz |۷0gΜvX,uIݺ\.UW]@L&?GdvՈz XgJKK*'bu;7x#JJJdxJDDDDDDD{,3DvH$uI[BB/dPM ,!z>>>~ɓ'Ξ=+LW*B$W̙zN`{:CD,^_5ӑ `ĉ7oR)f3n*KHH%K{ndfff>}:~233qomGIo6\""""""ދ>FaΜ9&6 xWdvaaaXpa=u^|EOVz9`0a`4QPP l۶ NNAMMM% nf$''#22(//g|ݸ5DDDDDDDԓBBBޮyΆ xq…aՈsY6'' ,PMdDDDDDDDydgg#==(**Byy9T*pB`Ŋ`4r"+WD\\i&߿UUU D\\ -#""""""=#F୷ϒϣ ?8Μ9ӭuc%""""""އɻӧO BCC>9s&`֭T"""""""މ~$662 PVV&LW*=z4`^>̱GbHRD"z;?[P¼QQQ0 i0w\ <FYYYعs'kom@ ,QǏǪUZLa0iAAAls* HHH@||<^{"""""""89u}YN}}}Zwu݋ٳgo̙3'nV\^o"""""""X>$L:w}7֬Y7nyb[3Pոt׿P[[7|ǎ̞={7z,8ٌ|l۶ /dBjj*F!(޾};,K+9+NDDDDDDD=KH~~>3g0JxlAA@*Bta-``)--DDDIVe9Bѵ#""""""^~fH$L+..FEE`РA.F#DDDDDDD0ԇz(! IDATytt4&O 8{0jlO~'v4}tɓ'a6=Ym"""""""XCyf,]&MBXX1b,Xk׮T*l֭[~G0͈4 qlEDDDDDDD= t3gSrnG*^SO=d$''`0@. |ؿ֟zQHHlb0a`4QPP l۶Mx›+ÇǼy0fhZٳؾ}{III]""""""",G``a%""""""""r KDDDDDDDD- ,[X"""""""""pDDDDDDDDX"""""""""0DDDDDDDDDna`E Q-h_%>)(BZY5"Sq! 9"xU ޽xr3CȬ6-F vu6n8h4dee!//6GF@@rrrx\_>""""鵁EᮻjscƍT#".S1+tlF 6Y^G$!44 JT*`@mm-QZZڢX,JDшZK,H0qDr#GPWW廻}ZZ~~~BN>bN" <<AAAP*DhllDYYrssaZhZd2466s>tQ_kKD%_RXYdF FcUJtBBRX" >>`Za6^^"9s)m>>kq QQQh4Z8< aZ!P%%%JBxx8wf, jjjPYY5Jd™3gpeXVhZ 6 J#GDFFF\\.!QQQgϢZ#F\.Lj#)GDDDԗdBUUADDK>%hXXkjX,DMMYSSjkkQXXآ\PPtшs ]XbAvv6F廻}& he 999NC󪪪pi!gV^ CO<) {™3gNNNrDDDD}M,tD BKʰ卖oJ/c[a<Z?L cRXzFHe{eb Sca 9rHE"T8_[KQpH\_&Cٌj|V\G"L=@AS`ZЈ+pJC0F=%eQTq: cB+&#_.7+ݾHA诃G: ǪkkS R*p}1*_d2XVp.WlnQ&Az UB.d¹z.)s}Þ2ZUFUTbWIVrͭ>齫ݫFA)8MkOΜ H r ŋ6۟aaa|+9V+P( i[#$$ MMM(++Cvvv F+H$ JBX,`@ee%.]znANRt:D"!??E~&0=(**jjAAA.=J ^\.lrH5zb}>_qqq\JBVKjjɺ:F#"""kL`ITh4v(gTT{=KpvUrk RlZQk2C&cRAJ|%b|k$sXaE>Æ|dVU;Dx,j0m94LV+b1cRf=a~x($$i4[1D!*_ScVKr<74PbhŠY?%$9M`){d"GG FecZHp]QX&D7#83` h6C, m-D!dž|2wbJ?[4XdENp͖L,ƲH T(`Z!aFpT >.p-jlDv3/d1U"s][e+Μv* &L444СC]VN,cرPհZDP(L&6Dt4tCC|}}\;D"0<ڹ]bCad2„mEkllDnnSÕP 2Dxo6=J!!!8uT7n_g)J$&&B*d2A,C@@R9=$1LkhhhuVHH*2͐JB>}csg 9ZШB{j.22{H$QRԩS?:s5>4fرC4|G  *,*AZY0G'!AfU8ZY uuh0hdRL uzvp4۔VlüBWVbb C* 2)j 2 : n Z\_+<:cR8?52jr4 1O7nazpbThXRý u)9`JJQdS衖: A%e]R B1O{ s?;m߯ԡɈYٸXLya!Ô.-CכϋKb[@'b/=jc g MWmq|P466ѣ\.Gll,1p@ U*D", pbs 0d O2͐刊B@}}=󝃐'{Y,>}ZNaÆ]qXtt4d2Ν;ע+V%%%(..FUUADD0|pTWW;%vw:+88 Dmm-$  <-,6ϔJtN8S.]&b!66r >e{IRT*TWW =̳5p@!TXX/ J%„iCg#"""t:0}HNNSO=j [ V!L!hZHD"S,.á_o`W`ĩB!UI>wgZq RwԠXwqCPb(z}H~ |VTԛ): {lX[C]|pe&|RP"dzfVU; ,o2°!Jqm?>s1T&/`Te4|ψR!;:s>xD"ɓ'n3g`ҤIH$j `@TT eNs9'?? :t(*2LCNN&b0dv%TRR\VM"44~V~~OSSΟ?V Z;)'ODmm-۱Άz=,^0DL457dD"\xibAqq1b10h atf}lcЧ &L\.Gqq1N>-A, u`;=[Ϫ,z{>t<""""kzPXX㡇̙3 b˖-X,Ɗ+\°~wcK$D h|+@/*_J$e0pE^a 9• XV|SZs&ǧ!H f WxU rłIsb*(~9+Z9X^ٮ1JD8k덴F&EvSue=  +mAe A%@+W*͙L& N9L&+ȱ(0h Ǿ}~!?p@!׍jŅ %{oX L N'Ls5d5WD"bccaZձmfmŝT}j]\9y[k{BBZ8A3{j0T%;R)N]7l6;Cc`qHRXVFN1wχΜGDDDD}MsӲvZ'@TT&O2JJJwuUݒ]h˯#cIt_.zT9 1OrͿ+Ŀ~ FԸȡQo6hD/K E[jX$e+ rp+uu8dh2Lq茈_ .J/7yuT۟pWs|h`0য়~)8ؓ\;C7R8}80LʂZNCxxS/!\QFAV#77EEEhjj/ NLNMcc.& Aȫ(<<j.m* |; m}X,RD}}= HL&b@#66MMMN=$ܣFj.9 sw'Gnnns<Ըlk{>t<""""y\Uu˾ijch96?AG-LZٷQguƜ-dn-.͠iZ撂;({?螸pAe|<|<ܳ|s>gys:vXj̤IڲjVpb<=Jr`2\҆7ݽWF#W0P:jjQ!Tx`Lo se8c]gM˫VH`.{Ϟrh*cᣭGK 5tFIkkJK ^j~nКJ@u[{[ŋJRILLLJ3gΘu*--Mll,~ԇܔ@Fsg@RRjшNڵk~Zo]c9BcWwz[ǎooowﮌyyIQQT [Rw+[goZj21/nZbk} !Bt42TSSCNNm zSٗK8Rzt ˓ߏO%e~J KXwKn>.Z[vZa=H6CS+W%"K (JV +\ 1([njrrrj"=z@VS\\̱cǔM77{Vuu5#""`ݩʕ+>}Zid)RZZw}gնٞW7j1 i BX%XKl.'BuzniƟ{6TgGQ16W]<F'B]|Ei5副VhNS"g= AL-d\L݄fi9{V[?JZmՒ4rZڋt46] T*\]]txS;[Ԃ)..FׯP\puuCYhR-[FVwzJMMe"##1MS]֚bf6ikB!:7Ɂj5/ϟPAV-VTg1hT*y㋺* JEgA<`VkaCb1Xi5tvo|{a[Z%/cK~8d@:?z4w^ZڋJᗠh4Is(`V*p=WTTX *T*Ll?G0 ~t1\\\uzv@}777InW5fu3M/)1riPv&uZl]N!#j%ƎK@@gۿF eѢE,Z3g:<*ˣA$_U7ѵEEmk f??Dj5h,,?00bĵr* 5[η[jsRyd禐&]OlM15gW9ԖCTZ.{xrJ=a!]so`PŅTCWK^g>N޽ݻ7 ޾Y+U`u[Z\i*ʕ+JkK˅YLþ}ʲo|{!++\/nnnG#X wҥfbccqssCs/_z,++S1&&u4(f{uYCCC ؗ.]BףRn4iK}g9!B]ɓINN&$$ 9s&ӧOٳxzzү_?GrrrkMC_Ǜ aT62@Ew2X2@+iQu#9L Wsuqahp Zܞh$v{:W ͨV] .`4Czt=^j5)~dŅ^"Ί7.g [ϞrQTްNAEm } ت012@_Z a\y}^}|Zң"h%-2{C]j@@wsغ5Ξ=hӓnI hZ `ht颴 11Qi Tw9H^^P0nQT\7a+W`4h4t] "In,ch4Z-Z,pVMILLTŅt?G鉛2`[ɓ'gNNF`Z.iZBBBӧO۳uΝ;`@ҳgO叟7tPrr'NAwww'&&FilbK}g9!Bݎ#<_t^qZ9GJAhDRqj)#i zzӷƴ`_>î7Ϋd]VN!A!B!Gbk'B UF#5F#ZZ*u:a^v,#Gd۶m̟?U92_GDDloomtdmg/Ro;p>HRRR߿?ݻwk׮c׮]|GZ\Ãq1d"##QT?;wRVVBǓR;0~xBCC9yd;XrӷVY/\v便̘1C33fRڱ9r gϞ8vEmV)wQO|8=/^tҞ!DːcǢhػw/9996|yg3ϵkײvYHLE8g7&)wQɓ'ٻw/Err2<AAA̛7ɓ'S]],SOMYY_o0 Ջg}222x[q~XMbԨQKmV/81I K?7V\\ٳg9qK,!<<v @hh( `ܹSYK,Y$ͺ !D{#Aۈ#44V˥Kؿ?Wfˌ7 KBh{/w&$--!CDQQ_|>2ftٿ?+Vh/-ZĐ!Cӧ1{lz xWٿu҅ &Bpp0:\>KFeٌ1Q7zj,Yoxz*۷[6h]W.]:u*}Ar ֭[Ƕm3uؿ?]믿N>}X~=oFݜrh4L8#FJII ;v`ҥ,\$/^ܠEҦM6-Qo[ϟϠAXbowqcǎ%&&H~~>7ndӦMsxƎK޽ h4rivɆ zje9/9۳esyh" ӦM&==b}Q\v?auW^!%%~]v1uTzZ&775kְ}f5l-?{cu]ܝ}MlQsZU8rhZ:wLի* Çs18pZ=cPU^^h$<}:jZMtt4sҥK`0ҥ saf͑GYhjrsrr2g׽Yjn9sƬo&ܚ\wk:u*or())ՕaѢE'ޔjILL$11nݺ[>c̘1Ӈ ߔ攃Fa…|TUU<@ݕ>K<';w&$$8ZS2}n=^Z3_Ҙ$Çdƍɗ>>@O.]\EDD0qD.]ʚ5kt@C%9{,ݝ~~'!..Çiq}*\?dڛS&MoF׳h"mFMM o27{loK79ZSLHIIaǎ[sAjjpa[ʗQFԶ>{pႲcƌ߿m=/Qkrsy[ۗ8Nʛo +Faڵٳl{Or49r$Ofܹɓy衇HKKcϞ=>|l[X]wtZ^Ylr JE`` }GjJʼ[SA<"##V!p&N@G3|'''777؊l„ YѮl&nnn̙3G׿oTVVV۷۷tR***8:q)˿&77׬=\7Mjjj3gҥ_۷J5?y^j뻭鴥9٢Glٲ͛7O̹sxaz鉯^86BXjaM56;v ͵d[O?9slZYY'N <<\H\\|IuUTT(z ~|r뾥3u ..8 W~Sˉ&>>Fl޼ck8୷޲#=^|0`>>>z-[|u{^#גnQ9;u?QT< :x*͛נ;w?auCqԩMc =RK_mM-nϑV=9ܯ]Ν;ٹsukÇygJ>u] KNN[nj%!ho !!!;:wg0//VJe7Q1םܹstmO?Y\4&uR6w7=K/5ϗt:yٿ__ca6ukh4DFF*%W^e׮] 2#Fu0 t{n~KSB*R.\`6f[aqvKKxWs4Vűc,m%k9r{-Y?Uߛ>;b{6l[naJK8&OX{ݬtRʞtyrzdQ/^矷*} :TKL<{^{l BvСCyG(--eǎTWWG._t[j*!p ,^z%ݩŋ&=G{Sl=[sy :WWWZ,9~še[#ϟ?{k{XS[zT_^^_}wy'cǎ5 ,]rӧs}qN'33S Y"D!" ,޽{HUUsQei<ԹsghdժU- joM_kvw0uԩpF湱_ˬ_^y[ϓO>I^HOO?oS͛73i$F;>|8P;&KSo)vl ub+kÚ?}^r1cFiO}^LL ӧOh4rKFFӦM3{?`rG䧭%k/<Z^QQcLt:V^m15vXU !D{"w CM^^śZMϞ=Ӎ3=jvӧ[du/ݻw8izScM4 8AAADGG۴gK}[3(Ԍ.JeuwǏ3{l Z4p}@>5>jKܹ3 u(ktu͵7aaaM[ggusTG[o}#Οwk8}zu?aMF[[4>8ky3ϟ׿(gzHXӒ͍;@BWXjA7!!!JSFݬ7׮] 88ر ח?ŶS\\ Zi3}^|Ϟ=[$?hxpssM~GPT_l/G:8k/| h4}FVvyA[{껳iqfONLL gΜ7:3f  0QHLLd0 h{Ӟ-g?m-w[,ZE1sF糇#GMg``7e@c=AAA-R ˋ~Z͍cc)YM1]oe̘1q~ʕ+2dxxxy@EE6lp|Mjjj8p 3Ieذa̚5̗LNp6ӧJ"55?Og< ,`СflGDDJˍ~HR/*-HOO[nh[i|^Yv-<CUnSSS2e z뱕֙Yk/|T>W}3sLBCCCCC~O}p3qD***z 8l0ý{pBfΜɠA4hzV 0[Rɓ'ټy3#F`̙ȃ>|x׮] `*(oKKKqqqQ>[\]]_Fo@nʀ"www-bffffVV3fF絵>Krr2/"eeeTWW}puu%))r)7umHNN70?[gguO>!((4^^PJ/4[%kꭳσY58e{<3{ Z7|z$%%s1k,F'le̲e(++Z ˡC]֚`kz^ܝym9;#GgرʘHt:-ZD5h4 6Lf]F+V!p ,?ƏO\\nnn>}-[vZ#''?L4={)w[9nZ/޽{5jݻwݝ"8+>_|7n)))h8{,gΜ!;;f˴FԵpB 1b!!!ʧ}-W/2e/.\?gʕ̙3lByy9#&&`Z-yyy߿UVqFӗc=Ɣ)SӧzcǎG5xhA lP]]̙38q"Ç'44 ֮]ҥKyWճgO.&~~~ j6ޚzYk/|ywyHNN&((NO?ķ~k8/YSo}-ϺN=Ǚ5STˌ3Z.#wO!3I%!Z@ݮoz'NrJl)k]PVV?Ѣ7UUU$''MHHǏG}dqR!]߅BgKB!B!&2xhb!B!BXB!B!6B!B!B!B!M$$B!B!li^L4)SM[~=ouMOOfǎdddTE;j*BCCͦJ)B!BI`IIItޝ]N#//]vGQZZj̰ax .0a„HS\N:qRQQ;~)EEEݿWrqΜ9:Ÿq&++SNvr=[;wB!BI`y'6I||<=YfkO8TN:O?DEEIIIj.O?1k,yΞ=KaaMivɓ'%󕿳Z&aB!B@X`N<޽{9pϟ///yG b޼yLիo>njrܸq< a)8ϳsϟϠAXbowqcǎ%&&H~~>7ndӦM oҥիYd ,`,Z!CЧOy)**bу .ꫯҥ &L %%`t:|'|F)B!n hZLdd${hNʰaÔRSSo ZF˪Uؽ{7]=x tܙf/ŋ`0V #-- ???_:u*o0 JBB h"eBZhZN:ՠ[S-LL_+!![ ,cjj5̝;K.`K.̙3+<ݬYhjOwJdς rpt~ !B!D{ FJ"00}裏AfZĉ;vے|ť4VL {gVtiʨQ(((`ڴi=z`f̘ѣҥKL8Kft:!!! ٸqcmZSO!B!h/$Apϝ;GFFthZfȑ|O,ZHi3n8^z%nݪޯ_?iͤ*ܘ3ggΜjׯۗm۶)JEaa!fxb:{ŀ-v؁^ŋ9rTkطotU ,=c{l2e]:-[hxy衇,rB!BKk'@8Çyg8qD`0(A j={RVV|q^ fMcxxoxxxDQQQ[oeƃ˗]K+W_Z``ijIn B!7iAegg3tPeL3yd{=^{fycߚ=ԷW^^^r.^<==oiAċtk;|0:ooo^{5>c߯gK;p-LWUU)LKLL^zN i_֖B!Bh$ X~=,[3gr >rhv׫W/j˦L/ĵ7_.. xWӟDbbT)))>c޽-[IimKLt&S97ݽ4kA!B!n4XW_qw2v&Kwuj'ұ233,%v7&L7 ͛jz"))~__%K4%^9T*qQMfzB!B4$Laa!QQQΣRضmz)ik J`oooi߭1F\|׳~zy'ի|甖ZL-} -{uaB!BaNK7`M IIIs@k6X駟reƏ@ll,˖-#;;~5b?ٳquu%66֬+`]AM]Zi&S7T*r9‘#G "::SN9lB!B&t 6{ll,য়~jt ?D^zh8p2O>Zړ*J ]ԎR 0`C}qN< )S FFF:l&O!B!hmX@RRRXz5O< ""`IKKch4 ֭ JuHuK}m0zX`CUƍ ##J˗9vX0-j9ӧOJEjj*ӟ`0p@͛Gtt򛯯/Æ 7`֬Y.8'?B!Iߟc2vXt:-ZDNNGVE׳m۶LS,T*Nk222 Ro╜oa6SO=e8V*0`JKKqqq m׿lذ#GҵkWVZEAA@m-:Dvv6`0VٵkA l:޽{Yp!3gdРA 4Jz8[-\tF~ !B!DkRk.222ׯݻw'00g߾}_OÛ޽{wZooܸ馛(,,$//nݺ޽{[dp={`f-[P^^N~!88VK^^gժU={u?I&ѳgO"##me_|)S0x`|}}p9+WdΜ9ێ_|7n)))h8{,gΜ!;;߮S!B!Z*,,ډ"++ Cj:2i$Lž={ZuDzzz- B!I%!ԣG;W_}ڵk[9E߅R!B!: , a%ooo;ۉ'Z95#i B!BUN +B!B!?jB!B!!I`I!B!BDKB!B!&XB!B!6B!B!B!B!M$$B!B!l"%qCRT,]-[EVVou/&++qƵvRZYzz:YYY̝;I)ϒŠAo̙dee1tP$L@席o٭fZU |l޼,Z;YB!4X)))ߟݻӵkWtk.>#JKK-.h=z4Æ #** ^ʱcشi_} bŊ[q;F#lܸM6-ץK&L@JJ t:rssO/}vmVҥK߿իWsiij0JJJꫯXtCxƎK޽ h4rivɆ ,ɓQT\v ZMBB DEE1oٸq^g۶m|28LFӧy\TU0þɮ Ȣ,JH*+Zhe&VV i>Zi$.hbhH!"" 0?, 5s;g=s|ϊ+CCC曘5"WCMM zeOS]^^^055X,nr! rf:E2unii_aڵ0aV^+WK.:u*`6ω*޽|>|>Xjzϟcʕ(,,dU{ ;m޻昘 22۶m1l0ĉXhM;vT]ׯ_\cف[Uw%m4qR ؞BHgF=ԅ  ěo~ |MXj\\\cdddիfΜ0wߕh.3I]N._bLzZARSQ"22=~- IDAT֭ *:::h!+Qvee%$W͛rO,/\Vn1@s]EIII ˛.q`rB):uee%4-Q"==鰷ǨQ@"==WV={k֬ z}oO| <b~Ν033x\!KZN$plق8?R9;vHᅦ+f͚ |jc,U,@P9$ە_^f޴iOaa!N:###3\.황 ӧOGqq1x<1w\ 4J$كLmii)k`?pQdggs'=ɓ8}tJZQ͝c$ѣG*92:OO>a_v 6lh!P`RXX3g`ذadK=zv"G…  u"%7<'|?֭kOb=z41S"YftRTk[SYY kkk u&&& èQ !/4;~&&&ڵks(4tf?֭[7̜9wڵk1tP_ŋ1}tٳGA%Fff&abbhvۖaҥDӃEG6ۚ4i$9%oDܸqrH:w*++0sf311aS=ɺ6l*-o{v{F0Cnn.O>m.C޽ Hׯy{uزe x ÇHJJBtt4HHMdۨ[f7M/(( dzGuu5o^4Gܹs1k,>|555D\\/^,sn\.ٿvb~/\p^i+o; &TG)H!(KZ{;# 6񲇇bbbax^^^ 86n܈z 4+W033СC~z,Y]~U>`~#22gKЛz !!!쫯bGQϟ?g7n`ggǾnggz vw <044d_r%,,,PSS& 3f 44h Y  [ϕ+W4hhkO3f|mED"~7|GxױcÏ9j`„ rEةCCCzcp8(//o23 ̓)8u NNN;xdG^^֮]H|7uVmkPu;c !!g``sbZ_]yYG8O!ґ3-ӥKDFF"22R뵵Xf {GhȻ֘7o͛P(ɓسg?il$&&"..GsB^1x<.\";m߾>>>ׯVX&Yg^0g+++ ""e/\N<)Mff&|}}iӦaʔ)aD(bmmN/_+++93|ׯZwl(99PUU@ \t zzzlP9%%%ͅ7pA=p@SFx 6LG39r'NDtt4RRR3@C hHTccc A/I`p1qDL8fٳD i ==ላ !v_}dnw1={Ğ={PTTݸq#><6vvvÇyf$&&3n۶ &LXYY7Ο?/GڵkѣG(--˗sN )anndp"qqqRǡ)))HJJ_ 2shIJKK7 &9! .6^, 22?~<(g0`899(,,DNNك{,GBBf͚ǎݻ/gILLDQQakkNQRޥ[nԩS -+`hxgرCTMq̟?@ 7o>|h+o; mBȋӵkWF4qrMvڅnݺaɒ%xba߾}033Ô)SV=~x,\|> *,5!ўzBqq1N*0Ԏ?6m,]HOOի5]B!D)cBP=Э[7Bvxbs}vp8L4}s\DEEA$a֭*2!*՞@0am*>O^{BHG@%Bl!|r'[r{7ʵ/P/~~~Eiiio۶ iiiJBԩ=uUU L1 Xx1'''x<BHgA%Bi&D?jnIW^իW[]ĉvEtTMB!ݤCM /?Vqi!B! !B!BB(y7!B!BQ!B!BB(y7!:: q'O:!vF!B:#ʱD!8|0LLL)))ذaKD3B!Q%BH`DEE>}1cƨ=<<<0e]tS:tfff2_FIIR ann7n`ܹj{/u' ]X~l/B;5v]]];wK.t!BQ`I˼+߿? kkkXXX@$9˗/&MK/[[[D"ܹsؽ{7***:Xn4]9`ǎ2źunBll,:JNNzE϶zQ"== BPPΝ;~'B!jG%-|rJ-xppppA|7Rxxx 11ptt#F{oVG D-¤.߿bgϔ+W`ddl޽{c۷oٳj{/ugg"ڹs'F . ŋ .!BQ ,Ǝ|.JwE}}=z t9|MD" ۳?~ܦ:˖-c1}Q _\.@CX})Om"z.]t!BP`I˜E"[ff& 0a!B_|dYee%/@Å'ӓ} ;;W^ 88X_#-- |>J4={6^u@ @XX0i$@WW8qmnp0d1011AUU򐞞SNI055EPP ^zƨݻwcjR΀L6 nnnٳgqFIs]\\*4?LXX>Tl]IFbD_z?VyOeڋ, e%''cӦMR(Sm"3EeeeA({F~~߇B!? ,i9!88}$6VVV>۷ep8򂗗y?~iiis&3~x,\Pj=\$$$_ZK.0` p,[ ϟ?g_>}:&N=MLL9Ó'Oׇ O>]www\vMY)z$1ARGh{iμyJ)))RA%Uԧ6dTWW#???@%B!-A%-5x`|gMc׮]Rwǎёc-<Oī>dibb(DEEի8t~WO.+4qqqRO>Eqq1 {'7@ ÇQZZ*tnݺa̙40-Z$Tb8::JQ\6w#D}9ov=eq;T=zzz`_-_uu5Ȼ>]^YYd;EіҜH ՁQ>Jۙ ,bϞ=(B!qXzaڵR:PPP>֭͛;wB$aĉprrb_с).nj3pdC~8tE q1000pwwǰamRRRC(b٘4i^Eɸw1.]BNNN&M¼yl`ذa066f;s ֮] %K`РA*aF+V@HHƽ$egg#;;}~&3&2ǁѻwo [  4Y^ZZ*s9CT+`GbR먢>Jۙ[nUB!t Xzbƍ|>̙)Fttt144T*$\_ Bxx8raff'bĉArr7߰ϫ&>|8ǏM4,?`022APP{x{{ 044ذ5335JKKѿv@ _~/~6GЋDz^QQ"1www5 :::A]wOmE]RrsB!-]Ž 1c p\t ƍ?x<-Z26IG;υRÔTU K.:t(߿?)\?:::oq šk׮ѣRÂ>}˗/# ieK.㺺_ҘP?ؾ}s*Suz.p`ffM B!1P`IKUWWCnݺ,[7ސ-%%ĉѧOڵku={2?y|>\.Vbq ${XXXw qvv_|!w"}}}큆`fc=$(Lm/ywd*Suzi6ՙOB! , b1; Cߥfc9}\[[+200@pp0F7HE#ZY&+vK$JJ Ν;-[޽{x9 5kִ×["P8HIȨC 1RE{a\v p8!Cp)uTQڨ# цlB!P`"9 K.xqIOWP8!,, !!!lFQQ9GL{y .]/׾a@C/!!AjdIUUUjv[[[޿3hiAR 4HXnn.-ZKbС~T/JUggLYjB!DKhDuZ+>ohGB!ڃKZdؾ};z-Kppp\]]pBDDD޼y8Yf!66V׈/ٻǎSQQQRyfL8˖-ŋ_aQɓc\Ro`׮]lobukkk888ϝꫯ|>-Z߇*>Vcƌag3kL ӧR}Qh{ii))) &wsUggLY*?!B  e0}V۵ks}}}L<ӦMCee%x<^i?E2D"Ν;4\xQ3\rgϞŠA4mۆjTTT\W#++ 4~̄> pL̜9aؠ˅@ :>jxzzbR$ puue?}˖-Zx1ۃd߿T >@mmǡK.3yyzzS%5jt.EwށX,VY}[gmgrpwwgK !BHF=^0ضm~f155ػw/o߮2l۶ &M§~SPI5hllݻ7dzʕ+rKKKL8cǎ@CoVj4333HIz˫>e IDATe666RI,Q84&ٛ000h5R۶mc{yyIM2T5`>|H%B!-B=HJJ ݻ899xrssq!ܼyɶӃlll c\|iiiqʹ{n(~!Ço߾ҥ QVV\t gΜas$ Ba:t(!{/KOOGEEMWWW0ujwTVV"** {n7"ǡ|\r>>>Gpp0233L{iIZZ&L={̙3gΠR%Yw;Spp!BQ`a|x",YEB!P8B!B!D:@hhFA!B!Q%B!B! ,B!B!P`B!B!(KB!B!D!X"ҩ|GtQ4b{KKK&K.U_AIa|DEEi(p0n8$%%!##|-n >+VSI&..|>&G!VXz`޽$''fuuug}T8qxajjڎ%&ٜ1|pܺu gϞmq'NoȩSv&pTEKTTbbb-7yd{pqqA]] QXX2M @g!0k,x(*!y̘1+ >>!`oo'"44ov!hsBGG?biTVVb… b,|aggܾ}[!Z?b۶mr_|X+W`G !ѣG|>D"KC㚚 D=_bt~~~.!-DCȑ#兤$<~uCBB4ᯪz?ݻwѳgOʕ+j+3!o> ..٭`DEEXv-?Gpp0v܉~*"##XСC8|08p \\\`gg]]]<~999ػw/ܹ+cӦM8{,fϞ~"??ï =zIkkk"??iii8ydwZ/n<Ç:uJu+V $$;vΝ; 8~8o$h{ԣG̞=?#33SSQQQX`A}Ye~), 1cCCC!'';wl>hnk}*^tuu1yd >]vEEEΜ9$ׇ$WWWDFF_~X,Ɲ;wӧMiSlgeeO?ZvaH-;}4/_b}x$$&& 6l@JJJi+X >I&aȑ?TB!KZ sAQQك>}45u|u._={_~j)/!tuO>riӦI-sssèQ ^{Mٳg޽;w#F`ŊzFFF六[l+<<K,as={ l@^`< B_~v 6"\.]vELL ͱ~zm/TUUAWW@޽WeMU5%%%R7/<<<۷oBj`ѢE;v,<555Exx8˗~S-]+R}}}Y][[ SSS?^^^ *o˅ЫW/\Rje_[0774Yrssadd֭\y,y<Cuuu011 !jW^ŤI0`p8QG!D(̙sss|W-ۣG{&&&ի/׳ $Krpuue 8}4ߏR B!233qI沽,--1}t?1_.3#pX044ěoɓ'#&&/^ğHH߿?>Cݻw^A__ƻヒÇڵk8tP^TsQ|-/sssǞ?~k׮ 0Tsō7`mm W^1ccޣʶ0ܻwnݺL6 ӦMÔ)Sp(T^믿JF;;;lݺ^{Ce;v@rr2jjjеkW! 1bbb2ZTׯjkk gΜ <K.bшлg(..?~eZ nҥcYDYN ???BYǠA駟J ǓE777G^(>!¨Qpe>}-,,eee044֭[acc'N`ժU(//pGj+?!bDzTUU{.<4پ ~-AM֫G||<=hCjjjkk>'On1P ob}h,ߗz~9;wNJ__d /1`RCԔm/bϟ?GRR\]]K/a* ,۔)S4$x=|˖-Ν;aaacb*y۵H{Ǹq7o /o ={6Xn녅ذaCǯ߿Ymۆt,$%%*IYYYaaa ,BQ)Jޭe\.-ZX 6ȵ.u UXbBT͛%O?Ejj*\O2_RO>X7o%(23!Jpqq D"+s{-^T3cOŕ+WYUU~w.f-vT^...76/ keS cccb]H:v[dmSSS'y Xǯ߿SSSb9r*?0u.BQ걤e"##ѻwo}gjAA~7bǎM֡ap y&<==ѧOor8p /###z5_rdkkH[n022j366-saX^^ =z$WYdacժUͮ(mR/nB췣̰&'$eKsxx<888(3AEu몒>>/٣1yE1y`Z KDё$l{i$aZN笯g/cPӮOE S/-x***T`חȽ*_[ @=.U}d)!E%-2gbƍE%TCϞ=SP[⣏> K>XnYx1Fl-ƍ;wR^T]ee%4-=1['j/a4٣-l{D(#Ɯ?B?`?~13ݻ}T=z4Q,j?'իWH@WWJLKKK!>>^f>D47< (?Q,; ,I9r殿2^a^"\.2{0% U[I^֧9m1UbnV%Vg9~bCKu1RّsB(y7Aii){W:v+!(--ţG`nnGGGxxxŋ7/08y1Q2/\.<==[܇宮gϞix,̔VVVl΀R[]CE$77AEeh/LƘ"PXX(sfHakSk0ZKB.Ĝ\a)Zv{5L י&=e,OQ糱\211A׮]Z4)!*X"o6BCCe;z3f@hh(;vӧaaa011گ?z k֬5k׮]L4 </^\pC~Ss֖$i̘1@yc/6g͚0+K6 T6yᰳdʚT^d#/^lvիWR]] nq26ѣnhhaÆΟ?ROT梪 mFCΝCee%x<fΜz5:SԵk0r&=T޽ HdB"(D4 A.];;;p8`ҥr劆KJ^tFFF0` j['RXXʐ[OOpz*CABB,000ܹsX})]Nظq#1h \R*effCbXdJOsZg:u*`aa={bҥlPKtmp\Gll,^z%={6;;@ [-^j03kN{n<ʕ+aaa8p@l ES" x뭷-~sq!..vvvvvvx뭷nx)B  %%n1Aŀ̚5 BPe`foB!X"Ǐ_={ S.%!mJLo7nӧ033ӧO-222-[ wT]l$&&"..! z\|Y% %%%ͅ7pAǖ-[___,X ,z],c֭*U'N ((III;dlǎ-(((@zz: yk+deej8p#F@Ϟ=gC6n(333니L6 SLAMM [FPիW+=TYԧ2eA~b 6ɸ>;l :JZZDDD \. m/uuuXx1LÇ8|06oތD|m۶~Ä +++&t)annޤdO@@8PSS$%%믿9ennB|Bk׮48944T D+cӦMHNNtq:,===۷fff2e >|"BJڵ ݺuÒ%KnpB|$$$t߄B@9!tuuuؾ};8&MBJݺuP(d' ETTD"nݪ}B! ,B48 ""ՙ!|󀆠4McfT!CǎÝ;wToB!A9!tB_|`kkRMBZQFaԨQ x! y~~>6nܨ޶mJf$BC%B!իWqUMBVWWM6H$B^^|>~g$>qI!4FɻI@ɻ  /^B!B^dcB:0MB!BPnB!B! ,B!B!P`B!B!(KB!B!D!X"Үbccb ME.}|>5]utƍCRR222矷<ҒݟҥKU14fŊtQ}I{v>OsЬp/O̘1Rp8xzz^^^`ժU OoNNQQQ011۷5]qvvq-={uO8]]]DGGӧ|}Qt^'OƜ9sUUU()))o@+Wamm~խ|o;K9; Ojd9fBVVBa;h ,f̘cll 6S!]tt4PPPfO<{ ӎlܹO?XQ>luQQQ۶m q… .+p;,RNeE~i"dff"<<GFjjD:! ,i9'''DEEݻٳgƍvnܸ+WS) !/hrrrB`` [D::SSSsFFFtH{vFڃ64#::P4(8/^:lٲ ͮ[]]^{N$i>H9㚚 B:\~޽;hH9r$ǏX,Dk+;v,\]]abbO.]‰'/+;v ))݋N5)S <<vvvӧDxyyaÆ Mx)&M?Q[[|ɓujKDEEa$ IDATMg5Y駟"++KjÇabb"LC1c(++CNNv܉;w4Y_ܹ111scΝꫯ"22NNNx:ÇCrrrhѢf˵n:"55ׯW3*=kgʴemehh@ 8....?~ݻWAQL4~YYYO)}WPngwUSm9Xf D"Ν[n5ߴi2̜9OŴiӤaԨQ8|0=xQ}pQE>(Umo/|okI]={ bݻwG1bXJޯ]]]xxxh-y#JVe"=*mmgwU_㐝DGGO>ٳ!"&&bW *מCkSS_͛. . GGGX?D"zxDGGKwMUy?Ii-i)m)P(HA 08FaDQQuGEAaFAB)]BӦK(&m&77Izz.'{{ιj9x {/Æ CRpWD`*#+X IJJ ӦM`ٲeY&zȑł>:V+K,a֭477sM7sϹ 'Qb!COj*>#***5_W7Çͧ|پ}ˍիILLd:6]ĝ1cHA+WcXHJJbΜ92w\ONyyy'L@qq1>(ǎ#..Yf+WۛsРA{ܛСCt:ͽtvۋtַo_ʎ;O8<\)qIbܸq\vnT*Nɓ^AIrꙃEq+je֭|:t d`ĉ̝;#G=|rx֬Y?|)omP)w%O-~!C?ҥK)~ڵkٳgO}ʩg>:z t Sx'1L,_D]]?OZ,[T^Kg\xE^WNlnv8;AR(++cʕ@ii)k׮wUd_!!![VXMlvvɲe`c=ZfʕOnؼy4?z_8.Ʒoβeˤ].^?Oee%FQ >?>ǎFÐ!C^ k{fϞ?.=/y_6e̛7P^^ιsXnz}zr-kz;M}帕kÆ ,\/R .TTT??馛oW' oۥRrˡ ɓ`#םرJii/07\됊 *++^)Xh4x v;oF#AU__Qtֲn6mYfGMI\=\n2_2Ldee-o*ibuVno),,tl6si%_xDboy-[`ZIMMmsاOӱZlٲůL7Eq닎$vN8CK;,޶Kݡ}-g[oRxg=z4s⋊tڳT~݉#@soRG'&&:#]&/^b(UfҤIݛ7z]F} F?av~_h|1PSSCII Ɋ 477K/. 2_Ȑ>~e;/n?w<hcn˗/w ;pGo|2vbԨQ?Nn|Wm1 `OoW L4CLXXXQ+ 9RW/w%a\I=-z-Ň}Yw*ĹwF3Z:YMM ъo[U$>>|ꫯ2{l/ٷo~){Ud_ҶS]]FSz'IZVp#߁""" ,ENkHHHMp'Z~]N-^pe?SFŘ1cxױZh4ƌ|?\.U?/r[_ :^zP)--̙3R _|iv;RxbV^Nì[NtBۗОuN{:zqv нp>~y K. gA*6mݻ=z4$;;nfnf|vS:wǎGm#_!Xo$!..N pueOE;gˉodǎCee%_}SꪣjJ]D|e'| &(>Sw [ZGgݥ6`gq/)xḴtq~ضm˿_]Znl۶_J Tee%֭^`ԩfCӑ#HnBJvxcBx7F$sa$666Y8s 5‘/ss<uW9rt駟pד̈#'87r9&i-**&vh0`b 6&;G; Jk9t:)n:y d̙ ֽ@R{ /T3hG`q$/KFJ==Zze t',Y%K0gΜARIs GTxmz[f{l6R|-Gz'O̙3n*wr9s&?.\jeĉ)@C{ /T3hy1VfqCz 1DEE%ML -7pϕ/r1l0 s-b.SRR7o*JuZN3g$""JEnn.gϖ.J555vZ 77zժzK.n_| Wdd$cƌ^㩧R$_9vw해V`ԨQ̘1_|EbbbX,_^}@˓@<k1ҽ@qO帕455o~)_z=&Mk7?#dy䶃JqT}[yyyL8K/$w VXO?X}}  kԩSW9EPŋK7fϞٳvmg"R˓ԠV2755 #Gؽ{7ÇgԩL:Uz]l9} BNN ,l6DLL | :lۻw//fΜ91#FP__jh4J8p@|q~znVXz5PKJy+1*''^{eO>߭[2x`N~Mb~jeѢER%q!H^^6lP|μO%l۶Yfa0l_Rt 8[?3rTUU;#0vXƌ˗ '$$ݻwS\\w߭|D99sM61~x̙?.]w+ܹSZVn;J{ 9`2xxw~?nlΝSO=%M/!,@\ o5p%AZ7oaÆA\\Z"ի9wu,XC=ȑ#>UV1|4551gMƸqHLLbvZ-[ƫ f AKOC1ydJbb"!!!;wBvͿo!??_w} 0TWAIH @bbbmDEEuֺg/޽{0a#44r8|-g7nd;%oS ۷#F{n*++;O_r|3eyf֮]?~|T9,^bƏOBBkw.iVrTM9T*ΝKtt4Geʕmg~_Wrss2e4,?%(,?g>E`gQQQ :*CJJJ λɶmۀW ?$99z={}=7:5kɴiӸxbVLdd$gNUG Bw1qDf͚ŶmX`A#tCb%Aٳ'XV\O]cc#*{7QԘ1c]v;9Wq ݅Fal6/_ݔ, (D!Ch{ɼyزe_o\p;S˽AF^z1c e_q+ \ nfRRR(((vrnJ̱$ZߎjŋJSNtRj뮻˃$~ӯ_?%%%қVAZX7;B7&K  ill/ 999fɓl۶?Dr0`r頤!%%dP[b>|8(QZw}]wsyٳg9{l(  }`Ip3vX 'Oeo$ pEff&iii.s :\&--LV+ 466J$$$пU__W_}Ѳ sPуxh4455a6pm։d2AXXZf, ?`_EN} F  BGu`)""_~~|Hbb""$t 5V T55;)W 8s۫yJi4rrrnctL&L&/^رc.eeef[FH=8x fY_JAAA^ ,T*^z%bgΝTWWG~kLA`[%_ v2r?;!!!z.^reeeڵj5ÇGt9222nsIhZ233INN&)) JKKjkkzh4ЫW/z= `v/2Q~oK0   mKcƌaРA466O<ɓb AhnIf-|Cq}$&&J E ~@||<\pA'NChh(., f뮻dҥDQ~oK0   mK&LO>i3̣+^=r6^,m]b]qIs"k!P:&+'̵쩪Rﲼ^###H cQnj⤹*(2_Kk\o&Ff@e^Ř^dEWY7AcL|,Di4Yu}UCGi 1FV@=SH3PbN>K~.FYgw;ח-eܖH!T7YM؂ԋFCzz:zx"pLڍ7o&ѣh4JTTԓr.\ ;LtRzZU=˗T*BCC|RHKK#))P)//xH`wDGGR_G<)?@Ϟ=1Lzl64sz-  J閁%ؼyddd|rΝ;嬧V2dF;==Vɓ';\_`innp:}:vy4҆DEE7KOO'==]jERADDr>BXXXy%E<ʱ*hVɑ򮹹VKJJ QQQNСC jJ522p0I%%%ѷo_f#$$hѣ:i}iZAA-Kj8{,ǏgɤD~~>7n?vRe{%b)+hr28*P!36U쫺̩Z,u"!cd™czZܒG_c86fQg Z7k d>/Ŀ/qɊVbpt$Sz$1,&uuThyR  }3Ԇ`o#DZO A'3wX,8pٌF!--^zFEE`Hg-ܹs;w IDATFj5ӇD]_m}/  22R^^/~ ~i~xx8fꫯ3PUMV6ΓQv8K&+k/\1P=#RGR8u7vkب-ulbr"*~Mv;{* QYj=melv;UMMs1C5XNHITV杂s4XYX}ѩ goUbKp'MCCǎ#//FCTT!@V iii$$$pA{ɡRHJjh4dffPTTԦb!??p+**"44TK߾}cVsvjaРAm>X,9rĥZVwiʤJKKݻ49rDzf̙3DDD`2HKK4IeeeRڼUj5gϞn=Sx/  2~3nʛoIEEF|I&q]wo>ov;ܹ&+hrרѩRot4('Q}O04m#+JYJTC(v;*s?I~ q:1Z-n棱ؚ9Xt|5ޮwu͕^NWn#B?,͵RPLQ}atZROw\MjH w9sK.Q__f#,,dRRR eݻoƢ{KHHvg϶+vN:E}}={viVjҰ3O]|GbX\>&ʱn>b233۴jjj/b2y:ʛh4JC3ϝs?YYY`0Hu|eJO   C ,9[F ~'=A6ͼdee=n`{.`ƙzsxf/v^हm`Qq&0 AV/Td)-W75Igu6MMĶkNOk7=v;jReS`Bx^SpϴnO%5/gGv0sCCX^l&]oZX,Ӈpu tR"""@7sz1rE ###D9p۲`۶mX&tΉ'(.~7G@mXVڝpTr\Vc0:Y9nw;s,y/OIAA薁%<'6lp;NNN @tU/dkRkq̗i{=ѩv*\oC:-QZ-+Akydڈm)ѳ'D"J#N_7}v ,O%ԴJ"ݛ|sL&t:&S˰ώ 9NWgODD.Cjjj8tCh4ɑ#GݎnbPTTDEEÆ _~J;kuR{g(;JEtttrh^(OE9xZAAe`eΟ?vǓ"## >(@5 w0bZ(K!*g :j|TtKn~MEu^U݁#o-i*u4[vٌ^G+]gɨT*LoJ `=hW\\,M3щy띿_a)ۧX:M} fAAnXr&wS@_w!T5V+;+q= LNI"3, I |UQEݕXYaDjCy"By!%waY0 #PcPIIItwQ:s M{V9>WTt:{`9sއc[G=:h-zΟw#ʓs]{|w =ssz-wyZ_ׂ  2dٵkwu9+nVͯȒ%KXd sKZC2 mz-eGFM!F*th;MBܬ)mtm[3*6v;|}ୄn8M:-/3{1-5(g2h  D߾}4MCRSS@ȥK]N.G$.]jRHOOow9>ޚ󍍍.=k:h4|`7:z_RRRC##""tR0Ol6Kyaz{SxSAAe` `ժUl6ә;wtɯ~+ڵkFXXÆ cذa%k[n3G"aW(vM{So'52ģi $ `qz{e(Z'uXvB5K!SgngVrrGR>WfЯ_?ᵡdddH Htz)$2 _zcᘘ"66N#22t "TTT$L)?U* U/j5ιˣ嗟n'..lDZ@/rD}6_AA^w ?W_}'|c2vX\bY;w1p5f0X~nGRqr 6; hZ" lPkv;+]p 6qȍbhLu6j55f.561"m`si9}d^XlXDp\KJEfxg:VcLKMfPd"#hlnfcp 4-ʰ>0fNwY6˗;|{\4͔x΅ tLrrԋIsngAӻwoz-ޡMFՒJjjm777s6=` &**HjiH#NII bZQR/38*++9~8}%..8l6vݥYUUzrE|/r   (piNʠA?~ 6=Ny&$&Ixʦ&KLOsz[3D'pFNyY9 m_ݽK8D!JTU{z2cYz ¤`mlX㙽5ueq~Fb!hT*J)ih37ϕ/gzX&]a Ya.uc20 hZ4 VLii&v &ٳgt)))DGGhnn @}uuuٳTbcc CV؈lk9r111DDDjFUUU먹FRR466RVVƙ3g:iXo$::˗9| 39wEIMMubP[[KEEK/rD}[AAAIFW ' "V톽AAAAP^cIXv   #KZ1\z2\oOe5ÔAAAA螺Kr*yhLv*ЩTD]R'C    |Oe],OxIzbZlv;_umn'AAAKL-    "XAAAAd%AAAAAXAAAAd%AAAAAXAAAAd v^`ȑ\e˖;9]{GϞ=y饗زeKM&|I7mĢED-Z0t֧O~ h]v{QSS W" L2DΜ9R\\cǎ`ժUWm\pZ0k,fbĉ YUUŹs(++x۫EWRϺx.o!kG̟?.FJJ SNe򗿤\ , 4i!!!ݻ`'6_~'sڵ]/8"g?Lw8vرc⋝ܹs/SRR AxIHHw tG"$t(<< &⩝3/]^WK0rܩ;j{pٰ0OΨQ{l69~a0`|m1a%K5j… ˔rRRR«gϞ{ :88u7n?n+/>,Ǐo'c$?#|6G?O>F._LYY| [lԩSgϞ< <VӧOغur!'hw{hn .dĈ|?fҤIddd`۹p3_e^I&1h sN֯_˗۬M}M.v,Yƣ>7ό3UUU _Λ C/ vfРAh4N:Ś5kؾ}Gy yYgrw{#O=ޕ*v)䍑#Ge)o> IKKc"$B&K~vwTaѣ=z[o^p8+++s9Vٳgv~+)$$ɓ'?dffbh4$%%1}tx neb!!!3f͛_|f3ghh4 /p%222lٓ3eƏSO=%q#<<\zR4|p-ZŒRXXR\s zm?~3tۗ}%Kܮ[ohl6j߿?wO8q"&!!6KHH ''GZ#CHH/=C~PTnСCLBBBQsx}r+`3_Oskkkh4RZ{f(vI.rTxv{eڵL2<.>}0}tv;-J zAyZ o&aaaft:dgg|rü$̙Cnn.sem&4$&˗c2'? Ve˖JvvuȐ!GV⣏>^ϨQկ~Ÿq8|0ɗ_{GϞ=;v0m4-[ƚ5khhhZnF)Wܹ[8w'44￟￟iӦ{n NYYY7+WݞJԩS{())~ĉnmJ.Tx~!C?ҥK5o aڵٳer'7nV x8u?eٳm='z'o󥫫Zp3LR;s(:TJ-s XVRSS߿:}!==TCvv6vlڴNc0ȭg~wJ$Z_|ijwiw9aFKRr,w_OwO~_y_wYz-T*< G{_|p4z#Gp6oڴ Ç%?j}~N9.q$^[[Ν;ٹsg*@JJ R@; tWb(\$$$0i$Jrr2aaam.Ã:O6l@]]]˟?']Oa222?v=:8?r(}[H74ͼKPKWwЀh6l`{ cXKHHM˗ٵkFb.'W.7xR{ZqrD+[8 z_닯<͗k'N_%o)?/Rǻ'/[~=_=yyyROzmAMgEkv><<\>&/T/<=SKKKy|InZљ3g/O!22R-r%_م _x/^eeeov[Jrܶ_\O_wWj/ft:>̺u݆/ޞ7׆:ST] ]n:唻Rg<yʹfΝ벌so+K M׉f\q_?be|I&LХzqyf '3رc<裲|צMؽ{7Gfdgg77̛onxO׺Cyy9qqqxر\bbb䫯pޖCg_s_xBN)@ %TwDn@ot:z,z›uq"7?}m<+~Zrk_xs|)b&e,ǃ' ?\"G d2>p7A0%''3rHv;W>'VFCDDۧ5YVx89Ƶ|s{~Zee%֭Ӈ_W 83fguXNEEEI̦M?~<;v`ܸq@˜, M98owNgWz"⸘f@KޟYfy/ǻ7+ fΜn 2y裏 S^O8z@v[Jv%r{S-#o8-s`cٮKSbn?rh4 08.1\nԩh4+ ɞv5)pbccIOO@Kk[=qLRy=ɓZ>}PTTO?h,599#FʛrpԳxF 9mY &_|߾}]n~;TqvP.%Oǻ7?NǼyt[gyB2339sf啺o߾n?wuuu;xPZ]} d)Q˥fvC,]  K~x" uuwv]wy􄱶8eJdd$~;~SQQ!MBo̙DDDReֳ{E1zhISRR7o*v RX`sI3c z8z18&ڵkx=ztC=jt;ry{@`򥾾^z]O~̙Cbb}bb"DqvP._Oo@SN=<&Nf㥗^9q+V駟v9>CV`!Bhh(>(]wv5kִ7ǃ]Sl?喻/?%0 ưa<\%Gަh4ETTKoX }zG}b!:: J"''g}oo,ARK~TUU;#<رc3f /_&<<vMqq1w}wY~=z+iii^bKҥK9t:&NW֭[nǛ6,X/7n$66ӧswrwb6h4R?wYGvɛ6\rOgNz&g&~w}W :|p dgg3w\z)vbrl޼#G;`61 h4#G7ǃ.-@{ (q>ŋำٳg3{lvT/]~;ϟOnn.W @ii) .T, "K~R\\̔)SBSPP͛Yv-?x׿5w 55UzUrzDGGSTTrO/2{e„ ׏P9p|$ C*g2H@$ 4 %D(byE,.>6duYbUe.@R(wBB $d~{3O&$|߯/.>s'8\G?}YJ^wޡC|̝;8>$у R!u/+gޗs^קOHIIaӦMEWQgF_>VX W8ݗ?Mfܫ""Rsh*ƬYؿQDTw_<<ڵkIHH`,Zq%ѣGEvv6.deeرc0` ||wWJ`,X0D U]ϦMҹsgKgٲe$$$pwxQ"""""՝j, z`,_, wd;Ù3g޽bL ))R駟8{, 4}HK@Z zͱc ˫#Z|9n4iRm^}Un6̙_|Q … ZٳggϞ :, ?۷f 7'DFFomyQQQxxxpRRR}/׮]fѠA4hwʿR窢<0cƌɀRyQx衇0L\zl|kvm*tww筷2F effbX;iٲwqZjbj/:Vݻw3b:ud*t8???cչǏ?WRbIXt)O>$^tԩØ1c رc|׮U K.g>}}„ ٳ'C aΜ9\x8?,,#G0sL+222ܑvD.Q1o<ի^bBjvZ[CZZkdذa O\p*(}Qdd$:t`,\'NCǎe~|8xSDDDD4bI aʔ)hт9szj.^Hxx8?0oߞ~'O:\q'NҥKddd`XxwYd ;vܹscݺu뮻С׷@=sNKu#3ooV8wE*ټys vUrrr6W\ٳԯ_>~W\p-F%W^e˖̙3?믿 />ɓ]TFpsxMƳ>KTTQQQ@+V?8-:0eܹs>|FHH7SNbӓ_|oool{ӧKWMW@8θYJW+WCs@F%I&뢦2NHHHNy#99Eh""""xiݺ5cƌaʕƔ Giӆڵk+Rh4Rϼeu֭#oZqS'oSyKh.T["ݐ[k0u1^;:5Djϓ'͚5+ܼiW%M_Kb(Vڵ 2O[=z6EDDDD3XrrrСC$&&ĉ?~<;lܸѩUe˖̨Q4h "-- ٌ"~>ΝKv툍eɤEZؾ};F(ϟgϞ=nݚ]dɒR߭[7֭[W6kհD%رc5Çӭ[76l1oaSm7r$O`` v1f\vN:ѴiSBBBɓرyqbq~sMÆ n,_rinZhGe,XǗ*zӧO@ݺuKh;G8s֬Y?;$66`222_ٲeK|fee1qDFI~W,X3g2m4BkLl2ZnM߾}KX CXVKs0gΜRq5Shhh_7Zj$\|_~%c۶mEW_}E@@#G̙3%^{ذaL0$&O\Ə9{,GmTXFF_>VX(̞=Ĉ#Jlfdgg矗)m0{l%DDDDZQbIDDj///?Ү];fQFL4 5k+gŜ:uAR_޽ cʕ=zZ,5kƙ3gXjUۉT$""5 `XVΜ9:x 3f(յV+o۷nݺ\pg͚ŲeoZ" IDATZ{.SB5JP%q̽Kll,M4!((lN8ARR_uEDDDDtX*A%֬YPm۶ /89ʣp""DDDDDD\BŻEDDDDDDD!J,CX($""""""""QbIDDDDDDDDUùiذ!&3gΰqFK\T!J, AAA{4iJvv6ᄇӯ_?ƍǹs\T 'I&K/@BBO='ON:L4aHĒP^=zƍ`Ϟ=L2bcc]T-J, [d2X?o@+56XzjO8@V*-.ڔXl61j0nnJÆ +%&X.^/ӨQ#"G%aпccci޼9fwwJODDDDDDD&%ϳ~zF̀X,xyyѽ{w^~eΉ,Ĵih֬Yc)))|L8LsEDDDDDDbhNpex JϞ= %##]v1gM""""""""Ē䓑?~cwuDDDDDDDR%)z`˖-.FDDDDDDD %D=DDDDDDDD4NhҤ > ֭ĉ\vp F9s&iii.TDDDDDDD %wwwC>} l|,^HUĒpi>3nV#99ݻwh"EDDDDDD1\H^8!"""""""""""""""%DDDDDDDD!J,CX($""""""""Ѫp""""""""X($""""""""qwu""rsi֬nnqe.\DDDDDQ$""jX,,X]8J#DnbK.% E;|-ܹs d߾}< J?~<Ç 55!C8"׉bȑjՊ sJgHH_~%l޼BDDDDDM&00;ҦMbcc d27o>66{(, /^d̞֭=W[rѣC%""???7oGоnjC`` s̩оxtu(R… $&&2h vJ׮]ټys׷X,ӽ{wZh?_|l63~xmۆj- X,bcc[nL4RYJX"""?~]R)?kczA ow<ȲeHJJ"##\׻uc{̙|Wԯ_mн{w|}}Kd2xW3͝;O? 06޽/{cr}E||<]veĈh.\5k5k]L{; ""BZZ'11ufO׮]޽;Ԯ]???9v= .$--@;v 226mČ3}oF޽۷/-[ߟdN>͖-[Xt)W\kw_Odd$\t]v1BZ ooo w֚5kxljd2cf̘ӧ/_-HJJ2o,ϋ/X{.iU0ƎK`߾}|g4oޜ & :|ٸq#Vwwwh޼9,s1zhNvX۾Ԯ]\9sxmX>|8?۷/&<++Ǐc6l`wOׯ?ll3ZoI&Nz#ɓ $;74n8RNN+777z)vZd}bH ooϞ=ڵ]vٍ~׮]ٳǮ]rr$M&/]R);;,f3z*}>gS믿no| ODDDDU4bI $RRRx֭ӧO/0VZe1zhbbbHHH ..զMڴiO?ͪUXtikDBBBׅM .Z={dܸq+x0^jժ, ӦM#22Ǐ?ąODDDDĕXJ ={qrgسg{ߧ{$$$йsgf3s=s=رs}){?oLlْ;qڵL: KJՒ%Kxw4V^mLׯqŋo3Fdgg'0x`|}}1LtH,mܸ777ZnMdd$j2:u… feeo|M.\XlG6ɓ'ۍ:}43gδk7iԩFbqϞ=̙3 ֨Q#nBG/$&&sN8`$t'*ۍMfP1cqqqԪUk~`` fVf_H*9rgy ODDDDՔXRRRC.]XjU\J>++$ O>$$$_ڵkGrrKȟ\(gٳ þQPP:33ӡz< .,t^Gn+{f͚;vĉ -1@.\`75tΝvSRSSٹs"gShm~T=Gȑ#v~wv J,%ɻR*[ӦMǎ{VM61hРbQ3tD@@@ .]ij>[KberW{pss#''>}{\|$f3kvh$==x{Q_z'{l6^4ͧ06]TNjժeL*Jf͚oztQ}?Eܹs+l_yySۜ? .c@+6ڍ99V@ua<M%𤤤2Mv?WSbI | $--1 AGqk׮Ç;… 4n(~ҍ[n}޽ƒ;vwެ[[;%*vq򞟻.yf>3?ԩov*l3G앶”uZEl_aHI .TmJ*o"""""Ē1ҸqcN_v67~-ԝ$;._Lzؾ};>l7r'O R~iiiF2s֭[uo\(?b 1F+->>|^JVVVm$۟|tir777:wll߸#ƌ:u* FR);; 6sq}1g%JavWP얌⧟~*:j'ECBB=zt}>|.9^K믿###|ۘҖ K _;ֶmڭgX-(Zn] xo>uxx8M4;wvϯTjҤ aaaƶ[V+voѣ=z4WDDDDD\M~4mu@@ݱ+lٲ8oՋ|I4h`[~}c>|]gs=l۶Mq[yG>|8;vOm۶5mڴGyΞ=˂ ;3͛znjjo5^[,^{I ??|観gCBBhذݴiSzUh;v0^{yy3퍏>l^fd2?:_4h1c0aqڵk~N&Nhjݺ5qĉ.`dbܸqxzzb2xK5rgwY6Zstx+?WTQѳgOzilϟ?>]{f ]y̙3Ʋ啝͛Yl۶m+ 0~x 7:?^kΝ;lgᩧ*4}vc%rڵM6#TڶmˬYz*)))ڍ*ʳqF:tpXv-^^^۷Ȣk׮6ٷo_# e6éqӦMl߾ݘؠAyV+6/'Nl2 @LL '==ݮ93\fرvO}/Ǎݺuc…\~L}>f3-[4'3tPwӋ\YF, ;nE~LKK_vʊQfbĈKlٲEI%'X`˗//jeʔ)EWիW5kC =wʕΝ;]+[nG $e˖k.cڵ{:t(~~~||`l6c69qӒ7#J<3$%%e4jԈ)Sf͚JSDDDDDDT8)L&l6UEDDDDDDp5ГO>Y#???_HDDDDDDD/XNU'Npq4"""""""՗F,Mcǎ5@6lʑ#G\H5ĒjժEtt4;v۷aTkJ,Ma͚5ZMDDDDDDTcIDDDDDDDDĒ8D%qK""""""""%DDDDDDDD!J,CX:q.Dtt4Epp0SLa͚5X,ۗ.]APP=z7pB+󭈈HR ˋ///jՊVZ1p@&NȩSTcJ,@۷{o>^{bwssˋǏrJoιs np?R IDATAL21cƐ]IDDDDDDDD2%jW2p@V+%Z|wl6cK8tiii?MҡCnZa񋈈H5f3JźuJ%&&#""J,I^jL+kJDDDDDDDj.%D͛7l6o>G#"""""""UKR{C{nG#"""""""UKR8Cvv6nuDDDDDDDĒyO>aϞ=.HDDDDDDD%P筷ח%K0o{vɹVјݍ>=||[oۆ53>)v=t:SAfM۬ ^?g%ޗd/Ҹ9ٸ mghsz~<[qw/>G["~~IKȈ"5?G8K"""DhٱRGU5_hԮ{|2WYDq`^g"M rq3{N !ї~rƊty=⿼O`L+~Adɣeg3W Jƨѭ/]oVqr ґ~[zvgwF_A0d+fdާڴORߟҊG{a2gR? ;uuxW/۵Y4u{it5#}?ТK'[LG998~Ox N|^=]Jиu4{Vˊir}\MN3Z0۳f~wI%SX?kӓȶZIx3pǝd^FVF&j5o?ar3mR6Νg$ˬ6K`WhDsL&iٶhTHx+V%m{zbt<ץd|4 h)}&`96l96l96oZ6GہC+F'DDDX)Ա=?vsu(5BlBUJs6sPAhR;*=%jJO@Hxc4iLNN;YUhN Wn 537텻gm+_~%i}׮qq#jpK$>l6~Nڀ-h|y*F'DDD4NDDP.e¥8>_/չ!O6ԩ7&QX3Y?o_vVX#`a EƓ\p3bח;_W%B_4.w6rG^]OK+p<#*W.\ n+琧2Ka{BDDD%)ΕF<ظr"0F5Rf@[-'F}y[@ w[J#.%Y~t-Wp|z[\Ge嗓>Mnm-~JP+iD+琧2N%Bt6X1Cn8.h=<71<8s7?I=wޏ"o/aSY8{aro&KDNoI٭ ݺaX^.9˪i!Wݗ{BDDD%B5mH0u5J֪%~Adgebt22 7FXj*5vZˮUk4G?@tw8?'m #S,y#|ʢ"""J,jr27o%ǚ]׮l/o/cE7g8䨑 zS o ٽAn&Ov5|~Nk0LGQzbr+xmW{BDDD%B y'|Fxxz{} Nr]Uw_ɶZe˓Fy-ݩ}nrl4؞xnČBd[3v]6 }g'.k'0L\KI#N2d[Ծ#EL&Ln&"v{tj;psp=!""RoABEw3ggw&Ѽ^cFk(co=FnWե^y ~=ѕr=- Oݵsii}k~t:Ydedqމٵ3h>&cH O_ 7ɲOɶZ#$~AK"[XTKzysMyyuR¢n- x)@nܩkZ4+П\2~OTuJ,؞WG:ʏK!yLNxc==I>y}6sjn{>KN+m$иM4=.:k.rG@0E%MDW󺹹%J}nnYKk% o]T\u.?ƙg@83 s>933\,b-\?'\I ud(\}}`EŸy2NM݂F/k[W{{jm,KF$OCU! v| KOh:@X=t4DDDSؚDDDDDDDD9HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDxs. =ƦO4\XDx琐T!-- Vj1]kYs,YbaV\4L>XN'ѷQd!BϡCc`u ꪪPYr7/^F(ɅR4uyZ1#!C(Y1{񰷷GZZ]!1e̚5 P]]@YYnllĹs4{{{7synͥӸL}=YDDD5-|{jmv;+(碶d} WɿRmeF>.&M񃮑ܽ{&>>>ku05PUUyi7o + sk.4)4%S_OC O'4|4vGQUz+KቁE};)] z%&&"11Xppp 55M= CsrBuy9.o@!x̝;UǾ[پj*DEE᫯¦MSOaĉRDAAك}ieffo[y۷/aPMV#Cń {{{TVVgΜf߾}ږe˖_}Mh_|E"`ԩ5j<<[f "##n:DGGo߾((({gR,YzBQQ֯_Ls=#"""z,b$m , e!c’ eek>G?D"^Q>e%P[KxwpOt$lܤ!d'#bXB@me$p~'_]V[h X"AVVjZWaiW_TOMz).9lw?@ie`ieo/r9,b8b`s_4?6o K/ԪVIIdĵkPQQu3}tZۂ0f۷ɈC߾}bsO>d!/hfΜ?\ XYY!((AAAppputeee~ S*?D!!iӦSN:6Dkע_~G= j`رZ_jjjT*ѥKtGʕ+qa䗗N:,--j.^L9N%ԃF¢E }A>}0`Y/cxnz wc/z8u1i$曘9s&5 ĴiӠT*f >kkbڞ`3ih~B9s@,C,+Wĝ;w\___,_&MҺnjψH?RI6Sv1YC!ЦjQ( tȿ̆ʨ|Bz٪IFwqn$VVW^BϡQxdQnODfr d {g V^9N"I/o\W[GNGqMcH&t2i/Nڇƺ:8bWеwFΝ/,EuYNcPY\KW(7ΝKx8zS^]tpa/;v쀇6o@PPÑo7oބ """4Al #G֭[u3bD"";;۰hoooL:TaÆi>?m-7n 1{l\r7oc֭s^xL&úupA( 2o1cd8x :,TWx饗Kŋ(--58?u`_~퇮gH=UXX/^ ؾ};v܉2HRDGG^ȑ#qٳǠܶ>Rl_ZKh=lڴ aaa̙3qF|MH$$&&I!ŐiH{fg?Sߟ'=ł ͛7555x ɐjz-=#""",QY\? Co*`@fd.#l(]|8 J'D=G,D8__d ij^qcy>HrLګ *@2MNʼnov~Q >AUc'qt{YeI){ߨV|z ?DQnU% e"""k.,[ gϞEii)󑔔+VhG{#FenIHHD"JJJuV͗0(..Fbb"lb|R)/_+WT=JKKuuu +H4}gHIIsXڽ{7VZGj PVVɁT*Ő!CW_n݊?W}}=RSS5,Lґh}O FZ g͚???O>1Z9MݾC{Otd2ըÙ3)vIcn )?\Wq3!&6z l/]!Rt~Jne\u_W( d~?s\ a'wgU Z Tof T.JXW_2PͧϭWQ^Pwnzuh;{ :uJK0ZlڴIᆭh8p2 >>>aMjL&ÁڵSw?hccc^?-9wnܸ+K.pppRw}s( aJ \.Ν;ХKvmwCڵk!o &&?<;h 2sh̩Iyy&U ܹ3lψG7e2Nڇ FA+(^A9t0}&s++G1PUZ Gw7 zT(kyIDATy͖KP.Ψ*Uu{ YClmۋq>ܺtEQѯyzQowѻv5wUsBYY[7qq΄ďg϶jJ9r5j.]7jܱct11K.׿ݻw#33SPtMտ7篤D˃ZUUe2cĉlmmuvvvFQ* ^s47)>S{k. 89 a3s?sҴw WygDDD#ڽrMNTD"uEgFWt鍁 A5cjuDBޟTW,;Cgdr0|4x30~>UϺK? =g{%IPcB"u4=ID:RAxINNFtt4bcc@&A,#66o:Rii)֯_#88XaOFrrr"k._,/25¨p^P((..F^^W7\]]58;;P}1SO<ɦҖ 0z7V=];v쀕.\$0}b9՟9ikUP6kUJ%JGB.GhFV! Baͧmƕ#q#ëGꂠ4x ~b2u\;!wGU_Eɓ(--+tDDDs(//DZcڱZzRRRp Ġw ;Ç㣏>jv)=l'µP{ 0n8d\ٳgwt1zAsۣNjsi̥7>k{FDDd.$jf66FTuN:T8SSN2F:uo{ͦ{ 7|ͯǶ7jS!︡T,,,-e2JB@JJ ߆9j&WN k9rrrj1}yy9rJL<3f@VV<?3R5~Bcx'쌆,_\'6OzXC4ORƨ̙3JJXl&Paln_qgDDD㚚vIn:U['/"zKOm7H$5j٪ 8:;[g%yױA!Cli W_s~B,6J^~CUꀎ)$''///DEE0jpyDm&%K@. ݻw7J9PO7dooOOO姞֭[ɀ 1Z~M=&;V??.~nU]NCJHJJo7n{3gK_[c\G=3_GZݞV`] m1AH9kj4+K]zWo/«٨WHa:{ n J]_"ķ8 K S"CrYWjTACzL \ShAQyg=[֭… ~ݻCյuΟ?D~Rٚ`{W[la_$iȕ.\jD"<3:G3W!̻0~G犱nݺx\vv6TϘ1vЧI ϭ꽽ih=̙3q>cժUdCddj-ڳ?SuD~hxEmbKKX30b.QDY2Q/M"]{Ud8}*`8Pеw"Lһt_AP{D?]V%k{{ ˗ vZ4/Aup3́H$BME%JmEѰӳU SayJW]l;uBc]R=o[[[o$z*`رz{גz"YcVӧOP}3g k>?ǚ5k5<˖-H$Byyf؈D/s3f@fJM?믿.R'Nī4GɌ϶۸q#  wyG~GGGbÆ XhϭzD\\r9V^3_~g}Xxm-3cί-:=#"""6]LqzwZ sY֧7ƎFP3PsSI{=^Ee .Abi xpRind]O>н?tP6YJ+ZD"~I}=,,`ek@: hC]0mzTh6jy >W˗h7iZ(q=q>~ !*gurf׮]=z4v;vP3eƍ8wθ0o<@.~0ŋ8q ɓ'cɚe9\at{D"DFFj~宪f9F:e˖Ez]>}ac,X`p/DXX+Vܹ3Μ9+++k޽5k~iƢvvvH$8q 1agcC^^RRR0j(,\s ? ͱNڵkpBDEE!** uuudm~guMѾggg,^e~m۶aРA ҥKh"{LhT[13S_S~kK~~_TKb˼9>! k{ BME~'_"r$ =JJqpNIy֛F.au0=+q69G'"V.Ww(t}2..q6 plJs%g4֡듡pKT87w nxK+E3 8yzj?jdZD" af䟿Чc+8;U.''_ / $$>>>^1k]]N>(8q[bf̘aÆEEE}v,_\oTԠ+,--q-dffbǎ׭xxxlԩN3c Skll… 1uT9Ebb"~z;7۶mCaa!&MHR\~HLLܹsUk׮Eaa!Fwww]ڿ?pxxx@" ??7n'?3)[cԻڗԃH$ҥK˗/c֭:O?4if4\Ocg*LזLt\{FDDD*"OOO}ݰƹvOGKKK|7pttq.cg۶m¢EpɎ.=fmN]<LvOGԒX8::G!D;u3]jHnݺa{vJ*_GXXbf/-[8pfe/""""""z5,,0?5 %%HwV-]z=?mhwE=4˓a\*eaa1c`̘1d}65KXbƍ\J""""""j--R YC $Vw Dp~Ai3jL+4QL<>>>DZbŊv@TrR...H$v[{a/C""""""sOMDDDDDDDDcKDDDDDDDD$KDDDDDDDD$KDDDDDDDD$KDDDDDDDD$KDDDDDDDD$KDDDDDDDD$KDDDDDDDD$KDDDDDDDD$ك>IENDB`color-eyre-0.6.2/pictures/minimal.png000064400000000000000000002642120072674642500157420ustar 00000000000000PNG  IHDR 67MsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxTeLLzO$BoH("`òˢgY,k/kUUY;R\"HBzL1$C&!e 纸Ȝ99g̜s܏/#    AAAA"F    0AAAA|:pitt3C8]j    "`$MHk72wPAAA]AAAA"`$mTut3AAA!DH@$f^9{'BШL"KP*n   \D #AhkN,n}#/[$]ZFwI=H@Ss6*d}xAAJf&ZsgLEpv0q#6V +}zg< g3$2iM^e'f̘-š5k5k9V 8&&t'=%f̰Tg劓,n?;…b}?'mhs  #2zu175~c+KrxGĆG3`5Sf,  \MӭK}})Sg}4zqQVq:$ٹsx"OhxuS``gtK$ջ:xU|SO9p=#unr;hgpH'u/=:Xm%;LP`syl&_!I(eJ%iZ N˭V~V*q w$RIi`郉jk *8mȎ$㭕U|}$Ru 1ML:P M^* u"%XNdIJ*A:8`j}D;9pV$qÛ8Q|nA.$a1Lιxω}"Jmvj{Ļ=NVx(tee%'Om- j`ڄt!X͙.LI-8ll"}.Kg9=Kh^9ױnWó#}#9pM"] JߩߛAjOo#Xn~קGrLYt v:y &pr$nnQngVOjGEq,:N)aQ+LIkv`ڥtRININKnT$s?7*kiqbXTYa~8րmOAth蛗^cp.{FFOzĕYc!w2] ,.fMf,梼Sm |Yh-:l0-SǥsO)ɳQpĊ$LT#ՒՉޙ117syqtnu}vJ~lfDEPmSFf (f]l.C trOt4 kjx5'&rdFp0*:u5UVR`qulWĠ*-m*`Jb!]Nln7AA(k:wNGmV8)!%%AA]\.n\ߝ-˸NAիqBwMNrB(ƙ/.LI@F Nj~FJSHaZKbTs+~yem\ᖸ06VsO;Ou=ߣkN|3/jɫ Bn^] O 4D-35[ޞ,JOYJ̓Mt ]geɃqqhT*dhl,:Ϲf,cv8z L&hxutOC\C:0ngasiDx-;X[^j잌SB V0VmcbPԾ>.Y?y8bpylEGlAl?Ak2`$)$2 &sX]S TWS]\m;صGl&2g#5VGMU{)9~"ot=ٓӧOgĈDEEQZZձLZKP_્߃$1pl;]mg;fk e[Wykߵ%1*0}:"vm?Rc4ڶNcحAfk9t(;b4q&OEy̚7g$I ͰINbp({fj]? WD}2{ ]bQ)UT+Xo7|#n)% $a .믿pƠ--;|p&MDzz:jJJJغu+˗/ȑ#ic86xmo+[lOHS#*IB EG, I/!^YO?5gb=mݣUɌNyto{2˞)q]t w|zF;a 3> ZƄt7)#*0A7xs재s='`̘1,[9sGT_O?ʕ+ϵ4hC !--8(++c۶m,\X \6#FRy&_8yi)GT%̉$4?*<36mdӍyg7am%eP\wtLTAčI*7v Lx& mZ^n(d{ !66 ,DA{sөgw $v s2߿9eP#.LT$Ç14>~Hc0[}Ǒ= h/2t]hs>7/͆{ҹO/s|n6b"}k5ۆ_k_4iܱX,2vXFͬYX~e5 o]vrT*g鄅kMQ*] ^0x.5[k0P|u:}^ɕc+XLZb*iOhi0č\>p}(c:ѽSO=4A0~} II 9׿|lLn>"bHJ H[+Fn)T3xIPh׮]%$$۲!3g䦛<].UUUj222 $$^x!0ݨ@jtdJO9}؂6P)H#"l(>,nSd{yG9"1aűK kg$4^okMgT$ +0&x?2fJl߿?aaal6֭lꫯ{>AeILLdܸqbσ>Hvv6=ӧO&LÙ8q"ͣM1k8;N^)B D‘$N䕜"Dgmq9).TIBth]b fЉg|,eCPXQ&HMd"/- D9'5::t>Wr'g;.'Xd).'*4sLwo?j)Jn1رb5K{3S/ѣ>nIJJbڴi̝;?[m966\Mw@Ȳ'm+`MX\hT 4 ӵ$k(@1Xe F ]Ýj\:%V|vm U jXqFL&l~F9 6`=@p[N+VrJvڅ乙[oei|p2F8:鴌 mbll 37mXoR?ꏭV 4HI PQ(e`:**f'~dLhl FРwxB<\}\p߾J33_= ĉm;=#ۓ*VPUXJ!wVlT2xo}.Rɐi1p•t1_~MBlڂrO(K| і_[u7WfTaa!ߘ?>L4{ٳg@ii)=\r ZbŊv9]m l7 S>ON̚0VAFR7/'΁;*rn1A}F:ן_oZ-]')*AY|_w.=x?Z#u!Gl*>[N Bu'qU 96.$IB bؾ4AzvfbuXv\Aի$QRR¼y|+..|`N+4299]kbYCQjJc5CQ8 Ku餚Dp5l?#`dbm*(xclWt2ku(eP^}\lV-Nu1vXF(`T*6lVV[t)K4^^^믿N>}HKKcС,]&&FffUE5[q(P4Y٬T(,()aIv|g?nԵe))k0::`4aRmW4$Qr߂_H5 FXv8ZY6YtI 1߂"Lg#A!]}v[e} N]S]\†{:Aw\Q eI fxb6zhUVg@n@аaPqݯ_?"""X,lܸ_,sA=% ,Q*V*R)qHA̟FbKNN]{-o?C<U*BBT$:-3 ٸJI>hW10mQt tKkL8ÀF{$. CT2<*3Ajl|ZeC_a޿OS~ʷvs}>Fz{;[wH|y6}v돥P04,@tr}b~fQHѝS{vi7Xr:9/ͮξig[8w mԩS~[/Ѫpwz<ҭtyn~8nZ}:H.=㊛={*}@`=RpO~:sۏbω;@S[BoB=g4;~˷wzG(/I |QPs=3b c][t޽l6  K.e۶m 2Ds2WO ,$\n0lwqS/;a\WO0mh';Y8,/ܪFXOhifɪf˖-FBBB8p 6m>7b֭[FL:,A @osun Q àxLLT&?W_H{AZ^G{w&f|x5(#vjISpsĴ]FzS=l]d|o &{tlѱ-FFG2&,fvUmg3>.UAB(` 154WT"eoLtV '2-nLJ2Ək/ o78,Q7,ݛXFŨQx뭷XpaFrg[+X^eN;#|, v `̝3ET۔}\G|oJ-jrMGWy? جB_"?rW3|p^~e\.}%""ujVƍyW)8Ǚx &;֟hqV l&XIDh0c*{_j7ӻKos<k8UboT, I`UC##/.=MNk,v? 1oѽAp$Ilzd́a cCy:YaLKJ~-/.’+iTJ,.ϠR6;  WQMU5!ўn- -ZIMU}a?Ct.1po<]/r؞w0R],O⧟kZGδkQ(BBdg]GKla IDATdJ%!!!~=u^Ng)=[`QuwtXJvWs7ְf?J>\)\@|D,=36h\>`$7|Ӯv-FC=u] "ze$vW /0,^ŋ}G>}1c}]ك"e_i J%m$D)=2.C1m}(G_:;ڑ '*>R ^jWTR_}#Xm6*++ gl޼;:ڵkq83e߾}n3{FDDDd[}$ UT$nh&Xg$rIٗcpqWC0e5!lfQU+$kV3G;]Aڲ RjAvG !ܚ6X^\ʗ[l>P`d.(x- \LABf:1)](9޸ZB.:|;${dR"} e -\\觞-}D8 bٵEGS'k FFHԬ.<-L^mgkۅ%33Ǐy;0a8`Q>ŠsT **sOgGe ʋ((/bՎxpr)&2gvk.+Xaq]OK lߥRAFr(<e~H:ģ>ҥKQtڕ;vŲ n7èNvrqK;@ˎhxl'Hviav)=%_J:%ůǤX~s.7Niʸn6Gׇ˨\]t|u6uŚ5k8q"#Gd֭ >lwXO|"RI^ IGTRrUZ,tC@^U',ru:)fWmAd(kKN}BHhD^U3| 1pGNYV\׭ '-VLPz]%I=B곶D  Ek{HUUS{"ebyY.gu?3k7֣g3}5,(ȱ37Kuop(w*N<otG;lr>LZZ&Lh0t3 `ٴJ_'?~~Aʪˉ\G‰St"ff5M#hqڎAfB HY 5ѝ̀O .*Ej*&NȰaXr%QQQLת˔EVcO81F;\ApAɆR#Ym6CCҠcmZmDkh .Dw(Mpu@{RE}drf  %A]"o cy uGNdvYmd8kZ zf${E[+ZYӶ:&> [N,D0O`Nd8f-"Z]L^ձA_FWyG7o$d2,ڮb ^YP2ӹWpZꧏ?۝)#[=N=sKsXBBP7HmXM&_+ ), qqq ͂b&DG y n9vM2l2T)?I'^,cZ ը9{ˎ#K$n.kq-άFn32q1J>tnif3L̰21G4u^QEN쎫Y[U)0]vIYYQQQsgիW7l6z~^{ шFa}ݘ怍5jL_Tl,C Dt&ڙ+;UbDRrHJ%]hb {4]D;BcUI tFVgn7^PYefXVTBP IB)I޹Hv1қ  4QHe{M&i`zCn?Wx2(Pl+VпƏ-´iӰX,jcN9sPRa6з97ss-ffY[s(\ʕc8~]&H]LNjqO~sؾ/NK} Qrޮn:o")SԬvA)IqYfUB5ׯϼE<0cK?F~wI[ʳ#Ī :;sݬ^)S)h\w*++y;3f G^JbӦM0iҤT*qq=EnIjmѷsBEZd$.0\eefFx-tǖUmddt4!:V{kBZn=~ׯKSA#Lɿ1,ÇuKciy;vsJe\߼:CspbSSPi5X֯XZH YL9٬@l|XrKf !ĥu%8,MMe N_Ry: Xlgkl޼ &V۷3|ZG زEs%=X.'NjOXl&Fs"SqCi:ڱ.FYLIU9/!1*ZdVf/`@ 1 )v20U'o?[v!իqqqѯoXE@?@MM \r DGGD~~>۶m>Ɯ.[o sk(DV^1E,r50"P_lSq.6VSeS MvT]d%8:Mz LfժUL2*mm}?|puבFĉ,Z{7@{A$/ J֗lfFL|g2blf'2ghTAee}R:brS}&lrN["58RA^e%Tbׂ 9"Njo wϠHO헂|3ܢ߆n ̾ai| //\L^Um w6tU\ W]@IKIBNJ% ydYt!g7kpLbN:E TTVefFGV*q2.k~2AjC;l?f3cZӧ9na6AA~.Mb1,xAm{( C"#)3(uѪ%qt} z(,#;FVDI,ޭ*E¯3YRTP5N'b$$F-2UF3%ĕY,|p0"`AA5 PzJNGlo* |"A,á2*f "%FN-!˲VѲ`jѥKubBBV8pDBARI5'0:TlTH͆ yAA(4. OaWA8w>8q 5ΦGi&8hz/ >d^w Sqm-yAžBq+: bomO].f3n7UʖGdP2T*$C #j].2r:);ɆϾܲߖ)=|rp -3QAƆA礠   ֈ    CqYAAAA0AAAA|    CAAAA"`$    PutADFF_4l2̙-AAAMAh;   &F h>>ZSÂSY    BGiT:b%BVCVtDAAAAK ',(:%p@ V6&==Sҷo_e'NvZ,YBuuw^NǠA2diiiDYY۶mc…8qm=3 6;pe1uTRSSeӧO__{QTL6cGUUk֬aܹ<ݛ7xE5^nn.'N$33NGyy9۶mcͶZO=̛7s6Z_ .䭷j4}޼y̟?ӧ3b(--?uϝs-99n,l9r+W"˲wl^x\.wun[n3fP^^wAee%жzΜ9 /0bӧy)--GG/m6/YYY[3gҷo_J%G?gz<ۣuÇ3i$1 TWWSRR֭[Y|9G=K|9_SAA#gLI LbR|,埻iӧOnC222ꪫJ? LBff/aҤI\., ;ѣG3k,֯_#z-ٿh4t˅R$>>ӧktcCRy.555zG~4hsޔo޼Equ3sLw}L>Y3g7X;nJ%Jz)HMMrٳ|[oEpp0& ZM޽ݻ7|~aώ2sLn&󾭪BV{?BBBx|iמϗx  pqij#[* `hT+8b x#&L)**<#0M'2o<e<#,X R^^FaĈw}\q޽/һ;ÀHKKc̙jqT*-_~^{#G|@dd$555\s58NΝKNݻOq8qO=GAqmq72}t~a|KJJbڴi̝;?@ll,7Z_[?_.)  ŧQ >/t%:%jj̜9%K/zE>-]gy 6xoy9|0C6l,Y¬Yؾ};_.)  ŧـӅDZ5W999t:ya,sAզ9wysuuwzMHH,74oٲeF###IKK૯+V0xfV-ٿ@رcyyy>L&G 111`:_HKKrpBu-JLL$66Ǐo#Iȑ#2e v~Q0hy]QQY,uFٳǏ7l2 lhMvIP֎6:&U[i@=8xOQ떈eԩdee@pppZ^:oiJn()))c4)**"!!gzjj]wRK/N:wz]ƃ;={g}j6R\\ܒ%KKft~3uz^7̂n{T[̾@ƙ:^LLLk@e޽l6  K.e۶m-jOk_~\LSAAYF H)(%iI |8Qv())irYYY}mPUU ZݻYxqhy0 .46un7ڮCPZZ/_Wz TUUe[6oh~m|   ,.75.': $a;pVeƍ0a„viў6s5לvG߿ˏ9IOO'%%oQ fsxRsl26mȑ#ӧ{&66QF1j(z-`}r!OAAA~=Z0CT /~jjE]۷/vfϞ7Ґ:-mUȖ k4R$$$oQ:Ny:֔LnpĴnWjj*w}7,}v Y뮻|?j~ZeL8󺢢ŋ{ӹӧ3f#   g'fDT/U3YuFs9mN]p)??MRW^kc]昘7u&մ9Uu\$Qw߂s3**V/V5kjŋѵkWF󺡌 ih]nl@ׇGrVڵ~m|)  oG#$qsDf6HmذшJ;hr>.s'66է'4cݘL&$I+l_FOyy9`„ t37mQuO>1rrrfuCq1Pd IDAT?4}SN}ݤǿol6< Nɓ'3>ٳߠرcشiSݢI]tiv=mg$y Gkϗ8   v40*.8MϢӅ8;xk$..|\\ӟ䝶sNz~[\Z0uTfsp8Xh~;#Gޜegg?w 0bf̘NO?MDD%Kmescyw$Idgg׿5bov:t(O?OP%44ѣGkC,ɓq\R(<ތV]we?e?2~f xU[)S0gF}Sz֬YHDEErm}r   M2*&x抦Gi(O?~<& R \;ee%>wy'cƌaTWWQTlڴ&M6~' 0~Ob2p8DDDuVj5{n܊+߿?Ǐ[naڴiX,oƔdΜ9%.æM4h_=_w8ur6v͛72l0 jtdm߾wdd$<}Y租~ݻ7==,wy]~ 77ɄNCTgϞ&=v˖-cر<{ޮ`/k׮ۖm=%I"''Ǜf4Q(>CG:(DE{ h6&FWk6jAfj$6ͪ`"DlX""Hi~0 ef`@>yν{ιsss5<_~ZC!oI!Bi?6q-wB]j47oƹs0~xUUUsΟ?}sN!22^^^Fbb"0w\O*b2e GGGTTT !!qqqXv-h䫯ŋ1zh@(رc\G3f ,, x 9]v!::3G눈@PPr %%'NPаdX[[֭[8\._|dVjr9s ** =zT*۷w^$''7xUCY]ۼFMIOcЧ\'&&{'񐛛+W`8N3~i$B!,'''I9vHڕw=¢X[sN8;;c…pႩCHYAAAظq#on~!B!4F\ s6y9N=}֢jk LƬ\D!@ !B!4UVa Fj_͛$\v &vwwDzeIIIJIXTB!BZ#%36#F`Ĉdx1B!,wff&֯_oXB"_!B!U҈jlܸԩ ˑdZ'%PB!BimNzM!B!B/I !B!BHF FB!B!D 5B!B!54鵞ܬb ;!mKG!B!4px3I8K!B!B/F7=LѓDwLn:$''#""EkNSNErrϼyL6-** Ɉ})3>׷rJ$''cF9_Kibo"..Lb {n˨ah"$''_~r  99r~]B!mSaa8Z6j߸5~I3LjQZZtLӋX,Frr2߿oBix"su<|dsBvKΝ1ddddٳƏ ۷c1cΜ9L,5]vŴiX|={۶mCYYÛ9s&zz?b۶mF+!EΝ;XpjDFFYYYM~)..FNNZ:jx<&O!C %%%8}4<&MBPPQUUL:t-] ±cǰrJp8طo|roFΦEXX㵦={`Æ Z۱cO8z(mۦzXXƌD"ʕ+رc5_f qF={3g΄?8233w^ XԩSXlkZr%BCCzj 0x+b֭ooox{{W׮]äIлwoXf֒> HMMպOjj*<<<' JBښv`$rj(- N0ة=l_ |R<nco}M m5]-a(@*|8}4`XxО={?ڵ {AQQ 2dnܸ8<$ b1jW Ѧʏ=yyy5kn߾ {{{̛7ǘ1cOkq ##WWWL2{ 0>)+++tرY&/oO999X;֭[P(v777֌?~XZ֬dڵKj*/ְgИnjM{Wd~+&acϏ~I寡_խ>y|$$$`֭ Ϟ=7\k {QQD"6mڄ3]47#]\\ԺtW  ***¶իx6D{I[[[xyyYYE|-}^ZZַǎ4Coc^cDtt48٣1ׇZ0E=r枩K z`aaR_Ucǎ5[5З1֮JwּB Z?Sgoy1`ՊzXջW$ۻ1TAi-q B*Cz^ku{SD}5$<㏘1cFwEBB |rp8#Bڒv=$=zPwiq%\jsW̓{Eyҽ |5!f>2n壸s>xwɳ 8[iӽ;Y wtySwX\TR ݱx6VNԼ*-- O[MF[=OOO;wh=Nu^077G|0y٦X,>888ƍZѷ\{ROf"FE*MS*zC5˅AC]tf*οROK[ & ((033ӸOu]#55-/Ƹ /y& _r^Q anͭ%`VVΝ;@kcמ={>C|j~w) ]QK5̿ROKk?B bsWWW7X\3Fb T=yz3fQ{[^q?תƁW^y}kbX5K.xHKKkBl_.dX,V,((5si&''<#V^իWcFO$[M0ΝSXBښub?ï\ow65f)ᅧo`2#S  I;ofj䙝}:CٺlX,b:dʊ}<cc̸K;KRw1_u{:]~= ˗5VXZZbopB_v O>5̙fIaLf 4K|q={6,,,b?n,vPR\TTԭj[TTTZgوaB!f͚^zATb޽:V4rV>oC.cpS S, 111LO#@(ݻw}+Jxw<cƌ^җ)4^vR)G1C&L9s6z?W^PéǏʕ+6˖-³gtΩҭ[7@ffg%{AEEGGGX,`jGGژwݻw^`` mۆwyppp`̞=@J.\P XBښklF31[^di-ue`.<~' :mBOmًKqpG*&7éi,|R{w femۆ#66S 0]U_x"VZ _~ׯ*++!hj WPɓ?~<0Z@ZZRRR'bĉrgϞ\.gVu3Ǐ#00F´i0eTTT0i)ɰrJ~ "NP-[v6l<<<{n1C;֯_rٲecV o7|voxFuu5͛[lQ+wk}TDRRBCCDPȼ͎xݾ};z쉀@"@*/_χq-}?[/㧟~ᅬAa(--9\.RRRc-nCˋ pu8x0X,BCC fl6 sss5f_~ej^کz[[>}/ݻz b w}Wyo޼*/PKЮs=:8Y@l)@EU JqCy4Ve?4W;BlQ䯤 %*q n\y6ws(TRw?Ư!|' Q]]cʔ)2dQRRÇĪUt{Q\~ #\.rrrcj&ļrѯ1111c`ii'Oȑ#صkW_}/bP(Daa!RSScH^9s ** =zT*۷wz@FF>L:ݻwӅ RwGGGsXYYi40CmX}ʵ!1"66oz"77s3Lwo}[T ]_EEk\CRBS꥝;w"//@ @vv6s5nMI:t=zAm0JLLDyy9z OOOۃ!77W\ݻ&W AAAd8vX-OٳoGx Ξ=[}2覆 6wpuu%D"$ #11Qk1 !E,''s ZBکSbƌpB]ے5k ((7nMB^J;w3.\1Q5@GEE1s#u|ݻ2eJ'/Ǹq0o<$''kB!uÈTnݘOf 2~޼8֚Kuu5mۆsbҤIö ""r) !&&%%::裏гgOfٲejSRtޝ3I./G0jԨf[7ހ+9f B15aDKf4lfcĈ1bd2?~ P\0A IcTWWcɒ%ذafϞ7nΝ;>>""bɸ~E1f,ZÆ DZb DlW3B^o};1l9egHܟgk}+/v/x.~sܹs5gۖ.]3g0D"^S\r{AvvΰWX~aǎc„ RģG/1\.SLСC舒:u qqqXjUBcҤI =C~R4J2j(bdddŋZxmΜ9xwۇǏk0k={`Æ j/jLz65]zjr̚5KkiӦ!** EEExP\\ @A5ի1`ѣGꫯPXXŋ[nx ֮]+W0ǮYAAAظq#Ξ=3gػw/N<`:6;v,v XRHJJBfffo( )Ӑz3B!5AQDoUo#cb֢pjG.VXi"rtrEٷOXˏ/}M Dm9rZJyy9J%\\\aÆ!66QQQQ6m6ooo1i0rXjzbǏXʡCb…rL\`ʕC! EDDݽ"V^ @UU,,,0n8A&ruuŷ~ X D___K.0$./^DBB"##'`̙JvӧCTbʕLc`0{lp8p8t x)<==!hDFFi8ذa H???lڴ [lit6Dr6sL[\|x{{Xzu76O<!Bn`dvRTKٻ_uÆT*a؛g2eUwSW{Mkjlx,01ZcBRˆo&\N< {n8::bӦM 6d2?~_Qo6ƍ%K -- :퍠 :u Ç!c5{AQQ 2dnܸ_~tfСq o?_00/75x`>@FFB!MiӦaʔ)HIIQ٢/}OƤ?gϞ̙3~z'|.\pA-BH0afff#55ӥK5s }V)++Ó'O쬶@M/?\r98_o\J(//׺ONd(--9OײjzCimh,}OƤ1xWtoM}YTWWNEܜƥ/C͛X,_ʕ+MOcijޖ3B! 5_౾q)RqИI.vƆg.o3-+5AAA! P(,W+Q[Z֬W%%%Xj G(6OSx{{gϞdطo,,jX\Wwf]UӗƦ}ժUؽ{7|>nܸ#ByFz͗S4l:mp/|esԓ[d9=(NbiʶqVEuu55KZ>VVVTv{쌰0(J޽}UקT]1OW֍KݞO/O)itٳT*q,[Lju-}?ԥ+MUX{51ٳgؿ?bcc1qD̘1ׯ_DEE֔|+S|o!Bˊ P(t0\kota~qxUm㈥VKGe.Vs3X,tt1EF02dduq8thRMܡCYbNNNU+N1飱Rĉp";;}Ԥk}KKKnڵ+UrssTcbXZu5%= M>4߿-ƒйsg̞=[cֺ](((кj&y6}TWzz:/^ \>Ν;kݯ)W>nB!Ԣ#L}ǹ{UUJQ]U<}`Ddf=a~gQbG+[f ϟ̭doo_~3fQ{Tܸq, Ç|`5ot1fƌG77756]T,--1bΝ; 6LÇ7h}XW… jKzQyjM#}Oih̞=x{TUUaŊd7nBCCo.___CޤjHرca5X,&ߵ<|+S|7u}F!BjQJj-H.lkoO֌B7ѳ&Աh_X]}͠\ǵ|]ף䫑f40;wjyȑZЫ\v R裏a&L9sFcJHHHg1c d2Ǯ_ }---1p@|7Xp.*ƍ@ [pڵF]jB cR_u{:5X,bbbFQQQxW@cХK<Ξ=`XƇ~5 ?iHbܸqϙ9޽͛7>crC]l6111LP(ĬYЫW/(JݻW籪I===1jԨzMcʕWe˖bٳgZW{')S|7u}F!BjѤFp-%C2C†nkwGٵo;l=ClZ>}Һv\Yw4<>  Twڡzultaݻw#//j~z\z@ Z?} 4Dii)r<;hq۾};z쉀@"@*/_χq/^ĪU`Cee%d2ڡ P3iܸq+mۆ#66iP=0@n݌~}III E\\$ B!">>^ -- ))) ĉ1qDfgB.#,,L#}O']lmmn4ܹ}􁟟,Y BT~PILLDXX~'H$D"p85uΖ-[ج,;v Cł Ë IDAT0w\fHך5kpf_}Bhh(+ l6Yf^*/h 7-Ӑ|7e}F!BjQ##P(jeu[rC.S *BNVooHRHr} T>^|r_|***H泖T1gj9-- 111LZ 7oF^^x<lll`ccu^#}Ybb"֬YSN!''\.8|0{=?^#,C]o#Bi1=]>6;7i.[;"gggd2f)nnn())ѣGMFWQzO=[K}F!F$l0<G\ f|fN#?3MöE `޼yHJJµkט!Z$f"S`ؼy3ә9H }ҳ}j3B!q8lXو4yҮ<2A6#F`Ĉdx1B!Lvff&֯_o8&''4LlCB!=SG?U2d ,p(JT f>~{ gM6CTrvvvr>ۇ 妎&сϸ \|ׯ_7utH@!:ФׄB!B!D MzM!B!BP!B!BQC FB!B!D F!a;w]&i Bin45!҆>|bu֙8F%PB!Q#B!&3w\DDDJKK1ft|}}1et rkEt1(͙ ,--~|>'ND~Hfbccxř::b0vX5 3g`ҥˋIcǢs}%** ӦMéSl2b߾}ۏ;+WdpuuL&Cii)233qA9sQ{)[~~~Xntטr֖65-\˗/k[op->>Pݻ?QUUe8O@|hN:ΰd2={t\xZ*ӧO:u Ν3qBҥ `ff\Oݻt#0=!=o<@`;*_~trBmlTU]0g덊[ܚHDmwwG6x(-Dzm|0bSG^HNNM񘆾QFa~pttD`` ك|Ƴ%q\̙3<Om;Á3]vD4Kk:ƥfknfwm6vf D3JF5<|O4D*Z5w_zfff;;;ts6qAH8::"++6JSn˖-ؼy3J?]So/2̛7{޼y7nan&_5D"[o1/Gjt133CΝѹsg=+VӧM-hL9kk6 bXA, Ϟ=MEҘb1Fȑ#(--ƌKKK3;vP;b!""NNNtTTT@, ...FL&C^^>|<?c {{{TUŪBF ;۶m3i<}xQ^^>wwwbǏƍ!MO Z?JF9f㡨׮]Cvv6 PX[[c„ شi ûhu﹟9Οcn0+!Mz5m\s yt7 ӻ#Xi(.*['Lx'x{N((*u#i\]]ߟ>}wyG.ϨQ+Z5wÆ âEI/٢q Ԍ ƢKBBBCښ/2lDEE:vh(wMiٓ&iMB)ЖtAl 286U_us #NZҍ6Mi9M%MI 纸.z|8 dĈ0L(,,,b`ƍ𬒒l޼ .DLL bbbP\\̮7bDEEb`ݺu(//gknnFee%'[o'QT:t(`Ϟ=8dfcXoDP*Y6Xkp<{_|pvÓ/N\)cd#sI]]]d`ڷ#ɡO-I$ޜ[\_s~lgV͛QTTw}b3fڵkJ:WEEEHKK "##qIX,wb10tPt:T* 3m4֭HGݤ#G`6lԩS.| QSSVÇsF9r,+ 122<p PQQ0$$$$`M;C_(++j@ J5Պ3gx|ɓ`πQou &ẉy>yEaw"*ΝĈp$gD,`tسȦN1c`H$^xcưaàT*QWWr8p}88e̙HHH@@@jkks[lT*|ؾ};|A$%%رcXjoعs'wSN7B‘H|^C nh-ퟮݽvp9;tx7>ߏ\x_~%v岞L&ѣ1vX#44"5558v֯_":z+}QgX7 /ĉje|'~9swԱlgW|>.]lTUUw  ##͔x"6mڄ~gYQ С_~q\1ܟhhhݻbŊ*]t LnF6 ΝCJJ J%0|px<^\/a 9~-O^^@uuJ%[7])JNjbhZDEEb1ɓ'ݮ(JdXغaaa:!!!{3p}ӛW e9_H!9wQz=g& 6 |>߯|ОKȞ3b듰Z|y Ѣ=^ kcDj8b.E}aܹ $9r$T*] !++ YYY>}:{9NQEnsyOBD$&&b̙x衇8u h1lذ>NU(x饗Y`xb1y?NԩS1eZ _}j׿9?~O=\TbxW}rqmpt^3W_|8u?=$ V\sjRs"99yo~/ BX2R4DqP~~>RSS1|p:t#F@kk+ l6N>ӧO=yP(3f 2220{lwt+++QUUN$o. *3W_Jj(++0rFa ^#G"33ZVӧ{վr찝܎9 <<r111l`0ҥKx }8p@'ޮNcpSqRo45Ln93"123 } d_[~&4 i|>ZUMn-@|p.QYYP6!++ ?8o6QQQ^0v8lxx8nCex K.|r`lfcӠ;Gl6ZZZ ǟg)S@(d2qҭ0uT|'N˞Drnẗ\&''Adҥ`jfH$7voVޠJnvN1c /ŋd b8t|b`ǎ駟p 4 -Zsbҥ8uz{0׮] /XfM!gFyy9|A#88=&L9sO?e3;lv .8qbGXSS'Oznp\@_~ ^תOO|>yL6chԨQxg~zB"`ĉ_iӦɓ:}_`ɒ%zKOO|0K BHH]w݅L&+l'bɒ%Όٛ'KTzz:, V\;vfaܸqxg91pW"F 6 '>ǎc?~8<)^@rKku=@TԩSشi;+P(X,db n3= +6غuk-ǗX,L&s;q qqqn@믿g;;}P3f _xRv=w>%}uuUQwb$gDb̤!= )ys>[t[Z-0O~?J χD"?7 R]aÆqA7l؀߰X,`+};|8z(;沯/X=`ҤIyvv6ž={믃ᩧ¸q|}L˗/_G^^l6q7sfNtw8y$-[9*[cnB*mۆT[ wZZ'`<9M% Ç9ݥiw4j(6hط><#Wd?vVo3G.ngl6,[l4 HOO9CǾ[|7.S[[wy#GD||<ƍ籞7$ -[^zkʂT*ŨQcs [펟/g_W߿uo?Q]]'xͧGy|>k׮ի& ۶mP(O? ^f/~bZDbqxH$G} B/ ?pғ%PRsa݋?k}/qy l6={Mr G aPQQN)h'OZFdd$._}PjԩS=\n9aXja\Y:j@@z>}?3 R)ƏL5 ;WRII CJJ 8y'L&;wN_v;U;ʰi&I;{wŋ FdffBRaܹ.y'ÇGbb"l6nzU[^8S }ebjˮC`{C,Z:Dڽ=⭷b6 ضm{0m4AՊgF@@x<ƌ^ݻ|>#GDBBj5|v'l7~kk32 ˗sj?\eggs]'NO?eOF1|p5Μ9Þt… l9@uuVoWZI&u+󴹹4 7t;KԩSn#lݺ9ws!>>-o+yyy.Y HLL̹W/!''3gDuu5qC||Kn_?R֭[9jgO,O?zL:!!!:t(g?v=wt:n&/ī!^Rps>s7vcmmqc(1bcٲegff"''aaa]CRAsNrss9Fr|38qmjaÇg_TTr/pSy ]pwMM 0,ű/..|>ł}uk*B=AЛ0fT*sO?Sq##q,9At7o222z'OL^3fZo+9qF"l͆_~9j\ f/^Đ!C˖-7|K.1߇ڷoV\ɩQ?{z<8JTUUԄNz'K[]]rӼٟ@# IDAT: 8{l鈱7oD"Acc#ٓ@Z Rv}^^ #F`l] Ko];8g8jLtUHtN%a9SV™cCfŏsLw븻3&.ٲg]묰<>69px駟OX~ax*2<006x!JaPUUK.笑yXNjRǹ@+ wv]D"RSSl[O daO#f͚B֋ټy3V\ƢEPYY Pĸq!8Oohw"> {QQ_O͆;w",,ӠP(ĬY PPPm۶3f@ZZi.]`B`3 bcc!҂/z񸜳 Cȫbay|>2 ]FBBBT*, o/jtzJ]]Ν;$dffcQ[;AUUJ){B P(pil۶WZpp)ҮbPWED"m#R|_r1LO X:oXz5JJJڊ.O"zcw_قms\nw1m4߿>mX,7HR8p?]'ٳZWV$@W|՟eee>D,]=xVAk?%%%'Oyc_1hkkC[[NM-_n߃m$M{fcPa&6Ghh({Y˜$$$X,X|9'\#ƙ``+wiQn]9wܥogKWs2D0w\d2gAPPFu3΅9pܹOIIFA[[-[v6P nݺ^|՟< +࣏>Bbb"-Z?<H/r=,:r{=َGaɒ%Xx1ly۟'ގ<}]Ivv֖>_|YG]]]`rjZGPj bk>j8` 82bbb>DZ9ur(8sXO_~BNvK/|;|>=rz .Dpp0 70z| *.7 *VA.X%w_xPV:ILHH`ݑJ ]Z;Μ qn(nsm#GrfsxF#~7|g2Ǭ]q9s---M/G@nϽAw-8wt\7"XZ;jF*kik/`Î;PYY B˽OoK. 7# #F [5rG> 9NئLQ]]JKK!0gD"TVV<qƲ'P'K ðL= s|jueҤIЪ.vT*,X `̙}oT(:Au}: tn՜9s=w3Θ1&M?dOg| 9@q8<{q}}uz.|LTkL_k555u[_>tjC͛~oĉ0 xn Ϝ9_8;y$Nw'SNrG>RRR D3gbhmmeEx㍜=CTT[gĉCaԨQܹs?QQQqJcȑƬY/`0@&aܸqɒIyoI$@u ٩<`;gΜAmm-ڠjEvbQSͦ޶M; )SӸtjkka6YF*?rg+ΘL2'ODII a٠Rb/ެ' q뭷"** شiBjMHѼ`H,\xkNw8[fKfʎN㞿N@DL76B}m b՘wWB>LؿyyyطoQ?hhhJr;x޽`HywcH$dgg{ رw}7Ż@ l }ѣHOO`X,`}]6mœ9sا]~=F#OC!III9˜g'Mɨjlls=7vX|hmmEr@@޸Ooxݝ N6 F~iL&CGw /R/Fzz:_~>0͐xo fC=ԭaϞ=Coۻus5U:cV^(<#x7WZ+V`ܸqxb!..f?&?8z}͛7cP(k?=f36n܈E{AEE'r ٌ 6`ӟrڵ 33w,Uy9P'{@KK كI&!)) hmmX,@ @AA<;cԩŰl8}/a0[nAll,z!7MMMlcguuuغu+f̘$$%%H:tTX`+V ''Ǐ g31sTjj*~ms|Iڗ.]֭[1}tGeoػw/܁/MKK 6oތn dž UxO lM"C:|g}QF!55˗/`lZѣG!9QBǟ,d~#++ :B5558u:._l6 (((po+Νڵk1vXDGGC"ϟǾ}< CUUFhd2FTTTرc> y{!CV!H܌9r/o(LGn:<6n܈8A.# V(**‘#G<R|2~' <j2 "& 8}4N:R_uv<`۾92jHeB45J,j7577gرc1m41AAAlEuu5=={w - rrrpBL208<֯_fuV444;СCa2p{^؈{ ٘:u*P(P__J:t7nֆg}SL̙3L:/W™3g{Q p%]?k] l޼MMM[1dȐN3E]]Gދ#Gl6#??_~%vu֡gka۶mذa}.u<;(6xY/ӝ[b„ ?~<~iObϻlق'N[oEFFBCC! _~챤$C/U*K0a<+V@yy9ONs7 _|se Na̛7Jsekyӟmmmx'qcڴi ECC{|GXb|ulFNNF6l~7| kxaaa@ GL&ƍ; C!a3i CȪ!_\\֬YxbNvgo222peB;wвEE_֭[pc8rm{hG@@{ UBe^WWW)K< b~- ʕ+QZZ1cư{WT̈́\M, PPP~wwH馛pM7bRDŋXj[I#GbɄ"l߾GS8BK^w! PX~=@0 z~~Ϟ1Xz5V^B< ikk|TBjعs'+&ׯ^B!fBk\Y?۷ojCaҥ>n !\(`D!B!B8h9!B!B᠀!B!B᠀!B!B᠀!B!B᠀!B!Bv\c]؈9sI!B!BP!B!Bp0r8}4,YqE' "B!B!1`dp%B!B!B#oK?~<>s1o<Łan̙3Æ L&Cmm-;?EEE>o'!B!B#g{/NβtMbO<[n`Za40}tL2?<~W3..k֬`ѢE]!B!B@gddd`QZZ LLz)SO?}F#L,]/^y; !B!BVFعs7l؀w}㙙ظq#~m|w^oڵ ~!=>sjr-裏|NB!B!^h4wjzM6};vz{޽{qN_B!B!dati,Y&ͅhq^\\gϺ}cs}hB!B!cf.++J%{>  !<m'!B!Bժφu=}?B!B!kA`6ۨ bjh!B!Bȵj@ 6s D!B!Bkgp1{ld2"''PYY_A!B!/3|>T*Ul+_ĉqB&s^|EjF|7>dee!++ >}B!B!aoӕ.Qݱca֬Y;qh4BP.zWQ]]B!B! TrH믿Çc6lR)z=rsssjB!B!ᅅ~nzB!B!rB!B!C#B!B!A#B!B!A#B!B!A#B!B!A#B!B!A#B!B!A#B!B!A#B!B!A#B!B!!wH`l ?TVwk@/HpY~dy">d;nת1VFT!8ЄJ<7;Li`64NG!B!}e;)))P(¾}'ɿmSVs1'L6 O̿M*ȏ-I8Ј 7ۄ_[uՊzhYB!ҥ00a-[1V+"##qmaҤIxᇡʫWՊ/Ϗ ZM7kPjSÖ=5Y2lB!BH'l #VKB(Xp!cACw3 !ר*=}"ةg/૲i!B!tan6d2c娨0ë HMMEjj[J@ǖB!BH !i7p`0 ǎ9b`ҤIG{AHS)Jzԅ MH걵J+[T`dR 41<f74ZT:1',Cx(k5aWM-5s$bL bBH3ಱjpYL `^D{E,]k_Q#&@ & -V?qߠh^wUH DR 63zz=/BSBF,Bł&l^toEˤyD"6ohĞ:4[.ty{9cqxwEW$ L ,Nk-A-jEn}#Cq8!B!+2`p@nn"&&)))_'..k֬`ѢEol/|<1$R) X! Ð1 Npjb15bVmht~1r `Z! Cl@$"|[^v:GCОjA*#^xy |RrAzS;6@!V V. IDAT kaAd8k00ZBFP >** 7A&_βhc4jNțvxxd  @"jfhfj!Z&EL0_ӛ㯢C\ p{V UA=S+Aݍ A!X2>5I\B!B<h%%  ™3g`QQQx`Af.H"Ðx۪h0>㒕apGqF}(LH!!Xb"q)߈7uT2틅j4u! ƙf34s%(#?kh@!-(#V{kz^ ߇F,j3 lVǶ*=L64bn p#[2))mhZT 1\@\>v!l yQ*%EG87gckU5jm 1QB񷹲gXx=R4;߅g0MeL#A!a`cT)Hv1!B!ՄZf_[[ L5k`ժUXd ~Q,Hv f3>-6 |C)M?4-PV˭&x< T}?GE>{X͆+q>oJ'knx(x<VJb08T׀>}?oe_64bSELhjM d&h՝׆+SSJpЌU6bMq) ۏza>mSE|#B!\+dH*}dBdd$BBV92477c޽ػw/>܇-C3*MmeF V:ˣb_JnSbDS9}C) J&ass53Vn "!"dp=C)CL60 Q?72D!T `k쯭yF_r ͝bо~u;X0`3+ !B!7 :,.]_iiiO]颩 >l5sj3HZ$` +Њ.Rz J!1*<<;y6ǃZ,B] JD8ȱtfx(AAbctϛJqf=b;B!B2`d4~'H`0tRs$Nn2fOyM:^Sql4|>AقV!*,!OS(Eؓ:Q~==$vhrSہB!r#G}"h40 .q92LhiiqyJpOJzpI*pWt$|>N7rjڸiFcF ]n;|3̥ň/\k%1 x-zzrB!Bd@0r̀pgLsX^RR:m}f[/@H ࣢RlOB5YNuwH'3A~M]lbeguNcuTql?o9CǙ;yB!B:3 Fz4q,?qkWGDྫà oCN!.}pG]d8LQ!d!*ޯ/sN*\;F&u0[o~Z,r4 P|0*j#vr6P!H$r4 ,!B!#ؽ{7`ԩP(3edd &^wΝ_#44+Wʕ+6֙-lCumf&)c{I#B&2N2#&@u &ꨮ=EVbwvA?>(&>>FقR}s3GfP Tc[}KAs 6xFήﭓXx9Ly2@~*hnj׫]?_ہB!rh4"((˗/Ghh(x<RSSd@^^B~YC3 B*.+0 F*qol4'3F. #Hdžn}(iVQ#O7Ma:Hڳ4bP͆=5>ogOxӟ/n AJ 3vV͆ʫjӔt5 `n (U ,T`vcpB!B2 ^@MM ^y,[ /`Z!h譪K/V+#bByayCEη[z`bsE5n !SBZR>g i3cl C HV* C` ء[[qsV5`Zۣ"0/" 8{G~p*D+@4n}-S!T"߇EMuY3oPc5A Ɣ-l be|Zrfiͯ$o7˖j0D{E'Q>U.?Ծ:DB XMj`Zo 7p(O1t>m U![PU1T!G<wjA)✡B|nB!h`Ϟ=x衇h"9 طo֮]&313 ޽TAV!R*χbťR]ⶣZ6AL V7`t} oTbNCrXV׺\yimmNZ$}Hv[ZpVaJ"{U &N7pѻV޹XieЉEl6Jːd812|,74c{UO7ba[P-FklzlCq3PYMA<*m68d.k@~)@xygs0Xվ*hb,N}-6UTF!B!tFc!*|x#B!\l #B!$bhbXu!B!(`D!FE A!ߩȼN"ƟE53B!BHw Fr-x M Zbڗϭ$B! D0"0 CJ`eX}#vk5!B!+TB!B!pP #B!B!A#B!B!A#B!B!A#B!B!A#B!B!!w{E#MĶ*=6UT]UcF0Bp x\ovtmhG( .Ӓ2p=2|UVZ#W;#p:xcCGE`&Jq!Bq1`F<IIIHJJBrr2j/2oA*,4-XVj ٿG%ҝ7PF,BYFnO<[K# sG < aP c5AXUP }[רik\8kN<|nRi0DC@}C.wkS_7 #}ߵ)B*M 7ҏy<|Tڰ ͨ3Rb.b1Ɗ~u Z JB!_f|Ͱ~ng6AłaJB$bTm$^ABzc5jFhqbe)cn4-(kmEՊyaJL#j㬡|B!n#a`@tQnRbF$|>,3`[&IU)1^AL )f qwU5sGˤyD"6ohĞ:4[nד A** f ckg cqjwEW$ L ,:SBC%0llž:aVTwx7()*%W]E҃1QAT͌5mxhu4b-56aSEufyz{M `^D rY! WAAc_UtC=#?{UsfJ2Lz@( E))սXr+.zxbFqQ`HWP-!N2ɤM;?CfRf& >˗3綵uKsRj_PbmGo@R'#!BDDDe7@gvklq]C1K65X{4r9ƚZWkj ˒2IJ;-X* 3=)\(k"|R&^}X2l.dv~jf%%gr*-ǧW},(`7pb), Ǟr3޼3X4ذ̌u B*R0sE`(EG* /稭:3o7a]=< /׷ ]:Dn/-nz5O݁j{o/V"""`޽ػw/:ڊj^RtoppȓS#'J=_rYiÀ(=r9-<g5(&yx˅˞_fcU;+IP#U(.zfUB+yzu!8'\ ~P?Gm`NQDJA;)8B`-](ґp'ܶfriPCr p"/(jju`o""":no&%%%XbEO{OpK1`$`ҥ]ٽ.2ꁽf=4KuZ7\_i#]2rxW$Eo^,hsS.@^W 0JHHUj*<z}G.@AK?2{w|_U4(k/tfrm/I/Q0\0-1>5-=Hh!kA}/82#1zaHg0Ԣ傀=S9&B A n!x֙罴ZSɐ_W/ .[OiCi`Dp홆4M -'%B %DDDD[?z  DEEk4rp{V#F`Ĉs JHhF g8\~CNC)ji:-zi4}0rH,Y$<"""FDDDO}`ܸq:ujO8e˖r91es=0xpB=k> gƨQZ ̙3[ mܸ۶mk^CJJ lق_V))),X"ɄÇc0xqoZ| ,ر~!Ο?R};@jjm,_<].WĀe20qD'|l69#Gojjj;7ǏR޶ѣ.]j~[뗘۹:""+aDDDD~]r۶mɓ1}t9;wıcp TUUYf^:uJިQ p _nCAEdggh4"7n܈qᮻЀhD裏p~e˖&뵵~ɾׅAmu6l؀5ko""">1`DDDD˰Z9s&1o<̛7. 'Oħ~۷CŀmdHNNߎ{PRRZ~>^gϞEVVF%I}ÇDϞ=q…`ߢ{z\oNO^ՅDDDDbxWoc„ 6lH '''Oo[&0;vołgyF0[Rad ++ Gn6`$"6mڄ{ wu^y`}aժUl^k.0ל~˗/>"ѵZTVV 6੧̙3#/9-jq(OhѢ&rssՊ'OJ;|0`Ĉ-&ݎɓ'CVmpBL2wy'.]'N`̘1x'&~ak|yrb>=MDQę3grJ8L6 ӧOڵk9q.]}{kt:lݺ:jM5VUU]vaҤI4i[]ll8q~_cݺu;v,nlذA~0+**򽗜]BDDDXB;wbڴi0 ) 5jR 1c g}I&a̙x7.W[7˱h"lݺ7 \+,,DUU0ԙFDDD=\.WHBll,,jfB1cx |ٜ>Ǐѷo_'#!!sźuVݻwc;v,֬YÜCDDDÈ́L4 PZZI1c.\7Gƶ*qFC*[[8NPٳgC~| N'dɒNII K0""""4 V^^{ ӧOGjj*T*z=gySNl޼9y=z4:/_#ߜm۶!-lقz}B_^^}] O?}BVCaX|9VXw2 ryXNDDDI#"""C\oϞ=xC:V\\\eÇqwb̘1^XVرӦM |mU[[-[`޼y;w.vr|Mj̙3'Nĉl{i߿?>fҥK-UnaDDDD~cXv->r88`Ϟ=Xb~i8M#";ހKff&[ܷwXZG۰aN'"##j*OEx_6 UUU8s ֯_gy*DDDD7!111pH""""""""ᰇI0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$I0`DDDDDDDDD FDDDDDDDD$Q[fzi5;a߿cHPC!,xb~f$cJ|,Yf ԯOTTb}~aX,^?vލgy&1n8_k׮ ; d4?لi5A0pmș81)I+Ge+!?G:{:}v`eԽs0b >6ᅴ,?k/Fx*@DDDMuQVV~ 4z%%%طoz-Tw/D]ĸXܕs:Qpp8[S;NGW͙3z;wą :8]Ɛ;@\5& \'%5hl،;1f<@Cm- @m]յg8\oCb1Ɛ^/DDDD[Ǝg} N)))7o&L(++Rubc[Kyq)VnWpJ=:N'^ɻ{nJ"ƙbB(mWYY|zs"!!ϟgӦ"2ք.0 Ր;|bk?׷`ۥEl߭=t LDDDt#Ʉz իQ\\A駟F||<~i,[J-hr[7V`gY9vO 6`Æ3$:Z ="P__Wш{6yhPYY{EEEE~-VtZ8x` K.!==&L~EG"eI6|Jq"q)iDdu:Qiwവ+-\W/Y_-_"FZ b㌵;J([.gM10*q:q KXFf-ǫUgB_vQz+6ViOH C$acQ EGa)jlv-7+sd/L3a11*%j|[UMEZZ&圾e%>C'ġCZ\ҥ3g6oތիW6o ^/YsҥK,~dي+w^jXhƏɄ2lݺoNguiY+isջ=.R b>~?d;eDz ^C#Qq& TT8y+̗̆9\d_w[Ӷڼ;xoU4g2o]t48k/~0Kɹumk;Ӟ-d<3ef|K͊NNİw }`t1F8m6^;valZdY{v!"""h2`$cs1cРAup6319>EXN(e2i"V.;W$یDNDUHc4eTI ~>z!dtMDI{z;]ː"SEH=ʿa>9B}zJlxdzj`$4r1JF/<ޫz+0JhT0MOL.GT\,nDصp4Gq9\+H\9}F%Ӟd&|I~omKܓ3VWFH韍Ca۫%8lSgPk n:̘1W\>SN!66˖-رc1sL_1oX/b+b>i]6N4w.}wEg|Nkj? OFg<]g੓0%(:}7%^#"cMǭLRs(;}^#r1pm8&TjMFGMi(J8=AJ\ *Ǿ#?>i@I.FE90#?-[QSiBBM1;W~KA2Lj#Cba;웭^_o^=6?NUǷ}~j*-үb{##w(oGʩPנj"/T?_Z}l}5ɲO^a`CS "}d|$pjW)O1lƝa uKG]/DDDDI#"jhh@JJ C GOMM ݋{jIG{z2_Ej ꫉D{|=R"HD%GiYC&V 8dwj|g)%\.lpB_0硷^y8PQdnS.uӧa+VO>)S|GE^VΝ$''xWΜ;]J=Ш7\s#"J]u䏾`>CBܶ!0 IDAT,z?b{#g:\.nwWgq2$ķBDDD7nHfXW_aȐ!X~}u}.))+گ!8_[_#ai[nk-* _ ĨTb|l #0)Pv SjOݎjGaHN'v;L*dy'ώ EFo+& [# -jz= 5~:׻p]gp8pi ;;_}r9F Vo_~%G,~kVgJ겫"cMNQBqǨr﫤7H!dh&/w?pD+~Fo9/Ը $EA~J7haT^?#or񖆐uuVVV aZq)p4'p~zrLa-wOқ+7dr9dxLoYu7jφjw@J>`3K^wt1xWBv ݘI vލ{'O_Wɰ\\vp x'XzuKY"a0 ZgAu<T1J5ۏ1 \E\Flf&hC5 QX߀5f$ gWQbTJܛũfûWZ+t\.hd24F$H9y*Z-F#F`Rk_jJN3SVv$>@q<3C Q6E=V¢sjB5p""r,HMm0!6w''=C(H=f$ ^}r(b`T$Lȍ6`Y"d2OCNppm/2=1C  3,: huF#B0,Y[x{M<fyyyBRag0m4Ą} o@l{R- AڀEǶ|[t8j0џBwVj1c 5;Um㡋!l%\٘(?kP[D}`=}KD0g͘rL\Pd߹?ӦT6,}Fj"""1uF<>|8}8N߬0%%%x;Z_ƚpk NQ\pNbhD&9QzDs:!X_( XNl)*]In4 h@Ӊ rAj+mvbj %e됩s]T(pZ Nk1+AQ (B(un_(akq)2uZii!m* == gh Q8g^^e{J]s߀ca}TX0hdNND],Wg.8u&?30LW^Oا~S"==>\W_m6QN GU/V[ Z*vpYߺuU`2 }܌z*r=R |[7?v0=o?j w!jkYocIc8Y^#׈a74tB:saA'~. &FRgK䥗33hy~Nއqc0gcܢ{>|wo.DDDD#سg{1,\^Gqq1ۇon4sgK(rToĎr,JÓ .dG35QZ[fí1HD@)(oJ vqwr9DIq&0R,3cSQ ~s|SQZjAH=J䂀CG+BhLB9kK.W5kڅ(XBbbbM!Fsٙ0TxE즽(4V;w?ġO7wvquFq*T*8Eږܗ>zo6,z{ M[0 FDcTL4 Il|sZ`""""""FlycQ tZ$FaT*Ehev&&""""""^uc5_P۝ a. oݥoc si(X ^FDDDDDDDD$I0`DDDDDDDDD.QW?/+Wu 9s@cΝpBgaNIIAlll'(xo0uTl߾/bg:Ynn.F}"== |2ۇ>M999пL&K/m۶utU0` ̝; 8<F˖-l2̚5KXL4 {uri+/~={JiZdee!++ 3gį~+ItXfM: FD׹ٳgCPСC8{lgСC8v`60x`zgϞšCcܸqX~=֮]>Z {) ̟?~;`X{n]/2 5k`Æ M <_-܂wy:nV̞=Eظq#6o,.\='OnRDRR=Q}""""""1`ΦM& BE$''#99SN?/ VJ-J.\bڿCqW a*ȑ#rJCa̝;od𕬬,,Z(bʕ`QcA.C.gϞxQ^^ 8Ngܹs IKKkV J`Xn׿vZ{z-Ywtb@RO>ӧ"##jժP(0gӻ(r{ ^~e 6 `٠qwo߾!`9=xbe}w) z322n:@~~>.\TyT*eeeA탈?ڙ۱c?~V{ b֬Yxꩧv%y`~uֵK/:t(~_p>fj?/)Sĉظqo_CEff&,YW_}{o[( lذ ]O &&֭CLL jkkk׮Ejj*  eSNŋ#//> ^,Z?i홒֮]? x7ZUe8q"PRR!ש`y_` ÁUVap\3f VXZpӧrss{n|(((F}/ -d;o>IҤ^Z Z,PD,TpqdQ}@FuFoufqEA*ޢ#bqUwhKK%i?JbcR(IZ_/_\u%uHPP8z}%֮]sH`lw+V`|Wc]vL~Z0Jx衇0,\^z"mnnk9wj2}t1b& 55ݻw/{ϟ~Yz56|o_~Iyy9UUUlذ;zeʔ)=Klذȑ#Ϲ?w` dgg`FptRv{ .8}3ϟONNvA^^smp({fLNC|ӗq 22Zrrr:*++yWV?q?uyyyyWX۶mcҤIٳcH%i 11ÇIrr2aaaIF;1cFvL&绽|r.r\3'^|E'_555mΟuXs&$~nΝ9qʟܶmDDDsϱb 6nx8g̬X ay~u' 8~G@i&*++Ϻ_ =??z[v- d2Ѷm[= x֭+QRR·~ˇ~x#]vW^l6yL|ӗqr!%%% @qȑFqn,[k3a^"""""(aԄCBBoѣGyG^;vAX,@ݓRSS0j~9MgNNkG= 11^x%Vxrnn.'N9~8skٖ5?Υ(/keJJQK)Sx:;YM6>#--qp8ظq#L<ٕ@%%&&v,R,..fٲeL6QF1vX6o ==22kd `g=sfVC˗8}wx)hmZAA:uj󉈈/FMYDîL&w~84ղ5IMM=ŕZl?8sΌ7c@/vu{.]p,xيܹ۟'xݎbs^5j&:[ e^;/ik(""mzloqhn@k׮43DDDDDuP¨ 9u-Ҩ4N !!!sN رcxmܸqq^~e>}:6aÆݺu<ޞ<СCXhctrѣGYYY |q߲e  nׯ:}픔ٳ={6&Lhp?3N3..k;uܙ~?-t9O)aԄ{V+zȕ :Mۍ7u&H ̙3ZO?Tk;'NtkŰað̘1UdL4-@/F#SNu .pt:qM7yMR8ڟv3gdРAnˏڷoɓ1 {}۰af|oK7H {f /q:Vl^ Jݛcbټ8F>}ӧOgŸq?8333Yd r֭G'((hzDDDGG- umDPDDDDDZnB'O_kkpXv-G[o=q/_ΐ!Cر#/ѣ%=s;3k,&L@߿?UUUl6"""\mڴs\\&M`-Zo~222x'8q"#`\ 믿Nyy9L&x n`۽{0a?kI3np|Ibbbؾ}; .8nyݻ7#Gt=)C1fzjeǎ,]UVY8z(&11(vouΥ?rssO>llܸŋsAs 2>언jS2vX @TTǏ磏>⭷bʔ)^nZ0awy'_=IIITVVܹsygFe5k0ydÅ^H\\111XV9† XlG DDDDDu2m۶Q'y233yWy7[:2,X{9VX!5EĉYn]K#"""""ꩆH+׿RRR())?np]HNNf&""""""ђ4Vh42|v*:~ Gaʕ|v.Y4ydV\zG #V1Z;СC:t(6cǎBBBwfΜ9-C #ūW_gϞngΝZ~kk^7J%DDDDDDDDčF""""""""F #qHgzBy1Vt8-劸Xچd0}I?`&r}bJx ڵڄ`{tޝ uF||<3f`ʕ-4k$pkr"v;'mvJm KDDDDDjF<-A q||hd2NZMy&ٱc[laǎ<-40hsW7'K,XUxU'&0HM:uo%(#`>]#9ڄp%~O\In~!o`|BC19ic)֝,peF#GF#*![2(ZY~O 8^]5Vm<.XSv;N|ƥu:c` ״ˆpf+XsoqHS۩DG2wsYLh(w/N;g iO,fNl|WZ{ SN8.#lxu ߗʼnbNm._\,B 6)BW󰲠pit J6)>IN~!vkqqW߽BBM&m)zADDDDDk @HKKc޼yA駓+gr.3Za >LoHs5z3Ԑq:*td0l4z$lW{zNK. """""r>Q¨xmq N+& BI #l沘h.fk ȶr>Ɖe?w$/.67+*뮽,,>}ЧOz$1pK( kD'e]R@q<ڑ^Q" FwJ@ݒ?uA])\,F#⸭]VBmzEG#EFpsR[beGp8ɘn3qM&2cy3&tBF.p/P΅/8.,শm4:`0,& _|Δv{}Mm}>=];(nnHq3c:Dum-_( xM͟σU05kݺu>~xƏn㿛Sl/+J窄x&ͥepitG;GE=*{7ns8Xxۍk 59ޱdFSab4b2^VΉ+ /KD8a)J{-6G-AAX~ aӎrgADDDDD|ѪFqsR"=2QluI>-8)^۬-.^E &~0mVk+䬦^N { }DDDDD|תkIH o`w8BKD~)y_%R5"69Sݲu%TڵG<ȯj Fb;YX O >\Y;Gp"C3EDDLm 䗡l4m6c28V]E,:|j_}DDDDDLEEZz\Se弲`F""""""""FEEDDDDDDDčF""""""""F #q jD~xw<0sHDDDDDDy(a 1VZž}Z:_ w}}$$$`D{2d| ӧOopeffҷo_.B:vHtt4>|5koSVVk/Kqn]DDDDDFȑ#IJJb޽J52y<Æ k|^ [o/RSSݶѥKt-ĉٽ{O߳gOyn~zv/޽{Y~=6mرcNϞ={駟{j石~̂  ᣏ>jK&y,<N< /3g$++ٳg3p@.R9_W y'9~8>,7nt}gW_e͚5\r%L&vҥK֏g}W^y%z+]t!""R ذa+WlRnvuvȴi0` .dܹ d^xeܝ;3>_u..2l6gO>~SO5N_!PvJff&WwСCһwoW ;h4` ..^zq}uɢk68E{ x"""""-nŊL>us uBk.ׯ_ F =F K/QTT@uu5Hwq[;өfĈxTv/q>el6پ};_~%TUUa:vѶ)STVVK/a #G<޽;.\J瓝͂ K.nӗq?Sj`q81wg:һwo/_ɓٴi^|E ?8 n~cY/?ן\v֭۷c{NN}=?Z? ͚i/Ν;S^^|qk{FF8גCmmvׁPYY+I@S#//O3;m۶1i$Ө bcc\󊈈/5DNff&Ʉy$%[(IP7fƌ g1L$&&˹r͜x&g|?Ը9va2;wtϹWmۨ&""{+Vqs9cfŊTTTx% 's .U?YTVV= 4}M6QYYy1{u.h߾= -!..Kx>k,/^ba˖-,[c/g8gxmCEo+qO2~xuJzuH׮]ի6wy8_eܣ\nHIIG(Pk9rQba9|0˖-cڵL0={WBB}TZDDDD|Qr~ ooGuGo{T ر| buOZJMM:è\6Eڟ999=z ##Djj^xXɹ8qrq;g[hL '=P>_|^Ϙ00LW_5yl"""""|Tè ]r%QSSÔ)S-Zt|zgVVV9_uܷlByy9n뮻u}_;%%%1{lfϞ̈́ Sc㌋N;w_~ ]vƋC &cZ s-' f ]vK6Yt8--nkۘ9s& r[~Ծ}{&O`ކ Fpp0۷ooT|@]dܸqDFFb0ݻ7Ǐop|qZdggp2h Wwތ;PC}aaaӇ>}4x/s333%K?,Wnݺ1zhy MdfT |8Çzuu5gf׮]^_$111l߾ zn߼kݛ#G~y衇3f =zjc.]ʪU~֬Y=zzFҟNTTTЧOHHHl6sa6nŋ9xǹ BLL vK\5ԩS;v, **ǏG[o1em|qZL0;3믿$*++fܹ<^k#2Ś5k}5f\ǫO<h1ӦMcժU3C9/.A3+FEW+MjG,TQZpC[Mߵjpv~ Et8ވ#`ժU۷pwP^^NAAEEE~jw߹~o߾= ~mkPVsODD#ad IIJܶKrt Wu"9q9'*K8y<_9$ݫɓ'9x+!1boot1PVV#EDDH]=v4).n~e'ILK{s-ۦsaNK!l[:Bdd$ӌL4Ϥ9}&""z%cc7|}jmܲuoy#iE]?WVV`$""""""жm[ןS/-p8xiX}@Y=z/I71_sk &2v}'&|aV&> H;vmأ;qkj(w-5_78jڤu"8,rOsh6v}I}/z=Q_Ξuܶ=0Eܶf=>z{qU$uNBEI ng):}}.1!<&bǺwޥno4#F7jߧz<ӧO_W^᪫bᤥp88r.kƍK/e˖냺" `…̝;ח,Y /W^ɭJ.]6lʕ+ٽ{GmWfɍ_GfSXX?O^/AAAy <$JJJXz5se֬Yddd/ҡۗ+t0͜8q7dyr6yyyN?gAf9%|e 2q d H윆vߋ)k*0ҾEv.s^E[o2f;9p>}uE޶{ۮ阂(:tRcW{ytN!uEs՘{qծ8mUUDqр~t7|c﷞0[, ;Pkc4j#~KHDgMKKc޼y9vY\/˕,Z=/kUQmأ;?|?o>$E_;?9>j/S'=5?o$%%1o޼sڵ+^wyCJ޽]Ɍ;wk.ӹYpq: wfΝ]ڷoϝw ܹsYt)@]Rk\ǰ{K7ѣGyٱc <#\yr-,\'N뮻˰l̞=O>ZSO=嶌+l6| ~)7o.1wͰax'ٺu+~ϙ0hӦ K./Y8^z1i$z-,YBQQ 8?\lٲw}ׯss{3_=/8+Ջt~̙b3AAAdggng|yO}s}55}{n}Q7oqqqTTTܹsIII!##5˨9DDD~m)// A\wًM-ɃL:o{YR+_HJBX޽Y|9'OfӦMrA-[ԩS]}G 2q:>&Lw` nf?opp0SLaǎt/UUUL&z7((԰瓓6//s|ъ+>}:_}+iu?]_~=/C=hd…KdVuu5wqGKr.3h=8XVONuu5#Fp%xRSSٽ{7/rl}gZիWcg|嗔SUUņ uK;vjھDDDZ7|k|'D&!؟|/\xk׵ 8/VWQ9}v :&#l oVS }RK &S?|ukU?} ի(>rm[ME'>NjxZS#//r ͦW^ykT\FJJkyS.]HMMfr&lN'CCC>KL;8ත={Ю]; "##q8|ɡ6ij_Zngɒ%^q h׮]/ksyAwa߾} q mFMM O?r5Kk>kMך{\s^ll,:DDDZol|>_>]!.JpD8]IEW^^M_8eD% Hਭ 4Wmm-F8 릟۹ 0n$7pK!={cǽn8YWs= RmڴQO*--e͚5 8m6kr=4m۶Q]]MDD=+V`ƍ^.ҡCnw .8qqcbb"Ç'33d<=/3Y[[ˌ3Yå]\gNq8,_/,_|k,4Kk>kMךԟMΟf3:DDDZөb6}˦s1 $vԳƗuȺene SYV]b wA*/*߯걣i%]O~YٔBN8jT򺏳{Օ'p{F^" X_QA%b|&fJJmmR6!Z1[BhUfL2H 8dR':jРD b~`_iAKM~OCvw~Gۮf~(:4tNq)**bʔ)oc2ҕ+Wظq#˖-#66V]WWGII EEE=^~ѵy}jO]]qƱvZX,\|r5,22PAPPZ#33pqjrssˋǏSXXi?;g4~m5Sms3!է喖j?b1:)|wh[q]iW}9mǩoQq8C>aC fؤ 4=\[m {U_1\r&Mķ~KBB{jh׮]ȑ#'44S2uTlnʾ3iVdٿ?oUU-/_Σ>y$wp){9WwCs6na]&*Ξ_e>smn?w{|&BZEnCt(|_Z ʚME;k_PvIC]Gw~M[`2^z-%M[t:]ff.H8fXصkpkӁGf wT39;l_[[Kaa! iiiSZZ T9Ӯ]k]`ݒ^ F"((fpƯuyMH.8DGGAKK `0 ^qz> !EmSؚhOQ\̯,0cѴݥ• iwWԔga1{z2qm Nط /D;|ʻ_uj &Arr2hֺJ4Er2^~ef3^^^hϮ߿àZܴR-ۖ^'..N㹚H[w f=-;=}j5=\(,,䥗^2224c_x=+w\= !MLJ;l0<9 hР~r j1xofT.z2NBgZt]͹jP%iт#F~qw!I}̦MZpuԜk%>5~Ooo%OQ͏Y~=?̨ cUVVr1<<==y0V8dddMEEMMMkL&͛GRRf}b~ϙ?Wnz>B!z;ۀ ^[C|j ==!|f.}S_<х@k%aEQgC e68c71txb?pdI:܉i09_4c2MQ31w2NoܫoX(^@QQS~qeqS K f HҢx,̜cc#}||HLL$11Ovӧ3gÌYX.())Z?fdd($$$l2Cqx RRRliDFF(֪ۉh~MHH ==S7w^lرcF|}}Yr ϟŋ}=ݑ{IDATptt4a̘1=1׏CE||YwիR[1qDYz5+VP]}uu~i3sg_[ξuxξr>B!z;ګ|t%Cw?AQxPWGf/?8v$-ZȐ xKN~1sۘM&]ϸ0Iđ|ykV`mW8.L~~>.؏{\\aaav.KLbFLx ONXX7nܠw}78=yyyTUUpB `޽,YqKqͥ3fn!Ν;)--e70<<B!z;%<<\}{Soo ?^@o'D{<==O  ;;o]u򈈈`Ŋ8pB!B_-* do'DGRSS };΀d2;!B!p <wMjr}̺tAvBtŠAxgؾ}kg+ʕ+3f z^}dee矫;] !B!pwE#>4̵< u+/?kNXnÇWᮮf֭.t̞=ٳgc2tVgϞe.B!B_K{҂ł'~A{J/7j;!:!--(ٿ?999=Vנff3`<<<8w}6lAB!B!B!¹\^H!B!B[$`$B!B!lHH!B!BؐB!B!!#!B!BaCFB!B!†B!B!  !B!B0B!B!6t͹IENDB`color-eyre-0.6.2/pictures/short.png000064400000000000000000004512050072674642500154530ustar 00000000000000PNG  IHDR>A+sBIT|dtEXtSoftwaregnome-screenshot> IDATxy|Tϝ}ɾ'{","(*Hmmu-j*VEhdQV0>$ @˙;sff3y+#        WHAAAAZEAAAAVQuvrIЙ#8N    t.Hćx-ct:G   й6AAAAUD IITwv7AAA$AhIu ~? egwG@QrӵiH_R!uvAA'GHvy$ѷ;GS1qtwn܋0=E,Zq?puv7AA'SIzGGpa0#/^ +}zg9 6~3DV`LI7H?CgU Ȏ1:6\D8du'4;bF]v18Кsh3QVm$ef*T8X^#@ޙJzH {`:- =g /zB+1H*^@`X];;pAk%Isĩ=r9⦜ NISfPpuFs}d30dWUUqiJKK/Yb0u|:&[P νv:dJO[)Qv~կ{cC٧r~ץt=4pPTZ- K*+I]LWifcNFS #"ZY]VkVS*sXD7FwZJ%SbλNJ`tk\TWבߵ 4} רFVX8z3A @/N \f#eᗹ7h dY );j4o8_+lv*lv/KtKf[:>_NA}\N|+,,l#AABx R}`9Y]S{]\[(;4;oPw#=RVd78Q'=keLd(JtH"# j9[W+jU|<&v;"VU6+c6* UY٨V #jZEZYT <{_?wCKz{s(NDAD6AhӉ%7q2.3LF~*5:& 1.2NLi6PA|w=]4(|ܦ$BtWERP| x%/CzV}&~3nia>};S|zXG~;xq&AfdWrFÖ3l$%T ĠUф.ngp0 hdchgv07(8bQDiw!@ mպ6;**ɫP+%J amiy6.& ESǒ4(,DmQAi1$)$҇ &cX)I PSRسF6{#F['Omom {{8MrVpQI]QT+*9q ?,]~JTr=:3'Nr`folPd3^{yg_iч99D%ӫ X:||m駿2i$222TTTc/^̩S̙Cnn.-b̘1#FAYY_}NgWi+B;g?|~ñm|3ɬw;'&K_l[ͪuuO}%$0Fnly1Neo7vGlX4*DM] Gg=<׳&⪴>[z~8gZ&I{d3`b1̜,gv]~#7 yJCDTJl9e}3q)% $a.[mʕΙ젵ŅɓIKK`0PSSCii)yyy^cǎ}bl"bu>\.6 $^AB e 7v+$6$ ~]Jlf=|l3K p6N%3:Y}z>?D1){CZIK y7 9o56 abœ`?xu[5v_SO1fVZܹs}T*O geڵ4hC !55j5ر%K gH@rHc $hRʸ36RI3'<³|ltBCeNm=?Mk--2Ϻ":ܧPK&':٩rI igÂB{2bZ-3յ,+,Op!A"$ \2>9htk!< Cx=҉W5Z~GzoN!aktܟ7w,46Z?GҀ~^Atׇ3w(vڲrNO> b l|>Oӟɓwl&::q1zhyls[VIIItT*eƌꫯ-Q*.Pa 3o LF44 _s Gx&eq]f Lj|2s_x3f["*$k`BՅ]RIUkęKf鼆mRGe]E_A!#8[N'V ]}O^ɿ׾&Keɍ  \ I$qkDr:Ns:uWPGv,flB"wTs23[=BɰpZ2j֯3r"گ#テ\o7zIAĦRxgݯ_f% A HDF4K7xL{{I8ՔSij&28nщDD2u$fg_ De#gQTYVkT"q w_Z=]x^/=TTQco "-&k*Ǡs>Is/W [ZX&77s3rX osJZ >MGT $kZ$gpxUGƀ!3{w_VZ|nD.Zݢ('cQNj{_j?F@vv6}uF w}{p8YkײgFM~xx8wq7tO<9^*Y&78=UUlXtrF$X$VTl&,Q!!i4;-Ы~۞@RZEFC1ah|2kMq)uU8^YZyIWC yp[E뼳!xnuJj_2 …4 $% O׾7z%8 "s Mƒ{5煇+1UV6!8cwy=I!hFvZCuQ *=I8'V)d j@RWy{Mi_P[s|gG4܌_ SEEE<,^0&O[ol{Vٳ^x NǀXfMx><1w`kt(ًJzBwşwMCGٟa;'u}Xn1AI]y7HgPw'[><ݭ'|µrnlvW>tT(ed ^UUܗ$IhTj6š)*Eҫk'sDkܟDjp9*33I(--eѢE^@Ut&kx0J] Cr,&(>gAx1OkKml^WTw 揫 Ϭ4_@Bk}HMMeСXGrQcvְ (-e6) |XZ NٱH@Z /2\hg i 1KP['ꇴ)%: F$nl2[A^Uuxnoɝ]db$AhGcYwS>\ʷoY/c`&Jk|SegfX'wnouJZW?tMϥM}>tel3@ID8l6lmAIp9~qko?+<f$eoQѷݳAhpʍ_B#i,(?˲-+r\C{]xj>X1ZVN%c5^g9Uq8:Jc;Kkj| !j5'LuvՊg+z9jhPdpg$5ZBBYQ\ 'vP~ڝ$˾COlN 7* Nh|T \La&H#3osj.N񉡵^Gօ`qt~h 6 97#,, ?k6;b,saҞgߒS*(T% ,QXFGjnno?D FJ+(% ./,sI CcRؘ?ӈ0k}ryP-&FyV5]#I\NdxD8s/ KrcSo: BMĤxWwq#[~`ëbSS(>zݝw{\scRI|u~IRR(Z 218ۍz̾^ 9| _GɍC\ayu:s~^p w1,1eqlvh;5fiԍOzwNdS*“D+dcެ<}?>< 0w<0pu7>wvQLb^蕁Xm_@Vh˯bjb0xWXb;v젤4(N+iʭLGHP8]`: ȕgD=.W_uLwmhgȘ,7G¢ZF%YYr@.e}Oe5eKWJ?R[[KPPd֭F͛=1!::SE\\^?tv|j pLnlB0(%W mD_<8{G&臘Ux/&\5-J͎FR$\mOM-}4C xm&Cd\j5cY&~1=FF3&E%-Hfr:SSK /\ •Y ) $󸪕iM174UV!dOVM9?ۓeVȀƷV{B  &Im#_4Ml9FEY7CvNl߁~juT墶*:J^l6|\4y~3Y꘷_ELf u>X1΋Pw50jbTMժGٵ:w-@gHA 9}p݇Vt<*$68 řh[ʲL3tzf!Y]B79mpl֗2^~e|AzE^/`kPv NQtfב ex4^gdgkɀ@Z\{XE;^IJ7VwN֏Nw}Br۾1Z7KhZ?65׶/6l`„ 1HR(?NrQRR‰'<&$$,;9:$ř*ZZZ~' :2kUUd%#9eéT$.KIA# l6(Y$@xamuf;q4 vYÂ}%'<)JJY]zXs ;л*ix{7d ]y/=~t| &L`8NKXX&+K#4 O>$:~yQxΏ6='Nlg/GDPtѐLDAmaKAoF8|ͳ\p+k\55& k8SjoD4 Ipu5C)()#''$c2P`ңЯq$fg<]EY!LK|.)ceQit@9TJNϠRw}AAXkt kN " dkj#;+ ?{5,{6mpfr݌B@5s\S;w_p-L IDAT9fQ*J uבq8Ͳ.͂H5uջ>TRLWc`k2,iM$_*Uذhz&3U/Zm2vH}yYk%2=n!ѼvJ"J[S;dٲe,[ 4~̙3/[6lN4xHSht 86dkh'tD 001uc7aNT)70$bkh|m[ "ر*BCC0`۷oֶi&v̲ٷo_ñl̞=,paaa~i $aqh$Z-C04d@.-U<[S>uN1w+P{hVEfr*܅l?GgŊh4RRRصkWw,{2JGk Æ C\~z]uLCl KVgj+Sle MBk5@n=%[x+8ZQIVޜPr |:dÆ L4#Gkv)((DR*dffJee!0@Jaich b 9e63^`KM jkp6{jjT_{`@6;g.0߾!A5 쬮W|dn]<dzm "첌 {볹$IgPc :AjЦ-:<$qg˙}]2!1&Cx{3=7ܣgTYE|F:7Ua%N,5A>cGQtaYhR8{u0w^qʳީ $5՚ammQQQѣGIMMeĉIz1cmvP)Kx. @yMa/aPbâ=}Y-n{ț9^t$CPV6=H- K;7#1\}Cs߰p7^Ka\#y/6Sg׉|$InRpp,$yj+\ڜ!8mH2ev'mv '$: T!1WkCbI-R72l>aY 2-10іtOL0%1khg`gHoM>=ca="ZDApk$@kZNj¢[պu4iÆ cڵDDD`4Z!6::F4i_3v՘m6~rNъ oZI [:v;}nۤbj#RAP061{|o "4M5MJƿ#3f@H0M[m>4oo>mqu!~Z>> 6̤DO)j50;]T^~e}5FsC9b2qdfLT .( 4w|NObow&BHL47='EY?p ػ[O0".#_ 9gm|RϜTYE`{NCٓOs_aK`Ao#%{ ]z`Ksՙ1֢ B$ۗ?b434j\UXDёcU??䩧bĈ̜9LLL ))AT`,Cd'Hrڹ;;SZVPe%J)$UT`CZ## ܠHI =B 4^JYVΖ3p05YOv`ZsV7؀BPJ| yNAڪY Ie|u&>G2 ;+ϭYtNpfû F( ,l\'~#K%07w{07~|h{ׯunxi>3NnB,g6Vk֬p L>iӦa61sΥԿ+ k~`ohf&"Qh`0e^%>>jgs,}p:Xs=g,KhS{@w!szg )t^tC)I~gy 8Y~xW}衇<7$CNN( Ͳnn8R ͘PJ~ȏ'6yD ~Y\2T\l9.p% m1'hr R5Oo5>e56w o?\.ׯgʔ) )oX[{xo~Ø1c=z4555Rغu+L-F#_HCCJ&@ڲrwa^8v>?H:^#J\SKk-5oz&GdfKVgӹ/5ÇB@H0.j޳:[sxmg[gL8 t:eeeܹŋ{R\\E.'/,_5ĄFp:8Yr~\jn17).ĆNbPP^Ķy۵J۰rrz\E|D,z,(Kg@ 9$qTj4V/ ?EQ=rILLL!!!=V$_SWWUW]Err2j رc8}3Sfŏ&=`a>,:ʺ 3HeI2ԘeI,ܦck$Y V!ƁAߜҞ7ήw8;Zbu'H?dܬ[)SP]]͎;Z\|r-j9u_5K.s:IΟ(l)+c`!jtBnd~Ј]#ɿHEb>&bw݋.l-R~i$v#'|k,s6su68Y.tjq JEN2"#(du&pA4~&t:g9i8AA~.VSHy~`N =y~jyHxӺ]xşSeN;Hj|)aH #8P./F!QjX?e{XDIi&T*9<\VE$( `tTK *;՚($$fűl~+/ ρ$]2sPz=)ITuH W Y#:T[TJ*+W/zAAiPpL]oZ \<:G%:G˳ANiZd dw?8XTܜN|5wH ?Mj]d"ZٺZ +/XB^eQA5.KWMD/t8(?wS;wwr~^z'Z^\KW0N/J!mAAAD IAAAAhŅWAAAAHAAAAZIAAAAV$AAAAUD IAAAAhUgw@A+<UV1wN  p@RNN/uuu'|ٳg^߿?W'Nho{^S(;cǒF`` UUUcleom>;36oT*YvmN?7|×_~lq?YYYKFnF`ҤI 0, lݺ+WRTTرcy'0e07o~znVNubgyQF]p555L4]$IdffI޽ի<^mpڵ}:'O/mR$,,,?~<>(uuu>2d@پ}y۸{6m EGVKHH 4Yf:^xTJJJx>|x+zty?~/孶xছn  Wfng'¼ޑo"$I"""lfΜIXXO?4ӧO ZMdd$^{-wy'{;_m&+V`ԩ7`r]wqvZ>#N8Z&##뮻.]j{L*++y衇(..LHHdzpѣw/f#// b2IJJ;?Zj??zsZT*={6FyN> |zr]6Ą SV\FR1m4ƍGLL lذ ޽{3|.]ڬ\&MDFFz vŋj͙3\-ZĂ %Ko4[h"/^̌31bW_{ە 11_deejرc|g]Y=fgg/t:{}oM>3gRQQwMUUоzܹ/2bٳgNYY?8={_~;vx}饗?7of֬YRɱc裏X~}ώhu`L<4 555ի9vy_˥:  3d1Y;8Tu7a{۹nd֦i/R }v СCɬYZ~IOO'++ 6'pz=ٞ:p8p _|5kr:t(O=ZG "-ZLll,?0<̘1l_GM8B^#{dtt44ۮ~}RΧ  BK;kۧ g4AZ$ ٫q:W ؗ0zŽ }oaa!Wfرp 4o;ww^!8||kb,YM65&''B޽{=oߎ,у0*++={=۾ZXӦM޲e~],^:ݛoח.]mmҥtV{ݺu̙3](N癥n̛7ϟ,b /_lO>2tPVXb,[Yӧ=7^*oZʳަMX`WBS 7ׯZSTTO?ŋ cɼ[-Zs|j={'ZVV /UW]NcYo]*w o{[VkT*>(z_oZAuu5GEP~:KD6lo~Z=Kgp8^7Bj:80 Y9|0s>fŚU Y{&((Y}WZsּ5fLOƠA:yy)Y,]l _+|  IߠD2o(FKg3Qm޼_|hGv^}U}FӧAAAdffرcy'}0\j/IRIDD#F׿5> !!!{5g۹C˶nJZZC 񚱮cxW=z4{ᄂ]/u^?M?]mt={p6gEGG3uT# nKEܹV(--YoP[[Kqq1qqq^˓=:s ˛O9>8s tcoqPєx|rjrrr? 4hu=qә-f68uO{QQQ͎-q>/cZ1 +X;v?mk˕t>AAZr@E;HɈBFRp]ټu\+ywP\\J"%%wqQW_ #(""iHkʺj~df/KV%Z[djj(:gef|۷K͆8` aHJJ{xzzD†  G&Y aкukƍܿ7onV^MLL 5w7(a:E'%_f͚&ض\iwE^^qqq&802ܻ6fϘr-J2SVh,Ck`Q^Ə_fpEÆ 3f zˆefSʻ\v} e9"?Kr}]6m$"kҤ fĈl۶Mm~/  V츅Ӻ_rtZ&`ݤV0`x8Ja(RiAu8]ydҹ٤Iӧ111f? , I߷o/RZb 5ko۵V^|L LZbht~Ň5\NFC5jX|SԬYvM6obC#2lXͳP6WN JB 66BMxwz*5b̘1fw6`qy&Mʲ:zŋ:u*:BAFl~/  VdCىoFH5yl]R&!JCVqY "##Ͷdl0}(TRek:t`v'Qxxp[ n-af&!V*MnSqΞ=_ @Ϟ=wGV^|)J.],6rYH?3<ٙ7|zkzHC+qi4 2]}ޱcG1222tPXvRzСCK- CpzoDEEI ϒ/reFY0:u-3f 6ի|g2k,Z-}1ݱ˵@;w '6T~"ao~r]Tl5L&izl_*"?AAȆQ]{jJ7T^}>DVӷo_aݡCҿU3cԩ /8@Ǐׯf>@jj*k֬ a}6mR͍PN*$wy\fT^*2_,G.;jO^B*x#MO߻wo&M/_?iɓ'͍wyG jT*ׯcǎ5 pn|a7 &&Fzh`ȑhZۮ]m2b/3gΤZjdggK*ѣG1cL&#"" &84?&-֭[3sLڷoɓMO>t:fϞ-Ūp˗/`ʔ)&=eʻ\srrbƌRWWWFM˖-lذ궆 6GEV5?mek۷/s!&&FPL&ݻ&z_;?AA;zUgSr(cYYY|w 8HVV_|M6E7qƙlYl))zPbO?T BiVdffKnn.5jԐ3ѣt֍֭[l2iҥKQ*ߟӾ}{mM7mInn. ,`o3oo޽{+4_ٲeK}׸z{kܹ 0aw׮]g֭T^ÇӣGzFA.K /?{/x뭷С۷Lrr27oޤW^v`ժUʌ3h4SZ5;B ((lݻwӢE za2dR+V˜9sJ=k9sd"##8p  ?p: McE8rseҤIiӆ6mڐV5%gˋ)SW_qy}Y^x MɓR vItt4_|J%5L嗜9s궗/_fǎtܙI&1n8^X`ֵ%?ak63{NNNR|>#{Ky  YlH* en_9~歒JLL_~ӧOVZEnn.'NK.tԉƍRwO&11SNΝ; :_~04h ر DӑիW9t[lb@zرct |||z=-bϞ=ՋP!--C֑#Gؾ};]tG$%%Y~ّ˼y'/_*˗sAKhh(իW'77s!6nh5ky& Rɕ+Wعs'f gҤI 2N:Kvv6$$$pBQϟϑ#Gٳ'M6ՕtRRRXzɰي4c FItt4m6֮]K\\\E'l߾SNѿٙk׮qUٳgP1m4VٳgYrt:~!K.%""Hw6r cǎeĈϹsذaIIIn?w\n޼IΝ[Tt[Ν;ʢUV4looo\\\~:Ǐgݺu\vl;[=Ky  #j֬i@Cft(7S8årM BY[f jb>|#%`Yd{V0'AA*+5<55EUp*AxEAgYAvyyy,YP4h:/_m1 BqD" ³bm~viÇ3m4FAAA~!IAAAA(YAAAAѐ$    mu<  6fyOAAAq!FcZ.uJu>>>jo}:7YߢVM۷X4g7om۶Eܸq瓞ԩSi֬iii,\Ǐu<(e… o̖\skҤIDGG`(UOXvԨQh~76nݻֵpvvfȐ!t___233ٷo ̝; >O[ v۸qgf땶~)OK*H^|EŅ;wpq֯__͚56mڰzj>s^~eGÆ ܸqooV쭯۩S'~Gya쥗^W^4iZ}6ǎc׮]ZVדĠAڵk5$g+=k.Qѣ\zz㐆>=E2yʛ+ߍAUEZ<6zܣ+cٱ=]UדE6$UqS0zJ jGoStfx.>ܕ4%//gŢ} <"6-__j\Ic[T*7o!!!N>} *2HfΝQFt:r95kdxzzm^z sδoߞX¢"G+@.w*2^ki҈0wV U kh 6|q7>°o_vz !77?~ m2uTaaaL2kײ~z222P*mۖotԉӧOK=>:FAV/b_t?S=gϞܼyѣGs9?~>TT*:f>|XjXٻwպueٲe%zК:u.kRSS8q"^^^,[ ///ݻ7ZԩCPPI$[wi~m 4@4 &RiQ;r5s%\]]6lÆ cȐ!$''`СCiٲ%Zy{n hݺ5ӧO7F8[(}=l25ja"gj~)KZݻw?p)*}aڴi9s  <<}qFT*R^^l쭯 .]*aϏ!C LJh(+OOOׯ_&AEݺu߯]Z~={iy:unpsBBBo($%%vZ9 TNůRy7-txɺΤܽO^N߼N_zl⳹{1C=GI~ĆeGX!濷;9u""/2}&'όYA5ZPO{K̚-`7-v\> Ԉ:}:![5rgKRI޽)]KAAٳ!+cǎɉ+W駟J1ܹS6[b IDAT2x`iV+224i(y'R$..s?Orrr儅ow^''>wEVK+(( ..N:ͧ~ʱcǐd 0NۇV֭[h4p1իWnҼysFG}ği-ڞiP1^O\\.] &$$pС"+ gggi˗ct:zPd{˓n˖-̚5d(OFFtJ֭[6oLll,)))s56mČ3ʋ=5+fҼysd2ofʕR[HLL䫯*v?ܽ{@=$)ZjT*-[ƢEF0C)J\qUJHPP4tPeU^A*g!]уWyG5CQPuʧJWNgik0\Kp:u#7Ng˨GeݺtlKiGAnH:s_}R~A7LӞ7E4i\U.P A-6:?6FJL!M4v{aUQ_,333;,ZqߐiZGi۶Ԑ$4gϞҝq7NN סb9;;Rve6^Q_ZZfoK?Off&|xl-׶GZ~=el„ L0dُ?H||ǫz}dܐ>[pSÑXi [9~y҅3{l\]])((֭[\|Y.nqFDz8~!D֤pB&L :z(=G)q /}>PT*h4L6d^<Ɔ,mٲCMddIC#ˋ BeL7$UFwniW.uoFp:M7u;Y쥄J%[XK)wܹs=ٳݻK/pBt:!!!TV@~0Ѧi 7@3{ln߾]벸~O'bVqãv,Q({r!s'NgϞ- kky)$}:իW'%%dtKl-׶GO')H :??ׯKmo _5,6jj֬Y?!QTKwuHr͛;,]G`{}}w]xSP(4jԨ35R-ZX\ǰԩSOrT>>۩5-/ hHdz Ed]]L/tF՜H~FUkcm}fL(ܣ}9}P:tuk-nSNhd{9tb/J#G,rbtPWFyb_TT;VFFTgϞfT*:t`u6@';w 99LJ8:dddo1.1[˵Ӣ"뉦MZ|0&Ֆu;>KE(idq#2+8G^_ {b-J&IW\ƍN̙3HmbxqֱcGjgԫW3))>|}}7ocҤI?J*ׯtЩwsFS~BN-^nj 3_/B#:v | _W/2om-ZDAA[f̙&oߞ?ɓ'[ɓܹsU2vXpcVѣG/cƌLFDD&L;ڵk™F!MknZjdggyf;991c ՕѣGӲeKz=6lzlÌMݻw"hExx8*:3gJJcK>zTd=!ɘ1c3IT2by֭[g-m~~>H9򉩗leoRJZ/qP#}eΜ9Ę #66LݻwjЬY3RSS?i~zZ*3fLFhh(SN YRJZjEV nZh+x LJիĤI3f P8ÇM"PYT1eZa8xT}4SǃF)4 &{ٮ4K8/+-sU W{CM[V0语eryafz~;Ndcg^b/U*RW|×AcGaܹL46mЦMrrrj&oRRR,{ҷo_!Ipd 8Pt:i9Gؽ{7-ZG 6!C-VeΜ9Vܹh 4 * p_~Y͛7ӥKիǺuy4DdѢE&_6ccc^aDhh(~'NhkӦ NNN1~x/MʝiQQĮ]"!!F{ʕf^޷V",,Pf̘F!??jժq1 AAAfە`+{뗊Pz޽{|[tЁs}pvv&997oҫW/bP|y۷9uDEEeǐdDEEvrr (lL裏-/X2ўΝ;|uz ֭[̚5oau+3f0["PYJf05Q{tu&7G˭9u~E)|O4 M˨zmڽpjb\2fs4Na+dirysիF~u'f9=8q"C SNɷ~ҥK;wmoΩS߿?̵k׸z*E6( yq=f̘ȑ#Ã4mڵksϟϑ#Gٳ'M6ՕtRRRXzI]rc2bܹslذ.];CyԩSGx`͛kOOOd EH,\s9B||\Ёɂ gɒ%Z#Қ5kU'O614L1B$zRˋB`Æ xxx0dȐME>}?~>>q/_֭[d߂ $ I  cɒ%ҠA|||t\x$kg^^N<ɓ'lv*} “NAAAAJDHAAAAJD4$    %"AAAAjD&+\{rj   P>DC`ј)1Vq`l]{Sd """h4$&&VtrA'  Pr!Ixf\p~@z=_uE'IpO> ><Ι3(/_Obƍfw9s* EByAAJN4$ 1jKy:4rLN_T@ cڴi,^1cpiΟ?_Z&))qdt҅ݻw3k,$&9qQK???+0E׽  ,࢐Szb~7KE'K(½{xw!..Z]m é_~|C]I{,0~x租~$D\wAAY"^#/: d8Dma_JիW>}:>>>L<#O~pvvȑ#\tl>  B6̝̻Y] ǠPi:|r5TF)))[{⹹ѳgO@p&qCAA(hH6_6{Yuf>4 GU*rqtevV㗤ߤ'wX!鳙{P^m9U ~ sv 2^ϷYl=.}oى?~MgU*BZ/~7}:VTDFF//...ܹsǏ~z\bسf͢M6^?_~~ѰaCz=7nooqvvfȐ!t___233ٷo ̝;`ueРAMnn.lݺ~^|Gj.]đ#G,ԩ5k$33~b_QhѢ...olܸݻwOtt4+W.ׯg&sW,mDDD0oAAJO4$9@m߆IwcPUyyXmjd;9tHgM?OƼѺ`ht&wqqq'33d޽IcKVVzڵkSvmtB|||fGaLЭ[7!ٙsҲeaP+Jžgi_'>_9Bbb" cԨQKkҤ ÇG3g ƌ\.G.ӠAs 6DQn]0`IzAaTRFB (( -[Ɨ_~Y|-lԨQ/@ӑB ݙ7o^/u-g}&  hHr>9dgvx.r:\\jnP}\~;[AoJ"Vd0pD+F==rg'BZ)q޽{Mp֭[/˖-+Hղ{n~N:FSūJ>}6mgΜ!==~g߾}lܸ?JEDD0tPZlVe޼y޽ZnQ*Ɣ)S‡דRm۶oSN>}o|}ԨQ[ngkˇ~(Bn۶-SNEP8uؑk׮K.ʰa6lC !99٤'l~$?m͗?05j-@P{Lbb"69=Cjj*'Nˋe˖EVV{FՒ@:u 2]tʕ+ǓJ_g >Ç믿8o5?2d lذ\|||J*%JCIlM׽<3AADm8qvqKEtה>;wO.wbü?f݋Mk8d gl^'/z{9U|1oo#8-[5k?.]RuE'""͛7KJJ \vM61c 'ٱc:^IHHر899rJ>S222?;w <,jРAlذμRw,]{RPP@AA{)rh뉋q䐐Cܮ4~`{3 IDAT3k,rss߿Ԙ[oѠARSS-Ҳ~طoZ[nqYAAx$3 ?˴y>0Dv[b]уWyѐj*oW4nxQY vI4sy5lBspMQ-~fxX ^w}gގ;(((0[?:[RRR.rƍ >>ܺuȴg-[ʲN ž7,/^ {OԩSbcEIz,)I~:"_6o?OTT3o``{^ޣ]\\xq& =믿Z_[lNOI=Igi\  <+DC(tw,Ng6ngM(ͽ;=w- gٸRPP[|ԋoob{ܸQ|q™ li>{WWb)jlܸz1,5"ܐ>[zWtu;w.֭CPpi6mduƽO YZ/ALOOg…L0A nHѣGuJ~ak:mOk}& , I6pwh9$ u=F[UPtϦc<ʡC͛7M֙8q"={,vXqo7Ěs1zQ {wɝ;w]~eq~e*zz JKLLI&4hb$GE)ͶgܱcLPP>>>k׎vڱxbC׽(EKiiu3AAgd|^~5ҨmNrVxdg=QWf)zRE^^qqqfO`9 =uVjuOOOe@5jX^VjժEtt4zu,swYS2@ni^?cOGKÆ 3f zǏT*8{^yƬ婡 ӭ$weӦM3p@FɩS1b^o`[5^>AAxֈ$;ٵZK?>QGUf}k{RG--hޢvE$X G3q~֘\.yK!t5,>|jj֬i0Vե8D(i8p r_~+W˗|5n08oqy&MY̮_.-7ij2 1&,O+M~ڛ/ Bj4ڴi.W^QF3lX\n~YYYܾ}:v}dŋL:NBQF+uʧWt}&  O4$הyrܜ|rgţ+. 93i22^Q>,]zi}||,xWh4d2]v5cǎ89/^iFYdySJ/t 5kSҥ]v-kڴŇxC:>l2պEpe1l~O{e̘14lؐWgˬYjӇ(~0hQs$''[&eh`_~ǰ'?j|du4^i;V>mM׽3AAx!Nz=Q\$^Iz=\hj/o7[ЃE {i0 TquzɏуCH&6EwԟQy_=6;{MG8:w}'O4CTү_?Ǝ+58B~~>HQ9VkqEQPP@֭9sC۷?fV_|1ӧJgr!_Wח_~7|L&cƌR$RɈ#x̆=z(|P3f d2"""0an=E>}t̞=[u/_)SLAyƜ1cѣiٲ%z 6X#[waM] %"XE@dq⎢kն:]lԎ۴jӎvij]ֺ۪hZw7e}'B1 I $|^ͽ'ܛ|%崦}F!BZG=l@R֦+r|0J u8[~}^WGBH˕(_-kGMLH;#sA*" aaa 3Hc,_hjj@ @nn.`…zӗۂ\.GJJ 6n܈( ڵ -bzSUraKسgbrgb͚5XtMeܸqpssÇn[Ԅ{|l6uuu駟{ /{!͛ǔUP͛裏~z,_{AEEr9߶XzaXXhp-lݺJ%>HRck}>hb޼y8wM=gffbL\7oFQQx<b1bѼIgGիq)B Ç8x ^~e\p`_ִ%ǧ崴}F!BZ$=јR o\oǎᅬK.٥ l6A@@֬Y}]e>M[z5b۶m.MQw3B!z$7F 9Q 聸!$ˮC/B`Cbb"PSSÇۭ]잺{w3B!r${8b3QLJ$28:IZOd۩]@ 󑚚ׯ3CaLJfyfdee19%G=uv gB!q8lkv(Qf1aL0 ppp`ƺuZ'Nu%G=uv gB!G$-w!H#kT@Pf@TF{7Kq8ebvjMMMP*Ń{n|hhhw1 ~=zիȰwqH@!ҹQmB!B!bJM!B!BB$B!B!b $B!B!ЬmBH֫W/ٚB(//sHGv'BPmB! ;x D"`׮]XvKD:;!Bz$B~< 'Os'""= 777p^/g{bӧ̪7dz>D@(tׇ~aÆa֭X~c6)S`ĉ 9s/CCC2e jjj~ώ`i̝;f©StR븻cˏ9+VȶmBZdggc߾}8s挽XZv-"##vZڵzg]]^ =zW^5GPP֭[طo_|||0x`wΞ=F۱lDGG#""^^^H$(--ō7pbG?z] J#|0B֨=yFUO#f޲~>!b8yiDVf ~6*z_ҽ_sE&L`bgH$‰'{ǨTx<&8qD}9sLDWVVk;\toxzzZxrpww;`\xCܚA 444W^ݻQXXhK<_waGR߾} I"^)S0A3JXc˖-H$988`̙[ WWWb|>fϞ3'JR H|k9ۡ#ut} nj3Phjj#z^z!##juLq&D?ܸ4/_?ebG ?b3EL1c PR P644ثXw`߳-\.ƌ}SM>>>>~ $YK۳͛VSf zF~~~0|cԩYBx癇&L4$Stu'M?Owlœ+k3HF@@D" kxx8X, ;$0qDp8j3DJԽl@@^3fvFt_ 0TTTॗ^R4kۉ'WH;kv_d qo[ i=z12ٙM?z(^v␤l6Ν ٳԢ^x`X@||<Ν X%K`֬Y(--w1g޺u , }[޷o_d.&!!|> سgjjjV{Z}E@@ v؁sΡ())Azz:~ k֬mpI䴺+z 8}4Ri4YfI9ZJR?B?a^jzz:ә>|Ujr, ƍBtOrd KjFޤ[T UԨl@h_xڼ>I}yۋ(/@!WAV6uJ N<95AWR&qowmo(;{RKҹP[Ɏ%1MTBTBPb|>ƍs IkHELL DE"q n@s҆w+8$ rssqETTTm3vX"77;v0YHm^+W 55՚ϋp@ffAn0=1郼<\"`Z JX,@FF녅(../orCGG}ZZ/zc]}$gl߾MK\.=ペ:u ׯʕ+J n.:/FI* wEtt4QWW>}bFGGG#)) jnnnpssCTTۧC(== <3Lo׭tvv N2>} uڼ62d說*xyyW^Iv7ؼ-->eMTWW^^^۰l먩 P(ȑ#Q]] .t&NG侈ûodOxQρ }! X mN4(o,_ d,YD/ٳS$!""?~<|MTW10)) ߙ,$''#<<ݾSE">c-򂗗ѫW/|Gk|>K.Ebb63f Fu᧟~2_ֻILLDhh(^zvIo`͚58ui&@~~~suX _ GGGH$|DFF"226mw}SO=jhhZF=УG7~^L/ kDDx<\]]hnh#""hT2>[f Rrr2}f†899߿?+Vz4muyZґb >؂X̒|Xjh%1uTDFFT8kʕ+ @s.O3)mlοNjd۷oFѧO\t }Ecc#Sr9Q^^D___f^~e|4CD}]Qpp^[aXX|AI.CR1ݩi޼yzA$J&fF`rdzݶ}}}1f5:ݭam;f7nrss";;B/fΜ9sҥKz[ ǎǑԛ;fϞSbѢEDy&I~>>>شiI&on߾ OOO̟?CɓuV'~譑A猌 |&cEEnܸa7GY-͈dI}f`ر&H |;wÇcǎō7gK.\_;x{^zb@B{ٳ'@YK_Dtt4d2>&eñpg8k5 BUVرcPT2d/^wc .Lrss!J۷oG0yy5Yͅбcoooڵkׯ_GRR^I\klhQ[>zWL8p%C&1Æ àAh|>Y#GX]NKi|>B`6b h@ BDD~/Okʕ+puuE||< pppp15ǯ?Po_Wϝ;g2m [էJNNFYY}]3͛7l6ƍ2 Gł 0snufmXs^+tꇌb̃ Ba0i  67xyy᭷޲]hefMۼy=3g~zC^2@J;w[amcDVz.MWQFA,1<==T*ٖen~BfvVqum4O>$n޼_HLLD||< fߠKd.rRYYYGddމ͙İF󲔗޽{ nNM8pZcc#;ooo!>>n:ܹs}Abb"R)ܹJ`;P[[k̖,mkʙf ǏGuu5ƌ///ݛi?[էgggL6 8wnܸD 6 CϞ=m6TUU1iiiVjMƓ{avc˜oWBQ^ך,B^CM g߾}el6˖-kzcx׷r\*--M/[[[4C322&7Uw\~MoX@ҽ{`I-ueoo!!!>Bٳg͚N f[5X +bccR>> jN{;99KӦMC\\.[>ej:mf^]m)k+nϞ=FH(* ?Muwaw";;O<`ٲeػw/߿|稵:{,VZ>z>hS[WWvGږ%mtD9;3{]I<444wi[cpp0MZZ1bF󧧧#<<}Ejj*T*l6s!cmm-3 vy5[n!((VLѣG///L0&L`^J8qƏBa2Zիx'쌐@`G֧52eܹs8l(..Ʈ]K/Çg:;;#112D]30Hꉟw7\AzIS54I\Ont_ӮoKju{bgի>S{gh1C?=k̝n\wcOR˙&kRB͎v/] ,;sNC1Zw 6qqq? T*5?<==m޳ͪZ>ŷE}6/ԩSFC[-[[veZw}/&NH9tVZeYb())E^o`Ȑ!XkrkӒA;XI]4m^ki*ggf+iWURĉm1r1qDx<ѣqc4i!H !prrBCC-xt{5D"åZBng*lBOe 0aaapuuB@^^Ν;til~ejK;ZR8;;Lܑii2&bRT~:ƌ0fHȑ#qq ꛐq1OaPUa]( c4OY`-i'3ӧ](;w7nD~~>ť |{va Ғ,t?c#,uXaر8əC--w888… ׿e{&Mk`Xܦ755Kjت> ŋ#""-_o߾mV"ƞQF<ٲr455 7n|M6aСx駍NU|* {u>~z=!P(g=HZVA!22wAdd$Xy[].4'nw?S'nO{tr/^ŋ ^vo-ړؾ:>-ݼ+Zڧ l6"uuuLѣGch _yŋ믿#uJNd# iD/vS{QNFs0{iU*5*Lf sΕjkӔ0 ˗/ vѥbijy_s$X7LX;j?[Ӿ_KԣvSB("&&|зo_;,8-MЭKAItt4Ԅe˖̾ wZ;vXl#ت>?O> ٳgcziw;+w899aɒ%Lʕ+믑iz6W__ 6`…3g>YZ'ݞ͙HrT>_Wb~.|UUUFHl6)t^z͍)aam&[s(((:]pkkkF 8JMgr< e KۡlTPcl]֋`S3hQcztf*Pby^v%(8xR垡UP*C7 Iݧ=tPA$mtsEEEVK7Wd={drh5J&ts"5֞fdǧ4yjzR)Ν;m۶1˴F7(K{7440op8fWS;&Veޠ/P$[߹#=Rk|]/zeϐiHZǎCII D"O,>-=߿l|g )rrrh&ƂI"Ȭ]EW9l...Fcbb ]o p8|ioG j&3f30~v)%`i9%}<4OےOKꥼ'.,H$LPt˖-Oۺu+ 駟>.ixV4_]m#5Ȟ l1H+v݄"}e@@^|Eر &cdSD#G4k׮1xwP풀:55??1=z聹sM~13)))^xytgX7o8{l/j}||j*Z )))6/gw8>'O6vhN!H$2+oPDDыdޱsUh[M<Yqܸq1b ]}ڻw/\ bn_}tJ{O{׋Cɺ:sŵCkJ%3mڴi簴>-=222 Hb&?~|ȡb?3fL(t+ɣ|(J?hlldT9Iגt0yg22K.]€舩S_~Amm-SO1ԉϟGTT<==1qDoH$ 2ds{n-@N|>31y֭[DSS<<<<;y;ﯝTN(kii;XRΠ =7n@~~>RhDGG$~qhut}ZR/(++ Bׯ6lgG8pUix|D76*TȽz.E2ClxC# 3^{2Q]ـ`1:Οȱ~"==gϞez`ͨGMM \]]E>s hz|W8vL>?v^~e=z\74Ξ=W"66&pzj( jfт8p'O ܹRԠߺu6_~x~ώ1BVmm-,Y#??7x`޽myvttDBB8`cǎŀL ,L&kߜƍya֭ʕ+1d|GX~=Ӄ n+^`ĉM>|g螧-]6޿8t̙H~[l`Y}Zz>rٳg+b>}, Ç/q\]vaΜ9"ˬwy<૯… eڀsAA̚v-j5/_O>D^kÃyp8zA$Zuܹs6-o[8S/0T*'_ތe".4h=s=ǧ%,mw]* 7n,aI;ѣG1l0lܸy`m̺ظq#^u$%%aѨ\..^"L2}ݻƍCPP~1AuqdlpBL4 ;=ze\)))HLLDbb"P(lYjҥzA3Y_~޺a`Ǒ#GCիW̙3̺]^::t>,O]v|ѿDGG?dr:|'`-mۆX|9$ r9b1^ >otCGsY󨮮FBBrQQQL\t III\.ǃvIݻزe @TWW#++ gϞ5(==8p ! !JQ\\k׮4d>}O<b1둟+WC ivhիb1B!x<d2JJJpMdffMiITTT`Æ Ghh(rЀb8L;p"$87y927prQWӈ7Jp;(x|cر۷/ܠRPYY2\zOf** `̙=z4!ˑ;w:9r5555kz L .믿2fK?>0fB$%%%t٣MSS/^ѣGc P(DUU? ++]nݺ_  c˖- $3_w8>СC3<'xŞ%Ck8ərss1o<̝;QQQ}6~G8q`;vӧOgrѣصk~Vu=;xЯ_?0AC=lQ9rCEbb",X?L^Ç###< .x"~7[~6ׯ!Aޖ\EEEHNN73ب {ՋC{O d]vaڴipvvԩS\mԧCSS{=#B"___xסP(PUU.S F&ɓ5j ,,i׮]Xv=Gyd,>lҐ"0|@,]f&\ v{ i󃣣#MN .عTB%11ѢӸ\^e}v(QAg۬Z 4hs8M)MDP999q){#6 &`„ P((..3yCvv6֭[gR$'''8::B&!77mjB?hK.HE]|;wDdd$|||Zjܾ}?3Ο?obvzt|T*ƍqF{b61OSS[RDVVN8~IթmB!ff2GwQ'OB'55բ.]Eٸ4}Q B!B!B!B!P B!B!IB!B!,H"B!B!f@!B!B1 KbԨQnX[[ɓ'K!B!BHC=!B!BY z$iݼy .4JjB!B!d IR#B!B!B:1$K}HLL7`ȑ6mBBBVQXX6nذa|8Ν P@裏 !Jw^ HHH@mB!B!Iطo_˳yq1`ĉ5k{9HRD"H+V@YY]G!B!C۴>s\|&MBxx8P^^4l߾]/!B!BWmBB!B!ίKF!B!B:!B!BY(D!B!BB$B!B!b $B!B!P B!B!IB!B!,H"B!B!f@!B!B1 !B!BY.B?~))%efm} _B[t!?Dyc7,b vA.^SosMn7c=VS -G!B!zYf!::"8{,{ٷl"'^=+fQfoOLFJn"ZER^}Wώ%2Ow8r8ZSb#mB?oTDB U(Y,B!BX$ :˖-Jxg1b[(//s)_ J%~= kpؼd :`;prZYtEJm~kX!plb!rwCRZ,)ś!=)9!B!Ħd ~~~4뤥!((&'$$6mcٶ/xl6}"=Taa8l w7IR5@6=DZMy H ÁTBw`_Q>۟nx.G=7*8purD#"E>jB/)x\ ō2H$ ?$z*2n<] 0|^H[(`X/dI}ZzX,O89j5y#*-Bxa}}JY, (tmcM+nl=&a(ܯoUl$xS/$AlFzB&r(jl tGС !B!d )00~iH$BϞ=q-T*fy@@X,tcކIGn<E3=8ZV3@)j\ZdC qqax1oKQc$o+JeM26g1^Hĭzܕ[DNx!@ <^V_+P+Wb!{"A슜j_i5z w>JLԴ\ r--L;Yف=ϻ9FZB;VSS(mAaaNNz֧8/<& "Q f3f3w1&hjWVHi*4e1"~kۯߡ2D#ˍGz"+@ $_olNx{"LZE\]Z(Wgˎ^&B!tR].C,3P(ĦMn:,\PUYpttK9mfccn>r[IBo`wyq @\]x(B6̚T*,.:^6\S|bp{JlZKU5STbY*|ZM-B(Mes PP@`XgNWTbCn>$Q(P*k©Jl+`ֳ>-9^x,=58Z Z՚z5>~UQP\ք S[~m=:GRR UPPC3t@q)l#B!tw]2ǐ Lxyiz*uBǙ3gp\|Kl{zȚIU*&R+5G7>u(ԩ; U!T"'f蔥:@Vײr\p\x\;g"J՚ML%SpBm~kӒ 8\26"#ZC-t&ڢzu^Np|WڻXUe{bB!B:.9,q}֭[ 1u3UZZŋ_Amp:ljC 0}Eq!p z&8  7W ,XQlb=s<ʫZpTj5,|aXkڀJsREcQPIn4uRJ|JK| Γ6ݧ1h?Kο LytG;B!BH $I H$,ZHo΍a6~u 7G49@ljT(lA6ޫt;B˙9,BZvȷSGAZ ɣxjЧM2tYS/NꥥD -=^°֎3vT˩!B!]2T^^"@LLu322:\It.vx4Hbepďʚ48,B']i.@YPM&nm(ڃzDW~&מT4\7x:AXf(֧KXb>h0ɉÁg@RABXJYJn<`ÆG'B!B.HSNƌHƥ8i8q{`ժUXjRRRl^*!2& rc3Q0ʝHd՞"ABp0 pNz`i%tAc#s<׻CZ;ͽ[+ZޝǷU\y_9q 4!4Д C3gf@-vJ>-LfJhK ; Y W/e[lICbŒ-K|ޯ/䫻sՍW|OL1=R"cƦ42qɶg E[כH@RAlḰyԾ~M?DDDDDD6 0x駑A0fZ pA4 &N'b̘1i/(Y4';33d r ,+*@IGӓw)~QJ*݅< 33͸=?-|WR除H 7 #`q=tUJL$QzPՓF+bрG¼-&dtL,\߱ ,͆2ʬcEI!2< ^ήH=^u.XB3%3ftI7iìƬcAn6G_/%/R,\kȈ:,Ɏ%"""""JVL /~z &Lo@ iajgR(VP\ܑj+N0pX][1dx@*RA&'>wF=vC9B"C>+~v780d|ܑ;ʋ8XW\ ZRCWR@~1LNdAZ zw~9"""""@l۶ =-[QFAӡ;v'45p(b d$*% κG g8ܧuzqcj䂀Rg9n_W5(7z- -!=?WTu&Lr9Qr}緯8vF:ZV5mrb1@e=}s0@FB=+)_*pɉj($~?N:]lO˰tH=^gcvFr~ٱƊtK?&4cV\o0 -ɉ/oFêV*&jYې_RsGw]}m$""/[E@@q.(U $SrA 1TMrl?,)ipDf*$"""""JUΑDDt5&l6" |P ݕ-xbu/$ $S~QVj5U)aET`[lLMDDDDDidDDDDDDDDH""""""""0DDDDDDDDD a @%$""""""""J @?*)XXAǏ/b *%d8hϗnan6fg‣ Y/C.óÇ[U˫R~/CbFwD])u&#xz8tXZ)f#|;{8DDDD 뷁$A0rH9\s Fxgy^.!0hSN" Quxx`1# {YY5/8rGRaS/QGffJ-.NRaрfPK%`4`^B: Xpɀ8Q_oIZk׮b$ aT|ffjjQM-]"Ys tIW7fZ`VQa )eC|lMNW> CDgJh(Ѩ1lKg.덹z{\g2bل{E%6ǎÑ#Gp1?"uh@R?Ja>2_]zRW-uS0v<W|:48P"($X=^jӅ: c zDBg6Y߀LFܘeƶzDDD/@)R(\ߏaz zb:I}< Htśb6#j# Xw/QGUK ܁EJ:-6Du7!SPǝQ m IH?Q߀٘j6݋5 o7֠T 5 ~p5CcEjT ܁>?N8]cw%jΒ_ym=މS" 32(#(xqшm p1SI%9; c 0epui5Z];VGZ*Zɚ ʲ`N \(;yIFlV3f`Ō|":mi\F `VLFr~llյnK~D?G33͸#??*)l,^r8C;O8]ݙqT:ެF*d2Kltddd(k#YZ7$hĬ, 7H"""~aXn˖-c}`9YlćVtU,_ă((cɀ z"_fcNvfxNrEj*hbڎ7d,i  1sUJυv%WEHf{ IDAT7dA+큲d`T0Pu6U挫Ji(E!g_g2biaS- TR h5`^+LJ 7 ΊZVbٔr I.xxP k5(B-bŌMLu_*+#}F eA[}.-f0h(cN ՐzбjQNO]zDD4:vƬ, g FDDD}UHI>?7:1֠XCvK&L0"_?k< 9Lò|<{ iHT`vaj+"÷r9P]T4US&ܒfZؼd*a1C'ֈ:kNyw3 r9bt7XL_=65+F ?DzB;]n> iqwaz|^WFrAXcDgnloHx>* ӇoR*A^Zm圗Z ^+=@fq_*篫Fh3OJaVȱ6jy,=y˛[PAJ&>ֵD](XidۥO$MtrHR ֝wwl TjR䨔LzODDD}^z#ԡiNm}8h6@Ti5z+|bdΆM1䒥H(/<@NjVEr}<aJxAHܖY^|= ȰYY/]g^m6z'.8~X=^la݅(LPDE1b[K9ꪞ>Ƙd4Jso$( >l<@l}7]d?n/jên0FM^:r}vl߾{or`F<2zr  bo8g ]Z QWJ%3d蠑JEl>8t沤 *ÿf*wY_RRPBPym3إxbj:-TR)Dcv9r"K98{"vحC=LAYۥ.=yM}"m"KG5d`р(⍊ꄆ53ʼnﻪXV<=v<' fS<>yKA qķ.on*κ[Bc$T6tc%IuBsKd.W믺*i!qW?A (^P!$*I+ rט;烥g|L~T?G]pc20d6mMM3-iݝk*ғt'&]SV87R@k :vX&ދӃ@!HJ$/ 1P@MЃ&'lpXYg"MF?vO3\yZ ;jχt^uq H /+zicldžj {jwt61B*ғt'&]bQ(Ѐblog o _g IDDD1\81hx_{z mrZck$cрqF޹Xϻ;RNnRc^cZ&yR9֩+,}^Br[ljMYhDZ*ÃJRӅWWt9)H/ԉ3Wu )''/^x5NP9cȀV&Eχ]6;>QM-76aFCrxA\hnMN|Qيz&gH+Tn펆 u^/3`ˡ碒 n7n1LI.T`xQ&''dEkϜ, &0picc ,]_WrRUx07; jd+oy8hGi{}i4h2tHkTD%R)"v70DDDDӳuL̈Jx|8?zLT˩)[̸ ]"""IDDtuo4@+p%Y"6B0+#ǤDpcAQ.QH"">-G¼Pr JĶyb6ŝ( T*CDDD0H"">(Vy}ڳytZ28|FZua z ́N8PUr=ˍmf#J=)&&"""""""0G%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(!.ms9sPZZ V ݎ߿;wѣG!bdիW㦛nڏ(p\];p=_ t:~~zf“O> ǒ%K֙0a֬Y1|\mq=\n7_FUUUJ~6l-Zk---ݻ:nKcc#-ZzDDDD $Q\j=Ǝ<339r$z@t: z+_'O)S~:cǎ޽{;(Ǝ ׋?OaZP(0tPL>͋#G#R)1w\u]0L~e˖hypw`ɝZ`ѢE}l޼_~ظq#?{t wߍjł &`Ŋ0Lx'q=j,CWw}7>ÛogB.cذaQXXsoV`0="""H""", f͚o~>(_ӟruY s?n+V@^^&Oܮ |;0ew8?~< PYYw] nyk@vêƍqy] ßvu~ eoVzþ}\+uɶ(CBq׳l iwߍ.++k~ko{ܹsC^^~?Ы~92dHuZo2 v=fOVψҁ$"""I*6R(iݷtvO:"CZߺ<7"`޼y,rRj˨oƌm۶񤵬DDDD]kC۶l[&""j̜93mO>y}??͆,NF Tjd2 @ٳÔ)S~lرcO3fO?MKyYYY .{ͅ`|7\{QߕX#bx"6oތ9s`4ilقȑ#hllLz߷v[cǢޛZI$;.jŗ_~~AN:RL<9*ۇ 5  s璭~׿\҂{.f΢OF^777DDDDIa |xc̙7nF^#Gbȑ3g?>\s >쳘v8XzuTnB &ݻQZZ)StHE|z!zxzv؁^xv{֯]G[Z*̻DDDDbm"""T]]6l؀-ߏ?0i$,_}˅'N`X|yamǏJѣG۷o`ĉ&χ9s@Tv]l2̝;r V\#G`ԩxGc&N~DJuU0_KKKR%""{$Q'O瞃`+z9r+WLx߭þZ-6msRǷVcc# ̞=gFMMMe  ׋#G߰n:L6 ~;6l~2CuK]ktg '""e̟?z>܂ `ɑr믿 t38{, CTOq}!''wy'֭[ mݺ ,iӰvZ4"""^IDDDN$gHϛdM:pܹA } R*[WȐ;:@j{w`4=vAAAZ@DDDIDDDZƚ5k/c(,,BNÈ#zj̛7|ANeee$Qټy3ZZZrbƍp\tVӧO/ Pp'İaàT*j1fZ OS*_WnlܸK,wމ/"P*Xx1f͚Yfĉ19b{{Ņ :]#bwߍW^yC}}=~?~?V+mۆ'xO>$~Jj}#"8ậ!C ;;}oi6l@ ^ / ^z ?0>cTWW'Oz!777~J""""""""0H""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBH""""""""0DDDDDDDDD a @%$""""""""JIDDDDDDDD(! $QBd]"Jܿ A5ުƖ:[/b *%d8hϗnan6fg‣ Y/C.óÇ[U˫RfŊ{uV^:~ӧcxWҾꖟ3\7{_uCo'a `Ԝ0rL |k^Ly%?qJ475ϞlLbLm!N}w1 vˏ~_cz*@DDDtRs==z4t:V+v؁^{ MK2Q_1++e@ߟA\Y 9 Bdtزe Ν;32J' x|W!?ppͬvhk[0% ;}]wG"rs3Ro"R^zK$M6 O=dP5 ? IDAT d̜9O^.%Q13 TSjj!&]? ww O}gA.[)(//GmmmyٳgHjϴR5o|'ʖl476^U -~MӅ~\-NDDDDW~HX,x!ɰw^Y555=z4|Idgg'#2"bI Qo{$M>yf8Ψۇ .3g{aAOukŚv1qŌ" *@v'.;PR"p2(P)aV* 8|>tY 5qK,lI.+{#>⡁%&yV*0+˂a:- r9|o.nNaA:_m8cfXW)!ކ6{v]_*A&e$f.Auãz]رm??rRiԲmCw_go&ca޽rJ,^~!֬Y(ŋrvӟ[O`1h|r̘1uuuشi^{5N뒈۞Wygǔw`0 ΗcGԮ=T(; _̒bddY j⛣&*e.v_ڷՇk^ę=_,BuoÐ'Bk4Ѐ_lǞG0M풬֤k6jOA0?7ikDi~Dދ ^۶ -%-"v녈(emP+ǃde(7r)wZ˅۷c cIp#TE@ttVT ^npURPBPym]`#ԣ&S;9!G9p{J:O0/`ByB>eu鐮,'NCff&fsdO χ&L@6"jp -OP!o%rNDI Nf&K~]=RW$Õ.]Y"~?N8#G ;wT*Ŕ)ShpO>pRam"r-sQsYT*.WШTwi8>ӂ1xHddeAV+\NGu mSQ} n+GZڴ9f y` {$ $I~bլ_#J%N'um(_8|> +@5W MN|px`@ DQDϏZC&Y 9 r9K[M39X._Ee!ҳy;4RTC RXJ7|H>|84 jjj0~Hε@ҷ~no߃ =$͟hnjVjQ#}rbPDS}=+"rs3 lT$'omݓ"9 {)xǭ8{ۭ1R #:)Jl"""@Rk#0pԚGvXٺɻ8µ ֨1PI.8s^S& 69j{~0SͦUXsl|Fjp묵Qе &cݺuw 2gϞŠA D G Hr]cȕJ?pxOhFsq4'McȈYx^7gEK>&Eh_V7fB*ix% bcRIrs2/_ &iRWN 5ygCz:j`0bٳNǎuX[ Pa1gsXy[gYBI51Ctz֞24o՞P~;`틐3dPz'C ۵&#,E)?2eCѮv!"""j>tb֭뮻0goǣ8@e˖c=5k^!Mj = qIRAUC8OUN'@uuő#GpM7ᮻL&Þ=ٗvލpo#G|˹=y233Ӿt-sa~ۆϸpHOPoǖbT.GD̾CFg: %vڳCAơhH|g[ R՞; X 1{qo5̳ԟ4悎g:څ~# FO?4rrr ƌUVM}h48q"&N1ctK9B_JܖMx2w%N>3Pk д>SB |))~QJ*݅ ffq{~NE[AY֐WaaNvܠ;k "Feb@QTTF<K ⶑJ"puZ j㮗"rօbfaA3?*30W)1 Y:hi4gl6>}g( ̘1@vqa6Ӿt$nFfqh\ w߅kF@EqdʣШ1A }VeJ<] uL(?țf@kp%]ٖ(_vØi.zbPĠ 0GaqS0^^V~(bM3 Hߗv!"""jH/~ f Ń L20w_+/ `=}Z{#48vFTTTDmzjX,yy֘1c/F裏Fֻヒy桸o.^y^08Smۉ/< RrpĩȺ͍Mۘz a2N-N'j52<ޝ7]%i}KKKi ( 8DYQ'(W:?q2̅q アpEGٮ(  tt[GIlM !io~?s3|yt3^k>ĶJ/QvЯBrvni{=ndx=lw8V7|v=ӮgwlUU8&#<zIƨ$wȐIklLj#^c};۴Bv&+F<@.] 77 60|J뼊9}'&5: 'm6),bM jƓT:j<2V!D&UPUOY_@^UGx+ɡ! WV*N'gsc8zFcXڂB>9Ǔx"s}Ě0 UU[U20˟ d^==1Ě͜Os|Yaxn 7HwLv(\Mٌ?sٳj,{[Ծ6~p ^W#uܙDϹXhl6޽{}GΝIIIq^|+<ÖO5#8vr`ۧ+F})%y\uZmCɜcj,>ćSLϻneˈiҽZ$߹]c7\e=3i׳;{ƾ@EIZGw ͕h2Qt8GGsϧDy$ FկEqnW\ׇ8wvųn҅0.""""вe{\0&_Nœ@WH`Ox]:%l4 F? ,N'+έ\ jD~V+~+V0cƌfHDDDDDDy)t:t(]6w8 ;99f>,dL6ÑfI^ر#mڴ!::*rrrذa| ;wsdddЩS'>}:V:߷""""""IaÆȁH:JKKyꩧ?S <#O||<7x#~3G#IMMw,,,Ӿ}{ƍǾ} W_=ȯI"!C͛ٻwos#`l۶ǏSXXHxx8]v&..Sbbl߾ݻw3uf iJ$\ùF8VXXÇٿ?s̡UVdff7߸ۜ:u[ob9o1ȯIM,44^zq5אNbb"f'NuV/^Lvvv>C'8 &~Fus=dffOUUO>a͚58Nw=z0k,?.?>(<#ˌ3b֬Y\wu\uU=z/sqWK/֭[}_|E233y7ٰaF+d2o>,Y—_~hxurwҾ}{"""())!??-[j*-G ۈ`޽l޼)Sзo_,Xܹs|̙3'8w FHLLu1w\fΜIFF*K._X4hPDR󞖖Ƽy8|0<_o @AA_IMnzj֬YÏ?HYYPjxϳcCۗ_~YAzѢE$&&2o޼&Y5Э[7Ə&/^Laa!\wu;7|3۷o?v{7֭5ٳg[^^xXt)6m x\\O?je޼yXV˹뮻̝;222J8p L2}ʃ>ȽC=ĦMعsggrr2#F`ܹ,Y*۷/aaa>пZhA^^_|ETq;wݻwn3k,V^MMM {f„ {yh,:t 33urBCCѣ;);h4`jҭ[7y6qF\،nL6fGݻ`z݌QO#&Nȶm(((,[ɓ'5漟k|+WdŊ,\gyx93K~fԩ q9yǿ^qmcvDBByyy>裏r_5i]%wuu߮:/ug\xܹ*"""xY|9[n=x\+l/_NyywҰ@ _(."""""DRd鄄PSSC^^pFHNN&>>]9XV6ҵk׳ z|̙,ZYlYd\>qpv[߆=PB!,((ॗ^b̘1tɝ )..YWtЁnݺa37N=**}{${GԮ1=-[ƍy;v,oa"""""rP" N+pرzm~inS5ݻwݿ_~X,O^W$q9M1++EtBFF p p ̙3Zhʕ+9qÙ\ t϶-!~q.5ƒW_}ō7Ȑ!CHzT# ]yXV4iC3xs hs1zhN'[n%88'Ku5x=ZPRR5chk2)""-[zoy8|֪U+iVꉈȅM&zyBBו9wqO+oN:@|||xڞ={8p#G馛׫+Kbb"fb֬Y;vd]|jzvѻwo-t(Ԅ~l6<3m) 2'x$:ܭuHc={6555ݛSKDEEѿq뗕q8L>]槟~w`nqhd!!!|8Ć p8ף?q2ݺuk׮L<2l6lٲBFFG?|wÐ!C2dϫ5k{l̙5fƌ[nq>DDDDDDR[p!ǎcذaLvv6+Wdҥkmi\*-"""""""">QmI""""""""%DDDDDDDD'J$OH5w"FP>8zN1}bKː` ~(. e7'ijNDDDDDD`IΝ;ӹsg222ԩqqqL>UV5s"TΤ*J KDDDDDw&yW; i|?rqد "]$*vٽ{7SNmDLDkۢbHk ND&"""""r `IN[o~z+biD|0P]Sӌ\z.Dt'~O\ʼ>9er=>I8+CC1)w8(ɩ>hDE5B@ƞS/$k&5XSۊJ{nڞsB-Nٌ$ 'N9iJ#۶HV94rZrYx1f35N'UP\W'NrsUt$ %hn秲rVxUܒЂ6Ql"Vp:Wtb3;w$dw̗bہDDDDDD.Vl"11o<><wGnJl4:4֡!ȱz}1 iw'N-zΡg26ttj4r]6!gF$a:RQCHzxati0*$:\@^U5Sקm-[0 EcCMdYc%?l0D\$do0jM%$֧h0k-CyPN>$''.~V9Ę&3&cI뙍Fe tb2Zܒ؂p%GkA @ZX(NS7uKj MF,fb泎G %H5klIO籶н'lHBF~E|WT¾Sp21E<}M2vWP\M tt16St%:['cr-ܗo JlvWD1UKzF'N6uh##V\ʺUVl2ryd?a`b . w(ߟNt7X%&Ծ.,bE^>յ1[.JDP==bIy+̈$.֭z5c(. lfxrKO\,+ (|ȭ]cbHsv敉<-L=\4+(YWPLڂB>+I=RwfgTVa6d0p`}['p88*<J_ NJ`0"u?ۜN6,vo".idGFՉB>̞SUUy{̃`ߏ糭ӉdKQ׭ܑW'NQw _r%9UuYXmcnJvBM&=}?d6y;0l,8CuM Fuy[ %H:uׯgl޼év>=13Erz6,MayDFTa&Oϐ*,DrH0 =㬪asQ햽ueu-;EnUuc55TnM}YS """""r)1a„ë啵qFlז' SVI/ۄ~)lx+GFg"dXAby+)PlQꥀyAF/ތvO 0*M8 b-f< $~{NW4$;yhy:t浰uCUTz7Ib:^m]޿Ǯ_/cODDDDDD.t"׬f#G7ia%p_ed1K=WtgTjk,F#N6;G+pLZXD͘?4O?N$92d0~:r&粲4Ȩ+ dΔ64ޣ:F ;餼XN'`LFGҮz541""""""%ٙ7,fW)DqYX(iaĚt{L4ˎ' ~:2DuC$ۨeFNB:g_ Jm~h0f2y]q:Ny-6DDDDDD.Fo0q瘤8\Qkp: 2hs 󪪽&/LiaǏ.pc6{}x5yTmhsI!k\@!bL 757n")ۄ1UJۄxmEA K%HJLLd֬Y̚5c65\[څzJʈ$R?jWo8j"KX ʩp`~1He gܬ@e̿k˿kˈ3q hjjWl翱z@l/)d0pk˄ۅ~#ɤqߗ`1Q()mx"""""" :Att4DEEGGG7?,,={ҳgOv$1T9Ph*o<2{[R@qVOmC(wqc` M@֫C?{I}),F#*N'k jk-ڲݢI##=1^ªerq:tVLdDegL\ᤇ7خ /yXWPm-[pUt$`0=&ꌉU<eDJ+VZ&0U[s6UQ2Ӆƭ3M!2(:Q17@~"""""" F̙3ԩ1c0f߷r _S*gWiWDFp}|p:1 XR WEGz3sT"Wv{-;x>w&%#6hBFLJ8QmU$+ hNzxMQYCdP?"`]xcDJWFEreT$558NB$j<@|ø,<Ӷ{kh$;˶@l("k1ܜOqT8+N' PtSsyM2QuVŝNR}uADDDDDbwA'.o: t"JbA ɭbgi[J2^bfN|]XħyNk$|~,)x+aDTpe|Yp£#G]ZFXڄb1(SvUy'Rj.aaVXL;V7%ADDDDDbfhٲhYM<89u.i,=ȥꂮ$GB8f"(k߃\ʔHMiEpᶵ6,¡f/d 388g}vnEDDDDD3%D.b~V#?z+,,߿9sЪU+233o7xBII _u."""""K&J^kHOO'11̉'غu+/&;;^COz߄ X~}ۺuk233}'fNm=5kj￟G}Byeƌdee1k,:*=_ x+套^b֭/"lذQFqWb2طoK,/lqgcw7xnݺΨQ={6^x .]ʦM}OcZ7oVr.v;s%%%zHvv6SLa߾}rCi&vl㙜̈#;w.K, KXXO1ߟ-Z_|=o}Gݱ̚5իWSSSC޽0a^wKdݺu|9rPzNA0a0Zt֍GyM"mܸѧV#߿~_csp[|9ӦMj7{%88޽{7cO`4Y`TUUrJ{キ^?ƴiӨbС{T믿q@eݺuvصk_5eeeTVVeڴiѷI&UTTke Æ ;ܹ3|,XN&tRϟS ׯ/Yp{ݕU+Vpt:Y~=smpEXzG}ĉٶm>|e˖1ydwƜsoʕX 3ϑ#Gxg=FuQ"it[>_!yHOO'==ŋqjժ >;x _1 <׏ロjN걽 'OzX;vWX@^θMgee%P[KU6i׮eee|~!ϼgddz/+VxPQQoɽƘSN~z֯_ƷΝ;?~<5\Cll,UV}]0hky!C$))0dExxx3EW[ jWL>vDBByyy>裏r_5i]%wuu߮:/u5fϞ=빶+ܹs'UUUDDD/|rnzV,_r?ay~e&]JKK( @m۶kyc„ ƍׯ&-[ҫW/|Aϟ/Q ׶oE& <8^L||psZ@mk׮gm̙3Yh۷lٲȸ]}Z혷 '{<***B YPPK/Ę1cԩ;R\\w}?񏳮6Сݺun}go{TT )..H$5:G]c{ 999,[7o3vXƚaPmKIMUp:$$oW^ycǎkOs1޽bo~JMM"|˹mw盫q->GZZGtuV8q;TWsKLLU/%%%]1ɓ,[)S0|pFɏ?ԾN>22k$dѢEgk%WC ˟8w|)hc1盿h۶mm  `4/%xoNNn]&Ν;ˡCh׮GhX:x=޾}{ѿ*~bȁ7{p`Xh׮vÇd27ߐ}e0<*ܢE ɤZlq)|u3HsոMDDDDRDRrÁdbÆ 8w 8{nݺѵkW&OLYY6Xlقb!##ãp;aȐ! 2UUU̚5{z|fv;WnDDDDD DR[p!ǎcذaLvv6+Wdҥ}HIIWӺuk7H6 hwaϞ=b`z)VZ?jH'N`ժU7ÉHP"IKm hdРA 4 !>>}1{fRDDDDDDUWWoҵkWRSSIHHpg֮]|ж4.ضD$I""""""""%DDDDDDDD'J$OH($"""""""">Q"IDDDDDDDD|DD$I""""""""%DDDDDDDD'J$OH($"""""""">Q"IDDDDDDDD|DD$I""""""""%DDDDDDDD'J$OH($"""""""">Q"IDDDDDDDD|DD$I""""""""%DDDDDDDD'J$OH($"""""""">Q"IDDDDDDDD|DD$I""""""""%DDDDDDDD'A:L&֬YqpPRR/p8 '33_|2.vY߱cGuF\\qFsqn&^xn6<+Bzz:999|i~Grr23fǏe>C=zs5L8n,));8k;%DDD䜘L&bcc$333P^^5\n'""͛7#GdĈ?/&:::ЫW/FS!!!'1fZwaaak׎vq3m47C$9W^yO>L||<7|3w׾2dYYYgLcVZ~Μ9$''駟ox|^VVFrrǏc0G<5ܹ{s4H]J$YԸ99oMjj*}kHJKK#))#G'0duRSSy굫ᆱidbҤIу2ƍÇ}>/..>5{\rssOW_b0p@ϟ|KMMO#"""r6*-"""~s%fý~ZuyfV '^'Bb}Pr$ !bP7|37|s2_| /ƍl3o/dsmq׎h>`Ŋ455yme׮]~.yB.I-B!x~an֯_OUU]]]~VZŝw9:oٲEIR}%իWxlX8E!bTiiiѮB!B!8Ɉ$!B!B $ !B!BH I!B!BEIB!B!",HB!B!a@B!B!B!B!DX$$B!B!"$!B!B $ !B!BhGB!y*ägLGp`g~Gv'o1sgyk|3%^O?Gテql?ضaN!'> $ ! {$LL<21٬i[7t [3^i&8hoj2B!ĉOIB!(8LoҐ71{69:,O|6>yq >oX+, IDATJSEΆѮB!b$$BrnI4jnFg65a|4Wհw{FLL$!.9VK[ce;wh(*n&wT2i᝿=I[C#ݰ|ZkygSݧi̸"r&OHERv.>Wcdy琜7LӉسab7dmdKxݓb0l[2ҋpiRprp|8HHC$䟾!B!FBLr4ZGt۱$j(+f@ӒVX@=5yW,fK2J i9gr5Q^ru`OMaYG)xsqjTj5ٙ\|iol"1; C|F < 7a霳|v]t&Ǔ9q-^ Gϭf;`,&SIEKM-T8ՑkfL>mMAۼ]ًZ.%c|.x1l@ٜr4:]LiX]!8H I!Ÿ̉ʧBJb[,ob)AEI|-}ȐFh joogf6< E$!otN:>قY@UrsmtQGw&>=t%twJbӿ^ Zν{XxqP= ǢRp64ykAp7m7z=k|ƊJY JrR` kn(2^p.=_?ڄ5W_ ~YpK(#u !'hW@!8n߉å#^vrԕ>/O;:Cs@O|< @BFZۛ!jn%W@Ҙsszl}}]2K>C)AS]@h@kЇv8ޫK۩?Ԕ_l}^})釀hPFzB!N42"I!aKW#oOߺZ-91Ӧ0w7sxQsakKJd3eqLFT*U:^ɣ]=<ӫҋzEVcMtZWv.f36xwQ^.U!7dz12YdUNguu}G]40H]B!@IB!q\]ߢ|{Xpݵ-jѮ&'O⒟ވ`Z_O2eԒ=-#Fg[?}F;mkS2'n:# 8VX$!wrt.vw_똇稫^q7Z;Z\>HF]B $ !!^sf-?ev舖?8Gס38 Ӵs,ܳ=!ů=>ΛM"ҋ %%Rt\N=U+rP 4p8F]z]!8H I!!gdlIʍ̌/;ZafgXb:uo7ˮ"c\^]O-&)E8[z-bew!D"ヅBQQdO'=D`MtUHjW {bvfLY{xt$egd#htV+ľ #n8a.BH$$B6u{_y,v%Qt(I9Ϛ@otDW{;ĐY|b%1%Ӄ08[Rrx<n{ގJb>3PUEm8w!d#$!"KB-B.Ȝ8|o77٘vLxOP{4e7WK+?}盌;}EBӉdBr2sbVf9?{gى`6+J"wTrgLW&TyqcVH\xW*Ĵ̉X|A}ȚM/Jd/ KSR vh]!8H I!tN)93>gr9ގ)Ά|[4Wļ髯RS˴]@z=y}3vT˴/ g$l5*hȶhS6{6|H)$egaqģhln>}m-MU1P$כf#se*<ݬ1S%'jiwo Y^Ad0چzB!N6Ȟ*B!B!R$GB!B!B!B!DX$$B!B!"$!B!B $ !B!BH I!B!BEIB!B!",HB!B!a@B!B!B!B!DX]!Dn*#l_U[8Ց@рVVvh-LK$5x?vBQ46hEL?&MDrr2|ÇGL1ͨPرcG j*B!WIH2<Ӥl2:4ʵı 9C@^%m::]=Yj222HNNbhtRQQA]]]Xh4̙3͛ikkIZ-8V+:G[[uuuxbRV,䐟T*IIIbjtR]]Mmmmmvl6w了:d9gJJ 'N ;::㏕'$$p8lft:^E]]eeeC\ X֡C8rHX G$)B!FIHZlDB YIUײ_۵=tv:SYYCӑOzz:iii444PSS~, YYYc6cZGJZrQYYIcc#z3f &blق73hhZ%VUU5'Ofx8rtwwl}L^Vhmmxr"mZ>~V3g񶵵HSStuuhHHH`̘1 &MĦMB_]]{ YnG =B!9)I*[n.x ~_v8CzG&_=TVVRQenGBBFIƍr!&M:z^vէ.N'n[񒐐@CCsxE爟)))v^/۶mUy-p}slܸ&("mOG#RSSiCڵ+6. Ɍ30L8+;V"iO!B1rN@E]Dqq1+W w4}oL66ި㵪7ߩgMe߼S6NOtm2bTixhvf]Aj&جLi40ѪT4ww۵ TқFD:Ihx¿kAޘ<,HNdՂ]|:-d3n͚:^aF|d n67aCSvC=hAR 99 8:n>oi嵪yY8z;T&ä-(v,( 撜`*9g^NE{{{;FM)==8:oPV+YYYveN GOEE8|(((P*d2p`0xJh {pDCmO_s$, FZMgg'MMM=zw$B!t먬gaoǓO> ѣG꫇4-R|8tj5&#&#fg˂gqF>zz$Ti9ۚ[ӨT0/"?äV3?Ai \؈FMLDg{a4p{Xj:ޒ'.IK悔ly@R$i?T*nXZRχIDyf3ODNhT*&sFU6@^G0'Ύ& DZZv ,]!B$]wuvxr?R z=DzwF:6!{|>45iS py\ęIɡ=.{y)IY-x|>YVɖf>6DԂ"dvm=FR1->3Ҙ``{;cF6g ttbШoRf>㋴.LMfL3G+?*bٙh{L?׫kSc#V=rT{aZ ;_Év~Jkk+BȠ4fӕ'y< yyyF)//Y^~~>:}tPH9rGDff2R*E Dx3n8?z(]]]j),,$55栩}\.mۆDѐØ1cɡA A `Ν FZZYYYf^o#beOzq:RTʾz= u~NCw,hr4ޢ 򪮮Y^g̘1dff2aZZZ !BЁb.bmƆ F:1k6ݼQ碩;2F*Z-d L*7=?u| ͭ ]ӢTT*jxԽn͍hU*?`ʆ^,j:G=#=HARqfb YS :Sc'z(}qFn{/Zv"vF/G[̘5| }o756sٱ2LF>`ks+΂$\/_4=or?,:^^ =slDG4I?Z0M}o?nhi)}dv+ɇ2!횚Tnڈd28p;6hĈZF)ӺzRT() jgbb"ZÇ]/Qɤ(O)hyѣg2n8L&O֐p(yyR\ N#;;JJJBՒKVV466g@ٟDzݻq\}^СCсl6Nff&FI&=].kX֘?P! $-^ck ,6w( ly[N$mVuZ  CFI{3_⛻i 1=㡡^\ssCR}'s8"`AsP!XP#O뇓]γΠdP72J ~5 cZ)--.f3yyy϶mۂj"d?GطF=%j*O 5z\.X,vEG`0<}?!B14'䷩d-[ n+ & y;w7̹m}퍻hdh4***B< Rt_{\>ix6XQQjjj'...PӞz$|\.ihh`ٌ72UTT`p(XP%$$P\\$줭MȧڨN!BX;!I]w&~8m8ƚMY$ẗ3#ΚjީWתT|7;ZͮV'/WQ슬tNs$ XPiwqndG[-=~8ٝHPnTm6#A_YY$0ƎFdT4`0:u*A`駟[} lF6FT*t:ݠ#bSzz:*~e&8;55p: %TOj &hhhh`߾}J"222$$B2 7 7a" IDATzO>$/<Ȉԭ7߱l9}m4v@*l%i,LK&ڏ^`1xHYȼJC#`b Z`\0?}Dz|C`dR(;ٝY|- ,WTz:;;1?qG6{lԬ_ uNǔ)S0L׳gϞ~9۶PO #ڌP3~e#p 5P 0ӳαz^/;w ~"Bq9 'c}PC9>/ЪTdLU2xQ3,*J釞#bCh2R6 !Bȝw?}m`ٲeIMM[o((S-&T?ͫ8Ά8Jh~ؗgNVk !Zqy4jNIH^Oƚr*@YGd ,LKo~F[8:2ke}rpEz|Q׋IfNB<zG~8Q5S:ȨXgF"##.\mmmߩ9r:Ǻwuu)>}vO͛Bfۭ`0VgFFHB!$ٳ={6SN2 ,H|]mVFG?Ltp}nq{NI2Y:& )?/.ikahNV^$e,ҒnS⍷YYoPkMe5>q64bĢ03΍cs2+62LZ`P0_#n("9haC?%iLP%}F|_KKc-{Fbqi4vh\QB&'*#)bRdff2n8eDgyyy*j5'Onrؽ{7jN_)`%%%|>(..HIIaڴiJ.'*#_j5yyyJpRѣ|>f3ǏW:PjT0F6Ѵg2G#%$$0o< HLLd2뉋#77ӧ+˕3gcƌ!>>^ɅǸq;v,MMM}3ECmϦ&|>Zq)ۨj;vlB! 9"DrݭN&جIx|>4*[Z`g; &YqixPc7nUG+/6}6*3=iuJJgJ)q6^<>7?m"9ha]u-3c-f7&[W93&Ĵ,'7qǦZ867h݇ dSc3s\4:s|娈<|ڵKI' HKKCRzt:YYYdee|w>#L&yyyEy`OP۳C]ww7ZMCCJE!B9 $'JXT{n>nhzB6+FcӤ:۵ut}b[uwuqvLJEUG'y2RCxMNdv^Oޭk൪~? dΟO8ى٬$hT*j:dWM=JxE9xt:n>lh~7f$yPf3}iKp~&=[VA]Ws$t\T}KY{{;7o&++Df3j.N'ccדI||f\.hhh].}hii,( nGMkk+!H%0ծaМMuuuܹl6zNjjjOJJJp8L&etRSS3`h}JKKq\deeaPմS]]MYYـIB!DTiii'z'_/ Q瑃G}B!B!D9DxR zz<>|2B!B!N\HT*Aբ<Aec676 BB!B!8yH$Zb#yx<> U**:xr !B!&$_/O?MJJ ˖-СCY}!9 $.rRSS9tШ8sxFPۥr7*YhQ jzr󳩩GR[[6nOdknOnyv8Ywۏcrssf ),,K/?)t_˖-SHBq@ŋjlٲѮqcrm@zF\z5W}FФ]HI]v!l¶mۨԩSYl7kdJKK#Bؒ@ba…*דd"%"Fg_M"Oe =z#̙3CCRq-O<aB  $ 3Ĝ9s8S)(( 55NG}}=[n^ȑ#A,YG}C;`ƍVK.JII [lp]ҥK?>ձn:y<Om3|jggg|rMNK[A8lݺn`ڴiY?w8j+ HMM 6rJ>y衇8j Z6PnýN?t}Y{1>l/^L^^> ^}U#{fxbLBRR>#GqF^~eZZZl3X{=7k,VX9媫> \{455}s`̙o>`L2FÁxyjˡi~H= ?uHX{4vMww7:~׻袋(..fʕ{b8I i}k_ joo󑑑AFF^x!w}wЗڠd'NDqajYd 0rz|<4.]n馛׿r\ ;lFF!77ロzxh>X_Cz & <fӉ^b|IؖCiE9Sኤ{4"mOpQ[XXN.:qqq\wuTVV3~B歷f8NܫE_;w*>^T|a? , 99… gϞ=$%%q7rgp饗jժ__,X;vW_Igy=233+Xr%/"&3T)wy=zUW]UW]ŕW^ɦM>ؿ?%%%pjժST8pXp;3fvb z-^/vwqǀo];ԗb} (**b̙lذ^z2L&fRn&2ZpB.] G=3TWW+DZh";HĪH?cy{|#>iy=ӧO˗/Vel޼9HODprn8dk+`ҥl޼]v ؞ሴ=)pEZH=ϿX^GzeZFբRp8L>k6mr뮻<0`%!8QG'W^y{>H?O`08F}[_wjZ`஻bϞ=wh4O~cʕ\.կ~Ecc#VUiÆ njjjؽ{7~!N>3$7pjUV:;;y7W\qELx7i$T*ZJPSSիyq]w)3:::Xr%| з=P;<֭[7h뇞,?S_ǃcƍ\r_dG[$٬Yx嗹;ٶmuuu=z5k$CK,.F˗/s+A$rz!z衠y_D~3V{7=Cgg'K,Qn:rss9p@h΀hODz뮻)B./|gT*.Z2|g,ߗ=zF|:Dh}͚57xg$%%QVV~zsm66l: !h@0hدc߾}Hs璟_t?ҠeN,w8kٗRr)}^ollw_S((( /Naj:::HݻW73gT書n8qb6v!N?c|!Y~=^wc g.{,k)|V2o_/D&SF@JJ /f̙c6|X,T4+~YYY_z/S޻wo{מ]]]ʲ߁o~!۩|0v9ڵNV+yWغuk[ELSjdee)7!---|̟? . h:D 1tJ80vXMT@kk+&-g۶mSF hϗh.&L`߾}!iPŲh?cus|#>^~eΝ˼y>hȠM@'S P[}b("M{}i?ߣP=ϿX^G ,^SSw1mڴ:K:g~i~IxbƎkw&!8I i͜9F^/555:tHU%33Qӧvy饗ڦ/^jl6ZkkjL/=E RjYMH:ry$roVd?~ڵk~<k׮e,X?ϸn4 ,ӟp!..N9477whγa_K4.Qa?eyC?! u?!Xw}ϣٱck֬w|fO\U@!H|GZH=ϿXl4?L+//g͚5lڴ'x[o*Ad-[!h8~'@L'|*++ֹ[Xpq%7Ǔ>z={#HpZ~ ɓ)..&%%s9s9Gy!׻7oL]]IIIzlذYf@cc#j? 6-xy*7C$F| G$I9b3v|#>myguzr_I#}b(H3X~3~/:CGr}=\/^:L&?#/D#a4e]]]u]|B#My|>a)#,R`BxzF`z]rrrvF~:Uo<??k;pJ ET!|zVX^gw}TVVÒ%K}>~+/ڿTZJǿpxJ$t@ 5 IDATHD礤$tݓگvB^DGGoZ##ϳpKo|nd>v>+.. WTo+_7AB$M{>-ؿ?Z_ JKK}x"h=|XVT*ַ~Wx 5m8PO|Gj}l6U܆TJ'(p3vl|K,!;;J`xq8̛7bC5Pѣ}*$vLy/)_*w_( 995kְf/_{tZ,/ԩS~0sLN[o3g k$@0Adv"##{dtRyQ5Ҡ|X7oCA`Æ ̘1 b2A}kx \.SNe^hf͚c=w'l8Idvv6sP駟=%KJbҤI距]{<̜9)vzz:+V@R=*UVɖI r饗 xL@Rd:!zlڴ 8;I&œ&MbѢE8s~G)m8POtuuGe$''˿'''k"pJ TÝN%Li|̛7C=$9r>,{|j>ZͪUMŋKpݼ Dg0zgރB!L<ɓ'[ Mĉٸq#wy'ŲѣG`qZ-N󂹌E ΅4O/Yfqi"##jڵkqUW1b^z%jjjd'x>,z͛wa̙3ooNBpt@ٳGy˗3m4MFWW*+\œrlٳY|9wqlR;v8p]v1ennzޝ;wt:>}z8T*w[[jZFn oMqq1k׮jb4]u 6mƲe0L8N{~UZ/&LUVaZűw^z=}­XxoBQQ=׻wu DnΆ@7 >> 0g̙jE w}+L(@6R"Nv$>½ s=e eQXXlYF4 Hd֯_OMM _= ***غu+6m;87~M7Ę1cȐwz_X&vɣ>ʞ={;w.F())_ Ϲ8q"hZN8Aee%v?W(Oyjjj={6IIIUMZE1}t孷bÆ \nJGG'O&;;t:UUU۷^z'N*.]ʢE?~<#G+YO?iӦk.A/փngx\y$''ɦMXv-x2f/ >"CΆ@xg?kxl6_~%|ϝPKmA(?= DÝ`Y T*xbcc9t֭=I&q˷Nb> .]… ;v,vÇ/m۶sDԟ~)zgޕPGsNVXɓ)((bn{yfC@  T)))ׂVyP' i&Xr%~R9|t+DGGX&>ׯ_Ojj*w}7wwAȟoD\X+F~ĉyꩧx:9!E1 `"|$ 6mߊJ(%::ZvYWW {f͚Ett4ܹ}fffo F˅nD;jUeEmVyg)--~ BW.:ŋhhmm49 =laL= -[o233YbIg(Q.{Wއ'8& o)((zH}Qe҆\$Z~ Dd2[o=O:hg>z(˖-i` B˅|@0$`"##q8>|Fn7111\tEL&ƌ޽{e|/ZMss3_~%]]]0zh G$$2y&@ pf+C @&tg!t\CKRR111\.JJJhkkjRSS'\bb"555TWWv;G!..H||( p\3f̘_i;vu=JV4h$!!Ǐ{kmmСCϩp!)n7F4zȌ1F#444P^^WܩDGGS^^~#MBBBFj56N8AGGGH Ri25jT*۩_I:vpԩ>9}4mmmDEESc2b`0p: PHB/f"-11_El&##(d{{; TWWc8ުT@ \0$Ʉngvv6< 'N?`%OW$qERNpS44Шyng%i)]Nn$$XL*JZO{ӨT${Z͌ #Lyi\,7f9c)taԨɍ 72Qf?Qկ2)hQٺYe_4ĜDf'%z=4i(y)Oi=T*dTdϱۍIaz\Q}+9o%'"t9U* <[Y{Lzڧ&VcJ\ c[I>?{qS,ҌFn7 ^Ƿhx{z2m]RaO)ʫc4="zq:9#ydtvv' Z8Z̈́ 0͸nT*F,t:gʁ@@wvv!DRNnj"bbbN#==]hYWW^ _+t:e;&O8nii 2;1 ߈tw#{ERHn7Oְؘ(nLGQ|s$7en}#54r@R1>6Rñv46!d LIkaШ(L"RiUɉ|vF3!&f܇8ܣP-u4u)gFcRlDZֺl.S(3x13n;SIN )bZ|[h]j{:-X"S0 呐@ZZ#HT*.vRRR ""կe @uu57R9N F:::V:J7o\.:$JLL䢋.:Qt:Gc] M]] ^ȑ#IOO/^/X줤ՊFaĈ9#FG/~3L^ccc)((z6ON8Aww7jDHNNh՘V%22ӧO˖aO?Yiii _d"==]< @  w")66tn&.r.N<9D) *`ku-v{iv46iMէe$h`lYV|hT*qjeko꼬k$IYzfS'YyQ.QZ-_>tj8ARκ*^&/2=-C,y*4 6ÇS\\F!&&F^J&6lFLȑ#^TUUa4 ??|ppI?Z;v Q[LL }UUUOeOww7`6R(_8pV詋rX,1BVH/FN:%!)ctrssQTTTTx)t\֢V)(( 33S.`S?O%Oww7ɓ'c0СCrjl$1''KOK<豜*++JRyF@ ;׶zE1w\ nV6mڄ"99իWe!Ύ;رc{ cύAF@{ndzNd næʏ]ͭ>ҍ2LF\n77`_kEM^Nmom𙅆?( `sGb?O0SȒîG:>nj# Dh48n/EYo htc"jgSt\.(D}~.+$:].z s?,Co 444%%ZZZq8O+OtdffRWWLJ~|;d{ZZFvsQ2Qj5:{"66V~t3/T*yyyn;:jo% Uz>0'WzNKiKIДdRڥpfY>xo`d2Ɋ)͟t:"my*<ߏGv9~<^0 @  wEoYyy9?8UUU,[lN}~_WTEwtQ#g$;(vc77q:3,\e&^Š{joT|KJV6>0:Nv=vqg7=.JE^3v{4@9@!Rӱu #(*;|3:8]O}cP6J76/"]SjO凴`jtttp!YQp8(++l6KFF`Lee%NINN&669M˧5f~q ;..>{"hjkk|T#@ ΰU$ 믿M7DBBSLWt>jd5H#;DvDѐv/۬|ᶾs$geWq4TwِT&z1:YFE{E$:!"LRWEolQdxL:!t=yǨ?"ΤvOZQ ZGiaJ=ARyJ̗5Guuwꈍ%::J%3zh:ĉ1pq.B}IAV\{D\\h4n76v9Ko% ՟sXGd2a6)((AOY,)zT*U#[$>mmp8(V{[-IHys#/C0r$@0ܹ I.2{̻[9΄hFEȎ N.asM-7kU*_f:zmV6VLąt^ɣe-{Wu`P fI:or~a0#xZjN* NGww7QQQ-Y555}¸njjjd'߽΁.GFoQ\|h48rlY"??4r 6g\v{NBBFEKK /J[[~i@q_T.z HIrJAi8@  RgwSu`>oO&$LSȉ`nJ7V!D8nVqR+>;$ =t'֏ԇ#Jl=DpW`h3QTDh4>gty|C< 9˷?sJ^f 1MP%77߰'Ozn!;z(111z\.1,  |[arz Ȃ DyH숾3Wqp\<4j<3F IDATiI5?q.(_T&Ej4BH8a2úc_gw6vpK^p>*qn Y($ I`4}*t:]@ s!ӧIRy PP 9'Z-q=>`0Lrϓ@gd I[[ovGEE D<( '@p!0,I&kߛs~{ɬY5kְ|4DX%FGdW3Q= p13&NG8 ct:]Δ'b}9%/$ xX)iE'9#IHnH+ /JT=zaJ\e _tQNJR4gΞŠV3)g~t[HCoF#ƍcܸqps a]\7vyZ$''[^d&¥L޽{ٶm۽{7۶mѣYsHKK(RPS"*''ᠮMVUcvvO1H|?1urrrqqqrz;nllpR7ͽD '@0s-PTTDRR|r,Y@II w;L<ɓ'STT4(i>``^Z2gn(SYx F0!&Zvn `г`d*z^Uv)kvch)#MW`ڴd9n5ZNJ"beEQf&'y)<\Sflt 2,w"5&ưlTրZH.6GNp$9)BE%*zr񏚞1# rӢ1'%Ҽ3D37% ÙEc Zl.4B0Fb`XdŶ?( 'NvE]$+Vt:_p"33S0L=Z vzJ"))J@iiivj)((j FӯIhZt::KQhYɌ=Z.wZMvv6q.b`0ƥcf}YVV&!!B/$NGRRǏTGj7_TTT;O/'!!Nx譠Ql6:ѣ.}U]]^'++TRSSe+%gQo)%L8@ ΰT$8p'|ɓ'Ntt4& Jii)[n 6PtI&'QMVCM-[Ȃ>jn(3iF1gI5غ9 ?N}|#BɈNT-lkh4 *<1q1Xzl#g$O?4po[(2ӢQuSkqʾAТ$ga%8vZWmKGJ߬mHANGEeg۬'n25>&zVRk;o5zR*"",$"5r#xBMM dddNnFuuoGGw&##x"""PtwwcZsz50bRRR0twwS__Oyyy-B+++$##(j5r~w+_tvvw^rrrvsiNNOO'!!!$~%8g(|̟R.rr{s>…$L8)SPPP#fQUUΝ;yWhkkd2qu1c 222PT:u;v~zVks##IÀ믿dˇD_ JR]] @{{Xle˘7o^Rza‰';LB \^؜/lpȃwAoNEDDG^^W_}5w}7Gz'66?rXÁdȑ9+KRWWAh$9?>Z={PVV69o\0G8MشiӠ|\(A8쫉wAoٳg%%%:u&"##)**[o%>>իWs-`pwuYYYXV~Gt:;v,wX;cs'#IdܹؕD^z"ED;j"]󬩩'Np1|IҘ8q"1L6 gy;va?sz!|I )**:*;B4ȘL&L׾5rssINNFȾ}ظq#^a:;_W^S3gf23,X3fOCCyq:>L>L&MMM۷_|OH׬YÌ3?~<<444psS[[{'L1qDl=z7xw}r={v9s9=~߸q#O>d߿s5אl׳w^~>ڞdffr3~xt:ǎW_wzO:o>~??͛7c oAr72{limme]GyB>G?1^r=r=L6_||`dggv?𶗡,<ϟϸqHHHvSQQ;x8}t0K@i|{Bޕ/|M45kt:YxOko mFKK l≯'SOsNnvƍFѣ˼~e (`1OUoԻB'GTCUp!v;:TرcQT@DEEfaӟlj=z4GfԨQ/}77oǏ'))ɧ?$Ÿzj<#\r%twwc6k)(('xω 55j D`Y fDi/JҩރB%GJWރlyN8CEC ?zƞjR8z(ݟz馛Kp8YwyԩSկ~5bkRۛPm 'ĉپ};*'Od21i$y1 JPܹsY`c]S[[+c޼y~I o]IJy7׿ &O<^痿%ZM6{n'$W]u7ѣL&n`v,OPZc(wEi:ֻ/r=jVJb0an6Gk.]I6NV `\<|G^MMM/eee N:=^~~I V\ÇB0agڵtvvp)~_܌lYl߾A]]?j޽{1bfҥj֭[ǟgllݺU6?r93f *z֭['Oشi=\n7+WgtuuvZ>oy[@W\qϙsՃ>˖-[p:nvڵk 5J٤IxXb%%%444p 6o̪UNS%S.Fo^{G}TV"TUU{ _RBzWJ_yv|Al6]w8LVVGf>dܔp\\R>"ɟg݋J$Giy_]i:{0_(H PG&Mb֭lٲs=ɓ'{!mFDD{c P$ 2n9pY\z`Z׿u?3*++YV;@ZZb o[.} ' 77\N'7n~2"--m#LNWWAɱ/RcOĉex~AFFG GVV>Bp>ٲe .y N׿-`K[.DEEp8x}PR2`Pɻ? w?l|ǏO*3grի/8pǏy.|2eJJ`3T`Jөޕ#۟ٱc;v88x {orַ'\QQF@x͗|GXa ))3qDRSS3銌Fiz8'O\4/Ζ_ '=|WsGwwLt^]Z\.z~ vϟ^.;fa6믿ξ}oY:jȐ!OfΝ̘1ٳg{^ |_S䬾k%FmmcDj m/oH&9ә/% fJ_Pkq饗R\\,[ZO򩴑P:tDRTF###`J `0Afĉ?xs]w1wWc֭^C`.Çxb W -[;lcǎ$oo~'|_w]ϻw說}v&MD\\|~;z8ױ`ڙA0rQRn/T>J`_`9s&z8{ϗERy _ 3zW:ۮ!y7UUU|\~̟?K’%Kk׿NJJ 6>u @6>|@(qaXfʕynO|#JRSS>}:n^ziP␜Ej4|K)9lH# r޷S͛7˻yyy?eر,\zkzMLLG\.[lᦛnbl߾+2Ў\ ;P=y>v6TE)t#'˖-``=χ"l,Y &b /^u v>_#T/ڿTZJǿPC x"hȑ}~llܸѧRk>M p=H*Fa̘14nFLEEŠ9X|Gz>n'++K7Q.DRZdJf鞨Tort:|Orܛ<'UUU}~7禩L6 8Mԃ}Nf3)))~#mPOH2M8pJ ET!|zVX^gw}TVVÒ%K}>~)P_o_*w`C d< %ҥ2X oȷ pA(i9))I6]ꫯk Q IDAT&|`OSSyܹ}~7L\~@hRXhр|FFFg* }ر}W\\oh1RdVnItݻ}ZTUU~Z-1 #h=|XVT*R /]&P g;)>6Z-v[fpJ et΂oɒ%dggSYY_l6> yQ\\~J=zO0}׮]W)`%%K8Ot $''f֬Y}/B1N%rrr:u* L||~i~s3k,N>Mdd$Z]vQSS5\3w^{5*FK/DMMlOgV^ϼyXݼ;?9sp7s7)[8~9ܳg<˗/gڴiL6.UBIIWp'lٲٳg|r٤w;v=pvbʔ)p p ;wt2}>qT*ﶶ6j|n緿mη~byd4]u 6mƲe0L8N{~UZ/&LUVaZűw^z=}­XxoBQQ=׻wu DnΆ@7 >> 0g̙jE w}+L(@6R"Nv$>½ s=za\vepwvC6P֭[>}:O?4VɄF;7l KJ=g0t PGeFlYF4j̚5K͋/8@Hd֯_OMM _= ***غu+6m;87~M7Ę1cȐwz_X&vɣ>ʞ={;w.F())_ |\wuL8dZ-'N]v+P'<555̞=$]_&VZŢE>}:[oaV\[nɓ'MBB:ޝFU LfK&$dOHBHYEPAqEU"Gi_+UqZVREq  .,(-@'dI230 $eW2ss9ܹ{ιl޼%KpnWZZʭ7̈#ڵw}MZZZشiǏgɞ[6sr5pjeҥ,\zJIKgn=X\bcc< /m8Y8 6_-ZW_}_NQQ sN[Fyv_r:3_R7oqqql߾ŋwٞGG+T& p뭷2sL fcǎ;^ |m)P?|`\n:ϟϘ1c(((l6fe˖QVVer^~e8 Ӊ[l2~ǠQ!BMrZZW_%##?|Nq!tRY`WR*/V˻KLLLyҗ7$55 6m3ɗ{I=ޓO>ɨQx饗xÝr?>B!/#I0~x222hhhy+`KLL2!feee0M4Xn]U$55ݮ&LjRNN'{/?! mj-ZDqq2^hZfϞF 8p 3g:i@A3gV\֭[7eff2|cpNr)g/'_Pzvr:ʽ?\B_2M>?cO<q8V|qΪছnFO?蘸 {aΜ9CZ>]׉K/DQQ$%%p8(..fժU'B.grBїGB!B!L-B!B!"$!B!B $ !B!BH I!B!BxEIB!B!+N')I\ȖFQr0 Xaa! ݻ7,iHOO'55Hꎘxuu5?cXlN;4bbbؽ{7R>6l ߿/B!B@F/fdggImm-Ŭ\իW;Brssq}QRR2YYY`immMY&))!CxI(EVƀB`ٰX,Q]]exf3DFFjioojR]]͡CvG:_/!B!:ׁhx >ONN&99 $BAek6[rBHOO}LFN'Nll6sav^^^QQQ]e20LuV,Ko$_B!] $T*~a Z])((SN w2`Uu kFuu5;wq݈z=v*֭[jcǢhz܎?Bq|999t:)..ӉV%77TRRRRY:iii FC||<DSXXq:>}p•/ԗpk!B!&Mikk:ØB!DwN'6?{g 2#99YiW Bq| 2sƮ]`0H駟:\_VհEьO0i4`Piv8eibC}j5FMAY#BfUToX8GVK#|\Q-9ɍ4naVUvY7IcҀ LQj؜NJ-cS}avv1&8ThjmCe\Nv6KJey8H XaF&\_VVUsQFfۺzWVS/O4 0^Okk+$h6\{3tߗɨ1& bccBMMMTWWSVVw3O)9餹zؓ#Gt:QT .߫T*HII`0FuuC F# "..JESSTTtmzMF2331z2wT7z˗`_k!B!/IFaÆb +냒`,%hw:hj22"5j8T8sW(8q$Q#Ѭcl|z"1?ĨV31LMq\FRiШɋ$/*!&^;Xm0)͠AT^可MKKF Tf`fp:I!+~dE]zu\Z&`tQ0\<(wʺŘ1c~Wg=Zȑ#1Ln7hZ{\_t:iooqf}jhhpYnnn5ц=&;;[nR&::n{@j%22˼>: ފFu\n=&HV)**R򮽽VKzz:hdԨQDDD`ەc!**7zS~)))+=GBB۷ojsk֗x[B!D $VimmeL2ӧfc|G|NuL>Dp%ki;zs2"6C!0. l?ž&ubLȄD3ξV:8?)|S7va&3}䛢6#/j#6;Zq1\˜X67.yRk -!:"?=vC^OnT+SShyz,sm6ؽf+Z-W0<& 񬨪޷j¦MhllD3x`IKKo8묳 YV8pǷbu7n۶m&3o `XhllLZZD*//FtGP:QQlohضmS;v0n84 he4"))[zݳ*] FCnn.]zVYVv8\Bu| 222'??_f9tvxsʶmzƨjmr{J^ϠAzMm۔9Gtt4f^Iޔ_^^*[۩@VSPP@ff/x/B!BC $k_?ZL&7pW\q]v6mbڵkn7*zZFMO3b8V z?ȍ$R |U5ˏ:K70hw:󤮛u$tkyOhgkCz7ӍG7tzo9ziO~nKDrSJND]vSSo`W__&nDLL FGMM ---8"##IMM%==@aa!7n]t8nIHH ""ֱ#N'{졥AQhZe9۱Znq4Qyy9]ډ Rgl6+&7dRZ* 0ʼ^.__07Z!B`藁$ DII t;l,::|2vO3tPL&ôINNűeeU[[˪Uf3ٌ;]vQ^l~KK29xMGOOCyKwڞD5e3Ԕ$hoHb؝NQrJ];08^kߟT_+\***z|źLZ<>P3sJN󺇕kp gPOݾ=x\eݾ)_roB!ޱF~Pzeffz\&99q A֣pP >aZ[۾8N"T* ?cCRiyYKQV1dԨ=sSǜ+R }Ӄ$OJd܇K||`mѽGC--JjjJRz4w@;w d-3 Çgzh4=P555./W .555vT*.y2P+?Ώz|[[[ϙ1L$&&?Ԡ }BPh$W:kjj xy[~EɛӹgU_|B!BC $[87o?&&otnɘ1c3f EEE}ΝMoJ뙖L7~mW)t䚐`fvv#ccD3P1'ջ;4HSө՜hd;Q$e#cc)&&':[V^dXL433z&Ei4eΠ=SMQj"χ'-34 fL`V\\cǎe)sPPPAEy`w6{ ==_cc8&33S)d42dFÁ7nyyy$$$`4tĐȑ#JKK:J")) ː!C`Z&''G(Aoavލ$11Cj$%%1bQ_|!> IDATB!NCSOqw2yd&OLkkЊwyk׆1N6qnb&&p:ѨTpFFwYO17\j~~d2_EjcKÁAFRBM ]+*l"/*f`ucw.K*Q;ӎF *皌TD3<&vN'NbKM yCV:1z%&7ɜAn>@݉h4p8rHo󗫷L{{;^SVVN#;;TRSS^JumP䧟~^ϠA4hy.VKFFΝ;p)))!..X xj2򤢢FnGV+JJJ^ЙWWWΝ;'11DNӭY}}z拿 SB!T $_b޽\uU >X9Ν;Dry!&'QCT:ojYoX5hhi=GWU/l*ϫikD3FZ-lo`Uu-ycw:yno $0&>NGVUJnqo̹ f Mk#ШTTQO6ׇo@ّu]-Fi4EE}?#G{nf3FVFncXɂ]CjkkI~jjjHOO'..NG{{;ֺ 577a222HHH 22ZM[[.f۶mNC*SZZqvlBVV))) ڨb߾}Z|wȑ#:tKP34446jZ $__0ꋿZ!B@RRRN" GN{K{ !B!"pv$:Iz :<B!B!ĉOIJů37E)o ;mk#!B!Bz$ʸqXh- wr̙3Xf wrq?B59Bӧc2XjK?pC% ǣ`fWOOO'111$x<>h"xgʼnt>HT*2tP BBB@;IPzvrr455q%`t^wUWa4b裏ORTTDQQ۰P!8I FƎ˙gI^^hZjjjؼy3o6%%%nL>n˶g{/k׮_z饘L&vƍ{\6223f0qD>^px\g„ \ve`4eͼ]5?ĉ1beee<TWWs=pꩧRQQSO=͛/33_W5DZ[[ٳg}_|N3hr=0eʔ.{3WMzg/~ dȑ#TUUw߱rJ3335k#F@ղw^{=>s\C6on#Fl2~ۛrkaʔ)$''5kXp!=Cg?d2}d}qz{=C?7x_|s=+N'eee||@hK8:楸+>|88NJJJXv->G鲎/R0?_=P8=Po<8fϞu]̙3oD '|QFK/n:f͚h4ٳwyիW{u[zO{G|Vt*A$_L0+W*A$M6q8s$$W$.fN'iiiqr 2VihhpSDDӧOz*ygphHIIaƌz 1^jĔ)S4i端-܂FAѐ<@MM 9998233Y`W^y%6MYoʔ)u]f'AcǎGǑrr߽=Poƍ,]+?̚5:5x`f̘GUH Px牌b:t(CW^gy /Xg'{ ׿`G|srrxW8x _}P#11Tlq-[Ão!kHcv?/~Aya66mc۶mD{WvAdyW_w&MĀwN:rfϞ͎;HLLdΜ9}\ve,^mn/^믿j%%%s2zh͛nj3L@gNf3 ff~_bYp! :Ty:rHez~Zz='No .? J=n;ӹkXp!@Mބ `'>ww`0puquq5װ~z ٽ{7yyy\p,^T*{졸Ǵ{S^{-vv?v:,{s y璟ϨQXf h42zhf"ԗpԩS1cѻ^B9iӦeKi?y{{|nߋ/ȑ#c֬Y5C'ˋ-b8N'k׮e…=> 7ѣy?>[ll2h} o`00k,}erSR}.o ]Go u;l6=L>]9oKvv6{q .,X@"dZw}J+!'o~]뻿ӓɮ]*~:X,ρ>X,ݻ4sL^^}QmYVe~38n;?s p]po{LgDZZZC|͗]KK 1?vܩqgQF)]cNFFC q[gdggc{Cʛr:t(8N,_^1gV_|w) |7nv^~n~:ƍSzZ 6.ٙ+Pq,W; W vr_޶g(J@ۣch߾}|W1By&O$F?`Jۧ&NȤIxgh4&M<;ޖCLLr,ihh8IԳ>JU@K |W*h`r=/ۼnx_`cɒ%t:~G-[6=uΟP$?.o:)wׁ= [l^ba޼yntMչwB 5q`o/ nyL:5oNJ+&~rlرٳgPK_~-_s90l0JRRww?|]ܽ߱aILL3d͚5=xozܶ۰M s@xß||C]'`{Om?= u;9t:p?O=B{—uwh{0@_:yso06ǕGkk ]q@R>|8f6,XI)55 &t:YdIu!h4DGG{|znxȆkxk\?B/p=Yo:V]]˖-SX-joog\{L25kps4/oO9ǃPճp/v)lΜ9^/hP_NNr N-[0rHϟٳ݆AxOtz@vWO%_ۗP׿`Cz ٠ccu}Zx|%ݑɶ&_PXXv\?C1B7PRR'<9sAAe\4W\oIHH ;;ۯm"_l՛I$]7n革T*os=p8tz\5Y tCiii?crTƏ&_U Ǵd"%%mŸ6T,\B/s>??f'j=oC+/B?Nt,[?8p\n.?=~j盛F;풯K(O__Cr=kJ#Fx\?t !D0H 8'%%)];˼z@bbbpx.b|>Omm2IԩS|o4ngddt,Tr,ʰaú߸q㺭;=̫T*en+Oo]O?\ްalݺ>z=k9X,T*]tQ?|6,\B/_5DDDp7vdRVyv_tZ-BNN;ٿB $[bوL+[s%x|,ӦMC׳}vngx뭷8q"3gT^ỹ>H||[zqF{1Ν?~<---v'D[lq[/پ}X|9SLaܹvmJ'|k*n۶3vX**֭p0a„.PT7Ny؈ZV^#lӟΕ+W2n8.\b`0(O /^c\jsh4p8/]rx9r$EEEX,l6|wt:e瓐PTTO?w1|9oC]U_ tG3KKX,h4%`_vɗ6m?;|u:gl6swꫯ*U7|38C2o<.Ng~OcŊL0_~łhDm۶u/烿oo |`\|c).H555<#,XѣGdTVVC-B*Hco&\y)))aŊ,]nm޽w\{<; ]_z'ظq#SN@uu5[l7x?0}tFErr2Sz-,Xq+V1cƐCbb"ZR6o̒%K&S~K{(O~B0G[n믿aÆa2`ݺua \!JIIWj5*>w ΗKȂ XzuRiZ}]bbbz̓o&u]lذ!hIX=CMY|IFK/믿qBIǓACCC[_3_bbb 1+++~oҤIu]gff&vM5 g/'oPzvr:x !dh@Vh"I?EE2{l4 19s&1MOsRz9srJnݪA.33<ތry&r|5g'O!D%Cۄӟ(((:}qM@O3iaW﬊ n>!k4O>`P^ϼg̙#?>EpCNrBїG}P6޽{y뭷XbES^fx, 7ogmmmKMRRbVZŻqQ!DB} !~&?!}Iz$ !B!BdB!B!+HB!B!^@B!B!B!B!W$$B!B!!PT ;< '9=V 'sN\?> >뷖qWOg̴v#<۹{I-̚ΖOVzB!8~H I!JEJ~y&e X^6bκ*Z\ЧB! $ !a5{C^ֿ߾ Y4R_vKmm"B~JIB!DڨسܻKO ~ھz-,g'Ý !BcHB!fna(s z)[[C_!Bq@BNS b=&y>MM}9 s?_6ǍeE' +alr5Z#;j$:"zm?m}٧_&1d 9Õ|+4qH˥/.ж]i^DְB8ڨXŮutjQ ;< DIłC?Ď_Q]rh;c QqqXؾz-v}ny3ٶ&".S>DGٻa_2ٷyM|S!?HB!DjRm@ epv)U{m Ll ϛ ϛ\|fmtDlrNg}lZJ&!3I̠ .-~w+/;`ܩsެDD(9!0ppV>b ƙѿvGjI&)7)/r N%1+vFC̀DNK &_y:;$ :1DtwvJ>1)Im`r7_B $ !DǑ7i7om2s 'JojK&svQC(,nwsv좵XFO 's8k8cccGfͷt8 .5ԂJS<{&} M Dt>7^)gI]ʾRu|R6{k[G>%;}4:Vs8RYŒySg&s<oAcF1G4ջ==錙62NƊ_d> nJɗ`vB!H!ǣ oKΐswRNY a|3iMuuԗ>ӿ<,/YطiDho`͢T B#g.Fv;ZM[hkn;Gi:gׯQUlX!k__mmW78mnJ<J >RHZ|~huSRg_ǾjXBlj2 O >L% 8۝8۝!jC}ux"BB KM-U;)'[K xw;&8IħtRֆ#X~d=Ydl E{{;}c]lrې0{[GHgy\/nI]Ygm83Pi䣋4t:پzmZ])P'N!86!ƒ }Ȇ> w2Nղщ ]x>Y 0рJr[Fw6h3oA8۹tnގZƔ`{f/)i}_i8\ `x4gUVK$ zK(i'B$$B>PYr 9hzNkj9xHF鲮.z; te,})M瑥/_Zy7 ep2 ?O^Á?zu̾몳Tln0uL5bmt ^ |B!D $ !6哧Q][; n-Z-[?^He2<υcz(M{d>ogǚuGCjA>yD'&y:yM6y?n_4̰/:._:vB!HIB!YEÈNL )7GnC$bql|ԳZ[, ^,&s|@37\GZA>g^=VVKSP*EƘnE !'#+Bx/_cۿW;)' SHjp^ Afվ>ӟiw8h$ffeTsQjL&Nxz}Q"BB(z=vG hkn :!AU޸ UKǸwY\[4=tV9yE[s3*S'sFWH9B!NFHB!7Fw zǻ;q"L}zSz#.ښAv'O;owc0? Xpf);|X%nJEsjzCa+C NJBV1xXθCB!7rB!<[Hr ^VOysI<Μ3g(bki xH#,y? Z,;k ȎT"*Bժ]cs:ujUcG;NV;tlKiq"bEŵ@QPEEd#&%0$!_ȽsrϽ''gBe5Zyq/1tOx_4A.Abe>ƥ+fx W`ʥff[YPU2he9JVLKjbg͉w#'Ǩ2W룕fvQ@Q2/ JwQ(wEeq sn(Y+lR %y90 ._EQ1t la&N-Ld=JگWnO'!7.^ISpem-JrG@Ome IЀqs@:;^eNűm?`yMo:@zhol'I$pssoV""""""""zp$"""""""" IDDDDDDDDH' $NH"""""""""0DDDDDDDDD:a t@鄁$"""""""" IDDDDDDDDH' $NH"""""""""0DDDDDDDDD:a t@鄁$"""""""" IDDDDDDDDH' $NH"""""""""0DDDDDDDDD:a t@鄁$"""""""" IDDDDDDDDH' $NH"""""""""0DDDDDDDDD:a t@鄁$"""""""" IDDDDDDDDH' $NH"""""""""0DDDDDDDDD:a t@鄁"bR5Fk{cSNEjj*-[Ey, GJJ RSS˗NzpppP ee˖!55SNm<)>#""z(0A1x Aliڪ*Tƍ{,sP(L]ϨX[#q(htxqqqAjj*]!2i$̘1P]]@YYnhhs{xx󶵎vrve#""ƴI 話ݺsgXw w_ǎSg^U 8=NՁ{USp F0a\]]Frd8_J.PUU9s3gbcc + t綣|ޟiJ""ǏV i) YCN܋GQUz"9\T0l>&%lRr{s HHHhb<lmmHIIiUN32gDDD@ug{MKz.!%a'՘DDD"Q޽{X""""""& BPSfVW8U'=p-DB^C UU>~ G&`ypᇴ٤.ns;!Gɵ<\8ߎkSB{P8{w ը].J(>Ϩu~{>ZO6cgXYil>~ Ik>y|!g s TT8cnjk\wAX=qP:N rL0{l}}刌w} 6g Bڵ {QfѧO$&&bڵz>@9!Cyf7X~cܸq󃍍 *++QRR3g`JghlKKKŋu*w})S ** (--ž}7@"0ydHKKC||^XS_]VvP$Bٍܫ8wmeV9 dB٫NͿFg>T]Nim-ls k>Aia`.#n{pr fB!윝?Xo7nW_թ*))ј\8 v***4}L:65 {ARRbccѧOX...$%%fx饗2 ?lmmzjttwwyJ$|L&P(LN:iD"VZ}acc_|=z􀠥WG2TSSB.]K.9r$-[C%\t `nnetEHRqM1bH=#&&χ~;XSSkkk#88ʕ+ e綵>nEWSN!!!&LヒӧA}>???L2 +W"gm_ gh}L}٬Y  ! e˖L&C׮]dL0A㺙=#"""%@RI466yt \* P ΄H,6j:^xvr)3wީH,o0D*z«!s/tn; ptk2!8:Ėye;c'n lq57g?ר1)cǠudnڱ sv[@=߾eZFeq -Z\8tFP1v;ZLСC_mWWWlܸՁ"-- ?#nܸKKKYYYΆ/F͛7kgAVVa/>=(]C QP d̘1(,,̙3q899aΜ9:N[ X|9~Ϙ1^^^nr}q#IKKT*Eqq1._ _Q]]Z9[n4=#""z=Ĺ} `䈐#1abFk( \YiGkwC7Snp\M>P2i2p$@$iS{Wjoo(jWQ^P:6=ݻHOOGzz:N:K0{aÆ Mk<!J///HR߿M0FӒs!//Oc[uu5~w@.]ۃ`kk B{j+99rܨkiBo@9Ɠdؾ}{Ǩztҥ͇51zv>3;Ƌ/z|"?IDAT~ e#g:r7-׹sg=#""z Jqh78c"5(]zCbc w_سcUnY9jc_W}Usq6J:w ϛlr9`耪Re7[Y9Cle_)?+1펞MU;9_\\5ٳ:UYY#G ** 111tz_LWܱcǴ!1K.666;w"##yƍMnW"xSO)/ *UUU(**Q#44 [[[5G* *˱bŊfS`ԚLQwcÎ;пDDD{R~gMeS/=Hב4}}=U77713""ǁV Iny9&lR s#+*݃{X{2UWY1B? P$G@χϼUϼK!-YR+PW}cTL$քM{̴:uH+5')) QQQ6l>HRB 6 Sii)֬Ys" @ẢOFRRRk._/vvv25¨PX(..Fnnי> (&oE cSi}tz7V=Z ۶mX,ƅ hro_:B{֑#i+Uճmg#gDDD>E+ ^_@.!phEWhi8\x}bۢͧmƕ#;w~pw_:9`lAƞ+0dUQjÜk{FDDjuYBhXBqJ3-;jmRNjiOETml:7aj**pn[ߘ-,FU|'Ab~C%*{!5[5IZir6b9dF\P޾HLLIJe0qDL6 +6̴JȖ^C駟d`<O0gg1uz7F=x{{c֬YP(ȀD"ŋՁ c3u(gG{{FDDj8]V^@ ]o'pqth2($2j[Y 3;ñ~}^ L96=̄B17uRpL1<%)) п#22WkSۤߘ@ h,,\2 b>>>F)>T:;;7LSMzM位 B-aVBrttW[KK[?ƪ. AD;˃f͚e651Ԟw=U{gDDDO*@ ݞj1A9jj+K]ziۧ^@WPwC<3+v]l{w/–>< sɤNQ Ւw*PrMLаh=sbXz5͛g?XNNNm͛7qyD"H$RGE{wZgDDD@=G{tTWWC ?|pn Zť_ǎHL1eܽ{BnriӦz63)!5Vu9 YfyyyQWW˗C*"66F+1ڗ\ώОw=U{gDDDO*@/;aѰwwb++b䜿W`h(?"e&IXC [@<3 Jc2gJ  DĤ M o:8wP o3`65tO< o@?ac\]ܛ PSQkM bZ(X7sVIq0?#F{V:)Ӥz*`M16U$įO;k,B  ,, sUЋ/+W"::Zc/^ @r ^{ 6,, ӦM ;<`mm~[}]$ Ə7x&?bPnݺu4h>_0l0]7z95V}ѷ""" L+V|W_,X`r}iоg?Sٞ=4~SMtxU8;jl+-e{po#!`&Sg ?L\w3'<z⹿5I`թ/\=$˼Ӧ'/|r FK޸tE#L U߅ b+K_4+*cʺ5,.Q <l96VKj7q*~=4,c:vj (gu͎;0rHt ۶mCaaz(˺upq{]bΜ9L&?lŋq 'Nĉ9r2 ChP]UU333 5/oй`]Vطz@Ϸ~cҥFCC:w3g@,#(^saƌxg1l0TVV"'N@aa!ƍg azErr2bbb0o<̞=[=T_Ǟ:u V¼yHB*Ξ=k skz7EO=888`M6lٲ @PP-Zm_k4F~`k+ٞ=4Iw`Ӝ [ @ME~C&Oӿ?EĤ  [TtޕsdT+V#th<Nh٤ݚHXeKtp90 ._EQ1t la&N-Ld=JگWnO'!7.^ISpŋ]z=?./SwsSSzTT+==5 fR?AF"wq޹W=TGoxOOOu/OFdd$N8 -]ӦMÐ!C`gg"Oغu+,Yd <<prr9n޼ l۶ WWW:uUfag 7o&O#FCBBfhrn}lٲ0a|}}!Hpu !!g6J>2V=Z zMڷo233PB$!??yyy8q~t2skz7UҚzXhqel޼Y|2 ?_",, &LPn}oXk13S_c~kM~~_گ=#""zR ܌vGsqƎ|sm9`gg%KСC]Ζ-[ɓ]""""""zfm]` T6OGԒaÆ8rH{ӵkWC*W!"""""GKDb1K}7ohZ?D=˅a֭\ F¨Q Jq-XXXuڹDDDDDDv-Bi}=r9Dbs8tP$Dٍ8~ްxWtD0qDxzzǏҥKl'B@}}=d2$ !p5裏PS^DDDDDDG~m""""""""z4IDDDDDDDD10DDDDDDDDD:a t@鄁$"""""""" IDDDDDDDDH' $NH"""""""""0DDDDDDDDD:a t@鄁$"""""""" IDDDDDDDDH'3&lIENDB`color-eyre-0.6.2/scripts/default.nix000064400000000000000000000004130072674642500155720ustar 00000000000000{ pkgs ? import { } }: let inherit (pkgs) stdenv lib python38; py = python38.withPackages (pypkgs: with pypkgs; [ beautifulsoup4 ]); in stdenv.mkDerivation { pname = "color-eyre-scripts"; version = "0.0.0"; src = ./.; buildInputs = [ py ]; } color-eyre-0.6.2/scripts/fix_html_examples.py000075500000000000000000000073230072674642500175220ustar 00000000000000#! /usr/bin/env python3.8 from __future__ import annotations import argparse from argparse import FileType, ArgumentParser import enum import sys from bs4 import BeautifulSoup, Tag class LineType(enum.Enum): OUTER_DOC = enum.auto() INNER_DOC = enum.auto() SOURCE = enum.auto() @classmethod def from_line(cls, line: str) -> (LineType, str): if line.startswith("//!"): return (cls.OUTER_DOC, line[len("//!") :]) elif line.startswith("///"): return (cls.INNER_DOC, line[len("///") :]) else: return (cls.SOURCE, line) def prefix(self) -> str: if self == LineType.OUTER_DOC: return "//!" elif self == LineType.INNER_DOC: return "///" else: return "" def fix_gnome_html(fh: file) -> str: """Tweaks for fixing "Copy as HTML" output from gnome-terminal Reads source from a Rust file. """ anything_changed = False line_type = LineType.SOURCE # Lines of current HTML

 chunk
    pre_chunk = []
    # Lines of processed file
    ret = []

    for (line_type, stripped_line), line in map(
        lambda line: (LineType.from_line(line), line), fh.readlines()
    ):
        if line_type == LineType.SOURCE:
            ret.append(line)
        elif stripped_line.lstrip().startswith(""):
            pre_chunk.append(stripped_line)
            if any(" str:
    """Fixes an individual 
 tag from Gnome.

    Optionally prepends a given prefix to each line in the returned output.
    """
    soup = BeautifulSoup(html, "html.parser")

    for pre in soup.find_all("pre"):
        for tag in pre.find_all("font"):
            #  -> 
            tag.name = "span"
            color = tag.attrs.pop("color")
            tag["style"] = f"color: {color}"

    return "".join(prefix + line for line in str(soup).splitlines(keepends=True))


def main():
    parser = ArgumentParser(
        description="""Convert HTML from Gnome terminal's 'Copy as HTML' feature
        to use modern  tags and inline CSS.

        This script is idempotent, i.e. multiple invocations will not change
        the output past the first invocation."""
    )
    parser.add_argument(
        "file",
        nargs="+",
        type=FileType("r+", encoding="utf-8"),
        help="""Rust file to update 
 blocks in.""",
    )
    args = parser.parse_args()
    for fh in args.file:
        if not fh.name.endswith(".rs"):
            print(
                "This script only fixes Rust source files; you probably didn't mean to include",
                fh.name,
                "so I'll skip processing it.",
            )
        new_content = fix_gnome_html(fh)
        if new_content is not None:
            print("Updated example colored output in", fh.name)
            fh.seek(0)
            fh.write(new_content)
        else:
            print("Nothing to fix in", fh.name)
        fh.close()


if __name__ == "__main__":
    main()
color-eyre-0.6.2/src/config.rs000064400000000000000000001155720072674642500143560ustar  00000000000000//! Configuration options for customizing the behavior of the provided panic
//! and error reporting hooks
use crate::{
    section::PanicMessage,
    writers::{EnvSection, WriterExt},
};
use fmt::Display;
use indenter::{indented, Format};
use owo_colors::{style, OwoColorize, Style};
use std::env;
use std::fmt::Write as _;
use std::{fmt, path::PathBuf, sync::Arc};

#[derive(Debug)]
struct InstallError;

impl fmt::Display for InstallError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str("could not install the BacktracePrinter as another was already installed")
    }
}

impl std::error::Error for InstallError {}

#[derive(Debug)]
struct InstallThemeError;

impl fmt::Display for InstallThemeError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str("could not set the provided `Theme` globally as another was already set")
    }
}

impl std::error::Error for InstallThemeError {}

#[derive(Debug)]
struct InstallColorSpantraceThemeError;

impl fmt::Display for InstallColorSpantraceThemeError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str("could not set the provided `Theme` via `color_spantrace::set_theme` globally as another was already set")
    }
}

impl std::error::Error for InstallColorSpantraceThemeError {}

/// A struct that represents a theme that is used by `color_eyre`
#[derive(Debug, Copy, Clone, Default)]
pub struct Theme {
    pub(crate) file: Style,
    pub(crate) line_number: Style,
    pub(crate) spantrace_target: Style,
    pub(crate) spantrace_fields: Style,
    pub(crate) active_line: Style,
    pub(crate) error: Style,
    pub(crate) help_info_note: Style,
    pub(crate) help_info_warning: Style,
    pub(crate) help_info_suggestion: Style,
    pub(crate) help_info_error: Style,
    pub(crate) dependency_code: Style,
    pub(crate) crate_code: Style,
    pub(crate) code_hash: Style,
    pub(crate) panic_header: Style,
    pub(crate) panic_message: Style,
    pub(crate) panic_file: Style,
    pub(crate) panic_line_number: Style,
    pub(crate) hidden_frames: Style,
}

macro_rules! theme_setters {
    ($(#[$meta:meta] $name:ident),* $(,)?) => {
        $(
            #[$meta]
            pub fn $name(mut self, style: Style) -> Self {
                self.$name = style;
                self
            }
        )*
    };
}

impl Theme {
    /// Creates a blank theme
    pub fn new() -> Self {
        Self::default()
    }

    /// Returns a theme for dark backgrounds. This is the default
    pub fn dark() -> Self {
        Self {
            file: style().purple(),
            line_number: style().purple(),
            active_line: style().white().bold(),
            error: style().bright_red(),
            help_info_note: style().bright_cyan(),
            help_info_warning: style().bright_yellow(),
            help_info_suggestion: style().bright_cyan(),
            help_info_error: style().bright_red(),
            dependency_code: style().green(),
            crate_code: style().bright_red(),
            code_hash: style().bright_black(),
            panic_header: style().red(),
            panic_message: style().cyan(),
            panic_file: style().purple(),
            panic_line_number: style().purple(),
            hidden_frames: style().bright_cyan(),
            spantrace_target: style().bright_red(),
            spantrace_fields: style().bright_cyan(),
        }
    }

    // XXX it would be great, if someone with more style optimizes the light theme below. I just fixed the biggest problems, but ideally there would be darker colors (however, the standard ANSI colors don't seem to have many dark enough colors. Maybe xterm colors or RGB colors would be better (however, again, see my comment regarding xterm colors in `color_spantrace`))

    /// Returns a theme for light backgrounds
    pub fn light() -> Self {
        Self {
            file: style().purple(),
            line_number: style().purple(),
            spantrace_target: style().red(),
            spantrace_fields: style().blue(),
            active_line: style().bold(),
            error: style().red(),
            help_info_note: style().blue(),
            help_info_warning: style().bright_red(),
            help_info_suggestion: style().blue(),
            help_info_error: style().red(),
            dependency_code: style().green(),
            crate_code: style().red(),
            code_hash: style().bright_black(),
            panic_header: style().red(),
            panic_message: style().blue(),
            panic_file: style().purple(),
            panic_line_number: style().purple(),
            hidden_frames: style().blue(),
        }
    }

    theme_setters! {
        /// Styles printed paths
        file,
        /// Styles the line number of a file
        line_number,
        /// Styles the `color_spantrace` target (i.e. the module and function name, and so on)
        spantrace_target,
        /// Styles fields associated with a the `tracing::Span`.
        spantrace_fields,
        /// Styles the selected line of displayed code
        active_line,
        // XXX not sure how to describe this better (or if this is even completely correct)
        /// Styles errors printed by `EyreHandler`
        error,
        /// Styles the "note" section header
        help_info_note,
        /// Styles the "warning" section header
        help_info_warning,
        /// Styles the "suggestion" section header
        help_info_suggestion,
        /// Styles the "error" section header
        help_info_error,
        /// Styles code that is not part of your crate
        dependency_code,
        /// Styles code that's in your crate
        crate_code,
        /// Styles the hash after `dependency_code` and `crate_code`
        code_hash,
        /// Styles the header of a panic
        panic_header,
        /// Styles the message of a panic
        panic_message,
        /// Styles paths of a panic
        panic_file,
        /// Styles the line numbers of a panic
        panic_line_number,
        /// Styles the "N frames hidden" message
        hidden_frames,
    }
}

/// A representation of a Frame from a Backtrace or a SpanTrace
#[derive(Debug)]
#[non_exhaustive]
pub struct Frame {
    /// Frame index
    pub n: usize,
    /// frame symbol name
    pub name: Option,
    /// source line number
    pub lineno: Option,
    /// source file path
    pub filename: Option,
}

#[derive(Debug)]
struct StyledFrame<'a>(&'a Frame, Theme);

impl<'a> fmt::Display for StyledFrame<'a> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let Self(frame, theme) = self;

        let is_dependency_code = frame.is_dependency_code();

        // Print frame index.
        write!(f, "{:>2}: ", frame.n)?;

        // Does the function have a hash suffix?
        // (dodging a dep on the regex crate here)
        let name = frame.name.as_deref().unwrap_or("");
        let has_hash_suffix = name.len() > 19
            && &name[name.len() - 19..name.len() - 16] == "::h"
            && name[name.len() - 16..]
                .chars()
                .all(|x| x.is_ascii_hexdigit());

        let hash_suffix = if has_hash_suffix {
            &name[name.len() - 19..]
        } else {
            ""
        };

        // Print function name.
        let name = if has_hash_suffix {
            &name[..name.len() - 19]
        } else {
            name
        };

        if is_dependency_code {
            write!(f, "{}", (name).style(theme.dependency_code))?;
        } else {
            write!(f, "{}", (name).style(theme.crate_code))?;
        }

        write!(f, "{}", (hash_suffix).style(theme.code_hash))?;

        let mut separated = f.header("\n");

        // Print source location, if known.
        let file = frame.filename.as_ref().map(|path| path.display());
        let file: &dyn fmt::Display = if let Some(ref filename) = file {
            filename
        } else {
            &""
        };
        let lineno = frame
            .lineno
            .map_or("".to_owned(), |x| x.to_string());
        write!(
            &mut separated.ready(),
            "    at {}:{}",
            file.style(theme.file),
            lineno.style(theme.line_number),
        )?;

        let v = if std::thread::panicking() {
            panic_verbosity()
        } else {
            lib_verbosity()
        };

        // Maybe print source.
        if v >= Verbosity::Full {
            write!(&mut separated.ready(), "{}", SourceSection(frame, *theme))?;
        }

        Ok(())
    }
}

struct SourceSection<'a>(&'a Frame, Theme);

impl fmt::Display for SourceSection<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let Self(frame, theme) = self;

        let (lineno, filename) = match (frame.lineno, frame.filename.as_ref()) {
            (Some(a), Some(b)) => (a, b),
            // Without a line number and file name, we can't sensibly proceed.
            _ => return Ok(()),
        };

        let file = match std::fs::File::open(filename) {
            Ok(file) => file,
            Err(ref e) if e.kind() == std::io::ErrorKind::NotFound => return Ok(()),
            e @ Err(_) => e.unwrap(),
        };

        use std::fmt::Write;
        use std::io::BufRead;

        // Extract relevant lines.
        let reader = std::io::BufReader::new(file);
        let start_line = lineno - 2.min(lineno - 1);
        let surrounding_src = reader.lines().skip(start_line as usize - 1).take(5);
        let mut separated = f.header("\n");
        let mut f = separated.in_progress();
        for (line, cur_line_no) in surrounding_src.zip(start_line..) {
            let line = line.unwrap();
            if cur_line_no == lineno {
                write!(
                    &mut f,
                    "{:>8} {} {}",
                    cur_line_no.style(theme.active_line),
                    ">".style(theme.active_line),
                    line.style(theme.active_line),
                )?;
            } else {
                write!(&mut f, "{:>8} │ {}", cur_line_no, line)?;
            }
            f = separated.ready();
        }

        Ok(())
    }
}

impl Frame {
    fn is_dependency_code(&self) -> bool {
        const SYM_PREFIXES: &[&str] = &[
            "std::",
            "core::",
            "backtrace::backtrace::",
            "_rust_begin_unwind",
            "color_traceback::",
            "__rust_",
            "___rust_",
            "__pthread",
            "_main",
            "main",
            "__scrt_common_main_seh",
            "BaseThreadInitThunk",
            "_start",
            "__libc_start_main",
            "start_thread",
        ];

        // Inspect name.
        if let Some(ref name) = self.name {
            if SYM_PREFIXES.iter().any(|x| name.starts_with(x)) {
                return true;
            }
        }

        const FILE_PREFIXES: &[&str] = &[
            "/rustc/",
            "src/libstd/",
            "src/libpanic_unwind/",
            "src/libtest/",
        ];

        // Inspect filename.
        if let Some(ref filename) = self.filename {
            let filename = filename.to_string_lossy();
            if FILE_PREFIXES.iter().any(|x| filename.starts_with(x))
                || filename.contains("/.cargo/registry/src/")
            {
                return true;
            }
        }

        false
    }

    /// Heuristically determine whether a frame is likely to be a post panic
    /// frame.
    ///
    /// Post panic frames are frames of a functions called after the actual panic
    /// is already in progress and don't contain any useful information for a
    /// reader of the backtrace.
    fn is_post_panic_code(&self) -> bool {
        const SYM_PREFIXES: &[&str] = &[
            "_rust_begin_unwind",
            "rust_begin_unwind",
            "core::result::unwrap_failed",
            "core::option::expect_none_failed",
            "core::panicking::panic_fmt",
            "color_backtrace::create_panic_handler",
            "std::panicking::begin_panic",
            "begin_panic_fmt",
            "failure::backtrace::Backtrace::new",
            "backtrace::capture",
            "failure::error_message::err_msg",
            ">::from",
        ];

        match self.name.as_ref() {
            Some(name) => SYM_PREFIXES.iter().any(|x| name.starts_with(x)),
            None => false,
        }
    }

    /// Heuristically determine whether a frame is likely to be part of language
    /// runtime.
    fn is_runtime_init_code(&self) -> bool {
        const SYM_PREFIXES: &[&str] = &[
            "std::rt::lang_start::",
            "test::run_test::run_test_inner::",
            "std::sys_common::backtrace::__rust_begin_short_backtrace",
        ];

        let (name, file) = match (self.name.as_ref(), self.filename.as_ref()) {
            (Some(name), Some(filename)) => (name, filename.to_string_lossy()),
            _ => return false,
        };

        if SYM_PREFIXES.iter().any(|x| name.starts_with(x)) {
            return true;
        }

        // For Linux, this is the best rule for skipping test init I found.
        if name == "{{closure}}" && file == "src/libtest/lib.rs" {
            return true;
        }

        false
    }
}

/// Builder for customizing the behavior of the global panic and error report hooks
pub struct HookBuilder {
    filters: Vec>,
    capture_span_trace_by_default: bool,
    display_env_section: bool,
    #[cfg(feature = "track-caller")]
    display_location_section: bool,
    panic_section: Option>,
    panic_message: Option>,
    theme: Theme,
    #[cfg(feature = "issue-url")]
    issue_url: Option,
    #[cfg(feature = "issue-url")]
    issue_metadata: Vec<(String, Box)>,
    #[cfg(feature = "issue-url")]
    issue_filter: Arc,
}

impl HookBuilder {
    /// Construct a HookBuilder
    ///
    /// # Details
    ///
    /// By default this function calls `add_default_filters()` and
    /// `capture_span_trace_by_default(true)`. To get a `HookBuilder` with all
    /// features disabled by default call `HookBuilder::blank()`.
    ///
    /// # Example
    ///
    /// ```rust
    /// use color_eyre::config::HookBuilder;
    ///
    /// HookBuilder::new()
    ///     .install()
    ///     .unwrap();
    /// ```
    pub fn new() -> Self {
        Self::blank()
            .add_default_filters()
            .capture_span_trace_by_default(true)
    }

    /// Construct a HookBuilder with minimal features enabled
    pub fn blank() -> Self {
        HookBuilder {
            filters: vec![],
            capture_span_trace_by_default: false,
            display_env_section: true,
            #[cfg(feature = "track-caller")]
            display_location_section: true,
            panic_section: None,
            panic_message: None,
            theme: Theme::dark(),
            #[cfg(feature = "issue-url")]
            issue_url: None,
            #[cfg(feature = "issue-url")]
            issue_metadata: vec![],
            #[cfg(feature = "issue-url")]
            issue_filter: Arc::new(|_| true),
        }
    }

    /// Set the global styles that `color_eyre` should use.
    ///
    /// **Tip:** You can test new styles by editing `examples/theme.rs` in the `color-eyre` repository.
    pub fn theme(mut self, theme: Theme) -> Self {
        self.theme = theme;
        self
    }

    /// Add a custom section to the panic hook that will be printed
    /// in the panic message.
    ///
    /// # Examples
    ///
    /// ```rust
    /// color_eyre::config::HookBuilder::default()
    ///     .panic_section("consider reporting the bug at https://github.com/yaahc/color-eyre")
    ///     .install()
    ///     .unwrap()
    /// ```
    pub fn panic_section(mut self, section: S) -> Self {
        self.panic_section = Some(Box::new(section));
        self
    }

    /// Overrides the main error message printing section at the start of panic
    /// reports
    ///
    /// # Examples
    ///
    /// ```rust
    /// use std::{panic::Location, fmt};
    /// use color_eyre::section::PanicMessage;
    /// use owo_colors::OwoColorize;
    ///
    /// struct MyPanicMessage;
    ///
    /// color_eyre::config::HookBuilder::default()
    ///     .panic_message(MyPanicMessage)
    ///     .install()
    ///     .unwrap();
    ///
    /// impl PanicMessage for MyPanicMessage {
    ///     fn display(&self, pi: &std::panic::PanicInfo<'_>, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    ///         writeln!(f, "{}", "The application panicked (crashed).".red())?;
    ///
    ///         // Print panic message.
    ///         let payload = pi
    ///             .payload()
    ///             .downcast_ref::()
    ///             .map(String::as_str)
    ///             .or_else(|| pi.payload().downcast_ref::<&str>().cloned())
    ///             .unwrap_or("");
    ///
    ///         write!(f, "Message:  ")?;
    ///         writeln!(f, "{}", payload.cyan())?;
    ///
    ///         // If known, print panic location.
    ///         write!(f, "Location: ")?;
    ///         if let Some(loc) = pi.location() {
    ///             write!(f, "{}", loc.file().purple())?;
    ///             write!(f, ":")?;
    ///             write!(f, "{}", loc.line().purple())?;
    ///
    ///             write!(f, "\n\nConsider reporting the bug at {}", custom_url(loc, payload))?;
    ///         } else {
    ///             write!(f, "")?;
    ///         }
    ///
    ///         Ok(())
    ///     }
    /// }
    ///
    /// fn custom_url(location: &Location<'_>, message: &str) -> impl fmt::Display {
    ///     "todo"
    /// }
    /// ```
    pub fn panic_message(mut self, section: S) -> Self {
        self.panic_message = Some(Box::new(section));
        self
    }

    /// Set an upstream github repo and enable issue reporting url generation
    ///
    /// # Details
    ///
    /// Once enabled, color-eyre will generate urls that will create customized
    /// issues pre-populated with information about the associated error report.
    ///
    /// Additional information can be added to the metadata table in the
    /// generated urls by calling `add_issue_metadata` when configuring the
    /// HookBuilder.
    ///
    /// # Examples
    ///
    /// ```rust
    /// color_eyre::config::HookBuilder::default()
    ///     .issue_url(concat!(env!("CARGO_PKG_REPOSITORY"), "/issues/new"))
    ///     .install()
    ///     .unwrap();
    /// ```
    #[cfg(feature = "issue-url")]
    #[cfg_attr(docsrs, doc(cfg(feature = "issue-url")))]
    pub fn issue_url(mut self, url: S) -> Self {
        self.issue_url = Some(url.to_string());
        self
    }

    /// Add a new entry to the metadata table in generated github issue urls
    ///
    /// **Note**: this metadata will be ignored if no `issue_url` is set.
    ///
    /// # Examples
    ///
    /// ```rust
    /// color_eyre::config::HookBuilder::default()
    ///     .issue_url(concat!(env!("CARGO_PKG_REPOSITORY"), "/issues/new"))
    ///     .add_issue_metadata("version", env!("CARGO_PKG_VERSION"))
    ///     .install()
    ///     .unwrap();
    /// ```
    #[cfg(feature = "issue-url")]
    #[cfg_attr(docsrs, doc(cfg(feature = "issue-url")))]
    pub fn add_issue_metadata(mut self, key: K, value: V) -> Self
    where
        K: Display,
        V: Display + Send + Sync + 'static,
    {
        let pair = (key.to_string(), Box::new(value) as _);
        self.issue_metadata.push(pair);
        self
    }

    /// Configures a filter for disabling issue url generation for certain kinds of errors
    ///
    /// If the closure returns `true`, then the issue url will be generated.
    ///
    /// # Examples
    ///
    /// ```rust
    /// color_eyre::config::HookBuilder::default()
    ///     .issue_url(concat!(env!("CARGO_PKG_REPOSITORY"), "/issues/new"))
    ///     .issue_filter(|kind| match kind {
    ///         color_eyre::ErrorKind::NonRecoverable(payload) => {
    ///             let payload = payload
    ///                 .downcast_ref::()
    ///                 .map(String::as_str)
    ///                 .or_else(|| payload.downcast_ref::<&str>().cloned())
    ///                 .unwrap_or("");
    ///
    ///             !payload.contains("my irrelevant error message")
    ///         },
    ///         color_eyre::ErrorKind::Recoverable(error) => !error.is::(),
    ///     })
    ///     .install()
    ///     .unwrap();
    ///
    #[cfg(feature = "issue-url")]
    #[cfg_attr(docsrs, doc(cfg(feature = "issue-url")))]
    pub fn issue_filter(mut self, predicate: F) -> Self
    where
        F: Fn(crate::ErrorKind<'_>) -> bool + Send + Sync + 'static,
    {
        self.issue_filter = Arc::new(predicate);
        self
    }

    /// Configures the default capture mode for `SpanTraces` in error reports and panics
    pub fn capture_span_trace_by_default(mut self, cond: bool) -> Self {
        self.capture_span_trace_by_default = cond;
        self
    }

    /// Configures the enviroment varible info section and whether or not it is displayed
    pub fn display_env_section(mut self, cond: bool) -> Self {
        self.display_env_section = cond;
        self
    }

    /// Configures the location info section and whether or not it is displayed.
    ///
    /// # Notes
    ///
    /// This will not disable the location section in a panic message.
    #[cfg(feature = "track-caller")]
    #[cfg_attr(docsrs, doc(cfg(feature = "track-caller")))]
    pub fn display_location_section(mut self, cond: bool) -> Self {
        self.display_location_section = cond;
        self
    }

    /// Add a custom filter to the set of frame filters
    ///
    /// # Examples
    ///
    /// ```rust
    /// color_eyre::config::HookBuilder::default()
    ///     .add_frame_filter(Box::new(|frames| {
    ///         let filters = &[
    ///             "uninteresting_function",
    ///         ];
    ///
    ///         frames.retain(|frame| {
    ///             !filters.iter().any(|f| {
    ///                 let name = if let Some(name) = frame.name.as_ref() {
    ///                     name.as_str()
    ///                 } else {
    ///                     return true;
    ///                 };
    ///
    ///                 name.starts_with(f)
    ///             })
    ///         });
    ///     }))
    ///     .install()
    ///     .unwrap();
    /// ```
    pub fn add_frame_filter(mut self, filter: Box) -> Self {
        self.filters.push(filter);
        self
    }

    /// Install the given Hook as the global error report hook
    pub fn install(self) -> Result<(), crate::eyre::Report> {
        let (panic_hook, eyre_hook) = self.into_hooks();
        eyre_hook.install()?;
        panic_hook.install();
        Ok(())
    }

    /// Add the default set of filters to this `HookBuilder`'s configuration
    pub fn add_default_filters(self) -> Self {
        self.add_frame_filter(Box::new(default_frame_filter))
            .add_frame_filter(Box::new(eyre_frame_filters))
    }

    /// Create a `PanicHook` and `EyreHook` from this `HookBuilder`.
    /// This can be used if you want to combine these handlers with other handlers.
    pub fn into_hooks(self) -> (PanicHook, EyreHook) {
        let theme = self.theme;
        #[cfg(feature = "issue-url")]
        let metadata = Arc::new(self.issue_metadata);
        let panic_hook = PanicHook {
            filters: self.filters.into(),
            section: self.panic_section,
            #[cfg(feature = "capture-spantrace")]
            capture_span_trace_by_default: self.capture_span_trace_by_default,
            display_env_section: self.display_env_section,
            panic_message: self
                .panic_message
                .unwrap_or_else(|| Box::new(DefaultPanicMessage(theme))),
            theme,
            #[cfg(feature = "issue-url")]
            issue_url: self.issue_url.clone(),
            #[cfg(feature = "issue-url")]
            issue_metadata: metadata.clone(),
            #[cfg(feature = "issue-url")]
            issue_filter: self.issue_filter.clone(),
        };

        let eyre_hook = EyreHook {
            filters: panic_hook.filters.clone(),
            #[cfg(feature = "capture-spantrace")]
            capture_span_trace_by_default: self.capture_span_trace_by_default,
            display_env_section: self.display_env_section,
            #[cfg(feature = "track-caller")]
            display_location_section: self.display_location_section,
            theme,
            #[cfg(feature = "issue-url")]
            issue_url: self.issue_url,
            #[cfg(feature = "issue-url")]
            issue_metadata: metadata,
            #[cfg(feature = "issue-url")]
            issue_filter: self.issue_filter,
        };

        #[cfg(feature = "capture-spantrace")]
        color_spantrace::set_theme(self.theme.into()).expect("could not set the provided `Theme` via `color_spantrace::set_theme` globally as another was already set");

        (panic_hook, eyre_hook)
    }
}

#[cfg(feature = "capture-spantrace")]
impl From for color_spantrace::Theme {
    fn from(src: Theme) -> color_spantrace::Theme {
        color_spantrace::Theme::new()
            .file(src.file)
            .line_number(src.line_number)
            .target(src.spantrace_target)
            .fields(src.spantrace_fields)
            .active_line(src.active_line)
    }
}

#[allow(missing_docs)]
impl Default for HookBuilder {
    fn default() -> Self {
        Self::new()
    }
}

fn default_frame_filter(frames: &mut Vec<&Frame>) {
    let top_cutoff = frames
        .iter()
        .rposition(|x| x.is_post_panic_code())
        .map(|x| x + 2) // indices are 1 based
        .unwrap_or(0);

    let bottom_cutoff = frames
        .iter()
        .position(|x| x.is_runtime_init_code())
        .unwrap_or(frames.len());

    let rng = top_cutoff..=bottom_cutoff;
    frames.retain(|x| rng.contains(&x.n))
}

fn eyre_frame_filters(frames: &mut Vec<&Frame>) {
    let filters = &[
        "::default",
        "eyre::",
        "color_eyre::",
    ];

    frames.retain(|frame| {
        !filters.iter().any(|f| {
            let name = if let Some(name) = frame.name.as_ref() {
                name.as_str()
            } else {
                return true;
            };

            name.starts_with(f)
        })
    });
}

struct DefaultPanicMessage(Theme);

impl PanicMessage for DefaultPanicMessage {
    fn display(&self, pi: &std::panic::PanicInfo<'_>, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        // XXX is my assumption correct that this function is guaranteed to only run after `color_eyre` was setup successfully (including setting `THEME`), and that therefore the following line will never panic? Otherwise, we could return `fmt::Error`, but if the above is true, I like `unwrap` + a comment why this never fails better
        let theme = &self.0;

        writeln!(
            f,
            "{}",
            "The application panicked (crashed).".style(theme.panic_header)
        )?;

        // Print panic message.
        let payload = pi
            .payload()
            .downcast_ref::()
            .map(String::as_str)
            .or_else(|| pi.payload().downcast_ref::<&str>().cloned())
            .unwrap_or("");

        write!(f, "Message:  ")?;
        writeln!(f, "{}", payload.style(theme.panic_message))?;

        // If known, print panic location.
        write!(f, "Location: ")?;
        write!(f, "{}", crate::fmt::LocationSection(pi.location(), *theme))?;

        Ok(())
    }
}

/// A type representing an error report for a panic.
pub struct PanicReport<'a> {
    hook: &'a PanicHook,
    panic_info: &'a std::panic::PanicInfo<'a>,
    backtrace: Option,
    #[cfg(feature = "capture-spantrace")]
    span_trace: Option,
}

fn print_panic_info(report: &PanicReport<'_>, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    report.hook.panic_message.display(report.panic_info, f)?;

    let v = panic_verbosity();
    let capture_bt = v != Verbosity::Minimal;

    let mut separated = f.header("\n\n");

    if let Some(ref section) = report.hook.section {
        write!(&mut separated.ready(), "{}", section)?;
    }

    #[cfg(feature = "capture-spantrace")]
    {
        if let Some(span_trace) = report.span_trace.as_ref() {
            write!(
                &mut separated.ready(),
                "{}",
                crate::writers::FormattedSpanTrace(span_trace)
            )?;
        }
    }

    if let Some(bt) = report.backtrace.as_ref() {
        let fmted_bt = report.hook.format_backtrace(bt);
        write!(
            indented(&mut separated.ready()).with_format(Format::Uniform { indentation: "  " }),
            "{}",
            fmted_bt
        )?;
    }

    if report.hook.display_env_section {
        let env_section = EnvSection {
            bt_captured: &capture_bt,
            #[cfg(feature = "capture-spantrace")]
            span_trace: report.span_trace.as_ref(),
        };

        write!(&mut separated.ready(), "{}", env_section)?;
    }

    #[cfg(feature = "issue-url")]
    {
        let payload = report.panic_info.payload();

        if report.hook.issue_url.is_some()
            && (*report.hook.issue_filter)(crate::ErrorKind::NonRecoverable(payload))
        {
            let url = report.hook.issue_url.as_ref().unwrap();
            let payload = payload
                .downcast_ref::()
                .map(String::as_str)
                .or_else(|| payload.downcast_ref::<&str>().cloned())
                .unwrap_or("");

            let issue_section = crate::section::github::IssueSection::new(url, payload)
                .with_backtrace(report.backtrace.as_ref())
                .with_location(report.panic_info.location())
                .with_metadata(&**report.hook.issue_metadata);

            #[cfg(feature = "capture-spantrace")]
            let issue_section = issue_section.with_span_trace(report.span_trace.as_ref());

            write!(&mut separated.ready(), "{}", issue_section)?;
        }
    }

    Ok(())
}

impl fmt::Display for PanicReport<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        print_panic_info(self, f)
    }
}

/// A panic reporting hook
pub struct PanicHook {
    filters: Arc<[Box]>,
    section: Option>,
    panic_message: Box,
    theme: Theme,
    #[cfg(feature = "capture-spantrace")]
    capture_span_trace_by_default: bool,
    display_env_section: bool,
    #[cfg(feature = "issue-url")]
    issue_url: Option,
    #[cfg(feature = "issue-url")]
    issue_metadata: Arc)>>,
    #[cfg(feature = "issue-url")]
    issue_filter: Arc,
}

impl PanicHook {
    pub(crate) fn format_backtrace<'a>(
        &'a self,
        trace: &'a backtrace::Backtrace,
    ) -> BacktraceFormatter<'a> {
        BacktraceFormatter {
            filters: &self.filters,
            inner: trace,
            theme: self.theme,
        }
    }

    #[cfg(feature = "capture-spantrace")]
    fn spantrace_capture_enabled(&self) -> bool {
        std::env::var("RUST_SPANTRACE")
            .map(|val| val != "0")
            .unwrap_or(self.capture_span_trace_by_default)
    }

    /// Install self as a global panic hook via `std::panic::set_hook`.
    pub fn install(self) {
        std::panic::set_hook(self.into_panic_hook());
    }

    /// Convert self into the type expected by `std::panic::set_hook`.
    pub fn into_panic_hook(
        self,
    ) -> Box) + Send + Sync + 'static> {
        Box::new(move |panic_info| {
            eprintln!("{}", self.panic_report(panic_info));
        })
    }

    /// Construct a panic reporter which prints it's panic report via the
    /// `Display` trait.
    pub fn panic_report<'a>(
        &'a self,
        panic_info: &'a std::panic::PanicInfo<'_>,
    ) -> PanicReport<'a> {
        let v = panic_verbosity();
        let capture_bt = v != Verbosity::Minimal;

        #[cfg(feature = "capture-spantrace")]
        let span_trace = if self.spantrace_capture_enabled() {
            Some(tracing_error::SpanTrace::capture())
        } else {
            None
        };

        let backtrace = if capture_bt {
            Some(backtrace::Backtrace::new())
        } else {
            None
        };

        PanicReport {
            panic_info,
            #[cfg(feature = "capture-spantrace")]
            span_trace,
            backtrace,
            hook: self,
        }
    }
}

/// An eyre reporting hook used to construct `EyreHandler`s
pub struct EyreHook {
    filters: Arc<[Box]>,
    #[cfg(feature = "capture-spantrace")]
    capture_span_trace_by_default: bool,
    display_env_section: bool,
    #[cfg(feature = "track-caller")]
    display_location_section: bool,
    theme: Theme,
    #[cfg(feature = "issue-url")]
    issue_url: Option,
    #[cfg(feature = "issue-url")]
    issue_metadata: Arc)>>,
    #[cfg(feature = "issue-url")]
    issue_filter: Arc,
}

impl EyreHook {
    #[allow(unused_variables)]
    pub(crate) fn default(&self, error: &(dyn std::error::Error + 'static)) -> crate::Handler {
        let backtrace = if lib_verbosity() != Verbosity::Minimal {
            Some(backtrace::Backtrace::new())
        } else {
            None
        };

        #[cfg(feature = "capture-spantrace")]
        let span_trace = if self.spantrace_capture_enabled()
            && crate::handler::get_deepest_spantrace(error).is_none()
        {
            Some(tracing_error::SpanTrace::capture())
        } else {
            None
        };

        crate::Handler {
            filters: self.filters.clone(),
            backtrace,
            #[cfg(feature = "capture-spantrace")]
            span_trace,
            sections: Vec::new(),
            display_env_section: self.display_env_section,
            #[cfg(feature = "track-caller")]
            display_location_section: self.display_location_section,
            #[cfg(feature = "issue-url")]
            issue_url: self.issue_url.clone(),
            #[cfg(feature = "issue-url")]
            issue_metadata: self.issue_metadata.clone(),
            #[cfg(feature = "issue-url")]
            issue_filter: self.issue_filter.clone(),
            theme: self.theme,
            #[cfg(feature = "track-caller")]
            location: None,
        }
    }

    #[cfg(feature = "capture-spantrace")]
    fn spantrace_capture_enabled(&self) -> bool {
        std::env::var("RUST_SPANTRACE")
            .map(|val| val != "0")
            .unwrap_or(self.capture_span_trace_by_default)
    }

    /// Installs self as the global eyre handling hook via `eyre::set_hook`
    pub fn install(self) -> Result<(), crate::eyre::InstallError> {
        crate::eyre::set_hook(self.into_eyre_hook())
    }

    /// Convert the self into the boxed type expected by `eyre::set_hook`.
    pub fn into_eyre_hook(
        self,
    ) -> Box<
        dyn Fn(&(dyn std::error::Error + 'static)) -> Box
            + Send
            + Sync
            + 'static,
    > {
        Box::new(move |e| Box::new(self.default(e)))
    }
}

pub(crate) struct BacktraceFormatter<'a> {
    pub(crate) filters: &'a [Box],
    pub(crate) inner: &'a backtrace::Backtrace,
    pub(crate) theme: Theme,
}

impl fmt::Display for BacktraceFormatter<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{:━^80}", " BACKTRACE ")?;

        // Collect frame info.
        let frames: Vec<_> = self
            .inner
            .frames()
            .iter()
            .flat_map(|frame| frame.symbols())
            .zip(1usize..)
            .map(|(sym, n)| Frame {
                name: sym.name().map(|x| x.to_string()),
                lineno: sym.lineno(),
                filename: sym.filename().map(|x| x.into()),
                n,
            })
            .collect();

        let mut filtered_frames = frames.iter().collect();
        match env::var("COLORBT_SHOW_HIDDEN").ok().as_deref() {
            Some("1") | Some("on") | Some("y") => (),
            _ => {
                for filter in self.filters {
                    filter(&mut filtered_frames);
                }
            }
        }

        if filtered_frames.is_empty() {
            // TODO: Would probably look better centered.
            return write!(f, "\n");
        }

        let mut separated = f.header("\n");

        // Don't let filters mess with the order.
        filtered_frames.sort_by_key(|x| x.n);

        let mut buf = String::new();

        macro_rules! print_hidden {
            ($n:expr) => {
                let n = $n;
                buf.clear();
                write!(
                    &mut buf,
                    "{decorator} {n} frame{plural} hidden {decorator}",
                    n = n,
                    plural = if n == 1 { "" } else { "s" },
                    decorator = "⋮",
                )
                .expect("writing to strings doesn't panic");
                write!(
                    &mut separated.ready(),
                    "{:^80}",
                    buf.style(self.theme.hidden_frames)
                )?;
            };
        }

        let mut last_n = 0;
        for frame in &filtered_frames {
            let frame_delta = frame.n - last_n - 1;
            if frame_delta != 0 {
                print_hidden!(frame_delta);
            }
            write!(&mut separated.ready(), "{}", StyledFrame(frame, self.theme))?;
            last_n = frame.n;
        }

        let last_filtered_n = filtered_frames.last().unwrap().n;
        let last_unfiltered_n = frames.last().unwrap().n;
        if last_filtered_n < last_unfiltered_n {
            print_hidden!(last_unfiltered_n - last_filtered_n);
        }

        Ok(())
    }
}

#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
pub(crate) enum Verbosity {
    Minimal,
    Medium,
    Full,
}

pub(crate) fn panic_verbosity() -> Verbosity {
    match env::var("RUST_BACKTRACE") {
        Ok(s) if s == "full" => Verbosity::Full,
        Ok(s) if s != "0" => Verbosity::Medium,
        _ => Verbosity::Minimal,
    }
}

pub(crate) fn lib_verbosity() -> Verbosity {
    match env::var("RUST_LIB_BACKTRACE").or_else(|_| env::var("RUST_BACKTRACE")) {
        Ok(s) if s == "full" => Verbosity::Full,
        Ok(s) if s != "0" => Verbosity::Medium,
        _ => Verbosity::Minimal,
    }
}

/// Callback for filtering a vector of `Frame`s
pub type FilterCallback = dyn Fn(&mut Vec<&Frame>) + Send + Sync + 'static;

/// Callback for filtering issue url generation in error reports
#[cfg(feature = "issue-url")]
#[cfg_attr(docsrs, doc(cfg(feature = "issue-url")))]
pub type IssueFilterCallback = dyn Fn(crate::ErrorKind<'_>) -> bool + Send + Sync + 'static;
color-eyre-0.6.2/src/fmt.rs000064400000000000000000000013020072674642500136600ustar  00000000000000//! Module for new types that isolate complext formatting
use std::fmt;

use owo_colors::OwoColorize;

pub(crate) struct LocationSection<'a>(
    pub(crate) Option<&'a std::panic::Location<'a>>,
    pub(crate) crate::config::Theme,
);

impl fmt::Display for LocationSection<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let theme = self.1;
        // If known, print panic location.
        if let Some(loc) = self.0 {
            write!(f, "{}", loc.file().style(theme.panic_file))?;
            write!(f, ":")?;
            write!(f, "{}", loc.line().style(theme.panic_line_number))?;
        } else {
            write!(f, "")?;
        }

        Ok(())
    }
}
color-eyre-0.6.2/src/handler.rs000064400000000000000000000125170072674642500145210ustar  00000000000000use crate::{
    config::BacktraceFormatter,
    section::help::HelpInfo,
    writers::{EnvSection, WriterExt},
    Handler,
};
use backtrace::Backtrace;
use indenter::{indented, Format};
use std::fmt::Write;
#[cfg(feature = "capture-spantrace")]
use tracing_error::{ExtractSpanTrace, SpanTrace};

impl std::fmt::Debug for Handler {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_str("redacted")
    }
}

impl Handler {
    /// Return a reference to the captured `Backtrace` type
    pub fn backtrace(&self) -> Option<&Backtrace> {
        self.backtrace.as_ref()
    }

    /// Return a reference to the captured `SpanTrace` type
    #[cfg(feature = "capture-spantrace")]
    #[cfg_attr(docsrs, doc(cfg(feature = "capture-spantrace")))]
    pub fn span_trace(&self) -> Option<&SpanTrace> {
        self.span_trace.as_ref()
    }

    pub(crate) fn format_backtrace<'a>(
        &'a self,
        trace: &'a backtrace::Backtrace,
    ) -> BacktraceFormatter<'a> {
        BacktraceFormatter {
            filters: &self.filters,
            inner: trace,
            theme: self.theme,
        }
    }
}

impl eyre::EyreHandler for Handler {
    fn debug(
        &self,
        error: &(dyn std::error::Error + 'static),
        f: &mut core::fmt::Formatter<'_>,
    ) -> core::fmt::Result {
        if f.alternate() {
            return core::fmt::Debug::fmt(error, f);
        }

        #[cfg(feature = "capture-spantrace")]
        let errors = || {
            eyre::Chain::new(error)
                .filter(|e| e.span_trace().is_none())
                .enumerate()
        };

        #[cfg(not(feature = "capture-spantrace"))]
        let errors = || eyre::Chain::new(error).enumerate();

        for (n, error) in errors() {
            writeln!(f)?;
            write!(indented(f).ind(n), "{}", self.theme.error.style(error))?;
        }

        let mut separated = f.header("\n\n");

        #[cfg(feature = "track-caller")]
        if self.display_location_section {
            write!(
                separated.ready(),
                "{}",
                crate::SectionExt::header(
                    crate::fmt::LocationSection(self.location, self.theme),
                    "Location:"
                )
            )?;
        }

        for section in self
            .sections
            .iter()
            .filter(|s| matches!(s, HelpInfo::Error(_, _)))
        {
            write!(separated.ready(), "{}", section)?;
        }

        for section in self
            .sections
            .iter()
            .filter(|s| matches!(s, HelpInfo::Custom(_)))
        {
            write!(separated.ready(), "{}", section)?;
        }

        #[cfg(feature = "capture-spantrace")]
        let span_trace = self
            .span_trace
            .as_ref()
            .or_else(|| get_deepest_spantrace(error));

        #[cfg(feature = "capture-spantrace")]
        {
            if let Some(span_trace) = span_trace {
                write!(
                    &mut separated.ready(),
                    "{}",
                    crate::writers::FormattedSpanTrace(span_trace)
                )?;
            }
        }

        if let Some(backtrace) = self.backtrace.as_ref() {
            let fmted_bt = self.format_backtrace(backtrace);

            write!(
                indented(&mut separated.ready()).with_format(Format::Uniform { indentation: "  " }),
                "{}",
                fmted_bt
            )?;
        }

        let f = separated.ready();
        let mut h = f.header("\n");
        let mut f = h.in_progress();

        for section in self
            .sections
            .iter()
            .filter(|s| !matches!(s, HelpInfo::Custom(_) | HelpInfo::Error(_, _)))
        {
            write!(&mut f, "{}", section)?;
            f = h.ready();
        }

        if self.display_env_section {
            let env_section = EnvSection {
                bt_captured: &self.backtrace.is_some(),
                #[cfg(feature = "capture-spantrace")]
                span_trace,
            };

            write!(&mut separated.ready(), "{}", env_section)?;
        }

        #[cfg(feature = "issue-url")]
        if self.issue_url.is_some() && (*self.issue_filter)(crate::ErrorKind::Recoverable(error)) {
            let url = self.issue_url.as_ref().unwrap();
            let mut payload = String::from("Error: ");
            for (n, error) in errors() {
                writeln!(&mut payload)?;
                write!(indented(&mut payload).ind(n), "{}", error)?;
            }

            let issue_section = crate::section::github::IssueSection::new(url, &payload)
                .with_backtrace(self.backtrace.as_ref())
                .with_metadata(&**self.issue_metadata);

            #[cfg(feature = "capture-spantrace")]
            let issue_section = issue_section.with_span_trace(span_trace);

            write!(&mut separated.ready(), "{}", issue_section)?;
        }

        Ok(())
    }

    #[cfg(feature = "track-caller")]
    fn track_caller(&mut self, location: &'static std::panic::Location<'static>) {
        self.location = Some(location);
    }
}

#[cfg(feature = "capture-spantrace")]
pub(crate) fn get_deepest_spantrace<'a>(
    error: &'a (dyn std::error::Error + 'static),
) -> Option<&'a SpanTrace> {
    eyre::Chain::new(error)
        .rev()
        .flat_map(|error| error.span_trace())
        .next()
}
color-eyre-0.6.2/src/lib.rs000064400000000000000000000575700072674642500136620ustar  00000000000000//! An error report handler for panics and the [`eyre`] crate for colorful, consistent, and well
//! formatted error reports for all kinds of errors.
//!
//! ## TLDR
//!
//! `color_eyre` helps you build error reports that look like this:
//!
//! 
color-eyre on  hooked [$!] is 📦 v0.5.0 via 🦀 v1.44.0
//!  cargo run --example custom_section
//!     Finished dev [unoptimized + debuginfo] target(s) in 0.04s
//!      Running `target/debug/examples/custom_section`
//! Error:
//!    0: Unable to read config
//!    1: cmd exited with non-zero status code
//!
//! Stderr:
//!    cat: fake_file: No such file or directory
//!
//!   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//!
//!    0: custom_section::output2 with self="cat" "fake_file"
//!       at examples/custom_section.rs:14
//!    1: custom_section::read_file with path="fake_file"
//!       at examples/custom_section.rs:58
//!    2: custom_section::read_config
//!       at examples/custom_section.rs:63
//!
//! Suggestion: try using a file that exists next time
//! //! ## Setup //! //! Add the following to your toml file: //! //! ```toml //! [dependencies] //! color-eyre = "0.5" //! ``` //! //! And install the panic and error report handlers: //! //! ```rust //! use color_eyre::eyre::Result; //! //! fn main() -> Result<()> { //! color_eyre::install()?; //! //! // ... //! # Ok(()) //! } //! ``` //! //! ### Disabling tracing support //! //! If you don't plan on using `tracing_error` and `SpanTrace` you can disable the //! tracing integration to cut down on unused dependencies: //! //! ```toml //! [dependencies] //! color-eyre = { version = "0.5", default-features = false } //! ``` //! //! ### Disabling SpanTrace capture by default //! //! color-eyre defaults to capturing span traces. This is because `SpanTrace` //! capture is significantly cheaper than `Backtrace` capture. However, like //! backtraces, span traces are most useful for debugging applications, and it's //! not uncommon to want to disable span trace capture by default to keep noise out //! developer. //! //! To disable span trace capture you must explicitly set one of the env variables //! that regulate `SpanTrace` capture to `"0"`: //! //! ```rust //! if std::env::var("RUST_SPANTRACE").is_err() { //! std::env::set_var("RUST_SPANTRACE", "0"); //! } //! ``` //! //! ### Improving perf on debug builds //! //! In debug mode `color-eyre` behaves noticably worse than `eyre`. This is caused //! by the fact that `eyre` uses `std::backtrace::Backtrace` instead of //! `backtrace::Backtrace`. The std version of backtrace is precompiled with //! optimizations, this means that whether or not you're in debug mode doesn't //! matter much for how expensive backtrace capture is, it will always be in the //! 10s of milliseconds to capture. A debug version of `backtrace::Backtrace` //! however isn't so lucky, and can take an order of magnitude more time to capture //! a backtrace compared to its std counterpart. //! //! Cargo [profile //! overrides](https://doc.rust-lang.org/cargo/reference/profiles.html#overrides) //! can be used to mitigate this problem. By configuring your project to always //! build `backtrace` with optimizations you should get the same performance from //! `color-eyre` that you're used to with `eyre`. To do so add the following to //! your Cargo.toml: //! //! ```toml //! [profile.dev.package.backtrace] //! opt-level = 3 //! ``` //! //! ## Features //! //! ### Multiple report format verbosity levels //! //! `color-eyre` provides 3 different report formats for how it formats the captured `SpanTrace` //! and `Backtrace`, minimal, short, and full. Take the below snippets of the output produced by [`examples/usage.rs`]: //! //! --- //! //! Running `cargo run --example usage` without `RUST_LIB_BACKTRACE` set will produce a minimal //! report like this: //! //!
color-eyre on  hooked [$!] is 📦 v0.5.0 via 🦀 v1.44.0 took 2s
//!  cargo run --example usage
//!     Finished dev [unoptimized + debuginfo] target(s) in 0.04s
//!      Running `target/debug/examples/usage`
//! Jul 05 19:15:58.026  INFO read_config:read_file{path="fake_file"}: Reading file
//! Error:
//!    0: Unable to read config
//!    1: No such file or directory (os error 2)
//!
//!   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//!
//!    0: usage::read_file with path="fake_file"
//!       at examples/usage.rs:32
//!    1: usage::read_config
//!       at examples/usage.rs:38
//!
//! Suggestion: try using a file that exists next time
//! //!
//! //! Running `RUST_LIB_BACKTRACE=1 cargo run --example usage` tells `color-eyre` to use the short //! format, which additionally capture a [`backtrace::Backtrace`]: //! //!
color-eyre on  hooked [$!] is 📦 v0.5.0 via 🦀 v1.44.0
//!  RUST_LIB_BACKTRACE=1 cargo run --example usage
//!     Finished dev [unoptimized + debuginfo] target(s) in 0.04s
//!      Running `target/debug/examples/usage`
//! Jul 05 19:16:02.853  INFO read_config:read_file{path="fake_file"}: Reading file
//! Error:
//!    0: Unable to read config
//!    1: No such file or directory (os error 2)
//!
//!   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//!
//!    0: usage::read_file with path="fake_file"
//!       at examples/usage.rs:32
//!    1: usage::read_config
//!       at examples/usage.rs:38
//!
//!   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//!                                 ⋮ 5 frames hidden ⋮                               
//!    6: usage::read_file::haee210cb22460af3
//!       at /home/jlusby/git/yaahc/color-eyre/examples/usage.rs:35
//!    7: usage::read_config::ha649ef4ec333524d
//!       at /home/jlusby/git/yaahc/color-eyre/examples/usage.rs:40
//!    8: usage::main::hbe443b50eac38236
//!       at /home/jlusby/git/yaahc/color-eyre/examples/usage.rs:11
//!                                 ⋮ 10 frames hidden ⋮                              
//!
//! Suggestion: try using a file that exists next time
//! //!
//! //! Finally, running `RUST_LIB_BACKTRACE=full cargo run --example usage` tells `color-eyre` to use //! the full format, which in addition to the above will attempt to include source lines where the //! error originated from, assuming it can find them on the disk. //! //!
color-eyre on  hooked [$!] is 📦 v0.5.0 via 🦀 v1.44.0
//!  RUST_LIB_BACKTRACE=full cargo run --example usage
//!     Finished dev [unoptimized + debuginfo] target(s) in 0.05s
//!      Running `target/debug/examples/usage`
//! Jul 05 19:16:06.335  INFO read_config:read_file{path="fake_file"}: Reading file
//! Error:
//!    0: Unable to read config
//!    1: No such file or directory (os error 2)
//!
//!   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//!
//!    0: usage::read_file with path="fake_file"
//!       at examples/usage.rs:32
//!         30 │ }
//!         31 │
//!         32 > #[instrument]
//!         33 │ fn read_file(path: &str) -> Result<(), Report> {
//!         34 │     info!("Reading file");
//!    1: usage::read_config
//!       at examples/usage.rs:38
//!         36 │ }
//!         37 │
//!         38 > #[instrument]
//!         39 │ fn read_config() -> Result<(), Report> {
//!         40 │     read_file("fake_file")
//!
//!   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//!                                 ⋮ 5 frames hidden ⋮                               
//!    6: usage::read_file::haee210cb22460af3
//!       at /home/jlusby/git/yaahc/color-eyre/examples/usage.rs:35
//!         33 │ fn read_file(path: &str) -> Result<(), Report> {
//!         34 │     info!("Reading file");
//!         35 >     Ok(std::fs::read_to_string(path).map(drop)?)
//!         36 │ }
//!         37 │
//!    7: usage::read_config::ha649ef4ec333524d
//!       at /home/jlusby/git/yaahc/color-eyre/examples/usage.rs:40
//!         38 │ #[instrument]
//!         39 │ fn read_config() -> Result<(), Report> {
//!         40 >     read_file("fake_file")
//!         41 │         .wrap_err("Unable to read config")
//!         42 │         .suggestion("try using a file that exists next time")
//!    8: usage::main::hbe443b50eac38236
//!       at /home/jlusby/git/yaahc/color-eyre/examples/usage.rs:11
//!          9 │     color_eyre::install()?;
//!         10 │
//!         11 >     Ok(read_config()?)
//!         12 │ }
//!         13 │
//!                                 ⋮ 10 frames hidden ⋮                              
//!
//! Suggestion: try using a file that exists next time
//! //! ### Custom `Section`s for error reports via [`Section`] trait //! //! The `section` module provides helpers for adding extra sections to error //! reports. Sections are disinct from error messages and are displayed //! independently from the chain of errors. Take this example of adding sections //! to contain `stderr` and `stdout` from a failed command, taken from //! [`examples/custom_section.rs`]: //! //! ```rust //! use color_eyre::{eyre::eyre, SectionExt, Section, eyre::Report}; //! use std::process::Command; //! use tracing::instrument; //! //! trait Output { //! fn output2(&mut self) -> Result; //! } //! //! impl Output for Command { //! #[instrument] //! fn output2(&mut self) -> Result { //! let output = self.output()?; //! //! let stdout = String::from_utf8_lossy(&output.stdout); //! //! if !output.status.success() { //! let stderr = String::from_utf8_lossy(&output.stderr); //! Err(eyre!("cmd exited with non-zero status code")) //! .with_section(move || stdout.trim().to_string().header("Stdout:")) //! .with_section(move || stderr.trim().to_string().header("Stderr:")) //! } else { //! Ok(stdout.into()) //! } //! } //! } //! ``` //! //! --- //! //! Here we have an function that, if the command exits unsuccessfully, creates a //! report indicating the failure and attaches two sections, one for `stdout` and //! one for `stderr`. //! //! Running `cargo run --example custom_section` shows us how these sections are //! included in the output: //! //!
color-eyre on  hooked [$!] is 📦 v0.5.0 via 🦀 v1.44.0 took 2s
//!  cargo run --example custom_section
//!     Finished dev [unoptimized + debuginfo] target(s) in 0.04s
//!      Running `target/debug/examples/custom_section`
//! Error:
//!    0: Unable to read config
//!    1: cmd exited with non-zero status code
//!
//! Stderr:
//!    cat: fake_file: No such file or directory
//!
//!   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//!
//!    0: custom_section::output2 with self="cat" "fake_file"
//!       at examples/custom_section.rs:14
//!    1: custom_section::read_file with path="fake_file"
//!       at examples/custom_section.rs:58
//!    2: custom_section::read_config
//!       at examples/custom_section.rs:63
//!
//! Suggestion: try using a file that exists next time
//! //! Only the `Stderr:` section actually gets included. The `cat` command fails, //! so stdout ends up being empty and is skipped in the final report. This gives //! us a short and concise error report indicating exactly what was attempted and //! how it failed. //! //! ### Aggregating multiple errors into one report //! //! It's not uncommon for programs like batched task runners or parsers to want //! to return an error with multiple sources. The current version of the error //! trait does not support this use case very well, though there is [work being //! done](https://github.com/rust-lang/rfcs/pull/2895) to improve this. //! //! For now however one way to work around this is to compose errors outside the //! error trait. `color-eyre` supports such composition in its error reports via //! the `Section` trait. //! //! For an example of how to aggregate errors check out [`examples/multiple_errors.rs`]. //! //! ### Custom configuration for `color-backtrace` for setting custom filters and more //! //! The pretty printing for backtraces and span traces isn't actually provided by //! `color-eyre`, but instead comes from its dependencies [`color-backtrace`] and //! [`color-spantrace`]. `color-backtrace` in particular has many more features //! than are exported by `color-eyre`, such as customized color schemes, panic //! hooks, and custom frame filters. The custom frame filters are particularly //! useful when combined with `color-eyre`, so to enable their usage we provide //! the `install` fn for setting up a custom `BacktracePrinter` with custom //! filters installed. //! //! For an example of how to setup custom filters, check out [`examples/custom_filter.rs`]. //! //! [`eyre`]: https://docs.rs/eyre //! [`tracing-error`]: https://docs.rs/tracing-error //! [`color-backtrace`]: https://docs.rs/color-backtrace //! [`eyre::EyreHandler`]: https://docs.rs/eyre/*/eyre/trait.EyreHandler.html //! [`backtrace::Backtrace`]: https://docs.rs/backtrace/*/backtrace/struct.Backtrace.html //! [`tracing_error::SpanTrace`]: https://docs.rs/tracing-error/*/tracing_error/struct.SpanTrace.html //! [`color-spantrace`]: https://github.com/yaahc/color-spantrace //! [`Section`]: https://docs.rs/color-eyre/*/color_eyre/trait.Section.html //! [`eyre::Report`]: https://docs.rs/eyre/*/eyre/struct.Report.html //! [`eyre::Result`]: https://docs.rs/eyre/*/eyre/type.Result.html //! [`Handler`]: https://docs.rs/color-eyre/*/color_eyre/struct.Handler.html //! [`examples/usage.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/usage.rs //! [`examples/custom_filter.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/custom_filter.rs //! [`examples/custom_section.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/custom_section.rs //! [`examples/multiple_errors.rs`]: https://github.com/yaahc/color-eyre/blob/master/examples/multiple_errors.rs #![doc(html_root_url = "https://docs.rs/color-eyre/0.6.2")] #![cfg_attr(docsrs, feature(doc_cfg))] #![warn( missing_docs, rustdoc::missing_doc_code_examples, rust_2018_idioms, unreachable_pub, bad_style, const_err, dead_code, improper_ctypes, non_shorthand_field_patterns, no_mangle_generic_items, overflowing_literals, path_statements, patterns_in_fns_without_body, private_in_public, unconditional_recursion, unused, unused_allocation, unused_comparisons, unused_parens, while_true )] #![allow(clippy::try_err)] use std::sync::Arc; use backtrace::Backtrace; pub use eyre; #[doc(hidden)] pub use eyre::Report; #[doc(hidden)] pub use eyre::Result; pub use owo_colors; use section::help::HelpInfo; #[doc(hidden)] pub use section::Section as Help; pub use section::{IndentedSection, Section, SectionExt}; #[cfg(feature = "capture-spantrace")] use tracing_error::SpanTrace; #[doc(hidden)] pub use Handler as Context; pub mod config; mod fmt; mod handler; pub(crate) mod private; pub mod section; mod writers; /// A custom handler type for [`eyre::Report`] which provides colorful error /// reports and [`tracing-error`] support. /// /// # Details /// /// This type is not intended to be used directly, prefer using it via the /// [`color_eyre::Report`] and [`color_eyre::Result`] type aliases. /// /// [`eyre::Report`]: https://docs.rs/eyre/*/eyre/struct.Report.html /// [`tracing-error`]: https://docs.rs/tracing-error /// [`color_eyre::Report`]: type.Report.html /// [`color_eyre::Result`]: type.Result.html pub struct Handler { filters: Arc<[Box]>, backtrace: Option, #[cfg(feature = "capture-spantrace")] span_trace: Option, sections: Vec, display_env_section: bool, #[cfg(feature = "track-caller")] display_location_section: bool, #[cfg(feature = "issue-url")] issue_url: Option, #[cfg(feature = "issue-url")] issue_metadata: std::sync::Arc)>>, #[cfg(feature = "issue-url")] issue_filter: std::sync::Arc, theme: crate::config::Theme, #[cfg(feature = "track-caller")] location: Option<&'static std::panic::Location<'static>>, } /// The kind of type erased error being reported #[cfg(feature = "issue-url")] #[cfg_attr(docsrs, doc(cfg(feature = "issue-url")))] pub enum ErrorKind<'a> { /// A non recoverable error aka `panic!` NonRecoverable(&'a dyn std::any::Any), /// A recoverable error aka `impl std::error::Error` Recoverable(&'a (dyn std::error::Error + 'static)), } /// Install the default panic and error report hooks /// /// # Details /// /// This function must be called to enable the customization of `eyre::Report` /// provided by `color-eyre`. This function should be called early, ideally /// before any errors could be encountered. /// /// Only the first install will succeed. Calling this function after another /// report handler has been installed will cause an error. **Note**: This /// function _must_ be called before any `eyre::Report`s are constructed to /// prevent the default handler from being installed. /// /// Installing a global theme in `color_spantrace` manually (by calling /// `color_spantrace::set_theme` or `color_spantrace::colorize` before /// `install` is called) will result in an error if this function is called. /// /// # Examples /// /// ```rust /// use color_eyre::eyre::Result; /// /// fn main() -> Result<()> { /// color_eyre::install()?; /// /// // ... /// # Ok(()) /// } /// ``` pub fn install() -> Result<(), crate::eyre::Report> { config::HookBuilder::default().install() } color-eyre-0.6.2/src/private.rs000064400000000000000000000002210072674642500145430ustar 00000000000000use crate::eyre::Report; pub trait Sealed {} impl Sealed for std::result::Result where E: Into {} impl Sealed for Report {} color-eyre-0.6.2/src/section/github.rs000064400000000000000000000120700072674642500160240ustar 00000000000000use crate::writers::DisplayExt; use backtrace::Backtrace; use std::{fmt, panic::Location}; #[cfg(feature = "capture-spantrace")] use tracing_error::SpanTrace; use url::Url; type Display<'a> = Box; pub(crate) struct IssueSection<'a> { url: &'a str, msg: &'a str, location: Option<&'a Location<'a>>, backtrace: Option<&'a Backtrace>, #[cfg(feature = "capture-spantrace")] span_trace: Option<&'a SpanTrace>, metadata: &'a [(String, Display<'a>)], } impl<'a> IssueSection<'a> { pub(crate) fn new(url: &'a str, msg: &'a str) -> Self { IssueSection { url, msg, location: None, backtrace: None, #[cfg(feature = "capture-spantrace")] span_trace: None, metadata: &[], } } pub(crate) fn with_location(mut self, location: impl Into>>) -> Self { self.location = location.into(); self } pub(crate) fn with_backtrace(mut self, backtrace: impl Into>) -> Self { self.backtrace = backtrace.into(); self } #[cfg(feature = "capture-spantrace")] pub(crate) fn with_span_trace(mut self, span_trace: impl Into>) -> Self { self.span_trace = span_trace.into(); self } pub(crate) fn with_metadata(mut self, metadata: &'a [(String, Display<'a>)]) -> Self { self.metadata = metadata; self } } impl fmt::Display for IssueSection<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let location = self .location .map(|loc| ("location".to_string(), Box::new(loc) as _)); let metadata = self.metadata.iter().chain(location.as_ref()); let metadata = MetadataSection { metadata }.to_string(); let mut body = Body::new(); body.push_section("Error", ConsoleSection(self.msg))?; if !self.metadata.is_empty() { body.push_section("Metadata", metadata)?; } #[cfg(feature = "capture-spantrace")] if let Some(st) = self.span_trace { body.push_section( "SpanTrace", Collapsed(ConsoleSection(st.with_header("SpanTrace:\n"))), )?; } if let Some(bt) = self.backtrace { body.push_section( "Backtrace", Collapsed(ConsoleSection( DisplayFromDebug(bt).with_header("Backtrace:\n"), )), )?; } let url_result = Url::parse_with_params( self.url, &[("title", ""), ("body", &body.body)], ); let url: &dyn fmt::Display = match &url_result { Ok(url_struct) => url_struct, Err(_) => &self.url, }; url.with_header("Consider reporting this error using this URL: ") .fmt(f) } } struct Body { body: String, } impl Body { fn new() -> Self { Body { body: String::new(), } } fn push_section(&mut self, header: &'static str, section: T) -> fmt::Result where T: fmt::Display, { use std::fmt::Write; let separator = if self.body.is_empty() { "" } else { "\n\n" }; let header = header .with_header("## ") .with_header(separator) .with_footer("\n"); write!(&mut self.body, "{}", section.with_header(header)) } } struct MetadataSection { metadata: T, } impl<'a, T> MetadataSection where T: IntoIterator)>, { // This is implemented as a free functions so it can consume the `metadata` // iterator, rather than being forced to leave it unmodified if its behind a // `&self` shared reference via the Display trait #[allow(clippy::inherent_to_string, clippy::wrong_self_convention)] fn to_string(self) -> String { use std::fmt::Write; let mut out = String::new(); let f = &mut out; writeln!(f, "|key|value|").expect("writing to a string doesn't panic"); writeln!(f, "|--|--|").expect("writing to a string doesn't panic"); for (key, value) in self.metadata { writeln!(f, "|**{}**|{}|", key, value).expect("writing to a string doesn't panic"); } out } } struct ConsoleSection(T); impl fmt::Display for ConsoleSection where T: fmt::Display, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { (&self.0).with_header("```\n").with_footer("\n```").fmt(f) } } struct Collapsed(T); impl fmt::Display for Collapsed where T: fmt::Display, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { (&self.0) .with_header("\n
\n\n") .with_footer("\n
") .fmt(f) } } struct DisplayFromDebug(T); impl fmt::Display for DisplayFromDebug where T: fmt::Debug, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.0.fmt(f) } } color-eyre-0.6.2/src/section/help.rs000064400000000000000000000214330072674642500154750ustar 00000000000000//! Provides an extension trait for attaching `Section` to error reports. use crate::{ config::Theme, eyre::{Report, Result}, Section, }; use indenter::indented; use owo_colors::OwoColorize; use std::fmt::Write; use std::fmt::{self, Display}; impl Section for Report { type Return = Report; fn note(mut self, note: D) -> Self::Return where D: Display + Send + Sync + 'static, { if let Some(handler) = self.handler_mut().downcast_mut::() { handler .sections .push(HelpInfo::Note(Box::new(note), handler.theme)); } self } fn with_note(mut self, note: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { if let Some(handler) = self.handler_mut().downcast_mut::() { handler .sections .push(HelpInfo::Note(Box::new(note()), handler.theme)); } self } fn warning(mut self, warning: D) -> Self::Return where D: Display + Send + Sync + 'static, { if let Some(handler) = self.handler_mut().downcast_mut::() { handler .sections .push(HelpInfo::Warning(Box::new(warning), handler.theme)); } self } fn with_warning(mut self, warning: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { if let Some(handler) = self.handler_mut().downcast_mut::() { handler .sections .push(HelpInfo::Warning(Box::new(warning()), handler.theme)); } self } fn suggestion(mut self, suggestion: D) -> Self::Return where D: Display + Send + Sync + 'static, { if let Some(handler) = self.handler_mut().downcast_mut::() { handler .sections .push(HelpInfo::Suggestion(Box::new(suggestion), handler.theme)); } self } fn with_suggestion(mut self, suggestion: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { if let Some(handler) = self.handler_mut().downcast_mut::() { handler .sections .push(HelpInfo::Suggestion(Box::new(suggestion()), handler.theme)); } self } fn with_section(mut self, section: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { if let Some(handler) = self.handler_mut().downcast_mut::() { let section = Box::new(section()); handler.sections.push(HelpInfo::Custom(section)); } self } fn section(mut self, section: D) -> Self::Return where D: Display + Send + Sync + 'static, { if let Some(handler) = self.handler_mut().downcast_mut::() { let section = Box::new(section); handler.sections.push(HelpInfo::Custom(section)); } self } fn error(mut self, error: E2) -> Self::Return where E2: std::error::Error + Send + Sync + 'static, { if let Some(handler) = self.handler_mut().downcast_mut::() { let error = error.into(); handler.sections.push(HelpInfo::Error(error, handler.theme)); } self } fn with_error(mut self, error: F) -> Self::Return where F: FnOnce() -> E2, E2: std::error::Error + Send + Sync + 'static, { if let Some(handler) = self.handler_mut().downcast_mut::() { let error = error().into(); handler.sections.push(HelpInfo::Error(error, handler.theme)); } self } } impl Section for Result where E: Into, { type Return = Result; fn note(self, note: D) -> Self::Return where D: Display + Send + Sync + 'static, { self.map_err(|error| error.into()) .map_err(|report| report.note(note)) } fn with_note(self, note: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { self.map_err(|error| error.into()) .map_err(|report| report.note(note())) } fn warning(self, warning: D) -> Self::Return where D: Display + Send + Sync + 'static, { self.map_err(|error| error.into()) .map_err(|report| report.warning(warning)) } fn with_warning(self, warning: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { self.map_err(|error| error.into()) .map_err(|report| report.warning(warning())) } fn suggestion(self, suggestion: D) -> Self::Return where D: Display + Send + Sync + 'static, { self.map_err(|error| error.into()) .map_err(|report| report.suggestion(suggestion)) } fn with_suggestion(self, suggestion: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { self.map_err(|error| error.into()) .map_err(|report| report.suggestion(suggestion())) } fn with_section(self, section: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D, { self.map_err(|error| error.into()) .map_err(|report| report.section(section())) } fn section(self, section: D) -> Self::Return where D: Display + Send + Sync + 'static, { self.map_err(|error| error.into()) .map_err(|report| report.section(section)) } fn error(self, error: E2) -> Self::Return where E2: std::error::Error + Send + Sync + 'static, { self.map_err(|error| error.into()) .map_err(|report| report.error(error)) } fn with_error(self, error: F) -> Self::Return where F: FnOnce() -> E2, E2: std::error::Error + Send + Sync + 'static, { self.map_err(|error| error.into()) .map_err(|report| report.error(error())) } } pub(crate) enum HelpInfo { Error(Box, Theme), Custom(Box), Note(Box, Theme), Warning(Box, Theme), Suggestion(Box, Theme), } impl Display for HelpInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { HelpInfo::Note(note, theme) => { write!(f, "{}: {}", "Note".style(theme.help_info_note), note) } HelpInfo::Warning(warning, theme) => write!( f, "{}: {}", "Warning".style(theme.help_info_warning), warning ), HelpInfo::Suggestion(suggestion, theme) => write!( f, "{}: {}", "Suggestion".style(theme.help_info_suggestion), suggestion ), HelpInfo::Custom(section) => write!(f, "{}", section), HelpInfo::Error(error, theme) => { // a lot here let errors = std::iter::successors( Some(error.as_ref() as &(dyn std::error::Error + 'static)), |e| e.source(), ); write!(f, "Error:")?; for (n, error) in errors.enumerate() { writeln!(f)?; write!(indented(f).ind(n), "{}", error.style(theme.help_info_error))?; } Ok(()) } } } } impl fmt::Debug for HelpInfo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { HelpInfo::Note(note, ..) => f .debug_tuple("Note") .field(&format_args!("{}", note)) .finish(), HelpInfo::Warning(warning, ..) => f .debug_tuple("Warning") .field(&format_args!("{}", warning)) .finish(), HelpInfo::Suggestion(suggestion, ..) => f .debug_tuple("Suggestion") .field(&format_args!("{}", suggestion)) .finish(), HelpInfo::Custom(custom, ..) => f .debug_tuple("CustomSection") .field(&format_args!("{}", custom)) .finish(), HelpInfo::Error(error, ..) => f.debug_tuple("Error").field(error).finish(), } } } color-eyre-0.6.2/src/section/mod.rs000064400000000000000000000256320072674642500153310ustar 00000000000000//! Helpers for adding custom sections to error reports use crate::writers::WriterExt; use std::fmt::{self, Display}; #[cfg(feature = "issue-url")] pub(crate) mod github; pub(crate) mod help; /// An indented section with a header for an error report /// /// # Details /// /// This helper provides two functions to help with constructing nicely formatted /// error reports. First, it handles indentation of every line of the body for /// you, and makes sure it is consistent with the rest of color-eyre's output. /// Second, it omits outputting the header if the body itself is empty, /// preventing unnecessary pollution of the report for sections with dynamic /// content. /// /// # Examples /// /// ```rust /// use color_eyre::{eyre::eyre, SectionExt, Section, eyre::Report}; /// use std::process::Command; /// use tracing::instrument; /// /// trait Output { /// fn output2(&mut self) -> Result; /// } /// /// impl Output for Command { /// #[instrument] /// fn output2(&mut self) -> Result { /// let output = self.output()?; /// /// let stdout = String::from_utf8_lossy(&output.stdout); /// /// if !output.status.success() { /// let stderr = String::from_utf8_lossy(&output.stderr); /// Err(eyre!("cmd exited with non-zero status code")) /// .with_section(move || stdout.trim().to_string().header("Stdout:")) /// .with_section(move || stderr.trim().to_string().header("Stderr:")) /// } else { /// Ok(stdout.into()) /// } /// } /// } /// ``` #[allow(missing_debug_implementations)] pub struct IndentedSection { header: H, body: B, } impl fmt::Display for IndentedSection where H: Display + Send + Sync + 'static, B: Display + Send + Sync + 'static, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use std::fmt::Write; let mut headered = f.header(&self.header); let headered = headered.ready(); let mut headered = headered.header("\n"); let mut headered = headered.ready(); let mut indented = indenter::indented(&mut headered) .with_format(indenter::Format::Uniform { indentation: " " }); write!(&mut indented, "{}", self.body)?; Ok(()) } } /// Extension trait for constructing sections with commonly used formats pub trait SectionExt: Sized { /// Add a header to a `Section` and indent the body /// /// # Details /// /// Bodies are always indented to the same level as error messages and spans. /// The header is not printed if the display impl of the body produces no /// output. /// /// # Examples /// /// ```rust,no_run /// use color_eyre::{eyre::eyre, Section, SectionExt, eyre::Report}; /// /// let all_in_header = "header\n body\n body"; /// let report = Err::<(), Report>(eyre!("an error occurred")) /// .section(all_in_header) /// .unwrap_err(); /// /// let just_header = "header"; /// let just_body = "body\nbody"; /// let report2 = Err::<(), Report>(eyre!("an error occurred")) /// .section(just_body.header(just_header)) /// .unwrap_err(); /// /// assert_eq!(format!("{:?}", report), format!("{:?}", report2)) /// ``` fn header(self, header: C) -> IndentedSection where C: Display + Send + Sync + 'static; } impl SectionExt for T where T: Display + Send + Sync + 'static, { fn header(self, header: C) -> IndentedSection where C: Display + Send + Sync + 'static, { IndentedSection { body: self, header } } } /// A helper trait for attaching informational sections to error reports to be /// displayed after the chain of errors /// /// # Details /// /// `color_eyre` provides two types of help text that can be attached to error reports: custom /// sections and pre-configured sections. Custom sections are added via the `section` and /// `with_section` methods, and give maximum control over formatting. /// /// The pre-configured sections are provided via `suggestion`, `warning`, and `note`. These /// sections are displayed after all other sections with no extra newlines between subsequent Help /// sections. They consist only of a header portion and are prepended with a colored string /// indicating the kind of section, e.g. `Note: This might have failed due to ..." pub trait Section: crate::private::Sealed { /// The return type of each method after adding context type Return; /// Add a section to an error report, to be displayed after the chain of errors. /// /// # Details /// /// Sections are displayed in the order they are added to the error report. They are displayed /// immediately after the `Error:` section and before the `SpanTrace` and `Backtrace` sections. /// They consist of a header and an optional body. The body of the section is indented by /// default. /// /// # Examples /// /// ```rust,should_panic /// use color_eyre::{eyre::eyre, eyre::Report, Section}; /// /// Err(eyre!("command failed")) /// .section("Please report bugs to https://real.url/bugs")?; /// # Ok::<_, Report>(()) /// ``` fn section(self, section: D) -> Self::Return where D: Display + Send + Sync + 'static; /// Add a Section to an error report, to be displayed after the chain of errors. The closure to /// create the Section is lazily evaluated only in the case of an error. /// /// # Examples /// /// ```rust /// use color_eyre::{eyre::eyre, eyre::Report, Section, SectionExt}; /// /// let output = std::process::Command::new("ls") /// .output()?; /// /// let output = if !output.status.success() { /// let stderr = String::from_utf8_lossy(&output.stderr); /// Err(eyre!("cmd exited with non-zero status code")) /// .with_section(move || stderr.trim().to_string().header("Stderr:"))? /// } else { /// String::from_utf8_lossy(&output.stdout) /// }; /// /// println!("{}", output); /// # Ok::<_, Report>(()) /// ``` fn with_section(self, section: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D; /// Add an error section to an error report, to be displayed after the primary error message /// section. /// /// # Examples /// /// ```rust,should_panic /// use color_eyre::{eyre::eyre, eyre::Report, Section}; /// use thiserror::Error; /// /// #[derive(Debug, Error)] /// #[error("{0}")] /// struct StrError(&'static str); /// /// Err(eyre!("command failed")) /// .error(StrError("got one error")) /// .error(StrError("got a second error"))?; /// # Ok::<_, Report>(()) /// ``` fn error(self, error: E) -> Self::Return where E: std::error::Error + Send + Sync + 'static; /// Add an error section to an error report, to be displayed after the primary error message /// section. The closure to create the Section is lazily evaluated only in the case of an error. /// /// # Examples /// /// ```rust,should_panic /// use color_eyre::{eyre::eyre, eyre::Report, Section}; /// use thiserror::Error; /// /// #[derive(Debug, Error)] /// #[error("{0}")] /// struct StringError(String); /// /// Err(eyre!("command failed")) /// .with_error(|| StringError("got one error".into())) /// .with_error(|| StringError("got a second error".into()))?; /// # Ok::<_, Report>(()) /// ``` fn with_error(self, error: F) -> Self::Return where F: FnOnce() -> E, E: std::error::Error + Send + Sync + 'static; /// Add a Note to an error report, to be displayed after the chain of errors. /// /// # Examples /// /// ```rust /// # use std::{error::Error, fmt::{self, Display}}; /// # use color_eyre::eyre::Result; /// # #[derive(Debug)] /// # struct FakeErr; /// # impl Display for FakeErr { /// # fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { /// # write!(f, "FakeErr") /// # } /// # } /// # impl std::error::Error for FakeErr {} /// # fn main() -> Result<()> { /// # fn fallible_fn() -> Result<(), FakeErr> { /// # Ok(()) /// # } /// use color_eyre::Section as _; /// /// fallible_fn().note("This might have failed due to ...")?; /// # Ok(()) /// # } /// ``` fn note(self, note: D) -> Self::Return where D: Display + Send + Sync + 'static; /// Add a Note to an error report, to be displayed after the chain of errors. The closure to /// create the Note is lazily evaluated only in the case of an error. /// /// # Examples /// /// ```rust /// # use std::{error::Error, fmt::{self, Display}}; /// # use color_eyre::eyre::Result; /// # #[derive(Debug)] /// # struct FakeErr; /// # impl Display for FakeErr { /// # fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { /// # write!(f, "FakeErr") /// # } /// # } /// # impl std::error::Error for FakeErr {} /// # fn main() -> Result<()> { /// # fn fallible_fn() -> Result<(), FakeErr> { /// # Ok(()) /// # } /// use color_eyre::Section as _; /// /// fallible_fn().with_note(|| { /// format!("This might have failed due to ... It has failed {} times", 100) /// })?; /// # Ok(()) /// # } /// ``` fn with_note(self, f: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D; /// Add a Warning to an error report, to be displayed after the chain of errors. fn warning(self, warning: D) -> Self::Return where D: Display + Send + Sync + 'static; /// Add a Warning to an error report, to be displayed after the chain of errors. The closure to /// create the Warning is lazily evaluated only in the case of an error. fn with_warning(self, f: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D; /// Add a Suggestion to an error report, to be displayed after the chain of errors. fn suggestion(self, suggestion: D) -> Self::Return where D: Display + Send + Sync + 'static; /// Add a Suggestion to an error report, to be displayed after the chain of errors. The closure /// to create the Suggestion is lazily evaluated only in the case of an error. fn with_suggestion(self, f: F) -> Self::Return where D: Display + Send + Sync + 'static, F: FnOnce() -> D; } /// Trait for printing a panic error message for the given PanicInfo pub trait PanicMessage: Send + Sync + 'static { /// Display trait equivalent for implementing the display logic fn display(&self, pi: &std::panic::PanicInfo<'_>, f: &mut fmt::Formatter<'_>) -> fmt::Result; } color-eyre-0.6.2/src/writers.rs000064400000000000000000000142750072674642500146060ustar 00000000000000use crate::config::{lib_verbosity, panic_verbosity, Verbosity}; use fmt::Write; use std::fmt::{self, Display}; #[cfg(feature = "capture-spantrace")] use tracing_error::{SpanTrace, SpanTraceStatus}; #[allow(explicit_outlives_requirements)] pub(crate) struct HeaderWriter<'a, H, W> where H: ?Sized, { inner: W, header: &'a H, started: bool, } pub(crate) trait WriterExt: Sized { fn header(self, header: &H) -> HeaderWriter<'_, H, Self>; } impl WriterExt for W { fn header(self, header: &H) -> HeaderWriter<'_, H, Self> { HeaderWriter { inner: self, header, started: false, } } } pub(crate) trait DisplayExt: Sized + Display { fn with_header(self, header: H) -> Header; fn with_footer(self, footer: F) -> Footer; } impl DisplayExt for T where T: Display, { fn with_footer(self, footer: F) -> Footer { Footer { body: self, footer } } fn with_header(self, header: H) -> Header { Header { body: self, h: header, } } } pub(crate) struct ReadyHeaderWriter<'a, 'b, H: ?Sized, W>(&'b mut HeaderWriter<'a, H, W>); impl<'a, H: ?Sized, W> HeaderWriter<'a, H, W> { pub(crate) fn ready(&mut self) -> ReadyHeaderWriter<'a, '_, H, W> { self.started = false; ReadyHeaderWriter(self) } pub(crate) fn in_progress(&mut self) -> ReadyHeaderWriter<'a, '_, H, W> { self.started = true; ReadyHeaderWriter(self) } } impl<'a, H: ?Sized, W> fmt::Write for ReadyHeaderWriter<'a, '_, H, W> where H: Display, W: fmt::Write, { fn write_str(&mut self, s: &str) -> fmt::Result { if !self.0.started && !s.is_empty() { self.0.inner.write_fmt(format_args!("{}", self.0.header))?; self.0.started = true; } self.0.inner.write_str(s) } } pub(crate) struct FooterWriter { inner: W, had_output: bool, } impl fmt::Write for FooterWriter where W: fmt::Write, { fn write_str(&mut self, s: &str) -> fmt::Result { if !self.had_output && !s.is_empty() { self.had_output = true; } self.inner.write_str(s) } } #[allow(explicit_outlives_requirements)] pub(crate) struct Footer where B: Display, H: Display, { body: B, footer: H, } impl fmt::Display for Footer where B: Display, H: Display, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut inner_f = FooterWriter { inner: &mut *f, had_output: false, }; write!(&mut inner_f, "{}", self.body)?; if inner_f.had_output { self.footer.fmt(f)?; } Ok(()) } } #[allow(explicit_outlives_requirements)] pub(crate) struct Header where B: Display, H: Display, { body: B, h: H, } impl fmt::Display for Header where B: Display, H: Display, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f.header(&self.h).ready(), "{}", self.body)?; Ok(()) } } #[cfg(feature = "capture-spantrace")] pub(crate) struct FormattedSpanTrace<'a>(pub(crate) &'a SpanTrace); #[cfg(feature = "capture-spantrace")] impl fmt::Display for FormattedSpanTrace<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use indenter::indented; use indenter::Format; if self.0.status() == SpanTraceStatus::CAPTURED { write!( indented(f).with_format(Format::Uniform { indentation: " " }), "{}", color_spantrace::colorize(self.0) )?; } Ok(()) } } pub(crate) struct EnvSection<'a> { pub(crate) bt_captured: &'a bool, #[cfg(feature = "capture-spantrace")] pub(crate) span_trace: Option<&'a SpanTrace>, } impl fmt::Display for EnvSection<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let v = if std::thread::panicking() { panic_verbosity() } else { lib_verbosity() }; write!(f, "{}", BacktraceOmited(!self.bt_captured))?; let mut separated = HeaderWriter { inner: &mut *f, header: &"\n", started: false, }; write!(&mut separated.ready(), "{}", SourceSnippets(v))?; #[cfg(feature = "capture-spantrace")] write!( &mut separated.ready(), "{}", SpanTraceOmited(self.span_trace) )?; Ok(()) } } #[cfg(feature = "capture-spantrace")] struct SpanTraceOmited<'a>(Option<&'a SpanTrace>); #[cfg(feature = "capture-spantrace")] impl fmt::Display for SpanTraceOmited<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(span_trace) = self.0 { if span_trace.status() == SpanTraceStatus::UNSUPPORTED { writeln!(f, "Warning: SpanTrace capture is Unsupported.")?; write!( f, "Ensure that you've setup a tracing-error ErrorLayer and the semver versions are compatible" )?; } } Ok(()) } } struct BacktraceOmited(bool); impl fmt::Display for BacktraceOmited { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // Print some info on how to increase verbosity. if self.0 { write!( f, "Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it." )?; } else { // This text only makes sense if frames are displayed. write!( f, "Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering." )?; } Ok(()) } } struct SourceSnippets(Verbosity); impl fmt::Display for SourceSnippets { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if self.0 <= Verbosity::Medium { write!( f, "Run with RUST_BACKTRACE=full to include source snippets." )?; } Ok(()) } } color-eyre-0.6.2/tests/bt_disabled.rs000064400000000000000000000005000072674642500157000ustar 00000000000000use color_eyre::eyre; use eyre::eyre; #[test] fn disabled() { color_eyre::config::HookBuilder::default() .display_env_section(false) .install() .unwrap(); let report = eyre!("error occured"); let report = format!("{:?}", report); assert!(!report.contains("RUST_BACKTRACE")); } color-eyre-0.6.2/tests/bt_enabled.rs000064400000000000000000000004750072674642500155360ustar 00000000000000use color_eyre::eyre; use eyre::eyre; #[test] fn enabled() { color_eyre::config::HookBuilder::default() .display_env_section(true) .install() .unwrap(); let report = eyre!("error occured"); let report = format!("{:?}", report); assert!(report.contains("RUST_BACKTRACE")); } color-eyre-0.6.2/tests/data/theme_error_control.txt000064400000000000000000000073310072674642500206340ustar 00000000000000 0: test Location: tests/theme.rs:17 Error: 0: error ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0: theme::get_error with msg="test" at tests/theme.rs:11 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ⋮ 5 frames hidden ⋮  6: theme::get_error::create_report::hdb41452bef3fc05d at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:17 7: theme::get_error::{{closure}}::h739c7fe800e2d03f at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 8: core::option::Option::ok_or_else::hd8e670bbca63e94a at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/option.rs:954 9: theme::get_error::h2f751f4927c6fecb at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 10: theme::test_error_backwards_compatibility::hfc4be9f22c32535c at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:43 11: theme::test_error_backwards_compatibility::{{closure}}::hb001a9a908f0f5a4 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:41 12: core::ops::function::FnOnce::call_once::he26938a69d361bf6 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 13: core::ops::function::FnOnce::call_once::h83cc023b85256d97 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 14: test::__rust_begin_short_backtrace::h7330e4e8b0549e26 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:585 15:  as core::ops::function::FnOnce>::call_once::h6b77566b8f386abb at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/alloc/src/boxed.rs:1691 16:  as core::ops::function::FnOnce<()>>::call_once::h2ad5de64df41b71c at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/panic/unwind_safe.rs:271 17: std::panicking::try::do_call::he67b1e56b423a618 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:403 18: std::panicking::try::ha9224adcdd41a723 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:367 19: std::panic::catch_unwind::h9111b58ae0b27828 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panic.rs:133 20: test::run_test_in_process::h15b6b7d5919893aa at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:608  ⋮ 15 frames hidden ⋮  Note: note Warning: warning Suggestion: suggestion Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering. Run with RUST_BACKTRACE=full to include source snippets.color-eyre-0.6.2/tests/data/theme_error_control_location.txt000064400000000000000000000065620072674642500225310ustar 00000000000000 0: test Location: tests/theme.rs:17 Error: 0: error ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ⋮ 5 frames hidden ⋮  6: theme::get_error::create_report::hf800a973f2100b44 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:17 7: theme::get_error::{{closure}}::ha65156cf9648d3e0 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 8: core::option::Option::ok_or_else::h08df66cff4c7bff2 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/option.rs:954 9: theme::get_error::h7c1fce8fa3550ff9 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 10: theme::test_error_backwards_compatibility::h732311d7da5d7160 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:43 11: theme::test_error_backwards_compatibility::{{closure}}::h144cea82038adfc7 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:41 12: core::ops::function::FnOnce::call_once::h8d0ee3b0b70ed418 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 13: core::ops::function::FnOnce::call_once::h83cc023b85256d97 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 14: test::__rust_begin_short_backtrace::h7330e4e8b0549e26 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:585 15:  as core::ops::function::FnOnce>::call_once::h6b77566b8f386abb at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/alloc/src/boxed.rs:1691 16:  as core::ops::function::FnOnce<()>>::call_once::h2ad5de64df41b71c at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/panic/unwind_safe.rs:271 17: std::panicking::try::do_call::he67b1e56b423a618 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:403 18: std::panicking::try::ha9224adcdd41a723 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:367 19: std::panic::catch_unwind::h9111b58ae0b27828 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panic.rs:133 20: test::run_test_in_process::h15b6b7d5919893aa at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:608  ⋮ 15 frames hidden ⋮  Note: note Warning: warning Suggestion: suggestion Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering. Run with RUST_BACKTRACE=full to include source snippets.color-eyre-0.6.2/tests/data/theme_error_control_minimal.txt000064400000000000000000000065000072674642500223370ustar 00000000000000 0: test Error: 0: error ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ⋮ 5 frames hidden ⋮  6: theme::get_error::create_report::h89d883b51d51a08b at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:17 7: theme::get_error::{{closure}}::hb62079fda66513a2 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 8: core::option::Option::ok_or_else::h3227505b8a14ed22 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/option.rs:954 9: theme::get_error::hd930d722dbdb6279 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 10: theme::test_error_backwards_compatibility::h920cc312bf19dc01 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:43 11: theme::test_error_backwards_compatibility::{{closure}}::h0c00291bcfdb63ce at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:41 12: core::ops::function::FnOnce::call_once::h7736c3dcb6fd829d at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 13: core::ops::function::FnOnce::call_once::h83cc023b85256d97 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 14: test::__rust_begin_short_backtrace::h7330e4e8b0549e26 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:585 15:  as core::ops::function::FnOnce>::call_once::h6b77566b8f386abb at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/alloc/src/boxed.rs:1691 16:  as core::ops::function::FnOnce<()>>::call_once::h2ad5de64df41b71c at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/panic/unwind_safe.rs:271 17: std::panicking::try::do_call::he67b1e56b423a618 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:403 18: std::panicking::try::ha9224adcdd41a723 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:367 19: std::panic::catch_unwind::h9111b58ae0b27828 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panic.rs:133 20: test::run_test_in_process::h15b6b7d5919893aa at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:608  ⋮ 15 frames hidden ⋮  Note: note Warning: warning Suggestion: suggestion Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering. Run with RUST_BACKTRACE=full to include source snippets.color-eyre-0.6.2/tests/data/theme_error_control_spantrace.txt000064400000000000000000000072470072674642500227020ustar 00000000000000 0: test Error: 0: error ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0: theme::get_error with msg="test" at tests/theme.rs:11 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ⋮ 5 frames hidden ⋮  6: theme::get_error::create_report::h4bc625c000e4636e at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:17 7: theme::get_error::{{closure}}::h3dee499015f52230 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 8: core::option::Option::ok_or_else::h32a80642d5f9cd65 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/option.rs:954 9: theme::get_error::hb3756d9f0d65527f at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:25 10: theme::test_error_backwards_compatibility::h69192dd92f3a8a2e at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:43 11: theme::test_error_backwards_compatibility::{{closure}}::hd9459c2e516ade18 at /home/jlusby/git/yaahc/color-eyre/tests/theme.rs:41 12: core::ops::function::FnOnce::call_once::h540507413fe72275 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 13: core::ops::function::FnOnce::call_once::h83cc023b85256d97 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227 14: test::__rust_begin_short_backtrace::h7330e4e8b0549e26 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:585 15:  as core::ops::function::FnOnce>::call_once::h6b77566b8f386abb at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/alloc/src/boxed.rs:1691 16:  as core::ops::function::FnOnce<()>>::call_once::h2ad5de64df41b71c at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/panic/unwind_safe.rs:271 17: std::panicking::try::do_call::he67b1e56b423a618 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:403 18: std::panicking::try::ha9224adcdd41a723 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:367 19: std::panic::catch_unwind::h9111b58ae0b27828 at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panic.rs:133 20: test::run_test_in_process::h15b6b7d5919893aa at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/test/src/lib.rs:608  ⋮ 15 frames hidden ⋮  Note: note Warning: warning Suggestion: suggestion Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering. Run with RUST_BACKTRACE=full to include source snippets.color-eyre-0.6.2/tests/data/theme_panic_control.txt000064400000000000000000000033020072674642500205670ustar 00000000000000 Finished dev [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/examples/theme_test_helper` The application panicked (crashed). Message:  Location: examples/theme_test_helper.rs:37 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SPANTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0: theme_test_helper::get_error with msg="test" at examples/theme_test_helper.rs:34 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ⋮ 6 frames hidden ⋮  7: std::panic::panic_any::hd76a7f826307234c at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panic.rs:57 8: theme_test_helper::main::h767d3fd6c45048c8 at /home/jlusby/git/yaahc/color-eyre/examples/theme_test_helper.rs:37 9: core::ops::function::FnOnce::call_once::hc5a1cd4127189dad at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227  ⋮ 15 frames hidden ⋮  Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering. Run with RUST_BACKTRACE=full to include source snippets. color-eyre-0.6.2/tests/data/theme_panic_control_no_spantrace.txt000064400000000000000000000025000072674642500233220ustar 00000000000000 Finished dev [unoptimized + debuginfo] target(s) in 0.02s Running `target/debug/examples/theme_test_helper` The application panicked (crashed). Message:  Location: examples/theme_test_helper.rs:37 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ⋮ 6 frames hidden ⋮  7: std::panic::panic_any::hb5351c0843c6c4aa at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panic.rs:57 8: theme_test_helper::main::h22b568e997946766 at /home/jlusby/git/yaahc/color-eyre/examples/theme_test_helper.rs:37 9: core::ops::function::FnOnce::call_once::hab7662216a7cf3dc at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227  ⋮ 15 frames hidden ⋮  Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering. Run with RUST_BACKTRACE=full to include source snippets. color-eyre-0.6.2/tests/location_disabled.rs000064400000000000000000000005510072674642500171110ustar 00000000000000#[cfg(feature = "track-caller")] #[test] fn disabled() { use color_eyre::eyre; use eyre::eyre; color_eyre::config::HookBuilder::default() .display_location_section(false) .install() .unwrap(); let report = eyre!("error occured"); let report = format!("{:?}", report); assert!(!report.contains("Location:")); } color-eyre-0.6.2/tests/theme.rs000064400000000000000000000265100072674642500145570ustar 00000000000000// Note: It's recommended, not to change anything above or below (see big comment below) use color_eyre::{eyre::Report, Section}; #[rustfmt::skip] #[derive(Debug, thiserror::Error)] #[error("{0}")] struct TestError(&'static str); #[rustfmt::skip] #[tracing::instrument] fn get_error(msg: &'static str) -> Report { #[rustfmt::skip] #[inline(never)] fn create_report(msg: &'static str) -> Report { Report::msg(msg) .note("note") .warning("warning") .suggestion("suggestion") .error(TestError("error")) } // Using `Option` to trigger `is_dependency_code`. See https://github.com/yaahc/color-eyre/blob/4ddaeb2126ed8b14e4e6aa03d7eef49eb8561cf0/src/config.rs#L56 None::>.ok_or_else(|| create_report(msg)).unwrap_err() } #[cfg(all(not(feature = "track-caller"), not(feature = "capture-spantrace"),))] static ERROR_FILE_NAME: &str = "theme_error_control_minimal.txt"; #[cfg(all(feature = "track-caller", not(feature = "capture-spantrace"),))] static ERROR_FILE_NAME: &str = "theme_error_control_location.txt"; #[cfg(all(not(feature = "track-caller"), feature = "capture-spantrace",))] static ERROR_FILE_NAME: &str = "theme_error_control_spantrace.txt"; #[cfg(all(feature = "capture-spantrace", feature = "track-caller",))] static ERROR_FILE_NAME: &str = "theme_error_control.txt"; #[test] fn test_error_backwards_compatibility() { setup(); let error = get_error("test"); /* Note: If you change anything above this comment, it could make the stored test data invalid (because the structure of the generated error might change). In most cases, small changes shouldn't be a problem, but keep this in mind if you change something and suddenly this test case fails. The empty lines at the beginning are needed because `color_eyre` sometimes seems to not be able to find the correct line of source and uses the first line of the module (plus the next four lines). If a change of the code above leads to incompatibility, you therefore have to backport this (changed) file to the version of `color_eyre` that you want to test against and execute it to generate new control test data. To do this, do the following: 1) Change this file, and if the test now fails do: 2) Checkout the `color_eyre` version from Git that you want to test against 3) Add this test file to '/tests' 4) If `error_file_path` or `panic_file_path` exist (see below), delete these files 5) If you now run this test, it will fail and generate test data files in the current working directory 6) copy these files to `error_file_path` and `panic_file_path` in the current version of `color_eyre` (see the instructions that are printed out in step 5) Now this test shouldn't fail anymore in the current version. Alternatively, you also could just regenerate the test data of the current repo (as described above, but without backporting), and use this test data from now on (this makes sense, if you only changed the above code, and nothing else that could lead to the test failing). # How the tests in this file work: 1) generate a error (for example, with the code above) 2) convert this error to a string 3) load stored error data to compare to (stored in `error_file_path` and `panic_file_path`) 4) if `error_file_path` and/or `panic_file_path` doesn't exist, generate corresponding files in the current working directory and request the user to fix the issue (see below) 5) extract ANSI escaping sequences (of controls and current errors) 6) compare if the current error and the control contains the same ANSI escape sequences 7) If not, fail and show the full strings of the control and the current error Below you'll find instructions about how to debug failures of the tests in this file */ let target = format!("{:?}", error); test_backwards_compatibility(target, ERROR_FILE_NAME) } #[cfg(not(feature = "capture-spantrace"))] static PANIC_FILE_NAME: &str = "theme_panic_control_no_spantrace.txt"; #[cfg(feature = "capture-spantrace")] static PANIC_FILE_NAME: &str = "theme_panic_control.txt"; // The following tests the installed panic handler #[test] #[allow(unused_mut)] #[allow(clippy::vec_init_then_push)] fn test_panic_backwards_compatibility() { let mut features: Vec<&str> = vec![]; #[cfg(feature = "capture-spantrace")] features.push("capture-spantrace"); #[cfg(feature = "issue-url")] features.push("issue-url"); #[cfg(feature = "track-caller")] features.push("track-caller"); let features = features.join(","); let features = if !features.is_empty() { vec!["--features", &features] } else { vec![] }; let output = std::process::Command::new("cargo") .args(&["run", "--example", "theme_test_helper"]) .arg("--no-default-features") .args(&features) .output() .expect("failed to execute process"); let target = String::from_utf8(output.stderr).expect("failed to convert output to `String`"); println!("{}", target); test_backwards_compatibility(target, PANIC_FILE_NAME) } /// Helper for `test_error` and `test_panic` fn test_backwards_compatibility(target: String, file_name: &str) { use ansi_parser::{AnsiParser, AnsiSequence, Output}; use owo_colors::OwoColorize; use std::{fs, path::Path}; let file_path = ["tests/data/", file_name].concat(); // If `file_path` is missing, save corresponding file to current working directory, and panic with the request to move the file to `file_path`, and to commit it to Git. Being explicit (instead of saving directly to `file_path`) to make sure `file_path` is committed to Git. if !Path::new(&file_path).is_file() { std::fs::write(file_name, &target) .expect("\n\nError saving missing `control target` to a file"); panic!("Required test data missing! Fix this, by moving '{}' to '{}', and commit it to Git.\n\nNote: '{0}' was just generated in the current working directory.\n\n", file_name, file_path); } // `unwrap` should never fail with files generated by this function let control = String::from_utf8(fs::read(file_path).unwrap()).unwrap(); fn f(s: &str) -> (Vec, Vec) { let all: Vec<_> = s.ansi_parse().collect(); let ansi: Vec<_> = s .ansi_parse() .into_iter() .filter_map(|x| { if let Output::Escape(ansi) = x { Some(ansi) } else { None } }) .collect(); (all, ansi) } let (_control_tokens, control_ansi) = f(&control); let (_target_tokens, target_ansi) = f(&target); let msg = [ // comment out / un-comment what you need or don't need for debugging (see below for more instructions): format!("{}", "\x1b[0m\n\nANSI escape sequences are not identical to control!".red()), // ^ `\x1b[0m` clears previous ANSI escape sequences format!("{}", "CONTROL:".red()), format!("{}{}", "CONTROL STRING =\n".red(), &control), //format!("{}{:?}", "CONTROL DEBUG STRING =\n".red(), &control), //format!("{}{:?}", "CONTROL ANSI PARSER OUTPUT =\n".red(), &_control_tokens), //format!("{}{:?}", "CONTROL ANSI PARSER ANSI =\n".red(), &control_ansi), format!("{}", "CURRENT:".red()), format!("{}{}", "CURRENT STRING =\n".red(), &target), //format!("{}{:?}", "CURRENT DEBUG STRING =\n".red(), &target), //format!("{}{:?}", "CURRENT ANSI PARSER OUTPUT =\n".red(), &_target_tokens), //format!("{}{:?}", "CURRENT ANSI PARSER ANSI =\n".red(), &target_ansi), format!("{}", "See the src of this test for more information about the test and ways to include/exclude debugging information.\n\n".red()), ].join("\n\n"); assert_eq!(target_ansi, control_ansi, "{}", &msg); /* # Tips for debugging test failures It's a bit a pain to find the reason for test failures. To make it as easy as possible, I recommend the following workflow: ## Compare the actual errors 1) Run the test in two terminals with "CONTROL STRING" and "CURRENT STRING" active 2) In on terminal have the output of "CONTROL STRING" visible, in the out that of "CURRENT STRING" 3) Make sure, both errors are at the same location of their terminal 4) Now switch between the two terminal rapidly and often. This way it's easy to see changes. Note that we only compare ANSI escape sequences – so if the text changes, that is not a problem. A problem would it be, if there is a new section of content (which might contain new ANSI escape sequences). This could happen, for example, if the current code produces warnings, etc. (especially, with the panic handler test). ## Compare `ansi_parser` tokens If you fixed all potential problems above, and the test still failes, compare the actual ANSI escape sequences: 1) Activate "CURRENT ANSI PARSER OUTPUT" and "CURRENT ANSI PARSER OUTPUT" above 2) Copy this output to a text editor and replace all "), " with ")," + a newline (this way every token is on its own line) 3) Compare this new output with a diff tool (https://meldmerge.org/ is a nice option with a GUI) With this approach, you should see what has changed. Just remember that we only compare the ANSI escape sequences, text is skipped. With "CURRENT ANSI PARSER OUTPUT" and "CURRENT ANSI PARSER OUTPUT", however, text tokens are shown as well (to make it easier to figure out the source of ANSI escape sequences.) */ } fn setup() { std::env::set_var("RUST_LIB_BACKTRACE", "1"); #[cfg(feature = "capture-spantrace")] { use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, EnvFilter}; let fmt_layer = fmt::layer().with_target(false); let filter_layer = EnvFilter::try_from_default_env() .or_else(|_| EnvFilter::try_new("info")) .unwrap(); tracing_subscriber::registry() .with(filter_layer) .with(fmt_layer) .with(tracing_error::ErrorLayer::default()) .init(); } color_eyre::install().expect("Failed to install `color_eyre`"); /* # Easy way to test styles 1) uncomment the last line 2) activate the following code 3) change the styles 4) run this test via `cargo test test_error_backwards_compatibility --test styles` 5) your new styled error will be below the output "CURRENT STRING =" 6) if there is not such output, search for "CURRENT STRING =" above, and activate the line 7) if you are interested in running this test for actual testing this crate, don't forget to uncomment the code below, activate the above line */ /* use owo_colors::style; let styles = color_eyre::config::Styles::dark() // ^ or, instead of `dark`, use `new` for blank styles or `light` if you what to derive from a light theme. Now configure your styles (see the docs for all options): .line_number(style().blue()) .help_info_suggestion(style().red()); color_eyre::config::HookBuilder::new() .styles(styles) .install() .expect("Failed to install `color_eyre`"); */ } color-eyre-0.6.2/tests/wasm.rs000064400000000000000000000014170072674642500144230ustar 00000000000000#[cfg(target_arch = "wasm32")] #[wasm_bindgen_test::wasm_bindgen_test] pub fn color_eyre_simple() { use color_eyre::eyre::WrapErr; use color_eyre::*; install().expect("Failed to install color_eyre"); let err_str = format!( "{:?}", Err::<(), Report>(eyre::eyre!("Base Error")) .note("A note") .suggestion("A suggestion") .wrap_err("A wrapped error") .unwrap_err() ); // Print it out so if people run with `-- --nocapture`, they // can see the full message. println!("Error String is:\n\n{}", err_str); assert!(err_str.contains("A wrapped error")); assert!(err_str.contains("A suggestion")); assert!(err_str.contains("A note")); assert!(err_str.contains("Base Error")); }