pax_global_header00006660000000000000000000000064152053670530014520gustar00rootroot0000000000000052 comment=febae2cd614ed45baf128476319be01964f0281d django-commons-django-prometheus-febae2c/000077500000000000000000000000001520536705300207155ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/.github/000077500000000000000000000000001520536705300222555ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/.github/workflows/000077500000000000000000000000001520536705300243125ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/.github/workflows/ci.yml000066400000000000000000000044131520536705300254320ustar00rootroot00000000000000name: CI on: push: branches: - "*" pull_request: branches: - master concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true jobs: test: timeout-minutes: 30 strategy: fail-fast: false matrix: python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"] os: [ubuntu-24.04] runs-on: ${{ matrix.os }} name: "${{ matrix.os }} Python: ${{ matrix.python-version }}" services: redis: image: redis:8.0-alpine ports: - 6379:6379 memcached: image: memcached:1.6-alpine ports: - 11211:11211 mysql: image: mysql:9.3.0 env: MYSQL_ALLOW_EMPTY_PASSWORD: yes ports: - 3306:3306 postgresql: image: postgis/postgis:17-3.5-alpine env: POSTGRES_HOST_AUTH_METHOD: trust ports: - 5432:5432 steps: - name: Install OS Packages run: | sudo apt-get update sudo apt-get install binutils libproj-dev gdal-bin libmemcached-dev libsqlite3-mod-spatialite - uses: actions/checkout@v5 with: fetch-depth: 0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | pip install --upgrade "pip>=23.1.1" pip install --upgrade "tox-gh-actions==3.3.0" coverage - name: Log versions run: | python --version pip --version psql -V mysql -V - name: prep DB env: MYSQL_TCP_PORT: 3306 MYSQL_HOST: localhost PGHOST: localhost PGPORT: 5432 run: | psql --user postgres -c 'CREATE DATABASE postgis' psql --user postgres postgis -c 'CREATE EXTENSION IF NOT EXISTS postgis;' mysql --protocol=TCP --user=root -e 'create database django_prometheus_1;' - name: Run test and linters via Tox run: tox - name: Process code coverage run: | coverage combine .coverage django_prometheus/tests/end2end/.coverage coverage xml django-commons-django-prometheus-febae2c/.github/workflows/pre-release.yml000066400000000000000000000023261520536705300272440ustar00rootroot00000000000000name: Pre-Release on: push: branches: - "master" jobs: pre-release-django-prometheus-job: runs-on: ubuntu-latest name: pre-release django-prometheus if: github.repository_owner == 'django-commons' permissions: id-token: write steps: - uses: actions/checkout@v5 with: fetch-depth: 0 - name: Check if version is dev run: | if ! grep -q "dev" django_prometheus/__init__.py; then echo "Version does not contain 'dev', skipping pre-release" exit 1 else echo "Version contains 'dev', proceeding with pre-release" fi - name: Set up Python uses: actions/setup-python@v6 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install wheel setuptools packaging twine build --upgrade - name: Set version number run: python update_version_from_git.py - name: Build run: python -m build - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@v1.13.0 with: skip-existing: true verbose: true print-hash: true django-commons-django-prometheus-febae2c/.github/workflows/release.yml000066400000000000000000000035001520536705300264530ustar00rootroot00000000000000name: Release To PyPI on: push: tags: - v[0-9]+.[0-9]+.[0-9]+ jobs: org-check: name: Check GitHub Organization if: ${{ github.repository_owner == 'django-commons' }} runs-on: ubuntu-latest steps: - name: Noop run: "true" determine-tag: name: Determine the release tag to operate against. needs: org-check runs-on: ubuntu-latest outputs: release-tag: ${{ steps.determine-tag.outputs.release-tag }} release-version: ${{ steps.determine-tag.outputs.release-version }} steps: - name: Determine Tag id: determine-tag run: | RELEASE_TAG=${GITHUB_REF#refs/tags/} echo "Release tag: ${RELEASE_TAG}" if [[ "${RELEASE_TAG}" =~ ^v[0-9]+.[0-9]+.[0-9]+$ ]]; then echo "release-tag=${RELEASE_TAG}" >> $GITHUB_OUTPUT echo "release-version=${RELEASE_TAG#v}" >> $GITHUB_OUTPUT else echo "::error::Release tag '${RELEASE_TAG}' must match 'v\d+.\d+.\d+'." exit 1 fi release-django-prometheus-job: runs-on: ubuntu-latest name: Release Django-Promethues needs: determine-tag permissions: id-token: write steps: - uses: actions/checkout@v4 with: ref: ${{ needs.determine-tag.outputs.release-tag }} fetch-depth: 0 - name: Set up Python 3.9 uses: actions/setup-python@v5 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install wheel setuptools packaging twine build --upgrade - name: Build run: python -m build - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@v1.13.0 with: skip-existing: true verbose: true print-hash: true django-commons-django-prometheus-febae2c/.gitignore000066400000000000000000000021461520536705300227100ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env*/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover # Translations *.mo *.pot # Django stuff: *.log *.sqlite3 # Sphinx documentation docs/_build/ # PyBuilder target/ # VSCode .vscode/ ### Emacs ### # -*- mode: gitignore; -*- *~ \#*\# /.emacs.desktop /.emacs.desktop.lock *.elc auto-save-list tramp .\#* # Org-mode .org-id-locations *_archive # flymake-mode *_flymake.* # eshell files /eshell/history /eshell/lastdir # elpa packages /elpa/ # reftex files *.rel # AUCTeX auto folder /auto/ # cask packages .cask/ # venv venv/ ### Prometheus ### examples/prometheus/data django-commons-django-prometheus-febae2c/.pre-commit-config.yaml000066400000000000000000000016131520536705300251770ustar00rootroot00000000000000repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: check-case-conflict - id: check-merge-conflict - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/adamchainz/django-upgrade rev: '1.25.0' hooks: - id: django-upgrade args: [--target-version, '4.2'] - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.11.13 hooks: - id: ruff-check name: ruff check args: ['--fix'] - id: ruff-format name: ruff format - repo: https://github.com/asottile/pyupgrade rev: v3.20.0 hooks: - id: pyupgrade - repo: https://github.com/google/yamlfmt rev: v0.17.0 hooks: - id: yamlfmt - repo: https://github.com/abravalheri/validate-pyproject rev: v0.24.1 hooks: - id: validate-pyproject django-commons-django-prometheus-febae2c/CHANGELOG.md000066400000000000000000000043131520536705300225270ustar00rootroot00000000000000# Changelog ## v2.5.0 - May 26th, 2026 * Add support for Django 5.2 and 6.0. * Drop support for Django 5.0 (EOL). * Add support for Python 3.13, 3.14, and free threaded 3.14t. ## v2.4.1 - June 25th, 2025 * Add Django version to install requirements. ## v2.4.0 - June 18th, 2025 * Add support for Django 5.0 and Python 3.12. * Replace black, flake8 and isort with Ruff * Drop support for Django 3.2 (Python 3.7), 4.0 and 4.1 * Project moved to the [Django Commons](https://github.com/django-commons) GitHub organization. * Add pyupgrade and yamlfmt pre-commit hooks ## v2.3.1 - May 2nd, 2023 * Fix postgresql provider import, Thanks [@wilsonehusin](https://github.com/korfuri/django-prometheus/pull/402) ## v2.3.0 - May 2nd, 2023 * Remove support for Python 3.6, Django versions older than 3.2 * Fix two latency metrics not using PROMETHEUS_LATENCY_BUCKETS setting, Thanks [@AleksaC](https://github.com/korfuri/django-prometheus/pull/343) * Support new cache backend names in newer Django versions, Thanks [@tneuct](https://github.com/korfuri/django-prometheus/pull/329) * Make export of migrations False by default, Thanks [@kaypee90](https://github.com/korfuri/django-prometheus/pull/313) * Add support for Django 4.1, Python 3.11 * Add support for Django 4.2 and Psycopg 3 ## v2.2.0 - December 19, 2021 * Switch to Github Actions CI, remove travis-ci. * Add support for Django 3.2 & 4.0 and Python 3.9 & 3.10 ## v2.1.0 - August 22, 2020 * Remove support for older django and python versions * Add support for Django 3.0 and Django 3.1 * Add support for [PostGIS](https://github.com/korfuri/django-prometheus/pull/221), Thanks [@EverWinter23](https://github.com/EverWinter23) ## v2.0.0 - Jan 20, 2020 * Added support for newer Django and Python versions * Added an extensibility that applications to add their own labels to middleware (request/response) metrics * Allow overriding and setting custom bucket values for request/response latency histogram metric * Internal improvements: * use tox * Use pytest * use Black * Automate pre-releases on every commit to master * Fix flaky tests. ## v1.1.0 - Sep 28, 2019 * maintenance release that updates this library to support recent and supported version of python & Django django-commons-django-prometheus-febae2c/CODE_OF_CONDUCT.md000066400000000000000000000121471520536705300235210ustar00rootroot00000000000000 # Django Commons Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [django-commons-coc@googlegroups.com](mailto:django-commons-coc@googlegroups.com). All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Warning **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 2. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 3. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html [Mozilla CoC]: https://github.com/mozilla/diversity [FAQ]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations django-commons-django-prometheus-febae2c/CONTRIBUTING.md000066400000000000000000000035631520536705300231550ustar00rootroot00000000000000# Contributing ## Git Feel free to send pull requests, even for the tiniest things. Watch for Travis' opinion on them ([![Build Status](https://travis-ci.org/korfuri/django-prometheus.svg?branch=master)](https://travis-ci.org/korfuri/django-prometheus)). Travis will also make sure your code is pep8 compliant, and it's a good idea to run flake8 as well (on django_prometheus/ and on tests/). The code contains "unused" imports on purpose so flake8 isn't run automatically. ## Tests Please write unit tests for your change. There are two kinds of tests: * Regular unit tests that test the code directly, without loading Django. This is limited to pieces of the code that don't depend on Django, since a lot of the Django code will require a full Django environment (anything that interacts with models, for instance, needs a full database configuration). * End-to-end tests are Django unit tests in a test application. The test application doubles as an easy way to interactively test your changes. It uses most of the basic Django features and a few advanced features, so you can test things for yourself. ### Running all tests ```shell python setup.py test cd tests/end2end/ && PYTHONPATH=../.. ./manage.py test ``` The former runs the regular unit tests, the latter runs the Django unit test. To avoid setting PYTHONPATH every time, you can also run `python setup.py install`. ### Running the test Django app ```shell cd tests/end2end/ && PYTHONPATH=../.. ./manage.py runserver ``` By default, this will start serving on http://localhost:8000/. Metrics are available at `/metrics`. ## Running Prometheus See for instructions on installing Prometheus. Once you have Prometheus installed, you can use the example rules and dashboard in `examples/prometheus/`. See `examples/prometheus/README.md` to run Prometheus and view the example dashboard. django-commons-django-prometheus-febae2c/LICENSE000066400000000000000000000261351520536705300217310ustar00rootroot00000000000000 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. django-commons-django-prometheus-febae2c/MANIFEST.in000066400000000000000000000000421520536705300224470ustar00rootroot00000000000000include LICENSE include README.md django-commons-django-prometheus-febae2c/README.md000066400000000000000000000175471520536705300222120ustar00rootroot00000000000000# django-prometheus Export Django monitoring metrics for Prometheus.io [![Join the chat at https://gitter.im/django-prometheus/community](https://badges.gitter.im/django-prometheus/community.svg)](https://gitter.im/django-prometheus/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![PyPI version](https://badge.fury.io/py/django-prometheus.svg)](http://badge.fury.io/py/django-prometheus) [![Build Status](https://github.com/korfuri/django-prometheus/actions/workflows/ci.yml/badge.svg)](https://github.com/korfuri/django-prometheus/actions/workflows/ci.yml) [![Coverage Status](https://coveralls.io/repos/github/korfuri/django-prometheus/badge.svg?branch=master)](https://coveralls.io/github/korfuri/django-prometheus?branch=master) [![PyPi page link -- Python versions](https://img.shields.io/pypi/pyversions/django-prometheus.svg)](https://pypi.python.org/pypi/django-prometheus) ## Features This library provides Prometheus metrics for Django related operations: * Requests & Responses * Database access done via [Django ORM](https://docs.djangoproject.com/en/3.2/topics/db/) * Cache access done via [Django Cache framework](https://docs.djangoproject.com/en/3.2/topics/cache/) ## Usage ### Requirements * Django >= 4.2 * Python 3.9 and above. ### Installation Install with: ```shell pip install django-prometheus ``` Or, if you're using a development version cloned from this repository: ```shell python path-to-where-you-cloned-django-prometheus/setup.py install ``` This will install [prometheus_client](https://github.com/prometheus/client_python) as a dependency. ### Quickstart In your settings.py: ```python INSTALLED_APPS = [ ... 'django_prometheus', ... ] MIDDLEWARE = [ 'django_prometheus.middleware.PrometheusBeforeMiddleware', # All your other middlewares go here, including the default # middlewares like SessionMiddleware, CommonMiddleware, # CsrfViewmiddleware, SecurityMiddleware, etc. 'django_prometheus.middleware.PrometheusAfterMiddleware', ] ``` In your urls.py: ```python urlpatterns = [ ... path('', include('django_prometheus.urls')), ] ``` ### Configuration Prometheus uses Histogram based grouping for monitoring latencies. The default buckets are: ```python PROMETHEUS_LATENCY_BUCKETS = (0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, 25.0, 50.0, 75.0, float("inf"),) ``` You can define custom buckets for latency, adding more buckets decreases performance but increases accuracy: ```python PROMETHEUS_LATENCY_BUCKETS = (.1, .2, .5, .6, .8, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.5, 9.0, 12.0, 15.0, 20.0, 30.0, float("inf")) ``` --- You can have a custom namespace for your metrics: ```python PROMETHEUS_METRIC_NAMESPACE = "project" ``` This will prefix all metrics with `project_` word like this: ```text project_django_http_requests_total_by_method_total{method="GET"} 1.0 ``` ### Monitoring your databases SQLite, MySQL, and PostgreSQL databases can be monitored. Just replace the `ENGINE` property of your database, replacing `django.db.backends` with `django_prometheus.db.backends`. ```python DATABASES = { 'default': { 'ENGINE': 'django_prometheus.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, } ``` ### Monitoring your caches Filebased, memcached, redis caches can be monitored. Just replace the cache backend to use the one provided by django_prometheus `django.core.cache.backends` with `django_prometheus.cache.backends`. ```python CACHES = { 'default': { 'BACKEND': 'django_prometheus.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } } ``` ### Monitoring your models You may want to monitor the creation/deletion/update rate for your model. This can be done by adding a mixin to them. This is safe to do on existing models (it does not require a migration). If your model is: ```python class Dog(models.Model): name = models.CharField(max_length=100, unique=True) breed = models.CharField(max_length=100, blank=True, null=True) age = models.PositiveIntegerField(blank=True, null=True) ``` Just add the `ExportModelOperationsMixin` as such: ```python from django_prometheus.models import ExportModelOperationsMixin class Dog(ExportModelOperationsMixin('dog'), models.Model): name = models.CharField(max_length=100, unique=True) breed = models.CharField(max_length=100, blank=True, null=True) age = models.PositiveIntegerField(blank=True, null=True) ``` This will export 3 metrics, `django_model_inserts_total{model="dog"}`, `django_model_updates_total{model="dog"}` and `django_model_deletes_total{model="dog"}`. Note that the exported metrics are counters of creations, modifications and deletions done in the current process. They are not gauges of the number of objects in the model. Starting with Django 1.7, migrations are also monitored. Two gauges are exported, `django_migrations_applied_by_connection` and `django_migrations_unapplied_by_connection`. You may want to alert if there are unapplied migrations. If you want to disable the Django migration metrics, set the `PROMETHEUS_EXPORT_MIGRATIONS` setting to False. ### Monitoring and aggregating the metrics Prometheus is quite easy to set up. An example prometheus.conf to scrape `127.0.0.1:8001` can be found in `examples/prometheus`. Here's an example of a PromDash displaying some of the metrics collected by django-prometheus: ![Example dashboard](https://raw.githubusercontent.com/korfuri/django-prometheus/master/examples/django-promdash.png) ## Adding your own metrics You can add application-level metrics in your code by using [prometheus_client](https://github.com/prometheus/client_python) directly. The exporter is global and will pick up your metrics. To add metrics to the Django internals, the easiest way is to extend django-prometheus' classes. Please consider contributing your metrics, pull requests are welcome. Make sure to read the Prometheus best practices on [instrumentation](http://prometheus.io/docs/practices/instrumentation/) and [naming](http://prometheus.io/docs/practices/naming/). ## Importing Django Prometheus using only local settings If you wish to use Django Prometheus but are not able to change the code base, it's possible to have all the default metrics by modifying only the settings. First step is to inject prometheus' middlewares and to add django_prometheus in INSTALLED_APPS ```python MIDDLEWARE = \ ['django_prometheus.middleware.PrometheusBeforeMiddleware'] + \ MIDDLEWARE + \ ['django_prometheus.middleware.PrometheusAfterMiddleware'] INSTALLED_APPS += ['django_prometheus'] ``` Second step is to create the /metrics end point, for that we need another file (called urls_prometheus_wrapper.py in this example) that will wraps the apps URLs and add one on top: ```python from django.urls import include, path urlpatterns = [] urlpatterns.append(path('prometheus/', include('django_prometheus.urls'))) urlpatterns.append(path('', include('myapp.urls'))) ``` This file will add a "/prometheus/metrics" end point to the URLs of django that will export the metrics (replace myapp by your project name). Then we inject the wrapper in settings: ```python ROOT_URLCONF = "graphite.urls_prometheus_wrapper" ``` ## Adding custom labels to middleware (request/response) metrics You can add application specific labels to metrics reported by the django-prometheus middleware. This involves extending the classes defined in middleware.py. * Extend the Metrics class and override the `register_metric` method to add the application specific labels. * Extend middleware classes, set the metrics_cls class attribute to the the extended metric class and override the label_metric method to attach custom metrics. See implementation example in [the test app](django_prometheus/tests/end2end/testapp/test_middleware_custom_labels.py#L19-L46) django-commons-django-prometheus-febae2c/django_prometheus/000077500000000000000000000000001520536705300244325ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/__init__.py000066400000000000000000000010221520536705300265360ustar00rootroot00000000000000"""Django-Prometheus https://github.com/korfuri/django-prometheus """ # Import all files that define metrics. This has the effect that # `import django_prometheus` will always instantiate all metric # objects right away. from django_prometheus import middleware, models __all__ = ["middleware", "models", "pip_prometheus"] __version__ = "2.5.0" # Import pip_prometheus to export the pip metrics automatically. try: import pip_prometheus except ImportError: # If people don't have pip, don't export anything. pass django-commons-django-prometheus-febae2c/django_prometheus/apps.py000066400000000000000000000016531520536705300257540ustar00rootroot00000000000000from django.apps import AppConfig from django.conf import settings import django_prometheus from django_prometheus.exports import SetupPrometheusExportsFromConfig from django_prometheus.migrations import ExportMigrations class DjangoPrometheusConfig(AppConfig): name = django_prometheus.__name__ verbose_name = "Django-Prometheus" def ready(self): """Initializes the Prometheus exports if they are enabled in the config. Note that this is called even for other management commands than `runserver`. As such, it is possible to scrape the metrics of a running `manage.py test` or of another command, which shouldn't be done for real monitoring (since these jobs are usually short-lived), but can be useful for debugging. """ SetupPrometheusExportsFromConfig() if getattr(settings, "PROMETHEUS_EXPORT_MIGRATIONS", False): ExportMigrations() django-commons-django-prometheus-febae2c/django_prometheus/cache/000077500000000000000000000000001520536705300254755ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/cache/__init__.py000066400000000000000000000000001520536705300275740ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/cache/backends/000077500000000000000000000000001520536705300272475ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/cache/backends/__init__.py000066400000000000000000000000001520536705300313460ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/cache/backends/django_memcached_consul.py000066400000000000000000000013641520536705300344400ustar00rootroot00000000000000from django_memcached_consul import memcached from django_prometheus.cache.metrics import ( django_cache_get_total, django_cache_hits_total, django_cache_misses_total, ) class MemcachedCache(memcached.MemcachedCache): """Inherit django_memcached_consul to add metrics about hit/miss ratio""" def get(self, key, default=None, version=None): django_cache_get_total.labels(backend="django_memcached_consul").inc() cached = super().get(key, default=None, version=version) if cached is not None: django_cache_hits_total.labels(backend="django_memcached_consul").inc() else: django_cache_misses_total.labels(backend="django_memcached_consul").inc() return cached or default django-commons-django-prometheus-febae2c/django_prometheus/cache/backends/filebased.py000066400000000000000000000013051520536705300315360ustar00rootroot00000000000000from django.core.cache.backends import filebased from django_prometheus.cache.metrics import ( django_cache_get_total, django_cache_hits_total, django_cache_misses_total, ) class FileBasedCache(filebased.FileBasedCache): """Inherit filebased cache to add metrics about hit/miss ratio""" def get(self, key, default=None, version=None): django_cache_get_total.labels(backend="filebased").inc() cached = super().get(key, default=None, version=version) if cached is not None: django_cache_hits_total.labels(backend="filebased").inc() else: django_cache_misses_total.labels(backend="filebased").inc() return cached or default django-commons-django-prometheus-febae2c/django_prometheus/cache/backends/locmem.py000066400000000000000000000012601520536705300310740ustar00rootroot00000000000000from django.core.cache.backends import locmem from django_prometheus.cache.metrics import ( django_cache_get_total, django_cache_hits_total, django_cache_misses_total, ) class LocMemCache(locmem.LocMemCache): """Inherit filebased cache to add metrics about hit/miss ratio""" def get(self, key, default=None, version=None): django_cache_get_total.labels(backend="locmem").inc() cached = super().get(key, default=None, version=version) if cached is not None: django_cache_hits_total.labels(backend="locmem").inc() else: django_cache_misses_total.labels(backend="locmem").inc() return cached or default django-commons-django-prometheus-febae2c/django_prometheus/cache/backends/memcached.py000066400000000000000000000016221520536705300315300ustar00rootroot00000000000000from django.core.cache.backends import memcached from django_prometheus.cache.metrics import ( django_cache_get_total, django_cache_hits_total, django_cache_misses_total, ) class MemcachedPrometheusCacheMixin: def get(self, key, default=None, version=None): django_cache_get_total.labels(backend="memcached").inc() cached = super().get(key, default=None, version=version) if cached is not None: django_cache_hits_total.labels(backend="memcached").inc() return cached django_cache_misses_total.labels(backend="memcached").inc() return default class PyLibMCCache(MemcachedPrometheusCacheMixin, memcached.PyLibMCCache): """Inherit memcached to add metrics about hit/miss ratio""" class PyMemcacheCache(MemcachedPrometheusCacheMixin, memcached.PyMemcacheCache): """Inherit memcached to add metrics about hit/miss ratio""" django-commons-django-prometheus-febae2c/django_prometheus/cache/backends/redis.py000066400000000000000000000034111520536705300307260ustar00rootroot00000000000000from django.core.cache.backends.redis import RedisCache as DjangoRedisCache from django_redis import cache, exceptions from django_prometheus.cache.metrics import ( django_cache_get_fail_total, django_cache_get_total, django_cache_hits_total, django_cache_misses_total, ) class RedisCache(cache.RedisCache): """Inherit redis to add metrics about hit/miss/interruption ratio""" @cache.omit_exception def get(self, key, default=None, version=None, client=None): try: django_cache_get_total.labels(backend="redis").inc() cached = self.client.get(key, default=None, version=version, client=client) except exceptions.ConnectionInterrupted as e: django_cache_get_fail_total.labels(backend="redis").inc() if self._ignore_exceptions: if self._log_ignored_exceptions: self.logger.error(str(e)) return default raise else: if cached is not None: django_cache_hits_total.labels(backend="redis").inc() return cached django_cache_misses_total.labels(backend="redis").inc() return default class NativeRedisCache(DjangoRedisCache): def get(self, key, default=None, version=None): django_cache_get_total.labels(backend="native_redis").inc() try: result = super().get(key, default=None, version=version) except Exception: django_cache_get_fail_total.labels(backend="native_redis").inc() raise if result is not None: django_cache_hits_total.labels(backend="native_redis").inc() return result django_cache_misses_total.labels(backend="native_redis").inc() return default django-commons-django-prometheus-febae2c/django_prometheus/cache/metrics.py000066400000000000000000000012451520536705300275170ustar00rootroot00000000000000from prometheus_client import Counter from django_prometheus.conf import NAMESPACE django_cache_get_total = Counter( "django_cache_get_total", "Total get requests on cache", ["backend"], namespace=NAMESPACE, ) django_cache_hits_total = Counter( "django_cache_get_hits_total", "Total hits on cache", ["backend"], namespace=NAMESPACE, ) django_cache_misses_total = Counter( "django_cache_get_misses_total", "Total misses on cache", ["backend"], namespace=NAMESPACE, ) django_cache_get_fail_total = Counter( "django_cache_get_fail_total", "Total get request failures by cache", ["backend"], namespace=NAMESPACE, ) django-commons-django-prometheus-febae2c/django_prometheus/conf/000077500000000000000000000000001520536705300253575ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/conf/__init__.py000066400000000000000000000007231520536705300274720ustar00rootroot00000000000000from django.conf import settings NAMESPACE = "" PROMETHEUS_LATENCY_BUCKETS = ( 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5, 10.0, 25.0, 50.0, 75.0, float("inf"), ) if settings.configured: NAMESPACE = getattr(settings, "PROMETHEUS_METRIC_NAMESPACE", NAMESPACE) PROMETHEUS_LATENCY_BUCKETS = getattr(settings, "PROMETHEUS_LATENCY_BUCKETS", PROMETHEUS_LATENCY_BUCKETS) django-commons-django-prometheus-febae2c/django_prometheus/db/000077500000000000000000000000001520536705300250175ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/__init__.py000066400000000000000000000006231520536705300271310ustar00rootroot00000000000000# Import all metrics from django_prometheus.db.metrics import ( Counter, connection_errors_total, connections_total, errors_total, execute_many_total, execute_total, query_duration_seconds, ) __all__ = [ "Counter", "connection_errors_total", "connections_total", "errors_total", "execute_many_total", "execute_total", "query_duration_seconds", ] django-commons-django-prometheus-febae2c/django_prometheus/db/backends/000077500000000000000000000000001520536705300265715ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/README.md000066400000000000000000000027331520536705300300550ustar00rootroot00000000000000# Adding new database wrapper types Unfortunately, I don't have the resources to create wrappers for all database vendors. Doing so should be straightforward, but testing that it works and maintaining it is a lot of busywork, or is impossible for me for commercial databases. This document should be enough for people who wish to implement a new database wrapper. ## Structure A database engine in Django requires 3 classes (it really requires 2, but the 3rd one is required for our purposes): * A DatabaseFeatures class, which describes what features the database supports. For our usage, we can simply extend the existing DatabaseFeatures class without any changes. * A DatabaseWrapper class, which abstracts the interface to the database. * A CursorWrapper class, which abstracts the interface to a cursor. A cursor is the object that can execute SQL statements via an open connection. An easy example can be found in the sqlite3 module. Here are a few tips: * The `self.alias` and `self.vendor` properties are present in all DatabaseWrappers. * The CursorWrapper doesn't have access to the alias and vendor, so we generate the class in a function that accepts them as arguments. * Most methods you overload should just increment a counter, forward all arguments to the original method and return the result. `execute` and `execute_many` should also wrap the call to the parent method in a `try...except` block to increment the `errors_total` counter as appropriate. django-commons-django-prometheus-febae2c/django_prometheus/db/backends/__init__.py000066400000000000000000000000001520536705300306700ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/mysql/000077500000000000000000000000001520536705300277365ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/mysql/__init__.py000066400000000000000000000000001520536705300320350ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/mysql/base.py000066400000000000000000000010631520536705300312220ustar00rootroot00000000000000from django.db.backends.mysql import base from django_prometheus.db.common import DatabaseWrapperMixin, ExportingCursorWrapper class DatabaseFeatures(base.DatabaseFeatures): """Our database has the exact same features as the base one.""" class DatabaseWrapper(DatabaseWrapperMixin, base.DatabaseWrapper): CURSOR_CLASS = base.CursorWrapper def create_cursor(self, name=None): cursor = self.connection.cursor() CursorWrapper = ExportingCursorWrapper(self.CURSOR_CLASS, self.alias, self.vendor) return CursorWrapper(cursor) django-commons-django-prometheus-febae2c/django_prometheus/db/backends/postgis/000077500000000000000000000000001520536705300302615ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/postgis/__init__.py000066400000000000000000000000001520536705300323600ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/postgis/base.py000066400000000000000000000014301520536705300315430ustar00rootroot00000000000000from django.contrib.gis.db.backends.postgis import base from django_prometheus.db.common import DatabaseWrapperMixin, ExportingCursorWrapper class DatabaseWrapper(DatabaseWrapperMixin, base.DatabaseWrapper): def get_connection_params(self): conn_params = super().get_connection_params() conn_params["cursor_factory"] = ExportingCursorWrapper(conn_params["cursor_factory"], self.alias, self.vendor) return conn_params def create_cursor(self, name=None): # cursor_factory is set in get_connection_params() so psycopg already # creates instrumented cursors. Delegate to Django's implementation to # avoid the mixin's create_cursor which is incompatible with psycopg3. return base.DatabaseWrapper.create_cursor(self, name=name) django-commons-django-prometheus-febae2c/django_prometheus/db/backends/postgresql/000077500000000000000000000000001520536705300307745ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/postgresql/__init__.py000066400000000000000000000000001520536705300330730ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/postgresql/base.py000066400000000000000000000014171520536705300322630ustar00rootroot00000000000000from django.db.backends.postgresql import base from django_prometheus.db.common import DatabaseWrapperMixin, ExportingCursorWrapper class DatabaseWrapper(DatabaseWrapperMixin, base.DatabaseWrapper): def get_connection_params(self): conn_params = super().get_connection_params() conn_params["cursor_factory"] = ExportingCursorWrapper(conn_params["cursor_factory"], self.alias, self.vendor) return conn_params def create_cursor(self, name=None): # cursor_factory is set in get_connection_params() so psycopg already # creates instrumented cursors. Delegate to Django's implementation to # avoid the mixin's create_cursor which is incompatible with psycopg3. return base.DatabaseWrapper.create_cursor(self, name=name) django-commons-django-prometheus-febae2c/django_prometheus/db/backends/spatialite/000077500000000000000000000000001520536705300307305ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/spatialite/__init__.py000066400000000000000000000000001520536705300330270ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/spatialite/base.py000066400000000000000000000006571520536705300322240ustar00rootroot00000000000000from django.contrib.gis.db.backends.spatialite import base, features from django.db.backends.sqlite3 import base as sqlite_base from django_prometheus.db.common import DatabaseWrapperMixin class DatabaseFeatures(features.DatabaseFeatures): """Our database has the exact same features as the base one.""" class DatabaseWrapper(DatabaseWrapperMixin, base.DatabaseWrapper): CURSOR_CLASS = sqlite_base.SQLiteCursorWrapper django-commons-django-prometheus-febae2c/django_prometheus/db/backends/sqlite3/000077500000000000000000000000001520536705300301555ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/sqlite3/__init__.py000066400000000000000000000000001520536705300322540ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/db/backends/sqlite3/base.py000066400000000000000000000005201520536705300314360ustar00rootroot00000000000000from django.db.backends.sqlite3 import base from django_prometheus.db.common import DatabaseWrapperMixin class DatabaseFeatures(base.DatabaseFeatures): """Our database has the exact same features as the base one.""" class DatabaseWrapper(DatabaseWrapperMixin, base.DatabaseWrapper): CURSOR_CLASS = base.SQLiteCursorWrapper django-commons-django-prometheus-febae2c/django_prometheus/db/common.py000066400000000000000000000053161520536705300266660ustar00rootroot00000000000000from django_prometheus.db import ( connection_errors_total, connections_total, errors_total, execute_many_total, execute_total, query_duration_seconds, ) class ExceptionCounterByType: """A context manager that counts exceptions by type. Exceptions increment the provided counter, whose last label's name must match the `type_label` argument. In other words: c = Counter('http_request_exceptions_total', 'Counter of exceptions', ['method', 'type']) with ExceptionCounterByType(c, extra_labels={'method': 'GET'}): handle_get_request() """ def __init__(self, counter, type_label="type", extra_labels=None): self._counter = counter self._type_label = type_label self._labels = dict(extra_labels) # Copy labels since we modify them. def __enter__(self): pass def __exit__(self, typ, value, traceback): if typ is not None: self._labels.update({self._type_label: typ.__name__}) self._counter.labels(**self._labels).inc() class DatabaseWrapperMixin: """Extends the DatabaseWrapper to count connections and cursors.""" def get_new_connection(self, *args, **kwargs): connections_total.labels(self.alias, self.vendor).inc() try: return super().get_new_connection(*args, **kwargs) except Exception: connection_errors_total.labels(self.alias, self.vendor).inc() raise def create_cursor(self, name=None): return self.connection.cursor(factory=ExportingCursorWrapper(self.CURSOR_CLASS, self.alias, self.vendor)) def ExportingCursorWrapper(cursor_class, alias, vendor): """Returns a CursorWrapper class that knows its database's alias and vendor name. """ labels = {"alias": alias, "vendor": vendor} class CursorWrapper(cursor_class): """Extends the base CursorWrapper to count events.""" def execute(self, *args, **kwargs): execute_total.labels(alias, vendor).inc() with ( query_duration_seconds.labels(**labels).time(), ExceptionCounterByType(errors_total, extra_labels=labels), ): return super().execute(*args, **kwargs) def executemany(self, query, param_list, *args, **kwargs): execute_total.labels(alias, vendor).inc(len(param_list)) execute_many_total.labels(alias, vendor).inc(len(param_list)) with ( query_duration_seconds.labels(**labels).time(), ExceptionCounterByType(errors_total, extra_labels=labels), ): return super().executemany(query, param_list, *args, **kwargs) return CursorWrapper django-commons-django-prometheus-febae2c/django_prometheus/db/metrics.py000066400000000000000000000024731520536705300270450ustar00rootroot00000000000000from prometheus_client import Counter, Histogram from django_prometheus.conf import NAMESPACE, PROMETHEUS_LATENCY_BUCKETS connections_total = Counter( "django_db_new_connections_total", "Counter of created connections by database and by vendor.", ["alias", "vendor"], namespace=NAMESPACE, ) connection_errors_total = Counter( "django_db_new_connection_errors_total", "Counter of connection failures by database and by vendor.", ["alias", "vendor"], namespace=NAMESPACE, ) execute_total = Counter( "django_db_execute_total", ("Counter of executed statements by database and by vendor, including bulk executions."), ["alias", "vendor"], namespace=NAMESPACE, ) execute_many_total = Counter( "django_db_execute_many_total", ("Counter of executed statements in bulk operations by database and by vendor."), ["alias", "vendor"], namespace=NAMESPACE, ) errors_total = Counter( "django_db_errors_total", ("Counter of execution errors by database, vendor and exception type."), ["alias", "vendor", "type"], namespace=NAMESPACE, ) query_duration_seconds = Histogram( "django_db_query_duration_seconds", ("Histogram of query duration by database and vendor."), ["alias", "vendor"], buckets=PROMETHEUS_LATENCY_BUCKETS, namespace=NAMESPACE, ) django-commons-django-prometheus-febae2c/django_prometheus/exports.py000066400000000000000000000112471520536705300265150ustar00rootroot00000000000000import logging import os import threading import prometheus_client from django.conf import settings from django.http import HttpResponse from prometheus_client import multiprocess try: # Python 2 from BaseHTTPServer import HTTPServer except ImportError: # Python 3 from http.server import HTTPServer logger = logging.getLogger(__name__) def SetupPrometheusEndpointOnPort(port, addr=""): """Exports Prometheus metrics on an HTTPServer running in its own thread. The server runs on the given port and is by default listening on all interfaces. This HTTPServer is fully independent of Django and its stack. This offers the advantage that even if Django becomes unable to respond, the HTTPServer will continue to function and export metrics. However, this also means that the features offered by Django (like middlewares or WSGI) can't be used. Now here's the really weird part. When Django runs with the auto-reloader enabled (which is the default, you can disable it with `manage.py runserver --noreload`), it forks and executes manage.py twice. That's wasteful but usually OK. It starts being a problem when you try to open a port, like we do. We can detect that we're running under an autoreloader through the presence of the RUN_MAIN environment variable, so we abort if we're trying to export under an autoreloader and trying to open a port. """ assert os.environ.get("RUN_MAIN") != "true", ( "The thread-based exporter can't be safely used when django's " "autoreloader is active. Use the URL exporter, or start django " "with --noreload. See documentation/exports.md." ) prometheus_client.start_http_server(port, addr=addr) class PrometheusEndpointServer(threading.Thread): """A thread class that holds an http and makes it serve_forever().""" def __init__(self, httpd, *args, **kwargs): self.httpd = httpd super().__init__(*args, **kwargs) def run(self): self.httpd.serve_forever() def SetupPrometheusEndpointOnPortRange(port_range, addr=""): """Like SetupPrometheusEndpointOnPort, but tries several ports. This is useful when you're running Django as a WSGI application with multiple processes and you want Prometheus to discover all workers. Each worker will grab a port and you can use Prometheus to aggregate across workers. port_range may be any iterable object that contains a list of ports. Typically this would be a `range` of contiguous ports. As soon as one port is found that can serve, use this one and stop trying. Returns the port chosen (an `int`), or `None` if no port in the supplied range was available. The same caveats regarding autoreload apply. Do not use this when Django's autoreloader is active. """ assert os.environ.get("RUN_MAIN") != "true", ( "The thread-based exporter can't be safely used when django's " "autoreloader is active. Use the URL exporter, or start django " "with --noreload. See documentation/exports.md." ) for port in port_range: try: httpd = HTTPServer((addr, port), prometheus_client.MetricsHandler) except OSError: # Python 2 raises socket.error, in Python 3 socket.error is an # alias for OSError continue # Try next port thread = PrometheusEndpointServer(httpd) thread.daemon = True thread.start() logger.info(f"Exporting Prometheus /metrics/ on port {port}") return port # Stop trying ports at this point logger.warning("Cannot export Prometheus /metrics/ - no available ports in supplied range") return None def SetupPrometheusExportsFromConfig(): """Exports metrics so Prometheus can collect them.""" port = getattr(settings, "PROMETHEUS_METRICS_EXPORT_PORT", None) port_range = getattr(settings, "PROMETHEUS_METRICS_EXPORT_PORT_RANGE", None) addr = getattr(settings, "PROMETHEUS_METRICS_EXPORT_ADDRESS", "") if port_range: SetupPrometheusEndpointOnPortRange(port_range, addr) elif port: SetupPrometheusEndpointOnPort(port, addr) def ExportToDjangoView(request): """Exports /metrics as a Django view. You can use django_prometheus.urls to map /metrics to this view. """ if "PROMETHEUS_MULTIPROC_DIR" in os.environ or "prometheus_multiproc_dir" in os.environ: registry = prometheus_client.CollectorRegistry() multiprocess.MultiProcessCollector(registry) else: registry = prometheus_client.REGISTRY metrics_page = prometheus_client.generate_latest(registry) return HttpResponse(metrics_page, content_type=prometheus_client.CONTENT_TYPE_LATEST) django-commons-django-prometheus-febae2c/django_prometheus/middleware.py000066400000000000000000000273131520536705300271270ustar00rootroot00000000000000from django.utils.deprecation import MiddlewareMixin from prometheus_client import Counter, Histogram from django_prometheus.conf import NAMESPACE, PROMETHEUS_LATENCY_BUCKETS from django_prometheus.utils import PowersOf, Time, TimeSince class Metrics: _instance = None @classmethod def get_instance(cls): if not cls._instance: cls._instance = cls() return cls._instance def register_metric(self, metric_cls, name, documentation, labelnames=(), **kwargs): return metric_cls(name, documentation, labelnames=labelnames, **kwargs) def __init__(self, *args, **kwargs): self.register() def register(self): self.requests_total = self.register_metric( Counter, "django_http_requests_before_middlewares_total", "Total count of requests before middlewares run.", namespace=NAMESPACE, ) self.responses_total = self.register_metric( Counter, "django_http_responses_before_middlewares_total", "Total count of responses before middlewares run.", namespace=NAMESPACE, ) self.requests_latency_before = self.register_metric( Histogram, "django_http_requests_latency_including_middlewares_seconds", ("Histogram of requests processing time (including middleware processing time)."), buckets=PROMETHEUS_LATENCY_BUCKETS, namespace=NAMESPACE, ) self.requests_unknown_latency_before = self.register_metric( Counter, "django_http_requests_unknown_latency_including_middlewares_total", ( "Count of requests for which the latency was unknown (when computing " "django_http_requests_latency_including_middlewares_seconds)." ), namespace=NAMESPACE, ) self.requests_latency_by_view_method = self.register_metric( Histogram, "django_http_requests_latency_seconds_by_view_method", "Histogram of request processing time labelled by view.", ["view", "method"], buckets=PROMETHEUS_LATENCY_BUCKETS, namespace=NAMESPACE, ) self.requests_unknown_latency = self.register_metric( Counter, "django_http_requests_unknown_latency_total", "Count of requests for which the latency was unknown.", namespace=NAMESPACE, ) # Set in process_request self.requests_ajax = self.register_metric( Counter, "django_http_ajax_requests_total", "Count of AJAX requests.", namespace=NAMESPACE, ) self.requests_by_method = self.register_metric( Counter, "django_http_requests_total_by_method", "Count of requests by method.", ["method"], namespace=NAMESPACE, ) self.requests_by_transport = self.register_metric( Counter, "django_http_requests_total_by_transport", "Count of requests by transport.", ["transport"], namespace=NAMESPACE, ) # Set in process_view self.requests_by_view_transport_method = self.register_metric( Counter, "django_http_requests_total_by_view_transport_method", "Count of requests by view, transport, method.", ["view", "transport", "method"], namespace=NAMESPACE, ) self.requests_body_bytes = self.register_metric( Histogram, "django_http_requests_body_total_bytes", "Histogram of requests by body size.", buckets=PowersOf(2, 30), namespace=NAMESPACE, ) # Set in process_template_response self.responses_by_templatename = self.register_metric( Counter, "django_http_responses_total_by_templatename", "Count of responses by template name.", ["templatename"], namespace=NAMESPACE, ) # Set in process_response self.responses_by_status = self.register_metric( Counter, "django_http_responses_total_by_status", "Count of responses by status.", ["status"], namespace=NAMESPACE, ) self.responses_by_status_view_method = self.register_metric( Counter, "django_http_responses_total_by_status_view_method", "Count of responses by status, view, method.", ["status", "view", "method"], namespace=NAMESPACE, ) self.responses_body_bytes = self.register_metric( Histogram, "django_http_responses_body_total_bytes", "Histogram of responses by body size.", buckets=PowersOf(2, 30), namespace=NAMESPACE, ) self.responses_by_charset = self.register_metric( Counter, "django_http_responses_total_by_charset", "Count of responses by charset.", ["charset"], namespace=NAMESPACE, ) self.responses_streaming = self.register_metric( Counter, "django_http_responses_streaming_total", "Count of streaming responses.", namespace=NAMESPACE, ) # Set in process_exception self.exceptions_by_type = self.register_metric( Counter, "django_http_exceptions_total_by_type", "Count of exceptions by object type.", ["type"], namespace=NAMESPACE, ) self.exceptions_by_view = self.register_metric( Counter, "django_http_exceptions_total_by_view", "Count of exceptions by view.", ["view"], namespace=NAMESPACE, ) class PrometheusBeforeMiddleware(MiddlewareMixin): """Monitoring middleware that should run before other middlewares.""" metrics_cls = Metrics def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.metrics = self.metrics_cls.get_instance() def process_request(self, request): self.metrics.requests_total.inc() request.prometheus_before_middleware_event = Time() def process_response(self, request, response): self.metrics.responses_total.inc() if hasattr(request, "prometheus_before_middleware_event"): self.metrics.requests_latency_before.observe(TimeSince(request.prometheus_before_middleware_event)) else: self.metrics.requests_unknown_latency_before.inc() return response class PrometheusAfterMiddleware(MiddlewareMixin): """Monitoring middleware that should run after other middlewares.""" metrics_cls = Metrics def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.metrics = self.metrics_cls.get_instance() def _transport(self, request): return "https" if request.is_secure() else "http" def _method(self, request): m = request.method if m not in ( "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "OPTIONS", "CONNECT", "PATCH", ): return "" return m def label_metric(self, metric, request, response=None, **labels): return metric.labels(**labels) if labels else metric def process_request(self, request): transport = self._transport(request) method = self._method(request) self.label_metric(self.metrics.requests_by_method, request, method=method).inc() self.label_metric(self.metrics.requests_by_transport, request, transport=transport).inc() # Mimic the behaviour of the deprecated "Request.is_ajax()" method. if request.headers.get("x-requested-with") == "XMLHttpRequest": self.label_metric(self.metrics.requests_ajax, request).inc() content_length = int(request.headers.get("content-length") or 0) self.label_metric(self.metrics.requests_body_bytes, request).observe(content_length) request.prometheus_after_middleware_event = Time() def _get_view_name(self, request): view_name = "" if hasattr(request, "resolver_match"): if request.resolver_match is not None: if request.resolver_match.view_name is not None: view_name = request.resolver_match.view_name return view_name def process_view(self, request, view_func, *view_args, **view_kwargs): transport = self._transport(request) method = self._method(request) if hasattr(request, "resolver_match"): name = request.resolver_match.view_name or "" self.label_metric( self.metrics.requests_by_view_transport_method, request, view=name, transport=transport, method=method, ).inc() def process_template_response(self, request, response): if hasattr(response, "template_name"): self.label_metric( self.metrics.responses_by_templatename, request, response=response, templatename=str(response.template_name), ).inc() return response def process_response(self, request, response): method = self._method(request) name = self._get_view_name(request) status = str(response.status_code) self.label_metric(self.metrics.responses_by_status, request, response, status=status).inc() self.label_metric( self.metrics.responses_by_status_view_method, request, response, status=status, view=name, method=method, ).inc() if hasattr(response, "charset"): self.label_metric( self.metrics.responses_by_charset, request, response, charset=str(response.charset), ).inc() if hasattr(response, "streaming") and response.streaming: self.label_metric(self.metrics.responses_streaming, request, response).inc() if hasattr(response, "content"): self.label_metric(self.metrics.responses_body_bytes, request, response).observe(len(response.content)) if hasattr(request, "prometheus_after_middleware_event"): self.label_metric( self.metrics.requests_latency_by_view_method, request, response, view=self._get_view_name(request), method=request.method, ).observe(TimeSince(request.prometheus_after_middleware_event)) else: self.label_metric(self.metrics.requests_unknown_latency, request, response).inc() return response def process_exception(self, request, exception): self.label_metric(self.metrics.exceptions_by_type, request, type=type(exception).__name__).inc() if hasattr(request, "resolver_match"): name = request.resolver_match.view_name or "" self.label_metric(self.metrics.exceptions_by_view, request, view=name).inc() if hasattr(request, "prometheus_after_middleware_event"): self.label_metric( self.metrics.requests_latency_by_view_method, request, view=self._get_view_name(request), method=request.method, ).observe(TimeSince(request.prometheus_after_middleware_event)) else: self.label_metric(self.metrics.requests_unknown_latency, request).inc() django-commons-django-prometheus-febae2c/django_prometheus/migrations.py000066400000000000000000000035501520536705300271630ustar00rootroot00000000000000from django.db import connections from django.db.backends.dummy.base import DatabaseWrapper from prometheus_client import Gauge from django_prometheus.conf import NAMESPACE unapplied_migrations = Gauge( "django_migrations_unapplied_total", "Count of unapplied migrations by database connection", ["connection"], namespace=NAMESPACE, ) applied_migrations = Gauge( "django_migrations_applied_total", "Count of applied migrations by database connection", ["connection"], namespace=NAMESPACE, ) def ExportMigrationsForDatabase(alias, executor): plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) unapplied_migrations.labels(alias).set(len(plan)) applied_migrations.labels(alias).set(len(executor.loader.applied_migrations)) def ExportMigrations(): """Exports counts of unapplied migrations. This is meant to be called during app startup, ideally by django_prometheus.apps.AppConfig. """ # Import MigrationExecutor lazily. MigrationExecutor checks at # import time that the apps are ready, and they are not when # django_prometheus is imported. ExportMigrations() should be # called in AppConfig.ready(), which signals that all apps are # ready. from django.db.migrations.executor import MigrationExecutor if "default" in connections and (isinstance(connections["default"], DatabaseWrapper)): # This is the case where DATABASES = {} in the configuration, # i.e. the user is not using any databases. Django "helpfully" # adds a dummy database and then throws when you try to # actually use it. So we don't do anything, because trying to # export stats would crash the app on startup. return for alias in connections.databases: executor = MigrationExecutor(connections[alias]) ExportMigrationsForDatabase(alias, executor) django-commons-django-prometheus-febae2c/django_prometheus/models.py000066400000000000000000000030151520536705300262660ustar00rootroot00000000000000from prometheus_client import Counter from django_prometheus.conf import NAMESPACE model_inserts = Counter( "django_model_inserts_total", "Number of insert operations by model.", ["model"], namespace=NAMESPACE, ) model_updates = Counter( "django_model_updates_total", "Number of update operations by model.", ["model"], namespace=NAMESPACE, ) model_deletes = Counter( "django_model_deletes_total", "Number of delete operations by model.", ["model"], namespace=NAMESPACE, ) def ExportModelOperationsMixin(model_name): """Returns a mixin for models to export counters for lifecycle operations. Usage: class User(ExportModelOperationsMixin('user'), Model): ... """ # Force create the labels for this model in the counters. This # is not necessary but it avoids gaps in the aggregated data. model_inserts.labels(model_name) model_updates.labels(model_name) model_deletes.labels(model_name) class Mixin: def _do_insert(self, *args, **kwargs): model_inserts.labels(model_name).inc() return super()._do_insert(*args, **kwargs) def _do_update(self, *args, **kwargs): model_updates.labels(model_name).inc() return super()._do_update(*args, **kwargs) def delete(self, *args, **kwargs): model_deletes.labels(model_name).inc() return super().delete(*args, **kwargs) Mixin.__qualname__ = f"ExportModelOperationsMixin('{model_name}')" return Mixin django-commons-django-prometheus-febae2c/django_prometheus/tests/000077500000000000000000000000001520536705300255745ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/__init__.py000066400000000000000000000000001520536705300276730ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/000077500000000000000000000000001520536705300271135ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/manage.py000077500000000000000000000003721520536705300307220ustar00rootroot00000000000000#!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testapp.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/000077500000000000000000000000001520536705300305735ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/__init__.py000066400000000000000000000000001520536705300326720ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/helpers.py000066400000000000000000000011011520536705300326000ustar00rootroot00000000000000DJANGO_MIDDLEWARES = [ "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "django.middleware.security.SecurityMiddleware", ] def get_middleware(before, after): middleware = [before] middleware.extend(DJANGO_MIDDLEWARES) middleware.append(after) return middleware django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/models.py000066400000000000000000000007031520536705300324300ustar00rootroot00000000000000from django.db.models import CharField, Model, PositiveIntegerField from django_prometheus.models import ExportModelOperationsMixin class Dog(ExportModelOperationsMixin("dog"), Model): name = CharField(max_length=100, unique=True) breed = CharField(max_length=100, blank=True, null=True) age = PositiveIntegerField(blank=True, null=True) class Lawn(ExportModelOperationsMixin("lawn"), Model): location = CharField(max_length=100) django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/settings.py000066400000000000000000000110551520536705300330070ustar00rootroot00000000000000import os import tempfile from testapp.helpers import get_middleware # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = ")0-t%mc5y1^fn8e7i**^^v166@5iu(&-2%9#kxud0&4ap#k!_k" DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = ( "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "django_prometheus", "testapp", ) MIDDLEWARE = get_middleware( "django_prometheus.middleware.PrometheusBeforeMiddleware", "django_prometheus.middleware.PrometheusAfterMiddleware", ) ROOT_URLCONF = "testapp.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] WSGI_APPLICATION = "testapp.wsgi.application" DATABASES = { "default": { "ENGINE": "django_prometheus.db.backends.sqlite3", "NAME": "db.sqlite3", }, # Comment this to not test django_prometheus.db.backends.postgres. "postgresql": { "ENGINE": "django_prometheus.db.backends.postgresql", "NAME": "postgres", "USER": "postgres", "PASSWORD": "", "HOST": "localhost", "PORT": "5432", }, # Comment this to not test django_prometheus.db.backends.postgis. "postgis": { "ENGINE": "django_prometheus.db.backends.postgis", "NAME": "postgis", "USER": "postgres", "PASSWORD": "", "HOST": "localhost", "PORT": "5432", }, # Comment this to not test django_prometheus.db.backends.mysql. "mysql": { "ENGINE": "django_prometheus.db.backends.mysql", "NAME": "django_prometheus_1", "USER": "root", "PASSWORD": "", "HOST": "127.0.0.1", "PORT": "3306", }, "spatialite": { "ENGINE": "django_prometheus.db.backends.spatialite", "NAME": "db_spatialite.sqlite3", }, # The following databases are used by test_db.py only "test_db_1": { "ENGINE": "django_prometheus.db.backends.sqlite3", "NAME": "test_db_1.sqlite3", }, "test_db_2": { "ENGINE": "django_prometheus.db.backends.sqlite3", "NAME": "test_db_2.sqlite3", }, } # Caches _tmp_cache_dir = tempfile.mkdtemp() CACHES = { "default": { "BACKEND": "django_prometheus.cache.backends.memcached.PyLibMCCache", "LOCATION": "localhost:11211", }, "memcached.PyLibMCCache": { "BACKEND": "django_prometheus.cache.backends.memcached.PyLibMCCache", "LOCATION": "localhost:11211", }, "memcached.PyMemcacheCache": { "BACKEND": "django_prometheus.cache.backends.memcached.PyMemcacheCache", "LOCATION": "localhost:11211", }, "filebased": { "BACKEND": "django_prometheus.cache.backends.filebased.FileBasedCache", "LOCATION": os.path.join(_tmp_cache_dir, "django_cache"), }, "locmem": { "BACKEND": "django_prometheus.cache.backends.locmem.LocMemCache", "LOCATION": os.path.join(_tmp_cache_dir, "locmem_cache"), }, "native_redis": { "BACKEND": "django_prometheus.cache.backends.redis.NativeRedisCache", "LOCATION": "redis://127.0.0.1:6379/0", }, "redis": { "BACKEND": "django_prometheus.cache.backends.redis.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", }, # Fake redis config emulated stopped service "stopped_redis": { "BACKEND": "django_prometheus.cache.backends.redis.RedisCache", "LOCATION": "redis://127.0.0.1:6666/1", }, "stopped_redis_ignore_exception": { "BACKEND": "django_prometheus.cache.backends.redis.RedisCache", "LOCATION": "redis://127.0.0.1:6666/1", "OPTIONS": {"IGNORE_EXCEPTIONS": True}, }, } # Internationalization LANGUAGE_CODE = "en-us" TIME_ZONE = "UTC" USE_I18N = True USE_TZ = False # Static files (CSS, JavaScript, Images) STATIC_URL = "/static/" LOGGING = { "version": 1, "disable_existing_loggers": False, "handlers": {"console": {"class": "logging.StreamHandler"}}, "root": {"handlers": ["console"], "level": "INFO"}, "loggers": {"django": {"handlers": ["console"], "level": "INFO"}}, } django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/templates/000077500000000000000000000000001520536705300325715ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/templates/help.html000066400000000000000000000041261520536705300344120ustar00rootroot00000000000000

Can't Help Falling in Love

Remembering Helps Me to Forget

Helplessly, Hopelessly

Love Helps Those

I Need a Little Help

For a while We Helped Each Other Out

Give Me a Helping Hand

I Can't Help You, I'm Falling Too

How Can I Help You Say Goodbye?

Time Hasn't Helped

Jukebox, Help Me Find My Baby

I Just Can't Help Myself

Help Me, Girl

I Can't Help it

Help Somebody

Help, Help

I Can't Help How I Feel

No Help From Me

I Can Help

Somebody Help Me

Please Help Me I'm Falling in Love With You

Help Yourself

Outside Help

Helping Hand

Help Me, Rhonda

Can't Help Feeling So Blue

We All Agreed to Help

Help Pour Out the Rain (Lacey's Song)

Sleep Won't Help Me

I Can't Help Myself (Sugarpie, Honeybunch)

Cry for Help

She's Helping Me Get Over You

Mama Help Me

Help Yourself to Me

Can't Help But Wonder

Heaven Help the Working Girl

Help Me Pick Up the Pieces

Crying Won't Help Now

I Couldn't Help Myself

So Help Me, Girl

Heaven Help the Fool

Help Wanted

Help Me Get Over You

Helpless

Help

Can't Help it

Can't Help Calling Your Name

If She Just Helps Me Get Over You

Helpless Heart

No Help Wanted

It Didn't Help Much

Help Me Make it Through the Night

Help Me Understand

I Just Can't Help Believing

Can't Help Thinking About Me

How Could I Help But Love You?

Heaven Help My Heart

I Can't Help Remembering You

Help Me Hold on

Helping Me Get Over You

I Can't Help it if I'm Still in Love with You

Girl Can't Help it, The

I Can't Help it, I'm Falling in Love

With a Little Help from My Friends

Heaven Help the Child

Help Me

Can't Help But Love You

Help is on the Way

I Got Some Help I Don't Need

Heaven Help Us All

Heaven Help Me

Helplessly Hoping

index.html000066400000000000000000000000231520536705300345020ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/templatesThis is the index. django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/templates/lawn.html000066400000000000000000000001051520536705300344140ustar00rootroot00000000000000

Aaah, {{ lawn.location }}, the best place on Earth, probably.

django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/templates/slow.html000066400000000000000000000042521520536705300344460ustar00rootroot00000000000000
                                  _.---"'"""""'`--.._
                             _,.-'                   `-._
                         _,."                            -.
                     .-""   ___...---------.._             `.
                     `---'""                  `-.            `.
                                                 `.            \
                                                   `.           \
                                                     \           \
                                                      .           \
                                                      |            .
                                                      |            |
                                _________             |            |
                          _,.-'"         `"'-.._      :            |
                      _,-'                      `-._.'             |
                   _.'                              `.             '
        _.-.    _,+......__                           `.          .
      .'    `-"'           `"-.,-""--._                 \        /
     /    ,'                  |    __  \                 \      /
    `   ..                       +"  )  \                 \    /
     `.'  \          ,-"`-..    |       |                  \  /
      / " |        .'       \   '.    _.'                   .'
     |,.."--"""--..|    "    |    `""`.                     |
   ,"               `-._     |        |                     |
 .'                     `-._+         |                     |
/                           `.                        /     |
|    `     '                  |                      /      |
`-.....--.__                  |              |      /       |
   `./ "| / `-.........--.-   '              |    ,'        '
     /| ||        `.'  ,'   .'               |_,-+         /
    / ' '.`.        _,'   ,'     `.          |   '   _,.. /
   /   `.  `"'"'""'"   _,^--------"`.        |    `.'_  _/
  /... _.`:.________,.'              `._,.-..|        "'
 `.__.'                                 `._  /
                                           "' mh
Art by Maija Haavisto django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/templates/sql.html000066400000000000000000000012441520536705300342570ustar00rootroot00000000000000

Execute some SQL here, for fun and profit!

Note that this is a very bad vulnerability: it gives anyone direct access to your whole database. This only exists to test that django_prometheus is working.

{% if query %}

Your query was:

{{ query }}

Your results were:

{{ rows }}

{% endif %} django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/test_caches.py000066400000000000000000000066231520536705300334410ustar00rootroot00000000000000import pytest from django.core.cache import caches from redis import RedisError from django_prometheus.testutils import assert_metric_equal, get_metric _SUPPORTED_CACHES = [ "memcached.PyLibMCCache", "memcached.PyMemcacheCache", "filebased", "locmem", "native_redis", "redis", ] class TestCachesMetrics: """Test django_prometheus.caches metrics.""" @pytest.mark.parametrize("supported_cache", _SUPPORTED_CACHES) def test_counters(self, supported_cache): # Note: those tests require a memcached server running tested_cache = caches[supported_cache] backend = supported_cache.split(".")[0] total_before = get_metric("django_cache_get_total", backend=backend) or 0 hit_before = get_metric("django_cache_get_hits_total", backend=backend) or 0 miss_before = get_metric("django_cache_get_misses_total", backend=backend) or 0 tested_cache.set("foo1", "bar") tested_cache.get("foo1") tested_cache.get("foo1") tested_cache.get("foofoo") result = tested_cache.get("foofoo", default="default") assert result == "default" assert_metric_equal(total_before + 4, "django_cache_get_total", backend=backend) assert_metric_equal(hit_before + 2, "django_cache_get_hits_total", backend=backend) assert_metric_equal( miss_before + 2, "django_cache_get_misses_total", backend=backend, ) def test_redis_cache_fail(self): # Note: test use fake service config (like if server was stopped) supported_cache = "redis" total_before = get_metric("django_cache_get_total", backend=supported_cache) or 0 fail_before = get_metric("django_cache_get_fail_total", backend=supported_cache) or 0 hit_before = get_metric("django_cache_get_hits_total", backend=supported_cache) or 0 miss_before = get_metric("django_cache_get_misses_total", backend=supported_cache) or 0 tested_cache = caches["stopped_redis_ignore_exception"] tested_cache.get("foo1") assert_metric_equal(hit_before, "django_cache_get_hits_total", backend=supported_cache) assert_metric_equal(miss_before, "django_cache_get_misses_total", backend=supported_cache) assert_metric_equal(total_before + 1, "django_cache_get_total", backend=supported_cache) assert_metric_equal(fail_before + 1, "django_cache_get_fail_total", backend=supported_cache) tested_cache = caches["stopped_redis"] with pytest.raises(RedisError): tested_cache.get("foo1") assert_metric_equal(hit_before, "django_cache_get_hits_total", backend=supported_cache) assert_metric_equal(miss_before, "django_cache_get_misses_total", backend=supported_cache) assert_metric_equal(total_before + 2, "django_cache_get_total", backend=supported_cache) assert_metric_equal(fail_before + 2, "django_cache_get_fail_total", backend=supported_cache) @pytest.mark.parametrize("supported_cache", _SUPPORTED_CACHES) def test_cache_version_support(self, supported_cache): # Note: those tests require a memcached server running tested_cache = caches[supported_cache] tested_cache.set("foo1", "bar v.1", version=1) tested_cache.set("foo1", "bar v.2", version=2) assert tested_cache.get("foo1", version=1) == "bar v.1" assert tested_cache.get("foo1", version=2) == "bar v.2" django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/test_db.py000066400000000000000000000157441520536705300326040ustar00rootroot00000000000000import pytest from django.conf import settings from django.db import connections from django_prometheus.testutils import ( assert_metric_compare, assert_metric_diff, assert_metric_equal, get_metric, save_registry, ) # @pytest.fixture(autouse=True) # def enable_db_access_for_all_tests(db): # pass @pytest.mark.django_db(databases=list(settings.DATABASES.keys())) class BaseDBTest: pass @pytest.mark.skipif(connections["test_db_1"].vendor != "sqlite", reason="Skipped unless test_db_1 uses sqlite") class TestDbMetrics(BaseDBTest): """Test django_prometheus.db metrics. Note regarding the values of metrics: many tests interact with the database, and the test runner itself does. As such, tests that require that a metric has a specific value are at best very fragile. Consider asserting that the value exceeds a certain threshold, or check by how much it increased during the test. """ def test_config_has_expected_databases(self): """Not a real unit test: ensures that testapp.settings contains the databases this test expects. """ assert "default" in connections.databases.keys() assert "test_db_1" in connections.databases.keys() assert "test_db_2" in connections.databases.keys() def test_counters(self): cursor_db1 = connections["test_db_1"].cursor() cursor_db2 = connections["test_db_2"].cursor() cursor_db1.execute("SELECT 1") for _ in range(200): cursor_db2.execute("SELECT 2") cursor_db1.execute("SELECT 3") try: cursor_db1.execute("this is clearly not valid SQL") except Exception: pass assert_metric_equal( 1, "django_db_errors_total", alias="test_db_1", vendor="sqlite", type="OperationalError", ) assert get_metric("django_db_execute_total", alias="test_db_1", vendor="sqlite") > 0 assert get_metric("django_db_execute_total", alias="test_db_2", vendor="sqlite") >= 200 def test_histograms(self): cursor_db1 = connections["test_db_1"].cursor() cursor_db2 = connections["test_db_2"].cursor() cursor_db1.execute("SELECT 1") for _ in range(200): cursor_db2.execute("SELECT 2") assert ( get_metric( "django_db_query_duration_seconds_count", alias="test_db_1", vendor="sqlite", ) > 0 ) assert ( get_metric( "django_db_query_duration_seconds_count", alias="test_db_2", vendor="sqlite", ) >= 200 ) def test_execute_many(self): registry = save_registry() cursor_db1 = connections["test_db_1"].cursor() cursor_db1.executemany( "INSERT INTO testapp_lawn(location) VALUES (?)", [("Paris",), ("New York",), ("Berlin",), ("San Francisco",)], ) assert_metric_diff( registry, 4, "django_db_execute_many_total", alias="test_db_1", vendor="sqlite", ) @pytest.mark.skipif("postgresql" not in connections, reason="Skipped unless postgresql database is enabled") class TestPostgresDbMetrics(BaseDBTest): """Test django_prometheus.db metrics for postgres backend. Note regarding the values of metrics: many tests interact with the database, and the test runner itself does. As such, tests that require that a metric has a specific value are at best very fragile. Consider asserting that the value exceeds a certain threshold, or check by how much it increased during the test. """ def test_counters(self): registry = save_registry() cursor = connections["postgresql"].cursor() for _ in range(20): cursor.execute("SELECT 1") assert_metric_compare( registry, lambda a, b: a + 20 <= b < a + 25, "django_db_execute_total", alias="postgresql", vendor="postgresql", ) @pytest.mark.skipif("mysql" not in connections, reason="Skipped unless mysql database is enabled") class TestMysDbMetrics(BaseDBTest): """Test django_prometheus.db metrics for mys backend. Note regarding the values of metrics: many tests interact with the database, and the test runner itself does. As such, tests that require that a metric has a specific value are at best very fragile. Consider asserting that the value exceeds a certain threshold, or check by how much it increased during the test. """ def test_counters(self): registry = save_registry() cursor = connections["mysql"].cursor() for _ in range(20): cursor.execute("SELECT 1") assert_metric_compare( registry, lambda a, b: a + 20 <= b < a + 25, "django_db_execute_total", alias="mysql", vendor="mysql", ) @pytest.mark.skipif("postgis" not in connections, reason="Skipped unless postgis database is enabled") class TestPostgisDbMetrics(BaseDBTest): """Test django_prometheus.db metrics for postgis backend. Note regarding the values of metrics: many tests interact with the database, and the test runner itself does. As such, tests that require that a metric has a specific value are at best very fragile. Consider asserting that the value exceeds a certain threshold, or check by how much it increased during the test. """ def test_counters(self): r = save_registry() cursor = connections["postgis"].cursor() for _ in range(20): cursor.execute("SELECT 1") assert_metric_compare( r, lambda a, b: a + 20 <= b < a + 25, "django_db_execute_total", alias="postgis", vendor="postgresql", ) @pytest.mark.skipif("spatialite" not in connections, reason="Skipped unless spatialite database is enabled") class TestSpatialiteDbMetrics(BaseDBTest): """Test django_prometheus.db metrics for spatialite backend. Note regarding the values of metrics: many tests interact with the database, and the test runner itself does. As such, tests that require that a metric has a specific value are at best very fragile. Consider asserting that the value exceeds a certain threshold, or check by how much it increased during the test. """ def test_counters(self): r = save_registry() connection = connections["spatialite"] # Make sure the extension is loaded and geospatial tables are created connection.prepare_database() cursor = connection.cursor() for _ in range(20): cursor.execute("SELECT 1") assert_metric_compare( r, lambda a, b: a + 20 <= b < a + 25, "django_db_execute_total", alias="spatialite", vendor="sqlite", ) django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/test_middleware.py000066400000000000000000000116051520536705300343240ustar00rootroot00000000000000import pytest from django_prometheus.testutils import ( assert_metric_diff, assert_metric_equal, save_registry, ) from testapp.views import ObjectionException def M(metric_name): """Makes a full metric name from a short metric name. This is just intended to help keep the lines shorter in test cases. """ return f"django_http_{metric_name}" def T(metric_name): """Makes a full metric name from a short metric name like M(metric_name) This method adds a '_total' postfix for metrics. """ return f"{M(metric_name)}_total" class TestMiddlewareMetrics: """Test django_prometheus.middleware. Note that counters related to exceptions can't be tested as Django's test Client only simulates requests and the exception handling flow is very different in that simulation. """ @pytest.fixture(autouse=True) def _setup(self, settings): settings.PROMETHEUS_LATENCY_BUCKETS = (0.05, 1.0, 2.0, 4.0, 5.0, 10.0, float("inf")) def test_request_counters(self, client): registry = save_registry() client.get("/") client.get("/") client.get("/help") client.post("/", {"test": "data"}) assert_metric_diff(registry, 4, M("requests_before_middlewares_total")) assert_metric_diff(registry, 4, M("responses_before_middlewares_total")) assert_metric_diff(registry, 3, T("requests_total_by_method"), method="GET") assert_metric_diff(registry, 1, T("requests_total_by_method"), method="POST") assert_metric_diff(registry, 4, T("requests_total_by_transport"), transport="http") assert_metric_diff( registry, 2, T("requests_total_by_view_transport_method"), view="testapp.views.index", transport="http", method="GET", ) assert_metric_diff( registry, 1, T("requests_total_by_view_transport_method"), view="testapp.views.help", transport="http", method="GET", ) assert_metric_diff( registry, 1, T("requests_total_by_view_transport_method"), view="testapp.views.index", transport="http", method="POST", ) # We have 3 requests with no post body, and one with a few # bytes, but buckets are cumulative so that is 4 requests with # <=128 bytes bodies. assert_metric_diff(registry, 3, M("requests_body_total_bytes_bucket"), le="0.0") assert_metric_diff(registry, 4, M("requests_body_total_bytes_bucket"), le="128.0") assert_metric_equal(None, M("responses_total_by_templatename"), templatename="help.html") assert_metric_diff(registry, 3, T("responses_total_by_templatename"), templatename="index.html") assert_metric_diff(registry, 4, T("responses_total_by_status"), status="200") assert_metric_diff(registry, 0, M("responses_body_total_bytes_bucket"), le="0.0") assert_metric_diff(registry, 3, M("responses_body_total_bytes_bucket"), le="128.0") assert_metric_diff(registry, 4, M("responses_body_total_bytes_bucket"), le="8192.0") assert_metric_diff(registry, 4, T("responses_total_by_charset"), charset="utf-8") assert_metric_diff(registry, 0, M("responses_streaming_total")) def test_latency_histograms(self, client): # Caution: this test is timing-based. This is not ideal. It # runs slowly (each request to /slow takes at least .1 seconds # to complete), to eliminate flakiness we adjust the buckets used # in the test suite. registry = save_registry() # This always takes more than .1 second, so checking the lower # buckets is fine. client.get("/slow") assert_metric_diff( registry, 0, M("requests_latency_seconds_by_view_method_bucket"), le="0.05", view="slow", method="GET", ) assert_metric_diff( registry, 1, M("requests_latency_seconds_by_view_method_bucket"), le="5.0", view="slow", method="GET", ) def test_exception_latency_histograms(self, client): registry = save_registry() try: client.get("/objection") except ObjectionException: pass assert_metric_diff( registry, 2, M("requests_latency_seconds_by_view_method_bucket"), le="2.5", view="testapp.views.objection", method="GET", ) def test_streaming_responses(self, client): registry = save_registry() client.get("/") client.get("/file") assert_metric_diff(registry, 1, M("responses_streaming_total")) assert_metric_diff(registry, 1, M("responses_body_total_bytes_bucket"), le="+Inf") test_middleware_custom_labels.py000066400000000000000000000073641520536705300371700ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testappimport pytest from prometheus_client import REGISTRY from prometheus_client.metrics import MetricWrapperBase from django_prometheus.middleware import ( Metrics, PrometheusAfterMiddleware, PrometheusBeforeMiddleware, ) from django_prometheus.testutils import assert_metric_diff, save_registry from testapp.helpers import get_middleware from testapp.test_middleware import M, T EXTENDED_METRICS = [ M("requests_latency_seconds_by_view_method"), M("responses_total_by_status_view_method"), ] class CustomMetrics(Metrics): def register_metric(self, metric_cls, name, documentation, labelnames=(), **kwargs): if name in EXTENDED_METRICS: labelnames.extend(("view_type", "user_agent_type")) return super().register_metric(metric_cls, name, documentation, labelnames=labelnames, **kwargs) class AppMetricsBeforeMiddleware(PrometheusBeforeMiddleware): metrics_cls = CustomMetrics class AppMetricsAfterMiddleware(PrometheusAfterMiddleware): metrics_cls = CustomMetrics def label_metric(self, metric, request, response=None, **labels): new_labels = labels if metric._name in EXTENDED_METRICS: new_labels = {"view_type": "foo", "user_agent_type": "browser"} new_labels.update(labels) return super().label_metric(metric, request, response=response, **new_labels) class TestMiddlewareMetricsWithCustomLabels: @pytest.fixture(autouse=True) def _setup(self, settings): settings.MIDDLEWARE = get_middleware( "testapp.test_middleware_custom_labels.AppMetricsBeforeMiddleware", "testapp.test_middleware_custom_labels.AppMetricsAfterMiddleware", ) # Allow CustomMetrics to be used for metric in Metrics._instance.__dict__.values(): if isinstance(metric, MetricWrapperBase): REGISTRY.unregister(metric) Metrics._instance = None def test_request_counters(self, client): registry = save_registry() client.get("/") client.get("/") client.get("/help") client.post("/", {"test": "data"}) assert_metric_diff(registry, 4, M("requests_before_middlewares_total")) assert_metric_diff(registry, 4, M("responses_before_middlewares_total")) assert_metric_diff(registry, 3, T("requests_total_by_method"), method="GET") assert_metric_diff(registry, 1, T("requests_total_by_method"), method="POST") assert_metric_diff(registry, 4, T("requests_total_by_transport"), transport="http") assert_metric_diff( registry, 2, T("requests_total_by_view_transport_method"), view="testapp.views.index", transport="http", method="GET", ) assert_metric_diff( registry, 1, T("requests_total_by_view_transport_method"), view="testapp.views.help", transport="http", method="GET", ) assert_metric_diff( registry, 1, T("requests_total_by_view_transport_method"), view="testapp.views.index", transport="http", method="POST", ) assert_metric_diff( registry, 2.0, T("responses_total_by_status_view_method"), status="200", view="testapp.views.index", method="GET", view_type="foo", user_agent_type="browser", ) assert_metric_diff( registry, 1.0, T("responses_total_by_status_view_method"), status="200", view="testapp.views.help", method="GET", view_type="foo", user_agent_type="browser", ) django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/test_migrations.py000066400000000000000000000024431520536705300343630ustar00rootroot00000000000000from unittest.mock import MagicMock import pytest from django_prometheus.migrations import ExportMigrationsForDatabase from django_prometheus.testutils import assert_metric_equal def M(metric_name): """Make a full metric name from a short metric name. This is just intended to help keep the lines shorter in test cases. """ return f"django_migrations_{metric_name}" @pytest.mark.django_db class TestMigrations: """Test migration counters.""" def test_counters(self): executor = MagicMock() executor.migration_plan = MagicMock() executor.migration_plan.return_value = set() executor.loader.applied_migrations = {"a", "b", "c"} ExportMigrationsForDatabase("fakedb1", executor) assert executor.migration_plan.call_count == 1 executor.migration_plan = MagicMock() executor.migration_plan.return_value = {"a"} executor.loader.applied_migrations = {"b", "c"} ExportMigrationsForDatabase("fakedb2", executor) assert_metric_equal(3, M("applied_total"), connection="fakedb1") assert_metric_equal(0, M("unapplied_total"), connection="fakedb1") assert_metric_equal(2, M("applied_total"), connection="fakedb2") assert_metric_equal(1, M("unapplied_total"), connection="fakedb2") django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/test_models.py000066400000000000000000000031711520536705300334710ustar00rootroot00000000000000import pytest from django_prometheus.testutils import assert_metric_diff, save_registry from testapp.models import Dog, Lawn def M(metric_name): """Make a full metric name from a short metric name. This is just intended to help keep the lines shorter in test cases. """ return f"django_model_{metric_name}" @pytest.mark.django_db class TestModelMetrics: """Test django_prometheus.models.""" def test_counters(self): registry = save_registry() cool = Dog() cool.name = "Cool" cool.save() assert_metric_diff(registry, 1, M("inserts_total"), model="dog") elysees = Lawn() elysees.location = "Champs Elysees, Paris" elysees.save() assert_metric_diff(registry, 1, M("inserts_total"), model="lawn") assert_metric_diff(registry, 1, M("inserts_total"), model="dog") galli = Dog() galli.name = "Galli" galli.save() assert_metric_diff(registry, 2, M("inserts_total"), model="dog") cool.breed = "Wolfhound" assert_metric_diff(registry, 2, M("inserts_total"), model="dog") cool.save() assert_metric_diff(registry, 2, M("inserts_total"), model="dog") assert_metric_diff(registry, 1, M("updates_total"), model="dog") cool.age = 9 cool.save() assert_metric_diff(registry, 2, M("updates_total"), model="dog") cool.delete() # :( assert_metric_diff(registry, 2, M("inserts_total"), model="dog") assert_metric_diff(registry, 2, M("updates_total"), model="dog") assert_metric_diff(registry, 1, M("deletes_total"), model="dog") django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/urls.py000066400000000000000000000007041520536705300321330ustar00rootroot00000000000000from django.contrib import admin from django.urls import include, path from testapp import views urlpatterns = [ path("", views.index), path("help", views.help), path("slow", views.slow, name="slow"), path("objection", views.objection), path("sql", views.sql), path("newlawn/", views.newlawn), path("file", views.file), path("", include("django_prometheus.urls")), path("admin/", admin.site.urls), ] django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/views.py000066400000000000000000000030431520536705300323020ustar00rootroot00000000000000import os import time from django.db import connections from django.http import FileResponse from django.shortcuts import render from django.template.response import TemplateResponse from testapp.models import Lawn def index(request): return TemplateResponse(request, "index.html", {}) def help(request): # render does not instantiate a TemplateResponse, so it does not # increment the "by_templatename" counters. return render(request, "help.html", {}) def slow(request): """This view takes .1s to load, on purpose.""" time.sleep(0.1) return TemplateResponse(request, "slow.html", {}) def newlawn(request, location): """This view creates a new Lawn instance in the database.""" lawn = Lawn() lawn.location = location lawn.save() return TemplateResponse(request, "lawn.html", {"lawn": lawn}) class ObjectionException(Exception): pass def objection(request): raise ObjectionException("Objection!") def sql(request): databases = connections.databases.keys() query = request.GET.get("query") db = request.GET.get("database") if query and db: cursor = connections[db].cursor() cursor.execute(query, []) results = cursor.fetchall() return TemplateResponse( request, "sql.html", {"query": query, "rows": results, "databases": databases}, ) return TemplateResponse(request, "sql.html", {"query": None, "rows": None, "databases": databases}) def file(request): return FileResponse(open(os.devnull, "rb")) django-commons-django-prometheus-febae2c/django_prometheus/tests/end2end/testapp/wsgi.py000066400000000000000000000006061520536705300321200ustar00rootroot00000000000000"""WSGI config for testapp project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testapp.settings") application = get_wsgi_application() django-commons-django-prometheus-febae2c/django_prometheus/tests/test_db_wrapper.py000066400000000000000000000175021520536705300313370ustar00rootroot00000000000000"""Tests for the PostgreSQL and PostGIS database backend wrappers. Verifies that cursor_factory wrapping works correctly and does not re-wrap when connections are reused from a pool (issue #445). """ from unittest.mock import MagicMock, patch import pytest from django_prometheus.db.common import ExportingCursorWrapper try: from django.contrib.gis.gdal import libgdal # noqa: F401 _has_gdal = True except Exception: _has_gdal = False import os _can_import_postgis_backend = False if os.environ.get("DJANGO_SETTINGS_MODULE"): try: import django.contrib.gis.db.backends.postgis.base # noqa: F401 _can_import_postgis_backend = True except Exception: pass class DummyCursor: """A stand-in cursor class used as the base cursor_factory.""" def execute(self, *args, **kwargs): pass def executemany(self, query, param_list, *args, **kwargs): pass class TestExportingCursorWrapper: def test_wraps_cursor_class(self): """ExportingCursorWrapper returns a subclass of the given cursor class.""" wrapped = ExportingCursorWrapper(DummyCursor, "default", "postgresql") assert issubclass(wrapped, DummyCursor) def test_double_wrapping_increases_mro(self): """Wrapping an already-wrapped class creates deeper inheritance. This is the root cause of #445: each re-wrap adds a layer to the MRO, so execute() traverses more super() calls over time. """ wrapped_once = ExportingCursorWrapper(DummyCursor, "default", "postgresql") wrapped_twice = ExportingCursorWrapper(wrapped_once, "default", "postgresql") assert len(wrapped_twice.__mro__) > len(wrapped_once.__mro__) class TestPostgresqlGetConnectionParams: """Test that the postgresql backend wraps cursor_factory in get_connection_params.""" def _make_wrapper(self): """Create a DatabaseWrapper instance with mocked internals.""" from django_prometheus.db.backends.postgresql import base as pg_base wrapper = pg_base.DatabaseWrapper.__new__(pg_base.DatabaseWrapper) wrapper.alias = "default" wrapper.vendor = "postgresql" return wrapper @patch("django.db.backends.postgresql.base.DatabaseWrapper.get_connection_params") def test_wraps_cursor_factory(self, mock_super_params): mock_super_params.return_value = {"cursor_factory": DummyCursor} wrapper = self._make_wrapper() params = wrapper.get_connection_params() assert params["cursor_factory"] is not DummyCursor assert issubclass(params["cursor_factory"], DummyCursor) @patch("django.db.backends.postgresql.base.DatabaseWrapper.get_connection_params") def test_wrapping_is_single_layer(self, mock_super_params): """Calling get_connection_params() always wraps the base cursor class, not a previously wrapped one, because super() returns the original params. With connection pooling, get_connection_params() is called once at pool creation, so the cursor_factory is wrapped exactly once per pool. """ mock_super_params.side_effect = lambda: {"cursor_factory": DummyCursor} wrapper = self._make_wrapper() params_first = wrapper.get_connection_params() params_second = wrapper.get_connection_params() # Both calls produce the same MRO depth because super() always # returns the unwrapped DummyCursor as the base. assert len(params_first["cursor_factory"].__mro__) == len(params_second["cursor_factory"].__mro__) @patch("django.db.backends.postgresql.base.DatabaseWrapper.get_new_connection") def test_get_new_connection_does_not_rewrap(self, mock_super_conn): """get_new_connection() no longer modifies cursor_factory on the connection, so pooled connections are not re-wrapped. """ mock_conn = MagicMock() already_wrapped = ExportingCursorWrapper(DummyCursor, "default", "postgresql") mock_conn.cursor_factory = already_wrapped mock_super_conn.return_value = mock_conn wrapper = self._make_wrapper() conn = wrapper.get_new_connection({}) # cursor_factory should be untouched — still the same class assert conn.cursor_factory is already_wrapped @patch("django.db.backends.postgresql.base.DatabaseWrapper.create_cursor") def test_create_cursor_delegates_to_django(self, mock_django_create_cursor): """create_cursor() delegates to Django's base implementation, not the mixin's version which is incompatible with psycopg3. """ mock_django_create_cursor.return_value = MagicMock() wrapper = self._make_wrapper() wrapper.create_cursor(name=None) # Called as an unbound method: base.DatabaseWrapper.create_cursor(self, name=None) mock_django_create_cursor.assert_called_once_with(wrapper, name=None) @pytest.mark.skipif( not _has_gdal or not _can_import_postgis_backend, reason="PostGIS tests require GDAL and a fully configured Django environment", ) class TestPostgisGetConnectionParams: """Test that the postgis backend wraps cursor_factory in get_connection_params.""" def _get_django_postgis_dbwrapper(self): """Return the Django PostGIS DatabaseWrapper class for patch.object().""" from django.contrib.gis.db.backends.postgis.base import DatabaseWrapper return DatabaseWrapper def _make_wrapper(self): """Create a PostGIS DatabaseWrapper instance with mocked internals.""" from django_prometheus.db.backends.postgis import base as gis_base wrapper = gis_base.DatabaseWrapper.__new__(gis_base.DatabaseWrapper) wrapper.alias = "geo_db" wrapper.vendor = "postgresql" return wrapper def test_wraps_cursor_factory(self): with patch.object(self._get_django_postgis_dbwrapper(), "get_connection_params") as mock_super_params: mock_super_params.return_value = {"cursor_factory": DummyCursor} wrapper = self._make_wrapper() params = wrapper.get_connection_params() assert params["cursor_factory"] is not DummyCursor assert issubclass(params["cursor_factory"], DummyCursor) def test_wrapping_is_single_layer(self): """Each call wraps the original cursor class, not a previously wrapped one.""" with patch.object(self._get_django_postgis_dbwrapper(), "get_connection_params") as mock_super_params: mock_super_params.side_effect = lambda: {"cursor_factory": DummyCursor} wrapper = self._make_wrapper() params_first = wrapper.get_connection_params() params_second = wrapper.get_connection_params() assert len(params_first["cursor_factory"].__mro__) == len(params_second["cursor_factory"].__mro__) def test_uses_self_alias(self): """The postgis backend uses self.alias, not a hardcoded string.""" with patch.object(self._get_django_postgis_dbwrapper(), "get_connection_params") as mock_super_params: mock_super_params.return_value = {"cursor_factory": DummyCursor} wrapper = self._make_wrapper() with patch("django_prometheus.db.common.ExportingCursorWrapper") as mock_ecw: mock_ecw.return_value = DummyCursor wrapper.get_connection_params() mock_ecw.assert_called_once_with(DummyCursor, "geo_db", "postgresql") def test_create_cursor_delegates_to_django(self): """create_cursor() delegates to Django's postgis base implementation.""" with patch.object(self._get_django_postgis_dbwrapper(), "create_cursor") as mock_django_create_cursor: mock_django_create_cursor.return_value = MagicMock() wrapper = self._make_wrapper() wrapper.create_cursor(name=None) mock_django_create_cursor.assert_called_once_with(wrapper, name=None) django-commons-django-prometheus-febae2c/django_prometheus/tests/test_django_prometheus.py000066400000000000000000000006531520536705300327260ustar00rootroot00000000000000#!/usr/bin/env python from django_prometheus.utils import PowersOf class TestDjangoPrometheus: def testPowersOf(self): """Tests utils.PowersOf.""" assert PowersOf(2, 4) == [0, 1, 2, 4, 8] assert PowersOf(3, 5, lower=1) == [0, 3, 9, 27, 81, 243] assert PowersOf(2, 4, include_zero=False) == [1, 2, 4, 8] assert PowersOf(2, 6, lower=2, include_zero=False) == [4, 8, 16, 32, 64, 128] django-commons-django-prometheus-febae2c/django_prometheus/tests/test_exports.py000066400000000000000000000021221520536705300307060ustar00rootroot00000000000000#!/usr/bin/env python import socket from unittest.mock import ANY, MagicMock, call, patch from django_prometheus.exports import SetupPrometheusEndpointOnPortRange @patch("django_prometheus.exports.HTTPServer") def test_port_range_available(httpserver_mock): """Test port range setup with an available port.""" httpserver_mock.side_effect = [socket.error, MagicMock()] port_range = [8000, 8001] port_chosen = SetupPrometheusEndpointOnPortRange(port_range) assert port_chosen in port_range expected_calls = [call(("", 8000), ANY), call(("", 8001), ANY)] assert httpserver_mock.mock_calls == expected_calls @patch("django_prometheus.exports.HTTPServer") def test_port_range_unavailable(httpserver_mock): """Test port range setup with no available ports.""" httpserver_mock.side_effect = [socket.error, socket.error] port_range = [8000, 8001] port_chosen = SetupPrometheusEndpointOnPortRange(port_range) expected_calls = [call(("", 8000), ANY), call(("", 8001), ANY)] assert httpserver_mock.mock_calls == expected_calls assert port_chosen is None django-commons-django-prometheus-febae2c/django_prometheus/tests/test_testutils.py000066400000000000000000000115061520536705300312500ustar00rootroot00000000000000#!/usr/bin/env python from operator import itemgetter import prometheus_client import pytest from django_prometheus.testutils import ( assert_metric_diff, assert_metric_equal, assert_metric_no_diff, assert_metric_not_equal, get_metric, get_metric_from_frozen_registry, get_metrics_vector, save_registry, ) class TestPrometheusTestCaseMixin: @pytest.fixture def registry(self): return prometheus_client.CollectorRegistry() @pytest.fixture(autouse=True) def some_gauge(self, registry): some_gauge = prometheus_client.Gauge("some_gauge", "Some gauge.", registry=registry) some_gauge.set(42) return some_gauge @pytest.fixture(autouse=True) def some_labelled_gauge(self, registry): some_labelled_gauge = prometheus_client.Gauge( "some_labelled_gauge", "Some labelled gauge.", ["labelred", "labelblue"], registry=registry, ) some_labelled_gauge.labels("pink", "indigo").set(1) some_labelled_gauge.labels("pink", "royal").set(2) some_labelled_gauge.labels("carmin", "indigo").set(3) some_labelled_gauge.labels("carmin", "royal").set(4) return some_labelled_gauge def test_get_metric(self, registry): """Tests get_metric.""" assert get_metric("some_gauge", registry=registry) == 42 assert ( get_metric( "some_labelled_gauge", registry=registry, labelred="pink", labelblue="indigo", ) == 1 ) def test_get_metrics_vector(self, registry): """Tests get_metrics_vector.""" vector = get_metrics_vector("some_nonexistent_gauge", registry=registry) assert vector == [] vector = get_metrics_vector("some_gauge", registry=registry) assert vector == [({}, 42)] vector = get_metrics_vector("some_labelled_gauge", registry=registry) assert sorted( [ ({"labelred": "pink", "labelblue": "indigo"}, 1), ({"labelred": "pink", "labelblue": "royal"}, 2), ({"labelred": "carmin", "labelblue": "indigo"}, 3), ({"labelred": "carmin", "labelblue": "royal"}, 4), ], key=itemgetter(1), ) == sorted(vector, key=itemgetter(1)) def test_assert_metric_equal(self, registry): """Tests assert_metric_equal.""" # First we test that a scalar metric can be tested. assert_metric_equal(42, "some_gauge", registry=registry) assert_metric_not_equal(43, "some_gauge", registry=registry) # Here we test that assert_metric_equal fails on nonexistent gauges. assert_metric_not_equal(42, "some_nonexistent_gauge", registry=registry) # Here we test that labelled metrics can be tested. assert_metric_equal( 1, "some_labelled_gauge", registry=registry, labelred="pink", labelblue="indigo", ) assert_metric_not_equal( 1, "some_labelled_gauge", registry=registry, labelred="tomato", labelblue="sky", ) def test_registry_saving(self, registry, some_gauge, some_labelled_gauge): """Tests save_registry and frozen registries operations.""" frozen_registry = save_registry(registry=registry) # Test that we can manipulate a frozen scalar metric. assert get_metric_from_frozen_registry("some_gauge", frozen_registry) == 42 some_gauge.set(99) assert get_metric_from_frozen_registry("some_gauge", frozen_registry) == 42 assert_metric_diff(frozen_registry, 99 - 42, "some_gauge", registry=registry) assert_metric_no_diff(frozen_registry, 1, "some_gauge", registry=registry) # Now test the same thing with a labelled metric. assert ( get_metric_from_frozen_registry( "some_labelled_gauge", frozen_registry, labelred="pink", labelblue="indigo", ) == 1 ) some_labelled_gauge.labels("pink", "indigo").set(5) assert ( get_metric_from_frozen_registry( "some_labelled_gauge", frozen_registry, labelred="pink", labelblue="indigo", ) == 1 ) assert_metric_diff( frozen_registry, 5 - 1, "some_labelled_gauge", registry=registry, labelred="pink", labelblue="indigo", ) assert_metric_no_diff( frozen_registry, 1, "some_labelled_gauge", registry=registry, labelred="pink", labelblue="indigo", ) django-commons-django-prometheus-febae2c/django_prometheus/testutils.py000066400000000000000000000145451520536705300270550ustar00rootroot00000000000000import copy from prometheus_client import REGISTRY METRIC_EQUALS_ERR_EXPLANATION = """ %s%s = %s, expected %s. The values for %s are: %s""" METRIC_DIFF_ERR_EXPLANATION = """ %s%s changed by %f, expected %f. Value before: %s Value after: %s """ METRIC_COMPARE_ERR_EXPLANATION = """ The change in value of %s%s didn't match the predicate. Value before: %s Value after: %s """ METRIC_DIFF_ERR_NONE_EXPLANATION = """ %s%s was None after. Value before: %s Value after: %s """ """A collection of utilities that make it easier to write test cases that interact with metrics. """ def assert_metric_equal(expected_value, metric_name, registry=REGISTRY, **labels): """Asserts that metric_name{**labels} == expected_value.""" value = get_metric(metric_name, registry=registry, **labels) assert_err = METRIC_EQUALS_ERR_EXPLANATION % ( metric_name, format_labels(labels), value, expected_value, metric_name, format_vector(get_metrics_vector(metric_name)), ) assert expected_value == value, assert_err def assert_metric_diff(frozen_registry, expected_diff, metric_name, registry=REGISTRY, **labels): """Asserts that metric_name{**labels} changed by expected_diff between the frozen registry and now. A frozen registry can be obtained by calling save_registry, typically at the beginning of a test case. """ saved_value = get_metric_from_frozen_registry(metric_name, frozen_registry, **labels) current_value = get_metric(metric_name, registry=registry, **labels) assert current_value is not None, METRIC_DIFF_ERR_NONE_EXPLANATION % ( metric_name, format_labels(labels), saved_value, current_value, ) diff = current_value - (saved_value or 0.0) assert_err = METRIC_DIFF_ERR_EXPLANATION % ( metric_name, format_labels(labels), diff, expected_diff, saved_value, current_value, ) assert expected_diff == diff, assert_err def assert_metric_no_diff(frozen_registry, expected_diff, metric_name, registry=REGISTRY, **labels): """Asserts that metric_name{**labels} isn't changed by expected_diff between the frozen registry and now. A frozen registry can be obtained by calling save_registry, typically at the beginning of a test case. """ saved_value = get_metric_from_frozen_registry(metric_name, frozen_registry, **labels) current_value = get_metric(metric_name, registry=registry, **labels) assert current_value is not None, METRIC_DIFF_ERR_NONE_EXPLANATION % ( metric_name, format_labels(labels), saved_value, current_value, ) diff = current_value - (saved_value or 0.0) assert_err = METRIC_DIFF_ERR_EXPLANATION % ( metric_name, format_labels(labels), diff, expected_diff, saved_value, current_value, ) assert expected_diff != diff, assert_err def assert_metric_not_equal(expected_value, metric_name, registry=REGISTRY, **labels): """Asserts that metric_name{**labels} == expected_value.""" value = get_metric(metric_name, registry=registry, **labels) assert_err = METRIC_EQUALS_ERR_EXPLANATION % ( metric_name, format_labels(labels), value, expected_value, metric_name, format_vector(get_metrics_vector(metric_name)), ) assert expected_value != value, assert_err def assert_metric_compare(frozen_registry, predicate, metric_name, registry=REGISTRY, **labels): """Asserts that metric_name{**labels} changed according to a provided predicate function between the frozen registry and now. A frozen registry can be obtained by calling save_registry, typically at the beginning of a test case. """ saved_value = get_metric_from_frozen_registry(metric_name, frozen_registry, **labels) current_value = get_metric(metric_name, registry=registry, **labels) assert current_value is not None, METRIC_DIFF_ERR_NONE_EXPLANATION % ( metric_name, format_labels(labels), saved_value, current_value, ) assert predicate(saved_value, current_value) is True, METRIC_COMPARE_ERR_EXPLANATION % ( metric_name, format_labels(labels), saved_value, current_value, ) def save_registry(registry=REGISTRY): """Freezes a registry. This lets a user test changes to a metric instead of testing the absolute value. A typical use case looks like: registry = save_registry() doStuff() assert_metric_diff(registry, 1, 'stuff_done_total') """ return copy.deepcopy(list(registry.collect())) def get_metric(metric_name, registry=REGISTRY, **labels): """Gets a single metric.""" return get_metric_from_frozen_registry(metric_name, registry.collect(), **labels) def get_metrics_vector(metric_name, registry=REGISTRY): """Returns the values for all labels of a given metric. The result is returned as a list of (labels, value) tuples, where `labels` is a dict. This is quite a hack since it relies on the internal representation of the prometheus_client, and it should probably be provided as a function there instead. """ return get_metric_vector_from_frozen_registry(metric_name, registry.collect()) def get_metric_vector_from_frozen_registry(metric_name, frozen_registry): """Like get_metrics_vector, but from a frozen registry.""" output = [] for metric in frozen_registry: for sample in metric.samples: if sample[0] == metric_name: output.append((sample[1], sample[2])) return output def get_metric_from_frozen_registry(metric_name, frozen_registry, **labels): """Gets a single metric from a frozen registry.""" for metric in frozen_registry: for sample in metric.samples: if sample[0] == metric_name and sample[1] == labels: return sample[2] def format_labels(labels): """Format a set of labels to Prometheus representation. In: {'method': 'GET', 'port': '80'} Out: '{method="GET",port="80"}' """ return "{{{}}}".format(",".join([f'{k}="{v}"' for k, v in labels.items()])) def format_vector(vector): """Formats a list of (labels, value) where labels is a dict into a human-readable representation. """ return "\n".join([f"{format_labels(labels)} = {value}" for labels, value in vector]) django-commons-django-prometheus-febae2c/django_prometheus/urls.py000066400000000000000000000002431520536705300257700ustar00rootroot00000000000000from django.urls import path from django_prometheus import exports urlpatterns = [path("metrics", exports.ExportToDjangoView, name="prometheus-django-metrics")] django-commons-django-prometheus-febae2c/django_prometheus/utils.py000066400000000000000000000015031520536705300261430ustar00rootroot00000000000000from timeit import default_timer def Time(): """Returns some representation of the current time. This wrapper is meant to take advantage of a higher time resolution when available. Thus, its return value should be treated as an opaque object. It can be compared to the current time with TimeSince(). """ return default_timer() def TimeSince(t): """Compares a value returned by Time() to the current time. Returns: the time since t, in fractional seconds. """ return default_timer() - t def PowersOf(logbase, count, lower=0, include_zero=True): """Returns a list of count powers of logbase (from logbase**lower).""" if not include_zero: return [logbase**i for i in range(lower, count + lower)] return [0] + [logbase**i for i in range(lower, count + lower)] django-commons-django-prometheus-febae2c/documentation/000077500000000000000000000000001520536705300235665ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/documentation/exports.md000066400000000000000000000117231520536705300256200ustar00rootroot00000000000000# Exports ## Default: exporting /metrics as a Django view /metrics can be exported as a Django view very easily. Simply include('django_prometheus.urls') with no prefix like so: ```python urlpatterns = [ ... path('', include('django_prometheus.urls')), ] ``` This will reserve the /metrics path on your server. This may be a problem for you, so you can use a prefix. For instance, the following will export the metrics at `/monitoring/metrics` instead. You will need to configure Prometheus to use that path instead of the default. ```python urlpatterns = [ ... path('monitoring/', include('django_prometheus.urls')), ] ``` ## Exporting /metrics in a dedicated thread To ensure that issues in your Django app do not affect the monitoring, it is recommended to export /metrics in an HTTPServer running in a daemon thread. This will prevent that problems such as thread starvation or low-level bugs in Django do not affect the export of your metrics, which may be more needed than ever if these problems occur. It can be enabled by adding the following line in your `settings.py`: ```python PROMETHEUS_METRICS_EXPORT_PORT = 8001 PROMETHEUS_METRICS_EXPORT_ADDRESS = '' # all addresses ``` However, by default this mechanism is disabled, because it is not compatible with Django's autoreloader. The autoreloader is the feature that allows you to edit your code and see the changes immediately. This works by forking multiple processes of Django, which would compete for the port. As such, this code will assert-fail if the autoreloader is active. You can run Django without the autoreloader by passing `-noreload` to `manage.py`. If you decide to enable the thread-based exporter in production, you may wish to modify your manage.py to ensure that this option is always active: ```python execute_from_command_line(sys.argv + ['--noreload']) ``` ## Exporting /metrics in a WSGI application with multiple processes per process If you're using WSGI (e.g. with uwsgi or with gunicorn) and multiple Django processes, using either option above won't work, as requests using the Django view would just go to an inconsistent backend each time, and exporting on a single port doesn't work. The following settings can be used instead: ```python PROMETHEUS_METRICS_EXPORT_PORT_RANGE = range(8001, 8050) ``` This will make Django-Prometheus try to export /metrics on port 8001. If this fails (i.e. the port is in use), it will try 8002, then 8003, etc. You can then configure Prometheus to collect metrics on as many targets as you have workers, using each port separately. This approach requires the application to be loaded into each child process. uWSGI and Gunicorn typically load the application into the master process before forking the child processes. Set the [lazy-apps option](https://uwsgi-docs.readthedocs.io/en/latest/Options.html#lazy-apps) to `true` (uWSGI) or the [preload-app option](https://docs.gunicorn.org/en/stable/settings.html#preload-app) to `false` (Gunicorn) to change this behaviour. ## Exporting /metrics in a WSGI application with multiple processes globally In some WSGI applications, workers are short lived (less than a minute), so some are never scraped by prometheus by default. Prometheus client already provides a nice system to aggregate them using the env variable: `PROMETHEUS_MULTIPROC_DIR` which will configure the directory where metrics will be stored as files per process. Configuration in uwsgi would look like: ```ini env = PROMETHEUS_MULTIPROC_DIR=/path/to/django_metrics ``` You can also set this environment variable elsewhere such as in a kubernetes manifest. Setting this will create four files (one for counters, one for summaries, ...etc) for each pid used. In uwsgi, the number of different pids used can be quite large (the pid change every time a worker respawn). To prevent having thousand of files created, it's possible to create file using worker ids rather than pids. You can change the function used for identifying the process to use the uwsgi worker_id. Modify this in settings before any metrics are created: ```python try: import prometheus_client import uwsgi prometheus_client.values.ValueClass = prometheus_client.values.MultiProcessValue( process_identifier=uwsgi.worker_id) except ImportError: pass # not running in uwsgi ``` Note that this code uses internal interfaces of prometheus_client. The underlying implementation may change. The number of resulting files will be: number of processes * 4 (counter, histogram, gauge, summary) Be aware that by default this will generate a large amount of file descriptors: Each worker will keep 3 file descriptors for each files it created. Since these files will be written often, you should consider mounting this directory as a `tmpfs` or using a subdir of an existing one such as `/run/` or `/var/run/`. If uwsgi is not using lazy-apps (lazy-apps = true), there will be a file descriptors leak (tens to hundreds of fds on a single file) due to the way uwsgi forks processes to create workers. django-commons-django-prometheus-febae2c/examples/000077500000000000000000000000001520536705300225335ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/examples/django-promdash.png000066400000000000000000004554271520536705300263370ustar00rootroot00000000000000‰PNG  IHDR¡Â/b\ sBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœìÝX“÷½?þ×¾`ÂIQÃDÒKHÕ†â!Å^AZ q\#®%ô3ƒ~FœÎUáœ\´l¬ ›ëÚ ô|€ZÁc ý”О%½¬¡+PÅ\…†�”ø+ÀÕŽ 4a%·0¿$üÁø|üEîÜ?Þ$wrßϼý`õêÕóÉd29»0>Ÿïì"b5w�ÿ²þdÛ•Ñû-Ø=Àqüú¶+¶ûÞýòÈ�;Ÿ9ùç#g¿»ß},�{Îxv#æK—®ØF‰ˆÜÜØ^+üV?õÂêî~¿ea’ÑxÜÜÜÜ=yüGW?õÂêÇÿ¨üÃo†¤‹È}f¼Áõ‡“ë¹Ü–‡ÄïŒz4*j•þÃîù¯Ë»µž�EÇo}JøblPwUÛƒ˜ò¼dOD{L,¸Ö¡9º÷Õ7ª w]5)LoiMù<ò‰]gnÚÔ+NÛ[Ôûį>¼ÿâNËï¥/;Þü:Z�ô·û®N½kìU!Ò¨§÷Ḡ›/é¿8YÿÍÀBœ‰‹Ã÷ÇÐ7\!wþã<·¹Ýóº¬9q²�ÈïÙ§W8§s¡÷ƒÔíÛ·oß¾}gêëªk¡©Gëß‹óqv¡�„Ä+¢VÙÚO~TSóÑÇ-W¼6¼¸=öq¶³‹°pî³ïV#6Û¹»¹­øÉ¿'>uåã“¶g¢yî×>.û í;ò|ìéèÈ¡‡hÄÚwþìÉ“§»‡ˆ]àBÌÕvF>#äyY¿ýêdíI“O¤4ê©Õ^î4l6Ô×Ö¶ÌÞÛï;ý—]Q/ú óúìÊ{UHÔ³ë÷ãy ›/µÔRÞQÉ÷Èã‘ÒÈ ?Ç�F¬æ®ö)õ>ž¼ èØgE�Úþ¥ú“ÓÝ P75ØúyuµÁþ÷ûGU_«[ßzkO¨jJ…Lõˆp½Ï°þè‰ÏL£DD翹l~$å…§÷<ÿ@Öé܃9WÓsÕ ¢!Ó #'¹¯–J¹¤o¿ÔÕe¢G‚¶üûV‰Ðsà+íÉ“_¶zJ ±�{Žoï¾úÅÍ!îçOž8ñ‘ö’û£O½˜¸31võÐÙ�OÔ¨¿ä ¥›#oWAg»b$òôór#"·?ITD‰–�ÿòäɓگ. ñV?³yKÈ#dR±ù¿‘î³'Õê“_]q_½áÅx骉ýóžÙúB ™¾úò˯.�ð„Å–õ�Ìõ+v;6ÃÑ}µ×VÊâ‚ÙDÄö“íW·ô|ÿý÷ßõ²öPœ›ˆÈç§oª¿¹êXXúKáxÕ•O\‘öò÷ßÿ}Ï—“{øÈоìùþûï¯^Vï—ù�­ûÓ7?²ïúê7êý2ûž§?"[˜þÍÕ–C¥Úžï¿¿ª~É�ØO¾ôž}�ß|”ºÔ±Çñ¥ßßÓòQús^óüZ�¹{-Ÿ8›†Ú?9Z©¹ý7?_åFä¶<èù_¾¼{÷îÝ»_þeô�¸=òRúK?‰þåovïN�ÂÓmÅúŸ¿ô›Ý»wïN9áù ån-2<Øæ2ã±á=¿U£‘®³—'êM†¾¬:úá'µ|xzÀý±(éjwëW•Gª4§Ïž­ÿäý#5†aNàó‘“rÕà—U5õm—/sú“ú>"OSíÑOÎ~sù|ËÉO¾²’×j?ÏéŽ>‰mp„ÈÝÓÓ�ÈÍ/â)/ê;y´ê“ú³gÏžÖ|p´¦k„|‚ü<‰Üx�B/2Ÿ¬©­?ÛÒrö³*?îõòñš(Ìpû‰¿¼_ûY}½æƒrõ·D�ñowô¹7Øñ·>ZêçAláÎ'vziR#ƒƒŸŽÝûuÀ΢·~ìEìçÞz/ÃG³32882õÓ¥Û‹J·8šv®ŒÝîÿ·W££c_=㿽¨HæXìñãíÂ3¯FGƾqÆ?õĉ!›ØO¦T›б/622öÕÏ}ROhÞ eÏtD""�€�¡†7¶nßY ~®è£"ÙðÑíÑ‘[ £·ûÛã·³ô­Ÿöí‹}:øéØ‚Îнï½:¯í&¿;_ß>ì÷¼œðó觃[áé6:`ê¾24JDËCâϲ/}|ôðá2õ%¯gãÇ㺻—Hhk8q¢öÔÙ³}�‰|ìo¿çª§ø#—ÏšFÙ�½°ý…džNŸ(ûóáÊÓC�¿¸=Šo_Å�·ÁïÊÉ'jë»ÙÏn–òMê²?ÿùpMÛHà ±O-ø�D÷ÝV“õ»£¦,³>þxRÓ8k×y³£NÏmÅúÕîd>ýåD{Ç¡óõ-ƒÂg ôqëéüXàðàБ¹½Ë±úèðû7ún¶æšŽˆ6BD£—?†ÏŸ;8 ›Lƒô(Ç‹M´Ð ÿl׆‰<<<ˆ¨÷Ó‚W?Ø[ýµ�ÈP\ði†FèïE>~Ã×:»: †ACêÖ>•Oç5"/"¢Ó¯þê�ê>¢3ƒGRNo õgWwµ¾ñ«]ïˆþ–´óÉkR¶¼§z)%¸÷pä¯ŠÏØˆÎ´nõ mÍHÿñ¾_uN{Dû+òùÞW�¨‰¼~úß²•­oH_«6ýmçÎ'ŸÓl!"öJ¿¥Ã_wvtº¾.LÚjxÒÖ9¿­M‡Î×)»ôLÄú@‘Dø”„ÈÚÕüIíg—‡ÜV„<íÓwòÏŸ}ó |Vë#ÜùLàò–ÓCDD}_œl¹n&Ó¨=â�0�zFR{eíÙîQ":û‰æñ”Ø¿úÌD4réd}Ûe‘Ûª6Ù†¾üî;ÛwõVuyYÑ:œbîæN ¼Òu¾ý¼ihr³]±Ž=ôðòr§sßMw¿C¦A"?žçXIF‡Ç7!"ÛD,¸³ñÝ<–³‰F†l#ö�F<y&Ðo�çååűgÈ�ˆè;ý''ã£VK^\-¡‘Áo/ÚΞÖwO”ÈýÚµ;Û»#ÞÌ�]g:"‘mx†]Ž¥r›¡X*¨}nË–-2Yô΢-ÛeÛ׿X=o9ï‘'ž�Z}IóÉ7CD4:tår‹Æ4虲Uä÷HÛÑÈ¥��ž4M¼¡#¶ÁQÇ`"Ô_né“Fù|Ùõø|½i”ˆÜÝi°¹òDËÄO##Cß›ˆFÁŸhôÊé÷¶¯ |<ðqÉæ§Bô•ùdA¦¸Éœ�¹2›áÁÁrçñnêÑæÉ÷"²ŽÕ‡Ì�GŸñ!2ë/}GäÆ6jµÇpû‰ƒï”W}øÉg§[Λlìñ`ëöÈŠU«¼†¯œ?ûÙ‡ïÿå? þüQû0ñB"ø‹iÀ ¶pûžh�ÎÚ:lìДí�E/F¾˜ôZá‘ê¯Ég)‘±ýdo–îíS¿ö+éú'b?¸ýœÿ,=ß<–ø9†EaûÿØŸ:?ï¸bøº×ãÉçØc‹CŸ\:ÜÑqmú#NÑ×Ñqmih¨ÿضÏù{xûÉ”C‡¶/=ó~á®ÿ-y"øÕÖ¥?Þ:�îŒÒr¡èÙ›†;qg{ Û†® »¯XAƒvä÷lÔ3«¦ÉµC—Ïöy¬^ÿTørKß(Ñè`× yúxÚ[y…DEzM9CØü�蟬ín;­ù°ü/‡¿ä<è¤éCà!· oôJË¥âE<³j<°{v½ w·÷ÍM•‡çªŸl�âÑÈ¥/Úˆˆ<½<ˆ†ºÌãí==ñËxìÕÒí E¬hltŒÑïL¦!¢§×¾xGÇÅÅÅÅÅý2åÍRuý[Á½¼Zøµ�h°w�|Be¡~>>OÊÞ|ï­§‰ˆía$¡,µôÐKÏ ý„¡²í¡K¯u|Ý7[Ï7�ïÝ#óa“Ïs¯Ú¾ôó‚ ßµ)n]™úÞá—~úä“Ïý²èÄހΣÅg§?â”Ý ~^x´3àõ÷Å…>ùÜ/ßzo§#í‘Ï�w¾Uúf\¨ÐïÉŸîŒ  ŽÏ;fªû›Cç?käIþ“� 'žxbýO~¾ýE¿áö†Ë¶Ñ¾/[Ìœ ›_X¿jù#+žˆÞ, ô² LW–¡ËgMž¢g>ßb?'‡Î7Fü^øyäã+Y¾*$6ö)?÷�¡)çÈÈÈòÇ7<ÿ|Ȫ垞ËýÖ?æ5r¥kÐéç<Œæ|~¼YÙ.ŸTw­~á)E¢×W_� �‡<åç1|飓ݣãC¥Ü¯õÒŸóm£Dnnnîž<þ£<¢A}�½½�öµK~�Fm~Þýì¥awŸÕë×òFˆÜÝñp£ï.5èW?%ÝÏ?{Þds[ñøSOñh°ù¬³ûR­ÜòÖÑ-ö?‡{[5[_Ý«ê#"Û×ûv¿—¢éÈ kš#©¯²ï ð*TíúUAiÑ[šÖ"¢kµ¯oMút�„3îøšæŒÿ[-½'–R§foì¯Þï"¢¯ _Œ]ZZôVíiîü¼hëÎ7þ6h£é�8Ñ)�ˆˆlgÞˆÞîñÞ[GëwRïéÇOûo!"Û×{·¦ú¿·çh}*Ñpïé£ÛUl˜ÏAWFMŸ•U~'� y*J¸�ˆ†Í—¾¬QqÙFDõU'èyi”b§”F¬]Í5×_�î`»ü•‰ü–�E<"ÛùÚ*µôùˆÍ‰Ï › '�Öž"ºiÜÌÑ+'?P{<©ØE4b¾¤=Qû &3gøÁêÕ«ïiC·Ç¶¼²uõàÉ?™±?žÛŠŸü{âÛ”UÜyüYiäúÕ<¢ë·çÏ6œ<}ybôgF&Öw[õóWBSÍÁªóöûeÏõ/¥HÙÍeùìʨ½7ߢöuÎ6Ô·Mš%Ýó±Èç¥!«½Ü‰F»Ú¿¬¯7¯I!T—· ÙŸŽ ZÍã�£8õö)Ùo) ÑòÈßù }yø/õwóJ™L¦»YnÂçó�]€É=g<¸SÈx÷à®,h<˜WÈx®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®ãÎ.Ì�ܸqÃÙe€¹�¶š®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®Àu¸ßÏÆ6}Ž4±Î:ë:,�çë+I$²èh1Ÿ=óÎS#v5ñâ�Õ¦̼&LoÞëñÆÜÓÙV_Wœ›»Qž¥ì°Ì÷Z ÚV“éÔäo‹ËR÷/äA÷ÕVsÞæ²êt!ëæ… c±˜{Œú¦ºªª¦ûB³fÏ6·:'œ;uâè0²±|ƒ¸h¨ p~pãÆ�{ÞxR¼Ûö¡³èŠRS+Úû#Nd�ªP25åÀ}Y°¶š\qjIÉÇ#k}~‘Þ¶PÇxH,d<¶(©0e,å™ëJ›0ü Àœš«þxw†-�§F–fÔ3DÄ4)uÉD{ÍÛÏ�`3é4J•F§7:ÍŽFŸÄáù ‚£åry¸à–Ml�©w51Dœ˜2uŽˆm35*Ë«êêu3CD,ޝP,‘ÉãcÂg™Ô�l¦Æºr¥ªI×Öcµo% �Þ¼#AÀ/4+²äT¡xš�Øúuš*¥¦I§7š­ ÇW(GÇÈc¤"ï;éîÀÂf<"®X.fÕ71DD:•Á&™.ÝÊfTå¦çj:o}Æjîl«ïl«¯*ÚQT”*ž±�cTf%ç×›'/²ö´ÕWµÕW…¥•(¦ëNhÑWfehš²•NS¡ÓTUÅä…ÍVj“¶0+§ªmÊ‚ÖCS�¡©®ø@dZAŽB„^‰0gtî""®0Zàø“1è{îd›±2Y1ðX¬º:ñÂR²3ãÇfÚúuÊÜôMö²Ôj’*åü‰m,ºüŒ ƒýoVÐŽ‚‚Ôð±ÛL�¥YmŒ¹sJ%ÝĶÉtŽö¤¾‘™y9ò‰ú:›©±47£BÇQO]F†°º\1M™îÚ‚×ã›ë;–vs?3ëºDDÊò6û_¼˜ÂÅÔ>ll¾$½ [ìxÔ£ÓÏX-Æ‹9T]”0©çÛ[¬((‰÷u<4¨ô“kòLªÂ:G ^PZeÉDÀ#"6?<µ¤2-h¦C•ycÛún>TY(¿©A&›žZR�æ˜M°­8³ÂÀÜXøŒG,îøTé sÛù,V†/ô屈üw$ÍÐÛÎ[=6\§Ål,î�ª9ÃŽú�ÆN£A¯kjjll»ÍÊ,_o†gX)l<ZŒMŽˆÇ‰fØ�ˆ¸AbÌ7/´ÛÛ²‚ÂfëmÈJTo "2ézl2ïûx1ˆœ‘ñÈjëöÆáO4Û¼=‹±Q«Õ6é:�&£©Ó<ý`'3áòf9ËžîlU€fãX½OÈ›9z±yBÑÔŒgßV0˶DÄåû²ÈÀ‘µÇÌ!ãÀ}ZøŒgî0Že)^�ïÎŽ§.Ìɯ™:ÑÜžPìkÒÍô옻H“D¶ñn}löl²§ ©ÌøÈ-·­¦d±ñ’nÛ/à,xÆë××�Mt7k3Èq¶ŽòämÅ“Úb²xþB¡@ …¢QP�À›Ý¯NØ´çvÍ5ï{¼`6ÛlýmÓtÿ›hûÉÜ2ãÞÌøÎ¹¬»Ê ÓZèŒ×¯«Ñ9þä„Ë„·¯Æ3Ve�<ÿÍÙ9IÑ¢iú­Yïn —ÛâøòˆzˆˆÌ³�ø3•Ój¼5ÆqyÞD�DDfãìóÿYL=Žró|gšàÎ-츚¶Žªâñˆ'‘Ý6âÙ:”cÓ°Â J²dÓ<²™;Ì·.½\�È1£‚U¯Ÿyßýz]Ï4Û9¶eÚ´ÆYaZ £ãO_Ñ�µZ˜ÕBf<[GiVÅX&òOHß>Ö0=ã K3Ãäd3Ö5�ç0Æ6]ÛØ‚è0GsÍNåx›ÊT¯œ®�¨ïø¶fUUÛŒÅéo¬hrTãùGÏô¿Ü�Ëx}ù®Äб®x¼˜,¹à޶Ï�æ©s8Ø:ªr«ÆkÓn?©ú�a‹ñŽ Î;Kó•ÓMQnRçNÛ� ˆqlk­Ë)ÔMÛ+ϤÎÏ«Ò Jˆžqê?€»0gÏÆ0¶©,–~S‡N«*ÏI–mL,Ö�uš¦ÊßQ4®0rl–ñžŠœrý”¸d1ªó·&cÎzæ äY1öê8F—¯H.¿i–ò~}eªbOÓLÇ$ŒmK=5ÉŠ,eÇMïו§*öÔ;õß‘�Z<˜s5抹&qcÍ­)Œ?T’p§½Ïø²”èÒ]+Q[q¢T)–„ }¹,ÆÒclkl2Øs’o˜˜iÒ™‰Èjž³‰æ¸âô‚x}bU'YuÅÉ›J}ƒDB‡1tmŽÁRX“æM¿yÛÌCiÆÄm õhò·i }ƒÄB‹¬=mºI5’¼è}%©wüjÌnAÇ\á‰ã÷Õ–¥‡ßÍ’Üðì’41ÇñˆéÑijª***ªj4ö€Ç Ú¼¯¶º Iì˜{ÀØh𳹿¸¢ôò’Ac³0=mºúúú&GÀã„¥•äE:ždM�(� (©Þ·Y8iã¦úúúúI�–RR�'EÌ™yŸ;�ÅñõEâðhYt¸à^f`(JTáZey•ªIßiŸœœÅñˆÄaÑòx™È›ˆˆ-fiš"³¦¢-5ïÎZ‚Þ®8µü”L[U®Ô4é f†ˆX‘DŸ/PãXsÍé&Cgó¥Y•E£²R©ÑµE'ޝP#—K0aÌ­ܸqÃÙe°³5&GìÒñâ�Õ¦?í-ê„�ö¹×…Ù­”¡Fœl¡ç@Ÿ3>$&‹Åv~À3i‹ªô\�@ …‰g˜ÇÜfh2Úÿâ琢`n-žŒg1��=Éåsf]sA0Fm•}ªafm¥|º¹ LuEuö1_Xâèb ÀBZÐ1Wfa3jë“籋¡NÌW,vÌ~`ÈÏ(ºe ‹^™ž˜ï˜ÏWž4gûãÙ:Šwil2wö8¦‹c…¨‹$‹ 2õ«Sc'M�Çó <.Ûf1÷ôóøA)Çîb2€yääŒ×¯RlÊ5L^”V]¢X$ mFUnz®¦sæ5ü£³ ³e‹¤¸ÎÍx6cù®äR�½NŒã&KJO‘.²ÄdéЪ”ªÉ“‹ç/ GË2ÉbhV 0fñÌ�÷k±Œ¹÷Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®ÃýÞ6Óéts[Ž™ˆÅâ>",rã§9ã<¼N9W�ò²À"çÜïÏEþ©ÁGæ,ò÷ÔÎé· ‹áÔz Þ©‡Ç]½så3-È);å{gíÚµ?øÁˆèÆ�ó}hXœ.\¸0eÉŸ‡wb�¿Ðo-!>,0åÃâôsò¶²„·7a·µÈßS»)…tzIn çÿüA„g¹÷Œ·ð<<<ÜÜÜ·­«þóŸÎ.–‡>,³)ã¹¹¹¹»?H†¹522âì"<0ðayÈáÃð0Ø+®ãAÊxhuö�à pçðZ=äp<̤Œ³CÆpÈx‹�­ßÔoqv!à�„Œ‹‚I™,“ÊR•¦…: ­£P2F’®2Ù&?iR¥KÆŸ•vØfÜÏ<¬2U±)vÓÆY–ʸ€G—€ŒNÔ¯kì°õ7)u=æž&¥®ŸˆÈÒÑhÿcApb sd|ö¤%l¾,§0†³`%gë(OñŽâ IDATN<Ðdf‰7obõhr»*óàn¸rÆ»¢ÍIxU{müñ5Í«['Ûsfȉ¥p2˹ÿ.ý/µiò?9W'H?V},/ÚVµ+cáÚ6Î=® ˆGDL§N×ÉŒ/e:uM� ñƒÜù-‹–’Æ!"k}®"]=úÕéŠÜz+qÂRRÂæË'°‰Ø {Ìk*­2.DfaªLM< ãJÒ÷*ÈN+2¹ó”ÁmÆÊä¸]¥FA|ö¡’’C™1\m~bB¡ÞÕ>ãóÅ%3Þµ3‡÷¼\ %¯›–þÃdüÇÒõB×;ü«ïacë(ŒÛ—·/–eNjžnrÁú‹Ò³õ�Ûù¢§E>ìÛ¯[GQjV¥~ò [¿6'5O½˜‰õ«³{êÌâ‡j*“Ÿb ¼�T¬yÒ¡ª2ø&夆D²ô±YSi°YšJ5–°ÌLY€ @’š—.l+¯ZÈ®bsŒ/‘ ²ü£w¤e¦íˆö{R(—ðçóàl^tNYABBQev$‡ˆ#’ˆÆ"%W$sˆ8‘Ù•E EÇrbxóý}giÌMžxŒQg´±ùB16ç¾Ë&­²�·¹  ].•„Kd y%ûÄVMé¼Ô#›”YÚ„i•e9 i¸X.K-*OvVå×-æË"À"âŠ�16—nÉ~û7¡“Csåÿý}É�_:eåkšW¶½Rþ¾š°uëÖm/ïûØ`Ô|%aëÖ­Û^9¨½²�内acn¿ÎB²™´… ²mùuM†±vf6£*G¾iWE½®Ãâ¤+úˆédùQuK£ªò¿JKKÿ«ò“–¾¢“úýÏ®cøèÿüw˵ñ¶šà*̆&Í�DiBáxû+ƤoªÙ›Z¾€Ý¢faiÌϯ·¥•J ŸÔqŠã�/dêsóµó|Bö7¥Ú›ŽIìM'múIˆb¼�­£P¢PšˆÈ¢+O—KBBBB$òtGv¶éÒ%Òô¢,yxHˆ|oùÎ�ðôñZKcºD’~S¥H@RYu‰\0¥6S£�D9²/HÌëÑ,Dd3*í-8CÂÇÊ·ØÙú;ÔååöšAi••y© ¹"5¯²:-ˆˆˆ ååjý|¶ô‰øl"âË «ËJ* &zä±ù²¼Ê²²êBß¾bÀ|ÿ„`3Ö5ZI˜VyH. cyr\r\r‘ÞB�RÓCÂøøçþ¨Æb³ÉÒcš8E½%Ùee™b.‘ýÂ5ÑŠ3Ki´ÙÛTÊŠŒc«›” ÇÈ5¶Žñ3U–:]cc£¦ÊÀŠL’ &ýÇyÞ¡‚Ì0žý‘ÍX—co®,M.Ò9ÊdÑWf)¤öBHòÔ&""‹69\–Wž—àhô™*“SKÍ’œcÕµÇrÂÍÅÉŽ®^Œ¹^i“ç*Hÿ·˜815�õ1²è•:+D75Ld{ ø\"²õw¨ò‹u¼h…�Mdî±°x¼±Ù\‡,F+‘±*=_/ÌGºiÛžš""'LÜѳ²1õÔìIŒ•æ,Dû o‘˜sˆbóE¢¬fs}¹D¥²ÍBl_I|‡ ‰©•æ°Ì’‚²CŠy­Ñ¼ÞÑ)Ñܦ=›¤ éyåªÆŽ~›/x³͇›øI%µµµÇ d¤ÉϪë'�,Ú·G£5Ú775) ¾Ñòv¿:#±Ð”^V][] 'å®ärãÍG²›zH ÞÜL—-—ˆÆÞ¢Î*%#/_$Ë̉¡úÒÆ~¶PÍs„¼ñˆg먪0Ò R%~€$='‰§+×8—BªB. ç{‡Ç‹©©Jo!GÄ WMÓ÷̦ϒnÚ–«é Š‘ ¹D Ã0ÄšxX,61ŒÍf³ÍÄðù|¾ ¹‘;�Þ´l”ˆÈÍÝñ½À^:6Æ€ÛmÔ2::Ï߰Ș�z£/3e‘Ád!ñ<��q¯XD6fþ>B棕éÌØ2i¯Íl“ å‘ÜD¥®_&1×iÍAI‘|bÔz3ò7…äO*ž¾ÇODä-‹^\q|eTé-á"½RG’ 龓آluC¦YWš±+9�[­Œg±XÄLÜ3Œ�X,6›-HH RHÜXÌ ŠŒŒ–)d¢)»“ÉdD”››;¾$&&Ɖ�-ÊQ×ʵåY{jzˆtå“D2iÊuDDä»y_A‚$€¿ßÖýz=#M>’ͤ7°¢*¯_�‘¸§I�R]–S¶�IÜ£Ñ(uIb‰ LÎiÒ˜Í6¢Eò©ãHSó¤©Dc£VYQX±k¯ºR!�ÉÙ�š¢<½±ÇhзõGÀ‘@"÷/V5šÔ¤4øFç ȦÓõPOE\HŤݲzšÔ•ÅåÍþoóDŽÈfóY¤c"¾X.çh•E•mÆN£Aoè!_r|!pøÞãý,ÙD ™;:¬¾áØ›ë+qX6"[ÏôÅóKŠáfì‰�È÷K$1òxÙ"yGf0¯wl|Y^‰`šßT¹±3n­Yžƒ¬üðQ�µüÝþÙg-Y‚±]Û[îMDdã5±Iï+ Ÿzçã„B(ŠÔáªüô‰f™Ü EI1ªüŒ\MϬÛÎ 7–�~o»)¸�þƒ!·Ú+éPU÷Pc 7g¤KI)¿ÑaÅçå¥Hâ^{l^�/U{H,°™:,¼ïI…1 Vâ‹|ç­| CÄ‹)(INºbpùl"�<š›X£3 Ú´faR˜7Q?±Âö•eNnzÉⱩ�ˆÅb�ï€+’‡±2”zU騒¢i#±Ùl6?<%3F•¨j4Å‹\Fg¶±‰ˆl£•¸[ (?%Ñkµ*�¦þ@FMÕæ²ê¬)ßv“cžsž›/’&$TÔäˆÚòãºx¹˜oÒ)«4ö>z¤$é¼öƒëïÐS€È›LªtEn=EfWæ9ºäÙLª,Ç¢BŸúõ4_]òúuUM +L.ñe[šwLO"®¥1/1Cc%aŒxÔá™Ôy…ºðÌ,‰7W.KñLÒ]uº~§-k[†–- “HIæÂÄ"ûF‚h¹©Rk”°•Fyž€Èfcˆ„™Ç ÂnúpÜÜHYæOÅZƒEæ=i¹¥1'¹‚›^�Î#"6Ýtçf#"“*5.W'ˆŒ ÇD+vèsvi&aÚÿ‰!›ãs4±§ŠÇ–ä¨N%4jT­V™[WU—]]"svóY€™Ío[Mn€8|"'Ü#\ÓîÙ¶óàÿû…÷ÆóƒK~„‘5Á©ØYŽò¯%)“ÚSqdyÕµñAóÿ³ƒÛÒÿB×.^™øfÄl¸2ÊòæýËl›¡&ÏõqÄ)%µ•YÒIßÔ¾‘™eêòtg<""oq¼˜zª U�•»è&WÙY‹‹ $›¿›až�Ï2Ì,¾Ï¢),T,DÄÄDóô5¥Ö,´—€Ëp£�íX—OMÅ…åmÓ4såŠá,]UU•ž)ŸÚ²ÀÒ˜%•¤Ž�#ÃX, ±Ù,6?,ˆeÒËÍm:³¯XÈ%‹^YXÔÄIY…åêêßžzÍt](e2Yvvöbxv&­Òàø“1h*òóó+4†±7×P¥™×N…6s]ζÔòrÇ4 V�v|dY‹^«³:&T(/OÝ–S7o �Ùl6cp £IÞ"oKcžbWMñ¢ )ótܻåÎúš¢º›Î) CÄå°ûuåKX^yQNªB. b'Îu¾D.è©S)•F_™D@Dl¾˜G&½•çøp° ¥…¥Sû(ð% !S_|S`£ª¸ÎÐïë;Sý™ISÞÄŠ))+ÌJUÈ$AìžÙÛ•ó8=úñ’š;:¬Ì,Å3i‹ •&ßpyjN‘RUF:¥Áù½úfæŠc®LkéºHÁ`ã»ïj ß~kh(ëðùýtÛ:d¼‡ ›Íãw‘Íèæ-N(ª­ÎŽò¸lGþ$½\]’æ;¾h>¸{‹Öó˜Îÿù¿êÓç:.\8×¢ý¨Îð½W`ðŠÙbœ›››ÓwÑØgÁ”箇Íõõ�Î<¦*I«6`q¹¼ ø‚ÚêB¹h14Lò–f¦1M¹»Lîwg3i “wi¬þ;2cæñgu®8)†gÈÏ(Tw˜LªüŒâ&³À~¿Éˆ‘ðtÅ5=¢x{Èd‹ü{*RsTz£©C[˜‘¯1ò§�ç�$—PSUÓ4�¸¢è jÊÏQêŒ¦ŽÆÊœÜzŠÜéM\qB »>7G©3vh‹² öY,£¶"'_©7õ÷U3K8u ‘12™l‘<"‹±ÍDDä/ûO|;³Æš Æy¾“fÌMÅÅöyð"³+ ¥c?xK í*�µ¾¸¸É<�-é¹a)ñþdÖdlËÑöѤ€w,O²(*ñˆˆ+I‰÷ï,V$f)ÕZ­ZY”ž°§‰“Îesy,ÆØ¨3Y,ýꬪ{Å7‘=ä** ¾òh ¢“ÄL]VV¥Îh26–ïɪkc ¦t%~Lö¡á€"1§RݨÓi•y  þñ9ò?ã,—¬m[¿ÅbÒ+ss4V¢Y€`í�ù¶åï)oì0v¨ 3tÚkôf(ËÖ¦ÌÏ*Övô÷›ôZ��ñÏ÷Ì�÷åáùM~EtVö?Þ=\þúoÿAK~ü|Ö«Û,¢Ü~Kp‚åÙgbl�,§RvÓ"®8¡H•0¿‡åŠb^¤/¾hiû¢s”ˆþ…ç#Yï=ë·‚;O´†£iûL3ó³Å–á¾±Åy*åÍ‹¼eåjÙôk;‡�Ø\ÑÄÝv¿:+9WÓÉ�ÿæC%©ó;´<[”^VÀÎ-ÌÝVÅË?2¥(g¼©V€<Ú·ª‚¿y¼Q� ¡ä�%·°01ÎJ,_q|Á¡›¦¹ádÉ%œº¦è› µãJòJ2ss‹’ãò‰xA1Ù•™Ro{IJ²­Y…ÉqVâ‰ã(øDÄH)Ê4g%Ææqü#“Šr$ÀM(7<¯º$Æ, àR¿J±)×@$̬­”{“¥£ÑÈ _¨Ÿ81…9SÚÞñe9…:Yr�u†Mæ [”^rÈ’¸«®.c›%^l¨Ò,¶€GDÄ¥—— ‹Ë•ùš "â #wJOs‰ÂÓ³7gägÄÖËW,O)ˆ/ÎÐÍ$æ?L.¤|ÛÄL‡|YA‰%?¿49î/hó¾²ô[;P°RKŽ Š”–±xAÑ™eéòYzZxGçd7¥ç'oª ޤ<}_tNn[�…f …쀔’}–Œü]ÛŠÉ7,>Þß b±f.žt_�aO~Ö¶*†X¼ ˜}%I‚û|=æ×�{röìÙ{Ûðž�röìY†aà °h1 3åÄ[øóp>Ö¿·¾,ø°<ä¦|Xœ~NÎÝúÿúÔ_kk«�++«½<|ãÆ�ok3“Ò j¿þû}ná_Ÿ›|w*%2æÐ7Î,Â�X˜oÂo«Sb¢c’ª¿½‡moÜrÛp[ S#™Vûíðä'¿­M‹6¦à›á÷3ýAïòEø{áaöƒmÞwê®Îé{?¨³Ïçù†o¾{ômõfqLÙå9?ÊCûò‚Ó=<õxð óI¤¢É ø²¼’EUÓxWúõZ�^s@Çß‘àì²,|y‘J¾�d¤«Î¦Ïô$_V¨]ÀÓË;<µ¼1©ßda󽀨�­­tW!;¥(3Ú—z´…E�¾ò0_g `Î ã8ƒ­G•¿§Æ&N+™¹�?žN§›Ãr܉¯¿þz��‹ßŸ‡wÂé¥Â‡¦pú9y[Î-áâ}DNU�^€ER†Ûz wå7nÜpv`n ­&€ë@ÆpÈx®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpÈx®Àu ã¸d<×�Œà:�ñ\2€ëp¿·Íç¶÷ÏËËk–gqñ€Ehö‹×=¸—z¼þóŸs[€91Ë /Xœæü u/ïÆ�s[€91Ë /Xœæü …þx®ÀuÜuÆ»qãš»Àâ4ÓE /X´æü"…z<×�Œà:�ñ\2€ë@ÆpÈx®Àu ã¸d<×�Œà:�ñ\2€ë@ÆpîÎ:0Ó{Fyø=UC{ßu¢%>�ò—^–¯_NDDÖ3i/f¶NZyɲÀ�;_û­Ô�ED4Т|çHUCûUû–ã_yY¶–3e÷çÞŒKÕæ~Tüì”§î½ÈÞIH®é[õʱrÙÊ9Ú'< ˜3¿ûYfóM‹<}‚¥¿~íåg�}M`º¾Pw­•M)‡õ‹´³[—H kßXÏšycëõ)ë™ã .À9õxL—òw ™G´í}×iÉ’%t½¯]ûnzÂïÔ½7­¶dÙ²eË–y]¿Ú®ÙŸöv CD]UiéïjÛ¯^÷\æ³lÉõ¾vÍÁäß©z§?Мb±–s<—x.gÍr©g¿6-[湄†úZk²WÕåÔòXϼ©HÌ®hµ2÷°ñ€úwŠäýÊ‹÷²-,VNÉx½ª½ï¶^§%�/}pò¯ýëÉò7¯!jÞ¿_=0±Úšß–VWWW×þOÙ+�DtõTÍ9†ºÔªn¢e1EÕVWVÿõØ+�DÔ^¥Zˆ+¬_|ií_kHñ['ÀCËqmª®®­-ûõ"êV585ä1}ÝWïyckW×Жgd¼®SÊ‹DøÛ?į³Ç¥å¡/¿þÒ*"jU6 ܲ>Ëoƒt]¸Êqˆˆ®^l8×ËÑJéë…ù¹¹¯lœ>w1Ýê76EEEÅ&¼©ºÀ ¨’¢¢¢6ýþŒÕþü¹7c£¢¢R&GKë¿Û•vʾ õ*¢¢¢âÞ¹`½ðŽ"***Á^iÈ\Pÿ))6***j“"í�S½ sîí¸¨¨M¿;c%"ëiQãk3çþ•ö…u.^@XX+×xÓË0DÄôžz;%.*****.åOê®ñª±�/ÞI‹‹ŠŠŠŠK;¬>œ•ò…•˜ oÇEEE%Ù/@SM»+¦Ký§”¸MQcWž/ˆ˜–ß+^$¢«5É?Sž%lœ9œ¦°o—ô¦º‹!ë©”Äã}DÔý$ÕYÏ)Ÿ›ð»ÃgìGûu0©Jåø?b“þtj¬ùŒõ‚êOŽ¢Æ&ü¾êœu슧«ÞìU%EEEÅþéê Š2žµ·¹�ˆVm žœËVnذŒˆºZºn¹0] ên"òôYÆ"¿�ò@"j?ž¹íg›)¿?Ü̬ }6tj<‡‹GÞmå„nXã9Ô­=˜¶÷Œuy„<�èú™ºsV"b.¨š‡ˆe&…³~sè¢VU³•ˆ¨·AÕMä#•­�ÜDsàÔÞ”ýš‹´fCĆ•­5{SÞ9ǰÖn ö¤ëçNu1Ät5\ "ê>uÁJÔÛÐ:D(]7W}Àɬ]gTÍCDä·~%‹¬-o§ì­k·® ŽØ°†i×ìOÚkÿY¯«*-»¦õ*-[¼²W¹ÿx÷íw<ý®º”¿ß¯i§uÑ›7GsúZk²¯ê¥åÁ¡«ˆˆhYà† 3\ ‰hàÔÞÌã­}œÀɆ5žW/j÷ï=5Àò ö!""ŸàˆàU,êUý.õ݆nV`DD0§»ùxfÚ¤v¨�¼ÓºLú‹èÀ%C5:ø…•ˆÔ{SjÚ¯. öaºޤýþ”u­lã2¢>us/Ñ@«ú"‘gÄÍWQ˜ONs…bˆˆ8Ëoº±8+9DW¯_eÆ3ÞÅ·“âc½:t�ˆÈG¿ŽE´RþÇ"ÖÛk/]ïko¨io¨9¼á•â?Èü¦¹zxJòËßåP¯*iÛÁ‹ Ç›­6ȃiok‹úº®ëÔ­�ˆ³~s„gƒ¶UÕlݸÑÚ ê&Z%“ú]_¥÷TEÃuòùÅ�;üX̹·éõñ–—ÿ°Nºn‰¶¹µ¡—á´¶Ú›¿\hèbÖ^lî#Z# F+O€ÜÅý[¢öO<\øÒ+²žzOs•<£ÿXüÛu,êªHH>Þp¼yàÙˆ¥²›hYtaùîõæÂá„äã}³ÀÚ<í®B=[{‰–¬ Œ�ÊCׯËÎt±üÖ®dqä¯ÈÕ /.ÛøÊ^ž9F±Vm~íמògWÒÀ©”-{ÛÎ �tç+O%ï[%íò•Ì…w*Ú‰Ö¼R|@ºœ¬g~¯ÈnV*/Èë¸\ïþã—Sµ&ïëjï¥gYêŠæëä]X¹{=‹9wø÷Gº}+­•E,««ëV7÷Êe¬Vu;Ѳ�ˆx È �åÉ""²X /‰ˆˆ±vY‰h gÒˆ&ׯ^µ÷1pŒ\æ¸@pÖÉÞ(•í¸ÐÒÜ|JU¥ij>x°!âÀ4í5ýžµ×œ­ ÞàCûz/ ÐÆ`Y0µ¶6«/X—74\½5â±ÖÉ#<µšVUóÀš^{ÄÛèG4QÁÈô¶öQßñä��/ìê ÐµÒuÔÜÚÜzÁ¯¡�<ƒYí­í­Z›/­’npöÈkpß|Ö¬aõ^ì"ZøÒÿ¿~9ÓÕÒEDCšô5ã+öž`6ô^¼J´d�½Ë/"Øó¸fÖpLÊ‹ IDATïô»¢1¡žÍ ídz“�Ó’e�¡Ò_¼´ní�š³6tÓ ®z3­½µõâU"b˜©Íf˜îö«Dtñà¶Ÿ[võb7C�DD´lÍ*g%‡¨�±Ãô¶öÑÚˆµ,"b­ÛùÇŽ=É6.««¹¨jî�X¦j%Z!EÄX@NÈxœ•|¨µ¯»¡u@¾r¹µå�ý§ü~±#°¡ù*ùmX9~XóÚ¥SÇ7éU¿¹·ê"Gö‡?ÊýÖ†J׆nÜÀR$×]½p¦—Ù¸|š+È­Íÿ—oؼaIks³ªaykßt�ˆµV¾q™¦®U¥V t­‘GLIgö½®úEþkã1•µr9+Xº†Z/ªTª.Z²^þ‹eo·jN)U]D>ˆx¾5;þX*å\P¦%¿ÛÞ~ä]õ†âøñü²,æõ×¥>c�XËýXÔ{‡ÙfjäºuWœµ(/R+•ê†æÖî«í dzÏtçVÿáÙ;Ú}¯2mÛ»íä¹jC„ô×� ïÖÍÜd4ð×…¿/5Ç�Cö®ä,–ãGØ©ÿs}â°¯ÃZ+“úÔ¿¨nhàœ#Z††š Ëc®øm”¯!¢Ö·÷«.X­}ê¦n±7^ ¾%MMÁñºÐÝÝ\qDÝËY/œj¿JD?Ît×� *{w€Þææ>"ò \NDœõ›×/¡«šwŽ÷Ëo�xŽËQ둚n¢À[ Åò \IDÝä·nÝ:?«êÈ{ÊSÝ ‹ˆ–KW]Ô´_'¿ˆàuk‰.jÛ¯Ó² ñ\k­üõׂ—]<òûŠ ±–¯[IDW»¿uëÖ­¥†÷ŽW·[‰X+×ø]?wêCDÖsêæ±J<‹Ã""{#¸xÑñÄL»²žS®P]|ù@yíÉ� c–]¿ÐÚËŒe®YG4é:¥j'òùEqùwïܸnúÀÅZµfõö²Ö®[·ny·òÈ{ÊÖÞYöËZìCD]§Z¬DdmùSÜÏ¢bwj€ˆü¤2¢öwßi¾NË"¦íMóÆ)s ¯”½þëSIï¶7L~q‰§çøò%Áƒo3( 'ô%ùªæãÝ û·ýìmOOºNDK‚wlô›nõë­ûTëèBk7‘gô/ÖÛÛ™¬Ûº¤¹aˆˆ‚e3ô‘[+•ù?bÏ�·¦À•ÒøàŠý­ ™Ii’µÖ††‹×=—mþ­ý© >t¼�ÈgCðrkãj½Hä¹AŠ+€ Y)}í·ê„ý­}Ç÷*¥åñ¿’xfj[÷'¥4¬£–†ö¡%ÁÒWXÿ?{ïÜÆuÞý>‰qdïÊÝ��M¼H 4ZµDl¢×ÄíKN/Øq…¸ÂÛP½/ù΀½ê+$š‹�ÉD¤äÍrª%“¡nN µ/ÔK̽äÜ!§•Ü�êÀI¶-Ù^rzAÇ`(Ñ*ÅÆv–ŽÝ?’øIQ©ôùŒC»ç{γç<ÏžóìØ÷k}}¦/½ð¹c—žz8[¾L²Ì£O˜\¹2ûùÏ+O^]]¼´ñ}ó¢öeô�/¼øæ /+Ïtßyõ;oìªÛ´ÞÙÿ0¼ùÂI¯Ò÷¥SØ4cö0ÿ0\ùÎÿ}þמLŸ?s Ö‡ûø‡®(g>ï}ù¿‰b_ßÁþúÒÂç½J7ŸþîÊxìà= ÐøÀë ¦§ÿÛSû//~ù;v�¿zéÒ5@OU¨fzºÏø×Ó xäi2Å#„;ÌÝyú>Sß×Ï~å�»Ÿxák×0 Çžè|êÀ/OýïÞ3�Ö¬Ùõ׎ýkŸxâøÚ5 û{êS_ø†ø{M“d�<ó…Á§÷¥_VðþƒŸøÂ7þ¬£2ƒ|øÉÞ.°Å¯žžêm–è{ô÷į~âà#W^þîâ¥}ŸùÂ7¾ØU)œºóØÿD'ðèO=¨ãiáaoÁÿÞ|O€ò×q>ûp׿ñ…O=ñÈÕW_c÷À×ÅòÝ|ß©¯|ê‰ýpåÕï_}²ÿ�;ÑúîÿöàŸ9¸Þ|y9Íÿá—nüд¨}Oú¾ñ•ÞÎÇÞXyqaá»?Ú÷Ä3_øÆŸuìx¸ã�zŸØðfö�–“±G»¿ð…OÑ•§þüo_5þá§ŒøÕW³|÷=cD€¯d߸ú˜þðÔ×þ¸Û¸OYùîÊ•GžøÔ—¾~¼EÎoÃâ×?qpÿ5åÒ¥7÷Wµ€ïî1<ò4Yã$„;Íû®_¿~S;\¿~ýÝwß½vmçß™úNú;g¦¿Ãˆ}MSr;Jù9›ðÔ—þŸfOj!Â}Êþýûxà�÷½ï}ußï^ðº)ÞYû¯Ï}÷Ú_ùûoüö™Î;«þ_Ÿ{ñÚ#½õmñ¼O�@ @ëàuËÜ•k5›³Ïô´ïÔÓ»­ru5ôÿçË«/_Øÿ‰þf):�@ ·NúüŸOçå•—¯ÿ�±g÷/Í!B=÷еš�@ Ü&÷øµš�@ 4²ã×jÞ�g®�@ a7 s<�@ �@Ø;�9�@ �@ ìÈ�@ �@ ödŽG �@ {2Ç#�@ „½™ã�@ ÂÞ�Ìñ�@ aï@æx�@ �°w s<�@ �@Ø;�9�@ �@ ìvfŽ—ÏçÉ'ù$Ÿä“|’Ï»òyËÜ •'Ÿä“|’OòùÞüÜUÞwýúõ›Úáúõëï¾ûîµkת¿Ìd2ƒaG*”H$¬VëŽõ—ÛÃM#rDŽÈ¹Vìß¿ÿ�xßûÞW÷}ÓൃÜƹ/äöpÓˆ‘#rD®­‚×-sÏÍñ�@¸eîÖ�@ „[fÇçx÷Üýx‰D‚ÈÝwZDŽÈ9"w¿ËÝ&{Û8$x9"GäˆÜ½)× ’Ç#ÂÞ�äñ�pßAòxDî^Ô"rDŽÈ¹û]î6ÙÛÆ!Á‹È9"GäîM¹VÜ+y¼½ùïß”ž/þB«ûžz�þ¬ý«¿öÈoÞNá�@x�p‡óx«?Î}åì‹ZñußÓÔƒ_>öLÇG¹�•#žä¾Ïã]»òæ_¾pùs%Uªùþ›Òó4�7? ¼ùá�4ý›Òó»WŸ=<³ßÃM#rDŽÈ¹;L«àõ•³/¾ÿá±ùu`?òëÿÞÿð‡¾röÅÝ«Ï>{¸iDŽÈ9"wǸ£y¼7/½öÜ·¯ýÞßý»}î ®ú'ßÜÇ˼F²©«!×?ÝT% �ðÞd7òx[¯ßûb¤<ÁkD}í‡ÿøçž[�#Â{�û8�wMÉœüöµŸ´u>þ¹ÚYM6uµe8=/N,×_Î �‹‹b,·¥:N†N†S8'MãÕ[îØT»¡8“XLi &¥Äúwm)TK/.¦ñ6öª®m5Í©C[žðϦq}Óp*|2”ÜŽ`s´ä”8#o±ÿ_’ù×Ôâr¦i…rË‘ œŠS1YœY Å èCRÓ=´dÄ2 ½±òsbÂûÕØmÇÉ©gƒ’|v"QuDÊGBk1FnкFcb9rÒ?/…ž%µÅnª4ŒenNª•ÜÎ’‰ùOF¤™“'gÓ ýÝÙhóWKóž¿ÞÆV㢑D"€åˆx;ý§gý[JœžñOÌþk½1«ºG6ONIÛ«ø¶xo.…n3x©¯ý°e$xÝ ·¼pzÆ_ã7öo麛Êí>7’ËÅD±I`ØA¹ŠI+nj#ˆß›F®“S“³bp"(NÌ&U51ƒAÑ?kª‰åYñdp>­&¦Ä&µª?µhl]ÓøØjÝ,ërÕ!f©˜±rþ“‹ üÕ6j[¬µÔü„_ ƒ3 Êç#¢_ ƒ¡x�959Å`0Œ,f0`9rÒûµ¿ ='~ûû±‰“âL³ó½�åw÷·\+v{Ž÷ËŸý´�|ë—ðÖ›§¾õÖë>ìïxh_ëZeó�©/0ÜEßFu8ûð¨£úöˆÝ{%¢º{IÑ49Ojx·å©Ö¹¥ KÙm8ñšÚV³ÞœmÉÝ>´e0pT@wJî†X-�JV M~Á©…Õqbtxø¿4»’5½@õ�Œ.&]nœ aeI<>»¡¡7nð˜©}«ÚÐ,KS ˲tƒ…niŒ43&¢šâ†¦˜V‡�µ�:oá6ÜÝ?v4CÑŒž£ŽÆÊÏ.©Í\-z~¥�-ÇE#V« ž€Ï²EÿÝ1ÌO5s³{è­Þã�…eyç‚õ�wwV®–›^­²y$xÝ·¼Z€•®»¹Üà®Ë­›tçÜT•‘käp:6'w Œ�t]œ‹¥AKÎ-œC££#敳ñÆ%BœY¾¨wö™Xë` ßtÃÊ51æñ±uÌÝ&ërU!æ6J«gÝŒç?<p»Uk�ç"kÖ�Àèè ³´Ih¹¥Èyè ŒŽzÍËgÏmÎH3±ˆ¤?62::ì¦^Š,åÅÐýOÿ3CS�|Ô9èf.'r·7í¿1w} ì%¹V´\’Ü®ýøµÏ~«�²Ï¼«®½ ð('ÚÞ¿å.ÙÔÕ–Ó<œžç„‘a«*E"R XÒ;Žyí4€º™H.‚±Ç{ÔŠ~ÉyjÐéxøì’ª£d1 �‹‹Óx àÀR$²˜CPúáO®ÿéø—Íò„ÿ<ô«yè:îsÔÅHø‚‚ á¬fŒZó±HtEÕAŒ=^OW3/¡®D'’Z!_ä{NxØØ’’Ñ¢/0ùžœÍÏÍwõssSËW÷Ÿ8À¨”ÃsÔÊ6iÝ´LÑ%Ú~Ü­»~)ºp‡¼žnNKÌ„Î+ˆBòëPÀ&OŒË®@¿ iËå¿ØäLøüe¬ƒk;æu2±çOÅ>x€/bC�¯_XÍÊ£’±‹BEÌÚ=^»¡¾ ±X¹¶>'>^¸ˆuPDm.ï(7'Öæí¸-›®P2öžð˜×÷M$µÎ+±©‰‹´í˜×�Îù§é�1§´ÄÔxòHÝ N]ž_=2æ5#,ψó‚ϱ4µÚ7æáåùðÜš¦ƒÝîò:²S“÷X¿AŽ|æK¿ð×ã-Œ ŸB§åþ€‡WbáÙFPÈC»gСLžÎë7�– �Kö7ž-\†¢!ŸNŒõ5´ãxŽhóUEéÿåoRÙ·s³Ë¾~~%|vIÕéJÈØã=jeÍÞSf­P¤C8»š×ÛŒ+Ÿ—²Ø¼®µ9Ö€ÒÁFo´eg«LÝoA—þyj*kÀEÌòz»´Ù‰3kÅJßsÂ{ØÝË˳´Ô|(º†) A cÄ’­1E¿~IœLè�4hjžµx»ÙòР(„НüôÉ¿ù‹O¦j«ap¸úÁÈðzz=ˆåâb�=}–saÍpÒ‰ê¾×¾"F¸£v:9õ\D?rê¨!3;~Þ<ä³®—“H$¬VK*ì�jFa5�Ín_Ÿ -G"ñ @©PÔ;Nøìt¢<*AËèö(_P³y¶÷„׊RÕ½¢Ï¨D&£I_$¸†<–~—ÙÈ[û/Eþåû˹ÙΆ‰H(–C‘õ˜·}¥Òó=ÖDdN Š ¸|ýüJð´æ>¦­�‹#«–6WÚ¤¥Âb¬#0ØE÷Bÿ*œt)Ó1ÛØ 9¯íƒÈøŠ3à5çæOŠ©ÞS£]°ÓÂȳ�SW~åñu7kêÀZ#á\R¡:\4pæx^ÑlÙ¹M?ìsš T„€–˜OºGÙÚÀd®;µÐ§þ‡ôO?ɯ×Qo´o:@|£AT9�¹á ê†älxá"Îelüø³Þ~ËFˆÙNZj>4— !(ä�ÇGlÒøœedØJãôŒ8g¶ÖÅ8[¾¶Ø”Š?m‘¦VûÆz ›½àPk"¬ƒM„NŸßXõ Ú=ÃýÁ”j;Äml£²+?yô� ¬`Ðf/«`bp^ÁF§€ÁÂäcYÍîpýOß{ã·Ü.š@4ko;Þöv4¹‹Á«šÝ�ã¡}:@{C}öÑŸw>úø�·ÊãUÈIgbÈ5ÓXžñŸ•Ú@ïôù,tN NÎ¥,^ëð׬�“¢ãø”‰ù'å�Ô¬fv{MHK†ü1Y3Æ”Ãã³ÒêbpRÊtš.à## ­.O‰§ÏE–ø�€Ï€´DHŒ,›‡»ê£è>Ÿ…NÏúÏ®j§ÍxÜŸê¢?"}/éê3S ÃgE�€´ÄÔø‚lñ4¦©0ÇGúMÚâĸv$0j¡µTd<²lî»8—µ�Œv³Z2ä_hb-�ËÚFÝ,NÏ‹gãíÇÔ¥?îóö™AYV0m9ÜÁ«‚ÛŽVDÅÐ3ä¶Ò™D c€Ú* “Ó)¬&]}‚ñË]C;êâÄxTsÙŒ—Áí4i‰µ:ÓUhìÍ´Å=ì4àTÄ]êµÛÑi)íègñB‡«¾í¬Åi<Oif³¿È;úX,ÏGÖÌ'Nä¤àéùN_7%­e0$”›t‰,æ•eÔåe9ntÌ€3èô w�ºãJŸû3)Éø(ŸŒgÛŽÙ…ñ¬}(ÐÍj©ˆmÞ¹*‡2‹ñê¢Ny?sùÇq{—ãŒ{Ì' -1%F“fŸ…ÐR³¡ˆ”åÝ=4Ϊ°>+¢h8»&ÕÚ<—Õ(#»nœš‹V›:9æÌýzŸw¸›ÕSb4aì««&k3 �™�®YN–güáÍf¨u¦p`ÖáõšQfÞf5gFQIïø”“D¬±>‹YXW*ÃuÖØÓL)Íû^{i.¥vr+yÖrV.2¶#Uç V«ÆÈêöÙY-9%Æ”#n\0ô”Gut5g·Æ”Ýãë‚äÔÉÓXÀNËÿ¼¬²Éš^‘õê $˜€ŒÎߎ£&Îh‹§hû€·Û &EØèùùHÛ¼>‡Éåõ0º9.²³þ:éòB3-8Úóó µ«[Íçr` ?[-*Ùõ Ë Ö+)à +ŠfÁKÅvZ;ÓjT"þÈàQRaÿ¹”ÆçkJK =`~ªþ¿YªËíµ³�™#K�£vóz÷ y¶”Èãnvg’Šï�¥Ð[^[åñ*�àÕÀ¯Vö¶9Íñf®[茄_Ÿ Ëÿ|Jã g%ý±€Ï„rËó«šàæbIÍbÍJ«Œc¤Áf¹ZÇ®.GÎ×4Ü¥D×,'g¤sskñZûŸµÐé\šËÚG›†Ê,-åÛÜC;`àì£cvu³cÄÅÉT£�ÿÁó/ÈUοÛ^1©A©Ú½>Ún8·š²¹##^3Ê%b-�|ùÉ¡±£5ñ§c¡é˜Ìâ TÀ¨œ^C ¸X�¥*?Œp&F”�oC` 8jO-†Fÿdð“õÕ\w€;5ˆš„iŸe=Ĭ“‰mÄâÙªX\Ó7kcœÍX½32I©¼Ïl §/ÐUßâJ°Æ%~i%ƒM&5¹¢¨èú£íL~)©Z»he9•/7ÖBõf$/ËšÙ ©%¹€5Öü©ßY/�1êr „&®bçØÛÑä^˜àÁnÏñö}ˆ±î{kñxàéO~{Yí­òxepAÖô�FoÕkKù’ Ówi`h1§�™­lY`:xœY •�"h¥æ¦–¡Ì÷2\'B4Ï"@4ÂÅRAÎSær�‚…ÕA)¯`ã-X˜‚¬B“0É zhÂM“Ü:}ÛkÉ„`µèyÈ4>ˆ88/gUå\h"€‹ÌW2ÈxˆÚØÁ늵;a((Y5ûRxb ŠÆ¢Áåy|â›§ýïjŒÅéÙèjœíXOfaÚÕhÁá6· “ esH8Ì–[% —òWnš²5ù�úE ÄÍ c‡¾°ZÀöÎC̤¤d ¶y7ç åš�Âܹd¯(‚ÃCC@Ë)jîrd"‰pØ<ÓÞ¥ ¯¥@Öìcÿq9‘Z“Q—gc Ѭ¶�ZBá<¦X«ƒ¿ É™6©ÐáðåY(7Š6¶ë‘ÒP‡ÍCPWÔêê«ecçS5?;5�pÑy € ÍýçŽ$Ãâ´$¸XÀ•kã4 ,âkl.È‘Óqƒ'°qìßn45ƒJï×Êõ´Ðy9—NEkóx¾�Þ‡ó Ö;9@¼•GÉ–¦ÖÈ @šV� Œ�GÀ8ðö?ü ÙoXﯵ'@­ï{Ü¡¶âBJÖgÚzìJ|-¥¥»³zè—óx€�^OB4` ´žRæBçBy Ê­à9TÞ‚ÑÓ Ó!ÀÅú^¡¦^š®ÏãUé)W~ÒäÀ�Åã’ç¢ãç Àwº„õ�‰Ì.·un~òdô=ž.¾Æ Cå4 ŽŽbd5cHûªqŠ-›¦QT°éÏ'Rk röÒJ*©ií=ÎÐjT"ÆÌ#L1c­IßH½¼jE¬ÁH—UXÍc{Õ„Ž6÷´Ï�%Æ­Ûp¿7ä½³z Ák«<^¼êì;¼ZE¨f®QF õ³7p›–—5½Í€€ëêsàÃíù¹D†^»htô5þÚúl}æ`c È`ï3¨ÒↃÕÞÿF>¯Ö9@-³i(‹^‡LG<ö¹s§ýá;à|ºÀXÊC0²ru•Ê­­wþ«¯\Ö´éü[dõ[;·**Ad+#ËߟšÊ«ã#29O9äYqz^ð2¨²=.j€¦ÆùùÓ tO`3GÛ$0ÕžZüÛ…üh±6�çXß}ƒ¨Rÿ ¢Íj$r‹øˆóY¬w”+fáédõo¥ò¡iŒquA°¡Og³—@Åu$·š®Ëãm¬¹ ÁåµE£ãAš7ê�Pl·×¥DN%Æ`4ò ³Ñ‘ Ž�žht2z#/ðåëZ7ý­Áæ¤ÅÉYãv.—½eöv4yOäñ@GíÜÿZò�´=öé?°Å†Ô> ¿ý.zè�º ~û]jU³)b:ŸÌb«€p6‘§½J…‹yÜÍ"-«€a㦤˜ByKUV6][n)Gî±a©‹A¹¼`‚ªMÁúŠ¢ÙYZS’j©S§7"EÎa³ir²Àt¶XÜ@uÿ©u¦¥ìÚ#f/@î²\UÉÆ�Þ¤gK}>�™†Ürl•{ì1 ¾sY§e/æKF@€óEÀÙT#`x=k´û­4¨Éø ès+±ƒž¯þ‰ å$qò¼Òy¸ÒòÄJÁê ôÓZbÊ?Ÿ² ·8ï£y/^VÁÄ�*˘·°�Àu¦óKU»Ô÷f¬–Op.U`Úô¨§"þ¹UÇS±ÜJ’é3@z^<#eÌ5}µ±Cnþf°Ûaznÿ§ÏŒl: úÞ²�ÔùsÕ5`Ñ'ÎÓíÇ [�Êj�ÒX¤×óxЬ‚Àa%YkÕvM�_kó�ìÈÞSK¡Û^=øî;o?°ï¡º Þ»ï¼M=ô`ͦ$xÁ.¯|«ÕdødÖÝþ«�%1F:ŸÊ`‹ å¤ÐœÎåëvØŠgbÐÖxÙbC}äᮺ†HƒŒ¢‚Àát,ô÷ô¦Ÿ§ù(ϳP›‚£ ,]ÖÀÄjÙT¾$dV–á�/à©ØÁæ ½ /¬*šÕL«Š¢â²A3ÀyYscðú�ƒ±Æ7ǃ÷èÉ�|ýÉo÷ÙO¿ùÝÑâ;Wó?ÖôÝt.Ô>곟ÖnËÙ�9ÃgEQGA‰uëç@¬Ì‡B4Ò@p{¤­ßÒ`ó8’gDQGQ£�QɶÛx)21ųtî­«¥¼ µ«õ@[Ý=+ÓãbŒ¡ €u€LG<¶ð™ñDå–††ÛšÀò-t:ÂÐÊtXøŒ°>ù,Ïq¨ÝåÛêy"¬ÍãL�uTùÂxVès›ÃÓÁe AA#mv¶Ÿ�ˆ"Ã0,�ô@[=½Éи£Ê—Á³ýxêÄòã�—JzÇ1#ͪ|6:9ëó•𸨣t%ds5 \H_®í�Û-„O‹‹”P›ËkF4´Ðé÷é ÓÑ,]Ì« ¯ìÙ�ÇC)ZEX£{ºX -cdJõxZXÏd·a¿d ˜6N0�àr›CÓâ¢NWî�Ç€::ñÂ’U�åW¬HYêjç W¾QÁÕÕI…ÏLdõ,M3´¦j¬p¨-?®ôº90»\|hRŒ3*bèÜâà!®®¨K¾cfäðTlÈë±GÏŽuºR‰µëB¬¡§k):(–xç1;ǂ۱zf<¨ƒwø¸•åT^™®¶92ÒŤСldvÕ™ðú÷g¡¤iú^ÏÖgç§§3|FLè(„[տᡜÍm�ƒ ƒ �{ýMª± N…ýç:F†»XTmÏ2 }Ý-h¹N�æ˜ø\ÖV×Ñ*y¼ZhÁ&œ_˜šZbiÑ8Wl›ôŠ-@ú®ý¿á)¡þÀ±l¾š,׺½§—Ej¹çû°4=.Qº{ °V)¥2.<õÒ•¾ç×á fçü~!`Ù8:öHuod±¡èyÁÍÒl'“›lH¨í!÷å«_…h, Êy<u9\†R‰s¯KÒhYU'èw,R¿—–B·¼þ»ç™ÿyñêÛ¿¸úzúán^£@=ôà÷Ò´Á\í°å¾¶á¦>OÅWÛåv<ÅR¯VlîÁŽ/›QVª) ½n!<).R€;À%ÏŽ/ëte; uWÓå9|1<DÂ*°\ûac|ZFO£fÁë•K5—Î ÖÌg£“³è«©À¶ý*»•‘?uj<õxÅÈ´¡Ç¾ž Æt¥mózM,íêY OcP¢mÇ|­ñ5~hWZ+`¨ÌñSVª9µ�·rì Q¥þ7D›ÕP³?1~üxM|ÄéÙñ³ìñ€ÓqÌ>;¤(„5 v;3=).1”ѨYŒje7Ìè{ºòE6{ hG}„Ý š§“g&–)„‘àòšÒôêÜé`œàì7XŽøçÛF†»õŒž " €ïñ–ÃÆ†¿Å¥Ä9vòq2ÍØÛÑäÉãÝÑ÷ãÝ.Xžç-#­’OÛ Ï �À�¬„3‹RÖì°r %BâŠc¬ö”÷–¨Üìë¼�g:ÁúMÕ·õd¨»†–ŠLJ¶!o«ð¼Ûäñoï6 ,GÄùö‘Û{ÌÝ-ƒSáñ%LjGÈm¯7Þ\áÛ#8-I…‡…u18©¸·¾$CKΞCGúïÖ�#lN…ýqÛX‹çãeæÅ¨qè.uõ»Än¼ïv!Áë~ ^9i"Œ=·÷$ÆÝ'Cþ¥9À÷8=;¾`´àåõgóì`é»2ˆp:6›µÝ\]Óv£êw-95™ì¹�[p¿²ãïÇÛí<ÞMÓz‘5Æá¼å©.GÎHÐ>P½ Ò\±\.:-Æ(] z‡·&ÇæâJU¢í.ç6΀_I$ž.Ë©‰ù…•|uÂa·c'GÔ Wn¹ äg.\TŒÆõ<ÕÞs´»fÒ�ÓóÓ+´sÈLàt7’ËÅD±I`ØA¹ŠI±CI¼-x6�\'§&g'ÄàDPœ˜Mªjb&(ƒ¢ª¹Åò¬x28ŸVSb“ZÕŸZ4¶®i|l5ˆn–u¹ªs¥5P1cåü'ø«mÔ¶&Xk©ù ¿ 'f*”ÏGD¿ Cñ4uQ|vJŠ‰Ï…SY)ä÷‡UñýDnØí9Þ/öÓBò­_Â[ožúÖ[¯|@ø°¿ã¡}­wh•Í@¦¾Àp×í¼Ï—³�:¸ª/vï…êZì%EÐäX<©áÝ–k¤Z ç–.,e·áÄkj[Ízs¶%wûЖÁÀQa‹WpÞá—KZ-�JV M~Á©…Õqbtxø¿4»’5½@õ�Œ.&]nœ aeI<>»¡¡7nð˜©}«ÚÐ,KS ˲tƒ…niŒ43&¢šâ†¦˜V‡�µ�:oá6ÜÝ?v4CÑŒž£Žfí_ÿ?|·ýÌß*kÐÂÑ=�¸Øjæ{§{&‘Û-n:xµÊæ�àusÜRðjVZ¸îærw€».·nR$x>ËN¼éºÊÈ5r8›“»F‡Gº.ÎÅÒ %ç ΡÑÑ‘óÊÙxãêÎ,_Ô»ûL¬u0Ðã·Ì71æñ±uÌÝ&ërU!æ6J«gÝŒç?<ßÚ¥lRž@ž‹¬Y££ƒÎÒB$¡å–"ç¡w$0:ê5/Ÿ=—F,ò CÑ ¥·{=Bv¥jlÝõžIävœ–K’;µ¿öÙoáQö™wÕµwåDûÃû·Üåûo^m9ÍÃéYqN¶ªR$"åŠ%½ã˜×N¨+‘‰$à"{¼G­(1á—œ§-�އÏ.©: A³¹¸8�,E"‹9¥þäúŸŽÙ,OøÏ#A�°š‡®ã>‡A]Œ„/(ˆ¡ÎjöÀ¨5‹DWTÁØãõt5óêJt"©òE¾ç„‡�-)-úó‘ïÉÙüÜ|W?77µ|u_ñ‰ŒJ9ëz9‰DÂjµ¤Âþ¨fäVóØìöõ Úr$Ï” E½ã„ÏN'Ê£´l�n?€ò5›g{Ox­(UÝ+úŒJd2º‘ôE‚kÈcéw™�¼µ8Uzv$9rºG§ÞHc-¯ñ½¾£Tk7µ¦$O§#>³�™O W[CC¨Ôò¤³~ ì2Dn—¸…àõúÅK-§y$xírðÚ¨JfÝ>åůÆRY¹‰ë¶¨³ë>aM~g`ìy ]ñ‰º½GÍñ©%GÀg¡!=/Îñ'†»ëZ�“BÕõár‹Ñš†ã²›¢t%du{�zyÝÁæ|êË_üƒl½ĉ™ÐÂe (TRÁ€Ó±ÐÙ¦ ˆ =>�KÁÓrÀcÌÄÃg—4Š(æY×X¯2> ¹˜8�¶B�ó7ÿtæü?ªœ¿E®˜”·§¦c¶1o¥AZ­_5×Ï^rqqr™¢KÐîîçâ3-Œ<8uåW_��¦þ±Q¬å0bÎ%ªÃEg>€çÍ–� Årá"²ó9MP*B@KLŒ']�£lm`2×�ZèSÿCú§Ÿä×먷 Ú7ã#¾Ñ ªœÆÜpuCr6¼pç²?6~üYo¿e3ÄlØGK͇æR@!…¼ñøˆMŸ³Œ [iœžç,#ÃÖºgË×ö›R1ã§-ÒÔjßXd³—u±‰M„NŸß@T»g¸#<�Cm‡8 �mTvå'o ‚¾S € Úìeììuë9¾è6€Ž‚ê%ý½íÞ÷¶\+vwއöéhí õEØGÞùèã7Ü*�W!'�‰!W`ÔLcyÆVj½Óç³Ð9)89—²x­Ã_³@NŠJŒ;àP&柔7JP³šÙ=ì5!-òÇdÍ S�ÏJ«‹ÁI)Ói^¸€�Œ,´º<%^œ>Yâ>Ò!1²lîª�r wø|:=ë?»ªœ6ãepª‹þˆô½¤«ÏLI€ Ÿ=ÒSã ²ÅÓ˜¦Â é7i‹ãÚ‘À¨…ÖR‘ñȲ¹ïâ\Ö>2ÚÍjÉ�¡‰I´dt.k t³8=/ž�·S—ü¸ÏÛgeYÁ´åp¯ n;ZCÏ�ÛJg)Œj«€LN§°štõ JÄ/w 쨋ãQyÌe3^·Ó¤%ÖêLW¡±7Ó÷°Ó€St©cÔnG§¥´£ŸMÄ ®ú¶³§ñ|<¥™ÍJü"ïèc` °<Y3Ÿ8 �“‚§ç;}Ý”´–Á�P>lÒ%²˜W–Q——å¸Ñ1;Îd Ó3Üm@êrPŒ+}îC̤$ã£|2žm;"dƳö¡@7«¥"b´yçªÈ,Æ«‹:åýÌåÇíý]Z\Œ3î1Ÿ€´Ä”Mš}@K͆"R–w÷Ð8«Âú¬ˆF áìšTkó\V£Œìºpj.Zmêä˜0÷ë}ÞánVKL‰Ñ„u°t¬®š¬ Ì4@f>ºf8 Xžñ‡7›¡Ö™Â€Y‡×kF™yÿ™ÕœE%½;àPNEü±Æjø,fa]© ×YcO3¥4ï{í¥¹”ÚÉ­ä9TXËaX¹ÈØŽT�/X­V #«Ûggµä”SޏqÁxdÐSÕÑÕœÝSv�¯ ’S'Lc;-Güó²Ê&kzE:pÔ¨7�`NP�猄_Ÿ Ëÿ|JÓ+µvkhEÀéíIN†BLzG†Mk އռ†fK¸{{±poËUs Ák«<^¼Ø¡àÕÊ>Ã6§9ÞÌu =u>�/œ•ôÇ>Ê-ϯj‚S˜‹%5‹5+­2Ž‘›åj»º9_Óp—]³œ88œ‘Î]Ì­ÅkìvÔ:@§si.k l*³´”osUì€�³�ŽÙÔÍŽ'S�htþÏ¿ W9ÿn{Ť¥j÷úh›mÌ¢aîȈ׌r‰XK#_~rhìhM|ÄéXh:&3G†8(0*§×E.d)EÛ¼Ý5‘(bœÉ�‘Aå©GC` 8jO-†Fÿdð“õÕ4WâãN ¢&aÚgY1ëdb1e¶*×ôÍÚg3ÖAoÅŒLR*ïÁó›Å&_ «¾Å•ð„KüÒJ›LjrEQÑõGÛ™üRRµvÑÊr*_4bÚd¦ |æÆ)MÉ�¥²`²·ÝûÞ–kÅîÎñö}ˆ±î{kñxàéO~{Yí­òxepAÖô�FoÕkKù’ Ówi`h1§�™­lY`:xœY •�"h¥æ¦–¡Ì÷2\'B4Ï"@4ÂÅRAÎSær�‚…ÕA)¯`ã-X˜‚¬B“0É zh¹f‹ü:}ÛkÉ„`µèyÈd4Š@ŒÀ!Ày9«*çB1\`Þ¸’AÆC4ÐÆ^W¬Ý @AɪٗÂKP0 .Ïãß<íWc,NÏFWãlÇz2 Óþ¨F ·¹U˜-›CÂa¶Ü*½”߸0mÓt�Åx‹ ÄÍ c‡¾°ZÀöÎC̤¤d ¶y7ç åš�Âܹd¯(‚ÃCC@Ë)jîrd"‰pØ<ÓÞ¥ ¯¥@Öìcÿq9‘Z“Q—gc Ѭ¶�ZBá<¦X«ƒ¿ É™6©ÐáðåY(7Š6¶ë‘ÒP‡ÍCPWÔêê«ecçS5?;5�pÑy € ÍýçŽ$Ãâ´$¸XÀ•‹Z5 ,âkl.È‘Óqƒ'°qìßn45ƒJï×Êõ´Ðy9—NEkóx¾�Þ‡ó Ö;9@¼•GÉ–¦ÖÈ @šV� Œ�GÀ8ðö?ü ÙoXﯵ'@­ï{Ü¡¶âBJÖgÚzìJ|-¥¥»³zè—óx€�^OB4` ´žRæBçBy Ê­à9TÞ‚ÑÓ Ó!ÀÅú^¡¦^š®ÏãUée³2@; ÊÈè(„±Vo·†„ÁÐuÄ<7žìiÈZ ÁiÏ�OI#£öÆœÈÞ^,ÜÛrÕÜBðÚ*�W†¯:{ÀޝVª™ë^÷ ©Ÿ½�Û´¼¬ém\WŸnÏÏ%2ôÚE££¯ñð×ÖG`ëþ3»X@{ŸA•7¬öþ7òyµÎj™MCYô: `:â±Ï�;íרçÓÆRî‚‘•««Tnm½ó_}å°¦Mçßâ „†h‹¡qŽW "[YþþÔTÖX‘É9xÊ!ÏŠÓó‚—A•íqQÄ0�Kž‹ŽŸ/ßé2òó§èžÀf޶I`ª=µø· ?øÑbmϱ¾û6Q¥þ7D›ÕH$äñç³Xï(WÌÂÓÉêßJåCÓãê‚`CŸÎf/�ŠëHn94]—ÇÛXsA‚Ëk‹Fǃ4oÔ9 Øn¯K‰œJŒÁh䦶#³Ö#q2,œòšìu÷¾·åZ±»s<ÐQG;÷¿–|çm�}úÃl±áƒõvé݇tÔMðÞ.½û EÕlŠ�Î'³Ø* œMäiA¯ƒRábw³HË*`ظéé¦PÞR••M×–[ŠÆ‘{lX@êbP./˜ jS0‚¾°¢hv–Ö”¤ZêÔé�H‘sØl@šœ,0�MÖAË…Ôþ§Ö™–²k�˜½¹ËrU% @z“ž-õù·¤w ý—ŽÐøBœ©* §cÑUþÄXŸ2qÿxЇ°0¿ €mÀt‘ÃËŠ +kyÌ4myù4ÕÑñDâÜkHoä8£{°Ï„pf1.Y5 ¥œÃýBâÛõÙ„‚-(‰¬¾ƒWñ*›ËcÃ'ìÁhB]¿òç¡FSk@=Ài´–•1ßÉ™¬ y¼�Úê�(/çÀlÀ¹äæåƒML±Ñ¶ò_Œ™)$sØbBêeå¡¡ù7ê«Ñ¬_TÛʶ¾ïÑÛ�ü™s㑾îÂé…UþpÍo=�W‹–ˆ.¨Ž±a+­%Cþ¹òyjæ ¨ú^Á™­ y¼**y¼šÑÙ`·†„°<•­.ËÅè¼<Ò_“·ÀrLâù,Ïq¨ÝåÛêy"¬ÍãL�uTùÂxVès›ÃÓÁe AA#mv¶Ÿ�ˆ"Ã0,�ô@[=½Éи£Ê—Á³ýxêÄòã�—JzÇ1#ͪ|6:9ëó•𸨣t%ds5 \H_®í�Û-„O‹‹”P›ËkF4´Ðé÷é ÓÑ,]Ì« ¯ìÙ�ÇC)ZEX£{ºX -cdJõxZXÏd·a¿d ˜6N0�àr›CÓâ¢NWî�Ç€::ñÂ’U�åW¬HYêjç W¾QÁÕÕI…ÏLdõ,M3´¦j¬p¨-?®ôº90»\|hRŒ3*bèÜâà!®®¨K¾cfäðTlÈë±GÏŽuºR‰µëB¬¡§k):(–xç1;ǂ۱zf<¨ƒwø¸•åT^™®¶92ÒŤСldvÕ™ðú÷g¡¤iú^O‹ixƒÓÓ>#&tB€Œ­êßð´Î涇ΈA†APȽþƒ&ÕØ§Âþs#Ã],ª¶g™†¾ˆî´‰\§@sÌ|.k«ëh•<^-´`Î/LM-±4�hœ+¶ €MzÅ–Tòx[Û­¾(5¹Ø~|ÄaPrbd65r´ª8—…òòkööbáÞ–«e»ÁëÄ¡ß?ýÒ?ñΛéŸB!} ×½¹ÓÚ\#n[¨¼mvy9è´Ã¹XûHÓsB�cç¾¶á¦>OÅMÛåv<ÅR¯VlîÁŽ/›QVª) ½n!<).R€;À%ÏŽ/ëte; J˜óty_ O…° ,×~ØŸE†ÑÓ¨Yðzå@Í¥3ˆ5óÙèäìúj*°m¿ÊneäÇO�O=^12mè±/…'ƒ1]©DÛ¼^K»zV“Á”hÛ1Gk|!4Y>øí=½,Ю´VÀP™ã5¦¬Tsj!oå"Ø¢Jýo0ˆ6«¡fbüøjK IDATñšøˆÓ³ãgÙã§ã˜-|v |ØßñоÖ;´Êæ S_`¸ë–ß�œ}xÔÁU}±{ÆQ×b/)€&ÇâI ï¶\#ÕZ8·ta){ë3¬HV Û–»Üu¹u“"ÁðYvâÝõUF®‘ÃéØœÜ50:<:Ðuq.–-9·Pp�ŽŽ ˜WÎÆ3�%e–/ê݃}&Ö:è¿ñ[曓fYšbX–¥önD7˺ÍP4£çh†»�1]ϺiË`਀xþà6vCCSÃÐò\dÍ:t–" ´¬B;†N�:uêÔØ �C,ò CÑ ¥·{=Bv¥jlÝõžIävœ–K’w‹½ý*ú;)·‡›F䈑»3r˯ÿTçñöRë¶àÚ�_ûì·Šð(ûÌ»êÚ»�r¢ýáý[î’M]m9ÍÃéYqN¶ªR$"åŠ%½ã˜×N¨+‘‰$à"{¼G­(1á—œ§-�އÏ.©: A³¹¸8�,E"‹9¥þäúŸŽÙ,OøÏ#A�°š‡®ã>‡A]Œ„/(ˆ¡ÎjöÀ¨5‹DWTÁØãõt5;ÅUW¢I­�/ò=''fB —�¢PINÇBg˜‚"6ôøìºZ�4¿¤H…YŠËMÞH¥ÎßV˜†Q†Ê⥚–d¥ãäéÝå:ë*uýGôº%œl®Ð~´ùHM“bKIQ*Fé+µ5Íêmþ*Ȳ‹Š4¸ù`ñ¾Vª$'SÙ ù?ÉÀçéÎòrÕ`©Ïj T¥¯(­7i TTÏìØ�F�.+¥Ö•ìÔà”±¦´¦Y�Û^gËÚ±s5A*‹ëDBjël™;JV´ù°v_ãò�dSÒ÷Š sÕ`i¶Ð¸fÍJ©ÊÏÂZ´–Ôµ[óÓq«ÞHÓÌ&ùlËÌQ76fmÈ µ�Òü]E*ŒÒWhk ªµ@cªµE¹i´©¦ø°‘R8÷édKŠÒ0{óáVJ•£ªk0Pšt›®Uš½#@fö :ßþ�Í5G' <ÏR{AóbI¶œ¶êŽ´Û/4Öš2¶–dÉ�<]VZkøq6McéùEYe¨Ð6XrršêlY;JÆemjr,Éß:*äY;we�ã£Q[n ”MZaUÁ¶Õ©Ù¼[ÛhÉÍ[|ô/¦ìÂB5f=\\Ýj_�5*ÒT‹Ï×iÓáš êKrRÁ®ÛýÆasÉS�V4Z¾nG¡³ëX…ܹlë®§Æ„¬.Òà@›*÷4˜¤ë¶ÊÁã¤1d^Ã$8Ðn§Igij¶®N%õz7 @[í ”bHõ �uåV’ €kò·å¤ÒÆšâÚ¦­;ÿí¥øwS�j\°EØ�]E5ÈUã¤Ö†Ú š-%9©´é`qóÜt*×½T€m«=S9q¬+£Ô CßP(.�’œ¢’ ÿ«€HÚ“JŸh±Òii¤¡ÅBb4$¨2×=𓕆™JߨQì*Ò¨qP¡”P;hFL¦÷ã}zÓ±!ît¼é­j‹v<‘N¤é¦ Ýå;MƒÃý@õÞ´Ý�¤˜N£ãFbŠ4=Ñuzf<òƒÔ‡x¸dqÙñh§‰’­Râ€)ÒeT“ãJ�­Tâ@,Ra§í¨‰Ñ+�Ò• äjnñ6�˜±®¢0ÌzÞ*_€a¸‚ÀÃ1Úíqš5jP¥!Àã°ÐÊur p•Fê4‘À ã*x*FÛ™Ü"dK®ôªt�LV+ª€&0©JŽí0ÙHˑʲÚ ½ÕcÅ”�â€+W*Ü~ò§ÅFÚNT•5€@éNÍ+˜_ööÅÔT“Sà½ûòÌ�k­õ{Šk)\•�¯fÓñÆå6š í0ZIÇÁŠ2 €vb¸ƒÀ$J9€±÷½„r˜(Yf*òŒÜlzÍrG�ÞŠ_hWfçÞþ‰ýQþïµÐÊ °Ô¬ÜTRwS­!ê›·0L&ÃÃp iÊ:.(�,�H[W�Uwä�⪠r f§Tƒ&†JI˜|»„F‹áÕZ[Ñ„aí qhmë"MŠ&Ÿh·ñe·�öΚ2@»�pШãJ)DȦ‹6å¸�qÀÒr^z5ÛtP»ç°ªPŠ�^O»)À¤RMAž©®¶ô¨«ò”ŠÃoÔãkKÆm´”Íî•›J…�p�€Jµ0åJ™³õÌG—¯žžhÇËû:�E4Úÿ ‹h¼z½i´àg§6Z–�:¦QàßÏ<èÖà2‰¥®²ì†aŠNð›�sÚfë’ö[ öæÊ=~v<ï™ ¦Ê+̬­-Ý�+”2¥$XZVn¤­\E4IÐøÌe"}]ª¶¼Jõj¡ƒéõãõu£cCÜéxÓ[Õíx"�H'ÒMºs·½÷¸Mw')¦Óè‚ AòÔª™× Cw-™»é[38.”$Jè�a,y†Ÿ‚G K%.Ť*Üa°Ñé*Œ¶é¸J–g»ƒ^M`”ͩވ=L¦’:Ñ•¤É2¾/·7Õ6bù»¶©0òôn:íÇ|Ç¥*™³ÅBe8e1�žU 2%f1Ùiu*F™ Né*#jdâ&jÛ…»Õ…öN“O'Àdi2“[T ÆÁÞÜÐ*Ÿ;—‚O;IH“S¶v‡G Ð7Ð6£“Æ@ª�ʬ¢—Òq �- ³·4,.øÏKÃì:mùQ˪5£#×·8Ó K6à”¾¢ø°1s[:S7¾ò)ÖùtO¦”Ë•ù/å¦a´õt£II€ulÐËÌÕ&U⣕֤av]e]B^ÑêìLwu}, t[ è�i[†ßÀS(°ZHPÉisCå ù#rút' ir ñ¯îQ(˜h‚ÃSSi]'ie3:<*kK3½éØw:ÞôVµE;žH'Ò‰tS‚îö ­ÝyÆû_›Ûtß]™Óft<ðÍ”eó^[üºg¿¿ûíÏvº‡ú]”láøÎX’(yöû»'^+ÏÚ˜SµO«M�€‡ÈÞ¸A: -‡++qŒU~� £Æâñ2 ² ÕZm‚D‚јwgF,ÏTèjÊ*nwõy$(&2àéùk[ö”j¤pÒ €¥­+Ȭª.Õ�ÆãÄÒ1€P¤R•oÔ(¶>ªÂZöT©þ¯hKÕör9¶<¯(ÐQÓç«™9ÆêRm‚EuªÜ|uÕžÝÍ œ(puÎò£5Z­T*%pLxzÁzCe©¶A‚b¸¹T~üÕ›çÏ÷xdÙ•8A*lµå‹ •–ªRm‚$Áƒeæ1i]Òqùàîv�€ÉÔRSUEÃÖ‚¬Ú}¥»<"sc†Ï .t÷€R³ó3+Ѹ:¯P«²àHÃòŒ–«–=ãýQ¨ž–[ ®Ü£=��DF~öwÉ¥ª7´§%à±'­ü�³é&4‡©Ö竪ʵ§% TòErÃ¾Òæ„$Ì>�—Q°¦½ª|7&Áhùò5ÊÆ=Z­T*Ã1Lž±JRU]f“8.Å)òL[@Ú.B­°Õ–¼+wBòòG;ìù£™7™KÈó_}µÔ8TÈxêÚ¬¦ªòÝ žYX˜Fàyk[ªÊw7€ÏÜX$Ç)…³²Ýüåk×€§Ê=œ4Œêx˜:/_5*7lI^¡³é0§®¦²£)|MA†‰ëA]D£ý²ˆÆ»AÚ®)¿÷L¡ÚgFÐæƒ¥ûˆgJr²7fVí+Ý-‘`4*€Ô¬,éžrm“T"Ãp WeªŽÖWT48Žá´ÝM«&ÒzÅXôÈè6[àÙ~ „ýÆ®À ÕeÍŒÆTy…j WdUÕ–îN¶$¿P3aÝФÅ�kÆ ’Óûñ>½éØ ÖÇ!B„þhu?j©ðþ7m¦æé{ÿkûÃѨ�)hÓ~íaÍfã/X´ÕØ–’`Yiëi�M��.J_©mÉÞ5a?F3UäD’�Æ2‚D”Ö0ưëʪè‚È21F´¡²¸I�G ÍKë5;^ÒÐÍc¹yl=*‹ˆ67´e>5îME£ëÑmª)mÌÜ1½fÐÔ†àõñD;Þ´¥›ÆCéD:‘.ÚtFòŒïÍý†¨Ò1"NŽBy‚½·V]UÍivNØ Ù\S­ƒå[|Ïð™é0Bn¯Ý£m�$xèÔµ�»7ÊÔP×hñqÔYy9lf1´éõ� :R¸¾ÅáÛ„jM~¶�Ú ÷=ìQð§#›«ÊëlË ·ÊAà!O‰E¶„#–š±ÄYõûêÃÎ%ò �Ži±t‚u1Ò«rÓx˜ÇÃ@T§Š]WUcRæå]ô ÒÅ¢O„Ón� $ ³'»#Ó»Zì÷Î3Kþ ÀùÔkšdÄ£O„"Dˆà„àv¼¸«�>½KÑÇ’nM¤éáö¸öwì(7ä}h~­Ëu.Útl˜t—ï4¾iswL�ÑE Ó[8â�—H'Ò‰t"]|Ò±A´ã‰!bÊ)xÞRÝððÜ'¿Ÿš?‰]šÒøøÚÛÍö#~ofÈ×ýhþ³“ÒŸ� ÚñDˆ!BÄ”ƒhÇéâ‘K¤é&—ÎOÁ€Ï{ cÔ4]ìéŒÎ3�ov÷¦Ç袄é-ñÇK¤éD:‘.>éØ ÚñDˆ1µÑå:·¿cGàûI3fþ|ñ«S"„,®`£:ªÛŸgü¨xå_cÜ™0c;ž³íïM¥¿¤(¿÷“pççøêÅã ÿý¾»8ª#Ç¢aÇ»Ýqý—ë¿ß\ý/ ¹xBÍ¡ÿõ{HÁ ÄÅÛ}?ýóÉ0èDˆ!BÄ× ¢O¤‹G.‘N¤‹[ºã_ü™1Kd”0Õ…éö¸Ø<8Õò©°t܈“£Ð~‹uûßúï,Y5ÿùŬEe/Þîcm‚6Ö–5û»sصÚ;';m¨Ü^e¤íº²Ý�¾W &œ€>ÐVýi#¤A§û`Ò~¼(óéÓfšýâQÐæýÅeú@ e<Ýlåü~œ­Y{ƒVÛÈ='"¤)mªÑVhª¹¬ø  sa\È~t¤á`™vwÙnmÙA @ê÷ïÖîÞ­-®h`ä¤MµÛw6“ú -C¯hcÕöJÃøÛ�££ /ìÖév¿à;ØQ¨£³6o¯Ñíß¾ý 9‚Ö0*FÊP¡Ýo¢í�[¶ü‘GoiSÍöâúÊ_ju$Pú²Í›¹}ûöíÛµ5FÚ_àäií ºí/«Œ6]eqq•ž ]Œ ÒÅq§ãŸhà4¦›ÆCéD:_t³û€B=ëˆåõÛƒ6aIÙ0Õ…É¡àÀìÅÃÂÒqcRkÈ~Õ{Ãip}®Û¯~⺠p—ê[Å+“Ù¿ÀfÍÀÒrK¶e„]äYÛvfË}ÞˆžpÈ ',ejh4Pt´éáËEÛ›>j²…¯�ÐÝG-NÞt1À¤Ó�‰S”i„¨]ï#ä t´¹¡Î”±eç¶�[2ÚëÌ@êê�9[wîܱEݲ¯ÑØ’µ¹]–ÿRn‘þRɆàU愉.‘�|;`…Š1:\*Á¥29.•G²¦ý1&F\óRÉS* @¡àLŽI¤¸D.•â)FÛ Nuá®W_}õÕWK Ô˜¿À1BJR©—JdY…*[‹ÏÚšô™)Ò Ö#ÉÉÂô.EKºi<4‘N¤ã›±O¡†£–×þíßÅ€nª ³«¯�ãSÃùKy*Ù‚ ÆÂôE×õg?qÃ=Ä‡É Ã÷ȵY³fr~åâí>V5�6ÔÖ©vlK'u55:;€Û#ËÞX˜…�-5e Ý \[øT:¦/+Öå¼ú’Ì�UûšÈ 6š°7j÷Ð[J²i]MÍi;ž+×F6—þFm*+>Š©dM: 㙢ìTòtMÕGL*Áh•U²3ÝÑPSÛB&€”k 2˜¶¸dKm™�r:ÜŠµ/ M+Uûé¼ó&›£îpÆy]Es_¢{é"))É.x*�`Ý“÷àYÏä'|Tu �?ZX°ZNé÷Wµ` ‡3}kI¦©¬Ô”W²! £šÑ_„aÕÑN:¥!j÷XJœ¦.˜†¶ìúµG—$x@µþ)ucESvI‘óam�âÅm«ýFm×UúöGn?];aà´ñpUÝJ’àÁÒó sd¦ƒUõít¸íIßùÍË?µU×RJF“Z�_”«¢õû+ë;A"Á<$dÐæ†Ê}zZn:umQA:­Ûý†iCI�ÒÚXµ¯‰’HÜ"o×zKéØR’-{ƒv¶¥$ÓÙPuPOcàtÀò‚—Ô7öýØ)Sâ@‘"kK¡Æ4*RE–qOCæ®ÂÑQ¨Ã àÁ—çæªýµ{£¶¼Y‚{`yþyã~!,yµgöüQ!§§mص€¦ì4F`´Ý`‘¬ÌÃ@®^D¶P™¶ºÊ;†Ñn,}cQNxÜ€a¥/+5ä•Ç'SýÇëëLdž¸Óñ¦·ª-ÚñD:‘Np:s¿�ãS…zt÷µ]¾ÓƒX²©.ÌÁav‡C€Ä…$ǧ‚c#±Ä€ºE€DüÿåÜ3?د%—ov]u–W²S�Ó¦ýÅûtË·€,§¨HƒÛu»Ë댚Âôm¿O»®V'Í/)RaÖ†âòqÛ*i£ÔùÛ Ó0ÊPYÜ`¢Ô@Ó’ì‚¢tœ<½»\g]¥®ÿˆ^·£Dƒ“ÍÚ�€6©iRl))JÅ(}¥¶¦Y½-Ã_EYvQ‘7,Þ×J•äd*;!ÿ'ø<ÝyC^®Z¢,õYm� £ô¥õ&M�*ÀBBƒê™Ò¨Óe¥Ôº’�œ2Ö”OXª$ IDATÖ4«sÛëlY;v®&(Ceq=ƒH(Cm�-sGÉj‚6Öîk\¾‘lJú^Qa®,Í׬Y© UùYX‹Ö’ºvk~:nÕi€ÙÄã/Ÿm™9êÆÆ¬ T£¶Qš¿«H…Qú m­AµhLµ¶(7�6Õ6R ç>�lcIQfo>ÜJ©rTu J“nÓµJ³wÈÌ~AçÛ²¹æè„�çYj/h^,É–ÓVÝ‘vû…ÆZSÆÖ’,9�§ËJk ?Φi,=¿(‹  ÚKNNS�-kGɸ ¬MMŽ%ù[Gå@ƒáØÑƒn .“Xê*ËŽ`æ èT¿98§m¶ i¿bo®ÜãgÇ?s!499£d*jo�b¢À'2éëRµåUªW ÕLý¯¯3âNǛު¶hÇéD:�} ]ç¸/@ °ÔõSZ˜0øCÚ /êYäPOÌt¼Éü�L�<µjæuÃÐ]KænúÖ Ž “$’Ïpr ?oÀ3œ$‘L¸“ªp‡ÁF§«0Ú¦wà*Yxœíz5�Q6 ¤z#ö0™JêDW’&Ëø¾ÜÞTÛˆåïÚ¦ÂÈÓ»Mè´óý—ªdÎ •Eà”Å@zV%È”˜Åd§Õ©e28¥«Œx¨‘‰ÿ™¨ xlîVØ;M>� l“¥ÉOnQ�{sC«|î\ >í$!MNÙÚ%`@;Ü@ÛŒN©BF(³Š^JÇ�44¶€ÌÞÒ°¸à?ÿ- ³ë´åG-«ÖŒŽ\ßâL/,Ù€SúŠâÃÆÌméLÝpøÊ§XçÓ=™R.Wæ¿”›†ÑÖÓ�&%Ö±A/_0W˜T‰;ŒVZ“†Ùu•u yE«³3ÝÕõ °$Ðm1 ?¦m~O¡Àj!A%§Í •'ä�ÈéÓ�$¤É�Ä¿ºG¡ `¢ OM¥u�¤”Íèð¨¬-ÍðhQIÁ¨2 U`2•ÌÙj¡ÒÕ8i±�4¨•¢h‡‰5mn¨mU¼¸+7¬�Å¥zåŠÅ ŸÓAÛpy*¡PnË’eÒéìJæS ü&¡¿�ÕÊgÆ…ŒkvëV¾T˜Žƒ d…[g¤2Òq»±S’ž¦“*g.AkŠë.d—l]_VÙdÍÈÕÓpŸÜL&Z¡!À@¢SÚntJ—<¼fõOÖ° ‰×"*汈ƻ‘ž®:ÝH+4�«“©p‡ÁJ«ÓÀjtP`àvP8eµP´(}m=™½k[:N*‹ëh1¦ Åb d~ D® ´ã��2TYU²s5A[ B=W¡œ(ð‰w•Ô±fmÝ©�SýÇëëLdž¸Óñ¦·ª-ÚñD:‘n²ìxƒÃý1pלêÂäιb3öuÍm[8û;2r`R�B¿™²lÞkË‚_—¹swÓî�ƒ®¾Nµhöø*I"Éܹ{âµò¬�9Uû´Ú xˆì�ä Úr¸²Ç(På¨0j,/³ ÛP­Õ&H$�y·”ÄòL…®¦¬BAàvWŸÇA‚Ÿº�§ç¯mÙSªm�JÀI'–¶® ³ªºT?�KÇB‘JU¾Q£Øú¨ kÙS¥ú¿j -UÛ_PÈåØò¼¢@GMŸ¯fä«Kµ ÕE¨róÕU{v7K0pR ÀÕ9Ë�ÖhµR©”À1àéë •¥Ú Šá"äRùñW_lž?ßã‘eoTâ©°Õ–,*TZªJµ ’–™Ç¤uHÇ僸ÛA&SKMU [ ²j÷•îNHðxˆÌ�>ƒ¸ÐÝJHÍÎϬDàê¼B9¬Ê‚# Ëw0X®RXöŒ÷G¡RLxZn�ºr�ötBùÙß!$—ªÞО–€Çž´ò7j̦›Ð¦ZŸ¯ª*מ–H0PÈÉ ûJ›�0ûh<^FÁšöªòݘ£I äË×(÷hµR© Ç0yÆ*IUu™MFวÈ3mi¸µÂV[~ð®Ü ÈËí°ä�p<& .!ÏõÕRãüQ!ã©k³šªÊw7$xžhÇ›¶tÓxh"�HÇ^;ÄÄ]3N„Ùå:×Õ×öýÔü�Z#‡z¸/°ûÒþ)È5"NŽBy‚½·V]UÍivNØ Ù\S­ƒå[|Ïð™é0Bn¯Ý£m�$xèÔµ�»7ÊÔP×hñqÔYy9lf1´éõ� :R¸¾ÅáÛ„jM~¶�Ú ÷=ìQð§#›«ÊëlË ·ÊAà!ÇÉ#‚aK8ÂÑa©KœU¿¯^0Üá\R *áè˜K'X#±*7�‡y< DuªØuU5&e^^�ÑE"] ÚñDˆ1…ñî•_qçÕôÃã ÿ=™W&vÿ~`¸?OUÒ·ÎôþÏ'7ªƒ^V¼ò¯áö+ˆG;ž"DˆÁ ÁíxqW}z—¢�%Ý4šH'Òñ‡Í8¡€‘ü"ªtñ ÌÛƒ¶ó·Oô pEÖ1b`8ˆþƒ„³‚ò1f„ˆ‡[?=è¦ñÐD:‘N¤ébÑŽ'B„ˆ)Œ]­?éú¤3µâP”:'ø°û÷çoŸ€­šº�BòxEŸZ\*TÚ•ÛƒÂWbíx"Dˆ!bÊA´ã‰tñÈ%Ò‰tqKçgÇCÙ5£G7éÂt{\Þ°Cî$™a ³«¯M¨÷wlç° ÆÉQ(OLú­Ÿ6tÓxhñLwáÙKÄŒNˆt"�HÇÑŽ'B„ˆ©Š.×¹ý;BýVüg†Œ¾‰FžûdHiWxE3äë~4ÿÙp:7èö…ÚÉ íx"¦ :{ûnºg&%,�ã³’£’ÿ°—è²÷¿{ÒtÓ5%ë5šùwEƒH„Üíx"Ü×Ù›þøúß»úòo�lzïêËï]}ùãkoG•ašIR¤›6t~v<èîÌ ˆIæùÛ�Þ¿C²ã¹=® × aÚ2žì9ÍöÙ.˜¼£Ð�ž–ÃïìÝ»wïÞwŸ2ó³mLú­Ÿ6tÓxh!ÑU~ÒþòÁÖòc—^©oÛTuö‰7O=ñæ©mô!YÛØèúèÊOÚ7¾ýÅsï~Y~ìÒM× $q¼{²“ãü频N¤é8 Úñ¦ nÚNö0’_ dMø: }máö¸zܦ˜Õ¤Ž7„TÏÏ,ùƒ_,x&—ï4êú­÷¿DbÊ Ëöñü.£¨ �_ºµÊ—VÊ~aƒ^`ÇëiÜ[?øhÁcK’ÑŸ�m~,-ø·DÄzÉ�CÍæ–54¼9ûÞG–Í éë�½}ÿÝlÆ“ÏHK!’Ãè@go54|ñ: xâŒU*ÿvjt 笒Ä*Y¯kàÒu§÷£eóˆÿÈ]F|;öJ}54 ’Ä çÌüþÒ¹�,›ûÄ›§à�ÂïFÉf(B„ˆv<‘Ž6ª£ºýùó·}<¯ùbp¸¿Ëu.¼¾˜’œBtçn}òA§¶Ü�·¿c L„tbÒíxp9jÙ5'W˜~YCÉ¡^þsãN°âx0&LA)'}”s”!&“v:7{óæÇ–$À9�”ÄçKÓ{M-;žáÚ�¢š–çÞýRw©i2{¯°™¿é�Ôbº¥»ÔûÜ»_î;iê / Dß}è¬yÛýožzù`ë+õm‡Îš�5¿ûy'jçô™– �|z±§áœ¶ýdiÑ—¼’{ÿ/<ôÁ ½Sø]¸x�äÙÆÑõ ÐHÁ[ Çßzú�wŸýçWrïG ðÒyRÔ>ÏÆùÐE"]œÐ¡9¿ïd.ShtñOdž¸Óñb\4pе:ŽW·?h¾óÖ}†è狇i!É©B×å:÷ÞÕ—�˜_7’£©5"¼¿q5º�ÐÝw>è5¾ Á‹ö¨CŸDaº=®@e‰¿»æ�¡Þ ×x…yœG=t¹Îuû$néîkc̼a^½zÕb± ×��ð¾˜�ýñÍòúö”U+ß÷Ù^ÓÓÓƒ^#àëÒ¥KcÆãÑEÈeé¹Sþ—K¶[.IâŒLñÖÓdª8uùOIÚï¸ö4^qõ»XtúîÑ–®Wê ö;.nvõ;[ßk>tÖl²Þ€»“¿±tž4{é=?ËPzÛ©nõü½£‡£��õæ½�W†é¡ÍÙ÷~[žìûé¬dìÞ”$h5õ†7OúèâºPCÃóˆ„߬_!MßO—Ï#†é¡ ×È)1O¦÷*˜*£ë ÿýà—hÎÿµõFű¶é4ºÜ»¨":Þ€ùØ;ï´x�…z÷¾êÅÞÆ²ýØ�ÑЇ÷£µ÷bDÿ˜$o;ô¸MŸYky¶ˆ“¶'mï^a^¹rÅív£W“ÉÞ×ä´ÇÎ^¿9Žî9Ðãó>ãkgg§^¯÷þƒ×¿þõ¯1ãB£›*\oÖŸ¢††—ß5ôî³ÿü£Å )DòÝ@Àÿ¸ÈS’oÖŸî¶÷ß=rgËîýÑâ„ßmXy÷È�n{áÇ:{ûyûèÝ>ÓÖÌæ®r_çYÏá…52NcÆCŠÇ£(Êû7Žã£‘æv2e ú•h?°÷ÔŠM›V‚ôNDÔ±ñí/¨¡aß ²^rà¹w¿Ägì{öŸƒ~½¹Ã^~ì²$qƬ_±(eÔp�ü»íž8cã÷Ts¤Éxâ ôiß­»Ô{è¬9…þ,Cùă 8Úÿ‹þú{ŸwÀù̌Ųò™3“`Fºoö¿ûy'pD®ÝÑÖÈg–=š•»o€~¥ÞÐmï_ dz~cÄ]ß½©ê,|ðÂC!5.âkˆæûžO® §ß-ÙK¥Ìêìíû�ú6÷ÐpÎwR ²¦aÄ{´§ñxà 'åæS-ä’ÇÖûü6ô¶÷ �§ì}ýõ½޵õÙÞ68ê “œöÀ7¯}Úü4Y0Lâ¡;2ßíïØAõ{D .ßiâPðüÌ|¼Ú"Áô¶E�Ng{Wë�ߺ´iÿÕíÕíÏÛ¨6:·ÇuÄò:[;‘¸kNa2‚ÑŽ?Ù0Y¼=hctËìàë«Ù3üLÑO˜’�F<`‰ñ‹�0qŒ¿K¶�8v¬}€¼ÒÖC¤¥ðPð¦÷:š*ñx(͉|v’¯“B$Ëg'QCÃŒ!y¾t}ôžO®ÀãßMó*x0+ûÍúY÷¥PCÃ{¯¼RßöòÁV”èrSÕÙw?句†—Γ¾õôÜ ̃ޒõùì¤n{ÿ¡³f”6ó•ú6m½!¨‚¨°A·�o 4ºæÇËjåVðÐ0峓 ³—ù±É“.fébF×K\¸FzÿU~Ò^~ì254üÀ¢{~3v²(eÖ¬_ 笆kw"¡Ó›Ž Âèx¿;²åSý‘¦¦¦ööv›Í6› 9ñ­Î^‘6xÛ9öX®¹ç.YµâÑÿý‹Íëï1ÿOý1s·¹k0‰ G¿åÌ\,ï¾æm!ê¯ÈüÈq�ÛãjéøTg{¿ªùWn�+BÆôôtô÷©ö¿üáÒ¦¿]>}Ž!¸Ðý÷Ûƒ¶�Z3’_ ï2¾*Ô³|ßi¾Ú8¹’öÕ+É8™'a¼Í竌ÏýõB�÷9zo¿×±ý|çÆÑ}ض—êe»ã§®ü%®Fƒ{×å:Ç1ÿ½¯³ä‰Œïÿ£ód<�.Ô{×|óÏŒ ‡z»®]åÓÚàpPyú=U:®]®2>w¾óLHwíB÷ßÛ?sõã°g¦ÀH{týpªfïÞ½{´�åòr-‰^ô Jã±ñí/*?i�#bI Wÿ�æHýÓä,”Ï€ LÙD|éö6^AÚÚOÒçù]6++úá’ÍÙ÷fÝ—²tžt�|üP`éÛ«ïÌg{í½Ò7Kvã§—ï4I¿ZÈÜr@â|fzŸ�¯½îî…ðmîvÌ® Œßõ{õ{ªÀô¸Mï[þÝšøø’‘>‹Nö`kÿªóïaÏL¡‘iý“ıæì͹i=�ïÔÃcq�×ê8~üFµ¯3ä‚Y+~þíß…×ÚÙ›>~½Šûš¤3Ÿ_úŽ$a6Ÿý añÁS‹K¿¶…ÔøÀíqñ~äà¾}s%ª§—z;ãö¸öwìš 1C¾îG󟲗ñ�°‹ãyqÿÝ�þtÁ/…êÏ$Âíq•òØ>ýÁ·žy0ås·À¿8ÔăO, øô©%HX©õñbŽÎÞ¾—¶r\€öèÿÝlY:OúJîýÑèCs‡ý¯­VX8gæÌ¤„9³“¾�2ÓK\¼N:kFÚiÌâsPY¹Ÿ?¼ÈχÂظ¥÷_G/~Ùy+h@ݤEôq‹´ò“v¤êä|'õñï¦ñWuP8bô¦Y@u»nöwÛûçÌNš#Mž™4£p˜£Æƒ|v’Ý58 a¸v§¡õÆ…k$ §€¬ûRŠ~Ȫ䇇¾ºÛNÍ™�^¡ÅØ£—(;v ¹gÝ—òøwC+é} =ýð¢…sfÀg—zЄäsS‚6N O!aòGœÆãyAõV·?¯cÊ�6ŠÞ¶Æ(àŽl;eNºwÅ\bÉŠ¤Þ–6Ì_~ÚñÍ1TðØ\f/ßi:j©ð‹vcKðÍ ·ÇõA§)xl¡AƒÃýü£ª‚Æ×rEµ‚Â4ðuæ��àtÜ·ï\ëyïV˜§‚ÆpëLÑ{Ç'$p.º°%Æ�I&÷ôà#(žé7¹„IžùøÚÛßå(kdÂŒ“�žˆ¤·è°ügJTí­§øùË~–¡üY†òç/ú݆•eOþÓ�W~ ¼µ°…N/9P~ìòÅëäÅëä_[o:kÞÓxÅ×54$º}'MϽûåžÆ+7]ƒòÙI’Ä ç¬låéÉÐ�“¡¯Á¹ vßdÐð]ßýeç-@rŽ"¿qhtkw�+Ýï6¬\)u†TÐ|Îìd°;Ãë›àk¶—øÕŸôºK½H߸é¼x�l1ÝB Þ7nw?°èžŸe(KÖkJÖk~þð¢Ÿ?¼è­§xü»i0fÔå@s‡][oh1ÝB‰C6gß ºË½lN†aŒ®¹ÃQùIû¦ª³¯Ô·ýêOú�'ë§ɼÛÞ/Ÿ�ô» +‹~¸$TmjQʬŸ?¼Þý¼Ó×·þû¬Ù�Ž':{û�5ÿÇá6TvòWÒó¤„A!âäÇK_M?œ´½o$¿X§üE`Ê5â¡ÜìcÇê÷~ Ľ�¢0‡U¹õ>ðú©HJû×žŽ¥ �͖ʶ7’_=÷ÃñëUÞ쌥º|Ñl?Â3×_Ðíi —�w¥¬00Õ}�»\çNö`¾àtÜÕ,êYÝ}mš_ûá·žá©à9Ôk£:ÂÈs8EÝÀ¹è‡û/ßiºï®LAúƒ0)ÂäÖÐø,|ž 3÷¬Ù~d®DŶˆuý6h`¿,JDÆÄŽ1"¹õhúJ%CÿM!’ãÁÈñn;e¸vG3ÿ.agÚ¡³fÈùNêªÅ2´3>ÖzCw©7ki räO÷éŤ²>°èžU‹e�,›‹ìc®“Ï;aÐ`KÙ‚èjtO¼yª¹ÃÎÝsdÇ^ Ç–¡|ëé~³~ðP;é„Bßýܾ/ŸÛ÷%·•òÓ‹=È‚‰‚‡ðȲ¹¯äÞ�þ!c`xO°^r)x9ßIÝúØ}ï>ûÏ[²—À—¦If¼Ñ±!º5ÐOÚÞ¯2>’c<¨Ú·mlT¨¥“ý”± v<àçQyîÖ'A¯aäŠ|ƒî‡º~‹ödñpã"²c4Û?Œ]P?[ï½ã³-öEgâèt¶÷7ñQ¢ãÏÊ�Ü‹®ÝyÆW©ˆ“²¸ $ðÏ  O°Ááþºvù‰ÔFuð�œô}~#ífuûó¨ÿG-\Qq€°o}³ÉcF< Ì%]7û#¡ £’‰6»Þ�'žtÞ¦|Ó�ø5l\È<Ømïÿô"ó‘RKPöÿ@ŒfŒ p×5†ÛûaL�*¹qÜîšÈ­1T¬xRŒe( Â>‘†¶@Ž5=b¡|0Ýn/�ôü´z4Ø‹è�j�l€lhî°#M©ìÉzâÁ)D2µ“‘ŽúècúëÜj9rI¥††?»Ä¼¿EtÈR ' 'JoËtè ‰P‘}uQÊ,I⌛®AþîšS}�¢«ãÁ˜AïìÍ?ó¼>Tmn-+¤¨6?»JÐSpà·MçGÄÈÅ3ê†'º\ç‡û‘%$n\$@þll!—ÂÒÕÜøÌFô¸Mah,!�ÎÜo࿜#§cÿÓŠ Â6N5ö Áíqµês‹‹ÿ¹Ÿ™Iõõ‰»C†8ží€‘V,>à/ÌCgÍï~ÞY~ŒËÎ;ó[Lº‹LKX( ñòê°_n^ÔÃ.;ßÍÒTߣ†‡¨ëx08ÜüzÕ{W_泓ˆU›{ Îfêa„_S|ìxAM…]®sA·tl\ÂVBG#H<ܸHàõg;Éd+–.ŒXÊ]cá?:¤*#³} "Ì~F<à!La‹¡Ç~!ðñæåvÅ䌼g¦‘¨ÀHg£:‚nyöãAX ÿÑ!­>¤°‘Ðq€¡ ÂÖ]3ö ��qþç©ó>ÿ™ùÉ�j�í}>yVB¥;by=BoáàH^òèc�.I æ¦% �ƒ<ìOáÝz¯Y€§váuÒp¦±å¢=)¿‚Ù�ÍàÛTP0r!ýp¡|¦7uJà5H-a³ã�]3HÇíä),¹qs¤ÉÀ"ÏQíbìÈ :|ÔàNÚa€Œ›{žthAu³ëxh& Áú‚ÃÉS¯×£÷Q<$—‘ºœØø¨ž·�”§0ûhï0‘§%#�¥MrFUP¯×£GÁÒyRž= ^Ý›çèPÜc ¿.·Wm ¦ô5lÄNǃ1ƒÞ�ZŽÕ¤«Ú||Àxf¶ÜÍó<çp×t{\<¾³q ¸=òjŒÍö#“~ã"�Ÿ#P��ŽÏä‰ÄŽçw¬ÀüGçµ7Û�„Ê„5= 讟v¼È‹+ „43Mâ!�‘…ü õkjjjooG¯6› l6iÒÄ;`³u·7~ysΔdÿ”å5===è5�¯]öþA×­¥ó¤<¯_(Ÿ9èºuñ™šš*Ûk·½ÐuK3ÿ.¿÷—Í']·.\'yŽ®o€¾và ’¯úü>� ýÐ|Áħ?Œ\­Æ.¸kµ|1èºÕeï ¼ÆÔ}f 9[–' @{§ÅïýÔÔÔþ!Ï ëÖi’ òŒÆ<ñ{ýÆ ½½=�ŸRƒžA×­™I ÞÑ…ÚþÂ93]·z]“5:ôÚl耙#}³’1¶k¸G7sÀgúvÆOÑL@³Â÷}é7)èèòŸ'ht7¬VX0“€‹æ�ÖÔWî;’Ä·7{I^²åyïÐ3]·ºìýlW¢µ©¾kšÎ_e�Ñd‰Çý øŠfW×Í>¾£»Ù?躵láߎ|æ ëÖ¥ëÎØÏLïD1ÕñŒä™?\Ú›†AHÇg·ÇsG¸›çy Îá®i$¿ày.ÎÆ^êE†ö}öX=nÓ±Su‚4ËÂÎ?;F ³®€t|&O$v¼ÁáþP3ëð�W«ïq›ÂÎß#ˆ0yæ�~ /W�n�Ë»bÿãN¸‚@Ò\v½bä2Z�°D1{᜙^¹ù]s³od³ÆÂñÚÖÖ†ZCãDª¡Ž.ÔW�1»¥ß§®“###HJhtÑ‘ £ \SfG?Ì¿KÂø)z=þ<ǧóî–€Ý9øi/9022"IœØå=0ߢG‡æá¿,Ÿ G?ãX�möM†5…f¯½�çÌä#½‹×È‘‘‘œï¤ŽŒŒ\ºîd¼�W>;iþ=8Xì =×ëõ×Ü3 ‹Þ Y6Ÿé²÷óšÏËç~ïÏJÆÐS =Áb³îø¿ò_wQÅ7Båîf¼Ü˜=Kž*·šxp­ò’„Ù¡~1ª¨2>Çç\|«¦.hÏëLZn·Oüà[Ï0âãÙ=,‘>˜§*‰¤„3½ÿóÉ�jïï¿ûÑŸ.øeäÍN >ìþ½ï.ŸHLyaÙ¾(qíjýq”Zö"C¾îGóŸ¼ÙËwš¼•Ùa²ï¸àb|né;w')Âûîå;MÇoT=³ä±š¹=®rCŸ+‹Wþ•í£ÿj{<�ÊÉÅS‹KÎþŽï;3gΜ1cÆ7¾ñ ¿+¼XA¶;|‚L{l}vZ²P}eÂgºÿ»Ùò³ å.às½áÚm½aé<é+¹÷ Ò�æ{ù±Ël >ýöî¡á·ž~€O| Jøéož€^x(ð#>Øv@ßmïëéºì}l.ªi¹éü݆•lޝ[jZìL„zâlòüÍáó—®;KÖk|S›†„ÎÞ¾—¶Î™�TY°*Ò^F€Èo G ë¨o€ÞTuXæªW¼ïž4uÛ)F9s4�™†êOn}ì¾CgÍA»ôøwÓ´õ†ò™eO2¸œ ¦6gß‹ªžD½äÀsï~‰'ÎØ÷ì?ó¹~ãÛ_P,� ïÀ‹NE°ýx…�I°ãyÁhЛ\;^ÐÂe^ðIj¨àñ?g4,ðïW¾|ÌíL”@Ó—'i–'„�'~ÄÈ¡^?;ªPtà3:·Ç¨ „wÇ9èx¦Åç?¡Á†§²úJæü­ÆºÏö†ÑHØ8ûw¾…ØÎøg(…¯�onöæí¾øÅ“KxxÂ{JxÍü¿‚r»ÿåÄé0èÁ½‹Bf‡›ÎA>£ëæ,]€(÷Ä~äò«À˜ÝžOJ@F=S¯×s÷\XõkÂ(´qG KÇÒùVr�Ž#µ&÷Ñš �ÊÃtÆæXP#!£Y˜ÃŒ>Âô=þàH5éÛ%Fk6¢C…¢QýÜh~qöË Wvqꜣ `ù)ÌSw!D‚¸Ðñy:}|ý�÷­øv,y}Um·ÇÅ?|.hƦÂ8–&‡zOÚÞGÿBŠ™áàŠ0¢˜6÷ õ,akIsCÀ3F…ÁÏQ(:žµ+1_|r£šÃ5ÔFux'0ŸÑ1:'‡wÇ9èŽX^ïêËA]1¹+ø�¿0ýÌæ<á'„Áù]a46î¾—ï3œÍŽÇ?©&|mìxá!f·hg³P½\�Ö�•ƒ­ö·×W“Ïè¸+kyÕÅ ír¡ä"^ŒÛ¶ÃF=3===ª5Áü Ôñ¡ùµHÜñÛŒ}æ~ƒ€uƸ!¤�éNù9" BÇ?¥Pó䃮ß2®¦³7ÿ\Ýþü]»Ðýâ3:ÆÕ^¹E6ºËwš‡ûQ!Mî‡@H‡ü…aèö¸‚*~~káìß¿;ãh¨p{\çZùšRÙŒŸ¢O(„ñ”¯,ÚÉñ9篣ã§h;È'ü/èXÐþí5¹È5/7Ú8ŠôÛ¤rùsàÄçg VÅñ Êü�B�ŽÍY1(„²O-Ô”Žm ÜGlQs;uÆÄ‹ Æzâvöx<ˆl!Â7ö�Í�&Ž—Meúû?þ ð¢à3º 1™ü#D;^\`Öbººýy]Ä…•xÂWÕµx4‡NÈöQ,�¥¹¹Îßj¬2>Ç–†!(]UŸT4‚@À36ÿI_^:þ›i¡æÉàpÿ{Û}UŽÛƒ¶÷®¾|üzø„íñ²ã±8'óô®ô�wÕ�C½^ý“Ü•üÀ_˜~ÆùËwšªÛŸ?b~�[gó“ŒB=ëdÏþÝ‹Ý}m!„øNL,ô}Fˆv<„ñ”/ ]ÏçáAÇÂadðCxÏ[î#Ì]tÄ*¢|À(„ém¾›ŽûhƒÍ›Q±ð>à1Ç�–ÅfF !<ƒ6×ÄØ?¶X;ßñ²y™&Ï] ÑÆóv 1EÅózµ“ÿaÄT™™Â"ît= Ý}çù�np¸Ÿq�‡ä.Úñ8ãƒÛ®ö ‘7ÂÇ�ˆ> þ7ª]°F€ÓÈà6;ž7û(c®…þA7Ež@QŽž ‹¨Î“ÀH°)j¾èâ!ÜŽÇâ—È�ÉZ�W¼Œ!‘È Ù—Á‘¬…‘Ž~ÓžM;õÛ¹ØvÂ:% =]—ƒ^Ãm…±eèUˆ)º"DÜéxÞƒ[¤�DÛ çUµÃ3@1f/dÌN�?v<äwþVãIÛûÇ}ŠÝqƒQ‘CtaçÓž‘°j/>öAèøW­|žµTìïØqþVcàG'{,\–ÊýuÅn~Yk½‹…Q˜Fò ?e£Ù~„Ñ€ªú’0É¡Þî¾¶î¾6ß%Ì¡³ª¸ˆŽCAÝý†�FÇ�5'D·RÑŽÇ�0ž<7²~@[Ì™ b×ùGcx‚…ÿ�z rfºç‰@IúíYÑ&ÕïMt–ÏÝ�Ñ/NÜ"‹¨ =ç¡~¼V#Á¦¨ùíÚƒWƒÒ1j,AAÙ½�éÉÛ+Fe‰;ÒÏ‹~j aúM{ƬB~ãE×0XÔï^1© ‚Ä{ ûVÐ+¹-¢JjÍ)º"DÜéx~·È ½Cq¯ªžÊHž lãh*®ìx~8«±ÕqœÏ•ŒÛzD'Ta† ˆAÁ:ß±DN˜‰”ëâΓÁáþêO´Ü×p(r=nSÐåi£:>ï9`$Ï ÇNFa2zJ±¼îgzr{\¡9D˜l:c`*œ¿}"Ú¦BDuž†™…GÇ–X2(„-ÛÔ¦”ŽÑÎvzjæ|ð)çÀ‘û}!x…Êó O�÷,âs™PQÌÇ“<’l½Q…hÇcãÁíàpÿñëUï]}9Ô£ñËwšŽ˜_ÿÐü[°RµQB¿0z‹ðÉ�j¯ Ê×Ïv<„÷:¶sæ±í\½t¡†5†¡ÎH¸µï>rº�œ�co-á9 jâæÚgÖZ¯�‡û�Z^&gú¢3ÞÚ!áÕüJ˜�º%£mÖKíüC¨Þ]¨£3’gªÛŸÿÐüZuû󌾻ÜíxˆñÁ-Ÿh– àï`4ü�;_|H”¤_Ù.ÆÐ¾ n]lD’ü1½í BÑñœNAé�ø¤ça´9Ç¡éÉoi0ê<<ý®^6@¬*ˆ,�ãäõ+Ü&}þžäB%)¢�·(©:ƒžÛãB„ó·÷wì`ÔÓÓÓmTǦ°º�€TP·ÇŽ!Žs;ŒíÂ9.`³RúRÆÀ]S¨3n_5o¢ÅÈéøãÁdXKºûÚØâ#)³µZ± ÐAºz‚~Ž'ÎØ¤]v% Ç´…ZFIåÇÕ•J6ºp4–ÔèÒ†i¼.4U½“ðiPü+%#-tdÿJImÑLÂóxY!Ž·Ñxè)×÷™&ô"±é´;$ÆG9éö± _ìæ÷ã[¤Å<0¿±Éò›5—´—´`Ññ!R%É —®òEì<Ï…d 5[2tõ<òËž}ß;s'úÇ+&ÇQÏ#uÿóË£O xLã‰ËÿäžÄI 3ñ=d¦Þo"N×zÉvoäâ)ÿ‘Ľd\WsV÷ÄšêçñÄH’Qpô#žK¸‘Œ‹Ö’Ö‰QRI¦�íä¢3Iô–îôß4Ezú‹%rÖ“´Ë®„áOCIåÇÕ•÷ÇKê ÷$éÐ)åò‡HOb0•´aZ¯ M•T…‰º�ì¡•º‡IÒÓ¯Ø˶Rééç+…}Ùdj‹fÒ�9�§Ð^‡ÜÅkà¶—lw÷½ùþµEoI<~tä·L¿/_ùm‘¾üÔØôóKÅÃÒ"Y½dû#½Ÿ/Ò[Ê�«èƒi_NK‹;;ñâÒ¼UL‰¹èüÔk½d{/Ù¾±x×ÿbÔ$ž•f�[×ëìÄ‹ï®ÿŒß`!‹·Z¢½ËÙC_¢å®é³¶‚M'ýGXRJ"i ó¤ÿÙ»V|™e ‡Dœ—º$—Ãé•Ñ'¦f¼wU}‰mY¼U% q"¥äÀ­Q¯ku�šUì CIÂxr—’䢓‹ž¾�¯ž¤ÝrMÝÓqÜûI²•šz<—?”Ø”ªª¬³öx�ÃSìýL…™v±êv&F[M+³µZ± ÐM­ÙZÍe#x©”m5S-Öy�?͸�ã;ÕÑ;¿tï…rñNZáõx (ëúxÂnÑ =×ôY×ôÙÓ½¥)-N°Ñ<žHœÈ×5“¦/¼‘‹IïŽJ2F±ëEÎø–­õ•}ãÌãqÇ�›<ÎÁUZœTŠÆC½äëÜ÷ÀùºfZPâÖ�PUN”»íàÁÓ\—$ øRöÎR¶-žá"Áûãe—�þ˜¤äô¨}>!ûq¨', ¸ˆoš2[«•ŒJ’Ñ;4Æþ¦qÚ]æRwöSÞ;©¾ÁRc„¦Uö×L9”u}<Á·Ñxèñ _?äú¾28aZ\óx"qb¢k¦N_ô’íþ ý_ñc$‘ØtÚˆ iõ§—~-$ ¸â‚?;epr¯ÄKÂI¥ScÏqßSLØöÍ6Óâä–ºq׉tŸ>üh‹“Ç üb\�'ŽãÜG (Ia»P -Òù„Ô•fi—] á̹Ä÷O’ºgK2V?‡•oÜ%‰w\v™CR²!ä´¤§?íÛÅ´ÐÙŒS‹iWE¦JÝ5“IY×Ç9pË7H¦Š‡¥Ü51¯k¦�¾85öLUü ¯¹µ™ånÁ ’gPMÈ‚g‡q,â;w�ÃÎLâÔt±fVáD¹Oœ&kw×eFBKÝq5Ùq‚çFÒ*©$Y^H˸Õ^ª’‚µtyH³µšKÔ©$U=I]i–vÙ•0œàuž’xÇ}È€ .ižGð”o87[«/Líf£‰µŒ ]˜ñ¥e%¿Rý!³µZ’×>¹ÈVf2[«Ù;f²~«È-<�—^ê'¾¡æñÈ_bˆ|îb™¾8:òú ~Œ„W¬ËÁn/û^,rñŸ­Zðg‡qRáÄ,Écy#” '·Ô‡B–¢( ( €°ìlÜUWEÌÌ^=’ÁF£Q‡ÃAæhçb³¼ÒÓÖR@L¹{ü�¨€kÜÃcééö‘"óÑA¦ƒö”‡#ñÈÈXŠˆœÄ4¬æ¹Ø¬ËBGfgfhË~úÜ9˜ †è#Sî‘eÈË&y'í³K=ròäIYë†TÞ%¶¦^ÏTi!S»kooϘåƒò¤(ÊåÅggle&öÖŠê ÓG.�N‘žþ ³îZ}Ι€`˜Jº*c=4´s±Ùp4Æ^&\ž]ê3Zb̺µ†£±¹Ø¬I¯Mõ.ñ>ƒaŠôô›¯oe²Z.íŽK ŒÍÎÀÌŒr펋åÞîdUÖõñÔ=N|CÍãAÊžÑÅ2}AÎøÐ^Û Ïã-]“/ÌÀóx7ø`ssóÃOü�º.=£ ��dL“Ö–4†<€pm¢ô‡Bã#¶R{JmÄo¶V¿Ùu^¤/ñ€zúØSÖ××'ñ�¸iËDdJ“j§|Ã0<è¢�h ybÊ�¯MòNŒM-óÔ#毌w×`Ê;œ1%ïP>(Ot$<‘Ù¯‚øœéîM, ³µš½”] 0摤l¹x—š�6⺵ºP/»®�§¶&ïä³\Ú—RJmÑr·;.–{»“U9óóó¼.˜ŸŸ�Çã¡Ðu¬Û•_ª—ä†F{ƒJþŒP1.\3hL_­{ŠoVO^ü.˯[³Þò/5Ÿwˆìæý¡ÿ«nÎïÑ!ï¾RûdÒ’ƒq|A‚…q²ân+ozû²�ñÍçÌøQ.›.¸w Žûøªm›�˜L&�F““““”2í¯p8LÎË»ºË6ålyÔYÝÔTuâ¡?^Ö–¼ëÞ=5ô;L”»íÑ6ØÙÔXcÒy¸¥¯æÞ=uànûÞ£Ã÷=ðér‚<ÝÒÒ_×ÔÄá=Ͻ�€C÷íȘ2I‡Úÿ癿}òïÜ»}ßkÜÀ·Ÿk?õÆO¿ð¦ð0�ÃSßmí\g-üΞ�≇#ñëýPûàÓ§†>¸my¢³IÓ¦aò¥ÇøæîZäËý-ŽsgÏüæËÊY^*%y'F‰…yÉ|àOgV”æý¤éfIpÂ*§$Þq¯N\pIOœcUI½‡½� =ýýѽ‰É’J)‰Å$Ž÷�Ñ»´8.þþ½ÛÛ|¬ÿöµ–ÏÝQAjvß#'S½“O�ÃS_~ø™íÛ¶°žúÖ{,.K\ãÛ/âòJ䩱#í'xe›$¾û: ½f‘€ š�5Ïã$Á èäOFG9¾K¼àÞ-vÜË/¿Ü×ׇ¬Ûí·Û%©Èìà›}Yht„¤€>k(/Ÿ<û' nw¿×éìõ��Qªï’×ëéAiü“³åv™òeLÃd}çO ¾–ï=ƽ¤§ß{Ù#‰/S:ŽÄ#ã¾Ë´eÊçòeLOx¹ø‰¾HU’m’wblIî4¼v¦—öy—˜æ…^–žA™ò…fbÊxG·/€ÀØhÒñTû—¿ü%c”ÊÓívwyÈÈ”o}¥�eºŸ¤òt�…"S>chˆ½>§Ö®´v}¥92åëò�ìeÂåÙ¥¶¦Ô{HM“Z["S>¯ë¼b­Àb&|çOú§£"¿+€ùûA¾vÇÅrow²*ëúxê'^(\–¸vnò8¯˜ç&3÷ñ¢ñeuqÏ3U.žS+È»Á “oŸMÀb<Èšg‡qRáøŽ)p_ü™ Þ-jA´ESyÈæLŸmin>îÓÁPo(GŸx–¨Ú¹«¬ïŸýð¿}é›ßj›ÊËÓ€Aùq׳O>ÙÜÜüç3ã³`0�Àn5:CÆ4i­­ÌT´|­Ëp­€{¸ié³µÚœï‹Q¯Ñè >’bIS__ŸxD¯7Ж>žgÐjt†P4†ŽhQÁÅHô¥hùZ‘eÈË&y'Ææç› ž«¥}×ꓟBCCƒ¬uC*ï[Ÿ�0€Ö�Ü*SíÖ­[3¦)Ì7À\®Ž>‚üBŸ™î'µ<5:C¹mmRÊuÖB�ÎÐ9<Å·r)[.Ï.5Ÿ¤{ð¢�¡¬�à�¬–K»ãRJi¿$¬™Â,÷v'«²®�§¾qâ…Âe�kܧòÎO½ÆqϺ#'®øoJN{Ç7òŠ€ š�MÏã$ÁñSà2ÒÁ‚“OêÃÝrË-555È–––@ii©�ðŸ?ZÑd¿ÿþ/4�=?:K@Ÿ²óÜØÆûõ“Ï<ýÇÝ>zn ·È@,5Œ;:úá/Üo·7Õ†ºßðç^KÏ`ƒÔ¬Þd6ê5S¦ZzŽEÀµIVo2gLSn)#=ýZc¡È|JKKme&½É웦XÒ8ŽÄ#EÅ´MÊÇ5BGò Š`Iq _ Ñ4W ¾$9Ú$ïÄØD¯cÚ|°U,MJƒæ ä«rx‡žúƉ —=®�{ŽcŒ{ª¸Z{Ò„câT †øu½hïN�áÕ·Äóx<ÇFÃ8Žt0á䓺qɺ²V%çj\2Š")²ÿlç Ô@Ç TÖ–+Zº’×â‘»?áõxâÕ9<7mʘRBÉäÚ™-u«ku/C’‡–h^¿�[¹�Óz<Á» &I˜w¨ðÚ:-g½¥A¹õx ÝW ÚܲËC²'SMÍ䥬ëã©oœx¡pÙãš7rñáž}÷ÊËm% Ç·»E+›æþšÆ¡ÑxˆWßrJP/{žÆI‚ã5¦pÒÿ¬Hœ|R^êëëCöÚz<ªlEµn°µùßz°Õ»qUÉÐò¦®zSY„}�²‘IoÆ4L­"v-ß{ózHOÿ˜×Ô¦{˜ŒLz7XÍ’G�¶LùxG<pÙ3ÌÅÚ¢ô£=í’”$G›ä�»L{ÁTJ\V¬¥µ–"2éõ¢Ê{‡ßî-û•%zÇ«o) ÞdÙ³Ã8ñ8rÆÇ½Îôré`ÂÉ'õá×í˜L&ÚMÐ WVz˜–½}ßþ¦ºb“÷è·~ý·€¥nëæÍ +ó�ÿ¿þJBžAo­®Î×ë�ƒA¯C~~>°[�Á˜1 “-ªZ'øZ¾÷@Mfk5a4IâKÆ”õõõ‰GB1,1›Yò ÍÀ–ê .¾Ð6Ïd€e«ë$)IŽ6É;1VGäÑ^$ú•˜æ–[n–Y¡Ac0ú”2Þ]×úòò@g0&OµÛ¶m˘Æ@äÑÖd2õx=±Ò’�Îr¬«þ¥1Óz—X9¶‚ÚÊ"�Á88bOÉåÙ¥SkBj[E ÌäèÓØj6(Ö `íÆ› Z^Þ¥ZTÿQ[P¦Ýq±ÜÛ�¬Êº>žúƉ —…®õ<òc燎¸–8§7¾à žsÏ�åµá„Må�ò\Œ×{ǽo),¨&då³Ã8‘8Ž# ç§^‹ÆC™ÓeÂÉ$õá¶mÛVSSƒlII ”””ÿù3ÁMö¯|åó�EgÏ_ž! ÏykîøÌO|ûkßýî¿ß³c­­ê¦b ÊõþcGG?üù¯ØíM‚]oøs‹‹‹€Ýêó 3¦Ikm¥¦È¤wÐp­€{¨]e%=ýcQ�x_,„>¯Ðˆ²¤q8‰G‚`€ºÕV"÷’Ì/,¢­¹h \�_’m’wblÚ*˜œÕ@Ž!,e¥Iie­RyG·/ i a튤ã©Í„°§)0/¡-:‚Vy¡ÏÜK@ŸWèêëbI¤f¹——”\ž]j>‰5¼¸¸x,ÕçZ aÞÉgQ»CmPL)¡Œùf™j¦0˽Ýɪä­T\ê'^(\vº�‡ÎM;Ç3r .=?t`[Ù?Ùò3씚(û•%ywjìÈ-eweÜ�od&œÜÂ8pƒÁsk‹ÞÂ~m$6}täIp2IݸdQf¸~=fÂPUmN7Ueîo}¡/oåÚêr3Dù¯Ç£|Bg¶V‡gâÊàò Z³µíÀ&Rh±Z<Æ$Y—² �h’?€›jjåÃ¥JrïÐÊ+¦å�ê^†Äâ³>�I¶š IG6XÍ=ž@÷0Y[Y„Á:k¡xRFïz<`ß"Ü?‹™ÈˆKõNV•ÛÖNxŠá²¶fÊ*<�§ZœŠ]KÄõ’í�|íÇÎ=6ðúwÄý3ök¼?™ä]4zeô‰ÌW íãÝ Ïî†Âq© 'ýG¯UFêÃ�ŒŒŒ��#�F �F©² [J[›þÉíÞ�›WPD}¯·lí$£DÕÎ÷nœ>öÈ·¾öŸÏ]4VßþÞU@rV,3ž;òÛ‡›´ ”lÙT¡sc±s±ÙŒi˜ì”»GðµÈö�ÀcNÆ”33QÒÓ›�‘Ä—Œ)GâÄ�™¹.MmeÑ\l¶ÇàK׿Ä€ …`d,1_¿È’äe“¼cggfh›¶”àäÉ“‚óP?%ñ.Ñ/ö”\¼[m!`àò$_¿ŒzÍ\l6HÍÒW¹úºØKIÂVÀÑ»Ô|Šˆ\¸<>�‘Eïò�s±ÙÜ©AÅZŒ 8ÓÖX¾¥T]f€®Áqj&w˽Ýɪ¬ëã©{œÏãÉ„‹ÆCƒA'úwnâËvdC¿pÁÀ©±ç2¾Š)`Â� '«0N\Æ‘…Ñð…W½-Rád’úpgΜGv``� Ae“ÝþÎ;ï´xkŒôÀ€ß²oSÎð(ªÛóŽ5æ-wç‹�D`†|äÆÝ÷¿ó�ï´ï·7T‚ ‰¹1Ùи'c&‹Vª»Ùó}ý  û2¦r]2[«§¼C’ø’1e}}}âÄr]bɇ;åƒòôz€È3‰,I^6É;1Ý?²L¥„ÖüÈ?Ï  �{BјòÞ%úÅž’‹w‰OœWm±•™Bã×Xh``Àˆ†Æ=ëë6±×gîõ0¸ çºÏ‹ô.•™ð@ß@Æ»Jºóµµk°´d œëêåå�à”¶;.–{»“U9óóó™S%h~~>�‡B×­yàØ®üR½$74ÚTòg„Šq*v-#nã’�w­ørÚSí¾g^ù­$¸5æí{W~“åª;?Äkm;N>aœ2¸�¯zÐVÀ¥ý±�DÊï —Zª&“I£Ñäää$¥LûÇk||œþŒÖçÕ×òð_g-ÚpÀ�¯›˜\²÷¾=U WQî¿?ôÝßô-ë–å«v46Ö•ƒ»í¡Ÿ;¦kKŠ£yyŸî½÷7Õ°ßyçðÔw[;×Y ¿³‡Ç«æ´ÞýÀ£fkõ¡ûv¸–ï tO}ùág¶oÛ”òPûàÓ§†>¸mùÞí+سâ’Òáp$¾éô­Ãçz<�oî®Mz'mïC'àÐ};|$õù?tõš?|æVv:\ï5º™†¢ÀWï¹3ã…R)É;1J,L¦RŒV?%ñŽ{uâ‚Kt„—S‰EŠ>ï­™ûà{ÞÆt«‚3ìÝ&ÝFÚ4pË›ƒcáݽy¥%ŸÉ;YõãÇþÜ1UÈò”™î\XJ Û Ã1ýñ,<�§ZœŠ]ˈ;7yœ)‹€ŸÑL¸^²�eVp2:*¬ƒÇ„“O§ îèÈo™ªe»ï k¦|R®$AôAÂB¸Û;rvÙíö�l ¶;<…×öÇ£úÚž}…´¾óß¾x_ÓVòXÛi °Øçué7}Än·7æt¼á&2¯~©UkkÀG²-l“J¶R“ÙZ=èø…–¨<ƒ2-ŽâûÛÈ7M�ˆ�^†$ÓM¦¥Yê^†¤0nm-[ç -Œ4é%‹s!Þ» 5 F½&õÔ•–˜°È–Ý;É¥Žv—%8&e]O}ë= §b׸à˜B_z)!kä˜p¯0¿\'8à N&aœ28oäâ㾞ÚÍ _0·œ'‡Ô�£Eù¨Š- óÇš›<úªn{½u:dGËÁÖ> (w‡[g-_Zi6ƒ¹n÷¾=uf€À„¥Ü<õÇææmó [*(Ù»^s—àj÷Fnå:ÒÓ/Iˆ—+!OÆØº‹‡C<ˆ‹Pä•¿ðïj’Ð;.»?+V˜7î|'Ûú T��5¤J¼wL‘x’ŽÆÀÕÛ%ÇK®>Eqê®™LÂq5U‹S±k\p§ÆŽ¼}ÙÇ’NFGùÆ´`Ç �gÆ�n.¹#õ”à€+,8™„qŠá¼‘‹ÏH|Å7›~ìÂ×dÂI.õáÒ¾«%©¢5»>ÑX@¹[šO�€yǾý^EX6Uƒ³í@3”WíØÙXg¦H2Þðѯ7Õî¶æc>€ ïjŠ”ÂQéÌÖjÅX²�[  Dáê$ÆfUðcœ„J�éZ_i†SCìÝlÁRÌ»Á±¼wç[•Á!Ùj6tœ’$«uÖÂO sxŠåÅWu×L&áy<ÕâTì\4:3~4é à (,8¦ð³Øqrã”Äõ’í� µUªü©Øü?7¿–oÔÿNº<9Ú?þãÂ3o\þÀ–eyë*Iò¤Ÿ8¯œk5SýO¬ÏÜ[�T>2Ý}œ¥�ïHw—{òÛÚ´vi>{ë–»ö2}ÿp¿«D_¼Uòµ\þx žÇS-NÅ®qÄy#·7ˆÄ¦wðØqƒAçK—ÿ7ñˆ˜€+q’ ã�‡Äwð²Ö»Å‚+///))Aý¹ÕjµDUݲà§´Ú˜×éŒ-ÛlÐjcIiµZsUݲà™~´Z-ÕçÏ[Ye†ŠÍË.üùO#1-Ùs&X^WNçÆdý*W£)+4dL™Ö/_´DNXÈæj8¥Ì™ÌÕh|$•öl—‡ÌÕhÖWš¹5ìi—;¤�ûÑ\�ÆR@ðñZT,Îw‹,C^6É;ñ6W£õMS¹�­Ì”zÍÈ9ŸÐåj4ᙸòÞi4×,{JîÞ¡'Î=çÔºš«Ñ¤õ.)�„>rñމxý]¥¹ÖVjÊÕhº‡Ivï䳨ݱÿp/O¾ß*r[î5SVe]O}ë= §b׸ãNùŸ¥? ‹[È÷ª·%qS>1/jrÁI+ŒÃ8Œ»NDÝÎõžÇ¾ôÑ�~ø_m�nÞYCÀµ˜+`ÞºQû�îÛ³gÏž�~ã°+j&ˆª�ïµö~ã“ýè‡?û˜gÕÎ:³Ü÷xë- p5̃Z[[R„xA fzXWò]ÊâPPVhà{3h’’ñâAÒ…:(„# ˜¡Ž‹ndZ•‡á(€C13Ùu% Liš˜+&ƒ61£^³à‹Õ9<묅RᲪª(¦¬ëã©oœx¡p*v�;®7aâ®—|]VÜ!×÷è…y"çg²³01ãÔ�»&Êy¼ÛzϯŸxâÉ?üx·áÌñ> PÌT…œÒl¹÷ׇ>|øÉƒ?úâV3åþÇÿyÖüøžxâÉ_ßc½pÜ)K †D)•Îë:¯+)$ê¦ý�*NnIˆ[iɇ«=Up\$ m­‘gÈ<˱½“ ‡bf²÷‚®lçÀZ’tìͬ RÊKèË�}À+«ž�bʺ>žºÇ‰ñ<žÂ8rÆGoa×+b%9ã{Êõ}ôYLPMŽ8 …qwÃâ ¢Rn§×ÜPg¢¼®Îàs^�—r»É¨ïøÁæš[Žõ‘>§{Õ�w—`®k0{�^¹ï\áÝ¥Êmkc¥Ï'tRå¿¢4.ù‚,8ù„qÅ1â¿T8îJšޅ$[GrÁɪ¬šÇã%Ô‰ Kºë¦Háy¼ôR÷81žÇSwv⸦Ï*°@n0èüëðoÀêÌ⎓J‡q7,îÕW_F¶··z{{£$޽½½`(Ÿr‘Ðg!J�k� �ûÞyçÎÆ*÷ïý{/Pçz‡½ž”Æ}9DP¾¾¾>`·!ÿPÆ4L¶ãÕàòÐ%Á9 ^¼—¹¤÷ºÎ³ß-w_2¦t8\Ò)¼ö†“oIæ´!ÿPh&†®zöÙg—¡›ä�xòu“!ÿЫ9õ¬ïÔOÁÞ]k_#.p]H:žj‘wìiz{{×Y ƒþ¡Îᩎ3]�¼LŸåRm¯¼幓©Þåº�(<ç[b¹ÁQè8ÛÍ’†ýÙ±·ß�(HÍ¢ï¦o t·t>’×Lv;Ðñ 'Â×;uUa︷;Y¥ùö·¿Í÷šùùùÙÙëÞ>vñ1}žF’R8>§Šq*v�njÖ÷Öò½'ýÏz½ à<áÞùùywHTHܬ-LŒÃ¸lÃm*ÞUdXšxD¯×çææ¦ M–úÇ+�çåå™L¦¼¼¼òòr½^o4çü]çg×m__j4õ¹‘Þ3£ÛëWÑY}�­¶¶zY�ÞhÌ/«\æ=Õ­­é&ö IDAT«7¹ÎÌmù§m•z½ž \g‡Jn»u•^¯'‚ÉöûÂç}TmUÉ–ÕKÙS¦µ£³y}Þðæ›,›l¥|¯Eöœ'Ô5º¥fYÃjKÆôÃhpî–j˪ŠâÔ³ÿ˜�À;j+ª,E¹‡ßôæj´¿½†)MUU—ô—&fú¼á +Ê´Z¯’Dw[[UòÆPÐRdúÌû· (=Á6É;‘öˆc4Wg¨­*a*�åË— οk4<žÛ²ºÜZR ·wF£‘¶'.LM„çîØ\e-)H<žj‘wìiŒFã?&'"ðŽÚ äÑ�[ltÎ,w¥Óë^ s4ÚúUå¯ L.+)üØ ,õ™W+År_˜,]’¿³®’) û³#£€î*5‡>_x<õ7•‘Q`ú– ¿*ËÌ,ÞÉg—/_Žjï‡ßr/ïR-—ïRiÛï8¦äøÇK˜ð<žjq*v�m”'æEM^8xÕÛ"†Å'^‡q7,nÍš5Ë—/GÖd2€Éd2˜‰¹h.`2™ ê�/,4@Ÿ¥¼Îî‹1ô z±ÔRØú4:¢É�R„™NÏbµz"c&›3}.OÏ Îa.WÅæNé']Z=áò‡Äû²ª¢|¡y¦4‡ƒKΈ¬ËÒê [™‰»ïZ=áPZ=QVh@£éÂÊP€MòN¼EåÃTJb¼ÓŒ`ÌËSØ;î\îÞ¡òáëº ¥×Œi½£K¾ÇÐê‰ÚÊ".9Óy öŽ=tW�™\¨´,IM³¾Ò¬Õ]2Ó€µt‰ä5“˳cª·\Ê'íS�µfòõŽKJY•u}<õ­÷X(œŠ]ã‹{ÅÛBÎø2§“'^‡q§<ŽQUWNv8½@y�Ψ¥Î@Q$x;ŽCAU¼Î¾òº3Xê,–hÔMéì ËëÊå¾ÉÍõõša[‚"¡$\þ‡bi°Ü9ߥ,(+.!:$Á‰”´¸ÒøQep…qY…C�pÙCÎÒai�w´PÛgiÒⸯÇK/õ�/NÅ®ñʼnìàñʼnÆaÆ)�»&ö½ÊwìÞAœni~è;ŸÿÒ/]ëwo5U;óSrï £Òq‘’a<ÕOZúùþòy0)YÔÞaÆqªùì;»,^ïÄ(ëúxê'Æóx‡q‡qÙ‰»¦ {'å[÷55”ZVÕmÞ´’ Üÿ¯¸Gɽ$ŒJÇEJ†ñ”{|ƒÕ §/Ž€I¯UÍÚ™LÕx' n,KÁëªîa6XÍiqIaZ9 ïmX__�f¡}¤Ø]79â ,ŽIY×ÇS÷81žÇÃ8ŒÃ8ŒËN­ {'å=ÖÖ_µs«åêoEŸÓí3”Ü;Ïã¡Á{Á»ÀŽ…a!¶[D8ÔbNBœqÄ¡^}÷0韎€ÅÌ©�—Ú K‹ËøîqZɺ·!ºs¾RþÙ¡Yhöù7 q P Ǥ¬ëã©{œÏãaÆaÆe®§§ghhÙ@ �@ JR ‹�@ åóäI}€zóùÃd]ãÆ¼jd”¬Þº¥™‰éÊ—�žÑƨpÆ4LvMM5LM ¹ÙH(HÛŒéßþÖm1*ìò‡Äû¢�GÀ?>É”¦¾¾žKÎó³˜ I%‰Ò#»jÕ*Áe(À&y'Þ&ú’zVŒwùšYp_SØ»h$¡àtƔܽc/¥´v¥%?F…ÇBtKIëºÛ7z=pS±FÀ³æ*DO:k+3Ũp÷0‰¾æg"©iLzmŒ ‡£ñ^·ÊŒs’×L.ÏŽ©X¼P’r´;©j¦¬Êº>žºÇ‰ñ<ÆaÆa\öà<O$AÖçó²Óäý9 П}>yºõ(YÛXgöù'`Ì瀉@p°ûÌ•4c$€!17& NfLÃd/už€�A�à“c´Í˜ÞÝß N†fbâ})Ê @g¿›)�Ãáà’óø˜ÂäD�' NÖVq÷å‰ìK/½$¸ Ø$ïDZ“^Kûb+5¥¦ã¯"¡war‚~¾ì)¹{—øÄùÖºÒz‡î¥AŸùæ/Ì;ºþ³äŒ¾Œs¡Ô4+-ùÑàäàXÈï÷@dzRÚšÉñÙelÝ’”¤äíNš)«ræççy]0??�ÇC¡ëæ—8¶Ká}“°°°°°°>¾êA[Á¦Ä#&“I£Ñ¤n1”ö�W8¦?çåå¡T_KsGƒ-¾#Olqï²ï©º’ŠfiÚ·ÕL_¾¿©†ýÎü|wÇ¥‰¯4®Ý¶ª”·Û°÷¡pè¾Â.?Ô>øô©¡n[¾wûŠŒ‰;‡§¾ÛÚ¹ÎZø�=iÖþóo^ÏÄþë-ù„NZ.0»IßR�'�6û  ÏÜo#;•è‹àšÀž¹òEô­Ãçz<�oî®­­,’$CÚTVÜ Õ=t!S9 »Ei˜K悟Úÿ9<�½zéöµ–ÏÝ‘üUÃÑ_t¨IXÚÜÅò Ù¿p’¤f÷=r2O¯ùýgn•çNÓ/ÁÂóxªÅ©Ø5ŒÃ8ŒÃ8I”— ú ëÞ æûömÿþýû÷ïß·Ób®kÚßTG€¥ÎráÏâµw‚Ȉÿ ¯÷`_þž‰—ÉíZYáµåXë+Íê^¨ƒq´ÐÒM"…—º<$d_U Gc�i_ q’KBúæAßB ฯÇK/õ­÷X(œŠ]Ã8ŒÃ8Œ“QD]ãNKksó�æVwMcãõ{'¤½¢ªñÓ; Úmn>ÐÒoÙÙ(ÿÞ ÇmS2Œg¢kAjŒz�„ù'ý,VwÀ=Œzÿ´i DŒª0á’´rÏ E•d È©La¢ 2 `ÖVÊ6 Å2E ¤ÂI•U☔u}<õ�/NÅ®aÆaÆÉ*sÍ®&»Ý¾¿½iGšõ¹¶w�hë>{ãÕw8‰qÓ:»ÝnßooÚU#{OñqbWod õ.•]s�…€aç7ô~zQS*œ’ ·ÎZ(9Mx*W“û¼B°¢Hª¼„ºahÆŒG‡iåž9k` È)¸0÷Ï8>‚b{®´ä+ßL¹”±L":ä©8©²ÊB“²®�§îqb<�‡q‡q—�8‘R÷îRïÝùVÈê�£2ö”¤€ðÄàÄHZ\ÆN…œ€Ðö’xÇ}‡¹Ÿ*ºs¸Xª ª/Ÿ÷k IX,Þawe]OÝãÄxã0ã0.;q‰¢ÜÇZš››››>áNþ‰KyO>˜|–úË?E[Ž1½Ñ)¥ïîRo[Kð xµ•E‹z€?£ã‹Ú»¬Â™ôZ{‡q‹Ǥ¬ëã©{œÏãaÆaÆe'îš(gk›¯ºÉn·ßÛXÞ×Öv}ŸÍ{¢µƒØq¯Ýn·7š�mÇÝ@¹�»¢›ïµÛíMÕ¾ã­NRî{?NŒ–Áp|»LÉai¹YI‹|Ô1ÀÏ´rIÞIˆ¼Äk¥%?û½»aqhN²sxJ\Fáy¼ôR÷81žÇÃ8ŒÃ8ŒËN-ÊíôšêÌ@”×Õ|Îë¶1*ße·£0,0Àçtû †rÌu f¯Ó+÷MŠ'æØSÉai¹YIñ?Õ1ÀÏ´rIÞIˆ³Ä+-.1L+¯õxÂpr½êœýÏãø*ëúxê'Æóx‡q‡qÙƒ{å•Wúúú�€¡¡¡(IQ³“ÀÐÐÊÃÞË$ôYd)wÛOüNkŸ¥ºb€êsy«·nEgǦbåvK‘þŒi˜lYY™È¦'|à½<Â%}}}=;‹û� "¢3±8æ\Z`@gYrc¹[cŒ¤KRX °IÞ‰´¶RòeÂ?ÊRO„åŸñIIè]bûŠLù’Ž0ÙÒÒR.)k+‹Pž©9³ßU|z<±¦õn.t- ¯²BÏÎå±·q¦³è‰3=wt?é7éµìßéÏ3h%¯™mYYÙúJ3Eú»<$_ï˜|aù6SÞ;Ž)e•}¼9òÄèÙîØµÿv��}zä�§G:O…¯ †^yãé‘7žsž#‹—T<,­b×0ã0ã$‘^¯§-A´Õê®ÑiuIg ‚ ªïùÔ—ì»ÀÑvÊ  ×j»Ï ³�À`0€ÝæhtÓ0Ù¾¾>‘9h´:Ú÷ŒéG©ÙÓQé "":‹cÎe…t¶¼(Ÿ—ïè*Ë’|º$…•¡›ä�H›Oè�/ªJXꉰü+Š €ŒÌ)à]bûÊÕ&·G&ÛßßÏ1%Ê35gö»²--J¬�i½Cõ¥áØš�5´9]8coãLgÑw²Igk+‹Ðýäht¶2Së——dôN>Ëþ Æâ]Z›ñÛlA¼ã’RVåÌÏÏóº`~~>�‡B××zàØ®üR}šÔAjäÔ„Ë7m[¶i½b£ãgOå®}Ï“>6ò‚obµ¥v5Œ<ç ¬·¬]­��ŽŸ=‘»öƒK¤œíÆÂÂÂÂR©>¾êA[Á¦Ä#&“I£Ñäää$¥LûÇ+­¨¾–æŽ;Ú(�<}°Å½Ë¾§Š>MºûHK ÚQ�êki>Q·oŸùDó1KÓ¾­fúòýM5ì”o>×ã |sw-Ú@€~ü|wÇ¥‰¯4®Ý¶ªTÀå|o€%ýÞ‡NÀ¡ûvpÉÇGRŸÿCGY�áW÷n͘¸sxê»­�묅ßÙ“fƒ>tKðÁmË÷n_Á…ŽtË›ƒca¦l—îoyÓˆþä#õ\Qò¯'›ÍP”'ÜsÛÊ÷Ö[9^u¨}ðéSC°¢4ï'M7§Mƒª(úÌ«9£ÌùV]Ž—Óþ²äO{·P �¥uó-ñ_§Ù ¦?^‚%ë<Þy&­*^»úÚî¡�¨vu�IZËzmx`&ŒøgôËVk@»´ Ç7å›�󦮗ú†¥„…q‡q·Øq´ˆªºr²ÃéÊëtF-uŠB»�ÎãWð�ýN¯¹ÊbK�åŸÿ䦀tv�åuårߤÃá@‹Òî ,Nª¬PWÅÇ—›Å$´ …ßXì u~Òtó¯þ¹�©ƒ·Ø½“'lɪ0q¼ö@Ï(Å S áFÆ1Iš>^h2!gƒãÑ9�Í@<6�›¿½xåjBŸ¿zd.BÆ5ù¹(MNn®ff6ž�é59W®‚ÊJ]$Lç »-[•§+›[º&_•,î%Y˜[¼4^eͱ-�Wæ«Ì;u?;ìö. ½›�eÜ?W¸ˆºÆ�–þÖææÍ­îšF`…ìh9ØÚGTíÜÝ'mnnnnqš÷ì* ª?½³ íÑææ-ý–��u²ï‚®â0q °Ðoq-C%™EFn‹²—q+pÁ¸Ä@�+-R.!f÷ŽW\\v¡84Yûì¸=–¯Eí�`IÓÇóõ‡#äìhO0BÎŽ»"�h'}³ô穱kŸÇ=Q€ÜÉá(Lº"01H��FƒôY Û÷ò¸b¬‰ÁÈho�{úÔ’ä’RK¾’Œé·LÖ®û¿%w=S¼í‘;LXÿ³ç¶Ÿ»¬ÿÙsç�‰m?ˆ4³V/Û2Y›wÉ¢Ï1ÊQ’ דÒÜ %ë‰úZAjÍcû^pUêýàg—�Þ]d®ÙÕd·Û÷ï·7í@oe‚yǾýèõM¢|ëž}v»Ýn·7íª¹Ò›#ÆMëìv»}Â19¥âaiî,K�À·?û®ê{n[ùöu^8I„q ‚ÖJº*-Ž¥ƒ-RìÞqŒ‹Ëâ8ïä“´8ÔM G‡üµw‚%Íz¼{ævSñ•õxFsru�(¶ õxä‰×ÕÏ1·ïÍîü›wÄ»^ˆÚ>Xj˜¹ôÜì¨XY,Ô!¬¬‘l«.+žïáuÕôëĆ"oùìÅÜ>™nLésŒ7Em–a({Å¥##SÛm·ÎŒÍ�,ô}aa©\r¬ÇSF÷·8ÇB?º{³à±‘ëy¤Z�Ǿd.­¸/¸bÏœ^P´Ø×ád­T³�^ºùËO0¾×š*z­ÝÿÛ´ìÞÛW1%£¿ñºç¿w{›�õß¾Öò¹;2¬ÝM+ööKûËÒ4hï컪߱¾\À=ˆZš›§×üþ3·&�âûå&òË0K”¥ëñl…+—/Ya4ëR;xI2­ÖǦɈùºcy«õÚ|c™~æò@ b£ÓƒÃ`Q°ƒ—�ËKô9Æ-“µï9iKú·e²VŸcÉ*Ì-¶æØ¬96ö¬ô9F”Ìšc+ÌÍüHhœ>Ǹvf]ã1ëm¿pñíà@A—gÅ¡®m÷Ýý ØÙY½vf;NÑ8T kgÖm™¬Eÿn½¼¡ñ˜u÷Ï#››{*žïÑ‘(jwí:0rëå "qÊã0ãÄ‹ïÀíàXD¼Ü¥ü°4š4ó×ÑIÈ’�q7,NXd‡õx¥üÂ$–À7M1%P¬0Ñ�,ÀWŠ™€ðL\œ”…Â1Išå¡·üv¸ÌxeoÖl ­+€Y“nÊj€‘Ùø,·æè§s�¥s««Æž�0¬.Z½Z ï4‡ÿæ;ufôDÍÝK• ª)fÿ%Ôó Ìñ“W˜[¼y ¼âù€ÎÔ³Eí`3]wÕ:‹/ÌÌG8²¬9¶’ É³;TÔvÏÓ¬Ó7†–\yU½ÈÕ…fM=^p%å9k6N5TúWê]—“_º&ÿ¦¹šJ—¦ì—ŽäݵK«²ãýeÇaƒÙè›­{5™8-ÆëÁ­�Y§ŸÍÏ€¼‹.Qúce|ù­…:óITz.î×®8ÔU¼Áúâ»&xáúgç™çA&õmz†q§¼”_ïÑß.Ë{ªì8€ñ'©„,¹ÇQF½&2R³ßHÌZï$‰†Â„[Qš78F=% %wa&½êœµÏãKÊ@H:2RÔîBŸË 4·Ã¼ˆŽåX¦7Xã:˜ò²i†È€›Þ;ÕÌÀç;¡X¹¿ë£½AŽ?# s‹«Ç+ŠÖÚÖO,u»¯†]¹zÒ{º­­Ãƒ¥¡±qk9@•Ä.ln�˜«wîÞU#ýVe׫¾¾¾sx ®†^�[JN&þ6BAL ¿¡é™1[é{€ÑáP­æ"…/NpJTÓØq,½)aS˜¬f´�}ö'¹†ÈªªÂ÷k u³CÌ1W²Ê;Å´0}<uOÑïé¤ÉÀTEªŠ'7•Û₃sèsŒÔyíòµ%è¿i'IÖά[Óæ5ºÓ¼9)@´w’È螨~Œ±/'-+£”ÄÝ¡³îmKò·] H”fz¶ ËÀi ÍFªŠ/ݱlF7gí‹•ïHîŠ÷�¦¶Û\õÆÄZinÅŠñâÊ—FŒîkÕ˜ GOin˜Ún©5�LŠò@³%úc”ÀtN€×ÈV°-�¼v·h8†%zrÆšcƒ„¹n4HdÕ•é}Ze}AÃHÀèž@›ÕœßX)æ‚ÐÄx¹Wwõmç`¤î™.u㮉r¶¶ùª›ì[Í”÷DKk›åÞ= }6ï‰Öbç½öȾÃ-­'ªì»Ìîãÿýç±û°—äé––Vgy“ÌÛ'8]ÙJYI8 çñ2²8þBBÓw|×A ÆI"Œ[ÜúJ3œÐ +-0ŒMGQMc¡=«,•(ÌÄÁ‘¬}v\te³Ð1Æ—µw‚•u}<ÑlL@]UñðÛ+8þà€-“µe}Á«KÎ^˜¦O¡ßm“%s#„·‚*O}ÍO¤”ìt)ÉZ@= FF÷Äúß±õj¤ò®¨Ýµ¹ýÊü!,9ë5ºGR»£\phrÍjF+ ÑAú`Z£ÅW¢V0M€[sl[,ùK�Mty_ëEÙúkòûKF˜zkúã–‘›VJÿÎp⻵‰ÇkÖUU�WT¾4bt»Ò^˜q–½±\YUÜñ�rO¦’: ¨»»t"ÿêEš‰qô’ó €z³Ñÿ6ÛTyîx~(š3k ¦ªî‰µ…šÇ£ÜN¯¹a·ˆòº:ƒÓ郚*ú4Q³³Ñ‚ú|æò*åŽRàsºWÝÙTN€¹®Á|¢Ã 2÷ñèy§öŽªÓ]‚&?¯Nxºº'ƒ)8”mQ;T_�~<¯¿îž¯Nq§ïàA»µèòiC¤jÄTÜ55t¢·z‰�Ë螸íƒ{7¼QÁöê&¯5·<ËŠ»¦’º»ì¢'W‘èg7µÝ†^5Gkn¥ZK‰"é±)«a´8xî|ɹvgJ•úæñÆÇÇéÏ%%WÞ鈒a&®ü4”T?IÐ?ÍUW÷¿£úŽuDk-ÕORÞÙغÂLP>!ñйKü<z•‹û:«,œÇÎ÷/N¼0n¡pÂ^èÍ'tôëŽ,8õ�MŒ1ªS˜æ-äÙ¡iRI‰yÝš;NVÄâ˜$ÍÞ JÌ/éŠç{viÇxÓ\ÍÛ.®kO©$hÒÍ\YˆXÖwå%Ûko•gÂMm·9o–—WKs+*¦—Tt†’ÞpFß–\^wç8±†Š—ïÂNa8‘{ �ŽŽêtºÙÙY�NWXXˆ>Ç/=õË“›?ÿñõšÙY]øÌo¿øîÏxÙì,�rv¬ûès/OTÜñ¡÷¬ÒÌÎêtº‹ÏýòñéMÿ¾w»N§ v?þÛ3·|aïMZ­6‹1Ù¦_·ÏÅãOï¿�% ‹íèè –®þöSg7T-ùÆ]ëäðÁ/çj4-ŸÝÎ%½ÓéÌY²üÏ�_³4ï{{oN<{Æ5–ö8‹ýÞ‘î.÷ä·?´iíÒü´¬ºº:ô¹µÃsèu×Þ[m»¬|äX’ räÌT’´w X‘Þ±?) ½›½Ú¾z½¡o?ufCUñ¼ݵÇ`OŸ>½uëVö4ìvaŸ{dvß8ôfïhøßß¿v³­tñÖL&/øz—ñ[(kÛ—?^‚•uïjJõã­Ø©ˆT³¬©SÙüÌB±0ã²—¸±½Fàäµ�W»LrÅžåèýZ¸„¸¢v×mí©*îm,O|±¶0·Ø6½ìêÖ,i^eç¾¾1©Ç…v�\Bê¯ßTèâyߺ3«½‚{z Ìã-]º4éˆN§ÓUÕU?ãô®ßZ÷:�±e;,:]œ"ã„™ªï¹§^&v6}½²©Ó@Åæe–cÑËq]•Žì9,¯+G¼Ùm®F“1 “mhhèž“¯ké幦œž9 IDATÜxÐ-D�FãDÑn©,ô,Ä—Ç’”5vïä¶"½3éµ¹M8“Û;�NG[T—�0Ù­[·rLÉdöÙ±×mög74€Š%ù‹ºfJò}Â媬mw²Jv_I>ÆÏþ:™jf0–…q—U¸Ä5ŠêóŽgtOlnžXSU<üö –˜1©Bëý;«Oog�‰jÛª‹Æ%gÑËla�ÑJÅŒk&™´`q5‰ºÆ�Þ¶ÖæŠ‚ò­�»k ;ZºwØ›Ì'Ž÷“$´6_yÏÆPµÛÞTSÕhË9Ðöh?P`®ÛÙ(sÀp8Õëj`P©ýñ$ ã‰"Ñ3m§®î•3‹ ‡¶•sùCÛV•*€ã«ž‰ƒ¸]Cxá$Æ) ¬ëã©fJaÁq*v ã0ãØqì«°¨ìxÿ�Çaj»­o«>u[š-kjëNòf»âP—…[Ô$-àþxæš]M5»®?´cß~ØeÿÚ®Ô+ˆÿwïו¸³«¢@ Ÿz à ã©îx‡q‡qÊ(ëb®tO1nѱ0ã0NM¸¢v×¶‡ûîz¦xchƒ>ÇX˜[¼1´¡ñ˜µäÛ�Âv+1º'nû…kggõMslÑ&Qü›-“µ;;«ßsÒvÓá‚=¿7Þý Øó{ã{NÚn½¼achÚV1 åp80nѱ0ã0N8ôÖ7Ь.£Æ1 Ïã©§b×0ã0NÚ7r=ZÁ(Wv¼¿ì8Ô›�S •žíqe©ž5ÇV4•]š);Þpm%á¶«tdmIkzƒ5^ ³9 ÄÜ”dR÷81Ë<^÷0 ¬’½žªú’Ä8ŒÃ8ŒS@xOµ8»†q‡q‹§##eÇû77÷Üy`â®gŠïþÜös×úßu¥8eÁtyÐ Š_hhùÄkà6HÍ€Q¯Q'^‡Ã¤WhPXÝ#î‡q‡qÊÏã©§b×0ã0N8ö˜X {'R¼n]c!°•ñØ¡X N¼hËÛP’³”ÆaÜBáŒzMd&δøb÷Ž �…£1epŠ Ïã¥×b–ÎNœŠ]Ã8ŒÃ8ŒË6©{œ¯ÇÃ8Œ“‡Fy|ÓŒf¥Å±kAp¨\òVwa2)ëúx‹}X:{p*v ã0ã0.Û¤îqb%q‰¬. ë+eÜ‹BÅ%¹qèç¾­”Ó÷¢óã8âùTñ8É…çñÒKÝãÄxã0ã0.;q"¥îqbiqe…øQX…q,B½kÔÓVW_Û38­$Z\…‰qÜqhK˜|B§ Nráy¼ôR÷81žÇÃ8ŒÃ8ŒËNœH-È81ŠÚâ#Ó¿ë%9N*¡=Й^QS÷ˆ;ÆaÆaœ2ʺ>žºÇ‰ñ<ÆaÆa\vâDjW³0u–X„º…¥^8e¤îwŒÃ8ŒÃ8e”u}žºÇ‰ñ<ÆaÆa\vâDJÝãÄx=ÆaÆa\v☔u} @Ì”ÎøN´ýáé_ûûë'†¨>×ÅsÏÿ׃ß~°¹ùàã/ÏS¾ááa`²½\ ‰N²¤a·/¼ðDctn|s H?÷ô‡ƒéªé x/�HE§YîSpIÊ—?»wr[ñÞ «'|mBû‚È”/é“EÞqIÉdöÙMøGiË÷ÙIÞ.¤f¢ï ô"Þ;îß*ÙÓîdUÖõñÔ=NŒçñ0ã0ã²§×ëiKÄ;ãéëš®n²êSo´\ê½4M;ööËþìx=—¬­™è{}‡ˆ÷Žã·ŠbÞqI)«ræççy]0??�ÇC¡ë^£íî]eF½$7Ô=Tòg„Šq*v ã0ã0ÉúÕóÖmJùüûþçá;ŠÀýا¾ÞõÉ'~tëÕ³T_KsGƒ½©†lknË[ ç'vÙÏ?ð‰ßYþåЗwõò—>úÇ·þÍÄ¡öÁ§O }pÛò½ÛWd¼Ÿ´r8õõõ‚óéžúnkç:káwöläŽ{ôå 9{ùžÛV¾·ÞJŸúÖás=žÀ7w×ÖVq¿�½�€C÷í`beL&•q hÑáx=ñ¸?ßÝqi‚cuZt…™$ööË‚ãÛ~¹hA 3­#Ajvß#'�zÍ>s+KIúÕѾ—Ïû컪߱¾œ 'Á}s“0Ó/ÁÂóxªÅ©Ø5ŒÃ8ŒÃ8I4ž ú`ŽÉ²d¾·ß ”wÀD¹ŽŠ")ˆ’a&®,¤Ó—T”¤ˆµ›–ä ô½1îg�xˆ2­Üw¾ ËKL-„£òî�®î•3ǮР�ڵ輓 ‡Ú I/å÷Löxç €­ÌÄ+CöÉHŽ�•'‡ðz¼ôRßz�…©Ø5ŒÃ8ŒÃ8ItâĉññqdÏœ9gΜ½5_{î±/}ô½ïù§¯‰òg gNü©å`ë‘“g`ðÍ––ææþoÛk/;Î ¹`rûÖ�ÿéS·ozË[>ñÈhÉš•¦³gÏ“è¡-{J&ûä“OŠÌ'02À=½Ãá`ºÊ7ؽÝ�RÑi–€û\’òåÏî�ÜV¼wQÿ%øû?NÉêݵÖwõ‰'a²È;.)™ìÂ>;ööËòì\þP`dÀV–á{&ûk&úÞ@ß!‰g…µzîß*ÙÓîdUÖ½«‰……………ÅQ"ßÕLœ¾+))A(ç�>ý Ý¿þôKo5SÞ~ðÀ³–ÿï7Ÿ¯¾š,íÙåÎǼ¶rß§w”Ùñ³û„?ýļ…å¶Å¿«)2Ÿ¿w{›�õß¾Öò¹;jDâ$WS@2,ù$ìù.ÜÂJpû•ê dÁ•ö]Mao¢ª LÔÿ®¦úƉ §b×0ã0ã$QI‚’Ï]yå'çê8è•w5Óž�^îßøø8²ñxâñx”*«ÛjlmþÕOÕêÝxóÊ"Š‚øÄÉ–ƒ­=¡ôgów~æ“Õîo6íýðGÿ㥊½_Ü]Nç–ÖÎ%Xö”LvãÆ�"ó™Ÿã‘¾¾¾žéª9>ùp¡Ó,÷)¸$åËŸÝ;¹­xïx=_I¼ãþÄû³[^LÀE_@€w’·‹©™U%Fð‘aI¼ãþ­¢Œw\Rʪ¬ëã©oœx¡p*v ã0ã0N�,2Ÿi¯‹{z‡ÃÁtÕØÐ¸Ðwž=?: G_=ÍÂpŸ‚KR¾üÙ½“ÛŠ÷Ž×ó•Ä;îO|±?;Tª¨„ùz'y»XÀš™ê‹0ïX®ÊÚv'«ðz<,,,,¬Å*YÖãõµ<ü×Y‹60äë&&—ì½oOÕÕdéÎî<÷…Oþ‘¨¯+Ñ/ž¾T}ø‰ûYn[ª¥#§.ŒýWÛy¾Ëê߀„ëñ8^…×ã-¸ðz<ù$x ¬=£•ÚÆñz<©2ÄóxªÅ©Ø5ŒÃ8ŒÃ8I”v=a!Üí9»ìvûG¶Ûž‚Bz=^º³E[ïÚe[ºÆþµ¯}í‹{–ÎÌ-{Û{ä¾s´Þ­çñM§.9N©{å ÆaÆaœ2’}¾Rßz�…©Ø5ŒÃ8ŒÃ8ùDù¨Š- óÇš›ÿ�‚‚íõÖé@ÙÑrнÃÞT•îlÕ®¦»£m-š¼p²¯ô#ßýD�Ü7¹ Û=•àò_7ŽÆAÒ­ºÔ½“ÆaÆaœ2ÂóxªÅ©Ø5ŒÃ8ŒÃ8Iôꫯöõõ!;<< ÃÃÃQ’‚ÒuŸ°Ûß÷¡Ù?v‡qb”¤`xÚ¶oSÞÃÙáéXź÷½Ã²dCÓg?¾¹Š:·´vÂ?J[ö”Lö…^ï嘞ð È�"ýÜÓ;Žááá²BEúC3±Ä³½\ ›™âEG÷Œî?-KØ} .Iùòg÷Nn+Þ;–'%“wÜŸøbvìí—Ý;ÉÛÅÖÌT_„yÇrUÖ¶;Y•u}’ïËUYÛîdUÖõñÔ=NŒçñ0ã0ã²766‰D��žžd£‘ ý™ŠRôg¦³ã‘ÀÉãýUïþ�ÝÞ´!ÜÞÒրɢ‚ÓÓ,iØí믿Nç€rã›Ãl4Ä=½Ãá`ºŠW>´-3ÎÀùA/ KŒw|KR¾ü™¼SÆŠ÷. ÒV>ïÛW,N:ÂdÛÛÛ9¦d² ûì–æàÒˆ_À³Öî²°f–f£!ß4EŸuùC³Ñ�¥€à›'K™dm»“UYs ‹£DÆ\ ‡Ãôç¼¼+ïR}-Í ö¦ÈÓ[Ü»ì×Å\I9ÛHµ4Ÿ¨Þ·o«ÀÛÖÜj°Ûw±Ü6¯À, R³û9YV`øÕ½[y](,fƒ„1W¸Ü€àˆ2XJŽð,R ÊNVIò�E‹N©¾Høí´¸¤þ˜+ê'^(œŠ]Ã8ŒÃ8Œ“Dy ¢UuÅ®?üôÇÍÍÍýü—ÏŒ.©³\‹¹’æ,QÕ`þÛ÷íÿñÃþð‡ßÿú7;1¹Dî;Gë=ò ø§£|/绞á,ŒxãxIÝ+g0ã0ã”QÖõñÔ·Þc¡p*v ã0ã0NVÍμ€ŠÎÌ^=t5æJÚ³DÕÆ[Ö//Ê3›Í%Õïþʃ_Ú"÷.H˜8‹™A]J,Å„qì*+$Àåϼéˆ$8^Â8ŒÃ8e]O}ãÄ …S±k‡q‡qò‰r;§«?ñ•/Ùíûïÿêþ,�túÀ¼cßþ¦"ýYÊ7èŽåUäEAÖÍñ$‘Ї¥UìÚbÄ¡>B31ep¼„q‡q,ʺ>žºÇ‰ñ<ÆaÆa\öàþöÞ>ª�ë\ø}$¡‘�2âC²1²1˜FØÓcܺ¸Ixñ)Iš{LÚSÓû6«oRšô¬:¹MÓuÚ¤I³nÒäœ&oON“ܤî]5î‡9§—ЖÔ.vqb¹Š�l ذ%‚‘�Fsÿ�úD3#Äøù-¯½ä™ÑüæÙ3šaï={ïK—.���3)I’@’¤ÇáÉr’$A¦…9‡Ã ±×ÎÎBÕ�?sïÿ<Ü|p³ímf¦ã_´ÔëY€—+Æ6±Ó²²²àgåNb«úVUUU´o%g÷¸‚i4“?L^%—K«ÍɤÁèR“²�nUg!éè‚¿/ðyV,‰–nß¾=Á-£¥épî¢ý‚bŸ»ä~wéyeruW‰ñ­´ýÝñJÚ•ñ„]OŒíx¨CêP—>º«W¯.,,0éää$0©cÆü<ë˜ ~޶v>³Â°Éç�ž¹Vw›Ì¡Û‡§óvØ,×cl;ýóŸÿüìqL%±‡U}«··7Ú·’³Û§,Á4š‹É&¯’Ë¥Õæd Ò`t©IÙG·ª³ÀItî¹é·}¢CW`;ž`u u¨Cêxeq`L¹\&[Z´4®fäµ öm247?x`;Xm ÞYïÕÒ̈üS‘¦Ú[ï¡¡u|ëÆ¦�P\Àe-ØZEÇ̺ñVÀ‡.5¤I;^Ú•ñ„]OŒíx¨CêP—žº›¸Ú:lÛ›š››< êè`fÅ‹³¶ªªÊ=ÔÑ1àHäOfqæ�›äÖçeÉàŠ�ßòpP—IHÀæpÇÜ<>̈ü¶ùûv�ûºÓ1WéÎ�Ç�ŽyÏ™yç9º¬•޹Lͱ½¥$¨K ØŽa×c;êP‡:Ô¥�ÎBp¡Û<`Uï®P€\[Q!³ ØB¾mmï¿j;§®Û¯O¤�™Fœ™R<9‚õÄ«š¾Œ½nk¾¢”Í8w¥Ôņ¹J]”?5ºU�:Ô¡.iWÆv=1¶ã¡u¨C]úèΜ9311Á¤£££0::êq¸� 69Àèè(È´sׯnˆ³ÖÔ=sY¤Ø±M/»mœÙ2Fêš¹w›Ø©Z­f¹·U}«ªªŠù|Ã:æ«,í̘½Es�:;ù"˼J<'S�£KMÊUt že–ÑûM°!0{K�»hy;:ö÷�ô¹2Ãcáüž–¶¿;^I»2žðê‰×J'àÐP‡:Ô¡Žt:]ff&“æææ“*²6?«ªàç(kÝ7Îõ÷gÕneÖæ¬Ø><•*Õq·‰�2s+±ÙÛª¾ÕÛÛË|ÎÌÚr4,íÌ2Cr2Ü¥RçS6y•xN¦ F—š”«è<Ë,£óI• ÉÕ$¸½0Î]´¼�û{Hú\™á±p~OKÛ߯àüx‚ Èz…åüxYõüxMeÝowX™‘V<€L_w¸©:†‚Ãyœ’›)+éùµV|1éÉÓùbÒÓd!Ü’²iÇnÁ“û%®÷‰àB ÿ™¿szä�ý׿ö¹â{ª Wµ«õž-8?êÒÑ…:Ô¡uë]dÕóã©+š?uç�w>|¸ù ^¦?س€Ç ,û{¬vЗTv/vÏÔ¡u±uW§�°Ôõ7:>H“þx8?ž`u u¨CêxdõóãÁz·mµƒ¾àüx¨CêP—žºh`;ž`u u¨CêxE]¶¿©¹¹ùðáæ¦}z¦2?^„µK·ò²¦¥­øEÀÕÒ u¨CºQ º$Àv<ÁêêP‡:ÔñŠÛ|¢­ã²@VP±ÿÀÍ‚\ôµŽŒk¦–�>�©·ï;°¿LÍó ¸ZZÀ¡­SÝ–<ÅØ´ëŠ�Œ;éözŒu¨[ïºh`;ž`u u¨Cêxdõs ;ŒÇyQÚÔÜÜÜܸÝÜqbˆßù|aíª¥•D¸8K¦òÏëêP‡:Ô1°œ=´ù.77—ù°ê9ЛÕæ¡Çœw® ÀÜÑÒ!knÞã°ÙÏÕÛÛÛ˼”ÜDá«=€h:6Ó”G;–¡­– .5¬G]âót³Ô­vôõ˜™+ˆq‘GÓñ4SüZefx8ÉÍ û‹ëâRá|t~ÇÕ¼vmâ]Çb’�oh,ÎÊ‚À5»ýŒ�¢TY>¯UÈ–ExõÄk¥ph¨CêPÇ Ár](r}…öä¹kYµ–™å|ßÒè WË#®u u_´U@ Ž¡3èÄ�’n/d6G.àî% u¨CêR¯ïjú®{2v=l(zØPô@qV€Ç9{Ú!¹£xÓ¡Ò‚­îïÝX9L“ðú{¬•NÀ¡¡u¨C�È+Ô\nkiy¥¥Í\và@pô¶!wäµÚý�›gÞ=ÚÒÒÒr´ö< �±û«Óôap÷‡¶Nu‰¦º£CêÖ».Ü´ãyü~·oqdyÆRݤßsÍ«¥Õã™rïÆœ­Ì8<„º OešŒ¿Ú)ذì„WO¼V:‡†:Ô¡u¼¢.ÛßT¶üeKõ¾‡G_ ê/}ë{©96WK]| èC—Ö£nk¾òÜûÕ)çž’<^u«¦u=f&êP—2¸iÇ;?;oYðôÎÌY<ã䌓 à�bIÅFݾMš;žÿµNCàò¼‡�Š™mln¿,ཹ=À8¹08K®XÂkÚ59“2WŠ£ÃœÄè0:ŒNðÑ]™˜€ô@ØõÄkÒŽÇLÈÆùø�Ñt©u1Xm©~}E‡:Ô¥nn�¹2B.‘äË ¹D¢Ì�ÀB Dæ=úÌ,æ�ÈÊÜP<=s�‚¬ ɳ`ƒT ^üLH G&-Re’^ó9iu�:e®ÕFš3Áü‰»er.aç$F·¾¢ ¿òÙ¤»óÕI|+üxðÜ¥gt¹V×)Ÿ?„]OœÊɬn‘œ\ï:›Ã}uÚÉÌpxÇmj9¯ºˆ u¡ì(T›&ç'ác® º$à¦ok–B§�•ª•:…,‹È€,"Ããv^uó2%±.3ƒò˜%„º���ññq&µÛí`·Û=·_ì–Øív�i}ö‡b¯]ÈÊŸíµÛíà6ÿ±ýº~÷öÙÙYˆ–z]ó1Ö&’ž>}:é½Í9n€›œKü[½½½Ñ¾ëuÍ+dÉEñȃ.ÆÂÙäUâ9™‚4]jR®¢cÎÔå1 ¨%ÔŠµÒÀ‚¡0Ûëšoí8�Üþ™ß9w#˜q1ÒS§N%¸e´4Î]´ßo´sçœwSa\™á9�Ü2FÎ$Ý_/�@±àÜE3'ÑÅNy%íÊx®'Æv<Ô¡u¨KÝôôô“ÎÏÏ“zÈàg·ÇümíÜÜ\UUÕü¤±ãhÇøö;”Éçææ˜åS¯Çcm"éÖ­[“ÞE‚ߪªªŠö]6±DünÐÅX#›¼J<'S�£KMÊUt^�sjÎ37?—IHÔBø6ÕÛr½ç,±)¹ý/þš\Î`ú‹‹–'¸e´4Î]´_P´s·à$ƒ©0®ÌðHî®#gŒîÂU 4ìÔÀÙ‹œD;åMÓ«úMÓ~¿ßé\Ö=ôïìÏÏ\9 Br Î’©ü3BÀ:‡†:Ô¡u …O¾ 0T†.Q*•‰D$­Ø2âÃËår?+ æƒ{èh˹ÝÍMerpß>jÞßܨ_Ú,ÚÚ�þøóÁ«R}]ãþ2uìc>?qã¹¶ó†Âìg?{Ëôöö2¯%±·$¾Ô‘nïCo| ¿ù—}ðÌñ¿›&çž>¸3‰�Σ}7èb³óÄ êRÃzÔ1 ó9Úecs¸;rÎcùýó÷'-úÍGc¿;;~ßž¢/fK"Û¯ÇÌ\AŒc4Ýjs)AÖ03¿üÓnXº¥„ÿ7qbäL"Ñ]±‘ß=Ö·%OñrÓ§îÿÏ3 ”ÿg÷ï^(66‡ûôE›¡0{çæ Éef´‡WÒ`;ž`u u¨Cê8ABp¡\_¡uœ°€Û:0à)¨(p»îhkÝæƒWóª>·€Moµ¶ƒà¥Æ•Pft{†…‘¯ðµ|KžBVPr~â{c‚¬ÇÌD]Úê{ç©`é:g–$éö>ÙÚûÛ�Íϵ�ÿáñ�ÂmËiWÆ^�µÒ 84Ô¡u¨ãyÅ�º‚Ëm--¯´´™Ë`šìÎ}»mÈq­càĹþ‹ïw¼ó"Ã+ocìž“é­ÒsTºUÁ”ÂG�@hÓ…ìc\·å…jÇäåÐQ+øf=f&{�ÀæÇã&O"ÌÑ1sômÉWÂÒÀB‰_̧L6åÏË’e’ÁIÇÿzù×,gØã^çÇKáÕ¯•NÀ¡¡u¨C¯¨Ëö7•í_¾hßC‡£­UW?ôTuÊBª¥™÷M“üvíà£Ò])Ë€¥V͈.&(^_Ô„´lOHgÓÊyU¾J]¸=âTo Âüu>ng4Ö{f&§c&Z`&]H�Ž'øÐÅÈ“DtÁé!8oát¢³qt¸½¸¼PýúŸ/Ÿx¶mà™ƒÅkölǰNÀ¡¡u¨C]º!€Zð4Ñ 8´õ«3fÀ–?^j@·º¥‰ÅRQA#øÌD]jtÌ ™+æ~LpúæÍäË'uÄv¼È»žÛñP‡:Ô¡.=u,YÃji¦ú™¿rÀOtÑfN« ~Ô­VÇŒ.Èf&ôUéR`I+Ý`ØŽ¼êøƒ?]Ä–·Øº«S$,½…¾Z‚3ã%®KiWÆv=1¶ã¡u¨C]zêX²†ÕÒ‹ bÔÊ1žt|“Vü¨[­Ž)º§fØÁgføB¦Å)?›ûéÓ!:–Ähy‹­cjšÊ7¯,93ãKÅxñ˜©YËË’­Ûñ"#ìzblÇCêP‡ºôÔ±$ñŠ[æíD–Ç ¦Ò}m]¨ã\Ǽð–šaWŸ™á ™é¶9Ÿ8!šŽ?ÒJÇ\®Y+KÎLË^ŒaW˜Âax³*¶ãEFØõĨއ:Ô¡ué©cIâ·ÌŸ«š‚œ�ŽRߎÇÔ�3õè)Ð¥ Áë Ôò¤‡]a†i ÿS;†nµ 6¬¹îŠ�œš÷äeɸå(šŽWBu)x¿7Ft¤ÛËLGQ ^uë(ó’ç–°›9¶ãEFØõĨއ:Ô¡ué©cIZUKóªcþ cúñçbêΓë!“„.eÜ :æ IâuMf˜ÖÄÿÔRf’no\Ýú®@õ6 °æ™é ~‰W]�ˆ“00í¥1îuÑ*ì°/2®'Æv<Ô¡u¨KOKÖ¼Ž?q’xYûã¡.qÝâh:S¼×Ñ#3™ÒEøàC+t6‡ûôEØUÈÇa#3“Ð]�ò¢&(ãÝ$™WÂ_�Åv¼È»žÛñP‡:Ô¡.=u¡¸Í'޶´´´´¼}¼ÛöÆYĵ½½½à¶v¿ýö k*Ž�M=q/‹b<Ô%®«Þ– çFí©Ñ¥ŒµÕ��€;n+Hâ•Â$t|“>º©97DzߢÏïÂmÀ•غT’veޏ*i¢=¼’Ûñ«ph¨CêPÇ ¹!¬\·ø~¦h©Ôí}esåZ¦?^Ã'²ø;Øe$Ò߃t{ÿ­Ãä¢üL—¹Ó&Û“­½áÓpq¥ãŠô騃:6º¸]ò:z'x|àåwO ZÓÿ²L]ÒïE'§ãžtLE¦ïb":ã¨bŽdÃÜ<™¾Ç¡Ä˜U/†.Ť]Oxý=ÖJ'àÐP‡:Ô¡ŽΜ9344ĤV«¬V«Ç�_bÈkkyéG/·Y?ù ­Äíëå?}»íŒ9òZ›MôÈßÒË(€´ÛÀf‹šNÏy<älA–<Æ6qÓÂÂÂàç¹Ù™`ºÍÛ�½Sóž|ÂýrÓ§~ø…-yY²Yûôà¤Ãå°€}z*qcUUUè9ëòø™=0{K. 9Ãå!g•D›\ZmN¦ ]‘“Ž®|³ÚCÎN8"nÙ5h}ã�œttÿ}äõ—Ÿ=ÚCº½žùÙLBü%ÆM7mÚ”à–ÑÒt8wÑ~�¡ç®ÿÒ(üNA^™:9†Ç!úÝ,ñ4ö]%4ý¯î cÓN‘gnçæ Ñögç£�QÈÍpÇ�.vÊ+iWÆ^=ñZéêP‡:Ôq‚Ïç ¦^¯7˜ŠÄðgdÈdÀ›YõÐá¦"q”µ^ooo¯—td|Þ{[‘NÍ{h¿¿@-�±MÜ”©'f>û}¾`ÜæŠ�<ñ÷kð??»Ô™â; ´ßuÊé÷GŽ:FÚÛÛü¼sóÚï›vZo¸ 'S’t´ßÍ58á ýþ­ùJ6¹´ÚœLAš“)H×0º…jÚïœtDÜò´ÉFûý÷í)ú??«€K“³W§�tÀ·ª3.Œsí÷éòÀ¿µt¾2™ØçÜån¶ª4Æ]%¸ÄA.üðøÀ;]—à¾êÂ{“Iæ]îËm7œ1ÎHâW&¯`<Ad½Â²?^Døî�Çy§£ˆ]J¾s´wlÚywåÆï(a–œ™þ·Ž‹†Âì±)§‹ò¿ýð§#%—L÷í)bÓsbfËn9H:­s”Íá~ìÈ9`.ÂïýÛØ´‹¹œnÁ˜ïœùcÿõØ—úkï �¾hûÚçŠï©*Lå±¥†Ðη,ø‰tn´9ÜO¶öº(&!yàömµåÚ;Œv<Ì –ÃnÕÀC<_íMŽÁY2•¯ X'àÐP‡:Ô¡Ž˜2Æ ü×Íç/I&Ö­É¢<'/šœßþi·(ÿH2‰(kgÇNw©?Y5{íôÇG»�ºÈº-yÊ—›¸S»··78<÷âD½!|ÿ棱±ig^–ìKŸÖnÍSSÀ€UðBu°%O16íºeHñÄÉË’MÏ{lwAȬ+\|ƒ:þt; Õ§/Ú.L:V”ñ˜Nz»‹5ÌE¸5O•Üå$ŒÌTFéeª³1ÓmG¦Ÿ+„‘™qu¤ÛûòR/ågV$]Ï56í„èSY¤8ºh¤Ý»šÂëï±V:‡†:Ô¡uœ0{õ¼sjœI=óvðÌÛ>uf�láüïGN´ZÈm •ØïÏ”ñÚ¹÷gíQÖÎÓ[î8˜™A‰|ÎÅý„§cÓÎS½CÁ%‹%étãÆ�ÁÏ®9¦Gœ•YrÅFþêd?|y—Z%—¿U –‹ÜåOÂ^UUº„^pÀØÄ$,õ~I. E€€ÁQsèr"ó™}.­6'S�®ÈIaG§“{àìù‘[výõ”¨ýÌ’-ùJϼýê´sµg\çî†}*˜F‹nÚf€é)Ûº‹.‘sÇÄå¼1#7O#^EÁèžýU÷Ø´3_ºðÌÁ òÆLܽe�Î_ ]~~â†gÞ¾%OÁþÊälǬNÀ¡¡u¨C'®‰¤ÿûßu:]âÛ‡§épî ôWåÜ�Ï8åÙòOè²ye.Ær7Ï N¢ûÍGc—®Ïåä¾ë6•\:ŸÀw3 , Ô\n™¡iº¼PÍþwÇ+ØAY¯¬£þx]ƒÖ–—wkÎ]±§ýñ‚½Y¾sÀðlÛù±ig´y´˜¾%Àr¢-&æóª&@[Ahç™+6òõ—™7 ò³d»·iþØ]¨�n»\2ýBW\�Á·¦oÁ˜‰ô@öÌ�©é�캪NtWläw�õ­xÍþÑwŒSón;ãÎ�‡ºôt¡u¨CÝz×­„ëùñ¶æ)€)àE›U)qBç_RàòøO™lL‘�a©?Ïj'ÚZ1Ý3õd’¤ x¡t Z¿{¬�9x·mdjÞÃÌ[Åk$aL –¶:æR�^Ì8b€; ˺`f!c¯ã•µÒ]±‘�l%¡K ©×uôMÀ·¬ª`ÆÜߘº'†+6rjÞ“IHbì'MæÇK»w5…×ßc­t u¨Cê8aff&ø98 ºÇ�_ùiùX[ËßÝnÐ|rw‰Çíðœ;ú¶y_s“6âZ¹ö‘'¾`>@Eq¨2 ÉåçäÈC;ôÿ 9m²À—>­�6�@y¡š9†êmas¾'¬€µÜP˜mšœÛ³ÊýDãw›€ôµ÷T§/Ú¦ç=œì9.)áVÓdÉM0wuÊüƒØ8:!Õ å…ê±i¬²T¿æÑ¥FǼ(Èëè�6™ÉŒÇcRòØì(T›&ç'+ `Û ;ÿ÷/ÎÀvmJnÏAN™¬p§¡ Æ6é0à `;ž€u u¨Cê8¡»»{ff†Iûúú€IíMSsóÞÚÚæ®vÚÌÐwEõÐá&×ÅÈkûûû{{{ûú̟ݧ¶õ3KÂÓ…ê¹kÃ0m$Ú6 ¦¿þõ¯C—d’¹kÃcÓNÏÔ•=%yѾ5rið;÷ª5ä�†‚U{{{W,ùÎýÛü÷ß^Ì&Š ‡Zß}jÞ#v˜¼£¤¿¿Ÿ˜73¹4wm¸ KÎfÿIä$ßixN ;º-ùʹkÃcSNfɺθ(¿Øa..P…n¹E2 Ûhy¡:ô—;e¢K|ûð4ÎÝØ°)˜FmÀ–`t±S^Áþx‚ Èz…e¼ˆíxî¡£-çv77•ÉÀa|û¨yscp ‚˜kÝouhÞe¾¥w{'ùÁà¡ÓÓ –šÂ8Ü3¯ûBÈ‘“nïCo| ™„äÈ7ö®åñ!¬aºZ»31sÁE¼Jm7„΢q‹·Ú­0Wd°Ãa"ÜÅ Z^1=èš÷o�=^DB‰éŠÌ²?s4°?êÒÑ…:Ô¡uëQ—Bp¡\_¡¹zäß_jiiùé«?û/KNE@°?^”µÐÛÛ nÛÀ‡õNEÕíٖˌҶÚW%ÃYÑßãNƒ2 É�]¼ŒPÂS÷’Ð×Ïv,½�uÙtþîÊ�ïm(®|7¤µÕ1©»3�µÃÒ庂µ|µ¼5�Žò³å°|~Ë:§'ïj #3#r~âÆðÅóyY²$ x°Ô•zpÂKo•!ÞmûãEFxý=ÖJ'àÐP‡:Ô¡ŽW¼^ ånå]ZäXì�Wq-€!××qôwó¾âè»-PË_>TåôøØ�S²¢¿Gm¹vkžR)Ëà©„§î%ÁÎWyY²=%yAWÀ�]…©iÒI“nHÖmÉSŒM»˜�C¦æ=yY2NÆé‰¦ãžtùÙ2XêtQwuÚ ü�?$ŒÌŒÈéA›ºp{ÒuF[óU089÷ÚŸ‡˜ 8nYûãEFxõÄk¥ph¨CêPÇ ®‚ Ýæ�ùí÷ÿ_�77þΓ‡ÿI7;`õ¾‡7•É£¬]Wó«ë÷UåÇ2¨åœü�^O\\ â¯PÄSµôÎ͘ÑCB`\){gOÀÍi¢Û𧀫ÓNf°Šêm^uü�ºõ¨#ÝÞÓmŽÉË[�¡z›&“� N:˜A­¾ù�Ûã~%MÚñÒ®Œ'ìzblÇCêP‡ºôÑ}ðÁLzéÒ%¸té’Çáž#¯É.]º2íìøU‡b¯r<òÄ·²lr€ÉÑ!â7U*•)°Óªª*žöüÌÁŠoT«î©*L�KØ9™¶ÑI¬ðqïÀ¹Q»sj|Çfuø6ÁßתR…B‘ôw™4ÎÝØèد�E;w¦É9çÔøÎÍ„}e:§ÆƒùÀäIr{fö\rÊdsN�×íûô «9¹}ªäÒû+3wk¶Êæü•]„Ë–DtÑR^‘üð‡?\íwhšöz½¡KÆ÷K¥TÂÉ Î’©¾EÀ:‡†:Ô¡u Ù5û¥ùºÐ%AˆÅâˆÝÖÃ^~¿_¡P(•J…B¡Õj ‚ÈÌÌ L]¸è5|¦y-sö¯\Þòùú¤}òš&O|ú­ÓÛ¿þÏòék±ÖÎ\×lÚhŸ¾q¶¶ì³ÿ°c£ýÚuÍ&L1Å4±trñ÷•ê4b¿v½pƒkÖràKÅtŽù$®Y‹"GkåÞ¢ ÆqŸD»e“}[yáš'éôœæòÀµ�ů_¹¾±xãÖM³ÉíägNš7oÜœ?3lÖÌZ,{ëôà¶¥CŒ+ÒO‰dŸ6ìLäá•48®¦`u u¨CêXŽ«ùSŸ;Cì øÜbW†x^¸áq;ìW&Éy¡ü†Ç= 'ÎOÒe›)Ÿ;æÚ…ÑË—½ª ÛÈØ¼¶H”¸áY˜ñ˜Ž ú5j¾-Átôòe¯*Sx.aç亊Î�D:2hòkÔÉ}w)M‹sçœVM/Ƚ³“b‰T4-‘ÊfÆFæ<ùågÈ3òIgFÚž;®L—[ꙋ¿[$RHüÙÎ$÷ì9m‘B2ïs/Ì)¤JŸ¼È¿æÑELoËÎ*ÊY6-;Ž«‰ ‚ ‹°lÇ{ú¯‡ïÓg¾ÒgÊÝUŸ�äÌ@§sK£>;¡µÔDûUMÙÎ&yFDø\ìùlÐ Þ°”çnîËßòw˜ûäÌÄ.f¹®äÜ"Ïܰ–X†k˜ÏÁHjA9ú·Æ b^¡¶ÎM•æo5暸;L.iÚÖ|[βn{œ·ãñþ‚ïjœ%SÙÏ^À:‡†:Ô¡uœP’½!ÂÒíE7fd”~kžoîòµ …ú�Ù¤àó΃4+#ÊZ0NéËÕy¦Oµ¡$;Â^¹Å<8¥/OIÏ¿”ëêP‘ËÊï'<7¶@é&g^ö�Jþú©ºk µz Ò�ŠSÖ63§½`Yúœ#“G¾3'B6Œø¨,ï¼>±É©ÎÞ®ã›Dtd¼?'°AY¯ð1?XO¿üü}vŸ/£ðÎo<ݼw€£ûí·Íûš›Êä‘Ö‚Ûlì8qnÌôñ_‰ÏüàKe\Žˆ ˆ yæøßM“s�IHŽ|cïZÎ@º½½ñ1óùéƒ;wnN¾LûåŸv3ÖË´xAp~<Ô¥£ u¨CêÖ»î&î�“ƒ…_{ýW¿úõ‘—ÊúN¹á渚׺Í'þ‡é>þò/^ÿ?¼'Û|£€‡‰ph¨C]D”Äâ[u{¶å¦@‘µÕ©äÒ-y æ3› ÛÇ‚³2†ëø&MÆÕL»2ž°ç_ÂùñP‡:Ô¡.=uAÜæ«zw…äÚŠ ™�™!ÖZÛ€¹ä _ÑÊ@]±[m°ò}�žîIÀ¡¡u©.Y,ÚÝQ~sÁD— î›û˶ä)š÷og¹ç‚¬Å·(n�ÌŒFÚ•ñ„]OŒíx¨CêP—>ºáááññq&u»Ýàv»=·$S$p»Ý ÓJHÒᆘkÝSÓ¤uÒÄl#+än›ÇãþÒ�?þ˜×ý¯H{{{évN®£è‚¿¯U¥}ôQÒßeÒ49wµåÚ{wi¿ö¹âíù™ëîÜquenRK_núÔgK6°Üó½»´»‹5ÿXž»só†ô‰.ZÊ+iWÆv=1¶ã¡u¨C]ú膆†˜tdd˜tÆb~¶ÍØ‚Ÿ£­�˜²o)ßµ¸Í˜@º=iVV¯û_‘VUU Ò%ìœÄèÖQtUyÞ{ª …]*ÏÝÜôä“ å5›èu¯¤Ý˜+·m­t u¨CêX޹âr¹‚ŸŠÅÞ î¡£-çv77•ÉÀa|û¨ys£~i³ˆk¡£å�;Ÿùêç‚n*[uÀ«¡··7•¯¥R'àÐP‡:Ô¡.œ�¹’ve¼ˆÊ ¤ß«ÈØÅ̲ô934xE¢2…x›„³¼X$8CÒeÙ’Ü�e.ʆݮK9–­Ôy}�s®€@¤“‹wüFÇè\ §*3½^ÿIT«—-äC7ãô�ñ-­‹ÿG–XÁ©mÅUáõúsðŠE;’" §²å:åÿËBè/WTž%ÙÆi«üŠè”¿ßM{@$Ú¡”è¸~`¹Žw.xi©H¤�Š*39д_/w�½\ÑÔT¡Ê~¶³‹ªiÜÇL—Gwwõ[)Š"t•55定ä`g§µ²±6tJxr¸«s¤¨¡¾”û'ôreéëê± *ª¬ÝWÊu]@$ „Æ�ªÌ¤Ì]Ç{ öв…ÜØ–Ÿ&KWk§™Z\§©nd®lÞt”e°Çh²“¥ÒU×Ô–r=»c¨Žn?ÞcYÉ}x+¢³w÷ô�S@U×îÓs~a.ÓÙ‡»{Œã$A¨TE•5{8´QöÁž“…¹�P–¾žž;E�¦¤šÝâše·5uäpwWÿ8@�ÆPS»KÇÙ¯<¢Î>ÜÝÓo¥@U”ªÌ{"¯¤I÷ùñ¼¾@Ÿ+`¥aóâzÔðÊ$u„Èëõ¿ï äfKÔ‘÷”„ŽvP�þzBó—¶,ú(Ú'æ Óãèè@Ÿ3�­”ìÍA pf>0š‘üîaUà±t^¯ÿ}'�›-J:3ãë�s.Úl33=€bUÆ.þ†×­¼*è@Ÿ3 PJª3D.Êÿ¾+�Ë¢HW§ $÷,Þ"èq§ÿŠX\Ä¢Ð?º@ г2ŠÄàðøÏ¸u,ê;âê þ ñíj‰h‹ËÎ#º]–ü³LçœóÀެ �\K×¼ÂèóŠvgIÔ"z”ô÷S¢½,êVâêÔnkÉW'u.DLfθüF—è.%�Ñ-ê²%  Gçýý^Ñ^)¿™ àµt÷˜ì”ª$iOòŠuÖŽ¶–sn7h«dšìÎ]œ;!ÒZý�­¢W:Þ¹ nPWÔ¨PS–Áž£™ 9ØeôKU”¹»½ë¬ŽÝßHËë‰)ûðÙãˆô!mš¤ùlO�ÉBiŠXxÓQæž®‘œÚ†zä`g{× .ù?ÜêÀcé(sW{WŸ®qOÒ™_Ç@võX(`[¾ Ó…Ÿ&ÒB††Cɇ´*eîé2)kju9ÜÙÞÃæÔÅשJî/]\5ÜÕiRÖ°© ˆ9Ücœ54*U�}°½³gXÇ¢¾#®Î~¶Ëè44*WeînïÔ°)¿.ÓÙÏv™ ºá�žréšWYzzÆ•µ µÂ>ØÙÙ3¬©g‘›qu¦:`Ùm-yâêˆ>&3KU@YºÛ»ztljWÐõ�††ÆR�ƒíí=f]½>ù2e"™ @qÿðZNÚ•ñVüñ7ä¡s…Ëïe艀h‡TR©X·à¿â6áËtzÈ+*SІœ7[H\T`D{pÆ�¼%a�¨H!É͈EÙ¢ÀÜêY£»"êDâjõbÉÀKƒWlZ)ã뀦/8é\…ØëbX‚:šž €wÁÒOƒD¼C!fÓô´B~Ux}ôŒD¼+C B|{°i¾ˆ« ]u! Þ«qxî"èD ðÒ@ ,KèñtôœÔr‘@¤#D} ´K&J:?—éDâ Љ‘‚¦}4Ìyh)!V‹@T$ yh`QÆ‹«QØm�quŠ Ñ.‚©neKEàfuþâêÔrÉ]ÌZhÈàðR‰œ™@Nœ7fî«ÖM¬T+Q—ío*Û¿|Ѿ‡G_ ò»ü^ÈígMvmM½²§g±9†4��ºj½ }y‘±kÐl yËþÖ$‡ûÇU•µÕý]Ö�e}#`¨¯…Îþä- ë4%55:¦š]¥Ë!Lv*|I¹"ê}í¡Å—g)Š¢-›úýø: ìg»Æµ5ªg–…*‚.Âi¢,V’¢ŒíÇí$ûÖ™¸:Êb²h*u¨JktÀ¦ù"~t7WõÉ’úZV-°ñuAPP@¬Z‚âé(»•ÒT2Å,B_ªé1šÉòä yËtDiu�Š)t¨4Z5NQ`7Yˆ’ šRƒ¦ßd�ÒÒdmñu@ØûVÜÖXW§ÒUÖ”2×>¡Ñ« ŸÕ\quš] ‡˜µIR,¯”D2Èá#8x…’vc®,HM´C)Ù–Rö i¯Hü»![ «|×4–N,®VŠuËKŒ BRÍÝëFqt"‘NºøÇºË‰‹Y_WI)::`œóýe�ÖÉ“ÿ3:1mq\2qG kqt4dHDe I�Z²+ƒî#læ«Z¡ ¿*\>Z*‚!§ÿ¤Ãw’ ÌЬþ¶�«[„¦/,ÐE 1›¦ì„t"q¹†Hߟþ<°#“ÕKËñt¢ì pxh ô¸‡öÑÀ¦,´üG'Ò-Þ>hËBÀ+g‹hW¤K7B©¤²ø:ˆp[ãS'ÍXªÝ é t®œ»+3rtŽÿÉ9ÿ¸X\Æ®�_ç|t%³šË—j’gù„Hš=µûÊuª›'PvŠP.ýÝ@hÊI±ú3i™NU^[»K¿ü¯eUé¾Zîr&ŽŽPéõ‹/R‘ƒÆ¢¨œEñuåÔR‘¢ †»Ž·ï!‹*Y½š€Ž2÷ô8 5»¸x#tå´`ᧉ¢MQeMCã¡Æ­µ§ó¬’'®Ž´�Aöuµom=ÞyÖB±Š1~t ”Åh$Kjv±lªŒ¯#ôÕ•Dû‘ÖÖÖvQ]Í¢i&¾ŽÐh »iØN9l²PÉæG¾üG§Óëi6š¨¢J A‘$K÷‚P$«RP<D¸­ñ©#túÅÌ¥,g�v]¥>Òn8Ó1ØÏ¶oíQUV²{14¾ÎÞ×cRòýðJóv¼D`õ7DZGϸF v©Xýížhh"qu¶Øëœ!CY’²dKýqu.O`H$ÚKˆ À¶/ˆÅÕ‹›ˆre¢\OÀ«y‹|t¦J\'¹(ÿûN¿";ù‡ ž;—70#³5®ÎëóŸsÃæ]Mʆ dg'qÆÕ©3%;\�ss>‹tRQ¦?YS4M�ºüW@¼W!’BØÕÈi+e˜ŽcÕ}d`A&ÙÍâÍÉÄuêLI]&mqùÏ8á.eò5‰qt4Ýç¢Kþá6AX’vDÁm>ÑÖqÙ +¨Ø`Ÿ^w­;×7úvËGõöºƒûËä‘w —M |“˜Ž²ôuu�(kêY½f˜hhDimc)eììììÓ4ìJöaWGvõK+ëKUÀÅ\ñ£S•×Ö3Ÿ]y¥Îd4“{4¼E¤Åªª¯o¬%Èá®ö®nU㾤_‰KðÜ‘f£ESÙÀúeÔ¸:ÊÒÝÕOT7Þ_ªûpggçY ‹×zãê4{j«»{ºŽ÷ƒJST¤S±)�GÔQöÁž.TÖïÓV~ä°é)‚ŽcÕ‘ÃÝ�F§¡¾–Uñ¨¹¶¢B60`ƒ2}̵0`.ùB“VêŠÝêîsV¨XÞÔ­Ò—¨úMä®TEYÇA[Ë®#ÍÚñÈÁÎΑœÚ†Zêû�4õÍDÃ>AÙ‡GHU ‹¿ãé4»îßµ¨lo·V³W3ntXLÆBW_ªûp¿EURÍ⺎«SéJTF“™Ô—ª€²˜HB«ãS@ÙÇÙ�²Äu„N#ÃfJ§'€2›ìDŽ�ÏèÈá®öqCC}©Š²÷õÛ5†ZÎzRæ®Î~¨nh)kJt¤qÐRºGG�Ã&»¦„Õ=%®Ž[âê(Kw{�ÓPßÀæÅïUèÌÆžYJS_ªÒl²ƒÖÀŸŽÐ׺q%·¯¬·v<mSŠ¥ÿŸ¾“.(Vr܉obë¼¾À�æ(§Ã÷®Ã÷®ÃgôÅØœ• @$Þ­/¸ürøN:é\…˜Íîi•“ñn9\™÷ýÉá;çíR±jE‰¯‹w+D¤ïOßûn¶WfB™€‚‹_püVÊ ñ^ ÍÝŒŽMù<®N!ïÑg¾“ó—T²›Ý "¡:‡;`¥Áêò¿»øó[h�JÅÕRºoÎ÷'‡B,®äYÇ-ñtôø½ô ¹xKywžUwøѩ3%;Äô‡ïOÿ�H¼73Ý3óÌ™3CCCLj³ÙÀf³yn/8å6› dZjzÊᆘkÝW'f¬“&f›y'Èݶ©©)p�$LMM¨ò+J¥¦ö·Þzëx�wã'‹5‹Ë“Lÿò—¿„-Ÿ{Ø–ÎùÙ¤-Á´··7|ù¼sŽùLYŒŽÞ°›:ÿŸ––#GŽ´´¼ÕeáØµ,:Gfmm‰¥ó—­­­¿lÖÖÔç/p›“Ë¢»™N߈˜ÃDgŸ¿ùÙ_\[Iœ=öVkkkû ¼¦¾|�ãëdùU¡*¯0ˆG:[ßzë­ö~`yeÆ�nj H‹Å)Q©–mü}­*=yòdÄåä¼�ùLèjþA7ݼõÍ7ßlï]ÅVÝò-¹�n!¿¢š0ëÈñöžëÙ•µ¥W¿ñ˧»Ì$y±ãÿ=räHKKË‘ÖξÉ)B_S™mî9ÞúÖ[ÇF”5ŸP/pueÚûŒm6s×ñæýÖïÌTpËi˜›aõ+H º«ÃÆÛ�Qcû‘Åc8ú!¯Ñù‹ÿ¡Zi:þÖ[­­�Ý úú=:^Ï]p-¯¬‹vop‰ßï�¿ÖçÛR¾‹¢¦ÀãõÈ<@~I]Ýf LLxÀ“±q_CõÖ‰‰Í›7OLL€ÇãI:-++[¹œÞØphåž }ý]·Oì\�§ªªjå1¥·ß%×Lx<ÄæÚ»¶3q-¦º¥¨9q…EGlÞõ™º¼%#‘´+rN.�îæò }xs�÷™C»‚{¦7—×Þž½”ŸÄòcà"ºWEFž¡~×ÍsÇstؼ§î®‰yü}­*ýÄ'>¾œÐ×ß}û±¸„PlÙÝP³,ºÐí¹Ž.£´¶A¾}ÑÅòwzî2 u÷ÿcÈïk1"Ûð™ÆÍÜŸ»Í{6-s…\‡»ó8½ƒEŒnsÃýÙ+ãå5ºŒÒ} ò­‹K4Üý»ÅµI?¼!íæ@›;‹_¬ph¨CêPÇPøä òiÌØÏ�î:Úrnws3-žñí£æýÍ�ú˜k¡£å�;Ÿùêç‚n*K0Ì䛪‹_R©ph¨CêP Îç@O»2‚ ‚$eLA$q¨³OÝý=#”<ùÛ7ê—=­ ßÿý‹ðԽϛ¿#­yñiøÁz¼á« Ïþþ9çã_zi$tsmeÃ7¿ÿè¾å·{jøµ¦GÚf@ZýÂï^Ü£²û©{Ÿ1äüùÑGK‰èÇ��$A�[޵iÇ£ÌÇŸzà{o�2Y½ •JÁk5�zý‰žê´,ÛLš““““£ðΚÞ{éñWú(0·>þÄë§L³^eŽ6G굚Þ{õ‘§Ú-‘Ek�ùøcMO¼Úi¡Öú@A�T¡ÔåäääääHÿŸ““““£Õk eŽ^»ô4Xz´åioË”KßôZûÛžyüÍáhï`—™ Ì=ƒ >’AnEÖ¤ÏÒþüëý^�¾þ“ç•kìg_{ê{m#Æ—^ê¬þIýRÝ`Éá7Þ¨×PæöÇ|Õ4ÛÕ6xx—¦³} çžÿøÅár€¥ý±¯¾j2µ¶›þ—~-b ƒ"Í*lAá¢Úóƒ_üÀÞùð—^�êï}qÏR!î�£‡áf3àâ£�Ù ¸15üæÃ�ïì4ß_¹eÎiê·@¹,ý&gÞÿ¾: IDAT"Ç…�$A�[’µhÇ3wÃa¦€š=�~ÿëEмǶ=¡¯®/¯}–PÌŽô Z(ÐÕÿß_xöÙo×F~i„ïüÑwÕÕÕ}ñ�µSöö‡ëêêîzú,ɬüÑëêêë\fµw>\WW÷À›ÇüØ}uuuu÷=þæÙÁÎ?üźºº»šžn_ªa¥†ÖÝÕôøk] Àrüáo�r€é™{ëï&÷h1¾öøÒ®ú–9ØþãÇ®®®î‹<ÝÚ<ûÙ››íXûŠ r+@èk«s€´’‘Vk+µã=#vûHÏ8€¶Z{s-eéz…yfÕÝ÷Ø�;ͬî‘D™»^y¼é®ºººº»xêÍÇD{$‘}­O=ðÅ:Fùð�Ú‡#5‚ ²¬A�´­PT[Z.ÓUW瀹ÏV¤¡Ì=�ã Ôæ ¯m4€éØ÷¾z÷]M�=ý¦‘ÒíÙ·ge¼EFÞz½_µ§ºDé?õêãÏŸ%55�ïÙwI †Û�NCCu„"âø±7Ç‹ê¿R£…ÙþcßûÖK¦¢†ƒ5Z¯µçÕçÛ-`ïzþ±—Þ�’êšj�½¿íùÇ^¤ˆ¢Jƒ@ZRYS­#–võjU^cPÂlÿ±çߤÌÇÿÖ«ï™f mIQŽs¼ç­'{m�yõ©ïµõÏ‚¶²¦ÔÞþÖ©Ù¤³Aáš‘W¾o‘žï�¿}âPÃ]ÆYÐh#>ÒT†j-Àp×0E™»†´Õ%ÁíȾW{þ]YTYS]B™Þ{éáç»IHü‘dï|úáçßí·‚¶¤$Ç;n<öÌÃ?b*C£=’ȳ/=õ–q\SsÏÁ{î,!GN½úó CAÖž5xW“rR*Ͳg¡Ò©f½³Tð1òÊÃ÷½ 9ëôh땺ÆÿƒxåÕ7O�8½VSO›©§íÍêoÿì¹}„÷Z”w¾ð‹ìQ�¥ý᯾:ÒsÌHþ¤º±žïïë¦ö”›»¢ñ ‡Ÿûn½Æ®7ö¼4Eß|ñ�:²Ôtïó&K¿…j„®#=^Ð~å'?¹_OPƒ¯4=ñ^ç±¾GŸ{ô›Õ]ß:å,ýÚsÏíSQÃ�ÒÊï¿ñ“Z Õ÷£ûž85k!¡\ÕwäÍíÁÿxãÑrÕâë¨m¯wúYIgû€òóÿþÆww©(sëþ5Î]î#‚ ìðÎÎr[÷f|¾é>âæÓ®¤±1⋚„®Ú |÷Ô`Ïð01襡Zg}—YEùÞ,(?ÿâÏ—`>òÀ#ÇzŽí?«Mì‘Tjo}Óèå�/ýÁØ»žjzÞxêõöû÷¢¢=’ì#f/@NIumCí®ûëI]”÷KA�”³íx„’ íËÞê H3 Rqóá����uz”ÚʃÏþdiÜ0UyÃÞøÿþøÛŸ¿ðä×?oP8�¯¾áOÐï+Wè*«µ`¶ƒ¦²¡Àiì&-]=³Ñ‹xÊ¢"Uðp¥ú Jx) (K¿¬Ç¹÷î»ï¾÷‰÷œ^óxÄ£]µA„F§Š¢,F“@[ÛP®B_ÓPÃgͤ}Ä åµ¥* t••9‰å+‚ ’JžüíÉE~ÿB%'»tŸvE5_ÿ÷£ zIè÷•ÌöwvgJ÷é—ªJ)KŸœï=qïÝwß}÷#Ǭ`Œòªø#‰4õÏ(«w©4ÕwÀ¸ÑLRQIºšú€ÙS¯>ñà½uMO·õŒ�€E<A�4a ÚñTºj-ô[Ç{úí�: Ù÷ÚK]ú¯Üoè1΀>ø2 „ŽOÄÒù£ç[GT Ͻب/ÝS_º§¶šhzäÝÙᳪVáñþ„ÓT¬–ö�í=š~kô"K¥M@º´X ཹ㢯¼ðdM°A’Ði"ó�¾áfÁæL|d"‚›êþxs€–ª’š"è÷](ª1¬|´äÜóýïׇë$4‘^oˆôHŠ'�ðH"ô‡~öNIûñw;{ÎŽÌŽß}ÕØO¾ó‹ÿŸ½·k+;}ßdX–´íhÇ#$šÑ¾̀ΌQÆJæx;ا¹øt$×4ˆ¶×N�S°,ßX$¸N‚Hq-¹1Ps;â¶67–›¨|œ>È}ä ¸ó 2r�ÔD¤™³{³5›ÉÜ? að׌ͬߓG±å½Öû±Þ5Zï~÷^ëkOÇög ó)ç“Øs…z]û¼mý߹zïçíòûñÛŽ¯i îf϶­w zþú¯7‚¾óóŸ¼ó>l£¶¥ú‰úùÏ,À¬Çê•ç`ÛÎò�ÞÿqÇ¥ÀkÚ5R¼uØB½"€÷‚@½úê«Ô�+õ#çO‚l�¥ŸÀu62{þµ—@è'Wâ/F¯¼ TµMþ’ žø‹‰ï½ý~ƒÁ`0òW^Y<�aûk¯Ü»¯¹åùWåð~ðêÕW_}FôW—þñ�øÃ2ùIÚ¦xe;À]�3¾Ë{žþ› (xyÛ–µ~’>˜ù›s3 {þ¼ë­«C=ßxâ…¿Çh,ƒÁ`šOäìùž?7ü¤Ööާý�þ;Úºuù{ôÚ믭SñÚ–÷‡Z…çRpô»Õ%Ö­[áî]ÐkðzÊ[‡üÛß}óÍ+¯ÂÏßlýJeü1”m¯–ç!Ïè]xmÏkyŒ«ü«_{í¯¿ûö¨±öð—_¾3:ú.¿u{y#À–-Ïo¸û޵¶vÄÐúµ5 Ùù?´ŠÑKÁþ?©ò¼ôü�wƒï(Ê ¯?[ö|í•Kíï 45}ðUÅû?xw­.0 óéb Uð*üØ€^. ¶@héûç þÇ—·úöwkÿxôU¸9úÎ]ôÚW¶À†~’¶¼úµ?xe ý�Ÿ÷½óï¾ØþÃWå°ÆOÒ¸ëéÿñÛ0úþʶ÷=ïÀK¯¯±ÿƒÁ`>f>™3зPÚ3NüaÁ+Û÷.HöŠæµíÀ¿Ý^]{nõÆš M_>xæ/ _~e;þî]¶Ê^+ûÆÌ_MYþÛþ•o4¼¾%ðv�ßúÒ—¿ñƒÆ�‹¿>Û^-ÏC�’â<ÿUó™†/¿´=ôöOGßÝòÒW¾ñƒoæm€—÷üA� ànè½»ü}LÙòòÁ|ßð•W¶|7øþÖ— ñƒúW·€|Oë_Tjdwßþqÿè�‚†Ê—VC ƒÁl.¶½\   ¨„tj[Þ7ð�²W¶ßygtôPΘãï:lð'I¾çÌ_~£ì5„Þ}7„šJKWü'mÍŸ$ùWÍß7|ù¥-ïüt `ô=…¦ÒÒºçþOâ`0 æãâ3}ôÑ5øè£�>üðûw7tøêñAà'çl?‘ÌÚ'ÿ4|ŸMxíÏÿöÌ'ëa0 ædëÖ­Ï=÷Üg>ó™¤ïŸÜ�ƒÁ`0�ÈZ?^Í'ò¬fj¶P¯×·¾þ¤¥Ü¹Ùñݽ}óíw¶~¹òáÞÅÃ`0 ƒÁ`0˜§”§(ÇûxØ¡›o¿{¶¿Vùç�yøÍ ƒÁ`0 ³©xŠžÕÄ`0 æÁÏjb0 æ™ã±?«ùÉ칂Á`0 ƒÁ`0˜'Îñ0 ƒÁ`0 fó€s< ƒÁ`0 ƒÙ<àƒÁ`0 ƒÁ`68ÇÃ`0 ƒÁ`0˜ÍÎñ0 ƒÁ`0 fó€s< ƒÁ`0 ƒÙ<àƒÁ`0 ƒÁ`68ÇÃ`0 ƒÁ`0˜ÍÎñ0 ƒÁ`0 fó€s< ƒÁ`0 ƒÙ<<ž/‰àOü‰?ñ'þÄŸŸÈçCó4(�?ñ'þÄŸøóÓùùDùÌG}ô@ >úè£?üðîÝ»+¿œ™™ÉÈÈx, y½ÞœœœÇÒÕ§\Ü&6 ‹Ãâ°8,n-¶nÝúÜsÏ}æ3ŸIú>å�ƒÁ`0Okýx=4O]އÁ`0ÌCƒs< ƒÁ%à:ƒÁ`ž9žù:ÞÝÐû߸ý'šZHøþ‡îoò�äªm Wm[þ!ÿè‡îo=9}6ñméMl‡ÅaqXƒÁ`0˜µøXëxï¿û‹?û§»ÿ>[ð_¿øg/¥­ü§ú¾ß�'x«™�ºÓQñϤ$ƒÁ`>�à:ƒÁ`ž9{ï9“Éô m>úè#žçW~sçÎ�Ï}îs÷ou78sôÚ�÷²4ЦW·<—ø¯ÿp˱Mºf§îÄÿp¯óÈ¥Ù:>àüv×MÁPbã°Ë|zjGq&±¶t~²ã[Gÿ·Î´ÿ\U¤\¾Òëõ>žÝbVéÀÏxÿå—$%E̤û�Ï~1ƒx¬â6@‚,60:ÎdPäs÷m+µ]ɲ9Iß³ãmæaEQ6ù³Óø©®oõ ŠóÒ×øà°�Ñq&ñݹòý ŠXýß–>´6¸µüŒûü÷ô�ãÃïüæå/}ñsÏñ×÷Ïvÿ“Û5ìßö¥œ/W‹›qµ}»ÛŸ‘ñóÚ*ìg†š¿=òÜLßßÉ¢³É¥fCæÓÿkG>ß÷í~"?î’G K~²½ñ¯bÄð™¿ÝV\�±ÊêT¬·oìúSxY`ࢩë7ÿe•¬ÆæC—á[}ccn—ËårõþÃÛê¢üíø™ÑÞïÛþfÐívÿä_~K%SŠX¿«ëû]ýC.—Ë=É|áK¯’3—¾cét õõ½ås»Ü~ÑoO_øñ÷ò9É¿žûÞ0ìü/_\KÕ�sŽcq)Ù²eËg?ûÙ”?“«¼0 ƒy¸Ï�×Ѷþ%�Äoæ~ygîsÛ²�i½öë_|^ù[Í;…[Ön°V5QÚ–£�¤Ž´øè±„/žÜy¾Ì­¡ë (P�È5Y‘Ÿ艊[ÍJY|xìê˜2§€Zo ήÔv%K欹ÿØL‹Ûb<šô8?‰ð Ö­å(ÆÛ=Ú–c*4ÕÕÜ=©9ª»0¦:h,ÉབîÉìúì{Mââ·Æù=‡öï aÇÃ…=!¬DJˆÑªaC*]‹*QÜCB�$!#’$6”à%Š[Š· ävëê‘`¬xGíɆl¬·£¹ÛnÑ»Î^—Ô[³I>àj?{Ž´”€»Û-©9Y¯DÀÏ YÎöåœÔUk­ÞßÕti‡ñX ÀN¶_ ŠÅª³WùÛš¯ ¥ñLòÖǪ́£ëj‰EˆŸe‹[ŽåD†Ý& æA±§V—'M¡ãén›d£‘yùžC:rh,8Ãvˆ¿ð3ÿl¤Ï™W)ík¿³eþ•ÅŒˆÖíÏ!SXg󋈢ø`MÚÕ®ë3�¶Ò]µº)ë½Øq%ˆDA$šs¤%ßßfñW´TRˆ�ÿ‰œ¼Øuå6Ÿ dþ›µtÆÌзZ‡þÓ‹òy>cO}9õæ¬ß×íV”C×(‹ÐËùH χ:Ú.G£Ñ´�µ Z%?yi…ΕÙDÒèCÀi¾@l)!&/u]öZˆFEùŠçæ¡�- yÌ ™ÏÁAãŽ[]Æ‘¡ùY(omÈžL°ŽŸêjî‹Ñ‚ô�CåÐïpÍ,Dç%ô!�dÉQõù‘K+G„Ê;ÚšÀ0,Ø —Q+EH¥õO†yå¼³£Ï"˜‡ç¾TøÍßûžY@´á°WÍ:Nwû—jHYqD—]Y¡RÈs*A Œ÷bGÿm‰ÐùÀOu5»òOÖ+¦.u]› K·nål Ái¶å ‚g#¬¼¼~6¹ØP," Q:¹ÕP¼QSN*)'—”\Zì$2Ë+vHùžås6”Ppu]èŸ ¿ U(öÔVJ\CK³#aúÔ�3‰R(í²]�M‰P”�l`Æ;Î^™]²V´Cw´äž±Á•‘õö»¿JÛ‰ï�_QQ»XÎD]C»Ïºô^‰ˆs�M¦íTQ%Æ“_£Ê@À�i÷+%O„' ‡Á`0 f5O6ÇC[Òö=æÇ°…8\òü ë ¼_o‘°ûܪh9¦"xÿÅæ î�”Ô×ga÷©Ó}SÙµ9Gÿ"Âîn·¸¦¥^‰f†šOû—{`fYUÍÑZ ±“ÍC~V±Þ³c\u4/9E ]_ŸM.5_¸É¶”ä+nCMYñ÷Ï&+´*‘PÆ×Í:%b½í–~¶N¹úq>P4VRìh›…ÝÛr,›`§ǸJëë›-6+ ÙÉŽæþ.a'»ûfó�-$pš/¸v¼ÉŒ ~·¾V«‚àx�'²ßØ)g”5ÅÈcfì9R“CÌx§x’Êuˆ*)QÞœ¬Ð*ƒŽfÞ‘–b)0£m–nÿÉŠ|Åm¨)¡Xï­$×-²z)Fd×-Éà§ÍÝc;�£³î]Iz]Ñ�«mžëêó`²½©Ÿ:ÙRLøÍN?CN:n©µ”d@Ø}ê¬3ÐRùÆN9£4È v¸PvÅÑ’ ÖÛf –Ðîî•:O6d_N}JÛÒ¬?BÒõÇrH˜q™ÏŽÍÐZzGÄéeò ·G´ëëpKjZê•(ì6›ÇSYÇó¨ ¶¥X ̤K±·A�Åîåq/‘NuØF¤¥$€ñ::ºÇ£Ùµ ‚¿É!Š»!>ºÀÝ7ùüÚzZ “ã³ 6iβ£Ö û“µº–“INUª@ªÞïè›-6¶$‡‰�tý÷–]Qœ« ^¯WŠ€QˆØ[Q–8f6JÈ Où!G[›§àgF»NÛ\Ê“%÷}ŒPíÙÑw¶Ã{²!å#¦›»Òµ¹Åa0 ³ixÂï㥉ök¶þbòƒÏgÉô¿u¿ /D[D<÷!>—”àñ܇¢-¢„K‘XID&gù%âg½B)Iƒ…¨/Â�ˆ� BFÞÒÊ I”âhüJÆd—¶á±nª9yT‰˜ÑS~wüÚ•®+%QO�-& 68É,hÒ$ ô‡yUbý“Q±&E/ÞIâ_3½…Ù[ÛUµáÛþJ®îI( ¹ ­×©�Ý”Êd,üä6””�õE€€�Ì?;åˆåRQ\ß�C3éò€$ìzI÷í?¢PØm>}%¨ycÑr¯'šSÛRI°ÞöfçTþÑ5^„"äR~ô6”¿Ÿ—g“0 À'¹®Ù½¢ÉªJÏcùðTTœ%A@æÐò«ÎþÛ¨øPª']“†` ‘4ƒ”+k�K�õ»Ýa,Àk9;“ÞÇKÖy/•zô�ŸêëókZŽ�¼ÿbs,@Fq1Øúœ¼b¯–@¬J� óÙbn>'…uK°Þî~†>y4‡`';šûK£<™<"Œ»ÝÁV4”d D @ȳѕ©0(3Ø)ϼ¢X �±Iñž†“pšÏ½Ç×4è&Oùó÷+âÞY7ì%ª‚Uu¼eçddðîÛ,P$;;YP&ºâLà W$F1!—òãA2H>x+‹W«‘ú6AÊo‘D!•*jZ´âgF]~ ‘”mVK‘HÄìX�¥¥ô‡yeÊ:^jâcGæ”(¯ô9§ŽTª~ÆÝçBÅG”0ÛÑÕ/¯?¢U€È 1�R=«™;uåVV½q­w7w¥ks‹Ã`0 fÓð¤÷\ùlú«_8óêú×}ý˧~øÓcó܉ü;+Y±e�h‹èë_>•x­´øÍ’® fsšHúÍJ)¸�:;:Ä‚²F§DìÒûxù:zòœÙœ&!-'fäŽ|¹ÛÑÖ.'‰ð¯ï,D�'J rjöxló�XQ> µW—ßuÎâ]|oÕ»t) ålÇY‡üÈ.%òغ”TÀ»šþT.•¢õ)V¼×4_W2uÎbNÅßA#•ÚU—íÔ¸A”¡*ÙqÅa6‹Åb’@ rtå“ó�(m)öÔ’R±ôÇ­‡Æ_xaaAB¿© HF>Û}úR}­"Øe1§‰ÒP~EŠ T�$®í‘še×Yó¨PVE­ �ÁvœuHõË®#Hb>ÂÄ«j�ªÒu;:n"ž%ÞÐå‘@dÓ G;£ÓmÀ{÷ºQVÔ¨:læÑ´´�îÒåB*ùl÷‘ïü²~{╪ŠD�¥Dòè/¾�—_¼s¡ûlÛM I 1ð,€¤;iÑ¥¾�* "¿¦¸ãœù”XŒ Kµ ”ËMB™¯¼ÒßÞ>F"øð<¿4îÆäQ–(—C¨¼6��²5š®sfo€¢¼>›@¬úl·(mà¥ßÉä0ËðñêÚFÂþ¾n,¯Qv�6�ŠD–r<$/Þ¹Ð}öðÀüÎzqÑI UòŽÓf—X„æyФP㬷ÍY«z Ue*·{)Yo¹N/CfÛ x:a§§ÝùGj×Þœó逸ÝÑ�t6 Ìè©ÓÁš–Êu÷#}"„]§ºDõÇò"�ö)à';šÇ6Øa¯kJ^\��x¿ÃìÜa<šº‡¿è’Wj?w}\Ì8ÍÝŠ#÷õæå1ž�×ñ7HtýË]þ3ãªÖ^o°¨… —p#ú"»~Ø^(Ln|¯¥³¬ì†åÚqîp™£jÀvŸ+’Õ:0ž^Y®Í‚ g?”V©»È"äê�PWѲu.ãƒý�ªÂÕw —ÌI2ƒ›0î68K“Zì´>fwÕ¥z‰àYÒdnã"�´^`w韀6«XÃQŒË¤o½Br›ì&š„Ð`ãë4CjmçëRãj,;1§ëÔ]ox¨°çFª¿ÔºË'z¦haB3“oŸl�¨zºŽöX=SÖƒ¶æâ³#óƺSx¹Åf'±MýÓ1Af•ÉZWH2β,C€¢ñ¬ƞãœñ@§�‹ÍM€ÊL³þ¸¾íˆ÷3\ׯ71zgOÕÇ*ö™Î IDAT8˜'Ãc?ïI×ñ˜µoÜθ»·ÄtÉC/­˜qÇ97ì0¬üÏ{jqˆ”†»mæ!QÚŸ±gõ:˜õõ¹‚+jHQ\Q²�ÔeÂë}=.Žñ:û=‘•](ߨ¡çâxÝ[àmÅ*£û¯ú‚ ÅbÉ D;öì/HHúù€³Íæ!Jލ>àê¾ê_)Y¬)¯ÜHut™'yƒ‘â`÷ióeqÚ(Ëk‰ñ‹]ëX÷¸‰[GîÈAgOgä7ï‹¿òðaŸ>àlï**äh¥¸Ô×’ÞsÎâ¥O׬“g"Å޽럑÷,ׂo×¹›’]ÅkûáY¶îÓ..%Ûe/lðÊ÷Cÿ±ò¯$Ýã¢E²Pcsi¥ƒ�ÃM8:«ÊµÔ´³Ý©¡?á�¹ÑÙ9b*§eëh1çê´ÇÔ)r¼%sxÿØyz4IÉZêq­'n”ö è©€�®¶úè¦9c+Ó00@ |Ö2ƒ£tu²ÊMôOäžÐg õö‚t)#µzØ)ýÀÀCõ™ )#IH§|2ÁCD8·8;2ƒ"+Œå&Lû �†�kZJÀùìÕŒêk65€L{~ئY©iϰÀg*:@žnÌà<�µØOz©Íæ£�Lõ K)Ìææ™ªãa0 s_oï�r¼„:Þ ¶lÄtÍ’>b2´ŽÄ„À4Çm–Âi}^#“IAŒaÒ«¬6½:`¥ `s5ÊF¬zã`Œ$0P÷ g Evý°]=bÒ·ßàæ²ÊÖ£ƒÖÝú‰L5cLVS�…�Ux0–N’0ç£Î [eƒ�†ÎirYj±5®z�œÑç52j*š wÙzª& ûŒJükLûáARk±V�è�!µš2n—ɦ_•ô1ƒÚ"k,@c²•{ŒÆAFYj²5 &ì†ÆÞ9’�™†Ï�'«gKu´]»¡±wN(äê&›…†ÁÆ�� ÆK­…®š²Ö@n�ÍJ»M7€rMvSR.ÇŒµZ;C7ÙÏ× ú¶ŽÒÙl…#ö=”Þz¾IЙèºkÕñÊzÉLbLLÝtÞ¢¹QM;u.;M‚ÏD³zœU 5En´8�iF]˜É„ææ¦¹]¶žÆÌ9§1îz êlgÔ®%MêBÕe½²L’™ 0™M=vmº¯w¥Îú,Æeà,éHU�ïÑ =Ód–À¢4Ôôb€ 0�n7ùÊô1»KÇ%º¢ð†¶È*Ì¥±¹”ÛÎë³æœC»ÒI26ÍT]¨W‚4x< ¦ ÑÈVD²0—‚¹éPz¡F …¦²¦[©,ä2Z=1!péUV[iàp™>>;\Õ+§�IÃ%I!'õ·‘­û ×—¶®d6ôØ4�EcÕÌá+}¸¿4ź1Æ‘uNg©`ÂX4XØãªË‚@oYu+Ý£6:dÖkvµ0ÐI—yRøÄçhì”Y†í!3XMGÔUö²ªÇVE1®ë¡Ï¨õu¹ý#¦¦ÜÐáÆ˜ÖÖS§áFœÓ@bfFÖUi<1K£zÎN[–á��ó‹ z nN)9mOrÝÚEÕÙí4ê-+;á>S§1uŽ0ô.ŸãºL߸zÍã@Ýh3©Ö¢}�ªq»†é-ÛçœÖª�­Lƒk€&¹‘ÆÝ�ƒoõ,j"›³P:»�&}¦"Ã`@#0$è\dñ}U®*ãÒµI;F@`š¡-oU©…ŒK_Ôyƒq–Ö¥ïsL4Y¨ÇtnC¶¯u�O÷–K+cF‹ŒkY×4`+;»ªZT�qÐ #Rh/7a= o‘5 ¤7Ç H€P €Ã…\ö‰ÌF§¥”œá8€¹i†ÌJ_г�„}ϰ>IK�4$„z�™åš]#ôuí»BsI®(„Gê­öR2Ô[¶Ï1]º«µ\4¬.²¦P£Ð^¨YB}|±�«úK­êa—…ô4µÞ` ÆÃ>í5W•ŒóYwô@]iÖâìH˜> ±ÞD)Ytk¢þBµi`Ø”h¬lÑXÆàdUé!§¾º}šaaiϵ&€�ó@Ñ÷)Uu¾§nu9XH-9 H*�»à`½8æÓÃS—ãmî}Û>Nq›Ø4,‹Ãâ°¸g‚h ÌÍM�å í¾(ÓÕ¹³h*ä q@ € Üà¨: „ê]Y‘儤,ÐjÐv …B&êøWjI ca²šÒ@Hi2ÉÌùda. B*7 \¡¬ÎñÈLu:Òe‚°êß…é™™$€LM†\Õªu£€Ì¢1ßD à9¬u b ¤ÿBé…”ÒsÕéI­8nndz.p¢Z+ˆÍ É@¬Ðj1.k �ºÊ¢.]RAsÜZz¢µL3 Ti“uÍüŒ Ý`¨ò,aÜuÓâÔkºn „­&€T«…½ÓŒ°¼Ž˜}äȈºîxªGß„25%’‚ô,™ F › ÌM´ëµ�1€b¸éaº&‹’Ä&4‘¨³ÿÝ€0KW�¦„ܽfdº`Ä´Ï ¤|LL £ë2Ûí7|{h—E»q ëdñ†™_JóÒÕ”0UWKL‘9 „êÆOÝ„i·¾UÓ™.Œ11!p±H¡¬ÜÖtℾÈÈ�¹zK®§±Ìži–Ä‹Uë‡ý„ÝhH¬ã-g0\ÀJ§³„@åæ’÷Bhµþ‹Adº€ã`n"@ªI�© )!“¬)^¢[êD( e B¡˜ééÐtà€Ö)€ q…÷4Y9}’�½õN²þÜ„)©Žg×.E†@–. ùæ �™ÖîÒÆ x@ªg5ïYØTzbß�ÁážäJ5æÓÊg?i’ñz½XÜ3' ‹Ãâ°8,îY÷$Swãº1ÂQYbàæ¦§à#s2ÍÒÛGB*Wð€›ñq±¥¸“q¢ÔætöœoR“±Õ„”Zè»1ñç¶€ô¬tfd".ᆲd‚õÕ$ý?pssÀùW(™(8ނʤ²ô6§Óé´וk³_Ê¥æ\ÌMLÌqñÊb€ñM01¦çRTù™§ÓÙs¦®¼4WpÃéÑX†6lIï5]-jÁMô»È¦žaÏøù‘Vçêìei7 Y.¸î〛¸ Õ2¡`c®»ò8`|>ÈÌ$A¨Ö•3öV«¯P—»ñ5¶ ]C¥ïq:�N[cUyá’&«¯LÖYùR&71Á3=X‘âœÆNAÓ[NgÏ™*™8 õê­­öX•> ÈLŠ™çsîkdŠ®âê­ñHc™ÁÅH(èLfÐÃ@`ÄCÒj2t½7Pjsy~æjŒu¶N¨­oé§­ƒ¡%Q뇽Zß3|�„•�ÒÈæ\¾Åb¸ûèŸxs"=‹ �L3ÀLŒÌqd²©SŸÔ#LfR”º±Çét:Ï›ª´¥ÔZƒ™lìŽW’õªM÷ŒuÝKð@˜ÛXk7Ú'âvr×õ@*)€i,<'x˜ež–:^tâ_Ç,ߊ±,¬ŒoAä¿-Vÿö’»‰oKobÓ°8,‹Ãâž „…Ç-¹†}t/ œ@c± §íê=¬w b Ù`+—�oñ}<ý­Á@— …—‹NBuÕ.ÎX­uQ2R(p¡UËø¬Æ3¥újz0�$c d ÉRk“ËPF·“À‘¥6Û6PÊ Óoª;ß²i2§�Zcç1€¹~CY?pUg+¿Ï >B�Éš«×Ó½B!”þL•Œ²6ŒÊʤ 6é@Uéd´t¯Œ¤¤ «ÎVe0”• …—®µ–ËÒ³˜ûèNRÈÝÔ$0…§Þ�ëЃ³º¬—r n°­~N�Tg2ÕÕ†Ì�3¶:ƒa7-$�K¯³§„s…é7 ÕÇ�]Üñû¹î±‰ÖzRÀ@¡Åª@–¶ Z; ‡ Œ�^~¦qdQ²Ôd#…Ì¢c[“òª*QçLuÌš«ßG÷’Bä0.m‘£nü|¡6Ëqx_uf:I¦“L @ së ôÄq šã–¬ûhG:)`X½Cæ íVuµ<îçmU‡WŒÈç3uNƒ¶¬]Èqd•ͦ–‘–çmY;p¤Özž!dMèËh!)ä:‹F‚L’™ã´ñ·Ê6ö÷AV~¦ÎeØM IR,_ºZÿ¤˜ K-�ƒú2Z˜N æ8¡@¸Z�{s¦²F™ÍUµ–$}Ætý@ÝI 9�ºÑ& ïÍŽ•¬’B‘)õ_¡Úô–­Óh,ê ÄbÂÌÒ¦ž&�r(ò,IÛ,÷�F&0'T§¼ƒù´òqï¹r7ô¾Ýó¿}\*S­H0¯V½ñ…ç>¦=÷oïßyuû½cй…ñágÞè½ú@JnœMüzÉ&6 ‹Ãâ°8,n-ž–=Wœee–k¦‡Þ£’Ñõê‡×=;�± ´U|VÚ@>Ž]÷7pÀÃÇÖË'EÀ^öxöëÂ;=™:m–�ó4în¥Wï(óñÀ�ÊœºkÖà#†}*6xœçs:¦5u¥0.=Ý»Nèq�'å–ÒͳC‰ÏJ³œŸP`Ïöž+ï¿û‹?û§»ÿ>[ð_%ªDÉ1–nß+<¦=ûõ�'§Ò&¾-½‰MÃâ°8,‹{šaFŒÕ­L®5ó¡¼ kuã„Ú´�HJèÒk{…B²Ôb[µ8�­Ëï�…M–:D‹óÙ�í7VVÁÒK�›>ÞÅñ£[±㱚Ó+ŒdV™7í ê÷…ç�„\¦ýs+þU ®³¤:!î“!�‚~C™C(H×�ÉõY×³î‰ T—gýþÿEÌ>Jا"4hÐwBiOúú:Èd!£žî 9ÈlZ÷æHzi“zó$x¡Aƒ¡Ÿª{ 'x˜||u¼»Á™ÃWý+€, eÞ)Ü’ø¯ÿ{¿Ïî’êxñoþûßý3pZúRœ>¼�ãÅ�|.ŸmïâuÇî!þØnK¯Ò�ŸñŽGU*‚™tûåÅ9ÒÇ*n$Èb£^È+Xÿü½•Ú®dÙœ¤ïÙñ6‹¿¢¥’šL0�Ÿêjv埬Ï~§a³�Q/l!Bb�sƒ"6|à÷šl|àÖrð3n‡Ã†4�ètň¸:.Œ±ÀƒbO½./ű�3®¶³còý•„óï*ìg†šÏÎÒ;¦†�¡µri12Û�Á¨¸bqçã.y”°ä'ÛÿìrŽœã%­<¦}¥¸Åxƒõ§ð²ÀÀEs_Š#á�å£Ý}WýQ…îýÁÑÊ‚ ð_l²x�d©!±£öPžû¬cŠ6™I$ªý•pñ¢¸D>æ~倿_ä‘ëŽì�C#Ÿ‰J׿÷”œ�ŽÁ`0ÌÆyæêx¿™ûå�¹Ïm˦õÚ¯ðyåo5¯JðV’”à%€(mËÑGRGZ|4ñIê'·^an ]E� üC®ÉŠü@OTÜjVÊâÃcWÇ”9ëçxìJmW²dΚ‹Ý�Í´¸-Æ£9A�óã‘bÝZŽb¼ÝC m9¦BS]ÍÝ“š£Š± cªƒÆ’ ÞÛaéžÌ®Ï¾×$..|kœßshÿv<\ØbÁJ¤„­6¤Òµ¨Å=$I"1"Ib£ô qKñöNx_i,3Þqöº¢ÖxRE;yÑâp«Ž …ÖØR¼2�V¶´°Þ¶fwÉɆl3NB$‹ Ñö/–4ÔLY¼a^µþÍ‘TÖ}`qOœ³a0 æåÉæxwÿý_¿6Ï“_ù�¹õ!ÀóRsñ¶­÷m²ºŽw>pÉܧ4Íaâ˜_�ÐoÖŒÇÑ6 ü<(öÔîÏAÞ¶fwIkC6\]Ƙ4‚Yž\.}мÛá #X˜þ��ê,ÇUþ¶æ+H)A<�¼ƒõt3êèºDbâgÙâ–c9‘!G·‡IƒyPì©Õ奪70žî¶I6™—ï9¤#‡Æ‚3l÷€ø ?óÏFúœy•Ò¾öñ;[æ_yQ̈hÝþœäŠ:¸d¶ùEÄQ|°&íj×õH[é®Z]�”õ^ì¸D"„ Í9Ò’ï_¬ž¡¥:9y±ëÊm> Èü7k錙¡oµý§åó|ÆžúrþêÍY¿¯Û­(‡þ®Q¡yž,ÖÕg$«04×¶¾„¿ÜÕïãÓ`eUÔî…¸9CYµ;owÇ]]P”Ò-ç ÉwÜy>8ÔÞ6óóDþ›µ4ºÜl# 'K2€õ¶[&÷¶ìW&,›Yo|€��;^D‘(3!ËÕæ )gWß-6 ˆµZùäÕ›³~Ÿå|¤†çƒCm—£ÑhÚÎÚ­’Ÿ¼´BçÊl"iô!à4_ ¶”“—º.û-D£¢üƒ ÅóóÐΖ†<f†Ìçà qÇ­® cŒH„Ðü,”·6d¯®Rv‡ÅhAúÆ¡rèw¸f¢óú�N²ä¨úüÈ¥•#BåmÍ`lÐË¿¨•"¤Òˆú'ürÞÙÑçÌÃs_*üæïýÏ, ÚpØ«f§»ýü¢ŽHYqD—]Y¡RÈs*A Œ÷bGÿm‰ÐùË…VÅÔ¥®Ëc3aéÖ­¢üƒ 48Ͷ \Aðl„•—×ïÏ&ŠED"ÊC'÷B¢Š7jÊI"åäÒ€ò�K‹�DfyÅ)a³|ÎÁ† ®® ýSᤠŞÚJ‰khiv$LŸúr&Q …£]¶«³i"Š2� ÌxÇÙ+³KÖŠv莖,ËÜ´Uõ‹y¶wŠßòðÑÔÿ]I"ƒ®¨…X.!DÀü†š­5ž0XƒÁ`0˜Õ<ÙmI#Ø÷˜ÀâpÉó/¬'ð~u¼EÂîsC¨¢å˜Šàý›/¸w@RR_ŸM„ݧN÷Me׿ý‹»»Ýâš–z%šj>í_î�™eU5Gk)ÄNv4ùYð¼ˆÖÕçÌè©Óî�ªÿ*¿×Ø’M0ãíæ«À.;Æä†–ú Äz;ÌŽqÕѼ=Kèúúl"p©ùÂM¶¥$_qjÊòˆ/¸6Y¡U‰Ü€2¾nÖ)ëm·ôû³uÊUµ”�•;Úfa÷¶Ë&Ø)‡Å1®Òúúf‹�Ç Hv²£¹?…KØÉî¾Ù|cKÉœæ ®o2c‚ß­¯Õª 8ä‰ì7vÊeM1ò˜ƒ{ŽÔä3Þ)ž‡¤r¢JJ”7'+´Ê £ÙŸw¤¥X Ìh›¥Û²"_qjJ(Ö{+Éu‹¬^ŠÙ5GK2ø)Gs÷ØÎcÅÅè¬;@W’^WtgÅjÛ�çEźú<˜loê§N¶~G³ÓÏ�“Ž[ªC-%vŸ:ë ´T¾±SÎ(�r‚.”]q´$ƒõ¶™‡‚%´»{¥Î“ Ù—“FŸÒ¶´ë��tý±f\æ³c3´–Þqz™¼Æíí:„Æ:Ü’š–z% »ÍæñTÖñ<*¨m)–3éRìmÐÅc±{yÜK¤S¶„i)É`¼ŽŽîñhv­‚àoò@ˆân@ˆ�.ðA÷M>¿¶žVÂäø¬€�D@š³ì¨uÃþd­®åd’S•*�*�÷;úf‹�-É!ÄF"$]ÿ½eWç�”{êµïw4;§X•´¿¶øHKÉN9ÌÝ)Ôh¡U$.yPì©­¤ÂÎæÓQmk½’=uzl†F·.¸Ä5g¿§D¬·ÝÜ=Õ¢‹Ç›JäN˜>a$I9"é¾Â—·´dÌè©f7™Wß’—dí²±–PˆðþKmý·æûº»%- RàƒNK³kÑëÊŠ#ºìDR¥’+ÒÂ3,(7þŽÃæ®tmnq ƒÁlžlŽ·%]œ³å×£Às¯ïÎ(ÜÀY÷«ãÅá£~V¢Q€ä9v,² L“ìT@¾¨D£aTäâ•QñN9©JI—» H4Õ×>ÍülFª@ˆˆ—!�øù…¨?"RÅ;Tf“i° òнR„2[õ3�"Ç#•ˆ ćùUÿ �&ÉúŤW™“-‘ÃLÊu#+¥øˆ– ^îhàçÄï…f�b„b§É Î2³×»ÚÆ`@1ŸQ¡{¡í‡g›?dÅÙ%ºåu’4ÿÍ=3ý¶æn–PÒ5ªäov6Œ”o�q«”èzdùU÷{®ƒYž_afòwD*TR@Š�’èÍ(_¬Ù%>íÎd¸ùüÚT/Ê#B.E€!–�–†€Ÿ™ðmGÛ$àç�Œð xÛ{óy„ä ) ‚žOÖyî—kŒ>bs¹«Í…bà@Jzç¼ãæLFà–˜ÞKD»£â|9òÅIoJë�DBQ°¯£í2B(Âò÷ê¢LòˆðÈݱœòÑ6s׸‘Fˆ <�ÄiHUQ“Óç<Ý4 ’çU¹ÊÙÿé•âN^?ì#Sc]Éu¼¥ÇÎÜ ¡lIÚò¸Å]qøâ¯(êóaP ‘B �&B<ϳÁˆ{•Pì� àj5x�®Ž¢x$"IˆBxà#S3LäÒ7‡32¤QDDX/7Y9}Øh$IJ„�*y|Jª¤c�¢ŽW¹tã‰3Öå!!eå±r¯G2é¼0�êYÍuÈÈ/!̧/)Z*7ú¸ææ®tmnq«™í8ý@×Ëë�,ÿ™qUk¯7 X’6çØÀf“Œ³¬ì†åÚqîp™£j`Ý­#œÕ:0ž^Y®Í‚ g?”V}Š„\½ê*z½ý0¸À` °*ņ"Kæ$™ÁMw› Wï<°Óú˜ÝU÷¶Ð\Òdnã"6¸‰äca G0.“¾õ9Èm²›hBƒ�¬Ó ©µ�Oµã ãj,;1§ëÔ]ox¨°çFª¿ÔºË'z¦haB3“oßãÙãÔg-ªž®£=VA�Ç´ú4Žuàâ³#óƆ÷‹]Ëì•Æž™(Êk�e¦ÇI 5Mv›–`F¬�¦Þ F(Bzaƒå¸6K4hu…8�6Ù,ZÁ ~_ë››pT&%ÊþïzåÅŽç›2ûíÅß+½|t0kÝ30›—'ü>^šh¿fë/&?ø|–Lÿ[ÏÝçB�HÄ-|(L{.)Áã>ˆD —"±’ˆLÎò9JÄÏz#„R’ Q_„/ ;„Œå½)�D)ŽÆ¯düAvyaëv¡š“G•ˆ=åwǯ]é ±RõÙb’`ƒ“Ì‚&M¢@A˜We Ö?kÖX$¢¤¿$fz ³·¶«j·ý+”\Ý’PrA[¯Sº)•ÉXøÉm();ë‹,(™~v*Ê#Ë%¤¢¸¾!‡fÒåIØ3ô’îÛD¡°Û|úJPóÆ¢å^O4§¶¥’`½íÍΩüµ6É äR~ô6”¿Ÿ—g“0 À'¹®Ù½¢ÉªJÏcùðTTœ%A@æÐò«ÎþÛ¨øPê�5PªhI3H¹²öh±X¿ÛVÀ¼–³3é}¼d�÷R©Gø©¾>¿¦åXÉû/6wÁdƒ­ÏÉ+öj ĪÄÑÉ0ŸM!æv�ásRX·ëíîgè“Gsv²£¹o±4Ê�É#¸ÛlECIBB„<]™ ƒ2ƒ�òÌ+Š¥›ïi8™§ùÜ{|Mƒnòô�?¿"î�uÃ^¢*XUÇ[vNFï¾ÍE²³S‘e¢+Î4¬pEbr)?d ƒäƒ·"¼xµ©SŸ”ß"‰B*UÔ´h)ÄÏŒºü ")Û¬–"‘ˆÙ± KK &èóÊ”u¼%¤š7CÝ—&�ìÏ&rTçnu036Ä–©Çïã}*Ä¥ä‹Û7zOàßß_¹í#�t�‹~ÉB�Í¥y”67áè¬*×RÓÎv§†þ„s<æFg爩œ–­£Åœ«ÓS§Èñ–ÌyàEücçéÑ$%k©ÇM´ž¸QÚ3 §vºÚ꣛挭LÃÀ-ðYË ŽÒÕÉ*7Ñ?‘{f@Ÿ-Ô?dØ Òe¤ŒP)x£ôÕg2¤Œ$!�òÉáÜâìÈ| Š$+T7ô 7fø:‹öµzJÏ��ÚÆ }ϰ=Kr÷í3�Ãö £Ñ§»æÑÊ—ž6ôTÙ‡µ¡^ºÌc¶j„>ë?’dºŒ$¥9�=–eýÓœæ©Ùóñò¤÷\ùlú«_8óêú×å;5vêXì×wnØ áÈ IDATÿš}ñs÷�H”ìTâµÒâ7Kº.˜Íi"X é7+¥à>èìè  Ê�±KïãåëèÉsfsšH„x´üC@îÈ—»mír’ÿúÎB„y¢"§f�Çf1‰EåÓQ{uù]ç,ÞÅ÷ñV½K—RžÁvœuÈ�ìR"�­Ky@|°«éOåR)ÚQQŸâaÅ{Móu%Sç,æ4Qü4R©­QuÙN�‹DYPª’Wf³X,& $"GW>Ùa1‰Ò�bO-)KÜzhü…$ô› ‚dä³Ý§/Õ×*‚]sš(måW¤Ø@IâÚ©©Qv�5�Š`eUÔªlÇY‡T¿ì:‚$æ#L¼ª©*]Q·£ã&âYâ�ø¦‘D6­p´3:݃ìí‹”5ª›y4-m¤»tù€�J>Û}ä;¿¬ßžx¥ª"Qg)‘<ú‹ïãåï\è>ÛvSBH <Ë éNZt©ïÅ£J€È¯)î8g>%#ˆÆ3�µê „2_y¥¿½}Œ$Dðáy~iÜ�É#¢,Q.‡Pym!ek4]çÌÞ4Ey}6�XôÙ,nQÚÀK¿“Èa–áãÕµ�„ý}ÝX^£ì:m‰,åxH^¼s¡ûìá�ùÿœõâ¢+’ª**ä§Í.±Íó I¡Æ=Xo›y¬äd­8¹—%2JtÅŽ ‡þ4ü‚TJæ¿™‡,ÏŽVI!PMùÍ.‹yH$B h½Œ‹Ì«?Â_ê>ÝÔÍür.úþ¾Á�OBø ÓÒ4´l}É¡†âûnåÉGƒ Rú�v„ÙÜ•®Í-îñ jËFL×,é#&CëHLŒ@sÜf)ˆMX«µÖäWYmzu`ñ tÙˆUoŒ‘¤œú^ @=bÒ·ßàæ²ÊÖ£ƒÖÝú‰L5cLVS�…�Ux0–N’0ç£Î [eƒ�†ÎirYj±5¦º)›°ж†æBÂ]¶žª‰ÎŸ'p¢çkÌ ïÆˆ±—ªÑCj5%dÜ.“M¿j‰È j‹¬±t�ÉVî1aüØïÆBÁ„ÝÐØ;G’`2ÓðòÄbõl©Ž¶+`74öÎ …œ@Ýd³Ð0Øx 3 Äa©µ£ÐÕyÃ0µ–ZiW£é�À@®ÉnJÊ嘑Î^Ïc´ž¯ô>l0¥³Ù Gâæ žot&ºnMæœ�ZĘ˜ºé¼Es£švê\všŸ‰6fõ8«jŠÜ„iqÓŒº0“ ÍÍMs»l=�™sNcÜõ@ÕÙΨ]KšÔÌ9�Z3`2›zìÚt_ïJ�õYŒËxà„H¡€ @Õòè=…�^ÃáÞ9psœº©Çª¤«¶aS0.}Y¯~Àµ8á�t’„@ p)Y¸GÀN—õ Ó9Ai«If3®è*spI½ãÔ`ˆ¨-È dBnÚ5M–jH hMÌ4ÁÔÁ ÞÐË€‰¥ëmö* 8HáÆÃ^Ð[}ÀXÒ‘ª:ߣk<ÓDf ÎdRBnb1@ˆ¥ë— ­:.Ñ…7´EVa.%ˆÍ Üv^Ÿ5ç4Ú}�N’±i¦êÚ@¸Ô w·€š*$ïÝôcã�ÀÜt(½P# …BÓYS�­Tr ­ž˜¸ô*«­4й4;§�IÃ%I!“ôç&Lû Ë'2zl÷ŒÏŠÈbBœ€r�½Pç¬Z¬¯Êè¦ãê¢vW¨0K&˜î老…жBªÔ-«ÊrÔ2µŒ$„ีã³Éù¸Ï@$xÿE³3Å®égfÈ|Zèu¶hçgFݳ*:G ¬·Ãìy¤]÷—ØÀéeÈlÛ€O'ì”ã´;ÿHíƒìDÿIÀÜîèN:›fôÔé`ÍÆŸÓ{¼„]§ºDõÇò"�ö)Øðqa¯kJ^\��x¿ÃìÜa\u„ÃJ˜ñ‹.y¥ö“qד€�l?=Ynü„óp<Ƴf;N?P/áYÍAmÙˆéJiçîÖBç@¡^m™«ñšÞþ»&Í[®º,ÎÓXtBí\zÍg-2Ï»ê²8�±Èöá㌡Ȯ¶‘½ŽPi-ƒ@'­ Y¯i{w=æ,ÎÓXÔJ»,>­AhwÕQœÏº{_àÌ5º½ÌYå²—’œ¯³¬:`NñàÜ—Œ×pÅ j‹œ�ã68¼Û^uÍž;mÚmÒ 8wMèóZékU2ðYéòž�ª¤'™Á2�½Îã,L‹©W]z˪',=jcõ„åšE- tÒeÓ¸-9dz´Õ˰E#d«igÝ@•µÌ¡í±UQŒëzHSš5¢-1];Î.:¡¶õÔi¸çt¦¶0ùÙÍ€½L³¹êÀNk',ÃV��󋌔s@ݺhŽ=Ùu{ÖxV³l¤iØN“¡Þ²²‘ãÃgb‡‹:K]=»|ÆÝí…=I ¸ c‘^`6©Ö¢}�3ãV Ó[¶ÏgéQµƒ .;Mr#�»­…oõÈNì¶W]³Î-‹ð™Š ²»@Ÿ s¯ÅWÕªpVÉ—¾¨µp`ùYÍÀ`祫R —¾¨S;ìÌui÷Ý0]³P׫Ë\ Wªz÷´¾åÔʘ‘Æ"#õVÊï†iÜV(\ÕÕ® Ãn{Õ5{ºƒ®X~j|yËüÝþ¯ øË£ù¿áîܼø'ßüñ»ôõ\®Ïz6÷ÈÅ,øÌge±83ÿ¸†ûËþÛWîOŸ¿¶�ŽrŠ¿pçoÏ|O¸¿¥Dxãè÷Þ>ø‡¿ýÿþåÿ§9ÐBÿÖæÖÿsèíêýÞ`å_ÿö__: Bï|kÏwrœƒ÷yð2Ô[¶oâø5‹Fèë,Ú籌›|eú˜ÝU:‘¨¿ªãAH†zËöMXÞÚÕº¯_7`£ÉÐ`u‘µtx€:Q”0ûR<`y/’]Õ_j-vU‘ñye4uÒלU2ÎgÝmö Ú—fGÂôùg}oâwÒ­Õ úß÷±NŸUSÔYñò¥ ³Êb­Ëòh5�u?sÒËÍ|¦¢äùáÆ¬Ðˆ½ÝÞïºî™K§¬ggÅÊ:^bï�eÆôóNíæ9pSóÌ��ðÀ¬}ãvÆÝå¸%¦Kz¥ËŒ;ιa‡!ÅAdI Rî¶™‡Di |ÆžÕë`Ö?Ôç ®¨y EqEÉR— ¯÷õ¸8Æëì÷DVv¡|£†~œKÉuo�?´«�^ì¿ê *‹%'íØ³¿ !éçÎ6›‡(9¢"ø€«ûª¥d±¦¼r#ÕÑežä ~DŠƒÝ§Í—Åi  ,¯%Æ/v­cÝã&n¹#�=ý�‘ß¼/þÊÇ} øÿŸ½7oê¼öý—æ-ɲ<`Ù ‚‰ †:@Kˆ9†<-¹Bzšštˆ¹¤… ½!Ð'HÊïBHOÈSH܆Ús‚iOK4¤ ˜¤ Æ!apˆ `;6¶l°%[¶eÍ£¼xGÑä-iK{K^Ÿ'�c$y×»µeïõ®IwôÕ·: ¿W ñ— ýZu®ûÂ�]ÿ�‹Á­þçÇFñ3%…Ë—�õN•X�[÷××Þ*~bô±"(Çs†t:jÞ< @þ¼rê`óPšÒyZ Š+´úZ½´8tÚuZ JSuô(u¾n÷úUÕE™tPJ"³›ÕjÊépèêLÅ[4@içOWëÀЬS—ÏS¥�W µz'gj©§—j@¦É—9 4Ó§«òKÕú“:GePâ¤L]¬•8›uº O­ª•8M é콦\K€f^©¦1à§C]‹A÷ÂêU2§�Rëœå{wÔíxêÁÝz(­ÜUºlÄ„ùÛ÷.{a÷ƒó[@»lËÞUáN±CѤ}¸˜$½-ÖšÞÖ;JÞº0PÚŠR5¨KK©šõðº ÝŽ“Í꺺ÒuÛCýe¢òKµ¥–iŠó)§ZN§¡Ngh|µjU5€Ó 59ün­5ó‹Õ ÖÊœ&“¾ñë6·µê¨â*bB…–ò‹¼¨5²º�5Í&ç*€üŠuÓ_=x±yþAýâ]ó�_€òuùä§ËšC.OSª¥e_ÚïlítÛŒ¶޵ýÏ=†ŸTþ]"O¯‡ê®¿$Ï… Õ¼£ÏϹzìõýuü›™âa›C#–ƒÛ-H&JTK¸äùcÿý¿ÛÍÂ{úÝ{;Žl}güsÇ4j™M&Êr$ŽÉ=÷k²óÀ;.g–ìVËP»7';OñÁ·^ø¿èãÿùÿüâŸã9´ú›�Uð„‘SÌxôÙmá�¤˜úíÇŸˆR}\Å6ÿ#ªËV=ý˸oo‹`××õÞ(–U„fÜý?xâþÈ/‘hWý|÷*úñ*'ôÎO]öøÏý?êêØ†¬N2þÛÏîþv/Ñ®zv·ßS¤“)Ñ~ûÉmL�PŒgâ§§JM—DËùO•Õ¡\rÈÔj5MPL�þb�C»)ê --&˜O9tu†üù#ÕG”v¥» ƒòbGK]³Ã9rGÝŽ­�ËN¿[™ïhܺhu°¥-¥š/`¾Ö¡»ÐbÐkLGMUùj‡îb3çËF7Sðp 0_ëh>égä×…ÉOh§k‹ç¿~´R ¦ fMsh µ�Že唡±ÑàX”L&½ @mjn49Ë)Í<­vÞ+‡7SŽæšê‹ód�^˜¿ëÝùŽºM‹vœ©<ª!&4¾]«Þrø¬š÷.Ys´yY`€êޱTþ<µîL³£b>åh<£S—æS2f§î+ú :Ge>ejn†é«�ÊüaÓúÝ{¡|Ë<æ·Æ2Í|­¶Þ;ŸÝÉêZMØŠBY ÍS§Éo5š ”2µÔé_�eÔÝZ-Ûuöè|JôÁE‡ .¯*}a÷îF¨…Bv±vfÞàÙŽÁywgÛ>•ÏØ¨:uªù7þ{oÛáºÿ:ùå{v?º÷õZÓ7–‘1yþD÷ûŸÙEjq¯îªkÜ£éz½Oò�\Ð7™Ç}+¿tù�÷ÿpxØ#ôzHAŸñ’@û©ÒïžÝþ­ 2¨tÝãðÈÖšò7+‹)SÝî.ÎÛ¾7ßT³zÍ…uï\¥È׫eºQÕ\SmÚþgtðÆ*¼óñÒ{Ÿ8™ri¼4”C9”C¹”€*ß¾kÞúG*jÔà�Íßõz9Õrô5OUÕÊœ&õ“¯?œÍwêñª^Yµ~}Ń%“E�¨ÒÊÅŽ­«WÕjóÕT¾Ì¡wJozeYÕꊓµÚi‚é”zÙÞ-µë¬xU õ²×_gp{Gå—k.®_]ýç×çOoÙºjkõÏ o¯ðmp8´ë^8B¢5ÇÞyUU5åmÕ+•ùÚ½OÖ­ðA™Zæ4€´•�ç¯YUQ“¯ÖÊÔ2€âu¯W®_ÿàƒåphVí}8_SlZóHEµšr@Å–-ù2S¹ìhÕúy‡ªàèêkÔ”JŸ|=¸m‰ºtºiõêõÓß}åõuë×/© ÔàЬۻ]KÊ5ׯ>thÍbÇöH§î+œ�»×T©e&(ßEòÝŠWUÂîêò³Qu$Ô<üʦº;–¨—íx]M™îœØÝþ�¶òë6O/uî�WõHE�š’À<ºïÍòUŇžzdõt�Z­Q›tz55o]¹®¢qû.-Ìß¾«xÍ#‡4j™É2}f“³õ¶w¨wèÏÿ�i1­È<ÿóÿ{}F¦"'“²õ›³%ªÅê® o~|¢ê{?8òÇ¥{Ŕۓ?ïáï*4Ï.úlíþê_J<ù¼?œ˜¯XþÌÅÃË÷~nùw¿¿z2H ÿö^Ýçø ¾÷Ý™2�N•[>r-#ú’o<õÈ…­¯mxGNIÉÏð ™þ/0ôþŽ7?•¹­ª¥Ï}G-�HDütrêõ¸oš\7�V¯Ç%Y½âúÏþi¡2+/Ã.›@ŸÝ SpM¨—íÚt²êÁ J£–”Œ þô}õbGãŽ7å¿^[îÍTW¼²ãÌš+ªÕ”CVºéõ|ŠúêÓáO�ŠVýʺÚõK*(µZæ”Å’%Io:üúÞ­ë—T;ÉÊŸüóëj€Çn×­_5{7È(í²½£6ÝuÚ�g‘1BJÕã!‚ HDøR�wôÁwÅ‘"娫ZTSuvÔÛ8SÝÁ“²U•óÕм·b½š�®û <$í(\¡;ø ;ýúŒîdõ…é�¯*¦6-Ù]ñîÑejpén:oé¼]:�Ë)õy)ŸO& �µ"‚à“ŽÛW—þÀõé=urÑ+/äŸûá«_n}vmI\…'>ŸÛåøÜØmöÉÞwwü¿¬ÿþpýaÄ%8š�j™¿n™LµU5£\zŽÆêtïZ–Ö•jŽÚÕ†e�ð”±\�‡rüÕB9”C¹t•3�=êEK“#çOêÆñLu[Wï6ÍÛ;=f¯qïêM�¥;@­¥j«VÕP€zٮ׃|ÝÑ­»éZ uù–]•Ѹ.Žæƒ[_½èÓ,Û¾#¹7Çñ¯â¦ {wjñ[ŒlzåŽM_uèOV=²UWþæQ-èkw¼ð¶ÁïYYéº]¡&ÄqƒF o¯ð%óùÆ}gcIͺõÇ[ÜÃâáa‘@ HŠ|çÙbùèljéÝs ÿßá­k¤Æ¡)OFìòÌ¡PBÉäò¡ó/mË|ßË'Þo˜”“Q2!gŠF-—…R òóõ[«*ª)ÊÓ·Œº9¢Y¶¥4½¼Æ½«·êË_�ù·’ò`A K×îÍâ\MÁÚ§¹6„)ìÆñ¢’ö�ã!H2ðzì­-ž›-Þ>ƒÌë•Ã0%Ž4‹˜E¾ÇK n—ùq¼`Óa0½w¹í�çn|Ù礲mf;‡OËdRU¶"'ÿ ƒíOõMÇ?i¾iäÚ(á ÇCAB`¹Tß½'ù>gyeîÊǸµ‡!ÇCÒŒ«½W;ûÜ>–(ÄR¼®{>ø¯oj¹ì‡8^—Ëç´{Ü fŒ/)ÌãÚ‰Œã¡µPåP.ýä,—?ia8;Û- Æñ�±Œ×7üÙMý¯ß¿üYç€Gš)Rf†ERKvA¿Íέ…|C,•JUÙÒÌÜK�C¿þÛåú¦[Þ(Ã’N`A Äk5·møŒßð|÷þ�â\MÑ/ǵQŒÀ8’ê¸=ÞóÍÝ_è J•ZH)Cîê+õ7ïùòܬqœ ¸æaÏŸa¯ÝâuÚïš�µà®  vàDøÆñPŽ�Z(‡r(—frCuµ ,[�1w¡P®ð ^«9mV‡ üÄç®»ÞõÇsM7û™yDa<°æYœ·Ï›TûR€Xž!ËÊ»itýÏÇMg¯wz}ÓCÆÇCA騶ÁÕÙ¦©zR½hi×îçìMWÇox>cîB®íŒã!)Ê…–ÛŸwôÊB™’Éë ®Ÿ›m¹5)3ñ#ÎCÁó8^»Õj6Í/ž0oZ×¶ Hh0އr|ÔB9”C¹t’st´º:Û„r…zÑR�Ϙ N][z¬AøFÓmã§>»a°É³ó:xЧ�Õm¶$Ô°´A,Wª5®õXß8õYÓ­>®ÍA�d€q<Aäk ¼ÿNߨ..Xû4Œ4ؔϘ5iË®MŒã!)Ä-£ùƒÆ�D& 2õþýôú?}C)PQÌ…K­8Íðð°Ïixœ‹K'�ÏQqm‚|ÆñPŽ�Z(‡r|�³\ª'cÜ’#’ô�:w2î½�üS~w)8u7Ócuœnï_ÚN7êò,!¥ŠÁÁ}á¬n‹“uÛÒ�@ ¢T@eýí³Ž;<^,hDÒŒã!’˜Îž2|Ĺš¬¥e”-�äaÝE,Ð5§z�~ðæ3?ò{ wì£&OãÎ4F`á?×:�u×tY9 Ž77ëô�ojó!&1R4Žç�Çé° ËgNž¥ǵ-‚q<”ã¥Ê¡·r~^žÇhè;ò†nûFwoO‚ä"�rd,ž²l�ÿƒ2í4¸pæërÀ8’~‡loýãêç·LãÆÇïà€)ŠÁ‚ƒòbA,£2ó&6t Ö|tmÏ!’v`A�Ô†vðHHË¥zãñîΛÒ©“6ï)±â":nÿêEkÃyr2é�ï¼Õ¢F]±\³ú§ÚÆŒã!¼¥¾éVSW¿$#[(³uLÙ€¾äó÷ï-Èfë€ Iƒ8�×ãv[K&æÞ7c×¶ cŒã¡µP帒s÷öø;x�1wá¤Í»¥…E®Î¶Þ#RzuœÈÙo4€âîÙþ’’¼ËŸ~º\0އ¤ Çï>lléµË²òXtðÀ™�ïˆl.‹ÇkˆÄJ�×Ük{ëïWM6¬oDÒÞùxeee(—rZ(‡r\ɹûô -,ò:‰”ªü5O å ó¹Ú)†våF%¥O&X.ÕûìViaQ@5£¢dLÒ³+™$ŸLIZzþvE'VäHä‰8~÷ăS ãE"ÏyÖ{—o^nKê/:I¼óñÒ`œ'ri¼4”C9âãIÆå£4ø)qnÞµKŸLaïðð_.¶5÷Z†©L¡X” •¡)³ f[‚>¦ŠÅÃò¬«·Lï]nãÚ‰Þùx©¾ ι4^Ê¡�§Ï²Â©ÁOeÌ]˜³¼rfvF÷¾_x­fE#�Ò'¬ ç ³|IðS’qù3³3|¶äÍ\Æ8’Òèz‡¼ß0à d ßÑ ‹¤–œ‚~›#¡*c±"³Ï%~ý¯—n$é‚$Þùx©¾ ι4^Ê¡ ‰ã Ê�Ïæ®|¬Ešé1ŒÇ³(�Ô>™½=£A(W„� Ÿ1ûÚ€…Të%Œã!©Ëù¦Û¿Þ•™7A,–&A®wÒ=·±�Œ=Äi–fâéÏo}Ú|›k[$Fxçã¥ú.8äÒxi(‡r4£dÚq<¿ýüÿʦږKõ,ê†#¥Oæ�Dͯw[¡�ÓÌÌÎ NurÀ8’¢üùã­ýv±2'iŠÖü"‹ËíöáDo6‘dd5¬Ç>iæÚ‰Þùx)½ Î+¹4^Ê¡�»ÏBEØT¨ëýC9+V€þͽIÈØLé“!ñ$ãò¯ XˆS�0އ¤ý{ÍÙ6�B �\�@é‚b½Å•dÑ´G$W™¼Ò·þñ…ÕéæÚ‰Þùx)½ Î+¹4^Ê¡�Çh€�¹…´\ö+å3fùìV2Ý;¡¤ôÉ$1:ñ8MÈgeÚ©3³3ìMWYTŒ Æñ�Ô¢M?øÎùPf‰%ÉÈÏ À¨�ÕcN^¹ìØA"£Šœš|ÑeâÚ‰Þùx)½ Î+¹4^Ê¡�Äå„rŨrªû+`¤¡HBáÏÉ´]¿íÑHŒ.¸I)A¤TݰyÀÝÛí‘cãxH ñióí 7ûäÙæÆ·Rm§TfVå±�@(Pæ|ԤDZ H Á;/¥wÁy%—ÆKC9”#8um±�–˸÷>°6œOtº&ON¦×jî?^íÑœº›ÞÇ€²²oÀH¸/ `I>ºÖÕj´{%‰íŸ9*=…÷t[ÑÇK2Õõ׺¸¶AÁ;�?»à©.—ÆKC9”#ølVˆXŒGˉ”*eÙHtº&ON¦åòÇö¦¨`úìV˜~îO“O Ik­‰q<$%8ZßÔiò '½/sáÌA« ¸Š$Ž”ªÃä>ñi ׆ ÈèðÎÇãÉ.xÈ¥ñÒPåwâxaz„È/Ñéš<9™$ˆUº&y±´°(Âkî�;0އ ~Ô|tÍ%V¤׆ÜaHSd0Û“£5<&}I¡Tn–¿Ðʵ!2 ¼óñx² žri¼4”C9‚×f�ðÃñäwφ³þtª IDATħkòádšÎž"­hˆ¢ˆ'ó†Õ#e{IãxÏ9púŠ�R‹$\òzmi¦k&±lhXzèƒä E�à��Ç“]ð4�K㥡Ê\�Lëñ@’W@‚T M×äÃÉ<}‚|•�G20å3BÇ#|ó�ï‹­5Þ'³ÇCøÌ¯ÿvI‘�'‰¸6äk8³ó�B±Í��þ‹H$‘däüO}׆ HXxçãña<=äÒxi(‡r¯ÍÌêñ™‰ï®ÉùÉ´]¿âêl#½F��7™ŠIPôóæ/É‘Y‰…’Æ0¦³§Â½ãx?ñø|Õ½¨Ê›(ðî& nO¸Û`qpmEú#‰<õ¯ÿv‰kC$4¼ûõć]ðô�K㥡ÊH/Âp¼¹$t×äüd’J¼¬%ÁÈùaà(yA Y Á ž:î³[ÍçÎD�‹_AXçÀ©µf’€k3Âaž2[�ƒò’ƒ2ó&þè×v Hxçãq¾ ž6ri¼4”C9`6/@ŽN×L\gHnO¦»·ÇÞÔ(”+²–®�ϘÑ´]q÷€APTZÈŽ�絚O{S££#t÷Œã!|ÃëþÍéÏÔy¹6$>‘Øš3¡ß†¡¼ä (sªÿz™k3$Þùxœï‚§´œíúã±Ã]»7wíÞœ÷þÈ7]»7[.Õ'TÒîL¢ÿå˜ Ç –#隉+Éãöd�eÙ}"¥*ZgŒ´i5(*Rd­5IoäûcáäâTAvùõß.©rÂὓî¹mÃÎ+ÉC�7áðÙ/¸¶A¾ï|¼ )p.g»~¥k÷æ[{¶ö?loj´75^:ÿ1ùÆÞÔ8t®6Aº4is&SKÎÑÑÚ[ó›8}xÞ®.2L†ãËÑ隬Ø0ª\¢ñ—óZÍæú3�ûÐjñ~úxîÞçæ�*'¿»¢Ì †âiªž„ðÙ³ÇCxÅ›µW²5“¸¶‚Öü"‹Ëíöy¹6dÌ �gýöôg\Û� _!æÚ€@R4¤À¡œ×jî=rÀ|®„r…êþ Åݳ… %I%ñÙ¬Ýûw&afqœÉ’óZÍCçÎ ž:Fb/î>}ÆÜ…‰“c–ãx‡ãËIò Ĺyc¯££5rÌ*68<™$8)Ÿ1‹ 1—i§ã¶+$.'—?ªñ�º(º¹C‚xò³Ô‹–šÏÕÚ›®Z.¬^´4X.a‘ƒg®P™ã€·ExAôë-·&eʹ6d¬ ˆ(õ¸?}ÜüÝûй¶A0ŽÇ9¯ÕLÅk5w½´Õ|®V(WŒ{tí”—iVÿ4cîBEÉœ&‡OQ2'cîBia‘Ïn�jr ðäLŽ9ã±ÃíÏVõyÃc4�j4kÃùØ®&r¬ÃZ=ƒ>�!å”e÷ÀPÝiVÌU.¡øË‘‘ ªû+È?‰Ë0àFféhsCCƒ$¯@(WøìÖÈc"C2 rV¬¦ &­b‚åb–@yç“fiFŽ€gc"cÔÎêÁÎ+ÉE(Û²£ã@„ðÎÇKÑ�BqóKÙ¬)UÁZò¥�à™`À�3™örŽŽÖ›Ïü¸ÿøa¿áùi¯ÿYY¶â{y²ºhaÒ2¤†Îâ�·Èr …–s÷ö�_$•À¼í I|�–øJäò×<ýÇkbÛY #Úå3f)Jæ€zÑRqnžÇh¶ãxøËÅV;È„b :g‚[©¶S*³«ò’ŠX"s ©÷?kçÚI†�çÐ�»UÿæÞh öZÍ}GÀÈtBæýK`¨.°lãxçœo¾mó A,ãÚ�Xè)¼§ÛŠ>^ÒËôOý�.®í@Æ: ®Ç3é.Ôž<ÓbÒ,yÄa0ÀôÊ'Wi©¯^táèÇüÊu¥j‡îä¡“}ŒRÂF0lׯô9@b¤@h¨®6û�• 嵚I߈I›wûßÕk)JæÐw´¤P'¤h,ˆ[9GG+qÔéG4UOª- )g|ç-Wg›87oò‹¯ù?îï±Äöþ¦èÉ$ç�Ä‚¢•“ß=ÛÚpÞrùcæŸ8†pu2ÉoƒÌò ÿg™·]™&?Jâ+-—¿fSû³�Û›MgO×ÑE€®Äó¯ Í,¯è?QÜãx·\ëìkÑ›E 5׆Ĉ¹pæà�s�«‚ª#L ÄòŒ/ ƒY}3'�ãÚdìÂNO÷â“¡R ºº ¦âe—~õûÑahÖ;Lu5Õ{÷VלlÔ€©¹Ñ©™_ªJ;OØõac¼M¹£`Ô}bwoÏPÝiz +r$|wkÏV…+ܱ/ïû?ÒhŽ!$7OY¶ ¤ƒ__šüîÙ`»ñy<ÆG&EcA4á&t%HN»õÒâ¨H ‹HZ�á૦³§‚å­ý'j`$M.R`6¦ý¨¤â{Ç<èRŽ$¸Ú›ØïEÄÉÉ´\ª÷ âܼ�—yÛ†3½:‘RE.ž#˜_xt;MR‰GCæúìÖ€±ÇC8¤§ßrµk u<Â�¦È`¶smÅXD¬Ìú´¥Ç8„'á v|¼†/Û.¿uàÏ�?Òø÷Ú[·nÀ­[·(Ñ7T”jíFÓÈ#ÐÞaÍ/žÏ¿,ß´îá¬ö·ß>©kkosÊÔw~j`á´q7uôþU£ÑDxöÚ‘ƒíÏU}¾wÿñÃíŸ]´75v4~³VËû'´×.ÿâÙög«šNü8Ë¿=ùÅ׌b*cîB#•á1Zþv‚áÑZÿ~† §‡{MYYý½²l�Þî´6œçêL²þÕu¬|mþËŸmׯ$mu]»7qpŸÏnµÏýç©ûÿ(þÉÏ'mÙã]þh|í¥©–Þ€×÷yCowª+–dŽ >ZÖÒ‡âySñ½»yñ<˜ÆO‰mu÷ÞGÎXgK3Wí{÷åd^À³F1�Í×#Çk5ëíN¡\Õê2æ.4O½Çg·~qp_×îÍmŸÖ�jíõ?üÎg·šÆOQ”Ì xV>£TowÚn|Û•‰ ìâñøŽ}Ú쑆ÞBM!ôÚÒ.L×äiæ¸?œýbx˜k;�± ;>^ÞÃ?eåøúº{öï4מ±XL‰„ô÷ÙÅT.+-PŠ�ÊŸûÏw�®Ñ&€H,‰D|£ó¶H,‰$_oܸòq¡ÛyûW/�¨€ÌÙór–WfL/çµÏbPº�Û6÷«ºßýÆu­Ág·fL/™²ç æ}�~Mο|ì—ÏÑ�øŸÃ€¯^«Ùu­Ôeß ÷š††ÚÅݳÅ�µá|òÏd‚¾ú¯Ž•¯>}çP]mrVCö¦F©\1~Ãóÿþ¸H©ºs Ü¿XSõ¤X øûî´_úêJ°Ö�¶75R¹ãrZò˜ÔäiTî8�ÑàioNƒ÷.•O6 €D©õ•ׯ_~\¤TÉ'Nw{sÈŸ ¶‡«+“É{ç¸|²þkðkä3f‰Ûõ+ŽãÔµ‰™vj´«›ô“gÇox^*WØ› {·9:Z#ü¬×j¶Õ�€¼eß ~6³|Iðï(æW&‚°Ë‰‹_fä$­j$�8³ó�B±ÍíæÚ�1Š:/ÿ� -\[�ŒQÃQî0 {½^«Õêÿ`ww·&3Ãxì°©öH §NØø<]¤?Y}RSY5_ ¦æ :uii>u牷eWªOÖè*Ö­Òèk¾ ËÖUpú«Õk5ë¶o$�éó×øÙžÿi®?3îѵ*É5ó©ðZͽ5o˜ëÏåÊ)/ —=n8ükSí ùŒY“¶ì ù‚›ÏüÈcì%—} fÐ(•J‘H$ …üã… Á¼ÿY{¯}X(M“ÉrêÖËs{oLÉf9&)8ß~û‹~ÂîaÓŸÓ–§<ð�"® AøN¸?^1ÃZ_M‘R¥YýÓ‰Ïíçæ¹:ÛtÛ7†.Ò04Öž!w¦Æ:�lzi¾º¸Tf¸Ðh‡î⇭ÂÒ$:x!ë=,—?&Ý µ/ì§ïªéΑ ·u©þÖž­¤Ç€ö…ýº)÷dÌ]òF¤T©.fUUd¦yæý^°42A�Ý’<û�Fº†0kºh¼V³Ïn…P�ý!GÞ>òŽ£^´´£°n½´År©ž8xšª'#ûÒ¤ÙFp× &0_�×j6|5Ú°1ËEÀIš�ÓÄ,GúÍÆÐÏ66¹ÑÐÐàÔµÂHé]0d¬9qOŸ�~å¨rÁŠ”ª‚µOËgÌòÙ­]/m y>-—êÉà¸ï‡½#”Ϙ v¿ßQ ^«¹k÷æžß¾2ªm 7nõõZ]iãà€yÊl=Êã¡La´y®w¹6s°<;AQ2GûÂ~ÕÂÅ>»µïÈ]»7t'W—¯ªP·¼]]]]]Ó¨^¼ª"@=U9u¡foõÞêZÇC?ûQ2cx!û¶ÑT@H'†ÑÉdÔ¯jáâI[öˆ”ªÈmâ²–>ÌnÓÉküa •ˆ ¶ŸÛ›‰Ó›¢½ tãÁÁÓÇCÞ¡²+7êÛWñâ’;æîý;@µpñ¨¡3I^�87Ïg·FµA`¾:òÑç ³.ŸÍÌÜ’pr¤Ï°=:2ùâ¡ÉÂŒ/—ß] £MBg88"®nüÆÿ�¹:Ûz�xÊÝÛC¦,Œ{tm„ùDøO™]|W×K[íM�æsµÛ6°ë�#H0&«£îú-!•ɵ!l≭9úm® ÃÈTõ7nÙ±0I*ìÏÇ#{ºã7¦¹š¡Ó´HSM¶N&MÆÜ…“_|�ÉoªhåÔ‹–jªž$¤P“§M~ñµœå•0xúx×K[阇q0ןa> �‰\€WO6bóêÃÉ1,¯"ž©ŸŒGΟ‘]•X\VÿV4Ýûvžï/1$6œº¶k&i–¤:.؉õ/FeßÚ碃‡ÄC÷€Eov ei^‰çO�vV§ Ó5¹G •ß4 u`$�pããrW>V¸c™zÔ¹c£ñØaàtŸ˜Éà2¨�áêú®Žš<�Œì?~¸ýÙªÞšß�&ÍIãG&„Ô’ä0ï�V’W0û®¢øË6ëñ‚†ƒ‘kÀîW’ÇŠœ�ñ�5yi^ë¥-,¥ qÓR ÕPáä,—?îØ¶aÔ`šÛ¯~29ˆË[X’œ™ñ·©.öÙ­yïþW ‰ §®mfv“+Šø�äÔùãIÀÉd‘$Ë!c�ÓŸµ{ÅŒ²”ÓWv�K ¶¹Ý\‚€4#ëÔ챉$.}< è‘[Òþã‡;¶mHæ.8|}Ÿ˜ä0É„µ³E¸»yæ»à~¶mâs»H‹šÁÓÇû�&·’¤ÝÂi;0Ѳ�L[N!0hEÃlÅBi@ú•ÏN�ÁÔVäHózŸÝÚ½og¸×�îÚ½™¡œ»·Çc4å O˜Ä¾bå…“³6œ'C®#û�$î*eÖ2‚œ?sFžYÿ3S°öiqnÞÕÛú¤¦Ú›>gÇ 73 uTøÇC�˜ùBgÉäBQN<�L÷„ƒÅÁµEb‘TñÙM׆ i Ç>A³ú§ŸÛEåþ©šô’½OL·”`’ 9j4Œ¸Ê w1ªmiEÉœI[öL|nWÎòJò߸G×F.¼a¢E|ŒÁÓÇc޹…l'ó­¾ ZѰ[ü$²Ð8þNÕ¢ß qürÌ‹ñX‘›´y7ÑóÛW‚-éÚ½™ìßy‹‰\@1!æÚÎ�r^«™|j|vë­=[N ÷ãä-1î´O¬íú•Žm"øl]šrV¬ž™�<_1A¸û 3³3˜øx$Rç j»BN&i¼ÉŒã!é�Çë={­S <ÂДR½Sy�P¦<ßÔåñù¸6IOxá〢dŽö…ýêŠå×,ýÇwíÞϸ*æÐûÄL:júaŠ]„º¾¶¥%srW>FþË~`%ó §•qï}wÞ¼´%¶€CÈv2-B9Äܸ"ZØÚà'qŒ€\µ`>~9æÅx¬È‰”ªñÿÌçjýݼ¡ºÓíÏVÙ›I�Vÿ‰GGë¨rÄû ðêéq‹ 3Bé—…”ù. eº}GÞ þg0ÄUf�  ]K[ÛóÛWníÙêêl‹à³�¤°Þ1F½hi“Oì1’Ê#!Ä6“}⺂Æ'xŒÑåjbI>hÔedæpm7øDbkÎÄ~v^árUvýõ[\[�¤'|ññ@¤TiVÿtÉ®}âÜ<{S£nûÆ{ùlAï“DMæ7Ž#AŒ­êˆã2ý)™ÛÒá´DJդͻIí�áà«]»7wíÞlruƒ§O€²lAîÊÇ4UOˆÿüÊ‘^ÿ,ÇñH¯ŸÝÚ±mC×îÍm¾g>W B¹"‚ÏFÖî¿ß±èo —“PÈ5÷þr&/&^\p³%òYfØT0އ¤ýg�É>¦Z­ Ÿ8ó¶•…’¼±Ó�4qH(ù—=ƒF3ºÜûðÈÇ#49|Úö“Ž#}GÞHt@�ìÓyt ǀ߅àÛÐcÊ“¹-AK¤T¬}šÜIÛ›íM�ýÇëßÜË${“ÜÔã9çINwMöâx7!T# $�…8ãbžÿÆ­@ÏÚp¾ýÙ*†5c¯ÕÜ{ä Wg[û³Uá²ËÊÊè†~Ì5iò*Ÿ w®´'y¯âx��Ýk1$ÚÉ9’®a:<[°r&GòNCßãú¯%N¹ÈBÁ$ó:É~`å컊•œExÇ Ä÷ —®I²4 ÍSÄg3Õž˜A ^²¥­¢d=U¥ÿøaó¹Zb‰jáâqßÿ óÆ2I(ÏÞÔ°yò÷ÉDˆ|Zâ‡Þž`¾ºœ«I@²{ÿNR™é1¤…E¤Ù C0އ¤4“Í=,K¹6„{<j•9äÀyè¼@,‘x…b]¯‰kC�´‚w>^ðÆmÆÜ…Úö“IqÝûw2è�&[Ý>»5\Ɇ††Þ# úDMé_BƸ·?[5pêXä |‹ãù#É+ �Ãõº€ˆc≹_LBI+g2r®šÿZâ” Ù‰4I_ܾ÷ß ïÈ�àOi ¡ß,‰~ž>òSI²4•e 2æ.¤&O#]^>ؽÍÿ5Bß¹­öR¸c_Ñ/_°öiæÅxÀÒÉ N¿$ûM! Sadƒ qyËt æ«£&O+úåïÇ=º–„^…r…¦êÉÉ/¾–ü“É[9$í¹Ð¦0n×”öÜž4³Û‚>_ð‰åu×»¸¶I+xçã…ܸ•äLÚ²‡Ü��€Þ¨Ù€ŽŽVSí ˜¸ù%º‡d°›7þÒ‡æsµB¹‚¤cÅqóˆ Úwä ˆxCÌç8(Jæ�»ðp™{Ö†�!L”’È‘æ„1Ì’ŽVΤ³3tÃÝhÑr©>Þ8^4 W éá‹û+D.àÁSÇž"–Gq+îž-”+\�mÁIÑÆwÞ"Yšùk6‘GH——B·ÿ'qðôñp¤1 =8$*o„†•“œ~¡0F›tÏžxùQ¢¯¨hW—ýÀÊ)/ÒT=9ååCÁ¹»£‚q<$uÑõš,�X$áÚ¾`Ñδچ‡‡¹6‰%nŸ°³—iú=‚Œ ï|¼·Ù¬¤z·ölí­ùM„€ñRr–WR“§Ñ=$ûŽð¿a2¾óÖ'ï€ñÿ#¶ÛG‚H©".(ùg„b>Çñä.<¸×„Ÿš ar`TD®ebåLŽÚ…¬ÅrùãxäÈ~DpÀ'É�–�=ŽÁÓÇ{k~CgÒY”N‘$¯€´î póLgOõŸ¨€ñÿÃáYKV\°Ð1ÓÙS$3\蛕ÕÅ‘R5ra×€×j6ׇÎÊ&rL*™àîíéܱñæ3?îùí+t ´ ŸV'RªÔ‹–Æ�¶ÇCR™ÏuF‘ƒx_Ü_ÔkÁ®ý|A(W~®ëãÚ $}à��yã–èÀàéãºíCôÞÇÕÙ&ÎÍËZz§éœzÑRÍ#�ý¼VsoÍoúOÔÌÌÎÐT=É|“�[Ú›ò Á=GGkß@þš§ü½ÒÅÕÙÖ½o§nûÆÁÓÇ…rEÏ¢ÿCÂR8¨ÉÓ&¿øZ„ rþÇñ€®›êÞ÷ 2�ü72¥z”–¡tºf<Ý5I#�Ñ sïÍg~|¨øÏ¤S× £¹^t§Ðs5¿�YÈÓgï»NøÙ¶‰ÏíRW,ð{™ô"òÏX6Ÿ«%exª…‹C~¸ºf.€þã5t�ÅÏ`0l�LEÉra[.Õ“›!;ñÒr¬”ä—rÜ£ks–W’a]/mÙm™ éXÃ8¿ìÈ0ˆˆ+»À%ÛÜ,ÌCGXA$W]j5pm’&ˆvìØíÏ »¿þÁb±¨T±dþ3~üx&/gådýë2¶75:ښ̟|$+,’ä¸{{ºv>=ìq«+–gýÛƒþ?"”ʨ©w[>ù‡»ç–Ïn•Ϙ5ñ©_•ÿ++f3„áê8×R”̶\®w÷Üò dHº½©Ñ;4¹�<.Îʉ,çîÕ;Ûš`bNÀ3}øžíêeia‘@"ñ{ÍçδvŒÿLÕ�v¶5©¾ùOŠ’H­P†].ÛÕË1¯¥ÿø[£!kÉ é„B†?’ÌëÄ_N’W œ=/ë_—å>´šþ�¡ÙB©,³|Iæý‹…r¥»¯G<.Ò3¡çpL.›?TwÊcì%ÁÞqß"žLéQaódƒíêe¯i€Ôj~´A( lÂNË $Ò¡¿ÿÕg³’hp 8:Zÿúg¡\1áÿnW”Ìμ¿ÂÚxÉÕyÓÕyrVTJò ¸ºTø,'•J…B¡@ ~*ø�20Ù�WuF‘œ�»”4ÃãñdödÉ£ž'!¸5h6Ü5/V�Y„"ñ É4-?‹’й¶I6þxÅFJÆñhrW>л½o'ñß4«üzjò4’ˆ˜³¼’ 8Nãmé8µ&¿øÚ”='>·‹nl8~ÃóŸÛîvÜ_.þtM2‚"kÉ Ò  _õÏ�ÿL’ЦQû �(Ö…Ú÷cr÷@œ˜‘n¬À¢œ$¯ wåcE¿üý¤Í»#ÈÑÉ™‰â««#餢,»/dÄÞ? gI^@SSº‹/ù'I‚MÝK…‡rHºòY«Á#À,ÍÐ M)Õ›qP�É 75[SðÎÇ‹¶ƒ¤G’ÜÂÁÓÇ]�mÒÂ"2 $sNÝÿÇÜ•�Å&')Q�G#É+P”Ì¡fÌ]¡pÑ_ο#e º¤ÕŒÜRg?°Rµp1Üzi }»ÿꜺHM5iHºæÝ qlk�ÑQ…ªÒಌ�±\VV¦^´T(W@‚+ñh9¶%É+ ó3™ÌÀŒ³$/xþíæ‘bhËÑ)c8IÔ ˜<–¿fi™Cf¸Å¹ºÈÓÏȸ÷¾™Ùæú3fuDŠª©&pýÞ%G.kéŠ$ñ€íÕeÌ](”+TAcñBÊ‘ ŒL‰–ÓçEJíø�…KAâá³ö^�DÁµ¼Æ^Pdu»Ý^/׆ wJŸÝìåÚ $åá��çÆm´ÍÒx[šÛ¥Ñ)£Mq¤g²‡/ò¾ÿ ž>ã\év(eÖëR’WК™1…%chª \¿wÉ‘#SÚ’&Ç"ªû+HÅé¨r$·ÙÕÙÃîÙ!"0.‰Ã�M$–ˆÄؾbŒã§ëm.®­@î ‹…bIÏ •kC�Ô†w>^zï��8Œâ¢õ‹F5C„/%sHw~ã±Ãq®ÎÙÙŒãxpß#ßÒ1?¡BÎß;”‹@öÒ‡"ì%ȑ¹h'(�DMqnÞ¨£;SýdòJI?Û Îa×V¤}“fõ açáÑÕ å!qÁ;/½÷‰ÇNFzED›âH5Ã5´ mQMµ'.|P£¡0Òë’y e‹Hö¦Æh{$ÆÐTxðÞ¡\"×pÈ‘)vÑ–äEHÔŒ,—hÒ[I?šo÷Kå8ot<j•9äÀyè|A*W¶urm’ÚðÎÇKï}â1Ç“ä� óPž££5d¢¦ÿ1I�ÍÂÖØ¬ÃÈà„Qƒ$4ó–ÝhÃ’D(ÚbÎß;”cKŽ ç°7E×Z“DŒ#d„†“K4é-‡¤-ÝÊ €a® I nOšÙmA�GH䲿ÛF®­@RÞùxé½O<¦âx@ZS0ï¼2xêýSáÈ}h5|ròxÌcÇbèuÙÐÐ@B‹CѤk’�~Ñ6Õ~¼w(ÇŠ\ mW,—ê}v«87�ÉÖÀ˜:™×:{}"ì¨É‹væ Õ6<Œ.1_J_èÐÇCb‡w>^zï�©8Œ¤\ZÎ3I×ôZÍÄ$=9ÃABy3³3ŒÇÇf*)Ž"}íRVVF*º:ÛüG±GÆÓ§‘"ê¹L|xïPŽ9‘REœ|æ— ‰ÓÓ¢’K4é-‡¤.·×âðHdèãE�eüÔ^+Êã ™ÌêòºÜØï‰Þùxé½O<Öâx"¥ŠÌŒ&"c¹ü±Ïn•Ϙ5ê̺܇V_°˜ëÏÄÊ‹¡ Y©�"ÁFFBº6©ÈŠ >¼w(Ç–éªjg6 Ýk5›ë#•¤Ž*—PÒ[I'¾ìô °ÛJttOº§ÓŠéš<Â+~Ù3ÀµHªÂ;/½÷‰ÇZˆ�×¢¦·æ7‘�мFKÔ$Hò ¾µlÄÊ#q<ÅÝQ¸^du$M”¹oIœIñ8M´òä½C9VäFJòµÖ$A<&;áäJzË!éDóíþa1ŵ)†+»À b›Ëõ!ÈbêÆ­~®­@RÞùxé½O<Öâx ^´tÜ£k`ðôñ®Ý›ÃyG¶ëWH³x†3Ó:§Í�hÜ-wo�ÏnÊ ï¡ dutdž¾e´Ý;ä’Ê%TN¦�Œ[k’n+Lv:ÂÉ%”ô–CÒ·×ku{ÅRLÔŒšž‰%L×ä b©Ìæöáxz$6xçã¥÷>ñŒã@ö+'>·K(W؛۟«ºý«‡êNÛn|îÿßàéã�yÿè� óÿ­"*w‹Ævãs�GÄ¿ÕEÊ‹¶{g°\r@¹„ÊQ“§ å �Ñ0ê5ãîí!á>†‰š!åJzË!iÃMý Ë‹½CbÁ4e–~Goó�Úõ&®­@RÞùxé½O<ãxEÉœ)/"^™µá¼þͽ·^Úâÿé¶’YEø‚v·†êN3�æ‘p )‘b½:I^�ºb90ð-I� qn^TBrÉå-GŠ?G å �¾² ‹”ªxäGzË!i×݃BLÔŒ‰a‘Äš;¡ß†¡<¾ K[º±$‰1×’ÞûÄc3ŽG)UkŸÎ«|Ârùcó¹Ìå3f3ÏŸ$rª…‹ÍõgôoîiáTÒÁÒk³f-Y.ç“t±'%RÌñ_]îC«ÍçjÍõg²–>¡»½S× #yzÑ·÷å┓Ϙmoºj»ñy¸Á�`»~ÅT{²"ö•e"—8Ò[IŒf»D•˵©Š~Ò=·Zêrr® A$”|ÀŠ> ÇK[9~.M¤T©-�´eOð¹+‹V.¯ò MՓʲdª�½©ÑÞÔèêl#í[B[þ¤ÿêDJékßwä�?[À0X.  \¢åÈž¹öÂÑ{ää,¯d2/²\âHo9$=èî7ƒ@Àµ!©Š=ŠÍíÁ0Þ py|=˜@‹D ÆñÒV.�—FË�‘„ìÈdsпùŠÇh°]¿ìÈÅ0ýÜ_Ž&kéŠÁÓÇìM�!Uä†>Ú€aH¹Dƒr‰–uºñ�·\�mâܼ¬¥+â—Ké-‡¤·ú­ Án+qÑ[0]oéš”©àÚÀ'’v‡ ²£žµ‹Œq0Ž—¶ri¼´�rŠ’9ä?d Ê‹aúyH9:”Gb/!!7ôQMá '—hP.Ñrô$ô�÷ß ~ÖÝÛCzå¯yŠy%^¹Ä‘ÞrHzÐÚ3")×V¤6ý…³zÌ8â RŠêèâÚ $õà��—ÞûÄÇK‚\fyéá܈%†éçáärW>&ÎÍsu¶™Îž ~=Ýp%Ú[öpr å’ —Qvôýáp¦¹½o§ÏnU–-À¬ÜÊ!i€Çë°ØÅ ׆¤6ž µƒR Ùq:/‰¥†‹Ï‡­b‘èà��—ÞûÄÇK‚œH©R–Ý¡Z_Æ0ý<‚\ΊÕмÆk5<OÕpr‰å’ —»ò1ÒW¶{ßN²@èùí+$K3Í&åDzË!i@÷€U¥ÊàÚŠtàö¤{º­èãñ¥Rq{ÀµHŠ!Ú±cG´?3<<ìv»ý±X,*U,ñŠ`Æ�ÏÊqP.�—6ªœL;uðôqOŸAý/ߎŒÁut´šj�‹sórWþ€9jò4û�+®Î›±TQò5¿q¨î´³­IõÍ x<¹Ä�rɑ˘»ÐÝÛã¼Ùdùä£a·[’«±\®8Q#”+&<µSʸ©,C¹D�rR©T( !ZnÿñBÒŒë�}=fN?�—:OÝôɵR¾{ÍíA‹á®¹É´jÌâv{äâቹìÜi#ü$¯ØÀ8^ÚÊ¥ñÒF•“äÈgÌòÙ­Cu_ i°“éç3bqºÂÉÝ å�¨ HÀ‹§áJ¹�rI“+Xû´jábŸÝÚüpûsU}GÀ¸ï?U/Mær¬“ÞrHÐi´ˆ¥XŒÇæ‚©½”Ç Ä©®/0cA"#Ž.ÁwxxØëõZ­_+ÆíîîNòþ.‚DÆr©¾{ÿNq®¦è—¿#�tlÛàêl¿áù3ÊbÀøÎ[ý'j„rå”—ÒÕw-�¦z�E!$m°]¿2TWk®?ª…‹ Ö>͵Ei…R©‰DÁ[¡!ÿx!iFMÝu ²qn+Hzf~~êÞ‚ìp/¸ÐÞÝøÀÉ4iì2<ìµôÿà_îáÚ$�„ûã3ÇK[¹4^¹Œ¹ …r…Çh µO^«9žØZ¹Ü•�‘˜a÷¾�ä¢Ä&r‰å’,§(™S°öé©ûÿ8îѵq:x<\]êÊ!©ŽqÈæpzÐÁc Wv�C ¶¹<\‚.�wÀâàÚ$•Àz¼´•Kã¥1”ó ö;Ûšb‰rö<ó'ÿ°6œW–- ÃôØ•S–-0}øž»ç–P®�ßUbm¼hm8¯˜57æ€!O&ʱ.'”Êäw•$MŽRBëñÆ,í“ÞìJ(® IÜ^oæ@w¶±dÈîâÚ $•Àz<$�¹ùÌ�<ÆÞñžïÞ¿¦ì9(‰©{!èÂ<¡Bé1&>·+†qg‚Ä Öã�Yþç\“C,‹±ç ›L¹tòBkŽBüÖã%�ÛEyíÿ~ÿ ® AÖ㡵x+—µä!è=òH ‹bvð˜ÈÑ…y£âqðøy2QåÒ[IuÌV±<–ÑOºç–ÃGÜ#I­Øæ‰Œã!錻·§ý¹*òý¸G×f?°2¡r^«Y·}ƒÇØ+-,šüâk ÕB$$Ç› Ù�:×$ÏÖpmHrχ¿»7?K"<Žq¼$#°-Ÿ7EIáFFz‚q<”ã£oåÈ <ò½üîX&ãE%'RªÆoÜ&”+d…±ã1—c ”C9”CR�³C,Æb¼„Ð[0]ourm·{ß„1ÇCÒÓÙS†ƒ¯ŠsóŠ~ùû¤)úlÖDÇ  ÆñÆ&W;z?í¤”ì´øFü[L3?=:ob^ÀãÇK2NËàü)9³&c°:=Á8ÊñQ‹Ïr÷Þʲû’#êEK3Ë+’&?(‡r(‡¤:F³] äÝ-MzàÉP;(Õ�#H#Kn×V )Æñ�ô§çÀfÜ{_ÌÓêI!0Ž769ZßdPièInHœdè®Íél˜1.ÓÿAŒã%·Ó‘)r¯üÖt® AÆñPŽ�Z<—Ë,¯ˆÓÁãóêPåPAD"¡D„õx‰Â¢�i²Ù†!º¨Â."‘Øæpsm’2`AI0Ž76©þëeµf×V¤3“Ï”ºú4 úŒã%›a¶¬^TµHBÀ8ÊñQ åPåP.Õå�ÔÅît‹ƒ:û#ìÒ=éž. –äqŠ,6‡ËãåÚ$5À8‚ ’>`o Òk¶Õ~Þ9L©¹6$͹û£šodËR1ù'Æñ’�}°÷áoMÏΠ¸6aŒã¡µPåPåR]I]¬v—˃ýN÷¤™z‹�k+Æ42™Ìáöpm’`AI0Ž7¹ÑÕwáf¿H‘9úK‘8xÝ3Ïüî[“ È?1Ž—|¼ÖÁûŠóï*ÈæÚ„}0އr|ÔB9”C9”Ku9$uq{‡=ü»ŸI?†Ekî„~†ò8Ãå8œÇC�q<A$}À8Þ¤þF× ƒƒRfpmHú#×·Ïj©+ÍSÆñ¸Ài³ÎÕªfOÖpmÂ>ÇC9>j¡Ê¡Ê¥º’º¸=>��µ#$öü)V·×åÅÖŽœa±»¸6I 0އ ‚¤Çƒ|tMwsÐ'‘a³Ád ¹~î–®I™ Œã%—ÝZ˜)Z<{ ׆ ìƒq<”ã£Ê¡Ê¡\ªË!©Ë�Í ÆKý“gu›m\[1F E¾a¼ÖF`AI0Ž7ùSý »@.–ʸ6d¬P\ÿ§Ù A“¾ãxIÆít¨„·ÌàÚ„}R1ŽçÐ�xôpíùÄ›ôi¼-�ÆKC9”C9”C¡P(ò./)�é.,½mspmŘD ðâ$H„ Žã™tjOži1i¯«š¯‡îä¡ZÙÕù”éBMMKiee)\8X£›_¹ªTíÐ�©Çsèê.˜Š—=\ª¦24êd¥óó)P—ÎSëõSs£S3¿T ”vž°ëÃF}"�ú:i¼-�ÆKC9”C9”C?†X�—\†4èfp€ÀfœOˆ0ƒ¯½½½³³óË/¿ìììt8àp8(Íâe¥ZÊåyÄaè³Pjy ä”Ã`2õ:ejp8Àé,œ6®Ïì§3_gΜ™4-§ÓYVVÆüõ~g2Ä×Q_•VzŸI\]j­.ò•í×’’’~*Ø|ïø¼:dŒã†aˆ.) ‰“í,®M‹ øðJG˜ÁŽ�×ÖÖf·Û›››ív{kk+ømï1Òßw¾ú¾U× koï€ö;¯o¿ÑyÛÐx„Ä}}÷Ýw“¦ÕÚÚÚÐÐ�–Zé}&qu¸:\ÏW‡ €q¼äâÊ.ÀDÍä# T œ‚0‚�z¼¶¶¶‚‚ò½B¡øýÉꓚJR�§;Y];ò½£¹¦úâ¼uËL55ºŠu«´úÚƒoÃ2,ÈCAbëñÆ ª¿ágEb® A�Äâõ¸$në£å%\‚°Oëñär¹b„ȯԔjœ�t05^4å—æSêâR™áB£ º‹¶ K“èà¥qyI/ åPåPAhÜ_´Ö’Š ¦%#ÌHÆ|<ÿ8€CW÷öÉF8@]ºxYE±L�'�Ö5; Ó–/[FZ² ‚ H´`o òǺë.±R$‘rm‚$�Û•+ñ,›;•kCöái/2ùËÖ�8x@iË+×­[·nÓºJâà€ºtYÕºMë6mªZ%¾}= &Ѥñ¶t/ åPåPAh”r)†6�±À°oØéòpm’$#އ ‚ Éãxc�·Ï7™}2‰ìÿoïÞƒ›:ì}ÑÿôZzZ²ä‡dƒ„�E°�© ĤÅä¡4Ä¡‰›œ�½Ó$·Iš»CÛ¤çN“}'É�I{ön;³›ÎÜ&3}äÞ°§»ôN 9'Τ5=Ä!»JÌippÛƒd°üZFòÒki-éþa Øø%{IËßÏ0 ,ËúþÖ’Àë§ßzà �¹d<–ψ÷×»¥.2/'çxó"ïω1ÇC⇸쌃ܥը)�’º €¥§ |ƒVê" 7`Žò�9Þ ô÷Ó}§‡“�^êB–V"q0·V;¥.2s<Äecâ‡8Äåzäõ�nß IDAT®4)R)Qê*–\:•bÔ*©«€Ü€9Èæx+б³ÁÏ!½É2ûCrY<Ê}uM~µ«PêB ó0ÇC\6f!qˆC\®ÇAî2é“N#uKN•ÔªŒõ o˜ã€|`Ž·� }ØyQ“g•º€¥•�ܵÑé,4K]dæxˆËÆ,Ä!qˆËõ8È]­FÄùx°(•J#FÖ07˜ã€|`Ž·ÅŸ>íIép>È7üö5zF-u!�y˜ã!.³‡8Ä!.×ã wéµêKcèÞAöÒ©”ˆæs<�ÌñV¦ÿïà ƒU©Âî/È–˜µIî·­—ºX˜ã!.³‡8Ä!.×㠧٭攘’º €%”J êÌ5 {˜ã€|`Ž·2}tÊv4Éè�R°T±Hy¾úŽš5RKs<Äecâ‡8Äåzä4‹Q—©«XJéTAž^ê" g`Žò�9ÞÊ Ü=@º<© X*üûõšÕ¸9ž\aއ¸lÌB⇸\�ƒœ–oÐE¢Q©«XBé”h5aŽs…9Èæx+Ö­ÇŒŽ ~ �=Òé47ÜÿÝ{6K],Ìñ—�YˆCâ—ëq�ëJ Ì)œ’2% |>†x0˜ã€|`Ž·b}Ôéïa“Z\Zä(�®+Ðn«\%u!°T0ÇC\6f!qˆC\®ÇA®+Ê3¨Ó¢ÔU, Q°µR¹s<�ÌñV¬‘±Ø{ÇÏ) V© ȼø¥áûëט RKs<Äecâ‡8Äåz亂<}8KÓü>¹ÈiÒ1j4x0/˜ã€|`Ž·’ý�#Ý1…^Íà�6��OèÓ±ØV)u!°„0ÇC\6f!qˆC\®Ç� ”[ÄdRê*2Làyn}ó„9Èæx+YßHøÐ­¹@êB2)óT:J ò¤.–æxˆËÆ,Ä!qˆËõ8��Rk^<ž�º € ‡ÇìV“ÔU@ŽÁäs¼®ùï_FH«Öà”<� 1É3BäáíURK s<Äecâ‡8Äåzȃ«À”JòRW�1b’w—àŽ 0o˜ã€|`Ž·ÂY®õÄy� §ä�L$ÂÃ;ëÊ8VSî0ÇC\6f!qˆC\®Ç�<8l¦D<™N§¤. ÒétJÑàÁ`Žò�9ü¬g ®`t¸a4ä¼d0ǃküídàì(¯5àÈ7ȉ(·Öª½½Æ)u!°Ü0ÇC\6f!qˆC\®Ç�\mZ[¬Á�ò Gˆ‰èæ »ÔU€`Žò�9\ï@»o$©ÖhuRp#ÉDÌÆ¤šn®�º�æxˆËÆ,Ä!qˆËõ8�±›ÝŽT‚“º €Yˆ‰ÈV·Cê*@&0ÇùÀ¦õ—ÏÎŽ&ÕJ #u!Ó’|¡&ù�-â­P˜ã!.³‡8Ä!.×ã@Þ6º …8Fy�½ÄØXm.§ ƒ9Èæx0“}uŠÚ<•Z#u!ד<#DÞ^%u! Ìñ—�YˆCâ—ëq {Û«V§Q©«˜F*i¨Z%u +˜ã€|`Ž7ðÇ�;yMžZƒQd!ÉëÄØ?6¬—º�æxˆËÆ,Ä!qˆËõ8X n¯Y£0ʃì¢â·Vcˆ†9Èæxpcïüý˱´VÃh¥.€ˆ(™ˆç«…û·º¥.$†9â²1 qˆCâr=VˆÛ78…hHê*&±±Û«WK]Èæx ˜ãÁ¬¼'üþ1Q£ÕK]¬t©DlµY}G�SêB@z˜ã!.³‡8Ä!.×ã`帵zU,ÌJ]….±hð`‰`Žò�9ÌÅñ³ƒ'ƒcJ­QêB`åÑÍ«,ÖH]dÌñ—�YˆCâ—ëq°¢Ô­-âÑ´(J]¬P)APðQ4x°t0ÇùÀæèÂÈØû_œ×š ¥.V¢ø¥áol.sXMRÙs<Äecâ‡8Äåz¬4« ò\…¦d"&u!°âñ¨«Ð„–æx ˜ãÁ¼üæ~fµ¯&šß¾ÀÂ¥iläâw7K]dÌñ—�YˆCâ—ëq°2íÜ\‘Ž�I]¬ éÄØ=›*¤®äs<�Ìñ`¾þÜ~f”×ht:© ùããÑ"]úÞ-èñàZ˜ã!.³‡8Ä!.×ã`ÅúfýºHhDê*`H+4©øt0AdY÷õïº ×±€LÁãTßHGà1F© ùHÅǾæ.ª°çK]dµÜšã…ü–›¿óҸ瞪·Åýÿù—–{¿óýïÿÑuƒÿùΉÐ5ß#ïω1ÇCâ‡¸ìŒ ¢ « ¬Z¥ÈãÄ<È 1-µhÑàÁòËÌïìÙ³‡cüσabiüľ×“]‘}ã×ï½ë& ùÿòúÅ�>Uo!¢ø—û^ÿôæç½)ë€9dÂþ�»DmžR¥–ºÈm¢˜4+ùûoÆÍ`vY:ÇûôÓOûúúŽ9Ò××çóùˆÈçóQ">Êo¾÷©Mwßëòÿáõ? Püä—tíøcú‚Q]|ðÊã‰zzzŽ;ÖÓÓ3þçeø½¥¥eÙ²æ»vS·Ìåí3ë#–%ï-‰µË­µ»þ�¿˜ßÿüç?/à»®¯¯]6¯@fýö›8vPê* ×)ÂÃhð@*ªù—™ï÷¤Óéd29uÉÈÈHQQ‘N§3�Z­V­Vk-k++ËK-ZµZWì,½ø÷“š�›t=Ÿ�®ùê&»N«Õª#='ú ¿V¿fâñZ­Z­.++»üçeø½¤¤dÙ²–yí°%±vX;¬Ý Y»©?�†Q*•Ó~zý/€i)•ÊUy§Ï÷«µ†Ù 0­xè�[ÜF#u�nðÃka–ðš+ñ�']õ-DDqó븞zÊ~x–c5�;¶iÓ¦¬ÉÂÈ8NÆ«†8Ä!q3Á±š�)§üÃÇ£ ]žÔ…@îIr£·¸í•«lR9#ãÇj.åu5>x}_hûS»6Zh }ß;gÖ=úh½ÖßüXî}ô.—.Ô¾oß™��>:Þ,z<È Ã]}gGâj½IêB —ð1nƒÃXïÆ�£a²ô|¼éÙ·?¸]×¾ïõ×_ý�3Å_°ÞB¤sÝ{ïMƒù�×_uß™â¯ß{]ƒ'ïë¶áºšˆCâ—�q×Û^µºÔ¬!‘—ºÈb"æ0(Ñà�ä–öþxË s<ȸýw £JÃH]d;…˜Ô¦b~WŒ‡yË©9Þ‚ÈûsbÌñ‡8Ä!.;ãfòÈ­Uút<•¥.²š(B,Œ²æx ˜ãÁÙs¨Ã`-R(²îÃqÈ锿4ü¿ï¨•ºÈU˜ã!.³‡8Ä!.×ãnìéµêD˜óûdV‚4¥ãá4x�U0ÇùÀ–ÔoþçgVûj"tz0)�õoçf©ë€Ü†9â²1 qˆCâr=`.žýÆE”•º Èéø¥!4x�…0ÇùÀ–Áë?·­Âq›+]:¾ø½{¶H]ÈæxˆËÆ,Ä!qˆËõ8€¹ûþÎͪÄhJÄ•6W®´(&ÇFÐàAÖÂäs0ÇI|~vàÔ…K*ƒEêB`©ˆÑð†U–ÍkíRò„9â²1 qˆCâr=`16¯µ{ªJ¸‘`:•’ºȰ4¥"#Aφ4x�C0ÇùÀ$Iðû?îbŒùjF+u-�I>¡KÇïÛ²Ö¨ÅTa aއ¸lÌB⇸\�X<£–ù§»jmjQŒqR×ÀÇ8³2ñð¶õhð ç`Žò�9dƒ£_^ür`LiÈ'šß^d E<4ôWÑÍnŸ Ës<Äecâ‡8Äåz@m½©ôÎ ¥¡Á BwÏË=B21 4Ö•¡ÁƒÜ…9Èæx�UZ;Î Œ%Õú<© �¹bczÕ½[ÖJ]¬,˜ã!.³‡8Ä!.×ã–BcmÙWVY¡aQHJ] Ì"%éèhM© Èæx ˜ãA Çø–vŸ Ðh èe©dŒS ñ¦­ë,\$€9â²1 qˆCâr=`é˜õÌc·UWÙ�»$ 8C/»ˆB2vi°Ênüßî¨Aƒ²�9Èæx�ÍBÑÄÁÏÏ&j•½¬ Æ9¥�øÆ–µV“^êZ`EÃqÙ˜…8Ä!q¹° ,í·¶WmZm ]äãQ©ËYÑ„D,4t±vuþc·o@ƒòƒ9Èæx�ÄTúýcgƒá„Ú�§RãþÚËJ„däRY±ùÖÊUµJêrˆ0ÇC\vf!qˆC\®Ç,'•R±sKÅκ5ªDXˆŽ¥Ó)©+ZÒé´ +â¡�›Êî¬q¡ÁÃäs<È9¾þQï‰sŒ!O£7I]‹œ%c\"ÊÝ^ã\_Z u-×ÂqÙ˜…8Ä!q¹ w‰õé»7U;L£}Bœ“ºâ‘Kƒ6–šwß]‡VÌñ@>0ǃœv¤û¹¡pR¡ÁL/#„xD•âËŠÌ_[_ªÌÜ„ ã0ÇC\6f!qˆC\®Çdƒm•«ÞV¹®H?ìKƸù~Ò”ŒŽEG+ tÿ¸í¦†ÊUhð`¥Áäs<�‡tš>õõ;ÔM �^©VK]QnH bZˆF¹±Ú2ÇÖu%J%Z;È ˜ã!.³‡8Ä!.×㲊BAõëJv7nÚZ^ DGù1VàR•ÕžOŽ� Q¶~�õ»�›¿º¾ ¬d˜ã€|`޲Ÿ †ÂŒ!O­Ó)¸èÿ„t*%$¢|,²ª oÃê‚5Å©+XÌñ—�YˆCâ—ëqÙÌYh¾gÓÚGoß°¡ÄâÇF1Öq~l4\_døÖöªol^‹à2Ìñ@>0ǃ•À?î ^êîÖ�J�^Í0RW´|žO%cÑWå,®°[\Ef©+ÈÌñ—�YˆCâ—ëq9ÄUdöltínÜôÕµLrl¸_ˆ†“|\꺖��HðÜ¥ÐÐE‡AüZEá÷îÙì©q¢Á˜ æx ˜ãÁ ”HŠçC]}ì…‘Ksž@j5£Sªrþœ½” &“ …�ˆF£¥¶5…æ G¾F�óëp=Ìñ—�YˆCâ—ëq¹K«Q­_e{à÷³ß¸ùÖõŽ5url$MFCÉx4�JI]à<¤E‘�GùÈ¥xhPˆ°nsç†UÏ|cKc]yåê4xs„9ÈæxãÂQ¾od¬wðÒH8΋‚V§H¥VkT CÙtgõ4¥Åd2%$Äyž7阂<ýš¢¼U–<½Fêê– æxˆËÆ,Ä!qˆËõ8™1˜jgÁ½[*÷lx¸¡êkî¢ +Ã\Š�‡†“Ü(‹$ñ” .o] QH ‰D<æÇFEn”êÄX�][eÉc·W?z[uã¦òÊÕ…hðs<�ÌñfÅrñáp$’Î †CѸJ¡âEQ¥R‘Z“J‘J¥R¨TJ…J©R’BE ™ú¥Ó©T:�…T:%PZ¡H )1ÉhTá±hžAë°šò ŒÍ¤/0ë-mæ× ×d|ާÎÔeʱcÇ6mÚ„¸ÜÊB⇸\�X9l&�ͤ#¢Måöñ%—¸x8ÆGâ|8š¸KFâ|,žLb4žP«”ƒ6Á§”J…Z­EA©Pju’Ò b4êD‚OSZ£f‰¥É c‘(£ÑçyQ´˜™³^«R™ Z³A›§_A·y�æx ˜ãdV")òB*)Š‚(Š©´ ¦R©4)©TФR*Dj•B­R©• F£bÔj�*ëNÈr8qÙ˜…8Ä!q¹ÓÒjTyz�ͤ+¶K¬&g¡yM±eM‘¹Üž_^œï*4; Í%Ö¼"³ÁjÒµ <€l€9Èæx�s0ÇC\6f!qˆC\®ÇÈæx ˜ã@ÎÁqÙ˜…8Ä!q¹ ˜ã€|`Ž9s<Äecâ‡8Äåz€l`Žò�9äÌñ—�YˆCâ—ëq²�9Èæx�s0ÇC\6f!qˆC\®ÇÈæx ˜ã@ÎÁqÙ˜…8Ä!q¹ ˜ã€|`Ž9s<Äecâ‡8Äåz€l`Žò�9䜌ÏñÔ™z¢L9vìØ¦M›—[YˆCÜ Ä„±£Ã>Ï}AD—ø�Ó'Î:Ö›–.ÎÂç3öËõw¹ª‹nðø¸ˆ�ÍTzð4wýÚiUF‡~í¼žç ˜}í8_[ûhUÓ#n±�-­m>Ç>ï87ÖñçÀ«!~�ˆ\Æš[ŠЩŒÆ~®³š¸áàZGÃ#un†ˆ=ÚÜZ\ÕôíjñþÃ-Lã¼¶åh"â.ÿõTG÷†ÚÊɯ�8Ô)|ã±M% EûŽ}xLßÐTiîj×®õ|o«�a;[[¦¦ÆElÍ«6&{¸¹'Yÿ=O‘r¬÷Lóxœ…(9xîØ'§û5:gÙí›­Ó?OY^íô_˜gœæä‘Íkžx`•�’ß9:´ñÁ;\3 ¾‚Ñž¸ÈÍ”eׯí>á»>ÎÅç÷¶´o«c[›»›ªmÄùZ[ºœ·_yéÎ�uÌe�¦šõµ³Ùõ«ƒ‡ÛºXÞ„aÀ¤¬ëñ®Þùc�w±ö†Fc[ÛÄ8†ó÷pŽz—‰ˆWµ³ÝÛÉÒbš¼«â8_GÀTë©ïðLYv¼‡ª=Ô:ïý“ÄÙ*†ˆÈä°2],ýs,(kÚ8ÆåyÄ5þGžçyƾ˜)ÞìqDijG½{Cß6ºˆ¨iâ¦y™øàÇóí-Í,G¶Šú†­s=- Žvmµ» ™Üž&-f¨6ûÚ]ùR[;WÑèYÔvö8†aˆxžˆx≘YÒFÁ–À«ãGZ4Ew¯úneþ¶Ë_µnºªÃ¿.Žgx[íx›Å¸Ü¶¶v?W=�&ϪuXµW"ʶOi–öÆ;M®‘SÓs<`×ÖÒ¹N¦b|†msWÙ:º‚ävÏ9íZWmLÆ]ß`r1D”WíÜ:ç`Ø£ŸŽÕÜùxY[oª-Ë[pÔœâlåVÓF×ø›¿ô¦‘3ÎÙ8ëA�3Ä‘Éf7ñžgÜ��Œo;žçùñ÷ͤ9v­SÍúÚ9â|ÞvªªwµwÍ÷Ùä+˯«iÛêÙ^í0]ÙOàYž1Nî706†�ð‹hƒ®‰3U{8À;&Nù³¹kííAŽ®o˜ÿäÿåìD´£ôé¯ÿ—™âæðÎd[›ÜÛ‰ˆxkÏ€s‘ækŽ‘>ÜÚ>êô4mïI“‰xŽïíx>Â3‹�tÝ0.ÃæÇû�¶¶ Xš=îš-ŽgýAr¸l ãp;™ÖG™:¹ñº8>Ø`ƒ�–ýD<Ï“¿¥™m\Ü Ú2‘u=Þ,;&W…©£ËÇ9Ü&>Ø »gq?гlŽÇu¶¶öX=Mž ìÎaÕ¸ö¿½{Ôu°Ð¦H…SÁóiÓªÎÆšg¤Ï}×-L¦.§Ïøþ»Žˆ.ŸâK]<’¶}]õ7ÿ; ›>.5 ö *†|J%…žvÊߦ2é‰?/#ŠÒ`Ë‘¥‹‹¥.úÒç‹U&=¥Ä‹!Eñ’ÆQrÑ/Ù\â¾TêUÆÕI{ŸÿÜɱÇjò¼¿‹e¬UWï·£=¼:;«Uî^µ»®àî¤Í>òõy[UM�nÏï`mUžŒ�mÈû½­TßÔ4¥Û±U8¸öΠ{«ƒá|]¬­bQÿJOØÒIDAT§Ì—Y³ÆñÁÃ-m‘ªÆ¦Åø=ç8>ØÑÖÚšêlÄ}ÞV»„“q5>òÄăÞýíö¦L_: We]�7Ûgü¦jO=ëmÙßNÄ8j= ‹?){æx|°½#ÈóÁÖýW`\� ¿ÃÀì«Æ¸n½ÝÝÝZJiÔέ¶U… ??sú;Y%£1&^j¼zä£àb íÂLĉ†á1­Ái4¨ˆÈ˜*ª¹äÿ”©,ú�wX,‹¸düâȱ5ä’¤20ë¶ÙŠf¼ÍX&âˆ(☴«0ñ{µ7ˆ3kƸäP�¦‡Ï?ó›7ZUjS‰­ª¬þ¦óCÃñÉ;° ÄÎþ-øfBŒëÊïw=?ëu;f}gšª=õÞÖýÄ0¶ �gq·,™Ço÷sy›÷Žÿ�qxv5º\ ž ·­y?Odr6xwÃ’Ùã2:Λ-®�kïáxjoÙÛ>¾ÐVÿDSõ’Å5V{¸6ïþý4þô’¿vK1È}¹p<�Îh"xžûâ}:œ:u*„B!"ZðïÇŽ[ä3Ìë÷�?þxÙ²–yí°%±vX;¬Ý Y;˜*3s<€l€9äœ,�ã@6@� óîñ ELj4Ó)üð€¬•ñRê…¡×ëS©Ôø_ç{F@Æ) ¥RyƒŸ‘øáÙfÖ^ |Ú…ý�K¥R—¿?&@rã‚*•7:>?¼ «Ìå‡×Bž?äd×\�ôxò�@>ÐãÈz<ù@� èñäC½°oÛúßþšÙ:dãè¿Þ9Ó—°Ñ2[{a°Ý–Á 62À’Z`�GDyyy¬CÆÆÆnül´ ÂÖ^l·e0ëFX:8V@>ÐãÈz<ù@� èñä=€| Ç�ôxò�@>ÔËc¯­Ú·Ãüää“Ç’Ó=@ã\ûöÃú=¿=u :§åDd,*xâ¶�SoS I_`d¿·ïC6½ØZmŽÿxÊÑñfÇký‹~ªÅPå½°»²Qúñë_¶%¦}„¢âÖ�oT²»××#N]ÎÜ÷xíӃݽ76eS+œ[7üþ6ý”‡¥Ø‹ìÞCþC¢q}ÕÛ;’?ÞãkŸ>hšâªjW?¾ÙVW f(Å^d÷{ýïô‹Dd\_õç�É—^ŸûS]õ´ �Á¶ðòoyU”‹­ouü"0mú¼¶6Y7lx{§áš§ðtâ;Gã™®\JV§ýémö§ÖDÄ…ÂÞ#þßœŠ%‰4E«ÿ„­mï‰ßeö¥TTx6¾±�{iÏÙ‰7˜¹èÿÝ]æŽ þà�ó]"‘¦ÄùûÇ :Þ:éݼñçÆóßÜÇF¦>�6ÿÿþ~8þÏ>qš§¿!«³ÈCì;�y#À2[ž�©¯5𑔣²Ð}$Е‰}$£Óù뇎‘Ñ–�ú;¢ÑlñlqüèQ=ýî˯ës‘¦´°Þ˜â(ïA·ºí”�™'¸ý‡|£3z¶9ž{ˆoôv²Ã-§RÁ¹†¨ëï©þy�ªódÿ«Ç#Z]ÖUÏ>f°½Ùùï‹ëŠ5¶¢—w·ïl[̳,ŒÁrŸSÉ Ê†ÚTÆ'îq¸»ß NU.½ß=öoOU<½Eß6è0§¨êjóm#ƒ{ÅO×Zí§†2ó´É;9acÛ"Ú·°xŠýC¿õÎõ)4Nç 5šã‡N½ÔßÎm¾(=µ~—ÇÖ²o„[\}Ìâ¾}Á¬Î¢:5×ü™ê‘ZG�6<Ãàt¾’�>öCYµuSòŸÙaeÎô<ù'v”ˆˆÚ|!ß®�?ºuõÖnßÑ%‹� ^ò Öª"±‘ʽÎÀŽÚì %ê?²‘ÊU¦#vЗHœ ü6£ÑR½9æk9zÙ c)hˆ÷ÿ´åܺéžÖ5iC¯¾yâɽ§÷êšv¸&kPº* Žï|­ãMÏ>°¦~b¹fû¦ã¯ÝÏ¿íï4>·Ãj]šm3£³¸N—lïŽz‡}dhڠ׌Á`{á~g]¸ÿÇovþ씲a�fòñe?ßaåOõ<ÿæ™ý K£e¦'V2Z•Q«2jÕöÛ³«)ε ^i_5E«ù�ÝÖ{îù½'Ÿ?4fÛ²î'›uš«žAã,RS(tÍÙL£öÃÀ侸ÚÜTßónçK‡F™u®60DŠªÛnz±2Õràä“¿ëüñgÉê[Ö>Q¢/©ºFß~èÌOù_ÜÛ¤Dó›Ÿÿ`Y<"ƒ¥É©ôw‡‚ìˆ7¤¬ÛbµO,ÏÔÖVµ*£jr±ZßTßónÏ+Ÿ„ek~~§9øÉ™Ý¿;ñüA–Ö9_Ø ÿ^Sy¡õÔé‡^íøi€iÜYý´qð¥_}úäÁˆkKÙ®"ióžÝUáÙWÞ:¹û­¾@±ëç÷Ù–ñ]ªp8õL<Úqõ™“Éð¥÷}‘Ñ©ï Cþ‹¯õÐÈ+o�üAËWæúå}ã›—14ÒàK¿úô¡·ør× 5 ÙkÝ?¿M×óñéÝ{;_éV6=pÓÓï“Ë]�¤­Äà "‹©Þ˜hëOø|q¦ØêV µ–dǹøÔ3Q+¶¹T§j?Ôýƒ·=%Ånõäò-ë~2±Üße³{Œãÿªî«|Ιh~·s÷Þ3Í Ë‹—Õ«ãÜ×Ý!ÿ_O|ó]4x�í–|ާ±6P硱QJó'C\¥ubNb³í*Myßî}çœHù™Î´o‡’ˆf\~…ÂdV“å&EÕ]µ¿®›ìDBýOþ®�#"Šîõ|&RéîèíÿM÷…‡ÒDñ棡GÖÛµD{òÜÞ€HDmGúŽ×”?èTµ³DD�Þž?-q\‡ý�J£CÅŽ.ßi8ªºZ‹)ÂzÓ$޵Ò³“ç1ZËí[ÕáWÛ¢Dý=TR÷“b"RUoη ö=ïeD{ÝÎJÏ´O¬¶üd÷æ+¢-ε%È8ñwEõ–B×Hß“ŒˆhÈÿZ±å×[ ]S®2¢RØÔij7îÁb{œŸ%¢¾ýµO—ꌟ‹Ä²û6ûø$Qàhç– çÄ.5q>ÿÞSc"�-�ˆHH-ó¡¶öuÅÕ”Øß›HŠäõ%Ù218]ìÖ&Ó‹S·öàÙ‡þ0~,kêøÿŸHDVg¤å£áæÏãDÄö7o)~ºT£ùŒQß�EݾJ<¶‘"¢èÞ�†zD�` [ò´Sg<©jÚjæŽw¾ÒIõ õÚÜŸØbÚs`êõlÒþsWcqi¸"›#1ÖJ³ªk´ÕÛ>£Å!Dÿ0åc RšjôÁÏN¾z*–$òýISûÔª‰å[ ÁO&–wPW=å""2[_G‡ßîýã9‘ˆzúëw—Ëéoï%"âÅT§ã@Ö[êO᪴¹(új/OD‘þáãñ‚í[¬öÓCœÙd#¾yrÇ^ä‚‚™ˆŒ3,ŸŠ §H­6©‰D"Jû>?ó’OE¤tÞRñìåÇ ‰�ñC×Äø‡GëkVýð�Ó¬sëM›|P*˜üÈ?ë‰(J KDÉv¼€4I‘Z½¬§âòîs*9ßp§HDñö“1ºsüÙÓŸ$·Å­b;¦ìÜÛkoúyeìµw>"¢Ôu3TÕß³áç5ÊÎ3¡®ÞÁŸÐƒLm#S×>|9™­MÅDTòÆs%——Ù* ÝGú®}äü·¶oú­}eûØ×»ßh²p�Ñö‹l[GÌvëúG.?JHOÙŒÓm¢øÈO›ûW&iivùÎMq~‹©Ö¬hºúXß�ïÁ3-‹xjÿGÝ?ë�2Lð£×<"툨êKLTªô�‘mL½àΫ²hØ^Ž¥™ é©M)3Íÿ ¢DË»gZBWñ‘D’4×? ;-íùxšâ ù>9ýƒ7;Ç=p”#CÓ=c‰©/ž˜æ˜lF›šˆ(2Ãò©"�oHÝxWiíÔË]¨´¶iVGSjo,H47wþ_ïþØÁúHcºr‰<¥£Ü0y–•©Ê˜òõ'¥¾&§º¶ÎÄÄG_y«sr£�Ù?H&wq�6 Äx£±bb­U.'Ã%¬`*1:&3µfå‚�b€›�ØXÏP¬g(N嫞ٚçPM}Lº³c”ÕÙ¯™ržž6ï‘m—*œ©{Ôæ}«RëÿkçýSïo� «lêéßx»Òýœ9ÝEnJ´´tOníîŸO�¥ ±”–xkS‹• ôþà­³¯}<ð~¯èБbÖo#J³ƒ ^gp$â=C±ž¡XPWøO·Ù«çsõ—EŠ�ƵMÛ¦žªªnØVTm#6r¹ëKûte’±Øâ dWx†®^HôDÈV¢ Åz†b=¬Xq‹ëq7smw%ÆÛ¢c]a½6ÑÖ?Þ Š>_œ).ð˜Å«OÆN¥«lòíj18ÇMNÄ»"JWÉä“ UF"¢d($M…Vß°=í®;��J’âÍ °0KÚã)Ü Bxÿgá®þÈø¯Žî -!rUºB#{{iûÎòËôeŽî4Oì(³3,ŸJŒìy/è+püò©ª—=Žûj‹ô¬ýÕî�Ï–Rgwˆ½æà±x’#M•Ûd7¨+Ü«_ö˜hÊç÷¶šòkó*JlÏÜ·Ú~§Wê³m –]NeðT¿7™Üh—š? ñj˃eêÑsýÞ„ùÙ¦Õ %úÚÚ5?¬_ ñøÑá`Áª—ï²UåÝí©hšñ* 7&v~64¿|Ÿ½¾H_µ¡ìåÛ¬ŽD'&.4Ð|zlrk�}x´ßGOm¿´[›ˆR\"ÅØòk‹ÔV[Þ};+šŒÄ¨fÿ6"=×ï�蟾¿ìn§¾ÂYôÂ}Ž­Æ¸9ïÓ�¸ô[oˆÖU¼ñðš7ä7¬/zfWõ�Ö)�{ýmSnP9ÚÛX0?÷€óŽ}•Ûñò=V&0à�iÞ(Æ[>ã˜uå/ßš_e3Þq[Ås•ú$Ë_÷±KÚç‹1N«#2Ö19mccA‹¥Z�z !""1Úü gª«xnüŸù=«Ý“Ë[NÆ[Ö>»aüŸ¿kbyxd/Uï¨xf½±¢Èü­¦òÆò‡D"�Èá¶5”¨1Ñ€,·”ÇjªL�ë4|ï¹ö©7%c-G£�ì(h*î{íÀ—Ž{ÊŸx¨Æ$ÄwŒkõDD$|8ýò«D�ünì‰m%ž «<:% Iÿà«.tõ�¬’Cñ‰áå-•ûn!n$ÔrÈÏì,­²©(DDÄžáìÛ*ß0¦Ø‹ì+Íþ©[<{yq5ÅötD§î׎žë÷Æ-�[¬öÓC¯¾}ŽÙ¹ú'�•ð¡PËñXS9Q²¿ïùåËwVüºŽØ‹ƒ-µ3\dÉþ¾çߥ<«þ„’„dçñž_|¹n[h;xò¥PÙ?Õ¬z±FI” ^d_}Óà7@OŒíyoо£ì×Ï”Q$êý¤wmEc‰VÓ}õÃ"cͽâs·Tü�Nî^–›j,ù�Ôyp40uixt¯ëGîâºC¾%ÝÚDBÛ¡sÞû]?zb ÉÎî ¯_õ¢Ó`SÍáüÄDøÕ·ÎÒ=Îç.d( Ü2°Ìwç8uæÂêg¶>½³˜!âCá–ƒg~s*ž¤)Ç5F/ýì­sÏí\õ£Ç$$}>ÿó‡†èòe~®‘|~æÇƵÏÔ®ûõ-Dñ¨÷ÐéWÎM³V‘AÖOfÇà¨ò‹ÉP¨+R⊌ú®mtÇŸ³â‡žÊFµàë@&,ùýñ²�Ðv°·å>׋�3DÜàÈošÏ·-ç �Kf÷xbäµ×Û¥.¤‘ ³¯íc_“º €ŒÃ±šò�@>ÐãÈz<ù@� èñä=€|,üþxccc¬c…ÀF[NØÚ ƒí�ÓétZê 3p¬&€| Ç�ôxò�@>ÐãÈz<ù@� èñä=€|üÿ^ŠF.)<ŒIEND®B`‚django-commons-django-prometheus-febae2c/examples/prometheus/000077500000000000000000000000001520536705300247265ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/examples/prometheus/README.md000066400000000000000000000012541520536705300262070ustar00rootroot00000000000000# Running a demo Prometheus To run a demo Prometheus, you'll need to follow these steps: * Have a Django application running and exporting its stats. The provided `prometheus.yml` assumes the stats are exported at `http://127.0.0.1:8000/metrics`. * Install Prometheus by cloning it somewhere, see the [installation instructions](http://prometheus.io/docs/introduction/install/). Let's assume you cloned it to `~/prometheus`. * Run prometheus like this: ```shell ~/prometheus/prometheus \ --config.file=prometheus.yml \ --web.console.templates consoles/ \ --web.console.libraries ~/prometheus/console_libraries/ ``` * Navigate to `http://localhost:9090`. django-commons-django-prometheus-febae2c/examples/prometheus/consoles/000077500000000000000000000000001520536705300265535ustar00rootroot00000000000000django-commons-django-prometheus-febae2c/examples/prometheus/consoles/django.html000066400000000000000000000125051520536705300307060ustar00rootroot00000000000000{{template "head" .}} {{template "prom_right_table_head"}} Django {{ template "prom_query_drilldown" (args "sum(up{job='django'})") }} / {{ template "prom_query_drilldown" (args "count(up{job='django'})") }} avg CPU {{ template "prom_query_drilldown" (args "avg by(job)(rate(process_cpu_seconds_total{job='django'}[5m]))" "s/s" "humanizeNoSmallPrefix") }} avg Memory {{ template "prom_query_drilldown" (args "avg by(job)(process_resident_memory_bytes{job='django'})" "B" "humanize1024") }} {{template "prom_right_table_tail"}} {{template "prom_content_head" .}}

Django

Requests

Total

By view

Latency (median)

Latency (99.9th percentile)

Models

Insertions/s

Updates/s

Deletions/s

Database

Connections/s

Connections errors/s

Queries/s

Errors/s

{{template "prom_content_tail" .}} {{template "tail"}} django-commons-django-prometheus-febae2c/examples/prometheus/django.rules000066400000000000000000000140261520536705300272470ustar00rootroot00000000000000groups: - name: django.rules rules: - record: job:django_http_requests_before_middlewares_total:sum_rate30s expr: sum(rate(django_http_requests_before_middlewares_total[30s])) BY (job) - record: job:django_http_requests_unknown_latency_total:sum_rate30s expr: sum(rate(django_http_requests_unknown_latency_total[30s])) BY (job) - record: job:django_http_ajax_requests_total:sum_rate30s expr: sum(rate(django_http_ajax_requests_total[30s])) BY (job) - record: job:django_http_responses_before_middlewares_total:sum_rate30s expr: sum(rate(django_http_responses_before_middlewares_total[30s])) BY (job) - record: job:django_http_requests_unknown_latency_including_middlewares_total:sum_rate30s expr: sum(rate(django_http_requests_unknown_latency_including_middlewares_total[30s])) BY (job) - record: job:django_http_requests_body_total_bytes:sum_rate30s expr: sum(rate(django_http_requests_body_total_bytes[30s])) BY (job) - record: job:django_http_responses_streaming_total:sum_rate30s expr: sum(rate(django_http_responses_streaming_total[30s])) BY (job) - record: job:django_http_responses_body_total_bytes:sum_rate30s expr: sum(rate(django_http_responses_body_total_bytes[30s])) BY (job) - record: job:django_http_requests_total:sum_rate30s expr: sum(rate(django_http_requests_total_by_method[30s])) BY (job) - record: job:django_http_requests_total_by_method:sum_rate30s expr: sum(rate(django_http_requests_total_by_method[30s])) BY (job, method) - record: job:django_http_requests_total_by_transport:sum_rate30s expr: sum(rate(django_http_requests_total_by_transport[30s])) BY (job, transport) - record: job:django_http_requests_total_by_view:sum_rate30s expr: sum(rate(django_http_requests_total_by_view_transport_method[30s])) BY (job, view) - record: job:django_http_requests_total_by_view_transport_method:sum_rate30s expr: sum(rate(django_http_requests_total_by_view_transport_method[30s])) BY (job, view, transport, method) - record: job:django_http_responses_total_by_templatename:sum_rate30s expr: sum(rate(django_http_responses_total_by_templatename[30s])) BY (job, templatename) - record: job:django_http_responses_total_by_status:sum_rate30s expr: sum(rate(django_http_responses_total_by_status[30s])) BY (job, status) - record: job:django_http_responses_total_by_status_name_method:sum_rate30s expr: sum(rate(django_http_responses_total_by_status_name_method[30s])) BY (job, status, name, method) - record: job:django_http_responses_total_by_charset:sum_rate30s expr: sum(rate(django_http_responses_total_by_charset[30s])) BY (job, charset) - record: job:django_http_exceptions_total_by_type:sum_rate30s expr: sum(rate(django_http_exceptions_total_by_type[30s])) BY (job, type) - record: job:django_http_exceptions_total_by_view:sum_rate30s expr: sum(rate(django_http_exceptions_total_by_view[30s])) BY (job, view) - record: job:django_http_requests_latency_including_middlewares_seconds:quantile_rate30s expr: histogram_quantile(0.5, sum(rate(django_http_requests_latency_including_middlewares_seconds_bucket[30s])) BY (job, le)) labels: quantile: "50" - record: job:django_http_requests_latency_including_middlewares_seconds:quantile_rate30s expr: histogram_quantile(0.95, sum(rate(django_http_requests_latency_including_middlewares_seconds_bucket[30s])) BY (job, le)) labels: quantile: "95" - record: job:django_http_requests_latency_including_middlewares_seconds:quantile_rate30s expr: histogram_quantile(0.99, sum(rate(django_http_requests_latency_including_middlewares_seconds_bucket[30s])) BY (job, le)) labels: quantile: "99" - record: job:django_http_requests_latency_including_middlewares_seconds:quantile_rate30s expr: histogram_quantile(0.999, sum(rate(django_http_requests_latency_including_middlewares_seconds_bucket[30s])) BY (job, le)) labels: quantile: "99.9" - record: job:django_http_requests_latency_seconds:quantile_rate30s expr: histogram_quantile(0.5, sum(rate(django_http_requests_latency_seconds_bucket[30s])) BY (job, le)) labels: quantile: "50" - record: job:django_http_requests_latency_seconds:quantile_rate30s expr: histogram_quantile(0.95, sum(rate(django_http_requests_latency_seconds_bucket[30s])) BY (job, le)) labels: quantile: "95" - record: job:django_http_requests_latency_seconds:quantile_rate30s expr: histogram_quantile(0.99, sum(rate(django_http_requests_latency_seconds_bucket[30s])) BY (job, le)) labels: quantile: "99" - record: job:django_http_requests_latency_seconds:quantile_rate30s expr: histogram_quantile(0.999, sum(rate(django_http_requests_latency_seconds_bucket[30s])) BY (job, le)) labels: quantile: "99.9" - record: job:django_model_inserts_total:sum_rate1m expr: sum(rate(django_model_inserts_total[1m])) BY (job, model) - record: job:django_model_updates_total:sum_rate1m expr: sum(rate(django_model_updates_total[1m])) BY (job, model) - record: job:django_model_deletes_total:sum_rate1m expr: sum(rate(django_model_deletes_total[1m])) BY (job, model) - record: job:django_db_new_connections_total:sum_rate30s expr: sum(rate(django_db_new_connections_total[30s])) BY (alias, vendor) - record: job:django_db_new_connection_errors_total:sum_rate30s expr: sum(rate(django_db_new_connection_errors_total[30s])) BY (alias, vendor) - record: job:django_db_execute_total:sum_rate30s expr: sum(rate(django_db_execute_total[30s])) BY (alias, vendor) - record: job:django_db_execute_many_total:sum_rate30s expr: sum(rate(django_db_execute_many_total[30s])) BY (alias, vendor) - record: job:django_db_errors_total:sum_rate30s expr: sum(rate(django_db_errors_total[30s])) BY (alias, vendor, type) - record: job:django_migrations_applied_total:max expr: max(django_migrations_applied_total) BY (job, connection) - record: job:django_migrations_unapplied_total:max expr: max(django_migrations_unapplied_total) BY (job, connection) django-commons-django-prometheus-febae2c/examples/prometheus/prometheus.yml000066400000000000000000000003471520536705300276500ustar00rootroot00000000000000global: scrape_interval: 10s evaluation_interval: 10s external_labels: monitor: django-monitor rule_files: - "django.rules" scrape_configs: - job_name: "django" static_configs: - targets: ["localhost:8000"] django-commons-django-prometheus-febae2c/pyproject.toml000066400000000000000000000003111520536705300236240ustar00rootroot00000000000000[build-system] requires = ["setuptools >= 67.7.2, < 72.0.0", "wheel >= 0.40.0"] build-backend = "setuptools.build_meta" [tool.pytest.ini_options] addopts = " --ignore django_prometheus/tests/end2end" django-commons-django-prometheus-febae2c/requirements.txt000066400000000000000000000002611520536705300242000ustar00rootroot00000000000000django-redis>=4.12.1 prometheus-client>=0.12.0 pip-prometheus>=1.2.1 mysqlclient psycopg pytest==7.4.3 pytest-django pylibmc pymemcache python-memcached setuptools<72.0.0 wheel django-commons-django-prometheus-febae2c/ruff.toml000066400000000000000000000020441520536705300225540ustar00rootroot00000000000000line-length = 120 target-version = "py39" [lint] select = [ # https://docs.astral.sh/ruff/rules/#flake8-bugbear-b # https://github.com/PyCQA/flake8-bugbear "B", # https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4 # https://github.com/adamchainz/flake8-comprehensions "C4", # https://docs.astral.sh/ruff/rules/#error-e # https://github.com/PyCQA/pycodestyle "E", # https://docs.astral.sh/ruff/rules/#pyflakes-f # https://github.com/PyCQA/pyflakes "F", # https://docs.astral.sh/ruff/rules/#isort-i # https://pycqa.github.io/isort/ "I", # https://docs.astral.sh/ruff/rules/#flake8-debugger-t10 # https://github.com/jbkahn/flake8-debugger "T10", # https://docs.astral.sh/ruff/rules/#pyupgrade-up # https://github.com/asottile/pyupgrade "UP", # https://docs.astral.sh/ruff/rules/#flake8-2020-ytt # https://github.com/asottile-archive/flake8-2020 "YTT", # https://docs.astral.sh/ruff/rules/#warning-w # https://github.com/PyCQA/pycodestyle "W", ] django-commons-django-prometheus-febae2c/setup.cfg000066400000000000000000000000261520536705300225340ustar00rootroot00000000000000[aliases] test=pytest django-commons-django-prometheus-febae2c/setup.py000066400000000000000000000046671520536705300224440ustar00rootroot00000000000000import re from setuptools import find_packages, setup with open("README.md") as fl: LONG_DESCRIPTION = fl.read() def get_version(): version_file = open("django_prometheus/__init__.py").read() version_match = re.search( r'^__version__ = [\'"]([^\'"]*)[\'"]', version_file, re.MULTILINE, ) if version_match: return version_match.group(1) raise RuntimeError("Unable to find version string.") setup( name="django-prometheus", version=get_version(), author="Uriel Corfa", author_email="uriel@corfa.fr", description=("Django middlewares to monitor your application with Prometheus.io."), license="Apache", keywords="django monitoring prometheus", url="http://github.com/korfuri/django-prometheus", project_urls={ "Changelog": "https://github.com/korfuri/django-prometheus/blob/master/CHANGELOG.md", "Documentation": "https://github.com/korfuri/django-prometheus/blob/master/README.md", "Source": "https://github.com/korfuri/django-prometheus", "Tracker": "https://github.com/korfuri/django-prometheus/issues", }, packages=find_packages( exclude=[ "tests", ], ), test_suite="django_prometheus.tests", long_description=LONG_DESCRIPTION, long_description_content_type="text/markdown", tests_require=["pytest", "pytest-django"], setup_requires=["pytest-runner"], options={"bdist_wheel": {"universal": "1"}}, install_requires=[ "Django>=4.2,<6.1,!=5.0.*", "prometheus-client>=0.7", ], classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Free Threading", "Framework :: Django :: 4.2", "Framework :: Django :: 5.1", "Framework :: Django :: 5.2", "Framework :: Django :: 6.0", "Topic :: System :: Monitoring", "License :: OSI Approved :: Apache Software License", ], ) django-commons-django-prometheus-febae2c/tox.ini000066400000000000000000000021471520536705300222340ustar00rootroot00000000000000[tox] min_version = 4.4 envlist = {py39,py310,py311,py312}-django420-{end2end,unittests} {py310,py311,py312,py313}-django{510,520}-{end2end,unittests} {py314,py314t}-django520-{end2end,unittests} {py312,py313,py314,py314t}-django600-{end2end,unittests} py39-lint skip_missing_interpreters = True [gh-actions] python = 3.9: py39, py39-lint 3.10: py310 3.11: py311 3.12: py312 3.13: py313 3.14: py314,py314t [testenv] deps = django420: Django>=4.2,<4.3 django510: Django>=5.1,<5.2 django520: Django>=5.2,<5.3 django600: Django>=6.0,<6.1 coverage -rrequirements.txt skip_missing_interpreters=true changedir = end2end: {toxinidir}/django_prometheus/tests/end2end setenv = end2end: PYTHONPATH = {toxinidir} end2end: DJANGO_SETTINGS_MODULE=testapp.settings commands = end2end: coverage run --source=django_prometheus -m pytest testapp/ unittests: coverage run --source=django_prometheus setup.py test unittests: python setup.py sdist bdist_wheel [testenv:py39-lint] deps = pre-commit==4.2.0 commands = pre-commit run --all-files django-commons-django-prometheus-febae2c/update_version_from_git.py000066400000000000000000000102401520536705300262010ustar00rootroot00000000000000"""Adapted from https://github.com/pygame/pygameweb/blob/master/pygameweb/builds/update_version_from_git.py For updating the version from git. __init__.py contains a __version__ field. Update that. If the user supplies "patch" as a CLi argument, we want to bump the existing patch version If the user supplied the full version as a CLI argument, we want to use that version. Otherwise, If we are on master, we want to update the version as a pre-release. git describe --tags With these: __init__.py __version__= '0.0.2' git describe --tags 0.0.1-22-g729a5ae We want this: __init__.py __version__= '0.0.2.dev22.g729a5ae' Get the branch/tag name with this. git symbolic-ref -q --short HEAD || git describe --tags --exact-match """ import re import subprocess import sys from pathlib import Path from packaging.version import Version _INIT_FILE = Path("django_prometheus/__init__.py") def migrate_source_attribute(attr, to_this, target_file): """Updates __magic__ attributes in the source file""" new_file = [] found = False lines = target_file.read_text().splitlines() for line in lines: if line.startswith(attr): found = True line = to_this new_file.append(line) if found: target_file.write_text("\n".join(new_file)) def migrate_version(new_version): """Updates __version__ in the init file""" print(f"migrate to version: {new_version}") migrate_source_attribute("__version__", to_this=f'__version__ = "{new_version}"\n', target_file=_INIT_FILE) def is_master_branch(): cmd = "git rev-parse --abbrev-ref HEAD" tag_branch = subprocess.check_output(cmd, shell=True) return tag_branch in [b"master\n"] def get_git_version_info(): cmd = "git describe --tags" ver_str = subprocess.check_output(cmd, shell=True) ver, commits_since, githash = ver_str.decode().strip().split("-") return Version(ver), int(commits_since), githash def prerelease_version(): """Return what the prerelease version should be. https://packaging.python.org/tutorials/distributing-packages/#pre-release-versioning 0.0.2.dev22 """ ver, commits_since, githash = get_git_version_info() initpy_ver = get_version() assert initpy_ver > ver, "the django_prometheus/__init__.py version should be newer than the last tagged release." return f"{initpy_ver.major}.{initpy_ver.minor}.{initpy_ver.micro}.dev{commits_since}" def get_version(): """Returns version from django_prometheus/__init__.py""" version_file = _INIT_FILE.read_text() version_match = re.search(r'^__version__ = [\'"]([^\'"]*)[\'"]', version_file, re.MULTILINE) if not version_match: raise RuntimeError("Unable to find version string.") initpy_ver = version_match.group(1) assert len(initpy_ver.split(".")) in [3, 4], "django_prometheus/__init__.py version should be like 0.0.2.dev" return Version(initpy_ver) def increase_patch_version(old_version): """:param old_version: 2.0.1 :return: 2.0.2.dev """ return f"{old_version.major}.{old_version.minor}.{old_version.micro + 1}.dev" def release_version_correct(): """Makes sure the: - prerelease version for master is correct. - release version is correct for tags. """ print("update for a pre release version") assert is_master_branch(), "No non-master deployments yet" new_version = prerelease_version() print(f"updating version in __init__.py to {new_version}") assert len(new_version.split(".")) >= 4, "django_prometheus/__init__.py version should be like 0.0.2.dev" migrate_version(new_version) if __name__ == "__main__": new_version = None if len(sys.argv) == 1: release_version_correct() elif len(sys.argv) == 2: for _, arg in enumerate(sys.argv): new_version = arg if new_version == "patch": new_version = increase_patch_version(get_version()) migrate_version(new_version) else: print( "Invalid usage. Supply 0 or 1 arguments. " "Argument can be either a version '1.2.3' or 'patch' " "if you want to increase the patch-version (1.2.3 -> 1.2.4.dev)", )