././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.1130097 pilkit-3.0/0000755000175000017500000000000014505123041012565 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/AUTHORS0000644000175000017500000000217014504640166013650 0ustar00venelinvenelinMaintainers ----------- * `Bryan Veloso`_ * `Matthew Tretter`_ * `Chris Drackett`_ * `Greg Newman`_ * `Venelin Stoykov`_ Contributors ------------ In addition to those listed on the `contributors page`__, the following people have also had a hand in bringing PILKit to life: * `Justin Driscoll`_ * `Timothée Peignier`_ * `Jan Sagemüller`_ * `Alexander Bohn`_ * `Eric Eldredge`_ * `Germán M. Bravo`_ * `Kevin Postal`_ * `Madis Väin`_ __ https://github.com/matthewwithanm/pilkit/graphs/contributors .. _Bryan Veloso: http://github.com/bryanveloso .. _Matthew Tretter: http://github.com/matthewwithanm .. _Chris Drackett: http://github.com/chrisdrackett .. _Greg Newman: http://github.com/gregnewman .. _Venelin Stoykov: http://github.com/vstoykov .. _Justin Driscoll: http://github.com/jdriscoll .. _Timothée Peignier: http://github.com/cyberdelia .. _Jan Sagemüller: https://github.com/version2 .. _Alexander Bohn: http://github.com/fish2000 .. _Eric Eldredge: http://github.com/lettertwo .. _Germán M. Bravo: http://github.com/Kronuz .. _Kevin Postal: https://github.com/kevinpostal .. _Madis Väin: https://github.com/madisvain ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774804.0 pilkit-3.0/LICENSE0000664000175000017500000000276112203765224013612 0ustar00venelinvenelinCopyright (c) 2013 Primary Maintainers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of PILKit nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/MANIFEST.in0000644000175000017500000000017314504640166014337 0ustar00venelinvenelininclude AUTHORS include LICENSE include README.rst recursive-include docs * recursive-include tests *.py *.gif *.png *.jpg ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.1120098 pilkit-3.0/PKG-INFO0000644000175000017500000000760314505123041013670 0ustar00venelinvenelinMetadata-Version: 2.1 Name: pilkit Version: 3.0 Summary: A collection of utilities and processors for the Python Imaging Library. Home-page: http://github.com/matthewwithanm/pilkit/ Author: Matthew Tretter Author-email: m@tthewwithanm.com License: BSD Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Topic :: Utilities License-File: LICENSE License-File: AUTHORS Requires-Dist: Pillow>=7.0 PILKit is a collection of utilities for working with PIL (the Python Imaging Library). One of its main features is a set of **processors** which expose a simple interface for performing manipulations on PIL images. Looking for more advanced processors? Check out `Instakit`_! **For the complete documentation on the latest stable version of PILKit, see** `PILKit on RTD`_. .. image:: https://github.com/matthewwithanm/pilkit/workflows/Python%20CI/badge.svg :target: https://github.com/matthewwithanm/pilkit/actions?query=workflow%3A%22Python+CI%22 .. _`PILKit on RTD`: http://pilkit.readthedocs.org .. _`Instakit`: https://github.com/fish2000/instakit Installation ============ 1. Install `PIL`_ or `Pillow`_. 2. Run ``pip install pilkit`` (or clone the source and put the pilkit module on your path) .. note:: If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement. .. _`PIL`: http://pypi.python.org/pypi/PIL .. _`Pillow`: http://pypi.python.org/pypi/Pillow Usage Overview ============== Processors ---------- The "pilkit.processors" module contains several classes for processing PIL images, which provide an easy to understand API: .. code-block:: python from pilkit.processors import ResizeToFit img = Image.open('/path/to/my/image.png') processor = ResizeToFit(100, 100) new_img = processor.process(img) A few of the included processors are: * ``ResizeToFit`` * ``ResizeToFill`` * ``SmartResize`` * ``Adjust`` * ``TrimBorderColor`` * ``Transpose`` There's also a ``ProcessorPipeline`` class for executing processors sequentially: .. code-block:: python from pilkit.processors import ProcessorPipeline, ResizeToFit, Adjust img = Image.open('/path/to/my/image.png') processor = ProcessorPipeline([Adjust(color=0), ResizeToFit(100, 100)]) new_image = processor.process(img) Utilities --------- In addition to the processors, PILKit contains a few utilities to ease the pain of working with PIL. Some examples: ``prepare_image`` Prepares the image for saving to the provided format by doing some common-sense conversions, including preserving transparency and quantizing. ``save_image`` Wraps PIL's ``Image.save()`` method in order to gracefully handle PIL's "Suspension not allowed here" errors, and (optionally) prepares the image using ``prepare_image`` Utilities are also included for converting between formats, extensions, and mimetypes. Community ========= Please use `the GitHub issue tracker `_ to report bugs. `A mailing list `_ also exists to discuss the project and ask questions, as well as the official `#imagekit `_ channel on Freenode. (Both of these are shared with the `django-imagekit`_ project—from which PILKit spun off.) .. _`django-imagekit`: https://github.com/jdriscoll/django-imagekit ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/README.rst0000644000175000017500000000605414504640166014274 0ustar00venelinvenelinPILKit is a collection of utilities for working with PIL (the Python Imaging Library). One of its main features is a set of **processors** which expose a simple interface for performing manipulations on PIL images. Looking for more advanced processors? Check out `Instakit`_! **For the complete documentation on the latest stable version of PILKit, see** `PILKit on RTD`_. .. image:: https://github.com/matthewwithanm/pilkit/workflows/Python%20CI/badge.svg :target: https://github.com/matthewwithanm/pilkit/actions?query=workflow%3A%22Python+CI%22 .. _`PILKit on RTD`: http://pilkit.readthedocs.org .. _`Instakit`: https://github.com/fish2000/instakit Installation ============ 1. Install `PIL`_ or `Pillow`_. 2. Run ``pip install pilkit`` (or clone the source and put the pilkit module on your path) .. note:: If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement. .. _`PIL`: http://pypi.python.org/pypi/PIL .. _`Pillow`: http://pypi.python.org/pypi/Pillow Usage Overview ============== Processors ---------- The "pilkit.processors" module contains several classes for processing PIL images, which provide an easy to understand API: .. code-block:: python from pilkit.processors import ResizeToFit img = Image.open('/path/to/my/image.png') processor = ResizeToFit(100, 100) new_img = processor.process(img) A few of the included processors are: * ``ResizeToFit`` * ``ResizeToFill`` * ``SmartResize`` * ``Adjust`` * ``TrimBorderColor`` * ``Transpose`` There's also a ``ProcessorPipeline`` class for executing processors sequentially: .. code-block:: python from pilkit.processors import ProcessorPipeline, ResizeToFit, Adjust img = Image.open('/path/to/my/image.png') processor = ProcessorPipeline([Adjust(color=0), ResizeToFit(100, 100)]) new_image = processor.process(img) Utilities --------- In addition to the processors, PILKit contains a few utilities to ease the pain of working with PIL. Some examples: ``prepare_image`` Prepares the image for saving to the provided format by doing some common-sense conversions, including preserving transparency and quantizing. ``save_image`` Wraps PIL's ``Image.save()`` method in order to gracefully handle PIL's "Suspension not allowed here" errors, and (optionally) prepares the image using ``prepare_image`` Utilities are also included for converting between formats, extensions, and mimetypes. Community ========= Please use `the GitHub issue tracker `_ to report bugs. `A mailing list `_ also exists to discuss the project and ask questions, as well as the official `#imagekit `_ channel on Freenode. (Both of these are shared with the `django-imagekit`_ project—from which PILKit spun off.) .. _`django-imagekit`: https://github.com/jdriscoll/django-imagekit ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.0640094 pilkit-3.0/docs/0000755000175000017500000000000014505123041013515 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774804.0 pilkit-3.0/docs/Makefile0000664000175000017500000001270512203765224015174 0ustar00venelinvenelin# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PILKit.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PILKit.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/PILKit" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PILKit" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774804.0 pilkit-3.0/docs/make.bat0000664000175000017500000001176112203765224015142 0ustar00venelinvenelin@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source set I18NSPHINXOPTS=%SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PILKit.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PILKit.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.0640094 pilkit-3.0/docs/source/0000755000175000017500000000000014505123041015015 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.0820096 pilkit-3.0/docs/source/_ext/0000755000175000017500000000000014505123041015754 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.0820096 pilkit-3.0/docs/source/_ext/__pycache__/0000755000175000017500000000000014505123041020164 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760628.0 pilkit-3.0/docs/source/_ext/__pycache__/pil.cpython-311.pyc0000644000175000017500000000652714504640364023477 0ustar00venelinvenelin v@eoddlZddlZddlZddlZddlmZddlmZdZdZ Gddej ej Z Gdd eZ d ZdS) N)nodes) CodeBlockcdSNselfnodes @/home/venelin/workspace/3th-party/pilkit/docs/source/_ext/pil.py visit_pilr DcdSrrrs r depart_pilr r rceZdZdS)PILNodeN)__name__ __module__ __qualname__rrr rrsDrrceZdZdZdZdS) PILDirectiveTctj|}tjddlm}t jd}t j t j t}t j |dd}tj|t j|t!}t#}t%}|jD]} t)| ||} t+j} |d} | | dtj} d| d <d t3j| z| d <||z }|| z }|gS) Nr)Imagez.._staticnew_imgPNG)formatz New Imagealtzdata:image/png;base64,uri)rrunrimagePILrospathabspathdirnamerealpath__file__joinsysappendchdirrglobalslocalscontentexecioBytesIOgetsavebase64 b64encodegetvaluedecode)r code_noderlib_path working_path static_pathr gllineresultbufferr image_nodes r r zPILDirective.runspM$''  7??4((wrw'7'7'A'ABB gll<yAA  !!! yy II HHL & &D$1%%FF%% "" VE ***[]] ' 54v7GHYHY7Z7Z7a7a7c7cc 5  v rN)rrr has_contentr rrr rrs(Krrc|tttf|dt ddddS)N)htmlz pil-blockz0.1T)versionparallel_read_safeparallel_write_safe)add_noderr r add_directiver)apps r setuprL7sMLL :6L777k<000"#  r)r#r*r1r5docutilsrsphinx.directives.coderr r StructuralElementrrrLrrr rQs,,,,,,           e    """""9"""Jr././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/docs/source/_ext/original.jpg0000644000175000017500000070436614504640166020315 0ustar00venelinvenelinExifII*Duckydhttp://ns.adobe.com/xap/1.0/ Adobed   !1A" Qa2q#B$ R3%brC4&тSDd56'(cseTtUF78 !1AQaq"2B#Rbr3$CScs4% DTd5&E6te ?xw_ۣm[ lq_۴/)Kˡ~cPWXFS'`CKC[ !Mi[gUWG|(T){ ,SoC,Qf`̒l2QP}H7z7yrrU8T]k2k2!/@{46뱮AxOi)^0WqۤNu[B3Ee KRz=3Ͱ&l;+7KaZInC +p07 xiBuSCh=DqΌ%O_5{$ ͯrv$q'u`)E4Qhjx-Jz9tC׿{:v7yó>SǏH_Me70"/}$W},dnᔯs5Wye ?ްvDnY)߿H &H/%LJ=!;VL(ʼn68RﷀDiY &(*M$־̆'f~V?iwRZ˚Iܗ\1E.i3^YD]y{fmZuP=luwBO4 .x?smG1VNR. TȖ$gmE⇺m#^Lؙ#57jVAR:诣Љ{Rա?7 ϮZ((O t6Ѫ>Pt$5h50:[0cr5nژ~6 CԚCM fF2ڔUJzz `=T]>i59hkK|*Ycv]ۮF$+F )( WE!$4_]O5쑭5ԹB )+H_iw̱blqۈR7mlmyeX1DYVv+z_MQ,|_H"\޲*"kkdw0FV`T*g]ޖҼ@t:UX7'n|YEYea6׳EbTx (f`n?&KEvGjk3Hd 8 A.hPQI AOwE%xkւLEݱ2{{:xsu+iUVw,*N8 SзS!=T0&=Ȼ+1?]r Ʋ>W@4/xoe)8ǃ7p JLJ[[5* >OKK t\ 8[BMtݏ{~}(3ZO/fgtN8{c9.B,R\cmwFE6PGklTMԞf=<=׸)aD{pe/nds@RBj 'ZW) KtM3'Qωcl?Ρ-PG^fWюqHysp?G]翯8ELf*݅յlF__'laF@J*DžpQ @,#r&#+Ƶ>\VO%I|eRRm_WMl]Gј iqs)榍VDy( :o'I^s?)a>4Q:uaʜ3khɝK6sjڕysv8K9$H Z_ߵ{] f` ޑH4IyZ<pKAp⢯ |O8{^Jp}'+CV]*ټiLL"zz|0^Z +À0Z|3ݴb%սŗ+u{nVd1]ђ%X3(2u |<ͼP!aL֏p]Du! ]s}r=o.Xmm-vuGװۖ)Il^"P vc/vѵLYc>PZ{ߞCFK@r|@6-+r{NLvWx |qd[ͽE?30]2MyqBɛaQzD$sU_(} ;M>da}.unlj<~]ό٢UZ{?pf?L|Y#W,JИeB]wYL.c182X Z')2%>[wca,S`jM<`RqO@4um!8s0,py˴[o0vĠ],Aooǥ׳UA0CeAT~nG, .ȶai_y˅ kϋl$I$VsHrJpOP!#>]CqG[_wQ0˩A:*")@j5Q=Ik0GI^q]$] PX$Pk_Ztڛ9v)oux hh$iwfZ#]_j$zJGJ:6 |TG PCѴ$\v?Sv%JW j~_=;Q]'AĩQ9],c'YuPQŠ5_184e :ēr5ʬI: *{?ЀIAF 34tvo=i޽0 I8 F`e{QE{4=ṤH澒E W?7p~enӷ>.P45J[*X/c`zFZXJԪ(kvO?tB 5\c3E]L^glhഐӀ׆SQ\0 ԑњp*}p{fN~JҽCnE(AF m)^QˁVĀބ@WE= jڅ{_^k@{Z^1c^h* USw#HE I@ssA%yejBАkۿBM柄%D]CX{hP(F\.=1CZ3-IQ k^J#M(Ôx\=6AZ!˱+;*ekH-K|'d̀uD?䮞kt[lF eMGex+ڎgd{ bk7N-x$YL/%bI\כ!һ;[=U;nͲ Nֲ(ψފBqOڵwqXc}70,X!;.2 F~,pj5'0vvQ˝V85s+I^HT^+RiDSGis[eN1ʈTkSՕT,RIaHD, )"TƬ f]N_v[muóDPQUPL$w=]{_9I76G Fgn^GuQܶҀU%0Eɣ{0N½~]k4+1ެ+ ^$p]StpG><[7qLF'}gh0棹_㭒ԤuhT"~njjmɑQ1z%vܷ]6w|mrHikKX]% _6-V5٫@+km SWS]qݏ4.5i>}8438阠17{o)6NX.$Rl'bb-CKPOn5S˨rrv޴tŷA@2Kyfx{Xԯ"[bCjj@=(: LPj^-b{Cnztb$(= ּa5wxC;~]D7 N zl]ȥ_.#;p/+k?s> ] r%@ .5Ӣ?I|cn#]PcBi5^&@y9`Edv ( OI6@.T:(EY ~?ٜ4Gv* 0Q[kGR#5nnOoHnQݭIf? _ykeD<$DQZk+Q =#.U $Q4ڣO{¢[ۅ{|_9eUSQ$6$vYdnWwV>Ǩy Ĵ}X{}E>+m[2/53%<7pW4Cz%ҵ4e ns7Hޕ_|1 .ުʤ( f B:4Qxm1zoH.яQ*{t aN׷+;p gyo ե9ݥk5ͭ%mx.-գ ԂIYVA>sI5C ~b knZxE HE PCcai< *ܚOX*)6ZhZZ OFW*zI)I/f+wlr6p_cp4wPŵżHEt& HͲw $f`"9 X w|FOQ}F\.|r^;F)Dk c&SP{Ms`@bo Dh6Wfe49Ht–rBKlSbvaCYe"9v TL¤3 EBR g'yJZG:ܨS6XK۴`(K@fG"J0߳~]9FHoُ:$茬'9PF>0Cy$֭\5.xs$޲t1M^ހ7eIBr|֫qKwr4R;tŠ؀vP<'rݟY*ZH>S(%kEDڋ(+PMiOOϯAQ wPPk cԭwH7(Ɩk"ʷ-֚ؕ"OJ^sU\T`Xu_ZvGP M\,~Vh@vM^в BڣUn}G:3A aq BC|=MG(SKlr .ឌ-F'!~5O`P >I:Gj*ԓ_ǥRGT'.ſ+ *0B{w(+E .G.4 N ziPC@t!4 w-rxW8*}44#~@Iv(JhNA5'' W#TT,P iޝQ30<+_|C_t#@M HF @; *t'$T*Zzo^]C@n`<בu UMՋ I7h#?U)`_$W4\ *{EpBjTFbOp"*h p_< 9jIz)ʢ#A^L\XB9A$ Rؤ+nkW,vB(~p2^=ڂ ]&V\ť=;xyr;d^dol_wj5BPW}ߪQs+45}gv3B?䊬9"y^aG.y,[rܶ9Dim˸QcJ07C%!7@?h`C;JGj!3)_:׶bmi`E ,iާLf3Vv smyN"3͑dHoA.Yj@|)NΡ}N¼~7k}F6-Zߙvw׻7n?6>ʖP>Ad-`F>A/s֦"Hy.A!+2Q{FmN;rmڷs2;`..6\Up{*jB:A{fFO&${Y`9 }>>g Ʒ.YCcq #r)T{wi;߭Vu;+unV%sՍ 4xNZlˊ 1LXv^iʌnY$!w1LbB/rj0vQ;=S\kO/ 265 *CR V?Q)P54OB y ?JI-_>Ku}M0\ !f9&@{QÈ$n1Wx#"[n8{t\N:{йx׿kM2I?ǣZ;L?Lo{|1{xwϏ!^z1 POJS׿^Pm[x3u$~0xwˊ 0 sF.6/#8b5V2y^w4zt'ô:ԏo77{`rC )ܰ#Xd204в%@ڣdSmw^_N7}ߚ8/!JǼL~}I2G0{KDV5.[~J$&@ zwGHv 6%(˳+zy/Dtk3 ߳s Uc}ܳw j+q4 PeQh f/ j?~ɿyq̚TyDky(P*ʊ/&{Lere H'_o`]B ''б;;˚#>wQWW9 !vx&2LuF t#߳_gV}B$: H< z_I|6{>-=ҹOiR%R7?FakiJjGg]OGJ;?ݞkrO/;m0V!G3j5??QNϧb{t,in*G4,9N~zKXi=*;^=Dxt8x4+q+<%X{/YLUc+tS`u# ͸9kQWӿܙOOoIŜRdCEuvïòn̷9V.杻Kw4->oQsX={RiX&Y~,u z޽ 0Gh6i(8~z+?r\7N.3h\l[{% ٚqš _!Iz?;>-mU~ ϨZ;COsAFsؠ|w"w; Ċw$nf:M!.%-^] X{zDH$KaF3VOge}Y|BHL~:F1 arGJGӷxv>2q0i{@GgD 3I!cJO{ ~![m;u)^Ko'oTw%'ӵ^R6B(sm&+,A4QR\vݧP3?xb;c'iWQaʺ|b$U{~yub r/j %nW6ͻo:"o=*5.<9<#BoH oyJ@$f%OàX5 ۶6t.X/=//3L Jv5n:sP̠}T"j {zt//T|x}5q| R}f!A sq(ڇ "֌ IE4Z;ћ`ueu@?j7񩍴6r*JOok}$~ )QZ086;6Nԩ˯i| PS/c-ق{Sz a&C*=w`ub)6\z+dr߇E? 8ۗg8k+Җp@@ mvʹIϬwyXo ,%R hD t#vŦ^H'(_7m/yw1r/g'VUJfrR1ܼ ij@+Ec-$p."ɶ a*nhZ@_֐9X"̒ZЊjJcuDյV\'-t?Xe Iyf3{ㅐEg/[|GdWֵO}t??Į`޿8 ꐲh*HЮ_i@)XM`~!9`|s9Iシix[Ti;&dzXsB]05  J/ 4Le=$$}=˨8kh;Nr~k LFٮ%=Q6ZCm<|t (Ij֟3X>I.}42].]pO7&Z8"ÌLs1]FdIp]4P59[~_Mq"; 6t~89'o̮Qݸ չ{og:;{{.&hMۖn2H,Y\NeQd[HmV,++SECTxkhw Q+:z~}e;n9?k`ӒO?H0qOoΝ ;ʑ@8@ \*i=6;.:;]xx~[}|̄%SPץtD $kp_o97+!Y#0CRl /cSV]#ۨ:u)dk^Eп{r[|nbgaslV3F8 껔畵J^?2HS9G(p{;ZhC$K-C4ko yVԢk>EH r v*맼{ks+*IoN&Ln##8H=dZ)Z7S/PCi]d1K:cqDqL/Xfu0DQN^̬ʍR?H`$|ľ)k(|h?Pkq@>9ӏ?9Gglۙ+iQ9h&~BqxL7ӻ0xx.1QH-L^4F! $U8Aڻ_7;Ss -7]q7;-c)nFex$a~.cmPq}Lqyt@Da2 E.*?U *oK!45Z&nyȼƬ̍xb 2OD[N;=;#7R8-FA-VHm~8^R U5a$ k1u_E_ž)ME:W򧦍gܗ{*׻xnޫA/l)OEvaU)T4W5#||j>8-/ k*s/b~.nT/#-5vvP?IH#mk ه,BQWUN$BDZGke?~akBf@^YΑAhA$yXj5>4Œe_r̞"& $Qr25leAo⠖I^KCuxIo%U~AB4P]Ip^j֔=E=zׇ]= )((MuoD^VW "z-!Y5΋=(UW5V-CHeͯ:# 2=R\OA_Z|?> FZǘ;lz׀ ~ZuSweZnSMs9+K,V]A,y-O ͫӻ6ֹufnnʧuV(|x~jnxml#A.$JGP((~k(OnPv=pO5\ y $}! 2aY#I֔_ש I!ȶ]4ѹ|3@{\H(i^* ւ6mfmlo~K`EhʳYKܹKCQor :S^h9#oi{8ʤzשu-ԻKFNɦ>blZu2hbv6O o;oڤkCfKI^ܗBI&I I=8,kj/}s ABe!iO]Ew'@:F*U&fE&>e(A^lD/3c:8@y {j=`&ZȚas;")}> ߬HyD~.ZQ|+IU'2_K+i FB-G 7ns!ϋ TĺBIp [ąNc\ɶ#lA.}kw răE(j}?Ujbk| #ǝHh$K[3ʗpc8 >kfŶy'm㮓~Zڣ*!Pc0i^4Bd0kA7sά-Aelݹ-el2gn]enۧǒ6[+(Mђ8qKp-kf^|@˪%Ϟ# wqdkxw.xR2CL m[[^GP(?K˲Һ\;z8IB3'Ǿ;r_Է>urX:s/aFx\1fo2b)wm&ĵ Oĉ[~0q>O49.KXqX99#Cm'wJ_m+<BI$ <:[9$ G怷k vXS x .( 3zq^.Sap,S's*w< ۭ1K{8EA% Tih- קzں#^ޟҒ4I$Eʸ {o|M2 Ŵ݉{$D HUE|zg.igp:x]g-'`AO}=炳ُfx|5w1nEyLJ3-,1ֲM+?YshO;#rTRUE< n0zG'}NO#ٯ7e0D\#eke~k!q^G$d;߶i^l)VתR# -ta`e:~#m_v>K~I_OH^1Ԁu~ٷN[sjp\3&8]merÕkZ4I*MLw-lA,1H I\=4f9$҈8-[1،W/wYioj-#fKOD*@^Ǘ(-)`TwKs̅21ϑ)aj78K|BcKL6Hl# eDILr\FIJB@TPtx*y])2ٴd({PPq&׽/98s\x"M϶{GhwmKS䭤U?*e$s*/]gQC2; \!/ YX'VR ﶬERz|z~#F"P 6\@;3$(׏ Ù>TmG@+hu;W] qU/J>9++RͲ?u[Gnw{is]25c;u[H ZGp_ڿ3@{?#0ĸMJrD[3TZwm M&UR\\ťJ|Zmn&U/)Ӣ!#b!Xή)b&!9Ҷ6҈(9 |~C#fsX{=X&,bXHuބWqLh9͙AD(rE#}S/=*7Z$C 6,ºoLD%Wi61bTpKTB܍c?y׳rFZѠɚ{zRx\yQɱ&ilK*$c)WDv;v?pK|-/ #zVQLxĭݔ }}cG̻6iM ߜ+UsX袽ڝ+m8jJ4}c8M1D /7c0ky[01oI3TqI4w.ߧR>i_[ֻ@,`|5E7>>w1\/* %BEw|wl䴹ym.tS`|`Z=)es<$:6ߘ8s Es55KMZ^\²ݏїcTYu$vD#KjtQǪx. (O /w$vOeCb[W+Ib#]ܮC%U#YuZH^"dz(-K ?b8cƜW:sL{ +_o_DvZ H?錛$-Sik|Ȉi )sNl|7{{q̌Ck|̑As}cm ZY{%K1'T[S3JӔ"ƛ {o[]dy7֏1u;ĚH|iwͭёj_Koyrh `QZ6ӣMX~pPT{;u9 ˭"9J#l[m% ;TcFL'!O?A7G]DZOV  ZƎ_{H]H >FȬ^CV1Õ,çl2m;ll)5 X>X=[X匎67@Ji,s" -9-Up4kض=ev<ݡߍEa-T^`|?(~s0}OvVA59?E5뭼WX :m EPT =Eyr ?x8߷@uC5NvQs?rqN/̦^yuqBfm+&bFG}-t)c>jMf@k[Ctgj:6\\ Qj֞4ˏuָY9>Mhmg%o[owd'wnm>agS"۠ٛ baN>{xsIvQlPvvH\?o|[Lovw-ʞb W\NeBXnR6fiw=DgxԸ 8TnԬkPi?8>kqg%g\Kئ3?3R -tNbTI͛W9%E%D)ޣ:YNLف7:~ked$pklBHT{m }q9-wnϺ^q32mӚwyjR9hPQNBI[ ~&3rhݦx(q97}ž]M'pbA\@5;ݴAպ@H "ryǏg)ai5s6N;HY{;֖":йZ*H2Xeu֑Qplwf n[|gvi72>/?dN TQ(TyU/kSY;Ddw94ekGcnWI-ƓpH4væ/vi?ϑ[jH.J2TnDoDp}[9oP =03%jI;u[OS=º2 DʘzMc("ǩ" 12o>N6$׿4 _DPtk$-lGu<-3MRrGksF^ #k_ֹslx=6 />i ;)mD5|K@=MͰ6@ |8Vu65N`qs#VG N EwJO$2#'i(cT a؏:|ݟpϙxi:f{iR2cEpMs?7gnLenjcscsk) xHM;Wc-!-T_Ѓz^.شY#H<"ICwESN-l>o9Fa/%q[m 9۬e~ג{YnivͥզK}q$YvfXlP&,K?xMF5""%Sg_u{+ɾov歓̻dm/p6rM/+1SYev&~Z)2{zwq4PݯU#Q`*pE{*ǤҚ`. p-lvNdȨʄI ٛOz|y5e7{ |{trD\kk?mNXݩq!Q9L潘5Pg EW\qkXϑߨZmr@ zh#FkUc %/y9=!IAEQOQNǿnZ@,sTaӮdfqeb~lۿGdWb{y7#Zԟ3uF5R/eԆTiߡiI-hWsE?W:eRG |e➪ mߏu GξЊ!rz8OnߟEt~XW%?=)z'jqX|,\Xa^a~ܠ hn yd< &HT$BIf0qSݘ%P *܀ֵ@<2dk|q7=Fw~l|}Eor{yG(]]=fϠ8ivRG\kC3^9U%NkIkKK=L/N6Y[KL+ՖBfp1k%E f`{MUms/C 41P]MTy V )/.x> -RTO%rZ1*P=*B!mn>u=лN R]p؏58C,#9I76X>[7vʡ(v}J!5fjF*|Y{Gk~=C/-.[ ͷ!p]afTIum* @/ítC0! rGd}+H )g Rm )M51if$FZ۫nr"HVip(Ifp+\#n<˶RWd\dBj8+[U$AO!=Udf:%i5] rVg辩n@m.qd11,'0ʵ>10.IawMp ХH碘'q`k@O\[sv%lt썇̍& ہs 绫I\̗xiϪqK pF6TaC_Lp HcHI?Нn)‘=?HLoqk~!!) 1v,0r=Mk^]^E )飍c'(ڟ7#dZSoĊRZ1dΜ6WKKyET3wM7*4fC \N?cH7:n7+t:pH&Z¯ݛu^jۛ۸~D;g70YPa!+B[}9iLVbW{T?QzhtLӶ;7jwG8Y|b܏-P-0_2ҝN;< 8;bNcBI?PN{}lIn2<]´9Xߺ^Ħ#z:SamDdȜA'O]juB\"t 8һ=>DvwՔZ-H]cY/eU"OM6ٵ[nU8y![q}OK!a!@A@?dȹK[7Kk](ȄfeUZ[P/K#ÊpQʠ]Sd!T j7E{Ow^bs m=ʜ| W*wdcu<mi7S B@5]6kg (E)߉HD4_ D!)V^;ӿU_-u3:n C*_G ҼE!̵=U@)Jv6[(M<~ W^;_ov2N2~݁qakfY㡶Uʗm uI^3 DJNź=> Zf218t^ڶwfq%[mpfy\ Z@ i-Z-sX:p\*&T; ajT³q_ sv/l#H@Y^ۗزFEaBLa}EI{slck@J'gu0~cM u3hƶl$7G-SͶ_ESx/vO}ƻ7lgJ38l5A-/w5wM*(Gn=;?s48bE7ZVקЍFO s [cCJ(ǵh&͛{owŘx`;x,`&Xᱶ"̡h("vyK 3spCTi[ZN +aMbNjEA-DPnuFTo3G]բbFٲ1/. ªU]c߽akob}0P OPq¹}Ӱ6fOosk0Y~we=ǂv($߾iO܌?|תvY՜j{l! x E!6AM`?PUIN$ۂ&߷s/aFk p#K\Uk8l!෉(D` ),X!|,k\ĜUk$&mC+e[501h{[u9W}wB:@bIi$p 422_*Rψ!U6 PcLǽ~dw5>ߝ-wl]-KG[n˂ôDq p{TeOcssx>-ǕY}vVЪ7$&sIn 3!+-jjAק=W9qSK*nx] jr# cs5I@$jRvB37j}ɿD)qlSo]Uq=>ZpI5Ve5h]hv%k_~RȯN;d41wX^Ҵ꿢n7NoW7B%P O %#zB9V$<8E˴FG,٦/":+RJSQ|>ߜ3)700JjvW[Q#` WBzXA"fdםe~el~y{e{ .Kb7f۶Wk7=6I{c)8b@Ժl䉐ETé18\Zs 7[B\'={ 6+:%Dct^l`a. *FR z&q {*N5Q\ J5HhÎ{49}{c@؂; ly'ґVJF@$6oP'ʞp⥩*t e7/co$푔1(؛65<0mVU #K ОiYdk~.UF1Nad sqE{-6TP$}%6 EvwVPβ"ތGZ=~L @ՍJ;U0W.`I/=S|VVqEGM@+܂=F!KZGmNh`ylcöKO||(aYvm)6~:ݚ,BH^l~oOjHaMjb~l(lm~;ewPYՕ-S fvA TRyHcM~L{ 42 nNkKxۀ)9pS/ko!ymR3nXW]@%{G pIus6l WCS 뵝̲s\tݙ/!;Q|48_ RĎPk?3@҅hνU䗠"XdI5׌3Isw] ap=E*(_R 7I%d=akcdDmth^9\8x\K /깣k[V],g{%'3hb~RG eܝ]PXvd U4۴WLK{|q䮍JZƟA 2:0YPʨZ`SiBGqUHir'ŋXo;_|-~ݷ݀;}Eu=X+k-N}jZ$Tnw7}g0r&b_֋|F0G5N6M#4,{~C҃[ew&!n=p]Qܩ*B&jNP;Aaո;55jK+Nc׽=;Ǹmۆ5J.JנM(/y3=Ny;6cgp j?pgHW0YiIM|{v[܊[:;H (PxkXn-~'Po3 _/(OGYZB#^[+KY]@kW6z#+ЏT/WAݭh!|.Af\܄mbaT{$;uFD6ީŲ9]rT,?> 2w.Aif]j|k՗H _w]L_';}G6+^8ڻ6zml}nZ h6Vs^_cJZ,p $Iqi#Μ{̈ o¨vwa\w>0U/7l,'Sl;v&-00n,mLb522>c% eF`ǫF@7|%Cpݨi]RP1=v mM,q6 ۛ{2vWkrqkZ <|.vV~]"is8r\ }?c(gpͼֳ$.as 2A&:^t S/` e!oݟK]]TQz |ޢ-cit +懿*vEw!J Mලisw{3jf 5o০ h4{l~ @zUH{.D `[5Էs=߷aif7E[[8?3E7#cr4;VgF\Lg2\;isf,8Fd%ЖTPPwz3 T?{̤G?NA&{7>-aE.^IBA]W0}u.)p3HY `1J"6G p8eO]׉Ց_!qVF5FZfb/$+{)Hi!O13|s O2x 0~,QJz\FɡvPw\+P`1ޝIE^;wO=.$?DQϨI-oP{.H+xL09q>LgOo7S+&Y#"#wU1PSʈ&`=H\ ֲ_ى}D}=Onm&f!.R.U5(kHIqQ0xV啘+v4=Xc \4 hQibq8"/#Íp8u{2Ik--Qeh\Oif $ڝ&\LͽvүҷQ8XB1h1|-ַv$|mrH5H Z>i?U}vʣuu/˥1Ć/!K;cQKwz3dk-UPlF$ hڃS4h_c29@I =61I:/*\EC۱_;e% "w)8+٥51K5H@BnW-W G.HdngAonb_BIxځ|t V8U_gn6y..,c(GUBeǕ_ {k95"=N# ҫ{V RgJcj GURqEsO9 1j);k#xZ9$|% I$>_Iq+ L!v ֡3DR~H.Z$\x'ۍf&۽^XN>IhccǶ(Ptr=҇tlDٞ;Y$a'|Kib&Æfv i-4; [6>Ukܫ(?y@˗wߍsDpI+)㟅 eZ@P@{yvUCN荞,%ؐ-ShNIj1pUTo쟑lpnO-3iXc vBImV ʓ\nm#]h{)k\*0kUUR&GKFnNokpQ1/rXGZ3.&=ҜMdh; Dͺ=;{ޟZC+J9W~ˮ648> DAѸ9(8e6EqWmontn,.mCs=lNB/RЅ=_w\6r +`+{sV\k\ B5;j;>Wia|6ls\MӉ]ЩhiMcnZgf4X@U\I=Urt~Hv8[M$eNj m6<[Hq=jn㤏NF+䩷d!9!CY3fi|iۯPNc˾ϨOqktpTn,WJ~*8d^Mm,k=닲jZ^|]tm1MQQM(\#./TNبTT& d=/ۗx38'{m}cɼC+anĺnێ-[wC T:X7U ۫6vU0H5N@ x%[vΜt6C>TJ¡+lB}#yR}6݇!o__,.żˑwX$VS F=Z[N٦]9֒ʡp+¦>7|&W8)*FC{)š<ۖ;w q>E۟q?$V똭CGشL(!zx~ t݀༩eIj, p8ni.yxo.Jl>!IxZm.8%YGuj[-YjQ6꣉Lz?0V>"r%*ggYXy#imr8u+cbYk6b(zjQZP@$3S Ërnkm|ru*]ZJȕXzو0>[)zqً՚5'hK xl=nw>ߺۢblA%1E̾zLLv`Y,'4Fn՘bsA-Ѓ|JVS/-^~f0KHkg85Š:.M·v&&K܂qۍ{Ag1YJEuWZMQ'RCfkIuڍdE(&dht;I4΀`rLm [%pHob|zqOa[ Æ1\Ղx[ [)H8t7Nyd0xdU[gC ecI&bo!P*03Ǹvۘ>6n 7[d )uhA{cY&!U,&_h.v'H$-%aIĂA=y^a1a (pN7+a+ _Vcܐk@V谤\teVܓ''H'Fjw5-J$XÒx/!nx7.+ɱ3LX_h1<;ڈ&k]Ao/ͥ!4Kr#{e벵ڦǔ[ј[?\_mGr{bY%ߛ/ ' 6BzeP#h8UEa (LRйQmcT]^ >Dapy&4+&:ErNc-żܩjnK٥2|1T.wF5b򗰹b}afukg\ X֖1uhKH|@!TgTcQhi@!Lq6T$d`˖abW=sXKFH ?eOw@tsބ4E"w5tj@h$Q\uZuo+Czf.wk~{{ZPnuB|[v&f,n蒎FDËXN5˿[UIks0 TNꡩ#a7~׷[hQͬ@/!1\5j֞wE3P{L?j\:Qć]%!B"G_bbr;{|h7+h刉HA'57Ux!s̓O#rۭ|:8/KC ^t<*o.Y/b6xeEhZ%oFKI~֪+b8+ ت)UQOJ66j1/?q'Q˙4 ?EFIs1-m9e;IF KV _CVle^ISp/}Wѥ4F`Mڀ$lFuky7DwrMGo"3! %"`POku-pT^!Y~=4b xN(BQ0--m4^)d6|>H4+QۢmIN"OR]!͍uṗ-.C=I$nZ&'!'bC Z UOe5j]ˏTtcFs3aJ%۵șXŭ.c ljYmHca*ھE&UbօkܣIQjgi\@;q?F4 +WGwq@)%QAt, k\X77*LeEe^Ov:!g=%^\[Yr]\-NkI{9*AoS4A)$o ZF`6D`X0\,m]0; URBҠ;l-J>Ikl^w6ߵT%!U:;:@1Ė^eIO ߞ _%3Ym9TFb^ hJ PϔĠL*fvb|E T~J~=M  )/,-2L"-X&@ ҮПJâ4#W1ER/}yriq{iy.\ Ѣ%SVzh] bRc?mm)vz׷0HOM^U{*|Y_SE je$j8 tD,T?2>ע!l~Z6yz)E6ނQCLTs14yobN,fTNJ |HD0^8p4ޡobn2#RH)zשtGvcljS2m9š~= R"x0ujFˡguhizuiuyە]:=GKhV[}^ΏCP*HʰI9B רVՍ$|b$4 EP  , 8,>SIpnik,'#r.Z3*}U4;Ƌmfo4_P 45j~I% ,1Qj$vI|5i=,5T*ZJaAczu]Lɛ Wٜ߰IU4qdx%P4GևUEkxN dD\YuSS'Jͱ6?wvҁ晜xb Ф‚m=toAm|cW(sr7MM,-97{HP-{Β^vK(q4M:cK q,8ڐ8R"ųsXKY-SR]NWEǾȦZH>NN r6P$%PT=U~=wf6,[;+~lG;ڴP19k5,oWfmLYb[);+Ht2+sԮ=L6'ˍ &*.R t/^래n _2XAL4%-wB{9UÛ:y$F?xl;~pXUJ1D$P>ZwjGt.xK:  {hy')r%5Mܜj]2? wLm>.8eZZeсHp/of&k[E:ٴ7+7O٨Q飾h=66/ZW84[ZW>D{7+mqoo,伿ֲq,AU ^BҼ!>'rTq?Q[g.KtM ̺A2tP7g;7JQ,pY<5}N'{ApH,-+xm[idM'h=O@ߥPB Q+$yd+g[>XN͟Ϻ,Fro^u[SZhIJm7]+UaZzo{#|5-<@?jPF ҽȊbv#yaR=}2nnk&YbB!&Tf4nxʸn.롓AxsF#qPpU;~={-giN[fD'x\sK c/4wG_[\E@=]C]A :HA#nnG~2A? ߄aMVnWmL5 :V 15>Xfiq*,OnfH5ܩ~U{qd)"d-nx|ES)hStvi4%@@V|n[le&.Vm֒նݖY^B&-d2M-Iuޥjٗ |قxI~8mPgš#9@ K篷N㸴g'vy$a?XtSXcvRU{ TcCi"@Ud1^msW#51j"DS0Z}'ΧEH!l!uqPYvy=&F3s+@!z{*tA_k maI~Si ߐ9=eDsHQLVW qR(UNQq=gWWu~y5-ky<'}~4Ϻ"B{!~0ܚwT%0p䕂EHu l4K?3:ç\a?Ɯ#}z`8Gs21l헷t>_?Ym#Gk*@zf hf8+Ѯ P"F3 ktvU- Vmkq4Ii; Q('` Qd%P۩0;'=>P _p[{39{=ۜp;Jxd-).:$X_fiQ5m2LJ*ߞYꁡl:}AHAr @ RDžA>$}6Fڼyܜչwgh!y%N!何n X$ tWѽG?TGщ9uMt蛨HcX9 178R?3h~`K q5ĉQ!4T(w锽A5I[*g\\[.UH$xxPg~Fːq& *dv|V)eۘ$( %{Y-ӖؔRV=^1['`h2mr_㲷&|{6ڗnqVÊod&-Ii.Lz$oN['zF4!Ѽx"qr7nQgpsw 3J>&]>k FY&kS5_=tI1E,2 dor\#T5M>9]a B쮞.@CJ/`M)ڭ 5>;rEA{@@l(򟲒/؉Z.;J[N$V=JL)Wx6#SDOsjT~.܁h%V}0Gs0"bDWeh,m" LkjHnަXvPJ)a۶_<QwPQ=UdtgS&\ NAFaOY#^(%\p7*&jkM}8zPerָDU1c`7O𞤪ې$*n& #2HN!\9Te0$W=K^̞~lܯ[O77oǸ.npx_a2XV HT*HwefuyARs$q5/ӽo{;>7W>es@48Um|xgq^!VEWOP5K+5Oa뾯tNm?̹ߵkp} 2.w,R5s^xRGfvf+1G/%/!kE@?>&l%cA#vWFgJ:g`hs${KAE5-rmdb~㑊늻$P~$uZJ))]lz]*7PgQBȪ(Xoh7]U J&2Mt?j{t-9ɏ78- Q(o Ū4frS蚴j2>ǣϺhb`͛=kh5;+C bwUhlac!^=%osB } ,? ` b -"D0 Gƒ@/zdp~4ts0z ?)C!1=XĤ(r|?oPo.W4\`六h\FW併4s`hnxbm+q<9HXٌA DcZwJfj8^:}5\ =ㅶ{+ku%_=!l{12b!L*%fM`2 w=Fo!]}fj#bqCcj{k.gspV,iO7"s^Kam<[[mC>嶊Nۺ+v##N8@<< ı'd/罍q .p /T^hMS|6O)X|Ga_qoϝ!2^BrMq\|ٺϓݭ@Ө56f#e ޓS]+<{Svm_I!q{Bی<@wR_=/-{}ZcnFn.3ǖ & 0|Vrۡi YӪ괱W|M.J(;U޷&tmѼmSkyp $\8K>?}l o~dmcAz1 l.&d).K!ijzer<.܀Pwڞ}|Ӭ/a|Eƶxn2\#y%&~ՅR:C{)4Wbuaj =HiØqSĨ#6Fn9rH9 `J_{r6v7#1=q.F[+gB'~@6 bkr>ԬD:O9䘜ң%Q`KPAkfS3?LC;`[՟iuoWI(4=TMG`lx-t'N۪ ebER7 񧺋2RomǴ7Z.-sQs;$b[k!&9WgKKtxM.G+hfHuCu='L}R=1캝,\`8{w]fi[(Rm ^0#7(H j%IdnfJ_ZԺ9 _bTŜnM{`N)ٸ4cawdIy7eYԬM*a!ZM+.-O *CB9ۋ97'Wvj}_z>;קdZKu2-ŷ!eE!;ՀA<@G*a7g#fp g77ɺda|-['i|I e>bpk@8TQx׎{8fhcGmD@6&_ʩcsByǣ @.p'4[e#/EARcH \+%%I$tG&l(Ta]2$8KPj$S0Tƀ!¿=~>?2Ksvn]Ǘ3EY5ȚMaNh0ڛ$HRWH՚u6qd/얨NjVV6YޡO[IpZ,CZBԴbx~f7,7I+6THOˢ]r v8`q Hh˜*}4M+*}K]Hb?{.1W2ҸB" 2i|iΑpF oNu?{#ۻ'Q*!Twyx;H5uknΝt!5ƽw?NlQ*dSJuk"&/^F!7O$֒{sBNICACPzz\dڍB#Tr8`}AVxʼ`jh0aoKOVɾV5YF?cq)-9Oțs>4 5UO'SfoN~(OM~p⍈ArTb}#j5sz+e骖?3Oj#Qع׾GëBwJi%5C##t_! W)d%w4\ZIkәl@4H7R'R* RpYM>r~R;Bh@rq8\"=FeBdnEα[[\#{ƶt.PI]5=,V@Hj+Z֤v?OW1cJU`qK6^/Q_ԴR,3iIT< <քE5܍*{װzMqhpF_5Z55sB=g`o ԭB[[d!*]˜Y'ޝOt#3ĤsveB Jⴀn f9aOʡ2UHjGQ{KĝK(gm1}?ѴʟW´VJxhm-ܐ4Vי m4E3TM66+^dZ,m4dbuW\ѹGcU Kn U8\4niD iZTb@ Vn&K\/|\r ,E fJ#=͎8c̎x )x5mkJ.f7p7I"-#3 Hj4oȢEKl(clVi(ls9kՎ]4rR;J(&P{6:h>&FYk!r(,J:Yxot.etucԵL|QJU"ȻE~w+,iP :Nr ޿ỆOZ(˼=7N{l܉۟mn<?ǘ_ZM%3DLr2zm{upΫߘ̟3!oj6=ga-F>H޹ln1)sy7=rwMgrK^݆!'~=7A2FȄ-N;m.c_bO2'jRb~鱊%=C.@Oo^gum^OZQi5g/8>-}aH^3rwsu0i"o?8QR=EI[Rgשe??Zz6/F dޮClʐߎwkos JhP]k0oC2$ +u*6CP6úx5T&߯_NDW8 Tlhř5pzbHZFT$BHbֹ^݁a bnn˯ś8sIaQ/qOM$o欷ɠ[F3!쭤>DeoX:d1E][]RJ}j*TAڝ!Vl)U#>=J\8C^B7EHcSP]Az|а]T" m :jWӧx@s,$N;?N߇N9a} wmdMs9t1H&k#I_eg=fwC{TS9W7U%4[lZ(\ȶ1T:2h.VKfU2'<3ye/o N Sir{SPk' i#OMCh_oD cAs4rܮ55c]C#jhp_z5$",'Ow yNh{j+DT_:P܀ XTUTӷNI%ݔj"Xա {vP?VG~$_+[S!$4D44GT=ATmğ}\S(i3Ĥ =Oŀ@ˤ޵H)9F5ߺ3=}9{dXnLeC8c,rجے&\qF:Quɬd'xhE~buQKѺ&>-+Lq&ܸLjfߙxamKج8ɳ^crXsY] K2%#Q͓*U# L8Rv'> Uk8=m$I[Kqo&,#Z_cqf*,5bT}T"ihX]O&WShnSi2pN.5*y}p 8W E:~O 4lہT$NӘDFu~&"T^bwm9oqw}gcZXYc6AoQdM WNS <p~98/)̃M6ϥIӗ5;\zPD$4>Wor9;kb2ƙ|~~k]].q̆!G1iF j'Mڶ3Q4(B.A% 5c}&ԝVidk-7Tp8)Cwٓ9mv>cid}{+9ȸ,;0nZe76 r0z,h_6nin%QILW 0w-nV#aCIk^ljv[vz.*݅m^n.w"9Wruʂevb].,4{̎9.IClo~zw>`k|! ߊ.qWV l.b(@i%h٪5+Oǩd`(8^L۴p{1{j _=tDkW\Nd;V uJ=L%j`P:X_&?wmq+,$$~~R1{̯k2)" F7^e4_IW.iM6na"jn^"O0(&}m { ۻz벻qrV!ah|zDV[|}O ݪH7h4[ u2PVGm^:APNvUq2mN({Ʃ[ \{(yY$GMI @V_sj.yZ]M]ҰǨ|Z]Al㕌kX4/anZU;R9}5ռ?)p%҇"Ŕ zf vZkmdoM.GBe;|H"W JHi`y9Ӈ3`w$6mU܂Տ~ۢȟ$u15@m[=McSE21F|m7u-.1ZH7rdc huy7u 7@L}C4s?0qHO9|1.*,[5X{<^?eblۘ,mS$4:R^uog?\nbO.trGd X/BOp&6S2ˑ\n$8.ž on|ކկo!|$$q$i"\Igm K| f.EDPWv}Uʒ->1J\; a9qR ez%B /*'ECuU0&<-6Qi;G9*WԎ:Z>A>{[bRqՉa 堆hn&0P$[m35o _ɧC.Dn̖PVPŭB ,8U{^$\)dKHVEPE0() uh|(/u'fQc•f区vWIoµLr=aši>C\'.pR NʘlyaBIjz0*2zoyhcFr}6y+Eclm}+l]ym#|lzX 3;vd1CxP[!Aʎ)e84LrJJD5OGa, $'sNz%?M凮428sff_xP܋9[ kds2]) ?"E4OOBrn^:DnNy 8ኼϳ n,:NyF`co-@>%ֽۥH O_eHtPEԱGo4J]UԘ{Eh![ni&L}ϋ5\:y!h #QBa VHj#՟9+ L9lġ+k%ٸ7.p [Fci"),X jZ=H B>&:`?YvW"e~WJorVV鞇ii.G ӓіs v!W4S餀N{}%+40x-E(rI&5s"sNC]ǑD"choZ|4_~Ǥ4wX/--f_9.NnA sUn]F{dW)1wSC#yqwh2 :JV*Cr#yӚM][\&Hx;D7!}O}EQ5JE,{o#0!Qjh xuI5Wm#pLF7Ft{4?I%0em{wVq{B#\1 \Q7eFHA9H lt+ۯ.Ϻ䉴V|id Ri۷N:)Kہs[TfPA)9IB ^5v6>^5n wm./ \3Ok{|)pH\"EhMy+5Y@)ﯤ%{htŠX'SI|8r\}ؖ 'wI6>mͱkH r5R5JfY:4Q縴%T!P)=V@4j|8Z (#/$q_P@t'BiN$RRoߵ((ZD֪hW5z4zo(!-ണp*-Zyu,:꺉bfZHmO`T=uv k:Wg ha+ֺT jG~ѸsBCM]d\X꽈p^ևZC}gg_t[s77z;m8bac "UI}%@q]CumM6w8$£mAD,eˈ$XqM}-5:IC1+[mV+]%vfvzToE!LrZfϳDC&~tP~oW`k?rp`FnͿڙY-#ț ɐgl[\Q,/*TnĤéb!ٚ]b2qe9]/׃M@i]*dn_b7V{q'dYKi`.9 ܹ,Ķ 5w+Ə/W@yKD&丒\6R['a]m=m+Ү;'fe7yw@Nouzm^~˳huL=g r~c:3~H.v縕!~U߱Ge; ŀ]cuJvz=Nt=w foKҗny{dᴵtI}Z i[\&!)Ђ鴓vke~ {ii4ZLU(#"[AuuH4?0z/p*cV,܆%vAy3f\6xaVuI,R#AiE1 Nno;51% @; Prn7{x14Ydix`8y%wgNI$X168sGH4!WNWɘP\_=R,;xԓlby vkk[i$񥕆:{X`14o T}NWH׌*CZ9[fZnn-> D{H[^G9ČAsaPCe}vDrd6G8!pVkg\vu1[+xqBX#ܲdu6#oèK"HSfvI4Hg.T¶΁)GehMHp0r|dV %fBRkGD=`>,OAW;xv:n9ؼWX{ (7fo2HVFaY?DB^p,-(b~CȅDr'/~tom嗹FS3m[]e/#62v7x׏Rcr% BHJ D;CleYxsV@@T-N7ir3]dN.5m46#{\h.ʴs^qM?5;vE*UrZN!uطX!m}x2r#qO?k{˻{['O Z)'Y lPD0m7Y$D`qPTk!;.x^o%.A*fW9O0Pum@J8Q?r|%;~e140OiexL.],ǷQY b@}6$#w:R.ޗ p^>natGWnp}GUΧgZ; )ڕc6>c;f-zߝww*5b C-!jv&JքgfZ@VnC):i|D<9/e<˃F]QIժ$[Z0,NĒE$u|I#02܂r-ROZ6IKJ 8*,77 I-o%XJnlPH?7~=ld,?o蜄ǯy> rkۼ<܌Cxٻ_ek$~]Tan!ag*`)ѻܧx\_Z`/ewUUysҋI<~e^`.ƻ_B GM$5{/͹n<73Ჩ2Ҭ*ԃJsqͧ)҉42J׵cs VqmFeX S ڕ$׫܍`W;Jwq$dJOi+\UH KTQ^-:Nf52-?cFa.ݹy44k8#*\VIZ྽$lҍV"./j:bU:[T/FTq],#ĦwyeT g*ښJOFs7I%QG->^FR{KJmCuqw*ٮC-M# (:ge#sctx7HܑJ[n;hbE,,!I+/vbsT.5u#*Ԗ"3=!+F;SQ3,n֓*Xi pADG-oq \Ery I^Ś#@V}S聍lxCWиJcq7 Qܗ|=4nG7qt)@Խp{=ScصΑ*M Vm԰3RBh$T %˔Ǯ6D[@XuF<)qko%u&]GzQEEIN+PKQ;Ԫ$8|j*S4lE;pzJ75G\_h>M66)vH\i{aյw\xG$f&E}qɷHl1H,1-V;{r=S+UCt=ӧ䵸.{),%7e\#i{ݖW`4ȫ-7y2kV{us oÃnx2J?)$Ff7o}>lEy G(8ٸ^bq ~bHj^d6 |ꚇk&1R/k'eUt.8!I HRg9rZs{2>H޻V|I&Aq%1 Tofۤu~n[N@Hъ<-kGdwh"?N}']M[6uf./yݱ5ïC$̊҄9z}mdl>&&c'-UŨփpGVaO1%(.PV~?;}t;u;A#1ʼl=FAjDT >{xk2CIo8]M~mn}٧ ԍ$VgѿE#Irַխ7T{*;|APNǭ .(yV$E6\>o#38|]F&x$6B¢=Y5zQ$1Hg $|-m7mNECsOav4ӷsoMTBjQ@E߅MhN/1H(Wvo6VYIscx!W*Aqu~"Kwa', +gi$)e @}EX(R'qBy6\Os3|,r̫{ +E}XG,_7[Izw/a{qKKxš̷dy"DEOJEyH?*ڷ}N$/r:(2gg׌iAۣ*S3;:VԺfSj4+]iZ Z9Kpm 2_nsy<{. 6+su2BZnOnSuW0u:v6lct5?J }5r:b4nv1I:TٜQ&/{R+o)Mij'mrnw]:8 tүr(^ӛslSt밧]u~02 dž{WY.>Qqr4q9Fp7epȠ?~tǷh&h59RE:Vn,kLj4-¿CWr bk :=.!u]$xlSyimOD-M= Q޽ZtD(XH%n|qh $1UTi DB\ #:4T T"5P*՚PzӢ5R5e]@R {B0BsQzOagﯻ7y> r)wc.cEņq Iynۆ jap| ۜ\ ?w{g+CoFРVz=msN!yi B /*o{ԛFA{IpB(sl8 KX⺹ei^ }0tIʘ$D{G}}{oVˏhs/)m]x M/flle&lvO5ea*Kp y=Aɮ˫tѴѡB.#1 8ڽtA0 $dW71!)[H92QV1cPE>@O~\՟*Vw*rGָ{O 0a3|d$onkUVmgkţY9 ⠡Pk{ WZ{ЃÝdi8{kxlbo]͞'xW?ZI#U=:&ys9y79{_UmOhƾEk -]Moq7 &DE, :nou;o^oъ}v䗜oⲺ7nqi6#|i$tO}>\LN3F`n?O"l%Gp{"~Doh9wTw$r{<|ko' a<RK3uEhJ.sG]w@R8Vꆭ5>S"sÕJnJܜjmbuԌ>dT WNCJ7>h6e[ʝӬي(j5M~xXɸemppR̳$?mR,p;  ŋ~xM&k]F6DB=S¹wN_m15Rh641ОW=ӾwMdmm86okwsq,.]Uc";ۋߦ]#VsR|5lw->4N%邰 .h!25K~LiCn mʺ&'k2v4+i_W١k&BJvHNO>D73z+8.$0jiSZ)#G<h_i?T-$K%FVJ DPSwuե@w-d dΕ'owE] k iJJR!{8nqm= F5SȐ"a`W>a#{g ` %d (4βCչ'])l`7^}~d*lHnwkp@0_EU*xJ_9N2.9_ժC,ar ]Uas]#QrpZ#vGf!Z*;"-ŒXIP(B٘>5=vvefDIvX 7>'{=U$v$;$ c6ʾH& b.Ȭ  wwFHzQG$%ޞbkIisss?s. _ pg 35;֖ܽ؋uH9R0([O9$s qqli Ǭtd̊-4^t.9\ݥ>%.`,M[߶p0p}ĽŲ},'@ YrYkKR.ܧg4Bm-PB-vΰC+O݌!!MB4q,"<,̨K5CTZn6J@f;")r.ie[-ۗ=Ӊ>~#/>ے9cY Ɛ$Tֽ"ݫOixw)Iֺ d0ʄZ@On-9{kT7Q^پ٫ ;d x}Pt]!Z]UMA< C#=4<Ȏf$ tY#^Gc8Lc#jTFyXB .b;!~m#esuȨ $b,qŴ7/;qu~QGq9zɈ)\-V2Tq)׹g1xo<~T8]lĵ~ #W >cc72ՊY\fk4aHǔ֔CԭϪDo 鿤0w9Fve%M^Wب؛ UIȈJ3_W9&s`5R K3+#}|9nm7d)MOq%kpY `W*~#փ s_¹y&G&b=@"40ÞbAZke~@Κc/g?"P5KH+ +wHݗ}kCq˹vҴG!iǾͧ|{ d5i^0?ja>e.<첊W$PqVPWREz 01'W ⤅ UPQϮu?\A?Ք Rԁ !@ A?/E4vޱ_2r~xh _C3҄~Ft!h t((8<.i2wFL,("$2;0VZЀE:F Lax"E '$hԲǪYu;Z5U{:s9qQn:Ն#2w|~ғϴ` 0;[kӹCۯ2^v'T^T(~5Cp?=?{"AR'H *S? 'vzieV !u]9O^|{q|V}ObsNåu0 ro_aڄ_9Sz՗^WVF'aZrjMOozAfցCwkxC`Llu0 ?.=gi'Z(E.D+"hYMKGrZפ !;/bџv-aOI[va,oXK`ܦzymžZKuG#Hj8|8d #((®j/U-Y^H7:o@堼#IC0H9c8y+8}?,KRjįu, 5'ZQUsv U{@eKiPjn}g}*J3{u +U*[U*|z0S,suE71 bmTX!wUXT(ȋ @qZ:~|o^ڪ j׵ Ҏ˻"~\;3#~.ے-ωIg%R-MXv#֖k/R I L{rY5 ^֐n)eKy}mL1pd ^>Ǹo.fB4,UTSDZF$1Rx%TIa7p`.$҃~lY>^\} bZm(ҭ B>?Zw<& wʱ*?6cV!d>9Q@զZR%Pe.Ǝ;KՀk MFN %oX\!xC1 ASyrM#w*se'P=n։nͻg}QY<{Np#PK+h8f;P\m,ksrrB%r趬s~dͤr#c;$)$wcQPzHccԿ78( p<0Zc#a{&kiX-DV(YP+Ph(WjߺxGЙ_GsOg f WWj {%y`[E9<&e)t{p:c?e.1=WChm+zlMc!>- uGу!?ܶ-r֛u+>"AB? [S,E^7JuYiPot)p:W2\^ꔙo!^ZZփTOW> \(`81ZT5{7 biK`Ʒz?~RzG7S[q9ƩLxA#tl*DRXtۢN݌[ux>ySb;hae+?eUhkZ7R{%W,4wꖭ.\c--ndJвT 8gV \)6b; ʗ1mLwσO%VP8*iSQ۠5QMeK.6Y8K;ifl[XK:-* vω(NtxW嬘0(*@&P.u!h1 V& P+^h"8ԁߦ큁(VT%.1c2%0+e8hdEci[o쌉,nU,J; ?Q[Iկl chK T S淪(r]DpceT*QQFrIqU<[8DXKa_{2KrE>E,/v$Nt4H{ DzԢ*'V3jQw#[U[DZ޲ME+]Zv1NCUF5&!-(졬QÒ{ȅGImlfd.e[{Gth-Et:bdk]e\0 +嘵U=)CK湻}$SZI))@a4[/̫P;IfXB{u18A!$XX^^qlܕ6Ӯz1+y7[^]Oh &jV'3Ū̪Gg韤d]&P* +9dgTQA5i6nU1I냜#kmk.PCOs+R#>9ym>K s63va<-fYt!=@M%O~zȏb[;NL ;xzj.ߣ.F9(ڀG >=ۙ=q.aY]6K|{{m$y7PPY3A͛>!ZK~sI駫Gڟ7Or~WtE&{; %y7v%d;%5j!AM]mic  )֛u[fc!ڈulb>;,3y\ZITv$R.l <*{|(khFR^uw'I#G60r1+U7 e.ͺсOO$4JwlDn 'm۔{_&EV@;@,bj:EfS:97Jҳ?UfQQDf&JfW尷QQXq9x)[&=mfmzK6/qrSܯO;[](e6H-y8s>٦e GIG";5j̎WtVZʽV:8Z @UGHiՂǵ;V9d[/]Tqc{\r\n+bOk7$nvݳ{Gvf\̑ wtGpI7Gүn$HI.|m!T )W~Yׁ!O&&@v-6S<)n,pS9u'l⻎ n dx#띿tV C8ދ2KxjÉPK\,|yZH}4-#*8*Kb9^ e!1Ao\N lO!goO.3L0WBA-̬rV;/jDmxͶhMA#6rTS~lav ofaGplݿ~6lpm8ew(Wi%TUX:W7Kje8 0XPIzA]#z]"i>cyTU-BxjQcqe\LȋJt ikR*CUyTke7;ۈn39$EOD:jӵER@1Qv*?n86x' ޛo79~Ucv'u]Xnn>6\1pك+ḈE3K&=ߪH7cn3@) ܇* KSh=Ѻ mġOƋe?]7*ٯŵ͌HɎ[!oYGE5&j!%Kvz/H^AȍD \>=\Qmuo.B~m6VXiX">hdP5]sZwi.]@LAi])gϣK'QˀB I\kǴ+=vcյbͧ [[ha]Y4A7;UPLԗIG S7D١lF#͟  qBiX27,<q+)kyt:ꏤ AnU!-rRՠ/ϾHt >R_^@ⁿXcKϲTj$UmChWwFMȤΡ뫤˭hxE q ]n'3,t4p+bJoTO*t4:4 . *Ƿ xoW+'q_}=` Z69c%Zs#Ji1z^ Du V:zֿ+ZW!J!.Zt]o.bk.)+jOH5_Z=$C$"CZ7MK*}#gزf%Qҿa4ok.KWVzU Ēa[$Gt!@ekZujޒ 1.miHC_'hlXO!\Gg:͖/-ݑQvE8-"UǮ[8IT s_Fdž{,n3 }hUʼnͬ%LHP(;};=ZǗ M2ܕBFq؎UofATT2UP@fmF5 CT\Z(_S,U}k /9+SdQ4F)FmgW-]N 2ZpB#*-oɢ)`VӨ=o E =~΋mvu0Wo_W=9Fr 8޼r[wJXb/W7Zœ;U՗mH H5ۅuSzFCT;CQzk{ \g78mv/. vQKVԹ𫤐.@H!Ml̚w66=dj1GnxU`9fsm{ͣ\::ɔ۹?ؤͰ`x cR#0n:3|ZlOM0K: 3]5zwi{J蠑UpjGnzxlQVi"1~4ݗqq2+|DZBx.q2FDy6m76{y m.2*b|jIPz 1jȌd Jz*ӯnGT&F_!P}bGdB' ӖaE`fa*Ƴ?O1tt,} WLO3# YgX yHBĖmkp8L8wYRkBIpPWvք݃&n"(R{FOz/h78"/r`/Иe|хHp\jAR:/ !j </z(U0HvT/^ӑ,Srj;yhPEhІ5t#%t:۫@NuE6(g1R hy#j%UkWEOnO.rO,#5S('NjC l!S+Ek։+;cq$чUnR7 Г*XW^9ѐ'*gz: a|TJ^7UU}\Q(ɭ SFWH껙Ʈ͈Zi~%&݊FT4äL/JCrP=FFH-:V(Jښ8Q_?k4sꧥG7{)ǕZUBhh#NKZ8Sї17{hd#3UUV*@K5h_MY¶DD>BVr J$"~E>N} ?7g=ly?=ҕ:۞ <$O* G} 9mqF)LQU.o**5=QTPs\ߢϱbpsӲ2 d[ibc&j+WH,\K P#a;/Ө-~[ORћtd27EZI/q1ԝKkť5m좈fiʯӔgʥTճ7L{GKsO Q'j65uXϮY {K"[ǩFyqskeYIh7o,)hāK?E4MݳOF1Ť5l -%RGsQMr3E=H~`^cZcYA S;tO%i S)NռD,la(;S浍OflYLwƃ7VY_,:Ϥ/|ԩ$.aIEx8PG$s#,=(*ҽ[ռǘ6 .O^=uw"X ZJMj "E:W捋ZMtJL T8S‡e#\C_7\|KiXE֦yu?oM%|+m>.U7?ӣ`Y.l\كgm鬕:#;Ӷ>;h;ZJZMͥ=^"Y\Ү.j<*-] bf(GILSRyI 52R7J-f{KM1}wNۯ Q7 KKH-yv[  Zoc0x]Q: #H+3.=&NU|Ne]?Yk|¶u Xaj}c3;gg7J퍁,E֥Y fB5P}zl者sג}J-lmaּ8~%bMc oU-P /C5E}:JH*&/QܸqwN&H&N m-Xh9 Fb1ZԎ׸"̸wVGN.\AnrV<8ﵴ+C\ǙIn1Y-ܞL| ŗQK4-IW.uM sBrqIҽ pGh!ֽ|Ar I -Ξtrx%)MI$@j9bAۯ f {Rch9Jbh8rxǶ xU_~d.̥%w]+P$KsQ53(U`K cz3βf&(C#{)!gMTs96^; ! 49F`@/ 8fh Ns>qgppQG›2ХqfXvۚ*Ǝr>ذ+ZU>=3lSԓ3[qF?DiO`2Oe-?.`mn$Xw.ֺo%$}ISߦokicuZ`[k"V7= ,T!{ 98o>9h6 wg1K=ѷRY@$O@k:EJ\ MDs ~Unۿ]ִ9;M yGS}Oxm-8crćrnܗחPy<|8 !idiTBGR5/he>f(i:Ge$ػc " Z6:I9"~)  @C|H%J# &'`y\]̖/%g?+/nVX. H0e$tV7AU u5q4csH qqcUc+b[!k]!+gfyp&u0a 쮘Oyvo,fJMq?ϤK};s^XۙH] {ɤ 2j#Ks("0*b$FN NhwE{#S)H$ {(aUZ(A&9օRƽ? 6৵j> &mm-m]mbnwFZHӋOMtS]JêN0郣լ{٩&XI@P?w+kyXzGf`kڦb]mDV8_g&6T-)m.W{\x_L'n,cN1VޔZRY"-4(5^ǠcAu^k1Hq.!$ _F6ƭi+p>TDeZ{ݒN?lg .JY|.Rm[a \G\>P J5]`3Z3cZ= 4:kdбTbj1 {~)y+y]i>:)KLWsbH9i:lg]QH(x"cU]>3VB` Mrorv[i2/pm̖sg7Fk:ō7krT{yD2]zztzY4 Z=8]O]NuһV&ۭkb%rn .^8"o,g`/˹ uT-Kw e.&i :ZTSR4fQk"AGԾ k"X8}Uaf^s<~. nb.9^>CYmtb7 gm;Ą+ӧzMHS @1  jo6YQ`s$ '*[Ӿ7O'ݗ:m:(ffZ4v-H{)9Cx0?tOmό=C&#(ZPmPJB7]`LJ?w_rܜ6Ořj)qX|EV9,J-16VvOuwu(E@*Oi4{VWԱʦ'b{W}#nhZHlm{sRCnmKXnIp4l`Yh}{OfWQn%j!!·Utn0]ݛpXmDڮ/qNLطR{\V%4{l_ mr@{s[quVMWsonz^حybmyfA$%!>n=i&ʍhF#%m,)@]KyfR~t7 7&H[̃F7#%q +(S;tT&DUK%y':W0{os]a|9f76捸$]9?_N=æ$7mnbǨB\0^@u,HtG$ـ ZТ䥻+߸)kobjuA4?:܏Uܲj{P/;Su O;UJ÷L6sȍ@q)/h*gXEACC,xݪQy{}n<]jͽv!y1T8ig윲MaoI"n݄A6̡Ƭ%*Y* FT]xtL.EYl15!fkC C\邗 [;V{*,Bi,v!Aje{$OYQ.C4xp5Mi٦ҏo *2;8X%~FU|ch1&#;uXx9EW  ~I*s]cDyc3pϾځ۴sϪ*KXcDjRH)!E~~4;m RŎe#.gQ m)UeсF>=!)54{oFh?o^ﵫ E,Pf,#h2F„7LƇV ײln V3K bdZ!NK/̥VH#е5f50qsآN߫J}:4em.L|Num[ $ VՒTk:k&GyaӯKdq=a+1)[7vQ[G^Ëw~C fR)|:*V*QjC{:?0{ TjG4}^Hfq͖F T(nGY  1oFW_E:}04PDl>w?x8 ϱ( #aqqO&TIu"o;aTE9S#_Ze7K x"%>K)\6h%)duBM~R4&c!+q>׹٭ax7f㭯 ,PA6w  opjy~jyZ-3b-M{_.Vy,!Inky<)fi^5U:W29XP`_mH0Ghctv.HYtp`,Sj8Op#+)k\{wsmknbKt: NTݵ׾qҽ( D>叮;os5yťyh2 .vT/vc[_md'Z4M|ty;~uAy =:Z^'%ã2)A!Á*Ƨ|gLKAF9 {oIouxۀ`?ve YfFZ*#SH`AKhMbU1ŮiA7Yyo#g7$4=֬njV+xUwNn]k70(8qOկ߽1:n{Q8E$I%mL>}"=Gl䌈Y$%Iz訩^}&Q){1{E4Qhk Mans.\֤w@B4;z}x;dqLǍblz:@\ 8.;YZǏ~#飀.%+sެ>~bgZx?T/y\faB=Kyk3_$"0Fƴ?*J ߏk!^4K+DB ] lяH hq27/#_{n.M嫮R[1em j :bc[G({+*| y >O}9Ͳ9w|ݟ+shx[\ w!*Y\01ojWNNhi[o+8S\f1psodnM ?3FypZOqq3H KI=Btːatq SJ7SXk<ЛTwǜ=[3q]m{3{NjfخR#%i]QEՌŭ":DHG3͵far9,FHv$or2A~W2^3AX ` T c@z .BrV8;ME 85@bĂ{Rk]x]*Ƥm/ݪ;>$NGe¼Akⲛ{io$P@fmf-UmY[pQ4\iUPU aQ>$lkkAp~g{[ow(Fػ%E{N)5FC\^JOēZI%5\'p\lXVդ:hH}dWLzF%FD&L-BBƍq#]:q T@t`ԯ?EΟL^}P/QU_KaҀ(rO u0~o>oɊڥV'HŚyٙlcߙE:R| @ gՖ]ð\U#u!iZlGsHul#Fc%,;+$Պ$5`papJzI jsz{hmC- % H\+[$_l{)s}y ;^ilnK%Yb";[ *YQdiLb5C7Q$ֽG,qǐ] F6tx?{A 1RSq vgE}{b7bWۓ/oX LD@BekI4<:~,cKm3=֏fwW>":ntMW2~'(9 қ-joL›Ayx5ľ%2e֊JH3ZIr 6異1ͦc򵠩HKwq5/VK'g1X?d{I"DZM*u;"-+u~ڶVApkL7 {^鍿|ܝ4aRn=ƢXQ )IД>:so#W" XNOi\Ň.oG{`m0kpSabgluJ9(ⴧO7/UlEQc^ڌumy,COЛoZ*Gs<~g%j~Ong#>R}LЄ4R+;Ia'rG{2~6ʒmHYX$?:uSI`p ?ծjvy;ۏe:[{ۺ,ord?XMqyWoӲ=K,hOUgPi!:vf H(Y'[۶]Kr D(.{8UK9Oꜚ u̐hhP?+-A""]n :WsK >U-Ш(خ.dSLOedy a53n6laq؜2c|͘n#K>@UV_`ӣ8)"kf1Jp*4>3q^uF"&սqJeFw\!԰[I;i龿K7 p˒YửXBʩ,t69$"vlgPq-WmHkH.~ہ`N6_4[,;Đ#(ww=L=e_Ew3_g%},[lLdYA3[R̖4Nķxs^-6ݱf,@;wڮ!*0o]^!C+ܻs1VsiuGgFZ/m: ,IZ曄`G\yE]\acqj/q8 0pˑ.ClلV?}\yb2K#n=տu1b%h8't޺y31Y#cKY%Đ .68Hܐ"w~5<ߨ(OëgF\ HjMg=slס]T}-|v}?n8*\{2,OD@HmR"*?w)4ROǨ3RB򄐞1_zѾd_NR*G%kfZPp#cdH5/_N\ - zXEs(}SɱF,%eiB1jгAqJ8}P2~omw;jb'~$wD2_4ϒ'Q4(~EAO$`ntUwRw~18X޻seiWB0Y'XLF:K+-P=} >8;K¿U;}leţ2r{wnqRo'ﵯ_^yL(8EUbI1;S {-.,KHCt v{̞sknlN:NC b\_[Z f$KITH9P_zy`X ${-Iݙ/j۟k™ f%㭝c/qwHf@ڣ6F#7ykp?ianB\5l\;]%8uͭʞ`yGisU}xz^^qn{,pm˛\][g X^<H"w%54emJuRlr% Q^s3J⍯W:H .''3Z;ǒu+$Ƕ[\bOLn/Z{3Xt֡%|: 'E#WL:WMzghsY Sġ8];*C6_|mkoqG1c;+s$ǷN]JDvTh(zWz4-r5uti(9J9ɀ"5!{#uf1<͝qvYEϏ,Vcr@=`}/$ڶT<^74 b2eE8D.7o#uyaܷgu}fcDqiguHr ؋^ߒQZ[~rwsg=>7p峷8Gickv+kNQP:LnRI]H"Gm;;ZBqk]+cn ޜ/ D[u7l7:_qbڸ#a&/rgL4s3#(Z.㩗]Ig\S b¯j4~VW<1湱0:܊(A6ܚSQ,1,Gjo£h4ifID2QF V<& 5p^$WG9o~陖dHY!}-˜ܵ9>y>erwe)EGKnvϕKpp⨈=@XǣR}n7@BUU]@%Pj w GSjKvϧpˀ_*YqїeY68<ٴk(;_ prۉ[A0SR}O3_t({j95lFIiԢW0i Z>si;`l,t[KimHFGH02OךrG(=!dL?&џO'͚\Gz=.ڽS6mH_5FƩqf㼞{ec~[5xynm~Y6'c`DhfZ&Ϩ=ƋW29 '[ 4'&wv;,?)Ӛ'5xC52HW*n-=%@bĕ80޾u|s'p}sCpቬ`}Y}\(P3  -}zs4 )HB0=OEN^2O‹@aӿ0L]@# o&fS#X;]>mYVۖA; # AwOM:ÍHOZ CH{|9,C :lD$%@^N2-!o+e{-A,4 #0Wi<T/FG+^х E5Si#pÕEr<g"YtK+2DUԃ֪H j{Xr$>[p\ E}=>^vج6˖x`qָL^"ye6,<6v8 $ԁRzumzSWLb*I *j5mGH@v{/a-r+g2Ybyɫך(w};Q^F^3dSׂ˅'luUZG#290Ѩ`צU|&Zt)q)_"anN!`Q[k`(bfua;,7.R>q>.{Yw#,<33ϒ؜m]Al2nsT6Uߦ`e2}9HEֵYb.hc#^r hrKqv\.chMIkբ` Nu9|ܺBy]ފ:סA@wh rkǹ؂v<űG6#{lmkweQCܨh'YkyV íF-X&DǴxW/[dY$78Hc{lA pl搨Eܼmڋmo}i$iW}fni[cnfy9P;}T$l[_VEl:6n ҘIv`$zkw?龺na8Fb8ѯQ7DX .<_{j׻gllW|+;,_+ rҷfPRAmBsv 2K8ip"Ge D$kp;dX B*;oʴqo݇ż{3ǥMrg/Hqk PRNJҍCӽEkpO4GQ p݆ mFEH`P~l[&Y $eJwfA}];neS O* 3!llDgY)*OzFo?IT!iW\Q+FQNzn!HV>eq#?b@|{1QpAU(F؟7QF6W`޿:D5 fK(.h_ǯ4ϑH`Uo6~nsk+sXvz۳גHHUGV8O~Rq=k3ӻ:t /kUe;31;gcwvMbdqYʹV;Lmle#R]il+nnWRɝq'u UDŽHrk'8jÖ\ج<Ov/*xB4Zx30U 7LGejtM>[lqP^,p7; j/na=ȿYQzŢ Zщ*"rlz2Fܾ[<Êx\4ݛi m>=+=*tQ~>@T~4/1E.V)HN#0K qE7PnQ0?E5PT\vDۘ57hFbƎܢ'1_&l|~\cK c6seeF{/ɻrdR.]A4ibi$Qq"kIDQbXwf,62,5˕F md8kVme~7&-ECOM$2gkL#$ri6YX]dkͫʘ;(L6+yQb4@|}w-{ɨk{0 OS {k풙Ǹ7Fg/w%{yN2цVܚ+f/nl,-SzoCԹᥭs|D@BUq{yLr6㝻%Ymd̈b-6XZKRة +֛.jftq̊Ċq8ڳz{d飇V+-`%GO>9 ~5XeI[6W "[i_TJ@ a[b{_<Ϣ\~n4G0aEˊ-^oRos;9\lEmfRLn+L){X! 4-G}ZyE75$yTÅh1ç:i++&hhtD1nJ/caD7/H2($[TW>F&r@PRD4n̩7`݃mFx/.E 2oM_38jiY+`iRSۤ6bq)|B:yξT yR<2,զS's=6leƴe>C'$Qq%n[6j>Bj\5IsZXsUyt~M> ֯g |f ,c[HБHOmcgHw SA;M-d+x=ǵ2vQۙ d$2|rRYXª[RVd%N!{U.%g *ÅgČ 3DƸ h\H7hn\V5c,fb%[ܙlWx^nre|Me?}II.hм H|A5a![~v#sѶ61-LP#oY㬭qgmkg }o-yYJGVUecj'hZ潚M8j7(Tҭ#q/nZܙ2N{)$?g36ЂE_HзRXu1!У>)K\yF 4)7&O^ӵu|MgVb 9Zqh$1tvYTiՇLTj>v[WOϨz6aǼcπ|}5sՎ4]-l`צ(RKTЎcS"j[X1.SgV4_|,(}lu֠2,hI=Jh\c  ~R1#RUjLeXh儒XFY׸=zpTƚ4訯ʰ}>.^Scp )1v2Z+J[V4gmcnھD6H*GBN%6|x!P?=mt%ڔ_¿HH21)4'6Ƣ㈬ZiG*0E+ԃX4=V{ 5IVfyXePr+Gp j{WOҚF;RT^7K*=' IGܯv 1?2lIKtjI؈ZFn&HaweĢ`I'I+͵j6etwo,!wNg+`(h :XlXzm 9Dp$(@[S*m9 =^_ |q5F!J-D$oaR:lOt uv8 [Qn9QնثHĴ,Nzq%-/cPϑ@š8]D퍹x YvV4e]XW{q_V(Y۳$Dd*%?:ֳ~75+Mgi7=fuj$mM&!)N;k;oK,(BR-5 ,enqr$3FlU+z(?M̘?G,*vRb8=9l~AV9 QFp.J@ ۜy+_47P#d-MṌLÐ˷ZdnԵPO;%#jJFTpLkclƞ#ܔpl S^%Y>Dq,Q̗ |Ěv&m@s8&4(x~iKW6< p[6.Cy8Aăc\E jImG"5\(O6FVb8auZxxV xq6)滎{ۆS "R$,J,vxK[cʞzlvdv"ؘ©^hI?4EI]B{ugVvVS\K#>`ѤXZQ{( ˺rVWv͐fc*]QH+N?PҐTU=(-}8^mfx@}׽(p8g3b6Zkˌ ͋7]3x-ҿMdRl=A@@U18*iW Yٮh|8(Bݵ/SGw͞7-:A#7.!:@q_ӮwJS-LZN t`TzαBqHCxt$5-*V{ӭFc-uT?`K|/俨h㏋jI :|Yd?*Vѧ`0xq.~4]+a$lXv 2>i`TSNt8psΛk4|orv/r<͵]ӂ Aٳġ*Bz FWԲ9Fl YEy6TIY[m6kȯds M<1T+/N{+Md{ʻnY.mkm|>s%r<skc+"ێ]:P3MtC7;G$L̠Ѹ(*5igvbeh/`Y9q5(1RxQGhwpDN5cW~þnS\. _c9^MŶPL–VTR;f{lLhcH{6[.1R+Ͼ{)o6|VAql#uݼy'̤B:h!'n 8"./Tcg[SK19%d6vY%ڪ5@?GhZ/}(=;|2IX[H@GHjǠpi":s9@ *~Vv_LC҄Xk1ĬcK5=cOV=fǶkB T>󠝎pcEv^ym}80qb"UoS|bGnO4RGg#I$"*5$!y7Z)*QԠİIObVV @@=uq'oxv<xJXWT0fYM)Z|k՜K"Њ7wܱ?죙 ̢~7d+{!PijR+5P/sP=F3l6Hlo~R]n۲ cK>WJ1|w, 1E}'oFǸ4׾UbfM:~`A:jҪ v=W5,>1V :i=I6 sI~DIzp1-iC X`HJxbǩ#r<7+Tg('RcT@e%NY(3GˠJZtၨkz)BoXлES YkYcҤlbWꢹ q1{<ɘNz˄K;yaz3k,KЬS]%ƘrEm3n]=җ@[]_-Ό)bEN]CjHҽ1 o) F{ⱼ9q>kxnk-Ry#\㶰X̳T F=Zq;07Mk՗ q}L '4F`KKUU%-Ӄ.ہ$ÜHǀ`)J6gq}=)Qmb-ṫM13iS]8/ ^+oL2ۚ_^F֥wv`>RAo2oMk1v1PU޻OX]&UsF֍ V7~%W-Ƅ+ ٗO,4ĵȏ %Tj}Z{QeP*}]:,!$qT[kݹ7+E"[*<_م1##(;zm;d;# Xsst,޵ƤSߍ7C|:P9Cᣐ{vR$E qa,R53ƟN2͂sb2IqE6S6.m8="raծ3PEt4r4gN`]8Q'˧sIfQr84wdsqhq3E(k,s0`(}jk쪬jxE0m T9 fڹ~t5ճU„( {t^3y/K|D6_sF?y@Ef*.VsܧoϷFx._ؙeblӾ:M3=ѧQәG!ቅjh:.2XuDbb^׸;˝lm,+k[tK{_oy<Q98!:A>IO"Ck^+ܺFh !nK3pjƣn^yvxL-2ZYc$_`IDaN֮nw@!VRmviYSFeK%^$|;[k\n rt=ŵq،lm2_yqt Y@/Ȥv=~%sT>`{OQSXFPbϑoӾLM56º>ϻOh&ƸCVNKr,L V+7l`4f[fj$]fcr% wM3I/kXqav7iL)|YۙF\m\ umn.m2C%iqMUA5KjzC6mq=gZZ$-}'Stۋ&kD„8uH܄R;M&v)qI3-}ug a|#_k~j}fHu5B`ʠZ0>MjΘM?4aŶfe@PBIk v8qm^c]kPMupi9yL`2,pneuw+@ D>0>ejKny20f;sg7q籩f[/;1M떚vcBC+?:!n[@G}r33wm5ʹ"8JgRt.pcl|SwF5S=bTR=#WMUk^; 9U.؞aL5c1Ff.Oޡ*(@52y 4!qRh$/# ,NjH2,t9 ĩ:'b\-797 3\w2^ʸ5vRkJ1UϫAԚ<;trxwvl˜֘B[ ͪ[ Pq"}M]GGV7քpdwDI+JGY GN&a,sq b ۪p(Yޱ;^-v$;6MZ0MFHP;Nvpm8 p@|f0%wVe~džC+C|^ݫWrZ5C 1Fh k"iN; y Gk1]g^  $*v đuXX֚Om|ֽċJԁОG5}ǂW+h;,bG0RT%*+ u!.z.SPQAXۻQ>]lM>&Tm2ūRO̥ܟRĎ@E у\BqJ}r+w;`n-$v Ke4ZP=@D%O*H%n`[-(Tv zk]C IPƋ|ݥw6ַ1qd[Dr8.R+ւy1H3 {YyQ,BPVw `r,Ws %S%w{o%ݤ/nSM E|zmtQmڇ(K4w!OpW Is?R߆3moA{N ,.;'Y m F(/SwvK#1%'w Vo[=C-Tc7¢Cn݋)*aL\nZH,J$iozwSm!*793T]|izZ.{Wi jy-Rh? lm So*~mLg7pjE&Y0ƂݩZ0C *xZmyCEQ[V,MƝ"A(Z{qt}}'wG[7{ m ݘv2Pn>'(UB)kf:Z&qc\p0g{vW P>g`G6yo̧#jvO=oG}vV۶Q6n[#ƠJ%1rHЫIO9&?0MBg7څ)+sȶw|]&MumP򍕘rcnmnR[Y*tЀ: _N+an9j-&bӓ~tGa{c{\㍳7.NLq5ͫ_Eb$ۙ)d6Z9&{?[10)X@7ZNm &C52h_|ƴag2R8Hɩ¢פOMFV(*I*U{Ioa+DzAncpvvkU8K3[s;kպGeD]L˥vqfǕE.wDZ]$` qi*SO,ۜa{fNA3^Nl}Z-.-gfDJz~GI~ G|E1zկݧ;1UI$v467=56ɤ8-s6K} ʢ`ɘk\ANV5%Ђ؜ =S rmkLR W74(%j b@,  8v0eSzX>9 ;t1Z_kx|Z_fd.2w1؜d7ppX-r+,wEGx״LkbtQf /- Ah p+SPC;N'B29 qTZ&2" j2aAz|8X\82Aqcd/U4|:+X=V8a}{{kw7\v~ڍvo!. ܜ{p{|gnBKqy/l#ke\u3C l[CufٺaKSrx#5xpR!~MC;N^H47 ^#vLJ&exT2#@lkS<,^㘂s80{]VG J_ŜmXD h&s)"%q(7>I7s|;CGV׾lcǙlP.3UnH 5|i݂0"R1),3GDO%`գf?;}^XuoCDL'n||A`*M\.#@%K3F21  OFq"h)/Q~9:sZ7+ϛa]=vm[G`{9s0K\Q  P^P1XgϽa$>xHD4p*PO:-ҿo9?%`CLajtB4p}PGh!Hhn{B/2ҍ''$z?GJWqc-m^Ey-=o j\{?:jը)ATe"zvB[˼bk}/n}F8>KK>Yy=r/gu$ۧ icIVCƅWGvde&9y^P`~h4akψ2,@CrxQCc+o 5WHuet9e,J,VCKir=P/]9 {u.>l@5{ƒ_DJv6Kҏ|NLz%Dܟ;O -_=wX3ORPEG]:0<Ӿ<'"?!b^u/ψ{B"(,C͊"'pjG;N=K (Hj[p\>.ҽKI Õk.x. EʹSn.8^BC)ң_+\]"ǎ$]9+k3vb)*@"I}iraok%K:\[[)c-$U 4|2i4o"@M(7NUfk%gp  x[Ǚ5)<-vı,,VMpo#mE)½Oϔ GQXִoܐ*iyo Yi;XrdMS|rs&5{aG+@@ۇƞ#C^ZWsqJP).R+ umeijZ<ɭJ(R ( @\ʽ ZsdVȮ?-Q{ j]cnl[ r Y {ȶmdmwr]}4w,B]xsHs`#}/.wK0+#^> lBMf_ o>.|8FH Ƿh+ č{4m#\sIÛVIb)9`2HK4m@(ִ)e^V'\$oo< " ذ'BIޝJY 9$\{xSeZml82Wo:۬ׯx#iG5@+՟Ss fI|J*6N$e*O;UR [v48s0\@)ru91т2Ciop^>܀iϝՌD'3{v=wtA_5q$.(j~WP zcM1ۆV[I VI'yթɏ *_gYGLd#8|)Ncm.8JP75}r5F4O- H$E;+ѕĴ>nyS@&#>+o1%2Gnu+"fiZJQ9H^H(>4$爛1$\tkJiB'ɧQ{.|E Qɜ ύ+#4r,^(THB3ֽ<Zcʋ|&\BW,ټU;gKkVC1>;]hWI4PVZ"OcL.`$!<[rTwZ{#nBx]Đ};u hUt9WmT%FmQ-/]L'%U81¦W*GdIC>? RROM逻C s­k?2` h*.XK&H] TIN?8 ~ Vh܇WS'3BNXUۚ=%w 'G,wOutZNƠzlG;+CDږFwj5CG"v+W 8*-Z`PQzE!_"a9 ҤwI9 qh +FnR<i.RGRV[ h}? ;[;+'Ḍ9|O^#y(٥l߄QQ%|3kT IJU'q+Fזb╝KRvPJ"mƎ7\I"#Nrxpe I$V.g-(>Q_F!ze8GƖ CH<`P`@c -&י>m+Eޟ*MNPwa†6$pmom2¶!rD-/-ŕ/Za瑃i`ֲP i7Ij<\jC @8UoVRFPIDىZ8O^nteX1btU41h;Mq>7׺9lRj9A R.>w~)CuTԱ%GwDtvzߨkK[Khd(I&$ƥ*5m781p,B^- T$b,qO[yrZ? 4M]3 @mQcJ$^U9>%D$ֽmAn>j3Yֺ䷗Z @5Tԡ~f'ON^/RZX WuJ6{oP9>f 5h@T FO^ )]&r@K}V8U}n=2l͔O!W@0"X ߮1Z=?BJX.LL2Z(*-tv?3X1ZB8 5^~%= +2-v(p;͔>kEƫϦvٴvjh.VoQOAۤ/B@97i x` iѪ<(WWܯ5 ,fl lKbA|#Jxl|>.7R( H c ӿ붂fUvy%ǟ+|2(DO:_E9JD (#Xܣ) k]ҴF00-k ŊU[}Aڤ"/ab;q:DG*1W䱧mdeWm^jY+G tF҄ףłު֓,rIukj{>뽿 u rfk{ @4ʆXЃ'?Z}6:^=ݜ똾zJ EĠsOgv,mn`bY2洉]-I"I,+CAJ?+s1dSHv%te8[{5baO8acRգcCbҠZ]LX[s?CnǀoPP[!"K،U, mq5#V$W._U]e"N&dɓ(Z 7UVV>9 ak;{[KvU^ݯRvG䵮IArE9| &`׌H.  fEeg۾Z#8l.+y]Z\OfG#&0#@=OڙCrǙV(8+C&7F$/GQSa5xv3kcdw($Ȟ: L_V剡g,<0.w(!14Xᘀ<(Gq9BP1;쳭$6$ ۳":i<"#ArfGA|JI*@'Ks<Pb;n,Q9rgÈKⶥ+k 햰 ¿[qg0:d TvY{kc%<.!C@JjZ:65s.f{5if+}f/h)'~43)'~uؿK]&th9skQ.C#^E3i' +48n.lpuJo5Օ 2]'IШ(EMgho(HO\>؞^,$i}0H*6X֬(@Z/>wzӂB"(jXDi02.arMHBCKdP?+@6Pry7܄vPOF'5Hm0>䨝xb[WW"a"vCuǛR($hğDd (_ mrKv|;?vdm0-s0_[+ocwK#K5A=mXk~c%^KZ tc?8k}r6L5oa3/'ewlr%\CX:H=AӼ6]NljR,({V絖nr9XH;1Cۤ'X\4Hq`ANӸkcAnxV2KIp(8vז)_0Vɥ;H?^B8bЂIfk[D,(*k4{ H2ݽZJTYandUPYE QڝǦmpbVCi,#huk*yOЃC׏eq}孶6Kc&-wLK}s gkI1*O=>d!7Ŀ.?ΪPtj1~fh֑ mW۞wȷpm-kamخwNn<~8YBIw$FY4 Js\SPӻT C0(^wÿvu6s9u&\VC?q{7k9 ih,jeQt|a&C{i-k7#l^4q (GCJj@=?Rzt=ٖ3OK 4'=T2^{a1yuS896]Ln prBDITP=L7ݮ)%k#\T5xk=I$\dw1V55PDê# 'jTA$Hu%"R^tE)@3ȍtF [~$WomVlq} \On3Y-.)ddoҮd۷avq2-$ -B%{淦n4nXj@ۘ+CcS+d{N7;"n_|2h6w? }u=#(dss5~6{_!C7˵.쳱[d,w<Y?opPyp*5ѻPK]' @{ mᑝx% !*qOۗ/g^\g쭕6GmÈY lnn5Ijջ!QRJC\Ce!scj3-@ksA@r$'7Y_aF=6oimF볤׶6dxd-4n?H( M#IX#-KVulr嘴e\Hs%JR_hW.q^qm,կ&?y-v^흜>C|cId q5-nٷt JH|H ;2ب+S3tΛxetj4H$ȍp!oT ʥ*xˉwx,Nݣea{{;ے[#1\O7(dGC =?ڵ3LdI^ q\An[f׳Hݫoi&= ^48QI~@Wݜp\lug\aV{ Mޘ \vز %)T ՗GPjc Ҳ6Ydu\5ItO (ͧ1popýTصRfJm_4W=&ƟAx!< ` e6qnfHH(yV쩅-өT5>5=ɮۣc6qÓ>}4鳳qt{o@ ř *4\HϙAĨSȝi4|'}=PpB8EY4^=IȼI8hʳ *V]QG~jG/2/fTVk֌?=S@PZq?BV\ro=ȺTOlQ(1NuZ2> `=F3P8~U6Ao'J7)~cWW˴vCljLŇ*G*{j(z%azrUo~K.P:_ފ6"N憴=~4P3iUh5jP)*)=#HAn>39qD]Uh?r؋yvZ:XuSjXSwuq=2X8q/WSSOxݭZ y+67ǴtJݠ4f ~W#7y w<&@Z&o-[i 'Uh'1=-@Hq7\G~^f%m^ 6Ð\5v/LPxP @t՗OOIV(k\Go@|V TstܓoOi;\Ŝ_ +~K~6(4Dvc@ dF5.khocwy It(jRhb-7e6Fs `:8Ѵ61U/ܽ]Ƒ;Rը к23!.B}5{[Q p_D+Gݳp~QnXAk<:ڷx5f"+z0`ˎT /sRD9Q%Fܗd Pڱ{yQB)' ;в _QɾZy m`B[%{ sYPЁ֢ymibA ^[ɅLomw$ʒ2-"/H#7QqºclRVPR,Š/_!-g&]\^y5 մAy$*c+H̙s_ ;Os8Ѷ 3@œHO o-.Ymne/ismm % ZߣCZBPr!11Ge7*=Ɓ.nV[ Ǡe#^]b"*-H ca!0M(qF,Qѥ3ڙ{}_Y[[.ߓK<̇3oYjF4 O~B`.8 sG=<Ѝ>A$#1B-CrӌKcD^dK͵|m2rRG2CP!aDd/ 1y8!* NVEÐI@&foƼm䳹Œ-4ͤǖ;e+K!TvרQ@CSǙ h8sTiH :BrWԍs< ]{ozZa-iYeo)2,/|yN4f++=j>H sl\5JflceO>[Om\9 faqEʹ]4>&gVbm]x6Vn_ass1>J"!KIhE@O}Ty$*bbp jonAxaVB4^Z8۸qA-ռ wux̑LܩSFYG1bB;(GW@idq4dU'C#EXNZU•?c <.W0`M7DГB*N@4(E+^m |YM4pg!]8Rh d"rw&?vM;~F:POjfG)`dulm7ti/0cudfs ϶٧>6 >@X=!W]t:w9y$nTq[T(۴L26;.gs4 ö k= \˻k7Mm(k!ab1? If@| w:[vڷ4mD3'6[Sµ6~tj"TdeaЙPև8fұ,4j(%TR=\ B.9FeHxrڎ$w-=z+)׮^C_2,#*5MhUV%^µ"P~V ݴ\>Qmʉ e*/ehhhBXV$S*ɆPcY$B)(ҕqD.rC.g%oeۘD/緌][fmHgt-XXRDݡՒWp'Tλ7_"**s5[1X^;&<;oqz.AbqN ÷qk%ib8Ċj408^ݗWc/%?$p k YɭF9s'^eq2lT,g/7 ;)´_lGK(x:9g{;jٛಢS+4sTSӿYceȶ`Yф.m# /hXveQV;tp0H#}S܋Jcm pIq2?E(Zϫ~ݠa\M𪶧!'UsKl\[$liQQjSp# Dg\)Qb_AK4 ( 8޿o>="D3IlM,ѳjwo`C2={Bu]iikC35HUE{'b_fm },Y=2+([i{sue"S o9y_ЕK5HK\Kӿ֤Dh?kцDr_Rnܷ%g?ԭ'dcdNx-ti9aq C:!k D6A卬yvn_:!W`AGܘD,1U RjuNi$;NBms>ETAtDS9[dOGM,W}}V~n]iW'a܋9-餏ٳ7C,)ͻ1!XȶWz^麞HdB.#p1le+7}NQњYXgx\@A+U,@m1OUc1&ǹ450ma{8It75r{9A.joႀ=[WOiџd{(] @W0var;K~63\ml_{|PG?q୲6?;&5/b'm7R d!6>I BSo> <'4etd`؜꺷B᰸ߜҾa7zKZ\YKLJ:z[+u;(<30*q?D|v^péovAT5] ]+ &@+V*Uӆ?~rڧt=waĒ3PY9KWȋKmFݙc ?c+Cŕ=_r{p7#%Yn$&3UM"!t%u+i9&Q̧d_\B^Sn;;+ĴyٶOp5;g?%]gaB_?_赺8&Os# Zc{B@%\뭟d)%krf8moo-I)Lc qg 5Qt{u:~aJq9AUMi88e@Q8`Xfďm{Hڢj?*0=>=h+n;ٴmicepPvݟrv\ ISp+#Ӥi%u_:H_.4r4ӗ.-4Xx-Z4-|\| ܻRL02C-X Lgc%6o1,t-&~gX{ngcC&pKG=q!T +RmfZ5%Ys c o8Z_\NNIl4 ,b0ȺJv!~8f9s+bn<"[qLp5/?cs@y x I޽?Eİ[Zê$^(Hf4:HB/CǔG,InFץYϡ/f'$[yPI)|7A佴xPEPV(~ÏԬaωJ[>t CZ>lG]¾Y 6t%8@ZC 0E@w5f PO6 n0@Ϯ<:ǼQAh^IDif5%ɊHbyehB=vxYAl<?^:;/rnqR^b+i+ꜴYX IIS̔֍ߣ᧯dc\$ۃIA ]9Swv跒mh-7(0}|m0, 8w,,0H^Y0D@ҽ8^'AF"1O .Kn,%}f/٫7߸{6,v yp6M[kq)6"Uh 6NoYj643s73@iM\$s=[rՈ}׾ؐ'w0?&)2lx1&jq6LkK9Ϋa!4@e$)t/r)3kgh$98dL*)GWmdڝ7ww5e9ʥAmxӗU$-^frKs'>Eɚ2pmR '90eJU':NSuќҿXAFX,!4F# OрELF&!W\E\־ط7Ms<\sG%b0x$QʡU=?E䖻^~$"vs½2!g9 0b~_m|3'|m"$?KR$w\c?\ *tTZ3 vc_ /]8hZ&ab0ǻs1gk^o0qkz]\{q{yG.X%$huH N@urYoƥ/_s|_{N>꽿ж_peeob,$y(̍;B}+  i摆g[yn GpI'Y]'t1 5Y$wAssUओl@# R,ݾR Tw1ʋ uEKp aon,&FV}Yqm I-gJ5.vJ^2뙛*FBpkrJX;;9BKx8[_Dž䭹6 .lϓJXȶEm/RMKWjsӬf@G8[¶H"/( '!ssޙ [( JOzkZƖ&s^#mq}6K[vf׏wsYEp#PSKyӱ^I<ӗ˾83ĂCasxʵmKGy^iၘGϖ6d,fe, ,X{/05ή6o3< @BcqcS\ 8{6o#b[Y7/[nKW7#&V-MI:_"ld!5hg=m$GH˗} u>MȂ0jS `-}ZInw .9(BwXD&q,Bįk/7s[%!C# .шT DA28X81P [K(cȩsQ%:*i K&{,WKH'kuvϑD??>p<Ī905g"av~X˼⬢Yl+%){i=";D%aJݺ+I3Z}qU| \n`: ޮ#o` ;}^< 'ʅ]Z>PB4x ~4GWӚMƗuŹ7R *=ʭ޽~׬Bt' r"p)cƑ}7ԖH}liiy̳G #SV;EJW!?48:z~ ϰt2}\}sn]Y7U԰P"*ƪ-MI=ZLju#gwDB/ ⸔+OHpĪ׽~}%۵(ҧ:R iUxŢ-FPI=r o}(­8r1{ؗ{#an ۅx]aͮs[MЃ!n+ 5Hwzy%u_!MLMUziy( >" 76llm㽁r9,Mmso 1xq}Uݕrz<o֨^^Z҂TC,oLT*JJ/i MEʎ1#+ƆAv7.n[us>^ I.nf( Y 4IA7RG-rILn-nDE pe<{*oodqw#m2^YE=s[kwI#u%]XH6&Ҍ _ۏ*Rh!8Dݏ{n{wo-|n' xY ^\%6^х쬏uY3TpR}?u3=8?Һ{c39ƶ|m{` szǬ>MzXmr:=),H)pmoeGng}]H tJw~n-G zJ%]OսֈS+{ط1E'҆?#G;u&Ԋ@U9?>t{ecT栗_[IJ2A^e/^wv2j[+1K\VUUxG:Jӭo9RĒxlnrYk؂V;>MG1 C-qK <ѡ3۳mnx/u6ْIB*oP,<[H+y{m~w$=,}?/Q_ܭZ7sb(%z րETjG}`/uro'mmgy,x.d%܊p^/XAaj0"Yl =fin ʐċ o]zt[6oD]͑ln\̍<ޯcgHl-ᵷ@bFVc$=ivM36F$3u[ݪ=LxG~FW0ݵ]Gjw $SפTGFq_|wAD8M 8;۔@mGW[#wK 2{ǶHgUPAHu0X!r4oohCK,nWGXTo! t&@8coJ,M8$b؅ZN)${U=F3@4"0gvwxX9xZ)Y0\sAH|WSk@2I{SR(=+3c."8qJd3``d'j=E<񷔂Z`T{zw4ĸ8WxԒkyGu1~DT k-н*R1l j4jc`eeMQwF:yzj]=mQXV֊Huᤐ݊ﺌ5, b+8L(I:G1d L3ǘ(1Aq޿@$t_-B(['Ś{KwR3:Q@z֝%65(׿5~_WbfB&]3,6wSKO(~PH[H+ ۷R5q4x3Ρ&DxW1L_ws'ënL >Q9j"_D}%EG~݇Kj#s $KnC}zgI9M k+ZKѥ} {碸8)/1ia'yU -!u;xe Yf`(4閹!z/<;x _1:f*\p.@xkod7C\ :LpGc X̣@&w])YԂj u6U|iIr>"oe6rnj.-$ 4*\U=Axf|no\Ydm#+KmMh%A+%Ra4LGێ"|%KB*ы`6r7WkZ/фA>-qַ.%dՠc^th/+\|mo^ z7. P4/ 18?Ng L*k*+,l[-0^堹 cbGv`W91 *ҾU< T5$\+tֺH}:IXnhހnl&^M&Q\\]BR^1˙;chV1,g8W4vO`-ܓ2V2k8ڻ~f^ ڃ]gLOzukyiGTNz Oϫ\Ur`ìMUygp7 tǤtNRn|8zU@n]ζhkLi#OQ=;-ǒ0ԎI \f4HI"~Ru4Zv܊ӷ`.r}=ƫ? qK)YJzujL+`=]T^PGpi_ur(v6<9Q;pHB>RPz(=?MnW:8ޖ:b9 jCy{qema>U%Μ5I㳞JA&tutDqMK,(\UM<C `C\@RMEgMw&*k9쯮/짃p\Msip6VqI8և ӳDB]c@? NԞG4z/1GrYAh!Cq[PcDv&YcF v[Wֱd#jK{Jt>6m}3w46+ 9nc/k99ȏ _#t:ffal͉ŧi =GJm7H>P |Džہ z&۷pJ`#*G!cD@MBauF"\kDF5/^e p71$)59*4ZWHif2DxqNJuбc"!7 5ā.xV$6򖣸B=:ڣZ"jm D;U_ԕ%C@,|q\@[|[Kv{[:Qky^Q*?ïJ]h GeYFnqü.+ӟŵݖBLזv1x$`۽bӄϑR`,{8v ][ pQf#.&ǂ;\i{i\3}~2_$#Ybuok0zzXWB|زl@(B/ 8Ub]F55]H{s G4hqpF2w\ IJC mʹLֆm ՘1b~I E]!Ñ\JJQKI*Cmie1y9&M#ޝgRF~LR8N[WE!OhUV-Nmo&N w\ಙHVbow6+y$[${'a۾w4F-wxt_L|(>&3PloKq =s+[d8o1M";ՖHHV@ѱ@$@2^Fd5An{Yq@!<-2HEc6OrPǺo䪅FOol8hP>vOhcvYh,z,}>37Tq/*?vf K5ñy.mp6O,_20qoc2#*zdGdzhInO'3X5 ;¶&"HoK7e޵tX+!@ŽN_ @$%7 iƆ6& _匀IMHvKW6a`F+MFD~C|y7c 霽٫ok$OdơhwS7qqvo)"o;T{&Wy, ߹${VUVTԐ´C"݅8x)]1JQTƤcO'voӖ9卻˜W/1c0n7LWeg\ہ@0ߵho4GW K˻Źj"fJ"ZsKCZJڼ mlL;Y]IEeRh >u##rou:~G4)eOl|Ԋ#+?*` B6 UOn?NqY-Rޝjixxc+q+n8.퇘 x5dC)d4DG_aO/N33ex0jhG)dFFM.i;HMLFw;Go>s2pꙏb{kev޹Sž'[O$p*o*i-Co=;XHTy@xۺux1*Skk _ Koos7,B&e1l @TFxjJft\SZ&7˝IRr*th#Ciy{Babu:!5v$"|^^Į/uLXi{p!ROOWynH25Nݏude~OD+-e;Pvp5 ??bBg|4^P ARB~"r2ܩ 6h-/{Շ÷^h7L֗7WHr(Tf* ltTT3QQׯk/ `{J{]Nd ݡgOi^שpj[ͼ JK9a[ƪr2)G&Sp6lJŢ T4AUaFpC磑G./hLb?hp ٷ}{C>hsW,xx]\vldA4"GM,hipCInZtZyuzrxZEY;EMi,GdGF??Kf̽P'T>u4s\nJbN6TjF$g$}+R)A1iV34Y+zG$'hK{$JNS3S4^!*kOZurpT&;5}S8/|sZH( (1Qz{湠HW3N1ّHA5 0{RO6Aqk܉ٍ:gW<6HcG;^E9QsW*r80۲LbE[⾽קҧ8v'Q_iWE~U@r.7nrHf6դ)#INkkuۡڦt5v}k:g{VI4:ԟOϩ |J8S$ XNN j%7)*ZGI̢u# kÁPaJ{wy. Kuiu[\+YChcpi-Tх=z`Ny?}In6+,,O:O3حT hd XQCKn5S/V}_ m7҃,.! /I1WNj9',%'3ҝ[:ssۚG * Vk}K:dS!o-r t^+Λ-x`p_/im6  $.r0*Q4SAM|9 _޺V4Z hpi}_wmWppKcoyWJ)<]6p~Z)Z }/MtI]rQT[ξt+r2b 08az5.RAȸͷplc`n浚w[5F/(b( u-vݧOh6421Qkq޷Q s7IlLiiʀ+W@%URԜ5q4rfdme;arWR ݓ!bҴL7Nu_IX<7ЄO6d:O5ÈS]AYA2m{{=qǹL 3}| ɂw?n@(zl>H9Nb5lfvqb[cNϷ~7;>=+^ͳ$O<Um٭BHϦsa7:JAFtCo@(T%Aw^˻xCi$֧N=*iNL]Nsc뎨ԆPdYJQO&oAɘ|jl8lYn4C,< Mh\"+G 9WmS},#G)w82IyR_ݣ]eYR&Hʉ1uFCZEj#M ːlo>,˘"Z6zض t $Ǚ$Ϸq7&QB3l@Rk=t+k£ǭ濉B CVYkAJ85Bt3NW1q_BRxXbE(ڝt&6P!O ml^^Ûc?_%լS>.s b翱eg8ͻMY<7 3tV2>"4U8@>}I<ȷÕ#g7/.n2Xݫg6Pm|ykxm܋#4PZ6MIRsSJf.P~[ 37n;)s ]c~g?ws]W'0v3XXH5 KvhRֹ`J5d+w ՚gH$ ~cf6*7ڃ\FϚ\.GvLO!3qշwU>+Y7 㱹- ybKleeF]0!9BquR@[եzCln[e2n FfkH*Z2,HBC6y6ܿ{]W9լ~Ӎ&=-!͌ydbvo%kL^1EodOuuoٲ(I4t"E<; )Eis5\1 8z{ۗn˸0<=gu ,(dem&Gk}=F"Ympv3SleT*8)Wc6\X(R.\N3Wkqf7FK/xl X1s ͪVQ0ucdig\Z4VۥkLS|jC-mKB0,QI$RjѦ$YٓǶm\#J(yURlT- W- L=¦48Ga+)F߷K<~j0K}pdǐ-TqJ I%4e(8R.Waڽ/;SM| 0~֞OpV }^Q#~PPf Ǝ& {/>~JOmN U^Si"Ө;>&v -,a{oK<3d{D*Q,ffaQ] VY$k68܇xG,p?rk 5.hP2Vn6*Թ >*>PIGG?vZ7{q upW\\^^, ۫\M,Jujvgt9wH=6 kT~6MM*q$yҧ+<8WFM,%@ز|m{eۿh>=w|U*G" .TԀFurA8qyx3vS@6mTCɉȈu鸝1J+<%\+1jIV=yz3A_!,Y[6 tMy;]%I,":zd(/bim+3C.P⥮1^\@'-G+$$1!/R8LH=q}Y2E0c3Ɗ$ :"s@s:aYXnx0$`*۱A))|"{rDT4 =ʫ+rϙ=̘k,qFSm,+lb-RI:7pk۬^rս.g%yZ+dC I Oi⻿]ZAk>.pYNnrdgG)qwI8>3ܯ9k*hحJ;hK0a͆X9yѡi6bHRfAs) Aۦq\ o$=Kk=}Xt=3w1/7 efi瑘–H2A )Zc`"l1Q\\ײ 6|jlep*қI@%X.wի E>#~𷪂wA!+r\)̢Ȉj \l|^gqn;MT i7J.nn%i]wsRzԶ6%ӈs7S>fvCkZ+"4%09țg;y&A%8^E\E.8i<8x:nl~,Z vs[S}{;2Xs+ԲMqpkI/-W6^5B?iiaBsML \T -2lnSwudEgʮ *zl<\EO1v^P `*aOpe7s;o%fux3F quvvpYNodwc5keP)Ā*.m3,.N/(3 sܮp%{(ɹˌS/ yc^;O>CErR{i 9BPZj7^Lχ#i֏aڿkOK0@jq͵"Xm`w\ -TOtZӶi0opX@d/kʜh'V;dd)]%fa~BsC 0➺Z?R3CmC_^nv;5s&c𪋽fn]3 b1p6c& Zo`kV6=>ąLo*p8D^DgVG5f.zi$Ї'R2:2 kK6|o[d/gb[W)vd66y*W04{!f>Czӭ.4AF8\3w#Fgb7&!sY8K|{H1:^I^6v#6͸B>cNּDi"m1T,sd6G.g8-bޒgc;6{]NбUwi_{]rJ5b~ZNU$\YnV'in_)EdA^ yh|uǚ rۇ ӬBZG=d=S&飉n12Mĩ<%)Gjz%+BK kJmիJs4y/BGO%0]0XښqW{R7\ߘ PJuX,XY&@e~RKܤ5V3DiO#~u4򵍯CTb`UXk[,>J8,V֊1@/YcFB %h a-:PS%҇6CaRG;Dq)t=PUkQ=(zG M?|1!I!.pH_cb *ԧQ?0cH呺gE yM2&v'&DoB!LZSoϥʉN>bl[q*&{WUZ vFWr"e٪$|X1(ăvr^s|mRU1hXd.C_b 7ȸ{qSwZ%{ 0ӢC#bm)P:9 ^d!l1yK ;l}ECr6xolvQH>t+UbGneG5ss:1vc#c (;@/~47K1>N4V}1$QRR4Kw2FFw[i/OjbCm<_uj1Ֆ[kX10Ða7fK\tJŽ|t[1@&<\#m(_A!OmbZ^YCzI1 yI82{ק_/22F}O횙L1CxqR|ZF1` 5#Ki? Ɯ!il pCƸ{8IE.chCXdV?0׋AXFֵ%q n8()$q,'eU kG/R7u 879:qk~Df+Cal@8Da2F)EYZvрW Ҳ9IJP.ڕxH͌NcX,3H㬪2F"s76즬 C|!/oeU߻8o.pIeeoyD!dbASso$unqS![_Nl:FDC$£޸Y[[ΉV4_UʓfЏL eBy<缆'T۷IWx37<6W#-_QgqI^HmP&P>^"5ُ#vv21 C]k%y/U1lywky n<,&y lk9&ǯICSu{0gJsk[vs6Ť[\=dGWQ'b3z\` h{ @ .7D›j5Rŧ1\Awn\yMg{4x|jgW  )H؃K|ApJzI3y3I%}y5xPࡍWTBȴ G~YkJfg^L& q/šB;e,G70G4q~P}Vr,Ŭֈ.@ȉȢK?T}#uA/zRyds$+Š]DAxccPSВMM*E?Uie/sVg9<ܯ -͌KE p'2&uh5 ޣ^CRxm`8'U}ŪsȥR4&$6 )EbMj O.V7 vpY r9Ń2x.[$9?ҬLu1[YuwPA6ٙя")գ} h\T-v>1NȘ-mƙ5]GҋNʭ4O [A؇LY,ZAVcO$9Ki@gMc(ҴJ'=,(#RpjY2<ѴB9 rZ@WTTds5pn|.ip w1[!w w>VDHx+k-dhF)&5+!a;|b8JIl{oPc#Q+*nͽ\P/SO}zZ:PZtqYx]zKÝ;{eR[ԛ-:b;U|Rw*HO"2M!u;$~$R olQU_,v5fA{vҪ=B?wBө_H4`ȗߚ0=񌃻Ik) \|etБON$v.8QUZOiᛈm_nkhYnʚj=GgS (\dv<ۺFPe8+n [n}Ĩp/}oa"ȥ՝v9g2ٴ%5îV̗B[鱧[TMp'!)SBj+?~\42y&v<梺mvWͮkq>7#`1nYS74NsLf.m]-wZzHƽ4uku2b8n˘]r6Z|F+m+I2X \>_^Tت?(Pkph(*O(K_ot-`~/n{[d9^<[3[c,%\UJV;MHFP'w !p?]v}"m[0sq '( N>7WvRL n𵬒8Zѩ`Hh+,V@o9j佸q.{| wN6_ ,hpdw3Ѩq@50M6\sɭE%mD[?=^=ٖ/ܻ@Y2G<2'mU-S >Ω٪b !ڋ iu7A I'7أ{^HQn;#PZ<[tdf;(-frqij.x鲸ו8ˑobnS;7|wvvb7E:(2$wW+rU*~ui4!+Y$O|@iᘒ{1{KFUmKlDFl\&Pqq!Z>}pOycno~>[& d6ֶKy/a72#1rbW\jtls54A)76zcyͼ-!x)-=iiۥ_89.w(Pf_A ct\@ҹǎe&8ˆWfHX rqq*Fe* nx&0·_ %¨WeH` V׬d-|!sW׻ ܊=C[+=#Y,} \sq5̢gU$>@FWTp5{9M8϶d&m1j˴E%@Oq5p7USևcok; m!(-#~kʨvc@(X=IC<JgEpAy馯bfo 7et*NН]Ӧ|ggQzխūTrՕxm8e[%$Gb+h]媸&5!p<>nbiDy27 ܚOPI. r CxCc vʩp=Zس:VHFǿuys vkB%-cF O7!RA)@"XUbO>SØQ/j+X?E*s9Ūl, *(;,p)DgkZD[ߨ4ѐf`6)Ja{ߞnˎaܓ& #ItduE"_&eRB Fe1>Qie.m݊(n†%-i\)+޽`q)V9%D %@|V( _#0VV-5Nri&W[s1GT#$zbkZ($H,Oim=19Z<1v:Dso46>zhgFA$ RT^>0 0q*,U $b qɭ鷆kwer֯teuw]4 q ;<]\F@7PKd e&ohB;xbb  kQOhD9~QhhoaA!R>T O Z?Q!I= ^+)n#Ӹo KI۫)IBX w k={zj%đpp# zM<{mEޑ,v߰Ȥ֖+Bq7WSPÉڏ^n{qn4@ ;)9?U[P$0z\YiYI + P/zC1. s >,!M r)I ,['t#e",k!KxI ryEo+sZǝ-;Ll+n,SD\Aka3MռVkFKf NJkߧZxB[qi=~ի{sdd$8 |Y (G IVT%TӷZ ,UpϨ|ePbR{|^Es=wmsqmnebV> Gت>3ZDTmJN~wNÕqjQn')~E c>kۉ%K #b2E$M TAڈ >:\%BB"{hao|2/#Aq "KoyIVI4`=Hdkgq]<9}E յl3o&.qBzed- Šk[ػJ('&$H ئ=$h\Je( -E(܉|~$e۸w dȴ܈|f؀m[Fv&7=a!v +?-&cH])͕8$"c$`k1<;p`FKk˜)u}f!,t $ Yw6v唕 *OkT٧[mm8(0e aMΛh2&d=6YdGo /2 TThzf EM5詋BcaT0%>X'dMPB~bdQj|I9; WC4ٔ@|e-85]J-cIV<ϊB5V16]xq0Miq,|aq*hA]:`>`1ܯD!߾z0۠ nx ة+!Qr>Sxk4p>v|XKu{Z73a_ROqTGWI9p`Y֊5uX8xoN8UMIQE3PVEs_ävWIQ9)Yi+ωAh*%E)ޣn_! i8ȺF>n(pTk!Aq)_ @@+Z3CJ@'4|ES !lz֕((yp(0۹1UZ3TY.P5 *ۅ8.#Uib]HAWW^pq@Fx^PO1vmܟw6ӊk{"%3.뮠(nh FVαCZ^4[ߪ~M28񔣜ֵAR8՘[}6z^f/"Tq>rc28,}q>s C_\̳Mg}oU JQ}V(_g+.6C O“-*&U.mn7v[ӏ>;'c-asnmDG{䰒dqX1r:x\̢MBY j.k7ml5! p`5+tikPqlϱ(leuptpG1cw{;s\g3Hn;̶[bryAeii J|dpYsJh(PwT4،~Ee!Q^ ^z#_Z[5`leiov,.d~뭤$Ktu8t[cs]Mppi| som)콺 Ť8`pc-䷞#leqvYmH+Ё@Tqv`cr\@Sˤ !ry޳)X=n:$MSGHpJZ&j<$iwPt12UqcqSoqXm@R>^=58B/dē ̄nuy1[Wp I-}=jz`\s!*žĩ6anRytg,HH #j(*VǰOvTq}wD3*4|S 䝗gP} A4 H:]Hkgj3e7\Pvp\T/_{iGS!{j*)9~;:kӧx?7ifN\oP9uNu#'Ï/5̐Is+Z8fP8A|z3(kU Koaڃ.|ʈCmE2DT"-(#Q~`=OǿGQ#O чZ! +$H@Po5$b\0*.C C<\GVi\+bHąoo#*tQFGuU>bONF NFCCg/-nj1=(`Dwe¥ɩoNŀPLJgH?T䂊7(EU߻r> \n)I] T~ݾ=QwD}¶ޏ$3( AQ bw瀲w.֦yq}Y5y8 u[vt>֑Lt; &`# _wC3MͶ,*:Srbͦ {}撙1omr)y{fG^<֜ YQRӘG#d'ә O?OPG(Q4Zo70a'WaH RSi ۰CޝX$l.. { _|(W:j;.z3A5B,fGjVI vZ6PI/离v\S-TJ9V5?FW݇ng}v^I@VҧxX%g7bXl&};ty^ o%㿬E%Ֆٙ,ng̖ͭǰ\-k R=IM. $h5*?(4mj_+r>*ier8y>Q ЂA~_uqI6KX^w FÍ5#_wR,aLVl`M{[It"ҋss#uJ߹L@ִyAƧ:/~L}?FnJT 5) ԫWT)T¦ Φ {۱ hMah᐀He5תYP??N5Y*V̫m,HM '&2$U'H=gamc2m.=H%y@ xvcQ^'ܻV7 g+$Zt"QVk~~ U-3|Fd\ٚA"T6j؆˵.q"_:BdmҊ++ |@9$YPLq?x`PeRu\t-~^ցu- !JђɅX5?@_yǟ"x=UTokMG (nֵ;q-]pZ8ՓKps7ڞֲ{mĩ3ɜOZ~=~|̞!iK|/`ҍmdRځW4@֥֔ZI^>1; dw$7^Hh.q渻~Pt\! d9AGCEhtѕ+*98A*Uc@AϮOwFhVetШޛ!9~N )Wkò%Xn>U, 7VO~rkJX@qWr]=8(@ͽgPs$#Ŧi ht/S _#>j_0>c /} J# 19kЯhEð$Kv#G4gHV/Q)>3+sTr[ucT0fC~.A|lH K=)44vk&AU~cj)҆w˂?+7[Qg M]Hs 2Z$+XBt(;v֢Wfk T[}!mp|Js7枮3>ii3@evZw -AQO+[#r r_%$JFтPK+h" "48c`M!zGot\qNZq"Mj~%[Nn⩕k3*Ȼ)`)O|] R0ZN( 瞌MSK .*UerQG{V yF-XVCJ59IKl %W-κn(\Z9[pc7!9':L{evD.Q~8G4dWo"w Yv5ܗmO:"Z27/(sK4aы˓ ]v#"G!^&/{\?B m{T9R@r|"*7&IR$*fK帇YV ѕǎPcLX Nr๨T\ - RgQ)J1 K\ y*HY$fU^P0B 6*N5w`I5h}# LxYo;!g'ǖV}uc'@Elaň1 ffJ=hpqi+ZJMH@\m|e.ibg_hP:/þ~PQT(<54,8.!F#eC WxT]EC-R;=2V#Eq$"5@5f36OI/ P`jW&CZnB,-=^|ٹeKyso`,qgjE` $GTn͜pykw 794~,T`na l \k])xs8(Y+EOJZ3jdE/mU&1380`G"I۾Vux<#L /u&BHORm9pOZB[-|oujw8^{Y K,yYCF4Fp SZds#F胰%!1[ΐhXlP,pB+Cg䳝ut#_i ç𰂄l-YݫBsqZ@wĕc=еlµ jzqHd2Ϫ9N7{bd=:|oVZtjZ3|7YI%V1_55 d_˨׷-W VUϐ_?f[)[śp%4ڜA)⃕>H]n[3cHKȻw,6$N?@IVf`#un,qK9 "[Եѕeh`RiV/[ +pc/AާtQ3 p@׻*1牿% xRct\+bΒt3S!sؚP)ߦψ9c<.<)Vݔω,=m&-#h- Ǎ_B(ڽ/kX ;F4@?>R6I-K+K-kT."yRgN>I!7潴2&ʥmp*qwbx'a,9Lv MDIbA[]E4S a,PB8!Suip/M\Gmy`nVm巋C#(T$hcNduɺi\Kjrm !sV?snws6WES.MŝF9m2 c`R&FR(ƴț4AγR-ZE1ÂT"!Īh-mk_oL#G_mC]Kq8x HڌAGaSQ -c'iZ}vHm+6ȊXgx$ȽHy2oVQڤR5ծ.2@UBiz$-V xzOFEF y r=xgckAE/`:ҔTvo꧌*XM`yP^[Z-ܱ-V#-͊TH XDt({~=)2"@sr`pH$zNlX V6\ -Qg9+w}*frZ {U44oo :AѵòEdcl-ajFFu3rW7Z^A5?"jl9ٞ:3ٮ2WDYPPuua@r) Ƕ :*c@A!)7 kI2fP3(8fg#G/{"]¢mwRʯ^H͎Il#>Wi8N@uzj(xf+E%@t.887n;; L2X#cm5evy -dfQ..u|tv7[@P/eyËkP6Y8TI5킬Wr[[Q9`#) @8EzKKOfj ", ^m6R̤ kDx̢j]/ǧm<^뀁|WRR$.% *an^1'V7谪 j;N٦p FLlp-vUj58v;'`7&#;[#rWwm{6< UFSTZEqjfsrArِ n"6^LHX! hbZsTYVQK`* dwX勩ˎbQT|hY9 \dK, ) W)c`$ׂ$i5!Q?^ pW)h2S o}ΆLl a#aT 2L}WOG9|1pNf+[y# ݜB̋g-,R=0>v2!):o kd`ҫ>XAЕ>5)~e1,1PU39E_Ne>iB<A_% wиySdyor^Mi|hdQnѼj{Jc_ٜ+Q@*=%sv4W ./n-Z8||bKY.f(mh"MM[ɪ@xw'q8(.fC{\ݖ7nlITZ) wjDc` HߤHh>cL`϶ywdy4Xݐmۑ"]}"= PiZu3j`nչ|è[e 8\fmLNrQo\{RF#tܩXcI} F>U_@Psnq\WSVY"mE#m|mjV^5Ѽ]K"tFoæmh(.1)>qF/ݭ5a&ѩN}u=p{#H4QA;j?rWcu]Jfmsl^H) I$$ju3nT saP\@9&?ͼvNe1V٭g%p;Ki5&%I:M/FIVbլ} v' nu>fg3 qRoӮpKi2",>^Xl%dW&'T pզ`քOFFozgŴj^9ճȫO4Jjbɥi^G + K<1Š/ r-sq$P*$`dj-?-(?B #P>gsX v M߳;Da**H,iA^&3 NcH/cPc*o5@ 8+TJ9"1L吽Ə-P)J9cM׉drͥXB(#=?#|Dö@nV=^r-9/"Hn>}M")) |GTm`t/+kw:A#*{n)cv2$nyVV8EʗO=6 h{yon+{]v*H+NT`F4]y*ƒFw8rKIk Ǖ@F` dGj]\Hi80RHk e EI۶#PS)n?54hZU3g'F񧳀7)` 6I e@+v=Im3;Q4#( [{_ tLf@W4JohLTA]@Tié6 Qi P]#u$ӕ㭊(jkZSCC Y;ZxѠ5q'8 XX]R) EH ,XO9ƚ׶F]`k٥2jB::iJ{ZRB}=vҼ T%Ԥ?M&68np73YXc22ko}Gen\ݳZbRDt{gbHi tnQ xT76ܘ9{/[kic[o庑m/%VI?w L;sӂck2=x~RFFrc$Y[}%eK=bIf.UU$ k9tV;~R>ǥqW9U (h޵,~ߘ7G8ˌy=vܼaw N:vV\l;TK,ɤH|ԭl`&9K\V}.aZ -OݛMsdlf46S(חqc ]M$J$Yffy1!6+S"gJ^CUT[3XI#iSX)߿Kdi-0Bb8ƶMb-cc$nRKpP,P>5f!5 TLݵPYjw*Mlc˵)Ѹ@S۔ V )CzW )k&i^GNOl֘0cA^Fo~ {O{Ou!u ۭ*\FQ:޾y+zx5}TrﱴqӳuQ\Q p@QO=Z@#*cYN4*"'w=? 84*ymu[N֟ ;>OޕOnkg?)6ce=ʆ$|8}Y Q= K(_QOEtҌ',tsGEj[8v %V,J.+0Z.W4|#)@}ʗtQXDzڮ̢Grа0 R=.i=VMm61$!1VS [PtջӇ횧`h|%BKoy[ގ#G)עqE&3p9-6's@FLq)"*#EW-DR0נv7ɔ٠"QѵH+Jd%95<. u(Yվ.}0"&4B`q9ic|+IBd񸐸R5z 䐱ңvlzYxiw@}`hHZ (GoW=t^rJ`O1YӤ3d i +LiBHdtw\XӇaS#CG Sҥc{ 'nqk~vjq%Ea$), J1E\ )MNR sTM”^ ʓ0*ځ?$ H'| aG@nP{bx#EE&ik_EO1 J+a}g-9.dQh&cH%~u4KkW/Vwt4g6 ua"̦[7 Y myauki4SXgWRtP=a0h?TEȵέQ;IJH8+@RċcZ_gK˛%%Wv3M>eSOBʥUfmZ-yR$Y A$cl w=4PM~9@I\oRm}7+J[[3<`lb\jXj$ #AvVl[ix Y.T 9Jg<92/2Qgq;ԁs&ټ-/ be&B6ó3RDuqqZ A\I~ɻ|Ʋ(|³{uRJk.M+T=lCwZC׮ˑHƹYh4p14?/vR%EEW:wn}Du_9}qAj U I50#GWܥ/iV zksyG!XY.Rު'h$r*! 榴ef?1 bh@ m’ExhU-]P(23j@(О$m*c^gy**4 2cA]<)2]AM]c׿n24vD9O pKyo !}@%v_޽x}v1BTB**:@R kBIǪN5"|^tiMLgZz.BjG{?(~>th:IAqEw (U{ju6x:뀕cHO|}M<>};|ZL; u2"E_ҵ]?nbjlKQ@=j~RT|zJ斗k7|>(FF>&W"4/'+`JQwٛn/JXL6RMVKѡ+Cw޽W7g,-* qƓKhe·oqL{%ƻɢE۱1')uOwǔ>s'?PYg$˾Dj?51ʣU;&!Nעp s\Xٟ@3rֱ&[tZ[CI*"BAҞkFU)'m;{HaO#Բ:]ܰj*~aw?V? [ڲ {Me^N63eK m/,WVsDѺVPWkkN n pc)& C}+*ҽ?y&-Ziւ|$G=ſxJ)f> `Hli(ʹ,AB[&=$KD2'v"OI{{I> qN ky8 y*@햸|ccsI&Mq5N ^l"i.H .IQ.ht pÍQCXx?ȟ0WYdSxI&䯤eR='ӆ8dQ/'^~þܱټؘ͓l\eo67V8[3gdU@c:Cfjh66e*P"U=5gz:sL2K`P rپrIroc ʭu\m9ӪJנ 0xj6w8)4z)>i[o;rZJiFS(U!FM#덧S2F9[?EoOzAu/;nF<23Yg7)̱+P *ANw<艕--^6޸n_9A.tmrcn.K|8jGlCO_˭\UT#hfd4 qB0E4QO=BGxj=kz7+Ԁ\n>aNՌlXlU5}KMF w餧[IKN2{xnh5ڔ8|*rхRhLWa@M LDVTݾq@浬xR qA§'Diw6A2SQ>ڕzBQwj٣#!?5Y({U㍓÷1c69}nm-StB9qolo3>YHֈ<>_j52whBk]m$Lc1Bhq,R-,n; nf%$x b-)a,wiḅmb*3c^gj{9#l®re%keu9k" R9t7=Kun15dfFPYZ^!Pv SmS!$`ERjZq^h6KݴLX&b#t$ђOjoǷe 9ϼX;QǰI /IsI@9f bI9VD=Jm%\ [ԖU zM_c$/1S-iDԓ֠j~W8ZViAg{܁$r T'-O5כ#ц=i;ԇMVͼzT, P(qdQ5ڏVܿޣ9']󪑰zJL-*f?I6~OGm(;zMwX٣* 0t0jWӘU6$ko)!ZӮ-rQ3'/q#o X䒟oO`5_tRO=B NFg(M QUt37 ĄZ*>bAN4tٺw9ıcEJZng/4MҀ" CYN+N\ٳl]VFv5ʠ,t i=Oo䴣MYyazp^O{REX s]U{'Hd!@z|u@rcjM{\w}I6v뜳:Tʈ Nv&d/n_KHU}CǞIT#7ASA wD.0?r܇k>dN1sI#) CBnNipk{WK|:t٘Ah *FF+,xo/(O꧑YGi! R׷#wMA  ?n]5k_+Y\.|8 )tZs?-"ZޥcCqer˾vbFE3[\$eՔuJ9;?GTd78)E|C`x+Kom@c_8=舲$qUAIy$b{S^i?'?ռOrLݙ*dƘ iOzAkAX`F *2jVukۥxȪb꛹8a+Ha=ƕPH\J6f!%Nocf'e]!ݯ#k][BMkI{;->"PZ]dP{.c}BA k#ET:mTN4_ ?l2w.vZ~򎻏xyn6}dP aXq5{hP_eyO| 5+Z֝j+4 :=̪/SFѼGPSb#s^ԯjZQ۫@ޫDU5{^mX=Z`jV20_Q7ƒƞ=kTMeyc$<`uG$WVhjU ʘ!+5 ^zQzGnujU+ ܫK_+Ol;OtZ(B^Vde6i[;cq1/&:=h(!l(Έ9^} x$ܸI%DrA ΪH%HKq (y셕w7gm#>;+w$og{q )CJD5ItE6ĀX +re%ǃ\tPYD⍝?9fURdoSJMz'O^-̖̫ ׳DIȑ9b+,.@hiZ Q8Tۈ>eRv @!N SVϫcJJ>Ags/YI?R_Ѵ%oXOZ1~5cxc>8B+, A 5V0%.,m؇P~&s2v;p_`!ܓbˑ1%τx&Y-*:M@xVsDRR-6l뿓67rsoq_d7fw wq۷l9mOTDbYɩs5"F3PUG3TDɶdlHss .%ELIǟo{bh O-Nvk5,f*梌wHSSеi#E_U3 {\{z,ٮ>K̯ [v\l߶cQcW[4~mG5;[,sq D$"3bޡtwKϪyΎ2\T3 KU^5w}VWHI$ skY 5J 3_g19|d`] XP ܤxXIm|.q?dI9'Yuc#3Fut|EK5iӨ&%ks4Qx%+b8T8czeKI). !sxY11DFΤNvg<ͷ{vY rOԹ/Pi$33EVAO'FmCdmp*¢׮ r/ֵlv4*3J`;)!#"05^"U0+XXeS2kՂjtVp* #VvCQ^IX]E)0gtnOH(W2x26X͋[:3 IG@=褎Ao?C#e8 t<{+4v>, s^˅[+7W > I޴5{ֵwm鳛yJk_;a&P<4'8@eQA>RE|:\+G")MdGym^Jµ Uݎq{vg͌NǍ*}4ԙXf @j۰R`{-B#r{M1*#BQ@QQkS߹&GV O G0(T M5cj+$=zõ\v drOi T59o:.Xc,0$wR׿^dcCO- Yg/kOa' 14ф ԱĒK G wE6 h~{F}u!fphqDRWӪcn"fူVG1 wI8_2@m=Z> i*Pۦ,3R85*!,kJS-qNqi\2F1uG ZӨP/n|PtEWb‘tS,2,ifa$I= t䱹WȤmrOAƼM*OTTf&Po.4:im`IR 9 G |ŵd`jv`1׵:uxe's4/g6)ROwjMK>=Rg.N9 +€ŊB1$P;j'~̘PsXrΚ}ncaUDmǙHK8`;{_%jZ\Yk/έ :Fc2QŸ5:Y?fYU.5 LGQG}&V I}FByKD7\bh{j'T[0%!HsNgn,¼LliB@jE:٢k8\gv kd6Jԙm.2CVi~RuߣhX(nKdl,s8< (xڮe[#%bEf 1TJrF𓛀 I, ɼXbݤEIuizGXHE11yۄpI8|.wf 笖$4v[w(KF'ɦX5&@~@bn("чﰴP@.wl[.#팻 ܴ&3J,)kQp+9{E4Zf搩,x,ı-Z)a6eLdT2^(S]HAVsь1̝ު#7-Aӈ|$R7;Sl ŖE{$sl.$D俼%^6OٸyzOPQrI]b*־PKJ!RJq^]=[2ytcmS3 ƃv:C.y }Z6n&k˔_$4R"[#}kTjBDnԪ(:nT!9;LHg pI $J3ڞwFX:NJBw^'V6>BYI  CF+??:|OȟTw *?MaqʙM]Sm43y7RѴqD.2A zm3ክU_rϨBr:ʢ .!i8Ļxe}TPo^c(O BlYX=Ƃ_͊$i_%̖en%Mu!a Ʋ ]%U,WjPOڔt47., ߄z,C!KUHnn{-CQU$^4BJ& ,x#Lw,uSB,M@k[đǴVa<ꨭ>;i-9L:wsg h][Zx<TV3pZOzwf5d{:Cqny {)5Y)RQ q4# Rܓ^BT^䠈Lvݖ-+1쯭$"^;o$\hyd'H FB@8 A떻5;8[c\W;Ǜ^Bko⹇oer!XGaF{3hת,"B40*Kͬ,1v$[\n=ڠ<15T)u o[j<u}nbjnFi0Qږyc4nZӸh\$U8 › ncSwt* @T䎴 rqlg="Qr,q8_QhLn~7ƭ"_ե \;nsz k^79..r1Vjzݎ/OVmFWE\\JJ5;ԊzLTC+ J07B `SRQau&2{yaHçV5j^纭3xq593aȵe[pg~߈dk-mr`ЂTUX } цܼ(vy( yVnGi*GƇER4)j/H UZK8MSeg]j7KNXʖ CONM x9V۫c{3;UӶ0 ڣHX?ev$h=Ͷ{MߙUM74B_ͲV~l$䃹F^tMąZ#=qЂqOO_Ut+C%<qCJ֍r ] X%(^}z~1( kS*uA]X\q[N/y74$Yb{TR;=)nn?d |/,wՎ N_ݟ F9&nR_؏M q#7HgJFɊ^*ȭ;I$¿>A/J i`^;iRֆP] l@d{'*+Z_~ZqSRI)&tcP4\DY14J` W5ѫ_Z+PĨC׫„eD=?Кgӣ HZ$_vƂh#~8W3dri- z^^FE{&!MgJՀ`:;*>(!Qmam<lvZ; c2F,2XSwcj kh$hfu"92%6B1nڮXf鷻ZǘB^s3^w19Rd\^]/23[_%btv0ÏI'g`V 3GJ`R{  sKInxo@.Rݹw&I'-B]5!BkuW,R]ZJiֶ5]>h3b!]+ fq,\HELe_o_I6G^[ǻN1<,6lFԶ;cmFۍƳM)/`fS;K/9a.h(38'W>uD" ֺ9s9@up({)>r^K nEKc"%sc_QV2Z8zR?'c}ۂv^j_4 wpqVHaF# 5l} O5+ bPE􏬡`Ah4毵? 7}ʙ\/dB t{ߺee޶;j^VHF[O VmN5ӵclYMTLzO8I{-,mRwq&lm+3~6&lܝ؋|2++ǒ-,d{+Nut@ Ԑo-F8/JmM:MNDP26ۻQP34bH7$Vd[;hVi1s7<'H+ZHP:ɫNQ-cF .bs_R['OsZ R6*1iW6|PV]^Ƀh ,z=,jbBEXx) - hrR6 c 2HgrqaqGq;0Wͭf.XL"%0LP!j^ h7L2N7>/tAY K|K=*}Od%ωkjA`?>x |`>}:KC<.vcfqP3q٘Ե(4ҴZU f"/xpZ DjTM#W~N-Y-dU KV&^1_VĪ(@PckhUC[bo-ibQ21Nϊ4=߈ ȺzKpsڧV/_ֽu{+JӃŗ+3Ơ==uQ&93ySjx(rUyMK0f`{ QTzV]pc.'[sq@RP;(/`QBb CeiIfehh[ؔ,xcE[J?5_j}XZ!"h8@2*n4` IիΡ^ 䐗ID}P_4`h O{A H dh sPKÒ&1 A¸D]>^'!XT e.ve@I$RI΢?36 yT(dzn92X8A6ফ*P*5AoH!AB# VV(XHt S\JƂF9iΛB^# ,m$I{]^81V3>|H`uI'aE 5e"7Cܘf21c%Xh$iR= =%Nɵ$2:h\$`}.(7#LR_CH@Zsh N|XۙI4WBDH$YT4P\vP"! [C΍ ws5/D\W(=dRolsZZ@2-1eE*HCd"^ݘuY-c z͢^|LF_r*nٓ{[4bs H`ib@>6zH~ܾs/q3gZgbCwYVS# Zk 4i rB ,* fR״p[ :euGO,&Cӯ [x[Jުge$oyhg omn^( aBWA}'/Ql_@ߢ_^] }6q@e7F')Q߿p(ig"1,%2eZI;s|s9oNV;N"8Ҿ%27wne^Gidbd,:zO;H߿N¤m3@C@ĎS`.(7r6M#jevxZ$Q:k/7N % Ċ=ihh-(심lh8#vtl+~./Bdm݁/pv~ջmf2F ?I}Z,:|, {.h|b2@kH!C Ƕ_ϼM:n ]lNwS[$Ť!BҿgwϹ.[!{Lv&;l5J 媽nU/q-4lSIEHŬmy9_,R1@Ze(C[Ҹz-Y&kcf^l\@JuޙkuxdhmϿ I#c\]ClеU|JLX&IUH )rk'9%v6*T[9}Y%x-5q#j7fyy jG^o1E4:]A8Pl/_M 87X 9g[{Ekic2+Vh|,~)LHI%t껞m} @*Wi'}bl ܤ폹I- vn(/rbR njs$ζ2JxH WUu $m.xIflQI.ѴBi٘h NU)쯲>3?{[Gh-|f6m10'YC0$4o/E-3!WU .)~}0{fCnCYff۴_9z)$8ɤ0S4 5T>gmp . HLxRnF [*R[$S)+>8ݮzˍgx[cok3[L<ɑ0,bc %U󬾡G94t7,b(ᄼ<< ('¥15l]7rCy\kNݨ.a٭F{3D^+SkڇPǵa@4| dþeTF%OQըU:`pP;& 9Y`V*#54ҟUkJ,iFs9@{i9ge^%F,4a '3+Rx4H+-k4`Pz&Mz-]0Z>%TUCGbA HcE:F?]qYɼ~WtbIR??J@?Qն}ITHUfF ‚1U>OSSV`Q4&1{c>S֋BhOq޼QTRѵƸK:GiLVBJ VHE24Gc +Vy/mr$Gi#a>O59t4b?^k}ýkHBgSmC2hW5ou)ПJp憎cI8?1k */Bv% ^C0վ ^|EcMJ#T_VL?omZDME,`>*;=8߈QB\h󕯭)÷N+ LJkhyE: {f$x]RPEنmhM2\A$xy sNq_R+L7bM <͡fԎyAt<UIbN)'~)N@ij52P']V1.栒kڄvOED'C:F<q Qܻm'}B$Ei=XAyŧWnhN١JGlGanZ50d+Rmi`."{hS5)U7~[M.o;|^æʪ?EBcD.- U }E{r4qmy9 selcu5JP^ OuNs4zQ(VEi:+8W)۹Af9=mee-K,QA"Ԩ.dxN+t`KJY8zt}pӗǤlqW!9I AƈbflK",,pwg<Ǜdd"Ɨ %d[y)P@qlVkq^qs\seKsBְ% hzkbZwN`XLاtjѹ*Ja):e?u\#rKS/U1dtT. XtQ@ZEsuI9)0n 6qtE%Va_{2SVV:k_V}&qǐX0xIxr9R,4,4-; S:uS$xv޺oez2 .UnL$k \xK|GYo_$7R]Wl:L' uPb+}dw ABk%kI(sԡ+o,{n! huNoCԦQYUkFӌ_=P?"5{P2%4V2 7V*ЀX ӷΔ5QHI7-^#4oGE;cvaˏ}>7F=*!) wq9av4IZT7DӪ.-Ռ Ցwڻ\s{ˤ#qRr]GҽQq:},-H![`21&;Y@Y Y7WX 45AmĜW4\J.Dj!)o$ lPj" =}b8[eсߚhk@ޅi ='T/ka0{}b0o +A$nb%ՃG :2 J≆2CR6 .` Z Qk!qCRmaqXIgIcؕҪY\ƄG2sX3</`,9:VG>B3fxkKoqbe|k{(_mqnЯM-qp 4[B25< PA R F-&\$ ,./TpZ˔;8m+goc\eeGV.&Rj'#aaG铛Âx%<!;iȤۈTSK2HyW(`LvB\-)@=Fo0-F[ǍwLdQdPm;%I8 ĻlLoݷ&ԉ{YyWTuiuC؟qoC! =ʧT<[3avlc q>lEv'󥅻b6I/YQ:Gd2 srs 6j;(2lJLS+[hMQB"{b^vtIcD&{ np`DѢh.P.[Vh l(y`Ajw뤛 ~Ȕ$CYWM*o )&Z<\+-VRS"G;F8-1[Z#]5`FntIH{zbkK@yU<T sX@u Azk#+Qfs֣\\ZDP"JeJAZ^_uz<(XO-&=OE8WkHED iSJ~~bOG^wgyvXOt%B_G,`Mh+D]X`|JH껬f}S*{uNl ;H{}Q$ɦ?1U>UcUMIdH!Ql}]Akl̾7/GfF5ٚ`xNJBSd5k#}2\N?V2b|1*b/ {ǺAMakZ q( {DXŜȑ3ȉDP ܒ-PP ǡʞQۤ>3tp߶L쐬y1\ &JPmkdx7RjLxY*%Vz01f*IA]!\vUhp+µUcΊ^uSSVv֣0< l<{JT_lrx1'zm* /c(*R='3%UY $i*Og0VkkXyo2ss'c۲:,$:i٩+c@dF߷KtF Kݍ d1]s]Ck#aqr[*E+Y4wt7h \UA=%/sl`J}T%jH%̭Czi]n;"s+{,/o#;+k,Bnqh3xF4F$iߧ+CBq0-FFR 3sy O0Ҥ}mė*. VG2}՞dq&7ݖ}U{;q!&Iq' w44M5>Bߋ/}! -oexm_fEZ$vs0l62AMM5'=HMbs!- P7'f쨱{ rl\YkMq.5ͥv9-" GVJ ,@1E,L2cccw׌!-v k2|7q,V'٭,vi$Z1FmiBCZF^ނW3ݹju/{ QB8 BcTZaoA&*6VC-IofY Rk];Fd*bXn &UZ[A xv=pf[96^ʤ,Mmþ6<2*%ݸj*QQONpOMMAdnFLz~  =dg%i<ø#+k["]ڴ:#C:RH¢HZ.@*ips~I+Z 7 0=20W7(ʛD2h,HWP PtcBt5ͻBTu w'#Zxz7%ow?uR!]c)P }WWî%tYZDa]s}"u0 ],5nl  ֪6q dMX[fv %K;&=QmZq{Z}EAd=qʷn-iS7r͜9r[>Xp}}UbҤc@?Z'F8eRb)#Cƿ11(}:-R@r4D;z*ⷯ%Gޝx:=4 ξE]rԮ~f[K6\ƷPA$U<WRWqÛ `҄~ca OYȚKfCpO}`Z ͋vȰ'| q+3A>PzYjg7XF.ll 7{hWps8/5\&r2db1R4>2x@X2ݨ_ӽV#.f@9Mi^ŒoX *qg,$O-~Q{֝srpoܩszj#c幟KGA>"UDKP(罶FJH. ͙)/kxJCE`=z;v@Ń2]0jCJ7׋\W5̐j-|yl)nX(}q6 IV4~4y`6FZhFJ_(1WLw,*Ҵx/OndLTF1rB o',)C-Œod OFE#$VMlYDKsJF{Zfʮԅ'/eR:Yִ)9d=+n+rxByBl<Ģ(&y5=APo?6g;߯5P=>J`O%j-򰦵(}[ǓbAl4 S,[V"{qlŲ5 \. '"\ڵA=H$s#{25 7 ZMJFY\Ǽ (n=ܤACP \ t)!էx.dL-r,ՑBX1ZRj5-U續#sb<<$9 qdqF)--l, 젂gLfedcF`ϯ+^I Gfh Szi%8iqCnhbCenm&Ɨ=nG!]^\tƟ.Vlhnc2P@T!*yhs9 k-`q[ILE֞;%壓.]ۧ-I4fTƯC֗Ql9B8`xTP˝3Xڥk%6mki"ִz^lP ҖYTR"`.sbWg+&mapm 1u? ž:KnU|+a} 6P HDXfx!_ z.ɾll s@8 g?-8s 瞽:uMìL(BX'Iv"Dᇪ|#q,`,\=4_ջ(HoN< D6{o )*cD׍ժ)d2jƧ=;o(GeT5sM09˞\ISSo#$0$H51TWC1*Z޽MhQ"p5XZWa5| ύl˛{57ٶr{ՃjE&8Z #Gn]?G&B%.qw42ֶƞ1O:u[f$ sRf8rbrӏgV ,zK`щ60:Ktj##LmM`+ZhUĀCSr*JycXN7C˶uJJ4+HpAxיfhLQ3ǎAy 2?xEou3Xi%{h8p+3UBJT)SPzz~Se9${XFbhL,пb+X HzHєX`PB)R1OuDQ(C:=L] 'TpUf!oXz-w&E*4 9>`E+ۨx./4[p#(>bF~Z|zv`APޔP5_,'?dBڙKqnuV^4B wғd?J";QP sQ@@|}y67ik[:]![?P=އ)ݾ${{ʢ)Pw&c,yvtYAy$+{1jzih|o d11S+*F:k^c$ _ V$]/ˤַK 91l묄S$Աr)^Y_D{E!ݍI?w6'2P0R3vG3noEI]el5j{ DQO:B5xl ůDH >T7`(a̟@ -꣹0ע˓_Dڑ:I̡)Q:5|g Zӯr\zMp6)*CaP{Vى@VZmNfyT)E^КϨç}ч1;mٮ~ŧnzi'ٜH[#H|A4&RW]SvawnKߺZنo]kÚ'^ `3=U}v$ $KGCg,r}H[oJ~ qם4j9>L,-$c5Z\{ʣǁƜͳk)Mo֠Q݂I!)- IWn6 vTLJ:ߦ,XsJ\\Y{{?ON9;ˇy?җ;o}ۙle2yȪH5v x=^xu:ScdcP)@֛% Upc JH2[Rp("Aiw*|?\Qf *n"ܻR ҪƆy+}A]q3۔[}7c\s9N+~kZI9%kĢ}g_mܴv, UO!Ƥ* Kn-zx4VﯮQm 8Wh,Bl` E c-K{8-&ֶutnR&&Mm(#n=7n3AR?܌=Z;Mۀ^?FiE wyfĒ Tiө~sKvVr@RKi)ltx!C8ا%ƛ"˅D|ΔOOC|/jՍ>~?!,Z֓G6>W2Xdޝu)3dR7?Tl )w)5JTcVlncExr g8 ۾RpYPڻ5WWͫ=:qK#@{qZ&@>v%P* R>=k׮TJsDh+_^j8p(ewAޠZx\lPZ/r:h%5Wf * vTڟ>bdo*Q&4F(!{D*h_' >/@Iwy/,-x򛩭^;3"Hv#PZ Ʈn`̄Q?yŒa —}_-sP]LxZ~ih $M0m$"fX跎["qLߵHJ4Q:;7!y8#7CT3r9~B=L =pP5伕4=[ocHҧdiS~4gQ"<gS-rvQəA ׷~v\ep(UURO` Oo˦N^KmjC#keR.B%kOV4?ˤzK9r\Z8e#+z{k"+D9@)ڽa 4ws rE{y+QZ ̭Pz]][!(q,ձwPL.\,w|OҞ!;G+8w5P.Pja0׷}i֝Vdj{ qqRyX)̲he5Ujk@*ډAaEpcG4418N~nm%߆G)sBb`X] s:Ցd* +H-i!r/.tdys"\%z*T@3{=VEghc?PV{于Γk{K%Eײٴa4ĵBU*Hbo &PTƥ D5'V,&pSљkX'Uyt\tHQ ȓĬBAV 3KprSoԑ~,T%.= V)'{m½I$uӕ<$ucAEUҠ*P^vp9*lku`yb7yUO2xݦ_ƣ>x:oW4߭7 ZYj ĎA,NRDbƽfiX̢8"1pʹJ~.%]:) E"5vF%XJe^|tV`H]ceQBঃ 5;xtiZMҸ;+ S!u![!mzji @u%Muc4sF25[rT =:g790vp "\?R2uQČXwdp ql"62vH##Chi$k.WqfG^w0:-QBUv )>t4)HƜ`@>7R^jLb*x`LJGX[lTv447w.ӷlNG'9E4^ J]/N'-+csj $v:C Y*SR=(Qu tzsPyɏ]/ai֗ 1#Z|n7. BJ\$VSJF3nJ78KA>9>xǕ㈧Xs͕2fNYI4W>f-Y7m)(-p[EuhaƊX\bƽW3#jm|P7ڮ8yk*YAMzV@*tȱK! w(֣qn"pST%۰*j~՛{z5ʞg*gKSTshW!+O>V OiiOG_BWo~5Z4ZsG*(@뫜\tJivwjKkǡsӍic1f|{$`R?0{_? f/5+`L4v;&sf)K؃I!Pv$ԲCN L04scF&:M P;wA>Єʣi PRx{1G-b{'^,}qx3&bLEnbS*w"JT ڀ{u_4k}3%:7֍2 $8U +}m}A]T(Ɣ[&??j0Jc @47'V7aM'F9Y5K QǴF$%*˳iGT_ۅ%Ъ[흩VZbk($z!񂽦]ͷO'vke8 aȕ$/: D,?iߍxl-{ Z77O!h6D$rNV=}5ͽՎJn.bxx$R#b%I"s_\-ukagƅ0A!9 Gq6{ikkhLo[bLeN` I%ZHOo o-J#Z67N/1ࢹk%\f_"xXM.oN}Nvf(}[ze݅D6-#gd'7[*n?{}Y0j;Ӧck+ 0Xv(E,5jY@Z $WZؕspYDyH<<E/6SYf^۷Ll{smݹ&RGx11gv21slo# QnI6xOxh7qkIL -MN+Սf0piqTMMdnK2vLm+G?Xs͗:fRoǬf_;F"~Jb]@stE#VkW8_; {S)vy omq\7ܶ]H^0k^-rn$s",Z.HIZ~â6}S17=_3Oy`HCC\VUxwӹY*~M(\s 4 jeksj#yP1x r8Ni|QejƲK b&^xnPg,0>U\O"Tύ?E\$Q^n뉁dӽ.CY.#p#)m, \#KmAI\.1A{1@׻( Gb&[:@Sm䠁(/R}v==|ھ=bV7潿fKNR\:u;w=Ҥ4ޠ[ΟjH8ǫ^;NhpkG 9LavPYAyݢ]"ƾ>p#bB1x?/qAGV︪dAɼ7zv۸uVO|P*NDŽĎ\aT<%Ļ"b=li.[zq|~H߃K2Ṛ̑J֕zI8 Z&Hr8(PG}WX[qok4%IfQֲiTvQy44k*!\ BƑ ?id204{ztmHfx|oyCor{wmvS18|W7<HHv712|ȤA:TQҶ)ص+ҽϓP9L,.Ucv{ocj(G [|E Z2jN/9aF ɭtLo8 c1lUKMm?ӻo/c%Oq,R5ZtP0?jq)U7fdwel62^p7壽{KW֗{fwZ؁@VvV@FsMܘ=;x]S(- wW˓\mqx, ֖6_\|v([%0Hc!PTzqc̭\p T^䌸$]l&|8K!.(j0gF#wja.B7]4qMiFh 3Fva૖ॅLJ@e&4hfM{;ɛZ/M5X_isC '1\XufRga~"gsn)a6Ʋ+Ƿ~;4Lh?֥͘w~PHT8@ -J=$:c&@UL𗒎K{Б^:֚  N ߟFh(ң\l&[86Bq!,H&Qݵ[KܝG(*];UE KX 4x`Ic>1'ͬ[8QZ6n'5}uSlڵ[ uZV8'XbqXcztB )4s&B\),ѸU_rY@N4]LkqL'mFo)ݼ9T,A@PGcح( ׫ar'D'kLmh`7( Ae@!IӢcvR s\k!3 ŽEI;yhAq+1OK3'uP濍: !xq/p. Wz.r HH0rN~ʌܺW3$4 Q1 8¯6ƅ[*9}% c~ͨ-DkblcQbX9@ؙzL`WԒU MDh{3e6ðҫraW;sg[I~ w>aDm,29i-\E1M z8+4@{pX?^~~,kk >|uK`hSø܍KyYB VW\Sxէ=nIGlǸGG&&q<.Ty-#e#iYrz8S" vyڡ"1PtFE3{X|("B5PBM+'knN^=8onͳetZޢ,@/QL+.w>y]  v %~2tjm"\gz-Obw3u9V^rE0q;,i%_n|Bˬg!j;1IƬhM"kx帶/MNZIGdecZb]!$B^sQ D[X{8QQ2ڝ nY4 jJc rHkw pCzb{Ǣt7н҈}f *vZʼ?/cG4f%|O^jV1'n#/fhXKADTnNS:iK7yKT^`sWR :-4Pu?vYޓ#sk%Z<\T\^l)u4iݤM*OGJPAt~Ѻ3#xآaZnNJA4_w%kNuP*C%?kOOIi-_ݕcUMN ,sK) Y [TXC._d(-&FP럦w؞n]qKPNI?쀧[B{?ˣ-v⭏޼vB1gc˛+[/!a{t?A֌4ڽ'4](hTT[74SadH#k 54EϬdSVcK.dG"h%٧bGmdLfd,izXZ$RNWJY4q~n8 ZPFL)]`w[bhkZ޻7[! lr/X±I5s<>b).kqѢrI_OJ%' ٙ)06^oogYZ2?/+ `1(nPztwjdA{D K7E|4؞t'5q8Ӈǜiap4q8}㌂Ǒ\qEF3ozFc ZuVct!W̔7a\{z)-9Sҥ;iS͞ [ɞHleHۼEBURC5I-k{WzAA 8`S<)\D\UWLj}k!^k3\k1sʗ6ȩwF8r &֪SH?0uh6'Ag9-;FHSJny'[n#QI#f2FJ#Q@룐$juU1yzY;k*LMۀB&X>'8>G .5<(I֣uIFD(v< `}·op;<~lxEi5E//8 w[<:B PSaU: O=O$ 5s66G9KJPp1;^[rlLܮf-188?ts#䭲q#ȮbaolC(~GdӱqG?3ؙÂ/~k<гʐ-R= @Q&ճi;Is^26'@^50AIJ{\f+ d N;KFTxMoÕ vh򋑏[t#%JTkJ ]Ɠ/N Dph?$.$x昃l|]$7h$Kjn$'J(PHL[©Q語yZ p5*>qy1nHٖu~y@?H9 f[p2-y84+kݍZWH4 ͣ-=Vg?IG#IK_ d%H }?.iiZ9Rw0` (P|Y~Q^>\T~FA=*=&pNUq|g6gp4lV9/#2.C)S_˦*36t3 .^TGm&Hj@R3bY@½w!9+$:ݥjp |zݔ^[`3O|D =зу߂(O6L0n1N6 fb] #קVKn-1C|q&c&"J~^Q]%ULTdb)߱${**ɚ1rP^mⷊa8cFUHªbKPw$ߢhQ5 8Y TnA?aؖvbL`c#O{+]ABb$V{ NJ2\Ni4<2;&UF/QumkD}uK+[oWLfBMC(&P*>IT SZW}Q40E ;koNW%]`Jw jjZ 굙 +­CUy.|XӍZm} &{RZZ:.kOC]D)׉ ϮA4 HM]bfaWX]WQ`A B,P'۲Sk1 pt,UMfk4DӺ#K) 5 ^i$!eVtY3غLj i%.fhg~w R.֯lwƢR sBeN}{lw(\T9Ox+{kM\6 de126ᎲHA_<̅,xkMqG[h ;Q?.3 tP=[\V4>/vƹrV[Z%XԚX,taJv=vl񸛗cqvYؖ{nsǒH#!eM'I#F=o_CԻ?N<4&.4A!p*{{gxQf#6$.24oC6^=ٺj}jXΎҁw\ >WwJ<}qnѕkh[‰ZґHC]RDť|8rp-~L+HG!pq %K~MS'"Hէ4 {}tweh->6\uS&E(RA:K:o"uY.Ga{  v[W<NN^*ME7 "8ɣ8(+sٛfrS{~8q}) zR L1cׅr\H[B}pƊbe&*7ˢm k3 lg?Ρe-'ĭN +gƒybJn. $LiXP@nTk. G NDzkQhEG!}s3 Vعf!VW|ײg"%E NϦC\׬ѐ6VϙW6V,\]cv-4&!ӂC\G锌T瘝;sۘdadKB- e{vXi[&N,m%Dktl;H𵹂Z6 ê tR%~FfWQqo*Zwmh{0}]mr@5L&Eob$f4TaXͷevkQE0'a CWߠ3&հ8΍a m Sc[%u7vg?/ ar&L?sdDEbLPt̡Xl;q7  m|+>I E:(7=Tg{y1yn6SpT9V+IZ]k9YqW3Ii%+sqw?MԢkItiq1 )XXX KQAn+`A"h̺4wK-4,eP_RcNVaRU)<ɘe"flP=`c..X>f'8C^I\iZI:M#̀DnIJ +!AP#;F|eIN੐ezNh{)80hDzc:.ǹ\@pY؉vy㏡(/F@+ƣӿC(!xHɊ _HT?`'Hz^REtq=}ʫF@5n潩Iea'{M0jtS>UABrϘQL79,KY*},6P):C vEPr {^Uee73/G^) }-r7גM-ݗ;ƾHv[Mk9n.RB-Dj[*0܇+A76U.J3v-6͍-&Wy!Y)0v4PT^q4N=i!902iP\Eb@zw,T^.!Ӌ.je$ AT|59C[ }o*(„tArH?sCWэ'r[\eXmQm0dqȣTHj+OP`w ۦpjsWjWbycq.+ cnH @Z~D͛ÕxcR:fGF#ARVGwzfO5ҡ;Eۻ|#aee%mV6YZ@1~f K$VBG;i+Xby,1" ;iTZN÷W ,T9ʸ=)=!yG[d _ϢG'>8jք d6l]k|ԭujb60ppڝJ5rp834ԏObk:#ZfQ͸{7'bXElo/%9a{Jn~H Qܰ2ڈj}ޜ{)&D\JTy_LL8,[#x,1v1Gkf\γ,+oBDjN{ .yWNvK#8I6QI d3twW1ZkQRw aBs]>v =[41 S q8+nn_m_wYw3wEGϞ{SwG7}|6wuė9CV9&1褖IdG51և.Êu鶾۷y56y22W4s\X Ľ×6{e8_&#r0۞oinl ĭ G[K:O= b4s%ܨm[omV]6帍j6O/Q&əLq^*8rn53MB 6Ĺoͳf֏V9,p bT uݟP6%9j̧0ĂQUkk֝/ֺݷjsy`kewPK龩 şMYEUm$UY˞\Pqqr"ֱhPPЅ-(~6eݍee F+f'{@JrPPۇx%cx\v(lNJ/y\87mYF#`* `H+ ~UhzlpzĶ{*vtPamwF"/`;|jtZ t. 2vj;~i"d2jTmM{@%Rz*BήT5Rk j KR"PI8%r ;e*iHN1D+S+Xd$k46\@*$nߴ13j^V8QLvWwm6Lvp@'\ֽJu AO-! WS2VZ_Jí9p5&)G06>xcP Gsa8fi'ʙ{p:hh_>X\g/`e@=c,ƤUֵ>  f=ײgA$[JZ|h*?0#0 \v%@ %{~~In(c8$sŔ‡JVO[U+B OďˣX7leE J{yQ.%7 hHZ?m" ڿw:8`R=@r*04T* F Axz3~ (_kxZorha@ @ Ge n8{I =GWI*|o#!&zr*`ocF>pLî( Kk: Nhu4SeZ>#Th[0s^I 9srJի_w>"T`/]K4 AG0P_^7(P}R @na NTZpEսtVD铴z<@WNC^9qN:47x!2V2i1?4鴚I1O&VߕyA 픾Hh3٪(YJOq.=$<'U9U4pqEU4&Mo.k,H|Dt^6؏NkJ"X c\KA)Y,oBIeeH,|]@P\6:{L<,e`Ex7N DJ${;`\3*',d2 Ɩ[1( qn_Ib*zX.mx(A^Y%X;Oz?ҽ{<{Ǖ i)K\R!q\Z@ԨRIEi_ O$ri4\RpRoe@p EAeoT݋Fhm|O"#iV{pHdpk~E9{EZ5_^E}q7M4ޤYmѨTzUqqƛOc"0*!:Dyҫo%V,T^Zfx/2\}1SNY^.D@ !3sP{"jHT/@Ɔi\(iìk؄v_o{J k(~S)u%Т-EQO1zH5$i(i QE ֘dݞe(OAɰOx(塀,w18qZk YS,.+̽CHS 1P t0|гS$lU'Ս;eFU#itsRș `*IRcx[j轈{^r:Ɩ g+٬StMwyv'a0{H/c],vE:mDK9ִo?AjcWNv]HNX)!Ic@#(s-c}~x-rn!+K%3-u8,׺퍐ty3U+Zެ㨓34K^D 6dFëvVT<ǥUP.”nwN?r~7fCi}mk LNm֙ܪ4M hA鶟:͚j5fFF@B\/.(/6ґtN#2i$x Hj58S__jjzǸ\VuxR ۴VP3V(ֆ3-22[NJEi:]v `s|MC -E·c6ɻ۫N@2^ JDžM{m3| ybochZM:d3P^hY&\ElOf" ڵ vaoMC$в'F|̒LTx@RZ hOj{Ǿ97kdo3k}ۢyZYHY2Y6=RͻkZ X ' @{KE{`wALÞdDeW3L8|#;͓{owkY9q{ČEJP~JCDZ$#+\^ثEh4ҝ9~YZZ @}Ycn,^y)3Ogu* S=XK=_w=+[fǥ״6T Lf! TW?(}7伦s`fqhnl~fӐdh13L8`2jӨ^%l[Hq~b ~ݻͦkRYasXfh -kN6o=/&=\5l;ۥdQufNc0YSrOƩۣSZz k꼩Zf pj qv.3omJA#l?'[c[)9+KqB6)޷D![ s42djQHOP%./o?6 ~\t72gn- F75_)oׯmcOe|șfڸn:lܻ̎d%}5cR'[[h.Y- :@Y@!W(\) 11Lʨ0K; 0-5$S/.x\[K$fR=k@aG M56$ǂ_qٻMLO| up3^KkӬ$Nϥ=[qT D& #N贻2aX^?3{C7ђ(ҋ] B+2V"8CApխdy}s‹HFYc*k܂>_JC\9^a.I- 粁do--q-u|HP TӺw`7C#F\H?Dqu۶*cEk{ kn"a xS;~wOYeYS{ɬw95s3kKO9 {/ci46FhcAM(!̠ӹv[.Ƿ#J ~\MFe#8q{J5bT Q6i{\@)?pӧzF9GkvePVSBI?CPiՐ19`/z}CCPv{E.J%UR++fcpJ*=5&m+'p5?:}O@Fz - dzRK4P}4Lnr sl1 逸@X9=z_RGo*ӲyšTA^m}xRZ4ƻ4&/;nRi tyMT85P*|Vm;ͷ/E+L!zrd>iv_]R$2}2,8IƐH#U.t,r*j#a>PRIP07עԙGP)5 _}O@r~K5W#p00|!iHǔCG"=HӨzP(GM$ 1lhczI<-S(Eȷ6P;@aN i8YkZWHΛXTee]UFW\ǙJ! Z88%M{X[dP!ZNX|+9sĹSƊ7H'ln:3Fˁ:h%Ze9S~`kB+NKcBe[좡p*>zݪ<~=@g kF1FMP+ϒR?O׼Ҟף [OyyQfz|'z~e?]Ȁ(|Zd+-*W2ׄD<QAfĺj/ʝ^c\u_ q)p;k$Aym5̑4TEMs@ĉ @%k5:ytFb+H⊀Jv6=wykª ^.T}N-Jc~=Ƶg! NF#`]6rY\^QPzF=TZF_&ҷg3`rr BJ9ګE%ؓw|z~h욨GԢx;.obMuROS?76.Vߪsk=}jPo7ĂxWxita\9Ej?3 >nmU  = 58($5g5|(@j҅De[ƿľhctr>Z7Hp%։۟am9{kVaJiqrͽ@"c-D׶?֗;k%Bqpa%$ңOSO:}3bxȬBdy Ѿ @z ~R\)ˉ9}#N`|8FĹ<6pVWkS $'Cͤv#Z8\P T_}$X|P|m ݅FYԥYET{ZX 6ںiƝ109OT31Wd9{v{iaHΦ.-ST嵣1_˩}+HAoƠw&r.XNZ/_lrxEG[7̛7uȲ<@ڪ4ZuB?kC{6);gN0G!"9rw[(aT4Ҙle&TW\Hj~kZ9 U2N-r(kiKwK4HdI#i i(4*(Y=z4C'RǼSK%kEI{Eo.J$#C%n1w&Hdǭ:W\* 1%##^g҈EǢ0FZsu*3%Zbl%Q0s.ls&2 4ٙ&oRZ6@QJdNrB@Rmcu#Qt[ao=:۩pKzwBEu,0uR[66'_ ExY N8vҹdc2d ܹH *щVK"ݭ&:->-bMww%L>b4VzV ;4V86$bx/m#,Nα*/+zk!16A!dDESGaՍ}:pֵ7m˔68b;Z{Xo94wWFx","k A*-KjyQ1zQhV8(1]o bb;(ܦڇxNK;.dX#2`iu,r3 d?M3opURP4>E%u=Ոܿ_{qs[cK,,l9>9+s3)K+{ ET{-BLD ^z~b y5i*Sz?6LC=ڤ6 ( C=rը$O?;A)xW_A:Є'ݵ?U#+s7UpcՔF$ƪVHSPfiњ-hq m噼9ct)} RP݈zqnl8<$@2 H>;9©p4릝Ԑ;ҽpmk];kwQ;VT ^$"8(1a@Z%G GGpQ3PQwR?Qh 뤏ArN[Q1v] EDv^H:iEkZ[mg蚷}|^Vm slN\ A4;г,8j7{ƉEҟvIk55E+hRjnbb>;E Zw @5M;t8xQD?A<,M2pm&8*QdcAF`@Q ˱O -W6eG14% j)аev鉍*t:%`qÝv4{g&йY> RAo"?^O|4Hw h{%ۥym,pA%ĒJHShPbAw{=s p? %^k6DpK+F!C)uUHb) al-ΓLsp*),<*c2ƝzO,D蟷iKr,@7XI#m DĀI$oSWsuZ˜[]+qKߍynbZᘣ!7վh@oNcsFg[`*5/* Azr8Xhl/#,N Ŵm^WGJ7`;ףF|`e% boÝAg\-2q[e7,Wpb_ ԓ%zt$#('l=ԓd_8S.9۹ejd4H qRkYdeoX1ꞄPN5 8-1#38;P i]@Q),"_- Y~֕;*=jŘp98wpq3|&5T[̿Kϐ2uGb$)Z*lB:\.#rϖwcaq[nnm!kvmlZЕfStK3*a~4[޷r؜Z9p P q6=-Ih.$kTBTU޽8C= V1&@e({Զ!Y%굲LȲDIKj21Or M&9)O |_n|)[#[/Ex[C'Խb m 1HG%*Xԓ: 4BP<*_LZ[[+lBWo'XO naˮ/8Y[Mh8k{enfR t*=5pvFB X(@ɖVJKCLV8с8cRx26hźϐdbP۷Te41;+HvV"_E+̘(y ss9ĹT( HE)aj0[Oǵ6y>,an,o{0PP` Xus>YcLIq+rs[v 'ɔ;!sPSԇ h^S,3M<3Y XӽO~ز9 !'qUw -Mp$š~R0"\uN%>%Ao:/Lt{[ n}̿PE6ǹ":K9 UT.I3Ms&Bk{\g5dZ|EXFljgq~\IRI$ރص2?.bOGdwÒɽLš\OP6@>ç0k& >@V!~NFWY^NZvK!=,~O`NZA#k*()z|Y0:Sa kHmEBЕJ|i" 3B (We 4B( nϯو!\TPrY~jZ|n=.i$k)rw:ZAH(f~`¬K3igz;)2nQ2&dhC ֕'OVn֥7DKM2V6VHFO%U Z K;*5mgƔI&I*=5wAM]B ?ǡNCOXzhj0\WѢ֣Iz[Oj!qRڡEu6 oNËfH@X=I/pką,7$-n'k=TZ%rp,kMnh7zP'ao‡ݭ+8k#F*{H Ѧg nHIC򎙙P (>(o י*]/E/9fv@C{쎐3Czr; HA(%9EpH&fvQ=i_hE:H$cʕ,c^I&ǗuҬWJ$UB8JbB}u_1>T $1Y3)g` ã|ԭPBLkT hEE [ c] 1ZرRƆWjrXpG.C15KSFUP@6t/Fv=)P؈?0Ooy^Z=m%*mlIҍJ QCNʀNxQ[6B(ZA)ll*`2wͮ;0f+M$R]\4)/iUu` 1REJuO4^IʢG%.G|0ڵ֑_+q<0.^00-߹=-3Z qdj4' D QͻZO5xB1LѵĞGt:Uc#zNKxSmtzGo.ܞJMw q)#Y*VIjtF dqT>i%v.}*SvsR,*JZJA[rk]~jtݍ  -=8;;R/󶁂Ĝʈ!ҹyǭz˽ꠐ< sZޞPoidv"UcrH|53#-8s,VON^ڙ?%FAҚM4ܴ$x2.g#ͼqʮ| tIP@>u f;|y/V}&L>V?L#6F {)ʲ/:{/Pt=Jk$H=MkJO:˜D1@jzw( I'(ܾݿ48 _{姺>lVCԞ_Ia%c`ߪn~ӷg|ԠT"Pd5;+x(w2ç)$s~<^j6K9J;Ӂ{Ras`pO49H(s|~5pYD$n$.fȖbHK$!:f59 *Jbo4x% sŻǢ}FkYSrd*kl,nAP }(젍@qc*_553goq(!^4p^Je#BP|Q9`~*A蜻';-C9~!n҂$fD2}&E|piO[2$j ^HmgcP!˕)÷696ńd{OPִ ^~34$j D*'zn-6mKD$dBSdCo]yѻ֊e1LmњMnnGC4E( AA|1:\]wx-Cz+`HDC\=ǽi 8:C=Ƣ2=tR!p!MwU'm-I`qk2f˅a1}vњ.ne*`NPI;N% ?ݩ߂߬kݙm=h-.ati }+iy4r \kv e<5qU3bqǝ zkpRr D$cueM#A[E e|3Z: W8)acAA))__@QkMDIຝ~q(4,>G!8ui10ྒྷל-ǟH7Z.BصGMXdYZ}]#R1 RG>Uл"zKj(  ͍哃OY0I ٚJPG6 0U(m]Z$zPv#Fϐ(<6yVvx\RCkr3N]+q c^fb]& 8TB$?UcymmXv.g{"7pPs'W16ώmmM,D VN ;Y =#1bC td؂OXNS*(}\"1U#m->(I鲳 KK;xaZ@Bnc`S(.OI駔a-bW1d]/ -]1Q)_DV@MxQܡKQqN9 z|HNQ@?O'mFsyO+Zr9ۀiBһVv)BV$,̺ @I&ȫ`5Ө9Ir r[-"zr~#ˈ!s‰iU#*pCi ߼Q-.N=H\ky. B yQas9]&+ Iև[[G駬 F}E~`$wZϤEmCv6rKC f9 r*H?2XΐGM=:d(~_{Gם ,s,Y{s$a!bȊ GI+75E*ThZ \vw^+{{}Z.fTY-$F$Q^n1!.@;qYdT$ՐF3;Pj{C=4hBh,`%"y(V_"?ªj:y P ={sD/}{/$ 4D2ՌeӰRl霑-‘*ڜq[c%і`E?Ij=M{OE4xݴ\CXVLv'#/ln8vNN/O*q%B7eS==W Zs5wf]VU#1ARܥBwмbqn"i[%U(|SP@S^{ɸWÕ<Rv-L罢f(vȑU=G呀 m$e 6{:EI| 0H#7vRV`tNqn#寗g×`f0彆0 'bd Z}I:)v"S\8/F '[)_-Oo:?.lR^9^%}Y |_G$!۰,#$T;i% Jn9t=1"F(46E8P?ϵ[C,k ).8HS)-۷;ӗ&ֽ~~ *Mh>h9Α cW ,q5Gw/Ce3$qrV̼hUO'@4Ҁ ul|f5[~iofˈ=i9nI-yB\Mрh$ۏ'MjаQZ馧fY.ե+n2qV/~wOmobm-_.[rM1yGmkKM6XM+9K {O󇾖y!UHb#qS8򪸻 o^~=qA2VGQ0UwNlhJ -KyTɽOldQ w48"?ί) }Jo^\>}![q:|]_]^Mss%,in:WP<5ie.qLRnP]"81ָ-"Z[bhu5~' ,qEKu&7WcGMp%Ңd{o륵v9mQ#. -5'Gvɢ&#UM+fv _+?_C :qt7|¾0H+(\^ôTΞ5K? yquWN5zo(F KZҪGr1">=tq┴nvt!c *g<-smH$lb+*1+@P|TX뀁2Gep.)t>;HKvƾ!=ll;͎h g7M l&Dxad5ROs<>ұDg3DsQu4;D$cz% 4mBś'P~4MV:0 |%;6p0Rִit`c8.5!M.VE$V1g:# ceo\0RhX)u<7A Tc)8+Y3@PV}#ق_TĽˁZ:Z%cVѼ|^EvULG#}p$k*B | ;&mfOTG)uehjZKƊh\ր]cRcEv`פt4F2~q}'7+}_ [djAH2`puxKpNkz4k7O@_e89HcI[}>7{Y`YELbva/B>`콭hu*!H꫄-V.'VbЍi |mѸ"I7< 6x|iTj\I4ڿ" DٙHֵ`r-{h72'ZZ9ZAf[&oзоfE El]%pl[X<0Hn_98<"s[.2m"G&~Np;kMNǦJmckw8;{4Tj"ҠjsieTvmNLk-4y tgws|=?#GzֵpSYD1VƜ} ma,FC7s}p[5g=,D`27QuUPH<ǦӿS9a8Z $s6],ꙤY^ְ uɟq$ v!u2I%8커#G*᜹/޵7P]GԾp'˂DX{kDS3NqY-貨8U}[b]銶[tȉr}pȽCj!kJ q_v0p6 Hka}jvPѫ|- 5]Ik傓y !ֶءf  sNr3hb3XOomL sMT}9]u`SIyQEqd<᪡̪pBT-5!hdL1HZE* oqK#v.0[wõq693q馞KԹ5,L„!-\){nĕm-uck #1+?hp ූr+[jPy}Ht!}]쑑zY}<<'x {mgw.'mi6k;]MHIaBWЂGJ@fGEBn{,iI5Ps7dn9I_v^m}ac ߽{ &*[X_U & ,lm 4v)\-b#I &)mؕZsePXX&l pN!7f6Eo IK?PΠXTSuZTyy)z菤erʼncuc{PR;~EfR*7/[o/ہR[SP?;y]3{ 4Ȭ)S/ҕ=ѣjT{RL x)ބ2]:5QIt&G Tf%UE0@rt@ ]}$ƋqI,fY 3$B(;~=ŊbX(T p aۍ6 ۯmVX6'Ύ[Ӗ8MΛZ֓տ\ 8p]RT1|K,=;JXߺdX@71;V1bDww|͜Amm/wj"60I^zM҆5B1'Y0$0Qp10 q _,@ZT;t{9 k0&2i4\^A;"#eR4-@^+eJ!4"[elR_,VfUNKv?Nf9>#;иp}n.tXS/'э+J~}x7E 8Eؼixia yi>@dՒ:іX<4zF[l\REI&]QXEpgiż?R] xf[\]؟(ɢHdWVBjIiҵʢpH! '>|;(і#Z9a {Utf7׸-ޙK_ǧN9$5Ϳf"=G8y)BGXWᚲ=L?` ]LVIy+݌2 >ò~'PʏPF y}[^T boNoǿתݶLMϥ=1Irh@0RZ<-eMahNC.[IV}>sPN#i;H1<[2Kru(Xw`){WslԬꓼLP^cYH&= w)ֺ\Zɟ1j5;vnlMÕj1ݼwX +#hP}k5@zm3L|sKH7cS8 UZB8b Ltdzo%RIbJXI@?~m? γPO\gqOK6#˼]#B,_IH(?RB?(P ٮGo S3+Uv/3ݤ%?݊7s'?4_pϸܛ rṺo0യy60ݨY'7efCil27jTY$yX:*y/p2J/zSTAtc4i?}Rj r{pYOx/ctK*PXLfX' i)1xG#M+SRL· 8Lݬ_}$αiA_yH+i,NOx< Ҫ*>Q[b4^t6 '`{ETGkRp˾K{S=E!L-m\YYHoۉO A,莎roOFoXu8 l? gOy"3˓JHoViJàwDvTߦOƊp3l;GMwp$ p0Kj qki7R8'^`mݥHЅ?2ոnv0X.8)Ip7+>`#c["fƵe$BAv _W [ 唹`Ah^E%ϊ)nniQh0ph'}gs3N(R;GF|q5i3-wv^όuh#dr6^C `TRIօ()xFy1WԒAӣF Ez(>0=tnEV5ME?aر?Kc*?vIXcjyC=vΧMZriC@?k,eUHKp1WjPKJWMԪYW\Cd*=qJ`2,i㊏Ə+w$ե~8THRiVFTfjߍ@+J~*uKO:B5BEh{ף5G^$2g{c'ܓIz%2+n&Dv-^5 Ǿ ɨLeOeUIs~zF0"DSK:mQ9fnoݴxFod%ǿ 7˔9 w4I%I&YtdQ ˖3?2cHINt} %R(Fkip-n8WkYbre qZK2xŦ)vçq-Ϻٵ sq(5 Rh€|:]g_q#p$xQS}SUZ ~~5[!%J}Y#.’; ?뢖pUJa*-TtVut]T}& E#cC6; %@ E."RA`-h48g]_o]%ueP$9 (F CbY1.TyRR?ԗKȵD-ɕm"ʡW' =#o茯J)SjHCG:u1XM$dR.އ?O &Q) } <{XygTX C^ݔQ +$#N|(BJ[L;L Oͩ޴ A4lpaR]hp 1x ޤRzBb|oaYZ%%xںǎ5 Gcy}Vg85;G׻wQ-IJIh]/u1xc8SKX35j 2O,ؐŠ-qdi G krA㰠`F%O!&-+Zu(1|PYKKUcGr$26_OS˗JK-}ts1˘8(y[sC mܜ(лC<;P]P`5;xvۨmI'8Ӆșn,1v0ਖ_U6Y歝ƙZ,I#ڸ}=&bomiaزH3j@$mR~M}ƿC{*7fG\%]ktn 2ip?7`MGU}ldr"qS}=o@য়EG^k:7w' g҆ΰxxL,  > {~V;?܍'6 %R>&f?h.˫'}_%8k:5>=vmMk <…]OCL fr ^C`OTƱ7a&=F2_OǯR 幭L|Z=!_פaikN#ZfiPOMKKwj]-FdRt/J5m=Bmn4JBsHYKzӭ7 %$ƻomG2zB6 y'ƒܚPʋACTў@iZq,vK+(TVY"~f,qtƢ @Ƃ{3EaXo!ibn \1,"#>۱=!ɡ˘˺(C ^,£/KL|Xυ}<׽:i9?͕卻*9O|. {x%ӏN1w>Uas)o*d&ԸXoO-pԂb)_AUr8yurup5@f"r ۖk^+,}׎D  ? ;^"͉V}9-$3b[ cA QWy}[9l1XXZ,bTvG OqQ /w;)H7(BT,Gxܽ?/<N%3k̯@9LlTA&T^&4[YDh[Ff$MD kC@ N~' Eh+_zA<+%s6--HQyobyeh;^GpMG^^4a cD QIqHBDa!«z177/Ɲ W‰+!aP@?Nk5+ ^ )ށpFnlNLi6Qec^=@(?.9^h, خch%j?zTP~6 >7{$p۱TڽzG3F;Ԃnqx9ĥ 4Ku2nHmj~_bS?5|d'4vHFR;wb{w4EƝ(7i#Y\[;fgM4Ƨ֑.W@Fz|7V09,Wjwp+ VrR IZDEZZYRG%gh#PXa5c"tE1\ ߳o|cߍ;t j%+S|֣AcxF025I"|Ɲ&)V (NB{?OJ|;t@yބZXR3 1Uۯ)$.ҭ{_ߡJL a^Ss; UC(>w@JFƃaN֒U=k~Η3TVai7qpLr4%4F LZ4'=!0YӅ=&{Ei?u+]4#u+ikNfq ai0)`SZ~19\Ysmi❙yskg9r둔 љZXPi2*IGsS"6Wk%-kGV=Ǥt_UTDȹ⼒밵F0HxUb7KC_Zzm<_uN#;)ɾsqԒh?_H 5NJKQ^4gPW޾%k^ iOO:kNMvQ-y\w˕GljPxRI*ĀH'duk?0ki9$s? ǟZ/ڒyWy;mD#jbV>lيǾ'- :=>jSҕu(iΊfrC 꿫inδ Sj}BZ^Ei IF/@]{fݴ粽hAQMoCN-78f`Uj7Gю=2Zqiѿ[:-<#}џ63 dڻ^d?ڏ_rŸ)E,!对_/RȁwmZ׊5zQR././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/docs/source/_ext/pil.py0000644000175000017500000000255714504640166017136 0ustar00venelinvenelinimport os, sys, io, base64 from docutils import nodes from sphinx.directives.code import CodeBlock def visit_pil(self, node): pass def depart_pil(self, node): pass class PILNode(nodes.Structural, nodes.Element): pass class PILDirective(CodeBlock): has_content = True def run(self): code_node = CodeBlock.run(self) nodes.image() from PIL import Image lib_path = os.path.abspath('..') working_path = os.path.dirname(os.path.realpath(__file__)) static_path = os.path.join(working_path, '..', '_static') sys.path.append(lib_path) os.chdir(working_path) node = PILNode() g = globals() l = locals() for line in self.content: result = exec(line, g, l) buffer = io.BytesIO() new_img = l.get('new_img') new_img.save(buffer, format='PNG') image_node = nodes.image() image_node['alt'] = 'New Image' image_node['uri'] = 'data:image/png;base64,' + base64.b64encode(buffer.getvalue()).decode() node += code_node node += image_node return [node] def setup(app): app.add_node(PILNode, html=(visit_pil, depart_pil)) app.add_directive('pil-block', PILDirective) return { 'version': '0.1', 'parallel_read_safe': True, 'parallel_write_safe': True, } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/docs/source/conf.py0000644000175000017500000001760714504640166016342 0ustar00venelinvenelin# -*- coding: utf-8 -*- # # PILKit documentation build configuration file, created by # sphinx-quickstart on Thu Feb 7 20:01:22 2013. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import re, sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) sys.path.append(os.path.abspath('./_ext')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['pil'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'PILKit' copyright = u'2013, Matthew Tretter' pkgmeta = {} pkgmeta_file = os.path.join(os.path.dirname(__file__), '..', '..', 'pilkit', 'pkgmeta.py') with open(pkgmeta_file) as f: code = compile(f.read(), 'pkgmeta.py', 'exec') exec(code, pkgmeta) # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = re.match('\d+\.\d+', pkgmeta['__version__']).group() # The full version, including alpha/beta/rc tags. release = pkgmeta['__version__'] # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'PILKitdoc' # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'PILKit.tex', u'PILKit Documentation', u'Matthew Tretter', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'pilkit', u'PILKit Documentation', [u'Matthew Tretter'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'PILKit', u'PILKit Documentation', u'Matthew Tretter', 'PILKit', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/docs/source/index.rst0000644000175000017500000000051614504640166016673 0ustar00venelinvenelin Welcome to PILKit's documentation! ================================== .. include:: ../../README.rst Contents -------- .. toctree:: :maxdepth: 2 processors/resize processors/filter Authors ------- .. include:: ../../AUTHORS Indices and tables ------------------ * :ref:`genindex` * :ref:`modindex` * :ref:`search` ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.0830095 pilkit-3.0/docs/source/processors/0000755000175000017500000000000014505123041017217 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/docs/source/processors/filter.rst0000644000175000017500000000116214504640166021251 0ustar00venelinvenelin Filter ======= Original Image .. image:: ../_ext/original.jpg Gaussian Blur ------------- .. pil-block:: from pilkit.processors.filter import GaussianBlur old_img = Image.open('original.jpg') blur = GaussianBlur(1) new_img = blur.process(old_img) .. pil-block:: from pilkit.processors.filter import GaussianBlur old_img = Image.open('original.jpg') blur = GaussianBlur(5) new_img = blur.process(old_img) .. pil-block:: from pilkit.processors.filter import GaussianBlur old_img = Image.open('original.jpg') blur = GaussianBlur(10) new_img = blur.process(old_img) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/docs/source/processors/resize.rst0000644000175000017500000000466414504640166021277 0ustar00venelinvenelin Resize ======= Original Image .. image:: ../_ext/original.jpg Resize To Fill --------------- .. pil-block:: from pilkit.processors.resize import ResizeToFill old_img = Image.open('original.jpg') resizer = ResizeToFill(300, 300) new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import ResizeToFill old_img = Image.open('original.jpg') resizer = ResizeToFill(600, 300) new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import ResizeToFill old_img = Image.open('original.jpg') resizer = ResizeToFill(300, 600) new_img = resizer.process(old_img) Resize To Cover ---------------- .. pil-block:: from pilkit.processors.resize import ResizeToCover old_img = Image.open('original.jpg') resizer = ResizeToCover(300, 300) # width, height new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import ResizeToCover old_img = Image.open('original.jpg') resizer = ResizeToCover(600, 300) # width, height new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import ResizeToCover old_img = Image.open('original.jpg') resizer = ResizeToCover(300, 600) # width, height new_img = resizer.process(old_img) Resize To Fit -------------- .. pil-block:: from pilkit.processors.resize import ResizeToFit old_img = Image.open('original.jpg') resizer = ResizeToFit(300, 300) new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import ResizeToFit old_img = Image.open('original.jpg') resizer = ResizeToFit(600, 300) new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import ResizeToFit old_img = Image.open('original.jpg') resizer = ResizeToFit(300, 600) new_img = resizer.process(old_img) Thumbnail ---------- .. pil-block:: from pilkit.processors.resize import Thumbnail old_img = Image.open('original.jpg') resizer = Thumbnail(300, 300) new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import Thumbnail old_img = Image.open('original.jpg') resizer = Thumbnail(600, 300) new_img = resizer.process(old_img) .. pil-block:: from pilkit.processors.resize import Thumbnail old_img = Image.open('original.jpg') resizer = Thumbnail(300, 600) new_img = resizer.process(old_img) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.0840096 pilkit-3.0/pilkit/0000755000175000017500000000000014505123041014061 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774804.0 pilkit-3.0/pilkit/__init__.py0000664000175000017500000000004712203765224016205 0ustar00venelinvenelin# flake8: noqa from .pkgmeta import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774804.0 pilkit-3.0/pilkit/exceptions.py0000664000175000017500000000012712203765224016626 0ustar00venelinvenelinclass UnknownExtension(Exception): pass class UnknownFormat(Exception): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695772856.0 pilkit-3.0/pilkit/lib.py0000644000175000017500000000430614504670270015216 0ustar00venelinvenelin# flake8: noqa # Required PIL classes may or may not be available from the root namespace # depending on the installation method used. try: from PIL import Image, ImageColor, ImageChops, ImageEnhance, ImageFile, \ ImageFilter, ImageDraw, ImageStat, ImageMode except ImportError: try: import Image import ImageColor import ImageChops import ImageEnhance import ImageFile import ImageFilter import ImageDraw import ImageStat import ImageMode except ImportError: raise ImportError('PILKit was unable to import the Python Imaging Library. Please confirm it`s installed and available on your current Python path.') try: from io import BytesIO as StringIO except ImportError as exc: try: from cStringIO import StringIO except ImportError: try: from StringIO import StringIO except ImportError: raise exc try: string_types = [basestring, str] except NameError: string_types = [str] def getattrsafe(obj, attr, fallback_attr = None): """Similar to getattr but accept dotted path The idea of this function is to pass dotted path to attribute. If the path is missing then the fallback will be evaluated as dotted path also. If the fallback is not present then the attribute error for the first path is thrown The main idea of this function is for compatibility with Pillow < 10 Example:: >>> from PIL import Image >>> getattrsafe(Image, 'Transpose.FLIP_HORIZONTAL', 'FLIP_HORIZONTAL') """ names = attr.split('.') res = obj for i, name in enumerate(names): try: res = getattr(res, name) except AttributeError: missing = '.'.join(names[:i + 1]) if fallback_attr is None: raise AttributeError("'{}' object has no attribute '{}'".format(type(obj).__name__, missing)) else: try: return getattrsafe(obj, fallback_attr) except AttributeError: raise AttributeError("'{}' object has no attribute '{}' or '{}'".format(type(obj).__name__, missing, fallback_attr)) return res ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695774950.0 pilkit-3.0/pilkit/pkgmeta.py0000644000175000017500000000024014504674346016101 0ustar00venelinvenelin__title__ = 'pilkit' __author__ = 'Matthew Tretter' __version__ = '3.0' __license__ = 'BSD' __all__ = ['__title__', '__author__', '__version__', '__license__'] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.1090097 pilkit-3.0/pilkit/processors/0000755000175000017500000000000014505123041016263 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/pilkit/processors/__init__.py0000644000175000017500000000065714504640166020417 0ustar00venelinvenelin# flake8: noqa """ PILKit image processors. A processor accepts an image, does some stuff, and returns the result. Processors can do anything with the image you want, but their responsibilities should be limited to image manipulations--they should be completely decoupled from the filesystem. """ from .base import * from .crop import * from .convert import * from .filter import * from .overlay import * from .resize import * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695775021.0 pilkit-3.0/pilkit/processors/base.py0000644000175000017500000001740414504674455017600 0ustar00venelinvenelinfrom pilkit.lib import Image, ImageColor, ImageEnhance, getattrsafe class ProcessorPipeline(list): """ A :class:`list` of other processors. This class allows any object that knows how to deal with a single processor to deal with a list of them. For example:: processed_image = ProcessorPipeline([ProcessorA(), ProcessorB()]).process(image) """ def process(self, img): for proc in self: img = proc.process(img) return img class Adjust(object): """ Performs color, brightness, contrast, and sharpness enhancements on the image. See :mod:`PIL.ImageEnhance` for more imformation. """ def __init__(self, color=1.0, brightness=1.0, contrast=1.0, sharpness=1.0): """ :param color: A number between 0 and 1 that specifies the saturation of the image. 0 corresponds to a completely desaturated image (black and white) and 1 to the original color. See :class:`PIL.ImageEnhance.Color` :param brightness: A number representing the brightness; 0 results in a completely black image whereas 1 corresponds to the brightness of the original. See :class:`PIL.ImageEnhance.Brightness` :param contrast: A number representing the contrast; 0 results in a completely gray image whereas 1 corresponds to the contrast of the original. See :class:`PIL.ImageEnhance.Contrast` :param sharpness: A number representing the sharpness; 0 results in a blurred image; 1 corresponds to the original sharpness; 2 results in a sharpened image. See :class:`PIL.ImageEnhance.Sharpness` """ self.color = color self.brightness = brightness self.contrast = contrast self.sharpness = sharpness def process(self, img): original = img = img.convert('RGBA') for name in ['Color', 'Brightness', 'Contrast', 'Sharpness']: factor = getattr(self, name.lower()) if factor != 1.0: try: img = getattr(ImageEnhance, name)(img).enhance(factor) except ValueError: pass else: # PIL's Color and Contrast filters both convert the image # to L mode, losing transparency info, so we put it back. # See https://github.com/jdriscoll/django-imagekit/issues/64 if name in ('Color', 'Contrast'): img = Image.merge('RGBA', img.split()[:3] + original.split()[3:4]) return img class Reflection(object): """ Creates an image with a reflection. """ def __init__(self, background_color='#FFFFFF', size=0.0, opacity=0.6): self.background_color = background_color self.size = size self.opacity = opacity def process(self, img): # Convert bgcolor string to RGB value. background_color = ImageColor.getrgb(self.background_color) # Handle palleted images. img = img.convert('RGBA') # Copy orignial image and flip the orientation. reflection = img.copy().transpose(Transpose.FLIP_VERTICAL) # Create a new image filled with the bgcolor the same size. background = Image.new("RGBA", img.size, background_color) # Calculate our alpha mask. start = int(255 - (255 * self.opacity)) # The start of our gradient. steps = int(255 * self.size) # The number of intermedite values. increment = (255 - start) / float(steps) mask = Image.new('L', (1, 255)) for y in range(255): if y < steps: val = int(y * increment + start) else: val = 255 mask.putpixel((0, y), val) alpha_mask = mask.resize(img.size) # Merge the reflection onto our background color using the alpha mask. reflection = Image.composite(background, reflection, alpha_mask) # Crop the reflection. reflection_height = int(img.size[1] * self.size) reflection = reflection.crop((0, 0, img.size[0], reflection_height)) # Create new image sized to hold both the original image and # the reflection. composite = Image.new("RGBA", (img.size[0], img.size[1] + reflection_height), background_color) # Paste the orignal image and the reflection into the composite image. composite.paste(img, (0, 0)) composite.paste(reflection, (0, img.size[1])) # Return the image complete with reflection effect. return composite class Transpose(object): """ Rotates or flips the image. """ AUTO = 'auto' FLIP_HORIZONTAL = getattrsafe(Image, 'Transpose.FLIP_LEFT_RIGHT', 'FLIP_LEFT_RIGHT') # noqa FLIP_VERTICAL = getattrsafe(Image, 'Transpose.FLIP_TOP_BOTTOM', 'FLIP_TOP_BOTTOM') # noqa ROTATE_90 = getattrsafe(Image, 'Transpose.ROTATE_90', 'ROTATE_90') ROTATE_180 = getattrsafe(Image, 'Transpose.ROTATE_180', 'ROTATE_180') ROTATE_270 = getattrsafe(Image, 'Transpose.ROTATE_270', 'ROTATE_270') methods = [AUTO] _EXIF_ORIENTATION_STEPS = { 1: [], 2: [FLIP_HORIZONTAL], 3: [ROTATE_180], 4: [FLIP_VERTICAL], 5: [ROTATE_270, FLIP_HORIZONTAL], 6: [ROTATE_270], 7: [ROTATE_90, FLIP_HORIZONTAL], 8: [ROTATE_90], } def __init__(self, *args): """ Possible arguments: - Transpose.AUTO - Transpose.FLIP_HORIZONTAL - Transpose.FLIP_VERTICAL - Transpose.ROTATE_90 - Transpose.ROTATE_180 - Transpose.ROTATE_270 The order of the arguments dictates the order in which the Transposition steps are taken. If Transpose.AUTO is present, all other arguments are ignored, and the processor will attempt to rotate the image according to the EXIF Orientation data. """ super(Transpose, self).__init__() if args: self.methods = args def process(self, img): if self.AUTO in self.methods: try: orientation = img._getexif()[0x0112] ops = self._EXIF_ORIENTATION_STEPS[orientation] except (IndexError, KeyError, TypeError, AttributeError): ops = [] else: ops = self.methods for method in ops: img = img.transpose(method) return img class Anchor(object): """ Defines all the anchor points needed by the various processor classes. """ TOP_LEFT = 'tl' TOP = 't' TOP_RIGHT = 'tr' BOTTOM_LEFT = 'bl' BOTTOM = 'b' BOTTOM_RIGHT = 'br' CENTER = 'c' LEFT = 'l' RIGHT = 'r' _ANCHOR_PTS = { TOP_LEFT: (0, 0), TOP: (0.5, 0), TOP_RIGHT: (1, 0), LEFT: (0, 0.5), CENTER: (0.5, 0.5), RIGHT: (1, 0.5), BOTTOM_LEFT: (0, 1), BOTTOM: (0.5, 1), BOTTOM_RIGHT: (1, 1), } @staticmethod def get_tuple(anchor): """Normalizes anchor values (strings or tuples) to tuples. """ # If the user passed in one of the string values, convert it to a # percentage tuple. if anchor in Anchor._ANCHOR_PTS.keys(): anchor = Anchor._ANCHOR_PTS[anchor] return anchor class MakeOpaque(object): """ Pastes the provided image onto an image of a solid color. Used for when you want to make transparent images opaque. """ def __init__(self, background_color=(255, 255, 255)): self.background_color = background_color def process(self, img): img = img.convert('RGBA') new_img = Image.new('RGBA', img.size, self.background_color) new_img.paste(img, img) return new_img ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/pilkit/processors/convert.py0000644000175000017500000000045314504640166020332 0ustar00venelinvenelin class Convert(object): """ Converts image to different mode """ def __init__(self, mode): """ :param mode: Define the mode to which an image is to be converted """ self.mode = mode def process(self, img): return img.convert(self.mode) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774804.0 pilkit-3.0/pilkit/processors/crop.py0000664000175000017500000001344712203765224017623 0ustar00venelinvenelinfrom .base import Anchor # noqa from .utils import histogram_entropy from ..lib import Image, ImageChops, ImageDraw, ImageStat class Side(object): TOP = 't' RIGHT = 'r' BOTTOM = 'b' LEFT = 'l' ALL = (TOP, RIGHT, BOTTOM, LEFT) def _crop(img, bbox, sides=Side.ALL): bbox = ( bbox[0] if Side.LEFT in sides else 0, bbox[1] if Side.TOP in sides else 0, bbox[2] if Side.RIGHT in sides else img.size[0], bbox[3] if Side.BOTTOM in sides else img.size[1], ) return img.crop(bbox) def detect_border_color(img): mask = Image.new('1', img.size, 1) w, h = img.size[0] - 2, img.size[1] - 2 if w > 0 and h > 0: draw = ImageDraw.Draw(mask) draw.rectangle([1, 1, w, h], 0) return ImageStat.Stat(img.convert('RGBA').histogram(mask)).median class TrimBorderColor(object): """Trims a color from the sides of an image. """ def __init__(self, color=None, tolerance=0.3, sides=Side.ALL): """ :param color: The color to trim from the image, in a 4-tuple RGBA value, where each component is an integer between 0 and 255, inclusive. If no color is provided, the processor will attempt to detect the border color automatically. :param tolerance: A number between 0 and 1 where 0. Zero is the least tolerant and one is the most. :param sides: A list of sides that should be trimmed. Possible values are provided by the :class:`Side` enum class. """ self.color = color self.sides = sides self.tolerance = tolerance def process(self, img): source = img.convert('RGBA') border_color = self.color or tuple(detect_border_color(source)) bg = Image.new('RGBA', img.size, border_color) diff = ImageChops.difference(source, bg) if self.tolerance not in (0, 1): # If tolerance is zero, we've already done the job. A tolerance of # one would mean to trim EVERY color, and since that would result # in a zero-sized image, we just ignore it. if not 0 <= self.tolerance <= 1: raise ValueError('%s is an invalid tolerance. Acceptable values' ' are between 0 and 1 (inclusive).' % self.tolerance) tmp = ImageChops.constant(diff, int(self.tolerance * 255)) \ .convert('RGBA') diff = ImageChops.subtract(diff, tmp) bbox = diff.getbbox() if bbox: img = _crop(img, bbox, self.sides) return img class Crop(object): """ Crops an image, cropping it to the specified width and height. You may optionally provide either an anchor or x and y coordinates. This processor functions exactly the same as ``ResizeCanvas`` except that it will never enlarge the image. """ def __init__(self, width=None, height=None, anchor=None, x=None, y=None): self.width = width self.height = height self.anchor = anchor self.x = x self.y = y def process(self, img): from .resize import ResizeCanvas original_width, original_height = img.size new_width, new_height = min(original_width, self.width), \ min(original_height, self.height) return ResizeCanvas(new_width, new_height, anchor=self.anchor, x=self.x, y=self.y).process(img) class SmartCrop(object): """ Crop an image to the specified dimensions, whittling away the parts of the image with the least entropy. Based on smart crop implementation from easy-thumbnails: https://github.com/SmileyChris/easy-thumbnails/blob/master/easy_thumbnails/processors.py#L193 """ def __init__(self, width=None, height=None): """ :param width: The target width, in pixels. :param height: The target height, in pixels. """ self.width = width self.height = height def compare_entropy(self, start_slice, end_slice, slice, difference): """ Calculate the entropy of two slices (from the start and end of an axis), returning a tuple containing the amount that should be added to the start and removed from the end of the axis. """ start_entropy = histogram_entropy(start_slice) end_entropy = histogram_entropy(end_slice) if end_entropy and abs(start_entropy / end_entropy - 1) < 0.01: # Less than 1% difference, remove from both sides. if difference >= slice * 2: return slice, slice half_slice = slice // 2 return half_slice, slice - half_slice if start_entropy > end_entropy: return 0, slice else: return slice, 0 def process(self, img): source_x, source_y = img.size diff_x = int(source_x - min(source_x, self.width)) diff_y = int(source_y - min(source_y, self.height)) left = top = 0 right, bottom = source_x, source_y while diff_x: slice = min(diff_x, max(diff_x // 5, 10)) start = img.crop((left, 0, left + slice, source_y)) end = img.crop((right - slice, 0, right, source_y)) add, remove = self.compare_entropy(start, end, slice, diff_x) left += add right -= remove diff_x = diff_x - add - remove while diff_y: slice = min(diff_y, max(diff_y // 5, 10)) start = img.crop((0, top, source_x, top + slice)) end = img.crop((0, bottom - slice, source_x, bottom)) add, remove = self.compare_entropy(start, end, slice, diff_y) top += add bottom -= remove diff_y = diff_y - add - remove box = (left, top, right, bottom) img = img.crop(box) return img ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/pilkit/processors/filter.py0000644000175000017500000000055514504640166020142 0ustar00venelinvenelinfrom PIL import ImageFilter class GaussianBlur(object): """ Performs Gaussian blur filter on image. """ def __init__(self, radius): """ :param radius: Blur radius (passed to GaussianBlur filter) """ self.radius = radius def process(self, img): return img.filter(ImageFilter.GaussianBlur(self.radius)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/pilkit/processors/overlay.py0000644000175000017500000000135714504640166020337 0ustar00venelinvenelinfrom pilkit.lib import Image class ColorOverlay(object): """ Overlay a color mask with a the given opacity """ def __init__(self, color, overlay_opacity=0.5): """ :pamra color: `ImageColor` instance to overlay on the original image :param overlay_opacity: Define the fusion factor for the overlay mask """ self.color = color self.overlay_opacity = overlay_opacity def process(self, img): original = img = img.convert('RGB') overlay = Image.new('RGB', original.size, self.color) mask = Image.new('RGBA', original.size, (0,0,0,int((1.0 - self.overlay_opacity)*255))) img = Image.composite(original, overlay, mask).convert('RGB') return img ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695775021.0 pilkit-3.0/pilkit/processors/resize.py0000644000175000017500000002332514504674455020166 0ustar00venelinvenelinfrom .base import Anchor from .utils import resolve_palette from ..lib import Image, getattrsafe class Resize(object): """ Resizes an image to the specified width and height. """ LANCZOS = getattrsafe(Image, 'Resampling.LANCZOS', 'LANCZOS') def __init__(self, width, height, upscale=True): """ :param width: The target width, in pixels. :param height: The target height, in pixels. :param upscale: Should the image be enlarged if smaller than the dimensions? """ self.width = width self.height = height self.upscale = upscale def process(self, img): if self.upscale or (self.width < img.size[0] and self.height < img.size[1]): img = resolve_palette(img) img = img.resize((self.width, self.height), self.LANCZOS) return img class ResizeToCover(object): """ Resizes the image to the smallest possible size that will entirely cover the provided dimensions. You probably won't be using this processor directly, but it's used internally by ``ResizeToFill`` and ``SmartResize``. """ def __init__(self, width, height, upscale=True): """ :param width: The target width, in pixels. :param height: The target height, in pixels. """ self.width, self.height = width, height self.upscale = upscale def process(self, img): original_width, original_height = img.size ratio = max(float(self.width) / original_width, float(self.height) / original_height) new_width, new_height = (int(round(original_width * ratio)), int(round(original_height * ratio))) img = Resize(new_width, new_height, upscale=self.upscale).process(img) return img class ResizeToFill(object): """ Resizes an image, cropping it to the exact specified width and height. """ def __init__(self, width=None, height=None, anchor=None, upscale=True): """ :param width: The target width, in pixels. :param height: The target height, in pixels. :param anchor: Specifies which part of the image should be retained when cropping. :param upscale: Should the image be enlarged if smaller than the dimensions? """ self.width = width self.height = height self.anchor = anchor self.upscale = upscale def process(self, img): from .crop import Crop img = ResizeToCover(self.width, self.height, upscale=self.upscale).process(img) return Crop(self.width, self.height, anchor=self.anchor).process(img) class SmartResize(object): """ The ``SmartResize`` processor is identical to ``ResizeToFill``, except that it uses entropy to crop the image instead of a user-specified anchor point. Internally, it simply runs the ``ResizeToCover`` and ``SmartCrop`` processors in series. """ def __init__(self, width, height, upscale=True): """ :param width: The target width, in pixels. :param height: The target height, in pixels. :param upscale: Should the image be enlarged if smaller than the dimensions? """ self.width, self.height = width, height self.upscale = upscale def process(self, img): from .crop import SmartCrop img = ResizeToCover(self.width, self.height, upscale=self.upscale).process(img) return SmartCrop(self.width, self.height).process(img) class ResizeCanvas(object): """ Resizes the canvas, using the provided background color if the new size is larger than the current image. """ def __init__(self, width, height, color=None, anchor=None, x=None, y=None): """ :param width: The target width, in pixels. :param height: The target height, in pixels. :param color: The background color to use for padding. :param anchor: Specifies the position of the original image on the new canvas. Valid values are: - Anchor.TOP_LEFT - Anchor.TOP - Anchor.TOP_RIGHT - Anchor.LEFT - Anchor.CENTER - Anchor.RIGHT - Anchor.BOTTOM_LEFT - Anchor.BOTTOM - Anchor.BOTTOM_RIGHT You may also pass a tuple that indicates the position in percentages. For example, ``(0, 0)`` corresponds to "top left", ``(0.5, 0.5)`` to "center" and ``(1, 1)`` to "bottom right". This is basically the same as using percentages in CSS background positions. """ if x is not None or y is not None: if anchor: raise Exception('You may provide either an anchor or x and y' ' coordinate, but not both.') else: self.x, self.y = x or 0, y or 0 self.anchor = None else: self.anchor = anchor or Anchor.CENTER self.x = self.y = None self.width = width self.height = height self.color = color or (255, 255, 255, 0) def process(self, img): original_width, original_height = img.size if self.anchor: anchor = Anchor.get_tuple(self.anchor) trim_x, trim_y = self.width - original_width, \ self.height - original_height x = int(float(trim_x) * float(anchor[0])) y = int(float(trim_y) * float(anchor[1])) else: x, y = self.x, self.y new_img = Image.new('RGBA', (self.width, self.height), self.color) new_img.paste(img, (x, y)) return new_img class AddBorder(object): """ Add a border of specific color and size to an image. """ def __init__(self, thickness, color=None): """ :param color: Color to use for the border :param thickness: Thickness of the border. Can be either an int or a 4-tuple of ints of the form (top, right, bottom, left). """ self.color = color if isinstance(thickness, int): self.top = self.right = self.bottom = self.left = thickness else: self.top, self.right, self.bottom, self.left = thickness def process(self, img): new_width = img.size[0] + self.left + self.right new_height = img.size[1] + self.top + self.bottom return ResizeCanvas(new_width, new_height, color=self.color, x=self.left, y=self.top).process(img) class ResizeToFit(object): """ Resizes an image to fit within the specified dimensions. """ def __init__(self, width=None, height=None, upscale=True, mat_color=None, anchor=Anchor.CENTER): """ :param width: The maximum width of the desired image. :param height: The maximum height of the desired image. :param upscale: A boolean value specifying whether the image should be enlarged if its dimensions are smaller than the target dimensions. :param mat_color: If set, the target image size will be enforced and the specified color will be used as a background color to pad the image. """ self.width = width self.height = height self.upscale = upscale self.mat_color = mat_color self.anchor = anchor def process(self, img): cur_width, cur_height = img.size if not self.width is None and not self.height is None: ratio = min(float(self.width) / cur_width, float(self.height) / cur_height) else: if self.width is None: ratio = float(self.height) / cur_height else: ratio = float(self.width) / cur_width new_dimensions = (int(round(cur_width * ratio)), int(round(cur_height * ratio))) img = Resize(new_dimensions[0], new_dimensions[1], upscale=self.upscale).process(img) if self.mat_color is not None: img = ResizeCanvas(self.width, self.height, self.mat_color, anchor=self.anchor).process(img) return img class Thumbnail(object): """ Resize the image for use as a thumbnail. Wraps ``ResizeToFill``, ``ResizeToFit``, and ``SmartResize``. Note: while it doesn't currently, in the future this processor may also sharpen based on the amount of reduction. """ def __init__(self, width=None, height=None, anchor=None, crop=None, upscale=None): self.width = width self.height = height self.upscale = upscale if anchor: if crop is False: raise Exception("You can't specify an anchor point if crop is False.") else: crop = True elif crop is None: # Assume we are cropping if both a width and height are provided. If # only one is, we must be resizing to fit. crop = width is not None and height is not None # A default anchor if cropping. if crop and anchor is None: anchor = 'auto' self.crop = crop self.anchor = anchor def process(self, img): if self.crop: if not self.width or not self.height: raise Exception('You must provide both a width and height when' ' cropping.') if self.anchor == 'auto': processor = SmartResize(width=self.width, height=self.height, upscale=self.upscale) else: processor = ResizeToFill(width=self.width, height=self.height, anchor=self.anchor, upscale=self.upscale) else: processor = ResizeToFit(width=self.width, height=self.height, upscale=self.upscale) return processor.process(img) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695769272.0 pilkit-3.0/pilkit/processors/utils.py0000644000175000017500000000212214504661270020004 0ustar00venelinvenelinfrom ..lib import Image, ImageMode def color_count(image): """ Return the number of color values in the input image -- this is the number of pixels times the band count of the image. """ mode_descriptor = ImageMode.getmode(image.mode) width, height = image.size return width * height * len(mode_descriptor.bands) def histogram_entropy_py(image): """ Calculate the entropy of an images' histogram. """ from math import log2, fsum histosum = float(color_count(image)) histonorm = (histocol / histosum for histocol in image.histogram()) return -fsum(p * log2(p) for p in histonorm if p != 0.0) # Select the Pillow native histogram entropy function - if # available - and fall back to the Python implementation: histogram_entropy = getattr(Image.Image, 'entropy', histogram_entropy_py) def resolve_palette(image): """ Convert a palette image to a non-palette image. """ # We need to load the image before accessing the palette image.load() if image.palette is None: return image return image.convert(image.palette.mode)././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695772856.0 pilkit-3.0/pilkit/utils.py0000644000175000017500000003054414504670270015613 0ustar00venelinvenelinimport os import mimetypes import sys from io import UnsupportedOperation from .exceptions import UnknownExtension, UnknownFormat from .lib import Image, ImageFile, StringIO, string_types, getattrsafe RGBA_TRANSPARENCY_FORMATS = ['PNG', 'WEBP'] PALETTE_TRANSPARENCY_FORMATS = ['PNG', 'GIF'] DEFAULT_EXTENSIONS = { 'JPEG': '.jpg', 'PNG': '.png', } def img_to_fobj(img, format, autoconvert=True, **options): return save_image(img, StringIO(), format, options, autoconvert) def open_image(target): target.seek(0) return Image.open(target) _pil_init = 0 def _preinit_pil(): """Loads the standard PIL file format drivers. Returns True if ``preinit()`` was called (and there's a potential that more drivers were loaded) or False if there is no possibility that new drivers were loaded. """ global _pil_init if _pil_init < 1: Image.preinit() _pil_init = 1 return True return False def _init_pil(): """Loads all PIL file format drivers. Returns True if ``init()`` was called (and there's a potential that more drivers were loaded) or False if there is no possibility that new drivers were loaded. """ global _pil_init _preinit_pil() if _pil_init < 2: Image.init() _pil_init = 2 return True return False def _extension_to_format(extension): return Image.EXTENSION.get(extension.lower()) def _format_to_extension(format): if format: format = format.upper() if format in DEFAULT_EXTENSIONS: ext = DEFAULT_EXTENSIONS[format] # It's not enough for an extension to be listed in # ``DEFAULT_EXTENSIONS``, it must also be recognized by PIL. if ext in Image.EXTENSION: return ext for k, v in Image.EXTENSION.items(): if v == format: return k return None def extension_to_mimetype(ext): try: filename = 'a%s' % (ext or '') # guess_type requires a full filename, not just an extension mimetype = mimetypes.guess_type(filename)[0] except IndexError: mimetype = None return mimetype def format_to_mimetype(format): return extension_to_mimetype(format_to_extension(format)) def extension_to_format(extension): """Returns the format that corresponds to the provided extension. """ format = _extension_to_format(extension) if not format and _preinit_pil(): format = _extension_to_format(extension) if not format and _init_pil(): format = _extension_to_format(extension) if not format: raise UnknownExtension(extension) return format def format_to_extension(format): """Returns the first extension that matches the provided format. """ extension = None if format: extension = _format_to_extension(format) if not extension and _preinit_pil(): extension = _format_to_extension(format) if not extension and _init_pil(): extension = _format_to_extension(format) if not extension: raise UnknownFormat(format) return extension def suggest_extension(name, format): original_extension = os.path.splitext(name)[1] try: suggested_extension = format_to_extension(format) except UnknownFormat: extension = original_extension else: if suggested_extension.lower() == original_extension.lower(): extension = original_extension else: try: original_format = extension_to_format(original_extension) except UnknownExtension: extension = suggested_extension else: # If the formats match, give precedence to the original extension. if format.lower() == original_format.lower(): extension = original_extension else: extension = suggested_extension return extension class FileWrapper(object): def __init__(self, wrapped): super(FileWrapper, self).__setattr__('_wrapped', wrapped) def fileno(self): try: return self._wrapped.fileno() except UnsupportedOperation: raise AttributeError def __getattr__(self, name): return getattr(self._wrapped, name) def __setattr__(self, name, value): return setattr(self._wrapped, name, value) def __delattr__(self, key): return delattr(self._wrapped, key) def save_image(img, outfile, format, options=None, autoconvert=True): """ Wraps PIL's ``Image.save()`` method. There are two main benefits of using this function over PIL's: 1. It gracefully handles the infamous "Suspension not allowed here" errors. 2. It prepares the image for saving using ``prepare_image()``, which will do some common-sense processing given the target format. """ options = options or {} if autoconvert: img, save_kwargs = prepare_image(img, format) # Use returned from prepare_image arguments for base # and update them with provided options. Then use the result save_kwargs.update(options) options = save_kwargs # Attempt to reset the file pointer. try: outfile.seek(0) except AttributeError: pass def save(fp): with quiet(): img.save(fp, format, **options) # Some versions of PIL only catch AttributeErrors where they should also # catch UnsupportedOperation exceptions. To work around this, we wrap the # file with an object that will raise the type of error it wants. if any(isinstance(outfile, t) for t in string_types): # ...but don't wrap strings. wrapper = outfile else: wrapper = FileWrapper(outfile) try: save(wrapper) except IOError: # PIL can have problems saving large JPEGs if MAXBLOCK isn't big enough, # So if we have a problem saving, we temporarily increase it. See # http://github.com/matthewwithanm/django-imagekit/issues/50 # https://github.com/matthewwithanm/django-imagekit/issues/134 # https://github.com/python-imaging/Pillow/issues/148 # https://github.com/matthewwithanm/pilkit/commit/0f914e8b40e3d30f28e04ffb759b262aa8a1a082#commitcomment-3885362 # MAXBLOCK must be at least as big as... new_maxblock = max( (len(options['exif']) if 'exif' in options else 0) + 5, # ...the entire exif header block img.size[0] * 4, # ...a complete scan line 3 * img.size[0] * img.size[1], # ...3 bytes per every pixel in the image ) if new_maxblock < ImageFile.MAXBLOCK: raise old_maxblock = ImageFile.MAXBLOCK ImageFile.MAXBLOCK = new_maxblock try: save(wrapper) finally: ImageFile.MAXBLOCK = old_maxblock try: outfile.seek(0) except AttributeError: pass return outfile class quiet(object): """ A context manager for suppressing the stderr activity of PIL's C libraries. Based on http://stackoverflow.com/a/978264/155370 """ def __enter__(self): try: self.stderr_fd = sys.__stderr__.fileno() except AttributeError: # In case of Azure, the file descriptor is not present so we can return # from here return except UnsupportedOperation: # In case of Windows 2016, the file descriptor is not present so we can return # from here return try: self.null_fd = os.open(os.devnull, os.O_RDWR) except OSError: # If dev/null isn't writeable, then they just have to put up with # the noise. return self.old = os.dup(self.stderr_fd) os.dup2(self.null_fd, self.stderr_fd) def __exit__(self, *args, **kwargs): if not getattr(self, 'null_fd', None): return if not getattr(self, 'old', None): return os.dup2(self.old, self.stderr_fd) os.close(self.null_fd) os.close(self.old) def prepare_image(img, format): """ Prepares the image for saving to the provided format by doing some common-sense conversions. This includes things like preserving transparency and quantizing. This function is used automatically by ``save_image()`` immediately before saving unless you specify ``autoconvert=False``. It is provided as a utility for those doing their own processing. :param img: The image to prepare for saving. :param format: The format that the image will be saved to. """ make_opaque = False save_kwargs = {} format = format.upper() if img.mode == 'RGBA': if format in RGBA_TRANSPARENCY_FORMATS: pass elif format in PALETTE_TRANSPARENCY_FORMATS: # If you're going from a format with alpha transparency to one # with palette transparency, transparency values will be # snapped: pixels that are more opaque than not will become # fully opaque; pixels that are more transparent than not will # become fully transparent. This will not produce a good-looking # result if your image contains varying levels of opacity; in # that case, you'll probably want to use a processor to composite # the image on a solid color. The reason we don't do this by # default is because not doing so allows processors to treat # RGBA-format images as a super-type of P-format images: if you # have an RGBA-format image with only a single transparent # color, and save it as a GIF, it will retain its transparency. # In other words, a P-format image converted to an # RGBA-formatted image by a processor and then saved as a # P-format image will give the expected results. # Work around a bug in PIL: split() doesn't check to see if # img is loaded. img.load() alpha = img.split()[-1] mask = Image.eval(alpha, lambda a: 255 if a <= 128 else 0) palette = getattrsafe(Image, 'Palette.ADAPTIVE', 'ADAPTIVE') img = img.convert('RGB').convert('P', palette=palette, colors=255) img.paste(255, mask) save_kwargs['transparency'] = 255 else: # Simply converting an RGBA-format image to an RGB one creates a # gross result, so we paste the image onto a white background. If # that's not what you want, that's fine: use a processor to deal # with the transparency however you want. This is simply a # sensible default that will always produce something that looks # good. Or at least, it will look better than just a straight # conversion. make_opaque = True elif img.mode == 'P': if format in PALETTE_TRANSPARENCY_FORMATS: try: save_kwargs['transparency'] = img.info['transparency'] except KeyError: pass elif format in RGBA_TRANSPARENCY_FORMATS: # Currently PIL doesn't support any RGBA-mode formats that # aren't also P-mode formats, so this will never happen. img = img.convert('RGBA') else: make_opaque = True else: img = img.convert('RGB') # GIFs are always going to be in palette mode, so we can do a little # optimization. Note that the RGBA sources also use adaptive # quantization (above). Images that are already in P mode don't need # any quantization because their colors are already limited. if format == 'GIF': palette = getattrsafe(Image, 'Palette.ADAPTIVE', 'ADAPTIVE') img = img.convert('P', palette=palette) if make_opaque: from .processors import MakeOpaque img = MakeOpaque().process(img).convert('RGB') if format == 'JPEG': save_kwargs['optimize'] = True return img, save_kwargs def process_image(img, processors=None, format=None, autoconvert=True, options=None): from .processors import ProcessorPipeline original_format = img.format # Run the processors img = ProcessorPipeline(processors or []).process(img) format = format or img.format or original_format or 'JPEG' options = options or {} return img_to_fobj(img, format, autoconvert, **options) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.1070096 pilkit-3.0/pilkit.egg-info/0000755000175000017500000000000014505123041015553 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695852065.0 pilkit-3.0/pilkit.egg-info/PKG-INFO0000644000175000017500000000760314505123041016656 0ustar00venelinvenelinMetadata-Version: 2.1 Name: pilkit Version: 3.0 Summary: A collection of utilities and processors for the Python Imaging Library. Home-page: http://github.com/matthewwithanm/pilkit/ Author: Matthew Tretter Author-email: m@tthewwithanm.com License: BSD Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Topic :: Utilities License-File: LICENSE License-File: AUTHORS Requires-Dist: Pillow>=7.0 PILKit is a collection of utilities for working with PIL (the Python Imaging Library). One of its main features is a set of **processors** which expose a simple interface for performing manipulations on PIL images. Looking for more advanced processors? Check out `Instakit`_! **For the complete documentation on the latest stable version of PILKit, see** `PILKit on RTD`_. .. image:: https://github.com/matthewwithanm/pilkit/workflows/Python%20CI/badge.svg :target: https://github.com/matthewwithanm/pilkit/actions?query=workflow%3A%22Python+CI%22 .. _`PILKit on RTD`: http://pilkit.readthedocs.org .. _`Instakit`: https://github.com/fish2000/instakit Installation ============ 1. Install `PIL`_ or `Pillow`_. 2. Run ``pip install pilkit`` (or clone the source and put the pilkit module on your path) .. note:: If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement. .. _`PIL`: http://pypi.python.org/pypi/PIL .. _`Pillow`: http://pypi.python.org/pypi/Pillow Usage Overview ============== Processors ---------- The "pilkit.processors" module contains several classes for processing PIL images, which provide an easy to understand API: .. code-block:: python from pilkit.processors import ResizeToFit img = Image.open('/path/to/my/image.png') processor = ResizeToFit(100, 100) new_img = processor.process(img) A few of the included processors are: * ``ResizeToFit`` * ``ResizeToFill`` * ``SmartResize`` * ``Adjust`` * ``TrimBorderColor`` * ``Transpose`` There's also a ``ProcessorPipeline`` class for executing processors sequentially: .. code-block:: python from pilkit.processors import ProcessorPipeline, ResizeToFit, Adjust img = Image.open('/path/to/my/image.png') processor = ProcessorPipeline([Adjust(color=0), ResizeToFit(100, 100)]) new_image = processor.process(img) Utilities --------- In addition to the processors, PILKit contains a few utilities to ease the pain of working with PIL. Some examples: ``prepare_image`` Prepares the image for saving to the provided format by doing some common-sense conversions, including preserving transparency and quantizing. ``save_image`` Wraps PIL's ``Image.save()`` method in order to gracefully handle PIL's "Suspension not allowed here" errors, and (optionally) prepares the image using ``prepare_image`` Utilities are also included for converting between formats, extensions, and mimetypes. Community ========= Please use `the GitHub issue tracker `_ to report bugs. `A mailing list `_ also exists to discuss the project and ask questions, as well as the official `#imagekit `_ channel on Freenode. (Both of these are shared with the `django-imagekit`_ project—from which PILKit spun off.) .. _`django-imagekit`: https://github.com/jdriscoll/django-imagekit ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695852065.0 pilkit-3.0/pilkit.egg-info/SOURCES.txt0000664000175000017500000000175614505123041017452 0ustar00venelinvenelinAUTHORS LICENSE MANIFEST.in README.rst setup.py docs/Makefile docs/make.bat docs/source/conf.py docs/source/index.rst docs/source/_ext/original.jpg docs/source/_ext/pil.py docs/source/_ext/__pycache__/pil.cpython-311.pyc docs/source/processors/filter.rst docs/source/processors/resize.rst pilkit/__init__.py pilkit/exceptions.py pilkit/lib.py pilkit/pkgmeta.py pilkit/utils.py pilkit.egg-info/PKG-INFO pilkit.egg-info/SOURCES.txt pilkit.egg-info/dependency_links.txt pilkit.egg-info/not-zip-safe pilkit.egg-info/pbr.json pilkit.egg-info/requires.txt pilkit.egg-info/top_level.txt pilkit/processors/__init__.py pilkit/processors/base.py pilkit/processors/convert.py pilkit/processors/crop.py pilkit/processors/filter.py pilkit/processors/overlay.py pilkit/processors/resize.py pilkit/processors/utils.py tests/__init__.py tests/test_processors.py tests/test_utils.py tests/utils.py tests/assets/GaussianBlur_radius_3.png tests/assets/GaussianBlur_radius_7.png tests/assets/cat.gif tests/assets/reference.png././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695852065.0 pilkit-3.0/pilkit.egg-info/dependency_links.txt0000664000175000017500000000000114505123041021623 0ustar00venelinvenelin ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774849.0 pilkit-3.0/pilkit.egg-info/not-zip-safe0000664000175000017500000000000112203765301020007 0ustar00venelinvenelin ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1456430604.0 pilkit-3.0/pilkit.egg-info/pbr.json0000664000175000017500000000005712663657014017254 0ustar00venelinvenelin{"is_release": false, "git_version": "a636041"}././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695852065.0 pilkit-3.0/pilkit.egg-info/requires.txt0000644000175000017500000000001414505123041020146 0ustar00venelinvenelinPillow>=7.0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695852065.0 pilkit-3.0/pilkit.egg-info/top_level.txt0000664000175000017500000000000714505123041020304 0ustar00venelinvenelinpilkit ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.1130097 pilkit-3.0/setup.cfg0000644000175000017500000000004614505123041014406 0ustar00venelinvenelin[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695774874.0 pilkit-3.0/setup.py0000644000175000017500000000301014504674232014305 0ustar00venelinvenelin#!/usr/bin/env python import codecs import os from setuptools import setup, find_packages def read(filepath): with codecs.open(filepath, 'r', 'utf-8') as f: return f.read() # Load package meta from the pkgmeta module without loading the package. pkgmeta = {} pkgmeta_file = os.path.join(os.path.dirname(__file__), 'pilkit', 'pkgmeta.py') with open(pkgmeta_file) as f: code = compile(f.read(), 'pkgmeta.py', 'exec') exec(code, pkgmeta) setup( name='pilkit', version=pkgmeta['__version__'], description='A collection of utilities and processors for the Python Imaging Library.', long_description=read(os.path.join(os.path.dirname(__file__), 'README.rst')), author='Matthew Tretter', author_email='m@tthewwithanm.com', license='BSD', url='http://github.com/matthewwithanm/pilkit/', packages=find_packages(exclude=['tests', 'tests.*']), zip_safe=False, include_package_data=True, install_requires=[ 'Pillow>=7.0' ], classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Topic :: Utilities' ], ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.1100097 pilkit-3.0/tests/0000755000175000017500000000000014505123041013727 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1376774804.0 pilkit-3.0/tests/__init__.py0000664000175000017500000000000012203765224016040 0ustar00venelinvenelin././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1695852065.1120098 pilkit-3.0/tests/assets/0000755000175000017500000000000014505123041015231 5ustar00venelinvenelin././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/tests/assets/GaussianBlur_radius_3.png0000644000175000017500000000235414504640166022146 0ustar00venelinvenelinPNG  IHDR IDATH]Q8CHgSΡ:-!zv"*g!@ ({}ϞaR֢z_??~^?ZUveäJ/S/{f=3{ 2kkk׵'I$|={{ILt2=u֮3 PB|^=3qˑ1=vH{N*u_{Ͻ'f<8&)dFUZUU$ 1 տ%3Lb#;1T&׽Kׯ{{އc'0I2ADD Vwu!E|ٙ5~gVW@K(k}|;ɄD/p9x{.t!PD ҺN =$ә>n =3aRg,UKό{5͋,(E`LtFmJ]\u麴Qb|(aQ wx]:k]'$RNƲegN7y5)ޕIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/tests/assets/GaussianBlur_radius_7.png0000644000175000017500000000171614504640166022153 0ustar00venelinvenelinPNG  IHDR IDATxmQrF C /W s3|쑷֥5c 6 V!uQ8\?Ѯ^cZL * U\;fvP?ϣv퟊O^ }sk֪p :j^rgM4"ڢ|琝!ҰjN;l+,-?9IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/tests/assets/cat.gif0000644000175000017500000006514014504640166016510 0ustar00venelinvenelinGIF89add333fff! NETSCAPE2.0! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X L51"gNR%OD pЖ 8TԧөH`JʴBdYn9@o ŚԻ[֬ҽ& p pa]"$l.R3R@䭌5/e{y Z4[[7~tAbм 0j6nk&-@amg͝y/EJ9 _xfq㹃/\}}rf=7G7b'`Di"piـ~ h]h@X ҆ItaOvʱ|0pՕtݵJ72(F65)g4y_N!dT\F$Hz|'feo2yf[e.`[Vie}Rq/ْp*6wxd< (D%JVfFubxFeqI瓕g'x驜e*]ꬒ"YXړkנz"buw+䠈6{'WiFhhj>ZviB&e,bK\WY ."zPyG^{^rr۟Ljū&IQp,&Ơ c9\iE(򓠥cȧbT*l3 ]P+|3ʗyr^5\drġT5,cLGZ4gmAvsX^lʄ\닗X6Gjv^VAUîvG7oruu'u֞TPmPU2=ogXZqזzqM}oծq nڪV_[e6"\JwsAkZ--rQF9ެޓG 67};rU]8Q NK{ԒM 'h#W겪n5Gb^aPUp尃^5?Ra]QEU,ݬ>LO2MVȆ)U4Dqr|r yM]-v{OJƢXXL [sziUV{ q)Sqe%bZayg؞ɕE(fbrӢw]qBIVv$*Z,ZB^JbɛZOb^glhYy,N{ⴘtY5Wb'Y~jl%c:^֭euUny^nk|6 n%)׭Ե&1vc:|kVw)f8V]35 b; J,3T@j;_EEB)W[M!W)z2g3N\Ygm ^^V_PurPD&Ym\Ln"V#gCUH*Պզ(%Zɬ 16|SxcBJЂ.IQҕ Ϧ`8ޏNQXV<0m%]!#OZkעصJ3UN_S2WgfژZX{-M9WM.SR^6C}3MHkm"7JdQn8}\ڑW;$bΫ%smV99K4}E5f};R4NK.o`! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+N{6@ߍkTZo~ԲT+5щMk}8Xԩ^ f+E.@(w7|siϝzk*<:g-jfp/:+֯|zهT{\wXqytwLuQVrwk@ 8dea"w_+UMP@]vbs hٌ>՘Jgu%yVjٛvFy!mAbrQQuV2xLn dUo2}&g[ eeǦ]i%gd'іT8a5砀[dy_S]^k8&YV`Fִ]]n.נj$Jj^eEdxzuuҕeIqŊ[i)~m젠p&ļ8[:oqK(H@/Pku>('\Fmܾ'FwnbT_3FvF&\Twrm'6V]RvZFm BZѐY"mxZ *s%Vw㝭{KءLq~*mܡK{W_큫[+%c OwEVf9 cPAmc-k١.;T Rwt"<+)N-E 3cύ.qEɐdXE1ٖjԢ'XRDL$BeG ΒΩȄ%=!5讶O>t Я-j8!xiP.*<]ޱ`=*dZS,MjJhώfO :EI4X1 6 ֨9ӬdeH׭Xᳳr;cՐ8l >zo^+-mUX_JV{R$nV2zV\D_28meٟ$6QOe6&% oz9UW#Nsƕb`Λ ˔[. ͫWO&}on)_q0Kx~9/$ ! d,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X L51"gNR%OD pЖ 8TԧөH`JʴBdYn9@o ŚԻ[֬ҽ& p pa]"$l.R3R@䭌5/e{y Z4[[7~tAbм 0j6nk&-@amg͝y/EJ9 _xfq㹃/\}}rf=7G7b'`Di"piـ~ h]h@X ҆ItaOvʱ|0pՕtݵJ72(F65)g4y_N!dT\F$Hz|'feo2yf[e.`[Vie}Rq/ْp*6wxd< (D%JVfFubxFeqI瓕g'x驜e*]ꬒ"YXړkנz"buw+䠈6{'WiFhhj>ZviB&e,bK\WY ."zPyG^{^rr۟Ljū&IQp,&Ơ c9\iE(򓠥cȧbT*l3 ]P+|3ʗyr^5\drġT5,cLGZ4gmAvsX^lʄ\닗X6Gjv^VAUîvG7oruu'u֞TPmPU2=ogXZqזzqM}oծq nڪV_[e6"\JwsAkZ--rQF9ެޓG 67};rU]8Q NK{ԒM 'h#W겪n5Gb^aPUp尃^5?Ra]QEU,ݬ>LO2MVȆ)U4Dqr|r yM]-!>LĂ1)``eDVIv<gm5w.I`՝2Fqg@T٨1l. ^8j[\Wv79J@UNZBF\(*ęR1ehť'FyZY$rlS#ְ>(ѐtY+YTǤ XceSaPHԗ!(^lɲ>U&)+3CX!^+ȻlҮO.BzzsL<izD99E 2BQ9UP"KHEm qlY7YԹQ{WULf eAy[KmlDL?abmh`bьbVzl\ wyqS\PXmZviB&e,bK\WY ."zPyG^{^rr۟Ljū&IQp,&Ơ c9\iE(򓠥cȧbT*l3 ]P+|3ʗyr^5\drġT5,cLGZ4gmAvsX^lʄ\닗X6Gjv^VAUîvG7oruu'u֞TPmPU2=ogXZqזzqM}oծq nڪV_[e6"\JwsAkZ--rQF9ެޓG 67};rU]8Q NK{ԒM 'h#W겪n5Gb^aPUp尃^5?Ra]QEU,ݬ>LO2MVȆ)U4Dqr|r yM]-="#d:5˅֖kG#[ W{W?Eu*D՝rfZ{&SBPBItU6Q%o[75xfy^J$7{\ZZUkd&*qZ wn:`)C&9)f,}ק+g oF4 /?lfd{د04kK%Z lZRYv䇼g$yq_Ejj_W(#*O1V34.Wi P1my si`K$Wօ3%rOyt`U*$$UuMPNNh$qPTpi'mgDz;/K4%piL;q*+L?c9AT2jĴ\.s9/J$@^g ɱBT*vce1ʪx"JҔlgD'DB&4pM4j,;"vH,rpʐ,I͊KhD0'ɴ;QI5T G`R+g2D#' ѤBPZN5$xϝ1*X-2(IcVQEx8(שvfN߃*PsG;9У᯦:AldřJnBc_ "k2m&nFm$nV'tM!lH6" ,FR10XHo)u q2fIlD\lkEFmucrҒD ! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X L51"gNR%OD pЖ 8TԧөH`JʴBdYn9@o ŚԻ[֬ҽ& p pa]"$l.R3R@䭌5/e{y Z4[[7~tAbм 0j6nk&-@amg͝y/EJ9 _xfq㹃/\}}rf=7G7b'`Di"piـ~ h]h@X ҆ItaOvʱ|0pՕtݵJ72(F65)g4y_N!dT\F$Hz|'feo2yf[e.`[Vie}Rq/ْp*6wxd< (D%JVfFubxFeqI瓕g'x驜e*]ꬒ"YXړkנz"buw+䠈6{'WiFhhj>ZviB&e,bK\WY ."zPyG^{^rr۟Ljū&IQp,&Ơ c9\iE(򓠥cȧbT*l3 ]P+|3ʗyr^5\drġT5,cLGZ4gmAvsX^lʄ\닗X6Gjv^VAUîvG7oruu'u֞TPmPU2=ogXZqזzqM}oծq nڪV_[e6"\JwsAkZ--rQF9ެޓG 67};rU]8Q NK{ԒM 'h#W겪n5Gb^aPUp尃^5?Ra]QEU,ݬ>LO2MVȆ)U4Dqr|r yM]-v{OJƢXXL [sziUV{ q)Sqe%bZayg؞ɕE(fbrӢw]qBIVv$*Z,ZB^JbɛZOb^glhYy,N{ⴘtY5Wb'Y~jl%c:^֭euUny^nk|6 n%)׭Ե&1vc:|kVw)f8V]35 b; J,3T@j;_EEB)W[M!W)z2g3N\Ygm ^^V_PurPD&Ym\Ln"V#gCUH*Պզ(%Zɬ 16|SxcBJЂ.IQҕ Ϧ`8ޏNQXV<0m%]!#OZkעصJ3UN_S2WgfژZX{-M9WM.SR^6C}3MHkm"7JdQn8}\ڑW;$bΫ%smV99K4}E5f};R4NK.o`! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+N{6@ߍkTZo~ԲT+5щMk}8Xԩ^ f+E.@(w7|siϝzk*<:g-jfp/:+֯|zهT{\wXqytwLuQVrwk@ 8dea"w_+UMP@]vbs hٌ>՘Jgu%yVjٛvFy!mAbrQQuV2xLn dUo2}&g[ eeǦ]i%gd'іT8a5砀[dy_S]^k8&YV`Fִ]]n.נj$Jj^eEdxzuuҕeIqŊ[i)~m젠p&ļ8[:oqK(H@/Pku>('\Fmܾ'FwnbT_3FvF&\Twrm'6V]RvZFm BZѐY"mxZ *s%Vw㝭{KءLq~*mܡK{W_큫[+%c OwEVf9 cPAmc-k١.;T Rwt"<+)N-E 3cύ.qEɐdXE1ٖjԢ'XRDL$BeG ΒΩȄ%=!5讶O>t Я-j8!xiP.*<]ޱ`=*dZS,MjJhώfO :EI4X1 6 ֨9ӬdeH׭Xᳳr;cՐ8l >zo^+-mUX_JV{R$nV2zV\D_28meٟ$6QOe6&% oz9UW#Nsƕb`Λ ˔[. ͫWO&}on)_q0Kx~9/$ ! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+k6эkTZo~4^>5щWk}8Xԩ43mͶW]@Qܹ59yE<]Kwut=s _;W+}o٧y퇐wpwWu;1l;Umv-^ µ!47׃ɥx 2q}bW%a7R`(YS"wgM&b*hXg[i%g%7Q朊zCz'gٹg\E_dUdi*ueFP`aפ)8(Yx7@>U(ya)k%Obeta)Tw:xѦgլf^2{jTu4&`f1YYjZbPnbf›ONtܮqVFݸVH,~ lWmTz /PmF\ Īhqʔ(ŭEr+[) o̥ JDMQra|j?bi8FW]TtFZaV<$&v9 mie=^VZҩEr;Ze3#Ε oJ-F+dDSqo~ ̑X[[zMYޘ'm~Zؕ`]>/%khS"OH2PQeS &ʘq5XY5]Kڪ[ziq5q_'7t0L>i[y8J~qhW My$bieqXg6P&6I\&4۶ƵKy 2E?S[װsHMV^ڢ2$-r {ă;hgB6 -Z?b urEj(W^v' mh#e<&a!Y{y%/ `Z͗XXEIWtMlc nIκUSeL;[ɬfq >Z$%uZO (ϣ1f5An|%OxкmsR/BpR 1Cυ3ڗ5T&e4! XNXbE'DrVeʨJSd@c&q41V!q <t)24:M[!ԒT @];Y)P=t.4ZZ֍eA:WFF0q]̱X:ԫjUhE¿ PUL)+ւr1,4ZU#l)7a hµFa}oGr)amDN5ҡߤXvkݖ@6ԓ'F Ӗ?Ym/ʷ$y g7f>$1kHbi!XK! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+k6эkTZo~4^>5щWk}8Xԩ43mͶW]@Qܹ59yE<]Kwut=s _;W+}o٧y퇐wpwW} qjUm;v2^ µ!7׃Ec ߋ!eٌgUnufczb/VdS"wgQԌ($R"V2x28TBnYdT97dY.g$XZWkzRmgOEءnUETA(YZV_Q-vfWRjnouhMbGkQ*st}SS_e*vo];֕Qv[ #JN] Z[ٗ~{Zɚ6|e,`mRa^箷xi{]='yѺߢo6)|׬{*r!nJ\sхe/dIװ2Yv2@-ܴn_=hU[AG T+|* ةi5-]U)cW?L`T+ɦ?FuPUDb^xkMVGW 7@`y؟?7{qNک5$Bm )5'\lS9Ydvy[=Ý'Bo92%V;}q'\kTPY_D&/: 2,Nj\SWBqPV|fa7h!ZN%s[LTn~{ZG@ѯnQbv֝yWڨUn ZSppvSJ-4,= p#{\EAݒ˜J gDOh)dK5j'5Ңխ*h:-*v*5E .Әsu*ĚUe$'(*ΞR}ev҅/g'X|t9jG,[LN !WqV'Un$&}M:y&7/)M&EfK("/f{cBVw%ߧ[ " <3$ ! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+k6эkTZo~4^>5щWk}8Xԩ43mͶW]@Qܹ59<]Kwut+cgj٪oou+o>AW!wp}gWu;1l;UmvS|pYhmz0ք \45cؕ}4Ɓ(Dcg8w|5wgBěb*hXg[i%\G4dT9Jg`i^Ie~Ŧda=ybg\\d99bcb"Rjd|nouw%[15ddqdwꮼ ^SܛkYKAET"۫.*TC9Un:i؎zPyay>1b«lB//{qp+{ښ\{>*+Z>՚ϩ)2kt]\!m`8,iZ(c{fc:UT7#@b>lڠ<,\T7VE$]=ӝ39?ZAǻR216Wcƕ\,/{H3X3cU@sPĖw* qmqO3F`l 2OƼY@Pm^D]ZZ{zhCJ}[,֘E+3":$s yϙs]dmQܮW͞}9!~ |p>rɏkYnm4sP|~.s=dQ`_D6%*3Ym#7WZ1p!|8"Y8fzWZȅYn4pS?:1K]v YZԆ;(ڬs|V5\*SW&]|zW&ɤQSس)]luI=]\ IЇ]ȒE>RiyNLV%DLV/;Kf~8ˉpb$DGLVuz$'k-mO]se49O]z.f3R®"3teW*MҦyͮ9 ʯ֔51.?zy&LJE=,U[x"D3sB7i/rYW3g5ݖMS&C"J"o3[6sIPjr'&I"S(7Q,ek,P 'ʋׄ@P1h9u6jFwQ_J ҳ4&I'PS)kAe:OWԩ=էG3Ԥ597ԣjLRUM|ZV6˯C-k6Ѥ`&<_ft5jbhXrE܀[DEC(YΚB\-,:ӳxWMIl7)Yj3CIDvkvgnK[2gTM:\fdXΚ%دh'nly7Nvw$ ߘ[֭o|?&.+crۇKF qa! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt 'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+k6эk4޹o~/׿I=`Īvxi_U:{s{ P6nN>~09s (EM?~x%yÞW4yz߿MO},`{iWFcǟ6zTr`Yw fZ5h]'!B!·!s-ۊXysTj*}yą]F&f|7ATieZg;ȗb*%i؄[i%d\P^&_1V`Qgdai搬QV>U{9yҝor]eJfULIנd eNI*{jIu+r!+zjPkn)Jtd1Ր*yz*V{ZLN f^4k.JVʫޜ2yﮌV}9pY/iZn ջJE$|:nlﶺhc,$wO;) /JLDdVdQ9*tɝY"*v3Pu,Ļԣ2'ȉ-o8}ldьmWkMin:獪TT"%*>TmxP9aV"2~TzMla8Bn&^{m[LZ jhEbύlrvf(dgUfsAϺ*3fJ\}?rqYU]"5bbi>a޻u*sgf=#JCB# 2[ qŚW Q7ʬz ?N9 bfAA@ꃣS; eBjĒOt,`yެ$O50jSJh&DŃUWnu\'oͅlKhc䪹ElI _ C5e9ɉOL2,[/ۙ 0 c@Z'`?#'(eMU6iM$:V2,/}Qdf0͠3Kť$ZY3А;jCiQXVQ2oS¤ g|1hlmzTqJՌf* ƌΈ)&G3 Os*VddWh 2vYic:!iU'cZXfX_3Ӳ JHDX]e1Sg˭n#QXgcZ* ZD tsTeMuCas ^75b. f$ ! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt 'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+k6эk4޹o~/׿I=`Īvxi_U:{s{ P6nN>^3s (EM?~x%yÞW<\ߦ̯o0|ŕ~!{߁EJ-NEU`{yR]CYP|pyV ¥aXy(!"']Wg 0\+qb GFyeܐ2bFe(\PAWmbhX[i%b)XHLAFszuVVd٘Yziibf\XdyYɝZZt j{uVftnWx"tWjTQSDg٭ lNU’([ʦV4j]>K"է߾Jjæk]-kLت+/{.U{) prcr1.ܰRi_ڤ5P!{核+m%piyrjWq[Nkf`1A&AgةiVơ)lA&^+k2)h\Ó$u+︤AvP؜qP/nV)sUjqY(M@fՃz.lIȚJYhfiSX&qA\i<^^tWM;iM.J*dbʵz-ᦂ}^@:C!n:N:ĵ3q;.z̟Emj˗fgjiX/ww \hB&GckKbM9#XT@F.C#a\ASIs BZ^K+/*6c uoZ_dVOvZ*ljN%s̀+KJ}bשD9-SBcA#ZFE,J:D"XnN#V㰈u ǢH5]}BV1O$Hig)HG6DcLW*Y>-H R$$STՙlFXxGOfReSWV'z3dIIRfR/ nɚ|uU<#ˉuN 8mQ̋0Im3*z%[b|9m&d=ii̪2]0ܬ ȦLL/s͕ ӑX#c Qf|(0"LIY~,K=&8:YLL)NiKzդGRk('5-J@uCdIhj4v5S`1LTi*QJPud'u7BM&XR?8͆u$  ɱt= ]&Q?))י~k/9 .\R^"l.J׹SDqC ! ,dd H  *\ȰCJx0!ŋ"cE n 2"ɓ Ȗ$X J51"@3Lt 'Ρ lQhKE*RSMh h`FAdYn9@o z5%[x׫YhZaW0\+k6эk4޹o~/׿I=`Īvxi_U:{s{ P6nN>^3s (EM?~x%yÞW<\ߦ̯o0|ŕ~!{߁EJ-NEU`{yR]CYP|pyV ¥aXy(!"']Wg 0\+qb GFyeܐ2bFe(\PAWmbhX[i%b)XHLAFszuVVd٘Yziibf\XdyYɝZZt j{uVftnWx"tWjTQSDg٭ lNU’([ʦV4j]>K"է߾Jjæk]-kLت+/*F*/[z^q{())[wkd[mk饷yIUipIvei~KW- KL4,X&/]XigS>wq*YLhKuD>Yf9<];֨j3 .;_K83T% r(XW@?}, iSHT3E7ЂW O(jG Z$*jI O0꒴xFN9ZvEyk;Y.satkyIcd e=vpA[՜)7&_YƳ?"15H.KF<&ԛvVU$+DյTe/-/ËȢijrd I.3.Bi/y/ʒ)YZTRFq.L^{Jw-VU kK^;././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/tests/assets/reference.png0000644000175000017500000035117614504640166017725 0ustar00venelinvenelinPNG  IHDR?1IDATxlYmr&}_s{K^I"KF (A2,0 /~'a TK%Tl.yo;uguZp HfP z`{F)3<"H(tl&ʀKJN%)SwMjHa.@#<VMIGHD!AMA `SNAE#FGH35$"hp%i23R Ԋ&,]NniIRkʽ@K.VB`^~7/^Ww6chefL̚q3vv{hRUiW}qZBۡ=[xG{/R lH@3ܣ)nB9:RPn܅Ba %"@?:r rss{_ꁊK"quśKj0lі @ !w2 Q Ü ipD0P@3h_>ALShC Dx¬ H* b$M AD`4Be'p7 q!n^D(s X 9-2M{4Zc&)V䛛/_7:VLJqy5o~Ίfyo|_PQuّ( cBv t%A(""@"Hwgw>şe1u/CiwWM$o/=479 p C  Q*Άp$Ja[X Ɣn]DBR]yRRbx#hHZͼZࠖ$4SGpw'N}a[uZ-6d/^H+UJ*qyuq])2>~ +VT6)VF5*14&BCᆤ#eGE` 1VD"Zogf%5I*tttJ]B=OOeCWH%0lޏ&I')"hW=DCx3a,q3!jU@ZY|~}jf DX,fsrv6OΞ>:[<{lZm6G}=y^[/N/Ky[vW_ W_E7!2Xm"' J{iP \ n AXlNur*FGc &E [?YN_.Ȫ92%eẎǏV^GvПZ͋onbi$~yu!}TV-{gJb@M "cK! FM!P4hnX@}Y  /5DbV)-y$GD;֪z;d+餸yCB,DBUF5J;6<=(TzHQ%n %"U5Tt{}wj3 BH7a|DBsWal|pll 7A?}9qU{͛b8;='~Wg=,[l硧gaX.e: ݠ=%%а`m0Nn.?#uNz(1Y&RC ˋ]ORBsTwpPDz@].d@2R`CTJjrpg"D)^ka$QbWJUpjB8 Q2*QT݃G ejue[ !aRRbQ0  7'#̫TGFb CŠ8sA(ZøILis>=ϫYY-6I~z^a%PGJQ%Ϫ9x5^ӤVr""m+sf@ FDZ- hrI]>)C9Rg'} llNw{ԕߜ6rrZ-uNΌɜd@``OקgR?DcuFׂi7hte7(IDraM*S-Bi ;S%!*"ݠ)S2R-(PGW @΀UrXD?tyuLUHT#H ʾ.(Gƽ___OvU?nOϞtޭ$alŸZ_7٢)2V0N7ۉ5-2=$~B$U_Y][݈N}aaajaUQ!0McOӝ[CI&Br^kaE$D4b""rرh JXT}44&,0dX *j4&xZjd# 0aKC7B"+-S)QŲ_{}t]N> i2 }~ɻe?^aYnwysq|{˯\^]n̾]ZD9Qry\HH7<}ԯNjbY?3C~/O?钦;?=.$>)Ю;sFcpK3Tvl|hn\whV@eRճ'Zs33"[Yp 7˃aW#!\-ZpXq]|Z.s)-AձTEy`PQl?yu7[F@͐9K7@ q}Xq@ܬ/0UnNYJgJ)!P~\KS0h uQM=ٜ?;Ov?XĖwћMN.TVRBDn&"SԠ{ܻ0\e_A#hc +Pm+Z+@s+$k,DU.1* c2\a%!%`3I!Ő=]EHbD PG=:% 47ҧzhT̔r~~l߼x7m~??zλq!`08_Xhe&f$p ³JK珎r n0֟\,Ճ hgǸ5jyYru;Y{G Hl`Nkcb/S<&iJ7wDRLd$\[oo>K5 =}|e/>ǻ"z$ BQؿo)$/͕EҡN/T7.y8$nnb5`]Ju/`nX /VMçqj1iBroމN5F* ̔mAR#~ 0)W(k2¨=f5ħNeVYvJ%P$>9s=ī9}CPݺnZt=ݬ$wy8#WьBg<Ka{lJ972lH5. +BoETa j ÂB?&GvkBtRj N%$(Ct Ѓ::qE1 mJt_ܧfGJ/w.z Oz=__.:^WG_vbd9VT%i0+Q9ղz "~"(D@jO4)a>012moS $#;A>9Nw%,}0Ѭ 4H !mԈI-@JTg , ;,;K@KC]e Q 7XDd*E?ZꆏsDi#! ; DkZXHƏ qZ]iVPLMH (nAJ{ˬ9;"^2oBZ3 ԧ=[/5u-KVI^Wu#~,s[Ǫ'4 +iS+n}X.ww13œ.C..U.+{lJ׷("<YLn5&{}3U6B;,"&ZJ@f2dc-a0E Xu 1`Q'3T4d''n$Q8]R.!YanpMJ(!B]T̀{L=Qg. Q"R!n(nn-fm K&8}|t)E`[(;` 11*4OA iE l4r(x2sjx& HH *R70dv.@XٷY+h@$4ZŌoWXD:"<0E?Nc=87\xO^^T/ p;`?dSC(p:8yH4{vT۩~= B"HOjvDX9i5w6N`Z ARfS)L#8Nc47RJ"(4qwVTbp^p0'Yu Vswa,AE@PUxDX9"{$G+bLe: &2|*r6B{Xm ΃-9`HPeΎ5*"Z3RZ*L RXc@o؈s)6 B63`6(.Tca eo{YqzH}nsJIj@/nbꮹ?GRWw?n:Oz&6xdF "twyaMv:z,K_iޥ¤#D$e7 b군F) a:LcSe8lG*] NA;w7u*S[0&rʩKI6΀L9u)ҦBQ0@蠇vIE91R@R UKejmhM*rw}y^/g:4Myf @jP5f($..´@RRH~ɂ "Ĩ.}!7isJ- ֚́c4 sftJN9f1w<6Wр qoMbv@EFl hyQ4z'ʿ c''?2ȉ0RPR/cRROWZˤSHIS2@i:dM%2ZY ijY,{A 2 %E҉pGJ&j(*E͊hҼ$s4jvy_Hj1M]4}YJN1I2}2r yq{}qu>4E֘\ pVhe wz]G!D42d-}6A^vgؼ&IƱ&}?`;j<2|~ ?"m{huY)R{j?lu?ԣMxwՊڇi@$54$e$BhHNɪ"(@}tdr`0e8au0ڴz D [Y1Q>!T:u KE\PHគ[pر:6`8^ ه|i1[?⿝*$[;bI2g{sLHH5n)IUS6mdʿ <(Ol![@TFxrrQji^COI:Rß\ Rq;<{~燏={vv*~ }s؍INJ̹V-K֧2N{{漎2d~'#O6@jJY`%Dߘe f27bUu4uCDH-Lޔ]I:3T$w}uJ2j2/krx sZ5Ű:Rd=Já볹kd<4:$( R%i[4#(ɧd8r !:WQ[R`1@BIE%6&ëG0w]$#1ZDp@Efݑ 4! O&`hL&^)hjA렙QT2Фh3AmM6 < c$֐x<^][t%ۚ3Ly[?#,OVv{$u `ҞڿwFԓ㤹~;?}fR3Et9;UMHJuRi7o)K=w7͛}jXΖ;#݋ݬNLb:l`4&$k͹N7pT$D@Q*e.V9 }DZG$IIj]jRZba)iJc;t$5#"as3hkB#39 m 4PCr   o@-Rb;׵# ,Q{FEu:4[j*#:CCxι+5,]x{Б=k[̡}8s4,lЉ =KrIݨ$ƒj wσMUl?~9 <սrx'P(#(: QID@5`z_|Ea{'5=~G! $C!nՀ0+Q,Ja+-qG43M)fXy\Hw!E RJ. $fwrOZ^#<"Di<q/dߩϚR n_nEhzl, Ten8@YT=u ԨL (.uwWXGN{IaP4[۠nDZc8bZBy?Lj 1gSL^fr]~,geR-+$+RH]\|~n7 gZ }FvDUЌaN01o^}W? KVR߼vlb1tU*暟2H'?1ƌƱPXSt"@= sg=maBD9$JhJhFi* OWo^ݼ~nwj)Qz V `!I$4zLN~0D@(G{#4(h*mص+6"H@J, @\PY`'[zC1yR;JR 0̞fѡ3VRN*YzaX45`>fq6ݽ?W\@ x^h} J#QLجuYJdW|b:L@/V| ͣM HaRBչC`R13̶ݼH&,|LM=~ f= d9+aH*"Sپ>ۯ\]s+fQ~sr~99U4lJGhzu~/zryyA P`\*^Am%$)CԐJeRjc5%>0F@n#u*%;zJv$-uKw]~~(c7p$J:>X~tsu($2uئ] Üh2 F I۫o^}W큑s:ݖi׷oo0Nq$H[=Ѱ@L"`K"L` IbMS'M.ٙAF$n>1K=o!1wܛ~ʜ7@ =>PkԤ9(<8Kb)zGO.xI9.;I?]L%n:M{/wz 7KY(XÏs\Ǘ>A}P[ww`-cq5$Xjq~B"I$pk[.Z-MǩTYfpD3K%]oet<7LB0RdHR42  6DBn(h4T_,PeZ,-M\n"OdFCFep AcaPXa .YYָa<2!*Fe ]&C$l,?ͭLhi(f;xZ5Ty}{?}IE6VJ뜔D%Zr9``&IpQ}0=R:@IḮIj@Dh!$anmF%-UR>B DhR̯.n~ɰXkr(#*m F#\ u[Xݡpicoocy4Erp3Z%(S%n#s4 DE4I-"0PC R]]PHP"g:%A|s&#oyx?n)!h<%-yEpXsE&CsPm_)}tԡt8 n;%)|mAFjÝm&T#x9r$EC 7@Y}\-',KI,9kYٽ:W{2/T81G/ {[.MyIFg|$ܛP>) o2܃h|H]RO>y>ތ}g)9r%47֭χʃ@RDB{f`Va:η*aqcYy ӹiVe DmxF @1XD;tTU'0H{(:(K(hd`L$oD׸'SM9[kj2?6)9'hx+!O٪0!W}Lz$QjeaPVɄG|H{^?O 5&9ͧSjop嗟}OVC1u?ч?|}YXؖ0E*@S"F#YgJ3JӜ\wF4y ϱ KQ9~Mx1$)Z]5-_>Kh,iW˝q9XEuEYX*H6В")]QIcV!o9<6+Bȼg'"Z/YA/X^ؽڿ^3:[1= *`CG3--0% g8s5 >Wn/dq)\[% JqZN}|uôkeqRS6bQPD ^k\87f]2 d?=}'ϟ$dMAQʖ&œI&8cNH|$ wD%g9T?xL1MೲL ֆ"" I9/2 ڝ`L&D r߈8A.tk6.6gG]kpG`zя7''UzTwvQB8ޤg$HÔ"?;^2ZBpp9T`ˋ]s]7g'f}.A&3)`mC%9]$ݨQ)/PX@v6ۼl,Q7T%iD[hRA8zn5 \PU6fgWwZ?N|Z^ɛr+G8}@7@J@cglj"ao5t_GLfdҏ kAIcâ(ŀQ^xx[jvs мn_n.cڣj͝.ש?nMR2͓tLwq1mB@ v:.6y8; GAU% 5FM~4h{]E|ɿydYpx-aXnrݏ5tOY8acH^7&B M#z֎ flo,Y:IHNכ%U K#(X+Œv5X nnq䍷E=B*hup/-D.[fР湻".)uCzrym_^m_/.~cl_|vZy4אц;17>4oN8s0LA!8J8Nu?Y)P-rҡ(Q'^aS͋,Nf љE-7ja4:^uԠ_MXtY:,G~FzJH!3/2mtcSQv3,ƣ"ܼI!} \^|q7=_oGhNmu=|Ս$ 82Z֔C%[ҊOH87/sNm՚jx}<ɢ!>2TS o‘! :GZx9LmZ v˰U&fXC"R9 Z[DTToh$LOxw˟?~{z̞_Ň;naV6ꏠ[aw!z6c"o ]l8MEׯ/oC.W]~uvJ!nZJ)pn9jggi5VLc]R$ɢle,uH紿C~yy_>.q!6v.9@7&_F==ϒ@HIwrXr~Ɖ!NH2/YM*^o_'J2NXa?(^x>Md noYVSJC~Ӆ#[MR,$$Te =jAJ2  #r[Oy4xR" w0^zCN@7;#~p7|%:8}ww]'}>ڝQMsmg߇;%$u}x7~3ayrt98>`_aN j+YX'Gq{M!Wo|#94ЙVA H@h+b:XD!hxbh;64v{9q9ONN?7~"}SN؜}!0^ݸ2t 6> vu"y0yj|}8ZwwׇiRNն/iN0Dx0a҃.O ww>Z)|Xo/_P,-,i#w Ɨ͋|'h糏S.N#О"B`@Ҫ VhadT#0/>w/>U%IFe:I(f 9㶎ew S)4p[/@_0 Gׯ"/dBЩzB(U#A9*fxlęRsxy,&%5moܣz(Ek0BD_n"Bs<N7ױU?'{b7X)bׅԆa5+ `x2nR87K)w՛۫7ӮTLJڧS~s`<*aiNc_c hʩRNYXQP^ =3X d\9SwNV뗿8/ϟ ';XqzR5H0 Ca%9oq&QF%I \mV,/_jZX͝]9#D=pȺKy+#poׇ1/$w"'Tr>{:"M/+"@! [k?>}9s{Y۩ј%]=Z3:2aMU.C tL-8wdǃAp}ɿETLXwwZnV3_w7W˓y&`ni}fL{Z9Rt{ݫ|t77~蓟nBR ա;X 3ڔA=B ܐHsNr=;\S^eDŽ4;M0Xb=!%0cy[`lXݼ?Mw^^{E+"yNFtmR+B!#yo/)J̯Yh:1H*򼜞-ɡC(Q Ym@aܪ^4e=ۚ68__{.ؘ&dׯ]oGh)Ӌ7={͛kÁ.!QCЩȲbVGX ן bPxۖMA.Չ̽6AuMu,7@dMg"vy=,j)ʰZިF(UmnD|yzoOׁAXuy4E"!;磻}Ea~gO v$e`q`Sɰŀ0D/X@z˫>dH!gϞbo cb<y z7ob9o$Őg1 =D=1)D"KG 6Mk&ߒzۦvnX JNK;=4MVjT~o?O8*q3``w7~p_.뗗ߖqF?\NH^fqzZyy\n`, Xxk7 1Cq3ɢq?^o^J.?Mt_e4-XetYy},e;XJwkATww}fVL(aETR@P(W?lwe) ]{/믝'g:;UBWS-)-5}Su5PG EWz/z{ɫ9jN=}೜ \wdEJ;{[;Rc}!ܕE4tiy^')RV E.j vb՟?\v uoojh^B0]Ⓩ?oMv{Ytր^!.wZ&MXOVCNjџty$QFm%|DG8:PPbz}WƻۛKŇ?})\S܎fvwgIDRԚvW.)!ױMwf$tƜ/7g?d89[v6%2eYyq~xç|pr!]yI$"MVZ7$iˀ{nl's:_zzK%#$ٻUVĽ[_kp-2\fޘ8#gGDGh>ZyY=췇jln I o_^W0 '}WFU5OO}@l}aҥ܉h="=$QjiJhim ?ĸWXl2r۪EχǏOh馌qyJs7Fߗft*j8x?=ŲIKj%{Hv9w?RYZpj{{o^a$e2$dK(Rr{ճO,nᇑџUJg޾Kn%L.}U/"b)Ξ<)9=|p3cg#{IO'}sCf#>&q$85<*Di-c%в*6?W訩\U⨩_M1:zl'F߹zoyrW?뻋#ݰ''yտ:>>XnN5mrH hw%[V=ݛ勮O2x;IXNbwQh >3|iI!KPuV#bUK.3G԰*OZGֈ~&IBM"Reft@,~^nfw5Xϟ?~2'Aq* ܻA6V׷oT_NyT9OXN>ySj[^w><,Vwe}?Y ld/G5Ymt?,|gC' Ϭyio(m0 (qLQ^\_<{#臼:;i,:::Y4gpBÛ/?r7v>K)ibz1Nfs]gnfm pR秉Vϙ djYv}u1i<.]O'OAE`WoDλNk=Z9H)OjnelTx_o~u:]wq^tчw]{.N)őhh}*]h/teX,~stxxZwoF闿^|m.!nX,V ̩->Sš;̈́S{wD=_2&u[yyKjw"-J,hvH O?8m/^~W_zw< B`^rw(iSijjx䝏6gRҋW+S7,{=}|=z%B$Ԏ]˻חZ}vnӿyy{q?JFs)NyGâ'u:$/#JÁjy؏.zj;!!zT&T\$!$Sz۫gOۯ>i^v>/V#- cx:ﶇ_-;zwQjO~Slo^aPCV$ yp',dJ|Rm$3䳟zzE¼D8wmȽ WjMXǓ~cOWGc{FӀpNw*z6lWBjʂ&p~>+)a* b>Nm S5ML 1j#p(r*[n6g>:^ݛ[>Xv~^#fG|8g֭k//jf}uvg3{>fF|1s{[31FEbG8$Mkns}9]|y}}܇zY቉twO`|&"%cyΏ]x4>1a}z7VEq<ڢ~?QZ/@ 7x o.u bӧgO`1!!*NGDfJ5 $:tWwog>Jʱq/?N~o_~ g'?.y /,06JntH)ޙR7 V+Qëaa)-Es;'uF<vחM  Xl]v?աNg'CެƘ|r{8VuZ}n_7DTzٻXO J0ͬ25;|ۑɡ8)9c{B%=E< [sg/_}綿RXDC/bJpѤV`g?wxu̒` H5~wqz'o֋a]椢ZƲ (nG0_T g~iXx"0 3@|*VODzN!pQmL6/J侯w>։*y:]èiyvvݛnjn/Z%yd[2u9"+UбGn0Mu)%_ZM.$Q"琌d.֖tkl#Tռ.\v9nnƋ>.ޜ,v; `{kcAbW>%F` +tpo,cJE\y19ZmRvHcG~a,y } 7J1x#m1&A+ͻnb+w^1461D,vWZ 8(!_mZ!nx*nX{v''H_}"k:oX-zWmpSL6ONro6]q BVnl[(0(SBiM(g\2޲Ij,-WTYC1Lϟyڬv륫ݕb/>E߯}7(͛Wׯ_ ?l!4]5"v{D 1nrծK Kt+UY4Ι-zR[&Ju,FJ|"rWOƝ>KuDcM_|o[' ,-& Uvy tGo}MY(8淴FwO8{Z]6__7_gNE%Z wF7'"L4Gŧo^y_i._~^</y;0GH)5ɻ٧|@Og܋Ic)\Y8`p ݡ|'Op^X=u+tRnlHGTb/vڦF $V7gIEgi:1; ݤqde.gA&_JpZLݸ kj{H'ª%&gk+]^(n +$)t7쁮h۽5(e}J^kݍ0 }*T;˶Z2^/ .74;{ϓgE 8Q0'őPwZ]r~]. | %H_˯>͉S$8N=MeHѡQSlSej,۫WOrq8<~>pP(i*ܟv?O||͟nA/pݽn'I4,$/!qKI )gv߼0,TtGaVbAicqX.Qב@klu>{/W//^^_4_=}nq:oox24lXt]jnZ.\_ƺX]Ξ.>N"C6TClSMyLP @J7pNz8?{vw;-d-Tu/%w]Nq -KMJ:(4Z}:,gOF` 6є1dtbn]hrX|H{?V 9=6<:z"#c޾_t?moȝ(1LnᎡGc="%hG" 3T}G `qmn>{RkIm6Itɮ.PGݬ?N/ptyƮv; cCQ'OEUږ'%v/=L,V,K޵g9"ʬʬf7&)2% Hd}c X׆ol-CٔQ&CU<sk-_|̖"p }^cdڦC߀]ZJDgC9Vyq!8׎4B{7Kr\̢ۤ/{?.մ{/ǚ.Ɯ|fx _m۪2l*^ )ȶn)5W BCdǪ6Cj^@JI|0޳W1|u[XBz(JyUU9mR kGlf ˡn1"uSC +(h\Ok_hnUb'##z^*:S`>.V|;gO*8ۦһl}ޱ͙0*AG8 dX0 %+Y,{4 eIOќ^h즇zw۶OrVk7!*"62 4=6Ä~򳇷u:}]5V30A.L-'.vKPF\Yzr:׾7]0(&Kn֫fyyͼjّqqqrޝ7?|r}h4ˏ?z|RNME`L3Sks6oRګz4@]Q\-'V -y W:Y-5)l9=dFqciڞDȜ??;}hL9]kn߼;h;%[<#)xXpf⻭}ō|%OEٿ>#v]]+ԟPҧxq>ߙ\xӾ=?} v?Q|P^pclAQc\RQkUn6>*BLjAG2':c|1sM2V]&VM"HvI5rr \D,+iMnfb)bv>xE`OId9/||j#.%6dZy簃6]hyrw(@z&` Ϭ?oYs*:"ȼw?=Fe}Y?.MY19Hc4CeJ* DߊeիW3$ŨDVT%֙\TdWIҭVM!0{byN2aӡ,H 7UZMG&Ťo.G[w?__]6.kxDžvr^.ɀt$m'O0J6FͻPbTM_Ưz Vv{yijٶmLr] FK(U#Vb $9JI4J|5v9+wpF_Gn#6>@d3^a dͳxwx ޗGscr^rdGc%HH9&<ʾ**֧vۯWmLqzzVWѭ{u)!f8g&DޣلUw΅@8˿7xʅl\Ξ,/buUbL x5єomJ5"lCsp\I\U8u٣>DR%HFzH&q<]ODjs uT(!^J[vϋSM-lI4_NlQ@R m\Ja_s~zg]H#8(By7 HE.:, p0% BTVTLGϿߟo|z:)gg˥'O϶ۼm49ER a sO~4.n||⼟ܨoM_)ʊA-G٢o7Ϟ>{M~WbQ7Ln4YD[S7\Ƈˋ`kpuqD}rڵ.O ƮJ۴0ͫEL](#]fU 3 j 1Ǩ]8'xrn^+ff-+;#"cRclV"e;E@`6}zX7`O%'wϒM*tZ92ma~j&vYqa + RE,DSH(ͤ׸nΚhTKv؎ kR(I:ϋgҎR?4>/N=y!Yr\^۟̕bJגw{UA<|V8a'Ί>VO1 oN-0F{jhr/Mo vgϦ7s梚fɇ7cqp jsyO<8DTtqvl$~ptT޽wz?Fdչ'gq؛GlKgȕqszyc7^=7jVxEe_^;|J6m{!f%*iͨ*LD.We >)eM*1 R/yW^{-Gz2 ;2MҿsVڐTyw-Urb̀,j=ѐ+gp1T&ч\BbP} *`9ϒ<٬E͔]o؛ J@ͦ<{kJr1M]u_oj?t>W"=hc^c/-y.% r^W̭7'9LGYa'8QRV_`^i;ͭ'U;6}".PioHSvT]^]\4<ߴmw7md[w^ &a5$! CTLS텺d`481tD0ll1z&oäB5E@4hSco;ne<ၹ[bDzpΌ$2L6'_x\j<\aKx%5?i!/^=TC V8&A+h6Q%$C&٪HW߈V=Ihm4>_s׿TO͢9GTqkӞL).ff:U٨fӽb<hBC}>u;6 ͖eg0j 5NO6ߛ|8%&S@̬Ӕ0mU#jlV9y鋪֔'*A`9\ @$ L)f$^RgVfTx^.F%/q>\ۿ;~_N9v%Τfx7(U*sԬj4M."!2"Jv2 /d#λ^4;Ast%FK=i2P,3B&ؤa(8Pmo[e]4ȒFSĘs^toV*=fVNHt~$ *ʁev)wDيĔ{xngϟ<jJ,1`Kd@$cmClF qIwno7\w1˿+hE2_J.kQ٭/obj;Q/F\\O)r]TU?~xv~7MߟÖJڠ`ٝ^ރЇ?k2ΫDLІ ]ج܄!.vYf9 xqʮ,C !Pէ"rWeVoKWDzPFj6X֭0W@ x5 T*s-3 0D>30Hw셧}Dd17 FvpΩf2aAO]^l`ܙlTM.|{Vm[8לMH~yr/) |&gr/(H28DH/cL71v$ʖf~~$?" Pct=xV5`AYns `]hPA[IҧRd/.7nAOfO,?.+wxt岛Le) 8Jfm(zMw*QC s%F(=߼wp_FI>1}f"dMKgiK`٦màp~PwifBGNݒ$lnhd긘Ȉ▣Ev=ngA9B2R5gC2H*1y,-w?'zCR]n쾳;<ӎ Q8["EI6M5&G{h"Ё9;@ dSV0DLJ?/5$l Lh׮_܋*!~y4.@JR15WeuȔPtoQN,>v1+k A]PG s b bR^^t}9S6BzO-ƶ]퉣.nܶg'M;8{Bv|.Y(k(By/8u??;qQ3+B 3T4o5`j u>PK|Y$xS,;WxQibrqK}4xJr<*h<ƄJwS99&ptxL vT%g`~AAHҸ(B40HHri ͒&%4;@HKT3WF DB֨16NzM;Š/u@/&?|ӱQdJ0XVG rn=ѲI &L'ᬚI }@ 00ZRtV~/|\/d߸vuֵ;EY|}OIUVbtt+Ibq|#n79#FFzqZV>mSJ!0B?f%F0#nsM EmB%41؇Syz4Qڷ)g@i[Ř5gFPN:xY] *<FO=]]e|.WJ}(ĈP2vdYv1(U'r찧+?<}Ak}>MchwL@sT?/D;X) r.16-r/F9 adUqѯ.FST#1TLdHU1fRf ѠOWz1 f:0Grs_|"l,w+|HKfb<v(T|a"$-R5_Fݸ` ` ރH()^vA3n('[9/mR5A.z2r{ۯ}H5JĄdx2Sp٤iESMJain>眪37qYaӭWh@; T(vvGgz 9EDD 2awzJS#X"SI4PʟCzCN}o)#0c'Spҿ_y@JFLDFl[ DFtxc7DJ esdP|@N0(ᇆ*] ٰ:J)Y5Ea\T%7ˋÛ}jWgf{y֫PۦO}>;=5pQG%Ixi2.vba09W 0IbWė`&p`ҏT3Zʎ.gh5'Yh:s&rx^m§6r4—M4=g|C3863K2hͻխhf9.Q :*,&3N5ZUVW>&9$>h9Ç,2!q1 S%PVR.S+/-\:22@nJ7"9F.Ǯ舳w #1HIDATS҅(EͦwE?~-j͖MMro]>~{{gǯP9TRS\LjҎ C(֋pOoO>%H'N䣤Qſ6{C#R%2S^ˋo/i1Ǩ僽kýG>Gro_k.zyw6JH TG l;Q+ވ)cJ Ts32V㺲IdV==z 7EY*|%_'s6zcmwtt"}Ӧfv#G<}nԧFĞH]n>\}A9!` C L]R"TY&>',9mbym;&oЧY@ $B *4ib,G9E"?{NnH떼*}YQuqJ*9T.v)T~靾_9/OR}{W_su?}]D68*FnILPE4E9E^_Gٟ]cvk5$^ߴl}2k7uSQVŚQ4EY&jY5$*}n6mbܮW'O 9{J}b[_N»A&V.-p%~>2!6]x $/[mOl}fkjʂQרDjpZ}_`F|\x6uླe``{T*dH3 ?;Ӕ[-ׅٳGO?;sģ*!ryO@PX^޺udz`.aG}MwA 8٬^_(fIa)ök6ߞ^+_vu+ٛw_}j[LfdvѕP@,1 \e\E*p^ .z@ޞ8+@9Fz 7D9$6L@4YZ΍%@RUzZ}r<|Ѽٟ_߬/U+³+}&=ףIvO#lyT߼o]%Lv2R'3<8o~3E Ir°lIz/?i[ $6,K1blS*"WϙAB g(mG]2) h߇M)"sMs7Xl.FIK]87J OO`wbxwh,8B@!!cwj*ywK(*@AyCllUb{Pb٬}$.l/6͹*}TOs޸y[nMQIݧWxMDDD ! WDk> f]}-tx Ç0茇\c7|kؕUP`h5fSS56Pc6r8!:aqq|vdYz2:KȺ0) =֦cT.,yLw*Րn/IF&M_uVW^w|ƻ?Ql7l~(b4+Bݭ.b,FժPM ,_N}9Bxq/Ѥbw҆rUP{*f.ƌboYəB"~~ٳeZ_WG>)6zqfQv1o杽c͏B]];8 I9"R D#u>1Ɣ a>CK18?c'wG~Av7Q=]yr.0,n0sd\^nn겗9RڈvveZ"+#wp Ƭ}3J<}G 0"Be.ǵϹW爸޾/]G0IyP;=L`Bd׵sH 9fܹŢ,& ҄@΁e} ؗ$6k7n|g?;:oEwA3$.X<%l=( D°!^L~vY!Lvw1*ABT;N𢃶]Z  + iΪYcWU+hgrރՔȋP ^%Wmwb(|H3cI4Ushk0LA\=R=4jsM7Gxcd[ e{ək'59Ģ]>O:JP1Hc;닳sQ誓gMPxCqfv!x!*XC3g7\DOB4sD2eVqR?}}߻yk|z1ceBA 1EC.E iˑg%r !dYxj5>80PGBDYobkd \3_ix>BO~lPi(wAxX y`ml'p@2GJ ovl h`:B epfSl3(8+*$ZwOY-eY,(KyW؇U%F<3W5dE5]b4i, G}^&&Si x9D"ȓ017+_6En1bw`BY#($oMbʚ1n"L(y99X4!X@QqP 3Uf7tKs]&:umQ{X=oVEdoZᵶ_ο.Vf'I͈PW`$T= 9z@9sz`P|2I1?oz ۵&foI/\sg:s`NC  Al2RGL'dys~r@yCWiTʴ߸]ߺu%Ғ*(ޜb&j9LqAx1:em.Q!!3 19]bt7&;߮]$v4>xHJwҾTPS0TU5pٓs0S!y)( =sÏD (LMt2I/5M2wuѿWN͏2UvDL&L M^pPn\m^W *D!%fD0(2]k6wKw~aM^D&j"n/OsXm~pm4sC`OxAYhcC91TwRn"Q$wC+ (@a[MG}j&]_^FC88 # D<{S8jD4z?x^E10a .VxD(0cdmn:oӳ[?Z_~W͛U`SؑSS‘i7 PqQ Wc0|1xvLg3qfm^{- D ]Q?ǎڦM'MŮLI8gj9b۷՜jpҞ^~؁Oè f\TKsq\/&4:vUjj&EQ* LLzfGoޡLn`qBwl RIOKfS X+گAʛ\yg!ņM` DP .Er]1-o~2mC҇GQh[el#Jrpx8;?Z,.rZ[wƇe(+9"sزP{E)@Q. \Hgv̎ 9X̬vT!#?y_$2DD(j(jiԓdڵ/ fd4fEصvWx ?DNedL0ݹU ԁ@;dnZ"?HO90e,:8%} st>T>+ȲN)Me/ݽ{ͿM72IFG#bs(*r„f=_ORT\Ŕ"3#rES+Ff' \; R D&Z)@ ` ]`lhtVU/S3bb7}W5ÔdI!E]k]~銎4Im.</Ҳos7{xx!\GdNչ}E/NN,Ϩu_=½cB"Njٍjњxfr,`ƎU$;Q0!Q*ޗd a ,VUeL@1fӉw/8wP ]6hAa|οR3+qg*߻ \$ /L 0S3O{'Ͽ_KnYVIZjMDiT(DF,G>n䕛1gW쉜QIn̮r~d~8?{@DK5$pQyGԇ*xOBQaj tPEF\\]ο gsL ftj zk^}+\JEY{v%%Lz d63dS1j&"K2BjIXPٍfL4OGv@bwqn?{tNo9;";w_>[MlF4[6&S5bbfG$Hz9_8gD*>vQ9f,}1jLI>Qbc9Zm\ލo);;!0^F<;;[B]I U'=/^g@Gd-cXx [a@n&d HOY''XnS}iolMT$i6UϞ^JLvMnڤrշqt+ر3tEjJc<[o~ˆgs]-}`Ȕ9WHP'r+>>Wwu aԃI  3\f f 9o}1bW9 .t+Dlh /\ޮrۉsqV28ֵfR(QΒ O|47W`+X4D/qsoo񄂡݈u zLw<|vmG䌨,DF̐ƌ`QYJMv]J)ScV5N9i91ɳo꟣Py.a5ټ;2^ûv(i!:`fQ }Ԉd% $d$p..gYIx~8o)ig؇'tCfR%MFwH3/k%+T,_1WcJe>.-B΁K]Qذw0هn~AK[3cEA#+(H:4Mҝ(ƾPbML\4f #LL rmSNbIMET.db;'R^m__\Ƈ[s:Q(l(珷]>J?7~>z[Kg JΉ y1> )e$Ó"I9g*&ռgv>('J8MY]7s<"&3.yFOWeCN(zU@fL4ӎt;I-3 [I~ryi9Ů[=O.ܧ_(ß4m|h K6iUG!r|/yw~r;'~zzygryQ[;zF5}Q)KIKȑcreB{?LW}' [t:yC,fqu:SWק"+ \a~`  49#e_ 琙&L0aLRNZV"gfLhJIM'9piIH"SLl9i"e `ӱrṘLukm,"ӣrαӊ\|x뛿ⷃ+ʉO{{|ƭ0OITs~׍^}{,'z;?>#X.ö{ݦ ǥ1Y YP=*#x4x}Y_kO/''\MGE8ݫ&"kl"Pyv+ɁH4׼QFnzN:-}0.ޑweAat4ab͋ۓOضDPe Ss{2\VX;C0h =.CpDE10l2@::Y2s Jf2' 昉J5Ӱ^1&YL5Ѡ#RN{3U3jSh#jart8={7u1t)³Y"")ʬ;|W~q6α\1PM* &} y'?;|KY3Sda)tH)`ZbDEja_-ꕯ}ػf=톞 ݉vԣW̬DTyf&&agKů)@)em[ٙ]r'^3Ï6|,f }?EPd~7nޜ]R_>ygnlܘk&IM0ds hLΑ6..4;fgI聶UHS{~ hLNeϗ}Zݜ;wdC6D.f"9xsŽw;! ؁K [F(fdj=xBJ(hSأ,a6b4K,nK9g~0|.&B ML%{*i20+קG;þوyWVURBbǮh6+WgTň}qƗCgJV#A$hM=(7emT,,!9ͩhJp*50Wz}̘H~%2 Lk+ِaQҡR#VR 4݈a{bOYNX<;жtSt;?ȫ.yuKgگ\?Oo/_siAޞ?iɬcZΌХ!\OOѾF~Y%v0u2yS2c.>;ꛋM5.{@ֹNbIjfc+xf+ ց"1>\ЫPZ!T%%t)5"yO,@7YcD)ENjח*څrezIRϖ<ፗn5 V51;I}N&·Ե[fPT\pH-TI jჺLR꼫@.%X$ƇlVh,3̀IV\0 ?\*f5t0 V%* 5#V*#h9gb8e2CiU4^}>_>'j;|-//S'nwNH t矆88G_x5ݬĖ/zڗlml>ol~}կF%4hr4M8Gm|Ȳvl vfB 0r9ff]h˾%TAs_h.NBHFIt)}y~? MNjҦ{i(6MW T.~Gӯu45:Û q O$Q:!HS5(e)߶H5{9rD)K7n^{Ku_FP4f}^Vcɉ| ifI0Hi+zI@HIj*z~bf$mj`|4;qjfa9:f20(sUE;罫&c?Eq/M{_d`@4 b&fxqaW^aeBDsn蘠dp&`LoB]%4«w~ 4.}ٞZdfM.qگ:l7k.ˏapQ[>y3gNϟ_4G?z~$:^6`짳PC. MGߊϖ=z&S/Y"ʹmkQo}H{q]Vبs@T7}\R: Č/Q?,` {۟HE{\c#3Qǥ$bP#.vXF%s9X&FPM}J3;Ǫ_yu5y,&2SHZn/oe](L\\^qȡ:.&s9{֜w;[2d~G>ŬF_(ק?*(+?yoꍭIpnTt1i"ʘ@ R=GQ cA CR)3{jFNHbE9FUC}q8-V =3IN&Ƴvwޠ١@q59z5ˋܝGRQ6ePhvY^|NPNG>2P_*ԹP88Gfbtd{rףY=Gޤb2qŌ]Mb1k;bx;ŏ!L] `°55ʮ@oMf5# t0J/?5ov۬6nJ&^Vezt'#Q!d7 }˯}O>ُ: ePd\9W0vTBnMƮH̀9 ɍ;no\nMȱ/kzr"`. goR\U f\9>}T-mKa`V_(ƾx]5Pʦqݧ乐ꑟHh=ٯV/R|P6)1u}E[`>8ɍH $t 38vCxP4çr.urҘb׉NQ4Oo~|-SUeW}>~Ͼ=ĒoM|qM߼ί_;qf  q6%rjjvK[Z΅}O7hrQEZ^4I+R:m:ʊk.1n>FmsΖ[+evަe\llmmg٤7k hGBr{@8^I\K@aeќc]7X,fC.k#23 !X_o|u\qyͺ%b()zl9'2 E,N|`|t3a슱8}Sj.NggCD~Q<]G(vڟw/˟o>*^6X)`l;ôf1B` \L/jgP lW9Ut+>hbuߛ,fi\rN5g6+UNݹ=-Qڥ`oݸu Ѻ};/f=^cd7nQWv8n~'Ж\QCd<Y lDⓧqݗ'Zs.}z^OnܻK72?qt2?D](,+_$Y92j"Sݞd׻Aon\NeLvZ1bdRw9,<mt6v\ ˭GQS\-ÝKzw؇nCҥ$D Yv#Ǩ>`yoQ18wzk/D$; |E /Zr~>j ~[ÂtoPO=k,H>)S4w>̺woɉG.i>sS%rnVgڪ{kM./6ƳI6}NFլ1>=eZrf/C3V)6FP @xeyFV1W_ɟ?ÉUd kĘF25 |J6U&7lgc볖ͭZxR 'ޔy8ZD')!"6,D!$:0RF\ L{w-P4ȍ4'7I59G6;'rNJdw;F&/d O-BT^*\8 '\uUtRdXCL iEYlrpDgq_廀؎Ҕ 8qc5_ nN7;Ye B?lo"2rJ7sGYY|YCm'II Ɏ|loE l}QBOE). }t@jJulqu+,e|&7>Sy5tipo4|BM|"r1I߷A?Snп$z JUWDQqlpTdcf}_ P )V>ӷI*RV).fY',˩@(ʷy P&kkpb`D9 sHFiERmU6($ #* MdVuugwE9T41^E3~,@ R\<]#<՟馼kctG(3@JD %1ItʨUfT٬fbmf|ޝ,cMsݲЀFq+ jZ<~/j;®*WFV"'$n.d[ i08>5)zB)ZD.4; O:xQ=en~tFJ4\Л?BH654خJ!5+_3vuEZ-Bƶ{{>~nggkT$UJ B6|ל &"duVm]"V%D/]ζ/M3q}yzZ;S|]lgL[;2tQ  I>+hKY|lY:Ju_ϨmOyK!HODlD & `DQZKJ!$Dg)%0'D߮7́P[PD2*_2J|bTk:)ˁp~)5Y[Ţ>]{J]ԫ8E6WEo)^eYlX7YarR*~s@Pܼ16EFu6{[Om_6lCm<66vLg(_-EgH/)AJ}2WuBxh\7iͨ"((a}恋_^4`詭#G߀]Ꮚ?S}cX C]l"GP&vO.,wmXV͇Ol75a@T&,%cQH ԖP7x( JTgzCPdSBJ&_b>]7?A![> <ڨ~_B}q:! 'N!G]!j  NT {Z{K—nzUe=ګ_;}noFD?`ISmFH">Rd"^YE.>h@D jZC6}9K- %hBlkM%0 ֧s6I%jyvllqpTOfaٻ2ĐBʲ,닰O #1ej)Qm]:8'snMٻy+e0Wn<{UGTټwPRſ8%$BΧJmelTr%53y[iM^@mi K" S}`')JP SIẗ$!1DN) #rFp vmU-٬mtgc F@U$Oz7;8# $YAkmRtbI* He'cP%2YJw# |AQ_I4Nw7ۡN(J R" X1(PAZO]l! EK֞֔$tᡀ h-~Ϋ=#C˷ok\\?̭=o>LCH>l74q4,:6Gu3B bQrxVԝ?;y֓MFН8z^&u7Fҍœ&Uݳ'd~皺ŕKۨaa:{կ~ꮱYϷRd7?893\l+Bз2Bm˳z/GY{EpR0" JAe檙ρL⤴ZQ ^M*d! Rjqw CYB蚺NmL η`{ uN>?uca@hG{BJ`攒Y/ybcsQC1J&dj Se;F FgW^_(r)i4,6ƓJ 9uȚ(hWSry9dvy`ǘH+:h"c?/x=D$HZp=Wpa\ "zԎrЩnW)- !涃ZmkuncXI=v,U[t,AŝMי)!{Z\Mfou1dʘxb#Oz5M"p޻Eo r)E|WUX t-&v6oh=:؛V9&{Osju􆣢ߏ!8x}5׹jPETD)1$DZ)ő㺒~ 'AW71|3ޮ2 {~q웿ߌtɩiO1!Qh*2_D$|Pb1V%r 1 3H-0jv5=:i] 2Ռ "phSrKe'+e211̬S@BBDQ]Da T ?Tu[59ZݎOAӟ?~xm,(EZRL HVl'sm3{q<~P I,ȦU`7GU=7e?[^?xӟ߿[x XiQ .ݸ@tX2!6 tK'v^ ]NO~0yx1p ~9_.Wu* 3h_g>Nx\LGd9yxy .z 8vNO )S1Egh2DffmL f&"qR!Rpjn -j&ϟ^-у;w .Y~qRQ^͎;=:R;wWy0if$yíkvuX +0K?O}M^ ;ߎ]hHr%Σq;:į@l)/箪nyVB :J !0'"ݐSnƑ%jƘQY(j'*[tz*/@8@)e5㣻âYvq)G`D\U`hn|pl^ڲk;Ziba%h!&Җ45ʘ mB@DPh:Ḱ udNu>zx ׹6M>K2f$+-7 _ܾɷ^kjС< A"P ʾ~XxgҬɝkGo=^B\۞>gyt٭py|Y-bc}15YuJ:~t_gUgcvBꗝiw11ڣs |͝g$.hJ@ " () Z EPƄJnXNmNFN qgJ3>}PdR3_߃G!Е1 I"2`+_-&gEI1,=~P3="R Į"iQf22ʘ1hu%hmœFL)&(C\XZכuk.LOO9~J|ϟޒ? z(Sc{eo?iTK[ V{`;?sv?=i1EL"Pybb؈K'o_ L{ôz2VaU1b H@La]Y8|_.jĥgWt?'ST*RlGϗӹ2;ΕnEZvn:tz n4)]DO!j QbtZWbftx_fFQ} BuhQo,ߺ/$ +!*h HEBh#2VBTJc!plqA굫O{اޞuDyxvkNA%,,u?gxNMl$Dc2Rtx3=gsr!uɯ3 Ɋ/zݰ T !!9ħ_{[?Jiv HUT ŚFX!- #`F$zbx|oWMkP!; : rhJ ^E%뢃"!$.C M&6_^ح.:M)Fl^*%[!18m5Lj%$L)FIӦS̚<_4[KȧƊPfdDҚm[/<}'r;?{r?%yq9Gʲv !)`^ͦL{zZ$(*NfT FBjū84J)aCmZqiTnR6Z,+^_zNf0BLd9iƦ9|>#?]XF+.?Us2Bm˅ Փ'j9yNU\H%Nf>1YerY-m+ešLX)~5[Nj%HS@ @%)m5=']pME@؏%x_oA$A`֯ ^.PpGIY^zكͭ0LOLf ibjF7:YcDǶhkOcgN sbd6q#' Qb.~ڷ._LBQP1 6yV%`jt NNB!-&48GU ͭowwo?ȤbFh?9tR")!kaO z j||^mc1!I"v!U_e!Z '"9YJ(16DYY\S''.oO*}b\ ;bS^dh66QfgcZMT'\g8Itl-@\]&ںrn8|Ї`]P N`eQyލ>?w:6˔*RJ礵ҹ26!Q!re5/ 㛧m rX\lzƬ$k?E9 OlS֫T`a'{O2Ivrx,jF(4EP*)(Dm/a3bJEޝ!zQ/δ$HS]ڽG7&WuPaL.Ppz\Atӳ9x3_@J{]ee k;?~{6NHUC NtT}҈/2i#δN:0t>Ә~f{$M:?b2Q|3~bw^݇\-tN@YN@:E` Դ0Kgb})Mھ͡ STm\D čg*@ MeW$?rsRS4Y6; Ѩ!n /޿1r@I{ߨC-reBF]kIbt*I SeË>>=W~?q?LDWsK1xza(L$#)*~p38_/\%r{8}2]WA EڲYZEp6-3[U QSheTJmXA Be)v7{~emZ"EЀZmWƵ:3jU.l{7mSpH lf(¤>8L6ڱ}qiN&ղlrLm>llj  FDB!׎JTRFc('|;\zc<_RQ._1d @ۏǿԭ*0qscތ!u5P_eҕK;[Picjyr H#ɘY6j68w(;sNo2jyw@0Ajbk-iKn QHl6Ӏ5 ͠6JeXלX18q3n|ħL@\W[;z>_L/p$(x,Bg ̗ǣne^O_ZNΎN$ ώH()~IbHE.VLZ)DDŽDh26J11'؞N4b/_}soג*RjbTѽ/dÇڪ &bX|:k*^,&@M'İ1}+7ţӇa'^9 ?pZ/Y0'AXD ("Tfw[ӟ<'B::2Mt}vEL ɒKPߦ; 9{d :hfcx®-=ȼIb"j&eKeO}!k#'`yho,:@JXѨ"l2cEk,&ST- P1h8~rf:뒂Z16`%!Ph)6)9tjNoJ=G{@\7b&A ħ` f \GAQ@gz֨#Rdj~wJ&'!NW l~m݄$zՐF34wlYCIdcT:^ 5[Slu՛Lؓp(}esi56 )llgL]ۺTj3 #D9DWzGgS=ok %a z~ѝRW,JD(*f.28jw!֞~+ݾ]Y˽oYl~)٠ҙRN%cLuc9/Q^ܺ-֓~lݫG-G(m{Alݽ\2!I0RJXekXRk(HRT)?!kCQ1% +#F18>F?פ䵱&+,Wm)/R9ѹ(@H]f`ׅgvvkKdJO' ($IםÑ0ʅ"M(wot\Z>\[e$u /z,WM9X/G%k)AHRShe^ kE U-rXmI D-)Wbڃ8W %T;[]Dn[]L!YB,KQ{!˷nA|Hp7%V(6.=>{(:fh9%͒Ȳۭ< Ͼy~t4-Q}T~< yE?[1A7+brM`lV IA<2rA$G+N%RՒXT,\eR=$#@*RYJ,?~nM L2ϳkYɈ_f",43 3"LQ%ƐaĜWF+#s`E&uF:Ƹ}4֑J/SbEsmu2u!^W@Z#z W~gXTe:kv6ԝ^狣xo4Gk:!1GI\F63%qʱdBІo G8#֨cBu9I, F ~ L|DCSjĐ[V#ǔ]SUz@̮ojY׀mF jkw2hS @$Ւ*^"ey=7u!Υ>,ް[{ӇgØj*p-Ond62dWuHB3V=  O|vl] Yͤt\߻|xk|BQ9ItYw(ɷS$Z,׽9A*+0&ZUI ujn)K) IY˭#!/NWbH1L*hUG|͎1v13ʎ"c(]ԺpJa??R[?Mz^,>j=Goħ O SJ Fkgg"` _noHP;wu7ۗ^?UuNQRӴŠUJ)ԥZ*L Ŕ(/ +"#Uj_&?Sl  @6چ_4iO?RUW̵Y˥ݭ˺QY>r6}Z@I7Tōgnԧc.9/I8T͔!d4D81q4OSKyl֙VF \[mzQU}ٯ#֝d~t̖Ik2`w`1w&mMx ul6/mZ&`DݽZSDE]vJg;r4x4kT~1Vý,,@M D@"g)2TVKط`ujM~?WnVsQ(,BhsǧVUpTB-Pp(6!1 ~|w昢oE9SR $Eϵ2C&o녫Mȋ3mPeR)]bS'},N/7vʯ}S;=ʷEDŋxd \שE*;yWw>{[/ LGjQ];=1,÷;sdDã֕6B 1ĭ[v7e8* ~|ڰ$)9"],Ζ&$]ux!ڥ&@-ER1Z?>lƭ $bS̭͕v.3?k)MAcB Uj%|ʽ$bUj bpX)J;SZFJFA:AVmZe2JIBb"pt:&ACXV݇O<^ kTY/լ :@PY8f8|MpcTQ5>з|ղ$t^8Rℜ<̒6բZ)uFYl1]h (q5uEWl9=k7.ι__7w]@ԏ_XoR @D 7~9YF`X\]v+ձUSݻ:YN޽W:hqpZWKN>Ȟ{YV к\;1Bs쵺iY=5[̎cH\([B,ChZ}dfM-n\>_͸2qbљ,%{c'[TFzR { Sra?2ɜZΒo"ey&*;;lO&-T%$ULLx)@BEJ"ol]Р!I7~ĉQ)\CYU D]`~էMw~|yu egO= 9S 3"+~9[kZ陶=uSUɁt NsJ7D-{rA)wtE.dMȞLoC7!~{#j:>]P_jR&ayKs0Ou3ôtݴLf XQp3ȭ-)Η'!&vWgLs\[E.ɪi{\-ύArфѕ:HH$_вk|:i"=|M}3M)ʹMثuY~XaB A*0FaZ jrfHBE 8Ƶ\ }8?9 ^MG}r ݳ %QQ-yR^_/1Q"åkM~Y!VlAJ,7F~9H@,JOb >n77~iolg?.jew.q8;9ˇ[O:TGEP^.UFFt B^7ζ" ʽo|?Qfݙqʷq6]"Iw<ӻUz2F;k/h+ yPϳ贻CB7OE3_xfQB({/ ]3- 6" 7θ* S (Ccu5N+ۻvL:˺޾Tˬi2oίe/;ńJ$I7-: P̋NgawcH ѻbZ}Do}p+tM]eJVv]Mb 8sVAR8raNQB//\C% M5s:i@,DQT"MB92;o|[+o2oOFYսvr՞7wW$Pacq|ər"\$?jEjck@H(*l*Bڐ+W}׾ٙ@a&=M~h2|ŐO}w}*˻)冀 )kM`] @!o|_fD)jllB)@7߳ ˃e\M&JTgc|[/Ce +$[v{CӶS?׮Bc~HQ2kQۉn:}کo<,Xv0(boVs;mmvWo},#I"PP+kb Gh8b%gbsx:HFȢV@uem|7,H (H<~t/4s\kN9!fMImUlyxo~ B1(Tlk,:aD={k+K/NeJYcΑ"kP" :IPd|ǿ_뚍x* {v~>eZ& ]xf;3˯GlH@` JĠZ=ڴYd'GV)b,W#%*ك{%?_7m/&\\r[]~|wHBWW R+^ylvϿ+uy RHRR sikՔQХݾ"Fa ˆ@wٿ|wGDX2E6 $AyfNTU\X<2@4@b}J@.,⪶,$]04 ^ATІ_ܫ>pZk3͙];D)2){l2l;7/}swo;}3RmE!IJ CЦm߲FCål\j%se&Bfm(LoPbBcEEiHѥg?"D)qRѿYo1Ƀ/<{m{Vk:٠Y z)$k|Ϧa+BI|xQQ|FkY7UY\dALG :z0ӹʌ);W K~jXh^5(z1S61%"==:ό 3:mEy|ER6z||MY++cN\BI+hEHXP6HIC:PˑeY-@tXgPv,k`@EH` AS5:1]8.i `S8@!K$ X8 3(E!2m,f;iN'/~%eU)?=M}~6>{|8==[Ϫ@~OiՃ?ҳzc[־DwOo~//}oۛ/RFղ]NKXM`w$ъ :@̝_ͲNcVtڶB(HDrs{'F=:tBɹh`3Loz{;7n4޽PݥH9 jDEq]Vw/6KQGGw smmVi_J9 {vs~/' -!;8ؚ-+onnPy T]S`rȋr:cN*|\5L:N"V!1%Sb !alXj' z cl($1JqJu QR+iE";ys%`b`Ũ2(Ó έR0K/^xa+/XD7/9xk / F &P! (`DIDATm5d*U1rF}7_Ƃ''{g6y4 h޽oz_i]YbD. J68./o_}r_lAujuS19d%hmD"jeH>$f+J^)@}F$uHuh 2xRtGo~tJdGYbbh!O擳O~gɻ@Z֯R?i TY +EO'>y"s1Wݿ'ےU2|=Yz v\m;GBZYn䴚>5:ˣ3_ϧnbX Y"lov2_mHMF,g =mb[WDa޻1? 2B*Ϻ^EI"šQT`lbh$lv@=\)pߺX|3vLeD$T /e}pl]0:SXLȠ5uV&Exn1jL{s'oUn6]X|mK4* br0;gN磾K`"V=x:o;ݝM="իfx~Ha{ie;}nn+QڜQ[ B `ҶTÇ7._>+z&dzOW?s8 §^q R6WkQwEHُg7\.d`Bk;Ì2Evgs/k;v mlfIɬ敶Y Т^p1m׫]xsA%bmIeBLarq|~RY/^Rro_77w} 1>>`)Inb4mQd-tΏ0,2 Rl%* V AA#Y_&""(Ξ+7(tk~Иnj@ l:[tÕkUɳA,ᣲ^|c$n| aՀՠ$&1, "gٷ{|{g꧿7. vAE0ڴ^)&ѣo|/!]t:t 'pe/cG&JkÍj2y7_}Ց?{{%"YFHR mj$AD':/ 3TJRjRY\-o=F}PYX.2rEqĒΛ(Oq=u3Vάݭn>:XTSl ߍdlJB !c;O]Nއ DNfbpvtI o7߁,݇oRji-6:Ŭ -7.r|bLXE/-xH"DI!2@"IE pfńdɲZ')` /BX|QcB BIe Fc+?뗮]ȿ ˹0nE4(\(.Qi!DR$s=ʫ/ݼbњQ1J I(_j%nYW? ><:9y jI5߼v.tgL7EɽՂ|jS_! nU#R*I ZPtd֢9E 'YOAG"IUUcL% M>.th: Q_OlVخ}3̨A!u?Tw5[+֤6wmlo1^j8m^9zDezٌׯVaΪcs/9ƓYUYQڬkṡe9hUcĂh`@(IԶy^z5m_=:z0;v̴(R!|1nL:9:YaQ4[jUYb"80XRHRL0 ~` .$D*[Ә 4d)b1f )7]=y q\LIa pdԴ!,a@ S@ZAp !~~|t aaP3FPv0Q[[, + JtSNV lS"@Ԙ21aZ*-<||g2PW`3pMyeKFC$ɖÓg^L 'oh_lVt7|R%_vm`6vFhGnwuz'bXH]s"Pbe&&FU 7Fq\fK~jĄIbu 1LBL"MvKDS$@J!PHR Ngsco.ʲRJ{R I$D"(5(^vkQ/WJ DҦU>ݏ <(hki}L=$ 1἖R& >wKD+,*"2 >jĈα;`NPt#N?Ovr|ᛷW':['HmTk{ikڵkܸr-@ 8 @R*$΁k(JH @@͕PXN[֫zQZS[/ox61!:F ZWj#FWJ$uE)̲) ?yhن_B$VD^ka`y? EL0?7ɩv|Zhw*@-$[e|zly<<7'^0uzbA=#'':)B!MmLfNô6.ImI7%Eռ^fd2ƃAҶꐄ%##"VmC0>*Y!H"\c`AQ,U0dhcDp'hRj`H ]Rj/MTΧ*NuX)B %:%$,Z!)oCT&um{Wt{+_' `7ox󙗞۸q ]TM@1`(Dt()3Dj1 ir+Fh) GY;_s^8$dtY;=n!R5?ѽ'LJ-|t`Ɉ@Js "H /3k׾Zk, 6e;Xy?ƀR]MCdcQ Hroу2۶b<{(`< )PnUWϧ~g~vbK"~N SHClwaGr p{|xŹoɽ]]L5!<<8=9,ĘR J4'oDT`fDdMFݛ7ZtYiTiAi@iY"hiZk(x/(@NpH%T8FE%D̬JB6@H=ȁ4h ֐w*f$%( F.3 o!!.}^2gՠW_֬{o{W> 7 D4B$]t_@"$aeMAAB kDeA\v`(i;iY/vQ8bjTgcO_oYHA&(:/QiG-\wt8D-4[S=(\,&Z4(b}8%  lQnS/dno^͗dzb1)4ڗ_(lLvoⵝk/v59:ߧ.x-zG u3L'.|x#Ď 퓩 W"/7Ky=PcjY'>aa%4BZmHvg6HA2 tx%Y qj1iUaLdY"I+6Rfc0Ub *%*Q؋' U .zȚMaD'0 I(cP-C6! _-:hLU\gNvfnf1TBڗFQ"V]/;Ǘ?b9]co}ɲ|< D36Dmu̐:Y/dA!bd@d otxlbl1(4FGg(v2=Ӆ4*H.")YY*/j2>ybJ 06S A Y\ uK\+%AR $HQ<+?}C!/`QX\~K~S^$ V\W"* SMMYP hn0:ha9 mE%*2G&F!CKY}ť^-5gj덑n PrDQr4*6^]=:|RټRώ 4pɊ!B2 P@"aλ WmlUt+ |Dkf\M Oӕ2FI5mr@j4Xm'>";dzw~ꅝmjgw{s÷糱v7&O=.&wϏOz{xΝfi/ǣgǫբk%Ct)F糕n'2ԫ&HHgY;l޽,F[ AN-+%0Y/MӠW?&1zbP ͢iCJF imҙ- 4 ArĀZ P)U-mE`A4BRJPV~'rx轷̶*?Ͽb35oD@Z$X+R$blm9p{|5`i*X(PXM'Y[z+YkڪKBllt61Ώ|>~hy6ݽNkk/vU͟U;99g7]^1nI٣{wy'??زx_՘D8jN~|` 4"P]r|em4Ju ʹY'"+F˗SJHZP0u:@ݿzpz~|YR r{4Awe{&j/SDWܵoA&U\4e{vrT׾Wptty_;\VI-ez]iǡiE DF#@yܦMXE`@p`5243B-e M!]S%|AjQkׯa|fa9r7/yjŢ66;_ʧ<#8]+XUR"H)% 8o0g#DeBNB_aǿwGk 2Q.E \? F_xoPv4 ֝fvpY6{ʤi!b}<+]FPV@E@1`f;7^(nvR`l<{V''g|`5z?_#G}ӯj2"&GCղ7#BJQ,˃7~soT=kK/ <l(k9)A"Jk߿rA?O|[Ycl88=9B"ڶEU"1ʐY4B6&BJg٨ן{v|g?K=~ݢ߭tܿzV*+ k0\`q߯&z9?@Z<:vgR$ &9F 3TF̚zrbPcS~ZI7kVmDPI~l.*ZR#UB9(2 ^;Ǐыi͌O 1).$Aԥ#J(fB?yӂQm8+= ΖGğ,Gh !F$"DH5LGbij(8gM? YݛYkQV&tJ+џ=&I 5ZnZ$!n5mF~p#ȵj!2-(0$Dy~o[}UJIRh4`T ͚kBk8-ϭ~s{e:oeo3I(1#ۅ͆JBvbjNݢkbUS7չ<;Y ֥b)yͼA!ueUHXDj_:dU-6zӺbBU6Ĥ42JdGRپt ʭ*bQܳ3\on/\uo?)+;ݖ]wi6>S"ʖҶ kVUmȿyG__>y.''T_uxڶJ%;͝,uyiwd<X*Pf],OO f I:VEo,Mg^ҭ I ycF[1"+clմ6]-ܥ$QaPS(Ev L|m`* $h4l]0{&°f+v'?yJV C"a=|_Qwyx`w~z5bUJ0  !$ X=ʁ[DJ7ٛvm]o/J>{)fCI1&@7eۚ;$6:v6sI) jI*3H*Fo͛2ʯγD PmQ[5!C( zrQ0`'snЂ2x:\tuG4msx:oϜttugMddLR)"菏;@aZ|fY ҺD\.d!ՠe 7vVţWm37:}-ipi!$Ibaж&#@!)Py: O>:)iu8993T[F Uщʳ2M"%Q'Nu6A;RdDBT%imӁ/Q뚝wbk;=͕kstNk[P(l u]aq"@|̀.fP'SҪݤewy/./>OS Jy*[w>? j6eB'EPY+E[H.`d"jr9WR {@q_?ӿU?*{E0m;!z ΀AVRκWόF*H.sޖnRwpѾxy\6Ϊb6/;S2 !s!$}LCbMyk G÷ϖח"9,;>pڋWsUJUT>z l1ԇ˃沞Z/n; 8ǓnӈrXX}2uFx<ʯm]/NN/2FH$\'a(5l֩IqַŢ= ,IP)c%+I+|Z fݛ_^L!C)c]ʹ0Bu1 Oz#|NW& aL) A_X iIRY4Zևm~[2{{#vN,?nsw|w{cbvGRIF mP2ܢ ʂv;F;"W?wO?.ڪ{{~0<<($#e!$')9L(ƕ?nv,H[,٪ڱ}]V-@B,RGǷ\Q $DۭjS>M,"U'vg OzG/Ms@K7]bbn5%]N6ŝi㗧)F-bJi",\- kcZҰ̗WŒcWՊx:%2Ӄ X}`fsv\$x@Ub0QU@Фu4wcBvfn|;3Ph h )[mI>65A鬪eѨAfH,,jTXh>QC`$H"QDrd ͸kW??}o~~wv?ݻAAk6VAm@‚J XV$ _w 5Hn@UXVn9~o'ʮi.O_^YآV7. /?"Am3($)(v9wtwgS@hV )"T@ŷL׋N)0W.g'g^}_E玏omڙr!ز#ON^Ezv5;;a6hkECFa5Y3t;ˋ~jԌ_7m?y* dtg=qZ`^6 !M̎UHY2 շ>xqt%Fݽ© BAal( >ͻ~Q9vHP,XXUEC)mHs`զ@+g&ieY &Pέ͏?Gݦ]d+#F9 !ga/dz;?G}_KGoJ=z1͈Jnp @YjĠ gMT"+PiAD`-(JDM?>Fo{5M\gۢ zst|}p߹ɩ1\Ae HЦO?ɣG 򸮴5SF7+m zT+e|Bkpx3m "jG/b29}@j&bGF-*tgڴbs}}fsIF`֒t{oIYgnyřAiMΕM9!i4M]EI|GKhn֋9,.mۮa΂wAi+]OvJ6}hh)(E|@6UD &>y1Rs!ἎSܟN -^۳e{uMUPԣr"|1 * 3Y R"{Tg9qaQ &L,> xӆ(A`x6aB(ZS RzHzA"@F(9JR!DAB@BmiiܹWhUJν5Wg?w@J+m&@ZW_\-嫳'7j"DѧQ$Lu`m-Yk}o?FJ!@TIi[jޜ|7={js+BQ9R+u]>@H9cZ)ő&Ѡz÷\p.u27USol:DN/ϡ Yu5?mgT, 9wsyJ-ۺܽKԔu[RW,점be]ýC $@$)6Z\.;bΜآ(Q\fj}ބ}H! e\-'AG(X,iT%W|CTM60e YnR9a{mOq`[@;JI@on m em <+Jq#IF s@`#rFQ=Aܞ_/gd ((͑"tu1F]=Zwm=2>/|Yxtx0N+2E9Z^ZiTf/dN?{#M}jm{Ii"3]v^]4J3iuHW ĐJ{e'M,s&bh9gD*H0)1M)Ѵ,˶,oPj;|w( X׾ FTy[s&`25ay}l-06u @#jH$T9ܵi얛{.J B8UQzfd~~_-$o٘9i$t]0NPvBeo|4soݾ7;o} Yo?rӟݹ{[!UFDnզ#M̙-mVOS#*,g\*O#bHsu2ͦHɐ5}BQRb&iTtp0؅U %nW?;ki2^=/jT:N{^/_=>UZq_'rO?_>06@[x_.8z_]q?uEŒrbvX #4sH|/t2n9*7_ ԲT81FrVQ&ӥz1aVT&$]V2l/*mBENNti7hn]soNŲXŪĜ@w 9 $& n.}yC0[!B-(E:/ΖWzg/ꅫ2$J;]直;W8$.&TCLj2ۻ} yLC0Mb~5N 2*qg|~pWH?<9G?_wO`0Umh\&NAbɘãa23$dfȪ q褡ԽߗCC᳝gbp4+xq*<'2oY {ګ'fTѤhkz9O=\'ݛMW_JdR,oݻsrztjèX*$M/$^7LdvPHE2pΤ7zZ ƚM8l1_v* DEmsN=0M"6,tY/C_z420MqLecjfT:vonGP6vr8|gHJqk5GMmk"Ld Axb}959 z/x4shpt JqY U{E`E7PQަ$$D"R_w.m׳=F웸4/O|,m5{|x];*aKٹ/_ظBrvpΛU6ރL7?j61'rLJe[="PNs mL R9oKpDO2<~~|Uv=_}4AzmQ+ uñIu58><#]>=QEU[뫗u1\͢EGӋtgp\jhV~0YZ61. Jip0P$mi:X.lduvzp|gb13CKZq޻F's84~Spqz Y#B QB0l۠QMFâ0WOɧX:Yf|q BŠoÇc41ae `R=8??Y6} _{GY * *VF@ P% ofmArEN)2nܗE%d I0], L)$kA8դ )*,)N ;~2خ׋sNtq٧_=}㷿[r@i=>/OzL=OFw8yQ3T?gO9&o$E`̤u9;H(M1bgrt}hӋ+3m??{$Yj}@ S y+Wp}_7zy5Hjqqf\Y@cr@Fe`t1K?pVIl۫݋VVO* )Mߦ^*f+z:B -s" 㑨SxQR&,̭mk.SY)T`w'"9eB`2 ַ&!lș,"oF v0G8~mN[cPf_'V/s3qç;x*j{fNAdn T[3h-I!э7=?s/cj/ 0׃Hw_=ɏo~1۹I8c  69g@Vp()Z3M@PUcu[4mWYEzzޯ.ޚMefV¦KYi?8Tfq7p!aœJ|~]`{kST nlί`)LdRF3^N͂$Nz7jzϞ.71;/Q۷n//7k߮03r/gqWAE,İ XډXKNgS$L̍H5!e9sFS{kVtD6T2N5v72C3׃V,gm8F7H7YgW_|vxpp(n ك/qdvd0 UYXwybëv+~ޝ=ܽ55hނXH# (oN&A# F#)EhQUgFHɯ' *Ęs~?wY_.sN;xzV(^ljw^ E1{[.jЖ DVa= ݙmw|lڣ۷zWkD>vOHJk@7lo.t=@DdJpnZ2Z+3 FCTv\_\ԓ= 8M"ay%WBV2HFQ"E)-'? }ŗf09x͝{|8N6؉jPl zK7l/OFEPMXö\].^-^xgf<h*DXn#R ވbg''$wOVmE 9M)kuI )R G#R(̤, 9"sL|xj WEI g P; yTԕ[EΎfn^-z 'Gj*֯{FxR\͗ڣT*Nx30_}vr~ZvmB;bU=W/Ɠ!i H<|NY}mOS!)F1[{GbU\sʮdP/'q]N՘/^1XocDMmUVͪ*L=,@ !c "Lg2J)1)EBkqŏʺ-:*bHRV*&!A6yu扆 X@hȞ6כO'|aq_;m5@5b; @xۧYxvLdU%B`~f~uO䇛g_ vVC%N ŢJh#)Bʒ" Q^νwR FU~5"&κ'U 8%`MKԨ4 IefH1)$Ձt44RyN=ǔ{rqxlx: B9ҁcL z+5 [G7 \QX$zr|>6( S]xq\xirRʀ4='׿) 8M+1ZrzTd% $n"x%1R6Ar2Bh__}dX%!:v: fcx8C !Lg=n! $tZDExHH+Ƀ#s ^khz!ǃ Owj58XB)M:@Iu8hF:ʟ>x֗Wn:TdY=@30ܠp@[%nm %Iߤ0$An4i.N'g3>o&@sj P@2Ҩ~$- -gmP*ڷ~gX x1ula^AV9f{Ip"1`]"7kGQ›6%DX|~S6vXC^6[25'/ףN?FRZ%ݣf3F6EqiјitHj2$+MqnA!H U޻|qW?{d Īl 4` }u"ݽ+&ftDcwgm8AdH,ZWvJ'LUvtqUZA@pJjM}4amkir:M+d޽{! F/qUHQNz0,C6Y@Yξۿ>~X{LJ4=BP@ X`S@Ƞ~2Qo"r'x}#l7vYn}4Di=:cvqx]{d~ҕۛ/:ҷ!'dڿ9 (ʪGt5$}1buؠ ̠D bxdN Gigb.2jܛXXJ `!,}ߥ@8 (La5_~u|X;rÌrx+ oGr?)֮  Go(|㰸l‚ttp6Z\=}ɋrB[IrҀ$5RV`JKή@4 4:4!X1}(l9!8Rb4!pFs&R YћMIN˂&NO3ףdv>9Y.^]YN1e%}T ߿6: Z]gQҎυx<-M8UTU)$vJ`̞9J[m1,CwL'T`R_]__}g_gO媹:4 q ddݮz ̑ZrF#చZY]T\Y[4 H"Fua>1?z˗WɪUf RTE`L׵9fsz{dZ[kH ;*Ń_>^\ws;|LM^g.~o[v .(y BܾvQݰo,7Vz_UQr@_RivAֲ$ 3#"2kw&[}B޸"n?7w,t7n A}7~k2R[0ATZ~0?_n  Kbonʮi~룗ϿK*+gBBLFrj]Ylj@caL"bX0=g? #笺atIXT0{(@C5f 3&t>̯/],_=uˋ}l]bʐ !l @0'TJb\i(Z (B%rRZep GIϮqUHw-b+Pc%Z#)m+ gf>VU '`xlQߵ"qrtjF*3zVV!Zˮ]^}Ve]*sg?~|t{u >$`pVb-^])@ @"ڢS lg[ fbś{cD@B~Z{4<θ `*n//" EH `( @QH2p!PmDž2VɁ|6aJ[ '  4e9w݃ɽo}}sng) 3 cm 2+X$'隔:$C6,ƪ#\aT┲pF ? QJ)Zoz6Zu ^W<T.ŴZW\,_]=ZXNPϞ*t1BizPj3b|׏.단uY\}ޭfwTR{цM&Uc8?esqEZ@Op2$kG fٸl:mۀƷn߬z& Օ<)L?O^>ȬvKS8e0acUH+ŞT^=zy!mY# k;(Ui10$]X"۲ d%w>8T֓k-O{;Pe0"BA% m\<\ozq뫫31 (]51Y[AdrsdJ.D=* @gm̭S9fQ(l""Qq"")E̙fyuNtcLc]I(RH3*,Mo[ʹ޶ְ 8 5v'^5m {X~A9MiݤVc|oql6DW@lS;pf.^4^EoɊݣW/>z#<]\#!M%LJ+EjrJ9Y6pI>moKDPF)EJRJ7"Uu_}>(jL!:FL=,r#P9n[n,nQHшw[DȖ9Vg!,"9I P @! sU$I8Θ )ř*TE4C@AS dV_J21TUZӰYLڮ6d'tdlڰXB#7)faURh Jm5.ßs1 befT@9IIfD.5Ҧ2A bJiQ-;R=l|{0qd7}߭8q:LĢ[Bw][8O.泙D8dLZW"!) Fc RH1쪢P + "GVF+"(J :3BB0 sQ떏r2)ehJrBd`0IT[$[@sx=y~d=N@ؚ̘$,C«̒s(_Uj\.ӟya5ݺ3;)# =` 1b'M_T5*RKdYrJIDbq/z伋hB&MV]\ 5䌀u/h} 0:猈:CVPmt1!"rT"9(ζUOBݝZŀ$\4Ͱ*҅6v>_mή\__{0FyD@ U+-4)H@2:CEe h֥SSG.Z3" pd ژ{Ι>g_Q (d"AG{wjS$m(Nm6j h@gNem@ذJhAPYSQ+R!BTYWb(yP8Vg/ON_v?[% hD0#!1Y ۮ^t}ųGVwwћ9cք @ll`@PS[% S",&N> >Ͼ\-O_>YxgdwowpV}tш@u!nť뫗uI iAL91m@ ,\U6h1ZId(,JE(+ *8(4Ds1d#q`(issqz' ]|w佻;JJ}{mzsgP7)[gJC. &C;ҦaĨf?Bljc %X9%Zڬx4VleY101p7>dĈ ͜B 9JfaDBE!R,Q|l5#!L#4,ꐣSLd jcͺ(rsc"+Q@tEYmg?x[hwJ GH0H DݤQ$wnI9a_jzGy睮yHsq%$V̠- @E@plYLlzWz~Ǐ;&{e#D֭!/>{#3s,)yzjf>("X =s'%DJf ?܁3o,"$eΌ$ PbEhgaŪ#bL9Vh0> *{ /8 *6CK{p?~thEQӲtZ;C yMJ!Yϱ P8žaRn. 43&DaU;PYRΎ5䜯y/֮(Y ^ϛJL내Qq@2Ҧc_)32bU]uIb,V; Cbl#QrشYRaQR8"M"9@Ŝ_YCT*.m[1%ΌD;x:Q\_}zpoãe(c2B5ҕ_>b1W̬m)T.JRI Hm- DDTVEUr}h//~W{xgrV;;O~3ʃ%t sn~yq資_ kD4nPbUW!z̜ɰVÙAqn(@A@̤P黳N f-MOWmJYJK(6MA Y D@=+!ǜj@)M=-4O>|xF@)8_70!H @tUI=iTe 9R\vMcSBFHAQR5ة2 ϻi8(R+ 4Hkic2 }P9z e&IFaXqt5 )u}ǠUb dNHE.T v.6kb w>&TXD(K1ykݚҢ$ #u]@Vy1J!!@@7GLqwnCNa|4XxZ;jg_rSiyvWogg1jUXUxS팇Ghv@%9mtRQڸu_go|j<0!SU'g8*Q@|_~tֆhFU="o%V#J^9 )A(-%" 1A5L.zA.$&X\SvхU8u}*0m櫮iί/ %2Z.cZ NwsY$Y#[vnccQE`fN!ժGY$rиUkgU![R(;V#RMiicR%jn} k9v<+?v@_ u""eȩ>apqUD2H)s\.`R"PH9jzm-l8ǵzϺ~}擧>yӭ0_55ͺ_p5߸{Yz_nȨ`kn n妣1)$ pL I8hWE;ݻ{٧?^]`LjM@AXtHgktL "@Y (op,fj/Vw\hJ5Jc1ˢ\wQ=)-t2 F‰9#a=0)E K}EMQX1DqUZ H(眀b>n!ή)[[$ChϚϮzqzG,Rh.νo?<²N.čOI~}v9YW[o5 &W*6:s|W?9}|ճgѶC>y]~=ڭi9*z#̥4 h$嶕X6k@RJuh8۽EG)-J@H5 r ެPdimc5vZQDԉ պ\(İ جD¿l5Xkb,V2,M]0zR)](ȵ]#SbB&$MF벪T]9LJY$(ȸ% N ֋CkDR?R(>""S֔aAIYFW?ohe+q#`EU싓_MۉYl4:z>_w[n0#PD#!bhU]hxe_=W|w7{wWXtEZ[ Ȝvޖh7y5?4'#ד}G'R2珟/||\S{ u;}JDDB&m5x`H}[, D$Q#2#$eANn]\.sߴҌ*7)mN1&Jk9'\w&Y7ֺ } dBtTP",)3 3K R4Mn֮t",S6щ׳4]Zi#vG} i xմņ(qݲ1J2"t}}F+MNL8H-rRjRc̡9$1fN)gs嚮E3ƀ* QEOibľwJlYEFM vJbc3YXBĐ &vfd4(E%R7'_]|ՃW^CS7 U9A7!+9,9 (#AN).Ewf~ѭVrq`<+'ξNFt&[2Hf,@r HxΛad:_<|<9 )׫奻.ڿ_=J@+L,ғHiA8,&@&QŒ@"a$9?) 0% R01B 9kr9o旯TzP81iч؇ԆwWj_m̈R5AatB7%w"5m\ ބ%cdmN=0:@e5& KcK3*䜈%jbȉ*}m%&FKQVBb- 0 kK1iPA2BWEZiB(ZFcLJCTLT J+sI,PefCb1zݞ-׷own xWZ%_珯OWgF;Α-ƨnzi8zIJJz _6(9 ,^={x]^L7~[1NDE(gbf6O?k'|O>Qw/=уQkP5J+Gԁ&cvhmsw?1TںʬޖJ7mZf)MY+͡"9Ǡ.*_(R"j^,zAb$KUhP%>9g5NsSȚMisYdJ1)2dR00YAF%F(5M10GZ3/΂3fZL$3eFCǬJn4((…)cjsthR}H1VzkJJks0,s6eeԯﺐĊ,$ZI|b$ưVz<)CFSLBa*2x˔bJA.I+j<*NN~?M{G^'9~vvj݃{N}6*@:R,H@Rf 00Im+r0OٳEUk:MUOn1;HS̤(g`ɜ2-Va9*-.Wl@ g.}/t8(kJD`άhEuaRr2"*6 i{wX3r$uB "icE`wtMͦ۬>İK T]Đ ^Ĕݙp"^ !f`:oZؒizo>1X[r9`Ѥ:Ț7ẙKN%0DE9(VF}, [Zobl.))GƀdP(D8HY16& '15BuQ:v,DŽ^p*%NF{hI+s裠.Mh!c]NbtKQB8{ "Od:Eŗ_<{lO|tL_g[rɐ @ g~adR@9rwO_}u ^>V!v1 Q1G`dsc >kabNXO_8APho6]⾗2"+aA2 bHDoKY!udcAnJ)eM ,fAd ʑ01PSCuB)T@[3CH uޘ]KJrPU TkMiEns^'V|Ū,LXfw2) ٢FA-eMuH<sY` uRJY!\(cH@${Q+kaDmlE+1N3`cJ!cbP("+ۦ͠Q%ҡ)\I"&hJֺQAfeAv׈7V_\>=Y0rwv* .$ĸ]ama| fF@Ȝuc -A TFĔ@&zO3+ƘRH!&N>yfVmgG>ˇOJí`h㝮_v>v1)1"*@BT H0BĔ3!")zD9m@2azfј)!yڎO8F޷VY[T1I g$S*%'aNMBty~^Kօ`hr*.$_5-l fӢtt*k&!3hm%t1#1eT]$&l ȽZv|ޕXgxXTZml*k TR' ,>3ʺAeFH1K2m!۬}UQ+K e@l}̘c$ 23DɐDiC)DRn *KVy>~Ol6Z.+RNĤbPF%m9Y@Hi f)n!b IףzW 3x'U 9ІzCyЅWM_}B2CiYp( cesu\ `sXaUu) mݯX6,"B:L,6 FT WD:%tQŬ,#Ie$Ydo6:q+m(I8BGGMs[.yۆa M5A%[Mm}Zf骢tzU!.3ƒ61!B(Ô4 q+Wi(JUj(SV(Rֈ:r8{9]N;o\}@k,y7]-)4X=s N)ľM@DVMY[eH+B53` |.+/./ܺX7(|_,!Nk3 )ĨԖ-H,_'0# QAD8%,91'h2{:oO&{S޴B7}7$&!^ŃW 1r-eqHGDBsuUҋXo*IqH_]KGo69ggEUt{|_9^rZ]] KΕ*ez H6&gФH$1"l,C&)GA\-z߄$E,iEN@KeəR ΒpŴtʺͩom6!F\J!e!oz5 08 1%J+ti;w1r昳0,DwA OMJYF4+q2+튢(E2!c ShS"̜R1mrJM$i2)ן|j!kf(֬"CZIBR$Dl1#$漝r:,>1R1)j[~o.67= JQ!Mn|6~w|5_~d0@a0X]4me BK"t, uQ=RY?|wqmq8M=1M*˺;={QYGD*/J oQH;F3&1 D)BزCH8)8gt$LݽiȾfn- =1ccNQ56됓, o<[ 팸,JdZq}Jѧ`$VmV))g`(P WhJWBƪHpvs Y*pܱC JfFΗ rhX*M F RByXFID0A +M:$c9Xv zyy]af8T5n$đcP@ߴ\%0$IkCd7) T"g,H]o5]svG/,[}m~ݟ_] y o8%tER̨2{*n8jސ26XeI+c6:Y1bfDୡMWE:FYkԠr, 3@$BZG$}qY6!tRl Y@oz/#~l2`4 F.RSы52 !^DPP8MM$> h ,pJ!D1fZEM&s>.v|>[]\k5`N(@*͝^,¨]a"@iѠ+2^VDO9q1kGhb&{?Oudw{TcaFE,5TR9)۰uSNA8 Vq+9ǢAf̤41 t}4Mט95 ժOLD@)"Ye H$g-"P> {96CHrE v!*?T)G"͉) >$Q)>J>p.@D kErV#r]֖A5Yf`$ Ve]LN9)R.>{xzݽlw8`ZFd* WD#J+9#s c@ù)2cʙcKلC9CN>" ; C ͢z9Z`߾}XAl[Dɤ511 jz̻hR`P7[o,H7emV<""Bm&p"֭^XW#Hie׊JW2dbBj(#!+wsY96d~rF" tU3RZi'{,`ah;U,KXV!uiw>ͦqsŨs"21K5!I 3jȪ!et|Td"dڅIi}nByDALO\"(ILW/&"f+CXI8K`[ Dfni(7SMQ\ )D2@7)Td֐R [Kl.r؝㽝A50;CgIl5 W ѣ(HP$9gژE8l?i,ĠQ99^DčyW%iR2 z  LfIGנA  F'L2߻ux)v֚s\ǟ~| n/ݠ7jZ[.|?~z% 2q+Ӥ M39=ژ9u t4y)x|o_\ ba4}/SJL87#=RJDou[8Eu}x0vx8Glt$,mpt?gIjsFys>~$bILrf T Ihm53P )]S:Ȝͽ0s^+\v_/ Vk[lvV$TT{k}x?G <P9qD3C.Xu}YzK5̒!KnADŒ(LC[Y݂አd@ I0M6@IqJS Ol S*%Z[m޻Bq?2dMQIDATi<`\^t79w/0|z$y:fHe[6sgk/-*`߫wnM[v׸+M0DEj]ګNӔ 0 uKe"mE@dN\f?z,Ȉaeo&|A$ҰF3m@@Nu߭k73eFhzrM0( S9?qx,ٖStkbC|Y4"G%Uu"tں$))$avwr8vӺ,(VHo2<ߗyn۶*eY}YֵZz.tgY5H9yA]CD yFml1PpwNǶ.%'sRw5s5Wu"tk} 0 \ )DtG8'ކyZ;23cW%k=\I'+ LtUj ;7AG4\omp]w7}:|<9a]8BmQj\wokZc3px|~$rNL$k26CiD\ P! #KsL`ח'A;U}Oח//Ħ][_.ͭ:AA8iV#R(e/[xRpM yoƒ$-LXiaqЖ@}xx8/~|$x0޹LMضu1qŀL  1OSt1 3BvEt0U6S>L;th[ov]^2ϷE_CEG(z .ɑzWX#Q2<1MGHet :; ӔY@[%IR5nJH.ĒXPH:^+ ,[պcXՊ!!,2Q #!vU$ЮV"an=TdAuH,)F$=0qʓ졌atS赵Б=3`y;.ܛOi6i$?JRD$|KDo\9 p)Hmۺ.?}t>KajO {Ufj8t>fV̉ Ήq\L8T9! w}6 FsuI2&L%l]S\{G.s$$4|"ܴBC.TzOItl!JN…p.RWu[o54Z]{P[{k-/L{|(SΙIRڢ۶Z4MmSjGDf 箾*!rѐILA$y#\n"6 r7֦{<$<|jʅURc@7C"3_ H{_pS)0IS D4D)OnA,]|]{9Otxy]XSJiYI%A`0]G SK)G !# TL"r:>N}[k^~?[o/J:rԖmYUЛ1tӜ߿kS.Sdzz@ $ZVri0VsäKW$P2 Јg ›CDڽ<L%[$HeDYR _/߯O[vi,(ҫ].~-kff6Ln~t]n%r_[&Dj;9hl,Lj]oRNxeRfI%%ibQޡtx~y|3- ͂<Gszf%QW S*;1E5"~u6L궺h8$rrN9Q;cHLsIYd)r&Tj׆0 =4$uJi*"Б3VQF G$Uu"qs@n{*"RC$w@к~\ܚ;_oOִT5: "~~9vaß9FXLY gޮ90i,S\ F$dsX+ӜeRkzJMBL*| 0fcR.))B"f뽽{5_unmRBE0xK*u`a%$/7|[4y6,kaĄH;nE! 0!#BT&E(\Mv$TwwffGw FkN3'Ftӄ, =0:CvS!P@dK!"f%$6O10Gh5ljKqkrdo? `ßpkA"fB$@r a$ zD_LpWnZ./?y=?|x~;9Ynt>ߟ~n0ns̙IorTfbnmeq*I81LtNl]7,Rn,kW|<0ڈCb~,y*8FORdRbU&1usgH`03aN1խmp>ܽ˶+Qܮǥynqʤ=$>T6\aekKmNݺp%ÔjӠ޼+ޗ/d;rY\f^`‡Ǐmj뗧ϟo>=k?ӳ;e|y=ksFx<A% χ3JWuzօr& 0[ >>TማvmNS*8KҮrOI]E{$ڑyq[J_VjrݮW ׵ݿ) 1{bؕF0U46@)I&{x\ڜI"'U*={hjeE, %ONSPSsD@DĄ"(oBxA @fj"A:Hш@(Ђ {uCHU"G3PVB䀃P( @lf̳K9>gDy6:""9CC0$$i ]3c"twUc&>ax8Ƙ5DjC?==]__/?FkۖKxvW+cW49HH>TI͇ A[wm[/rw'L24˨E8 ,)) z<صEvZ,PrERNH)P(zlMm^rmۮͳHY&:E jUmkq]G sI \׮%buk zZ@El[ 1F’D$ˈ ea@8Ba9A^qN}eh(t!C@ EF6'IDh[+1)r"ANbD)@DBI$u- s1?O{C?$7A0'Q@!@N0 ' sBR2)A2$Nj=,D1?ϗv^_~orݟpmˋ/[T~m^5[N29%<|8Z9Oye]nZ۶nח% <r|<firc~;ovzSuPW^/ۚZ1b4cG$a >KkUnvdュD$1€Q"3u0lAr` F!A!6U^K7Y_K 031ڕ U,TnJ#njC-X ߿F$GDě: "o0(w܍)Dv$"bSeDZ[rGDs!Bpw&";wҐ-v{.?t\~ϯKmivmrRMD?~| 01cDǒǞH.7 B21RC'!Cwy:3iX D"\JJA ཱུa>.WF<>"1%Rp%l xAziԖ׮|mx[:KH@mD,uD@JCZ3!-[wb*̦6r #`LI2$H" pz]EĦĄ"T!(0!i`$)3@HxNuYS|ZC9b KNo/£]LN78!x &$vwhL@N{owK)0BH w'Q<<MEp$SbnP[k\ri_@YވP)X_BI%n #$s߮nQ QL4'a3.&n2Us_7[~u-\y,Bek'2w2%#d|Y4CApa Q[X܉'wu!n~D$+rdbHdQk!&SL-L5ZBhxo PmKP$ʁ&U[| z`[s?8MȄC։ss1"X <"#Y GZ[Eԙ=w & { p#܎4o~m߾~~m߭si6'?>om/(2tw Iʲ޻*,۶砆n/V2徭i>B>7B:+w`NJ1CtIjme; TJBk@?ծ}PF~ֵ>]\R"*"sЗMVkc.vJ yԖS뺦U۲lpXkHEjw\ ()#8B&ro=O%!l!!z9q&@ȩx$ Kf–i ypk0Ws0U|ߦ5}* "CptN6r`hD؛[ 8~9iEBBDwC 6C⽰C,éF[D ;"DI$R.L@0|˿ /^|~龼|zYvӵꜧeӌ??t(a,=̠mibntr"NLjz(Zv9l)gI]׭[2H,i]#ƀ庛*qH)/5p# ܩ̿h/o۲1B{Wyl"s*>ǣko4͹Cm>OuiLéG*,%XbTdzi0dY}Κ%6'H`fJq:YaXZ4=01Y$&*]3#Aubq 2^9!!b0Q!z]{g "a8,"D  a>H$fw'B&+%p"F3FĈhj,A((r2o?Z_U,nϟ>^[ Wdx)b?nYHDC]+)VLEMPI&3#zz˻31n}mRz@iyGֈKT{Kn[wCb"D'BV,b0|sz#,,` 1=\ i v-2!8`s SG]@䣤 Q7 ^" b@Q1J!#{03Ҁ "EOIÇߌkvy?wi{IbT-!gi)nRҁ1)rLػ3ҶVIQIJȁ mdÄh]VWYL$ TBڡ^Hr8yVDFYj5]rvp;NDlۭZOdڪ*-[ln;X'L f-Njz$>Q7,0#eG8eU#d֡bdj!ŔO r(GdBpZfd颰e~qx9y(JvLG|<"05*pbp3"QSB4W3,m'p !36+wgfwG[#|2_w"[ QUVNVuO?OO?R oLLp,pN*|S&rR<ƜQ8дPR /%"¨xTwp>4ޖ5֭r(,Y}C{RI|OR))o]TʹψSZՊR [z[lQ=:[Xp|p4}uʅ)}޾6R r]m583WD0 3n  1Op(%C4cLȄ-mρnX&D")_o>OHd AIH4ь#0]]7y#h,ױnf}oZ5"oa>gb< ûl}n 9ëY8=NlyNF$%b"c>:hsV!rJD4 h@D)n$yko9p<ǔf0:M‚yzNHmݬo?6Tjjoj^;^n}s$43v0[~2E1_,wDa 04á#%He"0K .j ϝs L,_D C"hJ;g/#][cL8@S%~Ï3BLnND&[6`(fA!#h ie8B!4xD!qq1cmۿ]~o?\%]qʉ|Ppd$i>8xJY"4ܻ(T͍꺺2f RBuliA<J<2 PVE.E<-D]#8͒3y"֚y}}H)T||mD)Yr:Y3 |jąܱm^Y~zkScV|G2Q05ZdN{߷=&՛҆ء3@-1T9#\e.rN8؁THMS03Sq< @b@:qA|u|Ю7Q{kAC"` ZϨ)w1cdnNȀaNݑP!5q"q@0D#puX|w?+eY/Ͽ>w' |%COx|&S)$ryQ+zzncB$I:8a.s>9{D ?џ9T̤̈jok:="$ b!I=:1NQq0% ""I " ͕0; "xu@#9wDD ! .`d@(Jcnxr Z]kקw_~O^.wB)3cJGd4L`ZEH!B=8tۮ:D…ҽ ڂ[<8i { ˌ(^r;VZ) | p8Lt¼U{ -pw"$ 9MRr)M#gծm7#k)("@? ᜧ2P"%9:"! $vuc`ЀG%|X!29 :P  q3 hMHFL~"Q N^2{g$ 7cADSIX?[u~>Х>!-s" d9183׺$#2.S"n9T# І$-[OE5(A9 uJ3¶ݗtM#n.D[n|jfxpfB@2!'8-Ir9iF MFn_G"cTDI‡G;'b}Kϸf"\# y$"eӠG!cS19{lEp;Bŕ!Q=\m@cG")3q&d`w7$& %o^km[ey]_>S`*mӉ !"'"btEdS(=IAB<̀@~7@o18$46  2 $ /wHCא$-1|d@PR@Ѱ-2e Bd}[-|><kUǵma~;Gz_6u:ƣЬptû8Ȃzn ~|#bkz} ɄfjifNpA xY"ӘuDIu`PÈTXqs21"D Aހe?( $TmD$a^@z*Hɭ!bb3s  ,HBDa`Y;aܥ)i>2Oү̶ٶnz{}yr\ݝ^rs$$Cڶ;!mK'6"p{JɇN$eWEJ}Bi7F` f91)uSk̜In}?Ns>O,8"CDZ8'EwpOt(9nϷηSQZm]o1Zo@u='ֶ4SJKD|x|hV[Uv\ `1WcL 8t#TLhSN[DΒ j 2s.ÃFeJNCd)5GIm֫(iHߒz ؃GpʜPBPYDɉo+Qq2HI<D<߅=Z;[ Xڶ֗A.uuᄄJM"0| D cJfÝ]= ab8f'; "ޓ?`(H(Nk5#b~;ƠT9!!cjwxP5G~0A0WiѸ^#@`D٨18v8="Vۺ/z?ߟ^ݟԉ>UüojEB3('ݘSٽ*ȩV$jU$#G0cIĨM1$CEBfl@h6:NP ,a%"Qx90 0&S9rHE:fQt8jtS\ $oG`Rp:Ny7FČ6(aCӁ `J#@ח[璦<=+wȕh#(vg17`@0#3إ0{E cIA É]˱R`xhF {O7 DAqB`FPo2 HV"\#pAPua|VIĤZ1ARiY("&WDZM@iA {w9!q*fqND5t *OL2Nn2DL Hޮ} 5$@!71"[C{ {g`t e`E<* FÝH\Q0ƭ2DغtĬ fQU`&e*A?Ē"vPVF0CS)MW^^?/뗟l!LJxݪiߘ4vynI`ZN9YX(s. @5M%CPjߒLYj8Oy:*ap\J [8Y2$"HֻMRcVAC$eʂq.NM ޜ@w<{"f&;aNC{0Qvh1Bn!)G1󠎎ln3D!1w8v/^I# ywR168 C(T*Bbnћ5h}ؑV5}48vylqV7iÉ͌cXHAlX|%"(b Gp 9j!n\>~er۳]۵}I3km@-ͶyVג;0| 6 KuZg&u%.|PN%uxnT\+いP0 tzڂe^j9WY-jCpL(`@ t<g𠟍oԓ:dCb>cFod&YxzO @Yǘ .n{wP#h/]!٬#Yk"،SRaLwр,ɼwD_-w(7hqG\PTaOG`&ppf ; j;0B}#JfNȔE7&1n}PKжNeI|h]{]^r{n_~_oէ뭫gy>l!J@w L杈TB0an?0 Gj zhkUaJya-4m7mq"wh? q o]cY))vhҽ] V|]O0 †Vk=;@K. W$52PWA6x#ȇx$A(?y' !` 7bBІ 0FH ?zׇB~_uk[].)k_)6p z,QS$SnD0RJ5L/5%i2"tUpWw EtDs@Fvl IUұ(tiDf $ǠdZÇyJCV.BA4¤`P;s2sOS&d7.`|Mh `yP0‰xp[+5x6ɛ"W`-@͈ m1{2{ppÝ;:䝢6olrH 0$ȄL0lCbyHMitCH%!df)sW)k몐}KQ"P!J$~"y6>͇xwE7Zćglj 5,tzxG,H"u w0p"TmyL(GwPfio D e|bv4t-nb1iXY-@$r`CDs!o)C0={%acJ c쮀ocogwn3Fw3@p\M&"_{-N{"ܴ~)Bt=aAR!rFTGs\QDZ?OPZXEASe;V E<" 8Ne1Ln,D܌m.$F<xO`>)!`FĶÅ nJӽF8 }̞ p܀n:U$6щxwP3P) vAP@'f[ `6D"q U3ǨGF RO1 !MG'UN.o$sa;56HIx|}y۲VksXg.֫D7L M"u/ m2`J@XXĬ[8;BLл&wT-fU#@"R?WO$L>ʿƨ ͇݉𯒈0YC( coC9hjF!w`phUL8GV>@D4)Bnao(k,#NnF mKnEL Rѣ=,XEm&دxb1"`__/ B1wz'N>tD 4(w#Q!=b\j @}ho?8k8 )g:[۶޽O~EzU!Bbt Ƅ[2#D-E)f((F"uSev4&jok[hEd_&><ȻO pov]! SPy>My&`pG_ì #80Yv%:"@oTu+!%0&n0ܭ!Ю{Raވ͈ŽC|mԀm. !$wstwy琥WwpSiGbq3^Wu@zG0¾bDD2@Gypj6^J=P hp!;1'F,q"Px9 DXWCo>B}0`#b}y X,jv'xG fn } aS@ EFBBI >oǨlXkvQ3 36!x XJ\LxC1fFaӃ ecݡ |`@eSD?n϶b -]ٶ]8m ܣZ^k` 3dB Nl@#e:(#@~;&^. D̚U䀐ADd;}k<TψiDZ4v"rTGB"6sf1KpbuOc;@h8>"x $B3Yg d3a()RHFĴQApZו`hM|!Hv8=R00x"k k@t<@ƀ.6Du0EC"&|&% ͇SDLtoݼ}U;vu\KK ګ9F Y!$!o+9ַ'"|@/_;v B`bj }TA;EB?y;-"T)bd5@= $Apc`0}F˸_e<}_(w#TwU8]7oMlhvR*a{V&C|BiawBވ0d{{潵b/FIBNf#hCh=iEj{LwcXNE$<?)b@v0 ݱpܧ>R 4??Gîm]/^o lͶ5t]U3$ݚ)q"ݽt o/?>~3MF,{Ѽ* f QV3" }'F.S@F" P4<)dPNjol@đuX(ܑ8}8 rᙇQD*;<` _1Enn"_''c8f'|& Cfa;p0Z!P(baG*ǰmZov T$DrlLzY+\ zzͫTt1@rU!K_<1, ,Ucq!DWP?BOP.tEXtcomment CREATOR: GIMP PNM Filter Version 1.1 8IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695774452.0 pilkit-3.0/tests/test_processors.py0000644000175000017500000001314714504673364017571 0ustar00venelinvenelinimport os from unittest import mock import pytest from pilkit.lib import Image, ImageDraw, ImageColor from pilkit.processors import (Resize, ResizeToFill, ResizeToFit, SmartCrop, SmartResize, MakeOpaque, ColorOverlay, Convert, GaussianBlur) from pilkit.processors.resize import Thumbnail from .utils import create_image, compare_images, get_image_file def test_smartcrop(): img = SmartCrop(100, 100).process(create_image()) assert img.size == (100, 100) def test_resizetofill(): img = ResizeToFill(100, 100).process(create_image()) assert img.size == (100, 100) def test_resizetofit(): # First create an image with aspect ratio 2:1... img = Image.new('RGB', (200, 100)) # ...then resize it to fit within a 100x100 canvas. img = ResizeToFit(100, 100).process(img) # Assert that the image has maintained the aspect ratio. assert img.size == (100, 50) def test_resize_rounding(): """ Regression test for matthewwithanm/pilkit#1 """ img = Image.new('RGB', (95, 95)) img = ResizeToFill(28, 28).process(img) assert img.size == (28, 28) def test_resizetofit_mat(): img = Image.new('RGB', (200, 100)) img = ResizeToFit(100, 100, mat_color=0x000000).process(img) assert img.size == (100, 100) def test_coloroverlay(): """ Test that the ColorOverlay processor """ img = Image.new('RGB', (200, 100)) color = ImageColor.getrgb('#cc0000') img = ColorOverlay(color, overlay_opacity=1.0).process(img) assert img.getpixel((0,0)) == (204, 0, 0) def test_convert(): img = Image.new('RGBA', (200, 100)) img_RGBa = Convert("RGBa").process(img) assert img_RGBa.mode == "RGBa" img_RGBa_RGBA = Convert("RGBA").process(img) assert img_RGBa_RGBA.mode == "RGBA" def test_resize_antialiasing(): """ Test that the Resize processor antialiases. The Resize processor is used by all of the Resize* variants, so this should cover all of resize processors. Basically, this is to test that it converts to RGBA mode before resizing. Related: jdriscoll/django-imagekit#192 """ # Create a palette image and draw a circle into it. img = Image.new('P', (500, 500), 1) img.putpalette([ 0, 0, 0, 255, 255, 255, 0, 0, 255, ]) d = ImageDraw.ImageDraw(img) d.ellipse((100, 100, 400, 400), fill=2) # Resize the image using the Resize processor img = Resize(100, 100).process(img) # Count the number of colors color_count = len(list(filter(None, img.histogram()))) assert color_count > 2 def test_upscale(): """ Test that the upscale argument works as expected. """ img = Image.new('RGB', (100, 100)) for P in [Resize, ResizeToFit, ResizeToFill, SmartResize]: img2 = P(500, 500, upscale=True).process(img) assert img2.size == (500, 500) img2 = P(500, 500, upscale=False).process(img) assert img2.size == (100, 100) def test_should_raise_exception_if_anchor_is_passed_and_crop_is_set_to_false(): with pytest.raises(Exception, match=r"You can't specify an anchor point if crop is False."): Thumbnail(height=200, width=200, upscale=False, crop=False, anchor='t') def test_should_set_crop_to_true_if_anchor_is_passed_without_crop(): thumb = Thumbnail(height=200, width=200, upscale=False, anchor='t') assert thumb.crop def test_should_raise_exception_when_crop_is_passed_without_height_and_width(): img = Image.new('RGB', (100, 100)) with pytest.raises(Exception, match=r"You must provide both a width and height when cropping."): Thumbnail(crop=True).process(img) @mock.patch('pilkit.processors.resize.SmartResize') def test_should_call_smartresize_when_crop_not_passed(my_mock): img = Image.new('RGB', (100, 100)) Thumbnail(height=200, width=200, upscale=False).process(img) assert my_mock.called @mock.patch('pilkit.processors.resize.SmartResize') def test_should_repass_upscale_option_true(my_mock): img = Image.new('RGB', (100, 100)) Thumbnail(height=200, width=200, upscale=True).process(img) my_mock.assert_called_once_with(width=200, upscale=True, height=200) @mock.patch('pilkit.processors.resize.SmartResize') def test_should_repass_upscale_option_false(my_mock): img = Image.new('RGB', (100, 100)) Thumbnail(height=200, width=200, upscale=False).process(img) my_mock.assert_called_once_with(width=200, upscale=False, height=200) @mock.patch('pilkit.processors.resize.ResizeToFill') def test_should_call_resizetofill_when_crop_and_ancho_is_passed(my_mock): img = Image.new('RGB', (100, 100)) Thumbnail(height=200, width=200, anchor='fake').process(img) assert my_mock.called @mock.patch('pilkit.processors.resize.ResizeToFit') def test_should_call_resizetofit_when_crop_is_not_passed(my_mock): img = Image.new('RGB', (100, 100)) Thumbnail(height=200, width=200, crop=False).process(img) assert my_mock.called def test_GaussianBlur_radius_3(): img = GaussianBlur(radius = 3).process(create_image()) img = img.crop((112,112,144,144)) expected_img = Image.open(get_image_file("GaussianBlur_radius_3.png")) assert compare_images(img, expected_img) def test_GaussianBlur_radius_7(): img = GaussianBlur(radius=7).process(create_image()) img = img.crop((112, 112, 144, 144)) expected_img = Image.open(get_image_file("GaussianBlur_radius_7.png")) assert compare_images(img, expected_img) def test_make_gifs_opaque(): dir = os.path.dirname(__file__) path = os.path.join(dir, 'assets', 'cat.gif') gif = Image.open(path) MakeOpaque().process(gif) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695774452.0 pilkit-3.0/tests/test_utils.py0000644000175000017500000000444414504673364016527 0ustar00venelinvenelinimport os import io import pytest from unittest.mock import Mock, patch from tempfile import NamedTemporaryFile from pilkit.exceptions import UnknownFormat, UnknownExtension from pilkit.lib import Image from pilkit.utils import (extension_to_format, format_to_extension, FileWrapper, save_image, prepare_image, quiet) from .utils import create_image def test_extension_to_format(): assert extension_to_format('.jpeg') == 'JPEG' assert extension_to_format('.rgba') == 'SGI' def test_format_to_extension_no_init(): assert format_to_extension('PNG') == '.png' assert format_to_extension('ICO') == '.ico' def test_unknown_format(): with pytest.raises(UnknownFormat): format_to_extension('TXT') def test_unknown_extension(): with pytest.raises(UnknownExtension): extension_to_format('.txt') def test_default_extension(): """ Ensure default extensions are honored. Since PIL's ``Image.EXTENSION`` lists ``'.jpe'`` before the more common JPEG extensions, it would normally be the extension we'd get for that format. ``pilkit.utils.DEFAULT_EXTENSIONS`` is our way of specifying which extensions we'd prefer, and this tests to make sure it's working. """ assert format_to_extension('JPEG') == '.jpg' def test_filewrapper(): class K(object): def fileno(self): raise io.UnsupportedOperation with pytest.raises(AttributeError): FileWrapper(K()).fileno() def test_save_with_filename(): """ Test that ``save_image`` accepts filename strings (not just file objects). This is a test for GH-8. """ im = create_image() with NamedTemporaryFile() as outfile: save_image(im, outfile.name, 'JPEG') def test_format_normalization(): """ Make sure formats are normalized by ``prepare_image()``. See https://github.com/matthewwithanm/django-imagekit/issues/262 """ im = Image.new('RGBA', (100, 100)) assert 'transparency' in prepare_image(im, 'gIF')[1] def test_quiet(): """ Make sure the ``quiet`` util doesn't error if devnull is unwriteable. See https://github.com/matthewwithanm/django-imagekit/issues/294 """ mocked = Mock(side_effect=OSError) with patch.object(os, 'open', mocked): with quiet(): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1695760502.0 pilkit-3.0/tests/utils.py0000644000175000017500000000120414504640166015451 0ustar00venelinvenelinimport os from pilkit.lib import Image def get_image_file(image_name='reference.png'): """ See also: http://en.wikipedia.org/wiki/Lenna http://sipi.usc.edu/database/database.php?volume=misc&image=12 """ dir = os.path.dirname(__file__) path = os.path.join(dir, 'assets', image_name) return open(path, 'r+b') def create_image(): return Image.open(get_image_file()) def compare_images(a, b): if a.size != b.size: return False rows, cols = a.size for row in range(rows): for col in range(cols): if a.getpixel((row, col)) != b.getpixel((row, col)): return False return True