pax_global_header00006660000000000000000000000064122707433640014522gustar00rootroot0000000000000052 comment=43cc3e7ddbf21b4b84bfec06d7d7c1bafb1b7d5e httpie-0.8.0/000077500000000000000000000000001227074336400130245ustar00rootroot00000000000000httpie-0.8.0/.gitignore000066400000000000000000000001241227074336400150110ustar00rootroot00000000000000dist httpie.egg-info build *.pyc .tox README.html .coverage htmlcov .idea .DS_Store httpie-0.8.0/.travis.yml000066400000000000000000000002001227074336400151250ustar00rootroot00000000000000language: python python: - 2.6 - 2.7 - pypy - 3.3 script: python setup.py test install: - pip install . --use-mirrors httpie-0.8.0/AUTHORS.rst000066400000000000000000000023171227074336400147060ustar00rootroot00000000000000============== HTTPie authors ============== * `Jakub Roztocil `_ Patches and ideas ----------------- * `Cláudia T. Delgado `_ (logo) * `Hank Gay `_ * `Jake Basile `_ * `Vladimir Berkutov `_ * `Jakob Kramer `_ * `Chris Faulkner `_ * `Alen Mujezinovic `_ * `Praful Mathur `_ * `Marc Abramowitz `_ * `Ismail Badawi `_ * `Laurent Bachelier `_ * `Isman Firmansyah `_ * `Simon Olofsson `_ * `Churkin Oleg `_ * `Jökull Sólberg Auðunsson `_ * `Matthew M. Boedicker `_ * `marblar `_ * `Tomek Wójcik `_ * `Davey Shafik `_ * `cido `_ * `Justin Bonnar `_ * `Nathan LaFreniere `_ httpie-0.8.0/LICENSE000066400000000000000000000027351227074336400140400ustar00rootroot00000000000000Copyright © 2012 Jakub Roztocil 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 The author 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 AUTHOR 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 AUTHOR AND 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. httpie-0.8.0/MANIFEST.in000066400000000000000000000000331227074336400145560ustar00rootroot00000000000000include README.rst LICENSE httpie-0.8.0/README.rst000066400000000000000000001213721227074336400145210ustar00rootroot00000000000000**************************************** HTTPie: a CLI, cURL-like tool for humans **************************************** HTTPie is a **command line HTTP client**. Its goal is to make CLI interaction with web services as **human-friendly** as possible. It provides a simple ``http`` command that allows for sending arbitrary HTTP requests using a simple and natural syntax, and displays colorized responses. HTTPie can be used for **testing, debugging**, and generally **interacting** with HTTP servers. .. image:: https://github.com/jkbr/httpie/raw/master/httpie.png :alt: HTTPie compared to cURL :width: 835 :height: 835 :align: center ------ .. image:: https://raw.github.com/claudiatd/httpie-artwork/master/images/httpie_logo_simple.png :alt: HTTPie logo :align: center HTTPie is written in Python, and under the hood it uses the excellent `Requests`_ and `Pygments`_ libraries. **Table of Contents** .. contents:: :local: :depth: 1 :backlinks: none ============= Main Features ============= * Expressive and intuitive syntax * Formatted and colorized terminal output * Built-in JSON support * Forms and file uploads * HTTPS, proxies, and authentication * Arbitrary request data * Custom headers * Persistent sessions * Wget-like downloads * Python 2.6, 2.7 and 3.x support * Linux, Mac OS X and Windows support * Documentation * Test coverage ============ Installation ============ The latest **stable version** of HTTPie can always be installed or updated to via `pip`_ (prefered) or ``easy_install``: .. code-block:: bash $ pip install --upgrade httpie Alternatively: .. code-block:: bash $ easy_install httpie Or, you can install the **development version** directly from GitHub: .. image:: https://secure.travis-ci.org/jkbr/httpie.png :target: http://travis-ci.org/jkbr/httpie :alt: Build Status of the master branch .. code-block:: bash $ pip install --upgrade https://github.com/jkbr/httpie/tarball/master There are also packages available for `Ubuntu`_, `Debian`_, and possibly other Linux distributions as well. However, there may be a significant delay between official HTTPie releases and package updates. ===== Usage ===== Hello World: .. code-block:: bash $ http httpie.org Synopsis: .. code-block:: bash $ http [flags] [METHOD] URL [ITEM [ITEM]] See also ``http --help``. -------- Examples -------- Custom `HTTP method`_, `HTTP headers`_ and `JSON`_ data: .. code-block:: bash $ http PUT example.org X-API-Token:123 name=John Submitting `forms`_: .. code-block:: bash $ http -f POST example.org hello=World See the request that is being sent using one of the `output options`_: .. code-block:: bash $ http -v example.org Use `Github API`_ to post a comment on an `issue `_ with `authentication`_: .. code-block:: bash $ http -a USERNAME POST https://api.github.com/repos/jkbr/httpie/issues/83/comments body='HTTPie is awesome!' Upload a file using `redirected input`_: .. code-block:: bash $ http example.org < file.json Download a file and save it via `redirected output`_: .. code-block:: bash $ http example.org/file > file Download a file ``wget`` style: .. code-block:: bash $ http --download example.org/file Use named `sessions`_ to make certain aspects or the communication persistent between requests to the same host: .. code-block:: bash $ http --session=logged-in -a username:password httpbin.org/get API-Key:123 $ http --session=logged-in httpbin.org/headers Set a custom ``Host`` header to work around missing DNS records: .. code-block:: bash $ http localhost:8000 Host:example.com .. -------- *What follows is a detailed documentation. It covers the command syntax, advanced usage, and also features additional examples.* ============ HTTP Method ============ The name of the HTTP method comes right before the URL argument: .. code-block:: bash $ http DELETE example.org/todos/7 Which looks similar to the actual ``Request-Line`` that is sent: .. code-block:: http DELETE /todos/7 HTTP/1.1 When the ``METHOD`` argument is **omitted** from the command, HTTPie defaults to either ``GET`` (with no request data) or ``POST`` (with request data). =========== Request URL =========== The only information HTTPie needs to perform a request is a URL. The default scheme is, somewhat unsurprisingly, ``http://``, and can be omitted from the argument – ``http example.org`` works just fine. Additionally, curl-like shorthand for localhost is supported. This means that, for example ``:3000`` would expand to ``http://localhost:3000`` If the port is omitted, then port 80 is assumed. .. code-block:: bash $ http :/foo .. code-block:: http GET /foo HTTP/1.1 Host: localhost .. code-block:: bash $ http :3000/bar .. code-block:: http GET /bar HTTP/1.1 Host: localhost:3000 .. code-block:: bash $ http : .. code-block:: http GET / HTTP/1.1 Host: localhost If find yourself manually constructing URLs with **querystring parameters** on the terminal, you may appreciate the ``param==value`` syntax for appending URL parameters so that you don't have to worry about escaping the ``&`` separators. To search for ``HTTPie`` on Google Images you could use this command: .. code-block:: bash $ http GET www.google.com search==HTTPie tbm==isch .. code-block:: http GET /?search=HTTPie&tbm=isch HTTP/1.1 ============= Request Items ============= There are a few different *request item* types that provide a convenient mechanism for specifying HTTP headers, simple JSON and form data, files, and URL parameters. They are key/value pairs specified after the URL. All have in common that they become part of the actual request that is sent and that their type is distinguished only by the separator used: ``:``, ``=``, ``:=``, ``==``, ``@``, ``=@``, and ``:=@``. The ones with an ``@`` expect a file path as value. +-----------------------+-----------------------------------------------------+ | Item Type | Description | +=======================+=====================================================+ | HTTP Headers | Arbitrary HTTP header, e.g. ``X-API-Token:123``. | | ``Name:Value`` | | +-----------------------+-----------------------------------------------------+ | URL parameters | Appends the given name/value pair as a query | | ``name==value`` | string parameter to the URL. | | | The ``==`` separator is used | +-----------------------+-----------------------------------------------------+ | Data Fields | Request data fields to be serialized as a JSON | | ``field=value``, | object (default), or to be form-encoded | | ``field=@file.txt`` | (``--form, -f``). | +-----------------------+-----------------------------------------------------+ | Raw JSON fields | Useful when sending JSON and one or | | ``field:=json``, | more fields need to be a ``Boolean``, ``Number``, | | ``field:=@file.json`` | nested ``Object``, or an ``Array``, e.g., | | | ``meals:='["ham","spam"]'`` or ``pies:=[1,2,3]`` | | | (note the quotes). | +-----------------------+-----------------------------------------------------+ | Form File Fields | Only available with ``--form, -f``. | | ``field@/dir/file`` | For example ``screenshot@~/Pictures/img.png``. | | | The presence of a file field results | | | in a ``multipart/form-data`` request. | +-----------------------+-----------------------------------------------------+ You can use ``\`` to escape characters that shouldn't be used as separators (or parts thereof). For instance, ``foo\==bar`` will become a data key/value pair (``foo=`` and ``bar``) instead of a URL parameter. You can also quote values, e.g. ``foo="bar baz"``. Note that data fields aren't the only way to specify request data: `Redirected input`_ allows for passing arbitrary data to be sent with the request. ==== JSON ==== JSON is the *lingua franca* of modern web services and it is also the **implicit content type** HTTPie by default uses: If your command includes some data items, they are serialized as a JSON object by default. HTTPie also automatically sets the following headers, both of which can be overwritten: ================ ======================================= ``Content-Type`` ``application/json; charset=utf-8`` ``Accept`` ``application/json`` ================ ======================================= You can use ``--json, -j`` to explicitly set ``Accept`` to ``application/json`` regardless of whether you are sending data (it's a shortcut for setting the header via the usual header notation – ``http url Accept:application/json``). Simple example: .. code-block:: bash $ http PUT example.org name=John email=john@example.org .. code-block:: http PUT / HTTP/1.1 Accept: application/json Accept-Encoding: identity, deflate, compress, gzip Content-Type: application/json; charset=utf-8 Host: example.org { "name": "John", "email": "john@example.org" } Non-string fields use the ``:=`` separator, which allows you to embed raw JSON into the resulting object. Text and raw JSON files can also be embedded into fields using ``=@`` and ``:=@``: .. code-block:: bash $ http PUT api.example.com/person/1 \ name=John \ age:=29 married:=false hobbies:='["http", "pies"]' \ # Raw JSON description=@about-john.txt \ # Embed text file bookmarks:=@bookmarks.json # Embed JSON file .. code-block:: http PUT /person/1 HTTP/1.1 Accept: application/json Content-Type: application/json; charset=utf-8 Host: api.example.com { "age": 29, "hobbies": [ "http", "pies" ], "description": "John is a nice guy who likes pies.", "married": false, "name": "John", "bookmarks": { "HTTPie": "http://httpie.org", } } Send JSON data stored in a file (see `redirected input`_ for more examples): .. code-block:: bash $ http POST api.example.com/person/1 < person.json ===== Forms ===== Submitting forms is very similar to sending `JSON`_ requests. Often the only difference is in adding the ``--form, -f`` option, which ensures that data fields are serialized as, and ``Content-Type`` is set to, ``application/x-www-form-urlencoded; charset=utf-8``. It is possible to make form data the implicit content type instead of JSON via the `config`_ file. ------------- Regular Forms ------------- .. code-block:: bash $ http --form POST api.example.org/person/1 name='John Smith' email=john@example.org cv=@~/Documents/cv.txt .. code-block:: http POST /person/1 HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=utf-8 name=John+Smith&email=john%40example.org&cv=John's+CV+... ----------------- File Upload Forms ----------------- If one or more file fields is present, the serialization and content type is ``multipart/form-data``: .. code-block:: bash $ http -f POST example.com/jobs name='John Smith' cv@~/Documents/cv.pdf The request above is the same as if the following HTML form were submitted: .. code-block:: html
Note that ``@`` is used to simulate a file upload form field, whereas ``=@`` just embeds the file content as a regular text field value. ============ HTTP Headers ============ To set custom headers you can use the ``Header:Value`` notation: .. code-block:: bash $ http example.org User-Agent:Bacon/1.0 'Cookie:valued-visitor=yes;foo=bar' X-Foo:Bar Referer:http://httpie.org/ .. code-block:: http GET / HTTP/1.1 Accept: */* Accept-Encoding: identity, deflate, compress, gzip Cookie: valued-visitor=yes;foo=bar Host: example.org Referer: http://httpie.org/ User-Agent: Bacon/1.0 X-Foo: Bar There are a couple of default headers that HTTPie sets: .. code-block:: http GET / HTTP/1.1 Accept: */* Accept-Encoding: identity, deflate, compress, gzip User-Agent: HTTPie/ Host: Any of the default headers can be overwritten. ============== Authentication ============== The currently supported authentication schemes are Basic and Digest (see `auth plugins`_ for more). There are two flags that control authentication: =================== ====================================================== ``--auth, -a`` Pass a ``username:password`` pair as the argument. Or, if you only specify a username (``-a username``), you'll be prompted for the password before the request is sent. To send a an empty password, pass ``username:``. The ``username:password@hostname`` URL syntax is supported as well (but credentials passed via ``-a`` have higher priority). ``--auth-type`` Specify the auth mechanism. Possible values are ``basic`` and ``digest``. The default value is ``basic`` so it can often be omitted. =================== ====================================================== Basic auth: .. code-block:: bash $ http -a username:password example.org Digest auth: .. code-block:: bash $ http --auth-type=digest -a username:password example.org With password prompt: .. code-block:: bash $ http -a username example.org Authorization information from your ``~/.netrc`` file is honored as well: .. code-block:: bash $ cat ~/.netrc machine httpbin.org login httpie password test $ http httpbin.org/basic-auth/httpie/test HTTP/1.1 200 OK [...] ------------ Auth Plugins ------------ * `httpie-oauth `_: OAuth * `httpie-ntlm `_: NTLM (NT LAN Manager) * `httpie-negotiate `_: SPNEGO (GSS Negotiate) ======= Proxies ======= You can specify proxies to be used through the ``--proxy`` argument for each protocol (which is included in the value in case of redirects across protocols): .. code-block:: bash $ http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org With Basic authentication: .. code-block:: bash $ http --proxy=http:http://user:pass@10.10.1.10:3128 example.org You can also configure proxies by environment variables ``HTTP_PROXY`` and ``HTTPS_PROXY``, and the underlying Requests library will pick them up as well. If you want to disable proxies configured through the environment variables for certain hosts, you can specify them in ``NO_PROXY``. In your ``~/.bash_profile``: .. code-block:: bash export HTTP_PROXY=http://10.10.1.10:3128 export HTTPS_PROXY=https://10.10.1.10:1080 export NO_PROXY=localhost,example.com ===== HTTPS ===== To skip the host's SSL certificate verification, you can pass ``--verify=no`` (default is ``yes``). You can also use ``--verify`` to set a custom CA bundle path. The path can also be configured via the environment variable ``REQUESTS_CA_BUNDLE``. ============== Output Options ============== By default, HTTPie outputs the whole response message (headers as well as the body). You can control what should be printed via several options: ================= ===================================================== ``--headers, -h`` Only the response headers are printed. ``--body, -b`` Only the response body is printed. ``--verbose, -v`` Print the whole HTTP exchange (request and response). ``--print, -p`` Selects parts of the HTTP exchange. ================= ===================================================== ``--verbose`` can often be useful for debugging the request and generating documentation examples: .. code-block:: bash $ http --verbose PUT httpbin.org/put hello=world PUT /put HTTP/1.1 Accept: application/json Accept-Encoding: identity, deflate, compress, gzip Content-Type: application/json; charset=utf-8 Host: httpbin.org User-Agent: HTTPie/0.2.7dev { "hello": "world" } HTTP/1.1 200 OK Connection: keep-alive Content-Length: 477 Content-Type: application/json Date: Sun, 05 Aug 2012 00:25:23 GMT Server: gunicorn/0.13.4 { […] } All the other options are just a shortcut for ``--print, -p``. It accepts a string of characters each of which represents a specific part of the HTTP exchange: ========== ================== Character Stands for ========== ================== ``H`` Request headers. ``B`` Request body. ``h`` Response headers. ``b`` Response body. ========== ================== Print request and response headers: .. code-block:: bash $ http --print=Hh PUT httpbin.org/put hello=world ------------------------- Conditional Body Download ------------------------- As an optimization, the response body is downloaded from the server only if it's part of the output. This is similar to performing a ``HEAD`` request, except that it applies to any HTTP method you use. Let's say that there is an API that returns the whole resource when it is updated, but you are only interested in the response headers to see the status code after an update: .. code-block:: bash $ http --headers PATCH example.org/Really-Huge-Resource name='New Name' Since we are only printing the HTTP headers here, the connection to the server is closed as soon as all the response headers have been received. Therefore, bandwidth and time isn't wasted downloading the body which you don't care about. The response headers are downloaded always, even if they are not part of the output ================ Redirected Input ================ **A universal method for passing request data is through redirected** ``stdin`` (standard input). Such data is buffered and then with no further processing used as the request body. There are multiple useful ways to use piping: Redirect from a file: .. code-block:: bash $ http PUT example.com/person/1 X-API-Token:123 < person.json Or the output of another program: .. code-block:: bash $ grep /var/log/httpd/error_log '401 Unauthorized' | http POST example.org/intruders You can use ``echo`` for simple data: .. code-block:: bash $ echo '{"name": "John"}' | http PATCH example.com/person/1 X-API-Token:123 You can even pipe web services together using HTTPie: .. code-block:: bash $ http GET https://api.github.com/repos/jkbr/httpie | http POST httpbin.org/post You can use ``cat`` to enter multiline data on the terminal: .. code-block:: bash $ cat | http POST example.com ^D .. code-block:: bash $ cat | http POST example.com/todos Content-Type:text/plain - buy milk - call parents ^D On OS X, you can send the contents of the clipboard with ``pbpaste``: .. code-block:: bash $ pbpaste | http PUT example.com Passing data through ``stdin`` cannot be combined with data fields specified on the command line: .. code-block:: bash $ echo 'data' | http POST example.org more=data # This is invalid To prevent HTTPie from reading ``stdin`` data you can use the ``--ignore-stdin`` option. ------------------------- Body Data From a Filename ------------------------- **An alternative to redirected** ``stdin`` is specifying a filename (as ``@/path/to/file``) whose content is used as if it came from ``stdin``. It has the advantage that **the** ``Content-Type`` **header is automatically set** to the appropriate value based on the filename extension. For example, the following request sends the verbatim contents of that XML file with ``Content-Type: application/xml``: .. code-block:: bash $ http PUT httpbin.org/put @/data/file.xml ================= Terminal Output ================= HTTPie does several things by default in order to make its terminal output easy to read. --------------------- Colors and Formatting --------------------- Syntax highlighting is applied to HTTP headers and bodies (where it makes sense). You can choose your prefered color scheme via the ``--style`` option if you don't like the default one (see ``$ http --help`` for the possible values). Also, the following formatting is applied: * HTTP headers are sorted by name. * JSON data is indented, sorted by keys, and unicode escapes are converted to the characters they represent. * XML data is indented for better readability. One of these options can be used to control output processing: ==================== ======================================================== ``--pretty=all`` Apply both colors and formatting. Default for terminal output. ``--pretty=colors`` Apply colors. ``--pretty=format`` Apply formatting. ``--pretty=none`` Disables output processing. Default for redirected output. ==================== ======================================================== ----------- Binary data ----------- Binary data is suppressed for terminal output, which makes it safe to perform requests to URLs that send back binary data. Binary data is suppressed also in redirected, but prettified output. The connection is closed as soon as we know that the response body is binary, .. code-block:: bash $ http example.org/Movie.mov You will nearly instantly see something like this: .. code-block:: http HTTP/1.1 200 OK Accept-Ranges: bytes Content-Encoding: gzip Content-Type: video/quicktime Transfer-Encoding: chunked +-----------------------------------------+ | NOTE: binary data not shown in terminal | +-----------------------------------------+ ================= Redirected Output ================= HTTPie uses **different defaults** for redirected output than for `terminal output`_: * Formatting and colors aren't applied (unless ``--pretty`` is specified). * Only the response body is printed (unless one of the `output options`_ is set). * Also, binary data isn't suppressed. The reason is to make piping HTTPie's output to another programs and downloading files work with no extra flags. Most of the time, only the raw response body is of an interest when the output is redirected. Download a file: .. code-block:: bash $ http example.org/Movie.mov > Movie.mov Download an image of Octocat, resize it using ImageMagick, upload it elsewhere: .. code-block:: bash $ http octodex.github.com/images/original.jpg | convert - -resize 25% - | http example.org/Octocats Force colorizing and formatting, and show both the request and the response in ``less`` pager: .. code-block:: bash $ http --pretty=all --verbose example.org | less -R The ``-R`` flag tells ``less`` to interpret color escape sequences included HTTPie`s output. You can create a shortcut for invoking HTTPie with colorized and paged output by adding the following to your ``~/.bash_profile``: .. code-block:: bash function httpless { # `httpless example.org' http --pretty=all --print=hb "$@" | less -R; } ============= Download Mode ============= HTTPie features a download mode in which it acts similarly to ``wget``. When enabled using the ``--download, -d`` flag, response headers are printed to the terminal (``stderr``), and a progress bar is shown while the response body is being saved to a file. .. code-block:: bash $ http --download https://github.com/jkbr/httpie/tarball/master .. code-block:: http HTTP/1.1 200 OK Connection: keep-alive Content-Disposition: attachment; filename=jkbr-httpie-0.4.1-33-gfc4f70a.tar.gz Content-Length: 505530 Content-Type: application/x-gzip Server: GitHub.com Vary: Accept-Encoding Downloading 494.89 kB to "jkbr-httpie-0.4.1-33-gfc4f70a.tar.gz" / 21.01% 104.00 kB 47.55 kB/s 0:00:08 ETA If not provided via ``--output, -o``, the output filename will be determined from ``Content-Disposition`` (if available), or from the URL and ``Content-Type``. If the guessed filename already exists, HTTPie adds a unique suffix to it. You can also redirect the response body to another program while the response headers and progress are still shown in the terminal: .. code-block:: bash $ http -d https://github.com/jkbr/httpie/tarball/master | tar zxf - If ``--output, -o`` is specified, you can resume a partial download using the ``--continue, -c`` option. This only works with servers that support ``Range`` requests and ``206 Partial Content`` responses. If the server doesn't support that, the whole file will simply be downloaded: .. code-block:: bash $ http -dco file.zip example.org/file Other notes: * The ``--download`` option only changes how the response body is treated. * You can still set custom headers, use sessions, ``--verbose, -v``, etc. * ``--download`` always implies ``--follow`` (redirects are followed). * HTTPie exits with status code ``1`` (error) if the body hasn't been fully downloaded. * ``Accept-Encoding`` cannot be set with ``--download``. ================== Streamed Responses ================== Responses are downloaded and printed in chunks, which allows for streaming and large file downloads without using too much RAM. However, when `colors and formatting`_ is applied, the whole response is buffered and only then processed at once. You can use the ``--stream, -S`` flag to make two things happen: 1. The output is flushed in **much smaller chunks** without any buffering, which makes HTTPie behave kind of like ``tail -f`` for URLs. 2. Streaming becomes enabled even when the output is prettified: It will be applied to **each line** of the response and flushed immediately. This makes it possible to have a nice output for long-lived requests, such as one to the Twitter streaming API. Prettified streamed response: .. code-block:: bash $ http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track='Justin Bieber' Streamed output by small chunks alá ``tail -f``: .. code-block:: bash # Send each new tweet (JSON object) mentioning "Apple" to another # server as soon as it arrives from the Twitter streaming API: $ http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track=Apple \ | while read tweet; do echo "$tweet" | http POST example.org/tweets ; done ======== Sessions ======== By default, every request is completely independent of any previous ones. HTTPie also supports persistent sessions, where custom headers (except for the ones starting with ``Content-`` or ``If-``), authorization, and cookies (manually specified or sent by the server) persist between requests to the same host. -------------- Named Sessions -------------- Create a new session named ``user1`` for ``example.org``: .. code-block:: bash $ http --session=user1 -a user1:password example.org X-Foo:Bar Now you can refer to the session by its name, and the previously used authorization and HTTP headers will automatically be set: .. code-block:: bash $ http --session=user1 example.org To create or reuse a different session, simple specify a different name: .. code-block:: bash $ http --session=user2 -a user2:password example.org X-Bar:Foo To use a session without updating it from the request/response exchange once it is created, specify the session name via ``--session-read-only=SESSION_NAME`` instead. Named sessions' data is stored in JSON files in the directory ``~/.httpie/sessions//.json`` (``%APPDATA%\httpie\sessions\\.json`` on Windows). ------------------ Anonymous Sessions ------------------ Instead of a name, you can also directly specify a path to a session file. This allows for sessions to be re-used across multiple hosts: .. code-block:: bash $ http --session=/tmp/session.json example.org $ http --session=/tmp/session.json admin.example.org $ http --session=~/.httpie/sessions/another.example.org/test.json example.org $ http --session-read-only=/tmp/session.json example.org **Warning:** All session data, including credentials, cookie data, and custom headers are stored in plain text. Note that session files can also be created and edited manually in a text editor; they are plain JSON. See also `Config`_. ====== Config ====== HTTPie uses a simple configuration file that contains a JSON object with the following keys: ========================= ================================================= ``__meta__`` HTTPie automatically stores some metadata here. Do not change. ``implicit_content_type`` A ``String`` specifying the implicit content type for request data. The default value for this option is ``json`` and can be changed to ``form``. ``default_options`` An ``Array`` (by default empty) of options that should be applied to every request. For instance, you can use this option to change the default style and output options: ``"default_options": ["--style=fruity", "--body"]`` Another useful default option is ``"--session=default"`` to make HTTPie always use `sessions`_. Default options from config file can be unset for a particular invocation via ``--no-OPTION`` arguments passed on the command line (e.g., ``--no-style`` or ``--no-session``). ========================= ================================================= The default location of the configuration file is ``~/.httpie/config.json`` (or ``%APPDATA%\httpie\config.json`` on Windows). The config directory location can be changed by setting the ``HTTPIE_CONFIG_DIR`` environment variable. ========= Scripting ========= When using HTTPie from **shell scripts**, it can be handy to set the ``--check-status`` flag. It instructs HTTPie to exit with an error if the HTTP status is one of ``3xx``, ``4xx``, or ``5xx``. The exit status will be ``3`` (unless ``--follow`` is set), ``4``, or ``5``, respectively. The ``--ignore-stdin`` option prevents HTTPie from reading data from ``stdin``, which is usually not desirable during non-interactive invocations. Also, the ``--timeout`` option allows to overwrite the default 30s timeout: .. code-block:: bash #!/bin/bash if http --check-status --ignore-stdin --timeout=2.5 HEAD example.org/health &> /dev/null; then echo 'OK!' else case $? in 2) echo 'Request timed out!' ;; 3) echo 'Unexpected HTTP 3xx Redirection!' ;; 4) echo 'HTTP 4xx Client Error!' ;; 5) echo 'HTTP 5xx Server Error!' ;; *) echo 'Other Error!' ;; esac fi ================ Interface Design ================ The syntax of the command arguments closely corresponds to the actual HTTP requests sent over the wire. It has the advantage that it's easy to remember and read. It is often possible to translate an HTTP request to an HTTPie argument list just by inlining the request elements. For example, compare this HTTP request: .. code-block:: http POST /collection HTTP/1.1 X-API-Key: 123 User-Agent: Bacon/1.0 Content-Type: application/x-www-form-urlencoded name=value&name2=value2 with the HTTPie command that sends it: .. code-block:: bash $ http -f POST example.org/collection \ X-API-Key:123 \ User-Agent:Bacon/1.0 \ name=value \ name2=value2 Notice that both the order of elements and the syntax is very similar, and that only a small portion of the command is used to control HTTPie and doesn't directly correspond to any part of the request (here it's only ``-f`` asking HTTPie to send a form request). The two modes, ``--pretty=all`` (default for terminal) and ``--pretty=none`` (default for redirected output), allow for both user-friendly interactive use and usage from scripts, where HTTPie serves as a generic HTTP client. As HTTPie is still under heavy development, the existing command line syntax and some of the ``--OPTIONS`` may change slightly before HTTPie reaches its final version ``1.0``. All changes are recorded in the `changelog`_. ========== Contribute ========== Bug reports and code and documentation patches are greatly appretiated. You can also help by using the development version of HTTPie and reporting any bugs you might encounter. Before working on a new feature or a bug, please browse the `existing issues`_ to see whether it has been previously discussed. If the change in question is a bigger one, it's always good to discuss before your starting working on it. Then fork and clone `the repository`_. It's very useful to point the ``http`` command to your local branch during development. To do so, install HTTPie with ``pip`` in editable mode: .. code-block:: bash $ pip install --upgrade --force-reinstall --editable . Please run the existing suite of tests before a pull request is submitted: .. code-block:: bash python setup.py test `Tox`_ can also be used to conveniently run tests in all of the `supported Python environments`_: .. code-block:: bash # Install tox pip install tox # Run tests tox Don't forget to add yourself to `AUTHORS.rst`_. ======= Logo ======= See `claudiatd/httpie-artwork`_ ======= Authors ======= `Jakub Roztocil`_ (`@jkbrzt`_) created HTTPie and `these fine people`_ have contributed. ======= Licence ======= Please see `LICENSE`_. ========= Changelog ========= *You can click a version name to see a diff with the previous one.* * `0.9.0-dev`_ * `0.8.0`_ (2014-01-25) * Added ``field=@file.txt`` and ``field:=@file.json`` for embedding the contents of text and JSON files into request data. * Added curl-style shorthand for localhost. * Fixed request ``Host`` header value output so that it doesn't contain credentials, if included in the URL. * `0.7.1`_ (2013-09-24) * Added ``--ignore-stdin``. * Added support for auth plugins. * Improved ``--help`` output. * Improved ``Content-Disposition`` parsing for ``--download`` mode. * Update to Requests 2.0.0 * `0.6.0`_ (2013-06-03) * XML data is now formatted. * ``--session`` and ``--session-read-only`` now also accept paths to session files (eg. ``http --session=/tmp/session.json example.org``). * `0.5.1`_ (2013-05-13) * ``Content-*`` and ``If-*`` request headers are not stored in sessions anymore as they are request-specific. * `0.5.0`_ (2013-04-27) * Added a `download mode`_ via ``--download``. * Bugfixes. * `0.4.1`_ (2013-02-26) * Fixed ``setup.py``. * `0.4.0`_ (2013-02-22) * Python 3.3 compatibility. * Requests >= v1.0.4 compatibility. * Added support for credentials in URL. * Added ``--no-option`` for every ``--option`` to be config-friendly. * Mutually exclusive arguments can be specified multiple times. The last value is used. * `0.3.0`_ (2012-09-21) * Allow output redirection on Windows. * Added configuration file. * Added persistent session support. * Renamed ``--allow-redirects`` to ``--follow``. * Improved the usability of ``http --help``. * Fixed installation on Windows with Python 3. * Fixed colorized output on Windows with Python 3. * CRLF HTTP header field separation in the output. * Added exit status code ``2`` for timed-out requests. * Added the option to separate colorizing and formatting (``--pretty=all``, ``--pretty=colors`` and ``--pretty=format``). ``--ugly`` has bee removed in favor of ``--pretty=none``. * `0.2.7`_ (2012-08-07) * Compatibility with Requests 0.13.6. * Streamed terminal output. ``--stream, -S`` can be used to enable streaming also with ``--pretty`` and to ensure a more frequent output flushing. * Support for efficient large file downloads. * Sort headers by name (unless ``--pretty=none``). * Response body is fetched only when needed (e.g., not with ``--headers``). * Improved content type matching. * Updated Solarized color scheme. * Windows: Added ``--output FILE`` to store output into a file (piping results in corrupted data on Windows). * Proper handling of binary requests and responses. * Fixed printing of ``multipart/form-data`` requests. * Renamed ``--traceback`` to ``--debug``. * `0.2.6`_ (2012-07-26) * The short option for ``--headers`` is now ``-h`` (``-t`` has been removed, for usage use ``--help``). * Form data and URL parameters can have multiple fields with the same name (e.g.,``http -f url a=1 a=2``). * Added ``--check-status`` to exit with an error on HTTP 3xx, 4xx and 5xx (3, 4, and 5, respectively). * If the output is piped to another program or redirected to a file, the default behaviour is to only print the response body. (It can still be overwritten via the ``--print`` flag.) * Improved highlighting of HTTP headers. * Added query string parameters (``param==value``). * Added support for terminal colors under Windows. * `0.2.5`_ (2012-07-17) * Unicode characters in prettified JSON now don't get escaped for improved readability. * --auth now prompts for a password if only a username provided. * Added support for request payloads from a file path with automatic ``Content-Type`` (``http URL @/path``). * Fixed missing query string when displaying the request headers via ``--verbose``. * Fixed Content-Type for requests with no data. * `0.2.2`_ (2012-06-24) * The ``METHOD`` positional argument can now be omitted (defaults to ``GET``, or to ``POST`` with data). * Fixed --verbose --form. * Added support for `Tox`_. * `0.2.1`_ (2012-06-13) * Added compatibility with ``requests-0.12.1``. * Dropped custom JSON and HTTP lexers in favor of the ones newly included in ``pygments-1.5``. * `0.2.0`_ (2012-04-25) * Added Python 3 support. * Added the ability to print the HTTP request as well as the response (see ``--print`` and ``--verbose``). * Added support for Digest authentication. * Added file upload support (``http -f POST file_field_name@/path/to/file``). * Improved syntax highlighting for JSON. * Added support for field name escaping. * Many bug fixes. * `0.1.6`_ (2012-03-04) ------------ .. image:: https://d2weczhvl823v0.cloudfront.net/jkbr/httpie/trend.png :target: https://bitdeli.com/free :alt: Bitdeli Badge .. _Requests: http://python-requests.org .. _Pygments: http://pygments.org/ .. _pip: http://www.pip-installer.org/en/latest/index.html .. _Tox: http://tox.testrun.org .. _Github API: http://developer.github.com/v3/issues/comments/#create-a-comment .. _supported Python environments: https://github.com/jkbr/httpie/blob/master/tox.ini .. _Ubuntu: http://packages.ubuntu.com/httpie .. _Debian: http://packages.debian.org/httpie .. _the repository: https://github.com/jkbr/httpie .. _these fine people: https://github.com/jkbr/httpie/contributors .. _Jakub Roztocil: http://subtleapps.com .. _@jkbrzt: https://twitter.com/jkbrzt .. _existing issues: https://github.com/jkbr/httpie/issues?state=open .. _claudiatd/httpie-artwork: https://github.com/claudiatd/httpie-artwork .. _0.1.6: https://github.com/jkbr/httpie/compare/0.1.4...0.1.6 .. _0.2.0: https://github.com/jkbr/httpie/compare/0.1.6...0.2.0 .. _0.2.1: https://github.com/jkbr/httpie/compare/0.2.0...0.2.1 .. _0.2.2: https://github.com/jkbr/httpie/compare/0.2.1...0.2.2 .. _0.2.5: https://github.com/jkbr/httpie/compare/0.2.2...0.2.5 .. _0.2.6: https://github.com/jkbr/httpie/compare/0.2.5...0.2.6 .. _0.2.7: https://github.com/jkbr/httpie/compare/0.2.5...0.2.7 .. _0.3.0: https://github.com/jkbr/httpie/compare/0.2.7...0.3.0 .. _0.4.0: https://github.com/jkbr/httpie/compare/0.3.0...0.4.0 .. _0.4.1: https://github.com/jkbr/httpie/compare/0.4.0...0.4.1 .. _0.5.0: https://github.com/jkbr/httpie/compare/0.4.1...0.5.0 .. _0.5.1: https://github.com/jkbr/httpie/compare/0.5.0...0.5.1 .. _0.6.0: https://github.com/jkbr/httpie/compare/0.5.1...0.6.0 .. _0.7.1: https://github.com/jkbr/httpie/compare/0.6.0...0.7.1 .. _0.8.0: https://github.com/jkbr/httpie/compare/0.7.1...0.8.0 .. _0.9.0-dev: https://github.com/jkbr/httpie/compare/0.8.0...master .. _AUTHORS.rst: https://github.com/jkbr/httpie/blob/master/AUTHORS.rst .. _LICENSE: https://github.com/jkbr/httpie/blob/master/LICENSE httpie-0.8.0/httpie.png000066400000000000000000015745271227074336400150540ustar00rootroot00000000000000PNG  IHDRCCotEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp yCIDATx |\ŕ>U/WKnYdɶl;,aw6I2d$dfd! lـ@}öI[][uVZ Uu99NJ) 2dȐ!C 2dF$"q !C 2dCLs 2Ɛ!C 2dЇH0d; 2dȐ!C>`ɀ!>l,C 2dȐw/QC }8 2dȐ!C=}@ 2`i 2dȐ!C>L@f z? .?ϐ!C 2d.?π!C0t*yiȐ!C 2a8'z%02`ȀSpOp 2dȐ!CDO}O)Z1`Ȁ#:U ɀ%C 2dȐzsPdC"t3 Ȑ!C 2dhl@>taw Jr"D 2dȐ!CLq72`ȀSN6DNs2Nm4@ɐ!C 2dAOq~C50t2)mc萓V2dȐ!C }ߏLN0dл |F&uΐ!C 2dωD ' 0dxA"r4dȐ!C '9C @X{ 2dȐ!C6@w']D 0nAd; 2dȐ!C>`)8|7P" o tѠ-z*2dȐ!C tAMOlhC (H8X"D'z!C 2dѓn Nu zWX#:d`n(]u"`Ȁ%C 2d_ @H'r3Iu0d{RT(4{C 2dȐ2` -:DE݋=D 0^@I(@:2dȐ!C tBgki} 2`dXAH:g4t"hvdȐ!C "뱂@M7ce zxdy]:( 6h@!C 2d , H}GGyx" 3:*q]gh=Q3{ 2dȐ!Cdn T@i>itx6`Ȁ@BDR}r_1O}  2dȐ!C ']PYA*`f/< ' Ɯ.gC' RI JS&+w}5}S ~g+!'T=#%Ҹ&3D]O-w7_Htwى" 040J'"t@H.f@hWOsh4|T_+ X,\T{u^j{u<)|yj*\A_2%k77S;9qa}[}w죮4AXQFG 0:٨Љ!2&=z&S#_U&e!?K ="R۔3qO|g6N9%:!։uHd>%++d:So0GVԤptȀ!>F|6wE"FYa.vY8M7м[z?U8_2}Ua+_<\ W 7YײUA[č6v W5m7:c߬2O{SY} 2`()KTT!5ɀԽ{ UY:" Y,B\A&BF,5 ^9]@ SSo{&ȴBS'ߊ0:dţz Uةե }377y Քzdd$6q-k ۫BR*Pm2UΑZ𐼼Y=Lui2ϰKbׂbLS_M_跬SlF#I1Td}LdCVp][W?of_|F{w~}foo/󟃞'xSN/Ord'o(Q棊-IV5ǀ<'w"@'-$OHy,lw 6 M\ ݃Ν ~T↦ixdZXp50]_2x&J;P=2PԌ/كǞ}lKqyrr>mk&u\4~=feU7g_ڊڈlzuU\ %zdaϸВYMr"ҧOnFl1_MwP=^A .7Yι*.?}ϾAL{M?21ω< <2cv?{Ma0ČIg෷܆o5w_5x7񩧞BUUI"Rj$CK Td@qCdX &|"z4BH]:ހ,Fټ"EF9 cFN:6njON> kPݿ+?#$#È kfw2!tvފbfa{6e!srC!! M۶ݥp˅&󦩛Pea*NZ5g\<|_5%Cĉ Yȹz( ^TWsoe!W/+r177[cBW?!{~0 >vߠ,XGq5v{?މO?7 _WeZW|=o pØُ}ǰ+pr'gckS  8s[g#:0'C^ް@ι3  0NSwb.|ߺ4 xZ3bC}GPattroVGxfg%gㆫ.Č<]O[kֿY@?k쑁<駟%K`֬Y4e]aP_ר&*4l=5.YjҌo 2`褣@$P2P|?W0BO13jz@ Rn!tu1C }Q BRIΙ0=.fPW0ߊ䐑~f(-)qEd&:eE5 #& ϵHA7ąz*hBP e! re5Ձ9]jR,,sĸpA*0d++>dy rBq~v%,cqSADg:$&{kZ/}Ox؀_o֧2Qbݫh{xdcmW1A82uoP4AcEVvG2jX{#=L6]wb<@H)q2 `UUh=@#T{LCV{{n,9L>!"lsrtuخYfwE0 Ԅo:| _E2k7R+sgcժU@ee%֭[3f`ppt$Χ$&oQ "2 2JCH 3T%Ӊ|g-l6No7_Gcir*R] e`DY!$ 5oA?2fB|6DO64͞fZooM4Zh9e`9" F( 3P4!Ԗ4Dž>o6=XpJd]!heOɒ.?YJR$  9}@=$Ք '"\'ҏf<_V~rP{>w֏G|Q<*C܋Ww W| K7qBQ~ttQTMd<<}";Cb<6zo 1&ۇ;g0QfF% \~TNeY8{(bl\b 2㩾LWU7a·'+J;zh?bVd+s>Jh_}زy+z3?%s2߬ 322PSS_|&MJhsX[[j_W%PCD@ "EbT(v+5ɀ!rג4wJ:\ɾsQ`+-n0 .*?Q+ņ#G1P] (+|"zlz-d:9ȱFbx$SPY;VgfsA~ -%e2c*%QƺC^sOmRB[Mk W!m’7^7bS9d,,*@ Ok vކG WY^q3>}ćZ8%jyʦ]c^kv0ӅeڏHk;3@j5*+@50ٙy_3֯ن!Y״aߡD0~ r3X΅sd){.عG rUR`yd% "WʇN\}K>A*r_(LjNm*m}dO\*B%*3 ?kE#~,<'mɚK?K*X#}8z˾Kx3ĢqvzA| {l1tBX[r'wݦ%w.B">/qэ(gi^~l8Xo&dv@/|4>f1 .S_!6v#ʚBa8l=3<O{{o݂ {W=_js^V7ajITDBfRBu)2'lt3>!8ir(RMI$)tdMwL2=KHwV/>!_( V^9:$j O_=g>YchTNk݀G/ .Y$ACh^v~-Kb.[ٙgE% m=>n‚RTOl@MtdU-)r5;W=Zr|,UER$;AVShrʂ]m^T\I'{M.x斫^dgq G_=c?Kտ[2Ԗ>Cvp dGQU_vs,MBm?*RςBdcn@!**& 0B~t\K5Cg?((5&I24dh`(Ylv?^Fq0jժ!\Y\JJNNk$tww[|dˢfeeYFߦ@10d(]0Dҩ d(UDȧ5\^!E^\ب2PBCTF)ˣVbQ) F/JBwvhNs!}=se:]afJ}do6~,ux/bɛ5"OɖF:drű_=3Cdt"OWs |m݊1n1.XXz{#Uu5وUddiA ʲ`o)Z o򿾾ޓB(*>|ؓ]tѭ jP,g!&0RP H6`ȀtBUtiq$P?]Ĩg[쨇 ;Z>@,hY0q J\/W,B`5DITtԩ)QI*Z5!𗅩:;['|-{ %Pk3h_62_Fier|鲓'+FIa~bU;F 77e]) J~R$IEb)2`I]@AK&$"V⹷K[rBQU9X|#o'Xj!ɨBP95A# ZAG&q%I卝BHqk'c(E(Wr[^=qO D|h9 \m0)~?نc]=/߬#e ɫQ,ƶ;2UQd2q %KSFMuFP7|.R4'S>%[<#89VYS=˕iSн]=`M>W@,)9d/{h͢2?Xg !_#7-oˌʇ e%~=I$HN&E;~t#D&2d"C' JRY(j,{⯯>,z!s t^R9L#WXBN[u տ(d4SQeY} M,O7O151ND#$剋ʽ(mI&O$^S9!_GW,:D4ё2H(c32Jъxj梼v]~CsdyldVEҳS1O%Ǵ2Ǜl&c?ޥ&|H3E+g[x#NPQ7))ei2:+uUxsM1י(CG=AMQ]NȯX/GBM]D&QCr*!29XkDI""&;36O U*U&!ȅD";k<7mIMR"DF4rqO" ØRwꢦ U޹F&/ց!FvTDUVyC9C,Ujh3,V;zTJ;>I (SDKTeSU+R22V 6$ Eմ ct YSEh)! .Aq/E 8Q >J((QS2C &Q%OI2\>rjڄX5)g D@wP#e=^OpqD)Mه@=O7H 4NiiSWx;5TY{] +kL5P O'~*5ՆK@7%_y+%VqP}0^54.K9mjy\ˆk1:)F(R dU R\R|wԳd9zVjRNI@"i9Ռ eOdG4zGɉPWPvP$is߸NROf<)1Vﺢ;h&?U nML0U6= 8iȐNUiM~̻`)n 9l~V(A|cǫ#dNyjߌy3 #o>߮ӨF'JG{㆛DCݷHYYI+C&5aNM.mİe5S[{Ti 3_G#@O@>Ms4!oGA,TdYoف774:L<倸9`}\Pڹ#B~gm ޽_YS眏NW'v 1SfJdơ][*Qxp\\ PB]K祦#@2\E72]JGd(ϐ LŊ;weN^/M؞" nc-)".d/dZDۆyY2*K 2Í7^L<-)a+\)I1M>y+PqPjzh#vPx!ܜ٨†5jc>n*֞x^=8TSCJSil)qϫd Ԣb]C!UEI¨S--'bh] g,G yD*]NS2c|y`n {^t*K8UT㬹SQ!:ҍbzFS޹yi-;gw%|+z6X$+,Yq!? )Ɩ6/M새K"dm^(PçztL{}hJ0<ЉcG |OWQ.T:ohJ'f")LxTr)QT]S\ yUՓX/ *ZQDPk+Tgozxáic^E]|bF0QSЎa߆(&@B<޹Ja۟?b%kOݞݛ]˦lt ԇL .ZP03Q]x߻EeS+h?kG0Pmx:qy{]ՎǗ߂ݺ=ٳ^&{t^}io~Aէ/q9:$h኏d,ITn$AُK~QGRɫBix$,ɖ,&Wl٢lI\12b ⫷.p.GU6&e#Ln.^#wlGq͋f\l1I00t%Q`+%a)(]Kg½2PhtrLEA/bb|duq"t|5GzU)'+S)*GDü=XMF–^BM󖷦ʹj,"vn{a%8c$ g+ Jb\p0-++`ڜN3 M) E]%]{)4<ǎ lf$EŌ!dZz<߽>TT"H_MD=Ƙ,cd$VR\ѕVךurB睝o;(Z{wy6˥6d1B#ڳg]f9-m@hxms䰶H8gPl;. %"@2Ȁ>'Er1d鍮K.= wnCFCZ᪙xύ*'2|٨*@&=2w6[q kѐu*vYM7^Z+Upt3VcaL]8ĘEyU#ٵAo4rQo2ݶ"&l) 7]l~7}qlu:*j=MLL= ؇Ig50Q~+R:B݋E:}{@:\:uo|_"|g^p9wݞk hU 6{)1>By FUOJx>-ݲsxbU\-o^ӫ쓌}#8/ۜ믻u6s<MMe u3 쵿_a>}AKirq[ H05H`_0,[8y6ccoک47\<#ˬ6Va/geYςdB=m$EJю{y=p;[vo_|Oy>?V7/Ǎ)gw^ïVÍ76gc0Um1m#zb,wa}ϴu~ߡx5ˬn9 yl|w.A4Z̙sΚ[|\>pOn"|n6Ofm̳9Ym13UՋ.vMeye~=̮i{O-=q9gɖIYFX͒-j87]uk 9l.k紜skPg[zk?Jsʅ'd1| kvu9:6#Lֽn{!{uQiMFж^\jcD}xP=֣>u8z"Ր7˼Atx՚qd9 #+d]tܳXq$|=R,lF#Lh'[k9el-?me\F>a> \{IvxZtRWxjJg~D8+a<x-ia9g3v9 5 è[0 s!"[x<ư8 +1tf|ebɨݰyٲ8Ssd9xrEI;#2q͵Nav_no5x gT0I[3YgEYeαf]q4qS(t /%?ۙ7ց?3 oWHnR g;kb Єq4 }7@]Cɮ&M=~:ʂlœ+A;o#~gPmճ|sW p/a0iLsĒd8A"ҝ ]gc@1_&jJ!L_YESk k}Mwy,d{ 2u%i5^=ؖੴdVXN̐l>!#2l,E5ə>eĺe C6>1Av4YYBF-f0Y؎+KYYۛHWO7_O5=+Ku!d`9gPbpd֦ͥsU#Za{_ 6XOm }@cHI "4 lD 2ڧ5!J$KUqCNtPbiS:EeY.x~gp#HiB?Pƌ(S2g͟^G[DcvBRY*"#{!>6q yts]yl+u?GK ~Wtijnbn"g1/٣xMҎRI(%ŨcLj֧ͅ]wj((Zi 0Ml=M&$8g ;Ҥ(uV}nn= J܅bGGo,ڃc8ڟp:-A^dvlێ_ݻ$؂o|n!|Ƕ) FI7^CX;uͷaf,\[:OٚJOCnY-fa6gﷳ6[rl=~6og [hJ޷{:`Vd̛î= W3L۰n_%=|hSku磬b:-\U=8eW|/ ϳތ&38޽)TWLҳyoQ_…(lD3݅-V 04ks|66#>c} w]SƮ9`V|xlٿ,-U>˃̀KP"[p2jL|d~-zaUW0달_lns/igsmJ]8dg?{+Ki.{Z_iu׏ovZkֺ5`AskG7ֿz[g|VwaS=>.TUh?E2u;DP'קOo2ٿMˮwΎY|47ZwNcQwuZ.B1Uٚ"$s菡C! $[֢ם19({gرk^4Uc-#xu.E;F)( 9q5^&iځ77 ]B=6vz%#Qd Z,ܐZz7RUJ&K=➤qFC/=ɒbv|#3.P\X<ƂhN,?b밣-e(̏qaa3^{=r"o]}/)Bm +1FPK$VL5<{u 6|Yk,q^xߗaƋ.ߚ|3fݖCtZxݻ 3OGl$> ÆqpQGÞjsPZMp,>cW`&32}]9 /FA>oTx%;i&"O,C{ e-k-G6ی5\Fv_%l{hrzǙ>(:Tdl{Uax]~-YG}7{'2b=':kע=_"^<8Ę:?0҉#&W-' Rkn> ̟-I Is'#֠ FBY3;Vq*zltGKw=N"cJ7mo?؃ Θ d8,ZD~^ %?'0% 2X|J էzЬX;"pxo*Mxi"V v__>,`YV6pj?v1)97K/\̘f@EXre ^x`\:~얺;/3;[r5aWHB ei\Fĕ rwAgpK|;'GgX`UK{ٽ8[ _WJWt3zN(uTmG:N]-@"1dc}v Ԧ0CųYWMʛ]o h 0\n܊bBu#b˭ٳx'~2҅ZIh*-sz̬imDt+6HQTe-Tl| 3J񋄆dR|8N':b{Ůi~ѽ] qoPl!x-֯ok$4F/1լJbZW.Sօ能.(FdG3W]sqë.Vz$( H{D_}c#ԞҼ2Z+"`baw#.FBJH{{D!`<\A/Tylk+Ia9M=GOc 7.>ݝ, pҧ>O3a3Ñ8GԲxfn~T^"҅Z,|.Vry TjƛD;ҧr\޽ G7Qwnʘ3؂Ī|Ng4oo;%q۱R.^%;F4GT> 04ڱ&2?%F;kk1mN}腟0{n1K:zӾEߏP{SƉm 1 rήDZ )(>zA׶ +CZD 8+:)UQ#>7:ҀI٥/Y4/z@s#&.-71( l:+VD%g/8n,f"xNՔUgP7nJb:,s>W[m^63|H 21rC gZw gؿedR'L^[97ew,u)cDN@ے%i#!Hm$ƢJsS{.m)ԈAlۇ Xp(b8ëq&g8F a,*g}?|l{^H{/D'[Fp/"aCHJgw߽2pD}1mf+63f-XĮ:z mbl5qXhW#R*K_ڌ __wL|3@_z^FsY~8{9+w9*F廨Ϸ?Û\O2M!lEwnکEcs&dbs-l p\%)DצwΙ`gOXJTTstmpR+թJk,L+ek/."-;Gcc_cXIhY6-XLFu2UiS9VWmYOb]v#Tu-| Pʺ{*\%A 927^6ut+GE=նk2PZŸKTqmC4- ȍtRF9NGɮKAl,7NkiD>S>9<dTI &dit0Ϲ!k#besE$d)!l± Iv0ZTRw_IyEH>{dnpڅ(DL|Xۆx׊WYӲq6foz R]؊ g!? .JxpS7#$G}9=>QM$dblm¾|\r1F)͑9`F&X:Ǎ:WeXT~WTFRtE9\ a&EٳJ$]^ 2'!#Zm4g&wGwl*aAOŭRf@ ]V RFY=+uιr~?t+fDY@uQ1/K2LFN(ʰ< !DaIPc\hoLP؆$wBm5䀢[ԅFF"i:} T+ z~YQI QԞ|^gL sqga,X_Ȋ\={ӭTֺ<ȇ q+b{RbT*5O23ݺ+x w<6kc}ak;#.NZkّat﫜kq{k*Ǯٺ2֕RNn$g}F"L̄|g>6o؋g_cc6s2eb%,2J,* ][~w?lΣp'ZvBz/1 !H. qJgX*)>*PTʊ33|V cCځ5dhL@H(Q M-³8vŁLx&r 7vJF=z3-D^R|rlۏL4~$t 0-dAL%9"TlbuF>#GY^E*1%8<'hNLO: Uo'y gc"70b8/ PVeSS1D[$2In@it9_k簹z6Z:< Uua | ]p.E馣hbEcŶ'MRs)ӻ]Eɛ^cxp!`yX\]Kov5u,c탿v/C14>^~_H ),8b5bqM9.5}ɨ* `wa1YH]3[<:sЎIFQ߼r&b2 8d]%Llz 7zcjafaU kWj4[gP~eJk:/3z֚C; uC]eq>ގ^/֝(<эC}TSJNb&Lk %\t[ 8s~KVu!AO@Ɍ li#GQ!F^aFy j4DeQbCxUh%zzTIiD J y(QxTq;FcS%]HecT9&t3{){aX8:t;#UbsQUgsH}c q40ICxsPؕOql8 9 sb^tf`9}%xVXTڇZNAs53c̜Z9kWΉm^LfP^rڜ05Ӹ$Ԇ}^Fxŝd$KFM*ɶ7Wԡ~W;%ɖhli=b\ 3@UB4Zrap|, M|- ܘd͍iSSX{j"ė3ou[gc"[X K  ,[RkM]k(3<A9C_;_FuQ}8<Te'2ycC{ӝ(CIS;r@3t&t .xaj9V?(A7]:mzqZtDkR Z4 섐+eg[r08Dc(k'ף̢Z[<P<ʮ}֠TTURiAh@ 1cm0682땤{^z+%/<166F$bЀT%JC js|{DǹUs=߼o|<<8EA\Q%ǹ|xARA&.X[!pªR[}1gwk]q*sx%N܅ _g!l{e_d:3oxĹflY945gHkR;'+׎ e0/ VD-V_ YՍ>WG L+1=`o3%-*<+rkҥ03;8m…Ҁ  '7Tsk B\546ӧ8ϋQsP, =ᵿ&+W1\!~KyzE%b+M^:?SNDMH$s|M9zq+°ϳb&|?@˲d>c! ]-i&5P_OB@,PF/O: ='QaᅤQ?ۮ֗aMl ~lAy]Luï [XmW_|&s}Oߋ|h 1;9~{m a^KѯA?Du^\q;9<:b`y*ϟ")?ÓE\8i ˽Y(߇ 1pvN6:y6S~A(!(z.4a˪pltRK XZEg!Lgy/XV,4 2y߽V iUK~r[=3&)xhx۬Ji:Jo&V=KgKQQQ2|W,6 -zs_9t<2GmӠBY2 U:Y 7wt8͹dÌʪ̳tV)^a?Igk!:Do>5SRSXLy[t#][)Vk6DS D@"!N35`wooL~ϛƺHdD>)?k_(aXS|-@ykۅʎ~ܓ\,]8 I??,$J9T](bA]/gԽ/gNPuZrZ<,' <Ӫbc~{Og Biz8EKUK/EN.W2u {Kpe$OG҉3 lrɱp:TvHTbGVYh淍T9qWIq) ,d΀CC<4Pe: s|$IZN;%;~TkuHYh*e(f$#:8ZRbYU@b> Ջ C!\fLkŕ]]I>W| )f2; qd:Y`mIAkywUd ډ)v_;vhV}^nk(.NC F #$Ac[bxGP~=ާ*Fǟƀ+Q i?~Z’ PM6#Q ՟ܛg K'^R$U yv:RH8GkY+,GZҪ<'x`υb%k gqjy ~v9 R n?E:N.Edy:~Է{56=N^EkE3Ȧx066xS3D'5{ST g5\cp>ՌiJ ~wY+9wE3(]~1d$;i$ TOCb}+&"Z砣9žI)dr&oז\33>U]>7m)?n~\7cߩ 1}.:59JjGwS,ߙ[Pc(EqukY+0H!VU3B3Zy 7U><8141DڑhITzOՅ})49$S"6$)D휁_@-j\+qU 4aN_ >B(-4pȑ&e[θ.~;-% ogrv..ʼnrV< \ 0ƞe~ՂxuSUB9E@l0( JD-c,$t28IȪTbUb% 1: TzdJga&{UdgBV׸pqw#1/ (3 Tsr3p* 3"}֑?kS@}R&wFs3#uTNv8d.~q `9%a8l!ǩax˚gcPf5ˤaĎp>pH$d·P:u*פp;8.Ӌg'sTȭ 51qZɀH.kl<[7W+Y]x6;#aJBֻsT7p1%9d7źuHW&g{IgXj˽U~b]XŝTB/,'HY+F&loG*ѵgZzh?$@x@Xa*̲" jWbA,GxQп4H+Q:E#ñX8*v*sm`T2( pe9&NSڤ#Z}~/ѳ8v"3feGIE6G0 g願`04LaCcEHb}+ ˜0ʟt0 d W/rEa/іH0?#$&՝CVnT <,v止sO܉؋/v -\+߃nZOOf,t$*7S(V7V|۰}~P;h9zO&*@ +#ˢΠ9r(\`\~w.N&cWl ܰlz̓`@-8'(-]z?n}o(~pAG9AHYWO`Cmg-o>m [w @1|?/$ .}肸7&S*!,v}~np(C?7fKpP .8zӅc6 cjŕ~?>vXyK Gyb>(5i#2IIyǕ CZOWgK㰳kvkz+kpUSnNgh0Y`f< _* sؽw<}"D $ -HDgq{㺍X>B:t6NH0hQf[EX_͡^)Zq9$rq|8"$*hNV OН5UA)$CFTAaC8(0bfD CEAifȠEaUxNSi ~9C.OR6(`åHd nVXnUD#f5 *+ſafssyh_s.fS;'_l ن1N6 ME5UoڄFo6;ۀ Ĺ38Pݭ|?>9g䚆B9EH6bNҮ1J iڛH˸R|{ $d?kn.`fc)m& i<3`)tA-Nt\U8;ُj AyY htRdtc4+ ]I>;>WŠpry.liR¡ в!k iM':MOnAñ?Ld.(k WpbVdo(`uxkNs[_5mJJjF}IMۮ 5ǒ5Ym{S:1to*M2c~&:hl%k.D ^),OP%,Sr:[ Go o%2gˊOG[zkP<B(Q D&mć2D-Ely5@c&H&Fȃʯ Qp0rCR`ۘ]~, XTcFeѢ% aD1f?ӎKt!jUHH9&dxnMت:"_C,%D#\*M((^TT\Tya$"A8R{gٟ@WC}fG I'V+W:x`ӕ{ʈtEΠ) W+VO*WTI"iN Y@;3ave~}>֖6^JC}V|To{wZQs8*^rZ!Wן_M csa42eyHz8|i;vP._|y;^l.Iq=BλLU!|(y1T2B$(;H% T{uީ{?}vꈾH<&ZM#C(Dy>)U[7xGȏ.?3KM *pL<#jY~'9Q"CAZPٶ'Ll'±XɲNtRXB!~^޾A8׊ gJ, >1^c<v;g앲6|}fL65$t:fmhUGDXMCPet*N\w}ذ{% ?+NMƔvF:f%,tAn^vF7tqb Rp7c5+1;|ێGڞzrC{|fӶ9zpd,&q|+t/&?@+}Ӽ}uh7:Yc8@0F6|JtlVznpӪ? <6Pįz;[+Aj® j)ze }5ѫRh*;C\sGA,oƩ3V_lGoM~|w=?[ڈոrl4S'ͨ;jlZNrЬԄ+mo:t u{J3T,ԷT瑄֊&4!>7 >r·qfw߃N;:~9{oÒTAOʼn#?bE /NCx4itNw szk' Asb _e]7Kaŵ]Y;~|.];]~],jK~-tavi?屧0(W2幞ᩤ*ϡ7f|cՌ^<|%}:nIwO\u|fV܋uI9P6KE0CY`Eg33Oҹ82HO#YM_uK hgsvD&>փǕ4mLy(r8Qqf׿ #bT:- CI|)]+SqEAA4VS w݉+zGhjG:!f'VY)#[#C ;ϔܖ7ƮvH!w@tEt'4Zo?=sl_"^w4N?nĽ]ː,(CC~\׃N\v9V*P2fNsZg%1լ09=.UеO8 `1AHJ{hѢ.447bjw/i4v 91\v#,6M-|owdGP*`.æpƁ Ghr'g!ZX+CW"i- iCIu()M֭bD#_4%pΟ:sޤXߵӘd7`?5>WYDvM5ӕ~nB -m󱸧 N`d+lb\hmÜ-h9m3Foz:g<9.ɿ7|%7gy5}ҥk0i{y/횚o[]cckbx>Un{嚔̶XQOmį 6EIи+{(J-ӈ9s|?]I2]'+ 0kޑ a>w_;qMWyG(Y;~%zGh_g0{v>L{-WktL}6ϟ߇g#>XBWohڊ6Wd''xMʛRQ>ĠXB>lq䜩7:s U9A4ՠԋr)pjL8^~ f^g(D&C5BLp!Q r d72Tt8YȞ D2gBi>Ȓ."~^A <(]j`Ct[.d(DaJ׼W,c[)d\C,R%h&WD^ْ޸r涴c͖铜9'>_<4>W>(a|ao~z̞ ^):5gs=~6˞7{ bdWj\3~+ع}1{&MlBގ|9Q>Qh( 2(wYz? Gpbءo.h/aK,sDZl JuK]M|*WUQh8wx<-4% i.l_=+~UCI;s{%sTYr;z =X^sس?/4]?W):Yh\[‹gzZ<\7/mMϟ;|ӕkf`'2z{{0g-ni߉e"LPBC8]F$?[hΟXV_|Sǀ@~aƯA״ve]t JhP9.Sm.>ߩ}koP~c/>9>ry<(o ,*V(QZ-&{Kzѧo,EU7Giڂ?j'\׎}9M#l8wt@nwa{L+7~Ӳ48x1wb&sO>D_[v}P 84Ǐ?W3~>xb$To&Yg* ^cQId79EْGprv;U\K 2DQ` ?8Qͪ2(җay9Ne ~JlKJŴ\bR9 arў_3d_,qE F۽7`z(n%?{fV?'5@ڇw.EK%4CA؆^ b[L۶؁n;!%Ƒ,K#07 seˆ_ epf!a2JtLՆC{R'5 Ni,Ƌ:TfH=}u)Mnt %{yyLq.k@ilzcC+ -}k^|X(YiL.|z;BU il?)) \ۆYi4zo6xKQ0ӅFi'usƛ!0_㑁r&TeR^Yc8T:hþOZ ˤCup3uU^Sg~wjqO{Ltu2\^Ӄog&ʳ_ut=O_ut?z1d VWnN`uf441*:5U>1D~r|ۻ}۫ϫQq,X4Wv@34|\0ˋh-(ˢ9eن֢wtV(|{鞉6_~?)lYČMM[YXTؿ6`)#1?9(pȀsAb: \5TBYQ,i]0œPI %)\?KH'3͋Z썈q5X="v"5xi[G:ۙtv6(U89JQE ]gY>v&%62Iyjd5%Ɣ_,wYf4ߦ=8;0X `{Vzܜx{h7lo:"!{i hxr8_r~_ڃwNabrƧQC =6΍"@O*T"L';v-0c )Rޣz2t-^ 7Li^+p:z SG1=>QF{Yԭ"H}RdIaOM183vZ1 H U.Y7La/Q(HuTkh#Zz8H~Xi{̺A\OH]5yGϪ:2*9ߏՁS/.0oN @M!٘Pm)@AmNDkΉ6uh:|VC 07+YŢ&467U2K65b/TW(߹vAڙ ƸDZ7R4n,]: @g|f8Xӗ_fl.7ڇ"|g5ۘ.J>@ 5*ɲlBU&X3)`QHyZ0T8$Q0>,Y=~ҙud"CB '`DUa:YD)"JD}ጢeuӁ<꯺3ďH0#%JaB~Bz !XKzcCCAݴm snRMgG ?%M:w9:->)#! ~9W#}%#ZFsh06EJew!X1 jU zyWG*Y<6reEMt!~e9XNo4˱f;8U~Bc9T\@S**L8.L ͯ}!dItJkしDp(J :,NIkR6ZUnm*ϳ4nlǢv*|ǘ{N > WoFcg^rf,h._ؐ(j,+e6FEdLvuEa}Xq+t31E]atF().f9]#2d݂ΫR ƢCYR:\w3 o! Bϑ%,,C@n&Plu2-,`I}2P/V yg.Bm\41X5dR奔~__ƹ`4FXEhz6-jpnf$(G`܋YP+ؖ\r5۔RH+G\` sӣ6[kijwF`?r*퇹1Ih``%,]&Wl_  Rd N;H0>񡍹aIdJF0*CsR.bwcĵaQOioiddQ%Ԯdon_'mJ:jG.sϬ4>.O%c{aG.[F9>7^ʅTf"]֒?_;BH];t}΍[ӊtbIy3f~]F86Ɉz6|m'Lm\4wtymĜR(lJNN t,hcVS}s(GSTf,ma=ךq:߰[6,atv4vk-NJp#SG0ܽWW~7ѼtF漕 -j1}%\Vﬣ*tP?0~Q:CY~su14S)t?^ސio9a:6(lƱ}<D<5S耀ROBYƫǮueoQo,YE/bAެr=:,yXGwκwoI zvϵO,ąxfl陋[~߀9$g*hE/E`8N}1䊼,z5Ch*6HDPrjf1Q¢lT_),8{[,b} FQȁ}td}i6~DgP04#r(8"6Gi{DW@/h!ry |kOµ]YSiM'QS+;$uaC\ֈHqfQI$8U,^ru&=zbͦkqU{Gh&OHA$w؋ =Kp,jaҭ›Ώk 3Iz|qpp pWaa{ᑯ@pLHQkzBHG q/890GϦ?sXַ<}H۵ƫZ7ٓʢaj>!>߇Eϕ>LMk_߆;W.ɱOәW&-Hy!kKf3 8F[*9°TBXiӯadý+W-Ús5m~\5ru_kem~S m?SUaiAk/?OcsqD9Rk{PdBN`$#J[jkvAŶ_ה5KkZxk+A0?984d [pٖkg)l{OszV`ͪ5X{"1B+]q9\tSEIY|{8x*Y;=MXVt  #,C_okc//&$&`qWwwĶo>jJ.жWn^8k#\-U2^P0Y$*;a yf8CD] #GF7~GZ'Z(U:lBiqHyipj?ϡD8d)Е pz/_TDq:3W'Ē/##h^*?W1W~^~UY߰vKh_rkEwX+\*Æ%K``*?1UN^#Q;wE@u ٩Y& rpw{S5;>ﱥjYw Zzn؈pQImL+%;n,!~Kݛյ dp+o?۲/Lt+ⷓZ8k%\k#җi!O} A_-|۽r`y~@G7.Y~/;p_#,sv`ޟ/X- 0y3eW߈/~T(?R)N¢!|?:9[C>yU҆lt,c{JwqYmSX] [ Gkv>񽃱GE[k}ML/ߗj|,tC61_WÿV2 cIՈ#>kHN նENTQ:e\i͝Q5\Ð`;`Cgsl@Z}fY\i?KC)LCŒtC= 76~Xl^M#*Jx~{4)ڱ/ETi3 < c\RYI*.B{9>҅cع,\qrH;oc}Nk$ JEcdXȨ$hsvkb Cv9?ZA]w9;-cičgߵއmP.r]ӽ+~v UTArZotL&@o4#Eh[Efl Hd>G2J_}@f:8}P\ U?Y׈G:IDBML"0TO{0$'83*svSQa#`DWz[^2iޒ,fƥSAOțrEi0X=h\~ >ޓE~ف ^TR;KRP˸ zч*XPRahv8zvCfQBHZČD^Vc7m$>M;xNр$U(lT$DP^ B \ Bd!A53 I$m9M38jኊ-goQ5b^ Et`Zͳ 3[pn.J[yms<ѳ*% 1o$tU(ruR x@,B~j=sQ6鬥QsD1ʵ9ߛcd8}ƾl89ȺvI:26xz0 ipߜ+Q#9y9NNI_LJ'[n4p^8gyVRN0ڭeK(Z@`$&+r>$W kTd)Q$ɜ'' e(U5cu'QPJ Oç|IUu-O֛2F"*=#f lNl}Ҹb&꾨hIZ*`r/L3#ۇ&leؑdݪ􁑳ɰKmõ:X~BSd/v.S-jF o$H#^ZN)!RȠªA5 =LkӆCY Tيv*t+*ڧJTke$r"疹רF2-z^jr ;%u( ~v _?lz `$f`8fKAtR̈E%͊Q́$#]@;}sGYDӃgx1k;E| iQEX0̏ BʩmNnXƊ3g#C;ڭԦq=?HbnLAQg_ȃLTV^Dk ?so9R 'b݊3:.~ZEQɮ=HMEe) (ppTEd~s 0>(3 9Lgm.FaY6U#cN+ %RxfnX0$>/꯺36B!7 կt#GB(VLSX3Edhb&oIT'q"D=h KpxmK8Yd~^h9a.DV6mXr< ÁqI52 )Q@ͽhQ )A1@GNsd B8]vO" ^'s<Y3tӡtQE#,h9iGs,xL0"6|PkB*eGB62 TBiZgD*-sey'{.A2 r d:>X"'( CwRrQ%I|4eԈ7TFȇ;rcT]g=(, |;K10rHptqIsB,X H!H'_sa7}o߲ttf|\rh|#z P1q sT0BSx{Xє/I*x;'S4em+|yܾGuNс,)A(L2$T\湸9 po].:NNy&.NF㱝(i^^SLQ8Im^{n]&|RNa|obq?͋þ j; мt&X1iR"/>?4< sڲP2Z!<7!F3bZHq[f}05xrU0@!y-`!-, j 2CYyOɩL$(,,I"'W>dcMØ>r+QXH%7(-u42"e>=T2jXUn!lQ+؆Ht;ܙӹ\gJFd"2bnd,U@k\:!%Z.EF}$č@.=@XQyT_Ud :M;Co'4br\J$MqpݾX Yltzw($;+W;]N|9|ۻSIW'1ME;^ 2|-Xln*rR?NY]ݤZ}^K;}|K}}-jLm.䇱9.+b_kVwِ+W,DV5*lw\j4p!-BjG`f6& xr|xwnʸO?<?Ag݌,#0r.FIPp HuYI5!I7bɿd$.@Y 4DxY 2JFQf>HW)Zj.M 2uumd4͚GY9Qq1>IYf!dHK1ahY}G$r[V6C99v<4*x┰PEBjM*KI B /6ӹjHΙ.UUAĞ7R2B#1uKVD$FexΘIdx  qR$5Ff 4p Q$ äOTi;C??Y fzGW#{؄EƎ7Gp{+o]~%G;bǁ#qg zlLX< V O1oރ=7ߺXR-ؘ9wڋoO! HZ)|K_  5Ҏ'څ^4Ww.M3^Ķ5X1E~N ZQ\w7'P@ϒQB׺ g{t?k)uG?!VX]8:V9sqX0?σ/ȖmȄLiG Rg> LU&Q|#%K$d`j~cE#L g(3E,Z#QEq%]P0ƒbvƼI#76/YHˌiXXV5U2h's09°!iI'a$| )5Q%^Kw&+FPE#d `% 9Al yȢK9t4cHie_HNRG%[BNv,%uvZ]NL-i|\|7ܼɻU=۱=Զma凹pc/Jj!EsI;Y&m ` ͥ/T C5=*dIFAxG)'S kR;\ د  H_Wz!2gFZl}BaRT7B NusXtnXב^wI?x1Y?,v>uLdȿMP,#ZAU^'ErY`åk}[צk)L1un*|n>Ӄ\JU,Mo69:o_9WǕ 5vsC 4Qes-ZzbE11௺h1LIgIR疪<(FN1FrY%D⼡@@  )vќ:Fx&=Wp0`3kEk]ZGs6XRP:HX_ugF^zEotO9,*,jIZwT!O7cރ;cLwlAg0zh9bm)eyqe(0yP)I'b$xۇ>m73' 'q`wE^zq IT^Lknc Z]_FnM @¤HTpbnSs75QP;- su5H4IQDW"mKV9JȲF(P?7@GȬNaKgPل kNI_T^)$~apړ3 Zڧ0HJTmScՂ! II26ۘ?5&H !-BX¢RY(aDGb JYVDFPX //Nl4PI(5BXUCR*C&-a+ʒؖΨ<=_P )' Rc4IdapsCTkVS!& ׽ ^!'rr(l}w: 9lS-W"(,9&NO8Mԑxۇ+h7UVlXM#ƫҟM_6#_I*P]\N\/<h,bҮskfksķr i 4pj#'+4 Vez_>u7^mݏ?#3v*fm"h& ]njAa03zh0(%;*o $j($5Z2>D{hs7T5i6jUZAhIysΌb89PO\ `1R|E"b֚5 `{5PDg KLwzoYtQkc  Z@CiIT j)G@MeE)Yf]wQ,X6QHѸ.G CEZ_!h"R]M;CPvpdF@lH)g+SFw {/(tZy34Ədž QPrS96tƝS>|w))RJl@ y2 w`vt O| W:'EgnSwWiL̺FFz0hnnʓimJspINK?؇ܾoGOQATF Y\"d(\Qkr6\ #$&٨kF7ZH5ƵJ`+ 2d-ZhpX$ی-S/tv+ixԔH8N"HIjԁ d &mq3hFD'VHJB [1Z(xN(6E"J˔ZWAgPT@c CIͯW׳~Zf\O*b#<ΐضjGquH/q\<7K*:plj:"Ty~|Y:wnnj:bC>Ul%K鱗%:v?K)Ph`phUv͊ظa=!Ɲ|êk(¤Wl~yO^- ĩ|ǩBg-zf&80P@iPUy>qkf$ 38W򿘽״3\,\7JY(]Oq-[Ԡeӂ 4!䜋A #| G΀J^~v#i F& M j?ZOH=!ȗUgj/Xo RDP:`s''9V4\AT_:L4G̱%[ȨoVnfR2&MN 8A瑂~Dz#j(FNj  l *lPD0z dY@#w"+CGXrZt,.^:% !P>[/@Zא%mim2LUgCr:zL\ԙR_udR hFrxI RL*(g?\v=z'akx'z>uF4Om͉q?ww.`ǷS]SXCHYusl]POtw}mp eb]UЍ˗ybwcR7ևx&E_^{6cSZM&gW 4v=HxWf)k9vÍZp'0zOAMo+Vt^;DV%&3LTל6|-1yhe{H4?E[S̕!(bU kkؙ1h_D**PC.RT3XD|R6B4s4X6gQSE-#4Fy1!%5TOUi f+j!z圄P-X"N/2FKvPϐH-^Gyy,x~Ia UV8YHpUk&S]ח K 0$@ ,X/ I<of!`Ҫl#C?wo("S.D6,tM)յӑ6i3c"[4c;%ۃȴR޳сsх|H?dMOOYhiHt7j#a?Ё{;;1ctr?~/spن՘띯s}؛ />`~D">xǾ--B8|LF4FO{?=s4# BB Ғ25D!i, )DPʼZE](|^rg T?jXJZaSy]2G{ sTTJl!.4%z"z!0hw.x.dqQV4%i+'#OZ!DocgTThD8UL+&  5vxh865r@ :!Pih8MHuQF'$55AO5GCQ D*ϒD.֫uyF<ǶSHTFd"},F _/֝sYG[0!W z-db i^0lS6t/J`U) x>@͢ab>!gb$]?]`!4`)?PvyffN% .GƲ>~z\s}gƒF})T#oʽ7$ Ñ)Ϋ@dDT"ATƘ)DwYPE#Z} *;T6^= S֏m(tYs[yy3j[qjXjl^яZPn.G'}zqKFr-&sb$.kɊr#5g*sJ|$a;0=k-e8sk5U{M8D5|2k[{!>kjϖ'~! Wq!c^N7^ϫq5\3d|_E{ ~GPjDj:K%PpLWk!/նaH EXeĺ Atv:/cXHc bR,,,>i*m F+!^?߇( zpx? ԨT(2"zX,i`uQDTѬKA=$9@{g1V$)m0s$ٸsdFM3Irg'2r{R(q-u8նj@:g%C͋br#EcU!)ƾTǓdtqE:E泆{IX2x Q-'ZauAa)nZ:.`KıgrFQU3Idx:1v!24i_."-e9K镌3ȷcrF9um"E$E(jE KH33L*8f;e:n bS'ǥtC"QXNՀQ[L邃 PRM2yl:&'ѴH aS%jr27EPb5Td!)`ȽbȀFC?a!K b@P29=LJsZےE3W(#$,w]|+Y)JPU/JDH0߆XuA*XNg8(tXA4 a!JXy]ByуQ*$*](BD"k.t-NӠȑ aK3BʐE.bXf 1C` RVȏ0V=&T꬚|d(™h"3I5;: 67-Evr巒%d{{m9lGbr.SHb; >gΜ3eQ s0so~<Ң5JAB!L$1t+\LEc$%ɗy^"[J&~~>dia&̞ .@Uù8{;6t7Ak+B5&QJm e /M_`&^o8U˖2rm*Ӌ)eo^UKTu `@X강h}ү2lAu O1joű H`E .F4A/J1 w^C^GbƸXSdD[p]%Ć'{`ɕXVh!!:9s5rי.(ëx!t>/E$Jb|LLLCb^Mº➿h1;X*mz:Ǿf ZTJTh{{! HM5FOe_=c,ʣb]e27H-V,׬E:nm *46V<CGi+ % bi\.&dhc "LJ泈%I[z@KQ6((XYh.VT>!(iOXLs`s(Z62\~ "Q\1'і@G>9"$hfx-l8ab9$~-@3Pxpc1Mt9smk&@FquRg#dt@ׄI%N2τ1k$^ek(Bl|95U KhJ< #1tGW-lq~#Ov0K6*Ϻ,?>5YTbὫP*қO*ٗ:TWPսMnv2\>k\t=}۟?r2z} q3pZ3;WuHicp6<6ի5k%l#t߶Te~KP&;&}ND$i#hٲ+qihFYJK3:#[S}FyN)݊z] ǝ3{!0t\rw]=y41+mS9XՎ ^C=xX> 72OEZ8iul=wߎz-2/(ܯeآGXBidpz4TLIa EH&Vh4!J ovFJR$e4Y i8(qD(hQ'9 ')&%d0X}GorbI銮`:$ ۑ%dn w$Yʽ)it|(ѠksNxRpyMGkOkBpDj@Nyf!JNeSF̍XYfܟ g}8-{˘G)\~QS#8s42t̿ ߸mNxujPԉ!t$΍*TN?0M r?&!"gцu1G?P?m `m(~jT75{*|֜YJ+Yi,CN?gtԳ0UYBկUi [ 5Ȝ^\?;jqq eҨX/ܳ"*\ssm_<lBɡן?ozbW.Em,,Nl܅o?K?l+: х˗7^$/㢖%kx ?w6*jm;zH?F;.9l 6t6bor,isSسOuk6xoR3P?OOoXW(>REKqwx`Yɦ IҮWPPplk¦4|ky,lyTH(uk_m q]&8]۵>j hmפT,y<x/bZZ!&emڬێS+WPx]=;yH&81Kn=7v[/ǟ}uzn%<"ybyX1.X=0yJ.Vʽxypڧe\]U+1 Oc+GlBorkyzȗȲ~{xhlnE]SZT$r\5Iˬל 2krIgj(,V͚C8[$H^H| }{׬Pp.#cja\O#'rۥ<3J$]be0CF">}0S)|<ьT(FHJcS5l];a'#NVyV1#]9{[I S+\#hLVҹm` 7VW+MͣR|wfڮ ?OV] Nj-dV[EB xDτ1k1`HZQgܜمو]cyk 괺7\ܬqhO~=3ZUydC!UtJ4&D[rX@`xZ:pQ VCcȤP8g.ˮu sө { &W76n;WNG;hB auzȶ :'F>Qg-RM~r=;,g{8Z!޴»ߍK/ 0e)x4&=U-a-31M`mf5ZZ(nꙠ]Xv9>Yk3[8 nwoߍ}N`S8<)c*d.e}c- eF2gL#Sv ,3 Ɯ' %c \&!JìPܺ: |@ fB Ǖ~H/\@PcԥB'_bP$;uʾ'nD KN荜j %~|{sgL6 $/*m+V\E߰'0{uxћX|-X6ckZxmns@zjڜL&W0 R0 et^*-+iHJJـ lo pr2lFr M)1O+BGEz&]qĮ'Er_HPŶ!!!i r»E\.E4 7[{ip9#dI` 1";"os"Ue2NNlXF(w"@c8{z(\t9J 2qi6Vɢ\F;厅`ʹN),dPds2A/rv$B@fQ!Y\$nFTmI^pҼ(NB Q#˰w*% 7Dh(AmE/ËS3B E;A%T_g7EaNz+շ}a#c jka=+BF13&~~} C*fsNіZa~;gNL2?CP:"/g'LLVي-PesU64;iw*[bY\j F)!GdHZ͟ǍNP"#|rio4cbݛ'*v-L&"*3</CViK%+aP|F9YlܸsӁ&Di1`,eLyM;_)dD0(Y}yD K㈤u)8G7  c% _Tݞ-аKF&"C1@>V,{j;Ɵ7 ENLo> ;&|KXt³gR S+B*Hy>g֢f!j i%o#Z܆GVi0oEڧԖ2j #>\|O5N ?Iʕ{gǚlX,ZSSn<|{'R¯eCHtOo3^靘Ҝ.TT+ 3bh;ZI.Cd,Y2,A<·Bsxqc-٥۵s,5FSM]S1m[^1c)[2l6^Ҍ뮻T9Ν܎o9^ގVf֕۱c Ca<ͧm`$4oh KFFS<od5 =g݁}4c2\ؗ S \NS@qb^Z߽GA}R.`E̅C6hʼ1Zź<4 LQ9Jwfaevlrc s/eZf23gBP%xF GPy dJ䯥r8Al5bR`ǐ(%e$3ɬD- ʸKi&{Ź5Ƒlg pP&EB,PBl1"1ovTeD>HK>ٌt7u-O=1-L%7ϩKͫLjMwc l)%q*0ץ-EkY,%iG<,7ėgJh&ȉ+Ȑ2^76MזQhRnw𝟼,˖_ j@o`;tmV[)ijG6#E6Buyc3 6Av f i] vdZ k/^鍓߇g)iO=Zp-kyS8bԳ\JJ"' ׏r UJX)O +I%Dh`fC :J25{2J89@ET x""%9rernC|ꘔD"cb`]^&D:$Un arïE&=DY">#R ۤo*S)ZMeexŅtLTpzv٬hH6;+FQLhP$$T]#V#CCwF%x B&^kzJ0CR wE,o-Ǟ~o1R܅j?ϣjTLFݾ]54avm5AIm%ܥ)y*rZ93 g/fLAyw/z"d#z.L>?^sH_ St`E g=p0kqv"ݮv I%PCꯋ2b6l+ l÷&N?uC]c;:+1ڈ>,PcZ|쬌֒_FI}Ug:{>@Opc`*ޯ*dB$T'!%7P[s֧6]PB2q "w6J& J0Zhp2n[HBzPrG {+ }̹E( !m6#c swE'?Te+!?.c/W={{O%M'&$CLD>Z3dM냃"deq8~E)> >Ogoo46. +zex@"ܩ͘"aߏ>ߨ,NtiCxkۈ][|1<b4N3Ne*@5:6j%*)-CH9O5GE-"g9U-q(dzGCHɕvZJr"`]blJF>Ql~ zƶBy]v-:Ni~8i=3DFVnyY\P&wY wqX)4ٜ'r[xakAb@H0 )3%Ipv`BB׳m9bdE(7f_2?; }WBV` XePq( dp%ƻH73)9T32G(ʾHWI+p\N*1vD< P٩ᒭI:>E.n'E;,i|84.l49acgG>:.CDIrrό 9!|-6NMr q_QZkWװl3@vsR=Y ),P$e@%pdH^H.XWyx:PrٔGXF/_aͺ%lqbߛ"٪e98k!V֔h;xo@.?;y|<.Vvޏ,.Ym鰕}xWq+PNi'yW gOHj͊=nJ*JQ+)6]Sa)\!dcV}iu3{e+ Ibdž ZnR"`CǓ :6AS΍HV*4_q-`W43J,M*11.("(.K`n⹮' '*)-Fգt$Z"e 줟&G⯋+|,sl3/JV@N#!F_ S~$&{ WAϲlBD~MRK/OK4`ikvA\rU.1 v/qg̹ߵ<n"Mk8Ka"2TJ7=NJ%p58 + AC0@9,y DvjFİlRRXP=_l/щ>Hjs{r`(38h#5$Zoθ(7&V O!`'ywS2 I*̓D:/l3Vj.GEb M2w' ᄠ\AB(1;NMD݈U֣rxN ilC$M*&81%ܴ( !٤dylQ)g #$6g,H `@EsgMָۈ\ӈl 9{҉,6x5ܾqHG f>Kc3G!fl"JzTi,p gѴ 5!A%`Iqdƹ(r$2Rd?)Id5TN S3R½&"C{<;h/(!TE+ /ASK =Lw ڄn"]NfQ(C %9%wRz{^Ę`mQ/XT2rDp>!:<ʒ'  tZ[j-Θ KHIrW@%(2y$SI%(y+׻brdepA4fhK +kX"t2 7(Vԅoi qJx9VfZvl{,~cWH Ҿh'nj QHn;^5Է00>|>}K7>?`7Ry :64E|+guiXp.)ICĞ S) C).Q 0siռVU䲢#3gЫ0yChi8dE['#.YGSEca\v2 Tj/,(jݎu)(g]k0HkJʌ1~*3[Fi {e}FzD)uG{Q?Fו5?HG60a-cZݲZG3 3,f pP+HZnfU`$GՕK@RF1"TJp(PvDrD aa'98B;X $8/9D@C8 ]pTst rSpi"tN[Qf|u?J. ٤7 u> 9'@VS"S֌rbwJD7ޖ䑋l rH{' 10xh^;+ Z5}w`OFQMPpl~A'pwNU ':w w^5n{f#)}x"B[W yeXD|+o!At'𯛆lCcY9W-&T붏>w_ۆ=l.pKQʡL axi+5ߩj[p6lrf٤F\mM}u+ Dd%8 uXynvⲥw6>/)1\ga ~k;؟wۊjy҈{R9A&]0Mz,9カ{Rűs= ] 5! Lq.=Xh>|d8+vT=_Zޱu󗢣25g{mdG 7.$ȓP);ѺL'ǧTi1V؃G];2s5FE.?հ}e& ٩kP#ngL0E݌V2b#-'"7cD%ZZN$5+eOHOJŷxCH6$۬0~@ FNgU R+2_~F>(х&'ĥfat>xݕWgv;qxmz;Uk> 1:%@XPi:j-Z}}$w\|X(I[JhX b jmw݀VkyKbT7T׾t5dkixz>mkV5? olIiB=C1]+{4NWHUwVR&(d85Kށ>m.w(9^@Ss/^9?WpU+1B;CFO4MJCq1=x;YOCB:ϪX<qZY3=-OnjmyY1S0st>~>2R甓i|Ĺ7v30 7 Dgї'랾S43tΝRiI.?cq`tH,>+h&,:n}ΚM+ZnƿժUW ע-,;ۃnm HhvJ&A Yb/ϨD?7B⩉b(7>hb)E2KB7yL^eR +Q9bh}E 3< @`.5&dY2ƫy\xsHxdhHB2Qmp~<"QYpgSL`u m' Fv& vǎ|Fa h(|xEAt9l&,mx-pKuU8bΑ҆:g՘P0$cBJj}# :Ûf?l3]8 '?lܽ- Kxt?܇moQww{Gwg1gА-n4o=݌+\Y8t3oZ, x>r65Yǟ~]x֚>P%KFٖ-xZxAG2Sfs3:2v9]/A]p[gp RV*`q^|wV^ ktL9ʼn[l oT{4:+N@o o h}x/b ;@ )g_H^;5]ڈjB$ugD6:} _҃&;*N3~v'՘TY `&8eyiM>-ϖ@˂gIFu-* /Ϡk^ oZ1w&aXO,W~皹P#Ohdm|I*pi] <6WCGŷoаy1+Q5XguUXXW˚V?PXOڼyx]_F\9a1Q6l y^>/_5ڰ?: In5X9&O3 Z9RQ&;icL 3nDNDi$[U9Hk.69 Pn: ?ڝڮCzRbAHM$VAS(<@KR9 Uq]Vg੠.P^RjKUa8tGCxa,%4Q⚱"y -+6Ɲ/%|OjOT裤 ;2)USMpA5Z`SxZj1zn'D&]Yp{Ƙ'drer i뺴!G?P7u)xbNcrmQ_7*VD(3j`X2 ɡ^+/U8;bE^\~Q* p .7nNr46Uy6kp)M<7}v1'$I,JE*pӥwǰW[QGQO[&,(//r(^LSPBR&ʚ]w娫FU]jY*FxE%}BM)!4Vdkƛ9^#_EZǹ|CVk@ 8гRfk7cCl.>7`dj]|ߏGx1i/㢖%uz1^ ؇X:3\6V^sxڎ_iGCB? glu!M(ҍk-r~4g 6:}nX vcۙV,B^>̬;#\IXn<hߓ/8dH!܇ƑN6|2)[HSET *"&lO'0hrSy'/`8v*JB%17M?Ma`DVQrfABN ɌjzL8'l@ >Wqm<=1s))VWn{66"ɬWNSҢ1gO9q">z9"!JH e劢2uRݓf:5H&Ib1.GǹfL34$WrYgLCG,]6޶qJ 5X& ZSEnъ:CW4H #[g@ڈjK)= UA/csX/'Fɱ!{lq~'=)hf י-M%(!^(5CQǪIBH2U J3}#\ ,UD?#OI7/fHOElS"A#B 9%K݋ybQ9-ALf4fNlv|=0*GpR_xQfTB+,[nNeeIٳL.:WA>aZTf}ċ=t?jS*%̉|4aG q* jӦ }DFC˜_qMj6xߟ,|T<)^}ZMkCrqyUTŊ0/kn>R^?둧%!ފtK2?礖g e?y-@ZSQFm7Hb4 ;:cz"2SؘJ* P[5reh#Csdtcsؕ3hij҃TBنSjW&Sk]M Dj$D'55M7'H*QɃރi՗DۘV9,"`2[l'p`3-SVXcʍ $|@o  cd%-_P` wGmc++|%"/n3oҴKu8mt)+U{5 wנ,!ӻaPfYᶇ{0 0 wP* ŋg MY7rkvv_MԗnG1eR4]xL lDURVJya?)`p,tBqR|z'N"ǴYo{\^q[vc.V+w`[r`lkW`#8|UsQi%tph0i-^JS!NbDi]~Z/>epГMv1nxjX۟nMyiOzG9EѲUއ9s܅]b.| -Oh nZ; S*܎)Yϑϧ A/`iZ@ԇcQ=Z. )ӓ*A]K+*qIФV̜̙7ܡ )Vz>s`ֲzfqd8`ga=S?%+@QN Y5YvK&F%8I!b %Mn<bHHCcEi#D|{Q^QvŨ6b~707P`>HFQ ׷u P1>WQ@C>cT|fՈyPf҆"L>gQޏZ9}+47Y7ghzfnurG6OŨcۊ)gN@Se&80*U7:N&Lo.=x';C{=X5 ]lƿ?]*=9ɨm7 aԯ ?)j`)z܇Uz`P9hhiS6=7(բِ,jV{OG-CǶ≗;$4q=+Ӹ\[HY }&AP5HAVsؘͯGk(Ϝ {C?/Nl~̘SE*7nc;Gԩ A)ts,ˑSbjU-OMA yQl__)/!BJX]?*ٰu:i(zV@Jj iW-Y Z8z>ěsA7 s\& ψQk oDIO-15Ln%:G |Iܴ*!sKZ1Ƛh]+%iQ6ڳt@#u$u8SGn=NPrGbu36)WGD|^G|g(4FPh!!)MF}of"GsEϡH=7<ޅ4רu&>?fЬ2gkLJ&Td'DR2*%XmR085Ny8 " %TIJBa22}[fq.ۙxꃊ&^ `~bJpQ[(4<޾bM:B,,MRn0M0GY;c*ڪȍ鶝eh.rN \vwy|HAɑYv^ZԣJߩ•e&-BBD]&m Z_25ݧZ ,}6Pn>c"9d$y{B7ÛLokG$m'%lBfcpORZ3USB˳UW`Ak-҄S'n#!":P~l=y.1:c*]):\F/ QLKfNF6OǁlU@UܶוHCD% Lw2W30H#i|]}\^ܮNDO~=ȅ O4PJڲP@M&!G+s:JSK9IE+8s}v+M"euA_KA'μKP%Y8;c8"lfU!%h9=]`x<{/^wC?1^zO/O8Vʃ,sUDh( vMw5daD~7c|򃅳X+( 6 ^LEVZOD ShDjlDpd5Q@ZO0"gSOpRXDN%Ay$N4sHP!95$#QXz]).mA=u8@6$F9u"(m(8 x>/85xSb6`h(AIvi $Xl08'Ns ^h8Ks;AHt xJAы ^߅P)C31H2( .pch<XyK\Ð)9n>r7je}rdDErN|Iȱ@#@Id|jE䩄 m{)wo݌2zuw,"a"`s J?V ͎eGלD~ʚw S@j;B\f ˱UāˋM> 3>mqH6%)AV.LTGlI[zJ7Fcav7+9٘ G0K.Y1][d4xL|4ܸ(I۟EdF3E,՜' ξG֐(dsO$;BT jTڠCٳH04KRYĢWlJp{FQ./s-3z#Q𒜞%}bdI2)ؤT{J @tS?K.{}J`JOOru~ۿ5;u_- 4Pnnp>cDN7[)!!7qsυ'xx=`~O*f}#g^ k<V'ؓ yrhr94h%3.#!Qf)qVqcyoǸxE9<<\7v#Il|×a~xȍۿ_e265Yoރb )r=p)9otJMQROˉ&_z??? ~_ߐ// $85F(qGv *\5C酫HÐCI8i#*?S^I6K8)%!c5#cPg9y,GZ4\y ɼ.6d%[V$.>CceNܨsR4ǓS꽤zƚX^<'ɛq+uL>9&b'b'b?˙NGKKcCH*7u\sjq9^ir<r"@*ɋ؏|2(އ3#Rf6/tXy.hF-gFXA-'y@5Z0 }P4.WV1L/XqӖ60s3 ҅M{=PwM Q* ~PIQ!)m ޭwr,دvzyg8/=כGS>61?1?1I[M/y O%},r8P"GoN7iR9#C=э*BQYL;R(1 ^C(DN !#&>ę@IQ^(I!Ks3H!LjAwVƣ9vsMX5RL>BJ+^}mqϜq+Il` Rl"U%REɶl%;[XqdDz$$jVDITz'NJ `HzWٽ=PQ& nogvʛ 4DzpT0@(p, 1U逼*E N(*0w&B;&' p]u*|wU!Zt?݁7ktx25?ԝA{Bxd044;StH#E@464\{rgSHR^t1_1.aƂ'8]QQyY@546E*)I*}H-bC" [,m;8Wxä Jf`e\%ݡZ:wq;ޏci;/8R߬M=ĶT5>:we۰u|J|/>0pRԃzZͿgq_ضb'2{|̭-]_οv`0wT|aF/Ĥ<[?>ꫯ"+++yf^)7x۞xM -s4c:%w=Xc6VaƳo>ݯoCpy7bZ5@ ZurۧRx ZDZVοկ+V`˖-r+f? Y?架tS&M-?^w#<`_QwrOES@ S*ĕ9ܫpt][[Q%\ 7nlZ^;z5|\[-Zx.]<^bXܺ8 dmiՂ8c̼{iIMwS 5|(Y'D^BT(.A?[u L0H\wyO?~Ǎk$W3hBv̙`]B0^z J\RTe9MmA =%YWOƎ.<^##9ScR\XD޸b&g\ؽ Ug0ӍÎM1ӅLew(,Tok+6<0zvl7.ga4~} ldP4a/Z۰kx_(Yq4?x<6󾎂 %R~ϼ{4t羼ξ%um/$ K*js4*ZiӦټ\ߢ!WȥD:Z:u{͟Z\[ۊ'?;X|5bA1xJ_Y57qף[7/ȇ7+K*C  P9 E(^Ri[ a3W (A]ߒd[ɶ@Z>f!On \R1Ÿ4.[u j'x٣+Ҋ*mP"`\ld3 K(y95:k\|Omݼo|!ށTL݉?w$ݸ Z˧g 26?~4fg#_]G9rQQQa|gttԸr\YA4g|6';۷^-qE!1oRѣɃۗi D,`9W#;Y_hRe5DC^fazDv^65?%Uğ:\d1&HMS*ZT+E@aLh,}CF)hT+O C?] Wo;'r]wӄ|./b~#+5o; Woo_`z^c]*qֵUa S6KKgg~ 3hR-M l<_]xfϰ{0Wp _lcUv'Jݏ;d}_taԏoOlK vVXlBb솰GdN{;/3iߟ?||>0y睇wyH?RemT/BSͱ*K4&Hr(J4`" ?M;0y=/E+p5nkn\a &z5nljc/Pq٘VWftb~4Ehx9ɶV2ߟU^b#x[3`sSrc] xmزy |DYPR|ߞ,#AuLJaԪCKڒXe$3c>_/z%lY-ϟmxvalو&3"0B]873 >oұw#,a/vM0B>IVQFMVr醷 vېՆ䎆PHPF#T,7+W$Ȗm?^=bRF8֡aݻg*'dR(bñ\qvM)zZlh-:K8v*\V[V;`Y-Xu)(A۱hk8XaޣtK3οJq˯*TW#{J7*6^?Z.7ܙu _O߸YlGpXty85'Yo< o6Kֳwat~}Q.kfFOqmD(7O݇݀`x!0{G:㾦p ˿K|̲S80V=.%x#xAwb`?XRnk|spJv>?$>_|9ۍח\r 233q"##6넊uEݐ+8VBXOsj$P` W%(@ig`Ymr@=L-3hf %$p8PTyEˡ~sł]p(VۉY5vftcR3{MeemEDŽb.7cEe G;ӳ.!f|#bLTi,!l1} eRs7U"=8O{.wJ !JRnǭwu= !>vqDLq.4Fvt 1JN}a}>6h>hѹӳ䀡_,p @~؟Yqm@(T}Ld` Wxx^w5|Ŵx0XrsBkz.ݵeNwVL"(RTiW+ZtΥ.U NM7*mA8cͿ͕'kud"_= b s6;v s ƺ( !a{qs~yYD_!&_C·H܃ǽҿ}WXWw߻  8=w#kɃd>z]U AG#Ⱥz>xh~"&2Sc ڼODy>H}..0;8:j/ KBf;]Z%"sL'PěazШ_%4s!i f6Yg!mo$671-Cq#+ &;U\iSS.T6UEYwtպTA&rҮS*[<{m]5v$5XUT‡*^giU0grQ3Կ OFp 90qހI^J' 1cȒ R?ʍ$ne00}w㚅F0.BlEIƒkߗʙS0o \ @!/2~\35 cK.P"i(9Fq׃ bٸk߾2\g Lur;>eeexgpE@hĉΝ;xbT}#. 'i@Rdzha(#<$Ź0z Wv4,!{E.hp]:w_5؝B͢b,x1]h0E{Xֈ~HYz=lq5 /Ҷ [FKAvj[91^]: سdoO(CX:L'G$r"x9OE2z&XgtK.砓O|)QdUc)vc3'br)DaD&Љk-heVV] NCۛc'RXl>@O7ۋaOQ4d9q+,^\|f{y\]{wI&x-0fq3A̔.N avR~L'a6a c`ŃRXa?k[X[ᥛ'C4 0:{(x@(tH 4;uÜ?܉`r۳8Vlr/6bVy?dt/C`hH83gvY_?_[~0᧿dį@6WK G+K35 Ew >?12Wo\?ॗ^”)S9HW:!"xO60:=C#1Xb\D˱t EPjnurn_ \~*4 (0l{~<5ĆQCj̿vmkEƁ"TR\v뵘bmOFE[<6HnbEפ `@ {XXoI9ǁ+~ 6f[(ԠY9]N2dǤs\1=+EŌp&p (S>i>ΫG,.^;aW;`x=|r']SCAaQ<ރmPWVoE(9 ynVQn",㺴3U.[MGcd !;܀11h ;Zmgab{3><Ԃ:|Lh3*qnD;55+lAU];c ڶF-,;WeҨQ(pUaeR]]:5=Xnt*Ԣ~[eNHUtiKU4gQ$)wpZ]q@ug,"RJ;V]R(7@`FZۅX)}4>V-,?Ѹ֭` c~S,͆Wֿ7\ W=>e1#/U}, Z awla٠A䔺pa2pk( }8f>.`d[Y}y.k>5 8:hwNLcϚaBHF#5b/_f̘a0)8/ W)ʜ@HGD N p6Ў>&TNu3!>҃MϿ-D4/{;3c e"̾3Jc^ qAifPY5S~;A|m>U {D#Q> p8"QBiVU%ӏnveaB s D&avtE21E xh{@U~y5O&&.?&ͬ՘=Lxش!t:Ӫ a(18XD.AZ݈╧?HT7F.O AV`F[T_`QkϪ]l-U ) 3ZG҆c80vll@f);#S` U9ז]j\. (@-ɶƅk!ZzaZTKl⽬bXS 5ATWSiqR3>f<a\ut=Gb¸õ2o4GQvn^CK!ʤL%%Hʔ%N:}"|чӦ1 Ď>!)t lsE^3*F@)k>IJ2d2 GBpInTBE/Kt])O?G瞏O,P^(;n-3JܢpZ"hڄz 2{WR&/H hbR뾖a4gkrTհ1= aLfT'Qql8:δeqEz@ ]֡y;Ϳw*gYƚMBWB:ͿjLWԜ~x#?bx 3k`y !K7ʾEnA2C}x/,Bԓ !˂;ԋAV|s @ d`!ܙ~+Xw߱ l̈́Ͼȅ͏~Ǽ"d3h*@|tIi<(Fi& 3Û"!b2O2 54aL699&|]xn~Ѻ"Ztw_{Y~ wa[*7[Waݲ{?~/?]?T.iNCGDcx,jH9~_f.<A~a|kX  / +s>̊O8134qR\2vF :/] DuQgD̙QP:|tM C*":'ZFw<6[+#6g`LSRǂM[Wd2\9-4ǧI&& EGP%F7:LI9\tt)P;d|k1mOUBM/z濶0ITCyi>w.B= $=Rf n=lbHe]K%I) r{:QSUcNt"y2C<G_W6JqraV1BLA5;8q>֏ADVp5S9V_r}TyyJzTQ"fsfPBqB@j69!KtN^BDPyDzC4H^=$ @%RcEeIr fbQ@F(ZL1X$ nPBLt۲piـ RyuT:U/jGl[qU u(5;jw_d1_PcP^;eS߃.*!Tq#)nˤ-{FT!G)yMCUkAC( 4qLĘ"1~2葽gP{ R&ЮY$5Rf4q!q)j\@Ց&ǔ%p- -Q'm>h4@hbS}{l1[g2;4Dic씵e#5":gS}T؜-:5sk-GZq $bS|M؄CDֻ bC!f|=?TYiք/XF¾2hnHvzslqSur}k7.Ye]z%OStRq!6Kr9LY.vU) E ([]jkUЋ+:+W]ɞV<Ļ8BZAbv!@*0lXʳKz"2h'DnrtNfE1 R'E46%I24Be Fe/nFj?D Ye wD<,#LʦIbgi$ArHTĽjd_[=5TI[}N:Ó(gSlZPJ(#P 0D1.)3G͙!*'cҳEEWBr>R@oTVY4lhh(Ķh֕oT0(n*E*Q $}AκJ$M&A}l9C6*P WCw*IkA5QhҳDmxR-ӯ8WZ(K2V~ ڔGu4)g8FPYFQ:UQL%]|xsdbȕ>K3G5T'dxd4?5#DZ]z-VL+sxxmv$p)/R63()$qvq %/m[OfG@A"W՜ +b7~3P"TAABgn<|pnÏ+my`cnjjrzǖ&*D꠴Y hR_EXUFuV16Tc#6v R_<Ȉ|Jy؀!I))THITb' @X қzI٤Rd`D5@P%;zE4i3(6$2T58YNy?`hoBY%b({`D_CXu^'QNlvOuPv:ڵGd[Q g`yPxf@E,8@(рoa)u@[V"K=I)u) Yp16orR^j9({$*kF4"2naTRrVI&i"D5RP lAeWyO[ DZ!&BRzDb-?.a\ heQ.I>b*ʔ7®RFD& PTe$H4UX`%(Ţa_j{HIq!Ju0U(BGYijd d: =)TAOlxCt(ֻ9T\tW":CDFH l8ę[/:o#J1 i)މM"zUٯzҝIsiA%9Gq"R!$q:$D,꺖irw:"2/FN{Nlr痲ңX(l[Vl۷U:/q\JTgpWf,5O^|uWW,=lQ/_dx0ں ?{@sM?m=XnÏy[ݬPױ0teb1-<(B5iC'e9sqQ.n*T{q+3g?<v$++nl )BvO?sgKia| l GZ7/J/Eg_kQ8x o=>UX}i-F>C!M-iTCeQ4QcLj~=~+()^!o2tt"ѱX1dϓ YmbبI%p XeuK&iM"R6St;h-I (U }QfT8Ebn;)mճ@R=m%41\JEoȮUjؽǢOtˤBCD_ZbJu jM^5 2SRh\BfUPf,.Q"d\/OheƤQM6ĸalDLDjDj=DU]8ϘBQ3'v5ybܫ$QkoWT֖AC)6 r@׋H$"N/ӨmQl[`]S) BNq0'ܩ@vjPލC-!zE㌙~jA_w(G d#WELd.AN\rv>`HxLc80\1c)\|5h=m]p r]naydm:)Ev~5.Y5;ead7vC=7rͶ@VuD"䬕Ϭ3}^3]̮}ʜ9q.?j\|L|f+FhxaMD.5_c #!›V %J0}*k .@κxܘ|vWv^r|RT)c.>w5p?nA&$7ݸS3_GnC [^QSR3PUY{3kfcf!jήh;`i5x;fάŬ0l܇y(t)|e1t) >@k 1|t;jiDQXa2iō7^x"ۭ (6 kƴf}m4&OmWD*)*Kt,,LpX~ys:w;77IŰ?):3aK ͛9_Ӽ-=,*q.EX\x)V1HĨt:v:4~M%&j\Ӻ]mPyl$٫ bZtaJ{Qel\׳犅 O6*l/>s&x̵A ^guM<]StД|Qq J,6Wsh/*狃Fj}w斅@ׇs~xJ8ex\Ti;xBAgSNJ.x3<6Hx׸Ɲ[\D1K=#  TitfJ<=W?{^)Z~VId]J$O#B)1\):{PPi
  • ˛`$ +CW'׉J%iZ.鲘^CBc6Ÿh%$֥tY䜨pb2\BcNI0$[\ǕaƠh"F k;:갠4 y8w%~FqۘwjE?{?0Iq\0qEďW_.7l.(.+Xk'Vc$3=0S_5#Gxp:ݏ߫n]Ϟ Q l@P|$|`Y!rhrۗyrPh;k>ll|2i a'cr\q nhE4nw{ܼ\Te]zt@Sb:QHA:QΞc( ")5JG.D JP)fBooWFQ4,?Kqx)nj[u&"'1W׿8h8X67Y0"A+S]m@Аx {Bl1l 3 e,Oh T0-[e aTQ6pK$*9Do+E꼹~]SRވ`T]"/R&كAtxb 4)ӣbֳ+C>//k4 mG% Y杏|1F:%p%+b ~Şx 2*ɻ9PŠKq/>vTTCV;TK'BtK{K:enNO.sHF:PߒFejgSYgTkN* jH5ƴ:$i%Qh."4FU"-ZmM[.o\'nm-ٛ^n X> |Ȃ81>&U0 +E /Lb(dH ]UA^ >J\ahgl<)..L)@|ggV'EEFU&[hf#q/V\t%n`|s`.ǝ`Xqgg5|5qAXo~.l TEeY.Jq䓛DÙh!Aoc3= |ڌ)5HȖ( )Y x /|mů^w.*l-mď|(r.l~Ifm]G ?+qt[̵QX{mIv&vۀXRfkګ.I6|ߴI-tuL~Tv(V{%a|,˩kS=z} ukILи&tTW9(6%ү$VA*!DL(ԖV$NcT mUMyC4\CK)a'șCQ8LY%+M%ݔ(-  7$~cs7kw۫ͧvFX1]ΤD .kɥxb:j]>Yo+ԤscsKK`"e!*3/Ĩ,lX>:)*R -"g² #vџBL*e*m LEϾv K>g_)fʹJ?|lQdpQ"ł1'cMē@.DLk+l>{}[~8S%ɂ= ̖ؕo"F qWfͣc)a Ljcc(!D&1a?14דaoj 5ᐵ2F/C(G<1OJ)|L k a`]va^^zb`nS1jS",( g_gԘ߾Q Q^G#,[σ7+K*3@pYtx&^F0L!&y ^6l–`ϕÞ+XNgK!Aqa62II4ҋ<Z 54ea6_^cYͨI.331;8՘]̕]AO[/y%ț`H~r0USzj} yjfZ^{x/’c6O`s3WND=dńbx|u<Ɉckh%\^a>[^,=[\~6FK*H@H~~ a"[Uڦ6!e=esԖ`@mJy-^eORu8<iu*M_$hàS*}r"$5S)A5Nѳf5l*کX +r-s"Ĭ5)KhMP@T(6 ,@f\5@UޛԏgH>N34I/lᎳ4]X771S*;ڂQƕ]2 +Nl1&S+98F8rh6.~@* 47bAsAf܄OjDę YyE6M1cĩu)PT&P.!Y䢙LibsҵyH$|72\qya(# "eQi:zʂyokSj[1Rd/X`uK؁>W}w/x5p1pNd||6A"^JSClLZsw{sQQMIDUwAM]kTDt#nV۾ V<{f<Cc +.1?Kܦcfcx!Y8/Cesg#Nėp *Jfᢼx5*x'8zYLp"qxma8b.nNHbٔ 4,n*=po\iIOP[/`eƘΝ-xOc#7~jaF15я$ObXTb6CKaArGqkވds޴UZ9Ecc֚lkIv8c}xW[0h.VUm&ی!8Xkncxx ,4UaSV }8wn u(D1d\4;C;Y7؊X9B=h*bkc6ke|jf{cm16hks&2bl`ZxV1I(L&+uHNX=vI4dhA`@{Z&:I0B^$Kc@4Ij ±7%v 鼥T6:E dK%B*&9. 4k'hh)9-Z2]E-GS/Q':f<9-S<@xp8+)qb\ptjV/sCnٸcM[QT9J|}hEXTQ?J>lCy|i4E욭KlBK;߸.]C=x|qp=/҉UЈ!P6a2*=xC% DPwtV:fSԚML] b]n}oc dB.ua}eYXyH@Gc+)Ǖ\YMè7?xFh!+Wec}hRDH:*&zoƍau(:Ÿ~[1>xUmU[ġb>tqΣLL7e~'Loyr7ɒ=톲 r!V ~)l1uIa1e13R5,EʢVRkRQUI"]*6LYuL!OVS }]ym-l ͛1ecT X}y6chElLk@J6bkasGN%c,d8g!;PWb?[Zm1]S젨;x8І'#G$&]w"30xd[lI밍l#)5ۊfm'*n)M5jC-#I:2Fq6Z5kjɢ]$īԘ.>_z&ۡh:9 䣢"e8}.lP?SFZq86kV[yvNY hR=.A? ÆĠ4>vjX)2ЮD`O,Q/"UUpNUP ȪXBd T $ؓK96x4@I48I@.I@*iE:LfT=%NuOP#ܤ䊇P8P?|)0 2D"I4#sAc%WGCѶY(sBIXv{et1crfoO,8qbxz\q,ʫ jI$K< `-I~9@6.sjIO*FҤpL%ٶ̤֩N؊W8p<"70PVx{:x LFɤ ҉X8؈Kl=udXa̵H{>i26*jVw^ Ml,GVʂd"*J}<dHʫꩣDnKʢոS ȪTlPh#2]Q|GéPz'qu 6ʫG VD5P hs]:9! 8j/J9%BhJkT Qm%TKt_Bk@^ ;]\X: '^ 焮;էmkڂj UU!;#`'wF> +&4ˍH7 {U6_ippÞ h S֒h< PWt8rP-`XSm%)$;zK 5OLo k JR}n BqGe+ň+k8аnA}ckZksWxJ—J|af̯=şI_W{!:k}wyM5A*"dqS3 2~WD*ק9Uj6Js˯㵐&^](@&kјi*<^"j%K&Gb n!IeK3ߌeB9#VXDr ѥe߈rǒ(3y(F|wbE+Vcq9VyڂyU` uSXj|'P1vf[^ ǸQ3|(ge@Ysօ)F,LyDevBp`Fū5t1))IV$Y] 4Հ )I^'81#:`Y@7̗7MJ#vE4_B@Rl&]/š˴N %O:$" MVX tm8 pJl6 GW3]'H |4㩵eXq$ԏ[?zG7{J[!.X/v{HB{[D+%W֦ZR6D] Id}ƗjS1ufλ,Gfa3Ԥ +W[`Y;`N^վo &{fHuΠ7f E7y6,L9G͸B;:jx?^A o^t4ðǫxmVT<~ȼ(Ax_yA@H:1j$'LYȯpTCAss$sJ[!&Pǘ[LZjSs/w'/ NTEI [-*QD#F|A6#{ٝ&>"ďsOhs]GAl! 25f0+ }!TN0 TO*I_\0M%QF\gt,aϾ%%Q <L6Ju{8r/8/y.#TMFP؅ƽ( eʼnZٸ kpJ&GΛqu+{ڍ{Ckkpv]չF,[$\ 6ء R!{ $䕐^0`1U²%YVuf4~s^e_`̽s9g*\~#"uuz0qvҮ'OTu@vR$81?r)Z|Z{²} *)Q!b5,0S)414025N3+ ]cCDRVc?Y4( ydձ z(B;>ew]pa8vYQ֡6xk{Yk8LcC/܀O G?ό3F<4|.30H=ľ G/DlRde3LDZ:GQV)od\A2u1 Xz o:Q+)f ]JqV jLz80-oB,[>C1kW|'l)~pt#_(֝/֦%Ǵ,Ғ֦P :,{;q/ 7|,H{ "T,.#2n3vKڧw݀e;>S``ͻoR6vv4xt^|;aFv҇ڽ>yrLcޔa?/÷?a{ܓa+P׽ vmDnr,L}}pp^kp3&7Yɸ+1oÛgG`(4ҵjl2NF7/ZMu|#&O/@W+ 7~n֣`e4nCY}_]@QcڒK1)q:>Kk^<+[>,Cq84: Үhz 3/XҵK/ 1>d^#? A FtOھ*\HXy;NsΪH[O=Л֞K[o3ٷBe-=؛Ȏ7M8eܳ#y^WUoDsu~yXW]?Qx=tl'6a+9?x瑍X5=qݻoJALKkcƏKFN{$M6"0Rh{Z[s 8SQdT# 6M -f?BE8[!PPGJփ)1K+Y]1Z9`G[Hf O@#p|y"51PcR ~}|Ff6ۦljWHtp'SLRg^PIl@?r8BN$-zY]Ĭ(qQ]R1;^G?P!Ų-`f|L@V"p v'{q߽׿%q,,W; P!0]xA̠x8ǘ4cJfOh~[xx8)쭑bݙ{AFSÏnB0g`yJΤxcwbZpJ30|}! Tٹ (UtW P>W]( C~{J=.8qc04*L}2[H‘}CJ.U4g% .9f'}ؖL~={ j5caOK7^g-XDCAbβ%Xx[wދFK`0#]vg`a ZgЊʗX>4H*МI>nC>\u86Fkkc4Lֽ/H',pr]yEfȰl𞻾gwJ'ZVI,Q.گoǧ8<7?m^1-!u Ic 7b:v>gMCgbp[1=ĜIhƙcxw;!ԜPXxfugkJ}4ϞČQCڗ$&vޙqbς3S[a݋8#"jKNx~/G_| =nۈO~l~LL Nqa7bռ)) ?\G:isiVP?;=#dΰ3ՈL{B9=Ӳzձz`1{ y*g_ rm,y PG1:duɜ>sDEǦ6_I<ս5Ƙk0::)u6s9s".* "2hGXMg5Om$o_lSȥAך\Q1~jA"٣ZoB^tw?xo|3DJǝoXl98Y~rت ^ws {%ޓRl9[`S3f/YFF47lH9u? ZL+^=yPJv3|òO֣1l*|QWW/e X8?C*OK3̍{8&41Q ASTTn*Bw |M,\Qrk "j#6٢˜qoLԬpĖ18(eMf&*Z5&q(>.`=f.ݚ9V#2je'Z.H/;5(k*f;9Aգ4QmDwE-jXNP BF#/81Ncbůb}T,]=JeߞqCG5*_7(g˂Eq8 14SQq9~F1% YXe:Qc¡!o,3_YBhᄋHm>?tG 6f)(z8x : !J"# w,i֥,tLLh?f,GKm{"YLRƷ<'*9'v-PZ~NCژUOckשu 렘 /'9!z5 tO_Gӻ :L9o \~^s ¾3Q6T@5!T:j8Tͤ~]]\ o}XPw|G؊wm(J4{i)pdqf}<Ɨucgp @T !7yzMcj|?@HW!jү)m]lc" A 7Z}].Bpv(ppv!j;6H8tpkFNԹ ] Վd'XKt2F 5a64LA<;ZxyLH!.w F٬.= db `ev{5egsԼz%\ؔþI9˘4`_Zڭ!{HV'P?+ C5 Yf>| pcUsa9LFo8;۠x>kɱ5=Dm~cɏT Ńrc 2~UH8$ NC"gb~fH׼W,#tѲО1md6d],k͈a+ ԔRr˔W#t1kCfLnB0{ּktkO ґt6--)Å ,Ge<}\"PErCBt8*RwX#H [ k:Z}M=c9t6'c8M"F‘{?þбw& J5:**Ecf HIm7#Hs췻|xh:Pu~nJacHd+*)+O׾v?6`IP.LhIX+`_"LKc4kBaʱuP[4t,8 O N@8Jo1 &<=VP:=O1ņa5@DOkDϔ]Ȧnxvq$ Pa@B^/!-d  caáQ!ю>6 $TER9H;5SБl!°~G4i|GD^D="k:5I`KX*e,Isu7=E|^~ < ֆ7&m8tIQ~l2ǼcGz1MYY hkeL ן6Mo ftdt΅A,M8ֶz*4g(X@}>{kilmoy f0$~ћB,u׼,^F+m/qmx˛_`ɒȧ§v%APjXb&'8;,ثqEx-aF[x:_ϛtzh ~;Kƅ.,飻/@f\qEocC'ȎC&b!p8Ogg39 #sĦ&< z1mj4ډzq$ f9XkGhFk8X} B>c'"[ 7aY/Tuߴ3#%0ޜv@8p덌ä0u_q/!#%dB@8&yWߍ^"jL YeYC\r(uPMtSI'Ia ƺ6($gp\HR1߰X> =>|RS8먪?sEѿl uf 9_aDQ'EV c62 *S׭4}8UkPJM HeEjۺgoLd<䙡ZKp~Ϧ3E@sӜ_޳#9''ǎ 6:7,Ï8MԀ-hn}1x/ 5Wނ.z&8v(9c :g\[|,-3SRC$ea}q,qFWp:78)#Ƹ)mM%*0Wi'mLsy퉻قI۩خ]Beͷ5;Z \B8i Nɡ3Hy~8sg<m*ֿxҎ#'܅ ݋pkkxقc8{hnOpz_l:LhnDC>yM35]KhTh\.4MGߓ_AACY1p!w3ފgމ ap;r' VbI >ۃ *=$sN=׬:5嚁?8al$ 8+&֜ӛXWOs"q GG7VPhKF*M#wѯ 7JUjSP,H H\$=H69Ƌ[$4WH*F,!L)F"bj4/dmmvD@8g cr}XdTNE0αE@I?vṊ+֠0Ia;@Z%01rP1*qJrQa_@/ǻOGe+Z;p$&r~B私ɝ Pr|}%Fl,&lLNX(4|~ K:5=<_X+.̝x`8Crqxp:\v#L{߈i6S_؜h+1%D~|)}Œ"Y, VrWfmhT[M|vYrJVK. O%T]Gy&Gط>Śe]ɡW1},.X؞?XW:檫Ǭ9| xhjعo:(~ɭ=R*o*f0^X|0hN6[Zm{ ݏ ߟ8 "Bqobxg.5 83-9q] :.Z\ ;q2q\au癰djCy2gEyYLB՘\`pk}`џbܺ| ߡpt1T!vlߢON} 3Oo^_G]+拒9vd*ř#߽Nctܙ8C׻kHCZDiΆC[jh8FVpX0.CE/+Gh\)4!~l`"S+FbXש?"3,d!W5575k \Hgә L;]w;O"XЇ;Q|ǡ(!㩪lJ^8U&ER& 2  LѫĹ0c|LSfS 5^̺]#2$F_BF~BO9G?ΐqu@i"1n*trSnDŽ|œ|ڟώ)[-GVbtC=}ێ%ї٭3='Ez syHɡ1]-8q~9dwnHΣGJ`Z5diBM%!@MnGkIۏĊŶg";zA8Un{(ی׎-8 HC&Pg"+3G(y]YTɿ KBc;'uLs`˯X_hGW;T(9QD]F1c3T|QDƇHq%N[atM%1̋էGad,e|8XTzc>Dh*]x5 ZWލfM_j0=oGĉ?3|K3GݕLQ[339Pry5s_k|$Nox'߄ѓy-5 lWsI_0?=(fGgnkܛ{ޜ9Kg{Q&LOy v{h⏾3 W_ߏw.߂n؁lLvUۊѷoxg3Eg$7?#GP+THWrZGbX}Wu g#JpչG]ףaNYCQ2(` dpP^Z&ǝI(_q!cZ2IkV#)؏erDR%TzT#ckR>qdi a3(WHd evM pȨ>p;ɖhk2uV˲ȜӁb@C yFX՟CRYCP:^W~f$`qoeKA?3{i`0:#7n)8- "XGcg_N޺yXvNSQJ3q*FGpz(1 [2̨]%dnB"S@[0RibQ.,RW. xg"NWmFv,\ /^{əcxFIa0ynfte=]R[PȎ)$Xl 2#닱86HT'6at׷׵|[ģb06tKmٵF?[ Kxl/qR #K_8 $ZŸtQTypF lzރBhK`i (79Ϣ<:/Ⱦuڏ?g{?|Uȷv2iN 5<mXGe{}yN5;{JB}o.OO̍\{K['K]HmX ˚qe+X҇;zLtOr}7(AP=w(u&#@Y +OL ~&JF4Hٜ74(kwXG= 6P/ubP  S#:U6]XQ`%@Xjg QdPY'5D=K" K:®">51:ijS,.ZG1x4R ceL$*~qO!kO,b E6k(ʎa6S$4"23TCqI`)K͞QCׂ{ʈ管ՠX:7c5iEYs&DbӁ;ۇEC$jdl&Q\CCz:ϗ :#|Aaʡ\ٺcN7Nyy8ޟ8Eɵp7NY 5cbr齱43ӈŗ.C8!H!9x/*_a2Ŷ7湥0<հeV:o 7ַ|$+֩P'o GÞ6}ŌɁ gv4+5`O dj蚁eju4%~fhVPbaK}15äW.&#I:K2p! A[Sա~y^ W>3G*h3 WH]SX}vr dQt4ɮ[DhbdkyMv͓OPYKm0V#r[aPr@f dc :O}L C=Hw?޸su68bfb>bϑ |p5L~&L~z_c؋ީωI_" PByy `;adT7a pm:sO3n-}4lяΙh ƲqѿF.„ K;oj_yX3{]ށft7u/kh7~/ߘ}iۋ?+rZԊG }J>Q׺tߒ>+q;۷`eX9e2^Wa(`twC'v`ǑEX݅*LߵftN xT9̸J?F%柃xߓ߰,34ἷ&-SPt@'jnŤ|Qc' +/d|"_]GUMT)4䘙1ɃwEwzL,E(=}=d,F׃9i`]xg;x()b#'22ڀ5 P+;8x21cORdmQMx"̢*+E51_,T3Ig'q5 $~Y`9šj?˨eNMM7JJLhZp8e%Zh aCEL%":pkJXƊj0ZZ]4Kt,&X00*w'"C~[R?6oOH:gRIZ%r䥃4yxސ'O?Amlοsfȣ|;>-ƭs%x_q~0WaiX}"/[&,'rXF|o4~d,~ٕذaQUX:s5A#w&-`kzW^m`IV7TH8AI-32֔8ӁGwO+ov#;LV܈s:_ #}?zpt0?ؚ9uaPⵉؒ0y VH;?֥m܁`Iuq7} #{j:|`@sk1j3t?{Ʒ7:*1 }8~$vˡvhgri,= GoԴxǰycfJoOrޑ_(ǰ@0 ~=8qכj a-'E>{?@{v,8<؏NHZCU:lurցb"66%=uz2 o8%#|J>ugqs5n'KI!m+/G3{'k)|˟*}~\*$4`usQޏnЀinе73Np-;,Y?]Cta`" .QrCcֲ+ā}y7"|f%:s0~ ]FK_m1|wN˻ѷ0:/F8'о7:[ 1Lia$̎!]*;u/NR*ZfiO#g49bXl9rg siz";nke.s(r7@q8*kjpg$`$;GŸ_Qhg$s O$żPZg d f=[?9&T teCCΚ\ f63"_c!lEr 5a Ɲ_PbecVL#)Q "עRi<xt&U¼xSXa|4(TXx'^<`).)rL2&ty k+`ڵ™4twԗ-h>-yo:rM*zVS13۳4M/[s~rO*CԆEJ=hL8e M#^< jHV 8A܆#hI(.>1;"0S'm~'6"O{,8f,x^wcXQk=k:$1 /2j] TZUodA-*ӛzHYfRP 59\B I!Rk&H'N'06)KC#ٞL? ><o}̘#] 2xoǘpHL*ҩV,/(> m[sz>ًGDs?zλQp [2VHڨ%a1+վ2̍ctAT@ :ʮo1H1Oɫ&g?3 ď]]uHiCB#Z;0l#fE p@U8İdageTڙΚ^WuP6; ̓]h ' Xp969PA kFC/wcc ;[DQ bOєѶFj!)ǿwU ^(Pk>'p 1?f?З( "pf83J'DYbVQabl'AMƋFpx5#Yoƣutئ{W+dPmh&և#+j3k7cM>+4jPH+)3-dX@Z:dH&֤s7ǩ"zLsYDɒT9B4s`d22u`]S> '^MD-F5W:sX& yJ'U)1#>bdAr 5ke#uQ&ilc*NIe T4̀ΚR aӬܙ ^af5rٔV@%B)޲,p.\zH^J55:FZJ:)lP9MAqXEA =9k%ٲv{Ιʡsf(LhZ$-\:$Xn^Tvck_PoDJCNZ8T"FnD6ZRt=p, \)9e%Fecy !3 b#Mhp%SYlRW 5}/JDY/e5&!ZUs4Γlu AC"eD`6_^: b^">6+=3u5 "QAr֢pTfYnzp @Q9"'Sk9dqh/rP7*Ǻ4XHjMySNkseԍpbvAݲa픀:E 9f"NEPhk̩$LnSJ[:OVgU -]=UYfb@2R{fex⠮ʿBOCOtC8nM $k FN&b/.2\}?wAʢ0|#Ga UT:X'mHDΫʒuL#N1ȎN]OxE\66ruTtB/dWjxv͚l,X~E-kMUMFtW6A\RbH NA? R pLCCc7*"tjs[(]Ё#E~`$DNOqI[3EM%@ D"E`8zNaɤ8\ґXWl_آTV$`:NWdAŀ#Hd % YXiL.XУk8IYdʎ83Pds,;R$aZ90tEqTH S/Ȁvg1IN +:d|պnKgXNp7yv Йߕ#+!2pUa% %I$qeY8k?w]}1[Xf5%A,X<=5CL2T#8!gx)CٍsMzJi)usxW5k2 %L۟6U1WS^7 pcJ5 s~אo܊eQdEp:0)% PC -KD_C.?u8VVqA+_~'a 6cG, 9±I6+޼$ <(GןX@+"XKtٯ9ML%NLaєƖt^35f"5]p5` EXҟyH(D}b5~ ` Į|l^%ey=+Jjo5(gR{RO r8&TM4p%c`ǗҶ*PDhwYZsg?Bf~Y F/M l5]!4ȧeH*H6jdF"pF8T&J(Cad''p ~|1kihg2[@+Ip4<L^V\K\,1n*U{/E[*tP TVw)|\Kzp+/ÔZӒbӻp03z#LKD#.fRӀ9 s<8CX,tyL:݌y7!W\fNH7щq,=A&g~X1Zځ-ȥÎTL&K*TUy =4!W7QJٷ* 6Po[h'CQY=rȚjJۈ.M0C82$uF ᳢{z%t_s*3liWnd{" L!+WJkL9ؐ [dt?)H.;;N sms*@s ::o.a} Dh#K[œ#̮[X̾9;A?ݔBNzY0c#Myz:T]]#Eܚ V5jh0 "dP.0ܗ\Ƣ#T8G_8+ϻ_1Gd"Jk_!>{5Pr$ 5WңZd3-&[ʎL _>$c8aܿeFjI} ?;2݉Xv8А$!nQ%S\:~ M`?y|wUV_B}[e #kkBDL}=/_%-)2uM{'W;>Snڣe#t8u|uysb)cK1LJUb`L,܆C Wd^etjCCP l€Ҙh:jkAc.AB3VL,qCuN0YJFQb̒=E'sF5dsg#?ޛҖ>himȣ7~ ۃ,k.ƴۀ4e>޽¿A׼^u|r7g0qJ@;27ch.ͩIcc1cDr̷$yz| Iߋ|k8ᅑf. coN.!8Aٹ:vMzA,Tufڬ]W~Uk!{<:,ӫkhL]M Μ~N'z~h^a~åM'ӰCбfvvϣ_08/FNΊ$}1 ;:DŽ~ޅ g3><8chpem&27=Wq0HCrϹ{ބ= vbY:T$ .`;;dP%Ȉe ZO1) VL aiAϣ vPm'aÏ2Fiz.V,t3aD(lJD:͎)4gt*'YE (='4hĎ;~]؏`S2L[LX)4d8p(8L94yѐ#f 2l'j0 Y ؤ[HU'T % 38ǻ !+05!RpPQ(9m5lt:E mo۔X׿~)79"\zRI|39TqދU/{>R$z$y>gZMx&m/$_}??&cPC2EjSK)l8z!.+axb,Y [ח/zԷg1gnx8 ^399qOŶs_ +m;\>E4pw'M \i.ҿN>t0qp;r%;g ܇#7J,Gs5 1ğ%O?(NFCkǓ1|q_/}nX^i[w$ɽ㻰KY@Oaw-vZP˵Xgo`q?DmI'WGjNJ;Gښ̋߻m+^\dl;qG$ݷ/UuoDeg 4Sۋ#_\4 KmǓL?ry2AIL3?'R+aľt~# &\++<^F8z{^4kirO8iBr8-R եPHFF: l Ȳْ&XIϔMNZӳ XݺG;wRАJ-j`zd |=]bL0"KDnds93aC0[X49 6邼#4DCvk 3XPd(dA,YL<Nm6f sɅŃ:'i`FSEi**gtbp;g_˦-iPţY0#13Cu0!h~kǚ7 k%9zL>UaLE Ϯ՞¸OuY8?KW߀\ك¨]>sI _r %Qḥƒ5K-p%!-۽ (v?ڏ0}LI 5T۳S@;g2~t#(GwT0=7-1g3IFx`#ے{έ[0aI[b7H2Cɳ`Z֥18}t4bA +,TyRo38vS񓘔m|֮\2όk. dmFGe1 8 3'fCo3E#yot}#r4lE}WӞu{b`; CT @H7_< i%Yy,촏4a~ '[vb(FI7~yV= ́=%Wt@ )CGnؤ^ @ 3STQ(l">Q9`AIS7.{aVݏ;1VgX}_B q_9)y-ֺPEܩOWY!D8#?Cg$]7Zl)2VK]0$C&DCeIgH>X4t@HߏGH EE6y?w];Dr,&v);&+;tkaaK`JhG{u UtdD"xsQ7aF]fb?(2nY d7_ C))F U(LƎa˩靫ElX܃;;;-`htC)B0r/ 5l6 )1?ێI|^k߼y~L W&AOk,SqHa\0y*(3 6~3>#0Í@s iz} & !fY3Mm9]L+er%ijA4*<)q0J4If'*L?/hV_ +Bv4IB*^t80\R*s+f'?O"=GqbףsoHkOU* ?0wB {Fk)Ζzu& *7 Hqj,-#7t@ȔSD |蜆WʄSl.A@#lSEs:Eg0 c4(I߸zюeUvM6;#a[Whgmә$/"rT8@R`;&p G*V3CtM$CVMM& Rhspnuxl Α49 ؈ݬ1|RC:EPudg/8a!*235ܴ^ H/NTQu tEM/%QBL $W}H^76N‚&6膒S(oy9X*-W:_0fve=~M.,--J˒x~ُҵ g݃87ARc{xn\ʗcR؅1X׉9 B$zUuODs ^?CNQ)WY4_qZNmY+M~22g'۴J<ۗeQW:&3?;ή<~9{Ѩw*${!C=!7pS.\0p6 .V/>3sַާ# o<3g{Uϓ$0=xf*Kc%|{syϕQzCӨj#㞫3_?>3WJw'|jVJI$߷)^ cv٥9oc۟ TipfǶ?uףn Y~'LI!H}PH4F|2crFPTLZB 8qVi-X3 gPAIagJId.Ziym;' c\ iA|h@<#RXtNB 1 3c迒mUjI XAK,NI҂Ӱ'Tcg;FU$9R\U5* Xgt@-[8 ?}# 9O2%lh) fpдB#=q? lOvsӐ[0 )hJ1zhRB (^iBX@QWlo36ڳZAll,vB&"YKЖEX1*ZLd٦?Ff&"FusRW۽ *Ԁ^X8yݫ5KYC(H 3B"į9ߏIA8U4R&L<xF%g󉌌o2 `k}gl({(ڭBRZ@Ϥ=;xO!ǚV$+0^~3k Y+f2ʼn )Y>I`2+f]羶< C Ri˵}²v8dr09 `0bMM*cL!BC  <#U9hQ30ó?_(BCC%X9z (cdl%.3MQ4 m_:M /o>^; +^*µX>ևg#aۗ{ ݳ_uٷg_ŭu3!JX ҙ!}[|z~h;ou.b߿ϠPٖxtt=[bxoMnwjI|2]u!Zvmir΋rvsR՘8~8o '}~!F_>Pd K927vUu{N*߬"ͮGv2Nuj,2m.g!vmnB{ar%׃ =gxHLAj5<Mנ1"x:!K"p?Q*RhZ2q&'ݭ1bucQG̳;Bf gR]xXQYRF`ólYc:4 ^i)Bi&\B}?$ ZFBPZ(;CLaQ-t Be̘HI 3f3xq=s1`sLY++YHH͒@2FY(1*zBW!jImY0d<oeȰ&H Ʃ|vЯozHDs8|Ρ Va5*g?bCFy*vgADˏL 5j 42|y-?`-FrnC]Je8Tģ EPOLu-W9GGasY8\77*霿$ARSE#Wptʢu|,_+{߻ :l6^w:Z95>-)d&'a}#MkEtE%׫hYK sKQ)w,Lڌ u-d>0>وgU=5Sqwö|{nɳOT \v{5^$zn!D9uh:箊\3e'qDvyصxK{vwl&z _朱emT`5֜vnAA}Ibq%_ގ#Gj;{#lh p|24 Z`׺$=q4o?|9lYk/pbkF{MY!i4rmԢ>?5¿h*];EeqC9}T=\'|< ;?bhͰRڔa#nH9? dNQ'V^~@T9T*g! l z[#4(`GVG&bspH( cNdƌm( ZKk`q0 č"-&EaTkalk&2 VD1)kz)J?g}R)+lH˲uD+V Mjٞi鸟POjS4^J)W~^_J?9&9lӨD q3HXVj6+'B6PF9R+qP! E[JoZ͒l~YCLgn;4a: i@>FN"K 2xpF-݋u#Ƃ}*dTP/p gv5: IQHTV.|fp/~?«})?zcE^luNSnƇq=ɔ5aUduۜ#4ui/_|uE:?~t7QfY쬎[#D(oԭZs &bS0 uKtzL̐ C6.[JwzTZ׿s߿9QO`ͷ7X7~m]{:]{ߎLߤo,]*dy񅷉J<m~[b#0zͤ&-`Nh5,ت 3"XZ JV !u/(3cBI3L*h(׿!{Ak2f(Psv\[+Xn5k*[{%`'l*3PyJon~sۦ8 =39\/~k!- MRe6R:dsiXdeDDU)3RN+JRD"37V*h)@ =->DNQ*XU\o6A_6vOqXlݷ[,))}@ݨAB#xtxjN8־ bs͍>6UEW55Xҽ#N)16vIw>k^\1K6 "|}vl?FۯRܤ-S5p&}-_nB0kk;iN7.EB!%Da9g+bfu A0#[1 _4<g5:Ţk5RnM"T֥13&UjMn"[ˀլ"='3kk1d"XJȞAa8Fv>ѯKA8V2bF xF<8eNtj[ C͍)t}5MSIXB:ЌV `5E>QkbYN8eϊ2أk!$SXijڌB8&8!Po^tUD٦ӻ=-8|bPgn[Nx&otc!.\Fxcv>Vxiu( 5 S2+P5NI!v a@RP~$ml#cc=P&獘{jD~!ԫq8a& ̂X,}G3~W;W X0DilF ]DZ{paA# bTdoMxf )xHurX*_Ƌ֧{0 =R 7&J9p KF k,f ^BH#՘$|V32)6֖}av %$-zF>,SygIbsx\O3>YGeENZ@sAT,y[p6#p2!bO8v(h q_YĬ$Мf+5RXe2mF0ڊ̄?3n\ZȚQk0؂ѹTd2N7$IL%F-i+2 sP(8e34~AC%8Bc֑vXα3΄C -A`(vP%k"~4iʜA}Z/᳟q[Kf[aZ\4ٰy13ڐӂʇ(6*az$(Ο VdN,_D]@Y䢩k-s @S+.PKHM-5tE11FY2A$7 U%nL#s un9g4=e,!Ol>MU opa>d,?z],k@7azwRćA;Lb K S2֊!!_4,/` &bJb>B$CG[N=K#AYYO Ak9AgQhbT@ S2AX ʢ>=[ْ\Ob%5{e} X&E>7^յhZÜ`cRAk2g4c@12j )X} mҊxX`e}<=K G-s4 ,"][fm %Vܹ'p43F0RD{S tLCHd; &IeGfM4HڈfC2|R>ZCr c;8NX*Z+Hr-3x1jͲE`۬b,ˉo*5xxD`vj^ڌ' ` J ;>aBeaѼG9%O`bkH}C>܈ 42nMvqR2'kAIKP SU#;0pȎFڋY7^SԎ`cV#6a09|j+rӅ/5t uậ}].Bn*O8r )j K5FkQ= L܂÷=$i;=7^ugƽZNw.DӆӇ1WBۅ{uÇD7ړu9Ƃvh;o6YVJq⹱j):1nnQ?[kQd}܏ d'1=Gpajnfko6׮ V}0B{.{7~,ؙQ7nܽ睁Ʒ>͓Zn(壏>.@E}^v|2 GT!J+^POtFɞQLoKA,ZQ4X-NZAI~Qg*2JR#+%DWFΨ.`TX(q2n eK*#k;K':,Pؐ1\z7_̐ƔV/\&,]??N O7r 6[e!2؀`2/-ʠ# o#,nuSnn<=iDCRxh=c)ܼxԟ韣WNvfCvrGҧn-ᮟȦ}+3?"sDJ2[s% 'ϐ?"e=gdzAb5*ɄAX&U8aN|gLw/BGa1?{_FDD(,Pl‘fqϽntcw4JeZXjt9,s)sL(F!@"u-FƃlLĖ=X),dy;?'zia֊ 7sPj2I2F AJKbg *-:Wl@ʮP]CZvEJ`\9f5}Ͻ0y/jV4B[ǎkcGhbu꧜Ћy >52}GjAvt]o~'zfh;OrᇝẈ K3K#qt'1 ?{&\V4,@{ޅy[}s3=zGܳ:~w~³jKNqE.clH} = 6ou૤ΎIS~מhXŕ{`L!m >ga6X=q칍}9Z;O%Do&ܻ͡h9"6BBmOKm~}M5q>FUYd1f7%/7j}uZ|#zfvK[ Z^O0s1^ yθ9w=Ϧ#u.<s`"*AntOkCSFbi M 2c`=lުRLXX 0Lc/YMjV={9 A]'Y(,N0ee`%%=Q3r̹50;@Hv Ozdh=f'5GÏ7q=ZWewm;X!0uLᾗ۟Ŷ|2n~z4P] |gT}ݾxsOW-QT<6>IfD{ȞGq|JqU1]݁K{sŢƏy䵊)gtއx8䇝އh0/Wo-$+ U(|Vr΀mpPEsW9u >G*+kWZ 6e|5Ve ±3_BYz'g1>w3@tqQAI+"ÂsN罿omȏA}1<3iמji;I ?oCӺ6A85ϯR[rsyoO9m}NB3uf'1x=Gq/:XT4GZ?rh1g犓h q<>Ѓtm7äѧО}׸{wc'1xWAg:vN'=]NԽ6=_׎sJ0K:i\I0YE,7"j$+YH|,Ռ8p0IP5:Xx(BV"S J334+n님eNlU!J0Rus3lV-#>Bz d){㛏+&@9A-E PbA10[Vl9;/e}0łhˊ&2l]x%mUu X9E.C8NSDͼ0mx ;ڙdV]Lž1ƬEc-{ALO'70~L33g9.qPđZfGwTc3:jQWW:&~3f(dbAڳq*cΡ#ygrgpcp?l`Tfg;BNPٱ >qV `e,TM7F׵7N_=ӿ3H5Iu*[s3`hAլ&5{Tu5T-t/lMg_2,XdwJd/={{9pѿk={Eh7:o;GUZDj)cM|/7m32j +Ů{Tu6$!c&+:cݍc{Nt];/1ɿw2n-umz%Ή%li@EcsiVG&眮ϳkE}aA(4Il! T:+,p>^P)D=m{G﹉>g|f69gd{V,$SƓFIbV$D}Ni__T,~?{U,2F5OO@ 5c.USBNJ)NCT )Qt\̳tM^yJre5,"!Ȉ9Td5OE:۔գlqO߬w%Lŭ._,@M:L2* T)TEmhL o;69kzzGh`|x#,eNv4Ui %g@uǯ{),\SCQ=Cbt߽;s,H~Yf9c:d! c okS]ٮlr hp ؞FT5|fkDo4̜@ն(ӱVzUc($£&&,!msn(Sιx:bgFZF |uMAȇg;}dL)Pn,|]on\t)X-Sh&7s}69|s%5@27"V:vb ܙ킕Oaft h眍-O"]ɽ̶vyX 8''HjN֣ȃj}&fG &{쫱@8pדHKխZ6< e'}Vs6Yc@B=SH.KFn$3*xͰACMH4*lC>ЪD RR̝>2f]AR\HG |hC%тq3, xC#8c]#2V52 ؀w )@Ф 4&4$?]LY8yvNe?l|)^a"pqJ>Sd9FFPaan3Rgo`QiVlaЉXaƐGA׾z9t58JŰ][bz=Xߙw&0[ 0LЖ=W/N"xLK,&3yY2BLƪ–3.w ޳$/6&g =ɊLn4MzRX NPlkW_9m_;x6g#d,= 4i8\ai'9. ZC+=$V4:'b|"GV\0zP?U<Ѡ:HӾ3f=+7r5P\_Q~ei, 0cW^/ęTLuZ~ Ю177v4X{ʱh6KV &ipǧfY!ͣ#I&,tn lpC = 3&aSaC'e^Hpn1V,Mx ]KL:`d2JT$pMH(#ftVɢd nŞSyq!௿"eHVq(o(!Q /RCYr؋ ]2(h@e+hΑhaiBJ}E58 vb 3l\,멌 [s Nr݆[~<1?)^Eɨr3 "biW?̾G'{E1Fu 5 Gm¨oF;67wWH5AV]KusEC;Tc/sf%י< }>>U'6~:&Ձn<=l1}ӝw0zhDRJ*f9ù(*_MHX& ӹſo3`A㖯bAxn݃_~*bD9 1NEv˿'N=?uN=n,35=^{"׶OEeHUgpX?s?gesgמڟ+t̐vs=kڸ&>[cϺ߯FjUڏh1/Tvl֗ 46._4;.Y?bveyssf8ލ]I b5ksͨ_^'v7o@,hp+Vm@JX7 ;%"bkrK8sm鏡Fv@&$ pt_ !5mCK@,e%mG],4ĺ7(ӐicQ.χ֐ D+ eI{Xd6v 3SN7_Z s>[v%f`/PjEƽu.bQV_Heb32FD7^|̡zQj5d2G!7Qח$AG[^\|#Dj;/^sRc}xp6p+mjyP r;=3GFcH]C2\MxP46btnq="9郏᏾k7YcaJodCR3'2;kQ02f9ƠTiԋxL,2!&s gjPd/4F Т7' e)ƋRny^T*xB}`LɎG@lQ$n٨~Mɲq]'/nXn4V x_Ŵft*V6}>{E#L cGن7a%>C05 >\¹=xMcmM;uȷ~NUլ笀tH-eա?]n~7őv:aq*|4BʹgbguFw4qUR,3q?zcp?ئ'e"ȉ]+.A˛cl.Z;!d+7q?7bMƱ=Dӟ{[ƿλ ?v`oaٌ{,O T߁cw~PSٛN99FyPq&}$UXpǞ/ŽRt],לi\k׏F-!7g:Ը;9~O%eC% {us~ywC[~t>W=͍sC[аjaL vsvbjV`_ݏO/c0dT[R-=/a7Lq/'1xHqEgTFK񼑑 6zJɽ1>琝hEd.T)aljqQp v˅ P]hha15Ca4xSiKQj+ Sm٧EF3\χC mNN;G5AS?ӵ Rzfƍd0"4 (wSD+^z72X(}ljN WTƖ{xqZÆ$ëlMrr2X'ʿZ"hYf1L`2)}&f?rzl-Ϝp! &: gYœ01, 91u;o1=G\Uճ睃ڹMym%~ϸ6-F3sSCҤ,{q۞? _m@3=$}HfNszPсYmgOUv={ύazVG>W~Yqd]vBx5CHkΧF'?A+žMO9G9JƎPD1 ~`9;1SP'|͍*fq c.xG>X}ՍD=2t\~{ꑛǾo|쉹Ҟͪgvcj:]Ή% ?W ܿ^5gq0dr}(`8CY:fOeSN6Ҁ*23r6+yx b~+O -N<5~6ZJ :8̠cDDADߡj)l+ߧl'! LzjA;Bo~bNŷ1p^sUl%E"4J("aHCkY'g :=d%IX+A^&R+ >DOk!2m> 0 !u~]pQv=w+b?k_i;{޳*b,GCQh2X`}Oet3E *VR&L[" 6k?5(r-`[=kJE-n%6љOIDW"M {iYs`Ǐ}Ce߫m8Ω:4x&(8ׁUg F:,v2ه-CepK?k`-ę%M*}Q?uӵ'I҆ c{1(RUOG+:g9#maaѰas$1PR`/@E.{\͒el]ٸLEx擄(CE ̌䖣RmYC(ǞQbtO~77Z;ݸ0g/f&Ԩi?ȎM3 Pc32q}s3ܵєJcO.Qx̆MSFOnCD3oPk\5hE!]]L.~i-B6cGh$6e0hX3&T .7e [)D,8ט)D 8;KhyK!IcNs;T!߰Я}Ѫe!'H.)0 _ U^yY5b݇ŵبFB5oއu֍c{)o{-<{q!&+qTji~WR@"teظl3Xwr"!} ?4eNk {QA3V'p#Xh-N? a֫ f 6eJ(I\JND,%M < r?xx"B G/fVũsG~@72M%B%řC?] kRodP%D,`'#!2➾skS,8R=t)Ξf > y2eʽ 4(R6Xt 8BZkh(rzx!wu/w>|Lf,;sy?ATaU o׊d4/Ki/)=F=bj[CE7t~C^m^w:cFUq ;H/juA*-O+?DYν-8gq/>s N] L_Ck{;ļڄANDZ(l#+p&kwc,ՁvC:_959D}8}[mqݛvcNTfn/Wrh[=Zp}OK,S!`Q?{֒X37MlބUD(֙cx9|cV,]6 _B NɝW ȅB0[%"mD@6'1z>$ c5RӱRe4LaW^MÏAb=i-xEôDJ^I梉IPndP~b,"KpP&q2eJ"o)sf ! 'JF-01zXu FH9B wZf m5 /D CB 3Uإ&jΡI(Hfh&?3˺::#ªȧ5} ^GȘMUc\87QeqZ!+oBUJF!N?zg!p"Ld. % HHj8cf5~K˛iBuK3O'w7&zUm%N;+-;&̞~+R㜘&=Um3잇ӭhv?SUI!Wu5 bd.Է,ĕ{^d埽B*u- 5(ju,* E`iڒ|kX`h {kޜjŠuػs =s5eaJDKӝ qK؉݃6Z ."hp:`ꗴ$+bAAFSX`d @q?cg隭qwD9 8^ÔXLLV$4s*[0psFύTD7Gp*kU9ݹMcvԟ]0U9w܏쨡 RA:%׮u1x32XiF7"(!՝@)maRxt?ٯCl%+aQPQVS%⼶*D(Vp>\ @ѝMP&^:4K_ALh V:s,,f14Wc偭9Hg9-tO`^SHjd3qe5?'=7ܐ*|CgkVUl 3H4b9Oet#iUÊ^vo­~'~k`ᛮNI6\/=D-0cWKc q8#ԕ `|fĊ+qyY8! `^hºCXaP Pm5oИa(ǥ}Z3jֻ7P 3Z 5?>Tx$\wf]{ex:i8KnyG,Y׸fOF=!Sѹ=_]( =Wdz=-g+\%Əd*SԆ97}ݳֽw/==iƃeHP28"ZXճ|}huJF젪k Zî΄i01xd\kș.dXKF<-NYb)D`BN *Qn1SYa`JQOY(>p7*gq <)TdN PӬEajl5A\I h 5,KNk Ch%m.~@Dcluz Я#dLڳŦ " )ř8ML{G(nW|Xe)jXĤsi0w[9K:mصd1HƼkxi4-Fv^04}Ji쾟r6mT 31tmky.[kYq6-̔{OuJcւ{$ԟ?+?(j;pX~9Y샪NC zBb5P+, B"Ca51;oEE㰌{Yâ6?!,$T7S9t{o8;y𡻊7TZo{ϣιs.z1WbmU2 $uer=22a9Zy+v,ؠJEwaya癢Y+RT-XiWJzlg$hѪfG~dVRXUD,@4j2N̞ǰ=y JGEF1Hխ W)GYUְ eTDdOp (m=R'̼2e8I ]H)9tb@zdTV_/=P,eI7=:J6L ـ&r:v@8; /*B^:7eS"ڏS)ԥ>{}vKх];K+< ʁiDD^D@Ok_X,issO~7ـypf<>'-hq0xquJE|4.źWjZ$;U/KO%e^ڷS~ >c1ZcWݷcxٛSW\V\,'؏gAO}%Ix?Z?}_|H 9yYŧFv{%ݫxM^bW||e^O w w)}>/&[ В(nk*BA"nqG-nt6bԽs? ToA``nAb3>SqNk&4y$yڿ ;oSkÂ~&73}n% 1oCMnzpznς"5霄{pwބv3QPǾC `'?=-Nu׋~mWѧnA4*gDF Kdel&`=X2 q$xtM]H7wdDj6GJ0$(eZgK8TH7VAJt~L3JS.EJX<&ܽ^݅@`+ݨN(\.9K;Z0F &hZ4MJILLLܙF*~>thj/ҍ8%X16-hhǪ=4zy^w9B38| 8geZ|gmsSS׃/Z!1T-+FғVcwf*+1?RW!w^k{yYׅ#d{R՘?؞Tc3jPWW׏_%jx ˽67ŎP.sf2637ǿAu{kc&gBӺܿ90ntrY^uFUgjzv}ñ#΁iDuKϠ0:tl5ud=Tuw!U?ݿ{s,ԡn&jsM6۬1 up~ܿSlKռ3~w(:Pі xcGm {%[S*\fxd=yew@!둮8PRCokV4X /ߏjZVƻ@C 5Fޗ@2t\y`Ⱥ+8,`$RSv-=H' =K,^E0aN|c[$xJ GX92 )h!A4ܴwW:sL qlx0ȿ gɜӘ|C 8XQd-8ZT`|\hl-?@B$5u+Cl)q_Ԑ j@tV._5z URgǦ%8/ .Ys0uE, QwE8ڬ]Μ4,=VNI'7?a~ s}O5ǻy *#G6 AM)oUUEss&:dƲI7;p8n` U1gj|鞋ysp8nQzGcm[NpqGecn ڣKL&{?ukk;7c5&Ί\039˚㬖~t]z-䆝ڍGw:8 m^Iևnw,x2-jB.\ t*ez};|g;ps:ꜳ[>/k-ވ*nll4 q `/cP?jT]h~^ `HkyU{L;09c9HH$,Y^Ktv]e'^[OZ&)[sER3 "`&3өݷϩGj=/ G ^Ϟ; +u'Ya^e ]h*;{BC4 QZqJ͢ pxUy\Ȏxi͎?SBӐ9Gg~Q5n6JȚLHh6t^=|wp-\]m}\Uu~ï #㮓Q+lgU[S y>r[$*B$( :4IPђCj4iљ # '"㯩󘉏٦_wI>lTK߽8J/|͟)COJwb:|=|}>loC{,j?aWG(.&Q_7LV]9]3eE+2JhW?0MJ]#RY=MZ3<N;\yo! S7"}cn z+Jn`4^F$) ;~ǃY:ɓqXCi1\caJ Pd=SFH$WNЅ?Hy'K,' в] r*iP7#x ؊sV WLAܳpSXU>'457Y$F3>Dlw!^}#\r5.^8:xgOn-]ˬ7*Xj~_{?;j.So#;ȊU_GLC/&1|}F"I"m }ބ$gUl5 Ƅl㻐fH؀aAt4_d2_鉎&8f[h.Z^ wLם~uztH " %lH)UaϻYrfv.}U2:Ht h"{~ə0S JxUy;02+!_쩘Sv{|vpZW R80,gzi`SZ.UHG  ԌQAz ${;N8h"P) HGb uX =jk}5Bs=z`@"1 :K iT0~-=\eI2ҾbjĬw[QSB#f 6"O6 -a8ߊ h`sDg+=l0qx-o*Gu*9F^*B%yMf!?~.n<({~9SarM~Beix{L2Bx1[~h8l{ 壴Ŗg_·;1~%Yuc Mo!=_ߊ9hNy{|~!f 3~;Fܳ}<78q$ڧ@GLoⲙITTEzm2ݯ[nӽ<Vm9x6L sanKw7oW׫m@a6G8Z$5'Fk/{2'v/GwDg2:%g"Y[p#$,FJ $Q\ HE."/5R"Z"I !]k%'iҨW>RÛR9)Br*73ym |PTݾ#il|BJjf6J"/5xLVE[l__Ze3 }9<艹N*e"$)(*-ҒC4zuTDgI]SP<ڤUAF=#{<ഄb&L׫GB(IG):@T<9eg*D9r38 @n>KLFy~= O[&NȵwP).LcDM>hk~2kʂvh 8x $5 _x`c.q7ԸuKSJǸhe*޶=Õ~(߿+#M'Fl/!4\yDwۓ?jD3|ޣ=JNrvpV478Pkjƛ{U{ W2}#&/g6dbZS=hh;Axǻa\pj$=[G}_ q:Q:a.hZo|ee^1{><RT>r,l MJy?RhDEG H/B"H(m5iCL"زJNnpYG!D 't\unXpV{L_[QPtҽR;d$=BXK+Z/}y틋Jo3'. KFU_`ȳ5Xӣt!V8Cc̺:zf.8SLM~_N~X yfrSVLzMP>PVTr+}r5]D·` |xQp4d\@96Ō٥p:t5) "F".N`,nƱ@jRjD.ZŴ~'Wԓ D<}3u|wx^%[92RQG ScϭOX6Ur @(4b^ NHyp=PrH*T5Xj2~;|mQ:ۭrBȰY 94iD cI*PĄ-tlK$E? Q 8 /9o.[=>ƑbjLo{C*x*\8 7F,ٲ30mljO՟܎zQJ,͝!H+#淎(Va_7}F,ݺhĴ:}MzT=`*ŏfUZG)P3c.@ә 2҉ކ J5a~4_]\űZ"4 y'7]j߈c‘^GÒPs0u Vvq|eqtb6kEoGZ<^\(\hsBm}F*׃ֵѲAxg'[^wF.PTt.B531qYZ!sGkB<1ջ@Q,V}ʼn`60IV% 9i=]C&E$˘GVdAT`m_HCT*sy72 "VM iedWljtX?#!B5AV!Sh4<vOk&ZA,@7ڦZ@Z_,7P%W)*}33= dc\S* fw]Vhv{tTJPȏ(Ej.9Pc(r^N_ïIdݵcd caJ>_l R 5O[p ~Ngpd`S* bϦg밴 5I>}i+8tPNj2a54q;S*vlb,̿?G0 D^y !Tp%nŲkҁgR|bc0's6Dvp6 &Ĥ/\sgaʶҾ}$XqK>%:_E[G_¤SѴ2 uLA<z]|^4Aȓ,Q}U|+G gα q臓0 0iw}9 AUOl\擸S+HNKdM^$WjxY[N_G[TWԝ։ѶNyyCaҔQ^BQLmpd(y̎$3]'oŁ=28ɈӥL_)ӫ)%ݱQXEÃbU,y%6.# 2y$mLe*Ra|k!`.RmEC }NL2=Ȧ(m <+EV9F )js e |;qW-VX4gI)ECr6b(O^U^ 0B%g@3`1X FA{zk2%Z >P~Nw~,I.Zm(5*Ł^3PV%&jF7Dȷ#t#W)jc0TiX5 rsui3673!`sKsˈR>M8wr#LG >ʡǮagLDbWϞ:ԯ\c[z\a 7`! F%v$q2c.'<Ƥ QX$0 M@?brn07|inoZ.)MS` 8ނ 9:&T[~IJ]+'6C[牓\WȠ31yOEE O/>;?Xul7yPr:Y)s` V99Cާȷ!:mɔ+VY×P2E.XRv<|cI9EjkL+}gds\obz rl_OZ+YP\HyIKX4e0eFp&r"P(+֤+搀uTȥ/WGѝK 3Ȑʋ=aB#jz:VG@>e54 #T}!< uP| @<Q+?G#NP*M7_hConF m_Z[36.C^ 8-֡;ϱ1#B:q+A*مc/cuj7A.0(MjT 0Km IQT9ݒ{,fX/2Vd<kC6SД[؂V+?SVŎϸ wYN&ɥB)*(ã3\Mϰ^^ 1gJ,-%.(2A +UNksT8}~5YpԨL3-2ӖJu/E ׮s5V:_'?+bUI3M>S4Ot>d:W xXBem\gn8p`_YC>FΟu`au*M; X~u˱j$Lq?2)Tf|010 /Vc3m$Gы$lmg Q$Ip-:~ýGHxa \fIЌ<>W%iFI-Yf%h(Y8%r"qk"IĮ=R)4DF1UND~JLSr/|®6e!*!+NP4;AGHPpA3P5"_3؀".,..v(0Ƌk\Ȧ4^:%-<" ŢW ALŒIN E+2+OMȆDC0@^e"< u[.c%}s#*"ojg ln)‰ F=ĉ$ ? |X kU=썵@46>0^j-7]95x0T.J1/`#lk1 KiW "%o<;N;:lDy5ƃ5v r\$΂7 7\͡!m*TttJTV֢fr=;Z1^C?"`' |)@%:у! *`hJRpx'U W:Kz x'FjCՔv$*ݍcڗ!E䌼"Ʃ+A4Q*-IAOiR"״TAB0jO/^T FkK9T 2ozhb\4%-{C\XYU|Kl3$ٽF-)ACw_=2jcV7?(OT HJo3c!9PIQ 4 @15|,%e: 4j`N|:d*PJIu^ʤf Rh̒hc79(s7ڎ*[ihWyQܚ˖cT2ɇX!7iUIBK[#P9^V 4UY~֝Jhad(=V-78q Gn :At1_<* Lut^U㨋 jCuu2>/Qը\ 纜wKu{}}g2y'r}gϬM;CRRR QF3cC図P`|hRrͲ}c;!X|P #J-;ҏxRʗ;HO @Fx- '>v;Xh͂&N0^twQ(8 ԵN7YivJȚK8 1])e2ldY)dѹEt)etd^҆mPE`^xҦ_&^FFIeI)`BʋQ2{ )n{%^2{U.y n2 @):q)E\_89s/zzHFG(2ԅ1!Z"cKm< 4TC0A$!IsFI"|4+nsc="^^ jI/T(b,Fcb(vyɶ J4)nF}td ȗ$jT )?q,{-3!Rj͐HA=B]Ps^ƠIO(ɼaqk>MhпdHU` $,z.~"+ AAu=n̩=*^e˱ OCo*j؅dh0Xpҕ8O hi}M%hM:o5W[S$DI&SjU*.78sU!5P ˦&&ػLEhmcv54JK!,3 }tmMW/0:)!=82e|좮V첞qY 8P=P|d4^9{MS RH(1; ; M, ¶ x_vv1{*|_SJ`ܪA|xa<7U޾:9P["h?Çtζ4 #~~s !36'< $ Oc4Z1Td9hԈ+g"BìAtGށeUm8z|v`C1'RT!vs܈K8tRpwoned]L|k砢{~MnRH ֞+׿:׷@ReխnJ J\|511,MRBU _mMp^[nbBsS*Ң\I_AZG?No4F6IT8m'| ozɸh;Svv)(8<6LBF/:U_f&ZJ J182~h@Y^OqꕰU$oK# r{p /7#%4/t e;dtGwۋiڙ:_n#SR"9Nqa@Q3uUvU\&B:k HK| 44]չNAţBAUK:p CCASş_v<([$dwh$TIG J'_qڋUO:֎߀> fAuN ~8pH')>7b nd>sD(7מ~ ?:KVҵ312:dGxVK&)l2AAx89Qy`*ol:{zĸVtKE?Hʹz|?HF 19xrwwϾμj q>:]*$P U]~NTrcU>v )&h&aU͝sp/<"8g y|-H h sgc;~7;u0*CIʼqVpIm|iHB;芐 %_rDCLӇ"c^ }@8M(L^(H87# Hq*#Cg] ~ Ӂ?o7_wE4k'H-jXNI!gZ83օol;T:«7a Փot6a>ڶ77"]q-[<% “4?|4_Uz,_49رx`CDr|g.YHoo Jހ?~֟} Z3~- L}]EU=~+wFn>k2< 3ր߼Jazc8ю&ڍ;~{畿Z_ñ_ǷQ:\.z @x/$ځeG< |~T++zȞ Y$k+b#o 8BS~ۿt!Ŕ`;4I2:Pr&6 YYU'WI!#Mx-\SԐhK1`n@O.j(l ߋ%ĮFU#2{N0'/7ki9~BM<曒Rݧ'36:7""Pz⭁BB]{dש,]ǗyNIc*x9/dSE%$gL]ď"%~]o foz$<+bʡĉ"y!oݰʲMrږ Wr]sA+H`*i i_wTvCfMo_=]>x͍܁3aXxZkqֺx-!?(  #C(]YZ@kԐ,'A%6Eޏ^[TEi͍  M ULpJebL (so-lo+o}cmmŴ1jT[=ڀH6NFC<|%p߶(J' vW[]a,F2e]p`#HT4uur>F]3n(+ N WW*Q}"62ʔ)&8`9<ӗ㷿B^zcA׃ʦ.Էm>nt5e"bqdJbRZJe1Q݅ "8^ܻ-Hm䴢VҊioބD =c_srܙ~Isv)$@w v4Z'Q3+ހN^W0NT}iQ?JULoF܊~#d=P*ȾyDA&p", 2,0pڤQR@.bMhN^ٯx*V xM&@a˛KZ Sp#{ΤE-uD"=l9z㨣N8T(/[2ćXVV*1Q׌@KbH ĩs?`S'4r|Ii i)B|wS*8Awb³䓞N̘zX|( &tY؎ATEH@3UUT TUS.[1x~ pg!+!}d#⡭*+ME#d+uc IIo qkv"N1ӌ.R)*^9k( FH~<: *΢kOk ~5WwwW ~6UhW“D~a0V௾q.:qچ?=ī}s ̑qz.A۾5پ n+so/c_ F֢+ؗيwѷmWj/]?s q٪|/= ;c~w-"< 3;>T/Ya"{sѪF2 8~`쟉 aymsY.Wt}{\}DAX#i00&- +q"_?1E) uE@הPmn'ph=ib?|er').$XVba r1q zʟsKIuh3$D#D^iGb˩d?YN%^ɘCxorkX$_ûf,KMբ#qJVD6O;lu ܆B9{ItMh"}P>M *k#xp/>zcA2T^0I!&)u(>M&}Ew+|9J`wRAeT-nô=^JƹEuhZ3;zث/Z9RyTd@y /KjR=,5H;NWUY 3'od+=9k҈'~1"Z+ Q$GcDe<}@%K5cR@XϗU4t\BE^aAk>u<tixR _USzby=?,ΘՌ+Ύvb8F@GNS/Ǭ±O St5!uᬜ"|6l沲 אB)U*]@AUo"ڪ۱jA[EԌpuSrkMyhl =ɔǷ'0 rR'5^H"2{ %I$'~dtAg(Lad<4ʟL;Mn+TpED Y Vbյ1O*= XxÇq1/5-#ʆ[qƎA}B0!z8(P­v hqo4Ms5,"|QD؍%+4Jηe: &׊zrvbdc&&/vzw~Yʩwj 88&-0&Յ(F|nD>+H ^Cu+K%ɔP87`E{06cQ/O|UX8 H 澴j@Moa @'; cnl\~Ld_?9g"V`\oKJ.sgMdORx|Mx"(w' HK^NjgR(ܳҒȨ" ͦDuk~ߺo(^$I2P8'LLß3ٌr7s|=빀0φU-kEʚhPn7Z JIlɔh"?WQ]̯VҲ"|kъPH?vY V`],hTF8 SxTkh?</.1ec?-x?Y TSh:$팫MFU砓9A&ږ;!$vv;ukƫJQ1=_CPPfh$ݣjajl +qDY(~1I{Cz=@H2ۦƺL v0A85nj ,ETD42vc# 8Ql FCsI)hTWsza%QER QRI>NRAFl|jE$ч'k─¯OBD }3ߴ stzJA~[t ûC'ЈZ *GB;+N~sV/])-8ZL a{͕ p|j8=#>fOCv_7vLD]qy"hjEtSBBbe*-lwh :3؊_ݟNmc"p=K0R;l7emj\f$!*9eF"[䅸5Nm,3 bu2#sv^^OمZ-s: cf*%!x6~˫"d+}dr>A79:5iVGÃcV  B9{nSqdKw".4Q+&_&e;hbIڗ)dXe=[yً0cH<8MFzI A+5B XoB=$z ]ve@U32!AZ6qIj b-ၢnThc\&MV]R ⩃VhN Q4;<)TA!oL#$Dx߬^uIFgpZ]53yw++ǣ!F"QVl' t3iMxsI^Dcߟجq],ƸOK6OTؽB$.8; :G^kĂ<~h%< \x*ޛ7 jέ[-mL`;ŢEFiC?fyhf`k8:IMxYX? v :;˖# `":,# އD-b-zFr߆l8o\ gto܈[waMAR0:x94=R2u~_DξrC;;:[pd4p_ tx&aͭ7bytGJ {}%cnOsж:o–8s*7`1,X4#΅L>W_p^ yUp^=9m?UW* IڌCvu mFv"HxEt(tc佅%lfoCkPQBs巣P\- aC5`)(q[s]'evRHߒX&z?iL#$`}ښ)Yl%=RTA9ĚUnqv'e"ms\"'ӓMyhOfˤy“dqؘ2T86).BX 20tÍrtz=Z+D 2%I-l 2#8:MԹ}:rOw&TeFwq >ɥ JXb"-a/DŵQB E8bP% \#5J@И`t6fn{nœoL⌇sXA]<^$HjMw83tOþ4*by+1ݸ_*ܿ U'H|v6G/bh2e-s[}C0mXr ֮\06ԃD$ UÓe-xӯl-ap+ (DՅq=s4`sT1ѳf3J;0c?߲4j|p$}J+B1XXd!cy3D8l9Mhr1c(#lxl_IUs.mNcPJ餜cZR:yPfiv/Oyc1YcT%x@O_߇Qy0$|9kKMQL;IWJo B2i"+V1/Qb7;)򔬹3_`U\Q\}8^x6Fی^aקqy'jMG%/D`/]a\aϿYRos3.x #8oz UQnl %U* /G-I6rlNnp9VJt #ȴ۟阪:ٳQWB`6DUli^[xSqQ.(kM8wr#q52c[qYWs1#8#QQ[?w M;^W0)WB>[J)3NTj{Dg{ldFAB#G[O$*J dGЁo;}sƋh}t~ВXЩȦ#\*H|kϨ|muX|<;4e({#y\Z_NG9J<Ǟ{e;Sli>]Zx=32g|s{s_/Q|gds\obzطUO;MNEJBm5 UvWeɭzeImQN] N -PH Gդ/'Alh TͧX5J }6n|T r11ԴK?ݰ-;4W:GL8>r!oN >OP*ZVbܚ¸3 6+ |jز C3"q1$&{hnD㭖Y)h(I)orQ}6 3daQ{>H.k׌X7K%p *!f<7b2YC T{oKnZhVl:XLn7;Yva}.4L-ʌHg8үqK]kUJi"_ $bx2",g4Jq^+8>KhaNk TPT2rIVD@! Fs,׀oxa 7tf׌G o_z8c^+*(D  ؅RCꢠAO ޠP8cj-1ϩ=Wit̚3H;? \lВ dCS_Dee-j;2 eB:Iʐ./yH. eyR*>0 ̺H R8x*d_NrV|ȑ[4";[qV[*121:qH\cOJu=B$Ӎ0}QdϞn֠E  O&" ů=C1qWUĐpёg*)$'%54>m} U=NB!<t4\e.[(D t pXN>^FS(QB;vrt%Z}R=- 2.q+A VtRT 9]OxLgcmPʌj&:12jaUM UifzkS|KJ>SIUwP7reM+ވqEUhlCuuMUbcΊbS8F@1QAoFz`X 81%&8:TU'ftl_u1d?VP=Z7ҋ? ΪEm7D*5HP&-L)JY]TeWc17"<#P{|*Cn)+TNjĕ2Sq¯^&iބU,qLWX3JK>(1gk5d+Q[Q*\v[qsx쒓Qe]E3ǪpQ'*Yxxm6Ȑt\L-꒫Et.=ƕIÏEa@b >jRdY_FHrrXS#Uxt+_gxu1J_y҉|=0L1URX iPc9ǙD,S/KriWEWgY3n8wѨI"N3LmJ^/Ƒ?>Y<_p ΛOa9k)k*lo~//dIޅ~Kl7/LU;ACpFϧJ]11O(Ad9ͤ:}ZA9s[ZPCusW4:x<ɟlW(;Y Mpnr+(l }ATXVT7DHU%3>h kI"U:MaY@ :u,VA[3xNzcX@ Rpiis(Pm65zlKg-+/&>hmڢThF,Q} ?.=ϑ6Ej^"gƴST]_HQ!HZ,)ZR|9d3ZQ>S'48DKĤ_nq.]TwR && C aB:= $Lg㏞X!&0] ?Uo~'^S~J~rs#èilCM$ FǚP܅Za`88wջ6!o,YN64n¾Zb7+*&S]: QRm%gښHy5ŔIr<Ҥ Щ,gePL0O=! Ã;#)( R K% 0*Bi'$fT'tonEMn<3ĘXvW\ .2>7G{ <'+*&,\ws}ůn"JP/_),b=$wbϟ+B2%5TdCS>R$}^6GDX/, HQC4CtBR$bmN^70%>U ]Ȧhڦ~OjT$TP,ҤldCԐo|H+xHC Opti%5# DL};Zb "U >txh?{H,0jAz!6crpbOH%BGHI0p@dN֣; )4Qd0Rx_zvq{/C1ȏ$*VnYgx\_OƳ?~MiÚA6#gwËІ{p;KoD2Ĝcᝅs|w5Y׍K"Qw<_EkME=K߁y$H.'sŸ>G`#胟Cnj d_J &_s.] KNGӏoGqa>guBAG #J-n_%wC?pzT\ztvVcR$-+GwT"kI=p W_$ 'U\!ZFw<@@NDq3CG0P4 jrG&M ~hM<^g4dhB ",m]5qfNzr#iH&'Iq9E#=iX“@hb1 ŝx_,UU|n&} ڽ?AzSՋ]* 6asdKمWH.|(vtGEov73mymkd*,1s/4bH+(HMZHEͪ$\qS'>܊Q24FTSј^>+Ddp+#`M @v#`I?VEuA>7mo8ԗ'BLdayUs+< Lu[mgtF'~> |%^ N=hD ;}oUz,_%!v> SѾ~ug>kE >s3gJ՗T;߽ܿ,m'>ûOlѦB]25bjm+̨c?~dG5wt RAt<䊴_q-[<%O2ơsZ Zp^{s_vZp^&^X⏿z.Z?r5|]tCpQ*rwŜoUm{1|oіnEK/v1' ih> s. 3m@f5>7? +|颛zRBkBr UOF[ r6g!>(}!LDN≫=5=aj5==`""ii"!U0$`c%ʅ$G[C#25C=z2F*9U*Z)HP:'JCv2xR;L@ KLsVI֠0] Mz2Z yuG+&0=8De ^, 楉|=8W^Ȍ[>Pk뛟c1\Ib8k=96\ߡA;ɬI,%#nx=>eLEY / B΍0ĸl:d ϫqӰ,1"`>éQ$H!!(cDEN 4pMQ#{ aq =0w{Ăse+DRH񸱩vr6~l!X;23 ?W'y9X^:;۽  CXkaJ@0wJeD{H%PRVCI!aw@*YI4ĭV鞍a+skSҾ۲$[ 1` @adzȓd=;yfOΐL;$ž%&` ȋlc&YՒJRߝ[߻'4 ʪ[{Ϲ@ʰ ^$ jW5WTu ~ oĪfݍ|r3Ih]BG)sנ7к?#n]ໟ 3O>p5ϻ oۉLJ+m~أ߽CG3_CKz\?x&s^^Q|}_8վʕ/7ކƫox +>cguמg *[/U8?Jo+lhv^oչ:{s}>O[ϙh_獿ĪzeЇu#~q4?yFy!V~sCQDTy_{L=uf t~./c+ Ի!DB{lɚ m;JM9_ͳ0RIoJKvp4;3gQ E  2utSkUFi%ٷs1"iA'IAf#P*4@hOfu#6/C1pT;{bp<?F3Zx^6PPBi ټt$dQ]Y{FXT]#񉧆Z;x} X$~z*M>#S*>PI<6=rzo93j9[ǺWmjp%ю1mkWAbV}ݩ?߹UEFZg4086oׅ$46Ohhb6* nlܟ}Mu s?݈xu|=8R%e5cnЃwgtHqIZ4AQAA+^ֽ=z[;qdÚN~wM>ssIMPz9;p{Kǩ'O` 1v(/}W~֘i` ;܉ox/__%0йTqj.Jޜ:h׾vpgdgb3 ,}evW=7޹KKus߶{wx4+K gȂm&Ȃ;xA{Ym)Vhc5b_5h-ONMa&ѕ7:XKG֘>)2P%8kGՙmwlL⸥stDfNuΩvB8YaZ9GJ$ajNG|?8غ֗nYƗ,6/j`rO6"Z4 '<;6 |"""ڞda EGtJ~>RTeZoyd见%G\sx'AFMnqKdݏǰq:?SqޓtvW>[Zz oV݊1݋?{}3(iUش*Çʏ«)lL|]s7uۈơOߺoxpg69OmSiSk~yhO= TbR `j.ԁch-ǹm s{N C/KW5Z {=C^5G,.YǔEt2FcTT51iQ scx@'pj4ZZ%|Sc : A_w:vg0{XU;tybG] 杷+^<,wmY3jMNr|8mB0d׶guj~605yMW0;tfKK_y+0slvNl߇U7lWsqR:ID(4QHYZ7b}H8} :Q @P|bFJ`Qa*gB,W* їI#],g0 2})ыLӨd'*W‹^kkn_I ױpf֬H.uϧۘy?ڳ<17z!e\ )#3*UIcMn׽Bw .ظz0]=2[ޫ>SS%ޓIPO{t-wz?$WhBש=SC _uvpѳ@Fchղ֯3ts |[+O0vLg-S8ь"* =܀QksR]2\FtOֽ- wNcOr'rHqO S|<:tS BE J臄Nog HgaNǒkb1*ѱ[Iߑ+*A!YB1b̳wA mYNwrTF W2@''%&ݷl r}ojP#c"TjALD+, jɈd6ȌTHbd*bTl| E'$Jr.51+zz"CcR !I%&7 J*81 U1<bF6jjڭNM۰c:nغAZK`{m*(ې+?mW`|+_>UgmƦգJj_]7ڛz>}eX9Un~]4 v.PXsBw}ʳV]\N6l†cOn}/=Zo~%>޵wq,߰} /5ācႋ߻o`ЃnMW͗-̫Q ֹ_wS ?i0M3Y{%*LwԗChRHvPdj)ހ-DkI$Q5;UPRo;g==^ڊy G<%n]!AD%I8K_#Qęm8ڀ@hpK(F" ƲlPaVA@F?\隩jFT4c LtbJ|di} BK(@D't L!3EYrR:|dꂐֆ>3Qzq"$g-%njBWUv\&EiU&ek (swf܆lI@)d~Kj;7ߋC_/*٩8xO|LcpZeWa!L}wwwӳh,ٵ3Ohnwg>GekqUVP}NbV k//3ǎcEo{GKl[6K{_\\|\~-ImǖK.%nƕj= }޹{ۻ:o3;w5Ն{bݧ6{f$&I=&{Ne} D+]9N8XzkVލ#rןV~JVay`o5e&akg-ܩx$bE*O'n'sk_e/sk%`܍}:!V ίkbeWb͝U \B,U2Lg=Fs܆>4寭$p~HmwA'kJ)`K ]aq X4H tl^>HyZ' Zb /lFx(_@cqd k 'Ufej}Ez+)&a\ɝf5AtPW9IdcL{|QR"ߢ6d%Ĺ$P4U-d.IS_FI$إI΂DL&Qrt̪3wHJ""奼@κ34ƟC}%\(tRH ăr Ge!IQ4Rhg*c\]$&KT]ESlU~=g%zJ.i?y2U dź|Mex9pd=LlX?'{{NR4[,rwQtpr̪EГG̡xt2zjlXqpAl;:dt]y?YsS}, q&1[ q*ZVW0wmHy:r-6,s>uǿSc< .R}4Ny);\)b_khE{eNiN Wm-\Z'sXBn#WlLبtOЗE;`}cPf,km!^ه;F_=k3ko}51ErBK~Kk'lQ@I)AY5J]@ĪozKOCBbRFHh"k9ʃ) lA)CX4J['4(v<v  Fom~!|)M=')0@IyszdSx$XX(*#1reY1c$pgDmG?i| :ȓ>L]Z >Qֽ:htxK1Xz-t.j>6mV5 Q!F Iʲ$G{A,`QC)$tE h#~_Bc/U$ib$Xcl{4P}.5ӛug|M q1ѫ E$B.=( v馢MX'y,TNE`|Q,DyT5I=Jl5~ YX*%=4jP$Rk(EwֈJhT_(*ɒL:ir]xS3<"fjhV T *gj-P%ơK'lZ9j*C=٪w;MX%3+LTAC|U1'*1H$=OWYj%NCSa6GS5z yE<Ĕ6l2Sy؎G1W+ *&IEDF=%\ SsY7Updq0WSW]tˁzf8< P6e-e0z*@@ 9s' |*V|XbEzR=F!s^&!Vȯ9 @NӬwQk,YRˊI@iX)S׏_y>Lz8B 篺:%>-nTu#|1]w)5kxrdĂ$Gk;ILR MxN-$ ߀O㎿n=~i/;DŽBA"QLsᕯ;^>;>zܜku>ѡȔu;2/7oW ,+"HSK6 Ɂ\ ٠=_| L :S!=('#Tx% ]"l6Bd/ )WLjc(&ɽB&Zs\3bzz[BbzȬ s{tÐ[>G#bH$_Pfb׳DE ؈f8Z}64 d8T$UJy ! D: =<ԌRdQB2nQ(x!aEv׸ή/CN{"-hH+*)FHx3oe<҂g[ .~:}L(K*X{/Rاq2ؽ\AI% 4< 6@"EsFd _xE89HUFHO骳xYyjL\$Z|7 $?yqu2jFݝ6k( Me.K5-_R3NKƜ4 }KPRєPDjUTD #57FC )ڰ"a.Uuuj*XQ+\[v R_M?₀FzqH. |nI)@Dj&_ iq%:C!odD!Ӛ0Kj$J-1J@*\4Vrl$.S@j-i}YÉvVQ3k)Q"0̵Q4+I_YC]-:R_\W*D B ~/ulCdϬ3[@!iar;(8&6v; z|ΟOݎ]җ /=Oq]{`PLLb߶[qw>{q1 SULSsy *N~c^!r%tuyy+1T=6}q|}L|ۯP5k¿~СAL>}'vbpE/\[ XՓ1G雏Uox⬑ >1+W,tw|{ Ǜ_}a~wֿKuɌz$<^RUCS%"8 MPﳍ=:du"VeXR¢AB/md:ky$@QҢ4)sa:%5Bd)A5iHdb㯦'ܧHR^LMDp ıHhEPuREG)8z-*q)PJ!lvp2{GP tl Td}kPH oK\X9Hh陑K ^Wr'r%Ke3w$SHF109A̭K̒!{Pt3zlJZN>m"࢏!-!c'ĵT $l6/xEO2Tt_8 buC( r|-Xx%1|1͸]t 捭µ_ ?v Q;ken6:~4CdR$\Kblt ]Ưiݯ4DoJW7d*\e%N>3sp[.<}3Slnffk|$f[ fbf>ټctJYɩ,Xq>s;X4:`_ IY&CJ屧2V刓Kp ͻߙ$`䲮FEB"R$A4KAzJdg@`(1>3 \MuBcm`3մAF$L?yn}م^ #O TfgR)Y 6YGڈ һs+U15}HBU*K'$%Rc͡Q,T{AZ@SRsxXwIQJ{_{=A O#Y!^'6ы9HXy143V@$C(i3g03D>zcC馛zI/ihե͠jRt`S4|1/{Sr9*m嚻]}_y^~^k7< tf_seӑƏ9ֵ:%n= k`\c|ae?>x^8Uu)~WƯ<Җ4٦ng9T=|ۋt&\ǸkƒNPrKKx֮'ee[4 o*.I}+ Ih%aRBBXefAHJ*H: M{Djp _y)溫|P3B RM3Ċg7S֧)Q)kDžJ~}Z5/8ȻJvgwƂL x:FT,!W8*?<$hqh_X[5i!&.YkDW㹕M~^J7O멈Fsa]D‹/L,Imf*L$&ekpAV %TKEO_Ӥxem,49ӲzcDYA]P܇C#MT U,k x l mYB"EQ~tR{>z"Cq&*hGϨ7P%}oapѲsH=J~K=|Cw"dPO[)bWyΘtzV6U"hѡ6D986ltU[̎=9^:4kưtimlؓhdnٲc2+Anp(0EcW7=cOsrI)*iE!QQ9ǀR݌TV8X?9ܱ'3H68OC@XCѯ,y4DLK\B,dPc5ϫ/iJ4vOߘ"}̯BI A (8.R{"{e NT}%k_1 9@"&6P7q77 &IG@ɓȍsx ՚Ʒ롳2v\TP@uϣ}zAɼBb1_'ϾPI"S8}ﳮ%ξT?4%#_Q|VR~cTE2뒉o^=.k<~%WIJxfڱ7t#CQy7ډrTqI*DLbϣV>z *W)BrowQE.mg0?6``&x40m{|p(M N^OIl۱C+b1۰ZFMʻ /g xco_(,/cZdc g框M7s?R6hHGq2J{mCYI+?x`LNf%ak"_~ Q*LAkQ<'QLQE﹣Zs^[Ob/(D UC]P"B"SXRz|{TB$ n2X ECU0lqP.d8u#9Y4|}-{ cXUTb֫'40٨}Z!*WK?UK/) !]#9@s@E)$ӃjBβ(k>wK)Q,գXx}kk,i~YF\X_3֯B)W$@k B9]72Abo7&-YaN \+h.fZ jU^PscC4iʍIKi]DyB2PClxc}Duo$;b}OQB$ ncz@ =zˏpp W] U0m(3JuF;odcKla|R1ܔlss ʦ fyl*I#D21O+>6Un?{wܹSsXj=t6847095_p)6,a>;tsF#!\ee͞޹3T~L#~ { _Yja!q ='H+|%ovC%qEJ5N(A}@|$T]ͭ% @Y)س016QCP.`L'SM \8,DR퀠*%n`kKE6֐5E8o( bꊙ*C%@ GML=dQMz~Dt]ƶ(S\pu9 ?zYE鄆_D DJ$-5{oTZj{@Y,Hٯ/j<%%o;O~PD$uN-ӊ$^b@KoQPQ 0~wl)1lyȅHS(Èzbb}3Mhoҙ/8JHH/} ̾Ϳ!y<~wsW>T0d%bRh?Wxag rE>DvE~w': A}r95V)&^gK1;Y6]jٍ~{] uO;6z+s-nGZRUh܅[yMOBVcL ЩĤd⛃P #`2nz2kg|k!jD>hn0~*kTjO "T9ĕ_=k*5Fn!jtq@.˒oIPȘN_g3鮒sg%~GG0.5]DJ ߒzǢG؜+䅿}vLI$'DyrtE^:v "8lmbD1RYgI8MK5W$Q~% zO .?U+`:^Xs{iḩ:AI`HTj.RiByPD%Hh݈BV񞋧 A}%A2z[WmA@ J(`j(T@ "%eLdѢA ]pG( @u@ʾ7J)i5e\ IBC:{Z@RrET2hAc%bK TXZQr&g:Z6}L9R<⊂A($227},gOlYjncYJ?̯ Wb+bܴO_B0c^(@V#RVȠ9r  J63PUdfy.LrL)ɋ? K;{'8 Kl/M|bab?.l~`])X^z?^g]=6zShoHBh!:j8 *Fe T/\,_Ǣ<hr .$ܙЅ-j|nQ)ZZ G-jA0(D0lU; HUPчBd)e$?lfIPDyΔWY/^F?53"d*DD!w#p׮I"l_F| d rDB26;;^R6wJoU Usf9떎 v/*`j ս6DSϫ93^ ǡ$DZ;K{ 'Om !k[R04s PqxSQ{T,["l#q7^&  J}u T朘^{*1T 6OTT)-7M)UHaG-1Ck&C,rkwO0v(W W꽖olT^e*|6;6% K4TĢM~ N&(Tl} *1QTG4ÑBeӏ(!4* F zٶ*<47Ė BT: SӤNN7ć1 %ԫ*tjsh;!2i cX3E1'JzLČw&/{F1jF^YޞJV۱(Sa}軄 bsu-!<e%X(D3t+^A(/B)]1'y{Vh$cᲀVQxsʥȕ*aWj=j q25%3򯚃tm$?ê”bƐc+yk(H\`/BbKV$WrI1Da b "pxάV *쮭%c͜C.R-ڰ /ʈAL 2HBB,GdcnK.%.|S~@\ )1 뺆 VVi=+r :ir {oYHD JSPWSe:V{o͞$NKނUǫBũ}/ozu׿/8SGw;9xZg[dC!ۀX !Ȃ?ԸMt WDdw2jSBJDK`&DN\PHak^@T"r*=qn62bL (0b=CHu^;҂(jCb S@!yԜ 1T$9-A5&; ǠU}r|bwi- IdC);1=ʑ9^*"+91I:.{@H&b;: 2ԩLX%':DNRyw`nz3TbX:c Zz9ApľRRI1W ≯&z?V4}7'j&@o͹yCA  4AvBì'h~p*UdX )G/,SEBW(8K`M#-!qq/@$Ay`&')Kiw9пdh;㸰*І40.),i>s`d j^DuP=F:fY uDJh+aA܊?ViV|mwǦ wq^P|c{_E͆I&fN1O0)f=EW-QE(l7h-!YwؕVaM88\2`BL8 i ŵGߕҔ(/0"AϢQS8߸A&тKG7H#fISOQ)e^f7|PS*ф;d$z|ɒ>D F%mZB*˚usD\!ʼ#G=fcyXtUTu7ԨPF_+%MMͨU#h $́ 5`v n!z  X%VJUʂ slC"sIv;'u?_gBeU(xݸN>F333Ƚ "q Nڐ1wΡsF75(Iώ񵫟lcnWM5}%nN G nX]r #)A"E@Ȼ[LB@5i6K>nU fz Xu!M/ݨc5i瘀L5^L,%'N8iu%!wTkR8Q Rv+iEx3F(IqJh~N4G WD[+)ď$ޭٚ2ɋY$_Bxj =+-5ʆdH,dJXyd F-V+9O68yT_~c){ ׿Mxy{ڋM/|V)v+nmoEx/@Xx7N~Q M8hlfu"iQ*ŌW3UtIx0zBb),>)g먾QAD:0ʧ+ *R""^~-RS$P"#(#YQK}OpA\x}8P;mBFgQ.TMqAŊMKmB<=7o`k)!11;bDkhh >;\ ؝A™oBTnlhɐ{6_|V/ɣx郘ŪWos%]kJǏCc`֝u[U"4{;+7`_ ;u_\cؿjqQOAP%NEU7.Vj#,["i=8ݱՎDm%N&Ehx)iFYX+Η㒳VbѼy-"tcV})gX1Rohv(ym%J3u`q%|^hZrG>4[Fزc+fQNRPܲUXetJy%\O2~gגG&cI^b%5ݚ=}i q)!&ꑔ~ JNO/vQxS[A2ezH|"e (FݳZe3+:㑡h h4V \QᦏYܚatMه~ wUzUz֜ ׹C㟿7'j)T A8ոWT\gs9xCvܶ}-^~2\걥G_;4`&A%AcT>7^>^SI d\Mѹ[)qo !EQ:KVh+%06&9±)ZI?zO&?7vcP@POy(Tܢ7KLCb)$lʟAC:j2jԄFn%I4@Ij F HvH B;0"c/%nq_(cY+#AeL)PfC!"$^3tf#C.*}EԸyEkY MF-l=0;= Tm;7}v<{qU%(upz~}luXp.v5.FCo7Pxo}!V;,53旾%cqՋ/êW^ yDi!X_/C??2UY4*Xе'zl!W+MۺhBm1Xܐ; ҅&f"ȜRk%R ~\K:cP;&)$=[$nzIႬ()t%k~Ǡ898w%xySD63Oq)9wD|>},+ $B/ -,+h[3.!jO e%8槔{6%ݺ<F$P6'yOXN*aQ8 UXtBTM %Qiֳ1WG[$'q(2T j;$LJZз?u9_Y>ǖ& XؿFF=$-%]D sr)%RS444oC/Ź˫~1|ފ{[~cR%<޹{?^hՋμUocϚza>K7lpll^q?ʁ:X@l@&+>R$ cH>-U*խD7{씎]Š@#RJ%MZ@n5q5UQUxZ l5 :"WHRܘn~E}@$cx% "֢-XGu45u A3b L #*1UV u */_.!>D6 eo`."SD{kDfC:V 1SrIRM".69J_fv jʒǤMtS(zĘT[ 3DNV+@\-&&6:0~)oYr1TVnP^Wa,z+@DZmc偗C@j`jWby܁}+nQ#VԾ `Y0lIDg6ed ~oލ|ޢUZ]Nj/ei"i\êŸڍ-C~H(V"7#T#F#Y/NRa U$m֧D0t:ZC;4 +=ZS%OI L<8}q'uơBg"!)QCy1IҀ&\ }Ƥ#AɘW%CbONBSd@U(SCus!7A}̘\*p-_}Xr$bGb[,"ED(oG3ZIA')ֈSRDjnJ4\Iq;c=pWY}L)'ZV0GN4V)()̘6lŖzTĔ(O-=2@,J;Ȱ'_!E~>zC*" AD&:w|)y__y8N- ،O$L=\6^pv[μ]zI- vj(ap(j~3w?ܺ?a%0D$T SbrO4~n$aD$*B1j`}.y5TIh`Z 5lX⥥f߲cSOBurR„eT= K5IM ƭB8oFXd$U%(fj* EOB$a CUdZct@JA VB5{U k@U|,49JQ@D|M 37e}QV;);"#TR, DX,W@+š[ߐIxK+)$OZF'c y%YykEDg q, ,2񅘴& LҦ|imklz]0-m%h6׌ͯ{UbEW+6aў]ggfcy>UMlV'cEk_uG1uq|틏$ HtN>!ӍX|\F}+P_YRse&d2,ދO_+'勛'KD?nj怀 3$y s0R_LȥpX`qz+},. Qڄ#=<e%Ixiu{l\r@̙-$NC3Xcxn׎T0~?O3Az"9+>4Ѳ=̨ydE.4L BSe-;ʳ}ϺŶ[)W>o**>?gwx+BZc`g|q-pEX4>ö3t/>griXY~ |_͋6_X~73~Wmw$dU>C%Rf梓V^(@bZ#"foRX '/L'ĝ%W0Z.]Qg>Mb8BI+Ɛ= CxZڀ ̨Hw0>vW]jS^^3GzW_v=*pSTbuI<8oo\ql@vϑ |>k_p!-ݽ|p+FԱC*ibd7oZԞ@IPBl%p߀=TF bL MQY' kv\SB8RT˕1KMIJmď""T(&૤Ut4)G /"'x@ e b)i.l 45*&s .GhLA ^FIYHFA Z~BCcثJ&z#G* WED}3'SwΩb-{7bOFdԵZ ǂZطӘ`A9ȜNB_ƸQ BQ5(Aۊ{a?rgE@UyMI$5MBT>KSǗ`hM%,7'}aDR\}Ks+M3PoOX-Te:Q I]^:خӷ)@TJM4yDNژK#a ?> m߾h]v>x? ;Cݩ (U. LU6Uz/j5fam@AA&A4(GY$܌"2;gĈR8Xn#˟0G "ׇGb hCPR)%{4fJ{} mX֋^As"Ù!LbE-(n<E/ĥ1l'-N=*IIe4Wr.RhdB GUߝA$_鯳9UKoKf%Y# l`^g"-\W,y''oRrC fsr4.O|qhԥz$ oǠ܋W]dYIT+ V_͔(h硬9 C8PN4 8SczB5% ) -g9R̈㢘Dm6P˰b -'CqThV2L`u?S7YIu;4FTOM` oHP,dPlVd1Fc!VGwɟJ*CCrsCxtwE*1ً㱣W빘CI*07HbZK*J]Ӻ̪MvU&-!~4LYL@GvZYcu$R-ʧq[@NW-V|I|bh^RG#ݐrcܡV(p?D߫.瓡2(5k;z5S[ Z jhW9 @`yK |NyY dd2 ,dо (n$oW_prn^'6J}PxRϘGC'),|~JEcLκt.}xc'k |>3 E?!5;sj#6yd?4CZ6 ?1J&\!R ~E/!^oim.VIElz,ـ. >312PFC E MOݥ:JDr :j .Yf΋cU1Ic L B?Ԙ8+C}2J橝?h(PQ)E+:bެ<)s(QMqtS*qvVU[TUy$$LIdPfEFq~vԾ~uپVnP@QT H”@B&2Tխw}w:{87'~EUݺw{N DrQ&VQP,%~'CHdTA4pRx#tihe\-ެ3 jĀQ/Qهp'5"bJT, e1xFg.I1aTC?ox%P@>C.85" *' Eq!j$9MRKXi!` $2?'V P(K곃ev\crNbb l&Ôz;ZүD$X0k`VYtmyy5LL~3v";Q c`:>iJm/ՐQPt! IcdYgayDMV}&Ֆio9R6X`L-CkQΨңx"0bcJIBָ+ؼbòV!9mȬKL]$8WȪƫĆt6l&-+Mq 1s훆"B(TsB1 ǓW?[p.jR#s-V44{GG 3//-PK9rRWBIӀ`;9*hPάҘ0@~4E]Q__i+  )/\(JSxk}?<H=`Kw4pvSh$Kt(ɍ-&^u&2 >7U|b옂!EP3[NJ)3sNyI\PRk|r2(rŝHFy@S Q{y$VId$́꯲IP.%!hwWxTeNn|^9w* $ٱ Rf2 `#.*A5Ү:erpV@M1X-Ǣ, -z _,(MU ZH>ቦdsTePB(k @9h*V-1V.H.S oEvQ|˼!XN#һL1/}P>-~7qFe5;D8~ A"(L%TTstP^ yG vקjfIoUoKgu,={2$\ V,?kWQR-םcJ-{x3OܕӜ(v? nzxqbh)cx }xQvAantf;ǿ=Ur? & i.TU}׏-w"*R6d! lBT:3eBʑ*BJox )(%BtF>m vΉٌOpoq|~;5ƴ@Dj3cكS{ JQ'&%MJH/UQT X NV0DvjJ;x% :AuFx\7i 4-eٕc xqf4G$qgȞ c5OqMB}̿OH\+N1BX`I} 19C Sǖ!F%~lU 1QmB(ǑW:dGr' XFI&_pOИCC\\'V6+3$={qxءcI3*۝d1z;Z0vُ\ uW,(VW$Dih/e߆ZP>>+&tuy2ViĴ=;Nyݥ8{T4es;&cќR/E*ka{:ۚܜR yE_O|j^KV*jFqVݬ|.Dhe{AsΨg8vWץ٘tǷ#Y5 sL-4G0jXMJQVxP$|mcUVQC$);|,럁FdE͘4eξ \Y"p_̼@` E*'*  E\,h)cE| tgШCL)q)ϚAJKkdR"n)=rFB9Rڑot52Lh>9LVc#Ǣa6ZK=ub5,Œ£>Z\}LdJB!DatɾsÏ|r&;'Z{-cw6}mrO/:J߾t2CK3SFp;YA1$>T5zhhÜem9Y TӿS*L,XRPс&oLUݥ S6w"UtãM}H3I^p9ZhCXriXT9ۂFUFo Əѐ!u q~4RK[B)£{IHəp1Xpt-d?UdV !'CT JH匿afڱ@Z5EHxz&؁eW^e$1ݒ :Lm=^z;\|dA/2te^Ɗɶ" #6P3Zٽ]ފe+y) ={hهJPAWF+l: N` j=MC4QuA%(I3aMU+*!Y&e)4C+i!`% ȋUE'1Z=4EPu; 05hH_(Y;S'?p0 U3 ;':)EeQ\%8.H0-7v.1JܛƂZ!ΕȜ,8R*]J𦜴&bzmY/HF(9hnE" )VDad1Q]}x!R XgP,Ĕ4%9]TU~O!kE/<ڙdɁ5IYhvUlLZhQe@x}yXgH,fg".|^¤:[Po0Ŏ:hDL KgCʊ3rǥ_I<H/-Bd?{gE4eI/-mFƑah4\}8'm|(P8,75%e;;vΝ͛[ꂘ/k<\IΗgp̳6 KH+ⱻ%HVwC|aĪ5B^;eRh&a`C(cS9LVbV%YB#I`yƊ\/cFE3!)x2ʦ'(!Er9ٰ8AWQz1~dw=/ޱ^UҼ{9D' N?ۀ~=^W|K{#GUtt$Re?wnW L0^QM omɳcXd&t=F`(ȪcD0:p/Z4%ec}XOpYS_3M Ub)%9THTd]KջP"Ǯ1qivevFh.Lf?ʶg o\?5߻'PS}z ͳPۇAӋ:6snDIK}ڇ]i -!)?|>. nkNϺ aU!"0?9|)緤ʬ8 %RƬ <,zSUMrL0J]) !ҴYV3ɠ89[vGzss=1½guK 7jx|͹LA.KOF9ł^gbi(_a`1KjU:³;_[H1 \] -A"D:F,0-$2߮HQGZ *i $:pH, gd!# (NE %۾(o.c9czs+A!A_Hd)q<z%Cd+cOl2maY^Gi靏z<RG?Glӥcjyz4qiAlǶNA+ ($o=8O8msU: ƿ.FAK5 )&>~q)"XNehIol1-6':YP DYgW"!Ls5dCQb0"h~D A"ؘB 'l*>|#/mg-zP07DI#N EbǠJȀ?dR45(f>_DvaL)|+[7hS}M L{1_o?p-f~S>|^ƙg#҄ľ[ьL$B 8M#1{#Hվ.W<=OOn]:vYS{) Fx<sGrXLZM5q֧a(o<:֘BqnΠ@H+R4EP 8ClEF ʈQRkCSDT:5swqD51\D1SIyd't)Y*a^cA*Xg6r>`/^9K5pqiMFϩQV"sbP6"c4Z`Ԝp`{Uu~UPV.WGƃ 5HLk$*Fk&(0xVD8;ZyHNr}X/}yFCX=pbee5LWrxa~UUMΠ8I ] Μ-8|7N^<#mh#6a2g!La2g7ǤMTBߔV/_#C D"؁]g$b2T?szx\s!n;:+X{2N޳"z c4_AOcj)ޟn\k0>+zr˳bߚA.fBx৐ZxJhH?tC&ONTB%6gbRȒ/PP!.eiI&w ah@nB|ESԚ t T}H@C4RqG +!~w4"' W\Ȼ2(1[hӨ CK ړ@*w؁)[HBa$Ί Ї2e-Ov1@| *IS@c9G6DZ!{u>V\fSk9[LrFd{樌@!"6ǥ_%497>Wxdp9}7HBƤiFߨ 0xLI.*t>I3S +V8kp0H~02Q !MHY\k UR!jw"3ӹ:Ѱƪu$HS6$#A&!?2+ΫLB'ҵˌ}{o@㔓0o>pz8 s]hԏ/>@sc;7(k{xyGz21IޠD04)1􇄢 ~;BխZXMu!UMUBY9WYJ28*u.P7O JZ9<ʞJfy ,҂n=L6h4߇4UM&׌(4äMg DI[CЛE컓'S@$aP4(% %47!j}QHI*ʪϔb*RRX q;R$[Q2!HùVūم$KTZIxkL^+40,.ƤɃ&M)*g.:a!L wBBB4AK2dR4:ð*@\%Kn|5g'@Es:nAC@d(IǯOd'1|ƿ֎֥zF쩮t*g?l|-9_,dg*W7mKAנ~bWao 3cTA#72xb=[>%=e7t:13Nm7.I҅4;fbrS饱Q5 B!PI79SjʅaedwgH=RsYGmΧA?YΠhR^İs"r g:а^"زTj (r |j*#\ۿ蓨&92)0OG^o;3gDevWɿw]ZsO$ep{U~/~';+ojՅ}ԍ10_XjH Y)|OiyfV$!%U[G qc|-O}9JQųђp>>p%B 9հHl2: k; 4-z\,A'gȮUrZKsCZBX4漶 d@iv\Mz-) XzYW=4BIM݃Z}Au)_D<,!zR sc/ў4qk!1Ec%l<E LtoRP\Bž 9~(}RMUuP3! i%P$L$&!Ur"uPh5iϞ3XR$ /mtyYb~c /.C*#^-PTpJGmR[ؠFAHډC*P)`U/y&,NdN1 YVj"M"pp|frm%4o#ctza\'g8#ͧ} ]gva1v ^w}᭿eA%!|cT#&< q$Ug4}i_0{b3FlgӿG6xd m{ ?J=XRWۍ- \]9^fUYh3/ʞgTmZzIeBjq1޼cüj̛ń0X!ڭP/y/UN hQ 5>;1E& -Vy% ywQʺF"!ҒPkDīFd1x__YV Ө"N_sҠz6 [,*BD+u=K/UU,] ,DW "'Tc-2""'m d%JKEEWj:sJi9]x2􊄆[5:auQ7K`/UI_H,c+>HX B# y}920g@ vDbBRk#+RPzA5{٭e,P:YUjW8VE4(7r:X\YG߂CZŌbJ+`h`"ڗЋF*{†hsOA{_= C%n.lR&eij R$jP.UpX^  2, j1x'^8?ѻa!6a `5?.DjbcSt}ŃH/dQx@xz\ō5蝒keh $*iAQP^+/ӑ8xsim>V'޵~N\hKձ,ܥ+pb8[7`A df]O>^fM0&&V1ܣ3iBtA=IYU XR9-3dVZ5Ro>)U'bI-QB IS6gA_0+900EMn*.CN='SE68ThLcV%,#HbFbA kBʴVVggIğODU!aP x-?bAR!dU bي{%*{HɼjNU q!BIW 6jkǾ@S#㎣#]S@;'d@\:0 VX ]vĊwZͭ-Ku=gFjR^XT vqX|H&(њ*}Bed i$^q Uq l8 W}@UΨVZBZ`8gT Y '#֪Gr`\+ۏ'v Jƨ*UTs4Le0+EP3H%r.(S= ٜx?DWatOg9DU8 "`b3p-a2rXoT 2wxGyX+QV<p/{s}5/<5/>ߚ<]f\o]q߂9{`+/M--PۗcWL} aJ|潧5ad+Ǿ֘Aw>)/ܺ}ׂ '!kV{3}}5e]'Q 7@I@L`ijqSb¨@!M*9WqχS$w&b*Z8  4s*[NO#ZctlcAv:ëc6f>kNM9*iV2ඨ[1Q D03:-DQ[VP3TbMR}|9]+Ez"n݋"3 ‚ x_xYk*,"7b!:i: pOX`0*a F,'yBVNq&er<zeCY̅MAd-x'EUTH lB s:Kɠt,0ϕp{WHl#EcW'&Sa|Sʉ]hi~ۓ9<}g"(qdRW\~Q\rn+ϹoO^tN['S -hj$teo;ܑ(}F|ϫ5>Lrɾō/Ĭ /HK Y nqatŹpo_Lֶ4Mvl' s[K$[ii2[2hzqw3{"h&ȶ3 dCu:WƘoB% 311Ş[Xc[}1(Մk"f}hGٟGk_B=mpG(WWCӂh_:k~їGlxGW/|è8_ڗz0sGqw$>De6./Br`Aw7`t_M#Dx\ NC2v}?ug?~_-;#)]{}D߇⽨^<^{~♪NFbI,yg2$ҋb.( *(a^xγ7?rLJEnLj*&/>?|]G?{1Vv4_7K_(>T?AuOg2mI4dA( ^rZUiAн".H!(Z*[ @Qb4FH$x̿MU%b{5PZϋ!\KA{72B =P#6td<3$YV(P@y7WV&2XGIO^-IqR"ӑ*IQOd_ \nK馛JT&B g%t,i 'X}wp,SןyܦШm k 3|/OgoX o ns`\Oo-.׼XҽW~?ښL".Ev'/HAywaL\ΥX3(s}?F#(FPK/ MӺ"Ӕ{>u߉Ϝǎ WW}"&^ ̓J܈Ʃ'﫻ٖler^9J$@$Gbxf,\}#G|^l}\wf W0s$tք.S?9/v4gY"}=+!H7[#8ˏ{ߛK{HUQb;YH <~dF'bOL2i2J0|= ˛8*}Z^d15U߽{??vb;&Lwg06ViwG(@e F%"`TY f P-i3p0TZ 1R|TEctWg$x,rPs âE,cWᧀDgt_sIշcJ݇"6j =Vd(^ Jl`z5$O@HW@M)FT#R1I-Q׌lO;Z}NR8"ٕM_O)-^]y`Ǧ)Cpdġ &Lc&ljt5K|+1T C{hi_.WC[&Jy)[|&S/(3&c|,8J|,F1f/]947^zI< f\GWh_$h׀y^⠥ %ex>'\@jS=iADr)3YhO"ȉ0Zso@ z0T]ܭCU@y}BAH.䏲uy౻0vR֓~¸~lZ@'+В3Oqo&m:'˿ {檊0[1$Y&]+Ѻv Vϝ%MAVsO'ދx~u5Fz!LV@x-)¤n8^qxg^v]`6Wx8u4IXnއ d15!,E%Z=r!{fQ f 4C $/ 7*;oNj!zs2cp<9>b*(!Dj'R'm.jڻ!L$H\{&#LOlj٣b@ eaMd ɇ693hӑ܊:W%Ӵ46W"YB6ͨ"ΐNc}ҟ)[L-o5Y<2ʡP{DŽMȍpt4(uGD"]E! {3uu/’$CI.͟)iy/=ͭ>o|#uʖJ7D'!2Àub5I&;C&J0wTl\u#L_^aN/`Š똘'?;n,iދzޚi_oErn;oMߗlckJVal;oTA& h NrM?w:3?ݤ%^Þ2~}yuyPW]pvRLzغ>^} =db &L}G6vylwY4w4'}xpYe'{ xaϊRnko?\ц vߊ-kqY֕Ћ?Yc'A33Wދ^/Jǣ塥BH5ÛĎo<)O`?r/g1sΌb_f`uC)KLԵDpVݎ}?PLYb1@nqlۖR Q/c5ɹےswvT*$=Sd1nlVkIωT)fhi@gNj Da4,I'#U,b4@#H9M-3)X^05RI(9|Y )5TdB/$B%_Ȉ(&@ Q9} k{=Vo!e:g锤cT[liY/K:)c؃YMyIdPM߲'v)}.X :xRD;WiДy$!^!^\+|y-R\Qs/=NXf+*7%//J@U ʀĥO2 Lsh=w)0//6=܄Y]>1م<Z*O~|~[zcG8e1 ݏ?oh$Ml~%}"> ?#i;oC1?\wa|PR:e-o4>mM[&Rlƌe8IzT0k8zU-_3 ,C3P?^ ÝTm&>>\dfDad4t@CRYUyLz)r޶ge٘-whEDUlNyߧ$ףx8y:_Af1Q^LzR4so>=x54H쳝QٖރvnB,._x|7';ls-=%vފօb/gEi6im+gF1vu]_P%"-|1C<.Bŧ~z q7sO5cte}McY^ܴ- {}#hk&k["}Vi )CПI^^;Up\Y.#%K &is\5DUa1ZV- X4gn_^7Q)i3]&B t*[4dIύl5Gbq"G~EiSiY}wt&*ɉjbUӨ Jz2U;X&d298]޳9!m'g>x<s֧ hss|vtq#Z't'p9Jˤ8ݭ >ip9uZ#?X-Ƽju ChЕc>2Lctx!Mhi"$U`6t[8J IA"ɒ}C׭]YzoB5\TJME. mŽ^ǖӿάoW}'#4^ a'/]4p;vvP1O?۾#OovŬO/}.9~2mkPH0=brr7bEW>t}ϔ/[zJPYpUB~K8DrSz{B-Ogd%%|D <+l[g<_%W>5)&łNad36Fg4X俵>ċ]E~LơS~}8&c~_T5/ tFwJF&(=ÇئIc'P 2"Sޟ$Ճ-I]CE:Șeb9KIPh%G@,H(T$$ N7@ZY%*̾P(* J>_HsD0gBjWY4LNDщƊabFeŒ5X?¨_ȓEO^P\)Τ%PY"\-)\I$Z,yh}>},l90Ov3X {V`.\LYv&f|H&hFp1pxt.Ɵ_݂Cуq;uX41c|UX~#Ё3fcZwV-ܳ? F#/ }.GKB|m?Go@^ rASH.}2$t3~fl9Kz&uo93Qj„jsxwv(YJ6RYEuJ*„ sL'Sbu9|ILPJ6mg/.^@v>(T&hɴ5(zFo~Vi;>5.6s"()ﰁ5V4wW}t9a(+pF. Lo?C@dBIbTIZ">ABcz-jy1*ASR`)%9!~ 5EY D 오T; Uff EIBS M=f=LƵ%g>d'T dxϙc/9es#RlnZ}o=n382).P3 phGtϏ9dڦളNԎ,74w&/'A<%Oyga ]?|ЅESO^&E@a,!R4M)]!Wkc1+k,̟<ּp]tLNՁή hooζo!l3vL @wGƇ)SKDP0T2we${_9'q,<5pgW7 #1wa{AYg>ZPf\<&bFoJmkK{b-UU 鋇+tr)Y>jc7s3&WY1fZ+WDZ+D(IaSJ& R|%~ʾ'vs&%?7Qm)*Nʈc~/FY{_܉:1)9w2XSjiҲ_DXMZit&¢nzsڴ3EJZY]>f.BӋI [g$Fr}sʏd< cjWIj#M3:!P2/s O2Hk,M'B>-Q ȖB&JWK'sˀ [x̒ 嫥H]x!YH{vck9T] 5%-a+p^z5iTާvUp tISu׉55,|[0{TLnA5<,oI85߿aݪKz~|ϏprpF|[7 7ͼˡtO^x1w Ub_Ma& ,WQx_cwDrd؟+m,Vg_pơdū$u' B1=kVVH,h'6z460v۟݅{ mt+9|N5f9}V|~;Hq:TU[;8#в2)Pӡ\,&6'i%hESҏDק4)@FՕH=XaCYz%3C|{}xGUQJ>n:YwgK{P&x]6dQĐ6\ `v'%"VY߃x{6ğu2T \`!EL~CDՌSҘj؄w9" HRKE?cĽdƔ5I$"oi4te_{2ER+=pv[["Y*J%-Ƨ>!g*WR!CXO辯4F]/"cF[.VjDPVk*y}x|4⥂⇶م_ڎ5'Ԥ q/I#b @~lNu(MG@W,t$LdeQeVjV-?4wK}> mh8 UD(Key?*"0\09a-9G)d&.,]'*wÿn`$OGIP}C~}ժ̏Xn5p⸎3\?_S*JUcqq!G7(ױj%#1<:^d!DH[U Q{r>(OέiƩju=]xsm=aM k]<46N4`'encTqgp%^5 m)} }03t a4"3 Y2HoJ.|~*y02՟Ԝ4x$w㌓MhSyyo(ޯ況3P W Sgb?W~NPX\rſG>t|ݸ^?.q{)qrLk~1눩 k,ycAi uTk+rdI9^Htv.B^AR H3bkX /('819F 0 J)Z8 VlW^(LaR+czC `8C$]:A} #C-&kZg;[R>bRfN85CgN0U%B"BҥVSqaYvyR$6 Rl^rxߢ_N' r%%e9{ƬtHVƁ' ށ#@]٘߾ GuelN/.ALt80K9 F?l%|}1v < j`;-~>/yܝMPu)I߅8'fPs;6,z#<\q1|EB^9$WwA'?o@YXOO{в4MÖ/%r/UyiŘ(C?w0fr}$f_ٟ^0Bɘ>_ۆNFw?YE jIJ)< }}P~Q'd11²PӓE92Z@Qcj98+70,I(X(3; M5 1ų%Fɐҟc* \&чU2 +'D !:av#pt bI υHQ;V"SkmL P8~|E:u_L>EG|؎ߙ&Bٍۻ}3igeh]P2YCvU~7etF20syQq0I.Vg6Qa^&8# ƃx>IoHB4 qx^|5pM0Kur4MmSй'k|P]ًXi Y,D=߶gs1-`kHZ^ m¤+n9tF4KHL1j. ǃLmAc6z,}vߏn^ {ׇ_TY}9>>Icx}}A?0ה~ttȬbM*PܯyxYm1>8\oh׍ɽ$>+܊] G_BZces t"0بZe[P+!!dL5`!GlATfYE` @6E2fގ)2+!ZHϰEֳNW1>.K9]^tqAGnϪIuUl9Y%KR^# s9碂1uuuVe XsHi&XtvQL(E"ܧ ;CeF>CKrHNQ2֡J3$YiJsYAgBt\ͱQEaJ҃*&aVʜcRws.)Vķ<}M'q ܎"ٻ8(mgx^\**aeTr|ōHm,$۟y)4t(},}~۱i'xC<[uS}ҍvߝIuI"NGԊ.B}{w`rM`,}__m; ͯ9X$EqQA]O^Y ^*0&Z9ibd܉ፇua9r.;CmR^ŽP*OOꊿOKj3ćϝD%7~t8m3dњS (*lע"˵3:KtyP~6TCv|aͨ:ʦbI-GE%HuͭT)q\"@ԬDeEƀ"+@JKgLNyZkZ[]"Pn}^/?j|dCP)}MWˑ1CvF!N/HT{j>xUh} əȆ}m"ՌPFy.M:'I$r a$ 0?? yc͛xfk9,#&cIDr:(QC{滷nsk~*V ߽ pM$d_TԆ&j7vTI`` TYJP_9L*8P)CB~69m6Ay:Oo3h*f݈g6\vm>[I203@Fd>w/ s. 1us2휛s;vp>9f)Tkڳ\i5k6낆fx4;U]y$oǎ~(a$SLJDy>'| [42$O<QFֵ{tq_`|VJMdz0X~~>xJ`_3|ki5Kb[iBs+!@ZjU5/Y p%!*h8_XKt9EnLEא\x$%9=9cJ2$G1[)sDz!D)%KqבW#2ne@饕d\fL~BM`~WvYP(٬Iu;[2ǫ[ 2AŚ{ndu3f%jJd69c!(Ozs3CZ|l@OЫ%]lOR6$^:]Jz^j>f sYKAdc8S9tc'R(.hBkg[sLa{`r#C`ޗ*PC4+&vXu goބ*N=n.j;3pᩋ[ #|qN "DAoN֑-TDP{f3qͻέwv-͠&݋ tN{ÓcݶړzH*wYZ-`xhKƫI $4/$@JT6۷H=|?i].fcUL|scT}0M" GT-պԌRb/|\ bpDN,:bF%;6r(!F>aH‹jw f}$$&z) T6=XH,L934G (rؐ]ԫzyŻ+i0NrEu>9yֈ\i*E%$hjW g$C\r);,cS4f&NxG$Ė4^DO 1Z|+d(hX P+ <tapF1|څY3==*E ^sʩ/=[H ԥ[(%S;Ysб~@c{1o^zL-~ĩwb@/:+х}@JX*ʒ{ wd} 8\ y^28O(FH i\bTF%[#ち%5v `Tj8Yp|Jp$޷C㘓H 2O +-dW'SHLb51)r)}of o S'ES ,jcWf G󢒴u8L$9QJcPx;dz8&Wq+&q'C/*IHye\r 3jͩU<}p]y5EJkpɋPT&ؘx /{fbݚ!to4vnǣw{Wc֮]>|'1s~ r Q𶍸׾'.]~1TӾDogbTv`t?۸ x{dTǷa {[|.2j>*=t{^x߸Q}ⲋce*ă? ZWUgаxXZa W ,mHC Fʛ/m TPEH+ 7:S{TPD&N˖k/>ȶ[6fV O u'^+`}sji%~X;_)~Qp}ſcZ=?#,^1²z:H橋pDyCKk5`'Zڊk9xnz">K~{Ѿ]]Â+p~ӍhzoD0ƃ"7ca;iRWI@[ebN15O}b>Pgf 7Ҥ4W7J ɎS5rJw0&£pNhQ+S8"z %p75w]^}Zx;i'jx0Fiu-ثƞhCQ66t ~m`YRhCEjD̘s(g2[z/hLN{1va*i8kuʹo Eܲs}l >wIzwz߄+qlƓ-۞*^8~#VTl†.8uzwݸN\x0Tn{7K_/5Yl?esglGlMꕮCM߮y?7f}֯Gn~r9WepN<<pkS_c] aT!O|1hif@(9;W9NiƄ螿_7cFOF|Ϩ׉QY8ʢ6MCcl{':N{HLjۢwvj03ѽu5T\׌uN1dW5]\?w@Mz7wo;Nb_Z  \"ahz"G:{ ꩙=h*E,Lurϖߛ6e'e sbs" PJVE:X/WTIVѲ"$9]\" (} 5uAdh`hܾ70HŠc mI9,y6`w~p$Y %k&HO%@Mլ'^r]=9LN}8С:o(G؋APk n%G9tt!CN0u)Z$Bc>w30{HqF Ql}vR;G21Տ:c"xsiU:kGQ48|K1gV_.li`-*#ϘrT *t׵~ɮ3؄^i#{}cփx|/S$~@mYȞF9WR`X޷Ukc+]4!+ԿQҥx=<*`{F2&`Y!UJU]}ؕgDJY}c1[OņmɐPIHP/D4z[h=(R|[P!+LRZA SoMbKI~&M$ilB "6LB M {w1T-pJzJo $ꓡ@ѿ%ܪATfl 0hB5v!qk9ʎg"$D^&) jAñpZ6 *FU=DV!ȭa`jbaPM%FTr6R!;糶*YS4 !lO_V S"H5&3{\ʌ m/ϓ`K=P{)1*`g-oœQt'pW#*38 3J-XE0Јh v'*kRt* ^/ L$3ES@x.)h5岼Fb9+&^jjeMPKQ tsjkسҹ&~擀57CQ73*{)jmu' (1).{.&4C*O}+g;@w%bQ%=J_(^SZ'$j]+k'Hk ^5k'im$K5)guj&vv# !e¼++w%ٻJ*is%թ=#8Z|={όt7=![ƾv)Nwyf^LaߋiSPkΏ}pgg9=Qݍ{j*4ڤQh#lk]6:62Ú8EǮ- }MhD'ZU\0UaB.Er3"pz/z|;XmIvCFGq0byk_9{]A w-.k Z݇Q[91k,ޢ[yl1K9{=ҍ{ zDwL6#و~m@ G+N04Q9'=;e+>B <݂ GPEYRt5[J/sC/biƀTŖ"+e :O$H&) r. B>RxtDD\n_6Z7@}=HQмLwO@dRt{mdCzo%Iu6lJ Z.L|SshTEk$ }4N/3C ~lUX ~QNf>P R3xa8s-ϴYb1[v`jII ]ԒN֪ ]^N}0^Yc#Lʜ gDuvhF5 {ɸv΍=|uŹ+zgϣrm*x㜪OxcE*1g&6X1Fخgi_Mp(zFDLbO2\z&J *yeRmPk}>8I*y>)>smb'ri#IӵD[U,5dҿ3s0 g}Ԍ/-KD,V1epaW>j %D֯1m6N ʖMJW6an J =/Kg||bT>Y.) K`_RuSă2GR:0BK7A5E4 {j yz-BRlX%nܜ< o[x\wfx3ۏ`UX~زg#68.[?N =2v Ծpہv=D\iC|׀_IcOɭgeΏk7?Ce+d^'qNpG̕o^5Xt[80z.fŧӇ=0)g-]KO_7_JFw?nx> ͟7-ܼ W"<=\IiZUFj(o@4  |e8lTLڼ+ Ԩ{dr:n+qjHu_)eozYr^ =0ci?~}!Ll{uq"1ڽ߻sGy>V]+ˋΫ->][a˳'܋/ùů|yWG?7"tn@f/Wr<E}II[.&Xer :F5b<o5l$RcXB$MB%r"pa6K%CCD2ga*I>Y'ϬJ931bG[4;X M&;zmGx.S֟I3'OJS /iJ6lL1=u\z$IGe!f<+AK0n"oK,"2#C~@Hhz(נhNA<XֈԑKP$wO; \噘3 g Mmjl˷n'[/\Tω"Wn|8jm4Zbj*-8jEwsކ#tp}bNm~q&k1p(wdsĉ'mH(a.;0KtN={~qSފ;~)FWQqL"Qb䨅0IYHШn=ul%L:qձ#2VA$Eߏ-4Xm?8s%_M7ނqɛ’]">}${+, ~lwϽؚܑ`3Iƞd = EjK bbJ aRp}.d8&.~^b1Omߞxfx"s4DIiYT-%qbK,ļ &ǦG2 Ӓq ozkt|%2Hj?}ѻ7-ŽGQ$LZ[Ok88(E_v&BA5SrF Sn 4vs/s1"nj2Q2|Ks{ObB#<ع{KM&&3 ؄rWX!B='=a1/T7Km-K6VDK 8g)HkQdY ŠGOcec韩3=e@sÚ&9K.ywr5e ֫6M&L&%}Z @^-v!VR գ˛|Hyec&/5{avԄ Ai:oOoa8I}uՠn{el=6W@A2O\Q] uE.91Tj$A~'Íc&tT5Oc3лߧӽ/2{9_;~Lx3_#)V|)a}̨;Ƨ8 cI5nl8U)WEM'ۣO_|\aEb|Wq>_|J0ff+v08V%Q=œjIp#jN=S % 1!:x^sTHy%456do$0$peHnR!JuH"LA\X9 d˒ĀQАh(و(E}ex)< O$QB-k[PBw'MM"M9Tl(2GznpF@Վ\`1J"uD!P_*DQ̺ kq4:M$Y u t$pHZ*M2dQ3c`Yᰨ$Āo#S ͋e2. Ay$pIVDC^qZe*LyUTx$Vk<}4Ci\sתYg9uIFc;CZ'nkGCg=_p-FuXɛphÏaƊ =4;x&vU0og0<}'&f|L 1T+*uV ,`%-ONN͍kwwӚbj)BΑU͚|\A@{E*isRÕiU, OaȬFko` +,=$V$;jVgiR͛/PW=gcϣO &LJP.1!IqrcKf9^fd!qno(w| RlԀ5gg7τnq BCgI7߰kjd$(" {&ʊi2%9@uRZI@ZJ}d+$2˙*\1A8{1*;kw݋/AߚS\Y?9Op ^`m`\%|"ƞo_]gL ?293uC&.1{F'[ƹdjT$5~Oc=Z2c.?e~u+pF|GVCP=i#C @Pe[3O,I\Ny}B K /.@ γ.CQ3+.B9H# *hI{Cđ'Rb͚P\n膰 KRɜH: XLL*bxDnLf2ߔSqVb闢ZPv 謐vAY1h䊻.ΰZB2'_(PRK`=Cl_ip>T/L:>X l'X?A{>|ˏɯqƲW݁wvzg]n|5# T\z4YKo`" #!KK@+@PABp8jѬwUVGIW9`~(/bmZ0|Sg{4')M) ='j=JmQ2/+*e4ɠ?~M!&d~,s-- DQlO"g0o| k9]!46_|pKr5ܾ>zgU96S*kV7KHC5zt2M>JhSKP K6xࡑ*@EP+ ÐV9U*`ن錆z꽢ȓ(eIG.hH-1!55Gig&7|QL=1NQS>657iT屮-5 ZROR <" vx~49ͺUT\vMW;o1J^-nĞ:WnAD$Ғʫ3#DDZԠP\z; S ej, ۳&l ecPIaWYLL&?Ey's_MT 7l O~؉mxoBO<0uⱟm.^[1.Rڔ[{Xʝ8*9)j6#LOXЅBK}Hv#MUhVImRa7LXȏI0 鐹8[9($G7OMBUXb/v|{ 1I~)(^~x$Sq Ug iRᩣbW5VØF:1'Raj/g/M)@Nd$(u{XjwL_`)6FΩfz2jDXE&[`CzݗJ={y#~rp6>ppB!mu{퉧䅽,n{`LF4_LY%.mJ'͙}7~?;8 *1{s+f K;嗽KfN`OFzq٥o#x=xd`2⿤ңQȑL8IsUXNpK&SdNĚ86,݆$$(E/^(ErZ^3!H|@%b&< b惏6>7%sC*Qu& p/Q̚YTs&yGCʨ Uz%-N8_Z8I}J9 sZ9M8*L%l"4 `&˔Vcҩ枔Kp4CmMU  1 JAk T4 #DyAl3T\\("&kpWSd/{j,oG4_!BSe妾ny~:AߏLU}а%8hK<R(˦qfk9NMQ7mLUʿ:+TXYEOݘ5=.~XS>_>uI3c+a{lY8MHBX*g>r*-}@qcy`=c3iheUfkV:10k&;G1C?͜f\w}MQ GCRgBRU_DL78߻L Y.x 菺j& IWv!HDb=“m\^ J8zINHzi`6T[%]3b8nhY]cP]ིd\Yj[Jͨ)zRS[b8]bH&E,S!YHU(6з<Q 7 )c8P"hJ:eȍђdĤ6C ~M%@ML }f|z.@ D@a^4 "Zn`=X8Ml' |(h''Skxl#S5pVx?^*52$mf1ZZV$#NfRYśۓ=6_mٔ$u_=9'M&P.! `TPx(Z4cR_N+Wmm-%̝l9OnT4[ϸq)ULfeCdkt1O&)}v)M2rI 䩧'\a՚ t4P {wD 7Xֶ"SK(r|+um+~4uUZvQn57zkhf ʽ97+@ N H77נ3US "2e-qq_LOflt~uA8'"&t\$K$'5jCi%f "AMYC+ΘZ&Iں?3"v. !) $U칶aU&Y F>ZRĠAuIL=dcE=I6™%AkOϜKnyXTiiCҸIha%dMRO86RD:2HJ1GB <sAneMFh|uM'٧Do;aA\c/^fnu(v=(nm#vm>p8ixL9-xy'b/W1IHj?kf cߑ~,Y4Pd ;7oݏ:Nl̨tYň`./HEv|/3ɝ{AHELke5C9gF$Tu %4yO3D\%KN98A|{{f~<ƃ|2 D|ŌU(-H-1P/h4KӜ͹9AP[JZ)HX\d Rn4zTAjMJlfk4JC\ a^Wz18^E6T=^Y٪ǗY3/MfrءǕ}!` (}Oj$i_@[<.uta"0=L` eY큂cӚ0-ILId\_/%9EkTS$1oבWW FBW0Y5$8 ;אT th8j=XrnڀCoIw?.l:dž]8\âkumcƺZ"8Huk)wN*)ݹ|5vcpLXT$ 8{'u`֢3ם٘Sr>U8&G'116*Mbʥ,s?}306 - x#$S.Ug7Zæ@U g_)[5k5t m;[KS+#?ĒO|xrOK~N,Bᄬm+Y\9W,/6ua) vūHܻz`J\|5nv5&}+A@G&DВ,SVS㫵i/@*P O9u]P;^=Jzy(ߛfeFAR~4*EfI18hw,R+ܔR0=hP?m/R2( 1$s$8z:pJM,aw, O۳{̾.M#aYn1m3l4q*)q ^ ZL|gu0ҦpboV\ tiX2ݭLSJe$ܐ=g7ĪJ_<43ԟosf:HIp:2jfgۿOco|K1o#{R=zp+0ܸ F uj~Lqɹ+ո謚o'c[7uv*>=pU߾ f=܌"o: v?is"1}/q; Bk*t* &bt7rKc(^0voO'fZ>˶Ѥϋ{(M쓩XU]UtLt/X .wM5cFOgO=3_F!LLDzN))p(7pZJH,sP}O)pyRjyc;aV1w=O}&7pݵ+NɧBT`~3Uz/~lJ}"a{y$o4-wEzB 4KcKU/S : 5͆H8 sP?RrϨQ}LpDJ0gLDҠf^Gf2ZJ4\/v-$Q4QԌ瀜q}AwMsj'&I)׈xAF "&=\!Κ骵 (M*C˽rzecƪ#4@"[Am?Mk5c_a0 |=zC¨ge&>9"?5 rfo2l'__T?ɗasp=ΚZͦޅkUGi}朁wE:Pq߷c fN{5X/IH_maEC(޼HcƗ24FbnvL^$HG(Ƒ3f(ON.)R7R Kw%4ji0HCZd)MQ[f2>ƺ1f B5JX\BmI"R[yfЌ1/M'P '#dh)oon)(+&J™dEJ@Zia;y\7VJޛ␴fVQbRi{9zuXai ɕ|QJ#hObTy2 Vs wGO,Ub`Yϯ(ly0m_̵!y{7x#8+0-o(~BGo&o `rLe> "k'& KwϾK'[mLȏPDeg_|ބ{$hb(h@EFZcXF"QԤ"dU"FY"y@5IG|r,ijk.^lN!"=RYX%@gMNeՏ3! d^1'5"}qQK S|wB0QuiE$՜G|$S%Ɍ-hHZ,TI?:e[*D 4E24>!MRVgArS@{M(犉 3ԤJ$=@!"mC$6<ӆ~Qu =-ǚymkr\qa0PLѮԏP?e/&߰S_ܴRj 6D fclFߏ T_nsPc}:B%ְ6}ugw#GD9T/z}0\` (9k(zyՉ1TG'Q Z?qT}]ӯ;?eYL9ѷwPƞ~5n;@s/[W|(&@]cCg:գ 9xZ9q`]s.ZG@+8zWl̯Iz"q7AUt/Rcj 4Q:EֈdSqAE‘Jfԍ&)q]'s^tE'"%]s`hh@5#,p&3& ;`x)AD= }f$M{^:_hDpI3<\Yd5hAF@zbO{{I^g SQ:xݥA̓CP3x!|9Ձf=`m'AM"e!6D/B?{pnvO wt #HfmTbKf6̲uWYIe]J |G0g8k N>s~t `[i- g僇'>1\8{}#/~7tFZuݘ3 ZY9((vm9VeZHbS3uK|tt/{͛xoJ. ;gZׇAl~~fxUǟ~ZZ=3N,3h޷c0pkq$c&*Gkܗ9n;1wYPtYqA1 V}׎n({w,-?Jҡas?vnh{̾Mƽ[^iT:kU'堉R sN։'h$ĬLjnuN(ĦnjL ZκR^ǀ֓ݹ`Y}C:cmFNc/=ԏ8*Fl^$BY$ac/-Iн{: H5اO{wcS1yPg1Ϋ^~OPTvu[>ל6^r-~?].~JZt&Q'e:+ I&R{cO#TVRնKI2 b<8W F8O-. cj(5%[TI88pV X@%3' 7O(1vsa%PX]L`+QC-ӈb*aD + {pۇmQBbA)dUelU,67=V̿5.幩(mعX0^zzo hmO?G.ZKqĆW9E2q`F;XqL7뙘p-.X0|=cZMMA5+Z<> {G*Ӳ5cX{vΛ~I{pf-Z'gPFIjN&ܵ)W+ˆȰAԢ >F +![r4ZyIp&;L.w$Gh̊|kϳ:>=n0Su|HON<̦! Ɣ~G{rWj \jvӫ#an]K|,<zKL?l&æ}y^ҋ)1ekA4$F`ժB4zlHJk3A:_[7V%HLzY_&z1ɵ3S jѠYuhLol!2JB7SzY([slOeYj5x-w3ZoDfęs:Q0.DOb ;.BiAʕ\D V AyICADcR ](p^'IWFBtřg,1er'CfXU$c*GaJ{ 9Th!=M2piHl߿{Z]|A]sWكg'L_>*[s:~̳ÓDo&n53ۏ`Ʒ1f,_2_ڃZ wc[u4*ǡ'7밢 u7>#e#ʼnzOIFn5Dxp,^iEvQ/61Cf:Z%E 4&&ag#yDLѠ`r{ ZkGI,ea+Au cRx5E\>uFٖуN2ɫ+ 7D⪂^yR#5Ø=#(al$W!#tfV64%AR'"4\|0İ:\+gu$A[3zJKHL~L~5Yy5L)O&D:8 HA\n;K iV~)gTː?ߜ Ni)V7ЭV@HOykSm{~6Dg2 q&'i~gU\Faa Dt6Fi,!{%cs׋ꑍߺ%o=X3sROn& >S~“pɒ܉w3B9jޓ, T&@٬TZ57Is6CT5#՝0$ErV c}:dc~2R&B$0HDooZ1d%PcNP~ ~Qɕvf9/@$~Qa2SPG 1B2˶Ecjs{bB]sØ5sJڍVa^DF\~zׇNGG߮=?9lW׵qpЮ ,%v:EvB_5gT_X/IXD <a|tKBT)Ѕ-Wi9p/$uk 9V`-0+[SbC.7bs>֒˜_B\?i JR 2fD]H>WH xTo̕C?jϡ'w $ReqII,Ls[0-D;oWT*…Kw4i|I'OpXb|WȵXگK9HZQ \rr $6Ѩ.WY VΩ1$)/ẸX6Fog(_MV1T8' Ȫf 0КU^UY,K9d8Ą`UrmHMRHTH"{WUjB%aV%^4Pɭ(LFGnsz|cxl ԓG0kZhT-.HQoP0ʒ%g 7g jB2is` _,Z-iU"z3|$$ʭpY,CZG7 w!i -b~6qO}EeIwi\oBhJKSC!G&(sK fj QKG2Bڵ&^J3K*Wj-U٠ \GG4AT__SLt5OURQV&=r(,2BINh{DVD):Jʶ}ZI`eP%uN1x{97'g׿ +{Gpo}o{ |m:O>c=,$[2˸ ]O30neG9ŒrC>>A/Ƴws&>J[<$J:-bf%R{zCɟ}.KN4մ6V"k*NMM2Ol?} ՁG[EAFQE6>mc#ˌ,Vx!ix4a?*dA"h?)do.U\}BBUA!aYKqT4 G0oOiQ+ E93jrWί%oL.er@נ}q=tz峐@8մV_>^oM}X!$ k)WabL VO9%$&⚣YJa;n{ѱx3J~RRS`>\0KD9gH#&C%M/H g(fL<0k&zz*UEMʫsj3{&qS{[ES>D6!7 ,B;hH.MX^k8! Jս"='gr/Jj\u]Okw>+hu tU*U{EG[lT۔&3O9~˘J"I ڞq'm%#BS+Xӣ pyGNQJoPZ- qf1i'? e⛛jkcޛ n  $IT||L eLH-؜ z9ǢNd q~'fmdD`PKz͞a0M♨Ԫv6 fZczaǥg9”]MW նZ٧k 1{f|zCJB@{yRA;hlU=3 vmW ^ޮJdMbKS(Tr5 5'=}h[M.v =i"knS ]!ةȂ 2Bc=qcT)!)~H57HSK{V"jqx\$"RPohA0*~҉D\EI =!IPTuk{2YEP@Cd}^\L='4c`aN2g(E*XphWJ* XGIr]彿33jVmɖmܻ ƀMBIh!Hx/@ {7˖&ҮvZm;3s޹w=;q0{=/=#T*QĪ.¦e ( wq5`QkIv=J\qrA9)kU/Æͫ#$16:d(9w=ڑ(ͭTc ;ED.rh.x0k梡e(KKq66ȴ@IR\qQVV9XVAL 4cӹӋDϤ%2;glB}.f\WEl!}7sn#/oGB_?} •FϠ߷"ՒF.tGGI$n^f̶g2#ʠY EWe*sd+j??s"ꟿPSdFF37+j@(S< +Z|4fY d+H1Y۩.;#u] /t4hf$VY?nf?5֚sS@ȞHR'> #M wY"Df,RVGKH *3ƽ,ȑpR:2Fصy"Ӭ4bl6d`@3γLT¥gk,Pr#Aw9 GuuVM\w)^HVcacC΂0 Q4ABdXL:X = (`= Cx``.V'fSDk3Ag7ըz#2&GD[}{{zԠ|l?O2VըS ṟޅgb}$%ݑ F_?kT㔹 0-ĜJfOۋXPڄUI<959ڛaxE}qƹbDSOR/sT\q5XX7m]2M"DkO# WF,0~ߦk/] 9<dF㩧J'1n#S i0 9/ 'B k GoE!{ nY t"ʰhⅴ'X Tg@19JEC H GBԵ_'oTT DUV+B{ Кl}~FǙmͯZٌI:A!\freqRV*LN'b9b,#vHw#_]K10LEiT0ؿd)، C H p B %SaҘD 0ԡe"\XHi?H|#fXD0fWrsK/}sX$ r0U+ qgO :K  ͚Jәt#أD Mi9j]O Kuόwh=g#y`Љ&pkR i3Mj)iM(S_Z"!pab(3o/pO!Js܂͞D*F6AvŠr2G kdQs]vݸ@"̈yǝ<0A\ifW@khT=(}s B at8S?AOjl"،3cȄZp:)fY_H j']U&?,3D=s+RZ414BݘKz"t42MVr&A"a"ج5ܲ 5%hP^exXwK!/}|IYֆ8ffg0Kh"kF&>_vp! jZ/-My E1-lڜ2Kʲd2y*cƑ1Z|棤`;RtscN J&ɦd6j#}d*/%JI ?il.*N9"ebAXQv="eʡNΎ!v>}[QspՖ8bGwY԰?k[Ey#~y+*N}?BjQm =:O*/+gK9~ p&5Db a.8 KvR"2GV]~,\b dYT-']VfFy7,@## =;-JPFs&%&<"ņæh`h ǜ3N. ϑ#Xd"0(֓!(%T3=rFntfژHjHo܃[CeA5mZ~{;PDKν-]"%k7÷tCTR<̭?ȯVm &qًjukQU-I$"޳=sVhj3Nx;éPPh#"cӟJ ߨ Nz2EI Q @-A2`"K܄݀oO[zmYVn˗":*4)|r& >:hο;o/UpnQ6N;AԵ*)SDJk~UrQub]#GPڎ!$JOX& b=G.P`rLBc6m~U%"vc;4 |e063HC(Tvq~1rP4+[kGPv*Z0Xˈ. V6!M:_̜Ա~d2psd8X0D$IT7Mj t^2C=h Y4ȩ#J2YLM8d$)ܰũĎEbAC؂\J0 ˹!V Ι psѢ`;ԁ`6\Z|F !e \PطaBg ^)a-(̢hb'P c!'Y'H (>cKRLU<=uxBuw&7 J|RT;*\Zӈd śףoo\ćHy-J a-zWj֖8nTÒ(pLfB4.YD|-7 ~ЪKʆ*,YYߞPIֵa܍7jQC~PaMֈ=xM{~UŐL܌&B6݄d +DHN.WwȯѶo"v0پۑJCgK!܏#?7g7)GȿeHNUfED<W`oQ0? s0N9uߖTI]" ?XY !Œ`߆ QWX fj%I؆Ζy:*J\`5@w/ءFĨ)jQG_8D[%ԍxA f Zbp\4f)r" m!,HMٕ& N'ա0nzr)RRG2H aYa 6yIkja s ?ںrX z:xn*'ݺ&`S pD<)tv_RFC:u?I ӮYL`8ҦUd&S_ELJDqi^=g.`,SDk-" 2pNFz,)Õz!AUB4z=GFo祗~kj&ѹM[S'&.յ̩E,}(EÜyhc7ၾ \(l-`ps?:c3 3w )gAu +$.jFćϥѓ^w;d1j砾27OT =!INTgcd*<߂D)IV֑:B9/z R0=jĶ)sRp݂jQ{-<Bmy(hڀءwJO'/Y<$')w7v1VTyP]nw[SOkwp-ƶ'4yMpgm,AͥaG1ݹ3][ K$ۉEeDb($g \~.3߆o>u Na;jyiFAȧ4(F lݡ6TؤV+΀%Pa249Gq,I&.BIP`HJ>_ yb c+ۤ9]9z i-GdbD6-gnh>vXO.OP! >k'(TQ\o$R 0ˊXqڨcL;al 2ZZ 2@r0D"BK̬4);h3EX2/#(F(FX̴3 5"S ҜwL0~ᓼ$+0 !5'\e41qOEmI3WHL Gߟ[\~!VέĢenbwYdj8 '`Z=ۑػ6֣ ؁̯ELI Bb>ro_]RyKYJGSBLͷc9(EG]ژv$×TLA+U eH;!j8$jN6Dҭuf3 7LYz.,tGeY&4}j9/m]$fX' iUPİ҂fl}쐶?E R9.f=(H9iENǀ:VA ]&15TVF^u%ԁj6@iª $C%lNzdC  Q0u@3,U;t1(`̛߬ס329:cC8$ ƲH&"(%+kqpAa(P财4 7 e'i}g&ˢ ^l2ŷwb=HҒiX5845hscd|%\тHgv=xzYT?%z/E*Vf-\8J ׍6q E!%ϫJ!-b5h˭ 2J[g%gfM;.N2m>I""Q;8r$m+cE;aM)myWoebVڎ!#0 N(ɢ&NTh4YNAZI`}3>EFPsnz`ZgdI~O`G%%>CN]&ZZntL{iEmZfQ^˱ Y! Y+3-J'Zgɑ08)e=(sb`ߒhk`)+M)1"C!D 4*vX- @'Za{~=ֻsY!Ո5FP `Q1 a01Ibǥ#e0cs$f9c(I40 3kS kdmF;Mx5\{&%:yrbήrP萓WWX1KLw^%{0I$e= [7!&_mШ?GՅHZPMݴ ?C^h{=MuIu¹KЬ5 kWkz!.(LǨ{PPB=eg.3;N҆9Nqik áPوOͰ Q`>\=':c[TYOa9لM_Ld'B^igX/,\ fVS\8f4W-Cb:GX[Bda OAte}U˂r9L'I df0̽҂A PڂZڃn jZ{E 3h>Ck LΚ. 7i7[ӂ4[5j.HiI97A-WJiU |2 }!d5tmc5|x,7!KO=gbK}X- B9z,rCH s!47{-^HzKlIS'A LA'=%h,EaQǰ?] `YPLUO=Ew0`m8X [5W%>4" yr!;,6k>mBb5$B3Qn%?HbF3G^E+ULU_ket\N˨rP⚠C/[̱"sлf3LjQ{)RX/kY/6ӌN1. ؑT 4 ּ :/aNal 4J|P.`T''c湑%-0q N $+Pq{\6!ouR.KI:tA9ZXwr9qQVج(ufi JtMHgV azGaf@8VsZM'qT)Mφ7G&֌EfHuli@l%)8Kc0T2\͢7v]NJ2d4na.-!X~oOyC= k9}ei,],T\j[81WL. #-,kxxE9/ofI>uI&KCxVΐNg>D_ d?~Ħm \Eǐeg X32(h$PUprյ 9Չ>Ͷ`,Gtnr:1#Ѷ ; lbjkQSg6U"o'6I6!fɥ[#X^vz7f b! ]?Parz@:eu*J+`#:_~hJ)\zMZp Ivl&炳I!\`] I`2n:rڟX,BѰr^ jX STHN{ {~sR: 4Wp(#xe94BiʚO:9QCڀ̼pߝmh`2?[OHA5 +>O29^g2@.&G8Ca 7Q Er ڷ"0Uݛkޕu=`V< m~G\h%Y~lB{ZR% 6 &}v$=g)8K G4k'0 tUǦC.h Uΰ=n0Ƞ:(o8#F5WUݸ>\E;C9ws@Iؑf'LΦM4@2aHW昧:!ilkPYuJL4~s' 1(^odYL1B9u>8kk粟9Fyu:GsD=1I@`[9W Zvqi@d؛<^oٕw9Ǟל>AĞmл^t  .cAѨ%@.!muXłd-:¤ eTa$V ”q IH"YdWړ$iW z@! Gp!@Y* bT:8tl-#Cl1A\8#}8QH}6o˶;LQfNFBw1hlC'bS]ecALNfd5)]!{"! =rH(4̺'IvBAc(bҢf "sTaQhKu;B{!0 u(80u|D߅`7nL~U }"!x`3ZtcXt^24 z-"n5PUk\Yd_JB鸖ұdIiDLpP2G*oMJqoY=QZH pO(Z3W%yaLuvb nhC>thXOSRXX5xJDckဢm~":8g * Hgǫ!& #XC4 /c WtqM,Rۊ+,@eA3[oW꘨w8{;ͮ1KږaQwaW,hJI/ܢix fW {Rqz~L-F.mAzϭb&0YPq9q6gg7L0IGpGb9 (gu)Q56p&79 ZNL9*t_ǮL$ƺ@ٍL1$ܛ:>%+?D:2LݠYFxK2%\-&7ZF\Y0n4,m#)%gko;N+HJagƃκz!rld EC 83QWgsvZ[~qY'H*9mQ2Ҫ u[6rH;$G(a2u,k,H` &Mfھ ) ۂ+{#Gf$H.Ɔ֨ ڃ!-p1",KVT^>&O^իQyM3oNXb,[;cdtr} ! &̌`Ř(MZ(MX璹 6-YRSvJs2TBdfW< ! fzDD.,,|MPfYҶ h %A0a%ͨ>GI6k:)m`9O% hyZ@Ps^G   &12NmYl|.΁ ̵>R'mc|n{D<"ʢQ`{wnfNyf Xu((@/;8p9!bU(`&BY0\y5kT&eVlnó„AL{e\~SWOakT؄$:\y LL9" ۉ~v`]}^7%Q_ݻ[o|)>p:O~/cZCx:$\Z:7qb3=َ •޷p֮cZh>WwoD)E~?oZUcoG 5%y&k3:_П.9IZөGBi$:KP6n,pDjY] 4B"%q8o†ft`;aوt^M\x0T! SF!Tt)K') *F3ܜ;#AZQ&}|ZzKY rX<"i3$+t:]w`k脋Z{ ZӍe|҈sg.d(&Ⓝ#%0THdճ_&#9eH&Ha\9'fiA,sDae}T{'sL6`Ҁ KI İ!'l{i{&+Ji˶`;8*'LV-a/&Pg QkRDS2$? QϾ!&BGvN2z1lX\ء b1Н5/3iB4xܽyPNJaY#(Ghca5>*;*\ir8v #Se+kקʪ"UaZL arV Z1]԰mVjRknfj6JiJ&kfԎ2υ=L?pU)J['oFkYfhH1SYQOCǙ7w ]l)Lг.ҭD̴U-#d䊍%26h=J݊kޡQoAoA2i,7K5 a m2.p`+2GDg@"^ݣhͪ/ƙĒ_u/-~ y{ Z5,Ϧ~7') /:O K~],’#/7Z|5__kS%8YJ#JZ0`_"՞o\K$;JH5FUؤ(ꃲBeLF_?M,kM u6-kҢlZR -$TZ1/,s_;XmR3u@021k`æд0)A>cuV]phI`:ٓFm^/( ^ӁeE}YرNDI73 YsZk +IݝQfmhI1/:-C`޳0^A1!> H=O9$hC2w;#ңVtמ~ځ#5%%HL5Xn6Lj',%@Ž*9$foDm?1r6 7S\ R^={R ɕf0m+@:WUpQ$f1! CZffRYYo9iD*31P`p(C[egod XRm6&\{~|L|GvHٕ>҆oj2EN9BY.%xEN?p=ujD,c eZ$O҂HEcs5icL7v*WDYb$ko †H3e(to/fK-$))*TZ5L\$z8`ͺL*6Aqy-Vlstb}}/P\Q..YF0 )iTIذGK1{Ia٫=&0*C"MY̦c4RЀͧ-ǒ9&MւJUE E--nBZu+r$ >!+z'" a,.ɋ 6!Ts$c7s,uΟ\q` MәϘuU2w#:2r1 %CϞ^Bp>bG|,:5Q e';Ѣc/xpM7=h֎ 3OlmgA&?9閸X8ϛ3Pc{n4͋ozaV8st.tl;L yT A2z-A2 d Hdue>3a _' al@K;%a\ƛrh2B+&,H][ش w+. A?nGe .Z[dH0 We=E"sfwi5w(I  ڗd0M ɊZ~ aeIwϻ;3D.x9)@y?tG19oNTgGcR 5kzzSzNQ';~ø8386'kt<QE(8mpuX\U*RRVmq`|ڋ, HȜֹcxHmY%VV%+qQ<w <Q*pzc.,ۉGGCd括"_ . 7aq((ҕlVaTWPlDV}l= ֵ #F40.3֑ P *5R0 91ҬtXG\BwJN俟>z(= t=iFz}k(liI;C>xvk(hÙALx蠽9.*,MC[ڵ g-@ğrv _BK8h)X [+u:rlH1bųwLMunQoTsDJ%>oKr>ZOP:M.+FH-t$&?!Tt~ 睋Y9QJ_{¥I7BgƶwCNᣟFڶT#1noKU~/Թ;X.Eٚfw7EN25{C{vw1] gЎ;H@} Z5HcH-7ajtSm^7?,˴ϥT4z=e(__3};T:T\%ʲ Bp.hLwإæY:KCxՈ!i1]x60KӲz?)Y8ѺSaW"ֶ3Z=p\$.f% oҌwSm7&`H5^(3[j,y brq0lkipS({w gKpJ >1@&z8q٫PJeO=g/+^"\WuVګ(>H{LcU~R(H)hxkъ:j,~Ibw4yh*KяDc1;Cb/?9΍ߟ܊_Zu`" s|tO!=;^(,<1su\Š\D.n,K\/9 NeJW/Ǚ+aü2 ל>|_߉C1bڦ#i$X㾵t'lB`hVr#`$\HCd`pD3%Ԩ _}u [/0db3Zc(#(PUx-<sc(1*, {ҳnESrp@bB J4sJ"+|GhW3Pϧ3qx,-N̪M㦕 2e ~+-GuI! QUQ9"۟҂LH#ZEΘyC^e9V.Ds҇ ym#@b21e!y6t"1iCpCX|D5D2,OxA v{UU:_|v}z̨3^3E~mì񆯢|+C~CrbX@^r~q WʇGA8;i5Fs)!V+n@y L>Ȭy񆯠6l T6ruF6/XO|׬@_o ?6dVtFA4R=!F2Bxh@A<TMO25u&2X Z)5ଌ0KafyF@ΐhSbPYGH&H=iyae$mJo^GU@'HR2IncfJ0I ̄P  9 s|!sM{^K5 ^<ӊꕇ>xulH(êPۓفx ?.7wf'Kr0bkQ/DPNSv`B5%%VS?6JtLf*>B:xԫ2G91x&[qB.lEՕ@ٱ,@ᝀ-Ody>%uzy;&Sâ)J=ŠxLS[16ܨMaGw%]iG}->Bf>j< wK|,h+C"P4^94w8|8dlC !q,KAgE޴^ul(`ISSٝ8u 9wץӠ˔Q$ށ/#bO4NBy5hf%N=/{ߕ}Fj >c7}3?(=ܴp-V-; ɩિyDk.C1}0s/q% P]9_g7^PErN 0B(6z~.6u/.7a%drPب A?w_I?QW8WzM.Ďx_87Q03_Ѯ?C}3J,u-"u!~|6B%Z9>Ǻ6cw/A#yd{K.Uo{3__~{D6թ?`j_*2nKeL}͹rjsb,4=# >j6Y[wv A[m \iԧ ktF_;!k\4_.@˘ⴖоQ'$8Yι8A] pTW }L0(A;ʕ8Wud~7PsL9!aR6:];c*zzP*\qNj(#hOFɰZاq]/WK1rDgѵ5wt133Ʉ9i ^7;||$5y@4 ~g$NC0ackNU(ы+֝D{/^R/(>ca,.9;lhşx?ޏ Y6V>ȲU:C ƍ'ct_92mm/UN^v6Qt(8 :/9 KҏȞtX-R {Bc//n:)T;FJ./.AqYds[I w~}&[K$wXsZҖA İcpR #&BQg'q$-tEr X#RhiCO:m(9y },Nb O}[7-wfG;FLc@#Wbc[~ZkZ^}?/ S%ڴSҙecb,sߓ 6'Rm3SK7h?8]S@|v 4+iK $,Qyn֧0$j*8.() =$O_n`LJi&$Oq(BÜ{,l$DBt9a:J8 ҩf Ng' x_#w3 \ꙍ0aP_ώTOflwų)n,w?D&ݍbJ,ZQiuX`"F>T_sU}m:^m{p=oLSR,ް.uq&\h/ g%\T(ءgs\]jLª5 2F݇soӝCP[=g!7mA όAg?%B7_cд [M/`V9 ۏNXr@Sl> /R(^IM[=Ӊn| sPC( b }.Éi0 * fG}y[8oNʾi:E 3SpHsglmWA#@)N285`b:B' &*/hj/ZS"R+:YUmĤwfmHqÙߝ /T~2.bQbGRB5{$pD 1^H9$1>c{悹(^t;vtV6>R]z<ַ̞͆.޿'e!\*9Q̫i2FtƺeAI'Ji^gizy x8:s> >CIck`?ˮ+S 本d|+QU~9)n 'Cbuo'1{E|WoZp)>) 2K9uRkzCYc&&8RCؒn:1 j paQad[dvl+`G콊cd3YLf\RT lڿ+e8 >+Ej үBg A2~ 鈷P(T2R+;3Ë6ke80"B`Xv f p ~zZ$lmNϝFdEB)s[j!H1;کp3:!Ŏ4^HS4IDN$ѐ\h )z_JK(,Z}"8{C/)FAM%K&<a$wP9C'he|n- nWw!:<Nȿoې:x:틨 L?=S/1y2b'TSQzMp!j//>W!*8Zdsw}cE~Lzbgʠ=?k>#ZSn$B UCƏ#P 9~k>|oU"ڸA觡p|VThor&ULCqSans5E谘Q߿j"=w+[hSPv\S֒H%*6S$i?K??׾Aݥxi fR5z}m^؀1w^QJ(`2ekOi=~+Q~r0NR9~v/;Clj˙ȯSmف~4}XL"~?z?;cN(D$>,1Zt5J|M#?x%;:3qMзI_siPks2aݬa'_cV>utfo&f,6g}K :i3anQrYaYpP &̺(͋P BQ!@Z. M`pAP!Ԅ NPqI۫s4)lԌABA,i=5(5Z*Aafȱl!OrLݗ$lp% ݂F{n(adfcI C>_k~\R!pZlY9yϽڿ}D=}N_cK/μm98:c N;R(p@̅C#\LgTq֤}7ƪ%La=OLJ7fQ17vqPa;bSRkh0 B݄y&Dc(:oO<ì-vX<! XeA|`'܎+ >3̡|DNk 9(78CK0}JQX9cwD_6~&XC&ynM(^Ď9YgK8F kWVf#R[Ѱdc罱ǹu`+ >lC>EbtDե̹> [0k1Y,1Q`;$gŌ!Bmp6JH;ClO9S3 ,q7*r%MŞmf/4m{ JD':h<csD/S:i> ̤#,o#{}K3 rH^q호yy>R.޻&9!l+>k!_(iTE,(SA}!E&x֙IhdIi]^d d@Z2)siabEtGHrõ0( $tݯ Vd,j@nJ3k],~6IA$0o/п4sY߄n3#sCJ´zen< b=>DAQ@e&LzϹ?Gt{ήkoF(ߩm[Cea{BTݵ{=~;YfTj^V!s8Ke\InQJ 8Cr0̼ZʈPAw ejȆ؅1E _bK@[tE;EC8D=RȈ"8_: V8F7y'l32M: 'k(z k«Cd5TLRjt I4 SU|v AعD,c4}BT% SgQNJ9F~6Ɇsz\ 9r߄ɽBܬxLXifq!,WVM5HħPpm㨩D,ڄgqVwbՑ14{Xyh8~PRuaI\z>}Jkwo4vhsC58>TmTBGkB<#UTW'x1$G+ޫGzXD Usvpp#n{l:;09<=@{1 G Fc}UNu<<:pE!QQ1^La1mE+8?q8XJ2  "`>*S^{n. "<}d2~OP/57Ob5"y#<?1 yI@jRG̈S(9jLР9Í~llQKqk//o^R;7,B)ܐu>s9`c'287 ce!g=QAz[: ,[uս@% d E8ߊT!D̄(Шkl>F09C5zǂvJjguXH'eoTRZ_MΪg7';h<UhtkLcafs,쨓T:ωr|A;B2:f'hѐڄfWcsp{P CWdR٬ia ﭲCۯKgRN>: G9ٝ,׈*!Q& KmL>S3TE^;_Clh:Nf!F걈 %Ie bE+CJa &1[ؔDJNwb|ycd`΀Sg޿!ReP;lOeQs}a1 aͅ\-ލO986ĜFsؿYMFLkNƑs!['D?^|<'̱ˑxQ˄eCo=6ɍ͜ ?o{찢*I5V?Eߎ<$tjfU9g8qa7" q)]2!<5 litk"hUࠍO֔E7̤v4a\'BL$q+YpDy鍐:AfƤAgG6&<Qt" Kp$ᅷY1BP*Kf5UAmNP`Pf0Ow pTCt1S}"h=L)|l[yUXXmYzHP^,p+5! ӅG|&{LWm׍=;Dpt4]-mN+Ps ȂdS'uąLRyj0a,ZSwq::8€ '3zPkaYOF"Dϴ\NF:LǼ -[3%AKD7HhŮHNx3VUR%܎qeřjįP+p.0ar #.:5>wKneǜ54CM֠ fUaaŽ3E痉 "EqBUbi|UIy]:PZ ; ND[FW":<ވٳ w :Wb_vd",.캨 %q|%*h[15a@I{BL76|bt64!q;^>%"7f^~ցxvrChO_pįi|/1B5"7x?&7n[Wy%ɮjm/<,,YHaʛ(>D}o0'i1]YJczCNF3z"k ﮘ oD$-*^Xc"^?bfaӘdEs~5).yͥ׌aT 刖oî/ZOt.g/a4"ٹSkN3.s zkDg/GlhzTsVC,9A:<W@xyTg|KIu0;Kymݺô3砐N>7 #uqba;31fc.LV@MkD)m:oatH#XBO!k=Z893-j^1r/2v>([n'Ѷ(;c]!9Qs?@^) fT8Jato 2iB?QfA@L1*G!}pϽ; nqp̐dna>JC~{6[9G`mN<ڧJjn]\شfԌ Ɇ6Ƿ4 \C/{wo2``7x"?s?-+:,nG #K !r-è4[o4TCm= zeD칸謥(olO]\pc}x{E:q]O7- fyy`pK0=L<~NFsH)/xE\kd3^}VDUt Ja5ˤH199t'&[W>B0%KY0bhy[dpr. ?>AG/Ez B9,)ܹi"9\ _&{͈0`cVqHF[54X!E/ J$as>A(Zz[oʦFbp_tEpϽ=Cq;+0(w-5q͔fޛ|rPxaū,{_ %#7$*C>uns/\,rt)ZL 8tׯ:''фqLaEm=[>X sCO+4FBw1>Ⱦ)Qpۮ$&`;tP.tFYw ȅ"V%ç+ $;OƜZ+2LqMÈV|6Ll r1עS'6Y'cuǃ%ާ . Ō`{w v>hg4YNÏcqKGɋ^vXTsB8clR"B,s~%;0/ߦS(!?5_wpq*,d0)ʹ8N۹E9_2F@;~h7)10F5m$QZչ+q{2e\7=g>ܹ1!.@˙scbđ9[3=Qu(B!FPXc$KOŒ'v V"nˊ.>kWLVw?x4Ѳ20iԷz_݌t߰Fb䳽pտMzP,{ h TM)Vq\35/U! (,4ӝPEpG=]B f0]n.M:? B/{0qN1ʟHC(/ڳQ<߽ ǝ$Ts˜.^|w]* 6d∷k.k8pc'[>Px:% ',n}Z~*?ɥg۲ 5ˆYVtխƴ.lZ9>}Ƨ/?wZ,wdTS{ė*痡]g+}7CV'>c\(\zmc;x}nc,~֠j9Xa^yVBO9(b'-G!!jRMYQECU娯<ft,U9lsCHʑhn@w\12(kvÂO).fbaVvZLaXO E@lQ1ŊQ`=c Äs41d^(FP1g5=ӻS:#C#2b2y]&YuYԹf;z% ȏ9'Xk O@VsHl:9HIo.~3D+rPE?wTd f"Ԉ{1LlF{5G.QFݪYNL|~frw_UԈ5 1VoZr N}zAJko zjn)3k039ieZQ59^BA17S>+1MO<ݻ3t̩#7u1jWuqMv8#2KȶFyEؤ%MdM2t#h\ok5)ƘgFijlabߊhi tlJ;kahiV%Oh@?#g2UNnJRLB6:X!\oF^!Jt:+X"hUB⑹}Xi00 +>lc+iHyB{v⁍V !'~'k蘕0zMYr_v5XP`T G)LH~D#W:\$)H2)CR"mvB$Y0ӬP2Y1Z5l܀|MCɣkp;8^AOVzG}?^H!O)Ԝψb5O4`s/y߭Gѧmr!wkdBy}s8\S9>8ʚ藑Y,ƞ #yWh=6݁:m7Z3b~%cp0ݯ>$;P1a]O|\g}nJo7>dϨxk_("c?N<]$ Zь'Wu=?FF6=8x3>"QFzm0mvb/BEGؿ۱nW.O8c-tȫaz]@Q2Hf߇^͕ևmW_MITt r-*VA܋mP ])ƴUяm~qw7ͺ:D%wc=8cT_?e gOv~)̓q7NOh 6sYCOaþS{& M6@oh|Ta$VrnX[=!0aVTۢ[v-!ö~S/Jaҫ'>pC>`|mGrL~|K~a_Fa|'R{v4 q?Ye1t'9:Y΅C#.\U>~mxsW, ˂ߨF{~\k#ޅޠOMIƸ9PbwV9NH{rrJg`ׯ8t]o~ASUzK28ZgG]=,b]s`:dxH]L" }z+vJF6AƷŴnG#f ʬ`S|Hhm|;^ڏ%KQ lCQǷq.V4M{nm^۠LZS c;1> U ɳ*?܄_kPNLF'hXavD-0wm#SdF{ؖCA%u.a15B+80MTYTY͘:VΦQFy&}vBaTwq>y]B#1 {fq) 0!hƿC)_0e4"`͘vBrà . &V c(M /=? *$z-],7+KDN8V-6(G~ k { Ը)*rd{on'WQQ^e<]nr~sEvtNH iBvWakGH8eq8ƃəM sڊ&d7`j[G{FqHW*xgD[PFBOgte0$Y˘@Ղqrh$;C) !wFg|VyZ˯pw_Cf :̸J&]yͬrq'1bF0P5WOq Sm~OɵꮃgvIc(“ueb<1^"ײNAJ_OpOD^]b("IFNB i ЊgfQ9:wQɄKglQY,S&` q4 PkpީjlőkZ N cG'zt.<-66#9{ =*X5qU ʊYp<TQ^KC5S FhIYd Dc!H Mw-gG6E)l֋cnȺ1&tn[Bg3U`ҸG YLaDCgDL0iWUZ߃whM694ꔌf/s@`NӘs~W_IԵ)C5s [veCY`?eF E"R S0rўp$8ZqeA!(n!'. a<-۬%HE\%o,2<| 8zpl-W&Q271⥢|gaĜ*5:|9hlP;'ÅVIGPDXpl0D(QQunfF_}99+dd-b<s.rQu0¨/R9?;H3E:X8[.RѦzI$UO{Qq'`܂O&hjTO1sͨ*4t~N<$q\aTDRˎ jz |/.u0gsS$x>*ޑ+=xc8`,?oj6S6a|S[cv=ÜkfTǑewigu&񒰲`OT6;;\27XG1ǾI3WGS%{Pzubn cjMB㧅`az>7`vH&/3y*5 3 KBXg؅dwuf<G7~N$~['ntNǴS7G {0m5J&ۨ _}_yo 5Q{ KXB,2A=u(wu~ݻ60:-%wKiNdflNW*2H ARk=LEmìiĘXcMQEZN=`3ېhύ7BX7QrVhZl\ok xkxMs,ÑsQn?w  s;;r08 ˼gtCR^8J.qI3-s'X]N٦ΐ⿋Dk'%`N/;JvMu ~"9v=ʖ R}V7F<5:!M±AlON eUdaXKclJK|D\({rցP*p-Oġu.-rEMH u񁠐Zw6aldfk9H0F^0$(H!5,)9-ƙ!c?蟽J1-v S*8;d̸XiF6bn%~ \)Ol{'&wх3U}JSÃSFQPu: c;,b޺0 ;vIZl5E悬e4Y;0Mc?4*) {BĪ'[r 5Q1w^hwͷh|MXSbS {aۅu Z1ȝc/mm_: } nF8ή  kn2 <(uҫ TgO8\kPw'?H~7*h9s SI[\= U1v .iWӊ3|]`yk0!~e]iɻ3>LO:7 Qw#-+ӷ|F^9Ѵܐ;>e3=|*C>zB73;ik5[־Ī:TԬe#>= b U7LzܽQ iGm3}|̬?$"پ\:0EidR@F*\aiAH=d >DTyY~԰hܣDcWbWU:z18n|hfɻ>ayc K~2#Z^TzDžⴧj\K&ӿӄ@:@!j31d_ IlНv}JR9hڢ4h9sg|)ƲK1\2O1Ȍh5pj̕K_JݝSg|XSU6 6?5Z, RY!6kv~p:>s d9wύ%sOP}h?ZOfM d玜 9NmR*0py2NEl ={ߌ ~Cz-Z6lK)AQA"Fjk^[i_LϿQC{_*1l+gJ܄pEΉ^1d2>jUO3 D <"*1D4㇓\F$=ؓzu~"pV} Xa!,FV:_ #(k]߁AT. at$H:Xr"ilZv`2Iq;xt}s&m[#{lj?A? &^{Q@Ӡ81zPztgoITYnjCmϠj1->՜{~L8sVѾ3Ω/ϊ؋"3PsNVj_C51« GP|l{!5e+EZ"mv~n s <'Ta']Q3d6U,=uG ْ6O#[<>g8;{1+Y֥3 []YTX ŜMÉ6v7#Cw\X4n$!R_z6T,m@c @74Amh!9!TVL@/QFmoDPh b#˃D☱Q. 09ſйېbcoڜbن.Eˮ Q4"O{ðF83 *qa<4 _W|1ZćC|{ױn SgꎻD3a&'؋%MtnW&wF5+.s/Fgd۲pm%Hԁg6c6:z0?8DQZ(:h3ʵp)Ai(8ճkhɵ]s9>97em넲vWAи0ޖϗyX'{ӷ{_F8kN v X㐜{tW@YoGłQy3hOus[S=C=sP(䆶yEb!C£!+*}=JS+mYh(j #r9jWFuBZ#g&#ٝ?a{#8  kO?+ĸVhN{ʙA⼗7zpgGs>.ɊYK{G9ڌ6׮X*ze}֣0ާ>*Q9/0Ƃ1mZ(!mڭ(Р4o7! w ڎ䑒[qN3?{?Xyuh8~^^1 X换\GuNP>Z^-V c%bT0`Ź('Za1YޙV{66/xr-=Qdoƾ+Ɏ#r)b65vjϷToJ]b؈]ݯ9%=Iwų|d{XG{4%a'?ξ"EcpSV)=b\XXv`DFu_ǢJȑWxԽ8ў5✩5\8G=.BjR#UQvgBh J7nbQ|.2T^F-:]ȉbM,Bբ;j;=w؛s<:~wJ"sblEy܃1sZg"6 s9! )#:#OTmS^ǔ͟5c V|*"Ei&,ʹb b*kzXJgfQ$+ T=kodhV1NH(U?d`:ɽE,H?T0p3*G@!k~B"vy:VTPv$찘@̅;fh=#Ƃz#<<P|/18 ڈqy2[(vy`^*B3a'nA${p|CLHYaR[]2GT5TŲGq<*{eG'fHWݷlju[NJ0g,! syUߍR񇱊@l~BKkm;?rRNJ˻mc;&F#RDE5QbPLj)}lFKD6ϘΫru~tWéN&%)V:S*1j9w6A(Ȉ1t隉hIֶ+ebm}gz9}Mٙq=C^3;ew|Q`kuŒNSj^ DDUE;!mX[o$C[309eۯ_$ϓri2ֱ}Q(ӯϩJ$76;T|nb5IY]2avq_%΋U s/9EXwg>_Лy,t֕MvB̗N8SI3 9:bջIC7/ 6*3p]67S) %~7WЅ.-N.&":/=SYX9%6mfHnΚ-ݢ? 1n|!#2ǹO|G0;ݯEdaD0-! B=]+5IF^"au(=K1YZ kfcnF]kuɾlBjxv׊ӻn1RVLGLL52 +|s`a黡JSfߣdR2y@|A#&.{͊ףzoCeyyک]VN7l7!c"1҆rN\3eYe/'wjPs`EZEc2Y?-aK9P BIڄ῏rj AirDr%Su/LB5ƅۇq$u鰴7v>] &*m${1~~Nn}Ѕ?g7x̢ظզeA!aB"꒎L{g(攴Nç*HoDJP{ztև46N?uIOv!q^S(elyJaX絤Wvm~[!EIxNz#sP*/ n J75,(E(7WQm ܒdz(05]f@噣_smS՛-A#TmO="w`ʃUC$ކ>_h e@UvPg<20 ?9ZzZ(`:P]=v[F c_QbUP?MG~, ZLф<~Zov] ;830 kU&p7 cBq0I6&dxV,@ͪSݿOefߡDdgp܊CaQ2s4C'L~0{S fl]v97ט`4ܤC?wߥ@ ?Ppw띪4mU 7r_w8(t!P0 {}HuqCwCypb uRtKiqMrPi5@hf`3|R(M88qNȵ NAbcUh<=0&D(E؂'fϱcvt$7NYc0%OkFc--O1y'pB&,yy1{%}$ښI }p;{S2Sl.ԆH2LϐQ,It J4 M}8J}1Ӱߪa* q7 OR&QSSDY5 t_N/VϩQq-VqGae}ifPR*Ɛ 1?E5lÅF1Kؒ\ߴ\:RLv! "xw CNhCgV,Xc2fOkFØN KfrqpJ+ ȸL(店NNsaI"Ǽax'Q/ Grq8]/aʜxq0]o5=" .0M%TxXD$ IW]uPjZ-iwDpp9gֽbֱa(qX'\:$C0spVP JN$N!1{asQF)@N_92< rg9¡?xU7NBXH!l^#jvԊRZmeȌf~BFvMMa7<<:iTAY,}g"048s"C\! ׂ*ptΌ2sU }ŏxi \z kZbzߟѵ '^]qϋC-‰[0*V^FS d'D!M)!EDԃAEn݃SQ7΀p8C;$UϏwp0fCf8R0^0Viq;Ȭ(@L88Jfi`NԨfhg`Z#olX <|V_B%}z+P؅11pNm.E4r٬1sYy^ +}7\=Ue9 ?)Kq>gU"8 5<+gk79dγr@8 ) +͹^T֚`BŽiCw`L&7uLg,Tddjˑ (a j$C3Adx᥾lj徦7jmseu["s`EN4>̼D|[ԄlᴫQ6]O.sVY5YLac""0 T*{u^=16<}0Mźe`sC=iޙ?ych}L-!քΫ>y_fڈ>Xs.auk.iTf° *x *qN fJAK e)l:jXw70;e4+R1c 4j/UT> LQOsv{Ny͵!*^3FbC$k'dBFˬ{EZW 2t@8#cLH<:6~Qe 28E@)熚S:E$iaf0s5f-"_tG_2{, Lµk62éSaS0 4"È(3)cY#c;e C9ތ G>þғ皕\,.M7xG7PGG9^C 9X>NmEi<WUqe;h{Ydy<{YSy ;qt3~`eV"r|wŚ#x_n9XԴxw8Սe˰? ZO}hT4wb16㕱-٭[ r0ݳ5*0) y*Lnޑ誙y: Lo[0d4ܵ_= fNU VÌ *\ۆ0 pBy zjQiΫhj:H#ϫoF\ּP] 󺂖9D-k\jY,9wd7dzoā ]e+t :k\PxXDIsጽ|]׌Hyxٝ:F!j 25N97QDc 1^iV!Mc3BR 4f1(<^ހw1LMaB τ#79mt$ bHp(}jhf9>Ueu#`"➻tF#VɄjee]XBNe.)a+>QA~fT7u`.1N'mq N҇Ύ(լ('Ps,H~O !"*Z[EM<ٔ ncL %]Y tLnqEQjws]lsnDeRLar&ޝh>杻mE`-?ik.v _>7]y(+W}uo9rEz}8puQh9Zwx%k 6B]pN岣?,VL 8tׯ= JoԖ?FT-Z&_GAݦtoA@B ?>w$ćﷲ:1c= ЉfL2%U 8b Rhsor|4ѤèCj3J⚓kb֣x oĬ~rcuHȨT}zLa;}h8~bBńsIV6EteCׄΫ?X $56m݁хn g1|{Kur6Y=߻'"0`z:\TđqAEShQ9> A^SB_Pus3EdGϮC+8!dK9?ʸhhO3YX-yn#%f~MRaZ G7"b3pX'ښ5Nj :yѯ;j#(*u-/?om"*oʢBBtC7j1oBT:Ƀxu0l;va=iE&I‍IA6KNBz-DYLv<2كO0Wp,Ra&jT c]=L0 Xp#S fDʚ2 qhhjL;bkkpk ǢKV5'܎ڕij]w7υhw UBe1*FM4xn܍ƔWKYwڨKՋ0&~0f?ǐ}շ#)}WInMj~cuk}Uhu(wE]Ƙ S3ayfHr築aaaW>"Z·]CH||hXs0սWs&sVcֵ-g}R\Хk !r^'MZ1>5}=,aAo-^)橀!3(1C˓!ᳶG4@@ <Ӡm=#`rFC JXw\ާ+(dwh׈sF$,R{eYXM-n8E=Ckh b&DL* 2ߑ, EG48J3S#fxao6UƉ 7ZϠ֜F1Z*@!h'n싁< eFJԄ}d( (8EB&i|3fw LMV@spxc5O 6_пJtȪ @0ձUq77y)saUuvÛp~꘎|w/e+`5^S 05&JUd/d2iЕcQCZܫy.VaQ6Ys8Gq@\Q*ȊgmsqtY/cVK[aQl4ȣNr[T8a"Eab0g^O|բ57d,/S\3MYu{3S̶\8gH팡IC(7p/K^Q})ng@# "{6(1CDqg5/;skf\A$d0#O~=- y?Y]A$"\D?"?/aE m>jOEXnj㨲 g!|齈E0~aT<9JVJC~loNY~ӏA咻1cp|G?kn?{&U_U瞎3=A3PDBd b!&xƻfwmcF@ZD43FSOOP)ƚ[u9/.'9/\s7p!vosa\OŠ}{pNC](ކDZ__\sCa.9%## O)1܋y}OpBЊdWQyOMp+AC+7gKsu[LxvGYlhqJYb7kP+:,̉IP6=LMYZj}qExo')-Žv̆1ÒJL7v@@f;y.e4IgŌigҙ i7 @ @;3 bq*cZS}lO{^48Cvvd4G$}9;nJ_o&n^A64ep|x, g,@Q,ቌz<ʶĀKԒzn@1{ AcYAh5 )ϩ94XR7F+:PX ,8 Tw2*.Kfg?9[] t3 \JnY4_<>s!}* l~U=do5ŋƇMیx8u~cymg}|k;f͌0/'LkK8\>jCQ5\DܒE=֩ncz5C npahf4 2D 7@6|$xA?K يv|IVsg@{;m:\ډ_7`PvGrz;M}mA886~;ɰhy&ZnHv5I-#)qk}S!2pBg-K?@8+6IT_| ~nQyFQ7%v3dqulzRtq&7kȈ2=LWBwe| 7Qfj\=z;/YWKڂKгt*kعl+F.]4cm+:\gil?sܝ_x}ٽX?|N6ϐڣ &`;tlz/15 t /Cs՘Put6q;]ogXs}͞)P2;^sDڃP4k׏\B $L~]D#Bژw' ^i N8bj0fMi 7낽T;}2|66"QLl0zqXG6)Xx@M&\%;"LC?A[~^n]:s]5,6@Rd%h]1ڃ&mSLٰch=a~v Yr]u3xv!F$f z1-xdm=UGHG1}5Em.\*SQ8أqY`P[pxuS.Ν `7qQ qAt:] :(o9(b+f,}?`kSR/ lЗ:#h6&MWCLT3@kjSL_EYdg9h<-{ ˫MM\)Q ijj?dE"%jo) C,{צ/Ag1](C|NBw {[7$tE-!""O«3e[6bףq9>}j'U۬j]avM jV  ˵ڋN^Up:U{%=쮭?\7GUK{c=+^ymxoC^epc tkfl'sރ=,t̬fZ5RP"=ܳUaT&fcLw'T .,3Q.焗c٘C;{s+8Ϣ(8Cm][ox+r̚ہ&t4Z?{n#  wJpVNyUp1Mn [C)aQlJ{64_]?6'J8tu-m̍y.ŒkLo4;js~YKcC~nbMWMH`+~q"SeL5Pe[/DcFgJiZ6cA?j7\_ӟÁU;39cӂcW)Ȯ9z'k^ǩ]SjjnQ4}h3/ z3NZ'?օK^r|pnlZq)YP5cnOf831-|MDsSԼDu:čFY[\q&4l%16g 4GTH {yDlo=k i+.hspH-\$YXV˜$R@kӚR[N׶D\N q5r"jzRΞ88,%d"Mos_*Fmm~qmǜޣ ƽ这NEcՍ}lyId##M ] %0 >w˦o>+ M bj;hv@4G](*:~ 琨.~-uh̕'tIly(pV!i e eÅ򞝋/By(5j.==?Ҧެo:- ½a9dL 0L=#n*Lmc5aYi=6:&ϴu0wbjkqd.̯)mZ3+χOa͟܌ mġ'9{zNL<͠p5:Fkam;}EgU=O=;/c;oڞ\8e^.?f:r{Έ5Fp.2JG4Zpmz ^I5# -:mjsKhAQ+a楝~<߾Q?V H/9f|KU2|{*Ծ{_rzƎ^qs'i Gލ`{.yp9IŝQڀU14hG'")X!u; lN8u˚RbtvXD, >d_I++*1h-Z {rε8H0vh*(2H$`<GwR(@Тu?!tK%tU@U.4IL}?#uJkЈCl8]0uFGȥa6<3'NJ#꧁:zBqˣ[p`tKSF5k~X֗k\Pwttr -&Re$g$u>*Nϓɇ:>nyNMQzr DԘMހ]#kF;kMCW)Kcsy&YXf[CpX;C(UiƯ3PN'[xL؋uYOmƬJ6d}؏i]TcH)s6V/8Bb*8}-&sdM"6S͘2goDcQBǍy+9_"Eb'h禑igYfX>. s@sPdjJRXJhܻrVE~2cN;B y~&IޑP V9a<'3ڨ&83bѶѠKbq 6q mT'r9FL;ٵ+(vᱟD@C%U>h).DAD打P 1dMLN[Slqgfrİ Pcpjzn 3\ &%H+ 1L37\ ̞`cNo𤲬vTtS ܤfW;Aqpe͟fr l b|͌|'L;gnw*p8ď cQ5)WB>)Cglg@M4wx(b=-ibnyl4S!6DȮ{dvPbf`׳qU'l4R隣'YVS+Zes?Ӑ,j*8N֕:6p4IJ$NЙ4N ꘒ?Q e eh; szpz,n(➟ ęA a\x783o8z$QS?[__7b]Vtڃ/k ')Ӧj'Ȍ#qm.J)dgQڨL(lNxh:9v#*.I@Ķ GwR5Qk-pgvw+sP۳lƇfba+c-M A9Q[ѳIep@V%&S0H$Y;1s&!d`VbNOX knL9Ma SohIAMd]CWe?F{^L9: OügL70J9 `DŽcrfW\ڥmb-2FjcWKP"IE:TKm- %m㕨}J2V5NzAem>9H/(q+C"J\"8FX!Jo8Ci?;kMINi㦦MSjUƐL!`z +w4%,+fNg--"m34#ʞ d"ٯdc!?2H;=/ Dq`߉"R/ 'HdRA-`[6=LÞZۋ4mI,Z56j,9`߉t:{^.klKgS)N*n![x5 Zgiڃ"c8vR̆摤αQOH50VÀoVTcu]q _ebA:JQ+ w ,#B?مe/+>v1{ F3vaW`z\;TP[ 6SarFdBrP ]@v1gL $ `yJWcPO#r b\Gk;9q2Ʈ[P>У$v Sq_b.Ĝbclmn5̍չmWBnoD e.W\YxSByuhߋu{AEGIaeZq ?Ů6LObϾjv&5h9u{-BEdu4.(Caa[CA2;*\FqvBd~yҊ:l֭#!ZCg A8 U Xrgk8{(zmHu~^Ik 3Ae[-d8d:pzl| he}`EuȌDh (\O<&a_v$GYك[Z`g/˿f6전B|?|"J$PHfbXH>576vV"qtnT=q-7j9bocXۣ6$$E}#ynBχ| GkPv "zr*5Ա̽hAͬ=_U8j3{ r6J >V;(;w ZLmB0%:\[*=a 4REqx]"$tߩCU_ȝAP^ìU$flv~=|#v~I @zܱ4#PhG=#.Emtd&uP_Ub3QiݣmD{+sTŞ%,ڴ'_o=q ]߻}x W;+Pp XH5S5$YRvv MqcU%~$*c4ML@-ͻ สd3LΚRNdQo}ZZQs[ 3 >FosfQLΜсCEPꀑ .XF5>@+YV9hzgaF48:g@FH1ғ"EnUr 9sa #o {8ucڟODpYx^:2-"|97S  II&L+e])21N㒽 &"{hd$u+g8QR5kc\G):0iUyB4BD "i8x* &a҂[!T`Wb_[SR}~LQ9][0"ÖQٽ&? ?d2i \Mz Q~仯@sB&W+SY1rFb۾x9^݋ +\#E34,lhj_s--!3}:f䘖=17,!olwhRzQtVCZj,K\%"d4@{% #uc kekl i#OΣ߮:Ca+ݿ>|g|vr"Zzl><v~w=VƫTqqv{>F.=V7pkh7ضJ[ۆhF'?!+,ad2C!s§uGɡЬ| w<#|ȆQTYC8zdGw&AS|{ƻ.rlFFH/TN^C8IA~ưԹ^BIG Z]췢DebjU|l#24Nq0[mcg &Pd ,F6ПڹS@٘sյMkhd-3QFejqLON6 nй*8۞ȡi_yW^jܫipWv0J@{ý4)$M1bd$݆_&>C#Y9)\gdFv##LnY٧cdËkL+a֯| E:A߱^c3_a|ffFa}73ӍD=!IeAaѐq_ u5$2:9gqY|zl|'FIljkA8 ܳ 𕉮>?˚mڅF&A9/c ?,ŘbA~Ħ/ٌg{kl8@MMB~ { "w[eZ3ĆD%:Э'#NmO=;6gm֬w5yh/;Vcy{CRsߛk,A9D0ӣ+q=% musx DzثF2~D@)̽N s<}))A ԺdU/f1 cI0\^C\r"A펈:jiB" \ f S[l#!CЁv)I=>b ŞͦjJ 6 0pƑXɿCiG{*[w%hq+u:Y19`r'YRePX려u7a USdѓ&YG'ޫaR%ZI"+nVM;9PyfJec>#HѬ묱( 苘53bdHWF+!zLHwbIFtn(gюMؒ\xi"kL8-p}`rte"Jf=\ƫpBBۆT꿣/@wCx짫!O/>AKz!+cW:Q<1B/ F.)"k0 [[ 2p$(1Ljѧ% بuB,nz~}N p0YJ,|!NkH)Aݬ(FG7W!xK@a`f9-<Y"+*Rm_|Ή&clNfpX'y`ӣ*O+{OL{&BqI~ c-m~ؐר?,=CȸĆ~"f!)z_121<=ai*B(uÊ~j8aGϡ12,Do7Z<e7 Bק= emȰYF 2 }9! ! u\Ie^hM S$ gca P)ȕvU=#Ќ$,̡dTD6 5GzŒv愦8wq#6hP;G4mv) ^k*u8[S^%I56`P~_ ږgfINHB6Rk^0Xp?߉_)UKE6>agchya>Ĕ Nndzƈ5.l8(;EV3~$~,ORB)68bjNHt'C,uO)M,ˍp60-2z{cNeX|n cϙGΨfl$CS@Bdβ6{zlk{ǜ sgcX\(1.e½K,%j}/g_^޹-OfQ 4"Y/Yϙ{^cw,8٪g̚ Ϥ/`MѮ LԵ:Ԙ8[wxIb&Cѥǰ[K#ظoS0oy5G1|>QvFP[og2X; n!弶s}ZlI5pSs MT5Ħd FڢOGϑb "_ K: |a 5պ0HSbP^0#M D޻D~H QO*jf57`a!'ʪՏ/{(镏wOV߻Ѩ8"bxɁ8fqU;YQ2%Qnm3ȉ*Bb-*ZZ@|+iGPfm+9PU)SšNV%AN"rd`G4 { ]B f])h׏#~1\y&6s;m_ĖuBaÿFIoC8TjdP"K.T&Eb~K.-x%#? x"йLtta-g]0I~kQb(}{ CS214kz03}6,<?j1] B0p-,d ?N}ۮA0wк]=4r?z.œwTǰTC 5+G u4i 7 X7HșXsbOv",~>=6P>Ky}'ڝ_fdks IwK[ Ar_Ղq MK lak8!8& 1!gL;%*g@ .Ɲ| 6˶=ivMMaz bd#Y8 ~494W+Z7wEBnjB#o,3`i;Ď;Go>RJ\3u 9/U[wDWVUQ"\8Ȫ"N:gժGqǏ£ u( f u& E겎AF7 JcԣiCUnAi l D92 &:"+pzS:&(L+Rƺ8YNFoqFTJ$ Dw.Ǿ!#fۊ#ױqGk.==?Ҧ -@!%8lE݀]OrI:Sg-qd8Slt QaXDmO4Ŝaџ}48E?lgN0{y&&H{&`%9kFBa[Gt.?*8Z=׋O=;o.oZ-é`ωzhQ&}rHXK~q6 sqޥ t>aYNK^> ?#jJɽ22t^ uDb7v sRG2C  F'篷SWBJ$[,iz k+.}W?Id $~*Gה+ϕ_~5ȉΐNǔ{^4 #Z^a֝0iByBe qt'[\6tE0J"`tn8;gT[ _Iq3c˞bǐC5+5:Mk MJ֝!0ƶɚf8>%>נv' S,<3*m'Qf15#'54Ry{L75eֵI]3,M:C+<Lf ?s?a!XLK.K<Xʙݐ}1cbXOBqc a1Pxxz݌jD:|mwD%evޜ`$7 2rݒsjlUk?O9I9JŰi&I. $ QTƱ\G';̰,jZ-H!wS-FRCi$=32t\%iKx`Ru V1JD,)9 y=5W<lj`ei>M/Pk"k-hZ^mg~t[HOxynxth'Of`89s…g](>aߩbJʌ#(*/ZgKITB6RaAPr4OI_ k:DzΈyQ ]1Uψi45" ٣=VSPz~Lٞ\%Nϊ!D>5qʢ[2V~X9fT8Qh!z濕=]mOWTQKy6p\W%3r r2ds0O`Z&!6XsYkɣ4vH{ Nb}uLk|jQ›&~^ x1:66PuőeCٞDi*)LY嗜wFgL:*'t9%G GG^p~gC6bd$h>-oz% Nၯ~wo Kzo~?C*ׇ/=vlWnVYxK%SdE~Tۼ|` ˰;D£lUX#}xP1=UT[ȩ a[+/'0OK~f ( YEl&,EF =Ey%,Pi~ݡ=u)R)vJ8K&GGV)c3 gdys65@"O5ShԜb͸tط f,,.\,P;XVk "s:~~Xde 5@i tTSHj~] cp`"I ;g^:04t]EWgՁٍNС!Me_o" 8%1mh9׋ή:؇aTY62_w'8ζXu}8QƮs{e*EpF{s[cCN4[uRJ (& lIEN2DRhl1+L9˃cIG*ZZ3ףJjW=0AK$#P/`-ѢȁФ26@͠i2L`^!}΂@r /&s%w]١g#^մt] 漏8Β%`yGN_g5CRHi~D 툔c^4*@ˣBuˆ6 }GP.خ`deQ -b"냐@Eج:Aj=IiaOB K1W 'X;X{Uj5$(aqA<m`qDT`:,{ҕOQh`yB6D5(=f)2#ݬ" +EN6G28Q^xf3OU*(RN\z^vz,nȮRfRH6XLL\x[[C,ڵuU:jI>㟀eڪ<`;Vzj3G(j[Hb qw7qטIL,5?J#:9)0*G=!*1XD9/3l3q@<9h, @(R5>b^92OBm>׳@я >N:⇕sdAl>\q &ag&C\~]i6p5dg{i<5X$:dI3䔨A|"iȧHhd؁hIBq[NAJ2Mص<G8etQE;~` {ktc^W㴣煇ѽm̓Ztۻ K:w`^}={~7ʚ ( ks9 ebwPTl)} C镃E(P'~,NJ4N(k(&n29eБ:I0^0{Qr%5diH%4FQ$C&ty\;J) Wi$#"_j-Ǣ{ϕWPv͏ 4DϙU9E[CT9V>uH2*Z莌s0z N#q“Vd!R}(s>/`)`9#!l"ov2>Pp/8C{{wq36A=L|8v s f\W1xlU4hg& /œw|ַ{1\y=vamWbqqrwSAlշcM"C(t^ȁ !:"Gb3EKD<\fn:;M6,?t[xowqVHdD?ȃ/,EСN_;_1%t(Ƞ bnj0fbG3DZXkַQQPZ ='n3'e'X4]ĉ0ſ\@9gB֞#gF" [ŀ  w9-ZoUꉾy{w"*k΢Zq*?!6T&GӓFX/Ct̜O}*7#Xgׅg}3(dZ8y/ }Q=nap3k WMR1a&]8!$e6Raw 7PX_oXi ?U翸*Kkƽ`@ V~KbY#߿vh.+#"SOƌe'Ἦgz6n|x8|=gw"Ow_oB!4C.$6FmAh"`cceK1='/şتjqd4KUċ+m7G$F5d qbwcm!&~V#oV#"F@z12Զ/3>41k b-gD0\ E m5Xp/i;HX92Rבy6}+Gr:.xꢅ Ѓwg!B'$ȌLб/|13m3 P7j3:y0 Q^=aOb q %ʔvŁhB{I<#{{mǫ9@ j6B,8?[ac3dא09rѭ^~fLl{V;`#X3zN@_oNXA܊}ftxUeLfE*| ?o ;Yؗg4<_`ԀS?MP{=:&,3 N0,a32 _ Lb?Elb&jg>ei\ڸl:yNx}:nO /oKl>C+ث1|Kuf^էr.$>gNyh>'hg)Y׵C)kv竪ŌΩG,◁ݍL"OI8d"XK/!ځ= u)/=##'mفxءehQN$ -\Gه(ˌ% IYGq GA "SncB}vZn#coV4?`˓\mV4t=jF8nƮ;o0Q\!V]beޅyW^*vWayGG-Y0/7E\¶Ȝ|'Fodm}/ףs &G{̱yG{ P}p/{9py׽%80]/7a] Me?ۍ_|kҮ0t:Su8ak4gB›K(m۾Qq煱l/0Nl|^֍߯:a9>wq>c8ߊ,C[0HOг63OCg ѽx(VSYk } dhgQ4 NGpbq74?R,ѽtf~xgz=}Rj&8r|B[^ ,s=jQQ slixd1^yO]R&[3tfaG sb#&aԅ{FW⹿[ŕ`ph7cWkF1,01 ֭j-Pz1w Bw36͘X38̹-2 >z6RmsiXW=zN?U}<x>M{LlK,7w٬a_{[n9קpUڹ2 >?<=0U?%ĜgZ̺,{^UnW38|]a =.̟0}[%x6_v̼0_6~;='<55_q&ei<ɯZ Y{Ձpjcע}|fe [X]gQ;rG(aܗ9k*uX[Ȋd7 (Ip@7=̡ | }fH񛒨#rET"vDJ)~A[ٷ &|;??]Y N;$:ŽaE`#n^!=k:= EUco-գ[7 ͞'rfJtroYHVwz14ȬǺG%P,^rb𥧅:[XbƱb^μ^}x1 abSF~>;ᚙkkLjC5K: ${G0:fIl +O];B]8v}x?'7S@ޯf %QAR5Zϕ01^ʿ(JVىY{Mw ` ;C[.k^\[}{\MnOXϋ+Ͽ{jBPx@XKMðfXz?9s&n 㕵-Z``v_hO_a=7e6=NU3=Sעg̰NU)5/u--Զ-:ڞƚ=0.a>|n<w̙Ү]auwőGz1xz.֣8nVcΎØQNкu>P??ڙ^Ru=LY-, _`}19xlCü _6J%oe">Q?HB[js<9SXg lgAl ;gxZ'٢97iIL_! %m8+"iFJEHr4kce:I҆"6ߋP3T(3D:2b+rZ֡ƾM%6h#JSXY&|`9w:g;gq"X2ƨupu-%h~݌qN:מ0\ ܺ#lA Q D}1yM |q 9qvG(,8@ҖŌRoAcE8 d0$[T li{7i~X6PF:8&;acrSBϊQ**)a=Ǿ »`4^lkCע6lfq_ [OT9]s2t.+L3w YXʮ*ԥV,VZj[(j+b[A hdQD $@HȾ-23w癙|3OM g9Y?~7,ouNބ/bM{N(Mi:(.} /A {3t{>3ݿvĶtLm4ƍN+e2掕l9ږ!fbGJ-kGJ˜¾'M5q߃'WkJ4ս> Ko Eyfp{yG,< ٮЛaA0yX}qgbuMpaEϻ.G&g1 } zƥ'T#z \lDZ_|s"i }Oi~"w/ ^?v~J{Y6DN(v|LlAͼK |i^p9G}_zyxc/Ƥ=i_O<?WLմ;v~q{[-XA7Sy̵\^_l:gؗ[+xfrqeؖVRyGi-1{JgX#:/=> 83pn׷ h37ߜsSgxg3&O~sѸ*qv+$[<1 x:ϟ4􏟅I眉ƕ?؆'On؞_`W=abԩ q#g?d  yO1z|~$~Ů/w_ܝ nrc_jY&v|s:zk!E]7qŖ~4/ߌۏtǬ =j>JCJ*K akH5Y  VyO QX7+H%wjީEm-aɸށS;ǰ}mɕS%HF43rt={=+W HٲSx}&4 ]{"zL]:kd+,BCrSgF) Es^,b|@nC 1] $ O+l*Ј=]0jZ%DNB)dVfy>Z/;*ԻH[clڤ&L?S_tCAF8ki]~5o6ڞ0e4]/M ߠ0rX}7<5龉{n;)Jih3yh=t+Z|S)k#6'121VҒ$&9;ghfuۀ<6gnUAV$齾Yf^qWv3b51ԥ0^fLa`Ę61ΘjE2Im]dc]tl3V1;EmHȚ(,N1kv_&#nM ~Sy:/sTK(NgjeIԤ}cў|23nTﺊќ3C(Xpls'ع)lf@]oνzHW 6bAgo9gCOȋ[1e[.茝޵ }fzu."\.1vm6gG_Njzo v&b5CRH4/E¥v-qF)g9 L.b(L`ѻg oƞ+aEg¡'bt6Xn ݝSv,數Iq1ݰ;nr!q 42-c4睊e ЌD:[A/3t_ũ"xMCokxqMiK9`KO@`ExA Gi6b\}8 R")_/(DӭhxM&sH2ItE",Ibf9wfk0q'agc'bQ/gr{3;{pY=I 6g*bwKX4~NVNm6]g,V͐˵i-[}b Fj\$K4F(!xuD@G|s F*}W<^-Dk  +FɮF@"ٰN u jK>1F0C%HkPgs4 gqيHl㝥׬e"*h+`ƒy Q?'1>",NG`r4m0t=5Jۢk(q^׃ɚ E.%o(sS0"ښgZ[ I6޼_:'nKbd!9g׺%Nh>jTѬ71dk؆чEPihLDqNg6b>=Y[+xectht{܇4^ڿNoTK#7#ucf&PTȉQiDmO獟qjۓˬU,\r ԦBnέ[(gb M ` ?yt*}h=wW湵:*"B-ڹI+~)Z5W2CHU 'T6e$1fd9"P&#iCSCbC_Fp߾X3 Y'nw0[X!)G@qx=n2`+"Ny$,m]ˮY^?O߱^ #=R:${r@HeM,1ԚYu3y, 6զјN$)kP) wĪ1Qk9ӑY4P8'Eܽ$DPzm0!JR-jAԸ<q*L/Vf B(s|I.IQ\;okt;X-bd>4/_ :k1X )Dcg.mEgC.^L {{3M)d jZ,xZ57><Lq\8rߟyĎPlRz1$ǿc&7blD-&ew8Z b36&a2[5ëU'|iv`$ϕ*4ax-Z7^CL99Fw5y``]~q6qb_*rD-T#?Y lh\y FQμ7]UBu9u İ3T) |^I?NrsdF5%4_2-&v#4]|. 5fk-S팤gpŽ\?Ŏ/OC"c|~{߇Ѱ1(@鎼\+]ϳ3S GtCˆL{I|=G9ZL KjݜiV ,@C4Fܡ)@UlT$4d%Uվ"5`F (nUQM`؆d-YK da?Hp^߹g -o@OD;>i3M{{֝#D Ic^ٶ $:>B0p:/Z$Lføs6b] _Q_fOlX}Å0ū @xmr?H"R]RT3|eCF5 E6<#Ltuw E&+,.E(6%d?8Ae,}Yk./<(R1p]a*8JVmcsR^CO"Ao1Xt>4#ر+y(R~v+ $yTh9 xוyii{stMoXyYbTW]?" B5i̟.(_9e2*^/(-|jr#uo@gꚈ+˜QZr>W9"L_ X8D J3n$4,ʼn@6;[zp:VH7lsB2avlܳ?VU@x")<[ҰXx퇰#¼8#agAe}k 61=53gxsքdo|aeIa?835%)þ}Y2|{?Y kMv"B3~Z<| |/z m$L$`:.S &.cn`;T0b3># NP4?W^x{l0f?ft|K9qc4qs'YQߍnpyV+zG+OXu*t]Ayp5zmV@+5K>"BmZJ?pAXR7̽,@IFo9yӥ>L2_ܲbthZ:?8ߺw;]{CmO 1L&zϸ]Ӱ c9w 8$.ͺ>r +^5 FxsE~ʗdЊs2sGܟXsß3eWbECp$PEw-HmQjS:5!tV[$dB}8DG=6Mz)]Ί=j+^# _àwN~=w_?ݗ)eF@lؐI-Q3袶[0@tޓf1©d,4|20OrQI0jPj1FRKaz;Ab`5 U({L\܌84 &i¤(YI(^8pb#lwh9B3a^Fq80ØvJtNԴף0R$Ƃ1t< e/y>Dc*w_`l.h9zPՁ°3L],㗼G Fcw*giY@: = ݠsf> ;Iŕ6BYvMwuLwg/r{Ή;{ $%a$Fqy?ʣL'Q,)#Gz3+  GY3.H?N7‚{yEׄ.lmabxrM|wxujа`9,sgk{[V'%2vq׫\΍+?=>/<W\cg:7Ks*y3^J\Ԑ{rj-'~U>Ki>=mΏvNĄ3ZmĶ%cܒq(3M8[wˀ}ԧ3.fjg6lu5ǚF5͓6fԸ6oOِuD9=;;se(F,LQ}AXgban2v]~!ܘN,]1;\Tʠ$?P$_1)O".)^;0C0>QnKD9.vNuP]( f—Iuseur3b慯qB1 ݘd>]"/( #<AE3/bk&7Xt^Z?7~{k$@X>3m 0+LMO=g@H!gƐTMZsC9É #lIQ CԔe/xk5+ǝ15iqV,R*b~=:"M (|%}VA80Ǒۅp⌴F_+<֖a-MėQ&.q莌FV.:R+T`&d''˜>#4 JV M2 !` dbUweȰ̦E ss<$n{;A{v1sg²32' 5űΠy2F-nCR;,g{.s$10~O '`~kK!֧Ոw={{Ȼg+#  7414p[Oh`gu׽+Gan}\,)[z/k<]@Cl## (:]{0;FKe.w5=W])5,ЌeǺ!?%*?_ O~/޽26וu䞽 5-2&wKJ({|99,KjQgG 1˿$@Kd(,Qiћص+?RcZ=4Ѹ;~d*N0pw / .53g;'36ڷ7e d(ldf4ŰS}nm?5e~sM"p9_;m4voa߸pF4bXyFYI<0?d]nB(A#RWZ*6RX K?y~QXe[=VX$vQ&!!cuBqR 0832ӈԨGZkͲgBVmmC+(Ԭ@ gNM Jq492K(oRfqCӌDjTXAl h EWd1dSyr(+ńR(:H<1UPr"~~zKe*;~6D3p^ˡ $AZQOYFmϙsZC!Hɦ?&J%mʈL#"ᝲKqFJ2lLpVB ^Fad^|&f=Ɏ7$Lf3^"{te I+eiߤ\{ #;azW~V7+ȅ [0h?~N،+E7WW9: E#T>4Q7^78ƫa켌.m>>{n Uz1ܼL}z[g0B2a Le~ #‡>ZÄ9 $8gad"F%\J 18؏^*Ч1aSʻgad\S dW?0B[UJWE%ٚJPʀ;zنB`Z+r|%96BmME(Y)pR7IYA9yq_: h6瓅ƀlsitNA 9iMGوRt4[@o(}(V',@񫜡܁`WĽzTTKLYirҡTXQyi9\V6Ye"0l44Ґ%eʪݒl+  h_j;c\Ɔ>VD-585Z_o |eX>'nUoG=?ƣC[pon|ۏ`Kx0HDS.Κtž7׎S.Ξ}]n8U͸mZsC\xǕW`q0V^ fL,4FuUo`_j [?]+׌cj vB5sdJ) E=2chs2P]7zzVQETsG1USںRhn9A״Le6hkGi5ՠ˹Ԝjd"7l @ %PLTۏ8чaߔcH{uxed:48]BSG0تa:ٍk)tQ1q4,L96>h#3jDJɑf9ljk5-׶ 03_-::Z@S'=gՕR3&}3nxSiC J\~)I ʙ# UTE{dW0bˢ޽[yc+wM&5͔ȬO! X9 Zut#FQyR#FdNPuܬ ];. HxCcU `ڳjƉs;2sKs !)0$ ?[AB?肮Fw0J wȪUsҬyMqP<&`&ec,-V_pM"Cd(> ?;401a&-=_HL Og߳lujw5(`)0PTcx p@dcS?KT5p"4tW`W,#U6"EX`ZQ`lmkG抡k  ;;e5uu`ԑ4Sģ|l`ip(NEu"Q0VI1ioN@|`H6%Ss /T-Rk[XI۠kY[`3e@o~a^Whe_&#cO3#{OzڅV;/CyPb`h`OSZ``~,$L"jQ4RˣeHwC5$d2M,_1)Hfr ;GPtbjp)MG@8@`U؉YЂ>N#rkg!&F38VʺJ`ӄ!ք*ԹQd.2m:!Z 1,`}7 T} jA$L 0U`0%3ҚQ6ȡDѢx]+B jK"KCV5I83`iƋW4.-pNA˴Y ;ZQ\ G8-ȳBXkg9HB(bi,!29i %Ct9pScH#$zhew[3%ר-xANuҷ_iiW9B ?CcsO;:]5 G=Sqgy_OAmfC0akѳL\c*],S%K- hGFHLPa!g+L!ˢkzekنl N8L;ݵy@3~pĹh0k}A*}D %R\މ荅ӟaoK^Gh8mWJuK d(Uxh1q^|k;]?pEI~6d;0n 3m.ͤZPƏGĂ(}CuE'3a5]tq'ׄuP7`ivMdĵX@9:?cjpo17\fѼ :Q2uVhYʬ(rpAI΍׿}4>3#n>7u zlN#cH p!eMSV&A EXlR"!;YURd^wՔSVWG+`0,[>+[6XyFdA=<41Y%VR9g,k/vònd-;!Y2~VNSsz,tb̮ 3 đѳd(_;k$U$Z+Yj 1SUYV ྒwƪ;T;BBʖM* oR( |K52q-K;v9F+5h^x g9Go '_rU 3W =;sBđr%Lzbq䥑8,3OuWc^^Ư&qH}n;[nF)a4L9ʑ`+z';;e>5=VDDM=8u~nŋ:Vﮛľ>ȶ5bDu %(EPwϐE0چ꓈bM7 {^zVA7 ΚA;"Av&kFM{M^G0팫1uk+n=h[؋7#?njѯgny/}}3u2>.fc36QPPڲ1HQEԡ~ djG]@"}E!\jg6D63N|=~b3/=C'LX]_3ZDD둛10J=~-8fP*lJ* SSm'gk,7^VFs5k!8n\ޮ aFR>wGfcZC 3d+̪lH]RygyY /d& NͳN܍\ #i!EJX $=Wf )Z>$TaA40dXKYk rXܴ:3zD wm"`Y@t̚V#ȮfPW8۔6hV^O#ަR%bU@K``I{&{@OЄAc26:߱+&d!d5۹;i <2@/4{ ؿ/s2KӷFdcShXF`970E38#mht294F{PF4B\k%f=x ɸX ƿXY }FaDzh) @_qr2y0I xE WPP)3Fsܿ{S(6iUcYbqȊ!ΈˋY ʬfi^ ce4q2|xyAcwXSЍ+D 0[AMd9nr~cXA4&1^\<*ج&ŨF5ҁf \+ޅVe0$˴shrVV(i?D 36:^;K;uO3Q_#w1 _d/6Oe7x\nzj~?qҁN:FPeK 47A(gPEY~㥕Rh1#8PX9B")ꎏpa]GZ_l+bZ8S_@B(USjZE^!~$LoˎBm ͭ^ D^ux c!ҬFDrMNƜL2"lH^`gEِ(Umlepnuςhl]X;}$ Tףz&=a9^?aXvXk?0,k5hZ5NT:eN惱>E pJ3]z ZV* 3Mb[:m܄cO@&f>@aeZL> gsͻg[~fJ\=܂{nЊuD,Ltdݼk|S6DP,Jj뚤bzA nTFl䷓gy8/@$yݫ~EXajk1gPY/pNL]O{|iCmhXS| ;?w/3f۰q~;`~9_"h،;=wMޅ-h;uA| /ߑN0ۃxҬk25Z k,\W5ZN~]ls.v=~|EwL,{p{6>S܀m7[^l,8䋙 ŵxfB :%a<!--ǩo"wl@ hR)?ͤ$04?x*;"\ &iuXQ \Bv ys?-PcCր7IAeIVfʙQyZYOji^-iMP*9uZK`(6̄ 'EB1%ݽ_ǃUPX=Q; i c exTJ],Kf()nK"JTͻu {BVRIQWa35cBl([[K6LU5!6Իk'kE+y)BE~_?s8?{zM=jg![ߊ 6vmw߳9EgcuybYn\g8g oYsPՌt]]mn[Q7gnvCmJ琸jC>yh=m{GQ7 -'_oKnnբ7&1=09ܼ/sv&s/KVtWW$̦a&~9'DD 9C 3ěZVI;=@؏Ӄ{bmK ۽*L G >LG$lPH] =aƼuU_TkCiu#1\{) X-fءzܼ9OgBO "7 5k+. O3L"Y%#'b SnVٳLɸ'!>7޽QQo%c㯠*Ycz?W5Qf{<:;8ľqbv:~n,7R8XURJ(gapJ@_; CFK6,Qpf#~l2cV{Qz1:/S%7yαhX~szϠ~18 1+Mi(MfНw˝bҽ<}qq˰oe.ƌJvc1{)uك>}M z y8'O4^޿;\=?2Mbg5q<.0 <|s2? n9|>s<~=w*r]?uDϸ{7a7M1U2r4DeW?xZO.Î/?LlAͼK м0S!ɯ+zs.VaC&1Kq^.8܃-Rv^}2"@(-{k,dHPY@^ jY(|ăDFV֕@3gl~UT Zi'j%fHY?fc+4 8; 6Ȣ(d S2% a]rږn #dbkjfaAhF jF@, Հ(a  **,Ck0aCrh oG鞗:G(q}_P;9{yLxS{;׏eҺbZ@_F ǦQc1ܻoDTO d2q1^3F_Fa,q(ʦş R>W&-I ޒx313rF[R8CphhGzG]n >o{ŪJ1sEY)>cnAghM乧w}sZ(br$Kw0R^{0_zzlj*kSbgDF98*+D< nUrgl2GYSH ƨ:'pEl)vZBЖkA :@f͂*Yy{W& !n\4hH"&n%\rX2|=(UU 38uq'v`$Z%SdeBDɬp*nH گViB~Yb )j5VYZ@~sO:'t,fϨSKc'유 gǜ󱠫kK/kz4ş`[$=8嬓1p TY˘* ) uE`p6u\-,-2\Wsp$~kF W>2u5oabƍ K\=AJ)}']enA.-P  3R_q2@ald[+ ydEۙbU݉Rc<"w)0lJiqgpKWiF 9_ڇ|oBvU3ڔ#*UdnXl8< 421!0jUh_d}O[BqSa5ԝ** KM"b4ƢUOy]AQMMU52KjmUƼ/uSkOX!PƆg t8@(53V3l8rA2q8m!;Q˂O*Rc+50y1u ԭkY yEG}M$;$ zXb(J Pձ2ƣIܷCxfxJvm%<3ha}{#$p'2X,YK6)iZd,jz13fn&6UЩX- PV"=ej~͏,Z5WVsU ~(|Mw>I殶|wJKQ77AJow^!L1݀t>Tbdw,ž LNC]DھqmBzFoy<*8yK1UΔΜ#"~.'J@y14˙f /FPK 6ր%M(kZ+Y&='= 9HTP~xMGwU08Yݼ$4.G #p2;1w Y?e\]x"bȤ:]χB;'W rԁոQ/dfL@H'Fwp00" ,uU{aEԤb?I0Tiɭmh:6r?Q kۧ92H-]H(ABUGglԄ@D!&Rjz՘L1:,Qs (B36Eo#g|~y&1}/q4ǃY T[tFD_>ұ^Qb&Ƽa\&q y= B@D@}0Ҵ?+58*R%901)Y$臍FK3 G2&w+l\5>&sb׮GIoCI̷C4wnrusއL~g; #yw{1A*#LL2GFEZC4n܆:gb瘜׵"}O* (]lCȹk{2|נyȸ{^ρ15ΏI4.}sMڕ8B+/@YPoN7YObO` YZ ]O)d.hXЃ~?ۉ3ϊPU5~=]~1Xb1%FdOCtv_1l$Fꒄ؞~ KI Lt miHdAyl#|uC >8d퉵VǷ*A A3\V1&,=:rhJ*8M"'BB3  UOQ'RV͈""N)HJO!')U~(郞"—HӣDYZ Я1eE, i >zhXl_,tFI&u㩎 >IJ<A?cu{C&[Sp9ñVD\r|.5֯UD/KrIrev@EmoY^UKD{m>Čg" ëU  LnWg_\gq81;03)uOG㲳а@C[)NNWj܊\@X}>dRZo" Yݸ 6q5)~r:93 [y9M@,GIǣee7Qڼs:u9hDqb5Q&."Y(7aa+^m7,ZUhv*2/yB:5Z0T|ܸw m189LnO~'M7~9iڸ9{f%J -ue>JI)ﻄJX_&*"0d$ӛQӑIct&)R ,݊~"ͣ<2P8x邒]0o/M%}ls+Ko09i]͘pЯqHFӫ12Z ~T논yזZt=P#Mrـސ#"h v3(snbvRPeA?Tw!ȱo43@̰iXQ^gڿ^㽮׬{ǂ"k 4vikʜ @\"a:879`VtYBlch $e| 2,ۀ){2Hs <{ޮ]۹S0]s;c)u2. &0Ɗhϩv&ˀkHo9U(9٦g̿ݻD=13w 2 zҩST\7&Y=BEjq݆(XLR4n|?hZ<s;+ڒhXlvٱΑ!?vL{IC>[<1kl_SWfDo?8kS![Q!Yʂ{>Îؙ YчPqi e{^|u!>S9IFT6SEYA [awZC`X2)B?<ƍS4׊FO:Er=Z=ZiJZ@CS%jk+FeK5kdOX%(yy:_?ҜM]'W `/_QZQ3@0}[9|G hF df0%{cͱH_L9VwRsI2Nԃ b/%N+ZY"[͖kqEg7jʌHY Ulk.qujFN:P['. A$=ճ|~WkOH:ZdR/?D @jj5 3z:16|(CX[&jx^TH!uN]3!΋`_$ e@J249ą栩Kv'rXRȉ |h&Te GQxcw9Pϸ71EJFMX&òUZ(YG-ŮJpk^`' _._ep YYrp| qó V =|5 *)Y8% `F/53ٖn :]Xl- fX5K:g|arF-MSx$)mU5Yّ 6̚ 0ʑBC6z,6,(BLx[k&0{RZv\3BL`l'̨NNDcYPG{ym@׊"IUߴ39gkxYnv<@ PJf,`Eʚ,vtxDG}fHw9N] ·&#<\|8sQ#9X3V*h^c#CJʣg` b| W7ꦑrцVJP(8HY=|(:Ƀs(:,(U6pD|2D7M ˢDZX2o5(Ss65zHň7G4]. L4‘gsq&c5 X(C^7Ւ\#d%˦D79XDI8ڏ"bx?W mpnx,K, (Yju=<xpEݷUP$k0 "u-q}֍&P!4X]#k#_ٯ [˴5'CrÙKYds0XƇJ(s D-fД {$"& NgUf-2#۷i0kq;:;/&Ћ S p$ol;HXCƙo態e&e9ˍT=U { A]Y)WC2qE+U=4:WrAshUg01-a7ET"KN`W1MqCU͙Zx?4T<1= [v!xGi=o[eXyB3,XpTjab`9l3zziNa#0) F!je {*eq(6(/Y b`ԠZmVJ}FLe+hުQ7Yd}ER`Hͼ0Cv԰.5 m`L!cRƽk>b""-Y\;F[ yͼJYZ_kix6GsZ}޹`>ác[E֘CP|&;hs (ZDY%+rP$3a,U}&GI}(}F ߿ >9B%2)Q,/hAC1rk\YŊ,ۤB}hUa,TMm!Qoz'7DӉn ȕ1b'Y=53(7ްH9cM[$Uճ<0w_p@! ,@fanAmFHШEޗ&j"C"XT21,+h&!sR1S[>ھeTqoƛpiuLߧSvN#ewU-7 U,jd'4h'`TjPݝ"d2xIAHtj격B>*a585ݸd a.aG,R2zZ΁tP@ݼlb*ަJc6 +8AMC@3EĦңHz1=͊ɉ %M^ZhdGbSǩm/hJ:WXoO7Z2 Ic (#-eТd0 m`/7|_F;DIeZ_to8L߈Og)aA٦Js0,{qsPUE0~vMߠ 2uqpغt?}[#ioE5C&`߭xoΓkiמ,dk0%Qjl}}sGǓٲe\?ퟃ7|]K{Y] ۍyjx`{3Z6:ԙcTAJ^Vxh>'N$AZ>Ө R9YD""kDewmj?f4:0.)i28lPXWdöBԥ?=whg? G8Cg @Oj_gZLJ'`߰3gUa06mڏ^F2vD"rP(IV< C L6I1[ a8hTL!%Fp>5n>a,jYƊSž⇳ 3ݴ~T2`Q[TBQz]3r3{F6 hFMLgd&ٮ~;SƵ4hk1ⷐ?!M%6yMY (ke[iYtB̼o~>6+#FԌ} %7\4Ѹ|fjҿbbs-Zwy's??ɝY!/iscGYHKnݸ9֭4d+ R*qAH{hi! %R>n|{`.BuJV:TsCk g}sX,9\j,"GZ+:!4-JGFĝ^ܪtDb_X[c+ZWC)sVPG#Ȇr3]u`c sp3ҽ_7K(cAX7;MF)5dJJG 렾lQDU\J/ |Q|>pjVхB@GFU$(w\y+IJ3Сj &+j<f%$ygB0gؚJ"-NvaZ(VORcZP+Vz? ڝu"@(g-#JXNrI .K #W<tфȈ`|*a(S~'jZ,FKvF7CGbg8鮉4Nv}~td2BŽ}{h:U8gmš_ yVlwL%KZ}g?IV xv~qt,7`ޟ܍M>)Ja'q1}=WĜ?/p!Ihdz{Өuf^ǎ0NP{ѐUh_?tPEj0VUՍΒG F̑ SUa+Yn!) DF4JCB6 ~1F٨i៳:T&QMѦSՆF]N.EDH#H6L5g`gQm'X;-a#Pjwu-4zql ccf靀 !1K}777r$$! lBI`Smp,˖ -]zN{?c{c͜9;{z.zvBC< ȱ-IRNbwُn]ē:30L)T>&͞z b!'OJ!0K hSA#E!a;c @JF1 I"h-I$Um*6 mlȤJJ̿(I#! Lo^ KQ* !as c>Rz!=hӇŮjo}sxNuIĖ7T 9:ףsA{&ڬ3/]w :eԷ9Q/_^{dr@x?s[sGǟ*v\-z?1c.fq;f_E9H*Ngތ>Ll;gfwd*DV;UbXnGyo&2h_JNG/]뉝p{nn%"]/_]s܍]1M̽hHN^V/kv5+9x'4w` zT܎'?U(ѵfnmV֢oeڎx k]t*dkPfq;pʟq֒]8]&_ Wǁ;ƬS>'kiy{iq}^T>_}‚W=$v}uK / :$OFA: A'CEYWGʱ#ě U [CGu#>F =#)fÞCt_1hdr3 ~%GgĶMSV\N:`$qxΠ <58tU?ΩsR s.9CW܏dbf}BW%Al9yViWZv^.^_+@ L@ ߻Vyc{;^Xњ/=+Fjmrjdv1>*AN7C;NL6 >8VuZRYsWƮj=CWcػpG{ѿDtVѩoc‚+3}'\קx'Iz?{Ys\p:zzptˁyUGZ,iz!#(#Ff ,"A' A& $),qAޡf{3ۥj)M\%yLɨU*VW_.^1(#7qM*&d2Cɣ`Ƨg{ĩ*I$IҭX*hTyTc%0]U5M6Dc)Zz,RL #\4>x˹f}] b+T#v#o7IclL9=ʹB8lM^В6K'Opn ^CXJB#V&=B]Վxhn֏ma!Uu_N'z..Ĭ.Q_x.'#T{:xW 4`ᕧԯSlq<ѷ %b\y{RC}.p*Mr+6o5.@svk| X FY1ސkD]#z"`!ftf*'CV"=z; v]]BjQjǤ(WS[Fs`gc&rhz:oR3WRq륏P4Mg\D24kj!Y58p70NL>'6>(_uT_]bMRKpC,y ~o{0y}1}֜߻ ]#kꛭsx\pb\F1Zt֗9D0xc|đꉟL+9O j!oߧvޏ4yx4OJ %*mCw!^sν=#BDُY<norX,_ԘX׹wΪKzEuG^f*mH"4Q_\b O?bHEKEс 8~O`ck=sPߣ?u}7?:,kYŊjcjWuz`? =hr.͗9Sgkg?eLLYXf#}nS&sѱ ޽2l!?B mJTL]}cpUz ?m3v onFPmq&Br.5  E! M@2ׁs$;*._sT(xH9O毡s̽dj|v|Mx'Ks''Ñdo+kiZMS1+CZ{g1sg; ȍwwY$f\8F[{d,P:DMv+*oGCFHOR0y۝]4";fs5Ւ!%w[Sl܋JT\+#ɽC*ⳟAm*Fȼ佧uGƓ9p"/Z^gۿPMb;ii/ں:kI|/ ! ){_ \>x>r5E50N<\$?f1Ar-"?-2ށѾV<>fXM%C\(,JRjL \E7,jr}m#>u2Վp޸q8g {Yo4d 6Ȏ*sW"JYT\u.\v#1[+QƢ; 2C̫$gB5 IO<ֿŎ}.q6hfêҜ*W{tV=x9]J=Ř,32S 1ySLl-Pj/<=dcUvmFE C4?yj ܍G$}ø@ !]] r-6!F(Omq6#iZ ژHRڸWđǾq{kGo+۞L"ތ'?~{GB?lkc:_{5_P}WؽwCGb;%g~8VُOמ߳$ ]m*sы( -sθKbnQq-kܓB"Fug:W͵aM"Y?&NNψ S(HEVߺ2V+0!Fhâ߇i|PlPxD 01CdZ;Cq ɴJ& |ϗdD`ekC43P L)҆$"ݝ >w*[_ !CȠ*><*đг6>t6> icwcpo!Cf (3,M|͘A?1@I9mWQW]xJXM*P ,?Y"Su>͑zc"%eATm ] sc \x ,xz3 ׾/`b=T,y'qx?5rzUZ7ѻ<|3 N~CHpd;1,psZ\/ŵc)QK#g^c@⇽ozK``Օ8o0{ѻL,Z}bO][?Pq& c98Z}+.Dh_'KP?"~:_ԡ"anVP '@&ȦiuS2\RkN0ZKf#oVѭ1LRyq9/X!tV+]oBU2ml;G~'.Iuޚ(ɧ{7 ^Ym覮Aۋd_sۆg]j"2{U,is [޳SF=X_%Utrq<߿ԺΕMO"2s/6&WJМ3pN|Ggrg냑Sѷq}~rtT%bw$}ڨY9g)՘rS+["}x_})CT$y\C/Jova-ظC<⣎z}'EU Q%zJkV*:v&Q&~Lc9dR4PZ_Hf\z!CTZY9#:&g)nxHuƵ^ Tk!+Rv7,+"tq.OuES,%L0,"IhԶ2Q=yNMĪw^VlRYz }QIUU˜8qH!AIȓ5욞+UVV54 f/_gE~=f2v|7`l"[Yߌ bz-k?:]\?fGW=wV' t.WgHdl,O:\.NyW+]/$z/Bg)"I=14RrEJS:}f14吣i;V RJ5.RUf|ATWƬW5v9sZ9b,-ɏ5?Hbޥ/ż`(l6:їWiW BΩ_8qoqI1{ V\c>-BϢE?= d\'&Yךs{e}"B y]U&Ysܸ>}s9E"4H߈OE,vnΎyկLdjI_&D%3(9 >d $03a%c(-ָ!H2kD=6yPz|IE -a$TZ,H 8i`v׸I r{D) -[G{uUu%).RB4qHw̾;]]՝Ycpt dkW}5d29  _rj8d&h 0QiU3KB*YK5e>i6{"KQkI5S-V ;FDLJqYKv2vTVy s%GȼwELۀOk3e'zeYĴr>2V(>ߗ\ιk~{/hnB WlvQ"kd]sM 5BNl` m8vU}ˋqxpƷn+I Xgѭx~937wU$[0i1*c+["sWəU8~sR_>ˊs>۶RhNRgf1$lCFVù~Ef?r*T$xǞ+5V?H$J}L(r3"dG%kK1 >̢7l6K=:?Pd3Ss+Jou?k)_#瀧?49ЊMxL[)!7S%B2y$PO" ͟DUh%**l(oAB Wl  AfIoXpR׼w *(Mc.&WHSO!jvׄ=ZRpR 1L`Ta&dPӳ7`H & -NeMU9ﭵư>a:)@$/Z-OYi·K&䨰J`yS*$db$1s+ߪ%zӇ6aύpل w:C4!`T0 F1R7~4Տ:O܆C;E0I†p&9v }0! $ȓ[c]إ$BDu_zX({0F Ie}}n(oͯw}O=]#ǡsoԎ""L.辮* dW[Ru7>H N JS;pް, i2d͂[F"-£KwL電|@KrwTҏ%t`YF&^|rA7l:ʁ:w$H`$4g[- K'&qTV,ǍA'A *s=1Ą4()Je"9jTϋn(XޜZɺs2q#ZrkB2hN\( 5KչϦsdQѬj8<2=G1Sd=g=ӣV.t f?L91Uo7:[nş|y}v 1HPz*=]=g3)DC}ryZAsg c`wϧaLw~rf%*'taV2ƜY~5؏nPOI]Bgow+0c Rv%XfuyS`;.3/7>U5 ͠RYOq"HMy aJ/IU6crfLeOU\AٰͶW Lրx[lp6fnkTPW|n<}}:_GJၴ"c3lkCUcZK:9nnz  N+KxPZw\-(2|;BK o(7ioͻX}9`T=Do(HiPKFݾĢMXaFK}XLok-2ըvI8fm;1IO=@M1$M!^B}r@E/}:}K&zST?8L<GlDIH6KcH)]b\P:CC8:,FT *3(h غs`Rd֜өNEmt+=TNƕ˧b岱U4E4_s !E!lQI2$) #U;Sd:u@ZT @T)QKu5mڷ푏a/)d4 QJTsOWw#VӴh2Bεu=(7y Pi|Kt5dy_/C,D0 77R ½L4J-#GwNM/UdAp*#ɦV3J-9G>o V\uhGO5JXYQF =kGH/|R#"h[W9"x$oP_ g(ۜ0HM MwZE&/bU0IWAO{T.B\ l/)s=C?yP&'l2̠$U_}VɁV<|-̆Y8UW5 :bV<^b-tStVy 4(L0~ (_c<=I֋9IQXSGxjfP#){d|b92k1k=BT ţ7vrI0εS! Xֈ[hA$I"V!{9JŃVN 3ęlrlm$1ACx)M2=iqu7Gc!\?c{$j)^̓-*1Ò)@| [aK+xO@5W\5U} \^$Bh ?S1:{Gم>,85 GyLcrb S LW0V<96U<^z=X;&gqWjW&re٘;=g5a%_˂sc<֎i߾qusdl^%$\'S,Ês1~`?ˇEX{Vz>BuUpؘ|R5B$X pHrn]=w?,^5xJ$7e #{[C@;j8 b`J@}y)K]EYЈH؉=I=;{r`qHnu}8k07 !#9)d-6HJZk-V#oӥ+}oA<f-$'e>9d{(\$]3]rr;_LL['ӡ&,hRʔcȋW*V!= IVĽ.Z10q=#ǥIo*H xBZZb&vI8ܒ|c5 C۔ 0 b?ו$b%LTAGB2+cZbQQ7A< :}N9Y6V-b^nnUzo| n\-c2e~ SN86 W_4a}sYŵ⃁P=k_U/V|o٠Rϖso[SM rt M 3?3d ;fgbՙ/[m/0x l3d=f5󻧱BVWwb3WA†n>CKrM:^6r3hRuuKNS~-{A5kEcGϜ@߈?'r%&\ρ{2sP3>$ߢfI O@2~i9|;?6ieFϡ6𜧊HO#穕wɝ)R*#D(U!m3]v6IS ȯk6>u|!b.akE\H{L[5lŭ#rm]Xغ䐜f;TcG7+,"^'ڢtlL=3lOIK|q:f1N6w Ўm6 G/^V܍S⍏= ϻ||vvbzJ0\MƧ0#:z;jT;t>z8GQM8:1zNiL`PbeR$U7`wmF@H/x/+w݋egtؾf1.:/;(a'sˁ'$ЫT1Ρ!^ӏkb`Nq0) T8ڇ@B_ [֒!>6>Q-hrKlf9< \Mehbs)ILދ1XɩFFe B ؋0#ئ ]xJ9~d8 L{0o:W%C&r$,y 3 ,26ri5Q+tPRAę=6joa3ЌJ QlD}Lޤkm,uB$3>t:fLA33A'BB2F"TSy)r=SP' OyI@5nc=y)뉍5FGNU8}X:}@^(R}v]SԜv)Љ'oB v4߾oyqHd?Z=%!B/\4BAl7uO3ST-4==;pWE831:r~'[ pva݃{5sq{7(_@pleGiΩݯC}nۊ9/GnoHE7frc5PMs_sJ~B`wj{UK </v9n 0/XS3sGODJ"vsIB)U7MT1 jbF Su𛧂߃؀>0d{瑄P&s:MT-2=vm"XEt$Xg#IP(+1CT4GQI$X5|O L͍+u~Vp>I@YB_L16Vf-u:zY9Ro"︍CC7C94mm}{~-:b{dVd1/$ŝ>q\A):))@xuZ`j{.zC$=k7|1!1Jr)q c"ʮ q1(- Z~YE" H1&`x#[bl"mV^^[CPuLC4ߦ OM{1Hw&;g 7ޫs޼:bo%0Thym6&j3R+6L(ӽ|-Jd䗎so{#7g_}fLHaw$kbN~[q#`% ml.@ ⣶=xF랳'VdX(OxMNBc}_ sǁvW?/[&ֆnNۄ$}㹩ɉ'5Y+)bP鯥* D+JWHa#~V7[׈׫^%2mo IqsXsZ+Ɣm$"*F5=؍A"MFkl" $KCN+A`bR3TCP̶eIY6$oup68' w2h;N*WSׂ/։y8cq詞ɴ=ʁǰw\ :: ހ߾8D8Kƙ;n0Z!qX3ISV9DV2RtT/*Ӵ Aj-O< o[%a 5ՔFnT:$}N7g_~؈ GUJ(`$h1h` G=^=k/kGw} eD] 9"$ jK*i,RT9l~("%pԟ%cpYTR5ɂ. re૜Dۄ"LL( rYaS|zY՘DTH0,Pg.E!D_,OU201"S$/*dz,dW.]&~#u8@c|*m@yew2#$0a{d|4CA!йZ(%("5Bb[!PXf Lq9dY1*lN7ri`57bQAI8H'QtMA'<]<և=PLF_Y;~*h?aV0\?~z"9ncɂ̔NTULOOꠒE"%[ ·c*0{rx9b|ZOaqw]E5y >E!4X5cgVQ;T|ARKW\=LǺ~ hY=S$Q*CaS=0fy *zK2L?8SFp)]LEDLI͹@IQ{d+dD#Qɯ 1) # RJiZ\pV]rS"JQ[^oQRTu2b c<kýd$n̵e/I,pR}NͲ=R^~D` =#6q2BK?D%$Pqb%,&)U kc+?ڡ##*@N9lФ{<Į#=pY@ݵub8q׶NH\23jS2soC7u'_w͟qנW*d/&TTn;ᄤ 0 `ae >(e[J2'qE.\mw]ݽTjy%⇰~D )sgC+jj2 >d9wƩX<܇;ZSZm:߿Ed)FsSG< "eGUYQZzvA4j? 9iL$@Uc S?NOF#xތ݊??}1 TRKʱ"a *qW d?)2DW?bg)<#(bE?_|2rYm?@HڅKH:애$~>n1_ nx_U&M3ڎ]pq,Oy/ڮ_I 7M?{ lDyMc[Tm#OO&p3sn:okD-*oQ>gx)> | D|V=!U{ H$o @ˆ[\EJ`(LIz4H p4O!;T0*5SaFsTE6A_܎C;?aMP+d0xBCZ;BTbT$d(¨n6N5BLUqYvqfψ/S\1( ]#zJOļYY0iEJkR u{rb $! ,گ]foElPW24>Sl'r S:]< =;VCIbJ pr$=TNRom*n+2*nAHVZ`]4HhH}cd74!qy4ͫ \;8zC T{Qzc26}^`2vHKy}tVHґ%YЃOF 6Wf9ݙLGNتoPczA;!l*( 5NFNmq43 99iLsK[rb5%:dۣNC623jn(Ĕ(Y )Rpȟ&jlҎ 3/'}/F%*U:d >{.IͤM7Oy wGi1XР O9ȼ";J}'?395aB \Nc_UN5/yNHB/g$fS"Ha$. ysR璡g)2 J,סy0ԤN~`!AiZ87Zd͡Fs'4iR1so%fOj Μ\o&K"62Pm /(Z'Yqy{7+3#Nީ䔊I7L€mc_z >$&~4s妫qcF+RnC>c,d@RggَHZ*)sj~ 9!'DP>)f[βڄ%=6US>bE+l\%cODu:V:Ab14>M9DY4"J{o\6#!sN5v|p3?a{`NtL& 2p% WFm"A[ag}D$=Xe5 Fq)s,fuy &DE4OZ#Ea]W.Gf'"F^LLv2`kJMGԽH8oDDD?Awꃤ̔WHndTaゴ;׻I)PT2 $Zɱ>C60{+^T$B]FZ}X"o>S4 q ~M/Dl5' v' +& dN eR3F_!/S#{R6"YC 'wa=8mu9޾XTɲW~̠f;S$0 KXYz}< Z[}drM+B(U,H 4i#a ]IyK)aZS ]85׏L(Ҟ/ L7/OvA%mqTۨ"!/DG}. @VuQ#͜y4WI<\k_y-3WOu %Hv e/ WXuRL[SC$S&U yΨKC$x )Dmy7RMy~^3͉#: kǩJ,xuXk9XKE@ɩ ,{Xf7ttD'F4hQKߗ}Wk5XZsܸYɢ~]x8{eXlCD+֠3J`@h;!AZLx)FIF[5][ߚ]q }B~oB4(d-D5 />QMuj8TBvh"NUi}W` 00Z)dHֱϏC = FI uCjo2}(a?~F|")%W\M?'$2 tJ}iRBWҼ,L#HR6pQ5`DU`ǕN57{+(x+a)e}RgrJ '"> $UFۣD)AZu@X4z݉=6uiͥOU3|h=ƪJTYQ \e0A>+* EZW.t4kۊ5jM+@l&=«URZ^@:  :<]5<޾"q* 32HRLo7+OӨGyKI4-ytq휥6s;8g Ozj{DË2$?u&MpPDҹ"o鼱>Q r-PVXdͻh2!*iõi ԒqEHmos)Y0bڀMj:Mu6QB%-OH!LHV6?o)1W<[O5A$Q`i{z2T9 !1 &U|b^i2G Z48Wո; /QPʾ #Qh"wa #Ǥ# I8{9dٜyφN/8x _W›eJk5+yJ'i%QAn88dE\ с+APH2mrUi)LcMYfaTV=Oh;c" J Gw{^*UXmu<8AᘬpD:t' [Wr#-Ϗ7ڶ1ԉ_VCh4&; k*jh"~%pЍs2A p{pU2MZ$AZtKQli蠽N KZVm ~<`,E"$H{51U/CnQ 2CŗANYP)lG ]n/)h }XY B[l/SFx<Ţ:hD9RBn Eҡ<^| dx ґc\5<1kդg /b~6ը4bW Wz%OP M^x)a$iJ}dT~|ŋ/<眳 =S;?7`_ƅQ(sdʃWig7.9+VR㹋S"F 3uDBR"GXJ(֯S T'ALN%C pWCWa;u Ⱪc*~)!QL|!?Y^uk;:Oau؄W`@W>xu7c?|kq(U?_/?wv(=y ૏p *ʛ VWis7s )bXLLJ{ ,= Y[E>4/3[f(*7m[qi%[9RO^֙eU<-'9R]E#(?GꈖOS&&I'Z"R ' |aw_u*;3DžO9 y%G~a +O;3s?~N>h M1oF̌=@MLO$Ę?dBB.].p<`d(h ? b?~đf8V*> RnVˤ-L@ ެbY~is[ YSo\ BhS\bm6gv{J #eIyŢw{B:O;ԟ<u.k,,.tt?*aCZES5$FɋuZ o/ w7E/gnHͥ s)j]bݢB& Sfz>AT~!C:d(:{6aSt5lU)Yag&* WY LLϣAj>rt L<"X­>XJ &3I kebc5[gjA{r"~M4\Zd;M>iuʗ{,Cฦ%BQ|_Xch 5${G,(@߯B]=2s"EHύ~|q~&ggK;h H($SUS|̬I?&C>z*df!9څd5U͠3YNM a{e|xjubMo{X4x1,TYycXoT]HNsG1u !f4f&J+Ir~arJQ)'-N3^Oyst?4(h"s(iN% & aJTGk YbܚuN!Bz6 zQиUQ"ĕOv$  X-++lݍJ=uTXGLx]"}Y1$%+<$(Gl ?4Tj/rϴUA\q' K)b)MXZĞ1CSTj}c'lH&; $綍8la&={\L܂;unB ?̞݀7~ Y={H{/&ps^J"+T(]bFl"<YA&:>w&h%sB543ts%Iod*Na2OJ $ H_!t:s.<s/*|ۿ")NO~v '%=!|;$ߜK*4ůb.l,Y3߾#T”UoGTc:ҙ+٦ܚvSS!|܆^@ms~HCQҗQ[]5Cz9Z+F_]]*ܥ&#pZr%φX!2Ȋ%xNS7lJ@@ErUUGm_cn($oTJA($Y)tH3W%([zs0Rx% J>Em/`JLە)IdxJe$,YQkEHT53IR=$_{_,1 \D=K|Ŕ+S>GOCwf_`c7qszT]yۡG x -QeȠ±d3NT,hY4X(*^y` |چZ5Ff hwoFdYo7±O dJkעWoE:Xˮ ʎ!ةhgO`&'xᑃQWIHѹdm)b0xiq s\sMHwUӚUJb?A܌OC%6+a혍:p)m42F=}|)1km&H՚ I65 ]xA uU{^7j+k#,DFh^(\ Au)E#QaӨmrV!Sڲ~9u |axU+*pv^ݣQfsigyT`bt FEjyxUoz3>5V=:W[vHͧc%MI ˓N7Ӫt+UWU siƤ.`a>yޫ$ȾMי6IAɔ- +%pN 3)ѓNlS}灱HP'lFvk$gn+e)Ar S˪ND)Y205_'K?Xcp Su!2V~x]"7mH}(6. 731KW̳"y/&3Tɝ")sF`G}ӵP0i1"'Bd΅'uF۷$,MDq*^< Ax?#R]L'[G{pWBވOOM%yWߌYb@L AS i&BeaF24VVL?^i`XIWטE@bć<y! xjX"ǜy]F^e-8ߌ}i}y&_28=[K~{1 EƢuZCL,z+xIJNkj蒾?S6kO1TJ5$oܲsNu*JO C|WEC^Sꧢ؋ {PAO!H iRIURm;͞o}{6c+):'9_k_?cA*=^e[%Yr:5n9[`.4QNTfnH:n~$$A=xad؅3;Ēi>o7^='5'\h]` )#UT6Y+E*(zn1FWYQ[l xWfvC⠆]~=gdw=l? 1c,UKOĶ4vOc'Iט0Ψa3`1j{l3o^-~VN?Vܙ1EQ=tž;eb{0f'Fvxõm0H(R^+KmkZ&ڢ Q=\)\z8*$opyw^``ԗ NF! 9C`&t,v=Hlk_CwC}}P L͏s{>қRQ %IjeTR-K);.OśrPN( K=1HCCs@*DB)7IZIAKxp\|Oj]Q$!6AW:,-P18ۗx&$,| '@c~Po zB7CLLw#yFM"؀BB)R"VdeۅH9 LA)*2K ڂ2G9s;uTic^Gk%a%/Ć]9j ^M 4A}ݤVcѸ.5%A.K`b]J|_ɍ\AI{/9trCۚwȢQD蘌/64)|ضJ]lԉ(<)נ3ܽx~7=eJ*cTV\PRb :Њ"{I|x%WZf%G!vmtt@'4VP۫<ɣ$p(AĆP9bB͹ _Y;]HOBE^^VVʲ(3D5MFe +lk<nkSZϟŌ4ߪ"A$!@ьdjCQM=ÐJ<{*Ji K>:{&#`kE_ RK13 ;=(" %IF: gia 2 /2֨9ܨ{(oG2r8菎HA уCy,DgT2ĖVF%C0-fp8RB J KIl\Qbb &@3Ϣ$eRV5/eCVC[ |.[_eES.忥6y@sdN' JrBG|i ?Է'CmC!p:9D\~#,SsW3M`1]%W iE H@ HԪ IՇdcPO+\]R-*W"% H1 J_UQW+~~k r3[']JD{> ?fnT FlP_ͪuhR"Tg@NO#ȥ)~5CF5IJQ`~G> 3[2ҋ@|4(2ʐFT0" cŞ 9IwW "材Oh^o)4޳#Y,Xڗջ&;DZz#to7Qs!fGY(8X*80 1=4 Fnꎱmt$c-NH2ea<-KT|7?T`Rkb+M99Z`J O@z7;>T3og KEko~`D)щF3%F1VS2TuD@7б~;d'BE*Ԫ~pM4+Le~ h3&R#&8 {3s{K%IR@ώvKк$n ##\" T UBQ0J}Y*nƙӹ5R %ڮY!_g[2BF Rlh AbE c>B 4ox`,\4P"tZWrZ4 MB 1孴E~;08|k0bl_Ժx|Ϙ"xݻЙ //C"iQ kks' ᏿G?q*<װId|9ItK8x7`%K絾94uPRՓGoق Lm=1o.|waraǀ$hI2M/Nlե螚m"Ciw.nӸ'-߈-yy]_c C&Z.)*dF 'A}ILB+O|I@Er2ஹڑ2ِ= Ze)qYD]r@Ռ:ŀ5&r/20aWS[-3Q,rMߏR% */$9I Ѝ‚' qJ|mg D=Nia!'5P[@4$Y*D:`xYHSzdCg: dgTSUEb?"@P&w~I˿_(.uk6c@ӄ$]7pXrYlEs˝t SGES]$F013dz[eaut`J*`,Fnk;1{&_uM&!scwf`rzfmZ\SyMLmK2̮ZAQ[U;77fy`zLDg DkfQ '+V5wY46\ "Gv>qb_ V UkU- Ţ47U/3y8$x͐?)1$9xtUH <&01jBd\ze ѬD[SZUafP8i&>`ws{DZ$սϧ߶Y^,^_ R%I,eEt^89i[g DҚ ŞO{~&U޳iPEZ%7 O1hB: V+'!l 0dȪ=Nq{kbmԷq[CJп?(oA 0~~V ߓ*]]Cnk50{Ф e^4'?߀Wfq}6?y E=}<+*yoFO >!/œ˗TTJY' ̯Mq ~r<X%jcoFgS|{ QVɅjw 3%J2_(f@+J9$K8nTl3A lZ}[{{៚q5'hyB|J$I%tH;(H78ߣGL˩.GL@5#FHC"j%y^RqAǤkoA[TRK8H.b_dY8Ί+px-$\AF~,,9G2UN tam*7δ'|(Suzʕ,ʤAy)J73ц6ƶw-6}bݓw~A'߱/@gTfwm|{295T W?.v cVM3s}65#} ?;> P,6^w/I/;'p/o~wc5/cw>fX5֗^uSMr?{ףּqљQ-k}'K@j%7$#jZ:WT D\̮!S' uE␶ ׫H"<`Јk@Ҝd+I/z*J!uS-B*XlP,eKc@@JڕCʃrb-U@N1ۆH\La*hm(%tz(;I͇]=N9B*Q7)) s:A?3c|,}Bx[ E/dh>v@ %ӀTPP n(h1 tSň-tD^%S]'6U{6tg MP/&k.ۉNb/Lǩ}ѝ_O%vů1lهnNdk/ U4]^b3t&:?gAIDR;bc\s\9mbb+b!.HWY^|1 &+)jytb,$ɇ c|1V s'WvUuMo/Ȯ $T\pfX/W(c9awk8=ьxF`jΫ1XdhZEBB7et<[PQ"ԴjBExYDhN)!1k".P2"dPO7+Gy]VC4$.x[41קԉ7U>?.EE4+m+GsT͸WI-g.f9؛p767__5pc/5gxG1U]R'rzy `tl~B힀lyvuXsuMb&kW)fg.߳N@'0?d ✒[s{pǏu~O,ַ.9h-;{;z56=g3w2LmP #mit퓘:_WFt_t.񓿊O߅5OI.XՐ^u˿;^ethk_ߺ|uyV@v~(N5,~ k */)Rx20=$Ysjn\O#x::{g~%L"(T}"U5Ԕ8y|7rhU*;dkjH}ڳ>@{G y %849u8쎻6VU B).ȔIK)CU8E.Ke7bj9q–p RS47ޚ!*}N S &]6l?Ґ5ªSwK0C;~&M3}Wo_8^"ÿS~3f݌Cbr(Q h7/?2M {t&Pe !XUR>w-X}_ lvK$ޏb=wb-X߈M<{q`ڬ8uT8m~}N|6V[:szAxw`+HgF7v p1WXE')́||§\,zjV _V9JY+L1Mb,q:3Ddór@oc"/. @PDN\B*_tYG2 3OhȩU 9y7ãmjmScZmdbQłX GzوhH*0&pU hSYdvr%J-Q+&()Gu.A1ٞ P[\G+mH GZ 1*cI$K$Rq@¶QUNSӢT9K}@#V-M~ w\pztsw  Cj5W\5625߼ "djpso<랺ͱ[k{bSo?G©w3bqi_DXe)vn^c77&93,`gb/$sU{͖yLSbս{ Ĩ(CZ͵̂@êVU+1HKARE:{vMţȕILC/D0DV( e2edsO}SvEř0MҚʌtH sA5*ڠR55L m/]7ī[x BB|D"잷6LdfҒH{e$+<,3;I1$;gjDuUsIQ ۂo)Ho U?ۤ&8v_ďDm0Qwxb7@fq=2*.PUo"HfvG-S>҉Ǎ["HX܊M}*fw2";z3%czz$YuN6mp>^m3fO=O$Y$G#7ޅ^d{>OpXJlfu/;Y'7 *ƀtRSqO@ 0aa1tِA֒ѣኧ0Eۜ ՟OBʳZ,)!JuA!0tLx3xա.,ض AõUd/cgEYpoy",M,*X=帴&&uK,>D)dSDzhYչ:n֣$=uPE\#-aAX5܏cBe5H0\qE@3ٽeIeBdiPHv$31Qƙ>t8?w1Z*ήEGM {cE' 7[((=;@(5J!P4cGB O*!}ZEU%W_ޏۿ܋ ,*m7R7'w/~VI=-!(/I<P]>3-2AB4ϰa]Fw4$cYA?3IaU BA>yʢ H(&qTAܵ³B3h RYcφz!KѝѼ_Bq槄% *^8*+qF1I8 (GY t݃y+ s%cXZh`Z;Zع`H콍zzH6/T nr HcQa5:O$/@!!H?}:HF C,I6M=B}&ڂXx wdH d [,1C Ø2psfQ5W{PRƂ{4K"Īb'eaGR/f]8y߷`+q/D04G)j3rݹOyD.8uYr-!RQ>;QZEZgP/34igC2tld ;e53b_kt]I7 l(>NqQ%0J= dh\3E#VcAt}s UȎR(WDՙMrL*E俋 nBblhYD~w1TC^߁wL_l0u# G;=QLLOaz0s0.hv^avQL _ZL3#Ypap`wvn¼[xώ' ۗ(iloc>{]8$6\|!6Oa͸>Dwv&שJܹ5l+ W`fx13G}>O,BDKد@ot^?X2EKqhI:E-0aY]eac V&r͂ ,iZ/듔؊%DVIv+C SpolVUu Zu6ʍ4AA\f45;sUKTԨ)6#SCj0[1ƻpu|)$U&Mj>W3a(c<+\JlW捰%9TZ~v^:a6$w ooߎ{٦-Nq|ZV3 uZPq:3򞝓W^LřJvڎsrMIjW2xz$*Gp*=" aYlxݘmJ1 *yF|F`I ~,fTnM>9:'KŒDSnhq-LI`&$+J!OH-rոM>ItøHsGؽIm#\(U#0ܨC3W ՚X{wւD!M5#5\}3FQhД$)$ޜ\<,i4Dg/I xbuꩃʃ cpc "kT: C2kF3cMtPNƍ!IPP0 W@R›.i (hBRF -^HU[uI24*NViVFE3dNLbFV$ȕWEӨ$C^ϸA=CQ88J2tRduQPA;N~[}ʛ2ԛ鱾[!^:^U~ rc>TœgтFRTB%($ `x堬2Us |:Q86$1pP?͑L5}Xg@KwtaP+Gt Vb$ixkZV"g2I"a V%AC=2 r܂,̒LK˄03T^2{ݎ(v -G1`ԄVo jž_v ^H2VR T({i _n/[!}q\R)o0F]!-\ Bs,c 9>;mq|{4Zc TXgQ2t:ҨGFD 6Te6 U$C+_'CJ3o61N赡SDR֬J yǪwTE'@ ehN ##QTy,pmr'FғxTcfA:BH@NyIn1  #ou2TVR,DxaVIF`UQtbHH@ZRjdX9v+OA23df*@2*=`epD5rY1yaG* LnPDk T<3]_kCP"3HHNo7VaB :qHƮQdqp T`VI>8BeW_' Cg.:=(Tu{j Y3Vv m9r% _ PI>hj ='-A'(D{R \j<8/~~ ¢dy٤V {;1Vd4oNUcdl|~ k!#h`Kʃ" hMX'[!Reυ1dfoPR<%+ ]#JֹLg6 h׀0"liF9/VPb\Z4ڬׇ3!(/*Ҥ/$:ZƊKc")AvcEk/$Alxw{s-)VC2d8 u8`rXW"n I17/j䲵8~ n׏n>Hc `m6VrZ8Xs>_E,߯5H&:O]QuV,A0y/Ns#j\//&, ,*Pֱ̓8~&4jRc1h Z) *i@)Ij`Q6YĤٍ]!P DDKjB ៝W19 JJ*] feϕAQ#J~BULUoEH ֝$8 Vt2Ԧ&\s%FmƘ4=@j4ɍBV3 ちC(ƕ7i1iE참F" 1&bjr SSsm8wÝ /ҟ9,y*h@2lîY hJIXً&,+xrI95Up _ cJAY}jkzboEè/"%^j~FI-xfuh3ddΛUz 0eYcfCOB& T}|3/ CD2`L8T9# [ҳd/zxE%=$.iM.A^]ߐaBiT]?h٢ʀEhй%e:q1* uT;dCGo+ S܈.Ko]Ix\&]BXR"=Bb;g A Cxjr+'G""Cb G`)[x b<0ɟ} ^߂>a |VB/PT]#A=*& qMwPK-;1 R Q,}sWT8( RQ/$W0cRTF@vhpjb}?&΄mDfE<+HcjeWgYd `h2A)Z+ xυ!.KgH57ne &*4 (E4?t u` )q=0W=Z%`̗+A> ,Wxi%""8oOH[} >OY^{8!~戉j]IHB %H (I:1-zƴa ꗬA<͘SkTlC\|y6u"R.q j+{o?e OfgL& {)\P M utZj!ŢQf }bjKPL(jmCLRm}B6@^o PgLb:P:SL:$괠I#s BB yH 'Qв UMTqW|W'JCqK^%tZ =pd,CNX&tʌr_eiTRYX鹥P|q4&,hHJ[R5BhWWHImMhE Ejs" )b|XB=D]A2ǤD-Q I2%bQpWbFHchLQҢ8PAAUW(9&ii5&81o(pRW4&c缨6 ))gH_k/2~Q|$SKV$0U4K4>,OEX3 blNEP$<Ғu%6&D5F")jCNWEn%:PLZDhds+E!Q%6 Jо(kj;Dg٬+ykBlB4,dl&d}RnCVU'y-JW3IO+_x3\~R}'Pj!pDiP+o" 'rx Ğ5`ӦUՒ(ɔyM P2X) r/D2Lf p~0*hN#Qa4U$^h<,}JIIJKj /$>q޷2&G* (>%O(Z$ZPX4DC"0TXiqU0HϷ2:x8PbFY^TC 'xjKxے%kJ$&@^OWŤLJj$C=b]' r 9I )6V(m̀>_xܧq#G[^̆BR%[UF5;uG9SHˆHOIEHUnfA9ZENQJSdb¨wUS#w {e{P4V;Z(KA48DQBM*jayDP˶(</ӞTIA rUo}R$b^KĶ 9@IҾUم_efc@NJZ$9n!GqD?ɠH!^ uD)LD.)BKscTƴR*/#)'J'Rw ?[ O2gRK|&Cc:NCħRhNq: jKV\2T 1 tCBmȐ hOfmjVT1Aw|.|U[p_k׷e (\4*g${士굟4)u.N ʼn" &>!,6;+_ =rBM+dWty^JK}$9w=Գ~_ܰ{𪭢o Q03xWyWPAN 0 !xEO*AP7<<#}MN(~Z_0*Obc]61 Uui!1d2BTitSa0i@ {M]OPKhZH mŷYpmCI @5AB uYzflV XXA-,h0)m?d{*4-8G#=d("EL&LUO&m#VN^Cʫ*Fd}w=xUkøᣟŝ'ΪQJ4oJꋪJS:B3R=6@" . =D::"zEO 1&$xHQ?U@1Z`$1$Ti=B1M.1 OB\8Hf& rs)qք:o\ g4ABI#.^Aɘf~qB3z|pir+<J[YJQ=?"/ u&bL04RgjIJPQ'=dHd%22T%9ؔ"dF) 2n抦hhT|K^85_T\8q|Y*y%i@% "NlQB=PMmP"D{5 QƒG;>}Vs]$ȸPP8\H}TEs@HxʔI` AZ~͢ʛ^K N/B}EB ^jRt'#F' TN]2"h~UPhxT@!Z|ޔ# ,o 4h UgQ\%{5H 2p-uCVid\ 45EQJ=TYCqmxo]?f|:I+@I` ɝ+t:h Lk 8+IHcIV! ']r_,% ?;jfȅ@u'm -J)?r-$͔BorUʵh64~4L #M @_U^P|̋'-|B!#-= "Dp~ TM#DazH+H'~.`/"*PZT$,Z}lY*U@ AQs{\]tceƚectD"$4 ڿW**|\Tv{%1Rk2[R>&|*6pA؏%̑V"M!Ϣ4 ^nÂdl"z_ J^dZJ$ROXH#?⨁ Q h$S9H@1H<&ŪlOFiBϋI> T+UP&_IF_NTjr&w03 lSh>8lCNl*=Qrv̹'ov1u_7{5ⲧpC6yYs@2RWu&Aʩb) QIb:'V N>3u)\}EX8>7ki&˩&wHj$K@X`giJQ4ɕe~I,BIsUL:qXF1dhI%4'}d"v pjE2 ]r *ogH@"e$6hJ)~>iK⊥g%5CDsSmL{Dlc ]94f}bc7TW;@SU,QeQc4+_!W꽉]%@A$s"X,"DeN=D8cl- ѐTA5iEa<Z{IqRD$O\*LPa'f98yd铷?>%ؽw(y m`.U/;ڪ3.ZZ* S*J_Yѐ\#yN3JaDff1c2lvVK U$$(Y#uJV }1Q^:$*Q_aяJhLz2;k[jhx0JENHVd#(}Y?df)tvcD]Մ*(^ ,p*զhb٧ӟ 7}Z~M. BB5bS{S[:b$8/'3%7D%qB b)!*peIɱ^kp)7BX:p[UAEYZCuax+,锴r3we.)bU`Z^1F()b Xdm {I3e6+Yqh)"E)eʞ6!f:[F Q4Hf*B%ؼ7J da;({&] s 9dS <‰,a!Qt9^Րw=N6Q93 HTJriqQfK>;R昴vil4tK 8VE.I3C$'f]vQrmSr6;z\Po.~" Ɣ.p&-DwW&~|,.TEõ SDjJN0p!KKs^LÀB{O}Q0 h㺳TU@h! P~$'E9jkRW6QYC8EdlmRZti,LDI,d"Aԩle 4G\1)dcf i@K dbOXT'\PV3jyI A1) JL/?fݣNBճ5%D% "]Z$]IM!iAơuШ2%(f| q/*wJ(qQ3R{4,iC2lQ<"5ͫU*IDLB"Y2$I]DDNY)?IpTHC-r.Խ~9U^iO>qL8ṧ)P6t E7D8J]*m =1`Ē酓&v xmR!0لrE5Ċ5Ejh6' g(z2 aϕ9U,+B\z|OCX]{?ֽ`R3[T}\ ci=8#MZPqB;3&554JtL8?=<#'%'99Y{J$=cѸy:ijTB4*Y8Ox8Jr+ c+34|=tv Ɖe@Gbʫg,i {xp_xk~|*Hsމ`;(I# ]ELL+K,m^;M.s:ˋ/i.1.[p[ވU[O⮟9ۆ~0ya_ 1jهp?tU˟-/mN-osIHPKp/%W~o_\^j{ҶxC᡿tJIҮ~*_u9܁;/%]$l0}LLb{Nۚs"ܾ޹^_ q<7nEoy{z"*$ٔ渻hg6Y_ Ϳ'/߅68WcI,~v'l1:6l|ދI@v9IO5.=kMDh)!8^M7÷{lx3pcND?DZvcjlگ9OہF?I]]{~p`F_$D[ߌ/{{zuX}4zI\f޿vs {pXu%bz`o>}[Tm]2Q tRal썳e!ǒS9?f`C5or JF!(6R\cy@JUX/ pЗ-GEi6pD!lHU21,&ߥv1,*PT9@L푞xXm뮑z54X K|4! T򛴠?Pԉ?g2tC&!kN3 Cg.-d!I~aݒ]VWM21Դ`qjxN|DuOe*qw_7~a U9Gn)5-$A˳͞ljo\^f>n-KYh#7`mŠf&gné}IOzG?G~UW^w-6v1zt!U}5'ā|^4ȤYI¾^"6⪋_ pΛq{x. ^v/o~'l| pΗll6|_\vd5>?,<'wa1yTI{o/`oWK1nb 50|a'8_ݻnG$%CS<`ŋ)% Lȼ$ ahc`ɋ 4w<ՆDT %-Ɣ6 &I %}$ى c BV냆ʾvJbD<ƜQ_P1kGvx^(hNr FLfXTDHp^.f1*r2(xeZBB_I}@Y $C;h܄k(Dg Cg6 (&:1٩#8nUR V}E !㙓}o &R 4o?ź'jps ։#x76&7_u+CNSwb'5hȏLMMv+=e[񝘹`#s0(Vz/rQ3C[3[߆sh>yq=tͺyqg =7`Ӏ k\Ю{@z(2Zalieg6`!{W4ɇ6H%L:f;>N7=`"QUSw~7bbFq ۿ;ymw7 k.;G>wx7xt$SAY_ua3fT(5Ӥb/śzl}?ՁVuO!<1KoU"UM:^2?{psM:aOxes WDW6&jeR,?4VXp2p0I S0h}o=ƳY$:-%He#,U< χ>$vlLPXIPFSYdAZOsq_1~.A f_y;}{|>k~gX}H{3]57W{/+]ILn?71/f2N=xI6bb}7UˉR5{b?sb˖ޯ`q:~MYY̓tN;͑_:S7{jf6[VSukߌȧ$>w%*_|}Ҁ ]Y,;\yƦ=wp^_e+2xv .ч&5Q+UjUgc{;;d8~',|ꋾdiAm{Sgɠq =XXȖeygN jy4C!Piિb*=^lxЅlOn'_s ?am.hΫ槖5mf7MM=N61A X{3 S;Y 6=y8rÍX8||i~χq5rU^l0#Kkz%.cW|%z/ׄds-Xw&) w. '0BVbLm]|nǑO%o$\G#=EӡHIg?S ڋjN"bF23~>lX=;!"ZXW >z}HL™ƹ:U%NLAUCQ(cgR%8^,+.5W=H=Z+ЙHbP,E<Σ>+jי ϶qhr |f49# HK Q9NqKwXWaM\Ov]M/3}N(mHf>=`󞼤Hg=w4@ ʣj=EFYi{˷oLGE*y@:"dŧiR]-0+y%bSJS%D1B:%أQ?U6?Hs,.M.mPܑGzNxa_\5vx|֐g̺>fz z}=KASK7ϹA$}ڈ͓[góz {?7 4lHͼ 01XZLo]`{:}Q^`j^k󗓆GpI>,EnZ~}Q=~?5 Ų~nW}"FC}`|/imkT36s//;{6soi>8$'ڴ|^'w/<_7jC`WIXԍsyC7z츎1 /}uS}ާ"[Iʟާ{M<~ܫb!7+Auzse_ρ9AoV}CUB&Q֌ׇG}\$?dW $,4 Y|Uo[O(\Mz\-x6c+, x9tɂ֧+6Vν ' p/y8z㧱i_K,j 8~Nm .Ŧf_0oOŮc?YKZL_F%Ohr{l|O@&<'8L04*鑲`DhHN*db,wOOqnb͓p};߰~6.!}wo&fmsm>O߯0ZsƐDN@ $@22,VkuUjWiPUUj]ݖU8A Z2$ I&L9'9O"wӽ쳿EIb/^{;g}^>\\CΥ]ᢟy-=6p =/}nOwkRp'ckq{Y= +{am >y7c[p[?}cC}NLZ.l.?ݨw?Oܖ{?O 1Vm~\7Qb~ONEН(8\ 6F dBnXe|!-*Yb=R,H3@yNzm Iy41(@x*S QPJ3d,|:ϜhkotϫLx>WD-0z9uAJ +&ڥ=$*۪:Sd] ^2#?5*d+KZ 6iR4s&gϫ,/yI2t& }o dwJDl?ӱlAˆ5qtQ^G/c' 2{އ[_IƩQbܼGm?'0;?vq8뉏;?–7cO }?s9HYXG2K&9n]rZc1=÷-]q-~Rz%Iӱ7ƻq^Υ>>mٴqvQαeqtwv A~,%mivGq;IXN܀~GI]*R#Z]X9G:?ӓ|O }Ow_'Hev^0N;ޕ=ʊFbާN*Pw{;?gPc/đ^'rY Cܣe"yϋikT{L\_K1WhdIa^%^*e|{CoUOܼsdTo}c+֤`g-!>See}zjN AM\&f A2F2m1ךWK?4KΊ1D)YQy߳'6>[F5j.7 tS7GR}~cÙ!྿{7N߳ =?ſ&t\nPavobEԵi TVEk) UMsVh1es>} thU%]sn7WMLOv'N3?c <; CW TbB@ ɅseOP\.Z.yBQkEb &ѷrEsuTd@x\$KW9>XRKRb/ls eZ0)Q,Ujոىd9,Je7ݖyR &YgʓÀH|SX )yY//~Z0lNj䥕(`FP 'T@<9:Υ_bP83~(IfIͼ?"yxfLmL;yw6x/9& j ILYEn:VUo80?Pu̩Ϋ ?WeE.wRFie%G$mqX)R"#PL?Sߵ`rBA!m \TaSi?CeS/EJ 碷;0~gX5QmTL^GJ5 _T5'Q-YP )n,K4z ɶoV;SibP>L$C?d$ٽ|tݥ4sD>8lb$MNh%S ϡ?}>*MRr;}mŖU]UCLѩ9SN]+%7S;x%4#']@m Ыw0jv L u׭;+>DZN]LYJq=. _% 2h1\~9h{l*KKX"mb"DNpcI sp$ϗ3F kiJbB(^7H5<=%M5h2Cw$QoY1urB|Q++xm&V%zQh>ʊ \UDy]bռt-kp xj-(j5}UcOTAT1^43Ox{d R*'DK,Vl:n&Em2Eq?Oĵ!RuOR\~.(q=/?Ӥf])i%A ak5 0C.Z,ӊ G+$Bx%As}R `k{T+5z(f fװ8Й߾*hEkzX% QoPh HJ`-m6$mCnFnLi#b8V\\/ чԗ@L96{c'(9a #Q M%RW|Oy=RxyI+(5*QgJZJ^jbJìL("*9{S 9k6E e)y]X[4VDdz }DUy5y[_de&F8LI*CȊzU@Vt% / ;g#Ί>}L^lſMk}4CℐrϡqaB8(ZDPӘ~5RCn\Ux hR/@5,YyU+VyoUo (|Vp=DsoI&}А]`^u=RZR)xCWy)2h*3J'Y}͍"-6mJJWCf4`yq9gS;#rn]=D4 9kжZh9H'˥ {:6DaU51բ W@QI߼#usSLBO,=@!ߏ?_ͱjigǣiBhp<68]wÑW9ҁBp~nb/'B{6\y?ž^cgGv]ҁy;pz5\E98Zl; ?G|xesq?f5:,l;p+g9BP7uX?}s'6LoesOԹBWh'?l,b2:;;g}24/oy.x Ks~8c/Bd' g'Jdb8?^Z9Q9Ϟ"ީ=ˇ^'͸+0}N+&~a|?pIA7>vvssb :>`4!h~xSPCbmdCVB?6ggPA 61T<{GFczi7^K6>mG,ޝC]2eYJ@Gb B#J.UL~O#:ۮP4!Wj+z&(in+%YKNU @JbQV*C0Z+SgpF bb*05* S : t]JY7?yD+a3Wrfd_u.g}359{*{+jpH-#}f ̰oKQR2B?Q6(7\⯞c7w]6~Q'48Au;{?~]8ϬwI 7VDwA^Ϛ4N81]U(F})owJʬ3ɽۊ%83m3z-Mw+aѥeO2CC>/b۾{^0`NJZ*+E{kxi*P,ջ3C=t{ͷ\%&(Le}Z`9ޝ x7B?dW4TjcfO&R= &@8'~iRO;ӧk" ,6T>CLFaD{@ o)b";)kZ!Ɇk/WTiCDΊMw}c3.+_IE x1&.;R\^۾'g1lyx\8_0ԣ݉{c米ljuD=q?S[W}O;7Kޓ˱9s"wE.zYw_/Ҏ}evʤkv۶cޝ1W܉ݽht8qqݯ=cz!<~|t7v'W\6C8] Xy/=񳝍)8i {{{qd*/Ľxoj$?{>C< _OW)c? >(l›Njxwc3|̟=wt@3'^۝sMw0]Fty\/1&#\B+`l0* $cT#p% P+Db|H`׊W2h07M[fk4rU9՞Wk* 9zC^/qﹲhd !힔Aa/9{9N!CQ{n^Ϟ/g)A-' J (t*g@?V KÇPH`X9p4-uI P[9 .+U3;@MqYK޿9zu^}!?Brc\wyIϟyNtNMuc}Ɖt`O*'})?89gr9휋Ɓɛ>c.|>eiV=ݘekGwF猾{owv?NNzSwe]9SwOMg>L9ur2'g;g}WhV>JVo{6{u/KCQ%BǞ%?M;k=ۏC l~xe1=y侶l88uwp܊]_H_5eJ];8z'3<=nL.s+;Q=nLԊW-ڬV$( )̪ZSI&p%ny볦Yw%n|\#ے"F:;M0m$nO,u$xFQ3K X~7ux˕-ϚnKI>ױo,/W (MOa&\7ҟ0tV/ovߏ?`_KRWxZ ֎Ҟ8:/qyH#h;q|{O%.}&y'N_>/mյg>v;nm8񼟈9UxMݦwѽvIw/=s>ߝKsnq%=;7{|_~U_ n";My".mt|`w_zso{nnV5'4/%wxl\}pA\knö㬧 im<> o}6v?e}w?nw\܄k~~%N%oYqi7uWe6nk ^=gb?kM,Z+d`~Q#q9w+Od9%iH&3=`$U?$}:a(TA'oCK+zSFfLhoi(X%VkLXZsR%֠~&2a0񘳡]TqJAMTV Nӯȭ!qx-TT3 )?ԜiwiAvDZ +4F'8^!G 23d ֏_?}G|j"(D JhUN+|vzv-?`ie l Ldonrwsj'p} p /p_]V ~^6i]XߤzɄn9|ݽ=q<]5>{K 8ܻYqwz]_ꞏ# Mup{5QtL/?.%+pڕ9u;do*|Y.3݌;}|SĘwt<^/ƟbULggxuR|6G PYF,BhY2&^;w+©*|6Q%'EEonM-%,LPNJ2J:#UgY6˂5 B`To%LܯW1 R$潘ϤAx\ yċxB@Ц11Jdr ,`-P  eL~E'VmhQY_ݙeB ( :- Q@ʔρ/eÃ^5K!S) 7\F&,y 8uk|-7F5W rbkC# =}4+yaћp;|ǻWx>rxF9vދ[`tƩ[vR=JlO kǭ#'GpW#a"fy;!+zih)jx)vqz I,#"febQ!=LJOPmae9xspeFt(-/˕"UGbkkCV&imdO}?6wܗ b$;/Ͻo\)l9ΩA|.kMnORGnN~,mG69qx*٬K99*8Ps">?U/*d2y0pUToU{\w=;EUNJ fѨR'5Qž|ٶ"ZC?:ZNeP!9/r(;vE\ am1׆3]vK+ig㞿XҠ :> ?2N7_V)*=Lн`(I9tn fqb"*0:6v`k]r8kLU{{/ _忦 ǍB1.-= D1!a@l;xtPd׭NzR&.q.8({qޱozn~sɳطs|&Uf89݇7s)e}7Nkqq{'z;JwnN_X_\Qh ?Du~?/1tww`3c,MW=nie)?k7}foێG^g}I̽Ȕ)RcLdŤشæj-8O+/DZp??ѝsau;O(m8~u{^\ӷ 4Q":xPzηcywa^}w`Q"afEo}!FD}w~׎lr.Dž3}>}|Ǐ~{{vRwҾf '쒢t Sw״ʘ? G_iV z=Pm7O_]7:yM6AQ97;{ .> ?unLGJt'oH/ɝLZK[Z/}68lY~(,mSOc&J(I"NcSWA3B15L;wO${;nOι'vA4Q6 lz˺y76VoО4T܃ïxB9Um#9_[S4XLݽ_}O;brvz${yo蜑,n|˺هS7_>Xɸԧs.|˻)bp}@ yocx | vS|(j'OA,7f>%;So~hatLGhL[9gx~ O܈~?~k.o;v{fNb~L>u2^U"j[A,ּpbULyâJ/+%PN׈Nd6, - wgI9l&X;44H(a~:*oa2+0f %Hn٩ h,RY 2'BV+AŭHW\}V}3;'<bJ^ī ,*CBPT(:tq6v^.~\[>. *VNZ,d VM DŘt_g5-y%|ҙ{g=8#?׷ .]ᜆGDHs4~v<[X)e q0^ǔ 9gyIV\J6CT} `I'EsXau]*%QMuu1͍B-CP?R/ʈhȐ7\RHcO{[T"T*;"?Z9莠$}#F:b]oY 笅o7qTNg;\l1,ɇG GfƎءo3c$Xɛ.^@zO ,3E TyƶlϬq/.~guBE]L^T<]Q5F"$ŝ}}J,|9$^O|.*Rp5@v3V{W+J٧֢IL:'ڙR:^{ VF0u,qepχ?So~,~ׄ2WGe ILW|J-ٛ%2'GiTR %CާDWs$1Q]ބ#92㺢zY$yޕf+g!ANBP*iETJ{0!iLے`N $">Ӵ`= % Ek;(җM$, HۍITklQJY<N٭VGY$CcqQ:7^:-ДPhv:HJ*r*rgStUհ1ji0,T}χ@V6yMJ>v'(Wc5uq5k&cv@ NI*ыJ+ZcL} 1([A-Y9!r;s,ZQQTFdB]X= z3mg$ ??#'W?:ŌDhBzV}%ۤ ʕsN|SZ_^laPx8W32Y5[C㨍>/^\\㠕xUкUR6;NUyض7k"~OaO Qy23{tl?ڿGzW,9Gbev:YauSe&zQ,Z~.Y.C-(N--SݟshƝ+"qCC/=#:[#yyGqoɀ]=3EUw}RyL4G~/%E6=2Ny")aţE`R 3PTdqNɵ [7&b_Cq@Zyi-H*FD%/$/[Oc0 FrE6Zwky$.S.٥{B'Xu%E5{gAj(~-(A""pU9F]_={Dt0;NU* jVH!#*qLZQVĉL2\FA%I41+eFц^ǽ.|$*J`7?=hQvX KϐD{ r}VjXv>ǰَ؜<ɷ$:H*X([I5Jt2-)Rk=+0B5iz0 bQ 9r4E܈ѐ(aTDxUPŋ*XUr24acYL]Ɋy1ϒzy>WX}-Ghy kqxv,"䢼&^)\5A~Y 1z-aL{Uܗz}&E%DjGSݸ6$uYY&Sx>@T.eeXgR"^?ŏۍ݃k?~_WSQHpQ6r&]n=!7}{M@2UƋS:y/R~m6&ګ_.X᪓D%&n]S&WiP%2_+>`pv}\*1eԫ"ޘS#g=!E_c{{ڌ0P,b4,r^_KQ))j) .٠̡}..b?jW,}+&4AZU2,Jc¤Ka"'ҡ'+R*@ q eX*q/jC=TX{%cga7曋*`(h. yQZc 1ېlömqx+ӁX%Z% |HY:Ȑ{ -+ Wi\g7cVQ¾T8Kh*P` 뼂ş!$lG1E zt$ȫsթP23E]^!3x-D4(S1RxjIW_Izbe)VbbUSq_>`02) (Y2P!l&rhTVT_WTp3m=u1D CSj~WcP/3 -yv]IVxYZp>YżRs<-8砅 o!W+j;}>\)e9cV2l䱥(qbZ^uijoP*q׊ӺTDeiZLPXo?k=m7.(c6x(^$bRrAF ٴ/ONFF$+6BlPxhhSb: J^E)98f9TP{,3&&9H E0Ӫz8Q2 Ef zjAƱܟQnީMx4  XM|sf٘|@ ',y.P3PM))+=`*Q @.]0 0=6]-jr<>à>V cD3LkY(gYzOL'ڡqzw:urV}ܢXQ3K*Dz3uBJp䳹\_ jҋ)rkpH(vWtԖ 'THLASmW$ި,D$"*n U زs0ojPbh=BzH:'>J7 B3eEl(C2g29k*HBapۨ=NFE}p`[ }NI@I%%H`esWz.*5*b)ձœY$CcqlP3e+y% U?J!>W*XTh)#n^DzIt<lNf|.Fm|呋LZ(ZkjR6#2Mז+P<\sUGr^݇ n'9ֈ>]BC2N5=eTLOy㐫hsV}N,=d[ +hL!ܹ2+2DrpkvY3#JcF JIxd ho;/ue> ,& z@$USHB&cb&uhӝjs:D)2#jתxgY5Ŋ D}1,u.r͕8-q %#)D<*U:+WE{j PәU{3"o(j5DsX[pB!Ky{yyL]3|Y{#ZfY"O2~ N"SSP2P)cYKHਓeR(mt2]g#'fb7cϕT̽ Kd<@U*j4#T:hw?PDR8Cs mQޕ߅g{F|FF`̫Ì {PTezs+$]LU! /@_q.@5"e)1\S$qDkUR Pцƴ,ꘔ1d}wX ' *pz?Ȑ3e_qR<@.t$61@M.Ju+3\sPqH(AU&D1xMHkRU+s+X[2$ۏ;v;W{%xWYʒ$2EVjf'" e4LPIWQkRRPuxWC# _('KԈi4ܸjZI lmsJ4Hӕ7@Cu&M<,B$35%eJlXiw12#Ѿ**,yrce3IsJe"wUjr)pPA&*h@3dY6TmpDJ0gx|>zAU*\&lN^+Ҩ8v"E^D5-M!+؃f9)UZ$Ccqlʐ'Cs*p_O>lA\/w;#Nqx80z%(RJjbH8)$46+X!3lM%v1Mz-/92Zc(. 2|ǓO߃C`R9*M u4v[>IL*ReV\#o W ]ꂽ[9oVVJUwgOVℱG˞lͿj˒@ֽڟⱃS̲_sB  0:۹֦hS@{~X ySST'[PSG!?GO85Nu@靎^t0j8F7ΕBzTOZkU:^n[~'\lB;% a¶71)"4E28f!#r[>wiU63h*UM<*Q5 (J%gc;G=H6lXվf5`QIzUq U8X[1䛜%ZYD䎧>l7cJX(o\DQe `D[sU `x4pԉdi9sջlVW͉yVzJ`xg^@ O9alkSrG MQ3Vz&s@j0[;4 ( Vu=KIs9 W I)M gn5ZحfeNx꽕>+-ahn wQֿu_1G#7TY2[☛ Skŋbb5Eq.ׇ7U؈ &/Cs'Cl,-T 3\5x0UW VB.3=g͈wԅg|;^D!$Cv[pB3z P6mE}9B4(^|8L{w9.B g áܒd[(.{c\k})f,Rc/2.P5Q#i[.|YgъR0~e|ȩ d ;AD}R)s<*O^IPP@yzYq 3CqV2T #A@cyYP-*7 .Mym\$CcqllElyXۖBiZtUFi*kD׍E:4=dJHkAj̵F/+UTUE/!⮓b:W (VYշE4sY?.]8W2ilF1ss{S8׌ВZ;k6oKρY29RQu2ڃ1ST!TacL I%obHޓXU@*k_ tU5P6KmTӚmZ<笓fbQ>E<tl[Ps~~*Ka+WCyJ 2r*1kBhU}+VIbgnrv q=sީE28;LɣE]G'Ue̳38Ys?JLUY6:-ѱ'$m$C?E8k Q!]ꔴ]/*;F]a)T bIUU7DV+BC9 IJ6'jX&rG⽂0ƬJ5hdg^Rʗ.MdB5n#&_%.,7B1rA#2=^;SAMRBIl"''&Ɖe,ھh$,@;Fݛ5EO5?WH.=L'*9$VqN0*k38uJ2rԺKuQݔ^kjZPs HU,,W%Ң+rǢghq,~y+|䤍[+N5r+ uDw<ܕ'f&R9Ɇ?`:m/]6:SP~?ᅪH)ͩZ5A*f)4¨1jYr=S ]5HZ-h̫L EXF+$/袙]U\ݨҠtHOJBJr A;(!Dz.2 #q[feEwSJr4MkJ @,JbkMч7U>Vg[,+q]E28?b>cX8>spBZjw(DB>85;vWH4g^#W R57wz(mUiOo$݈E+FS#\-EQ8lDjM_ITkuaV -b[IKs rcBgIcLd{J@b\W"!*XDe9 u(/'EPF r#5P5LǸ4U45Uq/%B\#6҇Q6\vAe!Qq WT{Rl\_֣ MK&"Ң Tp|TI!fXzY$$P? 1h^~@YK,Ȩ`X`MO|UySyZ8`mzQ7"#$GK1-"23jX ѩ4i8Ժ:\ U UꬪJw(eRM* )%/Y껬Kq_j ű869Lm̥6\@J#',i%qJ>g9jJ^yAF=@RV\"1pu4 7<Ҭ~y 8>%6񲂒@!AdYHK:B{m$\DҊX7`"?_O#zVjeMxs)%G'@\oM 8(ϫ1NRH mZy.U7ŰxJeH6&VTJISGX2c4n )$r F@zn6U4X$Ɗ+fJ>)#R,+M\8>/yk5,P3dSLUQLiF xcmO9?xR!UTGTꗇ9@*H\ŲhRTHRQQD ghq,GTi(JPZfwcP}O6[ opVV()]G(yHآf624%O:c L: fh0ʴ۽SeCsk(q5ɋ fRʃ@mη\iQ3?n`W~~ ӔU^A1Sm5B-K*Tc$  \eQsQ8ѷsH04r,E\4fYjy|3/AYUι]lvmM$0Tbf# E;4]lT,'^oSi=w6,YQjk."&bnni%M˶)4UM.ű8r:d6ОP~qmaRP~'=ѷ VKJ6c6fQ 8/-ׅ~<(YHJwlj-71h/V.Mu.dY>Jqsc 8.V9qS4Y:>VDF/W2 T4ǘ:EmbpB@>Qѫ$\ *tyKf)45sZR}%Ϟ#⦘ %Ur Y. wJ}]HUtlj+ hkW2fz  }C>VTɜHui|Ø;X3Y B[{!ًۊ>5EN$W,ΚXL%"$lE28ǜc&FUȿuxU w eU(9N NQK(uVeoikRh(57gNBbJB6^(A{N9 ]DFEœ6^ @<(րb)9Z@MT?e0&UFע\fri{G6v+8$=k';QCѢq5QA ꈱq%johnUQ;J⇛(<4څXhX+)s>grU71S I\y`-Ħ\$/s܈o $c-UZj>.2ZǸDPH/I2>MDiq( %Duo="CU"F̸[c-fAM>GFd&b7Knwhs-LFD4'q > ~'$-B= :e51RĐ*nRO&hh@fASB#Nwe@7KRh@f-mJVZbD0嬦+4̾i\' zaZn|;&} # gⷑjNtȹLC" $M H""K砡Tټzw~>'Kf^{H8BU ):w~Z"QK׆ u r :T`uɅyЩwGU)sflL&%}DȴP숪'Yq8c@6 =SMJŌ)<蝑R>cVӉ5yScM&B}QT,"d@X4z6 WXb067"V{{Ăcgo-khNdhq,^ ԄܴW$ 6`nF}}hSy$c=)Փ#J"JrU~ud~o1hjynjM~k]@_j,蹢f&xakpe WPP?1_J*( m*GD1ߔk7cJۨ#ԊYYg/E)bI1P4-w9 ,°K(h`S)Yp/UA@hQZ0DnSԜ,2O 8[d"|$|r4rc-+q&âϣً7 55V%q1ɆsσcccV 9Xaޖ!"8{]E AYQ9{QLf c*oIH )xe{/ mz@[wXuu(&9B$ZJ^*9 #8 )w@7IEﵢ6+wT$4鸏(CekRL#מo g&`ʪLU 6 2$=wug*pKEdhq,ͲX'*oQaJPhv6<˨nRH хŔS>T@tU̪@\quROdz ^H4&GC&о f]RNItÓ8WD"(c ɣʌRRz1' J~D v&gF)k˽1+Sxe^#b3Ӫ wAGݬVKTƞ=KbdޚA}t_\HZ9 U4*m IʝԷf$; FA4YƳg$\gŋ͕H=NZk/yjZ5H]QE̜`,2]gU(*-",,4Z,Ttߍt z,ű8AfB:bNޠ)Y%ZF{^I,PdN}]Nf5{}6bB)Wrp2%d7CY+:DRi\Ϧ$윒33YI~O{L9#{~P:Pa@s7wF_Uɡ]4*SEȒ!d9$Q]L<-6$i]2Umvojj_U]*!"MC!S\4@`u6i jn['!Z$Ccql 57Aj+6Fv;;*FN)b6Kdh11_ .7-M-Ԩ*_A`PzOuqמ>E9$x+YP"j t)}@fjzNzL,ҸfAjƦ&+!7β){ b&9'@(5Yo,IbMO .LQ /8UĂ221S4MQY20(፼FfaP\9eAJp¢媳x(PiџLCoqfsȈ4*orjsI%Mfo֬ZdU5[oSUښxDCi/c̏b& `q7`؆"Zc Ÿg夒eR[0@WQ)"*!d+OELQ>"1RN~f(?]re5˩:Qk Їy Y,y ӢTVtF4^Jmw1P1nLT$aZ]BKrY;^RCV^Hy`Z H'x;ksLCrQI- `3!3dKA{eH/C!,JlB%?QA)@rU{ٮ!%x&hx="Tymd*'ˁ^$b @" $"AVBXhVio=0~HX1!{Mf'ZbjPrӣd/U:Mdr>b 3kn0Z:ݣ`Y"]4oxAj=<15*}<ä9XPG`dh$*k"3c 5J:UX=5"OW߃^o hٓ UԥX+i~zY#NAY Yvܛ>9gXݫJ[P eiPHtFn!Xu6% ,)0x5$?+KŪ &8GszTrmu;CkK$rX,Z,S(a-JaVȜH *~ ?n -q&!hjaQt|[>9ˋ6_o*84)cQ=L4SZ=w ) $;!]@Qgm t/ i`vV1XYXlՉRBꍕ2?HFU8WW<7U`@x78@s0U3eDryJTO#is)9uV@i"`g=ޚ)Js,T-3c\JJbK*oLStSb6%Q 5>KF)zZb E2T\=jEoJbd{u87-5rϢlZa]6u4U OqRʳ|2N^=fQQ?*A@ eEnޑD<ȄԊ=q++hwq,y6lP8QU}~7E5RBGU.Vr؅?NІ_ԁ +[1;9;+u 8%o^Ҷ枫f%H ;и?9ϒ HlGw46FvYp!}-{RYW6#M\z̺OD.odWalQ2ͺ5fbʆ+k1\ʣ0j߭!hU#+vA==Q|P2>zZz_dQ$Q 1zlgc`ompmT|(}*Jp"g [I=ۋm]0n]bHrkQ ~?M%L`o=m`e{,x[ r$}_Kzf„Eϰ!B S2d:E靖<ɩ0\NsN*re 5>QookBP$ e1(dhE5>vjfkLqO@~CrUydZ{FW8mzgH/O(I}z;?m_?Kq{ȵhjX ^+l8d/2aO-Y6? /Dr]]{sCT j=\ftB}Ia2h\Xza?.W\SV1Ef{|nLg-T{xۓ;O)m$W1_.=R7p^לzE`c -\ Cf- rKjp[7r6}_\pr<D"gHFx7Fw5c E笰A%Ќ;SW)[uf)kP5o⳯ *P.g+F(wjKY2[fS^Õ|nޞp@i-'嵩e݋{py~t0g#t f= \0ٖrN0uro XhPȯPx.$eu[^̹?'YK à;;bɼeҢ `Zi!c|_z}7+DK%(%=0l .fVsZ۟=K^$e φi]' (z!1* blŪdCzD0(7\yDw9v"oY37R.|V5oA7jYdҸ;(fOdu tƁFwWwUջ Cu@F9s 6O}rrYEemF2si"8}.1$kOIyw/Qp|OW38%ճH.Dsq.ǨSk[655e:{!_^kiO]$F)5`*pIz\$X ` =`e'ط&m%"zH5-CS"ǻ>Č/ "xt-=Ʉf&pڴxb4R^ǭt0%՝C~D/ˬ)Bт-@,l7FV8uTv 6lޓ橖9/#oӼi 1zw$1L{0 e v_&|<khGC~+.j+1ӈgfj/!9Z YP޽^erCBL-_}z}?ؑjV' Jٴ4p{_Dpsy>Ǖ Zm`OBg3^yD,:we|/߽46F1'8g7@Nl5C"Vxx G((4-tY[Fc^ȤY-5ݖ6eH|żcb^b ¿L5t'+ 2ғs@ƀäχ.q~mK"a3H[}#RS"륙A; rm'A&d&dqK xg(?6i5>&0+],;\hr&69+km!8.F=gѾo/c⎏۟}k;2C=Rn7b;:D>mu $k19*L 9;g ϵ+!-o+2 nQmD1Jz͈pd9j6oCE1lmØ7 KQ/32'CP%ن[q@t+7d.t">Xd`sf`^K_( lQcƨELG#,"CAu;Fݻ,lٟ$#%N2Di X ?h"R2ҁMa# ]QTV*=|(}~*m3+rܫQ+z]и̋Y!+ףXNbHIf'a{=xoϬ->Fw 2(8t6ama?d\<ܜ,xј gbk؆<ۛKPs#|o @zNnl[1'H(OI<f `85?m\G.x#=rAO3)˾9jvKgT/AZ,;0m[1j> Y)}3?ao|M?dg?k;#'f7xR]݅ Li05wHr dtȷ2s+䵢87DČrE9m I*/XۺO)xbG:嬑Bjgm}vaI0bULbA` B!@ ͎1xW=#l=de{w64bRK (LJ֌}vt7wjagXGsۺF[!9nuUanYw+/YV̤ܶ;a0y.:9QԌr^"a0'uX2Oo|Yuֳls%;1˔Š|Ǟ x>mח&(3$ĕ`%__—w ;?`/m/Nd=:,~l n] qujr8Ct3G^2N[E Qi%Y@4ʍȴd椸jӝ YzC5;x1b;(J{V:IԖW`#z3ֿft6FvΏp]"}Q]QA)ʌ\(sJۣ֦]Ũ5XTh-0[ J\? y6 fF-1ݺ. i3`H%ɒ_Y_g!8M"FwsfSȯU^-ÛI8'ǽmR ajl_'yEf8&98+kS!Νzʹ7a$vb1+Y/w>f]/;_f+{)ngg_X뙀:61])MnqnC0 ܔHY-)jQn,QAVH4}{S$HawmDC1KpAm=tcŝ,F[שu3+e:[[]T9F8~rYt9_̕Qu +,߅9 A捱J?|RI7E Y@M :8y k5šQ'Kc<^PR %JΏ9뒏v}qeYPB t`Y{`k6ylHcxܑFDWק&g|{±TGhoORm%S|kR"f,̛ofF#} ߂d(#/PKMO{ʼ G\*|9c^zfX5 OBd fzV)lkf,?2@֞]{0ZYnѱԌ~v' zΨg@ KkۗGk (3$nM=Dh ,[_6/}m_oyb(q=@'jSۇ0z4Q{k4HXډ[6,;mlQz5:NϓY Er@tacagO5#MX/̽ K?spc}2c?.Ed'(zN2m"F AZT`TDCNrFg<) >: JANbyQW3l6lM!j],̌} gʕQݰf.aRFf5{2xnނ>e=kQ-tpt$pI3Z〙8]LaO>wz }5wt׵Eѡ|2C△A{ ӳg\rO,F\__3!5ZXa E (M]1u YʔP[ƅQµ^B 2Q틶(%: dv8qk2aBO;w6!mn=wlA }qa031gm̉3+1~d8͑EqZ_tV^3ŲQ|9mܴ,w $g)z%silj)sFs4 Uʣ 4 쐚wן EY{e*7 f 9fϔGe`6osv(}qG9pkko[ﬕl:p)HhAt!q">сX|YZax_gaGҋ r" kQ#=Nܘ┯P-Psgԅѝf PPG}ʌhr,*_6:/Y`Q#pj3m$1$^&чQVnkiA!+V5MDZx0V½}g;`f %B#bleUxL\AQtH4I [9G~hvڎĨo>,w!$BQfȬ%lH&i$zĐxe~FoDGDJXe؁}!9!B<#hNv"1x[io!qKgvL$:GJ(!gjܝ]v=d I0 !b a=Rw-QI.vܾ,$- =Bml0;n󒸭ePAn!Bh-%*dNۮOWtD0DC) $>NSv^QF+ 3ɖ[!&dOd{V۳R{ !EOή|9n f"Q ~F kB!*'~:2o( (}upVg~EDĐxLsD9:#[[YܳAL1026B!XYoaP+f=%ruL^/1$nMnշĐ($<@! 7ߙ2!!Bb1d6m[S8Z}6,q3ueL0{BbH!$zYG f١Ϻn[bH<)a'#4:G87^67?Q&HbH!&V?QiֺnKkĐx*hK0aw۲ 1"nl"l pټL !!BC3[/+CŪUz$c (%viC8#8!!B\C \یҷٿfGjp$1$nZ(D} UzgE s̞G! î]I 2Bf6ܫBh [FbH܊9zJl#p'F١167LPϐB!-Fhghf=+*;~+|5ĐIQ4@l ]u[Me @ق㙭'̞G!>Ypx{oFȌYOߩxboICD ggm"#bHH!{@Bv(yxh8KEbHܲ؉@-aspxj>Fl5.YvfHBH!Df2C[rҸG"V2]ŒĐ%4#*c:13A!%B+g4s0B!^DH$22nV*wtI G;[ Vm„3xN3L۶  !BE+erf뙡 V[_v-=i6UbHܴpbˆ1A(rr\m v1I ! +6۱!VYheX}]H [A+ۣAL= Q@meI !bh`fQi晧-kΐx ,Y) I%6ZL]R[bH!)F"(6DEf,W^w$#wZ3!e0[e3_ٚ!l~W('BkVVge. Dԉ&M02on!bhK@ 5mk(xDB!ZCq#jmK޶R=sfcXFCH<Q/64>h&h3@{ĐB!ĵH0=t$S_4mGBC&}mV.7eAMu$B>C6@!lVЬ!z%$SC6~A4;l4l>hu@B!sT DҊSQ!4dC){|"z6x#adq3$$Bk р֙ɶg[ !cBCIW-|"~Vf|f!B !*Đi1tTleV GET $ http example.org hello=world # => POST """ ) positional.add_argument( 'url', metavar='URL', help=""" The scheme defaults to 'http://' if the URL does not include one. You can also use a shorthand for localhost $ http :3000 # => http://localhost:3000 $ http :/foo # => http://localhost/foo """ ) positional.add_argument( 'items', metavar='REQUEST_ITEM', nargs=ZERO_OR_MORE, type=KeyValueArgType(*SEP_GROUP_ALL_ITEMS), help=r""" Optional key-value pairs to be included in the request. The separator used determines the type: ':' HTTP headers: Referer:http://httpie.org Cookie:foo=bar User-Agent:bacon/1.0 '==' URL parameters to be appended to the request URI: search==httpie '=' Data fields to be serialized into a JSON object (with --json, -j) or form data (with --form, -f): name=HTTPie language=Python description='CLI HTTP client' ':=' Non-string JSON data fields (only with --json, -j): awesome:=true amount:=42 colors:='["red", "green", "blue"]' '@' Form file fields (only with --form, -f): cs@~/Documents/CV.pdf '=@' A data field like '=', but takes a file path and embeds its content: essay=@Documents/essay.txt ':=@' A raw JSON field like ':=', but takes a file path and embeds its content: package:=@./package.json You can use a backslash to escape a colliding separator in the field name: field-name-with\:colon=value """ ) ####################################################################### # Content type. ####################################################################### content_type = parser.add_argument_group( title='Predefined content types', description=None ) content_type.add_argument( '--json', '-j', action='store_true', help=""" (default) Data items from the command line are serialized as a JSON object. The Content-Type and Accept headers are set to application/json (if not specified). """ ) content_type.add_argument( '--form', '-f', action='store_true', help=""" Data items from the command line are serialized as form fields. The Content-Type is set to application/x-www-form-urlencoded (if not specified). The presence of any file fields results in a multipart/form-data request. """ ) ####################################################################### # Output processing ####################################################################### output_processing = parser.add_argument_group(title='Output processing') output_processing.add_argument( '--pretty', dest='prettify', default=PRETTY_STDOUT_TTY_ONLY, choices=sorted(PRETTY_MAP.keys()), help=""" Controls output processing. The value can be "none" to not prettify the output (default for redirected output), "all" to apply both colors and formatting (default for terminal output), "colors", or "format". """ ) output_processing.add_argument( '--style', '-s', dest='style', metavar='STYLE', default=DEFAULT_STYLE, choices=AVAILABLE_STYLES, help=""" Output coloring style (default is "{default}"). One of: {available} For this option to work properly, please make sure that the $TERM environment variable is set to "xterm-256color" or similar (e.g., via `export TERM=xterm-256color' in your ~/.bashrc). """ .format( default=DEFAULT_STYLE, available='\n'.join( '{0: >20}'.format(line.strip()) for line in wrap(' '.join(sorted(AVAILABLE_STYLES)), 60) ), ) ) ####################################################################### # Output options ####################################################################### output_options = parser.add_argument_group(title='Output options') output_options.add_argument( '--print', '-p', dest='output_options', metavar='WHAT', help=""" String specifying what the output should contain: '{req_head}' request headers '{req_body}' request body '{res_head}' response headers '{res_body}' response body The default behaviour is '{default}' (i.e., the response headers and body is printed), if standard output is not redirected. If the output is piped to another program or to a file, then only the response body is printed by default. """ .format( req_head=OUT_REQ_HEAD, req_body=OUT_REQ_BODY, res_head=OUT_RESP_HEAD, res_body=OUT_RESP_BODY, default=OUTPUT_OPTIONS_DEFAULT, ) ) output_options.add_argument( '--verbose', '-v', dest='output_options', action='store_const', const=''.join(OUTPUT_OPTIONS), help=""" Print the whole request as well as the response. Shortcut for --print={0}. """ .format(''.join(OUTPUT_OPTIONS)) ) output_options.add_argument( '--headers', '-h', dest='output_options', action='store_const', const=OUT_RESP_HEAD, help=""" Print only the response headers. Shortcut for --print={0}. """ .format(OUT_RESP_HEAD) ) output_options.add_argument( '--body', '-b', dest='output_options', action='store_const', const=OUT_RESP_BODY, help=""" Print only the response body. Shortcut for --print={0}. """ .format(OUT_RESP_BODY) ) output_options.add_argument( '--stream', '-S', action='store_true', default=False, help=""" Always stream the output by line, i.e., behave like `tail -f'. Without --stream and with --pretty (either set or implied), HTTPie fetches the whole response before it outputs the processed data. Set this option when you want to continuously display a prettified long-lived response, such as one from the Twitter streaming API. It is useful also without --pretty: It ensures that the output is flushed more often and in smaller chunks. """ ) output_options.add_argument( '--output', '-o', type=FileType('a+b'), dest='output_file', metavar='FILE', help=""" Save output to FILE. If --download is set, then only the response body is saved to the file. Other parts of the HTTP exchange are printed to stderr. """ ) output_options.add_argument( '--download', '-d', action='store_true', default=False, help=""" Do not print the response body to stdout. Rather, download it and store it in a file. The filename is guessed unless specified with --output [filename]. This action is similar to the default behaviour of wget. """ ) output_options.add_argument( '--continue', '-c', dest='download_resume', action='store_true', default=False, help=""" Resume an interrupted download. Note that the --output option needs to be specified as well. """ ) ####################################################################### # Sessions ####################################################################### sessions = parser.add_argument_group(title='Sessions')\ .add_mutually_exclusive_group(required=False) session_name_validator = SessionNameValidator( 'Session name contains invalid characters.' ) sessions.add_argument( '--session', metavar='SESSION_NAME_OR_PATH', type=session_name_validator, help=""" Create, or reuse and update a session. Within a session, custom headers, auth credential, as well as any cookies sent by the server persist between requests. Session files are stored in: {session_dir}//.json. """ .format(session_dir=DEFAULT_SESSIONS_DIR) ) sessions.add_argument( '--session-read-only', metavar='SESSION_NAME_OR_PATH', type=session_name_validator, help=""" Create or read a session without updating it form the request/response exchange. """ ) ####################################################################### # Authentication ####################################################################### # ``requests.request`` keyword arguments. auth = parser.add_argument_group(title='Authentication') auth.add_argument( '--auth', '-a', metavar='USER[:PASS]', type=AuthCredentialsArgType(SEP_CREDENTIALS), help=""" If only the username is provided (-a username), HTTPie will prompt for the password. """, ) _auth_plugins = plugin_manager.get_auth_plugins() auth.add_argument( '--auth-type', choices=[plugin.auth_type for plugin in _auth_plugins], default=_auth_plugins[0].auth_type, help=""" The authentication mechanism to be used. Defaults to "{default}". {types} """ .format(default=_auth_plugins[0].auth_type, types='\n '.join( '"{type}": {name}{package}{description}'.format( type=plugin.auth_type, name=plugin.name, package=( '' if issubclass(plugin, BuiltinAuthPlugin) else ' (provided by %s)' % plugin.package_name ), description=( '' if not plugin.description else '\n ' + ('\n '.join(wrap(plugin.description))) ) ) for plugin in _auth_plugins )), ) ####################################################################### # Network ####################################################################### network = parser.add_argument_group(title='Network') network.add_argument( '--proxy', default=[], action='append', metavar='PROTOCOL:PROXY_URL', type=KeyValueArgType(SEP_PROXY), help=""" String mapping protocol to the URL of the proxy (e.g. http:http://foo.bar:3128). You can specify multiple proxies with different protocols. """ ) network.add_argument( '--follow', default=False, action='store_true', help=""" Set this flag if full redirects are allowed (e.g. re-POST-ing of data at new Location). """ ) network.add_argument( '--verify', default='yes', help=""" Set to "no" to skip checking the host's SSL certificate. You can also pass the path to a CA_BUNDLE file for private certs. You can also set the REQUESTS_CA_BUNDLE environment variable. Defaults to "yes". """ ) network.add_argument( '--timeout', type=float, default=30, metavar='SECONDS', help=""" The connection timeout of the request in seconds. The default value is 30 seconds. """ ) network.add_argument( '--check-status', default=False, action='store_true', help=""" By default, HTTPie exits with 0 when no network or other fatal errors occur. This flag instructs HTTPie to also check the HTTP status code and exit with an error if the status indicates one. When the server replies with a 4xx (Client Error) or 5xx (Server Error) status code, HTTPie exits with 4 or 5 respectively. If the response is a 3xx (Redirect) and --follow hasn't been set, then the exit status is 3. Also an error message is written to stderr if stdout is redirected. """ ) ####################################################################### # Troubleshooting ####################################################################### troubleshooting = parser.add_argument_group(title='Troubleshooting') troubleshooting.add_argument( '--ignore-stdin', action='store_true', default=False, help=""" Do not attempt to read stdin. """ ) troubleshooting.add_argument( '--help', action='help', default=SUPPRESS, help=""" Show this help message and exit. """ ) troubleshooting.add_argument( '--version', action='version', version=__version__, help=""" Show version and exit. """ ) troubleshooting.add_argument( '--traceback', action='store_true', default=False, help=""" Prints exception traceback should one occur. """ ) troubleshooting.add_argument( '--debug', action='store_true', default=False, help=""" Prints exception traceback should one occur, and also other information that is useful for debugging HTTPie itself and for reporting bugs. """ ) httpie-0.8.0/httpie/client.py000066400000000000000000000053421227074336400161550ustar00rootroot00000000000000import json import sys from pprint import pformat import requests from . import sessions from . import __version__ from .plugins import plugin_manager FORM = 'application/x-www-form-urlencoded; charset=utf-8' JSON = 'application/json; charset=utf-8' DEFAULT_UA = 'HTTPie/%s' % __version__ def get_response(args, config_dir): """Send the request and return a `request.Response`.""" requests_kwargs = get_requests_kwargs(args) if args.debug: sys.stderr.write('\n>>> requests.request(%s)\n\n' % pformat(requests_kwargs)) if not args.session and not args.session_read_only: response = requests.request(**requests_kwargs) else: response = sessions.get_response( args=args, config_dir=config_dir, session_name=args.session or args.session_read_only, requests_kwargs=requests_kwargs, read_only=bool(args.session_read_only), ) return response def get_requests_kwargs(args): """Translate our `args` into `requests.request` keyword arguments.""" implicit_headers = { 'User-Agent': DEFAULT_UA } auto_json = args.data and not args.form # FIXME: Accept is set to JSON with `http url @./file.txt`. if args.json or auto_json: implicit_headers['Accept'] = 'application/json' if args.json or (auto_json and args.data): implicit_headers['Content-Type'] = JSON if isinstance(args.data, dict): if args.data: args.data = json.dumps(args.data) else: # We need to set data to an empty string to prevent requests # from assigning an empty list to `response.request.data`. args.data = '' elif args.form and not args.files: # If sending files, `requests` will set # the `Content-Type` for us. implicit_headers['Content-Type'] = FORM for name, value in implicit_headers.items(): if name not in args.headers: args.headers[name] = value credentials = None if args.auth: auth_plugin = plugin_manager.get_auth_plugin(args.auth_type)() credentials = auth_plugin.get_auth(args.auth.key, args.auth.value) kwargs = { 'stream': True, 'method': args.method.lower(), 'url': args.url, 'headers': args.headers, 'data': args.data, 'verify': { 'yes': True, 'no': False }.get(args.verify, args.verify), 'timeout': args.timeout, 'auth': credentials, 'proxies': dict((p.key, p.value) for p in args.proxy), 'files': args.files, 'allow_redirects': args.follow, 'params': args.params, } return kwargs httpie-0.8.0/httpie/compat.py000066400000000000000000000005711227074336400161610ustar00rootroot00000000000000""" Python 2/3 compatibility. """ #noinspection PyUnresolvedReferences from requests.compat import ( is_windows, bytes, str, is_py3, is_py26, ) try: #noinspection PyUnresolvedReferences,PyCompatibility from urllib.parse import urlsplit except ImportError: #noinspection PyUnresolvedReferences,PyCompatibility from urlparse import urlsplit httpie-0.8.0/httpie/config.py000066400000000000000000000050431227074336400161420ustar00rootroot00000000000000import os import json import errno from . import __version__ from .compat import is_windows DEFAULT_CONFIG_DIR = os.environ.get( 'HTTPIE_CONFIG_DIR', os.path.expanduser('~/.httpie') if not is_windows else os.path.expandvars(r'%APPDATA%\\httpie') ) class BaseConfigDict(dict): name = None helpurl = None about = None directory = DEFAULT_CONFIG_DIR def __init__(self, directory=None, *args, **kwargs): super(BaseConfigDict, self).__init__(*args, **kwargs) if directory: self.directory = directory def __getattr__(self, item): return self[item] def _get_path(self): """Return the config file path without side-effects.""" return os.path.join(self.directory, self.name + '.json') @property def path(self): """Return the config file path creating basedir, if needed.""" path = self._get_path() try: os.makedirs(os.path.dirname(path), mode=0o700) except OSError as e: if e.errno != errno.EEXIST: raise return path @property def is_new(self): return not os.path.exists(self._get_path()) def load(self): try: with open(self.path, 'rt') as f: try: data = json.load(f) except ValueError as e: raise ValueError( 'Invalid %s JSON: %s [%s]' % (type(self).__name__, e.message, self.path) ) self.update(data) except IOError as e: if e.errno != errno.ENOENT: raise def save(self): self['__meta__'] = { 'httpie': __version__ } if self.helpurl: self['__meta__']['help'] = self.helpurl if self.about: self['__meta__']['about'] = self.about with open(self.path, 'w') as f: json.dump(self, f, indent=4, sort_keys=True, ensure_ascii=True) f.write('\n') def delete(self): try: os.unlink(self.path) except OSError as e: if e.errno != errno.ENOENT: raise class Config(BaseConfigDict): name = 'config' helpurl = 'https://github.com/jkbr/httpie#config' about = 'HTTPie configuration file' DEFAULTS = { 'implicit_content_type': 'json', 'default_options': [] } def __init__(self, *args, **kwargs): super(Config, self).__init__(*args, **kwargs) self.update(self.DEFAULTS) httpie-0.8.0/httpie/core.py000066400000000000000000000121171227074336400156250ustar00rootroot00000000000000"""This module provides the main functionality of HTTPie. Invocation flow: 1. Read, validate and process the input (args, `stdin`). 2. Create and send a request. 3. Stream, and possibly process and format, the requested parts of the request-response exchange. 4. Simultaneously write to `stdout` 5. Exit. """ import sys import errno import requests from httpie import __version__ as httpie_version from requests import __version__ as requests_version from pygments import __version__ as pygments_version from .compat import str, is_py3 from .client import get_response from .downloads import Download from .models import Environment from .output import build_output_stream, write, write_with_colors_win_py3 from . import ExitStatus from .plugins import plugin_manager def get_exit_status(http_status, follow=False): """Translate HTTP status code to exit status code.""" if 300 <= http_status <= 399 and not follow: # Redirect return ExitStatus.ERROR_HTTP_3XX elif 400 <= http_status <= 499: # Client Error return ExitStatus.ERROR_HTTP_4XX elif 500 <= http_status <= 599: # Server Error return ExitStatus.ERROR_HTTP_5XX else: return ExitStatus.OK def print_debug_info(env): sys.stderr.writelines([ 'HTTPie %s\n' % httpie_version, 'HTTPie data: %s\n' % env.config.directory, 'Requests %s\n' % requests_version, 'Pygments %s\n' % pygments_version, 'Python %s %s\n' % (sys.version, sys.platform) ]) def main(args=sys.argv[1:], env=Environment()): """Run the main program and write the output to ``env.stdout``. Return exit status code. """ plugin_manager.load_installed_plugins() from .cli import parser if env.config.default_options: args = env.config.default_options + args def error(msg, *args, **kwargs): msg = msg % args level = kwargs.get('level', 'error') env.stderr.write('\nhttp: %s: %s\n' % (level, msg)) debug = '--debug' in args traceback = debug or '--traceback' in args exit_status = ExitStatus.OK if debug: print_debug_info(env) if args == ['--debug']: return exit_status download = None try: args = parser.parse_args(args=args, env=env) if args.download: args.follow = True # --download implies --follow. download = Download( output_file=args.output_file, progress_file=env.stderr, resume=args.download_resume ) download.pre_request(args.headers) response = get_response(args, config_dir=env.config.directory) if args.check_status or download: exit_status = get_exit_status( http_status=response.status_code, follow=args.follow ) if not env.stdout_isatty and exit_status != ExitStatus.OK: error('HTTP %s %s', response.raw.status, response.raw.reason, level='warning') write_kwargs = { 'stream': build_output_stream( args, env, response.request, response), # This will in fact be `stderr` with `--download` 'outfile': env.stdout, 'flush': env.stdout_isatty or args.stream } try: if env.is_windows and is_py3 and 'colors' in args.prettify: write_with_colors_win_py3(**write_kwargs) else: write(**write_kwargs) if download and exit_status == ExitStatus.OK: # Response body download. download_stream, download_to = download.start(response) write( stream=download_stream, outfile=download_to, flush=False, ) download.finish() if download.interrupted: exit_status = ExitStatus.ERROR error('Incomplete download: size=%d; downloaded=%d' % ( download.status.total_size, download.status.downloaded )) except IOError as e: if not traceback and e.errno == errno.EPIPE: # Ignore broken pipes unless --traceback. env.stderr.write('\n') else: raise except (KeyboardInterrupt, SystemExit): if traceback: raise env.stderr.write('\n') exit_status = ExitStatus.ERROR except requests.Timeout: exit_status = ExitStatus.ERROR_TIMEOUT error('Request timed out (%ss).', args.timeout) except Exception as e: # TODO: Better distinction between expected and unexpected errors. # Network errors vs. bugs, etc. if traceback: raise error('%s: %s', type(e).__name__, str(e)) exit_status = ExitStatus.ERROR finally: if download and not download.finished: download.failed() return exit_status httpie-0.8.0/httpie/downloads.py000066400000000000000000000313761227074336400166770ustar00rootroot00000000000000# coding=utf-8 """ Download mode implementation. """ from __future__ import division import os import re import sys import mimetypes import threading from time import sleep, time from mailbox import Message from .output import RawStream from .models import HTTPResponse from .utils import humanize_bytes from .compat import urlsplit PARTIAL_CONTENT = 206 CLEAR_LINE = '\r\033[K' PROGRESS = ( '{percentage: 6.2f} %' ' {downloaded: >10}' ' {speed: >10}/s' ' {eta: >8} ETA' ) PROGRESS_NO_CONTENT_LENGTH = '{downloaded: >10} {speed: >10}/s' SUMMARY = 'Done. {downloaded} in {time:0.5f}s ({speed}/s)\n' SPINNER = '|/-\\' class ContentRangeError(ValueError): pass def parse_content_range(content_range, resumed_from): """ Parse and validate Content-Range header. :param content_range: the value of a Content-Range response header eg. "bytes 21010-47021/47022" :param resumed_from: first byte pos. from the Range request header :return: total size of the response body when fully downloaded. """ if content_range is None: raise ContentRangeError('Missing Content-Range') pattern = ( '^bytes (?P\d+)-(?P\d+)' '/(\*|(?P\d+))$' ) match = re.match(pattern, content_range) if not match: raise ContentRangeError( 'Invalid Content-Range format %r' % content_range) content_range_dict = match.groupdict() first_byte_pos = int(content_range_dict['first_byte_pos']) last_byte_pos = int(content_range_dict['last_byte_pos']) instance_length = ( int(content_range_dict['instance_length']) if content_range_dict['instance_length'] else None ) # "A byte-content-range-spec with a byte-range-resp-spec whose # last- byte-pos value is less than its first-byte-pos value, # or whose instance-length value is less than or equal to its # last-byte-pos value, is invalid. The recipient of an invalid # byte-content-range- spec MUST ignore it and any content # transferred along with it." if (first_byte_pos >= last_byte_pos or (instance_length is not None and instance_length <= last_byte_pos)): raise ContentRangeError( 'Invalid Content-Range returned: %r' % content_range) if (first_byte_pos != resumed_from or (instance_length is not None and last_byte_pos + 1 != instance_length)): # Not what we asked for. raise ContentRangeError( 'Unexpected Content-Range returned (%r)' ' for the requested Range ("bytes=%d-")' % (content_range, resumed_from) ) return last_byte_pos + 1 def filename_from_content_disposition(content_disposition): """ Extract and validate filename from a Content-Disposition header. :param content_disposition: Content-Disposition value :return: the filename if present and valid, otherwise `None` """ # attachment; filename=jkbr-httpie-0.4.1-20-g40bd8f6.tar.gz msg = Message('Content-Disposition: %s' % content_disposition) filename = msg.get_filename() if filename: # Basic sanitation. filename = os.path.basename(filename).lstrip('.').strip() if filename: return filename def filename_from_url(url, content_type): fn = urlsplit(url).path.rstrip('/') fn = os.path.basename(fn) if fn else 'index' if '.' not in fn and content_type: content_type = content_type.split(';')[0] if content_type == 'text/plain': # mimetypes returns '.ksh' ext = '.txt' else: ext = mimetypes.guess_extension(content_type) if ext == '.htm': # Python 3 ext = '.html' if ext: fn += ext return fn def get_unique_filename(fn, exists=os.path.exists): attempt = 0 while True: suffix = '-' + str(attempt) if attempt > 0 else '' if not exists(fn + suffix): return fn + suffix attempt += 1 class Download(object): def __init__(self, output_file=None, resume=False, progress_file=sys.stderr): """ :param resume: Should the download resume if partial download already exists. :type resume: bool :param output_file: The file to store response body in. If not provided, it will be guessed from the response. :type output_file: file :param progress_file: Where to report download progress. :type progress_file: file """ self._output_file = output_file self._resume = resume self._resumed_from = 0 self.finished = False self.status = Status() self._progress_reporter = ProgressReporterThread( status=self.status, output=progress_file ) def pre_request(self, request_headers): """Called just before the HTTP request is sent. Might alter `request_headers`. :type request_headers: dict """ # Disable content encoding so that we can resume, etc. request_headers['Accept-Encoding'] = None if self._resume: bytes_have = os.path.getsize(self._output_file.name) if bytes_have: # Set ``Range`` header to resume the download # TODO: Use "If-Range: mtime" to make sure it's fresh? request_headers['Range'] = 'bytes=%d-' % bytes_have self._resumed_from = bytes_have def start(self, response): """ Initiate and return a stream for `response` body with progress callback attached. Can be called only once. :param response: Initiated response object with headers already fetched :type response: requests.models.Response :return: RawStream, output_file """ assert not self.status.time_started try: total_size = int(response.headers['Content-Length']) except (KeyError, ValueError, TypeError): total_size = None if self._output_file: if self._resume and response.status_code == PARTIAL_CONTENT: total_size = parse_content_range( response.headers.get('Content-Range'), self._resumed_from ) else: self._resumed_from = 0 try: self._output_file.seek(0) self._output_file.truncate() except IOError: pass # stdout else: # TODO: Should the filename be taken from response.history[0].url? # Output file not specified. Pick a name that doesn't exist yet. fn = None if 'Content-Disposition' in response.headers: fn = filename_from_content_disposition( response.headers['Content-Disposition']) if not fn: fn = filename_from_url( url=response.url, content_type=response.headers.get('Content-Type'), ) self._output_file = open(get_unique_filename(fn), mode='a+b') self.status.started( resumed_from=self._resumed_from, total_size=total_size ) stream = RawStream( msg=HTTPResponse(response), with_headers=False, with_body=True, on_body_chunk_downloaded=self.chunk_downloaded, chunk_size=1024 * 8 ) self._progress_reporter.output.write( 'Downloading %sto "%s"\n' % ( (humanize_bytes(total_size) + ' ' if total_size is not None else ''), self._output_file.name ) ) self._progress_reporter.start() return stream, self._output_file def finish(self): assert not self.finished self.finished = True self.status.finished() def failed(self): self._progress_reporter.stop() @property def interrupted(self): return ( self.finished and self.status.total_size and self.status.total_size != self.status.downloaded ) def chunk_downloaded(self, chunk): """ A download progress callback. :param chunk: A chunk of response body data that has just been downloaded and written to the output. :type chunk: bytes """ self.status.chunk_downloaded(len(chunk)) class Status(object): """Holds details about the downland status.""" def __init__(self): self.downloaded = 0 self.total_size = None self.resumed_from = 0 self.time_started = None self.time_finished = None def started(self, resumed_from=0, total_size=None): assert self.time_started is None if total_size is not None: self.total_size = total_size self.downloaded = self.resumed_from = resumed_from self.time_started = time() def chunk_downloaded(self, size): assert self.time_finished is None self.downloaded += size @property def has_finished(self): return self.time_finished is not None def finished(self): assert self.time_started is not None assert self.time_finished is None self.time_finished = time() class ProgressReporterThread(threading.Thread): """ Reports download progress based on its status. Uses threading to periodically update the status (speed, ETA, etc.). """ def __init__(self, status, output, tick=.1, update_interval=1): """ :type status: Status :type output: file """ super(ProgressReporterThread, self).__init__() self.status = status self.output = output self._tick = tick self._update_interval = update_interval self._spinner_pos = 0 self._status_line = '' self._prev_bytes = 0 self._prev_time = time() self._should_stop = threading.Event() def stop(self): """Stop reporting on next tick.""" self._should_stop.set() def run(self): while not self._should_stop.is_set(): if self.status.has_finished: self.sum_up() break self.report_speed() sleep(self._tick) def report_speed(self): now = time() if now - self._prev_time >= self._update_interval: downloaded = self.status.downloaded try: speed = ((downloaded - self._prev_bytes) / (now - self._prev_time)) except ZeroDivisionError: speed = 0 if not self.status.total_size: self._status_line = PROGRESS_NO_CONTENT_LENGTH.format( downloaded=humanize_bytes(downloaded), speed=humanize_bytes(speed), ) else: try: percentage = downloaded / self.status.total_size * 100 except ZeroDivisionError: percentage = 0 if not speed: eta = '-:--:--' else: s = int((self.status.total_size - downloaded) / speed) h, s = divmod(s, 60 * 60) m, s = divmod(s, 60) eta = '{0}:{1:0>2}:{2:0>2}'.format(h, m, s) self._status_line = PROGRESS.format( percentage=percentage, downloaded=humanize_bytes(downloaded), speed=humanize_bytes(speed), eta=eta, ) self._prev_time = now self._prev_bytes = downloaded self.output.write( CLEAR_LINE + ' ' + SPINNER[self._spinner_pos] + ' ' + self._status_line ) self.output.flush() self._spinner_pos = (self._spinner_pos + 1 if self._spinner_pos + 1 != len(SPINNER) else 0) def sum_up(self): actually_downloaded = (self.status.downloaded - self.status.resumed_from) time_taken = self.status.time_finished - self.status.time_started self.output.write(CLEAR_LINE) self.output.write(SUMMARY.format( downloaded=humanize_bytes(actually_downloaded), total=(self.status.total_size and humanize_bytes(self.status.total_size)), speed=humanize_bytes(actually_downloaded / time_taken), time=time_taken, )) self.output.flush() httpie-0.8.0/httpie/input.py000066400000000000000000000470041227074336400160370ustar00rootroot00000000000000"""Parsing and processing of CLI input (args, auth credentials, files, stdin). """ import os import sys import re import json import mimetypes import getpass from io import BytesIO #noinspection PyCompatibility from argparse import ArgumentParser, ArgumentTypeError, ArgumentError try: from collections import OrderedDict except ImportError: OrderedDict = dict # TODO: Use MultiDict for headers once added to `requests`. # https://github.com/jkbr/httpie/issues/130 from requests.structures import CaseInsensitiveDict from .compat import urlsplit, str from .sessions import VALID_SESSION_NAME_PATTERN HTTP_POST = 'POST' HTTP_GET = 'GET' HTTP = 'http://' HTTPS = 'https://' # Various separators used in args SEP_HEADERS = ':' SEP_CREDENTIALS = ':' SEP_PROXY = ':' SEP_DATA = '=' SEP_DATA_RAW_JSON = ':=' SEP_FILES = '@' SEP_DATA_EMBED_FILE = '=@' SEP_DATA_EMBED_RAW_JSON_FILE = ':=@' SEP_QUERY = '==' # Separators that become request data SEP_GROUP_DATA_ITEMS = frozenset([ SEP_DATA, SEP_DATA_RAW_JSON, SEP_FILES, SEP_DATA_EMBED_FILE, SEP_DATA_EMBED_RAW_JSON_FILE ]) # Separators for items whose value is a filename to be embedded SEP_GROUP_DATA_EMBED_ITEMS = frozenset([ SEP_DATA_EMBED_FILE, SEP_DATA_EMBED_RAW_JSON_FILE, ]) # Separators for raw JSON items SEP_GROUP_RAW_JSON_ITEMS = frozenset([ SEP_DATA_RAW_JSON, SEP_DATA_EMBED_RAW_JSON_FILE, ]) # Separators allowed in ITEM arguments SEP_GROUP_ALL_ITEMS = frozenset([ SEP_HEADERS, SEP_QUERY, SEP_DATA, SEP_DATA_RAW_JSON, SEP_FILES, SEP_DATA_EMBED_FILE, SEP_DATA_EMBED_RAW_JSON_FILE, ]) # Output options OUT_REQ_HEAD = 'H' OUT_REQ_BODY = 'B' OUT_RESP_HEAD = 'h' OUT_RESP_BODY = 'b' OUTPUT_OPTIONS = frozenset([ OUT_REQ_HEAD, OUT_REQ_BODY, OUT_RESP_HEAD, OUT_RESP_BODY ]) # Pretty PRETTY_MAP = { 'all': ['format', 'colors'], 'colors': ['colors'], 'format': ['format'], 'none': [] } PRETTY_STDOUT_TTY_ONLY = object() # Defaults OUTPUT_OPTIONS_DEFAULT = OUT_RESP_HEAD + OUT_RESP_BODY OUTPUT_OPTIONS_DEFAULT_STDOUT_REDIRECTED = OUT_RESP_BODY class Parser(ArgumentParser): """Adds additional logic to `argparse.ArgumentParser`. Handles all input (CLI args, file args, stdin), applies defaults, and performs extra validation. """ def __init__(self, *args, **kwargs): kwargs['add_help'] = False super(Parser, self).__init__(*args, **kwargs) #noinspection PyMethodOverriding def parse_args(self, env, args=None, namespace=None): self.env = env self.args, no_options = super(Parser, self)\ .parse_known_args(args, namespace) if self.args.debug: self.args.traceback = True # Arguments processing and environment setup. self._apply_no_options(no_options) self._apply_config() self._validate_download_options() self._setup_standard_streams() self._process_output_options() self._process_pretty_options() self._guess_method() self._parse_items() if not self.args.ignore_stdin and not env.stdin_isatty: self._body_from_file(self.env.stdin) if not (self.args.url.startswith((HTTP, HTTPS))): # Default to 'https://' if invoked as `https args`. scheme = HTTPS if self.env.progname == 'https' else HTTP # See if we're using curl style shorthand for localhost (:3000/foo) shorthand = re.match(r'^:(?!:)(\d*)(/?.*)$', self.args.url) if shorthand: port = shorthand.group(1) rest = shorthand.group(2) self.args.url = scheme + 'localhost' if port: self.args.url += ':' + port self.args.url += rest else: self.args.url = scheme + self.args.url self._process_auth() return self.args # noinspection PyShadowingBuiltins def _print_message(self, message, file=None): # Sneak in our stderr/stdout. file = { sys.stdout: self.env.stdout, sys.stderr: self.env.stderr, None: self.env.stderr }.get(file, file) super(Parser, self)._print_message(message, file) def _setup_standard_streams(self): """ Modify `env.stdout` and `env.stdout_isatty` based on args, if needed. """ if not self.env.stdout_isatty and self.args.output_file: self.error('Cannot use --output, -o with redirected output.') # FIXME: Come up with a cleaner solution. if self.args.download: if not self.env.stdout_isatty: # Use stdout as tge download output file. self.args.output_file = self.env.stdout # With `--download`, we write everything that would normally go to # `stdout` to `stderr` instead. Let's replace the stream so that # we don't have to use many `if`s throughout the codebase. # The response body will be treated separately. self.env.stdout = self.env.stderr self.env.stdout_isatty = self.env.stderr_isatty elif self.args.output_file: # When not `--download`ing, then `--output` simply replaces # `stdout`. The file is opened for appending, which isn't what # we want in this case. self.args.output_file.seek(0) self.args.output_file.truncate() self.env.stdout = self.args.output_file self.env.stdout_isatty = False def _apply_config(self): if (not self.args.json and self.env.config.implicit_content_type == 'form'): self.args.form = True def _process_auth(self): """ If only a username provided via --auth, then ask for a password. Or, take credentials from the URL, if provided. """ url = urlsplit(self.args.url) if self.args.auth: if not self.args.auth.has_password(): # Stdin already read (if not a tty) so it's save to prompt. if self.args.ignore_stdin: self.error('Unable to prompt for passwords because' ' --ignore-stdin is set.') self.args.auth.prompt_password(url.netloc) elif url.username is not None: # Handle http://username:password@hostname/ username, password = url.username, url.password self.args.auth = AuthCredentials( key=username, value=password, sep=SEP_CREDENTIALS, orig=SEP_CREDENTIALS.join([username, password]) ) def _apply_no_options(self, no_options): """For every `--no-OPTION` in `no_options`, set `args.OPTION` to its default value. This allows for un-setting of options, e.g., specified in config. """ invalid = [] for option in no_options: if not option.startswith('--no-'): invalid.append(option) continue # --no-option => --option inverted = '--' + option[5:] for action in self._actions: if inverted in action.option_strings: setattr(self.args, action.dest, action.default) break else: invalid.append(option) if invalid: msg = 'unrecognized arguments: %s' self.error(msg % ' '.join(invalid)) def _body_from_file(self, fd): """There can only be one source of request data. Bytes are always read. """ if self.args.data: self.error('Request body (from stdin or a file) and request ' 'data (key=value) cannot be mixed.') self.args.data = getattr(fd, 'buffer', fd).read() def _guess_method(self): """Set `args.method` if not specified to either POST or GET based on whether the request has data or not. """ if self.args.method is None: # Invoked as `http URL'. assert not self.args.items if not self.args.ignore_stdin and not self.env.stdin_isatty: self.args.method = HTTP_POST else: self.args.method = HTTP_GET # FIXME: False positive, e.g., "localhost" matches but is a valid URL. elif not re.match('^[a-zA-Z]+$', self.args.method): # Invoked as `http URL item+'. The URL is now in `args.method` # and the first ITEM is now incorrectly in `args.url`. try: # Parse the URL as an ITEM and store it as the first ITEM arg. self.args.items.insert( 0, KeyValueArgType(*SEP_GROUP_ALL_ITEMS).__call__(self.args.url) ) except ArgumentTypeError as e: if self.args.traceback: raise self.error(e.message) else: # Set the URL correctly self.args.url = self.args.method # Infer the method has_data = ( (not self.args.ignore_stdin and not self.env.stdin_isatty) or any( item.sep in SEP_GROUP_DATA_ITEMS for item in self.args.items ) ) self.args.method = HTTP_POST if has_data else HTTP_GET def _parse_items(self): """Parse `args.items` into `args.headers`, `args.data`, `args.params`, and `args.files`. """ self.args.headers = CaseInsensitiveDict() self.args.data = ParamDict() if self.args.form else OrderedDict() self.args.files = OrderedDict() self.args.params = ParamDict() try: parse_items(items=self.args.items, headers=self.args.headers, data=self.args.data, files=self.args.files, params=self.args.params) except ParseError as e: if self.args.traceback: raise self.error(e.message) if self.args.files and not self.args.form: # `http url @/path/to/file` file_fields = list(self.args.files.keys()) if file_fields != ['']: self.error( 'Invalid file fields (perhaps you meant --form?): %s' % ','.join(file_fields)) fn, fd = self.args.files[''] self.args.files = {} self._body_from_file(fd) if 'Content-Type' not in self.args.headers: mime, encoding = mimetypes.guess_type(fn, strict=False) if mime: content_type = mime if encoding: content_type = '%s; charset=%s' % (mime, encoding) self.args.headers['Content-Type'] = content_type def _process_output_options(self): """Apply defaults to output options, or validate the provided ones. The default output options are stdout-type-sensitive. """ if not self.args.output_options: self.args.output_options = ( OUTPUT_OPTIONS_DEFAULT if self.env.stdout_isatty else OUTPUT_OPTIONS_DEFAULT_STDOUT_REDIRECTED ) unknown_output_options = set(self.args.output_options) - OUTPUT_OPTIONS if unknown_output_options: self.error( 'Unknown output options: %s' % ','.join(unknown_output_options) ) if self.args.download and OUT_RESP_BODY in self.args.output_options: # Response body is always downloaded with --download and it goes # through a different routine, so we remove it. self.args.output_options = str( set(self.args.output_options) - set(OUT_RESP_BODY)) def _process_pretty_options(self): if self.args.prettify == PRETTY_STDOUT_TTY_ONLY: self.args.prettify = PRETTY_MAP[ 'all' if self.env.stdout_isatty else 'none'] elif self.args.prettify and self.env.is_windows: self.error('Only terminal output can be colorized on Windows.') else: # noinspection PyTypeChecker self.args.prettify = PRETTY_MAP[self.args.prettify] def _validate_download_options(self): if not self.args.download: if self.args.download_resume: self.error('--continue only works with --download') if self.args.download_resume and not ( self.args.download and self.args.output_file): self.error('--continue requires --output to be specified') class ParseError(Exception): pass class KeyValue(object): """Base key-value pair parsed from CLI.""" def __init__(self, key, value, sep, orig): self.key = key self.value = value self.sep = sep self.orig = orig def __eq__(self, other): return self.__dict__ == other.__dict__ class SessionNameValidator(object): def __init__(self, error_message): self.error_message = error_message def __call__(self, value): # Session name can be a path or just a name. if (os.path.sep not in value and not VALID_SESSION_NAME_PATTERN.search(value)): raise ArgumentError(None, self.error_message) return value class KeyValueArgType(object): """A key-value pair argument type used with `argparse`. Parses a key-value arg and constructs a `KeyValue` instance. Used for headers, form data, and other key-value pair types. """ key_value_class = KeyValue def __init__(self, *separators): self.separators = separators def __call__(self, string): """Parse `string` and return `self.key_value_class()` instance. The best of `self.separators` is determined (first found, longest). Back slash escaped characters aren't considered as separators (or parts thereof). Literal back slash characters have to be escaped as well (r'\\'). """ class Escaped(str): """Represents an escaped character.""" def tokenize(s): """Tokenize `s`. There are only two token types - strings and escaped characters: tokenize(r'foo\=bar\\baz') => ['foo', Escaped('='), 'bar', Escaped('\\'), 'baz'] """ tokens = [''] esc = False for c in s: if esc: tokens.extend([Escaped(c), '']) esc = False else: if c == '\\': esc = True else: tokens[-1] += c return tokens tokens = tokenize(string) # Sorting by length ensures that the longest one will be # chosen as it will overwrite any shorter ones starting # at the same position in the `found` dictionary. separators = sorted(self.separators, key=len) for i, token in enumerate(tokens): if isinstance(token, Escaped): continue found = {} for sep in separators: pos = token.find(sep) if pos != -1: found[pos] = sep if found: # Starting first, longest separator found. sep = found[min(found.keys())] key, value = token.split(sep, 1) # Any preceding tokens are part of the key. key = ''.join(tokens[:i]) + key # Any following tokens are part of the value. value += ''.join(tokens[i + 1:]) break else: raise ArgumentTypeError( '"%s" is not a valid value' % string) return self.key_value_class( key=key, value=value, sep=sep, orig=string) class AuthCredentials(KeyValue): """Represents parsed credentials.""" def _getpass(self, prompt): # To allow mocking. return getpass.getpass(prompt) def has_password(self): return self.value is not None def prompt_password(self, host): try: self.value = self._getpass( 'http: password for %s@%s: ' % (self.key, host)) except (EOFError, KeyboardInterrupt): sys.stderr.write('\n') sys.exit(0) class AuthCredentialsArgType(KeyValueArgType): """A key-value arg type that parses credentials.""" key_value_class = AuthCredentials def __call__(self, string): """Parse credentials from `string`. ("username" or "username:password"). """ try: return super(AuthCredentialsArgType, self).__call__(string) except ArgumentTypeError: # No password provided, will prompt for it later. return self.key_value_class( key=string, value=None, sep=SEP_CREDENTIALS, orig=string ) class ParamDict(OrderedDict): """Multi-value dict for URL parameters and form data.""" #noinspection PyMethodOverriding def __setitem__(self, key, value): """ If `key` is assigned more than once, `self[key]` holds a `list` of all the values. This allows having multiple fields with the same name in form data and URL params. """ if key not in self: super(ParamDict, self).__setitem__(key, value) else: if not isinstance(self[key], list): super(ParamDict, self).__setitem__(key, [self[key]]) self[key].append(value) def parse_items(items, data=None, headers=None, files=None, params=None): """Parse `KeyValue` `items` into `data`, `headers`, `files`, and `params`. """ if headers is None: headers = CaseInsensitiveDict() if data is None: data = OrderedDict() if files is None: files = OrderedDict() if params is None: params = ParamDict() for item in items: value = item.value if item.sep == SEP_HEADERS: target = headers elif item.sep == SEP_QUERY: target = params elif item.sep == SEP_FILES: try: with open(os.path.expanduser(value), 'rb') as f: value = (os.path.basename(value), BytesIO(f.read())) except IOError as e: raise ParseError('"%s": %s' % (item.orig, e)) target = files elif item.sep in SEP_GROUP_DATA_ITEMS: if item.sep in SEP_GROUP_DATA_EMBED_ITEMS: try: with open(os.path.expanduser(value), 'rb') as f: value = f.read().decode('utf8') except IOError as e: raise ParseError('"%s": %s' % (item.orig, e)) except UnicodeDecodeError: raise ParseError( '"%s": cannot embed the content of "%s",' ' not a UTF8 or ASCII-encoded text file' % (item.orig, item.value) ) if item.sep in SEP_GROUP_RAW_JSON_ITEMS: try: value = json.loads(value) except ValueError as e: raise ParseError('"%s": %s' % (item.orig, e)) target = data else: raise TypeError(item) target[item.key] = value return headers, data, files, params httpie-0.8.0/httpie/models.py000066400000000000000000000120111227074336400161510ustar00rootroot00000000000000import os import sys from .config import DEFAULT_CONFIG_DIR, Config from .compat import urlsplit, is_windows, bytes, str class Environment(object): """Holds information about the execution context. Groups various aspects of the environment in a changeable object and allows for mocking. """ is_windows = is_windows progname = os.path.basename(sys.argv[0]) if progname not in ['http', 'https']: progname = 'http' config_dir = DEFAULT_CONFIG_DIR # Can be set to 0 to disable colors completely. colors = 256 if '256color' in os.environ.get('TERM', '') else 88 stdin = sys.stdin stdin_isatty = sys.stdin.isatty() stdout_isatty = sys.stdout.isatty() stderr_isatty = sys.stderr.isatty() if is_windows: # noinspection PyUnresolvedReferences from colorama.initialise import wrap_stream stdout = wrap_stream(sys.stdout, convert=None, strip=None, autoreset=True, wrap=True) stderr = wrap_stream(sys.stderr, convert=None, strip=None, autoreset=True, wrap=True) else: stdout = sys.stdout stderr = sys.stderr def __init__(self, **kwargs): assert all(hasattr(type(self), attr) for attr in kwargs.keys()) self.__dict__.update(**kwargs) @property def config(self): if not hasattr(self, '_config'): self._config = Config(directory=self.config_dir) if self._config.is_new: self._config.save() else: self._config.load() return self._config class HTTPMessage(object): """Abstract class for HTTP messages.""" def __init__(self, orig): self._orig = orig def iter_body(self, chunk_size): """Return an iterator over the body.""" raise NotImplementedError() def iter_lines(self, chunk_size): """Return an iterator over the body yielding (`line`, `line_feed`).""" raise NotImplementedError() @property def headers(self): """Return a `str` with the message's headers.""" raise NotImplementedError() @property def encoding(self): """Return a `str` with the message's encoding, if known.""" raise NotImplementedError() @property def body(self): """Return a `bytes` with the message's body.""" raise NotImplementedError() @property def content_type(self): """Return the message content type.""" return self._orig.headers.get('Content-Type', '') class HTTPResponse(HTTPMessage): """A :class:`requests.models.Response` wrapper.""" def iter_body(self, chunk_size=1): return self._orig.iter_content(chunk_size=chunk_size) def iter_lines(self, chunk_size): return ((line, b'\n') for line in self._orig.iter_lines(chunk_size)) #noinspection PyProtectedMember @property def headers(self): original = self._orig.raw._original_response status_line = 'HTTP/{version} {status} {reason}'.format( version='.'.join(str(original.version)), status=original.status, reason=original.reason ) headers = [status_line] try: # `original.msg` is a `http.client.HTTPMessage` on Python 3 # `_headers` is a 2-tuple headers.extend( '%s: %s' % header for header in original.msg._headers) except AttributeError: # and a `httplib.HTTPMessage` on Python 2.x # `headers` is a list of `name: val`. headers.extend(h.strip() for h in original.msg.headers) return '\r\n'.join(headers) @property def encoding(self): return self._orig.encoding or 'utf8' @property def body(self): # Only now the response body is fetched. # Shouldn't be touched unless the body is actually needed. return self._orig.content class HTTPRequest(HTTPMessage): """A :class:`requests.models.Request` wrapper.""" def iter_body(self, chunk_size): yield self.body def iter_lines(self, chunk_size): yield self.body, b'' @property def headers(self): url = urlsplit(self._orig.url) request_line = '{method} {path}{query} HTTP/1.1'.format( method=self._orig.method, path=url.path or '/', query='?' + url.query if url.query else '' ) headers = dict(self._orig.headers) if 'Host' not in headers: headers['Host'] = url.netloc.split('@')[-1] headers = ['%s: %s' % (name, value) for name, value in headers.items()] headers.insert(0, request_line) return '\r\n'.join(headers).strip() @property def encoding(self): return 'utf8' @property def body(self): body = self._orig.body if isinstance(body, str): # Happens with JSON/form request data parsed from the command line. body = body.encode('utf8') return body or b'' httpie-0.8.0/httpie/output.py000066400000000000000000000373421227074336400162440ustar00rootroot00000000000000"""Output streaming, processing and formatting. """ import json import xml.dom.minidom from functools import partial from itertools import chain import pygments from pygments import token, lexer from pygments.styles import get_style_by_name, STYLE_MAP from pygments.lexers import get_lexer_for_mimetype, get_lexer_by_name from pygments.formatters.terminal import TerminalFormatter from pygments.formatters.terminal256 import Terminal256Formatter from pygments.util import ClassNotFound from .compat import is_windows from .solarized import Solarized256Style from .models import HTTPRequest, HTTPResponse, Environment from .input import (OUT_REQ_BODY, OUT_REQ_HEAD, OUT_RESP_HEAD, OUT_RESP_BODY) # The default number of spaces to indent when pretty printing DEFAULT_INDENT = 4 # Colors on Windows via colorama don't look that # great and fruity seems to give the best result there. AVAILABLE_STYLES = set(STYLE_MAP.keys()) AVAILABLE_STYLES.add('solarized') DEFAULT_STYLE = 'solarized' if not is_windows else 'fruity' BINARY_SUPPRESSED_NOTICE = ( b'\n' b'+-----------------------------------------+\n' b'| NOTE: binary data not shown in terminal |\n' b'+-----------------------------------------+' ) class BinarySuppressedError(Exception): """An error indicating that the body is binary and won't be written, e.g., for terminal output).""" message = BINARY_SUPPRESSED_NOTICE ############################################################################### # Output Streams ############################################################################### def write(stream, outfile, flush): """Write the output stream.""" try: # Writing bytes so we use the buffer interface (Python 3). buf = outfile.buffer except AttributeError: buf = outfile for chunk in stream: buf.write(chunk) if flush: outfile.flush() def write_with_colors_win_py3(stream, outfile, flush): """Like `write`, but colorized chunks are written as text directly to `outfile` to ensure it gets processed by colorama. Applies only to Windows with Python 3 and colorized terminal output. """ color = b'\x1b[' encoding = outfile.encoding for chunk in stream: if color in chunk: outfile.write(chunk.decode(encoding)) else: outfile.buffer.write(chunk) if flush: outfile.flush() def build_output_stream(args, env, request, response): """Build and return a chain of iterators over the `request`-`response` exchange each of which yields `bytes` chunks. """ req_h = OUT_REQ_HEAD in args.output_options req_b = OUT_REQ_BODY in args.output_options resp_h = OUT_RESP_HEAD in args.output_options resp_b = OUT_RESP_BODY in args.output_options req = req_h or req_b resp = resp_h or resp_b output = [] Stream = get_stream_type(env, args) if req: output.append(Stream( msg=HTTPRequest(request), with_headers=req_h, with_body=req_b)) if req_b and resp: # Request/Response separator. output.append([b'\n\n']) if resp: output.append(Stream( msg=HTTPResponse(response), with_headers=resp_h, with_body=resp_b)) if env.stdout_isatty and resp_b: # Ensure a blank line after the response body. # For terminal output only. output.append([b'\n\n']) return chain(*output) def get_stream_type(env, args): """Pick the right stream type based on `env` and `args`. Wrap it in a partial with the type-specific args so that we don't need to think what stream we are dealing with. """ if not env.stdout_isatty and not args.prettify: Stream = partial( RawStream, chunk_size=RawStream.CHUNK_SIZE_BY_LINE if args.stream else RawStream.CHUNK_SIZE ) elif args.prettify: Stream = partial( PrettyStream if args.stream else BufferedPrettyStream, env=env, processor=OutputProcessor( env=env, groups=args.prettify, pygments_style=args.style), ) else: Stream = partial(EncodedStream, env=env) return Stream class BaseStream(object): """Base HTTP message output stream class.""" def __init__(self, msg, with_headers=True, with_body=True, on_body_chunk_downloaded=None): """ :param msg: a :class:`models.HTTPMessage` subclass :param with_headers: if `True`, headers will be included :param with_body: if `True`, body will be included """ assert with_headers or with_body self.msg = msg self.with_headers = with_headers self.with_body = with_body self.on_body_chunk_downloaded = on_body_chunk_downloaded def _get_headers(self): """Return the headers' bytes.""" return self.msg.headers.encode('ascii') def _iter_body(self): """Return an iterator over the message body.""" raise NotImplementedError() def __iter__(self): """Return an iterator over `self.msg`.""" if self.with_headers: yield self._get_headers() yield b'\r\n\r\n' if self.with_body: try: for chunk in self._iter_body(): yield chunk if self.on_body_chunk_downloaded: self.on_body_chunk_downloaded(chunk) except BinarySuppressedError as e: if self.with_headers: yield b'\n' yield e.message class RawStream(BaseStream): """The message is streamed in chunks with no processing.""" CHUNK_SIZE = 1024 * 100 CHUNK_SIZE_BY_LINE = 1 def __init__(self, chunk_size=CHUNK_SIZE, **kwargs): super(RawStream, self).__init__(**kwargs) self.chunk_size = chunk_size def _iter_body(self): return self.msg.iter_body(self.chunk_size) class EncodedStream(BaseStream): """Encoded HTTP message stream. The message bytes are converted to an encoding suitable for `self.env.stdout`. Unicode errors are replaced and binary data is suppressed. The body is always streamed by line. """ CHUNK_SIZE = 1 def __init__(self, env=Environment(), **kwargs): super(EncodedStream, self).__init__(**kwargs) if env.stdout_isatty: # Use the encoding supported by the terminal. output_encoding = getattr(env.stdout, 'encoding', None) else: # Preserve the message encoding. output_encoding = self.msg.encoding # Default to utf8 when unsure. self.output_encoding = output_encoding or 'utf8' def _iter_body(self): for line, lf in self.msg.iter_lines(self.CHUNK_SIZE): if b'\0' in line: raise BinarySuppressedError() yield line.decode(self.msg.encoding)\ .encode(self.output_encoding, 'replace') + lf class PrettyStream(EncodedStream): """In addition to :class:`EncodedStream` behaviour, this stream applies content processing. Useful for long-lived HTTP responses that stream by lines such as the Twitter streaming API. """ CHUNK_SIZE = 1 def __init__(self, processor, **kwargs): super(PrettyStream, self).__init__(**kwargs) self.processor = processor def _get_headers(self): return self.processor.process_headers( self.msg.headers).encode(self.output_encoding) def _iter_body(self): for line, lf in self.msg.iter_lines(self.CHUNK_SIZE): if b'\0' in line: raise BinarySuppressedError() yield self._process_body(line) + lf def _process_body(self, chunk): return (self.processor .process_body( content=chunk.decode(self.msg.encoding, 'replace'), content_type=self.msg.content_type, encoding=self.msg.encoding) .encode(self.output_encoding, 'replace')) class BufferedPrettyStream(PrettyStream): """The same as :class:`PrettyStream` except that the body is fully fetched before it's processed. Suitable regular HTTP responses. """ CHUNK_SIZE = 1024 * 10 def _iter_body(self): # Read the whole body before prettifying it, # but bail out immediately if the body is binary. body = bytearray() for chunk in self.msg.iter_body(self.CHUNK_SIZE): if b'\0' in chunk: raise BinarySuppressedError() body.extend(chunk) yield self._process_body(body) ############################################################################### # Processing ############################################################################### class HTTPLexer(lexer.RegexLexer): """Simplified HTTP lexer for Pygments. It only operates on headers and provides a stronger contrast between their names and values than the original one bundled with Pygments (:class:`pygments.lexers.text import HttpLexer`), especially when Solarized color scheme is used. """ name = 'HTTP' aliases = ['http'] filenames = ['*.http'] tokens = { 'root': [ # Request-Line (r'([A-Z]+)( +)([^ ]+)( +)(HTTP)(/)(\d+\.\d+)', lexer.bygroups( token.Name.Function, token.Text, token.Name.Namespace, token.Text, token.Keyword.Reserved, token.Operator, token.Number )), # Response Status-Line (r'(HTTP)(/)(\d+\.\d+)( +)(\d{3})( +)(.+)', lexer.bygroups( token.Keyword.Reserved, # 'HTTP' token.Operator, # '/' token.Number, # Version token.Text, token.Number, # Status code token.Text, token.Name.Exception, # Reason )), # Header (r'(.*?)( *)(:)( *)(.+)', lexer.bygroups( token.Name.Attribute, # Name token.Text, token.Operator, # Colon token.Text, token.String # Value )) ] } class BaseProcessor(object): """Base, noop output processor class.""" enabled = True def __init__(self, env=Environment(), **kwargs): """ :param env: an class:`Environment` instance :param kwargs: additional keyword argument that some processor might require. """ self.env = env self.kwargs = kwargs def process_headers(self, headers): """Return processed `headers` :param headers: The headers as text. """ return headers def process_body(self, content, content_type, subtype, encoding): """Return processed `content`. :param content: The body content as text :param content_type: Full content type, e.g., 'application/atom+xml'. :param subtype: E.g. 'xml'. :param encoding: The original content encoding. """ return content class JSONProcessor(BaseProcessor): """JSON body processor.""" def process_body(self, content, content_type, subtype, encoding): if subtype == 'json': try: # Indent the JSON data, sort keys by name, and # avoid unicode escapes to improve readability. content = json.dumps(json.loads(content), sort_keys=True, ensure_ascii=False, indent=DEFAULT_INDENT) except ValueError: # Invalid JSON but we don't care. pass return content class XMLProcessor(BaseProcessor): """XML body processor.""" # TODO: tests def process_body(self, content, content_type, subtype, encoding): if subtype == 'xml': try: # Pretty print the XML doc = xml.dom.minidom.parseString(content.encode(encoding)) content = doc.toprettyxml(indent=' ' * DEFAULT_INDENT) except xml.parsers.expat.ExpatError: # Ignore invalid XML errors (skips attempting to pretty print) pass return content class PygmentsProcessor(BaseProcessor): """A processor that applies syntax-highlighting using Pygments to the headers, and to the body as well if its content type is recognized. """ def __init__(self, *args, **kwargs): super(PygmentsProcessor, self).__init__(*args, **kwargs) # Cache that speeds up when we process streamed body by line. self.lexers_by_type = {} if not self.env.colors: self.enabled = False return try: style = get_style_by_name( self.kwargs.get('pygments_style', DEFAULT_STYLE)) except ClassNotFound: style = Solarized256Style if self.env.is_windows or self.env.colors == 256: fmt_class = Terminal256Formatter else: fmt_class = TerminalFormatter self.formatter = fmt_class(style=style) def process_headers(self, headers): return pygments.highlight( headers, HTTPLexer(), self.formatter).strip() def process_body(self, content, content_type, subtype, encoding): try: lexer = self.lexers_by_type.get(content_type) if not lexer: try: lexer = get_lexer_for_mimetype(content_type) except ClassNotFound: lexer = get_lexer_by_name(subtype) self.lexers_by_type[content_type] = lexer except ClassNotFound: pass else: content = pygments.highlight(content, lexer, self.formatter) return content.strip() class HeadersProcessor(BaseProcessor): """Sorts headers by name retaining relative order of multiple headers with the same name. """ def process_headers(self, headers): lines = headers.splitlines() headers = sorted(lines[1:], key=lambda h: h.split(':')[0]) return '\r\n'.join(lines[:1] + headers) class OutputProcessor(object): """A delegate class that invokes the actual processors.""" installed_processors = { 'format': [ HeadersProcessor, JSONProcessor, XMLProcessor ], 'colors': [ PygmentsProcessor ] } def __init__(self, groups, env=Environment(), **kwargs): """ :param env: a :class:`models.Environment` instance :param groups: the groups of processors to be applied :param kwargs: additional keyword arguments for processors """ self.processors = [] for group in groups: for cls in self.installed_processors[group]: processor = cls(env, **kwargs) if processor.enabled: self.processors.append(processor) def process_headers(self, headers): for processor in self.processors: headers = processor.process_headers(headers) return headers def process_body(self, content, content_type, encoding): # e.g., 'application/atom+xml' content_type = content_type.split(';')[0] # e.g., 'xml' subtype = content_type.split('/')[-1].split('+')[-1] for processor in self.processors: content = processor.process_body( content, content_type, subtype, encoding ) return content httpie-0.8.0/httpie/plugins/000077500000000000000000000000001227074336400160025ustar00rootroot00000000000000httpie-0.8.0/httpie/plugins/__init__.py000066400000000000000000000003561227074336400201170ustar00rootroot00000000000000from .base import AuthPlugin from .manager import PluginManager from .builtin import BasicAuthPlugin, DigestAuthPlugin plugin_manager = PluginManager() plugin_manager.register(BasicAuthPlugin) plugin_manager.register(DigestAuthPlugin) httpie-0.8.0/httpie/plugins/base.py000066400000000000000000000012731227074336400172710ustar00rootroot00000000000000class AuthPlugin(object): """ Base auth plugin class. See for an example auth plugin. """ # The value that should be passed to --auth-type # to use this auth plugin. Eg. "my-auth" auth_type = None # The name of the plugin, eg. "My auth". name = None # Optional short description. Will be be shown in the help # under --auth-type. description = None # This be set automatically once the plugin has been loaded. package_name = None def get_auth(self, username, password): """ Return a ``requests.auth.AuthBase`` subclass instance. """ raise NotImplementedError() httpie-0.8.0/httpie/plugins/builtin.py000066400000000000000000000010321227074336400200160ustar00rootroot00000000000000import requests.auth from .base import AuthPlugin class BuiltinAuthPlugin(AuthPlugin): package_name = '(builtin)' class BasicAuthPlugin(BuiltinAuthPlugin): name = 'Basic HTTP auth' auth_type = 'basic' def get_auth(self, username, password): return requests.auth.HTTPBasicAuth(username, password) class DigestAuthPlugin(BuiltinAuthPlugin): name = 'Digest HTTP auth' auth_type = 'digest' def get_auth(self, username, password): return requests.auth.HTTPDigestAuth(username, password) httpie-0.8.0/httpie/plugins/manager.py000066400000000000000000000016031227074336400177660ustar00rootroot00000000000000from pkg_resources import iter_entry_points ENTRY_POINT_NAMES = [ 'httpie.plugins.auth.v1' ] class PluginManager(object): def __init__(self): self._plugins = [] def __iter__(self): return iter(self._plugins) def register(self, plugin): self._plugins.append(plugin) def get_auth_plugins(self): return list(self._plugins) def get_auth_plugin_mapping(self): return dict((plugin.auth_type, plugin) for plugin in self) def get_auth_plugin(self, auth_type): return self.get_auth_plugin_mapping()[auth_type] def load_installed_plugins(self): for entry_point_name in ENTRY_POINT_NAMES: for entry_point in iter_entry_points(entry_point_name): plugin = entry_point.load() plugin.package_name = entry_point.dist.key self.register(entry_point.load()) httpie-0.8.0/httpie/sessions.py000066400000000000000000000110241227074336400165370ustar00rootroot00000000000000"""Persistent, JSON-serialized sessions. """ import re import os import requests from requests.cookies import RequestsCookieJar, create_cookie from .compat import urlsplit from .config import BaseConfigDict, DEFAULT_CONFIG_DIR from httpie.plugins import plugin_manager SESSIONS_DIR_NAME = 'sessions' DEFAULT_SESSIONS_DIR = os.path.join(DEFAULT_CONFIG_DIR, SESSIONS_DIR_NAME) VALID_SESSION_NAME_PATTERN = re.compile('^[a-zA-Z0-9_.-]+$') # Request headers starting with these prefixes won't be stored in sessions. # They are specific to each request. # http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Requests SESSION_IGNORED_HEADER_PREFIXES = ['Content-', 'If-'] def get_response(session_name, requests_kwargs, config_dir, args, read_only=False): """Like `client.get_response`, but applies permanent aspects of the session to the request. """ if os.path.sep in session_name: path = os.path.expanduser(session_name) else: hostname = ( requests_kwargs['headers'].get('Host', None) or urlsplit(requests_kwargs['url']).netloc.split('@')[-1] ) assert re.match('^[a-zA-Z0-9_.:-]+$', hostname) # host:port => host_port hostname = hostname.replace(':', '_') path = os.path.join(config_dir, SESSIONS_DIR_NAME, hostname, session_name + '.json') session = Session(path) session.load() request_headers = requests_kwargs.get('headers', {}) requests_kwargs['headers'] = dict(session.headers, **request_headers) session.update_headers(request_headers) if args.auth: session.auth = { 'type': args.auth_type, 'username': args.auth.key, 'password': args.auth.value, } elif session.auth: requests_kwargs['auth'] = session.auth requests_session = requests.Session() requests_session.cookies = session.cookies try: response = requests_session.request(**requests_kwargs) except Exception: raise else: # Existing sessions with `read_only=True` don't get updated. if session.is_new or not read_only: session.cookies = requests_session.cookies session.save() return response class Session(BaseConfigDict): helpurl = 'https://github.com/jkbr/httpie#sessions' about = 'HTTPie session file' def __init__(self, path, *args, **kwargs): super(Session, self).__init__(*args, **kwargs) self._path = path self['headers'] = {} self['cookies'] = {} self['auth'] = { 'type': None, 'username': None, 'password': None } def _get_path(self): return self._path def update_headers(self, request_headers): """ Update the session headers with the request ones while ignoring certain name prefixes. :type request_headers: dict """ for name, value in request_headers.items(): if name == 'User-Agent' and value.startswith('HTTPie/'): continue for prefix in SESSION_IGNORED_HEADER_PREFIXES: if name.lower().startswith(prefix.lower()): break else: self['headers'][name] = value @property def headers(self): return self['headers'] @property def cookies(self): jar = RequestsCookieJar() for name, cookie_dict in self['cookies'].items(): jar.set_cookie(create_cookie( name, cookie_dict.pop('value'), **cookie_dict)) jar.clear_expired_cookies() return jar @cookies.setter def cookies(self, jar): """ :type jar: CookieJar """ # http://docs.python.org/2/library/cookielib.html#cookie-objects stored_attrs = ['value', 'path', 'secure', 'expires'] self['cookies'] = {} for cookie in jar: self['cookies'][cookie.name] = dict( (attname, getattr(cookie, attname)) for attname in stored_attrs ) @property def auth(self): auth = self.get('auth', None) if not auth or not auth['type']: return auth_plugin = plugin_manager.get_auth_plugin(auth['type'])() return auth_plugin.get_auth(auth['username'], auth['password']) @auth.setter def auth(self, auth): assert set(['type', 'username', 'password']) == set(auth.keys()) self['auth'] = auth httpie-0.8.0/httpie/solarized.py000066400000000000000000000050111227074336400166640ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ solarized256 ------------ A Pygments style inspired by Solarized's 256 color mode. :copyright: (c) 2011 by Hank Gay, (c) 2012 by John Mastro. :license: BSD, see LICENSE for more details. """ from pygments.style import Style from pygments.token import Token, Comment, Name, Keyword, Generic, Number, \ Operator, String BASE03 = "#1c1c1c" BASE02 = "#262626" BASE01 = "#4e4e4e" BASE00 = "#585858" BASE0 = "#808080" BASE1 = "#8a8a8a" BASE2 = "#d7d7af" BASE3 = "#ffffd7" YELLOW = "#af8700" ORANGE = "#d75f00" RED = "#af0000" MAGENTA = "#af005f" VIOLET = "#5f5faf" BLUE = "#0087ff" CYAN = "#00afaf" GREEN = "#5f8700" class Solarized256Style(Style): background_color = BASE03 styles = { Keyword: GREEN, Keyword.Constant: ORANGE, Keyword.Declaration: BLUE, Keyword.Namespace: ORANGE, #Keyword.Pseudo Keyword.Reserved: BLUE, Keyword.Type: RED, #Name Name.Attribute: BASE1, Name.Builtin: BLUE, Name.Builtin.Pseudo: BLUE, Name.Class: BLUE, Name.Constant: ORANGE, Name.Decorator: BLUE, Name.Entity: ORANGE, Name.Exception: YELLOW, Name.Function: BLUE, #Name.Label #Name.Namespace #Name.Other Name.Tag: BLUE, Name.Variable: BLUE, #Name.Variable.Class #Name.Variable.Global #Name.Variable.Instance #Literal #Literal.Date String: CYAN, String.Backtick: BASE01, String.Char: CYAN, String.Doc: CYAN, #String.Double String.Escape: RED, String.Heredoc: CYAN, #String.Interpol #String.Other String.Regex: RED, #String.Single #String.Symbol Number: CYAN, #Number.Float #Number.Hex #Number.Integer #Number.Integer.Long #Number.Oct Operator: BASE1, Operator.Word: GREEN, #Punctuation: ORANGE, Comment: BASE01, #Comment.Multiline Comment.Preproc: GREEN, #Comment.Single Comment.Special: GREEN, #Generic Generic.Deleted: CYAN, Generic.Emph: 'italic', Generic.Error: RED, Generic.Heading: ORANGE, Generic.Inserted: GREEN, #Generic.Output #Generic.Prompt Generic.Strong: 'bold', Generic.Subheading: ORANGE, #Generic.Traceback Token: BASE1, Token.Other: ORANGE, } httpie-0.8.0/httpie/utils.py000066400000000000000000000020251227074336400160320ustar00rootroot00000000000000from __future__ import division def humanize_bytes(n, precision=2): # Author: Doug Latornell # Licence: MIT # URL: http://code.activestate.com/recipes/577081/ """Return a humanized string representation of a number of bytes. Assumes `from __future__ import division`. >>> humanize_bytes(1) '1 byte' >>> humanize_bytes(1024) '1.0 kB' >>> humanize_bytes(1024 * 123) '123.0 kB' >>> humanize_bytes(1024 * 12342) '12.1 MB' >>> humanize_bytes(1024 * 12342, 2) '12.05 MB' >>> humanize_bytes(1024 * 1234, 2) '1.21 MB' >>> humanize_bytes(1024 * 1234 * 1111, 2) '1.31 GB' >>> humanize_bytes(1024 * 1234 * 1111, 1) '1.3 GB' """ abbrevs = [ (1 << 50, 'PB'), (1 << 40, 'TB'), (1 << 30, 'GB'), (1 << 20, 'MB'), (1 << 10, 'kB'), (1, 'B') ] if n == 1: return '1 B' for factor, suffix in abbrevs: if n >= factor: break return '%.*f %s' % (precision, n / factor, suffix) httpie-0.8.0/requirements-dev.txt000066400000000000000000000001441227074336400170630ustar00rootroot00000000000000tox git+git://github.com/kennethreitz/httpbin.git@7c96875e87a448f08fb1981e85eb79e77d592d98 docutils httpie-0.8.0/setup.py000066400000000000000000000034711227074336400145430ustar00rootroot00000000000000import os import sys import codecs from setuptools import setup import httpie if sys.argv[-1] == 'test': status = os.system('python tests/tests.py') sys.exit(1 if status > 127 else status) requirements = [ 'requests>=2.0.0', 'Pygments>=1.5' ] try: #noinspection PyUnresolvedReferences import argparse except ImportError: requirements.append('argparse>=1.2.1') if 'win32' in str(sys.platform).lower(): # Terminal colors for Windows requirements.append('colorama>=0.2.4') def long_description(): with codecs.open('README.rst', encoding='utf8') as f: return f.read() setup( name='httpie', version=httpie.__version__, description=httpie.__doc__.strip(), long_description=long_description(), url='http://httpie.org/', download_url='https://github.com/jkbr/httpie', author=httpie.__author__, author_email='jakub@roztocil.name', license=httpie.__licence__, packages=['httpie', 'httpie.plugins'], entry_points={ 'console_scripts': [ 'http = httpie.__main__:main', ], }, install_requires=requirements, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Programming Language :: Python', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.1', 'Programming Language :: Python :: 3.2', 'Environment :: Console', 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'License :: OSI Approved :: BSD License', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Software Development', 'Topic :: System :: Networking', 'Topic :: Terminals', 'Topic :: Text Processing', 'Topic :: Utilities' ], ) httpie-0.8.0/tests/000077500000000000000000000000001227074336400141665ustar00rootroot00000000000000httpie-0.8.0/tests/fixtures/000077500000000000000000000000001227074336400160375ustar00rootroot00000000000000httpie-0.8.0/tests/fixtures/file.bin000066400000000000000000000021761227074336400174560ustar00rootroot00000000000000 h(  |OEMIx4z?|@|<{Az_ |ʩ1v;?>}>zCy /J9A<@={7 JU%4;=C>}8 *? 9<=>>лmI*8;9<<I"^8~VnkF-<;;===Y'UJHQ&-9;8;==8VOoBڿw577<<8=>^'־޿,;:79:?Bl(T]Ϲ p7=;6 -e:+ҩSdXȐY()& |;]fZΎWPSl$cfYүFFPWcb _ LѬ:?httpie-0.8.0/tests/fixtures/file.txt000066400000000000000000000000261227074336400175150ustar00rootroot00000000000000__test_file_content__ httpie-0.8.0/tests/fixtures/file2.txt000066400000000000000000000000261227074336400175770ustar00rootroot00000000000000__test_file_content__ httpie-0.8.0/tests/fixtures/test.json000066400000000000000000000000311227074336400177030ustar00rootroot00000000000000{ "hello": "world" } httpie-0.8.0/tests/tests.py000077500000000000000000001435601227074336400157160ustar00rootroot00000000000000#!/usr/bin/env python # coding=utf8 """ Many of the test cases here use httpbin.org. To make it run faster and offline you can:: # Install `httpbin` locally pip install git+https://github.com/kennethreitz/httpbin.git # Run it httpbin # Run the tests against it HTTPBIN_URL=http://localhost:5000 python setup.py test # Test all Python environments HTTPBIN_URL=http://localhost:5000 tox """ import subprocess import os import sys import json #noinspection PyCompatibility import argparse import tempfile import unittest import shutil import time from requests.structures import CaseInsensitiveDict try: #noinspection PyCompatibility from urllib.request import urlopen except ImportError: # noinspection PyUnresolvedReferences #noinspection PyCompatibility from urllib2 import urlopen try: from unittest import skipIf, skip except ImportError: skip = lambda msg: lambda self: None # noinspection PyUnusedLocal def skipIf(cond, reason): def decorator(test_method): if cond: return lambda self: None return test_method return decorator from requests import __version__ as requests_version ################################################################# # Utils/setup ################################################################# # HACK: Prepend ../ to PYTHONPATH so that we can import httpie form there. TESTS_ROOT = os.path.abspath(os.path.dirname(__file__)) sys.path.insert(0, os.path.realpath(os.path.join(TESTS_ROOT, '..'))) from httpie import ExitStatus from httpie import input from httpie.cli import parser from httpie.models import Environment from httpie.core import main from httpie.output import BINARY_SUPPRESSED_NOTICE from httpie.input import ParseError from httpie.compat import is_windows, is_py26, bytes, str from httpie.downloads import ( parse_content_range, filename_from_content_disposition, filename_from_url, get_unique_filename, ContentRangeError, Download, ) CRLF = '\r\n' HTTPBIN_URL = os.environ.get('HTTPBIN_URL', 'http://httpbin.org').rstrip('/') OK = 'HTTP/1.1 200' OK_COLOR = ( 'HTTP\x1b[39m\x1b[38;5;245m/\x1b[39m\x1b' '[38;5;37m1.1\x1b[39m\x1b[38;5;245m \x1b[39m\x1b[38;5;37m200' '\x1b[39m\x1b[38;5;245m \x1b[39m\x1b[38;5;136mOK' ) COLOR = '\x1b[' def patharg(path): """Back slashes need to be escaped in ITEM args, even in Windows paths.""" return path.replace('\\', '\\\\\\') # Test files FILE_PATH = os.path.join(TESTS_ROOT, 'fixtures', 'file.txt') FILE2_PATH = os.path.join(TESTS_ROOT, 'fixtures', 'file2.txt') BIN_FILE_PATH = os.path.join(TESTS_ROOT, 'fixtures', 'file.bin') JSON_FILE_PATH = os.path.join(TESTS_ROOT, 'fixtures', 'test.json') FILE_PATH_ARG = patharg(FILE_PATH) FILE2_PATH_ARG = patharg(FILE2_PATH) BIN_FILE_PATH_ARG = patharg(BIN_FILE_PATH) JSON_FILE_PATH_ARG = patharg(JSON_FILE_PATH) with open(FILE_PATH) as f: # Strip because we don't want new lines in the data so that we can # easily count occurrences also when embedded in JSON (where the new # line would be escaped). FILE_CONTENT = f.read().strip() with open(BIN_FILE_PATH, 'rb') as f: BIN_FILE_CONTENT = f.read() with open(JSON_FILE_PATH, 'rb') as f: JSON_FILE_CONTENT = f.read() def httpbin(path): url = HTTPBIN_URL + path return url def mk_config_dir(): return tempfile.mkdtemp(prefix='httpie_test_config_dir_') class TestEnvironment(Environment): colors = 0 stdin_isatty = True, stdout_isatty = True is_windows = False _shutil = shutil # we need it in __del__ (would get gc'd) def __init__(self, **kwargs): if 'stdout' not in kwargs: kwargs['stdout'] = tempfile.TemporaryFile('w+b') if 'stderr' not in kwargs: kwargs['stderr'] = tempfile.TemporaryFile('w+t') self.delete_config_dir = False if 'config_dir' not in kwargs: kwargs['config_dir'] = mk_config_dir() self.delete_config_dir = True super(TestEnvironment, self).__init__(**kwargs) def __del__(self): if self.delete_config_dir: self._shutil.rmtree(self.config_dir) def has_docutils(): try: #noinspection PyUnresolvedReferences import docutils return True except ImportError: return False def get_readme_errors(): p = subprocess.Popen([ 'rst2pseudoxml.py', '--report=1', '--exit-status=1', os.path.join(TESTS_ROOT, '..', 'README.rst') ], stderr=subprocess.PIPE, stdout=subprocess.PIPE) err = p.communicate()[1] if p.returncode: return err class BytesResponse(bytes): stderr = json = exit_status = None class StrResponse(str): stderr = json = exit_status = None def http(*args, **kwargs): """ Invoke `httpie.core.main()` with `args` and `kwargs`, and return a unicode response. Return a `StrResponse`, or `BytesResponse` if unable to decode the output. The response has the following attributes: `stderr`: text written to stderr `exit_status`: the exit status `json`: decoded JSON (if possible) or `None` Exceptions are propagated except for SystemExit. """ env = kwargs.get('env') if not env: env = kwargs['env'] = TestEnvironment() stdout = env.stdout stderr = env.stderr try: try: exit_status = main(args=['--traceback'] + list(args), **kwargs) if '--download' in args: # Let the progress reporter thread finish. time.sleep(.5) except Exception: sys.stderr.write(stderr.read()) raise except SystemExit: exit_status = ExitStatus.ERROR stdout.seek(0) stderr.seek(0) output = stdout.read() try: r = StrResponse(output.decode('utf8')) except UnicodeDecodeError: r = BytesResponse(output) else: if COLOR not in r: # De-serialize JSON body if possible. if r.strip().startswith('{'): #noinspection PyTypeChecker r.json = json.loads(r) elif r.count('Content-Type:') == 1 and 'application/json' in r: try: j = r.strip()[r.strip().rindex('\r\n\r\n'):] except ValueError: pass else: try: r.json = json.loads(j) except ValueError: pass r.stderr = stderr.read() r.exit_status = exit_status return r finally: stdout.close() stderr.close() class BaseTestCase(unittest.TestCase): maxDiff = 100000 if is_py26: def assertIn(self, member, container, msg=None): self.assertTrue(member in container, msg) def assertNotIn(self, member, container, msg=None): self.assertTrue(member not in container, msg) def assertDictEqual(self, d1, d2, msg=None): self.assertEqual(set(d1.keys()), set(d2.keys()), msg) self.assertEqual(sorted(d1.values()), sorted(d2.values()), msg) def assertIsNone(self, obj, msg=None): self.assertEqual(obj, None, msg=msg) ################################################################# # High-level tests using httpbin. ################################################################# class HTTPieTest(BaseTestCase): def test_GET(self): r = http( 'GET', httpbin('/get') ) self.assertIn(OK, r) def test_DELETE(self): r = http( 'DELETE', httpbin('/delete') ) self.assertIn(OK, r) def test_PUT(self): r = http( 'PUT', httpbin('/put'), 'foo=bar' ) self.assertIn(OK, r) self.assertIn(r'\"foo\": \"bar\"', r) def test_POST_JSON_data(self): r = http( 'POST', httpbin('/post'), 'foo=bar' ) self.assertIn(OK, r) self.assertIn(r'\"foo\": \"bar\"', r) def test_POST_form(self): r = http( '--form', 'POST', httpbin('/post'), 'foo=bar' ) self.assertIn(OK, r) self.assertIn('"foo": "bar"', r) def test_POST_form_multiple_values(self): r = http( '--form', 'POST', httpbin('/post'), 'foo=bar', 'foo=baz', ) self.assertIn(OK, r) self.assertDictEqual(r.json['form'], { 'foo': ['bar', 'baz'] }) def test_POST_stdin(self): with open(FILE_PATH) as f: env = TestEnvironment( stdin=f, stdin_isatty=False, ) r = http( '--form', 'POST', httpbin('/post'), env=env ) self.assertIn(OK, r) self.assertIn(FILE_CONTENT, r) def test_headers(self): r = http( 'GET', httpbin('/headers'), 'Foo:bar' ) self.assertIn(OK, r) self.assertIn('"User-Agent": "HTTPie', r) self.assertIn('"Foo": "bar"', r) class QuerystringTest(BaseTestCase): def test_query_string_params_in_url(self): r = http( '--print=Hhb', 'GET', httpbin('/get?a=1&b=2') ) path = '/get?a=1&b=2' url = httpbin(path) self.assertIn(OK, r) self.assertIn('GET %s HTTP/1.1' % path, r) self.assertIn('"url": "%s"' % url, r) def test_query_string_params_items(self): r = http( '--print=Hhb', 'GET', httpbin('/get'), 'a==1', 'b==2' ) path = '/get?a=1&b=2' url = httpbin(path) self.assertIn(OK, r) self.assertIn('GET %s HTTP/1.1' % path, r) self.assertIn('"url": "%s"' % url, r) def test_query_string_params_in_url_and_items_with_duplicates(self): r = http( '--print=Hhb', 'GET', httpbin('/get?a=1&a=1'), 'a==1', 'a==1', 'b==2', ) path = '/get?a=1&a=1&a=1&a=1&b=2' url = httpbin(path) self.assertIn(OK, r) self.assertIn('GET %s HTTP/1.1' % path, r) self.assertIn('"url": "%s"' % url, r) class AutoContentTypeAndAcceptHeadersTest(BaseTestCase): """ Test that Accept and Content-Type correctly defaults to JSON, but can still be overridden. The same with Content-Type when --form -f is used. """ def test_GET_no_data_no_auto_headers(self): # https://github.com/jkbr/httpie/issues/62 r = http( 'GET', httpbin('/headers') ) self.assertIn(OK, r) self.assertIn('"Accept": "*/*"', r) self.assertNotIn('"Content-Type": "application/json', r) def test_POST_no_data_no_auto_headers(self): # JSON headers shouldn't be automatically set for POST with no data. r = http( 'POST', httpbin('/post') ) self.assertIn(OK, r) self.assertIn('"Accept": "*/*"', r) self.assertNotIn('"Content-Type": "application/json', r) def test_POST_with_data_auto_JSON_headers(self): r = http( 'POST', httpbin('/post'), 'a=b' ) self.assertIn(OK, r) self.assertIn('"Accept": "application/json"', r) self.assertIn('"Content-Type": "application/json; charset=utf-8', r) def test_GET_with_data_auto_JSON_headers(self): # JSON headers should automatically be set also for GET with data. r = http( 'POST', httpbin('/post'), 'a=b' ) self.assertIn(OK, r) self.assertIn('"Accept": "application/json"', r) self.assertIn('"Content-Type": "application/json; charset=utf-8', r) def test_POST_explicit_JSON_auto_JSON_accept(self): r = http( '--json', 'POST', httpbin('/post') ) self.assertIn(OK, r) self.assertEqual(r.json['headers']['Accept'], 'application/json') # Make sure Content-Type gets set even with no data. # https://github.com/jkbr/httpie/issues/137 self.assertIn('application/json', r.json['headers']['Content-Type']) def test_GET_explicit_JSON_explicit_headers(self): r = http( '--json', 'GET', httpbin('/headers'), 'Accept:application/xml', 'Content-Type:application/xml' ) self.assertIn(OK, r) self.assertIn('"Accept": "application/xml"', r) self.assertIn('"Content-Type": "application/xml"', r) def test_POST_form_auto_Content_Type(self): r = http( '--form', 'POST', httpbin('/post') ) self.assertIn(OK, r) self.assertIn( '"Content-Type":' ' "application/x-www-form-urlencoded; charset=utf-8"', r ) def test_POST_form_Content_Type_override(self): r = http( '--form', 'POST', httpbin('/post'), 'Content-Type:application/xml' ) self.assertIn(OK, r) self.assertIn('"Content-Type": "application/xml"', r) def test_print_only_body_when_stdout_redirected_by_default(self): r = http( 'GET', httpbin('/get'), env=TestEnvironment( stdin_isatty=True, stdout_isatty=False ) ) self.assertNotIn('HTTP/', r) def test_print_overridable_when_stdout_redirected(self): r = http( '--print=h', 'GET', httpbin('/get'), env=TestEnvironment( stdin_isatty=True, stdout_isatty=False ) ) self.assertIn(OK, r) class ImplicitHTTPMethodTest(BaseTestCase): def test_implicit_GET(self): r = http(httpbin('/get')) self.assertIn(OK, r) def test_implicit_GET_with_headers(self): r = http( httpbin('/headers'), 'Foo:bar' ) self.assertIn(OK, r) self.assertIn('"Foo": "bar"', r) def test_implicit_POST_json(self): r = http( httpbin('/post'), 'hello=world' ) self.assertIn(OK, r) self.assertIn(r'\"hello\": \"world\"', r) def test_implicit_POST_form(self): r = http( '--form', httpbin('/post'), 'foo=bar' ) self.assertIn(OK, r) self.assertIn('"foo": "bar"', r) def test_implicit_POST_stdin(self): with open(FILE_PATH) as f: env = TestEnvironment( stdin_isatty=False, stdin=f, ) r = http( '--form', httpbin('/post'), env=env ) self.assertIn(OK, r) class PrettyOptionsTest(BaseTestCase): """Test the --pretty flag handling.""" def test_pretty_enabled_by_default(self): r = http( 'GET', httpbin('/get'), env=TestEnvironment(colors=256), ) self.assertIn(COLOR, r) def test_pretty_enabled_by_default_unless_stdout_redirected(self): r = http( 'GET', httpbin('/get') ) self.assertNotIn(COLOR, r) def test_force_pretty(self): r = http( '--pretty=all', 'GET', httpbin('/get'), env=TestEnvironment(stdout_isatty=False, colors=256), ) self.assertIn(COLOR, r) def test_force_ugly(self): r = http( '--pretty=none', 'GET', httpbin('/get'), ) self.assertNotIn(COLOR, r) def test_subtype_based_pygments_lexer_match(self): """Test that media subtype is used if type/subtype doesn't match any lexer. """ r = http( '--print=B', '--pretty=all', httpbin('/post'), 'Content-Type:text/foo+json', 'a=b', env=TestEnvironment(colors=256) ) self.assertIn(COLOR, r) def test_colors_option(self): r = http( '--print=B', '--pretty=colors', 'GET', httpbin('/get'), 'a=b', env=TestEnvironment(colors=256), ) #noinspection PyUnresolvedReferences # Tests that the JSON data isn't formatted. self.assertEqual(r.strip().count('\n'), 0) self.assertIn(COLOR, r) def test_format_option(self): r = http( '--print=B', '--pretty=format', 'GET', httpbin('/get'), 'a=b', env=TestEnvironment(colors=256), ) #noinspection PyUnresolvedReferences # Tests that the JSON data is formatted. self.assertEqual(r.strip().count('\n'), 2) self.assertNotIn(COLOR, r) class VerboseFlagTest(BaseTestCase): def test_verbose(self): r = http( '--verbose', 'GET', httpbin('/get'), 'test-header:__test__' ) self.assertIn(OK, r) #noinspection PyUnresolvedReferences self.assertEqual(r.count('__test__'), 2) def test_verbose_form(self): # https://github.com/jkbr/httpie/issues/53 r = http( '--verbose', '--form', 'POST', httpbin('/post'), 'foo=bar', 'baz=bar' ) self.assertIn(OK, r) self.assertIn('foo=bar&baz=bar', r) def test_verbose_json(self): r = http( '--verbose', 'POST', httpbin('/post'), 'foo=bar', 'baz=bar' ) self.assertIn(OK, r) self.assertIn('"baz": "bar"', r) # request self.assertIn(r'\"baz\": \"bar\"', r) # response class MultipartFormDataFileUploadTest(BaseTestCase): def test_non_existent_file_raises_parse_error(self): self.assertRaises(ParseError, http, '--form', 'POST', httpbin('/post'), 'foo@/__does_not_exist__', ) def test_upload_ok(self): r = http( '--form', '--verbose', 'POST', httpbin('/post'), 'test-file@%s' % FILE_PATH_ARG, 'foo=bar' ) self.assertIn(OK, r) self.assertIn('Content-Disposition: form-data; name="foo"', r) self.assertIn('Content-Disposition: form-data; name="test-file";' ' filename="%s"' % os.path.basename(FILE_PATH), r) #noinspection PyUnresolvedReferences self.assertEqual(r.count(FILE_CONTENT), 2) self.assertIn('"foo": "bar"', r) class BinaryRequestDataTest(BaseTestCase): def test_binary_stdin(self): with open(BIN_FILE_PATH, 'rb') as stdin: env = TestEnvironment( stdin=stdin, stdin_isatty=False, stdout_isatty=False ) r = http( '--print=B', 'POST', httpbin('/post'), env=env, ) self.assertEqual(r, BIN_FILE_CONTENT) def test_binary_file_path(self): env = TestEnvironment( stdin_isatty=True, stdout_isatty=False ) r = http( '--print=B', 'POST', httpbin('/post'), '@' + BIN_FILE_PATH_ARG, env=env, ) self.assertEqual(r, BIN_FILE_CONTENT) def test_binary_file_form(self): env = TestEnvironment( stdin_isatty=True, stdout_isatty=False ) r = http( '--print=B', '--form', 'POST', httpbin('/post'), 'test@' + BIN_FILE_PATH_ARG, env=env, ) self.assertIn(bytes(BIN_FILE_CONTENT), bytes(r)) class BinaryResponseDataTest(BaseTestCase): url = 'http://www.google.com/favicon.ico' @property def bindata(self): if not hasattr(self, '_bindata'): self._bindata = urlopen(self.url).read() return self._bindata def test_binary_suppresses_when_terminal(self): r = http( 'GET', self.url ) self.assertIn(BINARY_SUPPRESSED_NOTICE.decode(), r) def test_binary_suppresses_when_not_terminal_but_pretty(self): r = http( '--pretty=all', 'GET', self.url, env=TestEnvironment(stdin_isatty=True, stdout_isatty=False) ) self.assertIn(BINARY_SUPPRESSED_NOTICE.decode(), r) def test_binary_included_and_correct_when_suitable(self): r = http( 'GET', self.url, env=TestEnvironment(stdin_isatty=True, stdout_isatty=False) ) self.assertEqual(r, self.bindata) class RequestBodyFromFilePathTest(BaseTestCase): """ `http URL @file' """ def test_request_body_from_file_by_path(self): r = http( '--verbose', 'POST', httpbin('/post'), '@' + FILE_PATH_ARG ) self.assertIn(OK, r) self.assertIn(FILE_CONTENT, r) self.assertIn('"Content-Type": "text/plain"', r) def test_request_body_from_file_by_path_with_explicit_content_type(self): r = http( 'POST', httpbin('/post'), '@' + FILE_PATH_ARG, 'Content-Type:x-foo/bar' ) self.assertIn(OK, r) self.assertIn(FILE_CONTENT, r) self.assertIn('"Content-Type": "x-foo/bar"', r) def test_request_body_from_file_by_path_no_field_name_allowed(self): env = TestEnvironment(stdin_isatty=True) r = http( 'POST', httpbin('/post'), 'field-name@' + FILE_PATH_ARG, env=env ) self.assertIn('perhaps you meant --form?', r.stderr) def test_request_body_from_file_by_path_no_data_items_allowed(self): r = http( 'POST', httpbin('/post'), '@' + FILE_PATH_ARG, 'foo=bar', env=TestEnvironment(stdin_isatty=False) ) self.assertIn('cannot be mixed', r.stderr) class AuthTest(BaseTestCase): def test_basic_auth(self): r = http( '--auth=user:password', 'GET', httpbin('/basic-auth/user/password') ) self.assertIn(OK, r) self.assertIn('"authenticated": true', r) self.assertIn('"user": "user"', r) @skipIf(requests_version == '0.13.6', 'Redirects with prefetch=False are broken in Requests 0.13.6') def test_digest_auth(self): r = http( '--auth-type=digest', '--auth=user:password', 'GET', httpbin('/digest-auth/auth/user/password') ) self.assertIn(OK, r) self.assertIn(r'"authenticated": true', r) self.assertIn(r'"user": "user"', r) def test_password_prompt(self): input.AuthCredentials._getpass = lambda self, prompt: 'password' r = http( '--auth', 'user', 'GET', httpbin('/basic-auth/user/password') ) self.assertIn(OK, r) self.assertIn('"authenticated": true', r) self.assertIn('"user": "user"', r) def test_credentials_in_url(self): url = httpbin('/basic-auth/user/password') url = 'http://user:password@' + url.split('http://', 1)[1] r = http( 'GET', url ) self.assertIn(OK, r) self.assertIn('"authenticated": true', r) self.assertIn('"user": "user"', r) def test_credentials_in_url_auth_flag_has_priority(self): """When credentials are passed in URL and via -a at the same time, then the ones from -a are used.""" url = httpbin('/basic-auth/user/password') url = 'http://user:wrong_password@' + url.split('http://', 1)[1] r = http( '--auth=user:password', 'GET', url ) self.assertIn(OK, r) self.assertIn('"authenticated": true', r) self.assertIn('"user": "user"', r) class ExitStatusTest(BaseTestCase): def test_ok_response_exits_0(self): r = http( 'GET', httpbin('/status/200') ) self.assertIn(OK, r) self.assertEqual(r.exit_status, ExitStatus.OK) def test_error_response_exits_0_without_check_status(self): r = http( 'GET', httpbin('/status/500') ) self.assertIn('HTTP/1.1 500', r) self.assertEqual(r.exit_status, ExitStatus.OK) self.assertTrue(not r.stderr) def test_timeout_exit_status(self): r = http( '--timeout=0.5', 'GET', httpbin('/delay/1') ) self.assertEqual(r.exit_status, ExitStatus.ERROR_TIMEOUT) def test_3xx_check_status_exits_3_and_stderr_when_stdout_redirected(self): r = http( '--check-status', '--headers', # non-terminal, force headers 'GET', httpbin('/status/301'), env=TestEnvironment(stdout_isatty=False,) ) self.assertIn('HTTP/1.1 301', r) self.assertEqual(r.exit_status, ExitStatus.ERROR_HTTP_3XX) self.assertIn('301 moved permanently', r.stderr.lower()) @skipIf(requests_version == '0.13.6', 'Redirects with prefetch=False are broken in Requests 0.13.6') def test_3xx_check_status_redirects_allowed_exits_0(self): r = http( '--check-status', '--follow', 'GET', httpbin('/status/301') ) # The redirect will be followed so 200 is expected. self.assertIn('HTTP/1.1 200 OK', r) self.assertEqual(r.exit_status, ExitStatus.OK) def test_4xx_check_status_exits_4(self): r = http( '--check-status', 'GET', httpbin('/status/401') ) self.assertIn('HTTP/1.1 401', r) self.assertEqual(r.exit_status, ExitStatus.ERROR_HTTP_4XX) # Also stderr should be empty since stdout isn't redirected. self.assertTrue(not r.stderr) def test_5xx_check_status_exits_5(self): r = http( '--check-status', 'GET', httpbin('/status/500') ) self.assertIn('HTTP/1.1 500', r) self.assertEqual(r.exit_status, ExitStatus.ERROR_HTTP_5XX) class WindowsOnlyTests(BaseTestCase): @skip('FIXME: kills the runner') #@skipIf(not is_windows, 'windows-only') def test_windows_colorized_output(self): # Spits out the colorized output. http(httpbin('/get'), env=Environment()) class FakeWindowsTest(BaseTestCase): def test_output_file_pretty_not_allowed_on_windows(self): r = http( '--output', os.path.join(tempfile.gettempdir(), '__httpie_test_output__'), '--pretty=all', 'GET', httpbin('/get'), env=TestEnvironment(is_windows=True) ) self.assertIn( 'Only terminal output can be colorized on Windows', r.stderr) class StreamTest(BaseTestCase): # GET because httpbin 500s with binary POST body. @skipIf(is_windows, 'Pretty redirect not supported under Windows') def test_pretty_redirected_stream(self): """Test that --stream works with prettified redirected output.""" with open(BIN_FILE_PATH, 'rb') as f: r = http( '--verbose', '--pretty=all', '--stream', 'GET', httpbin('/get'), env=TestEnvironment( colors=256, stdin=f, stdin_isatty=False, stdout_isatty=False, ) ) self.assertIn(BINARY_SUPPRESSED_NOTICE.decode(), r) # We get 'Bad Request' but it's okay. #self.assertIn(OK_COLOR, r) def test_encoded_stream(self): """Test that --stream works with non-prettified redirected terminal output.""" with open(BIN_FILE_PATH, 'rb') as f: r = http( '--pretty=none', '--stream', '--verbose', 'GET', httpbin('/get'), env=TestEnvironment( stdin=f, stdin_isatty=False ), ) self.assertIn(BINARY_SUPPRESSED_NOTICE.decode(), r) # We get 'Bad Request' but it's okay. #self.assertIn(OK, r) def test_redirected_stream(self): """Test that --stream works with non-prettified redirected terminal output.""" with open(BIN_FILE_PATH, 'rb') as f: r = http( '--pretty=none', '--stream', '--verbose', 'GET', httpbin('/get'), env=TestEnvironment( stdout_isatty=False, stdin=f, stdin_isatty=False ) ) # We get 'Bad Request' but it's okay. #self.assertIn(OK.encode(), r) self.assertIn(BIN_FILE_CONTENT, r) class IgnoreStdinTest(BaseTestCase): def test_ignore_stdin(self): with open(FILE_PATH) as f: r = http( '--ignore-stdin', '--verbose', httpbin('/get'), env=TestEnvironment(stdin=f, stdin_isatty=False) ) self.assertIn(OK, r) self.assertIn('GET /get HTTP', r) # Don't default to POST. self.assertNotIn(FILE_CONTENT, r) # Don't send stdin data. def test_ignore_stdin_cannot_prompt_password(self): r = http( '--ignore-stdin', '--auth=username-without-password', httpbin('/get'), ) self.assertEqual(r.exit_status, ExitStatus.ERROR) self.assertIn('because --ignore-stdin', r.stderr) class LineEndingsTest(BaseTestCase): """Test that CRLF is properly used in headers and as the headers/body separator.""" def _validate_crlf(self, msg): lines = iter(msg.splitlines(True)) for header in lines: if header == CRLF: break self.assertTrue(header.endswith(CRLF), repr(header)) else: self.fail('CRLF between headers and body not found in %r' % msg) body = ''.join(lines) self.assertNotIn(CRLF, body) return body def test_CRLF_headers_only(self): r = http( '--headers', 'GET', httpbin('/get') ) body = self._validate_crlf(r) self.assertFalse(body, 'Garbage after headers: %r' % r) def test_CRLF_ugly_response(self): r = http( '--pretty=none', 'GET', httpbin('/get') ) self._validate_crlf(r) def test_CRLF_formatted_response(self): r = http( '--pretty=format', 'GET', httpbin('/get') ) self.assertEqual(r.exit_status, 0) self._validate_crlf(r) def test_CRLF_ugly_request(self): r = http( '--pretty=none', '--print=HB', 'GET', httpbin('/get') ) self._validate_crlf(r) def test_CRLF_formatted_request(self): r = http( '--pretty=format', '--print=HB', 'GET', httpbin('/get') ) self._validate_crlf(r) ################################################################# # CLI argument parsing related tests. ################################################################# class ItemParsingTest(BaseTestCase): def setUp(self): self.key_value_type = input.KeyValueArgType( *input.SEP_GROUP_ALL_ITEMS ) def test_invalid_items(self): items = ['no-separator'] for item in items: self.assertRaises(argparse.ArgumentTypeError, lambda: self.key_value_type(item)) def test_escape(self): headers, data, files, params = input.parse_items([ # headers self.key_value_type('foo\\:bar:baz'), self.key_value_type('jack\\@jill:hill'), # data self.key_value_type('baz\\=bar=foo'), # files self.key_value_type('bar\\@baz@%s' % FILE_PATH_ARG) ]) # `requests.structures.CaseInsensitiveDict` => `dict` headers = dict(headers._store.values()) self.assertDictEqual(headers, { 'foo:bar': 'baz', 'jack@jill': 'hill', }) self.assertDictEqual(data, { 'baz=bar': 'foo', }) self.assertIn('bar@baz', files) def test_escape_longsep(self): headers, data, files, params = input.parse_items([ self.key_value_type('bob\\:==foo'), ]) self.assertDictEqual(params, { 'bob:': 'foo', }) def test_valid_items(self): headers, data, files, params = input.parse_items([ self.key_value_type('string=value'), self.key_value_type('header:value'), self.key_value_type('list:=["a", 1, {}, false]'), self.key_value_type('obj:={"a": "b"}'), self.key_value_type('eh:'), self.key_value_type('ed='), self.key_value_type('bool:=true'), self.key_value_type('file@' + FILE_PATH_ARG), self.key_value_type('query==value'), self.key_value_type('string-embed=@' + FILE_PATH_ARG), self.key_value_type('raw-json-embed:=@' + JSON_FILE_PATH_ARG), ]) # Parsed headers # `requests.structures.CaseInsensitiveDict` => `dict` headers = dict(headers._store.values()) self.assertDictEqual(headers, { 'header': 'value', 'eh': '' }) # Parsed data raw_json_embed = data.pop('raw-json-embed') self.assertDictEqual(raw_json_embed, json.loads( JSON_FILE_CONTENT.decode('utf8'))) data['string-embed'] = data['string-embed'].strip() self.assertDictEqual(dict(data), { "ed": "", "string": "value", "bool": True, "list": ["a", 1, {}, False], "obj": {"a": "b"}, "string-embed": FILE_CONTENT, }) # Parsed query string parameters self.assertDictEqual(params, { 'query': 'value', }) # Parsed file fields self.assertIn('file', files) self.assertEqual(files['file'][1].read().strip().decode('utf8'), FILE_CONTENT) class CLIParserTestCase(unittest.TestCase): def test_expand_localhost_shorthand(self): args = parser.parse_args(args=[':'], env=TestEnvironment()) self.assertEqual(args.url, 'http://localhost') def test_expand_localhost_shorthand_with_slash(self): args = parser.parse_args(args=[':/'], env=TestEnvironment()) self.assertEqual(args.url, 'http://localhost/') def test_expand_localhost_shorthand_with_port(self): args = parser.parse_args(args=[':3000'], env=TestEnvironment()) self.assertEqual(args.url, 'http://localhost:3000') def test_expand_localhost_shorthand_with_path(self): args = parser.parse_args(args=[':/path'], env=TestEnvironment()) self.assertEqual(args.url, 'http://localhost/path') def test_expand_localhost_shorthand_with_port_and_slash(self): args = parser.parse_args(args=[':3000/'], env=TestEnvironment()) self.assertEqual(args.url, 'http://localhost:3000/') def test_expand_localhost_shorthand_with_port_and_path(self): args = parser.parse_args(args=[':3000/path'], env=TestEnvironment()) self.assertEqual(args.url, 'http://localhost:3000/path') def test_dont_expand_shorthand_ipv6_as_shorthand(self): args = parser.parse_args(args=['::1'], env=TestEnvironment()) self.assertEqual(args.url, 'http://::1') def test_dont_expand_longer_ipv6_as_shorthand(self): args = parser.parse_args( args=['::ffff:c000:0280'], env=TestEnvironment() ) self.assertEqual(args.url, 'http://::ffff:c000:0280') def test_dont_expand_full_ipv6_as_shorthand(self): args = parser.parse_args( args=['0000:0000:0000:0000:0000:0000:0000:0001'], env=TestEnvironment() ) self.assertEqual( args.url, 'http://0000:0000:0000:0000:0000:0000:0000:0001' ) class ArgumentParserTestCase(unittest.TestCase): def setUp(self): self.parser = input.Parser() def test_guess_when_method_set_and_valid(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'GET' self.parser.args.url = 'http://example.com/' self.parser.args.items = [] self.parser.args.ignore_stdin = False self.parser.env = TestEnvironment() self.parser._guess_method() self.assertEqual(self.parser.args.method, 'GET') self.assertEqual(self.parser.args.url, 'http://example.com/') self.assertEqual(self.parser.args.items, []) def test_guess_when_method_not_set(self): self.parser.args = argparse.Namespace() self.parser.args.method = None self.parser.args.url = 'http://example.com/' self.parser.args.items = [] self.parser.args.ignore_stdin = False self.parser.env = TestEnvironment() self.parser._guess_method() self.assertEqual(self.parser.args.method, 'GET') self.assertEqual(self.parser.args.url, 'http://example.com/') self.assertEqual(self.parser.args.items, []) def test_guess_when_method_set_but_invalid_and_data_field(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'http://example.com/' self.parser.args.url = 'data=field' self.parser.args.items = [] self.parser.args.ignore_stdin = False self.parser.env = TestEnvironment() self.parser._guess_method() self.assertEqual(self.parser.args.method, 'POST') self.assertEqual(self.parser.args.url, 'http://example.com/') self.assertEqual( self.parser.args.items, [input.KeyValue( key='data', value='field', sep='=', orig='data=field')]) def test_guess_when_method_set_but_invalid_and_header_field(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'http://example.com/' self.parser.args.url = 'test:header' self.parser.args.items = [] self.parser.args.ignore_stdin = False self.parser.env = TestEnvironment() self.parser._guess_method() self.assertEqual(self.parser.args.method, 'GET') self.assertEqual(self.parser.args.url, 'http://example.com/') self.assertEqual( self.parser.args.items, [input.KeyValue( key='test', value='header', sep=':', orig='test:header')]) def test_guess_when_method_set_but_invalid_and_item_exists(self): self.parser.args = argparse.Namespace() self.parser.args.method = 'http://example.com/' self.parser.args.url = 'new_item=a' self.parser.args.items = [ input.KeyValue( key='old_item', value='b', sep='=', orig='old_item=b') ] self.parser.args.ignore_stdin = False self.parser.env = TestEnvironment() self.parser._guess_method() self.assertEqual(self.parser.args.items, [ input.KeyValue( key='new_item', value='a', sep='=', orig='new_item=a'), input.KeyValue( key='old_item', value='b', sep='=', orig='old_item=b'), ]) class TestNoOptions(BaseTestCase): def test_valid_no_options(self): r = http( '--verbose', '--no-verbose', 'GET', httpbin('/get') ) self.assertNotIn('GET /get HTTP/1.1', r) def test_invalid_no_options(self): r = http( '--no-war', 'GET', httpbin('/get') ) self.assertEqual(r.exit_status, 1) self.assertIn('unrecognized arguments: --no-war', r.stderr) self.assertNotIn('GET /get HTTP/1.1', r) class READMETest(BaseTestCase): @skipIf(not has_docutils(), 'docutils not installed') def test_README_reStructuredText_valid(self): errors = get_readme_errors() self.assertFalse(errors, msg=errors) class SessionTest(BaseTestCase): @property def env(self): return TestEnvironment(config_dir=self.config_dir) def setUp(self): # Start a full-blown session with a custom request header, # authorization, and response cookies. self.config_dir = mk_config_dir() r = http( '--follow', '--session=test', '--auth=username:password', 'GET', httpbin('/cookies/set?hello=world'), 'Hello:World', env=self.env ) self.assertIn(OK, r) def tearDown(self): shutil.rmtree(self.config_dir) def test_session_create(self): # Verify that the session has been created. r = http( '--session=test', 'GET', httpbin('/get'), env=self.env ) self.assertIn(OK, r) self.assertEqual(r.json['headers']['Hello'], 'World') self.assertEqual(r.json['headers']['Cookie'], 'hello=world') self.assertIn('Basic ', r.json['headers']['Authorization']) def test_session_ignored_header_prefixes(self): r = http( '--session=test', 'GET', httpbin('/get'), 'Content-Type: text/plain', 'If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT', env=self.env ) self.assertIn(OK, r) r2 = http( '--session=test', 'GET', httpbin('/get') ) self.assertIn(OK, r2) self.assertNotIn('Content-Type', r2.json['headers']) self.assertNotIn('If-Unmodified-Since', r2.json['headers']) def test_session_update(self): # Get a response to a request from the original session. r1 = http( '--session=test', 'GET', httpbin('/get'), env=self.env ) self.assertIn(OK, r1) # Make a request modifying the session data. r2 = http( '--follow', '--session=test', '--auth=username:password2', 'GET', httpbin('/cookies/set?hello=world2'), 'Hello:World2', env=self.env ) self.assertIn(OK, r2) # Get a response to a request from the updated session. r3 = http( '--session=test', 'GET', httpbin('/get'), env=self.env ) self.assertIn(OK, r3) self.assertEqual(r3.json['headers']['Hello'], 'World2') self.assertEqual(r3.json['headers']['Cookie'], 'hello=world2') self.assertNotEqual(r1.json['headers']['Authorization'], r3.json['headers']['Authorization']) def test_session_read_only(self): # Get a response from the original session. r1 = http( '--session=test', 'GET', httpbin('/get'), env=self.env ) self.assertIn(OK, r1) # Make a request modifying the session data but # with --session-read-only. r2 = http( '--follow', '--session-read-only=test', '--auth=username:password2', 'GET', httpbin('/cookies/set?hello=world2'), 'Hello:World2', env=self.env ) self.assertIn(OK, r2) # Get a response from the updated session. r3 = http( '--session=test', 'GET', httpbin('/get'), env=self.env ) self.assertIn(OK, r3) # Origin can differ on Travis. del r1.json['origin'], r3.json['origin'] # Should be the same as before r2. self.assertDictEqual(r1.json, r3.json) def test_session_by_path(self): session_path = os.path.join(self.config_dir, 'session-by-path.json') r1 = http( '--session=' + session_path, 'GET', httpbin('/get'), 'Foo:Bar', env=self.env ) self.assertIn(OK, r1) r2 = http( '--session=' + session_path, 'GET', httpbin('/get'), env=self.env ) self.assertIn(OK, r2) self.assertEqual(r2.json['headers']['Foo'], 'Bar') class DownloadUtilsTest(BaseTestCase): def test_Content_Range_parsing(self): parse = parse_content_range self.assertEqual(parse('bytes 100-199/200', 100), 200) self.assertEqual(parse('bytes 100-199/*', 100), 200) # missing self.assertRaises(ContentRangeError, parse, None, 100) # syntax error self.assertRaises(ContentRangeError, parse, 'beers 100-199/*', 100) # unexpected range self.assertRaises(ContentRangeError, parse, 'bytes 100-199/*', 99) # invalid instance-length self.assertRaises(ContentRangeError, parse, 'bytes 100-199/199', 100) # invalid byte-range-resp-spec self.assertRaises(ContentRangeError, parse, 'bytes 100-99/199', 100) # invalid byte-range-resp-spec self.assertRaises(ContentRangeError, parse, 'bytes 100-100/*', 100) def test_Content_Disposition_parsing(self): parse = filename_from_content_disposition self.assertEqual( parse('attachment; filename=hello-WORLD_123.txt'), 'hello-WORLD_123.txt' ) self.assertEqual( parse('attachment; filename=".hello-WORLD_123.txt"'), 'hello-WORLD_123.txt' ) self.assertEqual( parse('attachment; filename="white space.txt"'), 'white space.txt' ) self.assertEqual( parse(r'attachment; filename="\"quotes\".txt"'), '"quotes".txt' ) self.assertEqual(parse('attachment; filename=/etc/hosts'), 'hosts') self.assertIsNone(parse('attachment; filename=')) def test_filename_from_url(self): self.assertEqual(filename_from_url( url='http://example.org/foo', content_type='text/plain' ), 'foo.txt') self.assertEqual(filename_from_url( url='http://example.org/foo', content_type='text/html; charset=utf8' ), 'foo.html') self.assertEqual(filename_from_url( url='http://example.org/foo', content_type=None ), 'foo') self.assertEqual(filename_from_url( url='http://example.org/foo', content_type='x-foo/bar' ), 'foo') def test_unique_filename(self): def make_exists(unique_on_attempt=0): # noinspection PyUnresolvedReferences,PyUnusedLocal def exists(filename): if exists.attempt == unique_on_attempt: return False exists.attempt += 1 return True exists.attempt = 0 return exists self.assertEqual( get_unique_filename('foo.bar', exists=make_exists()), 'foo.bar' ) self.assertEqual( get_unique_filename('foo.bar', exists=make_exists(1)), 'foo.bar-1' ) self.assertEqual( get_unique_filename('foo.bar', exists=make_exists(10)), 'foo.bar-10' ) class Response(object): # noinspection PyDefaultArgument def __init__(self, url, headers={}, status_code=200): self.url = url self.headers = CaseInsensitiveDict(headers) self.status_code = status_code # noinspection PyTypeChecker class DownloadTest(BaseTestCase): # TODO: more tests def test_actual_download(self): url = httpbin('/robots.txt') body = urlopen(url).read().decode() r = http( '--download', url, env=TestEnvironment( stdin_isatty=True, stdout_isatty=False ) ) self.assertIn('Downloading', r.stderr) self.assertIn('[K', r.stderr) self.assertIn('Done', r.stderr) self.assertEqual(body, r) def test_download_with_Content_Length(self): download = Download(output_file=open(os.devnull, 'w')) download.start(Response( url=httpbin('/'), headers={'Content-Length': 10} )) time.sleep(1.1) download.chunk_downloaded(b'12345') time.sleep(1.1) download.chunk_downloaded(b'12345') download.finish() self.assertFalse(download.interrupted) def test_download_no_Content_Length(self): download = Download(output_file=open(os.devnull, 'w')) download.start(Response(url=httpbin('/'))) time.sleep(1.1) download.chunk_downloaded(b'12345') download.finish() self.assertFalse(download.interrupted) def test_download_interrupted(self): download = Download(output_file=open(os.devnull, 'w')) download.start(Response( url=httpbin('/'), headers={'Content-Length': 5} )) download.chunk_downloaded(b'1234') download.finish() self.assertTrue(download.interrupted) if __name__ == '__main__': unittest.main() httpie-0.8.0/tox.ini000066400000000000000000000005521227074336400143410ustar00rootroot00000000000000# Tox (http://tox.testrun.org/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the # test suite on all supported python versions. To use it, "pip install tox" # and then run "tox" from this directory. [tox] envlist = py26, py27, py33, pypy [testenv] commands = {envpython} setup.py test [testenv:py26] deps = argparse