pax_global_header00006660000000000000000000000064135547573620014533gustar00rootroot0000000000000052 comment=23ed105a9f3525e89c0bfa8db98c01b9b6d25ca6 pyroma-2.6b2/000077500000000000000000000000001355475736200131355ustar00rootroot00000000000000pyroma-2.6b2/.gitattributes000066400000000000000000000000441355475736200160260ustar00rootroot00000000000000pyroma/testdata/* linguist-vendored pyroma-2.6b2/.gitignore000066400000000000000000000001541355475736200151250ustar00rootroot00000000000000syntax: glob *.pyc *.egg-info *.egg EGG-INFO dist build py2* py3* .tox *.wpr *.wpu *.bak *.class .venv .env pyroma-2.6b2/.travis.yml000066400000000000000000000004231355475736200152450ustar00rootroot00000000000000language: python os: - linux matrix: fast_finish: true include: - python: 2.7 - python: 3.6 - python: 3.7 dist: xenial - python: pypy - python: pypy3 install: - pip install -U setuptools>=39.2.0 - python setup.py develop script: python setup.py test pyroma-2.6b2/DEVELOPMENT.rst000066400000000000000000000021741355475736200154550ustar00rootroot00000000000000Testing ======= Run tests: $ python -m unittest pyroma.tests Some notes on developing ======================== *Note: Since pyroma no longer runs tests, this is probably no longer true.* For each Python version supported by Pyroma you need to make sure the "complete" package that is used for testing also supports that version of Python. The complete data supports both Python 2 and Python 3 and depends on the "six" package. As such it's highly unlikely you'll have to change any code. However, you have to mark the package as supporting the Python version. This is most easily done by searching the code for "Python :: 3.2" and adding the Python version that you want to support to the lists of Python versions that appear in several places in this package. Otherwise Pyroma will not run the complete-packages tests with your Python version, and you'll get errors when running Pyroma's test-suite. You also have to make new test-distributions with the updated data. You do it this way: $ cd pyroma/testdata/complete $ python setup.py sdist --formats=bztar,gztar,tar,zip $ cp dist/complete-1.0.dev1.* ../distributions/ pyroma-2.6b2/HISTORY.txt000066400000000000000000000134611355475736200150440ustar00rootroot00000000000000Changelog ========= 2.6b2 (2019-10-26) ------------------ - Ran flake8 and black on the code, better formatting for classifiers.py generation. - Support for PEP 517, setup.cfg-only packages. [Max Tyulin] 2.6b1 (2019-07-17) ------------------ - Adds support for Markdown long_descriptions, if you set long_description_content_type to 'text/markdown' - Installs Pygments to avoid an error message of you have syntax highlighted code in the long_description. 2.5 (2019-06-01) ---------------- - Fixed #35: Correctly restore ``sys.argv``. [maurits] - Added back the BusFactor test, the XMLRPC API supports it. - #26: Adding a test to check for a development status classifier. - #21: Accept the new project_urls distribution data. - Now verifies that classifiers are valid, and that the license field and license classifiers match. - The rating now again reflects if the long_description isn't valid ReST. - #38: Recommendations for the License field has changed. 2.4 (2018-08-15) ---------------- - Get rid of the tests that rely on HTML scraping, it's too brittle. - Update to use pypi.org instead of pypi.python.org [Andreas Lutro, Lennart Regebro] - Added -n command line option to set the minimum rating needed for pyroma to return success, useful in scripts. [Scott Colby] 2.3.1 (2018-05-28) ------------------ - Fixed #12: Installation fails with a non-UTF8 locale under Python 3. [ericof, 4383, regebro] 2.3 (2017-11-28) ---------------- - Check that a classifier specifies the project license. [4383] - Dropped support for Python 2.6, 3.3 and 3.4. - Fixed a unicode issue [gotcha] - Stopped recommending places to keep documentation. 2.2 (2016-10-26) ---------------- - Removed the TestSuite rating. I decided it was too close to looking at code quality. Pyroma no longer cares if you have tests or not. - Fixed #36: PyPI now requires https. 2.1 (2016-10-18) ---------------- - #35: Support for PEP-440. 2.0.2 (2016-03-06) ------------------ - Faked the __name__ variable to allow you to have a "if __name__" construct in the setup.py. 2.0.1 (2016-03-06) ------------------ - Fixed a bug under Python 3 with certain imports. 2.0.0 (2016-02-28) ------------------ - Stable release. 2.0.0b2 (2015-11-09) -------------------- - Made it run under Python 3 again. - PEP8 2.0.0b1 (2015-11-08) -------------------- - Big rewrite of how data is extracted from Distutils/Setuptools. 1.8.3 (2015-11-08) ------------------ - Issue #26: Checking a PyPI package could fail under Python 3. 1.8.2 (2015-06-14) ------------------ - Do not complain that the version number should be a string, when it is a basestring. [maurits] 1.8.1 (2015-04-27) ------------------ - This is what happens when you don't run the tests after merging. 1.8 (2015-04-27) ---------------- - More robust rating. [Jeff Quast] - Closed #24. 1.7 (2014-10-19) ---------------- - Package name lookup is now case insensitive. [Dmitry Vakhrushev] - Fixed yet another error in return value. [Dmitry Vakhrushev] 1.6 (2014-04-17) ---------------- - Fixed issue #17: Integration with zest.releaser stopped working. - Fixed issue #18: Pyroma returns the rating as an exit code, this was a mistake. It now returns 0 on success, 1 on incorrect options and 2 if the rating is below 8. - Fixed issue #19: Implementing a custom test class counts as having tests. - 8: Philadelphia is now considered a "success" based on practical experience. 1.5 (2013-10-18) ---------------- - Fixed issue #13: Pyroma would fail if there was no description. - Dropping support for Python 3.1. It still works, but it is unsupported. - Added support for command line options, implementing #14 and #15. 1.4 (2013-05-29) ---------------- - Issue #13: Pyroma would fail when checking a package name if no source distribution could be found. - Added a check that the package has a source distribution on PyPI. 1.3.1 (2013-05-29) ------------------ - Issue #11: pyroma would fail if long_description was a non-string. - zest.releaser now only runs Pyroma on Python packages. - Because packages that use external test-runners can not get more that 9/10, this value is now also seen as acceptable when running Pyroma through zest.releaser. 1.3 (2013-03-15) ---------------- - Added a test to make sure the version number is a string. - Made sure errors were printed also when a fatal error was encountered. - Better log messages. - The zest.releaser hook is now done before tagging, as it's more useful there. Especially in conjunction with check-manifest. - Having no long_description no longer causes pyroma to fail. 1.2 (2013-03-06) ---------------- - Removed the running of tests. I always found it a bit iffy, and getting rid of it solved a lot of issues. Pyroma is now focused solely on packaging quality. - A package on PyPI with several versions will no longer return an error. - Now looks for documentation on pythonhosted.org or readthedocs.org. - Adds a hook for zest.releaser, so it can be run after doing the checkout, before uploading to PyPI. 1.1 (2013-03-05) ---------------- - Better handling if there is no package data, for example if setup.py doesn't call setup() unless you run it as the "__main__" script. - If setup.py doesn't call setup() look for a main() script and try to run it. 1.0 (2013-03-05) ---------------- - Support for Python 3.3 - Added test for PEP 386 compliance. 0.9.3 (2011-03-17) ------------------ - It's now using a ProxyStub for the PyPI xmlrpclib during tests. - Removed the Dependency rating. - Added a rating that runs tests, to see if they run. This will also take care of checking for dependencies. 0.9.2 (2011-03-13) ------------------ - Commented out the dependency test, it was too unreliable. - Fixed the ReST. - Python 3 support. 0.9.1 (2011-03-08) ------------------ - Initial release pyroma-2.6b2/LICENSE.txt000066400000000000000000000020641355475736200147620ustar00rootroot00000000000000The MIT License Copyright (c) 2011 Lennart Regebro Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pyroma-2.6b2/MANIFEST.in000066400000000000000000000003121355475736200146670ustar00rootroot00000000000000include *.txt recursive-include pyroma/testdata *.py *.txt *.cfg *.html prune pyroma/testdata/complete/*.egg graft pyroma/testdata/distributions include tox.ini include DEVELOPMENT.rst include Makefile pyroma-2.6b2/Makefile000066400000000000000000000017411355475736200146000ustar00rootroot00000000000000.PHONY: docs define PRINT_HELP_PYSCRIPT import re, sys for line in sys.stdin: match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) if match: target, help = match.groups() print("%-20s %s" % (target, help)) endef export PRINT_HELP_PYSCRIPT help: ## display this message @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) generate: ## generate environment for tests cd pyroma/testdata/complete python setup.py sdist --formats=bztar,gztar,tar,zip cp pyroma/testdata/complete/dist/complete-1.0.dev1.* pyroma/testdata/distributions/ tests: generate ## run tests python -m unittest pyroma.tests clean: clean-pyc ## remove all clean-pyc: ## remove Python file artifacts find . -name '*.pyc' -exec rm -f {} + find . -name '*.pyo' -exec rm -f {} + find . -name '*~' -exec rm -f {} + find . -name '__pycache__' -exec rm -fr {} + find . -name 'pip-selfcheck.json' -exec rm -fr {} + find . -name 'pyvenv.cfg' -exec rm -fr {} + prepare-release: python fetch_classifiers.py pyroma-2.6b2/README.rst000066400000000000000000000066051355475736200146330ustar00rootroot00000000000000pyroma ====== Pyroma rhymes with aroma, and is a product aimed at giving a rating of how well a Python project complies with the best practices of the Python packaging ecosystem, primarily PyPI, pip, Distribute etc, as well as a list of issues that could be improved. The aim of this is both to help people make a project that is nice and usable, but also to improve the quality of Python third-party software, making it easier and more enjoyable to use the vast array of available modules for Python. It's written so that there are a library with methods to call from Python, as well as a script, also called pyroma. It can be run on a project directory before making a release: $ pyroma . On a distribution before uploading it to the CheeseShop: $ pyroma pyroma-1.0.tar.gz Or you can give it a package name on CheeseShop: $ pyroma pyroma Giving it a name on CheeseShop is the most extensive test, as it will test for several things isn't otherwise tested. In all cases the output is similar:: ------------------------------ Checking . Found pyroma ------------------------------ The packages long_description is quite short. ------------------------------ Final rating: 9/10 Cottage Cheese ------------------------------ Tests ----- This is the list of checks that are currently performed: * The package should have a name, a version and a Description. If it does not, it will receive a rating of 0. * The version number should be a string. A floating point number will work with distutils, but most other tools will fail. * The version number should comply to PEP386. * The description should be over 10 characters, and the long_description should be over a 100 characters. * Pyroma will convert your long_description to HTML using Docutils, to verify that it is possible. This guarantees pretty formatting of your description on PyPI. As long as Docutils can convert it, this passes, even if there are warnings or error in the conversion. These warnings and errors are printed to stdout so you will see them. NB! Currently this doesn't change the rating, this is because Docutils no longer raises an error during this process, so I have to rewrite the test. Once it's reinstated, incorrect syntax will be fatal. * You should have the following meta data fields filled in: classifiers, keywords, author, author_email, url and license. * You should have classifiers specifying the supported Python versions. * You should have a classifier specifying the project license. * If you are checking on a PyPI package, and not a local directory or local package, pyroma will check the number of owners the package has on PyPI. It should be three or more, to minimize the "Bus factor", the risk of the index owners suddenly going off-line for whatever reason. * If you are checking on a PyPI package, and not a local directory or local package, pyroma will check that you have uploaded a source distribution, and not just binary distributions. Credits ------- The project was created by Lennart Regebro, regebro@gmail.com The name "Pyroma" was coined by Wichert Akkerman, wichert@wiggy.net Contributors: * Godefroid Chapelle * Dmitry Vakhrushev * hugovk * Jeff Quast * Maurits van Rees * Hervé Beraud * Érico Andrei * Jakub Wilk * Andreas Lutro * Scott Colby * Andrew Murray * Nikita Sobolev * Charles Tapley Hoyt * Max Tyulin pyroma-2.6b2/README.txt000066400000000000000000000000171355475736200146310ustar00rootroot00000000000000See README.rst pyroma-2.6b2/fetch_classifiers.py000066400000000000000000000045031355475736200171710ustar00rootroot00000000000000import os import re from collections import defaultdict try: from urllib.request import urlopen except ImportError: from urllib import urlopen CLASSIFIER_URL = "https://pypi.org/pypi?%3Aaction=list_classifiers" CLASSIFIER_FILE = "pyroma/classifiers.py" SHORT_NAME_RE = re.compile(br"\(.*?\)") def update_classifiers(): source = urlopen(CLASSIFIER_URL).read() classifiers = [each.strip() for each in source.splitlines()] licenses = [each for each in classifiers if each.startswith(b"License")] license_map = defaultdict(set) code_map = defaultdict(set) for license in licenses: short_name = SHORT_NAME_RE.findall(license) if short_name: short_name = short_name[0][1:-1] code_map[short_name].add(license) license_map[license].add(short_name) if short_name.startswith(b"GPL"): code_map[b"GPL"].add(license) license_map[license].add(b"GPL") elif short_name.startswith(b"LGPL"): code_map[b"LGPL"].add(license) license_map[license].add(b"LGPL") elif b"Zope" in license: code_map[b"ZPL"].add(license) license_map[license].add(b"ZPL") elif b"MIT License" in license: code_map[b"MIT"].add(license) license_map[license].add(b"MIT") with open(CLASSIFIER_FILE, "wb") as out: out.write(b"""CLASSIFIERS = {\n""") for classifier in classifiers: out.write(b' "%s",\n' % classifier) out.write(b"""}\n\n""") out.write(b"""LICENSE_CODES = {\n""") for license, codes in license_map.items(): out.write(b' "%s": {"' % license) out.write(b'", "'.join(codes)) out.write(b'"},\n') out.write(b"""}\n\n""") out.write(b"""CODE_LICENSES = {\n""") for code, licenses in code_map.items(): out.write(b' "%s": {\n "' % code) out.write(b'",\n "'.join(licenses)) out.write(b'"},\n') out.write(b"""}\n\n""") if __name__ == "__main__": # Verify that we are in the right directory if not os.path.exists(CLASSIFIER_FILE): raise RuntimeError( "You must run this script from the root directory of " "a Pyroma checkout." ) update_classifiers() pyroma-2.6b2/pyroma/000077500000000000000000000000001355475736200144445ustar00rootroot00000000000000pyroma-2.6b2/pyroma/__init__.py000066400000000000000000000071321355475736200165600ustar00rootroot00000000000000import os import sys from optparse import OptionParser from pyroma import projectdata, distributiondata, pypidata, ratings import logging logging.basicConfig(level=logging.DEBUG, stream=sys.stdout, format="%(message)s") def zester(data): main_files = os.listdir(data["workingdir"]) if "setup.py" not in main_files and "setup.cfg" not in main_files: return from zest.releaser.utils import ask if ask("Run pyroma on the package before tagging?"): rating = run("directory", os.path.abspath(data["workingdir"])) if rating < 8: if not ask("Continue?"): sys.exit(1) def main(): usage = ( "usage: %prog [-n N] [-a|-d|-f|-p] " ) parser = OptionParser(usage) parser.add_option( "-n", "--min", dest="min", default=8, action="store", type=int, help="Minimum rating for clean return between 0 and 10, inclusive", ) parser.add_option( "-a", "--auto", dest="auto", default=False, action="store_true", help="Select mode automatically (default)", ) parser.add_option( "-d", "--directory", dest="directory", action="store_true", default=False, help="Run pyroma on a module in a project directory", ) parser.add_option( "-f", "--file", dest="file", action="store_true", default=False, help="Run pyroma on a distribution file", ) parser.add_option( "-p", "--pypi", dest="pypi", action="store_true", default=False, help="Run pyroma on a package on PyPI", ) (options, args) = parser.parse_args() if len(args) < 1: parser.print_help() sys.exit(1) if not (0 <= options.min <= 10): parser.print_help() sys.exit(1) modes = (options.auto, options.directory, options.file, options.pypi) if sum([1 if x else 0 for x in modes]) > 1: print("You can only select one of the options -a, -d, -f and -p") sys.exit(1) argument = args[0] mode = "pypi" if not any(modes) or options.auto: if os.path.isdir(argument): mode = "directory" elif os.path.isfile(argument): mode = "file" elif options.directory: mode = "directory" elif options.file: mode = "file" rating = run(mode, argument) if rating < options.min: sys.exit(2) sys.exit(0) def run(mode, argument): logging.info("-" * 30) logging.info("Checking " + argument) if mode == "directory": data = projectdata.get_data(os.path.abspath(argument)) logging.info("Found " + data.get("name", "nothing")) elif mode == "file": data = distributiondata.get_data(os.path.abspath(argument)) logging.info("Found " + data.get("name", "nothing")) else: # It's probably a package name data = pypidata.get_data(argument) logging.info("Found " + data.get("name", "nothing")) rating = ratings.rate(data) logging.info("-" * 30) for problem in rating[1]: # XXX It would be nice with a * pointlist instead, but that requires # that we know how wide the terminal is and nice word-breaks, so that's # for later. logging.info(problem) if rating[1]: logging.info("-" * 30) logging.info("Final rating: " + str(rating[0]) + "/10") logging.info(ratings.LEVELS[rating[0]]) logging.info("-" * 30) return rating[0] pyroma-2.6b2/pyroma/classifiers.py000066400000000000000000001213411355475736200173270ustar00rootroot00000000000000CLASSIFIERS = { "Development Status :: 1 - Planning", "Development Status :: 2 - Pre-Alpha", "Development Status :: 3 - Alpha", "Development Status :: 4 - Beta", "Development Status :: 5 - Production/Stable", "Development Status :: 6 - Mature", "Development Status :: 7 - Inactive", "Environment :: Console", "Environment :: Console :: Curses", "Environment :: Console :: Framebuffer", "Environment :: Console :: Newt", "Environment :: Console :: svgalib", "Environment :: Handhelds/PDA's", "Environment :: MacOS X", "Environment :: MacOS X :: Aqua", "Environment :: MacOS X :: Carbon", "Environment :: MacOS X :: Cocoa", "Environment :: No Input/Output (Daemon)", "Environment :: OpenStack", "Environment :: Other Environment", "Environment :: Plugins", "Environment :: Web Environment", "Environment :: Web Environment :: Buffet", "Environment :: Web Environment :: Mozilla", "Environment :: Web Environment :: ToscaWidgets", "Environment :: Win32 (MS Windows)", "Environment :: X11 Applications", "Environment :: X11 Applications :: Gnome", "Environment :: X11 Applications :: GTK", "Environment :: X11 Applications :: KDE", "Environment :: X11 Applications :: Qt", "Framework :: AiiDA", "Framework :: AsyncIO", "Framework :: BEAT", "Framework :: BFG", "Framework :: Bob", "Framework :: Bottle", "Framework :: Buildout", "Framework :: Buildout :: Extension", "Framework :: Buildout :: Recipe", "Framework :: CastleCMS", "Framework :: CastleCMS :: Theme", "Framework :: Chandler", "Framework :: CherryPy", "Framework :: CubicWeb", "Framework :: Django", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Framework :: Django :: 1.4", "Framework :: Django :: 1.5", "Framework :: Django :: 1.6", "Framework :: Django :: 1.7", "Framework :: Django :: 1.8", "Framework :: Django :: 1.9", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Framework :: Django :: 3.0", "Framework :: Django CMS", "Framework :: Django CMS :: 3.4", "Framework :: Django CMS :: 3.5", "Framework :: Django CMS :: 3.6", "Framework :: Django CMS :: 3.7", "Framework :: Flake8", "Framework :: Flask", "Framework :: Hypothesis", "Framework :: IDLE", "Framework :: IPython", "Framework :: Jupyter", "Framework :: Lektor", "Framework :: Masonite", "Framework :: Nengo", "Framework :: Odoo", "Framework :: Opps", "Framework :: Paste", "Framework :: Pelican", "Framework :: Pelican :: Plugins", "Framework :: Pelican :: Themes", "Framework :: Plone", "Framework :: Plone :: 3.2", "Framework :: Plone :: 3.3", "Framework :: Plone :: 4.0", "Framework :: Plone :: 4.1", "Framework :: Plone :: 4.2", "Framework :: Plone :: 4.3", "Framework :: Plone :: 5.0", "Framework :: Plone :: 5.1", "Framework :: Plone :: 5.2", "Framework :: Plone :: 5.3", "Framework :: Plone :: Addon", "Framework :: Plone :: Core", "Framework :: Plone :: Theme", "Framework :: Pylons", "Framework :: Pyramid", "Framework :: Pytest", "Framework :: Review Board", "Framework :: Robot Framework", "Framework :: Robot Framework :: Library", "Framework :: Robot Framework :: Tool", "Framework :: Scrapy", "Framework :: Setuptools Plugin", "Framework :: Sphinx", "Framework :: Sphinx :: Extension", "Framework :: Sphinx :: Theme", "Framework :: tox", "Framework :: Trac", "Framework :: Trio", "Framework :: Tryton", "Framework :: TurboGears", "Framework :: TurboGears :: Applications", "Framework :: TurboGears :: Widgets", "Framework :: Twisted", "Framework :: Wagtail", "Framework :: Wagtail :: 1", "Framework :: Wagtail :: 2", "Framework :: ZODB", "Framework :: Zope", "Framework :: Zope2", "Framework :: Zope :: 2", "Framework :: Zope3", "Framework :: Zope :: 3", "Framework :: Zope :: 4", "Framework :: Zope :: 5", "Intended Audience :: Customer Service", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: End Users/Desktop", "Intended Audience :: Financial and Insurance Industry", "Intended Audience :: Healthcare Industry", "Intended Audience :: Information Technology", "Intended Audience :: Legal Industry", "Intended Audience :: Manufacturing", "Intended Audience :: Other Audience", "Intended Audience :: Religion", "Intended Audience :: Science/Research", "Intended Audience :: System Administrators", "Intended Audience :: Telecommunications Industry", "License :: Aladdin Free Public License (AFPL)", "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication", "License :: CeCILL-B Free Software License Agreement (CECILL-B)", "License :: CeCILL-C Free Software License Agreement (CECILL-C)", "License :: DFSG approved", "License :: Eiffel Forum License (EFL)", "License :: Free For Educational Use", "License :: Free For Home Use", "License :: Free for non-commercial use", "License :: Freely Distributable", "License :: Free To Use But Restricted", "License :: Freeware", "License :: GUST Font License 1.0", "License :: GUST Font License 2006-09-30", "License :: Netscape Public License (NPL)", "License :: Nokia Open Source License (NOKOS)", "License :: OSI Approved", "License :: OSI Approved :: Academic Free License (AFL)", "License :: OSI Approved :: Apache Software License", "License :: OSI Approved :: Apple Public Source License", "License :: OSI Approved :: Artistic License", "License :: OSI Approved :: Attribution Assurance License", "License :: OSI Approved :: Boost Software License 1.0 (BSL-1.0)", "License :: OSI Approved :: BSD License", "License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)", "License :: OSI Approved :: Common Development and Distribution License 1.0 (CDDL-1.0)", "License :: OSI Approved :: Common Public License", "License :: OSI Approved :: Eclipse Public License 1.0 (EPL-1.0)", "License :: OSI Approved :: Eclipse Public License 2.0 (EPL-2.0)", "License :: OSI Approved :: Eiffel Forum License", "License :: OSI Approved :: European Union Public Licence 1.0 (EUPL 1.0)", "License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)", "License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)", "License :: OSI Approved :: GNU Affero General Public License v3", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "License :: OSI Approved :: GNU Free Documentation License (FDL)", "License :: OSI Approved :: GNU General Public License (GPL)", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)", "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)", "License :: OSI Approved :: IBM Public License", "License :: OSI Approved :: Intel Open Source License", "License :: OSI Approved :: ISC License (ISCL)", "License :: OSI Approved :: Jabber Open Source License", "License :: OSI Approved :: MirOS License (MirOS)", "License :: OSI Approved :: MIT License", "License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)", "License :: OSI Approved :: Motosoto License", "License :: OSI Approved :: Mozilla Public License 1.0 (MPL)", "License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "License :: OSI Approved :: Nethack General Public License", "License :: OSI Approved :: Nokia Open Source License", "License :: OSI Approved :: Open Group Test Suite License", "License :: OSI Approved :: Open Software License 3.0 (OSL-3.0)", "License :: OSI Approved :: PostgreSQL License", "License :: OSI Approved :: Python License (CNRI Python License)", "License :: OSI Approved :: Python Software Foundation License", "License :: OSI Approved :: Qt Public License (QPL)", "License :: OSI Approved :: Ricoh Source Code Public License", "License :: OSI Approved :: SIL Open Font License 1.1 (OFL-1.1)", "License :: OSI Approved :: Sleepycat License", "License :: OSI Approved :: Sun Industry Standards Source License (SISSL)", "License :: OSI Approved :: Sun Public License", "License :: OSI Approved :: Universal Permissive License (UPL)", "License :: OSI Approved :: University of Illinois/NCSA Open Source License", "License :: OSI Approved :: Vovida Software License 1.0", "License :: OSI Approved :: W3C License", "License :: OSI Approved :: X.Net License", "License :: OSI Approved :: zlib/libpng License", "License :: OSI Approved :: Zope Public License", "License :: Other/Proprietary License", "License :: Public Domain", "License :: Repoze Public License", "Natural Language :: Afrikaans", "Natural Language :: Arabic", "Natural Language :: Bengali", "Natural Language :: Bosnian", "Natural Language :: Bulgarian", "Natural Language :: Cantonese", "Natural Language :: Catalan", "Natural Language :: Chinese (Simplified)", "Natural Language :: Chinese (Traditional)", "Natural Language :: Croatian", "Natural Language :: Czech", "Natural Language :: Danish", "Natural Language :: Dutch", "Natural Language :: English", "Natural Language :: Esperanto", "Natural Language :: Finnish", "Natural Language :: French", "Natural Language :: Galician", "Natural Language :: German", "Natural Language :: Greek", "Natural Language :: Hebrew", "Natural Language :: Hindi", "Natural Language :: Hungarian", "Natural Language :: Icelandic", "Natural Language :: Indonesian", "Natural Language :: Italian", "Natural Language :: Japanese", "Natural Language :: Javanese", "Natural Language :: Korean", "Natural Language :: Latin", "Natural Language :: Latvian", "Natural Language :: Macedonian", "Natural Language :: Malay", "Natural Language :: Marathi", "Natural Language :: Norwegian", "Natural Language :: Panjabi", "Natural Language :: Persian", "Natural Language :: Polish", "Natural Language :: Portuguese", "Natural Language :: Portuguese (Brazilian)", "Natural Language :: Romanian", "Natural Language :: Russian", "Natural Language :: Serbian", "Natural Language :: Slovak", "Natural Language :: Slovenian", "Natural Language :: Spanish", "Natural Language :: Swedish", "Natural Language :: Tamil", "Natural Language :: Telugu", "Natural Language :: Thai", "Natural Language :: Tibetan", "Natural Language :: Turkish", "Natural Language :: Ukrainian", "Natural Language :: Urdu", "Natural Language :: Vietnamese", "Operating System :: Android", "Operating System :: BeOS", "Operating System :: iOS", "Operating System :: MacOS", "Operating System :: MacOS :: MacOS 9", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft", "Operating System :: Microsoft :: MS-DOS", "Operating System :: Microsoft :: Windows", "Operating System :: Microsoft :: Windows :: Windows 10", "Operating System :: Microsoft :: Windows :: Windows 3.1 or Earlier", "Operating System :: Microsoft :: Windows :: Windows 7", "Operating System :: Microsoft :: Windows :: Windows 8", "Operating System :: Microsoft :: Windows :: Windows 8.1", "Operating System :: Microsoft :: Windows :: Windows 95/98/2000", "Operating System :: Microsoft :: Windows :: Windows CE", "Operating System :: Microsoft :: Windows :: Windows NT/2000", "Operating System :: Microsoft :: Windows :: Windows Server 2003", "Operating System :: Microsoft :: Windows :: Windows Server 2008", "Operating System :: Microsoft :: Windows :: Windows Vista", "Operating System :: Microsoft :: Windows :: Windows XP", "Operating System :: OS/2", "Operating System :: OS Independent", "Operating System :: Other OS", "Operating System :: PalmOS", "Operating System :: PDA Systems", "Operating System :: POSIX", "Operating System :: POSIX :: AIX", "Operating System :: POSIX :: BSD", "Operating System :: POSIX :: BSD :: BSD/OS", "Operating System :: POSIX :: BSD :: FreeBSD", "Operating System :: POSIX :: BSD :: NetBSD", "Operating System :: POSIX :: BSD :: OpenBSD", "Operating System :: POSIX :: GNU Hurd", "Operating System :: POSIX :: HP-UX", "Operating System :: POSIX :: IRIX", "Operating System :: POSIX :: Linux", "Operating System :: POSIX :: Other", "Operating System :: POSIX :: SCO", "Operating System :: POSIX :: SunOS/Solaris", "Operating System :: Unix", "Programming Language :: Ada", "Programming Language :: APL", "Programming Language :: ASP", "Programming Language :: Assembly", "Programming Language :: Awk", "Programming Language :: Basic", "Programming Language :: C", "Programming Language :: C#", "Programming Language :: C++", "Programming Language :: Cold Fusion", "Programming Language :: Cython", "Programming Language :: Delphi/Kylix", "Programming Language :: Dylan", "Programming Language :: Eiffel", "Programming Language :: Emacs-Lisp", "Programming Language :: Erlang", "Programming Language :: Euler", "Programming Language :: Euphoria", "Programming Language :: F#", "Programming Language :: Forth", "Programming Language :: Fortran", "Programming Language :: Haskell", "Programming Language :: Java", "Programming Language :: JavaScript", "Programming Language :: Lisp", "Programming Language :: Logo", "Programming Language :: ML", "Programming Language :: Modula", "Programming Language :: Objective C", "Programming Language :: Object Pascal", "Programming Language :: OCaml", "Programming Language :: Other", "Programming Language :: Other Scripting Engines", "Programming Language :: Pascal", "Programming Language :: Perl", "Programming Language :: PHP", "Programming Language :: Pike", "Programming Language :: Pliant", "Programming Language :: PL/SQL", "Programming Language :: PROGRESS", "Programming Language :: Prolog", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.3", "Programming Language :: Python :: 2.4", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 2 :: Only", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.0", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: IronPython", "Programming Language :: Python :: Implementation :: Jython", "Programming Language :: Python :: Implementation :: MicroPython", "Programming Language :: Python :: Implementation :: PyPy", "Programming Language :: Python :: Implementation :: Stackless", "Programming Language :: R", "Programming Language :: REBOL", "Programming Language :: Rexx", "Programming Language :: Ruby", "Programming Language :: Rust", "Programming Language :: Scheme", "Programming Language :: Simula", "Programming Language :: Smalltalk", "Programming Language :: SQL", "Programming Language :: Tcl", "Programming Language :: Unix Shell", "Programming Language :: Visual Basic", "Programming Language :: XBasic", "Programming Language :: YACC", "Programming Language :: Zope", "Topic :: Adaptive Technologies", "Topic :: Artistic Software", "Topic :: Communications", "Topic :: Communications :: BBS", "Topic :: Communications :: Chat", "Topic :: Communications :: Chat :: ICQ", "Topic :: Communications :: Chat :: Internet Relay Chat", "Topic :: Communications :: Chat :: Unix Talk", "Topic :: Communications :: Conferencing", "Topic :: Communications :: Email", "Topic :: Communications :: Email :: Address Book", "Topic :: Communications :: Email :: Email Clients (MUA)", "Topic :: Communications :: Email :: Filters", "Topic :: Communications :: Email :: Mailing List Servers", "Topic :: Communications :: Email :: Mail Transport Agents", "Topic :: Communications :: Email :: Post-Office", "Topic :: Communications :: Email :: Post-Office :: IMAP", "Topic :: Communications :: Email :: Post-Office :: POP3", "Topic :: Communications :: Fax", "Topic :: Communications :: FIDO", "Topic :: Communications :: File Sharing", "Topic :: Communications :: File Sharing :: Gnutella", "Topic :: Communications :: File Sharing :: Napster", "Topic :: Communications :: Ham Radio", "Topic :: Communications :: Internet Phone", "Topic :: Communications :: Telephony", "Topic :: Communications :: Usenet News", "Topic :: Database", "Topic :: Database :: Database Engines/Servers", "Topic :: Database :: Front-Ends", "Topic :: Desktop Environment", "Topic :: Desktop Environment :: File Managers", "Topic :: Desktop Environment :: Gnome", "Topic :: Desktop Environment :: GNUstep", "Topic :: Desktop Environment :: K Desktop Environment (KDE)", "Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes", "Topic :: Desktop Environment :: PicoGUI", "Topic :: Desktop Environment :: PicoGUI :: Applications", "Topic :: Desktop Environment :: PicoGUI :: Themes", "Topic :: Desktop Environment :: Screen Savers", "Topic :: Desktop Environment :: Window Managers", "Topic :: Desktop Environment :: Window Managers :: Afterstep", "Topic :: Desktop Environment :: Window Managers :: Afterstep :: Themes", "Topic :: Desktop Environment :: Window Managers :: Applets", "Topic :: Desktop Environment :: Window Managers :: Blackbox", "Topic :: Desktop Environment :: Window Managers :: Blackbox :: Themes", "Topic :: Desktop Environment :: Window Managers :: CTWM", "Topic :: Desktop Environment :: Window Managers :: CTWM :: Themes", "Topic :: Desktop Environment :: Window Managers :: Enlightenment", "Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Epplets", "Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR15", "Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR16", "Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR17", "Topic :: Desktop Environment :: Window Managers :: Fluxbox", "Topic :: Desktop Environment :: Window Managers :: Fluxbox :: Themes", "Topic :: Desktop Environment :: Window Managers :: FVWM", "Topic :: Desktop Environment :: Window Managers :: FVWM :: Themes", "Topic :: Desktop Environment :: Window Managers :: IceWM", "Topic :: Desktop Environment :: Window Managers :: IceWM :: Themes", "Topic :: Desktop Environment :: Window Managers :: MetaCity", "Topic :: Desktop Environment :: Window Managers :: MetaCity :: Themes", "Topic :: Desktop Environment :: Window Managers :: Oroborus", "Topic :: Desktop Environment :: Window Managers :: Oroborus :: Themes", "Topic :: Desktop Environment :: Window Managers :: Sawfish", "Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes 0.30", "Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes pre-0.30", "Topic :: Desktop Environment :: Window Managers :: Waimea", "Topic :: Desktop Environment :: Window Managers :: Waimea :: Themes", "Topic :: Desktop Environment :: Window Managers :: Window Maker", "Topic :: Desktop Environment :: Window Managers :: Window Maker :: Applets", "Topic :: Desktop Environment :: Window Managers :: Window Maker :: Themes", "Topic :: Desktop Environment :: Window Managers :: XFCE", "Topic :: Desktop Environment :: Window Managers :: XFCE :: Themes", "Topic :: Documentation", "Topic :: Documentation :: Sphinx", "Topic :: Education", "Topic :: Education :: Computer Aided Instruction (CAI)", "Topic :: Education :: Testing", "Topic :: Games/Entertainment", "Topic :: Games/Entertainment :: Arcade", "Topic :: Games/Entertainment :: Board Games", "Topic :: Games/Entertainment :: First Person Shooters", "Topic :: Games/Entertainment :: Fortune Cookies", "Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)", "Topic :: Games/Entertainment :: Puzzle Games", "Topic :: Games/Entertainment :: Real Time Strategy", "Topic :: Games/Entertainment :: Role-Playing", "Topic :: Games/Entertainment :: Side-Scrolling/Arcade Games", "Topic :: Games/Entertainment :: Simulation", "Topic :: Games/Entertainment :: Turn Based Strategy", "Topic :: Home Automation", "Topic :: Internet", "Topic :: Internet :: File Transfer Protocol (FTP)", "Topic :: Internet :: Finger", "Topic :: Internet :: Log Analysis", "Topic :: Internet :: Name Service (DNS)", "Topic :: Internet :: Proxy Servers", "Topic :: Internet :: WAP", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Browsers", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Content Management System", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: News/Diary", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Wiki", "Topic :: Internet :: WWW/HTTP :: HTTP Servers", "Topic :: Internet :: WWW/HTTP :: Indexing/Search", "Topic :: Internet :: WWW/HTTP :: Session", "Topic :: Internet :: WWW/HTTP :: Site Management", "Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking", "Topic :: Internet :: WWW/HTTP :: WSGI", "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware", "Topic :: Internet :: WWW/HTTP :: WSGI :: Server", "Topic :: Internet :: XMPP", "Topic :: Internet :: Z39.50", "Topic :: Multimedia", "Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics :: 3D Modeling", "Topic :: Multimedia :: Graphics :: 3D Rendering", "Topic :: Multimedia :: Graphics :: Capture", "Topic :: Multimedia :: Graphics :: Capture :: Digital Camera", "Topic :: Multimedia :: Graphics :: Capture :: Scanners", "Topic :: Multimedia :: Graphics :: Capture :: Screen Capture", "Topic :: Multimedia :: Graphics :: Editors", "Topic :: Multimedia :: Graphics :: Editors :: Raster-Based", "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", "Topic :: Multimedia :: Graphics :: Graphics Conversion", "Topic :: Multimedia :: Graphics :: Presentation", "Topic :: Multimedia :: Graphics :: Viewers", "Topic :: Multimedia :: Sound/Audio", "Topic :: Multimedia :: Sound/Audio :: Analysis", "Topic :: Multimedia :: Sound/Audio :: Capture/Recording", "Topic :: Multimedia :: Sound/Audio :: CD Audio", "Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing", "Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping", "Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Writing", "Topic :: Multimedia :: Sound/Audio :: Conversion", "Topic :: Multimedia :: Sound/Audio :: Editors", "Topic :: Multimedia :: Sound/Audio :: MIDI", "Topic :: Multimedia :: Sound/Audio :: Mixers", "Topic :: Multimedia :: Sound/Audio :: Players", "Topic :: Multimedia :: Sound/Audio :: Players :: MP3", "Topic :: Multimedia :: Sound/Audio :: Sound Synthesis", "Topic :: Multimedia :: Sound/Audio :: Speech", "Topic :: Multimedia :: Video", "Topic :: Multimedia :: Video :: Capture", "Topic :: Multimedia :: Video :: Conversion", "Topic :: Multimedia :: Video :: Display", "Topic :: Multimedia :: Video :: Non-Linear Editor", "Topic :: Office/Business", "Topic :: Office/Business :: Financial", "Topic :: Office/Business :: Financial :: Accounting", "Topic :: Office/Business :: Financial :: Investment", "Topic :: Office/Business :: Financial :: Point-Of-Sale", "Topic :: Office/Business :: Financial :: Spreadsheet", "Topic :: Office/Business :: Groupware", "Topic :: Office/Business :: News/Diary", "Topic :: Office/Business :: Office Suites", "Topic :: Office/Business :: Scheduling", "Topic :: Other/Nonlisted Topic", "Topic :: Printing", "Topic :: Religion", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Artificial Life", "Topic :: Scientific/Engineering :: Astronomy", "Topic :: Scientific/Engineering :: Atmospheric Science", "Topic :: Scientific/Engineering :: Bio-Informatics", "Topic :: Scientific/Engineering :: Chemistry", "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)", "Topic :: Scientific/Engineering :: GIS", "Topic :: Scientific/Engineering :: Human Machine Interfaces", "Topic :: Scientific/Engineering :: Hydrology", "Topic :: Scientific/Engineering :: Image Recognition", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator", "Topic :: Scientific/Engineering :: Mathematics", "Topic :: Scientific/Engineering :: Medical Science Apps.", "Topic :: Scientific/Engineering :: Physics", "Topic :: Scientific/Engineering :: Visualization", "Topic :: Security", "Topic :: Security :: Cryptography", "Topic :: Sociology", "Topic :: Sociology :: Genealogy", "Topic :: Sociology :: History", "Topic :: Software Development", "Topic :: Software Development :: Assemblers", "Topic :: Software Development :: Bug Tracking", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Code Generators", "Topic :: Software Development :: Compilers", "Topic :: Software Development :: Debuggers", "Topic :: Software Development :: Disassemblers", "Topic :: Software Development :: Documentation", "Topic :: Software Development :: Embedded Systems", "Topic :: Software Development :: Internationalization", "Topic :: Software Development :: Interpreters", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Java Libraries", "Topic :: Software Development :: Libraries :: Perl Modules", "Topic :: Software Development :: Libraries :: PHP Classes", "Topic :: Software Development :: Libraries :: Pike Modules", "Topic :: Software Development :: Libraries :: pygame", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Libraries :: Ruby Modules", "Topic :: Software Development :: Libraries :: Tcl Extensions", "Topic :: Software Development :: Localization", "Topic :: Software Development :: Object Brokering", "Topic :: Software Development :: Object Brokering :: CORBA", "Topic :: Software Development :: Pre-processors", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Testing", "Topic :: Software Development :: Testing :: Acceptance", "Topic :: Software Development :: Testing :: BDD", "Topic :: Software Development :: Testing :: Mocking", "Topic :: Software Development :: Testing :: Traffic Generation", "Topic :: Software Development :: Testing :: Unit", "Topic :: Software Development :: User Interfaces", "Topic :: Software Development :: Version Control", "Topic :: Software Development :: Version Control :: Bazaar", "Topic :: Software Development :: Version Control :: CVS", "Topic :: Software Development :: Version Control :: Git", "Topic :: Software Development :: Version Control :: Mercurial", "Topic :: Software Development :: Version Control :: RCS", "Topic :: Software Development :: Version Control :: SCCS", "Topic :: Software Development :: Widget Sets", "Topic :: System", "Topic :: System :: Archiving", "Topic :: System :: Archiving :: Backup", "Topic :: System :: Archiving :: Compression", "Topic :: System :: Archiving :: Mirroring", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Benchmark", "Topic :: System :: Boot", "Topic :: System :: Boot :: Init", "Topic :: System :: Clustering", "Topic :: System :: Console Fonts", "Topic :: System :: Distributed Computing", "Topic :: System :: Emulators", "Topic :: System :: Filesystems", "Topic :: System :: Hardware", "Topic :: System :: Hardware :: Hardware Drivers", "Topic :: System :: Hardware :: Mainframes", "Topic :: System :: Hardware :: Symmetric Multi-processing", "Topic :: System :: Installation/Setup", "Topic :: System :: Logging", "Topic :: System :: Monitoring", "Topic :: System :: Networking", "Topic :: System :: Networking :: Firewalls", "Topic :: System :: Networking :: Monitoring", "Topic :: System :: Networking :: Monitoring :: Hardware Watchdog", "Topic :: System :: Networking :: Time Synchronization", "Topic :: System :: Operating System", "Topic :: System :: Operating System Kernels", "Topic :: System :: Operating System Kernels :: BSD", "Topic :: System :: Operating System Kernels :: GNU Hurd", "Topic :: System :: Operating System Kernels :: Linux", "Topic :: System :: Power (UPS)", "Topic :: System :: Recovery Tools", "Topic :: System :: Shells", "Topic :: System :: Software Distribution", "Topic :: System :: Systems Administration", "Topic :: System :: Systems Administration :: Authentication/Directory", "Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP", "Topic :: System :: Systems Administration :: Authentication/Directory :: NIS", "Topic :: System :: System Shells", "Topic :: Terminals", "Topic :: Terminals :: Serial", "Topic :: Terminals :: Telnet", "Topic :: Terminals :: Terminal Emulators/X Terminals", "Topic :: Text Editors", "Topic :: Text Editors :: Documentation", "Topic :: Text Editors :: Emacs", "Topic :: Text Editors :: Integrated Development Environments (IDE)", "Topic :: Text Editors :: Text Processing", "Topic :: Text Editors :: Word Processors", "Topic :: Text Processing", "Topic :: Text Processing :: Filters", "Topic :: Text Processing :: Fonts", "Topic :: Text Processing :: General", "Topic :: Text Processing :: Indexing", "Topic :: Text Processing :: Linguistic", "Topic :: Text Processing :: Markup", "Topic :: Text Processing :: Markup :: HTML", "Topic :: Text Processing :: Markup :: LaTeX", "Topic :: Text Processing :: Markup :: SGML", "Topic :: Text Processing :: Markup :: VRML", "Topic :: Text Processing :: Markup :: XML", "Topic :: Utilities", "Typing :: Typed", } LICENSE_CODES = { "License :: OSI Approved :: Eclipse Public License 2.0 (EPL-2.0)": {"EPL-2.0"}, "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication": {"CC0 1.0"}, "License :: OSI Approved :: Sun Industry Standards Source License (SISSL)": { "SISSL" }, "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)": { "GPLv2+", "GPL", }, "License :: OSI Approved :: Eclipse Public License 1.0 (EPL-1.0)": {"EPL-1.0"}, "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)": { "LGPL", "LGPLv3", }, "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)": {"MPL 2.0"}, "License :: OSI Approved :: European Union Public Licence 1.0 (EUPL 1.0)": { "EUPL 1.0" }, "License :: CeCILL-C Free Software License Agreement (CECILL-C)": {"CECILL-C"}, "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)": { "LGPL", "LGPLv2+", }, "License :: OSI Approved :: GNU General Public License v3 (GPLv3)": { "GPL", "GPLv3", }, "License :: CeCILL-B Free Software License Agreement (CECILL-B)": {"CECILL-B"}, "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)": { "AGPLv3+" }, "License :: OSI Approved :: MirOS License (MirOS)": {"MirOS"}, "License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)": { "CeCILL-2.1" }, "License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)": { "EUPL 1.2" }, "License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)": { "CVW" }, "License :: OSI Approved :: GNU Free Documentation License (FDL)": {"FDL"}, "License :: Aladdin Free Public License (AFPL)": {"AFPL"}, "License :: OSI Approved :: GNU General Public License (GPL)": {"GPL"}, "License :: Eiffel Forum License (EFL)": {"EFL"}, "License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)": {"MPL 1.1"}, "License :: OSI Approved :: Python License (CNRI Python License)": { "CNRI Python License" }, "License :: OSI Approved :: Open Software License 3.0 (OSL-3.0)": {"OSL-3.0"}, "License :: Nokia Open Source License (NOKOS)": {"NOKOS"}, "License :: OSI Approved :: Mozilla Public License 1.0 (MPL)": {"MPL"}, "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)": { "LGPLv3+", "LGPL", }, "License :: OSI Approved :: Qt Public License (QPL)": {"QPL"}, "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)": { "LGPL" }, "License :: OSI Approved :: SIL Open Font License 1.1 (OFL-1.1)": {"OFL-1.1"}, "License :: OSI Approved :: Common Development and Distribution License 1.0 (CDDL-1.0)": { "CDDL-1.0" }, "License :: OSI Approved :: GNU General Public License v2 (GPLv2)": { "GPL", "GPLv2", }, "License :: OSI Approved :: MIT License": {"MIT"}, "License :: OSI Approved :: Zope Public License": {"ZPL"}, "License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)": { "HPND" }, "License :: Netscape Public License (NPL)": {"NPL"}, "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)": { "GPL", "GPLv3+", }, "License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)": { "LGPL", "LGPLv2", }, "License :: OSI Approved :: Boost Software License 1.0 (BSL-1.0)": {"BSL-1.0"}, "License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)": { "EUPL 1.1" }, "License :: OSI Approved :: ISC License (ISCL)": {"ISCL"}, "License :: OSI Approved :: Academic Free License (AFL)": {"AFL"}, "License :: OSI Approved :: Universal Permissive License (UPL)": {"UPL"}, } CODE_LICENSES = { "GPLv2+": { "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)" }, "MirOS": {"License :: OSI Approved :: MirOS License (MirOS)"}, "GPLv3+": { "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)" }, "CECILL-C": {"License :: CeCILL-C Free Software License Agreement (CECILL-C)"}, "CECILL-B": {"License :: CeCILL-B Free Software License Agreement (CECILL-B)"}, "GPLv2": {"License :: OSI Approved :: GNU General Public License v2 (GPLv2)"}, "GPLv3": {"License :: OSI Approved :: GNU General Public License v3 (GPLv3)"}, "BSL-1.0": {"License :: OSI Approved :: Boost Software License 1.0 (BSL-1.0)"}, "FDL": {"License :: OSI Approved :: GNU Free Documentation License (FDL)"}, "AFPL": {"License :: Aladdin Free Public License (AFPL)"}, "CDDL-1.0": { "License :: OSI Approved :: Common Development and Distribution License 1.0 (CDDL-1.0)" }, "MPL 1.1": {"License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)"}, "LGPLv2+": { "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)" }, "MPL 2.0": {"License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)"}, "CNRI Python License": { "License :: OSI Approved :: Python License (CNRI Python License)" }, "QPL": {"License :: OSI Approved :: Qt Public License (QPL)"}, "OSL-3.0": {"License :: OSI Approved :: Open Software License 3.0 (OSL-3.0)"}, "MIT": {"License :: OSI Approved :: MIT License"}, "EPL-2.0": {"License :: OSI Approved :: Eclipse Public License 2.0 (EPL-2.0)"}, "CVW": { "License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)" }, "EUPL 1.1": { "License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)" }, "EUPL 1.0": { "License :: OSI Approved :: European Union Public Licence 1.0 (EUPL 1.0)" }, "EPL-1.0": {"License :: OSI Approved :: Eclipse Public License 1.0 (EPL-1.0)"}, "EUPL 1.2": { "License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)" }, "CC0 1.0": {"License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication"}, "NOKOS": {"License :: Nokia Open Source License (NOKOS)"}, "AFL": {"License :: OSI Approved :: Academic Free License (AFL)"}, "LGPLv3+": { "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)" }, "SISSL": { "License :: OSI Approved :: Sun Industry Standards Source License (SISSL)" }, "EFL": {"License :: Eiffel Forum License (EFL)"}, "ZPL": {"License :: OSI Approved :: Zope Public License"}, "ISCL": {"License :: OSI Approved :: ISC License (ISCL)"}, "HPND": { "License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)" }, "OFL-1.1": {"License :: OSI Approved :: SIL Open Font License 1.1 (OFL-1.1)"}, "NPL": {"License :: Netscape Public License (NPL)"}, "LGPL": { "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)", "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)", }, "GPL": { "License :: OSI Approved :: GNU General Public License (GPL)", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", }, "MPL": {"License :: OSI Approved :: Mozilla Public License 1.0 (MPL)"}, "CeCILL-2.1": { "License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)" }, "AGPLv3+": { "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)" }, "UPL": {"License :: OSI Approved :: Universal Permissive License (UPL)"}, "LGPLv3": { "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)" }, "LGPLv2": { "License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)" }, } pyroma-2.6b2/pyroma/distributiondata.py000066400000000000000000000016631355475736200203750ustar00rootroot00000000000000# Extracts information from a distribution file by unpacking in a temporary # directory and then using projectdata on that. import os import shutil import tempfile import zipfile import tarfile from pyroma import projectdata def get_data(path): filename = os.path.split(path)[-1] basename, ext = os.path.splitext(filename) if basename.endswith(".tar"): basename, ignored = os.path.splitext(basename) try: tempdir = tempfile.mkdtemp() if ext in (".bz2", ".tbz", "tb2", ".gz", ".tgz", ".tar"): tarfile.open(name=path, mode="r:*").extractall(tempdir) elif ext in (".zip", ".egg"): zipfile.ZipFile(path, mode="r").extractall(tempdir) else: raise ValueError("Unknown file type: " + ext) projectpath = os.path.join(tempdir, basename) data = projectdata.get_data(projectpath) finally: shutil.rmtree(tempdir) return data pyroma-2.6b2/pyroma/projectdata.py000066400000000000000000000141001355475736200173120ustar00rootroot00000000000000# Extracts information from a project that has a distutils setup.py file. import os import sys import logging from copy import copy from distutils import core class FakeContext(object): def __init__(self, path): self._path = path def __enter__(self): self._old_path = os.path.abspath(os.curdir) if self._old_path in sys.path: sys.path.remove(self._old_path) os.chdir(self._path) if self._path not in sys.path: sys.path.insert(0, self._path) self._path_appended = True else: self._path_appended = False def __exit__(self, exc_type, exc_val, exc_tb): if self._path_appended: sys.path.remove(self._path) sys.path.append(self._old_path) os.chdir(self._old_path) class SetupMonkey(object): used_setuptools = False def distutils_setup_replacement(self, **kw): self._distutils_setup(**kw) def setuptools_setup_replacement(self, **kw): self.used_setuptools = True self._setuptools_setup(**kw) def get_data(self): return self._kw def __enter__(self): import distutils.core self._distutils_setup = distutils.core.setup distutils.core.setup = self.distutils_setup_replacement try: import setuptools self._setuptools_setup = setuptools.setup setuptools.setup = self.setuptools_setup_replacement except ImportError: self._setuptools_setup = None self._kw = {} return self def __exit__(self, exc_type, exc_val, exc_tb): import distutils.core distutils.core.setup = self._distutils_setup if self._setuptools_setup is not None: import setuptools setuptools.setup = self._setuptools_setup # This is a version of distutils run_setup() that doesn't give # up just because Setuptools throws errors if you try to exec it. def run_setup(script_name, script_args=None, stop_after="run"): """Run a setup script in a somewhat controlled environment, and return the Distribution instance that drives things. This is useful if you need to find out the distribution meta-data (passed as keyword args from 'script' to 'setup()', or the contents of the config files or command-line. 'script_name' is a file that will be run with 'execfile()'; 'sys.argv[0]' will be replaced with 'script' for the duration of the call. 'script_args' is a list of strings; if supplied, 'sys.argv[1:]' will be replaced by 'script_args' for the duration of the call. 'stop_after' tells 'setup()' when to stop processing; possible values: init stop after the Distribution instance has been created and populated with the keyword arguments to 'setup()' config stop after config files have been parsed (and their data stored in the Distribution instance) commandline stop after the command-line ('sys.argv[1:]' or 'script_args') have been parsed (and the data stored in the Distribution) run [default] stop after all commands have been run (the same as if 'setup()' had been called in the usual way Returns the Distribution instance, which provides all information used to drive the Distutils. """ if stop_after not in ("init", "config", "commandline", "run"): raise ValueError("invalid value for 'stop_after': %r" % stop_after) core._setup_stop_after = stop_after save_argv = copy(sys.argv) glocals = copy(globals()) glocals["__file__"] = script_name glocals["__name__"] = "__main__" try: try: sys.argv[0] = script_name if script_args is not None: sys.argv[1:] = script_args f = open(script_name) try: exec(f.read(), glocals, glocals) finally: f.close() finally: sys.argv = save_argv core._setup_stop_after = None except Exception: logging.warn("Exception when running setup.", exc_info=True) if core._setup_distribution is None: raise RuntimeError( "'distutils.core.setup()' was never called -- " "perhaps '%s' is not a Distutils setup script?" % script_name ) # I wonder if the setup script's namespace -- g and l -- would be of # any interest to callers? return core._setup_distribution def get_data(path): """ Returns data from a package directory. 'path' should be an absolute path. """ metadata = {} # Run the imported setup to get the metadata. with FakeContext(path): with SetupMonkey() as sm: if os.path.isfile("setup.py"): try: distro = run_setup("setup.py", stop_after="config") metadata = {"_setuptools": sm.used_setuptools} for k, v in distro.metadata.__dict__.items(): if k[0] == "_" or not v: continue if all(not x for x in v): continue metadata[k] = v if sm.used_setuptools: for extras in ["cmdclass", "zip_safe", "test_suite"]: v = getattr(distro, extras, None) if v is not None and v not in ([], {}): metadata[extras] = v except Exception as e: # Looks like setup.py is broken. logging.exception(e) metadata = {} elif os.path.isfile("setup.cfg"): try: from setuptools import config data = config.read_configuration("setup.cfg") metadata = data["metadata"] metadata["_setuptools"] = True except Exception as e: logging.exception(e) else: logging.exception("Neither setup.py nor setup.cfg was found") return metadata pyroma-2.6b2/pyroma/pypidata.py000066400000000000000000000052141355475736200166330ustar00rootroot00000000000000import tempfile import os import logging from pyroma import distributiondata try: from xmlrpc import client as xmlrpclib from urllib import request as urllib except ImportError: import xmlrpclib import urllib def _get_client(): # I think I should be able to monkeypatch a mock-thingy here... I think. return xmlrpclib.ServerProxy("https://pypi.org/pypi") def get_data(project): client = _get_client() # Pick the latest release. releases = client.package_releases(project) if not releases: # Try to find project by case-insensitive name project_name = project.lower() projects = client.search({"name": project_name}) projects = [p for p in projects if p["name"].lower() == project_name] if not projects: raise ValueError( "Did not find '%s' on PyPI. Did you misspell it?" % project ) project = projects[0]["name"] releases = [p["version"] for p in reversed(projects)] release = releases[0] # Get the metadata: logging.debug("Found %s version %s" % (project, release)) data = client.release_data(project, release) # Map things around: data["long_description"] = data["description"] data["description"] = data["summary"] roles = client.package_roles(project) data["_owners"] = [user for (role, user) in roles if role == "Owner"] # Get download_urls: urls = client.release_urls(project, release) data["_pypi_downloads"] = bool(urls) # If there is a source download, download it, and get that data. # This is done mostly to do the imports check. data["_source_download"] = False data["_setuptools"] = None # Mark as unknown, in case no sdist is found. data["_has_sdist"] = False for download in urls: if download["packagetype"] == "sdist": # Found a source distribution. Download and analyze it. data["_has_sdist"] = True tempdir = tempfile.gettempdir() filename = download["url"].split("/")[-1] tmp = os.path.join(tempdir, filename) logging.debug("Downloading %s to verify distribution" % filename) try: with open(tmp, "wb") as outfile: outfile.write(urllib.urlopen(download["url"]).read()) ddata = distributiondata.get_data(tmp) except Exception: # Clean up the file os.unlink(tmp) raise # Combine them, with the PyPI data winning: ddata.update(data) data = ddata data["_source_download"] = True break return data pyroma-2.6b2/pyroma/ratings.py000066400000000000000000000312021355475736200164630ustar00rootroot00000000000000# -*- coding: UTF-8 -*- # This is a collection of "tests" done on the package data. The resut of the # tests is used to give the package a rating. # # Each test has a couple of attributes. Both attributes are checked only after # the test is performed so the test can choose to set the attributes dependning # on the severity of the failure. # # fatal: If set to True, the failure of this test will cause the # package to achieve the rating of 1, which is minimum # weight: The relative importance of the test. # If the test has fatal set to True this is ignored. # # Tests have two methods: # test(data): Performs the test on the given data. Returns True for pass # False for fail and None for not applicable (meaning it will # not be counted). import io import re from docutils.core import publish_parts from docutils.utils import SystemMessage from pyroma.classifiers import CLASSIFIERS, CODE_LICENSES try: stringtypes = (basestring,) except NameError: stringtypes = (str,) LEVELS = [ u"This cheese seems to contain no dairy products", u"Vieux Bologne", u"Limburger", u"Gorgonzola", u"Stilton", u"Brie", u"Comté", u"Jarlsberg", u"Philadelphia", u"Cottage Cheese", u"Your cheese is so fresh most people think it's a cream: Mascarpone", ] class BaseTest(object): fatal = False class FieldTest(BaseTest): """Tests that a specific field is in the data and is not empty or False""" def test(self, data): return bool(data.get(self.field)) def message(self): return ("Your package does not have %s data" % self.field) + ( self.fatal and "!" or "." ) class Name(FieldTest): fatal = True field = "name" class Version(FieldTest): fatal = True field = "version" class VersionIsString(BaseTest): weight = 50 def test(self, data): # Check that the version is a string version = data.get("version") return isinstance(version, stringtypes) def message(self): return "The version number should be a string." PEP386_RE = re.compile( r""" ^ (?P\d+\.\d+) # minimum 'N.N' (?P(?:\.\d+)*) # any number of extra '.N' segments (?: (?P[abc]|rc) # 'a'=alpha, 'b'=beta, 'c'=release candidate # 'rc'= alias for release candidate (?P\d+(?:\.\d+)*) )? (?P(\.post(?P\d+))?(\.dev(?P\d+))?)? $""", re.VERBOSE | re.IGNORECASE, ) PEP440_RE = re.compile( r"""^ v? (?: (?:(?P[0-9]+)!)? # epoch (?P[0-9]+(?:\.[0-9]+)*) # release segment (?P
                                          # pre-release
            [-_\.]?
            (?P(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P[0-9]+)?
        )?
        (?P                                         # post release
            (?:-(?P[0-9]+))
            |
            (?:
                [-_\.]?
                (?Ppost|rev|r)
                [-_\.]?
                (?P[0-9]+)?
            )
        )?
        (?P                                          # dev release
            [-_\.]?
            (?Pdev)
            [-_\.]?
            (?P[0-9]+)?
        )?
    )
    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
$""",
    re.VERBOSE | re.IGNORECASE,
)


class PEPVersion(BaseTest):
    weight = 50
    pep386 = False

    def test(self, data):
        # Check that the version number complies to PEP-386:
        version = data.get("version")
        self.pep386 = False
        if PEP386_RE.search(str(version)) is not None:
            # Matches the old PEP386
            self.weight = 10
            self.pep386 = True
        match = PEP440_RE.search(str(version))
        return match is not None

    def message(self):
        if self.pep386:
            return "The package's version number complies only with PEP-386 and not PEP-440."
        return "The package's version number does not comply with PEP-386 or PEP-440."


class Description(BaseTest):
    weight = 100

    def test(self, data):
        description = data.get("description")
        if not description:
            # No description at all. That's fatal.
            self.fatal = True
            return False
        self.fatal = False
        return len(description) > 10

    def message(self):
        if self.fatal:
            return "The package had no description!"
        else:
            return "The package's description should be longer than " "10 characters."


class LongDescription(BaseTest):
    weight = 50

    def test(self, data):
        long_description = data.get("long_description", "")
        if not isinstance(long_description, stringtypes):
            long_description = ""
        return len(long_description) > 100

    def message(self):
        return "The package's long_description is quite short."


class Classifiers(FieldTest):
    weight = 100
    field = "classifiers"


class ClassifierVerification(BaseTest):
    weight = 20

    def test(self, data):
        self._incorrect = []
        classifiers = data.get("classifiers", [])
        for classifier in classifiers:
            if classifier not in CLASSIFIERS:
                self._incorrect.append(classifier)
        if self._incorrect:
            return False
        return True

    def message(self):
        err = "\n".join(self._incorrect)
        return "Some of your classifiers are not standard classifiers:\n" + err


class PythonVersion(BaseTest):
    def test(self, data):
        self._major_version_specified = False

        classifiers = data.get("classifiers", [])
        for classifier in classifiers:
            parts = [p.strip() for p in classifier.split("::")]
            if parts[0] == "Programming Language" and parts[1] == "Python":
                if len(parts) == 2:
                    # Specified Python, but no version.
                    continue
                version = parts[2]
                try:
                    float(version)
                except ValueError:
                    # Not a proper Python version
                    continue
                try:
                    int(version)
                except ValueError:
                    # It's a valid float, but not a valid int. Hence it's
                    # something like "2.7" or "3.3" but not just "2" or "3".
                    # This is a good specification, and we only need one.
                    # Set weight to 100 and finish.
                    self.weight = 100
                    return True

                # It's a valid int, meaning it specified "2" or "3".
                self._major_version_specified = True

        # There was some sort of failure:
        if self._major_version_specified:
            # Python 2 or 3 was specified but no more detail than that:
            self.weight = 25
        else:
            # No Python version specified at all:
            self.weight = 100
        return False

    def message(self):
        if self._major_version_specified:
            return (
                "The classifiers should specify what minor versions of "
                "Python you support as well as what major version."
            )
        return "You should specify what Python versions you support."


class Keywords(FieldTest):
    weight = 20
    field = "keywords"


class Author(FieldTest):
    weight = 100
    field = "author"


class AuthorEmail(FieldTest):
    weight = 100
    field = "author_email"


class Url(BaseTest):
    weight = 20

    def test(self, data):
        return bool(data.get("url")) or bool(data.get("project_urls"))

    def message(self):
        return (
            "Your package should have a 'url' field with a link to the "
            "project home page, or a 'project_urls' field, with a "
            "dictionary of links, or both."
        )


class Licensing(BaseTest):
    weight = 50

    def test(self, data):
        license = data.get("license")
        classifiers = data.get("classifiers", [])
        licenses = set()
        for classifier in classifiers:
            parts = [p.strip() for p in classifier.split("::")]
            if parts[0] == "License":
                # license classifier exist
                licenses.add(classifier)

        if not license and not licenses:
            self._message = (
                "Your package does neither have a license field "
                "nor any license classifiers."
            )
            return False

        if license in CODE_LICENSES:
            if not CODE_LICENSES[license].intersection(licenses):
                self._message = (
                    "The license '%s' specified is not listed in "
                    "your classifiers." % license
                )
                return False

        return True

    def message(self):
        return self._message


class DevStatusClassifier(BaseTest):
    weight = 20

    def test(self, data):
        classifiers = data.get("classifiers", [])
        for classifier in classifiers:
            parts = [p.strip() for p in classifier.split("::")]
            if parts[0] == "Development Status":
                # license classifier exist
                return True
        return False

    def message(self):
        return (
            "Specifying a development status in the classifiers gives "
            "users a hint of how stable your software is."
        )


class SDist(BaseTest):
    weight = 100

    def test(self, data):
        if "_has_sdist" not in data:
            # We aren't checking on PyPI
            self.weight = 0
            return None
        return data["_has_sdist"]

    def message(self):
        return (
            "You have no source distribution on the Cheeseshop. "
            "Uploading the source distribution to the Cheeseshop ensures "
            "maximum availability of your package."
        )


class ValidREST(BaseTest):

    weight = 50

    def test(self, data):
        content_type = data.get("long_description_content_type", None)
        if content_type in ("text/plain", "text/markdown"):
            # These can't fail. Markdown will just assume everything
            # it doesn't understand is plain text.
            return True

        # This should be ReStructuredText
        source = data.get("long_description", "")
        stream = io.StringIO()
        settings = {"warning_stream": stream}

        try:
            publish_parts(
                source=source, writer_name="html4css1", settings_overrides=settings
            )
        except SystemMessage as e:
            self._message = e.args[0]
        errors = stream.getvalue().strip()
        if not errors:
            return True

        self._message = "\n" + errors
        return False

    def message(self):
        return "Your long_description is not valid ReST: " + self._message


class BusFactor(BaseTest):
    def test(self, data):
        if "_owners" not in data:
            self.weight = 0
            return None

        if len(data.get("_owners", [])) == 1:
            self.weight = 100
            return False

        if len(data.get("_owners", [])) == 2:
            self.weight = 50
            return False

        # Three or more, that's good.
        self.weight = 100
        return True

    def message(self):
        return "You should have three or more owners of the project on PyPI."


ALL_TESTS = [
    Name(),
    Version(),
    VersionIsString(),
    PEPVersion(),
    Description(),
    LongDescription(),
    Classifiers(),
    ClassifierVerification(),
    PythonVersion(),
    Keywords(),
    Author(),
    AuthorEmail(),
    Url(),
    Licensing(),
    SDist(),
    ValidREST(),
    BusFactor(),
    DevStatusClassifier(),
]


def rate(data):
    if not data:
        # No data was gathered. Fail:
        return (0, ["I couldn't find any package data"])
    fails = []
    good = 0
    bad = 0
    fatality = False
    for test in ALL_TESTS:
        res = test.test(data)
        if res is False:
            fails.append(test.message())
            if test.fatal:
                fatality = True
            else:
                bad += test.weight
        elif res is True:
            if not test.fatal:
                good += test.weight
    # If res is None, it's ignored.
    if fatality:
        # A fatal test failed. That means we give a 0 rating:
        return 0, fails
    # Multiply good by 9, and add 1 to get a rating between
    # 1: All non-fatal tests failed.
    # 10: All tests succeeded.
    return (good * 9) // (good + bad) + 1, fails
pyroma-2.6b2/pyroma/testdata/000077500000000000000000000000001355475736200162555ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/complete/000077500000000000000000000000001355475736200200655ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/complete/README.txt000066400000000000000000000024461355475736200215710ustar00rootroot00000000000000Complete
========

This is a test package for pyroma that is supposed to have a complete
set of metadata and also runnable tests. It should score the maximum possible
on package tests.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at
dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget
velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam
nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla
nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin
orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing
velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac
ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus
nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis
interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit
ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et
dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed
ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit
posuere id dignissim massa molestie.
pyroma-2.6b2/pyroma/testdata/complete/complete/000077500000000000000000000000001355475736200216755ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/complete/complete/__init__.py000066400000000000000000000000731355475736200240060ustar00rootroot00000000000000import zope.event

# Stop pyflakes complaining:
zope.event
pyroma-2.6b2/pyroma/testdata/complete/complete/tests.py000066400000000000000000000002131355475736200234050ustar00rootroot00000000000000import unittest


class PackageDataTest(unittest.TestCase):
    def test_test(self):
        # Stop pyflakes from compaining:
        pass
pyroma-2.6b2/pyroma/testdata/complete/setup.cfg000066400000000000000000000000661355475736200217100ustar00rootroot00000000000000[egg_info]
tag_build = .dev1
tag_svn_revision = false
pyroma-2.6b2/pyroma/testdata/complete/setup.py000066400000000000000000000022461355475736200216030ustar00rootroot00000000000000from setuptools import setup, find_packages

version = "1.0"

with open("README.txt", "rt") as readme:
    long_description = readme.read()

setup(
    name="complete",
    version=version,
    description="This is a test package for pyroma.",
    long_description=long_description,
    classifiers=[
        "Development Status :: 6 - Mature",
        "Operating System :: OS Independent",
        "Programming Language :: Python :: 2.6",
        "Programming Language :: Python :: 2.7",
        "Programming Language :: Python :: 3.1",
        "Programming Language :: Python :: 3.2",
        "Programming Language :: Python :: 3.3",
        "License :: OSI Approved :: MIT License",
    ],
    keywords=["pypi", "quality", "example"],
    author="Lennart Regebro",
    author_email="regebro@gmail.com",
    url="https://github.com/regebro/pyroma",
    project_urls={"Source Code": "https://github.com/regebro/pyroma"},
    license="MIT",
    packages=find_packages(exclude=["ez_setup", "examples", "tests"]),
    include_package_data=True,
    install_requires=["zope.event"],
    tests_require=["six"],
    setup_requires=["setuptools"],
    zip_safe=True,
    test_suite="complete",
)
pyroma-2.6b2/pyroma/testdata/custom_test/000077500000000000000000000000001355475736200206265ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/custom_test/minimal/000077500000000000000000000000001355475736200222545ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/custom_test/minimal/__init__.py000066400000000000000000000000001355475736200243530ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/custom_test/setup.cfg000066400000000000000000000000651355475736200224500ustar00rootroot00000000000000[egg_info]
tag_build = .dev1
tag_svn_revision = true
pyroma-2.6b2/pyroma/testdata/custom_test/setup.py000066400000000000000000000011101355475736200223310ustar00rootroot00000000000000from setuptools import setup, find_packages
from setuptools.command.test import test

version = "0.0foo"


class CustomTest(test):
    pass


setup(
    name="minimal",
    version=version,
    description="Test",
    classifiers=[],
    keywords="",
    author="",
    author_email="",
    url="",
    license="",
    packages=find_packages(exclude=["ez_setup", "examples", "tests"]),
    include_package_data=True,
    install_requires=[
        # -*- Extra requirements: -*-
    ],
    entry_points="""
      # -*- Entry points: -*-
      """,
    cmdclass={"test": CustomTest},
)
pyroma-2.6b2/pyroma/testdata/distributions/000077500000000000000000000000001355475736200211575ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/distributions/complete-1.0.dev1.tar000066400000000000000000000740001355475736200246320ustar00rootroot00000000000000complete-1.0.dev1/0000775000175000017500000000000013337616630015456 5ustar  lregebrolregebro00000000000000complete-1.0.dev1/PKG-INFO0000664000175000017500000000422513337616630016556 0ustar  lregebrolregebro00000000000000Metadata-Version: 1.1
Name: complete
Version: 1.0.dev1
Summary: This is a test package for pyroma.
Home-page: https://github.com/regebro/pyroma
Author: Lennart Regebro
Author-email: regebro@gmail.com
License: MIT
Description-Content-Type: UNKNOWN
Description: Complete
        ========
        
        This is a test package for pyroma that is supposed to have a complete
        set of metadata and also runnable tests. It should score the maximum possible
        on package tests.
        
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at
        dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget
        velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam
        nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla
        nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin
        orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing
        velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac
        ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus
        nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis
        interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit
        ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et
        dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum
        dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed
        ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit
        posuere id dignissim massa molestie.
        
Keywords: pypi,quality,example
Platform: UNKNOWN
Classifier: Development Status :: 6 - Mature
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.1
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Classifier: License :: OSI Approved :: MIT License
complete-1.0.dev1/setup.cfg0000664000175000017500000000010413337616630017272 0ustar  lregebrolregebro00000000000000[egg_info]
tag_build = .dev1
tag_svn_revision = false
tag_date = 0

complete-1.0.dev1/complete/0000775000175000017500000000000013337616630017266 5ustar  lregebrolregebro00000000000000complete-1.0.dev1/complete/__init__.py0000664000175000017500000000007213335100144021360 0ustar  lregebrolregebro00000000000000import zope.event
# Stop pyflakes complaining:
zope.event
complete-1.0.dev1/complete/tests.py0000664000175000017500000000021413335100144020761 0ustar  lregebrolregebro00000000000000import unittest


class PackageDataTest(unittest.TestCase):

    def test_test(self):
        # Stop pyflakes from compaining:
        pass
complete-1.0.dev1/README.txt0000664000175000017500000000244613335100144017144 0ustar  lregebrolregebro00000000000000Complete
========

This is a test package for pyroma that is supposed to have a complete
set of metadata and also runnable tests. It should score the maximum possible
on package tests.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at
dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget
velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam
nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla
nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin
orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing
velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac
ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus
nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis
interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit
ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et
dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed
ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit
posuere id dignissim massa molestie.
complete-1.0.dev1/complete.egg-info/0000775000175000017500000000000013337616630020760 5ustar  lregebrolregebro00000000000000complete-1.0.dev1/complete.egg-info/PKG-INFO0000664000175000017500000000422513337616630022060 0ustar  lregebrolregebro00000000000000Metadata-Version: 1.1
Name: complete
Version: 1.0.dev1
Summary: This is a test package for pyroma.
Home-page: https://github.com/regebro/pyroma
Author: Lennart Regebro
Author-email: regebro@gmail.com
License: MIT
Description-Content-Type: UNKNOWN
Description: Complete
        ========
        
        This is a test package for pyroma that is supposed to have a complete
        set of metadata and also runnable tests. It should score the maximum possible
        on package tests.
        
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at
        dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget
        velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam
        nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla
        nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin
        orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing
        velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac
        ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus
        nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis
        interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit
        ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et
        dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum
        dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed
        ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit
        posuere id dignissim massa molestie.
        
Keywords: pypi,quality,example
Platform: UNKNOWN
Classifier: Development Status :: 6 - Mature
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.1
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Classifier: License :: OSI Approved :: MIT License
complete-1.0.dev1/complete.egg-info/zip-safe0000664000175000017500000000000113337432443022406 0ustar  lregebrolregebro00000000000000
complete-1.0.dev1/complete.egg-info/top_level.txt0000664000175000017500000000001113337616630023502 0ustar  lregebrolregebro00000000000000complete
complete-1.0.dev1/complete.egg-info/requires.txt0000664000175000017500000000001313337616630023352 0ustar  lregebrolregebro00000000000000zope.event
complete-1.0.dev1/complete.egg-info/SOURCES.txt0000664000175000017500000000037613337616630022652 0ustar  lregebrolregebro00000000000000README.txt
setup.cfg
setup.py
complete/__init__.py
complete/tests.py
complete.egg-info/PKG-INFO
complete.egg-info/SOURCES.txt
complete.egg-info/dependency_links.txt
complete.egg-info/requires.txt
complete.egg-info/top_level.txt
complete.egg-info/zip-safecomplete-1.0.dev1/complete.egg-info/dependency_links.txt0000664000175000017500000000000113337616630025026 0ustar  lregebrolregebro00000000000000
complete-1.0.dev1/setup.py0000664000175000017500000000243413337616156017176 0ustar  lregebrolregebro00000000000000from setuptools import setup, find_packages

version = '1.0'

with open('README.txt', 'rt') as readme:
    long_description = readme.read()

setup(name='complete',
      version=version,
      description='This is a test package for pyroma.',
      long_description=long_description,
      classifiers=['Development Status :: 6 - Mature',
                   'Operating System :: OS Independent',
                   'Programming Language :: Python :: 2.6',
                   'Programming Language :: Python :: 2.7',
                   'Programming Language :: Python :: 3.1',
                   'Programming Language :: Python :: 3.2',
                   'Programming Language :: Python :: 3.3',
                   'License :: OSI Approved :: MIT License',
                   ],
      keywords=['pypi', 'quality', 'example'],
      author='Lennart Regebro',
      author_email='regebro@gmail.com',
      url='https://github.com/regebro/pyroma',
      project_urls={'Source Code': 'https://github.com/regebro/pyroma'},
      license='MIT',
      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
      include_package_data=True,
      install_requires=['zope.event'],
      tests_require=['six'],
      setup_requires=['setuptools'],
      zip_safe=True,
      test_suite='complete',
      )
pyroma-2.6b2/pyroma/testdata/distributions/complete-1.0.dev1.tar.bz2000066400000000000000000000046721355475736200253360ustar00rootroot00000000000000BZh91AY&SYәpߘHo `>!AASFU (*@dzih4@C@z0MFFM
h20h4i4&	ɡ
F
2d4244ѦCA!LDbi2SM BM	ilzMM#	4M= }¿=?74'E`, &B
~u)I+Ef9M;-Zll`b xdd¡q}<[qJOac z;	@E;ŏ1x}Qީd'P/¸^r?Mt赢OU*"eW!ZL|0
0V(z@#(0%˓q}xa%L5jڗ6هcv
~fѳWGٖF
]Ja(@ц\nіjlpB}25pnW48k߳;8L9VvXjžM6ph$",%ť2Pŗb(Y:?I#g0gU4I-Y0*5֌gGnrP7{ShHU~.BlɗWe[`wNVGWpptӹF(Ձqn(u5Yg78yN!Aj0.e|3ԮTP+S+0cDDDDD+"Ƹ1:F	j7/#$:p;^BI@+>٣-<4aMڷlSY_գD~X&e+Mgre0}8/{Mo3atth;aH؇CFC69!{6|&ma6/,$50"7:*
gh%3g!_35O%`{	yDW]h.$0#G
^{a_(^7zP-0-a؅y,9 BCzӭ6d&}
s0@^>AYOY0͒Lu+ `ma!qۑWpIT՛[L$b_^|N,ѻ*bjݱ
H-!Ih4aѠNMfOh1tM8t@C;|~_wS/,vwڰ0Hw2(PS}hww2gԘv

Ҵّ0`nՖthjj٤5dbũ,e d6~]qe@Qzdv59x;<604dhb7㐕9yAWV.˓+1t5jـaԔ0aOC6x?:{sx2?4tvxXt>.Aa.S/sxe>;D:[y[C#("v}mqɛM!XAm`QTF:lH
Zs.pyroma-2.6b2/pyroma/testdata/distributions/complete-1.0.dev1.tar.gz000066400000000000000000000042141355475736200252510ustar00rootroot00000000000000[dist/complete-1.0.dev1.tar[o8g%m+]65ٽ`$U"|xFu{!lP3ETv7]uOG1;v6%~/.jV)zGC+7ID4iBbOtK	mJݘ$!r=%S4UR~&
s!!]KHh;ŻXj饹pӂyoK!'rNysqM	_-=)W8Ň[PTgkuvbϗ.ycg>@uwDʤP4-`IV(A!)dG@b%@]LYTR8
r΢
^+pH,U8>1^1
(tU"CM@"223
n(RklܙGl'd" M҂Q),b.gmUJFr]H(쪘ݨ"Y "&7CpĦX&	IbX=rrvz2qj4XԂĽ3KƮJʠ8iΨjM,I E.oHfkZ`AtHk$\b?'m>=e䛜+ߝ;cog_w8?";"VPԃgwZ0g<dyࣺ;K?@o/D$Jh^EúxyqIB~~+Z 8W#TvW3ݽQvU=1YW~}+?w?YCMZe.2c<$K;*v,[V~Fb;_43o!3QϠrL}PM06E/V7XD:)	1(I47ge<753e'}ݘdBNlĿ5{e~ߜ-xpyroma-2.6b2/pyroma/testdata/distributions/complete-1.0.dev1.zip000066400000000000000000000123451355475736200246520ustar00rootroot00000000000000PKM#!complete-1.0.dev1/PKG-INFOUnF}Wd

6q&}khv.{F-;}hc%9GJ_9&zR;
3/Ξj_/^*:zI"|eNR[[.~w;Rwu+"oy)ycG윊Ol,gPuqǩ2z^z!ӟnsin縔w*׈TB5eO;go$7d'
H9M$O`Jj>Sb4G1Y]l*I{Bט1bIBB's.c9HJKԋ-`cΒ}l	X	F6ddSLKUSYtjK%:e	
ϰzIR-J^oE@ɈIYŔiVEՋ$ӵ=c|ńUf&bv0Tl&Twud8jAw_kJ7X9J%-n4203Ӝz6vҝw܃oTf˙o9BBaXQRAصKw1I#id[*UQU`#U
gd596+Qة9f4K:gUK7譣,2TTfLF`mE
v2+;4R&9f-^S6#'X41WiT"u!+&G`8Gm`Hn'LIeyfPȹaprw^YT1z;q$'jS8&[3_.QW8<RRdgg>N 
֡Ëg2m;n
d#_zbꮣOG\D~
򕧗CQRC^i0.ŸFemMxPn[Qq~zwƏ{3>;Ec}|PKMK=Dcomplete-1.0.dev1/setup.cfgNMOKˏ*ILO*IQUKI-3eg%sS)%@..PK`MRj&complete-1.0.dev1/README.txtTIA)|V߀b}޿I,j_UnyO`G78JZtqoso_.'_.򻖄7ٲ&zkҩ\(Is P96S/oBiD=6>8.
uDl״pҭ]yW}',ڻR'bؼ׬K=h-MYj!EPO%#Q‰*ݭE0B%hcN+E;bdרMep2܅4Ltਣ}
~D`4q"MԠd0)`V,xR+&rz!E10М1m
W镧̍Y
t;MgHD0vAyK0~kԀfɺ)mE!+.*`gf8(pYm9ޑ+ZVib꥝{EݚfhC=/^'Q:]]9ad[54rgF?ɿ}9vcR=$7qkLq2?PKmM[complete-1.0.dev1/setup.pyT]k0}oJ s:V>ZbTjK>8c}?X{ϹW:hYA딕0K%mv&"KK_X&v
(+7n y]vod̀F8yI5WiqF(+T@dR#BJ[`Ec6RIYӽӂ7ܗ?-Daaeuf3/={{Y.rXUb@+zgeYY肉܅xCe^B?~oU|q'OQlÍRZ0|
mcS՛YתR<\W
n0=ג4%y;9f!UbO8n?zo_PK`M7d#3:&complete-1.0.dev1/complete/__init__.py-/*Q/HK-K+RV./P(LIN-VH-IKBRPK`M/*k n#complete-1.0.dev1/complete/tests.pyE
@}e#d·(N103L*vǻ&w1'w2tc]D5l2ɱ/ꄇ7~bMqoTS]O:PKM#!,complete-1.0.dev1/complete.egg-info/PKG-INFOUnF}Wd

6q&}khv.{F-;}hc%9GJ_9&zR;
3/Ξj_/^*:zI"|eNR[[.~w;Rwu+"oy)ycG윊Ol,gPuqǩ2z^z!ӟnsin縔w*׈TB5eO;go$7d'
H9M$O`Jj>Sb4G1Y]l*I{Bט1bIBB's.c9HJKԋ-`cΒ}l	X	F6ddSLKUSYtjK%:e	
ϰzIR-J^oE@ɈIYŔiVEՋ$ӵ=c|ńUf&bv0Tl&Twud8jAw_kJ7X9J%-n4203Ӝz6vҝw܃oTf˙o9BBaXQRAصKw1I#id[*UQU`#U
gd596+Qة9f4K:gUK7譣,2TTfLF`mE
v2+;4R&9f-^S6#'X41WiT"u!+&G`8Gm`Hn'LIeyfPȹaprw^YT1z;q$'jS8&[3_.QW8<RRdgg>N 
֡Ëg2m;n
d#_zbꮣOG\D~
򕧗CQRC^i0.ŸFemMxPn[Qq~zwƏ{3>;Ec}|PK2M2,complete-1.0.dev1/complete.egg-info/zip-safePKM1	1complete-1.0.dev1/complete.egg-info/top_level.txtK-I-IPKMPk
0complete-1.0.dev1/complete.egg-info/requires.txt/HK-K+PKMp'n?~/complete-1.0.dev1/complete.egg-info/SOURCES.txtuA
0}QDut16b= .n70ZJHމʤ0j}WȜ?	焏6n#u-U8 YϹ0qs"pC(Ó''PKM28complete-1.0.dev1/complete.egg-info/dependency_links.txtPKM#!complete-1.0.dev1/PKG-INFOPKMK=Dcomplete-1.0.dev1/setup.cfgPK`MRj&qcomplete-1.0.dev1/README.txtPKmM[-complete-1.0.dev1/setup.pyPK`M7d#3:&z	complete-1.0.dev1/complete/__init__.pyPK`M/*k n#	complete-1.0.dev1/complete/tests.pyPKM#!,
complete-1.0.dev1/complete.egg-info/PKG-INFOPK2M2,complete-1.0.dev1/complete.egg-info/zip-safePKM1	1complete-1.0.dev1/complete.egg-info/top_level.txtPKMPk
0Tcomplete-1.0.dev1/complete.egg-info/requires.txtPKMp'n?~/complete-1.0.dev1/complete.egg-info/SOURCES.txtPKM28zcomplete-1.0.dev1/complete.egg-info/dependency_links.txtPKpyroma-2.6b2/pyroma/testdata/distributions/distribute-0.6.15.tar.gz000066400000000000000000010645171355475736200252270ustar00rootroot00000000000000׀Mdistribute-0.6.15.tar<={vQ;|wxU䊱WS>c?}%KoމxI{uο~|>Vpw]q/	/y't*S֍68e$lԟ!ٸS#i6gVie;*Ɗ'b\PV%u$,/4T3NעRLX".e 
IR2%ǂ5p'\%l*I
g3@92Kˉ©L* e-\o@Mpdc3} :R.MHDqrZ2Eu
HV0T~pP^D@<*fi	῱bRRu%B8Ndɉh*]gYSUQHUjǘ^YP1]hU3q2{HF¡xiX
BY4=5ĬFbLJ	XPI`m){DiHKOsԝHtl,*M|AhBOoN
ط;TZqr*.k
AM9Je҅e3DFB)	NlLK%-@4xJ$p(HZrx\!q1%n$JqMy@5;t'caTN);5&Ր2;	gN`-rڝG$_)b5yI:Owx>rM֥ŞacAKs.8H*&@xcj
>ږgyN@by]L3DֵqԮ"yd
*{ȬY
'
lxbfg.faGN%Źw
tj#+H":/!{F:Cr1tR3h=%*
Jeۛx"(}i ;cIeL9-t<)0ţҞ@[ќF0.0a4%dEo4?Dݨ39t7#j\SYlZ=Rx,=!x֡w0İhܠ&ܞӑEEɓ Z
sO"9q [OK2p-EZCa?'AEG/
^C̡j`Ab1l}FI[P 
B$8@: %![(1J	t=sOP!4xj6ؔA6з~
?"&V;ek{~)'rŕ[1
bfQ\l@9dSRd|"OOC2cp	\nY +?2ECӉ֍26}k)v
U@}N/?#vw
5,ZMTq5߼)r,xS'pH@ř]nGKpƿ-low#8Y~2,I>V{v1=^,E
)>(cF?h%:߬e*C|SM5p`?Ɍ&QB8$AưQp.N	j"TmF!f_U)"h02+@a?2y=~n0B&jV!i}Sy̐h|Ԓ
5VW.3&Md
jsʨ('aO2q%/mx~wSuo5i#V'.ܪO݈Ne}m/.cR]^|~t{^{<[:[V[q]WcD||{YU
IJY6d$,Ucw#^͑F1uuq
N1;LDhkbo*d
h+ֻoC\<)MlD0K*5yY+"Ko|V/+[l oc$5چ]՘ t,-$ԏ7#XdժGPDo}:aHϓ9jf'4j`J%v`%&SyZG++[C554eJ|j!\
,sֱ016e* Q
<ߥ "DNHcRHxVsDCX[lmfj-r5slTS>S!Ty2b?Y[2(H@$ӐMrFhw6a*Pw+#y*8I.+!zTe
8f*xa}VRYNU-oJF4>DB"
|4P6d222ʎl#(qGo'%M]	n7H?uPH>3f)𠁈:LA]*ptjQ)K~cĵ|ҖnLW0unA8cU` XJ4D_&|ʶћSQ3k'X] \_ֽJ@p~f6BҼ"եV试׉]8iW*aO$lqk93+6\\1"sGoy0i>fVRi9 +IBi8ߍxRM>(Ea~zc+`yFO)@@ԳM8)w3Fr5A;
LǮ=2GQH0Ǹ|Bg_x2.WQs}JQ6D v/\Hz[hH=8:L
o]\~7Yxމ8ExϡUiS6E<4!$SwrI9$uvC`sA9oM2;
"z*uUanܬOC\:ہr@~aF,&UR"ǃ<8Glށ0ijJ|TJ	;;b~xfyaAލⴉMy9>@~dgq
	y$zs0q2Av|=bÕo[@~tޮu0Fɍu@)6{Q䔝祂36DkI-ÓZ~9#!jYbj6
ĐhRN1=r(͗;qdFY^]^_+CDžn91].ZAp>"'l
fnmlY$&z	?1I2`[%pb䪕VXn
&uf~|ac22$׶Ee+btĮ8dHpP %oٟ)~)q.[ƑUk]6c
_[KaBS5G`*K>&m
7܂КL7d옖Ɍ峾]߂3HԸM]>TkX˺lRIj;m/wk%۪
Wqf9DOv7߮n.//x:8_Op7:,n$S]]`6cѰbzXnp:L5߾Oyw攧% 6aHgdccd@̐\][3;-5T({@sq48M0h<l]:[c)Ǚz^KjD]~r|qB ip*EMӳH=:koewRsA"LQ`hl$xfL=pm:LʶT1t5(N/Z3#S[a8{&]h5"!QD`x j'4ME_UlH}22j#0c0)AaW6iGtv%3,@B1ffpކo𴁥EThN˻وC>99o{2NbS|E
uckr3.M#RG@Gfz޻v7
yR{HEfG2fiFSWo(1Ms6٣QlPjFIqMTah;ZFSԯٍL9/suU:˂e:nXݘ/!\纡ge@/h|ZC1%@RTlQ^;
uv]Ȍ0m2"{Z	\H?J)/u<ߚZ&;pT\(=zDƤh+FbaCIϴ7&em]gߵi"@J.oRPt YFc"1s}/D!-k0XVw
[Ϸ6Wn)33qxhSÛX]7zENvWJZMfu6F

U90ֿ+ƫ7KS-ޔg+St
|uӖMO7y1mՒ,_j#ES^d

#^ſ݉[.ao	r)5'hfxѧyWoU=$Yh5ދLO>w].Gsn~f_>ߟ$F1N?dG(8}|:՟矔RU?Z߻}?}p{w}ާKT9T?$WZ^|0'dU>igUyx"E\g',vǐ%Acۖ'BDs4Xv,<=ѿ$>‰{XC͋lG7:k8KST^:[ }*DJ,gxߧ$$NTH7	ü_x]_qY:O4WG.&J̍DՅ8Ub>z̑{`D K	2yc퍇wFeH^
Ǟy`
Ksr&jb4}_#8ӁO׫94.8*-7Lqb%`4|I'n?IdOIޟkݻG>~?؅;xX?n+.!?5}8]L̠M}Hk4#yn|+'}kBj$3Z
Gx!c'oT9D7rcX"[oV-狩k8zk9sMh( W{$'ՙ	, 2$jK)f_X&5%}LvhjyvϗŴiu?=y
!Foywc2x][ӞM|CTv%}cȻνNT=tޒ3vd[Jw/\pk`a}
7ޣ(]j
kG}ʕn%wb4
O9>+ʩ["8=\Ona)Ć;mlwO4&m_YFw>|~~~~~~~~~~~wدw|O/|!3OQXꉯkOR˛
_,6
԰7p8@a5AXW%V8O`Z47+]mb受D
r,sFuu%HIzKDӜ% $	pf
iйi{j?!=9IS>_۪'LYqlR)w̠YTYXnP[w!rY_氿S9ʃs	ɸIPP!,r^f;* v
OjK_WaZQCg\{܏O0I+V2Hp0B#j"P"{_+W!#/0)u~Fq9KWOa<7Zg#,eccƚ7ʹh'#82|(rj[{7ZrCD]ۣt}UHcЈ`&+_{N_
vr])aJe^	n@6ʹz/p.2
YߚacuRM1hXk>#hA^y“/	f[Ό?ܹS< BJ3,bL% e,YvJcWI}$)~:n/
Pg0uHٴAL^134K;XGV1Mo>
HĚ`q*2ԭrj6k/iTJRŷ,*?Ѹr[
ыxύ8n;YwP7IO=jyBtȯTq]Lv|E{f=nBT/w+gz4an٬lDѯ 틬ZϷQՋÏׯa=N[rqa
܄^a*NBB='E9idwER=-B.^c鸭LCԍFU%<\u}?\Mԯ떹afuu}>Xf*v-gJrT՗xZV{~K
xϓ0zzX/6)-f0kG<9K,Fh
H|hxm@:b3oU0nO2Y"٣~r4!E~qȞ|=#"q<>w#sD>36bhj޾%=9[lM*PMl

Y&\Ӥ܄Wz^gEv3)v^h{z|k*xzvFoW/HxM˽_q
QN,MXBtv̊@
/r#Rrt-ЍQzƪu:S.bJ!آ$]+jb3215R)E~ENbP]eT" OkV?$yYVp~>/~\=zpyIeWł#1W`f3iْm}t]p72GG;|[9?~NNPWAJ{JiHRA8WzilKIQ8=>l-0\,HSg"8!jw
rG"/Z
L6]#*'UgF0EN7^k~ec9p^ݍ
)x߳PkNND⹋"ŔNA̢Vߢ}w&blHo)JI#_b=1;mW.Ujw1߻p_vJ_9bT_u3+\mMSv)ǷvK!VL,->'dr%u=&yi%bSit("amV|	hx6")[#,*hRᄑ'
l)(E&r(L~i)ԝ(礇	!-JV|`()Y#UoBwo*aBRsGwޡG2$WZLv
"TӖaezړs^RSh?Oh\U3vfmj'D#%L)sJ?]eۈII]Gza$tvʕ$Նbj)#i.}h%*ChL7u7Q
%Zc# *$	iY9%r5.O~x9(E!Ua
9sx7ݻ{QႏN4}^ſv.oY01ׇ}Ԇnv{>ܡEY@97\lBY`t;w$IyGLD#`pv_Oۼ㟝ň頎ZJbTLE(s]Qdek޾~ǿnW+qhUe6"
ɏ80?Y^Epso>"5}%r%b3129l\AE(n>畅Ȱ*mj6jB3}I?e5JOA(~1v"J%oQF
+j"?OyBDfH\o8n;x8tns!"T#plO4\fF,oOWed+R6 ?y#J_YVStF?0")2g鸒BQ<2obj׵_ToBa郆FX;{8S6uLÅ,~d
iKޛ3bSĭM4[H{揂aK]tt
4$NB.
AvZȀ,((wrbU^1BPz7+VVN	%+4Jga-;h|b/fr1%@	%*QD
NcrN!'s&
C8cf6cޟcpov[NpdYx/?&pOS9'7/o_&OYqOY;'G"+Izf[|
+~ͬPksooz<}D>MyB;E0W7mߡt3O_-Bzl6Rڱ*^?eKE8ڀ?U۝?۬&,'`B+_srގlFX?5kz#&zEW߬^Dg'k2>woOף:1	lk՜Gwoߡ?a
>EH,f5ۉ&o+kY%Iq("9{z
-ިE%̋ل-F/^H'@ɾgnL$S(eSM7zvR)9+@=>GҮhuMO#lG̏d(҉ש;ث;ht,m2?$a u;wO/__o7%*}wCţw-bNwȃ"!)}||#H_]GɀۨW94"囷_yճ᯸đVʘ3 
4 rY:bsnC夌#vYA	ҿlJ,YU#*98"q`^.8~x탓7sm契u5	ϛ\oVOUeluxH0F_KE{,β	NT.dN;i?=%@!#+I|H&+#
-VXy=^rDxx{x}]#ҳG#F#F#|9ʧ)޻(}??yTJY˝<$Kbq;v;-|@E!2Bkp*j3p:ȷ*VL7sSD_g9]ZJA	s/"
Zo%	 }1ucW?|YT>?(x¿jKФ\WGh
nc9Acb`sȊҾ6 5Kh	g4ZjO}whyC)v-V()^>KdvwU}C z˃ڗ~5ϟ=Y51eiH&?-"J.x94C.Fn85m	v6enjØ̏;z'k=oYƨ7or44#-*va's	.1.&zxugŪZGDyp<<: a0cinokm*3Fv[XeOksuhcq߶ߩw_>,R*p'p9lj.U#?p,*ݫ[%+Ed-ߔ?2®(aYUGb1+7bL@K 44!H8Nm]&,
5
Xn!T\UU%#7FDB3M.Ōx+B<䉪7
Q@'D8ʂBt/Rj!NY1RYf/dk3|)q@3dBW4J;	f}+9ouR!;VB@	>
U>eiH%0AsҞa)t+k;:%_ƀ<*FgU
m).P>'W*d$4J_곱
o'!Ͽ{5DŽ)w'Br$Oy7H`f^i
pSɓsպ{O#L7׬@Ozuc~:8H}4?Y9hUz߼x)F57_Շ$SD0o*OuOO@K	Dcc>S>gχ@X>.YCdwOf;R߸kJ&NtsmNu;ʊ12(/Nn}k::?=^8ic-	HyI;TpTȣz
ڌ%WxF9dۡ??qн˿wtރw'_#(g*nj>']j|яOyw1^jFWOR%o1=>?=bNycj'y}#?-HEzޔGwvХn8|jwC/hֵR/E^=
tĩC?Wb
tX`
78a^߃{OPO/!	]5K#C._?|=Ǡ?ܻE:Lo5't?`^lѽ'ǷV|Yhy$Et/stp
x?_>Na$I0lW.JMGFNo3.:\u	Y;T:]X{o?
L0<#Ek-f}vQnj:LmS}&~5Z]븎}7|\bm꼾x'ߜa7hهp;GV-LR93Oe"QDfm2aގnv`z\S&~xw5ttwZ~4n7}F	,.qvk>|=I`9{aV[>Z/5BrGl1)臇Gw簫WhP+zt;BCO^?RV8a:?3qi'bLbRa4JF~gvFGW4XQ?=kp0EJ=~MOѱ<]vJGɗk;[goBǯ۳?}7ؿO_~lR6k^$xFJqw/OozrQى>~Bc	iFR]v4,cʦPx^42qMgD0;Ya8my8fsQA|ɇk|,TDXQKlt\Ч|ԟ'/n]BE4l_WqxyZ+dSĦ3LwTZH@nvTRa~dxJ.5^K		l=ŏo
!dki[ç=>|lPukjP7\ ?<q[AxAÿ^W#߀{ۍu:ͶɶvHB?447-9~oPLߡz݋g[}g?S8'0@$$ċz?9S['|/*~R	Gb1?Tb}9?t"~sq-o[4I~≔f7/?ͭm4we
7Y

ƙYn$vQ=BѠO* }[0(ڀ<ߦo6'"@:ACQ֑/F!0 JN?_grr~_ݻ5/T0:,/Ňh`c.$,5CƥF/TKI^_=WoߠHMiE
(79}|K6VgӐ_&G]~1zVJb"ڌ% QpaL!
\?Hyq0>y̎͠XqpN$AmQk;ƌ~áai:"7zu%j`
F0\2L~^\A4=T\7I{;fHc%1Sp_,ggeOCf4X~ip
]_(IZig0(׺~]+#kߘ YC>]Snײso{;6@,z]cVC8tY~/!{/bSg(z~уO7Tbz4U"#%OϦ80SQ%gYu	%)H}$|iKV-|tW%WX*ͷX	Y 	֭~R#.,eUTa
-M*JUuۑ 4#?Lz9Pm.lObHbCEoðI3T
g3aH_e[8SAiCZhA.?So}Wi+.+vlč]HX;Dj4>i+!ns$KOsQq݂K,㡣C(ʾbdY¡Z+iΫ(UAV
os7x
yg++~+]b
<6
MxL98L
/wzT{3W3`Pc \ ZivIttbfV^&IKHv'Yt{6ןֱmK1:>TԺex]Al-/##y	GD!~5FtWva"Pbvy#WY1B1>[R6DJÊk- Kzx;4BAoYU4v+W.-ϥb0
{X9$8‘36[\˷:L+fjDU.ὺ,9E׼]gDLl' ͔;@~^ XUB_JKMtlBq:(.p\o	^ag_N^aztTrn`oep	0XdB*/ִFR@'-.%$>4|4bAo	mlQc"N?]~;GFL
sHgp	{S\ `d6
J5	ŷIVI6V+T
gr&`= 	u?K]RX_MˑH	+Zr6Hm{X֯lȈ~C	&	7|nDyرOuW8cfٔHiJ
rhs>6ZvQ'2/p
?2(`oGܮ?ܹ?O~z~%ih^ᤏdQ70F徍.bqP`Xm!pTm*~넓B2Upjs*2j3Y6+DW/~Ml|ZDŮ2͠AǂX#[cqαDTE5 ǂXYnQ5rT~ǫ@5-2jWEJE9JuBMCp(P@28Ir3_-+Jlyq$^mL7In(,I}qϠvz3t:|ggh*}QnL1o֚gU8C?V
ЗPYm-*a#}lgZ6IqϷ	J
X$7_L`XÈ6Heqw&
EBFO:X2sPUPF= =}xgx
wh.PvPI!θ,ZU^ה4C$eMY¿DrO:VIbd'!+SH&Y E{orlqczTXⵠzYݙ%[1l6hDkHsQ9~`spbS많% MK
Vɵ5W2_od=gR,lhyxC^U5qD͢밆O6+)HOe"[V嚫Z5U^oB>sȔd8uE
:jd}̾7ùr&*${QB3i$URʗsai1%++ڎe]Zw(E,_jNAhQV|R2bĤRǤ
MWai+-̒5f
uŦfK
^FNX'Ա5y;/a`vFLk--T*tgsGV_~IUyc^ydf	C3r3ۀpw$SqEZh!+7}7b'̸(\CK*|Y7EcGUF5Q	p%Maiv%Dk4˴t=J⮆f#LIJ7 qvTZ'fSbƜ!p~jWW_xB2*.PѸp!ћ&ڵ79*UR)T;,憔8c!e;./jE,y%,WX=kV܄vGn%+x%p9КHTTܔłe1H3Dq_GT1AVwf.,~Y"Vd`n@*ymhj~ڳ:dAqp_JP^PU~B|+'n\{ѵg\nD:g/f5OɜL$t}h>lηyck`CG:'ohc1<^]&g?8!m,[rqƒR*`@2+Fbq-.[G;.l!&K
ӂzm'XF}FxǼ1ƀ)8,Z=%tD5lޗ(alR	Sw͒Uj9MZ*X#-sH$6Z;o0dgUGY̥KǤ3r:|+G``J!&8DZC g5#=Q"
^tGL(ƈk"@Z#lhx(yYǭg
)]Rm9kΌQ.%V#;O.5ۦws "mk!o-txļ^`b;Ze{4fh,QT%aȱ)<=16H6?r4g 2:IBY3*^T	 J{OTK6tP4"UL^܋{Q'RY@=U5&Bf9#q]OIO3un̫'όH
bJҮlHփ/2!Dp_x*<%/X،=)ډ[Bo $=޺t=^q]zNM$A[NFy0jwS
:sqC%+HVvQRľn#hpJjnOmkZW+J%BHy80l>Yo%@|VE;H}^p+2| ƜmxoʀxH$-^1k3Gi(vDenx;j-V%5^\4	=9C@"j$'R^ڊH-t5b{EVx`!4-fM/>샧ss4{S$sE^K䌓PIxoܓT].Bz!`r`^ L%1`ܔIC9bRKČ#ep؍:$8!.ρ"MU2I
y!,gZ%z~]'GEF't*1t6f*Uo32E[x\NTN>|MW@w5	bć4&XO'і0vm~ƭ&WM]\W,bTbt#!DVHb:5c׬{$7
W	$cRGNsw<;:E@OqQjnSmsb1,2&:5IǨfsӫod+<3o^Tlsd4W!;V4lTvX	(BQ>9'+8b`|UbY_5?9pF@4i5qn:&v]Fa\8)I°4:FZI!Q1'𔹃4SƄ7&
g~4Q@SQIDib
h%oX1DrOMr˸\zCLN;Xb.[wg3 u!jҋYmjr(}"
!FOއSn7^Үϱw-qջXϫ9wF4a)_&a۠zcX_]6Jo6%VٌfEf9؇mӛVYh
B0H=C!\5·qI'l?j7
e<8d+s25jVC%B&hYxoWrf0G췔7֌x`h(@o1ͯ(#{Kitt>ayW.̼`0*іLK]inicO1J r ѨČ+S1> CŔ74B-5šj=pu;1>Igò6,!.yk92ruGhOt"%¢>7
:t'DqEInܞ5_\ƚa2-TzT_3<ⷉ
L4J?|Px3#,!h4&vZ7>,x`-vLc"-ʏ]奱YyrTOxG,dIr/ЖF*hoYUr"V ULG;hhmLbOJ*Ns=؂ޏGPQ;ADԬ5"9	
eS22uE	dY8Kʨvr8냮WV)P/lsyH8I8Bph/ת5|^`i8O#Ea
S=p\Ex<%vgrY`m0f;$ᔤy@1ۆ=:>5`kK<4%X%uz
]!i#e(֑@0r&nziq7<9>_ˠ-g B3	Xk&/UlW"asU%x]ɀ	WplB7't47,svgɾ 7SHn8q
L	!á	0SJ`GjON4ۛ(J%JB"6&9AOxG@a'83
tNlK!)P<,ы~*0
Q*:Nj`8}"{&HLqHcoq͎%UܩiAg돢NA'PFeU3IR5n+Q)3Z_U)l>@=x,r-Qd?Wy1!6r,±4Y4H>$CXOP4bJ!I+	 c"Z,%јq	r,YDfs֩yEȑY:|H9;L\ ^иj㋉`nYw]T	iI:$UdEm&Crb6PnE,h%"b0.qKzMэ&ϯXFЉQR~efDSxrHS:P.'0o?B7w
U|U0-閒+kDBcЦȠtq(#{9DWN">	4L/9ʪ=Gq}8w竌ja7[v5FYSz^{PlUy荨
4e3E_
!ZC zH5zOܹ_$!r+DG-qi>%F`,Lo|yB*5q265=Wen*I|<@fX{._0
m,
gi`~zڥl
+pL,OC2u'TUkվahVb–a$19/+&RXɎӆyBAM#F<[Ǖer7%O{!#4ҟ 2ʣ?~^ӗ,wܔ%,%NS$GAϨ5IhZprlj7U!;7wA+@@Q׀$NС?$
ɧ4X"n>Od+<~ M̳*_sWb=J:݃m;*J`f1Y?	EC٭4JB-Ac	SN<*fY~nlkًRku:4@WBLW*Dt!^{ҲϪ;E;Y4AU}`[Lo?C4<(XlKWʧp=Il>uZB_
ѧaKZXB%q/D/xX8
<%jrTb{
Q"UhPw=iSe$9<6fذ?
|[C"EdQQV[q]blI˪vEҫ\-S1͹X?z+tҡTѶ@n<;s4Cj246c}-ޘ.dSi耰}-Qpg7jPv؏FYkʁo-lQ#hA5r~*Zb$Hb-^ʐ|ddsC,cJ o./1t{wѮ/)6ReTrի"Gb]=_ekDmХt.ǦDJs-.ԃkqvEq"9l,ZGp*4F#[;&hMMZ#	nyaJ&ѤD֬#6DS(J	#JţbAӲ+cVg),ԏ?5*vc_-N7.qfBh~j3*0[iv]V!'Z;s&ԖI$nKqM 75Agomm"V]
r	VJtט0xmPp4l?X t40!
YjEZO7K`ǵ<%(RXC~J+j{p1%:B*[$ɮ,@>+,C8NuBX|Ж+
vY,Vz/"liҎD
:S3B;h8G]8y>nn+֏#ʃ`wɉ-}`T퓳Q3yrI)mᐆF這*ɾ
=CO1Aߩ|fؠQƄ-HEC>.0yT!Rd	H޺=*ֲ @L΁"&ғG$郶R{ȟ**{֊{ȭ ~yBs`w#x~P{lan(
v$*~
~<|>KF‹;,vL|
	Q
/s*I@%#qpb|@%./j
))l:w;p<~YR Qz<?M;+>w=8-oQ~_=(;?zt{xwzl"ߢMZtOa#J8hgR)r䐘	ƟdFf3*j
#
+UsZ}{>]2fe<\i4mM¶ԡI_l('R>*Pi9j]]bUD.y6)jbP!0VLGU'ymŋN]I9>ZGH0v`Q%
e:!2H+)	$DV+Z- M!恇J3%9+(,Ϋ,*W6}gwj¯+C(
F˭T(6>FjXB|?:O5Km`Lfx$,m
(L+!#f{KLvF
=D"D#qPF𸄹WELɄ\5T1TeI\4
tvFbXMBnlg	(j<_0JqԘe[>FM'BP̎g[!K أ|ۛj؉d.jTyAPVrCr>șDlݐSom\U݋#(Hr+(P=`W'!K/ÁIcH*ZŢ!=<qd9^I(Fc>k4j-ԙH=r^@]rGE@p>I#|n*CqVqU7)`'l	ݯJ-'5qi;E;BCرC0
2zJi*E(UVWc9悌
]jBXuT v^qew#?z6Tq wZyVb|;C!(*381.)ߜ(eh^ê`A;HOp'1#_OQyBecŐ#<\
_䚔xNeDEp
ŵȈeqz8^Ȧynz	̼9aׁH}Hsf!8QDi~Pv)x%0(tP 7M,KaiAV\dqsV~g:=QNڬP
o6
{1 "'te?vG#|>aa)n6)5@kgS,G!<.!fd)Rڒmw7h<
Ů.=ҹDb	OWqs@<6T+W֜y]|{Q*Sb'p*<tk$~fA!OD`StyJK[Ѻ#U`^&uy2
˚8sZl.}l<0#o:IuMS(f[%f[$TOҡFN@JbVl&7<6TN0P
PU|ܲo|A
VXV"([g7|w,q(m`fNcZ)M_%,=(49r^,+1`bȹ,l׼Cz;723?QK=lTĊ׃v{Y۱Zzo-!'x4$U!+9~XZy0cN4ߺY73uDtz>A{Ejā$9FiI$C_JƉڗ4?PoPC
M&քe$rvdr|(Υ;ß0_e)Im
fqy_1!p"{UG7zM%ԈbNX 4<(AKo\olibj4rMvq[
QE<]9~DDT1N}-ܙXMUe%pY$9|7Ak&Q'--*ǡyUzՐ@𶉜}A7Bb!cIX`NjU[RM-N%Ta02W%иo=X]"꿗0C<PnN\EYbȉEc&I\L*ig_`rv,DU"(D(\J,ymFCli2>|wcl'JZ/A-EaMZSd ?UrL^0|l
HlL25|EWxk"$q㋀(YjQCĨe=$D;.*5S:iVp;`;I$غUwɊeu78sx.[2@Qk-ꮯ]G-
kĿjp-;Gh4%wz()0dMmxf]_=QrEu0J4SK,ǥT`}R=#=@{f>VwjZ(HC@e'JRi%1!8
ڔ[9U홏	
^nzb)q"\"Hl<-
A";2$ʁ9&A\4]!
fk{h,͡XAzsL,Jچew~AsEUYI*6fިn匨o^lV,GE,kz,KXe98,w,4I2ԟjL0=X?Zaň2VډyPx{jW~_l}|WgnpK0lS.z7lhDSKQedī:HdW=@86_hfJM7‰	&+GbGyQ|WE6DN)mXR.FWX4碿܎rN QʊUdgJZ
^,NԖ:cאxٕ2:_̖sY汳
f~oގ7э};cJр3ὁx/M
>gUM&uOCTc
<E2jv
GChUoR$:/AeO٢n
uX*2.yjL4<חNЯi;[bѱC<4;&K^h}cFhK;Iv8\8\]A!=(T>WzQ:`etFfߖƾwJD;V_	'Ky~dK?R]W>./f)9MLcRlIe9Wƌ[∅koOmwySMY!fkd,O?X.ŧчJ}NY*d]h"`#e5K&Ѡ}Mv"S((I03Z11	ދP^k
kQFXm
ZM	[ǣLPfzIǧ_
YD&g%:9ߋ̏^yy`Z9\L,vݎ!EZkCxh;98Qo6BjȒ)9d&[,'[Nn5%/f- 9cՠ$lGA	yCXԱJ
=kD1:P]c;y-,`!Z
-snm.?[p6m6uA,Ez;l9U#9*dgJW}0Nu(]#3{ȠưX=<0]U5K@5Ңck#pErNy<#Y\J.R[5ЫK˺'{`)OVk3r(Z;˱4^5,=RH?Ϊ<$e#+*\':{?޼g'_={oyk?z^:'pFog3%eD!l3.ӺY3ҔdS'%$XN)
.Z	輡bR-)q%ZhRN߉5[TBj$\3rG8آyE'm*&} OjY6`t%f*G!Q׋4yi6:0Wc8vDi-w9d`{2_;"I"-Ί%gtq**>})jm'=So"PG&#pQff;W:o_kxi~VU%ʰ{^Zoܓ`6r'7_{w*D$V]9;ȚT=0?@慧7U#v+ɳLoݫW
V;jYLVoQVqs4
wv(
O4!-*x+wD
e/ZT}Uյ!+u+::0
`mTͥ%IZٓRi.'Vk,
$}@ٹ&z65|^`(,
0SXvf+j놶8,4
%܈}fU%D*s( [8Jz{Tj>b@Zx࠷_/B2[2cKpҒʽ;%E4C- % X&nI[oޛ}'zG1skɔ>ցI} /#Wm/nRndg߳CMKsG4K=-P!~j	v^|vۿωxybh$
[Pi.IkK)	9h%A?)kA08[|5LGFn沮">GE5+VP?om?Q>I.{	6ӷke^fI	yO|]~p[~m}~%myYS-f&cB_A"J-EU
W
;U}t[Ś2sZHe{tZ42Ajv$R.e'ouy:Ҋg	fqA}rAngN9
2t&W0'<:H)k ys_3r!ݵh۹E辢o&"f' tUq;Bc,撺%eQ:
{q!W2Ξ;yy%{)xIR`m$^|5X35G
FX	'd-\J aGٻ?>Er^rÃH|M:kֶ3Ic4Z:?:mG6uqѨ"VI3GK`l+&Nv<\vEe|i
[>S\)zYf;p7NtKCzl}g{4Ը3[z8b7:E‘Nj<1"6(elϜpAy35DNhV
2Z,üⓜmoh%:,iu\l8 &q1Ewg-qR@Bq~w$~Ǽy{]-Oςa'X$,JS'8+ت!!!}cd̬=LZel|ГP=.FIWenrqaJ~?S8<΁E#2|h+r.љ,{<5B&_![6ylrAEA%M-Ƕ,܍swiOZ=c7RrN5K/yK!I/;b!$8{@2!P[5Kxi{I)Zc*]pm(v2Q]1OhQkw!H[zUַВ	J+%1M
H2Iaܙl7@|Q	Yv[ϻ]ՠˆOYe9]MYL,.~CeeD1}&Yd}43䃫?PC}1YfQ~JY寡\+N~Ԑc>m6>}49HҞ~[itp~#IXRgcd=jwL2.% ERB}OVg+hD ȧ7H@Nu0RPʴ&/̓ctڰ;3%4O({;Ĩ3oPд}UR-2^U3Iܻ9Zxp"ZsЂ?*Lab#,V"vJ@lDGa*[?A;6.YG$??EH@!;w":ɴ1xb65oPk3ǁk:Ydb56qN$x(/GaO^&\-?=*
{j)jr!Q\:Y֓OemQv>B]Nc'QWdפ>K-,mSqB,pih.].TJFZ~+V}nOW/G񓯞(}@+	BAf^L9"gSy/7 Բ(7wB|6PyOm,11j	º>D!%ZffR^RuKwRo)(cB-6`<_'nhJxo@WS;Qd~]_OPtސ(^"fs*1l>;AQ+8dZ]I@@$|'v"'y+vʫ+wٺnmR1S޾xAZ9} S`Cw=neggage^Z}dJ;N1SEYte>n4P237'	bvGBu쀻`,('tMB?fD;]\"+QHoTcW;#3
q$׋}ͨTUBzvbLv9P%9?>c5W$j4eRp9Gu
`JZ	rq~~Pa9I`lLUE[gܪ'Vo~W(1=
\g\4aSRxG(	4L
AY`YaKg9#Lz1I:Spa[=^,ƬL|ZJ1	(Jl*mL62FPd"(5*#*[lLYNK))*d?O9aڐ6%(09^SQ|Ke%5x́[v6o>XU
x#n
nPhެmnxmxqR=\\p[3>*{c]$^Hucmy/_2^	S(k2$r)7>  d-bCʶ(to*BD*8CHZ,r3q_-ŏ(R?:w[$&2%5^;ʱI$I呏aU15be|J+m$q.eGBt'KSD,W{wIOZB-;ӪA,(@gYR曔S$/h(պڅū7F6
0y\Iu~R.@XL}Ux
<8]U2ZTxkUY&I=bl#'?\!7.Q?Ry鲀knEANlna"bd
RI.x*nf563K#
Am]0Oz%u+icsK4ƲhHjqV}]'YRٔJ+g%)9[\wd@b]#z9cEƩ]\5$n%p,5GRYoUn5㴝ȄG13oCݓm56ߒTP~XRŒkIvxVL+K\}5^Ӌ3桚J̵'b\UAWy](.:Ɛc"N4"q8Uc! ˆR~b+riG頃yUQj`#eE$}/D}l'i"MC(ZBPg\S5fE˔&ٝIY%S
7ԳFJ0L]Rk1rrq|@ekZTCمX)B`vA 躿j>SBoقntP$6
_O"t&#Qe4b^$I-+h{d	F<|2%Vl>yxo	#9qu>xGWƌE Km7Q62	LaŠX21G$xP<_5  ܽ)Te)~mXC33"ς
퍶"YI)pqZ<cpiIrJQ[ԌwVu?&Um&MTEh#
Քp_,#ZWtr2*u>L̵[߈3!h
Q-*# =pߨ̅8]VVIWB i
n5i/&er\DQ
r\D|YSV"g	^n7*~I`c?)GvC:a9*V3W	F|܀X%e{NKE@vv:

1+ 8DM`yT%]/D,cY+O%UUkg)#j4C[DesR	k%aoMLʸr_-(ʗQB`k\ڿjmVjSꅌ-C6MKC#.@JC{LӕԥZ2Jߕ	\{v0]ѐ"N3Cy>RdܬehQ2 SD|dD%tf<XvN_5u+Zvac,osCKgK%RjdGX29/wUS{	_Ӟ7~pjZ>˝Ago"/븠~V#fbَXU;7ɠTRp#v͂{}եtIWgU^bɖV|$0qC"f0jq:+FX?Y
_E#b/˹PnBM/^MܰGqdbnmXCƠBחpQZ]XEg̠AqvȽA8(/aj*Mm	M!LFA;™я<\m4
f
Xu	O@-N0c1u)1/73Ej:g[YG*"@:HQ3$QT8z1Ą+C\1'
_(iEYzkŨJs.Ai9Zs’U{`A9>VBlTBML-*C(ӵm7[z0lEmpIc?K8P
}t^p7%ʊzȎMhIjxbbuX{쭴\ɼE\/~eviyA9
.H,$LO@[$S݇!ŲHgŬp
d`Mg0MW5R$˪Mo*69%ߐjqq`#g5gr52{hOBH_?(i319V͓ș5;(ZIxXXoṪb%Q`xT׹&i8Q	8F]|B#+>[++	IT8hz*-]hKeƥ8r
x

x1"5D?r@v,0No3Y$jN.*a=@ۨl~!
Q̝Π#ޭ!
Ӕ;sA'[T\CuZ>8cwD+b}lV鸣nFK_lC5B<^:#/;)M~_aH\9/XPj>' 
2':VO
F,eAԇY
@g{2p?_E(JB=>=P%joPm轁[fC
oVSs-&dơX*EG_gJ1nyjb‡U'ꬦZ-ϒHKe,%	UudR^ul◴3_~uxxGV@ ;arK*MWpRnO0ETd4>zn9<[@!Z%S
m;|do]ZLSuys("KSI`87~#>c*hi67fD/>\3s">MXV-֒\r109:?٬*WL#q&,IH+"NbC9,4h1#\ZA(
gș䗰V1SSХdJ
V{VǚWSZ*8S);@7VYf+@b,W&PwQ[XJ^NmvEXESsQ&њF"ݲDì$
VV%I7K."*rvump.,hAhkZ6삄U\8Ź𕍴Fp/sFZC!oT
9ہ:G'z<4۷3)a}h^e$bQ0
XgH5:9(
QӾPwNaQ2Bg'!ʦ(FWk
F&p\{y%]#31GD9~DjÖ3B#u!p`Alܮ/Lwc]C8`ސ3LfRʯ_oh6&$qp^n.RҘN"9  տ˦ﮰ~&[%!<59րu( 	nip崯)/2\za%OsP(2Gq/,mo޺܋ն]#`ABY/P)I2rƍa2x|pߔ'u15ptmaMՌW*+!\ǭ)V
np=gS @fԊ7Jfl.D]M˓̓Vt@pQQEq0:M{I*X<,7zbN?v
)>ĵ@]Ѣ`rV?ƇA84c[t|c(Lpw K!Eq'Dn;.-Dx(6ߩf{RʜW.b.\̛cFk0	
ñ{XÑ~g0N=~ǔn8R+Xc4[g5ƱQw!.bK~l[%c։;Z&
	ySs80~
ZQN\LRkϪo35#hp9-ZH@'2|{"GTI
yT]FY6LzReݵ
	r3Tpj$^d%"[k%D<b̋?'53OIĪ߮HC$pxARmh^UwʜzK-7a/-MzbGh^FO[s@ P~MQ˖̥9$A}t|v.)hjWZ3F;o78Lýna^I)#DD1|=
(n`0#`*E:+^bu/1{>KC|+sfKbAW2׽R;BIA|qx`:("ahAMAHD޹K~gACbrDC[͂3W5!	NZ*X􄫸.dP/Lw6G3ط<= ƋL:2Nߐ5D}
C5gg9o9|U`Imb
$=L,>U:8 cҘef5A+T7D᝟;x=1c?b~S#5e)cUdLֿy|E
%`^j2R#Vafi:qXP$R`~W
8^Y9ȸl@ībنB2]>0
ЙMHSmXbUIĞLA<646p^Xwwي䬌IhM"6%ɔ=s.,ǗHmY0lNqծ<+cBNqkS˘:>6m_j6s%6fzd1o\@	w}
)rvx_x'ҷ	U^'&Ϸ
[(I
1^M_0l6:vQ~rfR5[&v,5CrWPtjA	:\1髉`HҜUܒx`5`LUh3!,:2kҿ>"ͻUewBQ6\)7?<{tܧWD sD&Fq#iҐM4+@^,fiw
Ԙ^Z{P}RGa 7Y9MV3^+iVhhEqdWU[Ckh1*__N,TT
RqJ
!	(FB(
d'dQ	&oI\Q#IU^%ݐj.1'T
)>NBJYU}:;'LD#c	`/]~ʼn
:!xFIiF|HPUkF\w<|W~^؝Fh\j	4Ylz~EHl{(|`?L-XNXfK6'"ݪZ}`9-Ķ"rCe؏@><@c4.hFɁ~_9/iPS%BitْQ`kxnXd#A(	!r-`)3;B̊j^pO4a	ЅiXoY,nԳU&Xc5]q,	T}^ڞNYmWpAjQDom)_)֯~JK9[_ntu#EgN*َ)ڋbf@ƱXi1C-
miu~
SF(";8'IwNy*g	8/_'h1\
ds*"*rGZEXᥬ$dH.3~F3TOQW<߱:`x-.ou@32V.LUiysԾZv[\*#9'3`6YL6s3#4B[qQPRL(ȅF|?P>sa
B=w=ӆ8mZ7A>8雛F(Fc9?Ж玼7Tɛ+&%F1FIFroV.$>O/K,W_qWzx:a%+6'	zzzt[nJ6`c*L/tG&N_|qv	Z+OTk)GymYEUTghDUlzJ04U
Ħ@,ߞV"RJc!*Cźج5&Y/J2l3^)A&h#rF-v8_G(_TM@礓qUV6۬8E;Ҋu>8!)W|'$0a= ڏ4A!VOYA̰8M$;9hGJ6c4gZ8Z&pQOx9H
&W.;#`RB+mr[9H7
?]
;JKWS)gVvY[A!ugV]AobƝ1l?#ŷ`=Y^ZTNr{g.#;k2{t}P
\9w۽Np&i\lצ!8
&f3_	iRmpÉ<%"n8`,K72_
Zd$P
\=NԖp[Xo˘[og}v-: ;Χ=1_zDi,h&9|hb5D 8%a$Q.k-/rἬd#ʎ&zi="[
>"VIJ/NaE[Aܛ9mIEN\bc1 "pR4+^e9=7\Zf/*2r.x_0Y}Ld6PFߡ7웘6P#xٓhNSv0\LŠD,Qם7e0 $8Io*e$ڽC!UyP&\J$[q	$X'nIc`Jru~kY,G%<%dg}#h]m-!,N//)b`%NO;KG
'KCBgdDѮrD6Tf"$W2	dr;
婱qx"59ŤP&GOsF;jQF,UĂ9bWK&rWI'D>\rȹd(Ko7軃0MF(vH
D$r<7~||}ݻw,ՈPMywX.i}%o"FEj2tTlpC ym$s3FK%	7&_%Q>ׇ!(@k4Y7=a3H&8XIfg!eN%x]a@9gT|#{`\#荡ߜM{>K4A瘜%tI-^o&;2LAȘOпQsHUom*:֩MxK|H~Eeԇ:ė
-wfzqQr;WT3юB
xd	8)LR!"_ev`f_^'#G+`eؼJVBu#clݥnCt0Ҟ;4Ms WՒi@_-T9,;0K̤y1w
]DyFֆ3'($2/vkEefbX"{]%NN6yGU![LQzp<a=dg&bUDZ	e}FCwVTcq6{y[ZJ	d"K_ۋDd&:Y_IFL8ԃ<m^ .\Dos'&b[dM#C]_)тZngWR.Da$%ej-T
҆{GqdȌ*!$+gAk4dOb;]3^)C@t*CBu1(5l0²?ig"ꜷ3D"ROAQ%`*ŔDh?l )r? s G	R^ţ{;1ᆾ@/
Q~1jWG#vSDߏ}iuUYR{XضX%(`'(u2L~wF`>w{kw|C,fז2
r`FM6f_lj6Cfp]a2tRhpPӌ\ƚpS]d+Mͦ*n_5'C['`&O*~!<¾y($Q5!_᏷AUb<­tU[`p.W؃92[
tM\1?V-!O/0-.!
fR+o'
}8#%0phk\M.ua
14NĆq8YG]Cw0NMB*2.'D|l8$xp#zoz\24KR*@*	Nk֝%5e	aRq4g#rJq[dQr}vvzxeC񧽓TQSND&*	|584)YwNxcB":_[8V	$CAwK:ssN2dhmItv*Fv$`U
JoS#6M/>R4󄼃T~v6 Pc<d.aeG3t>x˵y1JD$kŞ*$}r|߿av˿Z$DCkiVp<+`k?t^L)+ʒSᰈ!%QzĄ{hKO w񚲐mPA.0F
r#W\kN!n0{.@OO4,/gH_}d/H$3<]AJ3;D"Q1!քixSƶegyDL%VXJgK
d ILfsqL˕-ywy{b҇ƕdP_ N+"H~HdM'YӮzPY

ВqkxXK9ʹ[SC@dΓZj芿iKu˜1C}TT<\V긧bk25+(<u}D*E\feSG+>TV4B	
/*^#Pao|9Љ}Cinǰρxkjj#	tx{y=^B
j2FKIǏoJĮ|VZ۪b<E9LI^#ٻK+ '=*^bm]ahe>es{ٸ!wl%5ZL:_?(;u(WĭB>ƒkC
ט5I@*^Ry-C(mh>Z(n'5#MP1d=)w<
;F}q.Ч&Bu"8j?@sVPn~QbZI14;4\O\dm{2}Cy0{li4^[4eut	dWEyum_puX?IyLu&II½fi_Qɠ[Qؕ^(B^V~bl$7QH=#%.+	"-k4|T2pU.85e]zy p+M-/ }m3)	kx
uljKX 5^G>J;;:uƽ>.J2ը0?5Z໭50kmُ]؝A3*KbnV?"(zQnѻlrEZKH6jS$d˫3oQkR !=#;6s(eT&	RJU_rYr*\w"@j(FᨙTFI@uZDR"'ܣgɎp^*tYVhVpd4K.V}d*p?O[VN{Gnl ,
%t39Z`b
{=zD%ҽ0KdT39.Q4)f6lIFנ_*lEaVAgc4eg҇͝vzn\E׸\.L|o!(ϧ|R6to2">cW8Ƌj6a'tëV6Kֈ,nLic8袎
QNn$$`x5zյ$f%
B%{O?o1?|
Q;Β6sƞ*qLq#/>+8 )0d.Ք^@ȼ%66
Qke̽HvrI󚫖e:f`ax|[%Xx!"~N0`C4:iQHBn+?E
d_:LOR6i
-jt!:}{vDž'j
i.Xc,];15~#K0UIdm:$
H
L
W )FK³,Nolᥙh
yGl;PHԵ3C	6fa84qmz>)
, \("mH uFɧgBa$r
U8YKo%uj'i"!y8{_m5M5
&"{CP2hm
Vd5==4 &'&8GS1~S\b$Jyx$uj\>Uy%We/DַѥJrؤ1FHƬY	/1&<!Gw'*Fk
ѝ-VܩU|>ͣwz?!lDzdn6RRIb*Av(Kyjj$~ /HVA-xۘZF&oem>XK$-BV
{?	&B);>eq9\p򡝴*qr2	jMb5?J'O~û_+t~kJapIK¿?G>Qf*}"*3\eW٩u@a^qht#z'USڟPO_aXUY7YH̵KH2	&_z{P9n(m3B7t9?XN=&9!Ɖo$&
qNDdC\{3d%hd6l˒m2`PM0RT>E@<b<(t'5O@_||ɓӡi^#^Grk+CV6AyGQkw'HhТqѣi2vMJWϛ7YQdPʫF_7jhҳp+V3.uF=YPS2PKN1A}Nj,Jt+1Z8:;;+>((dszd=#dqV0pup<V`mE@F!Yy30`9dIOfH.'xj7U-ά)⬮!ý#g ?}^|/+*HAbar'dpX`oǧ;7UwS3(1	GU%nP޾=M;Ü.pw\D$g[ksH*p	]G/A/n9OI'EKD~6b QyTM~Bd/ZdE>qY$c%b<jp}^&j)vG2iGd=/\y$l"w"jQ`kEbޡKFCDߒcF̷1Np@ѭ2i1s;IH[{0>vG!()c)0,Ro8&glQK9-Fatb	!qdzvkLp麒k $CalJiV+i&!'+G%[`MaLR#p.%,ݓBv3K#vA{Q@uz~{VN&U@\ Oz
$hE	>nCkce:ZcGi`$<o+uNSS_x!ހ:ĸęP#mb|C
lzdrM4JE,F.ضKbw&Inj$QaɚMb+΁Tb leHgAsr(e" I҅6sV>D`GN+R3
guUlD_(1V5Oj(E/:)HYN$jBjdK!Z2CاV7(H§I!Z~q1"3F%B~%XWi&;
FB'4eId(pw)싊:aɷΙ]3V6Kg+jPm3+iHIcMaVQ8_*ȣE,]qyy"5L&Qn'D*a-6*+LJ|@p0VhDgp4|x_2vk7`\"y6	ŖyC}F4\DD1gR_Pb1ť0P2/Q]#Of2B

bWL;ّuᤜS?՚rq9Vr=fc]g`,+m7R(#I	|ϽG4n*^.,f5cC܁w7!!2I1hj
.j
:<(u Qb|WbPfF_km,wS)E8BU?VMhY;h{
T,q&Qԅ!H'?L|偖3URBYZ6Rބ5pHr*0x+h
D)bAI:$n2нr=ۗb2(u.`1lG|N5{
chOB 'ڹ߸Qmfp,_]RZن;'d
Ll!7
jY	s@i`bo*Fwٲ:&Bǩq#!]RLFWVQWy ^ϪA\nzgfEt&~SeQr
`˶P["C8
=ݩbuIJX: {1=o)͒tlͷ
n$):j#˹S&svSEr*ry=
ے).D+1|ٖ1XqAđN/߲|G_Nj"F8H v`QȶJߝIfs^Sd*k!tt-*rlG5oaV_D
mт]``@$ N	qUDZhe/V]haTRK<2CBVFql!;1W<|^$;vB̊P+|F|A{5^[޺?d*6FUIf7N_ryD9I@DG8suc4%BR{kzCp+J1;NZ~n5?$(r۳Ǿo8$M)kR1"$ނqՖ}d.Po!4%߿8Sl37
Z`S/
&߳ۍZy
>DdCjp)#$GjaRhpǖ)Txtg
=L
66#߅^[xײ~*#h^LS׸	N9K`g5XbP(i
tۂx닭voI$Õs-RiX5g>m	2$8f\vqk20oj0yJ#'B}0W-M-I4ኑZ~Bʪ8?Ǻem0Q7zªHy)Gz/6["ܶP|S7'3=d[tB;2ԭr5HrȈIO>nSP9IC3/ Pb0?a¦P*2=('\=ݐ:P&Na-{G_ɜHM\*Sb!G}{}2y8P4#w;
\ՂxϪd/p(Tf	84wT;5d26=*9d0J`1TlږroeC]IAqbQڈ}֐EљTM`2MIBAt68ĥ$GRQ]et5Np)if#P#[w3EhȤQGO|_;zjehF:_IoXWchf'JvҢQt[jZ\HsNEP>6KLPN'lG;XW `x+zP̴4>"
@2bO0"V`2kbQjM#viF[eNq\Ô#քb經p3vӮIW"ۉFi[u!,/`?(@CU|zh?l3/Cqt+ώNbJ3
d4"xukf,H&3$MTmg̣
$mztӨ{V=-$;_rK#iPt4H|*q8v ųPFmo%n8#KnlIDU*>U#
5G΁)FO褖UUA3h\&/醱`CW")h]H_*.{m"3&l+VOXXmr}(JODȤ3H3rx)hK$؛#1b9ݪ	qշC϶O?F3݇z+4l{4-(J/%ۜ 4sCzy8is>.<5`,A3qjn0T?[d,ABQ1EK<ȸQDFrppՉA
U6*bLye2SJ҈Y<D)ʛ*tY05CpqOLڕ,PlRY^)g(Llt>l4qWX٦$!0V6X9ܞpRST^XmkS[C-
$o_NP@ճXDZG(%ePh-aoL3KvZV>8tcbsPE5U7Dl2s8r!D6މi=^(5*h躈8ob RPiM^JcB#ˌz%bI34YB?ĥϓ-L%yXHs(LJ\._Ty!TqRūBn={I]
Xke
u3"kNҕbԤDG=/"vaoDYvKǯ\tfReZn5ۂ;uOPQK&ۊ@R+x@Kx6]Cc-ȸr}Q8I%CL__B3^n+lZ܀:H67"_{Ivy$qp~9 A 80OʨB,*W: -BQXKdX>]! SShl
 Vps-!*ӺYI_Fb:Ή%kRmˠD"$/I Kku&axvo;;[0k/5EOu1`#rѦjEoQxpŏ J_mogx}ϊ.
,jiױ>6e.
a|*dh;C%ƊGXJA%,xAӼ5Y,$DHD-4Pވt~zLCUP)#+LH!Ң#+#7Ѱ*fɅ.Jf)aOl/0A\:$\qR"0	F[ݬ"^LkQ<F0
^"}jFW(x-7+^Lx`lZ&ȈNSŝ"Gxw5	i(ؾ-R"*`ivVLE<^6D!ʞa:ܨ1ΠLH\ٶ=fv~ɰ3	$	]aVyOt%^{եT+yЇ[QkRzt?=O#a/u4_\~v#+%):e7,
JVN,Ռ/֋azѷ9EœKgiBP(UhwYmHZb8HT-*4OPkBZa9`BˬUT7ICI5inWeT5QYtq\G4xP߷(I?j?u5T]#_JQ+N,Q+)ɵldXmʁ0ܛcy_B
Zq8:iH߾3֊1kLiΣ:yZzhNe8Awz2NWM	dd|>aA[%֤]n[Vm88#6VPO.?'FRZHClR8dk{),E+VUHw3fexխ|>\,~eɊp./k\9 z
M;6s;^]H`"C,mwvidy,ٝ͢Rt:M!lå'teIG&+:*~0hZ3έ+rC(_$vy%Y
v*|)~[\Xn:	.Do(Z-:U{M2€]G:)DI]f'8\k0xɘj:-yeOa'(LA!A}HFP.ur6s"JL\WnWCd+v%`xY٢[?xgk8z41dP-J
^5E nv1;)=A
e״_Z%\!OjdhT.Jٺ}&Η2D/iʜuHwIbXwT9~S1f.YIP>رXY"@&<}G|Ylٔ+U
{n^Fp	 6c2~(bT[kYC"1\Sjދꄲ+5S#tM'ʸ3|HGE:å"qjʖS3͂+`JP9r3R4Cs! 9V'|uu@Umr%w2N%6Eݺ*/^7ɒHY&.")NӜU,9i!054$k"y
&/`raucCܟGoH]6yBVbHh0yg(3mnz!{OA{kJ)xFUI\GVa:
uq,hҳ`_p:!
bF9Hx;p~0a(AФ{7.kQ\joKYHG殁2:
)zX_qeC]]}bruA֏#m̒:޵p7hW'nX3ٮm:N>֯z/ӟЛ{`e	ը
idKM؍fv{ƹ[Akf?;Rqgy_קIo;҅dW~Sn?xzGxdȖͪkIs-"X/sѮϱ$	eiN}kZK0>Ḷ3ު@wԁc^qƺC;<"WFjwID7EW8R
vʚs⮢5͒?8=.}:w9x	UX]cFZ˶ٕr/Uux`'N)!$=3W`=ϸBXEHiT/)۪Җ|~ݺ-Pxz;0ݐ2MzPzlqgO&+DG6qݕR.ۜm/o4b
oP"?V '>YEܓD0-&p4Uz6f鲮($mv	uem.ʪ{VN70g4Wq`RG:MCKQo֪gXĴJʙ'Z`X(1uL7=v(rŤO7zg
\TsLWc%&D$pyM#.IJkhNQgk:"莓SQv]
L})$ R3qzėAy@,aITyͩ(N%4F\r-/2j< mGT"ehvsԟ3/[
G65sַtYT-uq	($;
+
Kf{1G.򷁺[!W
Cjb:y~L:ȊMY^5sML!C+wqq"p
i/_\zM!Ҹ,ZU0Bط-%ֻe<.H!jwwqQ>Q6WT*.LP1z-ggfK
˲WȖ}",ycSYtV[g~p-<:T7J>υKswmE1Cǔ,p!zFw,m'_ب̖I|a҅*IJ1%sBi2܁o3g_ME,EôLxmؼuh%KΊ|Z]ax+8@rFBD%|]
併{W`"I˙ n.ݒV3Df/I.|׏̻vYS=LIĽL/΂aݮ|I5r?)H$yɒ[h5]e'/QIubGʔypʔQIg}6%Xk0LqиQ/`d7(.zdyʜF5^Xfi
-#)2mH񹬷"*"Np
G5zhKrOj}*HF'N&@ ^ޅ+1)9{Ϋ
m0YtK	-
cZ(r3ձEQk?jj9k@
hı"`r-4C:(vpmPԆ'(9jxStbR{7sRIjh
TgB&=`D_
xeu=>Ց#JlFΑ–_Gor[FfV/2왂mnqP\Cf8Ɗt\fk(ƨ'?kgc6܍9CF,)E>{ћ31ŗqȕvPBsGpfŋOOSBRGߛ̯
FOh{H4F8CabVte~;kDpHܣ:LDmDNf'-WOOPJryb3`BPYqK+>(T	f4Y1ؠ
Y23-Dt>GDGcAS`vr{͔S{Ẅ́rFSRuЖtǴM޸%a|}:HLq~ĽÒƮ.%W-qj?G)*cуr1nWzY%~'	.5
>q\-Α+G9P81dYW4T?)>T91][7%`/
nN^+}e(M41m؝$wCHϧ^yzq.{:j`gg
NpqL]RRLERQm-LP/ nȤy+CnWWQΒ^7MR;OgD glMD	FRBupTŞWT|կj>g"!RczD`DI#.tYfQȊlr
QFf9L|33*][d$6CR
h$џ{E4.jU*BѯG/&<|2Q^+s ¿[G
3Rw PM9[E[㚕i"4pA2Bm8>'fޑDU<8P,q[h26_pqݻVb>$q<48#آm46hiw.ܖN3UTdjg*-jQ.ъtW塣#[oP̢"ośnu6=\c.CK8x_/ϡ77^wDfDT,?Ϳ޳_1iDSɫkL>כaNvm5"3tzgAXY^^"FO;lA#JƅeD:fXqv*Q-<#+{U!\D)EvsBM-AzK&3tǗ&O$Bn}+'5#-MtݯU"a1DQ!dϚp3fIݯ"Wڰֶ>61He;%Jх'37GMYG22C9~vD3iPE9]ޞa;l!,Hk	RvҘzTׂś)\e=qn/	kD$wL.RGQ1}+56$wUQaar,Z=WlWϳ^Å\A!z
+8᠛&ŽőyI9CBB㗚īeCn*wCzfQLױt-
I,"UbmP]nuÅ۠I5̐0}ӌ}_HC-p
vMh
CUGG蔼~9BpQ/W*!|
7^
|mK2trw`D3+g-"qșOՔdT]F7WJ>N!Fj
`J=rˎi|=z^'AtBܢL:ޙl /wp@RIOWl0#;؀*IWwmP{rth̘X<6cA#UAoil^/\$޸S*]ˆ\@tхܮA#W(ל܆4)E>2w~6YJR/^niwi_B.~mtpmB'c~`nT>$"%ʔyuE*,5Fpu!qx+u?y{Sbq]n&+d=A0
PAI.dq!ݞrR'bv״R+tqTԪɄ+'.F)&Njl=wz4r?%SMZ+AŸ
;tI!@G	#\:9/wmd)7'o
~-Nԑ,×׳rG*IzؖF2㓛LݎI$b&K>	Qʎy)h,yH-E*[)^Ptϓ(a䉥=z%>T<0T	>:)oHOeG'|ȉYuyAb16T*jj29QV$k\|U=!LCU,]kxV¤(a՝NxM#3?狰5ۦ.6]͵*:ܾIһB=DRmAv+8$QtSؒdv" KJN Ic==c(`JNXx_wf=Q:+\bYtQ`=:pk,IudTmSeL`>^U˭Ck5'&+nZ '\㵐|")@*#zKSt0'( kIey#գ}Dj|NAC`̞XV-aT+6)	_)J"ᦠ+Up$TZꩼ|@>("Yz&/(@D))cE58!;݋mޠ,zKyIkIB*4EW)xe:y1!I^Y;yLԷ|dM?/:9#њ,B)F*p5ب8T$اz#(i% "EY]v?61,C^ fs$jI5hƪP,!
?գ76貨hH1FXӫ7IE!ьHٕ@2{WDQFdFkq.Ewm暜Il{p8gՍ&>DZj!kdʜ+‵i
PdM,va%Q(+1*[0y;x|qqNA?vFl1+CbҀ";$ NX[8

읁:~i%M)CA;6QP]U84ڰ	k4ISo<NJEd]{x2u~H|6m@$eYǖEtZ[pLSj4JhI+|
WiˈXVnдؼjO>%^:Grl|߫ULWW0)g'Vpuivz[]c&n3KO
7f*.yS1Oz(A
Յ!T]mJ`os'Jԓ9W+LvlB6bETZ_fry)1S.M@$Ogg_oMGW;].n<"QL'N==)[l0{1m(	f+dӴWT|bGHOu`P"c{g`zwh6)ؼrT)s^PyS
72յDee1pnDR:oؒ kI8.+߬HReM`I,-;p"؉"'Ջy{X(j}dXI 1탼Ь}[,LSNmvZ]QtON4@8tKϲSvi?I
qy;
KoMp,[.}C<P@ĺO!
]9nKeBTtS1÷x-Wa$N=y0BGE<`:}Cr~誺r悲Zwt'o9nI,ycGh(<

^ W[1HIvUE+ ؔǨH]fIËN72AP&9:X> ]P׈M,r:^"We,<\mZŔO;B2;?_>'M)c#>-v@Σ\hK'P߆A7jq#i9@%I%É3I+X#Vccݗà?9ao z. {r7eBEn8}lz> @)M@re PQShϡE"ㅸsQ6u>r!?$7e/&WM`eQYޭ_M,b1W`d2IÄ"w'4в^Il$HW%qDdLH$rX8kXP8Н/3?ƒ u!|@H"Ip;U$d. %&twy,3qǹ) ϵ`yhpx7g*q-7jKpHKP*͜MI󯿞)1Dq\JIh];:l/*wޏJ27l!jΧP49xQ+}Sؖ%iLϹ}+kd~e{1bjI-W)E\fp?Vn%:%0bs$$`-Kk[o6Ih@B xDp@ "( &X&l֗@& tfN X a?;g @suyp"#D/h {c\@Bq|M%-G )4YJRQn˳p.˭6~٭G1#th&/*|F t4wn#a,g{[ҀbHTh#JHRQ|&^ BO b$D<땭:N뚵]ZT=TtuԛӖNdVLؔ-+Pz9A*e - KXݵS}Aco ssTʽ J"5)Q6ֲpkسG,hS,{P1x ?*D ((քWu6i,)ï(ݣ w~`0U5'F| cAÂL] &I#ׯѩ]}[zC3̌NE Ytɟ}Ibh|>~,IQq4vJ2sO{w??^C-}I>9czr9$$6썎 bQM>MO Rje~}޽G?ݹ)l1Y:YDS%,Umw9^t.^aN'P!SIZ lVbq̈=Owٓqj؏E I0]jgXI~q$j9B-L?qDI3߷Z_F5FI,!#rxcd:HOș}d$y''ʴzq1ל҄xU O:3QWZ _hu1\˹n&aof7ǝfG''4+ ud^<|✫Oؙb" qBaVF=p=%l#\$Jܞfnw(?Jӕ"ٳ4svY4fɹ<8?"#}Pw[Z`hOWYXڻྭ[2tM3<^۠"r)LsT绣(2\7@! :~,K.6U噓C?$gSf$3ɥP'J[:ch12xXsWQ|sajϧ!L)#yKMp'(lVnfo EFt^4$GGM2'uT MX3,K_1ڧ{`]J$Njß&Ad|$\pBWᢀ[_ӬRJ2d%%4>OJ竖+HΗ:\%m6?~cX_yVIiv\ :BQX{2HfǾAAXRg|Ͻ9 xotIk eQ~A4'j1[97b [BOn=˿ &ռ *}peS$.P̛x[>mD Px.y:H9Hr8v,Uָ&OHYPʤt!O),0yC7jz,Hoɩnda-Ǐv2$`/d $p9iclG(/&@*4[]sۖۥ\mދr Wui5*BkA>iaGGܤLR8Gӌ50}0U,ӪN$D(_eBC}א؜(hk߂KCU3&tȰT? H'kA+N G7I#.\JDG8 ah}~%w{Gfxً#~4ZjǺxW]YYz<*)T^OgǘP_2'䲠fD$R%QVzU_}4)r^5F ¹w\do)bEM+kWiĿ~߿&UBqޣyL UYnl-[8Jf`[t_֘G Kd|޶#\iՓ6be CFf]Wh8|m6h>" bM X˽eJEd=>:1\{Ƚۣ8L%Zqj~rNO򃡙x957~S)+zn .P&n 499yLX⧴pfݻ{o%zٵ;WB2|n0XyfHnwpYï-e(bc,yc<6c8 n? NAL]~?W> G'ǿFD9}!#VVv=BOFQ#yRNKc^-w+)#WMA:@w6&S7*gkgMQ-HBa^` .G~?w>H܈U2g0(v><?g n_g郇YǔU ;ӻÿÝ{w{ym̔136٦?6 FG1p;޽]O9;=JԟL,‰Ix>'7?eq]'MUTQNZ">CNG;w?KNUwΝ{~g̉P`/>ʓHc^ 7COt?p/;Sr=-ŝ/e]omnf,Y OUufmշ~{,:_}c.)/|~9E哫Əf^&LGޝ?}jJ"y?.?Ȭ=CTܮfeG`uxiO~gH{g`v72YZ~O-al [vßNݳNYirYyL%׶OVt?/C=YSQ(ARLT+{GxLG?,dnQθ[;w׼[ptNp''ۼOCbOn_MNϟ=|~7M躇Go{t3auxynz}t?/d&yxV$~`G/&s]%KcUI۝s5Zj6O$ < 39a)ga]TNpp%CϤqYr*:Jȁן:4lja 0QN[T>(ҧO?> ,zWtcs|h$/4^PMr|`C!5k; q>_}O'?Mv~qH0^aej. cR"kUnl=3 /ß`9Q#2Hm030Rom B?ykꆟ_~LBrf&6&~/}[[A^޿\Ũ"j>}ƐTwכ+<ݸ}$W JsǍfЬHnv ݽ{7}TrA~ϾjjgJe~|L<]o?0oga0e~B/pn;!ћB]|jk'>;!pa{HŦ_so\})Kǽr>/h *K;^r3{N-?^}+TnYqК4zK/h߇fi~7~жz&#m>Byn~$ڻˏzU=+ЧwGSkg7`)7nx3~?K%b KTgD*gW2j%ġ" ci(e8 ȻȎ);r{NrwEɬr?Q V-: D 'HuTO!EZfBSyS ػfmV3gK DJࣹ062b7h ^GgdƨW7DiVt cenFpA)gC u@4bA7 שJ@p1 B h.fu%f_:9aR2&u!l#vfјRۺP$U(A)=4.1DOQHT-ӟbQY2 e_ o4>bdig҅3wm8pJ1SwocP%hmF@]7οTrUP7%&DHBțIEŖgaU%CJWOsi˞?e|BNsKN|B0'mwTk&>@cPl$ANP .[陧)rl O@¾d\ЖMZ2oyJ1K4$ƒAETI4UVcM'xۧB$"&Q-[mLa^|i4̒EK1%:BYE(;$v'BijeT[n-?T?8QRHG5BZ6.QqI\)R*Ü[>*=bRrH_|) 2xhm ,†nMLg.F`01q&V=m\"bX "OdOy]OO"6 /eC ;wH ;|HLP Թ }1@ t?8x.F:mjYXzlUr4yYP>M:w`[T4t҅B]"@sh`MdD69ks59?kJuw@3N*8&,)mVELSF)2J\JS)Xʣ`|C^sC,<Xø PYDI9BDT@˭~\<0 3W[+z]|4z 4VtΤ gx=gL~:xS|?ڶ٭ߺO }?G78.=PN Y+ӟa&lwA (3js˾I6v0#ԆOzeմ[>azܳS#QNYQ115qȒD"GK* ̝:T$JJ%_8#>8j]Cʽ˺Olҝ8= Jhcd}ݬ ?rtgz OLPƩі%3^IU)"0^xh˜UKT1A^ ?_ 31L $lq)=~3>tpa#z4Ke^.ÝClH$=5,SO{:n/͎ޭ gqux_ 9Yșʓ,2>%ȟa|[=_/U/: =QsoĮ9{'+DϿz[ʎxdt\>m+'Y<$gгNLMcd~3cLs7б]aBp KqFl(u%1,3,ç㒳T w֙'2412!Û1u:H3_U=lzr}m#P^G9G7Oh,:1HyL7FћKGoh.I "'q.R _F;2 ٸ΄$OqFr7AKo*H H>oL4.[oJ(JDVOۂGd^m .MSNㄕ;ܚ2.KlSEM 7}@G33}k" YZN{`HZj'ufS-ȈPi.JSnQ+l6|)W^GxYcjP: xddHOeSŚho?\yި;wЯ-eW֞Y?odTtwT7d !ۮ;* * { )')Ӈm#~USMo=6vb|aǒiWAO xYݗ#1-0d[lsQQTܕ',m6u sJ5d`d:^̕ݔD*[ ntqAb nIP4-{[d|KrQD1%JCDKN;<d];;-.ܔ9 2" B>g%EDwiztغؔ*1~A| ̼"uҎMKtK8eB#X fd.o͜O O=fJRћ<'YeǶpLDDH*C"C+˰q. ~&lJڿ `4v S+Nw9DB5w}Jr%ߥwWL3FQ/_~٤j{w<{g`͔/< & ai \A^ gl[䌲B4%a_De~@򓚑>ii[=dz{'?j=E ZmSPZ" ?+^U04pECGŕfO'*޹/'thK.Z7͢ӈijMmل)Z=a "|qFITvjdd-Kd4H?U*跜 s'9y`~|gzJ1 vkL#B<>X_n[fN%吣9cN%#TjHv@V~6MD k/,6>vAGr>gLc{j/^:Cw[BCm$ c|tԆm- ]=clI[?(VPoՄ WY#PS ?M]+7%(w&=NY!#v;\Ót2Ú!stuQ$<]bcx*@*D`L,U_zԤFvi#Ĺx 4t2/0tTe5K4_AQFoGaLUI!-"Hd`17o/σ)ӭ8 Ao(!h 7UܑbIWu{>IoyюN}^>А̯~% @ ,}:?; :z']t-Riz!;x^'i >nS$44܍`>wXr񦸼 ѳ]8|D_^ގ…\[k?G@PwXGFA$/*EyyyNasMɂ:FSO[$I4Rf&xc&OQ҅8U ZDy_HtbJR&j4xJ6):m[+@:9˒G9|q}狥R^\^ewuiv@ppGxۥ_n9*ɦfE#bn^t:%)Mbŏ^4Ѕ: *4n:!K^X0:H9O2 L0N5{"7az[YorUS2.e~*ZBRqKD^Ԣ#mkB7iаz?UgX ߚuYMfosSIGSNy:Hal dzrѦAv'0%>Q7YGlY̒ƈ#FBS/[))*$Xs?oi/.~6ς t~L7I\[` HSd@).>\ λ5MAY* ^:CVz4kmh$;>-NDpk,e6K\ȴ n,*.,YJ)m JZ t‚)CϠ1q$BTN' p ~ъ5u"=iY WJ=GmRE&t6dZ7C"DRT))We؇TsM=wL(BK]RT: -\:33kmYz3Ya~*rǺA^X?7sY'pn +CyxgzKc%ӷGw!\G:-T֏kv=Kְ7N9Qufc9Q5-qgbRK_ >H^Y WC#ڔ͐^qRl@yeHxӓa (s\|C_#25ƻ1Awݫ|=SlumѿJD_=yW/] Xp=m$ .^aW;^2}h:J5LR}L%)?QF9sQD?J_6I 0:4KZ\ ѻ)+% "I%Jp== uz:0e,{oŃvdd|ʐ=nB8>#P3+0%4arekuކ3; k3MfTU |AIBO)ّYNE V] rBb5w61vaiqt8ϩ j#?OD(鮫a冂Z@ &u_;!* ,~U/q5}XRHUӂ jMCtV,X^cj)0H eY9QjNL7^Bʭ x{n7ž3pozy!d-9,|@\nV6؜TWƈ_@rPs1%ױp^d]Ej 2W`Ԗ_ն>dq.^tr^xPٰ~/ٺrrˬdys2鲢r?L4R<`SB8WgtHn}(N:%/<2I'[TjV4ky=ɺV i6=b%t Zc *r$DD\\ Rmgڅ45$ۯ/9r{rH>C㛙FffcdFě$K/F!n޼݉6=!kBzxcQ!$DPmycJ$c]Tn57[kt o*# oJ)ŭ\޴7>Sףaǒf-F95V^`Q7# H}+JN: ͊q.#iyݟ8~rJ.:+5 ][݊)im&F'ynK4<&?db@η,őB4ҨqXDMԻ_,%g^U{P'X*?u-]dAn$)DeXt ~yB𔓰hr^*mq7 УI<d8LSc@ðu=ݬ/97ǬYLgO awG"9 OϒƺPwr,gdzN-]#Hd|1|̗ƙuz>˻ƾaۇm_m 4 k'ldEi Od0mX / ᔸϗ_t$]*u?I$t&.|3'X5Aɶr\vx $і 3kWA\ʼnUw<libmWKL˰C9OJ49:)l<> U\fûT*L]uy6"e~I gS(=%BsJd̀*1xAFh?M >p.ijŃOUY,꟝[M$vW %pJnބ *DB@tj,\jtd?B6$\#\@ƮcR,9-ԚsSA)}-НVp|W`/ѳ&1bBy TanvHcw\\L^#`dKC(Afn]DgW\@C $5N< *G>svtqɛ<AQnZ$Sl~ gq`g@\/">VTO9bKM;v7uXⱙoq`[+!f={RY\TܡOq@ެө=z`;G2sa$Ca<뽊)\octQw]{&.yxcJ#b3 M(z=#qGQ,2`Q=)AAl/BEz )xP/7lgز|$6tjqL-N 읬 e 9ӸŻMSZ }*.*ח(Ep!8 :@ /M,ugh,5ͤU#Hhgʅ"0Yt$aMoT%7>Cb9IX]%'.[7Ka(Q"  (H#Sa?(\\R=۞3,T~ JP2hud>@= o(R8PI0`cn *N2bRF4O+MH6;Sz9*̴}h+B.e[5TL-l`oJYR=f*?MރLZt8oGٟ! OA"b"q";Z=m78\#J@כL z jߠ$DCؑ?V ܝWbZޟPb~W$B8UJg{p-Ȫ U],Y9kKcSQ#ˀt. Iyr/16$Ԥ+ϕwUS t[cTUHeNhԕsŒ@TKp20M.}nN{)aסICV #o%Kmr]m*83 2_е_|o|b.`$4yڒkF 8{hakeS`IUSf8Wb?GŒˆ0‡N;kFiZW̻s#Y[JPT$ʏv_ldJNgͨ_#mgPAofU6_JD#? a۹pٴ7L$`kHIK<}t,v``nw;źn{&^o|\.Y'KJ%-'~.9!;_d3 FV)TT*;GgMr)  ZK=xj+WPu1L_?ƿ?Vu[vׁ>D3Hsis "%ր'^WG N{\1r(kٓſ2"pÈ"(kYw8'앒PGtW3 wAөZ|襌Ɩ@Vkrt8qqWj{Um4myœrTX-лjʍrE]LK>s B{Qx'+ay )vjKy |VT4%2SH7;<$,2zE\>~ hz(ы?qzQ 8l0,~z)ǏN&?O >?ވ{>IيE)ǯv ͏xur/?EOn@@~mfgLRlT;n]f-~rcX".5PKfW+6Ѭ\.I9 ;AXKcbł5]8X:BwYR>sC "nē(}5VR4{ ݛdǫCR5cyn@KR#(kɣy<}4sjk)O%' j)jS:u;hR2.oG^1DZ5Ȏ&wzu`IMHG3qG? y' ܝ MsB&v[ ݓq4eZBcb_;[Zy LlZXLC"l7[LȜS8dWꥼEVUy+.AQA DVK_ {{(2d જfvYk0*JդldQy37Hm0z ^=V a8JOZ^B" a&Ănw_HB޵?5BFZy?MnѼQR =[KB#t̃b&Zf))RɅ/#T΋ \5v,QJ^+Pm1r;lr]$qM00>PDf6v5%ŒAPH3 -!3IzV;~ ̱zUVﶛk"ߗut\Ե|6=ѨV:4_b!fk.a6sV=C+ʧ=-+ 5@'Dh Usx\APAٵZ\G =ɲ颼х8pHx>IS'&%7Qѣ<ȶȯɲpx5&P(~4Jc>D3 4)$ܛm{F~) Aeow :355"Ӎ_dF3.TBKFObj{;#hIiFײ 7bMcJ/D$u͆{x{AK7+'! Ӳ\w_K:ԺMq MR]wV7U$mi͓kluYK'<&le#MR9>{v0@IV6\;A(q>@[ˇSU'ePEO$R /nZPt'%3֔2yױZL1j:eZ>nv:ݦPJ,ntd513+B)1seaF!oመ>wYZq:۟z|~,c簪aL)H[+&֠*V+#?: z=㌜#W> lpM xWQu₻\a]5{e_ǜcԌ7?ExiVe8j|-]r^W?#bL{9ڹ/K뗞ʗ^,KKQ^3 ,=fr`М nܖ=^} ,HA7B"g!RP1'UNश(7A꫋ʞDeZA,&Jyԓ,nNb8bt_1N\0V$ ̦zy{y̮+M~Ώ"'?lB +|Z/Y${[$&#hLբcҧBp{B><1JCujyk- 1~bocy0iW=䖹G͜X c d#Չכpr) vÓ+KjgyNN< Fq3ubyjDo n6WŚCga2|=ᢃS Ztys&L8drzjW*ԙ Ak2] vDnCQ/ЕW D|Zų,cKRG1~W]Q~ˌ0\Zt}0~(U$38 )V lVt礣nEӹJ⓮ܗp'\#sn+G~U~νɌيEո"GfUZNsf *֗,I56qHMqfȏƺ'^\R֞^.|)9N\Gw#qU}D.ZTZ䥶:8`] NjSΛ0[VhKȳ )0r£g廧%ɀ3l%W&q[}&1~Džis:π5r Ihcߊkٮmi\֌\|ZbbFm'PVuk;2LЋ=^(C\!@ 79'˘\$fPEgs::2M vFSVAk8|Q/6V ( B"vReİ9@6NL#R+Ğ8)"{ Eى cwEgTE%@1L/8(91"uU[ygUGѾp&7dF'>XHo>^xݒG gyGO3. RkjG-SnU8}+Z= q6fU$ayD`1l:)Oi;6ZdIwբڬvKDa t!(k4 МxYo%eMjǟr!aG5^ܢMk L9ˁy B`h? o*I0-Et'?zV}q;y+wR y3*Jq* j)Q]N˜Ί6hVG,4%`NlA='׺uo7*fc'GOf޴c$PŁ3sW VǿS(Ic?&v]u ,W&?2L>9>\)C\^:̗LN: n,tAka`HaWIݯ <ގ% V;up#ᎏ;d:<Q[]g|EM$R0bƴ//:Ae&U Vٴ b%cK(}nzҀ<"4G(f{Hܩ2%i4)ƯH\rSbVΊUqC|S UD jfUZ$",.^_ryI:Y BY2~d6!%QzeFpzu~^x R"RU-!\NJadZU.@ct'^y~ل(ȒP1Ch¯BaP'f`RAɄ;F#)lWӣˋop(A\:A$=&Fٴ; %ӻ.Պ?܍rtl1eHҵѠ#82eUSU586.Ynr7iQ<_O^|Kĸ(Ȗ ?ppͫflM1 mv1s݄l"S@)hTQS;tfyD~cA >aO{ TSU48$ <|]htb:#_{ĭ|t,$t)NF4BҁdR5I|qTjVl vgLwl=Kn'2S2EcDF_d?_cahUE̼;J \߰XH.)P ԀH#&tg*=]c٪}HN-\ĎO8vʋewȀP | QP}r\ys{,Rxg~40\O6:T@˱Ҿ8nI%zLpL HE"j#j; Zk/)`Li^-VVo؄J}#j3S1(rTqЈ1R/:yc}? L=s0<c%P60k15fL_^f] D|6kclp@g<88LT j# e@ m*; ,n,\T: \\ô? 5(/|7b¿՝AWtgq9V/?HILnV"T:.7fCR25oh:[ƇfcuC|s _h^ut%9(% FR+Z[4%#( ۆPUuu&(ԁ8aBˑtx i ܺ{ >%),'Ċ(ؼVV}-rXCz UD'J\"U sy]Oy˪4S8ųkp ֓go0 &.M5!b3rVAcoCTNQ0adC ن(j!^$ϯ?B+β2ɨupryc;d;ʜu@lUW:#}f[wd0'ؖ$Y-Mq!1XsXH`tBH rf Z#Kn(ֲ3CfS$U%_ -zFQ3"fcVDoYL)%6nwplj?g+l{Fxc.Ew Pn}%c;%v.w#* k.@o0|+ ^ʅ ?W5 X\@S>G/Βfsj5XPJWpDA$8Rhf*8\,O#G(ihj"#]W"+}[N8:,CeL~(c2u[/5~r?8䖟Ά| ԬyG\d`A E1D̀'!a 7 d&')be2V¶V݀pddvVM%1NBa, ҾS9`^.8m;9̅}+pE~J;.˱Fχ&X4 eXNyZ赿V܇OF=#0pFRgq+JlU]4ّ[2N\ӵp3-Td+~XnkV$3M4C@(<1^@]j4D[ʁM\mSp/C'hpP?uv`9ݷG>sWRkNB^#Z!ԚnsGFwNsq!rvwZ[5]g`LiKh@*ڶU}Dx ahh$7~(|TfNX0 REڜŒxwC_qrz.a3s]nSLRL` j*͢CO,s `^.c,tu6[^4_npk3?If)!B;!Q4ױts9fTA b$A}$&&cՅ)`Ӵ*0,\s ;yS/h HŸx %܈g&H5e%Q>8Z'F0~Q c8#:]ZyN] C<2kb5-\A;0 <Щ6XVj5gs DND@*\1N;0˽^v ΄l-4z˴{:u ! RCN)ג]~ ьAЙP@2r,^I.#FU`]eq3B:@Aih,rM=hᢋB "y{̴MqES.#hJ;uJހ 0'ۑLr "Npru#g;ea_*CZ6vm6Wi,7UmS`IVsIBq,+!=Mp;HSe[ѵ38|evD5۟H* w>{z1a74r4T^P,\ay7cq (J.Zϴz/]>MѕuOvkFnQ{ԏtovw' `gd r@NB-RW\5&iĤefopIDZ M(i{ox7/) 8H@Lf6%9i'NTWxuP02unOf#mE艹R2"Lf7)eh%/l CO Kw*l75h[njJ\D=K&7[xEYKe\D,(x佋Vڔ%10wىqGb7^JzmFPGW PbO gfSuK} 6(92ECΰahù1FXeB~l l&@nRa7\d0*.Vi¡%圙eiWQؗ]!le& pZO-֕N)< AjJU/^J`L̒#.Dæ(9$食BG?G9A,<5Ε#jb(b7i@ʼnJ8{,Le&g71ܳr)K.5I& N/f; mQf>2v嵻UJq=OTQo&+ x{dV0 ,6ǽy\+g䯞?-MpN}y&qt9%ER?0lc)V;Xkd ^2)kR~і_̄Lau.e G=:6=ϕu-qPdhU :kI/64- (^? ߽|NM6&Q sy m9^v:+Oo13Œo U@w_y'!xWOB@0iڇVS7fH }Vh`An8t`yg-)'7[aj /u0$mO*62OBXO(mUuTLb J J|H&Y47X7QAo6-O-6r 2k>E Z("-J-\e4uv oELmX ŹnJʑc)-MR%m"6yfΏ\jH6b[#pVFL ?+f|3rÀ!2ޙ59@\ns>{@P5)YAAs(]]-4.ư`*Ŧ^՗UErn>@)w-m8M@zv /)8&v/#{pQ,"f=mLk:0OP4%iiBxgHwjlrh`dG DkD"zw=dD 6W,pgv>;(caf\/rpfNjhe#Q Rm%h e|a(:M~& aik WgUm)F1hNSjMU>MJy(.Ny;/ 3n{1g-.GR`YuאU+ܼBQܲdپ2̿O, ql"|BBՖ=rr#f8p!p+,9ꇖ).<ǯ|⻯d]\#XVD"c=n*B𵘽C 8 v`\-V2觠^DhoQRF'n8D;@ BCJ!+퐷;|)w3#ք hťNazήnY/j'~ؙ#BjǚbX{$1m!M7X2r %e9J3gq;@AýWax9 tsB ~SVPZ1vڰ#q2|p,X#*i$ap~x鯪5q*S?ax"ϕ숀YwY$jЬ`iu@)+$VY ;b!o篌JÄ/M96ԀTZi;.ڡ^\S\7̆"\ճL_%'^ėa:9A̞=X5Yfnf eJ>u? MŸŪθ> C&]B8/I*\͆2YUMBDj#S !]-pOJl3 ;(N^Bmv3@N`6mX}2/Aq=Åi0F|:|%8DZ&[/2LzFX]hozD`JqZ.BXbå(Q9WT H:IC1"X -ţ,2DiÔ۱U[1\gVܧ tJanb#¦P yIȾnni?-ȒJ v8J$<ÃmVRˠ C5DQ ~lNӐcbZ4Jm~@r%p] ʸDE,VBW`.z- |S]ULՃVJnZcZ,|-~26K")qI) dIQyEMVme& ܧ@q%U3g䐡*>B£Y2Hpe75Xrբ8Y:NRom"ӑRb qQ9ƜKՁ) ] <fi*k_]ZGmgWJ"/I7f@HZ< Q8iCZ,e즈5BGf #j'Uǽ谀 xuf8G}!*AuDั?u`­I)" B3[ڏ= V㝞{qZ7gϔB%WU ̎`EgJjL&ƦےL(&C?Z6"K^Ypgo"M)\_-G 7^2Waaili#zJ_9}rUYw*bNtߨs!QgVڼ0hl`Qp&_Gd욕}ɽVeēz}x1BSM2ʼnE(1oxk&*N4AtFoZ|O3| &ؙ{8OMC@{Af<|Ɏt Ô yKA~vP{Hc)4S";KynlD65]̮޸F _6"w1f ةZ,$-(QS|_\ c @$2F648uU)B!pFV%-uyi)ًE56Ts*cuΖ,/ E}`d- $rarQKS޾babn͙V*|$<[HyO0%rYG,mB)]\70".ⓖ9h}'Cq|!Hqp|k~\M鸳i †[Ț}řχTP3jǡ,4lJ`~];mA1FdTYi^(RD 5R:k8zW)nRLGE`ϭV[NI3^Ij밃9JK63, GOԚ/5s=5f]a8rwh>*.FnflΤutA";]ؤ{Y(Y*"tN-N#EY/سZ%Ka6РdV=׉Ԟd1*4hU sP.J!sH𷄽:l0k{>Ja;uB=s*c>gYUۛ DّRz0{s*+cv)/M()}!.x"1(p$(t`JQ2>/Dp37_}A loօ—E3 J! ׂ,FtU[%H")@EAǒRB늦;Q2Ci1Am7pA21RlfM_G6E<+ia`3ͽJba`_< >OWR8f;7şrAx鍫TPگgؠ.'~cD7|[!1=8`h{Z :E?}2ܖtw 8j KZh&y-9j;Bǻ@Il ҠdO /5lj`!bi!2mz>\enROR f; ^VW'&JY'?XcF$7Y> ӐP0)8fjIHhHZV\&@{0a4(Ew38R٨+G\[Vyg W[Q[<y/t.X@Зk2 52A#-~ &5cǞy Mu@T`,T>Fi-ڗæ\VY73F82`:kmED"zqkFDە CJ%)5:"\ {"o"RDϥqδ*m?{ 6˻%QٗqOEM^i/ĜF|g}D|'Usq BaMYgϝА5Pw`:f_X{ژ=L͡J%;ϼJlE[J:5Av>hvc_a_$U])g 2>8Q%6BA.KiN~(٦CK%:*bMQ{Ćt(|k b.8a ŴR͑ u&r6*ՠJ} k0}*q6/57(_Je "V~ Zh %vB0 :GNܔk$we iR q%{}bJ}BXR7M wZH2Z7X1v|E[Jj.]o" ,kBsw%]q4d;p!ݚvki$Ub!bU\ݙcMTawŽү{{Wj`؊P@V%CFiBzŏT Jrr˅(#`%cRt `]8lna*TjHzF"ڃRcXiK8™ Ʉ0ĭћ=XD:jZQ?[T+R?Uۗ춒Y67ӈbox%~Lq;hñ $l͟dIivV[ٱ #'hp:/].{uWQA"LԑY%kdᨅ.r>,SIg Eqa. NSUjT$=zYF7^QE5ɇԲ|9e*!bkS QRj붝X11 Pi(gyRaa4"r¯eDL 3.6@ 5JW%bct};%vn!v-҈|#bjXЅ )e ,1Jm8cϘ^9A>~YDHNLx.CKqO3]t,Z;8oz;rUR${rٴ'= vl:EcdAG(b:L[Ԭ}R:,b sUσirp,w(?L?g/'H̍EݒiiNTO T*'$&,~۲HG~̈́=ꡓdO9aPe6v0ک3Ej[Y`!nM;b=Q>MVR^朚i 7 +)a4B*x Sg//"P ܭyJ/1GԘ`==)Vز񨨂}owIcp$8B8v5'9)n_O^|K5Viw3=I/)R%.Q;&":@عhz/PT'}4qNwrCRDU Z`% UjG/׎vMBū=+ Tܡ iGcE9"N&|9 ]h{-iO m"=P̈́ ur bLH@ԫc+DJzUxS$J\x kfs7AQ.A*))PrZU\8B 63G5"̳%rTgv}R`/tR|&T%"o~+i?IQ3w3vѠH\ύ:"fd6PJt$ #\a}ֵDK'/ 1I"Е# #Bv \@(D] 19jנH6$$P ]2RO E6Ixr?\1TC 8fU|w9؍doA c_=z#v1 G"U07U=7QmId@"A(2uYT?i_:ldf~ZED0=!Q@#6G/PsSo@-^$rj[Ng3*I*U7N7l,sɹ "25g"d$Usȑ$oE+kJ:#f گhmG!DڒXSqN:`lb7V%ǡ% 5gpn7τMM#'Oc[+ h0>2IzG: ϕ<%2&5TGN.6 ڪibt+:T:8*́5bpъwxD(o- 2q'&=E8 GY`?L>r=hDϤ)EWIU=38e/SiIPPLOL@S4>V1އ.ߢLRd*ͭX2:|s*![ʴWlt FGɟ0ٕ:EH>[eW{˘83q~3o3yƱ%, EGpSvbk[easگP3W<4C*'F (Eυ v2^˭K %V^wEh G-)9Vtm oZ PcŊe?@R=GmwYLGN3f;iih/č7A!;Ӥ Ȧ']6y/$+{c,~ =ê5!NW__X[1f>Yޛ> Š?#~'6N\x,t΍H] 3޳䃌xK+U:{m2AljM2$XNNQ+9du l%pJgBp&W*j]PZ'Ꜥr9)v4n -*^UAPKڱ 5.kas>>vՇ 53VXu9Ë߉ix,?.)C\ LIL9%TN8U84i%mL|jP(VۜnA ԵڶW16&Ɂ@Ixc Π1tvo1I"渾Tfm{Z.Q6m d8@7=^53H&s?+> 79C z0V>bqRxUiv g*`5\% 5jl{$\}߻wɪ%20j]`pлn$9* |CEdiԢҖweH'{%Ȳ) F8e|pګBR8 *B4o%m1{\7AD4H@Te0pS4ͩil%L^C8~>N( jJZJzB}鋵JiFY⑑jz/>Ig[ojYY/Ғ[mG$8DYpj%8n'#wp<1;c_  yN"`R^e^]x'~v|,3+t})e$+pM1d;O(4axR%!\kCrbpӛt=9xh'HGFk$瀴ϵczba5nj+G=a uf]Us^#mA#"9] 1J8b2>n7au;7.EepzfyrF98~H. @_ cp4,Mg=uR L(2P.%,$91}"c9 ? HcКPJb)cr`kAWpobY7uP:b /Ar2o<[kq`ӹ#FLR͹uBlDI/$BpE}p?}z}OKF$ Te^pN͌'@^Ht=PtEW_w ;?s8xVk%D "PmfC>^6u}.@G*Cyז'& D0 o::!1rT}KK<~]q[I2 RQt/7O ]Vf2Ef jOK=jC~na@i&*Y`q,CqBE|mRr᳜pm%E=9'v_za3I?6DԳ]OQM.z&$31eq^?4yd N8Yz =_\-7I3-+*:b0fEwY-Xo8ΥQ:sT{ԕH!,CYzܔxƍn+dPįYrԊ8$N Xt2HP 4wҗ Nܺ'R`rUs3⑔u.+shs *'&"4nł ּt?~H<|ɽ;wyxщ=gKl#O DGM(1Ӣ:j'e } ? #oCl^+ s z,\nķ`X+HCүPb)K6bmʄo4m!2U]FX:N^׎p3a$Zj9uغ,"Ρےua"u@$]85,"j« nD vN4cحXҰi&A” #p 8vD86ZcɼߊK˿$8f9e4)NT֎za#VeVfo`BTB4_W9²}Th~.wkN441euElx'Cܞ#ឋ5;ٞZњ D5@hv_%6 f9Z{FH佢~6@9bq+oJO5/JM;C v1Oyy""-\JqVmQ BZxD~;ZL~ٲ4'2R\* L X<Z5.aTWcH54"q{;oJq:FcA&k~""XڮrҪP)M+hF@8*恬f{Zl'D* `zJ4&P^[Cp"۶[t*EB~ 2+f|0.bzR%h.~ɍԹ8 mdgiVPTu64-;[A:Q'ݲφ !IЮz8cyz* Q#4$Ed5=WLs@TEblX42r qk/nυdGq(h;]k w%Ha VG Tt]1P(y|W*evܑ77QsMhMH([͎>.i(4QZx/(2Z eED2٧ksE9d}FD\X%;7H YgôYP{qc0}n3+T"9s^4+΋!F>׏_=y}Pݿ-/rH۠$v!MOΤsr*q iL:ܚz6pQ4e,O0FVV.WLC%V:aQo+[:Yn0S󻧧Td^&Ӻu4l2|^ni}+} T;xw^niYR-,˕qL6ЯSf?8|&ݠITC_R:Q.V UM+PW*؊VnπwYJ Ȝ+U0&-׌VKӅF!Kle$ "v0S >6ɡʓ82At*:tB 3;%:漍4rܰ 棋F،̯Ef2Yv [ sZ*8끔Ɏt gKW޶KO8tkGHA6-] n=\W7<2q[C,EJ u* \$Iq4Sf$~2%Ypi3>XxGҰ ߁LOB?ciM$agIAK $n< +{uNBw._|'M-o 2/_y1usO=!q·>x\=\sxjyrU (qy wЉ(\HE&MH8h&O}jp7}]|䂅'tlR:3 8UK@Ֆi]G@02˱JjiR?0&*Nb AqzǼrr|n%2hѠm}etNu ouqIiEsQ!%ח%mv[EUz@En`K!90%JKQz%H!IFZ-fBuuS)ЈQ7ᡧBy]+iqWb f.[0-Qڶ4і2. $}U hv8;qԬ5?SkMQG.վ21.L`~afE i90Q4G[aE&:sf(iP@& QNi/;SG F=MN lY1r0wj2~tbJJV=^S8%\?  r]^RrMr8D,(Dr"i-VD%`E5+./GlzrynO|h( Hȡ2Ppv> kVSeA$Eo'"L\ɓsaɠ͔[i𘫰6XyQ7\DP+:KYRK#{\bu<~Z+xWppHW,EJ歠o/xn!b92$.?ІuyKt ؿtdz6q:&?" xKiآBN˦k۝2005c?w(BHWmHc+LYD(/;:NzAWW/|rBӺZb<9 _ȳgeh+ ?lKq#0cҔ&"W]\}T˫{(.i.9.gMAAfm!iʨ(gl"ūG:)R( sԄMF3lpr4"æUGn<:eTԤrH*`#,Yk_ǜmvKmxΟ~n hutKYZD5@q3TƀHׄh6vGUpf d겮Qrے: )J(y `",6*n?"l# &no,+J-;A9PtT&on\猻Z%d3U`Ӕ>bzaW@ł+E('ipP涿!Nu\ٲg{`0-A1h(Jve'ʢFRp*]+|0$[R[9 !PGF7պA|Eh03avc a#N2㭍<:e[n4s9Rz`|d49( X?5G!gf5MT}Ns5G"{څy$vƵ@%Έ})B+Vf;3>V%icRx_k EqUQui\}X%HeR&J MI$uQ=X,ep V;fvp9R'M7qf] ʤ-Qt/$s6#!J2u}}|Y̷IX3cGy}HTq%ۏ!T6}m$t(8b̷_INTٍ˩. 1@.{b6ڏJr8?C n>V(IGŬhgO QR2Z|%oɬ9v.~~'VikҹG+s KDЋ&9@ZhNgdmػbBa؊6J|^ JL;Z[Bo`2ҽY-{=goK\."&(a0T^6s8M01#[h;c|ca4p*VtmdC4]<=0)(y{ظ!Aw/(Gb| WFNXMk  Y:G鎐lq9R5'\AXa;0hʑuАh[" Zo'kNR Uwz TpKB3V|1r17d9EDAjElq:rVق_y(ǃ(b]QʆEiS9)In%Ø:q,%~h. I%mҠY%Gv[ м<3颌 J qβKs>L6jSy#4Qda$t~$)KfEbE:xmيv "xI?Ct̍7a[3n,8vϔu(&iRQ v\%2j[;OCpO^)VKl "jSd`ю'"WNh;Ě]3j FF"SUL*/DS($GM/S#o@mv^ b&TWzq>5HT&l|@J?#.f|^MfSn[ZOPҲ^D5X5Tncӆ>FZe[uڏ} j[F=Xje "V]1mK` 5eԉDLl ҃KIP.$߲@A^Mxwk)k"悰GD,tIHr"T[H߽| ;bͱ$˭\rD}Te*|zJ~MЕ*e:DVGqI!`Qo$$o:ꯤ_ɵP 3`yp\VS9fĩ(H;Qs![|GN߼gq:;ɢ`9:(."qZ1ٴ_z[M=" >n,Hf|#mS݄i2l` ՊrXվ)/UMb_ݙr)oxPo+0́ PYCf쪡۷T>Whp o| ,r%2f}V"b{h, IW%تO"T[?k\E [9rUWF'QIn:dKGn$O)pC͠Q2ef-P{ԟ-GɱBUIcL3 d=+܁i|,2K)) hxX%V0{O3?ڵl*3#Rx!hL"8!1}vk5>) !/ê>q|]xل)$$ʇI{*]5Tմ\q *-@231BBSR@ф-*϶k.ŀ㓆-K@C7hwwbrIlX=k{Ǻu =)|dbS ѻ NTC2F٤aHsRH9^vҝK"Ea]}${;9>&zͤy$d/<JO\<{|е-D$…ԢC,<:*=W H5uV,9kÚ;{W;$`}j鵶4Dr:g/΂\>k* F,vAB a]TUHC?;97Y0DJV,q/ P')lf҃puȞH$ڂ [99޼r)Atb⽯G^<`e)2$ }J OQ!R4]0⹈}m IA"F? vQ) \W -v!; W8Ű9]`iNy Rh5'OKnHB>`$[ E$ل3NАpoV\ma5)Z_/7ڱL846@p(Y:_^RՔը2fƬA equ*삖_VAv&79%..~6X0t~\*ᕞbʳa]d7$U⾕YrZ VL OeSOVba2 xi{5@ِԫwj r]76MqQSX*1AxLuPoof1I\e-' ~U#d65? a7`מ68i,P")wDnupPSg>ѩ"!Of)E喢>[(׃̵QfE.5D&nJi#!,fu8uH[3K HŽL%BP^3w/zʹZC $5ÜjP-1(oL !o.ӛVrdI6`j3p{_8Q[C2otKVTꝸ ۛ6=$a_F۱M'RK& j$dz (|hiF8BfֶNO W\EfmjjV١h'TIv=ܪЙ6A7aב&){W5-piRJzԭږ'rJG&_,|?l|- /?'ٷ}X>8* B?^5sic0"-f+i+X/ߴ|zƾxy4'Qr- aO"4sZuBYftys;pq:aύ5 z(ݼ<pĎs`B»!/('=*k.e@xH4VIݯКؑ_ѱޗtmbSi@Q5P:6N6ם68#{e G gV(u4WniaDq:rkLq4P 6a 7H|-?ӝE*??"PWj}Xk] yd=ܹ-c@fQ m tH֤K) PT H RWA6@R],1xMٴɨף4A"4$([E"/p=| M/ j'4ʉ?FYiƶSHDuc[w&Vh!i8\D Rj&řmM}+*Hr$!^Lq 6ϲ)&fx(yGt3^X80*d4a/fFH}"wV5s(60.땉a 6*X߬+ڌ-Rrq۫2} 5= 겢{;u.>XwF8W!o6^ ƕ# ߠ$1_e祐ƶQ'*q_Exi3ΥY-2gE_o0*{}bإ`ִu.#hp< :8#gSV:%ޖ4pNg6qhwһ'C p a8Q_JU uy^MEr9[Zi~ Tl1̃=^meX?DF"/53u&ԚO4~\NAr A* Ɩ Qc7e,8XCgN C̡.A5,RC$R*&.?N8.Hm'4n,w&E*RJr{0Iv k/Oa?0z#JNFxu9d9sRE_&e Z^֞ f86{AA(ەf2a~Z„&t %)Fvqj}qH$oNʙ]/Kw= #΃XI* -ťQYPjչRn~G xCj^ }]7L:S\ x.mh6kDpJﻝ'v|ŶޜH9 )'+ 쿬7n >7~ 0Ѫ%?\ ߾Lnxyy1sH!)+ uVI+T2uiJvA[-;*,Fωx M*/l/;?N(nܶD{Ih#8%C̑9+ibo/Xr5N}tfȉxW3G "Շ ;jR{ɴO;n9@0g|*)Q S0B(L}|N c]kRRpqL;O)y;1Y 'a 6˲Mp:D#))zIN" +\vH\3&GgGԵ  K>z^~SA>E'#}Vķl} N}K~rHl7X)X;xm)m;pՔWAӝ=9SM/@]a X$! Jv,yY{;3 DVPŬW? 2 06;;!EYccc!k4!qL(YylN1VH-{~}YHJ]$:3߻߹sH.:=q?4rx>|Ze'`wk[D5ˁgu)i"FL]NzNݔu[xmqq,g!Iw+?Kb Ff{'F{Gk]vM-ZYKQjlbfَޜ(dEQ\ZEO(-_@*myIbv/ǫ'I&ɔ ບVk댧wJ䌜1BTl6ٶ눔TP鴙ɡD3Ȏ}".X!G)a&L_V򱢅1\B:XjWc=\) cVf M44#M4YS,NH,Bv/H {HB/U3-b,,6N׉`0@Rbb.W5$70*ʽ] Ee>¢{iW.PeQbf@0F/<@%N)j7JVƼv Њz .֛PP`ʧ5؁VbDD4W.v &"ۉ 9G=qt{ >RTUxђaAЪt+ɁS+UIY>`o<:Pn0=5 >E#ְ6,ST ^Ytƍ"=y,~.=yvT KKg,.=ғ xf!8ALO)7'Eԩ?qdIHy]1 w4`z^Xe3gJX3gX: N?B`gp==h<{tgzsJ,5`WgW݄fzng)ofS ?Ep9E@?'>u3Kgrq꾭`֟JYY'g<8ŦAzPgG,H)&VQZRLfX=Gscxx/? l_zwSlDQ$~9J0+Wo^w%;3Σŷx4:}TAG,y!'ܘtƘ5Kw '*9[ *%.IԂN*~fjhYhp{JJqV ^H)Pb0Z+F;䌯V/}.i$DZ֨{z߱&Q oN02+?=eհWNkq!c/ɚ e>r¾ ԀS}l4 Vu!!o3^1-#^@ar#"pV$Yʱ3HԫZNg4uwYӁgV l)e+xs]bZ9X/ w͚]2i7v;cM4y\8\B#j|oԇAzZf@ W$sfG)s4 -ؗl_s4dXTTbP oou5M&KnjP) ;)cR0GS{;s4 HFp+l {8Xc*ڱ5?rEPrdhVkgBgw$;qW)C-s`)ie/_O0,@$A /H`p"!S&>  )ffNц<{(gf=z O pRN-5NԂl[} =5j&hfn+ N?_:Mu+`,6CG:T޵\ 2n)PDȜ.2s&n+%0WRP9zȭq& 5F?~59ªr,`yT5q@ka A0R|kt~(ƜA~/xvPݫDt8M L Ҥc[VYnpa(AMUscY>Św6zTG1bcy!`QNp$;u+&Uapn 4HG~NPLfC[~b:$X-*L Yx:.<21d\rUf VFZ ,oa֒^3>ܸ~36oN|,̹qަv;W^; de6AE2V?/"wt=^>WR &_~S;x_r;9[uSMaRbch-2yNT8ޠN9vdd(So.O2la39JؙRy-m`^t7zhH9 CVV>+i2&riբzwl#dsGү֑#u}Pҧh vم 3l,?1汁-e/GlO XHds1WxMW|B"gjŞ%_q0Xsl?ˈzK0Q\Y%!5sk6Jq^M6 ߚeUb̀ ~Z^(Ձkgcyز:uFp=3ʩ زq| .ŝ)vgtTPcˍgH3_<i)v%\X7#}FqY-6=ϳܲH*-.hQMn5G|BAdd2ONիz{uS/S[NlU¢݌ɭH Lgy%mڃ!j s5g ?έVk>(o(6l. Gѯյp>j0b@$ыv8Iw>㪜] yi0x>t51G;Eu.)'礍Ԫhxz޾^j.{^i4y@UI([e9up Pl))A^ iX̭m\"]}Ԣvb"{XD^ۺz[Ͽv}˽{EPb ^pO b0_HP.F}Njsof\Qv^%u8JWױY_?t<1.q/K~[oOÙbU[,nw]h#4Vmz՗ee %ϧ?IzL}ɪYxLpʼ)RʪDDӻI@f 0:P{W(|,x ՜C$'bliߙ JsM!LƪVɈl=vgG/YtV*^C}z/4bnM{)3~ m ܠ+ʓv7;ʊRnlZqIhUUufO?,Yz@(Ȩ wⷪߘEJ!0 zQмRhʗOuvRQF)NkЋLHTČt6otà z KK)YX j:5mnwy^UN j#,йt3>:Υ7@ f'I%ĝe[AfTbMFj i|xm=rXdI` Ux*M6 ןt_gPq&v*[-`x0=}Av0tje?g9aڏ8]xw\-{nU;(/j{gLlvdtY20BUVEG=bؾ;iUD Z .pE<,/nC6'DD5[qj6MzslzXg~{-ѼJ٨ɝqђ6.:G zZ%Al4hOI^vIM-g+\ʣJѩֱD%~)^0| ;A=q~sO~2-.c[e xIIkO);Iµk&m 02ɨl/#ѥKh>}k7m)ap).3%l z~ J9U"S0Ew,H=Zb[it(!D ݠ,aq ;I7Z^A4KO P0>lp9\p}5 @-RrPtd!vx]AdGGf-& qy+R$BFx/ZeXcD>~`]tǔɨ\c$GnIVdOәCGliF y>-{-4㳃*-^IdI:gS*FIS (^ #Εqb?5RQh{zNɝ4Bx[[2_Ln8wz_̡͌kС6/@Erf VsLw!g+b?Řx_UJ V*7zXX>LBdlʌ~W(qhF#0D8;; c;as ЪHఛBCND5Pc%mĐ9#[ּc$lrXa@xBɈ6C1xf!ܐH^Gt10"3eq?t$W uWQ J]Hۍ*Qnw4a!?& 6¤ݡz]`10+Fw+\gNe^/ 6tP]vR\AF"kXE J7հ: U:co%6wVX.1'o$;rVa4 'Vcx7;qyyʚzy_^K/\qnk7o럀k͵+͋k7ϯ_V/\}7ť?]_v歋.]c _BA-̏t᳦0P~0?RJF86X&>GAOZ+ۓ]5Ph?q߰Uj*Z>@Ր~p Ƥ34<J6S08]NBqrݦAH3c͝ fb$HZ6lH3\yk(+x8FTt;۵`6w!5r&DˋxB3I)&f;U˝9NV9&K)qpz+~Fn0hU~]K\(B1Xh']7 pt3f\v^#^LL|}g9l'k`)Y[t`HvJ DžB"'fD#N3m!C#Х.2Z&+RP핍"mZ,M#p`Ahb3xN5Wf+50Ċ* XB:xu0JCl½,pE5F]h:6ԃh&VY zӁjXihAQǣ x\68TU zL z!DQ]"wGUuTRۈ騃:! 4~;.i!Cu@]y^zp9 ഩ?dpGv17tO~=V6~&8@/ ce߽ԡ4V # F&w9{Ica+^c<_ XV ~_y')* V(/p`UaE,4EgUcRR;bg^n`_"KDd3ӤM(x Τtu[+Lѭw̑)p'zVyZ]-_`jŸ"rna'a!=_>Y}yeS"@+i1`;ˎ{pGu*Mg8% I M;ճ}4hړ P\ow.oCQՖD 4`*7ȊMD'uAGZqcW`su2T!h:Av(e O_BJsUF(k̡Rx1.-0NImUW2v _6-[ (H;zmGSq.j!8 L spt X1oi1[4>jjC/!Gr/ W3$]g?ӮycAm  U; h1X6Oi0u0\dTw`p3\mpLyGXg0Q 8qLqȪ߸&+oC cS$I¸UcL5j}paqd~\ȐU&I 68k*Fe>b _t]>+>NDG<I>MeWt >8Gbd$gmv|:i\2=g |oq3I29iUmS7=;xbܦɱP橡 CC'@uld{J ٯ9J7ձqrmI[x~蓦V,x&qa:TAӣTw7|93zBaH 8!dby |k.B`dg:Hn^-0ic2˫lXpn!9ɩZ0rb‚wS4V(\ {ۡ3=4qRob2x]Aȶ ^2c8F1cV+0%V`>#: 7<'uӜv&6ŁYގ|z9]c(HԎ%v9]2' 6 跈42LO8+J F<8% yNȔ3lԂPWd^qXPP6!ovl2m)q|U۴#ƺL140ϯPT4v"c)_R^.Ŗ=*&op$qCV*㤋WLWȗ= zxS$Zf M͑Un툈0m#PvZg b?캧eK3oDW+.V (GeȔJs Qŀ#*4iBPcv՜HV;{gM(9j)3K;\i-7m`:cl&+5%tOd7;UtԾ2z^qd0 pj--Kg`R9sm65bX^"n!EJ xk:$XdD=a5v+AZ-u:DnYcns]Gd6z#mX;-&UĞkA5ɑ|v$RvBx+\[ @qMpq׍%5J gpFZWU 5x0oY}dqkir/T )[ddgJ6;QSh[Wۢ2A̫YRSD=kE1_y~<2? |4W1fv*"UǠʻpU0 Mנz͞cth;1 c7'pvDxhFӏrm1TPԛ"0rh#w4IO0 U_}_ð Q"9`*3O,&#, ]%d**ʘ4J!p0[Yn)B U,`ɲ`_)p1֔<rѵKqdBhbJӻ(g͵ϿxZS|m4 C%W= Z!pMf YBbvć={M]=|}<l'b2mAIVMdE׽K(98m!i$J2s(;B0CǢg<+ D_*cSfԺDhqq1#~ Ӥ[oW Xӗ }[麌vm*XJr6lmJbpGFu9"%^{fh>h 5g1zESӶ,©-LJ8$ ޤ;7M)1,|0-A}`^EOɒK'VY nlOm/4ER h:'ØtVK20iճ}l8T%n<- vZ>|Ly;k\;swPĥ vl&5{vv"x<ɕeƨ`3Z&QDs۟Mbpx+t<چ%t @s탓Bcڜ+!I.j]`"<E2p>i9,e]=IEb N.r$aBi2\nͫכڕC3Hgc0g[iCnO_[ ²D\d8u [;V=;/I©N^9w6)0U,/}]%]K+ co.9.L㌭$/1YS`w+g3{j4#.0dffuMdC(, B84F}ajlp86aG Iٸ`X4 FA˨`њ$F!boJp$Ž24}41 oi1<T8έau(2H-@鸤q?5G\ӳͷ%cھ*"u`RW )I()DuN)jK<XV!hPFC\ ﮛj5~̗[.GDܝܢtlQ8x8 a~OX L%2zj݈܏ҞCHؓfA ĥ+NSL4-9/Վ.a+გĺ`VQHOO^nq,B}+B=vLA ,#Յ]< R j"GBm2:6M3tO\dَDh؝JO)TRk {~d^ŢV,y89Fȶbω 9(2D#ꟛ ƩeK^*0䒁_]KĽX(ljG`rêElܸK5j&Bf}w-ݚ:TMKxяp TJ| q@۲؝-귬c,J0rNxK i8VXģ~P $u+ڏ['6!bC<9vyEfO,$G,vZP؆Fe D,ŠsM[ZrjKQ:[\!ƴJ`W lY/PMf&(JؖrN Խ&Cl,ДI/NZ ˓AK) Kɺ– 'cjeӷdQD*sV^܍\X1Uz̸zX?6c:zŲZ*9b('CJU}CK\PK>8JEM䉎zUhWaLXgԭ@eͤJ**{9VO^GC1`mX,8N $ ^]\v|ng'dm|vvX<?'b.'rXRiKˬ՚Aem"*1qU~wK^cAKbɈLXUB+)!ihAXx:AUlpapBugsSlE;^AQD`s*({Mj؉GhӸT`Wi6C,C,~W|?py1x1>"R?֣(c-u*L,v+Kh`p2V 2\TL.q ׿©bVıv\SQj*t^tOCt18u(UcLV w d$ jŁ1%&9Ry\#4Ɓ}g^rpwyXNsRXخ0K L[wK497 $y}\$/yhz)TqRStqFp)pSY#tםNI>ˆ=(BN: JI,nWEw ei8x튌F`淪vI#-{v2{CIc)2pPvF;7QBrn!ail'K\/?+7L.5!:i+_?g3~}6;%t}'S2qVl[9dݛ#7"c1b M 8GeCAU<%$+g5ogsblQM#&堥*K :Ll#[@a5Y鄎Wp̹);ZM9f8 92&r kOeޕ|xhsj&X*@`4贍JC~Ѱ@QôC^E ;+}{ڴNYjN/)~]ܕMI\FQP訨l"DM% = h.g4i=a}(hiu S@(MRzcբM-;Ž7r+;JA, .%Qc>O;j;–=Ue[[E7WB27i6fsZٴk@65r@er%Ah wQoUi&:VL0z:RѲJAs&ԛ IE\)J98ʸb\,A ښc< v`ѯ凾& Q>uD; j?"]"Kuy28TC@ bVqK&mwXw CIٶyLMnȶEZ-e)D1osOm3ӭb zaklU-`wȟ\̪i혯*3t:*Mbwv/@"S:#߼}T{ fGhL92rYA-@pYCD\K*5tmsݥ O#y~H3HD ܏J>2*lx<ˁf*s.1$1Y()Ԏil3!&PRD1L.X]o)kTQ7T~Sm;/mN[ ۔0=Sx߆cefD}y.i 1%ljL+G2CUHG4lf*Iȥǧ]sꑇ*8v˝#^bA8E).|ϸ RB[iFz=UNcef>vӾo-:7,$N~QJ';=;[g"w$*79.:&G0 GjOg>6M1EJN!_x8eN\u;gi۵ch:('%0)0j&k0F.DH6a('Є֪cރQVa[VblhZzi,a&Ysce6 Zye^`fCbHõb]i짇ɣLHe>*YDZI#8zτ䬅g!(=/soW/nZ|ok]WI;8 y9!?rgIîC谵?e7fxQ%i%K1ӂգ7(re71s{hLG޾v9]K-g=|FUOgg\K\Dw-1ȧW5%= ]WfYytۀ-49ǜܺwPIb9BĎ %Uf8h2ïH7JEOUk޲E̺ə[/~Bmnd9鷧 .-tLl{ۜכx]AQS'- ;WQ]ec+y=vV4ZyqVHV^R GW`6 KUfAճޞ+vC%g5ڡ/ !2R0= 9^ȵlO^C'ZyTTvU('W|!XVV \1Ⱕ81Ѳ( -% gvǞ# %nǹo*vKƅxg|no40.a\c`5N8ZKƼ!at;EFv-rMvwG.Pr=\6t,Z;n (Q7Ie46N;$Uv%osHISHѰީ-jV\,Z3m!>n 7+btP^H$IhYB%[ a?){5Zfx" f: %#H'T& [G+v -NFMJt,5ƃ܄S鉴ӈ=H{T$5X&;;VzILs=r}H(‘ɶp<3MG*{gB ]϶(}4hqH8B0Q5r(x!8?X[|"zZ\T]e&)1hĨϥ`x}Xoэl-ZdKsgqr#0hxFeɮɎzlRz Q7AXY ~cB,b_=v1!UI)"o˛낣LFrg)@ ! ])"|p?~q:Db`QW|{Yn1Wg~zq,j=#\Ea+)sO;qM_ fkʬDbG}:Pv  QuBF!= ٦Ii}3w mafHI78p7օ z޼1 v`":{(6R]P^KPZ[8pTmKnZjo=Jٳ-h>kEW-!E,;:$F ›# NJ%č6Ȩ\Yc;~L7…nMjuEEu6y'9>w /TxV@-+a\,Byح_7DP13GzBE+fzy[竣}GND'B䢌*L.n%PTVb1@$/uΕV >Ṷe^lc111S2wV8N3ŒM[qjפ48Iَ66/`Yڙ`5m걓隖1-K7|7#'œψ&+lXg_ ֽCjeT"Jӡ.\Xq\:~Zի/=51]eXFn5wns 3; w067\u~~Mͅ wk׮^ټz򧛗֯߸ٔ!*ƫRߘ?G3&OĨ +~|J?J5 ^Tn}Q(Q9QԃeREDSܔWI`/ؒZW?mA,YQ9D@*֪ S - IVVގ<]E2;P$˝rLa2R"p0C90DA{2ޥ{lOvw)e7CΞԞM7ʌgFxqyx͹Ԭ_xuc. S'E좬Z*]hFwQXf`짇ۃd$G϶v1^=VAҋlv*_WgضtaX6`>M&_쇳-A; ՕWFE "6!~ofFxp-uVvhF9DK`ͤoئ: /ᰚ$xp,^ ϝPQy u53,4d]#o/*Ψx0|=4rUݱ/d10%p럸r:M lM払_%KoZht>~$!"f\6?6Sf~)dv/L[)9&kZy>8MQw{WQHۏ6J)?f/NA_MG"dc%U#FaV )f=A'mǕL湞S!|L Gܪ^+T΅gkHT.y]2FJ"㭜XIeٲ B[kq(Iyr (gM%q֚/a6O!-Qy뱷6nnlT7rs1\0b@p&J S c|Xtb>1ϹZ|R1>R 6@49q seANÓ* KI3dK-yѦ}ds(d,Z459}V1(+68ܼ:y7h^s=Cc Hnhx1WHIdH'8"dSY4 PtK4Yi&WO'7=q阨>ڣdq{s98o4X!H}}%Pt_99bHSTzTh,uwyI!^k 75.(,iیf$[E/lcq{g0G.yI&^> \K PҵF: Nb|;j%T 3O^rc'^VZ`GQϠIP&!auط]rߞf~NETvF_Dceڽ=xG(b=A|ˆ uSq@!Sbg$a:).'25q*5䁍ViL eBr߹Lʪf@SdPx[#)1'LAuɍJ|py?Eݷ$xȗƞr 3^o Wp;MvݲcjQٯ뙬 nE.;BŵuxQ#H6]RH2Q8ݏqu6I=;<]nvS,ac+7/A[kKW7D<½Bc8ب]|Bu }J8Y%J`l`<D\ l3s$"NcҬׂIźS!Gf X0&㕘IElѳ31HٳA'<™ Hnx'׮O5C&q$-qu)rĦ{uO0J{;.%jxQjԗ ô=7ua8\V2AE| hMg.W?}J7IŖHJ)s萡gMdIv7vu_^K/\q Oi[() o{ܰ i)Ly7|j{VF.5MYWAfOCl) ?0&FTUϦLn?E5> &J–'J2\fHsύEwv=r$QjN7&:R[QRN@ M GgK1`^7pݥ'bvSjN3ÃٴV1~]Jx<'ܓtDѣ?@hQ8 X ?~f+㽅v픞L#+dKHiLt{dfQ'= {4PဃjB}5{a#wj͌WwgfH#yE4cH(U= 篟psz'o]3܆P<$zި)aC/|"$XFIrX9Pxd1$.vIo vEªy L PBoDܟ b!ew},*MˋH $r<OT!ἦ>gSZ*@@N .ș5N۝mjf1x> ,VOrH-zh^kGZqgjIF,Icª"iIb3Q$`,KUkRVt PHi9-wH-EK9ڹ#+Zp-Dm61Ya6A5~-}E[=\òf[\c9-Z>hn4mkFJbi&5JN\}2=;gCKnp 0~4m1#lPA.M%I3ڭ/sVZ%uP;';^Y3éba-]Ls滸ivƒcyQo7j)yca0?޾dXy(W] ;IC sgrZ Rx‰9$w} 1K2V8{;eϳ0|~̟|w6 9# Kr<4L4@h;PG dá%hq#hRN.D*nC h5V;Za7f35> WW7/s{rDg!+3&ـO+A-ts,y^mP~S|t?`|Z $ĘcNl 7y= yA3Ղ3>c7GCQt>a{MV}LDn\RyleŲ1Ӧ ^B #5"z* H¨a;Û7*lȻ'ȍx1~ G;1rqqƣ[)CjM">U3)|G_+&B"`1WU&khэ$  I "4~ʍ:uddMڔi:7{*mj,ֳCzJl(ڿl3JњI^`FLԲdPDN&yYυY{PdOWEyR9EvZֳj;eh0L !y^we )diCfF.c&1vWh,U\6Sn;@Jz@TUo a?3 /z:T |«p)oM3z ɰw0<~ &P[ n{-M" [ Qp 瞇mFP&b-0N*xK*SŮѣh?T''Obid6M%0IMLP\!39]H~BiB}b[-&$.cpU^ViHQ`IhQnm5QÈH08g6O񂈧:B v2]4`!Ѳ-4<&6,aDz<4'bZ_>9RY%*9#&̠*>sb`کHU>3W:0V3ׯ+i᜗H!HP 7{iO99b:Ã3ʔ1㹪gR3nb HGBD$sMNLGeWLT[ Tlw;#v ̔ uu$ШX:,hJL09cB~B*0hc~(}fj(!:Ԙm9͗b"hH7sF{D3'ZF ϕM 9 xt}g'hACR,aetNQkL8Esɔ``1spMv98AǙFU~ys;vWk9Z̻rTx1U)l])˶ڔOK̪$ t1zgi.]6?`K7^1Y!6d5fői6 5},(Tlf8G Uj3{<@ ٣I³=.aJ87>pJGMw _3*n+TJv,1z.G&[3lg$yAU.{nCVrM`rhHo c%T]B 9ms0hxŝ8q!<-$%;.lU)+=Sv'm[U3YѾ’wڵhO:bd)"%-4tULa񵊆zfD);r)Tn՚Uk}0Y1H;FY&dקt]RΣjatб#Zзmm!ټP2R" c붯T#.nhU:lf0̝G"ֈs?5TXD萜$EaW5Ή)N[V"M_Țj+nE_LYYs`Z=9UŘ E'}):Kw{EE ؁(+QfDՊ:QˇtlqC&U-~bF-[j[HbA lzJ %ԃl'߳> 7WF[IcF7d"< XY'"12{KqrC'NA6ׇLZ O#ffYtEG]FY'2c4<ơ=Ӱ;#Zϫ{á+S=P}(d9(*}NK<b84W5W@tDפ*2DaF5ob1jOqՑFU3 -aRkY`Vf#P)ygy9sO0Ϗj.t~E k֨y84z&El "p~L̋2z)^~IكE~l"3(T$ N$ v])"\eEX$9=,{4$8./=>y`k tk{3N0v3:3WCMJЛdcBȰ~񵩸o}Tj8Л{N?̅VٷCm31ѫ鵹^5759'eG<`\>'ћ;it>Q8fd gaN YZEZyRBPiqˉݪ28]H7EMLJa0`J2.H=q&C/\Gߡ vsP=R|np5H)Պ8V|so7+YIlƙ:a(2c@O/R%$^x얍|ƙn)B[NM_͕ci/֊ $̝tSg- <öY3v fqktoh" BaOIJl.t"<37%( %Qn u"'&bM[dwoTb!˂q-θw%a20QO҅ n]OKzbې\ ŨY7V ;3u+XAvTQ?.8Z)x9}k2G83fD/7Rבu]GSu?hkĚY*57v\kv4\9*{*sE:Ž*lѺF*Fri)exTDܼNa @"YLL] DESxbU˷6&?=, !2?ңxd%hpr8E'+NRdW(bLrXZ,p.-gXiͭaޖqL[[6&{i*wc-1t*Ꮃ0 _C^@,ap.2}[mW=VuG1#2H`dnWcx:ʚ4>mqeAVmٴ#R^Bۆ $m?,c#U1Y$IvHc{Z~7"6&XσmNc*J#L+1_+5ER 0 v}rU)a+: E2o!g[-;;T~܂(| >b昜1wA~,xiֳۣ)%{+Qz'%dP%!DLi~~B U~nex^HM QY 阩h[ zeYV>J'%7gV6Qfmρ/m\FVSft~'6C\bg]2Y kRV/l 5qg^4m\¢Zpq:8Z5-bP?1?ǹXבs.]7M-DAg&'hB L T:VӮP'.`pKӚёX!&ox ˽λ]n:c!#,iȄ=aŶBQ`N|7؁$0>3 $1_VzZLsŏ (GT!aB6BLG:tt &7|$d5 0w 5׾pP  -$!IN5‚ @,Į,l,:M5fh8^^b ``#@ᦗUT ƱL`WΜBlWּO5ƄRoKi ;&qͬ]k΁ bRMɧ)Ҫ 1.$4[I~Ԅ[\]X: lzIaiϧ睿ا:ov "ly-޽ىޤ(hc&Iy)"ۏ͏L{N cN+3kun<,7=xj!r,קpKWr(\PgP`cӜM{ .8XbMQʂy\ 1dJYV|\vz Q\Ksȯ,l] -I!< X0pL#ٜbuG7dR`SNJu2LkGcuzfFU~[ƃ{:WXh"8({ʋS um&'W,R *: \66\g%Z|D'78XW\51woƔ{q$]#_wH[Ɔ@DIxGXeRHgʸj xko03|U`.H`e*m37E/Z*LfU_Y`5%Az}ŭd\YkÞ cn ^ ipY[ZWQH*aGm.5߼oM#3T^Ӛ4npooV`/7$ҹbIQb<,EQ([iGE=H9Z۪ZC]Ka4Iaa_dŘwۃh+12wm+U{E=>~KYQwZîf]w cna !'NJ]Vr vdw- F@r~NGL[FF.ʵhdk(Wcy3z84Y<>"S)Y ( 8`x3{~~ ]~gQ2aٙWgņVXB~f&1WJ|0jL$}"YQleq!X*"Q$襥KDJM0eUӕh4Q>i?/-sw\u 䩰Ru󽽓t-JƒnwPS",g٠!w0(gűEG|:v3Y[c-IcV-2ǜ3j2p=н OX'Y 2h1CAq0N δA஻3˾%ʶ¡5v|jX(UNBN*w4ۥdi2jQTWgENOnaO[waIt-X.>a5=t8-& [<`˵nVx@պbx㺔w(^@ szGć9\ѭ@?= \5qϠ>tMn'Slq ~.=yvĿ3K KKgX~# % A~qžK9+D7вk4&WMK$;lҵq{#`:Kgs̙D`iYZ"fsuVYVKɽd"6A u$xM.ھenw? h{hO1luw5RHg81Aȫ|@RհIi]w:HWo֯\Gi[^ڕ7ׯ]z%_lSLVxgK~!1[wL07xNww4 ]sz1$CL^6覂AY <ƪ>Zc? W0&!ɚ51ehV*/rs"fVoW=v< t}ʍ/_]y_"j>׸3j;#]4cmrlL) I=[˃9GX މLLJ[ך>f(TIBd-*\im DmQ{NnOmi_a~9 aP f4a!ՍvgC":.hVp5ɎLjr‚a9S2֌@ 80"ϊHGcۍ=ܷEKCS+4a7DT?gOU~y5j6EjLrs@H]0OF$ovvbH&2Ѫ3wZ%*}ᖎZ*1&0RQR=;61[+uVh) -U2pjEa}6xьnExrꔊL37gwC"pA!­lSgS-sBNx(UD]a>@Zμ f00X~/4 *9+lp6ks߉ `e歬t7<༐?h3)Z:hO#Pt6u9&l<*{(1DEa+*:z֘l64/X,83Ѕ;%Kp4l3Io+VpYv#oKpsʡ"}>A qAoJڎ) Vߦ&Zvmdhb>ENj$qp^r3+?RnK*1_+jQ۽v| u64l>:ì"P 'm\{0LX-f %!Ily+ ڶ8+1aPW}ж1%(D^JBdW"^TlXs;ؠNvrvdKZJ泓5Z-?/$))U.u.y>gc|ٸy J-ySKqM:|ԉMw]})vLZ M_Csđ"a5d,PU6\:x^~LE1i{iVx=WWc7>~mN6DRhu4nK3P^G4bq B@"̟ZALƤ9-x-o# 7% 8>dм/xJ?R:>!ÑwM ?$16^T~dI՛EZ f 0!g * MQu}UVy3;-NSI3T0exztwWbWbq'* Yk% Bϧg"='vWjy0q039ƵO|ko:ڰ EŠ (N0k_hi* )Y6ɖц&9jc gu;1>y߈⿔NJ"^,DӠYiFȥ!J݌QʼmT `7̙y3K?> YڢߑM?ԛ#mU sA9aJ,??8Î}y}@]r%^=p%rN}TR7v*^,//p2oѓ5*Aw#yN/X.j tw $7WX)Ѕ9P{Rx݊DU+r+$^agσ6yѥI (Kag>:^ ڢp_k s#k^\QM,OVTѻp3`S鏠> (d)JGQD;K .՗b&d&uLco] ӊ &9T?dzә{n9_0W>7srsGNĎ |u;ިdkqSQ ڰ֡]^dWc?lRʞ*NS;1N{9M9N-Zۯؓ($a-ٸz^J PlҌܧ놃$߬ } |v5v@= q;F$}T 4ƔT;TͨsbWCCRa+ {HChs VRe ƅPt~p9dM<*Н/CEEVm6<~ORCvf'7^2~ۮ;^8_6NE$ zj:kТvޝ8Giφmy3CyǓ8^hIb_9f9w*iQtEWЂun'#jb~meBqHև\6FN#b_4hu#LHllG|a@u%Xoy͕\U2ҚANUN5u^4Y4rz mu'T\\QRZ*ה!D0SPSS+n+>:V}^XuwZRCJ9֑GiHH6BK&j޳l8HF>L, %zҩ1ZCXvg#icT_z,8}-=v;옟d3 Kdh "w?=p\ZڬN |Y>;<}^{le= *7kBgHDg6p~mٯ{5gZ/jHwtQ幵slG]\_)B}tMћӣӻJxoJʦf,r@?gYO+m)'^d@uR鋖0>Ý)t vT /d^bPP6|%No@(=`g}u z QڬFG}oi` @,%]+0W D;3|?UiQ2`#Q?pjyoeN^/cK$.ZTue=da2uڂ8o‘xU %+{ A-P]ؘ,ӻ_|I. ;gnX˭{y(asny4y5stLA zDJ*>`xjrוju"_l!L1{iSV_3JqU|IJxN}b7v ![=m7$'&5I!Ԛ&Z=6ÒSB :hv48|YW85 0V믄)bй-p+Ke[# #bRw,sH@<> NngZVu.oPNN:l.@" Nj]9l8٨T.[0'||TCECǰG~xbra)IGP?n~n2hui4..חNz0*\M HFv=v<Ҏiƙ~gЏCQ$^؝>ȜI[Yb1xgcqstfeRcZ|'bR6zkf϶j8BM$@J83sp߹[Ƈ:B-&*B hѤNEoBl(B.ژ5R@/Sh[ܜԨɸP7797t#d,. 59mOf<0v@꼄X#3l 9g'(q 7 L1sj # tZLmڊ\n#. FOZN Z?zԇ! Xr`m ZtO;m+yMqVQĤɷॏ'7kTB jx]sd0 ?o)¿r?oWo߾]_g+};$ooW?p0u:)e1yHyBX PVzb'`7tSR?";FVܴ053wnJ* :ee*zFpÐ.uБYgz@y[n4jxփ -0W!\A$4HۚW &1&ٞ@ 5KygUwz>LjH{ Tn(Qv!l~O\ʧچl{zH,H Jϕ\Np / SSr¼ljMInXئɬwiyNPGw-A ] 8\ jw[:L\%&LXBb'H['ej"O+'`cA!"qRQ} ap_)X,AT+W%(ݴx|Jr CT=5J NFx g0In7]Qo)zim{<,l3_Y`?YTd/q%2#qx1QP<<`x<༜p`tR, Zлg|'/_Y;/;JFV3B lOG^\'gB/W 55oɐR>qf=}t!'%ϴد5OX ^YvVZ;ku"4hnuTŴZ ܀0 ÜgN3 {BF5KPHoT}sewlUΌQm}XkS(mn[[ i I-z[LI{!E'ap݅'k X}m]"xo뜒A7B_\v.SY2(;AVST`UH # {%3t!=} 4w(DLc m~oXKLDxym ٳeO?.|}//|>}waK9~?~xW~>]UTSRTi/^A:>Vy\-,\-ORG>CO,< ?>ݣ!?m_keGȣ??qJ64_zD:=F;'2ԏ[Xrc6r5 ƿ|o?yco., /\X} >Fwzoq;?ڷ?4~/X^]{0~㛛_yha+?_qӍ>& B<[7g&wտGꗰso\w;ЉхoP早Cs/?w/loP#㦜io7o*N['7 >as|Pkߦk BNC=@?_Z݃*0)h???o~{e|so<'&}|y\2?eoQ-&ŷ޾7_Ve8@|?WP?yZ&łQխo<s༾‹[q_߿Exƿ|58~\0~Q7k_~s%_/} oN~o".?:.uُ`H׾_yobO6zۓO—䏽ϯ;GՇ} O/\מ›kz>W~D>ION.~G66eT?ˀ0>G~oͩC_G~#~+?1ۿoo=oQgkWka_Mop|~րpQ`&:zL_|? Lz~c_=| #Eo?fcHPg~ AM*-:N47>*o]:7o}]xV_^[4kg e>_/x1 G~ˏX{kkjk5-#~/}_qk>~5 SVKo;Z"|ػOGx1~߂!]y[ɿo {?x?al DF~N~"lP{7ކ%U}"8YZ.~S=gƕ/>[_i+_cïMZ_[ e; _0z?3" t)o7~5it?$`7!!P+D~뿍`Ԇo7׾O ,u'q7|\_g;2O~%7/O_'fW]?&wtπ/H T|?|ayGheJǦnogȟ~?ʛ 7鈹W}хyͿ| IAhIwx?E [k+9?|7~ *\xW苿^#߯+e|Yx"?gTex*_W b7Σ;?? <3ԍoIQwo.a#խ߂(0a@Gqnppo>Ww3syO,w}G[? ~}7'_ *|q߼#>9]o,+~OAVojsow.ˏ"/>՝$w^S}WW~cw1conΛoU_qf/~!"MؽI柾`^C@_@‡R}x!/kxdI6c>m_jQ-ܗ% SҘ3Po7`-i|D1J|'#zW+9og_X2| =MП>Y|N{?y듏}|޼[o|g-zy7a?,ž{[KxRKvGߺK7?063 Ʒڷ~g\ Y-*+o=7 *ﵯ~$[?oPwk&-C{˛ z̯}*K7^a(Tg=#olˏ-^A_=K/˿[%~gLb#1W_ݯ}q}lpÿχ‡χGD^ ~+?CQ˃Z/>WN ^ͻqQT: CxF/;OWuz㟽^Euџ~ u|߇oC6\lϷ_'~?ϋQC{A>@>k|ϟGsO>om|Y>%C绨CG`E~O=@G+i58U=CmK v-|3OOMa%||^I;v/4b|j>JV`!S7޳g-57 8'9 2 u;?wݴ /?woI J,,,4q9nO.4arпB{I a|u._E%)yYXh,79>“7|@һBC`F&1ŸPZڇ[}팩•'cp-txv;/,^ Ⱦa̐tq\ Zi-/ HUd p~ W+I.y]~ó?nYd_ozF';>?c8m8M.$_/.Glѵ}r˧}q9<KKgrO=ăolS4 !jN@ Z{ibjwyW*:v8J6tPf$S1"h% OMdE{: tM4 F+$m򰢴–+/t =pd_qSa+hN7,j׮vA.Bk6bҍÉA9Rlŗ7k`Zލic~zaZ6 Ǻ IJ_ `g@Vb5@>F@LF^(@?8imT&@.k< ]uml7 ERC9mlLY0߃SYSO.=_O,//g0SO9[/=\*D;][Nv>hFHKŴ"3e;8eG:>`?Mh|%hX<oB"WT1v{Ʈ5g 2$sl6$$h;Z1#:]ѭmk8Rl#c] oi?Hۆ vyrw`@ǰs k&}{ ŌS0<`I\3-ŗ\Y2 ue "idTG{ϛ*E og0M^jX6v(la얌 c8PܞgqDSf痣砣UdO%IjZt^'Z}bCatTu"wA"izŰQ4l a[ Mi@r3aI;3F$kicvѤO1Q0䵝Sz+*+|&Hk%XAq kdx"<)E])I8UQwN\UAz%7A#(EN v8Qx;`WYt~D0⚚sCqE0݅'HJ&`_>a@u33O-O}|\U.mw(KNgW!ZɅR!= %]F>£HG]M0 e{12jpM6޾: ts PA?sn~mX)=u!FRiF\L3Yh&5K\>8`u@aU@(Ř/!$ %',->#iV\Ƿ+!h^1J@Rx1'n\ $MVVLriB\|,^x'7 &%k;.L`t`hbia}cÅiLQB"ScA'a4Ơ)GZ239Ӆ顣8 t< %dLʗ)gSεtPݣwkØoF0(H#}4ՀaUGLQ0:3[qYY_Q[eF9o=h;5Ol8XZV2kKUd<E saD ɲR(P2UP %.țn.jnQ̛5GBV lu,AyI<*/J^P1':@ҶбiSN1vTMkM>4]ՠ\:TΠhZIpb? Jfw# -PVD D*cq*U'qr$bZ|l7 pzX48JɹLB/ߥ'W^{z;eQ'@&qMN΍H?F+U??]UAb vWP='?Q0a5pQP]ސ}Mr'}R)ۮ3VW( ]Ï(%cH*8[,pNv: &bAk6%#&JyAEbtnYGnq'+8P]k1T6n(+^aAj` WWp.ꇝeSPf;3GNnxH󫂾`hݳtƣjU(&c:;2D?t{ݨӸMbBĄfviZeA!ﰁQXu2bJ=^"0IG@iĢ=A SDpT1 FtC95>Sxuuٝ}Z 2B{ҡ9  4 ! /wfn ! ? # Q(kB$tЄ,Wsz2eĦ10K qBh3͓q5zϜi?%]sͰYxS7N1ҩf>xS;NUi C'S@[ V^F1wI c,I 戺K|Ac2&Cd9SGe.+,rӖz*ط/kld3@qQaN]%{Ǽo!vI~% c'ɨٟjmUp")=Ó"\W7GY vbOwMWf*uC!ꫧo3 z/T=WSWo]vR!QnBҹyC}TeQY2\Xt6R)#PY$QGx7>^ <cy r 16ȑۊ.ZaQMDk/o(]*4}6UjY ,"U7Iب~` &.V|L%XwaDtc|[[*-~\Z2Tntftp"AX6q)w)\[ka"瞡)e#!8gt)%e9@tVnYf-# 56[iwv̗Y"ԶN3jqi:{Ӈ t>r7Eù.*Ve FEWyzsw~c[MvR0X.U7Sv8ƹ߬MMd\8|kmx*|k H0CnJ 4&zKk7n6:9u/?l۹1' {*#AE |`BIȉR Ȏ۝gJ"*77f1>wFp<7vdY!Q^Y%pXi'aGTeU%9?s0MWxF0G 5uPږ mr#!``FY6JIe$P0VekqMQ諀TCWa-G. '(P~֤P3l+Ek;[z`G,|1HPCJ-IuGa8- 8+1vڞJl=em`.. x9=ی?~O 3tL[]FXNz\wT d'( Iv5-IDx1Y/ R%w H.7M̺>qzt2)+[ZzBK&MG1'|t 7eV鮡jΙOc}A`G[ȄP4OMG<.:ma[:ęs F"8WA< 547bhd5q͎4>ouʁs5]6 /,hzwkVӧgCC(!C[#&2nƁ8zdod iqxDP8]qB:|?$\Y1ġ00\q2J8~u[ ̖1a"_hBtk OIJ!.ɄΎDjQxFU zil]/#`*k7NR53,2RRd/O5yUT գ g#m@{-.r=9Wh;a=^O6[aڔqE 7wK:P6弚=͚A !U9_xHOT9dzMk]w$)Ҁ5h$SalD>WO|Nk']Fò>[-b֦3T>V &3+_xf~m f~-{ Hek6ЂM{|m̂T!$q_LB{_S duY t6$iU.-{&in]wqbqo,d0phhLDcto7n'ܡgEX`tti0,;V` lb2whˈȂiIGvv9D`^՜a<;n8ΰ%v:b,h,7-%4?~ wbIloEI6aL G*#Sn)uQz'Ѯ yV|σ;RX;Zii=$_ e a1>ъ#5c:tSprI6O/UwȜH\٭5OdN 2gIB'P <~gzOkJL[z]?߲0zt_#tC1O5o/#_ >oͧZ w:^b[{VO<=h@ ~= 3xЃKE" Y3%GU60i'y%RYmԢ OYZIϱC4殰G @APnYeRChmlf9+NN4Sf787u+8ENf7Q[ւW:C~}B/ E7T^IZl&>A;-\fPt{pWUFKz['&>W_C (#{'gj[N_}F@]5 Px]n2F_z^R~/7o\xaŵ4?iWa~S^6їZ5~qbkřŠ+):Ӿ) 8h&tDw)ٻd qc:'RnQS %k~4ʍtlWp ]/W-[ˡbi95.}jk͋7nV*nB'n.)oh?l}mgpI CJfmr"TE|EnT^8ykbʴ𙠺xJVh]95SG*HߣRmlB+ &faXp+;tS1:8X]=Jeam50Ϭū94DYq8ZbA x ZJ[\՗Ɖ+s{#So=7-V`ebiQ!$WʜȏNř qr`1-j~x JՔW<§{LjI07pxHrxrMb[í4h!#;<, \ 5 ھaA._w+z]Ol]jwNX`֩tÌ<̰F\PnOv(— 4ɨK]?im6b\x3[Fv;vG|!. :xDJNwӑi1@dEՀz2N蚋قhi5Bi%Kht#+ZX"]ub!wH 7R6JPDS|*BQ/Be_] q }-bax&omM>,:f 'E!U;i-W5hI4tvM^ĘO`/V 7ZUu Y'2COA |q8J40L!% vc8 =%) ?!q^W#W)l~S࠾78P!6^kVIE Era71D!2UjvwWnG&ytzjj?Y0,El\CF<S`1Éoo\ܜ}qŧNs<1wi3Zڨa3H9eRvhb,S=ktq,{#i,^jQOT׭[7>5P=?KVbS\Xr]u#(˧ >$%%ںc ZՕu/s~0!'hj7;+)'VX  &%}90 -+SLrxT]#MWiN{$쿄 ?sQJ"޴.E 7G"/(fl.qNЯ2CE3&0ס .<k\$ndJA]n~PV6G++/@ه. M'&ЄX^:UH2x,I+k8 =n*,)GMt8=\&.0iDr=[I̊7c8MlV^G~ڒ*23D"7DLzGg'.J7]TwS+zhh@B/xc<@C/DV0n6-R7hvHIT@ ~])}"O`3dU!Fp˟N~`\TILM( g`sjRrdAMYg[*Y3:p4bQÂ6;X>wNA&6U)hPGz9+LCn#+?߫W%IrӟV*/JО9ia61;vIr9')aϜyN#g\Ո֚ibG1{}dS@J?ER^IsV 끠>T0My4Hd嵼lRWRa-4 +kţ[ Ա`}'HH6p.!.U)>Q[9Ϝ(]EEm]Jtŗ_6+(r:v5fC|0tw7bB?(Jr8O%%eMc P.\O*tG$hnMc15Dq r_'A#Vg?=d줩Z;xXjZ=߁# BtJSJGAd ++ÛLLbrf)%%Fy$dTRJ״~Gd] Qy欁l0c15$3~,2ER&W;.dz  ) |XR@k*Z2Gq>'ŎJa9Aw3º;ȣnA B6zN Eq>(npرmVNo#.Kڃ06V *IY1{jn9Z@Se)HGhfy/ݫJݿ`n ZPM9EGA'¢YD+PmEy҈QS gYqGW4W)R/<̓zlƿn\56qi)=)$5+Q;0<~Y"]-6m>J0{3BwStJ2c6f ,ݥ pORq?<1K?,U+bɏ1X:j#VaWuYUV@RFՏ-MAC $ F@<(bkȎ=oœ¼-.6 mNl);_B0&c¾%VrұRa ЄůePxc5*eJXD M%6>K"Eat(LIW)RdC"A'S!X0;h$sk h/_,sNԕ73^<<<ƿ)4Ctʗ[#Th{ o072DvJ(+/HFO5`.TwM^[YiJ<`a\A^y^O'O#a#D8fo4dȴ[ޫSZ!mALk[/g> KcL%HkI.}J +A/-qwnSSTH5ENe\_aM.Ryd 3uF4yfN!{CTTFo# %8-w4_firC[c6e8 +ڣ?-veQd(ҡ2'HEZ+$LdO}n*L'ڿS׈Ab̫A֓#lgK&.S=Oތ1ۓhWYڴ0#zWavfPwwqkdeGA˲(|e#Nޗ#?9,ѡ||D]my*A'WAT[ᚂl3lMc_YV֦={+yjz-XЀ6.V,`/u bmU pqE:[Rq^6t 8, ?EB#d Wd p쓭 |;>VIE*NH?&},Gf2{0(u 9eVvpI@4UPV!⭥ޘ'B!e/X>ڮPj\y5L'r[4[.CRn10vA| H0ˆWys4Q"/ % l^٤j$u?a(`8ʰ2 ji7(oJEg->ĥsNV%&%nnX܃@b$FŇf=67 Ca+璚=/Ki@39ϩ1,0!E1}{ 'a Wq3Ópؗnj@o>t,An fӢvapO̢M>ǙbPo@Ŕo0|w~-89m2l7鄦) YSd" OrJ6x48<`vM"/O}C58+P(?<ã),ӠS^k\? 1hu<镧ڣTa$*%@FIZHCָs ⧲OP]GfO)w׻}{myc72zoR4g%Z o\h =3tHgNDʪ(Pgz&zvD[BW+At^@e'Y`Ĕv׉zO_T}gsPܰx>{N] e  U_f!˶7U}AⴱjL[wkJ Rh4X24uMl!M*AVmʖC38բ`; eE kX@l$iaYvXXBfh.텧%^C0n)B;U2:Wf@P):53w(t=ȼK,N`ؖrm1 E;<#-WDOGlMw֡ &A̸N 0vNY20U. : yo!ZO Oطn)ð t]ŵOo\~Jp|F:f"oly=N^@JtP t -(N/SFoX K>2 x :%eq[w-m,g[yجvh;r:gs;]bp/hz5X}ʐ.Nݘfi\(~M'H 3;~1<<ЄA:QdL]t׎ r>B^` 4ʈc^+O*sG. _֪ՓҹRbecٳUΗ3˅AVe-1b>"9&o-C$t3Rp6JxzwZh'2Ln0/󊗹%ڼ{| cssG+M1JۣHdmcuCsxO$5zCݤIL.V{o VTr$ pHaW+Ȼ^vBH6@iA ,āz=y-nx*\ҵn7( R3z|KsfMW$U5|L^xz5Wv9uj:gpY;zq6Hb \f-1R²sVjqqc7^l\9 ?z+[!ZK)$_QQ]q\a}kXU8ɣUe oD02v!J_5>Ͼ9̙DEL|jp6~60oMW$[[3*ؖHw^iXVh]XJՠ%@v0_`bZ1ۿ`覶"$ T8-hk9i%m \xZ1OVac1+kupp*΋}l22(aY=v XҪV!.$;,0ƕ%*Saꔂ  #e@*ɓ852osۺc`j57 Z -4N6xu;co\E }DH Pg%G\}1{PU$C<)HN58DkaOGox(D ]4^Ҫe-|%9Te.&7pyrr*0e( c}faV[Mރ`uȦEJE(v*dQ^PEta6nc֒A%:Fj++eFa&^'Ԕ‘! I$diU!Y`x%2`Y7L/IѬ9ѐ\Y5$)x*@H tN59w6ջu:"Tu#f;Vw$ M/OƂ kk'oɄ1jtQ /]9ͻb!y2.' F|5b~!;c}̇ F!㝯kڏFB- #wbZv@ݥZ{6DjYL)Yt'泀#gظz EO9\p%CSLmTv@-e]Ad6XH@yɁ&5[^ؾJ*~WM')S81~ǣ~1BF9Ez>(Bk23T] BBptG#jqҀk2ӐlH_[=v%Ôbr(B3U Ѣ3$o,ElBc%[XH> 7ތ-]quKYJGj+TbsRqXPvw3F-Ru}{G<qEFpT=g+f:o%7֓%/-'FgU $1 mqL"k3b?+ ,v~hfڠ%qN=nː Bm4WT)S.?K?jLUGvn5VSV>̢nvbJ*'J4N<ǖ02[%X[Yr !$Dz Tųw vTH`RC&A>[,u-s;+3C>C]pݏb0+61pu2Ml6N8eZ!9`ĖP590ј.d9hdخ:"`ņbBj|Pj 7jT|6SL"AI:c>wT%Kgs2 &GeP䑒 ҝ-XZ4dp.dyr2::^$ Aȉ`pIX4{k|1Uh @ٞ/~߈Ænk@r>WFW4K!9>bքp'@s粒y& xi*#${lߦ7%M _|*?faJJuН> 8G{H踵nכBG OscL(!{m N]:MnP7Hj+2+";n};o>Lf" HTX`M6ټT HAu/E y4i#մx{DFItރ feb=JČi2l9nT%A6fSMXԟ9%#e%6R|!2k:A Va_vLCKF40zIx%:Yy[0^W,n.]#6_ Qj˝zKU":r\dU0 N[ -72(PeKv)\gz-U3X{=l sE.A6:?qq1(c@za5 져X_8+_4tPD`RwȘlj6}X;]+ʏ=/vWr.Or5b߳ٸ$? {<\ʰN.}HD^9_u;q{jDn}L_v-kku8BG{ZiK8yE%4uH1݄ F FUn1nk]p@T>O > G'qI[8Cs`Ę>[á`f18FpnU U}{jZ$=r-H)Lû$ }4U p.,/fϷl B1 FB|W3ϞnPc,=Tlf Hjnb:sE]wg`vjk-06ySlMEZÂDp!~浱ؕ2[-4ж8,D5 5EeWا< fP eȘ2cX8 ocZZ"0 Rҡ.=] OD'48N^T<OHWҰQD?-gC;%V{\S`$BSTUϾ VS r'NJǽhet[ҢHǦi [xTE4K ʋ:+p%Ր1 КGan;|$aS|q$QUPɒ ^ (R X <~ <ԉNivDۧau,2Y_I=bfTQӽ`%;jkKrqqV:FVTr8=3;[t >v`0mňTS9M͂4{pLPe*M:Y)r8$q @M VvA s|v͈+ }êYd:isT#f v&V3RM*Sىr1/f D=0(`q>ihHς}+)|"'7, Z+}_Ob5tsb'*fqmYgd⏢Cj&BXshh2aN/`x'E֟DTgA|,8~0L;݊, v])jr$jOX/NGC;@>DXL-L*ܛHҖ6[67ZYi8Ǔ̂Rm濝G  B9"cq{#Бకc ȏpq1H3bZr]G/2nY1G8Jnow0By"y|FNLfq"wbls{9x>dF۹/F ] C+[Wz$:9Jók`Śھpǵ>͐xngdmtLmۯMr)@%pDQpY.l;bY/-2PZ4+>5f?3؆DCGC 5GEֶc( Y a | onf? R/-^~ Wƣ+|  V<1WptԱ1C,v0XmBޭݷnw硴;h`qwqM6:5=u#7hnkzUP 'p! g3"Zx omuXŗкVE>⸤:[X B ElĮ.(;$mH螓rƒP^sm"N^&0_KP/OjRt]U$An7%dg+_9d Y9aO q;-^p҅ y<~"VX&7b:uXVl\Lp1Q_<)"[[Z)0oNz0I t-&*ną_uS9lc)CU vN䵈Mp90ѓFZG"WhJ_mީ`#Q!s]jj]W#Df_˖T[֤<@j[~€뇳L fW=d2*(fB6NK#n)W~h  Q:u*v,: ׷'^pGH7ޮ>꼉d3b,IFOa#@*d޹+x=G,IxsC|3;#4> nK ; h' jEIIoxx 8ML>hύfol=L! !lIA7 L6ToP$X ]%9# mz2zr­}/zE<`.-"*|l 'q7on&wӳw&pK_:2$2V$X'b3c2aa uFi GPK5թJP8OH Gj BVCG;fӀ*$NҾ}'OFub6l!}P6oq]v +e rвoeձw|ԇl5wRҜ #vi e]'6oY3j߰!ɭCd\5r6oڊMEVmKΉL-z|=)˽P-Sz8Yu^)} +׹NV;=,a, %;=Cgθè˸T:@i_XF5i%@r?__'0Fw}rT]N%=ZEŊ4'D4{vSͽHft&ԁF4Bý)X=FJ;)'K 4yrBurZMfE0}:Wk">Qڐwxk:gS#3EsEq)!%WauvZJ(dz7$Y Ю@h6O"bc 6.qCCJtN#D;=&HΊPk>kϥ:du|&ԩQɪ?PBCM"H7Z=(&~ YcXHN~WzrVP@U&IuSw_dDzH(˷_7%vf=hIFgEwa-)8DkժLHb/R&c>YFk}"4+<-]g=kE_b/0yr-Ьoѐ,yQ)srHqsp _r KL#v,Nfw\IWuG@1É&2\z678~VWk_ЏT$y߄9e!Bw!aP`DȲ[5Zq`exϽ\i⿈CO6ٓCeٍىI[&)<6pzqfgd+G7ӜaxyXeQ7? %i2w\M+%9bǒ˓ VM#̇0@7 V`cȷD&Vӝ*Ko3zéJJN${4.gi8]jn/U 1{rBvN_XNI\o틯\?՗2iNZؼQQ n"驇TNfaԱ x ~ub:{;Py8M58%'8K]݇<[V:=-A75)/>uB /Srfd@0X=*l x\ߺO$R1iЯy,^3aknI#Q?d㰧:Pk!LFFEs"~1ءZ:OXqSxp8\}iu{j$'={NNc~w ICDwp5p^j~á}b+ ^;Uvx^+EaCٳ@v*(7YgEElƒЇ1g"-t>!gV &KҭL98WkՍm?|<F P/[k8#s'\QNjaJR󸻥EzꟋtt؞mGKϋKR >4j~j~SE?=wiGS=_4{J4*c뀍&~n ʑa{L?Vfz,3<KjiGXI#IA!w'qER,#Padؗbk9.:~\ͣ;<o;dxTQ(1pzbxK`mi\?&( }i) I%_*!_O?̤czl{>VSc SvGm\d{p]pĤsh:ٓKmݟ8vY:jؑ_;Gkf CR: C;.ê5YPE{(ZE,a[Mڻi9~My:XʽM-L_2F6渷p_:rN#ZRXEȘY(rhu' ezLd8#1S͂ы%/ʣNtҁ1;—yg `uQVi۷Pޠ^O'<,#/aC'/v2xۛ7oLNqd)Iw> ;WhA(Wdt[\6~P-l&3 KZ#Sd/ g4SGdڌ)(N$k$KAG!h1b+(ijԝ7p5h~ƿviH{$ݧӖ4YV}HakUԷA=OWkA@6. q":dY'%ח~Ȧ;zvSG3qupQr*'H&NMdwUa5xJTɎzk{N]Y{:z8͜~+<,!$ qKڀݾ͚wחnj8t5(漞x ."D[8₊v7E92IQ(ia:x@{:JU9iH|,|Bh+$U{"5MIT;ߨ%;GP*ĉZ*RA5G ;cVY0V|׬wp L[/.cd+Iuf!Jdr>l'4Ll Y1H(W1G͖z'Do0^Z/ 'x8 l]șCF mDbgrH{B/t|4 ֒!t{fdT3ljlq7^X"*NǏhx=~lf!w:R.*;әla1a1p"r%n-h1y[5F=ifЇ~Ut[̈F9/VjS'J$%9'nI_kxa lv.[{ceSU@yRJ9=BZk5D3^"WBQ!Rx;[lO^X6}Bh O+L`Et;ծE̪&\v~sIJrK]|{#} -^o r=rg} kC.r 4?AЉys@ /fgRW$F ^vZ+h ph,'/Rs0Q -|ば)_nx31ii !,wJѳQNL8G!;6h]ݏ0Z,Cޗ̐x#Mre܂4z1z+NqR-=ӭ+ <Ht+XCjY+'SMG#.ڗz^N0yEfP̑*_l˖; o ys uN prѶ  yYɻA v:d4rH~Y!‰YIX#q$?V:[V'8hd!΍wo!ܷ۫TqFJ\R nMd$d}m5Fyn"՗VCz:-*y5B?zH(4 7EG ]d4ZzBVsUӇ2!yvy˚RJfMnNeGyΠ&,X'eh˅%2Cj+THLyNR" u5CicJnka 찜`&b9(#y{.$0*%45d=nt\kO1v N.J-"'by8Ύ8ztޔvN +(Xl~amM?왿Q`mjr)7z@5̍ k/|kWCCTT_/KH0h6>eȸ_h5խMoou3ǸFbtc?P~Ny}\ȃCچnٵȋz`BՌ2!z |v`A5ai8CX)ޕ5a q0#DYeM¸H%H0HβP1Bև[>GLQxpBNGVKZB<Њ3;c8ӝS%D܂Z5I!Cχz:@Ĕ5F)d˔\aua u8>K,bW'}$CK/`]s4 )c;sC{ JTx\ w,TլCq(05pqnx:*HvCn' 5NQ"w%y:66ς(O+ 9Ī1`ЕbWBr|xTd=Ba|01];NA䒹9h\@ðds,6C,qĚ:T芚JK\= U@tSpK0UD'lve*Bok%@y"ࡌxL aV,7]= ۑnnPp\cZdf8ղԼbuwrXrmŃ]L}x_WA2C8٫m@DI&8("Uh{m k5=go2o%]UN[(2QgCNN a:cLO|HƧwDqߺ}û?xw8Q(WLrMsN '՘G A1- =j9K ?] B]Dqm~8>|v]67f(x} T\,b§8VI%M2ɂMuʮ@7[+wO0ܝ  z.|VEmp کU՛)첝16ۮlyoy1UV,Y*$dyB*Ƞ!.^$Zw:0S\! P6%B,!uo^nAt]3Ԭ5{3TRc.ȼ+O;q{RHcn{&Q\Ip4]Sc:#}m:PŲ<VaHU5EiJhXx*d~>"I-¨+X=ѡ\-)LՌD@;42.YswW#Ytm`^`8>JtE@`u5_/ߪTAqM;-\x^h[g[S>c3'_i룼4yi$j]gO <"YH˼X EplhN R8t@X%(?BdUDZ{%MT<ө}V^IRg(npԉFY.$j/gȅ ai C܎H\N?DLzм*u鰧ۻ|q__y%j2m$!β;n0pBLO QfrƐ?Aìgp=c#537Zxj[KV هSٷϼ /9ybܭqfE#44F榥J =/4@*xH(/.'Cw?fɮxk(۲F,-;KAB^p&dQdU+$½wjzܢX& h~=  h;&QHn}`e]9᪂~l.un X9}$IN"` Ԛir8 e5eBirR#Qy0hoF p%9eDo{Ϻxp++Ck HR*v-갚S3Vl_h 3;c, eoBe}\b OWnZjX\8OlzKF '^^ǵYl/ykc4dGؽxSdrtLz<%σ}E!X7pK:865=AG7ξZ}$2V>`9qg \/UΓ zafyHy3 ;Dsztg˅0oT!1ܦ]pZ-cڴ ĩnA\J)DFTM-ŻN2h#=7O n_Ư:*Be$ȖH v@+.[qY,JCq8҈1姚b OyW@ _9T3Z"-i<AH"k#p䂠ASXe@K艀`rx'iqט^ =vG,|1 @9߄F|)YbWD ]dMYALJ#څEg D5bdW+uʅѳZTr v__zIfo2ېt4Dh&<$yZr0RĪ,vߓԅiVnu[{tS֪֥foJa7g=1F1?/nh): Wfj9m  _ \W7D*q{&P/iS2N)\6^ǞSlo#Om_;0R,'&+w CX>3.vԠD>/`;QfJ t ie':'uM V/6W'eE.!-.Ș'u@9yyt"9y]}P*^4KWuJZ@(ȱ.pnj{!`e>}[ 곺%b93yI P>l+{pc=v>͖ YYO6Mz<8}IH$)+QR,Х8k68%O`~dD2PFi?Drulpwqmv8EE[] ؽXhˑ@V"%ptCgqnon;}@ #.qUA [ 5$y28#d{`[6Y я6_.Zțw^Ajsn^۾|3cO5&ȟAߙ"~8P+A%l'tjeAtV+cd`AGdQLƙHSkLt;Z1Z [kZws׎cRXVڠ|R1$h2;*~߂a$V~_|RȐ!b~'ˎ%@PΉ.6,ZbLWDlm(긤#o9SY'Br\.DP :5z>A̪=& 5qԚrxgpi@$Fʽys*1M 8:! G*rXh606Svyͼj7nJ{;##tI, AW_O]Z,b.a6y /ܔ?KH$*t{MR?Lp!N'3 oB4. DAבhPI<Yg[w,z}"=Ia_߇Cz~aj0:A1R(1Rp&eY=&)ʋrkUz*SJ4}k%)[}9̩&w+԰k5h5fm}o{rI/KXy}0]3 .Y${0]7ٚF)+ $PD> 2Yi#<>ݲh?Kk05bbk@x*g):8>pt S,k-2o/WİMH0>C9c>z  ./vӎl"q;K=vmVq2{,y͎D:4A+ (Ϻ Դqn72"Tb- I IJd W/vCP9aOdy),=k ?_Zpݞ %*S|6NOIsB?Fdc+,5^OkDJAڗɌ{x~=㪜{ݵ/gH2k~9Cvǚ?/@aK@CD /0Ҫğ@Ny*-|$4{GF/KOZz D.|]Δ 'At="59IShhx^{Zr?/ߪz(Xy1[3tQvd=No]b;8s \}ugO!1um{)'#\(8Z'|,E7>4Y"}F=TIBGSBݛ&J1I٧ -irW7D nN8#t٤Sc!$'cab9vO:|l o@7nՠ+3C Ԗ_- 3Ԗk/|0M*W::rܮ\P7㶭{8WaH33Y'&WVdZcr]"=1;1V6 +|`K]ь:"|((F'f[Wd:).PA4c3̄M,цhPO uk:R ̧b|V# Hum d^s$p?R5)*$"yEdᔤ,\!4ePQAwme&͵<{u>DR/UyW(҆u[rff[@_uXmUASWpy| n S7ᤐ 5!f c:&pR\pЎt h9N>5V6ЕJf |`z-' u.jEIn> ηEYґ?$'yOO9߼iny^w9q S"L={:bk q*deBlJ@]x,YPHj_LRNJXvORa;)P!1SJ 'FB;F3N|BQ]:]7eXQZR9VD |֛>s7|a 9tX4ƃ2썽4wo"}?9ڰA56=j7Gem-EWx+:ޓˍSl^a,~fN:$a6fH(Y i )F-%BXɞ*,>Uk;v%r6@Zb:x=LRlM 亲|{my%gj\-n;:5{轺"=[z<{E3k؉YxzPELIl &Pkpx1FCjJjn-ۗy;/F 0e@4uDq!_ƺy]qyz1 zMÈw!q<-UE1j>}<_ũf]eZQ䨠=f+[{E̐ G[mX6U 66yj$}P1x+ BK\IC~ 7I!P4` kv*vJqBaJB9!GsQx/'G=(w#=+ wn4N+亘-cK|D O`7"ctߒY^6t1FۑqJi;l6J>[Xn"nA"!_,5*ܱG(ٰ&"y!v g`51';BOlIOf(/F22ѡ3xcф͊P@ (!VdF~.0s6rTͧs'z3iPP. 5{JNf_܇~!Ŵ zܻa0dO6KF6d\QZE*3.OA:%"X)oځ^6bu|nwk>v3w0}JoM=agD &*M$O2S#v[u\V3N){ԑ uI`ex*iKӂ1D-^٨ǜ}4>l_=9h5o_{3o ExuZNP ՗O@Λr:nWƓt*Yx7-.%a hmVobpYʹȆ^`Dh[LbxjtXD|!Te_[l~B5ik a]I-ˡ?e $6d*3jE6pg).)\nr>=Fk讅왭s2 άQ=/-E[qnc 7g'&oj}&7M#r tN۟?qtؖ+Bx{/˃zaADrAwOGq~QXRzL GS") =FI@.0jkIʆw +zVi\d7|۰%RˉhzoePd*r%Clܦck+ uEb@wTHl閈t;"ժ4 IuS)C)qK8O+w)-c1h4Z[ &o`W1V yoi=d-G݃I55]i/6yiN79lnPM]^&o_h$RRA ft= n9KG}F'r@QhH+*HBGփr!5_YzK:B? ϹYkpD$<,O$v]eA- LdV(b8 NsiU#8Wu:u`$''tqո\ʉA u*E}I{f;~.t!=MV۬mO2%jOڧ X+Hc205to_q^~HD{%M.'B_I7VӘXaE2˝BJX7KB+ ֱ C2F1#e#pAy(@^T@ĉy1qVJ`E36O$5B]ztUL'Uε7$w<*4z ,;!p@ob"Ϩ@=d9wS^rOh҆b; 8gT[4r c(8W_976@6\6l]fUCZ EI:Ť({ikf#)ygH_P)XvE43-[#yUګ~J:;p"8?ƋVݶfպ}23c[\3y+LLe^L[݆RdzBt~w[$ BxmC?y9/igTw0fBݚ"eYԤ*Kz0 #4eQ\'}/Z K6+t~Fs;\T14ɞC&ܴݷnwan?{'X:pyUϠcz& 83B8MThYsXTS&׬lR:;RxqpBE<*)a= 0zΑk(* kyZb‘QAʈ:R#W6pmK_j9Au'3v+  "z,N$u@%Hf TwU\C>xrJ?7WBn[<|:]gD]JdD٧I0FhR(cn*1? dc%"hNh 3dLո(+NC{yb2=eCFhoDXw,'&,, c%UKMի 3l=]KpHJkkjĉ}R9 g}ej#h&H F nƕX;P;F{:IwlXDnH5ђ'+G]]؈[YbXh@y5XcϖПTLt:ſ`uʒT73\#5z5Lgf hJ-^fV+5oI,2V֣A^eϰnɑ]y6UOys =d޹.\2ΈH)U Dg 9Chlv?o7[w޾׮߸vkk׮n_{[ޣI0;ԣN nUtxF=Wz@nN7˓JȀq$FU& AIw xW{l)'Ird`=ncNQ(`^W۷זH}o[ѓT[!y4̹Ue3̋\M98z %|ujl?<Dy)3agkY<J7k50D!@x rP@ax ODP;TtD˃тD2 }Cwb*(o<:؆{3F i+Ődr):20 {UՃm,x:("A`G!);Gʲ +]I<)YT02 EE''1EÇ`OM*2uX_⃕EkA}֜u{ ٌ\ ~VBij)5[Jjsƶw,?͖ YY6Mz+ۇsԱ0HV$1cy$$f楩Kޏ9ڙǻ)U^nst#\,k\ۛNƈqKu#LT@Ijf s6ݜ[caܑiD I2i\%_T_^zU%һz9@CuoxzwCzXNLi_l䴓^~TB|%LgH𿶯^˧G+ۺbσӇr18n 㞝 М[}eo&E];h*^/*HΉ* ="lɈj"-+2P3š:–h݇gs9rl%ހBZ(-J̼`DGAIwRe<|i06k*% l2s[YQ' ѓuZR #Dkۻc4~ZxR0IՑGPQOP@n0ϨD ҥ.c1%,S&YHSk IJ9Xx|s3ni~:\H޹&KVzQsϒd"%1@:c:t몡}ް,gbTf'8߹EDˆ[ւI#x:Cq4W{v/p6Ь'Dk'XĄ)`͍Lb,"'Pk͢178V+<2 ?B|Y:L)Z1ܒYRPD P۴(J B]3w|4Ñ.b dEg \Y)| 3n?n Qg:sÏ'؃x@ZT7 bh[v<k,Cv5PLZZYpm:O%PMrDW>İ! s_io-P $2վ AS@w$5&!y'ī⦬^UGd#!1"gcHGxO6T6XPBr$(]Q`&PL=|c/c*yA5&.u4\kiêwi&GM#C{Ef%dKie'AŒ1ϩ$T؜zgRm같V"E1~dB}$AwώP|v=XTI 9a햃c/ t"$V– p27.p:n9RqnklNXmKǛ5f_X62w 6dݗ0dY2ơy#q!2i>ً:3/lb TKT!RHBWhݶmpNjm <9twMՊóx:G}@{lW yLapgdLAM:,@~fAVO}Ac<#~(/=+e5 Tg0l0o!BvA eDԍ^gh:,+^qEX;m{hg7GL ^6~t>sp()Uv;[*6npuk:+(k#[Fý`0p C C>G) .uťP: vM\Q:Ezi$5&IFc$),*IE+ض:F68MS ̪+Sޑ!\ÅPD~kx`Y>y|ob7E9oVPmu"UyMR `\+m}`fs>ɋ}߲ՙ%w՚|afg0`~Geapzt!Xnt`7 S?eC˗ Fb|ʠCxN$W΄ߕno 䂈LM!#`m:>tҤnv_KNG@wnߥHiiJ ܌~`$y~W7LuFV: (˼Ǚ@qNb_lttztvY[;{~uspO8ZUIlh9vN^r\.~CU|b␘f-HcƸxdE*S-#,(H8Yz.ҩ'Y;\!d1y%tkC\:]9w cT>,r 3]@MnD;z-bZR;(B00 ")-1 4k:fYX/^pbx z2ù^F/>Km|5B@Py\`n5E$XXAG>oڵ^}fhdJF ,p~*ݘ l/ qr@!-.bz\ ]5bF~8?#ZM omjc49WtDOd C @3Euj *gJ`= []Wuzb>Nu(xXD;6<9!Aɠ&d Af@ҟFEy~| c_1k2U ;u޾kkM>0&+6~9p솷V֝FSB8=1Ls/i@@&*cN {=z`[>5U0GGI6E|u]"'jQd(^214E,28VHZik9dWYUC<~%I~g9st퉹@:φ01u>stH&^IQUSMۇ~xql7c11I-VBJI=gz9ByRREqEKdT8n;R=zaA !D$p{-MɤshxFƵw̿^*;0>IOHq T?jgkC"!)@#}$$,0t,{}d ): Čq> )F OGAPZi:H[ ̈cZ_(꧊“rrTsFX*¦BϠ1F)o}qM/ąW]6 zv6k[/1JE8f|mr=1U_؟5)&]0Q>-AۈOG3 <m+Je.n} b^l}?[mYO/_\ k\6k *Py}\ިG8af T׬|=w*h$O| t_q@L8.O[;fǂLeǔ[Jl򈁬2^W`E<"^;¢!$^Vb9qC5hS-T^$}xWjw+v wXokZ sT{xOrրtmZx8dpypx-Œ{.|smw/ƉJU$R5\([y4*5 $&6cÞT-%揇Vg`:6l\g[-mr'd d|*+JR.Yx6WF6$ A@A,MLha@GUI:ZTpRua~?@9wa!5ףW^e'x;ȴYQfAفw3eY`d4KNʣ ĉ3ۡ+z:I H>SդG KSq, 5"ODZ=*!$VtO;OyumLh#9:v2˂Sgu7 q!= )8M j Ĵc6Y; albtVȆN +PV.q&)!ڹĕ0-N:2jT34.{"zDk(ChB)īB@:Pk"3 %Tp41AVq3cn*F"ЋqUb8'!CVlTwIqd<_޴흻7n ~Cx)--Q4iKYF\44eTwdzn˵zGMRooyCu~o-qTOi Y4ZC I$R6bcHg:L1ƉMXt嘵Y(ϣbb3C^Z}m^uk>?pa|Bvd& }NO'ǜpx|DPnU{ ' tœٓ#+'-׹q:>.cW=^_i}{zo(A|<՘?_΍ϕ7;_w7/Mݷ0ѣrK_~>m@&3ѽ.jd-(<7= Uh1zm, GM_sfR.e翲+G0?]^сa);߹TGPRz_%^jm 1vQ4:]F&Y׃`.lч {6=$>l'?6RǴ`+A߇-hctD!E&ps>b>o>?HyȖ3 8;SZB-!] 9*ՓIΎd//CErvbfKJ1 nsruOft6=F ..3;K֫^iT^絝εUս\/eH = #pETC) :4#HÄv_XN;DWC1jҋ)1K+fՅ/T΋iU(P \Yꏶp*$:N2[w?J<:"P44*v7 TMwDVuѽ:# |e[iyJx@,zφB!O*g\K TVgʡGGHm"zm_lx t'蝂:-h9]f؆@&74olK=b;TITyɮNMLeJ+~h}b\Vbu*p[\$b x45 `0wΞph!} 1#rmO!ߠ r[cygUF 1Ra2 *ViDC(F>LX,/KPd؈Ό-XCQ[zk9 g.Ǫ lٱL/P ;78ICKlQ#XQph__`_L^b] Jt|Emo#! bRuINlupiWGds /N`Tۼ%i ZEzSg*ݛ$3u!A*fja ˚} /2e_zV <ψᆰe)L8Fi~OWN3Tax8 F%_>Ѕ FZm !׻ ,WS+k.lLCj@> ["q}HB-! S^>)%{9D4g,,jl1ԏuxV&E?ZHFٻ_ړ f\ 5x{lD6HJ9 xtM~uz8x,Q 'x,hf7bgZ$Z1N dgmqZ gk3@ @7D %9F%4B߃VZwJAIu]Vq\Fx/F>ד0C9JJgr9s'm(fcx2 G;p{V 6`btS04 &WqED{Lj}Usw-+B H@J浝9ǧ>+$:!\& ~1`őTPoNb *6jc!>{;msE"+E q>-(<3o)7$)`(N?Kk ˛V4Uɏ!f9'3 pIY+=@ +rYʁ;d ;ja$[~~Ȭ,uC&>=Bzw̡ٖsD_. IhJ2#ڣ&1߱@w+75,l惜@+H,Uk"0=K'{+{28Gk/jve[îأD[;i Ym%^RNn_ɹ@{=6 ʀ~-޵| )|gA$#o! 2Qm/-X~] \ݐ0fKl#t+-sk 𷮾X< 2۰Uq/H.t=R"fmvb:Ҁ$X`$I>#NhwmEg 2v2DDߞX'Щj4Ğ[\-"\ Fm{C'5 ٖC"/Yj[fRP40\hv=E8sڡ ]qmK$J`=첼Ab푰XH7j:@JiC֔/X jx4:Ɉ hv%{*EP"<>fGtf ;<ܠS<9Pd: p@Ƒ6^@vdo[ڕ[*A-M\1u.ӰGК>Qk؈Xړ@du<76ʠv9D`V5nhwJ8=XI 37_9LAT^20Ϟ7;1:+5uF-Sn/_"|؎ x#[VPyW.BXBrh/8`d,3*+1MdrY|hX[P MH4W{ x+ڻō;pC6JTXFh,aFq^U^ʜ++٧en1dr/71~&ENݫeLLܐ~YCRB f.]Ln1}Da8QUsQ$y"/m;W8,Q*y^DQ.}O+Ll&O%RH@pcgo/25;ʁ[`Ȕ I|.VT7CV M)/-Ґ_DZuCՓ4h`NIgEAN0)> |ls&Ex0w>$bs{\,MY@]dEstW'UԚL3EtiIƚ}SWrKoհ TUIzgηYS>cx$1 s=V0 "V$ꄇ}~%lG ( %~H 2gNs?ł<\M=X_eԭl^ʕM|a0-|ƘK-ǏvMUh4Ȣ EGY9;ć>f9a)\[&hw-M\.LF#T &)kf:,H&i;##:gV pT-ƲmĜ"VTeeGr`tTUwDQjrF.||c/ТymkZ)- k|T?e:je:$l G\j,F\\h59ʾYEc+*oPoBcԯ!S?}"oZ?"wJA-(+]a i'a FeNQN9R!W[ !xT9;sorAd^_r}b^D_%uve%4}A27Z#9 X3 zZRwX kӘ=<%mNaIcB+=Ǹtj$ oR5.("D@9 YXLԜj4EjGDe(ײ6cí<~rs$qjT6o>(Z6"NbYf$yQ%cGB~㭪5|]? ڜO4M.2 4v{vޭo޹{"r,FU4,<<Z+dA+D 0*ͷ)C۸HQ˼yvPU2,f lw%K;WD'ᨄ9f2ͬ%4q#\>bg}Tj ETOfx)!XإN _pիZ+b?1ko2kEXI--KჄ9&[! ';6nE77Z2`DƔO -{wo.ш(0L#$oM<Kw"r2T?/h[ x(ѹZzًb"$%~5t1GfLN!6Wc8D03W1֒9} υ='o\D_”pg7 ǦG'`qZb)r(ea8Ud-yGGc(1jj鉑H^m2υon}''b6J1UT D`lʁTT'l݃%Zݚ@hS@|]e _$Io;ާJ䚢#2#Q|p mox;TmnL|hgQC/ eAϳ3/{{y,$*FV0z4QY<{瘫F*V-$?7GM;>3D#Wip8PQzDqmiPe\ j) x4KJeSa[i<.1JQkk4`@Fz!=y^!x'^A T/i8vȽgm<`w1uDQۉkoYZ1b]5WY*.x Ae;q(4).,8򺛭vFV4'{&?Mu k=γ\Й>m}C|s~u1Yx5C[y9uk+NXBG6Ι4$bqͥ$^e);̒<U5@ΔxnAT+ģxQ;UAJ?X $n4 ^rV:< v5_5bMaJ!~%/$ Z(϶-&|hDȞ3&cZ20vbЙ,.^du2(X@ סY,gDZG? f{{Biݿ\SX4D0#b7 JQQhp$!$!su쑢D7%bjbe=HzUZ!'O$D[qS[˼Rhs Հ:FIܯGÍsܡu4 }/xh+TF+U-Mgt;w1ݷ7\ y7ǹ-*2eM Y)ڔ*.A5ڦdS b# J 5_*od wigs<=!x6f4Ĉ۠ԍ!7<.)j;{gjNY F'X.52WJ/I!8xC6ﶸ>L槳l_|hXvotqiwOh.dcx)u[B7_d1ύg|)m{JՂ37@ H^Ȧho쫼QхCg6 v9_\}fM ݾnqDa##?= w=w|2gN JǢrbtRui Q;/rbƒX@.$3PV@U!u 'do~>"\ '"ZKOJDZWz)ɇ.+O΢☕xfs7 virrM!ރ jb17#+1csvKIRV@ZFsSp٢핢:kH%Iky^v*Gҕ±rNFV7oB, IB}K ht>'>F3E`;7Jf KPh>&NXJ&br5ibcyXj,ޏqF*mH4U t:7z6mY۲y oG냪۽,g8@5B7H#͡xg{g";t:BCvlASOMxdyf}8z֯Xf&(njExp+:^ZtS?zy.:VZTyRZAɨv 4BF%6bKEe)o50CX.S`z#-=U7hea^󃈷txf)"2^ZhjO pocX\ʗv.fm"d{ oʥ᧶qʢo\\Xex%b$5}cf"iF;Bԅjk&(OװV+ޅo|~N?zvR,GVЮzȰizzAx9$LIUstg1J5h}yqN߫m_ںvխͭWoo~c5MP/~KW~]4:uҷ_|G2M39$ksJ[WkFK=Q$ ^B`9R 7 rM'CUɈQ#7U 4 #.w<*ql`!tfuȍDBeaQpcU1LXeźNTglaX~+>un_ť"=qٓ|xy}[@$<ިkñ3F=¯!d3akc-7yg8k"1- Ř@TUOᵁƇ/t-Q:H<*\W]G*gtK0jj%5#S<+eZ9RA;;p% 3N<} U1Zal-.bf]9kRJF)Xd0D"\*1h4w<Qy!J<逶UTiS;5D%tմCpUga¼=EH쩜T ;T_/2K#&^fc*%@X}KyeAɨlnf%>q Ūn ߄JNd'(D=:s̓4sЍJY4V(9;)tO9".CG ̸f}"Ywљr(]}*p.hͲ+.yt = vG eCjCaR5-$*HJ(KӹGsg N9tY*]ZFCejMC=*Tlp/ uiTޥl{8ٗ܈M@ )AxB1 !_9߾4f~[mYxkيH'j(F:É;u oBXIn̲Jˡ"Dؒ0g&Lh&kd娕) sy-4̠aR)W7aGnZm-hMa_;]H# ۡKvD@;NS<0`pB,MO(אַF AMC\&#.\k5:@>D 0[t W$BŔD#g !%[Zs4[9'L%+pii)ʩT]Kqw#3 _ny@k|\d8d\rPPJhJ 2hKM/u R1¦!-#Mjz |f/*~rI cAQ#DCp[,Nf~6$D'Hy-C$fxsݷ2}z<G0^ *],GzPrcK7HLEFK (? $I~X׸kw9&- `q":T rҋ~(Iږq5) siuG~,B\>,ѢO4 #.b?jv>( o z]w 6NscCOs1)>Sw6em-oh|6mt8e /|hHrVc WT'8=OUGF+ӱ@%oh )יuH;nK2ũ3 ^ͺ+`0 w8خ{[0E dПٓp<-aHgow,ۊL'O/U4;ZܼlD9qTG*rS1A; p 9qSA\$Umd=-i!>Yk[tU{8$${K:p9BzK$j-j`eGIXsJ46VO(Ӫ3DzrY)MNRvӫt@zTsf.8;("]iE79X\1#c2X~DEyPٌQf:Fn4yh7CV8ȩ(FHQlspb"`;\90`w1nnHnp~'e>:;{?(D z*8UWgu cv&K#k1TB`) 34J" S +RpC*K'&Z#ս4'ԽNjO $=I쳧(Be RH^=.L1bZC_FIIG3Gliq.d1EPƂw^6A~D2?8KiY\YC!˜%GSa[!*inP7S?S$)hOLPhݖ;pBQ 3fই(s(=_!I6=pޣuIzFٖ/rp76#Etx<3FS"6gDWHICsTk>x._ra~e1zBRqDQ11b𪙧RF|,m"ɟIvAgw%_M&[x}Lȟ.c8kc..2xAZc/ʨN(4zjWm3:]h鈩Pmkw=7m[>N{ia#FuC 9ͼ.OT4Nh4'ֲ0Ʌ狈uӍ'Wt;*Z Um'zAFQsO}aE(nmP34/i7 贪YkO堫3O7/2R3c~x2k^u?6\huV[L`<<zޫ+#9@C/tI+)aŊuc,b׼YK߈iIrˈCaAm:3 JbEgiɄsN%<1&H$9>LyFr.(O=,Eۡwa-Prcs/ @ 1/k!'0،j ć2ߗ,vc7nOm/ea|@x, m)s 3ychVݿ5;>{pG ~䭸 sW: ]D:Hx훝Բ\-jTB I` H[e~髥?afz"WK-Lf*?υWK櫥؉)9j鰞ղ|gAw'p `E8},4mFD2qaÅjRI ~ [G͔[jr_#*ٌZ498*m¬Zۣڑ%,qy$X''0%ߎOb*`9h+0q̵~lZ>y[p(GO o5=m*Q zyBoxt :,N_it z*TE3qu_WrQUdGQm8 Gu\WF:4iF߁;w }z\Hg:ݺi]s_ߐé|\EaN'u'dPd8ؔUzy $G]j]%5P3e1IRҳ2:ʎ6agos2dvilfi7B"Cɵc<(5siCcdYblFhliv#6CG)l5:HT!Kj<_Q!vtJK0Py"q:n%laJJhk5jNHU\ CL7q!C&ù+ˌCj>ad Ӿ`Z !ʊ,kA!Gik㹋飸7bMIl ?Nb\i|q*rrQ1^"y RN HIc8'3hK ,!IZ;;@^H))ϸP̜y9[(](Y.5$,VRoX\||lQ9z4ftJzYkZJG=Oz\ ;ȴ`ՉkMی+I5⁩yJVha_^{+>@VPײ9^FK&m9F9T!Oj Nȳ+|1iNi|1\OqT uB F?\gh!$ʐTDۇrl.nFlFB-K.%7RZJkRT>6(8 [gfQn*yFJxjPB:q2Ÿg|Fܔo$( FD)1ZB^Áb=[N(Zax,°8l/5tuSz[}h Er>.kHCzFK=cQLZ%^pFG\'>ey! /_bq4Lp/2>&M`XiD;t6.SqDPil2i Z[k*^YVz<oJ5YB1ЅQ5ވ'?8זo7')_YcgJAE%S:CQRކ8ڄkՋZ B`oyy?̗ͤ W"^N#5{w;04ﲪFS=T -jÊvF@|DBr_bx|̪9B@H]C8#жR'O4833ܓV\m;_rjY\ElQ !* zsz.FZڢ S&(Vek{ṄZB@v[c,/S]m5]OC#Y"#~H7ђ |«4M'0rOmRWcs4ͫnf_Tc"&m#99wcmGp!IML2c~FS(<+lpHq EDa` L#l 0Ӆci£uEs f{Ы?oouk[ׯn]۾_>gW/(o>G:qfVJUguW0boKrb?-1X* P$dx* ^Ҡ5al?]n)`'<~s4eE~YNEk&cA>G{IZNDaZBR7<j)u2vFj@0=GU3XFe:|7|N3fIrSP]lbsNՐ SE;Pg3M' Y n%g[8&~9Rt_I ُ?+WaEf{j:0x5_dE KjR_x˓aBjl`OۯOwܕ pUxD#Kx()5V@g#(i>e# qos+%dw@t RilM^Ĝ^Q.2ZXPvi;dkSED לl/^`zW PSU+^+eHDM5/gI:Se"j 9ht%"(E [$TOV\(o'r/!&ZAhl7!Lq]3 *Ek3>jl}$Fѳ%ש\qȕs<@RnN`UL>m֡ߕY!C]hSS6E/QĮO3ƑxpTShhi)ZIvnt@ws;k:XAI, |P ydqӐCq$ 9j͑j{*;g=?i!([skV[VYV7/h 4t š(֜4%fLtt&r;3>=oM(,y@ D+^'(?>_ 'O()Oi9QKn~",1U K[hrE)?MQ4r.QL_le7نM<[.NO yqR[Y)Ae%2X%}9 ʝ_XVO`~ꐶi6Ν󦊫 ZwNLS23`5JB/+BXOs4,/mI h8"fMmB-к4иIuz4Bf0ҊUs,PX|֚qn KUioa ҙ7Rjվ9 XLF~ f%bm޾ R ?N`zG?&rXvx["QUVi K1qyE4=qwdv  [k i;HYIfuN; +LgDR9_YɧrV+DN+)qbP9nbAYWZɩ9Wg|*HS?iYv2M>ٌHܨUQ2rJ%>՗5gV>Άq}񤁥TyTɔ*|ADO2`ơ-,iۢ(0rP&)tnUvUuzpN7KƬ9Y'Q^EHl)Ig*"hyH OoD,U{E6E+g~mH;r>U֚#O+B,`KbXZk8ig\=Eu^䧓oݿp֝o?WɁ#\A;PRN [-!hI=\DϜϞ}eN"däw|߿ύ{v߽7x>޻7wݽmi[nq窱s۟Ҥ}SdD-XpɪG!tR3'jZdD@kNrTC? k@c[2m6҉nY)krDeT4by0]l Jk Y쒹8փ-V|7uǕUE[1b<{|JzluToăl+c\WJq 6[F¹$aȇq9}p0k%aX.>q j׶m^ںvխ*\|3OŔ r9I*.n[H0C "3: F5>#-eGDB~$S GڮHܟ|7s N7RMr[%W!*qFV eWȂ)M:|^jV΃(G=CPQȡMkq0仜?(RkhXA& l؊PSM1ԁCV]!3Ϻw\:[++{I֐lᰑDM>źsi #P7Vc$6a$V:{ 'RegBu0.P0SȫCc\DOӊ& v.c>} jsZiyj\9%NrVկcsQcl5HqTxY (*™(耊}R?O]Tl,Ԍ={i71{:ėSFN8(C:V1r lua9/!1qdR;(FݪwN^Kׁ{hiOMEw| πCx,r&7R J;Fz^NRmbj54c8)?p*N r'=H&Z#$_DŽ됋 +{𤷗D}i*^ Hiw\8BK kw6eyD 7 b|*ikڈ,NH 89=kdCXufx)nF((%Eńϛe 2%WW2m>^iCW^1Ih<ʭbrCEi]0Gk>9mj!XxZ~ơ! IG''m(/V A߰SSpaU7lwEw|AG0 ejpE ZAD9d;S^IKu]x@UzUM*!ۢEae- \:~hӀ ㅣƴ~24#YC2 q4eE$cA71Wfض _^)&@zLRU B},1!H(NaߘL'ƞ+jZ(>0h"8> %&Ka]^<$ڗ-:YX)8|uE(ylAn|* x.\NP@Kab@|ӊxK+!()q$Pl4ёias+-a*/ 6HXU9qrVkU eR4/UVst[D>-kUx(SIGpwZQ󢽷2"皓.ARDJE3j4UsWLѤNsPR \t&r>^JIڜV5W:()mHJ/;Y0'4Q-{ߑ/Ë0'7`cij2fZԝV K:t>N/, EQ|cX;)!n7դsN򠞎IK e&p_ݮ(N lG+)ܥn4%pe켰5) D ~q;lcs\LwK$v\s9 $L|( 0RZaeF5:#~MxZW aЛ #M|:QO6BiWчDRH*؊~:Dy)iV)s/𚼬MV (p4Q-04ҍ.@gڅ~w8ܶ!pUB?CJ <+nD䀯\dB *+<#H"<QvK߾̄>! XQjEV@ _CDT<(l7&mޢ $ľ{GǍ%yk -+w׮ZuТa e[MVIV+w we ~3g0ugAFׯ7^wס;  u/:ޗ: u/{?Z[>/+O?q i,sRr|?/oSw dҙS'|˿%H}᧾z?>?)[Hw _|s_*O ˯}~ Aٿ?Z~W7/}99/,2?=L _|_|XwɏC-5JZI߀$ _A<,V? T~0vap\g >|>|o^G{? _O/^ָn/؞;О߇&Lw_m\  6c ml}/-Exh/_G}w//4ڏ\?>/?ڀ itxy)?K݁u ?]{/,?7苿c7,?WaaGO_MOoS׾> ??Z~#; XA z IAY8_zO~^yiooz/_s9@,f~o[xqŋ!_8jPi?wѭ&ݏho{/]Z/Ӑ_~x?Ưp~O>z?yWXڵ/}.,wVH/,W.~ۿ7ࡽp],X?ǿ.ZUa_/? +Wn5l琠o!E/x??/]| ]z˿_ ';`[~s٢{歟la zx&`36\;?U?\o<}?C>6㺯hf6V)4nX#wHm1eDJ%*q<[{hGlA A4_A(REPnPHZIJ ʩ ޼ٝ;JejBݝ7_yy{~>u}{$ _\/wl`KxK0_D0/k:OU<3tB"fG^x\;P^xvHc΅ycTW쎻ΏPԱ:YZ_"I_CaDBAϟyUC\荮ET_y{œ஦"aȁpIAINRĕ yoܕ)i5Ý_Rr䳷JD b[;z1ρp"$_>q pRGOrx重[/0ޞ|m<ɣOmwgx zz^3Bn[\ yw؉Gk~c^CN`?̿ʃUS 6p;XtH'1$]Opwtsa˯.~k! _}V }ߦ˯,y mkcԛ~^?%_T.rU )ϖwݑ{ZnT;~g~X%r/}R5VEηCR ޼ɷ;7DND#`^l-+GA:bv~}*ރn;gekYw@@nZnq)=]3ƻѻۧw?Bz'%ܗuCtKtuU>HW?]wӵtk2]sts,]G?u_"4jxҲ~\aβ- $vVί+sv+S@1zr8LCgWDWOrRϲFs ;/U' rZ-\"&xW,{]ΫNQ]uwuHBMmub*u;JW J;< Tpv̺(;Ve~+x1c vw~7÷;l7"kp-5lYP2=w0+hVJa'np2!#^o[EeP xd/$qsz-wv:0oo9}=[Bol6o~{wƁ_*1{;JNx49裑nu0SV=02p"#ۯr-68g5 ۙ;nM=L0[QmOA؇H=}8[؇ۭawO*w/W9"r{SU z7K8P7a?|`Y2] ^@؋TZB@ubVg+=сW<}]>q,3gbQѽ9hB0C 玆Jd6?e/-CL\I.0JTi ?8b5RrmYk^я i|-0;]r-n uXHM$c=vо2{V $8*ݩ7V;N'_+!$ yx&Z^ѝ .5#A'D cA=Rb:6^wa"} aGOr7DzXsτC{G);")78lU 塖-3êJLXa \ |]WQ6-pP4a9ì 3gyʛHy6S\'hm<2v(ʪSQ?C<ڜ Rd*><1[M۟hk_{m}n|_;w]w)˻zv ˹G\Wm$}_|8v5#*_7/h\;'sGdp`tn$ǘ8K.`nJEBO:pf- %[|(N ^~Z;m!|_2=SbR?iA nUA3̈́H^= V d6C3cZYP!tB\!G@-=:9EYB2 BKd['51duȴ;K3]N˦zwƥWӓdfr-k̓23-)LTQ`U|eXءz:+0NpzΞv5jF (su,θyRCL!c(8>"ʇDW)^r5_.:<7*R-&@},hFjWBS]3tΥIWY)ߛީQZׁ^Pjl|c*սQNr{ ?ġm}TiCLEv pLb,2d Өci"5]=٨8-+;3-!oȷ/=''C2c3q2- c=1&31gz4̗P^cޡԖMvo&@_5񌑙x0RQ=\S'UJCDO 2 &|^6β+>퓏r9Cer)FUZ2>5 oNJAO&  ƠPɤ$M%E7N ގ*' Gsi>XN7& ^K$f*kL%oX;1rZZK9$p+,obqKBB~25h7W.M‘h1G2Ԅކ}{F3dPB,1If.kJha "| UUPOj-~\RrLLz+9 T&1 e[K?HO#_k2-J&s։2M!piJi}?EY̲7èYufʉ $ӎԖMʪF2 }!u|yA3jXRv؝%kʄXɘo$5;&7D+?6: ĢaJ Wl1`<^ŴdJiCX+Qs8"_qaZ9q'Ryg Q.X»bz3SvKP\w+6aNЀ uz^摴TPa '#`p&g#K+=-SzZR_'NBVx(ƩDHq ?~#Jּxy5 צJ;:[`''ؑ`#k;S`D ^I:\! Gee&e"!- -{v@.NlL 47T3P,TiJ7Œ(F<9k-g/VB]8Q-]@5m|"(N:t=*u#k=+y|zkDm$tl; NnhČZP^5| 2*WỈJ !-4o!N`k/0Pvg_8z29t1#Ʋb+AG M%#Jj;,EԤ BA,gGq^P_-,vfYbgzP# T{j\!Z\8\G0*$e(Q8ҁu@qE}$h3$biij\7~q$jiYZI | +~Ԧ F8R.gҚi!TyTf RҲLZM"f9Ovg9?bǕ <mh$X6e8H͉.\@h E'^`_`_;׺u5Hىwv֜rԩs?^^|՟sV3q]rYi1Q8uHWbR<"bXF= wc?,X*` ];cIJWt龘1u6BQ3`AԐ'Aກp^ذw@kR OUK괰Zӝר$ 6 dèdv*Y'=r cU0x&;,az Qa\pj ' .۔2+ġ#~J߉l6WQtI!:,G;dA{|`=Sqk.()ZD8nC0p9Jg٢(-ҋbF} ^W u7i>vr$ ;F_ph ~AUw e颀_^<`nh7 SWpx1Mɿeuv eӜiiBSP^ߢO i:~-ʋiqHx fLeI!Js&[ ͑K:_ >VD@N?s-kag;ֆH"`V"ԭ 4euG,c~Bwff@&ʔE.=Xc>ӱ'xHrʶ2Kr%]'̍ i3Ot!M!YAL;ޱ&ZY Pt9&^.;/_ 쮲TqiEٌpFo@1);2%vF*32c$i/8?tĆ)TM¨)vF{Xԑim-2ig1GOc$bۚ!vN|e}I͵yܤhs7獟XCu86iWSvw\&wyC=WPP J$ M BPz05q:Ϝ؈. jqNԞ62eب# 771Efܘ`d|`77Ui7WOp9r~,)){ZKMUAcG_'o.e 7'ofAM^d'ks G?9v+g)rDl붇?5#a.AzD=y~rywRP/H?0W0rt-cw7^&~pp{^|7$L8N,&?Z/tSg{1GJ |nboI +$b_mYD7ю=36иq{fq|sBf[Vp'wAԴnz$YƔJ>AY..vW/*1Ɖ;TR/\\ԤsJ^(.׾sGQ[?ldS o?$O=?bfcͳj%)Ѣ2Q߽|_.дaH˓7OXeVJfCMTMw ln⳯h@&~I% megGu Ȗ$tBZؾ!! i9xRC)2Pn;{\F1i84V 0u}AJTJrW*kQEK HGx*.dƟ. ^ͮ8Wւw![m{B?oHY֬kއ xO uFJ+g>[|Ed3ӱa|"D#lj7gYUjΞD ] Y}}H'ӯ\Z-`'ux GT7iD*J];fGmB8sl2"e Sb)馹4+= Ƿl&})h_6:mnhIEaiP98c@VϬpr7&Fui3s:Fc;89gM? C$1t=\7yu]20(ntgKo8Fg#5WSQB }f o)ē{Vܠ͆:f/;;͆eޟ&;*"v#0Oӄ|wC:{cj_{T/-m?`VԐ²ZD2v P}k/jΎJMW,Y@6XڷLQUH\d7Zًi Rt_J8 &a}Rm*LC\- 9/Ojx5?|m(8s5qBMqctk 1mjq+ꄅ]ujN/QBYgN%̤_LzZ\gR%@1p3cHArFb /iCۏ#`Z)(EnﷅTû^ip=PcVSb<0IAT8,q%-N4%C*9maR6Q^$2*2Di=,{ۇC׊2T©HGQA 95S gtoMg W擕`T_0mgA:,l*jvL˲ FW7ܣzof]PHcc_&uCwP] #eOPt L]. Ӭ(78KJ{Ow[:\%1Y+]/$-2>"?K5նzi3|Vi-\ub}[(\dh|s,)Yn7m\=,Ѥ>}ƱS)jEٖƞG3Y,@5<1t5mkdTS\uf?䗘֫&yP(SY/ݮja=BrW*`9# !,}B,fdJt̩2lx L?Qy߁%rr06)CyD앝 mxXD&L,ERyX4&F\k*ndDwH{X3zfiH.Rcxim:YDUSħu&uVSPc"(FDUcd6`gϳPb9 w5eS^H;]I ]d8 U,TIA`GNn&@obѦtùv@ D/J),0JyZa--;X$7Z8Πu;xV(,W c/¯>q7ZnFf3slTslmɌ5#1!J;u@RŬs3- dPRf^i y! r!/;̇oc{/2}œ{/0 2.W wt;*p+f!i<+\o.7Ly|k$l%K : yXcF-2yBMU :V 1-D$Z8HÓT\nE(jv儑ѕ8#6.Ho40tĶh[#\(tdIE1!_3V|vyףEw5A@un'8|OcLe=u'✯ ]|S?{,X}zzg/`d3GaY!- g٭nB}~hVӊtx2ƞb1L|A[N mЅ-Rͳ3.F"z8͵'9cwD|ġL2,0ۖZIIk@6D2%Q(p;)Ep$r,@ wp?|#HOCK`~_q EI`E9$Wcy.m}&PGp 1%-|6=ueRFXzPe§JxXcG+|w_eA ѯ("|C񀖘Yk̜T |%7)t?״)8 rqt\9x5,-Ih8] bL" b l3F!:~왱`cc58D^HHwjCDjk2ÔK)$T!ϻ6倱maLf7_ȖE4qZhS+L^:=0:&;BYPѶIҏӫKKgb{*Oeqhԧ:'o'u!&T k-CGh f$X-VDeAUlD]6,$t7@8g6exඟM%AC P&E]pT㼆p}^-2.*& "7"l"mŠj EݔupbRcvwhSE:1fkyrEE)i>@bCs\[+.I52 ={_oh;Gk>:E_ǝ|tʢekpĹ4!zr Q$i9[ `6gˆP-A=T%.| |9EaH#U: O)Z!)KzV^Zq{?tQhvYY[pࠓK_d,9d9.i.%Gr`\ϲ4_͝KvXjNp17ְ/#kan9Ka^L(ruw@gV/MCNeIg37 iFn˲QLx TPp؅] үBh3v<;bnI:s=i#c3ThךFGL Vߺ3A-ŅvҜcd$)(T˃Gw/G懗PC,M/;K)Zd-[%ejҪցb# C-Aä3ֻ}P {,r/oV zqaЉV"ȄlO !|a_3N(B%`95/3T&lahlT@a/}8iIc6d{%[)(v34<.s^RFr1}Sqb&2UK/+C1O5G`΄supj(4K+|ImD4F֌ ziiC9]Y߭G J)KW@Z^OB3bgSq{N46,C[C\NG]K^̰Ml$+HQf ̼,y$O_P0F4qQys8aF % REWqim$) KF $ 3p2]lH4>iso?TdMWeV&54D&0tlc=p+U"pp S{0mWN8rh8njna(h;'vEs 6ԛxPbP1]#=+1O:8>AGw[ޱ북pA@xD&" RRp+ZDȡk\x-)Xdy&wFifJ ZG2!!u[Z}oޔo !Kr[:ݭtwy8FO3Sć.C0tbi狩{:,nnk>''aEy!~Bվ, wDkPd=şYJi{|4ZEC#G.P3y5WPOͫ=!|#/%䀦.B͏]U&/jovz>iK`WxثaEȝ''}5n7f7iX0_mX;I35Q~P9_QDvmPf[b{ ̈́GQߑLvھbu~cZŗќ.ȣ2}/0vk0ЧzF@^67:qQ-s & 1qmU#m)ŋŀIf&#B,gimX{p6USx#QI- =%=o\|JU>x DfKפl}tidR(ۉR.UUOר'&wG:?_ Oi~"_>tw+"[t+mqԒ9#KH=FD C?ᰢLCIlV`&=1GrX*t65N$׾פP_n(;| #l7E /j{xmD_ &zI%HJ)Dt/hw3f궓 8gf'T7PEt=ϲ.ܫ Ygy:2e[P]QXl(zGV,EQuW_z)g QqL@x=py /Xozj<4e;usPcB;ª}x^PEFd1v'ʇ0>1󊳐xyi'9=;r +p@No?ϊTR>/[8l},}[+}N5f(:SB?pènyӎyGղVnq&p,RuDRQ$e\ÂtQeˍ:U&F tigOk~a9NK؁oyh$tk:WXF<"F*F{ x2+w>Wm֝uLb̛1Si qChrS+$aSVHe }̟:KQQWPEZq;p YzGPq7uIϯ4 sTybIGde㿠Ms]פM+H=%}|5Hd[s弒JHm YxCgFX:+qRYeڋHЖ9DR ya_>̇6rhBmr<j2QP  .WFG^ rs{y(~Yj$lg|/ D˧MT'#Lp ?wpb?m@:>DLv k53 )s>) K4 Tď44*񉶾DmF8r=.f3vu!'zI<Irz5 D:.%cyi-tuDI[GG(M)vx݊{xJO"br#E5) Uj:kKFY{fhtWfmoakYݛL(jXrNH I&m~[ht7xT)u)q4r) oYю(䱜<(2@apǰg7)l#xXmz?p⍩y}ά}lLyG#-X8;G>* ǗxQ o{U5Y[jww{p'HNm'zF'b'gEэOR8!Ҋ@ 9K% R7"?,uDJ4.d\?#>d\*pG^|B 'p%!\87!xci)5LH u*{Rt)}2qWm;![VBY}Wk23N qx#sNOFLӁ+,.SaBץ2Џ#Qm}_sy$; ) B6:'dUa+vVI<w+nۂȎTYFHz UD|(O&&J[R _aF8]Vh $@R!,^)4-@4l gCg=oV&aqGLagЧ+lͫxycqPZ%:}ezT3[11x+Nh~FYwdF${P_ĻG|Cx+[>}9JbspYs|)ǣE7l ۈc|$v/hH7Z v֜Scwؖ1d8xa7@iC@*S'W\6Yj5.3|fbV6|KM%\ȅwv9'&!`*}mء/;}GN0:2l٦̄ SV}¢\9*3N$erǺ5•N@f(='6nJD9c,M$(K?R6{&TPB^-^@QNţ/yy/ w2(ov)l\){'S{?5GGLcxTQ}'@H6̳}yZu_;m E%,仛-JjHqc!/0^4yܡ] 9h`fYu]VVC%ƆڛXbg1W]!g2{8Opj!po5Xt_J,ȖTY ͩDq8*j;bBkD/5 4>1rCp|s9ϤDƗ멶~ҦřN ]xz4ҒG}ޟvs J VP,/zdO !./U0`fb$cM%d֭ķs[!XAr$r|;&=&|q*o"e>:"%@!owT(NzSD}9 z}&0C8@Xf7t߆k07։Jmc&E;HLҺ.k{:g X} Ù?$MYc|V90{UvM~+L m8k&v.j%@~5 Y<2Tٿ-攑!KLM,x.ˆ ]Fb|*$( 9wRX^ЧI#&\/E9v^J|:ܔ!. + A?Ƙ:GFvD= E>i˃h6NKƟLx0Fbv'!7L 2lzJ{`TN6+4NZfAa7ow_M~\pVb$p,,PE StW1 r`GҦJi5yIKv Ʃ.5zgVo,Ele 3ĉp(ղ+$L@Y9PL!brs*K9Pmg[H Ky` U Xccq'/i9dL,[*^Y9]wO^%gOHVb!rd'-s59 up,H@˅I=&z|bȃ6xȝmrj_b[KD!mX 1sqEF1X2)Ud՜:A&߀!+vaTJANN"!&,` TW(x B@' 0?9K# f RtCZ4#Wx-aP4ZIx®hǥOE_ASyʯh$Te͓)VPlVLjoT5i##ʶFMX#f-HIl2,*F-u Y1p0H]o,]bOڴ}(T2$ɠўe9=0'Ѯ:/[ƭU |bEewNQBrT> Vw|uĵM%/D3,NçLlEu".b6ԨcG5?Z1O}ZhLaӈZ5NLU"1*x&9-RqnTYJC';^Y0ȵT5fty "kkQ wAgVYgOcsurÂ-:}Q6Q-hTݠ.W+?h%!l,&U5^pLtd(/G BG>,W5s4`)#t4 0Ɍ"oy& 6YaUz`g%`fHYk=?iF)VpݺlUv`ކe rdeRb ά5O6Ln3J =L^ 0 YYG+,>ڜ&*QnQj;1“8R(fjF]q}͙f &v;\Ƀa"h@)r84DDQx'zlPuLH3ȣf]ǏuG3p롁gǪzUZN }$p+O+:6?#:M[z@_#u02l0)/rUP,5pԅvXo8vV=;5ΔyAeW\5CMT+2{ˢs2wn\Ee\a#̘Tʹ'v&sx_3֎%0At`b{; Pkɉ =}p H*h@A=糈:ڍ:Ov Gk -w`?j_8JRX(MQ %oSzOR7C4VL_d-3?CXo=n;0?xKwJwBvQ61s,OZM\NXfL1-CеE^Kf 3Vg[ uV-\q h4쭞E$>ƥN5auvM5]蝉I-yjZ][eq$45pn BJcDE)wh'L6gPs͚]e\3t Y=9JM洷78QJoe%5EQ\k 9u -Rl礨Bs3Γ'].܏MpJ| z`5Z@y^d}oRŮ_F#̪]#؇9b"15AaV<1y5OQU:rNB֛*e㻔4QN[<MD`OEJw{ܗ -tbݬ;s X-Ll1::VQ>զŶ׊qMrjo-U|wRdR_nc]j6/fc96TtV Zݍ3KZ EVk3.bpdL89"7;!wQ:,y2K׶wQ,< 3S[xu=ٞT7O} H2b cbU$T *R*n(p΅FɐYZ /$4X =>iP,%#*:/w[|NMD*?{ 5iVrk W~6Bw 3.d&k;]cxRH_II0R`_ @ҽes^(f%j4+Ԙsh`~Ȼ|'>~P cx~rmhk< j,{"]֊IzmJ CaPWeJ/rYWE:/4+t?' 6-n.Ӽ1HsΔN^/G߽}3JH/^|WŔHf ,RIT`#ތ ]g;S?l@_y2cZ88-"Y.R0Nv.dp6v'NOɛ7l nWNr[F$5>gʋ+//l8s ;bKb7ШZ⚢< ofA=W*{c1e'fL% p5fyZ 5"1ke!|ȖeJ[CRn`o@=1x2l1<#IΥE~t6DŠXXZsvאS hȲ ݯq:g \iFE>faKa'|-e,#P1G-D#)WoK&<7~o3QV,t0GEݹnᐟ q/}7#zj\!HwoYUH|Wm/L:3 \_"oyO(-Y_,3 Bsxx~ cOڨ%م|p'_ 3T]tBN)GoZ/f>Oi' o7W˳:|\bvji;|blPS4]A;MH2^7j0up=t~ LrӈQNLW$i7:[c.Ѓحkļ2~3[q)OR}w K~Y0]|6] ZTsQJ14@;h!Z 輮yhfƸX(Mb2+bg&Q1G5rX, c3(03BV=O6=ީH6ZUy)cPӔx;bx}R&S]p6m.-d?̵lmНR It=U??7aF6_Q6M%kT8w~mrl |QѰ!d䬑gEa 0JfZyXet ϩ=1Z,W6|/@|PF]RWJgx\霈¢Q»U#r5hko{oyZ(jH\&5΄ dyq/c0 -w\u phKf0|ݻj;Vۿ\T+Ȳ8muCy68`|g z&oǓ gg]9;JL?b& ʡW}*EX|=ӴrRѪCi1:]'./V 87 K{QYsoM{P8ߧ'xI6׏9k+it'asCB!|^ie^8t^~MtO:d䡣|<+ :j&F/ sQ/h#MYaoU;F|w.;&])cK&Kc{˅CwgJoL㓀+}a۩/%](K {jWg -YJ0 ;t-dB: B.դ蝕eYbj}{"ρ0_ՎI~,<:tp$Nج)~g2p- LR`OR0ԈJ0FuH?^l.Aba0CKjlyn7~f'+L9ՕR9GI0'v~^c G.G,2T2]W1x֯A-e8Sw ZC(ݸYe麓n91K^:~zҵ_>wIJɀ"⺱2#LI-[n$ 6Yq4s'zΈIΟX+N0}9:حO 1aOsEbI/#IQ2EU>B"SB0X\վZ]SN{X+$xxMO4'w^w\_|1h4T4&Q5pES< 4Q"U‰^q#WLCdui뺦J2^}8N\%EZzגwWKTl5 t.T~TSZ>O.2\JCn3xG僡!,i kwkYli7yu$EX)ȸUT~RC|IN6Tc\<.A[{lXdo'fwyF:Fjs5b0Y5 fTx q:Is3Ӯ0b\n wWo,I鬯&(UeNWn :eA3 H{7P]KRMŐK q|V: TcӁU^u!0ErN8bhN|97TMPn:GJnjK ҷ,o1*kTz 0UZijbx]Kƭʃ>BVY5](X-41G0gh>hw4B¥ͽAw-0x^%̕*7 fh=Dڗyr:KK^ǖS"Es5F#el4^yI\FA)?n.]޸fYE7Go>GxX(?d@=컷L27?O:W9hZƟ߽?x&Wk :?}A |z/ά[ ׺RI^q(cbMۗ^G&ul74›1YmݯG`?'=|`I7ş=H?N ݇o޾~Skl1CV&y~<?:1ޟ@ը-`9[1WV% S/$O D!@JS9A3YbnsA*|wBqK/bI9W;mEA.dxwyϟ}e&vlY<+ԀtX縷Fk{dP#T` N@d:!)Go1=XEV_,\WC* "ĢX_$EQT)ݪ? H^}^RN[Ժ!M\P^].27j[X74U%<)Ɖ}ภ%)łLEU`KBޭSzvw^g}MdBUrq&Ź"Jt=q9ipm_cQÙ4͝$[(HZT(n)j]w k,$ݢ&~`$**Գ :.* gl4rno~.0:`_y?i>?o7xA9 OrgتO"bdIQM\ 6=Nd r! ˔*j\lLtx (0Ms-gDǷKSV\@*b &.`-XFLON;M=s h6j {H)gO:#ZۀS'JCt~U52e͚'- |aV/ExA7bQkO` *-X,`X!b:pt$C7x& "\"lCJ9XzF~X~X;l(Z8_gLO6ڭȓ\2 jXR5;mkdy&ſ9eZCuA8N(avG/GdU¨-a Yh;}t(XF4+oh%r,ߥτǴĝ.c9[,B-v G#êS++pt2\9.J :,;ejԼzjwǕ5z OX4ܭ\UZH{ުv}z:]\Zg2ۧHhQ 9 <EtVU.v0 $!Ȯ\}1XҦl;|QLcmwѣܣD{,}f= 򒮹J9uDs6k C11~!U:Q qbh !vRjtxHI/ A&"IH ];VuDZ4C= >hU%Þ'y@jZݎ'HN) 1~@ULϦxҨ=|UqYm̉[ 2|oouMiә`JjgX<ܦ`IT8vx0[4cfbhc` S( +ϲHHKWSu}TpbFi08ucw/˙n%"޾b D0Rr&e6mNlhEt2eR'}&}ˀ8V/B5ce 6:w7~ MiًS|<[,oʜEAUjk1}չE[= E^fѫ;1,"CB08at^c[(#7fVKz$ 篸~w;>AmO6;)}]?쯵= ణB Jցq뮱骑$wGL[Ѡ~EQEԿ74b9_t[c92iH[8+>f[|㔙٭D!63IGkg-MoqTm׭pdFQbӒz'hFK@%-ch~I>~Bqz` Le~p^g~I=(~ ~]}>)*d*uqkSAvtl$m]i8ֆ`zZ9iIW` LO2-^'0dsV|B[+]_GOeZj 6F*M.Ǯz#7[ $3rxF$%,l|;?OnfN<$i5=BciqjKy$ 5A0nFtEԸ)gkCĀA E00(}T-b(Z]DMxUO5F!~XI\HrK|0e:wK*^]iU)Bc;1tNQpJX˻^u9i(iQBh?lnc53p8Eqvz,uq]jڕ(n֋QZ+Ȝ1}| `4iCMiƅPߊ+ ǨuzEUUWX,_5/%z͸hI;$tЪ~Xv칮AZCTݢIɜsح9=xqggS+&yI4)J|TeR _ll"9 WzJPM~%z@)5[QϮź0C6vTJB~UXK{TV;όN/P^Kt9z \1L*@rGh#/g> Vr0xXxD*py0C"ɥ-VfK!G |:wYU Ux !syPU[cR)+tx#N*TbD~<.\{ENDM$4dၥ 'K"P*kj6rGd5oi4nc1{s 7o?E$Bc!Idp£Q4hd'AEOn6P@P6$yJR fR\)JZtJ<  T*bYuAN8(&yZϣ3=P%SO*O\xo4]!Y?FR"c)a$%l 5z};{.q0˶3^ΨPaw{NerQNrIƄqrh35i2rG+$`W UMoR-+[fK*!ͥ9vSW-˚,F$N{UJ΃Fy]dJBtz5^97^hKD=@K 5܃:^kd|*yL]i|~x;E3:gaUy2 ZDw"y^,8k4ϮFpHv!$m;GSxI5 U"HP# 1*&~{e1Rp\,-w-$~ʾ-" O"Hb^:@:"~RӺog䖐K[C@x%q@o;̿{I3LmQTYM1v13UH%N4qÒR\iFG*7 q.3w5E٘;懜 P ;xl:&)'k7VugG<&Zx{#ѐj:\Ȅˣ.J Twg {,Z&@70I.ȢDmtijH x4Nl(ŁmAS2 y!M+Vѿ;-PW}:D{XP!"hɖ gԊy#FqMsS41^ aӤ-n{\"_Rؽ̏})0>ϩ%-g8ܾ?\7 pvkJZ$cZ|*>8=w;OsYx%$[TAؾ;^84OA-+DLUstH<'q;ECcTXJi~@33Ssn25krG=!q'{dY>67m6gM zOݓ`2*ŸNu97ؾfaneuޝ~ǚJ_]hF0tnxI88~ 5NQEe퉻zimu:/ > H97g;0v`s TPl5 "9o>٥ro3zrKA;\ JvkKYoM|y{{*9}˷/>s2yۗωڎ:|=qDPts)iѩG;]`zh c(Cԛfj bيy+usao ՃI!Ȑd5wUAm7@펶=b/q?3Be3 y,Hmb/1QW?L1M]K8ߝO_&4ʮ~(37$˘K9BY9,goX||WE!'z'q UZ^Gc#pkHPd,䴨ή]+҃*c$ڹ1ut@W:eaCUBl\WILrZ!)V@re;)ôd 4IaB c:c2{L#cD:H2RF.gscf[@+j&e]:$98qcOE|s,V>KiPceo752L'xN2MgwMY mqUygg#o$hR3(hQVs5,H&0 AxT J5緆}ƒLSժ* 7&siu~zd<)]ۨ澩N0^lKg&<>eg(i:Z y@K괫6J<[4 `ASr8i;QvR ekBΏŒڛ6ek;Y"pRXILL/3h=;H^ K$g9=v hObH)KpChN"/jrqX<[Q`nj,,0?vu ^KW#])M6=+ԥM,&n$I6샪 ,(9տjMzyrO~8x~10O;ϞnOegɓw$ۿVx$ɿ5z`_㿯@vJQ,kl4+^gjl^D^PXty_fKM?ߒsvM.yE{eXo[~l4*PUT%q.GՂOS*\2׻fsu9`j0ZSsE6<ڕykS1)*bb$"7Bȅ# ,z6  '?R̥)[) >Y6r7{G1X18S{+>@gKK?9$YY ۹ fgf,p!ØYmUut-l1CQvzz̈?>:o;<vb\7ŒQmI8?=7A_Xj^Fqb/j`%4/Q9Ms c`L7_<ەבŒ}HiPULeM۫rnu8[ 4}u}p^E c䔚ZłI1vކ̻H6ۋ%t,a*)#Dc__yre钏ĥ_‘]) ̧tޘpZZn:/v(B"X;VJ1-="dKPBDHU9;?yKtjErpe9$dpstGbO؄ f]I$[;X=Z ӡA7[<4Y˦$ ,A 9h'1v;tXPX:d3? tA = Qq~~A޾?3@`U6Sk"twc_Zz$iGA[#OwׁZ`%ŒM6\HtmiymreOچYI5㝝eޑR}s4+wG޾}<2og!=}f>rP$_s&ߢʙҼp9h\ЈڑIHM4`j\ZM%l؊ԒZ ÅRmd!b "j`]rݐ1ʛՋ<ݭ-Eq>2[-[,<=6(/=bluc "xpS|hNR%NR/ =!@@gxL=FhI^d"OW9JP`hSC7{*MOv@RJEtwUB 9Z=B!!O0Y=V뀉s"0Kd[s1mkt0)2|tA8JLL*$ ᝻BFۍn+%"ݩL704bN) D2 \tۻOTc'WM bv.p(0$`&e3IK>4CGJξ<ӥȋ<ẉG{-t)]1CĐlq~ϟ>Q73 ~Vi *qiaTN>mZku %f33#cƴ_l=Q[:npyPlS'V#qY +|aE[CY>H[!'{| umP$RA._0 ̫b2=Y ^6P &D6`j!:΁ xQ\3N~cyT9+1LdX@ *i^%ϯz2dž7 K ^d9k(3<[HTm=}ԷxIrF&~A~>f0{d & ^/ؓ 9,>atcmpMVN gď7+dXiy: #4jF1wJՂ!k`jIt,Y~\c6fnqEV8k$IZWw@ʟTxKxTT+b݋3!# EqigBgpZg)XIEYk3GӪD"OTc}'_:|܆j6u8Ln2@ݜ%>3۝;ϭP!:L>>ETx^q!tG"|.ݟaqbo899EiG9̏d`>Qۑ vBtO "kfV`P~|hu G7)FY-37XU?K 7΋rJ< 6ۏ0(~,4uK4;`aPI-= r"O^f3zLEJIJ/10Ϥg( ~lV/#){I-ɰ)58R2bQV;fx%aEX( ;MN X)PǦd_JcBsooooe3pyroma-2.6b2/pyroma/testdata/lacking/000077500000000000000000000000001355475736200176655ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/lacking/lacking/000077500000000000000000000000001355475736200212755ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/lacking/lacking/__init__.py000066400000000000000000000000001355475736200233740ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/lacking/setup.cfg000066400000000000000000000000651355475736200215070ustar00rootroot00000000000000[egg_info] tag_build = .dev1 tag_svn_revision = true pyroma-2.6b2/pyroma/testdata/lacking/setup.py000066400000000000000000000002101355475736200213700ustar00rootroot00000000000000from setuptools import setup version = "1.0" setup(name="lacking", version=version, long_description="``error", packages=["lacking"]) pyroma-2.6b2/pyroma/testdata/minimal/000077500000000000000000000000001355475736200177035ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/minimal/minimal/000077500000000000000000000000001355475736200213315ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/minimal/minimal/__init__.py000066400000000000000000000000001355475736200234300ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/minimal/setup.cfg000066400000000000000000000000651355475736200215250ustar00rootroot00000000000000[egg_info] tag_build = .dev1 tag_svn_revision = true pyroma-2.6b2/pyroma/testdata/minimal/setup.py000066400000000000000000000007301355475736200214150ustar00rootroot00000000000000from setuptools import setup, find_packages version = "0.0foo" setup( name="minimal", version=version, description="Test", classifiers=[], keywords="", author="", author_email="", url="", license="", packages=find_packages(exclude=["ez_setup", "examples", "tests"]), include_package_data=True, install_requires=[ # -*- Extra requirements: -*- ], entry_points=""" # -*- Entry points: -*- """, ) pyroma-2.6b2/pyroma/testdata/only_config/000077500000000000000000000000001355475736200205635ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/only_config/README.txt000066400000000000000000000024461355475736200222670ustar00rootroot00000000000000Complete ======== This is a test package for pyroma that is supposed to have a complete set of metadata and also runnable tests. It should score the maximum possible on package tests. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit posuere id dignissim massa molestie. pyroma-2.6b2/pyroma/testdata/only_config/only_config/000077500000000000000000000000001355475736200230715ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/only_config/only_config/__init__.py000066400000000000000000000000001355475736200251700ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/only_config/setup.cfg000066400000000000000000000011451355475736200224050ustar00rootroot00000000000000[metadata] name = only_config version = 1.0 description = This is a test package for pyroma long_description = file: README.txt author = Lennart Regebro author_email = regebro@gmail.com url = https://github.com/regebro/pyroma classifiers = Development Status :: 6 - Mature Operating System :: OS Independent Programming Language :: Python :: 2.6 Programming Language :: Python :: 2.7 Programming Language :: Python :: 3.1 Programming Language :: Python :: 3.2 Programming Language :: Python :: 3.3 License :: OSI Approved :: MIT License keywords = pypi quality example pyroma-2.6b2/pyroma/testdata/setup_config/000077500000000000000000000000001355475736200207425ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/setup_config/README.txt000066400000000000000000000024461355475736200224460ustar00rootroot00000000000000Complete ======== This is a test package for pyroma that is supposed to have a complete set of metadata and also runnable tests. It should score the maximum possible on package tests. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit posuere id dignissim massa molestie. pyroma-2.6b2/pyroma/testdata/setup_config/setup.cfg000066400000000000000000000011451355475736200225640ustar00rootroot00000000000000[metadata] name = only_config version = 1.0 description = This is a test package for pyroma long_description = file: README.txt author = Lennart Regebro author_email = regebro@gmail.com url = https://github.com/regebro/pyroma classifiers = Development Status :: 6 - Mature Operating System :: OS Independent Programming Language :: Python :: 2.6 Programming Language :: Python :: 2.7 Programming Language :: Python :: 3.1 Programming Language :: Python :: 3.2 Programming Language :: Python :: 3.3 License :: OSI Approved :: MIT License keywords = pypi quality example pyroma-2.6b2/pyroma/testdata/setup_config/setup.py000066400000000000000000000000461355475736200224540ustar00rootroot00000000000000import setuptools setuptools.setup() pyroma-2.6b2/pyroma/testdata/setup_config/setup_config/000077500000000000000000000000001355475736200234275ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/setup_config/setup_config/__init__.py000066400000000000000000000000001355475736200255260ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/xmlrpcdata/000077500000000000000000000000001355475736200204145ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/xmlrpcdata/complete/000077500000000000000000000000001355475736200222245ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/xmlrpcdata/complete/1.0.dev1.html000066400000000000000000001437021355475736200242550ustar00rootroot00000000000000 xmldiff · PyPI Skip to main content

Tree 2 tree correction between xml documents. Extract differences between two xml files. It returns a set of primitives to apply on source tree to obtain the destination tree.

Project description

https://travis-ci.org/Shoobx/xmldiff.png?branch=master https://coveralls.io/repos/github/Shoobx/xmldiff/badge.svg?branch=master

Xmldiff is a utility for extracting differences between two xml files. It returns a set of primitives to apply on source tree to obtain the destination tree.

The implementation is based on Change detection in hierarchically structured information, by S. Chawathe, A. Rajaraman, H. Garcia-Molina and J. Widom, Stanford University, 1996

Installation

To install the latest release:

pip install xmldiff

To install the development version:

git clone https://github.com/Shoobx/xmldiff.git
cd xmldiff
virtualenv ./.venv
./.venv/bin/python setup.py install

Then to compare two given XML files:

./.venv/bin/xmldiff 1.xml 2.xml

Running tests

To run the test suite for all python versions:

tox

CHANGES

1.1.1 (2018-06-20)

  • When moving attributes the secondary rename action xpath was ‘//LogilabXmldiffTmpAttr<attrib>’ which is a tag specification. Changed this to ‘//@LogilabXmldiffTmpAttr<attrib>’, so an attribute is specified.

1.1.0 (2018-06-15)

  • When using namespaces, the returned xpaths are now in the form ns_prefix:tag instead of the earlier {ns_uri}tag, which isn’t correct xpaths.

1.0.0 (2018-04-13)

  • pep8 cleanup, added flake8 checking to tox

1.0.0a6 (2018-04-12)

  • Removed encoding, because python does unicode just fine
  • Switched on namespace handling for XML input

1.0.0a5 (2018-04-11)

  • Brownbag release to make up for bad previous ones.

1.0.0a2 (2018-04-11)

  • Temporary disabling of encoding text (hopefully permanent).
  • Reverted bug fix: Do not remove newlines from text while parsing the XML.

1.0.0a1 (2018-04-10)

  • Bug: Fix a off-by-one issue with insert-after action.
  • Bug: Do not rename children on text node updates.
  • Bug: Text moves were not recorded as part of the fmes edit script.
  • Remove only partially implemented xmlrev script.
  • Removed support for xupdate, which never became a standard.
  • Removed deprecated ezs optional algorithm.
  • Removed support for Debian and RedHat packaging.
  • Removed Windows support
  • LOTS of package cleanup (setup.py, MANIFEST, proper console script, etc)
  • tests moved to py.test and cleaned, added tox, travis, coverage support

0.6.10 (2010-08-27)

  • apply Daiki Ueno patch: fails when comparing minimal trees on i386

0.6.9 (2009-04-02)

  • Fixed xmldiff-xmlrev compilation error

0.6.8 (2006-06-15)

  • Fixed 64bit cleanness issues

0.6.7 (2005-05-04)

  • WARNING: xmldiff is no longer a logilab subpackage. Users may have to manually remove the old logilab/xmldiff directory.
  • fixed debian bug #275750, also reported by Christopher R Newman on the xml-projects mailing list
  • fixed –profile option, wrap function from maplookup when profiling so that they appear in the profile information
  • fixed setup.py to ignore the xmlrev shell script under windows platforms
  • small improvements (remove recursion in object.py, minor enhancement in mydifflib.py, rewrite of lcs4 in C)

0.6.6 (2004-12-23)

  • Applied patch by Bastian Kleineidam <calvin@debian.org> which

    • corrects the typo in ML_DIR
    • fixes the TMPFILE_XSLT/TMPFILE_XSL typo
    • makes sure the files are XML or SGML files, else prints an error
    • adds various missing quotes around filenames which could have spaces or begin with a hyphen
    • fixes typos in the usage() function

    Thanks a lot, Bastian.

  • Fixed some problems in the xmlrev.xslt stylesheet

  • Fixed problems in xmlrev caused by the exit status of xmldiff when successful

  • Added a man page for xmldiff and xmlrev

0.6.5 (2004-09-02)

  • xmlrev bugfixes
  • Fixed packaging problems (missing xsl stylesheets and MANIFEST file)

0.6.4 (2003-10-02)

  • fix recursive mode
  • rewrite regression test, add test for the recursive mode
  • add –help option to xlmrev
  • packaging fixes
  • turn API.txt and HELP.txt to correct ReST

0.6.3 (2002-11-06)

  • fix wrong xpath for attributes
  • fix bug with temporary duplicate attribute node
  • fix for xupdate
  • fix ext_pes option bug
  • update changelog to new format

0.6.2 (2002-09-23)

  • return number of differences on command line
  • reintroduce misc.list_print which caused recursive mode to fail
  • use psyco if available (http://psyco.sf.net)
  • little changes in C extension

0.6.1 (2002-08-29)

  • fix packaging problems

0.6.0 (2002-08-23)

  • change of the internal representation
  • remove support for the EZS algorithm (no more maintened for the moment)
  • add command line options to parse html and to control entities inclusion and output encoding
  • fixing coalescing text nodes bug
  • many other bugs fixes
  • great speed improvement

0.5.3 (2002-01-31)

  • add __init__.py in “logilab” directory

0.5.2 (2001-10-29)

  • bug fixes in xupdate formatting and in the dom interface.

0.5.1 (2001-09-07)

  • Fast Match / Edit Scritp algorithm, now fully usable
  • fixes Unicode problem

0.2.1 (2001-08-10)

  • bug fixes, optimizations for ezs algorithm

0.1.1 (2001-08-04)

  • original revision

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
xmldiff-1.1.1.tar.gz (39.5 kB) Copy SHA256 hash SHA256 Source None Jun 20, 2018
pyroma-2.6b2/pyroma/testdata/xmlrpcdata/completedata.py000066400000000000000000000072331355475736200234350ustar00rootroot00000000000000from datetime import datetime args = ("https://pypi.org/pypi",) kw = {} data = { "package_releases": {("complete",): ["1.0.dev1"]}, "release_data": { ("complete", "1.0.dev1"): { "maintainer": None, "requires_python": None, "maintainer_email": None, "cheesecake_code_kwalitee_id": None, "keywords": ["pypi", "quality", "example"], "package_url": "http://pypi.org/project/complete", "author": "Lennart Regebro", "author_email": "regebro@gmail.com", "download_url": "UNKNOWN", "platform": "UNKNOWN", "version": "1.0.dev1", "cheesecake_documentation_id": None, "_pypi_hidden": False, "description": """Complete ======== This is a test package for pyroma that is supposed to have a complete set of metadata and also runnable tests. It should score the maximum possible on package tests. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit posuere id dignissim massa molestie.""", "release_url": "http://pypi.org/project/distribute/1.0.dev1", "_pypi_ordering": 115, "classifiers": [ "Development Status :: 6 - Mature", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "License :: OSI Approved :: MIT License", ], "name": "complete", "license": "MIT", "summary": "This is a test package for pyroma.", "home_page": "https://github.com/regebro/pyroma", "stable_version": None, "cheesecake_installability_id": None, } }, "release_urls": { ("complete", "1.0.dev1"): [ { "has_sig": False, "upload_time": datetime(2011, 3, 16, 16, 31, 39), "comment_text": "", "python_version": "source", "url": "http://pypi.python.org/packages/source/c/complete/" "complete-1.0.dev1.tar.gz", "md5_digest": "ea52e1412e7ff560c290266ed400e216", "downloads": 0, "filename": "complete-1.0.dev1.tar.gz", "packagetype": "sdist", "size": 289103, } ] }, "package_roles": { ("complete",): [["Owner", "someone"], ["Owner", "me"], ["Owner", "other"]] }, } pyroma-2.6b2/pyroma/testdata/xmlrpcdata/distribute/000077500000000000000000000000001355475736200225725ustar00rootroot00000000000000pyroma-2.6b2/pyroma/testdata/xmlrpcdata/distribute/0.6.15.html000066400000000000000000001307051355475736200242150ustar00rootroot00000000000000 Python Package Index : distribute 0.6.15

skip to navigation
skip to content

distribute 0.6.15

Easily download, build, install, upgrade, and uninstall Python packages

Downloads ↓ | Package Documentation

Installing and Using Distribute

Disclaimers

About the fork

Distribute is a fork of the Setuptools project.

Distribute is intended to replace Setuptools as the standard method for working with Python module distributions.

The fork has two goals:

  • Providing a backward compatible version to replace Setuptools and make all distributions that depend on Setuptools work as before, but with less bugs and behaviorial issues.

    This work is done in the 0.6.x series.

    Starting with version 0.6.2, Distribute supports Python 3. Installing and using distribute for Python 3 code works exactly the same as for Python 2 code, but Distribute also helps you to support Python 2 and Python 3 from the same source code by letting you run 2to3 on the code as a part of the build process, by setting the keyword parameter use_2to3 to True. See http://packages.python.org/distribute for more information.

  • Refactoring the code, and releasing it in several distributions. This work is being done in the 0.7.x series but not yet released.

The roadmap is still evolving, and the page that is up-to-date is located at : http://packages.python.org/distribute/roadmap.

If you install Distribute and want to switch back for any reason to Setuptools, get to the Uninstallation instructions section.

More documentation

You can get more information in the Sphinx-based documentation, located at http://packages.python.org/distribute. This documentation includes the old Setuptools documentation that is slowly replaced, and brand new content.

About the installation process

The Distribute installer modifies your installation by de-activating an existing installation of Setuptools in a bootstrap process. This process has been tested in various installation schemes and contexts but in case of a bug during this process your Python installation might be left in a broken state. Since all modified files and directories are copied before the installation starts, you will be able to get back to a normal state by reading the instructions in the Uninstallation instructions section.

In any case, it is recommended to save you site-packages directory before you start the installation of Distribute.

Installation Instructions

Distribute is only released as a source distribution.

It can be installed using pip, and can be done so with the source tarball, or by using the distribute_setup.py script provided online.

distribute_setup.py is the simplest and preferred way on all systems.

distribute_setup.py

Download distribute_setup.py and execute it, using the Python interpreter of your choice.

If your shell has the curl program you can do:

$ curl -O http://python-distribute.org/distribute_setup.py
$ python distribute_setup.py

Notice this file is also provided in the source release.

pip

Run easy_install or pip:

$ pip install distribute

Source installation

Download the source tarball, uncompress it, then run the install command:

$ curl -O http://pypi.python.org/packages/source/d/distribute/distribute-0.6.15.tar.gz
$ tar -xzvf distribute-0.6.15.tar.gz
$ cd distribute-0.6.15
$ python setup.py install

Uninstallation Instructions

Like other distutils-based distributions, Distribute doesn't provide an uninstaller yet. It's all done manually! We are all waiting for PEP 376 support in Python.

Distribute is installed in three steps:

  1. it gets out of the way an existing installation of Setuptools
  2. it installs a fake setuptools installation
  3. it installs distribute

Distribute can be removed like this:

  • remove the distribute*.egg file located in your site-packages directory
  • remove the setuptools.pth file located in you site-packages directory
  • remove the easy_install script located in you sys.prefix/bin directory
  • remove the setuptools*.egg directory located in your site-packages directory, if any.

If you want to get back to setuptools:

  • reinstall setuptools using its instruction.

Lastly:

  • remove the .OLD. directory located in your site-packages directory if any, once you have checked everything was working correctly again.

Quick help for developers

To create an egg which is compatible with Distribute, use the same practice as with Setuptools, e.g.:

from setuptools import setup

setup(...
)

To use pkg_resources to access data files in the egg, you should require the Setuptools distribution explicitly:

from setuptools import setup

setup(...
    install_requires=['setuptools']
)

Only if you need Distribute-specific functionality should you depend on it explicitly. In this case, replace the Setuptools dependency:

from setuptools import setup

setup(...
    install_requires=['distribute']
)

Install FAQ

  • Why is Distribute wrapping my Setuptools installation?

    Since Distribute is a fork, and since it provides the same package and modules, it renames the existing Setuptools egg and inserts a new one which merely wraps the Distribute code. This way, full backwards compatibility is kept for packages which rely on the Setuptools modules.

    At the same time, packages can meet their dependency on Setuptools without actually installing it (which would disable Distribute).

  • How does Distribute interact with virtualenv?

    Everytime you create a virtualenv it will install setuptools by default. You either need to re-install Distribute in it right after or pass the --distribute option when creating it.

    Once installed, your virtualenv will use Distribute transparently.

    Although, if you have Setuptools installed in your system-wide Python, and if the virtualenv you are in was generated without the --no-site-packages option, the Distribute installation will stop.

    You need in this case to build a virtualenv with the --no-site-packages option or to install Distribute globally.

  • How does Distribute interacts with zc.buildout?

    You can use Distribute in your zc.buildout, with the --distribute option, starting at zc.buildout 1.4.2:

    $ python bootstrap.py --distribute
    

    For previous zc.buildout versions, the only thing you need to do is use the bootstrap at http://python-distribute.org/bootstrap.py. Run that bootstrap and bin/buildout (and all other buildout-generated scripts) will transparently use distribute instead of setuptools. You do not need a specific buildout release.

    A shared eggs directory is no problem (since 0.6.6): the setuptools egg is left in place unmodified. So other buildouts that do not yet use the new bootstrap continue to work just fine. And there is no need to list distribute somewhere in your eggs: using the bootstrap is enough.

    The source code for the bootstrap script is located at http://bitbucket.org/tarek/buildout-distribute.

CHANGES

0.6.15

  • Fixed typo in bdist_egg
  • Several issues under Python 3 has been solved.
  • Issue 146: Fixed missing DLL files after easy_install of windows exe package.

0.6.14

  • Issue 170: Fixed unittest failure. Thanks to Toshio.
  • Issue 171: Fixed race condition in unittests cause deadlocks in test suite.
  • Issue 143: Fixed a lookup issue with easy_install. Thanks to David and Zooko.
  • Issue 174: Fixed the edit mode when its used with setuptools itself

0.6.13

  • Issue 160: 2.7 gives ValueError("Invalid IPv6 URL")
  • Issue 150: Fixed using ~/.local even in a --no-site-packages virtualenv
  • Issue 163: scan index links before external links, and don't use the md5 when comparing two distributions

0.6.12

  • Issue 149: Fixed various failures on 2.3/2.4

0.6.11

  • Found another case of SandboxViolation - fixed
  • Issue 15 and 48: Introduced a socket timeout of 15 seconds on url openings
  • Added indexsidebar.html into MANIFEST.in
  • Issue 108: Fixed TypeError with Python3.1
  • Issue 121: Fixed --help install command trying to actually install.
  • Issue 112: Added an os.makedirs so that Tarek's solution will work.
  • Issue 133: Added --no-find-links to easy_install
  • Added easy_install --user
  • Issue 100: Fixed develop --user not taking '.' in PYTHONPATH into account
  • Issue 134: removed spurious UserWarnings. Patch by VanLindberg
  • Issue 138: cant_write_to_target error when setup_requires is used.
  • Issue 147: respect the sys.dont_write_bytecode flag

0.6.10

  • Reverted change made for the DistributionNotFound exception because zc.buildout uses the exception message to get the name of the distribution.

0.6.9

  • Issue 90: unknown setuptools version can be added in the working set
  • Issue 87: setupt.py doesn't try to convert distribute_setup.py anymore Initial Patch by arfrever.
  • Issue 89: added a side bar with a download link to the doc.
  • Issue 86: fixed missing sentence in pkg_resources doc.
  • Added a nicer error message when a DistributionNotFound is raised.
  • Issue 80: test_develop now works with Python 3.1
  • Issue 93: upload_docs now works if there is an empty sub-directory.
  • Issue 70: exec bit on non-exec files
  • Issue 99: now the standalone easy_install command doesn't uses a "setup.cfg" if any exists in the working directory. It will use it only if triggered by install_requires from a setup.py call (install, develop, etc).
  • Issue 101: Allowing os.devnull in Sandbox
  • Issue 92: Fixed the "no eggs" found error with MacPort (platform.mac_ver() fails)
  • Issue 103: test_get_script_header_jython_workaround not run anymore under py3 with C or POSIX local. Contributed by Arfrever.
  • Issue 104: remvoved the assertion when the installation fails, with a nicer message for the end user.
  • Issue 100: making sure there's no SandboxViolation when the setup script patches setuptools.

0.6.8

  • Added "check_packages" in dist. (added in Setuptools 0.6c11)
  • Fixed the DONT_PATCH_SETUPTOOLS state.

0.6.7

  • Issue 58: Added --user support to the develop command
  • Issue 11: Generated scripts now wrap their call to the script entry point in the standard "if name == 'main'"
  • Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv can drive an installation that doesn't patch a global setuptools.
  • Reviewed unladen-swallow specific change from http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719 and determined that it no longer applies. Distribute should work fine with Unladen Swallow 2009Q3.
  • Issue 21: Allow PackageIndex.open_url to gracefully handle all cases of a httplib.HTTPException instead of just InvalidURL and BadStatusLine.
  • Removed virtual-python.py from this distribution and updated documentation to point to the actively maintained virtualenv instead.
  • Issue 64: use_setuptools no longer rebuilds the distribute egg every time it is run
  • use_setuptools now properly respects the requested version
  • use_setuptools will no longer try to import a distribute egg for the wrong Python version
  • Issue 74: no_fake should be True by default.
  • Issue 72: avoid a bootstrapping issue with easy_install -U

0.6.6

  • Unified the bootstrap file so it works on both py2.x and py3k without 2to3 (patch by Holger Krekel)

0.6.5

  • Issue 65: cli.exe and gui.exe are now generated at build time, depending on the platform in use.
  • Issue 67: Fixed doc typo (PEP 381/382)
  • Distribute no longer shadows setuptools if we require a 0.7-series setuptools. And an error is raised when installing a 0.7 setuptools with distribute.
  • When run from within buildout, no attempt is made to modify an existing setuptools egg, whether in a shared egg directory or a system setuptools.
  • Fixed a hole in sandboxing allowing builtin file to write outside of the sandbox.

0.6.4

0.6.3

setuptools

  • Fixed a bunch of calls to file() that caused crashes on Python 3.

bootstrapping

  • Fixed a bug in sorting that caused bootstrap to fail on Python 3.

0.6.2

setuptools

bootstrapping

0.6.1

setuptools

bootstrapping

0.6

setuptools

pkg_resources

easy_install

 
File Type Py Version Uploaded on Size # downloads
distribute-0.6.15.tar.gz (md5) Source 2011-03-16 282KB 973
Rate this release: 0 5 (best)
Review: (Please use the package's bug reporting channels
(trackers, mailing lists) for bug reports and requests for help
)
pyroma-2.6b2/pyroma/testdata/xmlrpcdata/distributedata.py000066400000000000000000000060401355475736200237760ustar00rootroot00000000000000from datetime import datetime args = ("https://pypi.org/pypi",) kw = {} data = { "package_releases": {("distribute",): ["0.6.15"]}, "release_data": { ("distribute", "0.6.15"): { "maintainer": None, "requires_python": None, "maintainer_email": None, "cheesecake_code_kwalitee_id": None, "keywords": "CPAN PyPI distutils eggs package management", "package_url": "http://pypi.org/project/distribute", "author": "The fellowship of the packaging", "author_email": "distutils-sig@python.org", "download_url": "UNKNOWN", "platform": "UNKNOWN", "version": "0.6.15", "cheesecake_documentation_id": None, "_pypi_hidden": False, "description": """=============================== Installing and Using Distribute =============================== .. contents:: **Table of Contents** ----------- Disclaimers ----------- This is an example of a long_description ======================================== It doesn't need to be much longer than this, I think. """, "release_url": "http://pypi.org/project/distribute/0.6.15", "_pypi_ordering": 115, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: " "Python Software Foundation License", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Software Development :: " "Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities", ], "name": "distribute", "license": "PSF or ZPL", "summary": "Easily download, build, install, upgrade, and " "uninstall Python packages", "home_page": "http://packages.python.org/distribute", "stable_version": None, "cheesecake_installability_id": None, } }, "release_urls": { ("distribute", "0.6.15"): [ { "has_sig": False, "upload_time": datetime(2011, 3, 16, 16, 31, 39), "comment_text": "", "python_version": "source", "url": "http://pypi.python.org/packages/source/d/" "distribute/distribute-0.6.15.tar.gz", "md5_digest": "ea52e1412e7ff560c290266ed400e216", "downloads": 0, "filename": "distribute-0.6.15.tar.gz", "packagetype": "sdist", "size": 289103, } ] }, "package_roles": { ("distribute",): [ ["Owner", "someone"], ["Owner", "me"], ["Maintainer", "other"], ] }, } pyroma-2.6b2/pyroma/tests.py000066400000000000000000000261411355475736200161640ustar00rootroot00000000000000from __future__ import print_function import unittest import os import collections try: from xmlrpc import client as xmlrpclib from urllib import request as urllib except ImportError: import xmlrpclib import urllib from pyroma import projectdata, distributiondata, pypidata from pyroma.ratings import rate from pkg_resources import resource_filename, resource_string long_description = resource_string( __name__, os.path.join("testdata", "complete", "README.txt") ) if not isinstance(long_description, str): long_description = long_description.decode() COMPLETE = { "_setuptools": True, "name": "complete", "version": "1.0", "description": "This is a test package for pyroma.", "long_description": long_description, "classifiers": [ "Development Status :: 6 - Mature", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "License :: OSI Approved :: MIT License", ], "keywords": ["pypi", "quality", "example"], "author": "Lennart Regebro", "author_email": "regebro@gmail.com", "url": "https://github.com/regebro/pyroma", "project_urls": {"Source Code": "https://github.com/regebro/pyroma"}, "license": "MIT", "zip_safe": True, "test_suite": "complete", } class FakeResponse(object): def __init__(self, responsecode, filename=None): self.filename = filename self.headers = collections.defaultdict(lambda: None) self.code = responsecode def read(self): return open(self.filename, "rb").read() def urlopenstub(url): if url.find("readthedocs.org") != -1: host = url.split("/")[2] package = host.split(".")[0] # Faking the docs: if package in ("distribute", "complete"): return FakeResponse(200) else: # This package doesn't have docs on pythonhosted.org: return FakeResponse(404) if url.startswith("http://pypi.org/project"): filename = url[len("http://pypi.org/project/") :] # Faking PyPI package datafile = resource_filename( __name__, os.path.join("testdata", "xmlrpcdata", filename + ".html") ) return FakeResponse(200, datafile) if url.startswith("http://pypi.python.org/packages"): filename = [x for x in url.split("/") if x][-1] # Faking PyPI file downloads datafile = resource_filename( __name__, os.path.join("testdata", "distributions", filename) ) return FakeResponse(200, datafile) raise ValueError("Don't know how to stub " + url) class ProxyStub(object): def __init__(self, dataname, real_class, developmode): filename = resource_filename( __name__, os.path.join("testdata", "xmlrpcdata", dataname) ) data = {} exec(open(filename, "rt").read(), None, data) self.args = data["args"] self.kw = data["kw"] self._data = data["data"] if developmode: self._real = real_class(*self.args, **self.kw) else: self._real = None def __call__(self, *args, **kw): assert args == self.args assert kw == self.kw return self def _make_proxy(self, name): def _proxy_method(*args, **kw): return self._data[name][args] return _proxy_method def _make_unknown_proxy(self, name): def _proxy_method(*args, **kw): if self._real is None: raise AttributeError("ProxyStub unkown method " + name) print() print("== ProxyStub unknown method ==") print(name, ":", args, kw) result = getattr(self._real, name)(*args, **kw) print("Result :") print(result) return result return _proxy_method def __getattr__(self, attr): if attr in self._data: return self._make_proxy(attr) return self._make_unknown_proxy(attr) class RatingsTest(unittest.TestCase): def _get_file_rating(self, dirname): directory = resource_filename(__name__, os.path.join("testdata", dirname)) data = projectdata.get_data(directory) return rate(data) def test_complete(self): rating = self._get_file_rating("complete") # Should have a perfect score self.assertEqual(rating, (10, [])) def test_setup_config(self): rating = self._get_file_rating("setup_config") self.assertEqual(rating, (10, [])) def test_only_config(self): rating = self._get_file_rating("only_config") self.assertEqual(rating, (10, [])) def test_minimal(self): rating = self._get_file_rating("minimal") self.assertEqual( rating, ( 2, [ "The package's version number does not comply with PEP-386 or PEP-440.", "The package's description should be longer than 10 characters.", "The package's long_description is quite short.", "Your package does not have classifiers data.", "You should specify what Python versions you support.", "Your package does not have keywords data.", "Your package does not have author data.", "Your package does not have author_email data.", "Your package should have a 'url' field with a link to the project home page, or a 'project_urls' field, with a dictionary of links, or both.", "Your package does neither have a license field nor any license classifiers.", "Specifying a development status in the classifiers gives users " "a hint of how stable your software is.", ], ), ) def test_lacking(self): rating = self._get_file_rating("lacking") self.assertEqual( rating, ( 0, [ "The package had no description!", "The package's long_description is quite short.", "Your package does not have classifiers data.", "You should specify what Python versions you support.", "Your package does not have keywords data.", "Your package does not have author data.", "Your package does not have author_email data.", "Your package should have a 'url' field with a link to the project home page, or a 'project_urls' field, with a dictionary of links, or both.", "Your package does neither have a license field nor any license classifiers.", "Your long_description is not valid ReST: \n:1: (WARNING/2) Inline literal start-string without end-string.", "Specifying a development status in the classifiers gives users " "a hint of how stable your software is.", ], ), ) def test_custom_test(self): rating = self._get_file_rating("custom_test") self.assertEqual( rating, ( 2, [ "The package's version number does not comply with PEP-386 or PEP-440.", "The package's description should be longer than 10 characters.", "The package's long_description is quite short.", "Your package does not have classifiers data.", "You should specify what Python versions you support.", "Your package does not have keywords data.", "Your package does not have author data.", "Your package does not have author_email data.", "Your package should have a 'url' field with a link to the project home page, or a 'project_urls' field, with a dictionary of links, or both.", "Your package does neither have a license field nor any license classifiers.", "Specifying a development status in the classifiers gives users " "a hint of how stable your software is.", ], ), ) def test_markdown(self): # Markdown and text shouldn't get ReST errors testdata = COMPLETE.copy() testdata["long_description"] = "# Broken ReST\n\n``Valid Markdown\n" testdata["long_description_content_type"] = "text/markdown" rating = rate(testdata) self.assertEqual( rating, (9, ["The package's long_description is quite short."]) ) testdata["long_description_content_type"] = "text/plain" rating = rate(testdata) self.assertEqual( rating, (9, ["The package's long_description is quite short."]) ) class PyPITest(unittest.TestCase): def test_distribute(self): real_urlopen = urllib.urlopen real_server_proxy = xmlrpclib.ServerProxy try: xmlrpclib.ServerProxy = ProxyStub( "distributedata.py", xmlrpclib.ServerProxy, False ) urllib.urlopen = urlopenstub data = pypidata.get_data("distribute") rating = rate(data) self.assertEqual( rating, ( 9, [ "The classifiers should specify what minor versions of Python " "you support as well as what major version.", "You should have three or more owners of the project on PyPI.", ], ), ) finally: xmlrpclib.ServerProxy = real_server_proxy urllib.urlopen = real_urlopen def test_complete(self): real_urlopen = urllib.urlopen real_server_proxy = xmlrpclib.ServerProxy try: xmlrpclib.ServerProxy = ProxyStub( "completedata.py", xmlrpclib.ServerProxy, False ) urllib.urlopen = urlopenstub data = pypidata.get_data("complete") rating = rate(data) self.assertEqual(rating, (10, [])) finally: xmlrpclib.ServerProxy = real_server_proxy urllib.urlopen = real_urlopen class ProjectDataTest(unittest.TestCase): maxDiff = None def test_complete(self): directory = resource_filename(__name__, os.path.join("testdata", "complete")) data = projectdata.get_data(directory) self.assertEqual(data, COMPLETE) class DistroDataTest(unittest.TestCase): def test_complete(self): directory = resource_filename( __name__, os.path.join("testdata", "distributions") ) for filename in os.listdir(directory): if filename.startswith("complete"): data = distributiondata.get_data(os.path.join(directory, filename)) self.assertEqual(data, COMPLETE) pyroma-2.6b2/setup.cfg000066400000000000000000000000321355475736200147510ustar00rootroot00000000000000[bdist_wheel] universal=1 pyroma-2.6b2/setup.py000066400000000000000000000030511355475736200146460ustar00rootroot00000000000000from setuptools import setup, find_packages from io import open version = "2.6b2" with open("README.rst", "rt", encoding="UTF-8") as file: long_description = file.read() + "\n" with open("HISTORY.txt", "rt", encoding="UTF-8") as file: long_description += file.read() setup( name="pyroma", version=version, description="Test your project's packaging friendliness", long_description=long_description, python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", classifiers=[ "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: PyPy", "License :: OSI Approved :: MIT License", "Development Status :: 5 - Production/Stable", ], keywords=["pypi", "quality", "testing"], author="Lennart Regebro", author_email="regebro@gmail.com", url="https://github.com/regebro/pyroma", project_urls={"Source Code": "https://github.com/regebro/pyroma"}, license="MIT", packages=find_packages(exclude=["ez_setup"]), include_package_data=True, zip_safe=False, install_requires=["setuptools", "docutils", "pygments"], entry_points={ "console_scripts": ["pyroma = pyroma:main"], "zest.releaser.prereleaser.before": ["pyroma = pyroma:zester"], }, test_suite="pyroma", )