pax_global_header00006660000000000000000000000064134263650550014523gustar00rootroot0000000000000052 comment=752d627057877379a46f0ca259a88a02cc58a5e4 nrepl-0.6.0/000077500000000000000000000000001342636505500126465ustar00rootroot00000000000000nrepl-0.6.0/.dir-locals.el000066400000000000000000000003131342636505500152740ustar00rootroot00000000000000;;; Directory Local Variables ;;; For more information see (info "(emacs) Directory Variables") ((clojure-mode (clojure-indent-style . :always-align) (indent-tabs-mode . nil) (fill-column . 80))) nrepl-0.6.0/.github/000077500000000000000000000000001342636505500142065ustar00rootroot00000000000000nrepl-0.6.0/.github/CONTRIBUTING.md000066400000000000000000000026151342636505500164430ustar00rootroot00000000000000# Contributing If you discover issues, have ideas for improvements or new features, or want to contribute a new module, please report them to the [issue tracker][1] of the repository or submit a pull request. Please, try to follow these guidelines when you do so. ## Issue reporting * Check that the issue has not already been reported. * Check that the issue has not already been fixed in the latest code (a.k.a. `master`). * Be clear, concise and precise in your description of the problem. * Open an issue with a descriptive title and a summary in grammatically correct, complete sentences. * Include any relevant code to the issue summary. ## Pull requests * Read [how to properly contribute to open source projects on Github][2]. * Use a topic branch to easily amend a pull request later, if necessary. * Write [good commit messages][3]. * Squash related commits together. * Use the same coding conventions as the rest of the project. * Include tests for the code you've submitted. * Make sure the existing tests pass. * Open a [pull request][4] that relates to *only* one subject with a clear title and description in grammatically correct, complete sentences. [1]: https://github.com/nrepl/nrepl/issues [2]: http://gun.io/blog/how-to-github-fork-branch-and-pull-request [3]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html [4]: https://help.github.com/articles/using-pull-requests nrepl-0.6.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001342636505500163715ustar00rootroot00000000000000nrepl-0.6.0/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000012001342636505500210540ustar00rootroot00000000000000--- name: Bug Report about: Report an issue with nREPL you've discovered. --- Use the template below when reporting bugs. Please, make sure that you're running the latest stable release or the latest snapshot of nREPL and that the problem you're reporting hasn't been reported (and potentially fixed) already. ## Expected behavior ## Actual behavior ## Steps to reproduce the problem This is extremely important! Providing us with a reliable way to reproduce a problem will expedite its solution. ## Environment & Version information ### Clojure version E.g. 1.9.0 ### Java version E.g. 1.8 ### Operating system E.g. Windows 10 nrepl-0.6.0/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011041342636505500221120ustar00rootroot00000000000000--- name: Feature Request about: Suggest new nREPL features or improvements to existing features. --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context about the feature request here. nrepl-0.6.0/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000010601342636505500200040ustar00rootroot00000000000000Before submitting a PR make sure the following things have been done: - [ ] The commits are consistent with our [contribution guidelines](CONTRIBUTING.md) - [ ] You've added tests to cover your change(s) - [ ] All tests are passing - [ ] The new code is not generating reflection warnings - [ ] You've updated the [changelog](../CHANGELOG.md)(that only applies to user-visible changes) Thanks! *If you're just starting out to hack on nREPL you might find this [section of its manual][1] extremely useful.* [1]: https:/nrepl.org/nrepl/hacking_on_nrepl.html nrepl-0.6.0/.gitignore000066400000000000000000000003161342636505500146360ustar00rootroot00000000000000# emacs + vi backup files *~ .*.sw* # various IDE junk *.ipr *.iml *.iws .project .classpath .settings # artifacts, etc eclipse-classes classes target .externalToolBuilders /.lein* /.nrepl-port pom.xml nrepl-0.6.0/.travis.yml000066400000000000000000000033601342636505500147610ustar00rootroot00000000000000dist: xenial language: clojure lein: 2.8.3 cache: directories: - $HOME/.m2 script: - make $TARGET env: matrix: - VERSION=1.7 TARGET=test - VERSION=1.8 TARGET=test - VERSION=1.9 TARGET=test - VERSION=1.10 TARGET=test - VERSION=master TARGET=test global: # deployment credentials - secure: "f2pEAipCOs8JRMzSVMnbqBPbWFzI7G/FjPW9FY9ZjAhRvpslRC6JzG4r6uSJMoKU474ZQk+hzpYXCNSuqbztvYdd50J7E5iT3SpOIpRkNHtao0kEfxzFlH7P+sQ0LWPU5KZJXMue/9lKLxXdersdl2SAU7PSntQwqTEEicMluYs=" - secure: "PheOCJixQP9LaDcmkHGAOLmmPG6AQyN+PkgYw23cDTcFA6FKh4uVj28PHhlCQc0V6KrwzDqUAoSzyhSlcGm6LiZks714w6WHL3jpfIxnVKHN0J8FktnCy9Td9nrKhBCC2kNisaEhRyK4LojDcdFpliXZjJoituDnp4YhnaRIpsw=" jdk: - openjdk8 - openjdk11 - openjdk-ea stages: - name: check jdk: openjdk11 - name: test - name: deploy jdk: openjdk11 # Deploy only from the home repo where the credentials can be # properly decrypted. Never deploy from a pull request job. # In addition, ensure we're on the master branch (snapshots) # or a branch with semver naming (releases). if: repo = nrepl/nrepl AND type != pull_request AND ( branch = master OR branch =~ ^v[0-9]+\.[0-9]+\.[0-9]+.*$ ) jobs: include: - stage: check env: VERSION=1.10 TARGET=eastwood - stage: check env: VERSION=1.10 TARGET=cljfmt - stage: check env: VERSION=1.10 TARGET=verify_cljdoc - stage: test env: VERSION=1.10 TARGET=cloverage jdk: openjdk8 after_success: bash <(curl -s https://codecov.io/bash) -f target/coverage/codecov.json - stage: deploy env: TARGET=deploy matrix: fast_finish: true allow_failures: - jdk: openjdk-ea - env: VERSION=master TARGET=test - env: VERSION=1.10 TARGET=cloverage nrepl-0.6.0/CHANGELOG.md000066400000000000000000000302221342636505500144560ustar00rootroot00000000000000## Changelog ### 0.6.0 (2019-02-05) #### New features * [#117](https://github.com/nrepl/nrepl/issues/117): Replace `nrepl.middleware.pr-values` with `nrepl.middleware.print`. * New dynamic vars in `nrepl.middleware.print` for configuring the print middleware at the REPL. * The new middleware provides behaviour that is backwards-compatible with the old one. Existing middleware descriptors whose `:requires` set contains `#'pr-values` should instead use `#'wrap-print`. * [#128](https://github.com/nrepl/nrepl/pull/128): New middleware, `nrepl.middleware.caught`, provides a hook called when eval, read, or print throws an exception or error. Defaults to `clojure.main/repl-caught`. Configurable by the dynamic var `nrepl.middleware.caught/*caught-fn*`. #### Bugs fixed * [CLI] Make sure ack port parameter is converted to integer for command line nREPL initialization. * [CLI] When starting the REPL, make sure the transport option is used correctly. * [CLI] Make sure calling `send-ack` at `cmdline` ns works with the correct transport. * [#8](https://github.com/nrepl/nrepl/issues/8): Clean up context classloader after eval. #### Changes * [#16](https://github.com/nrepl/nrepl/issues/16): Use a single session thread per evaluation. * [#107](https://github.com/nrepl/nrepl/issues/107): Stop reading and evaluating code on first read error. * [#108](https://github.com/nrepl/nrepl/issues/108): Refactor cmdline functions into a public, reusable API. * Restore the `nrepl.bencode` namespace. ### 0.5.3 (2018-12-12) #### Bugs fixed * Make sure we never send a nil transport to via `send-ack`. ### 0.5.2 (2018-12-10) #### Bugs fixed * [CLI] [#90](https://github.com/nrepl/nrepl/issues/90): Doesn't display properly URLs if using a 3rd-party transport. ### 0.5.1 (2018-11-30) #### Changes * [#89](https://github.com/nrepl/nrepl/issues/89): Remove `tools.logging` dependency. ### 0.5.0 (2018-11-28) #### New features * [#12](https://github.com/nrepl/nrepl/issues/12): Support custom printing function in `pr-values`, enabling pretty-printed REPL results. * [#66](https://github.com/nrepl/nrepl/pull/66): Add support for a global and local configuration file. * [CLI] [#63](https://github.com/nrepl/nrepl/issues/63): Make it possible to specify the transport via the command-line client (`--transport/-t`). #### Bugs fixed * [#10](https://github.com/nrepl/nrepl/issues/10): Bind `*1`, `*2`, `*3` and `*e` in cloned session. * [#33](https://github.com/nrepl/nrepl/issues/33): Add ability to change value of `*print-namespace-maps*`. * [#68](https://github.com/nrepl/nrepl/issues/68): Avoid illegal access warning on JDK 9+ caused by `nrepl.middleware.interruptible-eval/set-line!`. * [CLI] [#77](https://github.com/nrepl/nrepl/issues/77): Exit cleanly after pressing `ctrl-d` in an interactive REPL. * [#13](https://github.com/nrepl/nrepl/issues/13): Catch ThreadDeath exception thrown by interrupt. #### Changes * [#56](https://github.com/nrepl/nrepl/issues/56): Bind the server by default to `127.0.0.1` instead of to `::` (this turned out to be a security risk). * [#76](https://github.com/nrepl/nrepl/pull/76): Move version-related logic to a dedicated namespace (`nrepl.version`). * Deprecate `nrepl.core/version`. * Deprecate `nrepl.core/version-string`. * [CLI] [#81](https://github.com/nrepl/nrepl/pull/81): Handle interrupt in interactive session. ### 0.4.5 (2018-09-02) #### New features * [CLI] The built-in the CLI generates an `.nrepl-port` file on server startup. * [CLI] [#39](https://github.com/nrepl/nrepl/issues/39): Add a `--connect` command-line option allowing you to connect. with the built-in client to an already running nREPL server. * [CLI] Add shorthand names for most command-line options. * [CLI] Add a `-v/--version` command-line option. #### Changes * [#32](https://github.com/nrepl/nrepl/issues/32): Extract the bencode logic in a [separate library](https://github.com/nrepl/bencode). #### Bugs fixed * [#38](https://github.com/nrepl/nrepl/issues/38): Remove extra newline in REPL output. ### 0.4.4 (2018-07-31) #### New features * [CLI] Added `--help` command-line option. * [CLI] Added `--bind` command-line option. * [CLI] Added `--handler` and `--middleware` command-line options. Extremely useful when starting nREPL using `clj` and `tools.deps`, as this allows you to inject middleware trivially without the need for something like `lein` or `boot`. #### Bugs fixed * [CLI] Add missing newline after colorized values displayed in the REPL. ### 0.4.3 (2018-07-26) #### New features * [CLI] Display connection info when starting the built-in cmd client. This makes it possible for clients like CIDER to parse it and auto-connect to the server. Pretty handy if you're using `clj` to start your server. #### Bugs fixed * [#16](https://github.com/nrepl/nrepl/issues/16): Don't change the thread used for form evaluation over time. See [#36](https://github.com/nrepl/nrepl/pull/36) for a discussion of the fix. **(partial fix)** #### Changes * The result of `nrepl.server/start-server` no longer contains the legacy key `:ss` from the days of nREPL 0.0.x. If someone was using it they should switch to `:server-socket` instead. * [#28](https://github.com/nrepl/nrepl/issues/28): Echo back missing ns during eval (previously you'd only get an error that a ns is missing, but no mention of the name of that namespace). ### 0.4.2 (2018-07-18) #### Changes * [#35](https://github.com/nrepl/nrepl/pull/35): Add constant DCL across evaluations (which means you can now easily hot-load dependencies). #### Bugs fixed * [#34](https://github.com/nrepl/nrepl/pull/34): Treat `nil` port as 0 (which assigns a random port). ### 0.4.1 (2018-05-23) #### Bugs fixed * [#11](https://github.com/nrepl/nrepl/issues/11): Don't read the version string from a resource file (`version.txt`). ### 0.4.0 (2018-05-21) #### Changes * [#4](https://github.com/nrepl/nrepl/issues/4): Change the project's namespaces. (**breaking**) `clojure.tools.nrepl` is now `nrepl.core`, the rest of the namespaces were renamed following the pattern `clojure.tools.nrepl.*` -> `nrepl.*`. ### 0.3.1 (2018-05-19) #### Bugs fixed * [#15](https://github.com/nrepl/nrepl/issues/15) Fix for `clojure.tools.nrepl.middleware.session` for `:unknown-session` error and `clojure.tools.nrepl.middleware.interruptible-eval` for `:no-code` error, the correct response of `:status :done` is now being returned. * [#26](https://github.com/nrepl/nrepl/issues/26): Recompile the Java classes for Java 8. ### 0.3.0 (2018-05-18) #### Changes * [#1](https://github.com/nrepl/nrepl/issues/1): Materially identical to `[org.clojure/tools.nrepl "0.2.13"]`, but released under `nrepl/nrepl` coordinates as part of the migration out of clojure-contrib https://github.com/nrepl/nrepl * `clojure.tools/logging` is now a normal dependency (it used to be an optional dependency). #### Bugs fixed * [#20](https://github.com/nrepl/nrepl/issues/20): If `start-server` is not provided with a `:bind` hostname, nREPL will default to binding to the ipv6 `::` (as before), but will now _always_ fall back to `localhost`. Previously, the ipv4 hostname was only used if `::` could not be resolved; this change ensures that the `localhost` fallback is used in networking environments where `::` is resolved successfully, but cannot be bound. -------------------------------------------------------------------------------- `0.2.13`: * `start-server` now binds to `::` by default, and falls back to `localhost`, avoiding confusion when working in environments that have both IPv4 and IPv6 networking available. (NREPL-83) `0.2.11`: * `clojure.tools.nrepl.middleware.interruptible-eval` now accepts optional `file`, `line`, and `column` values in order to fix location metadata to defined vars and functions, for more useful stack traces, navigation, etc. * REPL evaluations now support use of reader conditionals (loading `.cljc` files containing reader conditionals has always worked transparently) `0.2.10`: * `clojure.tools.nrepl.middleware.pr-values` will _not_ print the contents of `:value` response messages if the message contains a `:printed-value` slot. * `default-executor` and `queue-eval` in `clojure.tools.nrepl.middleware.interruptible-eval` are now public. `0.2.9`: * `clojure.tools.nrepl.middleware.interruptible-eval` now defines a default thread executor used for all evaluations (unless a different executor is provided to the configuration of `clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval`). This should aid in the development of `interrupt`-capable alternative evaluation middlewares/handlers. `0.2.8`: * The default bind address used by `clojure.tools.nrepl.server/start-server` is now `localhost`, not `0.0.0.0`. As always, the bind address can be set explicitly via a `:bind` keyword argument to that function. This is considered a security bugfix, though _technically_ it may cause breakage if anyone was implicitly relying upon nREPL's socket server to listen on all network interfaces. * The `ServerSocket` created as part of `clojure.tools.nrepl.server/start-server` is now configured with `SO_REUSEADDR` enabled; this should prevent spurious "address already in use" when quickly bouncing apps that open an nREPL server on a fixed port, etc. (NREPL-67) * Middlewares may now contribute to the response of the `"describe"` operation via an optional `:describe-fn` function provided via their descriptors. (NREPL-64) * The `:ns` component of the response to `"load-file"` operations is now elided, as it was (usually) incorrect (as a result of reusing `interruptible-eval` for handling `load-file` operations) (NREPL-68) `0.2.7`: * The topological sort ("linearization") applied to middleware provided to start a new nREPL server has been reworked to address certain edge case bugs (NREPL-53) * `interruptible-eval` no longer incorrectly clobbers a session's `*ns*` binding when it processes an `eval` message containing an `ns` "argument" * Eliminated miscellaneous reflection warnings `0.2.5`: * Clients can now signal EOF on `*in*` with an empty `:stdin` value (NREPL-65) * Clojure `:version-string` is now included in response to a `describe` operation (NREPL-63) * Improve representation of `java.version` information in response to a `describe` operation (NREPL-62) `0.2.4`: * Fixed the source of a reliable per-connection thread leak (NREPL-40) * Fix printing of lazy sequences so that `*out*` bindings are properly preserved (NREPL-45) * Enhance `clojure.tools.nrepl.middleware.interruptible-eval/evaluate` so that a custom `eval` function can be provided on a per-message basis (NREPL-50) * Fix pretty-printing of reference returned by `clojure.tools.nrepl.server/start-server` (NREPL-51) * nREPL now works with JDK 1.8 (NREPL-56) * The value of the `java.version` system property is now included in the response to a `describe` operation (NREPL-57) * Common session bindings (e.g. `*e`, `*1`, etc) are now set in time for nREPL middleware to access them in the case of an exception being thrown (NREPL-58) `0.2.3`: * Now using a queue to maintain `*in*`, to avoid intermittent failures due to prior use of `PipedReader`/`Writer`. (NREPL-39) * When loading a file, always bind `*print-level*` and `*print-length*` when generating the `clojure.lang.Compiler/load` expression (NREPL-41) `0.2.2`: * Added `clojure.tools.nrepl/code*` for `pr-str`'ing expressions (presumably for later evaluation) * session IDs are now properly combined into a set by `clojure.tools.nrepl/combine-responses` * fixes printing of server instances under Clojure 1.3.0+ (nREPL-37) `0.2.1`: * fixes incorrect translation between `Writer.write()` and `StringBuilder.append()` APIs (NREPL-38) `0.2.0`: Top-to-bottom redesign `0.0.6`: Never released; initial prototype of "rich content" support that (in part) helped motivate a re-examination of the underlying protocol and design. `0.0.5`: - added Clojure 1.3.0 (ALPHA) compatibility `0.0.4`: - fixed (hacked) obtaining `clojure.test` output when `clojure.test` is initially loaded within an nREPL session - eliminated 1-minute default timeout on expression evaluation - all standard REPL var bindings are now properly established and maintained within a session nrepl-0.6.0/Makefile000066400000000000000000000024541342636505500143130ustar00rootroot00000000000000.PHONY: test docs eastwood cljfmt cloverage release deploy clean VERSION ?= 1.9 # Some tests need to be filtered based on JVM version. This selector # will be mapped to a function in project.clj, and that function # determines which `deftest` to run based on their metadata. JAVA_VERSION := $(shell lein with-profile +sysutils \ sysutils :java-version-simple | cut -d " " -f 2) TEST_SELECTOR := :java$(JAVA_VERSION) test: lein with-profile +$(VERSION) test $(TEST_SELECTOR) eastwood: lein with-profile +$(VERSION),+eastwood eastwood cljfmt: lein with-profile +$(VERSION),+cljfmt cljfmt check cloverage: lein with-profile +$(VERSION),+cloverage cloverage --codecov verify_cljdoc: curl -fsSL https://raw.githubusercontent.com/cljdoc/cljdoc/master/script/verify-cljdoc-edn | bash -s doc/cljdoc.edn # When releasing, the BUMP variable controls which field in the # version string will be incremented in the *next* snapshot # version. Typically this is either "major", "minor", or "patch". BUMP ?= patch release: lein with-profile +$(VERSION) release $(BUMP) # Deploying requires the caller to set environment variables as # specified in project.clj to provide a login and password to the # artifact repository. deploy: lein with-profile +$(VERSION) deploy clojars clean: lein clean nrepl-0.6.0/README.md000066400000000000000000000102171342636505500141260ustar00rootroot00000000000000

nREPL Logo

---------- [![Build Status](https://travis-ci.org/nrepl/nrepl.svg?branch=master)](https://travis-ci.org/nrepl/nrepl) [![Clojars Project](https://img.shields.io/clojars/v/nrepl.svg)](https://clojars.org/nrepl) [![cljdoc badge](https://cljdoc.org/badge/nrepl/nrepl)](https://cljdoc.org/d/nrepl/nrepl/CURRENT) [![Backers on Open Collective](https://opencollective.com/nrepl/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/nrepl/sponsors/badge.svg)](#sponsors) nREPL is a Clojure *n*etwork REPL that provides a REPL server and client, along with some common APIs of use to IDEs and other tools that may need to evaluate Clojure code in remote environments. ### How is this different from the "contrib" [tools.nrepl](https://github.com/clojure/tools.nrepl/) project? Check the brief history of nREPL, available [here](https://nrepl.org/nrepl/about/history.html). ### Status Extremely stable. nREPL's protocol and API are rock-solid and battle tested. nREPL's team pledges to evolve them only in backwards-compatible ways. That being said, there were a few organizational changes related to the transition out of clojure-contrib that everyone has to keep in mind: * `[nrepl "0.3.1"]` is a drop-in replacement for `[org.clojure/tools.nrepl "0.2.13"]` (notice the different artifact coordinates). * `[nrepl "0.4.0"]` changes the namespaces from `clojure.tools.nrepl.*` to `nrepl.*`. A later `1.0.0` release will include fixes for all previously-reported but languishing nREPL issues. Future releases will focus on supporting the needs of the essential tools of the Clojure(Script) ecosystem (e.g. Leiningen, Boot, CIDER, Cursive). ## Usage See the [manual](https://nrepl.org). ## API Documentation You can find nREPL's API documentation on [cljdoc](https://cljdoc.org/d/nrepl/nrepl/CURRENT). ## Contributors This project exists thanks to all the people who contribute. ## Backers Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/nrepl#backer)] ## Sponsors Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/nrepl#sponsor)] ## License Copyright © 2010-2018 Chas Emerick, Bozhidar Batsov and contributors. Licensed under the EPL. (See the file epl.html.) nrepl-0.6.0/doc/000077500000000000000000000000001342636505500134135ustar00rootroot00000000000000nrepl-0.6.0/doc/antora.yml000066400000000000000000000001051342636505500154160ustar00rootroot00000000000000name: nrepl title: nREPL version: 0.6.0 nav: - modules/ROOT/nav.adoc nrepl-0.6.0/doc/cljdoc.edn000066400000000000000000000027231342636505500153450ustar00rootroot00000000000000{:cljdoc.doc/tree [["Readme" {:file "README.md"}] ["Changelog" {:file "CHANGELOG.md"}] ["Home" {:file "doc/modules/ROOT/pages/index.adoc"}] ["Installation" {:file "doc/modules/ROOT/pages/installation.adoc"}] ["Usage" {} ["Server" {:file "doc/modules/ROOT/pages/usage/server.adoc"}] ["Client" {:file "doc/modules/ROOT/pages/usage/clients.adoc"}] ["Misc" {:file "doc/modules/ROOT/pages/usage/misc.adoc"}]] ["Design" {} ["Overview" {:file "doc/modules/ROOT/pages/design/overview.adoc"}] ["Handlers" {:file "doc/modules/ROOT/pages/design/handlers.adoc"}] ["Transports" {:file "doc/modules/ROOT/pages/design/transports.adoc"}] ["Middleware" {:file "doc/modules/ROOT/pages/design/middleware.adoc"}]] ["Built-in Ops" {:file "doc/modules/ROOT/pages/ops.adoc"}] ["FAQ" {:file "doc/modules/ROOT/pages/faq.adoc"}] ["Extensions" {:file "doc/modules/ROOT/pages/extensions.adoc"}] ["Hacking on nREPL" {:file "doc/modules/ROOT/pages/hacking_on_nrepl.adoc"}] ["About" {} ["History" {:file "doc/modules/ROOT/pages/about/history.adoc"}] ["Team" {:file "doc/modules/ROOT/pages/about/team.adoc"}] ["Support" {:file "doc/modules/ROOT/pages/about/support.adoc"}] ["Contributing" {:file "doc/modules/ROOT/pages/about/contributing.adoc"}] ["Release Policy" {:file "doc/modules/ROOT/pages/about/release_policy.adoc"}] ["Changelog" {:file "doc/modules/ROOT/pages/about/changelog.adoc"}] ["License" {:file "doc/modules/ROOT/pages/about/license.adoc"}]]]} nrepl-0.6.0/doc/css/000077500000000000000000000000001342636505500142035ustar00rootroot00000000000000nrepl-0.6.0/doc/css/extra.css000066400000000000000000000005431342636505500160420ustar00rootroot00000000000000/* By default kbd doesn't stand out very much. Let's fix this! */ kbd { padding: 3px 5px; border: solid 1px #ccc; background-color: #fcfcfc; border-radius: 3px; box-shadow: inset 0 -1px 0 #bbb; display: inline-block; } /* The default font-size for code blocks is 75% which makes code hard to read. */ code { font-size: 90%; } nrepl-0.6.0/doc/favicon.ico000066400000000000000000000353561342636505500155500ustar00rootroot0000000000000000 %6  % h6(0` $ﴚﴚﴚﴚﴚﴚﴚﴚﴚﴚﴚﴚﴚ@@c44P44Q44Q44Q44Q44Q44Q44Q44Qnnﴚﴚ(LLw[[ZZZZZZZZZZZZ!!3VVﴚﴚ##7::ZUUﴚﴚyyyyrrEElqqyyyy99XUUyyyyyyyyyyyyyyﴚﴚ$$6((,228228339228338''+'';99XUU--E++/228227227227338&&+((<ﴚﴚ''5''799XUU;;]SSR((8ﴚﴚ((6vvv((899XUUSS779{{{))9ﴚﴚ((6&&&222((899XUUll%%+---))9ﴚﴚ((6333vvv((899XWW""1***CCC///))9ﴚﴚ((6111VVV@@@((899YIIr00Kppo///ppp###))9ﴚﴚ((6mmmooo((8;;[ MMN~~~iii))9ﴚﴚ((6((855S((&))9ﴚﴚ((6((8ss##,))9ﴚﴚ((6((8%%6))9ﴚﴚ((6((844Qccb))9ﴚﴚ((6))9KKv@@A))9ﴚﴚ((6)):XX**/---))9ﴚﴚ((6"<<= ))9ﴚﴚ((7~aa`**C""-))9ﴚﴚ))7ccc&&9{{**:))9ﴚﴚ))7""+uu((8))9ﴚﴚ))7..1]]((8))9ﴚﴚ))7HHHDDl((8))9ﴚﴚ))7mml--G((8))9ﴚﴚ))7WW((8))9ﴚﴚ))7>>><<|4R&/~6 'm!]g)vYXb;ucKcoDHa7ZG kj}LwB/G-'?:WAZVjZVuX4onϏ>:}0z&Uc' M[ `Wpq"+h:lw rn0s?ljD;҃ XfKx^h}ow_VjZVjZgu}<#W5ݨ;~&5E=c䢚F,ơ+d;+?&S"{GW܃fѢqKwysln݇f8n1>_| jrdpƹ2l\M-|”+oa^d_3(xbmh [o\'?I?^NGG t2 LŅK?w^NVjZVjRWP<ZM{a]l-YÝt(\Pb7^M y"vl<2 mG#Q!;'`uF}:C^qt+bӮ9#9"ߴCc+܋ D} غڜ k0"GOzS,1|cy]qHnlh<h@$ (ug!O\pmG_PcjQȪ(JSJ_v#AHCmds6h'`V>|y˱; G1#וG{$1ΆlTz7֏ jZVjZۤk[ۓ!"\%7xaHzEU=ՃC HC ȶ83T:sV)_ "0u;*ɰiPf需[ -!g/"# 賓ut[_?flZVjZmе0sZ٤a`8 XVU71+PD8\m9ˈ*@BA+FD[ eA`T5T#0 ?OBzxoCB."2u;?WhFn=ޢ(ԃ0GQt?֡J Uy9fKô WK86(t9[OÇ|s)C;<*Gqgr0xnnm/VFZ?{/IjZVjZO(rvV/0L/aaU!~M-?r*9w.X(iJ}C8L)%|00@T^A~w])bTCNwYRW3/=;%wT‚;?`jZVj6]. v`cN" <Gtn/V͕Ѷ9 sRW9R l{=X>oWV/~$1Ra˗dss2mϞPԮ9MAErmqD` ~[=/[VjZVZg~x;r €q_82@%EQ8^꼨B0ޑۄN(|f>,Xr.lR6zg5mԂYX E3LD:4r#™ 1lP&1ofFavW@9묺%:|7 X:7=6#aWsWY/@1YU ;aVjZVz2u%#xq/6iTF^(<)u=8\pZ{Ҁ/Â+3aλ7*F"jXbl# Yhbsآ<# w}b zgᄑ{VY{h/&U47F&݇yv}2ݶgep8@{oÂ[VjZVz`O+xZ2?t!C/X sF g Ε!0 /%$,HP'@ kFE|џץzOgם ||d÷۲_KL*=h.vXxZVjZVIѵ9!g}nՙ^Co=XmLZPYwŻ ._荠vfnJ5 o+V9Wd8쵌|Oan}j"!#VOjCWfY~8NFK0 XC0FR?fh:[@_ՆDDjΈjƐf[ t3ghCz-g9MNs 2tjIpwoVjZVzt`_T(U>MxPTa_8X3g?MC.]‚HHjZVjl] G4@tEEO`=S<=;rJ8$ZǐɍW9ZABU!E<`\˲I^bUxp 2 < 2 T9B9 l[-qk2EMpЪ1B#N*e(MR'KqmOܳ0+gpX:,jZVjZ_uЪ\, j5P:~5;SpA32XG@Pֺ @5KpC P&5|BFd#4xC^k#lr\oC `wʼ%O@rFQmA}^n!J_} > FHEȾIXvSّs-,7o|SZVjZVup @Z38rK 4\?b8x *!S07ʧp vNh/ *|Ob1aF=cE"$*]^ӝe'4-8tI>>Z>b7"sB|]V j7PE*b{7_VjZVj ]2/q);EmD03hnɵ:g»\BE) ɕ$t;7TX`]A&'iz0(F;^nPYB')߿xY}A+P^IN!S;\kΝcL?qNs OjV Ma&@շοX.wVjZV"t \P9m[)LVθpԮq@n  Ć}87È(UcÌIΗW%iX>!2sJͨe@LT#<^G/}w9M} P'mƢ NozvS 9Tu=ET5)0dSL4Y^c;[jZVjZQ7ΰ?AkAdG'*V`IF'^̃d(Ku6؆ lEIeHf9}h,瞕؅fujA3;&yt/sp\+^|j s} $Ԋǜb2}MG?XfEUmU/mxEZVjZVtm0 djS= Rδ[ xcK_q?Eq `X/%yt(񺀅\?P qTNC-R S1e<Ϧ`pk@Tk_,Ђ>`z!`jw9bY>rkuYm zh:r];?ц4Ξ'k`o9CnA/CL%05K"Ѽ.@4^\_Xw|s ~ZVjZV3den!Nԓ Y:F'\Prb~Az?c;])j. mM瞟Px!,U%a1ToD&";3Ge؆O{>#_F\HfwQߏGzXx݁;py;tU 8mbƾf/w!:iy+= nZVjZgk OMme~LQYwWb,H gn"[<BX~ nZVjZ֧эBԁ_qԞۃ9,c BM(8/s6h<-<|.QpX%6ҩviL/(8KoD`_d[fR- ЄXbhcv$^CMÿup1,fA SC@+ru N^5u3-9Ltun7og;+y"g*TQ( h1}g<^/HjZVjZSWeTz 8͉t _ҍgB+`uZc' cO NlnHNhوrqG;U;$FѓM}15!vt[‹$t4mغR9Pc.x}.eC^dB]r({#^2] P^=dvp`=C澱 5fӫ[VjZVj}\ T-wILΠ*T@" @τ_W-pf6۟&StLןf)1CE%3mn'NPiE35INr0HA })+&Dq3 ['߬O쵀ȓ\wpbsp- XhHo|js6M~Q`Ȭ AB\ξ)z a[~ nZVjZMu}\>UtZ Đ/o x<1wpiH!+8be1\&/*vi1QƀB$~yV~ (O8:'`kҟ\knm]e>(]+W_ _t17'`a*%^nHo<<}veY9Q%SoՂo jZVjZxP.MҫPxL|\]_6p8C+Z= ڲ<Sᴒ,㥺vK9xR9-||ro|Ä2zҙr=YPUt^UUl_Vs_$+?w?ziZVjZV]N8 m li8%फ़1KT-\yg4:nU#D R_EKN_6l %1# 1oFdKZDp41eF@Ǽh]o(_QC۪|񑽕gIA QN*4`ST|v3I?7&`N04)Q\=jQ=t8*sxao~{yGi7`jZVj\m.JqAZr@,@U8m3!L*H Nd: ]˔`p6),`v޵pƝE̾V&l!m~_g_(Ѡ j wWjl1ãg 9Vܼ0zMn*-' Ài>_:d&,TU@#6e{fW nZVjZJd(T^sBE-Dd!P/8zwVW QCpb 2@Єy)<8+S-\{s%Fou k-hWᑤ}F#3a?Q V*@ra?ox/ty;໋zf3%,"͂fOi]:[jۮ#.<ye /8(\*^|G_:&MKآF< WfE$`]^9,;q|jZVjZ4mj&sηd0# Wa=t g_6G`^ in/T:VPr&HdH}2&Y9XwНi1eJm7Op!`Mhx<Z*' نީb06}f8 k6G:ah ο] Or;ٔs3THDɅm8ٶ_jzmhGT„Q Nz86eU%c !l.\u9&蓘oZp[VjZV" Cn`WuQTCMn|sxIVƹ݆bd{k˓ 'S+=q$sJLE3Qh(̱Q[5~uDhf]{n]e`0i4;܈ 3o|.v0j?IZVjZVut}@pp)۶x g\!̋ 鍗Zp`|UM#57utC׋ppy9[ڇxPh!vK&k}5XCH+{{ͼpCaF&Ie/0{>䫽wVk*zxrf{f۝|avB|(16el.%OGLLtONL[VjZVJx 7_Tur~mr|je4 _l-եKޮL0ܝΝBpǫ>d :Ѿ;V=h3QqQkHsb?\شÁ?u#|v |WIh;T _+ -t7-M1XDv쁞5ne?x|3G.@A\ߡ0l916z8\IVjZVz*uRRԂtC֪HW~$k2GQ{jD*lƯOlC\&' &sOxÆ KeP#Wu˿(,܅h.ѻB9j݈$F׌H8y!__G+jЍYtT@p YP1 ŃYA1*`MG(> P;x3SUPo RQ:uTY)Lx#& ,~a'QZVjZVut}@>/FiwPVK/᜿J7웮677B|Q1@ՋPbuYXUBJ蒲S|K?"Xo 0Eҹ5 Fv/TXu=N_ 'F??Woː`%ԗ0s4rm\tvb:~:іtrX|A:X?{Ӊ`dj=a{u5~"!VjZVu;u" pd<`F .6@UTdY)7 (n3q`ᆓ0e39sDTOSWE/B1fc…%aۦ<n4ci&vF`cv_ÀV'n\t:UgǦǣC[VjZV6UE5y6 f kKG/ ŋ,Kx `B8s''Nh? VjB(#GaܕQ!i h^*rPL^%:7˨9L 9mο5g2DWs@dw*/6:/5 JΊ#B.Ǻ|Sd:;8qz,ijVA e6>[[VjZVu+uZeCJŸM2+YI3 -K97 Ja6D\ Og6m"*ꄰA[qyj~10=gXը.@>ԻPdžz~ljL!6O9VjZVzu dÌ3QّQ~ 0 |mZ6X Ypaln4^ 2wq8i:Ì *7$S% *B|,I;UAOMߢhaŝCCM?ɏ_elvn"22&˓,aPϜ$ w_G?*} d/5qtE=\Ogmws+Xyܪ,"VjZVպ $GlIƅ*qD ,)E*.Q98o8␋PQWN|B& u#:..((.qa 8[ EH I9詒PMemZw!0+@M@U3 %FpoQm . xޓE>ͫA*:׎9l_~w*qp!օu/*C ^d_nZEHsXF8pb4a"yzNp/fU֐L+@0+*sgYQV12)(N[::S8~*OMu]/2~iyoݙj٥jZVjZۦsJUҝ1&s E=vΥ4 %OL"!ޫUB TPуI@ͼxHgq(%׋^3(& o,ȃ$ABA -ۢQ%":ksFe0xHH8:FGF: ma=dY59\Ex`Q8R?6tI'G;b>˥wNWA9rnӰbf~ a6W=tnJlZVjZۨ+(A$JF!~ʩ"/sIrzV^M'-<"sfɔOlEү,a` j N3P|~$Xǜ'PgZ/Q` Gm+CۋSXp9Ƹi ̧nvPnjs~ʿ)uSL`OaA3+À[VjZVꀰ;{cłxsOPo@+û'#T:QC E! ?I#I@jI Fn %-U’qN@b -/qmaի`(H+* ,ilMr9GFuHq~!g-iׂC'W9B3 4p=Cu(p}qK1e }!a1]jZVjn j.?v|˾ Bp!4wK#%$Ac1qiD4d*(I<$QWl׆K/Z]5]ՊTu <"XĘ,ru8-@o^Df}A;?_n}9ޭސ&ѤXycg6>אO3!ܦ`4BKH̼uGQtP|0Q`XfB[?Nd3HV]-^mA.9\*sTF+_QO~^@C[VjZV6`8h s"]U5(16_4X;P^ BM¤zοyƲHh%D^ʍKFlC%A9,F*`;# \fXJ"VԹSmApkwSqao}r2ZZBs~b_'9r P1'oΤ L$?n˸ sZn|c}Bk[l#bF|$=O~^}ܫeWbh-BnbFNôjZVjZQW;R>]@@pa8HC/l*[ τ1r(u:> j]TvN$ @,&\mbW9 ;ּZ-,C>'hZ/I5 *) G.h -v+׾{ W9ه[2nN,Xt2>8 O :d<1|yתmz3j~jiR95`j'`לvv\ۀfr=96ZVjZVprĿlc sal.!F(3 62?dN?`dbVk/O$J K-#],#I*ZXؾ"c~hG.d`N".K `;'[/8C;n2ɊїDR|ZV|y(:SZbJ.ƏY4C.;{5Ex.;I&6gh`ewf yt}%O=9>K=A`jZVjZVpj9xFpX+N,CQ R͐Y?Fp&SFMW!^sB7^ӫrri t@Œ+ܵ.I*ߡ)GfGv`$rcbY<%)AD7 @ RUrRur_(",ȵZ[\Kݸq][NN¿-;.^D> UuC1>i_$#  dL Lb9›ek?0)w%Z\Dv2 ; þ3-5ON ssK_|pAޓo ZVjZVutpW Æт(!302 |+Tt @cf "⯦) d a|jRB%T=꥔ذ+ЬqbV9jмc&%I(9F.'ZpuQh 194a`Mn\w;'מ`9r񐇭ϒ D88Zicg.;8|fuU1]lkfCjυ 3 8I[IB0EXJ(n;UD~޲,o945ܘ"Uk1ֆ_$w6:;pIG:s+ByG[_#koj)r3oB\7XF 6i=djzZVjZτaάr9,J  ʜvuqY !Y`C(2m,xp7 -}RqᚕX眯]üUo_ N@&hEJЎ( HCBZ >:A\Ϻ/KOw΃3y Ic%fR.0O8b/U(3<6W `c;ȅG=q#zX,ݩ-"-b,?nj ]˾U13\ea9sL良N3$m`jZVjRK69D31PD"G«\ ε% p/rD?ݗ^,w֏wa. R>\sl>9eGPǡik O;UCDzŽUj9:wӶ5nm~e:~ vQ Mǰk@bA=@XQ]VjZVu;u%\lO*€x FUt!<΍5xQ `չpF9N@1ϡGzւd3I'} fo;aBA`.EC>T9aH(DpK3cܖzxz޺p{AN(*?̄Ps&Zl23XNDՑ+X5ݷ!7ю389P t=qK|l%cPgSu5;]Be :!$9I3vB>[VjZVu[t(xqrX40)8> $,xQ (bvq0B+tb;iPFm ] 1x}O_P ,m0ܺf -X*uAQUA)! Av|jW,뤘ط-kFpU FUW$  ^ D)=5­FsӂPTK0vL>O&sN @|U`V sw 䦢2\8yy?_ 'CKn0( Mm3_i}M޹gӅ^Օse)p&sHv 3!VjZVu;upvy W Yҽg]' 's%L:_Q-pκ"e`۫2 bУ{W7v vap Q={@.C h V3g^?^`SOr:1(#%1_yþK΍} F4m偐q!jY-8pK*f2t$wе(mrDOWNۨ ']D;ar~ +?4m#Aq6ݾ$i`jZVjFݠwF'D/疠ME8TaDMW* /(JwT3CUnAT:5[܁{*N] \r=Ͳ,*pZD4}`K~m`؏B/t' g9aLEOt Ҽ(1繠8n?C>5~,cy l?v62ph^dZcYs>14g{fx 3yt.="k+=]DŽo-]lZVjZ[U.$ZCޢpE~(t*On!/6#F !b6'aZIhm׃MUy Z&ޮQI7@*"ls4|G_FqV/zNg<cSJ(7Oǒ[=A<ox/`'s FW?>nNWɂ@*19 &](`Wܟh9\><)b<ȂŇi$A~56j,munL8e N|Z>ChB`VjZVjZQJ  ENDQ޴=ay*(G/ӡ|T2ȵgT@1D#&qH_mxmR%~7=0&)H&Ӫ*iؾZ :>Ia;Ӡ0gGjDM؅eW͘<&wFQ\ ^?n{ B4)")t4X(ߑ s+r1cR/V1@ў /|{:7k'3u9sVkϼUWB"> rAhwNv{r};[VjZV6x1rٽI6$CxjcBcz& 5E:)dBfqr\PG*1*)Daۂ* Anю֗S0`4afI sIz Lu6DZ:Rj=5ՁzETΕ'ҜO*`D\fA"`t˞iίE1N&j+oD88]9ƣXDv>v RmhAB۝KY/9/fmIŘP|1A k`jZVj^]̜p4_;ͦ   ܃ƎpRfBbI8!*|` e7Q@$M2Ԗ`IyvMg71_h{N"I睡X$8 |^tC &5$˾ԩء>:mU}F2&xGׁq_h!_WʩXtl9b_N[0r%%d:B}n\.kJhpByl%0\ddxC@<~\kӍ|-j@٨I] co`3sVjZVjB `>Marj#MXe?ƥ_oB.9&(7CJSۼC6B/kvy`5wH_ٔ g8 IL)tJw##W ΢#:\ۺ%#4KqG[}y+[5UIR1ys/`DL/&!9rlieq4ʁ-3_̱9!V$̵uM_,2Fגq:_g{!2P﫮|U=w|׈=Ԗ);,qjZVjZE7*i uKV [nY׏UH¥D}ʣvhp8#Pi}^# 2!twl6_;yR(5y!@.\gܯ&ZGl1ѱ2CC Bq1UAHB}H` HvɂڎpU4G\k"U|C ^2. ].Mt*V + O:#Mh:G(=R Ctϱnם|Mi[9l~:9s+=4nv@l|pma,es)O$޴jZVjZSď|@x %7< M`@-ϗ`t1F CMnB o DfY‚jo8rlj 8GCdIhD*(t} ɞ!iE{K'* )B9ړÿxyo)YdFn /!5 ܑU湅a{(*Q UMх9nl=8<2yFyr'`^J^mwY6-Cv-y- VMNVuy5 stVjZVպPG=[M9?)(r0cR7n;YK{*r-p"{u@C 0\;qwņs ]3pm'nECvpt 'ԦXyͧJ5Eӂ( ZE[BZ)Fۗ >Է!e5 (%t[& Uѐ o4΀8N,\Msgq E{+s ?~H5^$46hyn ,N)&bw <5k2ָ'h!Y݀_ޟdhƗlZVjZۨ+1~ƻEWzV^{Gjuq@XP_euv" %)-σF"7_:fClL#<9 $kƂ"Y\$B&@' ˀ83l=2K%BEPc6ۘw42WA$x(O7cWj,[ci;pj}tsОћt&@ .7pJ.b^JNP$ QdeKT鴘"s1&HkƙF6rbU5۟|us@Ovϳ^}K

wlx4 Qq^1R2ˎ{;~ )y~by$/0K|9pnUc'`,Ly+W_Nʻ2!7-;+`TveK103V.@-m?u WU-iHyDNy9O`ntokt r jZVjnhLMځTOJ8D]o޽K,RKX|ri/E xYBM$:wNLS)l7`IM(T9K/VF d3>+XFbB*urF5- $/ǧf{p? f3`<z?8賛bgƯN}v5]UcJ̵E 6ciIhh@_\1uԗ}龍V?[|(~MVgLIzjZVjZY7ʬrP ߶`b+8 91#W06Y"GlWu&{n\Kid(6J.! mlZur: <[lHɂ}VG ftd]Ҕvۮ7+L>gHp ƚɗܜ<@֋W[FW+13Te/'64 7SL\AJƗ q6o[4N` x.g!{(3Y:ZS7©Ez$ƻ!7:75FPi:|"x C[VjZVVme`#>pjZ&u Jѻޅk8`ȢgX/dv1,&//0^%ƥKF!y3}x,9Z<&NE,ܗY"a}>`g6E{)V(!%ctId^ כh֫fr_ O"]vL~ޱ =g2Sћ2yic 2u ‚HU p[HoJ/ @yD3h4dc' .egoY}_J3׾~'i|K>C}_q>{ܞ۟ߜ~e??v{{MZ_nv9`˗tp ֘9A?kM+?9[ 嵽/Oij^_6}`}^  ?X_BIziZu.xK>[(l:l|e?ڀ%ʺ{ ԓפpB0 ]߮ Wu./L!ާu:G@f mΝ4wud kMu@(auJ*^Goviř|Ӗ@ "9 ,?={<]j3e bSENPHt#(}//} ^r^?}{Hj==_³1x6?wIt-aiO{<WH񟢃)CQb%aq7h 3k"9%QU^I,|jcZ>r e5V~=㒫1]3Z2۱)@b}FGy waȱ4@߇?~s{_;Zp`Kǟ! .Y\"1-!>|{+, ٩g)Y - _.x0k~R_T e;l}+ ºNMUpᩏhGk%]hF=P-Ge&ѱ.~\i>ZV$hsr8:C9cV#4lZP(||0ygwܹNVj$_ 8e&@ځxXAFq oD8L:qnPD-e#kbʘq`j"EC2֩DɢBBZ,nRE+.ۅl9%ꪂcN} ἁ{PlxLPbn1rfJ04, ̀Ii4\!+984Ew(Ҕ w*{Wr 繛ma:[ ;6]fg9O$sĢ9 0½1.Zcʓpy͘r 4~A@rlnq `@߃0 6x$X-^x5pVnpUjZ^?/y@ZViSƖRus<Vk֕Ub- . G/w6fX--s_T "NTs_H@t4 xO'F1+uati8(AC HI&> l3r+Bѷ)K ޗX??axsafr qLMZ I٠ V |6YyWs|üd=s&[60wld >ႈh>$6.o;^9NϹ߾&}˜vzDcje,sr,C+6bj3<\Wݻw!VuKϯ^HZ&s/&'3ꜞY rIRaBo *B ^ W g>DXa> LhI)9;P Z>^NP%HϥE]7ׯ?8P/8_xB[3м 3T n .{1lE\\Y޿ [1 TF<,~ ~M<(7TH$Pgt:Mxdt4‡fyWq@#aQK:aPŰm?OךJ2uj=w*n6I^|BsPT^R+1;PvifZV)Խ0/jZ[ï}koF5Vj%<9v/&D*; 8 /R 7o# /2Eh pYx*O]@" <'ڻ!nIvh)FCDɺf\NNѾ%F¹>eAp+.Bk;'npEU\A?#mY} Gs̥@u="qO[o K1); عuXЂ V<̬,m:Tp;юR1˱Ӳ[~9dR6ON!oCO˜5tk?3ZȁL'ZViU:V5_ǃo|KmյM3eۈPڬuEMh*loH>b+!ٞ@W%(. l6Ԅmp#NA0b5>S8EDB -W]݋}١J0’1*fqIt&Qd{pGFTPL DSx짇?.[l?Gs[w>{YpL2HbaI)Pμ:| ag=cK ]2:!^>i ع 9i_ NO6)=jZ[vZu[uShroKr6Y/&s(+rhBlPD̪^:;Ӕ;NU# m.>*h,}ZL; sv^`[END؟T%& a ѕv&q~frI 7adhjds)֖ԃ{r5;(`Kn"w[@m4˟atmT,hOtlfZRw@Lz.H gthM˾ؑWpKvlcPtp+:(y8mg M<ϓϑmF1*X\*W,y N~%L@r%֧jZA/ 9_jZ%Imѕp{]|-7%u"ie@b5mVXz_=6;x8]9)@`p pD?[O}Gܹ$5ൂnJٔ'.%aޒ "l@LDX}H-`G}>[NZ?l+Ҏ Ѽ~> %,$\p0_\Nn.venGhyz㼝]I=[!ע3ioOx#x#p-j ;&P:q6K$^0 3o`y9sH)V}'uTömٵ<[E̙nVj& jJ [E7pAes:s(\95kF+Y%3 @dEwة8B8fj RAI*ȥ+q=/MOi G$44 Ctb :y-UG'7E F< {J IAMlaj-6[0Wp-,\GC# -ch#08KQUy^FG|{aR 2hr"\4qr-'`m>ո i&אLw(, 4w0 Cyl\Ӝe3`5H9| PbMbaaZ t= zjZI_VrQڄzu`Mn/pacᶗxI8}0}hBb ,]CuhY$!E?AA=C{**GekH!*ΩPn'6m`Gٵ\y`roYnFG3U6sśj RuLQt%hlw=|oE^o/hwf ɨ?G=Zpm.ߎ˶ty?//Y,Lzw`s@I)>&*`qq$fLg2{Q *£htiӵCW !0GcX4xWzq%\>U]wIӐNy A"si]JRà !oQnm AC DpUip|.JԔnMO}UƦ8Ld~QSؚ)Фƃ$ySƽ  Q(7&o~uixq " 8_uXi--3 sMߊ2{{t) iHgR*턻76݀VO ;%jոRbC3ώIEB BxӰ"O>v:+-zbδ+O >ܸ39_>,5kZeV"SAAzZtry%̊5^ĸ# A) U+9]<^69OaBbp Sqnw_N0θXT=/د) *D#]o&t~ك X^j`h7{ljH'çVIrgVۅ`P!"l +_}{M?p'+{? <~ߺ~ ]hL fv'uKm3 O[~8Du; h1Zh=yQXp×vj܏\@Iw |"H2Ch@;r24Y@ZH>Xހ`KupC[뀃IOq^\vA5Ou 7 p/AgBW6zųo8FE>ٝ[Աܝ28rdH7T/ =h fU6 0#r,fd-&2p\RxnͮFi4Ez:&F4y1Ɣ웸d+51Zp]xw{y9۶TXmhjʜxt[{A"͝g'Kkz_'unӗF.C@+*XDvpà46lF+/,W ?|^,/,8w_lT= 0\1 0TF1BsJ8/SzjZmnKj/HoܓV pw䯃 tw99ˌփޙE9%C+ I'EWcLz#^Mi[#erH\D ""JE=epI8*OTm(ңfGqf1"Ts쀳=bU(+ rtǞ=8w Pp|^W/4Al6SNź NuSy :.QH7WC=Q%bC cQ"6;-J0WGt~n?a.ϼXg?v),zXqd &&Ip.62 U]jZK宴ZVk|Ay i=Q`P|' 4'R"Ԣ0P=0Zq S`gNcx,P0&2b#8ެfB}R@ |OC0:)GAۯ\R pتT!W`&' Q"$T/qBIA@,^ɟF_\/0_-$8\1 b܀,*j,\ j&0:?9Ue$CBӅ?@9 VsOSMq1H阯SPFqR? df=4g?!Ne = hF)|p`*bgLZTr(Fz_yPcDbIajZnZ֤4] R/ؚ^xw~BD;W<#0, AR;Aa3+`M;|FLNmtvu] -5yb$$U7K9NK t)S8]!R61OVոa/?-ME,VPt1NPA%0U#~m !t(ULg>4 &ਫ਼ALm ploG;!9~b `ZҹI7?x`eE *f29|0¼#P"qBn'$fcՆel\͟iST3ew65r80r3̢'IC٩/O5aNmTa~jZ_e {kjZ%zt`[8$-ERN)xlDp/pu_㋕4a,brg Rh1 sƩEP?6x-_;'. d0.3 Π(̸.Ƀ1v@"L5YqʿOz r@=CB6Pwf4{@@\~㢏_<_ ugh@QoD *v/K8MUF^⎡pI KwILJr0(Zލ3єĄѓUghF6ߢ hc>va„OlC4zVQz7۹UUhzt-"Rʰ biU , 9-2px9}~DQ; pChMI}b(Pz!\8hQ , V-VTO&mnSG-ТqzթOi30pa#.ȯ'qe;,w` Mb96{Oρkɡ} lF5 A$6;ѯJ߆͇ .P INP-"wakKĻB'k=l2쟗QŸC>Μ02( y'IPhq9g"}ngp\['wFtYQQ.@3حR7JWnZ֧;jfkzt%v9܉>e9. =K!R%=:lN3ۻ?]y9a r*05 U>:?ڢQt:8IjZN [VT [guxAdYEb4!GIy H*L#O261n&vB:|iAen,3bZ̢EN 8F%"q0AR"MV_~)hv*,6(Cy_͎MIT#ܛ@΍DMf…c+c|9n/N>U ^2U`Pv/*-͏&;dqziG5WgA(`ntgAoCy`Wd!iqk>p:1%Ak{[|!ɾ7 &Z/Y^# R`P{l4Ƕk֥F00Vj>; 9[VkߖV1ՍKh'A9_Zto|( pӱ+O>+h4aZA|q۶ʊB*\fG:&/q$w`&fŎ  i\"f 7d'`2 `&4.2즫ืaY[ݫ.jeYVȅY^h Y.S42}8HJBg F/\G'0a  8vsHLi&QAnȒp:KyR;iUy-t8(trm L~SSj|IAva%d.L_m4| wo ID;jZvaV:ы_ޔV1 )`Q-LvU+44Ή((8ĒuL0͐pX$;9 %XgjȖdqPt%=Lbư oFTB` `c\'%fE26ְ‹'pՏM[ Ɋ޳pZ/܁7W_T<$xK$E"w p9 vNBu1L'(63(79?ZdeԀOMyX!cG{Q6c&7^#DB#H[wG]Oa60 vSE%֏y9P3]ېx0L 7{Hs8vZV3yajZ_׿~_ZLL7vrF r﹊}-IM.1Q_-3F:2JH.l=&L941Lv ff2'-H,:| b}Ѥjݵ@-ZV-}:soBQ=+}d6@!9 T@ |Vpk9ɩZ. Ug*oQ݈}V^οB @^:<_?9(ij3Ф" a&g1FQu<|uZ`^NEmH .=j=d(>^"s^^Lłb=@8|Ϲ|<슁JVj}.BKjX}k_{IZH7 ʃ%) 8N 4IzX 6RZw!Mk !fʳRJzt Ri \6yFAq۬܀ 8pMR^ 0D -U y2B#%MmEt-\0%oz9eH12C$uobZ!MOs0t2?Rw~> Yw2Z x~@8ȫW0IEʙEjGoԑu*y; E e 㾺󯶿3\t'sL}q0pqs_xdrH=7=~ۭ3)y P 6슆5$tljZW*VJ/Hov㤛@~ x'xGUPK$!ҵ5q Cˬ:!Λؙsx$=0͌a@Sb^r ֹYhщeځ]] 4م"' it@8 ǦkK,`YV`ubc\ܞ*hEV&|KEDP<5?-ovDt|6*l  -!5.1c_a8Xn>? 8HOQƆM Eʿ9:M}cEF0tE8B^1R9I(edbcR!y~}_ p 6 csڋ֤4 Z Q|VsL~y5Z3WMV(-jqǤq0,8f, &׬8ѮHƩq|<bGqٳ. vMPʹyd4A:B.<_?ZI^!"x̟vsߒ*K: (y0\֒p )6}lN c0k#s`GAXϦ{Y/NpʵWhYCa ݜBKg0RK7|s!V;*R;'ym.wcx>}GWisY<5SV5zm`j>oV:o|u5#J9tm!VR̓[81e*($AH]n~R䘕a2e4"?\Y b <>À?=;z1|KZ'P9=#8=9# ac !9d!75w]Eڰ!S1'X.,d̢b{q}f9uo:u5Jx kl$a@ Hך'ʿLh'JVj>wu(pjj}zʵ[̐ Dbx=@&c4E( Rp š FzֆI4 xKχ!ϝL]Q8I|:& Z2$Wnj"F<1Spl2-P,Z ȧʊ: *Rm)מ;HX4/,(Jt[GV[l- L jY~3)l' _NVPwe~snWY=ܱetٌ>R;{J:rfk薃x@1EقRhx9$ JIN ͯ1 vГL8~_d<4\uV4KNA1sآ{s5V(twsf% ˖8t-e@%ݏugDN~VwC/ΏEݣG{i\PI-i#EΫ_VjA[(%֗gB3+Rx{c[(*Idf|˴,t u,@$$l|SXj|8[7~6 ^U g!_ &[( I@̴?D)sɀܰt"3 os.Fa8J׋cQ4]< wIV]ZJڈ1h ƾ2*!`.ȍnoc[߭zX`8_t zf8uFܲxn"`#Pv8_o쨍 HN) b+=מ.x8'q [I<E61V@="tYg@Wy]yw_6_I> xfy:EecKֳ>`o)\+d{qjJů}k/-Ǐi}f !VUPi&7 )4" aKK ŤZutKx5K,/!eR<)Iܺxc?TEo|*"6#,:WS@͊Jb1V:`f0d:69- !h"DюFE?c쀝J:BU 4 LEq)prZ=7O.(u|y>-~0o<8VLA!O[hɴX޳ 9XɜG8E[v}|pC]nU#:96Õx퉰:$?ti^<E8뗎A5W=$ϓdx-x 6`?YIպ6[8EZLWrx<]\lxºŶ"n=\oi>G^φ΍??5i]3-k3*"Q(&pʾIrT( C/" }v]9Tr:>o/ VAn> $\l\Tޓj8@_BЇcEh*&%5!sۃSlܖ.iŵ8]|<9}k~{2^ _aKct aⶄYMib)xum*/DZ֥ 7ǵu>7ׇO@ 5iZR_mO/H^\Cy >g}so e&UidȧJ6 0_/~Ap. ]XBqs B;]pSpsZ"![g84߬9Ӎ)S:^d|՘CKh]| 2B8&ֺncU)%uKF?{x04$NbB)aWlٸS10+&c##ГhLw8rN:Q>h@QHT>`o49Lp V>y!e+ g񁺮Eh ̅&ȦƟ'9>3~e8tu[L /?υX &)9[Hn9kj}jmNZwE>{<^toj}Lm l{6n_lGܞt .V p*1^|s"IDm>yo/yL_;PŒo/3U2V·F4vש6 Qm9< MWNeu2VGRo[81E`j1U@Rs$~y!V~V= b=ٺgݜh=5 >,aZ"H8>b|z7'Rj>yO3ht4cwS`y,agHX3U]Q(!v)R yO9,ח108lWQxkIƨzΙP1 xЏG 1#n$#+U,yX b T4ry}p¯]obP,(}ϲm >\>!pF*ocq8U,O7v)L3w2K1퀽^2fd)t7*7֭Ηew{ nZVO!l` "EYlUr,/"4V&8$OT&fA^dE:2klO'VsV_^?Syu_ZV3<NwyQZ/P7qhЂѤZaZO鍗35&d۽WKXBGt&i1>PfCdH|p!E 0:fp"(\B}s*@Ǐ}P݁59Fc[HKOi03  wtEg@lhTVhK_lK,D`Mi@ݠ |`sG)W_+!I}5LXK|m"2͐2+ T`;0ހxka Z0tL@ Q'We4(3$FmS-B p=,7&þm?BW&t(N8MDC2Sv)k gT>ÁJE?A @ x?i_f ¦| ]npeN ǝ_ @M u1zXn #"pŝ&(`k i=b:P>Ȧp$C!Ť~p,q%Z ބul.فoT2_pm+Vewsl UiZ' rcVDN<& p9'rkv!~ΰ3i$Qr1 ;'N.dNb"4H3c‹A"(V"4\l8aϔ?T29ڬ_p%; y Ngn͸~j,˿R} cpsK I&2QA@&TCpM@IԞw$F6*L| B1  wB8w "oT=8„@h>Th<4@c\oA]#>1яo:?SPT.PaF !UϹ =ڇU{|( ųlva\ܢҲV Ѯ yc#s>{ueV yNV.'#/LW;Tg%|f"Taߚ-ˎ>4sjE4C/(tK8(ݔB::9vA t7 anab%at!R 5s^\uZՙݻZs9Ϊ[NTٮWГ\[sR{Ol-k(fkŎI68S-:~ɱ(5: R ^$ƌq!0 e3T4ީˈ&1fPv*),'4s󅛰kb  ],I"hUixF\Jc)cN/$=&#s2炃F XyRh欩sMA?M9K)QU>iB\)0ܮGm}%ۻ\@:Đ7k.mmOݻe@wV]pY/n/DeHۍ#Eb2nࢫg&Q[01HQ b BsdJv=%E2%3\4w%I" *B|5 ,]#? *cb! 8h^3d>h3@$g&Ɗ6ݢkVchNL1zR(łLc ~4/Rw< 1ks{:g 4.G=0ψB!?_5xOұüӪ@ֲCp dTG눩gBX zA, J1UL,SV6u-FZ Qckմsj@汕/+DJ r6#PzhNL_Us ^/\c 3p{/m`ҙnܶ6x]jkkk&݁u}.6pjk{ Y6R0'$ǿ\VGPmU9 <[Q6.P \@\\Ri8TrQNR"6+(%D=QUQx2%~DIcmO&;2cՂQ eit@?)RfRۂ :Fpg9E<\yˤtLW2\Ľe z΀)&'F,@ԤkR*I'T[D!zἡ-@p#xeG/mB aZ>Ͻ}28 dUDXIP&P;*q)PѾ@{K.8ʬDoYizNzOrLB9$? Ӟ2G9C\Wp>+vd@ܹԇhfm2 dɶdO0G}/1(Jy|$l!6WoӲ籓G-ϟ@ZP-weWM#%''dCJsUD(3Lj7o/jkkkF0 ~nB^!0> vK /}V/F`.o T2:IgQ7\6~/Zue~ul%A*NcAPm4_PL1x)@P0:5N jUcEI-9sQ8lb$ů6N\(*TO^ ա>f`PC*P@;soǘ%H( 5lR^O|Uy  Wg>cjpޏVH 0]']`I{jr?kFhߪ;:O @)Gzb?KB}F;fGK_T Ť'Y>wgɊtZ|/bΗg;oxD$"!pLw*sKHmmk6c_j/Q[[[5&a[t!S8m7aw1GGr a(c½l ݿ"5#l-5_I)`4EFD4S 8Be ;!rgU4ܐ V(PUSg„BI/fJ*H/FRwQjH4N(?6Qԋ JA?؉AR.6r ralp(MɈ y*-ҩs f2j`?"p@?ޏ#Sp %zP|l(u%ZAFm;7Po#6?vU1uo<7L:[Ǎ3(vr&w]K<|zYa`5=b. ŅQ U=CX7xYӤnkmm7h M ]m_zڮ!TyD273.=Lp0ۨ߱rfLFCb3#AYTccL)) p30f(&p2'!aV)*3> z jD=*] 5݋|Ufc)4 >VgU>rZ{tx]-cY'򝃎 $J='<I1w_{L=;I}הOj*pw&3+U)$ԲJ @=b0UWc ZϡCjue-dϏvw9ug& x68ˡgRN,e+BR h =N9$?.sܟ{<n6톬3ݰNKvvi*@gc C@(LW;ho@.8܅˵\(,˯ uD6b,Ĝ'C~_ 'g K[utfබm{.$`ݔ "l7mjkf{ CCz;>U(EaJ Bc\ ,@4iE R`Q&1zu6u*Gb'# <4J7vD3p0MhS )p0Zx`ֵ&8g&9?˟On>J]5 ˯f.p+oOV37bT%`9%JB/&ƒ]wN-6e9@^Emc=]\ yL>igCBkv^j*"yͅ` ?b-P͢^| `8t~&]ufබߤ {6] m7au^3L-! XwtgHM0v,R9p+Ćgw$1 KyFl>JK+L~")SuH}7bpb䣒8#uH3{ZS/Up;JJU>A)>Pl=,% h 2O$cf椦"Z3:: '*OǢ{N}I1%ooOS^Do]=Ap^Md^`8`Ll*6W]|kY#_R1׿vx_s<2j54B,udmz7W@a%{ o\H>OppG}T><s'i{2֙nȶMbө3݈]ʗ#:ڮX`[/ nu7A>˟z*zD}pP%OǬ >Y[F$w%uF|?s P*5W`& iwMLiTh,ǹK-7A/Ñ x~yțSr# .MYtxd$3k_LJH2<,d.^*0jA#}!HCU!KZT}ec*PfW{j6`)ZN/?}_>zkT@&:Bapx%Fu? sJ,4< Y42rVC5E9GF9;n:3p[ =kK[[My.}OS[5C @4 nλqnpȉ,@R!8_uRjrCp/a2(æD #iH /Js8#$8O4|lth_̇z7~%xv{ۑ m ;kVȐb+l"#McY7pTke\Xj|DPAFZ (U\F-ky|t9=^usP Yn!HSzϩѕBiVU4>G}9#UpչXH{jeZ~)@/ۼR`Z(Tp}Oey)ʀei*K.F eZ;B fqX⣿uKc4݇ DC(T(y3T]Gג$_,CD 4&+4p̑ټ2pmbW<4 =PdIw(f||爽GP쎘I7AyWݲR8|O϶`U,xNsۓr$R\k׊NI2UTJl{3]mGCmmmmmno"3 y(8vTCx[\R|0p/΅k&|509^SE..Ū fP9LucJ&Zn=& H)'b{z.8C\ll$ *"BJ'Mj|{,rP!?qz?jraP(c zŤlZ ^Ԏ%LK56b^Gm ,?M1{F`8|UyF+0 8(ǹovj4Y1$(חK&3m9Z({w>/mAg c4dV- F6 ٠9 @h&ŗ2-+eszrhx(~)_q oM ?/Tl{3mfEjkF{(,j\ǰ&".*y\>*87Z)%MI܎60xU!8l\745ж `ed>@HzP?jGI8 #{> jh9tmI=qyBs9 mmmmmmmmn!Zd;0W+46B\ \}RZG0*AYuH %*Dh(] 4篾7f Q.mZL\m !g#Vv^koOdqVcxB(9ڞAtPzm[ps1Pu-xRz])9Zς( +ιOj|Ly΢{bOT>֓f&!Kb?@:?p[jЇ{g'[kNfzQ,DHC."^6Z8sLuR<>BpDfq eBGSHZik{3=k Kv@8T> fy0 hR2 IlYFl%&*|"g>DšޤԉgR!\gG= Ee2L=뎺KHM;C@S޾C{Z\?<ҚT2܄M1P?ӌO4A@[H"kG˭}gw͍b 8}Q?>XWKSH?CI$po{xX/EZ;#ONVL|F.\Lx+0 :L!qGڞ"mmߞ*t]= 0 @^{'d/ .+A!8d.T\6Ć]f9bqQ% 0` ͳˌBV#T1ٱv3jDFϷw$,`-euZ,q`#p`S-e0w-sr P'T^q >햳Q/=4o 9e@,W7kw=1 f^KbWWBLQ7ɉTGJD>ᑡWuYn?K=!{_dE\FF5ܾj pϥ{#h5zq-f]HNdȅHD2(o~݋j;G: Y.i<6 Tj;`']XŎ9]éFMLIsN4[b:\#7OF~4I"^d#'H=aYz{t"[۱m".,ˈ/MZmo̙Ha۹-ߠoQ/y^UMS=̈́B̶VAoϑMm/|IÅrƥ*3" 97K/Y EKM+L79ĩ3~kk{m Λo5jkk{$f$7o}sMm|ejk9lwr!O#mm5DcB&g-܁HLqݢm >G,Qg[uGrZ7ئB̆d@2\:IK\Ʃڹnjwp Tc }ed( 9=Khrմ-i%vu"Ti3O*˦ p'j Vz1u|=(Dcύۋ_[@k<&^z=`SGyb?YɫNcڬE!1o Z0[S E2jOѾL ' @׊Rf$D$w qil%=bT2VmOiaz1<{nwM(]}6wbooڞ^ | oCCF̯ k&q\R>jnرuO';Pol[bŅ;[$3:ɉ:ȫ9ɱofw3<QV 8/ jeQ(1(p]@YI'XŝU IJe,؄9^^LI+e[A[{NP_ĹO a 3k-nU'cg ?MBjLH1\5x⏄"{Es֑HIEu߫L|iCginȺSu) N"JtV1I؟Rd18a쾞8$GG9CfD&CH*xogNJ\-s[ۅYgnk{D ]u{|aЇ>jkF{YbK|adXHpa VێLpd)Rj 2'$ZrS@FS|p Љ8u}_?_JG\`B(L%Ĕ iF 9@SXi'92X5a|1 OhοobS@Q;rLHF\y]IUXÝwd,#NiU WJo+㵿KUzչ|۬8K\"2A1Q^]bgFLϑإPgK%@])þcCN HSm4mi@Ktnnmmm7e˲Db;]=#} "L wEф!ćl\ yJ,^BC96s: tp859^zpUH3*b %5tT&j} GzMRn %̬@ByN5RR,:H95N^Nmcv$>w J^?\Nro(Ov5%1iC TUcZkN@ڼW Ne%qX .&t'tؚ=o\`x|cILLY pĄzРϐi pMV׷l{:]mmb^ǖ(*PRm@H+5 TFA%§E /2H3n%72h8-U=&loMNu"51X`MA3` Mo!g#H+*IMC0DV4Jx]̩KJy\E@Ej=|.=S$cy[;*;5/|5V3eF\K0D7q0NYՏ\Hņ1ubk/QP.s-N_Wb#ڀv_\ó3=.hKw{vvIޡk(ִ fx1Rkg܏C~f"B8V(8eqw;\-WR57lHL3*t& 6YIYH:lWn5"1V%vThx s XN >eB>SGrk߹?$0%{% 9tWtM6@U^I=x?T{21cr $)OXRs+aVPk=]S1P*nYYKC1\.x^ts)'3ik{&l mߠ 䶵]K v`8vԕ,  F\{SY0 z6ͯs\ x~3?V$J%2%jcOS~` Y픚4CpAFt6KYUQ9%T}EsH,:I-__X]7jR~?03e։{#1joW<\ $"B?kMSϾ՞>wۥgDT͜[# M~q#Ş,Y7z ص"}Z۳HÅS,Cwux݄uf6}-l|.Ķ]ݺu/%n/Gڮ U \!%Zi3S&Sۧ7UX'\ysqg 1C&JA"@ qVF5HY<0ڞSJYC%H6^W\r ]zP4 |>ʗo s ޕWw|Qm/%/e%ȳ:>Iu)j]({({ (|h v;__7ޡk6+[YXz)EL|`O[׏&`*}3dC=5FY9%0P]bް' A>7x7 jkfmmf 7mmmj%t9vwkW=NbFT J ^? wf*Z g&xV:`u~/&BTzk9Svq-;3\^RiO_Er| ay-Lu#{|CO T5z =s5W~]e}nDB֗3T3aK86l݀*Y&Yy|QdjUf>: ~flktmX.sU,{ڮѶB v$ ^ckR67ۀ2;Yh1$āGj$u2$Rᤞ$*sd:TG5l'>^hv}ޗ;*·#pih2UA3̯kgPFq`@pÿ ~{yinmkk6$a҅tznBT&٠e?]3$amQ@@B_|t8(I2`jfPE9S\gCv-)𙻲ttϪ2ֽ k@4~{}sm0IBd܌f^`՜&L_NޯE1BqKŒˠ$'xh1ʓT.xݘuf/7K nMn[[u otJѠ-ɊI tPM耇) wظ#Y۸>q7crc6"NO*E @H"bζCsz 1Zs3hT+\edv,Mw"{gCYf+$]MO>ԇ0_%s|}Ԩ^2=^~ P,"~O(&>KQ9ӎIx_DL s4],xE#zmK̜3k=*=N .đĩ6Yq[ۍ[gn{/o&:U{oR[ ۷tT[`nEYT8Xlaߤ OJ*Ssǔ~D'Q(s+f)f@t=l_oc?yߣ7L3l^IJr"sQ~功ɇz%(r2S 1Pu dԟt|=eʡRK*?Yqo^i?}gߺ/7I؞D r_6H\uoƷ瀘/Q,uبB8wj'Lہ Š$,Q"cG(D/C2TUmmϴufg.oS[[[c֭[߿DUn۳ jk!{ we-̪B@;rN`'7\F-.rP ?`mnJłQ-'Hf;S[CP AH>[l聟;+ϽjN *jOمؕy@L4)Jd0>6r\)LԡK*80y~NZ:Ur}c NOف_S0o̊U;#l8<ݒϗu~Lk:s28O}5_6Fvw_'dPjzzRZ*:\"; N;ΚWׄ^cKliprs'}p F->bQV _=mm7l홲}/Ub=&]~m7! ݒҎE S Bq-v L9W2 r4]7Z.UP$3HbJZ?u5Ñ\qX 'z:z~?I^*)`\mGW܇ 8'nBE :N.|fʙn%cV!$?r CцڳOo lb\)ޑ j'ӛŢ5>9%=j_S>2%sߡMX 3[Sr H!Q0x%B<#;A7svZo3]nmi{Ѯ5jkkk{B؞.ۗmWF[F @Prb p O aӦ:`Wu QWHzˉ dd/ H"D nG$ۻR~?xOi,U+.Տo} - J~s+Hlp;sO0zaxt#g gH4/^M@pv': 6_Ghv.- d $!uKPzyy|Y1Sfu(-dr1`_  GL<eHikYgnH#uk{.ŭ}Y?޾Jnۿ_GJ f F9qk}$30[r,} =6kzNqy Ĕ؀ ԊD4'S5 )xXc{?;~_Љ^{DU9w|V>!#:s tCAU; zJT)^ SDjE_Oye@\z$žQ&R'+8zyL_@T#X"2w_&Ptv.DT mYE9,)(kgT]>֙.ƞAh'g\g = HgY,?U],SeeݦvcTIBx3)D4{Wis {~q9 z fB =Uzdf7;rހ;毸lpnX+ޏGs1I-F",XHa'J-67iy`̡އOU%eeCUe ĩ@&:&Q\{#굹 ޟxO ֘zf1OC@/?oF7e9?0Yn%/Fb =o؟CHPQov3N-s=?egg^k_ۓ+Bw. Fv\#cV[%.N*D9ͺ 8⪓SRQf@1%3p㊕"V.)_yt=9jxr rIɲ"++dp{ (`!'"`g`SX} [Y6S4;Ts,58* 5>sKN>|lYg^~Vݼ)Ϟ}f{ jk{B =`0qC[V&Ƣ1PV^tsŮK7Q[,9νF5IB3S5dMc{Q4yrVcB'hԻtUNjo<&П `f<2oVz#eclX_0yvLOnR@*sᎋ^.q8/9CRo&29ӦZJh]ީ8 _l [>)U2U7;u(m߶uɱ:3p[X+\&3IC}¬.S{Y(5c=1gHb0e >o•vT2Z5牤o5AP@03cDEEX[1kVU/CwU0뺾ڀ Bx`8~;\|ipfMC0.(J(yv !IAL2)eG(Ni'Ò`$ɞ\׃Jr>gmz͇2Cf)jpVВOW]ޓ$+g1Mz]M.fx<6KE)ژ8)uHޮ<-^!* :Vw~^D8׭q}mu3] 7|Ujkkkks۟AmmO=C NK!ǝ.KWE[[A"gF9biaS?31H[5Nuy$KewMxK\cGhE?9@T9p ܏ﮐGPpZ|XaN<ωh"i`NpnUI갉dHIFpr}{™nȊ80-jДTO<xp4RbK nƕZXϞQg_AQB"wY!Nc/\>'u-2HM$ <`O!sͶN"r<~}tɱYODlVt:LmmO tSK.2+ ./q68[Կ!iReL^?Fbp!A)p.K@fPR?$Fcl{1r]{I @h0N] sD fWqv?.}(I}E1#J8{#:r}ӱ\N 0en+ 0:Ή1ԄQ9r~QfRcR[o"RCjSDi >^,ws>DE}HxG|Ðufx8ȿM05/>HG՞a8D>&;X},MoR9ب\O_mm?7دхZ x7| jkkkk֮mO=SRi* Y\I n]7[^ƙJgM۰s02T<\#>AƉ(#C-'IE^׏LͧpZD\L)h+?s7^@@9*0qy<\6QL4CN%7PlRIPP2B>O@ |@nW\R$cD-SY>.:( GN~׬L(_7?.TF+kSRN9:DrhD= ?\?n\Cԇ&'Wcg&G2d1qmx]IM\XmO=[E#Wۄ' `UQ(C]u}()p3rL c sULq Ey"WLnvMMjGm ODJD8Ȯ,bWp!Y7`1СX?C_E+(*\q.WC x+Pܘ}:}.a'`(s S 7[O,>2X_ԂpȨMuI>mk& vЗwۯ\ojP×#A=WY@:zC<^`Aԣ0rD2秖j>q8MDD#nk{\v:Kk{fP[[=9PUll{j!1(AUXu B,K5(|; %OD vRvJBb:R~@v< DsNsCۄ<,nxz}{y[uC#Ft??eU1*, T  'SV~zQ1w f9G#*kᒜt xkU2$zz/;S?ѻUxK|.X{xR$Сژ]3 u"|'mWz<n*\/ M̄>|,uzuX6>&b!Fuy}lyӸfE{33y jr%Yֶmwѽ{.:3p[/{[[[[ƶn=$%P [V^]sSn o8Z6hK.!qdPoC+M{lqHGp!,Dm?/;|)PFY? g0]tUC S?ᢚ##G݁鴮tʿ{ws<=ĂT@<3 $8GhƵ2ڢUBӫK=c(|P~F}8u*;*f M5>KoP[0Q^ϧ濶Ż k3.76H;C@/>o~^kncs+>ɀbZPs)+ֲSZ늑B3$ h*=\EQ ')/>+ߑX U?ӧ_!KMgl#zoSY۞_|.Y)Y?۞:{ vgC : M\3Y5O&c%FqZp_ǚsgo,:5k H_N X[p5-3&uy Yi@oeTpRGw6yzc8٠|?J/e=&zLudw/WwNi CQ[[#omW|;oS[[#@ ^(.ك Հ+[/3b$#H,Q< ;ng k2d'dC6v!9%N>gt~b]|["wN R",\9G,@ ".l\n-2܋=y)"C IT-c.ϓ0>{XGGǮTj A&sRq åWbm!yG#äv`f1DKbYeR9[o|}&IkeP- +}QՓHR+U'_DT 6}q~LNuC}$@dZLGs-f0(_-ik{l֙>X'6Cll{Zmy91H6ÎoQB,3\hs\ڕ 6\.Fsp_]CrCL$M^ ;gw?7qǀɆPyd4F&`U둜 ,ǀg#+0gvnHv)_WnF N$TLTF.Sʘ^^K{ĽsuZzTdjr-GG, dɖ߲rВ@Ÿ Ҩ0gwdžڪ* Zt,_zY|Ί?XR.:r63NԔщChr#J[A>{~VmmmpDmmmmm)2o67U籩L&M0bv<]$ c5M DYHqW^⦛$@Q)= @]Ժ> }};35 N%I@020$pO,d`@ 8\wg 2j& :"Lұ8swuSCq7W ׋+d dk , `^xK62l-:]8%:_O4בIy# @L iCv\ (+pqJA'G7#qZ*X(8^W'vN0.mo:3p[3j;6/S[[[[[ܡDڞf{(4…m)HHR˙)(H&KXď9ZzI ]5gŎ >H}{p 9T:b< ws%?dΪژ,`"~Rθ}4 0lb1]vWD:l2}>yŝ];Cyq(WQ!(Q>}g\[@L(ڙ&TT A ՗ e{yʰx?dhGJ='֎/Kc 97 E Gd^hP2:9TTu"2Bg'#I=tq6ao޶,28I"FOjDo l~7mmmm]=fFA ǵȓd(G8k {KaJO-e?] f@vLC7B9LzcX͕rYk..cvbz% J%6X v>W?HП4H;>> [yEڹ35+~t!υ.lsR\Lk+nl%Cx |`o[[[[nv)Ͳ~_ۥC˔<ӆHa>#-E!hVMSr.PNdqYnd{2 ~T6\7в@Nd: _=ׇUE ]Zl(37` ۵ϏȀ1,[,@`9+K_r }~!ö,'SL"HTFUz8h7M0̮QzGRl0S2:P: '7ljͪ7+.k6[Tnn7i]ȔX_i=/#) Rռ• yChWM#  E;:|)Bvԗ|L-2i736V< 'ﶶߦ vf/ok֖ B7Ϋ`o8sSyL~K#; ‘)\"c[b0`+j_x3qA\6+7_TIrܓ9p;˔`#6!؀w_c$qhW&Xُm>|¸My ڡЩaX̿* lo\)8ϩ\foQW>ߧ{Je+xR%7 @.EU)StW 'N_b펟)wV */JCyKf5ӗ.b<+yC.,8{t-Uj* gw< pͶJ%%K9EWc= Ek/mk6}ݕ[oP[[[[۰bfWfo86$璳8% svU'(i 卻 B$(8B[SGh}#C9_voͼ3A S9Π -wUdF`ڳ24[0C%H fY8\YO]A>:gR`ƵZ ȡBgor]Uk* 03;>Kpx?N/I0pA#7HsZ=gLi䊅UuEo--4~-:_ij'8o*9\Q@Js]fa*-Z(}qƍ8<+`Cl;GM?0dR#9+֓Sg.LcvW!X?7sVi{Ơ^M1آIrM*I݆GLD U Y몬nP(R'Qmh Pdb4K]$ՃM=s_?Cf'%uU*ϣF/i-yջ)I(4+|sm"%SQ>C@*=5Ȉ}D>õ%E;VzK< +|ceRWg' ok6{F2=6mn[1bYGPM9(O"؃#3q:(CCgj,0wIq$^Ozw1UQ6D2~h=~Y_o߻޷X t%TU-1h ߮[(\~5/8ev mdx~KrVи'Tf A@c  s2eBscvEIAt?rsǙʘq0'8*M$BZl+*]S| ꖝiNGeV/߅ܳ ɵx? KvϾ;p>_-w}aȀ97qDJdtশO >9m})U".@da,l 9X$yc=YoͿHmmmOm_|c~7mmmmak{ /,R KkNm-/psOT U .~28!eF$+l~g%%?҉wm|SaR80V'Rg֕@rrPqBpD @+i,Ÿ!/[T8@'oJ}"*m{6-xS.ٜK+ʽ&pX~Ҝ:@iT3TzgaXNJQ/ *kYl)"N!x{tE%0>X/3;r֧l􌎑4,\!pm7?PlmF+ۨ_vx}u#g;1ޗ?qro$O8j'o{ܜu]JmmmO~^~뭷mn[F^/FڞEHg!!A=ϕ́5+9>Al;plxБ> q 0cIq I*oHfc% Q+RθNjO=7ܶpՃB/ؓJ f\ѯ)9*\qu~a?7cȒ9>,@ӺEmN\FeWq}>~o+]-h,h4VTUt)ɸ_As [QS>(0e7T$T\)MѓGJIs\ Z&Th'1&ل52O:;[cL}эL1+O֯Y3Gb&]fŚZJjUtL@OҸ|lQ(kk{}kno7bVѯYGKb;ϤrW6=) |o䱷 eqⴹͰ/:t\`RsBtHi on}@Ϫ'zUա> r:c%WAU &fMpJ_ 訡Zk DTh A=sW-~5܎aW~4܁y%7 9smaebx&<e$}lȡ3c&Eu3Li[Xz(4!d=<)S9ķz&$ "h.pɠ:ՇU:92KpZ*U<_g+̝^|MSif q|C5AszZUbKdb摎}FT(/bJ?m5jxx|zmzbDt*z 3jJ_X:4IC릃O%as *zT3?>eՌy^>RM|I grU+eBQ cx7TX հ@)u%2e$\lCl5wYڞ3_]]}:Q[[[[0stZC=TH\EK(~M>%u='*`La{ؖGAzrpc ԠZ(?6UYEJA؇P `Wf*IPAKiy_ q݌4l'F٩B"1XmJpkn:;L۬GF2+,Zf$#]1he'7k?'*jd\+͏4^ Ku'9cnMsʗK %ȲէY {.5 .ivN"m S`Z$~Y fBƴg?#}*t!OԷw8p&93sfN`i!ם?18ē@權+{A]SI# XƧ_<8֮)/)=xVu$LxTe?]JmmOufබWܹs>`" N~AGhƱ1۱Nz,6C]\`[Tp$@iCtL"h-gm8XGqLԁ$~ Cs 2@A~nf:kGE h ;D~k娀ZmCIp{=;>X i7* 2 yǘS}9'n&w֟vf9z&3s7F"dJGHR _Zr>C=.j138F1LbV fE@ɛlm1Mϫ-U{T XE%'/׫#:db}"L\"@XhD7+W>3ڞufබoݺ-jkkkX~o/jAGYjAMmK ]f wR&X!W@c`v9 `P푝}p(d&0Cd|{VWMp%_}Я3l5tMC&Z(u< ~6 }LUR)-y2?y=WB1d&e饾_xJ)J TʖϓkX>Οaeus  >7\uw ~ u\}8 ֘||N?jPRG*6ʝ_/tJRAtKT~5J4֑~kH 4Sn&BfU_]Y)j_3~y6=5g]y~ڞM{cy&-gU3x醗eodwЈN;b~e Lq j[ZqKEU~ S P6e_X9}J\MROH\l,y-ጇJ.'HZ+xy"2uw>r~") ut- i:&6WQg:'pfFp( F\zdyL؞RY??d&a3޶(c1>Izq1FW9@F'^uSok{l'>|ڮu۽)nkkd~?rno{m޶óĈDlL\bq`d]$3t[ '6 LDDaihFHlݳ맳hm7#}>Z( }r+ݡXVn~ a>ɀ{:,G,JlbC` ]\Ǩ*X|lHُ@1v%MYjlq wS`9rR1 Ֆrd^FPb( 9{Qis "Pq%MC1(?r5EB,[p6eDNaN9TT:m1M,k_7(گ_99L;EI%@P;rěf}~шמ~$QFvX!*DLva0*lSRO?QPHzUt9#0deYmKmXֿNrx' <`$Dz5i" O?H30]vnu Hl`[n}{<7鴗l^^vͶ'j/#:^?swhk{( 9z>P:Ie0;n;@^t7qR'3?*LqQLTڞ^3Nmmg7|B>tﭷ6= vb+ykky{(g-Ɓ2$oZT[3-p箆P`+9h|ܾ<|6v#KbǑ9Dr\/!<ȕZa#T[ eu" ^"x<`#ڞn/W':aAtzu~R\x6]c{=]M[lm9ЁPQQ.Xnc_,LdC壥#+XEbs#0]@eZ9=D==UM`ek1)NqzP X8UͧR_yx{;S'Y 1Uf*!X{hYOF}?ڀ=ko5G_ ^*_:931$r9]2F:œv lc~΅sJAϏ$f zSe20̕,= S_}n b:bE|~[XFMy\m*:7(;&9Eb8.K#֟h D'j8C`'jk(mfl2]=֭S[[[[[[3oo]Nc{yL qX`DS\{L؎b$G839#*+9F"2qՑ3:_b.q&K@ޒM V0ЕK] aXB>E2SŦ+1 (E@Yܯ +:<2 EIX RE$݇KǜKyN `bzscBBW(A0EHִU i A* [0 &>M/kv5a*_P M*ϮQs.rN0agSs%p:\۞xomm8_zBmmmmmmmϴ=^n (RbC\8(7gnK 16s~ȱ$p5N9L;uaKb̄[fnfPSygf-V'/eV~ɸM b*g ZAk:$uw碿߸*l'{?_zB@`Ys#dScM5 y>*sL`ᰪĒ"KLb 0a_O(gp`k'` 5_ZQ$(V\zH'a#1> Vgqhp18fVz} W}WtQBQJڋL3럎$oQgTְ,9zn]홁 v!f.]rΝC/<">}!J<+^ ` iiOS>./re;Iczug`:zHQN)mF.9+G$ ]E&;A`D22`uˊ;g?kq5d kse[ JrV\>-(59;>sNCKJUm=Qv `Vk9Wa~hj_@G1CjgL3\xU/S?㑦(0{Qƹ9g/Yd -jn]negl3WK c8΋ńr'mI7ZPQ'2fyީ<)s >8g5eNlkmSnNuyNɅBAS 4r?CB#u"2w G[hojӨzs4AF' cCS`C8ic>ZM L$Σԛ7MV{>#'ϑ!#,Tk\r%#%~힅K8U ܇~nGq nLsK*.['&wle:7(*Ɋv"ĀD}},R|?{w^4U}q5}|+&̄,KV6Ij<:=.,IBu]_˱Ujkkkkkk{&p TA791qt [] wU~|%[B)_l*AW^Uu^AmvFG3 0,PLe&<4$ ! :KPShB9L\̽T~~@ \Ë)zٕ؀ ˀT30$~R,4 4Gfh1 {ppjgy 8OxL˱@L+\:!)wR`)ZlFݽ@6bu76yb T}:ssݫ.QaDYO.@_0[/TTw``Z. <ԔX쫒kݭV 2.jP*]lbXA홳+ٝtɔTIjLWQv,n#"p&ۯ0K"{D=9\ݪt= uS PSNDYt^(*C@&`]µ/gt._2J(+2~۳F~oR]'HH3W  fT0;BjwPnaί8[\ȱLI)Pl4iu2/ꅛh: (Q!B}.|doSy@wf*t>JaN@͞5\z2aSqo\/nehEsP  _F^qRa hWVL?~Irmmk޽{_ r_;wg sQe-.n"`7vgqoHiEC={ru.p-x4g.qlq;dMq%jP.WSu89!ɐIDeW BD?v4d?0sw5߈P$RRQ@)~^=?lL:3z?OCS Ju-c`pR]b*5WAp1an~B%k*13*ʇspPAd2i*{0?' 7XC4? q;uHxFp X*vOzD(Sp{pRn?k[C{똋an`3dlw_$W۷nzڞ){H`O1;a i zK\Hc8qx =_(GJsp/x(yKi7ER?JʥNp2lݥGnBAXR)ᮈ_b J휬`LӠkvن .IC]ӎ&s[3.c0 {ݸ],אAbo("G,ET`  0lY=]ecpnZoH/6e $rڴwTmЋ.̔ *g&. j ih†?rL?eH d!9>`qu!W n@1fVVV}1 uo6pn.%Q솪׉WtJ#5%^+sp?w%eW#6vQ5ecɀ̥~;2&`Ԍ"I8?sOV9jq&RThj ͷ| nL =g F41V.uD0'iֿ/2 RsSr 'vNm;KID_R$Ka-En {, rR]h*@\|腏Hj3 Q [ޛRz0繗7.>*NbRSjL#"`@C.Cű"G#qh=S`$֙b a".rpi]Ub=s@J"Ss=N HwAҳ”T-<ߓkAt KEx0:2a qwnw$=T{5e]}߽ۙ.L /W +H5Rikp7𾉅 <@o+3bWH)t"ࣨ lDίc΄ Xv'|lp< ֡~81lв2PO tnw*Tx W2@ ݈_ыgHZ<91GLPɀѕ8 l-ĵ _w|zM#X[є5 9`rh-pB)`Ćh0*O"! n&&= f_ZyJ~ke)WQ$1 `*14[ wЧbJW{.Nӫʝ;wnS[[[[[[Eۭ*U~v~m-&,d;A!$M7<p&:~Gy[(gڑ\}P ?ni*GaQĮnHT*1Ơ|:hPA\ c If[n J@)z@295-uBr|@ݣWZWl,d+Jɋ^Qz'$#JB"Y7bN%PbcpyfN+JLDZ@m}1Dl^G>uG(uW<:A(z:x,\/Wlx4(q{Ff^AhE<:l%E 1\W bɶ ehθ 8m8mX1wmmϐ曯 ^~ڞb]tLmmmmmm?ur{ݵ#gP#,=1kȝ82B+a mQ30N b<6Rb͵:l3,(P(FR"'3e!gNLxÊ2'g $DA#UF԰ww7p%$ ۹2 ǪeX;d;W(Hm~#c[?"G"dqޓ;&P]QF&K|YELj]Ņ.cU\t:)18''IiscIzV> ŸM}qwkis]G ;fmmϊIlk6=Ŷsm]oLon}w1_E4v}6= #(Bc؜)|*%ru]ڨ H2ϟ$t7 2J$$mz#&B36g=qp1; NDRRpUcDC!VŃ`ekdp.8/( 4V&t՞6~ O^N,zl;jQpAa/oݣq.{UL G}Zʛ? qJ,p{}k IyMM 2&H1Xzpa2WZ<$/d1 ȧIQAY+XSi׍ٳ< I&X%F*J-,ɁYe3\qʾn9 =t}CeM1@/N|=öyΝ7zCz뭯l`Ww27_|7ȶ|)ۣf_@vՎ z%al]oq> .r+F0s+Ud(Z~BaOs2ݚ6~vO|j/nRU\PXه2`âh6T&"XUzQdNZ㨾_Θ6 Qd7Q6_{򏫡Ԙ=H b ~#J2і|RBLh2ISPhߕh8/g(ImִB.uڨ6ӀץNA= Fi15:9F 0\ֿ]_0=RYYkdFIp)g𾏺xa)RDljo7f4lcTRl@X ܊޶[L5WA穭0D|Xr&}a=)Hȿ,!7Ā ..+9vX6Hjs4+^vJDDϑ;!Oa97MacQp+g aAZ@q#y*Qa=ȀTx:7NSp1HƔ@'*6G|Q::14:53JBI%&$Js(MUeƧzҴ5DȠkLסϹ%#ro$P0D\Xxz a>vh1\YlRh@y9+2Ee*x?O뙁nk{3]\}.Ķsnߺujkkkkkk8{8J%lMb k.g[Pd]flQ7qpea~P aY)U~ ̀~q &>6ђFEõ7݃N#ueW2M }71E |[3f.p\ qEqy@" ;U~@(Ie#^+_Gl6ژ6BEq`kA"~_SPLx@# GL! (uDm $ZWHAAwv%h{cwg6Ңsr?t/`Ms߱?BILjK<љ˜K=ƃp 4?츃ؔܮm< m` Jrokkkkk<{(4AM2i^ę8:,PEu*IP q hb qeph:lJ!AG=˄nt]@@B(4)K*ʥ:8dnr9bf"JDgdt̬ %D#T6?w`Рޔ9PG q:x_@X.i04a8Ac,,C+ i#6TD2X̓1T]R嵅py¦47VX;nsP@Ԧ9q(L :nCB2UԓP2%oHw G\mc~7@*ZZX/) (JJRM4h=̞!gVf$р0}iqE6͓ tCT?( :IBvܦ{=`/ñ#E݀`pŏl?N]5w_쪍!rem!!d-sPnq$-2z;Y 8Si1j D||F)Ro]%H3DVv)k_@\&ju ^Gi6ʃg<[fFP ^_ER/y pΗ7Gn'i t=նǮ@WS[[[[[[`BvpMCA3̠p| HX\,t?^l@ߒ2Vb+99 FK9V"@vE8%9+bI._E63lpcxzQ!WX4nh8P08-9p~1`}PpO/~eO ;%)(Vnp ף\ϚxRUY:4+sjd$)PSlBVOmaT,EfxLu( }_/'/Lgqx܍6}514'bs6]!8Ϋ99~;qi1&oڈ91>gw56=fߦ˱/ _GHbB@/A'L˭@$K"V S g&g)@8MKM]#5AIw0F;o4xa`-^HD6,krn/2 $D<ﭪ鏺uV#ɓyR:rq!)^@XTXˊ9ZbQfJl䩰N#FAI6;r10Z'0$YEa%tnpY":<+ 'зFCh) ~DBO:ܝ;ŀR<ز;x+Q$D`ņb \H>w<?0?&D`6bapM )5(SIPքfZ qf<9#&V cN\+("Y`$..U[bNy΍lj 7X<>DŽ'[WTC 4˔ƿ( gxrSXy|֖cb5fB/QWn]]P~^ZVz\0) Bl̗rQ gs%PiX2Bcnp. W] SGOD8w6q/*gV:tg;0&ݤsIR[l14KUE="WM)@%NJR)U 8-זXE}OwmFpwxi PȭlHt+ BLia5fyOYM[ Z/([0/( Ȥ*+~sqN H9 !܈""o@ 'oy73/q_=|8 pٝ pֺJKni΍G0xo eHt,G\MN\ZNJKjtHTU:G4^fBUnL֜<Zfiӿ.RxJe Dz2xJejkcj QR-[&]2: 5/ 84Tyzqs^\|>VkWWnB;ryjZ '"T4*BYs"wQ`8ㆲH:iZpN :BNABpf\ d1 $. |ohlr@ k*!2jt5L%]]W%NV2SeX< 6gJ!q`w}\8bYufb,65K:҈H^UkY1}5{Zb u9 Lmmd*,ik5ewZEz%97a~}Վ/M rЀ:5(%QnfLN8rC͡_wAe~h$džB ˲,Vʩ+..a(k׮]miZVB9’nhcfJ*ocO?VOw&PL(iry_@hS gtf+YHJ l `o+=c&ȅ?3\EZ)}+qs|ZyET2DT p$W*)B_k!iZ4p^9.qPpT#^!+;(ܝ|_?C.sQ۾]@B吧c,Ι]`(" p! HQp16[N.;ec$:W=qHk2#{(!u} .[TSXO-AFw4[msa5+[ շ+(Y`#rp9 yoxb&P\j]euee_6w^7jZ 僈8 *>DkT_Ƅiau!TSǘ9 ~bs 4#cv:b |)+NxIP쑾 W<8C\^D>Dt+E/puoudD:yB96A(r}|a˞}EoW P)>խҲK7p;?{zN$@N*zVM,)DR}piӂ\m{{|?u=onD|> H ]c1|鞛RB12 SBeA"NKz,Н$AfdB61.6k5sqH>gׁy"+ CK3jˠ4nZV3DRh9rB@E9ʅRN vCb]>`옾}h&`Xn K6t d/-[]O'J/APF#!0aEVgstڒ0N$ftE%a1z*btnq x0@`"l;$B"sz5`m7jsoZ|K4uX,h~[_ v9oe Gg}y?֒X"&:\>祔/Z%nu0Ń#iV̀/N tXw¼M|ȵuXnqg+Y\.Cn隝cJUd>dz;=Z)Ripu);:RWn P}inZV36.ƃm+?3oY$ D8p6-#ew}Zʺ(K LDU|LKp{Gsf.7/p^gAPxxMPo5tpx8U `c8G?J+g7q1L2t_bJ= 쮿 87Dcҿ mV8 ӮģO   '`^9x5B BYo$e/E \}6$P}df19\w>V5P\OpQ=GfU2 'ޭpqgA]`D1 "%t*zH$|^t9#؋H6]{İMw `[žw7FgH5I>j<,w6܍5ۭ*oQZIue֋>`\PJjZBv:15"XN!YؤED! ʜ8rV^E&KAA^-e\3}eP`CNCJ!'kZ"(lE2a0"4"bpP&P+s0V\ }EqlHVl4VrHSM7=;wv.?s[?wpN^ Ad_y 5.#"0{RrJDjJ(4! 1`øetIݛ1ҾGk4_龐,\G 9sz 'b؎ޤ7 .f0{)ע]$j8XYS;[Օ[/5)/\vwjZ HjWq1SP`u{.^E߿a_!5 eZ ̑S 7qܗFǝŸ 瘟#v!A ,y,L bLĈԩ*L!(ÍY5@yUfIב?a,"~=48BJ~??!p]ToGTAn'rkrݭN"CD6cgXCܯVx??| e2t6tY[޷1WN=14:d6F0`Bi&4 # _d6+櫌)'j.VWnP(GoߑVjZ(Щ/$cmnrLm12aZ +2:W{'~ 0[fi҆2_L=& _Q=uTko C:;v;ʜ54J,GnO4;9AjSyl(\ J)y9dE2 ZW =Y~ Aw]xy}diRhpyJBY"||FB3$5r݀Z}:U'2鲣JVrN]a:8O44X|tu:b]Z+^t]P~C[VL KzmY_-BAm۸L!QE.ࣝ96 ]pEsm6cGl1BhJ(}y XS^&ގ8ԾEKAD[i:nLXcf$ D\1W~濔C[8c[o<5p]QiJq]'`;fl)@Q ''RZyX6Yw |4f5"}8 =Q,t*qOit3*bB4_U*4qȏ%ݯWR{ mƣ?K >9.&ܘ|%[tZ#ue֋-\[ryiZV9X ;]1Nb?*fbBf iw}O2 mc t0<qd0q}9o !D~E|z[]xJƱ }WC$kI;p2 )|$wi4鎉\ C-3CJźS?OakټC2n5u4.2}((Ght0Tkbh: ʬ"w+m -ݙSю\pMӪL{3QJcLs:Cܩjj SdT'[H+NQƭ849!­Vè+^dwkߕVjZ cɎb ΦpXT TW1T|Q82E@r&_>Ikլj%=|76SM~bG8ưHDݠgMFJ:,H%C :\j@ `94̽dv[_ W;9 &ξ6xO~oݻ|Dz?'YlDa=buNk0jAd HEWay:9!%_Wb~5FnV0.Oiv B6&2ռ 5!gpy"&e T_{YEsCy>fCps83U T|󙆐 j]ue֋y)Vj>=> 2!•njP.xVtf+Ii6X_3KȈ/S't >Eٔ7Fώ(NMs'(p|]͸P8lJ>$u˛(`Yc855lKdtfHluLGO&`Q(qK =7`C;gj߼}G/gsCzp3_ E~f0wSxsLjg)x> \̳$x<؉E&hЪ_xvqWJkgPCYp2PPnO@N]81L'IZ}H(hbis#7CFøti#`aԕ[/SėHkiZV,`|O8 ,\Q 4Bes!krYu!Ւ[&&WLE Q{ӶVɏl.ylP g[~P NH i~&nBIhrtsVC\%r _ wi2BlpFf[axýu֫Ǥwp>IB P̋U\\8?PURH;v;r00?R3=GiL֏2a~ޑV_P|k_ZVD x&O' vS6 }dQ/Ȓ`IjW:<|y$UZG1"\jq{.ⅡZL j:1Xm)@#ȡ̱ W m p/E ¶Of(^cJBE<0v?Jag;P3 (DŽ\[o' >9;{6RP\K~-v KIЂL<Y ӴYU8_ҥGzs YBI@9~UaK.0E[uJxJ7;*k0z{tld}cs;_8~ Y5?4/x~YhʈۆCAt[g_,nMoV ML)_` u VA&)G`\$#W=5[ևPTLW[WDKu]{ryk׮ZV`,ӵ\%ƺSh4CK͛QI`PaњlZ,3 gIHW Fڝqq)N:p6wō\fWL!t1$2÷*`n (4oʃ Q&*} ?Qyrׯ@>%mNI 1]ob@U1aj5=W)¹V*6X1 pk9} Bi *n:,ɾD)\¹gu;G,`^<+PkCM-a:vgwQq[,6?Zև% l]Ͽ\GZVj}"z&\XEZ9`Lv$HY<_/m}6X67@ zM3c@c4 O;v-sv$w]q=0C > ĭ[2gs cPcmpyNnT˲Z pws,v(J&cO9h'Y46^͜IVVɓ'+^0m% jZVc׵gmWD0p0}N:dԒ4I8ԋ@(Ymp >&@ؠJګIE<'GИ!47*\Dr Y-n5CY{ "#${\M>@AJ'FpLXT`'&rYn8վ˯ /=`܎ 7̕ c}]Qk@t~[ݚ0 ܉425@L}F2oe?݋Eh g LoNh7FBCusjXU>qIMV1=ęƧl׵ ^@0_Akv/*\>Z_B_K5Os 90K1ޑX_(uuowk ^uX.&w ܭzTW%+r7>όVʎ,"X?!!Ŷ*WDög~ޝS^[_(g >dL[*X02K㦙 DsZjaTd\:S$qmÁEoz}^es n*ȳiVsk `7nNߣsy[Pߜ6/I|CE+(gi8|Mk{y4>Lʤ!+J+TZ -4d5Mo4n@,@yU:OjZVjZWOL.#+٦M<7Υ^@t  Jp.wYh5jO=%\bte` բq)h'lwDթcƥܠtv 9#(A,Mxtٸ%ۇDQ޻/=+a<]=yU,dĠYؖosa#>&P9Ub!%Yjxb$$c7AZy!IcZ3U&sy'CAJ~@X:[똄{|LY=l ا(GdՏroZVjZ֕ԳΌY bZ7W Rx&KK`'У6Wg^Ʈ$j#$ E:*'(  |okUO?Z}`yqŢ#:'OȼKfז(:d3+wEl`@~%F̆\~-O<}@ )@0]564:jcT;͈jsTW tWOo߼qRW! _R8Top,.2I/Vg=t*s}9Y1.bmEq'xn'n*-Ecr8f;C܃VtA/IbrFjYQj itc3,3GO?npr3ƇEnM=YO?ZVjZVR9%9?'o{aё^Rp*vF;l$F9}8.9^PV 4].smXq\Ma!_:/2ZBa,iZX jZVjZ ޤpnL5@r? PXhʳf 7A@^IKL>l6s2=72ʦcIssIdK,0`1^kFl:jUgKfwssQl<+NBzNa$J06Ch;^%ҘDfunZVjZyB)~ 0ŽJp]><5H\ U6 {wjZVjZWQϑP!#ycX{gQʡR-d.f:pl<:Sg5g&t\$j/j !hAaXᰊk௡| n2[Ɛ+**yHQi/# zFƗ@0.6Hg>$Gp&yS^_K]+!J𖝅SY<&e$o1˜9:#6N ^3h MeUqfxVJmCD *xAU?*SY+٨3MxʶZVjZVe 'Jb`+)+7V\Np@Klzm6LcC_tW+;U7?#PJѼ/P&9GqM(mCSܟxV@~SOVjZVjzv@%$sRL!&xF<)zM}hr&`'&'N4fuH9X;+ru&gK ' D9)Y#.45w2D1#V4C% sK$c[v/-y͇=}K (,? Lw>N &et*6F)>rg1 ܊,p =D2sbqՉeV -8 J.2iEgfuhG022:(Tz{T‰k T,Xn^@%_ pY{_raX&k Z*l1   wj9 |ƐkBz@.6D`0LHĜ]{R{8C%:ĉP$/ h-q6BYC\$ D?$ w+@)`fpZVjZV3J NJ(/W& %;uӟvQI< AGAm.$Y2mH}LȹXPPCGLCM'z e芠]&"~%€mq4(4-%n#[~񮴎C?  *aR235Bg aa5aw_&[}y (RDa@ Ge̪2ʊ>XsíǢ'E*ݤц_}tN5@Shw?'VjZVպz0hIJOZ@jevWǟOMOn Z*ܥc{dzf (_lQ7~̓J>Xh$ A9)p6lxj=8\EpVܿꟻ+ C>}xἚ<{3BZ PVY$A +([މфf~t{0vnM-VYshգҼ8soo16jS> dVjZVպz6a;Bkφ5ByɪX.zzb)TcȀjNϏCmzgPh fm)[{cpq뚠P̋: K4^$;~·Qp-hq~!_;z޹y}=Q]uKYF HWA"cOḷ߮?HHMO %8SfD QT7SB1Ԏey# hDl0fJt<'_z>G眫9v3:hl6<#x+9sVjZVj]i=W@[x"M3 ɇ G +ɵⅯN;e F&'G]؝rfm"ʩVp%Ufs$0Hv D8%XHB9#'U#y[vpkgWߕs! gNK 0kM[`}(q |\NC6/Q儎30qI֗>udj[N1WOs d/T,t]? GÃ4l~% ^>q#^ݳ 9չEts~k>Ce!Ryr [vUHϠ;2Գ.jZVjZWQQE!TaSʐq}96`J@v!!M{l!5CjZVj蕀 R?_JҦ8Th7cgvjg%7qR~ wAk> %OpBO8YFA 76Ǫs!daVjF Qv\[zn?}Wϥci[+n\c]Z4̐uwYRr+FyL5Wt-u] L˾qCI ֽ}v/T٫dǑ~7] ) ?݁Ch.r :c|V@:N]ׁ#1xiګZVjZV*9r`(?)HK6ůeMft >Vrԏ pC@Đ]EMgu֭[kQSRq09J_p>*+S|ls@[lS1N]gjr[޼uGsNBR5Wm- P]R4Wvw4WPSH~a ˧Yw8hq|pX!L0Vt: =Lmf1VπKͧ-R@.yn|ՂP ?^<ljVjZVjz`rqEL/TCg7c`8þ|dU!ܞ6m3iH F0JgC#H7 .b|Jzk#pzDye8)5&Y9[-Z: ٛߕG.@ri$ٳKrig6kIP/e{%j ՚{$ \- &x yvk f:cK1 WZ|e7y6Sx A\6:x8;0都"cYnszZVjZVֳC)x"X-uթi$|j15 ;`^L촃6NL% )0_R߆4i_H?LDNk@X,C=kqkSnMĚ1b]Hb PyV.< gdKX ebog=G^8c`rFK1 [9 VWv+D1״@% _$2 w~>\ϧjhp}!I|谽tVjZVպzv1, U- 5 W JrUic&c`jGNNPB:@_/<: Dm=Z4^P"I38@p[1d+x_Ff7 FBf뷾@ZϿ;Ely i@Rir3OF_M/n|sa*Z3 UD )TQ N…8<$7QPsh$7A!ʝ$k~&gnv=3(J(Um>d\e 3k2 ;zžhx'2r(iX0 &\>'燫 =@ 1GM+ e8$़VjZVjz:|"͸>!Ͱ*KC{_gtbzʻA'4ߵv܈G-Gh츶qJLdTsrM i.A}%o.#k:ߑ֧~]hBF_jij>=j7^[,=7 ciRhz9U.#@J %˫7Q`<'ͱ]-0G usO"O*~ϱ o܌]woVHuc ǝ$+.G &Vqwf;#pbt"JsrJ}qϙCCA3<Ɔ뢹?1ɉVjZVztx&;ф%m7rnDbKQ%(]˟v Mξ@S\Q `5Qcڙ0"IV'-@[(H8ϨOpe E/WneK^F`{^PCn~ؖ|W|.Xbߊ{5p$'`ʹ9K1NTȍ, i܃B/OrG` lE%h2LBA0+c+&hC/}|IH1Ǣo $Z,J3Gi)ڦqJqirÍZVjZV*BD"8^PjJ~뒙I>~: }ԉU/aSdKviڜUl<_;V;Uޟ Dq[9fE< ~ۘ1E_šDSF ݼ6vւpPffЄ0R:wKvNjI˃"29$65v>o޸PZB'{N я4!2Ce -Di65Z>Wݭ yJ\P b|*3&n+V#) 1aR9̫K[cyۣ[ .ɭrpw}φyhL04HS"=l)Lw~L<*Zc"6hP0Qˊj~xpCV&†XCMOx -.ѓ"{Ws2uh\tNjZVj]$ZYo*gբցł6\0=hDN|<}Xc;h ڳ2df3Lu"Tzގ dJ.ڇ\Mr kۭp@qE||$v<$hѣF01Fhى6jUb ^FP j3*U޿9|ะ;Q~;r }r?&oHL2 W"T~LM)9_eHEW~:ԗy |ZVjZV*ǿy>^n֎A!%JS*/4od Lyة }nidv&gGM85CAIiwj#m@ | LwD /w*wI#8V?,;S)jK$Ra}~/_ R[8<{+`0e:dgQ4Äsi!l䒋J44'jUq y_,pLtiT Gk]Sػdz((t cCyD~,ZSQ6c¢ggx6lR"|Ȑh,N#HN; Gocqۅ"ϰq=$rdj6\H&C {oPyjoߑK r7P~;+Ry랯} YC0f1a _ք{N%k[ n9 Rf?Vxქw+rH@DCk|bXTG>0*F]Abņ/9²q9zzZVjZV ޯ>qXޑ-,X*NJN(SX&MBĝygωm:,ANAEORꟂ'\xlnҸ4AT '7zX5+2l0#zޖ֕/S]*'9DN!TwP+g*܂[#⩠?iA>< HA5۫M(ogt9sFcLJegYcYhmKjZVj^B}(-,{E @U\TXZ=B#F.@8)f_rٰ6(8fFom8,gU^9qjk @(ݜUF:nJۮz/+h򽜟ZX 9T-BQv,ɐU&@-o'KP.MZuμxKr[f 3yRs^nxCQb wK9UT-1I6] pjZVj]EHp{w>@$4ZpEl wq1 /< }׈Rcx/Hrt{ʕWR@6 J~IkqwJ%y%1EC|8%崄8]JǿlvᣳjZVjZ/~d̤Ʒ3m08[zHqsip \tWGc) ؘu1}ꍊ5R`.sMa-ũxSb"fݭk{ -.c%ckxol7 i;W|uC["6-*6rdIO+Z;RYey˧U|`Rz#,é;$q<*6W33`,OZVjZVzOyjDsX/W+RYfR/ XH9z:'<&nun 1"";W'I"`xCg h2F -hyVȑ&qKO8#h ?( L,, g^TF@I3YV̪N4͂z;?b2\wRM‚vZ+Ǥ|uz8vOorIj2tQ h;lg7?Vzp hHZܫ}'v>@Ozia*Z8Gy{c"5]e۵TXZ9 `)ʈb.&8.> uzOOCâmnx@3$XW@"z4x?@AͰjΔ^x~n7GK~{+\)Jt ebz~Z(#hYD fυö'V7(^gJ/`:й'z0mrsɿsw!pS`vpjZVj]E}"p{wko-Y-X'`kv5ӊ]r\p`p 1V14Gs_%DZ=cpɼZ]% PoO]iS[N N5\9gm*[HP&Ygj>KO5X*.H7Q}j0Ѥ1 pocY 'ڃP(9\6M $D.R#0jZVjZ_jފlՂ2 3/tAS].Jdvd;+x8u'\ٔCE!ѳ%ѧbM>m2ᔴN.6矼/߸uZRp}Nz"M3T FW૞\J\?6hk>B !"LN."9t*5|`/x!:><!V $QC an@[ !,@aoz*Y]XԩH'R0~AL@ wFZ_EGPCb[G@$U(TGq n`k]{;3jÒzgM8?Vjg9VjZVj]=};y/OKwZgcQVi*9'r̝":}QרC{eAѪ[O؇LN(¥Y\D $\_@ZHK7 0*rE! S !{-/\n | (%rT*pũ0J;6lz/QTR95 =r_ݾ^ pjZVj]Ez7׳W vűv+h&0<Үíz鲌Hq7VM P@+"Cw~+_|GZXzp>,nn>)H^Ú2m/m< 2s魳QUrXȡMCsr)|jZVjZWR/޻-,#M*/{*hqa ѣ2crtsSyOCLjMKHCIJJA_#Ǭ;@@!`5{&as<a6Ϋ}4C&zt h=i>!ٛ!|g@ UCZYy]r9 "h_UpQq r p MgbN?G{N`BGFv&$#1 i=ZVjZV67V-X/7.|3P N‡/|Wcg\;[~,QtC -9d7|^}wg7k}=/vRA #W†P`-[5s7mo2??BsU#Ofgh[YP8 d>կǣmW.|كqXAZVjZ֕ԥ{wg7mY:eӐ;"qWV/|3B'b@eu(~ 5O'%BbU# 7*kA# v%\ 13#/뭎+iӯWw* D~HXCr8X DupjZVj]I]*=O-7m]hqp0/dV .,'xmS"ncsg`@[t*~;3H)khl5cr o:IsBi;8g$O7]VP_WA7=PIX-tn8.%b_&+{Q f( [iZVjZK wч~㕻z ;'"!aL{7::;2IAMXkI @'*BakHh+ < +- `]ʋ Э+M CBzxX] VI!a;"紴jZVj^:;‚ux{uBPT#** D3K@7\;pPoQ(X܊ ZD|w{{cb.6tl"W/+0Gy%L>qxVj}/U*#"wGv_urHph߇K;ZP[ pU_ce o 6~ʖޭHo{2 ˘6 ;1**ExƔ18D} @gLEVjZVj]z7^<^~<Z<Ƀf-_Ӌ_;(_kX/rŗ2n &Bip ZV xyTS'փn/mض BeWn>V!otz_z_!R2ѭ`$ȿ84*|"B| >ևsZVjZUԕ޻U >ʣ'pX}fHե(?״i__T~7&WVxADzHu5:c[/y;N,04eY5Fh;+p|\ I0+"Kh" `+2IB3Ov-ؕ}Q]B@sZVjZUԕП̃Za}簤>7K's[%J WoD r6n8,H36)E" _Z/'H. eɐ` HZЯ\+kZxxo9lC'E7{BUCqnu|ӡʉ4'i'`;[VjZVj@o_{XpTՕ"/#ڈ\awJ3Zxu>nuW"q ʠ8`hMK}gߗV%q0E.24֌0zMD7Jy=3fPv/ rI7gLgbtamd8J(CʏyI?z"!\ޝvZVjZ֕ԕm@=Ǣ:\>Z"XR.[_Upίe_Z9+_}i^Bp`Y D`y\oE\( !ǛNa\#Q*sȭݫa2% dY'/n_igk@ʉtP,CXN[..6zz*;[{ƛB x OU8n~k W#{ϘDOZ)/!HV(n`jZVj]M51/ PIOdpnk˲;|nd`ϥjC@};?@q ìSΉ(ƁY; wJ<wwܭCl!,9*LkE$U7)C,X*VjZVպjcj ٝe=,pBOvÿV #l 2'^rjB\@^w;S\ꛦjQ;m_D~ZVjZT?"!,Xl6+p[r-DP>O>XZFp^>@m5NG.: hvf%J!" A[%"t K p. " g[i7I dȲ^vZVjZTXpނ\U PV ZVjZVʩǨ?~}%s|ʵuoj~, APOeaq Urg <}p&Cξ,:PIݎhF|fp*Fq )ZVjZVO@}}}l[aWKHAk7ձt{T6"*b=~x/:ط_2i uN)A!WVjZVպ'}o}?k߅q5,z۝I% D*ol5j43]>W:~}BɲpxCZmm?> instead. If you want to file a bug, please provide all the necessary info listed in our issue reporting template (it's loaded automatically when you create a new GitHub issue). == Patches Patches in any form are always welcome! GitHub pull requests are even better! :-) Before submitting a patch or a pull request make sure all tests are passing and that your patch is in line with the link:https://github.com/nrepl/nrepl/blob/master/.github/CONTRIBUTING.md[contribution guidelines]. == Documentation Good documentation is just as important as good code. Consider improving and extending this manual. === Working on the Manual The manual is generated from the asciidoc files in the link:https://github.com/nrepl/nrepl/tree/master/doc[doc] folder of nREPL's GitHub repo and is published to https://nrepl.org. link:https://antora.org[Antora] is used to convert the manual into HTML. The filesystem layout is described at https://docs.antora.org/antora/1.1/component-structure/ To make changes to the manual you simply have to change the files under `doc`. The manual will be regenerated manually periodically. You can build the documentation locally from the link:https://github.com/nrepl/nrepl.org[nrepl.org] repo. [source,shell] ---- $ cd nREPL.org $ npm install $ ./antora site.yml ---- TIP: If `npm install` fails, see link:https://docs.antora.org/antora/1.1/install/troubleshoot-nodegit/[Antora's troubleshooting documentation]. If you want to make changes to the manual's page structure you'll have to edit link:https://github.com/nrepl/nrepl/blob/master/doc/modules/ROOT/nav.adoc[nav.adoc]. == Funding While nREPL is free software and will always be, the project would benefit immensely from some funding. Raising a monthly budget of a couple of thousand dollars would make it possible to pay people to work on certain complex features, fund other development related stuff (e.g. hardware, conference trips) and so on. Raising a monthly budget of over $5000 would open the possibility of someone working full-time on the project which would speed up the pace of development significantly. We welcome both individual and corporate sponsors! We also offer a wide array of funding channels to account for your preferences (although currently link:https://opencollective.com/nrepl[Open Collective] is our preferred funding platform). If you're working in a company that's making significant use of nREPL we'd appreciate it if you suggest to your company to become a nREPL sponsor. You can support the development of nREPL, CIDER, link:https://github.com/clojure-emacs/clojure-mode[clojure-mode] and link:https://github.com/clojure-emacs/inf-clojure[inf-clojure] via link:https://opencollective.com/nrepl[Open Collective], link:https://www.patreon.com/bbatsov[Patreon], link:https://liberapay.com/bbatsov/donate[Liberapay] and link:https://www.paypal.me/bbatsov[PayPal]. === Open Collective * [link:https://opencollective.com/nrepl#backer[Become a backer]] (for individuals) * [link:https://opencollective.com/nrepl#sponsor[Become a sponsor]] (for companies) nrepl-0.6.0/doc/modules/ROOT/pages/about/history.adoc000066400000000000000000000036151342636505500224150ustar00rootroot00000000000000= History == There and Back Again nREPL has had an unusual history, which seems worthwhile documenting here. nREPL started as a personal project of mine @ https://github.com/cemerick/nREPL in 2010. After an initial period of interest from various downstream tool authors, it was invited to be one of the initial three projects in the "new" Clojure Contrib family of projects later that year, and thus moved to https://github.com/clojure/tools.nrepl. nREPL grew and stabilized under the Contrib umbrella for years. Various collaboration and process challenges, differences of opinion, and changing work priorities eventually led to work on nREPL slowing significantly, to the frustration of its most active users. Eventually, I proposed migrating nREPL out of Clojure Contrib in the summer of 2017 (https://github.com/nrepl/nrepl/issues/1), with the objective of reconstituting an environment where the people most interested in and impacted by nREPL could participate in its development as easily as possible. Cheers, + Chas ''' == To Infinity and Beyond In the spring of 2018 Chas decided to hand over the development of nREPL (and key middleware like `piggieback` and `drawbridge`) to the team behind CIDER and the efforts to build awesome Clojure dev tools powered by editor-independent nREPL middleware (e.g. `cider-nrepl`, `refactor-nrepl`). Important milestones achieved afterwards were the release of the transitional release nREPL 0.3, which simply changed the deployment coordinates to `nrepl/nrepl`, but is otherwise identical to `tools.nrepl` 0.2.3, and the subsequent release of nREPL 0.4 which switched the namespaces of the project to `nrepl.*` and started delivering on the promise to fix long-standing problems. We're really excited to advance nREPL forward and to build many sweet REPLs on top of it! Looking forward to seeing you around! We need all the help we can get! Cheers, + Bozhidar (a.k.a. Bug) nrepl-0.6.0/doc/modules/ROOT/pages/about/license.adoc000066400000000000000000000001731342636505500223320ustar00rootroot00000000000000Copyright © 2010 - 2018 Chas Emerick, Bozhidar Batsov and contributors. Licensed under the EPL. (See the file epl.html.) nrepl-0.6.0/doc/modules/ROOT/pages/about/release_policy.adoc000066400000000000000000000022451342636505500237110ustar00rootroot00000000000000= Release Policy We're following link:http://semver.org/[SemVer].footnote:[As much as one can be following it when the major version is 0.] At this point bumps of the minor (second) version number are considered feature releases and always include new features or significant changes to existing features. API compatibility will almost never be broken.footnote:[Unless explicitly stated via deprecation warnings for a few releases beforehand.] The development cycle for the next feature release starts immediately after the previous one has been shipped. Bugfix/point releases (if any) address only serious bugs and never contain new features. Here are a few examples: * 0.5.0 - Feature release * 0.5.1 - Bug-fix release * 0.5.2 - Bug-fix release * 0.6.0 - Feature release NOTE: Historically this wasn't always the case. Versions 0.2, 0.3 and 0.4 introduced major backward-incompatible changes. Back then point releases (e.g. 0.4.2) could mean either bug-fixes or new backwards-compatible functionality. That changed with nREPL 0.5 for the sake of making it obvious which releases add new functionality and which simply patch bugs. That brings up one step closer to the SemVer ideal. nrepl-0.6.0/doc/modules/ROOT/pages/about/support.adoc000066400000000000000000000020061342636505500224210ustar00rootroot00000000000000= Support nREPL currently has several official & unofficial support channels. For questions, suggestions and support refer to one of them. Please, don't use the support channels to report issues, as this makes them harder to track. == Freenode We've got an unofficial Freenode channel - `#nrepl`. It's not actively monitored by the nREPL maintainers themselves, but still you can get support from other nREPL users there. == Slack We've got an official link:https://clojurians.slack.com/[Clojurians Slack] - `#nrepl`. This is usually be best way to get a handle on some of the maintainers and interact with other nREPL users. There's also another channel named `#cider`, where often people are discussing nREPL-related topics, as nREPL is the foundation of CIDER. == Stackoverflow We're also encouraging users to ask nREPL-related questions on StackOverflow. When doing so you should use the link:http://stackoverflow.com/questions/tagged/nrepl[nrepl] tag (ideally combined with the tags `clojure` or `clojurescript`). nrepl-0.6.0/doc/modules/ROOT/pages/about/team.adoc000066400000000000000000000017011342636505500216340ustar00rootroot00000000000000= Team == The Core Team The direction of the project is being stewarded by the nREPL core team. This group of long-term contributors manages releases, evaluates pull-requests, and does a lot of the groundwork on major new features. * link:https://github.com/bbatsov[Bozhidar Batsov] (maintainer) * link:https://github.com/SevereOverfl0w[Dominic Monroe] * link:https://github.com/arrdem[Reid McKenzie] * link:https://github.com/cgrand[Christophe Grand] == CIDER Alumni In addition, we'd like to extend a special thanks the following retired nREPL core team members. Lovingly known as The Alumni: * link:https://github.com/cemerick[Chas Emerick] (author) == Thanks Thanks to the following Clojure masters for their helpful feedback during the initial design phases of nREPL: * Justin Balthrop * Meikel Brandmeyer * Hugo Duncan * Christophe Grand * Anthony Grimes * Phil Hagelberg * Rich Hickey * Chris Houser * Colin Jones * Laurent Petit * Eric Thorsen nrepl-0.6.0/doc/modules/ROOT/pages/additional_resources.adoc000066400000000000000000000015161342636505500240020ustar00rootroot00000000000000= Additional resources == Articles * link:https://lambdaisland.com/guides/clojure-repls/clojure-repls[Clojure REPLs]: A good overview of the various Clojure REPLs. It features a nice link:https://lambdaisland.com/guides/clojure-repls/clojure-repls#org8a9b873[section on nREPL]. * link:https://juxt.pro/blog/posts/nrepl.html[Overview of nREPL] * link:https://metaredux.com/posts/2018/10/21/nrepls-secret-tty-transport.html[nREPL's hidden TTY transport] * link:https://metaredux.com/posts/2018/10/29/nrepl-redux.html[nREPL Redux] == Presentations * link:https://www.youtube.com/watch?v=4X-1fJm25Ww&list=PLZdCLR02grLoc322bYirANEso3mmzvCiI&index=6[The Evolution of the Emacs tooling for Clojure] - presented at Clojure/conj 2014; dedicated to the origin and the architecture of CIDER and related tooling. The talk features nREPL prominently. nrepl-0.6.0/doc/modules/ROOT/pages/beyond_clojure.adoc000066400000000000000000000033711342636505500226040ustar00rootroot00000000000000= Beyond Clojure As mentioned earlier the nREPL protocol is language-agnostic and can be leveraged for many languages that have the ability to evaluate code at runtime. == Alternative Server Implementations Those server implementations are developed and maintained by third-parties (as opposed to nREPL's team), and their maturity might vary. NOTE: Certain nREPL clients may make Clojure-specific assumptions which will cause bugs when used with other servers, while other clients are designed with language-agnosticism in mind. Usually the nREPL servers would mention in their documentation which clients are known to work well with them. * link:https://github.com/Foxboron/HyREPL[HyREPL] - an nREPL for the link:http://hylang.org/[Hy programming language] * link:https://gitlab.com/technomancy/jeejah[JeeJah] - an nREPL server for link:https://fennel-lang.org/[Fennel] and link:https://www.lua.org/[Lua] * link:https://gitlab.com/technomancy/ogion[Ogion] - an nREPL server for link:https://racket-lang.org/[Racket] * link:http://wiki.call-cc.org/eggref/5/nrepl[Chicken NREPL] - an nREPL server for link:https://call-cc.org/[Chicken Scheme] * link:https://github.com/sjl/cl-nrepl[cl-nrepl] - an nREPL server for Common Lisp * link:https://github.com/bodil/cljs-noderepl[cljs-noderepl] - an nREPL server for ClojureScript running on Node.js * link:https://github.com/vspinu/R-nREPL[R-nREPL] - an nREPL server for R * link:https://github.com/clojure/clr.tools.nrepl[nREPL CLR] - an nREPL server for ClojureCLR * link:https://github.com/arcadia-unity/Arcadia/blob/master/Editor/NRepl.cs[Arcadia nREPL] - an nREPL server implemented in C# for Arcadia. As you can see nREPL has implementations for many popular Lisp dialects, but it's certainly not limited to Lisp dialects. nrepl-0.6.0/doc/modules/ROOT/pages/design/000077500000000000000000000000001342636505500202165ustar00rootroot00000000000000nrepl-0.6.0/doc/modules/ROOT/pages/design/handlers.adoc000066400000000000000000000055431342636505500226550ustar00rootroot00000000000000= Handlers _Handlers_ are functions that accept a single incoming message as an argument. An nREPL server is started with a single handler function, which will be used to process messages for the lifetime of the server. Note that handler return values are _ignored_; results of performing operations should be sent back to the client via the transport in use (which will be explained shortly). This may seem peculiar, but is motivated by two factors: * Many operations — including something as simple as code evaluation — is fundamentally asynchronous with respect to the nREPL server * Many operations can produce multiple results (e.g. evaluating a snippet of code like `"(+ 1 2) (def a 6)"`). Thus, messages provided to nREPL handlers are guaranteed to contain a `:transport` entry containing the <> that should be used to send all responses precipitated by a given message. (This slot is added by the nREPL server itself, thus, if a client sends any message containing a `"transport"` entry, it will be bashed out by the `Transport` that was the source of the message.) Further, all messages provided to nREPL handlers have keyword keys (as per `clojure.walk/keywordize-keys`). Depending on its `:op`, a message might be required to contain other slots, and might optionally contain others. It is generally the case that request messages should contain a globally-unique `:id`. Every request must provoke at least one and potentially many response messages, each of which should contain an `:id` slot echoing that of the provoking request. Once a handler has completely processed a message, a response containing a `:status` of `:done` must be sent. Some operations necessitate that additional responses related to the processing of a request are sent after a `:done` `:status` is reported (e.g. delivering content written to `*out*` by evaluated code that started a `future`). Other statuses are possible, depending upon the semantics of the `:op` being handled; in particular, if the message is malformed or incomplete for a particular `:op`, then a response with an `:error` `:status` should be sent, potentially with additional information about the nature of the problem. It is possible for an nREPL server to send messages to a client that are not a direct response to a request (e.g. streaming content written to `System/out` might be started/stopped by requests, but messages containing such content can't be considered responses to those requests). If the handler being used by an nREPL server does not recognize or cannot perform the operation indicated by a request message's `:op`, then it should respond with a message containing a `:status` of `"unknown-op"`. It is currently the case that the handler provided as the `:handler` to `nrepl.server/start-server` is generally built up as a result of composing multiple pieces of middleware. nrepl-0.6.0/doc/modules/ROOT/pages/design/middleware.adoc000066400000000000000000000342611342636505500231710ustar00rootroot00000000000000= Middleware _Middleware_ are higher-order functions that accept a handler and return a new handler that may compose additional functionality onto or around the original. For example, some middleware that handles a hypothetical `"time?"` `:op` by replying with the local time on the server: [source,clojure] ---- (require '[nrepl.misc :refer (response-for)] '[nrepl.transport :as t]) (defn current-time [h] (fn [{:keys [op transport] :as msg}] (if (= "time?" op) (t/send transport (response-for msg :status :done :time (System/currentTimeMillis))) (h msg)))) ---- A little silly, but this pattern should be familiar to you if you have implemented Ring middleware before. Nearly all of the same patterns and expectations associated with Ring middleware should be applicable to nREPL middleware. All of nREPL's provided default functionality is implemented in terms of middleware, even foundational bits like session and eval support. This default middleware "stack" aims to match and exceed the functionality offered by the standard Clojure REPL, and is available at `nrepl.server/default-middlewares`. Concretely, it consists of a number of middleware functions' vars that are implicitly merged with any user-specified middleware provided to `nrepl.server/default-handler`. To understand how that implicit merge works, we'll first need to talk about middleware "descriptors". link:https://github.com/nrepl/nrepl/wiki/Extensions[Other nREPL middlewares are provided by the community]. (See <> for details as to the operations implemented by nREPL's default middleware stack, what each operation expects in request messages, and what they emit for responses.) == Middleware descriptors and nREPL server configuration It is generally the case that most users of nREPL will expect some minimal REPL functionality to always be available: evaluation (and the ability to interrupt evaluations), sessions, file loading, and so on. However, as with all middleware, the order in which nREPL middleware is applied to a base handler is significant; e.g., the session middleware's handler must look up a user's session and add it to the message map before delegating to the handler it wraps (so that e.g. evaluation middleware can use that session data to stand up the user's dynamic evaluation context). If middleware were "just" functions, then any customization of an nREPL middleware stack would need to explicitly repeat all of the defaults, except for the edge cases where middleware is to be appended or prepended to the default stack. To eliminate this tedium, the vars holding nREPL middleware functions may have a descriptor applied to them to specify certain constraints in how that middleware is applied. For example, the descriptor for the `nrepl.middleware.session/add-stdin` middleware is set thusly: [source,clojure] ---- (set-descriptor! #'add-stdin {:requires #{#'session} :expects #{"eval"} :handles {"stdin" {:doc "Add content from the value of \"stdin\" to *in* in the current session." :requires {"stdin" "Content to add to *in*."} :optional {} :returns {"status" "A status of \"need-input\" will be sent if a session's *in* requires content in order to satisfy an attempted read operation."}}}}) ---- Middleware descriptors are implemented as a map in var metadata under a `:nrepl.middleware/descriptor` key. Each descriptor can contain any of three entries: * `:requires`, a set containing strings or vars identifying other middleware that must be applied at a higher level than the middleware being described. Var references indicate an implementation detail dependency; string values indicate a dependency on _any_ middleware that handles the specified `:op`. * `:expects`, the same as `:requires`, except the referenced middleware must exist in the final stack at a lower level than the middleware being described. TIP: Another way to think of `:expects` and `:requires` would be _before_ and _after_. Middleware you're expecting should have already been applied by the time the middleware that expects it gets applied, and middleware that's required should be applied afterwards. We'll expand on this in the paragraphs to come. * `:handles`, a map that documents the operations implemented by the middleware. Each entry in this map must have as its key the string value of the handled `:op` and a value that contains any of four entries: ** `:doc`, a human-readable docstring for the middleware ** `:requires`, a map of slots that the handled operation must find in request messages with the indicated `:op` ** `:optional`, a map of slots that the handled operation may utilize from the request messages with the indicated `:op` ** `:returns`, a map of slots that may be found in messages sent in response to handling the indicated `:op` The values in the `:handles` map are used to support the `"describe"` operation, which provides "a machine- and human-readable directory and documentation for the operations supported by an nREPL endpoint" (see `nrepl.impl.docs/generate-ops-info` and the results of `lein with-profile +maint run nrepl.impl.docs` <>). TIP: There's also `lein with-profile +maint run nrepl.impl.docs --output md` if you'd like to generate an ops listing in Markdown format. The `:requires` and `:expects` entries control the order in which middleware is applied to a base handler. In the `add-stdin` example above, that middleware will be applied after any middleware that handles the `"eval"` operation, but before the `nrepl.middleware.session/session` middleware. In the case of `add-stdin`, this ensures that incoming messages hit the session middleware (thus ensuring that the user's dynamic scope — including `*in*` — has been added to the message) before the `add-stdin`'s handler sees them, so that it may append the provided `stdin` content to the buffer underlying `*in*`. Additionally, `add-stdin` must be "above" any `eval` middleware, as it takes responsibility for calling `clojure.main/skip-if-eol` on `*in*` prior to each evaluation (in order to ensure functional parity with Clojure's default stream-based REPL implementation). The specific contents of a middleware's descriptor depends entirely on its objectives: which operations it is to implement/define, how it is to modify incoming request messages, and which higher- and lower-level middlewares are to aid in accomplishing its aims. nREPL uses the dependency information in descriptors in order to produce a linearization of a set of middleware; this linearization is exposed by `nrepl.middleware/linearize-middleware-stack`, which is implicitly used by `nrepl.server/default-handler` to combine the default stack of middleware with any additional provided middleware vars. The primary contribution of `default-handler` is to use `nrepl.server/unknown-op` as the base handler; this ensures that unhandled messages will always produce a response message with an `:unknown-op` `:status`. Any handlers otherwise created (e.g. via direct usage of `linearize-middleware-stack` to obtain a ordered sequence of middleware vars) should do the same, or use a similar alternative base handler. == Sessions There are two types of sessions: ephemeral sessions and long-lived sessions (or registered sessions). When a message arrives without a session id, an ephemeral session is created and assigned to it. Ephemeral sessions are bound to the processing of a single message. The only way to create a long-lived session is to clone an existing session (even an ephemeral one). Cloning a session creates a new session that initially shares the link:https://clojure.org/reference/vars[dynamic bindings] of the original session. Sessions (long-lived ones since they are the useful ones) serialize evaluations and make dynamic bindings available for inspection to other ops. All other ops have no serialization guarantee (they are serialized in the current implementation since they run on the server IO thread). However evals run on a dedicated thread so a running eval can't block another op. Sessions become even more useful when different nREPL extensions start taking advantage of them. link:https://github.com/gfredericks/debug-repl/[debug-repl] uses sessions to store information about the current breakpoint, allowing debugging of two things separately. link:https://github.com/nrepl/piggieback[piggieback] uses sessions to allow host a ClojureScript REPL alongside an existing Clojure one. == Pretty Printing NOTE: Pretty printing support was added in nREPL 0.5 and the API is still considered experimental. nREPL includes a `print` middleware to print the results of evaluated forms as strings for returning to the client. This enables using libraries like link:https://github.com/greglook/puget[puget] to pretty print the evaluation results automatically. The middleware options may be provided in either requests or responses (the former taking precedence over the latter if any options are specified in both). The following options are supported: * `:nrepl.middleware.print/print`: a fully-qualified symbol naming a var whose function to use for printing. Defaults to the equivalent of `clojure.core/pr`. ** The var must point to a function of three arguments: *** `value`: the value to print. *** `writer`: the `java.io.Writer` to print on. *** `options`: a (possibly nil) map of options. ** Note well that the printing function is expected to not interact with `\*out*` or `\*err*` at all, even rebinding them (e.g. via `with-out-str`). Output may be printed to either of those streams during its operation – consider the following example: + [source,clojure] ---- (->> [1 2 3] (map (fn [n] (println n) n))) ---- ** The result of the expression is `(1 2 3)`, and evaluating it will result in each of the three numbers being printed to `\*out*`. However, because `map` is lazy, the calls to `println` will be interleaved with the operation of the printer function. Hence if the printer function is coupled to `\*out*`, its output might be interleaved with that of the calls to `println`. *** Technically, `map` is not fully lazy – it returns a chunked sequence – but the principle still applies. ** Further, note that `clojure.pprint/pprint` rebinds `\*out*` internally (even when using its explicit `writer` arity). It is not possible to prevent the interleaving of output when using `clojure.pprint`. * `:nrepl.middleware.print/options`: a map of options to pass to the printing function. Defaults to `nil`. * `:nrepl.middleware.print/stream?`: if logical true, the result of printing each value will be streamed to the client over one or more messages. Defaults to false. * `:nrepl.middleware.print/buffer-size`: size of the buffer to use when streaming results. Defaults to 1024. ** Note that this only represents an upper bound on the number of bytes per message – the printing function may also call `flush` on `writer`, which will result in a response being sent immediately. * `:nrepl.middleware.print/quota`: a hard limit on the number of bytes printed for each value. ** A status of `:nrepl.middleware.print/truncated` will be returned by the middleware if the quota is exceeded. In streamed mode, this will be conveyed as a discrete response after the final printing result. Otherwise, it will be added to the status of the response, and additionally the response will include `:nrepl.middleware.print/truncated-keys`, indicating which keys in the response were truncated. * `:nrepl.middleware.print/keys`: a seq of the keys in the response whose values should be printed. Defaults to `[:value]` for `eval` and `load-file` responses. [source,clojure] ---- {:op :eval :code "(+ 1 1)" :nrepl.middleware.print/print 'my.custom/print-value :nrepl.middleware.print/options {:print-width 120} :nrepl.middleware.print/stream? true :nrepl.middleware.print/buffer-size 1024 :nrepl.middleware.print/quota 8096} ---- The functionality of the `print` middleware is reusable by other middlewares. If a middleware descriptor's `:requires` set contains `#'nrepl.middleware.print/wrap-print`, then it can expect: * Any responses it returns will have its values printed according to the above options, as provided in the request and/or response. ** For example, to ensure that `:value` is printed, responses from the `eval` middleware look like this: + [source,clojure] ---- {:ns "user" :value '(1 2 3) :nrepl.middleware.print/keys #{:value}} ---- * Any requests it handles will contain the key `:nrepl.middleware.print/print-fn`, whose value is a function that calls the given printer function with the given options – i.e. its signature is `[value writer]`. == Evaluation Errors nREPL includes a `caught` middleware which provides a configurable hook for any `java.lang.Throwable` that should be conveyed interactively (generally by printing to `\*err*`). Like the `print` middleware, any options may be provided in either requests or responses (the former taking precedence over the latter if any options are specified in both). The following options are supported: * `:nrepl.middleware.caught/caught`: a fully-qualified symbol naming a var whose function to use to convey interactive errors. Must point to a function that takes a `java.lang.Throwable` as its sole argument. Defaults to `clojure.main/repl-caught`. * `:nrepl.middleware.caught/print?`: if logical true, the printed value of any interactive errors will be returned in the response (otherwise they will be elided). Delegates to `nrepl.middleware.print` to perform the printing. Defaults to false. [source,clojure] ---- {:op :eval :code "(/ 1 0)" :nrepl.middleware.caught/caught 'my.custom/print-stacktrace :nrepl.middleware.caught/print? true} ---- The functionality of the `caught` middleware is reusable by other middlewares. If a middleware descriptor's `:requires` set contains `#'nrepl.middleware.caught/wrap-caught`, then it can expect: * Any returned responses containing the key `:nrepl.middleware.caught/throwable` will have that key's corresponding value passed to the hook. * Any handled requests will contain the key `:nrepl.middleware.caught/caught-fn`, whose value is a function that can be called on a `java.lang.Throwable` to convey errors interactively. nrepl-0.6.0/doc/modules/ROOT/pages/design/overview.adoc000066400000000000000000000070501342636505500227160ustar00rootroot00000000000000= Overview nREPL largely consists of three abstractions: <>, <>, and <>. These are roughly analogous to the handlers, middleware, and adapters of link:https://github.com/ring-clojure/ring[Ring], though there are some important semantic differences. Finally, nREPL is fundamentally message-oriented and asynchronous (in contrast to most REPLs that build on top of streams provided by e.g. terminals). == Messages nREPL messages are maps. The keys and values that may be included in messages depends upon the transport being used; different transports may encode messages differently, and therefore may or may not be able to represent certain data types. === Requests Each message sent to an nREPL endpoint constitutes a "request" to perform a particular operation, which is indicated by a `"op"` entry. Each operation may further require the incoming message to contain other data. Which data an operation requires or may accept varies; for example, a message to evaluate some code might look like this: [source,clojure] ---- {"op" "eval" "code" "(+ 1 2 3)"} ---- The result(s) of performing each operation may be sent back to the nREPL client in one or more response messages, the contents of which again depend upon the operation. === Responses The server may produce multiple messages in response to each client message (request). The structure of the response is unique per each message type, but there are a few fundamental properties that will always be around in the responses: - `id` The ID of the request for which the response was generated. - `session` The ID of the session for which the response was generated. - `status` The status of the response. Here there would either be something like "done" if a request has been fully processed or the reason for a failure (e.g. "namespace-not-found"). Not every response message would have the status key. If some request generated multiple response messages only the final one would have the status attached to it. As mentioned earlier each op would produce different response messages. Here's what you can expect to see in responses generated as a result of an `eval` op invocation. - `ns` The stringified value of `*ns*` at the time of the response message's generation. - `out` Contains content written to `*out*` while the request's code was being evaluated. Messages containing `*out*` content may be sent at the discretion of the server, though at minimum corresponding with flushes of the underlying stream/writer. - `err` Same as `out`, but for `*err*`. - `value` The result of printing a result of evaluating a form in the code sent in the corresponding request. More than one value may be sent, if more than one form can be read from the request's code string. In contrast to the output written to `*out*` and `*err*`, this may be usefully/reliably read and utilized by the client, e.g. in tooling contexts, assuming the evaluated code returns a printable and readable value. Interactive clients will likely want to simply stream `value`'s content to their UI's primary output / log. Note that evaluations that are interrupted may nevertheless result in multiple response messages being sent prior to the interrupt occurring. [TIP] ==== Your favourite editor/nREPL client might have some utility to monitor the exchange of messages between the client and nREPL (e.g. CIDER has a `*nrepl-messages*` where you can monitor all requests and responses). That's a great way to get a better understanding of nREPL server responses. ==== nrepl-0.6.0/doc/modules/ROOT/pages/design/transports.adoc000066400000000000000000000046001342636505500232650ustar00rootroot00000000000000= Transports //// talk about strings vs. bytestrings, the encoding thereof, etc when we figure that out //// _Transports_ are roughly analogous to Ring's adapters: they provide an implementation of a common protocol (`nrepl.transport.Transport`) to enable nREPL clients and servers to send and receive messages without regard for the underlying channel or particulars of message encoding. nREPL includes two transports, both of which are socket-based: a "tty" transport that allows one to connect to an nREPL endpoint using e.g. `telnet` (which therefore supports only the most simplistic interactive evaluation of expressions), and one that uses link:https://wiki.theory.org/index.php/BitTorrentSpecification#Bencoding[bencode] to encode nREPL messages over sockets. It is the latter that is used by default by `nrepl.server/start-server` and `nrepl.core/connect`. link:https://github.com/nrepl/nrepl/wiki/Extensions[Other nREPL transports are provided by the community]. == TTY Transport Using the TTY transport is pretty simple. You just need to start an nREPL server with TTY transport and you're good to go: [source,clojure] ---- (require '[nrepl.server :as server] '[nrepl.transport :as transport]) (server/start-server :port 12345 :transport-fn transport/tty :greeting-fn transport/tty-greeting) ---- NOTE: The `:greeting-fn` is responsible for printing the initial message you'll see upon connecting. Afterwards you can simply connect to the server with some TTY client like `telnet`, `nc` or `inf-clojure`. [source,shell] ---- $ nc localhost 12345 ;; Clojure 1.9.0 user=> ---- Starting with nREPL 0.5 you can also start an nREPL with a TTY transport using `clj`: [source,shell] ---- $ clj -R:nrepl -m nrepl.cmdline -t nrepl.transport/tty nREPL server started on port 63266 on host localhost - telnet://localhost:63266 ---- == Bencode Transport There's nothing special you have to do to use the bencode transport, as it's the default transport for `nrepl.server/start-server`. You'll need a bencode capable client to connect to an nREPL server that transport. TIP: nREPL's bencode implementation is available as a https://github.com/nrepl/bencode[standalone library]. Keep in mind that nREPL itself doesn't use this library, as it's committed to having 0 runtime dependencies. The code in the library and in nREPL `nrepl.bencode` namespace in identical, though, and will be kept in sync in the future. nrepl-0.6.0/doc/modules/ROOT/pages/extensions.adoc000066400000000000000000000057401342636505500220020ustar00rootroot00000000000000= Extensions Here's a list of notable nREPL extensions (middleware or transports) you might encounter in the wild. [WARNING] ==== Make sure you're using the latest versions of those middlewares, as all of them added support for nREPL 0.4+ fairly recently. ==== == Official Official extensions are developed and maintained by nREPL's Core Team and are hosted under the nREPL GitHub organization. === Middleware ==== ClojureScript Support * link:https://github.com/nrepl/piggieback[Piggieback] The following ClojureScript REPLs are leveraging piggieback internally to provide nREPL support. * link:https://github.com/tomjakubowski/weasel[Weasel] * link:https://github.com/bhauman/lein-figwheel[figwheel] * link:https://github.com/bhauman/figwheel-main[figwheel-main] * link:https://github.com/thheller/shadow-cljs[shadow-cljs] (it actually only stubs the piggieback API, leverages its own nREPL middleware internally for ClojureScript evaluation) === Transports ==== HTTP Support * link:https://github.com/nrepl/drawbridge[drawbridge] ==== Transit Support * link:https://github.com/nrepl/fastlane[fastlane] == Third-party Third-party extensions are not developed and maintained by nREPL's Core Team and are hosted outside the nREPL GitHub organization. === Middleware ==== Clojure Editor Support * link:https://github.com/clojure-emacs/cider-nrepl[cider-nrepl]: A collection of nREPL middleware designed to enhance CIDER (and Clojure editors in general). * link:https://github.com/clojure-emacs/refactor-nrepl[refactor-nrepl]: A collection of functionality designed to support editor refactoring features. * link:https://github.com/liquidz/iced-nrepl[iced-nrepl]: nREPL middleware to support vim-iced. ==== Debugging * link:https://clojure-emacs.github.io/sayid/[sayid]: A powerful tracing/debugging tool. It is a great alternative of CIDER-nREPL's basic tracing functionality. * link:https://github.com/vvvvalvalval/scope-capture-nrepl[scope-capture-nrepl]: A companion library to scope-capture, providing an nREPL middleware that lets you put your REPL in the context of an Execution Point. ==== Deprecated This section lists middlewares that were somewhat prominent in the past, but were replaced by alternatives down the road. * link:https://github.com/pallet/ritz/tree/develop/nrepl-middleware[nrepl-middleware], part of link:https://github.com/pallet/ritz[ritz] that provides a variety of nREPL middleware supporting various enhanced REPL operations (including apropos, javadoc lookup, code completion, and an alternative eval implementation). **(superseded by `cider-nrepl`)** * link:https://github.com/technomancy/javert[Javert] provides a basic object inspector. **(superseded by `cider-nrepl`)** * link:https://github.com/thunknyc/nrepl-profile[nrepl-profile]: profiling middleware, which was eventually integrated into `cider-nrepl`. [NOTE] ==== This list doesn't aim to be complete. You can find more 3rd-party middlewares listed link:https://github.com/nrepl/nrepl/wiki/Extensions[here]. ==== nrepl-0.6.0/doc/modules/ROOT/pages/faq.adoc000066400000000000000000000034611342636505500203500ustar00rootroot00000000000000= FAQ == What's the difference between contrib's nREPL and this one? See <>. Very simply put - this project is the continuation of the contrib project. == Does nREPL support ClojureScript? Yes, it does, although you'll need additional middleware to enable the ClojureScript support (e.g. link:https://github.com/nrepl/piggieback[piggieback] or link:https://github.com/thheller/shadow-cljs[shadow-cljs]). == Does nREPL support ClojureCLR? nREPL currently doesn't support ClojureCLR. The reason for this is that it leverages Java APIs internally. There's an link:https://github.com/clojure/clr.tools.nrepl[nREPL port for ClojureCLR], but it's not actively maintained and it doesn't behave like the Clojure nREPL. == When is nREPL 1.0 going to be released? There's no exact roadmap for the 1.0 release. Roughly speaking the idea is to release 1.0 once everything essential has been migrated from the legacy contrib nREPL to the new nREPL (e.g. lein, boot, key middleware) and we've cleaned up the most important tickets from our backlog. == Are there any interesting nREPL extensions worth checking out? Sure! See <> for details. == Where can I get help regarding nREPL? See the <> section of the manual. == What should I do if I run into some issues with nREPL? Don't panic! Next step - visit the <> section of the manual. == How can I help the project? There are many ways in which you can help nREPL: * Donate funds * Work on improving the documentation * Solve open issues * File bug reports and suggestions for improvements * Promote nREPL via blog posts or at meetups and conferences * Invite members of the nREPL team to speak about nREPL at meetups and conferences nrepl-0.6.0/doc/modules/ROOT/pages/hacking_on_nrepl.adoc000066400000000000000000000071051342636505500231000ustar00rootroot00000000000000= Hacking on nREPL This section is dedicated to people, who're hacking on nREPL itself (e.g. to fix bugs or to enhance existing functionality). There are generally two approaches to hacking on nREPL - you can either make some changes, build a new server and run it locally to test your changes (e.g. via `clj`) or you can hack on nREPL in the classic interactive Lisp manner and just make some changes and test them directly from a running (n)REPL. == Building nREPL NOTE: Releases are available from Clojars, and SNAPSHOT builds from master's HEAD are automatically deployed there as well, so manually building nREPL shouldn't ever be necessary (unless you're hacking on it). Building nREPL locally is a very simple process: . Clone the repo . Make sure you have Leingingen installed . Run the build: [source,shell] ---- $ lein install ---- Afterwards you can simply do something like: [source,shell] ---- $ clj -Sdeps '{:deps {nrepl {:mvn/version "0.6.0"}}}' -m nrepl.cmdline --interactive ---- Now you can start playing the server you've built. == Interactive Hacking As nREPL is fundamental to the development workflows of many people it might be unclear how exactly you can hack on it, while at the same time you're already running an nREPL server, powering the REPL in which you're doing to hacking. Developing nREPL while connected to nREPL is a classic example of eating your own dog food. The development process is actually pretty simple - you just need to connect to nREPL as you'd normally would (e.g. by using CIDER, vim-iced or Calva), make some changes and test them by starting new nREPL instances from the REPL and connecting to them to see how they are having. In practice it might not be convenient to spin many nREPL connections from your editor, so a combination of `nrepl.server/start-server` and `nrepl.core/connect` is a very good alternative. [source,clojure] ---- ;; first we have to start a new server => (require '[nrepl.server :refer [start-server stop-server]]) nil => (def server (start-server :port 7888)) ='user/server => (require '[nrepl.core :as nrepl]) nil ;; now you can connect to the server and send it some messages => (with-open [conn (nrepl/connect :port 7888)] (-> (nrepl/client conn 1000) ; message receive timeout required (nrepl/message {:op "eval" :code "(+ 2 3)"}) nrepl/response-values)) ;; when you're done with a server you can stop it => (stop-server server) ---- NOTE: You don't really need an nREPL-powered REPL for this workflow. It's going to work in exactly the same manner regardless of the REPL you're using. == Running the tests The easiest way to run the tests is with the following command: [source,shell] ---- $ lein test-all ---- This will automatically run the tests for every supported Clojure profile (e.g. 1.7, 1.8, 1.9). You can run only the tests for a specific version of Clojure like this: [source,shell] ---- $ lein with-profile 1.9 test ---- == Running cljfmt Our CI build enforces consistent indentation in all source files using `cljfmt`. You can run it locally using: [source,shell] ---- $ lein with-profile cljfmt cljfmt check ---- You can have cljfmt fix indentation problems like this: [source,shell] ---- $ lein with-profile cljfmt cljfmt fix ---- == Running Eastwood Our CI build enforces some lint checks via `Eastwood`. You can run it locally using: [source,shell] ---- $ lein with-profile eastwood eastwood ---- == Regenerating the Built-in Ops Documentation If you've made any changes to the built-in middleware descriptors you can regenerate their documentation using: [source,shell] ---- $ lein docs ---- nrepl-0.6.0/doc/modules/ROOT/pages/index.adoc000066400000000000000000000072431342636505500207120ustar00rootroot00000000000000= nREPL :notitle: image::logo-w1280.png[nREPL's logo] == Overview nREPL is a Clojure **n**etwork REPL that provides a REPL server and client, along with some common APIs of use to IDEs and other tools that may need to evaluate Clojure code in remote environments. == Why nREPL? nREPL has been designed with the aim of ensuring that it satisfies the requirements of both application developers (in support of activities ranging from interactive remote debugging and experimentation in development contexts through to more advanced use cases such as updating deployed applications) as well as toolmakers (providing a standard way to connect to and introspect running environments as a way of informing user interfaces of all kinds, including "standard" interactive, text-based REPLs). The default network protocol used is simple, depending neither on JVM or Clojure specifics, thereby allowing (encouraging?) the development of non-Clojure REPL clients. The REPLs operational semantics are such that essentially any non-JVM Clojure implementation should be able to implement it, with allowances for hosts that lack the concurrency primitives to support e.g. asynchronous evaluation, interrupts, etc. TIP: For more information about the motivation, architecture, use cases, and discussion related to nREPL, see the original design notes, available link:https://docs.google.com/document/edit?id=1dnb1ONTpK9ttO5W4thxiXkU5Ki89gK62anRqKEK4YZI&authkey=CMuszuMI&hl=en#[here], and the link:https://github.com/clojure/tools.nrepl/wiki/nREPL.Next[notes] and link:http://groups.google.com/group/clojure-dev/browse_frm/thread/6e366c1d0eaeec59[discussion] around its recent redesign.footnote:[It's not that recent anymore, as the redesign happened in 2012. It marked the beginning of the long-lived nREPL 0.2 series.] == Beyond Clojure While this site is mostly about nREPL's reference (canonical) Clojure implementation, it's important to point out that the nREPL protocol is language-agnostic and can be leveraged for many languages that have the ability to evaluate code at runtime. One way to describe nREPL would be as something similar in nature to the link:https://langserver.org/[Language Server Protocol]. nREPL is not nearly as ambitious as LSP, but on the other hand it's also much simpler and it's trivial to create nREPL clients in any language. TIP: You can find some alternative nREPL implementations and more on the subject <>. == Community-Driven One of the defining attributes of nREPL is that it's a project built by the Clojure community for the Clojure community. Making it easy for everyone interested to participate in the development of nREPL was one of the biggest reasons why we decided to leave the "Clojure Contrib" umbrella. Everyone's welcome to get involved in the project, so we can take it to the next level! TIP: Check out the how you can help nREPL <>. == Status Despite its modest version number, nREPL is extremely stable at this point. Its communication protocol and API are rock-solid and battle tested and have been powering much of the existing Clojure tooling for several years now.footnote:[nREPL had virtually no alternatives before the introduction of the built-in Socket REPL in Clojure 1.8.] Given the massive community investment in developing all sorts of tooling on top of nREPL, nREPL's team pledges to evolve the project only in a responsible manner and backwards-compatible ways. NOTE: The migration of nREPL out of Clojure Contrib is probably the only case where we were forced to make breaking changes.footnote:[Apart from removing deprecated code that is.] Those are detailed in great detail <>. nrepl-0.6.0/doc/modules/ROOT/pages/installation.adoc000066400000000000000000000056761342636505500223140ustar00rootroot00000000000000= Installation [NOTE] ==== nREPL is compatible with Clojure 1.7.0+ and Java 8+. ==== nREPL is a library (as opposed to it being an application), so it's not something you'd be installing in the traditional sense. There's currently no nREPL binary or script that you can run to spin a server. [NOTE] ==== While there's no binary, there is a command-line interface that mostly targets `clj`. It's documented in the subsequent sections of this manual. ==== All popular Clojure build tools (Leiningen, Boot, Gradle, Maven) have the ability to run an nREPL server and most of the time you'll probably simply use nREPL through them and end up using whatever nREPL version they happen to ship. Still, from time to time you'll be building a tool around nREPL or you'll want to embed an nREPL server directly in your application. In those scenarios some kind of an installation will be in order - just adding nREPL as a dependency to your project. nREPL is available in Clojars. Add this to your Leiningen `project.clj` `:dependencies`: [source,clojure] ---- [nrepl "0.6.0"] ---- [TIP] ==== You can override the version of nREPL supplied by Leiningen and Boot by adding nREPL as a dependency to your project. ==== Or, add this to your Maven project's `pom.xml`: [source,xml] ---- nrepl nrepl 0.6.0 ---- [WARNING] ==== Prior to version 0.3, nREPL used to be hosted on Maven Central and had a different deployment artifact - `org.clojure/clojure.tools.nrepl`. ==== [[upgrading]] == Upgrading from nREPL 0.2.x to 0.4.x A few major changes happened since nREPL 0.2.x: * The artifact id changed from `org.clojure/clojure.tools.nrepl` to `nrepl/nrepl`. * The namespace prefix changed from `clojure.tools.nrepl` to `nrepl`. * The namespace `clojure.tools.nrepl` was renamed to `nrepl.core`. * nREPL now targets Java 8+ and Clojure 1.7+.footnote:[nREPL 0.2 used to target Java 6 and Clojure 1.2.] * All the code which existed for compatibility with nREPL 0.0.x was removed.footnote:[Which probably won't affect anyone, as it was ancient.] [TIP] ==== Refer to the link:https://github.com/nrepl/nrepl/blob/master/CHANGELOG.md[changelog] for an exhaustive listing of all the changes. ==== Those changes can affect you in two ways: * If you're working on nREPL extensions you'll need to update the nREPL namespaces you're referring to. * If you're using third-party nREPL middleware you'll have to make sure it was updated for nREPL 0.4+. Apart from those renamings it's business as usual - nREPL's API and protocol remain exactly the same as they were in 0.2.x, and backwards compatibility remains as important as always. [WARNING] ==== You'll need Boot 2.8.2+ or Leiningen 2.8.3+ to take advantage of nREPL 0.4+, as their older releases bundled nREPL 0.2.x. Leiningen users can also use the link:https://github.com/nrepl/lein-nrepl/pulls[lein-nrepl plugin] if they are stuck on an older Leiningen release. ==== nrepl-0.6.0/doc/modules/ROOT/pages/ops.adoc000066400000000000000000000165141342636505500204050ustar00rootroot00000000000000//// This file is _generated_ by #'nrepl.impl.docs/-main *Do not edit!* //// = Supported nREPL operations [small]#generated from a verbose 'describe' response (nREPL v0.6.0-SNAPSHOT)# == Operations === `:clone` Clones the current session, returning the ID of the newly-created session. Required parameters:: {blank} Optional parameters:: * `:session` The ID of the session to be cloned; if not provided, a new session with default bindings is created, and mapped to the returned session ID. Returns:: * `:new-session` The ID of the new session. === `:close` Closes the specified session. Required parameters:: * `:session` The ID of the session to be closed. Optional parameters:: {blank} Returns:: {blank} === `:describe` Produce a machine- and human-readable directory and documentation for the operations supported by an nREPL endpoint. Required parameters:: {blank} Optional parameters:: * `:verbose?` Include informational detail for each "op"eration in the return message. Returns:: * `:aux` Map of auxilliary data contributed by all of the active nREPL middleware via :describe-fn functions in their descriptors. * `:ops` Map of "op"erations supported by this nREPL endpoint * `:versions` Map containing version maps (like \*clojure-version*, e.g. major, minor, incremental, and qualifier keys) for values, component names as keys. Common keys include "nrepl" and "clojure". === `:eval` Evaluates code. Note that unlike regular stream-based Clojure REPLs, nREPL's ``:eval`` short-circuits on first read error and will not try to read and execute the remaining code in the message. Required parameters:: * `:code` The code to be evaluated. * `:session` The ID of the session within which to evaluate the code. Optional parameters:: * `:column` The column number in [file] at which [code] starts. * `:eval` A fully-qualified symbol naming a var whose function value will be used to evaluate [code], instead of ``clojure.core/eval`` (the default). * `:file` The path to the file containing [code]. ``clojure.core/\*file*`` will be bound to this. * `:id` An opaque message ID that will be included in responses related to the evaluation, and which may be used to restrict the scope of a later "interrupt" operation. * `:line` The line number in [file] at which [code] starts. * `:nrepl.middleware.caught/caught` A fully-qualified symbol naming a var whose function to use to convey interactive errors. Must point to a function that takes a ``java.lang.Throwable`` as its sole argument. * `:nrepl.middleware.caught/print?` If logical true, the printed value of any interactive errors will be returned in the response (otherwise they will be elided). Delegates to ``nrepl.middleware.print`` to perform the printing. Defaults to false. * `:nrepl.middleware.print/buffer-size` The size of the buffer to use when streaming results. Defaults to 1024. * `:nrepl.middleware.print/keys` A seq of the keys in the response whose values should be printed. * `:nrepl.middleware.print/options` A map of options to pass to the printing function. Defaults to ``nil``. * `:nrepl.middleware.print/print` A fully-qualified symbol naming a var whose function to use for printing. Must point to a function with signature [value writer options]. * `:nrepl.middleware.print/quota` A hard limit on the number of bytes printed for each value. * `:nrepl.middleware.print/stream?` If logical true, the result of printing each value will be streamed to the client over one or more messages. Returns:: * `:ex` The type of exception thrown, if any. If present, then ``values`` will be absent. * `:ns` \*ns*, after successful evaluation of ``code``. * `:root-ex` The type of the root exception thrown, if any. If present, then ``values`` will be absent. * `:values` The result of evaluating ``code``, often ``read``able. This printing is provided by the ``print`` middleware. Superseded by ``ex`` and ``root-ex`` if an exception occurs during evaluation. === `:interrupt` Attempts to interrupt some executing request. When interruption succeeds, the thread used for execution is killed, and a new thread spawned for the session. While the session middleware ensures that Clojure dynamic bindings are preserved, other ThreadLocals are not. Hence, when running code intimately tied to the current thread identity, it is best to avoid interruptions. Required parameters:: * `:session` The ID of the session used to start the request to be interrupted. Optional parameters:: * `:interrupt-id` The opaque message ID sent with the request to be interrupted. Returns:: * `:status` 'interrupted' if a request was identified and interruption will be attempted 'session-idle' if the session is not currently executing any request 'interrupt-id-mismatch' if the session is currently executing a request sent using a different ID than specified by the "interrupt-id" value 'session-ephemeral' if the session is an ephemeral session === `:load-file` Loads a body of code, using supplied path and filename info to set source file and line number metadata. Delegates to underlying "eval" middleware/handler. Required parameters:: * `:file` Full contents of a file of code. Optional parameters:: * `:file-name` Name of source file, e.g. io.clj * `:file-path` Source-path-relative path of the source file, e.g. clojure/java/io.clj * `:nrepl.middleware.caught/caught` A fully-qualified symbol naming a var whose function to use to convey interactive errors. Must point to a function that takes a ``java.lang.Throwable`` as its sole argument. * `:nrepl.middleware.caught/print?` If logical true, the printed value of any interactive errors will be returned in the response (otherwise they will be elided). Delegates to ``nrepl.middleware.print`` to perform the printing. Defaults to false. * `:nrepl.middleware.print/buffer-size` The size of the buffer to use when streaming results. Defaults to 1024. * `:nrepl.middleware.print/keys` A seq of the keys in the response whose values should be printed. * `:nrepl.middleware.print/options` A map of options to pass to the printing function. Defaults to ``nil``. * `:nrepl.middleware.print/print` A fully-qualified symbol naming a var whose function to use for printing. Must point to a function with signature [value writer options]. * `:nrepl.middleware.print/quota` A hard limit on the number of bytes printed for each value. * `:nrepl.middleware.print/stream?` If logical true, the result of printing each value will be streamed to the client over one or more messages. Returns:: * `:ex` The type of exception thrown, if any. If present, then ``values`` will be absent. * `:ns` \*ns*, after successful evaluation of ``code``. * `:root-ex` The type of the root exception thrown, if any. If present, then ``values`` will be absent. * `:values` The result of evaluating ``code``, often ``read``able. This printing is provided by the ``print`` middleware. Superseded by ``ex`` and ``root-ex`` if an exception occurs during evaluation. === `:ls-sessions` Lists the IDs of all active sessions. Required parameters:: {blank} Optional parameters:: {blank} Returns:: * `:sessions` A list of all available session IDs. === `:stdin` Add content from the value of "stdin" to \*in* in the current session. Required parameters:: * `:stdin` Content to add to \*in*. Optional parameters:: {blank} Returns:: * `:status` A status of "need-input" will be sent if a session's \*in* requires content in order to satisfy an attempted read operation. nrepl-0.6.0/doc/modules/ROOT/pages/troubleshooting.adoc000066400000000000000000000134731342636505500230340ustar00rootroot00000000000000= Troubleshooting This section of the manual tries to summarize the most common problems that you may encounter while using nREPL and their solutions. Generally it's also a good idea to check whether the problem you've experienced is not a bug that's already reported on our issue tracker. == Middleware === Warnings when Starting nREPL If you encounter something like: [source,shell] ---- [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-apropos, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-classpath, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-complete, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-debug, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-enlighten, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-format, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-info, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-inspect, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-macroexpand, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-slurp, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-ns, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-out, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-content-type, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-slurp, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-pprint, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-pprint-fn, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-profile, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-refresh, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-resource, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-spec, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-stacktrace, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-test, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-trace, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-tracker, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-undef, see nrepl.middleware/set-descriptor! [WARNING] No nREPL middleware descriptor in metadata of #'cider.nrepl/wrap-version, see nrepl.middleware/set-descriptor! nREPL server started on port 36457 on host 127.0.0.1 - nrepl://127.0.0.1:36457 ---- This means that you're trying to load middleware that's not targeting nREPL 0.4+. Make sure you're using the latest versions of all the middleware libraries in your project/profiles and that you're not loading any projects with explicit `tools.nrepl` dependencies that get required early in your projects (e.g. in `user.clj`). The root of this problem is that many middleware libraries try to support both `tools.nrepl` and the modern nREPL 0.4+ using code like: [source,clojure] ---- ;; Compatibility with the legacy tools.nrepl and the new nREPL 0.4.x. ;; The assumption is that if someone is using old lein repl or boot repl ;; they'll end up using the tools.nrepl, otherwise the modern one. (if (find-ns 'clojure.tools.nrepl) (require '[clojure.tools.nrepl.middleware :refer [set-descriptor!]] '[clojure.tools.nrepl.middleware.session :refer [session]] '[clojure.tools.nrepl.server :as nrepl-server]) (require '[nrepl.middleware :refer [set-descriptor!]] '[nrepl.middleware.session :refer [session]] '[nrepl.server :as nrepl-server])) ---- This will obviously break if you've started an nREPL 0.4+ server, but somehow `tools.nrepl` gets loaded and the middleware decides it's running in nREPL 0.2 mode. This problem will become less common when the compatibility code is removed from middleware libraries down the road and they adopt a hard dependency on nREPL 0.4+. Leiningen users might use this command to check for wayward deps: [source,shell] ---- $ lein deps :why org.clojure/tools.nrepl ---- == Leiningen === The REPL Task Crashes If you experience problems running `lein repl` you have to make sure that: * You're not using Leiningen 2.8.2 (a bug there rendered the `repl` task unusable - it was addressed in 2.8.3). * Your project is using Clojure 1.7+. * Your project is using Java 8+. * You're not trying to load any middleware that haven't been updated for nREPL 0.4+. == Boot === The REPL Task Crashes If you experience problems running `lein repl` you have to make sure that: * Your project is using Clojure 1.7+. * Your project is using Java 8+. * You're not trying to load any middleware that haven't been updated for nREPL 0.4+. === nREPL Configuration Files are Ignored Boot currently (as of 2.8.2) doesn't yet support the configuration mechanism introduced in nREPL 0.5. nrepl-0.6.0/doc/modules/ROOT/pages/usage/000077500000000000000000000000001342636505500200515ustar00rootroot00000000000000nrepl-0.6.0/doc/modules/ROOT/pages/usage/clients.adoc000066400000000000000000000124631342636505500223500ustar00rootroot00000000000000= nREPL Clients Most of the time, you will connect to an nREPL server using an existing client/tool. Tools that support nREPL include: * link:https://github.com/clojure-emacs/cider[CIDER] (Clojure Interactive Development Environment that Rocks for Emacs) * link:https://cursiveclojure.com[Cursive] (Clojure IDE/plugin for IntelliJ Idea) * link:https://github.com/ccw-ide/ccw[Counterclockwise] (Clojure IDE/plugin for Eclipse) * link:https://github.com/sanel/monroe[monroe] (nREPL client for Emacs, works with non-Clojure servers) * link:https://github.com/tpope/vim-fireplace[fireplace.vim] (Clojure + nREPL support for vim) * link:https://leiningen.org/grench[grenchman] (command-line nREPL client written in OCaml, works with non-Clojure servers) * link:https://github.com/liquidz/vim-iced[vim-iced] (Clojure Interactive Development Environment for Vim8/Neovim) * link:https://github.com/jasongilman/proto-repl[Proto REPL] (Clojure development environment and REPL for Atom) * link:https://github.com/BetterThanTomorrow/calva[Calva] (Clojure & ClojureScript support for VS Code) * link:https://github.com/trptcolin/reply/[REPL-y] (command-line client for nREPL) * link:https://github.com/eraserhd/rep[rep] (A single-shot nREPL client designed for shell invocation.) * link:https://git.sr.ht/~technomancy/shevek/[shevek] (A command-line nREPL client written in link:https://fennel-lang.org/[Fennel], works with non-Clojure servers) * link:https://github.com/rksm/node-nrepl-client[node-nrepl-client] (An nREPL client for programmatic use from node.js written in Javascript) * link:https://github.com/kanej/parle[Parle] (A command-line nREPL client using node.js written in ClojureScript) * link:https://github.com/vspinu/R-nREPL[R-nREPL] (nREPL client for R) * link:https://github.com/Saikyun/miracle[miracle] (fork of `monroe` targeting Arcadia) Some of these clients will only work with Clojure nREPL servers, while others are built with language-agnosticism and can connect to nREPL servers written in any language. NOTE: Both Leiningen and Boot use internally REPL-y, as their command-line nREPL client. If your preferred Clojure development environment supports nREPL, you're done. Use it or connect to an existing nREPL endpoint, and you're done. == Using the built-in client nREPL ships with a very simple command-line client that you can use for some basic interactions with the server. The following command will start an nREPL server and connect with it using the built-in client. [source,shell] ---- $ clj -Sdeps '{:deps {nrepl {:mvn/version "0.6.0"}}}' -m nrepl.cmdline --interactive nREPL server started on port 59403 on host 127.0.0.1 - nrepl://127.0.0.1:59403 nREPL 0.6.0 Clojure 1.9.0 Java HotSpot(TM) 64-Bit Server VM 10.0.1+10 user=> (+ 1 2) 3 ---- If you want to connect to a server that's already running you can do it like this: [source,shell] ---- $ clj -Sdeps '{:deps {nrepl {:mvn/version "0.6.0"}}}' -m nrepl.cmdline --connect --host host --port port nREPL 0.6.0 Clojure 1.9.0 Java HotSpot(TM) 64-Bit Server VM 10.0.1+10 user=> (+ 1 2) 3 ---- Most users, however, are advised to use REPL-y or their favourite editor instead for optimal results. == Talking to an nREPL endpoint programmatically If you want to connect to an nREPL server using the default transport, something like this will work: [source,clojure] ---- => (require '[nrepl.core :as nrepl]) nil => (with-open [conn (nrepl/connect :port 59258)] (-> (nrepl/client conn 1000) ; message receive timeout required (nrepl/message {:op "eval" :code "(+ 2 3)"}) nrepl/response-values)) ---- If your nREPL server is running on a different machine or listening on a specific address different than the default one, you can use the `:host` keyword in the `connect` function to specify which address to connect to. E.g., to connect to a nREPL server listening on address 172.18.0.5 and port 4001: [source,clojure] ---- => (with-open [conn (nrepl/connect :host "172.18.0.5" :port 4001)] (-> (nrepl/client conn 1000) ; message receive timeout required (nrepl/message {:op "eval" :code "(+ 2 3)"}) nrepl/response-values)) ---- `response-values` will return only the values of evaluated expressions, read from their (by default) `pr`-encoded representations via `read`. You can see the full content of message responses easily: [source,clojure] ---- => (with-open [conn (nrepl/connect :port 59258)] (-> (nrepl/client conn 1000) (nrepl/message {:op :eval :code "(time (reduce + (range 1e6)))"}) doall ;; `message` and `client-session` all return lazy seqs pprint)) nil ({:out "\"Elapsed time: 68.032 msecs\"\n", :session "2ba81681-5093-4262-81c5-edddad573201", :id "3124d886-7a5d-4c1e-9fc3-2946b1b3cfaa"} {:ns "user", :value "499999500000", :session "2ba81681-5093-4262-81c5-edddad573201", :id "3124d886-7a5d-4c1e-9fc3-2946b1b3cfaa"} {:status ["done"], :session "2ba81681-5093-4262-81c5-edddad573201", :id "3124d886-7a5d-4c1e-9fc3-2946b1b3cfaa"}) ---- Each message must contain at least an `:op` (or `"op"`) slot, which specifies the "type" of the operation to be performed. The operations supported by an nREPL endpoint are determined by the handlers and middleware stack used when starting that endpoint; the default middleware stack (described below) supports a particular set of operations, <>. nrepl-0.6.0/doc/modules/ROOT/pages/usage/misc.adoc000066400000000000000000000130421342636505500216340ustar00rootroot00000000000000= Misc Functionality == Pretty Printing NOTE: Pretty printing support was added in nREPL 0.6 and the API is still considered experimental. The namespace `nrepl.middleware.print` contains some dynamic vars you can `set!` at the REPL to alter how evaluation results will be printed. Note that if your nREPL client supports passing these options in requests, then it may override some or all of these options. * `\*print-fn*`: the function to use for printing. Defaults to the equivalent of `clojure.core/pr`. The function must take two arguments: ** `value`: the value to print. ** `writer`: the `java.io.Writer` to print on. * `\*stream?*`: if logical true, the result of printing each value will be streamed to the client over one or more messages. Defaults to false. ** This lets you see results being printed incrementally, and optionally interrupt the evaluation while it is printing. ** Your nREPL client may not fully support this mode of operation. * `\*buffer-size*`: size of the buffer to use when streaming results. Defaults to 1024. * `\*quota*`: a hard limit on the number of bytes printed for each value. Defaults to nil (no limit). ** Your nREPL client may not indicate if truncation has occurred. For example, to prevent printing infinite lazy sequences from causing the REPL to hang: [source,clojure] ---- user=> (set! nrepl.middleware.print/*quota* 32) 32 user=> (range) (0 1 2 3 4 5 6 7 8 9 10 11 12 13 user=> ---- Or to use `clojure.pprint` to print evaluation results: [source,clojure] ---- user=> (set! nrepl.middleware.print/*print-fn* clojure.pprint/pprint) #object[clojure.pprint$pprint 0x2bc11aa0 "clojure.pprint$pprint@2bc11aa0"] user=> (meta #'int) {:added "1.0", :ns #object[clojure.lang.Namespace 0xea12515 "clojure.core"], :name int, :file "clojure/core.clj", :column 1, :line 882, :arglists ([x]), :doc "Coerce to int", :inline #object[clojure.core$int__inliner__5509 0x3c79d89 "clojure.core$int__inliner__5509@3c79d89"]} user=> ---- However, note well that `clojure.pprint/pprint` rebinds `\*out*` internally, and so if anything else prints to `\*out*` while evaluating, that output will end up intermingled in the result. See the <<../design/middleware#_pretty_printing,print middleware documentation>> for a more detailed explanation. == Evaluation Errors The dynamic var `nrepl.middleware.caught/\*caught-fn*` can be `set!` at the REPL to alter how evaluation errors will be handled. Like the `:caught` option to `clojure.main/repl`, this is a function that takes a `java.lang.Throwable` (default `clojure.main/repl-caught`) and is called when either read, eval, or print throws an exception or error. For example, to automatically print the stacktrace of each error: [source,clojure] ---- user> (set! nrepl.middleware.caught/*caught-fn* clojure.repl/pst) #function[clojure.repl/pst] user> (first 1) IllegalArgumentException Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (RT.java:542) clojure.lang.RT.seq (RT.java:523) clojure.lang.RT.first (RT.java:668) clojure.core/first--4339 (core.clj:55) clojure.core/first--4339 (core.clj:55) user/eval11339 (form-init6612168545889071220.clj:12) user/eval11339 (form-init6612168545889071220.clj:12) clojure.lang.Compiler.eval (Compiler.java:6927) clojure.lang.Compiler.eval (Compiler.java:6890) clojure.core/eval (core.clj:3105) clojure.core/eval (core.clj:3101) clojure.main/repl/read-eval-print--7408/fn--7411 (main.clj:240) user=> ---- Or to use the link:https://github.com/AvisoNovate/pretty[pretty] stacktrace printing library to print stacktraces: [source,clojure] ---- user=> (set! nrepl.middleware.caught/*caught-fn* io.aviso.repl/pretty-pst) #function[io.aviso.repl/pretty-pst] user=> (first 1) clojure.core/eval core.clj: 3214 ... user/eval5945 REPL Input clojure.core/first core.clj: 55 ... java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long user=> ---- == Hot-loading dependencies From time to time you'd want to experiment with some library without adding it as a dependency of your project. You can easily achieve this with `tools.deps` or `pomegranate`. Let's start with a `tools.deps` example: [source,shell] ---- $ clj -Sdeps '{:deps {nrepl {:mvn/version "0.6.0"} org.clojure/tools.deps.alpha {:git/url "https://github.com/clojure/tools.deps.alpha.git" :sha "d492e97259c013ba401c5238842cd3445839d020"}}}' -m nrepl.cmdline --interactive network-repl Clojure 1.9.0 user=> (require '[clojure.tools.deps.alpha.repl :refer [add-lib]]) nil user=> (add-lib 'org.clojure/core.memoize {:mvn/version "0.7.1"}) true user=> (require 'clojure.core.memoize) nil user=> ---- Alternatively with `pomegranate` you can do the following: [source,shell] ---- $ clj -Sdeps '{:deps {nrepl {:mvn/version "0.6.0"} com.cemerick/pomegranate {:mvn/version "1.0.0"}}}' -m nrepl.cmdline --interactive network-repl Clojure 1.9.0 user=> (require '[cemerick.pomegranate :refer [add-dependencies]]) nil user=> (add-dependencies :coordinates '[[org.clojure/core.memoize "0.7.1"]] :repositories (merge cemerick.pomegranate.aether/maven-central {"clojars" "https://clojars.org/repo"})) {[org.clojure/core.memoize "0.7.1"] #{[org.clojure/core.cache "0.7.1"] [org.clojure/clojure "1.6.0"]}, [org.clojure/core.cache "0.7.1"] #{[org.clojure/data.priority-map "0.0.7"]}, [org.clojure/data.priority-map "0.0.7"] nil, [org.clojure/clojure "1.6.0"] nil} user=> (require 'clojure.core.memoize) nil ---- nrepl-0.6.0/doc/modules/ROOT/pages/usage/server.adoc000066400000000000000000000175721342636505500222230ustar00rootroot00000000000000= nREPL Server == Starting a server There are many ways to start an nREPL server. Most often you'd start it using some build tool, but you can also embed the server in your application and start it from it. Here we'll outline the most popular options available for you today. === Using Clojure CLI tools NOTE: This section assumes you're using Clojure 1.9+ and nREPL 0.4.4+. If you're into the `clj` command you can take advantage of nREPL's built-in command-line interface (`nrepl.cmdline`). Add this alias to `~/.clojure/deps.edn`: [source,clojure] ---- { ;; ... :aliases {:nREPL {:extra-deps {nrepl/nrepl {:mvn/version "0.6.0"}}}} } ---- Then you can simply run the nREPL server in headless mode like this: [source,shell] ---- $ clj -R:nREPL -m nrepl.cmdline ---- A good practice is add whatever nREPL middleware you want to use to the `nREPL` profile, so you can easily activate them when needed. Here's how you can easily start a ClojureScript capable nREPL: [source,clojure] ---- { ;; ... :aliases {:nREPL {:extra-deps {nrepl/nrepl {:mvn/version "0.6.0"} cider/piggieback {:mvn/version "0.4.0"}}}} } ---- [source,shell] ---- $ clj -R:nREPL -m nrepl.cmdline --middleware "[cider.piggieback/wrap-cljs-repl]" ---- Here's a listing of all the options available via nREPL's command-line interface (this output was simply generated with `--help`): .... -i/--interactive Start nREPL and connect to it with the built-in client. -c/--connect Connect to a running nREPL with the built-in client. -C/--color Use colors to differentiate values from output in the REPL. Must be combined with --interactive. -b/--bind ADDR Bind address, by default "127.0.0.1". -h/--host ADDR Host address to connect to when using --connect. Defaults to "127.0.0.1". -p/--port PORT Start nREPL on PORT. Defaults to 0 (random port) if not specified. --ack ACK-PORT Acknowledge the port of this server to another nREPL server running on ACK-PORT. -n/--handler HANDLER The nREPL message handler to use for each incoming connection; defaults to the result of `(nrepl.server/default-handler)`. -m/--middleware MIDDLEWARE A sequence of vars, representing middleware you wish to mix in to the nREPL handler. -t/--transport TRANSPORT The transport to use. By default that's `nrepl.transport/bencode`. --help Show this help message. .... === Using Leiningen link:https://github.com/technomancy/leiningen[Leiningen] has built-in support for nREPL since version 2. Just do: [source,shell] ---- $ lein repl ---- And you're all set. By default Lein will also connect to the running nREPL server using the popular command-line nREPL client link:https://github.com/trptcolin/reply/[REPL-y]. If you don't need the terminal REPL you can also start nREPL in headless mode: [source,shell] ---- $ lein repl :headless ---- [TIP] ==== You can see the version of nREPL used by Leiningen in the message that it will display once the REPL has been started. [source,shell] ---- nREPL server started on port 56249 on host 127.0.0.1 - nrepl://127.0.0.1:56249 REPL-y 0.4.3, nREPL 0.6.0 Clojure 1.10.0 Java HotSpot(TM) 64-Bit Server VM 10.0.1+10 Docs: (doc function-name-here) (find-doc "part-of-name-here") Source: (source function-name-here) Javadoc: (javadoc java-object-or-class-here) Exit: Control+D or (exit) or (quit) Results: Stored in vars *1, *2, *3, an exception in *e user=> ---- Here you can see that Leiningen has started an nREPL 0.6.0 server and has connected to it using REPL-y 0.4.3. Most of this message is generated by REPL-y, so you'll see a similar message in Boot as well. ==== === Using Boot link:https://github.com/boot-clj/boot[Boot] is a popular alternative to Leiningen, that also has build-in support for nREPL: [source,shell] ---- $ boot repl ---- Like Leiningen, by default Boot will also connect to the running nREPL server using REPL-y. If you don't need the terminal REPL you can also start nREPL in headless mode: [source,shell] ---- $ boot repl -s wait ---- == Embedding nREPL All the above options are typically used during the development of an application. It can also be extremely useful to have your application host a REPL server whereever it might be deployed; this can greatly simplify debugging, sanity-checking, panicked code patching, and so on. WARNING: You should think long and hard before hot-patching code in production, but that's a subject for an unrelated discussion. nREPL provides a socket-based server that you can trivially start from your application. <>, and add code like this to your app: [source,clojure] ---- => (require '[nrepl.server :refer [start-server stop-server]]) nil => (defonce server (start-server :port 7888)) ='user/server ---- If you want your nREPL server to listen on a particular address instead of the default one, you can use the `:bind` keyword to specify the address to listen on. E.g., to make the nREPL server listen on address 172.18.0.5 and port 4001: [source,clojure] ---- => (require '[nrepl.server :refer [start-server stop-server]]) nil => (defonce server (start-server :bind "172.18.0.5" :port 4001)) ='user/server ---- WARNING: Keep in mind that running a nREPL server on a public address is an epic security hole! As the connections are insecure (no authentication, no authorization) by default anyone can connect to your app and modify its behaviour or run code on the remote host. Depending on what the lifecycle of your application is, whether you want to be able to easily restart the server, etc., you might want to put the value `start-server` returns into an atom or somesuch. Anyway, once your app is running an nREPL server, you can connect to it from a tool like Leiningen or Counterclockwise or REPL-y, or from another Clojure process, as shown <>. You can stop the server with `(stop-server server)`. == Server options Note that nREPL is not limited to its default messaging protocol, nor to its default use of sockets. nREPL provides a _transport_ abstraction for implementing support for alternative protocols and connection methods. Alternative transport implementations are available, and implementing your own is not difficult; read more about transports <>. === Server Configuration Starting with version 0.5 you can configure certain aspects of the nREPL server's behaviour via configuration files. There are two configuration files: * Global configuration file `.nrepl/nrepl.edn` * Local configuration file `.nrepl.edn` The global configuration file is useful for setting options that you'd like to use for all the nREPL servers that you start (e.g. a common `bind-address`, `transport`, `handler`, etc). TIP: You can alter the location of the global configuration file via the environment variable `NREPL_CONFIG_DIR`. The local configuration file should be placed in the directory from which you're starting the server (normally the root directory of your project). Its purpose it to set project-specific settings (e.g. a common port you always want to use with a particular project). Any setting in `.nrepl.edn` will take precedence over a setting in `.nrepl/nrepl.edn`. Here's an example global configuration file: .nrepl/nrepl.edn [source,clojure] ---- {:bind "::" :transport nrepl.transport/tty :middleware [some.ns/mw1 some.ns/mw1]} ---- IMPORTANT: You should refer to vars only as symbols. And this is an example of a local config file: .nrepl.edn [source,clojure] ---- {:bind "localhost" :port 12345 :ack 23456 :handler some.ns/awesome-handler :transport nrepl.transport/bencode} ---- IMPORTANT: At the time of this writing Boot doesn't honor the new configuration files. They are current supported by the built-in command-line interface and by Leiningen 2.8.3+. nrepl-0.6.0/eastwood.clj000066400000000000000000000005571342636505500151740ustar00rootroot00000000000000(disable-warning {:linter :constant-test :for-macro 'clojure.core/while :if-inside-macroexpansion-of #{'clojure.core/let} :within-depth 5 :reason "`while` macroexpands to an `if` clause without the else part, so warning about it is redundant."}) (disable-warning {:linter :deprecations :symbol-matches #{#"public final void java.lang.Thread.stop\(\)"}}) nrepl-0.6.0/epl.html000066400000000000000000000305351342636505500143220ustar00rootroot00000000000000 Eclipse Public License - Version 1.0

Eclipse Public License - v 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and

b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

nrepl-0.6.0/load-file-test/000077500000000000000000000000001342636505500154575ustar00rootroot00000000000000nrepl-0.6.0/load-file-test/nrepl/000077500000000000000000000000001342636505500165775ustar00rootroot00000000000000nrepl-0.6.0/load-file-test/nrepl/load_file_sample.clj000066400000000000000000000002011342636505500225410ustar00rootroot00000000000000(ns nrepl.load-file-sample) (defn dfunction "Ensure \t that \n the \r various \f escapes \" work \\ as expected \\\"" []) nrepl-0.6.0/load-file-test/nrepl/load_file_sample2.clj000066400000000000000000000000631342636505500226310ustar00rootroot00000000000000(ns nrepl.load-file-sample2) (Thread/sleep 10000) nrepl-0.6.0/logo/000077500000000000000000000000001342636505500136065ustar00rootroot00000000000000nrepl-0.6.0/logo/browserconfig.xml000077500000000000000000000004731342636505500172100ustar00rootroot00000000000000 #FFFFFF nrepl-0.6.0/logo/favicon-114.png000066400000000000000000000277661342636505500162660ustar00rootroot00000000000000PNG  IHDRrr݅} pHYs  sRGBgAMA a/IDATx}ݯ]uZs%-E%uĭ.4㸦5]/-AшLH?@@-@@_<9HUJiHqҒJ1HDY[%%[#]sg[>f>DӸ.i/+T*維ڶ""$̢U9?q9ztWFoBS D$ ),<@jh% N-[}_V9l{ "]֏?zMP'Qz[ ڢ ;fm\JCJ+lm;vCHGߗbv yW_~hޠ6nea{2_|o9@:mIWK:`em[2ŎmE͟g?U`vmIJ}sS'?ytJ}G4bjө>XV,~j`n2?E_m=Cj Cr;{ui_+{QUI=fhqN,б]1-} ~u>RS)[EFɢZ%v=rSg@U~5ĵ q/̧^|Q之Lc(H7]2\?,Ӝ ZSTu sTt,}IzK/mZ^ oC >z~I;lr݇6{S)sZLJnDG)XZ)&2G$ Xj,5x(WA/o+0zׯ &fc +>kxQRvnkUZSSDrO=W$fG4S?;e_SDVufmFGa Q%9uzp:Dg0bFxQ+LFt_ 3K8&8"~p~(4e U9:ub"w"z>Ds`j"XOJo;Lҹ)P,hʔSf EYM"w[bĭ" 5"7ޏM/MLtK٩ؿPaS@6Jkfd^zn0:t.V?t4%wKL wKܶj6l8ZB&0ÔÇ}ej q3E'p ѓaX]u:4(K1 ͥ= ?ܳiv`7>U&1 Re7!E?V-G5(D |&7G~SqWHJ%Ҏ[Js.hH/@!\ GzjA\Z<\é4=Wu=9b9FGX‰@+ 貎*$A;8 "qH ?AQPebVyWEퟝ/z>Ӯ9-s(䨵" mP)&΃޲/F*`>i'We lNϩ [-uU8|%NʈSZcg!ݰf*G`9Oa8)L Q,?~n}<%$ZQb!K9 \4*F@N`c 8oD 2z8[y5SWbZ9fK<) Cs)r2;Һ-ZYr[GYvRVN?o_1A{@Tfj^4'$A@"בvJ+FdfO\g ˓Fg3&x5aPOEs5^f#9T˭Kr=8Fr<$ &5S'%9% J5= < bUZN9`SPVi`TN`*uex/S9>rA(6j0).yr~͠Tq1Gz⑥t4̢2xpduU2EQt[(we'SfU5)Yΐt=R6dLv-䖨`R s^x$E;9!Q#ڀrf҅ʑONT9~w0!?g?zr&,ϔrV ţI$r|ǥp7 p?/>& #Y / 5dq bjt%&Q(-ƾu9mEy{9~`)RNS3 h+7gsل4Q%3`+3`+-+У8 f,s aG\N")'֜DŒBX FSdhvGg.n78Wm{" lSisSx 1.jY2GA`*p$46O^'xrHJ,@V‰*{ˠE!K 9M), )9p`azL?vf)NSCl%GsMC(!8bb:HGRqs@3sfg,éΨw;)V]_A u|].Nwm|GePy?ZmbzP"1DHCXVou9KJid>lj99R45QX* Y^b1HleaXU9{pSMH7 -yMzξJj2U~ks.ݬTV%t5%|ƸV%\"zR|Bԉ;]hy!_(:pD @` U.ENE%2Ap)4VXha nU3>eDՔx}nFi@Ej>tL+$,Oun^`a 'Qctzn:.1amU @ND km,qPB3oQ1RM ݁vU.ԔCr.ՠ_ շmyI ̟j`hIxk&KIs(mz#OW} `\XZ#qy¯6 &fUX%&Oe<86@CrFTK!`ULƤ9D1_P_OcEL^̛{鿝nt^2 -^aS<4b 0J[ gS[]R\ฐ@&^}$I~vFtI,:eGfدV 4*4wj`LS$ vϔ!f7F2 C8T!۴qYgl0|Ic|P,_6WR?*9Ȃ!.rDU`mH`)1T;`?Ł->Z.&p:h! GѷY]9J <Br=8퀠4D\ YFTܭ*HHR=OscJ:FP*=Z݋(ų=`*Nm3Xmh@c+[?NҢ^sW6+AP20_n`(RQm!ٓt֕svdQ9 ]An5Ue`G$S8Y~A;&KHbkaY0.W]WIؠ֗AA^w E[$,2aێAW'ZjCs0ԱdPa+8@7ފhd 0Rq ܦ828 C 9:TB i˅ Fy)@k_w!! Bs,Mt.t)W\'c&_h`^+t|ѫ=Ⱥd5s,_:$‹hX=@F~_7AQ{ѷY,ԢbEKQiBvfSWbiW,HR4hD!dT:nVZ4`qD3Ϊ[X.aq Ȇ ?$=Ҵ}zs3\iQJ2Z}ۣ]KKpEWjYsR`\#78=3,MEsYu&67,^|- .vسz7G/ i%i%B\i.>hׄrs؎xЕ=oû &^h<8&Wl2mSI':mVYq#m"$S_AjQ:FX&K.6Y20|ϵC8X|:b ,^%eI±}~c{}`n6˜͆_=k$`Y}cbSaUL9>#GUlcHB7A;F` MBCL{bu=/Ǟh\9Sb,9[%Jy~߭4)@|r^ɵ_kUAlV)Zsb}m~]WfJ̠)c% 2C,NݓEXEsq2&VЙ@o3'1;x#*P7`LcJZ-ժ|4-[T;lMP;Պ6 ب\8;O]i Y`. R S ƈl.ꁌ3 1IAW"[s 5a~Aɞd@d.-9Uߕvoe[fӲ4>JM·?:)Q6,}51^7h|@"Vs'qZ#ĉ.-gvUkcMI@5)h_@"W|fJw`6ltd"go\ROu& qklyquG]]֮ G+Zy`pab5E)=B2zi@/5٬*^wﬗWuoFJ$5u'0$ TʜV+Ȍn*l}QR&˵UnZNkމfzdA$Ģ@jelRڷ/ uWY䮾^?acEFl("!y,a&{h5 \,P6>Hў8Y3Lz,R v Q5E9'"ߎm$ t_weaWۻ?ZLٕ4œ?}݁-\DMr`ʴȍ%T+Kwj@ f] AL Sv^Y8B3wa Mu툘#/ hXX&p;BW/מ?7Sz&,H~JJ[!򆯬0FqQ(#`L $-ľγVT_rcGܽ/WŴ(@xRO8aʂ9OlD^/K ~km÷^~rYzMNt&IEAC&ՊURNINA8"{{x' #h !rtzvh~-*E )LTA&_SkiL5p7o4$ ͲQ wViU;zRA堐( tүPtݰgNo֧+:^ˇ w>RhopMZ B>&AƸeq@i9(S>(JvMNC⊘o̡2Y[f!Ɂf%õ`9t=ol U W+n`҇fª$ gh{K#qך}w^H o-o? y[}5o$ tN܆؅BVJ6-_jAgnus]GVf2h.paɚr%K,kAUg/xwm.CL4ObKQZcTZ4ϊ'yƧ"`ϝ)ӺX/`Yu@)&%kN |Β:iNL]8.Hr{ws_/hvVi/ssIP2QjdI",Fl͛OaMB^bm䠽=3۫v;[b2۫Rm֪ ʼC6ӕ*C ':PH vfYLї;W'06i@Z> T`#8c +SI5*[vbAz;@$tjHՀl[Njh>[7t !߲rCfb9S0aiq>4qcB4? ‚ƚmǠdp.d5?d#.VvlAJݣ[]&SÞEuV|ۺi;>eؠ-oH^=Gq6y (~ђsž1+{D4AiL&4:vv0zD@ZI֒ ?b8tcoA>sN 5kzܔE+E򋓲]/43tUJFvt Hh3`"QtA1FQ-ʱd٭:rчWɲ )6_5h6kI~UIg Rx)M$ԒkP L|$JqlI%]Dx)?N0RD[ spf=a+ETc[&ɇrcڋC5c[{eh)jEN: c." z `0dTD11@m99S'$BXnQe['{ 4ye(֚yK y2LaoUA*XZhO,dz GׁL-Q~̧حkhoZ1`y5Eg٪OPu89ŸyNo{5jmv鵌"{n?򡕂J%fun5f3"HfP4NȭgIeJ'&U%?#"\d8ײP;8B38`aBxp[sRiV+@/5Z˭[ki6/%"V_VX RDG8`㘁">:s21@T)+?=.yGeNgdufz$~߃Vj^hm Wbj[==ibVѩ[:?\F$R)M %sJ >fư4Pdfl %)v FM?-1)aEvC%[d-Vb?iI9XxJ;os(fZ{P 0K@S :kd=#g3>s#)"}KM3Q*q>g 8Jc3uw k%oeѼXf M3ml˙ c6PȘ|;[p" @{znr?lx&(P{B>1ħ\8_ReLhM_~iܓ5;0L")'Mɦ0[tz v0HC)x˨-tjP3٭\="_nF"hİP"`aZtl߉\056oFhM|m$%=.gW_uMcjQ3:AFhNznVAgپF"3o9OCcH]dQ7-i,Фٸy *L!:4Ξ;dߧbʶ1=#MNK=ȭ`ܟ/zL*~trnOodVD.B=t%t{Cݭ{oY.{>qJruLN\8=' OKdJtrg=6hd i+H8=ۜj6G 'F>Ac)1lni؁mc (/9J&< N)Y]ϱBpLhRQլu󹻮Gv9Y~Qi1@(N;Ug9 w  O:E R>:|Tu9 -"+9Q%bL5Okh*څfY(e]e59%a¶ڛb%!x kTy#@ Q<MVNa!Vx=P8Uyd  3\Zr_n픽c퐯{&$7*OK(6mv\K2g|tx7)MD P.O! . Ɖ|٥בOjw^=uk_\BSAx9!d-72frh0Erve 6 Z`?lN7'("Zaa~Lܮ/d"7IU@{^`%~.17͂@ `W..mӽ Bne\%ԣڡ>ʑ{ǦK8zۂ:CGLJQūDp^=n o{u0efg5f`U&A4RQG߇IZ@vS-E'CxvUpj{ Z`w$Z-rT|J&fbMVyëҚFvs#Gqi-b-?XD噿uz+O5\aXOG1J3<&Wm]=ŗw>En<`2 Z'o֏=#w|f=SOP<{M4MQ*f!Tf++_XB%Z')?(<%q]Qẵ˗$BlI9{MZ3Y>,~Yee]6[Vyn׿wZOhH/ꛩ-1Jz.y)\|׾Do^ oL2ԗ T} `}mUX[H>0Lҭӛ|_%&{^ҕPQRGҾn9UH4D\ܣ/'_wқ|]tr춏?p^bLtqEAT1 bw/jz^o:'G/v=M `C{N'x *(dDEjp]ijMI7ȏ<[ja?3ܝ8NP:?M#{?MPi%i78]# A7 ƃX#d_p?v_Qδ>W /dUZݓ݃ vx??Co6VWeE_i״0r?/<𹗈͞6,CJݱ*uHXVO<^=yYj66YCawT~58(G4PheC.c`5XH:sP ?Cl^`qnբ=6x鶹aesq_𜞛 fCvFRE8r}5xcW0 ڮU3+5#1i8r:mV'WjA-$Q1aEHOGLbx\56y6+j6=KwpE ݢN܍$)6O@'HWV$րAfY/ `иMVoi &onTO*JPC*r,im ,IN^L]$[']dLHdw4?]~ #1'dnd5I6 y-z>NJ),kqVrL3Bbk*X-ۿ:\\a>0+IncN˾VNX 9\_ij@O4NDly"{N'k-Tiœwh ԾN7Z5L`C`?59YeM uk lH5Wtʠ8G{]j.hu81h%r UJ* bn)BG'@{ YErC"+fBG-o]ͮ|- \m̚"!S z)z$<ϣL]1t1[lJΒLS8GvbW>H̢M7tyomI 'Z$+v/i&&(i'*$`j_iQvTd^q 4ӽT<;I䯾j ?:Gg9*g:+i5 \yl^4G3o w|fh])yb"5%t2yќSX6=G1F_~LŃP@IiA-\.xyi{h[<MdR{i C= X>pt,d:Pv'.;P!|K_Ɵou*/-mocIT v Ys {а^(i}Meq0kS9 K L;%SvDŽ9_ۿPODAxu<%%erּ91,iυ/⎖V&>,=d[Pj2:^<ӵ :XOx>8+#6P` F e<ǹ'w"SݛMA*BT+ +Iph_R9f^f1*jPU('???M?COs5|ܻQsЖet]kS)3sQϛ F#m'l ֓ I"c}FIm՞v=fHؘwaRԑ,cc~ +4$G4.g ׳9+љ3dsݜ1vxl^%5F}kZ^r#/a[}z0r˃m5)`YV$Xʓb3Hw~T [ۖ:P,EgĜb_S&)K8'gSAVsŞf6l!Q2Ҫ8]&s,}ahZ8Sv"Ȅ] qjtjR`Rcǟo>QVmIsY7qIܰl]3Q6E㜪y87of$ZAeuv$3tY ťT#ɢQxL SCU-=38A?*{JnL*w@Zh &+msAaxwX32ɘ*MT sA%R gwyxQ=|V? [5g}Νwn=,' } }OsBW34eRgS+rm$B_`r{R4>ߪ;FIz\h̳}Wô=I ڲĽ# sl.7οR÷ՙY^vˊjc3MZ+YhG[yV`ֹ'sh;3RC="0Hl5ro'7:2oLWMxN͠g^ +f&sAM9$uǤv$wh (gsfFG^M}ZNv2;vH~visZwY&FIy0dgu%jLNDKT y 4عF9 !lbLC)F?5&I:uTrsReB! [đh>NiI;t`zfjl)B*{e$*@)w< }pqjcB|iEp5*%@JI6 ,.s \ib6Ecg'qT/vB1B17R< SiUP)&<40h;x0á'NPS1ګiYwI"x1U;(z Eu SbFiͤ<:N+# d1^U[AkIEQFեrtȒ< T!3㌩:&|f_ t&at$ T+fHM4ud)šjIT ɧgh8V"K=qASx'd8f4q󅣮~K8ZiVizՊ:_jWg]O]i2};Q܎d#4zH‰G=ؙ#hH@ws.d03&@w*~شh 5h}B"`!h!ԢRH6 ICNO?aIeeɩ{a4$jj3@Ԟ.E} ^b4?d"ArLr3:|h."#T,rl!EbpI ܅s &"ubbb1;<3 5gVZI]+{{=^.^L  돊Uk/:8=0=CTH/=@r0'%6h sb1xfPyz1iA(9>VIēd,h.ԳZBCK&GZM:r3E=Ia`DcKJ][˚i7UҾepOȤO\"b1J2L@~V4{7;2hIȜQָwO5LO]v+9Y.T7Ma1s ^6iPzZO=rUV- ׷ (Ձ@𙵫'(Y0I,[ܪ4?}Wahjrl&rSHW`iʎYnLy<V10pG<:og:'E*dn:OިY@;+/6M~fo]2i[\lBxU3{\e wgjx4~vFT*ڡ!Ȉׄ H{n^KbZM-%VV!(@I}_`0$!A] o3=Ҽr4WB+VZNs?WGb7GkC3zЕ7g"g\Z#~nq I!9SO>!*ڜ4ދe1~\3Y3BhQOק.ӏW;JdAKt ̤[7wӠ( ?)bŃLfBJ۷Jy Nhp?:0c4xKZh]X:]Rͭ_t"z= %~$Fsv|8褤yuJ_6opx#7G~89Zh_l◨jRU \yhi6ӹ! PJ/&fCU6MvLϱ+Bݡ&H]2vfE`X*dMK.$%<Y?=W'rI)428}~ Jl@v+@~~RAn|Eӛv4^/kWp/ZMNEb4Ӣ E`cp`'5* *Y6vkm, xjo_AUhHhO֧CYݴ e"E[>?[xNCNAciPQst߱#HR5B=Z5re#yqW 530R0 쮌Bz;< Xz543cuf#cB_Vty%ǎ2#u >9XE e<߬|w/}yE'c~ <|Yd)Άm,l0~l(olOpG6˴0:0ٷHb XhFps.N bޚ#A]W)7?:9-7K٬7Xoۣ) ʌeF#553Qw#Uϡy@L%? m)1evp.o^4E/J;c{n/m,\,s<4x'ms>f QA^='ȂTyP1 -ImuZԪ,8eF(K?$IoF"0КKI6CYUpn,|jrx׈%)%y5Χ,ۉ9]b>O=]Sf% 3 GLnQ3cyx] z6M%*);hEN){e5d\,irt7&*\^-%mk*E'3mΝB6w#T;zߞCCcK0IZ)>OI`]qx0Y@1/MĆ %hIFm w 3Sj6Wϳ0{Go+gP6f9Q̛M;UCSZ+a`h-J9:]f \fv&wE@ږܿqaX3Ex ')<&c})ĶF e!xkML~-gD7 Vmt=uʖŒ2Ǯ[4jQQ,Su>_J90nKCZVi6ߢ+K v} 2۫ g2Yq4OF y$ÆÆ{A\Dg{/w`MlS&c`iXz 7E2#D45& [$ږ-l=D蚌]]AXٮ_ߡNY8C{c"mF6 6ohȄUfDjNz߰8)M{,M$}Z|vf [&7K|Xו2xvI`ybsn (iȎvy4'[?rs1gEiwH_`+Tk!>^R ;tiRMjo؟=~6cqiJټ1-hsqr7yf4-IiDx,SSdvvB*1+sv?gm0a,3d4&ÆmPc`Ĭ!fTd$n38%(jn W-^TkY]ͪ7n*ױkL3 M+h[ +l=**Nl|{nɌ7sfM\̪:gtb4jptJpQPS"4' FǩsQZ4wrh kŬܓ!&K5'S%\v tQHn:I-3ugKH"lA<~@I«5y֓$6D~[؞wIM-Y5mЁ/ͪUofrҌ=rG&q"s5w䜎MH[RJ‚m&`FaC+s ypܣ|/q7P6˭b;"vgƫ;ӤxC7My^rAc,c4B ľC2QlLV`Sx[bvICDB X@`=$# '{) SRFJ%T' g#UVIC(izssc:^K>V5zۍS%.ͤ_=8&d Ւ|ڍ#N vl/])ɺPU@hk]FobtA tk%mɎHSt]HL lȢY/0gZchxv#'3EewNT=_of>pmegBog@e !3.|*0)9Kf$3-&{]DXi_eg!hIt$m-~6ԸirK L7.ʴ<`^AJwބuE8ٴH&˪S$3qQ&M̷Q'TpkG1)vdzs:A퀖Aԩdxʢ^g67-Q6PW1GzAo, q .i+!$(208E+؍BS%Phj& _gweqMS+R2R #dR!p@A<@ W N7}5@~ĉ]hR3d(͜f2MGD~B/dZ̼La;>ezMC!5ŵr\i AC5&*EG $tԉLbI97qnߡp@Vǫflfu5xSzN(u4< 8@k/0K"5&V8 9A i1b=Jov ـ%bR5xQmUDԈE7EjnA(  Qсp} kdp=}3l~Rnw©qeR4>o3[ӕzށg[ͺ$5B )XpaPn*^4#V1I7'ˆY[hHO`fm%f{t{ (ĶZ0;$Ic̆!ȣe K/?)\ܸ~}xt.0Q6zm\0a;pa9>}Ug'HA1HG#ݽ2 ‡'byo$AIS7A=Fmv M6%QF^!x_چD2rѾ1Ea}vHxķ= 졭#+WjENӸ0!Dg'T<#wƖ4OZh\1L ~lE3tLGS8}@m6^- BBr+1 9#83wBoWPuk -2   %"IqqփE?CyWD;S5ӡMusDb?#47}g{ TRڒrSK 6dO#o3!O_Lę D󇃣sKuwQ:Z5Y; 4H)b} թ?!<7(g  +xѴ"|oFgJMӕ( k;:zӻ%,g~x}N i!;Y1!c;樧\ʨ!ɘl3̇갿0+tN/`jb3E"qPkl(K|_;kjٿ#J΁$>19 ɑ{6!C֫?[oz)z˃ d{aM7#љdpoWQSϙO|e?1¡@m^&{L4:ZvfUc@<i d1[c?wE@y];T^4 .fzC JapijDb* [#+1C#a(NTPH˸=QYsW~EBy_>Uk5M͔dFt !*ka|4:^S\?2Hf[mMY4PdaŤ#]i:vp._C۵"q$6!%1^R) :Ui%ClN$:P氥 qxY{O (vEr47aRqZx4w9sbGx==O(;f;>2Jm̧@@4P(!x_ӆrMNd'|C;ݝZr~> qTf{$ժ:KW5.J .yr;Ȋ"D)ǝw(RazC =Lzĵv>8RxB}έÃY^CUdLRcG| Kx)o͑z&4-a9kr*GxDwOWv#5c~jprR̼]Z"~o<\씛uU{ ̼Y(Ll)0+&CRlFL扎KJ5R ~~TͳJ[mJ]F(_ȇNJ( J0Pk+ncM D 5RAŰf0`q<ʆyi}|v Oont9fYLlND_ݷ +\XNy8DO6- kLRsxpZ~JwԢjsȽ/˺m3/&̚zۿiGnޮ[h]@lX2%W$(gq?(;\fά{Yy8V5xAVSG)z=O>ڭi/n}$l'^LĽ8 &9Gʳ/QDO<TqVcjپ߸Mo5F>߂v0H~ Iзy){e[G)H-[y<;3W>YzLe$Ԓn@}=4w^*]W-&9d6Vkd4,{~B>a -6o{1wCz _+[ Te9=x7AKdl1e')79jO ;jaBѥsI/4rgH}[N21sq{9b"=^gp4J1<᎕ݿLLKQ>yv/S,&t9G[&)7|G8<538cVz6ʕO/34Kkn,}q _aW9SA8n4;B4Pd̫{2܊OT5Z$ lm/gon~̹fB5X-8a5YJ-I2UjBMs\oVpQL+9!D<$A($1 @P2fCcV++X9}m^#5Ho^7١~]W͢jwmш i,™U*oqX㚏%$TIENDB`nrepl-0.6.0/logo/favicon-144.png000066400000000000000000000436441342636505500162620ustar00rootroot00000000000000PNG  IHDRF pHYs  sRGBgAMA aG9IDATx}߳eQ^>ΌdR6݉J@QD=JU^(2 ̽J2#^ʋS*!&06T<3HI򯙹Ykuݽ93ɖƲsg[_ݽ:Dr {r;NܺɓҎۼ9K1:E~7ęǯq)}pSW.3Rbn/g MW9bB>OU?qO{oZ~2 9KHp"C=S40oIjXJO]ʕ =ybq_o{T&ՁHE(h)(E@O:؎sYncg7>[*&)~D~ie1ظ'6Q?$sФ 3+(իJ){MZ~a!*Q)>Տ.0 PRo6zRqts&hsZrDwQ4P3f H'.@&l)0}c L>' ^XY1XܸZMAWee PsUc^b 4)6$:&TTq u5 šp9[W_;Vp}8F>n_"Y}IziK0Lzi 덩 +j1/QwHzo}O̚{aj@L0 Al&NuNvE#>ELKF!C}Dt+Aɽ(+YX8I 6N4׾ "52@K uH݃S3Ȉ)6vM /\Sff!9< FJz?z#>rMDߪ-( A(UИ f2E~zsgGjAUneqna]5(wqG I%ENrYFoȆ+Է˛ DlJT38I ϡڬa` S^LAZ\e䰀hIl H߂Ēk1e~CuPKcx.#YKBj5$-B\uo(H"QBIpA<ݣ䦋a2= B{:o1问ȓPLB,uTee4nϝt.$ȳ}F?ع;]F5P ,)JE$-GY17cE_Ar^ /_Pw.X#t@ۺEg,xZ `Rw(L >H'ss0QfJnҊ/ssnMi5?QOo)CLD3PUՕzU|$t/G+j%G~ԉڣ9&(]_1 )҈z b& KE( &)䂜1A#M#i@Ҁ/TM,),/ 1 : məYS6Mbȃ+N4|]T$X.r`UYc攀Z(17:xD'kp)f83p<6W? l+ "@Jv+TMŴL!_y8zpn'ZX9fZOт3`7e`C,vT m3 &  <}NdSm@UD| wޖ*43TO7KWy11JyJOO)]@1yz,Hw%l tg0Bj}6f{!jl&JȖk\=&P/MO}_GC#m_h8 7ӎM1O8Jċ6˜s-5_ WL9Yj3pzOHtI(N&^yW:fWq7ZrTڐp£Վv@u$sRNrG#i%Njn_Bob[Ӷ&,cUEh4E(yk}2*0iB;~tG߹~|;D0 zSl "ɨ@b@[48-)rG7z]v@_s|YurJU{T86Clt]Eb",'l>=W|-FãIG/%xv-+ugt.[/#kh`_3ar0~|lOsVhrJ΅E*BzH8<1r3fF`Cd"[' Tƌ zc 4B[S;2tPQg414VS h)2mM3To9DCs Qq΃݇BY'L=dZzG(+ 6p`{A2 ] 2/`ZOV".8hY\v&IzF@a,pzx31*y~K0Q!hDu@')ܘgh&@c D 22S  MQ I ?]vY.?="YdנN>k4bWݻl ^sU\C)cN) grD؉3xbⲃnpͯ)+ƒ U@96(a&gZ'D39 y6w* ]u+ ӣvL'/ڰ'i.'$;z4@aJ_P#JuN@%},UϞL3P ݆&7b9˵H`@x0H"41)>XM!Nh&ޜmsx gT5aϼ bU "`_`M]PET+6}I7tf#P2n>$1\I җVpDuR|CA|O8ڄL5q`-}}3:6[8Omhn8BfUג6WNvQ )x,i Tv9mD4ߐRhbvEB1[~=.Ի]pPl($ j"II&$g'L$ .dotY7jgnҫ(y//j\š<c43z΅$8D?poZQ..fKB@4;f)ɢ^(SlA؏fȰz&zZȲlKǚXf"=.SzJgC1&v╃Z [ ILE[$lX8K->hcJ#Ǫxj Fl!J@2s9&ppLz!z((n:ݞK2aq}DJxyZ9R;vT+S³L2,U:qwd)|utcR Fb!č>T!zhKXɅ FI TAjX4ŗmgϑќ8e[$Fb͠wѹ߫Ԣ1e24 V\O]we%Q R)MF04{\l !趫RxeW{kWR,p C : P͈ glǟļJ~.ƟGb0QY.b 0=&ů0Ku RVYlĔ*ih )$h9ZAI9Xٙ kp_ݝzvDg͋UiOeI_V'#2in,T#f 2d~. adr7̘\"0FxQngVSC%uJ6k5Nby&ZhϦ7&~jzw];OL2IFɏ x\&n>ꘖ߶gx4l]QO-T ;oK̘ wcVܰxFݖ~f<3lƶU)(vvߨ?ŌJTdT|{OeeUQòrTť$se\,B"y)k,><쏔y4bZ7!뙁 x>/nLf^t:DS@KQrz*A%oLCeS0#L \Ⲿ ;;^V~ͩgUM-;[ b)8wmA9@:z{%=$sYi+ޚȨ14Xbݫ1IUJ x2Q}S+er@aP;]$A$\:Մ#II 3pHCx|A5hFa`?]*e5&+aJ1шy֒־?.7G06[ MLv83x͓ Ti]99Dnr3d&pf`ۡl~ OM Td `,i R4Nh"yA=+&;Q"3:4S~د%7YkK˟UїLQ7c&&׍I+7&-F(bh0D,>$ZvGc\|Cѷғӈ]f >$dWkK9@%A:K7С+¢̶K?4LtO'Fl!_N:3z^i$1$L}V&&'ZN,7L }w jKE-XAcn`ȍ79*}&lDCg)`p9iI1FNi!)8Ar!']n}n.tm 8#,cCaW)fJlbkm=QHQ}r/WUL4qV:l,T|Ԧ^Ze~CM.X:SBJlx[0L̈́vhIcG9􌠑t3Vlr|GFf@I%`F:4T>_gU$z할7ݬ i!.9?thM8 =O_ :ժT3&]`J=h 1/2 u@vNc&)[ۡKg0< !b&0xHYGbžappNȘ^.͡a¥`&'bL:M06nh&p`Y*:~Ng"A_շ J-Y4w@/@Ƈ:4>T|"Pzx@)8<h74ޣB.D|jXelced IM1%KV S)Q f]|9{=.{ij] 0Ͷ ym<9TXw&*njL͚ cU[Ӽ(͡z!pa7W*frֵM{)`kK/-wrKa4c"gFYۊ'Pm;9x9DI mMZjQ-\Q]A_Z񭪋;[5%fHu G=z>_?A432" >.ue !Ȁ&^17 +q"L*AD,k'0 :@u i&]$]/N`"sj^XI5g_jU= z".zlK_ 0MidJfsnm<QRc>;q1Nfid3X &>j$TUx:4 AkZ#bbU3v0"$Ah]3͒?CY Q @s{D_Z6_V#ZPκt ۣ"Jg!qdYh2R1Gn D1%"o "1n. 󬟶xaڗmF@5Hfg.*8pkӵK0ûI$\t6LRb_s;f3͖qC̺9릭J,^ԵQLt_ U|i(,mMgdyəT̓X%|j;G$ lij2hQT&f/Z )F*D{X@LX1BrF֡53is"i{Ş;YkzՂf4hƢ"jpoБ9k6)>Y`C! Чt k ?PI碒Xbwv<&q~ʎ" )3Tjq1Ë:4x`,)fP1DPh0<3_T3>3ݠ!6tդU43 YEvAkOkKgviog,D1YJ|2gŒŒxYҀJdJGlvK:#3Q?/b0t 1tL mgǤx$6lv}%n3g/6MԂ=r]ŷc7c}qZ˟L6tEqΞ_X"SJ{<ަ佥sA8)[/l $^"iwdP9)%&ҒCn P`0_`h bg}d.F~tM d͓{b9 Dm nCs"}yyirZ3FD30O/k&1'w3MaQ}1:Y='4"qv-2vr {ޱW4s*ҶLI3Sژy:sA1Q5gR2Ѵ{k$3eLM:4 8w0D9H&dEēybyX;y 6`I;qu~)(SŘsCj=دy=RKIR쐛@͉\88w>LA25舀cg̖^C/RҘ(x&ׇ`̢c52ZOEM:ňB#i52F8$;EhR'k?W]{ha7`o4$Xʐ̄3'(6H֗,\sƗ{ &Κ-m/4qNlץ DJo_uA:rF๟!Peߥh}o#^>"5ga']9I:~.9KYe5}n`-iZΟ-ML}'j82sXѪ$*zdaGHwG h ݱ4UQ<ϙdGId|]qêq'@;꿟i :땋j;xK돛~4DAbI`19"?dOh?bsAJDI&* H8Z2aKu$p'K3g DA1̂ANmVRALܜXT&qdW*Gg/&Su1DEKpba==æav(f]2K$@Jms#D!`JK] K; %dILz=f@.{yn51So=4: Xww{r"pO*i ;1r,O7%36E|E;.K){PV=NA9GwYv- 9_ͨ4k fxZ]xiCr(a6l4QWWXGٰv8L'h@>G-_+ѓpn- K7ŵd^?*X͂6?+l ?d}D=PkN=7]k&4XCP<&BFY3zO(kr cI0Eg($vF;,G~~pj-|&^Ӊ7#-4g&}0@ D;f lVҿ;O]S,/iaQ?`O>)mR%Sܔ{؃-5纁*2刄Wۧ`šz[y{7_95,brA?q_wXY,IOdiIO%_g4ee0MOѤ9E.݂h W@4hG0sS& 7L-d},h&rCa/i_):%@}k_ hrp41,Gg9Ìl2+gC;yg%34KV]1Q4&N)RHd&U1{?I4Bi [D i<(Ģ`J7mfgf\::A >ۋ"OVvQAT~sMgfΖ;OOSqavDXfќPqD~Ȧ_D $1wD:85P˜_2#Q!h."|o*Ov &o۔Qh>(XG_jnԟީ,$=3g iPu5R( PŬQ)nRZU N1QJka65K?XZgω!;R'ξiN< 촙$F2O83+sbS[rc;sٗS߱"}43IG<)ݛI i!%6E$!,*mZܡW*{KnWmOIS k /j& S6: p{kOKS 4=blCӜb|p2w NwXbXC}I'-Q7 "aZOP쓗IhB"xZJ̾?O . zVӱ)OxZ=Vф=uB*L>lFRk,KZӱ,l7w@]-U_bUǬpevdso -臻. 2s90b L 9c&T&ϗh5䴉$nq B{)fhszF=M)71y~g3ٓj jHI=YH]g\!N7:[T!Q1IɈAv ታA03l=>+D7':GRw8mX Yb{KLפm$|ܐ[3,zDc3=v,Of+̒}PQ;EU:gs(M#焒t,C|(Hrh*:].F 8ES*ӡa;B ,Px%jy(+!XcP¡ԔpE71:@Oz.eY(XM`}:xc0E{S+(4ĜVU?XrEP8̈bK:?[ȯfcd\oXQo=غ#ʼnykSo:iF1G(| 7PL ާ ,cˋQF?27<@R AnJ\VP]aq4Ke%D3IkQl7:/~x;T4 E,hb(hWռ$-R# ˡA޶3+N; 5 JD+| ˑohab]L8GGחsg{c)6&d8qx4o_bV1d vJiԉXy(s>y[INcIpH1#zI.{\5޵CϡfEVl<zN!ʬIav! lF! i>xF0SF iv_7J ToI>ڄj[Pb藙Y)p&j5n}Ȯk]b18 f()62XP.,CToSx@}_Я=%lXg!KKP*<ም4 CMDͬ5-|]Ye"7gs56j.10F\w=W/2 Ќ}Dߤ10?vX˖Jҳ4H9BP|_EE8'69w! (B1I_3 s,:B(۔wQfӢ1S_F5aweڦIJ=!> 7I5Ƀfg $㓒x ] __."‰ mp<'ϖXq ~Ǎ1ə!@f1Tk*&̾1"報V mﴘIԌydW8.$+xD3@C7yl40̒h%DKCȀlc6&%!հP9I#Qak*3tx>͙ǩS|됡5z&-fE(ukkmsۚO?ͤ4u3L.94/9lwiQdZYCi Sq# wc8Ep8 o{/[Sx>$g@PR164wLcp? Eo*: $G%Ljp'_ۏ<؄ueҠ2|҄HHvO'0XL3mC30 `4u]h!0-'t2x[jAC,}N6. 1Rb݄_b E`j#͒-FĈsN-IJrsߜcV0yf=U zNb*4=a:K]`y&fd$"^J`|t dՀ>z ]2aCgfy#m0 q `R Ȋ,`jo;&6H6ItEc_&^hk"5g.1R3Mb`oWrӂn1<]_TS-ؑC]'d `84P^-Bz3ǽks"LF0"(ɰلA؂lG@^3e:K`:׺x+gkgg=0=p)?m&=~8&vl"SG .O4yڌa AgXmo&Ạ3&w|xq1 7zެ[IM&@ye^Ɗ?1bqzu' /3!#:ނEb lv k6N -䘌oܦ09z%PeP錱{ˈNʢ8((4hqLejKt1(o|^h4" o_AQ뮅Gy_(lu1]ӶV㑙$ ~N6<2H$ MS,)(5&CZ_;bk?EL1q̘ 30%Q9Cې28E9bDK>:놠2(JhgstI[#C11Fl{ؼARY7:7;)&,ƙDZ`ñ30?h&@ɦ,w^0Pf <̻BAtcD:2P@er=?񵯜)"恹~iH0wdF} k4p][SXh?KNg0Z57; XlKvuOU"EqI P}n H@ yz1k3KICbSx<.;?e+#I3P`bpQ!t#ZL~DknW=w>݃@$_;:[&[i"<2yK;w@ _$RxV &8HLl5u k57FpQ:aa5f z>m&U;>4Dס2ϼDU=($uZwSfL<26̓htʏ-}m0O| 9h_bs=`ǾG{K|ܪ/,Aا|]os T /ktXz2BUz{Dh讬3@te=gP:S] Pڬ ʐ@Nz݈6͗cx~+l RgZ#Nudv$xI0,ݒPt? LƍǷj.7j}+HG](^ <( D Zl[T a"f*"@5*L?ȿP0W)t!9?fi +"0lFM) t޸t{ԭwC(z kP fG/kXpr&cCY:.af&7OA0Q!͛cfm~,c!1SJL.Mah>L3 p`q ([l^;DK.{H@DCd@]7Hi w ]r/7rT K'g6S s}sq0qip,aP܄K>8]OGB;b6.Px>@wcQ ~C'>@^B##2 `6)ۓD&~C)X[BY3%Nٝ=><<]_>c]D(qt-ijײ*Z ǎhH^7l+ D5| p(f0,.Di)-w63!Āb;Ms}?8_fwv3iQK"|+JTvQHrsƱdKy|<(]ATyIkg,2cun%L( c=7 $uH!KDiTNwj.?Z~ >FآqFI`HfVc_DMwѺ{zMeܫ?@ wHdoypk(bf@]fn~hqn˙񄖶"P-_@|xa'.ѷpi noD\ {|(%ʴdFٱ/l%;72`ЀԴ5Pԉn=8]\^/Bl|-{sKMRP1$'} 'jRӷi c?f=1{&Rt 0.i}SK[;[Psk->wfq>|Mt'=zO;PDTX@N|x+*<"(xKUtttY(٭O>t }]&$J̝x0I$'UyȈL P+7_;h:]+: (b ui;0I<c{t)ER句5s"7a0T, 33gD $~=yvtzk-zdŨf19A\9{xYƽ*D5!aeB<)I-,4uk^Ҽ[ә*S@Ӌ"UUXסW^*#ɞd~"ZkN+fÓ;տV&oE5~k_'8O^5IϿ̗/<HI@A:l*81Px=QP4iz}U*o?V3ߴ&%^cEQ- ~`iN:Ib o㵃}p~+>1>vW_yWɛq*r0Y[TY;߁u3`"F& =&d-O30& VSy=pg+};Sݱ6_Ehz<i:c`TW1kK\:p[pGt5_kQGzśj}L(W M;^MNxtdX"m_}cƱq`zɒx,zQC)ptvU؊aqk_3پ]8 .Uv"J|kiAh3}ӯ͟u<g}[5Vw>疳֊x':+_+TMl\~`+C2ajfF=PQD8>d'ƿ~FOtx\%ھ3Au\^[|~7hJcpmIO*i.#_cJ.~PBLL R(=8/3 k~ۂ3:@o$f:hzC LґaWݡkՓ##Ia0Dy+zyLpߢ㞽j/~o?pTkXHH'Ea<=;ѽmuw/iMN"#.>xI h)]0V@GKx`t+E1ak?mT<{vPyEjFG'56Lr8 1ntx:/:W?~wb/ֲ(-a FfYrL&%D܊ q3hicVR&m vDx-9r7@l\f`2&!eGB#2`T3FrVjqaV=%Laq-e G*)o{p}Oo>VFst5Õ^ʻ­f2ڂRd8ִmtv{{<Ag42 GMjYi]>X#"s+bg-(&%B}~Wކ_#'F͒\ X`IF{z̜s+>S0' fbJp(INh1,2P}'S y .)o|z-G2N<͒%Dh+4 `RArzkNw6l#e?OG_7'13L !@ѻSf ? ģPp-_W'Jn M䱇:v"Xi@{'YGtWP) BYҝXQy6]b.@J"pqd2Y4"Waާ>ؖB oap}k8@e17_PC[գDk#.:-u%ASw*E9R<8=>鐑w^\&[mZm" BI51W 딙27~- ~v )+qB} TkR)% 9E 58Nw-fM0b1)Z (s-C`D gR!q&ns$ůчi|Wn0K/i2qMBNyۘj|7&;8LBwXpl L^GPg``L$"ac(wΤ[\kTPl" c&L_O3T*8ba 9 "n xl@4"G6hE+66܆So8088Vb l866-2 lMW;>-}l[(w@#^W 3D}^O4F IDnKPUgU, S c}X#H+zEx;=4fT62a53,:J] :^"iqڌ7b9) \J/F+z (Q {: 2R MţTވS2kj5k.ω {9-r~3:$@XHe 57ם%vGq\ XN4SYbY}?`3pO06VV%oC;YqlJ[qZ}kuJ\@EejUɋ|}soWT.">.@|}㖡PIx)GY  !%}k#7[\jbTPVaX&[ -L5ַku= E>-}߆J#tD7)^nfܮ `Jc؊r>VU a3 Z>.caQycb v 34E:i16߹o]z"yL9I0ɤz#tH@2맪yXO:<.VD=,͡a,2*%fn$g1IaI,d;8DggQ̉}KZ_.{(`י)ЩP ZRiݐZ"b^c!I"WfC?Jԟn&sI $2H-{+]g$*o @o&-_6<-g&%@#;{|=s+ZUHkHLU9 NяSN$PPEg/|)o-j+({1o'Z"-ܵ ]fE *Ւti;Uƭ$NJJDF*5u?174`AϷ^\n~x5EOGG$`vu#N_!z^(3 #BWS!Lo\0Hbg EٚBc +]릴'ZFbWƍ8Q=◷Z?#ȦAp#\X/7_1XX6FYr27Y.D1cGŰqjP7S/RkPfQjh逥3,vc{ٲ .qmTzݣ:@D,\9Rͤ4H~ rE׬!/)K%QOM-Wo wj^N-D-a M6x-`QjFP# =XDB*]H~P[oZ׋opX^b7NxS7-|@B@qCBGBCo,S8M ds+IY1L xc?+JT^ZP`+5<ēW=B,+SG1 C_mb4Ŗ:zYhh"f tg7]CW*hăK[S⃳?0 MKc*&@\2`ŭlP:bT9,`d4C v 3;?_:9YMIw3ZX>8PY-4#KM/%y~xAkG >YUOFDN,m鲀1xԠa3Vϭ8Sܲq !1N[{Kf{%ت4LCW?whQ߂{jL;9&ɒu,U8/$*D2< s~c2;4Xl 0#ŧ٧7%IX?5AY^ kJ7sT9$ `DUi0 CAddNl"ݤF$ht@ۙ~rn*EP0?E sAk,K!@r,~|\hk=φㄅLH Q*SI9SoA&0K2/R6ء"~t!EͲC)2-A]Skd=A6lPإvAX#wd*e8 #_wSm/4ZMr^e =6vՉL9 ʍ>G6,#0YY&tI=_LԔ9Vd_jІߧ-ڱ<Gd( 5ZkQB0ܸ/L(Gc0PzKѦ3ON-/;>h~ω MZ1&%mѵ~ `8&jרӝY) *d=SdD,bA`zj;aӻcf9=/u"Z򔙌yR&RYV 3КUo\y/vN3w 30WPmL1ZxqƽF P=lA9;KX:CPۡ/A-TII TX @ȵx SE;%P1 KJ;{}\\+(Fj'M c4j$+ h*{I2R };P^5nc}D\{iC9]V&{m{+Or7BR.LX^Ǥ`!KOq3~yb!cO@({kh'j07FIKo-fk^o7^w٨͙ kmBpOT#Q`Dp.M5Ďѹoz,e4ϋ)X"@SF֨j5[5ӟW+l;2Tp^ mxmޒ['1+4[vO-/_~oε7?ej]ZU 5T4jS17fHN=x~AfBdblZźLG[Xuuk0VWV2FPT1Y[E9? Hs $^\sż2skUy`[V6et>E'G[Niy 'bQ͟$dޣt!pwcj#}Vp+38QG3M1HK$HdeK{cc\k|1k?CJmI:r,˨-#fiB38#a ^!&JG,s"4 *:6=G\Dp"S% p/y C*214WR̜؆l"ɖ8}/:sݎ8Xk!^O}rԖ=u&A5l*p>aE'OB$Nyf[l_J SSQqJ%seP/=#q^g^H $F.@oن٠3_✹TfuX~c=b[-٨mSW}ܵrb޻iWSm!첂CLaO2JFetXJ츠kqSo/V4_$4+Rb^['?sX'_+ | r'siDʀt:lח[qA?`Ww嗫Ay`q? - @a2w~/]RLIF(r |&e?rE^rƅayѿd:bSio++S3n:LL@ق+Φi dÀmPGiR=/+Z~YpUG"x [ p6cQ&6W(3T&M:H|F lE4eü(Gt5pߩ*&[_9:{؜,͑O=9ݸE7`,9Hh{DRX\v2JS\dBlM@*"uR%:VH\zJtw V~; GY:`lrP~軮>}&o ,7eg\eMiz.`lJ 2d6&n;;[ ;F,.QfĞCw}pTqX[BNT&-OX/TN87Sa8HVJ%Rur~+z/\\:Ki h"H[ $Vͤ jJ])L.@Us.xFs1Le`}#lKsf-;%4o!}%NuZbiYa<^*ϥNJ#?_NEa";Gh @ Uw-KgUs=p@9JǙh[zpK+t\S.)& uqIE.k1)ZmkSHg@<Lɀ4L7 VB0Ԧ{r*<*%iAUg 0*樀i:ʱU)52]kQW/цfq3cY%6CsE$LLWYLR1Tjqdm2di18W;zӕ1Α N`iĥJf^KfovJ-7A61I7ZYx{i9]s}]\<lqq+s-{l*`6o{T5'UCMZLs*xGY'NZfqE}XrQmNY>-2T*B85 E+cv[N{uoͣw~ϮL ]gnE&e=tջǾẆUŽKq'ڏ*'{1^)iK6/fe^iM%*1D!8`J}0M<@8v+cK8/|K~p:/1[b>⹜i~XM`5l 'j|h?ȫERB,*6 u>G~kA?;zuQx'[3g.KrpO|X%[ e#"bv-A<԰ByB#lZ2עmη3*WmzTOWqE0 e n)ƞ%7P8wF-/@+Zo^nFF\;5i349',Oo!] ;D|ms"| J(n{fV׹E PZGPo{dLK0K6$4_<4m}2d. Хwv;W,)-̊%aCld <(#YԖCtڀnu./,"%OYʳ5)"XL2nf ]陔>uʘgVx<5Lyͩ2 uޣryf]g29D?[ځs`:$3H*Bn=V%@R&Ss TIN@×eXhU U0 Np}IiY~}tjXׅIFgc!|^⏨}|q\}Fjҫ/";:ٻ\qR]d L&Tp<`4+_zeP:o.L /$yjk+ Ϡ`bկpR4NT(SŬKs*%N@+ D*ƿ7J6"`\臑7"u:ZA8p`\P9+L(Qfs"$+NoR{a'e-.4 ˺KOXGN4Y ! AStz.\L.R,jAWiywk#bZD7ْPJ\dFOshtSXG1aϟޱk֝gpH2R%=Ap0u8:%%x^P6OEU-as,G{Y_$98|b T˂L(Dcyg^ڔSӲ`3\O`FsQž̧:pD,+E\It5MVz5I4e(; t4^U M,ilҴ6&8Xtjc) r)CKZXf(VgQP : +A$lMMXF'ϣvvh7 ޚ0Kabމ Q6S'4rNcS"K3ltBERd -oLaN[zTHfF2R1{#:jclzd-:y*,%`0FJY`0fKuu}G[N]XO,%_W^"3]f,rlhySF&sX)9ʪxX' &)e`܈ٱS5GpŔh5dRSY-e 2DJ6`58lD9EPǢ%o 2>C™A=W/tUJ%ˆ%+R7y}mb>RX"foO|T^yևi&!i&0ߩ=dr QQ=J67?SlF%{k+d ICal5 s@+^|ժz^l_r)X j,$Q:|5y,MV.bdC(d1Œ%I$ B&#Jg9H$&i)Ь~~x/Pb4A$f72⌵=S@Ӯ7*ovV 1z_*eUԍ3}M$T&<ļNŞ,JQ,o[f hO-ͷ^ W|*Crp-VD;kb)Y 2,Pk,-^gKl RM*X((yt!3sۤ4sYiTac!4yFuSjWx]1} zh+"Ed4rBm(2EM$[,X¿>w2CqM!2k@ZM6NCVLllgaX)X-6.'`ۉrl\ *g|sdat$- R"5T TG`#j:[  6 ^/dW-iAySS5f(25YnwUn pk"XmMg*e0:jORg5;7QeW0OpL$7MB2HvZa&6i~la`4`Dq 鴒1^! CV2bjjO-jhR2<)E+65TxV,W * h4"5'@vGK=-%ƈ@Ǟ>>p{pc"0"9߷1ת-Qrۚ 꼠CoCKTX35|~~}K&&B\)0Gb^-jsᬀJGIwF]qmbn4Zr ;3 +S!U2,ęx]i6!X_x_@jmwa-s\*UXcձHWm7C"˜!-bע$bh5J4 t>d"s,cœY$&u'mcEjqf8c}­>SL_X3E Ȏ /J M-]&R:PqK;󒜽Q8f?u0N5͇[h͔T\ i胤,qفDWz+ a k#[F!qYo~~,)*k'AaG78mrK66}5Yzxd6:%ݼO,C"٬ovәA7UL/F$qnʭ~m˛0d& f^y8>4>3%`zܩAqi@9}G7{2HiS[(jFYC/B5*2VWP-B#KNZ ,%TsPj)6h)уLe|ܐIr:h4Q^G3*|AVeH2S 20l/ _0L*äm!/U-v~@vSל$S*/X[.vv/k6X]ޓi v`)AJN }KS^7n*v 1_~VTg@gyX~,1WC` 'IA}ke_yTH\U\,RiхR<9Dq3Ye F 57n{i5~awެ]a@DDXQu#6PfpvLS Z,sY o{.8TDE, sLaZt10TFE69^ ͣ>/;>i\?LTu{@;f 16YZ`ڮ<\oO&aF#ٷb&MG?kh2y/k4C3mlrK r_Uy4J24[p{){SwRש 5@iO|[ ə>rW`s!槪';{ Rn0/!^^1ctuBIY4J۸g;:o4">m7WWJG/v檮= V:@20U]~2!| 06[VO07&6I&5?5oB-1JS^\jtJ9fd\I^qʴdjx́l,Sc8Xc-_:\7#<1 DحX F}FtֱY\0QF5tє~WQkYSXyROc5"U%=ZppCpTL\kc^A{oF`c$D wa{,Vḡ_g|I\%F"鑕s xiʃao,+S)Ӕ{*$k$Z&n+%:_iΊD`Z11^X:uՃ+8.x)OXqxzTo otM}O4ilR2lSSl҄͞o+cmSeYce_mN;sk2±_T/\v%=Gm*`oPrj&UsP`__E/r;Y < F*^8 o otJp@G .uWb<0:JsHRbe [pta5w7z15cW,謚 3C[U N >J%Lknx饟_/˔''ڥ#W~R׊+=jOHm[BoU"e 2gHk7X#_k~9>>o15GW}P+M y6B{$#hGZavpG#ySחKgw{_=|~zMRlўsWe-5a- 4M[X50խdq~~Oh޺_IENDB`nrepl-0.6.0/logo/favicon-152.png000066400000000000000000000477261342636505500162660ustar00rootroot00000000000000PNG  IHDR ! pHYs  sRGBgAMA aOkIDATx}fUZf&b7Q gJ6^@ Rq Iz1DLzQUp *RQT4qRH=սz>78d5~k?YZ{}Dnwvwi߷g_LlSQG;b,:꿍oWZ8c18aO:w/^|Nn/x[O|eM4G@R>?cu8WmG]ǩ9G~^['/\i~ݍO<.omu 17W8i:aSiٯ#~~ugTy}Eg{4^=4;_O~L^m,;5$2XjQi V"ogt-|y>q^^ml 7g`D@Z(07v?޾_ۿ^g?s~9stsHZyծ$4v0O+zPt Qd?g)xBȔ[s]%]oz#SWmƊp{Wߍ-V\0=1ٹ.;{zz?\ño? p~r>MhU0W@s #Jg-АrE |d6wlWy6J@#'t?3COث2t&E8yyjTA3bH:4u'8)unO={>iAQIFRI~믖\+H?/OCAI4qce - .!..ԳOw]oF?/+A6ݗ4Kn`k@fOkllu"J*@ \ʌSX+*$ݰF3Q2`8ץiLַsG]n>}^@r׃=Obĩ,F䪻I)5[ڰdH?_3_qU2R>i) e`x %m}T,T`HE$V!xp73O tIBUa]ʹ_s3vtp+C[KbEs`*5I}w~]р%>FDg3Ad: `QhCM׉J5zaC5GN_; U+!Gڋ3Gs2mty:iɟs=rё_5SS d* ]fxWH\m/6΋}3W֕C/%ٟݞ6ugy{0n[((pg{Dw'-"H"֚d=j"9?$̦etF U_xі P7_ az!Q5رK\}QGYO63B٪w?Kdb0m+RGv"7g-|cfpbU.d7i& 3bT[A 5iʹq ۳[-=0U%V.4٣?n34pH0z;ךtTGFH1}G8GW[X Ӣ "ߡȎoTup9Z7%^)E!` ;c}?chSL[2QN%;zg5"Kؑկ3//{&+}/>eLMd}(Sst]KT:ul*cɣ!&EDÁm8cBY- ^"A`Hd{d ӜM;?JVBUoJo{?"1/RhS ?H%%Xuٙ"KwPd.GIMli)+yIR#Z ! 6M tb(J94vq5R$z_+*;z!M`*6Ư^]LK@$Ns%g' 10*RP"%]_#'E[0)E^jZ+Q$d0#0]ٿ.lk+|7 ʡmR'w;{30WmrJ; m5ZzxE5MѐUćcyh$ߨd4P]kxVFO̥Si dֈ6Eo [Ȯf E9#.Nfǁzg qtj Y$sؒjXoK۰4ٸ\uݥ*d XQ&\UF/݂^^,`rZMԚV5Y~tߘt+Qg|9bvAGOy]c~ᘴPT+WmXB䀱g|J}:3.L",d.uTH0ޤzD_њ0T\ .~qaזht(+> 1) obyBbn\xlM0ˁLcpVh7H~zLWɩд/,kDu^|$A4J=djE좡 spޮ{_NV# @=Br6Ǽ < ƞ?av\V)d7"3;VZX*/'E(Y!nГİPF彽A4Y”U~<@:f %ז" pəJKK z< ^ P{2Q6nfIie#D%AfGR${)0QDE6sV3_BRq Kw8VdOI9˅Sj->J#٘* F11HƲ8T77-e0%\lu 8ϜtP.Ʌx*;̙|\u .k8I,J&FQi;a]<x4 2}+IŘEKՊ~R'! AY;S7nwlziZV^n908)ٌ9 v[&;Wee߆ֱԁ B2CaREFI=vUt W8/8g91T+ Ш%JiX4`- M5.^ 1ўx IE8M,ϙFqqpWxւtN"k"U 9#{h,̍:it˟|=(\f'kOwfZpQ,uZ<AcD .3VHYf=Ԏ5y|R"c9b[\2$9F%,D2k`S .dlMρ5jsU8Ij2ЁjqM4l7P?p43zɕ^Oe,-J ""hcy0%cgz]>Ypʎm&P*AH`@K`K$rdH Nnv>I6)٣<B}D%&JK\,IfmxXwQk(|11bA-%UkgDȂ~qͱq;vc\)v#ҽ0VFMoUӏJ,K%Ceذx ed->j/z@ le A%, rڲ`~glѣQŕ[Y|w@ٿNXefkZ{,\ Ge8ȭ旬-n\)5쎬ϫҗգ[0i" /좙j(,V^BS PCrMǬ [j-NAXo?wB j(\iCT:>JFODF&\G7+ej5`rɌ U%RJJ1ڮV,%7eu? @wp'3;ydoM7I`ˬpCx:DgaZAesz_ZƊ J аBOv OY8n'4n]dCCXK5=q FPO)x q`ʶ3DO%%B A } r Utp6lXcV$#Su.馴f%]g:jx.\BF/C)D7 H. wD_7&k;Ar=LӦ"!w81:VL,2L}!H"a ѫ=j._QAvc1Ym) QгG DDŽ-d~FGҩR6wDN"_-C7 $}]!V0YK(_KP^G,@9 #L!a˞8l]&͔LB{3Vs:jO:k {?$0-dra=J!Y`_yơ͢MH3Ba` [r $t&`9XJ"H\2؄d_]9Ԉ*y͊L޶^щ@lݩaQİ be J#U/v!-] '"6-G6on2 A$7PdWČVre(Z0d_:$/3qZ2"hh)Vᰄ߻pA74+`1Ojֽ=a]؟vP%I򒉷+>vYk4^ ]}r wpF\ck-9a/Pv3`%H%1jd= 5؁?q`&ˢnm\wp$<Mn7DZp}(ϥ9/r4 |Kd'+׍*gD  wG;?j='(ٯݎvkc_zψcH؆:S%̛x=Jrfw'nw^nC`ۛ3~"7e]L>(g45YˢL`̢x 0DPsǶ\j}6e!yNm |M]Mp  S4DZRS {X;mmBqfo)!5 8z[}$ g"D!, )k&C'0 ,sԊH>4X/D_" *'&@ O_p\'9#%f\wa'P˙C&V-&O湥8˛ dZ6xZkH㏧$Z{ڃiq#_J%J_\tR h<(OC 2%3L uĬȝ|-(sⴠ[Ros<7VFF#Mb[vu&yRR ԩ X/t-5*~dn ;yy҅KldfxG{9ܰ`uHhKnj;[jJm(V^Ir2 Cltt2%H_z ./ϚܺH˪ ,\sԇBe&:Y;ȟV\KK̝&`it$eF"uʴ]x1.[pU;)t7M֘L_؟|A^.ޔ;~{`mZ ka J@V ͉lnR X,2pEȳ'KȺ迼}oG%WRlyMd tev? ` d'?Փ/<|S^f&p}0 lՋRe`' väpRiRKTEHZ'3;9X#f(C=g]mj;˲rEcyb; ݴeUfPm`(ɎeNNz쇟27.؉?SE)5igcOQPEgCyAm~F%EfǏ5pv ;{{{yA =O*@DoFE6&==*EΖ'=7d]LQ+Aj}6oabD&;sWfZrtסV㧾CY D9et% +'ٟGEnm w,r. vG$@*#6 e{Qڰ0YYsKl,}\qW ̬¥}MWm 63щ)yTB0ileq${b RLK#~#kk7l3udw 7Ns"RL(]zav:y LmjYsz޸ 2+B(F7!,f]̬ֈVZL> pd ,e&OJ$HǏVD25] n?Ӈvg\s{- \ځM̑twx TRޕT}.^?!qeoBUE}!@ Pu48W ԙ)-rݡNJGzT[>%n#[+%[VI€id B]Dv[?gd喺:b*up9 FoXLƞYj$'@hCvK@E[eXٽYy1H4AqH&]'Եފ ӓLF@}ucU~mvKiX -Twm%:Y`}lK=M=@.xГLS.uaN#\zuL9x\vh݇$ .\n-OcDxQrr5<eκ9:%܆IkVPfʫbOp#؀|[ީ}%#`e~Bl0Sҡ4D8Xq+iLƞ̠:{p^nž ݤe"љ0ڿ]ڇ߾MF/ݜTnV#Ζ0[Ҥf;GMM[UUR{>2 n\!W2Zg&ʦ~'V\Ӡ T*FWUbdKڃe ~iZR שLWqX5pkvH]|ٲӷ5$~_[Ye Hn*E"fDȂF M–u J, do*) 6 "9Qt,̜8,>x Eb逾g9"΁LU}*lT |?#s=#h@=VGt./^`CI]`/n_7_ɺkCy9GgW|,; (rD!MD59p(*qA߸AYZ4ɀm}is)h_oa4sef7#5X V+V09P(\E_ c-awp6y^h hVŇ &l,<62|\46w@;NjU 2#8Θ eFĹsGahTxTyMȒO\^J9a׻a۠F-n(5śTth,_ \׉JFKglΐaDS, ڒ8V4YXpegε{XI-{Ѱ? 8Oc dqҹef\[v2܂K` h?OHOsGLs}'L~)jUeWAL]I<̭&6ÅDJP )K<-qt_lz8dt8S*Bi0gOqffBPlDiw6FgcnxQdGk r<esQBvX.Nxt8o[ F7I$4Z@Zo _0皟k*-d5,@pCjPCfeͭ`9$-wuMUT#f޲\bHkƗ29'h.( F X\zņ4EWMN1<YIw4E `~)7U@^)7B}ǢP0RnlQew>Iw4tϗy0T!gu&; ҴXB-@&=f&bfM i qii_|<"UyM)긟Hmp<9~5 |_L׌ԣTyQi$%wB-J *hp) (sDi9tH6l~3 y {苡mh 7@6'P\ uH\יq-օ5.Pwv/XLdԫ`OR:}2) Jai|C!S]1B\K#@(y~5(/0  І-M?702Mv``֫8ŗ(0q!}"t])!&qD1,Wq"WgڮΛo i S٦Nrd&^]ݙU쑯mF*׃l2nY~LJ$r'A0o0f`%+iu AJ5VfG#9{n$8*0z(i8 0U  Ba.ԕbvd ĆB& &b`d`V7Zjû?IarR̥ )#/T?,rltQLgR3hhM @hhZ.聠{D*?S0'hr ,IT5.EÍ>X7`e/dx}/N =(D ]޿cV ы`0RF`Ka`x#aF<{W~^[)OLY$>bN0R%4ᐒ\K+p۪x$*-4/tVEMb L@بw}owc5҂6!'rH܇h4~Y@!FE ASJ5_o6ԙ{"@P4Q{9 Ɖq\Ⰱt娺FȰLqSBJ& ^GfS4[|F١؞p[`Y$NJ N|.X/J/㺸 1[ŹwB`as !\,cƭ׿'a1 {O0i?">s3D$<Gb=[< bYI`|U7ѻ͛?E[*zd*#CSxkqeĘyݔ`jy a Y ۀ 7{eFwc; L$zyf^ˎߜҧTbC}>{q9vgmJO>HEi;("H(ue mSй?Q9*e^Fgܴ@ZR՜+~Β6ݢ76*NJ}t,Ys<_J[z[&p"ȫjb\k!nwIY<)xsǷ|f?W?x",YӃZr7+ W<~EeǬhGKƵ@M,;xl)edD0XT3YV%'騔LKhF \yr@^@)FIVX'HPeZ_*aЙ,d 7=[1-Veţqxϟ=wo?u5QX+xƴj/#(*kb.vf+9Z ' ;PFK7$2kk(@`9--"RdbN;fS/_|w4́5.p D h&Gӣ5pv~C|䔭qĤu%AĪ=MP. >_oIl@+la.KEpю1Cʇf;/&S)NEӐ"ފqg2vW7s\Q#Ab1 8 ?R҈ZОkJY3b7~ٞ|_i{"  <EQ<7`JNCYWarV\`5ԽEY5ȃّ6Mĩ2ڵ5~/7GG7-'$N`Is =)e9'QZ-o}׻ldW+zo"UmD(4DB\_VPVFd˵&:HSp09Z ipb^ֿ'BB&:1)R"K,HR(urRXE 2'PC||\^md0S4nHZ{k.VIAs f)nID%EmvHUIꕘ@{N¥h0X,`!7TW*wX(L͈&żLJ|2 6mT5jO_|ۓ+ODOxcJi|4DAE֡!fM`-4&tMb p$`]NEb5X$wH U68릌LjK+(킠0?,]=ݠpM5p|[wͲ3𐣌ZEM^gj۪d Rc$Y~S Y4D$DaqQr"dkدlq.R١*2 R!Rr `7׸psЅHߺ~W.nO~xe mqR [<ШUs|VfW6qUfP[-Yvzy}0"qwaӍZ1=lV vKZً4VSRn zȟox/2'kdf6 m{FrH+S;\0p K2x\2aC3"׌&`P !Q)eHf5"`jM:+'y_DUǼ~ɫ rcX>5Ԕl#ld9 ^Z8&+/7qǒ^AX/=K*B8%3/'&w|Z E2. zdKYs2a[*7ˈg%<+]SgK*nO?\u ƨ;$fea& `~Q/R]-%ÆQ HPYٷMD~e5P+c`jq]3Ce,RgJ fM0_p%_2nɬkF)}+ǚKۅ[XuHOȄxf+*㷤M1;"}S֭j,}זbZK\C]7526uB(ԕޫ8@fb07&i)/x|+J^2ҨL@O|Saetfݔ7TAJB9Vkў19ZL.Bݭ-pEQ#'H2+LGF෈pǵRdO]m`\%w+E>^c4+n !ѭKpAȝ051QZ.nd ^nEzqjFN4sO}ҜDRUg2 MQ%h} Lo0uumUE!'[''ځ8Ʋ~=9P+7nG! &iDPfrmlYjѓ9ҋi*N .n-ZON.J<$c0:Kڑdqtiu*%{eb+(R,m!nz2 zOBvͤP$~I2P2Ӡ")m`@ɕ|_7 ;u:.+Yv_(H8%GR8$s2[h29IoD%yRw˥v̵FPZI/KDOZxMwu*yr[ ʏku|EbakƎdžlD:X1:Qt2` 3hзp޼nyO;g^ޜH?R|S7wݘi`u:"!":^wc&߆&[Oׁ4s2sT\J+"N(sτ?>S㴟6)Slh/|B;r;%k&RɌ8pMZO'؋~Er;,\d{7ɬl d>&5PrF}J%2?ZBc <319WP< PS|[TNէzk$_e[qYc2*>OWh{Ż!hp>k-ns佦"\On`u{[sZ)`g=H,G4 {k \~a0 Oa2a~JN|Rs 6Dm5ZӐSE/w>krk1` {貪;+~LrԾ}v=s_k֙l SK#ȍ}f Ds"fa8!5[eqw]h_>(Pd{ >3TfXY){Hs ;ykxLvM6v̢uF&Be(3%^3̛hp;"_fsmns^sjP^yrwL2-QRNߍQF QױOeb:{ŃQNW`}рk٤TE [{X6]>&w~ ]&H8fbUK|U،nxVXL^aqI6G&O9ʉ xp ^Oy=[dM ߀6\U3Roxs-au7Rc@yWE [.Z~ҋ4Ao&kΝ=.rt'>7Bn*bei%,ge~ 0\bke~8A6p?pؑ/J :'Kg] ֽh\W[LԜijU E0݇)ZJU/~}}ݯ?i 9LaUع\lY͌5Ėh-lJZ"smS*pZג[Ok.Rr;ٷAN׾_wYn/{s&m"d&2*d5d=_q+R٧<>1xVm_/);1>vwn?,FIENDB`nrepl-0.6.0/logo/favicon-16.png000066400000000000000000000014241342636505500161660ustar00rootroot00000000000000PNG  IHDRa pHYs  sRGBgAMA aIDATxuSKTQ>{oRQ`hW3+dj \T "Mά"4) 4W֊uu:F>qg;opBm J٩.L!Jm[͉=2!4L_`bmؒgX `>ޫRNL=PܞJ| EKw|/?uO@Û[E9*(f^=) &}^d6 V,1wVgA"P!7R;`@!!H8 B|B")<.{R42#(k W 6 EY"p2 )ȍcQYPAX[Xwц1UEgx|րeat ~]ӃMU4hykvE1L4@gRP~~ݎWP+k6y~bE0 `?t˙V7eRg+nv,VlGB,[4 L\DDHZ Y̋c87$5&40Nbչ%('DbFl?y?@B[c ߫'- $%Fq1&Z?ӛ4A͜J/]~K݅psmqiPaFCv/l47IENDB`nrepl-0.6.0/logo/favicon-160.png000066400000000000000000000525201342636505500162510ustar00rootroot00000000000000PNG  IHDRg- pHYs  sRGBgAMA aTIDATxeuֹŖ ReSaWb})PTBYѢp?_}o*8 )(aڦ $٬&; (8y^9{[}R|M>s=/>"4tNiz /.;1?Meq]^Ɲh7k_׿/گY]vgCOizC=Gןܥ_׮(9o?"hd?u4kkG"O'W~9MoHz]GWeY.=&o4HNff삪VL8ʍt-MAlOk˟<,uO|rW{Yi_z/Yy$8pA(R͋ vOȎHȝӧ |=^PMeiw~kGj .AI\;5E{"j&bɠ.鯟uHO<]w ɽ2v_]io}wo%3Vc 6.@( f-tqp}^qAI;)~瞹semԳ6v7DK(orJ,0LY6WƄl;pWs7,a8&<kMw._^uSRx܎5Fk>f_E&d4fRTUQ=GA8Lq𵥧_Ǐm$};> ;no#&$;T|@1܉b"Y1:.0LC,HFLWB\7 V0pT/<kB0wceCk''{.WӖ0b6 hiܖ;GW?8 4. v3]j{:(nfNnpY ݻh~^yRaʲ-W o{6RӛpXsf٠%hr:w͞y#reOeTH  =7 |M^`Q(%j:L; |`h藁yω#!hE0@NiK8uk9 Bϴ8\Fh`HIh?xG;5=[+<΀Ik6z`ӥ2)K_ZvM#@S5 $IŽa(`B9$8V)o.kC6j4l7&<^{`HEnq'ܕ6zmy!K.y;,/ndA+y`_ߍ̸YҠحi\z۝̀33 =GV ^y=OKtndjQ?:i|9M5PHLq`t1XR|wǬHbqt]0Lu'VKq\8p8>jp-gIWIX @TK0h%%x’)!Іk#z&96&\.gY!=&jbI33#Y"̮ۑ3Z[vLhK Op :lÚ`.ֵ% 9X+qnw)#|2_p*as2*Н/\~ac]o<Nt Ar8.8*us1S"!3:>jq;X/| \:Zݳfi4{4 I')3t?eys{t>/܉+owx-\ %SCIpycR61G-  &;sWֺ ]O*S6t:@<ᛉV;! 5Ad6r0̟b3|.Ep;.pu[d  ,C`}o(Pt +Z"6w5g.wE2ts0.TA޻=Keo?jO~@N)5uryJ.ABC@2oȆ5#S _z)TtbkLO]c"tHT([w$nE?\fxk> 0H$X$-1ESy`O?3C"H䅘.2tHlIf\DKjCZœOJm":˄|ϯMq>DMi<5I*5X'_u{L ))Ƿܺj&-i` `6r1Y6I1sX6ĢB|h&z"Nށ }dmБܣ"y6t6lEZth|7O4$i%I~@zh5/hP LJ 0$/C=+dO;c@G{$r4IJ([A~6(ŊYF&9n; 8ǿK:> *"z#JORѯX\c5S<)Lx]aybe 4@WʲJ`sfQQAd仞] m o'Ervj|v* 1 |fގ\R;|hPhr@n8.LaygRՑQo ڕ"*:O\DCMb]cq)t[ уS?5 ѳvU/Ol5"uC/DK_ z\|}.,zi0Pr͝Dmj`\B/ƇBSu6~}#M-96 \<~ոMyH+bv1M< xz/#lRJ؉Fd=ְpЀr`,\ej9X@*>+. Q._17c>h]YM'# mӈskfka•~X' o%wUnjl::'Dc5ҒE@_L`d)gKhcH+͔Y S3!jy@؃ v׻J9/OX ~Ka1ۂ'V+`$G)Y@3JQ35jW0 RXޣhTK. UV~dagbbA*RB^7] {Q17J%gL(.qlX$q-R\ѷo4NgyNJ%ޜb6z82NIїy7:ă]n,"b3spLdef}@>^7!1i~ 5hYo ؄D3fs.e&&=&9_s(IMV ;Y:i㡬$S넇ju+1ܣ$+?NJ6UR<m5s G L=oUaDcHRpq$&&lfB"6,2Yǖy%MN 4(Kk6{ZZF^bWxvd~aFS,R=+:K+pCL{O.@%-z{SƀHe8+)$ReqW}zvaPk"L1H/DŤ|^"-UKli%DW6DHH#Yf bbX>KюLSuht]&EϿLӣ~b4&vlu0%+18~d d4!)??YS%}-xZ"d00zxKa Çؠ85)%G/IF[kàgNu(PsN&EB4ku7'=<]+ )u2Cdi M't]c nAfzÀ!9L&'ܕA`{ |,Ƿxw>:m $FyEʤ8V":ƿdz˱D^ \/o'_}>U+ V%2VܺfCNͩi$:}`ADG6mRHq]qP#*N FD`("&Z`p}n ?^zYV8WEwtf|-\^@s=@?=H < uk (+9;~<ůY:X:V}8jr(Ed&┃ HY(@eD N(YE^e jqK2{=uj]qٗE#܊u Lx&왇vy|8;дH8cqsVԘh#4A$9!?;xeҡ LH|}-h 5GtK#"e 8H%u=퀻Ϫ\j/4*y$hѪBlZ!E/󆾡+O\K(/_د;^o&}M3Lm%2YÕedzXC0ZkG|1( "99ȅY?>yjbD8tցyyxw j-`ɪ:^cH7ZbY nHe\zO{^;^~*z߳x|`CUfM+ן'b)D Ȥsk-& oED&ظ@{! ءPQ-VM׏x@C/D]d ǥƭӁ?6e҂eK"%(773?*^~$ǹ-nўn-}+б8s,VP#* 8+"^B0,eIeDj6ĩ싔zϙQ)a^Cla Q3=Dv'ҡ,Z!zeEaI5@3_+Xboj_$L j l4Ɩֈ78̚jF" qg@>j)ﴐ[s?;4 %rRiX*B61.]]Xl*%miΊWD/Vh8KD+, i /1z9n˶Fj(/5eJ(Ԏ>`%):T /=[ .jm0M} O \PIMo\0NA'}0ںY:j!ߓ?-}_$dv+Ḽ@Z ,]HL].VH̨ݽ{L$ >--f @d7(@Nkof&Gk.SkRV=-.>AO  e% uaQ֧=v, Ypt5تG9=KhXQSi&>4ؼۏޠn\O+i!1t>Ӂni+/ı1EԿ~1J$Z *bD&LnR#v\B7G@J}1 /QH5-xcce@ ?9>mo>g0v"˥W=Fƀ%m<"+h6>N C§J 4* TYH{n6C1Ò YdTUCs 0qZP>Y5B1HcF,|n1$SRg ., Vr:(/Xg}hBa憉iU]򇱕}WhKQe=vrAݘoU. M#A @ Oś*!Rc0AX30n\.*,DDd{ߘu'U рZ0oj"NbnN~yJffYm#ҵ(49`بPw~RElqކ$FPzOd_q'f9iRj8tZOlEtlu=P\,e0Xn`BYI q@I8 `+FZ ,N"Xx W5ju&6״Z*6Jc |'FQVz(7#Ȑ*Xf$_tPfX:k_Z G}4= 9.F?>tNv]~UPMVTb088f,ۉL">io؜O{"5Н ʧy^tIB닡V)QLH'yj \2}mAn@kS10mVqBw 1.z=SB 1qK;;B.?>Ks ]0R>P~Θ9HRZ$B,eE[INB ^s$E8у8..A%(Fc`1br;$9Hl4lA"J`yDئL#sfb7L EsOuX8ذ 1CڔMowa7b`G[CNB@mq=XjPp=Z pFȒ$e]X1r7utth /Kƹx]&vOh I;,3xUEx2"yF[Y0@!!Z1a<\OK|n K0f HC`z*Xd R:Hi9j2m$H̨HhRoo_$ؓ@HL0UzU#>t;|AHַ dҗԜ ; ^: Ymbik8tqowmm7 q) K6oH $&M' H>aޱJO|:Iݚ(1Ś1wW}fE禫Fi) bCC}RD6:q" n//@˦manWzF jEYk(Pf>6³eq|f6P5Go75h`AE M$ĺ P Nˇ8S[>FBq F`pAXa#/GUoGqglbj >[P OVD|L W~co7XbxV滺m?&hC2 7W8bq`؝v;МDГqyi$N<0h-`L^T!%ɒ5bcFIq~w80: DXTgvK+,X2䰃eXj3 s}u1 kW_ ePܴ:5em>l l)7bZcXK yCR[tJ.TҒś¹lɴlĀH sP 55G$vcI1*~odZ*b`h?E^ ga[-#r&$,}o<Ȣİm Q4^ȣ7XLZXvɱsFGḰPڳ!O)z4dT  &MSgKt/RUɁ و8'rҵ"[ZF类E;U_ZOO 9x鹟O?%/tI*E˨42^X#Xr_Š9(M iN<1My̧l!!i| <@IgB\<@=&&d 4)q>BIgx0)WH ãk}p•/{}Oʭ2΂\rH%%H:z<}гh&3M0R:S*W zKȕ:'% Ǹ=?~L(& Sy4#Kۀ/I^G*̀2<$+YkKH>h=wϿuYn!@1*x9(^ 42l8s2bѪR/Hh[[zYhwDaQ'ԙpu\_){+.l63X^pW˜ܔ1边M70ᙗupܸ 2%r36$^6jA8Sz3"  CFf&,0@Ӵph](kr.TqANLOn.X h$0 D#zUf_ ˬ0gVY=Ox5~}dHP!DizhX;*¼<K;]3/A>J/^tBgj 2j/(}bs\3*?<׾wċS;D5jKB1VٵpDMCPF)ʅ%Fg^\g7+ZU7oC[ sA\Iެ6BbFBiT{a;˖n)4* /S3Y(/(}0a"*g9swhM?#6&=D)1CAMgQ5cra9?A0k+3yɦzKm1ȣ[umBNARR@*8!"q}kzc@F*Kql 8n@tBLMn=}grnӣNAAƄֱyK[d_dSW菒36 87-'jL:SYN-c&LH&1*43/E@C}JU͌QqnXۮ,ܻ[٭"xbD6,Y h>p${nFyu)ObTK׿ne&4)^βm,+폵iLE ,>[Mx[b a-9j}q.9!$[Qs_^Vun]w!1xJ$OumdOj3bMb%<#aL z4ԷR] Z^V[-u"XC.;*3M;F Yjy3E g?BǴf3 | ه14W ̹{` JfջH`&E$뒜3GoEƻ:uዂx=%s%Q)FܿxL_<3c0 U:v@ Q|f B;#ͪs;tÒ,1Nߤ (nS4ErnK_Y'ri ĸ*gt:+xjE^.Ȗhd͡ )5DKxurlO#kEa>\sְEAN8q;L?c 1U&??S L@Vf)O۰s1eQt}(];x,w_0(&c$75.Ƚn* B {LzM (׶9R@RI 56?W.11$t胝 ELx;'?ybnlT6(r ݰEELv2;$16 D -clŝP}TfA2yy!pMR2!MR~ϕӠf@D@kHw2G:#1 B#~P:JB.u](/ N2b;(X\,',K‰g|d$f 0ptu(%0%Ed}fHOz+ AY=Ų L `joUf滗}706&EsSx?7Րyni+gM0 /1 QM[ׂAsy/2K?~wЅ0{4'jj E>Z|>M W%e 0nhS:`GtJ2^Ԑ&cב>87E^/-Sqo%k{=۞Ѣ$c/\\ʮWILuIyv=B-B ΀oe#b@>me 6zERz`-"N?Y5&A܎.L& jŕ   y?ʢ:p&Y^o5)5I<3{` 5)0!L)Z I!B, x,lJS?,/4?-XWCC .2fKl| ?a9џ8N LXrcpΡ31itIIkISM]  *N}8+ۀˌJ!:iKM׊H] ]++iv3OhliʠU(?HۘIZ}p? \F!B:,3W̙#L&gd p`,k9b9cP S;rz `L%B}R,;4^:MI Sx8p y CdjXnb\ E mHzjvNXwM#-4b|.]3]w0v&|j|޽TX:b%: ZNm0$FMڰ"f/T*XLJ K#,"d賔զ6 hQySq@J6HJ[TqNκG!g&rŃz'pRfMg3 ͻRL"im4v \V Ss6DT'zKtn#8t1Χ:1$VqD%'I3&‹a |G`SR|W1`#sHpT<%!5CIk5^9ll`7GC3%獇.(]/\}na,r'TmQmqi@dQJ!A c^u)'"kL&ai=akhlO VKԁ"$鼘טl'))gUAwY)/AF. EX]2L ^\O_VH԰i)W7ٰGʄn؁8 %@@kE/8޺XIT @*\rZm1NH"޸M{hZ/U^}=Ĭ+ȄCNԇlFQE=%s 5::a-i^T/oI:zQsaHc椋n-Y 8~ׂ/sgdؑ3MXL*N#oc؍-Ld%f2L-Du+:)Ҹ[I{i7N4?sr=ͣRhn/(AuU2vwe 1"ԏ5t/{郢9"٣;0vr7@PO+Y23X4V֏Vֽ,?xh\2[@V&%_Ilbhmd(@Sw'% 58s Y8N\W~w5LNEJeӤhg(N";ސizrRf1iF" 愺,UVCe>PL"Z^aQQ&t> 0ٹqNBnh TjBTEcLը%3DfX 2;݂ćYɧZ[RqGe-KC} ze$_.)LcE P^+K$]S3#V-}ƄexvXUttdĶ1Á;7\f6/mHTfzmAgt6iV*@,z!LQ(qkyHcxoBPՏӧIeF~' MWS8 _ UH\)_]?"# yuR=2u?@h B4 NH;0;l*dN tVP+K`fPP>*⻺ul}ϒNkL,ZǟxbhkK21**:,}0#G.L( Kdf^mGςuC"Qn!ی+R={GJ YGݒQgyۂ'GZ A&&3 C\\2\@ @X #\%,Ki ŧY^e&6 ʃN6jC2<Tk&b.@u@rWn P+$)GswI=T rDàk3tc.4I$9"(d8&2>[ZX`CTn0 o}n[6&t̑OAߦ7"0TP{508+ԒO 7:ނiv}F2%9fZ\#X [2Y*12EIR*=|*Q4r@3 b 2Fb6ϬڵT =CZ 1V{^]QUҕ&-z23űba Mc,t5fWaV"@<ZSf!ٟSĹPZsE"[HZtb @B *{snq9%-t#HS4ǁ'%-th(]ڑ֣˲g+dv&d rR^Â(QԩB"}N12 7h[0ڙ(-t kaƞEk*TB"t}][wUV@I˖tdbDEWlP h~cDt0vW͓y٤B 4y2$2q1 k,IT^cV9-5Q&ibH)w Ex.@?)f#R~%a#T? dTDf>+_6F PPQfM[z`? =4+[JN=eI_s [vM9݄# ҹu?U&k.|XroBĹW=Xh~k"6Iynx*o!6`^$L}M D FQW aJ¨֜{Q CÇd̺_:dʆ8E%s~pؓ!۱LQtUm&ܾ([uaVt|3"[ݛb;YP5*5H`Dy O"آ\-0 ܄U5[坏LP(y0TQlC'Xrkދ̂@G5,UZ.ɚag=t=WRPI䔔L4Ѝ &p>l1wq:|_hdmD=Xsq*]7J r#)Z?&%tKՈI|VE(Y-)ّ+Yp_U-#˷x4H9+#7J:c >[3z*j/=39}'sub\V/R 3ªDIͥK6VCזKIC >!Y0HK1L*6^ FY艹9L$)Njd*喛'JȘwe7r}5P: V|/ƈ0 yw%iU7!mL,Cn6e ̧4,ydžE~\&>.zgz3Vvk0~DhFW%ƔAhni͍0|ku0 VM^ۈմZ 赂)A(+߉ /0 _'6Lc͵:f-&EGj:KAmQ>ĴϠP=Mhhيj @~.D6݆L*d2V9Nx }G}=;V; `[Gߦ8 !(!4zSjV n[&bĵP~ѼVfNDd-ɺjED6<\CO:t3Kzg)ґT U&-} "X |H߻~n+މK+^B:ب2Mib&LIZUE%[fj-s xJBX\ְ 2OY*@ x&f}2󑜟Tx Gua@:& PD K>=,o@ |:rYv+~5 2em`t?GG3 ` #h9`nrMi!3|{D_4-7XOddz^pŊӟfe,ŗnrDL. ˇ&\_Z>:\/&`XS ׼3h1M\ |"6̊aK15 &(T_yLpS/sD8`!bz#0%5y":ҍ.=tϏ_7)u Ri!h10%V1l$A71i7 @"h(u)9X\^t顟&U_XEcVVb5Ͽ3m1HJBR ~*d0r'xb`.VI-JusN"G`buGrPPf2z3sXbyP°8{~EC&V[sPv8c|ur{`PKEGXvJ#5}R>G c^CPSGAA~eej2g{|c&=E`phSΧKS9yCj4sR6b9I,1U~Jf2 Ɂv4MmSu@mΉHp)b@_΄m1xDkr7:}CZK2uZHr&_^|?1-\^Iў)ҧxKFH*neNh+fON~autj$9@{M3qj[2ITNЈI^nWosUyµm.E4#2+jA:\(_`[UadqkL(ZL<SI(qPϔ{&^$q` L>KYT)D:; L(`,0a[0Vvf񭳈'y 9` cDЯe%dPBj$]qZCX=ţ(cV wTȆۭ-xݛ=c].̀)pHN*X ;D/bwy55i3LVX1'hݲ{|=whA)nmZ)vLlY[}~]#[_>WL˶LDt>؇oQxE%'H Bh͂mD_֫/} owQe|B_3lװ>XuM+` ;eJ.uµw/ypBWtA:g]:>`#j<k|wg7'օr6FȵO]+;.EF !zB fD" @zjT%ϯ>tϿ~+j>WeneH:H\JC7j2*~VOj,[E v|7 >sQo,幑F_XtD]-Ýpqo&-=zEp06J.VV$gBu Q`m $8 8.]\J䋲[dp4ȡnZnVkO_I(2/*B|ÄT zbDŽ_p΃p,q f4ơ̆VVivEonl$ZkLu\03ƀP~gӰ&FׂA$" WjYG>'лFFLn1 p+pb5FZ ~q Uj߿!i Y5A~jFs#ČDɐ(/+Y'<ҧw^sk\%C[,y'>|uOibOyw KhL20k`İт|TpWXQ5 ZVko\,nuۨ^U%xN(}%%pl- ă z+W΂!dkp{1X5//b5+^f\[$7_/6}i̦|jo}8KNDmpB[bĭêC3"[̴R1Nl 9Yʖ`P3n`\c9D^WܦYqn}cx|)x ^1f(kx g|VNӉ髿j_Oc xe,YID#2pd2L{] ׆czΆ~e($ƃ[*UC޸n;eWN|)p@$}"K$P=E\ttzod~[MuH\nUE6_Lr4ò^[ĹSr{l"=FF|an>i@6+rZ_.]OW|}lO6|U>,. Y*tCc?(-ofLZw 7sQ n)%I'Q-vEO7ҵ w^ݥŃ%*-Y'EΟ;kN˪(oEX7D 7a<1:V6K/ ?ea6=e䈢3G嚎&}~LN~+(Et C5<!, 82FzEr<Fag _Ȱ"uz|xK7k/CA3 fI=ycwk2Fο]?sE9MkɊ I)! ]Q1mk`. p2#_}W[B?`a-H{OF˫a"1矠`Ĩcµ#06J2~ܑ~/~izӿO<д}|L+̜ePd59V~n[c\Sk:ϝNtNi:MoM׾c eIENDB`nrepl-0.6.0/logo/favicon-180.png000066400000000000000000000653411342636505500162600ustar00rootroot00000000000000PNG  IHDR=2 pHYs  sRGBgAMA ajvIDATxmfUֹi3S`tJ f-d4BJ*3CU*Lr% IE"ql{$ fgﵮk}MҒ=v>׺#rY:Kg,'~;.OW p_UWUW\WǨ~?ҿAsm|\z"yk{~\~{s?vnVH L)[ယg]5ӄy8{fxY_qُOY#oOseZصp~w~g^ECoG P:@Aq kX֏h!k^8G:?w;=GWX?1+?&w`??5o\FҢa.2"$Ɛ#8Vئ!L+COz#z rϟ G߰kgxQFa9Sw  m{0P0:de327q]* m]c_g+g-K[? #Nhv?{H_)P] ]K$ߛe8E]f/\{?#{K<'׎::UȞ ?Xv'Ȑ``B'_(`]MUޅ_,&9`> ovzv]+y=pQ=Lej{ ;~E_w) ae= օ9!1q #V@{HmJE @&̲y};dYec_;͉bkg y;!lg.kt#Z "]>@|8+-|N oB`]E`M5v?jh#!O 0˹hiAi3ݦ԰t(YsoPpޮbߏNan&HWd ;O~|o 44'NȖM6yMz\Jȳg%~5!j^8W2S5EGڏ)\ lӁq͗>7hmy2$5t3y7QO3İ6)Z!?byݓ]g,meg~鷾tg|4 4^9tN/r~>ܔQMlNXlH ZQt?>ĸ光Ǡio#_s*=uw4`3P_-iFL̰4YEʋvW:ۘ:o)-BF%zĪAJqI' f>}ۤs?d0s&)9R9 rk`j#)3t gxW]2V&IF:Υ "&Jm\ 2kdX0|U'm{t,-lB7-ghݼU05whs?k}% f4bb_hDKyutk3>gUHY7bF=7M|Esy=WF9edPZ͑!Wv\5+5P^^ĊTTXYAgޖ%Z$T(/Z :Ƿd #DO2C,7D2muvŵg`#:+p&:h 2Z4˞"KY?\\ϵj:%x0 & мTms(oEKVa6DJl00 OU>:}Qw7J0Lĝǿ%|Xq~Zyzeu{C/׿kys{0r2ekD5hq?qKJ\9 F= U}]Nʆrph~̳mlƝE%n`%n^_9'eRu^W2=ۯr/1GiEk+6*2RRq`UyA~!>-o, &jA/_[=:n{26s͞}NW"?(N2d>X$}$*6c4Sfu2B!wyhfӾGB z,>G$!%:M}ůu&3^6ufvq8 b́~k &ݼ8t<*9tbUݹgz4LQzɏq d@*9<,KVtKa,CdnK@+qo=Zk}蹣U3u Z@2j)ĐOy'Mj_ +t`v*k=l,,qԵ%nLW{jfmiibRLȉTX*n-@zP_L}hv5o3SZ0ߣL55؉Dw/IW^m:>aq"yz'\7QFph ~ ʚ,Ωr &E 7Fc\ja!+wƩk#NSkuՈhS#F K | xjP;uAxNncPbb-*V.‰XfhH-@fd\XcI2mFrInٵvP?3k]`+ԄlD Mt C21%ʧW_:cX5HrLf@d\k^|H¢t& #N TxħU<^@+o vN+-VGWoXѸp2KQZ!:bٲoҡ'2}zZ_fz!_3:d3:PȼjIH!Lƥ lF/!D:"L.,ƿU~,_}@;СT24TSnl0Vrаmf(Cw-Sނ_J|Dv|M9:[uO1L; R$N,oiH;iU-c1PvW XSyTOD"hKhM+! +Ws Lp#1XZ7{JGK 3*[ڒ Ge/NK& TK4{ S25dAgNvh9A ? fv3 1ą66ʿe3,膦~vwo&WT7N{4Nۦ۱rPu$E\<YL!2aGlz1deTާ;zb[Ԧ".h(U!|)c0&oZP.яw/}58g.GRBZԄbr!!=+a?lt#56&i b(]~z>O+V5GZw̔-,hx R* :A-礋[M3-lC X^;Q\SŒ:ehkS1`02Exk:ZΔ:IDn^o;9eQdCC; @giK]Z{Xf\ vZ~s}(oc3vk1M/ESL_3 [gSۼf9T4/Dݻ#oJZ/@p*/5V'LfJ\W$oSa<>xGJr0,] ̖uS:7b$xAmFZ2G,YZdiA0G릂,3泍5|&`&pcHN/k#N9^J ؆XPMϞXk@/? " R&h 0aH*-nQnOo!Vޕw- Zn9H)"GfsGILO&گf3sѓr FEo@X sfBI449`Y}Ḉ{} O0qҚ Rj9j{;q0B܁U!}bn ޲bdW[cKdx|9ّeG=nIY^Z@{8d6jXEئ,Iⓑ:% =3|3I}ELE@ đHK؁kl͸ny *+|~/T>5Az}pqAxiQQb.h3 $7AQ7pzLDۧyԌD XDֆJ7ȉ 5I*јz3[L;34S%ԐAQѡ 8 .sf & Hev C lAw=|=i¾  GQ: [)Ҕ!# :a2GUrl@oFP'yk+j[Ti;C~׬ܶ>ʫLOٕ1:kuYf0se GT7HĂ٭fm߫mGB&s`Y+Cؿʒ ۼ Q*KJ }O,zָ25+z6 8箛p;ج&H{%yID + 8'$sh4lҎw^Կ=}l8K xFjlĬy:O5zZBC~ʪ:d%.xpxV-͌hׂOpV.Q>j͝r&[82yKrI;N5؃:Ϭl|d`ٹzdto~oZIĠX6v)eٯ*ʵ =kc_Wk̄fK|kS+TfEf~gtij|K.АFXۉTmt,:8M4-`~bD9lF!mD J6_ۯW)t&K ם1- J׿m/ݻeez,5hF>Єa' @VQvǑџ~,NJZL$#هvƱ >.V C" Iخ_7_|þBlFRjJ:*A8蠉$0Е:]zcQcf6ݡh 23Lfy1#PeF4jdaGhC}Vo6v 8rmYYp6t;fS,+G:%*,䴽hŒ, c 6!AEk/*VlE Hc蕽:z;i"(; įsx#"NbS7_ݜWP-)&-5 J+>jےx S5)/D xVZ"W_W^>6}RS͟0$5#9-8[V^,#쭭pR|`ho V%stPӴ%a03źz4ųq-L1C$( SQrKv  wY%2,cPsgz,Xrqo>Y~=XɼrnKEN1Et&_vڍl@uJl[>K)?X* ș>F5 -I!6b|<+JHeH&(@&i oI70sNO&XPD8*~ euziԪ` $.QFz;&H^V-qhƘٽT3B:G!cSkFF G(4J]tB+{z jսGF:eq 2 汮#"A, .-` JcX.tZ蔺E-Uh\y?V9!dwoG 6Z'hG#3Xuh`JQvԞŒhcK>hA;Mlubkj`7葈-t v퐀-5iK9AG',hV|BGѢKt}o%N=xDIjF){)eAm - bCbFpK .E鏊c#[}&^(U4&k{Ç3W}c w6i$ 'qe \ j5 #IskE@y9K,XI 1g6q9>.hޱ v1ײH _n٦LE ଆ%?A5;]|pTJ1FT`b&ڂXxdL`2Hs;V.Sh0a݁# ||qwbijpR~t. χaV1 &oVB ` v:nJxYg }ǘx9<֚&0Zhm۵˲X?N12UmY'r] %424@ҘOmkV$HJs>a|(.S!AqEqF 0%lQv"U#HXF&)|Vޞ_&@ZI:+A;9H [w田;(US#lNj~XŢ;?e?GDHiPjuk&[G8IhhR۝¥<[e,:! c).nU(hhҵA^j¨ \n2G-YSvG^aBG/P%eԁ846݊Dt8p-\/tީ I@%6:z4JD{7UvGullO?om߷oQkdBMj$BX$a"]z1bpoD V:?gR@QN+jߤ I yZ~4vi#į%l*p4L0k5@_3rPjRb 9e_9s4hB6#aXm ]b1K%R`?Lm:[HtHeu6Ġ].#EoJBLT2DoBKNm4ɔLDJgP!f#+?7<'ǣ-.v1œ:N[v|؁5g(jh6ȇbF#nDd߲WRIQ,]>086|D !nouB{ U#vpsRFd?>D(bq A"h Y9$B1R[BK +H4:8] m`R>9mϯž2Wi\Cx΢ wu{&ŕĖ dLi%>瓯Or =2Lp΋Q!&9M>dh牢@gS>HxI^D9{ `R\~RN|lZ0dǰ gН>g`Tnqβanw>SbD%핟7NI-ex(9;= BH!?$swGW5:lCr9(K(ŜU`d/0kZ&9BdٮӬLB30c>Yhavעdbdhu-^{ *"0e2 [ rD!h-h!!^QVRAVt?@ z*G#!$CE曂3+- O-V,+P F)4&jOo[$Na9}+qJqN +6| Hl$;4$ u\J (t@i5orYgtҵ بyuu-_`Q#i+!^%GeN(l"WY_XJ<=F}DF.7ڈY[7 юMbʻ~B,c;'mDR/7V~} 0e;: D;2ERW'ԊO _/eԤ:;D:Z]/M\{(ISQ yYىhVNV&Ʀ,İ}a~ܐ;Oh;^gǝ}RYN$`ck/^C#/ ߂XqɆc%\o}S &8[kDdf^q>G!қH}kY? AU ; I$6X\;DjfA b[pg gSOfK}a9YA}w;W[3YYEl'BA:I]fOWs, @&K: 4b-uP*iX5: ؗ#'S;cdy $iNfF| ڱuN3k/d~;cl!%I<`.ľ8 (@.狤l!*.?|Z|D=!=c$; eon@T]^=X>tߥϴ) `a/*bIxF+a>$Jmo)E5Pjhd/GZy6iPi…HZ%˗VP/W> ^Lb@ N aytn-)̻jeM>,ozƪ_C;o C{-քf!M H5Sg=WQTKD bBDf?)Rg)6 ֻ4C%SL"s/%a.xl9棚Ώ?򂠁zY mbw[R,X]'|RYNQ2+tpm#6ab|qυ 3';Cؐ!yx.ANW0?-QMuci\b(Ydњ h$SlexX)$vlp(t0PTf-ʕԋ>d 5_pzM8P*ŜU9EIuK'Zg,V@o3#jq:r|ʌ ֏ӈܵ#%)کc0=ɭavPCu`4%ƫwikO =f58[@!C}nBLa 7'xW|?kCYDH'pW䋺%v-Xom p٢WĜUsK0cΥZ-NQ͒ Sت4$YY+l}iu12'LHFp)muyϥ缙mbE儏n@L4Ic6F[B>8}k9(d֤ٱA{+ lxX1~3umG~ۀYS\тu nsku ,J^O`kȜ i nXZ؜G'88e7q4)^]iZ:sCWP1Ǧv3x68ж=w9~ә\$ulk-f oADL쇳/cKOIbդZ͠Ù-FE lx~{~3C^Āg}QD& D"PN]-3 rU֚ZNbso*Y aG&d9*êΞPLTF?xۃz"F|ΊHYBMK;v7c95~``+AY2xfQ+/V!ۿBrqg]&7+Nb.E}"9?^WHYꇵ.?-k&~=uW0%3*=SFӘҿKds  ,pAəZR4Xd6bf?10+VE-G;IJx$m)ױ$N:@ˋO@O7rdO^^#5]4l8իE hl$JH?JUE/fDk&SAѾm+60ǵ։y Lm}OA\ 2@ "fUFͦy^ ƹӦ|ߥfZ ? >^9q륗~?*-Ū5jC;j֣Z.-3BI39HsV}`D-TGl.:`8+؊k/tzn6WH]~3 `۰MۂdNmV̢dV2U>뤛tf32@ݙzD?|Vƭ y O[(XM.6sL(X_f9_ʀ,WD8J(Xj}/RťGH8X&dd5WOL޳|6r`Zkv\ 8g9-MσjZm3`lE?o&2 ~߾ y .UdCCs( ̨Xm੘k#;o7,L*D4Mq<4=lIDCfo 9 Q3?X]+YT^o r ׄeWF\9$;j&F TԳvmtҵzkțO $=JkHK'+)ꂹMRlyd⎛E<4(:ТwjGd;:Kt" q{co 7[Vou,AFtPlElRaBj_OH&ey UZUus[s'dG@8c4#rn`!7; #:^=|> ~#cMh- 㒦bu'Voѣ"G{nYN|S> qq4 ȁ+}0{4#ui{쿾^kLCS-%^h<=IW#)B *mϧ{arܗ :E@2jt\+I]x!1ym闟ˢO:E;t[MW&Op[m,JvTl?0Z%Pe2Tk=>"M|YN^#KrV4f@Vy в& ;[SgqG~:Em3%=:&bq6F=zdl[ĖU8Ds<4$ZA.h%AKRm2O'egY߽G'vOQj#!.u|*>0NBl`VYF KS&~r||Un~-r? p:em! ."%*)WtՊOeŞhYSL}xcJB";,GIe+ LQf ͎ʯ~_ODg .7믝wU?p CzBp[17z~϶M>:NV`f\H#S(RJ?Ī_ $= ik؎ -'11̬Ւkd}KQd"NI+{9Ift"nD {:j?~t兏-*vkzחt = sQܯZD&KmWUF hM8a,v$w|ՀztM+VYZŊs`ZX{#" Faٚ kނ5YNKVД?ZXk MK㈍(I D#K 3A>G =d qfӥG+hqMݣ77RN K0e3Ch#-3 +TO#hV@8 geC/+0u#yNהIlo2q\1c feqtVq .D*FKj]mWLA,7FI.|!4?}=zw`ac^Vv];ֿsbߔO^bnV:-z+s'ȯ/Z[Xv~VecN͏Kcui}ߩݔJ]?IMX.#ӕ\?8FͻT ;7 kӑnȶuhwMýI8יyuz:XyvksԞl؀Q(&fJ&f)ېר78 EfZ*򐡸 S2tzV5_f`jXw"9~дb!Yg.J]M:R]>ZZPls5cRԩoVI@Q "T"VynSLhJQqh>C ]]^yNܳoZZ2(A:RsPܬ"UHƆDO"]TnU+QBK`log뜡*6|XWiSe]8bx lЛ{ m64yY.aʞq:,;Be.^u쮮_.^ S }2Bx,'^z X&"srE!@gy$=Wt^Ud1`( zU?pSy4hA̹ѹd|ː8X)K$w2:|Δ`͠uXSUFոp14'oLJVgΓ5ɴ9]\+z{[;EEDZȥ`?dsoh֣dbk+ Hd`Ճ"u~Cyk jgJ2 7ɒR8vz!Qe_"3 gҢ Zqe 91 Ͷ`bYbo<)$]aP03Yxa 6Q & T}]˽su`6 صkj" N|F;VGˏoİd-VU0B'KceixeN ![282-n,?>Eڂqe "Cd$4D4n}  v|#-ɺ#ZX̒ ;UKKAƅcICDŨOuy;ZjCIG/fp.'jY_06ꙿ%+*Ƥc*\7sRdTp6] 5Ҙыk_=Ȇyx76ur1EiWIRƑNy, 90ϖ &=FTqh_|V|q];yvz}5Eye,RT6BWrwe/M~8H4To~4VT!Y[/mNc5&8AG>ʎ/|ΑmNw(/f $ɉ$pg`F*'"Y6sEWp9/_1$[LhJjhfs  El9 `Ed6;{ #S8h4zJ'_}l'a;&Z:k.EbASī=JG35h+98wVK& m)Ŝֵڙ_ea`;C:]he4fLDקn,BncZʜD(Yz2 3FV!iO^TXe)9C?-RgzE|Y4)}0!N!9]6S ?& 8L3ѐDZ^{јu`]/L~XD'S+ZNRonW7Xa3YUCby4YX/+iD"\32ԟdFo gA}GIvF5_?aPy*-tVľy[JD.3+TqY*Qy: |_rd|aQ<ǯ25cou,jċ1)6F(wMaL*QIUa<~V4Eg9L4|t4fhj`ƕUIYbHNa>e:>t߸qBR;,nmQqT4@ѬP:FI e}Z@L2NK;qw_v0RОk Ǭ#|'Ry PV m#l,4^Phiʦ@esGCL_$;t Mz4ęȎ* f2u~j)~w&40L$GA+)XfuTjSΘ*j}j-+[""5Tl{~\$_,Tv`iB2JJ7,iOL!֬Rt6)X>VL:zoVKn'w@Yb$f& [2^t08AO!`7, 5[O`M%j9hw߲(S}K!P-vKapP>)'V|Gb=vmb!/ȑL}e!-*;##(1UÂ>.C( ScpZϷ7X0G:vrduu^n|,)u9x5t|T#h{mH)[aƀx.IVELz*cnJSX5ˊA ⪮S`e7&MIOeDQ TrpX$ L2sD',dQN Mf[dŠSc9DԮ]/G(߼[w AϬS[3^hXLړQbIJљRedЮ9+4ij_TYVYJ(0fak~X(&!Ti0qԷ#yX~`Չ1.1L-uU'pL-K8/][&R[ @2={qh8S77t :0)>@`̆qRdlAA:pbR)p ;:B{}h~ h~:Ztoa!VO.Gﯿw/OK3‘ ֤5Y*HS*DtEX. 1H67uІ/Uњ DpJ8RI@ \r͍TMÆjBǐI5*U^7E#GHu;H0kf"!4w@oŴcnu.}Ge8*_":{CznYL7c{VX-0R$2ddR삅 - b~n3@–jLT]Io?Asr TvdRpm0IױnU6ot^NSNԧMe/pQKc0cXpw8 {!N c+hTjj j`L(#]X1]J\sQ݊QMȵʒ" c,/20|`"h~]yS{džNzuz[ag)W7$4\RerQҩ QXca{-qGɓbl@%>,}Y>d;+rw^#b}ƚ'Đ@7R] f/6.=Ja'yK[ד_{w_Y3Zn h1K%RO}3Y:e< JF[hixR\Ԙ 9ثHkHZ3䤫Lr"Us# a`E;F>C] v#Qۡ Թy - vRռ#W(0ڜנ&븏p1?]HI{\3zѲ"dӲܒeV;6S5ưx>BdS_X~&9RCbimw)7^C_ -`Z~D.)Eg &>3v`7м@Ya]osHf*\ ]&xa;O 9%u^_dE]g(V}vvM|"# _|2&@`pm3+hd$a4ːSU EXGy*#`M>@DBvh5 )^ڒ9z 0 x3G*K81 ugѰ_~R^&u^~%{V 1JM{ʥ ,J/䖡ruW8D!<,sZgm4tBxMs&TLiR2xU;[U Q #!}J_: :éĊYt}8GChƹ|K^s%@aeƃюV%Cr\tBf&S;33g8QRVۅ"ºs衫C;-9{Kө,(o,uL RD&/*RD86}F%YƐG )3k&thAKOΡe{k H}YKc^ QV>7;\HS_K%k' 1ep[Y -Ep]iv:odfw.ktI7KZl;h:0j0F㱕H=2¿+;רO WPw5b dr!-o9_6YFߴ9$q2 &es'^YIwk!Od~ٰRR@jn{1}2*,`JZ-۾S&`hV:pŊ KV)E6su V@^svu)"UFX7GfGXωAUbf_NIrܩ9RU'g^ E29q Ѳ\Q/89+4`wI5oE)Ozٖ8ru^²}R`VC'Z)] &2sNk)hZ{x$,K%rFWEZ)ɝHw +Sߎ~G)V7ٖb4suuNUz`u?yS֢0Q7]քUA~KsZOп$gXd*9Oo#/l&I u=5eг̓7džw e@$Yu}TU3lJ 1;(Sx"кdkF4>6G #X(%12'~׷^)]{|ry- nc˜Lzk.ʐ8gMT@йI_f 3(<(n?|q թf-j6ҁ*}@ HmQt@RW[ y坒XSt )SO>moOZ?oJ}I 09#dAV63屑 )j4$JE[S[9ᚺV5Y/e!Ry$e`6HF7}S[F&gQ/cK X$P幪l/C/;$ P<O N͒#3*J]Meh)a&SO[:,-I2 >!f1S[,.RgXf:Yx 31160`ehZzdaKg]Cɧ]a"OSfWe;Xwt?`:Lun:{q2f3e"c2>˒LʣCsPlcǛ\4^d)׭tiav3FԵ2ĩhXJյJ̠NA2\x80#uPk [cF +M+ if@HZD y+BXKtP 43aX{r>5ۇ ,uJel +`∥vlN&: K޸pu{+Sȏk_:{žfBN|@}Q@iĦ[HeR3.u=@,jƭhj̓7CHF/c1]/EXWLS/};~ɍ)r7bqW6̓`iRە.O5MZ^ 1?璉֏˥OvR eL 9Cgc3NlNo~ &X3)$AN>| 'gEYpu]:_UFFhEL oSpbߴ&Zd:F!<` }9^z\ok)YYi.kmAoblqg r s~ۑs]ԃx^b9 XXz!"¹%q +KV`$ȧܛȅo$6GOzړ֧UhLvTB"M~5>lk%< ;e&[HZ\ 'Fvg֚D,p ]A Qy.5 Bz:֗dU pRƭyOU,{ ^LKfD03A,Ĉ7a|'x93V~H[NA}Zm0IѢZH˲9z kt8Ll?;ʆL(@ƹX=@ٜ饿ec{Y>(]vDDoz[eȤ8 r׀wzd$SݟWZY ̯%9SHX! 'V8Bwp%>XC\a[Z)nMz*wUꑺŊdya930+Z`e+!`*,oNvk1~:ZɄ(Rb;zZo]^G  ot6GFVm˺`=rן8jRbY;Vƚ~=|dF*Ɣ:u|4[}S$iː>{꧸/l!>9O7*c`D%pH{>+g+JzU?*"M#B FILU;̟!"EEMVjzAzAAqa}}$g IjL>Eҹ =l!m);d6~CAExAD"@#EO?ITrpH:7T+{yrvP䋳#ȌdDm"YzSZ쳮5]I$A.Np]8#5 Q(z.uPl+Q ī Cn0PonN1~RFa;IIwhlLl+9NK8wTg`~@SI8v9^A:8Mp`HN6-]Vm)Hw { 1Ƣ'n{>7_~\TJnFQ _ !4ck#tG֏}/zD>Vo|>#` ^lvRh5Lx@H=#˝_.e 'q˗V1Wc+鍄8đB{8kٔ%+ϨYzo3/Mw0߻⸧/]!g,tY:KoMwbi`KCIENDB`nrepl-0.6.0/logo/favicon-196.png000066400000000000000000000756471342636505500163010ustar00rootroot00000000000000PNG  IHDRk pHYs  sRGBgAMA a{IyOre9o9\fW\rUU*We>_z&߿uܫN۾]e.d?>hq筮zְ [F}Wnt[}?_)Y)*o?ur߯_~/޴QYGw?XgoفM:w.mlr;GEVyœѧ~ *o?n{.׶w1{ `N2qۏvaLV;:Z c!!܍0aQ +x]|ol;?c?܏|ǯ۠j>Z g8`H%_&k `Qly][3Bܰ /_ [6Zzی3_M͇-\B4hhqA œgT(p ?cc(t,9Pr2+BF* wpysHVNH7°ēSarbFa?_[Ư?񨽉Euܬ0OG-)Rj%4_η1Z57|}a@vh]mRՃyAS7vS?&(d_0~a ^~+9'KQS/TV!רj]JujLi[G7?ck A~v܉ԿD$9%hl"s:"~)$GAٙw-` C|'B,i.C\ ŗ|w~%Ξ.p! f!!+=ݘ{?.}Rm 7$JL(+qCʟ`(v=c8 6 IيPo'Lu'̕Pa?w۠uH@ n/yO`yJv/פޢ?ցaf%[4%æɷ2î`rkJiu?ڮZ>=p_ؾ۬"1J[P i雖$ge>w/X5]CA&B3:4D&eَF ?3t Spm*O6ؕP~e M!AZ6 (+!J =S%D^ʔިALK}HšRQQ;_ ''㢂o[?8O`PK!J6 / W8+˰ ۍ=YҋΈycN^o3"ťI)L[?ym?SlTgk]$%L?~;.2c^1?vZ pNma]+K%26˰1^ )|⑴똡oðaaNJ}0gJ˱{]ď^27>q|x(0Peo0.W9(=Ĝi+mq幂O0؍u#3\݌p9esz2/؞=io~Ծ2Cxf3 s+U1jƈ 80ӢP(#H;f[ZYBaʗkU}?T,`:okf*B"+>\d.?)R(^b!>|/ZL!t\`4+$= Vfw!FZubt%XWO,ͧWB ʧ~繧7R~?SYZQ,jRyLggP5>E-N׭CX EkZ鵳5ôe{vml%L__2R3ӜH u`Ukc]i"h56x{Eb^=(^f~oY2rT/kܓ_N0̕Խ䦣Aa FF)FA5#dT*nцT@G?z7m/o0*&jR U>n橗{ Mk#[RUΣcŸ^_kѷx*ꙒTbI35V|RP_E>ۜ.]כq;$z屻i8sߥm^Hҳ_?럷߅Ss룛{Z}AL!VV۩ݙ7^]o=//e,_g]R#xF*Uq"/g᧵>Zj)K^UF'^T۝s J|L 㴓gm}gç80f1Ch_oNzZ#Rs E8+F [.+Vd ļ|j?S64.{p89h$d>XL!2hSD?8Iꣴ) #qiv^]b)dX/>XjFRD)-D4)iX/ &__Y'ͧ¬9;-rSjlB&Ď($ۨwIZQu JG{ư[. 9Gā{ʶ0! rniGcH5m/&4j\*7#~U1&{r/ .;CVT:WJM/`ҢgUC y`bh`cz}@ L #B-. -~ctk#Іb! 6;N/n7;K9 nn15g^S&vD+tH6~~A7՚QEBQ;LEU~e7i1zMSEY FkNrO ٽ;Kݔ,5&lJKY֮2i=2e%/K]^5r0n[a!tOMԾ d|hDv4ۍ1 u4!}X=s5-_3(ڴ4oGeJȌ .'"*K'uǾ0Yku5?T׹,1=.ggn#9,&rԌ;TqMkar´@9`QE0qI"Br.Gη8onvaf:ϙVC\0 (e)B$ʄ:lD`ʜaI9)TX+Q+&x;gonqff: 3 &En!ABuP,s of)̧n\a9?;{z`-j[O:W]SB#dhЩnzOkeJ#(At4 & Qz(GBX Ui۪OA&~C/vBמ:zMJȱ vf$>!Zr)dGDM!>| #5_=!Z+lWuT@s 2V@WJ`pڙm3OllhR=cF9 ŕ siJӖOskt;IkC-/].W;y׏B6E=!NWg! T@O`DjxU۱:4ֱj cKT ,|pXyrv?do˿'.fJ "a0wR5,8wI;HtuOp &q/hڭqɩCL/ 3cF9 THȼ%P'jja_}W20IECgwoU7aq?bրLb@+r I(\:kpUG z`t=; ikKoZ%c&&hJyșF??+}!vi="17v^;x]q{888_w%-Uf44yTTO:yf1]{M%rѴd: 9LTq5X/FL"5"hhYW3dL%ROH);;7>j==ftBOwʹBX4 Kh!gbX-bKf57Uh63˨c^҃&@zBTwpiޓ5he#_eguF5V.kgo"|&޷5i6 IJ VŻ/P6=5-mE|-Z G3Uf~_7bΚ&-NQ?"@1/l͚6Yۃ"Ō^|1R$Ke}2JD OejW}Ҹ\{7T0臾I BA`5td8Dh+Z0<zrDH2}fu,[ItYY1 75C-h°. ~Bտl~sಸw.zzn?0/Gs!x͋]?k!JPv"Vr>|| xqQk5+C-:7cPO٭merroi]u>sV ǘo6 u{b\݅a{Chs1 %` #5ă_-Б q9.O֫7}ax&8Cق$Vh:f) 6EkS9B:>W>$vdRW ?1ab"9jZX`hp#df@2a:ċ{^[~KO>OoZCTB9HCL8YDܱSkzS~Q?#m1sݗqX2 k^gh}Cv͔jJ=Iũ5{m2 Ŵ${=aWA8vԬ9V39̺jMZ٬z-j"Qۂ q /*TJp^_O='2r2M0}.F%]b8kheT\7maaނI07[:A!/X5l]Jhv_c2[Ex/ YhIka労U^^Gr-Bn?xbPUފ>i78`TN@j8}9>Y3Uѧ_׷ukNWE@2\ TXޣ_ 4ԟkdk;B] WWQuD_Ym !f\a:AC?ai\™YoL-etvHxjDw3!ϊi$YEZ[h H)ǿm$7:ي84:JߢO_= œwuq?$XөqL& Sq"v Xbќ!ɴ޺^F FDL^NLd]LKiM-߲ цHKW3k6fPƊ$퉚˱KgCTࣴK.gFI K3 ֈ墕&'[bXQamJ6U~ Ch6rF}wOG@ɣ^렴^&ݥyn zx8i8+p݃ z`n0SalUtqrٍe}qM7]Dcg{,Y!i`ɰs}bz 6:ѓ[*LVVu6y$U嚭IFew5w>}i}PD+yt䄷@ ͖S2 37?=FGvjoaޗ& EquKgt%Q!kT@GjՓ-+i4Ey11Xnօw9~_Ȥ^/N|^h3O4,/1->.0?kYuOs964I0tN-Emf 2QBK4H~I0p8s*\ u;LwI684 hʛZS0up3 htq >̎c,x/[{XH_;*%dvY.z\; E> :L8&4/G?~WO_hn >iH;p\CiKx?.=>OE0W5`'Ed:0z%3k\ Zˆzހ;50pj(GsbVގ<:f$Nx~Bq7RvźG6rn@6;6٨vT4 H&L^AZ7S(D-rP+, Tm}Œ1cufV!C /AӻL)/8T7*J{B/oSJl^\x)@&#/c0Zlh[s*g[NZTB#?1)I/ h6Hx1Rӑ}z}ZBtڗg1S!_h$BdhM\AM_ϫɘk $KL`nf6҆hC.jJwU^fIى6/&FhAHM(d/nb[tw{!nE&TZmyU SM]*h9-B0-Z)NfKOcA,"M>o٭z!={Qg˙p<lq1viټۇ`1Zkg-APHDM2\7VBcr?8) e,~W4nAZ\ Ѣ@ˎ=u8^8Aw *- Tuz ~C,'قhLe͍D'0Ǥ3 uFƵ}?unj|;²ygjԼО5cE* ġiYZJ'C2? M(f%?8bhWyY%Y`G-|0Cz5TaX>Sa+}ڮ21 mK~u%F w+}ݳL.im3R)n!h*$>t \ #+z4|ꚓU gf U;G7oDP3RE+Xu.R a휪͌ݘ葴ԤC{ 3F.SY6D4>0JxcXkHe"USy WW/O߂1VV߳VEf +46;ke)v~ӱ;?[F&x. j&lcSxvf: uR}xڲ`xz(+8E"hQ,hTճB499 ev˂S+uFjJ%f} Q !9w-+puΑ(iCEt›m/GB~$횹0t߈m)Ɂ6N#TzYVaXz|PfQrcGn.i7R&n:,-@Ƣ~@4iTs2R9ТПV;[&2FK,pUd'_(Ѭ0g:AR<KGg\{^/u<0wiܬ}V}KŚK¾pЪ^T MNfSO5 ?ۄ"-}ug969۹׹6,mVl10 h[p*XBU#K/6#{Q [uDp"r  KjG}Z!;(;If̲e) 8]!Lb ?΅"CKK+CZʌЛ| i唐G*jI)^ ^芬L|(&gO@&(z#ulk=߈F࿆E?%7sI'.HPJ. '0T@9t7iCXY1@OeT74aI>xRiYIg;8hOuTѨ{81ExT-H GsU,#kb[yŘQ:4dcC}E`DL5|=fIO]әa4b<} Z(.>H1g`3_㢶r?x~rF 'uKY ܛnԆkDAnT؃pdbxrܨ,TK .o$M/tH 5iԔab1SU=f֘9؉ >~o6eA*DF39](>gEeȮb;{Slv6y oi, `MDcYC:\&0N(<b\>Vb=\Gv2lsVw&Q56qf7ܘZ *u4[&M: MC-e?GBcc-AEx7B]wzEeǧi% /-= :0/ M\˺װ@or Aw5mi{ P Q' vf08x;S/d<($x6`_?KYw}Zh?`ҝb,,k(R0rS4K>(c 6Z,_ܝKW{3]D9a0|ŲSLuE1l@(gCFҚ([HU# O@[.|B+u,c?>*1|^?|sY3ljAh2ٯ'qcbV\cUS3Dm]ZZ)O7پ]noB[ WBx;ܹܻԿD)1J)- L[+Yt,q19!ޏ5;"h7qP([Wj޹0Dqh|Cuպe8昙A2n?C둹U%Ĵ]0iI|`jA4 yzx6fLӶ 7A[t1| ly ѰM⇿kz^i4X#ݜ{xdYYZ,N=Q]kekA0seY\☆7 $~%hha]MZ(()gC(:v=T(nkUx it*&"]zff8X86u.Oq{ÝW5`!Fh :ױw}O+)L_cQLFFS{!=w`"ٵhPr37cVhsu2G3N3*]sBl\"f"k?!4QJJ:gt~R<:T%[˛Xa8  =[=̎sO hfX twx{o}^Ah.Rt#o{h|gfߛ7( o(4N a ha\ry+x !@)>)F`B[LJ.>E`FestOV͌7[Gfqրb5Ao VԧnvWqICTSؼq.;5"KۥWXh*|:{}̃Uo&zi5h%~$\^_a< s\TZ~=Oxy=l $:\,A*?͘'^2io>½2dl'>B~dǦ)s^v/Ȣ}usy*|C4}nQHX Unl+,%h>|@hr088kvuS}e=5peAf)uc,)\\]0"j_aźPb eꓢBA=H,sLP7rvtxgkvA)f7-:cgK*|6L[Y2.؟ԐG4?1C}HZYQJB! . LDiRr7d fH ̎u}͔La8 @C-ꕘVg`=..nYxC-Ֆ k 刣dN`:*A˔MqJ!tf@-mʦٱ0ŬqYI{LPqfttE`g5K ߳g-JLCT6墈DpDg޴Y2[}?ok,J'/ n$9B=-׌n&jTRQZj@Gr 'PNA?rku+dմA3ȡV&JD[ s PVo8{?ޥwVhYgP\J.VC!Y[@U2]a,z& S=TT>sgwOo}I2Ywz}tUЪ(&-jW sl1p. ΈG^"4F"7¬DKM%;_yE @(iG}|]f!ApYg> Yq>W`B0)> mmQ^G/b}drvRx f)לAEډϖ8'KakzxN'W\0t9f5'%Wj)̐6J3d|&HU.PkvvIkR *Do(p k6`70A3 q3<ڳZ/ws$!r|G齮%. l!;KlcC§wݵW2t=DIs@S#0''fmT:`*GsJ>_TkyxEG+`6QVBgL4>Sh7<Abɇ$Ԍo5 0H)@&cs&ٱ>w\:a{Uv0d!O1|]0޵ ş~ׅ[l|&zA/g+-Fe"@Y}C/o)XLBƞpykaT|I?32 IuD ]qU>Z}0Q6Z'"Ds6u_B°M{s0.wO;՛,5cg؄c?597ܜq Mn m&ȥVG8ؗ TŴ#r}C{I;eP'KsPq&OBiTGfˌء6uC'kkh D%#:Ǩ926eX;{-Hݡ߷3CjtZ -;/ K>JBARL4  ~eqZq+͌QjQp O42IxqR,GiD}]kdbơ5f#>z>Zeht5jT.BƦ3v3\=#W8{0+92}7_3 ۧv!`N /dlGϷ?5DB]hlv2\z x[+c˙5):(ԱnB3Oe%T)D'ĠQb|ĩTFQY(,1yP&f::HFy4[MA\kPQu=؄a*MB ؀P>vz 6K[g̑(¸ -u2A ]Z 5_Ty ~1!*0mgIdd8?I#[d\ڬEFUW`:ۖHYeepj2`̦癢m60(yHsxDt;՟܄v5A2q 0c8AH5c)9fe@!'߹GLA +zP5mgh3[@Qg:uc)dFbe3(X-soj%:ID&F*1 fn~Oh vk,ځܼ2 }t\A 0)Kc 33yzkμ>-U-0϶mew(kb^mѡ6b^5(H$Rϸp1&`Is<P\cnX-yKz1R -k^@_$װ>o/\Uh_)|WސWF,T͙48QH$d 3(2lm>*襽F*٭yFX;4Skj/|nأôQ-UM" Fg1~՞ꑐj)޵[ISOF76#h6[9'M`a3,z{ f`J\R|&g9eV S?dWњ؀ՒG'aZⳂ !_VXͦ:GzJLhV(?(SML65!|j qkӌu(=t1:HE 66l{Uf~902&4!D?0W!BI޹Y otrj&Z{8Ac`֌OaQV57 7icԤY8bר wxua0{/sВ>MyMX6*ѶvascFClkI0DcJ8lFS+4Sj<֤1V%RXV<vGĩ=2j@*,.?mX iL Izf6ۋe5A@ht|x"-Cas W;}GVoճ,`MHӱFx W` E+[o) :7fJ!'oFԏJ 0줳!=p\:gފ3DoD ǘN:C%w+ZPP гqM>Oz?ngƎ.a48>; eRF{T7 h 0? kK$1@{*bzaGBKM-8un[<$ î6ֺ6׸ǘ@ c!F48P%h JU}q8 X9گ[fi&JBФ{?09XFг)2Ͷ &7 )ɩR| BRN㽳!dߙo"F WTYAю`aC7$zB3q-i: XqfFVw1ۍl3RwH3Hh">m;bW-h0-֤@i; dEU'IiGגjh^*чۘ2kn Fx>}~߁SDfg[Ӄr^tm92ò+ՙ~A#|W DM^Sg8ǽp|IYjnѯQo:tnB+) d 7/(a8uB( 2JY%ba7_tg#Z'Ad֗Zx[sR:cMlّhH[V=0Ќo1C#_򘎁zgUT` S+6;N)%-!/JSTԐVj?独УL<0fU@Le*Td3ÕjJ@Q0<uM`F< -ۡ[Xʣc^=N&~Ekdf1 "F\T-Qa*<"jYy$+݊D Jc;d4?KP3؅oN/!8pK3`K2ڲ,O᪙"mJ} w tܬH=Nbfb$ `4'pCAa U Bo$2e|Laf!f~dmBv6ώtwm(?gzagLs3 (/=}hZ0>2$3?0 Ck otSȚ-߳U1aE>۫asJh>0)-i\hF=8.y฀W ~Ԇ^v&PW$B 3@.s]8ղhyh)=߷Ѱ1UH *?XR=cԑl2%-0; {YSVa}% t d쬞a2;(ܖ4蠄,0ha/-}vj#p ӡ/TECDntOMk`5~"]#f/H'7}ݟpvwO]0zV_omhT`ogCɽD&͍f?Ԣu2?m-5o .F_vx,b% DƥL6@7q DhF`tvڒl39k R;0"x[sl/v ڦ:$?0; 83IhUʕv> DFl>};/ 2>VF [t ̵\r k1 ԶԶQ+JY(&Km&|X4(;T B_h櫝FfЦF!&\z3 peg&1w 1bٹ<4؄# ̀I0") e 1eylȇ6 /|eFӅ?"&MM䋥CkZ 6߃uh8]Դf'eŭ~,L bnjzAiPgd3BK+,;-\vGZ?CB虦z_ Uɬb.?E a!+_f20v#=+j+mWzI9꫌*Z ȣemL6& QuTX8<{ z+R+Nl4+ z[ (.:L,ZM"I*kgrw.+AUȨ{ 'G+e8|yg 6!)$k\EmpZj NQ&#?1 WdӷX~)"\}6mmPycD8%O$ZӋ>&cKB`Uvl!V+9>{h\c,wMd DBUpL!4BA8P`*9|0VE擅PH.4L7 ,zISqD&eET@3vF911|*97Ȼ#*r^j-mוfu&2.up܍fK|2:K ?q>n[p܀ZF +27D弄Fcgy6Vҩ5 [Vl 0QP1%I Llq7gwO?/S(g BR8Ιr~r$t70 UiW&q0|l(S󼉐gs\uRND|4Qic>ABZ.uge1vnwh|Ud#Fr?W 5}+2k =oa k-G]}Wpa:Gڿ/)=)1&PP5`%)KODZE|Lր@e=,B:6?BY?ijl:#^Ys%[2W Lm ]!CP B G\> n1 Ké*H0Bi@ }~0/H vk06:(PBc8kUw#O=\\ so\; IEz%-P2zT08^9u"Sg Ftac_Z;n!2#ʊX_kb;b-ե]5 ϙԧ/S-hG |wZT;h2NInF##k6{-y_o-?QPP[.>dH#hfAǼ'zü*!qޑ~5kbwxiQC&3ތ_6ctNdQAjmm'cgkf^ǀL}XHv>pvڻe1hf3}) Kwyh]k#k)zvw ܄C vnЖ-nC1+E4)' @3F`W>*c6qWy!# }6-Hc i'Ut" nCӍlzE}Ҡ[h><!AdQ;iGTJ`;UYZEM T)Th3:9^زgfR\ϵC(Ai(k1dKz/uPiF>)4vL>} ^@!\Ktc,DYW>64t7!Z>-iU w0sa@r55S.H3 JgX2p^CX뇯c̆D?2`u-k6{,+g%e큏」l2Ā9[5u'>87.p&a #gK2)8P0qΊQHd?SKBHT%eFLYPQV17ADL cdɼu 34iZG !c|M΄B7оx # i(rm)l_zOT>o}fK879ѴRFR ZίBoXݯnO;8KsiT3%(T<4}5IaQ/^W>[w/fiA\w[5;Eף3gwؚ̍ZOQkT|ʚv,N8FҤE.kA!0¶PQ"mAKqh1pm_|j᯲(Uo"M;A8 XLյy)R EM' 5,ЂiMz@l=%Uis ~x۪UZhbRUqzeź~& kL^vdOy^ &ČX+=ޚWek<:zॱBme`:s+lK+f&j{`tM*Ca/Wİ|@RuU&^ >8JA6'y*-ñ |~fR!Ad-T4HJ-4srN_`#l yFeXa[Z# &zZ--xPE| ^KT!Nץ&c1B6 k4A&)jF$@eDDuT=LѴ6yl#D DӅ,/EPv8;)K)eXj}fec@5ͭC0@EO UU#Sf0Fj(́ fŸN 85=&kUee*d*?'BU4$znס"HuZt#d`bMgS(]۹ &ZT"븤t̰SIU߹5%遇`JT @Do'|" (>#iB'3R%&85xZB1uf3; $ m#A{Jkr_لY+ ,c0b{|;&d828v¤&4ed1v 9qOoMΣ#!}_j3 mh-oex߁+U~5{QLC.;'6w b^0`.cVXZ uT{W{kh!k1.Oxl_ޏTOl>͵\<1IG ŴT5X`0i^11;D-hs[*/ޓ`pPd"t=,C`^]9Q03YʫICjo΃0R`kĩ^9eeTLf#Bbc|{ʾBGJa%8@aScAOs:v\ skbGllOEMN4{.qňr0HYxi&7A1t6GOzA)dtZ!&j6{j~Z꦳^JҹMfG{܀]bNA*,ie <^zv̎Ʒ]}/?j/Zu(':t oܩ^$Uk=0?6+SBJVۺuB<7^aѧ`\rbʛrl{E#8USCy(뼭#~2,ŚV:e!ͽh$ _[W*|^_ó[  mdMo]tQɢZkK&i}ZM\(!3eZf0$M=9YU0E8O kr K>foif%HF*UQ8LhyПS&q=pJx\𞰙O‚ PYņbYY2~W}úH[C%Nx~\" ~ht6oT[jS-jEcЫX qV&~d=V4oKE/\XPD9Тk31f Ѽ2a!cTd 罳[hخ" ` L\a5ʄA, ,źFeQ"n4" &#Ct;z7e%7Gß`iK/; ] Zo\Oy"A YēcA `v*4eXXoms] L vF j)iFˡ0JU5uR]piy.Sqe*uŚsfxqۿ=-\R(\߆&Kq0a wښLn*7m֎4eU I@\eZsT›Mry9M1i0#ߦmPAL xxEIҞmDŸ^䓪%89 JAqi>,7;?𗞬(o2b(0 G.q.!T(sC3wҪE+%cS1a X9*gWlB| Z؊x@`DŽ(m-OT]r? ,"Jŕsݹ,$X9 =f ^Zj" (Bv'zF,S"punb*@(Dby嬓b=93'ԈEP܄>/a6y'ɋ }J^ʴB '|4˸>Z%]6P  Y $`&4!Et ]۷/ggioFP)'%$dgO^45Np;=VC:5ƽ'k>;&YN,yKcIu9{/IY(SW>qZy | jf:W8_K6.)5ڷJ$~Kaw)> :o[b$1Cl#j⛠ѳRG>WWl ,X4R?љ0B^%&h3.RMioF>h!6RHb)FO W,wfs zڡ^DlDA밴.^jEb?^u@Cwب,в jooh (ZKkB}e׷뙕/QZ8c_AB)PӃ#Ӄ&9d )G-(J2fY{8V'e9 MNy0:aSˠe'n0mA,I lp些zL =47Bqq'3ӓI]78=$S{lP nEQe Щ>I]PPw[ǟUFIN~7IJ4Q6Xyv0hyƺdm$`\)xMKc)/^޿9? ƫ~뀨:f&S53t?AW#+DwLֽۣvC$F5X& 9f6öѯtp,x?72<UJ9xs:* fJ-DpfG;[i:qsu)Z^VˬY,N~ӐqI} 4͉zG&FcuةzC*:}bQ ['WlIPa0NK8utY3#vkOFk^y#7o䩔'Ď{;G$Y/OM`dɦI g=J!9 |qބš2'3Uh5Wvppnxq ٰVFe MpȻM@j!Uvܾ-Ӟ!)AvADوu cYo4#90Gm,~S;ˇ{ޒioFBqY g{#dqCI~š%\VH LdbūwͦwZu (/z|n,&8b!cDKZG A(j7#dӨ6LvKnf>{nU$WsWAjn@J.f|TPf!dXpTê 9{xY퇷z5~8rh"wԥ%>_J:hiu䘗Eu% /]({HSׂ!&i+-w m5*̢J#xaIE&g޾A7:@yϞ\۷Ay4;DoxXڬ:tb*A/F5CvLߞ+ .oq$^; F2.zeK!E?]< Z3(Z?ntWY^~G;m_=bA 7 ^߃G㒆U1Ҿi^f??;+axug>n\*P uxnwR: V G[B)$KaD Ry+Y P<~/Ѩy;EhT=$DLN]GF0U);(@+[_}:*C(ܟ!7;9 g湺/faߛc.ϰ"]I% ʝ?~G_&c=qzh*SZdž)w7}eqYgsn /G H'q.6orb^Lb"³nގg#Q^7ˈFc[gl%mLݒ@OE߀h7C{%G8oSED<ڛ:/JwHfN9k'e  ͌Fn^oj2dE'W姏Mg8[{f!x{=_ioVBY AjiK3Ʒ454d !PؕPfÍ%P./g 38B(o@èeGEG4A@Qh1v0Bj~}r>`ÍѰip(o@eF}o/>x1C/`̒lw'?yҮVv؆ uBfHG*0{{: +mח!h>p35PyR6Gè?pMvx 9OvGtĂ}gg-XhG?yʮ^vG{ݿJ%ֹ@(o5|;|m| jԽbM -P(_6@g[d>?&oD®*CcߕioV|c=yz LLHN[rafB66{b}GΞZN̬"O\QHRo`81ڏgozvUg㑧 'ƙnϥ0!&L#!VLsI˹o@T?pc^ѨʁrOm -6~]w]7wa)ߛ\6Z>um!ʔglEdtY? #/-4ùpeM~M;{ǣWio~)jl{U# *2DsRr 0-%PH+^k]ڋ;rfjNYi[w.[vUe垚4z}WR躊F.ޢZ)X1 ♨(9JhGˣ; q}gHa. ׯr?A FRM~Ic%mH|}=]rvex^­C(ΖA-tΝpBӑlf暾Ѱk^Bڐ!W(Aʯ-+(Z} S=b~م|dyRL3ё'_HRX;硫\=SrѨsx֋e~շMBPc5}˜o罖kh\r^2s{/|o}lB_^ ۬B'wRsnya"gjz{=$;V@/֡ۚkXWS!T\gv¯\rUU*W\3IlvIENDB`nrepl-0.6.0/logo/favicon-310.png000066400000000000000000002137011342636505500162460ustar00rootroot00000000000000PNG  IHDR66뼾 pHYs  sRGBgAMA aVIDATxuu!% h줱QcNHh~ R)Ɵa)h-ٲVpӢvACQv=)-KWν׺u}||ߟ=2l_ɟ}!Wl4Ya߉8Rwz@8멊"ѓ-x;=^+B=as|E/"؁FC_OްXC;o^~O+O=;u )hQ(A/~/+u~/OK+p#6FvšgXw݁?s^c>cN(_wt?:u{kWf'~??eeۑfnj[eh܂慊Sh0~r0y%'^xYwFr̲88wG~m]~7!U4>~75{,+E$;҃ #ZK ZɠUzNCwL]PS}j'V}qa~˷_os'J&W?W^G?u\" P7ow>XUV֥%U7ak%䮽n+_w>s50JGpCKq&꒗$Gٝ:u泋Ϻ]buaYoCwӻ tiU-CG }KbbDCHPqvNjݗ/}\KP/\eSksw{z<FGd'McTue /A)o]).6Xv+<{T}ܫ#|/ }=5-{ _/ϛɵenu \4w2g ፘ`sIHgZO]? 6/7˾:k:ϣ櫭'&rF$͸^i&㣞4Zgu7NԟeAR1n 7Vye]. r[N?3`m G~ᒻk#?m~-̟u pa#N&%Ź]oAAq}۶2 8EW|#W;L(2!k&T~k͘&y]PdI깈zVjV#7uL+kUߚ[PqIwvU$s{G3L.e-ե6`^b K[ njRN[rj&)&Z ĚdPa7db&pc?v-. ^Z\X7kh L%ق47񼉵8 [w>= +͍)s1A%]΋F_tOlb!2.`֍\OI(ңj4jqn[L"峌 \6ЋvKG|{ǛWj@4l[*f ;!׊a C%i@gl;ȳӊʼ<"~<';= q[@&*|{[:b}&% CY^_6qNGW$krn/Zi}M\PĴl-rqu,zi-b? h:w?O}cTsCGJY &c:_nGnv!L HФbd. ٖpg J%v 7p̓{ urc`I5@*^ߐnJvܾW+B`i~-f}_dɓk9H 6u ^\缂%_3 ԎO??f er9=aCڰiѧxS6X/ᖦK ,$ R94Ģ{-F%9c!R;\g.t]*r^;DŽws˗Tf]b*̎mBq\B%e5Yzm{ wȝ< ޅrlO ?#-,MUU`Y \q@ , h|e t$VѿU#?zKl=%˭.nZ[ܾ+;ƿ>u~8hxȄM {I3c/|XnqۣGBG~{mYя]gGY[$J `[-bzB{|ֻV3ļhͶ8,gTkOO>Z#$8ӉWM们|SP":f/-I蘆1ߐzm-UwN? ocfmX#S6l;QR#hfૅT\*ͿGWx[6,εH41ԟ94Җj/GW_]e SlPQYYpzn"hyg>(cp";6sQ=7-֮*K=90q1+ex @e8 LY܋#09x#!@ml UQ'4-m q@W{uuK;¯^Y$c8\WɤѲd <mx_wݫ{&pU?cوF xo=*7a%4qt-\ f1\7&FA.'.,Lu, i k ҈=luLs>u͖~˷}{O\g󜫰[10=ft⹦ ?Y6a6VhC_ r[Xj*n6? idZ `Xx[O'P iL|~Y^BX/OV+O&gyTڋ1޴o _{+|\O'vA^)ο1T]g=Tm2Y"f]<ܿF}%=->;pVViṩ:-oخKc!tM7Q!$&b${ ȿi&V*\;ӕUQtklpI]I$:pQ84g5&{-,O{oXY+3,Y؀4TQ׺A߯1{Ĩ/^\6O<$鞾߳n,hJxUVO3/FVYUG(r, .nARK[c60{r4M01F`$`h}{^Y޹bE'w W֮ xks5P#&vo̞aU%!FN)!ђQ}tBeo=s[{c(iil@ gM^>@~Yi;{[>}ioDLK:.>6l n$?LϧۡԮ3ZշXr S3-S"ͩ%0Eʞ%e7u͓Zý߷u$k[ɘnޭh&ʓgvk6f2i/֫B6Q!՚ >fuFٖXryRTR]?,,ղYn^\4Ub3צ孂KA0j^=TG8V Y \KH`F7yZ 1nW^ԮnC;a[Oq\خ&f>[LC#oF݊{niw/;mk p esZfT-cm+5!,3%I\0#XP@ dk3fc6:;&}GѴP'\>#?o_>Ͽ}/xX>ʓˏ_jIyUQۇ(@4󞽎,%nymyR؝@xMνUݎ=݃y/`uo VAw' TVc="KJ`Z,wWb290ʠrkxGk^C| H}o?۷?s%:BM+U. zn0iO#4U 9AU&뭬">ȵuڸh>/_Fm\ݴc0:H~~㙣D;u%-Lp,BOWKqgB7QᢲB;WXKq ~Ko#}Kʹ:oDXBɕNN;kj9D!JOt~:9cGqeVv=[?m/W|gc\8]k^}m}]4"c?8]ruߊe8 ܒr\UY"G|Yrk`}__,V?nbtY*xݫ@IV`a&_~Q0En#;W^̙h@!dn]aTV7X_!&Wu8x6o݅2~zoW-Zg{t?K- Sn `CW= exA_}P4j|W46 _-7t}?LӂPAfÝ pO H(%yme\3@9leWB[lMwcSsnv9FlQ9hxQɧw"@5N4[y["W6ĢRKI_e@簭njR 0 X&5 n4K:vTFJY;}_G.׿cWIzF fPRW5s7@x#$i)xLX_k+z׽7})gE4u>SԷ«Œ'g3,XKYG ʺEV]2U/E> |HL/o1Dy={\~+xyc^Ίq;oR^i$|# H!SC:·7Zc3&.EeN-"CݚffuqZlՉaxV=6Ͱ\8bqљ@szMGjh]Xfiiu>M&1ش V!@jZbY$X2G.__xxl42qYza.1cEc=OyGX%'k. L٥~YG>?7qJ#7U*$-BoK~vaʺຮK rMVles}ӳ7Ვ~Ʌ:,F[ gM?` !^wZiu6 ĊfpL䐰DŽ7P>w^8wevĒi^2D7:rZbH;Q㏉{4 #n˟kXn'~,*eMs]@[IK Gm rD6"Jo>Fry1TD}>褼NS).b~vu[ so+CfBA7ѵ+մ 3| Kޢ9cpO/@`En bNAE'+o:+m77&5 c='o7?f'é4m8\b)h!K7Z/QC9QrnZMGDJؑ1tq7.QvcA.!Cs{3!z=rV[X& f `01e5K| ̚lXѹXtQ0-䘒9,+̨\_tN䏺m+)bJ'ԈޱEuvVEq];~ܲCO޾R鵶 Hȹ1v F 9/-cpoyl髥k9;t(>ԬW⒲myx<>`D<ʅ.UT|t=.FMЖq6Gk)V W`[2fҬ=vch\b >4+@ rAAma}Av+ _Xz|J"PGWPp 4U\_./up;Ox/cq:c蒃^*[}`gbfELy/êLV h1 6lXR߇Rua$<'v-`"T lgK h3d 5/`rQQtB8! ׌Lr4bAUxؤXa! Fiv 5^vvwݘcm 53eV,eyc:Up+P{: Kd̬\;Xf.\ʘݍ!UgYmbV4rA\L!VhoQ+n/3xREUfKI]媡Bd&`Ź`R L c?9 DK+ -//>%$ep:/. f܎G ܀.WY  S@H2I{{r{ǯxxmMQŴKC\X< ڏX)#_Θ 4pa.!.1R8͇f>=C#7;04 h: ^sSLo(}pny߯;K<6Gl(brQwaWm*UE!l'ʟ߇y5v a.f!ւ7u%:6j`X`nE0ޝ䦀:74_Ej!_@a1'\G[j5}8&:R9(^,pn^ ˯o݅ .؛II3I򬢿&u&F(ܴ>>Cu޻LGelЛ5_۞G*0xFı㙨֮`ƒ&`p](k.\9͸f(# s:QZ5hKxK&5.뛗sWxDe""kf~W ƭ@l[kcqmn?佇n jo! =@RnF< gd*lr**w)w]I&\N/TAu*؇󋡪=^m7^)mmiy-Iy{L 7k $d XRO]qXY-AIк9!wv&J2໇167eIH؈U$#F_-LljZZ;x*pٽE&|W%~<Zjĝ\%+dI,~PDYYՁQ$|a=B[BmŖK<`23+19'>.݋4dN),fNu܍i=j,SNro03n~"I?Zxx@chG .biQtAL]٠ ;nlζ1^ZK=ۿ(J`uj}Q ^ob8i@0Mr>塸[^pTC,&Eg X* Sc0S@%9H_R  nX]s@ 6Q0xP'KplBOp qYheSvW;+ʢ͖~kz\l?܉,!tH)HKHL( 3zotV?⫇(+sAC*1!G!n$+ J)̿LmKx<7K/ \Y@D@wg!lF5,* Żh,i4&&jъ`,; AF|,w]ZjAac+D T6q 2Hv\ @KYƤVJ0p[=޾UdP p3HHk@x[\]oi83ڂLK 傥GnWrhL%Vm;e~t5_ |b7]Q:"߰m+^\D "5@Ʉ5vp5@O3mQI#{?R 'kzHFKO_}fUs$O<X TXnRJ!.q0wlno`L+ſ#bn jO޾UXZ,%$)pMj SyJ2d*PЅI#mӺ*9'kFšROS>܃آ-8q^BV|Xۯv؜ M x["\O)i\Z׳ wJG g 8$q$ M:;XrEtk,'!;+(LdBCЭ bjBt]).z.$3 WC/_cn']5P0c*,ރ#7OlIdg9~$ ]6X}kF߾!W>H\h3*5UI՜Cܤ}VjɄ;,ʭĨj a"q p:1$ Iz߮žcb7M# b#= =b' jOnѦڷ+_S N J\Q)% z>YQrj7Kt {,օY>(QǙ\ fwhm}QuP>GGZzb >[ :L3+u(jG̠8l"hZUm@=.Wn|.ì9ۑ ˡ&G$\۷v#Ԝڱɤ^)!`EnHū%GLW|{[C-I4)&ΣF( MLaVeaYoG[V\.T0><_*wsmf7ڑa#n gDf'b4<n `~bO %M2CNh{콸yhU lxz5ɉq"j95Saw7*oY3+L}Fp dՑF  )Tv$2!}0# V6ʔA6w'88.:e\ v޾v=5 8X{|F$># Ƕ*mtB_RÝ8oڙ5ښy+60oRH!ƨw&E-ZU&uRs5_Lх^WZn\L 59Xa*G_`Kwvdu( W$2L%@Y8sILȵ-![ ]-CBŚ4'?u8 nۓ?~AfM6OגJ-(E2ng;#TP܏yȶ89m9Sg<}gC3e(z} vXx kjH]U/-u^9ģAhn@xvL)@:G~a9n 2$A?d@2*6+ $ ,YG''c  :rM5ma--\zPuT!߇O 1G!}W.o/6W޼vS9DΞ"OF%UBRsҴPdܤn ʂ:)R:Y]Ypf='4:wNl- 6+F]H^Låy+0kMK-ZEk)翶xonu2FEZ&̄{͔^ ߋO&$Yۗ#)PȚ} %, t0X#7cN# F.;nŏ~kٷWt*ٺnj7 =bcRU̗ͥa[JY9vy뺂QsmGژ*}>XumXreQ\'-ȇ nJg9{E1Q;FepIBl!̹hLT[&.vĮ Bhod; dfK[)RhAcdK5J#Yx8ɂZZw-)L[ҡLCNYc+ZI§2^=-o5vuJ*OڢyoаI[",Ieo۩TD;[c*uj['6z5k]imx`A3$֠8,4 U} ,6HEh)++4hNMtH[k%, (GZB>q Ie!|0ƭA:~yq,Uu1X3`uG@,*uB.u͡ɾ_րW~8A U(.F(.{vڰ̒Yt)Sd@cxu3͜[/QX_] uoԷFޛR<4;ϡ[qa@AF5y=#lY 7u‰؎(|bX .XBU+-3/@bόn^3_jV{!RO`Քu}nkA}MY>|4|oΎ/3.NI nq>ݯW,^u?TUp(0N,mv72cyfX`NA K\w^wqeG V4x?C}ijOF+-ձ2?2rzHa‡v`A ȹ̢kb13*>c+ O->ڄD[߀#1B.Wj '} *y1κYJ\g8,MIԛԢf:\~hnW4RHp@hRby[C`fo*%RWp|Vj&Kj[xk7GLPO~؟#ڨ;-/3)L=s%M ~cv)B&ey " L&*1-or{=_=?8zGDC!U_VAbjJ$'(ZlZ\R<5y;[ ;`ހZBYZ$I*ڛ'1CD ЉrC RH[-5` bl軸@j!Ix¤U.kPxzG&}G8/2_YH N+C (c  "$ :(I?_Z\^~(0O@3dWG"bx`]J \idKjS^ Pld[ ^_ʌr oK@Y1s){krmO ;fR,7J2EvzT.Ȣўל NI6q`Y֠=)y n^ Ik W]/+.' *h:iv'=v6.QV W?AeN.T] x-CzϘ5n/ ]H3w=m̅+µ_+lwL~^.?~ԞN0~CzAcu8 V9L=Jya>佩WSRM40%mG":*էZ,# \UfҋDa02P71e>IeR {E4#ec&TדI/bS[+^* e&چ]p\&4f ZI#L V6BX7d,dWIB&crb!)ѤێpeR!VFΐ z&>xÞS>Ͽvs%UVfnQc6GLj*ECS?Kr[yMF(,$֙FRm.E)CqEqΔ[NrH$FH㱰\clRn!(|65_ɮ}L|6å.Gv 6*ە.ؐVNGI;騩ۗVs,hxi 7imuʨLnբN(LVPPk:Vc_2OYQV&xG"`bu_ Wk7ᡱ60ClU_Khr HYka U^wsJ"c+Lcݥ)6ZzZ^-nCq& ">-2nvu;lvޮ\[% V 1!cxܨg0E/Ub/?vZG*5ElQƤqH% Ԫyfk{AES@nl_7L#Nw4vGYim۠C !V`LZ x" q z3'aٙF~F 1`)rD՚80e}w4_,dQH \T@czĥ5{Zl/(g,T5:ԝ\J/z~˥&)!_,T7.dˁǁvq=ɐc. 7Ţ#4n< rd&RЭM_{.;{{1ijO>ӱ(Q6E;-!IϔԉPh8m .~O7lWzcj9:{؜KRdd_Cy(H\ 4_+> ,o^QX.ufGe-G CsBVF=rK<|4/aalka&&6y\3McNQ7ĢMe^ҍZ5I=,m/{{8yv, |8=2e d;8J Ʃт쬬*4ܬ.(Ȥ!jK0kU @hz$ UYQ,c d:ZHz.mPbUhXY 4>e-In=J+Gr:HXz1 nk{SaE)30Qe[B`; RTMm+ }%9(g @b@-dFNΔ#ݤ/9Ƴوw( Jl?Y(Tq@t2=l:)wXINe(6$:<=rcO5})'*h:Q sBpbXCBh})ݭMMש+] Z+ʍXȡּ]"[cvK==ch7W޺P>8Cy}5޻& |5Wt-1+]V2 QC @ *hg4[<A*8# WxWk+AP./_$! &P`idi0Z`3 *],@N@/{j1j'6Bgy#%r`#!\}ܬ0d0 Q0]vc1E;35\v ݫEv,:A\PvWZrGZh%zIHZt`[| 8MzRpmAAڠSӨ$ZڮHImk9rO3S]LbQ1ˊWg.KAЦ!wʽwX$DU|pR[Ja{$JSڸs?'AVG1ay]`hq"R$jN{mŸ53-X )A"o+Mmj5rvM@neR.h΅!GZ4VZ{V h=:{ϐDC5E9 _[='6U%gk~HDq1=Ԭ::1llmq:  >"ʿW]@y1M5]>QUbyor䖤b0v@3TCP†"Ma~kX߃=5;H" Jw,(b5T1Ƣ%Q"5>n"qi*u#͆,af7a~?+3 xZiQ6ⰾy#Ҵt|Oko#e$YE3JŴ f [MO[J3+vΤV9)-b*NZƬGGL&>-T n~c7\9Φ 4*&_UܝGޭAw&87!+ӧ%`)נA=V(׶R'VsJh) Cމ 5 Q װ#XkEj8('v49dM&3_N$(2Z%rC_>#?v˘SJi@F3<#a)1y}Ɏn~̛{[g&qz"E%RM[L &S` +D:LMak"P-\btMӦ7413)5I5>~!MPJ Vˎ|Қ'>5:9sυ7x0eodn,=<ud@ *\-MW +FtLH{[,+\مd$X}x^g]&@#٭^"HcnMz.+t_YiSKLv* QȰdI|-NW4P,%lNl&?N&fhxK8^h%}ߛm-T`$aʈ2S;_ vߏL8c5̴OLMVsQUU Ա[(d9=yMxi  UkkyyMfNBk:l}lhcۅ`2.89}r{%GĨ1v`)R c3iz >a;FF%wIHj(P*53@L#m&'J 4- ZR0y 2PsgK+OH[Vyӿk .9/]/i¦{-u:5nhhw6(øO->M19{uJZU-JA)uL>+!TUb#͹@ܧ>V^Ghs?g>;sT@7YxPcmM?[A=q7y DZVNH vƹ0{򷲴̬s\Xa-8b4QJ<]"*̇ %nusZWFڄs@YgVіt!*z *`0iC^ }h]B-KL;bm }@5{zEv'QLˏ9FK 4,SZpF*0ІyYSgtMRIo\so VVd%^C0;&),7!qih1gkB7(*ؐdIRyC0ڞw D; $A9 ,T2և#MAY8ut303Xm ' G*v,}aV,%斎j"J8LY){4֝ M6bdNyX?8;_m£<TO%%?5[Ι-umH(,=u:I_M^8)ZR y K`K3uፊYqY1I@*b`15PҝirPQ?p C Ɓ8bx>|Ω׽@*X0zChxpҥJf~0ci݉; Pco8\7ޜ*3C͕>&f^&\ m^ iL]-QV&*7°&Rٷ:1EØ/+UuY~vDZ~\yJG-1gC[qEb=I JzNꮡ(b]ʖ [Yʌ^7C)xG':}_*2ԯ7V JڄtZ>W Ra hRsWpzV w"|E7p 4DקEGF-y+Y cfCl 9dԈ-tbh93E._d `]Ƒ y_.V33hܭ^1sԨ%!nvM &׈`izj8\gCCmɞG%ge}b 31UIS?>2[zo-=zS \p5Jfr[޵% ‹reY09bYQ*#cB!Lj ] ٺq^^OFMD?[jyMY q(2824:MP|Ыc$Jc l ԴZbFtj4XVk 7Zk߰8]-2m'rH5cN5p[s) DxYn]~MÎE#lvJlVT\VdHMHc2֚`(kwL\gʖ玄Zr0KcG.=w.˕1͍vR*`VXa& $w4x(+> +(ݴ6-],:܊)fBM,o}IpESfq7<WgJZ5*X }rE@]5t0o{i]_7`Slkݪd{q7%Zy"@U$Ha+9#c|>scR(pL;eStCtOk'q7.حunة[blvHU"Ԣ'$VqksʒӮ Bl(('{~, PWw78|;$6D Ԯ׫$Gx⑔aF7krڭc%`dt@~mRkV7F&;Op+bxk %jkRƙʷN`NayV%9g.b;,o3Ң2Xsh҅(XhEr-DqLYN"a~yG ̑soj+IC!)SsO.N9F Y<}%EGC#N;EhD뛲 ئj`p F]!TZ /6 -aTeQb,P] U9c&1y aH@x.K% ns[ x2ܕp. 9-7[jأSz= Ae(N(Hh7})JT? 6QQVT4jܸZ-4h zV{p[XdM]ZXm\㧍%^/XeXf$Nj\QAS21s'bks+;Q؃۝BP"wC3R1[iw>5~ f57EϴY7hr"By}R +c^dEa!A62>7Atv>(3pfL=:̶ p w/D +L ;9,g˽ʁݮ'hJd5+uv9tL \v2!?7R|qg(fFRƉ (y }e |UP1;eEPjI,iU-7: &zjrc}d:W`pm,|78Ba{%%.?{"X~D {^dabXkbi$Vsw; ?r+ L1+r[o d[9.$tH ͽ-z~8rIejp@q2bd9 (Esۘ(-WWrb=`mq:ZR$Q؂9X7#н*L} @;9^6g5#޷eS\f Z|\~n[&ŏ>tU pk}#A͗pQYT%ez eZ;Cک6Ѓ3CahL%W·JvhoևYTcIH .()Pε20nwK޼Pt 2m+: \̴{W'E}*S0x]2/"mf;S8ᒅ{"QȸSӋ k< X4Z\O7B_|$1gYqq`)6KK{珲\ۗH͚}fV~ PTnwqk;N0ˣnwN>+ԙ@iJEϩɜX9/B.%\/.cP(]EÎV83bX3fF* 2*rp0)K{nG}>^lpӒ­Q(MmB*ڃqC̊ +B$LylqE1+$o̡~u4L206h εqُ 4oi^(>h,o6U gMwgvm3VǺ neɿcq1ҥN*UE%#LBD!bV7Bχ!"@GW0QboZn L\Mݩ3b(J[cp7^Iݔ!.= ua2>2Ʉ#r}f-,"2LoyX#e4RϬ% m4~Ne\ċuPUW0{+ $ SF7kU.0Igy cl*",b ̒FB0hxfZ5 TP}?'8(5j=i lYU rN.^`}/you{%+XCJR0z`&3 HxC͘#^a;7J{R^>}B-L1^ePY^w^jr:BFH `}+ι%s^h s5"TP9"f@pˣ(My/QeLd f>E*ހ%v҄pi!mY;¶ d`Z\23zwPw;T~9 : y71:1&|7 CB_!x4 vftZqcǑ6nia^|]R M~Ku,V[Zn'DĚrQW͋'qJ@0; \y1J0`n^F#H@,VnphpZ@pKɇ['JwŴ{il1[&.s &Ca\Hզ.8i5YcfftviqtI uAs>b!^S'܊4\kBזy!_=4K#s~ N(r[m`7u]t )l;F \ȣXm iՕy[]ʤ5L廲t&Όl\o7 YAԕ腩 h1+N;ui2܋b90R=8Hp/FK`x "C O~N ZPZF=,yC 3Z*^V-3* Q9Ns>3քGdpČ_ h~`ńc3 f>{<];hmFB޷@ "хIèO^3GJ1? p[ u, ߗ;ܹR'].77=ݍVQ+e؆f9Od&zpM5'o8&,Pr˂J泴a`5Ѕ5bTHhe>cy{~|PВn˭;*7]ff`u5d[Ԣc4/[UP*cAbjNʑ%N94 |x.2X{5W>=6!b:=irf.Wf\sP$|buZ&"#ZN0R>s ݩJ.]Gq㛂'3U?+G=9r^\0v"4,_FԊ WFrDM4:D߭SJTފI 0+5C`(/])jv7 Ѫa%-nQ[윮;{ES@Â1v#z fKuBĢm6{x5Y>hC }ղ٭^(QiXyXl?[.0BPp+yӥa왬0r 4YOs4Id#mk}Ϥ,u` m~[GKgդjYnq>bDz 39&aij۱hYOĎ:,-w?*җ,%۸kx X[hP6\aZs"GN2;&5o|I@>`)~Z!z:U }`檌C d=cR.^ZRsخEW5rN4Q@U*c_9`q!mYTv/e"'4!h*`r`H%dKhSQrhNs3 Vz}-tO}ѫk䈣&wOk>( ee͋fYTW]ҵ?8L|U;l4H4c1ejC:S_2g%iG1  7=t(ƉE>P<޽vc`"־Yν,5 <ݷgXշs"~?\?oz#T źlJ1=X&1mnx!7cicޮUr :}s硸ig}c۽X>y~7$s*5=+XY,OM:ok~K$3LHQ:raomTsSE92$6:Y8VV= 5ȭ=ލkq 2\ CSOhi@&7拓{*ь8nd|Jڸ۵g FTbe@hZ{PkM9eN ޻iI6hȌ1vf-+"l}j=`ho0&2ny8~Aa||2C9%6:b 2wJ˅/+$6Z Mf@NCNf$V^X\R`Ȭ^i2O俍1nk9z]Y-+6@jXTpk$P,8Nryž?MM.\m,mՎqޝϦLtOp{ZnaJWlR`z߫)XXu(G` $&|4&yE[vI'݇0oZ|8;/κy''_)Fk:r< fܣC-y@}xT}Bh[쵾?o{) ݷ Udζn+J-hAG!.TYx\X Xsz/z3"fʬ dfwKPJL3s9T|5UM2uTӺ^\+N }`}ƫ3)K^G?'7sUt\`JDTXRxR 7'DύOA GT\|ǽ Xh<L߭'m7֖ݎM~r/^-wX[gޯboT,)f_*}}&&@]sVcP,G>k a 6Df_qv<*,3vnƱE=0om 0yOs$l[;I5gvC4-vDeH]?<ǵt cbAoY]y1Q)ݲ D$@~>- tw-ϨxsF7ߺܰ-za][#ǝ/b!K+J|Ynѿ{yfd+164>݇NJY,(j / Le-uIWcmlZFbHb:x>z՟aJǰؓ3F[I8TOH)!fHynSOniʚ͆X\sA7rs[nYf'5*uڟب L j5k[0h+(kUКԿ޷L_ / nzo`?w~Kv,yTo_z7F>: t\:ՑrFBa۝סi*$՛'"*k6+b6~W@C ̀ѩ.h?=/ r0Xࡀ<HHPDo-%V1ޔcrlH] H1uai}- nAq}@drzi3=`muWcnn21q7M{Kz%CRZ9/.' nxPC*A2P{^߆#x$92:I^,r_o.4Q6Giu'`F uL;#?7+zЕYJ"Dg"]Aa,Wo&%tcهe[^`e>DЖFk8r'M<#ӚB0*1DTQNp3NmoZAxNlqb+'1u6s)G``'t"B2-'o6ꏸ!,w wKZ |LYo,ێٗ<ús}ʾ"xVQѓo瞅ʵV.!RlY-9B1%~%Ý`.5f΃;a9P}-Z E ueL yN`κOm^3J[Ȓf>X@TZgm|#|+[e3|,!Ռ-x$.=罱?L;A`g>`!cF7ES<|ƝCYa׏v}RyNVBG dFஞXC5z\n,othƻXzKe&Yy^MPMEQ]xQ`& e4ZDҺghи^N ^-#Яkp;džT 4U $ndSD+kMI3SGJrWΏVmm`xA bo[l|wK0,߀?g]?>Wno{gh-!@J)cn_~ somY~چpRìPw;;ʲb]‘1Z$^hEh%!qAhk׆W$49pFj1i!t1C$" ?؄Vxk&QA!6mXFqxj?C,C]=W O~˿^n)3*m.pV_'];>ynjR")\$ T%"X&-ArC\L3<7SEMW55$̬:i66s"v ,Ӳ2 =JN>lhgoٸV*{vdE}Aq0gq#r7wJwT/>0O+o]+3U,cJhn(~ηOI;;RQ̈ s{.` FwӶ+'nYL!Fu{e6pڟ_>RfHtXq_Ҍ v'{ aca~kzpdK^p:S"E$"@6[\ S)U;e6nɊJZG 61-)Vc&4$8ؘ`RP5g‚ĹM>h?ržFW6F,|vaLhw~wQT٪um1 hAd:-2]?!lZnNFbA] U5e=?fF@:@`ՌŽ5uߵo r o=oce^S^ރLW-jiHnKpS΁0*JZz%Kco^xP6hƒIt› ^4bŠ܇E,'ZJj5Ž*?Dʂ!os<~vuKhƢ(X0Ѷ{ 2&MK̆ 6[ N wN`kdٝPnjKAF_+@s.Cg nkO˟훳Ԟ>ȅ,f.[Q/h; 6mpECYc XS>x=W6(k-Ynj=9-}Wd\ٙ8Fg |! G̓P7azbWDa Sَ>l^m QO.C}lYnC{3c_bj5t)\orLۣv@tj@9۳' Ǩm{`xM/ ZxfIEܾx8ۮdbok(cjOm}+&=RVv&rHMEP3K4 n$碐7]h+sr+3eO>lEW\YQx`g(”hHfl+xb$piĚ!H=cSu._f!?Xɘc@ fE].r KDD9AI=hefcXwwZ sqV޺F]A"CL 'Ds(Fk'jdC<8ɳ醶 j*X!^aHO`YӠIe8NmM&`:^W!mwجk?ab+m;k{f[iOW/z&n> d}H4MJcDJ:*Ne(&YfCAk(fMf}{aIVϷ0[!:X:'9Dq55t酃f͹iuݐ h61Íuqw)H(P?XwZ}΢{<\ Bu -bmSu; ڎݨ9NɦY QfU vwOZ8 wVܧ=~*5OQ,NM)osࡅ>=x },Wbd-v]K#$Ա;_Eab} mZ!*+P5LVz82 {|V~82T sҡ/]ߴ#]z- "aS@' "%x6\XGםdkf;x;(Oufy$ MTv[S7- %1%faf jo)n]wJNkrm5IEמ5s\V_# j_ (11*V-q#ȳn+(2ukZ׬Ɲ6q 9cT!ul9Zۙ`'P/"+w} "f{3c4WָJ@GVY:z(|j˿’cLuX=PdrŭņF",>cmk$$ ~ǥ:?\2hȌ j_)7Nw Ȯfb -aR>>w~_yj2~ͺ 5&1O)V]:7|Y |ff o_<=_&4hys|MV.*%\f XA{]QLƏvrmROtsHHP^u`MV[o4-bix^Gs%PcOc2yK$!2ad2K5Yͻn1:25->_˵= nS03c7]ĊsiIJEYoW@D1b{Eo˩7`HJp7;-'~^oaY۹+pP{x>1;"[۲^픕!}3l]T%!d+DxqĬQ-7Ӣw-l# ;_C/1f ߪc ^/Ei5k.?Fw -.xr\]Oޔ?[~+qZ>]^> appbm{Gq 듬ͺ pvcmi㚽0rEڵH$ka/t%;}6Y/AAWq;L-X(Xά$YJ4wA;AxR*U)r/88ɷko;L\>[%Ug=&`^_xƐ'/lK4 cS;o^9:I!y{>>c *CFn:导yY&YOpGk1 g~иMk*lgŖc { (mGsmO@龃_@[Cܻ.ך"7U+2 :\Wדl⦿ \q31By!'{ Jlc 5j{Ekԫ9z'ꌉZ ؄9/>\ÆLUh֌@ Υ)1EgwS VP^3lv=-h'𤋮SR7.xŜs VHؐfZE6l;y6+M` S?0@*p+&1)` 2Z&2&fI0Eź'fXX4Jz˓%UӮ}42b˽UQ&!ͻh7!,  sMvH}-ȇ~|xXvZi@Va%Ǿiɺt~g'V߬jaL!QQ%6?lFaHvW\rҼ7NJB;EV@sT=O h5nwZD鎮y8jJ>zc푁XϘUwW𭍐ˁ- ؀آ#d,-lBg-H[XUQڢFHNɌJpp^0zJW0qHfb+ɃD +>ϞѴ";citEmp#rKI{  d6f,oYto)+ݣ1 biw0Ҵkw |JOOɧS^t?Zn=ązaJ9HpaÕqOx{3h(Degsi8f|Lh+ˍ@ۊ9۹lC]B(Qo\)KXc}XǧAqKC`S'I*bA|'Y!xY lAtՎg#??FX kz^3UШ&LG\bLP0HQMھW%޾~K.6OP{rtI/ :6rwzn-J4+7pژtWswJY#m[cHHu\k3Zc 3r x+CO3C 'ye}%:Jnz1@Yv'W hiDEmVC%ssy;Z3WdHNP0F:G1C={cb汱0>x~5^P9A}̫Wh -zW];׳]?grtj-ZvzC d)lnȦv#">@k;/\: c@c|6KNІUf{h7v&ަ LJnG i»>Tcbpt]3ʿ$ =jO4 ŵp۪5?鸖 2+4lB-(B%e/!G؄W#pcH7T~ j'o_~`sA%]D"R`ZvyR nPpf:EmB'Lq@0s'V(,,Li"®; n*?k7VI`] nO߼ݾPϵUj'dv5k7@yK5cݦSF+A@<Y ,t*NV~qR8&NJq3d yhҶ6Ek/\v޾gBR+]1O0%\mU龞KAr͖sQ7֔ZKmLhT&sCPn{Y^Z^b, :s 4H N@ֳTO$%6ڪ+~|_JGxg0& HVW mC |i7\ Ctm;g袢,rGVte5v-sj'N H`1îAˈ޾}MDhL .7K>jVbsyԮ1s5=A,2ޱ½\r?b?6D{>6FænK9 7 4h rl[|Gp#HM6gak `5/λߝU`Ń;Z_?jO/?[nn=M̤&DdT:: st? ~s$CYo P;>-kf7w:Xo.cnuGgU,-\ɠYy@gW%h-ms鶤G6Bdxb0M j<.0xɗIWVܚ֬Xx-zcFVs4K\wL$;^)Hė~A3RgٜQ֫!yQTtdvr15fut8wI}3zɤ+k5[=]џ+?VN[Anψ?]j0=b.e]$zZv{_rAWpB_a;5P^ H<*2AQ]n&n\x/Zҵ~ -q`-+zDTy^~M.YcIrPe$xӡBۀ*m.VR\wr$jHugs(c8 F\|PV/l CiW\V#>ciLK " b QB3dGvi6_}ӎS9,_ Ĭ 3K~O[@{_7qM-+qQHi`W hUq*:o!/gc(j7tqǥ*3]vtA1T^ltZD[y@z8 40**yqaTMpw+>h*+z(ʘՑAּDJYLԐ '9ښIW2كr)܉;A=bWNP[f$D߰13)M-e\K0P1]r?,$;`5ځS(cOM;[{fRbolb‰I\bD!(nSd!g]a^}Eȿy `;7 ͧ ;T@sECvuC Bs"Ƶozwłn3.V\f3F2/m% {fKw_vI1K>Diѧ,DJv9QBM 9N>aZ?uOXȠcfbWYo[G==MDO,fyLf3ω!eCڴF1LPfϮ;s\ .-&,37(WYCiJc^}4g"!rWf=#.s3Ku*+bϾ^Asno1X7i٤}W*W&iwv WPquNy>q 0ϭk^UY6< s1 ͛vB蠇|?|#8dH_6/0:cK.f7g)}? |k`* ]̐?+VfV=PO?'k`8&gclENBHgzѨk,ȶã1}h/_|-@5TX<ۿO_ 2GHC=@̌ X[ㇻ[:2lKV]Jh[|6Mp>Z22:ںmIpSKפ#n뷸-}^/ڦMm:xJ*dI/7M4ϩrG&b! EnYiy_ɿ4]俓+Sq Q Ex W%@s)0am6pYZ_xn 5by_ T! HrE'd%efh4xZ` nlFMHSQ1BA:.7P)ZZP/ 1t?3SgSVLG1V(|)cn2IҌ<1@Y7Ffsu >~|h;~6PLUח`ݭ\m)gykYe`ti yi 97)SqNp7i9DgcvYؼB3Fj̜(#YRU.-ZU+oj#!9ڌhht:Qėq-PjHY&\Ki'XV Aj9ZCEb 3hկnG32ֲ.kW.㤜d$$Kۊ#K~ץmŦx^ Tsxw~40K w] Ž>:$]AW?PT>Y\nA(Avh43;؛zmcZ *_hG{ث&7]A&>"otl SB7݆)s''dWԶ6NF#$~V*U k7a˫/ >V$h||?WqVQS4vVuEfUgQJ#pc;EqO kM* !Ri}zates+dg%pĜ|!G4Ə^s \v6  ;ۭ; np=2$m~ U zߥ\xK>6 XKzMfjUp~]#bYp#w:^ZzoGeQav;d5͆/ H;#ѠϷ !Rh2p@A tۺжxӫ ō̯m}F0AiEP;m/76ߤLqZ*[-8J9*eFdx#?ڦfpj.+!h_ec R5`\5՛0 *xHyeNڋH؂9N}"tG/O==?: "wM\<@&,L>x_M Wam^^I#iqb eI꛺][~ha405qh?$ۼ?,1c><NXL5U%dm .ibߴy1w d{ۮL.p&$˖%tرAz0_ydd3A  G$y^R&ɐY` pFb*y_0hH/>{W}_}ιR["/9gz1tk nr$+_ 毋vR80EdFu"c AP}nntqAzs6d vid-a}Yr\#2+Wٗ얛#")_H(}[S ϕIHCEou M,/3İ΍Mq.k}|`ÉqhhbL(w|񑨆UWTȦFumD?8)=էm^ =mupEata]lae+ @} Qy#PDhAEcP`1 dCmٱ uP#ҽې0p 1U S=PKtJ 64޻ E,rXj1kZr>ffBǬm["LFDwof*j$õ,7(oUCX _^}ޮU9 Ҍ4J9Ke$W!<ykM[:;TcʿI>IA&) i'<Lᛐ iuϝM3"2=rWbk48bPVKKc A~g0,Z-NF\M]C!-M]JmDVX1hwvSA-q9&>n6߰+K.?c$``ǺUYWىOu>`votz@$bFX,e; dc1djB |LnH߅)rTd+%{zŦRI`WG`9j5پA&G[-nLC" ޠRB`[Z3 *90TnܓF}01q!Ep_+v,EO5pާRx#Wy%b_ ?ni[ a V{b}*&$ɗ17*?mwy.4ff۸TRĪnS:tsWrKh2+>uWz<1Dp.a8+I ȧsCV! փ5(z2syL-T}k'IvjԄ(6XZR mXI\hC}i 9xxZћ,P@5`=]Q@*,^%\DVb9( hmxEGK_d烓 jm 2NJ9/cn oF֔.iZ}QMSn;Ɛ48-~`XkN8ֻ%V3yn-I\]w)drS^&N媧q bIr7G-Jx\O&w#\Sw8ji`A)<ĠcSaam;qŠ`Sc y weeogsC/nuxhPNeD ;s%a~]KrOL+x3WD2Xlϧ ?A2̋t1K5թbLFrt9hpQ14B5G6녛R$ RKF4 ,$,Nc8 I-nML [vʥͣz/q4OrY& DP 3fP4 ΃M:F?*E(\\#/ +sML>d,`l^6oz%I@qOʕزK%Edc绷FF*&Jϻ{`,'a70Pά C-_AkQjqfV X9=X҈+ܯ4g58*X`НBx[AB/q/='N>kpUJ~Lt̶r&C\PS: .E@8xRvEƱvau/ 67崢5쓢q|Pi(Ȩ4".j;!uҢ̳j$N~#cl*Dٻz0Z.vU@fo=nk㨪J1G 򏋽J[WPKjpu*kSmSɰkJ1?5-(*2$„'N|ɐ0WkT׫\肵acxyw}tt V٪^Npk>g3Cܦqt _֬;b AvE[}Wߥ/&24аJ33X0ֶRFEd K*$:;V1~9&ote {G@|%T]h; Vl={5vZ9匯lzuqt5OcqJײreo<'glMY,Ӹ'n!V0+S!&B8턷UM{ ֣- |5tC3fb b೻qP6wcꝌ`CVt{_S{.^9'̾ҁjFh")BSz|ےki/i'֑l8iw}rcgdoXq!s%j3ZgAW6 kg [.)h`po4wHMa}H,$;yVoO=Fh #'ڣ 8λ眜l4%wΖ c`˼QVZckzUx8ނn_UR TjG߄%u8cR t_.%t 2snpPfen6E.}9]H\?ltugoiXآ(ݧ~Ugi:@a6qÇq =U~ψNGIR>YOQ/!ӘZ'9D眗8§'2uR+ z=h,vft5HL] jݥ{G"}g n&*`bpauoٳ5P1hWD@w]шDzha-DW9ǰZ~[^w vhH<*wr+諺レې3q6Jie\QP5yEl.37`tu*r%u@&үVps Ԅ_VaQeuW|Y -. |3bC/ ]Р&X*Ǫ /@jɇ+߷˸\&I*h+sNOت#%t'?Ӆr]o~'!+EaAX'N8V Yލ <9(Ekcfj@V4Ƨ|g#;ͯ{1Uѧ\QesF:"}%-t.b|'ETXNр1 g0XKU$ZbTzgK |.6VN, E>9be{jӤ0\yW˭J,a;֚FdK !#u9sjT8P>-yw&f88p üzr}$C;+@,q67zMȚ`Z_mlBy*T/f@ANä>t'ыRkhvbň`9콑4{iuIOMKn8/9Tx%&e &g ~&Xa7ki2 |Ysz)Dcn2NeJN4FFYAL:Rk;-O5iW+So ps? =>ŰVDb1v`.;)zW-oO^3=#pS!hF3$1' ᜁ>n`zByvc|_zŸb-^̈́.ZFp'Ax@|\ö2nR{YfHNf~ͼ3=p8]}Nݐ)M >_sW঻PSz Kp;g0J+&R$!;*5.pn pw6!(&}P2@A_*LBeQchQC`b1FYbl'Tuz1)*T 6S?+A߳Kpco~4.Si4 Oddxi'Z~\-6Ja -㤆 @K%',\&\zBqD(˷vwW~?II6% 4.6DMF3=}ZVN`qz^9%Q!  *& Wd .sԠ>3r ;3TbnS 6 t"_'$7aea;}ϡQW'$=[-<7PI LQZ8s%Jkp6 D4HUuMDI2XbG[ѫA d[ Ԏ>t?1QOjq-D 5+18R&\Nx!v)S{yOtXp.٪ۯB >-T>Q\PZil %7j+i1!~еD4--hCku#l G(m Z\ ,ۿm^$ɎOxN &Yqu/T4!&u 8Һ=L#$[#;=k.ڎv#@02r-A.BRDs،P ג9;GANRGɹլQ sCg23vgpJ;v xqYca nS'|Zk\{^$5"0)o;tG䣰N~t.U50`dxѝFE .<*uZ{_L !ͩ(>6s;Q.s6XQFk%,S1¢UYfHr6\_I4<^v_y #&µS>9#սpI8d W'Xlv v1"mc v9ݰ6s棦5w2|& 3hˢ ב)uSvuhfkf{H媲 4;LO} G22FO9vO0FOcƣDv>24}HHxvdtl6l>п0&.GR\ҕu ;>Їaۜ-8(&ڂj@+jXت؇ 惲 Н4&F^j!3nߓ.,ZI+VYxPZf֮ϓSXŪ^0 L$!CP{`AW%4s,MK (vpP@ %ngTlZH5L1\v$43%v̮!s2_rh)i;a$Dw{'׻ !mC5`9LB Z kp N-܏D_ )ϝ˿_~Oz }X0tp+ Aq 5,%BM(j-8&Gt b|Ҝ;z@)|X#xy[c+IezDĴ1^  s>H;&{Z +TQJe(; 4!8FE+nl">8eM,@5Eqy!Eyj(~DRK\u\[!F)6iAWj_QIyPK&VsSh6TR׻}]fL,)19@5 ̈́h{av!묻\Lƫ%^-q2cl "`dC'ޕwFpZO=yD'} @w܁Id wcZ_i}šOlf6D2)ma.WcKg%݊=6A.ޫpdw߽Pvp;L(`ɇaLW .p{%]X3sIA kJreMU"mީx|m^l1,o%O"l1䬜gg)!j #Iۤ-FN-?lqE}h  W[7)Q {WD̄YhQWU/Mat6 t[y\FE{ļ2b y.pJ|" 5?o?wyw{_' -ngz0k TBatHx>6z| m)a]:0Fn+/Uˇ wSa"LV\¬0K'ScJSkӅ7h[IIkJ8ssKXR/>n8 /(WD󱵹QZQj{Ft [#Tq3թMȤZg?|a\8 \PQ,L`,iAIaFmZwKu.)*qj2NcPM؀L(Ǐw,yl^&nZԱarޑ+5ϵi040* Êm4;8,<sc#wB>x ?Gbz1m昲%eɐ.ZcLcae9ley+ k*4\T~hS!E92E.H4X[:p&DV >WƏ+PNl't[_h_>ToTN#]U^e4َ/uIhW!ŭy )I`ˍG)3m?'iEy =1*|Òr^WeR,R\!ut2S.#tŃAAb` J%&mA(XpօmlDž$p `q:&"9͕&0[gRv:ydmw7EXξC#Xp+])Cy"J'Ю1QXEѦ xCOP3.f`M.P/}o؏dPa11 `%Rz G@:=So9N/r߫)3~f5#V(@`Trd+ Jɛi`ܬ $Z Jq(*d*|\y)W'$Q`Ώ*0uK/O0֯dfmP6~:`2mH}Qm'eZvΫC+ b! YhHMLy!j0qҌD( IXl k5簛g>m ,^@ZmR@0 5*.hN RxC1,Iڤ]2Z@T,^- BJ@v{z;7[۸QeYddCUE'%`!֚B:8a&R4 m`Oy̮0|YGAOw2p u`BvO؄PľŴ|ɤK21G+Pƅ@/_p~?A\ μ^(=Z)Ɖk0@J#ԬͼqJ58XBo, F:HPJ-͖ YUJ|kRV}E{'_!@x̱i|Aкpiq/ȌCh* 15"N424Bsy(30^6lVJ* aü؃/=WoqUnAeP&L6Lڜƿ1gT$@%؛!㣟ʛ6.@(/rY$">qRo*] +ݖ\O&MsQ`*q=KE'W4N2k"lgIJ0)Bs~mK6AB]>lʇ\6#(O?#pOYW4ښ-բJX]-xم|銆Οt_ ZsLmtjBǷ!Z,bu\?W(*' LNZƒpߨwtfM-:B 0)Z19z+ bPK9Z*}6.x`k`XJ.U DP6p"ᕌ#~BR`T|ՖE nf}F^6C˕5g@L/BIB[1d(e֨&_fEHe0fȗqqF(4"Z! EO|6S7SDB~JIAH(2lb c2]PLQAB(^5I꺡h4\ G>6s,y>/ͳlքf8. P`zknxԼѕu YoQCQkaZ ]zfllO{x>7#gi? z_zx/={nZRO)!1b{c^c)U C}!nS,?*0(7Xq5ՊFD&IF?oŒ )-@t(lDSJuGϮ@ W?tÔ+zD&%3/.~Ԅ9kO&z\ȌF c+ | 9l5sH.:iƂ s񽖇TB1:}o3X-= 6ƌM@4{x c(PC j/tE~̆4 s[:g"p@nzCӪb.,:h鷖]Hԋgg :RlSLjyz.d?sA~=pKv0pf1,UK [O?&`qjYC2ʤrRNaE%v;.Lz%U{"LPE)&RzWCK[Ku5#_Vgi ,\ Y6gȠʥVE4ݭx*oc _t_. VbMpCc ` j &noG5(ϸOkM2al32J+b?:vL"6ވCmj65#\ֺQ(hm**pYdT\p^YwY3b{7~kh"#ARG;֞,I1~;6B0kLw1 6 ѹDJw-( bO7PYM,`t~m?LS;,`f^oQk=.~)# (]c`8KmZ&{+Ϫ-{l2%_ =^}LwM2/Nui\\cM:3-*K˶D=l>lxH̾չlݖdpDZLiCX,/^QbUM?w{Z OeZ|ɜPx zIM+Fhl ɝL `ff \1{rx~,cxFGFTًidx S\k|NBiYjnXrȷ/3oهv?vCK8-F̭,V`(l9 }p#nm=[Qʢں20e˲MfK.F2_|X P6ƿo(W6|>f-c{tgp6~F-Q^\]kn،RJkOÒegb$B7c5X(\-RCa6BZJd_=~ߋ+ ^}`M@[X2/xB~ܾ#@ރau*,vu_F%q=~.<ޙ_6X`.*a켈kz iYX&Â~QcS![gY0eFV V]-5m{&4]@Lo >A1$ 8{nS0> !JW 5)ަj tiΆDeGr6tg >7#PoGσw4:t(V 2.Js1oIMRfxbnt{ XY@2x3=Rsf* |.h*ZbN *{wRG|ygzJcFӞ9bG\<J~]_QKpV.6n=} j(P[Cx3jejj#pK@0A ;96TLVvEL Ƭ]ǰ0rkT/ } {5*yͩǭ =K RA'_v-EML[;iBu$\-&0R,,c*v# ={IFq&⿎n%X\ p|Chj&]6 {i(dݚD\hUgf3+_J?w tӁ?Zmji:'Ǜ-c&Z&-CD@^"ذ*-dusc/~;~(y #޹Ci¶O z~hiP¸mOXlɍEǮ[!Ʀ0L\ʊSXK ed@;NR8}ƥFKMQ]$yȎ+X`\:ٚÓ |#sjz ' jIKB`ɜȷԺfe{ys!Z!J&]0wOf?;/vE'ahPx .&L)=$ xU:F*1Ǣbaa|YCjM\(?0PhP| ԦdB}U]/hxM^{|(g4p)ޡtBoS0[`SW\J:M[ Ay˹wxlx<θF4ө;V%}ЮO)U<;}%n3vC˻(L Qfb!qmSN( ,"v lO_R ,fznZ}]Ho)@q5K Yc2ޥWWױt! VkcZm[1m1=ZvϝhF<\%{=Uz)cQ}bJ=Zpw_y֎ Jm:9qCSגOpWaF g \/rQz &rk pWH/w8־ϥ`Xxٶ PLb\/XI T[UvUi?{3*V.,HҜkKIdʏnvMfg0iN"oTKj\76 0].r7$Fk4/<˦ vCeq"䖩rP݄5̕dzQKYn ,A͐Eg6^&>\~_ݴz \E;c\ 9bvr'4j&qz­-3ތT(hqxm3āG.? 7P[ 3n}XA !6 b[ՒLc>׈nba6skoؘZN4 5wK`;BZ+JQ|N6 K_tMy-A݈Q|<9/Jk ewxw_-ʠzj4p ./ ,K/"3>rܰ.caUE7e R . `"@Ɛjl!AԅvvLPM~޿n p0k3|J @KFH!zh2k9=u;a FK;&)h'Wr L? Ƽ3H'؃5Þuh(+*:siZ s#z~j-]d]DVmI zO„'}az˟yC}RYvp6,D[r-% B@ (˜r)Fz PC[ ,f6BTQЊb>U][qfjص;lq'YMҋu> mc{O8]0YgBB]x?t?n"ٓK 6&:OY[y{FO̶lv%%vI}u}[4Tĵ8q{j?zIpܡpCS K8 &e[ᚭDº>y(l/GA"r[iX4_2{*ubT¶LQur Bأ֍{4mBx?W\1#.FnW\=_*ߴ/9GŋbIAû^Cɜ&ǚjC.>'>8~(Pͅ=> %5֧w^y#/U3S0baӴٿ:;cfMeǏ[L`)cb}43f_@by> #O^#imIt]ԥ\y4 +M5o+iXӛ(`ӺsS3)ZGksN2KWzp"5wO++oۭJ[nK@6LVˈ}UרUejaI+hrPh Vsg`B8:uGv>=Q3\,1qSdXEXXѐ\{pXcź 凩L!>v}" ()  V3pRŭ&Pe7Wym^jFߴ1L`T鳇E_s:Bp3qK:B5S"=@cj (Pnru]4Y9udtwfJkYF+੿ڏ:7zQ$*54Ϲ-pw 1zyDIt$) DT0.23|!dO? ۿS)olTc(6 |yR/edN -3=u4~ҩ(X`X:=/}SV~E,:[X[o%% RW*n-';#I ,VXKHOY]zhdO/8g(V%8X3\r)ٱ)hOl𝈕t@AMIQB-Jjvb/W,q_H5v#lܮ@տu<18.chvb0`cuXs,Sέ4o L *Fku֬AL+!L8iYeJќAl܂KCLv/P[{\~E+-z;Zsʔ-Y pfi)z7sZVmuS iyZ{zmH$h}q Hگ+& , Ngܤ/?Nϧ%=4Z]_Ȭp. }W}9HsM3W~S߰[-EGFjpIXP[(jl!@Yj}itCTf:r,_kkbL>G8$*ur ʏty`giQeufk&c*4bvd txʋ/!pG[WHPi jc-4WCK/= |3EĔzIn0I@c_#A*]ۨ1>U+B^½ܻ;G⒍YKL¥(VbK;?;Y.-RmA##+ռ\~`(E9!MWgpoNG3[ VU獱ϧ[9&sw lٵC;wN 9z5p+$l&v_kʗxM :^{K_uAVespFL !;Cy&#k7Pp[؟w@e;<% vw/F Ҡ& q,qV/ :ZVfdndq&w fMbywyv/?2e͏idH xm†ɖ-Z#E  H W_Dnܽ6^_,>Z 2c M`uz ؾUr7;8dI7(05m҆Pwbyw~-qCǰ-,6o /~"P/b4W }{G)S+-=˨lSB_ܔ%jt> XROcl^BUgSS7+e.w &׌鞲ǩC{_>ʇŗ~3 H`XUfl]~g܊烩kRX8iwz݉6Tb%^CfMD|zJ2t ՚Tiޟ1ZlZŽѽWϽye_ku4w &\\X%i\i[Ϝ0Sc EW^W[n3ss }Dβv٦k j{=n#Q˿n uJQh@|Q11e1fǧS5V`\rkt|uJ|cGpY]z,Y?6`C9۟klOxh4c;S}*@Ҟve< TU|?C&>l,fm2kv J/ȏZE8ٴ-f$yk7c!zeFpɮFLX%%R/iutm O9AY7敔}9ΟG;.K刹 Ppk.sGg0hnŶ(nKfm5F (?+<^(`w!1`e X'3(ch-^^G)LT+wR[`ML_bϓMڃK]8cGH q$O1co?G18r Ʒ "[0!,[nb%u,OқLܨe|pLܰ,VE lfS)+S2d e_{&4ڂf8 JrZ>ߡzS:5 :n E5.UbMBAOE-3C| ^JӌF޳4 CWp-&CqXnClEoc#˿V,5j5x \JgRDhag Jȫ52^*5./?#{v,}NEqb2qj?5p5?Wߎ*_ƙPv&.AכK\q\ "̄FަySʃsY"$ֿeѲLV㲍) vp+Cp?=c(vE_` }X ֚ă֧k\(>_,b#pxYހ wVne)kB8¼bjdk# .a @t]j*ȄepЯ%Dhv7]E3CRCӵNC2-,BqS. J*D׷>4rw fxQ:Ym8^ԴRqE3O: nR 0QE(..#\Jui -cE1ɴ:ud+Zz: |syu, շn:`K^xǏ9|B&dX]Zx/-G^~~ۙjc({Bl?\fQ&0f{a6qN+eY4~3[VS3Q6k6wȞnKc8v5>㧋w'o󺪕;b7_~U[1rV pRLZdfr1ĖL"!|^L]?x鱎Z3&!P_):3ac N b&,yÔǾ޹™f $\qOI*aE o=zty+c-sV[NQ@0m/Cc=vMNXxc*Q`]>2o{l`fi׌(x)~"N˶Xq3ݎxq: Cp7rƎ@'[mXxi4 up\8u]\FZԀmصz_Q>rg)OA:Lg65ʾ8WqEA {QC[yJ7ݘ]܋Ig2,_ȁCSnL^y`!kYc(a[=ݗxF5<`']97xe'~j~|^NRx$9%I hQ,~߱$֗dusн|.wx1i`Cw/x'㺸ww'&1{lN긕/<^UC][A^X1Bû.,jOWF JɦѽjM-0쩘3sQy4q[U3e$Yj?x,j{hGlGw'P-~, pl?.S=WX Cְg7`iuEG٭9{z&˟ɤHDftwΜE~~oʳQvp;#kpL3] XmO,XUtKZ)Yu{i!LASxAZ4 +Ö̞^9_ZldMzѓs;/<[yos>67Xڠ/ NlWؙFs_v{;m#A?;<~]k\iN 1L|_~ [y?^|vp3e}̑,n%hD fu&6YZ'ڭʇ׿bگ\v|P/OyL*~z].y|.}777^x+r+r+r+r+r+r+r+r+r+r+r+r+r+?%#aIENDB`nrepl-0.6.0/logo/favicon-32.png000066400000000000000000000035071342636505500161700ustar00rootroot00000000000000PNG  IHDR szz pHYs  sRGBgAMA aIDATxWk]E?gfK6F)=-)t#!. KR._`~p)J h-Eh("pՖ&iϙ{}Nrs;3w~3S5pu]󠕣 r̴`Ds|9u<{k~qҍsFi=)FY0m?߷V޿2栛>d{Ś#E#xІg X;&&lb/d!µR-O@~BDrkHXpB%HUGKc[|xGQk(2򁁞`9/ &bgR8f-HGEr3[7j.l b56#:9R5nwrӱNPBTqp"{ 6CjAq >K@{\A*CwklmJjPS*yd{P0GD_ {JXy.AXAaASwCi,za@hP:8|E;YҲ _UFH_=sktԫw\gަJ2(;l| i}tux~6ayknlsk1UmO*\eC1GE/ υ4gkY9F<-n.&ֻڿd/FeD7'0:R1gWthwY^uzsm{-{e*O)>&IN_F${CWn>a;31GuMI\$QzobK1R bJ c3N${d b~>8ƼSOCÈCzo^ђCi!wjT#H*YIö%tH8' P8"Øk58n Zh3KT@s q1KKN}*XB IL(<3K} E[C%vEp})ߊDO&"Cp!AW˘pd(J,as]*TJosITXBz% {=9%LFE(b`H!EA Q/=?M- H*k6b{@P:%1VH4EM g_XfsX=͛~̔ j&i!*.G[GI,5ʦ Ř_tmR`>5f& /4%gb"< JJX?-A\ϲ/6* AQ@G5'ix&v5:\å 4ڙvy!Ͱv.\. o 68ĤBlZ;Sg{r}sm}{朽Z>{?NHϥSeHhz)THG~y,܄䅓ù_t|<pwk]"MR?A '(Ӟ Cˇl@Dl6#60B\ ւ\'`AOXAO/}0nEӋ׵Pߵ3@\dfa4}fg}PM=}7Fkh ĊruU_,<>= 2-aˋ;\pM:T E $pUaI,LXZ{~A/=dBRZ"._}k:?\xp6)PSh q>ߡU,ӯ9rP#AW?ewU9I!:Sq,bqPUI5JTQ7˻Kgbռ4\X{^DYNa 8#à ߬YYl}{쾜92/\[+6UuZ Ia+]]-U@"@8l5O-(L,>'/oIj((3T% \@UCI$ֲx"HM{RT8˗dʃ^iTfDbN"b|\d? ?u<(5(!Yx~l KMiQ[lC:Ojɭ7%sݎ9\)Q7RJwxAWLX.8,L:"kh_A  W9Q!>Zre957 K5^jo Bu'X%(ZjJ&ʡ'،,nbјȕ # c)+pO z< 6q1m1f)zl&lgk?9Y iT]+B94hdNr{Bc'7.u؀n %ok@7kk+# ;xD\ ^V,|֓"M&&R` YHȕ"JG1qLf0O# Ssy0),ނn, e<95xTR jU.23͒TQqH8y`&5Ol޻˰mypR0>^]g&zq=bdP-v4UŹjMBwhVܔջ7;mM^ # (i bqM_o-' ;0i#Fj a)fih 1VI>`G(T* e}2LhgUrdljV2(I YT"G)q5~ W[C2_'Yl6tdwYQ0p9eF"fT3orC;׆%+#MM:8Ձ&ӛZlA"lC-aUk!2zpAQ[J+D"?|FZ~0"nɷ4Z"òZ,b͖LG 9Aؘi 7bZܔPI`5e薡sq?u Pnf1BުRDЕzHlڂ[6*oM-DT `pWj8!vbAaQv\ĂEmXk &y.a ae870-2 I!hu&ֆ}cϷ-8^||{i+3 E QcAY_k)0e 2DTou( ͚}?ZKnChD6Q]U.]0j%Jv#-p%1sa-K-h_ w6q R7DaL@, Cg8hDCFNu.xӾK +i~Dn~+ƹs[׬;nr;v CG۶XYִ9[4|\5j5dUZ2qAR9?9TM\[xh5Dձ NMN5wb h 1!HzOGAs'Ϛ$8+m+ x3qnO5^NYɄ.4KV\U;1 xFZ+Q6dc+YrнRѧ2FׄQ:'~ YE #:SiUp$іɢD׊C2A|>ƃɮ8f5hkM54 2mciA- j+( ΂q937}{ړ3n*EZd)HYu%;u2ɵE2kԥKFi]":~>5.V!052ND/t7eAlŸ_۞D|%ikQ w#C;krՃֺGOh?\]tJE.E]>h=_4^il+~g=Cݟ1dS)Cph.XzOt(K F-PSpKA&;H/z[c{[. SKr [Ź0pfoK'[/[K%Ņ)q|rl(iwQiw1.R/_G=+ +%jԧw> PΖRV}I#]xUCo%WB!!~iLrm%eqnH䮝_>áE;ri5K'Xv`z[ysduo5<{Pl"[ބ8Y6Dt7̰._ZD/ N6_@ί~-ŒJF; 5a.D+U_qjj+vz~F3,f~ <^پSFz%;5\Cwcf8Ș>n㝗$0v:z=ptnw0ef(FiwfR! Lo(B&e!;x}[x*NGElg2_o}Ȯ[{p9^*KJ:r&o jv$`KIENDB`nrepl-0.6.0/logo/favicon-60.png000066400000000000000000000110231342636505500161610ustar00rootroot00000000000000PNG  IHDR<<:r pHYs  sRGBgAMA aIDATx[K\u^w lH3H@s$ (,@0" 3ZgalD! X"mCQ-Lӆ 29*oUТeRZfwy^{'?|G&B_ Bg]a6gWOm| ^_w_9 *!D!.0hi04N֞]]0^r‹@6N˕;}B9#f3!L)#[N5t>wy?~[<^> mNTtOgA~3w}џ%L^ V.+&wc0X9"efAF݅fOy A>Ȳю3 & [`Wo})'33miDhD6/Ui>SNm?bѨT,l@S>/ dQVg便_}A`2X9Cg2ρ' vK9\hR_6j/Ƈ.ӚiOːGޗn/!(T㩥Bw3DK=eXPB}axlm\/0Ut(PY^Oojߏ j)ŚJ' 2?<:lQ9}{gK>þ->,)G mjMqǡPM`Yу9(::6@a%% jY?Ez5yt'|sl`˹YVg䳃u_j!KJZҀ E;}1 `]^́t343ܺ~$|5j79݁}8(AN. BKMBaXA/dy ˯`eLR0jUK+hH⊪NS?S'1ӷj^Rtؽ_okTDk^w HͿQgRw+*2twPM-%0<4 ? UCa͒e@,EZQM)Ic6 _ר8"(- LFS;e]H pf7xNސ@vfnc|V,Ƙ3-kaSLŪؙ͊I8yZDL ͊{P K]-86g) Wb-*([7@%@jɑkNFRR|ԅG6`|24kݳ-}n =>zcos'l3՛FfzSh,p*ĝn˂@~& YTrxΎ:W;$ J1]XdJ0XJg{8 h!SMY hKZDd0}R豛3Cp+N&4 iΚ,qMH5ʝ,#D,P)dhGtEU]0EE8djO|kKJӗ!!ylf#+fF ,Hn͋ۙtPE)OhY[F/Iя\!]ܔT-tVJKN#9u>R?ZCU?{pR|*#@`BH7]1ǝ,)OB}8_IZ eNlmZ3KL`a-bSu,7` ]2SRnT\9oѢ#Sd$c֙0߉P1ᛁ=pLJ-G^`ڀ,FJS$̍t2GudGdY2gHf%Ϥ:8I8Jc7]@= A[E܁Sk+~aԽB`{ e,AjTORJyZr}4b-͹ӖL u~.z]\CVC .ej):׋?v, SJ0vWKVP҂uQFCClwLEh`В S-3ԑ ]ᥰ 08& ą'puЅǷw_͝աRҮٲ0W}unjQz?1>ΈZ<{ʽ)_]`Kߘq t]뺰G.jp{|g8tE҄/:SeF=~__1J6"Cy͚sdMn¯'{yg:2XPfB*nji?E0,xNOj.h'lQj} hxΠ/fdo:x-Yj- G<*1IG eWw׼2uwзnLt8@'f-=K0e{!}Fv#؞% I7€c_31)+zlhA4rjgÂY3O7GG:CIqS)u9bR5;ұ~ k{h),.<Ԡ 4J2NW]XP9*&Am;n ^LyA鯍t*݌jE"+,x, +P>O_;Mn t"8Dݠ'8$`.{ZjSK%\%П^.Š,Udsn\aboL'͹e`{rE%4t~?" tC|z uLj*}DN<5]J@imM@K!D()[F.WVA&zCTP/kH{>6~tYASj0:`Ԧ\W`ڎɥpY{Q@i0C -}$$FV0R!ҧk@mGlE^;oJsВNP#S,qF'wPT0b@anfsbQ"63߱)J@iM}d_>ZՂO4DZN>`>zqC ^'+ѽ܆.<<ҿ >r Ҩ3_1ldˆt]K=I$C)֨vVτ汷4,N qyexZ:vݏ\7oh />79r_Ls%<&2ģ?h7X(IENDB`nrepl-0.6.0/logo/favicon-64.png000066400000000000000000000115741342636505500162000ustar00rootroot00000000000000PNG  IHDR@@iq pHYs  sRGBgAMA aIDATx[ۏu_k\%Jcx`XO-OMJҧJ$RFR^OUAa,iiA][ )j3ua8|׽~kߺ /wN';2$7@|Kx_>?7~iNI$"9D"6<G~-cS}6?Ӊ??<#AdYfѹ 99 ]e@II?.ai7L˧cP290O?<`\~t$`g#aN|yVL" i@z#y} Ҁ2Oak#Գ5}Oz^@@dӺ ZJvL.\w>^0*_R%\y"#=r^fx 큈1Ak8g kH8i` VX,@O& F TYOT%2)E|QZVϱ[m (h`k -.<~EK>sZX3<:1՚\GhPfF|H5D"1 " pP$8v3 O,O>i2I*k0 )}05>o|uB+V082CtsvKz_r#wCTZ6y(oPb\Z,exzna1§gp} ޏno\Mfs "s:ޏqzI6DQš譱ix2] ԙ:!΀:`ӝ ܘN`mC)P<[*7)݅[ik4D  ^_9r24Y5 ߤx5[ L7麀[;yP찻/[yr%/-<`+":Xc 0b)o ɑMv "O( NAh܆ܫR-Sy?v5L/]GRM\ )b@M\[.临[1ZU '+|z.U-Qk2}Cx~6čaG=ph]޽>7KJFW.BbCtڔyJ9UZiTU8LV扮RRV-,&W|`[Ĝ0ٸtmʣ+1z&!j H[&}U޵/}u={=DZh4/'޲Ng}6Y[2v]ҠXbW[gIܺsXRDw3AᏙq?K͋lnw0qݝ0bP=b -1'o_[-y/КHJxL32sZa FnVW[뢎Y7Uk1ǡBjS޿/u4pbB>"pgVڗ.kh3@@lAA]OA@K|DȢ@t,x5PȄ_`mS'q H,[wU+iB{~zͅ]*HK\⭱K.ʼnv(DIC$zBET`0j (Ͳ(qIp=I46Ź,a<c;ϒ4\Y,Sz][p7~j_a!wa%+Ҭ/f -an^tYr6qԖYZPl'(PwT_iѯ>!`&B@,aa/-98fQta oCT{ 0D{4wb(7&[vHA]#P rw79"0o wud!rlm(, QY`:&* ЄF_lyQ.,\{e8^ONhʮ WZZf/gd ɬ#1v5:8 y!t5] L&@m)dew=S?92bi&!+,ymxBYX <]=X j@nV`. 5= llS'AJŢr3IR/Bm^6]+رmy^] 2}Hʺm<+Z'kefl-r}ijQP #N+ MHx_=1vVs5aMMG-9&qPbF# sPvx'N` lH;0:G55ǺAle&,=p͘_m9Bz :+MeŊ ȷLa 0&:콿qp gzt+vO "ޣ&QijRb?8#20s;_/”ߊ"jŬh<.-=.o&5?7{c(~ʹͮ6=5ҩQ6kk <(-pHHIܧd{tnbY^_齰wz&cjwkW\`*1I]u(wŧ?8r9͘tKnGet;(4cT?ʶ O!^Qy Cg_<)Ά{%l'(*N7\6B#zK@>z/ꑯ%b[,`Tô,Hq\y[CC޺;INB҆vg4^}+Ǚ_"l7[D)b'D5di14vIe6mc'/nL<ĖŶ?1jBb&ȳ^/<1wB܂4KN\Y>t |ՇXe7?NCt=wm&k @ q'79:.E_OXYꃇ / m<"=O[IXa}R/u,CW|`Uܵh/.Q:Fx2lV c特-^ d[&|xpKWO a"vuf_to3\/U7Ξ>? M?ƨ\~'3=I.n IENDB`nrepl-0.6.0/logo/favicon-70.png000066400000000000000000000131571342636505500161740ustar00rootroot00000000000000PNG  IHDRFFq. pHYs  sRGBgAMA aIDATx\]]u^k{g 2R5иI%J}iHU&cZM+5(j׶>U4?c)*J[>xEmx<{+w}  ýsk}[k /ھ ?F|HЍ2$~q1AJP#st fO~o$!AFLDBB8ϯc:k=r7olQG06Z3% B>Ǩyl8Ŧ5w\GM@əNKGɳMO WK 9|"1eL 8l(~ PySO<|coFDufZ-DނgkbԂԲ3_Wp6d4gm<6{rJ)YM(bܢ8pi Wv^{_N"SVDhŽɳM;VM=Hf-[Prfe~~翶>H}g:r&yʇb2v:u9Qka*}\&@@u# _r^~6S;#N}\Σx|oC|(l+?o9/yvGU\͌:vX/J_I+l1:`晰y45.VS } մp7x} {YZC^K:g$zS9\hC([EQkAF3{NWAF@IelI)MR1i?b:[D|v`Jd*3=TGrhVe,蚀#&N @"i+Wҕ޽ZΨ3Hj);$rmcqRcʏL!8 qJԡ唙&y,!uY8%`2p CqJ̞Rx2YEYkf^yqbt%@t4P"[$}dI|!"Fv"a/ ]so.k)c|5@$}"b1ȇWjH2qGD=qu7ռH4Euࢤm0U5{$du;.mOwqg65K3 pϗ~YP k)Ly״ɣ"zD@zJ@5RU28 j-*?gpS iOB:aX uH( .⏧i {=(kܟF11>@ݒ%%2c5n R&0&18X=zK5ۮ.ӡoZQtgsӉXZ3-գleh~6̞6ZJ8^Bs;mA;pp |Q*.8ph<}L4׀շLŭ.$V[@@X1FXHEAS|,1foж߭g *wp~yQf! 5@@8dA؞\‹dzihpD@>BOt WTx>Z 4M3Hyó Bk= Xlwxsnwramo}3JyUqJG,|e^Lq(!n1_գ4Yƿ흃= d4 RfL1IH\:& Tnv;Exs"̂l,%[kYL,;{b8JW]Y*вk?xnԝZ|VokRiI^=DgG_{LjWɦa>H֋lHɬ1 @nwm^`qaw,q 7cY)yHv J@pN0p?-W t$UƵjY;fsH "wB8a{}WAy4JY=.:80Ӂ:&[N)ܒD&r!8y3t_pˡXĖd+VчkD#;P AGM3__ p :}paxw,-YNF͵ѨԠPeyXYMz K U?0۱B#)Bj^,u6\|rcw7'@r1ܱ4rD!9x}Ctݧ+Xs|rn[ġu nhl- QOY+-?՛aDp ,wG\5/?Smb&J^R*{=!%AkyK˨DA6tS4%s%_npu>"ܚ]x%9 sm\  %#He 5H$E$/_J[bWYFb9(v a#=\`G٦8×Gj1dKsy`.UIWQ!HRI8h[0ZKxsw`qw'nAN㜮f:rQyhJXS_Q'-mH/kW}=_) %\u]r14KU7T t(zgNjXp M7-2UґUb ;th W[f5:}ٷTTWI__e@0)0# ׄMdmf.:5enXUXn 5Sgy4BfQvkihꪀ]$ϋ $ٵL[:" >kRS(-/p%?%x\[W#I#6me!7J [59pWRQ  Es q'J;:y+hgV)[NpMZ 0zV(\6U ~Y,G03I_Sz[i_G*sqK3}sd;&vjZ5س'ciU2h!4* Z^N5%`q]\YٵFY,ۣ\X. ֨䃦"NҬ89J/u# I@jOw~-)vvrab^o*f;9 a=JvQ.0o ݾנ)8X&nSj4D֨h^JZڽ@OD\rc1D_$58Uѣf l5ylq7O.\YxnzUQq5{{kJnkHvw&i9-azڍCˠadI"w?[>V8=·[`r]N4pY[m ޥ&|cqNldBɦl~0m8韶mg7Psl?*(m}@iaݲMϣBUzϴ߃vb:Sv/x 9ZwNД`ށ;Nʕaj`Qa-E3K|VK2v̥h{ J~@:~h.hZɹ]_çqXyG j?SOu&[>MgPӍ߈z]{?Sl$=Eզ JxVBvnmҕ6^L#/~n; Q{݊zZf7W ?O3p~Ňq<4Jd$Y `K4sy 'c*"IENDB`nrepl-0.6.0/logo/favicon-72.png000066400000000000000000000140001342636505500161620ustar00rootroot00000000000000PNG  IHDRHHUG pHYs  sRGBgAMA aIDATx\]U^kgΌЎT)g*RqwФĖP*R|?Fj#߁q %j q[ i+"Pa{>yb}Ew3>_~ֳ>>EiY2i$o`yF YQ^9{ܣһVwn^G'_t ;<ǘ1 Ip>s$~?&fMǚ3] >_8ӌ! D@XM5i*R Lj_i?}o<cC$I#{3M=Aҩ0OEi,&Tskgh[XѮ魫9* Id&A,tZ`kMY?e0*hY>pp }aCgb:fLfV_1yHb % ;ji 7&5miR- Ho]c]ui}uCŃ8 (7kjba~e qRnMa1Uq(R]'!Yɳ|dM*Q ܯy43jJ T"؆tkͨa)^051+tHIPñUA[7w4e2:"LCf܀dcabuYt qMh&jBg OPϘIi|s 8(0 a*hEcj"N+ |rL=D EJ.`Ԗffy %s\iO.sY=?HC7dL@jb^(Σq<%D^t`lA x^E IH 9bj:xѮ=wͭjCZsp_3Ws0+T#7W 4]"E.LA5aNeXWI%EX#8)be.NBic~?4L9e|0#RWreH>!te5{Pͮ?KasI)e}@~O :+/тCZ:[S^> &]spVqJ3.'43뗴TRO4;@ZCc D;'brG(ƞƍ= y˾O9聶9gQNb_`SOREfyѲAB R,4E,n)ZNZ'ju`wyψIHFdW'eC|nE<y1jY K6쫞@WW[쌻Ô_fVa8%XP\nJv 4w 6^ i8ڀz}#h5%>OB̂l!J80\eh{ 5X+;Y^h x`ɣn1H)nY6\laRf{_{hahhDnfMVZK2(zͶ\ur;RgcAQAhW葍$螩Ƹ2K$%\Xp%#_w=!Rg:R ,wZzcK>Hnb.ڢAMmd,>)[:br3C[Bo򁧠k&dy{)l&QE`^*zhT0Jq`'r5ŷ QTU}7Yy6a[++-bGwbn a9$nw]]hnE47 72* ~[vx}]C^=Kw|=o],u҃BiUk^9,u# q3~c6 m }йfd+T@IuaPG̤r0 fS #ayW/2(c-իjH 6cl=;T`0B$5\˯րST(逕{ @M4|~J[ Ԏ 8g͙~ QeWDR0LBK!%x>3k\IeS ``^A) ϿÀ.LLشvxgb<3ɬJYGpCab"o38PLÞA/V0=Zh`Y4@:ݳMҞqځu6a~vI; K fb_0 [1Qcp7ht/ŕRhT'e<= E|>$h)OS7͉9OiGq&QO#AXqWZtf1_-H3V]峤,bnq[uO/=CaO.cr'{Rc40Y>b|``#?ڜ4KJ[ KԡS HVQ"Չ)́OȾdRYK)0u<3ìo!+@ԻΎJK-I092-Ju ba(5@]֥/jLu ;ZSrbg&C>17m߫r`ɷp q<;:7 2 aFO 0oKQ Mi& V(HE\LD#w4̉t?g󏱘epW2#M~ ܥ .3e$C[)I.j_~6֊X)Փz` rS&M8ݹT56،l J[tEMǹ6-,k=&̙o$dXO6rEj%H@ҶO=ݝMfZ g~j]g|3mInsF(\iPk'XN2&ar \ }W>qV@JR[$-(B.ftπM@])mgKٚ^z[\ƭ[/s_ۙnóIfr8~[۳Ɏ(q*h7oHWPIENDB`nrepl-0.6.0/logo/favicon-76.png000066400000000000000000000145731342636505500162050ustar00rootroot00000000000000PNG  IHDRLLǗQ+ pHYs  sRGBgAMA aIDATx\ݏ]u_k{8 2奨vDz)9ۿoPV-N&y%dAFH@N)>{)bq?o){l9w U,xu "@9XM]<'?ΟZ,L8'8' .[`C?!fB1d=<~(_O'&m/އss/Ms7'(i+.[Ϩ <=g ׅZ*#$woJ&Y?맴TޜZg97v#0#fgsϔ02++_@;wrI=EƧ?o~aI*q  ,qSWdJә#(^V抏{RO#ԔM4]=J l rNgZa$[!O4tbSl1t0LRٕghf),S6|>|zu|ܕ G 6`d M3lAѮ<-v/=ۿp/酻wF5H$l2&k~9c̨sWY:$Iiמum*ExԈ*dX@#WCcJ5X8we 볐%ZA@Xl8h.2u6b̜Qс]bȉgK4=A'U4*@\yV vxu2'.4%Z_?'9ВX顿Մ8CuB ɭJdUE0֞ק1X. }s Y_KD43be 4rAÓEN&)7Դs]z@ kYy\`|Z~W۰^}mp<@Mq\aNUYЈ||P}0eBBwT:׎R䭘΀=bLdihQ0 Uь+p_cx5^0`"'([) 90ua!_|TMg`2ϒ&vT(1m5gq#*nXP"n3ztao|t>M_MLI7'ruHpn ,k$wnk*Dˆkg- dzXlg&n0Gu`;է%4ؠq|/߃ejz\6*QfvzLW(7 ,)1 Z#EL*qW .7jHb7mQۍOAS+dQtQBv-6y K !̋a%ݕz%5.@1U[ f;^"\#Ol9N Oy\9RUr蕀פ= 2zy>]{kIrO)ngRS4 6r" kl=h|~t+_r[ @R-E:ԖxP^:nTZA(ߞ+\n7zS$idYVe|}v|-C\hΰZvE<,az,2+Q39uVѠ:3`C-,ɵ h<2Z藺{gZ+Nl 3,&VFXjGM%9&bajsLlɺGJLs/Q?u lo6Yѡp/`r@|L=g )`\VXf`Ȍ )}j-dAHos>!fykzy/K;L^S6XϏۭ,nm27>`inJLV*ۉK(h*1&u~Bc0Q Zb"QP|cC ;i2+єUfZ 6_gSt?hIs8OW}q}DvPD7Etǝ9dՐӇ ,p̺vkYz=m~ hŧm_Ѓ,o1ja0,s;%Z+X]-̣~`gV9R;v08zmylg1;ΚFuoMGϜ+/5bX 3<țkJEZH6W4/iq|?7QI5 K*@-e*'f+w>guv "%璥lZC-Al赢I hXw{HC+yh7ʅ::ݵ0G>aI jLtvC1%{7Ẇvʠf!GMu2t3'¥@Sˇvum7(c #zdOls;LYqv0; wg_̈́ʹk!5J`k~m~hSpV><=u0?b0=#87 ӆδaPdnxPOyZD/$kqJ<$K­o7MhN[}C'اРFs-`< hV&fa.9"Z 3#%hfn4_5f5'F6!>"_MrYnR{S\6\?(\Y$u4?.|V6i$G03K-Om,5Nʚ[7K%a`_u\җNXE_2١-ti˅YfCR \GI7&*-{TkYC3dKWG8usjs=l?!5W-?@p+\pΧێE9H澣.s,>Y^med)d^DVf(u:(v)1b}.4f4QRff{T2H2/DM,Ak +6{`Ja>شT9iId4٧Ŧ&cբ)x>KjIo&*i=MROW& / oV, ȘU̓jxZBhgu5E&Y߷/3o h&賗jv4z9$UI)FޤδNteu(鬈țp8zuBЧמClo2M0w9z^MZUl+%Y@p('p~vvx\G4y#A+L+!ki >U('gZhl"`u7M>(7ٝ=,x#@WH(t>\NܶM3K|ˤcV#6/" ͮHs,668 WtCxc>cP/Ybǰ;sWɮ *a5D9EMTqVOQiUZ$7ONtr'ˊ4YBFdqb l8hX#zRIy h rZ BVpRF[ Ϙw; ȹP| Ě;~4cpXg5}:~Q2D,)ٽMutqyclJeD{~ jǒԬfU0瞙 ˢ=\I1ؒ[ .hŸi6א/4KU,063y1hVnBݨ@!X7[U??yevl;uK7AcCo;{}ulץ1t\V2:F [NmU0-hf}Mh Ȧ>F4`&#r3fپL2F\G57 ¦dq!RDОmQ3c\]^ 3FfY-*p^v$|;n?єi2 i]h.RȄTT]Bky'n>6|V\6A|ץ3N*.ۭ0/m+pA+,BmFڿRPEiU0'"}\mg:p*t(3b6m }6ټ|pivky}`L,Mwi5UV *-X>^Lj0jXUؼqһECb5L.ݹS;u6834)eP(6՚1g/8[Lrc::SO7p 1,Wl{-kAf6;CtY 1Q;5 3h Yy)i1zqϡ,o tg}К.+ M, ǧ6떊85wCVP#-DJ >p>&yya.C (Ym~䝙p?=[$ph;AM;޸^?1!5-[RIl\8^)ՏQh]qLRyfB#9ah Qw&|ȍA8@#^gg^'*rH3mGLK="NqK)hʈm'#jZउT]{l7 5 =3p->MsE,^2-5&/ݵ8|čA}d+hh EnBk2lc3.-qn3)5-:/Dd߯g벆m:3y=oKWGPeQY2+=L{1"l>lZLE.44Vh¶b8'%|,oߺJV9ًM$vcp+ T-ohǙL8Ttw7³=p:j{.e'iu:O\/EpqزY .b +MQM;6m=p V׶A-1G">JdC"ľ &x`ro %v,=k-ځz{N 2cn ,->~xC6M7*\ Z2d+@CC*&[:,h YO[7;,} (BUeM; = &O藭b gΟ;D+:[1F>Gf}t u7V# xPC51ڹ== m h6aҶq*ҹ|䚌N0{@X(FkWFV$fQr!X̟'(~S7O٪A&A2[ROjg{ 7YHx6>e2aip=;:' NԂz3O{ْ>O8m˵fRJ #Tq8 yPzf(>|o{{Nng] BovXڏ 9Ƈ^¢AYo)0< Dkł3)i>҄_i < XxbںUV=קL _y[.,lQsw> Tvmn%9d@J  JI5eO'9)n?}8YY7(<kp ~KA\:S<֡ɼ U5W"g^ѵ; e~Rs߄0@/ dJ9.V *M(䜦W=.dd)V AA|cND#2+L,iAPR1ց-Gkﰆ,8 ȓmGCs Zh8^HTCqeQzݔЅ?{CC ڢYb5Jm3L1bНf8 TJ,-W f!U #:TU$YGJjŸZg]f(22+YJg72q5G)c^9Elb"BMP2"f>dARa lcLQdDVX_h$(e00d Ua9+c0ZjtjE~`K-%cjp3607SBlvKr`53l4,T%2m6 2U$*,&b)Y̚A?u6&Gj1kIҏV%tp."p|sTf_ny;*-Ab6ǀAtD+d4@9|>M #i*=נ WOso΂u-wO2ب DE(kWp,0ރ `׵oc|\Lk@sEhF 4s] Μ։.wv$rpg0sJ {E>&%0vG'*"57C ~PM%CRΪ\QWW _޹{w¹ iDg";0/@l 0*-Qh Mr 7$r~x'ޖoNwĝk)^*a4l1aPgнvYm4X] " $t|hQʺ )di'xش'%hTj~(8Sv;tE紓AϡZvF5-ǴΓθz9xmx#S)XdP<ïCpi{oezhG/pL4yzS[ԗL*tx@L rzaCHRiwE?<J>t!ƹPřɘxx.K;"<`13A܇8 i|^ 7=YtN(+-#=k-S|`U@13N@ "uʄ'b&Sբ.°o\EqY=`w.i5 $&^0 >ص;}^7ԉ *w㍄*^JyQ] BPT~aU: \ lQNA~#sܫwE31Wktހ- $TLD]D_VaZR!W7q[~SB̊˴ 5SKVݏF/8(2#=Oc3(1G [oSBKɫW]+?=#{c}& -l$gky>;YY |Qb]RE˓wɑ(!TuAdShPܜ$Bf*I{J`qC 'n/)Bݦ]>ͥ{*AAN>{A 9;6Z֕!7xϐ1K.)cpqs4߅S;m;wt]2pK=mNv_ȝs%YvDLf`3UYlU.IK;`i{ePͣaJʦڔf xA1q}kO7]9\^,D UWWlP` R 0w, iWDzzq4IVsѿma%j5X Hn$o,rJx(jJ&5OhJؔpyJ=.&OS=}fF }LـDpfa[,Q65b^, V:p b)iv7C妄v!#QV>ؾopQ]S*<Ź8{ᇏir0x!LHX6%Y( LeŸjY­id%d¨ɭdRMA %F;[g`HxQFh&06X:}aw#W{ =tϊ6cFD [1<#2i]fxߜI&IQf8e:)%9 Wʟ`wuO=2qW#tv mI߂xiLał~]Ȑ*Aw'|wz'zEP]sPdOk`,UI/,Wkdxq=ڮ>]_C)_gܹ7l=wuv])J-Z2g;CL}z?<WR08aX!k[}bW1Bj%zS )謈ַ>M[SV `U%䀹c,?|F+( ^!t5OLi0Bdx2GRi F iVtXbiZ_[jXY3Q'.Blp}q)Ǫ5O -KdfDclq@-0( 5!a.RQWZv}eV8N Wg3`%<ҋ Y Gɒhy,7r`4 gCy ´01g+ה/Ϥ<̹sLV U] TdXMJXY~.WhfHP1T%X ž8Wy+~>uȽ@X0hޓ QjHu`qvߘ s:s[x+)&k?\G':jʥ%]B"F`1-oN4J;R#fą0Dw^7%l5 SŊ9%< 0FsmY$H+P)N~4ES[=d(L[t`qEw!"H95p{ /rBܩ2*Z2ʧ>rjEUB' 6gγ t6XGL 6 51_քJG8xk ,ЊNàsT=,C/%kBgD PIERN+5P6H3ϰZPSgpl [=mS|d BZ-R V\kXXA6esD8Fh:Rqȕ'5p ?t N6TY4W2goيdpꊕ~6Fr#VaVtPE^#!d5zQZa5.-1PtpˆMp8*uAVBo?D'uѫa`(uLRӶ;|lyڐ@",^fגVJVIhn~Ym RF:*Zu1ٲŠ Yw9.ׅZk̎V7 1N[hh+JA:[mI=$J\Y!q/B0-w'qk|iՈbXz)\f&|)#32QPRMXRՙI-*(H}~pBMv=o}N?)p=tP?)j ,%`̓=CW1SWct1F\YԂC$xzUQ0~؀yB^"<=L!]Ud,Q akU/yo[9wOΰK苟W Bqlx_W (cchq9>Wա" S lH|TӶml, t>h&hSF2i1jl6wO;xH )pZllgAc{GQy-N M1f^B_jCu вXNYoy[8X;`4)x%{`2AOiM:9IT)f)# 1`z=9'd;l̍.aQ4m4hyby2[2\@d,*#p孿#8{/‘*kcfun/s%M,O5Z|Tc`E$mQQ>KPa5n(V 녷ޫ07r傕 ކ0  Ng;ӷv]DmQX]:T#j}(/"oxzt%9$8 {;ENr]8.90ۜXȠIV'cz ORJhI2iT7FIe PXQ^1I?BPxW|Pc?_xNmĵi->nЬM^I;i2GlS=1ާ 8ar~RH`e,KEmOkȪ/,!Ӆۍ/ڄNҔ@X*~hE_/A`|JHN=bbhq]Vd6eHĴZ -+@4k+o6 e>jBnL0A!b4)Xr1+Is{ Gمq3/! [~VB3MQfI0?Ȅ )~3xZpAInqϠW1bܲ2$]P]-Q,MK)~S'N.UWF98[ N$'0+ j'&i;+V Pruro1AYPl SԂ{3_xdJhf~GTAZ*N>*x,߂phIl+otWD00_ڗq b5\`6!kiCkV~"G큎 >Z>BAE!, 4ʪz28Ya5H<$02m?,CPBg>W񢢆ˏn|u)Y }@FjYNӲK!KWxU ~nϕy"+̪& ۹`r]x%ԑ݄q݅oG Jq*)Xa9$*.jh'.(y*VD*)K0Z? r =} U%>۫Tcl4{]KaGD]w<r9{z4)(61gF(6o]B 5(w? OA7 :Vs )16Ǧ0(denX0JӃ;lߞ\w6;A-C,}yυ2;*[c%{x ƫe*(-/,,/ *NwA >CʅdfL+q7ѧG' K"]ӬqˋOCc%uZ5D |axUR(+c0Z@= $ȦccG4QHP\vlް.w ʨM?EY%$%?wAoTαaݳ ,B20(cS4'^t%ȭ{ݳ`j#Ϳ ,4trŠ_qK M@wg^|<'0R /bPV%FKIi|1a 5'IujX_`pބgp/4)B$`GoIS)FаRxRj^ Xg>|/>ς7|g=KM܀(+h_QVSKQu&KuXΑ&Ox.2M9~R.SݺZ7< !ظ_[0O4F]:vCcKli`HXyW^v(< ߳hu|>,$KRpmAZڥƖ.=]-[=;V~:ZWbQ6/ )Dչ砬0`mxŶy=@n{wNGX2Oe㘀;DŽZiƌ=搕(>LԾTnx g?l,É6:$1o'DJVK0b/N؆2;"IENDB`nrepl-0.6.0/logo/favicon.html000077500000000000000000000024711342636505500161300ustar00rootroot00000000000000 nrepl-0.6.0/logo/favicon.ico000077500000000000000000000535561342636505500157500ustar00rootroot00000000000000@@ (B6  ^B hS(@ @   "R̃=7HHIsJLNPRTWY[]_`16ՠ:GGHIKMPQSVXZ\^`aT֣2FFGIKMOQSUWY[]_abT  ^Ԡ)FFGHJLNPRUWY[]_acdT;Ӟſ!EEFHJLNPRTVXZ\^`bdeT ќųEEFGIKMOQTUXZ\^`bdfgTdКŨӨEEEEGIKMOQSUWY[]_acegiTAИƟBDCEFHJLNPRUVY[]_acegijTϗǒ =CCDFHJLNPRTVXZ\^`bdfhjkTiЗdž9BBCEGIKMOQSVXY\^`bdfhjlmTlЗ|BBCEGIKMOQSUWY[]_acegjlnoTl ЗoAABDFHJLNPSUWY[]_acegikmopTl јcA@BCFHJLNPRTVXZ\^`bdfhjmoqrTl ҙZ?A@ACEGIKMOQSVXZ[^`bdfhjlnprsTl !ӛN@@@ABDGIKMOQSUWY[]_acegjlnprtuTl #ԜC=@@@BDFHJLNPRTWY[]_acegikmoqsuvTl $՞;??!@ACFHJLNPRTVXZ\^`bdfhjloqsuwxTl &נ1ׂ>!?ACEGIKMOQSUXZ\^`bdfhjlnprtvxzTl 'ء߶yG>ACEFHKMOQSUWY[]_acegikmprtvxz{Tl )٣ߵםV?BDFHJLNPRTVX[]_acegikmoqsuwy{|Tl *ڤ޴לY?BDFGILNPRTVXZ\^`bdfhjlnqsuwy{}~Tl ,ۦ޴֚X>ACEGIKMOQSUWY\^`bdfhjlnprtvxz|~Tl -ܨ޳՘U=@CEGIKMOQSUWY[]_acegiknortvxz|~Tl /ݩݲ՗S=@BDFHJLNPRUWYZ\_acegikmoqsuwy{}Tl 1ݫݲԖRACEGIKMOQSUWY[]_acegɹilknortvxz|~T l !#%!$9۰ғO;>@BDFHJLNPRUWY[]_acef˺g,l5moqsuwy{}T l !#%''%YGۯҐN:=@BDFHJLNPRTVXZ\^`bdfɺg/lm7npsuwy{}T l "$&()%/֟PڮяL9=?ACEGIKMOQSVXZ\^`bdfȻg-foo7prtvxz|~Tl "$&(*+%+۱YЌK9<>ACEGIKMOQSUWY[]_acgӻe,i]qp7qtvxz|~Tl!#%')+,%,ڴU<@BDFHJLNPRTVY[]_abpܔ9۞rr7suwy{}Tl!#%')+-.%.86:79;=?BDFHJLNPRTVXZ\^`bpܖ0tt7uwy{}Tl "$&(*,./%߿26<79;=?ACEGIKMOQSUWZ\^`apݗ*u7vxz|~Tl "$&(*,.01$5;68:<>@CEGIKMOQSUWY[]_apݘѽt5xz|~Tl!#%')+-/߿14h68:<>@BDFHJLNPRTVXZ]_`qݙѲQy{}Tl!#%')+-/13579;=?ADFHJLNPRTVXZ\^`qݛҮ}}Tl "$&(*,.0߿2579;=?ACEGIKMOQSVXY\]_rޜ~Tl "$&(*,.0߿2468:<>@BDGHKMOQSUWY[]^rޝTl!#%')+-/߿1468:<>@BDFHJLNPRTWY[]^rޝTl!#%')+-/13579;=?ACEGJLNPRTVXZ\]qߞTl "$&(*,.02479;=?ACEGIKMOQSUWZ\]rߟT l"$&(*,.0߿2468:<>@BDFHKMOQSUWY[\qߠT"l#%')+-/߿2468:<>@BDFHJLNPRTVXZ]]ߒ^T#l%')+-/13579;=?ACEGILNPRTVXZ\^^OT%l&(*,.0߿3579;=?ACEGIKMOQSUWY[]^^[T'l(*,.0߿2468:<>@BDFHJMOQSUWY[\]][eT(l)+-/߿1368:<>@BDFHJLNPRTVXZ\\\[qT)l+-/13579;=?ACEGIKMPRTVXZ[\\]~T+l,.0߿2469;=?ACEGIKMOQSUWY[\\ӈT-l.0߿2468:<>@BDFIJLNQSUWYZ[[ ӔT.l/߿1357:<>@BDFHJLNPRTVXZ[ZԡT0l13579;=?ACEGILNORTVXYZZԫS߿1l߿2578;=?ACEGIKMOQSUWYZYԵ޿3l468:<>@BDFHJMOQRUWXZYb"I4l57:<>@BDFHJLNPRTVXYX_)ٚm6l79;=?ACEGIKMPRTVWXX3&7l8;=?ACEGIKMOQSUVXW;C9l:<>@BDFHJLOQSUVWWDԚf:l<>@BDFHJLNPRTUVVP!/@BDFHKMOQSU}VUY^ =?BDEGJLNPRUUU?????( @    M0GRI0K`O`T`X`\a_B5ZXEJG:IMQUY^a]MDIF;HLPTX]ad ]ZCCIE=GKOSW[`dg<Z9AID@FJNRVZ^cgj[0AHCBEIMQUY]bfjm\(@HBCDHLPTX\aeimp _ɾ!ALAFCGKOSW[`dhlps aʳ@IBFJNRVZ^bgkosv d㾧RZAEIMQUY]afjnrvy gՎICHLPTX\`eimquy| jԋJBGKOSW[_chlptx| mӉHAFJNRVZ^cgkosw{ Z҇G@EIMQUY]aejӶnrvz~ #'[хE?DHLPTX\`dfRnquy}"&(J߶jЁC>CGKOSW[_efSqtx|!%),H:]==BFJNRVZ^hސXLtw{ $(,/7Y8BFJNRVZfߕ!$(,048CGKOSW[]D%*-159=AFJNRVZ\BXj--048<@EIMQUY[BV\5037;?CHLPTXZAV[>36:>BGKOSVY=U[H=69=AFJNRUX;TZSҚa 9<@EIMQTV;SY^PAmElIlNlRlT3NV9???(    ;xٲ+מN?I_OW^ X2˷R;G[LT\c0ǮA:E_JRZbi4ȣÎCaHOX`ho 9՗IlEMV^fnu @ֆ@KT\dlu{ Eԃ;IRZbjr{y9GPX`]sqx%+0v8ENUZrq~"+3;CKSX!(19AIQ](.7?GPWdl֠.5=EMUa`@ӫ4;CKSX]c[ն:AIQV[dg"ҿ̚Z ?FNS`^]1~ nrepl-0.6.0/logo/icon.svg000066400000000000000000000034621342636505500152640ustar00rootroot00000000000000 nrepl-0.6.0/logo/logo-bw-w1280.png000066400000000000000000000242331342636505500164450ustar00rootroot00000000000000PNG  IHDR< pHYs  sRGBgAMA a(0IDATxaxX`F 24# GQ"v#}6ӘYkhFM[ø +q`,m_ƝE^BT0.C5B <x}D@08~$^ne hY0<x0.׳SŲ`xa*], oŲ`8}D@.'#Ժ[<8}D@CwƲ`'seX2Q4a.a˂(p:l[o_f>], `i#M]Kel8}D@ܞe9[M`y# ]e=b|Y.ˎeGdrVIgcY0+#oui1e GgӾ], `G}uMe@eG]?g7- 9#ҞLeoa6e4C\}Q}e0e6~ ,[>;\ggk, ac`_>enY#K8W}}, `6YS] #2ӂX-}," 2cu, m#2.5nYYLFlWu??cY0Gd" sĿ),G:]Zޞ\.}D@.S?0 ˂,.p!p}" #-SaY1'׫ÈWd,'׭y/"IJ`M\>" w05]eـ< }D@>TZeF p; H5Ų`u]Ŀ5bY0U]ׅbY05]Ŀ-Ų`#nE]+mO˂u}DbY0 xkTg|4>"@Pp DS}D߻>G w#H>!r>"`KA>"` ^ƫAsK0Cƿ?pC;Yy>"tfu #Ω<SEIS{=<%S{GTplFHc<ȵzpk#^Kup!k#^JFd }DK^DLdL}D'pe c#~5#B>aq0?EF&2>"I!u]?`" sE&$2>ۋu#SmE:y&$2>ۈFf }>]f }ȒYW[Hdi#",Q#Y>mF* !d}t[0X',H vYv2ĿgXVEL%,+v_i.ˈ]? -eX@@Z<P"Ҳ]y!Һ]4Dd v?xhu?a{^{u.2>7:us\Gm]'yc k;~^3 kXp;rgx*Omqa %ﮓx_@9-\EdmvkEzr fv+vm/Qn񯕼 1EdvkF?"9E_ׇ A6i`ɇH f\täF@oXgԗp_s.3_]?]; ." о.}){ ~/L [Gaf` 5I?pw/Lvǿ&d9=N lȖ".õj,C^`"A [u#." ,], 8gc`@jEO˻>^ [lp.óe"g].Pe@mb6 } 0E0ӥ 5] r.} 3_'‡vn#e8%pc'§vmyv.}\9&%v#ga@c@." =}D@<ϰwHS@8o#GHs@k_S4B-EMa@x8آ} >2fKG.s]&` <lMwkdX(F&O}6t(%ӉԽn]3%,ܮu6^H \nC/1 "5"ׇ6{ul֧nA}SL0n~;7c2zOe f?2%_.t3\UkXzqD@uZUSg-q;g?<~>6Ļ9PpQ]]'/~m"p}" Ђ0~0M[Nue_L69]o:vu_+ ǵwzI5\)Z^fb5uϐcϫ_gbXښ:4Ea<" ЂzQvVtK<^p<4Y ]1#a\cDroȀM1 ?M>30˺ L];)_> fRgO2\'KEyX "4E]3<%6OS2Dzn=>k2 LdXـPW˂K@,a ?K0`,%ClyMʌ@,a%`yޣvf"F0"` u8q%p LOˁ800/X2'|NB]|f KD@z8R2ܚL^#[{Q4`f!298ZJI{k= " dNfX LUZ lf!²q'̡}̗NaR<)`:" dNyvusfg`b<6Ouc:" TNy[4S&01p>o"r,U'Z: nu8/9E.Q"d`mڹo Zk3ʤ|,azN)I;nvvt Qo[X&'tnӎ`ZuRMIe)d8,a:%68iÿ&$.O y]D@`y8R҆g^+[%G`B22.Aoi_!`y G sheLJ\\7;'p20  06t V"r^X>N1p򕈀ץawp20,؆,;ΰ,'s D.ˌ?]-d``Z AlKy]Ɖ4C@wS"r^GoN@`J,(9,C]V% |-%" u9>Grץ_ S"r^8l+Kۀtik$D." 0?'u@`|y]%" u9,غ`||m%" uq20ҥݟ`|5xo% )9lEZ&/IHU"r^ق.mo~^`vyIl@NJD@W'^Ɵi笙-Xn2\#oҮxfF +9MRݪ1z]? % קeEd`֠>?Cnj{eFLa3ץf[y󺈀86_]֧Y)j5F!k ?~>uqEe~\цk۵<О!p[YkFVf&}'#DOu~T7M޸s 33~'OaNϧFi&]xe J=~ֱړ}85nUf^`OtN!E}X2^OyPgK<<,ÿzeƓz,V>zh?E@ESU?Ĉu` 1,]YtqtS|[@J0@X"/IXMmO.b >w8p_20n_Fl5Iqu3[wN_s,evtVquEmھy= \W{r/IX(>" "BJ~DZWbT7OkyTQ'%@+˝2Ѫ0q\ׇ6z9鏟" c"B<3K~^s˒}Vűh>3.C8dj '>" AZd`؞3Ω/H@@Gd\]D@ha[J?sj!r>" "BkJ [P"#s9 ܲ0 p& |Nqu5<'wW׾p_"(s:p." aMCm-/S}2(syFȸx8֡.P p,]K@"r.C2@ r2pئa߫p:4NkВO-:-O3NX#N(fK~{OwdU@;20]3ZgY$+E%|к>2~tX ؗp:yX)3T3xaMn3,c%uX=k#0Xкۼ c~dIl%\K!6h@;~^@^eXZ}YmeX^#C 0;펟D:@1^3mͦ?mU5 #[`z o/粃E_Tm/!/y9Ҵ Y sEغRhav}/&2]D@+?mjzP]n23$2]D@p20fӷ%Eغz@AKK**i K Y]D@om62 lȒ"liQ=5 E2'Ӣ= Ke%N=u)봣[@#@j`nd`S ˁYa˖Zd`ZSA&t76mze)0H G2'Ӛ>m}gob)06"%'C@KN'҆R?Ҏ3^|\g恍D%" v 3[ *lmߧu)%Y[0T8W]?(`n3<hC]V[s#nJ|we@ZdO@r203W[QWMUi]N%%oԥi]N%umR{X։t:POni).6oY`JЂ6w'" 6SiG] :UhȚTk7KKqa k#lSfV]uҖc)04Mdj3ݨZ*0~I;4Kd 3<]%N%}?hȚuťu/Y." ԓ[ +lmZ \S/ktfmPgսI; ي." [`iGhȖtUlSI{u)p  [LuVU]U*Þ  [tͶ(io%Ti{za-p [CᯡЊ woQ,ȖW>" @+qf봣.t{`d [QJVq20Wyƻ@d Jƿ)3ܬ|Nf>Wԥ7Ida|i#69lJTgGdJW2}D@8V2FdJ'-p20KR&v#`9lio)p=R`X[-d`kj=bM nKAGhY X5ug` ҕ\Z}k`J ̲ʰ'`+R_Nd j|Kd`KX <HZ'KY?"ЮiI l>p?̼J￲K8.k~>7yA;;53~Oes]j_.Mا}kn?v`s,E]ڷ@ZS)##iI9wD%'@ZP2ĿuGLdJNU;ȒwR:Yrg`B Kw"W!Tu/76:T" p)A#O&$5." $ K!}<'"2"=<ȜjۅK X/%D@@ \]_K,65@T2M$2ol" ) %MC> 26oz" 7ajXlȘ7's+`@a KQ"f \[}X6IĿe+`s@嗈-(`S@xZQ"f\aBkJD@KuhU'T0=e%" `U*֤'C` %b}UzᐇDغhJZ\b5!Dm, .hX{<ݲ-=Eh#J<㫬gY0dXmg?D4aD@봽,ƿ}`=D@Ih*>" \8(/ W$~,.-Yuc!Ɵ.l+igY0p!,N WOݭӂa-D@x"qJeـ05@|!~!$# Dz`),r%NP|IJ`." %^>f&v %IJ`." IWe0]D@8}, )|uq`,a|>Vm汪&IENDB`nrepl-0.6.0/logo/logo-square-w1600.png000066400000000000000000010505561342636505500173410ustar00rootroot00000000000000PNG  IHDR@@! pHYs  sRGBgAMA aQIDATxͮmWv'yH]*;>Z[ (` Cv% zH dk7JO`QKp+`@KʠT/vV$ݳs9gPHA~9g}Z1fk_Oo?Fϯ;?Gί~~>~fo5#|Yeumq9=Wx塹򞽮FE?e%s+ϝ_aCsym\׈-[ϫ.?}ew4{63t@} rq l 3Ghb\F~ylk38g~{Ms5cf 2f8+k{,woyw}e羍]US1.^[5}P%ϸaH%Ҕy?{{ stz[V=._s"٥s;|fc )˹TA꣄Az&YrY =NxRAr JLS_{/?G/>z @ {\-*5_^nd*@z_ mU@`/>sXE)%iXV"eZ"d8HG^XVL썺=CQ¢Xt^Y9)Bؗ1jr(N;9,"K{?P'ϢO/N/zN??x ^ZjpDۧ-Ǡ``19X®eh ZVg.X_mdWj,[HcmU VڐwVmKwӬv}Q312ZcEujk/GK~*8Rx'?\/?ˉB.AC e2~6_nn*?шRu[ۭί=awN, UG{OϜ;|S| ?'g\9~r ]&՞c퇐j X3*3Xi5{"ZTE\AC++YMr:wړujh`Qڃ]REZ[jQʱ9d 튖kFo%?土ۭrd=M߇<|>~y5Ho7 BWy[×}"Sv"/}٬j']e{=]~ݯj'5vyI>FtZm P"hT5rV:{lXOYA0(%߳b'3͝f22Xfdܗܼ\TX*AU# {gꗧ=CrAȧi|k @)<;2yvgA l /{L}A]IĮ%") {tc%ǔ0H~Cê9#ym9?~mdW>/p>j 4z9͊9(m+ٓ"#7ו#scg;W~ܟ)>/(xE_AiC JxVq,Ւ*_M8TD1V_:ZSU ~*+B7TpjxշS}nZYQ_;~~+W}_\^XimGǍ+cV_s;a㟽;9GXUxcGe=ʬ+בoK[? o ZΙ2VM]B;_Oς?8޳nxek7nvwrWP"-*湬=5-Xt'-goه~#g1Ո:85B$62=X$sJ;l0/ׂy?$ ^Yn;}DOk|@)k$h_wc,"lAiW@xϜeuH;<{QUqذlgu=sd 4\ ur&=G%/_\Ŭ֎O-;vױ%FPV#h_! ?GR#y|y\jE߸뛳@3tՏs[7!@s>S2of d+M4ߓV/! Iֶy5Fתa{r=ůU].aǚ1걈"7@٩B|~Cq# eVB5ȗ-2 xZΕggGmp<ȗj :/_ ]ˏA ق^j3CX&rkȐo/g_ȿT+'Gȱ m<(Kܣ Ǐ!BYZUR䴂q؎X^hƚ%cٔm;*q= Sq~s~u'FiУ̣Գ䋗Ey}GbK>޽;iM ,hDĀ|HsDi Qq^=. VC ,Z;Y!HkmulWv=ǝyml rBzƪFr&sVdSi&u"T嶖lWYJϟ4~C_K\?[ j`}Y H6J FwZ` Q2(8[VT+HihUAӚԚ_$יnU&-n>~%(#YE?5HlN֒.v/Ǟy\23\w7VH}, ЬYrn%]>g|Gʹrcu]Q>8}hGul}UzZA7˟POGO-Hkf/r46rc(39PaLH~ Wr~վ7KdWkjNzoQ5q }h̽v$C27JkUd;XW\ي+?,ʥue٭7p_5oszk1G|'/sK?/rj0pd:2%>~Cznz~w ]U7(E2]#{XÚ\zLZiUƂ &cq6Tb]eޓSޝ{ -viXBߑCY{whU';(Nޅ\&W]q(tIZNrYq1U_+e?Pd[ޟݞc;8ܗo^+c?G9vWT1Vk.xa4<Gi|#Q9XsvvZe2F >.AF;$ksK\VvI\Z9H428$Z`Oc1,Nߘ$^o}(͉[V\ 7~]g+s~lv5־_ӹkqeZZ:ξ}r\g坻?MOFejmZdr9s1 lbષ*/*˶fJ(W;V [|9Z_9G!5JŬsVw_3r[v84VˬrGIÝ·R6+>Fke}Ą 79g~G-k+/[8_}S"k[zW7T 7~쳾\\;nO?xb@ W}Ok_ #R?-_z5kdgB $}̊c@Rƒ &~K3 !"oyأL(T6UL@F[+=e֖},zL:?+e1)Y Ƕ{ږIc[AJ+1ھl ?Qo_|rK ?Ư^fuHWV/O_Hj<~<ȧ 2q'$ϭX8|yaA y_KI}r ȱU{)UmԪdlҌy:_3x-$o֧G @ ve{@2rюӀk\J>-("fH`bJ\*:mWL~JeŗW^*:V&SY-QZ_{<|b+fxVJF[GLM]‡J ]2wrIJzRa XրyZy*ĈXX 9c~+Ty{ꆖ^tz~_p?h|mx^h7TiIHVZ9 4Vĸ5ޔ^Xݪj8ib8ͰIi=CZ̩~[96a|#k`)6yXnƩ9LlU7RYK&<_bdNAFBgd́qPha[g.ɜ ?sq彾%( tkAݸ{^/GEJ<=<6fxҮuɽ^J3f?Xw/?CmZ5m}\i_mQ T~1VDy_՘б#| +r) z{5kz<>Ï0.͟'5^9- (Pr8Aו Qz+]_U mLJ>vU0$s^ssΏ5*۲&؍IqVNQuVj"cҔPc`$x>{qmn_UƬ5oI+ wz ?]qiS9@׈LH]rs9ѝ'@˜}NXqK0Я X?E]mF^?oyPvR$ˏ>ыm~A ):i8.H2s1hsMV5{L\;:ZcO޳:%\6@hMJn,!žYv1r{Ozt&+[Z\h=cUo.dOQ(mC\i,w\wW?j>}~>9W~JH`9+/bÃ]muueBu]ֵ/?^-:{)ʑsu~O>Cm%[b~۶/aGrs< [Mw] `w"*b=^l4vpi-C;ɽ˪;$ᅨ b&z_AFPdnͬ)f{Jq]?Fx|,#[oV5J 6Flabq}H XNwTܗRN} ݳ4v)D;D0RϹw˼ &էt^;GT0}yazd9*۳E e2[á--Θ#…=FW(Q;Ze}ZP!LFϹ;.!LVd=fsÓ;~s 2FDڼw*{Y<ѲT Ec~(lť%XR1W?2xIzr2 d\ 튖k|jK{ϕ R/>x>Y=. +|>/3W/勗_Šڪc`j׵1mS:VXs_/'µ\-Cxe.Ic$~T(j@(_]*i՜%dX/`Hܨ熏cE2j.e,WkE%j9K۷*ʔ끸u=I%?ίrh0Hm.]i^\:ATw5>?nZ-UmEr:V+@%r~ŏUkGonְ߯׻/ #^Y9#u~y?^|<>vh :vǹ>.:U0[DHp/}7f]|1ڣc%zT̗6/nzt ag-IiKぬ^TӺym$*Z!˞}/W(5<煞+P֓#î?W?3'|ϟ[g߹JUyQ Q7Ó\ -Wxklz"6i|㏍uZA"qd5oo?x~h~;NOX!Y%DÊ2C ='V1rfϗq?)Z\ crq?+-rg5Jq:W~<*:2HTy0<)^sEE8}׃y{$z^ԍy@ddU-'9?g<\"fd4biyI;{ֳ7>G.z<s}9SjcwqкWu7F-V2 Wmەm9uHQoQ1^C2hXE-}oL787d\c;"ӳ¡b+}]AQK6FD DǬZָ l[lZAxR5#|62kҨˏʒ{P fクu2C7'go]W̹6/e]km/Ǘ5菾RW&&??xvP P[/W;ƸXe@ %cӠCm>o%豭Rk sX|&lߡU1lvxM tGsg˿jcs 3XcW:?.Մ\yynN:Wk}7گU] Aȭwdx*'?_׻[Aɸ^rOobGBJOXaNr2bƭI12襊`W/k{2 r l#[;툠̅W58nE(>VD KS+߽w~x{jX|,dc_X'Ź/ǩd Qa˽}b/*Xhy"=Î[[ʐ`zɃ!BkDt^~/~D@;bW1w?AUuQWzYar:\zv9tX~$&^dr y9`}R&)AK (9=J2g Nj-(Yh4rbeUunVQ%R?Zmw!kc^a>g/!;eQהisDF=&:o˪q-ֶdkUg0<p|A#9-3[YtnBˏ> [NO\ii5Q zdeqڋ~HEhUQ1JUň{Q /!aD;YQ;]߲d?M^namN;v{8ÒZ2}*7}X vIV!EE{ o&5e}c^61@l8N&~| @ k2nǑse@&[zfѱ_ 786K1gǩU.Rjܖ%;j;~ RcooSf73:*H9sGءG2@RI_86lA@f}n|."eGZW羇/E`C;>Ĝ 4/ ?-ɣrǐ419K:U_\諗I:}]/_1xs>^zzAg'?z'h=sk.i9x?G=z,_=BN~t8ܵL(##u +r`~)}mj=Vک`"ÀȁfȓZ C0;*Uf؟co^VWWCVZ|)) WGzZK;>}]ag&F'/xOco̓txi0J;U J6Nw4jX{/˚Clxm{E@忾[yQQR#Kr>:yEj+Z̾X;9R*x?|-!'nQL.bn7G+tJ_kΏUmd;h^WZq,pDJAm!}-f9?F_ e|2,yQq4V';h[Ǿ p,q$Cs*eh՝n{8jh2i|Z{߉y\V(55֟ڧܿ[ϱDIfz9c.Ik29LyjD 2zEz9>5|qKcU"1VR*Wfx=9Ix?|ѻ NOej}?*=w^^4.wӮq=3@Mז=}c_*(+ .;\/koʆYju U@Ҫ(6 Rq۹u|zje5[=hɯ粄$FA1OHeK5}zfbt/>o'TqyP}V:vq-smԓJ/-/_Fw T鋾È^/Ȩa%\\Ozk2ʇ<k(<bi25xYeU 0?F(r k%/sGF'9_ k^yq9/leX*Li^ڇzr2`\ANWw4NFLlw&=:6kK.Fۡ5jE͟'?DxҎ#2@ʩk=~}!taCpJ/sXF'=2$JIȞX|]fV%HU1:WzAz6V߷kHT {A|8J5nQmmVvtĴyLv0ښJpuZZÙy~__V'W[o|}UKR2|M[ VĄ!{y//筻WhLSÉϽqer!9&7G+)_TKhMW GֺZwji`w7ȯa9>,Fw|0HL Q+f=J{4ZN~U"fbs2qvV(j{l99oji{AKyPzz{.v3}Fb^ ~%Qvp^>wdX\by\^>ۺ}}奔w|݇߻?~jcUùtd6եe|2|yΚ-AHYvop~_Ńю+i%C1ʈ. Ăp)Lzy82cdh"dCgc%##y0e%X^cu3mmM[! |bi3lWَzn_K}&Jc3܅psr:/fr}Έ2VIݽ|/ /~v~O<\b:, ?9QʹA:r8eף :bG6 k>2P}&_o6^hFcލG^_߽z u=ǜTs>J(j^¤ ^<×o^Usy ZP[&0P!2>Q%<ͱZ R2iy/Ceaв&fWNtS"k,F׍ù+jf ŦF`mF ;^Sss~͹9r>VHn۪D9B,VPf{lq3)Z&R)mY5~mj#2SF3!|s={{^Fs ᝻?|ѻ 7DO)щ# |Sb~58!Gۏ=c;_#&h#2eM=5?FϯD_!=84*as-kkďԁ3o)w:rs8K݇]7=QVP~̪G;D$Cʪ)sjw|}jN?'_~#+3*9$ sh5x~]jʋ )c<7^";%^ƭ從qr CV qN@],:o_D_Nfs5Hoˏ>7I: V^bVH^6H~߉ph?QE;z~.lWe[VP1~_EaGN]b>2n*{֎O3CKzi'+j =q$̆͡$bVîSnsv޿4>=ti};V{`g<:T%|s|?{qz>6֜4JTN4x姒d(ңNmWeVnW] ۋӋv}z}5xaeuvW}]6klc&v~[:.nD"_]go×i6JQ{%SafDƪNۼ4 V;J{֝9s=B֎]H$O.-}\Q8%HȖTm_’󄾭,p#N7?h 9\>J۫8oQ_Ըuo.{ d۫ i>[ !JW|ZKY`l͉ vֱ!Şờv3(JY~cpg'}R롂xwp">VWU :_}jbV.T)n_:kC¥lo~#Ε\qVZNfEȼ?GN0lg5+6Z;>F r+բkcĘ#^k= 2@ݞLd1\#*jEC*җGz;>NXܔj]ާ1wR%Si?y2öWs̵Nio%lOeQ$/^=VȜ/hkN}y-d[{\ _'y=*?nWe< wGDyA8cg^F_A]ðu4e*t}8;/^5WV?cݒw6g&6Xk:UZ-24s$W72Fv"ڒ7|~+Zq֊$cHpDK؃{S+2ȼIguƮ q 9OfYl{/~m̘=qfO_HgSsh?~r|2zpp~oym{-Oae_;駕|+zeZWE2 VFĻ濺 xzZ=x>>ck{Wqb\wReUǨ۰3yu3G yik][Xi&xơqQkm]*5Qc cM Cj1H_nFpp;渴$8W:qt&zᶾޖmvk~( 1f(w/㼶!kI&Sf\̊u r]KrcyPG=cp/A9~xؾQ>.A:>ce8mNqmʔ}VK91_|'5լe߰lY6Ӻ\K{>~x@e{{ !fhwi^&-{Ytߨ;sWң!au׈F}. b6cZR Bbؗ]A‘}=b+IqE}ez{[yXxVr{#հf~DЭc^}ebBMnQT쏬ݪj0S!:dqGvT fNwrzVkRUb/3\87C</H+ڮO67l'c|;hu3W!|u}Vx.x_?n|*˃gW :=,!*/g #^rz{^m.i3fv5 _$e2Ek}O?X$'nY.{~3bLN\;r}\~=c12"'-8VP^q(J1qiT@Nn7}5{?"H+X!:yd6eIH@{O&B4Κj{u"V!W.yC1m`,BPF't_Mf}52!8}"_9x6Ï$ J::_`Pp1'Ĵe\{/\ʍuUY'G[o=_]Rޟ7(<.n?DZ-0c?o={^^վiiבr;Xc3m mcpOlit7vi%'\4b^uq;Vj:ͯ1T*JV+!A ƚ)=jq8+$hZ$B3Ѡ%-Zfr(wrGHݶ14M+~T\c*D汶xGpM~L%JÏÏ?S=ĉeUЍqʈ?q.qyr2c\-j{ϓL$rE~Gݒ_OUIj}r֭-5 ;@y| J=XAV/[ʼkݡjy5bhN0뮯kh<{Ǯ W7Ta ! !SĨ6vP;uUNѓK1y}`ˍqleƒ@WZؽ{0 8b۳:e]׫{1okj[WpĀN?c\qK Fo[(&Gm2ÏOs竌c%1^~S *.?hx3嬏3@tI%8?RY$豽cu:4hy>a[үZz;ǍGWxό׵l2/qi*2hl˶k7~ !zNG? x>U|zZ*9.U,W8VE*1^cCHרz=a6Ej_GrB؏cZje{͟Onv'V~iT}\FFY:~s"Yݯv01`8NZ-^u e 95BX޲:;^XGP2ۼ"{.VFVo?d";9ې+984C}hF=e=~W+Wv(V Y牙oku=[@(z3O:hۺ+A^A+O}i5~N|>lk{<ǯ;iᆵ07Y嵣ZF>*rOܚ06k?-%pp=k (^oùOൗ5cߙ[WQ޷֊|v f8N~~b@ w5z2umUGOZ JNygNWֺ[[+b9>+dQQ”-c\ 5Ŏ\XjK:H+oO8%FlJY2r2W[FeE=˾rf2#VRo6>LR}i+Y^C;eYenQX"7e]Wr:~jܥ{/?w+RpU)wm_z?d/#ͳRV8JаQ+Xvxcܬ̷Z&òyZ72jΚ=Oˏ> HxY~bcˋ_<$?U+Y=z&wfez´6U=Z\d۩_vy12޶OhidR ﴮĢ $_àL% Z/0١F= טnY} eZ󈔘nnjX󷞽/? w ݿ99zy !GGPLz%xdXD}.%1"?G( Hco`!X5B뙭r^d)%  OG~3ZzOE[ڜphj.L01)>WvdQ=e]MN|clwpjYU)-Bz|yRjYK=!JfޏJC:G[NǡB@fyk^C`;3mUFXU(=ϵ*\Wq3a'^IlAAB}ʥ@+񫯧:9zcKguWSuԈoļFDsm{+^~y4;GOn!^vEEkݮ)etae ۯosQ̖Rk՞eUʜ-w-_w5Sn)voOrV+J2mXj:xv깹=r-L'si]r|0ki[~>֮Zxlà |ixXe3N'!YPծ1ޱ[Lȹ 2h}1~IkJ _1rW糹+O{_kYn\ >2QFAF 2O-az ebE1ʶ<0=8NׯPOGij(b^++`b۸5Ð;~ğ[~jǿѰOr`[sPj =+V&|O|}u=\ qc޺GVÉeGҼ^*W $=j#oRa}IX5A.Own'MOX[{<GVM9]{1m#kmhu(Y+Nvxr5n>.So+dXC(e(ֳxm& xbwodA;bٲ@Xlic\Nh"6d} }72p^)-+sjC0ۅn&>èR?KfYeF 3r.n@6^lG<7Ͷ3}T'>x7wZhhouv mQ 8p>/ =OPc2Ȉj#cnC;/mӋ;|ac>iĺ jseXU빹m+thƱ][ppD̶+ Ee޾&y᪊XKZiO:?Jy d5Xbއ=6+{cA&Gi kF9ռ:RWC+m}w9_Vle\}J5;g#|ARWA\ ؕ>m>W*d`-Gecڞrx{2 ^V1RDZw_iu~O%xz<+es#8EǡQI!^ fy}$ 2ד*=ә臠f6Z߭fzӹtnU癫zuF[#ru9|[yh_qzuui_㵞ic[Jz[q}ǖWx\1 6.xIXJTz)#&'mp[װyncөx *C[=1%}lc 75E2V1!e_vFgF Fi/b`XV16U]{P2~ՂV']zy|k峉!͞#k3h%[i}.sK}]JEabx8'x?,1[/ƋUƖ{5a(7_q^{`z~jE@|=p;(WZvߏ>֫e+kjc~L@%m/-cF H>9kuC#KO޸ 1JEtXmrṉ֮ov#rw;ˀݶ#^ZUqm>E) 1cGqۮd7KI\ ^Չan_?ັ浲!HL|~XD$;㰽:<8+Z\8"!OH ?փ:7ܥ;azqwGKÑo7G9rZeͬa` fǻ"iJeS_^fjFe+^j7װ(o<8YGGTԳq+)9+ +X;'`f˴\PױVy9%h-,sC&[HOYb0~5Vc0= tD9>|!cy/MrD6ii.a݈Rގ2Fy bnGʃH <Wk~mbp?W#ԾlCc!\usoVzo d8TƮ@!HUYAh Mr[ǨZ+mZ95ƺzD R=>΀e ȍo{3/5x,+s}k?Oc;-aƥh0x;u<*jǔa{1ynyd1n& 7-Srޗ[oYI+};bx|oK%x{D"Hh5z(ak[>: "zKر>?d `rV{}^^@reyiI_AwUR8־x{_cC:xsu%\#j꣕d^zvYw_&qXUOkF۟sK|o)uWsvԪYM):?/Q緟VE8\ۺy]=ST޾`0 ~d0 FXE ZCCܼ5rvsWqIqUJgO(JT;yVi0eH9Ϣ9$U ]bôP|p T):ۚ=7^gmJY&}CB uƌ Ս@<}Xҷɿi*(1<DE2fTVF&"{W9dpN'j/'>Yw}7?ņS8ǦX_+k$$53Ǡ | /ȅw`Y#;^#_k1Gm}2oUxwS_4Q>rvg#ZxƐTr^O˱_ฌO>7h9n|a8#}wB- ^m?Zv{3 `d0 wYӋZ|[?U,C*Zހ|IGgÜ@^YKl zD!)kf@=͹搥ҐVBmP !s:&P KeBp7N!jUƐNFr h#/*3o>xN-|{T]StpX,g_瘌;B9wJ+`N@EG#t(!NkNI-}:o4"FPGHu؜8ij D?$k!β&Xϖoz"7eܦ4 u\_/vϖ^kLٿWYb!D+&o9(PZ2m0 Kc`0 ^ )/G'TͶ<xFH05BgvQ.b%%&${vĈStPDy,YJN Xl#[%|Vإ)ԧ'?c7op 2o.QEsɳtẕ.a 0ÞL%CT fυԖE\s̩2\n)V&__;/_NT#RG\p?/cʧDq&5 ǹc<#8/@DzQzxLOG &rLį[p `@`0xa8~U”&А(ܕrHo{Ӱ}!E/yKktX! {yvY~*}`x >0Qz n$dߝd%A1u ZHf" DG̬58kK'i5¤ٳyN nњr|]fLҭ{]I SO߄?z~tzDJk 0Gp :Z*k~Xiߩ^Զ3%'# &sM^\,tQ^T\^@HƠH<xG;4\R*ĞǥKUoC__V|c+tPb?_d0 Kb`0 ^ - 4Jd3ޭ]tBG$#i1ag"Q$AVLݶkbL]utJl~f#awOɄT|.},hW .t%( ݝsA00N1Hwp,2h;lHB 96x c a.!;Nm+ɴӦ2?{|#,;&FC7OrĆh 7dHg\*<H|YFڲ㼢| 㵵 &gX !Bc=~ߵKKZ\{WAb=!6rO.92 [O-zەz3KPb'{Zϭn4>|_4=|U Y|{]=b `0xE2 +9d#-$y$T+q6Hn'.H0#f{e! 4!XzS0zJxWA#C6J`xo"H$_OUDȺ3CuC~߬s{h  ˨DAWhnjWF-vgd_ 뒷!_g\K˯UUoS!,nJ;~Vl%eH,six>H8F"8^(J-5Sd72 c`0 ^u\8а%Sح졌ycz aL8:ĸ^# !S>^ޒc(ųNy,?u$DYI FԣM)Μ"֑ FЫC:QN$ntx(SCzD9 6U{2̣$MK$2^[|/:Opn{t˶g['$Ool0Sÿ}z?6+$wec1w,(Nr~V:wQQRs.?4CVYYvm EhX᰸P w׫f3:QblZ(x>:=vVuo7WM(+s5Voq⯃rLCϝfc*ߟe*c&hso`0(F }2i ݣΒ' 2"::BBw _y .%D6иg%Hճ{=PKP0AֹÏ-J c;bVi>d;HPƒw'׹+? /)CS8B azh&umrrn"|T'# &ďǛ_Yp쮵\R!:r= /Us9mu/ W^~)X~.q9Wk!ey$+љ~"w\ )j- sWoNk:]O} F~Im&Z;kgӶZkYHBK`5 sakܧMS'~`0a`0 ^B(рr=SŠ^yfMO^Yn¡=XvQ`qpݼ Q\eȯ4s` A܄px*"zuob`g`N䅄Z[`#%3c5lA4t4QYƐb:Ezڅ?Ѝ~64 5&,?# &p_aj8sKrhɆu @ |LD_b;w/VgM㡡˽(u3sOĈj#RrMr? Kiꍔ7L1c.~F{{Ԯ-yG`]{޹Bg՘H}y|x˱4"mc=Ɋ_y`d}`0F Arn{<: $We~;jCzQaJo\ 0RGGcJ.Q&==z@psrLiuMsq^!rBoWS0h X88=x9*J`%!T@xJPGPk\|olӥ=Sɤ")lY>!vpf6Dddkś}߾ o wY״簅Mqݹ& =Y_!|ީx )Pd yr񭜐|߷6r0 ?+Bl*K8 1`0 / Ѹ "$M/8,<#L lnEC^2#7PHYR++9KNDq% ?"F/|6ldt@4«ԧ~qX &wD^QOo#N k()IA1f֙”Qd 8Te  ZG04Κ9 Bi[cUx2uV Re 8< bАbgP2Fp*ݠ5=5?wkWI&: Xɏ-82čxSַ$ uRgd#˿44!pd5^ "vXu03o-ő2"Wm 4TuI>CDa}hy^R)a:\B8B\l ˰~0x=g8e"$c,{SU9ʬ oxrMkXM-)=~6J[t}:=ns;> !gͬ\7}OuQ3~3-ߧ`01`0 /B{ #Ð,G\$-XAuՑ^mg)0Hʥ@D3SxFWJT[Ca%$*3_?V[PW vp)&m]AEDRG\-aM[{boݟ}C*Ce~D &G Snn&ayǤ-(z+؈ _?o9¢H#CO4@`{!pa*kZ{aj frF+bqL9V;<_G`II!];xιiiQ籦ּcK<${A-|>RZY]R|>Vvy!IZB™!\#d%F ` `00Hv&/($nΛ$$~ $z?(!Hl^IYf4&P}&:߽;.De1@B W3, WXf=E:gKEڱQSH[U 9V"M_OAIBR1 )ESAJPCluGg2f5Dq [ppG6TT Cܐ48F|6q?Kr6w8g V)=Aj]ۼLD;.Bg;5.M3m}imI䚓WUp|ER呞cqvo\^_4ߠMjS.\W! P˧+ӈx~o&n< )8_Vwe\M†G`0&F rZ-!1ضP*Crw ;!b cMRs%v2VKRk(( p(b:ę˹8 j[ ^}wuhI4Po`^%6a"g&!]UY.Ab'V;HBI~"tz{E;aV(fQH-G,/4e`0 8F ;gD6+Z#pQq(VHX">"9&BIЂ5,ؙm6R #۶: VEU詤1kGwnKFM…!p=ǛB!}}d.Cud;&cgYG7~ձ)(IVB)!na@<=1_joPet +ک,Ŷkf_/dp??lNr~ N./ L8CCE'Ϲ\>W-w\yr`rsDDhܼS.2LCZY]OxH:p2ozG$6޿j}_(~:<՞˞޷SG]pKY.m)j]䍵{ VN `0x2  C20^; dv^$R">d#=$( *YֺV= ,J+kH;m {f%4mRZ5 cr&ټAsC(*̓7԰mdy]bT"8K3ok/٣KM;:ugn FFgJq'@3Fu!Ƅx0dD?Or*tnaX33Kr/7BɧWC ,A gl0!v%r!XP0 TEl:J9XE,~+^rυaƝ={B5:GO}y&${dx2٤ϩgh2y"?=0`0 W `04jdIv/+?Ǝ8m8&y<037kN#eB]<Ō3zVςe|n?zA'?6&D\̇ qJIBk%Zt_4N|.TE}xz?N@1㮾o5m)ȡo]V!jP `0xq2  mXq3슜sQI84(b&rXBZ2_ 4͆3tERgL`0 ^# `[ێXU~,W|"g54==W y9ăj[b!A,7 g.Hg>#i<+.;>`Ց|zs,;$kyAL)DPoN g7JuptpօqN+ :G5Ҫ\X$/N8vbV=l뚬ٰԞ PbсoG42C֐)=KpSmҘ2y~:{B1v.dX?xG3|{FyaMvx:!A IUK+U޲.&n< &d~QMy}{׋S^ zWewPWŢZ"Ϗ9=*cc<B  `[@`0xmҐMێb݋AEܟ@j 2xIp񎰴 [ϲ<=_)^{cZD2[FkAC&:Xd?2mMvQ$ [SZlx7A ䷺U-\6 Q!'TR X& û&.碠wk ~["y;ϱ Y2kK}bI[Pp> Ux?z|{+ , e(&:,$\(O%x%fp2*f I_a^.5)rV$LͶ;^?'DD4uzxxkۥ}XݍeXoʆm:s[_|{ Ï/SԳŵڅv _\/`0  `02nEbaon%^a~Xϐ$CEB)Ȏ Ƒ7w % {aVfGٿ|r!Y J'*:$qcRD^Es'8+vIaz6'J0/ʕx0Ɵne|BU*6m]h?XG1\js*m<~0($<b/=R X_|_EfiZ9m2jùfYkCNEYe`iՍaĞiH`R\.Z=0/h[63Kߡ!{xfټ ܏V;G:*0D++W}!]S\ŋʿkwm^T(rzk"Dec|0 c`0 ^GH3CT.dƂr%ܼxg -!bir]@W$Bg{*Ro:3C bӫ:wd[[f{T*JRk86+IO$jJłvI*0GG0dY_;vcD"V/0e6ogQV:)zҰpMcFE2.ďo)~KQsyT0]LֆvqaPC?R홵\P&$yB d$sj ~1@;Zl^5H!>#ӞQt>CbRQ뙈Ug9+uѢYktqlK^+}a]XxC#B?퓶}ν%u ޒfuwi4~`0 ^# `MـA+F%AW"ODD  <|B@žaeg*,=KoxN46o#=^-VTIpK*gIXBK7]˰Udi3 XM@?oPCJ8ÑU+# 3$p ֤xt*LgbوwP>EưdSX[5oPT+9Zx?z|H֑gȘ[ Vp>7/5% nxIHmVF_eq\pypҩ7,e;=. JLL)bf_WَdiI(󬇉غRЧw+a-viDS3'⽽)ۅZ]?o/g}K[T`K`0 /@`0xa)N7'C !apJő3wKk9!"蕑fh,+o+VzDV+z&Q>R]A 6"N) hf<#HRl`@ќmү& v.&..g2fV[ϖ<bڢ=i679Vi1!d'ǃt%)֪1+Mo17ӖRNs~Woշ_%_~6273.y8ui0N$}])XajfSh FOEfY,Xe VJ9K &>ǝCc} x."d-5UYzH] ۱݋wEG|ƽ|_9wwW +%ݞq`\v5X`0``0 ^bq`Q$n|=,r(0/DFEـ3?? %i!|7‹8-EgȘ"렘 }Q f&Oci=,kH<z4c{A>EXsTc W֡DM%ݳ)xA% 7Io7Va,-9*^eY I6XE5,kdyvJWv~<<({D>/7oc &ĀZ/xp7'd|ܒWukY+$`Fk [ݚ7=sI0]X#,m&?*)C+ 03S߭+\E7"ܦۯ5c*[y{44gjO_WyD]:o KmU܈dEa s `0xm2 # %x<+ q1ȽdvٕDpSz`J9C$f&b 4Ua%d(Bn"xSGmQ'U gf:"L-RgꤋVo0zid8 /}Eȑp8QAyQ#9=Ia& rrL$zh\Dւ0h+>N~m,+JRkWKjD6?%p+ny~ϙt'nPhk0?zV$`BUie2dS(N2Ok&Jjn&`jȨb5k6*/Ӷ vx8bY PT#1aWv֢as)}i88CaàomoMR2&3@ `d0 ]!%,"*s B@-m I(A#&$)jJ@IRF*:5q8#C-I}G'ӸY4wAۃwڋgFLAj;x~M ;e MʢcI*YgeH:e×Q/$E5 Bт)4V"gHî %~uD9q&f_}xĿ?ÇZܥo $Óś$s^./5Tk {c%Ndfv*a*,yfMXӂ|w!||Ȏ~d|ZC絲jh:0@ 햶wNBhz>߻Grs+}?up&o7|57dVz5|YxN vjg 1`0 ~d0 yaܽ^!dl=SI}Cu ʕtIg 'mqH]kuX7tJ\H'GDELɃ T;7:C3>Κ?j g<|!w]dBaU!hHܐT`\cG:jHC<=nll<<^ @,Xa2 1~HiB5~e'kBR3AoC a, W?<"O^K"*ۼqֿ{О]$w\d%qmqcܼP!jQk{hY~I?Iq*vpc%E36$cēQ@z^S3;0)i5vVO`"Sr&#.RƇP&Cy,U)v9m fj^ms@*wˁJpb^).c뇁%~Q[a]4Cةme{bXkLEf:q(8:paf)*n+]#ڬ Rk|]w_ y$yV* XT3U=kv!KK_ح|Thz@-p^#%)FWp:wR' 4Dϐ|KsHӈp^gH#:Zu."_/Ħ%gm5$E0"FQʺwP^+HoH6A9@Vbn6` _}b᠇8ԖaZ&Mjmx!/[,Ip{Or} r I¶ĵ8p2:E˅uDplC~xTsFnZx7X%xKQ>R c8a{2qv-2b#ÐXL 9h@zㄒ`)*9ttK0":nj6A,E+3ݱ?3A~#o3˲^H}Ђ,:aHr)6NZ&CF\,!]TֽOuY_KǺgyxE"M "K8 .4gI:uQͻ PqH QRˢr}_~6ƕ۵7!ǽq}b3D.| LmܬlxNabfd0  `02\x%rJSדTP;au4w<{ ބ$vR0 Z O_H?Q$od5B2zvƑ%:j&vpSYL ݬD b@$IT}U=='IE2}BY7H*}59HBi=#Bi;D Ob\vW09| >uq?/= 'š%#e0pXY/YIoI2 v) .suu|MT!!|·y''p>X?/a=E1Z#eȞ4z`xҬzo>rɌ {eNp#Zlwm5[|O#Wa}1䝊swK'q .7tR;Q7g3nAm`0  `02"9NDD! 1yܢ읬#,'K%wYWĤFfϿRumc!*8 B<0|#\HSd&̮U(!z`.&0PX`^R$sv) Iyt̔K7ANUq J{]r B!qxv-d/$eלo9JW.j8uA;Kٓcڅ/n#&M ۷^)Wy~EL2-6&VMe]Oz&8VH*q.n-5\$_h'Wyׯ)k?d?H;˙dU)|Dӏ@{k1z*d{˒R3S",OY{>s{PD#MoqbUJC~B·Q?P"P8n6 @`0xepXeh"#5TX w2[`2F5.y/"=LvC`0R+LJХĵ8)ZƭVQgzXv uvSqmo=yͶ.J|)RH';? rH_ijr˳ݿZIϺd)/үM<`;(,BxWt?E9lW c-ŧSjS~qpL!nwڻ}opF p?=A? N@5>W prD$0nrl5'G!@zم#J\g`^)R$ y8{=@jr//9:U.rutw˾: dl$tn*l6>u]ЛK#iy;Z.v.ѻtMoi!KyF]^};1oٰSR;Jh,d0  `00{ :@݇p7bw+<% /RHv{R*p[&(SؠO;x\^%PH U5:nE|>S37ʆL:=a.&9!< yGya:O\I=ygd3U* 魱ztV4 ""r2lMN6E/jaYMӘhkPn2r ziHB/Vϖ+rL'sd/2 (kIpS}5">CkVxfu,e]ϥL0*룛OPC3n8#kr yv4 qT ?jB.E9,95[I*c!.E᭹m{{vw[* |[yĆއ_r*,]o[{W4}CVB:/Bmd^i8eKcj>(;}~9VfHmc3z{n-l `zd0 "Hf7nI6w8XC!!QH*8$tTmt: ;xAв"IbBf5[A O[_QrH#IيXg[7Ol.UOEepl:Kjn)oҙlP"Lhk]3h M"MG}%rLʹҫ4i>JB i.Xgw%,*Ÿ)"./G_|G7o})ZC<-R5I%RN=ǓҶܸAú'UwZZWgTi] p\Q*zl! y'a`\[]3M7u[&iS5z*KfQlƐUk`{Rg$'|1"_[k~j8Sy)ׇ-%#RZc뺄ފ؄R77ʛ!L4LC[ 8 ʀZ6D˥f9۟g[3jXΠ7N1HV>uioשߴm+%|nNد.\K!Bޥ C|_ EKZGkNH-kSpJ`00`0 Q:H?cK0lC 'g9k, 60Asy#KAns)b[V3JAS"\2$#oB!z? h&fĽ!n2*hT2nlgwdܤ2#>]Ύ<1](#3,Ɍ Xo qg48_QI ` `0:2ʓ> )}Gܐ7fCQ&7x-Dƪ'x8 xqD*wdŦnW,b '! ֋)//%GBnʃrJw)<(^A_HKIz.asӁS_u`0  `06A&Hyk\T;![fAx=Hss<=̔G804\dzBq SDÜ)0bOΫVcmfuayEx?'Hw'i~P dMrzY]Za9ft?hD3P0-y%}9lg/Z٠de&]L{@XBu 'Yu..*ay>G!y'z7׶v]Mk-Vqb+ٛn{O r5xkmB\X%-o;WK >`06F A^;XX'IF [oBԂ{c$׽ 5ݘ"2)L/lo|d="څN( u䍦Smk8Xtֆ7}\o.ڂnЀ 66*QYߝ_=1zj\<0.63iC;(۞cAԲ%lxv#Q;!V"-8d I0Y#? RӜdegJvx`߈Q+oe~;oG/Շ⟼5* ^?Fn͊ F.AѨNщ!X0RP r.1٫2|SbYq~6t).0Pa.!Ibi#;_x۷?58=4Hն2ڣenjMQͳ|GQx:9"C".cNgdjp6 rCW5#fqϐҡiS̈́S/O}x.iO!>أ@ϲ 3]@&`uoy:\VO|{)4#># nPe3o/KSc~E/fϩ`0 0F `w(ܡ"wFYB<|>zX.AB3QTہB2~ȋ I PqfWQXk'9:E )GwX6@ dA 2 ϧk}e⫇:J#'{! #rvsn A&}>XYc:'IqB2O'zΞ}IRP^x}x-c)*>5 / A咔=nJ4:ÿ=/4]M0f#X1u6ʕ*BȈ3̚IUα28bnvT^G&-fs {k)^"PAK Ý^%N?rCkJn_wHr]BWH_ޚ/6%:e`9.W!v⠳DԀƺa$5tܐآk1 oF n+-Y 9[-2׌# \d Kǖ !|F$qoV(d<-lYv{'ᔇ:PUp'-"U4[4\Uy(8]PM؁aGA`qQD{%O4<nGtK7u5 Z<,ǷݹVij 5ٯfm H܄,[U"1/GS>"([$rPvRZ#ӝyǿ?ŏ/G߾5W9d֥3S 6T^GE06v #[Ӿ':^6(jM wu r=z!-my^'H-Uj\!KS)Y1Lxd`6M߾0$5ƅUơEy-u 0 4UpA/ںaĜm4qj'oy˫"=A.yG*dWCZƥ*ot-:,m-ŵ<?EdbŞC;eԂ8!,O{8;u&nDׯuJ*SCT`0.F !űc;CB42E"%㚍 qngscau37'3e,%t h{B Y;&˲)(8`+?lmˮX}v'QmrO%Sxؗ߾W3=-~!_"9!=܌=˂٦;^ )p$ɫd&$RεRtq=ڼ&=9r^AKm<{26?C06CQ/ &J#WŰwL 6],xO毄:w`0  `02QGhNA7C OBN"Wva~G'"j#1gdHΊܮxuNp2Oy1*uD b%{+B/'`ūF* 1&)t$ʳ5R |VTYH"7 %_b.˲72A<&wHGk"[ ,_Ƣ6a8ݲsX1. !; ^m!A2S¹69&,34%ܾ]쉽w1r XZWA뚛^ʖI.L`yQȳFc=Y ]^Bx%abetyu=y9krpX. 9/am53h@)}{%S˺em۟;Om4(ҚmY->o39! ru=ۃR5Qz8.ŚEޟ]3 @`0xq,o>wdH浅oYd1wVp7JTa)x IzHHjn"V~~bƁriEj vs;!e})=U {p&y^xwIw6P90$W!͢ Ah@ډʈ⊁:֤ya2WvACD5:vWIt ,וpLhTn۴x_7oi(s6krYs2| e.8Njp:vd|R^?;mf 8V8)Lҵ\cq]VnlO;´WZqji0AwL5Î *ozkj֋@ 82Um.joF^G mq=}?e7^>Խ|O3*E>R~WZ}zI_\o{f0 ka`0 ^N\Ik!p$#].$bcQdخk;U`\ϲ$WJW"6ER+QZE %Vk̤fgc,Wne /ݴUx⽃2p)6t9"H.2V*K1/?K+ ἠ3H$0G^X*-fH-KiQkr~X]&rΧgp-n]vΩu1۸ mVz޽'׽~!7X~JD&Jf?Z/jRB3n;0gE(Ę\B: 1-m`0x12  #bJ H9-~Ivc`H)8'ϟd֥YB&V;l XUoy/"jDcأO>(J0[H5^E}ax}^gId3r*eD"WHlOơ7%r[ؙXmz.^C^NX1mBDYaϢuStwKhA1 0`0 / !Q -v%[drƿ9DŽDCf 5$VY<@D%3V{%̝ rw:PyS#ŮBGV{q%|6[T'56+/^Pp!"HJQ!Dd88 }C fܑe~[w1wh=}k_ @ZfjHvE> !dؙ6 d8eqB4 m@8Xc*ޅ*ry A~?e]0K8poܕ ­^ dȀ HQzQ7 P%7WRϪgK Jky :";kef5w8B`S0_G :K)[O8h}]C?:QnwY'M3+] n]×[3rj0í!օe _Z2w^9A\`*7xc#,VvLѮ`0 ~d0 W]~Xq_&gdp'ub&I7A@,ihbUUes _㏞ [:mqaPA qlJr}]v7^n^!,&/c.%5soiZ?sGdR.}zP\u.#kKPXsʀc\ 2P^h5 ;ִ'@ oke4M6]e۝Mqc^=ym{WFQpb ˫3 55dyMBY.mқ,?F `d0 PjT 睑U v{3]c]+ϤXBoUfw YBY! ո%kӮJR"ё06+d#p9"zDHvŅ|OAy0ݿLa@|ƧUocDuwTv IgtGoS&>;,FZgZg # e H /~6ɟ ˃<8kWw mwp9rQbu8-BA$ӂ'ś4oR^ W/ciy8Vv ,9.܄@Ns=1_ 2HRþ)f.Ѽlb'XjVg|7]~XMY#$f` bۻ79M%27={IXxnXs7C CDKos=ZE>CXuϹVR] }Gdz?mKkpn}^ `Zd0  PX?׼N&a 0NJsdpc##7Qzeу%b=}"ƋND5 (ύ-M_IJ7gGhz|ZlLmh^t'v_ K'Φ ;ۈL cLƫ]2E(k7<sÏP9sb'xʣ#3-R m~w髮N/[sߐd9f61Ü5 Ze.R8^Ԏ*QnA˴vcB€= O̿}ke2O z&F|}Y ! F׏(,vA OK .N/E_nM9CguIr"rIzxc-{%!ADwRhgŽn6J,"玣1Kd'rV;̱/O_ïFd P&wbHG<:0!3rZ"=,l197eH! ~xxMANϏyG=`Lrw?-5ᓄsr05GoA&X FgzXֺP]G]ri|;k,l.'N9N2!"P {0*m_ƑFkrV8*5յZ/M< %MD<)̈́Jaت(}~#|}u0j˨Z1/=0rD7g ? P `bd0 F# ym鼼 LFqQŞ8HqNܳ%G&zqv/xmgّ@L?2SPbxF1CArw1D) ӅtF^9`̼+"Ǩwe z!^A8V۬(!uhӪRHإ*!~ɰ#?JqÆ!2y$B"c=)"31.IRzpONS"UٶE ƳN~aLŘťۨF?EOWki0 y Ti9Npd$h/#EnXNnD\m`#KK*FН Qq.CE47P,Q_5sE$csee$]w="D_#͢O!K~dk!pxu_j7D5qO۽;}j\&O濈!a'|WiiY^UB>:\y^wo,/ zb %'m < RJӆֽnמ `bd0 W {K!?J$fTAj/F8 c}IS<MʊtP#v!==(Y; >P`%&ZE^"-xcFa1m֟$S0!#oe﹅0aR~BH:,Qshά qGZ{H0։UQRh0{RBI[vxG \yFSlbf ϛ8aGk%jklMV̼\E_<woΏ7뾊NI!YPR捠a=-kmxaY4,Vvz$-<͸nȩ<>*.k"L-vDO1zpb\4Jk!xଦu*㽮Bw2> s%Ý+U۟2S<=ף¼tU {:ۧG#Sk/Ǎj0Oxr%S-jk6~P7)i!P|meyqpqE3O/V`0 /@`0xe0򹤊+bQcF_ | F6L㪛B;CQTIIlܾ;E(lBBW$YR6p8_cx8₶y$NRld6kegoDoj*5a}.D߾{. wpI XOXJ8=dz#P,^$+qb%qL oR~XyAg~gZډaP6%\Z e"+njcoHg?yA Ie/{ud\v7(TU dj"ʵ&C$ljmlFB8D]pɰB y]_C9Ϣ=Ɗ _oH<+yc +|^qux5KgI(,k 9^NIkT[}.&bgIE4WBc`9(9}^S;hI˜ /Rv.VPr+׋h]ל8Nz^@ !2 7e\۵Ph)`]>s>B:ۣg7yA_]`foW})WdPðvm1%^vS:(LYC$VIrk0 ka`0 ^$^EB\odEYLl4b'y B\ݢȿ$J`W $KYlʛaewNR\#Y/YT6B&3NBQ1Am: GB~e-M-a@ v15f[شE; Pr`KQ"YUCvMYzfp\hRxJs!iX?uKIgz0/ aڧGj$'Z:l*܂9Aan&%xU踶C&$$4_Mևt Ya ba'y Þ O0&{ 9k]] z'LEC^1lNӵQ.r6.)'F8溓u\sߒ_ ֕#d|B{k^ whS0zX Y?)b1Va霭0>7{jL1}Z`H#]< \}8W*r>q,8bC KH)zX33S'FUjաƒ9L SR]kChV`0  `001br2;8(3͟l"= .qvsfAT-bJͮB!u"rLHYd4G2TF!GJ%!aƯb&YOF2zd]7m"E#5oIusX/v؜ĿvO˿?D|}P|YkuhQ\KJAƗ6zy2#צ "[C]hmOm^ZHZ+\z4b!'b\䳘-.?׫,o̻kM5ZJs= q\izZx .=V-/T[f3m#Dy[ +G`h~m++^Mr#.J@eCRrs]7t5]z[{%<;Bӷ3oT/rhB]qP%\m`0 @`0xq\_ovZElU,g:6*'wuF]v ͢Eغ/9~ERƽT5Nv#u_Ec]m퀯qnR'Ϧͩph]I\ Դg?4Vdy.<"@% s! ^uFn_'S=ObQMsjBl9jM1*803:ض.O8ƎiYa%{UQhegfSJ(F>mbX$^ZC6hC1ZiY?aƵٛX`N{_[//(AcuX ^cMwa]J_<,B>oLMrAilok^7b[`s-_r\3/ s[tnɎ n:Db" 󝳽,G8g:gD `0 ^# `p3Е0 g"s d@'':u8JiYHI &t'ﹹ8̸~$y fJe.T\'$޳lC9CJ{ @\5z$bŲ#mJKR&dvu8koζ U^"lTNcHCw$]N#pêE&p$v2 !wLuCHv!PXDns3;˭gIpwBx |4Oq*kjz 0"cO*Hڵ `L"Gx0|E~QᓔE$|`rl|*b!agppCa(&js*QG0lLSakzg[9YXqiԚPw{< ڕ9z_`1WlC. &lWkeGyY(fmE.w-&$ַHaܱmڶ;H~f,;K$YDh4IBaPV_b6E~ aj2!.U `d0 F}$1 _!&)lȵ {2N{X#pHoI5WZnLX gy$9g[$ k{g̐OPo (X>zyѯ*2U4Hc?v<ǀk|&PjPGӒ#^9.@2^Q%Wߣ}1&_8Ex+WAoi|8Ya)b٪q 3 YiMν9M^983[-wv]=\ù挜9/쫀JW3^`N/=؂/8;)5Ck!Z^`2a gvKd2-7ɻ`bdXYNUyp{f𥞨wu%97yw9vߙ]ff嫅ROqny ^Yn/t-xCUm=ij+yϥig3/|b\oSo`0xa2 ˣ" $iN.i_ .,uPLGgNSblNqAϨm|N#^B5hFvm>yV^e7pH4C!d9IV᧊ Y+ɼ_ :\ioWH~4Gk'vWﶷhҐ t+ yҒn(U!!|nrj;v"a'9@L6q"" &8NOߒe۫0 i}9_~"o)JM"=8kI kY 1J':m_pɒsf O<%*tI1 kz&_'wɶ׵ȈB0Qc#oW/2v/c3QlBԆ<bfuP-xXƝ)KRFǥ5ޫ?DŽkkW:cRq1 њ r[0s1 3H1m̀&XӃ 6ϾU8!Wy0 a`0 ^Gd6INI6+IIhlao^a"%\v^9vN=m"@-\"?Sd4] jqcEۑգ UQ碘pkY o}XlUĥbkB:jЖ 8[gYq, VElXdLya9J"mth8*̲٧Y+@DžQ:hNYfi;.~L kZb9W6> _+GM1?~qa&@M>3<pd3"%6G +š F*=ڴ á ϤCG[ZK(yV6Ķ.6"]J\7B_@I)MgXXt54xy.P3BID ib[JR;Ӝc*cٵ=c[SkCSrܼiC;p@ݷ5JmRp !|D1Ւ2!vd|n0 b`0 ^IE"˅)#Q$W؝-w#YFv 5B#'K6E>IjYiw>/ĥc k|\$JR␐f"5Rm D כ( ;(F]5otO^s\D|ua#x WqonH7ϥ:x;(; =b %Ю Fr:v[Q}QG3ܲg  75m%׽R.<;7j"I$SnEcIsP83AǏo;l q# bg+HUC Oae9D;|`[[HZC$e8H#/x@H&:(ګ|3x},-ϝV4&R+)HK2=۸*A5=5ƚ\t]u)<?WˍB)@jk}qw/li@^F1NOMPz'LT zeQ!`z*fbuSs@^Mrm,v0 +a`0 ^EZ.KEl[kp4\mĎpO|;A[z, n F~|.H4iyXO$ d7٫r TɋhCXՙh( <y51&:z&h MHhY& `fq_E@a+ʔ d_GCAQLH$KoQbsaKA'h؆D s+SPg>h"̷X;2AANo߄e+#/p"LpfUjuV%+m[4"]$ (C. BS(G-/R7XdhνUeEXg!Y=+dѼCxWq+sh"LCV͑|rrwx]zP0 ޟM4eywT>&~ɣĀD^kx9j bXkԈz&s\oːiתf&9K DhbpZ<5aC&ń # `k<>I0oiB'a7 9"!,e%Ċ}>9J{g/et!:uVbV \ցrse01xzoý]~SJM57 ?suoy{9ZpXN] `(.y5_!C±M/=:}]:ݷV `d0 H餧R3#*$6FwJ.8|{]C@LodcTM]L" Շ {  nŜ_]&`*Wr' 2x&66H>! :E#7҇D'GxG! ~='*fv 6N-1v pǸðGva.@bl1~;ScRtﻩax'Q@bVI\*l͒9Skc< 7 #o'kHqu#8x ze):UU_#G9rȏrȑ#G`aJÛ2'ōAjv;XyA :InY3 _ty_*Ǖ(Ѡ3uNNa)a?),jAx,2ꅷP_NG! W$m~( % C$=P}ҿ/sR ;;_^F˕ &; *9" RQFg/-ctWآ!JȰ3]2%7Z |o WW$ǣE+Tv,RGUkH~Ŀ?wguʫboY;:i4X=g\|ih\(Wb@”%Z"9`vd00_qk|y\o nSUM=kfMnh;Gprlj8L냕f8'rGOl=8LD45Rƥq>.{~G9rȑ-9rȑ#G~|868($BWD)8'=b)NFP4D:BrDX"ȝW 0cvSMSM EETXxCvIq{M_~YrIV<͋:)$j<,ٖB ~ N\" t^{T@2)8i`4>WBcB>xe׷7 g~":L^59r$7sEnؘ0<=Ět y e>NW`'}פO*YRRqONTS0w5ڲ&rarF'ڥ@B'bfN,fP&Sҫ hY㞋*>66ʝ|{>kK5_[3m(\UZힰmѮDdޯqv=^m*N;(`VEDYJ0 G9rȑ$9rȑ#G~@@"0k#fgdJ X įRͅVH>XD  8D 3'SDՀ~9@j5s̀/( +lZ F&@RgSUNa#7ld@QTDt=ЬtPW#M9?ZK(9F yȔmJ1}ŊDج q]^*j)7L'8R@HPZ\ׄEWQMl0>({G;a qΓ"|Z;G_lk 5}=[LnKy3 ;e?"$;axbR"F?2  B!NX<5'XqyGU]TH'C1=lBFR]rp"nfr)'UF+4Bʴ *R]cK~ CƼ`8Dx$iT,{ic* 2#G9r'!@9rȑ. fcn"~MX̞a+lkWb~\ BžpsS@}> g+uY3耜#|6 Fi zkrfkQTC /XVH:ZlWk6FzSnf}`V>^֏=~{>!>$&?/'L Xbn_t竣7خ~]:34}cD 63jw9rȑ#Gg"9rȑ#G~DEO`.# SÀ &<, F1Rdp np򓙨sDՀq#A",ݴ)Kmՠ\n(P)^}+̆'䔅cH 4hzD~QB^'Oj"Jd_L@`<6a~klUaܹ\ӯDqΫQڍRLYĠmjYBE5%IG,gwZi&-1Va)&(+2u:gG_աO4T$.D V)}#<.D}&E$~^sH45i F5MvߣCx}^D9;;8 bI`5QRb/Gʧ* >G6ī2x抙_ =^Ѷ{B^]@ )VHM=tz{f)2o&Tm{g (3!Rcc*Pef:NEǐ脴Vϫ1=L.CR9rȑ#?Rrȑ#GxpUuƎ (&"? [U!C'vb'*80v":h^@{2V&Ad1LG:SLDG = >AdHG/|KoJ] C)}Q aC KZWH@pFmb#IքGMQKTB̓\Ya+t;- 5.4YBdRcU1WV]_9@ʠ=b@kY7@c4/$ڊg\s@(ǗGrE 71/$Q^׀,x A:`QAdWL!**6xy6dev6BN|'Iv/b]0m/fsWh3+`)}ދ7iɤ!l'2qOd^LY&{)M1궛>kv]z|p KOCVL6rBj/wAbPbWᾞeŹTHec-_ȑ#G9 G9r/fL<J:\aX'`bA'l6dxpPbB9e6ؐt˴LUh] vxowpJӈ,"}j:Ve$Q犌(nG!=FԷ|(c t)@AmTW}]>(B(35mf@v 'EaAH~GE}Y{sr(=!- KF;0$⹣8 s5"A+ޤB.<WᷕH2փ4I*vkE֦(ije ]3:n p꼂Q˭ͨf+<`DMή"d^sBL#1eTH?F5gJoۼ P1R{kz)J06,a;S>& }骨E\<ȇXDgd>";ۗu!rAJ MNUn |xòCѧg\$diI7G9rȑ%9rȑ#G~AI?J Ҧ|" p;(K BDQ@)ʁB]rw?+Q+cuBnbg@nYS TprFXdD#0?@wwQ%Y6NdpUµ37f&_x"3*F.EEBgjРph NZ̡m1(fٻ}"d (-ȸH(#,ֵ,5: զ9`k[>]>XS#ALHuU[#.w$Ǖ(5BߦbJ-c!R5om5rE'=?*E%h>zrB4 3G! ;̕$.`: )-K+k8aI19|;2asj+K{aB,@$x O3]6x;kK/]&j|1P{Ua@}i)3?)~9;J/;!}W=U+G}N 6/9n{׉9rȑ#G!@9rȑ- -븛ݡˆX]lrI4T b +0k [QE'M=4'3z'S6ѝtmѽ5UjS5 `$@G:V[gکlhl=tؑ*~W=pA x>z?b_q"Bs,g,eDaTX$t7b-eW8jzJ9Lh!  _LG,nۙ oz<@=&81fov]Lĝ;+NjЦ[*ૉn.1+@5msYuEH8VcR1a83[wW3y}}rI2T=/E^RE[B~b Fz*b5 ,^K^6} !_Og~o *3gTb^P{hR5kwݙ'c"jU~m}~ķl!**f ?wȑ#Gr#G9ro6Iӟ W[& D$XD5m%*=Sowͷb gX4@{0 !%#& l r}ep5t& 07ZK ڂ_~dxڣztRzފHT2֎4lvfn @_=ђ"r&}H&NJkG2#Ɵf|"{v-`l /.lNG! p"z9f}MI:tL l:0*aj,~| C+{ZMҐZ GM讲v$ p"xEyM[cg8h !?џ2 ^3F*RE3[DòՕ"ʱdfV`c={6s6+sq4_{1Z"EGXFE9^4(\ dpt ߼#@jX -^S0҇+!u¥H PSx@hgcz \}8P$htѦ9!MxM-O?&vzTe=Sy68I<,C/scu>PlX3w2Oy꺩h։H'%Jׂ~ gy:3])#*r J<^ nJ >GТizU4Jxӓ_>  "x18;m涘dD|;Ol}vӎd@Nl ٫Wh̍A%Ml L!!Pr=4p7ZhkhQLVnvlJ 0fr`3bdLbڪM jF--Bmb]]i}J|߻* `X%HzzHp*z"kuӄ価hbO*f)K^,-&,x^}EHgt@=QkNRIe=h)Et6)v2ԳQBi%μ_]{IW8> ])F{$ ;Dt4Y?Q޿CD"AEW/1F~BT +`d'@DIcnW8ԠgdJp.E"S9($":H~`pT12B`ڃD.w_&t{a`eiC}+5ԓ.2Ql5ehJGXmO>#i_Qt`ӇV4\οNiju!yz ~bZ=39rȑ#?Wrȑ#GdH/D b@#ЭAٴw 4P,,c Lۡw@l>DĂS~}W1q'x ;n:R"d60)\/E!` YYvhT+ॱ#:ԫO7Y!/lxpEd$DrS@P *)g8ƢO0D4CyٕdU+7 ~gYa`*S Cl@".}9YlbHdjN|௕u3mǿu??"A8 8ۇ\$F)( CDd5= Px":ZG*r03A4w%LfRdI~~ a_Cgj\ @ KRI=7v&)̿8X̖WL[mUw1*Sf?CƯ t=$`H,22* > 8RMU ۜج騍I ̃ژ<<4S{BH!dM#M;Y?-d4zQx@6E6k~O2Z y k_)]U~?IMx*, ~?xn蒫:L7٢cY054"xFf|~I_:SFYM&V&a.X"z~JC܃e+t[ആb4cfјf1CW\6&s%Hp&K9o]`'T6aD~vgX;uȑ#G9 G9rȏ*?'6X^:v^!]]"ӥ.݀"  lM~DSH9c8J*7&XwڥV~%*VMf0 $#I")v)tdCՊ~B Tё %Vk!hrX!@]1ق=>lMͻmLJ}?ů02.5Ɍx!Q v>Nu+xʔ1} ąK`z ^]609)-XEȔ]JP]Q7?)jqG)*a'q=Qv9J,\N~zfnn@&g";6+KC^0n9~׊&􅽓1N7*<Se״vA^o^V^6M e{mM̗#G9rȏC9rȑ#?\2{֍&Ҕ9hK;0~^2O΢4I57 tJ4X,w+ᡴ\cOT~-Af%W$BZ1Q,y"jrGĉ,jktf^&H_kTljuhѦk7geX;N"q{k(^6]n:aٸyoNE"* z+5̆3"2䐽c9@ā/&Gw4B/k.gbZ^X &=ȿWzJ~ ɣZ== 6V4k"h{['_m4\=D98/θ?AY56d>|t<\ޟi&jsȑ#Gr#G9r'o1]M UfxQ;.@"#۵ ߿bz7#9;wKf R"0Pu7 /eFY0vZK cl`㺁|mFCI{LߒZKcϔ,j/1Ⱦ%p2t+&UC(?$!r9I?SVYQ;?dRP?1V!RG E֜$)ԽJ\w_QC[D3g8sYr3D̤h<"+LY5_#߬0>Sf~iE[Hx2 rG<V3sH<% ST4uRcίjOp|>MWb;>"&zo!0z}9z:rxUg}eMKZQF󈖣!wx2AnEeώ9rȑ#?Frȑ#G`j7P 7PɺS 9P' &!= A:;Ѯf-XQ"@9,5I>V`KT| 72^\X5Qivͱ-pdu ;CVw*Q-J@9h;gۅX1 5uLM'5Z'm' Hv&40}5~F'%B{pщ=sC8d*]]Vj rp+//sٶpcbp1m|A rFp<{5'D "HkeN.wbN]:] u D4V>?;D ~Sf6Z\L Z=pSQHY~E0om>mՠ'eH`6`TV<4cA8G ϻ/$]5)1;o_[qՌ:m;RI6c VX=ub6WҜW XMC*בmyIsm9Cd@/ul :ǩt.7TS9rȑ#?Drȑ#G`ZH2k>c{sAPx)hob@3lDbc Spv?} Q! H"KFTQ~Ygpx +\*k%SaiM#޾T.ȈiK}'ĈTz&`}37wkHue],&Lpuvƈ”R087 = 7 Rd"jV$.:H ح?_N' 8T䏎=/uPZRsWSuG^4T7Bu;B葺#Gބ5F_GqQC;>"IlKt~ $P]d6gT}t_p+~;}WP@YvT T t߶xhacTmvr_}1UszuI>Bks%>kTij ^_'Fҡ8Kcj_mQ>!B?}Mk* 裘>?@@)V>S 9rȑ#G~ȑ#GقK d uD rk@8EUoOPn`rQᓊ6h BmYd`C>hQ&̺6 9rb4xHiY ؇DΚA]Xg$r¢8q^Lr 7xo^!DV)wUZ Uޑ {tJQ{ ȭ*D/a?c@yfKJCd35RI #N_DWz6\9h68-}"^k5 hDUe5md[QSG9rȑ+9rȑ#G~k="+ߒHP8dَ@!r/(|W| ,Mӵr]@+e=w}E&9Db ˲GO2`'D!HVTx|3,(.x BRJTswaEp6IlxEG(%86Q\ --%f @V9LlTϳf%>]38&9Ё˫ ALoۗq[EY)]|[&;$6 $w:̿DEЀM1!ё6NG#b5"n& v&םTTXw^`>ׯw^`>%FZ}oǞ-O]-6Ă{$VjX8q)װ&(J3hݿպc,5o'E؉S9yN!~{9rȑ#?Zrȑ#G`'0`1"cmG Ra|db9H]wr=7cc8wy6(]F-9@sPM06TlJ );vA$z4i.vn[)F9P찅&Rf.E[̢ DK)ҷt)I eArK2e)z1Rm}|znP(CljiEG kD A,5ˆ$RmI ٘Wk2>f~\0U]X_IRnrAg|!w&%qӫjw}HztXMŰiJC߯ `$GJ'ĊwGO@:*,i3?'PbۼO !3^3:07.l]Ei~-%/nbl|Y_tM9RGA-NiӒm ֚QawtT$9λI2 F/-T~ M)*ɮ4EZӑ#G9rg!@9rȑ,Egb` 1 1a !.{Yt=l0F;e錶$xF0\sF]Us,@' `˝:j=ްȌH⦰s}W~'tdr#;R"hb[>Ugjȷ_Bn( 6s춌]P4Zzwb Nb[ opw] =!}Ϣqr:nZL@ >pކޭj~-3?t| u E ȌvwF?J^1 _S ? C1L]t㌝zR@6yfFU(!cW.o#L|jşShͧ+Ӧ-WEem=y^UT#>V>1U2kCLK$ I1|l!+' Շ nR[YDtǚJ*^} A T$`3%g)d]%KKcg5>9rȑ#G~ȑ#G۳q- -.؎@d?ſQQ&yU} )M${o 'Ъ])\iDLF'\42,ADJ 0V(TVj[3=Q2;-0{3B;Uds!aב)3h0HvP(δ(_N$3nk>xv&Q|VțcҀbPNjgpy7 UpLc뿼M{WYʱƟi&4DDux+3oHI򋴸pxz >0JFJDpzC_M\6j $)ܞM!2?"OQҧ\b:f>X_dԠsE,y8,}eK̋hOM};΄UO4g3ٓW9 1b0dVҕ< `6sBg(OGf+ȇ5}fv[ߪ\i6ڦub^C;ю_aF"v*[$ǻ6,2zoLE^ _#IeJ廉2Pwvdˊݯ#S;#w}mJˢ$$nlѳlǶA3KDcp$8l ?&A3 DWZznAJk{zIK$=X8k"_wUn#Q.W$,,lp5%&ڭ;"pϒ言[+DM0`FW2!}z{;>?ψ(T[m&&x.YX |)## ׽&a]S־*zˁ?f֟Q&X:k8PTI}&=rȑ#G89ȑ#G9(V\a[Gi-m78bDQR7mvt~*F(EƱDc$ $ |2auX+F[l<α% Zz% r(b&#&?cY[ЮRO{!K(e0 E}&o?Sm@gUV!UsGut[w$H寙NCE#N" 7flA]bxRrŚ-ԜHY .LJ)!⮹>3-:,܃4VDz$1OE$FK>>N<߂ )G=}ywWb O t9cf -Ӈ"BV1forP x | P]=?E>% A&QN&Vߟ{{ҝG12sBj|o~)'wFp H8,: Lg{{0˽&YCxPNQ~X{p=2݀slo!՞kIfgۜg|HU}:aPEfhߚ>~Sc1H?LFo7NEu;=UP+g#t]SZkQo|Gj/0m6ׇ֊.ԉKs>&UV0&mc,{=dyXH!#?#G9rC9rȑ#?Z8)&Br'4&H; oi"佑 I惷 m c!B'HrK;jQ3GNZœh2<{2SeZyA^@0 8.7=vFG妄l77V`U>]u`?J@cbZ.K1b*ׅ蔪؀y.F xh`#|^f,͏:z?_RVs28髐v;jWWwګ}JCD@nRԃg?R 6`]6`_TEyEzml.EW"-b*G}ĐЈ NM\J$X-<)F9.||Tj}-( CZּ{:N(Yc[StiWYGͤRZ]6['ʃZIvrK"s{[QwĘ21~OjpSD*0wȑ#Gȑ#Gp1RMHv)pOs7u\Aq_@UhF>w #he/\s?eNhDc4 |h$Q y&.T>G#BFZZtuFvVAav"B:o"M5m"$)a4ELD[Dh)U4#8}.&1H>JyQQνgvՑ|V[ v 7 .xQgᑥ? 831r=:' ґ z9#AesGjgF$׽cLɅ -lY^ ggW]ߛyl.7 "3 '#lNa澧OY _<Era ;eM Iл>@?yG*,㔼2 Cj?Mz&3nY?# 2-S ;bE2ܭQI=&KD&?D9ew_LE&o}!Wf$9rȑ#G|9ȑ#G9@ zb7nv}mȐFRz5f'pJ:G#opi;J)4;jS tS d80?Aq?x0aO~^aaYv +B Z4H]} m))[檿"Zws2Z|]RA&$|1qAdz!`*Ҷ)Im+պ; bhw5 F #*"De\L7T~%j|Ċ/`5ֿ3_D)CSLgz{oI+LOu.kHym`w KO,0-̝ ?sdh>;>5WX_ !3ǥe\]HdܝM0;f腴Z/S+EU'4wGز[;_瘗z\ׄjף`qɉ1sAʦ2(zr,l^H2]] _ي/~(|3)!l.M"z4guȑ#Gȑ#G2RT i,RU`NS` ~Fx{<=1e F&rT:Ҥ@H mZO\P-Dk"@CMu(>H߯JQQ' A|_h78hzנv@_aZ,ڀDk\ [2R@^*3~IDI7aؚ]iD\]bHx'ᓱHyow=>~Y,aQ^Hy$!:sׯ rY~o?I9+7׃'<`g$ q#B)r F}yAXuId3ykٵS[luZ(ΧX_D>y,+^n2}<mQ%a}ːտV4,Nh "*bx!ȇ$[!y["\lg-_?c\W|2إJ$Z#2#mc: u=U9rȑ#G~ȑ#Gy'DV"~OA!|9`ijD¶0?>(N ;K5< iUIB"wJ@*QK)JSb5|%2,?mZ_G A N;¢F0M֧$ "F8a 3֜r&9I(+;U֎` [ͅ:4~].j?{^e&`[,谥k;&hHtZjQ @SNVW%^Ҏ ?6qN9rȑ#?Prȑ#Gd&<"0X!V|e~];0t>%ءSY٘ #JLGKaMPYKt`pKD  {!P)l _#b̟*riS1嶁 >g7wȧ #}>#ܴ(s7aw=(hL6Ky`:(׶H5>/O% b* wظ 8m p[56>>yw7V\㔀C|iy-W\\[  Df`}Cnbb0e@mLtF!.CsUH H.ھ:)سf^i @_ԯv( ;;՟ `X'c lOb`yFC4Е[} *.f}.vV>*=_?7ue[ ?Ѷn0pޙ3@Wo&+uH3(_;M\MT#* zS7 ȉ&#thzٟUD(D`@D+(ΗP"p5QW9MO cȭzs7$4|r}utП|;g>QY~lnu9w]z`9ʛJE FyT8<ȤvS>8_kjf65m0ޜKS+ EƤNmZH1_*ܵI"˒iwG9rȑ*9rȑ#G~@Ö[q@ZA"Cm#] 4l~RSoi1`a';`zl׍8#}jPs@VoON X`bL7ЙaxkfW~cKVLthꈎ WvEA1HV8 \ ޵!:x/P$+@"(?QyF I?ȜW36- _OOό5:ʁC-c6T y>\ӻ8>jV0/?Dz'4f/fx"z&lb%LC&ψ#G9rȏC9rȑ# $֮vwY  "JB P 'H?lhh翕ait`z uT)92~P/o]<^ƹ5% 9iG,NU@XG=PzE( #n̛#0kp<;Kefq=&q9{~vEr"Dn4#XnER{4[kkUH`st0s {ü'e=JExm&A`KAr;;WwȜGtM$`cf|DUY* CO]0MIղ^k !E1-Kj0؇s*xm|10rZ:i=ޤk=c?V) C+KUzU(I\uGDI:@"1AUhN|. kɼ]1䍬'Ar-v%K}.mԏe 9PE9rȑ#G~ȑ#G"fbRGwr%Hw ~EIP˽EqoAo24Q:W[4`I#-CP1@TE{U>bkŊ|Hi,_R[YNqUKt]9ZPՁC4 Zw"b! 2l=&WB] +uHG1"&b@}saI2EF>bpҳҨ)Vķh&lryKOߘft`Gm WDuwwXo3r磌/3 ќH>| ˴tXS*7،(!ACL$<- yOblt{U3\DžbQ`?WM+|1BX3C&^3IYvu##& _Kʔ:c6Sv'.V$^as;yw>cO۫R~AgZj)iKer;șcכ|bB۱IV%3OY5dZ7 X.Fxp-D"&eÚ袚gʈRdFZ}H8 G9r9ȑ#G9%W`! Ѯ~`=H+"س(,T 1P*Ml;I$Nb̧Ε}+4`! wFmdpP:,)zqvOT-0r)-(JROكi"fd[:0ʫX)E=EN_ s @.^]z{kVwg&&Xx }k:v&D>n#\+ag +p ;+}|e zAH VnX*1`|`T(؈d?BxE?(Bu!} ~C2Q/%PxZ)S^߫ "Qњܫ]ꚝO CAzf}>_!$]>|xpfځfGD~ "A/?&Ijz 4Cq{5oQWI|kod x;b%r$1KN?f#Jj+5Q)mU͹Mr;"*w䗨5h)COxjGbz_ܱuɡ1YDs9>~Jy0e"tI3pe壾9ƽtwP|><+5Skv۳858~_U2ǭG1?bR$Ye`!#$wTnR$#흂'WYFi<ɳٷVw rk&tsYf3'n})׮ke;w#BߔǡpYڛiѕBvb{޻#A^8 ҃X=$A>/ΒJ$z<_G8.Ka-.nkBƮ~i*~`3 ^-FOFsY㌊x~Za{!6ۮ!'X5"A\RDcL1Դ" 0bZbRsH!sS`Ţ1h;[k^Gb:ftD 5iN`;a}}NAr z:rȑ#GP9ȑ#G9~s?@gl+^! Pj}#XzOP<#DJDܘ|='U#SۈB)LLINxJ4I5oB}"1½BYS_/|Ub;NG+ќ,1hwlYm0Mx[(9حdIPJ-TMk!ؿ1>ĺ׷,)0*|E0A5e5Hx}GsDti3[h{3nrC uD_+ƚ=Zd:=x=9g\\3뜷ӆ|>61d3B IRڹ9fm zywlufⲿ604I[q)=78mm&a2U73ΚVD9rȑ#?Irȑ#Gdoɚ.v  ݇ h&cfND#+_.ׄw/ۮ]M \@X#  ݻa;D&g/3˶"@P%HĚ=լ <~j )ǛY@fsw ?b>&sX *\ORmrZ{GsV̮b[$W,W x͌qȒZcdT>M@.xO>(Q1cd4("8[35NĔ]#c4>.?C6o ?)};F?"E7 CA\"F{2zӋx7'XiZ 3ƛW;@|OL*b˯+fm66SGb0} T7!_ ;"J>p1@99+óѝ$.H2D{-R|s% }7mf2j\G1kC̃o5qYfHaIL?UoXCh=_͗9y vG:h}&7PnC R`_Sr4r;W˺jI2KYpBhNF8I# .=ns=s6@{Q-->j }^.~l9{ UR!*#>u$FbSm15/պUCT oZwj!Bw DH>< 7*TgQ>SDiI23 Mƿ3Yψƍ`W/ S-+st$FRX)-\x7NҸz{Ӹ>etS&tWz_!/caj HA|9HD89lu$S86F׾PJW9x*ځcJ)TI|%YkHv"2{!M5I Fsȑ#GQr#G9rKڀ/ .SiY0湘\Y@m@7 $"܎HAT},u\_1PpVev'#]ĪEӲoL_ϝ֚MB;s"%\va"WGzbzK .jlBf@ B56A{{?t[ߐ-/oL{CΏs@USY?1:~PoQT*`SՁ/7}:t 2T7gD ]'/&+KQ Ϥ10Gʼnf^,F)csO[.&ڮ&"t12& 'Fhȉ2ќg@:%:ȑ#G9 G9rON,vN1d1K@^,- 8}a.CܻeP!Ff(m[]JNfH%Q論fQ@A w+Xt5A 5 X JkF)ٶSjo_#  (+͋HrrDis8W'bn;U:xTgRqfHդbH RKD|71_G&$pWp[*ܵ*dV}[3w;b-Dn&fHx?^WGD).\N"bZ,I{MDH OG0}: :$!e@qĆF-,2{NDLk1`63yU$O#Aʚv仸y@G$%$2'7/ άD/})ҁ nl{A9V^172Pp~r&0@ԫj\L;"HlA%ɢ^I8gʌOjW} 0;rȑ#G09ȑ#G9,r!B'e҅-*G;| xB38aL^5 *ɘ?7s`g&iBpM /t'܍`NfAм"]en/"8o YV8>RR.+^M>W wȇyZt2nXWivwLt31n(Enɵ}HU5 ԑmUN) Y/CL;bǢXlL8<wsz )HL?tgyt''bql#Uvy}~~{T0I R-@S\5u?-58ypDb"97RT墹_Lt1 vq}'i 7bYfPiidO%ȋOQ|4"TRז6؉0RH˵r寣#Aa:A%p +'J aX";7Q soD(=)AcB 8_?|rਟ)gWv;w+Sf{Y22<ˡ&1iCͅD٭N* VZ56LSaXL?$"^>:a-R?hPL{aDͯ^_%Փ?rȑ#G,9ȑ#G9,EIa5(bOQ~CP 20<+jxZgBL$W`$eW`D.]"¥Fw{8Z,PL!2Ug޸;x]|$j.Ni[3`]KXR1Q S(:h_ ^ [!֙DA!ꦨ*|wEouJ9~=)6ֵ^\}kj^τ;dgc>ۖz?--;Q)L!sOw<_)J $1(  T<־;zj\9ށ5]ňݰ}OKmq(+DmIJ|r+#-:xHgJķ3f^qD2}4K͊6JCtkV  k#B0^kJ+Y' aEpo '94[s5百?f;\yO}7Qvm=rȑ#G,9ȑ#G9)3Bo~6~vp2o=PnPh܃KSK1D{]ʮj)jb?f7{ v^m7s!g~l&L(VGɔ2m_$+_w!^cW]P;EH)'l Lv!檅2~L+̮2!!V$kO6CG=.p ` :ުFm#N`G|4I?$mw _k33ɏ񏹪i߱3zD޷J֥ӄfR a5e4ė$;V5! r٬H)([+TD0mJae a򦾙5᫾L 'cg9b [I2# N( d !~hd#G9r!@9rȑ,7fHdhוڭ)iJ@%(1,7Y+Ip7 h70Ȁ0f(=>jˤjRHݢd8N01$#vNhkXa6d6 ie{QsG/NUQSmQքQ=Fewt('"IM3AKF݋|9iv1֣o 鄟d،X^fs­Z,߬O_'{Q ڐn٫:Fi P>3pc!gjI/_QtL(w+z_! R:<~q&OΛ\cFpp(օ;C+}gj֘='h(F'ma# "b OɋQ>><ĈTC_y)ټW0JdݜI;>v3 IgvRDL`*;~zAT T\u]ψ+LX4ȄXz-3t}Z-jșjDHaZ>T9rȑ#?Hrȑ#Gd1<@0Bz JVIB6wm4z(SANPWm_+F~4av K{2_l}A>Sv]cREwZNƠem5b{AxY~7K#G9rg!@9rȑ. qyJ}__[xd5uB82 LeSȓ;!.t^H ÐPQNKKKwflJ}CivE!8h B]kZ ͎)Z̨aO< W=!;w;=f'%{Bh4P;+,%@iisb˸*g24cAwo`3lg۾{L=eb<dqxrWkhn_Oa^sog=)?1)`[g9e˳QuZGPD8ңCVEf Vw DcYI0p?EtXqHN7cb,DyE&5$*#q Cx42IU<&/5_ùD>S>j0[!::簎!A4g[!뻘$D~2a}>|r~^idD纓sJ|8 7YR~+wF?| #Z-0w;َ[g+N쌓.Z+K_#G9rȏC9rȑ#?Z*&Քy IFK R:D4W  Db%OJ #!G+B@s`~˪*lp䫁%)`!f71QRjS:ؖD+ΰ&b!S yn&8a?*!ld "^d] &6ZmBa$tO+VK):ay=l00^zaq 8Po>t?JY[9?Fg}?REٹml,~*TDN?騚HBbYrCU]=i%XG -J8l{Ƶ?fO¼s>ɬ1>L^dx_\$r&jJEלPs6JT۫6#_0 쒻u_XWWd*;Gҗ0+Tc̝8;d}G9rȑ r#G9rG J4"ps'n@?5pV #9j .iIJ-tCV4.9z3co@:$څv~i[.а0*oldaco- :[oLK06`~>PehKJY'HvTv{ަIgBX^7H w l7^7..c8&?%G?Ug^+19A*~뛞>NGMN~>‡* 0 |rݮ&yQ>8HwTG+#8 ,y <~.+PKlPaOrրz%e1> ĨV#4hxҖ`BRp bT3R2;:H(MxwtI5a&@! ru+"\8rMԚq "0j GNi&4e ڞd -B"cRyƐZOI~s6\h"JwZ 6hG Dn::rȑ#G09ȑ#G9ϣl`(0yq&_*UiHk)|@Ttq0)P<93p|;G,ʳ'E :VOt̛lj5sM #[LgA"P^5iRT4 HNH&N{|L{@ٮ--}گd1~"Sr} & [1m]X14QAXc lv,\=qG_r9>>Uq_ f=~Gv>]`<3A^RCY *D~eNu92rR` +D<r䈱i"o6ؖBjm5u*(I*0MbwCQis'iZXȂ챉"^N>܌BcM]6HFl4p) f.ӈ$ ɑ""hmq ߺ&3?}7BBVƧSD}C-v62ZKDQ\ }kn}>bci_LNou&*@jAR䗟^|U(9w8pHa/~JOtH\)6ljnNM: ׊ҢzC#6)K.'R?p!Ȑ׫4S(cl MĐh16kp2u^0v/BC;V=Igv  و _kHrϪgp+k#գvd槫Y3qvEKG9rȑ/9rȑ#G~ p# H[DP˞3j-o r6Г@Uu@,I(gb z! I> =-a1yb$`]Ƶt5pxj1Uٿa`~AIn8Zz˅xԮARO@4x ,nShRct'ItΉgw[y`:zvOo?U\Vϥӳ:5%3M3;@d5輂ȏ9 voE=!Mn_sF#6;A Y4=g<}gި^_{=֍{dFrd +z\w.׽_ Bs 'JC5(Cr#7˸is[>|֩waE묈 GP:Ӂ+g;}@qθJu6֐Y7t~}>f AOPq` # f'q&4b75Z4 P3IXՂ2t~yR 0aL[vo$&q8P\C5ykk-ϐMn_cEX$V9#&6pR'L?7 >*7 sMSp%Erwby*f9kZۘ힕U{9n!)}wڌze9 [Euʩ SjEoM[E;Zv,BU,7pʿA@!Ap{JPg}]OqV iRY$V`n "FDd^ҹ}Շ!vWmlȗG}=aNCϋFoLEޯgfoſ?g_Ő Yt527<̿1\P'CkNuռ{1sFQo](T8p,t! +J 0krڊטʌ@%  kb٢vyȑ#GQr#G9ro _K*  d;:z +6>G xQ_7| j4B* ܙ$)0/NWAmL7gL9jUu;-#Ak3p]>EQde`4QC%y$ K<~9c5Lko3Y<Mח ݐ|NХrKǻI\Xjz SYg$V.gn&2E,k]i|~oq7_$£Q3Ւ>`$!aLRZ@!_E?  .{-Oݢǰ0p{MLiB"-dA/7*MdA! \KE}TWъh;95} ڢ3.t]< ư>|8;OC"l.#:#yNI=aG=jᴜ٩Yt#8ۯt_1:qvUS?*L_I 2BMZ!w_-bICӢAW] VL]:l`=m5@d(f23Gp1'1@pCX Tn+}Ffǿz3ie=% l=PiHBHJeD?̴'./VL(zc5IzTp^.ȱ69rKcէl7׃RHmoȑ#G9 G9r!` (BNE"+F ]-BNd0dؚ|{[^K@!1,)$&)  )_kg5!J[5wQgxe/'U\Z U8dV))W??xGHfĐ:Gk]<f c}~*ZN9.nC$` 11WѶ!\BDxQ:6`C|-ݍml,r Ef|H :Ik ZtN>_Aq?_/lG dz}9\~p NldK]#u$S4k6MOvz(5 OkFmIC(w>D@5nWXo42lK- H2@5'J+ 02[~C7`(թ(# ƒ)#Ak:uZso4u*Oȑ#G9 G9rO~kzݡF U|58IbZ@Q 4TP甁Ƴ~v2F AZzę6fTλ]#2D 0Za92h!*n /<#ԁtXy 6ܮ>tV!&VcvX 5gwRPZ }߿cg n0`[$(K"7KYX|So}Vnsw? s5I2y>9g9){{ߔQo ~^]m_;x_ JirC`̟k;E"G IwzzQj[RJ "'9Urp_?/` Gz"0*M7_<}x7wb 4}4A*/>RX(`Y3fOzg4z5"?RRa"t~_IjW1[dq-g]p\0_K萲U^S͛U9rȑ#G~ȑ#G R6A"~KSD0E b + 1Q:gđX*g ZzTvc׿dtrLJm,%pWhKBrRpTn4hKcQ-6=;S pzFbhN1d*1 {&w^69/x;? DC-i51/DG_֧V[y6#6*c^UDA9^;c akYf":9h/bs^ɬlcq|cH8*ln19rȑ#G9ȑ#G9j_*X&yQYKvvl.ٵk9L~$뻒ؼf+)B\6JGvf>="R$2TLy"&ASpG]k_ldc3#7|q\t Eh?q9<.A&Dx!sGxHwacDe A`>軻cHֽO/Cv??E28rR#D,M߹?O=q\QC3>Edpf}Fۈm Hb$Ɏ}:x-'FzGXa-Nup<9M b{~39rȑ#?Nrȑ#GdY;VZC>DgmH.) -w[z *ܥJ28\D҉U7 nߚH? <5u87z_ 4vaEe!{ï#K kw=mIrhhEc&JRJpKI9K^SNfDiBlNtijXa$\}6""32 1@s_-*XUBחk\{}9~˹)USf}_>? ~4&7q #q˪A`Zlp]O=zx蹾ץ(fRQ6V)tB&Z핊L0.dh&)q8>v`6̼MR~? -ʼ@j/k:)ot_FE7}hWagB'^,cD9 XӉ 2!gAs~!̥fXG9rϗC9rȑ#?\#v͚ωp"BKA + @oDhEZ\DpOk r D(=l8> RliZM1[C4y 3)-5rWZn>IAP|Vn+Ɇ' | ' KòOWTU>sײKIl-4 o-C ˄}+oψ~Y[pTe?~3kPgzn[󠪹nF; J!%.7HHHAom_ d&$w$vt>Q|cT=UOc̵;}XkZs1cVym̍h(!9U-=~I'+@ RnwsDl )nI4,JDme/+n. ]lV$hoo5 mR%aC1~G埖FQiA *Ї0݈3ƌ+t[AL1INv3x֫^q@F(j(c8hmg4RTs,޻窾AVVA#ᅵȃ ######,֬2Y+ȜI 1D@j!J.ɒtB )!' 4V\H[^ nX7\)Y嶸ޛeM^1p/]X>n1h0zhpr;t{vDo<75ӄMc`,\D+4?hu19ŕ.n0?Q"rάKZ^'^ Ws_'Z$]c^ `Sr\U+;2n,SR<{nEGnKr.TSCL;Fߟņ=~U$;Aʗk U,IK7towxD7֮^.ȫF狅A^O x[[QXMv5!4^k0*NUZhҶ3&XK)ou414!L8Wuk'0RSI(al4[1,Te"U1<0f7>sYݰ$i}7}ddddddeG%_u | xĆ8b);)!y ߐ7sq;, ,3OAg @q7)My[CD@I',|1YNH.\7eY/B+L89Hc49߬@B)@h!F㩕ctZ͛FD* Q% k>CiF]*⣤]nj[ў,5*K uZ;',H[-wnk>#d陬:,njMȂ΃}H/KWU +vk5PC7#=4IEw;(Aš ڐ57 #'+${%:,a kwVȝ\~K0*4-z#######"C<+4H$ a@+!k*~M7.cYQV @ ߭ L'HuȲ#\~]ITU-`UҶhKi Y$T]t(zۄA$ʅw&pU_(4A9JsZTo+)V/u3`e 5j4KM/] I_4"}a\7mCwJ<kpy 2R*7S} PS PX>J% ĖQ➏kz[a}5ɵ+"eUc~}'Anxpsdqu|ߊ@tG>td~n+H -I<[F/cˍyӂ-72Xِ|V/Cdf{tV NʒgRI B ϱacZm}vQ^b<;c*MAz%]woнPQYpy; `y+K#BI\mR,+D&@\EsjJQIUG~,u%vzwW"z[]WK|$~/.tZPejST#}N\Rʂ+*jn >fX`ձK|r"i'4 Dx^b÷-6 =4?olS䷛+ρ{*@AF{} 1XIoz M8di5.i"?.+c@ ,b$+g!NZcԎz6*q\#1^7Ե4& ]^cUx.@߉M[׊:6˦ܼ)M;V(ƁK ܮٟކTWCH)t{ [ [S$)! F_SpkWX-ވ`/N%l~;Ei9n6fxbJ~̅S!ގ=^>/}C>RZ}{k=|ʳ;\0pӮdgimRx\q0ḱUXL[봜\&$ '<&;ڒTs%Uo1$1IY6D^AH$5222222x2#dT# ,7-oVjVBg4%pHkB 2a8A* w O U)+sDlR%j K$`P=
u-H-˿_oWHvX"@9Ux_֭yZ[>2OUd$/GR p!q OO&Vd<0lJ#.1id%o8mV'J*Y0cABSQx'/IqT.:Avx(Ymʲ4EE؁M=JhwrwlaiKDA5k"E{ :rU,ۉ8222222 ######. w5nHZ>+@$4>L3"Y` + F*"W`x]po[Ea+bG&ŀq 1 ,TZKIKPs(mfK=e%xd'A? WtЊ0Ya`F{M0VX6@tIԒaݯRZG9"^@`-G)R1qҸ.OTk7'җrIĸ҆Vޫڔ$I,y4S]GNYmZ ||YG8H_(k8ҳϣDCC_fl;m+rnv94Dwk0T$IxT{$ː,3Hړp@Jǣ|ymR떛7}߯,.Yq<Ҳ,x Ӆ\4 Θ6&ޣN{m0yWk4jOagЌcFXu9 Ɣf?ScqieѶ8jHuGq####### C<t[=q3`r t(|n7«b%)^fMAV"m֏@Er[f`H/I"M~/?όlׂ[-ϟyNC[I)rY{!WLYEL,@H4s@vdmVW@'8dCrж0v$B9 4J' `V96l l% Nsq?LG0Z="nxYǚÍˉzӒT lps5,6jxΥ7 ІˡM0qӑZ֗!/@l9'uV/|GvVJhq߬wYŶR542@mc>43ut?k >trc;bynWpt^N:0!WZ {l9[b,]]#vXXSloa~n;ž[1 yą#m6uڬiW*s4Q:Ny0|Ј{oXO[,7d'{W5o:RA, {.&_ؿbd/U|htoR߂/K+/C<q5q&H .PH'a (*@gp$rwYo! ʗ| H+()(`yûL\k:syad@y0% NTK p&8 3 D2#_Ԓ:-kwdddddd1eM"~"^߼H/u~C _#%~H9LoFU)AP(r[%'JMr- /c06~Q- 0*c{,jjTVe "@iIIF"A4v",~WqgWcX\!qŴ1"5NS&Y5Knbm3f  4˩WX-k}DmykߑIM.l]Itږ)kίk0\pW$a{J>uozKتӣxI{<@.N0lN2AN d/6,1fjD2.e 4:X`~%aFZP yn?ibU!B,'-|]%` 8ϩ"R d1؈M֚UNզ71qJ\qvfQP.H2-ct[MM;KOB-8Un~п;b;dddddddeBW\# x)lW6KB6TNK I e4Zvq_QYF"k{$J`*Iؤt8.xqb)3nW?X(@?*WE~E>9?n?wI?-}Վ$InV.(Mסt*BVCl!`ṵ/‚QJh:&IYDikڭsjEu\$iјZk3AЭ&.dܸ jO_z2fȩM'3QڪbB{ow$Kpr@z{4C̐L4Ŝ8)-X-O{Xhc$xk i?;7$cA5}dddddd1eGP7BeI 8*6DWqBٺlj݂%Rd\`[(nPUةRW wSiuI4X( 1iYKbRe`]S]oO74Aà5LK9LP]75ƾjS`O!wD ɥ^R~pB1uOsNK&:݄VTׄOӜT|R%hq5;5g>𔸕ߔ&k pw9olͧ)ia w_(`LEIRנl^͜'j2{|1ZSoO˞ (b.f W(|fK++kcgx.?gN,54iY|E"&lj/5k gUjZSү,<\ȣ ######,~V,YB q_:H@'{ TPMyn&) WtG1A~5Orz&-=ߚ p^@e >Z FH0kvH:AͶNnVi P.w5.YwX0e[oٞVBIޓ Js_'Rw~}o믽Ż\rc'-.-@zdӃ<1H}h»ؾ3"EF{Ȼ|+ߖOY?6j$LJ) @vDoB{Tgز,cQU~NK=楆1#ncF1=sBνq. ?׽8F~r~n[Jޔ)1lEk7 5߅xX######/C<72|,3^ N yu{Z>9m>PyA(Hs]Eš D/yȰs>Vb[eQE62I닙ebܮ[Ϟr/=,?U*,:rP?# HJNDd!~ mA>ĖK~]ޗɏroJ=s[rmUDDsߤwVg#ܷЊ YFF=Tr^] }وTx'ካMuEX2%VŃ6!E5=YFG0U;ػGFFFFFFBy`!<"a K k Ϩ64Eu/hQ̩KƖ 'ݚ%|ui|_G籶q!k{%6H9a'=*뾶pf_K 4_WWͅV՞ݖrH'? r< B;- c7 SN51~"PjÒvb)!}ώիy{K8 WN1D_eB^4w6N1_-Ήݥ;# ->\FZ'nw;ɝFQd V1rpl/ʻB'vF(ɪY#xi:I]~2yw҃ցu'r?Eg_A]Xo{`8>dnq[piw kۉ4lןTp&t۽ Ѐ{bϽL)d􌉃KucIuC1XR@H[{T2&7~cޝ-mެE^;VaTz.ͯ"z[$r[CN׭p< Bΰaz^}OiU/[m&'g7g*s2zw̰(@/wn2%߹،A-VP"c#!W$ HnR8.,B}M4{;>e04ϓHB~zlefQ.ԏl:/Zѷ%f4_b V.TN-Q\Ҥ>@a[zlPk72R^q^a SEYW.Ƒ!@FFFFFFZeMr j40 L!UcDQ@95{I55,,Yo53] NEW*4X,>ѫx "ph [k֌],q`>KAL`ڑ@&N (,Lh[+!tQL@{m 0HsE/xm4BV[@W]$G\A):^ߴgɘȲR~Ƅ-[GTׯwX~j>\l/W/IΕS_ gqgUNd1J=9| #c|#U꽄7;_/Ѷ wRĸʍŌӡEPT\LEL$:J.g\K\5"ܛP;Bx8˛RֆW":]w~,ۘ`j|^A`D/e9'+d FFFFFFFAy`pThDcƊ1r <Dq,onI-Ppe hf UwKp+O3ژ+wOBK,.VVS&tgOR7YJL0 [ )}X@<&ȳZ /<u/@(C+$ūk#ʳ4h40\ <7IP~RyLNuΜ;])˹;eI\+QVKS]Ҭ@. wZk?3e)vUOmE\RX, 0\rI!A`s_3N`HXo6&F Ax7gܟޯ,RFKs .6(7M8XGcJ'qZQVVnmC|U(독@UGjjݯ)k"ŬvX,a`XHYgdZ젠mly52222222][@H%z+AT"$tIڀt%WdxJ@/b[Ud<(ET0Mq v97\Zg_{a< S{*[a١y+uh6A_. OZs\k\MЍ>S\RoXW{듼J`- τҁu4bs |mhmIu LJq}y :owiU4&Av (d?o*?K+f)wG;Ѡ= jQh,.4+.ARxOgh |Vz_ypE}R1nD"h4 SW4׵T[OzR9Nm93rȣ ######$\-R&x V1 ӚFj#@FˇzPR}o-%x!WKE%|N+J  \q (HV\du]W`HZAO"ADZLBUC$*\Zt}k\T׫U/?3 ¯U A$p~MW@=60*2Yu M,j-3ttm$`1˼3 Te4mFw˜jUe̖v[ߗvD"v r|n; NbM~X"| +8KLtΛp|)gY)la4\+j^Ä@Z:P͎eȢzqK)e0N$OpuFh/2-HX*0mO)안 2222222$QHcE K-]V@28l: ‹lvPL64-t_^FH l5Vj&#OD@4X*[bܮ+ō7Md%^^ A)p0.>43U@q9kD*D2-rV_ڟEts+1Nہ:ȈOE S7Awvz,}jk`YwsyUk5ڝlI9l'ec{I'|dIM@ 8I q{?}OK/Ax{~Y6K?g]?r-%pդ} @{QY)*Y\W{/$APgmuI+܋gaWm@$-wz!NTNCpjA7N|YL|!1 p֪<(}-뿧uw E|dL(w?~?~]yU$ae[T -cRC ?>,-ANX࠰/|LBWv $ۣ6(46vEs G@7n9{Y.(\b ,xRjS?$D sߤ ^= m Ӳy@dddddd S`;A<?[(PʄH6 브"nYx-VR"@@b.Rca.OUZA}@ Q-T%_YwWC\[ NC;ᷛ VB|լ@v9HDW|y̱s\/ @"VY9иӳ ǒ>WMx~ ](Uˋ69`{ _ qo4<0]UJ[l]m[KgyΫb3-A1Au˫M{,<{w{?ʟ~W^1uf+?jlKAY֬Pe ]-b%2 ,HY#bOrʗ.$HkZ" M*Ot kiQˠPԵ$J*_8MnBSlei.!@FFFFFFYn# +_OE`ӭY|n %*AJCWc?&$X%W9ap7(v5n @:r2m#AaK0no Ƭ;Ȩ4-rvV +&e r25S0@ 3[x@S -P:=Xc$PjYc"] s;D\& #Dk%et-@:}(ۀʪnqk& LdՃ-_VClaoJ*\4 aRGjUV0˔,zJo|AzX:<=sᆵᅭɾ4L zREoاvI#c&lR+R[l"AR2R9,袃uV%Y!* M]ߩlsqIpF+JckA48Z,@#######,C<( R~36~HBUC@|J"?1Ad6/3nY-9{;7 r==p{O~ߏ^Zn 1a} 0n/ DR3w։}:~"WqJ㒄}P3BiRGtEg< KV,I 3r4/5Ү "A7KW:C!4NZDNInk=rv?{k\0!A d9gb|Y-=^ދ [y.Lbd[^(2ܿs5ENޞg3zU[uv*KY[s"WBc67x[ꋟ7ǁGrVgs"ȅHj$l˃Do ("~/=,73Wfhd׌1<·gjĊ#úrR|'lUqvr/U!u";Fȕ:J+͸^~GP I$&ȫ||g2K;wi\/_X pW @p"`7; *^"a@7Py "I81[]$nZۨ׃IR%.k *6E`)JETʎj[+U.x5|"?yۗz*f?Â꩓~7"9UP~@B~וe̥/zL ؏Pk'`}Ъ4םҥ"4_bF齦 a%{泅xӵmiL;ț{Q{JU+}?7w,~~hٰɲ2a 8ŲEef2YmHM액dvH/D0n .q 5?2n`..4_ Z{~G!@FFFFFFH.T wRBIq!CxHǭMw◒;Jr9c8@nHa`_YOݤ*?jd lWፐkmzliVl-ub%h!NXC0٫ O_[ҦŽop?o<z vc44OH57襾Wi<[Wtk&lBjla}9FjEc$S2H 1p,p,^M'$KiF}HK>Mױz c9j- *6w(ff$#######-C'\Ñpa=*CGG2u̍S]nk@a vȅ"k#l*puXb6p!j -\;DNp} ӏ.KJK?јy`ٯ7?};O~q/??ln \Xu&—pT~I ?@h ~*qXҲ;[$JY涠D|HgK\סmv`#Vʍ-z?1u2V 2YII/ &eu$_MI#bY~p:@yˀ{% J%[Ѝ< 222222`J=T ]aS=fUDS?K|Е[=v@btI2)caђ m"nٿ+C? @-/m#zR kbćtxn^_{noNz0n|Q7dEeoqFszӍ =ZyKTŵhS,,'BVpIW[ǞDP{[&gZ=ʲjz_ܕHV'\YiRr&~&eb)+/X8z6?)a8ߙp>֍E,Aq( B#(z-W+qddddddAeGd7{c&.Irtp7 O 5JBM&7|fF`R푎o&ƑFX7zA& @VmJnJI.! eM pՒvg-ug >숾|Yd'?w~epH$ԑr{ w?xрt@?y]Zͪj- ,n^k"=J\`ZھQ .qByy;hnr&)zKR_o $Hs{dAI|b'&^ xmKj!ؐI4A nȢ;|ZUD4)IE*Hm'$|+/*"m@kܑsBʕU0ґH">1 :J f cÅVVD~.#*uSIo_XXs`f9!F~A~C%/7b#&B/Ǝ6 @&pX϶/R% |--2y m<`qZ3![ Eb7ۏM\=»`W~pj[yrRV r\,7 ۩+ =]|BG-ӈR"vtl&rofZזNGg76DNjRHGg_;..ƯﵜOoI$:,<4|^-Zʖ.7j:&Gg2snWQ&Zܟb_e: 4\ h`|yʲmN<9T#⤞YnY#,;P)at,ˠFb -&vG!@FFFFFFZ otɺ3*e~fVFE[L* FUJuw bvM(aV52@D %SdOP>ؑpԴnL\[y1\@$0H%R=*bFMql/)ޯ~-lgNpccՌ NTJDsa Rrf)Pys,fPy ՊF|RD^Sr|u [DτRU-dNK.6P.J]twIU֪O>2WeEyC]E(LN4PrB@}|QQGeO$:MWe'E)`NBH/\WJQ|Ϲ$@$ zb˶,+ea xNsY[KNnG)-tuS'V&7} mk^ۑ++כV*&`x@,5w푑!@FFFFFFX |s']!=}l[6$]MUA^Xv84bq Q :q[ Zﺲ )CH.ʏtbʀ,K&nHu[ Wv*j8϶XVᇽ|u{O-BJ+I囿M#rR C}iX~X7>?5hDäM+ne jstkznm7m P&[9 JH$+pM0=ŹG='HK):\``SuKfsQ~>GP|0iR/m6%]D$PdF)Oz=/%VmSցf!I"U%9,MBUJ-;-$M ,?hu`vqo|瘷SfE SuD>ss:bbfLQ] &j?6tx)#######.C<ۑ$;pdX |"+\FYz! 5 8ǍZ%-'.*@LAƳPW[2r)rC¤FGM6O@G@ЕaIӒ@ H1'd_~"?~_[z:/K1=,]`=]`xT)n.܂)y42'$\&ps6 " p+b~VגrU_1HN_ָWLWYDu^^;OҦ^]f]Jm\Z."mO~ôTUnR#Jo.Hq1U ߪDѪbb7݂Euf; v\uܪ'o BJJt*\ #?9!\+L=222222Byd1V74!gaZaFkmS8ZGXX2A*+p?ZdP$;u|ky?▯&X*>ˤaD\k$2@d<" -`ȝHsU-D^&痿OG)Kf8}'=*yVH˂=HY1B wHpx   _6>u|^ϵMuu)K>S M=Ytn,Ǯӣɋ Q~>{kEٝ|k/̧-_ WVk ,^5nk=,AԂJ>$"ZQEyدC-&Ai(KRMsuY<)p6uW< =5h-uq7%h $rNS{J*Ǡf*Th$.{*zY&u":Ҝ\r_̋.[LTЫ"ڞ+biy1\GF佔>g<թP)xW FVO^sLz,Abvb⦅z9#Wp1Ex$))Y"j!ρ="^ #i5챥`NK`jҫq@sDYcRl{gE1yEFFFFFFF ######,wHPHk Ʌ-q-~^A DN41+eFWh t-)0^WZ]FEW\ч^n;М𫸡1-Yȵ/0I@_>Kn+L'Ϯ[ eaZ\j ʳz{nMqu6I_ By)`Qoe %ѿ_sG/*KScW8%i@+Krydo ˧vџ*+K=\Ժ44Ծ`|)XK' 9V]N{k$_Kc+~'}n1=#XK˸n%r 71'D\{ jDL#0Y9jqMp3eyë$¸׭.* .wHNkku.EU'p?{hZ-u8A2qU6E;)QreB`))gZ>]eĂhW)oӒr*};/ 15 Ua 5)P|Oix}rjƱPtIb[I\8 lBdaoؒʻ bk K\h" \ 6؟pmJ4,xX8y{,QEKw_H>#aM¦mdan*7m^‰IFɋm S9IXײsZTV:/8ᦄ-F7Y- RD(߆D(6;ȌXx9 lsiۚx+f{Cl1M<[ꑑ!@FFFFFF\L@KDZE/iQpj{w"^6׺X:;ߠu3 ;^l4DKJ#-RTD YLjK4A*q"p+WJu.pqI^uABvSrS\.f, V!Rq?KLC4{XܢLORwՉM{ہmJ5ܹD$<LH*=90a#/V 'hq_nua## pբiYZLL|e+i%,l%D5>O-  O(oqZlKǰƐrE)nUEL./ V¹pk'܈y4ƛC ######/uWTm^W=!hwwFpGuG{(&`&B\#/ůHPtCM[RU(m:Yڅ8nG9Z(b5;Jy9r)>;읧_|n.0bh.ȧ5Z D"A:9ycG9@`o}nZ"joW 1[=Y&͖ ҇^/hᶒ`{N(dCk~R4 7QW[pqw9;_TWkyx~v݁fNm!}p3+NDp"I>U$hòꓹK:7,gq0\%J_q@q<^uXs m4yM(O?7žX Rpǽ],][Ep`@L4KD.rzl?r7!z!@FFFFFFXpvf@.Iq`>@_<4S!HCʥήP^ =vazԧǓ!@FFFFFFX.ZX+CRj4$s'dI(A Z"״L"\γX#b*,z( }!9;IŔ*`Yj`%XbxDYxDj,JL .Xy>G !@FFFFFFXVP1nToJkͅV\ o`:@p 9/hk։zȨK ,-L҂$͛$DŽUU'w?8Qf{豲jߤm[Mj P;D.,T>𤕟f+eVJH=w"č=#|yT]DӭֳDS{~ ' ߑvΣl{ק}\5'KHBz[׻McQu5\ޭy+ ( |o_(Oajn}v_:|]O:6ǻ'aa@հw:T ń8kMB勷}J$޵BG Ar&cB5Bܤڽr]Ή>]u ٢<Ūd][yڨA4ةzF/8bk&R>eczY ˸*n̷ԲJNlC? 93&.FkdddddddGUh&Ud9r]hU(Qw!H리=VoĒ+*v]e,XϠf 0H@4j*/ s@+`ovL*@0oߗ_}gk q[8;埀bSRs ; iHOJ5KoT޹V#{5?D?r]Jmr q :ż>e[(e0@y^ WεMkt,CVO xՏٹ$RJjYҏvʖUS}ߕ i1w9H-*v9b@f-cY=jH1!sHSi4r rmt5*O(<֙m,G6E5/\1ɖh7l|}LK12*:b쭘&rޚ8IƗ0[UVhY^)#######'C<%Ar ̴,AI@q!{&tqjeAQ @LՇ!Q R0y+C%qRMp3 )aTp/ qM\x;H*PEpEzPIUVDP  n`̤CؒŠ9#A-I`T@Xc =U"ixv+JY<Χ(~M~"AȬ!9j21 `Qps_0{TjliIŴ)r_ϹYzm<Id\rѨN}Ur=UvJ/򘨰KJmffN|(,mW;\dm n-;YX}i9~1AEQIWS/b5_1 4a,o$aZ*Nuіgp|:}jF E?<bҽn"[T2h:lp!=J W$1Ŏ< 222222B74.@3jC `*A?b`|Kp xa-5P^`4á`*J L! R$xwS}Nj"D@̔#dhH"F 1Q&X$mX#Y-vqN~l}7lOPw~;IKfS"<wSXhnjtA|ꏜ윳RԽ^BcgtQn0S=:Uo_%HrOV?8fEqw`3Kjm䓥ͽɾp'idԢpGۣI:'`_Pp}_FY ΐpUXZJbZ``a ?~" 8rڹyd%%-FZ=4_GB'2+j--Rl&̭K<ݢ,:/,9 RMRwb!) 4, Q>22֥Udnش_enwddddddeGDw b$@vKABIkИ >p.Sv;1  l@oK{-?Wɶ1q;}""(9>g&[|[(8׾?mϿje!&E@O:*4֟|vor!t3,?lwkQ rKDȹU$7y^ha%߅R{o&R .ʍY䱦UK(p]q HK R \$ Xxp1NABւIkfBY>; f@Xd[l" X'+s?L5%mϦ=ӎ_cqj\XEl@n8[qғ&@ykm,y2B8At% SPY1f/^<3q_|pdddddd!@FFFFFFX T"I$ XGlj@$=kbF ,",n> I t07w'.dHeD}g`*oC?}m!HyuBfOm=~맶#IG=7n;TrvBCU`Y*bõ S"_$tXx\ +)*vuIwQD`Dp@|'"lcbWyd$VCTYXrCٶAjF!Pw w 'QF:g w "0 ã4㍈$o {. g.H HHT!Evt__#ZsVu> |mʼny <Ֆ.9~c-#m򝪒^0#6GZiD;&[$C%QmUqتp_b?vDiZ0YX 2}N*DEj Y쌕e%mѐJG],9E噣ȎJbߏV˲DioRLTB$yx>;FFFFFFFBy`@tb[2Y⵻q2*)8w91JN8Z`YozLPB7O%+鎊0rAHJGtB}3J?¸5U hRe4Xm1_C϶;7 )hҢ.G@68CrsY'T!<0+Ӑ[=?h#F4FP i{3{.vZNDr.$7p}yrt>;=O[2#z_M5ȝ,@Q,iF[3d*~dhmOeS:)%b" ڔWEnHnê% KMp3Qa$!_oRel9hRŚ>o~m۾UL4 \7' w" 9Ri(T')q9a{C|%`Xˢ Go +ivH44 QQ|ɁP&|'eINI]˫w[}Xrg/ 嘜ڶf3);rU.dLƟ]OkYǭaŶUfE@ D/`[ *ʬw{h;,#9k/|K_h;{VY\%˸;G2, lQ+Nkg i{BQG9V/)P1k42>vq[E߅]jqy*V#)@??ol^ipbF,-|0A[[Nʙхyhdddddd24$@A"%2>.i%Z"] . Z>/Bay/ξųi[yYG ZVY"A4pȭ4l8ҟ jh t2޼]p+v ^~"T[10 jGW_jXD @XĄ殩B2 Ba/#{Sro#]an WYݹnBkog𡼩&WwDNK.zr&XTPpAO-ϩSJ+&}%ijy9 Zl>/\"s$k ې]k`%QG'MM :#gi-r3j\wEKDѝ-ĞiUڤ"Ό=yS p-,Y4 pV ߁(9 U&0#QKI/U仿*'8-oX݂5ꠜn}NM@lp҃ }u˯{`8rtX|8ZX!t'DL~{v5ʹ*.!*0խu_ QB,Ums0Jj;HʥԲ9"ֻZX@\{k]ttF9B*bSovXҚ!؟݉/e+Io|md u u_p;8/pE`!!۱[8c$'&d_"Ss}8FKΉhl.y'p=VƶW*닾h+k( $w5ժOܣ?F% }:2222222CK`y$C$w!"2 \<FX @V{) <|E#G/UiYnj.CSFg\6JU"oEWòL PW30FiB;O%5G@8OZ{s_n@2*Jw2R3VDar^ "$Hrb-b8IXG_/| oDC-B^$+hmerc9[EsɌV`/H,7(p/2_IWf:4=hlqdбy |Q暑'"05y#% +(W5a1Њqj8lr/co3Ѕw8:[,\ Σ~?$HIhk!{iOs,*x)G'bE[$-ǘAĈ3b%LbH4J^Ljedn/~)j-k|a zi$&HTNz ܆#7FVS#######+CIL` G-;q kK!ZtzѦeް4hk3 pOl/KL+B{;g_Kiņ??zk`[vktÓx(ղľW"& /Uw lā%W ql =ڛӞDHj1Kt?֦X]&J2$MvuiL>'}47IlgR{"E[91'xI7Vh<mZR3/QE?90,r;!GFFFFFF^edddddd+)g$m \ƔA,@E0zA~~ҁhGgKΧ/)t ߆YLau (FWWeBy隊\i7٦P*( A QcEkj wXхԓ{wDswV i(ז Kf9k3vήFk抜}*W9V]٩jJ-boMVV}(K120AqnK9g1 z%ukhC% ^ !p:[,)Cr ͎[.Po?+bNum4cDE dNܤ$Ya22t o;c ######,ud:B$D$ Pk 'MKf|wt\V%.d"x[ 1Gܺ6>ЖI좮`(0E];jWo&I$ਧ K6׾s~7pGzF7cҵLJ`UB\Y/`.!"qA2NȎP-APۭJc<Km%zAU4X3>t7vGJML)x|WzMaV1hLsE }+>e9ePЦnEp4F֛Jg4.+Ѵp?^y͊#ǬO܌ML W ;g49>oDPAh|{_\>M(T̘U@9e"Vx`8u(ܾ  əJmRnU=vHG_asZF}ө^a*|]IZdyrKWܫ2$_X@uh-S$|z;0IDpn|k:{of܁)? -!pP5[4." *3adlۏz^3D0 H8AG{oD9`CрH3om7t`櫝Xl5g_+qD:y>ϴx9~ڂtY/.xZSLzQHjf߄oS37CB "ZV󜿝aKTWWZ]x91Hq 2}ݚ,g-<Poy׎9{5#Rk;IF&rی*ҫw@UHiΈMUsm~cͳŎYq,=rȑ#G|ȑ#Gd.\0ç[.E# @gCg ):4:)<6RoofDcV`nw&F<7s{A酫z(ncooRkޟ/Ux%tg#JM9 E4+1[j3?}sny#UYk<ԣcDϳjuF]ކxeOd7_cU/q/.wM~w]p6߅ }{K=o21}ʐG h;~O@1[~%.҇9w21E^^}QM>9>:yDtuH]naXou0>y~Q6b gH AArd|v߰O :U.m n&謴QD ˻ުL=7D$^Uz,-5ɑlۻw:?H:Kh`{{pz "u:LP?ȕ6749Wsi]νȊ<}gc8j! 0|Z o{w[oj`}`kuվ-4!yI]ʧ]ݵڳ(tHs YR,us%hɚkRd.ÌTA$u*3Kb[.D >%^[(/Bד(yB>-B5B9rȑ#G>Zrȑ#G|D!Ks8ImLl%PT0 nxI "$Ms) 2˲7Xo` u@0[چʀ;fH?${ ٜLW+LAqoN?_W~VK6 g'zQysGZ; nHARhN`-VȔ*ףj$6-MJtK$H_U$),Uw47F%V'( >6aOoױ®u'ڦDKK߮TY$2zn|. B翼Yܛ̭.9@/-YBۃL߈kRXM7^D%uNTZgFTIX\ 2h6N)O#n| r&hK.=rGٶIHTz r*N;um#u]cr_4DqBcm֠Ke40w5W >a-las*?F[:ZiiѤZΘ=ȑ#G9Yvȑ#GXiXqɂ?(,-Pc׼0 d) @L89;HۍMw2lxBk$9DR%En&Fi-F-qv4Q q%[VS/q2(lxɏo+juGc!^BsEPq>Lm.ЯUKe1_} x 5 쿗房/rh@ބIWuq=y׮q^;ǯ ş?×$ZWt቟,ﺼ˘,, NG># 6g\<zX HԺ4s=\H*`}^ap<><+(u}q(Uv&yŠ;?F[vb18;ϗ'8Y-. b0\1`KnJ .HT:m!\r|̘u =3&)`rk/kowmy0e^r IET}Sy d`-`Ynd>uyɭZo:`ȑ#G9r"@9rȑޥk>[ܕlݰ; r;|)s`XmzIL0`[^ƃ AGq&_)8 0@0wA)}Q|bծO$/iP ݳɏ|_;ŗ>TB`Vsx~ 6nXT,avYs1h2Jcc䝑_R'E1xզ:v0|ח4;Yuْ 3|پwWKɣ?ם" ڑkkH7:^ew05FU@e7U9rȑ#G>Srȑ#G|@:o7@0:bKS.LxC)2dGLGlL" z2̳/Nj |Ǻe0 p1M9 (~s !|uˬ=|;&@]i'L:w?ȩzK2u%۰l+XˀEGdcam1IXВ0u>_M |Ktw{WZ"PFa)f@PJG[`qodE<y3l/wސ6u[ڐϓVEڨoc<A<3"]H!eh?P^3x3z,%F{M6@2*Dތ MR3Ŕ@Лgm :2m|ʊ 2%̔-ns62&*"τ|.kC4al>B‡RMo:e;U쌣EX Tb6֕{: KZ.+_Vk΅5!kv?V FUȑ#G9/ȑ#Gpӟ X(<]'EX8!]Խh hyak2%cm`p ,J8d_y^t_$5 w^o152а=vUW4&PVXQyWW?R|>*bYe,D\aa}Fnuly=ذJIq1ft8 9^t[i6o`Kxyڜ]}@RJ^8*\& oX=vJq\2Z?UPI8fߵ9v#;c׾ Tz.bPF.(r u6P*^EO~\ND6]mO6h֓5" sMXRaD*>W׫o,Fy~6l sD.B\fF=ͱ}ZZg'ȁ)"kNmMIJ}<sSĺ Ӌuk)M@$+ah9rȑ#&9rȑ#G>Y| i/T qݽE.(Uj!B𾲩0V#T|K7np>'`LqƿP!俚XfBFu8QE"" o\qu1NZ ]]f{.\E~YIQGpslRʽBs^=P+8%w{$U,HRWi1^d ,zDvȍ_QzȎk(gW;W;ΰՑm d(0ٮ[(%wc@`oqaü z8?74o17vx$1@;^l+ё YkX-`ѿQ*mcl$]]R軭`[䪳(EIG@] m^2HsslT^GF<~r԰~-R8Xm婻3O݉Ԧ乌 2,k'rYk]N !9rȑ#(9rȑ#G>Y,N.ĚX'+@h @L)@XS 7Qkm[BBq(ii < G(Du=nP]/:"  =-{ HAPE[/KM7࿈PA{AYC9HXrbYyhcxÙVȬ.:t񸌩 u1r_wsϫ. rEk igw W2; MoO&qc6JNMi'a~/nVP|VQzd/ul`jHu{K_)j'ΨI5zܤ( # kZ} *4(m$.[0W눾4Z¶ Ss#׆ID=bFmv>:IXFذ%ϡJާz8$h&9x3!ݔH)QFcH8ZE ;o]^a^"#(,(z OҬrCvG9rȑϖC9rȑ#,K}E/&&M4\$lnLu<T]Ȇ`+#KM.5k3y~S]xc|zߪ"ƞφ9NU@u ᾞ{%<3{,P'"LcsxkhĺIP3KqaثSiQ)2oU4 6=69reG~X8(}Y &"2R%tC F?1j%NzLg[ fsY[c8H}ܥIG6umj(o}ox&/VB]5WbJ<ȾV|"W(8YK{j=u݋&1\dBDNElauOR"}I;WzAw@{yؾTB}̊SĿW֜&b|/&#zeW]Xl(tFl9BK9(=mȽ#G9r!@9rȑϖ[ gVnmmaQ{ uTF&Հ\+ApMv#7MmKzLlq_ 4c::վ% UOHiY(a>oyuڤS+FXhX9y`MJ@2f_L ' |IL M<#_AЭ̳8$k|!hِ@hIԮ;b:;d}z'L(HJQlSfHlgxn3=4 _Q&U"ﯡ=LAmϨ fB0JLމ{,6ywzٱ!eS*4:UoȀWl?B./MƠ>#%"Gj$oļ!0*U/WQ%􅡾px3EhtЁ ҵDj9(J1 .~.\%rȊc='AR V9в5;HN뿙 HR6X\OO'?rȑ#G,9ȑ#G9lC%>'@!Gn$eEA\#]_/!T'z [X26pR/fbxj=bQ t}KL#U}+D~ ?l}NC%o؂xC8tY.੢T&t$zlYA4-uMeJ$h;:">mTG8 L֧~fyr9rȑ#+9rȑ#G>Y4I57Md6@58UDayM:~7"Q[i׻`!0k5pa@rTr&$¶m֕\P>2Уwy45ऑ0KGN1K}pI{.B>]^d+3M1҉uhEd;rs  3Vj,`nYBJ:u!Uғ\T]."A; ӻCf{{7oދ;1ޛSM@ѾTÏE/wh[}v}\*Uf>9vIόpgzIm#"էvc#I~˸]y5ĕ,ߪ>'MM c=n|X 6$mNe;Jsng>\noX_sCK:A6 j3tCV VoV0(La}C$i${5NKV 8hҥ՚`\g*"d[ۑ#G9rc G9rGKa0AdD ݩhS,տ+ck]6!-RdB&UhjRlW!Wẗ5ݷhA^-#8$ޖgܥ?2fˀ<\`A; D'`Z[{Ź{@,'ԝgtpSvBmZgbtSN+x_WIc`UJguUMy8w:X }j}uJoEpwN@TOQ'޵ YQ(Q#H1xwq7@gk[3N^*:y{e.n@nv|m\s x"f|D6!͆bA V[ؚVu~qOqr PB+&Z'9& Xn֔QhSV>#+]^݇ nN2-#ZztpDlͪ Ʊ.r T  i3P/$wt~՚Q6`m9*p}ZIF>t[m !MdD/=fֆscO'gċK)vȑ#G09ȑ#G9 o_0`tݿ[cZ}347@4`{E#:¼zO i7G띴Lh~m0O4) Ա+`&uh dNd)a,U(۟m2FvQ)9@:RkSo׋{H|ČapntKҩWD=^&58x8]"zkA0k.& '0|:=;f7ALOҥC͆N\47 jsK Kܚ`ޏ:I͍Mf.7#Qj $ (8jЭv{ D(40HMB+ )vÇ} 5t?H?İMz{y9_QIyre-;+ s MZuD@(<b6 V4팑jlqg/~$gGYy^ԫ(} iF˖eQJ=r7d7(g=rȑ#G|ȑ#G`2M,&LS)He`go.` )p'#"j2}{IVB |<pFA9]~.;R Om ofls6@k!ƒ36*ޢ ȳBIxƅq~'r1H!1K3@7E<}2tYP}kEk-ۋ.d*s0 "AV:cEu\ cJ+3]{9!z22$-_{Wذ:_q68}jYOǀ?"+ޝPaf"w;!utmTuDe-^G+?0T~~I^уv'USֶ,+$}~X#˵,wi$Q9 5hh:Q`;rȑ#G|ȑ#GdYhU }xWĆ Dfl 4po`Ls.udV{.y\?\wCT% =u"i[~Es1-?x#\&C;JX@zLb BEy/j"]MO~o~ =}q&T6d{ 3'Jz}?~>{׃vme#N1zd+|U=ۆ,~I[Yqӛj;׺u%<Vkvt)n|t6Zi\?*Ҳ@JY ͯ$Eͦw*Orȑ#G|7DS3(  12 {e S_zt'A*=ʆ: 6qon> 5KB\/J' v[ *}t">,PA3RzX.eց(C#Z l{.f]}In  -80> !v+ ٭!ޠ*v7X])o*Q ̚tWjεRC_٪_;_HC\;8iih drp knc7 uyzs?8㡯MM4^j".tVԆv`U{_z|\? !R(vHkXD]Hri5ۥIfCMت.b.hV8H;EcS-b&ŗ*efu:W% |]]*}I]jպlEf:)F&cpiɴ1 Ͱ^jhTv†ɴWv|kG6?3Z;rȑ#G|ȑ#G`)9ڝIɪTH>)`@)R P."{3J48ӻkx" puҵ,57cљ _Kld0{\ڌ:HPwN(e L lDZa w|G\ML[X:ңLoYGtyQ z⠍.U]eWFoĕv̓/N2F,/NbRkC W ]_>6ԅٌjIjp7AEZ#;9O12"lQۤiPsWRnԮtJ J{mWPof~V@h}LAFt{ͯձnZp| !b[- 梿$:XG1/MT.W1ɠueuڇj$:v::1usTs#3ZT:$3dN:C!Hz2 fYG9rȑ_9ȑ#G96& q!%t5S\ҾK>62_VRS&hThE~:.,REܛWE:<ݍ<c $ `t3A7.CCn~1nݪzkýGlw tM} Ȳય7+\˥Mi?RHjXgjQq%$\d7Uu? (?3B: IzLݘsFI:g C8En߾q@J$5 (_FyiyLmt\f?9rȑ#(9rȑ#G~ D`Hv&``;77(0΃nM6H':=Rh zp&L DMGxT [00ko!xYRCG 1WNPڛw., wc.U<\ `gɧ0U"1"KTfYͨ(*xI%KGQ쩯BѼjgK89}`vt@2 bHs QZܻ}A<܄C2XFR5𿃘 :Pвfy{W p*g{&F=l{!sK"~ЗM~_ڡm?@Oo@߻Nb;A{8VX^sS耇D'ַ㦒Nr+*bbtʂ}ܠxYe9V.Sď`JJB!ր?/1}&pta + dt%XkؿQV4`T "Ͼ3=ag}ЌJK4ѵIjC9rȑ#,9rȑ#G>]VR{&2-y ܭgFQPz灩#(&-<WT4`LYs:$pz`Iyb &c ҭw䮧^}H=φO}UP| jk(p(XpH{<:sW8rU}0y 0{H̗# "j /!ᴴ̐+<z?QaΪf_YQ *_ r _B:'mx Fꏂw4~\۝`/mO1⹺Y?·qyLº!QUnHB~,HㄋevLlsGv,"<|*gm9bk;">u?JBd8!|xNU?qzhQң7B"owcr GzKʯieť] r$Qx UlGoֿ; A}&ȃ60.~!9rȑ#G>Brȑ#G|OIArxֵր}zN&bTGF70Wiܟ/Ƴ>2@dX^ )mjb00XRSPAF)5YMgږMG!ǽqyi$Yԓ>/?g&j 30!8<o :~+YD1Xɍ `2 IOPqX2+/A)Ŝ)d'rt9u_WMw+QUIA^C$ڤC4KȄR,x_O{n [m]ݬ?@m<3< sTsFl=V)Cac?L@)zf75uA.yG=n*ϕf*1-,0m$!Q)!hBw_cs/hN Z|pK{]l"lJ Q!&O"WA$2g].GDž̹ O,H˙{mU8y&WS'ݏAE]6sÕ܄O ;F9rȑ#G>Wrȑ#G|xG1I"(Lk _ x $޸m/c&qb',2=>> ]7c=ޘJQ ^H]v.R+>Y>PQUl^v{]%laLӯX<:xhJХw__iw+E`[r0ӎ5hsg%Q ^h9PciQˮpg{\Q;T~*#e;Y&YműetuY*R" %W4966\CSzfc߂q/Dok4y9rȑ#G~= G9rNjy- PH΢L\;]o]MH8nz*>0T`cL ۾hs4ぷEw5cܴK_.Tu_V+*ov[s;L6G *-LȔR~~}maMbQYk崵\y_*J[Iڌ15QG@ ;vGwJ y36#fy[++Ovg8N&˾}̕M52 +h=UUdd{i0u /uyoJT,\z̞v@Ѷ.*kf$򥢃р;ٓ [zŖɧ Ш q}BZH+hRcL_UgEroK73G9rȑ#G>Grȑ#G| jhjAbc Jt*n?$ U ( $7؇F 7}ȑ#G9Qr#G9rE.rO,~ĦM8v%+`h$Qqt1a;?*wuIG'yEDS'ZA%eoz%d6'PnҖ MtBoo*~hsj\oGF?%@pk4{0]( 0×DX#֨DjB8o9dC[qiv4l/g;!qUG@\5$E .LL N6xWN:tVGtwQ/|Hェ$@A>m0COk=}/p] E A,Іm1 羑z~j )(=_OCۼ PvYd[\&mWoa\k#9rȑ#-9rȑ#G>XFjqHH6̉Tjj<)ab UHq*KFMD8v*YwTCpPQ%YG O 0hCĬv; Ҵ!c.A?vmFP]{h>ZUEt,Dw=22-H-A7E4Rb $$ bv@B­&HjD1N( "gwTWzE~L}Ɗ`Y)jNy8$tx` vvn[;;vMjj6e Nൿy +@D{?dӢ#֚y1`'IF6w{`)s?虆![]l|0]'g e 6PPD8pj/5A#tGEKh[)yLy0[#R<| GLA8֚6He çMb|! FpavcgcF䦣>ɜReϤΑ#G9rs G9rȇ 6&rFU+wo p8An| PE). `\6}HcaZ7:`L'"ۢA>4-JWPغ.960Z;*cNq!ZSccočV`fǙ 94X1mwy/|!(XҀģ=$8bF /HW[Y$E2}J$|kW4fBb彜>gn^T/~v`THDP{hpM(wMwŏ6%bF?G{{FڵJw{Hj Mۂq4I z31V IP ռe߯ZHJhz6v*Bd &C::SP$':.Vcf[@1Rx:JO>!*1z(m a)d+AWV6.D_Jii#$ Q&ӚL&onNƫs?6Y:vs ໜȑ#G9r#G9r%q@cU`iK"n(@^qlqU}.ا ~l>ftN~}GUD'dޯB%"Q_\cJ[>N~6#DOKMs/5UffС35ZDV.B32" H$+j-ބ t6.ˬo˻cS+f`*Ym-XomcEEY|͟?;#y#G9r G9rGKa @ N7QEJ!Bw8F`2p=xݐZEf8H)X^+Ak c?*:j5 fn\hS7TKʻ~萀4'Pa zzЕJR0*{kjۚ ޲or}@iQ13r (6,FȍȐ`@HETd8KtI[BߋxևȏU*;Q˯,sCOVCcCk V# &dΛ}<;+ρssC(0{1l6;Â~(wԺчuld,3Y w4^10&5y&%kRG@Lgk.6zq REZ4NDԨpwz^꥙8gM?߯%:VހtE&v9f.fL 9X(0Iq3`X?9̦]9Y J^EזA+X=?rȑ#G|ȑ#G`qu$xӷ+"jDߠϫ lkoA͈V@U,+(j?It& v6;{c޹.DQ2H\׀ObauIwϋZ!ُrh9kL]^DbD2_gcoٝɎ]YС ʦ绝=ٺi"XH=ud W8'INjB:lj@+-;m6=Ï,Z4N !'}+D`u?bfDk_߭/(C`#z9zPw<_}&YϚ6;:fި~飺x耙@Z@vk>F5`eFo :w^ly#\HPcyFi?rȑ#G|ȑ#Gd)h%6K._´9v:Ll^S% G!*6SjT=,дE(ņjA]xtc4Qh8"S /p>lRlW^R a;]8)tR _"\v[Vj%<\a:I1c}{.1@n襢H 8d잇+ )|eVǸS2%U#6̣ѺElě8)zfz% g9sOVvk!ŸrU ?H=mq22 OтF6p*%*[>JE;P4آ|I7a|l+%!ጔEm܈,D8ƞVQuyuZֽ#}`ݙc>;k;Z.7mS%l"fԅ M ?R)QDA,Whݴ1~`L}0nih ^MZ'&iN;3ʍ.=!)h`m. x?fJbLmG9rȑϓC9rȑ#,+)V ٹ1MǝI *`; ."*L7Ν>Q<B(YG_e<; ۱Ho鰬m'໛F;:9Zwo T{կ օ4iQ.JHRV=v{V٢YEvtZpm2gMǍۏfKz,O ~MM!fl^e&hF~R~WF!#[e$d _k$.j =w~bwIFCa6a"(#Wd׭A^%;%{Xvk#b;^VT択?O5!mFvȑ#Gh9ȑ#G9ɢ;J+w<@yAVy{lA"}|@CqHv;iҾa/$]QS '&:u%~qj a }| ?v:zPl [Hkzn]Q#pcsyaܙSYAR7QcwF0L wڣQ 3",>WYA"*ZlF(խuy Os 1(Bm1BbT:o57D7/jćzPZL'ψnc~j~:pg#G-.@=;FPArA!w7z7D UyÊNV}E"Oo46 ߤK=LUgt]aa-!°ܱFxuumdIݵtHbm[/tŝ@˲+2 dg}bc %mg"z!洌>kPiַy#G9rS G9r' R[I^d4Ի((b  ) }`lhl@[dZ^T5@^m;KH`DȔ )c򝄽 N56SAwXAk胙G],q P1g5HNiȢHmo3a4nl@ <:#]UPȘg7 D6h@[=%$׋+**8Ȏ!Q#DFF{T+WSuH8EXDaXjl>͎1(BT *K yh# \yF]0@_5"П? d\6|ͼt+Őhb@tZC.E}̨p:V[|O}D'4$@9"Y@jwH6ʌ ߞ)Fe|lO*S(L D iƚ.;g; i+XS39սl> mu]S,^.TkX\nFz)"nxȑ#G09ȑ#G9]o=BH!{*$! [B<6d qI{VyH(TP>ԭnTa )ik{WYOui[^>[;L* kLF[SyI}c'q!Qa .0;^m]l$  438'0ۧr*"DDqjeWo)#L6"2)4^A\WEhyHZ}.{󬑿3 vK?2Xw[yn`OW=ISʣjmo{=+36I[U聯]2^Y쾫ۻ8fMRǞޫpEԵ-CW [vL$ji;mF鏋ȶ5Э7QoKCX@kdv]+7GHZ3k%HH߰~{]phb:f~QHBtt'"@M> ly^f ߯.;rȑ#G|ȑ#GpG˘k<0$kmmRhDE.R~ ";rA}73XHYcq$DHIypEsL8F>De3\Aj%s˫ ZFz\bEXG,^lh]ad$K"2/A\Rc-ngP-LŃҦ0p6, `Y߾A+<M4u j@!!r'{"=x@|x/G6aZiIHX"E|mAS"*sH'LР679 &n$6ni3{/kc`\\u>I?WSuW$}QO1w;.w Hl|{CA{х=ܗ߻\L ;ь*_ mY_@6sU N!R]+Ezۗ ‘ 1 65M⢇R ef0Dq.c/DG3*QݜkJy.g`W4z=d N\gXGh$H2} X&iZzOQ#'C1Ѧ,Hӏlhc&L?Q^ =g4G)F(qk=tR7 k+rP=n?zMO3t[[DL> +F[C)<db>|te=*o*#{uf8TPPɍ$7m+[&!θ zbENS[BAT< #PT? ͦkڪ֋MA4BI)$ M[7WnǶ9rȑ#G>Xrȑ#G|4H-e `leO v{#:PVy|XW8+5 Xp(b^@M:Ҩi >p ò$c-|$x(2z}[ʝKOW?\4=PWTgF˹v!U(z[] fZ,~jέe+WBぬ ptz oBͤ:)Pb-x2[ת0Mclr tkW_.*ȕlȏ8F BQ֑%7n1FWEnqnΟ͖'zÞlÏI;O,W,l@W*DqM^wNG+BO;JzrMI eU2FSA*ݲۂ66*SFp =ho(7R |s{\yln<bc B,k!C qZ,k2Dޕܚ9y!g~xz-&δ[|A[v5" D@}Ik [X^كC=bO^} B*""ȑ#G9/ȑ#GpI>TjLD# iY'v [!MEѠLYmA(pi7?T t}!îwlLfO sur^6lW?o^͒v'B4SX9p{^sЭfiJ]!jwwXV̯v8{WPvvckE輣Vx&H2|#W#Hr$\jX?eB0΢v"7W(0&lE<ϱ%%>-iA8 +٥"VjoleN]y6,|ؼpZ_XZlV Bf;iG|ÆRIk&I<>5JU:"/6#zsp˞k9^W[TG6;MÄ N]Pt |4V*+ MޜH;Uώ' r [/H5>Bn+#A\Cw:'Q{ssJ|7m X Ŏ"i=i^Yby8j`i-"ms]w5n#aX<D4W_C9 (7㬨JdljYJtMaFp#b/a}F=tvp)ŵ<)7")ʪ;1f 0"-$_D6is 轸q`E~!0C$ 5:%gӟ~_ 9\/ zJF`{}/N;rȑ#G|ȑ#Gt)dC)Y;6$mt7WrCl9:pzf Ym}Vf Џ#e.B=? ہY܋L-Uh8S_Q{筀}15[?c璈mnԈTǬyoWTm'!RR`ӽ8tF Z`ἡY tNUo1kW)+cE0ȃ6tiKe{rm0ܙd 0AķtO|g&]PDpV^ގzBL9GS:%!n<839GgH? 6b^!A_f% ٵa;Vx7 c#Tg)߮HWR. Úf22cŰFIV []pcAj$aNcjS>"`K(:FtM?-\Nrȑ#G\9ȑ#G9m=.i*j.7  "#U"AkJJ̰/5951$"Q"Yѩ'Mߺo~^Ai~@+}Zwï|GD)Ý?5/:\7.M >^{# Ah\iGWvH5[Șrc 4DpD}|KIcYQS\y̙ V"$do^oFj\Chg4||5)MPuHb "Ozx1cJmvͷe<>ĀP-+bΙ^z)b[:H{(c?JݟMpa^fm[{ȑ#G$9ȑ#G9O$6d3z YN2jc­*7x)%pA0o wW+ ٌ X*iN A7-mڭnuj톴2;bfڶրy{YF-pk9s{W9?s,e:\hEAɮuw 2xoR ڶ˟ٽc0l:38uG{?IP켞$fsl:nø׍he @ d0nu(X.z$!tQLH k h,AAHpQ\&Nk$, <9T ,թ{G?"<6mbcM\ O8\ ez}OmšPd[u3zB>48g"ujMU u;„KK ʶd Duc$KZw %y&+iXqn٭YXV c ͸߫q'XDmNqg źC>Ek]SA2PֵL[DAm ל$PBln aCLAF+H%gC?Nfњ JT sz5ʨg},q45BMM%iV{fc6]1zx]Op\CFߍӞv;#5=C?zʜ>Jp':H_TD6%vإ)BjA16Nhse2 ߾kL@bbVA}H~o: _mk)H ؀`w{.xr K,]"`jHG@'?,/Xrȑ#G|*p$x߸Rp٥Wo 8t PBH2 `@F%95b $XF3tp5MPZ]uqqIJCh~Jl(۽)bg߉w@W~ZC%DΕ\B2F4g IvLޘ܊sbE~!^t1.;/7ƈ8^1>^15#d*}!A9꫞YOM7)n5?7R>mAb/l3uѵYOcLWwF)d@ZӇ [\Y9 QW4HUvc, /ب(z0zrޞ"ȄBs(1YM]yp+Q5#I'17qNBNr3Ld 5979!4V?lm9@@ )} R%N¢o;=gWCӲ1:m\[F;crȑ#GD9ȑ#G9;bku1[ $͢j,iM AF $xY(V!O_] |bO#׻% c~ @I$JPk ӾxKt/Gv1QpS>c WqP ' )x2IjPLP2YUxzm=`z+-|wE+Np9/EXDD~jVU]],ʖ3% ?#BJWW' ّw(Ƀބ)?. Nrȑ#G|tw8ѓ0(讁R?M0) SQ/ Ƿ:ʰ`_!__yVLlk %_*)$| uOFY\!*`,y_Bc1~h?ܫ1xe6L!6 e5#u ecS6H\Ymo;# j@oI(+vvm 1L}td@(B:GZvmP㬆Sʬ4We-o r~霋Z>0-P:s:c(6! }D3U|voN[^_b?rȑ#G|ȑ#G`q@B(}ܵ  .~13rrb @ɝ]@O;%U^z1?]PE3M`':s:Q<~>W<9V}O74G]rV#fsA_.!]/I9liw sO\P!}XQ.Du~| #4iwg$ TM "8rx}%ù q:Z$˭~@p7 >_DW9\ SGta|j?_,4P]!0$j{zk|DHZCQnj8\a֛ f"m0olpr dJH<|͚{ٰï`lU_GWӡ$ Lj[y'\šgr];A߳*~OLJdݴy񸾷C1_#G9rArȑ#G|D7 pf-7c8 +3s D ,`Q{QXr~It#xoU"J?yq'hEW"Tx+"5u]؏sǴ~Lo*pmX%p_}( v.NuCڕPJ&(Yw}`ڞJ3ɽF8@KBr&~z9"1r0!눎\__<7` z +2c -3ﯘW菨E\<$/bt]rmj~+=&=#Z13#GӁf#tv }GH8*0|&-)w; tdC*Qn舗YE? m DX3#\ b鹌 Yu4Y6}E{xPeWenMktט{;X1&Q"!m>6!p*Bl Q;BKC>$3 *G/-;nB"dHT09Ild^9nz_{?T_Ϧ|f܇6fӯ~['9rȑ#+9rȑ#G>YEXWqGf. A% p ñt'9A s;~ h_Q Ho":`Eˆ(`,LvLђ;$|Zd,~Yg[31egsZ4`k v]4C I N[W΁YÑuW RI{M42͖TG(DzΈt tΡht~Xu! WP+ B׀ |Ԣ56ô1k;W^z9@V?}&C cv,/j.Μ x!1ѿJÍ>?E r濁8x44TJ0&5%mj} 촗jFĻ˥15i¿3l)n]p!U\GO&LI4yQt8~orfq3#G9rȧ!@9rȑPkNd,I&_Ld D;F?C>ۿ+3iT^G$AU C.nQԶ )wȵ]K !m7ftiMAUHOEyȅΑ;Zu/{岾x$ =h=iɇŴ<83$Y"۟[$GO|Wo_Z'Yf>?]iD5w/@\3&t5w[hFI@7"n [_ֻq= ϱg 3p slg^GPw n_Gs% n ^!\6#M6YwB%!D~NmiA홆zQ'ҵ?Q6_m2Vy6Nmp5$1SO0Ϲ+ȑ#G9ar#G9rȸPBZ~ZN}mOf=|ElG#f3 .&n\ []H31FF4(.nUـD.$$ eN w09Wo}El\[x{?`.#G 0tsXAm]+-'oU-X{S1PEI9 C'vW}@dDҮ|cQA}z~W|RhM'BT˪st-#OdE\44gLgDtGnQuÅxx R͊ *xEVnm VAѯuT*( DNZ"Ft`]dZh{ZPE ҹ de0k“V 3~Uo}D~^r̟]>LTW`X7BZ+v;  @"E8 IS@U qi4 irY!+t }A%hwhƵGM)'^COEW#KLSbHG"׀k$'_alAkfz)a6 t3 E]uI:i; lY/60"E""MwHg⠢/&\{QɆf$GȌu8 :|_[e삗6F{seHN~7N@ӘZ6mgLHQ dB@c֓۝xl0lo'Y#6Ls x@P4ul, n> ¯k2Jόz*Ua)H=? z9-;B!=j `]`禟1SBK=!tˇưfM );ö6>$l,G9rȑC9rȑ#,j7-AB ۗ Y;'O%KJNH" *Bp $iz\؞;szeS}ZetBzF:bvx`&@I΃(jjv[k-$!00|aka! 5x0.4 #4Ihxcv9(g4^ّ'ڵ󀍹EݯMrȑ#G|s?5o`kP!ڻu[YЬ] kR?"SҌOPZ@3D(2 ~O>ʴ<'%VmE&R#Yl> XoUu7pBb zPo&[/GK, ;2L'uxp\y<./="o@t4NHCqY月B$w[;fȎ*7ɵH*5^Q2+z0zv1h`e,#uSV@m}y\b-)'"%6NنCs|#@Y_nbzt pJԽ,=tL:d+-v/(W 6k]s%H{ǿƸ6nϱ*m;~yh`uZ/;M F9rȑ#'9rȑ#G>\@\`u]J>wYPnO ˸/ GD?QncXpvlwe ې; pw175A{LEj ri?$c7p)!e4& LaR A|+${]͜-ֻyG?vu,,IB,笎yȺ-Iym|q9c:V&cBϐC}0:W{e^ !"5.C Jų=* "@&}EpN_lw~D`?"A~WΛ-3 YvL}x>d:*mU_hNX8Q6],@W vi= 5d~DA5n޻ψ@/lpUVG`]>3)mXxhJOnOB-%H,AHH]Qi8ۚpԩ? a{8ǝ!jn7C9#C7v/3"x"չ׼Wo6mlDxKdUT]DO/7Ȼȑ#G9qr#G9rE ^3@geA5F%7x?Ej y_^wCqB ԄxQGHӵȀ !X?}j]a#N&Zk0u=Ж~&{*XHA"Lw7pYAzNs&&Ge C!1il1z `sxPna.qjK ڦ$aƚ}I=N=鐕'_ˍnpYBx\& !{WG}pOwYO=8~ G[ijpgg"g~h՚# @|Tt *{煛gApQS?Εkb\_V- JqMqjDW߳lW3 Ro3: cl)8_M3UȈX\^`;*ƄhEG}L90o^e1 Oۈl;[G:cCX%<"9[w%Ld[$abLfk͆9rȑ#)9rȑ#G>X[嶸TPbZoa]8C@tVzv sW;Rex17#2W V| ~2@d^(v*!>v]~b+se~oV⁙}Kv. .?3>4}_s_׉ieI*DcWhB ڭ:%2L0^Xtp- ASan>滐vVM#U_Yţ@Oy){8X>6uC`X7g,12 ~;-ݾ$AH222/2.Tf}"9rȑ#G>Mrȑ#G|8,&J == 놝^ao<ڐ.3bӚm%׈]C[ʹF ؠh%}uy7#jWb{^B`Sc&xA8rP~r&' z@/!「Q\/Ъ lhki~ -ZTUi VA $縟tu:B|biuyf+kYM\1E$ypq3oجL}\˦wIƦV_3%a!ΰVkڷugdF[5OZN9FMY-5r}4`:z:ZؐՊƃnlbAe;z(jOYؐz28?wn. ܔm}掹 yYȑ#G9r#G9rE `\6ynC@RV+aq#[}P;`P!- ';vATv~{>@5aTwnW$BAEib:֯988N ׈1J;@H#Ow|")<(d`hlL&,d9@kVA"LO};y5Gk!mqّ('Dl_g0`Ed0I{w'G]㭷@ͯ?_~/Mp=niφqq1ntDobro5yz2uxuHϢ&o|GMZ798XΑ.MHbTENH/-S 7?Ky<",pgOXG9rȑϗC9rȑ#,%-pDG1vP$A@"څȉ߀2wDjF8X0nL}o[p%$Q#^f (2,E$ @Z{u- /%`{w3sHn/R([*[ᓴ`RgMG/Rl@3*bsA4먧;gGuޚZddbAg&&KPy.G ƛeStD)2"SNI?g?;GDA|KaSb*Hމ|a?Ylo\_,if4#C*u+8UjK6/I/i~F+muR% (wҞvfhW/O0*؊|'d:r4wutȣxD&$բka6Zhs-BxMEZWLs/\ҺQ% ?F7ԹlhcZw!)1ůkc.E9rȑ#'9rȑ#G>\`G`p%>iA\`22 s3o\&ȼ8Pz;Mu`Cej<X$UoJV4yz@>J 7`7n) bW p m)zS5ƾPĺUxGd%$-ɿͨ'ǜg/H''! (@&t :G$? {}{h]W*]M1zJ, M1g݊j`䤔ƋԇJa(g:2n[lnR5=]ֶ<6؈`1t[9&7B[{5ҕ<9rȑ#G|ȑ#G`q{u3^)$ݩZ"y#=Vd,4^!YBhM7U)_XRh6l{hvW ޑݷ{e RC} P00_ޮ p;q;q OJV7zkp+NMeŨMUU qWC ޠ|v̴Cll A8Hީ1ZJ{|_Lfߛд1juޣ_Ǵz}Y$U>U=E8H( yo;;Seȉ4k7yi:XL @67qGgܲ؄ہ;sJE D }%E~;q"Nܠ{#5kڂ6d0S5L"4¥B^?m@=F.l#;*dYDm/GA~ ݇]aWR|IY̨퇵PaK5 u[C]Hu]CG9rȑϔC9rȑ#, `z.DIw+,@U ` wC}/3EP[G4̥c@EBQNMDF!Ň0#L)l~(/{qZom=nG= :~460=w1@N]h:g}]+\VIn;6ʪCpydM&CvC3a묏츜3GxTZ#IVUj? UuM~cjEb>c>@{NfgYWFah<@{Dvswȃ@2K}3]$t0\p@0e!֔ڧq괢_kC\.lP.#$ZzMr/h|~C> qU$:fO΍Ɉ["-h BAfB7~N۔AC; s:G9rȑϕC9rȑ#,dBJ%IURbv6 ^0]s !9)Qޓ-wifƼ mh:0#:qϪ0شVb6~p v`oehFh{ZQvn_7)tZp|≵{lX,Y$;-3Rcgnm(^B> I.@0*|P.X$?g#2DF"k7Ix5cS?J\!8y4YE:+6HhkIy _9ϋ{m!DE48a3ޣ+APQH@ YyPӰ]ZH P8O;]<43:̿ϼrfnawxꌎ0 rV¥&e#Az>ۛsF &7̐5nLcE.`+ەe!eʦx3آ&oԌ=AN![ٵTa&6bG]Ӂak|;#mڇ?3*OZ$o%헉v͗ SsI֯ȑ#G9#9rȑ#G>X) QT@_#\ ؖbv!]ڠȆ`,:`HmvNYps!Y4xٚ]\`5#(eAӥ=Rimzk'6`JHW/ff%7mC\;&. 1e Kf{'P},QeԳFsqiQ'rh:%1~Y{1#Afh͉k?eExAj!W͕d'ɴG2 {K/A _Үy7>'gogeam 0sb,0-),Sm%Em\ͯ ב Br"|4AeA0h=EtX TUF4n98~"59!YAB"rnknRՇ30#?uixo:Xg_>ic8䦤CDޛ%WBhɲ-%lݷ3w^Zr\gO !$&9b0CaPn!&L`L` :_zγcX헪scjO}^qцK>-MJ ls]׸txYu d^Wh 0Sy,p0  b`0 ^ۼ8  Y.  Ap9ɑ !I);m;qqɍ0ZlFX{I,VPCRX'xYd;f3 ai W7[CWѕ$C+W̏A!D)ÚU. "(.2xccDR5oU*KғdC;p^[Hag.Cw/6jpWbOdy?9nte)kz޸S R"ay1jzk$U23Gy@9&T@Pn,@b ԐCӌvDBѬ/G m+m;gعՊ!ހ74D&A9Lw;syhZ5ﲧ5iM=ls6Ejcre_Cru u`d/Jfuqy^Dv]ڏT Ҍux1 7tBۭ$&n:r\Z24L&Ct)Yv J6mUci0 c`0 ^!LQvvm.tx#2-;B .*b<"Svr7;ԊE]AS,br!`3f" 9%[^(îby7hT\g7Mdݷ:T!;4q,$/!;Q"]u 9ƺ^u/?ّ^z&Cdh&Q P _$hns) 5L"IKycUdxT(0qmYV?w;7D Lla\*-[ M^HkRbh+%kHn}3a]^nMK:$>Ϋy|>nz"L ҏM ˆPmb+F2Gk33Mk8;G04\ZqV{Q5އ->S:RmAU@uK~U!!ʼnuHMl+npFlx뿈a嘄^:60 `0xY2  4V_ QݣܤsܬҲC>E$ǣ^>.̒npI!2:as'0cB_){pJqɇo ?k+:?z+ %G}0:O x8,hF #T (rYyjWٿY/)VAx6ihgމ܍ׯ'1dڽz#{%io+D -eb.[tr (@pn][%yˣse8Dȇ+%n'q9 44Č|9J5ph6uj-3 w3򒙜!)(T8E?#}xGK__1p&[&,eB۩{R~F:z4-jszP@<4El2zd_xYF|\Y"{Z7U%<{Q긁jslWK`Ȫ9OW-M+Wu72OVkY&3yJ9wx`/u24}51K9&W 3{ABņH3|qn1PiUm5sm Lh;ȜX `d0 nb=Njf)L&0F=t|BR@Yeqԅ{yMٗ (}ϙ(I`9'B\ݏz㢥yðU'NB?Nx=;Wxt2'r)ɜZxHg'&;qwX5Y)S.q..UT8Dmǰ^ 쬖O]ȹ^XJ…EH)!֩,~08(5@ mn77+!Y@U__ 㟙K,XچȹYG2|/"\"Ldzlso">3ЛyF@MiC<}R: R,.9tM7va V+}uNV=VJX 7rQHw vPqbN҇8sܭ/Mny_%9GZUf< \ #}G}𲄽孯O ͹6m=k։Vc#kN51 mfe'`00F  sb'EgyYycjj4jo'6ɗ{}{ D?.4 rB:1DL9+H-viI"qTЋr'-Ut[nDD5YuА$_=u$+$a`\ G7F09U{b!.>ǻNza9T_37d`͡$'??}Qj/[`o;fɍ^?_f00^/vH򇘐wDQz]؅Y$ÇD Uc|(ՆXGKdT&aZ`TD.^sW^9( fVm&"#9ۓ FA1-DV! /Cx5>xU=cO4&`Dq|ŲWoJh`}b!g}3(Y#st|:/`0 ^# `lX(Oyq'BU1` (leIx!Bf$ZY@@JBƃXʉ%C8'"ȴBTv4v\|j;=|!_䌈$ g w ])_ 3xDT;cwaI:A R*iN"}+k9d:xFԓ "+E΁/,dwK8|dB/,fS+Tf.;}= $h5ڠt))ӯ gzRIq yk.9Uɻ h"L1zVz%CL0^ lkk(xiyKVQ<#{pXf%)p<>gU5M RH:KmYoC1Ł9'⍉!z NuMN[ͤ?вL&81>|2drxs2^FkRDM!U;(Oч@ %g8A[C+Z9wi ea5:~`0 ^# `pE&i$αkKrw(8n,sx&, b${IfF7"ԷS97E87wA1vfO蛺 TsV ;Įxb{pjF*Q H Uj)][X,h6q dT6v/ : :D]J^Ur; 1}ohgBE3@RW_[ߴ|wQQ )|&8[s&g!2&O(Wvm:y#?#uC.c>=_v]Tд n`wUh u+kȷa8R|aIũK+55~YE\TlPaѐ"c1@4Y(xzԔ>r/t;4?kܥ`iy1/Dy?jW2~Z5GKxV6P5eN,# `0xe2 +c*2 Un$YGB/ Q{VQĕnh%5D^}3c+RDhхtwK'?\#b{$5/2ө()nu2 si/_XMT%yP726VFR6[bK}roJ%H-jtp|6& f " $Jm;~JEnl#;q^DEwՃvTExm鰬 U2pq2wgK4I^=fz~?6(O ěߋ_jIT7!@*z 9\0dvXVgXb)Dp 'E8o|$Ҽ5=XõF8/97I`UMLd2jŤ:G9Oawz'a7"H?abxs.{UE뗜l>h}+d$7o=1:p2lz d}'=g'xDq`ߪϲe{OeȤ^w ֠F)!_puo%rO_o2wLsQf5FdH:/ۑm$|ytl03 y6>K2x3m6ܷ hbx=5a7s_ӬxE`06F ॱȎ$06@ؑ8q,p%ůg8..v O-H1X f!LU%SX@ ;ds Қ;D"+VdԓvQUfBt륮-&Y#WX]!\HVJ QI>K+AD!Gy{.ebܰ`X Fk#\aQ/ЬX-M.YeQߏsJdްsHU]KTj"%M*:c} Y|w~>!~JY?'qi~6Y-!lg)gs׺|TWby xt!+NOIs׼*p1 xp&=&\po#w;Jq #؈yv_/`g!7ZYi?vFcXبRfvF7Em(7*$G V%E4Uo&alهg 6LSP[m@OA#]:`0 @`0xabek;¶T Z$W>`E<4i\k=v榃L?Iao9ȓT#݈9O{ EgL0C]BAcQ瞯Te3a mgI)bHcT#!ϣf;'l!珬,?.v3E$W{Й(U%Q^ r2]<=*%<~Y /B ?-~=c/ų~4ʠ-|zL S:PMTLoԙ9{Xnp׊甕 h'e+/S _8 9i`0 ^# `E=&ì}Ҵ~0^:7TNRCmIlXr̈́odҹHm z+gKL݀w+B=jco$p/)!.tH&tͱ^雈mL-(! J3&Ui^F P A8}HQE@tҺ3GZjvu}]80x'\bB; Yea :㨧\_1.les&*&@z#!;ϫݱt:`0 /@`0xa J6ɓJQs;r7HL.m`VeYϒU4RN)=O:\$FݹHķ2l77Nr#ٿ)9YTn nOy6<d֢0 HI4bp:[*~_=aK'T7BEza=c:+bgY884ݪ,9z/3+o5o5s0a 9v=8VyCE+pGU} fH Mt `d0 G PNBI74Rtw(l[uNQ}( d 7%w>HxnF#pbrn_Jd4  }ۭvK 4q6A$;dTQ$ EWe "R$e7!B8Htپ}8+iM. uAyII#LF2@5)|⊳+m7W^l)A9\WEX z|ylPn('_^~[U as؟rvE[0}Eq.bS,pkfmr̽M)Sf;~\l܋!rir)N=<:Kr>?nfPROSy}%,XD^Ր #\aH"4b5/ u&z}!W"ۼ|4AA)^q&19y[z}RB *2 @`0xi$Yt|Q P]N"@5 ;I !Cݳ KOH4p@jV(WIw%J nPRP\;k}N,ND#H0}lBӑEM/ysg`I!Ė(DV!" ,$[Q_ui#V=Z_ܿ-_JEZ(J.Cح e7I3GbH/>p$@Q[}y֪ܟuUۋ"',#6vY6X]Өi77#oeqʴje~IPDdX4'9L#&"̊n#!27"hS#¬.K6h6Y " Mo'='/TA_S`+ SXcUbW/$3Oa`n?:`;V\#8(3r_K׺-,ҏ)_ ,!jhaK2 1`0 /9jծvOK(pqb wRX,@!$4bcָ[Q ݮ_"gJdM$Fb˨촛_.3R9+}Ⱦߨr\:HU;5IU%ˢk4Zw z" (_ܕN<,|-j@Hk3J,yĺqF;ZrlEPu!c JQ!ܼLJރSFRl!:v|V6?M$i#`0 /@`0xaHH`IxqfJ~"}rsP QjԽ7/"NQ!HD%]]fd5%pYR'1-hy)p*ks: uKԘ DK:S(A W#^|kSAo{eabųPl y7PvOͿ6dC |DZA̡n|{\\{=Z]u+&,.[ϧA>Z B{O]p% ޻iik#r3rxDyMx `d0 J8'({圄 I Q5$IN%gb> Adm>Fø\qvu2[^:d.t\RdUڄDWNsv۳'y`pͩѿQ}ђY NFVk9D^;ƊAb'| s ,C;Ѿf(Oġݡ\k[G)ih%t}Kn_C|{'wEtϭrR读Xjok| a0& n=P9 KrW V,pPrحb]35oRŸTl싷 r^Bj¶%jRZ;'RX׽±a=4]ZB3GdKh 3YXw$zJ1l\GӾ3sE3Jh󦢒dxA)%XV r[kH`0 @`0xaYEҍB<%ވzx-+qۆ]bGE4I-/Rh4pa=X"pZ':]oJ2GT٨PSrÍRon4mצ^OqdvQkT_ʂ䠔$ F:3ȍ樔 [U]JC0ojƒ]Ysh9ot =Pmfic ƿz>>Ơu#EK,Ӫ+ gTJ_5\o~a_c|?|'BH +$62H D`!+k2EvGNl;j0%!2^dw5DϹ%&? k`МR\5dqR JP(or³Taw"=T{ބV(N*?MS@Zo$<]ŹU=HFERc}*ŕ`0 W `00@\yf$ B2lDpd ")ɨg􏤋nB9Hb!ў$ӳn=qޞobw7cISaB-Tғ:aoH7-ላByvyiZ?o;љE($%3 ~T RqxX6 qR.g7Ǡ$PkWRJSyqOsNPlܼNٕS $;$ (ף*q}djfwzǂ7fWW{Zt4"%ߝz][! 1G ;ٲ\c G; Ob*2;+"==p[K?ӖOW#q‚ȧZTPcHBQi{758/h;71% ty+$o+mCc?D Gc};bOvTN/q=[ڒ>jxh(+3q4Y^mM&1"ځ lE7ey<厄/z| (Ѡ,)P^/)U=_ͱw:wQ0Pʭ,Y_U K__zV>=k14H z#,o-\j =HЖv,j< ::ʐҨydW X>r!me_UcxϦ8Xa=~`0F ű d+ |YvӚ$0"BX]vw9!8=Dq(*-̔qKvUgpntpFHw=g%޻ʤ«wMɠesyD{JN[';}sk*4xo}G$[>㽼$, t %K2lz{쎜'({1=΍o$ Fl 7febuK9Oxr-^G,.|n+?^ƐL٪% cDdpyz0pE6YT'-d39ÛHy(Q.OnL\_x߳(U()m5-\_sCΗrI/urvu!=XgP(\UWupQu ^BE"!xd7JivcW{ !>!!6:5G8NEbH:)s28(a'5ETk e"uz9&ܿ&$ne30#3KqUN)!clC`(S(z4C<5|Y̌v B)Tam|L]@Z*ۉEo?5B-`f3.Wjws $59Li&`9Cd`0 ^# `XI2HR4C Fq "%b) yq, ø7XxJx`zvv~3I~qϷwN/~V;Z\^Cn)ӣH%rlo=8ŞYT}",b` S$2ԋK`$=)^AaAt0 l $[ g&a!ۓtK:K^!mE#Mr1G r7W(%%$|putܶ^MȲ\igkH CQ2uR/t]SO47^el5B]M.ȸxY,jҺПI¾@XG0't= FbeI:#D(VE 6deEhi\rcCXeoEEe9ߢw]*B~S+tU.`L ǒ:alyfH.h0 a`0 ^SBPI:̃p,zI7>Y-gݐxଷ)-J'SD.ɰ_-*X~'2Hl ŰR+\H1׶8, <4A-{a"MEhRa{ b#8[3Ųv n#tެ L~.>j#3_ǿ!>~bBZcƅWOn<Իq6N6@LE[DGkz-cXWFʝ&͜Jn]#E:;*ԵZIw;!Mb\jvJ\40:ۋlI<7?jpxxz<$].Ǹ=fҳ ,30BY,T0=rfؚxjB]n xo'q1{Y岣h~J5eKҦ<^?+mռzGK3%Dy.;Th)im#<di s9=/?`X_~=?su &kYf]!GKhp|C+[FLZu{oGݽfS*ت,z½IMnE1{s2\%֙&T'fzg KClhPm0 c`0 ^HJ (b@Ehi!ugh 1a!vJFv˯+VUv >M偸+< [wݗ`?.Li!aN4٣[+\CPuff;{ó~{uo%qaʭlk2u ;U)x֐*":g(,zs_[ab9^~Qm6 Z?$O"C-)%2&mȜ x7,qN EGyI(Yo.sl{f*C`ȪU-gģ- ̬YuvEeO{XweN_L$4_a%#lM@J>O&l"tiֳ/Mjʱ7qt{|3?z(ߵ-ާva1 Ô560@3DVlB_ ` `02;̽3ι)QK%!cLYˍvrE;D#Sz-};!-X"VKťX1to KY9)G7i ^AB< Z۾{g ˠL5hTqk.պwHb:'w`0F (?@ # i]p]nC8HRcFah/,ީ$|і&:y/^;!==34EngQ]QmƮa3ƘN ~!H- v+*ɬ fTZrEڊ$8@%'S *ly-Bjw 2sad4UN%M[Sw̆ OǏG[ F"C 7q886·v^"EuzqX,H- z]i!*khR}F \F-%~%n!P:ǍP v Y6ܱU8 y,)S wcK`0 @`0xq|KV0>uc-6XKcƉBJF{\*-o.֞eBtY܈EQo3D=w]Y(ky($+uK"φ9 FnRk;C~)Q q-*_ ![sxKF9w' ҘD1: lVy[و3~2!(RG=mVn ^ʁa*H/u@X*DVQ֕,Vq]?yb+*ڶ:X;7(D۞e$%4Cc5@!p+YlXV^^ZWoT0\JS= G0ͣ3vbE٧t=WWHرZK>|׿oK<)R `Jd0 {l&A!E #wJ=A]?ߑ/܋G+_ !7ٷw3h>{q"XГk螮Iܹ$-ivNጉȸUznJz6K_A1ǿXeJ5w2i& 37w}޺e<=Q hC`ѐ_p1 ԕ;̳I8!NƉxBi=B 6DwFhŋf OXT0f }n+}.E@gvg9})=1T%垞,Iw2osv4odƬr #@3S+@mGVPDGBn}d߳xNL AۄAA)6ɚqGrS@~\v vy/vXW41OBeE͞pWݲ `d0 Fx7$֨]) Cp{;NwE<"h[wk?1 (GH:xl[F*|+e͍ݻ3K{܋^shZZ8\-KL# <7#@Qz^ZqB'B>v7mBSc%JiOkm<"I\Vmit?vs'8P9Kذ\UI܉468RB=BGy?{V,FxFHcg=)RD;7RdKD뾋Bs&/v = ZUhds3u}J%VXeZGId'շvp[݉ͳ$P5܁()oBWm~laY[8Zen"2`LX+-ͥT|a}Ylm `:d0 F$y䳞)U x)s&|U10L7k'I;{~zn4e3&~MpJ+߸Ǖ0?3G. k'$wZ[@ 7ᨐ߸bKTݰ$$$G4C,%#Lc@7oJ^E^ހ|ֹ_a$9/;9x93BEaVsіk9B{';+ 7 C}4x u v:{ hl*&,*/Tfм<'}{D4i\uPhCÛ{5}`q(MwS ՏF%oܷnv>a߹MV. g~m`0F QDr8IS$ɳ}|=`Zxw?P!wOg*,jw:V4wWw[۟'jvK~Ͻ^h}aAO-<)kѰ"XfN.^bh>r]Ia5<+V86C#x2ǓǬB!$PZ_e|T|k!Nʟm_?WO bJ2UoQ&(uDᝨ0Z%$9yUT~I#8gbHXs(oԶhlLjVWKe][QXHsm,:"_s{ڽmQz/m]7[y%rMwQYCGEݼ)=C jl6L<ֿY/qL,E] A9b `0xA2  #i= OyS` RJ]a{}މTz&]Z5깖z)Ҋ{4"my0=vo+dyKDO53%!;9%Qfy^_VơND:xxo&fDS%EU(M@ϕYSfcy\(B@1fsQ+[,d4uݾ?}/O?죷^M BH5n0#n.3 g,+6LSBKӜwCk]BIj;DgēE ay`}(-'NjߍʹޭjT.y D)D{ !"I^r&q0iėyz0( (P YEHJpjċ^ Lb+ǻj!B~za`0 ^# `!E$A.D~a2o~lxg9_XB!ޗF@A%qGyzmv+?jtK,M(*$ưbPb|pZ\OBDN ?]ԸmJj8ڴ Xj({1 6g(w;pCu nHqotj]-`0 ^# `¸ e 8. -+!/tFܚ%zdm.Ua `PƝB:'a;1)'7CU7ndU%V)ˊ$d:@5-&[Q9&P|.ct"_St fnmĄ7/dp#˭/)?^x Gocg{A8H _c]o"fPx9׏{2Җ(KpOga%\L^zWxw4vz& xpOAr,Oc%z-..ΗRdg2 Q:RLA >a"R~?r$iSjخ=yVGT߂2_ϼ)l@pCK8o;Gl!^/nANZs me6͸X `Zd0 ~QC+`4fqqCaf;SEC3$N/Nw;b3]xIӏwNEJމ Q8) ZwBEr%sa ]ZHdϼ6LW$wQ'! Sv8Dײ鈆YC~>En9Js1 3ˑNFwg˯qo~a3Am<|a8遇7?_vLfƲCP,&n -a^_ %-rZU>d-~yNGxV7| (R@@ v]e(kbF/Š9Iߵ/{%t,ŠL5 vn@q4,t5nk;d["ⷲv~ 迕yDl0d4w*a2t!h3hbg2 .绍N csNR Bb(ZU,GN$DʾkL=!;A(%>woֈnv9p8g+PA pL FRR5qR曉Z Ձrg*g&oUke+X v|%G$VLZvy8Wޑe^}cڻu䌕nUwОzo{x[!l {*24÷c0 b`0 ^dgQ" 1Qrn}%oL_A 24O=^}"Ak^'.<4%YFQ& 1@ݏ甿#$Q-p]7v|6(!0ztD]|q9ĆSQ1#)%Fx8hX/lRU4I@ |w7Olǧ?~AsbAy ŃY -J*D_:[ U0gu Ev05Q aSXVůM?;Hx=-yMK5vF-2XΉ\a"4(+G-nʪ]MK66^dXŘGĸ{ge[y"Ofǣ{$%uR2)%ds q7hVs|0 /(F |q(M[[rFKH_qp;}fvemLS $zxWħ~>z8p9$La$+5?knXJX@u+,"VM!neD|KbDqn\QI>E.ջ:Cl{@hhHoP슴UKەQr%bGVZ}gHgop‚e zl{FV >842Kep f^k\j:d}Z3V#4 1`0 / D@4<)؟?#q(zC[I !ۊ3*vLb{:K+^y2Ӵw<DV 5KX ?zA⋰%${o!xe{?ڠLLyeQi#]wuq5 !*x>%v/u)3'%U ݕ#Ζ4PBWTZPOճg32U *=[$jfwq(f/K}ЁO9e1aۧ2g=1`⹨;GSpXx:l0 c`0 ^$=d #q(~جHjӻĵq'%w~A]YeQj+{W/?<;U/QcEp[0Y.9:yP:[yBE^ʑex,&!M\jbf!.rS+a(ǰϼv=ɯGt,/ʶ`)pj]d aTσulo-✒BGX02u z‰3(Q6%H^<=eMoڈ4nM.kLt1l[zcLA&TD&$Ac.Fsb|X3*Q4;`r`* " CBO'iq5C懺{D{ ] b2`0j%l*ZS8X =~˄Dv\aAVR] "#b]ah{c=5RJHD;*S?JhV~`0 ~1`0 / =)L@8 xz<( 2;c'y~F_\cze-|݄-w J[?J]xKB`g7o $GK,po.$P Kf=SN9~umϽcH_S.LA YhdaEqiмRWl& Y\f pB\ pvqUsI1t^%.dE"l!yN X塌9fZ?)<& />P&lp h&0Kkyua&a X wYCBʸbOYHl^X E56A{E{KKu*>ND: %dP`0xY2 zG;B,/ܽ4de066㩀pg+KUlI'$v!;k ;/B\]4 ǵ&g*0'Q^dI=C@v+>BI4G8/R<*I9,g(Dqf 1L&Ik|_`o 6> frz#33AB FzsdhޞѺz>˃Ba- =U0zPbE[X-"1űra-*,|\H[ *_!k2}gq-c㛔58#`E^I@JԺXɡ\'Ϯpo%eɵ:xq.KTerv,]2bgDp{ `d0 rw$Xt_;܋`0b"4bH˞Ymn_z/21aĄ9IA 䫏xxů%ZFDڹqO IyyX -Gݳ2rK GX0A `Z>Z"@ "s^NXL5 jtaXVY#xh?cWC _p9Q'I.ry^Xd:<0bK̍ꪓڊe&(Hq bwLy(>, {3tAel*7^B-*얷~:ܹmx)5Y^g-+ ReWzH)SFToպdcz} `rd0  lǛasA$]|?5Gۯ$hRڶǘZ˓ŝIIzHힾZHlX1&Sַ6rfFou0:x#˷>Ϗ_7 ϝ "=x f`JDVgH:IMHp s&m;e9lGQY`0 d0 D-[ETn*㝨l+Ԗ/"rjb[>\}Wj?xN;M==p\qo/O.N))x`,shFYwT{2 ##cW( YTƠ^S{w5 \XHh6nvE5$Є\rGp]o4w?7` 'Mσ2mZw<8Iu :}FRQ\Ur`;'n1`.w'm@*S36gF1>#6/.SԈ\eBwL\7]a?i=aC Vb =Vʾ3)Ol;jL-x\} kZ:`0 ^# `uPNdҵ"?N&:!B\ )Yi\rw#u-g.؝SzqrlES]1.WYs(P$󺸄(D?ި!A>[Yx%\,6qiק)Ɣ*ݝgs~Ad,ze,w7Ol0[m,~FR:c qq#&հFjynDA!a0y}K7FU {-8Cz tkԥsixi"WOاvPPrxy4D\QI<0=4IzA}uK^YMʃm5NH5oAv^i_g{]k@Qċ'ZqYוe`0x)2  rQK22d:nUpSHFZvPiX"Eu~WyhgkFJWs:D#V'4ȰK!<~s(!~S+t rotWؾIew:o{-(|G6- տGoō=x͑촩7LDŽٽ*"uUEpI'KtOeOKX]k؃)XbMh_"M!YDOW-S1Wz{ҋĪ Dc%xX2#%_>0yʄ|lhujY ۀsox.d@+i6ڻ: %1`0 /%cih$iJ47)$,0eI(#zDXĊMhD\L-R@r ân+6.fBz_J[ R{ /+>{q\cwˤZs}H/i _`5s  ssB\LA6}pb뜑`sO?Η_OD̹˽hHw4>wG%< 6+qO^}my6c\Vy d}X*6#;U Yy˳QՌ-u^giBu|'dUׅx0 b`0 ^sݡ?. J;X%88.`8|=r6rY$=<>Uo{&H`n}iȇ?/ _yE' eJ{:?$ Y?fn#R˶dze ymrb$T#覲EȶcUAM4D= e燡,U;F#Y `0x12 Kc q:E- vZv2)-U#7+wp-b  I`$f'ij4i O셺띋'îx"a;/\'x+VuTM\*=:ֳ+uR2Dq+ 򭧟x@0$e/ [?$~'s.6ރ_e!^/kAbM:$ebzFmU-L?jG&˰XU&Qb:ʚiF iOMhd[CLI/zD,n67ь;W6w96E@zk UszkzĹg!2trR'A[^ec$`0 ^# `cwxRȀ3 pc/D!s* EL LX,yF'4O׬_gI;J#Iqq{N)GwP,-rVn.y,O 2kɸ4/pynԸwt,4 ^jDiMKt8\![EР`< $3z~_ M1Q^4cMqB="JQޗ ?J|T^pb,ixZ i,چ0Թ[fmMPg"+վݪY*\gh'No^k]RAQGGDE2n7fXmr[ qȿ?uJA:[y!_ne̳. `0x]2 kÅL ѠA'j("2PBi(u0,o;fOU ^JPi>׬F)Az:,|$;+vx.JA]@'f&Ou~*]ՒEQ@#Hkaxw-+DeZ+HaLԌnLzp m0q0/#?Q\PP9@*.a}39;߲s..n 폈Dp"XC.G<\PWgjZCMG 3V!VAn]LT5I/{x(&$0[7=Z-(^뿴ˀ `mhx z[@0sZR"rI9MڪOb0 +``0 ^5j3g &* I*:X kȊ#[P$79toju>ܥBv->lu~Nk\݈8{fkc}{]?ʌ,4dT',ع=ݕdBY ,P= -P!P>RsdҤHt#җ \Zy//\yUoW~t;6Jn ԰rzZDV +bӔ5z5%߼ ݇y&yIҷg;o"јQTi2y/FнeLe֡i .&;,&jF_(8BOC oams'eL<<6J׻7=O 7Vng<}fGOxﴡR`0 _2 p[l9"<o; $iVRXfHed.!=w^B&++`$ZkZ?]-Ezx7vJ Q5 "*;927nT|/Vd"8g*,޾7\݀ Gd">x[N0nNtsC_XբqYW\G-'l*\yB ~evZz[-yH\7ErYytx4ptGՍCY OfoPxYVjz?>7?w" W^8=>)tF 0s  jʳj7waBw /Lv838c8D懶#ٝvߧXjyX5C/,=ĴA@MM3b 2JրEkQRqĠ`Q9l[TxZBAm#3\ePP (VȩOtc#pY!6,$7oi)n٠i/+mIn6.%hoEDBқ ܎s70go Z/M`8$!ϰfWʬcB - w ÚIx`0  `00ި$59@q&<`/KA8g)^M3;u;_,o\=L4Fٛi;cS|<3w3]ډx;v2{@js~%Z Z?\SEr}fb)w*ڙ?ABOSMygqc}#!A~9-N› @ 1"^ ]!Oةj [gZ ؈}bu>ډi V檼38/A r+S5_%<}(@ p- gޫ,GG(tD̙Tq2DdL :Dz0 kc`0 ^?}Kk[LSt0Ӌc8ⵋ]0ݘZ O0㮻1FIX( *[ؽ'B<(F^ޅyFTxhbϮuvͷBK]mL5R[Ekv R?Gbo! HF#e=+Y"+%޴NPj)Uێ2?5Vh㒤Iy`0 ^# `5_G߶cVa)1Pu +"x`31mCH w,z -]dے3F,œO??'N5;~mOX,Z$I0X~{أ oL?D[%eLU$*NG;k #.Ulss[:a`5Ea$YHAXixx4*:N;L ێ׻ב25 uX?j91uK^g-W[?WֿޕaWsjqiΡAxVhS.Eq&ho{Z4h:#? g3{mw^xIQ_)lɺO5#`jhxH#'u?©"5׺w,[Ƙ%}=ro.kiS7,cz|~ڔ.@Zj_ /Y"/$-RPVeֵ-|y*Y *]o2Zîz^c}]m u×24rd!jc@b'+jI49+n'9TaZmE/C4_I<(cBqg)D)+uT5Т[ WX<`Zztw<i).{?77rkw)dz|!G%-{HPncqUz@8.) uM]/iR,ճ_Lh/Oɏĥg-ٟ7YQψ=?Lw!7{!G|vg4 _^3[<ݿ?r;gݿty`Bz _7ۼ+Lf"`WAvҗXx*KaoSÃwLi>5 *VS 5pC-ebi?G"ia{SW5tI4DSRj޼C1m4ɢ#ef &xl9H r_uN:-Q`0cHXEcKdQ[-8)C7!l*It)biC<~o2*jv exϛP߱X7}1/!uLoh(вľ.cr۰Eˮ{1 zֿ: (h4ƪ^?,]jl31n/W :? ARؠU nd-2Yd.ӯrKBَ#-&D\-um--?|9|X}7x Oռ9<]<dzoY۞S瀤-" }SW 6 @tG}F_F ,]3إVŔPk@îFU%><$}rSjK^62٫Vd)yD^r H}_G^P_8p|޶:6?.<0{Tf),bkBL^Oy#Ɵs=orO_˕^ 3EZl/$RiX(׺?`%Uɏq|%~魯7[ z/#$]),ӛ{ vmz`)+ QKMB [k_ ދZI.O ,&e۞]}{ՄNq&5HSÈ-}=Zw kU$vIn^oj‰\05,W`۴>.{O&6"YIO}9V<:x$ Pd}5FOi &u[bUԒ.j->̣":,1uy)|C c BerӾ?k7iAM^sUFH)U]].&gG؉|ަ0(EϙCԠ?KhNgd5i,W(B0g{Wp p*Y]||R Ļ:;kbߞmqwvluVgABÊ% I:jU_U+`3=fdzGhxT5b&EܬTbei}-fc,mDěY8Iv@ ԏe#9\x,φ?sRy{${o#q,Gӫ}xIQxŠu/d-4^Bv"^+v嶦6UHBȩ~MwL"#Q~NoD!@ DP늿B53wvBcB Ʒ\j QPG[UrZXvŶJ4!{M>{x <_ݲB xu6(Ë~?Y.ԀC ~?십|a0IyrM|e>Ϗb'X4]= M{9Rפ6{ß; #\CEI{TB\$q9NO_o+R4MllU쯷k> `ooxnoۚo7cCXT`QF4דa;kWٞlNS M#H96|RuV۴Ӷ׷?y]͓_+uWT?[֗;[camLӕZ Jͫ<5)iwݫ<gO?|[-/-JGVi:c]+ק+4//ꅘLC+x%}KѵНbtkX,CQ(ؒQiOylm!6yZp!瘌}`Q4)k"a>^^{َNJ]s]諭!)|Hm,da U)P}dG 4|p$~GzbʓWx,lU-> jp</s^C7ȳEwuX3!֫*1|\V֪A+D!(k1 ag]KIb]#Tbk&;ԊJ2;plIfٴM^튕X/tOȗ)5m(_vzhUʚMrZlrU K"Ҿ|C@Ø7?αx% C'H覨adl<rX#KrİUpsQ[mdUxjd_5B?lg$=INAAD.ى!fO%<N%# U/0MhԼ?"+UV۴Yo 4py<(?Wߌ+_ ,HAۿM}}=ߗs-[)JWG+dCEPu v#R;rU+m}6}j#ޯ$p*L)E&޴_z-${ ϓ:YzUTw_,GyӤt}h䋐vrmנiߎEHl!)[-{ZN4O(Q! !"^d/qX0Y=<$F|=3E09vѫ-Ȱ"Y"jH m}yS<۽,g-C%?u,H)赦VI@z)԰#ڟ L$7l4iyv]oް4yP7MݦK}lzT嵔Q–׌a"9/? WtY4suCߕ>ovW7~wk1vV)dP{X&-R%zFAF:ܚ91) .6v"CjI ?RH Ovh@/O_"Λu< ՗Td $ֻpu:"/('clY١Sa&)^[lFųW}q(ljRH$|FBGeԶt{yU#'I_7uy:jFbn(wpb }TzI-}q[9C8/v KSTuצ L͍9zalY?b3vܽmdom1#pMR;~QQ>5Rv#G9uuo,ºm2{|l USzE541t{\E^=T\ywҦX 0bR<./\QY/rN,[၇ي}WOEfV~|z<h0Bn}{*w@o.] ϐ5@h O8)~97c'5#BBqNuqqy\I'zK>b&ua 3ׯԮ,u]v2lZ7b*mlX"pl}~rՠIPHUzM!^ Z4g85իH7:-Hůk+M7Y+ɺڧ/6#>#oԷ7~|<7"7y6[Pu-!VjxiޗxM^Kqa$It_6ex~ly'߷mui}5!YvVʡUFN57.gKTX ʾ0dZ%oM>0ן_DX6oURN橶,5i~3 wsiZĮ,3{a3F‰͗Ov|mwNADd>_zPz|H\|_Cp_{k0 ѱX7j_nKqs(Y-Er-UEt.4 rhFJ"O'ƴǧݓ"ɶbŞv-0!лMDNX*y&߳5a_mV;QZiS2}9t ~4];O߇qXY>*Eo=.N7^P|$l =e4Y˦i'>_-O#,*' N"|NаґW,ʔ|q'i-1>K!lP,Q {듬@&>+nWr>~ߗ\D{]C]ʃxޭ#o|q՗#w` .* ^*Xj!NjZxIYRS)P6'kH-۴tdu4yd5v{/褸1(#vb9fRej ]N!K,|Uk?`opiX'E~oV,Z/^ Ŏzfl&c<Ӵ6d/pӚz$Y[jSF3B@#!΢&bڬV_nXG纎F9Vgr89 r苹K8ǯwp4i:%v\dudD$C#8iw}%ݖ6aX'+n2I/riSik$th>{i-b-LI}9> ay};ym3Ӱ^Dz1mzd3=cf4;b6 $˴8?2Ú?t} KtX@oUm([q[Ͷ{J9|C~6V,^b i[CweQ]T >LS&f NF8̽-$Ǚsr磨ʋ,zΘ†#}&Ni?C^~tY.Ge %2 BF:~Ӵ{^+ C;]t"6jZ$Ua-X)uO\xfdZFɛC<^n11AJ>v B ] ߑ敬smb\ JƘLm;M/gҝ%;*8 qq:CA'A>f#Ee+c 1)Drץ kj Bbj0+tԩ*2grd5F PV *i÷Sަc|CssN7 -ZSwNsOM&süfQqXM%+9ҌwtBe'_#.$/rL?NlKK,n^F9؈ήk@҄:ʂWC l<ږ`u'cWC|\q pMk{$SD9lX톱[GhzXK= N[ɺ?g]߁\_W\^o_an Bb} r+\EC$Z ZY֭j= UzY`{air{ wn ܍T)<!EWw'[I¨HG{(6?5>(ߦz:_{OǨ. e[!z-wwFԵ/SpkfIMxl'8݈~b*f^Jn)ݐkG)y+_F<}/sVS{iH+ O×6_ǟch0nwα'1l_Z_k9yE`@W;7gOՋįf-F;5dŨ߶+U+-Y߿iזEkP6iIn/VV9]Z2yu7~=R)g,sJqǯ}IX9?{Rz7бJ7~wpk-HvYH%+-Dn^CWؚvJu 吴 #>/vd]2IIKv]b!(MkќôG}r~y2EӳR'r^Ǒy0=Kl\I󐸭 hNγ/7b#Rݭ.)l9pi|{O?^~ҥ|Zr'!])>( FVJuW/ R%ɟAa_eX2؋/"#yca];R&YGV:=Ts GVssXJqƂ4R!.f_;\Pd|Md0zNŪ%Hq ?(/@Sb-^ _]?OVl) W&I3r"j7b5PV֮8ͧ/ݦ5M^!' E԰ꘫ6/@$PqkNYxy؟cnN}ܯw[v$UZ)*V˚Nz*d {[RL}1*t2žԱRsuu+ָ$.y죞Ry|=LOw/,,C5@cDu-RW?/yXaimCPHOcv׏vfTQ`[fd?D#[xq5O/SnWhI~'yBQrc|cWK !ɓ4b39&shԕN6k}CȰyQ\7dSn4\&-ZTA3m> 5($o-I),[kyOV+(u4;t~|[uQ Ėso;٨Z -RR\{4jWk$3ğC[ |T*u9$|f7)thU^sx.ŵ8 3kw;?=gs89TC*[BƋIpwTqIlgCE/+_'7#v"[?>~iփZ[S&{߮.sսcqyS Hk,O7|cl>.(>E$v|4a9.&{t?`_?Ub1=~sI$<(_qZb;׵#Mׇ )JBNzհضzb#aCX<ɧ1x+d5:Dwfm;eͦ_;|\vy;k>pլL-E2}fdUCk:;DR[ᏞwD ?|KpdB5w9F>&z?a~fbVcbB ڦM'ڱO`nqUmmBVfuX#^IaXԯ,~X r[k>6Eɝ:_47'p,T-Z%铐!pVGci(#-x_xu1t[z#4B,X,T֑RV*哞VĂpԭזmk$6Gt[MP ]ɿWCQV/ ָ.mHmilaC 5i"{HRlԝ9 aްgJU4$.n1hxJM7 |$t@QX ?\Nq^Gr8$싾'JYse"PXa}Pr3Dž̳x/ LtI\V)vĺQ|^4InߏU-l WF{kd֍xRft+_# AwQ/ۚݺH5j q]8ॴ-Wl u[KE,%V)2%D+>L繮j^'L?\S${"}<YVͩ/,8. ޑ@6b=Տ>W?R(e4HzkB[,ݪZBdbv߼l܌?~c`Eg}7ٵb]1{.ǫvX_X;?{9CiX$C쓤G.>M 1B +$~^or伎rT"#a0%lG+,PNmcE j, KG۴_3DzϝSiJY/[H]wo~_x'f@^)cr^ݲnP -s%P^^\})%Ro}?.yżgQN:%kO޹% !H:AV:j71Ja4·&VO>IxnvZYcz (V^X8 !~E[:Bn,竟& OjgEjbs ?Ņ쉐= Y m9Os r)rsY|-zE}S@vn]ȝlK)32.kWޞ-:Yw6f)|=IWjy"kkqaB ,tV|0GݯEu+ еkۃee-hÏq`E&yNCp_@vEv;~~xpB7 M*RaN<{.ktcx,aAPHt]fԞ,X$Ytyߤ͕0;,}F3GxYpYfvEr-GpFX7ds_X9"XqH :"%\YƵB$.^I5&{O"+'FL$uqsXsc/K+?}`OukiĨ ~LŽ~Q)tأ`ú1,HXȷι^3radNC_r?EwZa4FHۥQ-lx??Zv en<%.'5-j,OI_'`+Z냐}a|gdUBjB~Ύ o N5-O3lkgZnj:$ kHd?e kX;^\#5rnG8AQK"~-7eθ&{f_"hAAM|!3^WɃ2Y}rbI|$ i ˑΒ1p)M lSjSGret^`>Z|vs^}uX@ EmCdCx^ܑվhF/+SjIԥ{'[PY}#a}]iL ƪFKGNkmIq>XXi z=VRkuxQ7 w;T6$u\Vy b65Y"aW}4$8e a~qX(>1IIm3HD`e,ӫ2\m,#8]+q!ܤ]6nT$K5bXlΎlWފv8Y\PzsGOo q򖍜j\9[E$^o%r3J "tOrxCt|9Y>9kGukj #vM -VMkt}6䰎Yfm^dݐ {XޭڽC1J4RXooWP?.B ^ lcAHw4#.9">Sop7/ Y.A)] 5B"] 4Ű!zv"ׯ_}[6 OXv9Y3옼)ʳ&0;5EmK }x>vPz&2]];"ZO>+0+$IdØI`7qsx {kԬ^uUڰ*G0iG6meUlu{9>Eޗ`/vŮ#qTo,yQ̂˱D&Znw_hl` XnKMvmg?\,}z: <|HuɎ :L}§]m{?,@֐!KJ/9;kj;8lHO*3N"!'_ GpξtōYw5 #h"J\-Dz-Hv>Un>)YvuO$!8^c f Az혻XnqpXGt=iQyI6/wʡc_jhC.a^ܯ9OkD ؚUR{ko5FcJKieAQ;e]%׫ Ƒ95L@[5Օt2^uj(]i,J۶(7ߟ9O,T)Wj Sʹmv@"+!zJ1To}Mw)V'itBSN`{f>N_:褆a -dvC)Zxr[|2~^&<޶֎aNRGvj<{.o7 -VĎ-ٳ "1k(naD l,Pۣ{ ;?"df|՘L/=__oxvX7E% ymdM?wIXWd1y2$lXG5KK]D;9z!+Qg'5gT@ހNjOӢڗ_HY%-%icT/ǻċrr݄rY.rX[HV{HdK d<&킨 !2kvȴB3j%^R랧 zX5BJ_C=Ȼ+B5OH $ ehc㧁ڑakdN'Rx$&Y~@A\ܼqP_=H"xAþ.sZ~ʵS6s i|k^;}GǥrW??~/px" RYj  )׆uv~O1y}wU?)-vW5ө,5;%B19&z3#4*sOo \[/Y$۞kУ!~v, u :ۏ-坧w.կciʼ)AVƦZ'.a GoW Ǚ0%=KFmG(z*D5".^Y$fx;w^xGV:H|,bh[<ue?'-)ՐkG@Š 7z=L<)O3H&M)SS, L^tclv@ޢڹ=[\+1w,ˏ`Q ZV*W QI+w ]ݗ\Ts(ZU_ \rC{?~5{uSnZ/(ι-'q4t2xF>e!r0tjPҮȩBr۩CigOʛ=c\XMMuv] l' ie#IZ+2O˵\`e O?^Ȳ/o:7dpn-9%N9~dm_[?)!C"kRQ2RxP:>DlT̏Sߩ$k!HK0ڙwL5&,r^z@g"6(,OUnvNA:} cz\I>w j ijW}gnJXX!Ċd5aBvQq ?-Imj^ǟ~Nd_\jaO-,sQY|gZmcr,Nu;EweNzDFoJ.')uGn߃ܞKjfIRiY߀Uh05;M\u.J_Eےum8aBpXݟ~7)6:ON a7BaVL%KZQ6N1haDR*tjHڔN\^KI֕Ǖ&oGl7K?>՜}1縌- ^ۆ[:Ca$ w?鏐_h?HEye`lM Z+Z>Ī)shhPl eaIg ]I#LRnf]Mi㷬ÂX5BI{1twhT ɵ+QQ\~tt e0H'`\R>N_O-ܘVs6}X"f}q,0VQK%/$eUBYS8qɧU&@)s s=u~-:bk<Χfa,bD38"*ipچ&bn +m쓔5?r(΋u`E֬vMX?f'eUJey߶B:б GxTnwTXNiK(:s+wCC!{"!/'UvB!hz5Ҡ*;뒬F [`Xd{nc_vCyG;@Jm(b:?<n6(iXB7j7G3O:O>t-߳gE75H,+{Z $r?A ud>D bvCu: a5$_^Ԏ{G:ێ`|NZt i]Ũ2Ko?!-H(CKG@1LMmtz-!HE"ƄGB 0>s9S!RV-.a]K$l$xf+C >"\gOztI^L䴷-Fetŧiw/fmrh?p&nj%JӇZ1tuڱz(]4<[A?!m3F TpXQ?N |#iBSM6) <n,:Mm{h<<Џs]/%8CBRYgɘLjٶD@X>K eb50wo?{^ oJhe@\פ;75),CܶtH (1~#"Ftifk T_HZH5NduF/R;RR|mlM^b}jʫ[VPcQ׿w xE(QE "0bb$o^s!T5H-el3t_j"):rjlH:',ZY*~R(vHX =0V vvtj? I}R:~j5Ium`֮]ɮ?|E7 f?1}9pf _!̺Do}:Dz{)ϰ%2!y}:Dx1e9:DbѣGlKdCO?ˆ=CXGpI"v E`Fn" Klȗ_]ekׇ!xv` Ygꃑ/y+dcC0Gtl15\ @~{}"`NCC(]!9!2Š\.(0 3c]!v%h (bB[`x?fC rggg]3Cۆv%M l8i6 & !3pTqt:C @8CFdeB3q@)~0K %@2!Z!Wႈw#:G;CEFWh .C` "?cmECs90G7~6Y# pus(c$"k1?+@YFb6aQT`YM fk\MI|sΤw.أG g@m\ Cum wZe;]9<_I)u?g=\8Gw\w&+X,w+@^ xCPÐ?~UÐs/p.>9xWÐE_!/BEmAB2t\r0d ᢈsu!/BE|Ma 0c(<P!(|.(pQb@P n_X+ses [ yu>ΰvpQ넼:.Yc }eW@uB }uZ  A^%eƱf_^00AeJxq?^(e7t>zh "^guwoooW?Vէ /@zAİP}Y&`˺5XumcY%}2 g1,xi|˻xp(!ș\a `!M!9$ ^0k^; A>P} l!YV7iq؇ xuANNN1 /R;` =~!c  "Cf g,"9`pwoooW r:` N,#p|/f !Ȱ0z>BQCF Er+7bX?2c_{Ѱ#c17X,-u[oD_՟=}C`˝ ;:B' 0 a xMYR冎juK0unPpA ~FaMp'`.@ Aݽ]v>/>0'tL x]|݇ Wڝ2^f`" :xm_w]v p Ҟ0ú`7{  ^x(|bu@FM8CCVCCX $f\~ `@)@V,a-bBoݽ]6Zx":`~#05oҕY^/8fp1(0s ިryW}9::#q0s ކx-U0?R}ݻ-oa _ F_fG`AsGm݇ 8w?}!e"kOf՟tx]ju_0?%? :~#]s| 뀌>}zUݠRA0[ ޺ryW? 0̜ AЮfEq[0.C XfEr؇ 8,(|fhn!ȁ~苟 3ԟ_`@\Dwv 30F"uЪ ?ѱ`(# ųg]fv]POJ'~B9#p+OZV5a >1:@`@\@/{@0K] @`@\wv΀eqegg>ߋs].w` Pg1с9c`X`1x/>9 Q`=0w .{{{8UJ3ufevegg>z8HFR9.˻XC\R:fh@~AD`@wVJ}r(§E>|# .3E`CRJ{`]`֖޻GGGkr,xc#.H@>yxk8HE`\ZC~0k?wb7y!ޚju B7΄N r+0c}<,?:A%"o b`b `X 6;CCyO:AG}t,"n9@00;w1spWYy{ `@zX, W}fewO_@0b-070\ \. @u\?E~T3G`No la#_U}XwfC-Շ='̉}x 03G`nWH lRD`(zfeX|& `@]: EVLp!ĺ.#0WWvvvpE` P0\DF`E]-@cϹ0 \ @mKڵkPh!ѱ0\صnZa \R]䮻/{IaOX,t@@CK?v}64-7b 溡 $W5vvvr!F!J7:v2j:A)p Arf= Tt ;jbt]^=si 0 a \0׮]2`#=l!X._ NZv\~|"x kaahXlB2ÅYg+@^l\hx(> C;?H<'8_xary4Ï,x~6tKEXC>oMxFLgs[ F]~ES3g+aP5C0(zE{gwmO2~#L˹=,@(hO/%o6;]7 ^ʰأG /޻\i %^= ^`Y? ^NC/0WC'u!W0\\.^xI׮] B??~|Gt]I?  >T{{?Їbǡ0 c=ss~~3!{rrwRF\jX.{BZ> C>/f-;Ї׆E~k) =^3?߇]]XPuϤ;F)%Cm:<={6],?[VyWF8 8C!k A08J_}6G {|89,X~?t'''ßw.zx;8\.^`K -7N1G+pMqBE9}V.`(^0"uÇ?`; W;~"3Bq{9A335\AଘApy`@݇ 87\ 1@ɇ/+s[u /E':w,|݇ W ~x@nΨ%}w\+cWE=|jTpVJ}}WA<~ P/WG^W: vLtWB999pTpVwv;A”RJl|݇ W"`RJ@`K釂39.˻8ͭ~.`]p.{iugqߘm2M={X87?/>a~}ÕMP7ZJm [׉kgu؇ [n=|x{݇ [hX&x#NNNn(K+E?G~|. ވ5;!9+;;;_!pDZF`M" E>?}"^?v]K?}urrBLi>/A ިVOgu[ѣON@sD(!=~NP\>dS.PF b/ e2\G Om ޚ86t5 `k\ | }?|s-# WEd%fŎGr'u jBO)%Շ(v0__Os!"!=xhZ}*Ke:ч;-`!p!<~N.a:`&] _o^vm7wn}s5t} \t .r=\UOc0)˂X.aɇ5-*~`%R3QCuqC#49 0_wn1 p/@\XèZ|usÇK}ڵk}Qp>/-Crg{8W}qgҰGWm \p'''â8ofc?ΣGn~KA,pRJ_];C(/ێjUyw\~)`h'ч Kwp>?p #?_HJ`X3~ڵݔ <}wo;(RNNׇ?~\.'rEGa]p_VY,>|x$ARڷ>:+r0( hr@\ZÈ>\.yE\I [2R 6 ׮]>d~B Cgѣ{O? 1r8~*\L󝝝Û׮]p^71C1tO3|dX={J,[ѣGCOJ|UrZ_2 K 2OO4 qZ= ~s%rrrbȮK:]dCNѣ;p u[dXO +,:`PD@l!T dB:ޮpIJj+rK]QX\  Ǐ?9! cH :` t}WprrrC5￿'\p 0?|,ѕ#ϟ_ t=A\.?.00\P $[s \P fÇWէ/i$K)4QX  lr_!Dߏ]Fa.*ѣ}Zsxڵ ,|Hbf: kW@@P|'/QX]Y.% 7:!T1`V@8cGpvB lw% ͏禹V="V AnrkUu]8h$wr^En }!|>x|,U {ď:xc]ULla GH{yZ7N!i+,m{u0AfEQ\VUuJ + 3-g*a˲i1>99  i%vk8~:xa-f8-|LxzQY/ Z,g8t]w7~rZ8D?F=i*yQ{Jާ/ufF'0Wa*}>7m߁<48)WT`< FYHFxQLӶ{4-jU "@v4swQ~G(-I ANHU W}/8]SeUUGHH|uCC˲<##m{u{!*ucUX<'/ȵ6,v k3UX<'/NmhUXZº xߐ_T7omqi.@[< !TcwM:xB'u]>RhzB/#UX<5ȧřj`)4_q $x")Fg*~] Oh:} {UUGI״| f3IqY$xM~o~P[747@IuNv}ؚ(.Ua; $?rOvprº EgOvF#6R`zu3NmTUuH0Ͽ`ײ *Xu _!x!M\ -tǩ*,K6h(`ݻwU /(6ř}Nė`QL.: ؁凎GY6BXzGU$`W0N۾?u}+_)PY Ta +J\q-f㴴il!xe?7=v lUYVal y9r:*2`N0 b{gu]@l6J`#UX[MTaNgKlº V*+ {h6:66UX)( VUu]$Siyf lҶmQ kBu1A4JeUUGSF)$pSg8.r<fOFV㓓AM\6Qٲ 88X7b6rkC:*28X7dX6CZnUu]$xCruÐXtDa1yșX3?u {pp oP~fX[b몺/"xIa UX[MRr 6bYu(˪ x0 7"Wa~>,'Aqmv]>t+Pyn 0@?-gikom]Oȃξ?.TaqTe$g;IENDB`nrepl-0.6.0/logo/logo-w1280.png000066400000000000000000003564601342636505500160510ustar00rootroot00000000000000PNG  IHDR}[ pHYs  sRGBgAMA aIDATx[eWvE~E8*3ႍFQ.A6+_LZ(R1`Ma+(.[$U-UW$P JkZsww񍗌s5"׳1HjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVuW|E(zc9?e9p;wD;뾶,ϱ- 9XwPU/u[[sco;߲~g;Ǘ wp"ڿ{αuOXۺGmgv8+;~WZ?{߿'VjZVj>|4R&/~6 'm!]g)vYXb;ucKcoDHa7ZG kj}LwB/G-'?:WAZVjZVuX4onϏ>:}0z&Uc' M[ `Wpq"+h:lw rn0s?ljD;҃ XfKx^h}ow_VjZVjZgu}<#W5ݨ;~&5E=c䢚F,ơ+d;+?&S"{GW܃fѢqKwysln݇f8n1>_| jrdpƹ2l\M-|”+oa^d_3(xbmh [o\'?I?^NGG t2 LŅK?w^NVjZVjRWP<ZM{a]l-YÝt(\Pb7^M y"vl<2 mG#Q!;'`uF}:C^qt+bӮ9#9"ߴCc+܋ D} غڜ k0"GOzS,1|cy]qHnlh<h@$ (ug!O\pmG_PcjQȪ(JSJ_v#AHCmds6h'`V>|y˱; G1#וG{$1ΆlTz7֏ jZVjZۤk[ۓ!"\%7xaHzEU=ՃC HC ȶ83T:sV)_ "0u;*ɰiPf需[ -!g/"# 賓ut[_?flZVjZmе0sZ٤a`8 XVU71+PD8\m9ˈ*@BA+FD[ eA`T5T#0 ?OBzxoCB."2u;?WhFn=ޢ(ԃ0GQt?֡J Uy9fKô WK86(t9[OÇ|s)C;<*Gqgr0xnnm/VFZ?{/IjZVjZO(rvV/0L/aaU!~M-?r*9w.X(iJ}C8L)%|00@T^A~w])bTCNwYRW3/=;%wT‚;?`jZVj6]. v`cN" <Gtn/V͕Ѷ9 sRW9R l{=X>oWV/~$1Ra˗dss2mϞPԮ9MAErmqD` ~[=/[VjZVZg~x;r €q_82@%EQ8^꼨B0ޑۄN(|f>,Xr.lR6zg5mԂYX E3LD:4r#™ 1lP&1ofFavW@9묺%:|7 X:7=6#aWsWY/@1YU ;aVjZVz2u%#xq/6iTF^(<)u=8\pZ{Ҁ/Â+3aλ7*F"jXbl# Yhbsآ<# w}b zgᄑ{VY{h/&U47F&݇yv}2ݶgep8@{oÂ[VjZVz`O+xZ2?t!C/X sF g Ε!0 /%$,HP'@ kFE|џץzOgם ||d÷۲_KL*=h.vXxZVjZVIѵ9!g}nՙ^Co=XmLZPYwŻ ._荠vfnJ5 o+V9Wd8쵌|Oan}j"!#VOjCWfY~8NFK0 XC0FR?fh:[@_ՆDDjΈjƐf[ t3ghCz-g9MNs 2tjIpwoVjZVzt`_T(U>MxPTa_8X3g?MC.]‚HHjZVjl] G4@tEEO`=S<=;rJ8$ZǐɍW9ZABU!E<`\˲I^bUxp 2 < 2 T9B9 l[-qk2EMpЪ1B#N*e(MR'KqmOܳ0+gpX:,jZVjZ_uЪ\, j5P:~5;SpA32XG@Pֺ @5KpC P&5|BFd#4xC^k#lr\oC `wʼ%O@rFQmA}^n!J_} > FHEȾIXvSّs-,7o|SZVjZVup @Z38rK 4\?b8x *!S07ʧp vNh/ *|Ob1aF=cE"$*]^ӝe'4-8tI>>Z>b7"sB|]V j7PE*b{7_VjZVj ]2/q);EmD03hnɵ:g»\BE) ɕ$t;7TX`]A&'iz0(F;^nPYB')߿xY}A+P^IN!S;\kΝcL?qNs OjV Ma&@շοX.wVjZV"t \P9m[)LVθpԮq@n  Ć}87È(UcÌIΗW%iX>!2sJͨe@LT#<^G/}w9M} P'mƢ NozvS 9Tu=ET5)0dSL4Y^c;[jZVjZQ7ΰ?AkAdG'*V`IF'^̃d(Ku6؆ lEIeHf9}h,瞕؅fujA3;&yt/sp\+^|j s} $Ԋǜb2}MG?XfEUmU/mxEZVjZVtm0 djS= Rδ[ xcK_q?Eq `X/%yt(񺀅\?P qTNC-R S1e<Ϧ`pk@Tk_,Ђ>`z!`jw9bY>rkuYm zh:r];?ц4Ξ'k`o9CnA/CL%05K"Ѽ.@4^\_Xw|s ~ZVjZV3den!Nԓ Y:F'\Prb~Az?c;])j. mM瞟Px!,U%a1ToD&";3Ge؆O{>#_F\HfwQߏGzXx݁;py;tU 8mbƾf/w!:iy+= nZVjZgk OMme~LQYwWb,H gn"[<BX~ nZVjZ֧эBԁ_qԞۃ9,c BM(8/s6h<-<|.QpX%6ҩviL/(8KoD`_d[fR- ЄXbhcv$^CMÿup1,fA SC@+ru N^5u3-9Ltun7og;+y"g*TQ( h1}g<^/HjZVjZSWeTz 8͉t _ҍgB+`uZc' cO NlnHNhوrqG;U;$FѓM}15!vt[‹$t4mغR9Pc.x}.eC^dB]r({#^2] P^=dvp`=C澱 5fӫ[VjZVj}\ T-wILΠ*T@" @τ_W-pf6۟&StLןf)1CE%3mn'NPiE35INr0HA })+&Dq3 ['߬O쵀ȓ\wpbsp- XhHo|js6M~Q`Ȭ AB\ξ)z a[~ nZVjZMu}\>UtZ Đ/o x<1wpiH!+8be1\&/*vi1QƀB$~yV~ (O8:'`kҟ\knm]e>(]+W_ _t17'`a*%^nHo<<}veY9Q%SoՂo jZVjZxP.MҫPxL|\]_6p8C+Z= ڲ<Sᴒ,㥺vK9xR9-||ro|Ä2zҙr=YPUt^UUl_Vs_$+?w?ziZVjZV]N8 m li8%फ़1KT-\yg4:nU#D R_EKN_6l %1# 1oFdKZDp41eF@Ǽh]o(_QC۪|񑽕gIA QN*4`ST|v3I?7&`N04)Q\=jQ=t8*sxao~{yGi7`jZVj\m.JqAZr@,@U8m3!L*H Nd: ]˔`p6),`v޵pƝE̾V&l!m~_g_(Ѡ j wWjl1ãg 9Vܼ0zMn*-' Ài>_:d&,TU@#6e{fW nZVjZJd(T^sBE-Dd!P/8zwVW QCpb 2@Єy)<8+S-\{s%Fou k-hWᑤ}F#3a?Q V*@ra?ox/ty;໋zf3%,"͂fOi]:[jۮ#.<ye /8(\*^|G_:&MKآF< WfE$`]^9,;q|jZVjZ4mj&sηd0# Wa=t g_6G`^ in/T:VPr&HdH}2&Y9XwНi1eJm7Op!`Mhx<Z*' نީb06}f8 k6G:ah ο] Or;ٔs3THDɅm8ٶ_jzmhGT„Q Nz86eU%c !l.\u9&蓘oZp[VjZV" Cn`WuQTCMn|sxIVƹ݆bd{k˓ 'S+=q$sJLE3Qh(̱Q[5~uDhf]{n]e`0i4;܈ 3o|.v0j?IZVjZVut}@pp)۶x g\!̋ 鍗Zp`|UM#57utC׋ppy9[ڇxPh!vK&k}5XCH+{{ͼpCaF&Ie/0{>䫽wVk*zxrf{f۝|avB|(16el.%OGLLtONL[VjZVJx 7_Tur~mr|je4 _l-եKޮL0ܝΝBpǫ>d :Ѿ;V=h3QqQkHsb?\شÁ?u#|v |WIh;T _+ -t7-M1XDv쁞5ne?x|3G.@A\ߡ0l916z8\IVjZVz*uRRԂtC֪HW~$k2GQ{jD*lƯOlC\&' &sOxÆ KeP#Wu˿(,܅h.ѻB9j݈$F׌H8y!__G+jЍYtT@p YP1 ŃYA1*`MG(> P;x3SUPo RQ:uTY)Lx#& ,~a'QZVjZVut}@>/FiwPVK/᜿J7웮677B|Q1@ՋPbuYXUBJ蒲S|K?"Xo 0Eҹ5 Fv/TXu=N_ 'F??Woː`%ԗ0s4rm\tvb:~:іtrX|A:X?{Ӊ`dj=a{u5~"!VjZVu;u" pd<`F .6@UTdY)7 (n3q`ᆓ0e39sDTOSWE/B1fc…%aۦ<n4ci&vF`cv_ÀV'n\t:UgǦǣC[VjZV6UE5y6 f kKG/ ŋ,Kx `B8s''Nh? VjB(#GaܕQ!i h^*rPL^%:7˨9L 9mο5g2DWs@dw*/6:/5 JΊ#B.Ǻ|Sd:;8qz,ijVA e6>[[VjZVu+uZeCJŸM2+YI3 -K97 Ja6D\ Og6m"*ꄰA[qyj~10=gXը.@>ԻPdžz~ljL!6O9VjZVzu dÌ3QّQ~ 0 |mZ6X Ypaln4^ 2wq8i:Ì *7$S% *B|,I;UAOMߢhaŝCCM?ɏ_elvn"22&˓,aPϜ$ w_G?*} d/5qtE=\Ogmws+Xyܪ,"VjZVպ $GlIƅ*qD ,)E*.Q98o8␋PQWN|B& u#:..((.qa 8[ EH I9詒PMemZw!0+@M@U3 %FpoQm . xޓE>ͫA*:׎9l_~w*qp!օu/*C ^d_nZEHsXF8pb4a"yzNp/fU֐L+@0+*sgYQV12)(N[::S8~*OMu]/2~iyoݙj٥jZVjZۦsJUҝ1&s E=vΥ4 %OL"!ޫUB TPуI@ͼxHgq(%׋^3(& o,ȃ$ABA -ۢQ%":ksFe0xHH8:FGF: ma=dY59\Ex`Q8R?6tI'G;b>˥wNWA9rnӰbf~ a6W=tnJlZVjZۨ+(A$JF!~ʩ"/sIrzV^M'-<"sfɔOlEү,a` j N3P|~$Xǜ'PgZ/Q` Gm+CۋSXp9Ƹi ̧nvPnjs~ʿ)uSL`OaA3+À[VjZVꀰ;{cłxsOPo@+û'#T:QC E! ?I#I@jI Fn %-U’qN@b -/qmaի`(H+* ,ilMr9GFuHq~!g-iׂC'W9B3 4p=Cu(p}qK1e }!a1]jZVjn j.?v|˾ Bp!4wK#%$Ac1qiD4d*(I<$QWl׆K/Z]5]ՊTu <"XĘ,ru8-@o^Df}A;?_n}9ޭސ&ѤXycg6>אO3!ܦ`4BKH̼uGQtP|0Q`XfB[?Nd3HV]-^mA.9\*sTF+_QO~^@C[VjZV6`8h s"]U5(16_4X;P^ BM¤zοyƲHh%D^ʍKFlC%A9,F*`;# \fXJ"VԹSmApkwSqao}r2ZZBs~b_'9r P1'oΤ L$?n˸ sZn|c}Bk[l#bF|$=O~^}ܫeWbh-BnbFNôjZVjZQW;R>]@@pa8HC/l*[ τ1r(u:> j]TvN$ @,&\mbW9 ;ּZ-,C>'hZ/I5 *) G.h -v+׾{ W9ه[2nN,Xt2>8 O :d<1|yתmz3j~jiR95`j'`לvv\ۀfr=96ZVjZVprĿlc sal.!F(3 62?dN?`dbVk/O$J K-#],#I*ZXؾ"c~hG.d`N".K `;'[/8C;n2ɊїDR|ZV|y(:SZbJ.ƏY4C.;{5Ex.;I&6gh`ewf yt}%O=9>K=A`jZVjZVpj9xFpX+N,CQ R͐Y?Fp&SFMW!^sB7^ӫrri t@Œ+ܵ.I*ߡ)GfGv`$rcbY<%)AD7 @ RUrRur_(",ȵZ[\Kݸq][NN¿-;.^D> UuC1>i_$#  dL Lb9›ek?0)w%Z\Dv2 ; þ3-5ON ssK_|pAޓo ZVjZVutpW Æт(!302 |+Tt @cf "⯦) d a|jRB%T=꥔ذ+ЬqbV9jмc&%I(9F.'ZpuQh 194a`Mn\w;'מ`9r񐇭ϒ D88Zicg.;8|fuU1]lkfCjυ 3 8I[IB0EXJ(n;UD~޲,o945ܘ"Uk1ֆ_$w6:;pIG:s+ByG[_#koj)r3oB\7XF 6i=djzZVjZτaάr9,J  ʜvuqY !Y`C(2m,xp7 -}RqᚕX眯]üUo_ N@&hEJЎ( HCBZ >:A\Ϻ/KOw΃3y Ic%fR.0O8b/U(3<6W `c;ȅG=q#zX,ݩ-"-b,?nj ]˾U13\ea9sL良N3$m`jZVjRK69D31PD"G«\ ε% p/rD?ݗ^,w֏wa. R>\sl>9eGPǡik O;UCDzŽUj9:wӶ5nm~e:~ vQ Mǰk@bA=@XQ]VjZVu;u%\lO*€x FUt!<΍5xQ `չpF9N@1ϡGzւd3I'} fo;aBA`.EC>T9aH(DpK3cܖzxz޺p{AN(*?̄Ps&Zl23XNDՑ+X5ݷ!7ю389P t=qK|l%cPgSu5;]Be :!$9I3vB>[VjZVu[t(xqrX40)8> $,xQ (bvq0B+tb;iPFm ] 1x}O_P ,m0ܺf -X*uAQUA)! Av|jW,뤘ط-kFpU FUW$  ^ D)=5­FsӂPTK0vL>O&sN @|U`V sw 䦢2\8yy?_ 'CKn0( Mm3_i}M޹gӅ^Օse)p&sHv 3!VjZVu;upvy W Yҽg]' 's%L:_Q-pκ"e`۫2 bУ{W7v vap Q={@.C h V3g^?^`SOr:1(#%1_yþK΍} F4m偐q!jY-8pK*f2t$wе(mrDOWNۨ ']D;ar~ +?4m#Aq6ݾ$i`jZVjFݠwF'D/疠ME8TaDMW* /(JwT3CUnAT:5[܁{*N] \r=Ͳ,*pZD4}`K~m`؏B/t' g9aLEOt Ҽ(1繠8n?C>5~,cy l?v62ph^dZcYs>14g{fx 3yt.="k+=]DŽo-]lZVjZ[U.$ZCޢpE~(t*On!/6#F !b6'aZIhm׃MUy Z&ޮQI7@*"ls4|G_FqV/zNg<cSJ(7Oǒ[=A<ox/`'s FW?>nNWɂ@*19 &](`Wܟh9\><)b<ȂŇi$A~56j,munL8e N|Z>ChB`VjZVjZQJ  ENDQ޴=ay*(G/ӡ|T2ȵgT@1D#&qH_mxmR%~7=0&)H&Ӫ*iؾZ :>Ia;Ӡ0gGjDM؅eW͘<&wFQ\ ^?n{ B4)")t4X(ߑ s+r1cR/V1@ў /|{:7k'3u9sVkϼUWB"> rAhwNv{r};[VjZV6x1rٽI6$CxjcBcz& 5E:)dBfqr\PG*1*)Daۂ* Anю֗S0`4afI sIz Lu6DZ:Rj=5ՁzETΕ'ҜO*`D\fA"`t˞iίE1N&j+oD88]9ƣXDv>v RmhAB۝KY/9/fmIŘP|1A k`jZVj^]̜p4_;ͦ   ܃ƎpRfBbI8!*|` e7Q@$M2Ԗ`IyvMg71_h{N"I睡X$8 |^tC &5$˾ԩء>:mU}F2&xGׁq_h!_WʩXtl9b_N[0r%%d:B}n\.kJhpByl%0\ddxC@<~\kӍ|-j@٨I] co`3sVjZVjB `>Marj#MXe?ƥ_oB.9&(7CJSۼC6B/kvy`5wH_ٔ g8 IL)tJw##W ΢#:\ۺ%#4KqG[}y+[5UIR1ys/`DL/&!9rlieq4ʁ-3_̱9!V$̵uM_,2Fגq:_g{!2P﫮|U=w|׈=Ԗ);,qjZVjZE7*i uKV [nY׏UH¥D}ʣvhp8#Pi}^# 2!twl6_;yR(5y!@.\gܯ&ZGl1ѱ2CC Bq1UAHB}H` HvɂڎpU4G\k"U|C ^2. ].Mt*V + O:#Mh:G(=R Ctϱnם|Mi[9l~:9s+=4nv@l|pma,es)O$޴jZVjZSď|@x %7< M`@-ϗ`t1F CMnB o DfY‚jo8rlj 8GCdIhD*(t} ɞ!iE{K'* )B9ړÿxyo)YdFn /!5 ܑU湅a{(*Q UMх9nl=8<2yFyr'`^J^mwY6-Cv-y- VMNVuy5 stVjZVպPG=[M9?)(r0cR7n;YK{*r-p"{u@C 0\;qwņs ]3pm'nECvpt 'ԦXyͧJ5Eӂ( ZE[BZ)Fۗ >Է!e5 (%t[& Uѐ o4΀8N,\Msgq E{+s ?~H5^$46hyn ,N)&bw <5k2ָ'h!Y݀_ޟdhƗlZVjZۨ+1~ƻEWzV^{Gjuq@XP_euv" %)-σF"7_:fClL#<9 $kƂ"Y\$B&@' ˀ83l=2K%BEPc6ۘw42WA$x(O7cWj,[ci;pj}tsОћt&@ .7pJ.b^JNP$ QdeKT鴘"s1&HkƙF6rbU5۟|us@Ovϳ^}K

wlx4 Qq^1R2ˎ{;~ )y~by$/0K|9pnUc'`,Ly+W_Nʻ2!7-;+`TveK103V.@-m?u WU-iHyDNy9O`ntokt r jZVjnhLMځTOJ8D]o޽K,RKX|ri/E xYBM$:wNLS)l7`IM(T9K/VF d3>+XFbB*urF5- $/ǧf{p? f3`<z?8賛bgƯN}v5]UcJ̵E 6ciIhh@_\1uԗ}龍V?[|(~MVgLIzjZVjZY7ʬrP ߶`b+8 91#W06Y"GlWu&{n\Kid(6J.! mlZur: <[lHɂ}VG ftd]Ҕvۮ7+L>gHp ƚɗܜ<@֋W[FW+13Te/'64 7SL\AJƗ q6o[4N` x.g!{(3Y:ZS7©Ez$ƻ!7:75FPi:|"x C[VjZVVme`#>pjZ&u Jѻޅk8`ȢgX/dv1,&//0^%ƥKF!y3}x,9Z<&NE,ܗY"a}>`g6E{)V(!%ctId^ כh֫fr_ O"]vL~ޱ =g2Sћ2yic 2u ‚HU p[HoJ/ @yD3h4dc' .egoY}_J3׾~'i|K>C}_q>{ܞ۟ߜ~e??v{{MZ_nv9`˗tp ֘9A?kM+?9[ 嵽/Oij^_6}`}^  ?X_BIziZu.xK>[(l:l|e?ڀ%ʺ{ ԓפpB0 ]߮ Wu./L!ާu:G@f mΝ4wud kMu@(auJ*^Goviř|Ӗ@ "9 ,?={<]j3e bSENPHt#(}//} ^r^?}{Hj==_³1x6?wIt-aiO{<WH񟢃)CQb%aq7h 3k"9%QU^I,|jcZ>r e5V~=㒫1]3Z2۱)@b}FGy waȱ4@߇?~s{_;Zp`Kǟ! .Y\"1-!>|{+, ٩g)Y - _.x0k~R_T e;l}+ ºNMUpᩏhGk%]hF=P-Ge&ѱ.~\i>ZV$hsr8:C9cV#4lZP(||0ygwܹNVj$_ 8e&@ځxXAFq oD8L:qnPD-e#kbʘq`j"EC2֩DɢBBZ,nRE+.ۅl9%ꪂcN} ἁ{PlxLPbn1rfJ04, ̀Ii4\!+984Ew(Ҕ w*{Wr 繛ma:[ ;6]fg9O$sĢ9 0½1.Zcʓpy͘r 4~A@rlnq `@߃0 6x$X-^x5pVnpUjZ^?/y@ZViSƖRus<Vk֕Ub- . G/w6fX--s_T "NTs_H@t4 xO'F1+uati8(AC HI&> l3r+Bѷ)K ޗX??axsafr qLMZ I٠ V |6YyWs|üd=s&[60wld >ႈh>$6.o;^9NϹ߾&}˜vzDcje,sr,C+6bj3<\Wݻw!VuKϯ^HZ&s/&'3ꜞY rIRaBo *B ^ W g>DXa> LhI)9;P Z>^NP%HϥE]7ׯ?8P/8_xB[3м 3T n .{1lE\\Y޿ [1 TF<,~ ~M<(7TH$Pgt:Mxdt4‡fyWq@#aQK:aPŰm?OךJ2uj=w*n6I^|BsPT^R+1;PvifZV)Խ0/jZ[ï}koF5Vj%<9v/&D*; 8 /R 7o# /2Eh pYx*O]@" <'ڻ!nIvh)FCDɺf\NNѾ%F¹>eAp+.Bk;'npEU\A?#mY} Gs̥@u="qO[o K1); عuXЂ V<̬,m:Tp;юR1˱Ӳ[~9dR6ON!oCO˜5tk?3ZȁL'ZViU:V5_ǃo|KmյM3eۈPڬuEMh*loH>b+!ٞ@W%(. l6Ԅmp#NA0b5>S8EDB -W]݋}١J0’1*fqIt&Qd{pGFTPL DSx짇?.[l?Gs[w>{YpL2HbaI)Pμ:| ag=cK ]2:!^>i ع 9i_ NO6)=jZ[vZu[uShroKr6Y/&s(+rhBlPD̪^:;Ӕ;NU# m.>*h,}ZL; sv^`[END؟T%& a ѕv&q~frI 7adhjds)֖ԃ{r5;(`Kn"w[@m4˟atmT,hOtlfZRw@Lz.H gthM˾ؑWpKvlcPtp+:(y8mg M<ϓϑmF1*X\*W,y N~%L@r%֧jZA/ 9_jZ%Imѕp{]|-7%u"ie@b5mVXz_=6;x8]9)@`p pD?[O}Gܹ$5ൂnJٔ'.%aޒ "l@LDX}H-`G}>[NZ?l+Ҏ Ѽ~> %,$\p0_\Nn.venGhyz㼝]I=[!ע3ioOx#x#p-j ;&P:q6K$^0 3o`y9sH)V}'uTömٵ<[E̙nVj& jJ [E7pAes:s(\95kF+Y%3 @dEwة8B8fj RAI*ȥ+q=/MOi G$44 Ctb :y-UG'7E F< {J IAMlaj-6[0Wp-,\GC# -ch#08KQUy^FG|{aR 2hr"\4qr-'`m>ո i&אLw(, 4w0 Cyl\Ӝe3`5H9| PbMbaaZ t= zjZI_VrQڄzu`Mn/pacᶗxI8}0}hBb ,]CuhY$!E?AA=C{**GekH!*ΩPn'6m`Gٵ\y`roYnFG3U6sśj RuLQt%hlw=|oE^o/hwf ɨ?G=Zpm.ߎ˶ty?//Y,Lzw`s@I)>&*`qq$fLg2{Q *£htiӵCW !0GcX4xWzq%\>U]wIӐNy A"si]JRà !oQnm AC DpUip|.JԔnMO}UƦ8Ld~QSؚ)Фƃ$ySƽ  Q(7&o~uixq " 8_uXi--3 sMߊ2{{t) iHgR*턻76݀VO ;%jոRbC3ώIEB BxӰ"O>v:+-zbδ+O >ܸ39_>,5kZeV"SAAzZtry%̊5^ĸ# A) U+9]<^69OaBbp Sqnw_N0θXT=/د) *D#]o&t~ك X^j`h7{ljH'çVIrgVۅ`P!"l +_}{M?p'+{? <~ߺ~ ]hL fv'uKm3 O[~8Du; h1Zh=yQXp×vj܏\@Iw |"H2Ch@;r24Y@ZH>Xހ`KupC[뀃IOq^\vA5Ou 7 p/AgBW6zųo8FE>ٝ[Աܝ28rdH7T/ =h fU6 0#r,fd-&2p\RxnͮFi4Ez:&F4y1Ɣ웸d+51Zp]xw{y9۶TXmhjʜxt[{A"͝g'Kkz_'unӗF.C@+*XDvpà46lF+/,W ?|^,/,8w_lT= 0\1 0TF1BsJ8/SzjZmnKj/HoܓV pw䯃 tw99ˌփޙE9%C+ I'EWcLz#^Mi[#erH\D ""JE=epI8*OTm(ңfGqf1"Ts쀳=bU(+ rtǞ=8w Pp|^W/4Al6SNź NuSy :.QH7WC=Q%bC cQ"6;-J0WGt~n?a.ϼXg?v),zXqd &&Ip.62 U]jZK宴ZVk|Ay i=Q`P|' 4'R"Ԣ0P=0Zq S`gNcx,P0&2b#8ެfB}R@ |OC0:)GAۯ\R pتT!W`&' Q"$T/qBIA@,^ɟF_\/0_-$8\1 b܀,*j,\ j&0:?9Ue$CBӅ?@9 VsOSMq1H阯SPFqR? df=4g?!Ne = hF)|p`*bgLZTr(Fz_yPcDbIajZnZ֤4] R/ؚ^xw~BD;W<#0, AR;Aa3+`M;|FLNmtvu] -5yb$$U7K9NK t)S8]!R61OVոa/?-ME,VPt1NPA%0U#~m !t(ULg>4 &ਫ਼ALm ploG;!9~b `ZҹI7?x`eE *f29|0¼#P"qBn'$fcՆel\͟iST3ew65r80r3̢'IC٩/O5aNmTa~jZ_e {kjZ%zt`[8$-ERN)xlDp/pu_㋕4a,brg Rh1 sƩEP?6x-_;'. d0.3 Π(̸.Ƀ1v@"L5YqʿOz r@=CB6Pwf4{@@\~㢏_<_ ugh@QoD *v/K8MUF^⎡pI KwILJr0(Zލ3єĄѓUghF6ߢ hc>va„OlC4zVQz7۹UUhzt-"Rʰ biU , 9-2px9}~DQ; pChMI}b(Pz!\8hQ , V-VTO&mnSG-ТqzթOi30pa#.ȯ'qe;,w` Mb96{Oρkɡ} lF5 A$6;ѯJ߆͇ .P INP-"wakKĻB'k=l2쟗QŸC>Μ02( y'IPhq9g"}ngp\['wFtYQQ.@3حR7JWnZ֧;jfkzt%v9܉>e9. =K!R%=:lN3ۻ?]y9a r*05 U>:?ڢQt:8IjZN [VT [guxAdYEb4!GIy H*L#O261n&vB:|iAen,3bZ̢EN 8F%"q0AR"MV_~)hv*,6(Cy_͎MIT#ܛ@΍DMf…c+c|9n/N>U ^2U`Pv/*-͏&;dqziG5WgA(`ntgAoCy`Wd!iqk>p:1%Ak{[|!ɾ7 &Z/Y^# R`P{l4Ƕk֥F00Vj>; 9[VkߖV1ՍKh'A9_Zto|( pӱ+O>+h4aZA|q۶ʊB*\fG:&/q$w`&fŎ  i\"f 7d'`2 `&4.2즫ืaY[ݫ.jeYVȅY^h Y.S42}8HJBg F/\G'0a  8vsHLi&QAnȒp:KyR;iUy-t8(trm L~SSj|IAva%d.L_m4| wo ID;jZvaV:ы_ޔV1 )`Q-LvU+44Ή((8ĒuL0͐pX$;9 %XgjȖdqPt%=Lbư oFTB` `c\'%fE26ְ‹'pՏM[ Ɋ޳pZ/܁7W_T<$xK$E"w p9 vNBu1L'(63(79?ZdeԀOMyX!cG{Q6c&7^#DB#H[wG]Oa60 vSE%֏y9P3]ېx0L 7{Hs8vZV3yajZ_׿~_ZLL7vrF r﹊}-IM.1Q_-3F:2JH.l=&L941Lv ff2'-H,:| b}Ѥjݵ@-ZV-}:soBQ=+}d6@!9 T@ |Vpk9ɩZ. Ug*oQ݈}V^οB @^:<_?9(ij3Ф" a&g1FQu<|uZ`^NEmH .=j=d(>^"s^^Lłb=@8|Ϲ|<슁JVj}.BKjX}k_{IZH7 ʃ%) 8N 4IzX 6RZw!Mk !fʳRJzt Ri \6yFAq۬܀ 8pMR^ 0D -U y2B#%MmEt-\0%oz9eH12C$uobZ!MOs0t2?Rw~> Yw2Z x~@8ȫW0IEʙEjGoԑu*y; E e 㾺󯶿3\t'sL}q0pqs_xdrH=7=~ۭ3)y P 6슆5$tljZW*VJ/Hov㤛@~ x'xGUPK$!ҵ5q Cˬ:!Λؙsx$=0͌a@Sb^r ֹYhщeځ]] 4م"' it@8 ǦkK,`YV`ubc\ܞ*hEV&|KEDP<5?-ovDt|6*l  -!5.1c_a8Xn>? 8HOQƆM Eʿ9:M}cEF0tE8B^1R9I(edbcR!y~}_ p 6 csڋ֤4 Z Q|VsL~y5Z3WMV(-jqǤq0,8f, &׬8ѮHƩq|<bGqٳ. vMPʹyd4A:B.<_?ZI^!"x̟vsߒ*K: (y0\֒p )6}lN c0k#s`GAXϦ{Y/NpʵWhYCa ݜBKg0RK7|s!V;*R;'ym.wcx>}GWisY<5SV5zm`j>oV:o|u5#J9tm!VR̓[81e*($AH]n~R䘕a2e4"?\Y b <>À?=;z1|KZ'P9=#8=9# ac !9d!75w]Eڰ!S1'X.,d̢b{q}f9uo:u5Jx kl$a@ Hך'ʿLh'JVj>wu(pjj}zʵ[̐ Dbx=@&c4E( Rp š FzֆI4 xKχ!ϝL]Q8I|:& Z2$Wnj"F<1Spl2-P,Z ȧʊ: *Rm)מ;HX4/,(Jt[GV[l- L jY~3)l' _NVPwe~snWY=ܱetٌ>R;{J:rfk薃x@1EقRhx9$ JIN ͯ1 vГL8~_d<4\uV4KNA1sآ{s5V(twsf% ˖8t-e@%ݏugDN~VwC/ΏEݣG{i\PI-i#EΫ_VjA[(%֗gB3+Rx{c[(*Idf|˴,t u,@$$l|SXj|8[7~6 ^U g!_ &[( I@̴?D)sɀܰt"3 os.Fa8J׋cQ4]< wIV]ZJڈ1h ƾ2*!`.ȍnoc[߭zX`8_t zf8uFܲxn"`#Pv8_o쨍 HN) b+=מ.x8'q [I<E61V@="tYg@Wy]yw_6_I> xfy:EecKֳ>`o)\+d{qjJů}k/-Ǐi}f !VUPi&7 )4" aKK ŤZutKx5K,/!eR<)Iܺxc?TEo|*"6#,:WS@͊Jb1V:`f0d:69- !h"DюFE?c쀝J:BU 4 LEq)prZ=7O.(u|y>-~0o<8VLA!O[hɴX޳ 9XɜG8E[v}|pC]nU#:96Õx퉰:$?ti^<E8뗎A5W=$ϓdx-x 6`?YIպ6[8EZLWrx<]\lxºŶ"n=\oi>G^φ΍??5i]3-k3*"Q(&pʾIrT( C/" }v]9Tr:>o/ VAn> $\l\Tޓj8@_BЇcEh*&%5!sۃSlܖ.iŵ8]|<9}k~{2^ _aKct aⶄYMib)xum*/DZ֥ 7ǵu>7ׇO@ 5iZR_mO/H^\Cy >g}so e&UidȧJ6 0_/~Ap. ]XBqs B;]pSpsZ"![g84߬9Ӎ)S:^d|՘CKh]| 2B8&ֺncU)%uKF?{x04$NbB)aWlٸS10+&c##ГhLw8rN:Q>h@QHT>`o49Lp V>y!e+ g񁺮Eh ̅&ȦƟ'9>3~e8tu[L /?υX &)9[Hn9kj}jmNZwE>{<^toj}Lm l{6n_lGܞt .V p*1^|s"IDm>yo/yL_;PŒo/3U2V·F4vש6 Qm9< MWNeu2VGRo[81E`j1U@Rs$~y!V~V= b=ٺgݜh=5 >,aZ"H8>b|z7'Rj>yO3ht4cwS`y,agHX3U]Q(!v)R yO9,ח108lWQxkIƨzΙP1 xЏG 1#n$#+U,yX b T4ry}p¯]obP,(}ϲm >\>!pF*ocq8U,O7v)L3w2K1퀽^2fd)t7*7֭Ηew{ nZVO!l` "EYlUr,/"4V&8$OT&fA^dE:2klO'VsV_^?Syu_ZV3<NwyQZ/P7qhЂѤZaZO鍗35&d۽WKXBGt&i1>PfCdH|p!E 0:fp"(\B}s*@Ǐ}P݁59Fc[HKOi03  wtEg@lhTVhK_lK,D`Mi@ݠ |`sG)W_+!I}5LXK|m"2͐2+ T`;0ހxka Z0tL@ Q'We4(3$FmS-B p=,7&þm?BW&t(N8MDC2Sv)k gT>ÁJE?A @ x?i_f ¦| ]npeN ǝ_ @M u1zXn #"pŝ&(`k i=b:P>Ȧp$C!Ť~p,q%Z ބul.فoT2_pm+Vewsl UiZ' rcVDN<& p9'rkv!~ΰ3i$Qr1 ;'N.dNb"4H3c‹A"(V"4\l8aϔ?T29ڬ_p%; y Ngn͸~j,˿R} cpsK I&2QA@&TCpM@IԞw$F6*L| B1  wB8w "oT=8„@h>Th<4@c\oA]#>1яo:?SPT.PaF !UϹ =ڇU{|( ųlva\ܢҲV Ѯ yc#s>{ueV yNV.'#/LW;Tg%|f"Taߚ-ˎ>4sjE4C/(tK8(ݔB::9vA t7 anab%at!R 5s^\uZՙݻZs9Ϊ[NTٮWГ\[sR{Ol-k(fkŎI68S-:~ɱ(5: R ^$ƌq!0 e3T4ީˈ&1fPv*),'4s󅛰kb  ],I"hUixF\Jc)cN/$=&#s2炃F XyRh欩sMA?M9K)QU>iB\)0ܮGm}%ۻ\@:Đ7k.mmOݻe@wV]pY/n/DeHۍ#Eb2nࢫg&Q[01HQ b BsdJv=%E2%3\4w%I" *B|5 ,]#? *cb! 8h^3d>h3@$g&Ɗ6ݢkVchNL1zR(łLc ~4/Rw< 1ks{:g 4.G=0ψB!?_5xOұüӪ@ֲCp dTG눩gBX zA, J1UL,SV6u-FZ Qckմsj@汕/+DJ r6#PzhNL_Us ^/\c 3p{/m`ҙnܶ6x]jkkk&݁u}.6pjk{ Y6R0'$ǿ\VGPmU9 <[Q6.P \@\\Ri8TrQNR"6+(%D=QUQx2%~DIcmO&;2cՂQ eit@?)RfRۂ :Fpg9E<\yˤtLW2\Ľe z΀)&'F,@ԤkR*I'T[D!zἡ-@p#xeG/mB aZ>Ͻ}28 dUDXIP&P;*q)PѾ@{K.8ʬDoYizNzOrLB9$? Ӟ2G9C\Wp>+vd@ܹԇhfm2 dɶdO0G}/1(Jy|$l!6WoӲ籓G-ϟ@ZP-weWM#%''dCJsUD(3Lj7o/jkkkF0 ~nB^!0> vK /}V/F`.o T2:IgQ7\6~/Zue~ul%A*NcAPm4_PL1x)@P0:5N jUcEI-9sQ8lb$ů6N\(*TO^ ա>f`PC*P@;soǘ%H( 5lR^O|Uy  Wg>cjpޏVH 0]']`I{jr?kFhߪ;:O @)Gzb?KB}F;fGK_T Ť'Y>wgɊtZ|/bΗg;oxD$"!pLw*sKHmmk6c_j/Q[[[5&a[t!S8m7aw1GGr a(c½l ݿ"5#l-5_I)`4EFD4S 8Be ;!rgU4ܐ V(PUSg„BI/fJ*H/FRwQjH4N(?6Qԋ JA?؉AR.6r ralp(MɈ y*-ҩs f2j`?"p@?ޏ#Sp %zP|l(u%ZAFm;7Po#6?vU1uo<7L:[Ǎ3(vr&w]K<|zYa`5=b. ŅQ U=CX7xYӤnkmm7h M ]m_zڮ!TyD273.=Lp0ۨ߱rfLFCb3#AYTccL)) p30f(&p2'!aV)*3> z jD=*] 5݋|Ufc)4 >VgU>rZ{tx]-cY'򝃎 $J='<I1w_{L=;I}הOj*pw&3+U)$ԲJ @=b0UWc ZϡCjue-dϏvw9ug& x68ˡgRN,e+BR h =N9$?.sܟ{<n6톬3ݰNKvvi*@gc C@(LW;ho@.8܅˵\(,˯ uD6b,Ĝ'C~_ 'g K[utfබm{.$`ݔ "l7mjkf{ CCz;>U(EaJ Bc\ ,@4iE R`Q&1zu6u*Gb'# <4J7vD3p0MhS )p0Zx`ֵ&8g&9?˟On>J]5 ˯f.p+oOV37bT%`9%JB/&ƒ]wN-6e9@^Emc=]\ yL>igCBkv^j*"yͅ` ?b-P͢^| `8t~&]ufබߤ {6] m7au^3L-! XwtgHM0v,R9p+Ćgw$1 KyFl>JK+L~")SuH}7bpb䣒8#uH3{ZS/Up;JJU>A)>Pl=,% h 2O$cf椦"Z3:: '*OǢ{N}I1%ooOS^Do]=Ap^Md^`8`Ll*6W]|kY#_R1׿vx_s<2j54B,udmz7W@a%{ o\H>OppG}T><s'i{2֙nȶMbө3݈]ʗ#:ڮX`[/ nu7A>˟z*zD}pP%OǬ >Y[F$w%uF|?s P*5W`& iwMLiTh,ǹK-7A/Ñ x~yțSr# .MYtxd$3k_LJH2<,d.^*0jA#}!HCU!KZT}ec*PfW{j6`)ZN/?}_>zkT@&:Bapx%Fu? sJ,4< Y42rVC5E9GF9;n:3p[ =kK[[My.}OS[5C @4 nλqnpȉ,@R!8_uRjrCp/a2(æD #iH /Js8#$8O4|lth_̇z7~%xv{ۑ m ;kVȐb+l"#McY7pTke\Xj|DPAFZ (U\F-ky|t9=^usP Yn!HSzϩѕBiVU4>G}9#UpչXH{jeZ~)@/ۼR`Z(Tp}Oey)ʀei*K.F eZ;B fqX⣿uKc4݇ DC(T(y3T]Gג$_,CD 4&+4p̑ټ2pmbW<4 =PdIw(f||爽GP쎘I7AyWݲR8|O϶`U,xNsۓr$R\k׊NI2UTJl{3]mGCmmmmmno"3 y(8vTCx[\R|0p/΅k&|509^SE..Ū fP9LucJ&Zn=& H)'b{z.8C\ll$ *"BJ'Mj|{,rP!?qz?jraP(c zŤlZ ^Ԏ%LK56b^Gm ,?M1{F`8|UyF+0 8(ǹovj4Y1$(חK&3m9Z({w>/mAg c4dV- F6 ٠9 @h&ŗ2-+eszrhx(~)_q oM ?/Tl{3mfEjkF{(,j\ǰ&".*y\>*87Z)%MI܎60xU!8l\745ж `ed>@HzP?jGI8 #{> jh9tmI=qyBs9 mmmmmmmmn!Zd;0W+46B\ \}RZG0*AYuH %*Dh(] 4篾7f Q.mZL\m !g#Vv^koOdqVcxB(9ڞAtPzm[ps1Pu-xRz])9Zς( +ιOj|Ly΢{bOT>֓f&!Kb?@:?p[jЇ{g'[kNfzQ,DHC."^6Z8sLuR<>BpDfq eBGSHZik{3=k Kv@8T> fy0 hR2 IlYFl%&*|"g>DšޤԉgR!\gG= Ee2L=뎺KHM;C@S޾C{Z\?<ҚT2܄M1P?ӌO4A@[H"kG˭}gw͍b 8}Q?>XWKSH?CI$po{xX/EZ;#ONVL|F.\Lx+0 :L!qGڞ"mmߞ*t]= 0 @^{'d/ .+A!8d.T\6Ć]f9bqQ% 0` ͳˌBV#T1ٱv3jDFϷw$,`-euZ,q`#p`S-e0w-sr P'T^q >햳Q/=4o 9e@,W7kw=1 f^KbWWBLQ7ɉTGJD>ᑡWuYn?K=!{_dE\FF5ܾj pϥ{#h5zq-f]HNdȅHD2(o~݋j;G: Y.i<6 Tj;`']XŎ9]éFMLIsN4[b:\#7OF~4I"^d#'H=aYz{t"[۱m".,ˈ/MZmo̙Ha۹-ߠoQ/y^UMS=̈́B̶VAoϑMm/|IÅrƥ*3" 97K/Y EKM+L79ĩ3~kk{m Λo5jkk{$f$7o}sMm|ejk9lwr!O#mm5DcB&g-܁HLqݢm >G,Qg[uGrZ7ئB̆d@2\:IK\Ʃڹnjwp Tc }ed( 9=Khrմ-i%vu"Ti3O*˦ p'j Vz1u|=(Dcύۋ_[@k<&^z=`SGyb?YɫNcڬE!1o Z0[S E2jOѾL ' @׊Rf$D$w qil%=bT2VmOiaz1<{nwM(]}6wbooڞ^ | oCCF̯ k&q\R>jnرuO';Pol[bŅ;[$3:ɉ:ȫ9ɱofw3<QV 8/ jeQ(1(p]@YI'XŝU IJe,؄9^^LI+e[A[{NP_ĹO a 3k-nU'cg ?MBjLH1\5x⏄"{Es֑HIEu߫L|iCginȺSu) N"JtV1I؟Rd18a쾞8$GG9CfD&CH*xogNJ\-s[ۅYgnk{D ]u{|aЇ>jkF{YbK|adXHpa VێLpd)Rj 2'$ZrS@FS|p Љ8u}_?_JG\`B(L%Ĕ iF 9@SXi'92X5a|1 OhοobS@Q;rLHF\y]IUXÝwd,#NiU WJo+㵿KUzչ|۬8K\"2A1Q^]bgFLϑإPgK%@])þcCN HSm4mi@Ktnnmmm7e˲Db;]=#} "L wEф!ćl\ yJ,^BC96s: tp859^zpUH3*b %5tT&j} GzMRn %̬@ByN5RR,:H95N^Nmcv$>w J^?\Nro(Ov5%1iC TUcZkN@ڼW Ne%qX .&t'tؚ=o\`x|cILLY pĄzРϐi pMV׷l{:]mmb^ǖ(*PRm@H+5 TFA%§E /2H3n%72h8-U=&loMNu"51X`MA3` Mo!g#H+*IMC0DV4Jx]̩KJy\E@Ej=|.=S$cy[;*;5/|5V3eF\K0D7q0NYՏ\Hņ1ubk/QP.s-N_Wb#ڀv_\ó3=.hKw{vvIޡk(ִ fx1Rkg܏C~f"B8V(8eqw;\-WR57lHL3*t& 6YIYH:lWn5"1V%vThx s XN >eB>SGrk߹?$0%{% 9tWtM6@U^I=x?T{21cr $)OXRs+aVPk=]S1P*nYYKC1\.x^ts)'3ik{&l mߠ 䶵]K v`8vԕ,  F\{SY0 z6ͯs\ x~3?V$J%2%jcOS~` Y픚4CpAFt6KYUQ9%T}EsH,:I-__X]7jR~?03e։{#1joW<\ $"B?kMSϾ՞>wۥgDT͜[# M~q#Ş,Y7z ص"}Z۳HÅS,Cwux݄uf6}-l|.Ķ]ݺu/%n/Gڮ U \!%Zi3S&Sۧ7UX'\ysqg 1C&JA"@ qVF5HY<0ڞSJYC%H6^W\r ]zP4 |>ʗo s ޕWw|Qm/%/e%ȳ:>Iu)j]({({ (|h v;__7ޡk6+[YXz)EL|`O[׏&`*}3dC=5FY9%0P]bް' A>7x7 jkfmmf 7mmmj%t9vwkW=NbFT J ^? wf*Z g&xV:`u~/&BTzk9Svq-;3\^RiO_Er| ay-Lu#{|CO T5z =s5W~]e}nDB֗3T3aK86l݀*Y&Yy|QdjUf>: ~flktmX.sU,{ڮѶB v$ ^ckR67ۀ2;Yh1$āGj$u2$Rᤞ$*sd:TG5l'>^hv}ޗ;*·#pih2UA3̯kgPFq`@pÿ ~{yinmkk6$a҅tznBT&٠e?]3$amQ@@B_|t8(I2`jfPE9S\gCv-)𙻲ttϪ2ֽ k@4~{}sm0IBd܌f^`՜&L_NޯE1BqKŒˠ$'xh1ʓT.xݘuf/7K nMn[[u otJѠ-ɊI tPM耇) wظ#Y۸>q7crc6"NO*E @H"bζCsz 1Zs3hT+\edv,Mw"{gCYf+$]MO>ԇ0_%s|}Ԩ^2=^~ P,"~O(&>KQ9ӎIx_DL s4],xE#zmK̜3k=*=N .đĩ6Yq[ۍ[gn{/o&:U{oR[ ۷tT[`nEYT8Xlaߤ OJ*Ssǔ~D'Q(s+f)f@t=l_oc?yߣ7L3l^IJr"sQ~功ɇz%(r2S 1Pu dԟt|=eʡRK*?Yqo^i?}gߺ/7I؞D r_6H\uoƷ瀘/Q,uبB8wj'Lہ Š$,Q"cG(D/C2TUmmϴufg.oS[[[c֭[߿DUn۳ jk!{ we-̪B@;rN`'7\F-.rP ?`mnJłQ-'Hf;S[CP AH>[l聟;+ϽjN *jOمؕy@L4)Jd0>6r\)LԡK*80y~NZ:Ur}c NOف_S0o̊U;#l8<ݒϗu~Lk:s28O}5_6Fvw_'dPjzzRZ*:\"; N;ΚWׄ^cKliprs'}p F->bQV _=mm7l홲}/Ub=&]~m7! ݒҎE S Bq-v L9W2 r4]7Z.UP$3HbJZ?u5Ñ\qX 'z:z~?I^*)`\mGW܇ 8'nBE :N.|fʙn%cV!$?r CцڳOo lb\)ޑ j'ӛŢ5>9%=j_S>2%sߡMX 3[Sr H!Q0x%B<#;A7svZo3]nmi{Ѯ5jkkk{B؞.ۗmWF[F @Prb p O aӦ:`Wu QWHzˉ dd/ H"D nG$ۻR~?xOi,U+.Տo} - J~s+Hlp;sO0zaxt#g gH4/^M@pv': 6_Ghv.- d $!uKPzyy|Y1Sfu(-dr1`_  GL<eHikYgnH#uk{.ŭ}Y?޾Jnۿ_GJ f F9qk}$30[r,} =6kzNqy Ĕ؀ ԊD4'S5 )xXc{?;~_Љ^{DU9w|V>!#:s tCAU; zJT)^ SDjE_Oye@\z$žQ&R'+8zyL_@T#X"2w_&Ptv.DT mYE9,)(kgT]>֙.ƞAh'g\g = HgY,?U],SeeݦvcTIBx3)D4{Wis {~q9 z fB =Uzdf7;rހ;毸lpnX+ޏGs1I-F",XHa'J-67iy`̡އOU%eeCUe ĩ@&:&Q\{#굹 ޟxO ֘zf1OC@/?oF7e9?0Yn%/Fb =o؟CHPQov3N-s=?egg^k_ۓ+Bw. Fv\#cV[%.N*D9ͺ 8⪓SRQf@1%3p㊕"V.)_yt=9jxr rIɲ"++dp{ (`!'"`g`SX} [Y6S4;Ts,58* 5>sKN>|lYg^~Vݼ)Ϟ}f{ jk{B =`0qC[V&Ƣ1PV^tsŮK7Q[,9νF5IB3S5dMc{Q4yrVcB'hԻtUNjo<&П `f<2oVz#eclX_0yvLOnR@*sᎋ^.q8/9CRo&29ӦZJh]ީ8 _l [>)U2U7;u(m߶uɱ:3p[X+\&3IC}¬.S{Y(5c=1gHb0e >o•vT2Z5牤o5AP@03cDEEX[1kVU/CwU0뺾ڀ Bx`8~;\|ipfMC0.(J(yv !IAL2)eG(Ni'Ò`$ɞ\׃Jr>gmz͇2Cf)jpVВOW]ޓ$+g1Mz]M.fx<6KE)ژ8)uHޮ<-^!* :Vw~^D8׭q}mu3] 7|Ujkkkks۟AmmO=C NK!ǝ.KWE[[A"gF9biaS?31H[5Nuy$KewMxK\cGhE?9@T9p ܏ﮐGPpZ|XaN<ωh"i`NpnUI갉dHIFpr}{™nȊ80-jДTO<xp4RbK nƕZXϞQg_AQB"wY!Nc/\>'u-2HM$ <`O!sͶN"r<~}tɱYODlVt:LmmO tSK.2+ ./q68[Կ!iReL^?Fbp!A)p.K@fPR?$Fcl{1r]{I @h0N] sD fWqv?.}(I}E1#J8{#:r}ӱ\N 0en+ 0:Ή1ԄQ9r~QfRcR[o"RCjSDi >^,ws>DE}HxG|Ðufx8ȿM05/>HG՞a8D>&;X},MoR9ب\O_mm?7دхZ x7| jkkkk֮mO=SRi* Y\I n]7[^ƙJgM۰s02T<\#>AƉ(#C-'IE^׏LͧpZD\L)h+?s7^@@9*0qy<\6QL4CN%7PlRIPP2B>O@ |@nW\R$cD-SY>.:( GN~׬L(_7?.TF+kSRN9:DrhD= ?\?n\Cԇ&'Wcg&G2d1qmx]IM\XmO=[E#Wۄ' `UQ(C]u}()p3rL c sULq Ey"WLnvMMjGm ODJD8Ȯ,bWp!Y7`1СX?C_E+(*\q.WC x+Pܘ}:}.a'`(s S 7[O,>2X_ԂpȨMuI>mk& vЗwۯ\ojP×#A=WY@:zC<^`Aԣ0rD2秖j>q8MDD#nk{\v:Kk{fP[[=9PUll{j!1(AUXu B,K5(|; %OD vRvJBb:R~@v< DsNsCۄ<,nxz}{y[uC#Ft??eU1*, T  'SV~zQ1w f9G#*kᒜt xkU2$zz/;S?ѻUxK|.X{xR$Сژ]3 u"|'mWz<n*\/ M̄>|,uzuX6>&b!Fuy}lyӸfE{33y jr%Yֶmwѽ{.:3p[/{[[[[ƶn=$%P [V^]sSn o8Z6hK.!qdPoC+M{lqHGp!,Dm?/;|)PFY? g0]tUC S?ᢚ##G݁鴮tʿ{ws<=ĂT@<3 $8GhƵ2ڢUBӫK=c(|P~F}8u*;*f M5>KoP[0Q^ϧ濶Ż k3.76H;C@/>o~^kncs+>ɀbZPs)+ֲSZ늑B3$ h*=\EQ ')/>+ߑX U?ӧ_!KMgl#zoSY۞_|.Y)Y?۞:{ vgC : M\3Y5O&c%FqZp_ǚsgo,:5k H_N X[p5-3&uy Yi@oeTpRGw6yzc8٠|?J/e=&zLudw/WwNi CQ[[#omW|;oS[[#@ ^(.ك Հ+[/3b$#H,Q< ;ng k2d'dC6v!9%N>gt~b]|["wN R",\9G,@ ".l\n-2܋=y)"C IT-c.ϓ0>{XGGǮTj A&sRq åWbm!yG#äv`f1DKbYeR9[o|}&IkeP- +}QՓHR+U'_DT 6}q~LNuC}$@dZLGs-f0(_-ik{l֙>X'6Cll{Zmy91H6ÎoQB,3\hs\ڕ 6\.Fsp_]CrCL$M^ ;gw?7qǀɆPyd4F&`U둜 ,ǀg#+0gvnHv)_WnF N$TLTF.Sʘ^^K{ĽsuZzTdjr-GG, dɖ߲rВ@Ÿ Ҩ0gwdžڪ* Zt,_zY|Ί?XR.:r63NԔщChr#J[A>{~VmmmpDmmmmm)2o67U籩L&M0bv<]$ c5M DYHqW^⦛$@Q)= @]Ժ> }};35 N%I@020$pO,d`@ 8\wg 2j& :"Lұ8swuSCq7W ׋+d dk , `^xK62l-:]8%:_O4בIy# @L iCv\ (+pqJA'G7#qZ*X(8^W'vN0.mo:3p[3j;6/S[[[[[ܡDڞf{(4…m)HHR˙)(H&KXď9ZzI ]5gŎ >H}{p 9T:b< ws%?dΪژ,`"~Rθ}4 0lb1]vWD:l2}>yŝ];Cyq(WQ!(Q>}g\[@L(ڙ&TT A ՗ e{yʰx?dhGJ='֎/Kc 97 E Gd^hP2:9TTu"2Bg'#I=tq6ao޶,28I"FOjDo l~7mmmm]=fFA ǵȓd(G8k {KaJO-e?] f@vLC7B9LzcX͕rYk..cvbz% J%6X v>W?HП4H;>> [yEڹ35+~t!υ.lsR\Lk+nl%Cx |`o[[[[nv)Ͳ~_ۥC˔<ӆHa>#-E!hVMSr.PNdqYnd{2 ~T6\7в@Nd: _=ׇUE ]Zl(37` ۵ϏȀ1,[,@`9+K_r }~!ö,'SL"HTFUz8h7M0̮QzGRl0S2:P: '7ljͪ7+.k6[Tnn7i]ȔX_i=/#) Rռ• yChWM#  E;:|)Bvԗ|L-2i736V< 'ﶶߦ vf/ok֖ B7Ϋ`o8sSyL~K#; ‘)\"c[b0`+j_x3qA\6+7_TIrܓ9p;˔`#6!؀w_c$qhW&Xُm>|¸My ڡЩaX̿* lo\)8ϩ\foQW>ߧ{Je+xR%7 @.EU)StW 'N_b펟)wV */JCyKf5ӗ.b<+yC.,8{t-Uj* gw< pͶJ%%K9EWc= Ek/mk6}ݕ[oP[[[[۰bfWfo86$璳8% svU'(i 卻 B$(8B[SGh}#C9_voͼ3A S9Π -wUdF`ڳ24[0C%H fY8\YO]A>:gR`ƵZ ȡBgor]Uk* 03;>Kpx?N/I0pA#7HsZ=gLi䊅UuEo--4~-:_ij'8o*9\Q@Js]fa*-Z(}qƍ8<+`Cl;GM?0dR#9+֓Sg.LcvW!X?7sVi{Ơ^M1آIrM*I݆GLD U Y몬nP(R'Qmh Pdb4K]$ՃM=s_?Cf'%uU*ϣF/i-yջ)I(4+|sm"%SQ>C@*=5Ȉ}D>õ%E;VzK< +|ceRWg' ok6{F2=6mn[1bYGPM9(O"؃#3q:(CCgj,0wIq$^Ozw1UQ6D2~h=~Y_o߻޷X t%TU-1h ߮[(\~5/8ev mdx~KrVи'Tf A@c  s2eBscvEIAt?rsǙʘq0'8*M$BZl+*]S| ꖝiNGeV/߅ܳ ɵx? KvϾ;p>_-w}aȀ97qDJdtশO >9m})U".@da,l 9X$yc=YoͿHmmmOm_|c~7mmmmak{ /,R KkNm-/psOT U .~28!eF$+l~g%%?҉wm|SaR80V'Rg֕@rrPqBpD @+i,Ÿ!/[T8@'oJ}"*m{6-xS.ٜK+ʽ&pX~Ҝ:@iT3TzgaXNJQ/ *kYl)"N!x{tE%0>X/3;r֧l􌎑4,\!pm7?PlmF+ۨ_vx}u#g;1ޗ?qro$O8j'o{ܜu]JmmmO~^~뭷mn[F^/FڞEHg!!A=ϕ́5+9>Al;plxБ> q 0cIq I*oHfc% Q+RθNjO=7ܶpՃB/ؓJ f\ѯ)9*\qu~a?7cȒ9>,@ӺEmN\FeWq}>~o+]-h,h4VTUt)ɸ_As [QS>(0e7T$T\)MѓGJIs\ Z&Th'1&ل52O:;[cL}эL1+O֯Y3Gb&]fŚZJjUtL@OҸ|lQ(kk{}kno7bVѯYGKb;ϤrW6=) |o䱷 eqⴹͰ/:t\`RsBtHi on}@Ϫ'zUա> r:c%WAU &fMpJ_ 訡Zk DTh A=sW-~5܎aW~4܁y%7 9smaebx&<e$}lȡ3c&Eu3Li[Xz(4!d=<)S9ķz&$ "h.pɠ:ՇU:92KpZ*U<_g+̝^|MSif q|C5AszZUbKdb摎}FT(/bJ?m5jxx|zmzbDt*z 3jJ_X:4IC릃O%as *zT3?>eՌy^>RM|I grU+eBQ cx7TX հ@)u%2e$\lCl5wYڞ3_]]}:Q[[[[0stZC=TH\EK(~M>%u='*`La{ؖGAzrpc ԠZ(?6UYEJA؇P `Wf*IPAKiy_ q݌4l'F٩B"1XmJpkn:;L۬GF2+,Zf$#]1he'7k?'*jd\+͏4^ Ku'9cnMsʗK %ȲէY {.5 .ivN"m S`Z$~Y fBƴg?#}*t!OԷw8p&93sfN`i!ם?18ē@權+{A]SI# XƧ_<8֮)/)=xVu$LxTe?]JmmOufබWܹs>`" N~AGhƱ1۱Nz,6C]\`[Tp$@iCtL"h-gm8XGqLԁ$~ Cs 2@A~nf:kGE h ;D~k娀ZmCIp{=;>X i7* 2 yǘS}9'n&w֟vf9z&3s7F"dJGHR _Zr>C=.j138F1LbV fE@ɛlm1Mϫ-U{T XE%'/׫#:db}"L\"@XhD7+W>3ڞufබoݺ-jkkkX~o/jAGYjAMmK ]f wR&X!W@c`v9 `P푝}p(d&0Cd|{VWMp%_}Я3l5tMC&Z(u< ~6 }LUR)-y2?y=WB1d&e饾_xJ)J TʖϓkX>Οaeus  >7\uw ~ u\}8 ֘||N?jPRG*6ʝ_/tJRAtKT~5J4֑~kH 4Sn&BfU_]Y)j_3~y6=5g]y~ڞM{cy&-gU3x醗eodwЈN;b~e Lq j[ZqKEU~ S P6e_X9}J\MROH\l,y-ጇJ.'HZ+xy"2uw>r~") ut- i:&6WQg:'pfFp( F\zdyL؞RY??d&a3޶(c1>Izq1FW9@F'^uSok{l'>|ڮu۽)nkkd~?rno{m޶óĈDlL\bq`d]$3t[ '6 LDDaihFHlݳ맳hm7#}>Z( }r+ݡXVn~ a>ɀ{:,G,JlbC` ]\Ǩ*X|lHُ@1v%MYjlq wS`9rR1 Ֆrd^FPb( 9{Qis "Pq%MC1(?r5EB,[p6eDNaN9TT:m1M,k_7(گ_99L;EI%@P;rěf}~шמ~$QFvX!*DLva0*lSRO?QPHzUt9#0deYmKmXֿNrx' <`$Dz5i" O?H30]vnu Hl`[n}{<7鴗l^^vͶ'j/#:^?swhk{( 9z>P:Ie0;n;@^t7qR'3?*LqQLTڞ^3Nmmg7|B>tﭷ6= vb+ykky{(g-Ɓ2$oZT[3-p箆P`+9h|ܾ<|6v#KbǑ9Dr\/!<ȕZa#T[ eu" ^"x<`#ڞn/W':aAtzu~R\x6]c{=]M[lm9ЁPQQ.Xnc_,LdC壥#+XEbs#0]@eZ9=D==UM`ek1)NqzP X8UͧR_yx{;S'Y 1Uf*!X{hYOF}?ڀ=ko5G_ ^*_:931$r9]2F:œv lc~΅sJAϏ$f zSe20̕,= S_}n b:bE|~[XFMy\m*:7(;&9Eb8.K#֟h D'j8C`'jk(mfl2]=֭S[[[[[[3oo]Nc{yL qX`DS\{L؎b$G839#*+9F"2qՑ3:_b.q&K@ޒM V0ЕK] aXB>E2SŦ+1 (E@Yܯ +:<2 EIX RE$݇KǜKyN `bzscBBW(A0EHִU i A* [0 &>M/kv5a*_P M*ϮQs.rN0agSs%p:\۞xomm8_zBmmmmmmmϴ=^n (RbC\8(7gnK 16s~ȱ$p5N9L;uaKb̄[fnfPSygf-V'/eV~ɸM b*g ZAk:$uw碿߸*l'{?_zB@`Ys#dScM5 y>*sL`ᰪĒ"KLb 0a_O(gp`k'` 5_ZQ$(V\zH'a#1> Vgqhp18fVz} W}WtQBQJڋL3럎$oQgTְ,9zn]홁 v!f.]rΝC/<">}!J<+^ ` iiOS>./re;Iczug`:zHQN)mF.9+G$ ]E&;A`D22`uˊ;g?kq5d kse[ JrV\>-(59;>sNCKJUm=Qv `Vk9Wa~hj_@G1CjgL3\xU/S?㑦(0{Qƹ9g/Yd -jn]negl3WK c8΋ńr'mI7ZPQ'2fyީ<)s >8g5eNlkmSnNuyNɅBAS 4r?CB#u"2w G[hojӨzs4AF' cCS`C8ic>ZM L$Σԛ7MV{>#'ϑ!#,Tk\r%#%~힅K8U ܇~nGq nLsK*.['&wle:7(*Ɋv"ĀD}},R|?{w^4U}q5}|+&̄,KV6Ij<:=.,IBu]_˱Ujkkkkkk{&p TA791qt [] wU~|%[B)_l*AW^Uu^AmvFG3 0,PLe&<4$ ! :KPShB9L\̽T~~@ \Ë)zٕ؀ ˀT30$~R,4 4Gfh1 {ppjgy 8OxL˱@L+\:!)wR`)ZlFݽ@6bu76yb T}:ssݫ.QaDYO.@_0[/TTw``Z. <ԔX쫒kݭV 2.jP*]lbXA홳+ٝtɔTIjLWQv,n#"p&ۯ0K"{D=9\ݪt= uS PSNDYt^(*C@&`]µ/gt._2J(+2~۳F~oR]'HH3W  fT0;BjwPnaί8[\ȱLI)Pl4iu2/ꅛh: (Q!B}.|doSy@wf*t>JaN@͞5\z2aSqo\/nehEsP  _F^qRa hWVL?~Irmmk޽{_ r_;wg sQe-.n"`7vgqoHiEC={ru.p-x4g.qlq;dMq%jP.WSu89!ɐIDeW BD?v4d?0sw5߈P$RRQ@)~^=?lL:3z?OCS Ju-c`pR]b*5WAp1an~B%k*13*ʇspPAd2i*{0?' 7XC4? q;uHxFp X*vOzD(Sp{pRn?k[C{똋an`3dlw_$W۷nzڞ){H`O1;a i zK\Hc8qx =_(GJsp/x(yKi7ER?JʥNp2lݥGnBAXR)ᮈ_b J휬`LӠkvن .IC]ӎ&s[3.c0 {ݸ],אAbo("G,ET`  0lY=]ecpnZoH/6e $rڴwTmЋ.̔ *g&. j ih†?rL?eH d!9>`qu!W n@1fVVV}1 uo6pn.%Q솪׉WtJ#5%^+sp?w%eW#6vQ5ecɀ̥~;2&`Ԍ"I8?sOV9jq&RThj ͷ| nL =g F41V.uD0'iֿ/2 RsSr 'vNm;KID_R$Ka-En {, rR]h*@\|腏Hj3 Q [ޛRz0繗7.>*NbRSjL#"`@C.Cű"G#qh=S`$֙b a".rpi]Ub=s@J"Ss=N HwAҳ”T-<ߓkAt KEx0:2a qwnw$=T{5e]}߽ۙ.L /W +H5Rikp7𾉅 <@o+3bWH)t"ࣨ lDίc΄ Xv'|lp< ֡~81lв2PO tnw*Tx W2@ ݈_ыgHZ<91GLPɀѕ8 l-ĵ _w|zM#X[є5 9`rh-pB)`Ćh0*O"! n&&= f_ZyJ~ke)WQ$1 `*14[ wЧbJW{.Nӫʝ;wnS[[[[[[Eۭ*U~v~m-&,d;A!$M7<p&:~Gy[(gڑ\}P ?ni*GaQĮnHT*1Ơ|:hPA\ c If[n J@)z@295-uBr|@ݣWZWl,d+Jɋ^Qz'$#JB"Y7bN%PbcpyfN+JLDZ@m}1Dl^G>uG(uW<:A(z:x,\/Wlx4(q{Ff^AhE<:l%E 1\W bɶ ehθ 8m8mX1wmmϐ曯 ^~ڞb]tLmmmmmm?ur{ݵ#gP#,=1kȝ82B+a mQ30N b<6Rb͵:l3,(P(FR"'3e!gNLxÊ2'g $DA#UF԰ww7p%$ ۹2 ǪeX;d;W(Hm~#c[?"G"dqޓ;&P]QF&K|YELj]Ņ.cU\t:)18''IiscIzV> ŸM}qwkis]G ;fmmϊIlk6=Ŷsm]oLon}w1_E4v}6= #(Bc؜)|*%ru]ڨ H2ϟ$t7 2J$$mz#&B36g=qp1; NDRRpUcDC!VŃ`ekdp.8/( 4V&t՞6~ O^N,zl;jQpAa/oݣq.{UL G}Zʛ? qJ,p{}k IyMM 2&H1Xzpa2WZ<$/d1 ȧIQAY+XSi׍ٳ< I&X%F*J-,ɁYe3\qʾn9 =t}CeM1@/N|=öyΝ7zCz뭯l`Ww27_|7ȶ|)ۣf_@vՎ z%al]oq> .r+F0s+Ud(Z~BaOs2ݚ6~vO|j/nRU\PXه2`âh6T&"XUzQdNZ㨾_Θ6 Qd7Q6_{򏫡Ԙ=H b ~#J2і|RBLh2ISPhߕh8/g(ImִB.uڨ6ӀץNA= Fi15:9F 0\ֿ]_0=RYYkdFIp)g𾏺xa)RDljo7f4lcTRl@X ܊޶[L5WA穭0D|Xr&}a=)Hȿ,!7Ā ..+9vX6Hjs4+^vJDDϑ;!Oa97MacQp+g aAZ@q#y*Qa=ȀTx:7NSp1HƔ@'*6G|Q::14:53JBI%&$Js(MUeƧzҴ5DȠkLסϹ%#ro$P0D\Xxz a>vh1\YlRh@y9+2Ee*x?O뙁nk{3]\}.Ķsnߺujkkkkkk8{8J%lMb k.g[Pd]flQ7qpea~P aY)U~ ̀~q &>6ђFEõ7݃N#ueW2M }71E |[3f.p\ qEqy@" ;U~@(Ie#^+_Gl6ژ6BEq`kA"~_SPLx@# GL! (uDm $ZWHAAwv%h{cwg6Ңsr?t/`Ms߱?BILjK<љ˜K=ƃp 4?츃ؔܮm< m` Jrokkkkk<{(4AM2i^ę8:,PEu*IP q hb qeph:lJ!AG=˄nt]@@B(4)K*ʥ:8dnr9bf"JDgdt̬ %D#T6?w`Рޔ9PG q:x_@X.i04a8Ac,,C+ i#6TD2X̓1T]R嵅py¦47VX;nsP@Ԧ9q(L :nCB2UԓP2%oHw G\mc~7@*ZZX/) (JJRM4h=̞!gVf$р0}iqE6͓ tCT?( :IBvܦ{=`/ñ#E݀`pŏl?N]5w_쪍!rem!!d-sPnq$-2z;Y 8Si1j D||F)Ro]%H3DVv)k_@\&ju ^Gi6ʃg<[fFP ^_ER/y pΗ7Gn'i t=նǮ@WS[[[[[[`BvpMCA3̠p| HX\,t?^l@ߒ2Vb+99 FK9V"@vE8%9+bI._E63lpcxzQ!WX4nh8P08-9p~1`}PpO/~eO ;%)(Vnp ף\ϚxRUY:4+sjd$)PSlBVOmaT,EfxLu( }_/'/Lgqx܍6}514'bs6]!8Ϋ99~;qi1&oڈ91>gw56=fߦ˱/ _GHbB@/A'L˭@$K"V S g&g)@8MKM]#5AIw0F;o4xa`-^HD6,krn/2 $D<ﭪ鏺uV#ɓyR:rq!)^@XTXˊ9ZbQfJl䩰N#FAI6;r10Z'0$YEa%tnpY":<+ 'зFCh) ~DBO:ܝ;ŀR<ز;x+Q$D`ņb \H>w<?0?&D`6bapM )5(SIPքfZ qf<9#&V cN\+("Y`$..U[bNy΍lj 7X<>DŽ'[WTC 4˔ƿ( gxrSXy|֖cb5fB/QWn]]P~^ZVz\0) Bl̗rQ gs%PiX2Bcnp. W] SGOD8w6q/*gV:tg;0&ݤsIR[l14KUE="WM)@%NJR)U 8-זXE}OwmFpwxi PȭlHt+ BLia5fyOYM[ Z/([0/( Ȥ*+~sqN H9 !܈""o@ 'oy73/q_=|8 pٝ pֺJKni΍G0xo eHt,G\MN\ZNJKjtHTU:G4^fBUnL֜<Zfiӿ.RxJe Dz2xJejkcj QR-[&]2: 5/ 84Tyzqs^\|>VkWWnB;ryjZ '"T4*BYs"wQ`8ㆲH:iZpN :BNABpf\ d1 $. |ohlr@ k*!2jt5L%]]W%NV2SeX< 6gJ!q`w}\8bYufb,65K:҈H^UkY1}5{Zb u9 Lmmd*,ik5ewZEz%97a~}Վ/M rЀ:5(%QnfLN8rC͡_wAe~h$džB ˲,Vʩ+..a(k׮]miZVB9’nhcfJ*ocO?VOw&PL(iry_@hS gtf+YHJ l `o+=c&ȅ?3\EZ)}+qs|ZyET2DT p$W*)B_k!iZ4p^9.qPpT#^!+;(ܝ|_?C.sQ۾]@B吧c,Ι]`(" p! HQp16[N.;ec$:W=qHk2#{(!u} .[TSXO-AFw4[msa5+[ շ+(Y`#rp9 yoxb&P\j]euee_6w^7jZ 僈8 *>DkT_Ƅiau!TSǘ9 ~bs 4#cv:b |)+NxIP쑾 W<8C\^D>Dt+E/puoudD:yB96A(r}|a˞}EoW P)>խҲK7p;?{zN$@N*zVM,)DR}piӂ\m{{|?u=onD|> H ]c1|鞛RB12 SBeA"NKz,Н$AfdB61.6k5sqH>gׁy"+ CK3jˠ4nZV3DRh9rB@E9ʅRN vCb]>`옾}h&`Xn K6t d/-[]O'J/APF#!0aEVgstڒ0N$ftE%a1z*btnq x0@`"l;$B"sz5`m7jsoZ|K4uX,h~[_ v9oe Gg}y?֒X"&:\>祔/Z%nu0Ń#iV̀/N tXw¼M|ȵuXnqg+Y\.Cn隝cJUd>dz;=Z)Ripu);:RWn P}inZV36.ƃm+?3oY$ D8p6-#ew}Zʺ(K LDU|LKp{Gsf.7/p^gAPxxMPo5tpx8U `c8G?J+g7q1L2t_bJ= 쮿 87Dcҿ mV8 ӮģO   '`^9x5B BYo$e/E \}6$P}df19\w>V5P\OpQ=GfU2 'ޭpqgA]`D1 "%t*zH$|^t9#؋H6]{İMw `[žw7FgH5I>j<,w6܍5ۭ*oQZIue֋>`\PJjZBv:15"XN!YؤED! ʜ8rV^E&KAA^-e\3}eP`CNCJ!'kZ"(lE2a0"4"bpP&P+s0V\ }EqlHVl4VrHSM7=;wv.?s[?wpN^ Ad_y 5.#"0{RrJDjJ(4! 1`øetIݛ1ҾGk4_龐,\G 9sz 'b؎ޤ7 .f0{)ע]$j8XYS;[Օ[/5)/\vwjZ HjWq1SP`u{.^E߿a_!5 eZ ̑S 7qܗFǝŸ 瘟#v!A ,y,L bLĈԩ*L!(ÍY5@yUfIב?a,"~=48BJ~??!p]ToGTAn'rkrݭN"CD6cgXCܯVx??| e2t6tY[޷1WN=14:d6F0`Bi&4 # _d6+櫌)'j.VWnP(GoߑVjZ(Щ/$cmnrLm12aZ +2:W{'~ 0[fi҆2_L=& _Q=uTko C:;v;ʜ54J,GnO4;9AjSyl(\ J)y9dE2 ZW =Y~ Aw]xy}diRhpyJBY"||FB3$5r݀Z}:U'2鲣JVrN]a:8O44X|tu:b]Z+^t]P~C[VL KzmY_-BAm۸L!QE.ࣝ96 ]pEsm6cGl1BhJ(}y XS^&ގ8ԾEKAD[i:nLXcf$ D\1W~濔C[8c[o<5p]QiJq]'`;fl)@Q ''RZyX6Yw |4f5"}8 =Q,t*qOit3*bB4_U*4qȏ%ݯWR{ mƣ?K >9.&ܘ|%[tZ#ue֋-\[ryiZV9X ;]1Nb?*fbBf iw}O2 mc t0<qd0q}9o !D~E|z[]xJƱ }WC$kI;p2 )|$wi4鎉\ C-3CJźS?OakټC2n5u4.2}((Ght0Tkbh: ʬ"w+m -ݙSю\pMӪL{3QJcLs:Cܩjj SdT'[H+NQƭ849!­Vè+^dwkߕVjZ cɎb ΦpXT TW1T|Q82E@r&_>Ikլj%=|76SM~bG8ưHDݠgMFJ:,H%C :\j@ `94̽dv[_ W;9 &ξ6xO~oݻ|Dz?'YlDa=buNk0jAd HEWay:9!%_Wb~5FnV0.Oiv B6&2ռ 5!gpy"&e T_{YEsCy>fCps83U T|󙆐 j]ue֋y)Vj>=> 2!•njP.xVtf+Ii6X_3KȈ/S't >Eٔ7Fώ(NMs'(p|]͸P8lJ>$u˛(`Yc855lKdtfHluLGO&`Q(qK =7`C;gj߼}G/gsCzp3_ E~f0wSxsLjg)x> \̳$x<؉E&hЪ_xvqWJkgPCYp2PPnO@N]81L'IZ}H(hbis#7CFøti#`aԕ[/SėHkiZV,`|O8 ,\Q 4Bes!krYu!Ւ[&&WLE Q{ӶVɏl.ylP g[~P NH i~&nBIhrtsVC\%r _ wi2BlpFf[axýu֫Ǥwp>IB P̋U\\8?PURH;v;r00?R3=GiL֏2a~ޑV_P|k_ZVD x&O' vS6 }dQ/Ȓ`IjW:<|y$UZG1"\jq{.ⅡZL j:1Xm)@#ȡ̱ W m p/E ¶Of(^cJBE<0v?Jag;P3 (DŽ\[o' >9;{6RP\K~-v KIЂL<Y ӴYU8_ҥGzs YBI@9~UaK.0E[uJxJ7;*k0z{tld}cs;_8~ Y5?4/x~YhʈۆCAt[g_,nMoV ML)_` u VA&)G`\$#W=5[ևPTLW[WDKu]{ryk׮ZV`,ӵ\%ƺSh4CK͛QI`PaњlZ,3 gIHW Fڝqq)N:p6wō\fWL!t1$2÷*`n (4oʃ Q&*} ?Qyrׯ@>%mNI 1]ob@U1aj5=W)¹V*6X1 pk9} Bi *n:,ɾD)\¹gu;G,`^<+PkCM-a:vgwQq[,6?Zև% l]Ͽ\GZVj}"z&\XEZ9`Lv$HY<_/m}6X67@ zM3c@c4 O;v-sv$w]q=0C > ĭ[2gs cPcmpyNnT˲Z pws,v(J&cO9h'Y46^͜IVVɓ'+^0m% jZVc׵gmWD0p0}N:dԒ4I8ԋ@(Ymp >&@ؠJګIE<'GИ!47*\Dr Y-n5CY{ "#${\M>@AJ'FpLXT`'&rYn8վ˯ /=`܎ 7̕ c}]Qk@t~[ݚ0 ܉425@L}F2oe?݋Eh g LoNh7FBCusjXU>qIMV1=ęƧl׵ ^@0_Akv/*\>Z_B_K5Os 90K1ޑX_(uuowk ^uX.&w ܭzTW%+r7>όVʎ,"X?!!Ŷ*WDög~ޝS^[_(g >dL[*X02K㦙 DsZjaTd\:S$qmÁEoz}^es n*ȳiVsk `7nNߣsy[Pߜ6/I|CE+(gi8|Mk{y4>Lʤ!+J+TZ -4d5Mo4n@,@yU:OjZVjZWOL.#+٦M<7Υ^@t  Jp.wYh5jO=%\bte` բq)h'lwDթcƥܠtv 9#(A,Mxtٸ%ۇDQ޻/=+a<]=yU,dĠYؖosa#>&P9Ub!%Yjxb$$c7AZy!IcZ3U&sy'CAJ~@X:[똄{|LY=l ا(GdՏroZVjZ֕ԳΌY bZ7W Rx&KK`'У6Wg^Ʈ$j#$ E:*'(  |okUO?Z}`yqŢ#:'OȼKfז(:d3+wEl`@~%F̆\~-O<}@ )@0]564:jcT;͈jsTW tWOo߼qRW! _R8Top,.2I/Vg=t*s}9Y1.bmEq'xn'n*-Ecr8f;C܃VtA/IbrFjYQj itc3,3GO?npr3ƇEnM=YO?ZVjZVR9%9?'o{aё^Rp*vF;l$F9}8.9^PV 4].smXq\Ma!_:/2ZBa,iZX jZVjZ ޤpnL5@r? PXhʳf 7A@^IKL>l6s2=72ʦcIssIdK,0`1^kFl:jUgKfwssQl<+NBzNa$J06Ch;^%ҘDfunZVjZyB)~ 0ŽJp]><5H\ U6 {wjZVjZWQϑP!#ycX{gQʡR-d.f:pl<:Sg5g&t\$j/j !hAaXᰊk௡| n2[Ɛ+**yHQi/# zFƗ@0.6Hg>$Gp&yS^_K]+!J𖝅SY<&e$o1˜9:#6N ^3h MeUqfxVJmCD *xAU?*SY+٨3MxʶZVjZVe 'Jb`+)+7V\Np@Klzm6LcC_tW+;U7?#PJѼ/P&9GqM(mCSܟxV@~SOVjZVjzv@%$sRL!&xF<)zM}hr&`'&'N4fuH9X;+ru&gK ' D9)Y#.45w2D1#V4C% sK$c[v/-y͇=}K (,? Lw>N &et*6F)>rg1 ܊,p =D2sbqՉeV -8 J.2iEgfuhG022:(Tz{T‰k T,Xn^@%_ pY{_raX&k Z*l1   wj9 |ƐkBz@.6D`0LHĜ]{R{8C%:ĉP$/ h-q6BYC\$ D?$ w+@)`fpZVjZV3J NJ(/W& %;uӟvQI< AGAm.$Y2mH}LȹXPPCGLCM'z e芠]&"~%€mq4(4-%n#[~񮴎C?  *aR235Bg aa5aw_&[}y (RDa@ Ge̪2ʊ>XsíǢ'E*ݤц_}tN5@Shw?'VjZVպz0hIJOZ@jevWǟOMOn Z*ܥc{dzf (_lQ7~̓J>Xh$ A9)p6lxj=8\EpVܿꟻ+ C>}xἚ<{3BZ PVY$A +([މфf~t{0vnM-VYshգҼ8soo16jS> dVjZVպz6a;Bkφ5ByɪX.zzb)TcȀjNϏCmzgPh fm)[{cpq뚠P̋: K4^$;~·Qp-hq~!_;z޹y}=Q]uKYF HWA"cOḷ߮?HHMO %8SfD QT7SB1Ԏey# hDl0fJt<'_z>G眫9v3:hl6<#x+9sVjZVj]i=W@[x"M3 ɇ G +ɵⅯN;e F&'G]؝rfm"ʩVp%Ufs$0Hv D8%XHB9#'U#y[vpkgWߕs! gNK 0kM[`}(q |\NC6/Q儎30qI֗>udj[N1WOs d/T,t]? GÃ4l~% ^>q#^ݳ 9չEts~k>Ce!Ryr [vUHϠ;2Գ.jZVjZWQQE!TaSʐq}96`J@v!!M{l!5CjZVj蕀 R?_JҦ8Th7cgvjg%7qR~ wAk> %OpBO8YFA 76Ǫs!daVjF Qv\[zn?}Wϥci[+n\c]Z4̐uwYRr+FyL5Wt-u] L˾qCI ֽ}v/T٫dǑ~7] ) ?݁Ch.r :c|V@:N]ׁ#1xiګZVjZV*9r`(?)HK6ůeMft >Vrԏ pC@Đ]EMgu֭[kQSRq09J_p>*+S|ls@[lS1N]gjr[޼uGsNBR5Wm- P]R4Wvw4WPSH~a ˧Yw8hq|pX!L0Vt: =Lmf1VπKͧ-R@.yn|ՂP ?^<ljVjZVjz`rqEL/TCg7c`8þ|dU!ܞ6m3iH F0JgC#H7 .b|Jzk#pzDye8)5&Y9[-Z: ٛߕG.@ri$ٳKrig6kIP/e{%j ՚{$ \- &x yvk f:cK1 WZ|e7y6Sx A\6:x8;0都"cYnszZVjZVֳC)x"X-uթi$|j15 ;`^L촃6NL% )0_R߆4i_H?LDNk@X,C=kqkSnMĚ1b]Hb PyV.< gdKX ebog=G^8c`rFK1 [9 VWv+D1״@% _$2 w~>\ϧjhp}!I|谽tVjZVպzv1, U- 5 W JrUic&c`jGNNPB:@_/<: Dm=Z4^P"I38@p[1d+x_Ff7 FBf뷾@ZϿ;Ely i@Rir3OF_M/n|sa*Z3 UD )TQ N…8<$7QPsh$7A!ʝ$k~&gnv=3(J(Um>d\e 3k2 ;zžhx'2r(iX0 &\>'燫 =@ 1GM+ e8$़VjZVjz:|"͸>!Ͱ*KC{_gtbzʻA'4ߵv܈G-Gh츶qJLdTsrM i.A}%o.#k:ߑ֧~]hBF_jij>=j7^[,=7 ciRhz9U.#@J %˫7Q`<'ͱ]-0G usO"O*~ϱ o܌]woVHuc ǝ$+.G &Vqwf;#pbt"JsrJ}qϙCCA3<Ɔ뢹?1ɉVjZVztx&;ф%m7rnDbKQ%(]˟v Mξ@S\Q `5Qcڙ0"IV'-@[(H8ϨOpe E/WneK^F`{^PCn~ؖ|W|.Xbߊ{5p$'`ʹ9K1NTȍ, i܃B/OrG` lE%h2LBA0+c+&hC/}|IH1Ǣo $Z,J3Gi)ڦqJqirÍZVjZV*BD"8^PjJ~뒙I>~: }ԉU/aSdKviڜUl<_;V;Uޟ Dq[9fE< ~ۘ1E_šDSF ݼ6vւpPffЄ0R:wKvNjI˃"29$65v>o޸PZB'{N я4!2Ce -Di65Z>Wݭ yJ\P b|*3&n+V#) 1aR9̫K[cyۣ[ .ɭrpw}φyhL04HS"=l)Lw~L<*Zc"6hP0Qˊj~xpCV&†XCMOx -.ѓ"{Ws2uh\tNjZVj]$ZYo*gբցł6\0=hDN|<}Xc;h ڳ2df3Lu"Tzގ dJ.ڇ\Mr kۭp@qE||$v<$hѣF01Fhى6jUb ^FP j3*U޿9|ะ;Q~;r }r?&oHL2 W"T~LM)9_eHEW~:ԗy |ZVjZV*ǿy>^n֎A!%JS*/4od Lyة }nidv&gGM85CAIiwj#m@ | LwD /w*wI#8V?,;S)jK$Ra}~/_ R[8<{+`0e:dgQ4Äsi!l䒋J44'jUq y_,pLtiT Gk]Sػdz((t cCyD~,ZSQ6c¢ggx6lR"|Ȑh,N#HN; Gocqۅ"ϰq=$rdj6\H&C {oPyjoߑK r7P~;+Ry랯} YC0f1a _ք{N%k[ n9 Rf?Vxქw+rH@DCk|bXTG>0*F]Abņ/9²q9zzZVjZV ޯ>qXޑ-,X*NJN(SX&MBĝygωm:,ANAEORꟂ'\xlnҸ4AT '7zX5+2l0#zޖ֕/S]*'9DN!TwP+g*܂[#⩠?iA>< HA5۫M(ogt9sFcLJegYcYhmKjZVj^B}(-,{E @U\TXZ=B#F.@8)f_rٰ6(8fFom8,gU^9qjk @(ݜUF:nJۮz/+h򽜟ZX 9T-BQv,ɐU&@-o'KP.MZuμxKr[f 3yRs^nxCQb wK9UT-1I6] pjZVj]EHp{w>@$4ZpEl wq1 /< }׈Rcx/Hrt{ʕWR@6 J~IkqwJ%y%1EC|8%崄8]JǿlvᣳjZVjZ/~d̤Ʒ3m08[zHqsip \tWGc) ؘu1}ꍊ5R`.sMa-ũxSb"fݭk{ -.c%ckxol7 i;W|uC["6-*6rdIO+Z;RYey˧U|`Rz#,é;$q<*6W33`,OZVjZVzOyjDsX/W+RYfR/ XH9z:'<&nun 1"";W'I"`xCg h2F -hyVȑ&qKO8#h ?( L,, g^TF@I3YV̪N4͂z;?b2\wRM‚vZ+Ǥ|uz8vOorIj2tQ h;lg7?Vzp hHZܫ}'v>@Ozia*Z8Gy{c"5]e۵TXZ9 `)ʈb.&8.> uzOOCâmnx@3$XW@"z4x?@AͰjΔ^x~n7GK~{+\)Jt ebz~Z(#hYD fυö'V7(^gJ/`:й'z0mrsɿsw!pS`vpjZVj]E}"p{wko-Y-X'`kv5ӊ]r\p`p 1V14Gs_%DZ=cpɼZ]% PoO]iS[N N5\9gm*[HP&Ygj>KO5X*.H7Q}j0Ѥ1 pocY 'ڃP(9\6M $D.R#0jZVjZ_jފlՂ2 3/tAS].Jdvd;+x8u'\ٔCE!ѳ%ѧbM>m2ᔴN.6矼/߸uZRp}Nz"M3T FW૞\J\?6hk>B !"LN."9t*5|`/x!:><!V $QC an@[ !,@aoz*Y]XԩH'R0~AL@ wFZ_EGPCb[G@$U(TGq n`k]{;3jÒzgM8?Vjg9VjZVj]=};y/OKwZgcQVi*9'r̝":}QרC{eAѪ[O؇LN(¥Y\D $\_@ZHK7 0*rE! S !{-/\n | (%rT*pũ0J;6lz/QTR95 =r_ݾ^ pjZVj]Ez7׳W vűv+h&0<Үíz鲌Hq7VM P@+"Cw~+_|GZXzp>,nn>)H^Ú2m/m< 2s魳QUrXȡMCsr)|jZVjZWR/޻-,#M*/{*hqa ѣ2crtsSyOCLjMKHCIJJA_#Ǭ;@@!`5{&as<a6Ϋ}4C&zt h=i>!ٛ!|g@ UCZYy]r9 "h_UpQq r p MgbN?G{N`BGFv&$#1 i=ZVjZV67V-X/7.|3P N‡/|Wcg\;[~,QtC -9d7|^}wg7k}=/vRA #W†P`-[5s7mo2??BsU#Ofgh[YP8 d>կǣmW.|كqXAZVjZ֕ԥ{wg7mY:eӐ;"qWV/|3B'b@eu(~ 5O'%BbU# 7*kA# v%\ 13#/뭎+iӯWw* D~HXCr8X DupjZVj]I]*=O-7m]hqp0/dV .,'xmS"ncsg`@[t*~;3H)khl5cr o:IsBi;8g$O7]VP_WA7=PIX-tn8.%b_&+{Q f( [iZVjZK wч~㕻z ;'"!aL{7::;2IAMXkI @'*BakHh+ < +- `]ʋ Э+M CBzxX] VI!a;"紴jZVj^:;‚ux{uBPT#** D3K@7\;pPoQ(X܊ ZD|w{{cb.6tl"W/+0Gy%L>qxVj}/U*#"wGv_urHph߇K;ZP[ pU_ce o 6~ʖޭHo{2 ˘6 ;1**ExƔ18D} @gLEVjZVj]z7^<^~<Z<Ƀf-_Ӌ_;(_kX/rŗ2n &Bip ZV xyTS'փn/mض BeWn>V!otz_z_!R2ѭ`$ȿ84*|"B| >ևsZVjZUԕ޻U >ʣ'pX}fHե(?״i__T~7&WVxADzHu5:c[/y;N,04eY5Fh;+p|\ I0+"Kh" `+2IB3Ov-ؕ}Q]B@sZVjZUԕП̃Za}簤>7K's[%J WoD r6n8,H36)E" _Z/'H. eɐ` HZЯ\+kZxxo9lC'E7{BUCqnu|ӡʉ4'i'`;[VjZVj@o_{XpTՕ"/#ڈ\awJ3Zxu>nuW"q ʠ8`hMK}gߗV%q0E.24֌0zMD7Jy=3fPv/ rI7gLgbtamd8J(CʏyI?z"!\ޝvZVjZ֕ԕm@=Ǣ:\>Z"XR.[_Upίe_Z9+_}i^Bp`Y D`y\oE\( !ǛNa\#Q*sȭݫa2% dY'/n_igk@ʉtP,CXN[..6zz*;[{ƛB x OU8n~k W#{ϘDOZ)/!HV(n`jZVj]M51/ PIOdpnk˲;|nd`ϥjC@};?@q ìSΉ(ƁY; wJ<wwܭCl!,9*LkE$U7)C,X*VjZVպjcj ٝe=,pBOvÿV #l 2'^rjB\@^w;S\ꛦjQ;m_D~ZVjZT?"!,Xl6+p[r-DP>O>XZFp^>@m5NG.: hvf%J!" A[%"t K p. " g[i7I dȲ^vZVjZTXpނ\U PV ZVjZVʩǨ?~}%s|ʵuoj~, APOeaq Urg <}p&Cξ,:PIݎhF|fp*Fq )ZVjZVO@}}}l[aWKHAk7ձt{T6"*b=~x/:ط_2i uN)A!WVjZVպ'}o}?k߅q5,z۝I% D*ol5j43]>W:~}BɲpxCZmm?g)-O8444 /<ə$E/)I"FRd<9 DD~W$C~`~a--nh(hN?rÈ!D鱰H&X9vhqypw/Oo$xWsYeO>`2@!܂*9]O𿞁FIQkxIfح/T´:=\c.Ng$go_}:aZ ]q̐>$q !+g(-=a*Q|R % LZ_72W#FیV(bJ-LS ^~Q爴-ƪc`]('rQ4aQz?X*-HQDU`Ȥ* M1iMQHǯ|fI/Ƶ=z\? !'ݮ ;Fp!m~'^ lP?a"`p8h uZܭ9`! f[w!ЃzbVS}1d- =NruVꞪCc)S%pzt<V20'"$s='V MRUSPi$$ϑ_~)ާ4-i[wtM@ʑyF~jtC'c>J$ )z+Fr@?X"v&L]#os`,V6/sJ)2IZE (11Jl ڌ̖a#)Zjzu-&d@zOp P﷼`5qz).֞ [?z6$DՙO[ki2R qze%${EXƀ S*v2Ek_EPKih(jwhWʕm(.,bX{1 [?>w~"Lnusq;1!!kB)ݕĢtt6DyGci9pC~&Sj8I&4@(+ut݉3_\n:LxU@S[@G+9igیQDZ"vv9 k0"53+C뚬(rlHЩZV-F~ ^̻|_o7qM/?wEtnJ⫳ T x+w[e(]!ZO }in,G܋V@E t-kf椏Ƅ!wd:YZ]-NzYt4bFdKH$?>~yt>3#62гdĕ['*G =$u:iyPyJתA췋#G,`7>׍wZϷ_FwJNyq`j{v!\BP[edj&jfYdI/˝__AH-[tC#&$d{}Rz9]1J{4N㙼ՕC̑24LXyOf~}`] vuLp @1 T˃gH0@ k)*ҾL7pH_|k7yü7kQCOlIekSRݹ#x,]MzfeA|,&`CIu oLXp1<|}8@"aFp3`4 #myEc*|y;4GfBTI ѥ}Ho68 0"U| ˥ #VNRT=K$صtjp,u1V 牉Y4:K̀lxn j ! lha̤)1(Љnu,1 9CL&t]* uBaF e2K$XŬSRAjV{rS.䇵χ*yt vH]xrod|;l#@G@5A=Ղfyɓ(= aut>QЭN6LO@ÎQO 5A|JT cADm0Qk\,=._?:d kRSH%C5e#=m*p\= I+1lC>}C_n$a Q L)QػBk*19N"mtz(K|]ݗĢ%V h40p} "AdI!VNB@b#QHW/HXD NSYRv"AIѷI7`JYغ2_> rY*tVc2LuT'$Z |~AקX9P=p5m17rHKQ4MHlWY:y-Ц$PYS=FEs0҄-?~AhNEdK%4]U=#ıFAV){񠐩*ʓI5Y F?gu mN"AN6չ1 f>>@і/h^2BCB> d >؆3 A-7&.gT3P* 8]FI 5BK^5ĸ(`QD2`<Ҭn폣Cn,?CtxxkaI IP2~_[Uqg``/#&!90&L1&&Rn@c4tỸP/諵+嵨 DRYqeDPW_dz7ROsjqZƟSE&M^fH&?H׈E::JAb"()kb"~&0p#7/=Qzd4 {]!pYZ!$%Ëd΄B'h |oSަz1]PQ {Jj0"HQYE #Ht|oܜB` Aӄ\߼'-upc~[ܓfbBkUCnȓVLO VK*dJb" '8uTo**]PSbtC#.j`ȱڏsM;=So uG" ķ&56Ϩ)Z~p2&.@e(i] oS6Bv9i a"Tu)"`Sd67\oIs=* cc."3yR_nzdRd?gy{bO3xV`kG06`? #jE (VjkշޏrQ_9Ў'7:F>r-{>:Y_918я 3W5:/C-AnGuר&BiP{d"C)ީjEl:v k X*4dPҍ$롥r&1 7o<=2FmWAQK&HD YeS24lM~ƗaJQ`bem6>襷7::,]| , dfUj*u5RKcQa'"si˗FtOMJ P*cKe﷟WiۄL)Ôч6O[5D{D'}N~Ox֙3q+x-`pQ$+Z%$YJf~u޿؏YY sSbx` 3([^.3a9t,lW#pCE+_[3ʔӅ 3eVFM̔EDY%u.FaQ9ȿG61Zzϡ~ޥFgaљQ7FrΨJ0CQx@H-)/hK՟܍XKR/# o;J6'X^e9Sy[ q?ft3r P,7zldؗ@Q_Tg#Aġhc |r m_e^[vbҍKz:#xH)]NݒC փ AIH{s~6G'*   V{іNJ e UU MߦapM-Q5Iʍ鮧 o8eBzӤlJ=]$ rDLeM4hCQaߧf.  s7vj7j{WvHg J~3aEXİ҆S{vVvS\8M7_^qfja׃~zϑ /2 S#n) w{e];Oȑ H]Y(͕};Uuz!2PꫯnsjL꭛J/Od: ;,#x=q IիގnN? xHu$Ruϒb"}Jp`ak 28ugRQe%]R>MG,nOu}hk1isthjB6iEDY!c. C|#J " 2+ oRB CR[Iyh"GGR5&*H  FX.:X}"@\#p!uPӜWq+ DcgV,^eY, <=-t]`˃lUmd뤖A 5|zg&U6/M8Lr_jdw-|M<$)ʢAʦZr{:5:gk@hr07™4m?rh|" qQzGYTRSʩ>&'M8@+5؜D娙e^YԪ c؁2ghnPG_^i (%]e=wB/E~0ŶȇKND$zZZ b'&s끇Rm1Ty =;Cc nh:Yc":R;$Fy4(hɵgE] ~v:tUaz 4Y&7g ?\[w_@]Z 6?|~Y-nomT**H;R H<6/Pip Gϑ`/х߸SV#I6}m֡/˂(0Gez'86ہa|E}vqO҆ـOC$ML0RI,52EcZ+59 xk!hE2bO_p[C 2K'ܗ3$@] N " X믤[NVQP9=r@T~f S<7G_K>2,R`pp; r8ӟA=""BFj+)Vkz2G> =c87NjX[vECx(|"s"%0U(IBNC*)u}PtS'p>4d^qic,6V@2Qǯ#p6z'))f*]"0ĔSч֋:!jfl#6*| XLw̅&iha|>zSݪ tvf@eX*Dgg6&_9c#mfg#&&cd x09Bk H~im86`Ƿ[xN?CkN K<޳cr>ݭ~~?2.+e5]I\N5{ބzӏxbTX_1Vm -CfɯF&30Ve%7ŎYσ~ն{"lzB mϏ3gy4eߋ? N 0x;U-WT+?xAXo!?OSypg2w=}&~D5KK[;h)3"rh2PIUx =aFQ-}Vm6C:`ڗ@ 7h0Z/>#[c=O$JvbkT>NrPY$3dy藁XA74Uycm>Q[a̹!od&ipwTs!"HzuZ/hws T5>9642m(HV->!Wt#@WRЌ8]HI)bYQK=N_>YZyੰf Eq6I#C bTb| 3 z.jn5n{dUғI^}AуHУPFO=|x׼e 4M/d%031+*{#qڢ=b`wdX|`faHS[]h :]51ՃIh`l.Ɀw>xW"Fh!ĤVW= jVt<AR0xf$UHpO-^-a1?_3 N /ټXOqtT*Þ')R\|U=R`e&44/4ԟB }mMJb{5@^Q{eGO{1&_nOwF^% &XoDzzuTJщ s&MZ.T[GNHVF ){~UGߙ,^jRwXRP] W3аTvU] l)Zej?hc?7^<z1.~(GxI/A%Tn{z ҹtWR2t6͉ N'1y8чN&^ FG胴ǖ" E~a}Ό&f,"VܽF&Wi*pCþc|ag{bw8o "ak*svzB:3>K/>9h%$h]M=%tp`c t&@Q_Cþ#"US@A ht@@#z-PSP) a"Uyc%D9x]A@'K"`C>#mgsZzgQ_C~HthD!NP$]QNE|LM }Ŷ0x2xf4K&  F#AmkOP&Ɣ&@J6ŭa?kh8nΟoBc0•L~0g T%ؤWtELŞVҵ\+9ÉKnAbpEoSW^ZGR7\-IENDB`nrepl-0.6.0/logo/logo-w480.png000066400000000000000000000542271342636505500157660ustar00rootroot00000000000000PNG  IHDR" pHYs  sRGBgAMA aX,IDATxۓy4gMiq6j3V;+KEQbj(xP+ W3SrRHSPE3..)(j!01!Q+>JgZ=uݒZcwl}z::::::::::::::y Gm%J|,Oȟz5,Wѱ0r9(gy'޿RJi `E޶JJnKwttt<<4(nz`9s J$UnMJBJ[)҅ =P˚g=J}4Mu 8xu4Mwѿ-UW3wnZݖx!ᨗ}ʬn2KBSn7j pQk`]o)4?L\*I*ЋHz ba2Ֆ meHjAWҔ!--*Vp(93ssJ8fNzB7 X궃ٖqyIxIe\S=˚}f|6-IY5Nla{ fZ6FHF!ʦ &&WHN2u!9/Dpdoz,o> Q,rvQIVnA͎+ w(Fv!,YB{wl+C*ʞq^@4R`Orl66A3wBnii4$d lx6㦄+N 4U:![*LajFxOoͱ ˶4¥OpgKwttṫFQ 8 h5%Z% iQ~Z)qas -niI$x (LǏL|+-r/+j\|}ЧK pqv}mmNyj+|v,_=c{4X<{)=JYy"l,^ n;{5/1ZO TU2-NVO&p!%\5Y$M8F(4JVcNY%ji@_w7 :::::YЪ`9h+Sz>ҵ,h#S!HsD tR!WzhbǖUMF4J\lw`'f-MR&g4IUh6ekXpu!L/FiSlF t6@GGGG1..ش4|#XY@4:PŖtK"X V;z@ѿ{y)`SЪX&\%gjXqxv`E}TٹoGGG\eS(ؿei x6}`F5ŋmw;OpTb7/#{ =׈ [֝eC^gfL.RX/;&yЃzO 8!ci6$-6NVR&)te4;xņA(1DJZJ`ClwywgXq`0#h2d4 Qm@]jwcIUgKWm/h?׽dbf$=BIzt[^cH[7|SJxpK뼐䑒(5W 9ULCQHBf6^^# 玎{( Ue Wi ڠ8-8l1dUOV iZ.|"qgBI(Ju?CxzȰM6w c4VU!`贡}"d,aX#? 9@/Fָ0lے+s ˛K侓0d=䇚7U2=(k 4k㺤EjRmZ;8+;`jؿpGGGb&3U6" WbT/j+s(9[lF=1)YjeYoJpp__'Ww~iFL9IKh:rC=ɉ`g8AP6frÍ}׏jTY((֒(Ay`_/73o@cyXYn{|%/;&tm/hmQڅJb`F~ ˱cfyŽ;Z YōcKEY/%6 D禩NP aBz@vζ3,df'su+dA0:9ŀiRA1$DyHz&g}t:J~f?od2s]wc!!$M+:T(Ukd`489$'W{svv2"&9YB22(ٔ(})Sy>&[߸0M NJ[ic\u of9K~ ĺr`v#^;o~T-%[i|2=N(d|<;^(AW'|&+Svٴ t\ڎ=Ʌ# cS^kbMi֪ T0o_zww6ki>⢄gҥAl%]^.YZ%L@BKTHdw2i;/ڠ7'"Zp9Z,GR;5uԀf}rI0FU+D$dޭ ,ljYes(RI'I Ɖ}cmYꟓLj_~wg[g&$, 8O!Z)) $'J#2IluL g/qh[ BPz޶27 z cIRR2ບm3hV5IO JԦ*؍4:J /UrJz IICJQTQبrZ!_,r%]L7g%*qD L\-xRjPRRUn@c(/n5L!j^%W98 sWgvtq$j-c*iFe|&q֡}e->+1C$T[.{gh{ZH8mVQ3M*䛭bO'9z!tN5K!AWS ܫ9sV9{&D>$y55~$0go:QH] />O m XDԋ&W ni&}C u GwbNh<ٕ9)p. hަ P%,ʯW-fVbGg,! ,O"Tk)Փ&e`M M$m!e05vF`,V] l܆ȶsxp89L^CZ:\.ISE &{b| Mz4 :U >Fd,yMqǙ Xq[FCr`P%rrEk %BluC U%VOiZ|dPbljȺU,TʏxKo~ <`aą|/{C ;\o_B zYcOBv&dZG$)pITta$QP۠lN~M@GR۬NU,ѥ#VXXOiޮ:0f~#L 蔊Y $rVLrS|EkMGt 6.kE)7Jze0d]DKo䬶^$@sEx@6yk]2*q @4/! {@>+eדu//@sVe`QOUNtRk+lIĖt:Q-+JSa6#:t݆`MhtFx a4&Ăd|A2AfCkkM1^Us| _2ThL;3c $; n|؏Kz?'(nVaݹeVyWa^}@^2у|0]~,|w޹ rO\~}$ p(2 7hJ$VJĿjla(Ɇez -Iگz0^ݵQ V9%jy٫&3qo{Gޯmvڄ RT{Ο ,i3 r Q唡5gqyOLCؖ5|A,IL2Ðkt|iU\<٩vf X2fy)M*|,bM. i٢`%ج+JF ` ̈́5B$}+̈́Vv}v`4Nt*[ڤB4#N57 IYCڅg<NG۩vi(ƌD+9EY^%X559VPG!po'˒&ʠq~r.$ލԢz`fDՒcjR$1Z&炉jx Mͪfo‘u%z`UJ[ 2n$;φd_[tۻeqYRmұU5 $;yF.Bb\6p`! Vpϵ~6:g;K]0P{ Z#pzϏ2pVJ|qwPgaN,!"":[,ES ; Lj3+)N /[&NVN*.5D9ȓ"1 ;О D;=fKz s4@i]Y,i) ㅇDpw%{c;XBs;H:@!\d 6ؑi aY O$DM`T49t h2|:4$~@c?cO%`𸡪RQn3'NX")^Z]hTВ #: ?/ *Z}s̴b/n/Y|#Qߡ^#Lkoݺ !!H-(@>TFh!5L)lbw ZX)~0lS| E65o׆Mv!a0YjDŽi&)p3' %C(*{6>'~-9t>xp%炨3[A߅ b X{VEx@BtjXhK0Aj ,|V7%)y$fB ;&#I5(5r,10Wه7dB3586D \9)BY ci[yvJ4+L2湄g tb"g|2#I߻lֺlF6s[> @*z`s}Ezf>֠*rl~:X}>6{ދhjT;zy翀}x$؀=t:0UzQ`J0I$1TV*I3Y)Mʠ5x5!_sXWGkn❣ `>h894R d*o 67q 6V͎WJiҌU1+`'Y&סF`o;aF+rLW⽚DX+̗}RLs `!3G~]'ؠ`dAڗ _IXUY BP*\t$W$M Q%}#ZՊڗCmn;bGOhkvxz%Qۺņ8Plaخ`m3ƊpMb[zKȷ,qvtRfmcgICUp} ʽ$m)t&B S+=3cneBdπ$PuNHP,ʤ -޺[~|iH4Ij4ϥ’:z@a2 =,ņMt=Vl^"pU>f&rOOԌg c:rФޅ4gx|li#dpI@} >:9/ūe6RˌU2@bdF/D}\%uJg}vJyVÇ=kڧِI!#^\PjriJfd1pt@)IS~;~aU筭(h.vT*PD[3qv dUPѮJ_U],0ͤz lIQ:s#w.ACq%O`3p"t|2l`ddFs;g<rs\رcpE!y~[C- -%Sd_F o僤v5۞PQL E c1a}Yn~hZF٫WF#kf6kZ{2xnoM;`s:Eg?_ u߼ x{c\񕂑` BHZBCGό_d; s୷:svKKKa>,}ޡ8|K U1Aq`W HF^ƈb#)if"+i IP5јJbp }kC137ׅF9ǚc6$Nb1u4iyGHw&qL@SKx:>p;z &P^7s![Kj5e3d2\9(…2090Ga5s(cKNF~f{*[ժ΀${z%|; Lm٧-H1EB&oB--7\^u;:"Y~g9.sE鵿3kpCIH2s#Uˬu_u$j] ?xFόKpiއr\m,; w׿~”fxMM`g*!ӔHp Y/Flh_%^'г( 14_F2|ao|wCdrkeRYզ'55еJB>A/N.=_9&x >B)5*Va \^>#cgB@xJ0@҂Xy0 @8VX] KM4N¸Fߗ_QZfb#'w=,%E$5ZV?qs`U<;Ӳ b2XÜ_E)K۳wEȌ^}4σbE{(?`|&5>V8 \V}Gw VhչD1z e%WƇpGxAGliޑoKiva U&g›0* SˍBZ.\ qВwX=Є ͟]ޝSѸ`7 Xg#pU-pÏxN0(] ( eUs0d`;!x͌~_D/D4xP Kq5Xi(-XCp7=1 ,V`!. "ZXR9s4KE\w ;gTQG( 0oc`_Z(fi!_e$xmu 3,YKAHl-$X3I3XڨfSZu5 sL`_$0Imcg9L G8l* !o;A<@MC@uɳeY߇xW}(;S[W#:6Z :yVKvHr{ڷITX^΢~ c[7GC#Yb< [ДdlE/ Y^`?6V X-h/43kZhO[qo/ nQ9#LZNDv4w29r,lڋ;z+mH{H*= 7=Bcr\EMM3cO* $-<2/ȃމX O,dg%gvXMk+&> %-$\8,{/V\-< =u7WUMHE=F$cπa8DŽua{5ͳF68uh?pc ϝH{FuzG7͡WaXRiYULlBr”.&!m &q3^*ā ?^Q$\¿iRKR1dDT1re$:Vlj V^vWЩ%V%4&@`]}!J'!0"#@춁)]JDm ζ{`"TyMƺ}z&ݡf8pi ~2}/7GTP|F#RV;`'CtCdr}uQdHw0%7ކ74 qswu%l0p2'%ځ lz,f`IylKsԳ4 E} ̟.z:5dKFh!$m 嶄֔>i\'e: R<ֹu06T“SI4(!R!A@ H=$/A0]2l)'($F}GqWۀ#ʻӛ֑l).uzH J/+:^ςVE:awPZ)\{F!%!ed0N+3zEl׹(8ks'ޝі!hW(M=fZ*Ԛ 1{E+[ `hҌQ2 meeK&=kaCB,2 2 |c M,G٥:-jWG&IFƒ#bZUb> ǥg> $,CmNU8_U-M5POL4K^-iztyJ| y~ 3l7܃Clv@B6v60cVuu+/+,מQh1Àɜ<̇W>O򮎅¶boFNFUdHE 5AVL_vTPȆ(m+[udB.j8>8*|S$۵&*9l p:B!kQ-+NTSK`gj]d7IiG4S$tk8%~Yfs{F?(1}hTFݱHXi$!ḎR)Kd5ifv5[XfO[#-pтVɢ%2i1G ΂qDk<1Rm'2P=Qgcœ%=5@MJY^_-M2dv'2^Ʃ>fV#=ȕvu//hYar-J$ 4Z'gT6[/D1u zBF-V:,( d-Jkf&]o1F: /#F;a "X+>'uEo9!ꗚ&uJ%QIdU8P3.ܢ+AsA3B$N<uku ~-'(#d_6CK٪,sVHS€V¤e=h?&S(e^JVOm oإ>eg}9[+:B|mˏ`7{`7$A~LG{f/bEUB+$3 &!ϣhR}KJ4de[d#Rol\mjj:9:2iC%Z^0˻>0_;`TR\w`$iEJ:^T>xΝQ-L_iYYY(rEkbf`DSZ0 ftf~,jft!|sdI%X:$, ݒ8| F!Xx fG?QхYJc$'LiKV+2SQv6& mPkt}Hzi#Uy ;"gF[RJ&S.Y+qH09'*F]z[B2|`5u[*xE~#onE&0 {T}%ziPv#ls 2^^֤$*[k*V3ܛurqk)V&@cy|f/.| iO'{W\$ ǻqMDD昪ڒ*80x7 QkrgAQ-K4 rDf\m{ͩ,ݲ$̲4($\#KՏ/h_s.R$,]FgR.Y%Y1{nc6Igˣ-ȦÙ  "&}P-z$aI/x*ZEJ`PKVR-yB4yDX[%DZTI6+R Ch7>vUYTg I嶕- ?Mt1Ē{ J&Z"8[ѯ[H땭HT,IQ]sAwAX ֣}UXIcEKVǡD@>=' hUh;B puK kw6rmEYH9[ǀs:|I j? VU%g;uQkk0=0x++m4NSFp0c|He]"I|)Xц*fl Zڜ"9wE ; Ƚp7vu7]>IXEΌ+;Իdu6l=ӇnARTH8AV> mYV݊S{LցD^U[T~t `CS$*mUul.=?HP[g1\ 1{W2`pց$;?93z&l8)]:: L#='e@=r2xBPOÄ`bv"AxϤRY"=4}=BQg!D_?6bV_hah_“$(ڱ(jR/GrX]ϸ<(^[}Bri;r"-^"gFӄ Ki8$hyl`)K%FHRt?93z?&l.Y݊8hZQVU (W[g?K:7@mb~l "4KAPsnݢ }Բ&3,>G?+/~J$g&e%ו3$ze>Af"(s8Գ -ߑZ/qIFh pmWKyui,̷w.1B52ƄpeMurc^?!ch%-0R~UL Շ5Kkf*zJJ:3߷]=ydǖ nZeHwr 87%߈L2_03_z赩 ɰ\&Q%u z):_]WPݯNr,/S3aPf )$8Zf+2mD $S| 6W䂌@zJbr8GWk(+hɕAIStm[5"w 1qtttttjxS ٽ6ZRj=DZeU9kr<2ŏexJ8e&l%1\mƋ$)hMNCS^[ۚ đ6[\ j: ȕ9}@}>Ž0q'KWwe)@NQK z ![ղe#/Z _|ЫPIxټ eu0:XԮ(+_DX-sD+ $tpa䜒͌*M+y0jEI: R\~x^21x0RNv@R0kAIچZ&2\|h "|Ե4|75k U' z«v$ʏj5XTu[,q]MRVB5&4Wѱ'4ti׳tyj;)#b2kT~>~+U: y?rh H-ɼڋ?pWq?z-|5Vې\`a"TLVxc@r]d݃Kw;:::Cy*?̂noǎjnk~ imxbz<InM s!v ^{Y prY#4):HI)&WL•VŎ׃d&5ГߢBXtMLw?:::::mU| bG,} #>L :y5mdL&H6^  Nӭ2-2͊>L"cU*4>358cC1/cF%3#6V ) iΞ:ԁw:ܴ$)Vl̤}IS5 d)sr%&e$D zԬȡc E ޣDb}gFp4KѭQ]2ɓ+_ڶyq(}j8NS7,,6)(٤-xZEksILh%x5 k!B\/'}.3oue A#7F7"{{ˬh&&!ޏuRBp{X} xCO'A,ooQ 8ňBBu"+_JJ"prٗ {Awttt̋&WHx~.+ab;)ݏ]N63}A&e䛕|Ǩ$)me8dSV¸!޽Xѡu(2 lݺx\JKĂ@F*D"^1[&}Er&htqųI"vaK=}eZGBƒі{%ݪL}^l9NM5. 7ȼ먌UAku]7{z:DqNeK,.ܘ4R>.%jBU޺:Ɋt?58`N@7p?Rsg`**0 FVNN8dɰsɘRt'''2Ϻu:h}Ud 'de;39H0;,xnc4y4^OE 9,;:%InK*tc.싏x'.dX͏YŊk 3FD&+1Ǥi 5X0T%JLMpҌ8Bres̞2'25=+hhַՄ//w cS[} x^@D77~4 y}N=2,(Ԏ.JɱP2c38xQ"z6 X'e>Tb1/]HҩM+rB8I+AKO9ʖB sP%m$QK ̚tTHaVU\(bOZYvtttt̉#nZ)Hgٳ$}cm>ϗ&׏mMa:* M2T%޽J,e^nm=$1玎ǃ Ǜ։DϴiVeKuB& nd=z|`J3 I-EKt JY SkAOpjIpб+Ԏl+Ğe񴂤/dHK- >4Hˀ;:::#1Ŗƭ/W oR'{E! 3Dj\Xi yAJY}Ozɐ::::#uJtĖ^^ܤaL'ÕSnޞ*õ.ϣx$f]VZe_]g KWGGGGq`RY_ZƟؓ_=իǟ,wkʱ ur'jW>j +lc`ST*:s4BW`F`uS.%R7Bb"8&bH1YB W^q?|DӨ[o>NMgjST*ּg-]bYVZv >ScN#I ~-7BАO'EB]+r* ߑ @P|N oJXK7 LRTi-(믥{"B U3/( p "X5AM<wbE &:m!"Ӛntԋ*qhdžeڶ[I EA/ȋ~J< @r/g!JRԾh5\ܵӜ> nI[Cu)^Klٌ#@.Go"±_ :`8M|a_KER"z1iy^ ߯8+aCWŝ_~ RT*J'M{ &)T LZ lU ϑ/d0鹅چ:)xzc.P&7tdih] ׼* Sl#r88-,©T*JݹVCiɦXhB:{}Y ȍ-y)1AÖV'r:WgKq5?sl7!_I*n?JMRT"{!]@\A0+diMsw$,< Xv "z+V{A]o9wk=:~[2'%-n%F I'iH!e.j/ү>T*JvYpȺ a8e@S(C.ܽ^ cB֞NS(SWsS)`Ne L|M܀u(Ot~*ivϖe| Hy>B#\BZbh{q =KD:JR]kTpݽS,N-BY<߇SwblnvΊLئӚ.L!h?5jw\OO ّ_y8l(E /aIя}' !a=Y!oA{dX8JRi6Cm :%0/ Ң5X{XdÇ;NW j9&VL'0ަ[;xy hpp ס9떻MXhew-,K9H*JRj1+jUsG r A`muIݢ8%V-y>sY Dx\JCY( j!E a]){/拯? u羸l"T*Jj@ΕI|> ].y4hM|?{I4xA D L RyN\:Q^MijL47P?kWHvOy@n:؅na98|>gIRTʵH:Gpa[I{sB` 7Z<7 .@"ε JdF*ʉt!Fu7nj t7K۴ӝ):%6Ӯ5ГU0DY:NRTk]13TCuߌC+O ?'nEo(D! ~\!< 4;'6pޑ{wz}B~/)6F w 6/0AxkU(T/f蹖aT*Jw /$+ b,^ afm3IP8MVA}%̫˃lG!9a͝C3wΟMWh@n'A@@`]N- |EG}*sώ@-$-la_͖1T*:Z<=5XB1(K38{h-]CW`I?}uΣ7GmAn@.~na+Wگ$]ktȀ+D}7.MRTj#h&8+ g;߉ )ex@s {9ZrHC #Ndu*Ԝ+~+WO}߿X\` TWLR ̟-Ѥ+α9k!wEiR,B`(?]6wɘT*JݯZ(Q4Й[*TBM q}ur0›BJCunM 9y>=\ U۩pN\ wmq.xG+r8DCo}碐w<K[j/F(BsMRTi5ԅ8 8qܖ!,` ay|:oD=𡅂_9]7Bgڸo .I. )F+-Sn \';6z;!cd4ޙBST*:wP]4m% !~_X} lH dXH֢T7So@+N7x:y %gaE#XU?xVTln]$(qym\RRT*uE>"McYݑ5[P92 1wIGB YXGw:|@+Z5]BC\;WrDr4Fu]m /ϗVBm㸖{oTStST*u̵$)̑D |ݑ\:Ԥ|n=Y/y`V2ZINتSE% 1¤t pCVV\v^W^q D4yX$?аެTp0>j„ zuu;{B} éT*J_:聵jQ"[` !eH[!zWVN7&^ n,lKZfy$&ؗ)zp6X,~) ؠ5Ɗ[{0⒖Q.^@\/ͻpL0rj*JRR`,Y.(PUR-d+3v8)1,Y&l{( oD (FG80rfC`|= <(L] щ 6ۡRfBiOA oox@z2׏?SLRT;-U.f_@fU:8} -C  Hپe6 6&Ra@7F%FAed[\Ht0A#yXOg@-Cgj!lG& ˪'Ҏ 'qX񬛝hM]uzaCұ|V\!*Lyc!`xޜf>O[8|/BXZJZ,^=[Tߑ)Ʒo8NRֺճP0Zqc 9nM^1ːrIc(QgC FppЏ'ܓ 7^>Vbo0cSGoG-> qs?z_h:raFG#\̺"9l6]PMGYbe|:ZىZbiRT*b !9>i掉]QҟAք+OJEkp Cď3Ta&#B q8l.v~_=K{pWsſ !_VT#}}Rs K9^1bM-+yP>T*JS6Ǎ 6X+00)`\9)&xI3(4!qB!89uw WâWk`xAhSʀ8@Mc'vx`ۤ$1un8l+# M)ZHxXV#ZXFkXCM$_>I뇙JRYɛ 13E'$Z,Pkג;}xÏazYg/6 /z|ᤀ8wJșC(F'~9x, ] orU9WV\0rCV>b*a5qWASӗ/ĉqFp=f!`u:=$̟̈́BpՋ*Nz9iT*J6oF90qDz0]$cc&Dg6$YYsH*ޗub7B(UD>ĕw1 pwؤXߌ05d S:_zGmo[_P's d-x%*npg+u"Wȵ/Jʠ2qY:*ϡkZ6UK F>GwCqbx̙3pUq=~k_ۂ{@'_B 굹PrWራ7}Ծw;yZ=/58dwYp a&S8!imڃ= q;jX8 !:D;% !cu|0[ t q@I5c'א㑍xڥ߹ |^Bx0h% P:ˉcLOy>"c~1/[aG:82{!.~bı,c5^qO`~Q{J7vVo¿Q^ם=#u-VOWXk * YAƁNcaE"G w^ ah˾zX#'=9x>/?j; aQtx:O0tLy0H <yuNB}K.9{ y!y⤤! iEb|*p]i?-꿡q-)9kF[Dl[(FܵD?C Lc50|ބ?_&G?g IֿgՏ}c7;$ڻ>ġ ,$=]}z6,}_ƒJPG>pх1ʶhc{tt0l=uE %0.=7 b_?R!,N^)J - Assw'SP3L+Prrg->SLW+u[Bo[&fTea-КE5dPA5AZkQ[H ] j̘>h;œf:"!=$eT:jsRs uSd1UL4x-51'ɈP'i0e%Ǯ\+8҉AnsH 1Y? 9;B_OG˔|,' i'vzB` ?Ds*UkuokaוҒQ 8#uQY<;\G0'Q 7Cug15vm& 5zfR^e'Tu;34:L%oiahZt`t(k:{-oa whVr D k[MyS<Tُ$Kh WgOcXYJ؏ilL beYiSgث+4l`b07o U HYJ`po2"M !` ԃ@OnFgi!^4EKيg Tj$4|RC`%Y߈\R9y-B{h7{NT z!EA3@m=E 807XVhSgO]?yfʇc0:hD28z4bwMl_LG<.CT㼰BZ΀;DžӝX^˿%Rmb0 `[[MxBrY %a XW/ ppV"b|(\eʄ('/Dj-ͿƇa ?6(~"5Q]Zuk ih{-RQ[^? RK?}j yn1h1dY*nۃVA̽ 2DW}17)ӥ! 8J888X=&o2CXQOHi-ERo,w$kn` S{䂐 HV'p)av[QsI/Mi9ʹtr)i6?RNZE 7Gו`hu% A'9QrR=wJB`ٖ}J#h~\XlU:/B3xrɗ[.]aRدC^U  b,ȶ;b:)z|z^C,L X"0}߬WYWH@-)+#Ƚ VOB60a {a\V]%' 0WB!Ԁ?(jet5C}ɿ_7@ː Æ dH*'eQѳԾh RA7N"O+ 5Vó xNnxAYKGseny `K S"No Xٜ?u<{zr@8_ wJW!EےmG)Z\$=7Y{_H{ ZfRUZ;icMd3opa{): 2k(3RT+ x Rӕ)c þ]Fsi~`{G>=W(r 4 "@909 %v{!p Gj:~e}‚w ]x|Tjj!!:=.wm%)-H4#RarsHibIPZo&^_Fm5. `,]B~)_?rqg<*(`DΙwlTђ UTxĶ3OM'zFȦEEiG:Ջ8Q>n΅2; 퐂tu!>ȻAQ"!pCdc;#6>!h=>vZlGID1yB`i6=o!y}Q8D-^zRsc ؠ 9oLnuVj[@AQKE Pgb&pG+7% ط1J {9hhb ]Wxbl w1njO4l,\c*f gCWQ d/u[Xq(WB,'óX^$1Z [J%L3r Wu6#q6q^NtjqqGtДe=\W-ug8D5k`TU2y\vi7kpw A#>}>=U9/w[# 0 C\of sl > gz:tCZLu 6"yX43 A 6O2P8~}0@æ¹#zz0Vu Հo[oNw8Pس:jdl1iq xP:sYؔ!paCX'5쇀}R7F꠶!buPVrSv'T+p?e%;I*sRYu/5k^.g*~| ζtwƋ/x R{RoW_P gh ~(i,鍠= >9ncYbC16(9 pk6t r8`ͩBM V R-L!&$|Hߨe8dqٸh!<@ٞ:u\ZNo|&FE,Ko|ݠYsY"p$c 0@Cu!B(4 k83Hnhq,&乇2P{+^ωR;t+=s/uRb/P׿]<w5}I#KO?yhjI4bR8@ C|Gáy@4?5p%'f辸=>MW, Vq)KV Afz cҁqA Eȼ!#=V\)R$1r et_Ŷw4}Sr M| s&6UEͿ^6Z2C/N7 zܺ;!w` #x~Vg 3NjŻy̶0wYG< !,"kbmOРL!h&<:wPԪm!Ċ]u \ 煬U ()qAf5 m7 ! ._ NZ}K&n ml}9۽ON9+d}@2{HN<0z]ƪX=fs L{ dFbx1A`{U5K&C1O+}7'A)6Bu"an@HF-'cj Xo/nnSG R{Ί;Ӛ@\5 7cBhg@KV7t!]>\B0$C 6F=!ᳺ 4VZX(`6ϛ@ುfV~P!O  2p{Twp &f¢-஫]\n= @"-7@" |%0䖱pi!4Ёm=mW!=; 5@v1vpj~ 񣢟9iI35Ē/݃ȧ`7ԮrT88;J#hikD`&αF,CnZF};{ќ4u/Zl7%2YljfKedL{d*+1A_<- .xzcB Ki!`5=!XJ:r f@qS/ HSw\%\]?ݾGoneB!^]>; )v*~%4( .LaJmQx a !n0ȶyڸ(ű(#a8xlH!Bn9*?p %v^ zHU `XJүe]v]X!VPkljP.]mV`Ӧ"tgsԮ8PpQHV^egtLIػV@)OF [ jϠ97d~H1\8X)a`s&U8oDnB0'"S_ؐEc'>w6=<8?Fv5P­c''ܜl+\cבk>y, 9}|l$.a;l%=Ԟd BjZ.$}S{Z Sp-nQ }a Ԙ[dwjc\R4LZS.53Kv$MdC輅v6p 0d8gR|agP p!r{Kж0:op[[Jqe03?#BvК 0a(@ ue``|FmTEѳck;QfLx%tI݉2SԧTjkϺ[ͧ')Tkd&.Eām a -De1t(p>BBOxT8X9=v\8N8NDшr\ə*Lq4ͶUO*sppY\ RG`3q[Hp  c'=+}[8|R L~L>`hdۺ[v|E?13u{S{[NC*w2%aZSb7\r4?/PD8Y WK"7ap$ےס]C #q0$V* YX8\"6uv5ݖ< h>CX'LyA6m/Kly;!# {1HwJ{UܾE eb6j ʂuV1 U@]-u&$Ei'a52]09o1"XaKy|b(σ`ݸc|9m`hI>cȎ/R8<\x*a{6¥.ٹA8^% VMV665'O ,8GXrzxϧ[~'́ 7A]Sm%"MQK\I?cwpBYi79CHBPP&g?]܂G`XBhLW#Q8n9F ۋ {@^Ya%xYS>*+ljT*uA;dXmJلa pdCg+gs׊p1?ez.oZ\<"VnOi\s 2~ym5cE3wqm jǣom,zYBx ೆhkM{ѩGJڿKM4|nI\D@C8ToK!uT"}@%zgmݬDB5b CY@̖]t+MxKk"Pn%(QCQ5@7^ 7T5 P",]J0 $" , ägf\F6x6m8=lɂpB/!WQ]ln٪{[.3S%Bp4?T͕c[D6'"{/Dw8M9G@soV[[_ԑRjߋuw_gOCWz>$^gau}.w!EohsbymB'i٢9W戉xsi3c^2b  ۜ4P<: DsP<aHG@˄q۶5<<'|^A [Qe RYr>{N[Kqf\{K;G3ȨBB q*τ Ɋ*g~$jW ((PܕeqX`UsCss? @4_װC 묞 1C9f,v[Qto+ Bt,o{P3;P p+=B!BH9vo4Cz<\U^S >b!կ~5H YDsZXNq,љBLHN43A ^nW-bP-#xcnEPX|ٸ- 4Gs DIp`hSm}|ހct܇?q.1EEG_BΦԛ#5-ȿ)Fz Zlsࣣvíg`7ԞX,.hgg'{|`%Ⲹg7bM$38fvdlL[ܮNvw}ۺknAcupp l,Dxy6Cy[0oE %j w'mWCz;4=ǜ w!;b0p9D[>Br!eR{m`23 aJAc<쿮We5PT+qw묅=X~hz!3lߘ[X0&{tU_a~ &tPsA.:4}6;~7\"oÚ~|kC`?c`jת~;}.{V |O89ypzhGYbNlOk͡Ƕ:rUA*K5;qU8ȧwZW<5v#͝]b'7^:'ib\ /th&Ow`9_^ 3prپxzɢ~F]Z0ZN NG2܁ZB|?ɪ9+hXty/%\RwM9g!p[pj}V_zkJB-DݳV (L aڲv4C`{&B\0rH„!4؟-~耢_G?מS~ #w[Y|w՜ \s._1rZ f.!F0w)ki|y:Cfw0/ bU wvo}ƛzO~@{|@qB8?`t ׄ~u\#@GX7ùâq=E97nފIh!`DI oOoJOȷaes&ՏEKE,MHUee]PsZ*˫pp2Ro"Aꎴ~.7<0F]Q Ozt0@ aGaez{֯}ۏUbbZ >]Q6n pd_>ǃ+P8L!1Bxk"܉ѽWy7>!؈۰h\Ut ueeIbpv-H֨}?я>[FwE1rژAZ<<䩽FfMs2 *bLQ- v~!y6;9*Iy8õo߸C;/OM E{;3} PH Y|i݈$e $s| x?[OŸr3a@n^9 u5ȼ0|qƊX7V-'Tj <5)_z6o}Ȏ#6wԪ_.P'X} VN6ܾa ld|=K_z'9s:nrsjC2p_~kTx=S]>H~/#bSM#F35@ %`@4>" hI@"[nt*P=3^֍wo~;oZhzD DO* ߫N`ȹIKtZ=$y{!;1OqletGPQ"Tۤ'n[eZxoN`)<׮fu珯ӁT qVz>{Ӭ X(N߲ u,qoVA8X+j4Q[0( pbo#qkxfY<PhsƍSֈ~SԞ/Z.`Om TS(Mcoa^c bvk!y9X0A =K. 4O ^! -1B-$x] 26 ? =-ݩkrA 2ᦎꏑKzOZ4tg=5rochӭ)HBAΌ$ (+Vk6*mLSȏ>~`!O?_B>RWpSXt0@er(bax$^0K@kw@]Aޒ 8bp9n/qH e%;PzW!sBЯGPAa:X_s{ }^hbS`_WGc+]#/[F i1! XS\17"y0zPYG~$ Bw<TCa >A?YGXu|pjNtpl2ӛx]FXD+!;72cwޱ:X z^ZjN\]39l^]?,˞}Ͼ FZ#d38q@Pۂm8`r AXGOZl[?ꖱkd{\@Kl֋%@`Nbλ5uJAB7iC{ >|x-~yNa8nvMv F}_BKR|t/u|U_N_C, iXs4-G!r3W8 w+pp2xZ?X7r[hRs7Z bZCPRa ?4GW$2A -oΣL0 _?gk ja mp]s#?[Vs{_Z!+Fhzů pΡ| }{Rs%Ծj\ЦX0@wlV!k(d}:u'M5"0N;N/WwTrIw2~߳2pu=/ut9`6<ʜSC ?pJ7eI K Kj0 a8yZcuwp;WBO}` ?­+N 7 &6n" µ7F+hO=pU/dv><%gyw 1327?CޑF5U~вe}ڕZAWW[:0 =:lBt}Nm`KK:s!=KL,<<3w/S/߸5n7G $͝V( A/IA q#L)1g߿'`ڐD @3_~Y =<o0&h% 2Cؿ#HY2R99EGL&u{Abt@~q esݱ}#quI?:l]?4kh:0 U xK#6{xzV jV&ޒz?8|^C`O>*. b'XF-ȦcT?5֣>-ۇXќ?%l!qT~"9z zvd3mϞgriޢ<+<Dю8^Z9kl͗"~ S@l왿{2Y-5ۤ5F8!Xx] 2pGJ6!#}SwWR}z!K~|.htC{E8ဠjxݻ5#h!B )qpAG-#N/n\4T!% H0dr =,,"v`GPE/x尗G CNO7,]6W!gXݱ|~zg[pRKwT򷽻lM"\Pzh/m+.cmi- ݹ^U?`s][3t'Q?P'P#{P/•#]5Kb%:jdi@F{Knp@VQ(P-8o?!QM;zOj!'x,F\IK]+|]Fw_Yɴp648Iր;zs2HRaA?+;^+3]7shh2GҶih"i91Jm_@=7 6D9[6B,H+CHWsej#7[ޏ ty/:z8 1hA6$'vXm^ 9ٖZr0ͱ@QSjC!U G2xXRGzR!/pE 8:j>p/whTc~+P Udha`H` Pg~p8PI,&8 ۉSַQ\lb=h>7Q!ɋoݼi>6%Me5P^kLU6@ɡ_~0%ߚh_Jb}skA$][M5GA-!q|Oh6y!9o }Sަrxx~=/s=K %yC)Ӹ rdX$gjR:P B!Ch}z.-l`@3tb#yXى Bi;p˗7CK/t2,> Op҉4;#G;7:v^!0°/cK dRQNҩ'P/N z)XfB.ֱAM9T"w7O |OMiX<1|7udhEM2:J2*L3qVy/֧T=H\z_kuĉ_׶ u$R\)&өcEC=(tg&@0$VwQۯG7Tz.BCQj{oNv0?چ=-U  cJU='8ݍ::3haTj`u&X~% @XAh8 27?FRG K'1&sC'pR#+O#'8ukh@  9__Y_~4/@gv#Us'O[oLnS"mS ѣ`MwyZT × vJ@")07k)dN`F;&#wR0cqK)t"t;uk"lPv, m-[1mw6 ]9$m p:vv~"')'m0c1 ]3X9-{|_j(9HRJw>қ5|8Z.f@K>qQW&=*[H>Eu34rm | 8#zthcOR)P2@pؾ[ ćcQo ޡ"Eaxjax'Y@RcF@/f ۍ&`Bo.#рф;ݵ@18%`G3Ԯ24MZE=6kn`}@8{V p{Hݮqc,!Z>\3cpþi""krһNSh(=sRv8pP^unHœV-|@p}7!J !!`!@10z3/ . ![w2ckq#aC[BE YqI' ]`Ugi&@2p/<_{ۘO@^?~r;sep f)(>v4utš5O#b+0LL Z8TrpXXY/!Ipy8F,;9F kD ƵT*u,b`5U{G* 4i# \Ȫ~9)q -ğo7sEP 8 ZV UBVZyArh@~>q~`]A> X O8(rQOVG348}ݢnlDi|YMk߇\0PWa] [qW},"lՇWh\PpVqR@+m`H@ob4;Y-zE+;:3(1W˪%TFK*uT# QIPQ"OgzEaYE??xm^IHv] x+ ,]*P@\9w 7Kf> Zɍ}uK׉d%8t!y?TԮk2`ƵgaYBRw?On=yƺ(f5{Dvщ\-vfu-byYi9 ;0TP+(}_$uX 1xRKf10KH~kaf˾iA7 ̋6xнkQ IB`%@fͶNzq!^偁%;᩷e8aֽ Ys^}J0\3OwS&] f 7A!,o<놝j}c0/jYрO/V܁aQl61i|DO<,լ:~ bBKճ2iAIk @#= 7tSZo#g[y%D(?nNv S! } 9xh͢y94 c23g'-c6~>zj=:L:,]"h>>?9"aR¾BIQd2~ R( [^Ծ_~!g IRJ-&OmjTcz&  5dcnxoz!`%RlpZ{4o?!B%wT~dcB `:\K 7,!TjZ [+p;?כ8꫹sr7 $C~#,4qΈ`Hͥtg$?vASmnH\Y~P D?qG鉺e|x'#l~ 8 -~_tzV0"3l f,qtS.㎬Q8;'=.?<ˣx$r( 7B j J7Z y>WPr[\Ap )k^&|42͒)Y΢U $Hh0Aí(p<1C_bXnɏ\. )Tǒte I;`P0n#, ÇR+\zyŮ~Q`fC>ó\A]/yl%L0oXܜ:DiepB5p>P%HRhl bV*7RT+k?=+!9mPN^:;kAhN*'x#4$Z^Yv[H $ l@[g=GNoN^K&0ב-n)ƸM܀cVf}`9몿w٧O;-Aޜ.fBp B6܃S' \czA 8#D$6=GG4vB~+a< !g16Ӱ;v/0\>t~Y!H\ź~RGIYjB&5iL1̩qхqa2@4 B͐A^L+ ,c.ϢV)gPǟDz@=YUBB%m͝P!KsOY?cV!܏ ;,kەz?ɋ6Hq_Rh@V _KBA*'f&k6ӊWymTh] G 0b~߿By,Ro]4J"BY!!wӒ _Wu?wL8hrщ]5}[r]?\CVk!O$QIOh͐lƎI];TS/|Q{XkOm繌2%c: \G`(%$7N;&,ZaJ Rhʱ܍(1kf,Mχ?=lzRni^7m,P<9aQaF{O:(x@9?/b1KW?tޣo{{.8!7AOؠ|A>D-šC I&K9vQNq0\g* 5& bRNj%%~d :*4}.Z?~giWYzOB'N:n"_oAjתj^+-8j ү1=?l-WC=Doۡ7uYo nn=mȣ7yn_ށϼ=l.BrôFCRzp8(ou{ tKxs'fמLvW"wNl_ЮC+P~uAIq->k_tI5#DzK'OlW'A*JRP\5o펎h&Ԩy y0!IK*qy :Y?_8H4J,6~` ߪSgFiC9.p -hY?/+*f{>JR1\`]=D QxFC8.Gc|6 @ M d sxWr׀xgl 1 ̳jp'ZaXbP]+Ł74Q^/MRTjZs L}j^'i EC5s VE!j"7v0;@`NBX&8| 4 ZPc}?CuW`I!0R/;ظba" e>(\F c}ΎɛXS03$be?5n4oA*JRW+Ue6cX^"w 27aDQ@;\';Ai8\/OZ(bC*JRXkTw*rW|\£[x_k(< +Ip`_c74O*/s$3ptlm ,:}A~W]>;g1Uc=e/ +g`(\?w9}sBIq=;QT*:ZqT½4t[hN8,,OIC?φechgijyqVHB=ZX.6t>($R{fUgC>H%9:~>tяQs+VݓtGA`iN @i֭Em_= gʹG#0̛,_)KBߚe`@[01䶟c5poF*JREk@'CXM] gqKޢ7`VU:?jAh B . 7 T֑i(x: _ ӋTx}9sG TnW-;~DQMu'3Y$s ~ ana \/,ADF=RU(-IzX$z'JRcVK6^](X Ȣrt:M($e$ $#P7Me>]#^Rsu|I#q37Eg $Whms 3H:7п}j_h9P/&M$cs 9RT*uL2ZpP #o9.K3p\B-.Co 8ʥЈob^#&U\ɊR lGf Iu'CWҵ'*eppl~8F>V?o4pDs·A '%N1GѱZW S(@$q ʷR 2uJRԪ9|/[z6a]'ۮE#| Jj!'\Yix C|HS 3 )zR[ 38T*#|./f ?4OX"Ul?6I_fu62rRlaH0JRZ9@⒑u'PZAFI?R0b`#F`3ȁ @ڵHx bzF?|X_Ԩqp&$!i-&%滂G0@gc7m1ڄĚo5v|۶0}9p*J<Ӊ>M؝72^1;.&C.H+VZC $$ ˪^v>kdU~R[{T E/ )q\aHXƴA|',~ ӸQYfmGZHs /O񘋀 '( rB*JRWJ&t>"Awָ}[Xl وC3˫+hT2=Zc//j!9=^Ty7{.acz=Ci@龍A,E>9!B:T*:Zh\'IFS:|yq0~7t)w )Cf F˯|G<܇@z0=+uݔ{[2rF7 !K2Y/V|)ےv/rܓ|^ ᝾mT*JMoS= Dڝ}ßA5-=d2c*!z&=$ZJ%?;ԩ×ʜgv ZcST*u5{󭿂[~zqz}ANn0,x;?[jYpoX\XHY0YCWc[6}R.{N2ˇ<~_{u~@*LOv82L*J,3zQ@ɕ4yv,. XH6OqϝbC@BGC[xOXeyͫp%` @+Cݢ4gk@r`CAn!y8@@# ELRT8jW'.?QWk]1Pn$|H^.|q`.%(MkR\$ T f8'Vx!QW-#?o+3Ѻ=TF4tzqj_qxdDߐC;T*JMxtMq/y&gNސ68:~Ó0^PZ8 ͢L b(FYܧ IJTࢗnC72B hjTWI:Vp""w(cxZ-TLRԱ֞P·~fqn ,C8oCq!,בsAeSY^ԏ Z_h(/YfPy#g!LL}h Zy.46;~p\T3W.g8JR\w jXxX^Pr5)H# 4f0Kg Q O~Cg i4.@aim5u Br ,’ 1=CbtÏT*J36u^R9:/^NbԽ~t!.'9傅v \E!3~F? +]{챛;0~qd7@r&RGM3I.h$28ljV^0T\\_ T*J[ v~ĵkXns(|~g[B\'eWFч/CjOb,K)  b.@4|{{aZX>Օki_w%[ȾU~0&JRc}@՛?BMެF/VinEsbyӇ<ݱzl30Y񰫻G8G7RT*uLu ԫfXi,ozg൭bb֕H4YsT{Rz1O/s\KܢΚ>+yLV&s#i+!} )0hr4j*JRQTB-O!+{7$?(7'|<}B`oX omDyfe #BDE "Yd+AOHIkST*:v:pT6p~=:+ &(O^uL(nnHZh88^iSty _~ DqVbnj9JR㥻M޾u޳#ļ0Uau0X8$[;poBj!"^W< Z ,͛)tgk3 +ߐ v1֌,wiRT*:>mc~fzi=IXP9uXXMä֭턿VģէW,Zů7z1'·jzh8r귵|y 6Qf0W*`/JRC@[?]·n0wYa@zjQAb~L=5OP/Õ:i?ZphЙh^l4{@B!!dH*JR M [~޽C sGā^ҢmOCAꮊ!{+>hpgm]ʺB''ށjEb}ߊL8:RT*u|uj n<] ] iC?W Tf¾ >_.Kޓ>3k˷Dy,dafo#' B˚ރ RT*u\udP6z˾ Pϑվ8t.þ/q<<– E+(%m֟mKaS 6ۮLRq֑@U o jnז|#4,T~܏=|RGB +]/! 6P6GЯuA*ZXXFT*JgYljŅP[Rk.}zH)u'+ ;];m_01i/ASMdbBAa҈c1Q*JRPGU-,fiazSP Ţ~?HIۜ۳xn@`2<ۄt#0Cx*R,RNRTX@U z1G#_{.9Mh-\Wr ۃ t HV5,mmd(ST*:go{3/>9^yjB8ůJg[1O^ K~RRYLRyםd˺| O a٦ W;MST*JRT*JRT*JRT*JRԽ+Z p/IENDB`nrepl-0.6.0/logo/logo-w960.png000066400000000000000000002170471342636505500157720ustar00rootroot00000000000000PNG  IHDRE}| pHYs  sRGBgAMA aIDATx%u޷V$-6Dӄ/$l^Ƒ1C e$H|4?04-GHpB@86#;hsZ'lPL_d3}Nk=k]wߞ!9uٵkWUODRT*JRT*JRT*JRT*JRT*JRT*JRT*JRT*JRT*J;,޷W^ѱ񆷢˺)c_&"N|t$m}6};Z±?Am㝲EmdRzlYal/|菾Nor╿{T*JRT*Q m‘ ucG.n$`VWi!U庍wNım?P^4Y63*t' Kg?ۿ,_|JRT*J;i.F.HLr%} H^dIq 6^?,({_)oa/+wNf? 'T:]?f|pzuyRn}f;/WT*JRT*# | uV^ڻ͞ jfjfk1 {7[-agdI6Rdz嗮R緖< '*.JRT*lAfuIdQ$lBXNzZa{ 'Ybk63}\nWTz޹ܧ-_|wXܳG?#?JRT*JЊt˜@AdLڧ-gوtRaՒɒgA2#0E3[W{]]zzwn|S}s*¢JRT*JEI+}.pps+scvrq ,U7w^*>y9-I8*%c .=,5hɞdTP-[Uyg?{@T*JRT:]jwhO ma68 [zc s~g/6I6ۦ^Gܔ R֊u'N[|r'o/t h-AOuiao̧T*JRT*Z)8j o-D%VwH՝ |!D95n@> c/gl*o"]:--s f19yвE|JRT*J,>Cm!c!9*3`rtL/!,1ͿT q̜ܖ=¡ .=^=ܓDff;w;oe'?+[tT*JR@: ٬$չ|~m&?g,Z8(ϔBA8(';h˶nY)w?ٜ\zڷ=b曖{Q4 eYD&x?+JRT*JiS!,ck]Rs"f~zfjOjFWyjzv\ wzţy;oDn'e#b`[¢?VXtT*JR!ŵƅa.Xd/F3F3Odlibf 1-l ]˯pw{?RL2Wӽ)w=Q('zkKѝl 5>T*JRT XbpVưh)2djiMҀIf&c@233ɮm)jߜ9RaE9qlgjLpiѻr~0gxщͼ0W,AlS}ǏnF~9*JRT*J'c<t z-c{_]ݤ)^RB\aTy&w)9 wQi&ѓmO5I .8cꖹG\}έ宸޾[gpJ&dB@J! { cy~3)7T*JR<rs*`K8KLΔ\^GҜZG0 1Razo8b=qUX-aIs)OUG9tg)B9i$2L_0~d_YEGK\`;q$oՀj>9yo!3A۪auGv¸<¢_lѥRT*J Y#ٙ`R Q[sp y0Eڗac\kIKBJ–y.wdJ'{r(c@c]eu84a"̣~ٓ'x;y+gk9E J/lEΑg¢KRT*JS{h G3YW't\ 5N=g6BxVИ ;N;UDȳsj2| }ǰ(i9;ngX@ ^y1r\9~WO;8@/^;@ϴ9O|>ޫO2І5L:N˽}e]RT*JRh _݅/oc|Wl"JKu`r-`e49g*ld ap3aE]at>sVoR߼P _y-q۽`c"-k3!Mivߝ#־m~Y!S@Q^\k٢ŷWXtT*JRhh lPr9Æu|G1{4Cp< EHq QG(2IBMRTҏGٵdKi?"wp\+Xز=Õf8MdW9*+~0Mv] (pRه/:48+Kmcq[ T(υx'?|@T*JRtup`fs9s-8gKV e29Qz*{w7]\1HK~HF2GX[H)[1 <*0|89o_,>?zwqk>O0,2l'x [V6~<^ߓ|2hcl^)cu7/|≣ە-T*JRtux`LODc7-ZsS!zTL2 :ow}(^);+7vX@S@ 쉱i^Ϸkg_7nC)W 9{Bo,x)l:o&#{ގ+аǩXh$ YmO]Ol^lRT*JscӴ.]bIlk͘EHQhbڤlhє%ZlkgolZ18Ꞇc/2[ Nݶ40E+W1ETv~߸\g" R·4+4)lk= d'^ GN}? 4+tly@9=&i&JRT*Γp %5D'3 DH/CM 1ڮkpimpg}4JDU1l$W%֤@j `Fxwx*߲k;n-8K ~}J祥K3c;@FO ;xطHsd OW6 aތ)txm_2 .ײ]*JRT:7 |t({")@\^vc# 3L͎i/pViX|1:Ze7}yܦMtF RүQ}!Ip|~\Mr,qj6gDkBA.e@yƜsw_s-?$|=3=tIfs"FZO,/~f;JRT*ZNNYA;!Ąd:rpmfu]e$ 2 d.cfز]stG0_Jh`<]6Rۃy W7?ro<7`E&Yg[]J=l&jV<PRȳ*N^91WF)C*¢oɭ+T*JRT*gnXo̖Y"A-NdA)y, p)cxPWd*r0 tۺ; #4g:(Aj̶P-~gӲc.NpAk?ǖ~q\y{>f?l% -N< r,[mS~xFNX{u54:wZ)=Wdpo$sR_fSbJRT*DC#39x.kLs +Q6{J [Pjr$Rʺ U)>+>-'@2,Kù3T{=ɹїn|zwm_U:+Ÿ56ӛ7,]o4QCdhA#DXaÎl=7Mຳ? c8 CV%9)LOT*JRTz:&'*hIM]Wbs{Wazbu20\*JRT:;H1!KᤞY.bUu-%.GL3$[aɳƅXl%L`)lwhcg8kP(ۂ1SbTr]0Gv_2'@#jo|Zc~iS >rp9zǦȡbZoQ>gRvMݏm?"{N-sl~ZswL*\FSj`<#1RT*JщCY@(N8dI qB#5c3%=&/>QFSF2×#ti' \w3AKK&OV#y̘kiHL}`k('x\6p/w/1ڸtdVlM9ڃ5(:aPtw !$gq)Ðr.JRT*HAjJc|c|.BKC?]ȀExgwȧ-BWZ GRs&-Vs/٭.1̜.F+vH]kN%7g?VI K;}2c#yBc:+Gۺb>I13.w~3 Zk5kԥ\ڰ?ܧuٻ"T\f?O)ѕRcKRT*JgeǮ\X++HcqgZKٿ 0-UcDus)k ֭, dIv<9² _EXdfdyӄ/>` Aoƭh Ɵ U,+sxf:7EYLax89bdQ[ڒ%'D= P:d1;~=Yls,ź9=ûg\!ХRT*JAU ńUS޾%\!M^2I 3aC+ɭՐ1K |acQV"Y DRroͱl+t~F)Zұe3o&eMgɅP#"Ї﬷Xa7v-ݢu8 {$B*JRT*P'Bo{w Gc 1o6^"]dOCPj!ʔÞk-D"rt( ڎ'^>\D5pSeuK5E<74f['tgzQx '{/Ƽsli+xȉ9|BZ$,}Dze B1gX@JRT*J'@1Ld"9 3~3#G:18&sT=z8kD4&9KnT26 h)A/B=[g?ΞKR3; 2rʭ;ϔikR,>UpB@f#9]PK5M`}iw<z>@D]:v}8e$EWGa`RT*JR,t &$: l T1 Ř^1:\9dpabꑶbUupve}z#RFC0W}M%,{UHۘUiA s(Is~5|Bmu8z@5y3NbD`j I./!Cid eÒێ5!%ZБ7{T*JRtfNZi*YY kyڠ@598@ lTډ|YbbN"qERxuM2drf+Bcŝry*;sr %~9ʧ:9D;#0|P|Xl4I42'[/m :iIJ~(G%LxÙWW5 xʱRT*J$Xўjfahp ]ј |p8+.JAvHS-YȆWC>q!929b|~LhF,p Cp-Ro<*N/O/Dbi~i,qwR"$2vv.#+i {i !aiѣ,b(bX{H5grh_9~{JRT*J3 U5)O`~PoTAd(sx%?WY9q N}acKnSy@URT*J^uRu[sfLuP+^C!Z(q?%MAث*a'F32A~C\6ͰtlN"N ˈ9xVa2ӗV`8jr!/7=n70_Wd9RHS"c6 1/f/NlÀwη&Ùcd1?Ue/v7:mWfOVpT*JR錴y0r%yT ?ƶ3-46CݽִЬr:XfMEôFvMCa:6~7 sesԋmίO!'ݜ roCe ._[C9rtL$a طfNlDsJβl{…ӦZʝͦ6V|؀tAi^ݤXþCyk5HS_ƼRzXƉKRT*J3荽٘9GQla{7i2) 35EV8wue!hq"yl`s^~?vXw Z9NEi :7ܯ]l~L`(d$8.zwآma!Vg@XY.nYЃ.i<0d xҾ[jߜ^()ȋTb^ .JRT*@;5\_y2HȖ;x)V(={(J89fʄJ͝.8g`2,&+ ұ= )DC}'Y@^ -:a7Qþ]㙲L d ^9*<)9-]|_qpzJn^Hd}NADZ"M[٦J.A5Vr./Y}N9#g=YoJj[)zll? m]!ХRT*J (Ŭj$cC ,0aho43-APj~׍P@dek, +Xql;0{9əs,=ZNd肺?17/7̥, kf$t,`ꍱH8¶S6!7j>._`.F$> ܣ H1pRtH;=qeݟdϒ}p6v7#P!(%Narl6) Upl+ny3p2aS&ؾ8v"9' { BAtRkvz $ތcE3LbmyV'x!a80b œ pECo00NQDɩ}THtQd9g=u)C=W@.T*JRt6?@sUxM Tu!6;dqJV 1k5ZMWېrqN9ډ;{ƔK8wh@#´X֮X@p k󛷖󹮎}zQYs{߀"Nsh gkeC1E0e_OQ;T>s/`Y}zDw/e|B3XFg]eU7y'd.T*JRt6ڟZ?%S)Jh2lgA'/' |xV7Kf'8 D<3>)O($9 LlNT==Ls< ~[^HΣ8 _Z S|LeUdR$_Q)% O?H,|lkNuI럲{{L S)wToHO 5Xr-< ̟'obj_j*T*JRT*;Dlne]IВ+6?P22F'oBwx-0`tjh1#WXVq%X<dl:Um))_ K>65*T*JRt6N\`C8 SӶ9GP&9)쀜^&vl uKXgy"% l!T F| 9Xb!FIKն9,k+YQf9&s6w;C]^?ONps~J aVIW3"yUaHlɲy_g)&x׎wSVJ%FMAWFN=l?NczǃIsKRT*JЁ$Xiܭpeܧ@/h4?{dGFN s$J̛65G(L0UϜF3F 59 M}&P&:y0tEeX[1Q"ߌ&wZ9 *PmjNm\t Z.Ymvu㼸d瀐al9k(:y=A9`L(LKDz\*JRT:A0% g؁̵MNl_FȤL$G2ޝ h'qՁHsNInѲy;9!Áh!´u1٥qjAϗ)Ѧ>N֯U/Zo!?/ݢ3W7[fqR/9{a3mbHz>$iֽ,Ks< `G Kw:+hL هS B˸]2i-.* ?]u H@JRT*Jx^Pc5 ֵW[e&8 IgOyBRr;klp'>^8{lL)=dKOmhiuy ~-?>*DHuF[[e"hؗ]w_>Ƴ2Vccf>S{w,@ k-VOqgyl9Vn,5w~nv?t*;y |( ίxFk}PZ+úM-;1ʰ^*dRpT*JRlRe*h1kw_ 69$K1YR( PdJJtl2BC2| y}H2 abNhOs.; E9 5I:p)sR6)Nes ~}7?xwehIj v1ݎ7(h5Gtp['VH) ڷ2c߅'4ZҦV 7+INWvv"Q]v5oEngj1M Kgt,H:H'h\ I) y_ T*JRT*"n7L\D^O]4TWÂTxsVڙ̐)c}JO L[vH]K;fZT9kFas]Hb/PIggIZ<!8Pv7cli°6vtJ1?AA ~'zr+u^;,#zZ(nGuKWRE(uN] [GQn`$4k5Qcee4_f*[nOz(@'ԟ:7?KQPǒ4D[zr-cNgAP9szQX^Џ`|0r1PzJ!}?8QS;iKٍ_19Q-YcK=fOGoHSO_~JyW=ӥs9:#%GU(,v[uJ n0őw^CPj~a!%\QO $@)2D^%r-mhiv83w3ȏ)e0$XuR[! fgv55{Wn?rΕ7/W'6YQcbD{mW2Ep`F[_r)T{G*N0ݛor;fpڱiE ^;OtYQFd,]nfa8#@Jo壅 6w3?oST0gNjo6!L,zOjُ Hd0߀uz"#_!$Pj7KkXlm1YV@?La=Y){2 [=E&PDgBE@OEhrx؜f1@o+f.6/ʗ|ޓ/?zUs6%61+ ~ct{iVm :Inws,;HQfK?q6̌"ě. QY#"΃5&L>OYPT;ï>/O#t06:$:|֓-9\/%TcvrKCQs&Y^_?6JEU=ӥJ;_U΍&٠]jb~vD2FcDh/" [ẋWԔ |?_9qt,$h6֍+X9t;QhD ,>Ͷ4|t,@x~ 0hVxP(¹ b˝+2dz68 lpiq7]0^>+^Gy ~5hz;6aK$N tB\*ˋu*JYLNM{@$[\*]l3]z:} j (ovWTvCukDRf{p#, afB}9qpNg:y>KRS.AbasvU+sruܱ9^8l|^ VE pmu3Kc\oKVNn,{m BduQCS|9 Gr&otiy뎞XPǭ*!F=БscGr=E~S Ü;jƃg1kVoKi<70|>}=&[n׷RtZn=zh-..ݏ\Jww %u%‡;$6inl!yd*/6ƲZh&{)=F@Z*k01 Na{+E"?OsW 8nZE;ދ5kHⳟA7v;swwԌóϏ%0l 6&k q_e#֫0Nv,. ’ ћLPN!;nP7Qyh$ow>EӾr0msN;Xv}l5r6Qo !RtƺcR KKzKo`)D;15#0*qy}Ԁ 0Q%rv;P&P XY^:}+E(d2{.&ӖPgl?"R]i#$JB(v,˄M>zvfB[Co| vezJoaMՀwkږҗuǘ QwL T 8M: `ܿяw%Q`"Bt;Vڗ=u~2yAIwr|S't**wcXPuߟyjs3[RT:S06pq>_!W=ӥҁ1DNe1(b~9QAr8 )|/$`%S(%<ٳΆӕvd]HaӦ\-K3ZB;BggmNdŮ %+ՁCkBtL_!? vkdy幻2.4W:s& EpT.Kn5sZu$<4c{e"ږ[`7+$owQ 2\^g)nB.+ٝw5wp.޶fʑ|$hzyDT*;}ST*..a3[~%vB}5?%'a8d DeY2%8d/yA u+Yy̧:ױ,[Bc=a$B- 1F:5o=Y0΁މu 31=;zۻ/n;o?[gQ ^/62qY]`u|5C~y3ōw]h2CgwR%"ozu} /|4gӲ[Kwg 8!`s[  LA+Y-XoG_gЛT8E+&`wRt"^:5Tg䎭Ydo=Jp릜 LX fy2$+1{L{JbJ9ΐorhttVɍo7s:c(#A;1cS{-⺍|F-qw<_x4 |ghG8`RW%B5{pwەoU+hUȮmM% QzQi9#lƆsc谤ȁy^>>NH!WErѩ0%v>{X")5J;XW|lo7ۡT*ΛZB6'KˡzKY'8/v6 1:47焻~B* njqJe4;{w1˻H>a^̷6,s 0\Z>_fPêI9r#A2ltSD",LAz̓b6"F?Z4w]`nS%;pkQ8%2=Ӣr& ߚ6@4-Vty B`PgwT!x UqwB%#`[ -ʙs@.;'%N5#8-'@J6pyaSO]RtUt :"~ rtE ꈇK$cWMDOD>M.ީE^! Q)ưD16y ~|\13H#AѼCʼn>A( ^5 OY2mئrV~?oNd/nF _] B=)D-Lڠ|f ^^.WS(a:Bi &'Pgna3K[8(F],noc͖癑t=-BHs@vtu JEP{a^G?4J zKMA:6)'{2!K"^+鑖B)KġÕ>t-,Y=)lX;>]#s^=g&[L_ ѓdqwR;`=N:>*.JN<B'Kˣz]` aʶ0&%DD ?)aqp:M5A#XsfYS$jKL!\C6>p3 sgސiZo q`c[V HZS eŽNr玒1vF\O={G8N(> @[zųn{ 4gJESKs|||JҥP=ӏp_!.=-^umFAC~յ9rXa3ae6 38k/uA]zd~l/bF1dq$ Tq>MVQ:Y˹ڹ cǞ 0څBp/=ôۢ0xuc`sN?\`wq10bm,kZ¯UzSʫ8 [熢4"ynOvMy24l4"c4D-cU3t_M(É$CgE@A}6ঢ়R5 RTz T*.~tRhXUV.nHŠQe]8:@ Ci?(xtk5h"2A EA>xl~_TX+B E8Z2S".,nf"u MٿpٰC˶m, }&Wm$YJb`8~;TBׅݽ,ۍKZ-N ?xs?YmJ-H2DjcO 7s74bHŊwKUtqPS+T*] }R).~D4Ӝ(Db*kC4b;8 ~N>Yp<ׁSru7S䃂sBK.UBkN@j9F(13%-Bqqi$$BoxPo膣&n3 [ +7[8dK gM`xtLB<+Sc&%BBh,?Vxip_"tؾcneW޴ԘMq"c/wgއjCNϙ@jaF%c!g 8k)k\pTZMuڵ+T*.~4toVR` mem? y;rqMCHT2T,a%j-.)q FdsP.!M0B(+*A(xZ_&Ns8vHI[tĚL\3.!^S :tAv@?\.zOmOl1Mz'f hNզ%r8"N !}Io0k>˶h~ Mo%AGՑD-Q%Ӫ9{@D:8ʱ-$8}JI$5s 'JըtZMd s@)u4F~|4޽:]p}~tt1z<3yJl৖7T*]x3hh?o7LGyFg:K*G6GJANubk0iFcI=LY$}|f3LFqǒ^ݍ~hPH$48ϔhA dr&℻Lqy2d ۪X_ e Qx@~}x[NDN-UåeE;bꜸsꗷfFweb3=0/u5EUn`g[mS EhQpT}"{2)^-nuD:Yc,aCoH=%MYޫ$,P@?m?m^r>sj9EW6n'ŋi\/,~Jy~.^wPL.p J k,/ewj9טȆxO/1JoXe( $lOD}ү+d'󭺯v^ĥZCp+c,,y:3 _a[Wh|T2lp<2_oD(F_ln" 3vl Xfz|OQ8a"tc9 ^]Q<OWdq;}t%)'r3OO\l6Wظrue5rtttc]`-m//RҨ鷭KL y+3$pswj ʢ1S/fo1RuPXqْlR<C`$ `{sAk7ua>IJ{@1}:iH6:pX`&S8J7J뭎>31ׅi$ O zOkMloOyMmжv d2jשDSeV" B'p kw *ڗ#s;=%'n0w\mmJ^̻޵c7ySȘ--:":xH"ĚC'Fwtr/Z2ڟ[^B^~|yv]_{)JzKYAa}NXm;dSn3j%26Gžz%\RIu8ڡnJeQɣHpK.L/1FYp,cmadJ윃@Pqn!uU]d36}ETxӏ~hO n t~X'鐬H@3ط9-}7I4'@دwոD\07VOtyR[FʼnA4Q(ֻp uR,pZ^@wPr H 1ܣ9|SCwr/n~#8Jg;#'˿c9b)*JUt`>?.gBƻoJ)@oFynmg[*Ia#Q9K<)os/)2GB0@ǶY%N1(S6|qڅu2xU= R)xY֛Rv!دH!Bpfnۥ)t$ )7pO\uXD BscQ mU^R\ -co4'DRS0˪.0mD36a'7[ .1nBDu ܱ#V) 8cx}?y 50&Qwx6u&PI jk짤8?s-LY!g60Iڂ5"=֜zq(;uSgS$lOx/AIS Y!LW{"4/_+=T*݇.ӚjIoc&1em!YN(9g T`~MSˍEeF"ѮYyȳ{[L~Ost, asxmAڋIpn}eXCႷw]ݾc`u-Lw \`m.ΌhP؛náAF w%3 nB9(֧ca\xg2hCZ@P\6Ot>RTz[gNi?,xw@VaˊeLsJݏtf;LzJoB ]Sxv74tFV.etEҹ6 Q-YREx`|p u/ł2+wJ~_+CA`wA s "z@0aLB f` X<2KKm.cuz^d?S.g<>:$Hq'43 衐U]U@xXEW M9җW3yG{NRTt~nYL3EKMƤ¹x0^5bj`z멻Q+4e.lqDژc e}ùx-cS5 B:$pS Q?oluhc x F4w &Aʾ'QgF} e |1w6XhtNz8UpK.=4 098wYo:-~N pyzˊ]m$VFjzASяXdcepшe~@کD͑M VjoPtԲEOSTz۪gu8 ɂooÁ"6W.5[ILQ?nfE!cv9lD'z\5 .nnkc=s/!b1p ɉМƋ%zqg>J#Iʬc1wݪ#lItxVGY{7fבZ/s;0Vc9=X ީ/,v>6"0^'iSXLJ{(w<3ȑh͟|\̰KQt^{tjccORTz 3]zX:8ˀ6fς+}(ٴp`/D*iPbSX R/QW̘c{T#L#|5G1AN)ÇwH9;$H'j!Im;eX<vG 'twN ey[eצ7we@,#1 igoԾenhVi\IPkUb;/!ڕ`ו35 ۴HqrzV $#.%jb1^Ma2Djm݌ap'ׇǣ 'Yɳ ُ\҅We.K/-VU:cG?zJЁ1Nwb WvDpbM9ڳѡODT? L@J~QS$sZ\h%r g[;?R&P7H< ecɀmcg+ B~nfMC` pU;9ySm۬ݺVR.-t=+IUZkiL6_\-Lz$1<,6 }#NJEx~Zړa{ BQ$>ŝZg' M%;#@ZʹذkafJxT{#Sr2CΫ;tZ=FRTTtu&wtgST)XȔPʀ=ߪHĕ %;b]^{);ir4:>wiP Y[7偵!^P&4gBYdV1חv3N9/r-_WcsFS>~]5g;>dpv% e'ڂv$XLtl>MgT*NMLNSx7h3EWI1<27+Ii!ytٜe ypLrݏ4YXQ9c ۔KNx9%â +qɊ&42EYD㜈2%c?  4)KVFyk[l(#N,4~6.>&xƘ` xKǣjXNeS&AA2[4MUN)eV `,:VZKM;ȧb1ũWhhfL-hNx/n8#Y_Wd:ؽB{?J_tdKtvRIsJS=ӥ~;)\_c;d["9=8K{?L8k:L㼍M4TJl=X`,'ځ;Fx2n@pc}Ui\m-gΧkmfr8 Q3 W֡KLLh wi!Ͷ˟6&{11=4IdS Y84%]ME[ S&i ٌThx P*S-|A۽'" AӎPi].#}5͜/1*I {9 +2CΕ6 Jҩi0F hT]5icGB-}]@gǜB>xp)Hř`7MͽeL/?n M7Y+ o&\Z4s$m(6™TąNWLg38$7Cᥑpy܆1)Ap?i`r9Ss{84w '$נ>\a^_w 5UGw>s~rkx2"u/gMFao<70 [Ћ:?K:1 Jw}`Ψ<K ]:OjsfBRTtt`vk 5r۸۩ + ,p7pm#vcD*4[{;^ vRr9l5F'[f! tn2|? svpLGC} <h:;8^/Nu>eBLc9ۺW'țϖzӝogOevS V2|O Ґ\0pO5]W>'yE}ucyaO&=nG~ܞ60Sd+Eyptp6:Xr^ p\w+%\%Bps[@#5Bn(v4V@z[2FWMhͣ vkOѧ|w͌wݗ>#B$D{THUVj!ɡ5iCy[?PÐ =r98 *=RХrxRtʪgt:i NQ+pI2uV{':$q e`r >cb u8fZOq5[pJ[yCFܐ&Ƣ sHA0i'wk8f f!ʉ2|J>i_ЁI4^?K͞khWRGp|we} ДCS-m}X7ilZ$MeԺoMpxF zSF:B$6;`V5dn&iGIT*JyAx#6Rӗ9Q9_Ա_j/]+]'gK~٠)©k nZ/~N־ +/-zϗ,T P ,^T$ >|@~(KjzǁL#X!$h (S{A'`g瞰JR4|wql"-VW_u Yg̖M1mR$[X4tA`3z"y{a]rJbӝ#AAS$x`M51Im9C/%z}'EScO=øONwcc{.YA$1l^V<ʹ#ݿdcqdf+X9Uf;ߟTDgt-Ifm` L1>OC1)Uʨ{7 jґ!E. XmjP٤١CGiw8{iLk?D>ݓ2^q2e  5u9j٩uHxnJbkA=/,N3B^m7B%gur7ְ\c$Y1UR>7.m:݃$e =V.i0ٱq$oo[B*CLB'eb۩th^uᲖEUf;';T*N[LXMөo:-Vl߂ipE_IioS7SJVnI}o얕:=^3RZÊf?nv+빊@ c}0(>HvbuP֟HgfJcz1H0WztTK烙ܢߦRtgt;!fᩧ,ً44(d*N8)Wf)XPNj)s ٷVxyO^زo ݏ_}a6fSeӪLuc81c8(5O]&*ŒjːH(.K.3sKmېd:D{~4mQ#9zۙ~<޷99 J/&om{4Qc%t*LX=w~Dg}DBnÙXq SAQdq,0FߎVҤ67cu.#+ÿztX yW_RAH}ꩧGLu_~%*]3]z`2#!+sZyo mTgx`a8~z93A#v GJڌѱHRN@ܲCpN[ED7 // `A6яe=`vTB'NHDA7'xa`Y#n(RZ- n\|DCU׷5YJ>׮_96\ab1 6ZW.'zBLmcHV|oL֑7/;SV !*N|/|s4/RBiiqz5pKFZ]g1yiD$& ŜnrR"lS)c`ű$yb1W_IΎR:+l⌇j0~o[|9>;y"$@ .>~LD9ęd}|2pGޖ|S9(|Ɠv_>Wt9[ьpg1ぷ",K´H}Nۑ_N}|,cy&=o)1du&~ڃjO. npݜnН2lnv|'8̢ac@%Ճ*ox5g|&8RUKSj7ܢRtUtT7zUrd捎aR Ϝ=r9T iz\\U8ZM#+BL^{I3RZjFbQQ "| O";D";09^U]Vr: xbR\O/6&'jsM$q}+gt 0ptV;m3Ɖ8ipY0t><X/x۝; jhC;!7Mz@$iwQ o\`shmb XM~|g0ED̩1w6mggɲm{TʪХ :[Ջrt:KT4:담;A?\}MB{AIc=S L(Ӂ01pp|~dBIٗNA-z'NQ efx1+@TTu[+#,MtL#,px%u=@5wIIΚ\/_ٜ6gww}1=Uȣ&}ak8< e_SO~:⼭fCoS;atJ!߲@cx1G̳&mS!!l,͒\^8Q/@[X]*%UfR &M^;mC?ڼ:TvEkc0^iJsYyp+kx =\bۚ 36f Ϝf8gl/Jo ]/6T*=3t?ȍ?ї_K1(e *O>pR4k S)[Ȕ.$ 𛱏8CiV͏m_z"T\tN+6CIf8 VkǴкcZ|"*֎kXL#{9:Nzw;1ݹ}0U׹CCD:}g>=hCylL!1qCTK-M׉8lYh&䱛Ec6\$~o!\.*3t^u6۞'T*gzttp$T;\جecyޕ> ȵ3$[~xW蛅E^_:/2^9¤%La/={,^io}Wo|?7qM ȉ+QhI M%K yR Ct9yߔū =cUt/'ˏ}  ~`5 R^UK'ƊeT*ݷ+=JN`?yPGJ%SfeHxQGh%|__a @%Jf^RLa|Xܯ-Q=7 ֋qdyOAr5tЈK}LìX^~"o>D]1#Ѫ|ߩ2(kh2x`}YrfLDVs Ldv T2!ce߼7߼y4M3\O^_~70fmgΩjme]V/8|Uh2^l|}5r*[v~0=#~182s}s/S}B͖3k0N<Ϭ!҄+hv J8~715nuRDJ;[h? omƽj˖JV _~ԟPs˟gOLD˿u?GRԞOBL/uz4\NN$6/2t q64-:hoS 6l$4{';`kߺwoNӑIg}X~wc]0_=\L]85 ABS qc ZTQ*xd.J @D'poS;82I,qt!x8h4<|O{F 2k9xxe<ns5hptlaЧPr9+]_\ 䣣.W蜪E*JSO][ёE\K]Oݯt|'<Ip:tu7UzCb+^َ4y-@H 324𴽰Sc_å ;Asss_tsUztek>Kzkm'I_uZu_J,/xeynr{[$]{u|h_CWdi9R2%39Aj8#YxqD 70.J< o}Gg4X6]ސͭvɒj5.B- Vomy=j[Fm1gMk!S 68fQuxfƜ6nt^x.OSfQ4/k-7T* -6d:9Ujn [&B4;ưAC&׷%'D 3:ήa[[gd_`o}veq25‹ۚcjXW[B]+Mwߕ;)7]\L.q]F+-}#Rk úǎ}] %pK N` lz'Д [4o\<8>8mGq}l3Bd G.Η@;w8FJNE77ΜxnnTJ 06]|DzO$%"},P) ?#bQK #5W2uDGy`K3%zJҥL?CKv˞x8$B 4l^ow-':@ /+W^uFE%AL պd=K^;L$O[fKG|tw#r{6I">3Rr̶I]NwqlTZ;!Vsy bW2vp.yUN찎Nx"׾h#YQ3nےÂpplSk-pciE S:OH0{ϕ-u&0gCz`I Sl|VhT{T*~$KK~4t0Z3 5}7[\yH( 9sZx37}{vW1eDɱ2mS_' ΂o׫: |AyΰCO7wo&ٵG";+{ xd?W QBL# r?pw23X]pY@rT_z-8+6` "I [M3\u;͂̍9q> sH4[γt Ϝ'WTzg|MU*]*TϏ'::^]wcC_>=g.B`7dfX8Zi2RXY_bS#)h' LWG0y̤zΝ+o,x؀vNY:K inL4% ngf_ YW:ߥ1}wVFLi]Pg6vcqٯcBj+ Ո!g Rz)JosijTr%t.ZSO=՜W|2CQ-.cv^˟GL!kǷm?[r"B;1RG[ӄhRH7f͹ٱyKJV.hSdB).wvݔ&y"‰[$i+NbUZa%BP ^qȦ K:g`߾#pWq:Ց6M{D l2?Smɰ= %Jޣ8 wX@3(o^3Ao,yN(!L[Fh%YzV6*5ITX-Q֑К1z3}=[y/ӱvA+p&{X:FK*xle]6-o.$QCaN>;sЀkdχ|{>!Xu@hf2O;;kă57dzQDL#!(V4I ؟9|.x"LtYl>QK\JG]>җ"IKY.^!ldX# C$x/ c3$<_9nt+4`Yҷ {^腈#Ь:/>u$K= aј:ɨApKut4Q'=aD$-' #Hu2@咬xx!8XX2=σʧzc7-: : 6A4' H6nd]CG.Wac} # k5ЪFT<Хˬj)-./DGVӉkWD!_1_0^Pe&0\.^ Up<]/sp6~PrY0rW3NL\4&Gm9sfT@n#+D?@{v\K94[Zn hyNh02S# իuD+p,š>:u]vk4 -;b])ѐB]075nR; 3#<7WwN PS'#a.XB-M|ϐ=ladI%=D>^ ڟ)䇫t`Z=3$Jo_m1PPaϏ@c,C;]ߌTً$pFi/pAf攤DH`߈4؈K77m2PUYc@tJSOzաQbỹl |9~k\ <ޘ'Yu\r &7rx9ݺ<<{,3{d.b}0z"-BrVvߝe#=wuÝMIf1N%p9Ede!R@O9rqiN΁ʪ#SCFzf6$Pa’S =O9Q ܇OStBxd Z*]--(5tU º3y!KD81)QdgIq~.4$؎K4w`M$@b8k:YN3>6X@X`u']Z3DO}]<>-ݕk@wWpfNp@ovw@I7aw26-NuE8a(Ki m-#4Y j>M&ȿ{4A^VL#]p^v/A{3^u8/e7@:vE"*\m*Zlcq[,OV=ESdѦkw8/;|o٬rmf-ל^QGM.v!\rKV5k=T*] O-o-.Сi*NtG2iOj_glZ:1!HྑaLPkM`$N2׶̷ U,U(qTi ,BBMEÜ෥jy;PS$MH|ϖI{{$ZˡD'eӫf:4$UKN!3߈ꪧ/\]gAaSPjF sיsLׯK}X)c>ߜ?F .=*Z^8>|ҹC/^:u 8f)auבО,ʞM^{Ýv1۔!!kXV \#oZft6/f BKQ&:5>v,eeW 3l6?uΦG*-ݬR+whِRiGrݴ9O9U{f}% u-۬/"F[<"/1WQ]\7C2usi>1*jWBg&u͏^~:yF0]\X߀ү[tv xyTiraMr:xݑ݆*zkvJ&%*t^1#LO\, L$w%1Vhu9.OU=xV?JgOFG@{oӬIveֽCHPh!6d=Gca 2^xGB6 p8d4bء pZg5ݕ:Os}okot>ĝ}N:ԩy̳[_xᅝx /h2h|8z#ƬO+3.r:+dVyL2^^&e8TQ|eCIJ,dRr˩6G16FjT,l4JGm =wH:m$.38v%vwO_`’+ozPI]{UaTe~1 HYb'֔-&M{Xm*ī_B|rfפV2{'YIʀ}2ϗ+W ~X%$%Q͌[m3d0UxE/eCdR K&*o#c.OЍoP|Ixo{r4~%V$(9X9D}m,Ȋ "An(c D\Pi&r4ItpbA=V8 ǷS|G1I'6sm^\_=٧%cS%U⥓{_GבUʴ0仳hzQh˂("*Ǣ[Mz,' n}̩G!xk ĞKѸ^6}ޔFXbO <6FF|*oyI$~OUhLO, c0`e'1P6Rd"nN4lDn/@ rC]74H'qi$=pCir>{se^v`U!r1cK)h$%DߏFc&7c* q_ RS"6hbkE`)qE|7Ta;-j}nTxJpv-ρ]5$dSX8YDZa]$YZmV k 1e@e#a *iZ,Dc<,6Ŀ($^ag+O#˦rqqۜ4׋oܸjh\?"珷7>яO?'$kI;-Ǫ<bXYSTbݝhH)Yp%'|vѹ@#*'I,XٮDɠl$R:`ԙDYIawݙƮQ}K=> ~ɭگ?s޹dlGfbxV9=IlRCJ0<A!C d&'J.Dl0EɸԸ'=eF3C?x]!yk6|w3b5,%on {wƣyg^W$}=qEuvdY /f"^Cb:a8XFr:2" u8ٱ+ 4V螸kEÓ8 aX|h6aJf*j}`K_)q]A~~qHd]u'QQk2nEb0 B #SDFp^:ژ$*|zpf kWfJK,kΩȝl$,S%  bFc޵mç`ԻTF-wI5m.R&lJ1ۻ/vFwg5 Jxg,}ic p⑽k#mJhYHRPKubw OEXAjb{iju/$h]wRNwO;iIQb<߽~åTɰ ]AމTvpͣ&%MtV/^'P t%d331i2Ict4czߘ3!V]q g{\m]5l!sѲxYN F܊vklQsM1v >1ũ]IO4=SbxjƄ رCzF_Fh<8K_\%({A(bxFcq.FEjDN ,?CGhaʺpLq#[Oq\Mxq[ǵHh4Ob(]BU]B??^'bk328K!5*THM&}v$NA%q*QG,ދ(9/:T4k!E;h%Ik&9l} 7W;̖/jlǼKPrw7{e/"c8,C. Ʃ/I9(lgbdg^aŠ81!{Y׋MX*ib-91TXnV6RTS "q2O9%WP9Cmjy\Yƽo8o IEdIjU'”R;񣷚זGN a'?ۿA5+}@~_4FC p,}w-06fxcE9?jILZxVFKj';tu$ɤțrB)+eNV'֖|EH/w5I8!qY"xwBh;eFz}/b 2f_46Ӳ|w$(DB)6: YzwlG6 FYf0O!~o9SlDYMT9+>8llafsY2g[U1g2| OUYI6I/e<^UlsIpcžcwnop4FC&VD!#X3/ɀDx7)5\?0HU"g1.UIH-% 1YjV(E꜡1,W0BG,GBU iy:{}˔j'#u'C nňpSf7>di'KҊk xgS<p%rL'f'9RL;ƝnneHahCdr NoLFym#.)MV =Eb8d[Bɷ'b=.=75e=~f Jx7S Ga"v+zo<4Z.?zo}i4Ƈ`I3c#vHʙUMުN(bMk*ekJGiIJfWD|z5&9 d1v˛&A j>w#5H53P_Z{E,LYtfƾm6'׋oܸ4FCc\Pu?[ Ey$IDmM] 1/O&/r ,qra7qp_U4ɉ_ڇxW,DCuwhu7P/-Z2&+ٕ`KR}!yaV/밉:kcD *iΚ7uo +jpK;!k%r\bQ(9KwY m Ou)Dqic,2d_o"i-wm+{ZefMmn4Bgnlsc h4N,;pN#I7dAz?5Sݒ` Pׂ<ТDbiqz7 ټni,'c$RkdS-nrF!.zv_4}cFpį9c #x"<P 7JcN;R-Ke\x%SK2\ГB~G` 2J/Üw-E2A@ҧ!j-$0hܗ`,T9Ds5)0gz3C ; gbwqƝwB]h4o4Fr7vY\ń(eD⒰@PIhkdz, OeI, >WYA",qw)΋p׻%{Wc߬/|wk;!9w?7q%ypS;'?y9/ a|$bd!\c-B!p=.XM:grAx>7RY}$fV/$6LF嗨o; +84E0CxJQtוhD'/k q]g'#;[YKWv(KTd 9:48rh::J 'T$IŶBV-+(s`%uB̘*B:% #  V͸nZ I5,5|,ܹGs""g,'FS8խ?db-=cht@l\#vw?k?"|h4r<<8>Ӎ5c! 'b6YR6tVVZfT+D|bhe2^!Q?$` dMO27+:dƵɟ~C`лht~{ү|B텏'z[L55CZ&“0 g?x+,֭:Ϲ|c'TV)⽦.Ɨl%͂@*mۯ[%K~NZS:}T߆ mlp~V!F0GfW-v]*GW<|q6Q~ԍO }Yׄ~];r؉F¿+FP!P0' Bh| !B> y;4B?u7 Ivָ3 Z=CF|F{tG+A%^?Xy3|ؠC Z\,XP$wgϻ ķJY(0lo 4d'ڿ;mFOoHJ:4~!a:&h2xX}yAĒitqf|/%e9]ڎ]ɋ{U|ū5W$]xy*WH%Ƴ\"qǟxh))Ə~>^ū7nxYF<~p?jjSAJ3.0F)Kt)cqB- cpQWL*" fM DIt"%J \-ɚ=l5+Wۄ8 aE((3Io gTJDwm7=X(#dwW"5xெ|$Fr\X|ˎnI^ $IYRjLăIg4.I\Pe7V OյZ?lEkܴ_2 6Wu5rR} /qT-[%k1ni3'ihρ tc{LףDBwRFxq߿ N_ 1ęI)gZ2jM~lŢ$L !OP2PU=֚~bPn֞U38ˁK'[N^d DWQG\2yT}  "dx?~qqa;ޔ`yޫLq1 E70cc2JhL]a+XU΍`Yt=C1t\)Tܨ$Ls# 8 h΄јϣOeL7$iG*d^E{>/[7)p3{?и@/d&FNtKO%~>~ ׋߸qUi4]3V8HmcXrpvZZ̃"*'SD`uU:by)rRHOYG<6%I@*nb8jEY24D!< y~"g}jM Zߑ*ڋ9 OxL20+)34S''&rd,LJة+\3 y kjI}+OuV_*di!bkib&>%9UvY1Ua GeD\0 N91`=Q#vz7&AvRRWɑDN =φ=3qGO%vW=h4O$+:hzVFEg~zۏ^x9i4]RopyFܬrH(qԶ봘BlɄ?9Ϥ9p$u,ǿ'X<ɔ^Cd-˹! oHHݶ$%7ُԯzd-w({}Uf# Xb;$Wy="Iz;np{fFd6 ҩ<2IM!tרz%™*H`sqJU$ĒvS&N6ZmCdX1* U}*D-f&jTӘd^_2"7 vw t1q{kFxp k.[)>5E,ϫgIT Z{T IuIk!`C Շ*/"z,I@*3vG7b)B UGb#frk<+bd2 Y epgUM YR ߋu#WHVi'}$xjhN"ǒ; (~|3Y rR\0~bsLXj ]Dp/ +Qn-ryV'&M7omojoڣrD%pcG[w,&CIצ nwjׇ4#+x갻B5'D+Fxbp 4OBi/MU6HQi&uR\'\ɨR~$<; 1 $\źru*FsZ_-bqMlDAUT㫩0ITMRvw t6H{pa+j+r􅻲>-ѪT3 @hWרq[jLn"[t+obөWE>E|Ӳb1B=5 =r&SX ul-Ud1HƉ ;5 k \7v"t{6{B ^zƍh4Otb럡4KtJ_STFV+_IQV_kqE.X?bc4ufWN;=0wJb >`:LZBTBT~%?RF??kߔ+G/}q+3v`[Pr^Hh#D&\`q<-I4jRߤw&4LE<#j4bnga$ȱbtmc bk>wH`wy^)p&Ž '/M>G?vf{,\oh4 \I1UC\q50N;SPJ)XLhŃ+d{Ip㲱hqv2goȬweA0w) @.mUJ%C=szΟ@݋Z >k^wEx 8`_rU^ۈR*4Ir54Ɠ_%3}>䆒^ɞ\52Y!R ՈWxCOƓYmf PAXW4/Fv$0J}ba8Q_,,8^wxЙNn/#׈p4FC F`FNmJͪ=~U# L7s.Coe!tͱ^bqwEHgEu '*ղP)E9"7iLBqraj<^**&\hʌ~ٛox/ݮkt '8 fff|ײUDզQCmL'u[cuZ]e,WQ8CQ iJ|^=:_O˶pdywɜðpx$}~ ozoh4?V#i fRJ:Y(TVR M@DcJUBދ(c&ռ ?f'*0'2J7$9=g ȬlG6u!~w"ZmRhZxS]̨ՊC8:c\ GQ*Tbh{_୺og sH&'\*UsUȆ,URnL5]"Z`c:V4$/6E5xOɭcMNsԚnPˑTK0i ϱ>QXw" b3~ܒ}>/Fxlm@z H$nsZ lڔjZ.D5Yevt·B" Ȭ 'BrX5ТZJR=':|fꤤ[*v2ׅhax(TXV~† *xψHTn|n_s- f)I6-U;$R+DE>52/TEVQQ0P_- -%AAd>|,_c<ս#b5yn< n م,8*UtSb_>3C?WNK h47}$:KsDy+V+ӎ#z_%"ڦZUIX _>(:2JqR Z[0q)T#aT.]<`z rT gR̪Qd/N{oG~=1*-o<34q"rz凊[JqJ{lSb"\'ֹj4<0?6M#+2Z/iR(-f5<>[F-=!oq%ǂSٮ!Q&Mmn4P*5(Rpar3C?я~tw\/^nWFx|q?g(I' 7U< V|ja-Ȁ}n': :g׈&[Mt5W~ZJT@PmuMqmMEjjú'N8ۍI 5Uj{*iA6f LSǎ++|;xTO8ݒ/mHF,`זjqOâ?/2TFH,C{1[ 5,O8Dţ-vN&D0`) c)"*fi{cՃ-T[ Ifr`& {'Kyo~mdQ!#BrAW&wŬ?R 2Ȋlbdbr% 1or%D.]ir 7*m՗B\0wJeJF%r{HʯG"*H=Jaò c\1v0N}]^^~WFXaC"BGD%(K, RdKjRy8H` DT8r@`[on$ݑ$[SUmu#U_B늩Q{p3!ʯ0$$ {{AFR%U4P,doдO|ߵ^2ΪTg>7vo|3$CN_F3C?؞7^Fh<68-R+]"+gh9 YY5҉`KM%TgA+@q䆚Lm.9HXFܩtF@J9~8JravE8Vc%)NUwy|3w`˗1SJ,ME{/cކA8 `gN$QΞ~زIionʪ1"oj2Am)]zE1ڴN2mJ8Ee4c ޮЍF^6]b*;*%%EofI&(P.pqi81yΒZ$#Va5;:?Pmg>y.) %)fu:Nx {2\#P1c}(?ߤF䐓i`۴;_ܖG9[qk3:)kZGpGjun*nlqBh+MyWIT&%*+^F88aEhqDJ ~rوtz\]h^3ۜ9Sׂ͛곯.Fh4#CA"Q%8̥zP|JN_2`BLyF""cJ]#~YF.5YT\꙱2  }Gz/HzN&V[00%'ă ;^GLȟ}xR#e TF"SZ.F{u~+7i6Vqi.Sq]MJxfV>ԈMuz$X_A^ǻe~xW+#-njn `Fh4#.йc4Rj\jpi!5Be2D|lN\NR1I FweI#$x;B S{TEn\9YED|pJ罕%ȢכiDS;rpl_esc[܉$F8s,ǝjsN,1sBD997j){8?M{>>Mr LTڡsM*j@bLu/8mML'!VtʤaFh4|h(IG);ިXvb@r/Ki d&(i|̈́v*3-;1?Qm][X "!)띐D%)!0n$w7s] l>g'2_0T~Uy `y`7s tDNEq8 yLr,=TYvQd[() H~%4Fh4ׄa'CK[ WnЄP5){f}弞):]ōu:qrǙib=Q6$(s;-]ltI@4G Ry-=$d &nG&N $8tqE+ XH̎rJ@!C" d!;FVoP[EI@D~=%gܧsVVKo&Y{xS/gEn<ZVl[D7Fh4%+aD [S2 1f-a2r({p9nHVN~+1ӆZW>g,^,bvB^*ޓ' m\W5K0Bj 6Hh*~:GPÎ:)HlY 7Z⏩Ξџ[)-#Ei]q{7tRٰQ,i1Fh4FZpe iҕ02@'IH6">й269"Fd%'&v;,Y2&ҰhӠA n,%sao)Q-A=OVG- Zb\xprL[(a<՞, &xoa-+VIZ( Dx}zL1*7v2I[K"r\ִē2 oZ<` Дs$M`鸷M[tEp7Yv]2`?$ _kpHh4FqMxh p\Sk+BA/& Y*!C9)mg.]^sԹZHr'HkR:p]lnR4ؤJ,0W$r~s1+O"\ ^nڞzH *&LVMLF$oJ.a=~Zzb 19zQ4.gZ?GQVw'XsaRj`!;ʕt0aSYzFh4W*`rJWB]OVW-sZLa/jeJN/sš1!U.1\{+ps-AVchLEPpEBPwJz@|q]GXF5_WG>Y_fQRj;!5f̀Fh4׆(Z)T\3LGڙ{L3y9c&g$X绘YC҅kV'%9xڔ'ixޯDƪΦssޜ+אM/3~@~'ܔ=1VCcHxbWW4{8 ҿè'La#|ɰ2'-1CkҍM $Չ#zżp/Fh4|ؑbY5WAfԄzsIARp:{҂DE|-Ʉ#Y߷@s@AB`TlPmفg)kU">)Yz~_^;H0~ (s5 bƭGu*eDRi4vB.lXvRuFh4F:N"Aq(b=Che^L^ifI#:!ޓ*6WRqAKjLtR1Ƥ8MzJ1fIH97 f)>+c];;H ( ,l]IrSXV|!ADFɾ #I^|R1F׊ern(u~Ahv|?B}!Ii$lNx]J1dl97h4Fh\R_Ǣ\Mx_$\P[O͗=xفžjjki̵uŠlTz`)Ec#68/&CNRvxl@3>΋KCwv%x yk&}yM1Dy:ge6x'BHzLn5R$>хTٰT[R2F*-#2۲./z^ ■9:56 mdFh4)ʙs-^ľ6E$@WU>u}U9d \sQ; yĠ9h"\>&T+]z0~i s+":L$mqL.bӶVRqTRZ22k%uI/g=hD#bɓlש3כ;X;iXW?׌\릁IZd;5sh4FѸ&\I&+jװ3-RR[=Fm&BM_HɱR(cJ~\ NxfuyˆT"d!Thr pWR`{/گܖ Pro0ɽs褢&bwɎRqJk9>x_\*4╋!K9!&1cRR V>H}vUy/dnc(`RT//zFh4W&/x[ʹ<,RN(jZ&l6G|0\3 II~n%5pY$ ciX$l!m-/7m*"wsyURu'X`z6@Șn,;ô&a<DM^O&LN"kRjMׂbX@l)[{ ܫ]vK;r<2Y|e4LgL0x[|Fh4Fj gN:-\%ENe⣳VOH87]MнuŘLdd6\=\: IBbA,b"Ph /Wb!v$~Т^|Kr8 )AћtӸ`28 sU*@Y8MF@(1| u4Mm23c[ x a8h@>N<b 2pxQh4FѸF\k %L㻊HƅT2F΃O]dWsAR;XtgLvgpu53-UJtd8^nJXfxx }\ILWaE(c~`D|?ڊ"fksuj1ہsɤٵ>ϚpE4XMi8Vi4Fh4WsGU,MfW֨itVvu2_u5zRC)Ϯmdw,칱^̉!߯n婴e3v_pc}-i$v%xW==CMwà)S*-n"d8` #NZmqv|4Td1!2-谆~&ǜ4f嗽-9)FM2Fh4k`;V|J%ᚇ"$PfEd)#} (1O~ ȩrn廪,Bll+X3T}Ԗ7>m43V<ɪAd\Vϛt;kPgAHS"}}P!74SVf߯Mpw(~~2oh4Fh\ g|`,r~Z|׉2MBL{.S S(#V * ;ZbRYfy=̙#8UI{7?&˿ϼ)+Ͽ`#73U=Hj f/'i<3R'j"ٹB|1qf%OJP< (8UCnnWC[)J߿FY7Fh4׆]%N<'(j&y?{C5y[)sɶ mrQ)fg"eω~{Rbnթ.J_ ܓw.n6$ml %[C_yZу͐l;AJd !ZLꔨKpW{k<tel{%Kx!էkly w2/Xp1zNh4FѸ~\ YN;r2+D .Uk\r QĸB!E'!zKob(O)Y&0 4tVsLTCe Y@]Z,C`"WO.v- 4n.K:G h4Fh|8K/7<;R̷j`g&)$ZgUEhQd'L1>Iuܟ B:NqSHW ipRs ML==K{/P=;tM * G%zHj՟JjԼ// }$εd\mAe~K8F2 ge"sFh4FǕI$ODR)rHdTM,s|ӞٙfĨ9Tg=q"!F K:Ii-V+B9ץeMrΣ=Zzs+_,r,zH~{ W STI ˓{W$;+ ߭^wvg_%U^ )dG2|+{CSFh4ƣÒ`fUܩxP["u ]*)As3+ep/\R6;GXwwcžuXFn/HWilrF`f&/v_k˪I0XvX͕WIr1) 8w(練,R_?{Az."W^b\ʝ9Kֆltv)Fh4u,~ys(C䶣Fp:U*N~2C@bڙkgK xթZbre+ :u "KZxa4$czs?;@[ IdNQUPݗ/PSkLt8ǒ{+Œ14_`ө>*-Rxwvlǫ<.|Fh4[zo\<-S57剜U'Kp~B1K5?j\:Rh>|L'Oi眳GLm`cc$z +p){hfr7/_-V6'1/S{u"d!: \RJayc2i޲Va%u!vXreHB^!/5'd[Ri,EFh4#o#byv[l2j;%}DvF_*Wxk{rw&Try3Aꉨtrg.٤0M~JI-钟/b%Tn1l %J"oغ)cCevYЗ4Fh4ׄ'xwym[ྊE *k{H=1Vj+"yXtPdD3~JI9҂V r-TT5f733wi\+ ^3 %,F!8LPADwHwiBȮ/;H-Z V,Zvb~keݗFh4FZ3oĽwyqkm9{/OH?=ϓKꬾ?iχ^1yZ]U/.t6)Z;T7j,Pz]Ͼ%k}_+3+}OZ2ib5xta.W43+aMwДsLtCK4.)}nMu׀3aXbe.HFh4E?޳Em";ipBpD> O@{%y=e#UkJ([w;pnޮƤ* T 1=i-2O"ڵ[nD0䧗ׄ; &Su1e"&u܋{Ud}z #O/s{ZO9ȸIh4Fq}x_[I*M/QhBJ|݁NgaW3(Ɩ0qS$ʒd(/}qJ;d5͏'^nx_k;xet4iT[)yM7&FYW+ljtȺD/ba/hOvnKpG#֫.3[~6Fh4ׄI{hֶ,-4GCIa%W/LNLZf!W_6ԙG ;̼3D[&1v>:bVO)/ݶU/JBHM;dSRN=53։bNDָM"28gC-OjvlC2|N:h4FhFڊ) ϦE|}ˋFh4kFwnћ?-0ӒNЮwgjG7#&cs{0==], L79)%o`W/XO۝4bz;.Ė3żnO-PuD@؉4[Ek):MI͘+.vrnhPnrPe)N;%m*Sh4F% ߸|t- ^%8NᶹtOgL: ?1M-}hhS߼U`r$SYl/_+';*vGJ(pI9M[ bCV_ PbWܛe6ESܯ.J%yCpzOuS7L6Fh4{wm]|D9v< ]r^%v,7Yl&DLⷝU΋פ_poS(&ٓ!MoB֞ TP'C$Fj0\𐫳 3[5;Ogoڞka]-'Fh4GJn[~#lP~c k!*0uZH]I=pn ˋkEHY @Ϯ3Vr޳kܑƇ =9Y ie ;iL8]L`g¤[yANΝͳ ԫCkov{GVHLK o4Fh4lIjy4&D a-Rr]OF+ή˝] W4"b̈́HǺKa(*1oqX2gp 6Z-)gdVf&&+|5TqFspGgct'D\[XIK9Q˓ 7Fh4׀k#{;߸xlx]&Tz.}Ke:Δ=[,}HȥX u^7v%X<&x@N}O`J:EDS6$+3Hb`g<$$ XD e/_6ަ;ㅽ35Kѱh4Fh\[m|wD5fԪB2S^Rx!+cwlscq6W?ޔ`$99cc[TUՄ|WNG{-sMEi 1ǒyk̐ g.\*[PE)R.h4FѸ<6x۷-zc{yo?ϞC ȭ[* >*$Χ&Թ<˲'R91#;r`;+_3Wb,-n)RS=V=HBΝɱǜ6)uTAd=1E ̸vwj,_n3*I:CFh4u"ߺ;߼xv[5=B8e%tؔyO)N̼b F!WnUcQ&\@+xv?HPpGlUp㭁Z$b6|{,u V  P_zow]j!Vh4FqMx, 0η.mQ=eJrZ蟄.5C+ǢmkG.x=.'}-i<`#⹲MyLfWhX]n \a1 ]SeNU^q|G:Mmh4FѸ><x͋o<'pg$9~^']*' .=;9MY>r߆mڎO4R?1T+SXUg)ʾp[%wh5jW|$V%BuNhybC\P; Vh4F`ow$C,YCjXw^?d`,Y!$E*_?=ү~Mi4d;ǝLHeEH)ܙWLKgvv%a7Q9ARjȼ1.c"ڂ[d-J E[IVf{`;dRo4Fh4% w/w#.#jy^c^2@ފS͛>sO He iOXZ X$v,0 "Svh.ʯTuڙizcE b  KSFh4G'x'v[˲mfV,b\Y^^X 7I?yWV~Wn|{&w,HXk?^wa#ۂaBnоWvkr|=h`!$VAˉqln,Gak3Fh4Ƶ$7.6{Oҭ z)XWY y;ƩԾvsϼ!Cݝp5hH]FCtsfܦv$VXr`Lƈ<&z5w _UcFh4FD`on\m(2Kp(eg/Hwi2IUU%o5m(L*S [ha8dZUU]~'%tVYJ__h>{Lh4FqP[{ȫӴWp`ZLRE CZdy]i4~$  KK⯕|?gR+}=)V(7x{\,L]4\aDWA%ֽJ'j4Fh\>4x{[+p&cQn DeM"'ρ:ɪMo K)読<έB{~Y6#=ɸկ`圸+6it,sFh4Fz#λ3c!復Tnf b:f_xG_N֤qgv8g~6ֶz7:?!XL &Ɨ^S]nB*?[$ WuRf1V%F P`41Ic$:Oސk&r)Fh4u {[7/ݖ跇HbYshZ˛7g^F?we|n~o!I4'C$/ɼ[~W(Z tˆ3Fg!ǮHS Ru#Kh4Fqx07.>-_!:=@w_%7u; [-]ɬbrkJ;-$+]9:cޑ+2DY-YA=;↕^{h4FѸ<xǾmһ߼-_Q]ǐg_·>Mi4~+Ͽ1Hm$$+4I"nw?9aRs+ALIf e̊DX澴Q\I«q\}bFh4FZ`o]o,>g]oF~gyKG_DtkeWe"-9aˣ[?q_c"&4 QFh4F`o]|oyo__^,..?F~Io$X˗7ϊ|+7#"j+ܦ}^u7ؔ7TbY+Ojs$ou5*dN?zFh4Wg|oܪ-0[_e;}Y[I@/^6tWٳd-u/_^vzC~=i4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4`8PIENDB`nrepl-0.6.0/logo/logo.svg000066400000000000000000000062221342636505500152710ustar00rootroot00000000000000 nrepl-0.6.0/project.clj000066400000000000000000000061571342636505500150170ustar00rootroot00000000000000(defproject nrepl "0.6.0" :description "nREPL is a Clojure *n*etwork REPL." :url "https://nrepl.org" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :scm {:name "git" :url "https://github.com/nrepl/nrepl"} :min-lein-version "2.6.1" :source-paths ["src/clojure"] :java-source-paths ["src/java"] :test-paths ["test/clojure"] :javac-options ["-target" "8" "-source" "8"] :aliases {"bump-version" ["change" "version" "leiningen.release/bump-version"] "test-all" ["with-profile" "+1.7:+1.8:+1.9:+fastlane" "test"] "docs" ["with-profile" "+maint" "run" "-m" "nrepl.impl.docs" "--file" ~(clojure.java.io/as-relative-path (clojure.java.io/file "doc" "modules" "ROOT" "pages" "ops.adoc"))]} :release-tasks [["vcs" "assert-committed"] ["bump-version" "release"] ["vcs" "commit" "Release %s"] ["vcs" "tag" "v" "--no-sign"] ["bump-version"] ["vcs" "commit" "Begin %s"]] :deploy-repositories [["clojars" {:url "https://clojars.org/repo" :username :env/clojars_username :password :env/clojars_password :sign-releases false}]] :profiles {:fastlane {:dependencies [[nrepl/fastlane "0.1.0"]]} :test {:dependencies [[com.hypirion/io "0.3.1"]]} ;; Clojure versions matrix :provided {:dependencies [[org.clojure/clojure "1.10.0"]]} :1.7 {:dependencies [[org.clojure/clojure "1.7.0"]]} :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]} :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.0"]]} :master {:repositories [["snapshots" "https://oss.sonatype.org/content/repositories/snapshots"]] :dependencies [[org.clojure/clojure "1.11.0-master-SNAPSHOT"]]} :sysutils {:plugins [[lein-sysutils "0.2.0"]]} :maint {:source-paths ["src/maint"] :dependencies [[org.clojure/tools.cli "0.4.1"]]} ;; CI tools :cloverage [:test {:plugins [[lein-cloverage "1.0.12-SNAPSHOT"]] :dependencies [[cloverage "1.0.12-SNAPSHOT"]] :cloverage {:codecov? true ;; Cloverage can't handle some of the code ;; in this project :test-ns-regex [#"^((?!nrepl.sanity-test).)*$"]}}] :cljfmt {:plugins [[lein-cljfmt "0.6.1"]] :cljfmt {:indents {as-> [[:inner 0]] with-debug-bindings [[:inner 0]] merge-meta [[:inner 0]]}}} :eastwood [:test {:plugins [[jonase/eastwood "0.3.4"]] :eastwood {:config-files ["eastwood.clj"]}}]}) nrepl-0.6.0/src/000077500000000000000000000000001342636505500134355ustar00rootroot00000000000000nrepl-0.6.0/src/clojure/000077500000000000000000000000001342636505500151005ustar00rootroot00000000000000nrepl-0.6.0/src/clojure/nrepl/000077500000000000000000000000001342636505500162205ustar00rootroot00000000000000nrepl-0.6.0/src/clojure/nrepl/ack.clj000066400000000000000000000033001342636505500174440ustar00rootroot00000000000000(ns nrepl.ack (:require [nrepl.core :as nrepl] [nrepl.transport :as t])) ;; could be a lot fancier, but it'll do for now (def ^{:private true} ack-port-promise (atom nil)) (defn reset-ack-port! [] (reset! ack-port-promise (promise)) ;; save people the misery of ever trying to deref the empty promise in their REPL nil) (defn wait-for-ack "Waits for a presumably just-launched nREPL server to connect and deliver its port number. Returns that number if it's delivered within `timeout` ms, otherwise nil. Assumes that `ack` middleware has been applied to the local nREPL server handler. Expected usage: (reset-ack-port!) (start-server already-running-server-port) => (wait-for-ack) 59872 ; the port of the server started via start-server" [timeout] (let [f (future @@ack-port-promise)] (deref f timeout nil))) (defn handle-ack [h] (fn [{:keys [op port transport] :as msg}] (if (not= op "ack") (h msg) (try (deliver @ack-port-promise port) (t/send transport {:status :done}))))) ;; TODO: could stand to have some better error handling around all of this (defn send-ack ([my-port ack-port] (send-ack my-port ack-port t/bencode)) ([my-port ack-port transport-fn] (with-open [^java.io.Closeable transport (nrepl/connect :transport-fn transport-fn :port ack-port)] (let [client (nrepl/client transport 1000)] ;; consume response from the server, solely to let that side ;; finish cleanly without (by default) spewing a SocketException when ;; the ack client goes away suddenly (dorun (nrepl/message client {:op :ack :port my-port})))))) nrepl-0.6.0/src/clojure/nrepl/bencode.clj000066400000000000000000000335441342636505500203220ustar00rootroot00000000000000;; Copyright (c) Meikel Brandmeyer. All rights reserved. ;; The use and distribution terms for this software are covered by the ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) ;; which can be found in the file epl-v10.html at the root of this distribution. ;; By using this software in any fashion, you are agreeing to be bound by ;; the terms of this license. ;; You must not remove this notice, or any other, from this software. (ns nrepl.bencode "A netstring and bencode implementation for Clojure." {:author "Meikel Brandmeyer"} (:require [clojure.java.io :as io]) (:import clojure.lang.RT [java.io ByteArrayOutputStream EOFException InputStream IOException OutputStream PushbackInputStream])) ;; # Motivation ;; ;; In each and every application, which contacts peer processes via some ;; communication channel, the handling of the communication channel is ;; obviously a central part of the application. Unfortunately introduces ;; handling of buffers of varying sizes often bugs in form of buffer ;; overflows and similar. ;; ;; A strong factor in this situation is of course the protocol which goes ;; over the wire. Depending on its design it might be difficult to estimate ;; the size of the input up front. This introduces more handling of message ;; buffers to accomodate for inputs of varying sizes. This is particularly ;; difficult in languages like C, where there is no bounds checking of array ;; accesses and where errors might go unnoticed for considerable amount of ;; time. ;; ;; To address these issues D. Bernstein developed the so called ;; [netstrings][net]. They are especially designed to allow easy construction ;; of the message buffers, easy and robust parsing. ;; ;; BitTorrent extended this to the [bencode][bc] protocol which also ;; includes ways to encode numbers and collections like lists or maps. ;; ;; *wire* is based on these ideas. ;; ;; [net]: http://cr.yp.to/proto/netstrings.txt ;; [bc]: http://wiki.theory.org/BitTorrentSpecification#Bencoding ;; ;; # Netstrings ;; ;; Now let's start with the basic netstrings. They consist of a byte count, ;; followed a colon and the binary data and a trailing comma. Examples: ;; ;; 13:Hello, World!, ;; 10:Guten Tag!, ;; 0:, ;; ;; The initial byte count allows to efficiently allocate a sufficiently ;; sized message buffer. The trailing comma serves as a hint to detect ;; incorrect netstrings. ;; ;; ## Low-level reading ;; ;; We will need some low-level reading helpers to read the bytes from ;; the input stream. These are `read-byte` as well as `read-bytes`. They ;; are split out, because doing such a simple task as reading a byte is ;; mild catastrophe in Java. So it would add some clutter to the algorithm ;; `read-netstring`. ;; ;; On the other hand they might be also useful elsewhere. ;; ;; To remove some magic numbers from the code below. (def #^{:const true} i 105) (def #^{:const true} l 108) (def #^{:const true} d 100) (def #^{:const true} comma 44) (def #^{:const true} minus 45) ;; These two are only used boxed. So we keep them extra here. (def e 101) (def colon 58) (defn #^{:private true} read-byte #^long [#^InputStream input] (let [c (.read input)] (when (neg? c) (throw (EOFException. "Invalid netstring. Unexpected end of input."))) ;; Here we have a quirk for example. `.read` returns -1 on end of ;; input. However the Java `Byte` has only a range from -128 to 127. ;; How does the fit together? ;; ;; The whole thing is shifted. `.read` actually returns an int ;; between zero and 255. Everything below the value 128 stands ;; for itself. But larger values are actually negative byte values. ;; ;; So we have to do some translation here. `Byte/byteValue` would ;; do that for us, but we want to avoid boxing here. (if (< 127 c) (- c 256) c))) (defn #^{:private true :tag "[B"} read-bytes #^Object [#^InputStream input n] (let [content (byte-array n)] (loop [offset (int 0) len (int n)] (let [result (.read input content offset len)] (when (neg? result) (throw (EOFException. "Invalid netstring. Less data available than expected."))) (when (not= result len) (recur (+ offset result) (- len result))))) content)) ;; `read-long` is used for reading integers from the stream as well ;; as the byte count prefixes of byte strings. The delimiter is \: ;; for byte count prefixes and \e for integers. (defn #^{:private true} read-long #^long [#^InputStream input delim] (loop [n (long 0)] ;; We read repeatedly a byte from the input… (let [b (read-byte input)] ;; …and stop at the delimiter. (cond (= b minus) (- (read-long input delim)) (= b delim) n :else (recur (+ (* n (long 10)) (- (long b) (long 48)))))))) ;; ## Reading a netstring ;; ;; Let's dive straight into reading a netstring from an `InputStream`. ;; ;; For convenience we split the function into two subfunctions. The ;; public `read-netstring` is the normal entry point, which also checks ;; for the trailing comma after reading the payload data with the ;; private `read-netstring*`. ;; ;; The reason we need the less strict `read-netstring*` is that with ;; bencode we don't have a trailing comma. So a check would not be ;; beneficial here. ;; ;; However the consumer doesn't have to care. `read-netstring` as ;; well as `read-bencode` provide the public entry points, which do ;; the right thing. Although they both may reference the `read-netstring*` ;; underneath. ;; ;; With this in mind we define the inner helper function first. (declare #^"[B" string>payload #^String stringpayload` and `stringpayload [#^String s] (.getBytes s "UTF-8")) (defn #^{:private true :tag String} stringpayload (str (alength content)))) (.write (int colon)) (.write content))) (defn write-netstring "Write the given binary data to the output stream in form of a classic netstring." [#^OutputStream output content] (doto output (write-netstring* content) (.write (int comma)))) ;; # Bencode ;; ;; However most of the time we don't want to send simple blobs of data ;; back and forth. The data sent between the communication peers usually ;; have some structure, which has to be carried along the way to the ;; other side. Here [bencode][bc] come into play. ;; ;; Bencode defines additionally to netstrings easily parseable structures ;; for lists, maps and numbers. It allows to communicate information ;; about the data structure to the peer on the other side. ;; ;; ## Tokens ;; ;; The data is encoded in tokens in bencode. There are several types of ;; tokens: ;; ;; * A netstring without trailing comma for string data. ;; * A tag specifiyng the type of the following tokens. ;; The tag may be one of these: ;; * `\i` to encode integers. ;; * `\l` to encode lists of items. ;; * `\d` to encode maps of item pairs. ;; * `\e` to end the a previously started tag. ;; ;; ## Reading bencode ;; ;; Reading bencode encoded data is basically parsing a stream of tokens ;; from the input. Hence we need a read-token helper which allows to ;; retrieve the next token. (defn #^{:private true} read-token [#^PushbackInputStream input] (let [ch (read-byte input)] (cond (= (long e) ch) nil (= i ch) :integer (= l ch) :list (= d ch) :map :else (do (.unread input (int ch)) (read-netstring* input))))) ;; To read the bencode encoded data we walk a long the sequence of tokens ;; and act according to the found tags. (declare read-integer read-list read-map) (defn read-bencode "Read bencode token from the input stream." [input] (let [token (read-token input)] (case token :integer (read-integer input) :list (read-list input) :map (read-map input) token))) ;; Of course integers and the collection types are have to treated specially. ;; ;; Integers for example consist of a sequence of decimal digits. (defn #^{:private true} read-integer [input] (read-long input e)) ;; *Note:* integers are an ugly special case, which cannot be ;; handled with `read-token` or `read-netstring*`. ;; ;; Lists are just a sequence of other tokens. (declare token-seq) (defn #^{:private true} read-list [input] (vec (token-seq input))) ;; Maps are sequences of key/value pairs. The keys are always ;; decoded into strings. The values are kept as is. (defn #^{:private true} read-map [input] (->> (token-seq input) (into {} (comp (partition-all 2) (map (fn [[k v]] [(string> (repeatedly #(read-bencode input)) (take-while identity))) ;; ## Writing bencode ;; ;; Writing bencode is similar easy as reading it. The main entry point ;; takes a string, map, sequence or integer and writes it according to ;; the rules to the given OutputStream. (defmulti write-bencode "Write the given thing to the output stream. “Thing” means here a string, map, sequence or integer. Alternatively an ByteArray may be provided whose contents are written as a bytestring. Similar the contents of a given InputStream are written as a byte string. Named things (symbols or keywords) are written in the form 'namespace/name'." (fn [_output thing] (cond (instance? (RT/classForName "[B") thing) :bytes (instance? InputStream thing) :input-stream (integer? thing) :integer (string? thing) :string (symbol? thing) :named (keyword? thing) :named (map? thing) :map (or (nil? thing) (coll? thing) (.isArray (class thing))) :list :else (type thing)))) (defmethod write-bencode :default [output x] (throw (IllegalArgumentException. (str "Cannot write value of type " (class x))))) ;; The following methods should be pretty straight-forward. ;; ;; The easiest case is of course when we already have a byte array. ;; We can simply pass it on to the underlying machinery. (defmethod write-bencode :bytes [output bytes] (write-netstring* output bytes)) ;; For strings we simply write the string as a netstring without ;; trailing comma after encoding the string as UTF-8 bytes. (defmethod write-bencode :string [output string] (write-netstring* output (string>payload string))) ;; Streaming does not really work, since we need to know the ;; number of bytes to write upfront. So we read in everything ;; for InputStreams and pass on the byte array. (defmethod write-bencode :input-stream [output stream] (let [bytes (ByteArrayOutputStream.)] (io/copy stream bytes) (write-netstring* output (.toByteArray bytes)))) ;; Integers are again the ugly special case. (defmethod write-bencode :integer [#^OutputStream output n] (doto output (.write (int i)) (.write (string>payload (str n))) (.write (int e)))) ;; Symbols and keywords are converted to a string of the ;; form 'namespace/name' or just 'name' in case its not ;; qualified. We do not add colons for keywords since the ;; other side might not have the notion of keywords. (defmethod write-bencode :named [output thing] (let [nspace (namespace thing) name (name thing)] (->> (str (when nspace (str nspace "/")) name) string>payload (write-netstring* output)))) ;; Lists as well as maps work recursively to print their elements. (defmethod write-bencode :list [#^OutputStream output lst] (.write output (int l)) (doseq [elt lst] (write-bencode output elt)) (.write output (int e))) ;; However, maps are a bit special because their keys are sorted ;; lexicographically based on their byte string represantation. (declare lexicographically) (defmethod write-bencode :map [#^OutputStream output m] (let [translation (into {} (map (juxt string>payload identity) (keys m))) key-strings (sort lexicographically (keys translation)) >value (comp m translation)] (.write output (int d)) (doseq [k key-strings] (write-netstring* output k) (write-bencode output (>value k))) (.write output (int e)))) ;; However, since byte arrays are not `Comparable` we need a custom ;; comparator which we can feed to `sort`. (defn #^{:private true} lexicographically [#^"[B" a #^"[B" b] (let [alen (alength a) blen (alength b) len (min alen blen)] (loop [i 0] (if (== i len) (- alen blen) (let [x (- (int (aget a i)) (int (aget b i)))] (if (zero? x) (recur (inc i)) x)))))) nrepl-0.6.0/src/clojure/nrepl/cmdline.clj000066400000000000000000000352761342636505500203420ustar00rootroot00000000000000(ns nrepl.cmdline "A proof-of-concept command-line client for nREPL. Please see e.g. REPL-y for a proper command-line nREPL client @ https://github.com/trptcolin/reply/" {:author "Chas Emerick"} (:require [clojure.java.io :as io] [clojure.edn :as edn] [clojure.string :as str] [nrepl.config :as config] [nrepl.core :as nrepl] [nrepl.ack :refer [send-ack]] [nrepl.server :as nrepl-server] [nrepl.transport :as transport] [nrepl.version :as version])) (defn- clean-up-and-exit "Performs any necessary clean up and calls `(System/exit status)`." [status] (shutdown-agents) (flush) (binding [*out* *err*] (flush)) (System/exit status)) (defn exit "Requests that the process exit with the given `status`. Does not return." [status] (throw (ex-info nil {::kind ::exit ::status status}))) (defn die "`Print`s items in `msg` to *err* and then exits with a status of 2." [& msg] (binding [*out* *err*] (doseq [m msg] (print m))) (exit 2)) (defmacro ^{:author "Colin Jones"} set-signal-handler! [signal f] (if (try (Class/forName "sun.misc.Signal") (catch Throwable e)) `(try (sun.misc.Signal/handle (sun.misc.Signal. ~signal) (proxy [sun.misc.SignalHandler] [] (handle [signal#] (~f signal#)))) (catch Throwable e#)) `(println "Unable to set signal handlers."))) (def colored-output {:err #(binding [*out* *err*] (print "\033[31m") (print %) (print "\033[m") (flush)) :out print :value (fn [x] (print "\033[34m") (print x) (println "\033[m") (flush))}) (def running-repl (atom {:transport nil :client nil})) (defn- done? [input] (some (partial = input) ['exit 'quit '(exit) '(quit)])) (defn repl-intro "Returns nREPL interactive repl intro copy and version info as a new-line separated string." [] (format "nREPL %s Clojure %s %s %s Interrupt: Control+C Exit: Control+D or (exit) or (quit)" (:version-string version/version) (clojure-version) (System/getProperty "java.vm.name") (System/getProperty "java.runtime.version"))) (defn- run-repl ([host port] (run-repl host port nil)) ([host port {:keys [prompt err out value transport] :or {prompt #(print (str % "=> ")) err print out print value println transport #'transport/bencode}}] (let [transport (nrepl/connect :host host :port port :transport-fn transport) client (nrepl/client-session (nrepl/client transport Long/MAX_VALUE)) ns (atom "user")] (swap! running-repl assoc :transport transport) (swap! running-repl assoc :client client) (println (repl-intro)) (loop [] (prompt @ns) (flush) (let [input (read *in* false 'exit)] (if (done? input) (System/exit 0) (do (doseq [res (nrepl/message client {:op "eval" :code (pr-str input)})] (when (:value res) (value (:value res))) (when (:out res) (out (:out res))) (when (:err res) (err (:err res))) (when (:ns res) (reset! ns (:ns res)))) (recur)))))))) (def #^{:private true} option-shorthands {"-i" "--interactive" "-r" "--repl" "-f" "--repl-fn" "-c" "--connect" "-b" "--bind" "-h" "--host" "-p" "--port" "-m" "--middleware" "-t" "--transport" "-n" "--handler" "-v" "--version"}) (def #^{:private true} unary-options #{"--interactive" "--connect" "--color" "--help" "--version"}) (defn- expand-shorthands "Expand shorthand options into their full forms." [args] (map (fn [arg] (or (option-shorthands arg) arg)) args)) (defn- keywordize-options [options] (reduce-kv #(assoc %1 (keyword (str/replace-first %2 "--" "")) %3) {} options)) (defn- split-args "Convert `args` into a map of options + a list of args. Unary options are set to true during this transformation. Returns a vector combining the map and the list." [args] (loop [[arg & rem-args :as args] args options {}] (if-not (and arg (re-matches #"-.*" arg)) [options args] (if (unary-options arg) (recur rem-args (assoc options arg true)) (recur (rest rem-args) (assoc options arg (first rem-args))))))) (defn help [] (str "Usage: -i/--interactive Start nREPL and connect to it with the built-in client. -c/--connect Connect to a running nREPL with the built-in client. -C/--color Use colors to differentiate values from output in the REPL. Must be combined with --interactive. -b/--bind ADDR Bind address, by default \"127.0.0.1\". -h/--host ADDR Host address to connect to when using --connect. Defaults to \"127.0.0.1\". -p/--port PORT Start nREPL on PORT. Defaults to 0 (random port) if not specified. --ack ACK-PORT Acknowledge the port of this server to another nREPL server running on ACK-PORT. -n/--handler HANDLER The nREPL message handler to use for each incoming connection; defaults to the result of `(nrepl.server/default-handler)`. -m/--middleware MIDDLEWARE A sequence of vars, representing middleware you wish to mix in to the nREPL handler. -t/--transport TRANSPORT The transport to use. By default that's nrepl.transport/bencode. --help Show this help message. -v/--version Display the nREPL version.")) (defn- require-and-resolve "Attempts to resolve the config `key`'s `value` as a namespaced symbol and returns the related var if successful. Otherwise calls `die`." [key sym] (when-not (symbol? sym) (die (format "nREPL %s: %s is not a symbol\n" (name key) (pr-str sym)))) (let [space (some-> (namespace sym) symbol)] (when-not space (die (format "nREPL %s: %s has no namespace\n" (name key) sym))) (require space) (or (ns-resolve space (-> sym name symbol)) (die (format "nREPL %s: unable to resolve %s\n" (name key) sym))))) (def ^:private resolve-mw-xf (comp (map #(require-and-resolve :middleware %)) (keep identity))) (defn- handle-seq-var [var] (let [x @var] (if (sequential? x) (into [] resolve-mw-xf x) [var]))) (defn- handle-interrupt [signal] (let [transport (:transport @running-repl) client (:client @running-repl)] (if (and transport client) (doseq [res (nrepl/message client {:op :interrupt})] (when (= ["done" "session-idle"] (:status res)) (System/exit 0))) (System/exit 0)))) (def ^:private mw-xf (comp (map symbol) resolve-mw-xf (mapcat handle-seq-var))) (defn- ->mw-list [middleware-var-strs] (into [] mw-xf middleware-var-strs)) (defn- build-handler "Build an nREPL handler from `middleware`. `middleware` is a sequence of vars or string which can be resolved to vars, representing middleware you wish to mix in to the nREPL handler. Vars can resolve to a sequence of vars, in which case they'll be flattened into the list of middleware." [middleware] (apply nrepl.server/default-handler (->mw-list middleware))) (defn- ->int [x] (cond (nil? x) x (number? x) x :else (Integer/parseInt x))) (defn- sanitize-middleware-option "Sanitize the middleware option. In the config it can be either a symbol or a vector of symbols." [mw-opt] (if (symbol? mw-opt) [mw-opt] mw-opt)) (defn parse-cli-values "Converts relevant command line argument values to their config representation." [options] (reduce-kv (fn [result k v] (case k (:handler :transport :middleware) (assoc result k (edn/read-string v)) result)) options options)) (defn args->cli-options "Takes CLI args list and returns vector of parsed options map and remaining args." [args] (let [[options _args] (split-args (expand-shorthands args)) merge-config (partial merge config/config) options (-> options (keywordize-options) (parse-cli-values) (merge-config))] [options _args])) (defn display-help "Prints the help copy to the screen and exits the program with exit code 0." [] (println (help)) (exit 0)) (defn display-version "Prints nREPL version to the screen and exits the program with exit code 0." [] (println (:version-string version/version)) (exit 0)) (defn- options->transport "Takes a map of nREPL CLI options. Returns either a default transport or the value of :transport." [options] (or (some->> options (:transport) (require-and-resolve :transport)) #'transport/bencode)) (defn- options->handler "Takes a map of nREPL CLI options and list of middleware. Returns a request handler function. If some handler was explicitly passed we'll use it, otherwise we'll build one from whatever was passed via --middleware" [options middleware] (or (some->> options (:handler) (require-and-resolve :handler)) (build-handler middleware))) (defn- options->ack-port "Takes a map of nREPL CLI options. Returns integer ack port or nil." [options] (some-> options (:ack) (->int))) (defn- options->repl-fn "Takes a map of nREPL CLI options. Returns either the :repl-fn config option or uses run-repl." [options] (or (some->> options (:repl-fn) (symbol) (require-and-resolve :repl-fn)) #'run-repl)) (defn- options->greeting "Takes a map of nREPL CLI options and the selected transport for the server. Returns a greeting function or nil." [options transport] (when (= transport #'transport/tty) #'transport/tty-greeting)) (defn connection-opts "Takes map of nREPL CLI options Returns map of processed options used to connect or start a nREPL server." [options] {:port (->int (:port options)) :host (:host options) :transport (options->transport options) :repl-fn (options->repl-fn options)}) (defn server-opts "Takes a map of nREPL CLI options Returns map of processed options to start an nREPL server." [options] (let [middleware (sanitize-middleware-option (:middleware options)) {:keys [host port transport]} (connection-opts options)] (merge options {:host host :port port :transport transport :bind (:bind options) :middleware middleware :handler (options->handler options middleware) :greeting (options->greeting options transport) :ack-port (options->ack-port options) :repl-fn (options->repl-fn options)}))) (defn interactive-repl "Runs an interactive repl if :interactive CLI option is true otherwise puts the current thread to sleep Takes nREPL server map and processed CLI options map. Returns nil." [server options] (let [transport (:transport options) repl-fn (:repl-fn options) host (:host server) port (:port server)] (repl-fn host port (merge (when (:color options) colored-output) {:transport transport})))) (defn connect-to-server "Connects to a running nREPL server and runs a REPL. Exits program when REPL is closed. Takes a map of nREPL CLI options." [{:keys [host port transport] :as options}] (interactive-repl {:host host :port port} options) (exit 0)) (defn ack-server "Acknowledge the port of this server to another nREPL server running on :ack port. Takes nREPL server map and processed CLI options map. Prints a message describing the acknowledgement between servers. Returns nil." [server options] (when-let [ack-port (:ack-port options)] (let [port (:port server) transport (:transport options)] (binding [*out* *err*] (println (format "ack'ing my port %d to other server running on port %d" port ack-port) (send-ack port ack-port transport)))))) (defn server-started-message "Returns nREPL server started message that some tools rely on to parse the connection details from. Takes nREPL server map and processed CLI options map. Returns connection header string." [server options] (let [transport (:transport options) port (:port server) ^java.net.ServerSocket ssocket (:server-socket server) host (.getHostName (.getInetAddress ssocket))] ;; The format here is important, as some tools (e.g. CIDER) parse the string ;; to extract from it the host and the port to connect to (format "nREPL server started on port %d on host %s - %s://%s:%d" port host (transport/uri-scheme transport) host port))) (defn save-port-file "Writes a file relative to project classpath with port number so other tools can infer the nREPL server port. Takes nREPL server map and processed CLI options map. Returns nil." [server options] ;; Many clients look for this file to infer the port to connect to (let [port (:port server) port-file (io/file ".nrepl-port")] (.deleteOnExit port-file) (spit port-file port))) (defn start-server "Creates an nREPL server instance. Takes map of CLI options. Returns nREPL server map." [{:keys [port bind handler transport greeting] :as options}] (nrepl-server/start-server :port port :bind bind :handler handler :transport-fn transport :greeting-fn greeting)) (defn dispatch-commands "Look at options to dispatch a specified command. Takes CLI options map. May return a server map, nil, or exit." [options] (cond (:help options) (display-help) (:version options) (display-version) (:connect options) (connect-to-server (connection-opts options)) :else (let [options (server-opts options) server (start-server options)] (ack-server server options) (println (server-started-message server options)) (save-port-file server options) (if (:interactive options) (interactive-repl server options) ;; need to hold process open with a non-daemon thread ;; -- this should end up being super-temporary (Thread/sleep Long/MAX_VALUE))))) (defn -main [& args] (try (set-signal-handler! "INT" handle-interrupt) (let [[options _args] (args->cli-options args)] (dispatch-commands options)) (catch clojure.lang.ExceptionInfo ex (let [{:keys [::kind ::status]} (ex-data ex)] (when (= kind ::exit) (clean-up-and-exit status)) (throw ex))))) nrepl-0.6.0/src/clojure/nrepl/config.clj000066400000000000000000000032161342636505500201610ustar00rootroot00000000000000(ns nrepl.config "Server configuration utilities. Some server options can be configured via configuration files (local or global). This namespace provides convenient API to work with them. The config resolution algorithm is the following: The global config file .nrepl/nrepl.edn is merged with any local config file (.nrepl.edn) if present. The values in the local config file take precedence." {:author "Bozhidar Batsov" :added "0.5.0"} (:require [clojure.java.io :as io] [clojure.edn :as edn])) (def ^:private home-dir "The user's home directory." (System/getProperty "user.home")) (def config-dir "nREPL's configuration directory. By default it's ~/.nrepl, but this can be overridden with the NREPL_CONFIG_DIR env variable." (or (System/getenv "NREPL_CONFIG_DIR") (str home-dir java.io.File/separator ".nrepl"))) (def config-file "nREPL's config file." (str config-dir java.io.File/separator "nrepl.edn")) (defn- load-edn "Load edn from an io/reader source (filename or io/resource)." [source] (with-open [r (io/reader source)] (edn/read (java.io.PushbackReader. r)))) (defn- load-config "Load the configuration file identified by `filename`. Return its contents as EDN if the file exists, or an empty map otherwise." [filename] (let [file (io/file filename)] (if (.exists file) (load-edn file) {}))) (def config "Configuration map. It's created by merging the global configuration file with a local configuration file that would normally the placed in the directory in which you're running nREPL." (merge (load-config config-file) (load-config ".nrepl.edn"))) nrepl-0.6.0/src/clojure/nrepl/core.clj000066400000000000000000000217441342636505500176520ustar00rootroot00000000000000(ns nrepl.core "High level nREPL client support." {:author "Chas Emerick"} (:require clojure.set [nrepl.misc :refer [uuid]] [nrepl.transport :as transport] [nrepl.version :as version]) (:import clojure.lang.LineNumberingPushbackReader [java.io Reader StringReader Writer PrintWriter])) (defn response-seq "Returns a lazy seq of messages received via the given Transport. Called with no further arguments, will block waiting for each message. The seq will end only when the underlying Transport is closed (i.e. returns nil from `recv`) or if a message takes longer than `timeout` millis to arrive." ([transport] (response-seq transport Long/MAX_VALUE)) ([transport timeout] (take-while identity (repeatedly #(transport/recv transport timeout))))) (defn client "Returns a fn of zero and one argument, both of which return the current head of a single response-seq being read off of the given client-side transport. The one-arg arity will send a given message on the transport before returning the seq. Most REPL interactions are best performed via `message` and `client-session` on top of a client fn returned from this fn." [transport response-timeout] (let [latest-head (atom nil) update #(swap! latest-head (fn [[timestamp seq :as head] now] (if (< timestamp now) [now %] head)) ;; nanoTime appropriate here; looking to maintain ordering, not actual timestamps (System/nanoTime)) tracking-seq (fn tracking-seq [responses] (lazy-seq (if (seq responses) (let [rst (tracking-seq (rest responses))] (update rst) (cons (first responses) rst)) (do (update nil) nil)))) restart #(let [head (-> transport (response-seq response-timeout) tracking-seq)] (reset! latest-head [0 head]) head)] ^{::transport transport ::timeout response-timeout} (fn this ([] (or (second @latest-head) (restart))) ([msg] (transport/send transport msg) (this))))) (defn- take-until "Like (take-while (complement f) coll), but includes the first item in coll that returns true for f." [f coll] (let [[head tail] (split-with (complement f) coll)] (concat head (take 1 tail)))) (defn- delimited-transport-seq [client termination-statuses delimited-slots] (with-meta (comp (partial take-until (comp #(seq (clojure.set/intersection % termination-statuses)) set :status)) (let [keys (keys delimited-slots)] (partial filter #(= delimited-slots (select-keys % keys)))) client #(merge % delimited-slots)) (-> (meta client) (update-in [::termination-statuses] (fnil into #{}) termination-statuses) (update-in [::taking-until] merge delimited-slots)))) (defn message "Sends a message via [client] with a fixed message :id added to it. Returns the head of the client's response seq, filtered to include only messages related to the message :id that will terminate upon receipt of a \"done\" :status." [client {:keys [id] :as msg :or {id (uuid)}}] (let [f (delimited-transport-seq client #{"done"} {:id id})] (f (assoc msg :id id)))) (defn new-session "Provokes the creation and retention of a new session, optionally as a clone of an existing retained session, the id of which must be provided as a :clone kwarg. Returns the new session's id." [client & {:keys [clone]}] (let [resp (first (message client (merge {:op "clone"} (when clone {:session clone}))))] (or (:new-session resp) (throw (IllegalStateException. (str "Could not open new session; :clone response: " resp)))))) (defn client-session "Returns a function of one argument. Accepts a message that is sent via the client provided with a fixed :session id added to it. Returns the head of the client's response seq, filtered to include only messages related to the :session id that will terminate when the session is closed." [client & {:keys [session clone]}] (let [session (or session (apply new-session client (when clone [:clone clone])))] (delimited-transport-seq client #{"session-closed"} {:session session}))) (defn combine-responses "Combines the provided seq of response messages into a single response map. Certain message slots are combined in special ways: - only the last :ns is retained - :value is accumulated into an ordered collection - :status and :session are accumulated into a set - string values (associated with e.g. :out and :err) are concatenated" [responses] (reduce (fn [m [k v]] (case k (:id :ns) (assoc m k v) :value (update-in m [k] (fnil conj []) v) :status (update-in m [k] (fnil into #{}) v) :session (update-in m [k] (fnil conj #{}) v) (if (string? v) (update-in m [k] #(str % v)) (assoc m k v)))) {} (apply concat responses))) (defn code* "Returns a single string containing the pr-str'd representations of the given expressions." [& expressions] (apply str (map pr-str expressions))) (defmacro code "Expands into a string consisting of the macro's body's forms (literally, no interpolation/quasiquoting of locals or other references), suitable for use in an :eval message, e.g.: {:op :eval, :code (code (+ 1 1) (slurp \"foo.txt\"))}" [& body] (apply code* body)) (defn read-response-value "Returns the provided response message, replacing its :value string with the result of (read)ing it. Returns the message unchanged if the :value slot is empty or not a string." [{:keys [value] :as msg}] (if-not (string? value) msg (try (assoc msg :value (read-string value)) (catch Exception e (throw (IllegalStateException. (str "Could not read response value: " value) e)))))) (defn response-values "Given a seq of responses (as from response-seq or returned from any function returned by client or client-session), returns a seq of values read from :value slots found therein." [responses] (->> responses (map read-response-value) combine-responses :value)) (defn connect "Connects to a socket-based REPL at the given host (defaults to 127.0.0.1) and port, returning the Transport (by default `nrepl.transport/bencode`) for that connection. Transports are most easily used with `client`, `client-session`, and `message`, depending on the semantics desired." [& {:keys [port host transport-fn] :or {transport-fn transport/bencode host "127.0.0.1"}}] {:pre [transport-fn port]} (transport-fn (java.net.Socket. ^String host (int port)))) (defn- ^java.net.URI to-uri [x] {:post [(instance? java.net.URI %)]} (if (string? x) (java.net.URI. x) x)) (defn- socket-info [x] (let [uri (to-uri x) port (.getPort uri)] (merge {:host (.getHost uri)} (when (pos? port) {:port port})))) (def ^{:private false} uri-scheme #(-> (to-uri %) .getScheme .toLowerCase)) (defmulti url-connect "Connects to an nREPL endpoint identified by the given URL/URI. Valid examples include: nrepl://192.168.0.12:7889 telnet://localhost:5000 http://your-app-name.heroku.com/repl This is a multimethod that dispatches on the scheme of the URI provided (which can be a string or java.net.URI). By default, implementations for nrepl (corresponding to using the default bencode transport) and telnet (using the `nrepl.transport/tty` transport) are registered. Alternative implementations may add support for other schemes, such as HTTP, HTTPS, JMX, existing message queues, etc." uri-scheme) ;; TODO: oh so ugly (defn- add-socket-connect-method! [protocol connect-defaults] (defmethod url-connect protocol [uri] (apply connect (mapcat identity (merge connect-defaults (socket-info uri)))))) (add-socket-connect-method! "nrepl" {:transport-fn transport/bencode :port 7888}) (add-socket-connect-method! "telnet" {:transport-fn transport/tty}) (defmethod url-connect :default [uri] (throw (IllegalArgumentException. (format "No nREPL support known for scheme %s, url %s" (uri-scheme uri) uri)))) (def ^{:deprecated "0.5.0"} version "Use `nrepl.version/version` instead. Current version of nREPL. Map of :major, :minor, :incremental, :qualifier, and :version-string." version/version) (def ^{:deprecated "0.5.0"} version-string "Use `(:version-string nrepl.version/version)` instead. Current version of nREPL as a string. See also `version`." (:version-string version/version)) nrepl-0.6.0/src/clojure/nrepl/helpers.clj000066400000000000000000000036051342636505500203600ustar00rootroot00000000000000(ns nrepl.helpers {:author "Chas Emerick"} (:require [nrepl.middleware.load-file :as load-file]) (:import (java.io File StringReader))) (defn load-file-command "(If it is available, sending nrepl.middleware.load-file compatible messages is far preferable.) Returns a string expression that can be sent to an nREPL session to load the Clojure code in given local file in the remote REPL's environment, preserving debug information (e.g. line numbers, etc). Typical usage: (nrepl-client-fn {:op \"eval\" :code (load-file-command \"/path/to/clojure/file.clj\")}) If appropriate, the source path from which the code is being loaded may be provided as well (suitably trimming the file's path to a relative one when loaded). The 3-arg variation of this function expects the full source of the file to be loaded, the source-root-relative path of the source file, and the name of the file. e.g.: (load-file-command \"…code here…\" \"some/ns/name/file.clj\" \"file.clj\")" ([f] (load-file-command f nil)) ([f source-root] (let [^String abspath (if (string? f) f (.getAbsolutePath ^File f)) source-root (cond (nil? source-root) "" (string? source-root) source-root (instance? File source-root) (.getAbsolutePath ^File source-root))] (load-file-command (slurp abspath :encoding "UTF-8") (if (and (seq source-root) (.startsWith abspath source-root)) (-> abspath (.substring (count source-root)) (.replaceAll "^[/\\\\]" "")) abspath) (-> abspath File. .getName)))) ([code file-path file-name] (load-file/load-file-code code file-path file-name))) nrepl-0.6.0/src/clojure/nrepl/middleware.clj000066400000000000000000000215511342636505500210330ustar00rootroot00000000000000(ns nrepl.middleware (:refer-clojure :exclude [comparator]) (:require [clojure.set :as set] [nrepl.misc :as misc] [nrepl.transport :as transport] [nrepl.version :as version])) (defn- var-name [^clojure.lang.Var v] (str (.ns v) \/ (.sym v))) (defn- wrap-conj-descriptor [descriptor-map h] (fn [{:keys [op descriptors] :as msg}] (h (if-not (= op "describe") msg (assoc msg :descriptors (merge descriptor-map descriptors)))))) (defn set-descriptor! "Sets the given [descriptor] map as the ::descriptor metadata on the provided [middleware-var], after assoc'ing in the var's fully-qualified name as the descriptor's \"implemented-by\" value." [middleware-var descriptor] (let [descriptor (-> descriptor (assoc :implemented-by (-> middleware-var var-name symbol)) (update-in [:expects] (fnil conj #{}) "describe"))] (alter-meta! middleware-var assoc ::descriptor descriptor) (alter-var-root middleware-var #(comp (partial wrap-conj-descriptor {middleware-var descriptor}) %)))) (defn- safe-version [m] (into {} (filter (fn [[_ v]] (or (number? v) (string? v))) m))) (defn- java-version [] (let [version-string (System/getProperty "java.version") version-seq (re-seq #"\d+" version-string) version-map (if (<= 3 (count version-seq)) (zipmap [:major :minor :incremental :update] version-seq) {})] (assoc version-map :version-string version-string))) (defn wrap-describe [h] (fn [{:keys [op descriptors verbose? transport] :as msg}] (if (= op "describe") (transport/send transport (misc/response-for msg (merge (when-let [aux (reduce (fn [aux {:keys [describe-fn]}] (if describe-fn (merge aux (describe-fn msg)) aux)) nil (vals descriptors))] {:aux aux}) {:ops (let [ops (apply merge (map :handles (vals descriptors)))] (if verbose? ops (zipmap (keys ops) (repeat {})))) :versions {:nrepl (safe-version version/version) :clojure (safe-version (assoc *clojure-version* :version-string (clojure-version))) :java (safe-version (java-version))} :status :done}))) (h msg)))) (set-descriptor! #'wrap-describe {:handles {"describe" {:doc "Produce a machine- and human-readable directory and documentation for the operations supported by an nREPL endpoint." :requires {} :optional {"verbose?" "Include informational detail for each \"op\"eration in the return message."} :returns {"ops" "Map of \"op\"erations supported by this nREPL endpoint" "versions" "Map containing version maps (like *clojure-version*, e.g. major, minor, incremental, and qualifier keys) for values, component names as keys. Common keys include \"nrepl\" and \"clojure\"." "aux" "Map of auxilliary data contributed by all of the active nREPL middleware via :describe-fn functions in their descriptors."}}}}) ;; eliminate implicit expectation of "describe" handler; this is the only ;; special case introduced by the conj'ing of :expects "describe" by set-descriptor! (alter-meta! #'wrap-describe update-in [::descriptor :expects] disj "describe") (defn- dependencies [set start dir] (let [ops (start dir) deps (set/select (comp seq (partial set/intersection ops) :handles) set)] (when (deps start) (throw (IllegalArgumentException. (format "Middleware %s depends upon itself via %s" (:implemented-by start) dir)))) (concat ops (mapcat #(dependencies set % dir) deps)))) (defn- comparator [{a-requires :requires a-expects :expects a-handles :handles} {b-requires :requires b-expects :expects b-handles :handles}] (or (->> (into {} [[[a-requires b-handles] -1] [[a-expects b-handles] 1] [[b-requires a-handles] 1] [[b-expects a-handles] -1]]) (map (fn [[sets ret]] (and (seq (apply set/intersection sets)) ret))) (some #{-1 1})) 0)) (defn- extend-deps [middlewares] (let [descriptor #(-> % meta ::descriptor) middlewares (concat middlewares (->> (map descriptor middlewares) (mapcat (juxt :expects :requires)) (mapcat identity) (filter var?)))] (doseq [m (remove descriptor middlewares)] (binding [*out* *err*] (printf "[WARNING] No nREPL middleware descriptor in metadata of %s, see nrepl.middleware/set-descriptor!" m) (println))) (let [middlewares (set (for [m middlewares] (-> (descriptor m) ;; only conj'ing m here to support direct reference to ;; middleware dependencies in :expects and :requires, ;; e.g. interruptable-eval's dep on ;; nrepl.middleware.print/wrap-print (update-in [:handles] (comp set #(conj % m) keys)) (assoc :implemented-by m))))] (set (for [m middlewares] (reduce #(update-in % [%2] into (dependencies middlewares % %2)) m #{:expects :requires})))))) (defn- topologically-sort "Topologically sorts the given middlewares according to the comparator, with the added heuristic that any middlewares that have no dependencies will be sorted toward the end." [komparator stack] (let [stack (vec stack) ;; using indexes into the above vector as the vertices in the ;; graph algorithm, will translate back into middlewares at ;; the end. vertices (range (count stack)) edges (for [i1 vertices i2 (range i1) :let [x (komparator (stack i1) (stack i2))] :when (not= 0 x)] (if (neg? x) [i1 i2] [i2 i1])) ;; the trivial vertices have no connections, and we pull them ;; out here so we can make sure they get put on the end trivial-vertices (remove (set (apply concat edges)) vertices)] (loop [sorted-vertices [] remaining-edges edges remaining-vertices (remove (set trivial-vertices) vertices)] (if (seq remaining-vertices) (let [non-initials (->> remaining-edges (map second) (set)) next-vertex (->> remaining-vertices (remove non-initials) (first))] (if next-vertex (recur (conj sorted-vertices next-vertex) (remove #((set %) next-vertex) remaining-edges) (remove #{next-vertex} remaining-vertices)) ;; Cycle detected! Have to actually assemble a cycle so we ;; can throw a useful error. (let [start (first remaining-vertices) step (into {} remaining-edges) cycle (->> (iterate step start) (rest) (take-while (complement #{start})) (cons start)) data {:cycle (map stack cycle)}] (throw (ex-info "Unable to satisfy nREPL middleware ordering requirements!" data))))) (map stack (concat sorted-vertices trivial-vertices)))))) (defn linearize-middleware-stack [middlewares] (->> middlewares extend-deps (topologically-sort comparator) (map :implemented-by))) nrepl-0.6.0/src/clojure/nrepl/middleware/000077500000000000000000000000001342636505500203355ustar00rootroot00000000000000nrepl-0.6.0/src/clojure/nrepl/middleware/caught.clj000066400000000000000000000106221342636505500223030ustar00rootroot00000000000000(ns nrepl.middleware.caught "Support for a hook for conveying errors interactively, akin to the `:caught` option of `clojure.main/repl`. See the docstring of `wrap-caught` and the Evaluation Errors section of the Middleware documentation for more information." {:author "Michael Griffiths" :added "0.6.0"} (:require [clojure.main] [nrepl.middleware :refer [set-descriptor!]] [nrepl.middleware.print :as print] [nrepl.misc :as misc] [nrepl.transport :as transport]) (:import (nrepl.transport Transport))) (def ^:dynamic *caught-fn* "Function to use to convey interactive errors (generally by printing to `*err*`). Takes one argument, a `java.lang.Throwable`." clojure.main/repl-caught) (def default-bindings {#'*caught-fn* *caught-fn*}) (defn- bound-configuration [] {::caught-fn *caught-fn*}) (def configuration-keys [::caught-fn ::print?]) (defn- resolve-caught [{:keys [::caught transport] :as msg}] (when-let [var-sym (some-> caught (symbol))] (let [caught-var (misc/requiring-resolve var-sym)] (when-not caught-var (let [resp {:status ::error ::error (str "Couldn't resolve var " var-sym)}] (transport/send transport (misc/response-for msg resp)))) caught-var))) (defn- caught-transport [{:keys [transport] :as msg} opts] (reify Transport (recv [this] (transport/recv transport)) (recv [this timeout] (transport/recv transport timeout)) (send [this {:keys [::throwable] :as resp}] (let [{:keys [::caught-fn ::print?]} (-> (merge msg (bound-configuration) resp opts) (select-keys configuration-keys))] (when throwable (caught-fn throwable)) (transport/send transport (cond-> (apply dissoc resp configuration-keys) (and throwable print?) (update ::print/keys (fnil conj []) ::throwable) (not print?) (dissoc ::throwable)))) this))) (defn wrap-caught "Middleware that provides a hook for any `java.lang.Throwable` that should be conveyed interactively (generally by printing to `*err*`). Returns a handler which calls said hook on the `::caught/throwable` slot of messages sent via the request's transport. Supports the following options: * `::caught` – a fully-qualified symbol naming a var whose function to use to convey interactive errors. Must point to a function that takes a `java.lang.Throwable` as its sole argument. * `::caught-fn` – the function to use to convey interactive errors. Will be resolved from the above option if provided. Defaults to `clojure.main/repl-caught`. Must take a `java.lang.Throwable` as its sole argument. * `::print?` – if logical true, the printed value of any interactive errors will be returned in the response (otherwise they will be elided). Delegates to `nrepl.middleware.print` to perform the printing. Defaults to false. The options may be specified in either the request or the responses sent on its transport. If any options are specified in both, those in the request will be preferred." [handler] (fn [msg] (let [caught-var (resolve-caught msg) msg (assoc msg ::caught-fn (or caught-var *caught-fn*)) opts (cond-> (select-keys msg configuration-keys) ;; no caught-fn provided in the request, so defer to the response (nil? caught-var) (dissoc ::caught-fn) ;; in bencode empty list is logical false (contains? msg ::print?) (update ::print? #(if (= [] %) false (boolean %))))] (handler (assoc msg :transport (caught-transport msg opts)))))) (set-descriptor! #'wrap-caught {:requires #{#'print/wrap-print} :expects #{} :handles {}}) (def wrap-caught-optional-arguments {"nrepl.middleware.caught/caught" "A fully-qualified symbol naming a var whose function to use to convey interactive errors. Must point to a function that takes a `java.lang.Throwable` as its sole argument." "nrepl.middleware.caught/print?" "If logical true, the printed value of any interactive errors will be returned in the response (otherwise they will be elided). Delegates to `nrepl.middleware.print` to perform the printing. Defaults to false."}) nrepl-0.6.0/src/clojure/nrepl/middleware/interruptible_eval.clj000066400000000000000000000212271342636505500247320ustar00rootroot00000000000000(ns nrepl.middleware.interruptible-eval {:author "Chas Emerick"} (:require clojure.main clojure.test [nrepl.middleware :refer [set-descriptor!]] [nrepl.middleware.caught :as caught] [nrepl.middleware.print :as print] [nrepl.misc :refer [response-for]] [nrepl.transport :as t]) (:import (clojure.lang Compiler$CompilerException LineNumberingPushbackReader) (java.io FilterReader LineNumberReader StringReader Writer) (java.lang.reflect Field))) (def ^:dynamic *msg* "The message currently being evaluated." nil) (defn- capture-thread-bindings "Capture thread bindings, excluding nrepl implementation vars." [] (dissoc (get-thread-bindings) #'*msg*)) (defn- set-line! [^LineNumberingPushbackReader reader line] (-> reader (.setLineNumber line))) (defn- set-column! [^LineNumberingPushbackReader reader column] (when-let [field (->> LineNumberingPushbackReader (.getDeclaredFields) (filter #(= "_columnNumber" (.getName ^Field %))) first)] (-> ^Field field (doto (.setAccessible true)) (.set reader column)))) (defn- source-logging-pushback-reader [code line column] (let [reader (LineNumberingPushbackReader. (StringReader. code))] (when line (set-line! reader (int line))) (when column (set-column! reader (int column))) reader)) ;; TODO: use `nrepl.middleware.session/interrupted?` – currently introduces a ;; circular dependency (defn- interrupted? "Returns true if the given throwable was ultimately caused by an interrupt." [^Throwable e] (or (instance? ThreadDeath (clojure.main/root-cause e)) (and (instance? Compiler$CompilerException e) (instance? ThreadDeath (.getCause e))))) (defn evaluate "Evaluates a msg's code within the dynamic context of its session. Uses `clojure.main/repl` to drive the evaluation of :code (either a string or a seq of forms to be evaluated), which may also optionally specify a :ns (resolved via `find-ns`). The map MUST contain a Transport implementation in :transport; expression results and errors will be sent via that Transport." [{:keys [transport session eval ns code file line column out-limit] :as msg}] (let [explicit-ns (and ns (-> ns symbol find-ns)) original-ns (@session #'*ns*) maybe-restore-original-ns (if explicit-ns #(assoc % #'*ns* original-ns) identity)] (if (and ns (not explicit-ns)) (t/send transport (response-for msg {:status #{:error :namespace-not-found :done} :ns ns})) (let [ctxcl (.getContextClassLoader (Thread/currentThread)) ;; TODO: out-limit -> out-buffer-size | err-buffer-size ;; TODO: new options: out-quota | err-quota opts {::print/buffer-size (or out-limit (get (meta session) :out-limit))} out (print/replying-PrintWriter :out msg opts) err (print/replying-PrintWriter :err msg opts)] (try (clojure.main/repl :eval (if eval (find-var (symbol eval)) clojure.core/eval) :init #(let [bindings (-> (get-thread-bindings) (into caught/default-bindings) (into print/default-bindings) (into @session) (into {#'*out* out #'*err* err ;; clojure.test captures *out* at load-time, so we need to make sure ;; runtime output of test status/results is redirected properly ;; TODO: is this something we need to consider in general, or is this ;; specific hack reasonable? #'clojure.test/*test-out* out}) (cond-> explicit-ns (assoc #'*ns* explicit-ns) file (assoc #'*file* file)))] (pop-thread-bindings) (push-thread-bindings bindings)) :read (if (string? code) (let [reader (source-logging-pushback-reader code line column)] #(try (read {:read-cond :allow :eof %2} reader) (catch RuntimeException e ;; If error happens during reading the string, we ;; don't want eval to start reading and executing the ;; rest of it. So we skip over the remaining text. (.skip ^LineNumberingPushbackReader reader Long/MAX_VALUE) (throw e)))) (let [code (.iterator ^Iterable code)] #(or (and (.hasNext code) (.next code)) %2))) :prompt #(reset! session (maybe-restore-original-ns (capture-thread-bindings))) :need-prompt (constantly true) :print (fn [value] ;; *out* has :tag metadata; *err* does not (.flush ^Writer *err*) (.flush *out*) (t/send transport (response-for msg {:ns (str (ns-name *ns*)) :value value ::print/keys #{:value}}))) :caught (fn [^Throwable e] (when-not (interrupted? e) (let [resp {::caught/throwable e :status :eval-error :ex (str (class e)) :root-ex (str (class (clojure.main/root-cause e)))}] (t/send transport (response-for msg resp)))))) (finally (.setContextClassLoader (Thread/currentThread) ctxcl) (.flush err) (.flush out))))))) (defn interruptible-eval "Evaluation middleware that supports interrupts. Returns a handler that supports \"eval\" and \"interrupt\" :op-erations that delegates to the given handler otherwise." [h & configuration] (fn [{:keys [op session interrupt-id id transport] :as msg}] (let [{:keys [interrupt exec] session-id :id} (meta session)] (case op "eval" (if-not (:code msg) (t/send transport (response-for msg :status #{:error :no-code :done})) (exec id #(binding [*msg* msg] (evaluate msg)) #(t/send transport (response-for msg :status :done)))) (h msg))))) (set-descriptor! #'interruptible-eval {:requires #{"clone" "close" #'caught/wrap-caught #'print/wrap-print} :expects #{} :handles {"eval" {:doc "Evaluates code. Note that unlike regular stream-based Clojure REPLs, nREPL's `:eval` short-circuits on first read error and will not try to read and execute the remaining code in the message." :requires {"code" "The code to be evaluated." "session" "The ID of the session within which to evaluate the code."} :optional (merge caught/wrap-caught-optional-arguments print/wrap-print-optional-arguments {"id" "An opaque message ID that will be included in responses related to the evaluation, and which may be used to restrict the scope of a later \"interrupt\" operation." "eval" "A fully-qualified symbol naming a var whose function value will be used to evaluate [code], instead of `clojure.core/eval` (the default)." "file" "The path to the file containing [code]. `clojure.core/*file*` will be bound to this." "line" "The line number in [file] at which [code] starts." "column" "The column number in [file] at which [code] starts."}) :returns {"ns" "*ns*, after successful evaluation of `code`." "values" "The result of evaluating `code`, often `read`able. This printing is provided by the `print` middleware. Superseded by `ex` and `root-ex` if an exception occurs during evaluation." "ex" "The type of exception thrown, if any. If present, then `values` will be absent." "root-ex" "The type of the root exception thrown, if any. If present, then `values` will be absent."}}}}) nrepl-0.6.0/src/clojure/nrepl/middleware/load_file.clj000066400000000000000000000126371342636505500227560ustar00rootroot00000000000000(ns nrepl.middleware.load-file {:author "Chas Emerick"} (:require [nrepl.middleware :as middleware :refer [set-descriptor!]] [nrepl.middleware.caught :as caught] [nrepl.middleware.interruptible-eval :as eval] [nrepl.middleware.print :as print]) (:import nrepl.transport.Transport)) ; need to hold file contents "out of band" so as to avoid JVM method ; size limitations (cannot eval an expression larger than some size ; [64k?]), so the naive approach of just interpolating file contents ; into an expression to be evaluated doesn't work ; see http://code.google.com/p/counterclockwise/issues/detail?id=429 ; and http://groups.google.com/group/clojure/browse_thread/thread/f54044da06b9939f (defonce ^{:private true :doc "An atom that temporarily holds the contents of files to be loaded."} file-contents (atom {})) (defn- load-large-file-code "A variant of `load-file-code` that returns an expression that will only work if evaluated within the same process where it was called. Here to work around the JVM method size limit so that (by default, for those tools using the load-file middleware) loading files of any size will work when the nREPL server is running remotely or locally." [file file-path file-name] ;; mini TTL impl so that any code orphaned by errors that occur ;; between here and the evaluation of the Compiler/load expression ;; below are cleaned up on subsequent loads (let [t (System/currentTimeMillis) file-key ^{:t t} [file-path (gensym)]] (swap! file-contents (fn [file-contents] (let [expired-keys (filter (comp #(and % (< 10000 (- (System/currentTimeMillis) %))) :t meta) (keys file-contents))] (assoc (apply dissoc file-contents expired-keys) file-key file)))) (binding [*print-length* nil *print-level* nil] (pr-str `(try (clojure.lang.Compiler/load (java.io.StringReader. (@@(var file-contents) '~file-key)) ~file-path ~file-name) (finally (swap! @(var file-contents) dissoc '~file-key))))))) (defn ^{:dynamic true} load-file-code "Given the contents of a file, its _source-path-relative_ path, and its filename, returns a string of code containing a single expression that, when evaluated, will load those contents with appropriate filename references and line numbers in metadata, etc. Note that because a single expression is produced, very large file loads will fail due to the JVM method size limitation. In such cases, see `load-large-file-code'`." [file file-path file-name] (apply format "(clojure.lang.Compiler/load (java.io.StringReader. %s) %s %s)" (map (fn [item] (binding [*print-length* nil *print-level* nil] (pr-str item))) [file file-path file-name]))) (defn wrap-load-file "Middleware that evaluates a file's contents, as per load-file, but with all data supplied in the sent message (i.e. safe for use with remote REPL environments). This middleware depends on the availability of an :op \"eval\" middleware below it (such as interruptible-eval)." [h] (fn [{:keys [op file file-name file-path ^Transport transport] :as msg}] (if (not= op "load-file") (h msg) (h (assoc (dissoc msg :file :file-name :file-path) :op "eval" :code ((if (thread-bound? #'load-file-code) load-file-code load-large-file-code) file file-path file-name) :transport (reify Transport (recv [this] (.recv transport)) (recv [this timeout] (.recv transport timeout)) (send [this resp] ;; *ns* is always 'user' after loading a file, so ;; *remove it to avoid confusing tools that assume any ;; *:ns always reports *ns* (.send transport (dissoc resp :ns)) this))))))) (set-descriptor! #'wrap-load-file {:requires #{#'caught/wrap-caught #'print/wrap-print} :expects #{"eval"} :handles {"load-file" {:doc "Loads a body of code, using supplied path and filename info to set source file and line number metadata. Delegates to underlying \"eval\" middleware/handler." :requires {"file" "Full contents of a file of code."} :optional (merge caught/wrap-caught-optional-arguments print/wrap-print-optional-arguments {"file-path" "Source-path-relative path of the source file, e.g. clojure/java/io.clj" "file-name" "Name of source file, e.g. io.clj"}) :returns (-> (meta #'eval/interruptible-eval) ::middleware/descriptor :handles (get "eval") :returns)}}}) nrepl-0.6.0/src/clojure/nrepl/middleware/print.clj000066400000000000000000000222121342636505500221620ustar00rootroot00000000000000(ns nrepl.middleware.print "Support for configurable printing. See the docstring of `wrap-print` and the Pretty Printing section of the Middleware documentation for more information." {:author "Michael Griffiths" :added "0.6.0"} (:refer-clojure :exclude [print]) (:require [nrepl.middleware :refer [set-descriptor!]] [nrepl.misc :as misc] [nrepl.transport :as transport]) (:import (java.io BufferedWriter PrintWriter StringWriter Writer) (nrepl QuotaExceeded) (nrepl.transport Transport))) ;; private in clojure.core (defn- pr-on [x w] (if *print-dup* (print-dup x w) (print-method x w)) nil) (def ^:dynamic *print-fn* "Function to use for printing. Takes two arguments: `value`, the value to print, and `writer`, the `java.io.PrintWriter` to print on. Defaults to the equivalent of `clojure.core/pr`." pr-on) (def ^:dynamic *stream?* "If logical true, the result of printing each value will be streamed to the client over one or more messages. Defaults to false." false) (def ^:dynamic *buffer-size* "The size of the buffer to use when streaming results. Defaults to 1024." 1024) (def ^:dynamic *quota* "A hard limit on the number of bytes printed for each value. Defaults to nil. No limit will be used if not set." nil) (def default-bindings {#'*print-fn* *print-fn* #'*stream?* *stream?* #'*buffer-size* *buffer-size* #'*quota* *quota*}) (defn- bound-configuration "Returns a map, suitable for merging into responses handled by this middleware, of the currently-bound dynamic vars used for configuration." [] {::print-fn *print-fn* ::stream? *stream?* ::buffer-size *buffer-size* ::quota *quota*}) (def configuration-keys [::print-fn ::stream? ::buffer-size ::quota ::keys]) (defn- to-char-array ^chars [x] (cond (string? x) (.toCharArray ^String x) (integer? x) (char-array [(char x)]) :else x)) (defn with-quota-writer "Returns a `java.io.Writer` that wraps `writer` and throws `QuotaExceeded` once it has written more than `quota` bytes." ^java.io.Writer [^Writer writer quota] (if-not quota writer (let [total (volatile! 0)] (proxy [Writer] [] (toString [] (.toString writer)) (write ([x] (let [cbuf (to-char-array x)] (.write ^Writer this cbuf (int 0) (count cbuf)))) ([x off len] (locking total (let [cbuf (to-char-array x) rem (- quota @total)] (vswap! total + len) (.write writer cbuf ^int off ^int (min len rem)) (when (neg? (- rem len)) (throw (QuotaExceeded.))))))) (flush [] (.flush writer)) (close [] (.close writer)))))) (defn replying-PrintWriter "Returns a `java.io.PrintWriter` suitable for binding as `*out*` or `*err*`. All of the content written to that `PrintWriter` will be sent as messages on the transport of `msg`, keyed by `key`." ^java.io.PrintWriter [key {:keys [transport] :as msg} {:keys [::buffer-size ::quota] :as opts}] (-> (proxy [Writer] [] (write ([x] (let [cbuf (to-char-array x)] (.write ^Writer this cbuf (int 0) (count cbuf)))) ([x off len] (let [cbuf (to-char-array x) text (str (doto (StringWriter.) (.write cbuf ^int off ^int len)))] (when (pos? (count text)) (transport/send transport (misc/response-for msg key text)))))) (flush []) (close [])) (BufferedWriter. (or buffer-size 1024)) (with-quota-writer quota) (PrintWriter. true))) (defn- send-streamed [{:keys [transport] :as msg} resp {:keys [::print-fn ::keys] :as opts}] (let [print-key (fn [key] (let [value (get resp key)] (try (with-open [writer (replying-PrintWriter key msg opts)] (print-fn value writer)) (catch QuotaExceeded _ (transport/send transport (misc/response-for msg :status ::truncated))))))] (run! print-key keys)) (transport/send transport (apply dissoc resp keys))) (defn- send-nonstreamed [{:keys [transport] :as msg} resp {:keys [::print-fn ::quota ::keys] :as opts}] (let [print-key (fn [key] (let [value (get resp key) writer (-> (StringWriter.) (with-quota-writer quota)) truncated? (volatile! false)] (try (print-fn value writer) (catch QuotaExceeded _ (vreset! truncated? true))) [key (str writer) @truncated?])) rf (completing (fn [resp [key printed-value truncated?]] (cond-> (assoc resp key printed-value) truncated? (update ::truncated-keys (fnil conj []) key)))) resp (transduce (map print-key) rf resp keys)] (transport/send transport (cond-> resp (::truncated-keys resp) (update :status conj ::truncated))))) (defn- printing-transport [{:keys [transport] :as msg} opts] (reify Transport (recv [this] (transport/recv transport)) (recv [this timeout] (transport/recv transport timeout)) (send [this resp] (let [{:keys [::stream?] :as opts} (-> (merge msg (bound-configuration) resp opts) (select-keys configuration-keys)) resp (apply dissoc resp configuration-keys)] (if stream? (send-streamed msg resp opts) (send-nonstreamed msg resp opts))) this))) (defn- resolve-print [{:keys [::print transport] :as msg}] (when-let [var-sym (some-> print (symbol))] (let [print-var (misc/requiring-resolve var-sym)] (when-not print-var (let [resp {:status ::error ::error (str "Couldn't resolve var " var-sym)}] (transport/send transport (misc/response-for msg resp)))) print-var))) (defn wrap-print "Middleware that provides printing functionality to other middlewares. Returns a handler which transforms any slots specified by `:nrepl.middleware.print/keys` in messages sent via the request's transport to strings using the provided printing function and options. Supports the following options: * `::print` – a fully-qualified symbol naming a var whose function to use for printing. Must point to a function with signature [value writer options]. * `::options` – a map of options to pass to the printing function. Defaults to `nil`. * `::print-fn` – the function to use for printing. In requests, will be resolved from the above two options (if provided). Defaults to the equivalent of `clojure.core/pr`. Must have signature [writer options]. * `::stream?` – if logical true, the result of printing each value will be streamed to the client over one or more messages. * `::buffer-size` – the size of the buffer to use when streaming results. Defaults to 1024. * `::quota` – a hard limit on the number of bytes printed for each value. * `::keys` – a seq of the keys in the response whose values should be printed. The options may be specified in either the request or the responses sent on its transport. If any options are specified in both, those in the request will be preferred." [handler] (fn [{:keys [::options] :as msg}] (let [print-var (resolve-print msg) print (fn [value writer] (if print-var (print-var value writer options) (pr-on value writer))) msg (assoc msg ::print-fn print) opts (cond-> (select-keys msg configuration-keys) ;; no print-fn provided in the request, so defer to the response (nil? print-var) (dissoc ::print-fn) ;; in bencode empty list is logical false (contains? msg ::stream?) (update ::stream? #(if (= [] %) false (boolean %))))] (handler (assoc msg :transport (printing-transport msg opts)))))) (set-descriptor! #'wrap-print {:requires #{} :expects #{} :handles {}}) (def wrap-print-optional-arguments {"nrepl.middleware.print/print" "A fully-qualified symbol naming a var whose function to use for printing. Must point to a function with signature [value writer options]." "nrepl.middleware.print/options" "A map of options to pass to the printing function. Defaults to `nil`." "nrepl.middleware.print/stream?" "If logical true, the result of printing each value will be streamed to the client over one or more messages." "nrepl.middleware.print/buffer-size" "The size of the buffer to use when streaming results. Defaults to 1024." "nrepl.middleware.print/quota" "A hard limit on the number of bytes printed for each value." "nrepl.middleware.print/keys" "A seq of the keys in the response whose values should be printed."}) nrepl-0.6.0/src/clojure/nrepl/middleware/session.clj000066400000000000000000000400211342636505500225070ustar00rootroot00000000000000(ns nrepl.middleware.session "Support for persistent, cross-connection REPL sessions." {:author "Chas Emerick"} (:require clojure.main [nrepl.middleware :refer [set-descriptor!]] [nrepl.middleware.interruptible-eval :refer [*msg* evaluate]] [nrepl.misc :refer [uuid response-for]] [nrepl.transport :as t]) (:import (clojure.lang Compiler$CompilerException LineNumberingPushbackReader) (java.io Reader) (java.util.concurrent.atomic AtomicLong) (java.util.concurrent BlockingQueue LinkedBlockingQueue SynchronousQueue Executor ExecutorService ThreadFactory ThreadPoolExecutor TimeUnit))) (def ^{:private true} sessions (atom {})) ;; TODO: the way this is currently, :out and :err will continue to be ;; associated with a particular *msg* (and session) even when produced from a future, ;; agent, etc. due to binding conveyance. This may or may not be desirable ;; depending upon the expectations of the client/user. I'm not sure at the moment ;; how best to make it configurable though... (def ^{:dynamic true :private true} *skipping-eol* false) (defn- configure-thread-factory "Returns a new ThreadFactory for the given session. This implementation generates daemon threads, with names that include the session id." [] (let [session-thread-counter (AtomicLong. 0) ;; Create a constant dcl for use across evaluations. This allows ;; modifications to the classloader to persist. cl (clojure.lang.DynamicClassLoader. (.getContextClassLoader (Thread/currentThread)))] (reify ThreadFactory (newThread [_ runnable] (doto (Thread. runnable (format "nREPL-worker-%s" (.getAndIncrement session-thread-counter))) (.setDaemon true) (.setContextClassLoader cl)))))) (defn- configure-executor "Returns a ThreadPoolExecutor, configured (by default) to have 1 core thread, use an unbounded queue, create only daemon threads, and allow unused threads to expire after 30s." [& {:keys [keep-alive queue thread-factory] :or {keep-alive 30000 queue (SynchronousQueue.)}}] (let [^ThreadFactory thread-factory (or thread-factory (configure-thread-factory))] (ThreadPoolExecutor. 1 Integer/MAX_VALUE (long 30000) TimeUnit/MILLISECONDS ^BlockingQueue queue thread-factory))) (def default-executor "Delay containing the default Executor." (delay (configure-executor))) (defn default-exec "Submits a task for execution using #'default-executor. The submitted task is made of: * an id (typically the message id), * thunk, a Runnable, the task itself, * ack, another Runnable, ran to notify of succesful execution of thunk. The thunk/ack split is meaningful for interruptible eval: only the thunk can be interrupted." [id ^Runnable thunk ^Runnable ack] (let [^Runnable f #(do (.run thunk) (.run ack))] (.submit ^ExecutorService @default-executor f))) (defn- session-in "Returns a LineNumberingPushbackReader suitable for binding to *in*. When something attempts to read from it, it will (if empty) send a {:status :need-input} message on the provided transport so the client/user can provide content to be read." [session-id transport] (let [input-queue (LinkedBlockingQueue.) request-input (fn [] (cond (> (.size input-queue) 0) (.take input-queue) *skipping-eol* nil :else (do (t/send transport (response-for *msg* :session session-id :status :need-input)) (.take input-queue)))) do-read (fn [buf off len] (locking input-queue (loop [i off] (cond (>= i (+ off len)) (+ off len) (.peek input-queue) (do (aset-char buf i (char (.take input-queue))) (recur (inc i))) :else i)))) reader (LineNumberingPushbackReader. (proxy [Reader] [] (close [] (.clear input-queue)) (read ([] (let [^Reader this this] (proxy-super read))) ([x] (let [^Reader this this] (if (instance? java.nio.CharBuffer x) (proxy-super read ^java.nio.CharBuffer x) (proxy-super read ^chars x)))) ([^chars buf off len] (if (zero? len) -1 (let [first-character (request-input)] (if (or (nil? first-character) (= first-character -1)) -1 (do (aset-char buf off (char first-character)) (- (do-read buf (inc off) (dec len)) off)))))))))] {:input-queue input-queue :stdin-reader reader})) (defn- create-session "Returns a new atom containing a map of bindings as per `clojure.core/get-thread-bindings`. *in* is obtained using `session-in`, *ns* defaults to 'user, and other bindings as optionally provided in `session` are merged in." ([{:keys [transport session out-limit] :as msg}] (let [id (uuid) {:keys [input-queue stdin-reader]} (session-in id transport) the-session (atom (into (or (some-> session deref) {}) {#'*in* stdin-reader #'*ns* (create-ns 'user)}) :meta {:id id :out-limit (or out-limit (:out-limit (meta session))) :stdin-reader stdin-reader :input-queue input-queue :exec default-exec}) msg {:code "" :session the-session}] ;; to fully initialize bindings (binding [*msg* msg] (evaluate msg)) the-session))) (defn interrupted? "Returns true if the given throwable was ultimately caused by an interrupt." [^Throwable e] (or (instance? ThreadDeath (clojure.main/root-cause e)) (and (instance? Compiler$CompilerException e) (instance? ThreadDeath (.getCause e))))) (defn session-exec "Takes a session id and returns a maps of three functions meant for interruptible-eval: * :exec, takes an id (typically a msg-id), a thunk and an ack runnables (see #'default-exec for ampler context). Executions are serialized and occurs on a single thread. * :interrupt, takes an id and tries to interrupt the matching execution (submitted with :exec above). A nil id is meant to match the currently running execution. The return value can be either: :idle (no running execution), the interrupted id, or nil when the running id doesn't match the id argument. Upon succesful interruption the backing thread is replaced. * :close, terminates the backing thread." [id] (let [cl (clojure.lang.DynamicClassLoader. (.getContextClassLoader (Thread/currentThread))) queue (LinkedBlockingQueue.) running (atom nil) thread (atom nil) main-loop #(let [[exec-id ^Runnable r ^Runnable ack] (.take queue)] (reset! running exec-id) (when (try (.run r) (compare-and-set! running exec-id nil) (finally (compare-and-set! running exec-id nil))) (some-> ack .run) (recur))) spawn-thread #(doto (Thread. main-loop (str "nRepl-session-" id)) (.setDaemon true) (.setContextClassLoader cl) .start)] (reset! thread (spawn-thread)) {:interrupt (fn [exec-id] ; nil means interrupt whatever is running ; returns :idle, interrupted id or nil (let [current @running] (cond (nil? current) :idle (and (or (nil? exec-id) (= current exec-id)) ; cas only checks identity, so check equality first (compare-and-set! running current nil)) (do (doto ^Thread @thread .interrupt .stop) (reset! thread (spawn-thread)) current)))) :close #(.interrupt ^Thread @thread) :exec (fn [exec-id r ack] (.put queue [exec-id r ack]))})) (defn- register-session "Registers a new session containing the baseline bindings contained in the given message's :session." [{:keys [session transport] :as msg}] (let [session (create-session msg) {:keys [id]} (meta session)] (alter-meta! session into (session-exec id)) (swap! sessions assoc id session) (t/send transport (response-for msg :status :done :new-session id)))) (defn- interrupt-session [{:keys [session interrupt-id transport] :as msg}] (let [{:keys [interrupt] session-id :id} (meta session) interrupted-id (when interrupt (interrupt interrupt-id))] (cond (nil? interrupt) (t/send transport (response-for msg :status #{:error :session-ephemeral :done})) (nil? interrupted-id) (t/send transport (response-for msg :status #{:error :interrupt-id-mismatch :done})) (= :idle interrupted-id) (t/send transport (response-for msg :status #{:session-idle :done})) :else (do (t/send transport {:status #{:interrupted :done} :id interrupted-id :session session-id}) (t/send transport (response-for msg :status #{:done})))))) (defn- close-session "Drops the session associated with the given message." [{:keys [session transport] :as msg}] (swap! sessions dissoc (-> session meta :id)) (t/send transport (response-for msg :status #{:done :session-closed}))) (defn session "Session middleware. Returns a handler which supports these :op-erations: * \"clone\", which will cause a new session to be retained. The ID of this new session will be returned in a response message in a :new-session slot. The new session's state (dynamic scope, etc) will be a copy of the state of the session identified in the :session slot of the request. * \"interrupt\", which will attempt to interrupt the current execution with id provided in the :interrupt-id slot. * \"close\", which drops the session indicated by the ID in the :session slot. The response message's :status will include :session-closed. * \"ls-sessions\", which results in a response message containing a list of the IDs of the currently-retained sessions in a :session slot. Messages indicating other operations are delegated to the given handler, with the session identified by the :session ID added to the message. If no :session ID is found, a new session is created (which will only persist for the duration of the handling of the given message). Requires the interruptible-eval middleware (specifically, its binding of *msg* to the currently-evaluated message so that session-specific *out* and *err* content can be associated with the originating message)." [h] (fn [{:keys [op session transport] :as msg}] (let [the-session (if session (@sessions session) (create-session msg))] (if-not the-session (t/send transport (response-for msg :status #{:error :unknown-session :done})) (let [msg (assoc msg :session the-session)] (case op "clone" (register-session msg) "interrupt" (interrupt-session msg) "close" (close-session msg) "ls-sessions" (t/send transport (response-for msg :status :done :sessions (or (keys @sessions) []))) (h msg))))))) (set-descriptor! #'session {:requires #{} :expects #{} :describe-fn (fn [{:keys [session] :as describe-msg}] (when (and session (instance? clojure.lang.Atom session)) {:current-ns (-> @session (get #'*ns*) str)})) :handles {"clone" {:doc "Clones the current session, returning the ID of the newly-created session." :requires {} :optional {"session" "The ID of the session to be cloned; if not provided, a new session with default bindings is created, and mapped to the returned session ID."} :returns {"new-session" "The ID of the new session."}} "interrupt" {:doc "Attempts to interrupt some executing request. When interruption succeeds, the thread used for execution is killed, and a new thread spawned for the session. While the session middleware ensures that Clojure dynamic bindings are preserved, other ThreadLocals are not. Hence, when running code intimately tied to the current thread identity, it is best to avoid interruptions." :requires {"session" "The ID of the session used to start the request to be interrupted."} :optional {"interrupt-id" "The opaque message ID sent with the request to be interrupted."} :returns {"status" "'interrupted' if a request was identified and interruption will be attempted 'session-idle' if the session is not currently executing any request 'interrupt-id-mismatch' if the session is currently executing a request sent using a different ID than specified by the \"interrupt-id\" value 'session-ephemeral' if the session is an ephemeral session"}} "close" {:doc "Closes the specified session." :requires {"session" "The ID of the session to be closed."} :optional {} :returns {}} "ls-sessions" {:doc "Lists the IDs of all active sessions." :requires {} :optional {} :returns {"sessions" "A list of all available session IDs."}}}}) (defn add-stdin "stdin middleware. Returns a handler that supports a \"stdin\" :op-eration, which adds content provided in a :stdin slot to the session's *in* Reader. Delegates to the given handler for other operations. Requires the session middleware." [h] (fn [{:keys [op stdin session transport] :as msg}] (cond (= op "eval") (let [in (-> (meta session) ^LineNumberingPushbackReader (:stdin-reader))] (binding [*skipping-eol* true] (clojure.main/skip-if-eol in)) (h msg)) (= op "stdin") (let [q (-> (meta session) ^LinkedBlockingQueue (:input-queue))] (if (empty? stdin) (.put q -1) (locking q (doseq [c stdin] (.put q c)))) (t/send transport (response-for msg :status :done))) :else (h msg)))) (set-descriptor! #'add-stdin {:requires #{#'session} :expects #{"eval"} :handles {"stdin" {:doc "Add content from the value of \"stdin\" to *in* in the current session." :requires {"stdin" "Content to add to *in*."} :optional {} :returns {"status" "A status of \"need-input\" will be sent if a session's *in* requires content in order to satisfy an attempted read operation."}}}}) nrepl-0.6.0/src/clojure/nrepl/misc.clj000066400000000000000000000044461342636505500176550ustar00rootroot00000000000000(ns nrepl.misc "Misc utilities used in nREPL's implementation (potentially also useful for anyone extending it)." {:author "Chas Emerick"} (:refer-clojure :exclude [requiring-resolve])) (defn log [ex & msgs] (let [ex (when (instance? Throwable ex) ex) msgs (if ex msgs (cons ex msgs))] (binding [*out* *err*] (apply println "ERROR:" msgs) (when ex (.printStackTrace ^Throwable ex))))) (defmacro returning "Executes `body`, returning `x`." [x & body] `(let [x# ~x] ~@body x#)) (defn uuid "Returns a new UUID string." [] (str (java.util.UUID/randomUUID))) (defn response-for "Returns a map containing the :session and :id from the \"request\" `msg` as well as all entries specified in `response-data`, which can be one or more maps (which will be merged), *or* key-value pairs. (response-for msg :status :done :value \"5\") (response-for msg {:status :interrupted}) The :session value in `msg` may be any Clojure reference type (to accommodate likely implementations of sessions) that has an :id slot in its metadata, or a string." [{:keys [session id]} & response-data] {:pre [(seq response-data)]} (let [{:keys [status] :as response} (if (map? (first response-data)) (reduce merge response-data) (apply hash-map response-data)) response (if (not status) response (assoc response :status (if (coll? status) status #{status}))) basis (merge (when id {:id id}) ;; AReference should make this suitable for any session implementation? (when session {:session (if (instance? clojure.lang.AReference session) (-> session meta :id) session)}))] (merge basis response))) (defn requiring-resolve "Resolves namespace-qualified sym per 'resolve'. If initial resolve fails, attempts to require sym's namespace and retries. Returns nil if sym could not be resolved." [sym] (or (resolve sym) (try (require (symbol (namespace sym))) (resolve sym) (catch Exception _)))) nrepl-0.6.0/src/clojure/nrepl/server.clj000077500000000000000000000131031342636505500202210ustar00rootroot00000000000000(ns nrepl.server "Default server implementations" {:author "Chas Emerick"} (:require [nrepl.ack :as ack] [nrepl.middleware :as middleware] nrepl.middleware.interruptible-eval nrepl.middleware.load-file nrepl.middleware.session [nrepl.misc :refer [log response-for returning]] [nrepl.transport :as t]) (:import [java.net InetAddress InetSocketAddress ServerSocket Socket SocketException])) (defn handle* [msg handler transport] (try (handler (assoc msg :transport transport)) (catch Throwable t (log t "Unhandled REPL handler exception processing message" msg)))) (defn handle "Handles requests received via [transport] using [handler]. Returns nil when [recv] returns nil for the given transport." [handler transport] (when-let [msg (t/recv transport)] (future (handle* msg handler transport)) (recur handler transport))) (defn- safe-close [^java.io.Closeable x] (try (.close x) (catch java.io.IOException e (log e "Failed to close " x)))) (defn- accept-connection [{:keys [^ServerSocket server-socket open-transports transport greeting handler] :as server}] (when-not (.isClosed server-socket) (let [sock (.accept server-socket)] (future (let [transport (transport sock)] (try (swap! open-transports conj transport) (when greeting (greeting transport)) (handle handler transport) (finally (swap! open-transports disj transport) (safe-close transport))))) (future (accept-connection server))))) (defn stop-server "Stops a server started via `start-server`." [{:keys [open-transports ^ServerSocket server-socket] :as server}] (returning server (.close server-socket) (swap! open-transports #(reduce (fn [s t] ;; should always be true for the socket server... (if (instance? java.io.Closeable t) (do (safe-close t) (disj s t)) s)) % %)))) (defn unknown-op "Sends an :unknown-op :error for the given message." [{:keys [op transport] :as msg}] (t/send transport (response-for msg :status #{:error :unknown-op :done} :op op))) (def default-middlewares [#'nrepl.middleware/wrap-describe #'nrepl.middleware.interruptible-eval/interruptible-eval #'nrepl.middleware.load-file/wrap-load-file #'nrepl.middleware.session/add-stdin #'nrepl.middleware.session/session]) (defn default-handler "A default handler supporting interruptible evaluation, stdin, sessions, and readable representations of evaluated expressions via `pr`. Additional middlewares to mix into the default stack may be provided; these should all be values (usually vars) that have an nREPL middleware descriptor in their metadata (see `nrepl.middleware/set-descriptor!`)." [& additional-middlewares] (let [stack (middleware/linearize-middleware-stack (concat default-middlewares additional-middlewares))] ((apply comp (reverse stack)) unknown-op))) (defrecord Server [server-socket port open-transports transport greeting handler] java.io.Closeable (close [this] (stop-server this))) (defn start-server "Starts a socket-based nREPL server. Configuration options include: * :port — defaults to 0, which autoselects an open port * :bind — bind address, by default \"127.0.0.1\" * :handler — the nREPL message handler to use for each incoming connection; defaults to the result of `(default-handler)` * :transport-fn — a function that, given a java.net.Socket corresponding to an incoming connection, will return a value satisfying the nrepl.Transport protocol for that Socket. * :ack-port — if specified, the port of an already-running server that will be connected to inform of the new server's port. Useful only by Clojure tooling implementations. * :greeting-fn - called after a client connects, receives a nrepl.transport/Transport. Usually, Clojure-aware client-side tooling would provide this greeting upon connecting to the server, but telnet et al. isn't that. See `nrepl.transport/tty-greeting` for an example of such a function. Returns a (record) handle to the server that is started, which may be stopped either via `stop-server`, (.close server), or automatically via `with-open`. The port that the server is open on is available in the :port slot of the server map (useful if the :port option is 0 or was left unspecified." [& {:keys [port bind transport-fn handler ack-port greeting-fn]}] (let [port (or port 0) addr (fn [^String bind ^Integer port] (InetSocketAddress. bind port)) transport-fn (or transport-fn t/bencode) ;; We fallback to 127.0.0.1 instead of to localhost to avoid ;; a dependency on the order of ipv4 and ipv6 records for ;; localhost in /etc/hosts bind (or bind "127.0.0.1") ss (doto (ServerSocket.) (.setReuseAddress true) (.bind (addr bind port))) server (Server. ss (.getLocalPort ss) (atom #{}) transport-fn greeting-fn (or handler (default-handler)))] (future (accept-connection server)) (when ack-port (ack/send-ack (:port server) ack-port transport-fn)) server)) nrepl-0.6.0/src/clojure/nrepl/transport.clj000066400000000000000000000160101342636505500207440ustar00rootroot00000000000000(ns nrepl.transport {:author "Chas Emerick"} (:refer-clojure :exclude [send]) (:require [clojure.java.io :as io] [clojure.walk :as walk] [nrepl.bencode :as bencode] [nrepl.misc :refer [uuid]] nrepl.version) (:import clojure.lang.RT [java.io EOFException PushbackInputStream PushbackReader] [java.net Socket SocketException] [java.util.concurrent BlockingQueue LinkedBlockingQueue SynchronousQueue TimeUnit])) (defprotocol Transport "Defines the interface for a wire protocol implementation for use with nREPL." (recv [this] [this timeout] "Reads and returns the next message received. Will block. Should return nil the a message is not available after `timeout` ms or if the underlying channel has been closed.") (send [this msg] "Sends msg. Implementations should return the transport.")) ;; adapted from clojure.walk to support namespaced keywords (defn- stringify-key [k] (cond (and (keyword? k) (namespace k)) (str (namespace k) "/" (name k)) (keyword? k) (name k) :else k)) (defn- stringify-keys [m] (let [f (fn [[k v]] [(stringify-key k) v])] (walk/postwalk (fn [x] (if (map? x) (into {} (map f x)) x)) m))) (deftype FnTransport [recv-fn send-fn close] Transport ;; TODO: this keywordization/stringification has no business being in FnTransport (send [this msg] (-> msg stringify-keys send-fn) this) (recv [this] (.recv this Long/MAX_VALUE)) (recv [this timeout] (walk/keywordize-keys (recv-fn timeout))) java.io.Closeable (close [this] (close))) (defn fn-transport "Returns a Transport implementation that delegates its functionality to the 2 or 3 functions provided." ([transport-read write] (fn-transport transport-read write nil)) ([transport-read write close] (let [read-queue (SynchronousQueue.) msg-pump (future (try (while true (.put read-queue (transport-read))) (catch Throwable t (.put read-queue t))))] (FnTransport. (let [failure (atom nil)] #(if @failure (throw @failure) (let [msg (.poll read-queue % TimeUnit/MILLISECONDS)] (if (instance? Throwable msg) (do (reset! failure msg) (throw msg)) msg)))) write (fn [] (close) (future-cancel msg-pump)))))) (defmulti #^{:private true} > input (into {} (map (fn [[k v]] [k ( "))) session-id (atom nil) read-msg #(let [code (read r)] (merge {:op "eval" :code [code] :ns @cns :id (str "eval" (uuid))} (when @session-id {:session @session-id}))) read-seq (atom (cons {:op "clone"} (repeatedly read-msg))) write (fn [{:strs [out err value status ns new-session id] :as msg}] (when new-session (reset! session-id new-session)) (when ns (reset! cns ns)) (doseq [^String x [out err value] :when x] (.write w x)) (when (and (= status #{:done}) id (.startsWith ^String id "eval")) (prompt true)) (.flush w)) read #(let [head (promise)] (swap! read-seq (fn [s] (deliver head (first s)) (rest s))) @head)] (fn-transport read write (when s (swap! read-seq (partial cons {:session @session-id :op "close"})) #(.close s)))))) (defn tty-greeting "A greeting fn usable with `nrepl.server/start-server`, meant to be used in conjunction with Transports returned by the `tty` function. Usually, Clojure-aware client-side tooling would provide this upon connecting to the server, but telnet et al. isn't that." [transport] (send transport {:out (str ";; nREPL " (:version-string nrepl.version/version) \newline ";; Clojure " (clojure-version) \newline "user=> ")})) (defmulti uri-scheme "Return the uri scheme associated with a transport var." identity) (defmethod uri-scheme #'bencode [_] "nrepl") (defmethod uri-scheme #'tty [_] "telnet") (defmethod uri-scheme :default [transport] (printf "WARNING: No uri scheme associated with transport %s\n" transport) "unknown") (deftype QueueTransport [^BlockingQueue in ^BlockingQueue out] nrepl.transport.Transport (send [this msg] (.put out msg) this) (recv [this] (.take in)) (recv [this timeout] (.poll in timeout TimeUnit/MILLISECONDS))) (defn piped-transports "Returns a pair of Transports that read from and write to each other." [] (let [a (LinkedBlockingQueue.) b (LinkedBlockingQueue.)] [(QueueTransport. a b) (QueueTransport. b a)])) nrepl-0.6.0/src/clojure/nrepl/version.clj000066400000000000000000000031551342636505500204030ustar00rootroot00000000000000(ns nrepl.version {:author "Colin Jones" :added "0.5.0"} (:import java.util.Properties)) (defn- map-from-property-filepath [file] (try (let [file-reader (.. (Thread/currentThread) (getContextClassLoader) (getResourceAsStream file)) props (Properties.)] (.load props file-reader) (into {} props)) (catch Exception e nil))) (defn- get-properties-filename [group artifact] (str "META-INF/maven/" group "/" artifact "/pom.properties")) (defn- get-version "Attempts to get the project version from system properties (set when running Leiningen), or a properties file based on the group and artifact ids (in jars built by Leiningen), or a default version passed in. Falls back to an empty string when no default is present." ([group artifact] (get-version group artifact "")) ([group artifact default-version] (or (System/getProperty (str artifact ".version")) (-> (get-properties-filename group artifact) map-from-property-filepath (get "version")) default-version))) (def ^{:private true} version-string "Current version of nREPL as a string. See also `version`." (get-version "nrepl" "nrepl")) (def version "Current version of nREPL. Map of :major, :minor, :incremental, :qualifier, and :version-string." (assoc (->> version-string (re-find #"(\d+)\.(\d+)\.(\d+)-?(.*)") rest (map #(try (Integer/parseInt %) (catch Exception e nil))) (zipmap [:major :minor :incremental :qualifier])) :version-string version-string)) nrepl-0.6.0/src/java/000077500000000000000000000000001342636505500143565ustar00rootroot00000000000000nrepl-0.6.0/src/java/nrepl/000077500000000000000000000000001342636505500154765ustar00rootroot00000000000000nrepl-0.6.0/src/java/nrepl/QuotaExceeded.java000066400000000000000000000001021342636505500210520ustar00rootroot00000000000000package nrepl; public class QuotaExceeded extends Throwable { } nrepl-0.6.0/src/java/nrepl/main.java000066400000000000000000000005531342636505500172700ustar00rootroot00000000000000package nrepl; import clojure.lang.RT; import clojure.lang.Symbol; import clojure.lang.Var; /** * @author Chas Emerick */ public class main { public static void main (String[] args) throws Exception { RT.var("clojure.core", "require").invoke(Symbol.intern("nrepl.cmdline")); RT.var("nrepl.cmdline", "-main").applyTo(RT.seq(args)); } } nrepl-0.6.0/src/maint/000077500000000000000000000000001342636505500145455ustar00rootroot00000000000000nrepl-0.6.0/src/maint/nrepl/000077500000000000000000000000001342636505500156655ustar00rootroot00000000000000nrepl-0.6.0/src/maint/nrepl/impl/000077500000000000000000000000001342636505500166265ustar00rootroot00000000000000nrepl-0.6.0/src/maint/nrepl/impl/docs.clj000066400000000000000000000117651342636505500202620ustar00rootroot00000000000000(ns nrepl.impl.docs "Doc generation utilities" (:require [clojure.tools.cli :as cli] [clojure.java.io :as io] [clojure.string :as string] [nrepl.core :as nrepl] [nrepl.server :as server] [nrepl.transport :as transport] [nrepl.version :as version]) (:import (java.io File))) (declare -main) (def cli-options [["-f" "--file FILE" "File to write output into (defaults to standard output)" :parse-fn #(File. %) :default *out*] ["-h" "--help" "Show this help message"] ["-o" "--output OUT" "One of: raw, adoc, md" :default "adoc" :validate [#(contains? #{"raw" "adoc" "md"} %)]]]) (defn- exit [status msg] (println msg) (System/exit status)) (defn- usage [options-summary] (->> [(:doc (meta #'-main)) "" "Usage: lein -m +maint run nrepl.impl.docs [options]" "" "Options:" options-summary] (string/join \newline))) (defn- error-msg [errors] (str "The following errors occurred while parsing your command:\n\n" (string/join \newline errors))) ;; oh, kill me now (defn- markdown-escape [^String s] (.replaceAll s "([*_])" "\\\\$1")) (defn- message-slot-markdown [msg-slot-docs] (apply str (for [[k v] msg-slot-docs] (format "* `%s` %s\n" (pr-str k) (markdown-escape v))))) (defn- describe-markdown "Given a message containing the response to a verbose :describe message, generates a markdown string conveying the information therein, suitable for use in e.g. wiki pages, github, etc." [{:keys [ops versions]}] (apply str "# Supported nREPL operations generated from a verbose 'describe' response (nREPL v" (:version-string version/version) ")\n\n## Operations" (for [[op {:keys [doc optional requires returns]}] (sort ops)] (str "\n\n### `" (pr-str op) "`\n\n" (markdown-escape doc) "\n\n" "###### Required parameters\n\n" (message-slot-markdown (sort requires)) "\n\n###### Optional parameters\n\n" (message-slot-markdown (sort optional)) "\n\n###### Returns\n\n" (message-slot-markdown (sort returns)))))) ;; because `` is expected to work, this only escapes certain characters. As opposed to using + to properly escape everything. (defn- adoc-escape [s] (-> s (string/replace #"\*(.+?)\*" "\\\\*$1*") (string/replace #"\_(.+?)\_" "\\\\_$1_") (string/escape {\` "``"}))) (defn- message-slot-adoc [msg-slot-docs] (if (seq msg-slot-docs) (apply str (for [[k v] msg-slot-docs] (format "* `%s` %s\n" (pr-str k) (adoc-escape v)))) "{blank}")) (defn- describe-adoc "Given a message containing the response to a verbose :describe message, generates a asciidoc string conveying the information therein, suitable for use in e.g. wiki pages, github, etc." [{:keys [ops versions]}] (apply str "= Supported nREPL operations\n\n" "[small]#generated from a verbose 'describe' response (nREPL v" (:version-string version/version) ")#\n\n== Operations" (for [[op {:keys [doc optional requires returns]}] (sort ops)] (str "\n\n=== `" (pr-str op) "`\n\n" (adoc-escape doc) "\n\n" "Required parameters::\n" (message-slot-adoc (sort requires)) "\n\nOptional parameters::\n" (message-slot-adoc (sort optional)) "\n\nReturns::\n" (message-slot-adoc (sort returns)) "\n")))) (defn- format-response [format resp] (cond (= format "raw") (pr-str (select-keys resp [:ops])) (= format "md") (str "\n" (describe-markdown resp)) (= format "adoc") (str "////\n" "This file is _generated_ by " #'-main "\n *Do not edit!*\n" "////\n" (describe-adoc resp)))) (defn generate-ops-info [] (let [[local remote] (transport/piped-transports) handler (server/default-handler) msg {:op "describe" :verbose? "true" :id "1"}] (handler (assoc msg :transport remote)) (-> (nrepl/response-seq local 500) first clojure.walk/keywordize-keys))) (defn -main "Regenerate and output the ops documentation to the specified destination in the specified format." [& args] (let [{:keys [options arguments errors summary]} (cli/parse-opts args cli-options)] (cond (:help options) (exit 0 (usage summary)) errors (exit 1 (error-msg errors)) :else (let [file (:file options) format (:output options) resp (generate-ops-info) docs (format-response format resp)] (if (= *out* file) (println docs) (do (spit file docs) (println (str "Regenerated " (.getAbsolutePath file))))))))) nrepl-0.6.0/test/000077500000000000000000000000001342636505500136255ustar00rootroot00000000000000nrepl-0.6.0/test/clojure/000077500000000000000000000000001342636505500152705ustar00rootroot00000000000000nrepl-0.6.0/test/clojure/nrepl/000077500000000000000000000000001342636505500164105ustar00rootroot00000000000000nrepl-0.6.0/test/clojure/nrepl/bencode_test.clj000066400000000000000000000150201342636505500215360ustar00rootroot00000000000000;; Copyright (c) Meikel Brandmeyer. All rights reserved. ;; The use and distribution terms for this software are covered by the ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) ;; which can be found in the file epl-v10.html at the root of this distribution. ;; By using this software in any fashion, you are agreeing to be bound by ;; the terms of this license. ;; You must not remove this notice, or any other, from this software. (ns nrepl.bencode-test (:require [clojure.test :refer [are deftest is]] [nrepl.bencode :as bencode :refer [read-bencode read-netstring write-bencode write-netstring]]) (:import clojure.lang.RT [java.io ByteArrayInputStream ByteArrayOutputStream PushbackInputStream])) (defn #^{:private true} >bytes [#^String input] (.getBytes input "UTF-8")) (defmulti #^{:private true} > input (map (fn [[k v]] [k ( bytes ByteArrayInputStream. PushbackInputStream. reader)) (defn- >input [^String input & args] (-> input (.getBytes "UTF-8") (#(apply decode % args)) input x :reader read-netstring) y) "0:," "" "13:Hello, World!," "Hello, World!" "16:Hällö, Würld!," "Hällö, Würld!" "25:Здравей, Свят!," "Здравей, Свят!")) (deftest test-string-reading (are [x y] (= (>input x :reader read-bencode) y) "0:" "" "13:Hello, World!" "Hello, World!" "16:Hällö, Würld!" "Hällö, Würld!" "25:Здравей, Свят!" "Здравей, Свят!")) (deftest test-integer-reading (are [x y] (= (>input x :reader read-bencode) y) "i0e" 0 "i42e" 42 "i-42e" -42)) (deftest test-list-reading (are [x y] (= (>input x :reader read-bencode) y) "le" [] "l6:cheesee" ["cheese"] "l6:cheese3:ham4:eggse" ["cheese" "ham" "eggs"])) (deftest test-map-reading (are [x y] (= (>input x :reader read-bencode) y) "de" {} "d3:ham4:eggse" {"ham" "eggs"})) (deftest test-nested-reading (are [x y] (= (>input x :reader read-bencode) y) "l6:cheesei42ed3:ham4:eggsee" ["cheese" 42 {"ham" "eggs"}] "d6:cheesei42e3:haml4:eggsee" {"cheese" 42 "ham" ["eggs"]})) (defn- >stream [thing & {:keys [writer]}] (doto (ByteArrayOutputStream.) (writer thing))) (defn- >output [& args] (.toString (apply >stream args) "UTF-8")) (deftest test-netstring-writing (are [x y] (= (>output (>bytes x) :writer write-netstring) y) "" "0:," "Hello, World!" "13:Hello, World!," "Hällö, Würld!" "16:Hällö, Würld!," "Здравей, Свят!" "25:Здравей, Свят!,")) (deftest test-byte-array-writing (are [x y] (= (>output (>bytes x) :writer write-bencode) y) "" "0:" "Hello, World!" "13:Hello, World!" "Hällö, Würld!" "16:Hällö, Würld!" "Здравей, Свят!" "25:Здравей, Свят!")) (deftest test-string-writing (are [x y] (= (>output x :writer write-bencode) y) "" "0:" "Hello, World!" "13:Hello, World!" "Hällö, Würld!" "16:Hällö, Würld!" "Здравей, Свят!" "25:Здравей, Свят!")) (deftest test-input-stream-writing (are [x y] (= (>output (ByteArrayInputStream. (>bytes x)) :writer write-bencode) y) "" "0:" "Hello, World!" "13:Hello, World!" "Hällö, Würld!" "16:Hällö, Würld!" "Здравей, Свят!" "25:Здравей, Свят!")) (deftest test-integer-writing (are [x y] (= (>output x :writer write-bencode) y) 0 "i0e" 42 "i42e" -42 "i-42e" ;; Works for all integral types. ;; Note: BigInts (42N) not tested, since they are not ;; supported in 1.2. (Byte/parseByte "42" 10) "i42e" (Short/parseShort "42" 10) "i42e" (Integer/parseInt "42" 10) "i42e" (Long/parseLong "42" 10) "i42e")) (deftest test-named-writing (are [x y] (= (>output x :writer write-bencode) y) :foo "3:foo" :foo/bar "7:foo/bar" 'foo "3:foo" 'foo/bar "7:foo/bar")) (deftest test-list-writing (are [x y] (= (>output x :writer write-bencode) y) nil "le" [] "le" ["cheese"] "l6:cheesee" ["cheese" "ham" "eggs"] "l6:cheese3:ham4:eggse")) (deftest test-map-writing (are [x y] (= (>output x :writer write-bencode) y) {} "de" {"ham" "eggs"} "d3:ham4:eggse")) (deftest test-nested-writing (are [x y] (= (>output x :writer write-bencode) y) ["cheese" 42 {"ham" "eggs"}] "l6:cheesei42ed3:ham4:eggsee" {"cheese" 42 "ham" ["eggs"]} "d6:cheesei42e3:haml4:eggsee")) (deftest test-lexicographic-sorting (let [source ["ham" "eggs" "hamburg" "hamburger" "cheese"] expected ["cheese" "eggs" "ham" "hamburg" "hamburger"] to-test (->> source (map >bytes) (sort @#'nrepl.bencode/lexicographically) (map > [-119 80 78 71 13 10 26 10 0 0 0 13 73 72 68 82 0 0 0 100 0 0 0 100 8 6 0 0 0 112 -30 -107 84 0 0 3 -16 105 67 67 80 73 67 67 32 80 114 111 102 105 108 101 0 0 40 -111 -115 85 -35 111 -37 84 20 63 -119 111 92 -92 22 63 -96 -79 -114 14 21 -117 -81 85 83 91 -71 27 26 -83 -58 6 73 -109 -91 -23 66 26 -71 -51 -40 42 -92 -55 117 110] (map byte) (into-array Byte/TYPE))] (is (= (seq binary-data) (-> {"data" binary-data} (>stream :writer write-bencode) .toByteArray (decode :reader read-bencode) (get "data") seq))))) nrepl-0.6.0/test/clojure/nrepl/cmdline_test.clj000066400000000000000000000140611342636505500215560ustar00rootroot00000000000000(ns nrepl.cmdline-test ^:test-refresh/focus {:author "Chas Emerick"} (:require [clojure.test :refer :all] [nrepl.ack :as ack] [nrepl.cmdline :as cmd] [nrepl.core :as nrepl] [nrepl.core-test :refer [*server* *transport-fn* transport-fns]] [nrepl.server :as server] [nrepl.transport :as transport]) (:import (com.hypirion.io Pipe ClosingPipe))) (defn- start-server-for-transport-fn [transport-fn f] (with-open [server (server/start-server :transport-fn transport-fn :handler (ack/handle-ack (server/default-handler)))] (binding [*server* server *transport-fn* transport-fn] (testing (str (-> transport-fn meta :name) " transport\n") (ack/reset-ack-port!) (f)) (set! *print-length* nil) (set! *print-level* nil)))) (defn- server-cmdline-fixture [f] (doseq [transport-fn transport-fns] (start-server-for-transport-fn transport-fn f))) (use-fixtures :each server-cmdline-fixture) (defn- var->str [sym] (subs (str sym) 2)) (defn- sh "A version of clojure.java.shell/sh that streams in/out/err. Taken and edited from https://github.com/technomancy/leiningen/blob/f7e1adad6ff5137d6ea56bc429c3b620c6f84128/leiningen-core/src/leiningen/core/eval.clj" [& cmd] (let [proc (.exec (Runtime/getRuntime) (into-array String cmd))] (.addShutdownHook (Runtime/getRuntime) (Thread. (fn [] (.destroy proc)))) (with-open [out (.getInputStream proc) err (.getErrorStream proc) in (.getOutputStream proc)] (let [pump-out (doto (Pipe. out System/out) .start) pump-err (doto (Pipe. err System/err) .start) pump-in (ClosingPipe. System/in in)] proc)))) (defmacro with-err-str "Evaluates exprs in a context in which *err* is bound to a fresh StringWriter. Returns the string created by any nested printing calls." [& body] `(let [s# (new java.io.StringWriter)] (binding [*err* s#] ~@body (str s#)))) (deftest repl-intro (is (re-find #"nREPL" (cmd/repl-intro)))) (deftest help (is (re-find #"Usage:" (cmd/help)))) (deftest parse-cli-values (is (= {:other "string" :middleware :middleware :handler :handler :transport :transport} (cmd/parse-cli-values {:other "string" :middleware ":middleware" :handler ":handler" :transport ":transport"})))) (deftest args->cli-options (is (= [{:middleware :middleware :repl "true"} ["extra" "args"]] (cmd/args->cli-options ["-m" ":middleware" "-r" "true" "extra" "args"])))) (deftest connection-opts (is (= {:port 5000 :host "0.0.0.0" :transport #'transport/bencode :repl-fn #'nrepl.cmdline/run-repl} (cmd/connection-opts {:port "5000" :host "0.0.0.0" :transport nil})))) (deftest server-opts (is (= {:bind "0.0.0.0" :port 5000 :transport #'transport/bencode :handler #'clojure.core/identity :repl-fn #'clojure.core/identity :greeting nil :ack-port 2000} (select-keys (cmd/server-opts {:bind "0.0.0.0" :port 5000 :ack 2000 :handler 'clojure.core/identity :repl-fn 'clojure.core/identity}) [:bind :port :transport :greeting :handler :ack-port :repl-fn])))) (deftest ack-server (with-redefs [ack/send-ack (fn [_ _ _] true)] (let [output (with-err-str (cmd/ack-server {:port 6000} {:ack-port 8000 :transport #'transport/bencode}))] (is (= "ack'ing my port 6000 to other server running on port 8000 true\n" output))))) (deftest server-started-message (with-open [server (server/start-server :transport-fn #'transport/bencode :handler server/default-handler)] (is (re-find #"nREPL server started on port \d+ on host .* - .*//.*:\d+" (cmd/server-started-message server {:transport #'transport/bencode}))))) (deftest ack (let [ack-port (:port *server*) server-process (apply sh ["java" "-Dnreplacktest=y" "-cp" (System/getProperty "java.class.path") "nrepl.main" "--ack" (str ack-port) "--transport" (var->str *transport-fn*)]) acked-port (ack/wait-for-ack 10000)] (try (is acked-port "Timed out waiting for ack") (when acked-port (with-open [transport-2 (nrepl/connect :port acked-port :transport-fn *transport-fn*)] (let [client (nrepl/client transport-2 1000)] ;; just a sanity check (is (= "y" (-> (nrepl/message client {:op :eval :code "(System/getProperty \"nreplacktest\")"}) first nrepl/read-response-value :value)))))) (finally (.destroy server-process))))) (deftest explicit-port-argument (let [ack-port (:port *server*) free-port (with-open [ss (java.net.ServerSocket.)] (.bind ss nil) (.getLocalPort ss)) server-process (apply sh ["java" "-Dnreplacktest=y" "-cp" (System/getProperty "java.class.path") "nrepl.main" "--port" (str free-port) "--ack" (str ack-port) "--transport" (var->str *transport-fn*)]) acked-port (ack/wait-for-ack 10000)] (try (is (= acked-port free-port)) (finally (Thread/sleep 2000) (.destroy server-process))))) nrepl-0.6.0/test/clojure/nrepl/core_test.clj000066400000000000000000001276421342636505500211050ustar00rootroot00000000000000(ns nrepl.core-test (:require [clojure.main] [clojure.set :as set] [clojure.test :refer [are deftest is testing use-fixtures]] [nrepl.core :as nrepl :refer [client client-session code combine-responses connect message new-session read-response-value response-seq response-values url-connect]] [nrepl.ack :as ack] [nrepl.middleware.caught :as middleware.caught] [nrepl.middleware.print :as middleware.print] [nrepl.server :as server] [nrepl.transport :as transport]) (:import (java.io File Writer) java.net.SocketException)) (defmacro when-require [n & body] (let [nn (eval n)] (try (require nn) (catch Throwable e nil)) (when (find-ns nn) `(do ~@body)))) (def transport-fn->protocol "Add your transport-fn var here so it can be tested" {#'transport/bencode "nrepl"}) ;; There is a profile that adds the fastlane dependency and test ;; its transports. (when-require 'fastlane.core (def transport-fn->protocol (merge transport-fn->protocol {(find-var 'fastlane.core/transit+msgpack) "transit+msgpack" (find-var 'fastlane.core/transit+json) "transit+json" (find-var 'fastlane.core/transit+json-verbose) "transit+json-verbose"}))) (def project-base-dir (File. (System/getProperty "nrepl.basedir" "."))) (def ^{:dynamic true} *server* nil) (def ^{:dynamic true} *transport-fn* nil) (defn start-server-for-transport-fn [transport-fn f] (with-open [server (server/start-server :transport-fn transport-fn)] (binding [*server* server *transport-fn* transport-fn] (testing (str (-> transport-fn meta :name) " transport\n") (f)) (set! *print-length* nil) (set! *print-level* nil)))) (def transport-fns (keys transport-fn->protocol)) (defn repl-server-fixture [f] (doseq [transport-fn transport-fns] (start-server-for-transport-fn transport-fn f))) (use-fixtures :each repl-server-fixture) (defmacro def-repl-test [name & body] `(deftest ~(with-meta name (merge {:private true} (meta name))) (with-open [transport# (connect :port (:port *server*) :transport-fn *transport-fn*)] (let [~'transport transport# ~'client (client transport# Long/MAX_VALUE) ~'session (client-session ~'client) ~'timeout-client (client transport# 1000) ~'timeout-session (client-session ~'timeout-client) ~'repl-eval #(message % {:op :eval :code %2}) ~'repl-values (comp response-values ~'repl-eval)] ~@body)))) (def-repl-test eval-literals (are [literal] (= (binding [*ns* (find-ns 'user)] ; needed for the ::keyword (-> literal read-string eval list)) (repl-values client literal)) "5" "0xff" "5.1" "-2e12" "1/4" "'symbol" "'namespace/symbol" ":keyword" "::local-ns-keyword" ":other.ns/keyword" "\"string\"" "\"string\\nwith\\r\\nlinebreaks\"" "'(1 2 3)" "[1 2 3]" "{1 2 3 4}" "#{1 2 3 4}") (is (= (->> "#\"regex\"" read-string eval list (map str)) (->> "#\"regex\"" (repl-values client) (map str))))) (def-repl-test simple-expressions (are [expr] (= [(eval expr)] (repl-values client (pr-str expr))) '(range 40) '(apply + (range 100)))) (def-repl-test defining-fns (repl-values client "(defn x [] 6)") (is (= [6] (repl-values client "(x)")))) (defn- dumb-alternative-eval [form] (let [result (eval form)] (if (number? result) (- result) result))) (def-repl-test use-alternative-eval-fn (is (= {:value ["-124750"]} (-> (message timeout-client {:op :eval :eval "nrepl.core-test/dumb-alternative-eval" :code "(reduce + (range 500))"}) combine-responses (select-keys [:value]))))) (def-repl-test source-tracking-eval (let [sym (name (gensym)) request {:op :eval :ns "user" :code (format "(def %s 1000)" sym) :file "test.clj" :line 42 :column 10} _ (doall (message timeout-client request)) meta (meta (resolve (symbol "user" sym)))] (is (= (:file meta) "test.clj")) (is (= (:line meta) 42)) (is (= (:column meta) 10)))) (def-repl-test no-code (is (= {:status #{"error" "no-code" "done"}} (-> (message timeout-client {:op "eval"}) combine-responses (select-keys [:status]))))) (def-repl-test unknown-op (is (= {:op "abc" :status #{"error" "unknown-op" "done"}} (-> (message timeout-client {:op :abc}) combine-responses (select-keys [:op :status]))))) (def-repl-test session-lifecycle (is (= #{"error" "unknown-session" "done"} (-> (message timeout-client {:session "abc"}) combine-responses :status))) (let [session-id (new-session timeout-client) session-alive? #(contains? (-> (message timeout-client {:op :ls-sessions}) combine-responses :sessions set) session-id)] (is session-id) (is (session-alive?)) (is (= #{"done" "session-closed"} (-> (message timeout-client {:op :close :session session-id}) combine-responses :status))) (is (not (session-alive?))))) (def-repl-test separate-value-from-*out* (is (= {:value [nil] :out "5\n"} (-> (map read-response-value (repl-eval client "(println 5)")) combine-responses (select-keys [:value :out]))))) (def-repl-test sessionless-*out* (is (= "5\n:foo\n" (-> (repl-eval client "(println 5)(println :foo)") combine-responses :out)))) (def-repl-test session-*out* (is (= "5\n:foo\n" (-> (repl-eval session "(println 5)(println :foo)") combine-responses :out)))) (def-repl-test error-on-lazy-seq-with-side-effects (let [expression '(let [foo (fn [] (map (fn [x] (println x) (throw (Exception. "oops"))) [1 2 3]))] (foo)) results (-> (repl-eval session (pr-str expression)) combine-responses)] (is (= "1\n" (:out results))) (is (re-seq #"oops" (:err results))))) (def-repl-test cross-transport-*out* (let [sid (-> session meta ::nrepl/taking-until :session)] (with-open [transport2 (nrepl.core/connect :port (:port *server*) :transport-fn *transport-fn*)] (transport/send transport2 {"op" "eval" "code" "(println :foo)" "session" sid}) (is (= [{:out ":foo\n"} {:ns "user" :value "nil"} {:status ["done"]}] (->> (repeatedly #(transport/recv transport2 100)) (into [] (comp (take-while identity) (map #(dissoc % :session)))))))))) (def-repl-test streaming-out (is (= (for [x (range 10)] (str x \newline)) (->> (repl-eval client "(dotimes [x 10] (println x))") (map :out) (remove nil?))))) (def-repl-test session-*out*-writer-length-translation (is (= "#inst \"2013-02-11T12:13:44.000+00:00\"\n" (-> (repl-eval session (code (println (doto (java.util.GregorianCalendar. 2013 1 11 12 13 44) (.setTimeZone (java.util.TimeZone/getTimeZone "GMT")))))) combine-responses :out)))) (def-repl-test streaming-out-without-explicit-flushing (is (= ["(0 1 " "2 3 4" " 5 6 " "7 8 9" " 10)"] ;; new session (->> (message client {:op :eval :out-limit 5 :code "(print (range 11))"}) (map :out) (remove nil?)) ;; existing session (->> (message session {:op :eval :out-limit 5 :code "(print (range 11))"}) (map :out) (remove nil?))))) (def-repl-test ensure-whitespace-prints (is (= " \t \n \f \n" (->> (repl-eval client "(println \" \t \n \f \")") combine-responses :out)))) (defn custom-printer [value ^Writer writer opts] (.write writer (format "" value (or (:sub opts) "...")))) (def-repl-test value-printing (testing "bad symbol should fall back to default printer" (is (= [{::middleware.print/error "Couldn't resolve var my.missing.ns/printer" :status ["nrepl.middleware.print/error"]} {:ns "user" :value "42"} {:status ["done"]}] (->> (message client {:op :eval :code "(+ 34 8)" ::middleware.print/print "my.missing.ns/printer"}) (mapv #(dissoc % :id :session)))))) (testing "custom printing function symbol should be used" (is (= [""] (-> (message client {:op :eval :code "true" ::middleware.print/print `custom-printer}) (combine-responses) (:value))))) (testing "empty print options are ignored" (is (= [""] (-> (message client {:op :eval :code "42" ::middleware.print/print `custom-printer ::middleware.print/options {}}) (combine-responses) (:value))))) (testing "options should be passed to printer" (is (= [""] (-> (message client {:op :eval :code "3" ::middleware.print/print `custom-printer ::middleware.print/options {:sub "bar"}}) (combine-responses) (:value)))))) (def-repl-test override-value-printing (testing "custom ::print/keys" (is (= [{:ns "user" :value [1 2 3 4 5]} {:status ["done"]}] (->> (message session {:op :eval :code "[1 2 3 4 5]" ::middleware.print/keys []}) (mapv #(dissoc % :id :session))))))) (def-repl-test streamed-printing (testing "value response arrives before ns response" (let [responses (->> (message client {:op :eval :code (code (range 10)) ::middleware.print/stream? 1}) (mapv #(dissoc % :id :session)))] (is (= [{:value "(0 1 2 3 4 5 6 7 8 9)"} {:ns "user"} {:status ["done"]}] responses)))) (testing "multiple forms" (let [responses (->> (message client {:op :eval :code (code (range 10) (range 10)) ::middleware.print/stream? 1}) (mapv #(dissoc % :id :session)))] (is (= [{:value "(0 1 2 3 4 5 6 7 8 9)"} {:ns "user"} {:value "(0 1 2 3 4 5 6 7 8 9)"} {:ns "user"} {:status ["done"]}] responses)))) (testing "*out* still handled correctly" (let [responses (->> (message client {:op :eval :code (code (->> (range 2) (map println))) ::middleware.print/stream? 1}) (mapv #(dissoc % :id :session)))] (is (= [{:out "0\n"} {:out "1\n"} {:value "(nil nil)"} {:ns "user"} {:status ["done"]}] responses)))) (testing "large output should be streamed" (let [[resp1 resp2 resp3 resp4] (->> (message client {:op :eval :code (code (range 512)) ::middleware.print/stream? 1}) (mapv #(dissoc % :id :session)))] (is (.startsWith (:value resp1) "(0 1 2 3")) (is (= {} (dissoc resp1 :value))) (is (.endsWith (:value resp2) "510 511)")) (is (= {} (dissoc resp2 :value))) (is (= {:ns "user"} resp3)) (is (= {:status ["done"]} resp4)))) (testing "interruptible" (let [eval-responses (->> (message session {:op :eval :code (code (range)) ::middleware.print/stream? 1}) (map #(dissoc % :id :session))) _ (Thread/sleep 100) interrupt-responses (->> (message session {:op :interrupt}) (mapv #(dissoc % :id :session)))] ;; check the interrupt succeeded first; otherwise eval-responses will not terminate (is (= [{:status ["done"]}] interrupt-responses)) (is (.startsWith (:value (first eval-responses)) "(0 1 2 3")) (is (= {:status ["done" "interrupted"]} (last eval-responses))))) (testing "respects buffer-size option" (is (= [{:value "(0 1 2 3"} {:value " 4 5 6 7"} {:value " 8 9 10 "} {:value "11 12 13"} {:value " 14 15)"} {:ns "user"} {:status ["done"]}] (->> (message client {:op :eval :code (code (range 16)) ::middleware.print/stream? 1 ::middleware.print/buffer-size 8}) (mapv #(dissoc % :id :session)))))) (testing "works with custom printer" (let [[resp1 resp2 resp3 resp4] (->> (message client {:op :eval :code (code (range 512)) ::middleware.print/stream? 1 ::middleware.print/print `custom-printer}) (mapv #(dissoc % :id :session)))] (is (.startsWith (:value resp1) "")) (is (= {} (dissoc resp2 :value))) (is (= {:ns "user"} resp3)) (is (= {:status ["done"]} resp4)))) (testing "works with custom printer and print-options" (let [[resp1 resp2 resp3 resp4] (->> (message client {:op :eval :code (code (range 512)) ::middleware.print/stream? 1 ::middleware.print/print `custom-printer ::middleware.print/options {:sub "bar"}}) (mapv #(dissoc % :id :session)))] (is (.startsWith (:value resp1) "")) (is (= {} (dissoc resp2 :value))) (is (= {:ns "user"} resp3)) (is (= {:status ["done"]} resp4))))) (def-repl-test print-quota (testing "quota option respected" (is (= [{:ns "user" :value "(0 1 2 3" :status ["nrepl.middleware.print/truncated"] ::middleware.print/truncated-keys ["value"]} {:status ["done"]}] (->> (message client {:op :eval :code (code (range 512)) ::middleware.print/quota 8}) (mapv #(dissoc % :id :session)))))) (testing "works with streamed printing" (is (= [{:value "(0 1 2 3"} {:status ["nrepl.middleware.print/truncated"]} {:ns "user"} {:status ["done"]}] (->> (message client {:op :eval :code (code (range 512)) ::middleware.print/stream? 1 ::middleware.print/quota 8}) (mapv #(dissoc % :id :session)))))) (testing "works with custom printer" (is (= [{:ns "user" :value "> (message client {:op :eval :code (code (range 512)) ::middleware.print/print `custom-printer ::middleware.print/quota 8}) (mapv #(dissoc % :id :session)))))) (testing "works with custom printer and streamed printing" (is (= [{:value "> (message client {:op :eval :code (code (range 512)) ::middleware.print/print `custom-printer ::middleware.print/stream? 1 ::middleware.print/quota 8}) (mapv #(dissoc % :id :session))))))) (defn custom-session-printer [value ^Writer writer] (.write writer (format "" value))) (def-repl-test session-print-configuration (testing "setting *print-fn* works" (is (= [{:ns "user" :value ""} {:status ["done"]}] (->> (message session {:op :eval :code (code (set! nrepl.middleware.print/*print-fn* (resolve `custom-session-printer)))}) (mapv #(dissoc % :id :session))))) (is (= [{:ns "user" :value ""} {:status ["done"]}] (->> (message session {:op :eval :code (code (range 10))}) (mapv #(dissoc % :id :session)))))) (testing "request can still override *print-fn*" (is (= [{:ns "user" :value ""} {:status ["done"]}] (->> (message session {:op :eval :code (code (range 10)) ::middleware.print/print `custom-printer}) (mapv #(dissoc % :id :session)))))) (testing "setting stream options works" (is (= [{:value ""} {:ns "user"} {:value ""} {:ns "user"} {:status ["done"]}] (->> (message session {:op :eval :code (code (set! nrepl.middleware.print/*stream?* true) (set! nrepl.middleware.print/*buffer-size* 8))}) (mapv #(dissoc % :id :session))))) (is (= [{:value ""} {:ns "user"} {:status ["done"]}] (->> (message session {:op :eval :code (code (range 10))}) (mapv #(dissoc % :id :session)))))) (testing "request can still override stream options" (is (= [{:ns "user" :value ""} {:status ["done"]}] (->> (message session {:op :eval :code (code (range 10)) ::middleware.print/stream? nil}) (mapv #(dissoc % :id :session))))) (is (= [{:value ""} {:ns "user"} {:status ["done"]}] (->> (message session {:op :eval :code (code (range 10)) ::middleware.print/buffer-size 16}) (mapv #(dissoc % :id :session)))))) (testing "setting *quota* works" (is (= [{:value ""} {:ns "user"} {:status ["done"]}] (->> (message session {:op :eval :code (code (set! nrepl.middleware.print/*quota* 8))}) (mapv #(dissoc % :id :session))))) (is (= [{:value "> (message session {:op :eval :code (code (range 512))}) (mapv #(dissoc % :id :session)))))) (testing "request can still override *quota*" (is (= [{:value "> (message session {:op :eval :code (code (range 512)) ::middleware.print/quota 16}) (mapv #(dissoc % :id :session))))))) (def-repl-test session-return-recall (testing "sessions persist across connections" (dorun (repl-values session (code (apply + (range 6)) (str 12 \c) (keyword "hello")))) (with-open [separate-connection (connect :port (:port *server*) :transport-fn *transport-fn*)] (let [history [[15 "12c" :hello]] sid (-> session meta :nrepl.core/taking-until :session) sc-session (-> separate-connection (nrepl/client 1000) (nrepl/client-session :session sid))] (is (= history (repl-values sc-session "[*3 *2 *1]"))) (is (= history (repl-values sc-session "*1")))))) (testing "without a session id, REPL-bound vars like *1 have default values" (is (= [nil] (repl-values client "*1"))))) (def-repl-test session-set! (dorun (repl-eval session (code (set! *compile-path* "badpath") (set! *warn-on-reflection* true)))) (is (= [["badpath" true]] (repl-values session (code [*compile-path* *warn-on-reflection*]))))) (def-repl-test exceptions (let [{:keys [status err value]} (combine-responses (repl-eval session "(throw (Exception. \"bad, bad code\"))"))] (is (= #{"eval-error" "done"} status)) (is (nil? value)) (is (.contains err "bad, bad code")) (is (= [true] (repl-values session "(.contains (str *e) \"bad, bad code\")"))))) (def-repl-test multiple-expressions-return (is (= [5 18] (repl-values session "5 (/ 5 0) (+ 5 6 7)")))) (def-repl-test return-on-incomplete-expr (let [{:keys [out status value]} (combine-responses (repl-eval session "(missing paren"))] (is (nil? value)) (is (= #{"done" "eval-error"} status)) (is (re-seq #"EOF while reading" (first (repl-values session "(-> *e Throwable->map :cause)")))))) (def-repl-test switch-ns (is (= "otherns" (-> (repl-eval session "(ns otherns) (defn function [] 12)") combine-responses :ns))) (is (= [12] (repl-values session "(function)"))) (repl-eval session "(in-ns 'user)") (is (= [12] (repl-values session "(otherns/function)")))) (def-repl-test switch-ns-2 (is (= "otherns" (-> (repl-eval session (code (ns otherns) (defn function [] 12))) combine-responses :ns))) (is (= [12] (repl-values session "(function)"))) (repl-eval session "(in-ns 'user)") (is (= [12] (repl-values session "(otherns/function)"))) (is (= "user" (-> (repl-eval session "nil") combine-responses :ns)))) (def-repl-test explicit-ns (is (= "user" (-> (repl-eval session "nil") combine-responses :ns))) (is (= "baz" (-> (repl-eval session (code (def bar 5) (ns baz))) combine-responses :ns))) (is (= [5] (response-values (message session {:op :eval :code "bar" :ns "user"})))) ;; NREPL-72: :ns argument to eval shouldn't affect *ns* outside of the scope of that evaluation (is (= "baz" (-> (repl-eval session "5") combine-responses :ns)))) (def-repl-test error-on-nonexistent-ns (is (= #{"error" "namespace-not-found" "done"} (-> (message timeout-client {:op :eval :code "(+ 1 1)" :ns (name (gensym))}) combine-responses :status)))) (def-repl-test proper-response-ordering (is (= [[nil "100\n"] ; printed number ["nil" nil] ; return val from println ["42" nil] ; return val from `42` [nil nil]] ; :done (map (juxt :value :out) (repl-eval client "(println 100) 42"))))) (def-repl-test interrupt (testing "ephemeral session" (is (= #{"error" "session-ephemeral" "done"} (set (:status (first (message client {:op :interrupt})))) (set (:status (first (message client {:op :interrupt :interrupt-id "foo"}))))))) (testing "registered session" (is (= #{"done" "session-idle"} (set (:status (first (message session {:op :interrupt})))) (set (:status (first (message session {:op :interrupt :interrupt-id "foo"})))))) (let [resp (message session {:op :eval :code (code (do (def halted? true) halted? (Thread/sleep 30000) (def halted? false)))})] (Thread/sleep 100) (is (= #{"done" "error" "interrupt-id-mismatch"} (set (:status (first (message session {:op :interrupt :interrupt-id "foo"})))))) (is (= #{"done"} (-> session (message {:op :interrupt}) first :status set))) (is (= #{} (reduce disj #{"done" "interrupted"} (-> resp combine-responses :status)))) (is (= [true] (repl-values session "halted?")))))) ;; NREPL-66: ensure that bindings of implementation vars aren't captured by user sessions ;; (https://github.com/clojure-emacs/cider/issues/785) (def-repl-test ensure-no-*msg*-capture (let [[r1 r2 :as results] (repeatedly 2 #(repl-eval session "(println :foo)")) [ids ids2] (map #(set (map :id %)) results) [out1 out2] (map #(-> % combine-responses :out) results)] (is (empty? (clojure.set/intersection ids ids2))) (is (= ":foo\n" out1 out2)))) (def-repl-test read-timeout (is (nil? (repl-values timeout-session "(Thread/sleep 1100) :ok"))) ;; just getting the values off of the wire so the server side doesn't ;; toss a spurious stack trace when the client disconnects (is (= [nil :ok] (->> (repeatedly #(transport/recv transport 500)) (take-while (complement nil?)) response-values)))) (def-repl-test concurrent-message-handling (testing "multiple messages can be handled on the same connection concurrently" (let [sessions (doall (repeatedly 3 #(client-session client))) start-time (System/currentTimeMillis) elapsed-times (map (fn [session eval-duration] (let [expr (pr-str `(Thread/sleep ~eval-duration)) responses (message session {:op :eval :code expr})] (future (is (= [nil] (response-values responses))) (- (System/currentTimeMillis) start-time)))) sessions [2000 1000 0])] (is (apply > (map deref (doall elapsed-times))))))) (def-repl-test ensure-transport-closeable (is (= [5] (repl-values session "5"))) (is (instance? java.io.Closeable transport)) (.close transport) (is (thrown? java.net.SocketException (repl-values session "5")))) ;; test is flaking on hudson, but passing locally! :-X (def-repl-test ensure-server-closeable (.close *server*) (Thread/sleep 100) (is (thrown? java.net.ConnectException (connect :port (:port *server*))))) ;; wasn't added until Clojure 1.3.0 (defn- root-cause "Returns the initial cause of an exception or error by peeling off all of its wrappers" [^Throwable t] (loop [cause t] (if-let [cause (.getCause cause)] (recur cause) cause))) (defn- disconnection-exception? [e] ;; thrown? should check for the root cause! (and (instance? SocketException (root-cause e)) (re-matches #".*(lost.*connection|socket closed).*" (.getMessage (root-cause e))))) (deftest transports-fail-on-disconnects (testing "Ensure that transports fail ASAP when the server they're connected to goes down." (let [server (server/start-server :transport-fn *transport-fn*) transport (connect :port (:port server) :transport-fn *transport-fn*)] (transport/send transport {"op" "eval" "code" "(+ 1 1)"}) (let [reader (future (while true (transport/recv transport)))] (Thread/sleep 100) (.close server) (Thread/sleep 100) (try (deref reader 1000 :timeout) (assert false "A reader started prior to the server closing should throw an error...") (catch Throwable e (is (disconnection-exception? e))))) (is (thrown? SocketException (transport/recv transport))) ;; The next `Thread/sleep` is needed or the test would be fleaky ;; for some transports that don't throw an exception the first time ;; a message is sent after the server is closed. (try (transport/send transport {"op" "eval" "code" "(+ 5 1)"}) (catch Throwable t)) (Thread/sleep 100) (is (thrown? SocketException (transport/send transport {"op" "eval" "code" "(+ 5 1)"})))))) (deftest server-starts-with-minimal-configuration (testing "Ensure server starts with minimal configuration" (let [server (server/start-server) transport (connect :port (:port server)) client (client transport Long/MAX_VALUE)] (is (= ["3"] (-> (message client {:op :eval :code "(- 4 1)"}) combine-responses :value)))))) (def-repl-test clients-fail-on-disconnects (testing "Ensure that clients fail ASAP when the server they're connected to goes down." (let [resp (repl-eval client "1 2 3 4 5 6 7 8 9 10")] (is (= "1" (-> resp first :value))) (Thread/sleep 1000) (.close *server*) (Thread/sleep 1000) (try ;; these responses were on the wire before the remote transport was closed (is (> 20 (count resp))) (transport/recv transport) (assert false "reads after the server is closed should fail") (catch Throwable t (is (disconnection-exception? t))))) ;; TODO: as noted in transports-fail-on-disconnects, *sometimes* two sends are needed ;; to trigger an exception on send to an unavailable server (try (repl-eval session "(+ 1 1)") (catch Throwable t)) (is (thrown? SocketException (repl-eval session "(+ 1 1)"))))) (def-repl-test request-*in* (is (= '((1 2 3)) (response-values (for [resp (repl-eval session "(read)")] (do (when (-> resp :status set (contains? "need-input")) (session {:op :stdin :stdin "(1 2 3)"})) resp))))) (session {:op :stdin :stdin "a\nb\nc\n"}) (doseq [x "abc"] (is (= [(str x)] (repl-values session "(read-line)"))))) (def-repl-test request-*in*-eof (is (= nil (response-values (for [resp (repl-eval session "(read)")] (do (when (-> resp :status set (contains? "need-input")) (session {:op :stdin :stdin []})) resp)))))) (def-repl-test request-multiple-read-newline-*in* (is (= '(:ohai) (response-values (for [resp (repl-eval session "(read)")] (do (when (-> resp :status set (contains? "need-input")) (session {:op :stdin :stdin ":ohai\n"})) resp))))) (session {:op :stdin :stdin "a\n"}) (is (= ["a"] (repl-values session "(read-line)")))) (def-repl-test request-multiple-read-with-buffered-newline-*in* (is (= '(:ohai) (response-values (for [resp (repl-eval session "(read)")] (do (when (-> resp :status set (contains? "need-input")) (session {:op :stdin :stdin ":ohai\na\n"})) resp))))) (is (= ["a"] (repl-values session "(read-line)")))) (def-repl-test request-multiple-read-objects-*in* (is (= '(:ohai) (response-values (for [resp (repl-eval session "(read)")] (do (when (-> resp :status set (contains? "need-input")) (session {:op :stdin :stdin ":ohai :kthxbai\n"})) resp))))) (is (= [" :kthxbai"] (repl-values session "(read-line)")))) (def-repl-test test-url-connect (with-open [conn (url-connect (str (transport-fn->protocol *transport-fn*) "://127.0.0.1:" (:port *server*)))] (transport/send conn {:op :eval :code "(+ 1 1)"}) (is (= [2] (response-values (response-seq conn 100)))))) (deftest test-ack (with-open [s (server/start-server :transport-fn *transport-fn* :handler (ack/handle-ack (server/default-handler)))] (ack/reset-ack-port!) (with-open [s2 (server/start-server :transport-fn *transport-fn* :ack-port (:port s))] (is (= (:port s2) (ack/wait-for-ack 10000)))))) (def-repl-test agent-await (is (= [42] (repl-values session (code (let [a (agent nil)] (send a (fn [_] (Thread/sleep 1000) 42)) (await a) @a)))))) (deftest cloned-session-*1-binding (let [port (:port *server*) conn (nrepl/connect :port port :transport-fn *transport-fn*) client (nrepl/client conn 1000) sess (nrepl/client-session client) sess-id (->> (sess {:op :eval :code "(+ 1 4)"}) last :session) new-sess-id (->> (sess {:session sess-id :op :clone}) last :session) cloned-sess (nrepl/client-session client :session new-sess-id) cloned-sess-*1 (->> (cloned-sess {:session new-sess-id :op :eval :code "*1"}) first :value)] (is (= "5" cloned-sess-*1)))) (def-repl-test print-namespace-maps-binding (when (resolve '*print-namespace-maps*) (let [set-true (dorun (repl-eval session "(set! *print-namespace-maps* true)")) true-val (first (repl-values session "*print-namespace-maps*")) set-false (dorun (repl-eval session "(set! *print-namespace-maps* false)")) false-val (first (repl-values session "*print-namespace-maps*"))] (is (= true true-val)) (is (= false false-val))))) (def-repl-test interrupt-load-file (let [resp (message session {:op "load-file" :file (slurp (File. project-base-dir "load-file-test/nrepl/load_file_sample2.clj")) :file-path "nrepl/load_file_sample2.clj" :file-name "load_file_sample2.clj"})] (Thread/sleep 100) (is (= #{"done"} (-> session (message {:op :interrupt}) first :status set))) (is (= #{"done" "interrupted"} (-> resp combine-responses :status))))) (def-repl-test stdout-stderr (are [result expr] (= result (-> (repl-eval client expr) (combine-responses) (select-keys [:ns :out :err :value]))) {:ns "user" :out "5 6 7 \n 8 9 10\n" :value ["nil"]} (code (println 5 6 7 \newline 8 9 10)) {:ns "user" :err "user/foo\n" :value ["nil"]} (code (binding [*out* *err*] (prn 'user/foo))) {:ns "user" :err "problem" :value [":value"]} (code (do (.write *err* "problem") :value))) (is (re-seq #"Divide by zero" (:err (first (repl-eval client (code (/ 1 0)))))))) (def-repl-test read-error-short-circuits-execution (testing "read error prevents the remaining code from being read and executed" (let [{:keys [err] :as resp} (-> (repl-eval client "(comment {:a} (println \"BOOM!\"))") (combine-responses))] (if (and (= (:major *clojure-version*) 1) (<= (:minor *clojure-version*) 9)) (is (re-matches #"(?s)^RuntimeException Map literal must contain an even number of forms[^\n]+\n$" err)) (is (re-matches #"(?s)^Syntax error reading source at[^\n]+\nMap literal must contain an even number of forms\n" err))) (is (not (contains? resp :out))) (is (not (contains? resp :value))))) (testing "exactly one read error is produced even if there is remaining code in the message" (let [{:keys [err] :as resp} (-> (repl-eval client ")]} 42") (combine-responses))] (is (re-find #"Unmatched delimiter: \)" err)) (is (not (re-find #"Unmatched delimiter: \]" err))) (is (not (re-find #"Unmatched delimiter: \}" err))) (is (not (contains? resp :out))) (is (not (contains? resp :value)))))) (defn custom-repl-caught [^Throwable t] (binding [*out* *err*] (println "foo" (type t)))) (def-repl-test caught-options (testing "bad symbol should fall back to default" (let [[resp1 resp2 resp3 resp4] (->> (message session {:op :eval :code (code (first 1)) ::middleware.caught/caught "my.missing.ns/repl-caught"}) (mapv #(dissoc % :id :session)))] (is (= {::middleware.caught/error "Couldn't resolve var my.missing.ns/repl-caught" :status ["nrepl.middleware.caught/error"]} resp1)) (is (re-find #"IllegalArgumentException" (:err resp2))) (is (= {:status ["eval-error"] :ex "class java.lang.IllegalArgumentException" :root-ex "class java.lang.IllegalArgumentException"} resp3)) (is (= {:status ["done"]} resp4)))) (testing "custom symbol should be used" (is (= [{:err "foo java.lang.IllegalArgumentException\n"} {:status ["eval-error"] :ex "class java.lang.IllegalArgumentException" :root-ex "class java.lang.IllegalArgumentException"} {:status ["done"]}] (->> (message session {:op :eval :code (code (first 1)) ::middleware.caught/caught `custom-repl-caught}) (mapv #(dissoc % :id :session)))))) (testing "::print? option" (let [[resp1 resp2 resp3] (->> (message session {:op :eval :code (code (first 1)) ::middleware.caught/print? 1}) (mapv #(dissoc % :id :session)))] (is (re-find #"IllegalArgumentException" (:err resp1))) (is (re-find #"IllegalArgumentException" (::middleware.caught/throwable resp2))) (is (= {:status ["eval-error"] :ex "class java.lang.IllegalArgumentException" :root-ex "class java.lang.IllegalArgumentException"} (dissoc resp2 ::middleware.caught/throwable))) (is (= {:status ["done"]} resp3))) (let [[resp1 resp2 resp3] (->> (message session {:op :eval :code (code (first 1)) ::middleware.caught/caught `custom-repl-caught ::middleware.caught/print? 1}) (mapv #(dissoc % :id :session)))] (is (= {:err "foo java.lang.IllegalArgumentException\n"} resp1)) (is (re-find #"IllegalArgumentException" (::middleware.caught/throwable resp2))) (is (= {:status ["eval-error"] :ex "class java.lang.IllegalArgumentException" :root-ex "class java.lang.IllegalArgumentException"} (dissoc resp2 ::middleware.caught/throwable))) (is (= {:status ["done"]} resp3))))) (defn custom-session-repl-caught [^Throwable t] (binding [*out* *err*] (println "bar" (.getMessage t)))) (def-repl-test session-caught-options (testing "setting *caught-fn* works" (is (= [{:ns "user" :value "#'nrepl.core-test/custom-session-repl-caught"} {:status ["done"]}] (->> (message session {:op :eval :code (code (set! nrepl.middleware.caught/*caught-fn* (resolve `custom-session-repl-caught)))}) (mapv #(dissoc % :id :session))))) (is (= [{:err "bar Divide by zero\n"} {:status ["eval-error"] :ex "class java.lang.ArithmeticException" :root-ex "class java.lang.ArithmeticException"} {:status ["done"]}] (->> (message session {:op :eval :code (code (/ 1 0))}) (mapv #(dissoc % :id :session)))))) (testing "request can still override *caught-fn*" (is (= [{:err "foo java.lang.ArithmeticException\n"} {:status ["eval-error"] :ex "class java.lang.ArithmeticException" :root-ex "class java.lang.ArithmeticException"} {:status ["done"]}] (->> (message session {:op :eval :code (code (/ 1 0)) ::middleware.caught/caught `custom-repl-caught}) (mapv #(dissoc % :id :session)))))) (testing "request can still provide ::print? option" (let [[resp1 resp2 resp3] (->> (message session {:op :eval :code (code (/ 1 0)) ::middleware.caught/print? 1}) (mapv #(dissoc % :id :session)))] (is (re-find #"Divide by zero" (:err resp1))) (is (re-find #"Divide by zero" (::middleware.caught/throwable resp2))) (is (= {:status ["eval-error"] :ex "class java.lang.ArithmeticException" :root-ex "class java.lang.ArithmeticException"} (dissoc resp2 ::middleware.caught/throwable))) (is (= {:status ["done"]} resp3))) (let [[resp1 resp2 resp3] (->> (message session {:op :eval :code (code (/ 1 0)) ::middleware.caught/caught `custom-repl-caught ::middleware.caught/print? 1}) (mapv #(dissoc % :id :session)))] (is (= {:err "foo java.lang.ArithmeticException\n"} resp1)) (is (re-find #"Divide by zero" (::middleware.caught/throwable resp2))) (is (= {:status ["eval-error"] :ex "class java.lang.ArithmeticException" :root-ex "class java.lang.ArithmeticException"} (dissoc resp2 ::middleware.caught/throwable))) (is (= {:status ["done"]} resp3))))) nrepl-0.6.0/test/clojure/nrepl/describe_test.clj000066400000000000000000000030661342636505500217260ustar00rootroot00000000000000(ns nrepl.describe-test {:author "Chas Emerick"} (:require [clojure.test :refer :all] [nrepl.core :as nrepl] [nrepl.core-test :refer [def-repl-test repl-server-fixture project-base-dir]] [nrepl.middleware :as middleware] [nrepl.version :as version])) (use-fixtures :once repl-server-fixture) (def ^{:private true} op-names #{:load-file :ls-sessions :interrupt :stdin :describe :eval :close :clone}) (def-repl-test simple-describe (let [{{:keys [nrepl clojure java]} :versions ops :ops} (nrepl/combine-responses (nrepl/message timeout-client {:op "describe"}))] (testing "versions" (when-not (every? #(contains? java %) [:major :minor :incremental :update]) (println "Got less information out of `java.version` than we'd like:" (System/getProperty "java.version") "=>" java)) (is (= (#'middleware/safe-version version/version) nrepl)) (is (= (#'middleware/safe-version *clojure-version*) (dissoc clojure :version-string))) (is (= (clojure-version) (:version-string clojure))) (is (= (System/getProperty "java.version") (:version-string java)))) (is (= op-names (set (keys ops)))) (is (every? empty? (map val ops))))) (def-repl-test verbose-describe (let [{:keys [ops aux]} (nrepl/combine-responses (nrepl/message timeout-client {:op "describe" :verbose? "true"}))] (is (= op-names (set (keys ops)))) (is (every? seq (map (comp :doc val) ops))) (is (= {:current-ns "user"} aux)))) nrepl-0.6.0/test/clojure/nrepl/helpers_test.clj000066400000000000000000000033541342636505500216100ustar00rootroot00000000000000(ns nrepl.helpers-test {:author "Chas Emerick"} (:require [clojure.test :refer :all] [nrepl.core :as nrepl] [nrepl.core-test :refer [def-repl-test repl-server-fixture]] [nrepl.helpers :as helpers]) (:import (java.io File))) (def project-base-dir (File. (System/getProperty "nrepl.basedir" "."))) (use-fixtures :once repl-server-fixture) (def-repl-test load-code-with-debug-info ;; bizarrely, the path of the test script generated by clojure-maven-plugin ;; ends up being in the :file metadata here on Clojure 1.3.0+, but ;; passes in 1.2.0... #_(repl-eval session "\n\n\n(defn function [])") #_(is (= [{:file "NO_SOURCE_PATH" :line 4}] (repl-values session "(-> #'function meta (select-keys [:file :line]))"))) (repl-values session (helpers/load-file-command "\n\n\n\n\n\n\n\n\n(defn dfunction [])" "path/from/source/root.clj" "root.clj")) (is (= [{:file "path/from/source/root.clj" :line 10}] (repl-values session (nrepl/code (-> #'dfunction meta (select-keys [:file :line]))))))) (def-repl-test load-file-with-debug-info (repl-values session (helpers/load-file-command (File. project-base-dir "load-file-test/nrepl/load_file_sample.clj") (File. project-base-dir "load-file-test"))) (is (= [{:file (.replace "nrepl/load_file_sample.clj" "/" File/separator) :line 5}] (repl-values session (nrepl/code (-> #'nrepl.load-file-sample/dfunction meta (select-keys [:file :line]))))))) nrepl-0.6.0/test/clojure/nrepl/load_file_test.clj000066400000000000000000000055051342636505500220640ustar00rootroot00000000000000(ns nrepl.load-file-test {:author "Chas Emerick"} (:require [clojure.test :refer :all] [nrepl.core :as nrepl] [nrepl.core-test :refer [def-repl-test repl-server-fixture project-base-dir]]) (:import (java.io File))) (use-fixtures :each repl-server-fixture) (def-repl-test load-code-with-debug-info (dorun (nrepl/message timeout-session {:op "load-file" :file "\n\n\n(defn function [])"})) (is (contains? ;; different versions of Clojure use different default :file metadata #{[{:file "NO_SOURCE_PATH" :line 4}] [{:file "NO_SOURCE_FILE" :line 4}]} (repl-values timeout-session (nrepl/code (-> #'function meta (select-keys [:file :line])))))) (dorun (nrepl/message timeout-session {:op "load-file" :file "\n\n\n\n\n\n\n\n\n(defn afunction [])" :file-path "path/from/source/root.clj" :file-name "root.clj"})) (is (= [{:file "path/from/source/root.clj" :line 10}] (repl-values timeout-session (nrepl/code (-> #'afunction meta (select-keys [:file :line]))))))) (def-repl-test load-file-with-debug-info (dorun (nrepl/message timeout-session {:op "load-file" :file (slurp (File. project-base-dir "load-file-test/nrepl/load_file_sample.clj")) :file-path "nrepl/load_file_sample.clj" :file-name "load_file_sample.clj"})) (is (= [{:file "nrepl/load_file_sample.clj" :line 5}] (repl-values timeout-session (nrepl/code (-> #'nrepl.load-file-sample/dfunction meta (select-keys [:file :line]))))))) (def-repl-test load-file-with-print-vars (set! *print-length* 3) (set! *print-level* 3) (dorun (nrepl/message session {:op "load-file" :file "(def a (+ 1 (+ 2 (+ 3 (+ 4 (+ 5 6)))))) (def b 2) (def c 3) (def ^{:internal true} d 4)" :file-path "path/from/source/root.clj" :file-name "root.clj"})) (is (= [4] (repl-values session (nrepl/code d))))) (def-repl-test load-file-response-no-ns (is (not (contains? (nrepl/combine-responses (nrepl/message session {:op "load-file" :file "(ns foo) (def x 5)" :file-path "/path/to/source.clj" :file-name "source.clj"})) :ns)))) nrepl-0.6.0/test/clojure/nrepl/middleware_test.clj000066400000000000000000000056331342636505500222650ustar00rootroot00000000000000(ns nrepl.middleware-test (:require [clojure.test :refer :all] [nrepl.middleware :as middleware :refer [linearize-middleware-stack]] nrepl.middleware.interruptible-eval nrepl.middleware.load-file nrepl.middleware.print nrepl.middleware.session [nrepl.server :refer [default-middlewares]])) (defn- wonky-resolve [s] (if (symbol? s) (resolve s) s)) (defn- indexed-stack [x] (->> x (map wonky-resolve) shuffle linearize-middleware-stack (map-indexed #(vector (if (var? %2) (-> (#'middleware/var-name %2) symbol name symbol) %2) %)) (into {}))) (deftest sanity (let [stack (indexed-stack default-middlewares)] (is (stack 'wrap-print)) (are [before after] (< (stack before) (stack after)) 'interruptible-eval 'wrap-load-file 'interruptible-eval 'session 'wrap-describe 'wrap-print 'interruptible-eval 'wrap-print)) (let [n ^{::middleware/descriptor {:expects #{"clone"} :requires #{}}} {:dummy :middleware2} m ^{::middleware/descriptor {:expects #{"eval"} :requires #{n #'nrepl.middleware.print/wrap-print}}} {:dummy :middleware} q ^{::middleware/descriptor {:expects #{} :requires #{"describe" "eval"}}} {:dummy :middleware3} stack (indexed-stack (concat default-middlewares [m q n]))] ;(->> stack clojure.set/map-invert (into (sorted-map)) vals println) (are [before after] (< (stack before) (stack after)) 'interruptible-eval m m 'wrap-print 'session n q 'wrap-describe m n 'interruptible-eval 'wrap-load-file 'interruptible-eval 'session 'wrap-describe 'wrap-print 'interruptible-eval 'wrap-print))) (deftest append-dependency-free-middleware (let [m ^{::middleware/descriptor {:expects #{} :requires #{}}} {:dummy :middleware} n {:dummy "This not-middleware is supposed to be sans-descriptor, don't panic!"} stack (->> (concat default-middlewares [m n]) shuffle linearize-middleware-stack)] (is (= #{n m} (set (take-last 2 stack)))))) (deftest no-descriptor-warning (is (.contains (with-out-str (binding [*err* *out*] (indexed-stack (conj default-middlewares {:dummy :middleware})))) "No nREPL middleware descriptor in metadata of {:dummy :middleware}"))) (deftest NREPL-53-regression (is (= [0 1 2] (map :id (linearize-middleware-stack [^{::middleware/descriptor {:expects #{} :requires #{"1"}}} {:id 0} ^{::middleware/descriptor {:expects #{} :requires #{} :handles {"1" {}}}} {:id 1} ^{::middleware/descriptor {:expects #{"1"} :requires #{}}} {:id 2}]))))) nrepl-0.6.0/test/clojure/nrepl/response_test.clj000066400000000000000000000021201342636505500217720ustar00rootroot00000000000000(ns nrepl.response-test (:require [clojure.test :refer :all] [nrepl.core :as nrepl] [nrepl.transport :as t]) (:import (java.util.concurrent BlockingQueue LinkedBlockingQueue TimeUnit))) (deftest response-seq (let [[local remote] (t/piped-transports)] (doseq [x (range 10)] (t/send remote x)) (is (= (range 10) (nrepl/response-seq local 0))) ;; ensure timeouts don't capture later responses (nrepl/response-seq local 100) (doseq [x (range 10)] (t/send remote x)) (is (= (range 10) (nrepl/response-seq local 0))))) (deftest client (let [[local remote] (t/piped-transports)] (doseq [x (range 10)] (t/send remote x)) (is (= (range 10) ((nrepl/client local 100) 17))) (is (= 17 (t/recv remote))))) (deftest client-heads (let [[local remote] (t/piped-transports) client1 (nrepl/client local Long/MAX_VALUE) all-seq (client1)] (doseq [x (range 10)] (t/send remote x)) (is (= [0 1 2] (take 3 all-seq))) (is (= (range 3 7) (take 4 (client1 :a)))) (is (= :a (t/recv remote))) (is (= (range 10) (take 10 all-seq))))) nrepl-0.6.0/test/clojure/nrepl/sanity_test.clj000066400000000000000000000055031342636505500214530ustar00rootroot00000000000000(ns nrepl.sanity-test (:require [clojure.test :refer :all] [nrepl.core :as nrepl] [nrepl.middleware.interruptible-eval :as eval] [nrepl.middleware.print :as print] [nrepl.middleware.session :as session] [nrepl.misc :as misc] [nrepl.transport :as transport :refer [piped-transports]]) (:import (java.util.concurrent BlockingQueue LinkedBlockingQueue TimeUnit))) (println (format "Testing with Clojure v%s on %s" (clojure-version) (System/getProperty "java.version"))) (defn- internal-eval ([expr] (internal-eval nil expr)) ([ns expr] (let [[local remote] (piped-transports) expr (if (string? expr) expr (binding [*print-meta* true] (pr-str expr))) msg (cond-> {:code expr :transport remote :session (atom {})} ns (assoc :ns ns))] (eval/evaluate msg) (-> (nrepl/response-seq local 0) (nrepl/combine-responses) (select-keys [:ns :value :out :err]))))) (deftest eval-sanity (try (are [result expr] (= result (internal-eval expr)) {:ns "user" :value [3]} '(+ 1 2) {:ns "user" :value [nil]} '*1 {:ns "user" :value [nil]} '(do (def ^{:dynamic true} ++ +) nil) {:ns "user" :value [5]} '(binding [++ -] (++ 8 3)) {:ns "user" :value [42]} '(set! *print-length* 42) {:ns "user" :value [nil]} '*print-length*) (finally (ns-unmap *ns* '++)))) (deftest specified-namespace (try (are [ns result expr] (= result (internal-eval ns expr)) (ns-name *ns*) {:ns "user" :value [3]} '(+ 1 2) 'user {:ns "user" :value '[("user" "++")]} '(do (def ^{:dynamic true} ++ +) (map #(-> #'++ meta % str) [:ns :name])) (ns-name *ns*) {:ns "user" :value [5]} '(binding [user/++ -] (user/++ 8 3))) (finally (ns-unmap 'user '++)))) (deftest multiple-expressions (are [result expr] (= result (internal-eval expr)) {:ns "user" :value [4 65536.0]} "(+ 1 3) (Math/pow 2 16)" {:ns "user" :value [4 20 1 0]} "(+ 2 2) (* *1 5) (/ *2 4) (- *3 4)" {:ns "user" :value [nil]} '*1)) (deftest repl-out-writer (let [[local remote] (piped-transports) w (print/replying-PrintWriter :out {:transport remote} {})] (doto w .flush (.println "println") (.write "abcd") (.write (.toCharArray "ef") 0 2) (.write "gh" 0 2) (.write (.toCharArray "ij")) (.write " klm" 5 1) (.write 32) .flush) (with-open [out (java.io.PrintWriter. w)] (binding [*out* out] (newline) (prn #{}) (flush))) (is (= [(str "println" (System/getProperty "line.separator")) "abcdefghijm " "\n#{}\n"] (->> (nrepl/response-seq local 0) (map :out))))))